ZGlmZiAtLWdpdCBhL0NIQU5HRUxPRyBiL0NIQU5HRUxPRwppbmRleCBiY2JmMzZlLi41NDcyYzhmIDEwMDY0NAotLS0gYS9DSEFOR0VMT0cKKysrIGIvQ0hBTkdFTE9HCkBAIC0xLDMgKzEsMTMwNyBAQAorY29tbWl0IDg1ZWI1Y2FmNmI5MDZmN2VjNWI1NDgxNGU4YzdjNzRmNTU5ODZiYjcKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVR1ZSBBdWcgMTQgMDk6NDc6MjcgMjAwNyArMDIwMAorCisgICAgQ29kaW5nIHN0eWxlIGNsZWFudXA7IHJlYnVpbGQgQ0hBTkdFTE9HCisKK2NvbW1pdCA3ZjNmMmJkMmRjMDhlMGIwNWUxODU2NjJjYTJlMmQyODM3NTcxMDRhCitBdXRob3I6IFJhbmR5IFZpbnNvbiA8cnZpbnNvbkBsaW51eGJveC4obm9uZSk+CitEYXRlOglUdWUgRmViIDI3IDE5OjQyOjIyIDIwMDcgLTA3MDAKKworICAgIDg1eHhDRFM6IEFkZCBtYWtlIHRhcmdldHMgZm9yIGxlZ2FjeSBzeXN0ZW1zLgorCisgICAgVGhlIFBDSSBJRCBzZWxlY3QgdmFsdWVzIG9uIHRoZSBBcmNhZGlhIG1haW4gYm9hcmQgZGlmZmVyIGRlcGVuZGluZworICAgIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBoYXJkd2FyZS4gVGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gc3VwcG9ydHMKKyAgICBSZXYgMy4xLiBUaGUgbGVnYWN5IHRhcmdldCBzdXBwb3J0cyBSZXYgMi54LgorCisgICAgU2lnbmVkLW9mZi1ieSBSYW5keSBWaW5zb24gPHJ2aW5zb25AbXZpc3RhLmNvbT4KKworY29tbWl0IGU0MTA5NGM3ZTM4MTc3Yzc1NWZiZDliMTgyMDE4MDY5NjE0ZjA4MGQKK0F1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEF1ZyAxNCAwMTo1MDowOSAyMDA3IC0wNTAwCisKKyAgICA4NXh4Q0RTOiBFbmFibGUgdGhlIFZJQSBQQ0ktdG8tSVNBIGJyaWRnZS4KKworICAgIEF1dGhvcjogUmFuZHkgVmluc29uIDxydmluc29uQGxpbnV4Ym94Lihub25lKT4KKworICAgIEVuYWJsZSB0aGUgUENJLXRvLUlTQSBicmlkZ2UgaW4gdGhlIFZJQSBTb3V0aGJyaWRnZSBsb2NhdGVkIG9uIHRoZQorICAgIEFyY2FkaWEgbWFpbiBib2FyZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFJhbmR5IFZpbnNvbiA8cnZpbnNvbkBtdmlzdGEuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IFlvcmsgU3VuIDx5b3Jrc3VuQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBkYTlkNDYxMGQ3NmU1MmM0ZDIwYThmM2Q4NDMzNDM5YTdmY2Y1YjcxCitBdXRob3I6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBBdWcgMTQgMDA6MTQ6MjUgMjAwNyAtMDUwMAorCisgICAgQWRkIHN1cHBvcnQgZm9yIFVFQyB0byA4NTY4CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBIYWl5aW5nIFdhbmcgPEhhaXlpbmcuV2FuZ0BmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGM1OWU0MDkxZmZlMDE0ODM5OGI5ZTlmZjE0YTAxOWVhMDM4Yjc0MzIKK0F1dGhvcjogSGFpeWluZyBXYW5nIDxIYWl5aW5nLldhbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdW4gMTkgMTQ6MTg6MzQgMjAwNyAtMDQwMAorCisgICAgQWRkIFBDSSBzdXBwb3J0IGZvciBNUEM4NTY4TURTIGJvYXJkCisKKyAgICBUaGlzIHBhdGNoIGlzIGFnYWluc3QgdS1ib290LW1wYzg1eHguZ2l0IG9mIHd3dy5kZW54LmNvbQorCisgICAgU2lnbmVkLW9mZi1ieTogSGFpeWluZyBXYW5nIDxIYWl5aW5nLldhbmdAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBFYm9ueSBaaHUgPGVib255LnpodUBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZDExMWQ2MzgyYzk5ZmRlYTA4YzIzMTJlZWVhZTg3ODY5NDVlMTg5YQorQXV0aG9yOiBIYWl5aW5nIFdhbmcgPEhhaXlpbmcuV2FuZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1biAxOSAxNDoxODozMiAyMDA3IC0wNDAwCisKKyAgICBFbXBpcmljYWxseSBzZXQgY3BvIGFuZCBjbGtfYWRqdXN0IGZvciBtcGM4NXh4IEREUjIgc3VwcG9ydAorCisgICAgVGhpcyBwYXRjaCBpcyBhZ2FpbnN0IHUtYm9vdC1tcGM4NXh4LmdpdCBvZiB3d3cuZGVueC5jb20KKworICAgIFNldHRpbmcgY3BvIHRvIDB4OSBmb3IgZnJlcXVlbmNpZXMgaGlnaGVyIHRoYW4gMzMzTUh6IGlzIHZlcmlmaWVkIG9uCisgICAgYm90aCBNUEM4NTQ4Q0RTIGJvYXJkIGFuZCBNUEM4NTY4TURTIGJvYXJkLCBlc3BlY2lhbGx5IGZvciBzdXBwb3J0aW5nCisgICAgNTMzTUh6IEREUjIuCisKKyAgICBTZXR0aW5nIGNsa19hZGp1c3QgdG8gMHg2KDMvNCBsYXRlIGN5Y2xlKSBmb3IgTVBDODU2OE1EUyBib2FyZCBpcyBmb3IKKyAgICBERFIyIG9uIGFsbCBjdXJyZW50IGJvYXJkIHZlcnNpb25zIGVzcGVjaWFsbHkgdmVyIDEuOTIgb3IgbGF0ZXIgdG8gYnJpbmcKKyAgICB1cC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEhhaXlpbmcgV2FuZyA8SGFpeWluZy5XYW5nQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAzZGIwYmVmNTllYWIxMTU1ODAxNjE4Y2VmNWM0ODFlOTc1NTNiNTk3CitBdXRob3I6IEt1bWFyIEdhbGEgPGdhbGFrQGtlcm5lbC5jcmFzaGluZy5vcmc+CitEYXRlOglUdWUgQXVnIDcgMTg6MDc6MjcgMjAwNyAtMDUwMAorCisgICAgVXNlIGFuIGFic29sdXRlIGFkZHJlc3Mgd2hlbiBqdW1waW5nIG91dCBvZiA0ayBib290IHBhZ2UKKworICAgIE9uIGU1MDAgd2hlbiB3ZSBsZWF2ZSB0aGUgNGsgYm9vdCBwYWdlIHdlIHNob3VsZCB1c2UgYW4gYWJzb2x1dGUgYWRkcmVzcyBzaW5jZQorICAgIHdlIGRvbid0IGtub3cgd2hlcmUgdGhlIGJvYXJkIGNvZGUgbWF5IHdhbnQgdXMgdG8gYmUgcmVhbGx5IHJ1bm5pbmcgYXQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBLdW1hciBHYWxhIDxnYWxha0BrZXJuZWwuY3Jhc2hpbmcub3JnPgorCitjb21taXQgMzk5ODBjNjEwYzlhNGMzODE5MDdjOWUxZDFiOWMwZTFjMGRjYTU3YQorQXV0aG9yOiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gQXVnIDEzIDE0OjQ5OjU5IDIwMDcgLTA1MDAKKworICAgIE1QQzg1eHggQkEgYml0cyBub3Qgc2V0IGZvciAzLWJpdCBiYW5rIGFkZHJlc3MgRElNTQorCisgICAgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2V0IHRoZSBudW1iZXIgb2YgYmFuayBhZGRyZXNzIGJpdHMKKyAgICAoQkEpIGluIHRoZSBwcm9jZXNzb3IuIFRoZSBkZWZhdWx0IGFzc3VtZXMgMiBsb2dpY2FsIGJhbmsgYml0cy4gVGhpcworICAgIHdvcmtzIGZpbmUgZm9yIGEgRElNTSB0aGF0IHVzZXMgZGV2aWNlcyB3aXRoIDQgaW50ZXJuYWwgYmFua3MgKFNQRAorICAgIGJ5dGUxNyA9IDB4NCkgYnV0IG5lZWRzIHRvIGJlIHNldCBhcHByb3ByaWF0ZWx5IGZvciBhIERJTU0gdGhhdCB1c2VzCisgICAgZGV2aWNlcyB3aXRoIDggaW50ZXJuYWwgYmFua3MgKFNQRCBieXRlMTcgPSAweDgpLgorCisgICAgU2lnbmVkLW9mZi1ieTogR3JlZyBEYXZpcyA8RGF2aXNHQGVtYmVkZGVkcGxhbmV0LmNvbT4KKworY29tbWl0IDZjNTQzNTk3YmI0YjFlY2Y1ZDg1ODlmN2FiYjBmMzk5MjlmYjdmZDEKK0F1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEF1ZyAxMyAxNDozODowNiAyMDA3IC0wNTAwCisKKyAgICBGaXggbWlub3IgODV4eCB3YXJuaW5ncworCisgICAgU29tZSBwYXRjaGVzIGhhZCBpbnNlcnRlZCB3YXJuaW5ncyBpbnRvIHRoZSBidWlsZDoKKyAgICAqIG1wYzg1NjBhZHMgZGVjbGFyZWQgZGF0YSB3aXRob3V0IHVzaW5nIGl0CisgICAgKiBjcHVfaW5pdCBkZWNsYXJlZCBlY20gYW5kIGltbWFwIHdpdGhvdXQgdXNpbmcgaXQgaW4gYWxsIENPTkZJR3MKKyAgICAqIE1QQzg1NDhDRFMuaCBoYWQgaXRzIGRlZmF1bHQgZmlsZW5hbWVzIGNoYW5nZWQgc28gdGhhdCB0aGV5IGNvbnRhaW5lZAorICAgICAgIlxtIiBpbiB0aGUgcGF0aHMuICBNYWRlIHRoZSBkZWZhdWx0cyBub3QgV2luZG93cy1zcGVjaWZpYyAob3IKKyAgICAgIGFueXRoaW5nLXNwZWNpZmljKQorCisgICAgU2lnbmVkLW9mZi1ieTogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgZjJjZmY2YjEwNGY4MmI5OTNiZWY2MDg2Y2UwYzk3MTU5YmJlMWFkZAorQXV0aG9yOiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorRGF0ZToJRnJpIEp1bCAyNyAwMTo1MDo1MiAyMDA3IC0wNTAwCisKKyAgICA4NTQ4Y2RzIFBDSUUgc3VwcG9ydC4KKworICAgIE1ha2UgdGhlIGVhcmx5IEwxIGNhY2hlIHN0YWNrIHJlZ2lvbiBndWFyZGVkIHRvIHByZXZlbnQgc3BlY3VsYXRpdmUKKyAgICBmZXRjaGVzIG91dHNpZGUgdGhlIGxvY2tlZCByYW5nZS4KKworICAgIFVzZSBfUEhZUyBkZWZpbmVzLCBub3QgX01FTSBmb3IgY3B1LXNpZGUgUENJIG1lbW9yeSBtYXBwZWQgcmVnaW9ucy4KKyAgICBpbml0LlMgd2hpdGVzcGFjZSBjbGVhbnVwLgorCisgICAgQWxsb3cgVEVYVF9CQVNFIHZhbHVlIHRvIGJlIHNwZWNpZmllZCBvbiBjb21tYW5kIGxpbmUuICBUaGlzIGFsbG93cyBpdAorICAgIHRvIGJlIHNldCB0byAweGZmZmMwMDAwIHdoaWNoIGN1dHMgdGhlIHVib290IGJpbmFyeSBpbiBoYWxmLgorCisgICAgQ2xlYXIgYW5kIGVuYWJsZSBsYmMgYW5kIGVjbSBlcnJvcnMuCisKKyAgICBVcGRhdGUgbGFzdF9idXNubyBpbiBkZXZpY2UtdHJlZSBmb3IgcGNpIGFuZCBwY2llLgorCisgICAgUmVtb3ZlIGxvYWQgb2Ygb2Jzb2xldGUgY3B1L21wYzg1eHgvcGNpLjAKKworICAgIFNpZ25lZC1vZmYtYnk6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisgICAgQWNrZWQtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDgzN2YxYmEwNWNmYjI0OGFiYTVhYjhlMWZiMWJmZWVmYTA3ZDU5NjIKK0F1dGhvcjogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CUZyaSBKdWwgMjcgMDE6NTA6NTEgMjAwNyAtMDUwMAorCisgICAgODU0NGRzIFBDSUUgc3VwcG9ydAorCisgICAgUENJMSBMQVcgbWFwcGluZyBzaG91bGQgdXNlIENGR19QQ0kxX01FTV9QSFkgYW5kIG5vdCBfQkFTRSBhZGRyZXNzLgorCisgICAgRW5hYmxlIExCQyBhbmQgRUNNIGVycm9ycyBhbmQgY2xlYXIgZXJyb3IgcmVnaXN0ZXJzLgorCisgICAgQWRkIHRmdHBmbGFzaCBlbnYgdmFyIHRvIGdldCB1Ym9vdCBmcm9tIHRmdHAgc2VydmVyIGFuZCBmbGFzaCBpdC4KKworICAgIEFkZCBwY2kvcGNpZSBjb252ZW5pZW5jZSBlbnYgdmFycyB0byBkaXNwbGF5IHJlZ2lzdGVyIHNwYWNlOgorICAgICAgInJ1biBwY2llM3JlZ3MiIHRvIHNlZSBhbGwgcGNpZTMgY2NzciByZWdpc3RlcnMKKyAgICAgICJydW4gcGNpZTNjZmciIHRvIHNlZSBhbGwgY2ZnIHJlZ2lzdGVycworICAgIFdoaXRlc3BhY2UgY2xlYW51cCBhbmQgTVBDODU0NERTLmgKKworICAgIEVuYWJsZSBDT05GSUdfSU5URVJSVVBUUy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisgICAgQWNrZWQtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDYxYTIxZTk4MGE3YjkxODg0MjRkMDRmMWMyNjVmZGM1YzIxYzdlODUKK0F1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEF1ZyAxNCAwMTozNDoyMSAyMDA3IC0wNTAwCisKKyAgICA4NXh4IHN0YXJ0LlMgY2xlYW51cCBhbmQgZXhjZXB0aW9uIHN1cHBvcnQKKworICAgIEZyb206IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisKKyAgICBTdXBwb3J0IGV4dGVybmFsIGludGVycnVwdHMgZnJvbSBwbGF0Zm9ybSB0byBlbGltaW5hdGUgc3lzdGVtIGhhbmdzLgorICAgIERlZmluZSBDT05GSUdfSU5URVJSVVBUUyBib2FyZCBjb25maWd1cmUgb3B0aW9uIHRvIGVuYWJsZS4KKyAgICBFbmFibGUgZWNtLCBkZHIsIGxiYywgYW5kIHBjaS9wY2llIGVycm9yIGludGVycnVwdHMgaW4gUElDLgorCisgICAgUmVtb3ZlIGV4dHJhIGNwdSBpbml0aWFsaXphdGlvbiByZWR1bmRhbnQgd2l0aCBoYXJkd2FyZSBpbml0aWFsaXphdGlvbi4KKyAgICBXaGl0ZXNwYWNlIGNsZWFudXAuCisKKyAgICBEZWZpbmUgYW5kIHVzZSBfU1RBUlRfT0ZGU0VUIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBwcm9jZXNzb3JzIHVzaW5nCisgICAgcHBjX2FzbS50bXBsCisKKyAgICBNb3ZlIGFkZGl0aW9uYWwgY29kZSBmcm9tIC50ZXh0IHRvIGJvb3QgcGFnZSB0byBtYWtlIHJvb20gZm9yCisgICAgZXhjZXB0aW9uIHZlY3RvcnMgYXQgc3RhcnQgb2YgaW1hZ2UuCisKKyAgICBIYW5kbGUgTWFjaGluZSBDaGVjaywgRXh0ZXJuYWwgYW5kIENyaXRpY2FsIGV4Y2VwdGlvbnMuCisKKyAgICBGaXggZTUwMCBtYWNoaW5lIGNoZWNrIGVycm9yIGRldGVybWluYXRpb24gaW4gdHJhcHMuYworCisgICAgVEVYVF9CQVNFIGNhbiBub3cgYmUgMHhmZmZjXzAwMDAgLSB3aGljaCBjdXRzIGJpbmFyeSBpbWFnZSBpbiBoYWxmLgorCisgICAgU2lnbmVkLW9mZi1ieTogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KKyAgICBBY2tlZC1ieTogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgN2JkMzBmYzRhNjQ3NWI0MWQ2Njc5YWUzYWFmYzlmYTUwNTI2MGM0NworQXV0aG9yOiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgQXVnIDE0IDAxOjMzOjE4IDIwMDcgLTA1MDAKKworICAgIEFkZCBNUEM4NTQ0RFMgUkVBRE1FCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA0MGM3ZjliMGRlNGUzMDAzNzBhZGZjNzA0MTI4ZmEwZjc5YTE0M2I2CitBdXRob3I6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CitEYXRlOglGcmkgSnVsIDI3IDAxOjUwOjQ4IDIwMDcgLTA1MDAKKworICAgIDg1eHggYWxsb3cgZGVidWdnZXIgdG8gY29uZmlndXJlIGRkci4KKworICAgIE9ubHkgY2hlY2sgZm9yIG1wYzg1NDggcmV2IDEgd2hlbiBjb21waWxlZCBmb3IgODU0OC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisgICAgQWNrZWQtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDI5MzcyZmYzOGM1YmFhYjdkMGUzYThjMTRmZTExZmExOTRhMzg3MDQKK0F1dGhvcjogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CUZyaSBKdWwgMjcgMDE6NTA6NDcgMjAwNyAtMDUwMAorCisgICAgbXBjODV4eCBMMiBjYWNoZSByZXBvcnRpbmcgYW5kIFNSQU0gcmVsb2NhdGlvbiBvcHRpb24uCisKKyAgICBBbGxvdyBkZWJ1Z2dlciB0byBvdmVycmlkZSBmbGFzaCBjczAvY3MxIHNldHRpbmdzIHRvIGVuYWJsZSBhbHRlcm5hdGUKKyAgICBib290IHJlZ2lvbnMKKworICAgIFNpZ25lZC1vZmYtYnk6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisgICAgQWNrZWQtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDQxZjBmOGZiMWFiOTJmMGNiYTdkMzI5ZGU5MDA3MGY4MjJmODI5OWYKK0F1dGhvcjogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CUZyaSBKdWwgMjcgMDE6NTA6NDYgMjAwNyAtMDUwMAorCisgICAgZTUwMCBuZWVkcyBwcGNfYXNtLnRtcCBNQ0tfRVhDRVBUSU9OCisKKyAgICBBbHdheXMgZGVmaW5lIE1DS19FWENFUFRJT04gbWFjcm8gLSBzbyBlNTAwIGNhbiB1c2UgaXQgdG9vLgorCisgICAgU2lnbmVkLW9mZi1ieTogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KKyAgICBBY2tlZC1ieTogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgNTNhNWM0MjRiZjg2NTViN2I0ZTJjMzA1YTQ0MTk2MzI1OWEyNmE4MQorQXV0aG9yOiBEYXZpZCBVcGRlZ3JhZmYgPGRhdmVAY3JheS5jb20+CitEYXRlOglNb24gSnVuIDExIDEwOjQxOjA3IDIwMDcgLTA1MDAKKworICAgIG11bHRpY2FzdCB0ZnRwOiBSRkMyMDkwCisKKyAgICBJbXBsZW1lbnRlZCBJRVRGIFJGQzIwOTAsIE11bHRpY2FzdCBURlRQLiAgSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICAgIG9uIFJlYWx0ZWsgUlRMODEzOSBhbmQgRnJlZXNjYWxlIFRTRUMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBVcGRlZ3JhZmYgPGRhdmVAY3JheS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogQmVuIFdhcnJlbiA8YndhcnJlbkBxc3RyZWFtcy5jb20+CisKK2NvbW1pdCA1ZDExMGYwYWE2OWYwNjVlZTM4NmVjMTg0MGRmZWUxZThjYzQ2YmMxCitBdXRob3I6IFdpbHNvbiBDYWxsYW4gPHdjYWxsYW5Ac2F2YW50YXYuY29tPgorRGF0ZToJU2F0IEp1bCAyOCAxMDo1NjoxMyAyMDA3IC0wNDAwCisKKyAgICBOZXcgQ09ORklHX0JPT1RQX1NFUlZFUklQIG9wdGlvbgorCisgICAgQWRkZWQgQ09ORklHX0JPT1RQX1NFUlZFUklQIHRvIGFsbG93IHRoZSB0ZnRwIHNlcnZlciB0byBiZSBkaWZmZXJlbnQKKyAgICBmcm9tIHRoZSBib290cCBzZXJ2ZXIKKworICAgIFNpZ25lZC1vZmYtYnk6IFdpbHNvbiBDYWxsYW4gPHdjYWxsYW5Ac2F2YW50YXYuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEJlbiBXYXJyZW4gPGJ3YXJyZW5AcXN0cmVhbXMuY29tPgorCitjb21taXQgNTBjY2E4Yjk3NmVjNzQwNjk4NjAyMDhjMzZlNjRjZThmNGQ1ZTRjMQorQXV0aG9yOiBNaWtlIFJhcG9wb3J0IDxtaWtlQGNvbXB1bGFiLmNvLmlsPgorRGF0ZToJU3VuIEF1ZyAxMiAwODo0ODoyNyAyMDA3ICswMzAwCisKKyAgICBBZGQgYWJpbGl0eSB0byB0YWtlIE1BQyBhZGRyZXNzIGZyb20gdGhlIGVudmlyb25tZW50IHRvIERNOTAwMCBkcml2ZXIKKworICAgIFNpZ25lZC1vZmYtYnk6IE1pa2UgUmFwb3BvcnQgPG1pa2VAY29tcHVsYWIuY28uaWw+CisgICAgU2lnbmVkLW9mZi1ieTogQmVuIFdhcnJlbiA8YndhcnJlbkBxc3RyZWFtcy5jb20+CisKK2NvbW1pdCBiZTVkNzJkMTBkNDc2MDkzMjYyMjYyMjUxODFlMzAxZmI5YTMzYjU4CitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglNb24gQXVnIDEzIDIxOjU3OjUzIDIwMDcgKzAyMDAKKworICAgIE1pbm9yIGNvZGluZyBzdHlsZSBjbGVhbnVwLiBVcGRhdGUgQ0hBTkdFTE9HLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IGNjYTM0OTY3Y2JkMTNmZjZiZDM1MmJlMjllM2YxY2M4OGFiMjRjMDUKK0F1dGhvcjogSm9lIEhhbW1hbiA8am9lLmhhbW1hbkBlbWJlZGRlZHNwZWNpYWx0aWVzLmNvbT4KK0RhdGU6CVNhdCBBdWcgMTEgMDY6NTQ6NTggMjAwNyAtMDUwMAorCisgICAgTW9kaWZ5IFNCQzg2NDFEIHRvIHVzZSBuZXcgRnJlZXNjYWxlIFBDSSByb3V0aW5lcworCisgICAgUENJLUV4cHJlc3Mgc29ja2V0cyAxIGFuZCAyIHZlcmlmaWVkIHdvcmtpbmcgd2l0aCBJbnRlbCBQcm8vMTAwMCBQVAorICAgIGFkYXB0ZXIuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb2UgSGFtbWFuIDxqb2UuaGFtbWFuQGVtYmVkZGVkc3BlY2lhbHRpZXMuY29tPgorICAgIFNpZ25kZS1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBhMDg0NTgzMDNlN2Y5ZGI2N2YyOTY5ODAwMzZkMzI5MmMzNWNiNDVjCitBdXRob3I6IEhhYXZhcmQgU2tpbm5lbW9lbiA8aHNraW5uZW1vZW5AYXRtZWwuY29tPgorRGF0ZToJRnJpIEp1biAyOSAxODozODo1MSAyMDA3ICswMjAwCisKKyAgICBhdG1lbF9tY2k6IEZpeCBkYXRhIHRpbWVvdXQgdmFsdWUKKworICAgIENhbGN1bGF0ZSB0aGUgZGF0YSB0aW1lb3V0IGJhc2VkIG9uIHZhbHVlcyBmcm9tIHRoZSBDU0QgaW5zdGVhZCBvZgorICAgIGp1c3QgdXNpbmcgYSBoYXJkY29kZWQgRFRPUiB2YWx1ZS4gVGhpcyBpcyBhIGJhY2twb3J0IG9mIGEgc2ltaWxhciBmaXgKKyAgICBpbiBCU1AgMi4wLCB3aXRoIG9uZSBhZGRpdGlvbmFsIGZpeDogdGhlIERUT0NZQyB2YWx1ZSBpcyByb3VuZGVkIHVwCisgICAgaW5zdGVhZCBvZiBkb3duLgorCisgICAgU2lnbmVkLW9mZi1ieTogSGFhdmFyZCBTa2lubmVtb2VuIDxoc2tpbm5lbW9lbkBhdG1lbC5jb20+CisKK2NvbW1pdCAwYmE4ZWVkMjhiNTc1NjI2YjE3ZTBhNzg4MmY5MjNiODNlMGQ3NTg0CitBdXRob3I6IEhhYXZhcmQgU2tpbm5lbW9lbiA8aHNraW5uZW1vZW5AYXRtZWwuY29tPgorRGF0ZToJTW9uIEF1ZyAxMyAxNzoyMjozMSAyMDA3ICswMjAwCisKKyAgICBBVlIzMjogSW5jbHVkZSA8ZGl2NjQuaD4gaW5zdGVhZCBvZiA8YXNtL2RpdjY0Lmg+CisKKyAgICBpbmNsdWRlL2FzbS1hdnIzMi9kaXY2NC5oIHdhcyByZWNlbnRseSBtb3ZlZCB0byBpbmNsdWRlL2RpdjY0LmgsIGJ1dAorICAgIGNwdS9hdDMyYXAvaW50ZXJydXB0cy5jIHdhc24ndCBwcm9wZXJseSB1cGRhdGVkIChhbiBlYXJsaWVyIHZlcnNpb24gb2YKKyAgICB0aGUgcGF0Y2ggd2FzIG1lcmdlZCBwZXJoYXBzPykKKworICAgIFRoaXMgcGF0Y2ggdXBkYXRlcyBjcHUvYXQzMmFwL2ludGVycnVwdHMuYyBzbyB0aGF0IHRoZSBhdnIzMiBwb3J0CisgICAgY29tcGlsZXMgYWdhaW4uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBIYWF2YXJkIFNraW5uZW1vZW4gPGhza2lubmVtb2VuQGF0bWVsLmNvbT4KKworY29tbWl0IGYwZDEyNDZlZDdjYjVhODg1MjIyNDRjNTk2ZDdhZTdlNmYxNjEyODMKK0F1dGhvcjogSGFhdmFyZCBTa2lubmVtb2VuIDxoc2tpbm5lbW9lbkBhdG1lbC5jb20+CitEYXRlOglXZWQgSnVuIDI3IDEzOjM0OjI2IDIwMDcgKzAyMDAKKworICAgIGF0bWVsX21jaTogVXNlIDUxMiBieXRlIGJsb2Nrc2l6ZSBpZiBwb3NzaWJsZQorCisgICAgSW5zdGVhZCBvZiBhbHdheXMgdXNpbmcgdGhlIGxhcmdlc3QgYmxvY2tzaXplIHRoZSBjYXJkIHN1cHBvcnRzLCBjaGVjaworICAgIGlmIGl0IGNhbiBzdXBwb3J0IHNtYWxsZXIgYmxvY2sgc2l6ZXMgYW5kIHVzZSA1MTIgYnl0ZXMgaWYgcG9zc2libGUuCisgICAgTW9zdCBjYXJkcyBkbyBzdXBwb3J0IHRoaXMsIGFuZCBvdGhlciBwYXJ0cyBvZiB1LWJvb3Qgc2VlbSB0byBoYXZlCisgICAgdHJvdWJsZSB3aXRoIGJsb2NrIHNpemVzIGRpZmZlcmVudCBmcm9tIDUxMiBieXRlcy4KKworICAgIEFsc28gZW5hYmxlIHVuZGVycnVuL292ZXJydW4gcHJvdGVjdGlvbi4KKworICAgIFNpZ25lZC1vZmYtYnk6IEhhYXZhcmQgU2tpbm5lbW9lbiA8aHNraW5uZW1vZW5AYXRtZWwuY29tPgorICAgIEFja2VkLWJ5OiBIYW5zLUNocmlzdGlhbiBFZ3R2ZWR0IDxoY2VndHZlZHRAYXRtZWwuY29tPgorCitjb21taXQgOTk4NmJjM2U0MGU4OTliZWEzNzJhOTlhMmJjYTQwNzFiZGYyZTI0YgorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJU3VuIEF1ZyAxMiAyMTozNDo1MCAyMDA3ICswMjAwCisKKyAgICBVcGRhdGUgQ0hBTkdFTE9HCisKK2NvbW1pdCA3N2QxOWE4YmYzYjBiMWU0MDFjYjlmMjNjODFlMmVmNDE5NzA1YzFhCitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglTdW4gQXVnIDEyIDIxOjM0OjM0IDIwMDcgKzAyMDAKKworICAgIE1pbm9yIGFsaWdubWVudCBvZiBvdXRwdXQsIDJuZCB0cnkuCisgICAgQWxzbyB1cGRhdGUgQ0hBTkdFTE9HCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgNmIzMDlmMjJhNzI0ZmFkODQxOGU4MTE3NTFhMDc0MWI4OTM0MTljZgorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJU3VuIEF1ZyAxMiAyMDozNTo0OSAyMDA3ICswMjAwCisKKyAgICBNaW5vciBhbGlnbm1lbnQgb2Ygb3V0cHV0CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgNmY2ZDdiOWM4NTU5ZTI0MWU4ZDIzMjYyMTU0MmI4YjU5Njk5YjA3YgorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJU3VuIEF1ZyAxMiAxODoyODoxOCAyMDA3ICswMjAwCisKKyAgICBDbGVhbnVwIG91dHB1dCBvbiBBRFM1MTIxIGJvYXJkCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rCisKK2NvbW1pdCBhNGQyNjM2ZjJhODU5MjQ1ZWQzYTQwMWYyNjE4OWRhMmRmZGE0Y2ViCitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglTdW4gQXVnIDEyIDE1OjExOjM4IDIwMDcgKzAyMDAKKworICAgIEFkYXB0IGJvYXJkIGNvbmZpZ3VyYXRpb24gYW5kIGZpeCBrZXJuZWwgY3Jhc2ggb24gTUNDMjAwIGJvYXJkLgorCisgICAgVGhlIHVwZGF0ZSBwcm9jZWR1cmUgd2FzIG1vZGlmaWVkIHRvIHR1cm4gb2ZmIHRoZSBVU0Igc3Vic3lzdGVtCisgICAgYmVmb3JlIGV4aXQgZm9yIE1DQzIwMCBhbmQgVFJBQi4gVGhpcyBpcyBuZWNlc3NhcnkgYXMgb3RoZXJ3aXNlIHRoZQorICAgIFVTQiBjb250cm9sbGVyIGNvbnRpbnVlcyB0byB3cml0ZSBwZXJpb2RpY2FsbHkgdG8gc3lzdGVtIG1lbW9yeSEKKworICAgIE1DQzIwMC1zcGVjaWZpYyBub3RlczoKKyAgICAtIHRoZSBwYXRjaCBkaXNhYmxlcyB0aGUgbWFnaWMga2V5IGNoZWNrIGZvciBNQ0MyMDAKKyAgICAtIHRoZSBwYXRjaCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIG1hZGUKKyAgICAgIGZvciB0aGUgbmV3IHJldmlzaW9uIG9mIHRoZSBib2FyZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFNlcmdlaSBQb3NlbGVub3YgPHNwb3NlbGVub3ZAZW1jcmFmdC5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IGUyN2YzYTZlZmI5ZGI1YTUzMzIyM2IwNWM2MjlmZjRhYzhkOTIxYmYKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVN1biBBdWcgMTIgMTQ6NDc6NTQgMjAwNyArMDIwMAorCisgICAgQWRqdXN0IGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiBBRFM1MTIxIGJvYXJkLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IGFmYWFjODZmZTI5NDhhYzg0Y2Q5YTEyYmJlZDg4M2IzYzY4M2U3ZDkKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVN1biBBdWcgMTIgMTQ6Mjc6MzkgMjAwNyArMDIwMAorCisgICAgQ2xlYW4gdXAgc29tZSByZW1haW5pbmcgQ0ZHX0NNRF8gLT4gQ09ORklHX0NNRF8gaXNzdWVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDVmZTZiZTYyMDhkZGE4NTJjMzU2NGUzODRiZDc4ZDc1Nzg0ZGVhM2UKK0F1dGhvcjogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KK0RhdGU6CVR1ZSBBdWcgNyAyMToxNDoyMiAyMDA3IC0wNDAwCisKKyAgICBJbXByb3ZlIGVycm9yIHByaW50IG1lc3NhZ2VzLgorCisgICAgU2lnbmVkLW9mZi1ieTogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KKworY29tbWl0IDk5ZGZmY2EzYjc1OTBhMTZhMDBiYzQ3NWM4NjBiNjdiMmEzZjE0NjIKK0F1dGhvcjogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTcgMTM6NTc6MDQgMjAwNyAtMDUwMAorCisgICAgZmR0OiBhbGxvdyBmb3IgYnVpbGRzIHRoYXQgZG9uJ3Qgd2FudCBlbnYgYW5kIGJkX3Qgbm9kZXMKKworICAgIHByb3RlY3QgZmR0X2VudiBhbmQgZmR0X2JkX3QgaW52b2NhdGlvbnMsIGZpeCBjb2RpbmdzdHlsZSB3aGlsZSBpbiB0aGUKKyAgICBhcmVhLgorCisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDkxMTQ4YmY3YWViYTE0MmQ2ZjM0ODgwNWRiNzYyNWRiN2RhNjRkNmYKK0F1dGhvcjogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTcgMTM6NTY6NTMgMjAwNyAtMDUwMAorCisgICAgZmR0OiBkbyBib2FyZCBzZXR1cCBiYXNlZCBvbiBmZHQgYWRkcmVzcyBzcGVjaWZpZWQgb24gYm9vdG0gbGluZQorCisgICAgVGhlIGxhc3QgZmR0IHBhdGNoIHRvIGJvb3RtIGRpZCBib2FyZCBzZXR1cCBiYXNlZCBvbiB0aGUgYWRkcmVzcworICAgIHNwZWNpZmllZCBieSBhIHByaW9yIGZkdCBhZGRyZXNzIGNvbW1hbmQgaW52b2NhdGlvbi4gIFRoZSBib290bQorICAgIGNvZGUsIGFzIGl0cyBjYWxsIHRvIGZkdF9jaG9zZW4gZG9lcywgc2hvdWxkIHVzZSB0aGUgZmR0IHNwZWNpZmllZAorICAgIGJ5IHRoZSB1c2VyIG9uIHRoZSBib290bSBjb21tYW5kLiAgTm90ZSB0aGlzIHJlc3RvcmVzIGZ1bGwKKyAgICBmdW5jdGlvbmFsaXR5IGZvciB0aGUgODM2MCdzIGV4aXN0aW5nIGRlZmF1bHQgYm9vdCBlbnZpcm9ubWVudAorICAgIHZhbHVlcywgZS5nLiAncnVuIG5mc2Jvb3QnIChpLmUuIG5vIGhhdmluZyB0byAnZmR0IGFkZHIgJGZkdGFkZHInCisgICAgYmVmb3JlIGJvb3RpbmcgYSBrZXJuZWwpLgorCisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGUxMjVhMmZmYzIwOWRkMzQ3OTRlMzI2YzcxNzU2NTgyNTNiZWFkZjMKK0F1dGhvcjogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMjA6NDA6MzkgMjAwNyAtMDQwMAorCisgICAgQ2FsbCBmdF9ib2FyZF9zZXR1cCgpIGZyb20gdGhlIGJvb3RtIGNvbW1hbmQuCisKKyAgICBJbiB0aGUgcGF0Y2ggdGl0bGVkICJDcmVhdGUgbmV3IGZkdCBib2FyZHNldHVwIGNvbW1hbmQuLi4iIEkgcmVtb3ZlZCB0aGUKKyAgICBjYWxsIHRvIGZ0X2JvYXJkX3NldHVwKCkgZnJvbSB0aGUgcm91dGluZSBmZHRfY2hvc2VuKCksIGJ1dCBJIGZvcmdvdAorICAgIHRvIGFkZCBhIGRpcmVjdCBjYWxsIGJhY2sgaW50byBjbWRfYm9vdG0uYworCisgICAgVGhpcyBmaXhlcyB0aGUgb3ZlcnNpZ2h0IGJ5IGFkZGluZyB0aGUgZGlyZWN0IGNhbGwgdG8gdGhlIGJvb3RtIGNvbW1hbmQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgZmQ2MWU1NWRkOGNiNTJjZTNmZjkxYjM5MTdhZjI2ZTI0YjZiMDg0NQorQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJTW9uIEp1biAyNSAyMzoyNToyOCAyMDA3IC0wNDAwCisKKyAgICBDcmVhdGUgbmV3IGZkdCBib2FyZHNldHVwIGNvbW1hbmQsIGZpeCBidWcgcGFyc2luZyBbXSBmb3JtIG9mIHNldCB2YWx1ZXMuCisKKyAgICBQcmV2aW91c2x5IGZ0X2JvYXJkX3NldHVwKCkgd2FzIGNhbGxlZCBieSBmZHRfY2hvc2VuKCkgd2hpY2ggd2FzIG5vdAorICAgIHJlYWxseSBjb3JyZWN0bHkgc3RydWN0dXJlZC4gIFRoaXMgc3BsaXRzIGZ0X2JvYXJkX3NldHVwKCkgb3V0IGJ5IGNyZWF0aW5nCisgICAgYSBuZXcgZmR0IGJvYXJkc2V0dXAgY29tbWFuZC4KKworICAgIEZpeCBhIGJ1ZyB3aGVuIHBhcnNpbmcgZmR0IHNldCBjb21tYW5kIHZhbHVlcyB3aGljaCBoYXZlIHRoZSBzcXVhcmUKKyAgICBicmFja2V0IGZvcm0gWzAwIDExIDIyIDMzXSAtIHRoZSBsZW5ndGggd2FzIHVwZGF0ZWQgaW5jb3JyZWN0bHkgaW4gd2hlbgorICAgIHBhcnNpbmcgdGhhdCBmb3JtLgorCisgICAgU2lnbmVkLW9mZi1ieTogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KKworY29tbWl0IDZmMzVkZWQ5ZTg1NDkzNTk1ZTBlYjY2YTgyYjUwMmE5NTMyNmQwNDkKK0F1dGhvcjogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KK0RhdGU6CU1vbiBKdW4gMjUgMjA6NTU6NTggMjAwNyAtMDQwMAorCisgICAgVGlnaHRlbiB1cCB0aGUgZXJyb3IgbWVzc2FnZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgYzQ1ODc0YjA1YWFlODk3YTZjMjlkMWE5N2Q0YmI3MDhmY2EyNzU2YworQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJTW9uIEp1biAyNSAxOTo1MjoyMyAyMDA3IC0wNDAwCisKKyAgICBBc3RoZXRpYyBpbXByb3ZlbWVudHM6IGVycm9yIG1lc3NhZ2VzIGFuZCBsaW5lIGxlbmd0aHMuCisKKyAgICBUaWdodGVuIHVwIHRoZSBlcnJvciBtZXNzYWdlcywgc3BsaXQgb3Zlcmxlbmd0aCBsaW5lcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCAzNWVjMzk4ZjE2ZTE3ZGY2MDBlZGMxYjM4YzFlOWU2MmMxNWM5YWExCitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglGcmkgTWF5IDI1IDIyOjA4OjU3IDIwMDcgLTA0MDAKKworICAgIEZpeCBmZHRfY2hvc2VuKCkgdG8gY2FsbCBmdF9ib2FyZF9zZXR1cCgpLCBjbGVhbiB1cCBsb25nIGxpbmVzLgorCisgICAgVGhlIGZkdF9jaG9zZW4oKSBmdW5jdGlvbiB3YXMgYWRkaW5nL3NldGluZyBzb21lIHByb3BlcnRpZXMgYWQtaG9jCisgICAgICBpbXByb3Blcmx5IGFuZCBkdXBsaWNhdGVkIChwb29ybHkpIHdoYXQgd2FzIGRvbmUgaW4gZnRfYm9hcmRfc2V0dXAoKQorCisgICAgQ2xlYW4gdXAgbG9uZyBsaW5lcyAoc2V0dGluZyBwcm9wZXJ0aWVzLCBwcmludGluZyBlcnJvcnMpLgorCisgICAgU2lnbmVkLW9mZi1ieTogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KKworY29tbWl0IDA2ZTE5YTA3NzAxYzk2OGYxNWQ3MmMwODNiNTg3MmExYTExYzdiMDEKK0F1dGhvcjogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KK0RhdGU6CU1vbiBNYXkgMjEgMjM6Mjc6MTYgMjAwNyAtMDQwMAorCisgICAgRm9yIGZkdF9maW5kX25vZGVfYnlfcGF0aCgpLCBoYW5kbGUgdGhlIHJvb3QgcGF0aCBwcm9wZXJseS4KKworICAgIEFsc28gcmVtb3ZlcyB0aGUgc3BlY2lhbCBjYXNlIHJvb3QgcGF0aCBkZXRlY3Rpb24gaW4gY21kX2ZkdC5jIHNpbmNlIGl0CisgICAgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCA5Njc1ZWU3MjA4YWI5NjVkMTNlYThkODI2MmQ3N2FjNDE2MGVmNTQ5CitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglUaHUgTWF5IDE3IDIzOjU0OjM2IDIwMDcgLTA0MDAKKworICAgIEFkZCBmZHRfZmluZF9ub2RlX2J5X3R5cGUoKSBhbmQgZmR0X2ZpbmRfY29tcGF0aWJsZV9ub2RlKCkgdG8gTElCRkRUCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBHcmFuZGVnZ2VyIDx3Z0BncmFuZGVnZ2VyLmNvbT4KKyAgICBBY2tlZC1ieTogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KKworY29tbWl0IDFhODYxMTY5YmMzNzU4ZjlkZTNhZWFkNjJiMDU4NzM2YzY4OTEyNDYKK0F1dGhvcjogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KK0RhdGU6CVdlZCBKdW4gNiAyMjo0Nzo1OCAyMDA3IC0wNDAwCisKKyAgICBSZXBsYWNlIGZkdF9ub2RlX29mZnNldCgpIHdpdGggZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKCkuCisKKyAgICBUaGUgbmV3IG5hbWUgbWF0Y2hlcyBtb3JlIGNsb3NlbHkgdGhlIGtlcm5lbCdzIG5hbWUsIHdoaWNoIGlzIGFsc28KKyAgICBhIG11Y2ggYmV0dGVyIGRlc2NyaXB0aW9uLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZ3JhbmRlZ2dlci5jb20+CisgICAgQWNrZWQtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCBhZGRkOGNlODMwNzhjMjVmMGVjYTVmMjNhZGJkZmM2NGNhNTBhMjQzCitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglXZWQgTWF5IDE2IDIyOjM5OjU5IDIwMDcgLTA0MDAKKworICAgIEZpeCBjbWRfZmR0IGxpbmUgbGVuZ3RocywgcmVmYWN0b3IgY29kZS4KKworICAgIEJyZWFrIGxpbmVzIHRoYXQgd2VyZSBncmVhdGVyIHRoYW4gODAgY2hhcmFjdGVycyBpbiBsZW5ndGguCisgICAgTW92ZSB0aGUgZmR0IHByaW50IGFuZCBwcm9wZXJ0eSBwYXJzaW5nIGNvZGUgdG8gc2VwYXJhdGUgc3RhdGljIGZ1bmN0aW9ucworICAgICAgdG8gcmVkdWNlIGNvZGluZyBjbHV0dGVyIGluIHRoZSBmZHRfY21kIGhhbmRsaW5nIGJvZHkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgMjUxMTQwMzNhYjIxNzg4ODEwYzQ4YmE0ZGYxMDNiNjQ5ZGExMjIzYgorQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJU2F0IE1heSAxMiAwOTo0NzoyNSAyMDA3IC0wNDAwCisKKyAgICBGRFQgY29tbWFuZCBpbXByb3ZlbWVudHMuCisKKyAgICBGaXggImZkdCBzZXQiIHNvIHRoYXQgaXQgd2lsbCBjcmVhdGUgYSBub24tZXhpc3RpbmcgcHJvcGVydHkuCisgICAgQWRkICJmZHQgbWtub2RlIiB0byBjcmVhdGUgbm9kZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgMzhlYjUwOGU4ZTgxMWUyZTU3NjI4ZjQ0NWRlM2EyNGEyM2M3ZDgwNAorQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJU2F0IE1heSAxMiAwOTo0NTo0NiAyMDA3IC0wNDAwCisKKyAgICBSZW9yZ2FuaXplIGFuZCBmaXggcHJvYmxlbXMgKHJldHVybnMpIGluIHRoZSBib290bSBjb21tYW5kLgorCisgICAgRG8gKk5PVCogcmV0dXJuIGFmdGVyIHRoZSAicG9pbnQgb2Ygbm8gcmV0dXJuIiBoYXMgYmVlbiBwYXNzZWQuCisgICAgICBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZywgdGhlIGJvYXJkIG11c3QgYmUgcmVzZXQgYWZ0ZXIgdGhhdCBwb2ludC4KKyAgICBNb3ZlIHRoZSAiVHJhbnNmZXJyaW5nIGNvbnRyb2wgdG8gTGludXgiIGRlYnVnIG1lc3NhZ2UgYmFjayB0byB3aGVyZSBpdAorICAgICAgYmVsb25nczoganVzdCBiZWZvcmUgdHJhbnNmZXJyaW5nIGNvbnRyb2wgdG8gbGludXguCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgODljODc1N2Q4ZjIxM2M0NzcwOWJkYzRlZmUwNjk1MjYzYTYwODBhNgorQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJVHVlIE1heSA4IDIxOjI3OjM1IDIwMDcgLTA0MDAKKworICAgIEZpeCBidWdzIGluIHRoZSBDT05GSUdfT0ZfTElCRkRUCisKKyAgICBTdHVwaWQgY29kaW5nIG1pc3Rha2VzIChpZGVudGlmaWVkIGJ5IFRpbXVyIFRhYmksIHRoYW5rcykuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgNmJlMDdjYzFjYTQ1ODI3OGM4NWVjZGJmMWEwNTM2Y2ZmNGM3MDFlYworQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJV2VkIEFwciAyNSAyMjo0NzoxNSAyMDA3IC0wNDAwCisKKyAgICBJbXByb3ZlIGZkdCBtb3ZlIGxlbmd0aCBoYW5kbGluZy4KKworICAgIE1ha2UgdGhlIGxlbmd0aCBwYXJhbWV0ZXIgb3B0aW9uYWw6IGlmIG5vdCBzcGVjaWZpZWQsIGRvIHRoZSBtb3ZlIHVzaW5nCisgICAgdGhlIGN1cnJlbnQgc2l6ZSB1bmNoYW5nZWQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgYmI5MzBlNzZmZWE2Y2Y4OWNhMmQ5OGUyZjdjN2E2MDQzZDc5MzI3ZAorQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJV2VkIEFwciAyNSAyMjoyMzozNiAyMDA3IC0wNDAwCisKKyAgICBNaW5vciBjb2RlIGNsZWFuIHVwLgorCisgICAgRGVjbGFyZSB0aGUgdmFyaWFibGUgZmR0IHByb3Blcmx5IGFzIGV4dGVybi4KKyAgICBDYWxsIHRoZSAic2V0X2ZuIiBmdW5jdGlvbiBwb2ludGVyIHRoZSAic2hvcnQgd2F5IiB3aXRob3V0IHRoZSBmdWxsCisgICAgICBkZXJlZmVyZW5jaW5nIHN5bnRheC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCBiYTI0ZTJhYzNiZGI1YzQ4OWYzYzc4N2U3NTQyYjY0NzRjNGQ2NWM2CitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglXZWQgQXByIDI1IDIxOjI0OjI3IDIwMDcgLTA0MDAKKworICAgIEltcHJvdmUgZXJyb3IgbWVzc2FnZXMsIG1vcmUgaW5mb3JtYXRpdmUuCisKKyAgICBQcmludCBtb3JlIHRoYW4gdGhlIHJhdyBsaWJmZHQgZXJyb3IgbWVzc2FnZSBzdHJpbmdzLiAgVGhpcyBpcyBlc3BlY2lhbGx5CisgICAgdXNlZnVsIGZvciBjbHVpbmcgaW4gdGhlIHVzZXIgd2hlbiB0aGUgYm9vdG0gY29tbWFuZCBhYm9ydHMgZHVlIHRvCisgICAgYmxvYiBwcm9ibGVtcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCA4MDk2YjNiOGY3NzJjMTg5NGRkZWRhOWRiY2VmZjZhODgyNjQ3M2E0CitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglGcmkgQXByIDIwIDIyOjQ2OjUzIDIwMDcgLTA0MDAKKworICAgIGxpYmZkdDogQ29uZGl0aW9uYWxseSBjb21waWxlIGJhc2VkIG9uIENPTkZJR19PRl9MSUJGRFQKKworICAgIFRoaXMgaXMgdGhlIHdheSB1LWJvb3QgcmVkdWNlcyBjb25maWd1cmVkLW91dCBjb2RlLiAgQXQgV29sZmdhbmcKKyAgICBHcmFuZGVnZ2VyIGFuZCBXb2xmZ2FuZyBEZW5rJ3MgcmVxdWVzdCwgbWFrZSBsaWJmZHQgY29uZm9ybS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCA5MjNlZmQyODY0MTFlZDA1MmQ5ZTA3NGY1OWY4OTg2ZDYwODEwNjFjCitBdXRob3I6IEJydWNlIEFkbGVyIDxicnVjZS5hZGxlckBjY3B1LmNvbT4KK0RhdGU6CUZyaSBBdWcgMTAgMTQ6NTQ6NDcgMjAwNyAtMDcwMAorCisgICAgYWRkIGltYWdlIHNpemUgYW5kIGRlc2NyaXB0b3JzIGZvciBTcGFydGFuIDNFIEZQR0EgY2hpcHMKKworICAgIFNwYXJ0YW4gM0UgaW1hZ2Ugc2l6ZXMgdGFrZW4gZnJvbSBUYWJsZSAxLTQgaW4gWGlsaW54IFVHMzMyICh2MS4xKQorCisgICAgU2lnbmVkLW9mZiBieTogQnJ1Y2UgQWRsZXIgPGJydWNlLmFkbGVyQGNjcHUuY29tPgorCitjb21taXQgZmI1NjU3OWZmZTdlZjMyNzViNzAzNmJiN2I5MjRlNWEwZDMyYmQ3MAorQXV0aG9yOiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorRGF0ZToJRnJpIEF1ZyAxMCAxNTozNDo0OCAyMDA3IC0wNTAwCisKKyAgICBtYWtlIE1BS0VBTEwgbW9yZSBpbW11bmUgdG8gbWVyZ2UgY29uZmxpY3RzCisKKyAgICAuLmJ5IHBsYWNpbmcgYm9hcmQgZW50cmllcyBvbmUgcGVyIGxpbmUsIGFzIHN1Z2dlc3RlZCBieSBqZGwuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgMjYyODExNGVjNTY0Zjk2OWYzNGI1ZjcxMDVmYmQxNjhjYjhjOWMzZgorQXV0aG9yOiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorRGF0ZToJRnJpIEF1ZyAxMCAxMzoyODoyNSAyMDA3IC0wNTAwCisKKyAgICBSRUFETUU6IFJlbW92ZSBvdXRkYXRlZCBjcHUgdHlwZSwgYm9hcmQgdHlwZSwgYW5kIE5BTUVfY29uZmlnIGxpc3RzCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgNDliYjU5OTEyZDIxYWFjYjUwN2ViODFmZDIxZmI3YWY2NTBjNzA2YworQXV0aG9yOiBEYXZlIExpdSA8cjYzMjM4QGZyZWVzY2FsZS5jb20+CitEYXRlOglGcmkgQXVnIDEwIDE1OjQ4OjU5IDIwMDcgKzA4MDAKKworICAgIG1wYzgzeHg6IFN1cHByZXNzIHRoZSB3YXJuaW5nICdidXJzdGxlbicKKworICAgIHN1cHByZXNzIHRoZSB3YXJuaW5nICdidXJzdGxlbicgb2Ygc3BkX3NkcmFtLgorCisgICAgU2lnbmVkLW9mZi1ieTogRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGM2NDZiYmE2NDY1YTQ1YzYwNzQ2ZDRjYzE2MDJjZDA2YzE5NjBmMmQKK0F1dGhvcjogSm9lIEhhbW1hbiA8am9lLmhhbW1hbkBlbWJlZGRlZHNwZWNpYWx0aWVzLmNvbT4KK0RhdGU6CVRodSBBdWcgOSAxNToxMTowMyAyMDA3IC0wNTAwCisKKyAgICBBZGQgc3VwcG9ydCBmb3IgU0JDODY0MUQuIENvbmZpZyBmaWxlcy4KKworICAgIEFkZCBzdXBwb3J0IGZvciBXaW5kIFJpdmVyJ3MgU0JDODY0MUQgcmVmZXJlbmNlIGJvYXJkLgorCisgICAgU2lnbmVkLW9mZiBieTogSm9lIEhhbW1hbiA8am9lLmhhbW1hbkBlbWJlZGRlZHNwZWNpYWx0aWVzLmNvbT4KKyAgICBBY2tlZC1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKyAgICBBY2tlZC1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDhhYzI3MzI3MWQ1NzMyMWY5MDUwNWM3YTUxY2RiMWVmMjExM2I2MjgKK0F1dGhvcjogSm9lIEhhbW1hbiA8am9lLmhhbW1hbkBlbWJlZGRlZHNwZWNpYWx0aWVzLmNvbT4KK0RhdGU6CVRodSBBdWcgOSAxNToxMDo1MyAyMDA3IC0wNTAwCisKKyAgICBBZGQgc3VwcG9ydCBmb3IgU0JDODY0MUQuICBCb2FyZCBmaWxlcy4KKworICAgIEFkZCBzdXBwb3J0IGZvciBXaW5kIFJpdmVyJ3MgU0JDODY0MUQgcmVmZXJlbmNlIGJvYXJkLgorCisgICAgU2lnbmVkLW9mZiBieTogSm9lIEhhbW1hbiA8am9lLmhhbW1hbkBlbWJlZGRlZHNwZWNpYWx0aWVzLmNvbT4KKyAgICBBY2tlZC1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKyAgICBBY2tlZC1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGMyYzBhYjRhZmY4NjYyMmI4MzdhNDhhMGU1NjAzNTFmOWFmYWZiOTUKK0F1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorRGF0ZToJRnJpIEF1ZyAxMCAyMDozNDo1OCAyMDA3ICswMjAwCisKKyAgICBDb25kaW5nIHN0eWxlIGNsZWFudXAKKworICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKworY29tbWl0IGM3NGIyMTA4ZTMxZmUwOWJkMWM1ZDI5MWMzY2YzNjA1MTBkNGYxM2UKK0F1dGhvcjogU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CitEYXRlOglGcmkgQXVnIDEwIDIwOjI2OjE4IDIwMDcgKzAyMDAKKworICAgIFtBUk1dIFRJIERhVmluY2kgc3VwcG9ydCwgaG9wZWZ1bGx5IGZpbmFsCisKKyAgICBBZGQgc3VwcG9ydCBmb3IgdGhlIGZvbGxvd2luZyBEYVZpbmNpIGJvYXJkczoKKyAgICAtIERWX0VWTQorICAgIC0gU0NITU9PR0lFCisgICAgLSBTT05BVEEKKworICAgIENoYW5nZXM6CisKKyAgICAtIFNwbGl0IGludG8gc2VwYXJhdGUgYm9hcmQgZGlyZWN0b3JpZXMKKyAgICAtIFJlbW92ZWQgY2hhbmdlcyB0byBNVERfREVCVUcgKG9yIHdoYXRldmVyIGl0J3MgY2FsbGVkKQorICAgIC0gTmV3IENPTkZJR19DTUQgcGFydHkgbGluZSBmb2xsb3dlZAorICAgIC0gU29tZSBjb3NtZXRpYyBmaXhlcywgY2xlYW51cCBldGMuCisgICAgLSBQYXRjaGVzIGFnYWluc3QgdGhlIGxhdGVzdCBVLUJvb3QgdHJlZSBhcyBvZiBub3cuCisgICAgLSBGaXhlZCBDT05GSUdfQ01EX05FVCBpbiBuZXQgZmlsZXMuCisgICAgLSBGaXhlZCBDT05GSUdfQ01EX0VFUFJPTSBmb3Igc2NobW9vZ2llLgorICAgIC0gTWFkZSBzdXJlIGl0IGNvbXBpbGVzIGFuZCB3b3JrcyAoZm9yY2VlbnYoKSBsaW5rIHByb2JsZW0pIG9uIFNDSE1PT0dJRSBhbmQKKyAgICAgICBEVl9FVk0uIENhbid0IGNoZWNrIGlmIGl0IHdvcmtzIG9uIFNPTkFUQSwgZG9uJ3QgaGF2ZSBhIGJvYXJkIGFueSBtb3JlLAorICAgICAgIGJ1dCBpdCBhdCBsZWFzdCBjb21waWxlcy4KKworICAgIEhlcmUgaXMgYW4gZXhjZXJwdCBmcm9tIHNlc3Npb24gbG9nIG9uIFNDSE1PT0dJRS4uLgorCisgICAgVS1Cb290IDEuMi4wLWc2YzMzYzc4NS1kaXJ0eSAoQXVnICA3IDIwMDcgLSAxMzowNzoxNykKKworICAgIERSQU06ICAxMjggTUIKKyAgICBOQU5EOiAgMTI4IE1pQgorICAgIEluOiAgICBzZXJpYWwKKyAgICBPdXQ6ICAgc2VyaWFsCisgICAgRXJyOiAgIHNlcmlhbAorICAgIEFSTSBDbG9jayA6IDI5N01IegorICAgIEREUiBDbG9jayA6IDE2Mk1IegorICAgIEVUSCBQSFkgICA6IERQODM4NDggQCAweDAxCisgICAgVS1Cb290ID4gaXByb2JlCisgICAgVmFsaWQgY2hpcCBhZGRyZXNzZXM6IDFCIDM4IDNBIDNEIDNGIDUwIDVEIDZGCisgICAgVS1Cb290ID4gcGluZyAxOTIuMTY4LjI1My4xMAorICAgIGhvc3QgMTkyLjE2OC4yNTMuMTAgaXMgYWxpdmUKKyAgICBVLUJvb3QgPgorCisgICAgU2lnbmVkLW9mZi1ieTogU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgICAgQWNrZWQtYnk6IERpcmsgQmVobWUgPGRpcmsuYmVobWVAZ21haWwuY29tPgorICAgIEFja2VkLWJ5OiBaYWNoIFNhZGVja2kgPFphY2guU2FkZWNraUByaXBjb2RlLmNvbT4KKyAgICBBY2tlZC1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgMmU0ZDk0ZjFlM2MyOTYxNDI4OTY3YTMzYjZmZjI1MjA1NjgzOTFiMworQXV0aG9yOiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorRGF0ZToJRnJpIEp1bCAyNyAwMTo1MDo0NSAyMDA3IC0wNTAwCisKKyAgICBmc2xfcGNpX2luaXQgY2xlYW51cC4KKworICAgIERvIG5vdCBlbmFibGUgbm9ybWFsIGVycm9ycyBjcmVhdGVkIGR1cmluZyBwcm9iZSAobWFzdGVyIGFib3J0LCBwZXJyLAorICAgIGFuZCBwY2llIEludmFsaWQgQ29uZmlndXJhdGlvbiBhY2Nlc3MpLgorCisgICAgQWRkIENPTkZJR19QQ0lfTk9TQ0FOIGJvYXJkIG9wdGlvbiB0byBwcmV2ZW50IGJ1cyBzY2FuLgorCisgICAgU2lnbmVkLW9mZi1ieTogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KKyAgICBBY2tlZC1ieTogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgOTM2YjNlNjliNjY3YzNlYjlhNjFlY2U0ZTc4NjQ3ZDNmY2U5ZmMyYQorQXV0aG9yOiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorRGF0ZToJRnJpIEp1bCAyNyAwMTo1MDo0NCAyMDA3IC0wNTAwCisKKyAgICBwY2lhdXRvX3NldHVwX2RldmljZSBiYXJzX251bSBmaXgKKworICAgIFBhc3NpbmcgYmFyc19udW09MCB0byBwY2lhdXRvX3NldHVwX2RldmljZSBzaG91bGQgYXNzaWduIG5vIGJhcnMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorICAgIEFja2VkLWJ5OiBTaGlueWEgS3VyaWJheWFzaGkgPHNoaW55YS5rdXJpYmF5YXNoaUBuZWNlbC5jb20+CisgICAgQWNrZWQtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGNmMGIxODVlNThjYTBhZWM4YWUyYjJhODgwNGVjMGVmNThlZTIxZDQKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBBdWcgNiAxNzozOTo0NCAyMDA3IC0wNTAwCisKKyAgICA4NjQxaHBjbjogRG8gY29ycmVjdCBzaXplZCBwb2ludGVyIG1hdGguCisKKyAgICBXaGVuIEkgcmViYXNlZCBFZCdzIHBhdGNoIGFuZCBjbGVhbmVkIHVwIGEgZmV3IGNvbXBpbGF0aW9uCisgICAgcHJvYmxlbXMsIEkgYXBwYXJlbnRseSByZWJhc2VkIG15IGJyYWluIG9uIGNyYWNrIGZpcnN0LgorICAgIEZpeCB0aGF0IGJ5IGRvaW5nIChjaGFyICopIHNpemVkIHBvaW50ZXIgbWF0aCBhcyBuZWVkZWQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgY2ZjN2E3ZjViYjMyNzNjOTk1MTE3M2M3ODgwMDFkNDUxMThmMTQxZgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVGh1IEF1ZyAyIDE0OjQyOjIwIDIwMDcgLTA1MDAKKworICAgIGNwdS84Nnh4IGZpeGVzLgorCisgICAgUmVtb3ZlIHJldiAxIGZpeGVzLgorICAgIEFsd2F5cyBzZXQgUElDR0NSX01PREUuCisgICAgRW5hYmxlIG1hY2hpbmUgY2hlY2sgYW5kIHByb3ZpZGUgYm9hcmQgY29uZmlnIG9wdGlvbgorICAgIHRvIHNldCBhbmQgaGFuZGxlIFNvQyBlcnJvciBpbnRlcnJ1cHRzLgorCisgICAgSW5jbHVkZSBNU1NTUjAgaW4gZXJyb3IgbWVzc2FnZS4KKworICAgIElzb2xhdGUgYSBSQU1CT09UIGJpdCBvZiBjb2RlIHdpdGggI2lmZGVmIENGR19SQU1CT09ULgorCisgICAgU2lnbmVkLW9mZi1ieTogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgM2E2ZDU2YzIwOTg5ZmUyNzM2MGFmZTc0M2JkMmE3YWQ0ZDc2ZTQ4ZgorQXV0aG9yOiBEaXJrIEJlaG1lIDxkaXJrLmJlaG1lQGdvb2dsZW1haWwuY29tPgorRGF0ZToJVGh1IEF1ZyAyIDE3OjQyOjA4IDIwMDcgKzAyMDAKKworICAgIE1ha2UgdXNlIG9mIGdlbmVyaWMgNjRiaXQgZGl2aXNpb24gaW4gbmFuZF91dGlsLmMKKworICAgIFVzZSBnZW5lcmljIDY0Yml0IGRpdmlzaW9uIGluIG5hbmRfdXRpbC5jLiBUaGlzIG1ha2VzIG5hbmRfdXRpbC5jCisgICAgaW5kZXBlbmRlbnQgb2YgYW55IHRvb2xjaGFpbiA2NGJpdCBkaXZpc2lvbi4KKworICAgIFNpZ25lZC1vZmYtYnk6IERpcmsgQmVobWUgPGRpcmsuYmVobWVAZ21haWwuY29tPgorCitjb21taXQgZjdjMDg2ZTk0ZThjZTlhYWQ3MjY4YWY5N2Y3M2FhNjg4NDY4NmYyNworQXV0aG9yOiBEaXJrIEJlaG1lIDxkaXJrLmJlaG1lQGdvb2dsZW1haWwuY29tPgorRGF0ZToJVGh1IEF1ZyAyIDE3OjQxOjE0IDIwMDcgKzAyMDAKKworICAgIE1vdmUgNjRiaXQgZGl2aXNpb24gZnJvbSBhdnIzMiB0byBnZW5lcmljIGxpYgorCisgICAgTW92ZSB0aGUgNjRiaXQgZGl2aXNpb24gZnJvbSBsaWJfYXZyMzIgdG8gbGliX2dlbmVyaWMuIFdpdGggdGhpcywgYWxsCisgICAgYm9hcmRzIGNhbiBkb19kaXYvX19kaXY2NF8zMiBpZiBuZWVkZWQsIG5vdCBvbmx5IGF2ciBvbmUuIENvZGUgaXMgcHV0CisgICAgdG8gbGliX2dlbmVyaWMsIHNvIG5vIGxhcmdlciBtZW1vcnkgZm9vdHByaW50IGlmIG5vdCB1c2VkLiBObyBjb2RlCisgICAgbW9kaWZpY2F0aW9ucy4gVGhhbmtzIGZvciBwcm9wb3NhbCBieSBIw6V2YXJkIFNraW5uZW1vZW4uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBEaXJrIEJlaG1lIDxkaXJrLmJlaG1lQGdtYWlsLmNvbT4KKworY29tbWl0IDk5YzJmZGFiOTFiYzYzM2U0NmZiNDFkYmFhNjI5Zjg3Y2NmNmUwMGYKK0F1dGhvcjogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBBdWcgNiAxODoxODozNCAyMDA3IC0wNTAwCisKKyAgICBtcGM4M3h4OiBmaXggSVRYW0dQXSBPPWJ1aWxkZGlyIGJ1aWxkcworCisgICAgbWFrZTogKioqIE5vIHJ1bGUgdG8gbWFrZSB0YXJnZXQgYC93b3JrL3dkL3RtcC9ib2FyZC9tcGM4MzQ5aXR4L3UtYm9vdC5sZHMnLCBuZWVkZWQgYnkgYC93b3JrL3dkL3RtcC91LWJvb3QnLiAgU3RvcC4KKworICAgIEJvdGggdGhlIElUWCBhbmQgSVRYLUdQIGZhaWwgd2hlbiB5b3UgdXNlICJtYWtlIE89PHNvbWUgZGlyPiAuLi4iIG9yCisgICAgIkJVSUxEX0RJUj08c29tZSBkaXI+IC4vTUFLRUFMTCAuLi4iCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgNDdlOGJjODQ2NzU5ZTAzN2I4YWYwZTVmOWM5ZjljZmE3YTEwNTBjMworQXV0aG9yOiBEYXZlIExpdSA8cjYzMjM4QGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgQXVnIDEgMTU6MDA6NTkgMjAwNyArMDgwMAorCisgICAgbXBjODN4eDogQ29ycmVjdCB0aGUgUkVBRE1FIGZvciBERFIgRUNDCisKKyAgICBVcGRhdGUgdGhlIFJFQURNRSBmb3IgRERSIEVDQywgY2hhbmdlIHRoZSBuYW1lCisgICAgdG8gUkVBRE1FLm1wYzgzeHguZGRyZWNjLgorCisgICAgU2lnbmVkLW9mZi1ieTogRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgZGFhYjhjNjdkMmRlZmVmNzNkYzI2YWIwN2YwYzNhZmQxYjA1ZDAxOQorQXV0aG9yOiBEYXZlIExpdSA8cjYzMjM4QGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgQXVnIDEgMTU6MDA6MTUgMjAwNyArMDgwMAorCisgICAgbXBjODN4eDogQ29uc29saWRhdGUgdGhlIEVDQyBzdXBwb3J0IG9mIDgzeHgKKworICAgIFJlbW92ZSB0aGUgZHVwbGljYXRlZCBzb3VyY2UgY29kZSBvZiBlY2MgY29tbWFuZCBvbiB0aGUgPGJvYXJkPi5jLAorICAgIGZvciByZXVzZWQsIG1vdmUgdGhlc2UgY29kZSB0byBjcHUvbXBjODN4eCBkaXJlY3RvcnkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAwMzY1NzVjNTQ0Y2YxYjY5NjU0ZDhmYjMzNGJkYTY5YzZmZjNkYTM2CitBdXRob3I6IERhdmUgTGl1IDxyNjMyMzhAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVNhdCBBdWcgNCAxMzozNzozOSAyMDA3ICswODAwCisKKyAgICBtcGM4M3h4OiBDb3JyZWN0IHRoZSBidXJzdCBsZW5ndGggZm9yIEREUjIgd2l0aCAzMiBiaXRzCisKKyAgICBUaGUgYnVyc3QgbGVuZ3RoIHNob3VsZCBiZSA0IGZvciBERFIyIHdpdGggMzIgYml0cyBidXMKKworICAgIFNpZ25lZC1vZmYtYnk6IERhdmUgTGl1IDxkYXZlbGl1QGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAxYzI3NGM0ZTA1YjZkYzliMjRlZGM4YWE2MThiMDJmNjA3ZWU2ZWVkCitBdXRob3I6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgSnVsIDI1IDE5OjI1OjMzIDIwMDcgLTA1MDAKKworICAgIG1wYzgzeHg6IGFkZCBzdXBwb3J0IGZvciB0aGUgTVBDODMyM0UgUkRCCisKKyAgICBNUEM4MzIzRSBiYXNlZCBib2FyZCB3aXRoIDY0TUIgZml4ZWQgU0RSQU0sIDE2TUIgZmxhc2gsCisgICAgZml2ZSAxMC8xMDAgZXRoZXJuZXQgcG9ydHMgY29ubmVjdGVkIHZpYSBhbiBJQ1BsdXMgSVAxNzVDCisgICAgc3dpdGNoLCBvbmUgUENJIHNsb3QsIGFuZCBzZXJpYWwuICBGZWF0dXJlcyBub3Qgc3VwcG9ydGVkCisgICAgaW4gdGhpcyBwYXRjaCBhcmUgU0QgY2FyZCBpbnRlcmZhY2UsIDIgVVNCIHBvcnRzLCBhbmQgdGhlCisgICAgdHdvIHBob25lIHBvcnRzLgorCisgICAgU2lnbmVkLW9mZi1ieTogTWljaGFlbCBCYXJrb3dza2kgPG1pY2hhZWwuYmFya293c2tpQGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDM0M2Q5MTAwOWQ1NWZjNWIzZmY4Y2M5NDA1OTdhZjZjNmFhMWQzNTkKK0F1dGhvcjogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBKdWwgMjUgMTk6MjU6MjggMjAwNyAtMDUwMAorCisgICAgbXBjODN4eDogZml4dXAgZ2VuZXJpYyBwY2kgZm9yIGxpYmZkdAorCisgICAgYWRkIGxpYmZkdCBzdXBwb3J0IHRvIHRoZSBnZW5lcmljIDgzeHggcGNpIGNvZGUKKworICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBmNTdhYzdhN2IzNzEwOTI0NWI2OWRiODA4MzllYmVlMjYxNzk5NjZhCitBdXRob3I6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgSnVsIDI1IDE5OjI1OjIyIDIwMDcgLTA1MDAKKworICAgIG1wYzgzeHg6IGZpeCA4MzYwIGFuZCBjcHUgZnVuY3Rpb25zIHRvIHVwZGF0ZSBmZHQgYmVpbmcgcGFzc2VkCisKKyAgICAuLmFuZCBub3QgdGhlIGdsb2JhbCBmZHQuIFJlbmFtZSBsb2NhbCBmZHQgdmFycyB0byBibG9iIHNvIGFzIG5vdCB0bworICAgIGJlIGNvbmZ1c2VkIHdpdGggdGhlIGdsb2JhbCB2YXIgd2l0aCB0aGUgc2FtZSB0aHJlZS1sZXR0ZXIgbmFtZS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA4YmU0MDQ0NTlhNmI3Mzk1NDE1YTU3YmIzNWU4Mzc3ZTNiMmI1YWNiCitBdXRob3I6IEplcnJ5IFZhbiBCYXJlbiA8Z3ZiLnVib290QGdtYWlsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMTozNDoyNCAyMDA3IC0wNDAwCisKKyAgICBtcGM4M3h4OiBGaXggZXJyb3JzIHdoZW4gQ09ORklHX09GX0xJQkZEVCBpcyBlbmFibGVkCisKKyAgICBTZXZlcmFsIG5vZGUgc3RyaW5ncyB3ZXJlIG5vdCBjb3JyZWN0ICh0cmFpbGluZyBzbGFzaGVzIGFuZCBwcm9wZXJ0aWVzCisgICAgICBpbiB0aGUgc3RyaW5ncykKKyAgICBBZGRlZCBzZXR0aW5nIG9mIHRoZSB0aW1lYmFzZS1mcmVxdWVuY3kuCisgICAgSW1wcm92ZWQgZXJyb3IgbWVzc2FnZXMgYW5kIHVzZSBkZWJ1ZygpIGluc3RlYWQgb2YgcHJpbnRmKCkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAyNmQwMmM5YmJhYzE3NTFjNWUxOTI5NGYwMDAxMDBiNDhkNDNhOTIwCitBdXRob3I6IEplcnJ5IFZhbiBCYXJlbiA8Z3ZiLnVib290QGdtYWlsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMToyNzozMCAyMDA3IC0wNDAwCisKKyAgICBtcGM4M3h4OiBSZXBsYWNlIGZkdF9ub2RlX29mZnNldCgpIHdpdGggZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKCkuCisKKyAgICBUaGUgbmV3IG5hbWUgbWF0Y2hlcyBtb3JlIGNsb3NlbHkgdGhlIGtlcm5lbCdzIG5hbWUsIHdoaWNoIGlzIGFsc28KKyAgICBhIG11Y2ggYmV0dGVyIGRlc2NyaXB0aW9uLgorCisgICAgVGhlc2UgYXJlIHRoZSBtcGM4M3h4IGNoYW5nZXMgbWFkZSBuZWNlc3NhcnkgYnkgdGhlIGZ1bmN0aW9uIG5hbWUgY2hhbmdlLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZ3JhbmRlZ2dlci5jb20+CisgICAgQWNrZWQtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDliZTM5YTY3YzlmOGZlZjcxMDdmNWRmMDlkNjczMDA1ZjA0ZDA5NjMKK0F1dGhvcjogRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdW4gMjUgMTA6NDE6NTYgMjAwNyArMDgwMAorCisgICAgbXBjODN4eDogQWRkIHN1cHBvcnQgZm9yIHRoZSBkaXNwbGF5IG9mIHJlc2V0IHN0YXR1cworCisgICAgODN4eCBwcm9jZXNzb3IgZmFtaWx5IGhhcyBtYW55IHJlc2V0IHNvdXJjZXMsIHN1Y2ggYXMKKyAgICBwb3dlciBvbiByZXNldCwgc29mdHdhcmUgaGFyZCByZXNldCwgc29mdHdhcmUgc29mdCByZXNldCwKKyAgICBKVEFHLCBidXMgbW9uaXRvciwgc29mdHdhcmUgd2F0Y2hkb2csIGNoZWNrIHN0b3AgcmVzZXQsCisgICAgZXh0ZXJuYWwgaGFyZCByZXNldCwgZXh0ZXJuYWwgc29mdHdhcmUgcmVzZXQuCisgICAgc29tZXRpbWVzLCB0byBmaWd1cmUgb3V0IHRoZSBmYXVsdCBvZiBzeXN0ZW0sIHdlIG5lZWQgdG8KKyAgICBrbm93IHRoZSBjYXVzZSBvZiByZXNldCBlYXJseSBiZWZvcmUgdGhlIHByb21wdCBvZgorICAgIHUtYm9vdCBwcmVzZW50LgorCisgICAgU2lnbmVkLW9mZi1ieTogRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgZmY5NjU4ZDcwNDliZjhjOGU4ZTBhMDVkYmU1ZTlmN2U5MWFhNWE1ZAorQXV0aG9yOiBEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1biAyNSAxMDo0MTowNCAyMDA3ICswODAwCisKKyAgICBtcGM4M3h4OiBGaXggdGhlIGFsaWduIGJ1ZyBvZiBTRE1BIGJ1ZmZlcgorCisgICAgQWNjb3JkaW5nIHRvIHRoZSBsYXRlc3QgdXNlciBtYW51YWwsIHRoZSBTRE1BIHRlbXBvcmFyeQorICAgIGJ1ZmZlciBiYXNlIGFkZHJlc3MgbXVzdCBiZSA0S0IgYWxpZ25lZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IERhdmUgTGl1IDxkYXZlbGl1QGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDY2ZGMyYzJkYzUxZjhiODhiYjhlMjMxYmM4MGNkOTJlYWUxZDY0NzYKK0F1dGhvcjogRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdW4gMjUgMTM6MjE6MTIgMjAwNyArMDgwMAorCisgICAgbXBjODN4eDogUmV2aXNlIHRoZSBNUEM4MzYwRU1EUyByZWFkbWUgZG9jCisKKyAgICBXaGVuIHRoZSByZXYyLnggc2lsaWNvbiBtb3VudCBvbiB0aGUgTVBDODM2MEVNRFMgYmFvcmQsCisgICAgYW5kIGlmIHlvdSBhcmUgdXNpbmcgdGhlIHUtYm9vdCB2ZXJzaW9uIGFmdGVyIHRoZSBjb21taXQKKyAgICAzZmMwYmQxNTkxMDNiNTM2ZTFjNTRjNmY0NDU3YTA5YjNhYmE2NmNhLgorICAgIHRvIG1ha2UgdGhlIGV0aGVybmV0IGludGVyZmFjZSB1c2FibGUsIHdlIGhhdmUgdG8gc2V0dXAKKyAgICB0aGUganVtcGVycyBjb3JyZWN0bHkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBlNzM5YmM5NTc5N2FhYzRmZWZjNGM3NWI1NWM3Yzc4ZTU5ZDNlYTljCitBdXRob3I6IFRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgSnVsIDMgMTM6NDY6MzIgMjAwNyAtMDUwMAorCisgICAgRlNMIEkyQyBkcml2ZXIgcHJvZ3JhbXMgdGhlIHR3byBJMkMgYnVzc2VzIGRpZmZlcmVudGx5CisKKyAgICBUaGUgaTJjX2luaXQoKSBmdW5jdGlvbiBpbiBmc2xfaTJjLmMgcHJvZ3JhbXMgdGhlIHR3byBJMkMgYnVzc2VzIGRpZmZlcmVudGx5LgorICAgIFRoZSBzZWNvbmQgSTJDIGJ1cyBoYXMgaXRzIHNsYXZlIGFkZHJlc3MgcHJvZ3JhbW1lZCBpbmNvcnJlY3RseSBhbmQgaXMKKyAgICBtaXNzaW5nIGEgNS11cyBkZWxheS4KKworICAgIFNpZ25lZC1vZmYtYnk6IFRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGRmMzNmNmI0ZDZkNjM2OTNkZDkyMDA4MDhiMjQyZGUxYjg2Y2I4ZTgKK0F1dGhvcjogVGltdXIgVGFiaSA8dGltdXJAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMyAxMzowNDozNCAyMDA3IC0wNTAwCisKKyAgICBVcGRhdGUgU0NDUiBwcm9ncmFtbWluZyBpbiBjcHVfaW5pdF9mKCkgdG8gc3VwcG9ydCBhbGwgODN4eCBwcm9jZXNzb3JzCisKKyAgICBVcGRhdGUgdGhlIGNwdV9pbml0X2YoKSBmdW5jdGlvbiBpbiBjcHUvbXBjODN4eC9jcHVfaW5pdC5jIHRvIHByb2dyYW0gdGhlCisgICAgYml0ZmllbGRzIGZvciBhbGwgODN4eCBwcm9jZXNzb3JzLglUaGUgY29kZSB0byB1cGRhdGUgc29tZSBiaXRmaWVsZHMgd2FzCisgICAgY29tcGlsZWQgb25seSBvbiBzb21lIHByb2Nlc3NvcnMuICBOb3csIHRoZSBiaXRmaWVsZHMgYXJlIHByb2dyYW1tZWQgYXMgbG9uZworICAgIGFzIHRoZSBjb3JyZXNwb25kaW5nIENGR19TQ0NSIG9wdGlvbiBpcyBkZWZpbmVkIGluIHRoZSBib2FyZCBoZWFkZXIgZmlsZS4KKyAgICBUaGlzIG1lYW5zIHRoYXQgdGhlIGJvYXJkIGhlYWRlciBmaWxlIHNob3VsZCBub3QgZGVmaW5lIGFueSBDRkdfU0NDUiBtYWNyb3MKKyAgICBmb3IgYml0ZmllbGRzIHRoYXQgZG9uJ3QgZXhpc3Qgb24gdGhhdCBwcm9jZXNzb3IsIG90aGVyd2lzZSB0aGUgU0NDUiB3aWxsIGJlCisgICAgcHJvZ3JhbW1lZCBpbmNvcnJlY3RseS4KKworICAgIFNpZ25lZC1vZmYtYnk6IFRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDk1NDYyNjY5OTlmMGI5YjUxMzcyNjM2NjE0MjExYjg4ZDkwZjBmMjUKK0F1dGhvcjogTWFydGluIEtyYXVzZSA8bWFydGluLmtyYXVzZUB0cXMuZGU+CitEYXRlOglGcmkgSnVuIDIyIDEzOjA0OjIyIDIwMDcgKzAyMDAKKworICAgIFRRTTgzNHg6IGNsZWFudXAgY29uZmlndXJhdG9uCisKKyAgICBSZW1vdmUgaXJyaXRhdGluZyAjdW5kZWYgREVCVUcKKworICAgIFNpZ25lZC1vZmYtYnk6IE1hcnRpbiBLcmF1c2UgPG1hcnRpbi5rcmF1c2VAdHFzLmRlPgorICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA1ZDQ5N2U2YmYwZjViZjYzNzI5YjRhNDdiM2ZkNzg2ZDNjNzdhMWJjCitBdXRob3I6IGRhdmlkLnNhYWRhIDxEYXZpZC5TYWFkYUBlY2l0ZWxlLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTggMDk6MDk6NTMgMjAwNyAtMDcwMAorCisgICAgTVBDODN4eDogRml4IG1ha2VmaWxlIHRvIGdlbmVyYXRlIGNvbmZpZy5oIGZpbGUgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeQorCisgICAgTVBDODN4eDogRml4IHRoZSBNYWtlZmlsZSBjb25maWcgc2VjdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIGluY2x1ZGUvY29uZmlnLmgKKyAgICBmaWxlIGluIHRoZSBidWlsZCBkaXJlY3RvcnkgaW5zdGVhZCBvZiB0aGUgc291cmNlIGRpcmVjdG9yeS4KKworICAgIFNpZ25lZC1vZmYtYnk6IERhdmlkIFNhYWRhIDxkYXZpZC5zYWFkYUBlY2l0ZWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgMWRlZDAyNDJlNDM3MjU5MzY2NzkyZDUyYjdlOWQxZTE5MzFkOGZhNQorQXV0aG9yOiBMZWUgTmlwcGVyIDxMZWUuTmlwcGVyQGZyZWVzY2FsZS5jb20+CitEYXRlOglUaHUgSnVuIDE0IDIwOjA3OjMzIDIwMDcgLTA1MDAKKworICAgIG1wYzgzeHg6IEFkZCBzdXBwb3J0IGZvciA4MzYwIHNpbGljb24gcmV2aXNpb24gMi4xCisKKyAgICBUaGlzIGNoYW5nZSBhZGRzIDgzNjAgc2lsaWNvbiByZXZpc2lvbiAyLjEgc3VwcG9ydCB0byB1LWJvb3QuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBMZWUgTmlwcGVyIDxsZWUubmlwcGVyQGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGEyMjgwNjQ2OWE4ZjJiNjljODI5ZjRmZDUzNjFmZGViZDBjYjAxYjQKK0F1dGhvcjogS3VtYXIgR2FsYSA8Z2FsYWtAa2VybmVsLmNyYXNoaW5nLm9yZz4KK0RhdGU6CVdlZCBBdWcgOCAwNDoxNDoyOCAyMDA3IC0wNTAwCisKKyAgICBUcmVhdCBwcGM2NCBob3N0IGFzIHBwYworCisgICAgU2lnbmVkLW9mZi1ieTogS3VtYXIgR2FsYSA8Z2FsYWtAa2VybmVsLmNyYXNoaW5nLm9yZz4KKworY29tbWl0IDBkYzQyNzliMDhmZjgyNDcyYmVjMmUyYzkwODU4NjAyNDU5ZmViZTgKK0F1dGhvcjogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBBdWcgOCAwOTowMTo0NiAyMDA3ICswODAwCisKKyAgICBNaW5vciBmaXggZm9yIGJpb3MgZW11bGF0b3IgbWFrZWZpbGUKKworICAgIEFkZCAkKG9iaikgdG8gTElCIGF2b2lkaW5nIG9iamVjdHMgYmUgYnVpbHQgaW4gdGhlIHNvdXJjZSBkaXIKKworICAgIFNpZ25lZC1vZmYtYnk6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBjZTk4MWRjODU3YWRmYzgwMzZjYTJmNmQ1ZDVhMDZjMmE4YWE3N2Q2CitBdXRob3I6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgQXVnIDggMDg6MzM6MTEgMjAwNyArMDgwMAorCisgICAgQWRkIENPTkZJR19CSU9TRU1VIGRlZmluZSB0byBndWFyZCBhbGwgdGhlIGJpb3MgZW11bGF0b3IgY29kZQorCisgICAgU2lnbmVkLW9mZi1ieTogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KKworICAgIFRoaXMgcGF0Y2ggZml4IHRoZSBjb21waWxlIGlzc3VlIG9uIHRoZSBib2FyZCB0aGF0IGRpZCBub3QgZW5hYmxlIHRoZSBiaW9zIGVtdWxhdG9yCisKK2NvbW1pdCBlZDgxMDY0MzM1MjJmMmVhODkzM2U5ODA4MzQ2ODYwZDA2MWQ3NzMxCitBdXRob3I6IFphY2ggU2FkZWNraSA8WmFjaC5TYWRlY2tpQHJpcGNvZGUuY29tPgorRGF0ZToJVHVlIEp1bCAzMSAxMjoyNzoyNSAyMDA3IC0wNTAwCisKKyAgICB0c2VjOiBmaXggbXVsdGlwbGUgUEhZIHN1cHBvcnQKKworICAgIFRoZSBjaGFuZ2UgZW50aXRsZWQgIlJlZHVjZSBDT05GSUdfTVBDOFlYWF9UU0VDeCB0byBDT05GSUdfVFNFQ3giCisgICAgYnJva2UgbXVsdGlwbGUgUEhZIHN1cHBvcnQgaW4gdHNlYy5jLiAgVGhpcyBmaXhlcyBpdC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFphY2ggU2FkZWNraSA8WmFjaC5TYWRlY2tpQHJpcGNvZGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBkY2I4NGI3MjA4YWRlMGJiZWJiZWI1NmJlYzljMmM2NGY4YjJlZWRlCitBdXRob3I6IEpvZSBIYW1tYW4gPGpvZS5oYW1tYW5AZW1iZWRkZWRzcGVjaWFsdGllcy5jb20+CitEYXRlOglUaHUgQXVnIDkgMDk6MDg6MTggMjAwNyAtMDUwMAorCisgICAgdHNlYzogQWxsb3cgVGVuIEJpdCBJbnRlcmZhY2UgYWRkcmVzcyB0byBiZSBjb25maWd1cmFibGUKKworICAgIEFsbG93IHRoZSBhZGRyZXNzIG9mIHRoZSBUZW4gQml0IEludGVyZmFjZSAoVEJJKSB0byBiZSBjaGFuZ2VkIGluIHRoZQorICAgIGV2ZW50IG9mIGEgY29uZmxpY3Qgd2l0aCBhbm90aGVyIGRldmljZS4KKworICAgIFNpZ25lZC1vZmYgYnk6IEpvZSBIYW1tYW4gPGpvZS5oYW1tYW5AZW1iZWRkZWRzcGVjaWFsdGllcy5jb20+CisKK2NvbW1pdCA3YzRjMzcyMmEzOGQ0MGIwY2Y1MzdkZGFlNzJiMDRmNDA4OGIxOTBjCitBdXRob3I6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgQXVnIDcgMTY6MTc6MDYgMjAwNyArMDgwMAorCisgICAgQWRkIENPTkZJR19CSU9TRU1VIGRlZmluZSB0byBndWFyZCBhbGwgdGhlIGJpb3MgZW11bGF0b3IgY29kZQorCisgICAgVGhpcyBwYXRjaCBmaXggdGhlIGNvbXBpbGUgaXNzdWUgb24gdGhlIGJvYXJkIHRoYXQgZGlkIG5vdCBlbmFibGUgdGhlIGJpb3MgZW11bGF0b3IKKworY29tbWl0IGJmMTA2MGVhNGY5ZWFhN2U3ZDE2NGE3MGE3ZDZmMjg5Mzk4ODIwNTMKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVR1ZSBBdWcgNyAxNjowMjoxMyAyMDA3ICswMjAwCisKKyAgICBGaXggbWlzc2luZyBicmFjZSBlcnJvciBpbiBmcy9mYXQvZmF0LmMKKyAgICBbcG9pbnRlZCBvdXQgYnkgUm9kZXJpayBXaWxkZW5idXJnXQorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDZjMzNjNzg1NTdjYTZmOGRhNjhjMDFjZTMzZTI3ODY5NTE5N2QzZjQKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CU1vbiBBdWcgNiAyMzoyMTowNSAyMDA3ICswMjAwCisKKyAgICBGaXhlZCB0eXBvIGluIFJFQURNRSAocG9pbnRlZCBvdXQgYnkgTWFydGluIEpvc3QpLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDljN2U0YjA2MjE0ZGI2MWJiMjFmMWJjYmU1N2M5NzUxOTY2OWJhYWUKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CU1vbiBBdWcgNiAwMjoxNzozNiAyMDA3ICswMjAwCisKKyAgICBDb2Rpbmcgc3R5bGUgY2xlYW51cC4gVXBkYXRlIENIQU5HRUxPRy4KKworICAgIFNpZ25lZC1vZmYtYnk6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisKK2NvbW1pdCAyMjE4MzhjYzdlYjE3ODM3MGZmNjJhYTA1OTIwYTU4MmUxMmFjMzIyCitBdXRob3I6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgSnVsIDEwIDA5OjAzOjIyIDIwMDcgKzA4MDAKKworICAgIFJlbW92ZSB0aGUgYmlvcyBlbXVsYXRvciBmcm9tIE1BSSBib2FyZC4KKworICAgIFRoZSBiaW9zIGVtdWxhdG9yIGluIHRoZSBNQUkgYm9hcmQgY2FuIG5vdCBwYXNzIGNvbXBpbGUKKyAgICBhbmQgaGF2ZSBhIGxvdCBvZiBjcmFwIGluIGl0LiByZW1vdmUgaXQgYW5kIHdpbGwgaGF2ZSBhCisgICAgY2xlYW4gYW5kIHNtYWxsIGJpb3MgZW11bGF0b3IgaW4gdGhlIGRyaXZlcnMgZGlyZWN0b3J5CisgICAgd2hpY2ggY2FuIGJlIHVlc2VkIGZvciBldmVyeSBib2FyZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA1NjE4MzMyNDA5YmI5NmY0NDQ4ZDE3MTI4OTkzNjlmYzgwYzBiNDg5CitBdXRob3I6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CitEYXRlOglGcmkgSnVsIDEzIDEyOjE0OjU5IDIwMDcgKzA4MDAKKworICAgIEZpeCBzb21lIGNvbXBpbGUgaXNzdWVzIGZvciBNQUkgYm9hcmQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMGY0NjBhMWVlMTQ4YjY0OGVlMjQyYzMxNTc2NTAyODdkNDI5NjI2MAorQXV0aG9yOiBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorRGF0ZToJRnJpIEp1bCAxMyAxMjoxNDo1OCAyMDA3ICswODAwCisKKyAgICBDb25maWd1cmF0aW9ucyBmb3IgQVRJIHZpZGVvIGNhcmQgQklPUyBlbXVsYXRvcgorCisgICAgVGhpcyBwYXRjaCBhZGQgZGVmaW5pdGlvbiBvZiB0aGUgQklPUyBlbXVsYXRvciBhbmQgdGhlIEFUSSBmcmFtZWJ1ZmZlcgorICAgIGRyaXZlciBmb3IgTVBDODY0MUhQQ04gYm9hcmQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IFpoYW5nIFdlaSA8d2VpLnpoYW5nQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBlY2U5MmY4NTA1M2I4ZGY2MTNlZGNmMDViMjZhNDE2Y2JjM2Q2MjljCitBdXRob3I6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CitEYXRlOglGcmkgSnVsIDYgMDg6MzQ6NTYgMjAwNyArMDgwMAorCisgICAgVGhpcyBpcyBhIEJJT1MgZW11bGF0b3IsIHBvcnRpbmcgZnJvbSBTY2lUZWNoIGZvciB1LWJvb3QsIG1haW5seSBmb3IKKyAgICBBVEkgdmlkZW8gY2FyZCBCSU9TLiBhbmQgY2FuIGJlIHVzZWQgZm9yIHg4NiBjb2RlIGVtdWxhdGlvbiBieSBzb21lCisgICAgbW9kaWZpY2F0aW9ucy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA1MDcyMTg4YWNhYmRlMzE3OGZhYzdmNWE1OTcxNTBlNmU3NGZkNDBjCitBdXRob3I6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CitEYXRlOglGcmkgSnVsIDYgMDg6MzM6MzMgMjAwNyArMDgwMAorCisgICAgVGhpcyBpcyBhIGZyYW1lYnVmZmVyIGRyaXZlciBmb3IgQVRJIHZpZGVvIGNhcmQsIGNhbiB3b3JrIGZvciBQQ0k5MjAwLAorICAgIFgzMDAsIFg3MDAsIFg4MDAgQVRJIHZpZGVvIGNhcmRzLgorCisgICAgU2lnbmVkLW9mZi1ieTogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNTcyOGJlMzg5ZTY1ZmQ0N2YzNGIzM2MyNTk2MjcxZWI0ZGI3NTFhZQorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJTW9uIEF1ZyA2IDAxOjAxOjQ5IDIwMDcgKzAyMDAKKworICAgIENvZGluZyBzdHlsZSBjbGVhbnVwLiBVcGRhdGUgQ0hBTkdFTE9HLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDgwOTJmZWY0YzI5YjM5NTk1OGJiNjQ5NjQ3ZGE3ZTM3NzU3MzE1MTcKK0F1dGhvcjogTWFydGluIEtyYXVzZSA8TWFydGluLktyYXVzZUB0cXMuZGU+CitEYXRlOglUdWUgRGVjIDEyIDE0OjI2OjAxIDIwMDYgKzAxMDAKKworICAgIEFkZCBmdW5jdGlvbnMgdG8gbGlzdCBvZiBleHBvcnRlZCBmdW5jdGlvbnMKKworICAgIEFkZGl0aW9uYWxseSBleHBvcnQgdGhlIGZvbGxvd2luZyBmdWN0aW9ucyAodG8gbWFrZSB0cmFiX2NvbmZpZyBidWlsZCBhZ2Fpbik6CisgICAgLSBzaW1wbGVfc3RydG9sKCkKKyAgICAtIHN0cmNtcCgpCisKKyAgICBBbHNvIGJ1bXAgdGhlIEFCSSB2ZXJzaW9uIHRvIHJlZmxlY3QgdGhpcyBjaGFuZ2UKKworICAgIFNpZ25lZC1vZmYtYnk6IE1hcnRpbiBLcmF1c2UgPG1hcnRpbi5rcmF1c2VAdHFzLmRlPgorCitjb21taXQgNjNjZWM1ODE0ZmFiNWQyYjFjODY5ODIzMjc0MzM4MDdhNWFjMDI0OQorQXV0aG9yOiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVGh1IEF1ZyAyIDE0OjA5OjQ5IDIwMDcgLTA1MDAKKworICAgIE1ha2UgTVBDODY0MSdzIFBDSS9QQ0ktRSBkcml2ZXIgYSBjb21tb24gZHJpdmVyIGZvciBtYW55IEZTTCBwYXJ0cy4KKworICAgIEFsbCBvZiB0aGUgUENJL1BDSS1FeHByZXNzIGRyaXZlciBhbmQgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0CisgICAgd2FzIGluIHRoZSBNUEM4NjQxSFBDTiBwb3J0IGhhcyBub3cgYmVlbiBtb3ZlZCBpbnRvIHRoZSBjb21tb24KKyAgICBkcml2ZXJzL2ZzbF9wY2lfaW5pdC5jLiAgSW4gYSBzdWJzZXF1ZW50IHBhdGNoLCB0aGlzIHdpbGwgYmUKKyAgICB1dGlsaXplZCBieSB0aGUgODV4eCBwb3J0cyBhcyB3ZWxsLgorCisgICAgQ29tbW9uIFBDSS1FIElNTUFQIHJlZ2lzdGVyIGJsb2NrcyBmb3IgRlNMIDg1eHgvODZ4eCBhcmUgYWRkZWQuCisKKyAgICBBbHNvIGVuYWJsZSB0aGUgc2Vjb25kIFBDSS1FeHByZXNzIGNvbnRyb2xsZXIgb24gODY0MQorICAgIGJ5IGdldHRpbmcgaXRzIEJBVFMgYW5kIENGR18gc2V0dXAgcmlnaHQuCisKKyAgICBGaXhlZCBhIHUxNiB2ZW5kb3IgY29tcGlsZXIgd2FybmluZyBpbiBBSENJIGRyaXZlciB0b28uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IFpoYW5nIFdlaSA8d2VpLnpoYW5nQGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDg2YjExNmIxYjFlMTY1Y2E0ODQwZGFlZmVkMzZkMmUzYjg0NjAxNzMKK0F1dGhvcjogQmFydGxvbWllaiBTaWVrYSA8dHVyQHNlbWloYWxmLmNvbT4KK0RhdGU6CUZyaSBBdWcgMyAxMjowODoxNiAyMDA3ICswMjAwCisKKyAgICBjbTFfcXAxIC0+IGNtNTIwMDogc2luZ2xlIFUtQm9vdCBpbWFnZSBmb3IgbW9kdWxlcyBmcm9tIHRoZSBjbTUyMDAgZmFtaWx5LgorCisgICAgQWRkIHRoZSBhYmlsaXR5IGZvciBtb2R1bGVzIGZyb20gdGhlIFNjaGluZGxlciBjbTUyMDAgZmFtaWx5IHRvIHVzZSBhCisgICAgc2luZ2xlIFUtQm9vdCBpbWFnZToKKyAgICAtIHJlbmFtZSBjbTFfcXAxIHRvIGNtNTIwMAorICAgIC0gYWRkIHJ1bi10aW1lIG1vZHVsZSBkZXRlY3Rpb24KKyAgICAtIHBhcmFtZXRyaXplIFNEUkFNIGNvbmZpZ3VyYXRpb24gYWNjb3JkaW5nIHRvIHRoZSBtb2R1bGUgd2UgYXJlIHJ1bm5pbmcgb24KKworICAgIEZldyBtaW5vciwgYm9hcmQtc3BlY2lmaWMgZml4ZXMgaW5jbHVkZWQgaW4gdGhpcyBwYXRjaDoKKyAgICAtIGJldHRlciBNQUMgYWRkcmVzcyBoYW5kbGluZworICAgIC0gdXBkYXRlZCBkZWZhdWx0IGVudmlyb25tZW50ICgndXBkYXRlJyBjb21tYW5kIHVzZXMgK3tmaWxlc2l6ZX0gbm93KQorICAgIC0gaW1wcm92ZWQgZXJyb3IgbWVzc2FnZXMgaW4gdGhlIGF1dG8tdXBkYXRlIGNvZGUKKyAgICAtIGFsbG93IGJvb3RpbmcgVS1Cb290IGZyb20gUkFNIChDRkdfUkFNQk9PVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyemVnb3J6IEJlcm5hY2tpIDxnamJAc2VtaWhhbGYuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IFBpb3RyIEtydXN6eW5za2kgPHBwa0BzZW1paGFsZi5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogQmFydGxvbWllaiBTaWVrYSA8dHVyQHNlbWloYWxmLmNvbT4KKworY29tbWl0IGM3ZTcxN2ViYzJiMDQ0ZDdhNzEwNjI1NTJjOWRjMGY1NGVhOWI3NzkKK0F1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJRnJpIEF1ZyAzIDA0OjA1OjI1IDIwMDcgLTA1MDAKKworICAgIEFkZCBNYXJ2ZWxsIDExNDkgUEhZIHN1cHBvcnQgdG8gdGhlIFRTRUMKKworY29tbWl0IGIxYjU0ZTM1MjAyOGVkMzcwYzNhYTk1ZDZmZGViOWQ2NGM1ZDJmODYKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVRodSBBdWcgMiAyMToyNzo0NiAyMDA3ICswMjAwCisKKyAgICBDb2Rpbmcgc3R5bGUgY2xlYW51cCwgdXBkYXRlIENIQU5HRUxPRworCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDYzZTIyNzY0ZDJmODY1M2Y2ODg4OGM2NjdlYjY1YjM5OTZiNTI2ODAKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVRodSBBdWcgMiAxMDoxMToxOCAyMDA3ICswMjAwCisKKyAgICBNaW5vciBjbGVhbnVwIG9mIDxib2FyZD5fbmFuZCBidWlsZCBydWxlcy4KKworY29tbWl0IGNkZDkxN2E0M2RhNmZhN2ZjOGY1NGEzY2M5ZjQyMGNlNWVjZjMxOTcKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVRodSBBdWcgMiAwMDo0ODo0NSAyMDA3ICswMjAwCisKKyAgICBGaXggYnVpbGQgZXJyb3JzIGFuZCB3YXJuaW5ncyAvIGNvZGUgY2xlYW51cC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisKK2NvbW1pdCA4OTkzZTU0YjZmMzk3OTczNzk0ZjNkNmY0N2QzYjNjMGM5OGRkNGY2CitBdXRob3I6IFJhZmFsIEphd29yb3dza2kgPHJhakBzZW1paGFsZi5jb20+CitEYXRlOglGcmkgSnVsIDI3IDE0OjQzOjU5IDIwMDcgKzAyMDAKKworICAgIFtBRFM1MTIxXSBTdXBwb3J0IGZvciB0aGUgQURTNTEyMSBib2FyZAorCisgICAgVGhlIGZvbGxvd2luZyBNUEM1MTIxZSBzdWJzeXN0ZW1zIGFyZSBzdXBwb3J0ZWQ6CisKKyAgICAtIGxvdy1sZXZlbCBDUFUgaW5pdAorICAgIC0gTk9SIEJvb3QgRmxhc2ggKGNvbW1vbiBDRkkgZHJpdmVyKQorICAgIC0gRERSIFNEUkFNCisgICAgLSBGRUMKKyAgICAtIEkyQworICAgIC0gV2F0Y2hkb2cKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyemVnb3J6IEJlcm5hY2tpIDxnamJAc2VtaWhhbGYuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IFJhZmFsIEphd29yb3dza2kgPHJhakBzZW1paGFsZi5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogSmFuIFdyb2JlbCA8d3JyQHNlbWloYWxmLmNvbT4KKworY29tbWl0IDE4NjNjZmI3YjEwMGJhMGVlMzQwMTc5OTQ1N2EwMWRjMDU4NzQ1ZjgKK0F1dGhvcjogUmFmYWwgSmF3b3Jvd3NraSA8cmFqQHNlbWloYWxmLmNvbT4KK0RhdGU6CUZyaSBKdWwgMjcgMTQ6MjI6MDQgMjAwNyArMDIwMAorCisgICAgW1BQQ10gUmVtb3ZlIHVudXNlZCBNU1JfVVNFUiBkZWZpbml0aW9uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBSYWZhbCBKYXdvcm93c2tpIDxyYWpAc2VtaWhhbGYuY29tPgorCitjb21taXQgY2MzMDIzYjlmOTVkN2FjOTU5YTc2NDQ3MWE2NTAwMTA2MmFlY2Y0MQorQXV0aG9yOiBSYWZhbCBKYXdvcm93c2tpIDxyYWpAc2VtaWhhbGYuY29tPgorRGF0ZToJVGh1IEp1bCAxOSAxNzoxMjoyOCAyMDA3ICswMjAwCisKKyAgICBGaXggYnJlYWthZ2Ugb2YgOHh4IGJvYXJkcyBmcm9tIHJlY2VudCBjb21taXQuCisKKyAgICBUaGlzIHBhdGNoIGZpeGVzIHRoZSBuZWdhdGl2ZSBjb25zZXF1ZW5jZXMgZm9yIDh4eCBvZiB0aGUgcmVjZW50CisgICAgInBwYzR4eDogQ2xlYW4gdXAgNDQwIGV4Y2VwdGlvbnMgaGFuZGxpbmciIGNvbW1pdC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFJhZmFsIEphd29yb3dza2kgPHJhakBzZW1paGFsZi5jb20+CisKK2NvbW1pdCAzYTZjYWI4NDRjZjc0Zjc2NjM5ZDc5NWUwYmU4NzE3ZTAyYzg2YWY3CitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglTYXQgSnVsIDE0IDIyOjUxOjAyIDIwMDcgKzAyMDAKKworICAgIFVwZGF0ZSBDSEFOR0VMT0cKKworICAgIFNpZ25lZC1vZmYtYnk6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisKIGNvbW1pdCAwMTE1OTUzMDc3MzFhN2E2N2E3NDQ1ZDEwN2MyNzlkMDMxZThhYjk3CiBBdXRob3I6IEhlaWtvIFNjaG9jaGVyIDxoc0Bwb2xsdXguZGVueC5kZT4KIERhdGU6CVNhdCBKdWwgMTQgMDE6MDY6NTggMjAwNyArMDIwMApAQCAtMjksNiArMTMzMywxNTQgQEAKIAogICAgIFNpZ25lZC1vZmYtYnk6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CiAKK2NvbW1pdCA1YTU2YWYzYjUyMmJhNDdmYjMzYTNmZWU4NGQyM2JmMWU1NDI5NjU0CitBdXRob3I6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CUZyaSBKdW4gOCAxNjo0MToxOCAyMDA3IC0wNTAwCisKKyAgICBSZW1vdmUgZXJyb25lb3VzIGVycmF0YSBjb2RlIGZyb20gTWFydmVsIDg4RTExMTFTIGRyaXZlcgorCisgICAgVGhlIE1hcnZlbCA4OEUxMTExUyBkcml2ZXIgZm9yIHRoZSBUU0VDIHdhcyBjb3BpZWQgZnJvbSB0aGUKKyAgICA4OEUxMTAxIGRyaXZlciwgYW5kIGluY2x1ZGVkIGEgZml4IGZvciBhbiBlcnJhdHVtIHdoaWNoIGRvZXMgbm90CisgICAgZXhpc3Qgb24gdGhhdCBwYXJ0LiAgTm93IGl0IGlzIHJlbW92ZWQKKworICAgIFNpZ25lZC1vZmYtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDk4MmVmY2YyM2ZkMDM2NDdlMDFlMmZiZTI4YTdhMzYyMzkxNTZjYzAKK0F1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1biA1IDE2OjM4OjQ0IDIwMDcgLTA1MDAKKworICAgIEZyb206IGVyYW4gbGliZXJ0eSA8ZXJhbi5saWJlcnR5QGdtYWlsLmNvbT4KKworICAgIGFkZHMgdGhlIHJlc2V0IHJlZ2lzdGVyIHRvIDg1eHggaW1tYXAKKworICAgIFNpZ25lZC1vZmYtYnk6IEVyYW4gTGliZXJ0eSA8ZXJhbi5saWJlcnR5QGdtYWlsLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBkM2VjMGQ5NDNhMDQ1YmRiOTllMTU5ZTdiYmM3NzQzMGUwOWYxMWQ3CitBdXRob3I6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVRodSBNYXkgMTAgMTc6NTA6MDEgMjAwNyAtMDUwMAorCisgICAgUG9saXNoZWQgdGhlIDg1eHggQURTIGNvbmZpZyBmaWxlcworCisgICAgTWFkZSB0aGUgYm9vdCBjb21tYW5kcyB1c2UgZGV2aWNlIHRyZWVzIGJ5IGRlZmF1bHQuCisgICAgQWxzbyBtb3ZlZCB0aGUgcmFtZGlzayB0byAxMDAwMDAwIChJIHRoaW5rIHRoZSBwcmV2aW91cyBhZGRyZXNzCisgICAgd2FzIGdldHRpbmcgb3ZlcnJpZGRlbiBkdXJpbmcgYm9vdCkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBiZmIzN2IzMmQxYjBiMDNmMTgwNzdkYmE0OWNjNjZhNmU3NmZhMDM4CitBdXRob3I6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgTWF5IDkgMTE6MDM6MzIgMjAwNyAtMDUwMAorCisgICAgODU0NGRzOiBGaXggTWFrZWZpbGUgYWZ0ZXIgbW92aW5nIHBpeGlzIHRvIGJvYXJkL2ZyZWVzY2FsZS4KKworICAgIFRoZSBPQkpUUkVFICE9IFNSQ1RSRUUgYnVpbGQgc2NlbmFyaW8gd2FzIGJyb2tlbi4KKyAgICBUaGlzIGZpeGVzIGl0LgorCisgICAgU2lnbmVkLW9mZi1ieTogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMmEzY2VlNDNjM2I3MWZhNWI4ZDkxZGIxOWYwNTA2Nzg2NTI5MGYzZQorQXV0aG9yOiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgTWF5IDkgMDA6NTQ6MjAgMjAwNyAtMDUwMAorCisgICAgdHNlYzogRml4IFBIWSBjb2RlIHRvIG1hdGNoIGZpcnN0IGRyaXZlcgorCisgICAgSmFycm9sZCBXZW4gbm90aWNlZCB0aGF0IHRoZSBnZW5lcmljIFBIWSBjb2RlIGFsd2F5cyBtYXRjaGVzCisgICAgdW5kZXIgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uICBDaGFuZ2UgaXQgc28gdGhlIGZpcnN0IG1hdGNoCisgICAgd2lucywgYW5kICpvbmx5KiB1bmtub3duIFBIWXMgdHJpZ2dlciB0aGUgZ2VuZXJpYyBkcml2ZXIKKworICAgIFNpZ25lZC1vZmYtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGNjYzA5MWFhYzYxYTM4Y2Q5OThkNTc1ZDkyZjcyMzJlMjU2ZDYzMTIKK0F1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIE1heSA4IDE3OjI3OjQzIDIwMDcgLTA1MDAKKworICAgIEFkZCBzdXBwb3J0IGZvciBDUE0gZGV2aWNlIHRyZWUgY29uZmlndXJhdGlvbiB0byA4NTYwIEFEUworCisgICAgKiBBZGRzIGNvZGUgdG8gbW9kaWZ5IENQTSBmcmVxdWVuY2llcworICAgICogQ2xlYW5zIHVwIHRoZSBjb25maWcgZmlsZSB0byAjZGVmaW5lIFRTRUMgYW5kIChmb3Igbm93KSAjdW5kZWYgRkNDCisgICAgKiBBZGRzIHRoZSBNSUkgY29tbWFuZCBmb3IgYWxsIDg1NjAgQURTIGNvbmZpZ3VyYXRpb25zCisgICAgKiBVcGRhdGVzIGNvbmZpZyBmaWxlIHRvIHByb3ZpZGUgY29udmVuaWVuY2UgY29tbWFuZHMgZm9yIGJvb3RpbmcKKyAgICAgIHdpdGggYSBkZXZpY2UgdHJlZQorCisgICAgU2lnbmVkLW9mZi1ieTogVml0YWx5IEJvcmR1ZyA8dmJvcmR1Z0BydS5tdmlzdGEuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDc1MDdkNTZjY2FmN2FhZTFjNDc0MzQyYTlhNTU0MDE2NWNkN2U5ZDkKK0F1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIE1heSA4IDE3OjIzOjAyIDIwMDcgLTA1MDAKKworICAgIEZpeCBNYXJ2ZWxsIDg4ZTExNDUgUEhZIGluaXQgY29kZQorCisgICAgRml4IGEgYnVnIGluIHRoZSBNYXJ2ZWxsIDg4ZTExNDUgUEhZIGluaXQgY29kZSBpbiB0aGUgVFNFQyBkcml2ZXIKKyAgICB3aGVyZSB0aGUgcmVzZXQgd2FzIGJlaW5nIGRvbmUgYWZ0ZXIgdGhlIGVycmF0YSBjb2RlIGluc3RlYWQgb2YKKyAgICBiZWZvcmUuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBIYWl5aW5nIFdhbmcgPGhhaXlpbmcud2FuZ0BmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDVkYzIxMGRlYzViYWNlOThhNTBiNmJhOTA1MzQ3ODkwMDkxYTliYjAKK0F1dGhvcjogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBKdWwgMTEgMTQ6NTI6MTYgMjAwNyAtMDUwMAorCisgICAgQWRkIHNpbXBsZSBhZ2VudC9lbmQtcG9pbnQgY29uZmlndXJhdGlvbiBpbiBQQ0kgQXV0b0NvbmZpZyBmb3IgUENJX0NMQVNTX1BST0NFU1NPUl9QT1dFUlBDLgorCisgICAgU2lnbmVkLW9mZi1ieTogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGU4Yjg1ZjNiYTRjZDg5MzBlMGEyZmVhMjEwMGM4MTVkNjQyMDE3NjUKK0F1dGhvcjogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBKdWwgMTEgMTQ6NTI6MDggMjAwNyAtMDUwMAorCisgICAgcGNpYXV0byBzZXR1cCBicmlkZ2UKKworICAgIFRoZSBQMlAgYnJpZGdlIGJ1cyBudW1iZXJzIHByb2dyYW1tZWQgaW50byB0aGUgZGV2aWNlIGFyZSByZWxhdGl2ZSB0bworICAgIGhvc2UtPmZpcnN0X2J1c25vLgorCisgICAgU2lnbmVkLW9mZi1ieTogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDU3MWY0OWZhNzE3MDA0Y2E0MjY4YjRlMjQwNTdlZmM3YmY5Zjk4N2IKK0F1dGhvcjogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBKdWwgMTEgMTQ6NTI6MDEgMjAwNyAtMDUwMAorCisgICAgU3VwcG9ydCBQQ0llIGV4dGVuZGVkIGNvbmZpZyByZWdpc3RlcnMKKworICAgIEZTTCBQQ0llIGJsb2NrIGhhcyBleHRlbmRlZCBjZmcgcmVnaXN0ZXJzIGluIHRoZSAxMDAgYW5kIDQwMCByYW5nZS4KKyAgICBGb3IgZXhhbXBsZSwgdG8gcmVhZCB0aGUgTFRTU00gcmVnaXN0ZXI6IHBjaSBkaXNwbGF5IDxidXNuPi4wIDQwNCAxCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYmE1ZmViMTI1ODFiYjI5MTJjZTMwMWU0ODY2YjcxZjg0NmU5ZmMwNworQXV0aG9yOiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorRGF0ZToJV2VkIEp1bCAxMSAxNDo1MTo0OCAyMDA3IC0wNTAwCisKKyAgICBNaW5vciBpbXByb3ZlbWVudHMgdG8gZHJpdmVycy9wY2lfYXV0by5jCisKKyAgICAtIE1ha2UgcGNpYXV0b197cHJlLHBvc3R9c2Nhbl9zZXR1cF9icmlkZ2Ugbm9uLXN0YXRpYworICAgIC0gQWRkZWQgcGh5c2ljYWwgYWRkcmVzcyBkaXNwbGF5IGluIGRlYnVnIG1lc3NhZ2VzLgorCisgICAgU2lnbmVkLW9mZi1ieTogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDQwZTgxYWRkYWI3YmI3NGQyMGRkZjY4MWNlOWJhYmM4ODBhODI4ZWUKK0F1dGhvcjogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBKdWwgMTEgMTQ6NTE6MzUgMjAwNyAtMDUwMAorCisgICAgU3RhcnQgcGNpIGhvc2Ugc2NhbiBmcm9tIGhvc2UtPmN1cnJlbnRfYnVzbm8uCisKKyAgICBFbnN1cmUgaG9zZS0+Y3VycmVudF9idXNubyBpcyBub3QgbGVzcyB0aGFuIGZpcnN0X2J1c25vLiAgVGhpcyBmaXhlcworICAgIGJyb2tlbiBib2FyZCBjb2RlIHdoaWNoIGxlYXZlcyBjdXJyZW50X2J1c25vPTAgd2hlbiBmaXJzdF9idXNubyBpcworICAgIGdyZWF0ZXIgdGhhbiAwIGZvciB0aGUgY2FzZXMgd2l0aCBtdWx0aXBsZSBjb250cm9sbGVycy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAzODY1YjFmYjc4NDNhMDhhZDQ5YTYzMTlhMzY0MTU3NTIyNzZmZjQ4CitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CVdlZCBKdWwgMTEgMTI6MTM6NTMgMjAwNyArMDIwMAorCisgICAgRml4IHNvbWUgY29tcGlsZSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IHRoZSBsYXRlc3QgQ0ZHX0NNRF94eHggY2xlYW51cAorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCiBjb21taXQgZmExZGYzMDg5MjZhNmY3MGUzNTA0YzU3NTE0ZWYyN2FjMzFmZDEzYQogQXV0aG9yOiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgogRGF0ZToJV2VkIEp1bCAxMSAyMDoxMTowNyAyMDA3ICswMjAwCkBAIC00OSw2ICsxNTAxLDQwNCBAQAogCiAgICAgU2lnbmVkLW9mZi1ieTogSGVpa28gU2Nob2NoZXIgPGhzQGRlbnguZGU+CiAKK2NvbW1pdCBlOTUxNDc1MWNmYTVjY2U2MWVhNjk5ZmEwZDNlYjM3ODk4YTVlZWI1CitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CVN1biBKdWwgOCAxMzo0NDoyNyAyMDA3ICswMjAwCisKKyAgICBGaXggbWFsbG9jIHByb2JsZW0gaW50cm9kdWNlZCB3aXRoIHRoZSByZWxvY2F0aW9uIGZpeHVwIGZvciB0aGUgUFBDIHBsYXRmb3JtCisKKyAgICBUaGUgcmVsb2NhdGlvbiBmaXh1cCBkaWRuJ3QgaGFuZGxlIHRoZSBtYWxsb2MgcG9pbnRlciBpbml0aWFsaXphdGlvbgorICAgIGNvcnJlY3RseS4gVGhpcyBwYXRjaCBmaXhlcyB0aGlzIHByb2JsZW0uIFRlc3RlZCBzdWNjZXNzZnVsbHkgb24gNHh4LgorICAgIFRoZSByZWxvY2F0aW9uIGZpeHVwIHBhdGNoZXMgZm9yIDR4eCB3aWxsIGZvbGxvdyBzb29uLgorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgYjNhZmYwY2I5ZWNmMjM2ZDdlOGM5Mzc2MWRkMWRhZGY2ODM3YTU4MgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAxMToxOTo1MCAyMDA3IC0wNTAwCisKKyAgICBkaXNrLyBkb2MvIGxpYl8qLyBhbmQgdG9vbHMvOiBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBGaXhlZCBzb21lIGJyb2tlbiBpbnN0YW5jZXMgb2YgIiNpZmRlZiBDTURfQ0ZHX0lERSIgdG9vLgorICAgIFRob3NlIGFsd2F5cyBldmFsdWF0ZWQgVFJVRSwgYW5kIHRodXMgd2VyZSBhbHdheXMgY29tcGlsZWQKKyAgICBldmVuIHdoZW4gSURFIHJlYWxseSB3YXNuJ3QgZGVmaW5lZC93YW50ZWQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZGRiNWQ4NmYwMjE1YmNiNmMyOTM1MTBjNTBlYjA1MGU5Mjg4M2I3YQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAxMToxMzoyMSAyMDA3IC0wNTAwCisKKyAgICBkcml2ZXJzLzogUmVtb3ZlIGxpbmdlcmluZyByZWZlcmVuY2VzIHRvIENGR19DTURfKiBzeW1ib2xzLgorCisgICAgRml4ZWQgc29tZSBicm9rZW4gaW5zdGFuY2VzIG9mICIjaWZkZWYgQ01EX0NGR19JREUiIHRvby4KKyAgICBUaG9zZSBhbHdheXMgZXZhbHVhdGVkIFRSVUUsIGFuZCB0aHVzIHdlcmUgYWx3YXlzIGNvbXBpbGVkCisgICAgZXZlbiB3aGVuIElERSByZWFsbHkgd2Fzbid0IGRlZmluZWQvd2FudGVkLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGY0MGE3ZjNlMzg4OGI0MmE0MzY3NGIwOTllNTQ3MDAyMmM4YzU0NGMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMTE6MDc6NTYgMjAwNyAtMDUwMAorCisgICAgZnMvOiBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBGaXhlZCBzb21lIGJyb2tlbiBpbnN0YW5jZXMgb2YgIiNpZmRlZiBDTURfQ0ZHX0lERSIgdG9vLgorICAgIFRob3NlIGFsd2F5cyBldmFsdWF0ZWQgVFJVRSwgYW5kIHRodXMgd2VyZSBhbHdheXMgY29tcGlsZWQKKyAgICBldmVuIHdoZW4gSURFIHJlYWxseSB3YXNuJ3QgZGVmaW5lZC93YW50ZWQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNjEwZjJlOWMyOGE5YzEwMWUwOWZhMWI3ODE0M2NmNWYwMGVkMTU5MworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAxMTowNTowMiAyMDA3IC0wNTAwCisKKyAgICBuZXQvOiBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBGaXhlZCBzb21lIGJyb2tlbiBpbnN0YW5jZXMgb2YgIiNpZmRlZiBDTURfQ0ZHX0lERSIgdG9vLgorICAgIFRob3NlIGFsd2F5cyBldmFsdWF0ZWQgVFJVRSwgYW5kIHRodXMgd2VyZSBhbHdheXMgY29tcGlsZWQKKyAgICBldmVuIHdoZW4gSURFIHJlYWxseSB3YXNuJ3QgZGVmaW5lZC93YW50ZWQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgOTAyNTMxNzg4Mzc2MDQ2ZGEyMTJhZmQxNjYxY2ZmYjYyZjNkYWExYworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAxMTowMjo0NCAyMDA3IC0wNTAwCisKKyAgICBjb21tb24vOiBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBGaXhlZCBzb21lIGJyb2tlbiBpbnN0YW5jZXMgb2YgIiNpZmRlZiBDTURfQ0ZHX0lERSIgdG9vLgorICAgIFRob3NlIGFsd2F5cyBldmFsdWF0ZWQgVFJVRSwgYW5kIHRodXMgd2VyZSBhbHdheXMgY29tcGlsZWQKKyAgICBldmVuIHdoZW4gSURFIHJlYWxseSB3YXNuJ3QgZGVmaW5lZC93YW50ZWQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZDM5YjU3NDE1ODM4YzczZmIwYTM3ZWNhODRkZTNjNjhiYTk5MDU4NgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAxMDo0ODoyMiAyMDA3IC0wNTAwCisKKyAgICBib2FyZC9bai16XSo6IFJlbW92ZSBsaW5nZXJpbmcgcmVmZXJlbmNlcyB0byBDRkdfQ01EXyogc3ltYm9scy4KKworICAgIEZpeGVkIHNvbWUgYnJva2VuIGluc3RhbmNlcyBvZiAiI2lmZGVmIENNRF9DRkdfSURFIiB0b28uCisgICAgVGhvc2UgYWx3YXlzIGV2YWx1YXRlZCBUUlVFLCBhbmQgdGh1cyB3ZXJlIGFsd2F5cyBjb21waWxlZAorICAgIGV2ZW4gd2hlbiBJREUgcmVhbGx5IHdhc24ndCBkZWZpbmVkL3dhbnRlZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA3N2EzMTg1NDVkNTdhZWZhODQ0NzUyNDY1Yjk0YzdlMDlhM2YyNmQwCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgSnVsIDEwIDEwOjM5OjEwIDIwMDcgLTA1MDAKKworICAgIGJvYXJkL1tBLVphLWldKjogUmVtb3ZlIGxpbmdlcmluZyByZWZlcmVuY2VzIHRvIENGR19DTURfKiBzeW1ib2xzLgorCisgICAgRml4ZWQgc29tZSBicm9rZW4gaW5zdGFuY2VzIG9mICIjaWZkZWYgQ01EX0NGR19JREUiIHRvby4KKyAgICBUaG9zZSBhbHdheXMgZXZhbHVhdGVkIFRSVUUsIGFuZCB0aHVzIHdlcmUgYWx3YXlzIGNvbXBpbGVkCisgICAgZXZlbiB3aGVuIElERSByZWFsbHkgd2Fzbid0IGRlZmluZWQvd2FudGVkLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDA2OGI2MGEwZWI3ZTczYjI0M2NhNTUzOTlmMmE3ZGY3NmUyYzNmM2QKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMTA6Mjc6MzkgMjAwNyAtMDUwMAorCisgICAgY3B1LyBydGMvIGluY2x1ZGUvOiBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMDc5YTEzNmMzNTg4ODE0Nzg0NTYxZDZlNDg1Njk3MGVlODJkNmUyYQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAxMDoxMjoxMCAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3MvW3Atel0qICsgbWlzYzogQ2xlYW51cCBCT09UUCBhbmQgbGluZ2VyaW5nIENGR19DTURfKi4KKworICAgIEV4cGxpY2l0bHkgYWRkIGluIGRlZmF1bHQgQ09ORklHX0JPT1RQXyogb3B0aW9ucyB3aGVyZSBjbWRfY29uZmRlZnMuaAorICAgIHVzZWQgdG8gYmUgaW5jbHVkZWQgYnV0IENPTkZJR19CT09UUF9NQVNLIHdhcyBub3QgZGVmaW5lZC4KKworICAgIFJlbW92ZSBsaW5nZXJpbmcgcmVmZXJlbmNlcyB0byBDRkdfQ01EXyogc3ltYm9scy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA3ZjVjMDE1Nzc0MDBjNzRjYzViYWM3NGY0MWRkMGQzYzc5ZGY2MjNjCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgSnVsIDEwIDA5OjM4OjAyIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlncy9bZy1vXSo6IENsZWFudXAgQk9PVFAgYW5kIGxpbmdlcmluZyBDRkdfQ01EXyouCisKKyAgICBFeHBsaWNpdGx5IGFkZCBpbiBkZWZhdWx0IENPTkZJR19CT09UUF8qIG9wdGlvbnMgd2hlcmUgY21kX2NvbmZkZWZzLmgKKyAgICB1c2VkIHRvIGJlIGluY2x1ZGVkIGJ1dCBDT05GSUdfQk9PVFBfTUFTSyB3YXMgbm90IGRlZmluZWQuCisKKyAgICBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgODBmZjRmOTliODRiNjRlZGNhM2ZkMTBkYTM2NWVjMTQ5M2JlMWM5NQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAwOToyOTowMSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3MvW2EtZV0qOiBDbGVhbnVwIEJPT1RQIGFuZCBsaW5nZXJpbmcgQ0ZHX0NNRF8qLgorCisgICAgRXhwbGljaXRseSBhZGQgaW4gZGVmYXVsdCBDT05GSUdfQk9PVFBfKiBvcHRpb25zIHdoZXJlIGNtZF9jb25mZGVmcy5oCisgICAgdXNlZCB0byBiZSBpbmNsdWRlZCBidXQgQ09ORklHX0JPT1RQX01BU0sgd2FzIG5vdCBkZWZpbmVkLgorCisgICAgUmVtb3ZlIGxpbmdlcmluZyByZWZlcmVuY2VzIHRvIENGR19DTURfKiBzeW1ib2xzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGExYWEwYmI1MDJlMjVmZDU5OGI1ZTBjY2RmYjJjMTc0OTIxZDcxNGEKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMDk6MjI6MjMgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzL1tQLVpdKjogQ2xlYW51cCBCT09UUCBhbmQgbGluZ2VyaW5nIENGR19DTURfKi4KKworICAgIEV4cGxpY2l0bHkgYWRkIGluIGRlZmF1bHQgQ09ORklHX0JPT1RQXyogb3B0aW9ucyB3aGVyZSBjbWRfY29uZmRlZnMuaAorICAgIHVzZWQgdG8gYmUgaW5jbHVkZWQgYnV0IENPTkZJR19CT09UUF9NQVNLIHdhcyBub3QgZGVmaW5lZC4KKworICAgIFJlbW92ZSBsaW5nZXJpbmcgcmVmZXJlbmNlcyB0byBDRkdfQ01EXyogc3ltYm9scy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA2NTllMmY2NzM2MjMyYTA4YWNjYTg3ODVjMjA2ZTJiNGQ5Y2QwN2Q3CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgSnVsIDEwIDA5OjEwOjQ5IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlncy9bSi1PXSo6IENsZWFudXAgQk9PVFAgYW5kIGxpbmdlcmluZyBDRkdfQ01EXyouCisKKyAgICBFeHBsaWNpdGx5IGFkZCBpbiBkZWZhdWx0IENPTkZJR19CT09UUF8qIG9wdGlvbnMgd2hlcmUgY21kX2NvbmZkZWZzLmgKKyAgICB1c2VkIHRvIGJlIGluY2x1ZGVkIGJ1dCBDT05GSUdfQk9PVFBfTUFTSyB3YXMgbm90IGRlZmluZWQuCisKKyAgICBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMTE3OTk0MzRjNWZmMTVhNjEyNTc3YmIxYWQxZjRlYTFhMDU5NWU0YgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAwOTowMjo1NyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3MvW0EtSV0qOiBDbGVhbnVwIEJPT1RQIGFuZCBsaW5nZXJpbmcgQ0ZHX0NNRF8qLgorCisgICAgRXhwbGljaXRseSBhZGQgaW4gZGVmYXVsdCBDT05GSUdfQk9PVFBfKiBvcHRpb25zIHdoZXJlIGNtZF9jb25mZGVmcy5oCisgICAgdXNlZCB0byBiZSBpbmNsdWRlZCBidXQgQ09ORklHX0JPT1RQX01BU0sgd2FzIG5vdCBkZWZpbmVkLgorCisgICAgUmVtb3ZlIGxpbmdlcmluZyByZWZlcmVuY2VzIHRvIENGR19DTURfKiBzeW1ib2xzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDFmZTgwZDc5YzVjNGU1MmQzNDEwYTdhYjRiODUxNWRhMDk1Y2RhYjMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAyMjowODozNCAyMDA3IC0wNTAwCisKKyAgICBGaW5hbGx5IHJldGlyZSBjbWRfY29uZmRlZnMuaCBhbmQgQ09ORklHX0JPT1RQX01BU0shCisKKyAgICBBbGwgb2YgdGhlIGNob2ljZXMgZm9yIENPTkZJR19CT09UUF8gYXJlIG5vdyBkb2N1bWVudGVkIGluCisgICAgdGhlIFJFQURNRSBmaWxlLiAgWW91IG11c3Qgbm93IGluZGl2aWR1YWxseSBzZWxlY3QgZXhhY3RseQorICAgIHRoZSBzZXQgdGhhdCB5b3Ugd2FudCB1c2luZyBhIHNlcmllcyBvZgorCSNkZWZpbmUgQ09ORklHX0JPT1RQXzx4PgorICAgIHN0YXRlbWVudHMgaW4gdGhlIGJvYXJkIHBvcnQgY29uZmlnIGZpbGVzIG5vdy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBkM2I4YzFhNzQzZGNkMzE2MjVjOTllNmE0NDU5MGYyMDdlYjAwMDI4CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMjE6NTc6MzEgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzL1ttLXpdKjogRGlyZWN0bHkgdXNlIENPTkZJR19CT09UUF8qIHN5bWJvbHMgcmF0aGVyIHRoYW4gQ09ORklHX0JPT1RQX01BU0suCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMmZkOTBjZTU3NWIwMmQxODljYmY0NDNjODUzMDliY2QwMDFhYTM5MworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDIxOjQ4OjI2IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlncy9bYS1tXSo6IERpcmVjdGx5IHVzZSBDT05GSUdfQk9PVFBfKiBzeW1ib2xzIHJhdGhlciB0aGFuIENPTkZJR19CT09UUF9NQVNLLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDM3ZDRiYjcwNTg2NjU5ZGVkZWYxNjU4Y2UxYmVkMDcxYmUwOThhZWMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAyMTozODowMiAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3MvW1QtWl0qOiBEaXJlY3RseSB1c2UgQ09ORklHX0JPT1RQXyogc3ltYm9scyByYXRoZXIgdGhhbiBDT05GSUdfQk9PVFBfTUFTSy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAxODIyNWU4ZGQxOTUwYmQ2ZGJmMzUwMTFlNDM2ZGI3ZjQ3NGMxODdkCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMjE6MzE6MjQgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzL1tQLVNdKjogRGlyZWN0bHkgdXNlIENPTkZJR19CT09UUF8qIHN5bWJvbHMgcmF0aGVyIHRoYW4gQ09ORklHX0JPT1RQX01BU0suCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgN2JlMDQ0ZTRlYTY0NGIwZWYxYzQ4NmRhZGMxYTRjMjY2NWI0Mzc0ZAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDIxOjI0OjE5IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlncy9bSC1OXSo6IERpcmVjdGx5IHVzZSBDT05GSUdfQk9PVFBfKiBzeW1ib2xzIHJhdGhlciB0aGFuIENPTkZJR19CT09UUF9NQVNLLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDVkMmViZTFiM2VmMDA1NWM2NjFiYjFhMGQyNTJiZjI1MjM4MDA2OWYKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAyMToxNjo1MyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3MvW0EtR10qOiBEaXJlY3RseSB1c2UgQ09ORklHX0JPT1RQXyogc3ltYm9scyByYXRoZXIgdGhhbiBDT05GSUdfQk9PVFBfTUFTSy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBmNTVmN2Y4ZDgzZjM2MDIxYWIxZjBlM2Q3MzhmNWQ4YzgwODNhN2UzCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTk6MTI6MzAgMjAwNyAtMDUwMAorCisgICAgUmV0aXJlIENPTkZJR19DT01NQU5EUyBmaW5hbGx5LgorICAgIFN0cmlwIG9sZCBDRkdfQ01EXyogc3ltYm9scyBvdXQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYjU1MDFmN2Q3MjBmZWQ5OWFiMGI0MmM4M2Y1ZGVhNTI4NjhjZTAwNworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE5OjEwOjAzIDIwMDcgLTA1MDAKKworICAgIFVwZGF0ZSBSRUFETUUuKiB0byByZWZlcmVuY2UgbmV3IENPTkZJR19DTURfKiBuYW1lcyBub3cuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNDQzMTI4M2M3ZTZkNTRhZTE4MGQ0NjZlNTFiZjJkOTc0NzFhMGFkOQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE5OjA2OjAwIDIwMDcgLTA1MDAKKworICAgIGNwdS9tKjogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgM2ExZWQxZTFmOTIyYzQxOWJiNzFmN2RmNDk0OWQ3ODNhZGUzNjlmYQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE4OjU3OjIyIDIwMDcgLTA1MDAKKworICAgIGNwdS9bN2EtbG4tel0qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBhYjNhYmNiYWJkODQwOTI4ZmIxZWI1MTIyMTE4Y2E0NjZiNWU1MDEzCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTg6NDU6MTYgMjAwNyAtMDUwMAorCisgICAgYm9hcmQvW3Etel0qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAzZmUwMDEwOWE1ZjEyZGU1NWI2ZTI1YjFmOThkZmMyNGJjOTA5MGM5CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTg6Mzg6MzkgMjAwNyAtMDUwMAorCisgICAgYm9hcmQvW20tcF0qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBjNTA4YTRjZWZkOGE5NTNmYzY0OTU3NjUwNTA2YTAzNWU2ZTNkOWQxCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTg6MzE6MjggMjAwNyAtMDUwMAorCisgICAgYm9hcmQvW2YtbF0qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBiOTMwNzI2MmY4YTlmM2I1YzllMTVhNjA2N2VhZGMxNzQwNzE0NmY2CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTg6MjQ6NTUgMjAwNyAtMDUwMAorCisgICAgYm9hcmQvW2QtZV0qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBmY2VjMmViOTNlMTI2NDAwMDA5NzI5MzI4ZTc5N2YxMmJjOTRmMWZkCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTg6MTk6MDkgMjAwNyAtMDUwMAorCisgICAgYm9hcmQvW0EtWmEtY10qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBhNTkzODE0ZjJiZTBjOWNkYzMxMzNjZDU1MGIxNjdiOGE5ODgzMjhmCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTg6MTA6NTAgMjAwNyAtMDUwMAorCisgICAgcnRjLzogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNjczNTA1NjhmOWQ0NmU2NmMyMTgyOWYzNTEzYjNkYjBjYWViOTQ4YgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE4OjA1OjM4IDIwMDcgLTA1MDAKKworICAgIGxpYl97YXJtLGF2cjMyLGJsYWNrZmluLGdlbmVyaWMsaTM4Nn0vOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA3ZGVmNmIzNGY5MTBmMDhkN2VmMGExNDY0NmRhMDY3NzE5MjM3Y2EyCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTg6MDI6MTEgMjAwNyAtMDUwMAorCisgICAgbGliX3ttNjhrLG1pY3JvYmxhemUsbWlwcyxwcGN9LzogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZGQ2MGQxMjIzYjk5YTg4YTcyMTZmM2UwNDFmZTQwNjM0YWQ0YzJiYgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE3OjU2OjUwIDIwMDcgLTA1MDAKKworICAgIGZzLzogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYzkxODk4YmJjNTA1YWZmM2UxMmE4MDdhZjg4ZTc2ZGExOGVmYjdlZQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE3OjQ2OjA5IDIwMDcgLTA1MDAKKworICAgIHRvb2xzLzogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNjQzZDFhYjIzOTYwOTUwYjUyZTBhMjgwM2MyZDNlYTRjNTU4ZmEwMQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE3OjQ1OjE0IDIwMDcgLTA1MDAKKworICAgIG5ldC86IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIENPTkZJR19DT01NQU5EUworCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGNiNTFjMGJmODhmOTVhMWJjYTY4MzI0YjAxMjZmOGVlZDhiNDMyNzMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAxNzozOTo0MiAyMDA3IC0wNTAwCisKKyAgICBkcml2ZXJzL1tuLXpdKjogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMDdkMzhhMTdlOTY0YWVjNGM3ODI3ZjBlZTlhNTgzYmM4Y2MxYWQ2YgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE3OjMwOjAxIDIwMDcgLTA1MDAKKworICAgIGRyaXZlcnMvW2EtbV0qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBjZGU1YzY0ZDE3Y2Y0ODM0YWE3YjVjMzczZjI4OGJjN2RhZDI3YjI5CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTc6MjI6MzcgMjAwNyAtMDUwMAorCisgICAgZGlzay86IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIENPTkZJR19DT01NQU5EUworCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDYzOTIyMWM3NmM4ODIxNWJkNTVhZjgzYWQxNzRmYzMwZDE5NDBmOGYKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAxNzoxNTo0OSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlLzogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisgICAgTW9zdGx5IHJlbW92ZWQgZnJvbSBjb21tZW50cyBoZXJlLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKwogY29tbWl0IDRlZjIxOGY2ZmRmOGQ3NDdmNDU4OWRhNTI1MmIwMDRlN2QyYzI4NzYKIEF1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KIERhdGU6CVR1ZSBKdWwgMTAgMDA6MDE6MjggMjAwNyArMDIwMApAQCAtNTcsNiArMTkwNywyMDEgQEAKIAogICAgIFNpZ25lZC1vZmYtYnk6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CiAKK2NvbW1pdCBjMzUxN2Y5MTlkMGY2MTY1MGNmMzAyN2ZkNGZhZjBmNjMxMTQyZjZjCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTg6MTA6MDggMjAwNyAtMDUwMAorCisgICAgY29tbW9uLyogbm9uLWNtZCo6IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIENPTkZJR19DT01NQU5EUworCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGZkOWJjYWEzNWJlNjRmZTQxYTQyMjNmZGI2ZWNkYmFkNTI0NzBiMzkKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxODowNTozOSAyMDA3IC0wNTAwCisKKyAgICBjb21tb24vY21kX1twLXhdKjogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGM3NmZlNDc0MjVhZmM3ZDVkNjcwZmYwNTM5ODIzYzg1ZDY1ZDljNDIKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxODowMjoyMyAyMDA3IC0wNTAwCisKKyAgICBjb21tb24vY21kX1tpLW5dKjogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGJhYTI2ZGI0MTEzNjc5YjgwOTcwZmY0NDdkOTFjYzEwMjE3NzQyYTYKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxNzo1MTozOSAyMDA3IC0wNTAwCisKKyAgICBjb21tb24vY21kX1thZl0qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYWYwNzVlZTk2ZTUyZGRhN2I2YmNhNmM5Mzc1ODhhZWFhZWM1ZjJjZAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDE3OjAyOjAxIDIwMDcgLTA1MDAKKworICAgIENsZWFyIHVwIGNvbmZ1c2lvbiBvdmVyIHRoZSBDTURfUE9TVCBhbmQgUE9TVF9ESUFHIG1lc3MuCisKKyAgICBGb3Igc29tZSByZWFzb24sIENPTkZJR19QT1NUIHBlcm1lYXRlZCBhcyBDT05GSUdfQ01EX1BPU1RfRElBRworICAgIHdoZW4gaXQgcmVhbGx5IG1lYW5zIGp1c3QgQ09ORklHX0NNRF9ESUFHLglUaGVyZSBpcyBubyBDTURfUE9TVC4KKyAgICBDbGVhciB0aGlzIG1lc3MgdXAgc29tZS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBiMzYzMTQ4NzEwNWE1N2FiN2NiYWRmYzI2ZWZiYWY5Njc2Mjc1MDE4CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTU6NDU6MDggMjAwNyAtMDUwMAorCisgICAgUmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhlIG9sZCBjbWRfY29uZmRlZnMuaCBpbmNsdWRlIGZpbGUuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYTIyZDRkYTk1ZTIwMDQ5YjRkYWExYzJhMDIyZjYxZThhNzJmMmZiNgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDE1OjQyOjU5IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogQ2F0Y2ggc29tZSBDT05GSUdfQ01EXyogY29udmVyc2lvbiBzdHJhZ2dsZXJzLgorCisgICAgVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gbHdtb241LmggYm9hcmQgY29uZmlnIGZpbGUuCisgICAgRml4IENPTkZJR19DTURfKiB0eXBvIGJyYWluZGFtYWdlIGluIG9tYXAxNTEwaW5uLmgKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBhNTU2MjkwMTY2MWJkNDI4ZjdlNWZlYjMzM2Y3OTYzNzJjYjgxMDE5CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTU6MzE6NTcgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIFtUVVZXWllaXSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGZlN2Y3ODJkNWI4YzY0YTAxOTVjNjhjMzFhMGExMWQ0ZjY0MTM1NWUKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxNTowMjo0NCAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgUyogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGU5YTBmOGYxNWMxMWYzMzc5NjdhYTA2MDBhZDZlOGFmMzMwMzdmNTAKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxNToxMjo0MCAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgUiogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDEyYWE5ZmQyM2Q3MjRiZDZhYjg4ZTFiYWEwZGIzNTEzM2EyNzMwM2YKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxNDo1NTowNyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgUSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGFjZjAyNjk3Nzk0MjJmM2UxNDdkMmRkZmI0OTljOWY2ZmYxMGFkNWUKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxNDo0OTo0NCAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgUCogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGUxOGExMDYxYTg2MzBjYjY3OTk1ZmRmOTlhZmQzZmI1MGQxYjE4N2QKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxNDoyMTo0MyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgW05PXSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDgzNTNlMTM5YmZhZDkwNTljNTRmNWIyNDIxZjFhMzA5MGUxNWEyZTIKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxNDoxNDoxNyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgTSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDM0OGYyNThmMjQyNTM0MzNlNGEyMzAyYTBiYmNlYjY3NDBhNjcyNDYKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxMzo0NjoxOCAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgW0lKS0xdKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNmM0ZjRkYTliZmM5Zjk0MDNmNTRmY2U2NzhlZDAzNjRiN2M4NmE2YQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDEwOjA5OjM1IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBIKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNjBhMDg3NmI1MTA2YjM0MjIwZTQ1OWMyMDhiYmY2NDgwNzMzMDZjMAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU2F0IEp1bCA3IDIxOjA0OjI2IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBGKiBhbmQgRyogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGRjYWE3MTU2MjgyNmEyNDY2ZTg5NGM4NjhkMTMyNTA5ZGNkYTg0NDQKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVNhdCBKdWwgNyAyMDo1NjowNSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgRSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDNjMzIyN2YzYzczNzUwMjMxMWIyNWI3MjA4NDU3MzkwMWNiYmYxN2QKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVNhdCBKdWwgNyAyMDo0MDo0MyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgRCogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDQ5Y2Y3ZThlZTdlZjk0M2ZkZmU4NjZjZTI4NDEwYjBiZmJmNmEyNmMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVRodSBKdWwgNSAxOTo1MjozNSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgQyogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGRlOGIyYTZlMzMyOThkY2RiMTBiZGRhNDhkYjI1ZTUzYzMwODllYmEKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVRodSBKdWwgNSAxOTozMjowNyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgQiogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDQ5OGZmOWEyMjg0ODViZDRiOWYyM2QwNjZiYWRhMjY4ZjlhZGQxZGQKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVRodSBKdWwgNSAxOToxMzo1MiAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgQSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2luY2UgQURTODYwLmggaW5jbHVkZXMgImJvYXJkL2ZhZHMvZmFkcy5oIiB3aXRoIHJhbWlmaWNhdGlvbnMKKyAgICBvbiB0aGUgQ09ORklHX0NPTU1BTkQgdHJlYXRtZW50LCBpdCB0b28gaGFzIHRvIGJlIGFkanVzdGVkIHRvCisgICAgZXhjbHVkZSBhbHJlYWR5IGNvbmZpZ3VyZWQgY29tbWFuZHMgaW4gdGhpcyBzYW1lIGNvbW1pdC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA2YjBhMTc0YTFlNmY1NWUxZjVhMWZiYjIyM2NkYWQ3NjQ1YTQ2NDZlCitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CUZyaSBKdWwgNiAwOTo0NTo0NyAyMDA3ICswMjAwCisKKyAgICBGaXggcHJvYmxlbSB3aXRoIGdldC9zZXRkY3IgY29tbWFuZHMgaW50cm9kdWNlZCBieSBjZmcgcGF0Y2hlcworCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCiBjb21taXQgZjExNTJmOGMyOGRiNGEyMjA4N2MyMWM2MThhM2Y3YmFhNDhlOWE0ZgogQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgogRGF0ZToJRnJpIEp1bCA2IDAyOjUwOjE5IDIwMDcgKzAyMDAKQEAgLTY1LDYgKzIxMTAsMjIwIEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgogCitjb21taXQgZTRkYmUxYjIxNWY1YzZjNDYyZTc2OTA5ZDI0MGJkOTY0NzJiODRkZQorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJVGh1IEp1bCA1IDE3OjU2OjI3IDIwMDcgKzAyMDAKKworICAgIEZpeGluZyBzb21lIHR5cG9zIGV0Yy4gaW50cm9kdWNlZCBtYWlubHkgYnkgY2ZnIHBhdGNoZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgYjZiNDY4NDU0NjgwOWY4OWM4YmFjNzI4NjNjYTQ5YjVmZDhhYzBjZAorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJVGh1IEp1bCA1IDExOjEyOjE2IDIwMDcgKzAyMDAKKworICAgIE1pbm9yIGNvZGluZyBzdHlsZSBjbGVhbnVwLiBVcGRhdGUgQ0hBTkdFTE9HLgorCitjb21taXQgZGNhM2IzZDZkNjM5NmI2N2U1ZTg0YWY1MzQ1MjE2NDkyM2M3MzQ0MworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMzOjQ2IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBbdi16XSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDZjMThlYjk4MDRiNTI1ZjNlNGYzYmIzZDAxNGRkNjlhMjAwZDlmYTcKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMzozOCAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgdCogYW5kIHUqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA0NmRhMWU5NmI3ZGIxNGY0ZmNkMmM5MjU0NGU3YzA4NjIwMjRiYzc2CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzM6MzAgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIHMqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA5MGNjM2ViNmQyYmU4NTZkOWRkZDgxNDM2ZGU5Y2YzNDNiYzZiNWM4CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzM6MjMgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIHEqIGFuZCByKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMjZhMzQ1NjBkNTZhOWRmNWJjMmFlMjM1MjVkOTIyOTczNjEzNDc1NworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMzOjE3IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBwKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYTVjYjIzMDkyYTdkMzE0OTBhMzNkNGVjODcxNDY4YjYzYmFiZmEzYworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMzOjEzIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBvKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgOTI5YTJiZmQxNDI3MzcwMDNhOGZjMzJlMWI4NmUxZjJjMTg1MDI1NworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMzOjA3IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBuKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNWRjMTFhNTExOTYwZDQ5MGY3ZjAxZmZkNzQ2ZWRmZTYyNzdmOTliMAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMzOjAxIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBtKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgOWJiYjFjMDgyMGMxZmJkMzgxMWFiNmVlNGJhMGY2YzZmNzZiMjdlNAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMyOjU3IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBsKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYmMyMzRjMTI5ZmEwNGZiOWZhMzM1MzA5MzBlNWNiYzYwODRjZDQ3YQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMyOjUxIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBqKiBhbmQgayogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDFkMmM2YmM0OTE5NjlmOGQ4ZmIzNGM4ZTMwZThiZWE3YTJhZjljMzEKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMjozMiAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgaSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDQ4ZDVkMTAyYTJmMmU2MTljOTIwNTBiOWFlZGJiNjk2ODkxODViYzAKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMjoyNSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgaCogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDcyZWIwZWZhZWQ3MDQ4YWZjYzYxZmM2ZjAwODVjNDkzOTRiNWRjMzYKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMjoxOSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgZyogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDFiZWMzZDMwMDJkM2JiYmFlNmYyNDY4YTBmNzM3NmRiMTEyMGQzM2UKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMjoxMCAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgZSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGFiOTk5YmExYjMxZWJlNzhkZDE2Mzc0Mzk0YTU1ZDdjNmU1YWE2ZTQKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMjowMyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgZCogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDM3ZTRmMjRiODdmYTI1NWFlNDU2ZDE5M2I3Y2QyM2MxOGRkMWQ1NmIKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMTo1NiAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgYyogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGJhMjM1MWY5ZDFlODQxYmQwMGVhNmRhZDFlM2MxNmQwMjU5YWQyNjQKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMTo0OSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgYiogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDBiMzYxYzkxNjYxN2FmZjc5ZTY0N2I0MGYwZTQzMzYxZTBiYmFjY2YKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMTo0MiAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgYSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGI3MzBjZGE4MmUzNjJkZjZhMjJmNGM1OWMwYTliOTdlODg1YjEwMTQKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMTozNSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIG1wYzV4eCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZDc5NGNmZWZlYWQ1ZmMxNzdjZjRmNDExNjRlODAzODJlOWM5NDg0YQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMxOjE1IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyA1MjAwIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBlZjBkZjUyYWI0OWVlYTRhMzBjMTUwODdmZDI3ZDU0YzFkOTQ2ZjJjCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzE6MDcgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiBTVHggYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDg2NmUzMDg5YmZjODI2YmI0ZGM3NDYzN2Y4YWFkODdhM2JhYjc5ZmMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMDo1OCAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHNiYyogYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDI2OTQ2OTBlMjg1YWNhYTM0OTIyZjU1ZjRiNWFlMDMwZGE2MGM1NWEKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMDo1MCAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIFRRTSBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMWNjNGM0NTgzMjk3NjViNThlNTg0YTE5ODIxZTc5NmIzYzEwZTk3NgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMwOjI4IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gODJ4eCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgOGVhNTQ5OWFmZGFiYTBhY2Y2MDkyM2RkOTkwMDFjMzk5ZDRhN2M4ZQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMwOjA2IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gODN4eCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCiBjb21taXQgYjQ0ODk2MjE1YTA5YzYwZmE0MGNhZTkwNmY3ZWQyMDdiYmMyYzQ5MgogQXV0aG9yOiBTZXJnZWkgUG9zZWxlbm92IDxzcG9zZWxlbm92QGVtY3JhZnQuY29tPgogRGF0ZToJVGh1IEp1bCA1IDA4OjE3OjM3IDIwMDcgKzAyMDAKQEAgLTczLDYgKzIzMzIsNDAgQEAKIAogICAgIFNpZ25lZC1vZmYtYnk6IFNlcmdlaSBQb3NlbGVub3YgPHNwb3NlbGVub3ZAZW1jcmFmdC5jb20+CiAKK2NvbW1pdCBiMjQ2MjlmYTM3NzIxNGQ2M2JiNDBkMTM2MGUzNTRiNmQzZTRhZjU2CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVuIDEzIDEzOjIzOjE1IDIwMDcgLTA1MDAKKworICAgIG1wYzg2eHg6IFJlbW92ZSBvbGQgQ0ZHX0NNRF8qIHJlZmVyZW5jZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNDYxNzVkOTc2NGRhMTI5YmI0ZmQzNDFjZDI1NTRkYzdkNTVmNWIyYQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1biAxMyAxMzoyMjo1NCAyMDA3IC0wNTAwCisKKyAgICBBZGQgTVBDODU2OE1EUyB0byBNQUtFQUxMIDg1eHggdGFyZ2V0LgorCisgICAgSXQgd2FzIG1pc3NpbmcgZnJvbSB0aGUgb3JpZ2luYWwgcG9ydCBzdWJtaXNzaW9uLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDI4MzVlNTE4Yzk2OWU1MTI0YmExMTc0ZWVmM2U4Mzc1ZTEyZmE3ZDUKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdW4gMTMgMTM6MjI6MDggMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiA4NXh4IGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA1NmIzMDRhYzIwOTE2ODk1MDYwODhhOWFlNjdmNjNmZDYzMDBjZjE2CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVuIDEzIDEzOjIxOjM3IDIwMDcgLTA1MDAKKworICAgIEZpeCAjaWYgdHlwbyBpbiBDT05GSUdfQ01EXyogY2hhbmdlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKIGNvbW1pdCBmNzgwYjgzMzE2ZDlhZjFmNjFkNzFjYzg4YjE5MTdiMzg3YjliOTk1CiBBdXRob3I6IE5pa2xhdXMgR2lnZXIgPG5pa2xhdXNnaWdlckBnbXguY2g+CiBEYXRlOglXZWQgSnVuIDI3IDE4OjExOjM4IDIwMDcgKzAyMDAKQEAgLTk1LDYgKzIzODgsNTQ4IEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CiAKK2NvbW1pdCA2ODEwYTM0Njc3ZGJjNDQ2MzM0ZjVlNDUxZjE2ODI0MjZkZDMzYjQ5CitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDoxNzoyOCAyMDA3IC0wNjAwCisKKyAgICBGaXggTWFrZWZpbGUgdG8gdXNlICQoTUtDT05GSUcpIG1hY3JvIGZvciBhbGwgYm9hcmQgcG9ydHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDkwYjFiMmQ2OWI5Mzk2ZmYyZjAxMTY1ZWJjMTZjOWE1OTRlYjU5MjYKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjE3OjI4IDIwMDcgLTA2MDAKKworICAgIEZpeCBNYWtlZmlsZSB0byB1c2UgJChNS0NPTkZJRykgbWFjcm8gZm9yIGFsbCBib2FyZCBwb3J0cworCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgMDU3MDA0ZjRhNDg2MzU1NGQ1NmNjNTYyNjhiZmE3YzdkOTczOGUyNworQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzQ6NDkgMjAwNyAtMDYwMAorCisgICAgQ29ycmVjdCBmaXh1cCByZWxvY2F0aW9uIGZvciBtcGM4M3h4CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCA1YWY2MWIyZjRiODM4YTA1Zjc5YmUyNzRmM2U1YTY2ZWRkMmQ5Yzk2CitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozNDo0NCAyMDA3IC0wNjAwCisKKyAgICBDb3JyZWN0IGZpeHVwIHJlbG9jYXRpb24gZm9yIG1wYzgyNjAKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IGYzYTUyZmUwNTkyMzkzNWRiODY5ODVkYWY5NDM4ZTJmNzBhYzM5YWEKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjM0OjM5IDIwMDcgLTA2MDAKKworICAgIENvcnJlY3QgZml4dXAgcmVsb2NhdGlvbiBmb3IgbXBjODI0eAorCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgYTg1ZGQyNTRjMDU3N2ZjYTEzNjI3YzQ2ZTkzZmMyYWQ0YzRmMWYwMAorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzQ6MzQgMjAwNyAtMDYwMAorCisgICAgQ29ycmVjdCBmaXh1cCByZWxvY2F0aW9uIGZvciBtcGM4MjIwCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCA2Zjc1NzZiMjBlY2YwZDA0MGMzYWMzYjAzMmI1Y2JjODYwZTM4YTkwCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozNDoyOSAyMDA3IC0wNjAwCisKKyAgICBDb3JyZWN0IGZpeHVwIHJlbG9jYXRpb24gZm9yIE1QQzV4eHgKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDM2NDljZDk5YmE4MTViNjYwMTg2ODczNTc2NTYwMmYwMGVmMzY5MmIKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjM0OjI0IDIwMDcgLTA2MDAKKworICAgIENvcnJlY3QgcmVsb2NhdGlvbiBmaXh1cCBmb3IgbXBjNXh4CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCBmODJiM2I2MzA0YjYyMGVmN2UyOGJmYWExZWE4ODdhMmFkMmZhMzI1CitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozNDoxOSAyMDA3IC0wNjAwCisKKyAgICBEb24ndCBzZXQgZ2QtPnJlbG9jX29mZiBpZiByZWxvY2F0aW9uIG9mIC5maXh1cCB3b3JrcyBjb3JyZWN0bHkKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IGUxYTYxNDRjMzJkYzdkZTczYmNkZDMzOTk1ZGUwMTQ4Y2JkMGJkMjgKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjM0OjE0IDIwMDcgLTA2MDAKKworICAgIFJlbW92ZSBvYnNvbGV0ZSBtcGM4M3h4IGxpbmtlciBzY3JpcHRzCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCAxN2UzMmZjMzkwOGJmNzA4OWQzZjE2ZmM4MmExYzNhZTY3NGRkNjViCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozNDowOSAyMDA3IC0wNjAwCisKKyAgICBDb25zb2xpZGF0ZSBtcGM4MjYwIGxpbmtlciBzY3JpcHRzCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCBhZjdkMzhiMzkzNjkwZDdlZWFmNDE4YWM4NWExZTgzMWE1MGQ1ZmQwCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozNDowNCAyMDA3IC0wNjAwCisKKyAgICBSZW1vdmUgb2Jzb2xldGUgbXBjODI0eCBsaW5rZXIgc2NyaXB0cworCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgZjk0YTNhZWNlYmM0MGNhMDkzOWM3ZDY2ZDAxMDAwOWNmNTFiZTllMgorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzM6NTkgMjAwNyAtMDYwMAorCisgICAgUmVtb3ZlIG9ic29sZXRlIG1wYzgyNHggbGlua2VyIHNjcmlwdHMgKDMgb2YgNCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IGE3MWMwODRmM2FjN2ZlZGYxNDQ1MzdkYjJiMmRhNDczMjMwNjg4MzMKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjUzIDIwMDcgLTA2MDAKKworICAgIFJlbW92ZSBvYnNvbGV0ZSBtcGM4MjR4IGxpbmtlciBzY3JpcHRzICgyIG9mIDQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCBmNjcwYTE1NDY4ZDEzNjUyNDFkNDAwMjJiOTQwOGUxMDA0MTgxZjVlCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozMzo0OCAyMDA3IC0wNjAwCisKKyAgICBSZW1vdmUgb2Jzb2xldGUgbXBjODI0eCBsaW5rZXIgc2NyaXB0cyAoMSBvZiA0KQorCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgMDk1NTViZDQ1YTA0YzBlNTRmMTcyNTI4ZDIxYmMxODg5NjU1MGQyOAorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzM6NDMgMjAwNyAtMDYwMAorCisgICAgUmVtb3ZlIG9ic29sZXRlIG1wYzgyMjAgbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDVlZmI5OTJmMDQ2ZTUxMjI1YzkzZDUyZjgwZmVjYmU0MzNhYmQ3ODkKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjM4IDIwMDcgLTA2MDAKKworICAgIFJlbW92ZSBvYnNvbGV0ZSBtcGM1eHh4IGxpbmtlciBzY3JpcHRzICgzIG9mIDMpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCAwN2MxM2RmZWY2NWIzMTY0N2U2OWQ4YjYxZGFhMWVlYzU5OGFkZDFhCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozMzozMyAyMDA3IC0wNjAwCisKKyAgICBSZW1vdmUgb2Jzb2xldGUgbXBjNXh4eCBsaW5rZXIgc2NyaXB0cyAoMiBvZiAzKQorCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgYjRmNjc1MTNhNjI0Y2U4NTg2NmM2NmM1NzViZDJkOWQ3OTc3ZDdmMAorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzM6MjggMjAwNyAtMDYwMAorCisgICAgUmVtb3ZlIG9ic29sZXRlIG1wYzV4eHggbGlua2VyIHNjcmlwdHMgKDEgb2YgMykKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IGI3ZDhlMDVmODY3NTI0OWI1ZjIwOGFhNzNiYWJlZWQzODRhNDUxOWQKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjIzIDIwMDcgLTA2MDAKKworICAgIFJlbW92ZSBvYnNvbGV0ZSBtcGM1eHggbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDQxNmEwYjZkNDBmNmViYTNhMmZjNTQ3MjUzYzE2YmRhMjhkOTIyZjcKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjE4IDIwMDcgLTA2MDAKKworICAgIENvbnNvbGlkYXRlIG1wYzgzeHggbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDVmYzU5MTc1YjkyODgzZWQ1ZDI2NjZhMDRlNmJjNDllNzBhNGEzNjUKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjEzIDIwMDcgLTA2MDAKKworICAgIENvbnNvbGlkYXRlIG1wYzgyNjAgbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDczN2Y5ZWIwMmQ3MzM1ZGYyYjNlNGQ3YTRkMzM0ODc4NGQxZGEyMDcKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjA4IDIwMDcgLTA2MDAKKworICAgIENvbnNvbGlkYXRlIG1wYzgyNHggbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDljNzU3Yjc4OWE1OWE4NTVkYjU3YjQ0OGRkODI1MzI5YzRlOWM0YTAKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjAzIDIwMDcgLTA2MDAKKworICAgIENvbnNvbGlkYXRlIG1wYzgyMjAgbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IGQxODFjOWExNWNkNDE4NjNmZTI0ODQwZDE3ODQ4NDI5ZjI3ZDNjOGMKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMyOjU4IDIwMDcgLTA2MDAKKworICAgIENvbnNvbGlkYXRlIG1wYzV4eHggbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDI4N2FjOTI0YWRiNzI5MWJlYmU1MDg2NjUyYTM2MmEzMGFiMjhiMTMKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMyOjUzIDIwMDcgLTA2MDAKKworICAgIENvbnNvbGlkYXRlIG1wYzV4eCBsaW5rZXIgc2NyaXB0cworCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgNTJiODcwNGQwMjQ1ZTU4OWY4NmQ0NjJlOWVjMjVhZWI3ZWNiYmJkZAorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJV2VkIEp1bCA0IDAwOjQzOjUzIDIwMDcgKzAyMDAKKworICAgIEZpeCBhIGZldyBmaWxlIHBlcm1pc3Npb24gcHJvYmxlbXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgNzhlMGNmMmRlN2JlN2YxZWFlZWI2MjJlYjYxZmQ1MGU0ZDVlMjA1YworQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJV2VkIEp1bCA0IDAwOjM4OjM4IDIwMDcgKzAyMDAKKworICAgIE1pbm9yIGNvZGluZyBzdHlsZSBjbGVhbnVwLiBSZWJ1aWxkIENIQU5HRUxPRyBmaWxlLgorCitjb21taXQgMmY5YzE5ZTQ5NmFjYjZiYjUwZDkyOTllMWFhYjM3NzYyNWQ0OGMzOAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMzo0NCAyMDA3IC0wNTAwCisKKyAgICBjb25maWdzLyBtcGM4Nnh4OiBSZXdyaXRlIGNvbW1hbmQgbGluZSBvcHRpb25zIHVzaW5nIG5ldyBDT05GSUdfQ01ELSogc3R5bGUuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNjAyYWQzYjMzZDljZWVmODNkYmFiNDZiZTY4NjQ2ZDY0NWQ2MzdlZQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMzozOSAyMDA3IC0wNTAwCisKKyAgICBSRUFETUU6IFJld3JpdGUgY29tbWFuZCBsaW5lIGNvbmZpZyB0byB1c2UgQ09ORklHX0NNRF8qIG5hbWVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDcyYTA3NGNlYzY4ZTViYWQ2MGQ2MzIwNmMwNTA5NzRlMDhhZmQ4MDQKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTEgMTk6MDM6MzQgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS8gbm9uLWNvbmZpZzogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA1ZmNmNTQzZTBiNjYyOGM3NmZmNDg3MDViMWIwNTY2YmZkMTE1MDdiCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAzOjI4IDIwMDcgLTA1MDAKKworICAgIHRvb2xzLyA6IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgOTEwN2ViZTBkMzUyNDIwODk1YWI2OWI3MTU2OTdiZGViYzhjYWY1MAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMzoyMyAyMDA3IC0wNTAwCisKKyAgICBib2FyZC9bay16XSo6IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNWUzNzgwMDNkNTkyZWE4MjhlYzY5ZDZkZWZjZDRkZTc5MDk2ZGQ1YworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMzoxOSAyMDA3IC0wNTAwCisKKyAgICBib2FyZC9bTWEtaV0qOiBBdWdtZW50IENPTkZJR19DT01NQU5EUyB0ZXN0cyB3aXRoIGRlZmluZWQoQ09ORklHX0NNRF8qKS4KKworICAgIFRoaXMgaXMgYSBjb21wYXRpYmlsaXR5IHN0ZXAgdGhhdCBhbGxvd3MgYm90aCB0aGUgb2xkZXIgZm9ybQorICAgIGFuZCB0aGUgbmV3IGZvcm0gdG8gY28tZXhpc3QgZm9yIGEgd2hpbGUgdW50aWwgdGhlIG9sZGVyIGNhbgorICAgIGJlIHJlbW92ZWQgZW50aXJlbHkuCisKKyAgICBBbGwgdHJhbnNmb3JtYXRpb25zIGFyZSBvZiB0aGUgZm9ybToKKyAgICBCZWZvcmU6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpCisgICAgQWZ0ZXI6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9BVVRPU0NSSVBUKQorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDczNzE4NDExNGVjOWM5ZTBhYjk0ZDY3MTM1MzYxMjYwNzNiZDI0NzIKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTEgMTk6MDM6MTUgMjAwNyAtMDUwMAorCisgICAgY3B1LyBub24tbXBjKjogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBmNDgwNzBmZTVmZTQ0MGRmYjVlZTUyNjhjOTIwZGU3MGU0OGVhMzI3CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAzOjA4IDIwMDcgLTA1MDAKKworICAgIGNwdS9tcGMqLyA6IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMGM1MDVkYjBhMGRjMWY2NzBiMTNjZTNiNGQzZmJmMWVjNWIzY2JkMgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMzowMyAyMDA3IC0wNTAwCisKKyAgICBsaWJfKi86IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNzNmMDMyMDIxZWM1ZjEzY2RhOGZhYTRlMzRiNmRlODA5NjBlYjg2ZgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMjo1OCAyMDA3IC0wNTAwCisKKyAgICBsaWJfcHBjLzogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA5OGI3OTAwM2MyMWMyNTc4MjA2MDAzMjU2ZGU0ZTc4MWQ2YjM2Y2E4CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAyOjUzIDIwMDcgLTA1MDAKKworICAgIHJ0Yy86IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNmUyMTE1YWNiNmE4OTJkNTNhNjg4MWJmMjUzYWU0MWQzZGYzOTE1NgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMjo0OSAyMDA3IC0wNTAwCisKKyAgICBuZXQvOiBBdWdtZW50IENPTkZJR19DT01NQU5EUyB0ZXN0cyB3aXRoIGRlZmluZWQoQ09ORklHX0NNRF8qKS4KKworICAgIFRoaXMgaXMgYSBjb21wYXRpYmlsaXR5IHN0ZXAgdGhhdCBhbGxvd3MgYm90aCB0aGUgb2xkZXIgZm9ybQorICAgIGFuZCB0aGUgbmV3IGZvcm0gdG8gY28tZXhpc3QgZm9yIGEgd2hpbGUgdW50aWwgdGhlIG9sZGVyIGNhbgorICAgIGJlIHJlbW92ZWQgZW50aXJlbHkuCisKKyAgICBBbGwgdHJhbnNmb3JtYXRpb25zIGFyZSBvZiB0aGUgZm9ybToKKyAgICBCZWZvcmU6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpCisgICAgQWZ0ZXI6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9BVVRPU0NSSVBUKQorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDQ1Y2RiOWI3MmM5NDY1NWM3MzA4YjQ2NGEyNjY2MDU3YzBiMjg2ZTAKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTEgMTk6MDI6MzQgMjAwNyAtMDUwMAorCisgICAgZGlzay86IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNGUxMDlhZTk4Mjk0YTVjYTdmZjg0OGI3NjUyYzdiZmQ0MDIzYTk0YQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMjoyMCAyMDA3IC0wNTAwCisKKyAgICBmcy86IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZDViZTQzZGU5M2ZmOTA1YzQ2NWU1MDlkNDVhMzE2NGVmNDhkMjZlNworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMjoxMCAyMDA3IC0wNTAwCisKKyAgICBkcml2ZXJzLzogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBiNDUzOTYwZDRmZGI4N2IzOTcwZDk2MTE5YjkwZGYyZWQwMjRmYzRhCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAyOjA1IDIwMDcgLTA1MDAKKworICAgIGNvbW1vbi8gbm9uLWNtZDogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA2NWM0NTBiNDdhNjI2NTlkNTIyY2ZhOGY0ZmExZTRlNWM2MGRjY2QwCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAxOjU0IDIwMDcgLTA1MDAKKworICAgIGNvbW1vbi9jbWRfW2ktel0qIDogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBhNzZhZGM4MTQyYzFkOTU2Mzg1YTEwOWUwYjcwZjkzMTllZGU0ZDY2CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAxOjQzIDIwMDcgLTA1MDAKKworICAgIGNvbW1vbi9jbWRfW2EtZl0qIDogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBlYzYzYjEwYjYxZmQ2ODIzOGQ0YzE1YzFjZDA0YzBiMzgyMjhlMmMxCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAxOjM0IDIwMDcgLTA1MDAKKworICAgIEludHJvZHVjZSBpbml0aWFsIHZlcnNpb25zIG9mIG5ldyBDb21tYW5kIENvbmZpZyBmaWxlcy4KKworICAgIERlcml2ZSB0aHJlZSBuZXcgZmlsZXMgZnJvbSBjbWRfY29uZmRlZnMuaDoKKwljb25maWdfYm9vdHAuaCAtIEhhcyBCT09UUCByZWxhdGVkIGNvbmZpZyBvcHRpb25zLCBub3QgY29tbWFuZHMKKwljb25maWdfY21kX2FsbC5oIC0gSGFzIGEgQ09ORklHX0NNRF8qIGRlZmluaXRpb24gZm9yIGV2ZXJ5IGNvbW1hbmQKKwljb25maWdfY21kX2RlZmF1bHQuaCAtIEhhcyBhIENPTkZJR19DTURfKiBkZWZpbml0aW9uIGZvciBkZWZhdWx0IGNtZHMuCisKKyAgICBGb3Igbm93LCBpbmNsdWRlICJjb25maWdfYm9vdHAuaCIgZm9yIGNvbXBhdGFiaWxpdHkgdW50aWwgYWxsCisgICAgdXNlcnMgb2YgaXQgZGlyZWN0bHkgaW5jbHVkZSBpdCBwcm9wZXJseS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKIGNvbW1pdCAxZjJhMDU4OTg2NTg5MDBkYzU3MTc3NjFlMjdhYmYyMDUyZTY3ZTEzCiBBdXRob3I6IE11c2h0YXEgS2hhbiA8bXVzaHRhcWtfOTIxQHlhaG9vLmNvLmluPgogRGF0ZToJU2F0IEp1biAzMCAxODo1MDo0OCAyMDA3ICswMjAwCkBAIC0zNzgsNiArMzIxMywxNCBAQAogCiAgICAgU2lnbmVkLW9mZi1ieTogRGV0bGV2IFp1bmRlbCA8ZHp1QGRlbnguZGU+CiAKK2NvbW1pdCA5Yjc0NjRhMmM4ODYxNGUxMDYxZjUwOWM0ODkzMGEzZDI0MGQxYTM1CitBdXRob3I6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVuIDExIDE1OjE0OjI0IDIwMDcgKzAyMDAKKworICAgIFVTQjogVGhpcyBwYXRjaCBmaXggcmVhZGwgaW4gb2hjaSBzd2FwIHJlZyBhY2Nlc3MuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorCiBjb21taXQgOGY4NDE2ZmFkYTlmYWY5NGI5YTkyZjIxZmU2MDAwNjQzY2I1MjFkNQogQXV0aG9yOiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgogRGF0ZToJRnJpIEp1biA4IDE0OjUyOjIyIDIwMDcgKzAyMDAKQEAgLTQwNSw2ICszMjQ4LDI2IEBACiAgICAgU2lnbmVkLW9mZi1ieTogQmVub2l0IE1vbmluIDxibW9uaW5AYWRlbmVvLmV1PgogICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KIAorY29tbWl0IGY1MzllZGMwNzZjZmU1MmJmZjkxOWRkNTEyYmE4ZDdhZjBlMjIwOTIKK0F1dGhvcjogVmFkaW0gQmVuZGVidXJ5IDx2YmVuZGViQGdvb2dsZS5jb20+CitEYXRlOglUaHUgTWF5IDI0IDE1OjUyOjI1IDIwMDcgLTA3MDAKKworICAgIGNvc21ldGljIGNoYW5nZXMgdG8gYmNtNTcweCBkcml2ZXIKKworICAgIFRoaXMgaXMgYSBjb3NtZXRpYyBvbmx5IGNoYW5nZXMgc3VibWlzc2lvbi4KKyAgICBJdCBhZmZlY3RzIGZpbGVzIHJlbGV2YW50IHRvIGJjbTU3MHggZHJpdmVyLgorICAgIHRoZSBjb21tYW5kcyB1c2VkIHRvIGdlbmVyYXRlIHRoaXMgY2hhbmdlIHdhcworCisgICAgY2QgZHJpdmVycworICAgIExpbmRlbnQgLXBjcyAtbDgwICBiY201NzB4LmMgICBiY201NzB4X2xtLmggICBiY201NzB4X21tLmgJdGlnb24zLmMgIHRpZ29uMy5oCisKKyAgICBUaGUgQk1XIHRhcmdldCAodGhlIG9ubHkgb25lIHVzaW5nIHRoaXMgY2hpcCBzbyBmYXIpIGJ1aWxkcyBjbGVhbmx5LCB0aGUKKyAgICBgYmVmb3JlIGFuZCBhZnRlcicgZ2VuZXJhdGVkIG9iamVjdCBmaWxlcyBmb3IgZHJpdmVycy9iY201NzB4LmMgYW5kCisgICAgZHJpdmVycy90aWdvbjMubyBhcmUgaWRlbnRpY2FsIGFzIHJlcG9ydGVkIGJ5IG9iamR1bXAgLWQKKworICAgIFNpZ25lZC1vZmYtYnk6IFZhZGltIEJlbmRlYnVyeSA8dmJlbmRlYkBnb29nbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEJlbiBXYXJyZW4gPGJ3YXJyZW5AcXN0cmVhbXMuY29tPgorCiBjb21taXQgNzI1NjcxY2NkMmNkMDRjOWViYzUwYzllNWE5NGRkOGNiYWRlNjZiNwogQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgogRGF0ZToJV2VkIEp1biA2IDE2OjI2OjU2IDIwMDcgKzAyMDAKQEAgLTQxMyw2ICszMjc2LDMwIEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgogCitjb21taXQgMTlkNzYzYzM1ZTBiNTU2OGVhZjBiOGFkYmY3YTY4Y2NmZTdmYTI0MworQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJV2VkIEp1biA2IDExOjQ5OjQ0IDIwMDcgKzAyMDAKKworICAgIFRSQUIsIFVTQjogdXBkYXRlIHRyYWIgYm9hcmQgY29uZmlndXJhdGlvbiBmb3IgdXNlIG9mIGdlbmVyaWMgb2hjaSBkcml2ZXIKKworY29tbWl0IGRhY2U0NWFjZDFjMTM1N2RhYTkzMjIwOTlkMDdjOWE5ZTA4YjAwMjQKK0F1dGhvcjogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KK0RhdGU6CVdlZCBKdW4gNiAxMTo0OTo0MyAyMDA3ICswMjAwCisKKyAgICBVU0I6IG9oY2kgZml4ZXMgYW5kIGNsZWFudXAgZm9yIHBwYzR4eCBhbmQgeW9zZW1pdGUgYm9hcmQuCisKK2NvbW1pdCA3MjY1NzU3MGI2MTYzNWM3NGZhMGMzZjBlOWU3ZDA2NzFhOWQwOGRmCitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglXZWQgSnVuIDYgMTE6NDk6NDMgMjAwNyArMDIwMAorCisgICAgVVNCOiBvaGNpIGZpeGVzIGFuZCBjbGVhbnVwIGZvciBtcGM1eHh4IGFuZCBJY2VDdWJlIGJvYXJkIGNvbmZpZworCitjb21taXQgZmM0M2JlNDc4ZjJhYTM3Y2UzOGFjZDg1MzU1MDM4ODY2ZTQxNjJhZgorQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJV2VkIEp1biA2IDExOjQ5OjM1IDIwMDcgKzAyMDAKKworICAgIFVTQi9PSENJOiBlbmRpYW5uZXNzIGNsZWFudXAgaW4gdGhlIGdlbmVyaWMgb2hjaSBkcml2ZXIKKwogY29tbWl0IGM0NDBiZmU2ZDZkOTJkNjY0NzhhN2U4NDQwMmIzMWY0ODQxMzYxN2IKIEF1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgogRGF0ZToJV2VkIEp1biA2IDExOjQyOjEzIDIwMDcgKzAyMDAKQEAgLTQzMyw2ICszMzIwLDczIEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CiAKK2NvbW1pdCAxODEzNTEyNWY5MDk5NDhiODVkMWQ2ODgxYWI0YWMwZWZiNGExYzU4CitBdXRob3I6IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGxpbnV4Lml0PgorRGF0ZToJV2VkIEp1biA2IDEwOjA4OjE0IDIwMDcgKzAyMDAKKworICAgIEZpbGVzIGluY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3tiaWcsbGl0dGxlfV9lbmRpYW4uaCBkZWZpbmUKKyAgICBfX0JJR19FTkRJQU4gYW5kIF9fTElUVExFX0VORElBTi4KKworICAgIFNpZ25lZC1vZmYtYnk6IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGxpbnV4Lml0PgorCitjb21taXQgYTgxZDFjMGI4NWIxM2U5ZDQ1ZjJkODdkZTk2YTUxYTZlMGVmMGY4MgorQXV0aG9yOiBaaGFuZyBXZWkgPHdlaS56aGFuZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJV2VkIEp1biA2IDEwOjA4OjE0IDIwMDcgKzAyMDAKKworICAgIEFkZCBVU0IgUENJLU9IQ0ksIFVTQiBrZXlib2FyZCBhbmQgZXZlbnQgcG9sbCBzdXBwb3J0IHRvIHRoZQorICAgIE1QQzg2NDFIUENOIGJvYXJkIGNvbmZpZyBmaWxlLgorCisgICAgU2lnbmVkLW9mZi1ieTogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDRkYWUxNGNlOGZiZGYzODAwMTdkYzU0ZjE3MjIxOGU3ZDJhY2M4ODkKK0F1dGhvcjogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBKdW4gNiAxMDowODoxNCAyMDA3ICswMjAwCisKKyAgICBVU0IgUENJLU9IQ0ksIGludGVycnVwdCBwaXBlIGFuZCB1c2IgZXZlbnQgcG9sbCBzdXBwb3J0CisKKyAgICBUaGlzIHBhdGNoIGFkZGVkIFVTQiBQQ0ktT0hDSSBjaGlwcyBzdXBwb3J0LCBpbnRlcnJ1cHQgcGlwZSBzdXBwb3J0CisgICAgYW5kIHVzYiBldmVudCBwb2xsIHN1cHBvcnQuIEZvciBzdXBwb3J0aW5nIHRoZSBVU0IgaW50ZXJydXB0IHBpcGUsIHRoZQorICAgIGdsb2JlIHVyYl9wcml2IGlzIG1vdmVkIHRvIHB1cmIgaW4gZWQgc3RydWN0LiBOb3csIHdlIGNhbiBwcm9jZXNzCisgICAgc2V2ZXJhbCB1cmJzIGF0IG9uZSB0aW1lLiBUaGUgaW50ZXJydXB0IHBpcGUgc3VwcG9ydCBjb2RlcyBhcmUgcG9ydGVkCisgICAgZnJvbSBMaW51eCBrZXJuZWwgMi40LgorCisgICAgU2lnbmVkLW9mZi1ieTogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGZkY2ZhYTFiMDIyNjhiMjg5OWUzNzRiMzVhZGY5MzZjOTExYTQ3ZWIKK0F1dGhvcjogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBKdW4gNiAxMDowODoxMyAyMDA3ICswMjAwCisKKyAgICBVU0IgZXZlbnQgcG9sbCBzdXBwb3J0CisKKyAgICBUaGlzIHBhdGNoIGFkZHMgVVNCIGV2ZW50IHBvbGwgc3VwcG9ydCwgd2hpY2ggY291bGQgYmUgdXNlZCBpbiB1c2JrYmQKKyAgICBhbmQgb3RoZXIgdXNiIGRldmljZXMgZHJpdmVyIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBpbnRlcnJ1cHQKKyAgICBwcm9jZXNzaW5nIGlzIHN1cHBvcnRlZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFpoYW5nIFdlaSA8d2VpLnpoYW5nQGZyZWVzY2FsZS5jb20KKworY29tbWl0IDlhMWQwMGZhNDdjMWUwNWUzZmRiNjBiMzMyMTNhZjRlMThkNGMxOGUKK0F1dGhvcjogUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+CitEYXRlOglXZWQgSnVuIDYgMTA6MDg6MTIgMjAwNyArMDIwMAorCisgICAgSVNQMTE2eDogZGVsYXkgZm9yIGNyYXBweSBVU0Iga2V5cworCisgICAgVXNpbmcgc29tZSAodmVyeSkgc2xvdyBVU0Iga2V5cyBjYXVzZSB0aGUgVVNCIGhvc3QgY29udHJvbGxlciBidWZmZXJzCisgICAgYXJlIG5vdCByZWFkeSB0byBiZSByZWFkIGJ5IHRoZSBDUFUgc28gd2UgbmVlZCBhbiBleHRyYSBkZWxheSBiZWZvcmUKKyAgICByZWFkaW5nIHRoZSBVU0Igc3RvcmFnZSBkYXRhLgorCisgICAgU2lnbmVkLW9mZi1ieTogUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+CisKK2NvbW1pdCAwOTQ0NDE0MzY3MGM5YzIyNDNjYjdhYmE5ZjcwYjM3MTNkMzNiZWQxCitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglXZWQgSnVuIDYgMTA6MDg6MTIgMjAwNyArMDIwMAorCisgICAgQ2hhbmdlIGR1cGxpY2F0ZSB1c2JfY3B1X2luaXRfZmFpbCB0byB1c2JfYm9hcmRfaW5pdF9mYWlsCisKKyAgICBUaGFua3MgdG8gTGlldyBUc2kgQ2h1bmcgPFRzaS1jaHVuZy5MaWV3QGZyZWVzY2FsZS5jb20+IGZvciBwb2ludGluZworICAgIHRoaXMgb3V0LgorCisgICAgU2lnbmVkLW9mZi1ieTogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KKwogY29tbWl0IDMyOTIyY2RjNDcwZmRmZDM5YmVhMGMxYzRmNTgyZDNmYjM0MDQyMWUKIEF1dGhvcjogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KIERhdGU6CVR1ZSBKdW4gNSAxMjozMDo1MiAyMDA3IC0wNTAwCkBAIC00NjQsNiArMzQxOCwzNSBAQAogICAgIFNpZ25lZC1vZmYtYnk6IEJlbm9pdCBNb25pbiA8Ym1vbmluQGFkZW5lby5ldT4KICAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CiAKK2NvbW1pdCA1YjEzMTNmYjI3NThmZmNlOGI2MjQ0NTdmNzc3ZDhjYzY3MDk2MDhkCitBdXRob3I6IE5pa2l0YSBWLiBZb3VzaGNoZW5rbyA8eW91c2hAZGViaWFuLm9yZz4KK0RhdGU6CVdlZCBNYXkgMjMgMTI6NDU6MTkgMjAwNyArMDQwMAorCisgICAgZml4IGNvbXBpbGF0aW9uIHByb2JsZW0gZm9yIG1wYzgzNDlpdHggQ0ZHX1JBTUJPT1QKKworICAgIEN1cnJlbnQgaW5jbHVkZS9jb25maWdzL01QQzgzNDlJVFguaCBkb2VzIGNvbnRhaW4gc29tZSBzdXBwb3J0IGZvciBidWlsZGluZworICAgIGltYWdlIHRoYXQgd2lsbCBiZSBzdGFydGVkIGZyb20gbWVtb3J5ICh3aXRob3V0IHB1dHRpbmcgaW4gaW50byBmbGFzaCkuCisgICAgSXQgY291bGQgYmUgdHJpZ2dlcmVkIGJ5IGJ1aWxkaW5nIHdpdGggVEVYVF9CQVNFIHNldCB0byBhIGxvdyB2YWx1ZS4KKworICAgIEhvd2V2ZXIsIHRoaXMgc3VwcG9ydCBpcyBpbmNvbXBsZXRlOiB1c2luZyBvZiBsb3cgVEVYVF9CQVNFIGNhdXNlcworICAgIGRlZmluaW5nIGNvbmZpZ3VyYXRpb24gbWFjcm9zIGluIGluY29uc2lzdGVudCB3YXksIHdoaWNoIGxhdGVyIGxlYWRzCisgICAgdG8gY29tcGlsYXRpb24gZXJyb3JzLiBJbiBwYXJ0aWN1bGFyLiBmbGFzaCBzdXBwb3J0IGlzIGJlaW5nIGRpc2FibGVkLAorICAgIGJ1dCB0aGVuIGZsYXNoIHN0cnVjdHVyZXMgZ2V0IHJlZmVyZW5jZWQuCisKKyAgICBUaGlzIHBhdGNoIGZpeGVzIHRoaXMsIG1ha2luZyBpdCBwb3NzaWJsZSB0byBidWlsZCB3aXRoIGxvdyBURVhUX0JBU0UuCisKKyAgICBTaWduZWQtT2ZmLUJ5OiBOaWtpdGEgWW91c2hjaGVua28gPHlvdXNoQGRlYmlhbi5vcmc+CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgOGEzNjRmMDk3MGRlNDk5NDlkNjM1ZTYwYWNjZjQ2M2M2NDQzZWY4YworQXV0aG9yOiBOaWtpdGEgVi4gWW91c2hjaGVua28gPHlvdXNoQGRlYmlhbi5vcmc+CitEYXRlOglXZWQgTWF5IDIzIDEyOjQ1OjI1IDIwMDcgKzA0MDAKKworICAgIGFkZCBtaXNzaW5nICdjb25zb2xlJyB2YXIgdG8gZGVmYXVsdCBtcGM4MzQ5aXR4IGNvbmZpZworCisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKwogY29tbWl0IDE4ZDE1NmViMzdjOTBmYWRjOGVjN2E4MWEzYjg5MTc2MTYxZjg1YjcKIEF1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgogRGF0ZToJRnJpIEp1biAxIDE2OjE4OjE3IDIwMDcgKzAyMDAKQEAgLTExNTEsNiArNDEzNCwxMiBAQAogCiAgICAgbmV3OiBhZGQgd3JpdGluZyB0byBtc3IgcmVnaXN0ZXIKIAorY29tbWl0IDNhNjE5ZGQ3YmVkMDNlOGI0ZDIyYTM5MTFmOTBmZDEyYWY1Mzc2YzIKK0F1dGhvcjogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KK0RhdGU6CU1vbiBNYXkgNyAxNjo0Mzo1NiAyMDA3ICswMjAwCisKKyAgICBGaXggYW4gYW5jaWVudCBDSEFOR0VMT0cgY29uZmxpY3QKKwogY29tbWl0IGFjNGNkNTlkNTljOWJmM2Y4OWNiN2EzNDRhYmY4MTg0ZDY3OGY1NjIKIEF1dGhvcjogVGltdXIgVGFiaSA8dGltdXJAZnJlZXNjYWxlLmNvbT4KIERhdGU6CVNhdCBNYXkgNSAwODoxMjozMCAyMDA3ICswMjAwCkBAIC0xMzcwLDYgKzQzNTksMzAgQEAKIAogICAgIFNpZ25lZC1vZmYtYnkgRGFuIE1hbGVrLCA8ZGFuQGVtYmVkZGVkYWxsZXkuY29tPgogCitjb21taXQgZjIxMzRmOGU5ZWIwMDZiZGNkNzI5ZTg5ZjMwOWMwN2IyZmE0NTE4MAorQXV0aG9yOiBIYWF2YXJkIFNraW5uZW1vZW4gPGhza2lubmVtb2VuQGF0bWVsLmNvbT4KK0RhdGU6CVdlZCBNYXkgMiAxMzozMTo1MyAyMDA3ICswMjAwCisKKyAgICBtYWNiOiBEb24ndCByZXN0YXJ0IGF1dG9uZWdvdGlhdGlvbiBpZiB3ZSBhbHJlYWR5IGhhdmUgbGluaworCisgICAgUmV3b3JrIG1hY2JfcGh5X2luaXQgc28gdGhhdCBpdCBkb2Vzbid0IGF0dGVtcHQgdG8gcmUtbmVnb3RpYXRlIGlmIHRoZQorICAgIGxpbmsgaXMgYWxyZWFkeSB1cC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEhhYXZhcmQgU2tpbm5lbW9lbiA8aHNraW5uZW1vZW5AYXRtZWwuY29tPgorCitjb21taXQgMDRmY2I1ZDM4YmM5MDc3OWNkOWE3MTBkNjA3MDIwNzU5ODZmMGUyOQorQXV0aG9yOiBIYWF2YXJkIFNraW5uZW1vZW4gPGhza2lubmVtb2VuQGF0bWVsLmNvbT4KK0RhdGU6CVdlZCBNYXkgMiAxMzoyMjozOCAyMDA3ICswMjAwCisKKyAgICBtYWNiOiBJbnRyb2R1Y2UgYSBmZXcgYmFycmllcnMgd2hlbiBkZWFsaW5nIHdpdGggRE1BIGRlc2NyaXB0b3JzCisKKyAgICBUaGVyZSB3ZXJlIGEgZmV3IHRoZW9yZXRpY2FsIHBvc3NpYmlsaXRpZXMgdGhhdCB0aGUgY29tcGlsZXIgbWlnaHQKKyAgICBvcHRpbWl6ZSBhd2F5IERNQSBkZXNjcmlwdG9yIHJlYWRzIGFuZC9vciB3cml0ZXMgYW5kIHRodXMgY2F1c2UKKyAgICBzeW5jaHJvbml6YXRpb24gcHJvYmxlbXMgd2l0aCB0aGUgaGFyZHdhcmUuIEluc2VydCBiYXJyaWVycyB3aGVyZQorICAgIHdlIGRlcGVuZCBvbiByZWFkcy93cml0ZXMgYWN0dWFsbHkgaGl0dGluZyBtZW1vcnkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBIYWF2YXJkIFNraW5uZW1vZW4gPGhza2lubmVtb2VuQGF0bWVsLmNvbT4KKwogY29tbWl0IGZmYTYyMWEwZDEyYTFjY2Q4MWM5MzZjNTY3Zjg5MTdhMjEzNzg3YTgKIEF1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgogRGF0ZToJU2F0IEZlYiAyNCAwMTowODoxMyAyMDA3IC0wNjAwCkBAIC0xODQ3LDYgKzQ4NjAsMTcgQEAKIAogICAgIFNpZ25lZC1vZmYtYnk6IE1pa2UgRnJ5c2luZ2VyIDx2YXBpZXJAZ2VudG9vLm9yZz4KIAorY29tbWl0IGQ5OGMwODg1YWQ2MTdmY2NmMjFlN2MyNmVmOGNiNzI4ZmJmYjI0NTkKK0F1dGhvcjogUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAZW5uZWVubmUuY29tPgorRGF0ZToJTW9uIEFwciAyMyAxMzoxMDo1MiAyMDA3ICswMjAwCisKKyAgICBVU0I6IChBbm90aGVyKSBkZWxheSBmb3IgY3JhcHB5IFVTQiBrZXlzLgorCisgICAgU29tZSBVU0Iga2V5cyBhcmUgc2xvdyBpbiBnaXZpbmcgYmFjayBhbiBhbnN3ZXIgd2hlbiB0aGUgUm9vdCBIVUIKKyAgICBlbmFibGVzIHBvd2VyIGxpbmVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+CisKIGNvbW1pdCAzMjNiZmE4ZjQzNmRjM2JjNTcxODdjOWIxNDg4YmMzMTQ2ZmYxNTIyCiBBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KIERhdGU6CU1vbiBBcHIgMjMgMTI6MDA6MjIgMjAwNyArMDIwMApAQCAtMjUxMiw2ICs1NTM2LDIyIEBACiAKICAgICBNaW5vciBjbGVhbnVwLgogCitjb21taXQgODIyYWYzNTFhZDJiYWJjN2Q5OTAzMzM2MWE1ZmNhY2QzMGY2YmM3OAorQXV0aG9yOiBSb2RvbGZvIEdpb21ldHRpIDxnaW9tZXR0aUBlbm5lZW5uZS5jb20+CitEYXRlOglUdWUgQXByIDMgMTQ6Mjc6MTggMjAwNyArMDIwMAorCisgICAgU3VwcG9ydCBmb3IgdGhlIFBoaWxpcHMgSVNQMTE2eCBIQ0QgKEhvc3QgQ29udHJvbGxlciBEcml2ZXIpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBSb2RvbGZvIEdpb21ldHRpIDxnaW9tZXR0aUBlbm5lZW5uZS5jb20+CisKK2NvbW1pdCBlZGY1ODUxYmU2YzE3YzAzMWQ0ZjcxZGQ1YjBhMTIwNDBiN2M1MGM4CitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglUdWUgQXByIDMgMTQ6Mjc6MDggMjAwNyArMDIwMAorCisgICAgVVNCOiBjbGVhbnVwIG1vbmFoYW5zIHVzYiBzdXBwb3J0LiBSZW1vdmUgZGVhZCBjb2RlLgorCisgICAgU2lnbmVkLW9mZi1ieTogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KKwogY29tbWl0IGE2NWM1NzY4ZTU1Mzc1MzBiZDE3ODBhZjNkM2ZkZGMzMTEzYTE2M2MKIEF1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgogRGF0ZToJTW9uIEFwciAyIDEwOjA5OjMwIDIwMDcgKzAyMDAKQEAgLTI2ODEsNiArNTcyMSwyMyBAQAogCiAgICAgUEFUQ0g6IFJlc29sdmUgR1BMIGxpY2Vuc2UgcHJvYmxlbQogCitjb21taXQgYWUwMGJiNGIyOTQ0ZGM2NGE0ODVlZDcyYTE5NzU0YjExYWY3YzIyMworQXV0aG9yOiBSb2RvbGZvIEdpb21ldHRpIDxnaW9tZXR0aUBlbm5lZW5uZS5jb20+CitEYXRlOglNb24gTWFyIDI2IDEyOjAzOjM2IDIwMDcgKzAyMDAKKworICAgIFBYQTogcHhhMjd4IFVTQiBPSENJIHN1cHBvcnQKKworICAgIFNpZ25lZC1vZmYtYnk6IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGxpbnV4Lml0PgorCitjb21taXQgYWU3OWY2MDY3N2MyMDgzMjY1MzU2NDdkY2JkNWMzZWM0MGRiY2IwYgorQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJTW9uIE1hciAyNiAxMToyMTowNSAyMDA3ICswMjAwCisKKyAgICBVU0I6IHJlbW92ZSB0aGUgUzNDMjRYMF9tZXJnZSAjZGVmaW5lLCB3aGljaCB3YXMgaW50cm9kdWNlZCB3aGlsZQorICAgIG1lcmdpbmcgT0hDSSBkcml2ZXJzLgorCisgICAgU2lnbmVkLW9mZi1ieTogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KKwogY29tbWl0IDE3OTgwNDk1MjJmNTk0MDEzYWVhMjk0NTdkNDY3OTQyOThjNmFlMTUKIEF1dGhvcjogTWljaGFsIFNpbWVrIDxyb290QG1vbnN0ci5ldT4KIERhdGU6CU1vbiBNYXIgMjYgMDE6Mzk6MDcgMjAwNyArMDIwMApAQCAtNDgwNiw2ICs3ODYzLDM0IEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CiAKK2NvbW1pdCA1OGI0ODU3NzY2OThjM2Q3MWVjNWEyMTVlMzkyMTIzYjRjMTVhZmEzCitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglNb24gTm92IDI3IDExOjUxOjIxIDIwMDYgKzAxMDAKKworICAgIEFkZCBhIHNtYWxsIFJFQURNRSB3aXRoIGluZm9ybWF0aW9uIG9uIHRoZSBnZW5lcmljIG9oY2kgZHJpdmVyLgorCitjb21taXQgYWUzYjc3MGU0ZWFlOGU5OGI2ZTllMjk2NjJlMThjNDdmZGYwMTcxZgorQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJTW9uIE5vdiAyNyAxMTo0Njo0NiAyMDA2ICswMTAwCisKKyAgICBGaXggc29tZSBlbmRpYW5uZXNzIGlzc3VlcyByZWxhdGVkIHRvIHRoZSBnZW5lcmljIG9oY2kgZHJpdmVyCisKK2NvbW1pdCA3YjU5YjNjN2E4Y2UyZTRiNTY3YWJmOTljMWNkNjY3YmYzNWI5NDE4CitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglNb24gTm92IDI3IDExOjQ0OjU4IDIwMDYgKzAxMDAKKworICAgIEludHJvZHVjZWQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uIENPTkZJR19VU0JfT0hDSV9ORVcgaW4gb3JkZXIgdG8gYmUgYWJsZQorICAgIHRvIGNob29zZSBiZXR3ZWVuIHRoZSBvbGQgYW5kIHRoZSBnZW5lcmljIE9IQ0kgZHJpdmVycy4KKworY29tbWl0IDUzZTMzNmU5ZmZjNTEwMzViZGM0ZTU4Njc2MzFiMzM3ODc2MWI0ZGYKK0F1dGhvcjogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KK0RhdGU6CU1vbiBOb3YgMjcgMTE6NDM6MDkgMjAwNiArMDEwMAorCisgICAgTW9kaWZpZWQgdGhlIG1wYzV4eHggYW5kIHRoZSBwcGM0eHggY3B1IHRvIHVzZSB0aGUgZ2VuZXJpYyBPSENJIGRyaXZlcgorICAgIGFuZCBhZGFwdGVkIGJvYXJkIGNvbmZpZ3MgVFFNNTIwMCBhbmQgeW9zZW1pdGUgYWNjb3JkaW5nbHkuIFRoaXMgY29tbWl0CisgICAgYWxzbyBtYWtlcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm9vdCBodWIgcG9ydHMgY29uZmlndXJhYmxlCisgICAgKENGR19VU0JfT0hDSV9NQVhfUk9PVF9QT1JUUykuCisKIGNvbW1pdCA3OGQ2MjBlYmI1ODcxZDI1MjI3MGRlZGZhZDYwYzY1Njg5OTNiNzgwCiBBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGF0bGFzLmRlbnguZGU+CiBEYXRlOglUaHUgTm92IDIzIDIyOjU4OjU4IDIwMDYgKzAxMDAKQEAgLTY1NjMsNiArOTY0OCwxMiBAQAogCiAgICAgU2lnbmVkLW9mZi1ieTogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KIAorY29tbWl0IDk5ZDcwZTNhNDdhZmZiOWJhZTA0MWEyY2FlY2U3Y2Q1MTZlMjEzYjMKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAcG9sbHV4LmRlbnguZGU+CitEYXRlOglNb24gSnVuIDI2IDExOjA2OjAwIDIwMDYgKzAyMDAKKworICAgIE1vcmUgY29kZSBjbGVhbnVwCisKIGNvbW1pdCA2ODQ2MjNjZTkyYzVmZDMyZTdkYjJkNmUwMTY5NDVhNjdjNWZmYWJhCiBBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CiBEYXRlOglUaHUgSnVuIDIyIDA4OjUxOjQ2IDIwMDYgLTA1MDAKQEAgLTY1ODcsNiArOTY3OCwyOCBAQAogCiAgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KIAorY29tbWl0IDM4NmVkYTAyMjQ3MzM5NGFkOGYzNmI4NmYyYmRjOWI0Y2I4MTYyOTEKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAcG9sbHV4LmRlbnguZGU+CitEYXRlOglXZWQgSnVuIDE0IDE4OjE0OjU2IDIwMDYgKzAyMDAKKworICAgIENvZGUgY2xlYW51cAorCitjb21taXQgMTZjOGQ1ZTc2YWUwZjc4ZjM5YTYwNjA4NTc0YWRmZTBmZWI5Y2M3MAorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBwb2xsdXguZGVueC5kZT4KK0RhdGU6CVdlZCBKdW4gMTQgMTc6NDU6NTMgMjAwNiArMDIwMAorCisgICAgVmFyaW91cyBVU0IgcmVsYXRlZCBwYXRjaGVzCisgICAgLSBBZGQgc3VwcG9ydCBmb3IgbXBjOHh4IFVTQiBkZXZpY2UuCisgICAgLSBBZGQgc3VwcG9ydCBmb3IgQ29tbW9uIERldmljZSBDbGFzcyAtIEFic3RyYWN0IENvbnRyb2wgTW9kZWwgVVNCIGNvbnNvbGUuCisgICAgLSBBZGQgc3VwcG9ydCBmb3IgZmxvdyBjb250cm9sIGluIFVTQiBzbGF2ZSBkZXZpY2VzLgorICAgIC0gQWRkIHN1cHBvcnQgZm9yIHN3aXRjaGluZyBiZXR3ZWVuIGdzZXJpYWwgYW5kIGNkY19hY20gdXNpbmcgZW52aXJvbm1lbnQuCisgICAgLSBNaW5vciBjaGFuZ2VzIHRvIHVzYmRjb3JlX29tYXAxNTEwLmMgdXNiZGNvcmVfb21hcDE1MTAuaAorICAgIC0gVXBkYXRlIHVzYmNvcmUgc2xpZ2h0bHkgdG8gZWFzZSBob3N0IGVudW1lcmF0aW9uLgorICAgIC0gRml4IG5vbi1wb3J0YWJsZSBlbmRpYW4gcHJvYmxlbXMgaW4gdXNiZGNvcmUgYW5kIHVzYmRjb3JlX2VwMC4KKyAgICAtIEFkZCBBZGRlclVTQl9jb25maWcgYXMgYSBkZWZjb25maWcgdG8gZW5hYmxlIHVzYWdlIG9mIHRoZSBVU0IgY29uc29sZQorICAgICAgYnkgZGVmYXVsdCB3aXRoIHRoZSBBZGRlcjg3eCBVLUJvb3QgcG9ydC4KKyAgICBQYXRjaGVzIGJ5IEJyeWFuIE8nRG9ub2dodWUgPGJvZG9ub2dodWVAY29kZWhlcm1pdC5pZT4sIDI5IE1heSAyMDA2CisKIGNvbW1pdCA4ZWNjOTcxNjE4ZjU2MDI5YWQ5OWQzNTE2ZjhiMjk3YTZlZDU4OTcxCiBBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CiBEYXRlOglXZWQgSnVuIDcgMTA6NTM6NTUgMjAwNiAtMDUwMApAQCAtNjY2NSw2ICs5Nzc4LDEyIEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgogCitjb21taXQgZGRmODNhMmZjZWYxYTY3MGM0NWZjNTg1MTE5ZGNjMWZlMDYyYzRhOQorQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJVHVlIE1heSAzMCAxNjo1NjoxNCAyMDA2ICswMjAwCisKKyAgICBTdXBwb3J0IGdlbmVyaWMgT0hDSSBzdXBwb3J0IGZvciB0aGUgczNjMjR4MCBjcHUuCisKIGNvbW1pdCAzOGNlZTEyZGNmY2MyNTczNzFjOTAxYzdlMTNlNThlY2FiMGEzNWQ4CiBBdXRob3I6IEhhaXlpbmcgV2FuZyA8SGFpeWluZy5XYW5nQGZyZWVzY2FsZS5jb20+CiBEYXRlOglUdWUgTWF5IDMwIDA5OjEwOjMyIDIwMDYgLTA1MDAKQEAgLTY3MTQsNiArOTgzMywyOSBAQAogCiAgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KIAorY29tbWl0IDMwMWYxYWEzODRkMGVkY2FlNmEyMmZkOWFkYjkzM2FkNzE2OTVlY2MKK0F1dGhvcjogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KK0RhdGU6CVR1ZSBNYXkgMjMgMTM6Mzg6MzUgMjAwNiArMDIwMAorCisgICAgQ2hhbmdlZCB0aGUgbXAydXNiIChhdDkxcm05MjAwKSBib2FyZCB0byB1c2UgdGhlIGdlbmVyaWMgT0hDSSBkcml2ZXIuIFNvbWUKKyAgICBmaXhlcyB0byB0aGUgbGF0dGVyLgorCitjb21taXQgMjRlMzc2NDVlNzM3OGIyMGZhOGYyMGUyOTk2YzhmYjhlOTBjNzBjOQorQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJVHVlIE1heSAyMyAxMDozMzoxMSAyMDA2ICswMjAwCisKKyAgICBNb3JlIGNsZWFudXAgZm9yIHRoZSBkZWx0YSBib2FyZCBhbmQgdGhlIGdlbmVyaWMgdXNiX29oY2kgZHJpdmVyLiBBZGRlZAorICAgIENGR19VU0JfQk9BUkRfSU5JVCBhbmQgQ0ZHX1VTQl9DUFVfSU5JVCBmb3IgZW5hYmxpbmcgYm9hcmQgYW5kIGNwdSBzcGVjaWZpYworICAgIGluaXRpYWxpemF0aW9uIGFuZCBjbGVhbnVwIGhvb2tzIHJlc3BlY3RpdmVseS4KKworY29tbWl0IDNlMzI2ZWNlOWViYTgxODRmNWQ0OGFhNGZiODc3NjBhOGY2ZjBmMTAKK0F1dGhvcjogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KK0RhdGU6CU1vbiBNYXkgMjIgMTY6MzM6NTQgMjAwNiArMDIwMAorCisgICAgVGhpcyBwYXRjaCBhZGRzIFVTQiBzdG9yYWdlIHN1cHBvcnQgZm9yIHRoZSBkZWx0YSBib2FyZC4gVGhpcyBpcyB0aGUgZmlyc3QKKyAgICBib2FyZCB0byBtYWtlIHVzZSBvZiBhIGdlbmVyaWMgT0hDSSBkcml2ZXIsIHRoYXQgY2FsbHMgaG9va3MgZm9yIGJvYXJkCisgICAgZGVwZW5kYW50IGluaXRpYWxpemF0aW9uLgorCiBjb21taXQgMTRlMzcwODFmZjNjYWM3ZWJlNmU5MzgzNjUyMzQyOTg1M2I2YjI5MgogQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgogRGF0ZToJRnJpIE1heSAxOSAxMzoyODozOSAyMDA2IC0wNTAwCmRpZmYgLS1naXQgYS9DSEFOR0VMT0ctYmVmb3JlLVUtQm9vdC0xLjEuNSBiL0NIQU5HRUxPRy1iZWZvcmUtVS1Cb290LTEuMS41CmluZGV4IDcyN2E3YjYuLjI0MDQxNDggMTAwNjQ0Ci0tLSBhL0NIQU5HRUxPRy1iZWZvcmUtVS1Cb290LTEuMS41CisrKyBiL0NIQU5HRUxPRy1iZWZvcmUtVS1Cb290LTEuMS41CkBAIC00MzgsNiArNDM4LDIwIEBACiAKICogQ2FsbCBzZXJpYWxfaW5pdGlhbGl6ZSgpIGJlZm9yZSBmaXJzdCBkZWJ1ZygpIGlzIHVzZWQuCiAKKyogQ29kZSBjbGVhbnVwCisKKyogVmFyaW91cyBVU0IgcmVsYXRlZCBwYXRjaGVzCisgIC0gQWRkIHN1cHBvcnQgZm9yIG1wYzh4eCBVU0IgZGV2aWNlLgorICAtIEFkZCBzdXBwb3J0IGZvciBDb21tb24gRGV2aWNlIENsYXNzIC0gQWJzdHJhY3QgQ29udHJvbCBNb2RlbCBVU0IgY29uc29sZS4KKyAgLSBBZGQgc3VwcG9ydCBmb3IgZmxvdyBjb250cm9sIGluIFVTQiBzbGF2ZSBkZXZpY2VzLgorICAtIEFkZCBzdXBwb3J0IGZvciBzd2l0Y2hpbmcgYmV0d2VlbiBnc2VyaWFsIGFuZCBjZGNfYWNtIHVzaW5nIGVudmlyb25tZW50LgorICAtIE1pbm9yIGNoYW5nZXMgdG8gdXNiZGNvcmVfb21hcDE1MTAuYyB1c2JkY29yZV9vbWFwMTUxMC5oCisgIC0gVXBkYXRlIHVzYmNvcmUgc2xpZ2h0bHkgdG8gZWFzZSBob3N0IGVudW1lcmF0aW9uLgorICAtIEZpeCBub24tcG9ydGFibGUgZW5kaWFuIHByb2JsZW1zIGluIHVzYmRjb3JlIGFuZCB1c2JkY29yZV9lcDAuCisgIC0gQWRkIEFkZGVyVVNCX2NvbmZpZyBhcyBhIGRlZmNvbmZpZyB0byBlbmFibGUgdXNhZ2Ugb2YgdGhlIFVTQiBjb25zb2xlCisgICAgYnkgZGVmYXVsdCB3aXRoIHRoZSBBZGRlcjg3eCBVLUJvb3QgcG9ydC4KKyAgUGF0Y2ggYnkgQnJ5YW4gTydEb25vZ2h1ZSA8Ym9kb25vZ2h1ZUBjb2RlaGVybWl0LmllPiwgMjkgTWF5IDIwMDYKKwogKiBDbGVhbnVwIHRyYWIgYm9hcmQgZm9yIEdDQy00LngKIAogKiBWb2ljZUJsdWUgdXBkYXRlOiB1c2UgbmV3IE1URCBmbGFzaCBwYXJ0aXRpb25pbmcgbWV0aG9kcywgdXNlIG1vcmUKZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDFhZjljN2YuLmIwODMwNWIgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtMjU3LDYgKzI1NywxMCBAQAogRDogU3VwcG9ydCBmb3IgQWRkZXItSUkgTVBDODUyVCBldmFsdWF0aW9uIGJvYXJkCiBXOiBodHRwOi8vd3d3LmZvcmNlY29tcHV0ZXJzLmNvbQogCitOOiBTZXJnZXkgS3VidXNoeW4KK0U6IGtzaUBrb2k4Lm5ldAorRDogU3VwcG9ydCBmb3IgdmFyaW91cyBUSSBEYVZpbmNpIGJhc2VkIGJvYXJkcy4KKwogTjogQmVybmhhcmQgS3VobgogRTogYmt1aG5AbWV0cm93ZXJrcy5jb20KIEQgU3VwcG9ydCBmb3IgQ29sZGZpcmUgQ1BVOyBTdXBwb3J0IGZvciBNb3Rvcm9sYSBNNTI3MkMzIGFuZCBNNTI4MkVWQiBib2FyZHMKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggZWVjNTBhOC4uZjgxMjQzMSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTE4NCw2ICsxODQsMTAgQEAKIAogCU1WUzEJCQlNUEM4MjMKIAorSm9lIEhhbW1hbiA8am9lLmhhbW1hbkBlbWJlZGRlZHNwZWNpYWx0aWVzLmNvbT4KKworCXNiYzg2NDFkCQlNUEM4NjQxRAorCiBLbGF1cyBIZXlkZWNrIDxoZXlkZWNrQGtpZWJhY2stcGV0ZXIuZGU+CiAKIAlLVVA0SwkJCU1QQzg1NQpAQCAtNDUxLDYgKzQ1NSwxMiBAQAogCiAJb21hcDE2MTBoMgkJQVJNOTI2RUpTCiAKK1NlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorCisJRFYtRVZNCQkJQVJNOTI2RUpTCisJU09OQVRBCQkJQVJNOTI2RUpTCisJU0NITU9PR0lFCQlBUk05MjZFSlMKKwogUHJha2FzaCBLdW1hciA8cHJha2FzaEBlbWJlZHguY29tPgogCiAJY2VyZjI1MAkJCXhzY2FsZQpkaWZmIC0tZ2l0IGEvTUFLRUFMTCBiL01BS0VBTEwKaW5kZXggOGQxODMwZi4uMTIxOWZiMyAxMDA3NTUKLS0tIGEvTUFLRUFMTAorKysgYi9NQUtFQUxMCkBAIC0yNiwxMTYgKzI2LDI4NSBAQAogIyMgTVBDNXh4IFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF81eHg9IglcCi0JY21pX21wYzV4eAkJCQkJCQlcCitMSVNUXzV4eD0iCQlcCisJY21pX21wYzV4eAlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIE1QQzV4eHggU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUXzV4eHg9IglcCi0JQkMzNDUwCQljbTFfcXAxCQljcGNpNTIwMAlFVkFMNTIwMAlcCi0JZm8zMDAJCWljZWN1YmVfNTEwMAlpY2VjdWJlXzUyMDAJbGl0ZTUyMDBiCVwKLQltY2MyMDAJCW1lY3A1MjAwCW1vdGlvbnBybwlvMmRudAkJXAotCXBmNTIwMAkJUE01MjAJCVRCNTIwMAkJVG90YWw1MTAwCVwKLQlUb3RhbDUyMDAJVG90YWw1MjAwX1JldjIJVFFNNTIwMAkJVFFNNTIwMF9CCVwKLQlUUU01MjAwUwl2MzhiCQkJCQkJXAorTElTVF81eHh4PSIJCVwKKwlCQzM0NTAJCVwKKwljbTUyMDAJCVwKKwljcGNpNTIwMAlcCisJRVZBTDUyMDAJXAorCWZvMzAwCQlcCisJaWNlY3ViZV81MTAwCVwKKwlpY2VjdWJlXzUyMDAJXAorCWxpdGU1MjAwYglcCisJbWNjMjAwCQlcCisJbWVjcDUyMDAJXAorCW1vdGlvbnBybwlcCisJbzJkbnQJCVwKKwlwZjUyMDAJCVwKKwlQTTUyMAkJXAorCVRCNTIwMAkJXAorCVRvdGFsNTEwMAlcCisJVG90YWw1MjAwCVwKKwlUb3RhbDUyMDBfUmV2MglcCisJVFFNNTIwMAkJXAorCVRRTTUyMDBfQglcCisJVFFNNTIwMFMJXAorCXYzOGIJCVwKKyIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgTVBDNTEyeCBTeXN0ZW1zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0xJU1RfNTEyeD0iCQlcCisJYWRzNTEyMQkJXAogIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBNUEM4eHggU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTElTVF84eHg9IglcCi0JQWRkZXI4N3gJR0VOSUVUVgkJTUJYODYwVAkJUjM2ME1QSQkJXAotCUFkZGVySUkJCUdUSAkJTUhQQwkJUkJDODIzCQlcCi0JQURTODYwCQloZXJtZXMJCU1QQzg2eEFEUwlybXUJCVwKLQlBTVg4NjAJCUlBRDIxMAkJTVBDODg1QURTCVJQWENsYXNzaWMJXAotCWMybW9uCQlJQ1U4NjJfMTAwTUh6CU1WUzEJCVJQWGxpdGUJCVwKLQlDQ00JCUlQODYwCQlORVRQSE9ORQlSUFhsaXRlX0RXCVwKLQljb2dlbnRfbXBjOHh4CUlWTUwyNAkJTkVUVEEJCVJSdmlzaW9uCVwKLQlFTFBUODYwCQlJVk1MMjRfMTI4CU5FVFRBMgkJU004NTAJCVwKLQlFUDg4eAkJSVZNTDI0XzI1NglORVRUQV9JU0ROCXNwYzE5MjAJCVwKLQlFU1RFRU0xOTJFCUlWTVM4CQlORVRWSUEJCVNQRDgyM1RTCVwKLQlFVFgwOTQJCUlWTVM4XzEyOAlORVRWSUFfVjIJc3ZtX3NjOHh4CVwKLQlGQURTODIzCQlJVk1TOF8yNTYJTlg4MjMJCVNYTkk4NTVUCVwKLQlGQURTODUwU0FSCUtVUDRLCQlwY3VfZQkJVE9QODYwCQlcCi0JRkFEUzg2MFQJS1VQNFgJCVFTODIzCQlUUU04MjNMCQlcCi0JRkxBR0FETQkJTEFOVEVDCQlRUzg1MAkJVFFNODIzTF9MQ0QJXAotCUZQUzg1MEwJCWx3bW9uCQlRUzg2MFQJCVRRTTg1MEwJCVwKLQlHRU44NjBUCQlNQlgJCXF1YW50dW0JCVRRTTg1NUwJCVwKLQlHRU44NjBUX1NDCQkJCQlUUU04NjBMCQlcCi0JCQkJCQkJVFFNODg1RAkJXAotCQkJCQkJCXVjMTAwCQlcCi0JCQkJCQkJdjM3CQlcCitMSVNUXzh4eD0iCQlcCisJQWRkZXI4N3gJXAorCUFkZGVySUkJCVwKKwlBRFM4NjAJCVwKKwlBTVg4NjAJCVwKKwljMm1vbgkJXAorCUNDTQkJXAorCWNvZ2VudF9tcGM4eHgJXAorCUVMUFQ4NjAJCVwKKwlFUDg4eAkJXAorCUVTVEVFTTE5MkUJXAorCUVUWDA5NAkJXAorCUZBRFM4MjMJCVwKKwlGQURTODUwU0FSCVwKKwlGQURTODYwVAlcCisJRkxBR0FETQkJXAorCUZQUzg1MEwJCVwKKwlHRU44NjBUCQlcCisJR0VOODYwVF9TQwlcCisJR0VOSUVUVgkJXAorCUdUSAkJXAorCWhlcm1lcwkJXAorCUlBRDIxMAkJXAorCUlDVTg2Ml8xMDBNSHoJXAorCUlQODYwCQlcCisJSVZNTDI0CQlcCisJSVZNTDI0XzEyOAlcCisJSVZNTDI0XzI1NglcCisJSVZNUzgJCVwKKwlJVk1TOF8xMjgJXAorCUlWTVM4XzI1NglcCisJS1VQNEsJCVwKKwlLVVA0WAkJXAorCUxBTlRFQwkJXAorCWx3bW9uCQlcCisJTUJYCQlcCisJTUJYODYwVAkJXAorCU1IUEMJCVwKKwlNUEM4NnhBRFMJXAorCU1QQzg4NUFEUwlcCisJTVZTMQkJXAorCU5FVFBIT05FCVwKKwlORVRUQQkJXAorCU5FVFRBMgkJXAorCU5FVFRBX0lTRE4JXAorCU5FVFZJQQkJXAorCU5FVFZJQV9WMglcCisJTlg4MjMJCVwKKwlwY3VfZQkJXAorCVFTODIzCQlcCisJUVM4NTAJCVwKKwlRUzg2MFQJCVwKKwlxdWFudHVtCQlcCisJUjM2ME1QSQkJXAorCVJCQzgyMwkJXAorCXJtdQkJXAorCVJQWENsYXNzaWMJXAorCVJQWGxpdGUJCVwKKwlSUFhsaXRlX0RXCVwKKwlSUnZpc2lvbglcCisJU004NTAJCVwKKwlzcGMxOTIwCQlcCisJU1BEODIzVFMJXAorCXN2bV9zYzh4eAlcCisJU1hOSTg1NVQJXAorCVRPUDg2MAkJXAorCVRRTTgyM0wJCVwKKwlUUU04MjNMX0xDRAlcCisJVFFNODUwTAkJXAorCVRRTTg1NUwJCVwKKwlUUU04NjBMCQlcCisJVFFNODg1RAkJXAorCXVjMTAwCQlcCisJdjM3CQlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIFBQQzR4eCBTeXN0ZW1zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1RfNHh4PSIJXAotCWFjYWRpYQkJYWNhZGlhX25hbmQJQURDSU9QCQlhbHByCQlcCi0JQVAxMDAwCQlBUjQwNQkJQVNINDA1CQliYW1ib28JCVwKLQliYW1ib29fbmFuZAlidWJpbmdhCQlDQU5CVAkJQ01TNzAwCQlcCi0JQ1BDSTJEUAkJQ1BDSTQwNQkJQ1BDSTQwNTIJQ1BDSTQwNUFCCVwKLQlDUENJNDA1RFQJQ1BDSTQ0MAkJQ1BDSUlTRVI0CUNSQVlMMQkJXAotCWNzYjI3MgkJY3NiNDcyCQlEQVNBX1NJTQlEUDQwNQkJXAotCURVNDA1CQllYm9ueQkJRVJJQwkJRVhCSVRHRU4JXAotCUcyMDAwCQlISDQwNQkJaGN1NCAgICAgICAgICAgIGhjdTUgICAgICAgICAgICBcCi0JSFVCNDA1ICAgICAgICAgIEpTRSAgICAgICAgICAgICBLQVJFRgkJa2F0bWFpCQlcCi0JbHVhbiAgICAgICAgICAgIGx3bW9uNSAgICAgICAgICBNRVRST0JPWAlNSVA0MDUJCVwKLQlNSVA0MDVUICAgICAgICAgTUwyICAgICAgICAgICAgIG1sMzAwCQlvY290ZWEJCVwKLQlPQ1JUQyAgICAgICAgICAgT1JTRyAgICAgICAgICAgIHAzcDQ0MAkJUENJNDA1CQlcCi0JcGNzNDQwZXAgICAgICAgIFBJUDQwNSAgICAgICAgICBQTFU0MDUJCVBNQzQwNQkJXAotCVBQQ2hhbWVsZW9uRVZCICBzYmM0MDUgICAgICAgICAgc2MzCQlzZXF1b2lhCQlcCi0Jc2VxdW9pYV9uYW5kCXRhaWh1CQl0YWlzaGFuICAgICAgICAgVk9INDA1CQlcCi0JVk9NNDA1CQlXN09MTUMgICAgICAgICAgVzdPTE1HICAgICAgICAgIHdhbG51dAkJXAotCVdVSDQwNQkJWFBFRElURTFLICAgICAgIHllbGxvd3N0b25lICAgICB5b3NlbWl0ZQlcCi0JeXVjY2EJCXpldXMJCQkJCQlcCitMSVNUXzR4eD0iCQlcCisJYWNhZGlhCQlcCisJYWNhZGlhX25hbmQJXAorCUFEQ0lPUAkJXAorCWFscHIJCVwKKwlBUDEwMDAJCVwKKwlBUjQwNQkJXAorCUFTSDQwNQkJXAorCWJhbWJvbwkJXAorCWJhbWJvb19uYW5kCVwKKwlidWJpbmdhCQlcCisJQ0FOQlQJCVwKKwlDTVM3MDAJCVwKKwlDUENJMkRQCQlcCisJQ1BDSTQwNQkJXAorCUNQQ0k0MDUyCVwKKwlDUENJNDA1QUIJXAorCUNQQ0k0MDVEVAlcCisJQ1BDSTQ0MAkJXAorCUNQQ0lJU0VSNAlcCisJQ1JBWUwxCQlcCisJY3NiMjcyCQlcCisJY3NiNDcyCQlcCisJREFTQV9TSU0JXAorCURQNDA1CQlcCisJRFU0MDUJCVwKKwllYm9ueQkJXAorCUVSSUMJCVwKKwlFWEJJVEdFTglcCisJRzIwMDAJCVwKKwloY3U0CQlcCisJaGN1NQkJXAorCUhINDA1CQlcCisJSFVCNDA1CQlcCisJSlNFCQlcCisJS0FSRUYJCVwKKwlrYXRtYWkJCVwKKwlsdWFuCQlcCisJbHdtb241CQlcCisJTUVUUk9CT1gJXAorCU1JUDQwNQkJXAorCU1JUDQwNVQJCVwKKwlNTDIJCVwKKwltbDMwMAkJXAorCW9jb3RlYQkJXAorCU9DUlRDCQlcCisJT1JTRwkJXAorCXAzcDQ0MAkJXAorCVBDSTQwNQkJXAorCXBjczQ0MGVwCVwKKwlQSVA0MDUJCVwKKwlQTFU0MDUJCVwKKwlQTUM0MDUJCVwKKwlQUENoYW1lbGVvbkVWQglcCisJc2JjNDA1CQlcCisJc2MzCQlcCisJc2VxdW9pYQkJXAorCXNlcXVvaWFfbmFuZAlcCisJdGFpaHUJCVwKKwl0YWlzaGFuCQlcCisJVk9INDA1CQlcCisJVk9NNDA1CQlcCisJVzdPTE1DCQlcCisJVzdPTE1HCQlcCisJd2FsbnV0CQlcCisJV1VINDA1CQlcCisJWFBFRElURTFLCVwKKwl5ZWxsb3dzdG9uZQlcCisJeW9zZW1pdGUJXAorCXl1Y2NhCQlcCisJemV1cwkJXAogIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBNUEM4MjIwIFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF84MjIwPSIJXAotCUFsYXNrYTgyMjAJWXVrb244MjIwCQkJCQlcCitMSVNUXzgyMjA9IgkJXAorCUFsYXNrYTgyMjAJXAorCVl1a29uODIyMAlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIE1QQzgyNHggU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUXzgyNHg9IglcCi0JQTMwMDAJCWJhcmNvCQlCTVcJCUNQQzQ1CQlcCi0JQ1U4MjQJCWRlYnJpcwkJZVhhbGlvbgkJSElEREVOX0RSQUdPTglcCi0JCQlNT1VTU0UJCU1VU0VOS0kJCU1WQkxVRQkJXAotCU9YQwkJUE42MgkJU2FuZHBvaW50ODI0MAlTYW5kcG9pbnQ4MjQ1CVwKLQlzYmM4MjQwCQlTTDgyNDUJCXV0eDgyNDUJCQkJXAorTElTVF84MjR4PSIJCVwKKwlBMzAwMAkJXAorCWJhcmNvCQlcCisJQk1XCQlcCisJQ1BDNDUJCVwKKwlDVTgyNAkJXAorCWRlYnJpcwkJXAorCWVYYWxpb24JCVwKKwlISURERU5fRFJBR09OCVwKKwlNT1VTU0UJCVwKKwlNVVNFTktJCQlcCisJTVZCTFVFCQlcCisJT1hDCQlcCisJUE42MgkJXAorCVNhbmRwb2ludDgyNDAJXAorCVNhbmRwb2ludDgyNDUJXAorCXNiYzgyNDAJCVwKKwlTTDgyNDUJCVwKKwl1dHg4MjQ1CQlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIE1QQzgyNjAgU3lzdGVtcyAoaW5jbHVkZXMgODI1MCwgODI1NSBldGMuKQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUXzgyNjA9IglcCi0JYXRjCQljb2dlbnRfbXBjODI2MAlDUFU4NgkJQ1BVODcJCVwKLQllcDgyNDgJCWVwODI2MAkJZXA4Mnh4bQkJZ3c4MjYwCQlcCi0JaHltb2QJCUlQSEFTRTQ1MzkJSVNQQU4JCU1QQzgyNjBBRFMJXAotCU1QQzgyNjZBRFMJTVBDODI3MkFEUwlQTTgyNgkJUE04MjgJCVwKLQlwcG1jODI2MAlSYXR0bGVyODI0OAlSUFhzdXBlcglyc2Rwcm90bwlcCi0Jc2Fjc25nCQlzYmM4MjYwCQlTQ00JCVRRTTgyNjBfQUMJXAotCVRRTTgyNjBfQUQJVFFNODI2MF9BRQlaUEMxOTAwCQkJCVwKK0xJU1RfODI2MD0iCQlcCisJYXRjCQlcCisJY29nZW50X21wYzgyNjAJXAorCUNQVTg2CQlcCisJQ1BVODcJCVwKKwllcDgyNDgJCVwKKwllcDgyNjAJCVwKKwllcDgyeHhtCQlcCisJZ3c4MjYwCQlcCisJaHltb2QJCVwKKwlJUEhBU0U0NTM5CVwKKwlJU1BBTgkJXAorCU1QQzgyNjBBRFMJXAorCU1QQzgyNjZBRFMJXAorCU1QQzgyNzJBRFMJXAorCVBNODI2CQlcCisJUE04MjgJCVwKKwlwcG1jODI2MAlcCisJUmF0dGxlcjgyNDgJXAorCVJQWHN1cGVyCVwKKwlyc2Rwcm90bwlcCisJc2Fjc25nCQlcCisJc2JjODI2MAkJXAorCVNDTQkJXAorCVRRTTgyNjBfQUMJXAorCVRRTTgyNjBfQUQJXAorCVRRTTgyNjBfQUUJXAorCVpQQzE5MDAJCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTVBDODN4eCBTeXN0ZW1zIChpbmNsdWRlcyA4MzQ5LCBldGMuKQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUXzgzeHg9IglcCi0JTVBDODMxM0VSREIJTVBDODMyWEVNRFMJTVBDODM0OUVNRFMJTVBDODM0OUlUWAlcCi0JTVBDODM0OUlUWEdQCU1QQzgzNjBFTURTCXNiYzgzNDkJCVRRTTgzNHgJCVwKK0xJU1RfODN4eD0iCQlcCisJTVBDODMxM0VSREJfMzMJXAorCU1QQzgzMTNFUkRCXzY2CVwKKwlNUEM4MzJYRU1EUwlcCisJTVBDODM0OUVNRFMJXAorCU1QQzgzNDlJVFgJXAorCU1QQzgzNDlJVFhHUAlcCisJTVBDODM2MEVNRFMJXAorCXNiYzgzNDkJCVwKKwlUUU04MzR4CQlcCiAiCiAKIApAQCAtMTQzLDEyMyArMzEyLDIyNyBAQAogIyMgTVBDODV4eCBTeXN0ZW1zIChpbmNsdWRlcyA4NTQwLCA4NTYwIGV0Yy4pCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1RfODV4eD0iCVwKLQlNUEM4NTQwQURTCU1QQzg1NDBFVkFMCU1QQzg1NDFDRFMJTVBDODU0NERTCVwKLQlNUEM4NTQ4Q0RTCU1QQzg1NTVDRFMJTVBDODU2MEFEUwlQTTg1NAkJXAotCVBNODU2CQlzYmM4NTQwCQlzYmM4NTYwCQlzdHhncDMJCVwKLQlzdHhzc2EJCVRRTTg1NDAJCVRRTTg1NDEJCVRRTTg1NTUJCVwKLQlUUU04NTYwCQkJCQkJCQlcCitMSVNUXzg1eHg9IgkJXAorCU1QQzg1NDBBRFMJXAorCU1QQzg1NDBFVkFMCVwKKwlNUEM4NTQxQ0RTCVwKKwlNUEM4NTQ0RFMJXAorCU1QQzg1NDhDRFMJXAorCU1QQzg1NTVDRFMJXAorCU1QQzg1NjBBRFMJXAorCU1QQzg1NjhNRFMJXAorCVBNODU0CQlcCisJUE04NTYJCVwKKwlzYmM4NTQwCQlcCisJc2JjODU2MAkJXAorCXN0eGdwMwkJXAorCXN0eHNzYQkJXAorCVRRTTg1NDAJCVwKKwlUUU04NTQxCQlcCisJVFFNODU1NQkJXAorCVRRTTg1NjAJCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTVBDODZ4eCBTeXN0ZW1zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1RfODZ4eD0iCVwKLSAgICBNUEM4NjQxSFBDTglcCitMSVNUXzg2eHg9IgkJXAorCU1QQzg2NDFIUENOCVwKKwlTQkM4NjQxRAlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIDc0eHgvN3h4IFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF83NHh4PSIJXAotCURCNjQzNjAJCURCNjQ0NjAJCUVWQjY0MjYwCVAzRzQJCVwKLQlwM203NDQ4CQlQQ0lQUEMyCQlQQ0lQUEM2CQlaVU1BCQlcCi0JbXBjNzQ0OGhwYzIKK0xJU1RfNzR4eD0iCQlcCisJREI2NDM2MAkJXAorCURCNjQ0NjAJCVwKKwlFVkI2NDI2MAlcCisJbXBjNzQ0OGhwYzIJXAorCVAzRzQJCVwKKwlwM203NDQ4CQlcCisJUENJUFBDMgkJXAorCVBDSVBQQzYJCVwKKwlaVU1BCQlcCiAiCiAKLUxJU1RfN3h4PSIJXAotCUJBQjd4eAkJQ1BDSTc1MAkJRUxQUEMJCXAzbTc1MAkJXAotCXBwbWM3eHgJCQkJCQkJCVwKK0xJU1RfN3h4PSIJCVwKKwlCQUI3eHgJCVwKKwlDUENJNzUwCQlcCisJRUxQUEMJCVwKKwlwM203NTAJCVwKKwlwcG1jN3h4CQlcCiAiCiAKLUxJU1RfcHBjPSIke0xJU1RfNXh4fSAgJHtMSVNUXzV4eHh9CQlcCi0JICAke0xJU1RfOHh4fQkJCQlcCi0JICAke0xJU1RfODIyMH0gJHtMSVNUXzgyNHh9ICR7TElTVF84MjYwfSBcCi0JICAke0xJU1RfODN4eH0JCQkJXAotCSAgJHtMSVNUXzg1eHh9CQkJCVwKLQkgICR7TElTVF84Nnh4fQkJCQlcCi0JICAke0xJU1RfNHh4fQkJCQlcCi0JICAke0xJU1RfNzR4eH0gJHtMSVNUXzd4eH0iCitMSVNUX3BwYz0iCQlcCisJJHtMSVNUXzV4eH0JXAorCSR7TElTVF81eHh4fQlcCisJJHtMSVNUXzh4eH0JXAorCSR7TElTVF84MjIwfQlcCisJJHtMSVNUXzgyNHh9CVwKKwkke0xJU1RfODI2MH0JXAorCSR7TElTVF84M3h4fQlcCisJJHtMSVNUXzg1eHh9CVwKKwkke0xJU1RfODZ4eH0JXAorCSR7TElTVF80eHh9CVwKKwkke0xJU1RfNzR4eH0JXAorCSR7TElTVF83eHh9CVwKKyIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgU3Ryb25nQVJNIFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF9TQT0iYXNzYWJldCBkbnAxMTEwIGdjcGx1cyBsYXJ0IHNoYW5ub24iCitMSVNUX1NBPSIJCVwKKwlhc3NhYmV0CQlcCisJZG5wMTExMAkJXAorCWdjcGx1cwkJXAorCWxhcnQJCVwKKwlzaGFubm9uCQlcCisiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIEFSTTcgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUX0FSTTc9IglcCi0JYXJtYWRpbGxvCUIyCQllcDczMTIJCWV2YjQ1MTAJCVwKLQlpbXBhNwkJaW50ZWdyYXRvcmFwCWFwNwkJYXA3MjB0CQlcCi0JbHBjMjI5MnNvZGltbQltb2RuZXQ1MAlTTU40MgkJCQlcCitMSVNUX0FSTTc9IgkJXAorCWFwNwkJXAorCWFwNzIwdAkJXAorCWFybWFkaWxsbwlcCisJQjIJCVwKKwllcDczMTIJCVwKKwlldmI0NTEwCQlcCisJaW1wYTcJCVwKKwlpbnRlZ3JhdG9yYXAJXAorCWxwYzIyOTJzb2RpbW0JXAorCW1vZG5ldDUwCVwKKwlTTU40MgkJXAogIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBBUk05IFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF9BUk05PSIJXAotCWF0OTFybTkyMDBkawljbWNfcHUyCQkJCQkJXAotCWFwOTIwdAkJYXA5MjJfWEExMAlhcDkyNmVqcwlhcDk0NmVzCQlcCi0JYXA5NjYJCWNwOTIwdAkJY3A5MjJfWEExMAljcDkyNmVqcwlcCi0JY3A5NDZlcwkJY3A5NjYJCWxwZDdhNDAwCW1wMnVzYgkJXAotCW14MWFkcwkJbXgxZnMyCQluZXRzdGFyCQlvbWFwMTUxMGlubglcCi0Jb21hcDE2MTBoMglvbWFwMTYxMGlubglvbWFwNzMwcDIJc2JjMjQxMHgJXAotCXNjYjkzMjgJCXNtZGsyNDAwCXNtZGsyNDEwCXRyYWIJCVwKLQlWQ01BOQkJdmVyc2F0aWxlCXZlcnNhdGlsZWFiCXZlcnNhdGlsZXBiCVwKLQl2b2ljZWJsdWUJCQkJCQkJXAorTElTVF9BUk05PSIJCQlcCisJYXQ5MXJtOTIwMGRrCQlcCisJY21jX3B1MgkJCVwKKwlhcDkyMHQJCQlcCisJYXA5MjJfWEExMAkJXAorCWFwOTI2ZWpzCQlcCisJYXA5NDZlcwkJCVwKKwlhcDk2NgkJCVwKKwljcDkyMHQJCQlcCisJY3A5MjJfWEExMAkJXAorCWNwOTI2ZWpzCQlcCisJY3A5NDZlcwkJCVwKKwljcDk2NgkJCVwKKwlscGQ3YTQwMAkJXAorCW1wMnVzYgkJCVwKKwlteDFhZHMJCQlcCisJbXgxZnMyCQkJXAorCW5ldHN0YXIJCQlcCisJb21hcDE1MTBpbm4JCVwKKwlvbWFwMTYxMGgyCQlcCisJb21hcDE2MTBpbm4JCVwKKwlvbWFwNzMwcDIJCVwKKwlzYmMyNDEweAkJXAorCXNjYjkzMjgJCQlcCisJc21kazI0MDAJCVwKKwlzbWRrMjQxMAkJXAorCXRyYWIJCQlcCisJVkNNQTkJCQlcCisJdmVyc2F0aWxlCQlcCisJdmVyc2F0aWxlYWIJCVwKKwl2ZXJzYXRpbGVwYgkJXAorCXZvaWNlYmx1ZQkJXAorCWRhdmluY2lfZHZldm0JCVwKKwlkYXZpbmNpX3NjaG1vb2dpZQlcCisJZGF2aW5jaV9zb25hdGEJCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgQVJNMTAgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTElTVF9BUk0xMD0iCVwKLQlpbnRlZ3JhdG9yY3AJY3AxMDI2CQkJCQkJXAorTElTVF9BUk0xMD0iCQlcCisJaW50ZWdyYXRvcmNwCVwKKwljcDEwMjYJCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgQVJNMTEgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTElTVF9BUk0xMT0iCVwKLQljcDExMzYJCW9tYXAyNDIwaDQJCQkJCVwKK0xJU1RfQVJNMTE9IgkJXAorCWNwMTEzNgkJXAorCW9tYXAyNDIwaDQJXAogIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBYc2NhbGUgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUX3B4YT0iCVwKLQlhZHN2aXgJCWNlcmYyNTAJCWNyYWRsZQkJY3NiMjI2CQlcCi0JZGVsdGEJCWlubm9rb20JCWx1YmJvY2sJCXBsZWIyCQlcCi0JcHhhMjU1X2lkcAl3ZXBlcDI1MAl4YWVuaWF4CQl4bTI1MAkJXAotCXhzZW5naW5lCXp5bG9uaXRlCQkJCQlcCitMSVNUX3B4YT0iCQlcCisJYWRzdml4CQlcCisJY2VyZjI1MAkJXAorCWNyYWRsZQkJXAorCWNzYjIyNgkJXAorCWRlbHRhCQlcCisJaW5ub2tvbQkJXAorCWx1YmJvY2sJCVwKKwlwbGViMgkJXAorCXB4YTI1NV9pZHAJXAorCXdlcGVwMjUwCVwKKwl4YWVuaWF4CQlcCisJeG0yNTAJCVwKKwl4c2VuZ2luZQlcCisJenlsb25pdGUJXAogIgogCi1MSVNUX2l4cD0iaXhkcDQyNQlpeGRwZzQyNQlwZG5iMwkJc2NwdSIKK0xJU1RfaXhwPSIJCVwKKwlpeGRwNDI1CQlcCisJaXhkcGc0MjUJXAorCXBkbmIzCQlcCisJc2NwdQkJXAorIgogCiAKLUxJU1RfYXJtPSIJXAotCSR7TElTVF9TQX0JCQkJCQkJXAotCSR7TElTVF9BUk03fSAke0xJU1RfQVJNOX0gJHtMSVNUX0FSTTEwfSAke0xJU1RfQVJNMTF9CQlcCi0JJHtMSVNUX3B4YX0gJHtMSVNUX2l4cH0JCQkJCQlcCitMSVNUX2FybT0iCQlcCisJJHtMSVNUX1NBfQlcCisJJHtMSVNUX0FSTTd9CVwKKwkke0xJU1RfQVJNOX0JXAorCSR7TElTVF9BUk0xMH0JXAorCSR7TElTVF9BUk0xMX0JXAorCSR7TElTVF9weGF9CVwKKwkke0xJU1RfaXhwfQlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIE1JUFMgU3lzdGVtcwkJKGRlZmF1bHQgPSBiaWcgZW5kaWFuKQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUX21pcHM0a2M9ImluY2FpcCIKK0xJU1RfbWlwczRrYz0iCQlcCisJaW5jYWlwCQlcCisiCiAKLUxJU1RfbWlwczVrYz0icHVycGxlIgorTElTVF9taXBzNWtjPSIJCVwKKwlwdXJwbGUJCVwKKyIKIAotTElTVF9hdTF4eDA9ImRiYXUxMDAwIGRiYXUxMTAwIGRiYXUxNTAwIGRiYXUxNTUwIGRiYXUxNTUwX2VsIGd0aDIiCitMSVNUX2F1MXh4MD0iCQlcCisJZGJhdTEwMDAJXAorCWRiYXUxMTAwCVwKKwlkYmF1MTUwMAlcCisJZGJhdTE1NTAJXAorCWRiYXUxNTUwX2VsCVwKKwlndGgyCQlcCisiCiAKLUxJU1RfbWlwcz0iJHtMSVNUX21pcHM0a2N9ICR7TElTVF9taXBzNWtjfSAke0xJU1RfYXUxeHgwfSIKK0xJU1RfbWlwcz0iCQlcCisJJHtMSVNUX21pcHM0a2N9CVwKKwkke0xJU1RfbWlwczVrY30JXAorCSR7TElTVF9hdTF4eDB9CVwKKyIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTUlQUyBTeXN0ZW1zCQkobGl0dGxlIGVuZGlhbikKQEAgLTI2OSwzNiArNTQyLDU1IEBACiAKIExJU1RfbWlwczVrY19lbD0iIgogCi1MSVNUX2F1MXh4MF9lbD0iZGJhdTE1NTBfZWwiCitMSVNUX2F1MXh4MF9lbD0iCVwKKwlkYmF1MTU1MF9lbAlcCisiCiAKLUxJU1RfbWlwc19lbD0iJHtMSVNUX21pcHM0a2NfZWx9ICR7TElTVF9taXBzNWtjX2VsfSAke0xJU1RfYXUxeHgwX2VsfSIKK0xJU1RfbWlwc19lbD0iCQkJXAorCSR7TElTVF9taXBzNGtjX2VsfQlcCisJJHtMSVNUX21pcHM1a2NfZWx9CVwKKwkke0xJU1RfYXUxeHgwX2VsfQlcCisiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIGkzODYgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUX0k0ODY9InNjNTIwX2NkcCBzYzUyMF9zcHVuayBzYzUyMF9zcHVua19yZWwiCitMSVNUX0k0ODY9IgkJXAorCXNjNTIwX2NkcAlcCisJc2M1MjBfc3B1bmsJXAorCXNjNTIwX3NwdW5rX3JlbAlcCisiCiAKLUxJU1RfeDg2PSIke0xJU1RfSTQ4Nn0iCitMSVNUX3g4Nj0iCQlcCisJJHtMSVNUX0k0ODZ9CVwKKyIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTklPUyBTeXN0ZW1zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1Rfbmlvcz0iCVwKLQlBRE5QRVNDMQkJQUROUEVTQzFfYmFzZV8zMgkJCVwKLQlBRE5QRVNDMV9ETlBFVkEyX2Jhc2VfMzIJCQkJCVwKLQlESzFDMjAJCQlESzFDMjBfc3RhbmRhcmRfMzIJCQlcCi0JREsxUzEwCQkJREsxUzEwX3N0YW5kYXJkXzMyIERLMVMxMF9tdHhfbGRrXzIwCVwKK0xJU1Rfbmlvcz0iCQkJXAorCUFETlBFU0MxCQlcCisJQUROUEVTQzFfYmFzZV8zMglcCisJQUROUEVTQzFfRE5QRVZBMl9iYXNlXzMyXAorCURLMUMyMAkJCVwKKwlESzFDMjBfc3RhbmRhcmRfMzIJXAorCURLMVMxMAkJCVwKKwlESzFTMTBfc3RhbmRhcmRfMzIJXAorCURLMVMxMF9tdHhfbGRrXzIwCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTmlvcy1JSSBTeXN0ZW1zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1RfbmlvczI9IglcCi0JRVAxQzIwCQlFUDFTMTAJCUVQMVM0MAkJCQlcCi0JUENJNTQ0MQkJUEsxQzIwCQkJCQkJXAorTElTVF9uaW9zMj0iCQlcCisJRVAxQzIwCQlcCisJRVAxUzEwCQlcCisJRVAxUzQwCQlcCisJUENJNTQ0MQkJXAorCVBLMUMyMAkJXAogIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0zMDYsMzEgKzU5OCw0NCBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBMSVNUX21pY3JvYmxhemU9IglcCi0Jc3V6YWt1CQltbDQwMQkJeHVwdjJwCisJc3V6YWt1CQlcCisJbWw0MDEJCVwKKwl4dXB2MnAJCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgQ29sZEZpcmUgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUX2NvbGRmaXJlPSIJXAotCWNvYnJhNTI3MglFQitNQ0YtRVYxMjMJRUIrTUNGLUVWMTIzX2ludGVybmFsCQlcCi0JaWRtcgkJTTUyNzFFVkIJTTUyNzJDMwkJTTUyODJFVkIJXAotCVRBU1JFRwkJcjUyMDAJCU01MjcxRVZCCQkJXAorTElTVF9jb2xkZmlyZT0iCQkJXAorCWNvYnJhNTI3MgkJXAorCUVCK01DRi1FVjEyMwkJXAorCUVCK01DRi1FVjEyM19pbnRlcm5hbAlcCisJaWRtcgkJCVwKKwlNNTI3MUVWQgkJXAorCU01MjcyQzMJCQlcCisJTTUyODJFVkIJCVwKKwlUQVNSRUcJCQlcCisJcjUyMDAJCQlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIEFWUjMyIFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF9hdnIzMj0iYXRzdGsxMDAyIgorTElTVF9hdnIzMj0iCQlcCisJYXRzdGsxMDAyCVwKKyIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgQmxhY2tmaW4gU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUX2JsYWNrZmluPSIgXAotCWJmNTMzLWV6a2l0CWJmNTMzLXN0YW1wCWJmNTM3LXN0YW1wCWJmNTYxLWV6a2l0CVwKK0xJU1RfYmxhY2tmaW49IgkJXAorCWJmNTMzLWV6a2l0CVwKKwliZjUzMy1zdGFtcAlcCisJYmY1Mzctc3RhbXAJXAorCWJmNTYxLWV6a2l0CVwKICIKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNjYsNyArNjcxLDcgQEAKIAltaWNyb2JsYXplfCBcCiAJbWlwc3xtaXBzX2VsfCBcCiAJbmlvc3xuaW9zMnwgXAotCXBwY3w1eHh8NXh4eHw4eHh8ODIyMHw4MjR4fDgyNjB8ODN4eHw4NXh4fDg2eHh8NHh4fDd4eHw3NHh4fCBcCisJcHBjfDV4eHw1eHh4fDUxMnh8OHh4fDgyMjB8ODI0eHw4MjYwfDgzeHh8ODV4eHw4Nnh4fDR4eHw3eHh8NzR4eHwgXAogCXg4NnxJNDg2KQogCQkJZm9yIHRhcmdldCBpbiBgZXZhbCBlY2hvICckTElTVF8nJHthcmd9YAogCQkJZG8KZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggYTY0N2Q1NC4uOWRlZTk0OCAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTM0LDYgKzM0LDcgQEAKIAkgICAgLWUgcy9hcm0uKi9hcm0vIFwKIAkgICAgLWUgcy9zYTExMC9hcm0vIFwKIAkgICAgLWUgcy9wb3dlcnBjL3BwYy8gXAorCSAgICAtZSBzL3BwYzY0L3BwYy8gXAogCSAgICAtZSBzL21hY3BwYy9wcGMvKQogCiBIT1NUT1MgOj0gJChzaGVsbCB1bmFtZSAtcyB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nIHwgXApAQCAtMTIyLDcgKzEyMyw3IEBACiBDUk9TU19DT01QSUxFID0KIGVsc2UKIGlmZXEgKCQoQVJDSCkscHBjKQotQ1JPU1NfQ09NUElMRSA9IHBvd2VycGMtbGludXgtCitDUk9TU19DT01QSUxFID0gcHBjXzh4eC0KIGVuZGlmCiBpZmVxICgkKEFSQ0gpLGFybSkKIENST1NTX0NPTVBJTEUgPSBhcm0tbGludXgtCkBAIC0yMDUsMTEgKzIwNiwxNSBAQAogTElCUyArPSBydGMvbGlicnRjLmEKIExJQlMgKz0gZHR0L2xpYmR0dC5hCiBMSUJTICs9IGRyaXZlcnMvbGliZHJpdmVycy5hCitMSUJTICs9IGRyaXZlcnMvYmlvc19lbXVsYXRvci9saWJhdGliaW9zZW11LmEKIExJQlMgKz0gZHJpdmVycy9uYW5kL2xpYm5hbmQuYQogTElCUyArPSBkcml2ZXJzL25hbmRfbGVnYWN5L2xpYm5hbmRfbGVnYWN5LmEKIGlmZXEgKCQoQ1BVKSxtcGM4M3h4KQogTElCUyArPSBkcml2ZXJzL3FlL3FlLmEKIGVuZGlmCitpZmVxICgkKENQVSksbXBjODV4eCkKK0xJQlMgKz0gZHJpdmVycy9xZS9xZS5hCitlbmRpZgogTElCUyArPSBkcml2ZXJzL3NrOThsaW4vbGlic2s5OGxpbi5hCiBMSUJTICs9IHBvc3QvbGlicG9zdC5hIHBvc3QvZHJpdmVycy9saWJwb3N0ZHJpdmVycy5hCiBMSUJTICs9ICQoc2hlbGwgaWYgWyAtZCBwb3N0L2xpYl8kKEFSQ0gpIF07IHRoZW4gZWNobyBcCkBAIC00MjksNyArNDM0LDcgQEAKIAlAJChNS0NPTkZJRykganVwaXRlciBwcGMgbXBjNXh4eCBqdXBpdGVyCiAKIHYzOGJfY29uZmlnOiB1bmNvbmZpZwotCUAuL21rY29uZmlnIC1hIHYzOGIgcHBjIG1wYzV4eHggdjM4YgorCUAkKE1LQ09ORklHKSAtYSB2MzhiIHBwYyBtcGM1eHh4IHYzOGIKIAogaW5rYTR4MF9jb25maWc6CXVuY29uZmlnCiAJQCQoTUtDT05GSUcpIGlua2E0eDAgcHBjIG1wYzV4eHggaW5rYTR4MApAQCAtNTMyLDEzICs1MzcsOCBAQAogc21tYWNvNF9jb25maWc6IHVuY29uZmlnCiAJQCQoTUtDT05GSUcpIC1hIHNtbWFjbzQgcHBjIG1wYzV4eHggdHFtNTIwMAogCi1jbTFfcXAxX2NvbmZpZzoJdW5jb25maWcKLQlAID5pbmNsdWRlL2NvbmZpZy5oCi0JQFsgLXogIiQoZmluZHN0cmluZyBjbTFfcXAxLCRAKSIgXSB8fCBcCi0JCXsgIGVjaG8gIi4uLiB3aXRoIDY0IE1CeXRlIFNEUkFNIiA7IFwKLQkJICBlY2hvICIuLi4gd2l0aCAzMiBNQnl0ZSBGbGFzaCIgOyBcCi0JCX0KLQlALi9ta2NvbmZpZyAtYSBjbTFfcXAxIHBwYyBtcGM1eHh4IGNtMV9xcDEKK2NtNTIwMF9jb25maWc6CXVuY29uZmlnCisJQC4vbWtjb25maWcgLWEgY201MjAwIHBwYyBtcGM1eHh4IGNtNTIwMAogCiBzcGlldmFsX2NvbmZpZzoJdW5jb25maWcKIAlAJChNS0NPTkZJRykgLWEgc3BpZXZhbCBwcGMgbXBjNXh4eCB0cW01MjAwCkBAIC02NDIsNiArNjQyLDEzIEBACiAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgTVBDNTEyeCBTeXN0ZW1zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCithZHM1MTIxX2NvbmZpZzogdW5jb25maWcKKwlAJChNS0NPTkZJRykgYWRzNTEyMSBwcGMgbXBjNTEyeCBhZHM1MTIxCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTVBDOHh4IFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtNjU0LDYgKzY2MSw5IEBACiAJQGVjaG8gIiNkZWZpbmUgQ09ORklHX01QQzg1MlQiID4gJChvYmopaW5jbHVkZS9jb25maWcuaCkKIAlAJChNS0NPTkZJRykgLWEgQWRkZXIgcHBjIG1wYzh4eCBhZGRlcgogCitBZGRlclVTQl9jb25maWc6CXVuY29uZmlnCisJQC4vbWtjb25maWcgLWEgQWRkZXJVU0IgcHBjIG1wYzh4eCBhZGRlcgorCiBBRFM4NjBfY29uZmlnICAgICBcCiBGQURTODIzX2NvbmZpZyAgICBcCiBGQURTODUwU0FSX2NvbmZpZyBcCkBAIC0xMDI4LDkgKzEwMzgsOCBAQAogCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIHBwYyBwcGM0eHggYWNhZGlhIGFtY2MKIAogYWNhZGlhX25hbmRfY29uZmlnOgl1bmNvbmZpZwotCUBta2RpciAtcCAkKG9iailpbmNsdWRlCi0JQG1rZGlyIC1wICQob2JqKW5hbmRfc3BsCi0JQG1rZGlyIC1wICQob2JqKWJvYXJkL2FtY2MvYWNhZGlhCisJQG1rZGlyIC1wICQob2JqKWluY2x1ZGUgJChvYmopYm9hcmQvYW1jYy9hY2FkaWEKKwlAbWtkaXIgLXAgJChvYmopbmFuZF9zcGwvYm9hcmQvYW1jYy9hY2FkaWEKIAlAZWNobyAiI2RlZmluZSBDT05GSUdfTkFORF9VX0JPT1QiID4gJChvYmopaW5jbHVkZS9jb25maWcuaAogCUAkKE1LQ09ORklHKSAtbiAkQCAtYSBhY2FkaWEgcHBjIHBwYzR4eCBhY2FkaWEgYW1jYwogCUBlY2hvICJURVhUX0JBU0UgPSAweDAxMDAwMDAwIiA+ICQob2JqKWJvYXJkL2FtY2MvYWNhZGlhL2NvbmZpZy50bXAKQEAgLTEwNTgsOSArMTA2Nyw4IEBACiAJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIHBwYzR4eCBiYW1ib28gYW1jYwogCiBiYW1ib29fbmFuZF9jb25maWc6CXVuY29uZmlnCi0JQG1rZGlyIC1wICQob2JqKWluY2x1ZGUKLQlAbWtkaXIgLXAgJChvYmopbmFuZF9zcGwKLQlAbWtkaXIgLXAgJChvYmopYm9hcmQvYW1jYy9iYW1ib28KKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZSAkKG9iailib2FyZC9hbWNjL2JhbWJvbworCUBta2RpciAtcCAkKG9iailuYW5kX3NwbC9ib2FyZC9hbWNjL2JhbWJvbwogCUBlY2hvICIjZGVmaW5lIENPTkZJR19OQU5EX1VfQk9PVCIgPiAkKG9iailpbmNsdWRlL2NvbmZpZy5oCiAJQCQoTUtDT05GSUcpIC1uICRAIC1hIGJhbWJvbyBwcGMgcHBjNHh4IGJhbWJvbyBhbWNjCiAJQGVjaG8gIlRFWFRfQkFTRSA9IDB4MDEwMDAwMDAiID4gJChvYmopYm9hcmQvYW1jYy9iYW1ib28vY29uZmlnLnRtcApAQCAtMTI0Nyw5ICsxMjU1LDggQEAKIAogc2VxdW9pYV9uYW5kX2NvbmZpZyBcCiByYWluaWVyX25hbmRfY29uZmlnOiB1bmNvbmZpZwotCUBta2RpciAtcCAkKG9iailpbmNsdWRlCi0JQG1rZGlyIC1wICQob2JqKW5hbmRfc3BsCi0JQG1rZGlyIC1wICQob2JqKWJvYXJkL2FtY2Mvc2VxdW9pYQorCUBta2RpciAtcCAkKG9iailpbmNsdWRlICQob2JqKWJvYXJkL2FtY2Mvc2VxdW9pYQorCUBta2RpciAtcCAkKG9iailuYW5kX3NwbC9ib2FyZC9hbWNjL3NlcXVvaWEKIAlAZWNobyAiI2RlZmluZSBDT05GSUdfTkFORF9VX0JPT1QiID4gJChvYmopaW5jbHVkZS9jb25maWcuaAogCUBlY2hvICIjZGVmaW5lIENPTkZJR18kJChlY2hvICQoc3Vic3QgLCwkKEA6X2NvbmZpZz0pKSB8IFwKIAkJdHIgJ1s6bG93ZXI6XScgJ1s6dXBwZXI6XScpIiA+PiAkKG9iailpbmNsdWRlL2NvbmZpZy5oCkBAIC0xNDMwLDcgKzE0MzcsNyBAQAogCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIHBwYyBtcGM4MjYwIGVwODI2MAogCiBlcDgyeHhtX2NvbmZpZzoJdW5jb25maWcKLQlALi9ta2NvbmZpZyAkKEA6X2NvbmZpZz0pIHBwYyBtcGM4MjYwIGVwODJ4eG0KKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBwcGMgbXBjODI2MCBlcDgyeHhtCiAKIGd3ODI2MF9jb25maWc6CXVuY29uZmlnCiAJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIG1wYzgyNjAgZ3c4MjYwCkBAIC0xNjcxLDM4ICsxNjc4LDQzIEBACiAKIE1QQzgzMTNFUkRCXzMzX2NvbmZpZyBcCiBNUEM4MzEzRVJEQl82Nl9jb25maWc6IHVuY29uZmlnCi0JQGVjaG8gIiIgPmluY2x1ZGUvY29uZmlnLmggOyBcCisJQG1rZGlyIC1wICQob2JqKWluY2x1ZGUKKwlAZWNobyAiIiA+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAlpZiBbICIkKGZpbmRzdHJpbmcgXzMzXywkQCkiIF0gOyB0aGVuIFwKIAkJZWNobyAtbiAiLi4uMzNNIC4uLiIgOyBcCi0JCWVjaG8gIiNkZWZpbmUgQ0ZHXzMzTUhaIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgQ0ZHXzMzTUhaIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJZmkgOyBcCiAJaWYgWyAiJChmaW5kc3RyaW5nIF82Nl8sJEApIiBdIDsgdGhlbiBcCiAJCWVjaG8gLW4gIi4uLjY2TS4uLiIgOyBcCi0JCWVjaG8gIiNkZWZpbmUgQ0ZHXzY2TUhaIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgQ0ZHXzY2TUhaIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJZmkgOwogCUAkKE1LQ09ORklHKSAtYSBNUEM4MzEzRVJEQiBwcGMgbXBjODN4eCBtcGM4MzEzZXJkYgogCitNUEM4MzIzRVJEQl9jb25maWc6CXVuY29uZmlnCisJQCQoTUtDT05GSUcpIC1hIE1QQzgzMjNFUkRCIHBwYyBtcGM4M3h4IG1wYzgzMjNlcmRiIGZyZWVzY2FsZQorCiBNUEM4MzJYRU1EU19jb25maWcgXAogTVBDODMyWEVNRFNfSE9TVF8zM19jb25maWcgXAogTVBDODMyWEVNRFNfSE9TVF82Nl9jb25maWcgXAogTVBDODMyWEVNRFNfU0xBVkVfY29uZmlnOgl1bmNvbmZpZwotCUBlY2hvICIiID5pbmNsdWRlL2NvbmZpZy5oIDsgXAorCUBta2RpciAtcCAkKG9iailpbmNsdWRlCisJQGVjaG8gIiIgPiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJaWYgWyAiJChmaW5kc3RyaW5nIF9IT1NUXywkQCkiIF0gOyB0aGVuIFwKIAkJZWNobyAtbiAiLi4uIFBDSSBIT1NUICIgOyBcCi0JCWVjaG8gIiNkZWZpbmUgQ09ORklHX1BDSSIgPj5pbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIENPTkZJR19QQ0kiID4+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAlmaSA7IFwKIAlpZiBbICIkKGZpbmRzdHJpbmcgX1NMQVZFXywkQCkiIF0gOyB0aGVuIFwKIAkJZWNobyAiLi4uUENJIFNMQVZFIDY2TSIgIDsgXAotCQllY2hvICIjZGVmaW5lIENPTkZJR19QQ0kiID4+aW5jbHVkZS9jb25maWcuaCA7IFwKLQkJZWNobyAiI2RlZmluZSBDT05GSUdfUENJU0xBVkUiID4+aW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiI2RlZmluZSBDT05GSUdfUENJIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgQ09ORklHX1BDSVNMQVZFIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJZmkgOyBcCiAJaWYgWyAiJChmaW5kc3RyaW5nIF8zM18sJEApIiBdIDsgdGhlbiBcCiAJCWVjaG8gLW4gIi4uLjMzTSAuLi4iIDsgXAotCQllY2hvICIjZGVmaW5lIFBDSV8zM00iID4+aW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiI2RlZmluZSBQQ0lfMzNNIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJZmkgOyBcCiAJaWYgWyAiJChmaW5kc3RyaW5nIF82Nl8sJEApIiBdIDsgdGhlbiBcCiAJCWVjaG8gLW4gIi4uLjY2TS4uLiIgOyBcCi0JCWVjaG8gIiNkZWZpbmUgUENJXzY2TSIgPj5pbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIFBDSV82Nk0iID4+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAlmaSA7CiAJQCQoTUtDT05GSUcpIC1hIE1QQzgzMlhFTURTIHBwYyBtcGM4M3h4IG1wYzgzMnhlbWRzCiAKQEAgLTE3MjcsMjMgKzE3MzksMjQgQEAKIE1QQzgzNjBFTURTX0hPU1RfMzNfY29uZmlnIFwKIE1QQzgzNjBFTURTX0hPU1RfNjZfY29uZmlnIFwKIE1QQzgzNjBFTURTX1NMQVZFX2NvbmZpZzoJdW5jb25maWcKLQlAZWNobyAiIiA+aW5jbHVkZS9jb25maWcuaCA7IFwKKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZQorCUBlY2hvICIiID4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCWlmIFsgIiQoZmluZHN0cmluZyBfSE9TVF8sJEApIiBdIDsgdGhlbiBcCiAJCWVjaG8gLW4gIi4uLiBQQ0kgSE9TVCAiIDsgXAotCQllY2hvICIjZGVmaW5lIENPTkZJR19QQ0kiID4+aW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiI2RlZmluZSBDT05GSUdfUENJIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJZmkgOyBcCiAJaWYgWyAiJChmaW5kc3RyaW5nIF9TTEFWRV8sJEApIiBdIDsgdGhlbiBcCiAJCWVjaG8gIi4uLlBDSSBTTEFWRSA2Nk0iICA7IFwKLQkJZWNobyAiI2RlZmluZSBDT05GSUdfUENJIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCi0JCWVjaG8gIiNkZWZpbmUgQ09ORklHX1BDSVNMQVZFIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgQ09ORklHX1BDSSIgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIENPTkZJR19QQ0lTTEFWRSIgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCWZpIDsgXAogCWlmIFsgIiQoZmluZHN0cmluZyBfMzNfLCRAKSIgXSA7IHRoZW4gXAogCQllY2hvIC1uICIuLi4zM00gLi4uIiA7IFwKLQkJZWNobyAiI2RlZmluZSBQQ0lfMzNNIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgUENJXzMzTSIgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCWZpIDsgXAogCWlmIFsgIiQoZmluZHN0cmluZyBfNjZfLCRAKSIgXSA7IHRoZW4gXAogCQllY2hvIC1uICIuLi42Nk0uLi4iIDsgXAotCQllY2hvICIjZGVmaW5lIFBDSV82Nk0iID4+aW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiI2RlZmluZSBQQ0lfNjZNIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJZmkgOwogCUAkKE1LQ09ORklHKSAtYSBNUEM4MzYwRU1EUyBwcGMgbXBjODN4eCBtcGM4MzYwZW1kcwogCkBAIC0xNzY5LDEwICsxNzgyLDEwIEBACiAJQG1rZGlyIC1wICQob2JqKWluY2x1ZGUKIAlAZWNobyAiIiA+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAlpZiBbICIkKGZpbmRzdHJpbmcgXzMzXywkQCkiIF0gOyB0aGVuIFwKLQkJZWNobyAtbiAiLi4uIDMzIE1IeiBQQ0kiIDsgXAorCQllY2hvICIuLi4gMzMgTUh6IFBDSSIgOyBcCiAJZWxzZSBcCiAJCWVjaG8gIiNkZWZpbmUgQ09ORklHX1NZU0NMS182Nk0iID4+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKLQkJZWNobyAtbiAiLi4uIDY2IE1IeiBQQ0kiIDsgXAorCQllY2hvICIuLi4gNjYgTUh6IFBDSSIgOyBcCiAJZmkgOyBcCiAJaWYgWyAiJChmaW5kc3RyaW5nIF9zbGF2ZV8sJEApIiBdIDsgdGhlbiBcCiAJCWVjaG8gIiNkZWZpbmUgQ09ORklHX1BDSV9TTEFWRSIgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXApAQCAtMTc4NSwxNyArMTc5OCwzOCBAQAogTVBDODU2MEFEU19jb25maWc6CXVuY29uZmlnCiAJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIG1wYzg1eHggbXBjODU2MGFkcwogCitNUEM4NTQxQ0RTX2xlZ2FjeV9jb25maWcgXAogTVBDODU0MUNEU19jb25maWc6CXVuY29uZmlnCi0JQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIG1wYzg1eHggbXBjODU0MWNkcyBjZHMKKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZQorCUBlY2hvICIiID4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAorCWlmIFsgIiQoZmluZHN0cmluZyBfbGVnYWN5XywkQCkiIF0gOyB0aGVuIFwKKwkJZWNobyAiI2RlZmluZSBDT05GSUdfTEVHQUNZIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIi4uLiBsZWdhY3kiIDsgXAorCWZpCisJQCQoTUtDT05GSUcpIC1hIE1QQzg1NDFDRFMgcHBjIG1wYzg1eHggbXBjODU0MWNkcyBjZHMKIAogTVBDODU0NERTX2NvbmZpZzoJdW5jb25maWcKIAlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBwcGMgbXBjODV4eCBtcGM4NTQ0ZHMgZnJlZXNjYWxlCiAKK01QQzg1NDhDRFNfbGVnYWN5X2NvbmZpZyBcCiBNUEM4NTQ4Q0RTX2NvbmZpZzoJdW5jb25maWcKLQlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBwcGMgbXBjODV4eCBtcGM4NTQ4Y2RzIGNkcworCUBta2RpciAtcCAkKG9iailpbmNsdWRlCisJQGVjaG8gIiIgPiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCisJaWYgWyAiJChmaW5kc3RyaW5nIF9sZWdhY3lfLCRAKSIgXSA7IHRoZW4gXAorCQllY2hvICIjZGVmaW5lIENPTkZJR19MRUdBQ1kiID4+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiLi4uIGxlZ2FjeSIgOyBcCisJZmkKKwlAJChNS0NPTkZJRykgLWEgTVBDODU0OENEUyBwcGMgbXBjODV4eCBtcGM4NTQ4Y2RzIGNkcwogCitNUEM4NTU1Q0RTX2xlZ2FjeV9jb25maWcgXAogTVBDODU1NUNEU19jb25maWc6CXVuY29uZmlnCi0JQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIG1wYzg1eHggbXBjODU1NWNkcyBjZHMKKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZQorCUBlY2hvICIiID4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAorCWlmIFsgIiQoZmluZHN0cmluZyBfbGVnYWN5XywkQCkiIF0gOyB0aGVuIFwKKwkJZWNobyAiI2RlZmluZSBDT05GSUdfTEVHQUNZIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIi4uLiBsZWdhY3kiIDsgXAorCWZpCisJQCQoTUtDT05GSUcpIC1hIE1QQzg1NTVDRFMgcHBjIG1wYzg1eHggbXBjODU1NWNkcyBjZHMKIAogTVBDODU2OE1EU19jb25maWc6CXVuY29uZmlnCiAJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIG1wYzg1eHggbXBjODU2OG1kcwpAQCAtMTg2Niw4ICsxOTAwLDEwIEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIE1QQzg2NDFIUENOX2NvbmZpZzogICAgdW5jb25maWcKLQlALi9ta2NvbmZpZyAkKEA6X2NvbmZpZz0pIHBwYyBtcGM4Nnh4IG1wYzg2NDFocGNuCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIG1wYzg2eHggbXBjODY0MWhwY24KIAorc2JjODY0MWRfY29uZmlnOgl1bmNvbmZpZworCUAuL21rY29uZmlnICQoQDpfY29uZmlnPSkgcHBjIG1wYzg2eHggc2JjODY0MWQKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgNzR4eC83eHggU3lzdGVtcwpAQCAtMjAyMyw2ICsyMDU5LDE1IEBACiBvbWFwNTkxMm9za19jb25maWcgOgl1bmNvbmZpZwogCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIGFybSBhcm05MjZlanMgb21hcDU5MTJvc2sgTlVMTCBvbWFwCiAKK2RhdmluY2lfZHZldm1fY29uZmlnIDoJdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gYXJtOTI2ZWpzIGR2LWV2bSBkYXZpbmNpIGRhdmluY2kKKworZGF2aW5jaV9zY2htb29naWVfY29uZmlnIDoJdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gYXJtOTI2ZWpzIHNjaG1vb2dpZSBkYXZpbmNpIGRhdmluY2kKKworZGF2aW5jaV9zb25hdGFfY29uZmlnIDoJdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gYXJtOTI2ZWpzIHNvbmF0YSBkYXZpbmNpIGRhdmluY2kKKwogb21hcDE2MTBpbm5fY29uZmlnIFwKIG9tYXAxNjEwaW5uX2NzMGJvb3RfY29uZmlnIFwKIG9tYXAxNjEwaW5uX2NzM2Jvb3RfY29uZmlnIFwKQEAgLTIwMzMsMTMgKzIwNzgsMTMgQEAKIG9tYXAxNjEwaDJfY3NfYXV0b2Jvb3RfY29uZmlnOgl1bmNvbmZpZwogCUBta2RpciAtcCAkKG9iailpbmNsdWRlCiAJQGlmIFsgIiQoZmluZHN0cmluZyBfY3MwYm9vdF8sICRAKSIgXSA7IHRoZW4gXAotCQllY2hvICIjZGVmaW5lIENPTkZJR19DUzBfQk9PVCIgPj4gLiQob2JqKS9pbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIENPTkZJR19DUzBfQk9PVCIgPj4gLiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJCWVjaG8gIi4uLiBjb25maWd1cmVkIGZvciBDUzAgYm9vdCI7IFwKIAllbGlmIFsgIiQoZmluZHN0cmluZyBfY3NfYXV0b2Jvb3RfLCAkQCkiIF0gOyB0aGVuIFwKLQkJZWNobyAiI2RlZmluZSBDT05GSUdfQ1NfQVVUT0JPT1QiID4+ICQob2JqKS4vaW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiI2RlZmluZSBDT05GSUdfQ1NfQVVUT0JPT1QiID4+ICQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJCWVjaG8gIi4uLiBjb25maWd1cmVkIGZvciBDU19BVVRPIGJvb3QiOyBcCiAJZWxzZSBcCi0JCWVjaG8gIiNkZWZpbmUgQ09ORklHX0NTM19CT09UIiA+PiAkKG9iaikuL2luY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgQ09ORklHX0NTM19CT09UIiA+PiAkKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCQllY2hvICIuLi4gY29uZmlndXJlZCBmb3IgQ1MzIGJvb3QiOyBcCiAJZmk7CiAJQCQoTUtDT05GSUcpIC1hICQoY2FsbCB4dHJhY3Rfb21hcDE2MTB4eHgsJEApIGFybSBhcm05MjZlanMgb21hcDE2MTBpbm4gTlVMTCBvbWFwCkBAIC0yMjA4LDExICsyMjUzLDEyIEBACiAKIHBkbmIzX2NvbmZpZyBcCiBzY3B1X2NvbmZpZzogICAgdW5jb25maWcKKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZQogCUBpZiBbICIkKGZpbmRzdHJpbmcgc2NwdV8sJEApIiBdIDsgdGhlbiBcCi0JCWVjaG8gIiNkZWZpbmUgQ09ORklHX1NDUFUiICAgICAgPj5pbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIENPTkZJR19TQ1BVIiAgICAgID4+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAkJZWNobyAiLi4uIG9uIFNDUFUgYm9hcmQgdmFyaWFudCIgOyBcCiAJZWxzZSBcCi0JCT5pbmNsdWRlL2NvbmZpZy5oIDsgXAorCQk+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAlmaQogCUAkKE1LQ09ORklHKSAtYSBwZG5iMyBhcm0gaXhwIHBkbmIzIHByb2RyaXZlCiAKQEAgLTI0MzQsMTQgKzI0ODAsMTYgQEAKIAlAJChNS0NPTkZJRykgLWEgJChAOl9jb25maWc9KSBtaWNyb2JsYXplIG1pY3JvYmxhemUgc3V6YWt1IEF0bWFya1RlY2hubwogCiBtbDQwMV9jb25maWc6CXVuY29uZmlnCi0JQCA+aW5jbHVkZS9jb25maWcuaAotCUBlY2hvICIjZGVmaW5lIENPTkZJR19NTDQwMSAxIiA+PiBpbmNsdWRlL2NvbmZpZy5oCi0JQC4vbWtjb25maWcgLWEgJChAOl9jb25maWc9KSBtaWNyb2JsYXplIG1pY3JvYmxhemUgbWw0MDEgeGlsaW54CisJQG1rZGlyIC1wICQob2JqKWluY2x1ZGUKKwlAID4kKG9iailpbmNsdWRlL2NvbmZpZy5oCisJQGVjaG8gIiNkZWZpbmUgQ09ORklHX01MNDAxIDEiID4+ICQob2JqKWluY2x1ZGUvY29uZmlnLmgKKwlAJChNS0NPTkZJRykgLWEgJChAOl9jb25maWc9KSBtaWNyb2JsYXplIG1pY3JvYmxhemUgbWw0MDEgeGlsaW54CiAKIHh1cHYycF9jb25maWc6CXVuY29uZmlnCi0JQCA+aW5jbHVkZS9jb25maWcuaAotCUBlY2hvICIjZGVmaW5lIENPTkZJR19YVVBWMlAgMSIgPj4gaW5jbHVkZS9jb25maWcuaAotCUAuL21rY29uZmlnIC1hICQoQDpfY29uZmlnPSkgbWljcm9ibGF6ZSBtaWNyb2JsYXplIHh1cHYycCB4aWxpbngKKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZQorCUAgPiQob2JqKWluY2x1ZGUvY29uZmlnLmgKKwlAZWNobyAiI2RlZmluZSBDT05GSUdfWFVQVjJQIDEiID4+ICQob2JqKWluY2x1ZGUvY29uZmlnLmgKKwlAJChNS0NPTkZJRykgLWEgJChAOl9jb25maWc9KSBtaWNyb2JsYXplIG1pY3JvYmxhemUgeHVwdjJwIHhpbGlueAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBCbGFja2ZpbgpAQCAtMjQ2Niw3ICsyNTE0LDcgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogYXRzdGsxMDAyX2NvbmZpZwk6CXVuY29uZmlnCi0JQC4vbWtjb25maWcgJChAOl9jb25maWc9KSBhdnIzMiBhdDMyYXAgYXRzdGsxMDAwIGF0bWVsIGF0MzJhcDcwMDAKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhdnIzMiBhdDMyYXAgYXRzdGsxMDAwIGF0bWVsIGF0MzJhcDcwMDAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IGI2NGJmYjIuLjI5MWIzMDQgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTIyOCwxMTMgKzIyOCw5IEBACiAKIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBuZWVkIHRvIGJlIGNvbmZpZ3VyZWQ6CiAKLS0gQ1BVIFR5cGU6CURlZmluZSBleGFjdGx5IG9uZSBvZgorLSBDUFUgVHlwZToJRGVmaW5lIGV4YWN0bHkgb25lLCBlLmcuIENPTkZJR19NUEM4NVhYLgogCi0JCVBvd2VyUEMgYmFzZWQgQ1BVczoKLQkJLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlDT05GSUdfTVBDODIzLAlDT05GSUdfTVBDODUwLAlDT05GSUdfTVBDODU1LAlDT05GSUdfTVBDODYwCi0Jb3IJQ09ORklHX01QQzV4eAotCW9yCUNPTkZJR19NUEM4MjIwCi0Jb3IJQ09ORklHX01QQzgyNFgsIENPTkZJR19NUEM4MjYwCi0Jb3IJQ09ORklHX01QQzg1eHgKLQlvcglDT05GSUdfSU9QNDgwCi0Jb3IJQ09ORklHXzQwNUdQCi0Jb3IJQ09ORklHXzQwNUVQCi0Jb3IJQ09ORklHXzQ0MAotCW9yCUNPTkZJR19NUEM3NHh4Ci0Jb3IJQ09ORklHXzc1MEZYCi0KLQkJQVJNIGJhc2VkIENQVXM6Ci0JCS0tLS0tLS0tLS0tLS0tLQotCQlDT05GSUdfU0ExMTEwCi0JCUNPTkZJR19BUk03Ci0JCUNPTkZJR19QWEEyNTAKLQkJQ09ORklHX0NQVV9NT05BSEFOUwotCi0JCU1pY3JvQmxhemUgYmFzZWQgQ1BVczoKLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlDT05GSUdfTUlDUk9CTEFaRQotCi0JCU5pb3MtMiBiYXNlZCBDUFVzOgotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUNPTkZJR19OSU9TMgotCi0JCUFWUjMyIGJhc2VkIENQVXM6Ci0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJQ09ORklHX0FUMzJBUAotCi0tIEJvYXJkIFR5cGU6CURlZmluZSBleGFjdGx5IG9uZSBvZgotCi0JCVBvd2VyUEMgYmFzZWQgYm9hcmRzOgotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCQlDT05GSUdfQURDSU9QCQlDT05GSUdfRlBTODYwTAkJQ09ORklHX09YQwotCQlDT05GSUdfQURTODYwCQlDT05GSUdfR0VOODYwVAkJQ09ORklHX1BDSTQwNQotCQlDT05GSUdfQU1YODYwCQlDT05GSUdfR0VOSUVUVgkJQ09ORklHX1BDSVBQQzIKLQkJQ09ORklHX0FQMTAwMAkJQ09ORklHX0dUSAkJQ09ORklHX1BDSVBQQzYKLQkJQ09ORklHX0FSNDA1CQlDT05GSUdfZ3c4MjYwCQlDT05GSUdfcGN1X2UKLQkJQ09ORklHX0JBQjd4eAkJQ09ORklHX2hlcm1lcwkJQ09ORklHX1BJUDQwNQotCQlDT05GSUdfQkMzNDUwCQlDT05GSUdfaHltb2QJCUNPTkZJR19QTTgyNgotCQlDT05GSUdfYzJtb24JCUNPTkZJR19JQUQyMTAJCUNPTkZJR19wcG1jODI2MAotCQlDT05GSUdfQ0FOQlQJCUNPTkZJR19JQ1U4NjIJCUNPTkZJR19RUzgyMwotCQlDT05GSUdfQ0NNCQlDT05GSUdfSVA4NjAJCUNPTkZJR19RUzg1MAotCQlDT05GSUdfQ01JCQlDT05GSUdfSVBIQVNFNDUzOQlDT05GSUdfUVM4NjBUCi0JCUNPTkZJR19jb2dlbnRfbXBjODI2MAlDT05GSUdfSVZNTDI0CQlDT05GSUdfUkJDODIzCi0JCUNPTkZJR19jb2dlbnRfbXBjOHh4CUNPTkZJR19JVk1MMjRfMTI4CUNPTkZJR19SUFhDbGFzc2ljCi0JCUNPTkZJR19DUENJNDA1CQlDT05GSUdfSVZNTDI0XzI1NglDT05GSUdfUlBYbGl0ZQotCQlDT05GSUdfQ1BDSTQwNTIJCUNPTkZJR19JVk1TOAkJQ09ORklHX1JQWHN1cGVyCi0JCUNPTkZJR19DUENJSVNFUjQJQ09ORklHX0lWTVM4XzEyOAlDT05GSUdfcnNkcHJvdG8KLQkJQ09ORklHX0NQVTg2CQlDT05GSUdfSVZNUzhfMjU2CUNPTkZJR19zYWNzbmcKLQkJQ09ORklHX0NSQVlMMQkJQ09ORklHX0pTRQkJQ09ORklHX1NhbmRwb2ludDgyNDAKLQkJQ09ORklHX0NTQjI3MgkJQ09ORklHX0xBTlRFQwkJQ09ORklHX1NhbmRwb2ludDgyNDUKLQkJQ09ORklHX0NVODI0CQlDT05GSUdfTElURTUyMDBCCUNPTkZJR19zYmM4MjYwCi0JCUNPTkZJR19EQVNBX1NJTQkJQ09ORklHX2x3bW9uCQlDT05GSUdfc2JjODU2MAotCQlDT05GSUdfREI2NDM2MAkJQ09ORklHX01CWAkJQ09ORklHX1NNODUwCi0JCUNPTkZJR19EQjY0NDYwCQlDT05GSUdfTUJYODYwVAkJQ09ORklHX1NQRDgyM1RTCi0JCUNPTkZJR19EVTQwNQkJQ09ORklHX01IUEMJCUNPTkZJR19TVFhHUDMKLQkJQ09ORklHX0RVRVRfQURTCQlDT05GSUdfTUlQNDA1CQlDT05GSUdfU1hOSTg1NVQKLQkJQ09ORklHX0VCT05ZCQlDT05GSUdfTU9VU1NFCQlDT05GSUdfVFFNODIzTAotCQlDT05GSUdfRUxQUEMJCUNPTkZJR19NUEM4MjYwQURTCUNPTkZJR19UUU04MjYwCi0JCUNPTkZJR19FTFBUODYwCQlDT05GSUdfTVBDODU0MEFEUwlDT05GSUdfVFFNODUwTAotCQlDT05GSUdfZXA4MjYwCQlDT05GSUdfTVBDODU0MEVWQUwJQ09ORklHX1RRTTg1NUwKLQkJQ09ORklHX0VSSUMJCUNPTkZJR19NUEM4NTYwQURTCUNPTkZJR19UUU04NjBMCi0JCUNPTkZJR19FU1RFRU0xOTJFCUNPTkZJR19NVVNFTktJCQlDT05GSUdfVFRUZWNoCi0JCUNPTkZJR19FVFgwOTQJCUNPTkZJR19NVlMxCQlDT05GSUdfVVRYODI0NQotCQlDT05GSUdfRVZCNjQyNjAJCUNPTkZJR19ORVRQSE9ORQkJQ09ORklHX1YzNwotCQlDT05GSUdfRkFEUzgyMwkJQ09ORklHX05FVFRBCQlDT05GSUdfVzdPTE1DCi0JCUNPTkZJR19GQURTODUwU0FSCUNPTkZJR19ORVRWSUEJCUNPTkZJR19XN09MTUcKLQkJQ09ORklHX0ZBRFM4NjBUCQlDT05GSUdfTlg4MjMJCUNPTkZJR19XQUxOVVQKLQkJQ09ORklHX0ZMQUdBRE0JCUNPTkZJR19PQ1JUQwkJQ09ORklHX1pQQzE5MDAKLQkJQ09ORklHX0ZQUzg1MEwJCUNPTkZJR19PUlNHCQlDT05GSUdfWlVNQQotCi0JCUFSTSBiYXNlZCBib2FyZHM6Ci0JCS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkJQ09ORklHX0FSTUFESUxMTywJQ09ORklHX0FUOTFSTTkyMDBESywJQ09ORklHX0NFUkYyNTAsCi0JCUNPTkZJR19DU0I2MzcsCQlDT05GSUdfREVMVEEsCQlDT05GSUdfRE5QMTExMCwKLQkJQ09ORklHX0VQNzMxMiwJCUNPTkZJR19IMl9PTUFQMTYxMCwJQ09ORklHX0hIUF9DUkFETEUsCi0JCUNPTkZJR19JTVBBNywJICAgIENPTkZJR19JTk5PVkFUT1JPTUFQMTUxMCwJQ09ORklHX0lOTk9WQVRPUk9NQVAxNjEwLAotCQlDT05GSUdfS0I5MjAyLAkJQ09ORklHX0xBUlQsCQlDT05GSUdfTFBEN0E0MDAsCi0JCUNPTkZJR19MVUJCT0NLLAkJQ09ORklHX09TS19PTUFQNTkxMiwJQ09ORklHX09NQVAyNDIwSDQsCi0JCUNPTkZJR19QTEVCMiwJCUNPTkZJR19TSEFOTk9OLAkJQ09ORklHX1AyX09NQVA3MzAsCi0JCUNPTkZJR19TTURLMjQwMCwJQ09ORklHX1NNREsyNDEwLAlDT05GSUdfVFJBQiwKLQkJQ09ORklHX1ZDTUE5Ci0KLQkJTWljcm9CbGF6ZSBiYXNlZCBib2FyZHM6Ci0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JCUNPTkZJR19TVVpBS1UKLQotCQlOaW9zLTIgYmFzZWQgYm9hcmRzOgotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCQlDT05GSUdfUENJNTQ0MSBDT05GSUdfUEsxQzIwCi0JCUNPTkZJR19FUDFDMjAgQ09ORklHX0VQMVMxMCBDT05GSUdfRVAxUzQwCi0KLQkJQVZSMzIgYmFzZWQgYm9hcmRzOgotCQktLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkJQ09ORklHX0FUU1RLMTAwMAorLSBCb2FyZCBUeXBlOglEZWZpbmUgZXhhY3RseSBvbmUsIGUuZy4gQ09ORklHX01QQzg1NDBBRFMuCiAKIC0gQ1BVIERhdWdodGVyYm9hcmQgVHlwZTogKGlmIENPTkZJR19BVFNUSzEwMDAgaXMgZGVmaW5lZCkKIAkJRGVmaW5lIGV4YWN0bHkgb25lIG9mCkBAIC01NDEsNyArNDM3LDcgQEAKIAkJCUNGR19DT05TT0xFX0JMSU5LX0NPVU5UIGJsaW5rIGludGVydmFsIChjZi4gaTgwNDIuYykKIAkJCUNPTkZJR19DT05TT0xFX1RJTUUJZGlzcGxheSB0aW1lL2RhdGUgaW5mbyBpbgogCQkJCQkJdXBwZXIgcmlnaHQgY29ybmVyCi0JCQkJCQkocmVxdWlyZXMgQ0ZHX0NNRF9EQVRFKQorCQkJCQkJKHJlcXVpcmVzIENPTkZJR19DTURfREFURSkKIAkJCUNPTkZJR19WSURFT19MT0dPCWRpc3BsYXkgTGludXggbG9nbyBpbgogCQkJCQkJdXBwZXIgbGVmdCBjb3JuZXIKIAkJCUNPTkZJR19WSURFT19CTVBfTE9HTwl1c2UgYm1wX2xvZ28uaCBpbnN0ZWFkIG9mCkBAIC02NDUsMTAzICs1NDEsOTYgQEAKIAkJdGltZSBvbiBvdGhlcnMuIFRoaXMgc2V0dGluZyAjZGVmaW5lJ3MgdGhlIGluaXRpYWwKIAkJdmFsdWUgb2YgdGhlICJsb2Fkc19lY2hvIiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KIAotLSBLZ2RiIFNlcmlhbCBCYXVkcmF0ZTogKGlmIENGR19DTURfS0dEQiBpcyBkZWZpbmVkKQorLSBLZ2RiIFNlcmlhbCBCYXVkcmF0ZTogKGlmIENPTkZJR19DTURfS0dEQiBpcyBkZWZpbmVkKQogCQlDT05GSUdfS0dEQl9CQVVEUkFURQogCQlTZWxlY3Qgb25lIG9mIHRoZSBiYXVkcmF0ZXMgbGlzdGVkIGluCiAJCUNGR19CQVVEUkFURV9UQUJMRSwgc2VlIGJlbG93LgogCiAtIE1vbml0b3IgRnVuY3Rpb25zOgotCQlDT05GSUdfQ09NTUFORFMKLQkJTW9zdCBtb25pdG9yIGZ1bmN0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgKG9yCi0JCWRlLXNlbGVjdGVkKSBieSBhZGp1c3RpbmcgdGhlIGRlZmluaXRpb24gb2YKLQkJQ09ORklHX0NPTU1BTkRTOyB0byBzZWxlY3QgaW5kaXZpZHVhbCBmdW5jdGlvbnMsCi0JCSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIGJ5ICJPUiJpbmcgYW55IG9mIHRoZQotCQlmb2xsb3dpbmcgdmFsdWVzOgorCQlNb25pdG9yIGNvbW1hbmRzIGNhbiBiZSBpbmNsdWRlZCBvciBleGNsdWRlZAorCQlmcm9tIHRoZSBidWlsZCBieSB1c2luZyB0aGUgI2luY2x1ZGUgZmlsZXMKKwkJImNvbmZpZ19jbWRfYWxsLmgiIGFuZCAjdW5kZWYnaW5nIHVud2FudGVkCisJCWNvbW1hbmRzLCBvciB1c2luZyAiY29uZmlnX2NtZF9kZWZhdWx0LmgiCisJCWFuZCBhdWdtZW50aW5nIHdpdGggYWRkaXRpb25hbCAjZGVmaW5lJ3MKKwkJZm9yIHdhbnRlZCBjb21tYW5kcy4KIAotCQkjZGVmaW5lIGVuYWJsZXMgY29tbWFuZHM6Ci0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJQ0ZHX0NNRF9BU0tFTlYJKiBhc2sgZm9yIGVudiB2YXJpYWJsZQotCQlDRkdfQ01EX0FVVE9TQ1JJUFQgQXV0b3NjcmlwdCBTdXBwb3J0Ci0JCUNGR19DTURfQkRJCSAgYmRpbmZvCi0JCUNGR19DTURfQkVEQlVHCSogSW5jbHVkZSBCZWRCdWcgRGVidWdnZXIKLQkJQ0ZHX0NNRF9CTVAJKiBCTVAgc3VwcG9ydAotCQlDRkdfQ01EX0JTUAkqIEJvYXJkIHNwZWNpZmljIGNvbW1hbmRzCi0JCUNGR19DTURfQk9PVEQJICBib290ZAotCQlDRkdfQ01EX0NBQ0hFCSogaWNhY2hlLCBkY2FjaGUKLQkJQ0ZHX0NNRF9DT05TT0xFCSAgY29uaW5mbwotCQlDRkdfQ01EX0RBVEUJKiBzdXBwb3J0IGZvciBSVEMsIGRhdGUvdGltZS4uLgotCQlDRkdfQ01EX0RIQ1AJKiBESENQIHN1cHBvcnQKLQkJQ0ZHX0NNRF9ESUFHCSogRGlhZ25vc3RpY3MKLQkJQ0ZHX0NNRF9ET0MJKiBEaXNrLU9uLUNoaXAgU3VwcG9ydAotCQlDRkdfQ01EX0RUVAkqIERpZ2l0YWwgVGhlcm0gYW5kIFRoZXJtb3N0YXQKLQkJQ0ZHX0NNRF9FQ0hPCSAgZWNobyBhcmd1bWVudHMKLQkJQ0ZHX0NNRF9FRVBST00JKiBFRVBST00gcmVhZC93cml0ZSBzdXBwb3J0Ci0JCUNGR19DTURfRUxGCSogYm9vdGVsZiwgYm9vdHZ4Ci0JCUNGR19DTURfRU5WCSAgc2F2ZWVudgotCQlDRkdfQ01EX0ZEQwkqIEZsb3BweSBEaXNrIFN1cHBvcnQKLQkJQ0ZHX0NNRF9GQVQJKiBGQVQgcGFydGl0aW9uIHN1cHBvcnQKLQkJQ0ZHX0NNRF9GRE9TCSogRG9zIGRpc2tldHRlIFN1cHBvcnQKLQkJQ0ZHX0NNRF9GTEFTSAkgIGZsaW5mbywgZXJhc2UsIHByb3RlY3QKLQkJQ0ZHX0NNRF9GUEdBCSAgRlBHQSBkZXZpY2UgaW5pdGlhbGl6YXRpb24gc3VwcG9ydAotCQlDRkdfQ01EX0hXRkxPVwkqIFJUUy9DVFMgaHcgZmxvdyBjb250cm9sCi0JCUNGR19DTURfSTJDCSogSTJDIHNlcmlhbCBidXMgc3VwcG9ydAotCQlDRkdfQ01EX0lERQkqIElERSBoYXJkZGlzayBzdXBwb3J0Ci0JCUNGR19DTURfSU1JCSAgaW1pbmZvCi0JCUNGR19DTURfSU1MUwkgIExpc3QgYWxsIGZvdW5kIGltYWdlcwotCQlDRkdfQ01EX0lNTUFQCSogSU1NUiBkdW1wIHN1cHBvcnQKLQkJQ0ZHX0NNRF9JUlEJKiBpcnFpbmZvCi0JCUNGR19DTURfSVRFU1QJICBJbnRlZ2VyL3N0cmluZyB0ZXN0IG9mIDIgdmFsdWVzCi0JCUNGR19DTURfSkZGUzIJKiBKRkZTMiBTdXBwb3J0Ci0JCUNGR19DTURfS0dEQgkqIGtnZGIKLQkJQ0ZHX0NNRF9MT0FEQgkgIGxvYWRiCi0JCUNGR19DTURfTE9BRFMJICBsb2FkcwotCQlDRkdfQ01EX01FTU9SWQkgIG1kLCBtbSwgbm0sIG13LCBjcCwgY21wLCBjcmMsIGJhc2UsCi0JCQkJICBsb29wLCBsb29wdywgbXRlc3QKLQkJQ0ZHX0NNRF9NSVNDCSAgTWlzYyBmdW5jdGlvbnMgbGlrZSBzbGVlcCBldGMKLQkJQ0ZHX0NNRF9NTUMJKiBNTUMgbWVtb3J5IG1hcHBlZCBzdXBwb3J0Ci0JCUNGR19DTURfTUlJCSogTUlJIHV0aWxpdHkgY29tbWFuZHMKLQkJQ0ZHX0NNRF9OQU5ECSogTkFORCBzdXBwb3J0Ci0JCUNGR19DTURfTkVUCSAgYm9vdHAsIHRmdHBib290LCByYXJwYm9vdAotCQlDRkdfQ01EX1BDSQkqIHBjaWluZm8KLQkJQ0ZHX0NNRF9QQ01DSUEJKiBQQ01DSUEgc3VwcG9ydAotCQlDRkdfQ01EX1BJTkcJKiBzZW5kIElDTVAgRUNIT19SRVFVRVNUIHRvIG5ldHdvcmsgaG9zdAotCQlDRkdfQ01EX1BPUlRJTwkqIFBvcnQgSS9PCi0JCUNGR19DTURfUkVHSU5GTyAqIFJlZ2lzdGVyIGR1bXAKLQkJQ0ZHX0NNRF9SVU4JICBydW4gY29tbWFuZCBpbiBlbnYgdmFyaWFibGUKLQkJQ0ZHX0NNRF9TQVZFUwkqIHNhdmUgUyByZWNvcmQgZHVtcAotCQlDRkdfQ01EX1NDU0kJKiBTQ1NJIFN1cHBvcnQKLQkJQ0ZHX0NNRF9TRFJBTQkqIHByaW50IFNEUkFNIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLQkJCQkgIChyZXF1aXJlcyBDRkdfQ01EX0kyQykKLQkJQ0ZHX0NNRF9TRVRHRVREQ1IgU3VwcG9ydCBmb3IgRENSIFJlZ2lzdGVyIGFjY2VzcyAoNHh4IG9ubHkpCi0JCUNGR19DTURfU1BJCSogU1BJIHNlcmlhbCBidXMgc3VwcG9ydAotCQlDRkdfQ01EX1VTQgkqIFVTQiBzdXBwb3J0Ci0JCUNGR19DTURfVkZECSogVkZEIHN1cHBvcnQgKFRSQUIpCi0JCUNGR19DTURfQlNQCSogQm9hcmQgU1BlY2lmaWMgZnVuY3Rpb25zCi0JCUNGR19DTURfQ0RQCSogQ2lzY28gRGlzY292ZXIgUHJvdG9jb2wgc3VwcG9ydAotCQlDRkdfQ01EX0ZTTAkqIE1pY3JvYmxhemUgRlNMIHN1cHBvcnQKLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJQ0ZHX0NNRF9BTEwJYWxsCisJCVRoZSBkZWZhdWx0IGNvbW1hbmQgY29uZmlndXJhdGlvbiBpbmNsdWRlcyBhbGwgY29tbWFuZHMKKwkJZXhjZXB0IHRob3NlIG1hcmtlZCBiZWxvdyB3aXRoIGEgIioiLgogCi0JCUNPTkZJR19DTURfREZMCURlZmF1bHQgY29uZmlndXJhdGlvbjsgYXQgdGhlIG1vbWVudAotCQkJCXRoaXMgaXMgaW5jbHVkZXMgYWxsIGNvbW1hbmRzLCBleGNlcHQKLQkJCQl0aGUgb25lcyBtYXJrZWQgd2l0aCAiKiIgaW4gdGhlIGxpc3QKLQkJCQlhYm92ZS4KKwkJQ09ORklHX0NNRF9BU0tFTlYJKiBhc2sgZm9yIGVudiB2YXJpYWJsZQorCQlDT05GSUdfQ01EX0FVVE9TQ1JJUFQJICBBdXRvc2NyaXB0IFN1cHBvcnQKKwkJQ09ORklHX0NNRF9CREkJCSAgYmRpbmZvCisJCUNPTkZJR19DTURfQkVEQlVHCSogSW5jbHVkZSBCZWRCdWcgRGVidWdnZXIKKwkJQ09ORklHX0NNRF9CTVAJCSogQk1QIHN1cHBvcnQKKwkJQ09ORklHX0NNRF9CU1AJCSogQm9hcmQgc3BlY2lmaWMgY29tbWFuZHMKKwkJQ09ORklHX0NNRF9CT09URAkgIGJvb3RkCisJCUNPTkZJR19DTURfQ0FDSEUJKiBpY2FjaGUsIGRjYWNoZQorCQlDT05GSUdfQ01EX0NPTlNPTEUJICBjb25pbmZvCisJCUNPTkZJR19DTURfREFURQkJKiBzdXBwb3J0IGZvciBSVEMsIGRhdGUvdGltZS4uLgorCQlDT05GSUdfQ01EX0RIQ1AJCSogREhDUCBzdXBwb3J0CisJCUNPTkZJR19DTURfRElBRwkJKiBEaWFnbm9zdGljcworCQlDT05GSUdfQ01EX0RPQwkJKiBEaXNrLU9uLUNoaXAgU3VwcG9ydAorCQlDT05GSUdfQ01EX0RUVAkJKiBEaWdpdGFsIFRoZXJtIGFuZCBUaGVybW9zdGF0CisJCUNPTkZJR19DTURfRUNITwkJICBlY2hvIGFyZ3VtZW50cworCQlDT05GSUdfQ01EX0VFUFJPTQkqIEVFUFJPTSByZWFkL3dyaXRlIHN1cHBvcnQKKwkJQ09ORklHX0NNRF9FTEYJCSogYm9vdGVsZiwgYm9vdHZ4CisJCUNPTkZJR19DTURfRU5WCQkgIHNhdmVlbnYKKwkJQ09ORklHX0NNRF9GREMJCSogRmxvcHB5IERpc2sgU3VwcG9ydAorCQlDT05GSUdfQ01EX0ZBVAkJKiBGQVQgcGFydGl0aW9uIHN1cHBvcnQKKwkJQ09ORklHX0NNRF9GRE9TCQkqIERvcyBkaXNrZXR0ZSBTdXBwb3J0CisJCUNPTkZJR19DTURfRkxBU0gJICBmbGluZm8sIGVyYXNlLCBwcm90ZWN0CisJCUNPTkZJR19DTURfRlBHQQkJICBGUEdBIGRldmljZSBpbml0aWFsaXphdGlvbiBzdXBwb3J0CisJCUNPTkZJR19DTURfSFdGTE9XCSogUlRTL0NUUyBodyBmbG93IGNvbnRyb2wKKwkJQ09ORklHX0NNRF9JMkMJCSogSTJDIHNlcmlhbCBidXMgc3VwcG9ydAorCQlDT05GSUdfQ01EX0lERQkJKiBJREUgaGFyZGRpc2sgc3VwcG9ydAorCQlDT05GSUdfQ01EX0lNSQkJICBpbWluZm8KKwkJQ09ORklHX0NNRF9JTUxTCQkgIExpc3QgYWxsIGZvdW5kIGltYWdlcworCQlDT05GSUdfQ01EX0lNTUFQCSogSU1NUiBkdW1wIHN1cHBvcnQKKwkJQ09ORklHX0NNRF9JUlEJCSogaXJxaW5mbworCQlDT05GSUdfQ01EX0lURVNUCSAgSW50ZWdlci9zdHJpbmcgdGVzdCBvZiAyIHZhbHVlcworCQlDT05GSUdfQ01EX0pGRlMyCSogSkZGUzIgU3VwcG9ydAorCQlDT05GSUdfQ01EX0tHREIJCSoga2dkYgorCQlDT05GSUdfQ01EX0xPQURCCSAgbG9hZGIKKwkJQ09ORklHX0NNRF9MT0FEUwkgIGxvYWRzCisJCUNPTkZJR19DTURfTUVNT1JZCSAgbWQsIG1tLCBubSwgbXcsIGNwLCBjbXAsIGNyYywgYmFzZSwKKwkJCQkJICBsb29wLCBsb29wdywgbXRlc3QKKwkJQ09ORklHX0NNRF9NSVNDCQkgIE1pc2MgZnVuY3Rpb25zIGxpa2Ugc2xlZXAgZXRjCisJCUNPTkZJR19DTURfTU1DCQkqIE1NQyBtZW1vcnkgbWFwcGVkIHN1cHBvcnQKKwkJQ09ORklHX0NNRF9NSUkJCSogTUlJIHV0aWxpdHkgY29tbWFuZHMKKwkJQ09ORklHX0NNRF9OQU5ECQkqIE5BTkQgc3VwcG9ydAorCQlDT05GSUdfQ01EX05FVAkJICBib290cCwgdGZ0cGJvb3QsIHJhcnBib290CisJCUNPTkZJR19DTURfUENJCQkqIHBjaWluZm8KKwkJQ09ORklHX0NNRF9QQ01DSUEJCSogUENNQ0lBIHN1cHBvcnQKKwkJQ09ORklHX0NNRF9QSU5HCQkqIHNlbmQgSUNNUCBFQ0hPX1JFUVVFU1QgdG8gbmV0d29yaworCQkJCQkgIGhvc3QKKwkJQ09ORklHX0NNRF9QT1JUSU8JKiBQb3J0IEkvTworCQlDT05GSUdfQ01EX1JFR0lORk8JKiBSZWdpc3RlciBkdW1wCisJCUNPTkZJR19DTURfUlVOCQkgIHJ1biBjb21tYW5kIGluIGVudiB2YXJpYWJsZQorCQlDT05GSUdfQ01EX1NBVkVTCSogc2F2ZSBTIHJlY29yZCBkdW1wCisJCUNPTkZJR19DTURfU0NTSQkJKiBTQ1NJIFN1cHBvcnQKKwkJQ09ORklHX0NNRF9TRFJBTQkqIHByaW50IFNEUkFNIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKwkJCQkJICAocmVxdWlyZXMgQ09ORklHX0NNRF9JMkMpCisJCUNPTkZJR19DTURfU0VUR0VURENSCSAgU3VwcG9ydCBmb3IgRENSIFJlZ2lzdGVyIGFjY2VzcworCQkJCQkgICg0eHggb25seSkKKwkJQ09ORklHX0NNRF9TUEkJCSogU1BJIHNlcmlhbCBidXMgc3VwcG9ydAorCQlDT05GSUdfQ01EX1VTQgkJKiBVU0Igc3VwcG9ydAorCQlDT05GSUdfQ01EX1ZGRAkJKiBWRkQgc3VwcG9ydCAoVFJBQikKKwkJQ09ORklHX0NNRF9CU1AJCSogQm9hcmQgU1BlY2lmaWMgZnVuY3Rpb25zCisJCUNPTkZJR19DTURfQ0RQCQkqIENpc2NvIERpc2NvdmVyIFByb3RvY29sIHN1cHBvcnQKKwkJQ09ORklHX0NNRF9GU0wJCSogTWljcm9ibGF6ZSBGU0wgc3VwcG9ydAogCi0JCUlmIHlvdSBkb24ndCBkZWZpbmUgQ09ORklHX0NPTU1BTkRTIGl0IGRlZmF1bHRzIHRvCi0JCUNPTkZJR19DTURfREZMIGluIGluY2x1ZGUvY21kX2NvbmZkZWZzLmguIEEgYm9hcmQgY2FuCi0JCW92ZXJyaWRlIHRoZSBkZWZhdWx0IHNldHRpbmdzIGluIHRoZSByZXNwZWN0aXZlCi0JCWluY2x1ZGUgZmlsZS4KIAogCQlFWEFNUExFOiBJZiB5b3Ugd2FudCBhbGwgZnVuY3Rpb25zIGV4Y2VwdCBvZiBuZXR3b3JrCiAJCXN1cHBvcnQgeW91IGNhbiB3cml0ZToKIAotCQkjZGVmaW5lIENPTkZJR19DT01NQU5EUyAoQ0ZHX0NNRF9BTEwgJiB+Q0ZHX0NNRF9ORVQpCisJCSNpbmNsdWRlICJjb25maWdfY21kX2FsbC5oIgorCQkjdW5kZWYgQ09ORklHX0NNRF9ORVQKIAogCU90aGVyIENvbW1hbmRzOgogCQlmZHQgKGZsYXR0ZW5lZCBkZXZpY2UgdHJlZSkgY29tbWFuZDogQ09ORklHX09GX0xJQkZEVAogCiAJTm90ZToJRG9uJ3QgZW5hYmxlIHRoZSAiaWNhY2hlIiBhbmQgImRjYWNoZSIgY29tbWFuZHMKLQkJKGNvbmZpZ3VyYXRpb24gb3B0aW9uIENGR19DTURfQ0FDSEUpIHVubGVzcyB5b3Uga25vdworCQkoY29uZmlndXJhdGlvbiBvcHRpb24gQ09ORklHX0NNRF9DQUNIRSkgdW5sZXNzIHlvdSBrbm93CiAJCXdoYXQgeW91IChhbmQgeW91ciBVLUJvb3QgdXNlcnMpIGFyZSBkb2luZy4gRGF0YQogCQljYWNoZSBjYW5ub3QgYmUgZW5hYmxlZCBvbiBzeXN0ZW1zIGxpa2UgdGhlIDh4eCBvcgogCQk4MjYwICh3aGVyZSBhY2Nlc3NlcyB0byB0aGUgSU1NUiByZWdpb24gbXVzdCBiZQpAQCAtNzY5LDcgKzY1OCw3IEBACiAKIC0gUmVhbC1UaW1lIENsb2NrOgogCi0JCVdoZW4gQ0ZHX0NNRF9EQVRFIGlzIHNlbGVjdGVkLCB0aGUgdHlwZSBvZiB0aGUgUlRDCisJCVdoZW4gQ09ORklHX0NNRF9EQVRFIGlzIHNlbGVjdGVkLCB0aGUgdHlwZSBvZiB0aGUgUlRDCiAJCWhhcyB0byBiZSBzZWxlY3RlZCwgdG9vLiBEZWZpbmUgZXhhY3RseSBvbmUgb2YgdGhlCiAJCWZvbGxvd2luZyBvcHRpb25zOgogCkBAIC03OTAsMTQgKzY3OSwxNCBAQAogCQlXaGVuIENPTkZJR19USU1FU1RBTVAgaXMgc2VsZWN0ZWQsIHRoZSB0aW1lc3RhbXAKIAkJKGRhdGUgYW5kIHRpbWUpIG9mIGFuIGltYWdlIGlzIHByaW50ZWQgYnkgaW1hZ2UKIAkJY29tbWFuZHMgbGlrZSBib290bSBvciBpbWluZm8uIFRoaXMgb3B0aW9uIGlzCi0JCWF1dG9tYXRpY2FsbHkgZW5hYmxlZCB3aGVuIHlvdSBzZWxlY3QgQ0ZHX0NNRF9EQVRFIC4KKwkJYXV0b21hdGljYWxseSBlbmFibGVkIHdoZW4geW91IHNlbGVjdCBDT05GSUdfQ01EX0RBVEUgLgogCiAtIFBhcnRpdGlvbiBTdXBwb3J0OgogCQlDT05GSUdfTUFDX1BBUlRJVElPTiBhbmQvb3IgQ09ORklHX0RPU19QQVJUSVRJT04KIAkJYW5kL29yIENPTkZJR19JU09fUEFSVElUSU9OCiAKLQkJSWYgSURFIG9yIFNDU0kgc3VwcG9ydAlpcyAgZW5hYmxlZCAgKENGR19DTURfSURFICBvcgotCQlDRkdfQ01EX1NDU0kpIHlvdSBtdXN0IGNvbmZpZ3VyZSBzdXBwb3J0IGZvciBhdCBsZWFzdAorCQlJZiBJREUgb3IgU0NTSSBzdXBwb3J0CWlzICBlbmFibGVkICAoQ09ORklHX0NNRF9JREUgb3IKKwkJQ09ORklHX0NNRF9TQ1NJKSB5b3UgbXVzdCBjb25maWd1cmUgc3VwcG9ydCBmb3IgYXQgbGVhc3QKIAkJb25lIHBhcnRpdGlvbiB0eXBlIGFzIHdlbGwuCiAKIC0gSURFIFJlc2V0IG1ldGhvZDoKQEAgLTkwMCw2ICs3ODksNzEgQEAKIAkJCUNPTkZJR19VU0JfQ09ORklHCiAJCQkJZm9yIGRpZmZlcmVudGlhbCBkcml2ZXJzOiAweDAwMDAxMDAwCiAJCQkJZm9yIHNpbmdsZSBlbmRlZCBkcml2ZXJzOiAweDAwMDA1MDAwCisJCQlDRkdfVVNCX0VWRU5UX1BPTEwKKwkJCQlNYXkgYmUgZGVmaW5lZCB0byBhbGxvdyBpbnRlcnJ1cHQgcG9sbGluZworCQkJCWluc3RlYWQgb2YgdXNpbmcgYXN5bmNocm9ub3VzIGludGVycnVwdHMKKworLSBVU0IgRGV2aWNlOgorCQlEZWZpbmUgdGhlIGJlbG93IGlmIHlvdSB3aXNoIHRvIHVzZSB0aGUgVVNCIGNvbnNvbGUuCisJCU9uY2UgZmlybXdhcmUgaXMgcmVidWlsdCBmcm9tIGEgc2VyaWFsIGNvbnNvbGUgaXNzdWUgdGhlCisJCWNvbW1hbmQgInNldGVudiBzdGRpbiB1c2J0dHk7IHNldGVudiBzdGRvdXQgdXNidHR5IiBhbmQKKwkJYXR0YWNoIHlvdXIgdXNiIGNhYmxlLiBUaGUgVW5peCBjb21tYW5kICJkbWVzZyIgc2hvdWxkIHByaW50CisJCWl0IGhhcyBmb3VuZCBhIG5ldyBkZXZpY2UuIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB1c2J0dHkKKwkJY2FuIGJlIHNldCB0byBnc2VyaWFsIG9yIGNkY19hY20gdG8gZW5hYmxlIHlvdXIgZGV2aWNlIHRvCisJCWFwcGVhciB0byBhIFVTQiBob3N0IGFzIGEgTGludXggZ3NlcmlhbCBkZXZpY2Ugb3IgYQorCQlDb21tb24gRGV2aWNlIENsYXNzIEFic3RyYWN0IENvbnRyb2wgTW9kZWwgc2VyaWFsIGRldmljZS4KKwkJSWYgeW91IHNlbGVjdCB1c2J0dHkgPSBnc2VyaWFsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBlbnVtZXJhdGUKKwkJYSBMaW51eCBob3N0IGJ5CisJCSMgbW9kcHJvYmUgdXNic2VyaWFsIHZlbmRvcj0weFZlbmRvcklEIHByb2R1Y3Q9MHhQcm9kdWN0SUQKKwkJZWxzZSBpZiB1c2luZyBjZGNfYWNtLCBzaW1wbHkgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQKKwkJdmFyaWFibGUgdXNidHR5IHRvIGJlIGNkY19hY20gc2hvdWxkIHN1ZmZpY2UuIFRoZSBmb2xsb3dpbmcKKwkJbWlnaHQgYmUgZGVmaW5lZCBpbiBZb3VyQm9hcmROYW1lLmgKKworCQkJQ09ORklHX1VTQl9ERVZJQ0UKKwkJCURlZmluZSB0aGlzIHRvIGJ1aWxkIGEgVURDIGRldmljZQorCisJCQlDT05GSUdfVVNCX1RUWQorCQkJRGVmaW5lIHRoaXMgdG8gaGF2ZSBhIHR0eSB0eXBlIG9mIGRldmljZSBhdmFpbGFibGUgdG8KKwkJCXRhbGsgdG8gdGhlIFVEQyBkZXZpY2UKKworCQkJQ0ZHX0NPTlNPTEVfSVNfSU5fRU5WCisJCQlEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCBzdGRpbiwgc3Rkb3V0ICYvb3Igc3RkZXJyIHRvCisJCQliZSBzZXQgdG8gdXNidHR5LgorCisJCQltcGM4eHg6CisJCQkJQ0ZHX1VTQl9FWFRDX0NMSyAweEJMQUgKKwkJCQlEZXJpdmUgVVNCIGNsb2NrIGZyb20gZXh0ZXJuYWwgY2xvY2sgImJsYWgiCisJCQkJLSBDRkdfVVNCX0VYVENfQ0xLIDB4MDIKKworCQkJCUNGR19VU0JfQlJHX0NMSyAweEJMQUgKKwkJCQlEZXJpdmUgVVNCIGNsb2NrIGZyb20gYnJnY2xrCisJCQkJLSBDRkdfVVNCX0JSR19DTEsgMHgwNAorCisJCUlmIHlvdSBoYXZlIGEgVVNCLUlGIGFzc2lnbmVkIFZlbmRvcklEIHRoZW4geW91IG1heSB3aXNoIHRvCisJCWRlZmluZSB5b3VyIG93biB2ZW5kb3Igc3BlY2lmaWMgdmFsdWVzIGVpdGhlciBpbiBCb2FyZE5hbWUuaAorCQlvciBkaXJlY3RseSBpbiB1c2JkX3ZlbmRvcl9pbmZvLmguIElmIHlvdSBkb24ndCBkZWZpbmUKKwkJQ09ORklHX1VTQkRfTUFOVUZBQ1RVUkVSLCBDT05GSUdfVVNCRF9QUk9EVUNUX05BTUUsCisJCUNPTkZJR19VU0JEX1ZFTkRPUklEIGFuZCBDT05GSUdfVVNCRF9QUk9EVUNUSUQsIHRoZW4gVS1Cb290CisJCXNob3VsZCBwcmV0ZW5kIHRvIGJlIGEgTGludXggZGV2aWNlIHRvIGl0J3MgdGFyZ2V0IGhvc3QuCisKKwkJCUNPTkZJR19VU0JEX01BTlVGQUNUVVJFUgorCQkJRGVmaW5lIHRoaXMgc3RyaW5nIGFzIHRoZSBuYW1lIG9mIHlvdXIgY29tcGFueSBmb3IKKwkJCS0gQ09ORklHX1VTQkRfTUFOVUZBQ1RVUkVSICJteSBjb21wYW55IgorCisJCQlDT05GSUdfVVNCRF9QUk9EVUNUX05BTUUKKwkJCURlZmluZSB0aGlzIHN0cmluZyBhcyB0aGUgbmFtZSBvZiB5b3VyIHByb2R1Y3QKKwkJCS0gQ09ORklHX1VTQkRfUFJPRFVDVF9OQU1FICJhY21lIHVzYiBkZXZpY2UiCisKKwkJCUNPTkZJR19VU0JEX1ZFTkRPUklECisJCQlEZWZpbmUgdGhpcyBhcyB5b3VyIGFzc2lnbmVkIFZlbmRvciBJRCBmcm9tIHRoZSBVU0IKKwkJCUltcGxlbWVudG9ycyBGb3J1bS4gVGhpcyAqbXVzdCogYmUgYSBnZW51aW5lIFZlbmRvciBJRAorCQkJdG8gYXZvaWQgcG9sbHV0aW5nIHRoZSBVU0IgbmFtZXNwYWNlLgorCQkJLSBDT05GSUdfVVNCRF9WRU5ET1JJRCAweEZGRkYKKworCQkJQ09ORklHX1VTQkRfUFJPRFVDVElECisJCQlEZWZpbmUgdGhpcyBhcyB0aGUgdW5pcXVlIFByb2R1Y3QgSUQKKwkJCWZvciB5b3VyIGRldmljZQorCQkJLSBDT05GSUdfVVNCRF9QUk9EVUNUSUQgMHhGRkZGCiAKIAogLSBNTUMgU3VwcG9ydDoKQEAgLTkwNyw4ICs4NjEsOCBAQAogCQllbmFibGUgdGhpcyBkZWZpbmUgQ09ORklHX01NQy4gVGhlIE1NQyBjYW4gYmUKIAkJYWNjZXNzZWQgZnJvbSB0aGUgYm9vdCBwcm9tcHQgYnkgbWFwcGluZyB0aGUgZGV2aWNlCiAJCXRvIHBoeXNpY2FsIG1lbW9yeSBzaW1pbGFyIHRvIGZsYXNoLiBDb21tYW5kIGxpbmUgaXMKLQkJZW5hYmxlZCB3aXRoIENGR19DTURfTU1DLiBUaGUgTU1DIGRyaXZlciBhbHNvIHdvcmtzIHdpdGgKLQkJdGhlIEZBVCBmcy4gVGhpcyBpcyBlbmFibGVkIHdpdGggQ0ZHX0NNRF9GQVQuCisJCWVuYWJsZWQgd2l0aCBDT05GSUdfQ01EX01NQy4gVGhlIE1NQyBkcml2ZXIgYWxzbyB3b3JrcyB3aXRoCisJCXRoZSBGQVQgZnMuIFRoaXMgaXMgZW5hYmxlZCB3aXRoIENPTkZJR19DTURfRkFULgogCiAtIEpvdXJuYWxpbmcgRmxhc2ggZmlsZXN5c3RlbSBzdXBwb3J0OgogCQlDT05GSUdfSkZGUzJfTkFORCwgQ09ORklHX0pGRlMyX05BTkRfT0ZGLCBDT05GSUdfSkZGUzJfTkFORF9TSVpFLApAQCAtMTExMiw2ICsxMDY2LDE2IEBACiAJCURlZmluZXMgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGVJUCBhZGRyZXNzIG9mIGEgVEZUUAogCQlzZXJ2ZXIgdG8gY29udGFjdCB3aGVuIHVzaW5nIHRoZSAidGZ0Ym9vdCIgY29tbWFuZC4KIAorLSBNdWx0aWNhc3QgVEZUUCBNb2RlOgorCQlDT05GSUdfTUNBU1RfVEZUUAorCisJCURlZmluZXMgd2hldGhlciB5b3Ugd2FudCB0byBzdXBwb3J0IG11bHRpY2FzdCBURlRQIGFzIHBlcgorCQlyZmMtMjA5MDsgZm9yIGV4YW1wbGUgdG8gd29yayB3aXRoIGF0ZnRwLiAgTGV0cyBsb3RzIG9mIHRhcmdldHMKKwkJdGZ0cCBkb3duIHRoZSBzYW1lIGJvb3QgaW1hZ2UgY29uY3VycmVudGx5LiAgTm90ZTogdGhlIGV0aGVybmV0CisJCWRyaXZlciBpbiB1c2UgbXVzdCBwcm92aWRlIGEgZnVuY3Rpb246IG1jYXN0KCkgdG8gam9pbi9sZWF2ZSBhCisJCW11bHRpY2FzdCBncm91cC4KKworCQlDT05GSUdfQk9PVFBfUkFORE9NX0RFTEFZCiAtIEJPT1RQIFJlY292ZXJ5IE1vZGU6CiAJCUNPTkZJR19CT09UUF9SQU5ET01fREVMQVkKIApAQCAtMTEyMyw3ICsxMDg3LDcgQEAKIAkJYm9vdCwgdGh1cyBmbG9vZGluZyB0aGUgQk9PVFAgc2VydmVyLiBEZWZpbmluZwogCQlDT05GSUdfQk9PVFBfUkFORE9NX0RFTEFZIGNhdXNlcyBhIHJhbmRvbSBkZWxheSB0byBiZQogCQlpbnNlcnRlZCBiZWZvcmUgc2VuZGluZyBvdXQgQk9PVFAgcmVxdWVzdHMuIFRoZQotCQlmb2xsb3dpbmcgZGVsYXlzIGFyZSBpbnN0ZXJ0ZWQgdGhlbjoKKwkJZm9sbG93aW5nIGRlbGF5cyBhcmUgaW5zZXJ0ZWQgdGhlbjoKIAogCQkxc3QgQk9PVFAgcmVxdWVzdDoJZGVsYXkgMCAuLi4gMSBzZWMKIAkJMm5kIEJPT1RQIHJlcXVlc3Q6CWRlbGF5IDAgLi4uIDIgc2VjCkBAIC0xMTMyLDEwICsxMDk2LDI0IEBACiAJCUJPT1RQIHJlcXVlc3RzOgkJZGVsYXkgMCAuLi4gOCBzZWMKIAogLSBESENQIEFkdmFuY2VkIE9wdGlvbnM6Ci0JCUNPTkZJR19CT09UUF9NQVNLCisJCVlvdSBjYW4gZmluZSB0dW5lIHRoZSBESENQIGZ1bmN0aW9uYWxpdHkgYnkgZGVmaW5pbmcKKwkJQ09ORklHX0JPT1RQXyogc3ltYm9sczoKIAotCQlZb3UgY2FuIGZpbmUgdHVuZSB0aGUgREhDUCBmdW5jdGlvbmFsaXR5IGJ5IGFkZGluZwotCQl0aGVzZSBmbGFncyB0byB0aGUgQ09ORklHX0JPT1RQX01BU0sgZGVmaW5lOgorCQlDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworCQlDT05GSUdfQk9PVFBfR0FURVdBWQorCQlDT05GSUdfQk9PVFBfSE9TVE5BTUUKKwkJQ09ORklHX0JPT1RQX05JU0RPTUFJTgorCQlDT05GSUdfQk9PVFBfQk9PVFBBVEgKKwkJQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCQlDT05GSUdfQk9PVFBfRE5TCisJCUNPTkZJR19CT09UUF9ETlMyCisJCUNPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCisJCUNPTkZJR19CT09UUF9OVFBTRVJWRVIKKwkJQ09ORklHX0JPT1RQX1RJTUVPRkZTRVQKKwkJQ09ORklHX0JPT1RQX1ZFTkRPUkVYCisKKwkJQ09ORklHX0JPT1RQX1NFUlZFUklQIC0gVEZUUCBzZXJ2ZXIgd2lsbCBiZSB0aGUgc2VydmVyaXAKKwkJZW52aXJvbm1lbnQgdmFyaWFibGUsIG5vdCB0aGUgQk9PVFAgc2VydmVyLgogCiAJCUNPTkZJR19CT09UUF9ETlMyIC0gSWYgYSBESENQIGNsaWVudCByZXF1ZXN0cyB0aGUgRE5TCiAJCXNlcnZlcmlwIGZyb20gYSBESENQIHNlcnZlciwgaXQgaXMgcG9zc2libGUgdGhhdCBtb3JlCkBAIC0xMTQ0LDE1ICsxMTIyLDE0IEBACiAJCXNlcnZlcmlwIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBhZGRpdGlvbmFsIGVudmlyb25tZW50CiAJCXZhcmlhYmxlICJkbnNpcDIiLiBUaGUgZmlyc3QgRE5TIHNlcnZlcmlwIGlzIGFsd2F5cwogCQlzdG9yZWQgaW4gdGhlIHZhcmlhYmxlICJkbnNpcCIsIHdoZW4gQ09ORklHX0JPT1RQX0ROUwotCQlpcyBhZGRlZCB0byB0aGUgQ09ORklHX0JPT1RQX01BU0suCisJCWlzIGRlZmluZWQuCiAKIAkJQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUgLSBTb21lIERIQ1Agc2VydmVycyBhcmUgY2FwYWJsZQogCQl0byBkbyBhIGR5bmFtaWMgdXBkYXRlIG9mIGEgRE5TIHNlcnZlci4gVG8gZG8gdGhpcywgdGhleQogCQluZWVkIHRoZSBob3N0bmFtZSBvZiB0aGUgREhDUCByZXF1ZXN0ZXIuCi0JCUlmIENPTkZJR19CT09QX1NFTkRfSE9TVE5BTUUgaXMgYWRkZWQgdG8gdGhlCi0JCUNPTkZJR19CT09UUF9NQVNLLCB0aGUgY29udGVudCBvZiB0aGUgImhvc3RuYW1lIgotCQllbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBwYXNzZWQgYXMgb3B0aW9uIDEyIHRvCi0JCXRoZSBESENQIHNlcnZlci4KKwkJSWYgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUgaXMgZGVmaW5lZCwgdGhlIGNvbnRlbnQKKwkJb2YgdGhlICJob3N0bmFtZSIgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcGFzc2VkIGFzCisJCW9wdGlvbiAxMiB0byB0aGUgREhDUCBzZXJ2ZXIuCiAKICAtIENEUCBPcHRpb25zOgogCQlDT05GSUdfQ0RQX0RFVklDRV9JRApAQCAtMTIyMCw3ICsxMTk3LDcgQEAKIAkJaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgSTJDIGRyaXZlciBmb3IgdGhlIHNlbGVjdGVkIGNwdS4KIAogCQlUaGlzIHdpbGwgYWxsb3cgeW91IHRvIHVzZSBpMmMgY29tbWFuZHMgYXQgdGhlIHUtYm9vdAotCQljb21tYW5kIGxpbmUgKGFzIGxvbmcgYXMgeW91IHNldCBDRkdfQ01EX0kyQyBpbgorCQljb21tYW5kIGxpbmUgKGFzIGxvbmcgYXMgeW91IHNldCBDT05GSUdfQ01EX0kyQyBpbgogCQlDT05GSUdfQ09NTUFORFMpIGFuZCBjb21tdW5pY2F0ZSB3aXRoIGkyYyBiYXNlZCByZWFsdGltZQogCQljbG9jayBjaGlwcy4gU2VlIGNvbW1vbi9jbWRfaTJjLmMgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlCiAJCWNvbW1hbmQgbGluZSBpbnRlcmZhY2UuCkBAIC0yMzY5LDcgKzIzNDYsNyBAQAogCiAtIENPTkZJR19MT09QVwogCQlBZGQgdGhlICJsb29wdyIgbWVtb3J5IGNvbW1hbmQuIFRoaXMgb25seSB0YWtlcyBlZmZlY3QgaWYKLQkJdGhlIG1lbW9yeSBjb21tYW5kcyBhcmUgYWN0aXZhdGVkIGdsb2JhbGx5IChDRkdfQ01EX01FTSkuCisJCXRoZSBtZW1vcnkgY29tbWFuZHMgYXJlIGFjdGl2YXRlZCBnbG9iYWxseSAoQ09ORklHX0NNRF9NRU0pLgogCiAtIENPTkZJR19NWF9DWUNMSUMKIAkJQWRkIHRoZSAibWRjIiBhbmQgIm13YyIgbWVtb3J5IGNvbW1hbmRzLiBUaGVzZSBhcmUgY3ljbGljCkBAIC0yMzgzLDcgKzIzNjAsNyBAQAogCQlUaGlzIGNvbW1hbmQgd2lsbCB3cml0ZSAxMjM0NTY3OCB0byBhZGRyZXNzIDEwMCBhbGwgMTAgbXMuCiAKIAkJVGhpcyBvbmx5IHRha2VzIGVmZmVjdCBpZiB0aGUgbWVtb3J5IGNvbW1hbmRzIGFyZSBhY3RpdmF0ZWQKLQkJZ2xvYmFsbHkgKENGR19DTURfTUVNKS4KKwkJZ2xvYmFsbHkgKENPTkZJR19DTURfTUVNKS4KIAogLSBDT05GSUdfU0tJUF9MT1dMRVZFTF9JTklUCiAtIENPTkZJR19TS0lQX1JFTE9DQVRFX1VCT09UCkBAIC0yNDIzLDM0ICsyNDAwLDcgQEAKIAltYWtlIE5BTUVfY29uZmlnCiAKIHdoZXJlICJOQU1FX2NvbmZpZyIgaXMgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBleGlzdGluZwotY29uZmlndXJhdGlvbnM7IHRoZSBmb2xsb3dpbmcgbmFtZXMgYXJlIHN1cHBvcnRlZDoKLQotCUFEQ0lPUF9jb25maWcJCUZQUzg2MExfY29uZmlnCQlvbWFwNzMwcDJfY29uZmlnCi0JQURTODYwX2NvbmZpZwkJR0VOODYwVF9jb25maWcJCXBjdV9lX2NvbmZpZwotCUFsYXNrYTgyMjBfY29uZmlnCi0JQVI0MDVfY29uZmlnCQlHRU5JRVRWX2NvbmZpZwkJUElQNDA1X2NvbmZpZwotCWF0OTFybTkyMDBka19jb25maWcJR1RIX2NvbmZpZwkJUVM4MjNfY29uZmlnCi0JQ0FOQlRfY29uZmlnCQloZXJtZXNfY29uZmlnCQlRUzg1MF9jb25maWcKLQljbWlfbXBjNXh4X2NvbmZpZwloeW1vZF9jb25maWcJCVFTODYwVF9jb25maWcKLQljb2dlbnRfY29tbW9uX2NvbmZpZwlJUDg2MF9jb25maWcJCVJQWGxpdGVfY29uZmlnCi0JY29nZW50X21wYzgyNjBfY29uZmlnCUlWTUwyNF9jb25maWcJCVJQWGxpdGVfRFdfY29uZmlnCi0JY29nZW50X21wYzh4eF9jb25maWcJSVZNUzhfY29uZmlnCQlSUFhzdXBlcl9jb25maWcKLQlDUENJNDA1X2NvbmZpZwkJSlNFX2NvbmZpZwkJcnNkcHJvdG9fY29uZmlnCi0JQ1BDSUlTRVI0X2NvbmZpZwlMQU5URUNfY29uZmlnCQlTYW5kcG9pbnQ4MjQwX2NvbmZpZwotCWNzYjI3Ml9jb25maWcJCWx3bW9uX2NvbmZpZwkJc2JjODI2MF9jb25maWcKLQlDVTgyNF9jb25maWcJCU1CWDg2MFRfY29uZmlnCQlzYmM4NTYwXzMzX2NvbmZpZwotCURVRVRfQURTX2NvbmZpZwkJTUJYX2NvbmZpZwkJc2JjODU2MF82Nl9jb25maWcKLQlFQk9OWV9jb25maWcJCW1wYzc0NDhocGMyX2NvbmZpZwlTTTg1MF9jb25maWcKLQlFTFBUODYwX2NvbmZpZwkJTVBDODI2MEFEU19jb25maWcJU1BEODIzVFNfY29uZmlnCi0JRVNURUVNMTkyRV9jb25maWcJTVBDODU0MEFEU19jb25maWcJc3R4Z3AzX2NvbmZpZwotCUVUWDA5NF9jb25maWcJCU1QQzg1NDBFVkFMX2NvbmZpZwlTWE5JODU1VF9jb25maWcKLQlGQURTODIzX2NvbmZpZwkJTk1QQzg1NjBBRFNfY29uZmlnCVRRTTgyM0xfY29uZmlnCi0JRkFEUzg1MFNBUl9jb25maWcJTkVUVklBX2NvbmZpZwkJVFFNODUwTF9jb25maWcKLQlGQURTODYwVF9jb25maWcJCW9tYXAxNTEwaW5uX2NvbmZpZwlUUU04NTVMX2NvbmZpZwotCUZQUzg1MExfY29uZmlnCQlvbWFwMTYxMGgyX2NvbmZpZwlUUU04NjBMX2NvbmZpZwotCQkJCW9tYXAxNjEwaW5uX2NvbmZpZwl3YWxudXRfY29uZmlnCi0JCQkJb21hcDU5MTJvc2tfY29uZmlnCVl1a29uODIyMF9jb25maWcKLQkJCQlvbWFwMjQyMGg0X2NvbmZpZwlaUEMxOTAwX2NvbmZpZworY29uZmlndXJhdGlvbnM7IHNlZSB0aGUgbWFpbiBNYWtlZmlsZSBmb3Igc3VwcG9ydGVkIG5hbWVzLgogCiBOb3RlOiBmb3Igc29tZSBib2FyZCBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gbmFtZXMgbWF5IGV4aXN0OyBjaGVjayBpZgogICAgICAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgZnJvbSB0aGUgYm9hcmQgdmVuZG9yOyBmb3IKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvQW1pZ2FPbmVHM1NFLmMgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL0FtaWdhT25lRzNTRS5jCmluZGV4IDQwZjQxYzcuLmI0NzIxNzYgMTAwNjQ0Ci0tLSBhL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvQW1pZ2FPbmVHM1NFLmMKKysrIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9BbWlnYU9uZUczU0UuYwpAQCAtMzAsNDkgKzMwLDQ5IEBACiAjaW5jbHVkZSAibWVtaW8uaCIKICNpbmNsdWRlICJ2aWE2ODYuaCIKIAotX19hc20oIiAuZ2xvYmwgc2VuZF9rYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQlzZW5kX2tiOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJbGlzICAgICByOSwgMHhmZTAwICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQkJCQkJCSAgICBcbgotCQlsaSAgICAgIHI0LCAweDEwICAgICAgICAjIHJldHJpZXMgICAgICAgICAgIFxuCi0JCW10Y3RyICAgcjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJCQkJCQkgICAgXG4KLQlpZGxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJbGJ6ICAgICByNCwgMHg2NChyOSkgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlhbmRpLiAgIHI0LCByNCwgMHgwMiAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCWJuZSAgICAgaWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJCQkJCQkgICAgXG4KLQlyZWFkeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJc3RiICAgICByMywgMHg2MChyOSkgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQkJCQkJCSAgICBcbgotCWNoZWNrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlsYnogICAgIHI0LCAweDY0KHI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCWFuZGkuICAgcjQsIHI0LCAweDAxICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJYmVxICAgICBjaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQkJCQkJCSAgICBcbgotCQlsYnogICAgIHI0LCAweDYwKHI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCWNtcHdpICAgcjQsIDB4ZmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJYmVxICAgICBkb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQkJCQkJCSAgICBcbgotCQliZG56ICAgIGlkbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCQkJCQkJICAgIFxuCi0JCWxpICAgICAgcjMsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJYmxyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQkJCQkJCSAgICBcbgotCWRvbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlsaSAgICAgIHIzLCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCWJsciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJCQkJCQkgICAgXG4KLQkuZ2xvYmwgdGVzdF9rYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQl0ZXN0X2tiOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJbWZsciAgICByMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlsaSAgICAgIHIzLCAweGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCWJsICAgICAgc2VuZF9rYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJbGkgICAgICByMywgMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlibCAgICAgIHNlbmRfa2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCW10bHIgICAgcjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJYmxyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotIik7CitfX2FzbV9fKCIgLmdsb2JsIHNlbmRfa2IgICAgICAgICAgICAgICAgICAgCQkgICAgXG4gIgorCSJzZW5kX2tiOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglsaXMgICAgIHI5LCAweGZlMDAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCQkJCQkJICAgIFxuICIKKwkiCWxpICAgICAgcjQsIDB4MTAgICAgICAgICMgcmV0cmllcyAgICAgICAgICAgXG4gIgorCSIJbXRjdHIgICByNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIgkJCQkJCSAgICBcbiAiCisJImlkbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWxieiAgICAgcjQsIDB4NjQocjkpICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJYW5kaS4gICByNCwgcjQsIDB4MDIgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglibmUgICAgIGlkbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKworCSJyZWFkeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglzdGIgICAgIHIzLCAweDYwKHI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCQkJCQkJICAgIFxuICIKKwkiY2hlY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJbGJ6ICAgICByNCwgMHg2NChyOSkgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglhbmRpLiAgIHI0LCByNCwgMHgwMSAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWJlcSAgICAgY2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJCQkJCQkgICAgXG4gIgorCSIJbGJ6ICAgICByNCwgMHg2MChyOSkgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIgljbXB3aSAgIHI0LCAweGZhICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWJlcSAgICAgZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCisJIgliZG56ICAgIGlkbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKworCSIJbGkgICAgICByMywgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglibHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKworCSJkb25lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglsaSAgICAgIHIzLCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWJsciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCisJIi5nbG9ibCB0ZXN0X2tiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkidGVzdF9rYjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJbWZsciAgICByMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglsaSAgICAgIHIzLCAweGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWJsICAgICAgc2VuZF9rYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJbGkgICAgICByMywgMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglibCAgICAgIHNlbmRfa2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCW10bHIgICAgcjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJYmxyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCispOwogCiAKIGludCBjaGVja2JvYXJkICh2b2lkKQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9jbWRfYm9vdGEuYyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvY21kX2Jvb3RhLmMKaW5kZXggMTQzYmJhMi4uNDBjOTUxZCAxMDA2NDQKLS0tIGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9jbWRfYm9vdGEuYworKysgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2NtZF9ib290YS5jCkBAIC0xMTksNyArMTE5LDcgQEAKIAogCXJldHVybiAwOwogfQotI2lmIGRlZmluZWQoQ09ORklHX0FNSUdBT05FRzNTRSkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQorI2lmIGRlZmluZWQoQ09ORklHX0FNSUdBT05FRzNTRSkgJiYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIFVfQk9PVF9DTUQoCiAJYm9vdGEsICAgMywgICAgICAxLCAgICAgIGRvX2Jvb3RhLAogCSJib290YSAgIC0gYm9vdCBhbiBBbWlnYSBrZXJuZWxcbiIsCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3ZpZGVvLmMgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3ZpZGVvLmMKaW5kZXggZjYzMjdmNy4uZmMyN2M2OCAxMDA2NDQKLS0tIGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS92aWRlby5jCisrKyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvdmlkZW8uYwpAQCAtNTYsNiArNTYsNyBAQAogaW50ICB2aWRlb19jb2xzKHZvaWQpOwogCiBjaGFyICpwcm9tcHRfc3RyaW5nID0gIj0+IjsKK3Vuc2lnbmVkIGNoYXIgdmlkZW9fZ2V0X2F0dHIodm9pZCk7CiAKIHZvaWQgdmlkZW9fc2V0X2NvbG9yKHVuc2lnbmVkIGNoYXIgYXR0cikKIHsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL2Jpb3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL2Jpb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUxZWI2NC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9iaW9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLyoKLSAqIE1vc3RseSBkb25lIGFmdGVyIHRoZSBTY2l0ZWNoIEJpb3MgZW11bGF0aW9uCi0gKiBXcml0dGVuIGJ5IEhhbnMtSvZyZyBGcmllZGVuCi0gKiBIeXBlcmlvbiBFbnRlcnRhaW5tZW50Ci0gKi8KLSNpbmNsdWRlICJ4ODZlbXUuaCIKLSNpbmNsdWRlICJnbHVlLmgiCi0KLSN1bmRlZiBERUJVRwotI2lmZGVmIERFQlVHCi0jZGVmaW5lIFBSSU5URihmbXQsIGFyZ3MuLi4pIHByaW50ZihmbXQsICMjIGFyZ3MpCi0jZWxzZQotI2RlZmluZSBQUklOVEYoZm10LCBhcmdzLi4uKQotI2VuZGlmCi0KLSNkZWZpbmUgQklPU19TRUcgMHhGRkYwCi0jZGVmaW5lIFBDSUJJT1NfU1VDQ0VTU0ZVTCAwCi0jZGVmaW5lIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORCAweDg2Ci0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVQllURTsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVVdPUkQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUxPTkc7Ci0KLXR5cGVkZWYgY2hhciBCWVRFOwotdHlwZWRlZiBzaG9ydCBXT1JUOwotdHlwZWRlZiBsb25nIExPTkc7Ci0KLXN0YXRpYyBpbmxpbmUgVUJZVEUgcmVhZF9ieXRlKHZvbGF0aWxlIFVCWVRFKiBmcm9tKQotewotICAgIGludCB4OwotICAgIGFzbSB2b2xhdGlsZSAoImxieiAlMCwlMVxuIGVpZWlvIiA6ICI9ciIgKHgpIDogIm0iICgqZnJvbSkpOwotICAgIHJldHVybiAoVUJZVEUpeDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2J5dGUodm9sYXRpbGUgVUJZVEUgKnRvLCBpbnQgeCkKLXsKLSAgICBhc20gdm9sYXRpbGUgKCJzdGIgJTEsJTBcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgVVdPUkQgcmVhZF93b3JkX2xpdHRsZSh2b2xhdGlsZSBVV09SRCAqZnJvbSkKLXsKLSAgICBpbnQgeDsKLSAgICBhc20gdm9sYXRpbGUgKCJsaGJyeCAlMCwwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAiciIgKGZyb20pLCAibSIgKCpmcm9tKSk7Ci0gICAgcmV0dXJuIChVV09SRCl4OwotfQotCi1zdGF0aWMgaW5saW5lIFVXT1JEIHJlYWRfd29yZF9iaWcodm9sYXRpbGUgVVdPUkQgKmZyb20pCi17Ci0gICAgaW50IHg7Ci0gICAgYXNtIHZvbGF0aWxlICgibGh6ICUwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAibSIgKCpmcm9tKSk7Ci0gICAgcmV0dXJuIChVV09SRCl4OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfd29yZF9saXR0bGUodm9sYXRpbGUgVVdPUkQgKnRvLCBpbnQgeCkKLXsKLSAgICBhc20gdm9sYXRpbGUgKCJzdGhicnggJTEsMCwlMlxuIGVpZWlvIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpLCAiciIgKHRvKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV93b3JkX2JpZyh2b2xhdGlsZSBVV09SRCAqdG8sIGludCB4KQotewotICAgIGFzbSB2b2xhdGlsZSAoInN0aCAlMSwlMFxuIGVpZWlvIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpKTsKLX0KLQotc3RhdGljIGlubGluZSBVTE9ORyByZWFkX2xvbmdfbGl0dGxlKHZvbGF0aWxlIFVMT05HICpmcm9tKQotewotICAgIHVuc2lnbmVkIGxvbmcgeDsKLSAgICBhc20gdm9sYXRpbGUgKCJsd2JyeCAlMCwwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAiciIgKGZyb20pLCAibSIoKmZyb20pKTsKLSAgICByZXR1cm4gKFVMT05HKXg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgVUxPTkcgcmVhZF9sb25nX2JpZyh2b2xhdGlsZSBVTE9ORyAqZnJvbSkKLXsKLSAgICB1bnNpZ25lZCBsb25nIHg7Ci0gICAgYXNtIHZvbGF0aWxlICgibHd6ICUwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAibSIgKCpmcm9tKSk7Ci0gICAgcmV0dXJuIChVTE9ORyl4OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbG9uZ19saXR0bGUodm9sYXRpbGUgVUxPTkcgKnRvLCBVTE9ORyB4KQotewotICAgIGFzbSB2b2xhdGlsZSAoInN0d2JyeCAlMSwwLCUyXG4gZWllaW8iIDogIj1tIiAoKnRvKSA6ICJyIiAoeCksICJyIiAodG8pKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2xvbmdfYmlnKHZvbGF0aWxlIFVMT05HICp0bywgVUxPTkcgeCkKLXsKLSAgICBhc20gdm9sYXRpbGUgKCJzdHcgJTEsJTBcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSk7Ci19Ci0KLSNkZWZpbmUgcG9ydF90b19tZW0oZnJvbSkgKDB4RkUwMDAwMDB8KGZyb20pKQotI2RlZmluZSBpbl9ieXRlKGZyb20pIHJlYWRfYnl0ZSggKFVCWVRFICopcG9ydF90b19tZW0oZnJvbSkpCi0jZGVmaW5lIGluX3dvcmQoZnJvbSkgcmVhZF93b3JkX2xpdHRsZSgoVVdPUkQgKilwb3J0X3RvX21lbShmcm9tKSkKLSNkZWZpbmUgaW5fbG9uZyhmcm9tKSByZWFkX2xvbmdfbGl0dGxlKChVTE9ORyAqKXBvcnRfdG9fbWVtKGZyb20pKQotI2RlZmluZSBvdXRfYnl0ZSh0bywgdmFsKSB3cml0ZV9ieXRlKChVQllURSAqKXBvcnRfdG9fbWVtKHRvKSwgdmFsKQotI2RlZmluZSBvdXRfd29yZCh0bywgdmFsKSB3cml0ZV93b3JkX2xpdHRsZSgoVVdPUkQgKilwb3J0X3RvX21lbSh0byksIHZhbCkKLSNkZWZpbmUgb3V0X2xvbmcodG8sIHZhbCkgd3JpdGVfbG9uZ19saXR0bGUoKFVMT05HICopcG9ydF90b19tZW0odG8pLCB2YWwpCi0KLXN0YXRpYyB2b2lkIFg4NkFQSSB1bmRlZmluZWRfaW50cihpbnQgaW50bm8pCi17Ci0gICAgZXh0ZXJuIHUxNiBBMV9yZHcodTMyIGFkZHIpOwotICAgIGlmIChBMV9yZHcoaW50bm8gKiA0ICsgMikgPT0gQklPU19TRUcpCi0gICAgewotCVBSSU5URigiVW5kZWZpbmVkIGludGVycnVwdCAleGggY2FsbGVkIEFYID0gJXhoLCBCWCA9ICV4aCwgQ1ggPSAleGgsIERYID0gJXhoXG4iLAotCSAgIGludG5vLCBNLng4Ni5SX0FYLCBNLng4Ni5SX0JYLCBNLng4Ni5SX0NYLCBNLng4Ni5SX0RYKTsKLQlYODZFTVVfaGFsdF9zeXMoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlQUklOVEYoIkNhbGxpbmcgaW50ZXJydXB0ICV4aCwgQUw9JXhoLCBBSD0leGhcbiIsIGludG5vLCBNLng4Ni5SX0FMLCBNLng4Ni5SX0FIKTsKLQlYODZFTVVfcHJlcGFyZUZvckludChpbnRubyk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBYODZBUEkgaW50NDIoaW50IGludG5vKTsKLXN0YXRpYyB2b2lkIFg4NkFQSSBpbnQxNShpbnQgaW50bm8pOwotCi1zdGF0aWMgdm9pZCBYODZBUEkgaW50MTAoaW50IGludG5vKQotewotICAgIGlmIChBMV9yZHcoaW50bm8qNCsyKSA9PSBCSU9TX1NFRykKLQlpbnQ0MihpbnRubyk7Ci0gICAgZWxzZQotICAgIHsKLQlQUklOVEYoImludDEwOiBicmFuY2hpbmcgdG8gJTA0WDolMDRYLCBBTD0leGgsIEFIPSV4aFxuIiwgQTFfcmR3KGludG5vKjQrMiksIEExX3JkdyhpbnRubyo0KSwKLQkgICAgICAgTS54ODYuUl9BTCwgTS54ODYuUl9BSCk7Ci0JWDg2RU1VX3ByZXBhcmVGb3JJbnQoaW50bm8pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgWDg2QVBJIGludDFBKGludCBpbnRubykKLXsKLSAgICBpbnQgZGV2aWNlOwotCi0gICAgc3dpdGNoKE0ueDg2LlJfQVgpCi0gICAgewotICAgIGNhc2UgMHhCMTAxOiAvKiBQQ0kgQmlvcyBQcmVzZW50PyAqLwotCU0ueDg2LlJfQUwgID0gMHgwMDsKLQlNLng4Ni5SX0VEWCA9IDB4MjA0OTQzNTA7Ci0JTS54ODYuUl9CWCAgPSAweDAyMTA7Ci0JTS54ODYuUl9DTCAgPSAzOwotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAweEIxMDI6IC8qIEZpbmQgZGV2aWNlICovCi0JZGV2aWNlID0gbXlwY2lfZmluZF9kZXZpY2UoTS54ODYuUl9EWCwgTS54ODYuUl9DWCwgTS54ODYuUl9TSSk7Ci0JaWYgKGRldmljZSAhPSAtMSkKLQl7Ci0JICAgIE0ueDg2LlJfQUggPSBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci0JICAgIE0ueDg2LlJfQkggPSBteXBjaV9idXMoZGV2aWNlKTsKLQkgICAgTS54ODYuUl9CTCA9IG15cGNpX2RldmZuKGRldmljZSk7Ci0JfQotCWVsc2UKLQl7Ci0JICAgIE0ueDg2LlJfQUggPSBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0JfQotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCksIEZfQ0YpOwotCWJyZWFrOwotICAgIGNhc2UgMHhCMTAzOiAvKiBGaW5kIFBDSSBjbGFzcyBjb2RlICovCi0JTS54ODYuUl9BSCA9IFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQkvKnByaW50ZigiRmluZCBieSBjbGFzcyBub3QgeWV0IGltcGxtZW50ZWQiKTsgKi8KLQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKLQlicmVhazsKLSAgICBjYXNlIDB4QjEwODogLyogcmVhZCBjb25maWcgYnl0ZSAqLwotCU0ueDg2LlJfQ0wgPSBteXBjaV9yZWFkX2NmZ19ieXRlKE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREkpOwotCU0ueDg2LlJfQUggPSBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gUENJQklPU19TVUNDRVNTRlVMKSwgRl9DRik7Ci0JLypwcmludGYoInJlYWRfY29uZmlnX2J5dGUgJXgsJXgsJXggLT4gJXhcbiIsIE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksICovCi0JLyoJICAgIE0ueDg2LlJfQ0wpOyAqLwotCWJyZWFrOwotICAgIGNhc2UgMHhCMTA5OiAvKiByZWFkIGNvbmZpZyB3b3JkICovCi0JTS54ODYuUl9DWCA9IG15cGNpX3JlYWRfY2ZnX3dvcmQoTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSk7Ci0JTS54ODYuUl9BSCA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKLQkvKnByaW50ZigicmVhZF9jb25maWdfd29yZCAleCwleCwleCAtPiAleFxuIiwgTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSwgKi8KLQkvKgkgICAgTS54ODYuUl9DWCk7ICovCi0JYnJlYWs7Ci0gICAgY2FzZSAweEIxMEE6IC8qIHJlYWQgY29uZmlnIGR3b3JkICovCi0JTS54ODYuUl9FQ1ggPSBteXBjaV9yZWFkX2NmZ19sb25nKE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREkpOwotCU0ueDg2LlJfQUggPSBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gUENJQklPU19TVUNDRVNTRlVMKSwgRl9DRik7Ci0JLypwcmludGYoInJlYWRfY29uZmlnX2xvbmcgJXgsJXgsJXggLT4gJXhcbiIsIE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksICovCi0JLyogICAgTS54ODYuUl9FQ1gpOyAqLwotCWJyZWFrOwotICAgIGNhc2UgMHhCMTBCOiAvKiB3cml0ZSBjb25maWcgYnl0ZSAqLwotCW15cGNpX3dyaXRlX2NmZ19ieXRlKE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksIE0ueDg2LlJfQ0wpOwotCU0ueDg2LlJfQUggPSBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gUENJQklPU19TVUNDRVNTRlVMKSwgRl9DRik7Ci0JLypwcmludGYoIndyaXRlX2NvbmZpZ19ieXRlICV4LCV4LCV4IDwtICV4XG4iLCBNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJLCAqLwotCS8qICAgIE0ueDg2LlJfQ0wpOyAqLwotCWJyZWFrOwotICAgIGNhc2UgMHhCMTBDOiAvKiB3cml0ZSBjb25maWcgd29yZCAqLwotCW15cGNpX3dyaXRlX2NmZ193b3JkKE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksIE0ueDg2LlJfQ1gpOwotCU0ueDg2LlJfQUggPSBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gUENJQklPU19TVUNDRVNTRlVMKSwgRl9DRik7Ci0JLypwcmludGYoIndyaXRlX2NvbmZpZ193b3JkICV4LCV4LCV4IDwtICV4XG4iLCBNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJLCAqLwotCS8qCSAgICBNLng4Ni5SX0NYKTsgKi8KLQlicmVhazsKLSAgICBjYXNlIDB4QjEwRDogLyogd3JpdGUgY29uZmlnIGR3b3JkICovCi0JbXlwY2lfd3JpdGVfY2ZnX2xvbmcoTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSwgTS54ODYuUl9FQ1gpOwotCU0ueDg2LlJfQUggPSBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gUENJQklPU19TVUNDRVNTRlVMKSwgRl9DRik7Ci0JLypwcmludGYoIndyaXRlX2NvbmZpZ19sb25nICV4LCV4LCV4IDwtICV4XG4iLCBNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJLCAqLwotCS8qCSAgICBNLng4Ni5SX0VDWCk7ICovCi0JYnJlYWs7Ci0gICAgZGVmYXVsdDoKLQlQUklOVEYoIkJJT1MgaW50ICV4aDogVW5rbm93biBmdW5jdGlvbiBBWD0lMDR4aFxuIiwgaW50bm8sIE0ueDg2LlJfQVgpOwotCi0gICAgfQotfQotCi12b2lkIGJpb3NfaW5pdCh2b2lkKQotewotICAgIGludCBpOwotICAgIFg4NkVNVV9pbnRyRnVuY3MgYmlvc19pbnRyX3RhYlsyNTZdOwotCi0gICAgZm9yIChpPTA7IGk8MjU2OyBpKyspCi0gICAgewotCXdyaXRlX2xvbmdfbGl0dGxlKE0ubWVtX2Jhc2UraSo0LCBCSU9TX1NFRzw8MTYpOwotCWJpb3NfaW50cl90YWJbaV0gPSB1bmRlZmluZWRfaW50cjsKLSAgICB9Ci0KLSAgICBiaW9zX2ludHJfdGFiWzB4MTBdID0gaW50MTA7Ci0gICAgYmlvc19pbnRyX3RhYlsweDFBXSA9IGludDFBOwotICAgIGJpb3NfaW50cl90YWJbMHg0Ml0gPSBpbnQ0MjsKLSAgICBiaW9zX2ludHJfdGFiWzB4MTVdID0gaW50MTU7Ci0KLSAgICBiaW9zX2ludHJfdGFiWzB4NkRdID0gaW50NDI7Ci0KLSAgICBYODZFTVVfc2V0dXBJbnRyRnVuY3MoYmlvc19pbnRyX3RhYik7Ci0gICAgdmlkZW9faW5pdCgpOwotfQotCi11bnNpZ25lZCBjaGFyIHNldHVwXzQweDI1W10gPQotewotICAgIDB4MzgsIDB4MjgsIDB4MmQsIDB4MGEsIDB4MWYsIDYsIDB4MTksCi0gICAgMHgxYywgMiwgNywgNiwgNywgMCwgMCwgMCwgMAotfTsKLQotdW5zaWduZWQgY2hhciBzZXR1cF84MHgyNVtdID0KLXsKLSAgICAweDcxLCAweDUwLCAweDVhLCAweDBhLCAweDFmLCA2LCAweDE5LAotICAgIDB4MWMsIDIsIDcsIDYsIDcsIDAsIDAsIDAsIDAKLX07Ci0KLXVuc2lnbmVkIGNoYXIgc2V0dXBfZ3JhcGhpY3NbXSA9Ci17Ci0gICAgMHgzOCwgMHgyOCwgMHgyMCwgMHgwYSwgMHg3ZiwgNiwgMHg2NCwKLSAgICAweDcwLCAyLCAxLCA2LCA3LCAwLCAwLCAwLCAwCi19OwotCi11bnNpZ25lZCBjaGFyIHNldHVwX2J3W10gPQotewotICAgIDB4NjEsIDB4NTAsIDB4NTIsIDB4MGYsIDB4MTksIDYsIDB4MTksCi0gICAgMHgxOSwgMiwgMHgwZCwgMHgwYiwgMHgwYywgMCwgMCwgMCwgMAotfTsKLQotdW5zaWduZWQgY2hhciAqIHNldHVwX21vZGVzW10gPQotewotICAgIHNldHVwXzQweDI1LCAgICAgLyogbW9kZSAwOiA0MHgyNSBidyB0ZXh0ICovCi0gICAgc2V0dXBfNDB4MjUsICAgICAvKiBtb2RlIDE6IDQweDI1IGNvbCB0ZXh0ICovCi0gICAgc2V0dXBfODB4MjUsICAgICAvKiBtb2RlIDI6IDgweDI1IGJ3IHRleHQgKi8KLSAgICBzZXR1cF84MHgyNSwgICAgIC8qIG1vZGUgMzogODB4MjUgY29sIHRleHQgKi8KLSAgICBzZXR1cF9ncmFwaGljcywgIC8qIG1vZGUgNDogMzIweDIwMCBjb2wgZ3JhcGhpY3MgKi8KLSAgICBzZXR1cF9ncmFwaGljcywgIC8qIG1vZGUgNTogMzIweDIwMCBidyBncmFwaGljcyAqLwotICAgIHNldHVwX2dyYXBoaWNzLCAgLyogbW9kZSA2OiA2NDB4MjAwIGJ3IGdyYXBoaWNzICovCi0gICAgc2V0dXBfYncgICAgICAgICAvKiBtb2RlIDc6IDgweDI1IG1vbm8gdGV4dCAqLwotfTsKLQotdW5zaWduZWQgaW50IHNldHVwX2NvbHNbXSA9Ci17Ci0gICAgNDAsIDQwLCA4MCwgODAsIDQwLCA0MCwgODAsIDgwCi19OwotCi11bnNpZ25lZCBjaGFyIHNldHVwX21vZGVzZXRzW10gPQotewotICAgICAweDJDLCAweDI4LCAweDJELCAweDI5LCAweDJBLCAweDJFLCAweDFFLCAweDI5Ci19OwotCi11bnNpZ25lZCBpbnQgc2V0dXBfYnVmc2l6ZVtdID0KLXsKLSAgICAyMDQ4LCAyMDQ4LCA0MDk2LCAyMDk2LCAxNjM4NCwgMTYzODQsIDE2Mzg0LCA0MDk2Ci19OwotCi12b2lkIGJpb3Nfc2V0X21vZGUoaW50IG1vZGUpCi17Ci0gICAgaW50IGk7Ci0gICAgdW5zaWduZWQgY2hhciBtb2RlX3NldCA9IHNldHVwX21vZGVzZXRzW21vZGVdOyAvKiBDb250cm9sIHJlZ2lzdGVyIHZhbHVlICovCi0gICAgdW5zaWduZWQgY2hhciAqc2V0dXBfcmVncyA9IHNldHVwX21vZGVzW21vZGVdOyAvKiBSZWdpc3RlciAzRDQgQXJyYXkgKi8KLQotICAgIC8qIFN3aXRjaCB2aWRlbyBvZmYgKi8KLSAgICBvdXRfYnl0ZSgweDNEOCwgbW9kZV9zZXQgJiAweDM3KTsKLQotICAgIC8qIFNldCB1cCBwYXJhbWV0ZXJzIGF0IDNENGggKi8KLSAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQotICAgIHsKLQlvdXRfYnl0ZSgweDNENCwgKHVuc2lnbmVkIGNoYXIpaSk7Ci0Jb3V0X2J5dGUoMHgzRDUsICpzZXR1cF9yZWdzKTsKLQlzZXR1cF9yZWdzKys7Ci0gICAgfQotCi0gICAgLyogRW5hYmxlIHZpZGVvICovCi0gICAgb3V0X2J5dGUoMHgzRDgsIG1vZGVfc2V0KTsKLQotICAgIC8qIFNldCBvdmVyc2NhbiAqLwotICAgIGlmIChtb2RlID09IDYpIG91dF9ieXRlKDB4M0Q5LCAweDNGKTsKLSAgICBlbHNlICAgICAgICAgICBvdXRfYnl0ZSgweDNEOSwgMHgzMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpb3NfcHJpbnRfc3RyaW5nKHZvaWQpCi17Ci0gICAgZXh0ZXJuIHZvaWQgdmlkZW9fYmlvc19wcmludF9zdHJpbmcoY2hhciAqc3RyaW5nLCBpbnQgeCwgaW50IHksIGludCBhdHRyLCBpbnQgY291bnQpOwotICAgIGNoYXIgKnMgPSAoY2hhciAqKShNLng4Ni5SX0VTPDw0KSArIE0ueDg2LlJfQlA7Ci0gICAgaW50IGF0dHI7Ci0gICAgaWYgKE0ueDg2LlJfQUwgJiAweDAyKSBhdHRyID0gLSAxOwotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgYXR0ciA9IE0ueDg2LlJfQkw7Ci0gICAgdmlkZW9fYmlvc19wcmludF9zdHJpbmcocywgTS54ODYuUl9ESCwgTS54ODYuUl9ETCwgYXR0ciwgTS54ODYuUl9DWCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFg4NkFQSSBpbnQ0MihpbnQgaW50bm8pCi17Ci0gICAgc3dpdGNoIChNLng4Ni5SX0FIKQotICAgIHsKLSAgICBjYXNlIDB4MDA6Ci0JYmlvc19zZXRfbW9kZShNLng4Ni5SX0FMKTsKLQlicmVhazsKLSAgICBjYXNlIDB4MTM6Ci0JYmlvc19wcmludF9zdHJpbmcoKTsKLQlicmVhazsKLSAgICBkZWZhdWx0OgotCVBSSU5URigiV2FybmluZzogVklERU8gQklPUyBpbnRlcnJ1cHQgJXhoIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gJXhoLCBBTCA9ICV4aFxuIiwKLQkgICAgICAgaW50bm8sIE0ueDg2LlJfQUgsIE0ueDg2LlJfQUwpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgWDg2QVBJIGludDE1KGludCBpbnRubykKLXsKLSAgICBQUklOVEYoIkNhbGxlZCBpbnRlcnJ1cHQgMTVoOiBBWCA9ICV4aCwgQlggPSAleGgsIENYID0gJXhoLCBEWCA9ICV4aFxuIiwKLQkgICBNLng4Ni5SX0FYLCBNLng4Ni5SX0JYLCBNLng4Ni5SX0NYLCBNLng4Ni5SX0RYKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL2dsdWUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL2dsdWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4MGYwZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9nbHVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUgKzAsMCBAQAotI2luY2x1ZGUgPGNvbW1vbi5oPgotI2luY2x1ZGUgPHBjaS5oPgotI2luY2x1ZGUgPDc0eHhfN3h4Lmg+Ci0KLQotI2lmZGVmIERFQlVHCi0jdW5kZWYgREVCVUcKLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgUFJJTlRGKGZvcm1hdCwgYXJncy4uLikgX3ByaW50Zihmb3JtYXQgLCAjIyBhcmdzKQotI2Vsc2UKLSNkZWZpbmUgUFJJTlRGKGZvcm1hdCwgYXJnYy4uLikKLSNlbmRpZgotCi1zdGF0aWMgcGNpX2Rldl90IHRvX3BjaShpbnQgYnVzLCBpbnQgZGV2Zm4pCi17Ci0gICAgcmV0dXJuIFBDSV9CREYoYnVzLCAoZGV2Zm4+PjMpLCBkZXZmbiYzKTsKLX0KLQotaW50IG15cGNpX2ZpbmRfZGV2aWNlKGludCB2ZW5kb3IsIGludCBwcm9kdWN0LCBpbnQgaW5kZXgpCi17Ci0gICAgcmV0dXJuIHBjaV9maW5kX2RldmljZSh2ZW5kb3IsIHByb2R1Y3QsIGluZGV4KTsKLX0KLQotaW50IG15cGNpX2J1cyhpbnQgZGV2aWNlKQotewotICAgIHJldHVybiBQQ0lfQlVTKGRldmljZSk7Ci19Ci0KLWludCBteXBjaV9kZXZmbihpbnQgZGV2aWNlKQotewotICAgIHJldHVybiAoUENJX0RFVihkZXZpY2UpPDwzKSB8IFBDSV9GVU5DKGRldmljZSk7Ci19Ci0KLQotI2RlZmluZSBteXBjaV9yZWFkX2Z1bmModHlwZSwgc2l6ZSkJCQkJXAotdHlwZSBteXBjaV9yZWFkX2NmZ18jI3NpemUjIyhpbnQgYnVzLCBpbnQgZGV2Zm4sIGludCBvZmZzZXQpCVwKLXsJCQkJCQkJCVwKLSAgICB0eXBlIGM7CQkJCQkJCVwKLSAgICBwY2lfcmVhZF9jb25maWdfIyNzaXplIyModG9fcGNpKGJ1cywgZGV2Zm4pLCBvZmZzZXQsICZjKTsJXAotICAgIHJldHVybiBjOwkJCQkJCQlcCi19Ci0KLSNkZWZpbmUgbXlwY2lfd3JpdGVfZnVuYyh0eXBlLCBzaXplKQkJCQlcCi12b2lkIG15cGNpX3dyaXRlX2NmZ18jI3NpemUjIyhpbnQgYnVzLCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsIGludCB2YWx1ZSkJXAotewkJCQkJCQkJXAotICAgIHBjaV93cml0ZV9jb25maWdfIyNzaXplIyModG9fcGNpKGJ1cywgZGV2Zm4pLCBvZmZzZXQsIHZhbHVlKTsJXAotfQotCi1teXBjaV9yZWFkX2Z1bmModTgsYnl0ZSk7Ci1teXBjaV9yZWFkX2Z1bmModTE2LHdvcmQpOwotCi1teXBjaV93cml0ZV9mdW5jKHU4LGJ5dGUpOwotbXlwY2lfd3JpdGVfZnVuYyh1MTYsd29yZCk7Ci0KLXUzMiBteXBjaV9yZWFkX2NmZ19sb25nKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCkKLXsKLSAgICB1MzIgYzsKLSAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQodG9fcGNpKGJ1cywgZGV2Zm4pLCBvZmZzZXQsICZjKTsKLSAgICByZXR1cm4gYzsKLX0KLQotdm9pZCBteXBjaV93cml0ZV9jZmdfbG9uZyhpbnQgYnVzLCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRvX3BjaShidXMsIGRldmZuKSwgb2Zmc2V0LCB2YWx1ZSk7Ci19Ci0KLXZvaWQgX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ3M7Ci0gICAgY2hhciBidWZbQ0ZHX1BCU0laRV07Ci0KLSAgICB2YV9zdGFydChhcmdzLCBmbXQpOwotICAgICh2b2lkKXZzcHJpbnRmKGJ1ZiwgZm10LCBhcmdzKTsKLSAgICB2YV9lbmQoYXJncyk7Ci0KLSAgICBwcmludGYoYnVmKTsKLX0KLQotY2hhciAqX2dldGVudihjaGFyICpuYW1lKQotewotICAgIHJldHVybiBnZXRlbnYobmFtZSk7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgZ2V0X2Jhcl9zaXplKHBjaV9kZXZfdCBkZXYsIGludCBvZmZzZXQpCi17Ci0gICAgdTMyIGJhcl9iYWNrLCBiYXJfdmFsdWU7Ci0KLSAgICAvKiAgU2F2ZSBvbGQgQkFSIHZhbHVlICovCi0gICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgb2Zmc2V0LCAmYmFyX2JhY2spOwotCi0gICAgLyogIFdyaXRlIGFsbCAxJ3MuICovCi0gICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIG9mZnNldCwgfjApOwotCi0gICAgLyogIE5vdyByZWFkIGJhY2sgdGhlIHJlbGV2YW50IGJpdHMgKi8KLSAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBvZmZzZXQsICZiYXJfdmFsdWUpOwotCi0gICAgLyogIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWUgKi8KLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgb2Zmc2V0LCBiYXJfYmFjayk7Ci0KLSAgICBpZiAoYmFyX3ZhbHVlID09IDApIHJldHVybiAweEZGRkZGRkZGOyAvKiAgVGhpcyBCQVIgaXMgZGlzYWJsZWQgKi8KLQotICAgIGlmICgoYmFyX3ZhbHVlICYgUENJX0JBU0VfQUREUkVTU19TUEFDRSkgPT0gUENJX0JBU0VfQUREUkVTU19TUEFDRV9NRU1PUlkpCi0gICAgewotCS8qICBUaGlzIGlzIGEgbWVtb3J5IHNwYWNlIEJBUi4gTWFzayBpdCBvdXQgc28gd2UgZ2V0IHRoZSBzaXplIG9mIGl0ICovCi0JcmV0dXJuIH4oYmFyX3ZhbHVlICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSykgKyAxOwotICAgIH0KLQotICAgIC8qICBOb3Qgc3VpdGFibGUgKi8KLSAgICByZXR1cm4gMHhGRkZGRkZGRjsKLX0KLQotdm9pZCBlbmFibGVfY29tcGF0aWJpbGl0eV9ob2xlKHZvaWQpCi17Ci0gICAgdTggY2ZnOwotICAgIHBjaV9kZXZfdCBhcnQgPSBQQ0lfQkRGKDAsMCwwKTsKLQotICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGFydCwgMHg1NCwgJmNmZyk7Ci0gICAgLyogY2ZnIHw9IDB4MDg7ICovCi0gICAgY2ZnIHw9IDB4MjA7Ci0gICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFydCwgMHg1NCwgY2ZnKTsKLX0KLQotdm9pZCBkaXNhYmxlX2NvbXBhdGliaWxpdHlfaG9sZSh2b2lkKQotewotICAgIHU4IGNmZzsKLSAgICBwY2lfZGV2X3QgYXJ0ID0gUENJX0JERigwLDAsMCk7Ci0KLSAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShhcnQsIDB4NTQsICZjZmcpOwotICAgIC8qIGNmZyAmPSB+MHgwODsgKi8KLSAgICBjZmcgJj0gfjB4MjA7Ci0gICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFydCwgMHg1NCwgY2ZnKTsKLX0KLQotdm9pZCBtYXBfcm9tKHBjaV9kZXZfdCBkZXYsIHUzMiBhZGRyZXNzKQotewotICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfUk9NX0FERFJFU1MsIGFkZHJlc3N8UENJX1JPTV9BRERSRVNTX0VOQUJMRSk7Ci19Ci0KLXZvaWQgdW5tYXBfcm9tKHBjaV9kZXZfdCBkZXYpCi17Ci0gICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9ST01fQUREUkVTUywgMCk7Ci19Ci0KLXZvaWQgYmF0X21hcCh1OCBiYXRudW0sIHUzMiBhZGRyZXNzLCB1MzIgbGVuZ3RoKQotewotICAgIHUzMiB0ZW1wID0gYWRkcmVzczsKLSAgICBhZGRyZXNzICY9IDB4RkZGRTAwMDA7Ci0gICAgdGVtcCAgICAmPSAweDAwMDFGRkZGOwotICAgIGxlbmd0aCA9IChsZW5ndGggLSAxICkgPj4gMTc7Ci0gICAgbGVuZ3RoIDw8PSAyOwotCi0gICAgc3dpdGNoIChiYXRudW0pCi0gICAgewotICAgIGNhc2UgMDoKLQlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdHUgMCwgJTAiIDogOiAiciIgKGFkZHJlc3MgfCBsZW5ndGggfCAzKSk7Ci0JX19hc20gdm9sYXRpbGUgKCJtdGRiYXRsIDAsICUwIiA6IDogInIiIChhZGRyZXNzIHwgMHgyMikpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdHUgMSwgJTAiIDogOiAiciIgKGFkZHJlc3MgfCBsZW5ndGggfCAzKSk7Ci0JX19hc20gdm9sYXRpbGUgKCJtdGRiYXRsIDEsICUwIiA6IDogInIiIChhZGRyZXNzIHwgMHgyMikpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdHUgMiwgJTAiIDogOiAiciIgKGFkZHJlc3MgfCBsZW5ndGggfCAzKSk7Ci0JX19hc20gdm9sYXRpbGUgKCJtdGRiYXRsIDIsICUwIiA6IDogInIiIChhZGRyZXNzIHwgMHgyMikpOwotCWJyZWFrOwotICAgIGNhc2UgMzoKLQlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdHUgMywgJTAiIDogOiAiciIgKGFkZHJlc3MgfCBsZW5ndGggfCAzKSk7Ci0JX19hc20gdm9sYXRpbGUgKCJtdGRiYXRsIDMsICUwIiA6IDogInIiIChhZGRyZXNzIHwgMHgyMikpOwotCWJyZWFrOwotICAgIH0KLX0KLQotaW50IGZpbmRfaW1hZ2UodTMyIHJvbV9hZGRyZXNzLCB1MzIgcm9tX3NpemUsIHZvaWQgKippbWFnZSwgdTMyICppbWFnZV9zaXplKTsKLQotaW50IGF0dGVtcHRfbWFwX3JvbShwY2lfZGV2X3QgZGV2LCB2b2lkICpjb3B5X2FkZHJlc3MpCi17Ci0gICAgdTMyIHJvbV9zaXplICAgICAgPSAwOwotICAgIHUzMiByb21fYWRkcmVzcyAgID0gMDsKLSAgICB1MzIgYmFyX3NpemUgICAgICA9IDA7Ci0gICAgdTMyIGJhcl9iYWNrdXAgICAgPSAwOwotICAgIGludCBpLGo7Ci0gICAgdm9pZCAqaW1hZ2UgICAgICAgPSAwOwotICAgIHUzMiBpbWFnZV9zaXplICAgID0gMDsKLSAgICBpbnQgZGlkX2NvcnJlY3QgICA9IDA7Ci0gICAgdTMyIHByZWZldGNoX2FkZHIgPSAwOwotICAgIHUzMiBwcmVmZXRjaF9zaXplID0gMDsKLSAgICB1MzIgcHJlZmV0Y2hfaWR4ICA9IDA7Ci0KLSAgICAvKiAgR2V0IHRoZSBzaXplIG9mIHRoZSBleHBhbnNpb24gcm9tICovCi0gICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9ST01fQUREUkVTUywgMHhGRkZGRkZGRik7Ci0gICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLCAmcm9tX3NpemUpOwotICAgIGlmICgocm9tX3NpemUgJiAweDAxKSA9PSAwKQotICAgIHsKLQlQUklOVEYoIk5vIFJPTVxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcm9tX3NpemUgJj0gMHhGRkZGRjgwMDsKLSAgICByb21fc2l6ZSA9ICh+cm9tX3NpemUpKzE7Ci0KLSAgICBQUklOVEYoIlJPTSBTaXplIGlzICVkS1xuIiwgcm9tX3NpemUvMTAyNCk7Ci0KLSAgICAvKgotICAgICAqIFRyeSB0byBmaW5kIGEgcGxhY2UgZm9yIHRoZSBST00uIFdlIGFsd2F5cyBhdHRlbXB0IHRvIHVzZQotICAgICAqIG9uZSBvZiB0aGUgY2FyZCdzIGJhc2VzIGZvciB0aGlzLCBhcyB0aGlzIHdpbGwgYmUgaW4gYW55Ci0gICAgICogYnJpZGdlJ3MgcmVzb3VyY2UgcmFuZ2UgYXMgd2VsbCBhcyBiZWluZyBmcmVlIG9mIGNvbmZsaWN0cwotICAgICAqIHdpdGggb3RoZXIgY2FyZHMuIEluIGEgZ3JhcGhpY3MgY2FyZCBpdCBpcyB2ZXJ5IHVubGlrZWx5Ci0gICAgICogdGhhdCB0aGVyZSB3b24ndCBiZSBhbnkgYmFzZSBhZGRyZXNzIHRoYXQgaXMgbGFyZ2UgZW5vdWdoIHRvCi0gICAgICogaG9sZCB0aGUgcm9tLgotICAgICAqCi0gICAgICogRklYTUU6IFRvIHdvcmsgYXJvdW5kIHRoaXMsIHRoZW9yZXRpY2FsbHkgdGhlIGxhcmdlc3QgYmFzZQotICAgICAqIGNvdWxkIGJlIHVzZWQgaWYgbm9uZSBpcyBmb3VuZCBpbiB0aGUgbG9vcCBiZWxvdy4KLSAgICAgKi8KLQotICAgIGZvciAoaSA9IFBDSV9CQVNFX0FERFJFU1NfMDsgaSA8PSBQQ0lfQkFTRV9BRERSRVNTXzU7IGkgKz0gNCkKLSAgICB7Ci0JYmFyX3NpemUgPSBnZXRfYmFyX3NpemUoZGV2LCBpKTsKLQlQUklOVEYoIlBDSV9CQVNFX0FERFJFU1NfJWQgaXMgJWRLIGxhcmdlXG4iLAotCSAgICAgICAoaSAtIFBDSV9CQVNFX0FERFJFU1NfMCkvNCwKLQkgICAgICAgYmFyX3NpemUvMTAyNCk7Ci0JaWYgKGJhcl9zaXplICE9IDB4RkZGRkZGRkYgJiYgYmFyX3NpemUgPj0gcm9tX3NpemUpCi0JewotCSAgICBQUklOVEYoIkZvdW5kIGEgbWF0Y2ggZm9yIHJvbSBzaXplXG4iKTsKLQkgICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgaSwgJnJvbV9hZGRyZXNzKTsKLQkgICAgcm9tX2FkZHJlc3MgJj0gMHhGRkZGRkZGMDsKLQkgICAgaWYgKHJvbV9hZGRyZXNzICE9IDAgJiYgcm9tX2FkZHJlc3MgIT0gMHhGRkZGRkZGMCkgYnJlYWs7Ci0JfQotICAgIH0KLQotICAgIGlmIChyb21fYWRkcmVzcyA9PSAwIHx8IHJvbV9hZGRyZXNzID09IDB4RkZGRkZGRjApCi0gICAgewotCVBSSU5URigiTm8gc3VpdGFibGUgcm9tIGFkZHJlc3MgZm91bmRcbiIpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8qICBEaXNhYmxlIHRoZSBCQVIgKi8KLSAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBpLCAmYmFyX2JhY2t1cCk7Ci0gICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIGksIDApOwotCi0gICAgLyogIE1hcCBST00gKi8KLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLCByb21fYWRkcmVzcyB8IFBDSV9ST01fQUREUkVTU19FTkFCTEUpOwotCi0gICAgLyogIENvcHkgdGhlIHJvbSB0byBhIHBsYWNlIGluIHRoZSBlbXVsYXRvciBzcGFjZSAqLwotICAgIFBSSU5URigiQ2xhaW1pbmcgQkFUIDJcbiIpOwotICAgIGJhdF9tYXAoMiwgcm9tX2FkZHJlc3MsIHJvbV9zaXplKTsKLSAgICAvKiBzaG93X2JhdF9tYXBwaW5nKCk7ICovCi0KLSAgICBpZiAoMCA9PSBmaW5kX2ltYWdlKHJvbV9hZGRyZXNzLCByb21fc2l6ZSwgJmltYWdlLCAmaW1hZ2Vfc2l6ZSkpCi0gICAgewotCVBSSU5URigiTm8geDg2IEJJT1MgaW1hZ2UgZm91bmRcbiIpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIFBSSU5URigiQ29weWluZyAlbGQgYnl0ZXMgZnJvbSAweCVseCB0byAweCVseFxuIiwgKGxvbmcpaW1hZ2Vfc2l6ZSwgKGxvbmcpaW1hZ2UsIChsb25nKWNvcHlfYWRkcmVzcyk7Ci0KLSAgICAvKiBtZW1jcHkoY29weV9hZGRyZXNzLCByb21fYWRkcmVzcywgcm9tX3NpemUpOyAqLwotICAgIHsKLQl1bnNpZ25lZCBjaGFyICpmcm9tID0gKHVuc2lnbmVkIGNoYXIgKilpbWFnZTsgLyogcm9tX2FkZHJlc3M7ICovCi0JdW5zaWduZWQgY2hhciAqdG8gPSAodW5zaWduZWQgY2hhciAqKWNvcHlfYWRkcmVzczsKLQlmb3IgKGo9MDsgajxpbWFnZV9zaXplIC8qcm9tX3NpemUqLzsgaisrKQotCXsKLQkgICAgKnRvKysgPSAqZnJvbSsrOwotCX0KLSAgICB9Ci0KLSAgICBQUklOVEYoIkNvcHkgaXMgZG9uZVxuIik7Ci0KLSAgICAvKiAgVW5tYXAgdGhlIFJPTSBhbmQgcmVzdG9yZSB0aGUgQkFSICovCi0gICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9ST01fQUREUkVTUywgMCk7Ci0gICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIGksIGJhcl9iYWNrdXApOwotCi0gICAgLyogIEZJWE1FOiBTaG91bGRuJ3QgYmUgbmVlZGVkIGFueW1vcmUqLwotICAgIC8qIGJhdF9tYXAoMiwgMHg4MDAwMDAwMCwgMjU2KjEwMjQqMTAyNCk7Ci0gICAgICAgc2hvd19iYXRfbWFwcGluZygpOyAqLwotCi0gICAgLyoKLSAgICAgKiBTaW5jZSBtb3N0IGNhcmRzIGNhbiBwcm9iYWJseSBvbmx5IGRvIDE2IGJpdCBJTyBhZGRyZXNzaW5nLCB3ZQotICAgICAqIGNvcnJlY3QgdGhlaXIgSU8gYmFzZSBpbnRvIGFuIGFwcHJvcHJpYXRlIHZhbHVlLgotICAgICAqIFRoaXMgc2hvdWxkIGRvIGZvciBtb3N0LgotICAgICAqLwotICAgIGZvciAoaSA9IFBDSV9CQVNFX0FERFJFU1NfMDsgaSA8PSBQQ0lfQkFTRV9BRERSRVNTXzU7IGkgKz0gNCkKLSAgICB7Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBpLCAmdmFsdWUpOwotCWlmICh2YWx1ZSAmIDB4MDEpIC8qICBJTyAqLwotCXsKLQkgICAgZGlkX2NvcnJlY3QgPSAxOwotCSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgaSwgMHgxMDAxKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0JaWYgKHZhbHVlICYgUENJX0JBU0VfQUREUkVTU19NRU1fUFJFRkVUQ0gpCi0JewotCSAgICBwcmVmZXRjaF9pZHggPSBpOwotCSAgICBwcmVmZXRjaF9hZGRyID0gdmFsdWUgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOwotCSAgICBwcmVmZXRjaF9zaXplID0gZ2V0X2Jhcl9zaXplKGRldiwgaSk7Ci0JfQotICAgIH0KLQotICAgIGlmICgxKSAvKiBkaWRfY29ycmVjdCkgKi8KLSAgICB7Ci0JZXh0ZXJuIHBjaV9kZXZfdCBwY2lfZmluZF9icmlkZ2VfZm9yX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBidXNucik7Ci0JaW50IGJ1c25yID0gUENJX0JVUyhkZXYpOwotCWlmIChidXNucikKLQl7Ci0JICAgIHBjaV9kZXZfdCBicmlkZ2U7Ci0JICAgIFBSSU5URigiTmVlZCB0byBjb3JyZWN0IGJyaWRnZSBkZXZpY2UgZm9yIElPIHJhbmdlIGNoYW5nZVxuIik7Ci0JICAgIGJyaWRnZSA9IHBjaV9maW5kX2JyaWRnZV9mb3JfYnVzKE5VTEwsIGJ1c25yKTsKLQkgICAgaWYgKGJyaWRnZSA9PSBQQ0lfQU5ZX0lEKQotCSAgICB7Ci0JCVBSSU5URigiRGlkbid0IGZpbmQgYnJpZGdlLiBIb3BlIHRoYXQncyBPS1xuIik7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCS8qCi0JCSAqIFNldCB1cHBlciBJL08gYmFzZS9saW1pdCB0byAwCi0JCSAqLwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCAweDMwLCAweDAwKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgMHgzMSwgMHgwMCk7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4MzIsIDB4MDApOwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCAweDMzLCAweDAwKTsKLQkJaWYgKGRpZF9jb3JyZWN0KQotCQl7Ci0JCSAgICAvKgotCQkgICAgICogc2V0IGxvd2VyIEkvTyBiYXNlIHRvIDEwMDAKLQkJICAgICAqIFRoYXQgaXMsIGJpdHMgMDozIGFyZSBzZXQgdG8gMDAwMSBieSBkZWZhdWx0LgotCQkgICAgICogYml0cyA3OjQgY29udGFpbiBJL08gYWRkcmVzcyBiaXRzIDE1OjEyCi0JCSAgICAgKiBhbGwgb3RoZXJzIGFyZSBhc3N1bWVkIDAuCi0JCSAgICAgKi8KLQkJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4MUMsIDB4MTEpOwotCQkgICAgLyoKLQkJICAgICAqIFNldCBsb3dlciBJL08gbGltaXQgdG8gMUZGRgotCQkgICAgICogVGhhdCBpcywgYml0cyAwOjMgYXJlIHJlc2VydmVkIGFuZCBhbHdheXMgMDAwMAotCQkgICAgICogQml0cyA3OjQgY29udGFpbiBJL08gYWRkcmVzcyBiaXRzIDE1OjEyCi0JCSAgICAgKiBBbGwgb3RoZXJzIGFyZSBhc3N1bWVkIEYuCi0JCSAgICAgKi8KLQkJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4MUQsIDB4MTApOwotCQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgMHgwRCwgMHgyMCk7Ci0JCSAgICBQUklOVEYoIkNvcnJlY3RlZCBicmlkZ2UgcmVzb3VyY2UgcmFuZ2Ugb2YgYnJpZGdlIGF0ICUwMng6JTAyeDolMDJ4XG4iLAotCQkJICAgUENJX0JVUyhicmlkZ2UpLCBQQ0lfREVWKGJyaWRnZSksIFBDSV9GVU5DKGJyaWRnZSkpOwotCi0JCX0KLQkJZWxzZQotCQl7Ci0JCSAgICAvKgotCQkgICAgICogVGhpcyBjYXJkIGRvZXNuJ3QgaGF2ZSBJL08sIHdlIGRpc2FibGUgSS9PIGZvcndhcmRpbmcKLQkJICAgICAqLwotCQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgMHgxQywgMHgxMSk7Ci0JCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCAweDFELCAweDAwKTsKLQkJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIFBDSV9JTlRFUlJVUFRfTElORSwgMCk7Ci0JCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCBQQ0lfSU5URVJSVVBUX1BJTiwgMCk7Ci0JCSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX0NPTU1BTkQsIFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX0lPKTsKLQkJICAgIFBSSU5URigiRGlzYWJsZWQgYnJpZGdlIHJlc291cmNlIHJhbmdlIG9mIGJyaWRnZSBhdCAlMDJ4OiUwMng6JTAyeFxuIiwKLQkJCSAgIFBDSV9CVVMoYnJpZGdlKSwgUENJX0RFVihicmlkZ2UpLCBQQ0lfRlVOQyhicmlkZ2UpKTsKLQotCQl9Ci0JICAgIH0KLQkgICAgLyoKLQkgICAgICogQ29ycmVjdCB0aGUgcHJlZmV0Y2hhYmxlIG1lbW9yeSBiYXNlLCB3aGljaCBpcyBub3Qgc2V0IGNvcnJlY3RseSBieQotCSAgICAgKiB0aGUgVS1Cb290IGF1dG9jb25maWcgc3R1ZmYKLQkgICAgICovCi0JICAgIGlmIChwcmVmZXRjaF9pZHgpCi0JICAgIHsKLS8qIAkJUFJJTlRGKCJTZXR0aW5nIHByZWZldGNoYWJsZSByYW5nZSB0byAleCwgJXggKCV4IGFuZCAleClcbiIsICovCi0vKiAJCSAgICAgICBwcmVmZXRjaF9hZGRyLCBwcmVmZXRjaF9hZGRyK3ByZWZldGNoX3NpemUsICovCi0vKiAJCSAgICAgICBwcmVmZXRjaF9hZGRyPj4xNiwgKHByZWZldGNoX2FkZHIrcHJlZmV0Y2hfc2l6ZSk+PjE2KTsgKi8KLS8qIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGJyaWRnZSwgUENJX1BSRUZfTUVNT1JZX0JBU0UsIChwcmVmZXRjaF9hZGRyPj4xNikpOyAqLwotLyogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYnJpZGdlLCBQQ0lfUFJFRl9NRU1PUllfTElNSVQsIChwcmVmZXRjaF9hZGRyK3ByZWZldGNoX3NpemUpPj4xNik7ICovCi0JICAgIH0KLQotCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQoYnJpZGdlLCBQQ0lfUFJFRl9NRU1PUllfQkFTRSwgMHgxMDAwKTsKLQkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKGJyaWRnZSwgUENJX1BSRUZfTUVNT1JZX0xJTUlULCAweDAwMDApOwotCi0JICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4RDAsIDB4MEEpOwotCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCAweEQzLCAweDA0KTsKLQotCSAgICAvKgotCSAgICAgKiBTZXQgdGhlIGludGVycnVwdCBwaW4gdG8gMAotCSAgICAgKi8KLSNpZiAwCi0JICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgMCk7Ci0JICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAwKTsKLSNlbmRpZgotCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCBQQ0lfSU5URVJSVVBUX0xJTkUsIDApOwotCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCBQQ0lfSU5URVJSVVBUX1BJTiwgMCk7Ci0KLQl9Ci0gICAgfQotCi0gICAgLyogRmluYWxseSwgZW5hYmxlIHRoZSBjYXJkJ3MgSU8gYW5kIG1lbW9yeSByZXNwb25zZSAqLwotICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQ09NTUFORCwgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfSU8pOwotICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIDApOwotICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAwKTsKLQotICAgIHJldHVybiAxOwotfQotCi1pbnQgZmluZF9pbWFnZSh1MzIgcm9tX2FkZHJlc3MsIHUzMiByb21fc2l6ZSwgdm9pZCAqKmltYWdlLCB1MzIgKmltYWdlX3NpemUpCi17Ci0gICAgaW50IGkgPSAwOwotICAgIHVuc2lnbmVkIGNoYXIgKnJvbSA9ICh1bnNpZ25lZCBjaGFyICopcm9tX2FkZHJlc3M7Ci0gICAgLyogaWYgKCpyb20gIT0gMHg1NSB8fCAqKHJvbSsxKSAhPSAweEFBKSByZXR1cm4gMDsgLyogTm8gYmlvcyByb20gdGhpcyBpcywgeWVzLiAqLyAqLwotCi0gICAgZm9yICg7OykKLSAgICB7Ci0JdW5zaWduZWQgc2hvcnQgcGNpX2RhdGFfb2Zmc2V0ID0gKihyb20rMHgxOCkgKyAyNTYgKiAqKHJvbSsweDE5KTsKLQl1bnNpZ25lZCBzaG9ydCBwY2lfaW1hZ2VfbGVuZ3RoID0gKCoocm9tK3BjaV9kYXRhX29mZnNldCsweDEwKSArIDI1NiAqICoocm9tK3BjaV9kYXRhX29mZnNldCsweDExKSkgKiA1MTI7Ci0JdW5zaWduZWQgY2hhciBwY2lfaW1hZ2VfdHlwZSA9ICoocm9tK3BjaV9kYXRhX29mZnNldCsweDE0KTsKLQlpZiAoKnJvbSAhPSAweDU1IHx8ICoocm9tKzEpICE9IDB4QUEpCi0JewotCSAgICBQUklOVEYoIkludmFsaWQgaGVhZGVyIHRoaXMgaXNcbiIpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JUFJJTlRGKCJJbWFnZSAlaTogVHlwZSAlZCAoJXMpXG4iLCBpKyssIHBjaV9pbWFnZV90eXBlLAotCSAgICAgICBwY2lfaW1hZ2VfdHlwZT09MCA/ICJ4ODYiIDoKLQkgICAgICAgcGNpX2ltYWdlX3R5cGU9PTEgPyAiT3BlbkZpcm13YXJlIiA6Ci0JICAgICAgICJVbmtub3duIik7Ci0JaWYgKHBjaV9pbWFnZV90eXBlID09IDApCi0JewotCSAgICAqaW1hZ2UgPSByb207Ci0JICAgICppbWFnZV9zaXplID0gcGNpX2ltYWdlX2xlbmd0aDsKLQkgICAgcmV0dXJuIDE7Ci0JfQotCi0JaWYgKCoocm9tK3BjaV9kYXRhX29mZnNldCsweDE1KSAmIDB4ODApCi0JewotCSAgICBQUklOVEYoIkxBU1QgaW1hZ2UgZW5jb3VudGVyZWQsIG5vIGltYWdlIGZvdW5kXG4iKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCi0Jcm9tICs9IHBjaV9pbWFnZV9sZW5ndGg7Ci0gICAgfQotfQotCi12b2lkIHNob3dfYmF0X21hcHBpbmcodm9pZCkKLXsKLSAgICB1MzIgZGJhdDB1LCBkYmF0MGwsIGliYXQwdSwgaWJhdDBsOwotICAgIHUzMiBkYmF0MXUsIGRiYXQxbCwgaWJhdDF1LCBpYmF0MWw7Ci0gICAgdTMyIGRiYXQydSwgZGJhdDJsLCBpYmF0MnUsIGliYXQybDsKLSAgICB1MzIgZGJhdDN1LCBkYmF0M2wsIGliYXQzdSwgaWJhdDNsOwotICAgIHUzMiBtc3IsIGhpZDAsIGwyY3JfcmVnOwotCi0gICAgX19hc20gdm9sYXRpbGUgKCJtZmRiYXR1ICUwLDAiIDogIj1yIiAoZGJhdDB1KSk7Ci0gICAgX19hc20gdm9sYXRpbGUgKCJtZmRiYXRsICUwLDAiIDogIj1yIiAoZGJhdDBsKSk7Ci0gICAgX19hc20gdm9sYXRpbGUgKCJtZmliYXR1ICUwLDAiIDogIj1yIiAoaWJhdDB1KSk7Ci0gICAgX19hc20gdm9sYXRpbGUgKCJtZmliYXRsICUwLDAiIDogIj1yIiAoaWJhdDBsKSk7Ci0KLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1mZGJhdHUgJTAsMSIgOiAiPXIiIChkYmF0MXUpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1mZGJhdGwgJTAsMSIgOiAiPXIiIChkYmF0MWwpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1maWJhdHUgJTAsMSIgOiAiPXIiIChpYmF0MXUpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1maWJhdGwgJTAsMSIgOiAiPXIiIChpYmF0MWwpKTsKLQotICAgIF9fYXNtIHZvbGF0aWxlICgibWZkYmF0dSAlMCwyIiA6ICI9ciIgKGRiYXQydSkpOwotICAgIF9fYXNtIHZvbGF0aWxlICgibWZkYmF0bCAlMCwyIiA6ICI9ciIgKGRiYXQybCkpOwotICAgIF9fYXNtIHZvbGF0aWxlICgibWZpYmF0dSAlMCwyIiA6ICI9ciIgKGliYXQydSkpOwotICAgIF9fYXNtIHZvbGF0aWxlICgibWZpYmF0bCAlMCwyIiA6ICI9ciIgKGliYXQybCkpOwotCi0gICAgX19hc20gdm9sYXRpbGUgKCJtZmRiYXR1ICUwLDMiIDogIj1yIiAoZGJhdDN1KSk7Ci0gICAgX19hc20gdm9sYXRpbGUgKCJtZmRiYXRsICUwLDMiIDogIj1yIiAoZGJhdDNsKSk7Ci0gICAgX19hc20gdm9sYXRpbGUgKCJtZmliYXR1ICUwLDMiIDogIj1yIiAoaWJhdDN1KSk7Ci0gICAgX19hc20gdm9sYXRpbGUgKCJtZmliYXRsICUwLDMiIDogIj1yIiAoaWJhdDNsKSk7Ci0KLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1mbXNyICUwIiAgICAgOiAiPXIiIChtc3IpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1mc3ByICUwLDEwMDgiOiAiPXIiIChoaWQwKSk7Ci0gICAgX19hc20gdm9sYXRpbGUgKCJtZnNwciAlMCwxMDE3IjogIj1yIiAobDJjcl9yZWcpKTsKLQotICAgIHByaW50ZigiZGJhdDB1OiAlMDh4IGRiYXQwbDogJTA4eCBpYmF0MHU6ICUwOHggaWJhdDBsOiAlMDh4XG4iLAotCSAgIGRiYXQwdSwgZGJhdDBsLCBpYmF0MHUsIGliYXQwbCk7Ci0gICAgcHJpbnRmKCJkYmF0MXU6ICUwOHggZGJhdDFsOiAlMDh4IGliYXQxdTogJTA4eCBpYmF0MWw6ICUwOHhcbiIsCi0JICAgZGJhdDF1LCBkYmF0MWwsIGliYXQxdSwgaWJhdDFsKTsKLSAgICBwcmludGYoImRiYXQydTogJTA4eCBkYmF0Mmw6ICUwOHggaWJhdDJ1OiAlMDh4IGliYXQybDogJTA4eFxuIiwKLQkgICBkYmF0MnUsIGRiYXQybCwgaWJhdDJ1LCBpYmF0MmwpOwotICAgIHByaW50ZigiZGJhdDN1OiAlMDh4IGRiYXQzbDogJTA4eCBpYmF0M3U6ICUwOHggaWJhdDNsOiAlMDh4XG4iLAotCSAgIGRiYXQzdSwgZGJhdDNsLCBpYmF0M3UsIGliYXQzbCk7Ci0KLSAgICBwcmludGYoIlxuTVNSOiAlMDh4ICAgSElEMDogJTA4eCAgIEwyQ1I6ICUwOHggXG4iLCBtc3IsaGlkMCwgbDJjcl9yZWcpOwotfQotCi0KLXZvaWQgcmVtb3ZlX2luaXRfZGF0YSh2b2lkKQotewotICAgIGNoYXIgKnM7Ci0KLSAgICAvKiAgSW52YWxpZGF0ZSBhbmQgZGlzYWJsZSBkYXRhIGNhY2hlICovCi0gICAgaW52YWxpZGF0ZV9sMV9kYXRhX2NhY2hlKCk7Ci0gICAgZGNhY2hlX2Rpc2FibGUoKTsKLQotICAgIHMgPSBnZXRlbnYoIng4Nl9jYWNoZSIpOwotCi0gICAgaWYgKCFzKQotICAgIHsKLQlpY2FjaGVfZW5hYmxlKCk7Ci0JZGNhY2hlX2VuYWJsZSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChzKQotICAgIHsKLQlpZiAoc3RyY21wKHMsICJkY2FjaGUiKT09MCkKLQl7Ci0JICAgIGRjYWNoZV9lbmFibGUoKTsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKHMsICJpY2FjaGUiKSA9PSAwKQotCXsKLQkgICAgaWNhY2hlX2VuYWJsZSgpOwotCX0KLQllbHNlIGlmIChzdHJjbXAocywgIm9uIik9PSAwIHx8IHN0cmNtcChzLCAiYm90aCIpID09IDApCi0JewotCSAgICBkY2FjaGVfZW5hYmxlKCk7Ci0JICAgIGljYWNoZV9lbmFibGUoKTsKLQl9Ci0gICAgfQotCi0gICAgLyogICBzaG93X2JhdF9tYXBwaW5nKCk7Ki8KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL2dsdWUuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL2dsdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1ZWZlMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9nbHVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jaWZuZGVmIEdMVUVfSAotI2RlZmluZSBHTFVFX0gKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgcGNpX2Rldl90OwotCi1pbnQgbXlwY2lfZmluZF9kZXZpY2UoaW50IHZlbmRvciwgaW50IHByb2R1Y3QsIGludCBpbmRleCk7Ci1pbnQgbXlwY2lfYnVzKGludCBkZXZpY2UpOwotaW50IG15cGNpX2RldmZuKGludCBkZXZpY2UpOwotdW5zaWduZWQgbG9uZyBnZXRfYmFyX3NpemUocGNpX2Rldl90IGRldiwgaW50IG9mZnNldCk7Ci0KLXU4ICAgbXlwY2lfcmVhZF9jZmdfYnl0ZShpbnQgYnVzLCBpbnQgZGV2Zm4sIGludCBvZmZzZXQpOwotdTE2ICBteXBjaV9yZWFkX2NmZ193b3JkKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCk7Ci11MzIgIG15cGNpX3JlYWRfY2ZnX2xvbmcoaW50IGJ1cywgaW50IGRldmZuLCBpbnQgb2Zmc2V0KTsKLQotdm9pZCBteXBjaV93cml0ZV9jZmdfYnl0ZShpbnQgYnVzLCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsIHU4IHZhbHVlKTsKLXZvaWQgbXlwY2lfd3JpdGVfY2ZnX3dvcmQoaW50IGJ1cywgaW50IGRldmZuLCBpbnQgb2Zmc2V0LCB1MTYgdmFsdWUpOwotdm9pZCBteXBjaV93cml0ZV9jZmdfbG9uZyhpbnQgYnVzLCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsIHUzMiB2YWx1ZSk7Ci0KLXZvaWQgX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLik7Ci1jaGFyICpfZ2V0ZW52KGNoYXIgKm5hbWUpOwotCi12b2lkICptYWxsb2Moc2l6ZV90IHNpemUpOwotdm9pZCBtZW1zZXQodm9pZCAqYWRkciwgaW50IHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci12b2lkIG1lbWNweSh2b2lkICp0bywgdm9pZCAqZnJvbSwgc2l6ZV90IG51bWJ5dGVzKTsKLWludCAgc3RyY21wKGNoYXIgKiwgY2hhciAqKTsKLQotdm9pZCBlbmFibGVfY29tcGF0aWJpbGl0eV9ob2xlKHZvaWQpOwotdm9pZCBkaXNhYmxlX2NvbXBhdGliaWxpdHlfaG9sZSh2b2lkKTsKLQotdm9pZCBtYXBfcm9tKHBjaV9kZXZfdCBkZXYsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyk7Ci12b2lkIHVubWFwX3JvbShwY2lfZGV2X3QgZGV2KTsKLWludCAgYXR0ZW1wdF9tYXBfcm9tKHBjaV9kZXZfdCBkZXYsIHZvaWQgKmNvcHlfYWRkcmVzcyk7Ci0KLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0UgMHgwMSAgICAvKiAwID0gbWVtb3J5LCAxID0gSS9PICovCi0jZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPIDB4MDEKLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfTUVNT1JZIDB4MDAKLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0sgICAgICAofjB4MGZVTCkKLQotI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzAgICAgICAweDEwICAgIC8qIDMyIGJpdHMgKi8KLSNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18xICAgICAgMHgxNCAgICAvKiAzMiBiaXRzIFtodHlwZSAwLDEgb25seV0gKi8KLSNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18yICAgICAgMHgxOCAgICAvKiAzMiBiaXRzIFtodHlwZSAwIG9ubHldICovCi0jZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMyAgICAgIDB4MWMgICAgLyogMzIgYml0cyAqLwotI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzQgICAgICAweDIwICAgIC8qIDMyIGJpdHMgKi8KLSNkZWZpbmUgUENJX0JBU0VfQUREUkVTU181ICAgICAgMHgyNCAgICAvKiAzMiBiaXRzICovCi0jZGVmaW5lIFBDSV9CVVMoZCkgICAgICAoKChkKSA+PiAxNikgJiAweGZmKQotI2RlZmluZSBQQ0lfREVWKGQpICAgICAgKCgoZCkgPj4gMTEpICYgMHgxZikKLSNkZWZpbmUgUENJX0ZVTkMoZCkgICAgICgoKGQpID4+IDgpICYgMHg3KQotI2RlZmluZSBQQ0lfQkRGKGIsZCxmKSAgKChiKSA8PCAxNiB8IChkKSA8PCAxMSB8IChmKSA8PCA4KQotCi0jZGVmaW5lIFBDSV9BTllfSUQgKH4wKQotI2RlZmluZSBQQ0lfUk9NX0FERFJFU1MgICAgICAgICAweDMwICAgIC8qIEJpdHMgMzEuLjExIGFyZSBhZGRyZXNzLCAxMC4uMSByZXNlcnZlZCAqLwotI2RlZmluZSBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFIDB4MDEKLQotI2RlZmluZSBPRkYoYWRkcikgKChhZGRyKSAmIDB4RkZGRikKLSNkZWZpbmUgU0VHKGFkZHIpICgoKGFkZHIpPj40KSAmMHhGMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjMzEtZDE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjMzEtZDE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzc2ZDEzOC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzMxLWQxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgMy4xLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MxNlxCQzM7JUJDM19QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMTZcQkMzOyVCQzNfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzNfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzLk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9TTkFQPQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzNfUEFUSCVcQklOOyVERUZQQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkMzX1BBVEglXEJJTlx0dXJib2MuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDM19QQVRIJVxCSU5cdHVyYm9jLmNmZwotZWNobyAtTCVMSUIlID4gJUJDM19QQVRIJVxCSU5cdGxpbmsuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgMy4xIERPUyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtYzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtYzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDI5MzlmNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LWMzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNC41IGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXEJDNDslQkM0X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxCQzQ7JUJDNF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNF9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9CQzU9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNF9QQVRIJVxCSU47JURFRlBBVEglJUJDX0NEX1BBVEglCi0KLVJFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQotaWYgTk9UIC4lMSU9PS5zZGsgZ290byBjcmVhdGVmaWxlcwotY2FsbCB3aW4zMnNkay5iYXQgYm9ybGFuZAotCi06Y3JlYXRlZmlsZXMKLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNF9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA0LjUgMzIgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LWQxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LWQxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0NjUxN2QuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1kMTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDQuNSBpbiAxNiBiaXQgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMTZcQkM0OyVCQzRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzE2XEJDNDslQkM0X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM0X1BBVEglXElOQ0xVREUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMxNi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9CQzU9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNF9QQVRIJVxCSU47JURFRlBBVEglJUJDX0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzRfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM0X1BBVEglXEJJTlx0dXJib2MuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM0X1BBVEglXEJJTlx0bGluay5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA0LjUgMTYgYml0IERPUyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtZDMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtZDMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2JiMmM3OS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LWQzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNC41IGluIDMyIGJpdCBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxCQzQ7JUJDNF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcQkM0OyVCQzRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzRfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX0JDNT0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzQKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM0X1BBVEglXEJJTjslREVGUEFUSCUlQkNfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM0X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDQuNSAzMiBiaXQgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwIChEUE1JMzIpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1zbnAuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1zbnAuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNGQ3YzA1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtc25wLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA0LjUgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU05BUFxCQzQ7JUJDNF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU05BUFxCQzQ7JUJDNF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9CQzU9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPTEKLVNFVCBCQ19MSUJCQVNFPUJDNAotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzRfUEFUSCVcQklOOyVERUZQQVRIJSVCQ19DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkM0X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM0X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzRfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgNC41IFNuYXAgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXRudC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXRudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwYmQzY2IuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS10bnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDQuNSBpbiAzMiBiaXQgbW9kZSB3aXRoIFBoYXIgTGFwIFROVAotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxCQzQ7JUJDNF9QQVRIJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcQkM0OyVCQzRfUEFUSCVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzRfUEFUSCVcSU5DTFVERTslVE5UX1BBVEglXElOQ0xVREU7Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfRFBNSTE2PQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPTEKLVNFVCBVU0VfQkM1PQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNAotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzRfUEFUSCVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVCQ19DRF9QQVRIJQotCi1SRU0gSWYgeW91IHNldCB0aGUgZm9sbG93aW5nIHRvIGEgMSwgYSBUTlQgRG9zU3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4KLVJFTSBPdGhlcndpc2UgYSBUTlQgTnRTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLiBOdFN0eWxlIGFwcHMgd2lsbCAqb25seSoKLVJFTSBydW4gdW5kZXIgcmVhbCBET1Mgd2hlbiB1c2luZyBvdXIgbGlicmFyaWVzLCBzaW5jZSB3ZSByZXF1aXJlIGFjY2VzcwotUkVNIHRvIGZ1bmN0aW9ucyB0aGF0IHRoZSBXaW4zMiBBUEkgZG9lcyBub3Qgc3VwcG9ydCAoc3VjaCBhcyBkaXJlY3QgYWNjZXNzCi1SRU0gdG8gdmlkZW8gbWVtb3J5LCBjYWxsaW5nIEludCAxMGggQklPUyBmdW5jdGlvbnMgZXRjKS4gRG9zU3R5bGUgYXBwcwotUkVNIHdpbGwgaG93ZXZlciBydW4gZmluZSBpbiBib3RoIERPUyBhbmQgYSBXaW45NSBET1MgYm94IChOVCBET1MgYm94ZXMgZG9uJ3QKLVJFTSB3b3JrIHRvbyB3ZWxsKS4KLVJFTQotUkVNIElmIHlvdSBhcmUgdXNpbmcgdGhlIFJlYWxUaW1lIERPUyBleHRlbmRlciwgeW91ciBhcHBzICptdXN0KiBiZSBOdFN0eWxlLAotUkVNIGFuZCBoZW5jZSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gcnVuIHVuZGVyIFdpbjk1IG9yIFdpbk5ULCBvbmx5IERPUy4KLQotU0VUIERPU1NUWUxFPQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkM0X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM0X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzRfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgNC41IDMyIGJpdCBET1MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAgKFROVCkuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXZ4ZC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXZ4ZC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiNTlmYTQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS12eGQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDQuNSBpbiAzMiBiaXQgV2luZG93cyBWeEQgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcVlhEXEJDNDslQkM0X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xWWERcQkM0OyVCQzRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzRfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0xCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfQkM1PQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNAotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzRfUEFUSCVcQklOOyVERUZQQVRIJSVCQ19DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkM0X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM0X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzRfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgNC41IDMyLWJpdCBWeEQgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXcxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXcxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkNzk5YjQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS13MTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDQuNSBpbiAxNiBiaXQgV2luZG93cyBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4xNlxCQzQ7JUJDNF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcQkM0OyVCQzRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzRfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMxNi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PTEKLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfQkM1PQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNAotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzRfUEFUSCVcQklOOyVERUZQQVRIJSVCQ19DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkM0X1BBVEglXEJJTlx0dXJib2MuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNF9QQVRIJVxCSU5cdHVyYm9jLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNF9QQVRIJVxCSU5cdGxpbmsuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgNC41IDE2IGJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS13MzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS13MzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNmMxOTlmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA0LjUgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcQkM0OyVCQzRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXEJDNDslQkM0X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM0X1BBVEglXElOQ0xVREU7Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX0JDNT0KLVNFVCBXSU4zMl9HVUk9MQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNF9QQVRIJVxCSU47JURFRlBBVEglJUJDX0NEX1BBVEglCi0KLVJFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQotaWYgTk9UIC4lMSU9PS5zZGsgZ290byBjcmVhdGVmaWxlcwotY2FsbCB3aW4zMnNkay5iYXQgYm9ybGFuZAotCi06Y3JlYXRlZmlsZXMKLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNF9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA0LjUgMzIgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLWMzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLWMzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhMGZkZTIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1jMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDUuMCBpbiAzMiBiaXQgV2luZG93cyBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcQkM1OyVCQzVfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgQ19JTkNMVURFPSVCQzVfUEFUSCVcSU5DTFVERQotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKLWlmIE5PVCAuJTElPT0uc2RrIGdvdG8gY3JlYXRlZmlsZXMKLWNhbGwgd2luMzJzZGsuYmF0IGJvcmxhbmQKLQotOmNyZWF0ZWZpbGVzCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgNS4wIDMyIGJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1kMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1kMTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyM2I1MDM4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtZDE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMTYgYml0IG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzE2XEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MxNlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNV9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzE2Lk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzVfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM1X1BBVEglXEJJTlx0dXJib2MuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM1X1BBVEglXEJJTlx0bGluay5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA1LjAgMTYgYml0IERPUyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtZDMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtZDMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDUyMWY5My4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLWQzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNS4wIGluIDMyIGJpdCBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcQkM1OyVCQzVfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzVfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA1LjAgMzIgYml0IERPUyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cCAoRFBNSTMyKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtc214LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtc214LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTMyNDFmZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXNteC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNS4wIGluIDMyIGJpdCBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTVgzMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU01YMzJcQkM1OyVCQzVfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzVfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1NNWDMyPTEKLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgNS4wIDMyIGJpdCBTTVggY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAgKFNNWDMyKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtc25wLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtc25wLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWIzYWNkMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXNucC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNS4wIGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFNOQVBcQkM1OyVCQzVfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFNOQVBcQkM1OyVCQzVfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFVTRV9CQzU9MQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0xCi1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA1LjAgU25hcCBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdG50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdG50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGRjYzM3Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXRudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNS4wIGluIDMyIGJpdCBtb2RlIHdpdGggUGhhciBMYXAgVE5UCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXEJDNTslQkM1X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxCQzU7JUJDNV9QQVRIJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNV9QQVRIJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9MQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNV9QQVRIJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJUJDX0NEX1BBVEglCi0KLVJFTSBJZiB5b3Ugc2V0IHRoZSBmb2xsb3dpbmcgdG8gYSAxLCBhIFROVCBEb3NTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLgotUkVNIE90aGVyd2lzZSBhIFROVCBOdFN0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuIE50U3R5bGUgYXBwcyB3aWxsICpvbmx5KgotUkVNIHJ1biB1bmRlciByZWFsIERPUyB3aGVuIHVzaW5nIG91ciBsaWJyYXJpZXMsIHNpbmNlIHdlIHJlcXVpcmUgYWNjZXNzCi1SRU0gdG8gZnVuY3Rpb25zIHRoYXQgdGhlIFdpbjMyIEFQSSBkb2VzIG5vdCBzdXBwb3J0IChzdWNoIGFzIGRpcmVjdCBhY2Nlc3MKLVJFTSB0byB2aWRlbyBtZW1vcnksIGNhbGxpbmcgSW50IDEwaCBCSU9TIGZ1bmN0aW9ucyBldGMpLiBEb3NTdHlsZSBhcHBzCi1SRU0gd2lsbCBob3dldmVyIHJ1biBmaW5lIGluIGJvdGggRE9TIGFuZCBhIFdpbjk1IERPUyBib3ggKE5UIERPUyBib3hlcyBkb24ndAotUkVNIHdvcmsgdG9vIHdlbGwpLgotUkVNCi1SRU0gSWYgeW91IGFyZSB1c2luZyB0aGUgUmVhbFRpbWUgRE9TIGV4dGVuZGVyLCB5b3VyIGFwcHMgKm11c3QqIGJlIE50U3R5bGUsCi1SRU0gYW5kIGhlbmNlIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBydW4gdW5kZXIgV2luOTUgb3IgV2luTlQsIG9ubHkgRE9TLgotCi1TRVQgRE9TU1RZTEU9Ci0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA1LjAgMzIgYml0IERPUyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cCAoVE5UKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdnhkLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdnhkLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjM1NjkxMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXZ4ZC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNS4wIGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFZYRFxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcVlhEXEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM1X1BBVEglXElOQ0xVREU7Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9MQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA1LjAgMzIgYml0IFdpbmRvd3MgKFZ4RCkgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXcxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXcxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkNzlkODYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC13MTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIEBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMTYgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMTZcQkM1OyVCQzVfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjE2XEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM1X1BBVEglXElOQ0xVREU7Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMTYuTUsKLVNFVCBVU0VfRFBNSTE2PQotU0VUIFVTRV9XSU4xNj0xCi1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzVfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM1X1BBVEglXEJJTlx0dXJib2MuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM1X1BBVEglXEJJTlx0bGluay5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA1LjAgMTYgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXczMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXczMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhiOGNlYzkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC13MzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDUuMCBpbiAzMiBiaXQgV2luZG93cyBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcQkM1OyVCQzVfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgQ19JTkNMVURFPSVCQzVfUEFUSCVcSU5DTFVERQotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCi1pZiBOT1QgLiUxJT09LnNkayBnb3RvIGNyZWF0ZWZpbGVzCi1jYWxsIHdpbjMyc2RrLmJhdCBib3JsYW5kCi0KLTpjcmVhdGVmaWxlcwotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDUuMCAzMiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAteDExLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAteDExLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWJmZWIyZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXgxMS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNS4wIGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNV9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDUuMCAzMiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtYzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtYzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmUwOTQyOC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LWMzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBDX0lOQ0xVREU9JUJDQjVfUEFUSCVcSU5DTFVERQotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDQjVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCi1pZiBOT1QgLiUxJT09LnNkayBnb3RvIGNyZWF0ZWZpbGVzCi1jYWxsIHdpbjMyc2RrLmJhdCBib3JsYW5kCi0KLTpjcmVhdGVmaWxlcwotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQ0I1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIDMyIGJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1kMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1kMTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYTEzZTdkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtZDE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCBpbiAxNiBiaXQgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMTZcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMTZcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDQjVfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMxNi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDQjVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDQjVfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkNCNV9QQVRIJVxCSU5cdHVyYm9jLmNmZwotZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIDE2IGJpdCBET1MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LWQzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LWQzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwMDE3ZDQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1kMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIGluIDMyIGJpdCBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkNCNV9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFVTRV9CQzU9MQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQ0I1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkNCNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCAzMiBiaXQgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwIChEUE1JMzIpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1zbXguYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1zbXguYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjk2OWE5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtc214LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCBpbiAzMiBiaXQgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU01YMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU01YMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDQjVfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1NNWDMyPTEKLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDQjVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQ0I1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIDMyIGJpdCBTTVggY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAgKFNNWDMyKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtc25wLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtc25wLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDdiOGZmMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXNucC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU05BUFxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTkFQXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFVTRV9CQzU9MQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0xCi1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkNCNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgU25hcCBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdG50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdG50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWRlMzYwMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXRudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMzIgYml0IG1vZGUgd2l0aCBQaGFyIExhcCBUTlQKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDQjVfUEFUSCVcSU5DTFVERTslVE5UX1BBVEglXElOQ0xVREU7Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfRFBNSTE2PQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPTEKLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFVTRV9CQzU9MQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQ0I1X1BBVEglXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlQkNfQ0RfUEFUSCUKLQotUkVNIElmIHlvdSBzZXQgdGhlIGZvbGxvd2luZyB0byBhIDEsIGEgVE5UIERvc1N0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuCi1SRU0gT3RoZXJ3aXNlIGEgVE5UIE50U3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4gTnRTdHlsZSBhcHBzIHdpbGwgKm9ubHkqCi1SRU0gcnVuIHVuZGVyIHJlYWwgRE9TIHdoZW4gdXNpbmcgb3VyIGxpYnJhcmllcywgc2luY2Ugd2UgcmVxdWlyZSBhY2Nlc3MKLVJFTSB0byBmdW5jdGlvbnMgdGhhdCB0aGUgV2luMzIgQVBJIGRvZXMgbm90IHN1cHBvcnQgKHN1Y2ggYXMgZGlyZWN0IGFjY2VzcwotUkVNIHRvIHZpZGVvIG1lbW9yeSwgY2FsbGluZyBJbnQgMTBoIEJJT1MgZnVuY3Rpb25zIGV0YykuIERvc1N0eWxlIGFwcHMKLVJFTSB3aWxsIGhvd2V2ZXIgcnVuIGZpbmUgaW4gYm90aCBET1MgYW5kIGEgV2luOTUgRE9TIGJveCAoTlQgRE9TIGJveGVzIGRvbid0Ci1SRU0gd29yayB0b28gd2VsbCkuCi1SRU0KLVJFTSBJZiB5b3UgYXJlIHVzaW5nIHRoZSBSZWFsVGltZSBET1MgZXh0ZW5kZXIsIHlvdXIgYXBwcyAqbXVzdCogYmUgTnRTdHlsZSwKLVJFTSBhbmQgaGVuY2Ugd2lsbCBuZXZlciBiZSBhYmxlIHRvIHJ1biB1bmRlciBXaW45NSBvciBXaW5OVCwgb25seSBET1MuCi0KLVNFVCBET1NTVFlMRT0KLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQ0I1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIDMyIGJpdCBET1MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAgKFROVCkuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXZ4ZC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXZ4ZC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4ZGU1OGMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS12eGQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFZYRFxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xWWERcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDQjVfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0xCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFVTRV9CQzU9MQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQ0I1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkNCNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCAzMiBiaXQgV2luZG93cyAoVnhEKSBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzMwZDAwNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXcxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0gQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIGluIDE2IGJpdCBXaW5kb3dzIG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjE2XEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjE2XEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQ0I1X1BBVEglXElOQ0xVREU7Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMTYuTUsKLVNFVCBVU0VfRFBNSTE2PQotU0VUIFVTRV9XSU4xNj0xCi1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkNCNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cdHVyYm9jLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQ0I1X1BBVEglXEJJTlx0dXJib2MuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkNCNV9QQVRIJVxCSU5cdGxpbmsuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMTYgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXczMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXczMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE4NzYwZTEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS13MzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgQ19JTkNMVURFPSVCQ0I1X1BBVEglXElOQ0xVREUKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUNfSU5DTFVERSUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFVTRV9CQzU9MQotU0VUIFdJTjMyX0dVST0xCi1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkNCNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKLWlmIE5PVCAuJTElPT0uc2RrIGdvdG8gY3JlYXRlZmlsZXMKLWNhbGwgd2luMzJzZGsuYmF0IGJvcmxhbmQKLQotOmNyZWF0ZWZpbGVzCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMzIgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXgxMS5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXgxMS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5OGMxYTIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS14MTEuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQ0I1X1BBVEglXElOQ0xVREU7Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9MQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDQjVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQ0I1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIDMyIGJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYnVpbGQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmYxOTczZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMhIC9iaW4vc2gKLQotaWYgWyAkIyAtbHQgMSBdIHx8ICggWyAiJDEiICE9IGdjYy1saW51eCBdICYmIFsgIiQxIiAhPSBxbng0IF0gKSA7IHRoZW4KLQllY2hvIFVzYWdlOiAkMCBjb21waWxlcl9uYW1lIFtETUFLRSBjb21tYW5kc10KLQllY2hvCi0JZWNobyBDdXJyZW50IGNvbXBpbGVyczoKLQllY2hvICIgIGdjYy1saW51eCAgLSBHTlUgQy9DKysgMi43IG9yIGhpZ2hlciwgMzIgYml0IgotCWVjaG8gIiAgcW54NCAgLSBXYXRjb20gQy9DKysgMTAuNiBvciBoaWdoZXIsIDMyIGJpdCIKLQlleGl0IDEKLWZpCi0KLXVuc2V0IERCRyBPUFQgT1BUX1NJWkUgQlVJTERfRExMIElNUE9SVF9ETEwgRlBVIENIRUNLUyBCRVRBCi0uICR7MX0uc2gKLQotc2hpZnQKLWRtYWtlICQqICYmIGV4aXQgMAotCi1lY2hvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWVjaG8gKiBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBidWlsZGluZyB0aGUgbGlicmFyeS4gKgotZWNobyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1leGl0IDEKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYnVpbGQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYnVpbGQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZTI5MDkzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotQGVjaG8gb2ZmCi1yZW0gRGlzYWJsZSBjaGVja2VkIGJ1aWxkIGFuZCBidWlsZCByZWxlYXNlIGNvZGUKLXNldCBDSEVDS0VEPQotY2FsbCBidWlsZF9pdC5iYXQgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkX2RiLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkX2RiLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmIzMjUyOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZF9kYi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLUBlY2hvIG9mZgotcmVtIEVuYWJsZSBjaGVja2VkIGJ1aWxkIGFuZCBidWlsZCBkZWJ1ZyBjb2RlCi1zZXQgQ0hFQ0tFRD0xCi1jYWxsIGJ1aWxkX2l0LmJhdCAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYnVpbGRfaXQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYnVpbGRfaXQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTYxOWI0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkX2l0LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQzMiArMCwwIEBACi1AZWNobyBvZmYKLXJlbSBHZW5lcmljIGJhdGNoIGZpbGUgdG8gYnVpbGQgYSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBUaGlzIGJhdGNoIGZpbGUKLXJlbSBhc3N1bWVzIHRoYXQgdGhlIGNvcnJlY3QgYmF0Y2ggZmlsZXMgZXhpc3QgdG8gc2V0dXAgdGhlIGFwcHJvcHJpYXRlCi1yZW0gY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCBhbmQgdGhhdCB0aGUgRE1BS0UuRVhFIHByb2dyYW0gaXMgYXZhaWxhYmxlCi1yZW0gc29tZXdoZXJlIG9uIHRoZSBwYXRoLgotcmVtCi1yZW0gQnVpbGRzIGFzIHJlbGVhc2Ugb3IgZGVidWcgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgQ0hFQ0tFRAotcmVtIGVudmlyb25tZW50IHZhcmlhYmxlLgotCi1yZW0gVW5zZXQgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IGNoYW5nZSB0aGUgY29tcGlsZSBwcm9jZXNzCi1zZXQgREJHPQotc2V0IE9QVD0KLXNldCBPUFRfU0laRT0KLXNldCBCVUlMRF9ETEw9Ci1zZXQgSU1QT1JUX0RMTD0KLXNldCBGUFU9Ci1zZXQgQ0hFQ0tTPQotc2V0IEJFVEE9Ci0KLWlmICUxPT1iYzMxLWQxNiBnb3RvIGJjMzEtZDE2Ci1pZiAlMT09YmM0NS1kMTYgZ290byBiYzQ1LWQxNgotaWYgJTE9PWJjNDUtZDMyIGdvdG8gYmM0NS1kMzIKLWlmICUxPT1iYzQ1LXRudCBnb3RvIGJjNDUtdG50Ci1pZiAlMT09YmM0NS13MTYgZ290byBiYzQ1LXcxNgotaWYgJTE9PWJjNDUtdzMyIGdvdG8gYmM0NS13MzIKLWlmICUxPT1iYzQ1LWMzMiBnb3RvIGJjNDUtYzMyCi1pZiAlMT09YmM0NS12eGQgZ290byBiYzQ1LXZ4ZAotaWYgJTE9PWJjNDUtc25wIGdvdG8gYmM0NS1zbnAKLWlmICUxPT1iYzUwLWQxNiBnb3RvIGJjNTAtZDE2Ci1pZiAlMT09YmM1MC1kMzIgZ290byBiYzUwLWQzMgotaWYgJTE9PWJjNTAtdG50IGdvdG8gYmM1MC10bnQKLWlmICUxPT1iYzUwLXcxNiBnb3RvIGJjNTAtdzE2Ci1pZiAlMT09YmM1MC13MzIgZ290byBiYzUwLXczMgotaWYgJTE9PWJjNTAtYzMyIGdvdG8gYmM1MC1jMzIKLWlmICUxPT1iYzUwLXZ4ZCBnb3RvIGJjNTAtdnhkCi1pZiAlMT09YmM1MC1zbnAgZ290byBiYzUwLXNucAotaWYgJTE9PWdjYzItZDMyIGdvdG8gZ2NjMi1kMzIKLWlmICUxPT1nY2MyLXczMiBnb3RvIGdjYzItdzMyCi1pZiAlMT09Z2NjMi1jMzIgZ290byBnY2MyLWMzMgotaWYgJTE9PWdjYzItbGludXggZ290byBnY2MyLWxpbnV4Ci1pZiAlMT09dmM0MC1kMTYgZ290byB2YzQwLWQxNgotaWYgJTE9PXZjNDAtdG50IGdvdG8gdmM0MC10bnQKLWlmICUxPT12YzQwLXcxNiBnb3RvIHZjNDAtdzE2Ci1pZiAlMT09dmM0MC13MzIgZ290byB2YzQwLXczMgotaWYgJTE9PXZjNDAtYzMyIGdvdG8gdmM0MC1jMzIKLWlmICUxPT12YzQwLWRydjl4IGdvdG8gdmM0MC1kcnY5eAotaWYgJTE9PXZjNDAtZHJ2bnQgZ290byB2YzQwLWRydm50Ci1pZiAlMT09dmM0MC1ydHQgZ290byB2YzQwLXJ0dAotaWYgJTE9PXZjNDAtc25wIGdvdG8gdmM0MC1zbnAKLWlmICUxPT12YzUwLWQxNiBnb3RvIHZjNTAtZDE2Ci1pZiAlMT09dmM1MC10bnQgZ290byB2YzUwLXRudAotaWYgJTE9PXZjNTAtdzE2IGdvdG8gdmM1MC13MTYKLWlmICUxPT12YzUwLXczMiBnb3RvIHZjNTAtdzMyCi1pZiAlMT09dmM1MC1jMzIgZ290byB2YzUwLWMzMgotaWYgJTE9PXZjNTAtZHJ2OXggZ290byB2YzUwLWRydjl4Ci1pZiAlMT09dmM1MC1kcnZudCBnb3RvIHZjNTAtZHJ2bnQKLWlmICUxPT12YzUwLXJ0dCBnb3RvIHZjNTAtcnR0Ci1pZiAlMT09dmM1MC1zbnAgZ290byB2YzUwLXNucAotaWYgJTE9PXZjNjAtZDE2IGdvdG8gdmM2MC1kMTYKLWlmICUxPT12YzYwLXRudCBnb3RvIHZjNjAtdG50Ci1pZiAlMT09dmM2MC13MTYgZ290byB2YzYwLXcxNgotaWYgJTE9PXZjNjAtdzMyIGdvdG8gdmM2MC13MzIKLWlmICUxPT12YzYwLWMzMiBnb3RvIHZjNjAtYzMyCi1pZiAlMT09dmM2MC1kcnY5eCBnb3RvIHZjNjAtZHJ2OXgKLWlmICUxPT12YzYwLWRydm50IGdvdG8gdmM2MC1kcnZudAotaWYgJTE9PXZjNjAtZHJ2dzJrIGdvdG8gdmM2MC1kcnZ3MmsKLWlmICUxPT12YzYwLXJ0dCBnb3RvIHZjNjAtcnR0Ci1pZiAlMT09dmM2MC1zbnAgZ290byB2YzYwLXNucAotaWYgJTE9PXdjMTBhZDE2IGdvdG8gd2MxMGFkMTYKLWlmICUxPT13YzEwYWQzMiBnb3RvIHdjMTBhZDMyCi1pZiAlMT09d2MxMGF0bnQgZ290byB3YzEwYXRudAotaWYgJTE9PXdjMTBhdzE2IGdvdG8gd2MxMGF3MTYKLWlmICUxPT13YzEwYXczMiBnb3RvIHdjMTBhdzMyCi1pZiAlMT09d2MxMGFjMzIgZ290byB3YzEwYWMzMgotaWYgJTE9PXdjMTBhbzMyIGdvdG8gd2MxMGFvMzIKLWlmICUxPT13YzEwYXAzMiBnb3RvIHdjMTBhcDMyCi1pZiAlMT09d2MxMGFzbnAgZ290byB3YzEwYXNucAotaWYgJTE9PXdjMTAtZDE2IGdvdG8gd2MxMC1kMTYKLWlmICUxPT13YzEwLWQzMiBnb3RvIHdjMTAtZDMyCi1pZiAlMT09d2MxMC10bnQgZ290byB3YzEwLXRudAotaWYgJTE9PXdjMTAtdzE2IGdvdG8gd2MxMC13MTYKLWlmICUxPT13YzEwLXczMiBnb3RvIHdjMTAtdzMyCi1pZiAlMT09d2MxMC1jMzIgZ290byB3YzEwLWMzMgotaWYgJTE9PXdjMTAtbzMyIGdvdG8gd2MxMC1vMzIKLWlmICUxPT13YzEwLXAzMiBnb3RvIHdjMTAtcDMyCi1pZiAlMT09d2MxMC1zbnAgZ290byB3YzEwLXNucAotaWYgJTE9PXdjMTEtZDE2IGdvdG8gd2MxMS1kMTYKLWlmICUxPT13YzExLWQzMiBnb3RvIHdjMTEtZDMyCi1pZiAlMT09d2MxMS10bnQgZ290byB3YzExLXRudAotaWYgJTE9PXdjMTEtdzE2IGdvdG8gd2MxMS13MTYKLWlmICUxPT13YzExLXczMiBnb3RvIHdjMTEtdzMyCi1pZiAlMT09d2MxMS1jMzIgZ290byB3YzExLWMzMgotaWYgJTE9PXdjMTEtbzMyIGdvdG8gd2MxMS1vMzIKLWlmICUxPT13YzExLXAzMiBnb3RvIHdjMTEtcDMyCi1pZiAlMT09d2MxMS1zbnAgZ290byB3YzExLXNucAotCi1lY2hvIFVzYWdlOiBCVUlMRCAnY29tcGlsZXJfbmFtZScgW0RNQUtFIGNvbW1hbmRzXQotZWNoby4KLWVjaG8gV2hlcmUgJ2NvbXBpbGVyX25hbWUnIGlzIG9mIHRoZSBmb3JtIGNvbXAtb3MsIHdoZXJlCi1lY2hvICdjb21wJyBkZWZpbmVzIHRoZSBjb21waWxlciBhbmQgJ29zJyBkZWZpbmVzIHRoZSBPUyBlbnZpcm9ubWVudC4KLWVjaG8gRm9yIGluc3RhbmNlICdiYzUwLXczMicgaXMgZm9yIEJvcmxhbmQgQysrIDUuMCBmb3IgV2luMzIuCi1lY2hvIFRoZSB2YWx1ZSBvZiAnY29tcCcgY2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgotZWNoby4KLWVjaG8gICAgYmM0NSAtIEJvcmxhbmQgQysrIDQuNXgKLWVjaG8gICAgYmM1MCAtIEJvcmxhbmQgQysrIDUueAotZWNobyAgICB2YzQwIC0gVmlzdWFsIEMrKyA0LngKLWVjaG8gICAgdmM1MCAtIFZpc3VhbCBDKysgNS54Ci1lY2hvICAgIHZjNjAgLSBWaXN1YWwgQysrIDYueAotZWNobyAgICB3YzEwIC0gV2F0Y29tIEMrKyAxMC42Ci1lY2hvICAgIHdjMTEgLSBXYXRjb20gQysrIDExLjAKLWVjaG8gICAgZ2NjMiAtIEdOVSBDL0MrKyAyLjl4Ci1lY2hvLgotZWNobyBUaGUgdmFsdWUgb2YgJ29zJyBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci1lY2hvLgotZWNobyAgICBkMTYgICAtIDE2LWJpdCBET1MKLWVjaG8gICAgZDMyICAgLSAzMi1iaXQgRE9TCi1lY2hvICAgIHcxNiAgIC0gMTYtYml0IFdpbmRvd3MgR1VJIG1vZGUKLWVjaG8gICAgYzMyICAgLSAzMi1iaXQgV2luZG93cyBjb25zb2xlIG1vZGUKLWVjaG8gICAgdzMyICAgLSAzMi1iaXQgV2luZG93cyBHVUkgbW9kZQotZWNobyAgICBvMTYgICAtIDE2LWJpdCBPUy8yIGNvbnNvbGUgbW9kZQotZWNobyAgICBvMzIgICAtIDMyLWJpdCBPUy8yIGNvbnNvbGUgbW9kZQotZWNobyAgICBwMzIgICAtIDMyLWJpdCBPUy8yIFByZXNlbnRhdGlvbiBNYW5hZ2VyCi1lY2hvICAgIHNucCAgIC0gMzItYml0IFNjaVRlY2ggU25hcCBhcHBsaWNhdGlvbgotZWNobyAgICBsaW51eCAtIDMyLWJpdCBMaW51eCBhcHBsaWNhdGlvbgotZ290byBlbmQKLQotcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXJlbSBTZXR1cCBmb3IgdGhlIHNwZWNpZmllZCBjb21waWxlcgotCi06YmMzMS1kMTYKLWNhbGwgYmMzMS1kMTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06YmM0NS1kMTYKLWNhbGwgYmM0NS1kMTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06YmM0NS1kMzIKLWNhbGwgYmM0NS1kMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06YmM0NS10bnQKLWNhbGwgYmM0NS10bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06YmM0NS13MTYKLWNhbGwgYmM0NS13MTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06YmM0NS13MzIKLWNhbGwgYmM0NS13MzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06YmM0NS1jMzIKLWNhbGwgYmM0NS1jMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06YmM0NS12eGQKLWNhbGwgYmM0NS12eGQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06YmM1MC1kMTYKLWNhbGwgYmM1MC1kMTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06YmM1MC1kMzIKLWNhbGwgYmM1MC1kMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06YmM1MC10bnQKLWNhbGwgYmM1MC10bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06YmM1MC13MTYKLWNhbGwgYmM1MC13MTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06YmM1MC13MzIKLWNhbGwgYmM1MC13MzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06YmM1MC1jMzIKLWNhbGwgYmM1MC1jMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06YmM1MC12eGQKLWNhbGwgYmM1MC12eGQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06Z2NjMi1kMzIKLWNhbGwgZ2NjMi1kMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06Z2NjMi13MzIKLWNhbGwgZ2NjMi13MzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06Z2NjMi1jMzIKLWNhbGwgZ2NjMi1jMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06Z2NjMi1saW51eAotY2FsbCBnY2MyLWxpbnV4LmJhdAotZ290byBjb21waWxlaXQKLQotOnNjNzAtZDE2Ci1jYWxsIHNjNzAtZDE2LmJhdAotZ290byBjb21waWxlaXQKLQotOnNjNzAtdzE2Ci1jYWxsIHNjNzAtdzE2LmJhdAotZ290byBjb21waWxlaXQKLQotOnNjNzAtdG50Ci1jYWxsIHNjNzAtdG50LmJhdAotZ290byBjb21waWxlaXQKLQotOnNjNzAtdzMyCi1jYWxsIHNjNzAtdzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOnNjNzAtYzMyCi1jYWxsIHNjNzAtYzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNDAtZDE2Ci1jYWxsIHZjNDAtZDE2LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNDAtdG50Ci1jYWxsIHZjNDAtdG50LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNDAtdzE2Ci1jYWxsIHZjNDAtdzE2LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNDAtdzMyCi1jYWxsIHZjNDAtdzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNDAtYzMyCi1jYWxsIHZjNDAtYzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNDAtZHJ2OXgKLWNhbGwgdmM0MC1kcnY5eC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzQwLWRydm50Ci1jYWxsIHZjNDAtZHJ2bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM0MC1ydHQKLWNhbGwgdmM0MC1ydHQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM1MC1kMTYKLWNhbGwgdmM1MC1kMTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM1MC10bnQKLWNhbGwgdmM1MC10bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM1MC13MTYKLWNhbGwgdmM1MC13MTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM1MC13MzIKLWNhbGwgdmM1MC13MzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM1MC1jMzIKLWNhbGwgdmM1MC1jMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM1MC1kcnY5eAotY2FsbCB2YzUwLWRydjl4LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNTAtZHJ2bnQKLWNhbGwgdmM1MC1kcnZudC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzUwLXJ0dAotY2FsbCB2YzUwLXJ0dC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzYwLWQxNgotY2FsbCB2YzYwLWQxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzYwLXRudAotY2FsbCB2YzYwLXRudC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzYwLXcxNgotY2FsbCB2YzYwLXcxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzYwLXczMgotY2FsbCB2YzYwLXczMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzYwLWMzMgotY2FsbCB2YzYwLWMzMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzYwLWRydjl4Ci1jYWxsIHZjNjAtZHJ2OXguYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM2MC1kcnZudAotY2FsbCB2YzYwLWRydm50LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNjAtZHJ2dzJrCi1jYWxsIHZjNjAtZHJ2dzJrLmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNjAtcnR0Ci1jYWxsIHZjNjAtcnR0LmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTBhZDE2Ci1jYWxsIHdjMTBhZDE2LmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTBhZDMyCi1jYWxsIHdjMTBhZDMyLmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTBhdG50Ci1jYWxsIHdjMTBhdG50LmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTBhdzE2Ci1jYWxsIHdjMTBhdzE2LmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTBhdzMyCi1jYWxsIHdjMTBhdzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTBhYzMyCi1jYWxsIHdjMTBhYzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTBhbzMyCi1jYWxsIHdjMTBhbzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTBhcDMyCi1jYWxsIHdjMTBhcDMyLmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTAtZDE2Ci1jYWxsIHdjMTAtZDE2LmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTAtZDMyCi1jYWxsIHdjMTAtZDMyLmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTAtdG50Ci1jYWxsIHdjMTAtdG50LmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTAtdzE2Ci1jYWxsIHdjMTAtdzE2LmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTAtdzMyCi1jYWxsIHdjMTAtdzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTAtYzMyCi1jYWxsIHdjMTAtYzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTAtbzMyCi1jYWxsIHdjMTAtbzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTAtcDMyCi1jYWxsIHdjMTAtcDMyLmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTEtZDE2Ci1jYWxsIHdjMTEtZDE2LmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTEtZDMyCi1jYWxsIHdjMTEtZDMyLmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTEtdG50Ci1jYWxsIHdjMTEtdG50LmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTEtdzE2Ci1jYWxsIHdjMTEtdzE2LmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTEtdzMyCi1jYWxsIHdjMTEtdzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTEtYzMyCi1jYWxsIHdjMTEtYzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTEtbzMyCi1jYWxsIHdjMTEtbzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOndjMTEtcDMyCi1jYWxsIHdjMTEtcDMyLmJhdAotZ290byBjb21waWxlaXQKLQotOmNvbXBpbGVpdAota19ybSAtZiAqLmxpYiAqLmEKLWRtYWtlICUyICUzICU0ICU1ICU2ICU3ICU4ICU5Ci1pZiBlcnJvcmxldmVsIDEgZ290byBlcnJvcmVuZAotZ290byBlbmQKLQotOmVycm9yZW5kCi1lY2hvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWVjaG8gKiBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBidWlsZGluZyB0aGUgbGlicmFyeS4gKgotZWNobyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi06ZW5kCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9jZGRydi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9jZGRydi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI2NGY0ZDcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vY2RkcnYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1AZWNobyBvZmYKLSUxCi1jZCAlMwotJTQgJTUgJTYgJTcgJTggJTkKLSUyCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2NkaXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9jZGl0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMjIwMjNkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2NkaXQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jISAvYmluL3NoCi0KLWNkICQxCi1QUk9HPSQyCi1zaGlmdCAyCi1ybSAtZiAqLmxpYiAqLmEKLSRQUk9HICQqCi1SRVQ9JD8KLWNkIC4uCi1leGl0ICRSRVQKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2NkaXQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vY2RpdC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk1MGI2NDguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vY2RpdC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUBlY2hvIG9mZgotY2QgJTEKLWtfcm0gLWYgKi5saWIgKi5hCi1zaGlmdCAxCi0lMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZGpncHAuZW52IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZGpncHAuZW52CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTJjM2Q4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2RqZ3BwLmVudgorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSM9IERvbid0IGVkaXQgdGhpcyBsaW5lIHVubGVzcyB5b3UgbW92ZSBkamdwcC5lbnYgb3V0c2lkZQotIz0gb2YgdGhlIGRqZ3BwIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuICBJZiB5b3UgZG8gbW92ZQotIz0gaXQsIHNldCBESkRJUiB0byB0aGUgZGlyZWN0b3J5IHlvdSBpbnN0YWxsZWQgREpHUFAgaW4uCi0jPQotREpESVI9JTovPkRKR1BQJQotCi0rVVNFUj1kb3N1c2VyCi0rVE1QRElSPSVESkRJUiUvdG1wCi0rRU1VMzg3PSVESkRJUiUvYmluL2VtdTM4Ny5keGUKLStMRk49eQotCi1bYmlzb25dCi1CSVNPTl9IQUlSWT0lREpESVIlL2xpYi9iaXNvbi5oYWkKLUJJU09OX1NJTVBMRT0lREpESVIlL2xpYi9iaXNvbi5zaW0KLQotW2NwcF0KLUNQTFVTX0lOQ0xVREVfUEFUSD0lLz47Q1BMVVNfSU5DTFVERV9QQVRIJWluY2x1ZGU7JVNDSVRFQ0glL2luY2x1ZGU7JVBSSVZBVEUlL2luY2x1ZGU7LjslREpESVIlL2xhbmcvY3h4OyVESkRJUiUvaW5jbHVkZTslREpESVIlL2NvbnRyaWIvZ3J4MjAvaW5jbHVkZQotQ19JTkNMVURFX1BBVEg9JS8+O0NfSU5DTFVERV9QQVRIJWluY2x1ZGU7JVNDSVRFQ0glL2luY2x1ZGU7JVBSSVZBVEUlL2luY2x1ZGU7LjslREpESVIlL2luY2x1ZGU7JURKRElSJS9jb250cmliL2dyeDIwL2luY2x1ZGUKLU9CSkNQTFVTX0lOQ0xVREVfUEFUSD0lLz47T0JKQ1BMVVNfSU5DTFVERV9QQVRIJSVESkRJUiUvaW5jbHVkZTslREpESVIlL2xhbmcvb2JqYwotT0JKQ19JTkNMVURFX1BBVEg9JS8+O09CSkNfSU5DTFVERV9QQVRIJSVESkRJUiUvaW5jbHVkZTslREpESVIlL2xhbmcvb2JqYwotCi1bZ2NjXQotQ09NUElMRVJfUEFUSD0lLz47Q09NUElMRVJfUEFUSCUlREpESVIlL2JpbgotTElCUkFSWV9QQVRIPSUvPjtMSUJSQVJZX1BBVEglJURKRElSJS9saWI7JURKRElSJS9jb250cmliL2dyeDIwL2xpYjslU0NJVEVDSCUvbGliL3JlbGVhc2UvZG9zMzIvZGoyCi0KLVtpbmZvXQotSU5GT1BBVEg9JS8+O0lORk9QQVRIJSVESkRJUiUvaW5mbzslREpESVIlL2dudS9lbWFjcy9pbmZvCi1JTkZPX0NPTE9SUz0weDFmLjB4MzEKLQotW2VtYWNzXQotSU5GT1BBVEg9JS8+O0lORk9QQVRIJSVESkRJUiUvaW5mbzslREpESVIlL2dudS9lbWFjcy9pbmZvCi0KLVtsZXNzXQotTEVTU0JJTkZNVD0qazwlWD4KLUxFU1NDSEFSREVGPThiY2NjYmNjMTJiYzViOTUuYjEyNy5iCi1MRVNTPSVMRVNTJSAtaDUkeTUkRGQyLjAkRHUxNC4wJERzNC43JERrOS4wJAotCi1bbG9jYXRlXQotK0xPQ0FURV9QQVRIPSVESkRJUiUvbGliL2xvY2F0ZWRiLmRhdAotCi1bbHNdCi0rTFNfQ09MT1JTPW5vPTAwOmZpPTAwOmRpPTM2OmxiPTM3OzA3OmNkPTQwOzMzOzAxOmV4PTMyOiouY21kPTMyOioudGFyPTAxOzMxOioudGd6PTAxOzMxOiouYXJqPTAxOzMxOioudGF6PTAxOzMxOioubHpoPTAxOzMxOiouemlwPTAxOzMxOiouej0wMTszMToqLlo9MDE7MzE6Ki5nej0wMTszMToqLmRlYj0wMTszMToqLmpwZz0wMTszNDoqLmdpZj0wMTszNDoqLmJtcD0wMTszNDoqLnBwbT0wMTszNDoqLnRnYT0wMTszNDoqLnhibT0wMTszNDoqLnhwbT0wMTszNDoqLnRpZj0wMTszNDoqLm1wZz0wMTszNzoqLmF2aT0wMTszNzoqLmdsPTAxOzM3OiouZGw9MDE7Mzc6Kn49MDg6Ki5iYWs9MDg6Ci1bZGlyXQotK0xTX0NPTE9SUz1ubz0wMDpmaT0wMDpkaT0zNjpsYj0zNzswNzpjZD00MDszMzswMTpleD0zMjoqLmNtZD0zMjoqLnRhcj0wMTszMToqLnRnej0wMTszMToqLmFyaj0wMTszMToqLnRhej0wMTszMToqLmx6aD0wMTszMToqLnppcD0wMTszMToqLno9MDE7MzE6Ki5aPTAxOzMxOiouZ3o9MDE7MzE6Ki5kZWI9MDE7MzE6Ki5qcGc9MDE7MzQ6Ki5naWY9MDE7MzQ6Ki5ibXA9MDE7MzQ6Ki5wcG09MDE7MzQ6Ki50Z2E9MDE7MzQ6Ki54Ym09MDE7MzQ6Ki54cG09MDE7MzQ6Ki50aWY9MDE7MzQ6Ki5tcGc9MDE7Mzc6Ki5hdmk9MDE7Mzc6Ki5nbD0wMTszNzoqLmRsPTAxOzM3Oip+PTA4OiouYmFrPTA4OgotW3ZkaXJdCi0rTFNfQ09MT1JTPW5vPTAwOmZpPTAwOmRpPTM2OmxiPTM3OzA3OmNkPTQwOzMzOzAxOmV4PTMyOiouY21kPTMyOioudGFyPTAxOzMxOioudGd6PTAxOzMxOiouYXJqPTAxOzMxOioudGF6PTAxOzMxOioubHpoPTAxOzMxOiouemlwPTAxOzMxOiouej0wMTszMToqLlo9MDE7MzE6Ki5nej0wMTszMToqLmRlYj0wMTszMToqLmpwZz0wMTszNDoqLmdpZj0wMTszNDoqLmJtcD0wMTszNDoqLnBwbT0wMTszNDoqLnRnYT0wMTszNDoqLnhibT0wMTszNDoqLnhwbT0wMTszNDoqLnRpZj0wMTszNDoqLm1wZz0wMTszNzoqLmF2aT0wMTszNzoqLmdsPTAxOzM3OiouZGw9MDE7Mzc6Kn49MDg6Ki5iYWs9MDg6CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9kamdwcF9kYi5lbnYgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9kamdwcF9kYi5lbnYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNzkyYzkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZGpncHBfZGIuZW52CisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIz0gRG9uJ3QgZWRpdCB0aGlzIGxpbmUgdW5sZXNzIHlvdSBtb3ZlIGRqZ3BwLmVudiBvdXRzaWRlCi0jPSBvZiB0aGUgZGpncHAgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gIElmIHlvdSBkbyBtb3ZlCi0jPSBpdCwgc2V0IERKRElSIHRvIHRoZSBkaXJlY3RvcnkgeW91IGluc3RhbGxlZCBESkdQUCBpbi4KLSM9Ci1ESkRJUj0lOi8+REpHUFAlCi0KLStVU0VSPWRvc3VzZXIKLStUTVBESVI9JURKRElSJS90bXAKLStFTVUzODc9JURKRElSJS9iaW4vZW11Mzg3LmR4ZQotK0xGTj15Ci0KLVtiaXNvbl0KLUJJU09OX0hBSVJZPSVESkRJUiUvbGliL2Jpc29uLmhhaQotQklTT05fU0lNUExFPSVESkRJUiUvbGliL2Jpc29uLnNpbQotCi1bY3BwXQotQ1BMVVNfSU5DTFVERV9QQVRIPSUvPjtDUExVU19JTkNMVURFX1BBVEglaW5jbHVkZTslU0NJVEVDSCUvaW5jbHVkZTslUFJJVkFURSUvaW5jbHVkZTsuOyVESkRJUiUvbGFuZy9jeHg7JURKRElSJS9pbmNsdWRlOyVESkRJUiUvY29udHJpYi9ncngyMC9pbmNsdWRlCi1DX0lOQ0xVREVfUEFUSD0lLz47Q19JTkNMVURFX1BBVEglaW5jbHVkZTslU0NJVEVDSCUvaW5jbHVkZTslUFJJVkFURSUvaW5jbHVkZTsuOyVESkRJUiUvaW5jbHVkZTslREpESVIlL2NvbnRyaWIvZ3J4MjAvaW5jbHVkZQotT0JKQ1BMVVNfSU5DTFVERV9QQVRIPSUvPjtPQkpDUExVU19JTkNMVURFX1BBVEglJURKRElSJS9pbmNsdWRlOyVESkRJUiUvbGFuZy9vYmpjCi1PQkpDX0lOQ0xVREVfUEFUSD0lLz47T0JKQ19JTkNMVURFX1BBVEglJURKRElSJS9pbmNsdWRlOyVESkRJUiUvbGFuZy9vYmpjCi0KLVtnY2NdCi1DT01QSUxFUl9QQVRIPSUvPjtDT01QSUxFUl9QQVRIJSVESkRJUiUvYmluCi1MSUJSQVJZX1BBVEg9JS8+O0xJQlJBUllfUEFUSCUlREpESVIlL2xpYjslREpESVIlL2NvbnRyaWIvZ3J4MjAvbGliOyVTQ0lURUNIJS9saWIvZGVidWcvZG9zMzIvZGoyCi0KLVtpbmZvXQotSU5GT1BBVEg9JS8+O0lORk9QQVRIJSVESkRJUiUvaW5mbzslREpESVIlL2dudS9lbWFjcy9pbmZvCi1JTkZPX0NPTE9SUz0weDFmLjB4MzEKLQotW2VtYWNzXQotSU5GT1BBVEg9JS8+O0lORk9QQVRIJSVESkRJUiUvaW5mbzslREpESVIlL2dudS9lbWFjcy9pbmZvCi0KLVtsZXNzXQotTEVTU0JJTkZNVD0qazwlWD4KLUxFU1NDSEFSREVGPThiY2NjYmNjMTJiYzViOTUuYjEyNy5iCi1MRVNTPSVMRVNTJSAtaDUkeTUkRGQyLjAkRHUxNC4wJERzNC43JERrOS4wJAotCi1bbG9jYXRlXQotK0xPQ0FURV9QQVRIPSVESkRJUiUvbGliL2xvY2F0ZWRiLmRhdAotCi1bbHNdCi0rTFNfQ09MT1JTPW5vPTAwOmZpPTAwOmRpPTM2OmxiPTM3OzA3OmNkPTQwOzMzOzAxOmV4PTMyOiouY21kPTMyOioudGFyPTAxOzMxOioudGd6PTAxOzMxOiouYXJqPTAxOzMxOioudGF6PTAxOzMxOioubHpoPTAxOzMxOiouemlwPTAxOzMxOiouej0wMTszMToqLlo9MDE7MzE6Ki5nej0wMTszMToqLmRlYj0wMTszMToqLmpwZz0wMTszNDoqLmdpZj0wMTszNDoqLmJtcD0wMTszNDoqLnBwbT0wMTszNDoqLnRnYT0wMTszNDoqLnhibT0wMTszNDoqLnhwbT0wMTszNDoqLnRpZj0wMTszNDoqLm1wZz0wMTszNzoqLmF2aT0wMTszNzoqLmdsPTAxOzM3OiouZGw9MDE7Mzc6Kn49MDg6Ki5iYWs9MDg6Ci1bZGlyXQotK0xTX0NPTE9SUz1ubz0wMDpmaT0wMDpkaT0zNjpsYj0zNzswNzpjZD00MDszMzswMTpleD0zMjoqLmNtZD0zMjoqLnRhcj0wMTszMToqLnRnej0wMTszMToqLmFyaj0wMTszMToqLnRhej0wMTszMToqLmx6aD0wMTszMToqLnppcD0wMTszMToqLno9MDE7MzE6Ki5aPTAxOzMxOiouZ3o9MDE7MzE6Ki5kZWI9MDE7MzE6Ki5qcGc9MDE7MzQ6Ki5naWY9MDE7MzQ6Ki5ibXA9MDE7MzQ6Ki5wcG09MDE7MzQ6Ki50Z2E9MDE7MzQ6Ki54Ym09MDE7MzQ6Ki54cG09MDE7MzQ6Ki50aWY9MDE7MzQ6Ki5tcGc9MDE7Mzc6Ki5hdmk9MDE7Mzc6Ki5nbD0wMTszNzoqLmRsPTAxOzM3Oip+PTA4OiouYmFrPTA4OgotW3ZkaXJdCi0rTFNfQ09MT1JTPW5vPTAwOmZpPTAwOmRpPTM2OmxiPTM3OzA3OmNkPTQwOzMzOzAxOmV4PTMyOiouY21kPTMyOioudGFyPTAxOzMxOioudGd6PTAxOzMxOiouYXJqPTAxOzMxOioudGF6PTAxOzMxOioubHpoPTAxOzMxOiouemlwPTAxOzMxOiouej0wMTszMToqLlo9MDE7MzE6Ki5nej0wMTszMToqLmRlYj0wMTszMToqLmpwZz0wMTszNDoqLmdpZj0wMTszNDoqLmJtcD0wMTszNDoqLnBwbT0wMTszNDoqLnRnYT0wMTszNDoqLnhibT0wMTszNDoqLnhwbT0wMTszNDoqLnRpZj0wMTszNDoqLm1wZz0wMTszNzoqLmF2aT0wMTszNzoqLmdsPTAxOzM3OiouZGw9MDE7Mzc6Kn49MDg6Ki5iYWs9MDg6CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9maW5kaW50My5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9maW5kaW50My5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlMTUwNmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZmluZGludDMuYmF0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcGVybCBjOlxzY2l0ZWNoXHNyY1xwZXJsXGZpbmRpbnQzLnBlcgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjLWJlb3Muc2ggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MtYmVvcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjFmZmQ5My4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MtYmVvcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggR0NDL0crKyBmb3IgQmVPUwotCi1pZiBbICIkQ0hFQ0tFRCIgPSAiMSIgXTsgdGhlbgotICAgIGVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZWxzZQotICAgIGVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZmkKLQotZXhwb3J0IE1BS0VTVEFSVFVQPSRTQ0lURUNIL21ha2VkZWZzL2djY19iZW9zLm1rCi1leHBvcnQgSU5DTFVERT0iLUlpbmNsdWRlIC1JJFNDSVRFQ0gvaW5jbHVkZSAtSSRQUklWQVRFL2luY2x1ZGUiCi1leHBvcnQgVVNFX1gxMT0wCi1leHBvcnQgVVNFX0JFT1M9MQotCi1lY2hvIEdDQyBCZU9TIGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MtZnJlZWJzZC5zaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYy1mcmVlYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzODE2YTVkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYy1mcmVlYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBHQ0MvRysrIGZvciBGcmVlQlNECi0KLWlmIFsgIiRDSEVDS0VEIiA9ICIxIiBdOyB0aGVuCi0gICAgZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1lbHNlCi0gICAgZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1maQotCi1leHBvcnQgTUFLRVNUQVJUVVA9JFNDSVRFQ0gvbWFrZWRlZnMvZ2NjX2ZyZWVic2QubWsKLWV4cG9ydCBJTkNMVURFPSItSWluY2x1ZGUgLUkkU0NJVEVDSC9pbmNsdWRlIC1JJFBSSVZBVEUvaW5jbHVkZSIKLWV4cG9ydCBVU0VfWDExPTEKLWV4cG9ydCBVU0VfRlJFRUJTRD0xCi0KLWVjaG8gR0NDIEZyZWVCU0QgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYy1saW51eC5zaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYy1saW51eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjdhNGM0OS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MtbGludXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEdDQy9HKysgZm9yIExpbnV4Ci0KLWlmIFsgIiRDSEVDS0VEIiA9ICIxIiBdOyB0aGVuCi0gICAgZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1lbHNlCi0gICAgZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1maQotCi1leHBvcnQgTUFLRVNUQVJUVVA9JFNDSVRFQ0gvbWFrZWRlZnMvZ2NjX2xpbnV4Lm1rCi1leHBvcnQgSU5DTFVERT0iaW5jbHVkZTskU0NJVEVDSC9pbmNsdWRlOyRQUklWQVRFL2luY2x1ZGUiCi1leHBvcnQgVVNFX0xJTlVYPTEKLQotaWYgWyAieCRMSUJDIiA9IHggXTsgdGhlbgotCWVjaG8gIkdDQyBMaW51eCBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCAoZ2xpYikiCi1lbHNlCi0JZWNobyAiR0NDIExpbnV4IGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwIChsaWJjNSkiCi1maQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1jMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1jMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxM2M0NzgzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYzItYzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBHTlUgQyBjb21waWxlcgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJccmVsZWFzZVx3aW4zMlxnY2MyCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxkZWJ1Z1x3aW4zMlxnY2MyCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IElOQ0xVREU9aW5jbHVkZTslU0NJVEVDSCVcaW5jbHVkZTslUFJJVkFURSVcaW5jbHVkZQotc2V0IE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1xnY2Nfd2luMzIubWsKLXNldCBNQUtFX01PREU9Ci1zZXQgVVNFX1dJTjE2PQotc2V0IFVTRV9XSU4zMj0xCi1zZXQgV0lOMzJfR1VJPQotc2V0IFVTRV9TTkFQPQotc2V0IEdDQ19MSUJCQVNFPWdjYzIKLVBBVEggJVNDSVRFQ0hfQklOJTslR0NDMl9QQVRIJVxOQVRJVkVcQklOOyVERUZQQVRIJQotCi1lY2hvIEdDQyAyLjkueCAzMi1iaXQgV2luMzIgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1kb3MuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1kb3MuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5N2NiOGJkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYzItZG9zLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBESkdQUCAyLjAyCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxyZWxlYXNlXGRvczMyXGRqMgotJVNDSVRFQ0glXGJpbi1kb3Nca19jcCAlU0NJVEVDSCVcQklOXERKR1BQLkVOViAlREpfUEFUSCVcREpHUFAuRU5WCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxkZWJ1Z1xkb3MzMlxkajIKLSVTQ0lURUNIJVxiaW4tZG9zXGtfY3AgJVNDSVRFQ0glXEJJTlxESkdQUF9EQi5FTlYgJURKX1BBVEglXERKR1BQLkVOVgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBESkdQUD0lREpfUEFUSCVcREpHUFAuRU5WCi1zZXQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVESl9QQVRIJVxJTkNMVURFOwotc2V0IE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xESjMyLk1LCi1zZXQgVVNFX1dJTjE2PQotc2V0IFVTRV9XSU4zMj0KLXNldCBXSU4zMl9HVUk9Ci1zZXQgVVNFX1NOQVA9Ci1zZXQgREpfTElCQkFTRT1kajIKLVBBVEggJVNDSVRFQ0hfQklOJTslREpfUEFUSCVcQklOOyVERUZQQVRIJQotCi1lY2hvIERKR1BQIDIuMDIgMzItYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKERQTUkpLgotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MyLWxpbnV4LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYzItbGludXguYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZWIyYWI4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYzItbGludXguYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEdOVSBDIGNyb3NzLWNvbXBpbGVyCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxyZWxlYXNlXHdpbjMyXGdjYzIKLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXGRlYnVnXHdpbjMyXGdjYzIKLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlCi1zZXQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXGdjY19saW51eC5tawotc2V0IE1BS0VfTU9ERT1VTklYCi1zZXQgVVNFX1dJTjE2PQotc2V0IFVTRV9XSU4zMj0KLXNldCBXSU4zMl9HVUk9Ci1zZXQgVVNFX1NOQVA9Ci1zZXQgR0NDX0xJQkJBU0U9Z2NjMgotUEFUSCAlU0NJVEVDSF9CSU4lOyVHQ0MyX1BBVEglXGNyb3NzLWxpbnV4XGkzODYtcmVkaGF0LWxpbnV4XEJJTjslREVGUEFUSCUKLQotZWNobyBHQ0MgMi45LnggMzItYml0IExpbnV4IGNvbnNvbGUgY3Jvc3MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYzItdzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYzItdzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmRiMzFhYS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MyLXczMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggR05VIEMgY29tcGlsZXIKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXHJlbGVhc2Vcd2luMzJcZ2NjMgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcZGVidWdcd2luMzJcZ2NjMgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGUKLXNldCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcZ2NjX3dpbjMyLm1rCi1zZXQgTUFLRV9NT0RFPQotc2V0IFVTRV9XSU4xNj0KLXNldCBVU0VfV0lOMzI9MQotc2V0IFdJTjMyX0dVST0xCi1zZXQgVVNFX1NOQVA9Ci1zZXQgR0NDX0xJQkJBU0U9Z2NjMgotUEFUSCAlU0NJVEVDSF9CSU4lOyVHQ0MyX1BBVEglXE5BVElWRVxCSU47JURFRlBBVEglCi0KLWVjaG8gR0NDIDIuOS54IDMyLWJpdCBXaW4zMiBHVUkgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL21ha2VsaWIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vbWFrZWxpYi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzMTY3MzQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vbWFrZWxpYi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi1jYWxsIHdjMTEtZDMyLmJhdAotCi1jZCBjOlxwcml2YXRlXHNyY1xsaWNlbnNlCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi1jZCBjOlxzY2l0ZWNoXHNyY1xwbQotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotY2QgYzpcc2NpdGVjaFxzcmNcY29uc29sZQotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotY2QgYzpcc2NpdGVjaFxzcmNcbnVjbGV1cwotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotY2QgYzpcc2NpdGVjaFxzcmNcemxpYgotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotCi1jZCBjOlxwcml2YXRlXHNyY1xncmFwaGljc1xyZWYyZAotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotY2QgYzpccHJpdmF0ZVxzcmNcZHJ2bGliCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi0KLWNhbGwgd2MxMS13MzIuYmF0Ci0KLWNkIGM6XHByaXZhdGVcc3JjXGxpY2Vuc2UKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLWNkIGM6XHNjaXRlY2hcc3JjXHBtCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi1jZCBjOlxzY2l0ZWNoXHNyY1xjb25zb2xlCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi1jZCBjOlxzY2l0ZWNoXHNyY1xudWNsZXVzCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi1jZCBjOlxzY2l0ZWNoXHNyY1x6bGliCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi0KLWNkIGM6XHByaXZhdGVcc3JjXGdyYXBoaWNzXHJlZjJkCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi1jZCBjOlxwcml2YXRlXHNyY1xkcnZsaWIKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLQotY2FsbCB3YzEwLWQzMi5iYXQKLQotY2QgYzpccHJpdmF0ZVxzcmNcbGljZW5zZQotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotY2QgYzpcc2NpdGVjaFxzcmNccG0KLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLWNkIGM6XHNjaXRlY2hcc3JjXGNvbnNvbGUKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLWNkIGM6XHNjaXRlY2hcc3JjXG51Y2xldXMKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLWNkIGM6XHNjaXRlY2hcc3JjXHpsaWIKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLQotY2QgYzpccHJpdmF0ZVxzcmNcZ3JhcGhpY3NccmVmMmQKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLWNkIGM6XHByaXZhdGVcc3JjXGRydmxpYgotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotCi1jZCBccHJpdmF0ZVxzcmNcZ3JhcGhpY3NcZHJpdmVycwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vbWVsdG9ianMuc2ggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9tZWx0b2Jqcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQxODA0Yi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9tZWx0b2Jqcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMhIC9iaW4vc2gKLSMKLSMgVGhpcyBzY3JpcHQgZ2VuZXJhdGVzIGEgc2luZ2xlIG9iamVjdCBmaWxlIGZyb20gYSBzZXQgb2YgbGlicmFyaWVzICgqLmEgZmlsZXMpCi0jIFVzYWdlOiBtZWx0b2Jqcy5zaCB0YXJnZXQubyBsaWJyYXJ5MS5hIGxpYnJhcnkyLmEgLi4uCi0jCi0jIChDKSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuIDE5OTgKLSMKLQotVE1QRElSPS90bXAvbWVsdCQkCi1UQVJHRVQ9JDEKLVRBUkdFVERJUj0kUFdECi1zaGlmdAotbWtkaXIgJFRNUERJUgotCi1jZCAkVE1QRElSCi0KLWZvciBhIGluICQqCi1kbwotICAgIGFyIHggJGEKLWRvbmUKLWxkIC1yIC1vICRUQVJHRVRESVIvJFRBUkdFVCAqLm8KLQotcm0gLWZyICRUTVBESVIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9udGRkay5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9udGRkay5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3YzBkNzguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vbnRkZGsuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU06IFNldCB1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIE1pY3Jvc29mdCBXaW5kb3dzIE5UIERESyBkZXZlbG9wbWVudC4KLVJFTTogTm90ZSB0aGF0IHdlIGhhdmUgaGFyZCBjb2RlZCB0aGlzIGZvciBXaW5kb3dzIE5UIGkzODYgZGV2ZWxvcG1lbnQuCi0KLVNFVCBVU0VfTlREUlY9MQotU0VUIFVTRV9XMktEUlY9Ci1TRVQgQkFTRURJUj0lTlRfRERLUk9PVCUKLVNFVCBQQVRIPSVCQVNFRElSJVxiaW47JVBBVEglCi1TRVQgTlRNQUtFRU5WPSVCQVNFRElSJVxpbmMKLVNFVCBCVUlMRF9NQUtFX1BST0dSQU09bm1ha2UuZXhlCi1TRVQgQlVJTERfREVGQVVMVD0tZWkgLW5tYWtlIC1pCi1TRVQgQlVJTERfREVGQVVMVF9UQVJHRVRTPS0zODYKLVNFVCBfT0JKX0RJUj1vYmoKLVNFVCBORVdfQ1JUUz0xCi1TRVQgX05UUk9PVD0lQkFTRURJUiUKLVNFVCBJTkNMVURFPSVCQVNFRElSJVxpbmM7JUlOQ0xVREUlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZAotCi1SRU06IHNldCB1cCBhbiBOVCBmcmVlIGJ1aWxkIGVudmlyb25tZW50Ci1TRVQgRERLQlVJTERFTlY9ZnJlZQotU0VUIENfREVGSU5FUz0tRF9JRFdCVUlMRAotU0VUIE5UREJHRklMRVM9MQotU0VUIE5UREVCVUc9Ci1TRVQgTlRERUJVR1RZUEU9Ci1TRVQgTVNDX09QVElNSVpBVElPTj0KLXNldCBMSUI9JUJBU0VESVIlXGxpYlxpMzg2XGZyZWU7JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxOVERSVlxWQzY7JU1TVkNEaXIlXExJQjsuCi0KLWdvdG8gZG9uZQotCi06Y2hlY2tlZAotCi1SRU06IHNldCB1cCBhbiBOVCBjaGVja2VkIGJ1aWxkIGVudmlyb25tZW50Ci1TRVQgRERLQlVJTERFTlY9Y2hlY2tlZAotU0VUIENfREVGSU5FUz0tRF9JRFdCVUlMRCAtRFJEUkRCRyAtRFNSVkRCRwotU0VUIE5UREJHRklMRVM9Ci1TRVQgTlRERUJVRz1udHNkCi1TRVQgTlRERUJVR1RZUEU9Ym90aAotU0VUIE1TQ19PUFRJTUlaQVRJT049L09kIC9PaQotc2V0IExJQj0lQkFTRURJUiVcbGliXGkzODZcZnJlZTslU0NJVEVDSF9MSUIlXExJQlxERUJVR1xOVERSVlxWQzY7JU1TVkNEaXIlXExJQjsuCi0KLTpkb25lCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9xbng0LnNoIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vcW54NC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODQzYzRkOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9xbng0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgZm9yIFFOWDQKLQotaWYgWyAiJENIRUNLRUQiID0gIjEiIF07IHRoZW4KLSAgICBlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWVsc2UKLSAgICBlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWZpCi0KLWV4cG9ydCBNQUtFU1RBUlRVUD0kU0NJVEVDSC9tYWtlZGVmcy9xbng0Lm1rCi1leHBvcnQgSU5DTFVERT0iLUkkU0NJVEVDSC9pbmNsdWRlIC1JJFBSSVZBVEUvaW5jbHVkZSAtSS91c3IvaW5jbHVkZSIKLWV4cG9ydCBVU0VfUU5YPTEKLWV4cG9ydCBVU0VfUU5YND0xCi1leHBvcnQgV0NfTElCQkFTRT13YzEwCi0KLWVjaG8gUW54IDQgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vcW54bnRvLnNoIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vcW54bnRvLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTE0ZjllLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3FueG50by5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIGZvciBRTlggTmV1dHJpbm8KLQotaWYgWyAiJENIRUNLRUQiID0gIjEiIF07IHRoZW4KLSAgICBlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWVsc2UKLSAgICBlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWZpCi0KLWlmIFsgWCRHQ0NfUEFUSCA9ICJYIiBdOyB0aGVuCi0JZXhwb3J0IEdDQ19QQVRIPS91c3IvZ2NjL2JpbgotZmkKLQotZXhwb3J0IE1BS0VTVEFSVFVQPSRTQ0lURUNIL21ha2VkZWZzL3FueG50by5tawotZXhwb3J0IElOQ0xVREU9Ii1JJFNDSVRFQ0gvaW5jbHVkZSAtSSRQUklWQVRFL2luY2x1ZGUgLUkvdXNyL250by9pbmNsdWRlIgotZXhwb3J0IFVTRV9CSU9TPTEJIyBWQklPUyBsaWIgaXMgdGlueSB1bmRlciBOZXV0cmlubywgYWx3YXlzIGluY2x1ZGUgaXQKLWV4cG9ydCBVU0VfUU5YPTEKLWV4cG9ydCBVU0VfUU5YTlRPPTEKLQotZWNobyBRbnggTmV1dHJpbm8gY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3NldC12YXJzLWJlb3Muc2ggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy1iZW9zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYTI3MmQ2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3NldC12YXJzLWJlb3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgQmVPUyBWRVJTSU9OCi0jIFNldCB0aGUgcGxhY2Ugd2hlcmUgU2NpVGVjaCBTb2Z0d2FyZSBpcyBpbnN0YWxsZWQsIGFuZCB3aGVyZSBlYWNoCi0jIG9mIHRoZSBzdXBwb3J0ZWQgY29tcGlsZXJzIGlzIGluc3RhbGxlZC4gVGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzCi0jIGFyZSB1c2VkIGJ5IHRoZSBiYXRjaCBmaWxlcyBpbiB0aGUgU0NJVEVDSFxCSU4gZGlyZWN0b3J5LgotIwotIyBNb2RpZnkgdGhlIGFzIGFwcHJvcHJpYXRlIGZvciB5b3VyIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gKHlvdSBzaG91bGQKLSMgb25seSBuZWVkIHRvIGNoYW5nZSB0aGluZ3MgaW4gdGhpcyBiYXRjaCBmaWxlKS4KLSMKLSMgVGhpcyB2ZXJzaW9uIGlzIGZvciBhIG5vcm1hbCBCZU9TIGluc3RhbGxhdGlvbi4KLQotIyBUaGUgU0NJVEVDSCB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgYmF0Y2ggZmlsZXMsIG1ha2VmaWxlIHN0YXJ0dXBzLAotIyBpbmNsdWRlIGZpbGVzIGFuZCBzb3VyY2UgZmlsZXMgd2lsbCBiZSBmb3VuZCB3aGVuIGNvbXBpbGluZy4KLQotZXhwb3J0IFNDSVRFQ0g9JE1HTF9ST09UIAotCi0jIFRoZSBTQ0lURUNIX0xJQiB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgdGhlIFNjaVRlY2ggbGlicmFyaWVzIGxpdmUKLSMgZm9yIGluc3RhbGxhdGlvbiBhbmQgbGlua2luZy4gVGhpcyBhbGxvd3MgeW91IHRvIGhhdmUgdGhlIHNvdXJjZSBhbmQKLSMgaW5jbHVkZSBmaWxlcyBvbiBsb2NhbCBtYWNoaW5lcyBmb3IgY29tcGlsaW5nIGFuZCBoYXZlIHRoZSBsaWJyYXJpZXMKLSMgbG9jYXRlZCBvbiBhIGNvbW1vbiBuZXR3b3JrIG1hY2hpbmUgKGZvciBuZXR3b3JrIGJ1aWxkcykuCi0KLWV4cG9ydCBTQ0lURUNIX0xJQj0kU0NJVEVDSAotCi0jIFRoZSBQUklWQVRFIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSBwcml2YXRlIHNvdXJjZSBmaWxlcyByZXNpZGUgdGhhdAotIyBkbyBub3QgbGl2ZSBpbiB0aGUgcHVibGljIHNvdXJjZSB0cmVlCi0KLWV4cG9ydCBQUklWQVRFPSRIT01FL3ByaXZhdGUKLQotIyBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgbG9jYXRpb25zIG9mIGFsbCB0aGUgY29tcGlsZXJzIHRoYXQgeW91IG1heQotIyBiZSB1c2luZy4gQ2hhbmdlIHRoZW0gdG8gcmVmbGVjdCB3aGVyZSB5b3UgaGF2ZSBpbnN0YWxsZWQgeW91cgotIyBjb21waWxlcnMuCi0KLWV4cG9ydCBHQ0NfUEFUSD0vYm9vdC9kZXZlbG9wL3Rvb2xzL2dudXByby9iaW4KLQotIyBBZGQgdGhlIFNjaXRlY2ggYmluIHBhdGggdG8gdGhlIGN1cnJlbnQgUEFUSAotZXhwb3J0IFBBVEg9JFNDSVRFQ0gvYmluOiRTQ0lURUNIL2Jpbi1iZW9zOiRQQVRICi0jaWYgWyAieCRMSUJDIiA9IHggXTsgdGhlbgotIwlleHBvcnQgUEFUSD0kUEFUSDokU0NJVEVDSC9iaW4tYmVvcy9nbGliYwotI2Vsc2UKLSMJZXhwb3J0IFBBVEg9JFBBVEg6JFNDSVRFQ0gvYmluLWJlb3MvbGliYwotI2ZpCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy1mcmVlYnNkLnNoIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtZnJlZWJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzkyMDc0OC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy1mcmVlYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIExJTlVYIFZFUlNJT04KLSMgU2V0IHRoZSBwbGFjZSB3aGVyZSBTY2lUZWNoIFNvZnR3YXJlIGlzIGluc3RhbGxlZCwgYW5kIHdoZXJlIGVhY2gKLSMgb2YgdGhlIHN1cHBvcnRlZCBjb21waWxlcnMgaXMgaW5zdGFsbGVkLiBUaGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLSMgYXJlIHVzZWQgYnkgdGhlIGJhdGNoIGZpbGVzIGluIHRoZSBTQ0lURUNIXEJJTiBkaXJlY3RvcnkuCi0jCi0jIE1vZGlmeSB0aGUgYXMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgY29tcGlsZXIgY29uZmlndXJhdGlvbiAoeW91IHNob3VsZAotIyBvbmx5IG5lZWQgdG8gY2hhbmdlIHRoaW5ncyBpbiB0aGlzIGJhdGNoIGZpbGUpLgotIwotIyBUaGlzIHZlcnNpb24gaXMgZm9yIGEgbm9ybWFsIExpbnV4IGluc3RhbGxhdGlvbi4KLQotIyBUaGUgU0NJVEVDSCB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgYmF0Y2ggZmlsZXMsIG1ha2VmaWxlIHN0YXJ0dXBzLAotIyBpbmNsdWRlIGZpbGVzIGFuZCBzb3VyY2UgZmlsZXMgd2lsbCBiZSBmb3VuZCB3aGVuIGNvbXBpbGluZy4KLQotZXhwb3J0IFNDSVRFQ0g9JE1HTF9ST09UIAotCi0jIFRoZSBTQ0lURUNIX0xJQiB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgdGhlIFNjaVRlY2ggbGlicmFyaWVzIGxpdmUKLSMgZm9yIGluc3RhbGxhdGlvbiBhbmQgbGlua2luZy4gVGhpcyBhbGxvd3MgeW91IHRvIGhhdmUgdGhlIHNvdXJjZSBhbmQKLSMgaW5jbHVkZSBmaWxlcyBvbiBsb2NhbCBtYWNoaW5lcyBmb3IgY29tcGlsaW5nIGFuZCBoYXZlIHRoZSBsaWJyYXJpZXMKLSMgbG9jYXRlZCBvbiBhIGNvbW1vbiBuZXR3b3JrIG1hY2hpbmUgKGZvciBuZXR3b3JrIGJ1aWxkcykuCi0KLWV4cG9ydCBTQ0lURUNIX0xJQj0kU0NJVEVDSAotCi0jIFRoZSBQUklWQVRFIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSBwcml2YXRlIHNvdXJjZSBmaWxlcyByZXNpZGUgdGhhdAotIyBkbyBub3QgbGl2ZSBpbiB0aGUgcHVibGljIHNvdXJjZSB0cmVlCi0KLWV4cG9ydCBQUklWQVRFPSRIT01FL3ByaXZhdGUKLQotIyBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgbG9jYXRpb25zIG9mIGFsbCB0aGUgY29tcGlsZXJzIHRoYXQgeW91IG1heQotIyBiZSB1c2luZy4gQ2hhbmdlIHRoZW0gdG8gcmVmbGVjdCB3aGVyZSB5b3UgaGF2ZSBpbnN0YWxsZWQgeW91cgotIyBjb21waWxlcnMuCi0KLWV4cG9ydCBHQ0NfUEFUSD0vdXNyL2JpbgotCi0jIEFkZCB0aGUgU2NpdGVjaCBiaW4gcGF0aCB0byB0aGUgY3VycmVudCBQQVRICi1leHBvcnQgUEFUSD0kU0NJVEVDSC9iaW46JFNDSVRFQ0gvYmluLWZyZWVic2Q6JFBBVEgKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3NldC12YXJzLWxpbnV4LnNoIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtbGludXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1Y2JmMWQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtbGludXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgTElOVVggVkVSU0lPTgotIyBTZXQgdGhlIHBsYWNlIHdoZXJlIFNjaVRlY2ggU29mdHdhcmUgaXMgaW5zdGFsbGVkLCBhbmQgd2hlcmUgZWFjaAotIyBvZiB0aGUgc3VwcG9ydGVkIGNvbXBpbGVycyBpcyBpbnN0YWxsZWQuIFRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcwotIyBhcmUgdXNlZCBieSB0aGUgYmF0Y2ggZmlsZXMgaW4gdGhlIFNDSVRFQ0hcQklOIGRpcmVjdG9yeS4KLSMKLSMgTW9kaWZ5IHRoZSBhcyBhcHByb3ByaWF0ZSBmb3IgeW91ciBjb21waWxlciBjb25maWd1cmF0aW9uICh5b3Ugc2hvdWxkCi0jIG9ubHkgbmVlZCB0byBjaGFuZ2UgdGhpbmdzIGluIHRoaXMgYmF0Y2ggZmlsZSkuCi0jCi0jIFRoaXMgdmVyc2lvbiBpcyBmb3IgYSBub3JtYWwgTGludXggaW5zdGFsbGF0aW9uLgotCi0jIFRoZSBTQ0lURUNIIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSBiYXRjaCBmaWxlcywgbWFrZWZpbGUgc3RhcnR1cHMsCi0jIGluY2x1ZGUgZmlsZXMgYW5kIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGZvdW5kIHdoZW4gY29tcGlsaW5nLgotCi1leHBvcnQgU0NJVEVDSD0kTUdMX1JPT1QgCi0KLSMgVGhlIFNDSVRFQ0hfTElCIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSB0aGUgU2NpVGVjaCBsaWJyYXJpZXMgbGl2ZQotIyBmb3IgaW5zdGFsbGF0aW9uIGFuZCBsaW5raW5nLiBUaGlzIGFsbG93cyB5b3UgdG8gaGF2ZSB0aGUgc291cmNlIGFuZAotIyBpbmNsdWRlIGZpbGVzIG9uIGxvY2FsIG1hY2hpbmVzIGZvciBjb21waWxpbmcgYW5kIGhhdmUgdGhlIGxpYnJhcmllcwotIyBsb2NhdGVkIG9uIGEgY29tbW9uIG5ldHdvcmsgbWFjaGluZSAoZm9yIG5ldHdvcmsgYnVpbGRzKS4KLQotZXhwb3J0IFNDSVRFQ0hfTElCPSRTQ0lURUNICi0KLSMgVGhlIFBSSVZBVEUgdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIHByaXZhdGUgc291cmNlIGZpbGVzIHJlc2lkZSB0aGF0Ci0jIGRvIG5vdCBsaXZlIGluIHRoZSBwdWJsaWMgc291cmNlIHRyZWUKLQotZXhwb3J0IFBSSVZBVEU9JEhPTUUvcHJpdmF0ZQotCi0jIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBsb2NhdGlvbnMgb2YgYWxsIHRoZSBjb21waWxlcnMgdGhhdCB5b3UgbWF5Ci0jIGJlIHVzaW5nLiBDaGFuZ2UgdGhlbSB0byByZWZsZWN0IHdoZXJlIHlvdSBoYXZlIGluc3RhbGxlZCB5b3VyCi0jIGNvbXBpbGVycy4KLQotZXhwb3J0IEdDQ19QQVRIPS91c3IvYmluCi1leHBvcnQgVEVNUD0vdG1wIFRNUD0vdG1wCi0KLSMgQWRkIHRoZSBTY2l0ZWNoIGJpbiBwYXRoIHRvIHRoZSBjdXJyZW50IFBBVEgKLWV4cG9ydCBQQVRIPSRTQ0lURUNIL2JpbjokU0NJVEVDSC9iaW4tbGludXg6JFBBVEgKLWlmIFsgIngkTElCQyIgPSB4IF07IHRoZW4KLQlleHBvcnQgUEFUSD0kU0NJVEVDSC9iaW4tbGludXgvZ2xpYmM6JFBBVEgKLWVsc2UKLQlleHBvcnQgUEFUSD0kU0NJVEVDSC9iaW4tbGludXgvbGliYzokUEFUSAotZmkKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3NldC12YXJzLXFueC5zaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3NldC12YXJzLXFueC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQ3MzEwOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy1xbnguc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgUU5YIDQgVkVSU0lPTgotIyBTZXQgdGhlIHBsYWNlIHdoZXJlIFNjaVRlY2ggU29mdHdhcmUgaXMgaW5zdGFsbGVkLCBhbmQgd2hlcmUgZWFjaAotIyBvZiB0aGUgc3VwcG9ydGVkIGNvbXBpbGVycyBpcyBpbnN0YWxsZWQuIFRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcwotIyBhcmUgdXNlZCBieSB0aGUgYmF0Y2ggZmlsZXMgaW4gdGhlIFNDSVRFQ0hcQklOIGRpcmVjdG9yeS4KLSMKLSMgTW9kaWZ5IHRoZSBhcyBhcHByb3ByaWF0ZSBmb3IgeW91ciBjb21waWxlciBjb25maWd1cmF0aW9uICh5b3Ugc2hvdWxkCi0jIG9ubHkgbmVlZCB0byBjaGFuZ2UgdGhpbmdzIGluIHRoaXMgYmF0Y2ggZmlsZSkuCi0jCi0jIFRoaXMgdmVyc2lvbiBpcyBmb3IgYSBub3JtYWwgTGludXggaW5zdGFsbGF0aW9uLgotCi0jIFRoZSBTQ0lURUNIIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSBiYXRjaCBmaWxlcywgbWFrZWZpbGUgc3RhcnR1cHMsCi0jIGluY2x1ZGUgZmlsZXMgYW5kIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGZvdW5kIHdoZW4gY29tcGlsaW5nLgotCi1leHBvcnQgU0NJVEVDSD0kTUdMX1JPT1QgCi0KLSMgVGhlIFNDSVRFQ0hfTElCIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSB0aGUgU2NpVGVjaCBsaWJyYXJpZXMgbGl2ZQotIyBmb3IgaW5zdGFsbGF0aW9uIGFuZCBsaW5raW5nLiBUaGlzIGFsbG93cyB5b3UgdG8gaGF2ZSB0aGUgc291cmNlIGFuZAotIyBpbmNsdWRlIGZpbGVzIG9uIGxvY2FsIG1hY2hpbmVzIGZvciBjb21waWxpbmcgYW5kIGhhdmUgdGhlIGxpYnJhcmllcwotIyBsb2NhdGVkIG9uIGEgY29tbW9uIG5ldHdvcmsgbWFjaGluZSAoZm9yIG5ldHdvcmsgYnVpbGRzKS4KLQotZXhwb3J0IFNDSVRFQ0hfTElCPSRTQ0lURUNICi0KLSMgVGhlIFBSSVZBVEUgdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIHByaXZhdGUgc291cmNlIGZpbGVzIHJlc2lkZSB0aGF0Ci0jIGRvIG5vdCBsaXZlIGluIHRoZSBwdWJsaWMgc291cmNlIHRyZWUKLQotZXhwb3J0IFBSSVZBVEU9JEhPTUUvcHJpdmF0ZQotCi0jIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBsb2NhdGlvbnMgb2YgYWxsIHRoZSBjb21waWxlcnMgdGhhdCB5b3UgbWF5Ci0jIGJlIHVzaW5nLiBDaGFuZ2UgdGhlbSB0byByZWZsZWN0IHdoZXJlIHlvdSBoYXZlIGluc3RhbGxlZCB5b3VyCi0jIGNvbXBpbGVycy4KLQotZXhwb3J0IFdDMTBfUEFUSD0vdXNyL3dhdGNvbS8xMC42L3VzcgotCi0jIEFkZCB0aGUgU2NpdGVjaCBiaW4gcGF0aCB0byB0aGUgY3VycmVudCBQQVRICi1leHBvcnQgUEFUSD0kU0NJVEVDSC9iaW46JFNDSVRFQ0gvYmluLXFueDokUEFUSApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYTIxMDFkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3NldC12YXJzLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi1AZWNobyBvZmYKLVJFTTo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1SRU06IE1hc3RlciBiYXRjaCBmaWxlIHRvIHNldCB1cCBhbGwgbmVjZXNzYXJ5IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IKLVJFTTogdGhlIFNjaVRlY2ggbWFrZWZpbGUgdXRpbGl0aWVzLiBUaGlzIGJhdGNoIGZpbGUgc2hvdWxkIGJlIGV4ZWN1dGVkCi1SRU06ICpmaXJzdCogYmVmb3JlIGFueSBvdGhlciBiYXRjaCBmaWxlcyB3aGVuIHlvdSBzdGFydCBhIGNvbW1hbmQgc2hlbGwuCi1SRU06IFlvdSBzaG91bGQgbm90IG5lZWQgdG8gbW9kaWZ5IGFueSBiYXRjaCBmaWxlcyBleGNlcHQgdGhpcyBvbmUgdG8KLVJFTTogY29uZmlndXJlIHRoZSBtYWtlZmlsZSB1dGlsaXRpZXMuCi1SRU06PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1SRU06IFNldCB0aGUgcGxhY2Ugd2hlcmUgU2NpVGVjaCBTb2Z0d2FyZSBpcyBpbnN0YWxsZWQsIGFuZCB3aGVyZSBlYWNoCi1SRU06IG9mIHRoZSBzdXBwb3J0ZWQgY29tcGlsZXJzIGlzIGluc3RhbGxlZC4gVGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzCi1SRU06IGFyZSB1c2VkIGJ5IHRoZSBiYXRjaCBmaWxlcyBpbiB0aGUgU0NJVEVDSFxCSU4gZGlyZWN0b3J5LgotUkVNOgotUkVNOiBNb2RpZnkgdGhlIGFzIGFwcHJvcHJpYXRlIGZvciB5b3VyIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gKHlvdSBzaG91bGQKLVJFTTogb25seSBuZWVkIHRvIGNoYW5nZSB0aGluZ3MgaW4gdGhpcyBiYXRjaCBmaWxlKS4KLVJFTToKLVJFTTogVGhpcyB2ZXJzaW9uIGlzIGZvciBhIG5vcm1hbCBNU0RPUyBpbnN0YWxsYXRpb24uCi0KLVJFTTogVGhlIFNDSVRFQ0ggdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIGJhdGNoIGZpbGVzLCBtYWtlZmlsZSBzdGFydHVwcywKLVJFTTogaW5jbHVkZSBmaWxlcyBhbmQgc291cmNlIGZpbGVzIHdpbGwgYmUgZm91bmQgd2hlbiBjb21waWxpbmcuCi0KLVNFVCBTQ0lURUNIPWM6XHNjaXRlY2gKLQotUkVNOiBUaGUgU0NJVEVDSF9MSUIgdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIHRoZSBTY2lUZWNoIGxpYnJhcmllcyBsaXZlCi1SRU06IGZvciBpbnN0YWxsYXRpb24gYW5kIGxpbmtpbmcuIFRoaXMgYWxsb3dzIHlvdSB0byBoYXZlIHRoZSBzb3VyY2UgYW5kCi1SRU06IGluY2x1ZGUgZmlsZXMgb24gbG9jYWwgbWFjaGluZXMgZm9yIGNvbXBpbGluZyBhbmQgaGF2ZSB0aGUgbGlicmFyaWVzCi1SRU06IGxvY2F0ZWQgb24gYSBjb21tb24gbmV0d29yayBtYWNoaW5lIChmb3IgbmV0d29yayBidWlsZHMpLgotCi1TRVQgU0NJVEVDSF9MSUI9JVNDSVRFQ0glCi0KLVJFTTogVGhlIFBSSVZBVEUgdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIHByaXZhdGUgc291cmNlIGZpbGVzIHJlc2lkZSB0aGF0Ci1SRU06IGRvIG5vdCBsaXZlIGluIHRoZSBwdWJsaWMgc291cmNlIHRyZWUKLQotU0VUIFBSSVZBVEU9YzpccHJpdmF0ZQotCi1SRU06IFRoZSBmb2xsb3dpbmcgc2V0cyB1cCB0aGUgcGF0aCB0byB0aGUgU2NpVGVjaCBjb21tYW5kIGxpbmUgdXRpbGl0aWVzCi1SRU06IGZvciB0aGUgZGV2ZWxvcG1lbnQgb3BlcmF0aW5nIHN5c3RlbS4gV2Ugc2VsZWN0IGVpdGhlciBET1MgaG9zdGVkCi1SRU06IHRvb2xzIG9yIFdpbjMyIGhvc3RlZCB0b29scyBkZXBlbmRpbmcgb24gd2hldGhlciB5b3UgYXJlIHJ1bm5pbmcKLVJFTTogb24gTlQgb3Igbm90LiBXaW5kb3dzIDl4IHVzZXJzIGNhbiB1c2UgdGhlIFdpbjMyIGhvc3RlZCB0b29scyBidXQKLVJFTTogdGhleSBydW4gc2xvd2VyLCBidXQgeW91IHdpbGwgaGF2ZSBsb25nIGZpbGVuYW1lcyBpZiB5b3UgZG8gdGhpcy4KLQotSUYgLiVPUyU9PS5XaW5kb3dzX05UIGdvdG8gV2luMzJfcGF0aAotSUYgTk9UIC4lV0lORElSJT09LiBnb3RvIFdpbjMyX3BhdGgKLVNFVCBTQ0lURUNIX0JJTj0lU0NJVEVDSCVcYmluOyVTQ0lURUNIJVxiaW4tZG9zCi1nb3RvIHBhdGhfc2V0Ci0KLVJFTTogVGhlIGZvbGxvd2luZyBzZXRzIHVwIHRoZSBwYXRoIHRvIHRoZSBTY2lUZWNoIGNvbW1hbmQgbGluZSB1dGlsaXRpZXMKLVJFTTogZm9yIHRoZSBkZXZlbG9wbWVudCBvcGVyYXRpbmcgc3lzdGVtLiBUaGlzIHZlcnNpb24gdXNlcyB0aGUgV2luMzIKLVJFTTogaG9zdGVkIHRvb2xzIGJ5IGRlZmF1bHQsIHNvIHlvdSBjYW4gdXNlIGxvbmcgZmlsZW5hbWVzLgotCi06V2luMzJfcGF0aAotU0VUIFNDSVRFQ0hfQklOPSVTQ0lURUNIJVxiaW47JVNDSVRFQ0glXGJpbi13aW4zMgotCi06cGF0aF9zZXQKLQotUkVNOiBTZXQgdGhlIFRNUCB2YXJpYWJsZSBmb3IgZG1ha2UgaWYgdGhpcyBpcyBub3QgYWxyZWFkeSBzZXQKLQotU0VUIFRNUD0lU0NJVEVDSCUKLQotUkVNOiBTZXQgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB1c2UgdGhlIE5ldHdpZGUgQXNzZW1ibGVyCi1SRU06IChOQVNNKSBwcm92aWRlZCB3aXRoIHRoZSBNR0wgdG9vbHMgdG8gYnVpbGQgYWxsIGFzc2VtYmxlciBtb2R1bGVzLgotUkVNOiBJZiB5b3UgaGF2ZSBUdXJibyBBc3NlbWJsZXIgNC4wIG9yIGxhdGVyIGFuZCB5b3Ugd2lzaCB0byB1c2UgaXQsCi1SRU06IHlvdSBjYW4gdXNlIGl0IGJ5IHJlbW92aW5nIHRoZSBmb2xsb3dpbmcgbGluZS4KLQotU0VUIFVTRV9OQVNNPTEKLQotUkVNOiBUaGUgZm9sbG93aW5nIGlzIHVzZWQgdG8gc2V0IHVwIERESyBkaXJlY3RvcmllcyBmb3IgZGV2aWNlIGRyaXZlcgotUkVNOiBkZXZlbG9wbWVudC4gVGhleSBjYW4gc2FmZWx5IGJlIGlnbm9yZWQgdW5sZXNzIHlvdSBhcmUgdXNpbmcgdGhlCi1SRU06IFNjaVRlY2ggbWFrZWZpbGUgdXRpbGl0aWVzIHRvIGJ1aWxkIGRldmljZSBkcml2ZXJzLgotCi1TRVQgRERLRFJJVkU9YzoKLVNFVCBNU1NESz1jOlxjXHdpbjMyc2RrCi1TRVQgVzk1X0RES1JPT1Q9YzpcY1w5NWRkawotU0VUIFc5OF9EREtST09UPWM6XGNcOThkZGsKLVNFVCBOVF9EREtST09UPWM6XGNcbnRkZGsKLVNFVCBXMktfRERLUk9PVD1jOlxjXDIwMDBkZGsKLVNFVCBNQVNNX1JPT1Q9YzpcY1xtYXNtNjExCi1TRVQgVlRPT0xTRD1jOlxjXHZ0ZDk1Ci1TRVQgU09GVElDRV9QQVRIPWM6XGNcc2ludAotCi1SRU06IFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBsb2NhdGlvbnMgb2YgYWxsIHRoZSBjb21waWxlcnMgdGhhdCB5b3UgbWF5Ci1SRU06IGJlIHVzaW5nLiBDaGFuZ2UgdGhlbSB0byByZWZsZWN0IHdoZXJlIHlvdSBoYXZlIGluc3RhbGxlZCB5b3VyCi1SRU06IGNvbXBpbGVycy4KLQotU0VUIEJDM19QQVRIPWM6XGNcYmMzCi1TRVQgQkM0X1BBVEg9YzpcY1xiYzQ1Ci1TRVQgQkM1X1BBVEg9YzpcY1xiYzUwCi1TRVQgQkNCNV9QQVRIPWM6XGNcYmNiNTAKLVNFVCBWQ19QQVRIPWM6XGNcbXN2YwotU0VUIFZDNF9QQVRIPWM6XGNcdmM0MgotU0VUIFZDNV9QQVRIPWM6XGNcdmM1MAotU0VUIFZDNl9QQVRIPWM6XGNcdmM2MAotU0VUIFNDNzBfUEFUSD1jOlxjXHNjNzUKLVNFVCBXQzEwQV9QQVRIPWM6XGNcd2MxMGEKLVNFVCBXQzEwX1BBVEg9YzpcY1x3YzEwCi1TRVQgV0MxMV9QQVRIPWM6XGNcd2MxMQotU0VUIFROVF9QQVRIPWM6XGNcdG50Ci1TRVQgREpfUEFUSD1jOlxjXGRqZ3BwCi1TRVQgR0NDMl9QQVRIPWM6XHVuaXhcdXNyCi0KLVJFTTogVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIGxvY2F0aW9ucyBvZiB0aGUgSURFIGFuZCBjb21waWxlciBwYXRoCi1SRU06IHRvb2xzIGZvciBWaXN1YWwgQysrLiBJZiB5b3UgZG8gYSBzdGFuZGFyZCBpbnN0YWxsYXRpb24sIHlvdSB3b250Ci1SRU06IG5lZWQgdG8gY2hhbmdlIHRoaXMuIElmIGhvd2V2ZXIgeW91IGRpZCBhIGN1c3RvbSBpbnN0YWxsIGFuZCBjaGFuZ2VkCi1SRU06IHRoZSBwYXRocyB0byB0aGVzZSBkaXJlY3RvcnksIHlvdSB3aWxsIG5lZWQgdG8gbW9kaWZ5IHRoaXMgdG8gc3VpdC4KLQotU0VUIFZDNV9NU0RldkRpcj0lVkM1X1BBVEglXHNoYXJlZGlkZQotU0VUIFZDNV9NU1ZDRGlyPSVWQzVfUEFUSCVcdmMKLVNFVCBWQzZfTVNEZXZEaXI9JVZDNl9QQVRIJVxjb21tb25cbXNkZXY5OAotU0VUIFZDNl9NU1ZDRGlyPSVWQzZfUEFUSCVcdmM5OAotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWMzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWMzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxZjdkOGUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC1jMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDQuMiAzMiBiaXQgZWRpdGlvbgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxWQzQ7JVZDNF9QQVRIJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcVkM0OyVWQzRfUEFUSCVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JVZDNF9QQVRIJQotc2V0IENfSU5DTFVERT0lVkM0X1BBVEglXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOwotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1zZXQgSU5JVD0lVkM0X1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9OVERSVj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVkNfTElCQkFTRT1WQzQKLVBBVEggJVNDSVRFQ0hfQklOJTslVkM0X1BBVEglXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1SRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKLWlmIE5PVCAuJTElPT0uc2RrIGdvdG8gZG9uZQotY2FsbCB3aW4zMnNkay5iYXQKLQotOmRvbmUKLWVjaG8gVmlzdWFsIEMrKyA0LjIgMzIgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWQxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWQxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4MTc0OTMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC1kMTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDEuNTJjIDE2IGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzE2XFZDNDslVkNfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzE2XFZDNDslVkNfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JVZDX1BBVEglCi1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDX1BBVEglXElOQ0xVREU7Ci1zZXQgSU5JVD0lVkNfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMxNi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9VkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JVZDX1BBVEglXEJJTjslREVGUEFUSCUlVkNfQ0RfUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDEuNTJjIDE2IERPUyBiaXQgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWRydjl4LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtZHJ2OXguYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MmUzNTIxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtZHJ2OXguYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDQuMiAzMiBiaXQgZWRpdGlvbgotCi1SRU06IEZpcnN0IHNldHVwIGZvciBXaW4zMiBjb25zb2xlIGRldmVsb3BtZW50Ci1jYWxsIHZjNDAtYzMyLmJhdCA+IE5VTAotCi1SRU06IEV4dHJhIHN0dWZmIHRvIHNldCB1cCBmb3IgV2luZG93cyA5eCBEREsgZGV2ZWxvcG1lbnQKLXNldCBNQVNURVJfTUFLRT0xCi1zZXQgRERLUk9PVD0lVzk1X0RES1JPT1QlCi1zZXQgU0RLUk9PVD0lTVNTREslCi1zZXQgQzE2X1JPT1Q9JVZDX1BBVEglCi1zZXQgQzMyX1JPT1Q9JVZDNF9QQVRIJQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBkb25lCi06Y2hlY2tlZF9idWlsZAotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIGRvbmUKLTpkb25lCi1lY2hvIFZpc3VhbCBDKysgNC4yIFdpbmRvd3MgOXggZHJpdmVyIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC1kcnZudC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWRydm50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNiNjc4MC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWRydm50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA0LjIgMzIgYml0IGVkaXRpb24KLQotUkVNOiBGaXJzdCBzZXR1cCBmb3IgV2luMzIgY29uc29sZSBkZXZlbG9wbWVudCAod2l0aCBQbGF0Zm9ybSBTREspCi1jYWxsIHZjNDAtYzMyLmJhdCBzZGsgPiBOVUwKLQotUkVNOiBFeHRyYSBzdHVmZiB0byBzZXQgdXAgZm9yIFdpbmRvd3MgTlQgRERLIGRldmVsb3BtZW50Ci1TRVQgQkFTRURJUj0lTlRfRERLUk9PVCUKLVNFVCBQQVRIPSVOVF9EREtST09UJVxiaW47JVBBVEglCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIGRvbmUKLTpjaGVja2VkX2J1aWxkCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gZG9uZQotOmRvbmUKLWVjaG8gVmlzdWFsIEMrKyA0LjIgV2luZG93cyBOVCBkcml2ZXIgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXNucC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXNucC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5OTcwNDQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC1zbnAuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDQuMiAzMiBiaXQgZWRpdGlvbgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTkFQXFZDNDslVkM0X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTkFQXFZDNDslVkM0X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVWQzRfUEFUSCUKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERQotc2V0IElOSVQ9JVZDNF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9OVERSVj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9MQotU0VUIFZDX0xJQkJBU0U9VkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JVZDNF9QQVRIJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDQuMiBTbmFwIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cAotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXRudC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXRudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwZmM5MzYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC10bnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDQuMiAzMiBiaXQgZWRpdGlvbgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxWQzQ7JVZDNF9QQVRIJVxMSUI7JVROVF9QQVRIJVxDT0ZGTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXFZDNDslVkM0X1BBVEglXExJQjslVE5UX1BBVEglXENPRkZMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lVkM0X1BBVEglCi1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDNF9QQVRIJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKLXNldCBJTklUPSVWQzRfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9OVERSVj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVkNfTElCQkFTRT1WQzQKLVBBVEggJVNDSVRFQ0hfQklOJTslVkM0X1BBVEglXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1SRU0gSWYgeW91IHNldCB0aGUgZm9sbG93aW5nIHRvIGEgMSwgYSBUTlQgRG9zU3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4KLVJFTSBPdGhlcndpc2UgYSBUTlQgTnRTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLiBOdFN0eWxlIGFwcHMgd2lsbCAqb25seSoKLVJFTSBydW4gdW5kZXIgcmVhbCBET1Mgd2hlbiB1c2luZyBvdXIgbGlicmFyaWVzLCBzaW5jZSB3ZSByZXF1aXJlIGFjY2VzcwotUkVNIHRvIGZ1bmN0aW9ucyB0aGF0IHRoZSBXaW4zMiBBUEkgZG9lcyBub3Qgc3VwcG9ydCAoc3VjaCBhcyBkaXJlY3QgYWNjZXNzCi1SRU0gdG8gdmlkZW8gbWVtb3J5LCBjYWxsaW5nIEludCAxMGggQklPUyBmdW5jdGlvbnMgZXRjKS4gRG9zU3R5bGUgYXBwcwotUkVNIHdpbGwgaG93ZXZlciBydW4gZmluZSBpbiBib3RoIERPUyBhbmQgYSBXaW45NSBET1MgYm94IChOVCBET1MgYm94ZXMgZG9uJ3QKLVJFTSB3b3JrIHRvbyB3ZWxsKS4KLVJFTQotUkVNIElmIHlvdSBhcmUgdXNpbmcgdGhlIFJlYWxUaW1lIERPUyBleHRlbmRlciwgeW91ciBhcHBzICptdXN0KiBiZSBOdFN0eWxlLAotUkVNIGFuZCBoZW5jZSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gcnVuIHVuZGVyIFdpbjk1IG9yIFdpbk5ULCBvbmx5IERPUy4KLQotU0VUIERPU1NUWUxFPQotCi1lY2hvIFZpc3VhbCBDKysgNC4yIDMyLWJpdCBET1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwIChUTlQpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC13MTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC13MTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyODQ5YTIwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtdzE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyAxLjUyYyAxNiBiaXQgZWRpdGlvbgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4xNlxWQzQ7JVZDX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4xNlxWQzQ7JVZDX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVWQ19QQVRIJQotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVWQ19QQVRIJVxJTkNMVURFOwotc2V0IElOSVQ9JVZDX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMTYuTUsKLVNFVCBVU0VfV0lOMTY9MQotU0VUIFVTRV9XSU4zMj0KLVNFVCBWQ19MSUJCQVNFPVZDNAotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVBBVEggJVNDSVRFQ0hfQklOJTslVkNfUEFUSCVcQklOOyVERUZQQVRIJSVWQ19DRF9QQVRIJQotCi1lY2hvIFZpc3VhbCBDKysgMS41MmMgMTYgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC13MzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC13MzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOTNhNjI0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtdzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA0LjIgMzIgYml0IGVkaXRpb24KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcVkM0OyVWQzRfUEFUSCVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFZDNDslVkM0X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVWQzRfUEFUSCUKLXNldCBDX0lOQ0xVREU9JVZDNF9QQVRIJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQotc2V0IElOSVQ9JVZDNF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBXSU4zMl9HVUk9MQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPVZDNAotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQzRfUEFUSCVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVWQzMyX0NEX1BBVEglCi0KLVJFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQotaWYgTk9UIC4lMSU9PS5zZGsgZ290byBkb25lCi1jYWxsIHdpbjMyc2RrLmJhdAotCi06ZG9uZQotZWNobyBWaXN1YWwgQysrIDQuMiAzMiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC14MTEuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC14MTEuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDIwYTU0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAteDExLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA0LjIgMzIgYml0IGVkaXRpb24KLQotU0VUIExJQj0lVkM0X1BBVEglXExJQjsuCi1TRVQgVE9PTFJPT1RESVI9JVZDNF9QQVRIJQotU0VUIElOQ0xVREU9XHhjXGluY2x1ZGU7JVZDNF9QQVRIJVxJTkNMVURFCi1TRVQgSU5JVD0lVkM0X1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFdJTjMyX0dVST0xCi1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfTlREUlY9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9VkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JVZDNF9QQVRIJVxCSU47JURFRlBBVEglCi0KLWVjaG8gVmlzdWFsIEMrKyA0LjIgWDExIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1jMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1jMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MmQyN2I5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtYzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA1LjAgMzIgYml0IGVkaXRpb24KLQotU0VUIE1TRGV2RGlyPSVWQzVfTVNEZXZEaXIlCi1TRVQgTVNWQ0Rpcj0lVkM1X01TVkNEaXIlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFZDNTslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFZDNTslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JU1TVkNEaXIlCi1zZXQgQ19JTkNMVURFPSVNU1ZDRGlyJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQotc2V0IElOSVQ9JU1TVkNEaXIlCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9OVERSVj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVkNfTElCQkFTRT12YzUKLVBBVEggJVNDSVRFQ0hfQklOJTslTVNWQ0RpciVcQklOOyVNU0RldkRpciVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVWQzMyX0NEX1BBVEglCi0KLVJFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQotaWYgTk9UIC4lMSU9PS5zZGsgZ290byBkb25lCi1jYWxsIHdpbjMyc2RrLmJhdAotCi06ZG9uZQotZWNobyBWaXN1YWwgQysrIDUuMCAzMi1iaXQgV2luZG93cyBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1kMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1kMTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzg5YzUwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtZDE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyAxLjUyYyAxNiBiaXQgZWRpdGlvbgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MxNlxWQzU7JVZDX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MxNlxWQzU7JVZDX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVWQ19QQVRIJQotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVWQ19QQVRIJVxJTkNMVURFOwotc2V0IElOSVQ9JVZDX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMTYuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPXZjNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQ19QQVRIJVxCSU47JURFRlBBVEglJVZDX0NEX1BBVEglCi0KLWVjaG8gVmlzdWFsIEMrKyAxLjUyYyAxNi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtZHJ2OXguYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1kcnY5eC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3YTRhMTQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1kcnY5eC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNi4wIDMyIGJpdCBlZGl0aW9uCi0KLVJFTTogRmlyc3Qgc2V0dXAgZm9yIFdpbjMyIGNvbnNvbGUgZGV2ZWxvcG1lbnQKLWNhbGwgdmM2MC1jMzIuYmF0ID4gTlVMCi0KLVJFTTogRXh0cmEgc3R1ZmYgdG8gc2V0IHVwIGZvciBXaW5kb3dzIDl4IERESyBkZXZlbG9wbWVudAotc2V0IE1BU1RFUl9NQUtFPTEKLXNldCBEREtST09UPSVXOTVfRERLUk9PVCUKLXNldCBTREtST09UPSVNU1NESyUKLXNldCBDMTZfUk9PVD0lVkNfUEFUSCUKLXNldCBDMzJfUk9PVD0lVkM2X1BBVEglCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIGRvbmUKLTpjaGVja2VkX2J1aWxkCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gZG9uZQotOmRvbmUKLWVjaG8gVmlzdWFsIEMrKyA2LjAgV2luZG93cyA5eCBkcml2ZXIgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLWRydm50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtZHJ2bnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxN2IyZjI1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtZHJ2bnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDYuMCAzMiBiaXQgZWRpdGlvbgotCi1SRU06IEZpcnN0IHNldHVwIGZvciBXaW4zMiBjb25zb2xlIGRldmVsb3BtZW50ICh3aXRoIFBsYXRmb3JtIFNESykKLWNhbGwgdmM2MC1jMzIuYmF0IHNkayA+IE5VTAotCi1SRU06IE5vdyBzZXR1cCBzdHVmZiBmb3IgdGhlIE5UIERESyBidWlsZCBlbnZpcm9ubWVudAotY2FsbCBudGRkay5iYXQKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gZG9uZQotOmNoZWNrZWRfYnVpbGQKLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBkb25lCi06ZG9uZQotZWNobyBWaXN1YWwgQysrIDYuMCBXaW5kb3dzIE5UIGRyaXZlciBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtcnR0LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtcnR0LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWZiMmZiMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXJ0dC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNS4wIDMyIGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFZDNTslVkM1X1BBVEglXFZDXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxWQzU7JVZDNV9QQVRIJVxWQ1xMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lVkM1X1BBVEglXFZDCi1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDNV9QQVRIJVxWQ1xJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKLXNldCBJTklUPSVWQzVfUEFUSCVcVkMKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfTlREUlY9Ci1TRVQgVVNFX1JUVEFSR0VUPTEKLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPXZjNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQzVfUEFUSCVcVkNcQklOOyVWQzVfUEFUSCVcU0hBUkVESURFXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1lY2hvIFZpc3VhbCBDKysgNS4wIFJUVGFyZ2V0LTMyIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1zbnAuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1zbnAuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMmQyZTEzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtc25wLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLUBlY2hvIG9mZiBSRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDUuMCAzMiBiaXQKLWVkaXRpb24KLQotU0VUIE1TRGV2RGlyPSVWQzVfTVNEZXZEaXIlCi1TRVQgTVNWQ0Rpcj0lVkM1X01TVkNEaXIlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFNOQVBcVkM1OyVNU1ZDRGlyJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU05BUFxWQzU7JU1TVkNEaXIlXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVNU1ZDRGlyJQotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFCi1zZXQgSU5JVD0lTVNWQ0RpciUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfTlREUlY9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPTEKLVNFVCBWQ19MSUJCQVNFPXZjNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVNU1ZDRGlyJVxCSU47JU1TRGV2RGlyJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDUuMCBTbmFwIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC10bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC10bnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YjA5MTk5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtdG50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA1LjAgMzIgYml0IGVkaXRpb24KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcVkM1OyVWQzVfUEFUSCVcVkNcTElCOyVUTlRfUEFUSCVcQ09GRkxJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFZDNTslVkM1X1BBVEglXFZDXExJQjslVE5UX1BBVEglXENPRkZMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lVkM1X1BBVEglXFZDCi1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDNV9QQVRIJVxWQ1xJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKLXNldCBJTklUPSVWQzVfUEFUSCVcVkMKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9OVERSVj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVkNfTElCQkFTRT12YzUKLVBBVEggJVNDSVRFQ0hfQklOJTslVkM1X1BBVEglXFZDXEJJTjslVkM1X1BBVEglXFNIQVJFRElERVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKLQotUkVNIElmIHlvdSBzZXQgdGhlIGZvbGxvd2luZyB0byBhIDEsIGEgVE5UIERvc1N0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuCi1SRU0gT3RoZXJ3aXNlIGEgVE5UIE50U3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4gTnRTdHlsZSBhcHBzIHdpbGwgKm9ubHkqCi1SRU0gcnVuIHVuZGVyIHJlYWwgRE9TIHdoZW4gdXNpbmcgb3VyIGxpYnJhcmllcywgc2luY2Ugd2UgcmVxdWlyZSBhY2Nlc3MKLVJFTSB0byBmdW5jdGlvbnMgdGhhdCB0aGUgV2luMzIgQVBJIGRvZXMgbm90IHN1cHBvcnQgKHN1Y2ggYXMgZGlyZWN0IGFjY2VzcwotUkVNIHRvIHZpZGVvIG1lbW9yeSwgY2FsbGluZyBJbnQgMTBoIEJJT1MgZnVuY3Rpb25zIGV0YykuIERvc1N0eWxlIGFwcHMKLVJFTSB3aWxsIGhvd2V2ZXIgcnVuIGZpbmUgaW4gYm90aCBET1MgYW5kIGEgV2luOTUgRE9TIGJveCAoTlQgRE9TIGJveGVzIGRvbid0Ci1SRU0gd29yayB0b28gd2VsbCkuCi1SRU0KLVJFTSBJZiB5b3UgYXJlIHVzaW5nIHRoZSBSZWFsVGltZSBET1MgZXh0ZW5kZXIsIHlvdXIgYXBwcyAqbXVzdCogYmUgTnRTdHlsZSwKLVJFTSBhbmQgaGVuY2Ugd2lsbCBuZXZlciBiZSBhYmxlIHRvIHJ1biB1bmRlciBXaW45NSBvciBXaW5OVCwgb25seSBET1MuCi0KLVNFVCBET1NTVFlMRT0KLQotZWNobyBWaXN1YWwgQysrIDUuMCAzMi1iaXQgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwICh3aXRoIFROVCkuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXcxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXcxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyYWI0OTUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC13MTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDEuNTJjIDE2IGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjE2XFZDNTslVkNfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjE2XFZDNTslVkNfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JVZDX1BBVEglCi1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDX1BBVEglXElOQ0xVREU7Ci1zZXQgSU5JVD0lVkNfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMxNi5NSwotU0VUIFVTRV9XSU4xNj0xCi1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPXZjNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQ19QQVRIJVxCSU47JURFRlBBVEglJVZDX0NEX1BBVEglCi0KLWVjaG8gVmlzdWFsIEMrKyAxLjUyYyAxNi1iaXQgV2luZG93cyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtdzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtdzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDdiYzVlNS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXczMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNS4wIDMyIGJpdCBlZGl0aW9uCi0KLVNFVCBNU0RldkRpcj0lVkM1X01TRGV2RGlyJQotU0VUIE1TVkNEaXI9JVZDNV9NU1ZDRGlyJQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxWQzU7JU1TVkNEaXIlXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxWQzU7JU1TVkNEaXIlXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVNU1ZDRGlyJQotc2V0IENfSU5DTFVERT0lTVNWQ0RpciVcSU5DTFVERTslVE5UX1BBVEglXElOQ0xVREU7Ci1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUNfSU5DTFVERSUKLXNldCBJTklUPSVNU1ZDRGlyJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBXSU4zMl9HVUk9MQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPXZjNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVNU1ZDRGlyJVxCSU47JU1TRGV2RGlyJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKLQotUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCi1pZiBOT1QgLiUxJT09LnNkayBnb3RvIGRvbmUKLWNhbGwgd2luMzJzZGsuYmF0Ci0KLTpkb25lCi1lY2hvIFZpc3VhbCBDKysgNS4wIDMyLWJpdCBXaW5kb3dzIGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXgxMS5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXgxMS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlMjg2YmQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC14MTEuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDUuMCAzMiBiaXQgZWRpdGlvbgotCi1TRVQgTElCPSVWQzVfUEFUSCVcVkNcTElCOy4KLVNFVCBUT09MUk9PVERJUj0lVkM1X1BBVEglXFZDCi1TRVQgSU5DTFVERT1ceGNcaW5jbHVkZTslVkM1X1BBVEglXFZDXElOQ0xVREUKLVNFVCBJTklUPSVWQzVfUEFUSCVcVkMKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9OVERSVj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVkNfTElCQkFTRT12YzUKLVBBVEggJVNDSVRFQ0hfQklOJTslVkM1X1BBVEglXFZDXEJJTjslVkM1X1BBVEglXFNIQVJFRElERVxCSU47JURFRlBBVEglCi0KLWVjaG8gVmlzdWFsIEMrKyA1LjAgWDExIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1jMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1jMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOTg0MTdkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtYzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KLQotU0VUIE1TRGV2RGlyPSVWQzZfTVNEZXZEaXIlCi1TRVQgTVNWQ0Rpcj0lVkM2X01TVkNEaXIlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFZDNjslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFZDNjslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JU1TVkNEaXIlCi1zZXQgQ19JTkNMVURFPSVNU1ZDRGlyJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERQotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1zZXQgSU5JVD0lTVNWQ0RpciUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPXZjNgotUEFUSCAlU0NJVEVDSF9CSU4lOyVNU1ZDRGlyJVxCSU47JU1TRGV2RGlyJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKLQotUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCi1pZiBOT1QgLiUxJT09LnNkayBnb3RvIGRvbmUKLWNhbGwgd2luMzJzZGsuYmF0Ci0KLTpkb25lCi1lY2hvIFZpc3VhbCBDKysgNi4wIDMyLWJpdCBXaW5kb3dzIGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWQxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWQxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwODU1ZTAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1kMTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDEuNTJjIDE2IGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzE2XFZDNjslVkNfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzE2XFZDNjslVkNfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JVZDX1BBVEglCi1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDX1BBVEglXElOQ0xVREU7Ci1zZXQgSU5JVD0lVkNfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMxNi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM2Ci1QQVRIICVTQ0lURUNIX0JJTiU7JVZDX1BBVEglXEJJTjslREVGUEFUSCUlVkNfQ0RfUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDEuNTJjIDE2LWJpdCBET1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1kcnY5eC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydjl4LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjdhNGExNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydjl4LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KLQotUkVNOiBGaXJzdCBzZXR1cCBmb3IgV2luMzIgY29uc29sZSBkZXZlbG9wbWVudAotY2FsbCB2YzYwLWMzMi5iYXQgPiBOVUwKLQotUkVNOiBFeHRyYSBzdHVmZiB0byBzZXQgdXAgZm9yIFdpbmRvd3MgOXggRERLIGRldmVsb3BtZW50Ci1zZXQgTUFTVEVSX01BS0U9MQotc2V0IERES1JPT1Q9JVc5NV9EREtST09UJQotc2V0IFNES1JPT1Q9JU1TU0RLJQotc2V0IEMxNl9ST09UPSVWQ19QQVRIJQotc2V0IEMzMl9ST09UPSVWQzZfUEFUSCUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gZG9uZQotOmNoZWNrZWRfYnVpbGQKLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBkb25lCi06ZG9uZQotZWNobyBWaXN1YWwgQysrIDYuMCBXaW5kb3dzIDl4IGRyaXZlciBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtZHJ2bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1kcnZudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3YjJmMjUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1kcnZudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNi4wIDMyIGJpdCBlZGl0aW9uCi0KLVJFTTogRmlyc3Qgc2V0dXAgZm9yIFdpbjMyIGNvbnNvbGUgZGV2ZWxvcG1lbnQgKHdpdGggUGxhdGZvcm0gU0RLKQotY2FsbCB2YzYwLWMzMi5iYXQgc2RrID4gTlVMCi0KLVJFTTogTm93IHNldHVwIHN0dWZmIGZvciB0aGUgTlQgRERLIGJ1aWxkIGVudmlyb25tZW50Ci1jYWxsIG50ZGRrLmJhdAotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBkb25lCi06Y2hlY2tlZF9idWlsZAotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIGRvbmUKLTpkb25lCi1lY2hvIFZpc3VhbCBDKysgNi4wIFdpbmRvd3MgTlQgZHJpdmVyIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1kcnZ3MmsuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1kcnZ3MmsuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMzA0MjkzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtZHJ2dzJrLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KLQotUkVNOiBGaXJzdCBzZXR1cCBmb3IgV2luMzIgY29uc29sZSBkZXZlbG9wbWVudCAod2l0aCBQbGF0Zm9ybSBTREspCi1jYWxsIHZjNjAtYzMyLmJhdCBzZGsgPiBOVUwKLQotUkVNOiBOb3cgc2V0dXAgc3R1ZmYgZm9yIHRoZSBOVCBEREsgYnVpbGQgZW52aXJvbm1lbnQKLWNhbGwgdzJrZGRrLmJhdAotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBkb25lCi06Y2hlY2tlZF9idWlsZAotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIGRvbmUKLTpkb25lCi1lY2hvIFZpc3VhbCBDKysgNi4wIFdpbmRvd3MgV2luZG93cyAyMDAwIGRyaXZlciBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtc25wLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtc25wLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM0OGVmOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXNucC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNi4wIDMyIGJpdCBlZGl0aW9uCi0KLVNFVCBNU0RldkRpcj0lVkM2X01TRGV2RGlyJQotU0VUIE1TVkNEaXI9JVZDNl9NU1ZDRGlyJQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTkFQXFZDNjslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFNOQVBcVkM2OyVNU1ZDRGlyJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lTVNWQ0RpciUKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERQotc2V0IElOSVQ9JU1TVkNEaXIlCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0xCi1TRVQgVkNfTElCQkFTRT12YzYKLVBBVEggJVNDSVRFQ0hfQklOJTslTVNWQ0RpciVcQklOOyVNU0RldkRpciVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVWQzMyX0NEX1BBVEglCi0KLWVjaG8gVmlzdWFsIEMrKyA2LjAgU25hcCBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtdG50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtdG50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWQ4YjVlMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXRudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNi4wIDMyIGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFZDNjslVkM2X1BBVEglXFZDOThcTElCOyVUTlRfUEFUSCVcQ09GRkxJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFZDNjslVkM2X1BBVEglXFZDOThcTElCOyVUTlRfUEFUSCVcQ09GRkxJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVWQzZfUEFUSCVcVkM5OAotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVWQzZfUEFUSCVcVkM5OFxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKLXNldCBJTklUPSVWQzZfUEFUSCVcVkM5OAotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPXZjNiBQQVRICi0lU0NJVEVDSF9CSU4lOyVWQzZfUEFUSCVcVkM5OFxCSU47JVZDNl9QQVRIJVxDT01NT05cTVNERVY5OFxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKLQotUkVNIElmIHlvdSBzZXQgdGhlIGZvbGxvd2luZyB0byBhIDEsIGEgVE5UIERvc1N0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuCi1SRU0gT3RoZXJ3aXNlIGEgVE5UIE50U3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4gTnRTdHlsZSBhcHBzIHdpbGwgKm9ubHkqCi1SRU0gcnVuIHVuZGVyIHJlYWwgRE9TIHdoZW4gdXNpbmcgb3VyIGxpYnJhcmllcywgc2luY2Ugd2UgcmVxdWlyZSBhY2Nlc3MKLVJFTSB0byBmdW5jdGlvbnMgdGhhdCB0aGUgV2luMzIgQVBJIGRvZXMgbm90IHN1cHBvcnQgKHN1Y2ggYXMgZGlyZWN0IGFjY2VzcwotUkVNIHRvIHZpZGVvIG1lbW9yeSwgY2FsbGluZyBJbnQgMTBoIEJJT1MgZnVuY3Rpb25zIGV0YykuIERvc1N0eWxlIGFwcHMKLVJFTSB3aWxsIGhvd2V2ZXIgcnVuIGZpbmUgaW4gYm90aCBET1MgYW5kIGEgV2luOTUgRE9TIGJveCAoTlQgRE9TIGJveGVzIGRvbid0Ci1SRU0gd29yayB0b28gd2VsbCkuCi1SRU0KLVJFTSBJZiB5b3UgYXJlIHVzaW5nIHRoZSBSZWFsVGltZSBET1MgZXh0ZW5kZXIsIHlvdXIgYXBwcyAqbXVzdCogYmUgTnRTdHlsZSwKLVJFTSBhbmQgaGVuY2Ugd2lsbCBuZXZlciBiZSBhYmxlIHRvIHJ1biB1bmRlciBXaW45NSBvciBXaW5OVCwgb25seSBET1MuCi0KLVNFVCBET1NTVFlMRT0KLQotZWNobyBWaXN1YWwgQysrIDYuMCAzMi1iaXQgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwICh3aXRoIFROVCkuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXcxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXcxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcwMTc1YzMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC13MTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDEuNTJjIDE2IGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjE2XFZDNjslVkNfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjE2XFZDNjslVkNfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JVZDX1BBVEglCi1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDX1BBVEglXElOQ0xVREU7Ci1zZXQgSU5JVD0lVkNfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMxNi5NSwotU0VUIFVTRV9XSU4xNj0xCi1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPXZjNgotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQ19QQVRIJVxCSU47JURFRlBBVEglJVZDX0NEX1BBVEglCi0KLWVjaG8gVmlzdWFsIEMrKyAxLjUyYyAxNi1iaXQgV2luZG93cyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtdzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtdzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmY4ZTdhYi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXczMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNi4wIDMyIGJpdCBlZGl0aW9uCi0KLVNFVCBNU0RldkRpcj0lVkM2X01TRGV2RGlyJQotU0VUIE1TVkNEaXI9JVZDNl9NU1ZDRGlyJQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxWQzY7JU1TVkNEaXIlXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxWQzY7JU1TVkNEaXIlXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVNU1ZDRGlyJQotc2V0IENfSU5DTFVERT0lTVNWQ0RpciVcSU5DTFVERTslVE5UX1BBVEglXElOQ0xVREUKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQotc2V0IElOSVQ9JU1TVkNEaXIlCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFdJTjMyX0dVST0xCi1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfTlREUlY9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM2Ci1QQVRIICVTQ0lURUNIX0JJTiU7JU1TVkNEaXIlXEJJTjslTVNEZXZEaXIlXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1SRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKLWlmIE5PVCAuJTElPT0uc2RrIGdvdG8gZG9uZQotY2FsbCB3aW4zMnNkay5iYXQKLQotOmRvbmUKLWVjaG8gVmlzdWFsIEMrKyA2LjAgMzItYml0IFdpbmRvd3MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXgxMS5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXgxMS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3YjIzZDIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC14MTEuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDYuMCAzMiBiaXQgZWRpdGlvbgotCi1TRVQgTElCPSVWQzZfUEFUSCVcVkM5OFxMSUI7LgotU0VUIFRPT0xST09URElSPSVWQzZfUEFUSCVcVkM5OAotU0VUIElOQ0xVREU9XHhjXGluY2x1ZGU7JVZDNl9QQVRIJVxWQzk4XElOQ0xVREU7Ci1TRVQgSU5JVD0lVkM2X1BBVEglXFZDOTgKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9OVERSVj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVkNfTElCQkFTRT12YzYKLVBBVEggJVNDSVRFQ0hfQklOJTslVkM2X1BBVEglXFZDOThcQklOOyVWQzZfUEFUSCVcQ09NTU9OXE1TREVWOThcQklOOyVERUZQQVRIJQotCi1lY2hvIFZpc3VhbCBDKysgNi4wIFgxMSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3cya2Rkay5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93MmtkZGsuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Mjg1OGQxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3cya2Rkay5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1AZWNobyBvZmYKLVJFTTogU2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTWljcm9zb2Z0IFdpbmRvd3MgTlQgRERLIGRldmVsb3BtZW50LgotUkVNOiBOb3RlIHRoYXQgd2UgaGF2ZSBoYXJkIGNvZGVkIHRoaXMgZm9yIFdpbmRvd3MgTlQgaTM4NiBkZXZlbG9wbWVudC4KLQotU0VUIFVTRV9OVERSVj0xCi1TRVQgVVNFX1cyS0RSVj0xCi1TRVQgQkFTRURJUj0lVzJLX0RES1JPT1QlCi1TRVQgUEFUSD0lQkFTRURJUiVcYmluOyVQQVRIJQotU0VUIE5UTUFLRUVOVj0lQkFTRURJUiVcaW5jCi1TRVQgQlVJTERfTUFLRV9QUk9HUkFNPW5tYWtlLmV4ZQotU0VUIEJVSUxEX0RFRkFVTFQ9LWVpIC1ubWFrZSAtaQotU0VUIEJVSUxEX0RFRkFVTFRfVEFSR0VUUz0tMzg2Ci1TRVQgX09CSl9ESVI9b2JqCi1TRVQgTkVXX0NSVFM9MQotU0VUIF9OVFJPT1Q9JUJBU0VESVIlCi1TRVQgSU5DTFVERT0lQkFTRURJUiVcaW5jOyVCQVNFRElSJVxpbmNcZGRrOyVJTkNMVURFJQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWQKLQotUkVNOiBzZXQgdXAgYW4gTlQgZnJlZSBidWlsZCBlbnZpcm9ubWVudAotU0VUIERES0JVSUxERU5WPWZyZWUKLVNFVCBDX0RFRklORVM9LURfSURXQlVJTEQKLVNFVCBOVERCR0ZJTEVTPTEKLVNFVCBOVERFQlVHPQotU0VUIE5UREVCVUdUWVBFPQotU0VUIE1TQ19PUFRJTUlaQVRJT049Ci1zZXQgTElCPSVCQVNFRElSJVxsaWJmcmVcaTM4NjslU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFcyS0RSVlxWQzY7JU1TVkNEaXIlXExJQjsuCi0KLWdvdG8gZG9uZQotCi06Y2hlY2tlZAotCi1SRU06IHNldCB1cCBhbiBOVCBjaGVja2VkIGJ1aWxkIGVudmlyb25tZW50Ci1TRVQgRERLQlVJTERFTlY9Y2hlY2tlZAotU0VUIENfREVGSU5FUz0tRF9JRFdCVUlMRCAtRFJEUkRCRyAtRFNSVkRCRwotU0VUIE5UREJHRklMRVM9Ci1TRVQgTlRERUJVRz1udHNkCi1TRVQgTlRERUJVR1RZUEU9Ym90aAotU0VUIE1TQ19PUFRJTUlaQVRJT049L09kIC9PaQotc2V0IExJQj0lQkFTRURJUiVcbGliY2hrXGkzODY7JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcVzJLRFJWXFZDNjslTVNWQ0RpciVcTElCOy4KLQotOmRvbmUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtYzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtYzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQ3MzhmMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLWMzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMzIgYml0IG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcV0MxMDslV0MxMF9QQVRIJVxMSUIzODY7JVdDMTBfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMF9QQVRIJVxIOyVXQzEwX1BBVEglXEhcTlQ7Ci1TRVQgV0FUQ09NPSVXQzEwX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPVdDMTAKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMF9QQVRIJVxCSU5OVDslV0MxMF9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC42IFdpbjMyIGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLWQxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLWQxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjNTNhOTAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1kMTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDMyIGJpdCBtb2RlIChET1M0R1cpCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzE2XFdDMTA7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMTZcV0MxMDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMF9QQVRIJVxIOyVXQzEwX1BBVEglXEhcV0lOOwotU0VUIFdBVENPTT0lV0MxMF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzE2Lk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzEwCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuNiAxNi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtZDMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtZDMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTVjNzIxMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLWQzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMzIgYml0IG1vZGUgKERPUzRHVykKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcV0MxMDslV0MxMF9QQVRIJVxMSUIzODY7JVdDMTBfUEFUSCVcTElCMzg2XERPUzsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcRE9TOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwX1BBVEglXEg7Ci1TRVQgV0FUQ09NPSVXQzEwX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzEwCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREpfUEFUSCVcQklOOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC42IDMyLWJpdCBET1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwIChET1M0R1cpCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtbzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtbzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTc5ZGVjZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLW8xNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMTYtYml0IE9TLzIgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJccmVsZWFzZVxvczIxNlx3YzEwOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXGRlYnVnXG9zMjE2XHdjMTA7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcZWRkYXQKLVNFVCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGU7JVdDMTBfUEFUSCVcaFxvczI7JVdDMTBfUEFUSCVcaAotU0VUIFdBVENPTT0lV0MxMF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1x3YzE2Lm1rCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0xCi1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT13YzEwCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuNiAxNi1iaXQgT1MvMiBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLW8zMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLW8zMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0MDRiNDIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1vMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDMyLWJpdCBPUy8yIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMzJcd2MxMDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIzMlx3YzEwOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXGVkZGF0Ci1TRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzEwX1BBVEglXGhcb3MyOyVXQzEwX1BBVEglXGgKLVNFVCBXQVRDT009JVdDMTBfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MzMi5tawotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPTEKLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9d2MxMAotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjYgMzItYml0IE9TLzIgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXAzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXAzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3MDU3ZGUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1wMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDMyLWJpdCBPUy8yIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMzJcd2MxMDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIzMlx3YzEwOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXGVkZGF0Ci1TRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzEwX1BBVEglXGhcb3MyOyVXQzEwX1BBVEglXGgKLVNFVCBXQVRDT009JVdDMTBfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MzMi5tawotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPTEKLVNFVCBVU0VfT1MyR1VJPTEKLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPXdjMTAKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMF9QQVRIJVxCSU5OVDslV0MxMF9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC42IDMyLWJpdCBPUy8yIEdVSSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXFueC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXFueC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2Zjg2NTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1xbnguYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDMyIGJpdCBtb2RlIChRTlggNCkKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcUU5YNFxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcUU5YOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFFOWDRcV0MxMDslV0MxMF9QQVRIJVxMSUIzODY7JVdDMTBfUEFUSCVcTElCMzg2XFFOWDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMF9QQVRIJVxRSDsKLVNFVCBXQVRDT009JVdDMTBfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0xCi1TRVQgV0NfTElCQkFTRT1XQzEwCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREpfUEFUSCVcQklOOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC42IDMyLWJpdCBRTlggY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtc25wLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtc25wLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWZkZTYyNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXNucC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMzIgYml0IG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU05BUFxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU05BUFxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTBfUEFUSCVcSAotU0VUIFdBVENPTT0lV0MxMF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0xCi1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzEwCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuNiBTbmFwIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC10bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC10bnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMTJmMDQyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtdG50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuNiBpbiAzMiBiaXQgbW9kZSB3aXRoIFBoYXIgTGFwIFROVAotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcRE9TOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxET1M7JVROVF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTBfUEFUSCVcSDslV0MxMF9QQVRIJVxIXE5UOyVUTlRfUEFUSCVcSU5DTFVERQotU0VUIFdBVENPTT0lV0MxMF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0xCi1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPVdDMTAKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMF9QQVRIJVxCSU5OVDslV0MxMF9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1SRU0gSWYgeW91IHNldCB0aGUgZm9sbG93aW5nIHRvIGEgMSwgYSBUTlQgRG9zU3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4KLVJFTSBPdGhlcndpc2UgYSBUTlQgTnRTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLiBOdFN0eWxlIGFwcHMgd2lsbCAqb25seSoKLVJFTSBydW4gdW5kZXIgcmVhbCBET1Mgd2hlbiB1c2luZyBvdXIgbGlicmFyaWVzLCBzaW5jZSB3ZSByZXF1aXJlIGFjY2VzcwotUkVNIHRvIGZ1bmN0aW9ucyB0aGF0IHRoZSBXaW4zMiBBUEkgZG9lcyBub3Qgc3VwcG9ydCAoc3VjaCBhcyBkaXJlY3QgYWNjZXNzCi1SRU0gdG8gdmlkZW8gbWVtb3J5LCBjYWxsaW5nIEludCAxMGggQklPUyBmdW5jdGlvbnMgZXRjKS4gRG9zU3R5bGUgYXBwcwotUkVNIHdpbGwgaG93ZXZlciBydW4gZmluZSBpbiBib3RoIERPUyBhbmQgYSBXaW45NSBET1MgYm94IChOVCBET1MgYm94ZXMgZG9uJ3QKLVJFTSB3b3JrIHRvbyB3ZWxsKS4KLVJFTQotUkVNIElmIHlvdSBhcmUgdXNpbmcgdGhlIFJlYWxUaW1lIERPUyBleHRlbmRlciwgeW91ciBhcHBzICptdXN0KiBiZSBOdFN0eWxlLAotUkVNIGFuZCBoZW5jZSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gcnVuIHVuZGVyIFdpbjk1IG9yIFdpbk5ULCBvbmx5IERPUy4KLQotU0VUIERPU1NUWUxFPTEKLQotZWNobyBXYXRjb20gQy9DKysgMTAuNiAzMi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCAoVE5UKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtdzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtdzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZThiYTg3MS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXcxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMTYgYml0IFdpbmRvd3MgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4xNlxXQzEwOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjE2XFdDMTA7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTBfUEFUSCVcSDslV0MxMF9QQVRIJVxIXFdJTjsKLVNFVCBXQVRDT009JVdDMTBfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MxNi5NSwotU0VUIFVTRV9XSU4xNj0xCi1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9V0MxMAotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjYgMTYtYml0IFdpbmRvd3MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXczMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXczMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzOWJkZGUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC13MzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDMyIGJpdCBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTBfUEFUSCVcSDslV0MxMF9QQVRIJVxIXE5UOwotU0VUIFdBVENPTT0lV0MxMF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfV0lOMzg2PQotU0VUIFdJTjMyX0dVST0xCi1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9V0MxMAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjYgV2luMzIgR1VJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC14MTEuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC14MTEuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYzc4M2Q4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAteDExLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuNiBpbiAzMiBiaXQgbW9kZQotCi1TRVQgTElCPSVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcTlQ7LgotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9JVdDMTBfUEFUSCVcSDslV0MxMF9QQVRIJVxIXE5UOwotU0VUIFdBVENPTT0lV0MxMF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfV0lOMzg2PQotU0VUIFdJTjMyX0dVST0xCi1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9V0MxMAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjYgWDExIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFjMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFjMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTBjMjRkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhYzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuMGEgaW4gMzIgYml0IG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcV0MxMEE7JVdDMTBBX1BBVEglXExJQjM4NjslV0MxMEFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFdDMTBBOyVXQzEwQV9QQVRIJVxMSUIzODY7JVdDMTBBX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMEFfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTBBX1BBVEglXEg7JVdDMTBBX1BBVEglXEhcTlQ7Ci1TRVQgV0FUQ09NPSVXQzEwQV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfV0lOMzg2PQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgV0NfTElCQkFTRT1XQzEwQQotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwQV9QQVRIJVxCSU5OVDslV0MxMEFfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuMGEgV2luMzIgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhZDE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhZDE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjllY2I2Ny4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYWQxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDMyIGJpdCBtb2RlIChET1M0R1cpCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzE2XFdDMTBBOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzE2XFdDMTBBOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMEFfUEFUSCVcSDslV0MxMEFfUEFUSCVcSFxXSU47Ci1TRVQgV0FUQ09NPSVXQzEwQV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzE2Lk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgV0NfTElCQkFTRT1XQzEwQQotU0VUIEVEUEFUSD0lV0MxMEFfUEFUSCVcRUREQVQKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMEFfUEFUSCVcQklOTlQ7JVdDMTBBX1BBVEglXEJJTkI7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjBhIDE2LWJpdCBET1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFkMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFkMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNTJiNzlhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhZDMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuMGEgaW4gMzIgYml0IG1vZGUgKERPUzRHVykKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcV0MxMEE7JVdDMTBBX1BBVEglXExJQjM4NjslV0MxMEFfUEFUSCVcTElCMzg2XERPUzsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxXQzEwQTslV0MxMEFfUEFUSCVcTElCMzg2OyVXQzEwQV9QQVRIJVxMSUIzODZcRE9TOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMEFfUEFUSCVcSDsKLVNFVCBXQVRDT009JVdDMTBBX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgV0NfTElCQkFTRT1XQzEwQQotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwQV9QQVRIJVxCSU5OVDslV0MxMEFfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuMGEgMzItYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKERPUzRHVykKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhbzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhbzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmE3MzUxZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYW8xNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDE2LWJpdCBPUy8yIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMTZcd2MxMDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIxNlx3YzEwOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxlZGRhdAotU0VUIElOQ0xVREU9aW5jbHVkZTslU0NJVEVDSCVcaW5jbHVkZTslUFJJVkFURSVcaW5jbHVkZTslV0MxMEFfUEFUSCVcaFxvczI7JVdDMTBBX1BBVEglXGgKLVNFVCBXQVRDT009JVdDMTBBX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXG1ha2VkZWZzXHdjMTYubWsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PTEKLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBXQ19MSUJCQVNFPXdjMTAKLVNFVCBFRFBBVEg9JVdDMTBBX1BBVEglXEVEREFUCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBBX1BBVEglXEJJTk5UOyVXQzEwQV9QQVRIJVxCSU5COyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC4wYSAxNi1iaXQgT1MvMiBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYW8zMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYW8zMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzY2FhNTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFvMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC4wYSBpbiAzMi1iaXQgT1MvMiBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxyZWxlYXNlXG9zMjMyXHdjMTA7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJcZGVidWdcb3MyMzJcd2MxMDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMEFBX1BBVEglXGVkZGF0Ci1TRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzEwQUFfUEFUSCVcaFxvczI7JVdDMTBBQV9QQVRIJVxoCi1TRVQgV0FUQ09NPSVXQzEwQUFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MzMi5tawotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPTEKLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFdDX0xJQkJBU0U9V0MxMEEKLVNFVCBFRFBBVEg9JVdDMTBBQV9QQVRIJVxFRERBVAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwQUFfUEFUSCVcQklOTlQ7JVdDMTBBQTZfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuMGEgMzItYml0IE9TLzIgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXAzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXAzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkMjFjNjIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFwMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC4wYSBpbiAzMi1iaXQgT1MvMiBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxyZWxlYXNlXG9zMjMyXHdjMTA7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJcZGVidWdcb3MyMzJcd2MxMDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxlZGRhdAotU0VUIElOQ0xVREU9aW5jbHVkZTslU0NJVEVDSCVcaW5jbHVkZTslUFJJVkFURSVcaW5jbHVkZTslV0MxMF9QQVRIJVxoXG9zMjslV0MxMF9QQVRIJVxoCi1TRVQgV0FUQ09NPSVXQzEwX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXG1ha2VkZWZzXHdjMzIubWsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0xCi1TRVQgVVNFX09TMkdVST0xCi1TRVQgVVNFX1NOQVA9Ci1TRVQgV0NfTElCQkFTRT1XQzEwQQotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTkI7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjBhIDMyLWJpdCBPUy8yIEdVSSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXNucC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXNucC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4Zjg1N2MuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFzbnAuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC4wYSBpbiAzMiBiaXQgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTkFQXFdDMTBBOyVXQzEwQV9QQVRIJVxMSUIzODY7JVdDMTBBX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTkFQXFdDMTBBOyVXQzEwQV9QQVRIJVxMSUIzODY7JVdDMTBBX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMEFfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREUKLVNFVCBXQVRDT009JVdDMTBBX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0xCi1TRVQgV0NfTElCQkFTRT1XQzEwQQotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwQV9QQVRIJVxCSU5OVDslV0MxMEFfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuMGEgU25hcCBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhdG50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhdG50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTJiMzIxOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXRudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDMyIGJpdCBtb2RlIHdpdGggUGhhciBMYXAgVE5UCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFdDMTBBOyVXQzEwQV9QQVRIJVxMSUIzODY7JVdDMTBBX1BBVEglXExJQjM4NlxET1M7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcV0MxMEE7JVdDMTBBX1BBVEglXExJQjM4NjslV0MxMEFfUEFUSCVcTElCMzg2XERPUzslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMEFfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTBBX1BBVEglXEg7JVdDMTBBX1BBVEglXEhcTlQ7JVROVF9QQVRIJVxJTkNMVURFCi1TRVQgV0FUQ09NPSVXQzEwQV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0xCi1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBXQ19MSUJCQVNFPVdDMTBBCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBBX1BBVEglXEJJTk5UOyVXQzEwQV9QQVRIJVxCSU5COyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1SRU0gSWYgeW91IHNldCB0aGUgZm9sbG93aW5nIHRvIGEgMSwgYSBUTlQgRG9zU3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4KLVJFTSBPdGhlcndpc2UgYSBUTlQgTnRTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLiBOdFN0eWxlIGFwcHMgd2lsbCAqb25seSoKLVJFTSBydW4gdW5kZXIgcmVhbCBET1Mgd2hlbiB1c2luZyBvdXIgbGlicmFyaWVzLCBzaW5jZSB3ZSByZXF1aXJlIGFjY2VzcwotUkVNIHRvIGZ1bmN0aW9ucyB0aGF0IHRoZSBXaW4zMiBBUEkgZG9lcyBub3Qgc3VwcG9ydCAoc3VjaCBhcyBkaXJlY3QgYWNjZXNzCi1SRU0gdG8gdmlkZW8gbWVtb3J5LCBjYWxsaW5nIEludCAxMGggQklPUyBmdW5jdGlvbnMgZXRjKS4gRG9zU3R5bGUgYXBwcwotUkVNIHdpbGwgaG93ZXZlciBydW4gZmluZSBpbiBib3RoIERPUyBhbmQgYSBXaW45NSBET1MgYm94IChOVCBET1MgYm94ZXMgZG9uJ3QKLVJFTSB3b3JrIHRvbyB3ZWxsKS4KLVJFTQotUkVNIElmIHlvdSBhcmUgdXNpbmcgdGhlIFJlYWxUaW1lIERPUyBleHRlbmRlciwgeW91ciBhcHBzICptdXN0KiBiZSBOdFN0eWxlLAotUkVNIGFuZCBoZW5jZSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gcnVuIHVuZGVyIFdpbjk1IG9yIFdpbk5ULCBvbmx5IERPUy4KLQotU0VUIERPU1NUWUxFPTEKLQotZWNobyBXYXRjb20gQy9DKysgMTAuMGEgMzItYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKFROVCkuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXcxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXcxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0MDExY2MuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGF3MTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC4wYSBpbiAxNiBiaXQgV2luZG93cyBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjE2XFdDMTBBOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjE2XFdDMTBBOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMEFfUEFUSCVcSDslV0MxMEFfUEFUSCVcSFxXSU47Ci1TRVQgV0FUQ09NPSVXQzEwQV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzE2Lk1LCi1TRVQgVVNFX1dJTjE2PTEKLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgV0NfTElCQkFTRT1XQzEwQQotU0VUIEVEUEFUSD0lV0MxMEFfUEFUSCVcRUREQVQKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMEFfUEFUSCVcQklOTlQ7JVdDMTBBX1BBVEglXEJJTkI7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjBhIDE2LWJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGF3MzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGF3MzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZTE0ZGJjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhdzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuMGEgaW4gMzIgYml0IG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcV0MxMEE7JVdDMTBBX1BBVEglXExJQjM4NjslV0MxMEFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFdDMTBBOyVXQzEwQV9QQVRIJVxMSUIzODY7JVdDMTBBX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMEFfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTBBX1BBVEglXEg7JVdDMTBBX1BBVEglXEhcTlQ7Ci1TRVQgV0FUQ09NPSVXQzEwQV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfV0lOMzg2PQotU0VUIFdJTjMyX0dVST0xCi1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFdDX0xJQkJBU0U9V0MxMEEKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMEFfUEFUSCVcQklOTlQ7JVdDMTBBX1BBVEglXEJJTkI7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjBhIFdpbjMyIEdVSSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtYzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtYzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTc1MzEyOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLWMzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMzIgYml0IG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotU0VUIENfSU5DTFVERT0lV0MxMV9QQVRIJVxIOyVXQzExX1BBVEglXEhcTlQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUNfSU5DTFVERSUKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9V0MxMQotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLVJFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQotaWYgTk9UIC4lMSU9PS5zZGsgZ290byBkb25lCi1jYWxsIHdpbjMyc2RrLmJhdAotCi06ZG9uZQotZWNobyBXYXRjb20gQy9DKysgMTEuMCBXaW4zMiBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtZDE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtZDE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDMzOGFkYS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLWQxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTRVR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMTYgYml0IG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMTZcV0MxMTsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MxNlxXQzExOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzExX1BBVEglXEg7JVdDMTFfUEFUSCVcSFxXSU47Ci1TRVQgV0FUQ09NPSVXQzExX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMTYuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPVdDMTEKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMV9QQVRIJVxCSU5OVDslV0MxMV9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMS4wIDE2LWJpdCBET1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1kMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1kMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNWE1NGQ0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtZDMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTEuMCBpbiAzMiBiaXQgbW9kZSAoRE9TNEdXKQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcRE9TOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxET1M7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTFfUEFUSCVcSDsKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPVdDMTEKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMV9QQVRIJVxCSU5OVDslV0MxMV9QQVRIJVxCSU5XOyVESl9QQVRIJVxCSU47JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDExLjAgMzItYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKERPUzRHVykuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLW8xNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLW8xNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0Njc1NGEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1vMTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDE2LWJpdCBPUy8yIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMTZcd2MxMTsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIxNlx3YzExOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXGVkZGF0Ci1TRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzExX1BBVEglXGhcb3MyOyVXQzExX1BBVEglXGgKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MxNi5tawotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9MQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9d2MxMQotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDExLjAgMTYtYml0IE9TLzIgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1vMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1vMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzN2Y1ZGM3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtbzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTEuMCBpbiAzMi1iaXQgT1MvMiBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxyZWxlYXNlXG9zMjMyXHdjMTE7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJcZGVidWdcb3MyMzJcd2MxMTsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxlZGRhdAotU0VUIElOQ0xVREU9aW5jbHVkZTslU0NJVEVDSCVcaW5jbHVkZTslUFJJVkFURSVcaW5jbHVkZTslV0MxMV9QQVRIJVxoXG9zMjslV0MxMV9QQVRIJVxoCi1TRVQgV0FUQ09NPSVXQzExX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXG1ha2VkZWZzXHdjMzIubWsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0xCi1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPXdjMTEKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMV9QQVRIJVxCSU5OVDslV0MxMV9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMS4wIDMyLWJpdCBPUy8yIGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1wMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1wMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDhjYmJkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtcDMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTEuMCBpbiAzMi1iaXQgT1MvMiBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxyZWxlYXNlXG9zMjMyXHdjMTE7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJcZGVidWdcb3MyMzJcd2MxMTsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxlZGRhdAotU0VUIElOQ0xVREU9aW5jbHVkZTslU0NJVEVDSCVcaW5jbHVkZTslUFJJVkFURSVcaW5jbHVkZTslV0MxMV9QQVRIJVxoXG9zMjslV0MxMV9QQVRIJVxoCi1TRVQgV0FUQ09NPSVXQzExX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXG1ha2VkZWZzXHdjMzIubWsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0xCi1TRVQgVVNFX09TMkdVST0xCi1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT13YzExCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXEVEREFUCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTEuMCAzMi1iaXQgT1MvMiBHVUkgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1xbnguYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1xbnguYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZmQ2MGZlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtcW54LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTEuMCBpbiAzMiBiaXQgbW9kZSAoUU5YIDQpCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFFOWDRcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XFFOWDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xRTlg0XFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxRTlg7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTFfUEFUSCVcUUg7Ci1TRVQgV0FUQ09NPSVXQzExX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9MQotU0VUIFdDX0xJQkJBU0U9V0MxMQotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURKX1BBVEglXEJJTjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTEuMCAzMi1iaXQgUU5YIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cAotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXNucC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXNucC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkMmFjNTcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1zbnAuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDMyIGJpdCBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFNOQVBcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFNOQVBcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzExX1BBVEglXEgKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9MQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9V0MxMQotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDExLjAgU25hcCBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXRudC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXRudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0ZGJmMjQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS10bnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDMyIGJpdCBtb2RlIHdpdGggUGhhciBMYXAgVE5UCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxET1M7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XERPUzslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMV9QQVRIJVxIOyVXQzExX1BBVEglXEhcTlQ7JVROVF9QQVRIJVxJTkNMVURFCi1TRVQgV0FUQ09NPSVXQzExX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPTEKLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9V0MxMQotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLVJFTSBJZiB5b3Ugc2V0IHRoZSBmb2xsb3dpbmcgdG8gYSAxLCBhIFROVCBEb3NTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLgotUkVNIE90aGVyd2lzZSBhIFROVCBOdFN0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuIE50U3R5bGUgYXBwcyB3aWxsICpvbmx5KgotUkVNIHJ1biB1bmRlciByZWFsIERPUyB3aGVuIHVzaW5nIG91ciBsaWJyYXJpZXMsIHNpbmNlIHdlIHJlcXVpcmUgYWNjZXNzCi1SRU0gdG8gZnVuY3Rpb25zIHRoYXQgdGhlIFdpbjMyIEFQSSBkb2VzIG5vdCBzdXBwb3J0IChzdWNoIGFzIGRpcmVjdCBhY2Nlc3MKLVJFTSB0byB2aWRlbyBtZW1vcnksIGNhbGxpbmcgSW50IDEwaCBCSU9TIGZ1bmN0aW9ucyBldGMpLiBEb3NTdHlsZSBhcHBzCi1SRU0gd2lsbCBob3dldmVyIHJ1biBmaW5lIGluIGJvdGggRE9TIGFuZCBhIFdpbjk1IERPUyBib3ggKE5UIERPUyBib3hlcyBkb24ndAotUkVNIHdvcmsgdG9vIHdlbGwpLgotUkVNCi1SRU0gSWYgeW91IGFyZSB1c2luZyB0aGUgUmVhbFRpbWUgRE9TIGV4dGVuZGVyLCB5b3VyIGFwcHMgKm11c3QqIGJlIE50U3R5bGUsCi1SRU0gYW5kIGhlbmNlIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBydW4gdW5kZXIgV2luOTUgb3IgV2luTlQsIG9ubHkgRE9TLgotCi1TRVQgRE9TU1RZTEU9MQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMS4wIDMyLWJpdCBET1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwIChUTlQpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS13MTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS13MTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNjVjNzBlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtdzE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTEuMCBpbiAxNiBiaXQgV2luZG93cyBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjE2XFdDMTE7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcV0MxMTsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMV9QQVRIJVxIOyVXQzExX1BBVEglXEhcV0lOOwotU0VUIFdBVENPTT0lV0MxMV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzE2Lk1LCi1TRVQgVVNFX1dJTjE2PTEKLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzExCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXEVEREFUCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTEuMCAxNi1iaXQgV2luZG93cyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXczMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXczMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2NGNkYmQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS13MzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDMyIGJpdCBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKLVNFVCBDX0lOQ0xVREU9JVdDMTFfUEFUSCVcSDslV0MxMV9QQVRIJVxIXE5UCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1TRVQgV0FUQ09NPSVXQzExX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzExCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCi1pZiBOT1QgLiUxJT09LnNkayBnb3RvIGRvbmUKLWNhbGwgd2luMzJzZGsuYmF0Ci0KLTpkb25lCi1lY2hvIFdhdGNvbSBDL0MrKyAxMS4wIFdpbjMyIEdVSSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXgxMS5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXgxMS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyNTY5YTMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS14MTEuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDMyIGJpdCBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTFfUEFUSCVcSDslV0MxMV9QQVRIJVxIXE5UOwotU0VUIFdBVENPTT0lV0MxMV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfV0lOMzg2PQotU0VUIFdJTjMyX0dVST0xCi1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9V0MxMQotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDExLjAgV2luMzIgR1VJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3dpbjMyc2RrLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3dpbjMyc2RrLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2M3ZjAxNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93aW4zMnNkay5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1AZWNobyBvZmYKLVJFTTogU2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTWljcm9zb2Z0IFBsYXRmb3JtIFNESyBkZXZlbG9wbWVudAotUkVNOiBOb3RlIHRoYXQgd2UgaGF2ZSBoYXJkIGNvZGVkIHRoaXMgZm9yIFdpbmRvd3MgTlQgaTM4NiBkZXZlbG9wbWVudC4KLQotU0VUIE1TVE9PTFM9JU1TU0RLJQotU0VUIERYU0RLUk9PVD0lTVNUT09MUyUKLVNFVCBJTkVUU0RLPSVNU1RPT0xTJQotU0VUIEJLT0ZGSUNFPSVNU1RPT0xTJQotU0VUIEJBU0VNQUtFPSVCS09GRklDRSVcSU5DTFVERVxCS09mZmljZS5NYWsKLVNFVCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslTVNUT09MUyVcSU5DTFVERTslQ19JTkNMVURFJQotaWYgLiUxJT09LmJvcmxhbmQgZ290byBib3JsYW5kCi1TRVQgTElCPSVNU1RPT0xTJVxMSUI7JUxJQiUKLWdvdG8gbm90Ym9ybGFuZAotOmJvcmxhbmQKLVNFVCBMSUI9JU1TVE9PTFMlXExJQlxCT1JMQU5EOyVMSUIlCi06bm90Ym9ybGFuZAotU0VUIFBBVEg9JU1TVE9PTFMlXEJpblw7JU1TVE9PTFMlXEJpblxXaW5OVDslUEFUSCUKLVNFVCBDUFU9aTM4NgotCi1lY2hvIE1pY3Jvc29mdCBQbGF0Zm9ybSBTREsgc3VwcG9ydCBlbmJhYmxlZC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9iaW9zZW11LmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvYmlvc2VtdS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmMzM2E3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9iaW9zZW11LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICBCSU9TIGVtdWxhdG9yIGFuZCBpbnRlcmZhY2UKLSogICAgICAgICAgICAgICAgICAgICAgdG8gUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciB0aGUgcmVhbCBtb2RlIHg4NiBCSU9TIGVtdWxhdG9yLCB3aGljaCBpcwotKiAgICAgICAgICAgICAgIHVzZWQgdG8gd2FybWJvb3QgYW55IG51bWJlciBvZiBWR0EgY29tcGF0aWJsZSBQQ0kvQUdQCi0qICAgICAgICAgICAgICAgY29udHJvbGxlcnMgdW5kZXIgYW55IE9TLCBvbiBhbnkgcHJvY2Vzc29yIGZhbWlseSB0aGF0Ci0qICAgICAgICAgICAgICAgc3VwcG9ydHMgUENJLiBXZSBhbHNvIGFsbG93IHRoZSB1c2VyIGFwcGxpY2F0aW9uIHRvIGNhbGwKLSogICAgICAgICAgICAgICByZWFsIG1vZGUgQklPUyBmdW5jdGlvbnMgYW5kIEludCAxMGggZnVuY3Rpb25zIChpbmNsdWRpbmcKLSogICAgICAgICAgICAgICB0aGUgVkVTQSBCSU9TKS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19CSU9TRU1VX0gKLSNkZWZpbmUgX19CSU9TRU1VX0gKLQotI2luY2x1ZGUgIng4NmVtdS5oIgotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAicGNpbGliLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgcGFjaygxKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURhdGEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGRldGFpbHMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIFZHQQotY29udHJvbGxlci4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGFsbG93IHRoZSBWR0EgY29udHJvbGxlciB0byBiZQotc3dhcHBlZCBvbiB0aGUgZmx5IHdpdGhpbiB0aGUgQklPUyBlbXVsYXRvci4KLQotSEVBREVSOgotYmlvc2VtdS5oCi0KLU1FTUJFUlM6Ci1wY2lJbmZvICAgICAgICAgLSBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIGJsb2NrIGZvciB0aGUgY29udHJvbGxlcgotQklPU0ltYWdlICAgICAgIC0gUG9pbnRlciB0byBhIHJlYWQvd3JpdGUgY29weSBvZiB0aGUgQklPUyBpbWFnZQotQklPU0ltYWdlTGVuICAgIC0gTGVuZ3RoIG9mIHRoZSBCSU9TIGltYWdlCi1Mb3dNZW0gICAgICAgICAgLSBDb3B5IG9mIGtleSBsb3cgbWVtb3J5IGFyZWFzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFBDSURldmljZUluZm8gICAqcGNpSW5mbzsKLSAgICB2b2lkICAgICAgICAgICAgKkJJT1NJbWFnZTsKLSAgICB1bG9uZyAgICAgICAgICAgQklPU0ltYWdlTGVuOwotICAgIHVjaGFyICAgICAgICAgICBMb3dNZW1bMTUzNl07Ci0gICAgfSBCRV9WR0FJbmZvOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURhdGEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGRldGFpbHMgZm9yIHRoZSBCSU9TIGVtdWxhdG9yIHN5c3RlbQotZW52aXJvbm1lbnQgYXMgdXNlZCBieSB0aGUgWDg2IGVtdWxhdG9yIGxpYnJhcnkuCi0KLUhFQURFUjoKLWJpb3NlbXUuaAotCi1NRU1CRVJTOgotdmdhSW5mbyAgICAgICAgIC0gVkdBIEJJT1MgaW5mb3JtYXRpb24gc3RydWN0dXJlCi1iaW9zbWVtX2Jhc2UgICAgLSBCYXNlIG9mIHRoZSBCSU9TIGltYWdlCi1iaW9zbWVtX2xpbWl0ICAgLSBMaW1pdCBvZiB0aGUgQklPUyBpbWFnZQotYnVzbWVtX2Jhc2UgICAgIC0gQmFzZSBvZiB0aGUgVkdBIGJ1cyBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQkVfVkdBSW5mbyAgICAgIHZnYUluZm87Ci0gICAgdWxvbmcgICAgICAgICAgIGJpb3NtZW1fYmFzZTsKLSAgICB1bG9uZyAgICAgICAgICAgYmlvc21lbV9saW1pdDsKLSAgICB1bG9uZyAgICAgICAgICAgYnVzbWVtX2Jhc2U7Ci0gICAgfSBCRV9zeXNFbnY7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RydWN0dXJlIGRlZmluaW5nIGFsbCB0aGUgQklPUyBFbXVsYXRvciBBUEkgZnVuY3Rpb25zIGFzIGV4cG9ydGVkIGZyb20KLXRoZSBCaW5hcnkgUG9ydGFibGUgRExMLgote3NlY3JldH0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWxvbmcgICBkd1NpemU7Ci0gICAgaWJvb2wgICAoUE1BUElQIEJFX2luaXQpKHUzMiBkZWJ1Z0ZsYWdzLGludCBtZW1TaXplLEJFX1ZHQUluZm8gKmluZm8pOwotICAgIHZvaWQgICAgKFBNQVBJUCBCRV9zZXRWR0EpKEJFX1ZHQUluZm8gKmluZm8pOwotICAgIHZvaWQgICAgKFBNQVBJUCBCRV9nZXRWR0EpKEJFX1ZHQUluZm8gKmluZm8pOwotICAgIHZvaWQgKiAgKFBNQVBJUCBCRV9tYXBSZWFsUG9pbnRlcikodWludCByX3NlZyx1aW50IHJfb2ZmKTsKLSAgICB2b2lkICogIChQTUFQSVAgQkVfZ2V0VkVTQUJ1ZikodWludCAqbGVuLHVpbnQgKnJzZWcsdWludCAqcm9mZik7Ci0gICAgdm9pZCAgICAoUE1BUElQIEJFX2NhbGxSZWFsTW9kZSkodWludCBzZWcsdWludCBvZmYsUk1SRUdTICpyZWdzLFJNU1JFR1MgKnNyZWdzKTsKLSAgICBpbnQgICAgIChQTUFQSVAgQkVfaW50ODYpKGludCBpbnRubyxSTVJFR1MgKmluLFJNUkVHUyAqb3V0KTsKLSAgICBpbnQgICAgIChQTUFQSVAgQkVfaW50ODZ4KShpbnQgaW50bm8sUk1SRUdTICppbixSTVJFR1MgKm91dCxSTVNSRUdTICpzcmVncyk7Ci0gICAgdm9pZCAqICByZXNlcnZlZDE7Ci0gICAgdm9pZCAgICAoUE1BUElQIEJFX2V4aXQpKHZvaWQpOwotICAgIH0gQkVfZXhwb3J0czsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiBwb2ludGVyIHR5cGUgZm9yIHRoZSBCaW5hcnkgUG9ydGFibGUgRExMIGluaXRpYWxpc2F0aW9uIGVudHJ5IHBvaW50Lgote3NlY3JldH0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIEJFX2V4cG9ydHMgKiAoUE1BUElQIEJFX2luaXRMaWJyYXJ5X3QpKFBNX2ltcG9ydHMgKlBNSW1wKTsKLQotI3ByYWdtYSBwYWNrKCkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KLSNlbmRpZgotCi0vKiB7c2VjcmV0fSBHbG9iYWwgQklPUyBlbXVsYXRvciBzeXN0ZW0gZW52aXJvbm1lbnQgKi8KLWV4dGVybiBCRV9zeXNFbnYgX0JFX2VudjsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogQklPUyBlbXVsYXRvciBsaWJyYXJ5IGVudHJ5IHBvaW50cyAqLwotCi1pYm9vbCAgIFBNQVBJIEJFX2luaXQodTMyIGRlYnVnRmxhZ3MsaW50IG1lbVNpemUsQkVfVkdBSW5mbyAqaW5mbyk7Ci12b2lkICAgIFBNQVBJIEJFX3NldFZHQShCRV9WR0FJbmZvICppbmZvKTsKLXZvaWQgICAgUE1BUEkgQkVfZ2V0VkdBKEJFX1ZHQUluZm8gKmluZm8pOwotdm9pZCAgICBQTUFQSSBCRV9zZXREZWJ1Z0ZsYWdzKHUzMiBkZWJ1Z0ZsYWdzKTsKLXZvaWQgKiAgUE1BUEkgQkVfbWFwUmVhbFBvaW50ZXIodWludCByX3NlZyx1aW50IHJfb2ZmKTsKLXZvaWQgKiAgUE1BUEkgQkVfZ2V0VkVTQUJ1Zih1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKTsKLXZvaWQgICAgUE1BUEkgQkVfY2FsbFJlYWxNb2RlKHVpbnQgc2VnLHVpbnQgb2ZmLFJNUkVHUyAqcmVncyxSTVNSRUdTICpzcmVncyk7Ci1pbnQgICAgIFBNQVBJIEJFX2ludDg2KGludCBpbnRubyxSTVJFR1MgKmluLFJNUkVHUyAqb3V0KTsKLWludCAgICAgUE1BUEkgQkVfaW50ODZ4KGludCBpbnRubyxSTVJFR1MgKmluLFJNUkVHUyAqb3V0LFJNU1JFR1MgKnNyZWdzKTsKLXZvaWQgICAgUE1BUEkgQkVfZXhpdCh2b2lkKTsKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAgICAgKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogX19CSU9TRU1VX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9ldmVudC5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL2V2ZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZWFjODcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL2V2ZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtIGV2ZW50IGxpYnJhcnkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19FVkVOVF9ICi0jZGVmaW5lIF9fRVZFTlRfSAotCi0jaW5jbHVkZSAic2NpdGVjaC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIHBhY2soMSkKLQotLyogJ0MnIGNhbGxpbmcgY29udmVudGlvbnMgYWx3YXlzICovCi0KLSNkZWZpbmUgRVZUQVBJICBfQVNNQVBJCi0jZGVmaW5lIEVWVEFQSVAgX0FTTUFQSVAKLQotLyogRXZlbnQgbWVzc2FnZSBtYXNrcyBmb3Iga2V5RG93biBldmVudHMgKi8KLQotI2RlZmluZSBFVlRfQVNDSUlNQVNLICAgMHgwMEZGICAgICAgLyogQVNDSUkgY29kZSBvZiBrZXkgcHJlc3NlZCAgICAgICAgKi8KLSNkZWZpbmUgRVZUX1NDQU5NQVNLICAgIDB4RkYwMCAgICAgIC8qIFNjYW4gY29kZSBvZiBrZXkgcHJlc3NlZCAgICAgICAgICovCi0jZGVmaW5lIEVWVF9DT1VOVE1BU0sgICAweDdGRkYwMDAwTCAvKiBDb3VudCBmb3IgS0VZUkVQRUFUJ3MgICAgICAgICAgICAqLwotCi0vKiBNYWNyb3MgdG8gZXh0cmFjdCB2YWx1ZXMgZnJvbSB0aGUgbWVzc2FnZSBmaWVsZHMgKi8KLQotI2RlZmluZSBFVlRfYXNjaWlDb2RlKG0pICAgICggKHVjaGFyKSAobSAmIEVWVF9BU0NJSU1BU0spICkKLSNkZWZpbmUgRVZUX3NjYW5Db2RlKG0pICAgICAoICh1Y2hhcikgKCAobSAmIEVWVF9TQ0FOTUFTSykgPj4gOCApICkKLSNkZWZpbmUgRVZUX3JlcGVhdENvdW50KG0pICAoIChzaG9ydCkgKCAobSAmIEVWVF9DT1VOVE1BU0spID4+IDE2ICkgKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZXMgdGhlIHNldCBvZiBBU0NJSSBjb2RlcyByZXBvcnRlZCBieSB0aGUgZXZlbnQgbGlicmFyeSBmdW5jdGlvbnMKLWluIHRoZSBtZXNzYWdlIGZpZWxkLiBVc2UgdGhlIEVWVF9hc2NpaUNvZGUgbWFjcm8gdG8gZXh0cmFjdCB0aGUgY29kZQotZnJvbSB0aGUgZXZlbnQgc3RydWN0dXJlLgotCi1IRUFERVI6Ci1ldmVudC5oCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBBU0NJSV9jdHJsQSAgICAgICAgICAgICA9IDB4MDEsCi0gICAgQVNDSUlfY3RybEIgICAgICAgICAgICAgPSAweDAyLAotICAgIEFTQ0lJX2N0cmxDICAgICAgICAgICAgID0gMHgwMywKLSAgICBBU0NJSV9jdHJsRCAgICAgICAgICAgICA9IDB4MDQsCi0gICAgQVNDSUlfY3RybEUgICAgICAgICAgICAgPSAweDA1LAotICAgIEFTQ0lJX2N0cmxGICAgICAgICAgICAgID0gMHgwNiwKLSAgICBBU0NJSV9jdHJsRyAgICAgICAgICAgICA9IDB4MDcsCi0gICAgQVNDSUlfYmFja3NwYWNlICAgICAgICAgPSAweDA4LAotICAgIEFTQ0lJX2N0cmxIICAgICAgICAgICAgID0gMHgwOCwKLSAgICBBU0NJSV90YWIgICAgICAgICAgICAgICA9IDB4MDksCi0gICAgQVNDSUlfY3RybEkgICAgICAgICAgICAgPSAweDA5LAotICAgIEFTQ0lJX2N0cmxKICAgICAgICAgICAgID0gMHgwQSwKLSAgICBBU0NJSV9jdHJsSyAgICAgICAgICAgICA9IDB4MEIsCi0gICAgQVNDSUlfY3RybEwgICAgICAgICAgICAgPSAweDBDLAotICAgIEFTQ0lJX2VudGVyICAgICAgICAgICAgID0gMHgwRCwKLSAgICBBU0NJSV9jdHJsTSAgICAgICAgICAgICA9IDB4MEQsCi0gICAgQVNDSUlfY3RybE4gICAgICAgICAgICAgPSAweDBFLAotICAgIEFTQ0lJX2N0cmxPICAgICAgICAgICAgID0gMHgwRiwKLSAgICBBU0NJSV9jdHJsUCAgICAgICAgICAgICA9IDB4MTAsCi0gICAgQVNDSUlfY3RybFEgICAgICAgICAgICAgPSAweDExLAotICAgIEFTQ0lJX2N0cmxSICAgICAgICAgICAgID0gMHgxMiwKLSAgICBBU0NJSV9jdHJsUyAgICAgICAgICAgICA9IDB4MTMsCi0gICAgQVNDSUlfY3RybFQgICAgICAgICAgICAgPSAweDE0LAotICAgIEFTQ0lJX2N0cmxVICAgICAgICAgICAgID0gMHgxNSwKLSAgICBBU0NJSV9jdHJsViAgICAgICAgICAgICA9IDB4MTYsCi0gICAgQVNDSUlfY3RybFcgICAgICAgICAgICAgPSAweDE3LAotICAgIEFTQ0lJX2N0cmxYICAgICAgICAgICAgID0gMHgxOCwKLSAgICBBU0NJSV9jdHJsWSAgICAgICAgICAgICA9IDB4MTksCi0gICAgQVNDSUlfY3RybFogICAgICAgICAgICAgPSAweDFBLAotICAgIEFTQ0lJX2VzYyAgICAgICAgICAgICAgID0gMHgxQiwKLSAgICBBU0NJSV9zcGFjZSAgICAgICAgICAgICA9IDB4MjAsCi0gICAgQVNDSUlfZXhjbGFtYXRpb24gICAgICAgPSAweDIxLCAvKiAhICovCi0gICAgQVNDSUlfcXVvdGUgICAgICAgICAgICAgPSAweDIyLCAvKiAiICovCi0gICAgQVNDSUlfcG91bmQgICAgICAgICAgICAgPSAweDIzLCAvKiAjICovCi0gICAgQVNDSUlfZG9sbGFyICAgICAgICAgICAgPSAweDI0LCAvKiAkICovCi0gICAgQVNDSUlfcGVyY2VudCAgICAgICAgICAgPSAweDI1LCAvKiAlICovCi0gICAgQVNDSUlfYW1wZXJzYW5kICAgICAgICAgPSAweDI2LCAvKiAmICovCi0gICAgQVNDSUlfYXBvc3Ryb3BoZSAgICAgICAgPSAweDI3LCAvKiAnICovCi0gICAgQVNDSUlfbGVmdEJyYWNlICAgICAgICAgPSAweDI4LCAvKiAoICovCi0gICAgQVNDSUlfcmlnaHRCcmFjZSAgICAgICAgPSAweDI5LCAvKiApICovCi0gICAgQVNDSUlfdGltZXMgICAgICAgICAgICAgPSAweDJBLCAvKiAqICovCi0gICAgQVNDSUlfcGx1cyAgICAgICAgICAgICAgPSAweDJCLCAvKiArICovCi0gICAgQVNDSUlfY29tbWEgICAgICAgICAgICAgPSAweDJDLCAvKiAsICovCi0gICAgQVNDSUlfbWludXMgICAgICAgICAgICAgPSAweDJELCAvKiAtICovCi0gICAgQVNDSUlfcGVyaW9kICAgICAgICAgICAgPSAweDJFLCAvKiAuICovCi0gICAgQVNDSUlfZGl2aWRlICAgICAgICAgICAgPSAweDJGLCAvKiAvICovCi0gICAgQVNDSUlfMCAgICAgICAgICAgICAgICAgPSAweDMwLAotICAgIEFTQ0lJXzEgICAgICAgICAgICAgICAgID0gMHgzMSwKLSAgICBBU0NJSV8yICAgICAgICAgICAgICAgICA9IDB4MzIsCi0gICAgQVNDSUlfMyAgICAgICAgICAgICAgICAgPSAweDMzLAotICAgIEFTQ0lJXzQgICAgICAgICAgICAgICAgID0gMHgzNCwKLSAgICBBU0NJSV81ICAgICAgICAgICAgICAgICA9IDB4MzUsCi0gICAgQVNDSUlfNiAgICAgICAgICAgICAgICAgPSAweDM2LAotICAgIEFTQ0lJXzcgICAgICAgICAgICAgICAgID0gMHgzNywKLSAgICBBU0NJSV84ICAgICAgICAgICAgICAgICA9IDB4MzgsCi0gICAgQVNDSUlfOSAgICAgICAgICAgICAgICAgPSAweDM5LAotICAgIEFTQ0lJX2NvbG9uICAgICAgICAgICAgID0gMHgzQSwgLyogOiAqLwotICAgIEFTQ0lJX3NlbWljb2xvbiAgICAgICAgID0gMHgzQiwgLyogOyAqLwotICAgIEFTQ0lJX2xlc3NUaGFuICAgICAgICAgID0gMHgzQywgLyogPCAqLwotICAgIEFTQ0lJX2VxdWFscyAgICAgICAgICAgID0gMHgzRCwgLyogPSAqLwotICAgIEFTQ0lJX2dyZWF0ZXJUaGFuICAgICAgID0gMHgzRSwgLyogPiAqLwotICAgIEFTQ0lJX3F1ZXN0aW9uICAgICAgICAgID0gMHgzRiwgLyogPyAqLwotICAgIEFTQ0lJX2F0ICAgICAgICAgICAgICAgID0gMHg0MCwgLyogQCAqLwotICAgIEFTQ0lJX0EgICAgICAgICAgICAgICAgID0gMHg0MSwKLSAgICBBU0NJSV9CICAgICAgICAgICAgICAgICA9IDB4NDIsCi0gICAgQVNDSUlfQyAgICAgICAgICAgICAgICAgPSAweDQzLAotICAgIEFTQ0lJX0QgICAgICAgICAgICAgICAgID0gMHg0NCwKLSAgICBBU0NJSV9FICAgICAgICAgICAgICAgICA9IDB4NDUsCi0gICAgQVNDSUlfRiAgICAgICAgICAgICAgICAgPSAweDQ2LAotICAgIEFTQ0lJX0cgICAgICAgICAgICAgICAgID0gMHg0NywKLSAgICBBU0NJSV9IICAgICAgICAgICAgICAgICA9IDB4NDgsCi0gICAgQVNDSUlfSSAgICAgICAgICAgICAgICAgPSAweDQ5LAotICAgIEFTQ0lJX0ogICAgICAgICAgICAgICAgID0gMHg0QSwKLSAgICBBU0NJSV9LICAgICAgICAgICAgICAgICA9IDB4NEIsCi0gICAgQVNDSUlfTCAgICAgICAgICAgICAgICAgPSAweDRDLAotICAgIEFTQ0lJX00gICAgICAgICAgICAgICAgID0gMHg0RCwKLSAgICBBU0NJSV9OICAgICAgICAgICAgICAgICA9IDB4NEUsCi0gICAgQVNDSUlfTyAgICAgICAgICAgICAgICAgPSAweDRGLAotICAgIEFTQ0lJX1AgICAgICAgICAgICAgICAgID0gMHg1MCwKLSAgICBBU0NJSV9RICAgICAgICAgICAgICAgICA9IDB4NTEsCi0gICAgQVNDSUlfUiAgICAgICAgICAgICAgICAgPSAweDUyLAotICAgIEFTQ0lJX1MgICAgICAgICAgICAgICAgID0gMHg1MywKLSAgICBBU0NJSV9UICAgICAgICAgICAgICAgICA9IDB4NTQsCi0gICAgQVNDSUlfVSAgICAgICAgICAgICAgICAgPSAweDU1LAotICAgIEFTQ0lJX1YgICAgICAgICAgICAgICAgID0gMHg1NiwKLSAgICBBU0NJSV9XICAgICAgICAgICAgICAgICA9IDB4NTcsCi0gICAgQVNDSUlfWCAgICAgICAgICAgICAgICAgPSAweDU4LAotICAgIEFTQ0lJX1kgICAgICAgICAgICAgICAgID0gMHg1OSwKLSAgICBBU0NJSV9aICAgICAgICAgICAgICAgICA9IDB4NUEsCi0gICAgQVNDSUlfbGVmdFNxdWFyZUJyYWNlICAgPSAweDVCLCAvKiBbICovCi0gICAgQVNDSUlfYmFja1NsYXNoICAgICAgICAgPSAweDVDLCAvKiBcICovCi0gICAgQVNDSUlfcmlnaHRTcXVhcmVCcmFjZSAgPSAweDVELCAvKiBdICovCi0gICAgQVNDSUlfY2FyZXQgICAgICAgICAgICAgPSAweDVFLCAvKiBeICovCi0gICAgQVNDSUlfdW5kZXJzY29yZSAgICAgICAgPSAweDVGLCAvKiBfICovCi0gICAgQVNDSUlfbGVmdEFwb3N0cm9waGUgICAgPSAweDYwLCAvKiBgICovCi0gICAgQVNDSUlfYSAgICAgICAgICAgICAgICAgPSAweDYxLAotICAgIEFTQ0lJX2IgICAgICAgICAgICAgICAgID0gMHg2MiwKLSAgICBBU0NJSV9jICAgICAgICAgICAgICAgICA9IDB4NjMsCi0gICAgQVNDSUlfZCAgICAgICAgICAgICAgICAgPSAweDY0LAotICAgIEFTQ0lJX2UgICAgICAgICAgICAgICAgID0gMHg2NSwKLSAgICBBU0NJSV9mICAgICAgICAgICAgICAgICA9IDB4NjYsCi0gICAgQVNDSUlfZyAgICAgICAgICAgICAgICAgPSAweDY3LAotICAgIEFTQ0lJX2ggICAgICAgICAgICAgICAgID0gMHg2OCwKLSAgICBBU0NJSV9pICAgICAgICAgICAgICAgICA9IDB4NjksCi0gICAgQVNDSUlfaiAgICAgICAgICAgICAgICAgPSAweDZBLAotICAgIEFTQ0lJX2sgICAgICAgICAgICAgICAgID0gMHg2QiwKLSAgICBBU0NJSV9sICAgICAgICAgICAgICAgICA9IDB4NkMsCi0gICAgQVNDSUlfbSAgICAgICAgICAgICAgICAgPSAweDZELAotICAgIEFTQ0lJX24gICAgICAgICAgICAgICAgID0gMHg2RSwKLSAgICBBU0NJSV9vICAgICAgICAgICAgICAgICA9IDB4NkYsCi0gICAgQVNDSUlfcCAgICAgICAgICAgICAgICAgPSAweDcwLAotICAgIEFTQ0lJX3EgICAgICAgICAgICAgICAgID0gMHg3MSwKLSAgICBBU0NJSV9yICAgICAgICAgICAgICAgICA9IDB4NzIsCi0gICAgQVNDSUlfcyAgICAgICAgICAgICAgICAgPSAweDczLAotICAgIEFTQ0lJX3QgICAgICAgICAgICAgICAgID0gMHg3NCwKLSAgICBBU0NJSV91ICAgICAgICAgICAgICAgICA9IDB4NzUsCi0gICAgQVNDSUlfdiAgICAgICAgICAgICAgICAgPSAweDc2LAotICAgIEFTQ0lJX3cgICAgICAgICAgICAgICAgID0gMHg3NywKLSAgICBBU0NJSV94ICAgICAgICAgICAgICAgICA9IDB4NzgsCi0gICAgQVNDSUlfeSAgICAgICAgICAgICAgICAgPSAweDc5LAotICAgIEFTQ0lJX3ogICAgICAgICAgICAgICAgID0gMHg3QSwKLSAgICBBU0NJSV9sZWZ0Q3VybHlCcmFjZSAgICA9IDB4N0IsIC8qIHsgKi8KLSAgICBBU0NJSV92ZXJ0aWNhbEJhciAgICAgICA9IDB4N0MsIC8qIHwgKi8KLSAgICBBU0NJSV9yaWdodEN1cmx5QnJhY2UgICA9IDB4N0QsIC8qIH0gKi8KLSAgICBBU0NJSV90aWxkZSAgICAgICAgICAgICA9IDB4N0UgIC8qIH4gKi8KLSAgICB9IEVWVF9hc2NpaUNvZGVzVHlwZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmVzIHRoZSBzZXQgb2Ygc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUgZXZlbnQgbGlicmFyeSBmdW5jdGlvbnMKLWluIHRoZSBtZXNzYWdlIGZpZWxkLiBVc2UgdGhlIEVWVF9zY2FuQ29kZSBtYWNybyB0byBleHRyYWN0IHRoZSBjb2RlCi1mcm9tIHRoZSBldmVudCBzdHJ1Y3R1cmUuIE5vdGUgdGhhdCB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCB3aWxsIGJlIHRoZQotc2FtZSBhY3Jvc3MgYWxsIGtleWJvYXJkcyAoYXNzdW1pbmcgdGhlIHBsYWNlbWVudCBvZiBrZXlzIG9uIGEgMTAxIGtleSBVUwota2V5Ym9hcmQpLCBidXQgdGhlIHRyYW5zbGF0ZWQgQVNDSUkgdmFsdWVzIG1heSBiZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uCi10aGUgY291bnRyeSBjb2RlIHBhZ2VzIGluIHVzZS4KLQotTk9URTogICBTY2FuIGNvZGVzIGluIHRoZSBldmVudCBsaWJyYXJ5IGFyZSBub3QgcmVhbGx5IGhhcmR3YXJlIHNjYW4gY29kZXMsCi0JYnV0IHJhdGhlciB2aXJ0dWFsIHNjYW4gY29kZXMgYXMgZ2VuZXJhdGVkIGJ5IGEgbG93IGxldmVsIGtleWJvYXJkCi0JaW50ZXJmYWNlIGRyaXZlci4gQWxsIHZpcnR1YWwgY29kZXMgYmVnaW4gd2l0aCBzY2FuIGNvZGUgMHg2MCBhbmQKLQlyYW5nZSB1cCBmcm9tIHRoZXJlLgotCi1IRUFERVI6Ci1ldmVudC5oCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBLQl9wYWRFbnRlciAgICAgICAgICAgICA9IDB4NjAsIC8qIEtleXBhZCBrZXlzICovCi0gICAgS0JfcGFkTWludXMgICAgICAgICAgICAgPSAweDRBLAotICAgIEtCX3BhZFBsdXMgICAgICAgICAgICAgID0gMHg0RSwKLSAgICBLQl9wYWRUaW1lcyAgICAgICAgICAgICA9IDB4MzcsCi0gICAgS0JfcGFkRGl2aWRlICAgICAgICAgICAgPSAweDYxLAotICAgIEtCX3BhZExlZnQgICAgICAgICAgICAgID0gMHg2MiwKLSAgICBLQl9wYWRSaWdodCAgICAgICAgICAgICA9IDB4NjMsCi0gICAgS0JfcGFkVXAgICAgICAgICAgICAgICAgPSAweDY0LAotICAgIEtCX3BhZERvd24gICAgICAgICAgICAgID0gMHg2NSwKLSAgICBLQl9wYWRJbnNlcnQgICAgICAgICAgICA9IDB4NjYsCi0gICAgS0JfcGFkRGVsZXRlICAgICAgICAgICAgPSAweDY3LAotICAgIEtCX3BhZEhvbWUgICAgICAgICAgICAgID0gMHg2OCwKLSAgICBLQl9wYWRFbmQgICAgICAgICAgICAgICA9IDB4NjksCi0gICAgS0JfcGFkUGFnZVVwICAgICAgICAgICAgPSAweDZBLAotICAgIEtCX3BhZFBhZ2VEb3duICAgICAgICAgID0gMHg2QiwKLSAgICBLQl9wYWRDZW50ZXIgICAgICAgICAgICA9IDB4NEMsCi0gICAgS0JfRjEgICAgICAgICAgICAgICAgICAgPSAweDNCLCAvKiBGdW5jdGlvbiBrZXlzICovCi0gICAgS0JfRjIgICAgICAgICAgICAgICAgICAgPSAweDNDLAotICAgIEtCX0YzICAgICAgICAgICAgICAgICAgID0gMHgzRCwKLSAgICBLQl9GNCAgICAgICAgICAgICAgICAgICA9IDB4M0UsCi0gICAgS0JfRjUgICAgICAgICAgICAgICAgICAgPSAweDNGLAotICAgIEtCX0Y2ICAgICAgICAgICAgICAgICAgID0gMHg0MCwKLSAgICBLQl9GNyAgICAgICAgICAgICAgICAgICA9IDB4NDEsCi0gICAgS0JfRjggICAgICAgICAgICAgICAgICAgPSAweDQyLAotICAgIEtCX0Y5ICAgICAgICAgICAgICAgICAgID0gMHg0MywKLSAgICBLQl9GMTAgICAgICAgICAgICAgICAgICA9IDB4NDQsCi0gICAgS0JfRjExICAgICAgICAgICAgICAgICAgPSAweDU3LAotICAgIEtCX0YxMiAgICAgICAgICAgICAgICAgID0gMHg1OCwKLSAgICBLQl9sZWZ0ICAgICAgICAgICAgICAgICA9IDB4NEIsIC8qIEN1cnNvciBjb250cm9sIGtleXMgKi8KLSAgICBLQl9yaWdodCAgICAgICAgICAgICAgICA9IDB4NEQsCi0gICAgS0JfdXAgICAgICAgICAgICAgICAgICAgPSAweDQ4LAotICAgIEtCX2Rvd24gICAgICAgICAgICAgICAgID0gMHg1MCwKLSAgICBLQl9pbnNlcnQgICAgICAgICAgICAgICA9IDB4NTIsCi0gICAgS0JfZGVsZXRlICAgICAgICAgICAgICAgPSAweDUzLAotICAgIEtCX2hvbWUgICAgICAgICAgICAgICAgID0gMHg0NywKLSAgICBLQl9lbmQgICAgICAgICAgICAgICAgICA9IDB4NEYsCi0gICAgS0JfcGFnZVVwICAgICAgICAgICAgICAgPSAweDQ5LAotICAgIEtCX3BhZ2VEb3duICAgICAgICAgICAgID0gMHg1MSwKLSAgICBLQl9jYXBzTG9jayAgICAgICAgICAgICA9IDB4M0EsCi0gICAgS0JfbnVtTG9jayAgICAgICAgICAgICAgPSAweDQ1LAotICAgIEtCX3Njcm9sbExvY2sgICAgICAgICAgID0gMHg0NiwKLSAgICBLQl9sZWZ0U2hpZnQgICAgICAgICAgICA9IDB4MkEsCi0gICAgS0JfcmlnaHRTaGlmdCAgICAgICAgICAgPSAweDM2LAotICAgIEtCX2xlZnRDdHJsICAgICAgICAgICAgID0gMHgxRCwKLSAgICBLQl9yaWdodEN0cmwgICAgICAgICAgICA9IDB4NkMsCi0gICAgS0JfbGVmdEFsdCAgICAgICAgICAgICAgPSAweDM4LAotICAgIEtCX3JpZ2h0QWx0ICAgICAgICAgICAgID0gMHg2RCwKLSAgICBLQl9sZWZ0V2luZG93cyAgICAgICAgICA9IDB4NUIsCi0gICAgS0JfcmlnaHRXaW5kb3dzICAgICAgICAgPSAweDVDLAotICAgIEtCX21lbnUgICAgICAgICAgICAgICAgID0gMHg1RCwKLSAgICBLQl9zeXNSZXEgICAgICAgICAgICAgICA9IDB4NTQsCi0gICAgS0JfZXNjICAgICAgICAgICAgICAgICAgPSAweDAxLCAvKiBOb3JtYWwga2V5Ym9hcmQga2V5cyAqLwotICAgIEtCXzEgICAgICAgICAgICAgICAgICAgID0gMHgwMiwKLSAgICBLQl8yICAgICAgICAgICAgICAgICAgICA9IDB4MDMsCi0gICAgS0JfMyAgICAgICAgICAgICAgICAgICAgPSAweDA0LAotICAgIEtCXzQgICAgICAgICAgICAgICAgICAgID0gMHgwNSwKLSAgICBLQl81ICAgICAgICAgICAgICAgICAgICA9IDB4MDYsCi0gICAgS0JfNiAgICAgICAgICAgICAgICAgICAgPSAweDA3LAotICAgIEtCXzcgICAgICAgICAgICAgICAgICAgID0gMHgwOCwKLSAgICBLQl84ICAgICAgICAgICAgICAgICAgICA9IDB4MDksCi0gICAgS0JfOSAgICAgICAgICAgICAgICAgICAgPSAweDBBLAotICAgIEtCXzAgICAgICAgICAgICAgICAgICAgID0gMHgwQiwKLSAgICBLQl9taW51cyAgICAgICAgICAgICAgICA9IDB4MEMsCi0gICAgS0JfZXF1YWxzICAgICAgICAgICAgICAgPSAweDBELAotICAgIEtCX2JhY2tTbGFzaCAgICAgICAgICAgID0gMHgyQiwKLSAgICBLQl9iYWNrc3BhY2UgICAgICAgICAgICA9IDB4MEUsCi0gICAgS0JfdGFiICAgICAgICAgICAgICAgICAgPSAweDBGLAotICAgIEtCX1EgICAgICAgICAgICAgICAgICAgID0gMHgxMCwKLSAgICBLQl9XICAgICAgICAgICAgICAgICAgICA9IDB4MTEsCi0gICAgS0JfRSAgICAgICAgICAgICAgICAgICAgPSAweDEyLAotICAgIEtCX1IgICAgICAgICAgICAgICAgICAgID0gMHgxMywKLSAgICBLQl9UICAgICAgICAgICAgICAgICAgICA9IDB4MTQsCi0gICAgS0JfWSAgICAgICAgICAgICAgICAgICAgPSAweDE1LAotICAgIEtCX1UgICAgICAgICAgICAgICAgICAgID0gMHgxNiwKLSAgICBLQl9JICAgICAgICAgICAgICAgICAgICA9IDB4MTcsCi0gICAgS0JfTyAgICAgICAgICAgICAgICAgICAgPSAweDE4LAotICAgIEtCX1AgICAgICAgICAgICAgICAgICAgID0gMHgxOSwKLSAgICBLQl9sZWZ0U3F1YXJlQnJhY2UgICAgICA9IDB4MUEsCi0gICAgS0JfcmlnaHRTcXVhcmVCcmFjZSAgICAgPSAweDFCLAotICAgIEtCX2VudGVyICAgICAgICAgICAgICAgID0gMHgxQywKLSAgICBLQl9BICAgICAgICAgICAgICAgICAgICA9IDB4MUUsCi0gICAgS0JfUyAgICAgICAgICAgICAgICAgICAgPSAweDFGLAotICAgIEtCX0QgICAgICAgICAgICAgICAgICAgID0gMHgyMCwKLSAgICBLQl9GICAgICAgICAgICAgICAgICAgICA9IDB4MjEsCi0gICAgS0JfRyAgICAgICAgICAgICAgICAgICAgPSAweDIyLAotICAgIEtCX0ggICAgICAgICAgICAgICAgICAgID0gMHgyMywKLSAgICBLQl9KICAgICAgICAgICAgICAgICAgICA9IDB4MjQsCi0gICAgS0JfSyAgICAgICAgICAgICAgICAgICAgPSAweDI1LAotICAgIEtCX0wgICAgICAgICAgICAgICAgICAgID0gMHgyNiwKLSAgICBLQl9zZW1pY29sb24gICAgICAgICAgICA9IDB4MjcsCi0gICAgS0JfYXBvc3Ryb3BoZSAgICAgICAgICAgPSAweDI4LAotICAgIEtCX1ogICAgICAgICAgICAgICAgICAgID0gMHgyQywKLSAgICBLQl9YICAgICAgICAgICAgICAgICAgICA9IDB4MkQsCi0gICAgS0JfQyAgICAgICAgICAgICAgICAgICAgPSAweDJFLAotICAgIEtCX1YgICAgICAgICAgICAgICAgICAgID0gMHgyRiwKLSAgICBLQl9CICAgICAgICAgICAgICAgICAgICA9IDB4MzAsCi0gICAgS0JfTiAgICAgICAgICAgICAgICAgICAgPSAweDMxLAotICAgIEtCX00gICAgICAgICAgICAgICAgICAgID0gMHgzMiwKLSAgICBLQl9jb21tYSAgICAgICAgICAgICAgICA9IDB4MzMsCi0gICAgS0JfcGVyaW9kICAgICAgICAgICAgICAgPSAweDM0LAotICAgIEtCX2RpdmlkZSAgICAgICAgICAgICAgID0gMHgzNSwKLSAgICBLQl9zcGFjZSAgICAgICAgICAgICAgICA9IDB4MzksCi0gICAgS0JfdGlsZGUgICAgICAgICAgICAgICAgPSAweDI5Ci0gICAgfSBFVlRfc2NhbkNvZGVzVHlwZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmVzIHRoZSBtYXNrIGZvciB0aGUgam95c3RpY2sgYXhlcyB0aGF0IGFyZSBwcmVzZW50Ci0KLUhFQURFUjoKLWV2ZW50LmgKLQotTUVNQkVSUzoKLUVWVF9KT1lfQVhJU19YMSAgICAgLSBKb3lzdGljayAxLCBYIGF4aXMgaXMgcHJlc2VudAotRVZUX0pPWV9BWElTX1kxICAgICAtIEpveXN0aWNrIDEsIFkgYXhpcyBpcyBwcmVzZW50Ci1FVlRfSk9ZX0FYSVNfWDIgICAgIC0gSm95c3RpY2sgMiwgWCBheGlzIGlzIHByZXNlbnQKLUVWVF9KT1lfQVhJU19ZMiAgICAgLSBKb3lzdGljayAyLCBZIGF4aXMgaXMgcHJlc2VudAotRVZUX0pPWV9BWElTX0FMTCAgICAtIE1hc2sgZm9yIGFsbCBheGVzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBFVlRfSk9ZX0FYSVNfWDEgICAgID0gMHgwMDAwMDAwMSwKLSAgICBFVlRfSk9ZX0FYSVNfWTEgICAgID0gMHgwMDAwMDAwMiwKLSAgICBFVlRfSk9ZX0FYSVNfWDIgICAgID0gMHgwMDAwMDAwNCwKLSAgICBFVlRfSk9ZX0FYSVNfWTIgICAgID0gMHgwMDAwMDAwOCwKLSAgICBFVlRfSk9ZX0FYSVNfQUxMICAgID0gMHgwMDAwMDAwRgotICAgIH0gRVZUX2V2ZW50Sm95QXhpc1R5cGU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lcyB0aGUgZXZlbnQgbWVzc2FnZSBtYXNrcyBmb3Igam95c3RpY2sgZXZlbnRzCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotTUVNQkVSUzoKLUVWVF9KT1kxX0JVVFRPTkEgICAgLSBKb3lzdGljayAxLCBidXR0b24gQSBpcyBkb3duCi1FVlRfSk9ZMV9CVVRUT05CICAgIC0gSm95c3RpY2sgMSwgYnV0dG9uIEIgaXMgZG93bgotRVZUX0pPWTJfQlVUVE9OQSAgICAtIEpveXN0aWNrIDIsIGJ1dHRvbiBBIGlzIGRvd24KLUVWVF9KT1kyX0JVVFRPTkIgICAgLSBKb3lzdGljayAyLCBidXR0b24gQiBpcyBkb3duCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBFVlRfSk9ZMV9CVVRUT05BICAgID0gMHgwMDAwMDAwMSwKLSAgICBFVlRfSk9ZMV9CVVRUT05CICAgID0gMHgwMDAwMDAwMiwKLSAgICBFVlRfSk9ZMl9CVVRUT05BICAgID0gMHgwMDAwMDAwNCwKLSAgICBFVlRfSk9ZMl9CVVRUT05CICAgID0gMHgwMDAwMDAwOAotICAgIH0gRVZUX2V2ZW50Sm95TWFza1R5cGU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lcyB0aGUgZXZlbnQgbWVzc2FnZSBtYXNrcyBmb3IgbW91c2UgZXZlbnRzCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotTUVNQkVSUzoKLUVWVF9MRUZUQk1BU0sgICAtIExlZnQgYnV0dG9uIGlzIGhlbGQgZG93bgotRVZUX1JJR0hUQk1BU0sgIC0gUmlnaHQgYnV0dG9uIGlzIGhlbGQgZG93bgotRVZUX01JRERMRUJNQVNLIC0gTWlkZGxlIGJ1dHRvbiBpcyBoZWxkIGRvd24KLUVWVF9CT1RIQk1BU0sgICAtIEJvdGggbGVmdCBhbmQgcmlnaHQgaGVsZCBkb3duIHRvZ2V0aGVyCi1FVlRfQUxMQk1BU0sgICAgLSBBbGwgYnV0dG9ucyBwcmVzc2VkCi1FVlRfREJMQ0xJQ0sgICAgLSBTZXQgaWYgbW91c2UgZG93biBldmVudCB3YXMgYSBkb3VibGUgY2xpY2sKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGVudW0gewotICAgIEVWVF9MRUZUQk1BU0sgICA9IDB4MDAwMDAwMDEsCi0gICAgRVZUX1JJR0hUQk1BU0sgID0gMHgwMDAwMDAwMiwKLSAgICBFVlRfTUlERExFQk1BU0sgPSAweDAwMDAwMDA0LAotICAgIEVWVF9CT1RIQk1BU0sgICA9IDB4MDAwMDAwMDcsCi0gICAgRVZUX0FMTEJNQVNLICAgID0gMHgwMDAwMDAwNywKLSAgICBFVlRfREJMQ0xJQ0sgICAgPSAweDAwMDEwMDAwCi0gICAgfSBFVlRfZXZlbnRNb3VzZU1hc2tUeXBlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZXMgdGhlIGV2ZW50IG1vZGlmaWVyIG1hc2tzLiBUaGVzZSBhcmUgdGhlIG1hc2tzIHVzZWQgdG8gZXh0cmFjdAotdGhlIG1vZGlmaWVyIGluZm9ybWF0aW9uIGZyb20gdGhlIG1vZGlmaWVycyBmaWVsZCBvZiB0aGUgZXZlbnRfdCBzdHJ1Y3R1cmUuCi1Ob3RlIHRoYXQgdGhlIHZhbHVlcyBpbiB0aGUgbW9kaWZpZXJzIGZpZWxkIHJlcHJlc2VudCB0aGUgdmFsdWVzIG9mIHRoZXNlCi1tb2RpZmllciBrZXlzIGF0IHRoZSB0aW1lIHRoZSBldmVudCBvY2N1cnJlZCwgbm90IHRoZSB0aW1lIHlvdSBkZWNpZGVkCi10byBwcm9jZXNzIHRoZSBldmVudC4KLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotRVZUX0xFRlRCVVQgICAgIC0gU2V0IGlmIGxlZnQgbW91c2UgYnV0dG9uIHdhcyBkb3duCi1FVlRfUklHSFRCVVQgICAgLSBTZXQgaWYgcmlnaHQgbW91c2UgYnV0dG9uIHdhcyBkb3duCi1FVlRfTUlERExFQlVUICAgLSBTZXQgaWYgdGhlIG1pZGRsZSBidXR0b24gd2FzIGRvd24KLUVWVF9SSUdIVFNISUZUICAtIFNldCBpZiByaWdodCBzaGlmdCB3YXMgZG93bgotRVZUX0xFRlRTSElGVCAgIC0gU2V0IGlmIGxlZnQgc2hpZnQgd2FzIGRvd24KLUVWVF9SSUdIVENUUkwgICAtIFNldCBpZiByaWdodCBjdHJsIGtleSB3YXMgZG93bgotRVZUX1JJR0hUQUxUICAgIC0gU2V0IGlmIHJpZ2h0IGFsdCBrZXkgd2FzIGRvd24KLUVWVF9MRUZUQ1RSTCAgICAtIFNldCBpZiBsZWZ0IGN0cmwga2V5IHdhcyBkb3duCi1FVlRfTEVGVEFMVCAgICAgLSBTZXQgaWYgbGVmdCBhbHQga2V5IHdhcyBkb3duCi1FVlRfU0hJRlRLRVkgICAgLSBNYXNrIGZvciBhbnkgc2hpZnQga2V5IGRvd24KLUVWVF9DVFJMU1RBVEUgICAtIFNldCBpZiBjdHJsIGtleSB3YXMgZG93bgotRVZUX0FMVFNUQVRFICAgIC0gU2V0IGlmIGFsdCBrZXkgd2FzIGRvd24KLUVWVF9DQVBTTE9DSyAgICAtIENhcHMgbG9jayBpcyBhY3RpdmUKLUVWVF9OVU1MT0NLICAgICAtIE51bSBsb2NrIGlzIGFjdGl2ZQotRVZUX1NDUk9MTExPQ0sgIC0gU2Nyb2xsIGxvY2sgaXMgYWN0aXZlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBFVlRfTEVGVEJVVCAgICAgPSAweDAwMDAwMDAxLAotICAgIEVWVF9SSUdIVEJVVCAgICA9IDB4MDAwMDAwMDIsCi0gICAgRVZUX01JRERMRUJVVCAgID0gMHgwMDAwMDAwNCwKLSAgICBFVlRfUklHSFRTSElGVCAgPSAweDAwMDAwMDA4LAotICAgIEVWVF9MRUZUU0hJRlQgICA9IDB4MDAwMDAwMTAsCi0gICAgRVZUX1JJR0hUQ1RSTCAgID0gMHgwMDAwMDAyMCwKLSAgICBFVlRfUklHSFRBTFQgICAgPSAweDAwMDAwMDQwLAotICAgIEVWVF9MRUZUQ1RSTCAgICA9IDB4MDAwMDAwODAsCi0gICAgRVZUX0xFRlRBTFQgICAgID0gMHgwMDAwMDEwMCwKLSAgICBFVlRfU0hJRlRLRVkgICAgPSAweDAwMDAwMDE4LAotICAgIEVWVF9DVFJMU1RBVEUgICA9IDB4MDAwMDAwQTAsCi0gICAgRVZUX0FMVFNUQVRFICAgID0gMHgwMDAwMDE0MCwKLSAgICBFVlRfU0NST0xMTE9DSyAgPSAweDAwMDAwMjAwLAotICAgIEVWVF9OVU1MT0NLICAgICA9IDB4MDAwMDA0MDAsCi0gICAgRVZUX0NBUFNMT0NLICAgID0gMHgwMDAwMDgwMAotICAgIH0gRVZUX2V2ZW50TW9kTWFza1R5cGU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lcyB0aGUgZXZlbnQgY29kZXMgcmV0dXJuZWQgaW4gdGhlIGV2ZW50X3Qgc3RydWN0dXJlcyB3aGF0IGZpZWxkLiBOb3RlCi10aGF0IHRoZXNlIGFyZSBkZWZpbmVkIGFzIGEgc2V0IG9mIG11dHVhbGx5IGV4bHVzaXZlIGJpdCBmaWVsZHMsIHNvIHlvdQotY2FuIHRlc3QgZm9yIG11bHRpcGxlIGV2ZW50IHR5cGVzIHVzaW5nIHRoZSBjb21iaW5lZCBldmVudCBtYXNrcyBkZWZpbmVkCi1pbiB0aGUgRVZUX2V2ZW50TWFza1R5cGUgZW51bWVyYXRpb24uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotTUVNQkVSUzoKLUVWVF9OVUxMRVZUICAgICAtIEEgbnVsbCBldmVudAotRVZUX0tFWURPV04gICAgIC0gS2V5IGRvd24gZXZlbnQKLUVWVF9LRVlSRVBFQVQgICAtIEtleSByZXBlYXQgZXZlbnQKLUVWVF9LRVlVUCAgICAgICAtIEtleSB1cCBldmVudAotRVZUX01PVVNFRE9XTiAgIC0gTW91c2UgZG93biBldmVudAotRVZUX01PVVNFQVVUTyAgIC0gTW91c2UgZG93biBhdXRvcmVwZWF0IGV2ZW50Ci1FVlRfTU9VU0VVUCAgICAgLSBNb3VzZSB1cCBldmVudAotRVZUX01PVVNFTU9WRSAgIC0gTW91c2UgbW92ZW1lbnQgZXZlbnQKLUVWVF9KT1lDTElDSyAgICAtIEpveXN0aWNrIGJ1dHRvbiBzdGF0ZSBjaGFuZ2UgZXZlbnQKLUVWVF9KT1lNT1ZFICAgICAtIEpveXN0aWNrIG1vdmVtZW50IGV2ZW50Ci1FVlRfVVNFUkVWVCAgICAgLSBGaXJzdCB1c2VyIGV2ZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBFVlRfTlVMTEVWVCAgICAgPSAweDAwMDAwMDAwLAotICAgIEVWVF9LRVlET1dOICAgICA9IDB4MDAwMDAwMDEsCi0gICAgRVZUX0tFWVJFUEVBVCAgID0gMHgwMDAwMDAwMiwKLSAgICBFVlRfS0VZVVAgICAgICAgPSAweDAwMDAwMDA0LAotICAgIEVWVF9NT1VTRURPV04gICA9IDB4MDAwMDAwMDgsCi0gICAgRVZUX01PVVNFQVVUTyAgID0gMHgwMDAwMDAxMCwKLSAgICBFVlRfTU9VU0VVUCAgICAgPSAweDAwMDAwMDIwLAotICAgIEVWVF9NT1VTRU1PVkUgICA9IDB4MDAwMDAwNDAsCi0gICAgRVZUX0pPWUNMSUNLICAgID0gMHgwMDAwMDA4MCwKLSAgICBFVlRfSk9ZTU9WRSAgICAgPSAweDAwMDAwMTAwLAotICAgIEVWVF9VU0VSRVZUICAgICA9IDB4MDAwMDAyMDAKLSAgICB9IEVWVF9ldmVudFR5cGU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lcyB0aGUgZXZlbnQgY29kZSBtYXNrcyB5b3UgY2FuIHVzZSB0byB0ZXN0IGZvciBtdWx0aXBsZSB0eXBlcyBvZgotZXZlbnRzLCBzaW5jZSB0aGUgZXZlbnQgY29kZXMgYXJlIG11dHVhbGx5IGV4bHVzaXZlIGJpdCBmaWVsZHMuCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotTUVNQkVSUzoKLUVWVF9LRVlFVlQgICAgICAtIE1hc2sgZm9yIGFueSBrZXkgZXZlbnQKLUVWVF9NT1VTRUVWVCAgICAtIE1hc2sgZm9yIGFueSBtb3VzZSBldmVudAotRVZUX01PVVNFQ0xJQ0sgIC0gTWFzayBmb3IgYW55IG1vdXNlIGNsaWNrIGV2ZW50Ci1FVlRfSk9ZRVZUICAgICAgLSBNYXNrIGZvciBhbnkgam95c3RpY2sgZXZlbnQKLUVWVF9FVkVSWUVWVCAgICAtIE1hc2sgZm9yIGFueSBldmVudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgRVZUX0tFWUVWVCAgICAgID0gKEVWVF9LRVlET1dOIHwgRVZUX0tFWVJFUEVBVCB8IEVWVF9LRVlVUCksCi0gICAgRVZUX01PVVNFRVZUICAgID0gKEVWVF9NT1VTRURPV04gfCBFVlRfTU9VU0VBVVRPIHwgRVZUX01PVVNFVVAgfCBFVlRfTU9VU0VNT1ZFKSwKLSAgICBFVlRfTU9VU0VDTElDSyAgPSAoRVZUX01PVVNFRE9XTiB8IEVWVF9NT1VTRVVQKSwKLSAgICBFVlRfSk9ZRVZUICAgICAgPSAoRVZUX0pPWUNMSUNLIHwgRVZUX0pPWU1PVkUpLAotICAgIEVWVF9FVkVSWUVWVCAgICA9IDB4N0ZGRkZGRkYKLSAgICB9IEVWVF9ldmVudE1hc2tUeXBlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gYW4gZXZlbnQgZXh0cmFjdGVkIGZyb20KLXRoZSBldmVudCBxdWV1ZS4KLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotd2hpY2ggICAgICAgLSBXaW5kb3cgaWRlbnRpZmllciBmb3IgbWVzc2FnZSBmb3IgdXNlIGJ5IGhpZ2ggbGV2ZWwgd2luZG93IG1hbmFnZXIKLQkgICAgICBjb2RlIChpLmUuIE1lZ2FWaXNpb24gR1VJIG9yIFdpbmRvd3MgQVBJKS4KLXdoYXQgICAgICAgIC0gVHlwZSBvZiBldmVudCB0aGF0IG9jY3VycmVkLiBXaWxsIGJlIG9uZSBvZiB0aGUgdmFsdWVzIGRlZmluZWQgYnkKLQkgICAgICB0aGUgRVZUX2V2ZW50VHlwZSBlbnVtZXJhdGlvbi4KLXdoZW4gICAgICAgIC0gVGltZSB0aGF0IHRoZSBldmVudCBvY2N1cnJlZCBpbiBtaWxsaXNlY29uZHMgc2luY2Ugc3RhcnR1cAotd2hlcmVfeCAgICAgLSBYIGNvb3JkaW5hdGUgb2YgdGhlIG1vdXNlIGN1cnNvciBsb2NhdGlvbiBhdCB0aGUgdGltZSBvZiB0aGUgZXZlbnQKLQkgICAgICAoaW4gc2NyZWVuIGNvb3JkaW5hdGVzKS4gRm9yIGpveXN0aWNrIGV2ZW50cyB0aGlzIHJlcHJlc2VudHMKLQkgICAgICB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGpveXN0aWNrIFggYXhpcy4KLXdoZXJlX3kgICAgIC0gWSBjb29yZGluYXRlIG9mIHRoZSBtb3VzZSBjdXJzb3IgbG9jYXRpb24gYXQgdGhlIHRpbWUgb2YgdGhlIGV2ZW50Ci0JICAgICAgKGluIHNjcmVlbiBjb29yZGluYXRlcykuIEZvciBqb3lzdGljayBldmVudHMgdGhpcyByZXByZXNlbnRzCi0JICAgICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBqb3lzdGljayBZIGF4aXMuCi1yZWxhdGl2ZV94ICAtIFJlbGF0aXZlIG1vdmVtZW50IG9mIHRoZSBtb3VzZSBjdXJzb3IgaW4gdGhlIFggZGlyZWN0aW9uIChpbgotCSAgICAgIHVuaXRzIG9mIG1pY2tleXMsIG9yIDEvMjAwdGggb2YgYW4gaW5jaCkuIEZvciBqb3lzdGljayBldmVudHMKLQkgICAgICB0aGlzIHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWNvbmQgam95c3RpY2sgWCBheGlzLgotcmVsYXRpdmVfeSAgLSBSZWxhdGl2ZSBtb3ZlbWVudCBvZiB0aGUgbW91c2UgY3Vyc29yIGluIHRoZSBZIGRpcmVjdGlvbiAoaW4KLQkgICAgICB1bml0cyBvZiBtaWNrZXlzLCBvciAxLzIwMHRoIG9mIGFuIGluY2gpLiBGb3Igam95c3RpY2sgZXZlbnRzCi0JICAgICAgdGhpcyByZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2Vjb25kIGpveXN0aWNrIFkgYXhpcy4KLW1lc3NhZ2UgICAgIC0gRXZlbnQgc3BlY2lmaWMgbWVzc2FnZSBmb3IgdGhlIGV2ZW50LiBGb3IgdXNlIGV2ZW50cyB0aGlzIGNhbiBiZQotCSAgICAgIGFueSB1c2VyIHNwZWNpZmljIGluZm9ybWF0aW9uLiBGb3Iga2V5Ym9hcmQgZXZlbnRzIHRoaXMgY29udGFpbnMKLQkgICAgICB0aGUgQVNDSUkgY29kZSBpbiBiaXRzIDAtNywgdGhlIGtleWJvYXJkIHNjYW4gY29kZSBpbiBiaXRzIDgtMTUgYW5kCi0JICAgICAgdGhlIGNoYXJhY3RlciByZXBlYXQgY291bnQgaW4gYml0cyAxNi0zMC4gWW91IGNhbiB1c2UgdGhlCi0JICAgICAgRVZUX2FzY2lpQ29kZSwgRVZUX3NjYW5Db2RlIGFuZCBFVlRfcmVwZWF0Q291bnQgbWFjcm9zIHRvIGV4dHJhY3QKLQkgICAgICB0aGlzIGluZm9ybWF0aW9uIGZyb20gdGhlIG1lc3NhZ2UgZmllbGQuIEZvciBtb3VzZSBldmVudHMgdGhpcwotCSAgICAgIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIGJ1dHRvbiB3YXMgcHJlc3NlZCwgYW5kIHdpbGwgYmUgYQotCSAgICAgIGNvbWJpbmF0aW9uIG9mIHRoZSBmbGFncyBkZWZpbmVkIGJ5IHRoZSBFVlRfZXZlbnRNb3VzZU1hc2tUeXBlCi0JICAgICAgZW51bWVyYXRpb24uIEZvciBqb3lzdGljayBldmVudHMsIHRoaXMgY29uYXRpbnMgaW5mb3JtYXRpb24KLQkgICAgICBhYm91dCB3aGljaCBidXR0b25zIHdlcmUgcHJlc3NlZCwgYW5kIHdpbGwgYmUgYSBjb21iaW5hdGlvbiBvZgotCSAgICAgIHRoZSBmbGFncyBkZWZpbmVkIGJ5IHRoZSBFVlRfZXZlbnRKb3lNYXNrVHlwZSBlbnVtZXJhdGlvbi4KLW1vZGlmaWVycyAgIC0gQ29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIGtleWJvYXJkCi0JICAgICAgc2hpZnQgbW9kaWZpZXJzIChDdHJsLCBBbHQgYW5kIFNoaWZ0IGtleXMpIHdoZW4gdGhlIGV2ZW50Ci0JICAgICAgb2NjdXJyZWQuIEZvciBtb3VzZSBldmVudHMgaXQgd2lsbCBhbHNvIGNvbnRhaW4gdGhlIHN0YXRlIG9mCi0JICAgICAgdGhlIG1vdXNlIGJ1dHRvbnMuIFdpbGwgYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgdmFsdWVzIGRlZmluZWQKLQkgICAgICBieSB0aGUgRVZUX2V2ZW50TW9kTWFza1R5cGUgZW51bWVyYXRpb24uCi1uZXh0ICAgICAgICAtIEludGVybmFsIHVzZTsgZG8gbm90IHVzZS4KLXByZXYgICAgICAgIC0gSW50ZXJuYWwgdXNlOyBkbyBub3QgdXNlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgICAgICB3aGljaDsKLSAgICB1bG9uZyAgICAgICB3aGF0OwotICAgIHVsb25nICAgICAgIHdoZW47Ci0gICAgaW50ICAgICAgICAgd2hlcmVfeDsKLSAgICBpbnQgICAgICAgICB3aGVyZV95OwotICAgIGludCAgICAgICAgIHJlbGF0aXZlX3g7Ci0gICAgaW50ICAgICAgICAgcmVsYXRpdmVfeTsKLSAgICB1bG9uZyAgICAgICBtZXNzYWdlOwotICAgIHVsb25nICAgICAgIG1vZGlmaWVyczsKLSAgICBpbnQgICAgICAgICBuZXh0OwotICAgIGludCAgICAgICAgIHByZXY7Ci0gICAgfSBldmVudF90OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVN0cnVjdHVyZSBkZXNjcmliaW5nIGFuIGVudHJ5IGluIHRoZSBjb2RlIHBhZ2UgdGFibGUuIEEgdGFibGUgb2YgdHJhbnNsYXRpb24KLWNvZGVzIGZvciBzY2FuIGNvZGVzIHRvIEFTQ0lJIGNvZGVzIGlzIHByb3ZpZGVkIGluIHRoaXMgdGFibGUgdG8gYmUgdXNlZAotYnkgdGhlIGtleWJvYXJkIGV2ZW50IGxpYnJhcmllcy4gT24gc29tZSBPUydlcyB0aGUga2V5Ym9hcmQgdHJhbnNsYXRpb24gaXMKLWhhbmRsZWQgYnkgdGhlIE9TLCBidXQgZm9yIERPUyBhbmQgZW1iZWRkZWQgc3lzdGVtcyB5b3UgbXVzdCByZWdpc3RlciBhCi1kaWZmZXJlbnQgY29kZSBwYWdlIHRyYW5zbGF0aW9uIHRhYmxlIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQga2V5Ym9hcmRzCi1vdGhlciB0aGFuIHRoZSBVUyBFbmdsaXNoIGtleWJvYXJkICh0aGUgZGVmYXVsdCkuCi0KLU5PVEU6ICAgRW50cmllcyBpbiBjb2RlIHBhZ2UgdGFibGVzICptdXN0KiBiZSBpbiBhc2NlbmRpbmcgb3JkZXIgZm9yIHRoZQotCXNjYW4gY29kZXMgYXMgd2UgZG8gYSBiaW5hcnkgc2VhcmNoIG9uIHRoZSB0YWJsZXMgZm9yIHRoZSBBU0NJSQotCWNvZGUgZXF1aXZhbGVudHMuCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotTUVNQkVSUzoKLXNjYW5Db2RlICAgIC0gU2NhbiBjb2RlIHRvIHRyYW5zbGF0ZSAocmVhbGx5IHRoZSB2aXJ0dWFsIHNjYW4gY29kZSkuCi1hc2NpaUNvZGUgICAtIEFTQ0lJIGNvZGUgZm9yIHRoaXMgc2NhbiBjb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1Y2hhciAgICAgICBzY2FuQ29kZTsKLSAgICB1Y2hhciAgICAgICBhc2NpaUNvZGU7Ci0gICAgfSBjb2RlcGFnZV9lbnRyeV90OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVN0cnVjdHVyZSBkZXNjcmliaW5nIGEgY29tcGxldGUgY29kZSBwYWdlIHRyYW5zbGF0aW9uIHRhYmxlLiBUaGUgdGFibGUKLWNvbnRhaW5zIHRyYW5zbGF0aW9uIHRhYmxlcyBmb3Igbm9ybWFsIGtleXMsIHNoaWZ0ZWQga2V5cyBhbmQgY3RybCBrZXlzLgotVGhlIEN0cmwga2V5IGFsd2F5cyBoYXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBzaGlmdCB0YWJsZSwgYW5kIHRoZSBzaGlmdAotdGFibGUgaXMgdXNlZCB3aGVuIHRoZSBzaGlmdCBrZXkgaXMgZG93biBvciB0aGUgQ0FQU0xPQ0sga2V5IGlzIGRvd24uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotTUVNQkVSUzoKLW5hbWUgICAgICAgICAgICAtIE5hbWUgb2YgdGhlIGNvZGUgcGFnZSB0YWJsZSAoaWU6ICJVUyBFbmdsaXNoIikKLW5vcm1hbCAgICAgICAgICAtIENvZGUgcGFnZSBmb3IgdHJhbnNsYXRpbmcgbm9ybWFsIGtleXMKLW5vcm1hbExlbiAgICAgICAtIExlbmd0aCBvZiBub3JtYWwgdHJhbnNsYXRpb24gdGFibGUKLWNhcHMgICAgICAgICAgICAtIENvZGUgcGFnZSBmb3IgdHJhbnNsYXRpbmcga2V5cyB3aGVuIENBUFNMT0NLIGlzIGRvd24KLWNhcHNMZW4gICAgICAgICAtIExlbmd0aCBvZiBDQVBTTE9DSyB0cmFuc2xhdGlvbiB0YWJsZQotc2hpZnQgICAgICAgICAgIC0gQ29kZSBwYWdlIGZvciBzaGlmdGVkIGtleXMgKGllOiBzaGlmdCBrZXkgaXMgaGVsZCBkb3duKQotc2hpZnRMZW4gICAgICAgIC0gTGVuZ3RoIG9mIHNoaWZ0ZWQgdHJhbnNsYXRpb24gdGFibGUKLXNoaWZ0Q2FwcyAgICAgICAtIENvZGUgcGFnZSBmb3Igc2hpZnRlZCBrZXlzIHdoZW4gQ0FQU0xPQ0sgaXMgZG93bgotc2hpZnRDYXBzTGVuICAgIC0gTGVuZ3RoIG9mIHNoaWZ0ZWQgQ0FQU0xPQ0sgdHJhbnNsYXRpb24gdGFibGUKLWN0cmwgICAgICAgICAgICAtIENvZGUgcGFnZSBmb3IgY3RybCdlZCBrZXlzIChpZTogY3RybCBrZXkgaXMgaGVsZCBkb3duKQotY3RybExlbiAgICAgICAgIC0gTGVuZ3RoIG9mIGN0cmwnZWQgdHJhbnNsYXRpb24gdGFibGUKLW51bVBhZCAgICAgICAgICAtIENvZGUgcGFnZSBmb3IgTlVNTE9DSydlZCBrZXlwYWQga2V5cwotbnVtUGFkTGVuICAgICAgIC0gTGVuZ3RoIG9mIE5VTUxPQ0snZWQgdHJhbnNsYXRpb24gdGFibGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAgICAgICAgICAgICAgICBuYW1lWzIwXTsKLSAgICBjb2RlcGFnZV9lbnRyeV90ICAgICpub3JtYWw7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBub3JtYWxMZW47Ci0gICAgY29kZXBhZ2VfZW50cnlfdCAgICAqY2FwczsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGNhcHNMZW47Ci0gICAgY29kZXBhZ2VfZW50cnlfdCAgICAqc2hpZnQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBzaGlmdExlbjsKLSAgICBjb2RlcGFnZV9lbnRyeV90ICAgICpzaGlmdENhcHM7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBzaGlmdENhcHNMZW47Ci0gICAgY29kZXBhZ2VfZW50cnlfdCAgICAqY3RybDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGN0cmxMZW47Ci0gICAgY29kZXBhZ2VfZW50cnlfdCAgICAqbnVtUGFkOwotICAgIGludCAgICAgICAgICAgICAgICAgbnVtUGFkTGVuOwotICAgIH0gY29kZXBhZ2VfdDsKLQotLyoge3NlY3JldH0gKi8KLXR5cGVkZWYgaWJvb2wgKEVWVEFQSVAgX0VWVF91c2VyRXZlbnRGaWx0ZXIpKGV2ZW50X3QgKmV2dCk7Ci0vKiB7c2VjcmV0fSAqLwotdHlwZWRlZiB2b2lkIChFVlRBUElQIF9FVlRfbW91c2VNb3ZlSGFuZGxlcikoaW50IHgsaW50IHkpOwotLyoge3NlY3JldH0gKi8KLXR5cGVkZWYgdm9pZCAoRVZUQVBJUCBfRVZUX2hlYXJ0QmVhdENhbGxiYWNrKSh2b2lkICpwYXJhbXMpOwotCi0vKiBNYWNybyB0byBmaW5kIHRoZSBzaXplIG9mIGEgc3RhdGljIGFycmF5ICovCi0KLSNkZWZpbmUgRVZUX0FSUl9TSVpFKGEpICAgICAgICAgKHNpemVvZihhKS9zaXplb2YoKGEpWzBdKSkKLQotI3ByYWdtYSBwYWNrKCkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7ICAgICAgICAgICAgLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KLSNlbmRpZgotCi0vKiBTdGFuZGFyZCBjb2RlIHBhZ2UgdGFibGVzICovCi0KLWV4dGVybiBjb2RlcGFnZV90IF9DUF9VU19FbmdsaXNoOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBQdWJsaWMgQVBJIGZ1bmN0aW9ucyBmb3IgdXNlciBhcHBsaWNhdGlvbnMgKi8KLQotaWJvb2wgICBFVlRBUEkgRVZUX2dldE5leHQoZXZlbnRfdCAqZXZ0LHVsb25nIG1hc2spOwotaWJvb2wgICBFVlRBUEkgRVZUX3BlZWtOZXh0KGV2ZW50X3QgKmV2dCx1bG9uZyBtYXNrKTsKLWlib29sICAgRVZUQVBJIEVWVF9wb3N0KHVsb25nIHdoaWNoLHVsb25nIHdoYXQsdWxvbmcgbWVzc2FnZSx1bG9uZyBtb2RpZmllcnMpOwotdm9pZCAgICBFVlRBUEkgRVZUX2ZsdXNoKHVsb25nIG1hc2spOwotdm9pZCAgICBFVlRBUEkgRVZUX2hhbHQoZXZlbnRfdCAqZXZ0LHVsb25nIG1hc2spOwotaWJvb2wgICBFVlRBUEkgRVZUX2lzS2V5RG93bih1Y2hhciBzY2FuQ29kZSk7Ci12b2lkICAgIEVWVEFQSSBFVlRfc2V0TW91c2VQb3MoaW50IHgsaW50IHkpOwotdm9pZCAgICBFVlRBUEkgRVZUX2dldE1vdXNlUG9zKGludCAqeCxpbnQgKnkpOwotCi0vKiBGdW5jdGlvbiB0byBlbmFibGUvZGlzYWJsZSB1cGRhdGluZyBvZiBrZXlib2FyZCBMRUQgc3RhdHVzIGluZGljYXRvcnMgKi8KLQotdm9pZCAgICBFVlRBUEkgRVZUX2FsbG93TEVEUyhpYm9vbCBlbmFibGUpOwotCi0vKiBGdW5jdGlvbiB0byBpbnN0YWxsIGEgY3VzdG9tIGtleWJvYXJkIGNvZGUgcGFnZS4gRGVmYXVsdCBpcyBVUyBFbmdsaXNoICovCi0KLWNvZGVwYWdlX3QgKkVWVEFQSSBFVlRfZ2V0Q29kZVBhZ2Uodm9pZCk7Ci12b2lkICAgIEVWVEFQSSBFVlRfc2V0Q29kZVBhZ2UoY29kZXBhZ2VfdCAqcGFnZSk7Ci0KLS8qIEZ1bmN0aW9ucyBmb3IgZmluZSBncmFpbmVkIGpveXN0aWNrIGNhbGlicmF0aW9uICovCi0KLXZvaWQgICAgRVZUQVBJIEVWVF9wb2xsSm95c3RpY2sodm9pZCk7Ci1pbnQgICAgIEVWVEFQSSBFVlRfam95SXNQcmVzZW50KHZvaWQpOwotdm9pZCAgICBFVlRBUEkgRVZUX2pveVNldFVwcGVyTGVmdCh2b2lkKTsKLXZvaWQgICAgRVZUQVBJIEVWVF9qb3lTZXRMb3dlclJpZ2h0KHZvaWQpOwotdm9pZCAgICBFVlRBUEkgRVZUX2pveVNldENlbnRlcih2b2lkKTsKLQotLyogSW5zdGFsbCB1c2VyIHN1cHBsaWVkIGV2ZW50IGZpbHRlciBjYWxsYmFjayAqLwotCi12b2lkICAgIEVWVEFQSSBFVlRfc2V0VXNlckV2ZW50RmlsdGVyKF9FVlRfdXNlckV2ZW50RmlsdGVyIGZpbHRlcik7Ci0KLS8qIEluc3RhbGwgdXNlciBzdXBwbGllZCBldmVudCBoZWFydGJlYXQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLQotdm9pZCAgICBFVlRBUEkgRVZUX3NldEhlYXJ0QmVhdENhbGxiYWNrKF9FVlRfaGVhcnRCZWF0Q2FsbGJhY2sgY2FsbGJhY2ssdm9pZCAqcGFyYW1zKTsKLXZvaWQgICAgRVZUQVBJIEVWVF9nZXRIZWFydEJlYXRDYWxsYmFjayhfRVZUX2hlYXJ0QmVhdENhbGxiYWNrICpjYWxsYmFjayx2b2lkICoqcGFyYW1zKTsKLQotLyogSW50ZXJuYWwgZnVuY3Rpb25zIHRvIGluaXRpYWxpc2UgYW5kIGtpbGwgdGhlIGV2ZW50IG1hbmFnZXIuIE1HTAotICogYXBwbGljYXRpb25zIHNob3VsZCBuZXZlciBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSBhcyB0aGUgTUdMCi0gKiBsaWJyYXJpZXMgZG8gaXQgZm9yIHlvdS4KLSAqLwotCi0vKiB7c2VjcmV0fSAqLwotdm9pZCAgICBFVlRBUEkgRVZUX2luaXQoX0VWVF9tb3VzZU1vdmVIYW5kbGVyIG1vdXNlTW92ZSk7Ci0vKiB7c2VjcmV0fSAqLwotdm9pZCAgICBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoaW50IHhSZXMsaW50IHlSZXMpOwotLyoge3NlY3JldH0gKi8KLXZvaWQgICAgRVZUQVBJIEVWVF9zdXNwZW5kKHZvaWQpOwotLyoge3NlY3JldH0gKi8KLXZvaWQgICAgRVZUQVBJIEVWVF9yZXN1bWUodm9pZCk7Ci0vKiB7c2VjcmV0fSAqLwotdm9pZCAgICBFVlRBUEkgRVZUX2V4aXQodm9pZCk7Ci0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLX0gICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgKi8KLSNlbmRpZiAgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmICAvKiBfX0VWRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9tdHJyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvbXRyci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjk4MTJjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9tdHJyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgZGVmaW5pbmcgdGhlIGV4dGVybmFsIHJpbmcgMCBoZWxwZXIgZnVuY3Rpb25zCi0qICAgICAgICAgICAgICAgbmVlZGVkIGJ5IHRoZSBNVFJSIG1vZHVsZS4gVGhlc2UgZnVuY3Rpb25zIG1heSBiZSBpbmNsdWRlZAotKiAgICAgICAgICAgICAgIGRpcmVjdGx5IGZvciBuYXRpdmUgcmluZyAwIGRldmljZSBkcml2ZXJzLCBvciB0aGV5IG1heQotKiAgICAgICAgICAgICAgIGJlIGNhbGxzIGRvd24gdG8gYSByaW5nIDAgaGVscGVyIGRldmljZSBkcml2ZXIgd2hlcmUKLSogICAgICAgICAgICAgICBhcHByb3ByaWF0ZSAob3IgdGhlIGVudGlyZSBNVFJSIG1vZHVsZSBtYXkgYmUgbG9jYXRlZCBpbgotKiAgICAgICAgICAgICAgIHRoZSBkZXZpY2UgZHJpdmVyIGlmIHRoZSBkZXZpY2UgZHJpdmVyIGlzIDMyLWJpdCkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fTVRSUl9ICi0jZGVmaW5lIF9fTVRSUl9ICi0KLSNpbmNsdWRlICJzY2l0ZWNoLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyAgICAgICAgICAgIC8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCi0jZW5kaWYKLQotLyogSW50ZXJuYWwgZnVuY3Rpb25zIChyZXF1aXJlcyByaW5nIDAgYWNjZXNzIG9yIGhlbHBlciBmdW5jdGlvbnMhKSAqLwotCi12b2lkICAgIE1UUlJfaW5pdCh2b2lkKTsKLWludCAgICAgTVRSUl9lbmFibGVXcml0ZUNvbWJpbmUodWxvbmcgYmFzZSx1bG9uZyBzaXplLHVpbnQgdHlwZSk7Ci0KLS8qIEV4dGVybmFsIGFzc2VtYmxlciBoZWxwZXIgZnVuY3Rpb25zICovCi0KLWlib29sICAgX0FTTUFQSSBfTVRSUl9pc1JpbmcwKHZvaWQpOwotdWxvbmcgICBfQVNNQVBJIF9NVFJSX2Rpc2FibGVJbnQodm9pZCk7Ci12b2lkICAgIF9BU01BUEkgX01UUlJfcmVzdG9yZUludCh1bG9uZyBmbGFncyk7Ci11bG9uZyAgIF9BU01BUEkgX01UUlJfc2F2ZUNSNCh2b2lkKTsKLXZvaWQgICAgX0FTTUFQSSBfTVRSUl9yZXN0b3JlQ1I0KHVsb25nIGNyNFZhbCk7Ci11Y2hhciAgIF9BU01BUEkgX01UUlJfZ2V0Q3g4Nih1Y2hhciByZWcpOwotdm9pZCAgICBfQVNNQVBJIF9NVFJSX3NldEN4ODYodWNoYXIgcmVnLHVjaGFyIGRhdGEpOwotI2lmZGVmICBfXzE2QklUX18KLXZvaWQgICAgX0FTTUFQSSBfTVRSUl9yZWFkTVNSKHVsb25nIHJlZywgdWxvbmcgZmFyICplYXgsIHVsb25nIGZhciAqZWR4KTsKLSNlbHNlCi12b2lkICAgIF9BU01BUEkgX01UUlJfcmVhZE1TUih1bG9uZyByZWcsIHVsb25nICplYXgsIHVsb25nICplZHgpOwotI2VuZGlmCi12b2lkICAgIF9BU01BUEkgX01UUlJfd3JpdGVNU1IodWxvbmcgcmVnLCB1bG9uZyBlYXgsIHVsb25nIGVkeCk7Ci0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLX0gICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgKi8KLSNlbmRpZgotCi0jZW5kaWYgIC8qIF9fTVRSUl9IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcGNpbGliLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcGNpbGliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOGY4ZWYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BjaWxpYi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBpbnRlcmZhY2Ugcm91dGluZXMgdG8gdGhlIFBDSSBidXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fUENJTElCX0gKLSNkZWZpbmUgX19QQ0lMSUJfSAotCi0jaW5jbHVkZSAic2NpdGVjaC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIHBhY2soMSkKLQotLyogRGVmaW5lcyBmb3IgUENJRGV2aWNlSW5mby5IZWFkZXJUeXBlICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgUENJX2RldmljZVR5cGUgICAgICAgICAgICAgICAgICA9IDB4MDAsCi0gICAgUENJX2JyaWRnZVR5cGUgICAgICAgICAgICAgICAgICA9IDB4MDEsCi0gICAgUENJX2NhcmRCdXNCcmlkZ2VUeXBlICAgICAgICAgICA9IDB4MDIsCi0gICAgUENJX211bHRpRnVuY3Rpb25UeXBlICAgICAgICAgICA9IDB4ODAKLSAgICB9IFBDSUhlYWRlclR5cGVGbGFnczsKLQotLyogRGVmaW5lcyBmb3IgUENJRGV2aWNlSW5mby5Db21tYW5kICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgUENJX2VuYWJsZUlPU3BhY2UgICAgICAgICAgICAgICA9IDB4MDAwMSwKLSAgICBQQ0lfZW5hYmxlTWVtb3J5U3BhY2UgICAgICAgICAgID0gMHgwMDAyLAotICAgIFBDSV9lbmFibGVCdXNNYXN0ZXIgICAgICAgICAgICAgPSAweDAwMDQsCi0gICAgUENJX2VuYWJsZVNwZWNpYWxDeWxjZXMgICAgICAgICA9IDB4MDAwOCwKLSAgICBQQ0lfZW5hYmxlV3JpdGVBbmRJbnZhbGlkYXRlICAgID0gMHgwMDEwLAotICAgIFBDSV9lbmFibGVWR0FDb21wYXRpYmxlUGFsZXR0ZSAgPSAweDAwMjAsCi0gICAgUENJX2VuYWJsZVBhcml0eSAgICAgICAgICAgICAgICA9IDB4MDA0MCwKLSAgICBQQ0lfZW5hYmxlV2FpdEN5Y2xlICAgICAgICAgICAgID0gMHgwMDgwLAotICAgIFBDSV9lbmFibGVTZXJyICAgICAgICAgICAgICAgICAgPSAweDAxMDAsCi0gICAgUENJX2VuYWJsZUZhc3RCYWNrVG9CYWNrICAgICAgICA9IDB4MDIwMAotICAgIH0gUENJQ29tbWFuZEZsYWdzOwotCi0vKiBEZWZpbmVzIGZvciBQQ0lEZXZpY2VJbmZvLlN0YXR1cyAqLwotCi10eXBlZGVmIGVudW0gewotICAgIFBDSV9zdGF0dXNDYXBhYmlsaXRpZXNMaXN0ICAgICAgPSAweDAwMTAsCi0gICAgUENJX3N0YXR1czY2TWh6Q2FwYWJsZSAgICAgICAgICA9IDB4MDAyMCwKLSAgICBQQ0lfc3RhdHVzVURGU3VwcG9ydGVkICAgICAgICAgID0gMHgwMDQwLAotICAgIFBDSV9zdGF0dXNGYXN0QmFja1RvQmFjayAgICAgICAgPSAweDAwODAsCi0gICAgUENJX3N0YXR1c0RhdGFQYXJpdHlEZXRlY3RlZCAgICA9IDB4MDEwMCwKLSAgICBQQ0lfc3RhdHVzRGV2U2VsICAgICAgICAgICAgICAgID0gMHgwNjAwLAotICAgIFBDSV9zdGF0dXNTaWduYWxlZFRhcmdldEFib3J0ICAgPSAweDA4MDAsCi0gICAgUENJX3N0YXR1c1JlY2lldmVkVGFyZ2V0QWJvcnQgICA9IDB4MTAwMCwKLSAgICBQQ0lfc3RhdHVzUmVjaWV2ZWRNYXN0ZXJBYm9ydCAgID0gMHgyMDAwLAotICAgIFBDSV9zdGF0dXNTaWduYWxlZFN5c3RlbUVycm9yICAgPSAweDQwMDAsCi0gICAgUENJX3N0YXR1c0RldGVjdGVkUGFyaXR5RXJyb3IgICA9IDB4ODAwMAotICAgIH0gUENJU3RhdHVzRmxhZ3M7Ci0KLS8qIFBDSSBjYXBhYmlsaXR5IElEcyAqLwotCi10eXBlZGVmIGVudW0gewotICAgIFBDSV9jYXBzUG93ZXJNYW5hZ2VtZW50ICAgICAgICAgPSAweDAxLAotICAgIFBDSV9jYXBzQUdQICAgICAgICAgICAgICAgICAgICAgPSAweDAyLAotICAgIFBDSV9jYXBzTVNJICAgICAgICAgICAgICAgICAgICAgPSAweDA1Ci0gICAgfSBQQ0lDYXBzVHlwZTsKLQotLyogUENJIEFHUCByYXRlIGRlZmluaXRpb25zICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgUENJX0FHUFJhdGUxWCAgICAgICAgICAgICAgICAgICA9IDB4MSwKLSAgICBQQ0lfQUdQUmF0ZTJYICAgICAgICAgICAgICAgICAgID0gMHgyLAotICAgIFBDSV9BR1BSYXRlNFggICAgICAgICAgICAgICAgICAgPSAweDQKLSAgICB9IFBDSUFHUFJhdGVUeXBlOwotCi0vKiBOT1RFOiBXZSBkZWZpbmUgYWxsIGJpdGZpZWxkJ3MgYXMgdWludCdzLCBzcGVjaWZpY2FsbHkgc28gdGhhdCB0aGUgSUJNCi0gKiAgICAgICBWaXN1YWwgQWdlIEMrKyBjb21waWxlciBkb2VzIG5vdCBjb21wbGFpbi4gV2UgbmVlZCB0aGVtIHRvIGJlCi0gKiAgICAgICAzMi1iaXRzIHdpZGUsIGFuZCB0aGlzIGlzIHRoZSB3aWR0aCBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyLCBidXQKLSAqICAgICAgIHdlIGNhbid0IHVzZSBhIHVsb25nIHRvIG1ha2UgdGhpcyBleHBsaWNpdCBvciB3ZSBnZXQgZXJyb3JzLgotICovCi0KLS8qIFN0cnVjdHVyZSBkZWZpbmluZyBhIFBDSSBzbG90IGlkZW50aWZpZXIgKi8KLQotdHlwZWRlZiB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLQl1aW50ICAgIFplcm86MjsKLQl1aW50ICAgIFJlZ2lzdGVyOjY7Ci0JdWludCAgICBGdW5jdGlvbjozOwotCXVpbnQgICAgRGV2aWNlOjU7Ci0JdWludCAgICBCdXM6ODsKLQl1aW50ICAgIFJlc2VydmVkOjc7Ci0JdWludCAgICBFbmFibGU6MTsKLQl9IHA7Ci0gICAgdWxvbmcgICBpOwotICAgIH0gUENJc2xvdDsKLQotLyogU3RydWN0dXJlIGRlZmluaW5nIHRoZSByZWd1bGFyICh0eXBlIDApIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCi0gKiBsYXlvdXQuIFdlIHVzZSB0aGlzIGluIGEgdW5pb24gYmVsb3cgc28gd2UgY2FuIGRlc2NyaWJlIGFsbCB0eXBlcyBvZgotICogUENJIGNvbmZpZ3VyYXRpb24gc3BhY2VzIHdpdGggYSBzaW5nbGUgc3RydWN0dXJlLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMTA7Ci0gICAgdWxvbmcgICBCYXNlQWRkcmVzczE0OwotICAgIHVsb25nICAgQmFzZUFkZHJlc3MxODsKLSAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMUM7Ci0gICAgdWxvbmcgICBCYXNlQWRkcmVzczIwOwotICAgIHVsb25nICAgQmFzZUFkZHJlc3MyNDsKLSAgICB1bG9uZyAgIENhcmRidXNDSVNQb2ludGVyOwotICAgIHVzaG9ydCAgU3ViU3lzdGVtVmVuZG9ySUQ7Ci0gICAgdXNob3J0ICBTdWJTeXN0ZW1JRDsKLSAgICB1bG9uZyAgIFJPTUJhc2VBZGRyZXNzOwotICAgIHVjaGFyICAgQ2FwYWJpbGl0aWVzUG9pbnRlcjsKLSAgICB1Y2hhciAgIHJlc2VydmVkMTsKLSAgICB1Y2hhciAgIHJlc2VydmVkMjsKLSAgICB1Y2hhciAgIHJlc2VydmVkMzsKLSAgICB1bG9uZyAgIHJlc2VydmVkNDsKLSAgICB1Y2hhciAgIEludGVycnVwdExpbmU7Ci0gICAgdWNoYXIgICBJbnRlcnJ1cHRQaW47Ci0gICAgdWNoYXIgICBNaW5pbXVtR3JhbnQ7Ci0gICAgdWNoYXIgICBNYXhpbXVtTGF0ZW5jeTsKLQotICAgIC8qIFRoZXNlIGFyZSBub3QgaW4gdGhlIGFjdHVhbCBjb25maWcgc3BhY2UsIGJ1dCB3ZSBlbnVtZXJhdGUgdGhlbSAqLwotICAgIHVsb25nICAgQmFzZUFkZHJlc3MxMExlbjsKLSAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMTRMZW47Ci0gICAgdWxvbmcgICBCYXNlQWRkcmVzczE4TGVuOwotICAgIHVsb25nICAgQmFzZUFkZHJlc3MxQ0xlbjsKLSAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMjBMZW47Ci0gICAgdWxvbmcgICBCYXNlQWRkcmVzczI0TGVuOwotICAgIHVsb25nICAgUk9NQmFzZUFkZHJlc3NMZW47Ci0gICAgfSBQQ0lUeXBlMEluZm87Ci0KLS8qIFN0cnVjdHVyZSBkZWZpbmluZyBQQ0kgdG8gUENJIGJyaWRnZSAodHlwZSAxKSBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcgotICogbGF5b3V0LiBXZSB1c2UgdGhpcyBpbiBhIHVuaW9uIGJlbG93IHNvIHdlIGNhbiBkZXNjcmliZSBhbGwgdHlwZXMgb2YKLSAqIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlcyB3aXRoIGEgc2luZ2xlIHN0cnVjdHVyZS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWxvbmcgICBCYXNlQWRkcmVzczEwOwotICAgIHVsb25nICAgQmFzZUFkZHJlc3MxNDsKLSAgICB1Y2hhciAgIFByaW1hcnlCdXNOdW1iZXI7Ci0gICAgdWNoYXIgICBTZWNvbmRheUJ1c051bWJlcjsKLSAgICB1Y2hhciAgIFN1Ym9yZGluYXRlQnVzTnVtYmVyOwotICAgIHVjaGFyICAgU2Vjb25kYXJ5TGF0ZW5jeVRpbWVyOwotICAgIHVjaGFyICAgSU9CYXNlOwotICAgIHVjaGFyICAgSU9MaW1pdDsKLSAgICB1c2hvcnQgIFNlY29uZGFyeVN0YXR1czsKLSAgICB1c2hvcnQgIE1lbW9yeUJhc2U7Ci0gICAgdXNob3J0ICBNZW1vcnlMaW1pdDsKLSAgICB1c2hvcnQgIFByZWZldGNoYWJsZU1lbW9yeUJhc2U7Ci0gICAgdXNob3J0ICBQcmVmZXRjaGFibGVNZW1vcnlMaW1pdDsKLSAgICB1bG9uZyAgIFByZWZldGNoYWJsZUJhc2VIaTsKLSAgICB1bG9uZyAgIFByZWZldGNoYWJsZUxpbWl0SGk7Ci0gICAgdXNob3J0ICBJT0Jhc2VIaTsKLSAgICB1c2hvcnQgIElPTGltaXRIaTsKLSAgICB1Y2hhciAgIENhcGFiaWxpdGllc1BvaW50ZXI7Ci0gICAgdWNoYXIgICByZXNlcnZlZDE7Ci0gICAgdWNoYXIgICByZXNlcnZlZDI7Ci0gICAgdWNoYXIgICByZXNlcnZlZDM7Ci0gICAgdWxvbmcgICBST01CYXNlQWRkcmVzczsKLSAgICB1Y2hhciAgIEludGVycnVwdExpbmU7Ci0gICAgdWNoYXIgICBJbnRlcnJ1cHRQaW47Ci0gICAgdXNob3J0ICBCcmlkZ2VDb250cm9sOwotICAgIH0gUENJVHlwZTFJbmZvOwotCi0vKiBQQ0kgdG8gQ2FyZEJ1cyBicmlkZ2UgKHR5cGUgMikgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgU29ja2V0UmVnaXN0ZXJzQmFzZUFkZHJlc3M7Ci0gICAgdWNoYXIgICBDYXBhYmlsaXRpZXNQb2ludGVyOwotICAgIHVjaGFyICAgcmVzZXJ2ZWQxOwotICAgIHVzaG9ydCAgU2Vjb25kYXJ5U3RhdHVzOwotICAgIHVjaGFyICAgUHJpbWFyeUJ1czsKLSAgICB1Y2hhciAgIFNlY29uZGFyeUJ1czsKLSAgICB1Y2hhciAgIFN1Ym9yZGluYXRlQnVzOwotICAgIHVjaGFyICAgU2Vjb25kYXJ5TGF0ZW5jeTsKLSAgICBzdHJ1Y3QgIHsKLQl1bG9uZyAgIEJhc2U7Ci0JdWxvbmcgICBMaW1pdDsKLQl9IFJhbmdlWzRdOwotICAgIHVjaGFyICAgSW50ZXJydXB0TGluZTsKLSAgICB1Y2hhciAgIEludGVycnVwdFBpbjsKLSAgICB1c2hvcnQgIEJyaWRnZUNvbnRyb2w7Ci0gICAgfSBQQ0lUeXBlMkluZm87Ci0KLS8qIFN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgaW5mb3JtYXRpb24gZm9yIGEKLSAqIHNpbmdsZSBQQ0kgZGV2aWNlIG9uIHRoZSBQQ0kgYnVzLiBXZSBlbnVtZXJhdGUgYWxsIHRoaXMgaW5mb3JtYXRpb24KLSAqIGZvciBhbGwgUENJIGRldmljZXMgb24gdGhlIGJ1cy4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWxvbmcgICAgICAgICAgICAgICBkd1NpemU7Ci0gICAgUENJc2xvdCAgICAgICAgICAgICBzbG90OwotICAgIHVsb25nICAgICAgICAgICAgICAgbWVjaDE7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBWZW5kb3JJRDsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIERldmljZUlEOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgQ29tbWFuZDsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIFN0YXR1czsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIFJldklEOwotICAgIHVjaGFyICAgICAgICAgICAgICAgSW50ZXJmYWNlOwotICAgIHVjaGFyICAgICAgICAgICAgICAgU3ViQ2xhc3M7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBCYXNlQ2xhc3M7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBDYWNoZUxpbmVTaXplOwotICAgIHVjaGFyICAgICAgICAgICAgICAgTGF0ZW5jeVRpbWVyOwotICAgIHVjaGFyICAgICAgICAgICAgICAgSGVhZGVyVHlwZTsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIEJJU1Q7Ci0gICAgdW5pb24gewotCVBDSVR5cGUwSW5mbyAgICB0eXBlMDsKLQlQQ0lUeXBlMUluZm8gICAgdHlwZTE7Ci0JUENJVHlwZTJJbmZvICAgIHR5cGUyOwotCX0gdTsKLSAgICB9IFBDSURldmljZUluZm87Ci0KLS8qIFBDSSBDYXBhYmlsaXR5IGhlYWRlciBzdHJ1Y3R1cmUuIEFsbCBQQ0kgY2FwYWJpbGl0aWVzIGhhdmUgdGhlCi0gKiBmb2xsb3dpbmcgaGVhZGVyLgotICoKLSAqIGNhcHNJRCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3R1cmUgYXMgZGVmaW5lIGFib3ZlLgotICoKLSAqIG5leHQgaXMgdGhlIG9mZnNldCBpbiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSAoMHg0MC0weEZDKSBvZiB0aGUKLSAqIG5leHQgY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgaW4gdGhlIGxpc3QsIG9yIDB4MDAgaWYgdGhlcmUgYXJlIG5vIG1vcmUKLSAqIGVudHJpZXMuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVjaGFyICAgY2Fwc0lEOwotICAgIHVjaGFyICAgbmV4dDsKLSAgICB9IFBDSUNhcHNIZWFkZXI7Ci0KLS8qIFN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUENJIEFHUCBzdGF0dXMgcmVnaXN0ZXIgY29udGVudHMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQgICAgcmF0ZTozOwotICAgIHVpbnQgICAgcnN2ZDE6MTsKLSAgICB1aW50ICAgIGZhc3RXcml0ZToxOwotICAgIHVpbnQgICAgZm91ckdCOjE7Ci0gICAgdWludCAgICByc3ZkMjozOwotICAgIHVpbnQgICAgc2lkZUJhbmRBZGRyZXNzaW5nOjE7Ci0gICAgdWludCAgICByc3ZkMzoxNDsKLSAgICB1aW50ICAgIHJlcXVlc3RRdWV1ZURlcHRoTWF4aW11bTo4OwotICAgIH0gUENJQUdQU3RhdHVzOwotCi0vKiBTdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFBDSSBBR1AgY29tbWFuZCByZWdpc3RlciBjb250ZW50cyAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWludCAgICByYXRlOjM7Ci0gICAgdWludCAgICByc3ZkMToxOwotICAgIHVpbnQgICAgZmFzdFdyaXRlRW5hYmxlOjE7Ci0gICAgdWludCAgICBmb3VyR0JFbmFibGU6MTsKLSAgICB1aW50ICAgIHJzdmQyOjI7Ci0gICAgdWludCAgICBBR1BFbmFibGU6MTsKLSAgICB1aW50ICAgIFNCQUVuYWJsZToxOwotICAgIHVpbnQgICAgcnN2ZDM6MTQ7Ci0gICAgdWludCAgICByZXF1ZXN0UXVldWVEZXB0aDo4OwotICAgIH0gUENJQUdQQ29tbWFuZDsKLQotLyogQUdQIENhcGFiaWxpdHkgc3RydWN0dXJlICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBQQ0lDYXBzSGVhZGVyICAgaDsKLSAgICB1c2hvcnQgICAgICAgICAgbWFqTWluOwotICAgIFBDSUFHUFN0YXR1cyAgICBBR1BTdGF0dXM7Ci0gICAgUENJQUdQQ29tbWFuZCAgIEFHUENvbW1hbmQ7Ci0gICAgfSBQQ0lBR1BDYXBhYmlsaXR5OwotCi0vKiBTdHJ1Y3R1cmUgZm9yIG9idGFpbmluZyB0aGUgUENJIElSUSByb3V0aW5nIGluZm9ybWF0aW9uICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1Y2hhciAgIGJ1czsKLSAgICB1Y2hhciAgIGRldmljZTsKLSAgICB1Y2hhciAgIGxpbmtBOwotICAgIHVzaG9ydCAgbWFwQTsKLSAgICB1Y2hhciAgIGxpbmtCOwotICAgIHVzaG9ydCAgbWFwQjsKLSAgICB1Y2hhciAgIGxpbmtDOwotICAgIHVzaG9ydCAgbWFwQzsKLSAgICB1Y2hhciAgIGxpbmtEOwotICAgIHVzaG9ydCAgbWFwRDsKLSAgICB1Y2hhciAgIHNsb3Q7Ci0gICAgdWNoYXIgICByZXNlcnZlZDsKLSAgICB9IFBDSVJvdXRlSW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVzaG9ydCAgICAgICAgICBCdWZmZXJTaXplOwotICAgIFBDSVJvdXRlSW5mbyAgICAqRGF0YUJ1ZmZlcjsKLSAgICB9IFBDSVJvdXRpbmdPcHRpb25zQnVmZmVyOwotCi0jZGVmaW5lIE5VTV9QQ0lfUkVHICAgICAgICAgICAgICAgICAoc2l6ZW9mKFBDSURldmljZUluZm8pIC8gNCkgLSAxMAotI2RlZmluZSBQQ0lfQlJJREdFX0NMQVNTICAgICAgICAgICAgMHgwNgotI2RlZmluZSBQQ0lfSE9TVF9CUklER0VfU1VCQ0xBU1MgICAgMHgwMAotI2RlZmluZSBQQ0lfRUFSTFlfVkdBX0NMQVNTICAgICAgICAgMHgwMAotI2RlZmluZSBQQ0lfRUFSTFlfVkdBX1NVQkNMQVNTICAgICAgMHgwMQotI2RlZmluZSBQQ0lfRElTUExBWV9DTEFTUyAgICAgICAgICAgMHgwMwotI2RlZmluZSBQQ0lfRElTUExBWV9WR0FfU1VCQ0xBU1MgICAgMHgwMAotI2RlZmluZSBQQ0lfRElTUExBWV9YR0FfU1VCQ0xBU1MgICAgMHgwMQotI2RlZmluZSBQQ0lfRElTUExBWV9PVEhFUl9TVUJDTEFTUyAgMHg4MAotI2RlZmluZSBQQ0lfTU1fQ0xBU1MgICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBQQ0lfQVVESU9fU1VCQ0xBU1MgICAgICAgICAgMHgwMQotCi0vKiBNYWNyb3MgdG8gZGV0ZWN0IHNwZWNpZmljIGNsYXNzZXMgb2YgZGV2aWNlcyAqLwotCi0jZGVmaW5lIFBDSV9JU18zRExBQlNfTk9OVkdBX0NMQVNTKHBjaSkgXAotICAgKCgocGNpKS0+QmFzZUNsYXNzID09IFBDSV9ESVNQTEFZX0NMQVNTICYmIChwY2kpLT5TdWJDbGFzcyA9PSBQQ0lfRElTUExBWV9PVEhFUl9TVUJDTEFTUykgXAotICYmICgocGNpKS0+VmVuZG9ySUQgPT0gMHgzRDNEIHx8IChwY2kpLT5WZW5kb3JJRCA9PSAweDEwNEMpKQotCi0jZGVmaW5lIFBDSV9JU19ESVNQTEFZX0NMQVNTKHBjaSkgXAotICAgKCgocGNpKS0+QmFzZUNsYXNzID09IFBDSV9ESVNQTEFZX0NMQVNTICYmIChwY2kpLT5TdWJDbGFzcyA9PSBQQ0lfRElTUExBWV9WR0FfU1VCQ0xBU1MpIFwKLSB8fCAoKHBjaSktPkJhc2VDbGFzcyA9PSBQQ0lfRElTUExBWV9DTEFTUyAmJiAocGNpKS0+U3ViQ2xhc3MgPT0gUENJX0RJU1BMQVlfWEdBX1NVQkNMQVNTKSBcCi0gfHwgKChwY2kpLT5CYXNlQ2xhc3MgPT0gUENJX0VBUkxZX1ZHQV9DTEFTUyAmJiAocGNpKS0+U3ViQ2xhc3MgPT0gUENJX0VBUkxZX1ZHQV9TVUJDTEFTUykgXAotIHx8IFBDSV9JU18zRExBQlNfTk9OVkdBX0NMQVNTKHBjaSkpCi0KLS8qIEZ1bmN0aW9uIGNvZGVzIHRvIHBhc3MgdG8gUENJX2FjY2Vzc1JlZyAqLwotCi0jZGVmaW5lIFBDSV9SRUFEX0JZVEUgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFBDSV9SRUFEX1dPUkQgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFBDSV9SRUFEX0RXT1JEICAgICAgICAgICAgICAyCi0jZGVmaW5lIFBDSV9XUklURV9CWVRFICAgICAgICAgICAgICAzCi0jZGVmaW5lIFBDSV9XUklURV9XT1JEICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFBDSV9XUklURV9EV09SRCAgICAgICAgICAgICA1Ci0KLS8qIE1hY3JvcyB0byByZWFkL3dyaXRlIFBDSSByZWdpc3RlcnMuIFRoZXNlIGFzc3VtZSBhIGdsb2JhbCBQQ0kgYXJyYXkKLSAqIG9mIGRldmljZSBpbmZvcm1hdGlvbi4KLSAqLwotCi0jZGVmaW5lIFBDSV9yZWFkUENJUmVnQihpbmRleCxkZXZpY2UpICAgXAotICAgIFBDSV9hY2Nlc3NSZWcoaW5kZXgsMCwwLCZQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0pCi0KLSNkZWZpbmUgUENJX3JlYWRQQ0lSZWdXKGluZGV4LGRldmljZSkgICBcCi0gICAgUENJX2FjY2Vzc1JlZyhpbmRleCwwLDEsJlBDSVtEZXZpY2VJbmRleFtkZXZpY2VdXSkKLQotI2RlZmluZSBQQ0lfcmVhZFBDSVJlZ0woaW5kZXgsZGV2aWNlKSAgIFwKLSAgICBQQ0lfYWNjZXNzUmVnKGluZGV4LDAsMiwmUENJW0RldmljZUluZGV4W2RldmljZV1dKQotCi0jZGVmaW5lIFBDSV93cml0ZVBDSVJlZ0IoaW5kZXgsdmFsdWUsZGV2aWNlKSAgICBcCi0gICAgUENJX2FjY2Vzc1JlZyhpbmRleCx2YWx1ZSwzLCZQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0pCi0KLSNkZWZpbmUgUENJX3dyaXRlUENJUmVnVyhpbmRleCx2YWx1ZSxkZXZpY2UpICAgIFwKLSAgICBQQ0lfYWNjZXNzUmVnKGluZGV4LHZhbHVlLDQsJlBDSVtEZXZpY2VJbmRleFtkZXZpY2VdXSkKLQotI2RlZmluZSBQQ0lfd3JpdGVQQ0lSZWdMKGluZGV4LHZhbHVlLGRldmljZSkgICAgXAotICAgIFBDSV9hY2Nlc3NSZWcoaW5kZXgsdmFsdWUsNSwmUENJW0RldmljZUluZGV4W2RldmljZV1dKQotCi0jcHJhZ21hIHBhY2soKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLS8qIEZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIFBDSSBkZXZpY2VzIGluIHRoZSBzeXN0ZW0gKi8KLQotaW50ICAgICBfQVNNQVBJIFBDSV9nZXROdW1EZXZpY2VzKHZvaWQpOwotCi0vKiBGdW5jdGlvbiB0byBlbnVtZXJhdGUgYWxsIGRldmljZSBvbiB0aGUgUENJIGJ1cyAqLwotCi1pbnQgICAgIF9BU01BUEkgUENJX2VudW1lcmF0ZShQQ0lEZXZpY2VJbmZvIGluZm9bXSk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGFjY2VzcyBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KLQotdWxvbmcgICBfQVNNQVBJIFBDSV9hY2Nlc3NSZWcoaW50IGluZGV4LHVsb25nIHZhbHVlLGludCBmdW5jLFBDSURldmljZUluZm8gKmluZm8pOwotCi0vKiBGdW5jdGlvbiB0byBnZXQgUENJIElSUSByb3V0aW5nIG9wdGlvbnMgZm9yIGEgY2FyZCAqLwotCi1pbnQgICAgIF9BU01BUEkgUENJX2dldElSUVJvdXRpbmdPcHRpb25zKGludCBudW1EZXZpY2VzLFBDSVJvdXRlSW5mbyAqYnVmZmVyKTsKLQotLyogRnVuY3Rpb24gdG8gcmUtcm91dGUgdGhlIFBDSSBJUlEgc2V0dGluZyBmb3IgYSBkZXZpY2UgKi8KLQotaWJvb2wgICBfQVNNQVBJIFBDSV9zZXRIYXJkd2FyZUlSUShQQ0lEZXZpY2VJbmZvICppbmZvLHVpbnQgaW50UGluLHVpbnQgSVJRKTsKLQotLyogRnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSBzcGVjaWFsIGN5bGUgb24gdGhlIHNwZWNpZmllZCBQQ0kgYnVzICovCi0KLXZvaWQgICAgX0FTTUFQSSBQQ0lfZ2VuZXJhdGVTcGVjaWFsQ3lsZSh1aW50IGJ1cyx1bG9uZyBzcGVjaWFsQ3ljbGVEYXRhKTsKLQotLyogRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgUENJIGJhc2UgYWRkcmVzcyByZWdpc3RlciAqLwotCi11bG9uZyAgIF9BU01BUEkgUENJX2ZpbmRCQVJTaXplKGludCBiYXIsUENJRGV2aWNlSW5mbyAqcGNpKTsKLQotLyogRnVuY3Rpb24gdG8gcmVhZCBhIGJsb2NrIG9mIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHJlZ2lzdGVycyAqLwotCi12b2lkICAgIF9BU01BUEkgUENJX3JlYWRSZWdCbG9jayhQQ0lEZXZpY2VJbmZvICppbmZvLGludCBpbmRleCx2b2lkICpkc3QsaW50IGNvdW50KTsKLQotLyogRnVuY3Rpb24gdG8gd3JpdGUgYSBibG9jayBvZiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlcnMgKi8KLQotdm9pZCAgICBfQVNNQVBJIFBDSV93cml0ZVJlZ0Jsb2NrKFBDSURldmljZUluZm8gKmluZm8saW50IGluZGV4LHZvaWQgKnNyYyxpbnQgY291bnQpOwotCi0vKiBGdW5jdGlvbiB0byByZXR1cm4gdGhlIDMyLWJpdCBQQ0kgQklPUyBlbnRyeSBwb2ludCAqLwotCi11bG9uZyAgIF9BU01BUEkgUENJQklPU19nZXRFbnRyeSh2b2lkKTsKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAgICAgKi8KLSNlbmRpZgotCi0jZW5kaWYgIC8qIF9fUENJTElCX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbV9oZWxwLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1faGVscC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzZhMmJhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbV9oZWxwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgV2luMzIsIE9TLzIKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgZm9yIHRoZSBTY2lUZWNoIFBvcnRhYmlsaXR5IE1hbmFnZXIgMzItYml0Ci0qICAgICAgICAgICAgICAgaGVscGVyIFZ4RCBmb3IgV2luZG93cyA5eCBmb3IgYW5kIHRoZSAxNi1iaXQgcmluZyAwCi0qICAgICAgICAgICAgICAgaGVscGVyIGRldmljZSBkcml2ZXIgZm9yIE9TLzIuCi0qCi0qICAgICAgICAgICAgICAgVGhpcyBmaWxlIGRvY3VtZW50cyBhbGwgdGhlIHB1YmxpYyBzZXJ2aWNlcyB1c2VkIGJ5IHRoZQotKiAgICAgICAgICAgICAgIFNjaVRlY2ggUG9ydGFiaWxpdHkgTWFuYWdlciBsaWJyYXJ5IGFuZCBTY2lUZWNoIE51Y2xldXMKLSogICAgICAgICAgICAgICBsb2FkZXIgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19QTUhFTFBfSAotI2RlZmluZSBfX1BNSEVMUF9ICi0KLS8qIEluY2x1ZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotCi0jaW5jbHVkZSAic2RkL3NkZHZlci5oIgotI2RlZmluZSBQTUhFTFBfTWFqb3IgICAgICAgICAgICBTRERfUkVMRUFTRV9NQUpPUgotI2RlZmluZSBQTUhFTFBfTWlub3IgICAgICAgICAgICBTRERfUkVMRUFTRV9NSU5PUgotI2RlZmluZSBQTUhFTFBfVkVSU0lPTiAgICAgICAgICAoKFBNSEVMUF9NYWpvciA8PCA4KSB8IFBNSEVMUF9NaW5vcikKLQotI2lmZGVmICBfX09TMl9fCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIFB1YmxpYyBPUy8yIFN1cHBvcnQgZnVuY3Rpb25zCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic2NpdGVjaC5oIgotI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKLQotLyogTmFtZSBvZiBkZXZpY2UgZHJpdmVyICovCi0KLSNkZWZpbmUgUE1IRUxQX05BTUUgICAgICAgICAgICAgICAgIChQU1opInNkZGhlbHAkIgotCi0vKiBNYWluIElPQ1RMIGZ1bmN0aW9uIHRvIHRhbGsgdG8gZGV2aWNlIGRyaXZlciAqLwotCi0jZGVmaW5lIFBNSEVMUF9JT0NUTCAgICAgICAgICAgICAgICAweDAwODAKLQotLyogTWFjcm8gZGVmaW5pdGlvbiBmb3IgZGVmaW5pbmcgSU9DVEwgZnVuY3Rpb24gY29udHJvbCBjb2RlcyBmb3IgdGhlIFNEREhFTFAKLSAqIGRldmljZSBkcml2ZXIgZm9yIE9TLzIuIFNpbWlsYXIgdG8gdGhhdCB1c2VkIGZvciB0aGUgRE9TL1dpbjMyIHZlcnNpb24uCi0gKi8KLQotI2RlZmluZSBQTUhFTFBfQ1RMX0NPREUobmFtZSx2YWx1ZSkgXAotICAgIFBNSEVMUF8jI25hbWUgPSB2YWx1ZQotCi10eXBlZGVmIGVudW0gewotICAgIC8qIFZlcnNpb24gZnVuY3Rpb24gdXNlZCBieSBhbGwgZHJpdmVycyAqLwotICAgIFBNSEVMUF9DVExfQ09ERShHRVRWRVIgICAgICAgICAgICAgICAgICAgICAgLDB4MDAwMSksCi0gICAgUE1IRUxQX0NUTF9DT0RFKE1BUFBIWVMgICAgICAgICAgICAgICAgICAgICAsMHgwMDAyKSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoQUxMT0NMT0NLRUQgICAgICAgICAgICAgICAgICwweDAwMDMpLAotICAgIFBNSEVMUF9DVExfQ09ERShGUkVFTE9DS0VEICAgICAgICAgICAgICAgICAgLDB4MDAwNCksCi0gICAgUE1IRUxQX0NUTF9DT0RFKEdFVEdEVDMyICAgICAgICAgICAgICAgICAgICAsMHgwMDA1KSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoTUFMTE9DU0hBUkVEICAgICAgICAgICAgICAgICwweDAwMDcpLAotICAgIFBNSEVMUF9DVExfQ09ERShGUkVFU0hBUkVEICAgICAgICAgICAgICAgICAgLDB4MDAwOCksCi0gICAgUE1IRUxQX0NUTF9DT0RFKE1BUFRPUFJPQ0VTUyAgICAgICAgICAgICAgICAsMHgwMDA5KSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoRlJFRVBIWVMgICAgICAgICAgICAgICAgICAgICwweDAwMEEpLAotICAgIFBNSEVMUF9DVExfQ09ERShGTFVTSFRMQiAgICAgICAgICAgICAgICAgICAgLDB4MDAwQiksCi0gICAgUE1IRUxQX0NUTF9DT0RFKFNBVkVDUjQgICAgICAgICAgICAgICAgICAgICAsMHgwMDBDKSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoUkVTVE9SRUNSNCAgICAgICAgICAgICAgICAgICwweDAwMEQpLAotICAgIFBNSEVMUF9DVExfQ09ERShSRUFETVNSICAgICAgICAgICAgICAgICAgICAgLDB4MDAwRSksCi0gICAgUE1IRUxQX0NUTF9DT0RFKFdSSVRFTVNSICAgICAgICAgICAgICAgICAgICAsMHgwMDBGKSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoR0VUUEhZU0lDQUxBRERSICAgICAgICAgICAgICwweDAwMTApLAotICAgIFBNSEVMUF9DVExfQ09ERShHRVRQSFlTSUNBTEFERFJSQU5HRSAgICAgICAgLDB4MDAxMSksCi0gICAgUE1IRUxQX0NUTF9DT0RFKExPQ0tQQUdFUyAgICAgICAgICAgICAgICAgICAsMHgwMDEyKSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoVU5MT0NLUEFHRVMgICAgICAgICAgICAgICAgICwweDAwMTMpLAotICAgIFBNSEVMUF9DVExfQ09ERShHRVRTSEFSRURFWFAgICAgICAgICAgICAgICAgLDB4MDA0MiksCi0gICAgUE1IRUxQX0NUTF9DT0RFKFNFVFNIQVJFREVYUCAgICAgICAgICAgICAgICAsMHgwMDQzKSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoR0VUU1RBQ0tTV0lUQ0hSVE4gICAgICAgICAgICwweDAwNDQpLAotICAgIFBNSEVMUF9DVExfQ09ERShHRVRCVUlMRE5PICAgICAgICAgICAgICAgICAgLDB4MDA1MCksCi0gICAgfSBQTUhFTFBfY3RsQ29kZXM7Ci0KLSNlbHNlCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIFB1YmxpYyBET1MvV2luZG93cyBTdXBwb3J0IGZ1bmN0aW9ucwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmICBERVZJQ0VfTUFJTgotI2luY2x1ZGUgPHZ0b29sc2MuaD4KLSNkZWZpbmUgUE1IRUxQX0luaXRfT3JkZXIgICAoVkREX0lOSVRfT1JERVItMSkKLSNkZWZpbmUgUkVUVVJOX0xPTkdTKG4pICAgICAqcC0+ZGlvY19ieXRlc3JldCA9IChuKSAqIHNpemVvZih1bG9uZykKLSNlbmRpZiAgLyogREVWSUNFX01BSU4gKi8KLSNpbmNsdWRlICJzY2l0ZWNoLmgiCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotCi0vKiBXZSBjb25uZWN0IHRvIHRoZSBTRERIRUxQLlZYRCBtb2R1bGUgaWYgaXQgaXMgc3RhdGljbHkgbG9hZGVkIChhcyBwYXJ0Ci0gKiBvZiBTY2lUZWNoIERpc3BsYXkgRG9jdG9yKSwgb3RoZXJ3aXNlIHdlIGR5bmFtaWNhbGx5IGxvYWQgdGhlIFBNSEVMUC5WWEQKLSAqIHB1YmxpYyBoZWxwZXIgVnhELgotICovCi0KLSNkZWZpbmUgUE1IRUxQX0RldmljZUlEICAgICAgICAgMHgwMDAwCi0jZGVmaW5lIFNEREhFTFBfRGV2aWNlSUQgICAgICAgIDB4M0RGOAotI2RlZmluZSBWWERMRFJfRGV2aWNlSUQgICAgICAgICAweDAwMjcKLSNkZWZpbmUgU0RESEVMUF9NT0RVTEUgICAgICAgICAgIlNEREhFTFAiCi0jZGVmaW5lIFNEREhFTFBfTkFNRSAgICAgICAgICAgICJTRERIRUxQLlZYRCIKLSNkZWZpbmUgUE1IRUxQX01PRFVMRSAgICAgICAgICAgIlBNSEVMUCIKLSNkZWZpbmUgUE1IRUxQX05BTUUgICAgICAgICAgICAgIlBNSEVMUC5WWEQiCi0jZGVmaW5lIFBNSEVMUF9EREJOQU1FICAgICAgICAgICJwbWhlbHAgICIKLSNkZWZpbmUgU0RESEVMUF9NT0RVTEVfUEFUSCAgICAgIlxcXFwuXFwiIFNEREhFTFBfTU9EVUxFCi0jZGVmaW5lIFBNSEVMUF9NT0RVTEVfUEFUSCAgICAgICJcXFxcLlxcIiBQTUhFTFBfTU9EVUxFCi0jZGVmaW5lIFBNSEVMUF9WWERfUEFUSCAgICAgICAgICJcXFxcLlxcIiBQTUhFTFBfTkFNRQotCi0vKiBNYWNybyBkZWZpbml0aW9uIGZvciBkZWZpbmluZyBJT0NUTCBmdW5jdGlvbiBjb250cm9sIGNvZGVzIGZvciB0aGUgUE1IRUxQCi0gKiBkZXZpY2UgZHJpdmVycyBmb3IgV2luZG93cyA5eCBhbmQgTlQuIFRoaXMgbWFjcm8gaXMgYmFzaWNhbGx5IGRlcml2ZWQgZnJvbQotICogdGhlIENUTF9DT0RFIG1hY3JvIGluIHRoZSBXaW5kb3dzIDIwMDAgRERLLCBidXQgd2UgaGFyZCBjb2RlIGl0IGhlcmUgdG8KLSAqIGF2b2lkIGhhdmluZyB0byAjaW5jbHVkZSBhbnkgb2YgdGhlIFdpbmRvd3MgMjAwMCBEREsgaGVhZGVyIGZpbGVzLiBXZSBhbHNvCi0gKiBkZWZpbmUgYm90aCBhIDE2LWJpdCBhbmQgMzItYml0IHZlcnNpb24gb2YgdGhlIGNvbnRyb2wgY29kZSB3aXRoaW4gdGhlIHNhbWUKLSAqIG1hY3JvIHRvIHNpbXBsaWZ5IGZ1dHVyZSBhZGRpdGlvbnMuCi0gKgotICogRXNzZW50aWFsbHkgdGhlIFdpbjMyIG1hY3JvIHdvdWxkIG5vcm1hbGx5IGV4cGFuZCB0byB0aGUgZm9sbG93aW5nOgotICoKLSAqICBDVExfQ09ERShGSUxFX0RFVklDRV9WSURFTywweDgwMCt2YWx1ZSxNRVRIT0RfQlVGRkVSRUQsRklMRV9BTllfQUNDRVNTKQotICovCi0KLSNkZWZpbmUgUE1IRUxQX0NUTF9DT0RFKG5hbWUsdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFBNSEVMUF8jI25hbWUgPSB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUE1IRUxQXyMjbmFtZSMjMzIgPSAoKDB4MjMgPDwgMTYpIHwgKDAgPDwgMTQpIHwgKCgweDgwMCt2YWx1ZSkgPDwgMikgfCAoMCkpCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgLyogSW5jbHVkZSBhbGwgdGhlIGNvbnRyb2wgY29kZXMuIFdlIGtlZXAgdGhlbSBpbiBhIHNlcGFyYXRlIGhlYWRlcgotICAgICAqIGZpbGUgc28gd2UgY2FuIGluY2x1ZGUgdGhlbSBpbiBtdWx0aXBsZSBwbGFjZXMgdG8gbWFrZSB0aGlzCi0gICAgICogbW9yZSB2ZXJzYXRpbGUuCi0gICAgICovCi0gICAgI2luY2x1ZGUgInBtX3djdGwuaCIKLSAgICB9IFBNSEVMUF9jdGxDb2RlczsKLQotLyogRm9yIHJlYWwgbW9kZSBWeEQgY2FsbHMsIHdlIHB1dCB0aGUgZnVuY3Rpb24gbnVtYmVyIGludG8gdGhlIGhpZ2gKLSAqIG9yZGVyIHdvcmQgb2YgRUFYLCBhbmQgYSB2YWx1ZSBvZiAweDRGRkYgaW4gQVguIFRoaXMgYWxsb3dzIG91cgotICogVnhEIGhhbmRsZXIgd2hpY2ggaXMgc2V0IHVwIHRvIGhhbmRsZSBJbnQgMTAncyB0byByZWNvZ25pc2UgYSBuYXRpdmUKLSAqIFBNSEVMUCBBUEkgY2FsbCBmcm9tIGEgcmVhbCBtb2RlIERPUyBwcm9ncmFtLgotICovCi0KLSNpZmRlZiAgUkVBTE1PREUKLSNkZWZpbmUgQVBJX05VTShudW0pICAgICgoKHVsb25nKShudW0pIDw8IDE2KSB8IDB4NEZGRikKLSNlbHNlCi0jZGVmaW5lIEFQSV9OVU0obnVtKSAgICAobnVtKQotI2VuZGlmCi0KLSNlbmRpZiAgLyogIV9fT1MyX18gKi8KLQotI2VuZGlmICAvKiBfX1BNSEVMUF9IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1fd2N0bC5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtX3djdGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhYTE1ZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1fd2N0bC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgV2luMzIsIE9TLzIKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSB0byBkZWZpbmUgYWxsIHRoZSBjb250cm9sIGNvZGVzIGZvciB0aGUgRE9TCi0qICAgICAgICAgICAgICAgYW5kIFdpbjMyIGRldmljZSBkcml2ZXIgQVBJJ3MgZm9yIGNhbGxpbmcgZnJvbSByaW5nIDMKLSogICAgICAgICAgICAgICBpbnRvIHRoZSByaW5nIDAgZGV2aWNlIGRyaXZlcnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBWZXJzaW9uIGZ1bmN0aW9uIHVzZWQgYnkgYWxsIGRyaXZlcnMgKi8KLVBNSEVMUF9DVExfQ09ERShHRVRWRVIgICAgICAgICAgICAgICAgICAgICAgLDB4MDAwMCksCi0KLS8qIEZ1bmN0aW9ucyB1c2VkIGJ5IG9ic29sZXRlIDE2LWJpdCBET1MgVFNSICovCi1QTUhFTFBfQ1RMX0NPREUoUkRSRUdCICAgICAgICAgICAgICAgICAgICAgICwweDAwMDMpLAotUE1IRUxQX0NUTF9DT0RFKFdSUkVHQiAgICAgICAgICAgICAgICAgICAgICAsMHgwMDA0KSwKLVBNSEVMUF9DVExfQ09ERShSRFJFR1cgICAgICAgICAgICAgICAgICAgICAgLDB4MDAwNSksCi1QTUhFTFBfQ1RMX0NPREUoV1JSRUdXICAgICAgICAgICAgICAgICAgICAgICwweDAwMDYpLAotUE1IRUxQX0NUTF9DT0RFKFJEUkVHTCAgICAgICAgICAgICAgICAgICAgICAsMHgwMDA4KSwKLVBNSEVMUF9DVExfQ09ERShXUlJFR0wgICAgICAgICAgICAgICAgICAgICAgLDB4MDAwOSksCi0KLS8qIEZ1bmN0aW9ucyB1c2VkIGJ5IG9ic29sZXRlIFdpbkRpcmVjdCAqLwotUE1IRUxQX0NUTF9DT0RFKE1BUFBIWVMgICAgICAgICAgICAgICAgICAgICAsMHgwMDBGKSwKLVBNSEVMUF9DVExfQ09ERShHRVRWRVNBQlVGICAgICAgICAgICAgICAgICAgLDB4MDAxMyksCi0KLS8qIEZ1bmN0aW9ucyB1c2VkIGJ5IFBNIGxpYnJhcnkgKi8KLVBNSEVMUF9DVExfQ09ERShEUE1JSU5UODYgICAgICAgICAgICAgICAgICAgLDB4MDAxNCksCi1QTUhFTFBfQ1RMX0NPREUoSU5UODYgICAgICAgICAgICAgICAgICAgICAgICwweDAwMTUpLAotUE1IRUxQX0NUTF9DT0RFKElOVDg2WCAgICAgICAgICAgICAgICAgICAgICAsMHgwMDE2KSwKLVBNSEVMUF9DVExfQ09ERShDQUxMUkVBTE1PREUgICAgICAgICAgICAgICAgLDB4MDAxNyksCi1QTUhFTFBfQ1RMX0NPREUoQUxMT0NMT0NLRUQgICAgICAgICAgICAgICAgICwweDAwMTgpLAotUE1IRUxQX0NUTF9DT0RFKEZSRUVMT0NLRUQgICAgICAgICAgICAgICAgICAsMHgwMDE5KSwKLVBNSEVMUF9DVExfQ09ERShFTkFCTEVMRkJDT01CICAgICAgICAgICAgICAgLDB4MDAxQSksCi1QTUhFTFBfQ1RMX0NPREUoR0VUUEhZU0lDQUxBRERSICAgICAgICAgICAgICwweDAwMUIpLAotUE1IRUxQX0NUTF9DT0RFKE1BTExPQ1NIQVJFRCAgICAgICAgICAgICAgICAsMHgwMDFEKSwKLVBNSEVMUF9DVExfQ09ERShGUkVFU0hBUkVEICAgICAgICAgICAgICAgICAgLDB4MDAxRiksCi1QTUhFTFBfQ1RMX0NPREUoTE9DS0RBVEFQQUdFUyAgICAgICAgICAgICAgICwweDAwMjApLAotUE1IRUxQX0NUTF9DT0RFKFVOTE9DS0RBVEFQQUdFUyAgICAgICAgICAgICAsMHgwMDIxKSwKLVBNSEVMUF9DVExfQ09ERShMT0NLQ09ERVBBR0VTICAgICAgICAgICAgICAgLDB4MDAyMiksCi1QTUhFTFBfQ1RMX0NPREUoVU5MT0NLQ09ERVBBR0VTICAgICAgICAgICAgICwweDAwMjMpLAotUE1IRUxQX0NUTF9DT0RFKEdFVENBTExHQVRFICAgICAgICAgICAgICAgICAsMHgwMDI0KSwKLVBNSEVMUF9DVExfQ09ERShTRVRDTlRQQVRIICAgICAgICAgICAgICAgICAgLDB4MDAyNSksCi1QTUhFTFBfQ1RMX0NPREUoR0VUUERCICAgICAgICAgICAgICAgICAgICAgICwweDAwMjYpLAotUE1IRUxQX0NUTF9DT0RFKEZMVVNIVExCICAgICAgICAgICAgICAgICAgICAsMHgwMDI3KSwKLVBNSEVMUF9DVExfQ09ERShHRVRQSFlTSUNBTEFERFJSQU5HRSAgICAgICAgLDB4MDAyOCksCi1QTUhFTFBfQ1RMX0NPREUoQUxMT0NQQUdFICAgICAgICAgICAgICAgICAgICwweDAwMjkpLAotUE1IRUxQX0NUTF9DT0RFKEZSRUVQQUdFICAgICAgICAgICAgICAgICAgICAsMHgwMDJBKSwKLVBNSEVMUF9DVExfQ09ERShFTkFCTEVSSU5HM0lPUEwgICAgICAgICAgICAgLDB4MDAyQiksCi1QTUhFTFBfQ1RMX0NPREUoRElTQUJMRVJJTkczSU9QTCAgICAgICAgICAgICwweDAwMkMpLAotUE1IRUxQX0NUTF9DT0RFKEdBU0VUTE9DQUxQQVRIICAgICAgICAgICAgICAsMHgwMDJEKSwKLVBNSEVMUF9DVExfQ09ERShHQUdFVEVYUE9SVFMgICAgICAgICAgICAgICAgLDB4MDAyRSksCi1QTUhFTFBfQ1RMX0NPREUoR0FUSFVOSyAgICAgICAgICAgICAgICAgICAgICwweDAwMkYpLAotUE1IRUxQX0NUTF9DT0RFKFNFVE5VQ0xFVVNQQVRIICAgICAgICAgICAgICAsMHgwMDMwKSwKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbWFwaS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZGFjZTcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAotKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQotKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKLSogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAotKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1BNQVBJX0gKLSNkZWZpbmUgX19QTUFQSV9ICi0KLSNpbmNsdWRlICJzY2l0ZWNoLmgiCi0jaW5jbHVkZSAicGNpbGliLmgiCi0jaW5jbHVkZSAienRpbWVyYy5oIgotI2lmICFkZWZpbmVkKF9fV0lOMzJfVlhEX18pICYmICFkZWZpbmVkKF9fT1MyX1ZERF9fKSAmJiAhZGVmaW5lZChfX05UX0RSSVZFUl9fKQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCBUeXBlZGVmcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogWW91IHdpbGwgbmVlZCB0byBkZWZpbmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgYmVmb3JlIHlvdSBjb21waWxlIHRoaXMKLSAqIGxpYnJhcnkgZm9yIGl0IHRvIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIERPUyBleHRlbmRlciB0aGF0IHlvdSBhcmUKLSAqIHVzaW5nIHdoZW4gY29tcGlsaW5nIGZvciBleHRlbmRlZCBET1M6Ci0gKgotICogICAgICBUTlQgICAgICAgICAtIFBoYXIgTGFwIFROVCBET1MgRXh0ZW5kZXIKLSAqICAgICAgRE9TNEdXICAgICAgLSBSYXRpb25hbCBET1MvNEdXLCBET1MvNEdXIFBybywgQ2F1c2V3YXkgYW5kIFBNT0RFL1cKLSAqICAgICAgREpHUFAgICAgICAgLSBESkdQUCBwb3J0IG9mIEdOVSBDKysKLSAqCi0gKiBJZiBub25lIGlzIHNwZWNpZmllZCwgd2Ugd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB3aGljaCBvcGVyYXRpbmcKLSAqIHN5c3RlbSBpcyBiZWluZyB0YXJnZXR0ZWQgYW5kIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSBkZWZpbmVkIChwcm92aWRlZCBieQotICogc2NpdGVjaC5oIGhlYWRlciBmaWxlKToKLSAqCi0gKiAgICAgIF9fTVNET1MxNl9fICAgICAtIERlZmF1bHQgZm9yIDE2IGJpdCBNU0RPUyBtb2RlCi0gKiAgICAgIF9fTVNET1MzMl9fICAgICAtIERlZmF1bHQgZm9yIDMyIGJpdCBNU0RPUwotICogICAgICBfX1dJTkRPV1MxNl9fICAgLSBEZWZhdWx0IGZvciAxNiBiaXQgV2luZG93cwotICogICAgICBfX1dJTkRPV1MzMl9fICAgLSBEZWZhdWx0IGZvciAzMiBiaXQgV2luZG93cwotICoKLSAqIE9uZSBvZiB0aGUgZm9sbG93aW5nIHdpbGwgYmUgZGVmaW5lZCBhdXRvbWF0aWNhbGx5IGZvciB5b3UgdG8gc2VsZWN0Ci0gKiB3aGljaCBtZW1vcnkgbW9kZWwgaXMgaW4gZWZmZWN0OgotICoKLSAqICAgICAgUkVBTE1PREUgICAgLSAxNiBiaXQgcmVhbCBtb2RlIChsYXJnZSBtZW1vcnkgbW9kZWwpCi0gKiAgICAgIFBNMjg2ICAgICAgIC0gMTYgcHJvdGVjdGVkIG1vZGUgKGxhcmdlIG1lbW9yeSBtb2RlbCkKLSAqICAgICAgUE0zODYgICAgICAgLSAzMiBwcm90ZWN0ZWQgbW9kZSAoZmxhdCBtZW1vcnkgbW9kZWwpCi0gKi8KLQotI2lmIGRlZmluZWQoX19VTklYX18pICYmICFkZWZpbmVkKF9NQVhfUEFUSCkKLSNkZWZpbmUgX01BWF9QQVRIIDI1NgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFROVCkgfHwgZGVmaW5lZChET1NYKSB8fCBkZWZpbmVkKFgzMlZNKSB8fCBkZWZpbmVkKERQTUkzMikgICAgICBcCi0gICAgfHwgZGVmaW5lZChET1M0R1cpIHx8IGRlZmluZWQoREpHUFApIHx8IGRlZmluZWQoX19XSU5ET1dTMzJfXykgICAgICAgICAgXAotICAgIHx8IGRlZmluZWQoX19NU0RPUzMyX18pIHx8IGRlZmluZWQoX19VTklYX18pIHx8IGRlZmluZWQoX19XSU4zMl9WWERfXykgXAotICAgIHx8IGRlZmluZWQoX18zMkJJVF9fKSB8fCBkZWZpbmVkKF9fU01YMzJfXykgfHwgZGVmaW5lZChfX1JUVEFSR0VUX18pCi0jZGVmaW5lIFBNMzg2Ci0jZWxpZiBkZWZpbmVkKERQTUkxNikgfHwgZGVmaW5lZChfX1dJTkRPV1MxNl9fKQotI2RlZmluZSBQTTI4NgotI2Vsc2UKLSNkZWZpbmUgUkVBTE1PREUKLSNlbmRpZgotCi0jcHJhZ21hIHBhY2soMSkKLQotLyogUHJvdmlkZSB0aGUgdHlwZWRlZnMgZm9yIHRoZSBQTV9pbnQzODYgZnVuY3Rpb25zLCB3aGljaCBpc3N1ZSBuYXRpdmUKLSAqIGludGVycnVwdHMgaW4gcmVhbCBvciBwcm90ZWN0ZWQgbW9kZSBhbmQgY2FuIHBhc3MgZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gKiBhcm91bmQuCi0gKi8KLQotc3RydWN0IF9QTURXT1JEUkVHUyB7Ci0gICAgdWxvbmcgICBlYXgsZWJ4LGVjeCxlZHgsZXNpLGVkaSxjZmxhZzsKLSAgICB9OwotCi1zdHJ1Y3QgX1BNV09SRFJFR1MgewotICAgIHVzaG9ydCAgYXgsYXhfaGk7Ci0gICAgdXNob3J0ICBieCxieF9oaTsKLSAgICB1c2hvcnQgIGN4LGN4X2hpOwotICAgIHVzaG9ydCAgZHgsZHhfaGk7Ci0gICAgdXNob3J0ICBzaSxzaV9oaTsKLSAgICB1c2hvcnQgIGRpLGRpX2hpOwotICAgIHVzaG9ydCAgY2ZsYWcsY2ZsYWdfaGk7Ci0gICAgfTsKLQotc3RydWN0IF9QTUJZVEVSRUdTIHsKLSAgICB1Y2hhciAgIGFsLCBhaDsgdXNob3J0IGF4X2hpOwotICAgIHVjaGFyICAgYmwsIGJoOyB1c2hvcnQgYnhfaGk7Ci0gICAgdWNoYXIgICBjbCwgY2g7IHVzaG9ydCBjeF9oaTsKLSAgICB1Y2hhciAgIGRsLCBkaDsgdXNob3J0IGR4X2hpOwotICAgIH07Ci0KLXR5cGVkZWYgdW5pb24gewotICAgIHN0cnVjdCAgX1BNRFdPUkRSRUdTIGU7Ci0gICAgc3RydWN0ICBfUE1XT1JEUkVHUyAgeDsKLSAgICBzdHJ1Y3QgIF9QTUJZVEVSRUdTICBoOwotICAgIH0gUE1SRUdTOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdXNob3J0ICBlczsKLSAgICB1c2hvcnQgIGNzOwotICAgIHVzaG9ydCAgc3M7Ci0gICAgdXNob3J0ICBkczsKLSAgICB1c2hvcnQgIGZzOwotICAgIHVzaG9ydCAgZ3M7Ci0gICAgfSBQTVNSRUdTOwotCi0vKiBQcm92aWRlIGRlZmluaXRpb25zIGZvciB0aGUgcmVhbCBtb2RlIHJlZ2lzdGVyIHN0cnVjdHVyZXMgcGFzc2VkIHRvCi0gKiB0aGUgUE1faW50ODYoKSBhbmQgUE1faW50ODZ4KCkgcm91dGluZXMuIE5vdGUgdGhhdCB3ZSBwcm92aWRlIG91ciBvd24KLSAqIGZ1bmN0aW9ucyB0byBkbyB0aGlzIGZvciAxNi1iaXQgY29kZSB0aGF0IGNhbGxzIHRoZSBQTV9pbnQzODYgZnVuY3Rpb25zLgotICovCi0KLXR5cGVkZWYgUE1SRUdTICBSTVJFR1M7Ci10eXBlZGVmIFBNU1JFR1MgUk1TUkVHUzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGxvbmcgICAgZWRpOwotICAgIGxvbmcgICAgZXNpOwotICAgIGxvbmcgICAgZWJwOwotICAgIGxvbmcgICAgcmVzZXJ2ZWQ7Ci0gICAgbG9uZyAgICBlYng7Ci0gICAgbG9uZyAgICBlZHg7Ci0gICAgbG9uZyAgICBlY3g7Ci0gICAgbG9uZyAgICBlYXg7Ci0gICAgc2hvcnQgICBmbGFnczsKLSAgICBzaG9ydCAgIGVzLGRzLGZzLGdzLGlwLGNzLHNwLHNzOwotICAgIH0gRFBNSV9yZWdzOwotCi0jaWZkZWYgIF9fTVNET1NfXwotLyogUmVnaXN0ZXIgc3RydWN0dXJlIHBhc3NlZCB0byBQTV9WeERDYWxsIGZ1bmN0aW9uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWxvbmcgICBlYXg7Ci0gICAgdWxvbmcgICBlYng7Ci0gICAgdWxvbmcgICBlY3g7Ci0gICAgdWxvbmcgICBlZHg7Ci0gICAgdWxvbmcgICBlc2k7Ci0gICAgdWxvbmcgICBlZGk7Ci0gICAgdXNob3J0ICBkcyxlczsKLSAgICB9IFZYRF9yZWdzOwotI2VuZGlmCi0KLSNkZWZpbmUgUE1fTUFYX0RSSVZFICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgUE1fTUFYX1BBVEggICAgICAgICAgICAgICAgIDI1NgotI2RlZmluZSBQTV9GSUxFX0lOVkFMSUQgICAgICAgICAgICAgKHZvaWQqKTB4RkZGRkZGRkYKLQotLyogU3RydWN0dXJlIGZvciBnZW5lcmljIGRpcmVjdG9yeSB0cmF2ZXJzYWwgYW5kIG1hbmFnZW1lbnQuIEFsc28gdGhlIHNhbWUKLSAqIHZhbHVlcyBhcmUgcGFzc2VkIHRvIFBNX3NldEZpbGVBdHRyIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIGR3U2l6ZTsKLSAgICB1bG9uZyAgIGF0dHJpYjsKLSAgICB1bG9uZyAgIHNpemVMbzsKLSAgICB1bG9uZyAgIHNpemVIaTsKLSAgICBjaGFyICAgIG5hbWVbUE1fTUFYX1BBVEhdOwotICAgIH0gUE1fZmluZERhdGE7Ci0KLS8qIE1hY3JvIHRvIGNvbXB1dGUgdGhlIGJ5dGUgb2Zmc2V0IG9mIGEgZmllbGQgaW4gYSBzdHJ1Y3R1cmUgb2YgdHlwZSB0eXBlICovCi0KLSNkZWZpbmUgUE1fRklFTERfT0ZGU0VUKHR5cGUsZmllbGQpICgobG9uZykmKCgodHlwZSopMCktPmZpZWxkKSkKLQotLyogTWFyY3RvIHRvIGNvbXB1dGUgdGhlIGFkZHJlc3Mgb2YgdGhlIGJhc2Ugb2YgdGhlIHN0cnVjdHVyZSBnaXZlbiBpdHMgdHlwZSwKLSAqIGFuZCBhbiBhZGRyZXNzIG9mIGEgZmllbGQgd2l0aGluIHRoZSBzdHJ1Y3R1cmUuCi0gKi8KLQotI2RlZmluZSBQTV9DT05UQUlOSU5HX1JFQ09SRChhZGRyZXNzLCB0eXBlLCBmaWVsZCkgICAgICBcCi0gICAgKCh0eXBlKikoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoY2hhciopKGFkZHJlc3MpIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChjaGFyKikoJigodHlwZSopMCktPmZpZWxkKSkpCi0KLS8qIEZsYWdzIHN0b3JlZCBpbiB0aGUgUE1fZmluZERhdGEgc3RydWN0dXJlLCBhbmQgYWxzbyB2YWx1ZXMgcGFzc2VkIHRvCi0gKiBQTV9zZXRGaWxlQXR0ciB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcy4KLSAqLwotCi0jZGVmaW5lIFBNX0ZJTEVfTk9STUFMICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBNX0ZJTEVfUkVBRE9OTFkgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFBNX0ZJTEVfRElSRUNUT1JZICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFBNX0ZJTEVfQVJDSElWRSAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFBNX0ZJTEVfSElEREVOICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFBNX0ZJTEVfU1lTVEVNICAgICAgICAgICAgICAweDAwMDAwMDEwCi0KLS8qIEZsYWdzIHJldHVybmVkIGJ5IHRoZSBQTV9zcGxpdHBhdGggZnVuY3Rpb24gKi8KLQotI2RlZmluZSBQTV9IQVNfV0lMRENBUkRTIDB4MDEKLSNkZWZpbmUgUE1fSEFTX0VYVEVOU0lPTiAweDAyCi0jZGVmaW5lIFBNX0hBU19GSUxFTkFNRSAgMHgwNAotI2RlZmluZSBQTV9IQVNfRElSRUNUT1JZIDB4MDgKLSNkZWZpbmUgUE1fSEFTX0RSSVZFICAgICAweDEwCi0KLS8qIFN0cnVjdHVyZSBwYXNzZWQgdG8gdGhlIFBNX3NldEZpbGVUaW1lIGZ1bmN0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHNob3J0ICAgc2VjOyAgICAgICAgLyogU2Vjb25kcyAqLwotICAgIHNob3J0ICAgbWluOyAgICAgICAgLyogTWludXRlcyAqLwotICAgIHNob3J0ICAgaG91cjsgICAgICAgLyogSG91ciAoMC0tMjMpICovCi0gICAgc2hvcnQgICBkYXk7ICAgICAgICAvKiBEYXkgb2YgbW9udGggKDEtLTMxKSAqLwotICAgIHNob3J0ICAgbW9uOyAgICAgICAgLyogTW9udGggKDAtLTExKSAqLwotICAgIHNob3J0ICAgeWVhcjsgICAgICAgLyogWWVhciAoY2FsZW5kYXIgeWVhciBtaW51cyAxOTAwKSAqLwotICAgIH0gUE1fdGltZTsKLQotLyogRGVmaW5lIGEgbWFjcm8gZm9yIGNyZWF0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzc2VzIGZyb20gc2VnbWVudDpvZmZzZXQgKi8KLQotI2RlZmluZSBNS19QSFlTKHMsbykgICgoKHVsb25nKShzKSA8PCA0KSArICh1bG9uZykobykpCi0KLS8qIERlZmluZSB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIG1vZGVzIHN1cHBvcnRlZC4gVGhpcyBpcyBhIGdsb2JhbCB2YXJpYWJsZQotICogdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHR5cGUgYXQgcnVudGltZSB3aGljaCB3aWxsIGNvbnRhaW4KLSAqIG9uZSBvZiB0aGVzZSB2YWx1ZXMuCi0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBQTV9yZWFsTW9kZSwKLSAgICBQTV8yODYsCi0gICAgUE1fMzg2Ci0gICAgfSBQTV9tb2RlX2VudW07Ci0KLS8qIERlZmluZSB0eXBlcyBwYXNzZWQgdG8gUE1fZW5hYmxlV3JpdGVDb21iaW5lICovCi0KLSNkZWZpbmUgUE1fTVRSUl9VTkNBQ0hBQkxFICAwCi0jZGVmaW5lIFBNX01UUlJfV1JDT01CICAgICAgMQotI2RlZmluZSBQTV9NVFJSX1dSVEhST1VHSCAgIDQKLSNkZWZpbmUgUE1fTVRSUl9XUlBST1QgICAgICA1Ci0jZGVmaW5lIFBNX01UUlJfV1JCQUNLICAgICAgNgotI2RlZmluZSBQTV9NVFJSX01BWCAgICAgICAgIDYKLQotLyogRXJyb3IgY29kZXMgcmV0dXJuZWQgYnkgUE1fZW5hYmxlV3JpdGVDb21iaW5lICovCi0KLSNkZWZpbmUgUE1fTVRSUl9FUlJfT0sgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFBNX01UUlJfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgLTEKLSNkZWZpbmUgUE1fTVRSUl9FUlJfUEFSQU1TICAgICAgICAgICAgICAtMgotI2RlZmluZSBQTV9NVFJSX0VSUl9OT1RfNEtCX0FMSUdORUQgICAgIC0zCi0jZGVmaW5lIFBNX01UUlJfRVJSX0JFTE9XXzFNQiAgICAgICAgICAgLTQKLSNkZWZpbmUgUE1fTVRSUl9FUlJfTk9UX0FMSUdORUQgICAgICAgICAtNQotI2RlZmluZSBQTV9NVFJSX0VSUl9PVkVSTEFQICAgICAgICAgICAgIC02Ci0jZGVmaW5lIFBNX01UUlJfRVJSX1RZUEVfTUlTTUFUQ0ggICAgICAgLTcKLSNkZWZpbmUgUE1fTVRSUl9FUlJfTk9ORV9GUkVFICAgICAgICAgICAtOAotI2RlZmluZSBQTV9NVFJSX0VSUl9OT1dSQ09NQiAgICAgICAgICAgIC05Ci0jZGVmaW5lIFBNX01UUlJfRVJSX05PX09TX1NVUFBPUlQgICAgICAgLTEwCi0KLS8qIFZhbHVlcyBwYXNzZWQgdG8gdGhlIFBNX0RNQUNQcm9ncmFtIGZ1bmN0aW9uICovCi0KLSNkZWZpbmUgUE1fRE1BX1JFQURfT05FU0hPVCAgICAgMHg0NCAgICAvKiBPbmUtc2hvdCBETUEgcmVhZCAgICAgICAgKi8KLSNkZWZpbmUgUE1fRE1BX1dSSVRFX09ORVNIT1QgICAgMHg0OCAgICAvKiBPbmUtc2hvdCBETUEgd3JpdGUgICAgICAgKi8KLSNkZWZpbmUgUE1fRE1BX1JFQURfQVVUT0lOSVQgICAgMHg1NCAgICAvKiBBdXRvLWluaXQgRE1BIHJlYWQgICAgICAgKi8KLSNkZWZpbmUgUE1fRE1BX1dSSVRFX0FVVE9JTklUICAgMHg1OCAgICAvKiBBdXRvLWluaXQgRE1BIHdyaXRlICAgICAgKi8KLQotLyogRmxhZ3MgcGFzc2VkIHRvIHN1c3BlbmQgYXBwbGljYXRpb24gY2FsbGJhY2sgKi8KLQotI2RlZmluZSBQTV9ERUFDVElWQVRFICAgICAgIDEKLSNkZWZpbmUgUE1fUkVBQ1RJVkFURSAgICAgICAyCi0KLS8qIFJldHVybiBjb2RlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBjYW4gcmV0dXJuIGZyb20gdGhlIHN1c3BlbmQgYXBwbGljYXRpb24KLSAqIGNhbGxiYWNrIHJlZ2lzdGVyZWQgd2l0aCB0aGUgUE0gbGlicmFyeS4gU2VlIHRoZSBNR0wgZG9jdW1lbnRhdGlvbiBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqLwotI2RlZmluZSBQTV9TVVNQRU5EX0FQUCAgICAgIDAKLSNkZWZpbmUgUE1fTk9fU1VTUEVORF9BUFAgICAxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSB0eXBlIHZhbHVlcyBwYXNzZWQgdG8gdGhlIFBNX2FncFJlc2VydmVQaHlzaWNhbAotZnVuY3Rpb24sIHRvIGRlZmluZSBob3cgdGhlIHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5nIHNob3VsZCBiZSBoYW5kbGVkLgotCi1UaGUgUE1fYWdwVW5jYWNoZWQgdHlwZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQgYXMKLXVuY2FjaGVkIG1lbW9yeS4KLQotVGhlIFBNX2FncFdyaXRlQ29tYmluZSB0eXBlIGluZGljYXRlcyB0aGF0IHdyaXRlIGNvbWJpbmluZyBzaG91bGQgYmUgZW5hYmxlZAotZm9yIHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5nLiBUaGlzIGlzIHVzZWQgZm9yIGZyYW1lYnVmZmVyIHdyaXRlIGNvbWJpbmcgYW5kCi1zcGVlZHMgdXAgZGlyZWN0IGZyYW1lYnVmZmVyIHdyaXRlcyB0byB0aGUgbWVtb3J5LgotCi1UaGUgUE1fYWdwSW50ZWxEQ0FDSEUgdHlwZSBpbmRpY2F0ZXMgdGhhdCBtZW1vcnkgc2hvdWxkIGNvbWUgZnJvbSB0aGUgSW50ZWwKLWk4MXggRGlzcGxheSBDYWNoZSAob3IgRENBQ0hFKSBtZW1vcnkgcG9vbC4gVGhpcyBmbGFnIGlzIHNwZWNpZmljIHRvIHRoZQotSW50ZWwgaTgxMCBhbmQgaTgxNSBjb250cm9sbGVycywgYW5kIHNob3VsZCBub3QgYmUgcGFzc2VkIGZvciBhbnkgb3RoZXIKLWNvbnRyb2xsZXIgdHlwZS4KLQotSEVBREVSOgotcG1hcGkuaAotCi1NRU1CRVJTOgotUE1fYWdwVW5jYWNoZWQgICAgICAtIEluZGljYXRlcyB0aGF0IHRoZSBtZW1vcnkgc2hvdWxkIGJlIHVuY2FjaGVkCi1QTV9hZ3BXcml0ZUNvbWJpbmUgIC0gSW5kaWNhdGVzIHRoYXQgdGhlIG1lbW9yeSBzaG91bGQgYmUgd3JpdGUgY29tYmluZWQKLVBNX2FncEludGVsRENBQ0hFICAgLSBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVtb3J5IHNob3VsZCBjb21lIGZyb20gRENBQ0hFIHBvb2wKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGVudW0gewotICAgIFBNX2FncFVuY2FjaGVkLAotICAgIFBNX2FncFdyaXRlQ29tYmluZSwKLSAgICBQTV9hZ3BJbnRlbERDQUNIRQotICAgIH0gUE1fYWdwTWVtb3J5VHlwZTsKLQotLyogRGVmaW5lcyB0aGUgc2l6ZSBvZiBhbiBzeXN0ZW0gbWVtb3J5IHBhZ2UgKi8KLQotI2RlZmluZSBQTV9QQUdFX1NJWkUgICAgICAgIDQwOTYKLQotLyogVHlwZSBkZWZpbml0aW9uIGZvciBhIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzICovCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBQTV9waHlzQWRkcjsKLQotLyogRGVmaW5lIGEgYmFkIHBoeXNpY2FsIGFkZHJlc3MgcmV0dXJuZWQgYnkgbWFwIHBoeXNpY2FsIGZ1bmN0aW9ucyAqLwotCi0jZGVmaW5lIFBNX0JBRF9QSFlTX0FERFJFU1MgMHhGRkZGRkZGRgotCi0vKiBUeXBlIGRlZmluaXRpb24gZm9yIHRoZSAxMi1ieXRlIGxvY2sgaGFuZGxlIGZvciBsb2NraW5nIGxpbmVhciBtZW1vcnkgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgaFszXTsKLSAgICB9IFBNX2xvY2tIYW5kbGU7Ci0KLS8qICdDJyBjYWxsaW5nIGNvbnZlbnRpb25zIGFsd2F5cyAgICAgICAqLwotCi0jZGVmaW5lIFBNQVBJICAgX0FTTUFQSQotI2RlZmluZSBQTUFQSVAgIF9BU01BUElQCi0KLS8qIEludGVybmFsIHR5cGVkZWYgdG8gb3ZlcnJpZGUgRFBNSV9pbnQ4NiBoYW5kbGVyICovCi0KLXR5cGVkZWYgaWJvb2wgKFBNQVBJUCBEUE1JX2hhbmRsZXJfdCkoRFBNSV9yZWdzICpyZWdzKTsKLXZvaWQgUE1BUEkgRFBNSV9zZXRJbnQxMEhhbmRsZXIoRFBNSV9oYW5kbGVyX3QgaGFuZGxlcik7Ci0KLS8qIFR5cGUgZGVmaW5pdGlvbnMgZm9yIGEgd2luZG93IGhhbmRsZSBmb3IgY29uc29sZSBtb2RlcyAqLwotCi0jaWYgICAgIGRlZmluZWQoX19EUklWRVJfXykgfHwgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi10eXBlZGVmIHZvaWQgICAgICAgICpQTV9IV05EOyAgIC8qIFBvaW50ZXIgZm9yIHBvcnRhYmxlIGRyaXZlcnMgICAgICAgICAqLwotdHlwZWRlZiB2b2lkICAgICAgICAqUE1fTU9EVUxFOyAvKiBNb2R1bGUgaGFuZGxlIGZvciBwb3J0YWJsZSBkcml2ZXJzICAgKi8KLSNlbGlmICAgZGVmaW5lZChfX1dJTkRPV1NfXykKLSNpZmRlZiAgREVDTEFSRV9IQU5ETEUKLXR5cGVkZWYgSFdORCAgICAgICAgUE1fSFdORDsgICAgLyogUmVhbCB3aW5kb3cgaGFuZGxlICAgICAgICAgICAgICAgICAgICovCi10eXBlZGVmIEhJTlNUQU5DRSAgIFBNX01PRFVMRTsgIC8qIFdpbjMyIERMTCBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAqLwotI2Vsc2UKLXR5cGVkZWYgdm9pZCAgICAgICAgKlBNX0hXTkQ7ICAgLyogUGxhY2UgaG9sZGVyIGlmIHdpbmRvd3MuaCBub3QgaW5jbHVkZWQgKi8KLXR5cGVkZWYgdm9pZCAgICAgICAgKlBNX01PRFVMRTsgLyogUGxhY2UgaG9sZGVyIGlmIHdpbmRvd3MuaCBub3QgaW5jbHVkZWQgKi8KLSNlbmRpZgotI2VsaWYgICBkZWZpbmVkKF9fVVNFX1gxMV9fKQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFdpbmRvdyAgICAgICp3aW5kb3c7Ci0gICAgRGlzcGxheSAgICAgKmRpc3BsYXk7Ci0gICAgfSBQTV9IV05EOyAgICAgICAgICAgICAgICAgIC8qIFgxMSB3aW5kb3cgaGFuZGxlICovCi0jZWxpZiAgIGRlZmluZWQoX19PUzJfXykKLXR5cGVkZWYgdm9pZCAgICAqUE1fSFdORDsKLXR5cGVkZWYgdm9pZCAgICAqUE1fTU9EVUxFOwotI2VsaWYgICBkZWZpbmVkKF9fTElOVVhfXykKLXR5cGVkZWYgaW50ICAgICBQTV9IV05EOyAgICAgICAgLyogQ29uc29sZSBpZCBmb3IgZnVsbHNjcmVlbiBMaW51eCAqLwotdHlwZWRlZiB2b2lkICAgICpQTV9NT0RVTEU7Ci0jZWxpZiAgIGRlZmluZWQoX19RTlhfXykKLXR5cGVkZWYgaW50ICAgICBQTV9IV05EOyAgICAgICAgLyogQ29uc29sZSBpZCBmb3IgZnVsbHNjcmVlbiBRTlggKi8KLXR5cGVkZWYgdm9pZCAgICAqUE1fTU9EVUxFOwotI2VsaWYgICBkZWZpbmVkKF9fUlRUQVJHRVRfXykKLXR5cGVkZWYgaW50ICAgICBQTV9IV05EOyAgICAgICAgLyogUGxhY2Vob2xkZXIgZm9yIFJUVGFyZ2V0LTMyICovCi10eXBlZGVmIHZvaWQgICAgKlBNX01PRFVMRTsKLSNlbGlmICAgZGVmaW5lZChfX1JFQUxET1NfXykKLXR5cGVkZWYgaW50ICAgICBQTV9IV05EOyAgICAgICAgLyogUGxhY2Vob2xkZXIgZm9yIGZ1bGxzY3JlZW4gRE9TICovCi10eXBlZGVmIHZvaWQgICAgKlBNX01PRFVMRTsgICAgIC8qIFBsYWNlaG9sZGVyIGZvciBmdWxsc2NyZWVuIERPUyAqLwotI2VsaWYgICBkZWZpbmVkKF9fU01YMzJfXykKLXR5cGVkZWYgaW50ICAgICBQTV9IV05EOyAgICAgICAgLyogUGxhY2Vob2xkZXIgZm9yIGZ1bGxzY3JlZW4gU01YICovCi10eXBlZGVmIHZvaWQgICAgKlBNX01PRFVMRTsKLSNlbGlmICAgZGVmaW5lZChfX1NOQVBfXykKLXR5cGVkZWYgdm9pZCAgICAqUE1fSFdORDsKLXR5cGVkZWYgdm9pZCAgICAqUE1fTU9EVUxFOwotI2Vsc2UKLSNlcnJvciAgUE0gbGlicmFyeSBub3QgcG9ydGVkIHRvIHRoaXMgcGxhdGZvcm0geWV0IQotI2VuZGlmCi0KLS8qIFR5cGUgZGVmaW5pdGlvbiBmb3IgY29kZSBwb2ludGVycyAqLwotCi10eXBlZGVmIHZvaWQgKCpfX2NvZGVQdHIpKCk7Ci0KLS8qIFR5cGUgZGVmaW5pdGlvbiBmb3IgYSBDIGJhc2VkIGludGVycnVwdCBoYW5kbGVyICovCi0KLXR5cGVkZWYgdm9pZCAoUE1BUElQIFBNX2ludEhhbmRsZXIpKHZvaWQpOwotdHlwZWRlZiBpYm9vbCAoUE1BUElQIFBNX2lycUhhbmRsZXIpKHZvaWQpOwotCi0vKiBIYXJkd2FyZSBJUlEgaGFuZGxlIHVzZWQgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgaGFyZHdhcmUgSVJRICovCi0KLXR5cGVkZWYgdm9pZCAqUE1fSVJRSGFuZGxlOwotCi0vKiBUeXBlIGRlZmluaXRpb24gZm9yIHRoZSBmYXRhbCBjbGVhbnVwIGhhbmRsZXIgKi8KLQotdHlwZWRlZiB2b2lkIChQTUFQSVAgUE1fZmF0YWxDbGVhbnVwSGFuZGxlcikodm9pZCk7Ci0KLS8qIFR5cGUgZGVmaWZpbml0aW9uIGZvciBzYXZlIHN0YXRlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0KLXR5cGVkZWYgaW50IChQTUFQSVAgUE1fc2F2ZVN0YXRlX2NiKShpbnQgZmxhZ3MpOwotCi0vKiBUeXBlIGRlZmluaW50aW9uIGZvciBlbnVtIHdyaXRlIGNvbWJpbmVkIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0KLXR5cGVkZWYgdm9pZCAoUE1BUElQIFBNX2VudW1Xcml0ZUNvbWJpbmVfdCkodWxvbmcgYmFzZSx1bG9uZyBsZW5ndGgsdWludCB0eXBlKTsKLQotLyogU3RydWN0dXJlIGRlZmluaW5nIGFsbCB0aGUgUE0gQVBJIGZ1bmN0aW9ucyBhcyBleHBvcnRlZCB0bwotICogdGhlIGJpbmFyeSBwb3J0YWJsZSBETEwncy4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWxvbmcgICBkd1NpemU7Ci0gICAgaW50ICAgICAoUE1BUElQIFBNX2dldE1vZGVUeXBlKSh2b2lkKTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fZ2V0QklPU1BvaW50ZXIpKHZvaWQpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9nZXRBMDAwMFBvaW50ZXIpKHZvaWQpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9tYXBQaHlzaWNhbEFkZHIpKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9tYWxsb2NTaGFyZWQpKGxvbmcgc2l6ZSk7Ci0gICAgdm9pZCAqICByZXNlcnZlZDE7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX2ZyZWVTaGFyZWQpKHZvaWQgKnB0cik7Ci0gICAgdm9pZCAqICAoUE1BUElQIFBNX21hcFRvUHJvY2Vzcykodm9pZCAqbGluZWFyLHVsb25nIGxpbWl0KTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fbWFwUmVhbFBvaW50ZXIpKHVpbnQgcl9zZWcsdWludCByX29mZik7Ci0gICAgdm9pZCAqICAoUE1BUElQIFBNX2FsbG9jUmVhbFNlZykodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fZnJlZVJlYWxTZWcpKHZvaWQgKm1lbSk7Ci0gICAgdm9pZCAqICAoUE1BUElQIFBNX2FsbG9jTG9ja2VkTWVtKSh1aW50IHNpemUsdWxvbmcgKnBoeXNBZGRyLGlib29sIGNvbnRpZ3VvdXMsaWJvb2wgYmVsb3cxNk1lZyk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX2ZyZWVMb2NrZWRNZW0pKHZvaWQgKnAsdWludCBzaXplLGlib29sIGNvbnRpZ3VvdXMpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9jYWxsUmVhbE1vZGUpKHVpbnQgc2VnLHVpbnQgb2ZmLCBSTVJFR1MgKnJlZ3MsUk1TUkVHUyAqc3JlZ3MpOwotICAgIGludCAgICAgKFBNQVBJUCBQTV9pbnQ4NikoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBNX2ludDg2eCkoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCxSTVNSRUdTICpzcmVncyk7Ci0gICAgdm9pZCAgICAoUE1BUElQIERQTUlfaW50ODYpKGludCBpbnRubywgRFBNSV9yZWdzICpyZWdzKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fYXZhaWxhYmxlTWVtb3J5KSh1bG9uZyAqcGh5c2ljYWwsdWxvbmcgKnRvdGFsKTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fZ2V0VkVTQUJ1ZikodWludCAqbGVuLHVpbnQgKnJzZWcsdWludCAqcm9mZik7Ci0gICAgbG9uZyAgICAoUE1BUElQIFBNX2dldE9TVHlwZSkodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX2ZhdGFsRXJyb3IpKGNvbnN0IGNoYXIgKm1zZyk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3NldEJhbmtBKShpbnQgYmFuayk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3NldEJhbmtBQikoaW50IGJhbmspOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zZXRDUlRTdGFydCkoaW50IHgsaW50IHksaW50IHdhaXRWUlQpOwotICAgIGNoYXIgKiAgKFBNQVBJUCBQTV9nZXRDdXJyZW50UGF0aCkoY2hhciAqcGF0aCxpbnQgbWF4TGVuKTsKLSAgICBjb25zdCBjaGFyICogKFBNQVBJUCBQTV9nZXRWQkVBRlBhdGgpKHZvaWQpOwotICAgIGNvbnN0IGNoYXIgKiAoUE1BUElQIFBNX2dldE51Y2xldXNQYXRoKSh2b2lkKTsKLSAgICBjb25zdCBjaGFyICogKFBNQVBJUCBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCkodm9pZCk7Ci0gICAgY29uc3QgY2hhciAqIChQTUFQSVAgUE1fZ2V0VW5pcXVlSUQpKHZvaWQpOwotICAgIGNvbnN0IGNoYXIgKiAoUE1BUElQIFBNX2dldE1hY2hpbmVOYW1lKSh2b2lkKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgVkZfYXZhaWxhYmxlKSh2b2lkKTsKLSAgICB2b2lkICogIChQTUFQSVAgVkZfaW5pdCkodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKTsKLSAgICB2b2lkICAgIChQTUFQSVAgVkZfZXhpdCkodm9pZCk7Ci0gICAgUE1fSFdORCAoUE1BUElQIFBNX29wZW5Db25zb2xlKShQTV9IV05EIGh3bmRVc2VyLGludCBkZXZpY2UsaW50IHhSZXMsaW50IHlSZXMsaW50IGJwcCxpYm9vbCBmdWxsU2NyZWVuKTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSkodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3NhdmVDb25zb2xlU3RhdGUpKHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgaHduZENvbnNvbGUpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKShjb25zdCB2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fY2xvc2VDb25zb2xlKShQTV9IV05EIGh3bmRDb25zb2xlKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbikoaW50IHgsaW50IHkpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zZXRPU1NjcmVlbldpZHRoKShpbnQgd2lkdGgsaW50IGhlaWdodCk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBNX2VuYWJsZVdyaXRlQ29tYmluZSkodWxvbmcgYmFzZSx1bG9uZyBsZW5ndGgsdWludCB0eXBlKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fYmFja3NsYXNoKShjaGFyICpmaWxlbmFtZSk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBNX2xvY2tEYXRhUGFnZXMpKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbG9ja0hhbmRsZSk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBNX3VubG9ja0RhdGFQYWdlcykodm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fbG9ja0NvZGVQYWdlcykoX19jb2RlUHRyIHAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbG9ja0hhbmRsZSk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBNX3VubG9ja0NvZGVQYWdlcykoX19jb2RlUHRyIHAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbG9ja0hhbmRsZSk7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKShQTV9pbnRIYW5kbGVyIGloLGludCBmcmVxdWVuY3kpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KShpbnQgZnJlcXVlbmN5KTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKSh2b2lkKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgUE1fZG9CSU9TUE9TVCkodXNob3J0IGF4VmFsLHVsb25nIEJJT1NQaHlzQWRkcix2b2lkICpCSU9TUHRyLHVsb25nIEJJT1NMZW4pOwotICAgIGNoYXIgICAgKFBNQVBJUCBQTV9nZXRCb290RHJpdmUpKHZvaWQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9mcmVlUGh5c2ljYWxBZGRyKSh2b2lkICpwdHIsdWxvbmcgbGltaXQpOwotICAgIHVjaGFyICAgKFBNQVBJUCBQTV9pbnBiKShpbnQgcG9ydCk7Ci0gICAgdXNob3J0ICAoUE1BUElQIFBNX2lucHcpKGludCBwb3J0KTsKLSAgICB1bG9uZyAgIChQTUFQSVAgUE1faW5wZCkoaW50IHBvcnQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9vdXRwYikoaW50IHBvcnQsdWNoYXIgdmFsKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fb3V0cHcpKGludCBwb3J0LHVzaG9ydCB2YWwpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9vdXRwZCkoaW50IHBvcnQsdWxvbmcgdmFsKTsKLSAgICB2b2lkICogIHJlc2VydmVkMjsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKShQTV9zYXZlU3RhdGVfY2Igc2F2ZVN0YXRlKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgUE1faGF2ZUJJT1NBY2Nlc3MpKHZvaWQpOwotICAgIGludCAgICAgKFBNQVBJUCBQTV9rYmhpdCkodm9pZCk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBNX2dldGNoKSh2b2lkKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgUE1fZmluZEJQRCkoY29uc3QgY2hhciAqZGxsbmFtZSxjaGFyICpicGRwYXRoKTsKLSAgICB1bG9uZyAgIChQTUFQSVAgUE1fZ2V0UGh5c2ljYWxBZGRyKSh2b2lkICpwKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fc2xlZXApKHVsb25nIG1pbGxpc2Vjb25kcyk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBNX2dldENPTVBvcnQpKGludCBwb3J0KTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fZ2V0TFBUUG9ydCkoaW50IHBvcnQpOwotICAgIFBNX01PRFVMRSAoUE1BUElQIFBNX2xvYWRMaWJyYXJ5KShjb25zdCBjaGFyICpzekRMTE5hbWUpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9nZXRQcm9jQWRkcmVzcykoUE1fTU9EVUxFIGhNb2R1bGUsY29uc3QgY2hhciAqc3pQcm9jTmFtZSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX2ZyZWVMaWJyYXJ5KShQTV9NT0RVTEUgaE1vZHVsZSk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBDSV9lbnVtZXJhdGUpKFBDSURldmljZUluZm8gaW5mb1tdKTsKLSAgICB1bG9uZyAgIChQTUFQSVAgUENJX2FjY2Vzc1JlZykoaW50IGluZGV4LHVsb25nIHZhbHVlLGludCBmdW5jLFBDSURldmljZUluZm8gKmluZm8pOwotICAgIGlib29sICAgKFBNQVBJUCBQQ0lfc2V0SGFyZHdhcmVJUlEpKFBDSURldmljZUluZm8gKmluZm8sdWludCBpbnRQaW4sdWludCBJUlEpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQQ0lfZ2VuZXJhdGVTcGVjaWFsQ3lsZSkodWludCBidXMsdWxvbmcgc3BlY2lhbEN5Y2xlRGF0YSk7Ci0gICAgdm9pZCAqICByZXNlcnZlZDM7Ci0gICAgdWxvbmcgICAoUE1BUElQIFBDSUJJT1NfZ2V0RW50cnkpKHZvaWQpOwotICAgIHVpbnQgICAgKFBNQVBJUCBDUFVfZ2V0UHJvY2Vzc29yVHlwZSkodm9pZCk7Ci0gICAgaWJvb2wgICAoUE1BUElQIENQVV9oYXZlTU1YKSh2b2lkKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgQ1BVX2hhdmUzRE5vdykodm9pZCk7Ci0gICAgaWJvb2wgICAoUE1BUElQIENQVV9oYXZlU1NFKSh2b2lkKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgQ1BVX2hhdmVSRFRTQykodm9pZCk7Ci0gICAgdWxvbmcgICAoUE1BUElQIENQVV9nZXRQcm9jZXNzb3JTcGVlZCkoaWJvb2wgYWNjdXJhdGUpOwotICAgIHZvaWQgICAgKFBNQVBJUCBaVGltZXJJbml0KSh2b2lkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgTFpUaW1lck9uKSh2b2lkKTsKLSAgICB1bG9uZyAgIChQTUFQSVAgTFpUaW1lckxhcCkodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIExaVGltZXJPZmYpKHZvaWQpOwotICAgIHVsb25nICAgKFBNQVBJUCBMWlRpbWVyQ291bnQpKHZvaWQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBMWlRpbWVyT25FeHQpKExaVGltZXJPYmplY3QgKnRtKTsKLSAgICB1bG9uZyAgIChQTUFQSVAgTFpUaW1lckxhcEV4dCkoTFpUaW1lck9iamVjdCAqdG0pOwotICAgIHZvaWQgICAgKFBNQVBJUCBMWlRpbWVyT2ZmRXh0KShMWlRpbWVyT2JqZWN0ICp0bSk7Ci0gICAgdWxvbmcgICAoUE1BUElQIExaVGltZXJDb3VudEV4dCkoTFpUaW1lck9iamVjdCAqdG0pOwotICAgIHZvaWQgICAgKFBNQVBJUCBVTFpUaW1lck9uKSh2b2lkKTsKLSAgICB1bG9uZyAgIChQTUFQSVAgVUxaVGltZXJMYXApKHZvaWQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBVTFpUaW1lck9mZikodm9pZCk7Ci0gICAgdWxvbmcgICAoUE1BUElQIFVMWlRpbWVyQ291bnQpKHZvaWQpOwotICAgIHVsb25nICAgKFBNQVBJUCBVTFpSZWFkVGltZSkodm9pZCk7Ci0gICAgdWxvbmcgICAoUE1BUElQIFVMWkVsYXBzZWRUaW1lKSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpOwotICAgIHZvaWQgICAgKFBNQVBJUCBVTFpUaW1lclJlc29sdXRpb24pKHVsb25nICpyZXNvbHV0aW9uKTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fZmluZEZpcnN0RmlsZSkoY29uc3QgY2hhciAqZmlsZW5hbWUsUE1fZmluZERhdGEgKmZpbmREYXRhKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgUE1fZmluZE5leHRGaWxlKSh2b2lkICpoYW5kbGUsUE1fZmluZERhdGEgKmZpbmREYXRhKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fZmluZENsb3NlKSh2b2lkICpoYW5kbGUpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9tYWtlcGF0aCkoY2hhciAqcCxjb25zdCBjaGFyICpkcml2ZSxjb25zdCBjaGFyICpkaXIsY29uc3QgY2hhciAqbmFtZSxjb25zdCBjaGFyICpleHQpOwotICAgIGludCAgICAgKFBNQVBJUCBQTV9zcGxpdHBhdGgpKGNvbnN0IGNoYXIgKmZuLGNoYXIgKmRyaXZlLGNoYXIgKmRpcixjaGFyICpuYW1lLGNoYXIgKmV4dCk7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBNX2RyaXZlVmFsaWQpKGNoYXIgZHJpdmUpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9nZXRkY3dkKShpbnQgZHJpdmUsY2hhciAqZGlyLGludCBsZW4pOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zZXRGaWxlQXR0cikoY29uc3QgY2hhciAqZmlsZW5hbWUsdWludCBhdHRyaWIpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9ta2RpcikoY29uc3QgY2hhciAqZmlsZW5hbWUpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9ybWRpcikoY29uc3QgY2hhciAqZmlsZW5hbWUpOwotICAgIHVpbnQgICAgKFBNQVBJUCBQTV9nZXRGaWxlQXR0cikoY29uc3QgY2hhciAqZmlsZW5hbWUpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9nZXRGaWxlVGltZSkoY29uc3QgY2hhciAqZmlsZW5hbWUsaWJvb2wgZ210VGltZSxQTV90aW1lICp0aW1lKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgUE1fc2V0RmlsZVRpbWUpKGNvbnN0IGNoYXIgKmZpbGVuYW1lLGlib29sIGdtdFRpbWUsUE1fdGltZSAqdGltZSk7Ci0gICAgY2hhciAqICAoUE1BUElQIENQVV9nZXRQcm9jZXNzb3JOYW1lKSh2b2lkKTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fZ2V0VkdBU3RhdGVTaXplKSh2b2lkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fc2F2ZVZHQVN0YXRlKSh2b2lkICpzdGF0ZUJ1Zik7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3Jlc3RvcmVWR0FTdGF0ZSkoY29uc3Qgdm9pZCAqc3RhdGVCdWYpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV92Z2FCbGFua0Rpc3BsYXkpKHZvaWQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV92Z2FVbmJsYW5rRGlzcGxheSkodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX2Jsb2NrVW50aWxUaW1lb3V0KSh1bG9uZyBtaWxsaXNlY29uZHMpOwotICAgIHZvaWQgICAgKFBNQVBJUCBfUE1fYWRkNjQpKHUzMiBhX2xvdyxzMzIgYV9oaWdoLHUzMiBiX2xvdyxzMzIgYl9oaWdoLF9faTY0ICpyZXN1bHQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBfUE1fc3ViNjQpKHUzMiBhX2xvdyxzMzIgYV9oaWdoLHUzMiBiX2xvdyxzMzIgYl9oaWdoLF9faTY0ICpyZXN1bHQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBfUE1fbXVsNjQpKHUzMiBhX2xvdyxzMzIgYV9oaWdoLHUzMiBiX2xvdyxzMzIgYl9oaWdoLF9faTY0ICpyZXN1bHQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBfUE1fZGl2NjQpKHUzMiBhX2xvdyxzMzIgYV9oaWdoLHUzMiBiX2xvdyxzMzIgYl9oaWdoLF9faTY0ICpyZXN1bHQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBfUE1fc2hyNjQpKHUzMiBhX2xvdyxzMzIgYV9oaWdoLHMzMiBzaGlmdCxfX2k2NCAqcmVzdWx0KTsKLSAgICB2b2lkICAgIChQTUFQSVAgX1BNX3NhcjY0KSh1MzIgYV9sb3csczMyIGFfaGlnaCxzMzIgc2hpZnQsX19pNjQgKnJlc3VsdCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIF9QTV9zaGw2NCkodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9faTY0ICpyZXN1bHQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBfUE1fbmVnNjQpKHUzMiBhX2xvdyxzMzIgYV9oaWdoLF9faTY0ICpyZXN1bHQpOwotICAgIHVsb25nICAgKFBNQVBJUCBQQ0lfZmluZEJBUlNpemUpKGludCBiYXIsUENJRGV2aWNlSW5mbyAqcGNpKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUENJX3JlYWRSZWdCbG9jaykoUENJRGV2aWNlSW5mbyAqaW5mbyxpbnQgaW5kZXgsdm9pZCAqZHN0LGludCBjb3VudCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBDSV93cml0ZVJlZ0Jsb2NrKShQQ0lEZXZpY2VJbmZvICppbmZvLGludCBpbmRleCx2b2lkICpzcmMsaW50IGNvdW50KTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fZmx1c2hUTEIpKHZvaWQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV91c2VMb2NhbE1hbGxvYykodm9pZCAqICgqbWFsbG9jKShzaXplX3Qgc2l6ZSksdm9pZCAqICgqY2FsbG9jKShzaXplX3QgbmVsZW0sc2l6ZV90IHNpemUpLHZvaWQgKiAoKnJlYWxsb2MpKHZvaWQgKnB0cixzaXplX3Qgc2l6ZSksdm9pZCAoKmZyZWUpKHZvaWQgKnApKTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fbWFsbG9jKShzaXplX3Qgc2l6ZSk7Ci0gICAgdm9pZCAqICAoUE1BUElQIFBNX2NhbGxvYykoc2l6ZV90IG5lbGVtLHNpemVfdCBzaXplKTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fcmVhbGxvYykodm9pZCAqcHRyLHNpemVfdCBzaXplKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fZnJlZSkodm9pZCAqcCk7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKSh2b2lkICpwLHVsb25nIGxlbmd0aCx1bG9uZyAqcGh5c0FkZHJlc3MpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9hbGxvY1BhZ2UpKGlib29sIGxvY2tlZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX2ZyZWVQYWdlKSh2b2lkICpwKTsKLSAgICB1bG9uZyAgIChQTUFQSVAgUE1fYWdwSW5pdCkodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX2FncEV4aXQpKHZvaWQpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9hZ3BSZXNlcnZlUGh5c2ljYWwpKHVsb25nIG51bVBhZ2VzLGludCB0eXBlLHZvaWQgKipwaHlzQ29udGV4dCxQTV9waHlzQWRkciAqcGh5c0FkZHIpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9hZ3BSZWxlYXNlUGh5c2ljYWwpKHZvaWQgKnBoeXNDb250ZXh0KTsKLSAgICBpYm9vbCAgIChQTUFQSVAgUE1fYWdwQ29tbWl0UGh5c2ljYWwpKHZvaWQgKnBoeXNDb250ZXh0LHVsb25nIG51bVBhZ2VzLHVsb25nIHN0YXJ0T2Zmc2V0LFBNX3BoeXNBZGRyICpwaHlzQWRkcik7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBNX2FncEZyZWVQaHlzaWNhbCkodm9pZCAqcGh5c0NvbnRleHQsdWxvbmcgbnVtUGFnZXMsdWxvbmcgc3RhcnRPZmZzZXQpOwotICAgIGludCAgICAgKFBNQVBJUCBQQ0lfZ2V0TnVtRGV2aWNlcykodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3NldExvY2FsQlBEUGF0aCkoY29uc3QgY2hhciAqcGF0aCk7Ci0gICAgdm9pZCAqICAoUE1BUElQIFBNX2xvYWREaXJlY3REcmF3KShpbnQgZGV2aWNlKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fdW5sb2FkRGlyZWN0RHJhdykoaW50IGRldmljZSk7Ci0gICAgUE1fSFdORCAoUE1BUElQIFBNX2dldERpcmVjdERyYXdXaW5kb3cpKHZvaWQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9kb1N1c3BlbmRBcHApKHZvaWQpOwotICAgIH0gUE1faW1wb3J0czsKLQotI3ByYWdtYSBwYWNrKCkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7ICAgICAgICAgICAgLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KLSNlbmRpZgotCi0jaWZkZWYgIF9fV0lOMzJfVlhEX18KLSNkZWZpbmUgVkVTQV9CVUZfU0laRSAxMDI0Ci1leHRlcm4gdWNoYXIgKl9QTV9ybUJ1ZkFkZHI7Ci0jZW5kaWYKLQotLyoge3NlY3JldH0gUG9pbnRlciB0byBnbG9iYWwgZXhwb3J0cyBzdHJ1Y3R1cmUuCi0gKiBTaG91bGQgbm90IGJlIHVzZWQgYnkgYXBwbGljYXRpb24gcHJvZ3JhbXMuCi0gKi8KLWV4dGVybiBQTV9pbXBvcnRzIF9WQVJBUEkgX1BNX2ltcG9ydHM7Ci0KLS8qIHtzZWNyZXR9ICovCi1leHRlcm4gdm9pZCAqICgqX19QTV9tYWxsb2MpKHNpemVfdCBzaXplKTsKLS8qIHtzZWNyZXR9ICovCi1leHRlcm4gdm9pZCAqICgqX19QTV9jYWxsb2MpKHNpemVfdCBuZWxlbSxzaXplX3Qgc2l6ZSk7Ci0vKiB7c2VjcmV0fSAqLwotZXh0ZXJuIHZvaWQgKiAoKl9fUE1fcmVhbGxvYykodm9pZCAqcHRyLHNpemVfdCBzaXplKTsKLS8qIHtzZWNyZXR9ICovCi1leHRlcm4gdm9pZCAoKl9fUE1fZnJlZSkodm9pZCAqcCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFJvdXRpbmUgdG8gaW5pdGlhbGlzZSB0aGUgaG9zdCBzaWRlIFBNIGxpYnJhcnkuIE5vdGUgdXNlZCBmcm9tIERMTCdzICovCi0KLXZvaWQgICAgUE1BUEkgUE1faW5pdCh2b2lkKTsKLQotLyogUm91dGluZSB0byByZXR1cm4gZWl0aGVyIFBNX3JlYWxNb2RlLCBQTV8yODYgb3IgUE1fMzg2ICovCi0KLWludCAgICAgUE1BUEkgUE1fZ2V0TW9kZVR5cGUodm9pZCk7Ci0KLS8qIFJvdXRpbmUgdG8gcmV0dXJuIGEgc2VsZWN0b3IgdG8gdGhlIEJJT1MgZGF0YSBhcmVhIGF0IHNlZ21lbnQgMHg0MCAqLwotCi12b2lkICogIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpOwotCi0vKiBSb3V0aW5lIHRvIHJldHVybiBhIGxpbmVhciBwb2ludGVyIHRvIHRoZSBWR0EgZnJhbWUgYnVmZmVyIG1lbW9yeSAqLwotCi12b2lkICogIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKTsKLQotLyogUm91dGluZXMgdG8gbWFwL2ZyZWUgcGh5c2ljYWwgbWVtb3J5IGludG8gdGhlIGN1cnJlbnQgRFMgc2VnbWVudC4gSW4KLSAqIHNvbWUgZW52aXJvbm1lbnRzICgzMi1iaXQgRE9TIGlzIG9uZSksIGFmdGVyIHRoZSBtYXBwaW5nIGhhcyBiZWVuCi0gKiBhbGxvY2F0ZWQsIGl0IGNhbm5vdCBiZSBmcmVlZC4gSGVuY2UgeW91IHNob3VsZCBvbmx5IGFsbG9jYXRlIHRoZQotICogbWFwcGluZyBvbmNlIGFuZCBjYWNoZSB0aGUgdmFsdWUgZm9yIHVzZSBieSBvdGhlciBwYXJ0cyBvZiB5b3VyCi0gKiBhcHBsaWNhdGlvbi4gSWYgdGhlIG1hcHBpbmcgY2Fubm90IGJlIGNyZWF0ZWVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwKLSAqIHJldHVybiBhIE5VTEwgcG9pbnRlci4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgd2lsbCBhbHNvIHdvcmsgZm9yIG1lbW9yeSBhZGRyZXNzZXMgYmVsb3cgMU1iLCBidXQgdGhlCi0gKiBtYXBwZWQgYWRkcmVzcyBjYW5ub3QgY3Jvc3MgdGhlIDFNYiBib3VuZGFyeS4KLSAqLwotCi12b2lkICogIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKTsKLXZvaWQgICAgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcih2b2lkICpwdHIsdWxvbmcgbGltaXQpOwotCi0vKiBSb3V0aW5lIHRvIGRldGVybWluZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciBhZGRyZXNzLiBJdCBpcwotICogdXAgdG8gdGhlIGNhbGxlciB0byBlbnN1cmUgdGhlIGVudGlyZSBhZGRyZXNzIHJhbmdlIGZvciBhIGxpbmVhcgotICogYmxvY2sgb2YgbWVtb3J5IGlzIHBhZ2UgYWxpZ25lZCBpZiB0aGF0IGlzIHJlcXVpcmVkLgotICovCi0KLXVsb25nICAgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApOwotaWJvb2wgICBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHJSYW5nZSh2b2lkICpwLHVsb25nIGxlbmd0aCx1bG9uZyAqcGh5c0FkZHJlc3MpOwotCi0vKiBSb3V0aW5lcyBmb3IgbWVtb3J5IGFsbG9jYXRpb24uIEJ5IGRlZmF1bHQgdGhlc2UgZnVuY3Rpb25zIHVzZSB0aGUgcmVndWxhcgotICogQyBydW50aW1lIGxpYnJhcnkgbWFsbG9jL2ZyZWUgZnVuY3Rpb25zLCBidXQgeW91IGNhbiB1c2UgdGhlCi0gKiBQTV91c2VMb2NhbE1hbGxvYyBmdW5jdGlvbiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBtZW1vcnkgYWxsb2NhdG9yIHdpdGgKLSAqIHlvdXIgb3duIG1lbW9yeSBhbGxvY2F0b3IuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCBhbGwgbWVtb3J5IGFsbG9jYXRpb24KLSAqIHVzZWQgYnkgU2NpVGVjaCBwcm9kdWN0cyB3aWxsIHVzZSB5b3VyIG92ZXJyaWRkZW4gbWVtb3J5IGFsbG9jYXRvcgotICogZnVuY3Rpb25zLgotICoKLSAqIE5vdGUgdGhhdCBCUEQgZmlsZXMgYXV0b21hdGljYWxseSBtYXAgdGhlIEMgcnVudGltZSBsaWJyYXJ5Ci0gKiBtYWxsb2MvY2FsbG9jL3JlYWxsb2MvZnJlZSBjYWxscyBmcm9tIGluc2lkZSB0aGUgQlBEIHRvIHRoZSBQTSBsaWJyYXJ5Ci0gKiB2ZXJzaW9ucyBieSBkZWZhdWx0LgotICovCi0KLXZvaWQgICAgUE1BUEkgUE1fdXNlTG9jYWxNYWxsb2Modm9pZCAqICgqbWFsbG9jKShzaXplX3Qgc2l6ZSksdm9pZCAqICgqY2FsbG9jKShzaXplX3QgbmVsZW0sc2l6ZV90IHNpemUpLHZvaWQgKiAoKnJlYWxsb2MpKHZvaWQgKnB0cixzaXplX3Qgc2l6ZSksdm9pZCAoKmZyZWUpKHZvaWQgKnApKTsKLXZvaWQgKiAgUE1BUEkgUE1fbWFsbG9jKHNpemVfdCBzaXplKTsKLXZvaWQgKiAgUE1BUEkgUE1fY2FsbG9jKHNpemVfdCBuZWxlbSxzaXplX3Qgc2l6ZSk7Ci12b2lkICogIFBNQVBJIFBNX3JlYWxsb2Modm9pZCAqcHRyLHNpemVfdCBzaXplKTsKLXZvaWQgICAgUE1BUEkgUE1fZnJlZSh2b2lkICpwKTsKLQotLyogUm91dGluZSB0byBhbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBpbiB0aGUgZ2xvYmFsIHNoYXJlZCByZWdpb24gdGhhdAotICogaXMgY29tbW9uIHRvIGFsbCB0YXNrcyBhbmQgYWNjZXNzaWJsZSBmcm9tIHJpbmcgMCBjb2RlLgotICovCi0KLXZvaWQgKiAgUE1BUEkgUE1fbWFsbG9jU2hhcmVkKGxvbmcgc2l6ZSk7Ci0KLS8qIFJvdXRpbmUgdG8gZnJlZSB0aGUgYWxsb2NhdGVkIHNoYXJlZCBtZW1vcnkgYmxvY2sgKi8KLQotdm9pZCAgICBQTUFQSSBQTV9mcmVlU2hhcmVkKHZvaWQgKnB0cik7Ci0KLS8qIEF0dGFjaCBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIGxpbmVhciBtYXBwaW5nIHRvIGEgbmV3IHByb2Nlc3MgKi8KLQotdm9pZCAqICBQTUFQSSBQTV9tYXBUb1Byb2Nlc3Modm9pZCAqbGluZWFyLHVsb25nIGxpbWl0KTsKLQotLyogTWFjcm9zIHRvIGV4dHJhY3QgYnl0ZSwgd29yZCBhbmQgbG9uZyB2YWx1ZXMgZnJvbSBhIGNoYXIgcG9pbnRlciAqLwotCi0jZGVmaW5lIFBNX2dldEJ5dGUocCkgICAgICAgKigodm9sYXRpbGUgdWNoYXIqKShwKSkKLSNkZWZpbmUgUE1fZ2V0V29yZChwKSAgICAgICAqKCh2b2xhdGlsZSB1c2hvcnQqKShwKSkKLSNkZWZpbmUgUE1fZ2V0TG9uZyhwKSAgICAgICAqKCh2b2xhdGlsZSB1bG9uZyopKHApKQotI2RlZmluZSBQTV9zZXRCeXRlKHAsdikgICAgIFBNX2dldEJ5dGUocCkgPSAodikKLSNkZWZpbmUgUE1fc2V0V29yZChwLHYpICAgICBQTV9nZXRXb3JkKHApID0gKHYpCi0jZGVmaW5lIFBNX3NldExvbmcocCx2KSAgICAgUE1fZ2V0TG9uZyhwKSA9ICh2KQotCi0vKiBSb3V0aW5lIGZvciBhY2Nlc3NpbmcgYSBsb3cgMU1iIG1lbW9yeSBibG9jay4gWW91IGRvbnQgbmVlZCB0byBmcmVlIHRoaXMKLSAqIHBvaW50ZXIsIGJ1dCBpbiAxNiBiaXQgcHJvdGVjdGVkIG1vZGUgdGhlIHNlbGVjdG9yIGFsbG9jYXRlZCB3aWxsIGJlCi0gKiByZS11c2VkIHRoZSBuZXh0IHRpbWUgdGhpcyByb3V0aW5lIGlzIGNhbGxlZC4KLSAqLwotCi12b2lkICogIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZik7Ci0KLS8qIFJvdXRpbmUgdG8gYWxsb2NhdGUgYSBibG9jayBvZiBjb252ZW50aW9uYWwgbWVtb3J5IGJlbG93IHRoZSAxTWIKLSAqIGxpbWl0IHNvIHRoYXQgaXQgY2FuIGJlIGFjY2Vzc2VkIGZyb20gcmVhbCBtb2RlLiBFbnN1cmUgdGhhdCB5b3UgZnJlZQotICogdGhlIHNlZ21lbnQgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBpdC4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgcmV0dXJucyBhIHNlbGVjdG9yIGFuZCBvZmZzZXQgdG8gdGhlIHNlZ21lbnQgdGhhdCBoYXMgYmVlbgotICogYWxsb2NhdGVkLCBhbmQgYWxzbyByZXR1cm5zIHRoZSByZWFsIG1vZGUgc2VnbWVudCBhbmQgb2Zmc2V0IHdoaWNoIGNhbgotICogYmUgcGFzc2VkIHRvIHJlYWwgbW9kZSByb3V0aW5lcy4gV2lsbCByZXR1cm4gMCBpZiBtZW1vcnkgY291bGQgbm90IGJlCi0gKiBhbGxvY2F0ZWQuCi0gKgotICogUGxlYXNlIG5vdGUgdGhhdCB3aXRoIHNvbWUgRE9TIGV4dGVuZGVycywgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIHRoZQotICogZm9sbG93aW5nIGZ1bmN0aW9uIGNhbm5vdCBiZSBmcmVlZCwgaGVuY2UgaXQgd2lsbCBiZSBhbGxvY2F0ZWQgZm9yIHRoZQotICogbGlmZSBvZiB5b3VyIHByb2dyYW0uIFRodXMgaWYgeW91IG5lZWQgdG8gY2FsbCBhIGJ1bmNoIG9mIGRpZmZlcmVudAotICogcmVhbC1tb2RlIHJvdXRpbmVzIGluIHlvdXIgcHJvZ3JhbSwgYWxsb2NhdGUgYSBzaW5nbGUgbGFyZ2UgYnVmZmVyIGF0Ci0gKiBwcm9ncmFtIHN0YXJ0dXAgdGhhdCBjYW4gYmUgcmUtdXNlZCB0aHJvdWdob3V0IHRoZSBwcm9ncmFtIGV4ZWN1dGlvbi4KLSAqLwotCi12b2lkICogIFBNQVBJIFBNX2FsbG9jUmVhbFNlZyh1aW50IHNpemUsdWludCAqcl9zZWcsdWludCAqcl9vZmYpOwotdm9pZCAgICBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pOwotCi0vKiBSb3V0aW5lIHRvIGFsbG9jYXRlIGEgYmxvY2sgb2YgbG9ja2VkIG1lbW9yeSwgYW5kIHJldHVybiBib3RoIHRoZQotICogbGluZWFyIGFuZCBwaHlzaWNhbCBhZGRyZXNzZXMgb2YgdGhlIG1lbW9yeS4gWW91IHNob3VsZCBhbHdheXMKLSAqIGFsbG9jYXRlIGxvY2tlZCBtZW1vcnkgYmxvY2tzIGluIHBhZ2Ugc2l6ZWQgY2h1bmtzIChpZTogNEsgb24gSUEzMikuCi0gKiBJZiB0aGUgbWVtb3J5IGlzIG5vdCBjb250aWd1b3VzLCB5b3Ugd2lsbCBuZWVkIHRvIHVzZSB0aGUKLSAqIFBNX2dldFBoeXNpY2FsQWRkciBmdW5jdGlvbiB0byBnZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgbGluZWFyCi0gKiBwYWdlcyB3aXRoaW4gdGhlIG1lbW9yeSBibG9jayAodGhlIHJldHVybmVkIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZQotICogZm9yIHRoZSBmaXJzdCBhZGRyZXNzIGluIHRoZSBtZW1vcnkgYmxvY2sgb25seSkuCi0gKi8KLQotdm9pZCAqICBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSh1aW50IHNpemUsdWxvbmcgKnBoeXNBZGRyLGlib29sIGNvbnRpZ3VvdXMsaWJvb2wgYmVsb3cxNk1lZyk7Ci12b2lkICAgIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0odm9pZCAqcCx1aW50IHNpemUsaWJvb2wgY29udGlndW91cyk7Ci0KLS8qIFJvdXRpbmUgdG8gYWxsb2NhdGUgYW5kIGZyZWUgcGFnZWQgc2l6ZWQgYmxvY2tzIG9mIHNoYXJlZCBtZW1vcnkuCi0gKiBBZGRyZXNzYWJsZSBmcm9tIGFsbCBwcm9jZXNzZXMsIGJ1dCBub3QgZnJvbSBhIHJpbmcgMCBjb250ZXh0Ci0gKiB1bmRlciBPUy8yLiBOb3RlIHRoYXQgdW5kZXIgT1MvMiBQTV9tYXBTaGFyZWRQYWdlcyBtdXN0IGJlIGNhbGxlZAotICogdG8gbWFwIHRoZSBtZW1vcnkgYmxvY2tzIGludG8gdGhlIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyBzcGFjZQotICogb2YgZWFjaCBjb25uZWN0aW5nIHByb2Nlc3MuCi0gKi8KLQotdm9pZCAqICBQTUFQSSBQTV9hbGxvY1BhZ2UoaWJvb2wgbG9ja2VkKTsKLXZvaWQgICAgUE1BUEkgUE1fZnJlZVBhZ2Uodm9pZCAqcCk7Ci0jaWZkZWYgX19PUzJfXwotdm9pZCAgICBQTUFQSSBQTV9tYXBTaGFyZWRQYWdlcyh2b2lkKTsKLSNlbmRpZgotCi0vKiBSb3V0aW5lIHRvIHJldHVybiB0cnVlIGlmIHdlIGhhdmUgYWNjZXNzIHRvIHRoZSBCSU9TIG9uIHRoZSBob3N0IE9TICovCi0KLWlib29sICAgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCk7Ci0KLS8qIFJvdXRpbmUgdG8gY2FsbCBhIHJlYWwgbW9kZSBhc3NlbWJseSBsYW5ndWFnZSBwcm9jZWR1cmUuIFJlZ2lzdGVyCi0gKiB2YWx1ZXMgYXJlIHBhc3NlZCBpbiBhbmQgb3V0IGluIHRoZSAncmVncycgYW5kICdzcmVncycgc3RydWN0dXJlcy4gV2UKLSAqIGRvIG5vdCBwcm92aWRlIGFueSBtZXRob2Qgb2YgY29weWluZyBkYXRhIGZyb20gdGhlIHByb3RlY3RlZCBtb2RlIHN0YWNrCi0gKiB0byB0aGUgcmVhbCBtb2RlIHN0YWNrLCBzbyBpZiB5b3UgbmVlZCB0byBwYXNzIGRhdGEgdG8gcmVhbCBtb2RlLCB5b3Ugd2lsbAotICogbmVlZCB0byB3cml0ZSBhIHJlYWwgbW9kZSBhc3NlbWJseSBsYW5ndWFnZSBob29rIHRvIHJlY2lldmUgdGhlIHZhbHVlcwotICogaW4gcmVnaXN0ZXJzLCBhbmQgdG8gcGFzcyB0aGUgZGF0YSB0aHJvdWdoIGEgcmVhbCBtb2RlIGJsb2NrIGFsbG9jYXRlZAotICogd2l0aCB0aGUgUE1fYWxsb2NSZWFsU2VnKCkgcm91dGluZS4KLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSh1aW50IHNlZyx1aW50IG9mZiwgUk1SRUdTICpyZWdzLFJNU1JFR1MgKnNyZWdzKTsKLQotLyogUm91dGluZXMgdG8gZ2VuZXJhdGUgcmVhbCBtb2RlIGludGVycnVwdHMgdXNpbmcgdGhlIHNhbWUgaW50ZXJmYWNlIHRoYXQKLSAqIGlzIHVzZWQgYnkgaW50ODYoKSBhbmQgaW50ODZ4KCkgaW4gcmVhbG1vZGUuIFRoaXMgcm91dGluZSBpcyBuZWVkIHRvCi0gKiBjYWxsIGNlcnRhaW4gQklPUyBhbmQgRE9TIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHNvbWUKLSAqIERPUyBleHRlbmRlcnMuIE5vIHRyYW5zbGF0aW9uIGlzIGRvbmUgb24gYW55IG9mIHRoZSByZWdpc3RlciB2YWx1ZXMsCi0gKiBzbyB0aGV5IG11c3QgYmUgY29ycmVjdGx5IHNldCB1cCBhbmQgdHJhbnNsYXRlZCBieSB0aGUgY2FsbGluZyBwcm9ncmFtLgotICoKLSAqIE5vcm1hbGx5IHRoZSBET1MgZXh0ZW5kZXJzIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aGUgbm9ybWFsIGludDg2KCkKLSAqIGZ1bmN0aW9uIGRpcmVjdGx5IGFuZCB3aWxsIHBhc3Mgb24gdW5oYW5kbGVkIGNhbGxzIHRvIHJlYWwgbW9kZSB0byBiZQotICogaGFuZGxlZCBieSB0aGUgcmVhbCBtb2RlIGhhbmRsZXIuIEhvd2V2ZXIgY2FsbHMgdG8gaW50ODZ4KCkgd2l0aCByZWFsCi0gKiBtb2RlIHNlZ21lbnQgdmFsdWVzIHRvIGJlIGxvYWRlZCB3aWxsIGNhdXNlIGEgR1BGIGlmIHVzZWQgd2l0aCB0aGUKLSAqIHN0YW5kYXJkIGludDg2eCgpLCBzbyB5b3Ugc2hvdWxkIHVzZSB0aGVzZSByb3V0aW5lcyBpZiB5b3Uga25vdyB5b3UKLSAqIHdhbnQgdG8gY2FsbCBhIHJlYWwgbW9kZSBoYW5kbGVyLgotICovCi0KLWludCAgICAgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCk7Ci1pbnQgICAgIFBNQVBJIFBNX2ludDg2eChpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0LFJNU1JFR1MgKnNyZWdzKTsKLQotLyogUm91dGluZSB0byBnZW5lcmF0ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQuIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZQotICogYWJvdmUgZnVuY3Rpb24sIGJ1dCB0YWtlcyBhIERQTUlfcmVncyBzdHJ1Y3R1cmUgZm9yIHRoZSByZWdpc3RlcnMKLSAqIHdoaWNoIGhhcyBhIGxvdCBtb3JlIGluZm9ybWF0aW9uLiBJdCBpcyBvbmx5IGF2YWlsYWJsZSBmcm9tIDMyLWJpdAotICogcHJvdGVjdGVkIG1vZGUuCi0gKi8KLQotdm9pZCAgICBQTUFQSSBEUE1JX2ludDg2KGludCBpbnRubywgRFBNSV9yZWdzICpyZWdzKTsKLQotLyogRnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBhbW91bnQgb2YgYXZhaWxhYmxlIHBoeXNpY2FsIGFuZCB0b3RhbCBtZW1vcnkuCi0gKiBUaGUgcmVzdWx0cyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSAqb25seSogdmFsaWQgYmVmb3JlIHlvdSBoYXZlIG1hZGUgYW55Ci0gKiBjYWxscyB0byBtYWxsb2MoKSBhbmQgZnJlZSgpLiBJZiB5b3UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGV4YWN0bHkgaG93Ci0gKiBtdWNoIG1lbW9yeSBpcyBjdXJyZW50bHkgYWxsb2NhdGVkLCB5b3UgbmVlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gdG8KLSAqIGdldCB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSBhdmFpbGFibGUgYW5kIHRoZW4ga2VlcCB0cmFjayBvZgotICogdGhlIGF2YWlsYWJsZSBtZW1vcnkgZXZlcnkgdGltZSB5b3UgY2FsbCBtYWxsb2MoKSBhbmQgZnJlZSgpLgotICovCi0KLXZvaWQgICAgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KHVsb25nICpwaHlzaWNhbCx1bG9uZyAqdG90YWwpOwotCi0vKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgYSBnbG9iYWwgVkVTQSByZWFsIG1vZGUgdHJhbnNmZXIgYnVmZmVyIGZvciB1c2UKLSAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAqLwotCi12b2lkICogIFBNQVBJIFBNX2dldFZFU0FCdWYodWludCAqbGVuLHVpbnQgKnJzZWcsdWludCAqcm9mZik7Ci0KLS8qIEhhbmRsZSBmYXRhbCBlcnJvciBjb25kaXRpb25zICovCi0KLXZvaWQgICAgUE1BUEkgUE1fZmF0YWxFcnJvcihjb25zdCBjaGFyICptc2cpOwotCi0vKiBGdW5jdGlvbiB0byBzZXQgYSBjbGVhbnVwIGVycm9yIGhhbmRsZXIgY2FsbGVkIHdoZW4gUE1fZmF0YWxFcnJvcgotICogaXMgY2FsbGVkLiBUaGlzIGFsbG93cyB1cyB0byB0aGUgY29uc29sZSBiYWNrIGludG8gYSBub3JtYWwgc3RhdGUKLSAqIGlmIHdlIGdldCBhIGZhaWx1cmUgZnJvbSBkZWVwIGluc2lkZSBhIEJQRCBmaWxlLiBUaGlzIGZ1bmN0aW9uIGlzCi0gKiBub3QgZXhwb3J0ZWQgdG8gQlBEIGZpbGVzLCBhbmQgaXMgb25seSB1c2VkIGJ5IGNvZGUgY29tcGlsZWQgZm9yIHRoZQotICogT1MuCi0gKi8KLQotdm9pZCAgICBQTUFQSSBQTV9zZXRGYXRhbEVycm9yQ2xlYW51cChQTV9mYXRhbENsZWFudXBIYW5kbGVyIGNsZWFudXApOwotCi0vKiBSZXR1cm4gdGhlIE9TIHR5cGUgZmxhZyBhcyBkZWZpbmVkIGluIDxkcnZsaWIvb3Mvb3MuaD4gKi8KLQotbG9uZyAgICBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBzZXQgYSBWQkUgYmFuayB2aWEgYW4gSW50IDEwaCAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NldEJhbmtBKGludCBiYW5rKTsKLXZvaWQgICAgUE1BUEkgUE1fc2V0QmFua0FCKGludCBiYW5rKTsKLXZvaWQgICAgUE1BUEkgUE1fc2V0Q1JUU3RhcnQoaW50IHgsaW50IHksaW50IHdhaXRWUlQpOwotCi0vKiBSZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKi8KLQotY2hhciAqICBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aChjaGFyICpwYXRoLGludCBtYXhMZW4pOwotCi0vKiBSZXR1cm4gcGF0aHMgdG8gdGhlIFZCRS9BRiBhbmQgTnVjbGV1cyBkaXJlY3RvcmllcyAqLwotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpOwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpOwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpOwotCi0vKiBGaW5kIHRoZSBwYXRoIHRvIGEgYmluYXJ5IHBvcnRhYmxlIERMTCAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NldExvY2FsQlBEUGF0aChjb25zdCBjaGFyICpwYXRoKTsKLWlib29sICAgUE1BUEkgUE1fZmluZEJQRChjb25zdCBjaGFyICpkbGxuYW1lLGNoYXIgKmJwZHBhdGgpOwotCi0vKiBSZXR1cm5zIHRoZSBkcml2ZSBsZXR0ZXIgb2YgdGhlIGJvb3QgZHJpdmUgZm9yIERPUywgT1MvMiBhbmQgV2luZG93cyAqLwotCi1jaGFyICAgIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKTsKLQotLyogUmV0dXJuIGEgbmV0d29yayB1bmlxdWUgbWFjaGluZSBpZGVudGlmaWVyIGFzIGEgc3RyaW5nICovCi0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKTsKLQotLyogUmV0dXJuIHRoZSBuZXR3b3JrIG1hY2hpbmUgbmFtZSBhcyBhIHN0cmluZyAqLwotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBpbnN0YWxsIGFuZCByZW1vdmUgdGhlIHZpcnR1YWwgbGluZWFyIGZyYW1lYnVmZmVyCi0gKiBlbXVsYXRpb24gY29kZS4gRm9yIHVuc3VwcG9ydGVkIERPUyBleHRlbmRlcnMgYW5kIHdoZW4gcnVubmluZyB1bmRlcgotICogYSBEUE1JIGhvc3QgbGlrZSBXaW5kb3dzIG9yIE9TLzIsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBOVUxMLgotICovCi0KLWlib29sICAgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpOwotdm9pZCAqICBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYyk7Ci12b2lkICAgIFBNQVBJIFZGX2V4aXQodm9pZCk7Ci0KLS8qIEZ1bmN0aW9ucyB0byB3YWl0IGZvciBhIGtleXByZXNzIGFuZCByZWFkIGEga2V5IGZvciBjb21tYW5kIGxpbmUKLSAqIGVudmlyb25tZW50cyBzdWNoIGFzIERPUywgV2luMzIgY29uc29sZSBhbmQgVW5peC4KLSAqLwotCi1pbnQgICAgIFBNQVBJIFBNX2tiaGl0KHZvaWQpOwotaW50ICAgICBQTUFQSSBQTV9nZXRjaCh2b2lkKTsKLQotLyogRnVuY3Rpb25zIHRvIGNyZWF0ZSBlaXRoZXIgYSBmdWxsc2NyZWVuIG9yIHdpbmRvd2VkIGNvbnNvbGUgb24gdGhlCi0gKiBkZXNrdG9wLCBhbmQgdG8gYWxsb3cgdGhlIHJlc29sdXRpb24gb2YgZnVsbHNjcmVlbiBjb25zb2xlcyB0byBiZQotICogY2hhbmdlZCBvbiB0aGUgZmx5IHdpdGhvdXQgY2xvc2luZyB0aGUgY29uc29sZS4gRm9yIG5vbi13aW5kb3dlZAotICogZW52aXJvbm1lbnRzIChzdWNoIGFzIGEgTGludXggb3IgT1MvMiBmdWxsc2NyZWVuIGNvbnNvbGUpLCB0aGVzZQotICogZnVuY3Rpb25zIGVuYWJsZSBjb25zb2xlIGdyYXBoaWNzIG1vZGUgYW5kIHJlc3RvcmUgY29uc29sZSB0ZXh0IG1vZGUuCi0gKgotICogVGhlIHN1c3BlbmQgYXBwbGljYXRpb24gY2FsbGJhY2sgaXMgdXNlZCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8KLSAqIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBmdWxsc2NyZWVuIGNvbnNvbGUgbW9kZSB0byBhbGxvdyB0ZW1wb3JhcnkKLSAqIHN3aXRjaGluZyB0byBhbm90aGVyIGNvbnNvbGUgb3IgYmFjayB0byB0aGUgcmVndWxhciBHVUkgZGVza3RvcC4gSXQKLSAqIGlzIGFsc28gY2FsbGVkIHRvIHJlc3RvcmUgdGhlIGZ1bGxzY3JlZW4gZ3JhcGhpY3Mgc3RhdGUgYWZ0ZXIgdGhlCi0gKiBmdWxsc2NyZWVuIGNvbnNvbGUgcmVnYWlucyB0aGUgZm9jdXMuCi0gKgotICogVGhlIGRldmljZSBwYXJhbWV0ZXIgYWxsb3dzIGZvciB0aGUgY29uc29sZSB0byBiZSBvcGVuZWQgb24gYSBkaWZmZXJlbnQKLSAqIGRpc3BsYXkgY29udHJvbGxlcnMgKDAgaXMgYWx3YXlzIHRoZSBwcmltYXJ5IGNvbnRyb2xsZXIpLgotICovCi0KLVBNX0hXTkQgUE1BUEkgUE1fb3BlbkNvbnNvbGUoUE1fSFdORCBod25kVXNlcixpbnQgZGV2aWNlLGludCB4UmVzLGludCB5UmVzLGludCBicHAsaWJvb2wgZnVsbFNjcmVlbik7Ci1pbnQgICAgIFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCk7Ci12b2lkICAgIFBNQVBJIFBNX3NhdmVDb25zb2xlU3RhdGUodm9pZCAqc3RhdGVCdWYsUE1fSFdORCBod25kQ29uc29sZSk7Ci12b2lkICAgIFBNQVBJIFBNX3NldFN1c3BlbmRBcHBDYWxsYmFjayhQTV9zYXZlU3RhdGVfY2Igc2F2ZVN0YXRlKTsKLXZvaWQgICAgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShjb25zdCB2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKTsKLXZvaWQgICAgUE1BUEkgUE1fY2xvc2VDb25zb2xlKFBNX0hXTkQgaHduZENvbnNvbGUpOwotCi0vKiBGdW5jdGlvbnMgdG8gbW9kaWZ5IE9TIGNvbnNvbGUgaW5mb3JtYXRpb24gKi8KLQotdm9pZCAgICBQTUFQSSBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKGludCB4LGludCB5KTsKLXZvaWQgICAgUE1BUEkgUE1fc2V0T1NTY3JlZW5XaWR0aChpbnQgd2lkdGgsaW50IGhlaWdodCk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGVtYWJsZSBJbnRlbCBQUHJvL1BJSSB3cml0ZSBjb21iaW5pbmcgKi8KLQotaW50ICAgICBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUodWxvbmcgYmFzZSx1bG9uZyBsZW5ndGgsdWludCB0eXBlKTsKLWludCAgICAgUE1BUEkgUE1fZW51bVdyaXRlQ29tYmluZShQTV9lbnVtV3JpdGVDb21iaW5lX3QgY2FsbGJhY2spOwotCi0vKiBGdW5jdGlvbiB0byBhZGQgYSBwYXRoIHNlcGFyYXRvciB0byB0aGUgZW5kIG9mIGEgZmlsZW5hbWUgKGlmIG5vdCBwcmVzZW50KSAqLwotCi12b2lkICAgIFBNQVBJIFBNX2JhY2tzbGFzaChjaGFyICpmaWxlbmFtZSk7Ci0KLS8qIFJvdXRpbmVzIHRvIGxvY2sgYW5kIHVubG9jayByZWdpb25zIG9mIG1lbW9yeSB1bmRlciBhIHZpcnR1YWwgbWVtb3J5Ci0gKiBlbnZpcm9ubWVudC4gVGhlc2Ugcm91dGluZXMgX211c3RfIGJlIHVzZWQgdG8gbG9jayBhbGwgaGFyZHdhcmUKLSAqIGFuZCBtb3VzZSBpbnRlcnJ1cHQgaGFuZGxlcnMgaW5zdGFsbGVkLCBfQU5EXyBhbnkgZ2xvYmFsIGRhdGEgdGhhdAotICogdGhlc2UgaGFuZGxlciBtYW5pcHVsYXRlLCBzbyB0aGF0IHRoZXkgd2lsbCBhbHdheXMgYmUgcHJlc2VudCBpbiBtZW1vcnkKLSAqIHRvIGhhbmRsZSB0aGUgaW5jb21pbmcgaW50ZXJydXB0cy4KLSAqCi0gKiBOb3RlIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGNhbGwgdGhlIGNvcnJlY3Qgcm91dGluZSBkZXBlbmRpbmcgb24KLSAqIHdoZXRoZXIgdGhlIGFyZWEgYmVpbmcgbG9ja2VkIGlzIGNvZGUgb3IgZGF0YSwgc28gdGhhdCB1bmRlciAzMiBiaXQKLSAqIFBNIHdlIHdpbGwgZ2V0IHRoZSBzZWxlY3RvciB2YWx1ZSBjb3JyZWN0LgotICovCi0KLWludCAgICAgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpOwotaW50ICAgICBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKTsKLWludCAgICAgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcyhfX2NvZGVQdHIgcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKTsKLWludCAgICAgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKF9fY29kZVB0ciBwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpOwotCi0vKiBSb3V0aW5lcyB0byBpbnN0YWxsIGFuZCByZW1vdmUgUmVhbCBUaW1lIENsb2NrIGludGVycnVwdCBoYW5kbGVycy4gVGhlCi0gKiBmcmVxdWVuY3kgb2YgdGhlIHJlYWwgdGltZSBjbG9jayBjYW4gYmUgY2hhbmdlZCBieSBjYWxsaW5nCi0gKiBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbnksIGFuZCB0aGUgdmFsdWUgY2FuIGJlIGFueSBwb3dlciBvZiAyIHZhbHVlCi0gKiBmcm9tIDJIeiB0byA4MTkySHouCi0gKgotICogTm90ZSB0aGF0IHlvdSBfbXVzdF8gbG9jayB0aGUgbWVtb3J5IGNvbnRhaW5pbmcgdGhlIGludGVycnVwdAotICogaGFuZGxlcnMgd2l0aCB0aGUgUE1fbG9ja1BhZ2VzKCkgZnVuY3Rpb24gb3RoZXJ3aXNlIHlvdSBtYXkgZW5jb3VudGVyCi0gKiBwcm9ibGVtcyBpbiB2aXJ0dWFsIG1lbW9yeSBlbnZpcm9ubWVudHMuCi0gKgotICogTk9URTogVXNlciBzcGFjZSB2ZXJzaW9ucyBvZiB0aGUgUE0gbGlicmFyeSBzaG91bGQgZmFpbCB0aGVzZSBmdW5jdGlvbnMuCi0gKi8KLQotaWJvb2wgICBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcihQTV9pbnRIYW5kbGVyIGloLGludCBmcmVxdWVuY3kpOwotdm9pZCAgICBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGludCBmcmVxdWVuY3kpOwotdm9pZCAgICBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCk7Ci0KLS8qIFJvdXRpbmVzIHRvIGluc3RhbGwgYW5kIHJlbW92ZSBoYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlcnMuCi0gKgotICogTm90ZSB0aGF0IHlvdSBfbXVzdF8gbG9jayB0aGUgbWVtb3J5IGNvbnRhaW5pbmcgdGhlIGludGVycnVwdAotICogaGFuZGxlcnMgd2l0aCB0aGUgUE1fbG9ja1BhZ2VzKCkgZnVuY3Rpb24gb3RoZXJ3aXNlIHlvdSBtYXkgZW5jb3VudGVyCi0gKiBwcm9ibGVtcyBpbiB2aXJ0dWFsIG1lbW9yeSBlbnZpcm9ubWVudHMuCi0gKgotICogTk9URTogVXNlciBzcGFjZSB2ZXJzaW9ucyBvZiB0aGUgUE0gbGlicmFyeSBzaG91bGQgZmFpbCB0aGVzZSBmdW5jdGlvbnMuCi0gKi8KLQotUE1fSVJRSGFuZGxlIFBNQVBJIFBNX3NldElSUUhhbmRsZXIoaW50IElSUSxQTV9pcnFIYW5kbGVyIGloKTsKLXZvaWQgICAgUE1BUEkgUE1fcmVzdG9yZUlSUUhhbmRsZXIoUE1fSVJRSGFuZGxlIGlycUhhbmRsZSk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBwcm9ncmFtIERNQSB1c2luZyB0aGUgbGVnYWN5IElTQSBETUEgY29udHJvbGxlciAqLwotCi12b2lkICAgIFBNQVBJIFBNX0RNQUNFbmFibGUoaW50IGNoYW5uZWwpOwotdm9pZCAgICBQTUFQSSBQTV9ETUFDRGlzYWJsZShpbnQgY2hhbm5lbCk7Ci12b2lkICAgIFBNQVBJIFBNX0RNQUNQcm9ncmFtKGludCBjaGFubmVsLGludCBtb2RlLHVsb25nIGJ1ZmZlclBoeXMsaW50IGNvdW50KTsKLXVsb25nICAgUE1BUEkgUE1fRE1BQ1Bvc2l0aW9uKGludCBjaGFubmVsKTsKLQotLyogRnVuY3Rpb24gdG8gcG9zdCBzZWNvbmRhcnkgZ3JhcGhpY3MgY29udHJvbGxlcnMgdXNpbmcgdGhlIEJJT1MgKi8KLQotaWJvb2wgICBQTUFQSSBQTV9kb0JJT1NQT1NUKHVzaG9ydCBheFZhbCx1bG9uZyBCSU9TUGh5c0FkZHIsdm9pZCAqbWFwcGVkQklPUyx1bG9uZyBCSU9TTGVuKTsKLQotLyogRnVuY3Rpb24gdG8gaW5pdCB0aGUgQUdQIGZ1bmN0aW9ucyBhbmQgcmV0dXJuIHRoZSBBR1AgYXBlcnR1cmUgc2l6ZSBpbiBNQiAqLwotCi11bG9uZyAgIFBNQVBJIFBNX2FncEluaXQodm9pZCk7Ci12b2lkICAgIFBNQVBJIFBNX2FncEV4aXQodm9pZCk7Ci0KLS8qIEZ1bmN0aW9ucyB0byByZXNlcnZlIGFuZCByZWxlYXNlIHBoeXNpY2FsIEFHUCBtZW1vcnkgcmFuZ2VzICovCi0KLWlib29sICAgUE1BUEkgUE1fYWdwUmVzZXJ2ZVBoeXNpY2FsKHVsb25nIG51bVBhZ2VzLGludCB0eXBlLHZvaWQgKipwaHlzQ29udGV4dCxQTV9waHlzQWRkciAqcGh5c0FkZHIpOwotaWJvb2wgICBQTUFQSSBQTV9hZ3BSZWxlYXNlUGh5c2ljYWwodm9pZCAqcGh5c0NvbnRleHQpOwotCi0vKiBGdW5jdGlvbnMgdG8gY29tbWl0IGFuZCBmcmVlIHBoeXNpY2FsIEFHUCBtZW1vcnkgcmFuZ2VzICovCi0KLWlib29sICAgUE1BUEkgUE1fYWdwQ29tbWl0UGh5c2ljYWwodm9pZCAqcGh5c0NvbnRleHQsdWxvbmcgbnVtUGFnZXMsdWxvbmcgc3RhcnRPZmZzZXQsUE1fcGh5c0FkZHIgKnBoeXNBZGRyKTsKLWlib29sICAgUE1BUEkgUE1fYWdwRnJlZVBoeXNpY2FsKHZvaWQgKnBoeXNDb250ZXh0LHVsb25nIG51bVBhZ2VzLHVsb25nIHN0YXJ0T2Zmc2V0KTsKLQotLyogRnVuY3Rpb25zIHRvIGRvIEkvTyBwb3J0IG1hbmlwdWxhdGlvbiBkaXJlY3RseSBmcm9tIEMgY29kZS4gVGhlc2UKLSAqIGZ1bmN0aW9ucyBhcmUgcG9ydGFibGUgYW5kIHdpbGwgd29yayBvbiBhbnkgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZQotICogdG8gYWNjZXNzIEkvTyBzcGFjZSByZWdpc3RlcnMgb24gUENJIGRldmljZXMuCi0gKi8KLQotdWNoYXIgICBQTUFQSSBQTV9pbnBiKGludCBwb3J0KTsKLXVzaG9ydCAgUE1BUEkgUE1faW5wdyhpbnQgcG9ydCk7Ci11bG9uZyAgIFBNQVBJIFBNX2lucGQoaW50IHBvcnQpOwotdm9pZCAgICBQTUFQSSBQTV9vdXRwYihpbnQgcG9ydCx1Y2hhciB2YWwpOwotdm9pZCAgICBQTUFQSSBQTV9vdXRwdyhpbnQgcG9ydCx1c2hvcnQgdmFsKTsKLXZvaWQgICAgUE1BUEkgUE1fb3V0cGQoaW50IHBvcnQsdWxvbmcgdmFsKTsKLQotLyogRnVuY3Rpb25zIHRvIGRldGVybWluZSB0aGUgSS9PIHBvcnQgbG9jYXRpb25zIGZvciBDT00gYW5kIExQVCBwb3J0cy4KLSAqIFRoZSBmdW5jdGlvbnMgYXJlIHplcm8gYmFzZWQsIHNvIGZvciBDT00xIG9yIExQVDEgcGFzcyBpbiBhIHZhbHVlIG9mIDAsCi0gKiBmb3IgQ09NMiBvciBMUFQyIHBhc3MgaW4gYSB2YWx1ZSBvZiAxIGV0Yy4KLSAqLwotCi1pbnQgICAgIFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpOwotaW50ICAgICBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KTsKLQotLyogSW50ZXJuYWwgZnVuY3Rpb25zIHRoYXQgbmVlZCBwcm90b3R5cGVzICovCi0KLXZvaWQgICAgUE1BUEkgX1BNX2dldFJNdmVjdChpbnQgaW50bm8sIGxvbmcgKnJlYWxpc3IpOwotdm9pZCAgICBQTUFQSSBfUE1fc2V0Uk12ZWN0KGludCBpbnRubywgbG9uZyByZWFsaXNyKTsKLXZvaWQgICAgUE1BUEkgX1BNX2ZyZWVNZW1vcnlNYXBwaW5ncyh2b2lkKTsKLQotLyogRnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZGVidWcgbG9nIGZpbGUgbG9jYXRpb24gKi8KLQotdm9pZCAgICBQTUFQSSBQTV9zZXREZWJ1Z0xvZyhjb25zdCBjaGFyICpsb2dGaWxlUGF0aCk7Ci0KLS8qIEZ1bmN0aW9uIHRvIHB1dCB0aGUgcHJvY2VzcyB0byBzbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBtaWxsaXNlY29uZHMgKi8KLQotdm9pZCAgICBQTUFQSSBQTV9zbGVlcCh1bG9uZyBtaWxsaXNlY29uZHMpOwotCi0vKiBGdW5jdGlvbiB0byBibG9jayB1bnRpbCAnbWlsbGlzZWNvbmRzJyBoYXZlIHBhc3NlZCBzaW5jZSBsYXN0IGNhbGwgKi8KLQotdm9pZCAgICBQTUFQSSBQTV9ibG9ja1VudGlsVGltZW91dCh1bG9uZyBtaWxsaXNlY29uZHMpOwotCi0vKiBGdW5jdGlvbnMgZm9yIGRpcmVjdG9yeSB0cmF2ZXJzYWwgYW5kIG1hbmFnZW1lbnQgKi8KLQotdm9pZCAqICBQTUFQSSBQTV9maW5kRmlyc3RGaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLFBNX2ZpbmREYXRhICpmaW5kRGF0YSk7Ci1pYm9vbCAgIFBNQVBJIFBNX2ZpbmROZXh0RmlsZSh2b2lkICpoYW5kbGUsUE1fZmluZERhdGEgKmZpbmREYXRhKTsKLXZvaWQgICAgUE1BUEkgUE1fZmluZENsb3NlKHZvaWQgKmhhbmRsZSk7Ci12b2lkICAgIFBNQVBJIFBNX21ha2VwYXRoKGNoYXIgKnAsY29uc3QgY2hhciAqZHJpdmUsY29uc3QgY2hhciAqZGlyLGNvbnN0IGNoYXIgKm5hbWUsY29uc3QgY2hhciAqZXh0KTsKLWludCAgICAgUE1BUEkgUE1fc3BsaXRwYXRoKGNvbnN0IGNoYXIgKmZuLGNoYXIgKmRyaXZlLGNoYXIgKmRpcixjaGFyICpuYW1lLGNoYXIgKmV4dCk7Ci1pYm9vbCAgIFBNQVBJIFBNX2RyaXZlVmFsaWQoY2hhciBkcml2ZSk7Ci12b2lkICAgIFBNQVBJIFBNX2dldGRjd2QoaW50IGRyaXZlLGNoYXIgKmRpcixpbnQgbGVuKTsKLXVpbnQgICAgUE1BUEkgUE1fZ2V0RmlsZUF0dHIoY29uc3QgY2hhciAqZmlsZW5hbWUpOwotdm9pZCAgICBQTUFQSSBQTV9zZXRGaWxlQXR0cihjb25zdCBjaGFyICpmaWxlbmFtZSx1aW50IGF0dHJpYik7Ci1pYm9vbCAgIFBNQVBJIFBNX2dldEZpbGVUaW1lKGNvbnN0IGNoYXIgKmZpbGVuYW1lLGlib29sIGdtVGltZSxQTV90aW1lICp0aW1lKTsKLWlib29sICAgUE1BUEkgUE1fc2V0RmlsZVRpbWUoY29uc3QgY2hhciAqZmlsZW5hbWUsaWJvb2wgZ21UaW1lLFBNX3RpbWUgKnRpbWUpOwotaWJvb2wgICBQTUFQSSBQTV9ta2Rpcihjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci1pYm9vbCAgIFBNQVBJIFBNX3JtZGlyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKLQotLyogRnVuY3Rpb25zIHRvIGhhbmRsZSBsb2FkaW5nIE9TIHNwZWNpZmljIHNoYXJlZCBsaWJyYXJpZXMgKi8KLQotUE1fTU9EVUxFIFBNQVBJIFBNX2xvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKnN6RExMTmFtZSk7Ci12b2lkICogIFBNQVBJIFBNX2dldFByb2NBZGRyZXNzKFBNX01PRFVMRSBoTW9kdWxlLGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpOwotdm9pZCAgICBQTUFQSSBQTV9mcmVlTGlicmFyeShQTV9NT0RVTEUgaE1vZHVsZSk7Ci0KLS8qIEZ1bmN0aW9ucyBhbmQgbWFjcm9zIGZvciA2NC1iaXQgYXJpdGhtZXRpYyAqLwotCi12b2lkICAgIFBNQVBJIF9QTV9hZGQ2NCh1MzIgYV9sb3csczMyIGFfaGlnaCx1MzIgYl9sb3csczMyIGJfaGlnaCxfX2k2NCAqcmVzdWx0KTsKLXZvaWQgICAgUE1BUEkgX1BNX3N1YjY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLHUzMiBiX2xvdyxzMzIgYl9oaWdoLF9faTY0ICpyZXN1bHQpOwotdm9pZCAgICBQTUFQSSBfUE1fbXVsNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsdTMyIGJfbG93LHMzMiBiX2hpZ2gsX19pNjQgKnJlc3VsdCk7Ci12b2lkICAgIFBNQVBJIF9QTV9kaXY2NCh1MzIgYV9sb3csczMyIGFfaGlnaCx1MzIgYl9sb3csczMyIGJfaGlnaCxfX2k2NCAqcmVzdWx0KTsKLXZvaWQgICAgUE1BUEkgX1BNX3NocjY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLHMzMiBzaGlmdCxfX2k2NCAqcmVzdWx0KTsKLXZvaWQgICAgUE1BUEkgX1BNX3NhcjY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLHMzMiBzaGlmdCxfX2k2NCAqcmVzdWx0KTsKLXZvaWQgICAgUE1BUEkgX1BNX3NobDY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLHMzMiBzaGlmdCxfX2k2NCAqcmVzdWx0KTsKLXZvaWQgICAgUE1BUEkgX1BNX25lZzY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLF9faTY0ICpyZXN1bHQpOwotI2lmZGVmIF9fTkFUSVZFX0lOVDY0X18KLSNkZWZpbmUgUE1fYWRkNjQocixhLGIpICAgICAocikgPSAoYSkgKyAoYikKLSNkZWZpbmUgUE1fYWRkNjRfMzIocixhLGIpICAocikgPSAoYSkgKyAoYikKLSNkZWZpbmUgUE1fc3ViNjQocixhLGIpICAgICAocikgPSAoYSkgLSAoYikKLSNkZWZpbmUgUE1fc3ViNjRfMzIocixhLGIpICAocikgPSAoYSkgLSAoYikKLSNkZWZpbmUgUE1fbXVsNjQocixhLGIpICAgICAocikgPSAoYSkgKiAoYikKLSNkZWZpbmUgUE1fbXVsNjRfMzIocixhLGIpICAocikgPSAoYSkgKiAoYikKLSNkZWZpbmUgUE1fZGl2NjQocixhLGIpICAgICAocikgPSAoYSkgLyAoYikKLSNkZWZpbmUgUE1fZGl2NjRfMzIocixhLGIpICAocikgPSAoYSkgLyAoYikKLSNkZWZpbmUgUE1fc2hyNjQocixhLHMpICAgICAocikgPSAoYSkgPj4gKHMpCi0jZGVmaW5lIFBNX3NhcjY0KHIsYSxzKSAgICAgKHIpID0gKChzNjQpKGEpKSA+PiAocykKLSNkZWZpbmUgUE1fc2hsNjQocixhLHMpICAgICAocikgPSAodTY0KShhKSA8PCAocykKLSNkZWZpbmUgUE1fbmVnNjQocixhLHMpICAgICAocikgPSAtKGEpCi0jZGVmaW5lIFBNX25vdDY0KHIsYSxzKSAgICAgKHIpID0gfihhKQotI2RlZmluZSBQTV9lcTY0KGEsYikgICAgICAgIChhKSA9PSAoYikKLSNkZWZpbmUgUE1fZ3Q2NChhLGIpICAgICAgICAoYSkgPiAoYikKLSNkZWZpbmUgUE1fbHQ2NChhLGIpICAgICAgICAoYSkgPCAoYikKLSNkZWZpbmUgUE1fZ2VxNjQoYSxiKSAgICAgICAoYSkgPj0gKGIpCi0jZGVmaW5lIFBNX2xlcTY0KGEsYikgICAgICAgKGEpIDw9IChiKQotI2RlZmluZSBQTV82NHRvMzIoYSkgICAgICAgICh1MzIpKGEpCi0jZGVmaW5lIFBNXzY0dG9zMzIoYSkgICAgICAgKHMzMikoYSkKLSNkZWZpbmUgUE1fc2V0NjQoYSxiLGMpICAgICAoYSkgPSAoKHU2NCkoYikgPDwgMzIpICsgKGMpCi0jZGVmaW5lIFBNX3NldDY0XzMyKGEsYikgICAgKGEpID0gKGIpCi0jZWxzZQotI2RlZmluZSBQTV9hZGQ2NChyLGEsYikgICAgIF9QTV9hZGQ2NCgoYSkubG93LChhKS5oaWdoLChiKS5sb3csKGIpLmhpZ2gsJihyKSkKLSNkZWZpbmUgUE1fYWRkNjRfMzIocixhLGIpICBfUE1fYWRkNjQoKGEpLmxvdywoYSkuaGlnaCxiLDAsJihyKSkKLSNkZWZpbmUgUE1fc3ViNjQocixhLGIpICAgICBfUE1fc3ViNjQoKGEpLmxvdywoYSkuaGlnaCwoYikubG93LChiKS5oaWdoLCYocikpCi0jZGVmaW5lIFBNX3N1YjY0XzMyKHIsYSxiKSAgX1BNX3N1YjY0KChhKS5sb3csKGEpLmhpZ2gsYiwwLCYocikpCi0jZGVmaW5lIFBNX211bDY0KHIsYSxiKSAgICAgX1BNX211bDY0KChhKS5sb3csKGEpLmhpZ2gsKGIpLmxvdywoYikuaGlnaCwmKHIpKQotI2RlZmluZSBQTV9tdWw2NF8zMihyLGEsYikgIF9QTV9tdWw2NCgoYSkubG93LChhKS5oaWdoLGIsMCwmKHIpKQotI2RlZmluZSBQTV9kaXY2NChyLGEsYikgICAgIF9QTV9kaXY2NCgoYSkubG93LChhKS5oaWdoLChiKS5sb3csKGIpLmhpZ2gsJihyKSkKLSNkZWZpbmUgUE1fZGl2NjRfMzIocixhLGIpICBfUE1fZGl2NjQoKGEpLmxvdywoYSkuaGlnaCxiLDAsJihyKSkKLSNkZWZpbmUgUE1fc2hyNjQocixhLHMpICAgICBfUE1fc2hyNjQoKGEpLmxvdywoYSkuaGlnaCxzLCYocikpCi0jZGVmaW5lIFBNX3NhcjY0KHIsYSxzKSAgICAgX1BNX3NhcjY0KChhKS5sb3csKGEpLmhpZ2gscywmKHIpKQotI2RlZmluZSBQTV9zaGw2NChyLGEscykgICAgIF9QTV9zaGw2NCgoYSkubG93LChhKS5oaWdoLHMsJihyKSkKLSNkZWZpbmUgUE1fbmVnNjQocixhLHMpICAgICBfUE1fbmVnNjQoKGEpLmxvdywoYSkuaGlnaCwmKHIpKQotI2RlZmluZSBQTV9ub3Q2NChyLGEscykgICAgIChyKS5sb3cgPSB+KGEpLmxvdywgKHIpLmhpZ2ggPSB+KGEpLmhpZ2gKLSNkZWZpbmUgUE1fZXE2NChhLGIpICAgICAgICAoKGEpLmxvdyA9PSAoYikubG93ICYmIChhKS5oaWdoID09IChiKS5oaWdoKQotI2RlZmluZSBQTV9ndDY0KGEsYikgICAgICAgICgoKGEpLmhpZ2ggPiAoYikuaGlnaCkgfHwgKChhKS5oaWdoID09IChiKS5oaWdoICYmIChhKS5sb3cgPiAoYikubG93KSkKLSNkZWZpbmUgUE1fbHQ2NChhLGIpICAgICAgICAoKChhKS5oaWdoIDwgKGIpLmhpZ2gpIHx8ICgoYSkuaGlnaCA9PSAoYikuaGlnaCAmJiAoYSkubG93IDwgKGIpLmxvdykpCi0jZGVmaW5lIFBNX2dlcTY0KGEsYikgICAgICAgKFBNX2VxNjQoYSxiKSB8fCBQTV9ndDY0KGEsYikpCi0jZGVmaW5lIFBNX2xlcTY0KGEsYikgICAgICAgKFBNX2VxNjQoYSxiKSB8fCBQTV9sdDY0KGEsYikpCi0jZGVmaW5lIFBNXzY0dG8zMihhKSAgICAgICAgKHUzMikoYS5sb3cpCi0jZGVmaW5lIFBNXzY0dG9zMzIoYSkgICAgICAgKChhKS5oaWdoIDwgMCkgPyAtKGEpLmxvdyA6IChhKS5sb3cpCi0jZGVmaW5lIFBNX3NldDY0KGEsYixjKSAgICAgKGEpLmhpZ2ggPSAoYiksIChhKS5sb3cgPSAoYykKLSNkZWZpbmUgUE1fc2V0NjRfMzIoYSxiKSAgICAoYSkuaGlnaCA9IDAsIChhKS5sb3cgPSAoYikKLSNlbmRpZgotCi0vKiBGdW5jdGlvbiB0byBlbmFibGUgSU9QTCBhY2Nlc3MgaWYgcmVxdWlyZWQgKi8KLQotaW50ICAgICBQTUFQSSBQTV9zZXRJT1BMKGludCBpb3BsKTsKLQotLyogRnVuY3Rpb24gdG8gZmx1c2ggdGhlIFRMQiBhbmQgQ1BVIGNhY2hlcyAqLwotCi12b2lkICAgIFBNQVBJIFBNX2ZsdXNoVExCKHZvaWQpOwotCi0vKiBET1Mgc3BlY2lmaWMgZnVjbnRpb25zICovCi0KLSNpZmRlZiAgX19NU0RPU19fCi11aW50ICAgIFBNQVBJIFBNSEVMUF9nZXRWZXJzaW9uKHZvaWQpOwotdm9pZCAgICBQTUFQSSBQTV9WeERDYWxsKFZYRF9yZWdzICpyZWdzKTsKLSNlbmRpZgotCi0vKiBGdW5jdGlvbnMgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgVkdBIGhhcmR3YXJlIHN0YXRlICovCi0KLWludCAgICAgUE1BUEkgUE1fZ2V0VkdBU3RhdGVTaXplKHZvaWQpOwotdm9pZCAgICBQTUFQSSBQTV9zYXZlVkdBU3RhdGUodm9pZCAqc3RhdGVCdWYpOwotdm9pZCAgICBQTUFQSSBQTV9yZXN0b3JlVkdBU3RhdGUoY29uc3Qgdm9pZCAqc3RhdGVCdWYpOwotdm9pZCAgICBQTUFQSSBQTV92Z2FCbGFua0Rpc3BsYXkodm9pZCk7Ci12b2lkICAgIFBNQVBJIFBNX3ZnYVVuYmxhbmtEaXNwbGF5KHZvaWQpOwotCi0vKiBGdW5jdGlvbnMgdG8gbG9hZCBhbmQgdW5sb2FkIERpcmVjdERyYXcgbGlicmFyaWVzLiBPbmx5IHVzZWQgb24KLSAqIFdpbmRvd3MgcGxhdGZvcm1zLgotICovCi0KLXZvaWQgKiAgUE1BUEkgUE1fbG9hZERpcmVjdERyYXcoaW50IGRldmljZSk7Ci12b2lkICAgIFBNQVBJIFBNX3VubG9hZERpcmVjdERyYXcoaW50IGRldmljZSk7Ci1QTV9IV05EIFBNQVBJIFBNX2dldERpcmVjdERyYXdXaW5kb3codm9pZCk7Ci12b2lkICAgIFBNQVBJIFBNX2RvU3VzcGVuZEFwcCh2b2lkKTsKLQotLyogRnVuY3Rpb25zIHRvIGluc3RhbGwsIHN0YXJ0LCBzdG9wIGFuZCByZW1vdmUgTlQgc2VydmljZXMuIFZhbGlkIG9ubHkKLSAqIGZvciBXaW4zMiBhcHBzIHJ1bm5pbmcgb24gV2luZG93cyBOVC4KLSAqLwotCi0jaWZkZWYgX19XSU5ET1dTMzJfXwotdWxvbmcgICBQTUFQSSBQTV9pbnN0YWxsU2VydmljZShjb25zdCBjaGFyICpzekRyaXZlck5hbWUsY29uc3QgY2hhciAqc3pTZXJ2aWNlTmFtZSxjb25zdCBjaGFyICpzekxvYWRHcm91cCx1bG9uZyBkd1NlcnZpY2VUeXBlKTsKLXVsb25nICAgUE1BUEkgUE1fc3RhcnRTZXJ2aWNlKGNvbnN0IGNoYXIgKnN6U2VydmljZU5hbWUpOwotdWxvbmcgICBQTUFQSSBQTV9zdG9wU2VydmljZShjb25zdCBjaGFyICpzelNlcnZpY2VOYW1lKTsKLXVsb25nICAgUE1BUEkgUE1fcmVtb3ZlU2VydmljZShjb25zdCBjaGFyICpzelNlcnZpY2VOYW1lKTsKLSNlbmRpZgotCi0vKiBSb3V0aW5lcyB0byBnZW5lcmF0ZSBuYXRpdmUgaW50ZXJydXB0cyAoaWU6IHByb3RlY3RlZCBtb2RlIGludGVycnVwdHMKLSAqIGZvciBwcm90ZWN0ZWQgbW9kZSBhcHBzKSB1c2luZyBhbiBpbnRlcmZhY2UgdGhlIHNhbWUgYXMgdGhhdCB1c2UgYnkKLSAqIGludDg2KCkgYW5kIGludDg2eCgpIGluIHJlYWxtb2RlLiBUaGVzZSByb3V0aW5lcyBhcmUgcmVxdWlyZWQgYmVjYXVzZQotICogbWFueSAzMiBiaXQgY29tcGlsZXJzIHVzZSBkaWZmZXJlbnQgcmVnaXN0ZXIgc3RydWN0dXJlcyBhbmQgZGlmZmVyZW50Ci0gKiBmdW5jdGlvbnMgY2F1c2luZyBtYWpvciBwb3J0YWJpbGl0eSBoZWFkYWNoZXMuIFRodXMgd2UgcHJvdmlkZSBvdXIKLSAqIG93biBhbmQgc29sdmUgaXQgYWxsIGluIG9uZSBmZWxsIHN3b29wLCBhbmQgd2UgYWxzbyBnZXQgYSByb3V0aW5lIHRvCi0gKiBwdXQgc3R1ZmYgaW50byAzMiBiaXQgcmVnaXN0ZXJzIGZyb20gcmVhbCBtb2RlIDstKQotICovCi0KLXZvaWQgICAgUE1BUEkgUE1fc2VncmVhZChQTVNSRUdTICpzcmVncyk7Ci1pbnQgICAgIFBNQVBJIFBNX2ludDM4NihpbnQgaW50bm8sIFBNUkVHUyAqaW4sIFBNUkVHUyAqb3V0KTsKLWludCAgICAgUE1BUEkgUE1faW50Mzg2eChpbnQgaW50bm8sIFBNUkVHUyAqaW4sIFBNUkVHUyAqb3V0LFBNU1JFR1MgKnNyZWdzKTsKLQotLyogQ2FsbCB0aGUgWDg2IGVtdWxhdG9yIG9yIHRoZSByZWFsIEJJT1MgaW4gb3VyIHRlc3QgaGFybmVzcyAqLwotCi0jaWYgZGVmaW5lZChURVNUX0hBUk5FU1MpICYmICFkZWZpbmVkKFBNTElCKQotI2RlZmluZSBQTV9tYXBSZWFsUG9pbnRlcihyX3NlZyxyX29mZikgICAgICBfUE1faW1wb3J0cy5QTV9tYXBSZWFsUG9pbnRlcihyX3NlZyxyX29mZikKLSNkZWZpbmUgUE1fZ2V0VkVTQUJ1ZihsZW4scnNlZyxyb2ZmKSAgICAgICAgX1BNX2ltcG9ydHMuUE1fZ2V0VkVTQUJ1ZihsZW4scnNlZyxyb2ZmKQotI2RlZmluZSBQTV9jYWxsUmVhbE1vZGUoc2VnLG9mZixyZWdzLHNyZWdzKSBfUE1faW1wb3J0cy5QTV9jYWxsUmVhbE1vZGUoc2VnLG9mZixyZWdzLHNyZWdzKQotI2RlZmluZSBQTV9pbnQ4NihpbnRubyxpbixvdXQpICAgICAgICAgICAgICBfUE1faW1wb3J0cy5QTV9pbnQ4NihpbnRubyxpbixvdXQpCi0jZGVmaW5lIFBNX2ludDg2eChpbnRubyxpbixvdXQsc3JlZ3MpICAgICAgIF9QTV9pbXBvcnRzLlBNX2ludDg2eChpbnRubyxpbixvdXQsc3JlZ3MpCi0jZW5kaWYKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAqLwotI2VuZGlmCi0KLS8qIEluY2x1ZGUgT1MgZXh0ZW5zaW9ucyBmb3IgaW50ZXJydXB0IGhhbmRsaW5nICovCi0KLSNpZiBkZWZpbmVkKF9fUkVBTERPU19fKSB8fCBkZWZpbmVkKF9fU01YMzJfXykKLSNpbmNsdWRlICJwbWludC5oIgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX1BNQVBJX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbWltcC5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtaW1wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxN2Y1ZTYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtaW1wLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZGVjbGFyaW5nIGFsbCB0aGUgUE0gaW1wb3J0cyBzdHJ1Y3R1cmUgZm9yIHRoZQotKiAgICAgICAgICAgICAgIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgUE0gbGlicmFyeS4gSW5jbHVkZWQgaW4gYWxsIGNvZGUKLSogICAgICAgICAgICAgICB0aGF0IG5lZWRzIHRvIHBhc3MgdGhlIFBNIGltcG9ydHMgdG8gQlBEIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotUE1faW1wb3J0cyAgX1ZBUkFQSSBfUE1faW1wb3J0cyA9IHsKLSAgICBzaXplb2YoUE1faW1wb3J0cyksCi0gICAgUE1fZ2V0TW9kZVR5cGUsCi0gICAgUE1fZ2V0QklPU1BvaW50ZXIsCi0gICAgUE1fZ2V0QTAwMDBQb2ludGVyLAotICAgIFBNX21hcFBoeXNpY2FsQWRkciwKLSAgICBQTV9tYWxsb2NTaGFyZWQsCi0gICAgTlVMTCwKLSAgICBQTV9mcmVlU2hhcmVkLAotICAgIFBNX21hcFRvUHJvY2VzcywKLSAgICBQTV9tYXBSZWFsUG9pbnRlciwKLSAgICBQTV9hbGxvY1JlYWxTZWcsCi0gICAgUE1fZnJlZVJlYWxTZWcsCi0gICAgUE1fYWxsb2NMb2NrZWRNZW0sCi0gICAgUE1fZnJlZUxvY2tlZE1lbSwKLSAgICBQTV9jYWxsUmVhbE1vZGUsCi0gICAgUE1faW50ODYsCi0gICAgUE1faW50ODZ4LAotICAgIERQTUlfaW50ODYsCi0gICAgUE1fYXZhaWxhYmxlTWVtb3J5LAotICAgIFBNX2dldFZFU0FCdWYsCi0gICAgUE1fZ2V0T1NUeXBlLAotICAgIFBNX2ZhdGFsRXJyb3IsCi0gICAgUE1fc2V0QmFua0EsCi0gICAgUE1fc2V0QmFua0FCLAotICAgIFBNX3NldENSVFN0YXJ0LAotICAgIFBNX2dldEN1cnJlbnRQYXRoLAotICAgIFBNX2dldFZCRUFGUGF0aCwKLSAgICBQTV9nZXROdWNsZXVzUGF0aCwKLSAgICBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCwKLSAgICBQTV9nZXRVbmlxdWVJRCwKLSAgICBQTV9nZXRNYWNoaW5lTmFtZSwKLSAgICBWRl9hdmFpbGFibGUsCi0gICAgVkZfaW5pdCwKLSAgICBWRl9leGl0LAotICAgIFBNX29wZW5Db25zb2xlLAotICAgIFBNX2dldENvbnNvbGVTdGF0ZVNpemUsCi0gICAgUE1fc2F2ZUNvbnNvbGVTdGF0ZSwKLSAgICBQTV9yZXN0b3JlQ29uc29sZVN0YXRlLAotICAgIFBNX2Nsb3NlQ29uc29sZSwKLSAgICBQTV9zZXRPU0N1cnNvckxvY2F0aW9uLAotICAgIFBNX3NldE9TU2NyZWVuV2lkdGgsCi0gICAgUE1fZW5hYmxlV3JpdGVDb21iaW5lLAotICAgIFBNX2JhY2tzbGFzaCwKLSAgICBQTV9sb2NrRGF0YVBhZ2VzLAotICAgIFBNX3VubG9ja0RhdGFQYWdlcywKLSAgICBQTV9sb2NrQ29kZVBhZ2VzLAotICAgIFBNX3VubG9ja0NvZGVQYWdlcywKLSAgICBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlciwKLSAgICBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5LAotICAgIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlciwKLSAgICBQTV9kb0JJT1NQT1NULAotICAgIFBNX2dldEJvb3REcml2ZSwKLSAgICBQTV9mcmVlUGh5c2ljYWxBZGRyLAotICAgIFBNX2lucGIsCi0gICAgUE1faW5wdywKLSAgICBQTV9pbnBkLAotICAgIFBNX291dHBiLAotICAgIFBNX291dHB3LAotICAgIFBNX291dHBkLAotICAgIE5VTEwsCi0gICAgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrLAotICAgIFBNX2hhdmVCSU9TQWNjZXNzLAotICAgIFBNX2tiaGl0LAotICAgIFBNX2dldGNoLAotICAgIFBNX2ZpbmRCUEQsCi0gICAgUE1fZ2V0UGh5c2ljYWxBZGRyLAotICAgIFBNX3NsZWVwLAotICAgIFBNX2dldENPTVBvcnQsCi0gICAgUE1fZ2V0TFBUUG9ydCwKLSAgICBQTV9sb2FkTGlicmFyeSwKLSAgICBQTV9nZXRQcm9jQWRkcmVzcywKLSAgICBQTV9mcmVlTGlicmFyeSwKLSAgICBQQ0lfZW51bWVyYXRlLAotICAgIFBDSV9hY2Nlc3NSZWcsCi0gICAgUENJX3NldEhhcmR3YXJlSVJRLAotICAgIFBDSV9nZW5lcmF0ZVNwZWNpYWxDeWxlLAotICAgIE5VTEwsCi0gICAgUENJQklPU19nZXRFbnRyeSwKLSAgICBDUFVfZ2V0UHJvY2Vzc29yVHlwZSwKLSAgICBDUFVfaGF2ZU1NWCwKLSAgICBDUFVfaGF2ZTNETm93LAotICAgIENQVV9oYXZlU1NFLAotICAgIENQVV9oYXZlUkRUU0MsCi0gICAgQ1BVX2dldFByb2Nlc3NvclNwZWVkLAotICAgIFpUaW1lckluaXQsCi0gICAgTFpUaW1lck9uLAotICAgIExaVGltZXJMYXAsCi0gICAgTFpUaW1lck9mZiwKLSAgICBMWlRpbWVyQ291bnQsCi0gICAgTFpUaW1lck9uRXh0LAotICAgIExaVGltZXJMYXBFeHQsCi0gICAgTFpUaW1lck9mZkV4dCwKLSAgICBMWlRpbWVyQ291bnRFeHQsCi0gICAgVUxaVGltZXJPbiwKLSAgICBVTFpUaW1lckxhcCwKLSAgICBVTFpUaW1lck9mZiwKLSAgICBVTFpUaW1lckNvdW50LAotICAgIFVMWlJlYWRUaW1lLAotICAgIFVMWkVsYXBzZWRUaW1lLAotICAgIFVMWlRpbWVyUmVzb2x1dGlvbiwKLSAgICBQTV9maW5kRmlyc3RGaWxlLAotICAgIFBNX2ZpbmROZXh0RmlsZSwKLSAgICBQTV9maW5kQ2xvc2UsCi0gICAgUE1fbWFrZXBhdGgsCi0gICAgUE1fc3BsaXRwYXRoLAotICAgIFBNX2RyaXZlVmFsaWQsCi0gICAgUE1fZ2V0ZGN3ZCwKLSAgICBQTV9zZXRGaWxlQXR0ciwKLSAgICBQTV9ta2RpciwKLSAgICBQTV9ybWRpciwKLSAgICBQTV9nZXRGaWxlQXR0ciwKLSAgICBQTV9nZXRGaWxlVGltZSwKLSAgICBQTV9zZXRGaWxlVGltZSwKLSAgICBDUFVfZ2V0UHJvY2Vzc29yTmFtZSwKLSAgICBQTV9nZXRWR0FTdGF0ZVNpemUsCi0gICAgUE1fc2F2ZVZHQVN0YXRlLAotICAgIFBNX3Jlc3RvcmVWR0FTdGF0ZSwKLSAgICBQTV92Z2FCbGFua0Rpc3BsYXksCi0gICAgUE1fdmdhVW5ibGFua0Rpc3BsYXksCi0gICAgUE1fYmxvY2tVbnRpbFRpbWVvdXQsCi0gICAgX1BNX2FkZDY0LAotICAgIF9QTV9zdWI2NCwKLSAgICBfUE1fbXVsNjQsCi0gICAgX1BNX2RpdjY0LAotICAgIF9QTV9zaHI2NCwKLSAgICBfUE1fc2FyNjQsCi0gICAgX1BNX3NobDY0LAotICAgIF9QTV9uZWc2NCwKLSAgICBQQ0lfZmluZEJBUlNpemUsCi0gICAgUENJX3JlYWRSZWdCbG9jaywKLSAgICBQQ0lfd3JpdGVSZWdCbG9jaywKLSAgICBQTV9mbHVzaFRMQiwKLSAgICBQTV91c2VMb2NhbE1hbGxvYywKLSAgICBQTV9tYWxsb2MsCi0gICAgUE1fY2FsbG9jLAotICAgIFBNX3JlYWxsb2MsCi0gICAgUE1fZnJlZSwKLSAgICBQTV9nZXRQaHlzaWNhbEFkZHJSYW5nZSwKLSAgICBQTV9hbGxvY1BhZ2UsCi0gICAgUE1fZnJlZVBhZ2UsCi0gICAgUE1fYWdwSW5pdCwKLSAgICBQTV9hZ3BFeGl0LAotICAgIFBNX2FncFJlc2VydmVQaHlzaWNhbCwKLSAgICBQTV9hZ3BSZWxlYXNlUGh5c2ljYWwsCi0gICAgUE1fYWdwQ29tbWl0UGh5c2ljYWwsCi0gICAgUE1fYWdwRnJlZVBoeXNpY2FsLAotICAgIFBDSV9nZXROdW1EZXZpY2VzLAotICAgIFBNX3NldExvY2FsQlBEUGF0aCwKLSNpZmRlZiBfX1dJTkRPV1MzMl9fCi0gICAgUE1fbG9hZERpcmVjdERyYXcsCi0gICAgUE1fdW5sb2FkRGlyZWN0RHJhdywKLSAgICBQTV9nZXREaXJlY3REcmF3V2luZG93LAotICAgIFBNX2RvU3VzcGVuZEFwcCwKLSNlbHNlCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSNlbmRpZgotICAgIH07CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1pbnQuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbWludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDc2ZGFkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbWludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFJlYWwgbW9kZSBhbmQgMTYvMzIgYml0IFByb3RlY3RlZCBNb2RlCi0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHRoZSBpbnRlcnJ1cHQgaGFuZGxpbmcgZXh0ZW5zaW9ucyB0byB0aGUgT1MKLSogICAgICAgICAgICAgICBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkuIFRoZXNlIGV4dGVuc2lvbnMgaW5jbHVkZXMKLSogICAgICAgICAgICAgICBzaW1wbGlmaWVkIGludGVycnVwdCBoYW5kbGluZywgYWxsb3dpbmcgYWxsIGNvbW1vbiBpbnRlcnJ1cHQKLSogICAgICAgICAgICAgICBoYW5kbGVycyB0byBiZSBob29rZWQgYW5kIGhhbmRsZWQgZGlyZWN0bHkgd2l0aCBub3JtYWwgQwotKiAgICAgICAgICAgICAgIGZ1bmN0aW9ucywgYm90aCBpbiAxNiBiaXQgYW5kIDMyIGJpdCBtb2Rlcy4gTm90ZSBob3dldmVyIHRoYXQKLSogICAgICAgICAgICAgICBzaW1wbGlmaWVkIGhhbmRsaW5nIGRvZXMgbm90IG1lYW4gc2xvdyBwZXJmb3JtYW5jZSEgQWxsIGxvdwotKiAgICAgICAgICAgICAgIGxldmVsIGludGVycnVwdCBoYW5kbGluZyBpcyBkb25lIGVmZmljaWVudGx5IGluIGFzc2VtYmxlcgotKiAgICAgICAgICAgICAgIGZvciBzcGVlZCAod2VsbCBhY3R1YWxseSBuZWNlc3NhcnkgdG8gaW5zdWxhdGUgdGhlCi0qICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZnJvbSB0aGUgbGFjayBvZiBmYXIgcG9pbnRlcnMgaW4gMzIgYml0IFBNKS4gVGhlCi0qICAgICAgICAgICAgICAgaW50ZXJydXB0IGhhbmRsZXJzIGN1cnJlbnRseSBzdXBwb3J0ZWQgYXJlOgotKgotKiAgICAgICAgICAgICAgICAgICBNb3VzZSAoMHgzMyBjYWxsYmFjaykKLSogICAgICAgICAgICAgICAgICAgVGltZXIgVGljayAoMHg4KQotKiAgICAgICAgICAgICAgICAgICBLZXlib2FyZCAoMHg5IGFuZCAweDE1KQotKiAgICAgICAgICAgICAgICAgICBDb250cm9sIEMvQnJlYWsgKDB4MjMvMHgxQikKLSogICAgICAgICAgICAgICAgICAgQ3JpdGljYWwgRXJyb3IgKDB4MjQpCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fUE1JTlRfSAotI2RlZmluZSBfX1BNSU5UX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCBUeXBlZGVmcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIF9fU01YMzJfXwotLyogUEMgaW50ZXJydXB0cyAoRW5zdXJlIGNvbnNpc3RlbnQgd2l0aCBwbWUuaW5jKSAqLwotI2RlZmluZSBQTV9JUlEwICAgICAgMHg0MAotI2RlZmluZSBQTV9JUlExICAgICAgKFBNX0lSUTArMSkKLSNkZWZpbmUgUE1fSVJRNiAgICAgIChQTV9JUlEwKzYpCi0jZGVmaW5lIFBNX0lSUTE0ICAgICAoUE1fSVJRMCsxNCkKLSNlbmRpZgotCi0vKiBEZWZpbmUgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBpbnRlcnJ1cHQgaGFuZGxlcnMgdGhhdCB3ZSBzdXBwb3J0ICAgICAqLwotCi10eXBlZGVmIHVpbnQgICAgKFBNQVBJUCBQTV9jcml0aWNhbEhhbmRsZXIpKHVpbnQgYXhWYWx1ZSx1aW50IGRpVmFsdWUpOwotdHlwZWRlZiB2b2lkICAgIChQTUFQSVAgUE1fYnJlYWtIYW5kbGVyKSh1aW50IGJyZWFrSGl0KTsKLXR5cGVkZWYgc2hvcnQgICAoUE1BUElQIFBNX2tleTE1SGFuZGxlcikoc2hvcnQgc2NhbkNvZGUpOwotdHlwZWRlZiB2b2lkICAgIChQTUFQSVAgUE1fbW91c2VIYW5kbGVyKSh1aW50IGV2ZW50LCB1aW50IGJ1dHN0YXRlLGludCB4LGludCB5LGludCBtaWNrZXlYLGludCBtaWNrZXlZKTsKLQotLyogQ3JlYXRlIGEgdHlwZSBmb3IgcmVwcmVzZW50aW5nIGZhciBwb2ludGVycyBpbiBib3RoIDE2IGFuZCAzMiBiaXQKLSAqIHByb3RlY3RlZCBtb2RlLgotICovCi0KLSNpZmRlZiAgUE0zODYKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBsb25nICAgIG9mZjsKLSAgICBzaG9ydCAgIHNlbDsKLSAgICB9IFBNRkFSUFRSOwotI2RlZmluZSBQTU5VTEwgIHswLDB9Ci0jZWxzZQotdHlwZWRlZiB2b2lkICpQTUZBUlBUUjsKLSNkZWZpbmUgUE1OVUxMICBOVUxMCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7ICAgICAgICAgICAgLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KLSNlbmRpZgotCi0vKiBSb3V0aW5lIHRvIGxvYWQgc2F2ZSBkZWZhdWx0IGRhdGEgc2VnbWVudCBzZWxlY3RvciB2YWx1ZSBpbnRvIGEgY29kZQotICogc2VnbWVudCB2YXJpYWJsZSwgYW5kIGFub3RoZXIgdG8gbG9hZCB0aGUgdmFsdWUgaW50byB0aGUgRFMgcmVnaXN0ZXIuCi0gKi8KLQotdm9pZCAgICBQTUFQSSBQTV9sb2FkRFModm9pZCk7Ci12b2lkICAgIFBNQVBJIFBNX3NhdmVEUyh2b2lkKTsKLQotLyogUm91dGluZSB0byBpbnN0YWxsIGEgbW91c2UgaW50ZXJydXB0IGhhbmRsaW5nIHJvdXRpbmUuIFRoZQotICogbW91c2UgaGFuZGxlciByb3V0aW5lIGlzIGEgbm9ybWFsIEMgZnVuY3Rpb24sIGFuZCB0aGUgUE0gbGlicmFyeQotICogd2lsbCB0YWtlIGNhcmUgb2YgcGFzc2luZyB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzIHRvIHRoZSBmdW5jdGlvbiwKLSAqIGFuZCBzd2l0Y2hpbmcgdG8gYSBsb2NhbCBzdGFjay4KLSAqCi0gKiBOb3RlIHRoYXQgeW91IF9tdXN0XyBsb2NrIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgbW91c2UgaW50ZXJydXB0Ci0gKiBoYW5kbGVyIHdpdGggdGhlIFBNX2xvY2tQYWdlcygpIGZ1bmN0aW9uIG90aGVyd2lzZSB5b3UgbWF5IGVuY291bnRlcgotICogcHJvYmxlbXMgaW4gdmlydHVhbCBtZW1vcnkgZW52aXJvbm1lbnRzLgotICovCi0KLWludCAgICAgUE1BUEkgUE1fc2V0TW91c2VIYW5kbGVyKGludCBtYXNrLFBNX21vdXNlSGFuZGxlciBtaCk7Ci12b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIodm9pZCk7Ci0KLS8qIFJvdXRpbmUgdG8gcmVzZXQgdGhlIG1vdXNlIGRyaXZlciwgYW5kIHJlLWluc3RhbGwgdGhlIGN1cnJlbnQKLSAqIG1vdXNlIGludGVycnVwdCBoYW5kbGVyIGlmIG9uZSB3YXMgY3VycmVudGx5IGluc3RhbGxlZCAoc2luY2UgdGhlCi0gKiBtb3VzZSByZXNldCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVtb3ZlIHRoaXMgaGFuZGxlci4KLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX3Jlc2V0TW91c2VEcml2ZXIoaW50IGhhcmRSZXNldCk7Ci0KLS8qIFJvdXRpbmUgdG8gcmVzZXQgdGhlIG1vdXNlIGRyaXZlciwgYW5kIHJlLWluc3RhbGwgdGhlIGN1cnJlbnQKLSAqIG1vdXNlIGludGVycnVwdCBoYW5kbGVyIGlmIG9uZSB3YXMgY3VycmVudGx5IGluc3RhbGxlZCAoc2luY2UgdGhlCi0gKiBtb3VzZSByZXNldCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVtb3ZlIHRoaXMgaGFuZGxlci4KLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX3Jlc2V0TW91c2VEcml2ZXIoaW50IGhhcmRSZXNldCk7Ci0KLS8qIFJvdXRpbmVzIHRvIGluc3RhbGwgYW5kIHJlbW92ZSB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlcnMuCi0gKgotICogTm90ZSB0aGF0IHlvdSBfbXVzdF8gbG9jayB0aGUgbWVtb3J5IGNvbnRhaW5pbmcgdGhlIGludGVycnVwdAotICogaGFuZGxlcnMgd2l0aCB0aGUgUE1fbG9ja1BhZ2VzKCkgZnVuY3Rpb24gb3RoZXJ3aXNlIHlvdSBtYXkgZW5jb3VudGVyCi0gKiBwcm9ibGVtcyBpbiB2aXJ0dWFsIG1lbW9yeSBlbnZpcm9ubWVudHMuCi0gKi8KLQotdm9pZCAgICBQTUFQSSBQTV9zZXRUaW1lckhhbmRsZXIoUE1faW50SGFuZGxlciBpaCk7Ci12b2lkICAgIFBNQVBJIFBNX2NoYWluUHJldlRpbWVyKHZvaWQpOwotdm9pZCAgICBQTUFQSSBQTV9yZXN0b3JlVGltZXJIYW5kbGVyKHZvaWQpOwotCi0vKiBSb3V0aW5lcyB0byBpbnN0YWxsIGFuZCBrZXlib2FyZCBpbnRlcnJ1cHQgaGFuZGxlcnMuCi0gKgotICogTm90ZSB0aGF0IHlvdSBfbXVzdF8gbG9jayB0aGUgbWVtb3J5IGNvbnRhaW5pbmcgdGhlIGludGVycnVwdAotICogaGFuZGxlcnMgd2l0aCB0aGUgUE1fbG9ja1BhZ2VzKCkgZnVuY3Rpb24gb3RoZXJ3aXNlIHlvdSBtYXkgZW5jb3VudGVyCi0gKiBwcm9ibGVtcyBpbiB2aXJ0dWFsIG1lbW9yeSBlbnZpcm9ubWVudHMuCi0gKi8KLQotdm9pZCAgICBQTUFQSSBQTV9zZXRLZXlIYW5kbGVyKFBNX2ludEhhbmRsZXIgaWgpOwotdm9pZCAgICBQTUFQSSBQTV9jaGFpblByZXZLZXkodm9pZCk7Ci12b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVLZXlIYW5kbGVyKHZvaWQpOwotCi0vKiBSb3V0aW5lcyB0byBob29rIGFuZCB1bmhvb2sgdGhlIGFsdGVybmF0ZSBJbnQgMTVoIGtleWJvYXJkIGludGVyY2VwdAotICogY2FsbG91dCByb3V0aW5lLiBZb3VyIGV2ZW50IGhhbmRsZXIgd2lsbCBuZWVkIHRvIHJldHVybiB0aGUgZm9sbG93aW5nOgotICoKLSAqICBzY2FuQ29kZSAgICAtIExldCB0aGUgQklPUyBwcm9jZXNzIHNjYW4gY29kZSAoY2hhaW5zIHRvIHByZXZpb3VzIGhhbmRsZXIpCi0gKiAgMCAgICAgICAgICAgLSBZb3UgaGF2ZSBwcm9jZXNzZWQgdGhlIHNjYW4gY29kZSBzbyBmbHVzaCBmcm9tIEJJT1MKLSAqCi0gKiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYXZhaWxhYmxlIHVuZGVyIGFsbCBET1MgZXh0ZW5kZXJzLCBidXQgZG9lcwotICogd29yayB1bmRlciByZWFsIG1vZGUsIERPUzRHVyBhbmQgWDMyLVZNLiBJdCBkb2VzIG5vdCB3b3JrIHVuZGVyIHRoZQotICogUG93ZXJQYWNrIDMyIGJpdCBET1MgZXh0ZW5kZXJzLiBJZiB5b3UgZmlndXJlIG91dCBob3cgdG8gZG8gaXQgbGV0IHVzIGtub3chCi0gKi8KLQotdm9pZCAgICBQTUFQSSBQTV9zZXRLZXkxNUhhbmRsZXIoUE1fa2V5MTVIYW5kbGVyIGloKTsKLXZvaWQgICAgUE1BUEkgUE1fcmVzdG9yZUtleTE1SGFuZGxlcih2b2lkKTsKLQotLyogUm91dGluZXMgdG8gaW5zdGFsbCBhbmQgcmVtb3ZlIHRoZSBjb250cm9sIGMvYnJlYWsgaW50ZXJydXB0IGhhbmRsZXJzLgotICogSW50ZXJydXB0IGhhbmRsaW5nIGlzIHBlcmZvcm1lZCBieSB0aGUgUE0vUHJvIGxpYnJhcnksIGFuZCB5b3UgY2FuIGNhbGwKLSAqIHRoZSBzdXBwbGllZCByb3V0aW5lcyB0byB0ZXN0IHRoZSBzdGF0dXMgb2YgdGhlIEN0cmwtQyBhbmQgQ3RybC1CcmVhawotICogZmxhZ3MuIElmIHlvdSBwYXNzIHRoZSB2YWx1ZSBUUlVFIGZvciAnY2xlYXJGbGFnJyB0byB0aGVzZSByb3V0aW5lcywKLSAqIHRoZSBpbnRlcm5hbCBmbGFncyB3aWxsIGJlIHJlc2V0IGluIG9yZGVyIHRvIGNhdGNoIGFub3RoZXIgQ3RybC1DIG9yCi0gKiBDdHJsLUJyZWFrIGludGVycnVwdC4KLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX2luc3RhbGxCcmVha0hhbmRsZXIodm9pZCk7Ci1pbnQgICAgIFBNQVBJIFBNX2N0cmxDSGl0KGludCBjbGVhckZsYWcpOwotaW50ICAgICBQTUFQSSBQTV9jdHJsQnJlYWtIaXQoaW50IGNsZWFyRmxhZyk7Ci12b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIodm9pZCk7Ci0KLS8qIFJvdXRpbmUgdG8gaW5zdGFsbCBhbiBhbHRlcm5hdGUgYnJlYWsgaGFuZGxlciB0aGF0IHdpbGwgY2FsbCB5b3VyCi0gKiBjb2RlIGRpcmVjdGx5LiBUaGlzIGlzIG5vdCBhdmFpbGFibGUgdW5kZXIgYWxsIERPUyBleHRlbmRlcnMsIGJ1dCBkb2VzCi0gKiB3b3JrIHVuZGVyIHJlYWwgbW9kZSwgRE9TNEdXIGFuZCBYMzItVk0uIEl0IGRvZXMgbm90IHdvcmsgdW5kZXIgdGhlCi0gKiBQb3dlclBhY2sgMzIgYml0IERPUyBleHRlbmRlcnMuIElmIHlvdSBmaWd1cmUgb3V0IGhvdyB0byBkbyBpdCBsZXQgdXMga25vdyEKLSAqCi0gKiBOb3RlIHRoYXQgeW91IHNob3VsZCBlaXRoZXIgaW5zdGFsbCBvbmUgb3IgdGhlIG90aGVyLCBidXQgbm90IGJvdGghCi0gKi8KLQotdm9pZCAgICBQTUFQSSBQTV9pbnN0YWxsQWx0QnJlYWtIYW5kbGVyKFBNX2JyZWFrSGFuZGxlciBiaCk7Ci0KLS8qIFJvdXRpbmVzIHRvIGluc3RhbGwgYW5kIHJlbW92ZSB0aGUgY3JpdGljYWwgZXJyb3IgaGFuZGxlci4gVGhlIGludGVycnVwdAotICogaXMgaGFuZGxlZCBieSB0aGUgUE0vUHJvIGxpYnJhcnksIGFuZCB0aGUgb3BlcmF0aW9uIHdpbGwgYWx3YXlzIGJlIGZhaWxlZC4KLSAqIFlvdSBjYW4gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgY3JpdGljYWwgZXJyb3IgaGFuZGxlciB3aXRoIHRoZQotICogYXBwcm9wcmlhdGUgZnVuY3Rpb24uIElmIHlvdSBwYXNzIHRoZSB2YWx1ZSBUUlVFIGZvciAnY2xlYXJGbGFnJywgdGhlCi0gKiBpbnRlcm5hbCBmbGFnIHdpbGwgYmUgcmVzZXQgcmVhZHkgdG8gY2F0Y2ggYW5vdGhlciBjcml0aWNhbCBlcnJvci4KLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX2luc3RhbGxDcml0aWNhbEhhbmRsZXIodm9pZCk7Ci1pbnQgICAgIFBNQVBJIFBNX2NyaXRpY2FsRXJyb3IoaW50ICpheFZhbHVlLCBpbnQgKmRpVmFsdWUsIGludCBjbGVhckZsYWcpOwotdm9pZCAgICBQTUFQSSBQTV9yZXN0b3JlQ3JpdGljYWxIYW5kbGVyKHZvaWQpOwotCi0vKiBSb3V0aW5lIHRvIGluc3RhbGwgYW4gYWx0ZXJuYXRlIGNyaXRpY2FsIGhhbmRsZXIgdGhhdCB3aWxsIGNhbGwgeW91cgotICogY29kZSBkaXJlY3RseS4gVGhpcyBpcyBub3QgYXZhaWxhYmxlIHVuZGVyIGFsbCBET1MgZXh0ZW5kZXJzLCBidXQgZG9lcwotICogd29yayB1bmRlciByZWFsIG1vZGUsIERPUzRHVyBhbmQgWDMyLVZNLiBJdCBkb2VzIG5vdCB3b3JrIHVuZGVyIHRoZQotICogUG93ZXJQYWNrIDMyIGJpdCBET1MgZXh0ZW5kZXJzLiBJZiB5b3UgZmlndXJlIG91dCBob3cgdG8gZG8gaXQgbGV0IHVzIGtub3chCi0gKgotICogTm90ZSB0aGF0IHlvdSBzaG91bGQgZWl0aGVyIGluc3RhbGwgb25lIG9yIHRoZSBvdGhlciwgYnV0IG5vdCBib3RoIQotICovCi0KLXZvaWQgICAgUE1BUEkgUE1faW5zdGFsbEFsdENyaXRpY2FsSGFuZGxlcihQTV9jcml0aWNhbEhhbmRsZXIpOwotCi0vKiBGdW5jdGlvbnMgdG8gbWFuYWdlIHByb3RlY3RlZCBtb2RlIG9ubHkgaW50ZXJydXB0IGhhbmRsZXJzICovCi0KLXZvaWQgICAgUE1BUEkgUE1fZ2V0UE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgKmlzcik7Ci12b2lkICAgIFBNQVBJIFBNX3NldFBNdmVjdChpbnQgaW50bm8sIFBNX2ludEhhbmRsZXIgaWgpOwotdm9pZCAgICBQTUFQSSBQTV9yZXN0b3JlUE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgaXNyKTsKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX1BNSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9zY2l0ZWNoLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvc2NpdGVjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDVlZWU5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9zY2l0ZWNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIEdlbmVyYWwgaGVhZGVyIGZpbGUgZm9yIG9wZXJhdGluZyBzeXN0ZW0gcG9ydGFibGUgY29kZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19TQ0lURUNIX0gKLSNkZWZpbmUgX19TQ0lURUNIX0gKLQotLyogV2UgaGF2ZSB0aGUgZm9sbG93aW5nIGRlZmluZXMgdG8gaWRlbnRpZnkgdGhlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50OgotICoKLSAqICBfXzE2QklUX18gICAgICAgQ29tcGlsaW5nIGZvciAxNiBiaXQgY29kZSAoYW55IGVudmlyb25tZW50KQotICogIF9fMzJCSVRfXyAgICAgICBDb21waWxpbmcgZm9yIDMyIGJpdCBjb2RlIChhbnkgZW52aXJvbm1lbnQpCi0gKiAgX19NU0RPU19fICAgICAgIENvbXBpbGluZyBmb3IgTVMtRE9TIChpbmNsdWRlcyBfX1dJTkRPV1MxNl9fLCBfX1dJTjM4Nl9fKQotICogIF9fUkVBTERPU19fICAgICBDb21waWxpbmcgZm9yIE1TLURPUyAoZXhjbHVkZXMgX19XSU5ET1dTMTZfXykKLSAqICBfX01TRE9TMTZfXyAgICAgQ29tcGlsaW5nIGZvciAxNiBiaXQgTVMtRE9TCi0gKiAgX19NU0RPUzMyX18gICAgIENvbXBpbGluZyBmb3IgMzIgYml0IE1TLURPUwotICogIF9fV0lORE9XU19fICAgICBDb21waWxpbmcgZm9yIFdpbmRvd3MKLSAqICBfX1dJTkRPV1MxNl9fICAgQ29tcGlsaW5nIGZvciAxNiBiaXQgV2luZG93cyAoX19NU0RPU19fIGFsc28gZGVmaW5lZCkKLSAqICBfX1dJTkRPV1MzMl9fICAgQ29tcGlsaW5nIGZvciAzMiBiaXQgV2luZG93cwotICogIF9fV0lOMzJfVlhEX18gICBDb21waWxpbmcgZm9yIGEgMzItYml0IEMgYmFzZWQgVnhECi0gKiAgX19OVF9EUklWRVJfXyAgIENvbXBpbGluZyBmb3IgYSAzMi1iaXQgQyBiYXNlZCBOVCBkZXZpY2UgZHJpdmVyCi0gKiAgX19PUzJfXyAgICAgICAgIENvbXBpbGluZyBmb3IgT1MvMgotICogIF9fT1MyXzE2X18gICAgICBDb21waWxpbmcgZm9yIDE2IGJpdCBPUy8yCi0gKiAgX19PUzJfMzJfXyAgICAgIENvbXBpbGluZyBmb3IgMzIgYml0IE9TLzIKLSAqICBfX1VOSVhfXyAgICAgICAgQ29tcGlsaW5nIGZvciBVbml4Ci0gKiAgX19RTlhfXyAgICAgICAgIENvbXBpbGluZyBmb3IgdGhlIFFOWCByZWFsdGltZSBPUyAoVW5peCBjb21wYXRpYmxlKQotICogIF9fTElOVVhfXyAgICAgICBDb21waWxpbmcgZm9yIHRoZSBMaW51eCBPUyAoVW5peCBjb21wYXRpYmxlKQotICogIF9fRlJFRUJTRF9fICAgICBDb21waWxpbmcgZm9yIHRoZSBGcmVlQlNEIE9TIChVbml4IGNvbXBhdGlibGUpCi0gKiAgX19CRU9TX18gICAgICAgIENvbXBpbGluZyBmb3IgdGhlIEJlT1MgKFVuaXggY29tcGF0aWJsZSkKLSAqICBfX1NNWDMyX18gICAgICAgQ29tcGlsaW5nIGZvciB0aGUgU01YIDMyLWJpdCBSZWFsIFRpbWUgT1MKLSAqICBfX0VORUFfT1NFX18gICAgQ29tcGlsaW5nIGZvciB0aGUgT1NFIGVtYmVkZGVkIE9TCi0gKiAgX19SVFRBUkdFVF9fICAgIENvbXBpbGluZyBmb3IgdGhlIFJUVGFyZ2V0IDMyLWJpdCBlbWJlZGRlZCBPUwotICogIF9fTUFDT1NfXyAgICAgICBDb21waWxpbmcgZm9yIHRoZSBNYWNPUyBwbGF0Zm9ybSAoUG93ZXJQQykKLSAqICBfX0RSSVZFUl9fICAgICAgQ29tcGlsaW5nIGZvciBhIDMyLWJpdCBiaW5hcnkgY29tcGF0aWJsZSBkcml2ZXIKLSAqICBfX0NPTlNPTEVfXyAgICAgQ29tcGlsaW5nIGZvciBhIGZ1bGxzY3JlZW4gT1MgY29uc29sZSBtb2RlCi0gKiAgX19TTkFQX18gICAgICAgIENvbXBpbGluZyBhcyBhIFNuYXAgZXhlY3V0ZWFibGUgb3IgZHluYW1pYyBsaWJyYXJ5Ci0gKgotICogIF9fSU5URUxfXyAgICAgICBDb21waWxpbmcgZm9yIEludGVsIENQVSdzCi0gKiAgX19BTFBIQV9fICAgICAgIENvbXBpbGluZyBmb3IgREVDIEFscGhhIENQVSdzCi0gKiAgX19NSVBTX18gICAgICAgIENvbXBpbGluZyBmb3IgTUlQUyBDUFUncwotICogIF9fUFBDX18gICAgICAgICBDb21waWxpbmcgZm9yIFBvd2VyUEMgQ1BVJ3MKLSAqICBfX01DNjhLX18gICAgICAgQ29tcGlsaW5nIGZvciBNb3Rvcm9sYSA2ODB4MAotICoKLSAqICBfX0JJR19FTkRJQU5fXyAgQ29tcGlsaW5nIGZvciBhIGJpZyBlbmRpYW4gcHJvY2Vzc29yCi0gKgotICovCi0KLSNpZmRlZiAgX19TQ19fCi0jaWYgICAgIF9fSU5UU0laRSA9PSA0Ci0jZGVmaW5lIF9fU0MzODZfXwotI2VuZGlmCi0jZW5kaWYKLQotLyogRGV0ZXJtaW5lIHNvbWUgdGhpbmdzIHRoYXQgYXJlIGNvbXBpbGVyIHNwZWNpZmljICovCi0KLSNpZmRlZiAgX19HTlVDX18KLSNpZmRlZiAgX19jcGx1c3BsdXMKLS8qIEcrKyBjdXJyZW50bHkgZnVja3MgdGhpcyB1cCEgKi8KLSNkZWZpbmUgX19jZGVjbAotI2RlZmluZSBfX3N0ZGNhbGwKLSNlbHNlCi0jdW5kZWYgIF9fY2RlY2wKLSN1bmRlZiAgX19zdGRjYWxsCi0jZGVmaW5lIF9fY2RlY2wgICAgIF9fYXR0cmlidXRlX18gKChjZGVjbCkpCi0jZGVmaW5lIF9fc3RkY2FsbCAgIF9fYXR0cmlidXRlX18gKChzdGRjYWxsKSkKLSNlbmRpZgotI2RlZmluZSBfX0ZMQVRfXyAgICAgICAgICAgIC8qIEdDQyBpcyBhbHdheXMgMzIgYml0IGZsYXQgbW9kZWwgICAgICAgICAgKi8KLSNkZWZpbmUgX19IQVNfQk9PTF9fICAgICAgICAvKiBMYXRlc3QgR05VIEMrKyBoYXMgaWJvb2wgdHlwZSAgICAgICAgICAgICovCi0jZGVmaW5lIF9fSEFTX0xPTkdfTE9OR19fICAgLyogR05VIEMgc3VwcG9ydHMgbG9uZyBsb25nIHR5cGUgICAgICAgICAgICAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgICAgIC8qIEJyaW5nIGluIGZvciBkZWZpbml0aW9uIG9mIE5VTEwgICAgICAgICAgKi8KLSNlbmRpZgotCi0jaWZkZWYgIF9fQk9STEFORENfXwotI2lmIChfX0JPUkxBTkRDX18gPj0gMHg1MDApIHx8IGRlZmluZWQoQ0xBU1NMSUJfREVGU19IKQotI2RlZmluZSBfX0hBU19CT09MX18gICAgICAgIC8qIEJvcmxhbmQgQysrIDUuMCBkZWZpbmVzIGlib29sIHR5cGUgICAgICAgKi8KLSNlbmRpZgotI2lmIChfX0JPUkxBTkRDX18gPj0gMHg1MDIpICYmICFkZWZpbmVkKFZUT09MU0QpICYmICFkZWZpbmVkKF9fU01YMzJfXykKLSNkZWZpbmUgX19IQVNfSU5UNjRfXyAgICAgICAvKiBCb3JsYW5kIEMrKyA1LjAyIHN1cHBvcnRzIF9faW50NjQgdHlwZSAgICovCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX19TQ19fKSAmJiAhZGVmaW5lZChWVE9PTFNEKSAmJiAhZGVmaW5lZChfX1NNWDMyX18pCi0jZGVmaW5lIF9fSEFTX0lOVDY0X18gICAgICAgLyogVmlzdWFsIEMrKyBzdXBwb3J0cyBfX2ludDY0IHR5cGUgICAgICAgICAqLwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKSAmJiAoX19XQVRDT01DX18gPj0gMTEwMCkgJiYgIWRlZmluZWQoVlRPT0xTRCkgJiYgIWRlZmluZWQoX19TTVgzMl9fKQotI2RlZmluZSBfX0hBU19JTlQ2NF9fICAgICAgIC8qIFdhdGNvbSBDKysgMTEuMCBzdXBwb3J0cyBfX2ludDY0IHR5cGUgICAgKi8KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRGV0ZXJtaW5lIHRoZSBjb21waWxlIHRpbWUgZW52aXJvbm1lbnQuIFRoaXMgbXVzdCBiZSBkb25lIGZvciBlYWNoCi0gKiBzdXBwb3J0ZWQgcGxhdGZvcm0gc28gdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGF0IGNvbXBpbGUgdGltZSB0aGUgdGFyZ2V0Ci0gKiBlbnZpcm9ubWVudCwgaG9wZWZ1bGx5IHdpdGhvdXQgcmVxdWlyaW5nICNkZWZpbmUncyBmcm9tIHRoZSB1c2VyLgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogMzItYml0IGJpbmFyeSBjb21wYXRpYmxlIGRyaXZlci4gQ29tcGlsZWQgYXMgV2luMzIsIGJ1dCBhcyBPUyBuZXV0cmFsICovCi0jaWZkZWYgIF9fRFJJVkVSX18KLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jdW5kZWYgIF9fV0lORE9XU19fCi0jdW5kZWYgIF9XSU4zMgotI3VuZGVmICBfX1dJTjMyX18KLSN1bmRlZiAgX19OVF9fCi0KLS8qIDMyLWJpdCBTbmFwIGV4ZSBvciBkbGwuIENvbXBpbGVkIGFzIFdpbjMyLCBidXQgYXMgT1MgbmV1dHJhbCAqLwotI2VsaWYgICBkZWZpbmVkKF9fU05BUF9fKQotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSN1bmRlZiAgX19XSU5ET1dTX18KLSN1bmRlZiAgX1dJTjMyCi0jdW5kZWYgIF9fV0lOMzJfXwotI3VuZGVmICBfX05UX18KLQotLyogMzItYml0IFdpbmRvd3MgVnhEIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KLSNlbGlmICAgZGVmaW5lZChfX3Z0b29sc2RfaF8pIHx8IGRlZmluZWQoVlRPT0xTRCkKLSNpbmNsdWRlIDx2dG9vbHNjLmg+Ci0jZGVmaW5lIF9fV0lOMzJfVlhEX18KLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jZGVmaW5lIF9NQVhfUEFUSCAgIDI1NgotI3VuZGVmIF9fV0lORE9XUzMyX18KLQotLyogMzItYml0IFdpbmRvd3MgTlQgZHJpdmVyIGNvbXBpbGUgZW52aXJvbm1lbnQ6IFRPRE8hISAqLwotI2VsaWYgICBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0jaW5jbHVkZSAibnRkcml2ZXIuaCIKLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jZGVmaW5lIF9NQVhfUEFUSCAgIDI1NgotI3VuZGVmIF9fV0lORE9XUzMyX18KLQotLyogMzItYml0IFNNWCBjb21waWxlIGVudmlyb25tZW50ICovCi0jZWxpZiAgIGRlZmluZWQoX19TTVgzMl9fKQotI2lmbmRlZiBfX01TRE9TX18KLSNkZWZpbmUgX19NU0RPU19fCi0jZW5kaWYKLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jaWZuZGVmIF9fQ09OU09MRV9fCi0jZGVmaW5lIF9fQ09OU09MRV9fCi0jZW5kaWYKLQotLyogMzItYml0IEVuZWEgT1NFIGVudmlyb25tZW50ICovCi0jZWxpZiAgIGRlZmluZWQoX19FTkVBX09TRV9fKQotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSNpZm5kZWYgX19DT05TT0xFX18KLSNkZWZpbmUgX19DT05TT0xFX18KLSNlbmRpZgotCi0vKiAzMi1iaXQgUlRUYXJnZXQtMzIgZW52aXJvbm1lbnQgKi8KLSNlbGlmICAgZGVmaW5lZChfX1JUVEFSR0VUX18pCi0jaWZuZGVmIF9fMzJCSVRfXwotI2RlZmluZSBfXzMyQklUX18KLSNlbmRpZgotI2lmbmRlZiBfX0NPTlNPTEVfXwotI2RlZmluZSBfX0NPTlNPTEVfXwotI2VuZGlmCi0KLS8qIDMyLWJpdCBleHRlbmRlZCBET1MgY29tcGlsZSBlbnZpcm9ubWVudCAqLwotI2VsaWYgICBkZWZpbmVkKF9fTVNET1NfXykgfHwgZGVmaW5lZChfX01TRE9TMzJfXykgfHwgZGVmaW5lZChfX0RPU19fKSB8fCBkZWZpbmVkKF9fRFBNSTMyX18pIHx8IChkZWZpbmVkKE1fSTg2KSAmJiAoIWRlZmluZWQoX19TQzM4Nl9fKSAmJiAhZGVmaW5lZChNX0kzODYpKSkgfHwgZGVmaW5lZChUTlQpCi0jaWZuZGVmIF9fTVNET1NfXwotI2RlZmluZSBfX01TRE9TX18KLSNlbmRpZgotI2lmICAgICBkZWZpbmVkKF9fTVNET1MzMl9fKSB8fCBkZWZpbmVkKF9fMzg2X18pIHx8IGRlZmluZWQoX19GTEFUX18pIHx8IGRlZmluZWQoX19OVF9fKSB8fCBkZWZpbmVkKF9fU0MzODZfXykKLSNpZm5kZWYgX19NU0RPUzMyX18KLSNkZWZpbmUgX19NU0RPUzMyX18KLSNlbmRpZgotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSNpZm5kZWYgX19SRUFMRE9TX18KLSNkZWZpbmUgX19SRUFMRE9TX18KLSNlbmRpZgotI2lmbmRlZiBfX0NPTlNPTEVfXwotI2RlZmluZSBfX0NPTlNPTEVfXwotI2VuZGlmCi0KLS8qIDE2LWJpdCBXaW5kb3dzIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KLSNlbGlmICAgKGRlZmluZWQoX1dpbmRvd3MpIHx8IGRlZmluZWQoX1dJTkRPV1MpKSAmJiAhZGVmaW5lZChfX0RQTUkxNl9fKQotI2lmbmRlZiBfXzE2QklUX18KLSNkZWZpbmUgX18xNkJJVF9fCi0jZW5kaWYKLSNpZm5kZWYgX19XSU5ET1dTMTZfXwotI2RlZmluZSBfX1dJTkRPV1MxNl9fCi0jZW5kaWYKLSNpZm5kZWYgX19XSU5ET1dTX18KLSNkZWZpbmUgX19XSU5ET1dTX18KLSNlbmRpZgotI2lmbmRlZiBfX01TRE9TX18KLSNkZWZpbmUgX19NU0RPU19fCi0jZW5kaWYKLQotLyogMTYtYml0IERPUyBjb21waWxlIGVudmlyb25tZW50ICovCi0jZWxzZQotI2lmbmRlZiBfXzE2QklUX18KLSNkZWZpbmUgX18xNkJJVF9fCi0jZW5kaWYKLSNpZm5kZWYgX19NU0RPUzE2X18KLSNkZWZpbmUgX19NU0RPUzE2X18KLSNlbmRpZgotI2lmbmRlZiBfX1JFQUxET1NfXwotI2RlZmluZSBfX1JFQUxET1NfXwotI2VuZGlmCi0jaWZuZGVmIF9fQ09OU09MRV9fCi0jZGVmaW5lIF9fQ09OU09MRV9fCi0jZW5kaWYKLSNlbmRpZgotCi0vKiAzMi1iaXQgV2luZG93cyBjb21waWxlIGVudmlyb25tZW50ICovCi0jZWxpZiAgIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfX05UX18pCi0jaWZuZGVmIF9fMzJCSVRfXwotI2RlZmluZSBfXzMyQklUX18KLSNlbmRpZgotI2lmbmRlZiBfX1dJTkRPV1MzMl9fCi0jZGVmaW5lIF9fV0lORE9XUzMyX18KLSNlbmRpZgotI2lmbmRlZiBfV0lOMzIKLSNkZWZpbmUgX1dJTjMyICAgICAgICAgICAgICAgICAgLyogTWljcm9zb2Z0IFdpbjMyIFNESyBoZWFkZXJzIHVzZSBfV0lOMzIgKi8KLSNlbmRpZgotI2lmbmRlZiBXSU4zMgotI2RlZmluZSBXSU4zMiAgICAgICAgICAgICAgICAgICAvKiBPcGVuR0wgaGVhZGVycyB1c2UgV0lOMzIgKi8KLSNlbmRpZgotI2lmbmRlZiBfX1dJTkRPV1NfXwotI2RlZmluZSBfX1dJTkRPV1NfXwotI2VuZGlmCi0KLS8qIDMyLWJpdCBPUy8yIFZERCBjb21waWxlIGVudmlyb25tZW50ICovCi0vKiBXZSdyZSBhc3N1bWluZyAoZm9yIG5vdykgdGhhdCBDTDM4NiBtdXN0IGJlIHVzZWQgKi8KLSNlbGlmICAgZGVmaW5lZChNU0RPUykgJiYgZGVmaW5lZChNX0kzODYpCi0vKiBmaXhlcyBuZWNlc3NhcnkgdG8gY29tcGlsZSB3aXRoIENMMzg2ICovCi0jZGVmaW5lIF9fY2RlY2wgIF9jZGVjbAotdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OwotCi0jaW5jbHVkZSA8bXZkbS5oPgotCi0vKiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBzb21ld2hlcmUgZWxzZS4uLiAgICAgICAgICAgICAgICAgKi8KLS8qIElubGluZSBlbGlnaWJsZSBmdW5jdGlvbnMgKHdlIGhhdmUgbm8gQ1JUIGxpYnMgZm9yIENMMzg2KSAqLwotI3ByYWdtYSBpbnRyaW5zaWMgKHN0cmNweSwgc3RyY21wLCBzdHJsZW4sIHN0cmNhdCkKLSNwcmFnbWEgaW50cmluc2ljIChtZW1jbXAsIG1lbWNweSwgbWVtc2V0KQotCi0jZGVmaW5lIF9fT1MyX1ZERF9fCi0jaWZuZGVmIF9fMzJCSVRfXwotI2RlZmluZSBfXzMyQklUX18KLSNlbmRpZgotI2RlZmluZSBDQ0hNQVhQQVRIICAyNTYKLSNkZWZpbmUgX01BWF9QQVRIICAgMjU2Ci0jaWZuZGVmIF9fT1MyX18KLSNkZWZpbmUgX19PUzJfXwotI2VuZGlmCi0jaWZuZGVmIF9fT1MyXzMyX18KLSNkZWZpbmUgX19PUzJfMzJfXwotI2VuZGlmCi0KLS8qIDE2LWJpdCBPUy8yIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KLSNlbGlmICAgZGVmaW5lZChfX09TMl8xNl9fKQotI2lmbmRlZiBfX09TMl9fCi0jZGVmaW5lIF9fT1MyX18KLSNlbmRpZgotI2lmbmRlZiBfXzE2QklUX18KLSNkZWZpbmUgX18xNkJJVF9fCi0jZW5kaWYKLSNpZm5kZWYgX19PUzJfUE1fXwotI2lmbmRlZiBfX0NPTlNPTEVfXwotI2RlZmluZSBfX0NPTlNPTEVfXwotI2VuZGlmCi0jZW5kaWYKLQotLyogMzItYml0IE9TLzIgY29tcGlsZSBlbnZpcm9ubWVudCAqLwotI2VsaWYgICBkZWZpbmVkKF9fT1MyX18pIHx8IGRlZmluZWQoX19PUzJfMzJfXykKLSNpZm5kZWYgX19PUzJfXwotI2RlZmluZSBfX09TMl9fCi0jZW5kaWYKLSNpZm5kZWYgX19PUzJfMzJfXwotI2RlZmluZSBfX09TMl8zMl9fCi0jZW5kaWYKLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jaWZuZGVmIF9fT1MyX1BNX18KLSNpZm5kZWYgX19DT05TT0xFX18KLSNkZWZpbmUgX19DT05TT0xFX18KLSNlbmRpZgotI2VuZGlmCi0KLS8qIDMyLWJpdCBRTlggY29tcGlsZSBlbnZpcm9ubWVudCAqLwotI2VsaWYgICBkZWZpbmVkKF9fUU5YX18pCi0jaWZuZGVmIF9fMzJCSVRfXwotI2RlZmluZSBfXzMyQklUX18KLSNlbmRpZgotI2lmbmRlZiBfX1VOSVhfXwotI2RlZmluZSBfX1VOSVhfXwotI2VuZGlmCi0jaWZkZWYgIF9fR05VQ19fCi0jZGVmaW5lIHN0cmljbXAgc3RyY2FzZWNtcAotI2VuZGlmCi0jaWYgIWRlZmluZWQoX19QSE9UT05fXykgJiYgIWRlZmluZWQoX19YMTFfXykKLSNpZm5kZWYgX19DT05TT0xFX18KLSNkZWZpbmUgX19DT05TT0xFX18KLSNlbmRpZgotI2VuZGlmCi0KLS8qIDMyLWJpdCBMaW51eCBjb21waWxlIGVudmlyb25tZW50ICovCi0jZWxpZiAgIGRlZmluZWQoX19MSU5VWF9fKSB8fCBkZWZpbmVkKGxpbnV4KQotI2lmbmRlZiBfX0xJTlVYX18KLSNkZWZpbmUgX19MSU5VWF9fCi0jZW5kaWYKLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jaWZuZGVmIF9fVU5JWF9fCi0jZGVmaW5lIF9fVU5JWF9fCi0jZW5kaWYKLSNpZmRlZiAgX19HTlVDX18KLSNkZWZpbmUgc3RyaWNtcCBzdHJjYXNlY21wCi0jZW5kaWYKLSNpZm5kZWYgX19YMTFfXwotI2lmbmRlZiBfX0NPTlNPTEVfXwotI2RlZmluZSBfX0NPTlNPTEVfXwotI2VuZGlmCi0jZW5kaWYKLQotLyogMzItYml0IEZyZWVCU0QgY29tcGlsZSBlbnZpcm9ubWVudCAqLwotI2VsaWYgICBkZWZpbmVkKF9fRlJFRUJTRF9fKQotI2lmbmRlZiBfX0ZSRUVCU0RfXwotI2RlZmluZSBfX0ZSRUVCU0RfXwotI2VuZGlmCi0jaWZuZGVmIF9fMzJCSVRfXwotI2RlZmluZSBfXzMyQklUX18KLSNlbmRpZgotI2lmbmRlZiBfX1VOSVhfXwotI2RlZmluZSBfX1VOSVhfXwotI2VuZGlmCi0jaWZkZWYgIF9fR05VQ19fCi0jZGVmaW5lIHN0cmljbXAgc3RyY2FzZWNtcAotI2VuZGlmCi0jaWZuZGVmIF9fWDExX18KLSNpZm5kZWYgX19DT05TT0xFX18KLSNkZWZpbmUgX19DT05TT0xFX18KLSNlbmRpZgotI2VuZGlmCi0KLS8qIDMyLWJpdCBCZU9TIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KLSNlbGlmICAgZGVmaW5lZChfX0JFT1NfXykKLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jaWZuZGVmIF9fVU5JWF9fCi0jZGVmaW5lIF9fVU5JWF9fCi0jZW5kaWYKLSNpZmRlZiAgX19HTlVDX18KLSNkZWZpbmUgc3RyaWNtcCBzdHJjYXNlY21wCi0jZW5kaWYKLQotLyogVW5zdXBwb3J0ZWQgT1MhICovCi0jZWxzZQotI2Vycm9yICBUaGlzIHBsYXRmb3JtIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIQotI2VuZGlmCi0KLS8qIERldGVybWluZSB0aGUgQ1BVIHR5cGUgdGhhdCB3ZSBhcmUgY29tcGlsaW5nIGZvciAqLwotCi0jaWYgICAgIGRlZmluZWQoX19NX0FMUEhBKSB8fCBkZWZpbmVkKF9fQUxQSEFfKSB8fCBkZWZpbmVkKF9fQUxQSEEpIHx8IGRlZmluZWQoX19hbHBoYSkKLSNpZm5kZWYgX19BTFBIQV9fCi0jZGVmaW5lIF9fQUxQSEFfXwotI2VuZGlmCi0jZWxpZiAgIGRlZmluZWQoX19NX1BQQykgfHwgZGVmaW5lZChfX1BPV0VSQykKLSNpZm5kZWYgX19QUENfXwotI2RlZmluZSBfX1BQQ19fCi0jZW5kaWYKLSNlbGlmICAgZGVmaW5lZChfX01fTVJYMDAwKQotI2lmbmRlZiBfX01JUFNfXwotI2RlZmluZSBfX01JUFNfXwotI2VuZGlmCi0jZWxzZQotI2lmbmRlZiBfX0lOVEVMX18KLSNkZWZpbmUgX19JTlRFTF9fICAgICAgICAgICAgICAgLyogQXNzdW1lIEludGVsIGlmIG5vdGhpbmcgZm91bmQgKi8KLSNlbmRpZgotI2VuZGlmCi0KLS8qIFdlIGhhdmUgdGhlIGZvbGxvd2luZyBkZWZpbmVzIHRvIGRlZmluZSB0aGUgY2FsbGluZyBjb252ZW50aW9ucyBmb3IKLSAqIHB1YmxpY2x5IGFjY2VzaWJsZSBmdW5jdGlvbnM6Ci0gKgotICogIF9QVUJBUEkgIC0gQ29tcGlsZXIgZGVmYXVsdCBjYWxsaW5nIGNvbnZlbnRpb25zIGZvciBhbGwgcHVibGljICdDJyBmdW5jdGlvbnMKLSAqICBfQVNNQVBJICAtIENhbGxpbmcgY29udmVudGlvbnMgZm9yIGFsbCBwdWJsaWMgYXNzZW1ibGVyIGZ1bmN0aW9ucwotICogIF9WQVJBUEkgIC0gTW9kaWZpZXJzIGZvciB2YXJpYWJsZXM7IFdhdGNvbSBDKysgbWFuZ2xlcyBDKysgZ2xvYmFscwotICogIF9TVERDQUxMIC0gV2luMzIgX19zdGRjYWxsIHdoZXJlIHBvc3NpYmxlLCBfX2NkZWNsIGlmIG5vdCBzdXBwb3J0ZWQKLSAqLwotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fU0NfXykKLSNkZWZpbmUgX19QQVNDQUwgICAgX19zdGRjYWxsCi0jZWxzZQotI2RlZmluZSBfX1BBU0NBTCAgICBfX3Bhc2NhbAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKE5PX1NURENBTEwpCi0jZGVmaW5lIF9TVERDQUxMICAgIF9fY2RlY2wKLSNlbHNlCi0jZGVmaW5lIF9TVERDQUxMICAgIF9fc3RkY2FsbAotI2VuZGlmCi0KLSNpZmRlZiAgX19XQVRDT01DX18KLSNpZiAoX19XQVRDT01DX18gPj0gMTA1MCkKLSNkZWZpbmUgX1ZBUkFQSSAgICAgX19jZGVjbAotI2Vsc2UKLSNkZWZpbmUgX1ZBUkFQSQotI2VuZGlmCi0jZWxzZQotI2RlZmluZSBfVkFSQVBJCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19JQk1DX18pIHx8IGRlZmluZWQoX19JQk1DUFBfXykKLSNkZWZpbmUgUFRSX0RFQ0xfSU5fRlJPTlQKLSNlbmRpZgotCi0vKiBEZWZpbmUgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgZm9yIGFsbCBwdWJsaWMgZnVuY3Rpb25zLiBGb3Igc2ltcGxpY2l0eQotICogd2UgZGVmaW5lIGFsbCBwdWJsaWMgZnVuY3Rpb25zIGFzIF9fY2RlY2wgY2FsbGluZyBjb252ZW50aW9ucywgc28gdGhhdAotICogdGhleSBhcmUgdGhlIHNhbWUgYWNyb3NzIGFsbCBjb21waWxlcnMgYW5kIHJ1bnRpbWUgRExMJ3MuCi0gKi8KLQotI2RlZmluZSBfUFVCQVBJIF9fY2RlY2wKLSNkZWZpbmUgX0FTTUFQSSBfX2NkZWNsCi0KLS8qIERldGVybWluZSB0aGUgc3ludGF4IGZvciBkZWNsYXJpbmcgYSBmdW5jdGlvbiBwb2ludGVyIHdpdGggYQotICogY2FsbGluZyBjb252ZW50aW9ucyBvdmVycmlkZS4gTW9zdCBjb21waWxlcnMgcmVxdWlyZSB0aGUgY2FsbGluZwotICogY29udmVudGlvbiB0byBiZSBkZWNsYXJlZCBpbiBmcm9udCBvZiB0aGUgJyonLCBidXQgb3RoZXJzIHJlcXVpcmUKLSAqIGl0IHRvIGJlIGRlY2xhcmVkIGFmdGVyIHRoZSAnKicuIFdlIGhhbmRsZSBib3RoIGluIGhlcmUgZGVwZW5kaW5nCi0gKiBvbiB3aGF0IHRoZSBjb21waWxlciByZXF1aXJlcy4KLSAqLwotCi0jaWZkZWYgIFBUUl9ERUNMX0lOX0ZST05UCi0jZGVmaW5lIF9QVUJBUElQICAgICogX1BVQkFQSQotI2RlZmluZSBfQVNNQVBJUCAgICAqIF9BU01BUEkKLSNlbHNlCi0jZGVmaW5lIF9QVUJBUElQICAgIF9QVUJBUEkgKgotI2RlZmluZSBfQVNNQVBJUCAgICBfQVNNQVBJICoKLSNlbmRpZgotCi0vKiBVc2VmdWwgbWFjcm9zICovCi0KLSNkZWZpbmUgUFJJVkFURSBzdGF0aWMKLSNkZWZpbmUgUFVCTElDCi0KLS8qIFRoaXMgSEFTIHRvIGJlIDBMIGZvciAxNi1iaXQgcmVhbCBtb2RlIGNvZGUgdG8gd29yayEhISAqLwotCi0jaWZuZGVmIE5VTEwKLSMgICAgICAgZGVmaW5lIF9OVUxMIDBMCi0jICAgICAgIGRlZmluZSBOVUxMIF9OVUxMCi0jZW5kaWYKLQotI2lmbmRlZiBNQVgKLSMgICAgICAgZGVmaW5lIE1BWChhLGIpICggKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCi0jZW5kaWYKLSNpZm5kZWYgTUlOCi0jICAgICAgIGRlZmluZSBNSU4oYSxiKSAoICgoYSkgPCAoYikpID8gKGEpIDogKGIpKQotI2VuZGlmCi0jaWZuZGVmIEFCUwotIyAgICAgICBkZWZpbmUgQUJTKGEpICAgKChhKSA+PSAwID8gKGEpIDogLShhKSkKLSNlbmRpZgotI2lmbmRlZiBTSUdOCi0jICAgICAgIGRlZmluZSBTSUdOKGEpICAoKGEpID4gMCA/IDEgOiAtMSkKLSNlbmRpZgotCi0vKiBHZW5lcmFsIHR5cGVkZWZzICovCi0KLSNpZm5kZWYgX19HRU5ERUZTCi0jZGVmaW5lIF9fR0VOREVGUwotI2lmIGRlZmluZWQoX19CRU9TX18pCi0jaW5jbHVkZSA8U3VwcG9ydERlZnMuaD4KLSNlbHNlCi0jaWZkZWYgX19MSU5VWF9fCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZkZWYgX19TVFJJQ1RfQU5TSV9fCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgdXNob3J0OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgIHVsb25nOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIHVpbnQ7Ci0jZW5kaWYKLSNpZmRlZiAgX19LRVJORUxfXwotI2RlZmluZSBfX0dFTkRFRlNfMgotI2VuZGlmCi0jZWxzZQotI2lmICEoZGVmaW5lZChfX1FOWE5UT19fKSAmJiBkZWZpbmVkKEdFTkVSQUxfU1RSVUNUKSkKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICB1c2hvcnQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgdWxvbmc7Ci0jZW5kaWYKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICB1aW50OwotI2VuZGlmCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgdWNoYXI7Ci0jZW5kaWYKLXR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICBpYm9vbDsgICAgICAvKiBJbnRlZ2VyIGJvb2xlYW4gdHlwZSAgICAgICAgICovCi0jaWZkZWYgIFVTRV9CT09MICAgICAgICAgICAgICAgICAgICAgICAgLyogT25seSBmb3Igb2xkZXIgY29kZSAgICAgICAgICAqLwotI2lmbmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBib29sICAgICAgICAgICAgICAgIGlib29sICAgICAgIC8qIFN0YW5kYXJkIEMgICAgICAgICAgICAgICAgICAgKi8KLSNlbHNlCi0jaWZuZGVmIF9fSEFTX0JPT0xfXwotI2RlZmluZSBib29sICAgICAgICAgICAgICAgIGlib29sICAgICAgIC8qIE9sZGVyIEMrKyBjb21waWxlcnMgICAgICAgICAgKi8KLSNlbmRpZgotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotI2VuZGlmICAvKiBVU0VfQk9PTCAqLwotI2VuZGlmICAvKiBfX0dFTkRFRlMgKi8KLQotLyogTW9yZSBnZW5lcmFsIHR5cGVkZWZzIGNvbXBhdGlibGUgd2l0aCBMaW51eCBrZXJuZWwgY29kZSAqLwotCi0jaWZuZGVmIF9fR0VOREVGU18yCi0jZGVmaW5lIF9fR0VOREVGU18yCi10eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgczg7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgdTg7Ci10eXBlZGVmIHNob3J0ICAgICAgICAgICAgICAgczE2OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIHUxNjsKLSNpZmRlZiAgX18xNkJJVF9fCi10eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgczMyOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgIHUzMjsKLSNlbHNlCi10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgczMyOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIHUzMjsKLSNlbmRpZgotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHUzMiBsb3c7Ci0gICAgczMyIGhpZ2g7Ci0gICAgfSBfX2k2NDsKLSNpZmRlZiAgX19IQVNfTE9OR19MT05HX18KLSNkZWZpbmUgX19OQVRJVkVfSU5UNjRfXwotdHlwZWRlZiBsb25nIGxvbmcgICAgICAgICAgIHM2NDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICB1NjQ7Ci0jZWxpZiAgIGRlZmluZWQoX19IQVNfSU5UNjRfXykgJiYgIWRlZmluZWQoX18xNkJJVF9fKQotI2RlZmluZSBfX05BVElWRV9JTlQ2NF9fCi10eXBlZGVmIF9faW50NjQgICAgICAgICAgICAgczY0OwotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICAgIHU2NDsKLSNlbHNlCi10eXBlZGVmIF9faTY0ICAgICAgICAgICAgICAgczY0OwotdHlwZWRlZiBfX2k2NCAgICAgICAgICAgICAgIHU2NDsKLSNlbmRpZgotI2VuZGlmCi0KLS8qIEJvb2xlYW4gdHJ1dGggdmFsdWVzICovCi0KLSN1bmRlZiAgZmFsc2UKLSN1bmRlZiAgdHJ1ZQotI3VuZGVmICBOTwotI3VuZGVmICBZRVMKLSN1bmRlZiAgRkFMU0UKLSN1bmRlZiAgVFJVRQotI2RlZmluZSBmYWxzZSAgICAgICAwCi0jZGVmaW5lIHRydWUgICAgICAgIDEKLSNkZWZpbmUgTk8gICAgICAgICAgMAotI2RlZmluZSBZRVMgICAgICAgICAxCi0jZGVmaW5lIEZBTFNFICAgICAgIDAKLSNkZWZpbmUgVFJVRSAgICAgICAgMQotCi0vKiBJbmxpbmUgZGVidWdnZXIgaW50ZXJydXB0cyBmb3IgV2F0Y29tIEMrKyBhbmQgQm9ybGFuZCBDKysgKi8KLQotI2lmZGVmICBfX1dBVENPTUNfXwotdm9pZCBEZWJ1Z0ludCh2b2lkKTsKLSNwcmFnbWEgYXV4IERlYnVnSW50ID0gICAgICAgICAgICAgIFwKLSAgICAiaW50ICAgIDMiOwotdm9pZCBEZWJ1Z1Z4RCh2b2lkKTsKLSNwcmFnbWEgYXV4IERlYnVnVnhEID0gICAgICAgICAgICAgIFwKLSAgICAiaW50ICAgIDEiOwotI2VsaWYgICBkZWZpbmVkKF9fQk9STEFORENfXykKLSNkZWZpbmUgRGVidWdJbnQoKSAgX19lbWl0X18oMHhDQykKLSNkZWZpbmUgRGVidWdWeEQoKSAge19fZW1pdF9fKDB4Q0QpOyBfX2VtaXRfXygweDAxKTt9Ci0jZWxpZiAgIGRlZmluZWQoX01TQ19WRVIpCi0jZGVmaW5lIERlYnVnSW50KCkgIF9hc20gaW50IDB4MwotI2RlZmluZSBEZWJ1Z1Z4RCgpICBfYXNtIGludCAweDEKLSNlbGlmICAgZGVmaW5lZChfX0dOVUNfXykKLSNkZWZpbmUgRGVidWdJbnQoKSAgYXNtIHZvbGF0aWxlICgiaW50ICQweDMiKQotI2RlZmluZSBEZWJ1Z1Z4RCgpICBhc20gdm9sYXRpbGUgKCJpbnQgJDB4MSIpCi0jZWxzZQotdm9pZCBfQVNNQVBJIERlYnVnSW50KHZvaWQpOwotdm9pZCBfQVNNQVBJIERlYnVnVnhEKHZvaWQpOwotI2VuZGlmCi0KLS8qIE1hY3JvcyB0byBicmVhayBvbmNlIGFuZCBuZXZlciBicmVhayBhZ2FpbiAqLwotCi0jZGVmaW5lIERlYnVnSW50T25jZSgpICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3RhdGljIGlib29sIGZpcnN0VGltZSA9IHRydWU7ICBcCi0gICAgaWYgKGZpcnN0VGltZSkgeyAgICAgICAgICAgICAgICBcCi0JZmlyc3RUaW1lID0gZmFsc2U7ICAgICAgICAgIFwKLQlEZWJ1Z0ludCgpOyAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgRGVidWdWeERPbmNlKCkgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdGF0aWMgaWJvb2wgZmlyc3RUaW1lID0gdHJ1ZTsgIFwKLSAgICBpZiAoZmlyc3RUaW1lKSB7ICAgICAgICAgICAgICAgIFwKLQlmaXJzdFRpbWUgPSBmYWxzZTsgICAgICAgICAgXAotCURlYnVnVnhEKCk7ICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotLyogTWFjcm9zIGZvciBsaW51eCBzdHJpbmcgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMgKi8KLQotI2lmZGVmICBfX0xJTlVYX18KLSNkZWZpbmUgc3RyaWNtcCBzdHJjYXNlY21wCi0jZGVmaW5lIHN0cm5pY21wIHN0cm5jYXNlY21wCi0jZW5kaWYKLQotLyogTWFjcm9zIGZvciBOVCBkcml2ZXIgc3RyaW5nIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zICovCi0KLSNpZmRlZiBfX05UX0RSSVZFUl9fCi0jZGVmaW5lIHN0cmljbXAgX3N0cmljbXAKLSNkZWZpbmUgc3RybmljbXAgX3N0cm5pY21wCi0jZW5kaWYKLQotLyogR2V0IHJpZCBvZiBzb21lIGhlbGFjaW91c2x5IGFubm95aW5nIFZpc3VhbCBDKysgd2FybmluZ3MhICovCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX01XRVJLU19fKSAmJiAhZGVmaW5lZChfX1NDX18pCi0jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0NzYxKSAgIC8qIGludGVncmFsIHNpemUgbWlzbWF0Y2ggaW4gYXJndW1lbnQ7IGNvbnZlcnNpb24gc3VwcGxpZWQgKi8KLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQyNDQpICAgLyogY29udmVyc2lvbiBmcm9tICd1bnNpZ25lZCBzaG9ydCAnIHRvICd1bnNpZ25lZCBjaGFyICcsIHBvc3NpYmxlIGxvc3Mgb2YgZGF0YSAqLwotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDAxOCkgICAvKiAnPCcgOiBzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2ggKi8KLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQzMDUpICAgLyogJ2luaXRpYWxpemluZycgOiB0cnVuY2F0aW9uIGZyb20gJ2NvbnN0IGRvdWJsZScgdG8gJ2Zsb2F0JyAqLwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBTZXQgb2YgZGVidWdnaW5nIG1hY3JvcyB1c2VkIGJ5IHRoZSBsaWJyYXJpZXMuIElmIHRoZSBkZWJ1ZyBmbGFnIGlzCi0gKiBzZXQsIHRoZXkgYXJlIHR1cm5lZCBvbiBkZXBlbmRpbmcgb24gdGhlIHNldHRpbmcgb2YgdGhlIGZsYWcuIFVzZXIgY29kZQotICogY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucyBjYWxsZWQgd2hlbiBhIGNoZWNrIGZhaWxzLCBhbmQgdGhlCi0gKiBNR0wgZG9lcyB0aGlzIHNvIGl0IGNhbiByZXN0b3JlIHRoZSBzeXN0ZW0gZnJvbSBncmFwaGljcyBtb2RlIHRvIGRpc3BsYXkKLSAqIGFuIGVycm9yIG1lc3NhZ2UuIFRoZXNlIGZ1bmN0aW9ucyBhbHNvIGxvZyBpbmZvcm1hdGlvbiB0byB0aGUKLSAqIHNjaXRlY2gubG9nIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBoYXJkIGRyaXZlIHdoZW4gcHJvYmxlbXMKLSAqIHNob3cgdXAuCi0gKgotICogSWYgeW91IHNldCB0aGUgdmFsdWUgb2YgQ0hFQ0tFRCB0byBiZSAyLCBpdCB3aWxsIGFsc28gZW5hYmxlIGNvZGUgdG8KLSAqIGluc2VydCBoYXJkIGNvZGVkIGRlYnVnZ2VyIGludGVycnVwdCBpbnRvIHRoZSBzb3VyY2UgY29kZSBhdCB0aGUgbGluZSBvZgotICogY29kZSB3aGVyZSB0aGUgY2hlY2sgZmFpbC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHJ1biB0aGUgY29kZSB1bmRlciBhCi0gKiBkZWJ1Z2dlciBhcyBpdCB3aWxsIGJyZWFrIGluc2lkZSB0aGUgZGVidWdnZXIgYmVmb3JlIGV4aXRpbmcgd2l0aCBhCi0gKiBmYWlsdXJlIGNvbmRpdGlvbi4KLSAqCi0gKiBBbHNvIGZvciBjb2RlIGNvbXBpbGVkIHRvIHJ1biB1bmRlciBXaW5kb3dzLCB3ZSBhbHNvIGNhbGwgdGhlCi0gKiBPdXRwdXREZWJ1Z1N0cmluZyBmdW5jdGlvbiB0byBzZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gZGVidWdnZXIKLSAqIHN1Y2ggYXMgU29mdC1JQ0Ugb3IgV0RFQjM4Ni4gSGVuY2UgaWYgeW91IGdldCBhbnkgbm9uLWZhdGFsIHdhcm5pbmdzIHlvdQotICogd2lsbCBzZWUgdGhvc2Ugb24gdGhlIGRlYnVnZ2VyIHRlcm1pbmFsIGFzIHdlbGwgYXMgaW4gdGhlIGxvZyBmaWxlLgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7ICAgICAgICAgICAgLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KLSNlbmRpZgotCi1leHRlcm4gdm9pZCAoKl9DSEtfZmFpbCkoaW50IGZhdGFsLGNvbnN0IGNoYXIgKm1zZyxjb25zdCBjaGFyICpjb25kLGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUpOwotdm9pZCBfQ0hLX2RlZmF1bHRGYWlsKGludCBmYXRhbCxjb25zdCBjaGFyICptc2csY29uc3QgY2hhciAqY29uZCxjb25zdCBjaGFyICpmaWxlLGludCBsaW5lKTsKLQotI2lmZGVmICBDSEVDS0VECi0jICAgICAgIGRlZmluZSAgQ0hLKHgpICAgICAgeAotI2lmICAgICBDSEVDS0VEID4gMQotIyAgICAgICBkZWZpbmUgIENIRUNLKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKChwKSA/ICh2b2lkKTAgOiBEZWJ1Z0ludCgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBfQ0hLX2ZhaWwoMSwiQ2hlY2sgZmFpbGVkOiAnJXMnLCBmaWxlICVzLCBsaW5lICVkXG4iLCAgIFwKLQkgICAgI3AsIF9fRklMRV9fLCBfX0xJTkVfXykpCi0jICAgICAgIGRlZmluZSAgV0FSTihwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoKHApID8gKHZvaWQpMCA6IERlYnVnSW50KCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIF9DSEtfZmFpbCgwLCJXYXJuaW5nOiAnJXMnLCBmaWxlICVzLCBsaW5lICVkXG4iLCAgICAgICAgXAotCSAgICAjcCwgX19GSUxFX18sIF9fTElORV9fKSkKLSNlbHNlCi0jICAgICAgIGRlZmluZSAgQ0hFQ0socCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoKHApID8gKHZvaWQpMCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIF9DSEtfZmFpbCgxLCJDaGVjayBmYWlsZWQ6ICclcycsIGZpbGUgJXMsIGxpbmUgJWRcbiIsICAgXAotCSAgICAjcCwgX19GSUxFX18sIF9fTElORV9fKSkKLSMgICAgICAgZGVmaW5lICBXQVJOKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSgocCkgPyAodm9pZCkwIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgX0NIS19mYWlsKDAsIldhcm5pbmc6ICclcycsIGZpbGUgJXMsIGxpbmUgJWRcbiIsICAgICAgICBcCi0JICAgICNwLCBfX0ZJTEVfXywgX19MSU5FX18pKQotI2VuZGlmCi0jICAgICAgIGRlZmluZSAgTE9HRkFUQUwobXNnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgX0NIS19mYWlsKDEsIkZhdGFsIGVycm9yOiAnJXMnLCBmaWxlICVzLCBsaW5lICVkXG4iLCAgICBcCi0JICAgIG1zZywgX19GSUxFX18sIF9fTElORV9fKQotIyAgICAgICBkZWZpbmUgIExPR1dBUk4obXNnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIF9DSEtfZmFpbCgwLCJXYXJuaW5nOiAnJXMnLCBmaWxlICVzLCBsaW5lICVkXG4iLCAgICAgICAgXAotCSAgICBtc2csIF9fRklMRV9fLCBfX0xJTkVfXykKLSNlbHNlCi0jICAgICAgIGRlZmluZSAgQ0hLKHgpCi0jICAgICAgIGRlZmluZSAgQ0hFQ0socCkgICAgICAgICgodm9pZCkwKQotIyAgICAgICBkZWZpbmUgIFdBUk4ocCkgICAgICAgICAoKHZvaWQpMCkKLSMgICAgICAgZGVmaW5lICBMT0dGQVRBTChtc2cpICAgKCh2b2lkKTApCi0jICAgICAgIGRlZmluZSAgTE9HV0FSTihtc2cpICAgICgodm9pZCkwKQotI2VuZGlmCi0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLX0gICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgKi8KLSNlbmRpZgotCi0jZW5kaWYgIC8qIF9fU0NJVEVDSF9IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvc2NpdGVjaC5tYWMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvc2NpdGVjaC5tYWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YTJmYzAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3NjaXRlY2gubWFjCisrKyAvZGV2L251bGwKQEAgLTEsMTMyMSArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIE5ldFdpZGUgQXNzZW1ibGVyIChOQVNNKSBvciBUdXJibyBBc3NlbWJsZXIgKFRBU00pCi07KiBFbnZpcm9ubWVudDogQW55IEludGVsIEVudmlyb25tZW50Ci07KgotOyogRGVzY3JpcHRpb246IE1hY3JvcyB0byBwcm92aWRlIG1lbW9yeSBtb2RlbCBpbmRlcGVuZGFudCBhc3NlbWJseSBsYW5ndWFnZQotOyogICAgICAgICAgICAgIG1vZHVsZSBmb3IgQyBwcm9ncmFtbWluZy4gU3VwcG9ydHMgdGhlIGxhcmdlIGFuZCBmbGF0IG1lbW9yeQotOyogICAgICAgICAgICAgIG1vZGVscy4KLTsqCi07KiAgICAgICAgICAgICAgVGhlIGRlZmluZXMgdGhhdCB5b3Ugc2hvdWxkIHVzZSB3aGVuIGFzc2VtYmxpbmcgbW9kdWxlcyB0aGF0Ci07KiAgICAgICAgICAgICAgdXNlIHRoaXMgbWFjcm8gcGFja2FnZSBhcmU6Ci07KgotOyogICAgICAgICAgICAgICAgICBfX0xBUkdFX18gICBBc3NlbWJsZSBmb3IgMTYtYml0IGxhcmdlIG1vZGVsCi07KiAgICAgICAgICAgICAgICAgIF9fRkxBVF9fICAgIEFzc2VtYmxlIGZvciAzMi1iaXQgRkxBVCBtZW1vcnkgbW9kZWwKLTsqICAgICAgICAgICAgICAgICAgX19OT1VfXyAgICAgTm8gdW5kZXJzY29yZSBmb3IgYWxsIGV4dGVybmFsIEMgbGFiZWxzCi07KiAgICAgICAgICAgICAgICAgIF9fTk9VX1ZBUl9fIE5vIHVuZGVyc2NvcmUgZm9yIGdsb2JhbCB2YXJpYWJsZXMgb25seQotOyoKLTsqICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBzZXR0aW5ncyBhcmUgZm9yIDE2LWJpdCBsYXJnZSBtZW1vcnkgbW9kZWwgd2l0aAotOyogICAgICAgICAgICAgIGxlYWRpbmcgdW5kZXJzY29yZXMgZm9yIHN5bWJvbCBuYW1lcy4KLTsqCi07KiAgICAgICAgICAgICAgVGhlIG1haW4gaW50ZW50IG9mIHRoZSBtYWNybyBmaWxlIGlzIHRvIGVuYWJsZSBwcm9ncmFtbWVycwotOyogICAgICAgICAgICAgIHRvIHdyaXRlIF9vbmVfIHNldCBvZiBzb3VyY2UgdGhhdCBjYW4gYmUgYXNzZW1ibGVkIHRvIHJ1bgotOyogICAgICAgICAgICAgIGluIGVpdGhlciAxNiBiaXQgcmVhbCBhbmQgcHJvdGVjdGVkIG1vZGVzIG9yIDMyIGJpdAotOyogICAgICAgICAgICAgIHByb3RlY3RlZCBtb2RlIHdpdGhvdXQgdGhlIG5lZWQgdG8gcmlkZGxlIHRoZSBjb2RlIHdpdGgKLTsqICAgICAgICAgICAgICAnaWYgZmxhdG1vZGVsJyBzdHlsZSBjb25kaXRpb25hbCBhc3NlbWJseSAoaXQgaXMgc3RpbGwgdGhlcmUKLTsqICAgICAgICAgICAgICBidXQgbmljZWx5IGhpZGRlbiBieSBhIG1hY3JvIGxheWVyIHRoYXQgZW5oYW5jZXMgdGhlCi07KiAgICAgICAgICAgICAgcmVhZGFiaWxpdHkgYW5kIHVuZGVyc3RhbmRhYmlsaXR5IG9mIHRoZSByZXN1bHRpbmcgY29kZSkuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotOyBJbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSB2ZXJzaW9uIGluIGhlcmUgZGVwZW5kaW5nIG9uIHRoZSBhc3NlbWJsZXIuIE5BU00KLTsgYXBwZWFycyB0byBhbHdheXMgdHJ5IGFuZCBwYXJzZSBjb2RlLCBldmVuIGlmIGl0IGlzIGluIGEgbm9uLWNvbXBpbGluZwotOyBibG9jayBvZiBhIGlmZGVmIGV4cHJlc3Npb24sIGFuZCBoZW5jZSBjcmFzaGVzIGlmIHdlIGluY2x1ZGUgdGhlIFRBU00KLTsgbWFjcm8gcGFja2FnZSBpbiB0aGUgc2FtZSBoZWFkZXIgZmlsZS4gSGVuY2Ugd2Ugc3BsaXQgdGhlIG1hY3JvcyB1cCBpbnRvCi07IHR3byBzZXBhcmF0ZSBoZWFkZXIgZmlsZXMuCi0KLWlmZGVmIF9fTkFTTV9NQUpPUl9fCi0KLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07IE1hY3JvIHBhY2thZ2Ugd2hlbiBjb21waWxpbmcgd2l0aCBOQVNNLgotOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotOyBUdXJuIG9mZiB1bmRlcnNjb3JlcyBmb3IgZ2xvYmFscyBpZiBkaXNhYmxlZCBmb3IgYWxsIGV4dGVybmFscwotCi0laWZkZWYgIF9fTk9VX18KLSVkZWZpbmUgX19OT1VfVkFSX18KLSVlbmRpZgotCi07IERlZmluZSB0aGUgX19XSU5ET1dTX18gc3ltYm9sIGlmIHdlIGFyZSBjb21waWxpbmcgZm9yIGFueSBXaW5kb3dzCi07IGVudmlyb25tZW50Ci0KLSVpZmRlZiAgX19XSU5ET1dTMTZfXwotJWRlZmluZSBfX1dJTkRPV1NfXyAgICAgICAgIDEKLSVlbmRpZgotJWlmZGVmICBfX1dJTkRPV1MzMl9fCi0lZGVmaW5lIF9fV0lORE9XU19fICAgICAgICAgMQotJWRlZmluZSBfX1dJTkRPV1MzMl8zODZfXyAgIDEKLSVlbmRpZgotCi07IE1hY3JvcyBmb3IgYWNjZXNzaW5nICdnZW5lcmljJyByZWdpc3RlcnMKLQotJWlmZGVmICBfX0ZMQVRfXwotJWlkZWZpbmUgX2F4ICAgIGVheAotJWlkZWZpbmUgX2J4ICAgIGVieAotJWlkZWZpbmUgX2N4ICAgIGVjeAotJWlkZWZpbmUgX2R4ICAgIGVkeAotJWlkZWZpbmUgX3NpICAgIGVzaQotJWlkZWZpbmUgX2RpICAgIGVkaQotJWlkZWZpbmUgX2JwICAgIGVicAotJWlkZWZpbmUgX3NwICAgIGVzcAotJWlkZWZpbmUgX2VzCi0laWRlZmluZSBVQ0hBUiAgQllURSAgICAgICAgOyBTaXplIG9mIGEgY2hhcmFjdGVyCi0laWRlZmluZSBVU0hPUlQgV09SRCAgICAgICAgOyBTaXplIG9mIGEgc2hvcnQKLSVpZGVmaW5lIFVJTlQgICBEV09SRCAgICAgICA7IFNpemUgb2YgYW4gaW50ZWdlcgotJWlkZWZpbmUgVUxPTkcgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGxvbmcKLSVpZGVmaW5lIEJPT0wgICBEV09SRCAgICAgICA7IFNpemUgb2YgYSBib29sZWFuCi0laWRlZmluZSBEUFRSICAgRFdPUkQgICAgICAgOyBTaXplIG9mIGEgZGF0YSBwb2ludGVyCi0laWRlZmluZSBGRFBUUiAgRldPUkQgICAgICAgOyBTaXplIG9mIGEgZmFyIGRhdGEgcG9pbnRlcgotJWlkZWZpbmUgTkRQVFIgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIG5lYXIgZGF0YSBwb2ludGVyCi0laWRlZmluZSBDUFRSICAgRFdPUkQgICAgICAgOyBTaXplIG9mIGEgY29kZSBwb2ludGVyCi0laWRlZmluZSBGQ1BUUiAgRldPUkQgICAgICAgOyBTaXplIG9mIGEgZmFyIGNvZGUgcG9pbnRlcgotJWlkZWZpbmUgTkNQVFIgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIG5lYXIgY29kZSBwb2ludGVyCi0laWRlZmluZSBGUFRSICAgTkVBUiAgICAgICAgOyBEaXN0YW5jZSBmb3IgZnVuY3Rpb24gcG9pbnRlcnMKLSVpZGVmaW5lIERVSU5UICBkZCAgICAgICAgICA7IERlY2xhcmUgYSBpbnRlZ2VyIHZhcmlhYmxlCi0laWRlZmluZSBpbnRzaXplIDQKLSVpZGVmaW5lIGZsYXRtb2RlbCAxCi0lZWxzZQotJWlkZWZpbmUgX2F4ICAgIGF4Ci0laWRlZmluZSBfYnggICAgYngKLSVpZGVmaW5lIF9jeCAgICBjeAotJWlkZWZpbmUgX2R4ICAgIGR4Ci0laWRlZmluZSBfc2kgICAgc2kKLSVpZGVmaW5lIF9kaSAgICBkaQotJWlkZWZpbmUgX2JwICAgIGJwCi0laWRlZmluZSBfc3AgICAgc3AKLSVpZGVmaW5lIF9lcyAgICBlczoKLSVpZGVmaW5lIFVDSEFSICBCWVRFICAgICAgICA7IFNpemUgb2YgYSBjaGFyYWN0ZXIKLSVpZGVmaW5lIFVTSE9SVCBXT1JEICAgICAgICA7IFNpemUgb2YgYSBzaG9ydAotJWlkZWZpbmUgVUlOVCAgIFdPUkQgICAgICAgIDsgU2l6ZSBvZiBhbiBpbnRlZ2VyCi0laWRlZmluZSBVTE9ORyAgRFdPUkQgICAgICAgOyBTaXplIG9mIGEgbG9uZwotJWlkZWZpbmUgQk9PTCAgIFdPUkQgICAgICAgIDsgU2l6ZSBvZiBhIGJvb2xlYW4KLSVpZGVmaW5lIERQVFIgICBEV09SRCAgICAgICA7IFNpemUgb2YgYSBkYXRhIHBvaW50ZXIKLSVpZGVmaW5lIEZEUFRSICBEV09SRCAgICAgICA7IFNpemUgb2YgYSBmYXIgZGF0YSBwb2ludGVyCi0laWRlZmluZSBORFBUUiAgV09SRCAgICAgICAgOyBTaXplIG9mIGEgbmVhciBkYXRhIHBvaW50ZXIKLSVpZGVmaW5lIENQVFIgICBEV09SRCAgICAgICA7IFNpemUgb2YgYSBjb2RlIHBvaW50ZXIKLSVpZGVmaW5lIEZDUFRSICBEV09SRCAgICAgICA7IFNpemUgb2YgYSBmYXIgY29kZSBwb2ludGVyCi0laWRlZmluZSBOQ1BUUiAgV09SRCAgICAgICAgOyBTaXplIG9mIGEgbmVhciBjb2RlIHBvaW50ZXIKLSVpZGVmaW5lIEZQVFIgICBGQVIgICAgICAgICA7IERpc3RhbmNlIGZvciBmdW5jdGlvbiBwb2ludGVycwotJWlkZWZpbmUgRFVJTlQgIGR3ICAgICAgICAgIDsgRGVjbGFyZSBhIGludGVnZXIgdmFyaWFibGUKLSVpZGVmaW5lIGludHNpemUgMgotJWVuZGlmCi0laWRlZmluZSBpbnZlcnQgfgotJWlkZWZpbmUgb2Zmc2V0Ci0laWRlZmluZSB1c2VfbmFzbQotCi07IENvbnZlcnQgYWxsIGp1bXBzIHRvIG5lYXIganVtcHMsIHNpbmNlIE5BU00gZG9lcyBub3Qgc28gdGhpcyBhdXRvbWF0aWNhbGx5Ci0KLSVpZGVmaW5lIGpvICAgICBqbyBuZWFyCi0laWRlZmluZSBqbm8gICAgam5vIG5lYXIKLSVpZGVmaW5lIGp6ICAgICBqeiBuZWFyCi0laWRlZmluZSBqbnogICAgam56IG5lYXIKLSVpZGVmaW5lIGplICAgICBqZSBuZWFyCi0laWRlZmluZSBqbmUgICAgam5lIG5lYXIKLSVpZGVmaW5lIGpiICAgICBqYiAgbmVhcgotJWlkZWZpbmUgamJlICAgIGpiZSBuZWFyCi0laWRlZmluZSBqYSAgICAgamEgIG5lYXIKLSVpZGVmaW5lIGphZSAgICBqYWUgbmVhcgotJWlkZWZpbmUgamwgICAgIGpsICBuZWFyCi0laWRlZmluZSBqbGUgICAgamxlIG5lYXIKLSVpZGVmaW5lIGpnICAgICBqZyAgbmVhcgotJWlkZWZpbmUgamdlICAgIGpnZSBuZWFyCi0laWRlZmluZSBqYyAgICAgamMgIG5lYXIKLSVpZGVmaW5lIGpuYyAgICBqbmMgbmVhcgotJWlkZWZpbmUganMgICAgIGpzICBuZWFyCi0laWRlZmluZSBqbnMgICAgam5zIG5lYXIKLQotJWlmZGVmICBET1VCTEUKLSVpZGVmaW5lICAgIFJFQUwgICAgUVdPUkQKLSVpZGVmaW5lICAgIERSRUFMICAgZHEKLSVlbHNlCi0laWRlZmluZSAgICBSRUFMICAgIERXT1JECi0laWRlZmluZSAgICBEUkVBTCAgIGRkCi0lZW5kaWYKLQotOyBCb29sZWFuIHRydXRoIHZhbHVlcyAoc2FtZSBhcyB0aG9zZSBpbiBkZWJ1Zy5oKQotCi0laWRlZmluZSBGYWxzZSAgICAgIDAKLSVpZGVmaW5lIFRydWUgICAgICAgMQotJWlkZWZpbmUgTm8gICAgICAgICAwCi0laWRlZmluZSBZZXMgICAgICAgIDEKLSVpZGVmaW5lIFllcyAgICAgICAgMQotCi07IE1hY3JvIHRvIGJlIGludm9rZWQgYXQgdGhlIHN0YXJ0IG9mIGFsbCBtb2R1bGVzIHRvIHNldCB1cCBzZWdtZW50cyBmb3IKLTsgbGF0ZXIgdXNlLiBEb2VzIG5vdGhpbmcgZm9yIE5BU00uCi0KLSVpbWFjcm8gaGVhZGVyIDEKLSVlbmRtYWNybwotCi07IE1hY3JvIHRvIGJlZ2luIGEgZGF0YSBzZWdtZW50Ci0KLSVpbWFjcm8gYmVnZGF0YXNlZyAxCi0laWZkZWYgX19HTlVDX18KLXNlZ21lbnQgLmRhdGEgcHVibGljIGNsYXNzPURBVEEgdXNlMzIgZmxhdAotJWVsc2UKLSVpZmRlZiBmbGF0bW9kZWwKLXNlZ21lbnQgX0RBVEEgcHVibGljIGFsaWduPTQgY2xhc3M9REFUQSB1c2UzMiBmbGF0Ci0lZWxzZQotc2VnbWVudCBfREFUQSBwdWJsaWMgYWxpZ249NCBjbGFzcz1EQVRBIHVzZTE2Ci0lZW5kaWYKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTWFjcm8gdG8gZW5kIGEgZGF0YSBzZWdtZW50Ci0KLSVpbWFjcm8gZW5kZGF0YXNlZyAxCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBiZWdpbiBhIGNvZGUgc2VnbWVudAotCi0laW1hY3JvIGJlZ2NvZGVzZWcgMQotJWlmZGVmIF9fUElDX18KLSVpZmRlZiBfX0xJTlVYX18KLSAgICAgICAgZXh0ZXJuIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXwotJWVsc2UKLSAgICAgICAgZXh0ZXJuIF9fR0xPQkFMX09GRlNFVF9UQUJMRV8KLSVlbmRpZgotJWVuZGlmCi0laWZkZWYgX19HTlVDX18KLXNlZ21lbnQgLnRleHQgcHVibGljIGNsYXNzPUNPREUgdXNlMzIgZmxhdAotJWVsc2UKLSVpZmRlZiBmbGF0bW9kZWwKLXNlZ21lbnQgX1RFWFQgcHVibGljIGFsaWduPTE2IGNsYXNzPUNPREUgdXNlMzIgZmxhdAotJWVsc2UKLXNlZ21lbnQgJTFfVEVYVCBwdWJsaWMgYWxpZ249MTYgY2xhc3M9Q09ERSB1c2UxNgotJWVuZGlmCi0lZW5kaWYKLSVlbmRtYWNybwotCi07IE1hY3JvIHRvIGJlZ2luIGEgbmVhciBjb2RlIHNlZ21lbnQKLQotJWltYWNybyBiZWdjb2Rlc2VnX25lYXIgMAotJWlmZGVmIF9fR05VQ19fCi1zZWdtZW50IC50ZXh0IHB1YmxpYyBjbGFzcz1DT0RFIHVzZTMyIGZsYXQKLSVlbHNlCi0laWZkZWYgZmxhdG1vZGVsCi1zZWdtZW50IF9URVhUIHB1YmxpYyBhbGlnbj0xNiBjbGFzcz1DT0RFIHVzZTMyIGZsYXQKLSVlbHNlCi1zZWdtZW50IF9URVhUIHB1YmxpYyBhbGlnbj0xNiBjbGFzcz1DT0RFIHVzZTE2Ci0lZW5kaWYKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTWFjcm8gdG8gZW5kIGEgY29kZSBzZWdtZW50Ci0KLSVpbWFjcm8gZW5kY29kZXNlZyAxCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBlbmQgYSBuZWFyIGNvZGUgc2VnbWVudAotCi0laW1hY3JvIGVuZGNvZGVzZWdfbmVhciAwCi0lZW5kbWFjcm8KLQotOyBNYWNybyBmb3IgYW4gZXh0ZXJuIEMgc3ltYm9sLiBJZiB0aGUgQyBjb21waWxlciByZXF1aXJlcyBsZWFkaW5nCi07IHVuZGVyc2NvcmVzLCB0aGVuIHRoZSB1bmRlcnNjb3JlcyBhcmUgYWRkZWQgdG8gdGhlIHN5bWJvbCBuYW1lcywgb3RoZXJ3aXNlCi07IHRoZXkgYXJlIGxlZnQgb2ZmLiBUaGUgc3ltYm9sIG5hbWUgaXMgcmVmZXJlbmNlZCBpbiB0aGUgYXNzZW1ibGVyIGNvZGUKLTsgdXNpbmcgdGhlIG5vbi11bmRlcnNjb3JlZCBzeW1ib2wgbmFtZS4KLQotJWltYWNybyBjZXh0ZXJuIDIKLSVpZmRlZiAgX19OT1VfVkFSX18KLWV4dGVybiAlMQotJWVsc2UKLWV4dGVybiBfJTEKLSVkZWZpbmUgJTEgXyUxCi0lZW5kaWYKLSVlbmRtYWNybwotCi0laW1hY3JvIGNleHRlcm5mdW5jIDIKLSVpZmRlZiAgX19OT1VfXwotZXh0ZXJuICUxCi0lZWxzZQotZXh0ZXJuIF8lMQotJWRlZmluZSAlMSBfJTEKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTWFjcm8gZm9yIGEgcHVibGljIEMgc3ltYm9sLiBJZiB0aGUgQyBjb21waWxlciByZXF1aXJlcyBsZWFkaW5nCi07IHVuZGVyc2NvcmVzLCB0aGVuIHRoZSB1bmRlcnNjb3JlcyBhcmUgYWRkZWQgdG8gdGhlIHN5bWJvbCBuYW1lcywgb3RoZXJ3aXNlCi07IHRoZXkgYXJlIGxlZnQgb2ZmLiBUaGUgc3ltYm9sIG5hbWUgaXMgcmVmZXJlbmNlZCBpbiB0aGUgYXNzZW1ibGVyIGNvZGUKLTsgdXNpbmcgdGhlIG5vbi11bmRlcnNjb3JlZCBzeW1ib2wgbmFtZS4KLQotJWltYWNybyBjcHVibGljIDEKLSVpZmRlZiAgX19OT1VfVkFSX18KLWdsb2JhbCAlMQotJTE6Ci0lZWxzZQotZ2xvYmFsIF8lMQotXyUxOgotJWRlZmluZSAlMSBfJTEKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTWFjcm8gZm9yIGFuIGdsb2JhbCBDIHN5bWJvbC4gSWYgdGhlIEMgY29tcGlsZXIgcmVxdWlyZXMgbGVhZGluZwotOyB1bmRlcnNjb3JlcywgdGhlbiB0aGUgdW5kZXJzY29yZXMgYXJlIGFkZGVkIHRvIHRoZSBzeW1ib2wgbmFtZXMsIG90aGVyd2lzZQotOyB0aGV5IGFyZSBsZWZ0IG9mZi4gVGhlIHN5bWJvbCBuYW1lIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGFzc2VtYmxlciBjb2RlCi07IHVzaW5nIHRoZSBub24tdW5kZXJzY29yZWQgc3ltYm9sIG5hbWUuCi0KLSVpbWFjcm8gY2dsb2JhbCAxCi0laWZkZWYgIF9fTk9VX1ZBUl9fCi1nbG9iYWwgJTEKLSVlbHNlCi1nbG9iYWwgXyUxCi0lZGVmaW5lICUxIF8lMQotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNybyBmb3IgYW4gZ2xvYmFsIEMgZnVuY3Rpb24gc3ltYm9sLiBJZiB0aGUgQyBjb21waWxlciByZXF1aXJlcyBsZWFkaW5nCi07IHVuZGVyc2NvcmVzLCB0aGVuIHRoZSB1bmRlcnNjb3JlcyBhcmUgYWRkZWQgdG8gdGhlIHN5bWJvbCBuYW1lcywgb3RoZXJ3aXNlCi07IHRoZXkgYXJlIGxlZnQgb2ZmLiBUaGUgc3ltYm9sIG5hbWUgaXMgcmVmZXJlbmNlZCBpbiB0aGUgYXNzZW1ibGVyIGNvZGUKLTsgdXNpbmcgdGhlIG5vbi11bmRlcnNjb3JlZCBzeW1ib2wgbmFtZS4KLQotJWltYWNybyBjZ2xvYmFsZnVuYyAxCi0laWZkZWYgX19QSUNfXwotZ2xvYmFsICUxOmZ1bmN0aW9uCi0lZWxzZQotJWlmZGVmICBfX05PVV9fCi1nbG9iYWwgJTEKLSVlbHNlCi1nbG9iYWwgXyUxCi0lZGVmaW5lICUxIF8lMQotJWVuZGlmCi0lZW5kaWYKLSVlbmRtYWNybwotCi07IE1hY3JvIHRvIHN0YXJ0IGEgQyBjYWxsYWJsZSBmdW5jdGlvbi4gVGhpcyB3aWxsIGJlIGEgZmFyIGZ1bmN0aW9uIGZvcgotOyAxNi1iaXQgY29kZSwgYW5kIGEgbmVhciBmdW5jdGlvbiBmb3IgMzItYml0IGNvZGUuCi0KLSVpbWFjcm8gY3Byb2NzdGF0aWMgMQotJXB1c2ggY3Byb2MKLSUxOgotJWlmZGVmIGZsYXRtb2RlbAotJXN0YWNrc2l6ZSBmbGF0Ci0lZGVmaW5lIHJldCByZXRuCi0lZWxzZQotJXN0YWNrc2l6ZSBsYXJnZQotJWRlZmluZSByZXQgcmV0ZgotJWVuZGlmCi0lYXNzaWduICUkbG9jYWxzaXplIDAKLSVlbmRtYWNybwotCi0laW1hY3JvIGNwcm9jc3RhcnQgMQotJXB1c2ggY3Byb2MKLSAgICBjZ2xvYmFsZnVuYyAlMQotJTE6Ci0laWZkZWYgZmxhdG1vZGVsCi0lc3RhY2tzaXplIGZsYXQKLSVkZWZpbmUgcmV0IHJldG4KLSVlbHNlCi0lc3RhY2tzaXplIGxhcmdlCi0lZGVmaW5lIHJldCByZXRmCi0lZW5kaWYKLSVhc3NpZ24gJSRsb2NhbHNpemUgMAotJWVuZG1hY3JvCi0KLTsgVGhpcyBtYWNybyBzZXRzIHVwIGEgcHJvY2VkdXJlIHRvIGJlIGV4cG9ydGVkIGZyb20gYSAxNiBiaXQgRExMLiBTaW5jZSB0aGUKLTsgY2FsbGluZyBjb252ZW50aW9ucyBhcmUgYWx3YXlzIF9mYXIgX3Bhc2NhbCBmb3IgMTYgYml0IERMTCdzLCB3ZSBhY3R1YWxseQotOyByZW5hbWUgdGhpcyByb3V0aW5lIHdpdGggYW4gZXh0cmEgdW5kZXJzY29yZSB3aXRoICdDJyBjYWxsaW5nIGNvbnZlbnRpb25zCi07IGFuZCBhIHNtYWxsIERMTCBzdHViIHdpbGwgYmUgcHJvdmlkZWQgYnkgdGhlIGhpZ2ggbGV2ZWwgY29kZSB0byBjYWxsIHRoZQotOyBhc3NlbWJsZXIgcm91dGluZS4KLQotJWltYWNybyBjcHJvY3N0YXJ0ZGxsMTYgMQotJWlmZGVmICBfX1dJTkRPV1MxNl9fCi1jcHJvY3N0YXJ0ICBfJTEKLSVlbHNlCi1jcHJvY3N0YXJ0ICAlMQotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBzdGFydCBhIEMgY2FsbGFibGUgbmVhciBmdW5jdGlvbi4KLQotJWltYWNybyBjcHJvY25lYXIgMQotJXB1c2ggY3Byb2MKLSAgICBjZ2xvYmFsZnVuYyAlMQotJTE6Ci0lZGVmaW5lIHJldCByZXRuCi0laWZkZWYgZmxhdG1vZGVsCi0lc3RhY2tzaXplIGZsYXQKLSVlbHNlCi0lc3RhY2tzaXplIHNtYWxsCi0lZW5kaWYKLSVhc3NpZ24gJSRsb2NhbHNpemUgMAotJWVuZG1hY3JvCi0KLTsgTWFjcm8gdG8gc3RhcnQgYSBDIGNhbGxhYmxlIGZhciBmdW5jdGlvbi4KLQotJWltYWNybyBjcHJvY2ZhciAxCi0lcHVzaCBjcHJvYwotICAgIGNnbG9iYWxmdW5jICUxCi0lMToKLSVkZWZpbmUgcmV0IHJldGYKLSVpZmRlZiBmbGF0bW9kZWwKLSVzdGFja3NpemUgZmxhdAotJWVsc2UKLSVzdGFja3NpemUgbGFyZ2UKLSVlbmRpZgotJWFzc2lnbiAlJGxvY2Fsc2l6ZSAwCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBlbmQgYSBDIGZ1bmN0aW9uCi0KLSVpbWFjcm8gY3Byb2NlbmQgMAotJXBvcAotJWVuZG1hY3JvCi0KLTsgTWFjcm9zIGZvciBlbnRlcmluZyBhbmQgZXhpdGluZyBDIGNhbGxhYmxlIGZ1bmN0aW9ucy4gTm90ZSB0aGF0IHdlIG11c3QKLTsgYWx3YXlzIHNhdmUgYW5kIHJlc3RvcmUgdGhlIFNJIGFuZCBESSByZWdpc3RlcnMgZm9yIEMgZnVuY3Rpb25zLCBhbmQgZm9yCi07IDMyIGJpdCBDIGZ1bmN0aW9ucyB3ZSBhbHNvIG5lZWQgdG8gc2F2ZSBhbmQgcmVzdG9yZSBFQlggYW5kIGNsZWFyIHRoZQotOyBkaXJlY3Rpb24gZmxhZy4KLQotJWltYWNybyBlbnRlcl9jIDAKLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0laWZuaWRuICUkbG9jYWxzaXplLDAKLSAgICAgICAgc3ViICAgICBfc3AsJSRsb2NhbHNpemUKLSVlbmRpZgotJWlmZGVmICBmbGF0bW9kZWwKLSAgICAgICAgcHVzaCAgICBlYngKLSVlbmRpZgotICAgICAgICBwdXNoICAgIF9zaQotICAgICAgICBwdXNoICAgIF9kaQotJWVuZG1hY3JvCi0KLSVpbWFjcm8gbGVhdmVfYyAwCi0gICAgICAgIHBvcCAgICAgX2RpCi0gICAgICAgIHBvcCAgICAgX3NpCi0laWZkZWYgIGZsYXRtb2RlbAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBjbGQKLSVlbmRpZgotJWlmbmlkbiAlJGxvY2Fsc2l6ZSwwCi0gICAgICAgIG1vdiAgICAgX3NwLF9icAotJWVuZGlmCi0gICAgICAgIHBvcCAgICAgX2JwCi0lZW5kbWFjcm8KLQotJWltYWNybyAgIHVzZV9lYnggMAotJWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBwdXNoICAgIGVieAotJWVuZGlmCi0lZW5kbWFjcm8KLQotJWltYWNybyAgIHVudXNlX2VieCAwCi0laWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIHBvcCAgICAgZWJ4Ci0lZW5kaWYKLSVlbmRtYWNybwotCi07IE1hY3JvcyBmb3Igc2F2aW5nIGFuZCByZXN0b3JpbmcgdGhlIHZhbHVlIG9mIERTLEVTLEZTLEdTIHdoZW4gaXQgaXMgdG8KLTsgYmUgdXNlZCBpbiBhc3NlbWJseSByb3V0aW5lcy4gVGhpcyBldmFsdWF0ZXMgdG8gbm90aGluZyBpbiB0aGUgZmxhdCBtZW1vcnkKLTsgbW9kZWwsIGJ1dCBpcyBzYXZlcyBhbmQgcmVzdG9yZXMgRFMgaW4gdGhlIGxhcmdlIG1lbW9yeSBtb2RlbC4KLQotJWltYWNybyB1c2VfZHMgMAotJWlmbmRlZiBmbGF0bW9kZWwKLSAgICAgICAgcHVzaCAgICBkcwotJWVuZGlmCi0lZW5kbWFjcm8KLQotJWltYWNybyB1bnVzZV9kcyAwCi0laWZuZGVmIGZsYXRtb2RlbAotICAgICAgICBwb3AgICAgIGRzCi0lZW5kaWYKLSVlbmRtYWNybwotCi0laW1hY3JvIHVzZV9lcyAwCi0laWZuZGVmIGZsYXRtb2RlbAotICAgICAgICBwdXNoICAgIGVzCi0lZW5kaWYKLSVlbmRtYWNybwotCi0laW1hY3JvIHVudXNlX2VzIDAKLSVpZm5kZWYgZmxhdG1vZGVsCi0gICAgICAgIHBvcCAgICAgZXMKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTWFjcm9zIGZvciBsb2FkaW5nIHRoZSBhZGRyZXNzIG9mIGEgZGF0YSBwb2ludGVyIGludG8gYSBzZWdtZW50IGFuZAotOyBpbmRleCByZWdpc3RlciBwYWlyLiBUaGUgJWltYWNybyBleHBsaWNpdGx5IGxvYWRzIERTIG9yIEVTIGluIHRoZSAxNiBiaXQKLTsgbWVtb3J5IG1vZGVsLCBvciBpdCBzaW1wbHkgbG9hZHMgdGhlIG9mZnNldCBpbnRvIHRoZSByZWdpc3RlciBpbiB0aGUgZmxhdAotOyBtZW1vcnkgbW9kZWwgc2luY2UgRFMgYW5kIEVTIGFsd2F5cyBwb2ludCB0byBhbGwgYWRkcmVzc2FibGUgbWVtb3J5LiBZb3UKLTsgbXVzdCB1c2UgdGhlIGNvcnJlY3QgX1JFRyAoaWU6IF9CWCkgJWltYWNyb3MgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMuCi0KLSVpbWFjcm8gX2xkcyAgICAyCi0laWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgJTEsJTIKLSVlbHNlCi0gICAgICAgIGxkcyAgICAgJTEsJTIKLSVlbmRpZgotJWVuZG1hY3JvCi0KLSVpbWFjcm8gICBfbGVzICAyCi0laWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgJTEsJTIKLSVlbHNlCi0gICAgICAgIGxlcyAgICAgJTEsJTIKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTWFjcm9zIGZvciBhZGRpbmcgYW5kIHN1YnRyYWN0aW5nIGEgdmFsdWUgZnJvbSByZWdpc3RlcnMuIFR3byB2YWx1ZSBhcmUKLTsgcHJvdmlkZWQsIG9uZSBmb3IgMTYgYml0IG1vZGVzIGFuZCBhbm90aGVyIGZvciAzMiBiaXQgbW9kZXMgKHRoZSBleHRlbmRlZAotOyByZWdpc3RlciBpcyB1c2VkIGluIDMyIGJpdCBtb2RlcykuCi0KLSVpbWFjcm8gICBfYWRkICAzCi0laWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIGFkZCAgICAgZSUxLCAlMwotJWVsc2UKLSAgICAgICAgYWRkICAgICAlMSwgJTIKLSVlbmRpZgotJWVuZG1hY3JvCi0KLSVpbWFjcm8gX3N1YiAgICAzCi0laWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIHN1YiAgICAgZSUxLCAlMwotJWVsc2UKLSAgICAgICAgc3ViICAgICAlMSwgJTIKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTWFjcm8gdG8gY2xlYXIgdGhlIGhpZ2ggb3JkZXIgd29yZCBmb3IgdGhlIDMyIGJpdCBleHRlbmRlZCByZWdpc3RlcnMuCi07IFRoaXMgaXMgdXNlZCB0byBjb252ZXJ0IGFuIHVuc2lnbmVkIDE2IGJpdCB2YWx1ZSB0byBhbiB1bnNpZ25lZCAzMiBiaXQKLTsgdmFsdWUsIGFuZCB3aWxsIGV2YWx1YXRlIHRvIG5vdGhpbmcgaW4gMTYgYml0IG1vZGVzLgotCi0laW1hY3JvIGNscmhpICAgMQotJWlmZGVmICBmbGF0bW9kZWwKLSAgICAgICAgbW92enggICBlJTEsJTEKLSVlbmRpZgotJWVuZG1hY3JvCi0KLSVpbWFjcm8gc2duaGkgICAxCi0laWZkZWYgIGZsYXRtb2RlbAotICAgICAgICBtb3ZzeCAgIGUlMSwlMQotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBsb2FkIGFuIGV4dGVuZGVkIHJlZ2lzdGVyIHdpdGggYW4gaW50ZWdlciB2YWx1ZSBpbiBlaXRoZXIgbW9kZQotCi0laW1hY3JvIGxvYWRpbnQgMgotJWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIGUlMSwlMgotJWVsc2UKLSAgICAgICAgeG9yICAgICBlJTEsZSUxCi0gICAgICAgIG1vdiAgICAgJTEsJTIKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTWFjcm9zIHRvIGxvYWQgYW5kIHN0b3JlIGludGVnZXIgdmFsdWVzIHdpdGggc3RyaW5nIGluc3RydWN0aW9ucwotCi0laW1hY3JvIExPRFNJTlQgMAotJWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBsb2RzZAotJWVsc2UKLSAgICAgICAgbG9kc3cKLSVlbmRpZgotJWVuZG1hY3JvCi0KLSVpbWFjcm8gU1RPU0lOVCAwCi0laWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIHN0b3NkCi0lZWxzZQotICAgICAgICBzdG9zdwotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNyb3MgdG8gcHJvdmlkZSByZXNiLCByZXN3LCByZXNkIGNvbXBhdGliaWxpdHkgd2l0aCBOQVNNCi0KLSVpbWFjcm8gZGNsYiAxCi10aW1lcyAlMSBkYiAwCi0lZW5kbWFjcm8KLQotJWltYWNybyBkY2x3IDEKLXRpbWVzICUxIGR3IDAKLSVlbmRtYWNybwotCi0laW1hY3JvIGRjbGQgMQotdGltZXMgJTEgZGQgMAotJWVuZG1hY3JvCi0KLTsgTWFjcm8gdG8gZ2V0IHRoZSBhZGRyZXMgb2YgdGhlIEdPVCBmb3IgTGludXgvRnJlZUJTRCBzaGFyZWQKLTsgbGlicmFyaWVzIGludG8gdGhlIEVCWCByZWdpc3Rlci4KLQotJWltYWNybyAgICAgZ2V0X0dPVCAxCi0gICAgICAgICAgICBjYWxsICAgICUlZ2V0Z290Ci0lJWdldGdvdDogICBwb3AgICAgICUxCi0gICAgICAgICAgICBhZGQgICAgICUxLF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyskJC0lJWdldGdvdCB3cnQgLi5nb3RwYwotJWVuZG1hY3JvCi0KLTsgTWFjcm8gdG8gZ2V0IHRoZSBhZGRyZXNzIG9mIGEgKmxvY2FsKiB2YXJpYWJsZSB0aGF0IGlzIGdsb2JhbCB0bwotOyBhIHNpbmdsZSBtb2R1bGUgaW4gYSBtYW5uZXIgdGhhdCB3aWxsIHdvcmsgY29ycmVjdGx5IHdoZW4gY29tcGlsZWQKLTsgaW50byBhIExpbnV4IHNoYXJlZCBsaWJyYXJ5LiBOb3RlIHRoYXQgdGhpcyB3aWxsICpub3QqIHdvcmsgZm9yCi07IHZhcmlhYmxlcyB0aGF0IGFyZSBkZWZpbmVkIGFzIGdsb2JhbCB0byBhbGwgbW9kdWxlcy4gRm9yIHRoYXQKLTsgdXNlIHRoZSBMRUFfRyBtYWNybwotCi0lbWFjcm8gICAgICBMRUFfTCAgICAyCi0laWZkZWYgX19QSUNfXwotICAgICAgICBnZXRfR09UICUxCi0gICAgICAgIGxlYSAgICAgJTEsWyUxKyUyIHdydCAuLmdvdG9mZl0KLSVlbHNlCi0gICAgICAgIGxlYSAgICAgJTEsWyUyXQotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBTYW1lIG1hY3JvIGFzIGFib3ZlIGJ1dCBmb3IgZ2xvYmFsIHZhcmlhYmxlcyBwdWJsaWMgdG8gKmFsbCoKLTsgbW9kdWxlcy4KLQotJW1hY3JvICAgICAgTEVBX0cgICAgMgotJWlmZGVmIF9fUElDX18KLSAgICAgICAgZ2V0X0dPVCAlMQotICAgICAgICBtb3YgICAgICUxLFslMSslMiB3cnQgLi5nb3RdCi0lZWxzZQotICAgICAgICBsZWEgICAgICUxLFslMl0KLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgbWFjcm9zIHRvIGRlY2xhcmUgYXNzZW1ibGVyIGZ1bmN0aW9uIHN0dWJzIGZvciBmdW5jdGlvbiBzdHJ1Y3R1cmVzCi0KLSVpbWFjcm8gQkVHSU5fU1RVQlNfREVGIDIKLWJlZ2RhdGFzZWcgIF9TVFVCUwotJWlmZGVmICBfX05PVV9WQVJfXwotZXh0ZXJuICUxCi0lZGVmaW5lIFNUVUJTX1NUQVJUICUxCi0lZWxzZQotZXh0ZXJuIF8lMQotJWRlZmluZSBTVFVCU19TVEFSVCBfJTEKLSVlbmRpZgotZW5kZGF0YXNlZyAgX1NUVUJTCi1iZWdjb2Rlc2VnICBfU1RVQlMKLSVhc3NpZ24gb2ZmICUyCi0lZW5kbWFjcm8KLQotJWltYWNybyAgIERFQ0xBUkVfU1RVQiAgMQotJWlmZGVmIF9fUElDX18KLSAgICAgICAgZ2xvYmFsICUxOmZ1bmN0aW9uCi0lMToKLSAgICAgICAgZ2V0X0dPVCBlYXgKLSAgICAgICAgbW92ICAgICBlYXgsW2VheCtTVFVCU19TVEFSVCB3cnQgLi5nb3RdCi0gICAgICAgIGptcCAgICAgW2VheCtvZmZdCi0lZWxzZQotJWlmZGVmICBfX05PVV9fCi0gICAgICAgIGdsb2JhbCAlMQotJTE6Ci0lZWxzZQotICAgICAgICBnbG9iYWwgXyUxCi1fJTE6Ci0lZW5kaWYKLSAgICAgICAgam1wICAgICBbRFdPUkQgU1RVQlNfU1RBUlQrb2ZmXQotJWVuZGlmCi0lYXNzaWduIG9mZiBvZmYrNAotJWVuZG1hY3JvCi0KLSVpbWFjcm8gICBTS0lQX1NUVUIgIDEKLSVhc3NpZ24gb2ZmIG9mZis0Ci0lZW5kbWFjcm8KLQotJWltYWNybyBERUNMQVJFX1NURENBTEwgMgotJWlmZGVmICBTVERDQUxMX01BTkdMRQotICAgICAgICBnbG9iYWwgXyUxQCUyCi1fJTFAJTI6Ci0lZWxzZQotJWlmZGVmIFNURENBTExfVVNDT1JFCi0gICAgICAgIGdsb2JhbCBfJTEKLV8lMToKLSVlbHNlCi0gICAgICAgIGdsb2JhbCAlMQotJTE6Ci0lZW5kaWYKLSVlbmRpZgotICAgICAgICBqbXAgICAgIFtEV09SRCBTVFVCU19TVEFSVCtvZmZdCi0lYXNzaWduIG9mZiBvZmYrNAotJWVuZG1hY3JvCi0KLSVpbWFjcm8gICBFTkRfU1RVQlNfREVGIDAKLWVuZGNvZGVzZWcgIF9TVFVCUwotJWVuZG1hY3JvCi0KLTsgbWFjcm9zIHRvIGRlY2xhcmUgYXNzZW1ibGVyIGltcG9ydCBzdHVicyBmb3IgYmluYXJ5IGxvYWRhYmxlIGRyaXZlcnMKLQotJWltYWNybyBCRUdJTl9JTVBPUlRTX0RFRiAgIDEKLUJFR0lOX1NUVUJTX0RFRiAlMSw0Ci0lZW5kbWFjcm8KLQotJWltYWNybyAgIERFQ0xBUkVfSU1QICAgMgotREVDTEFSRV9TVFVCICAgICUxCi0lZW5kbWFjcm8KLQotJWltYWNybyAgIFNLSVBfSU1QICAgMgotU0tJUF9TVFVCICAgICUxCi0lZW5kbWFjcm8KLQotJWltYWNybyAgIFNLSVBfSU1QMiAgIDEKLURFQ0xBUkVfU1RVQiAgICAlMQotJWVuZG1hY3JvCi0KLSVpbWFjcm8gICBTS0lQX0lNUDMgICAxCi1TS0lQX1NUVUIgICAgJTEKLSVlbmRtYWNybwotCi0laW1hY3JvICAgRU5EX0lNUE9SVFNfREVGIDAKLUVORF9TVFVCU19ERUYKLSVlbmRtYWNybwotCi1lbHNlICAgIDsgX19OQVNNX01BSk9SX18KLQotOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsgTWFjcm8gcGFja2FnZSB3aGVuIGNvbXBpbGluZyB3aXRoIFRBU00uCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi07IFR1cm4gb2ZmIHVuZGVyc2NvcmVzIGZvciBnbG9iYWxzIGlmIGRpc2FibGVkIGZvciBhbGwgZXh0ZXJuYWxzCi0KLWlmZGVmICAgX19OT1VfXwotX19OT1VfVkFSX18gICAgICAgICA9IDEKLWVuZGlmCi0KLTsgRGVmaW5lIHRoZSBfX1dJTkRPV1NfXyBzeW1ib2wgaWYgd2UgYXJlIGNvbXBpbGluZyBmb3IgYW55IFdpbmRvd3MKLTsgZW52aXJvbm1lbnQKLQotaWZkZWYgICBfX1dJTkRPV1MxNl9fCi1fX1dJTkRPV1NfXyAgICAgICAgID0gMQotZW5kaWYKLWlmZGVmICAgX19XSU5ET1dTMzJfXwotX19XSU5ET1dTX18gICAgICAgICA9IDEKLV9fV0lORE9XUzMyXzM4Nl9fICAgPSAxCi1lbmRpZgotaWZkZWYgICBfX1dJTjM4Nl9fCi1fX1dJTkRPV1NfXyAgICAgICAgID0gMQotX19XSU5ET1dTMzJfMzg2X18gICA9IDEKLWVuZGlmCi1pZmRlZiAgIF9fVlhEX18KLV9fV0lORE9XU19fICAgICAgICAgPSAxCi1fX1dJTkRPV1MzMl8zODZfXyAgID0gMQotICAgICAgICBNQVNNCi0gICAgICAgIC4zODYKLSAgICAgICAgTk9fU0VHTUVOVFMgPSAxCi0gICAgICAgIGluY2x1ZGUgdm1tLmluYyAgICAgICAgIDsgSUdOT1JFIERFUEVORAotICAgICAgICBpbmNsdWRlIHZzZWdtZW50LmluYyAgICA7IElHTk9SRSBERVBFTkQKLSAgICAgICAgSURFQUwKLWVuZGlmCi0KLTsgTWFjcm9zIGZvciBhY2Nlc3NpbmcgJ2dlbmVyaWMnIHJlZ2lzdGVycwotCi1pZmRlZiAgIF9fRkxBVF9fCi0gICAgICAgIF9heCAgICAgICAgIEVRVSBlYXggICAgIDsgRUFYIGlzIHVzZWQgZm9yIGFjY3VtdWxhdG9yCi0gICAgICAgIF9ieCAgICAgICAgIEVRVSBlYnggICAgIDsgRUJYIGlzIHVzZWQgZm9yIGFjY3VtdWxhdG9yCi0gICAgICAgIF9jeCAgICAgICAgIEVRVSBlY3ggICAgIDsgRUNYIGlzIHVzZWQgZm9yIGxvb3BpbmcKLSAgICAgICAgX2R4ICAgICAgICAgRVFVIGVkeCAgICAgOyBFRFggaXMgdXNlZCBmb3IgZGF0YSByZWdpc3RlcgotICAgICAgICBfc2kgICAgICAgICBFUVUgZXNpICAgICA7IEVTSSBpcyB0aGUgc291cmNlIGluZGV4IHJlZ2lzdGVyCi0gICAgICAgIF9kaSAgICAgICAgIEVRVSBlZGkgICAgIDsgRURJIGlzIHRoZSBkZXN0aW5hdGlvbiBpbmRleCByZWdpc3RlcgotICAgICAgICBfYnAgICAgICAgICBFUVUgZWJwICAgICA7IEVCUCBpcyB1c2VkIGZvciBiYXNlIHBvaW50ZXIgcmVnaXN0ZXIKLSAgICAgICAgX3NwICAgICAgICAgRVFVIGVzcCAgICAgOyBFU1AgaXMgdXNlZCBmb3Igc3RhY2sgcG9pbnRlciByZWdpc3RlcgotICAgICAgICBfZXMgICAgICAgICBFUVUgICAgICAgICA7IEVTIGFuZCBEUyBhcmUgdGhlIHNhbWUgaW4gMzIgYml0IFBNCi0gICAgICAgIHR5cGVkZWYgVUNIQVIgQllURSAgICAgIDsgU2l6ZSBvZiBhIGNoYXJhY3RlcgotICAgICAgICB0eXBlZGVmIFVTSE9SVCBXT1JEICAgICA7IFNpemUgb2YgYSBzaG9ydAotICAgICAgICB0eXBlZGVmIFVJTlQgRFdPUkQgICAgICA7IFNpemUgb2YgYW4gaW50ZWdlcgotICAgICAgICB0eXBlZGVmIFVMT05HIERXT1JEICAgICA7IFNpemUgb2YgYSBsb25nCi0gICAgICAgIHR5cGVkZWYgQk9PTCBEV09SRCAgICAgIDsgU2l6ZSBvZiBhIGJvb2xlYW4KLSAgICAgICAgdHlwZWRlZiBEUFRSIERXT1JEICAgICAgOyBTaXplIG9mIGEgZGF0YSBwb2ludGVyCi0gICAgICAgIHR5cGVkZWYgRkRQVFIgRldPUkQgICAgIDsgU2l6ZSBvZiBhIGZhciBkYXRhIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBORFBUUiBEV09SRCAgICAgOyBTaXplIG9mIGEgbmVhciBkYXRhIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBDUFRSIERXT1JEICAgICAgOyBTaXplIG9mIGEgY29kZSBwb2ludGVyCi0gICAgICAgIHR5cGVkZWYgRkNQVFIgRldPUkQgICAgIDsgU2l6ZSBvZiBhIGZhciBjb2RlIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBOQ1BUUiBEV09SRCAgICAgOyBTaXplIG9mIGEgbmVhciBjb2RlIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBEVUlOVCBEV09SRCAgICAgOyBEZWNsYXJlIGEgaW50ZWdlciB2YXJpYWJsZQotICAgICAgICBGUFRSICAgICAgICBFUVUgTkVBUiAgICA7IERpc3RhbmNlIGZvciBmdW5jdGlvbiBwb2ludGVycwotICAgICAgICBpbnRzaXplICAgICA9ICAgNCAgICAgICA7IFNpemUgb2YgYW4gaW50ZWdlcgotICAgICAgICBmbGF0bW9kZWwgICA9ICAgMSAgICAgICA7IFRoaXMgaXMgYSBmbGF0IG1lbW9yeSBtb2RlbAotICAgICAgICBQMzg2ICAgICAgICAgICAgICAgICAgICA7IFR1cm4gb24gMzg2IGNvZGUgZ2VuZXJhdGlvbgotICAgICAgICBNT0RFTCAgICAgICBGTEFUICAgICAgICA7IFNldCB1cCBmb3IgMzIgYml0IHNpbXBsaWZpZWQgRkxBVCBtb2RlbAotZWxzZQotICAgICAgICBfYXggICAgICAgICBFUVUgYXggICAgICA7IEFYIGlzIHVzZWQgZm9yIGFjY3VtdWxhdG9yCi0gICAgICAgIF9ieCAgICAgICAgIEVRVSBieCAgICAgIDsgQlggaXMgdXNlZCBmb3IgYWNjdW11bGF0b3IKLSAgICAgICAgX2N4ICAgICAgICAgRVFVIGN4ICAgICAgOyBDWCBpcyB1c2VkIGZvciBsb29waW5nCi0gICAgICAgIF9keCAgICAgICAgIEVRVSBkeCAgICAgIDsgRFggaXMgdXNlZCBmb3IgZGF0YSByZWdpc3RlcgotICAgICAgICBfc2kgICAgICAgICBFUVUgc2kgICAgICA7IFNJIGlzIHRoZSBzb3VyY2UgaW5kZXggcmVnaXN0ZXIKLSAgICAgICAgX2RpICAgICAgICAgRVFVIGRpICAgICAgOyBESSBpcyB0aGUgZGVzdGluYXRpb24gaW5kZXggcmVnaXN0ZXIKLSAgICAgICAgX2JwICAgICAgICAgRVFVIGJwICAgICAgOyBCUCBpcyB1c2VkIGZvciBiYXNlIHBvaW50ZXIgcmVnaXN0ZXIKLSAgICAgICAgX3NwICAgICAgICAgRVFVIHNwICAgICAgOyBTUCBpcyB1c2VkIGZvciBzdGFjayBwb2ludGVyIHJlZ2lzdGVyCi0gICAgICAgIF9lcyAgICAgICAgIEVRVSBlczogICAgIDsgRVMgaXMgdXNlZCBmb3Igc2VnbWVudCBvdmVycmlkZQotICAgICAgICB0eXBlZGVmIFVDSEFSIEJZVEUgICAgICA7IFNpemUgb2YgYSBjaGFyYWN0ZXIKLSAgICAgICAgdHlwZWRlZiBVU0hPUlQgV09SRCAgICAgOyBTaXplIG9mIGEgc2hvcnQKLSAgICAgICAgdHlwZWRlZiBVSU5UIFdPUkQgICAgICAgOyBTaXplIG9mIGFuIGludGVnZXIKLSAgICAgICAgdHlwZWRlZiBVTE9ORyBEV09SRCAgICAgOyBTaXplIG9mIGEgbG9uZwotICAgICAgICB0eXBlZGVmIEJPT0wgV09SRCAgICAgICA7IFNpemUgb2YgYSBib29sZWFuCi0gICAgICAgIHR5cGVkZWYgRFBUUiBEV09SRCAgICAgIDsgU2l6ZSBvZiBhIGRhdGEgcG9pbnRlcgotICAgICAgICB0eXBlZGVmIEZEUFRSIERXT1JEICAgICA7IFNpemUgb2YgYSBmYXIgZGF0YSBwb2ludGVyCi0gICAgICAgIHR5cGVkZWYgTkRQVFIgV09SRCAgICAgIDsgU2l6ZSBvZiBhIG5lYXIgZGF0YSBwb2ludGVyCi0gICAgICAgIHR5cGVkZWYgQ1BUUiBEV09SRCAgICAgIDsgU2l6ZSBvZiBhIGNvZGUgcG9pbnRlcgotICAgICAgICB0eXBlZGVmIEZDUFRSIERXT1JEICAgICA7IFNpemUgb2YgYSBmYXIgY29kZSBwb2ludGVyCi0gICAgICAgIHR5cGVkZWYgTkNQVFIgV09SRCAgICAgIDsgU2l6ZSBvZiBhIG5lYXIgY29kZSBwb2ludGVyCi0gICAgICAgIHR5cGVkZWYgRFVJTlQgV09SRCAgICAgIDsgRGVjbGFyZSBhIGludGVnZXIgdmFyaWFibGUKLSAgICAgICAgRlBUUiAgICAgICAgRVFVIEZBUiAgICAgOyBEaXN0YW5jZSBmb3IgZnVuY3Rpb24gcG9pbnRlcnMKLSAgICAgICAgaW50c2l6ZSAgICAgPSAgIDIgICAgICAgOyBTaXplIG9mIGFuIGludGVnZXIKLSAgICAgICAgUDM4NiAgICAgICAgICAgICAgICAgICAgOyBUdXJuIG9uIDM4NiBjb2RlIGdlbmVyYXRpb24KLWVuZGlmCi0gICAgICAgIGludmVydCAgICAgIEVRVSBub3QKLQotOyBQcm92aWRlIGEgdHlwZWRlZiBmb3IgcmVhbCBmbG9hdGluZyBwb2ludCBudW1iZXJzCi0KLWlmZGVmICAgRE9VQkxFCi10eXBlZGVmIFJFQUwgICAgUVdPUkQKLXR5cGVkZWYgRFJFQUwgICBRV09SRAotZWxzZQotdHlwZWRlZiBSRUFMICAgIERXT1JECi10eXBlZGVmIERSRUFMICAgRFdPUkQKLWVuZGlmCi0KLTsgTWFjcm9zIHRvIGFjY2VzcyB0aGUgZmxvYXRpbmcgcG9pbnQgc3RhY2sgcmVnaXN0ZXJzIHRvIGNvbnZlcnQgdGhlbQotOyBmcm9tIE5BU00gc3R5bGUgdG8gVEFTTSBzdHlsZQotCi1zdDAgICAgICAgICBFUVUgICAgIHN0KDApCi1zdDEgICAgICAgICBFUVUgICAgIHN0KDEpCi1zdDIgICAgICAgICBFUVUgICAgIHN0KDIpCi1zdDMgICAgICAgICBFUVUgICAgIHN0KDMpCi1zdDQgICAgICAgICBFUVUgICAgIHN0KDQpCi1zdDUgICAgICAgICBFUVUgICAgIHN0KDUpCi1zdDYgICAgICAgICBFUVUgICAgIHN0KDYpCi1zdDcgICAgICAgICBFUVUgICAgIHN0KDcpCi1zdDggICAgICAgICBFUVUgICAgIHN0KDgpCi0KLTsgQm9vbGVhbiB0cnV0aCB2YWx1ZXMgKHNhbWUgYXMgdGhvc2UgaW4gZGVidWcuaCkKLQotaWZuZGVmICBfX1ZYRF9fCi1GYWxzZSAgICAgICA9ICAgICAgIDAKLVRydWUgICAgICAgID0gICAgICAgMQotTm8gICAgICAgICAgPSAgICAgICAwCi1ZZXMgICAgICAgICA9ICAgICAgIDEKLVllcyAgICAgICAgID0gICAgICAgMQotZW5kaWYKLQotOyBNYWNyb3MgZm9yIHRoZSBfREFUQSBkYXRhIHNlZ21lbnQuIFRoaXMgc2VnbWVudCBjb250YWlucyBpbml0aWFsaXNlZCBkYXRhLgotCi1NQUNSTyAgIGJlZ2RhdGFzZWcgbmFtZQotaWZkZWYgICBfX1ZYRF9fCi0gICAgICAgIE1BU00KLVZYRF9MT0NLRURfREFUQV9TRUcKLSAgICAgICAgSURFQUwKLWVsc2UKLWlmZGVmICAgZmxhdG1vZGVsCi0gICAgICAgIERBVEFTRUcKLWVsc2UKLVNFR01FTlQgX0RBVEEgRFdPUkQgUFVCTElDIFVTRTE2ICdEQVRBJwotZW5kaWYKLWVuZGlmCi1FTkRNCi0KLU1BQ1JPICAgZW5kZGF0YXNlZyBuYW1lCi1pZmRlZiAgIF9fVlhEX18KLSAgICAgICAgTUFTTQotVlhEX0xPQ0tFRF9EQVRBX0VORFMKLSAgICAgICAgSURFQUwKLWVsc2UKLWlmbmRlZiAgZmxhdG1vZGVsCi1FTkRTICAgIF9EQVRBCi1lbmRpZgotZW5kaWYKLUVORE0KLQotOyBNYWNybyBmb3IgdGhlIG1haW4gY29kZSBzZWdtZW50LgotCi1NQUNSTyAgIGJlZ2NvZGVzZWcgbmFtZQotaWZkZWYgICBfX1ZYRF9fCi0gICAgICAgIE1BU00KLVZYRF9MT0NLRURfQ09ERV9TRUcKLSAgICAgICAgSURFQUwKLWVsc2UKLWlmZGVmICAgZmxhdG1vZGVsCi0gICAgICAgIENPREVTRUcKLSAgICAgICAgQVNTVU1FICBDUzpGTEFULERTOkZMQVQsU1M6RkxBVAotZWxzZQotU0VHTUVOVCAmbmFtZSZfVEVYVCBQQVJBIFBVQkxJQyBVU0UxNiAnQ09ERScKLSAgICAgICAgQVNTVU1FIENTOiZuYW1lJl9URVhULERTOl9EQVRBCi1lbmRpZgotZW5kaWYKLUVORE0KLQotOyBNYWNybyBmb3IgYSBuZWFyIGNvZGUgc2VnbWVudAotCi1NQUNSTyAgIGJlZ2NvZGVzZWdfbmVhcgotaWZkZWYgICBmbGF0bW9kZWwKLSAgICAgICAgQ09ERVNFRwotICAgICAgICBBU1NVTUUgIENTOkZMQVQsRFM6RkxBVCxTUzpGTEFUCi1lbHNlCi1TRUdNRU5UIF9URVhUIFBBUkEgUFVCTElDIFVTRTE2ICdDT0RFJwotICAgICAgICBBU1NVTUUgQ1M6X1RFWFQsRFM6X0RBVEEKLWVuZGlmCi1FTkRNCi0KLU1BQ1JPICAgZW5kY29kZXNlZyBuYW1lCi1pZmRlZiAgIF9fVlhEX18KLSAgICAgICAgTUFTTQotVlhEX0xPQ0tFRF9DT0RFX0VORFMKLSAgICAgICAgSURFQUwKLWVsc2UKLWlmbmRlZiAgZmxhdG1vZGVsCi1FTkRTICAgICZuYW1lJl9URVhUCi1lbmRpZgotZW5kaWYKLUVORE0KLQotTUFDUk8gICBlbmRjb2Rlc2VnX25lYXIKLWlmbmRlZiAgZmxhdG1vZGVsCi1FTkRTICAgIF9URVhUCi1lbmRpZgotRU5ETQotCi07IE1hY3JvIHRvIGJlIGludm9rZWQgYXQgdGhlIHN0YXJ0IG9mIGFsbCBtb2R1bGVzIHRvIHNldCB1cCBzZWdtZW50cyBmb3IKLTsgbGF0ZXIgdXNlLgotCi1NQUNSTyAgIGhlYWRlciBuYW1lCi1iZWdkYXRhc2VnIG5hbWUKLWVuZGRhdGFzZWcgbmFtZQotRU5ETQotCi07IE1hY3JvIGZvciBhbiBleHRlcm4gQyBzeW1ib2wuIElmIHRoZSBDIGNvbXBpbGVyIHJlcXVpcmVzIGxlYWRpbmcKLTsgdW5kZXJzY29yZXMsIHRoZW4gdGhlIHVuZGVyc2NvcmVzIGFyZSBhZGRlZCB0byB0aGUgc3ltYm9sIG5hbWVzLCBvdGhlcndpc2UKLTsgdGhleSBhcmUgbGVmdCBvZmYuIFRoZSBzeW1ib2wgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBhc3NlbWJsZXIgY29kZQotOyB1c2luZyB0aGUgbm9uLXVuZGVyc2NvcmVkIHN5bWJvbCBuYW1lLgotCi1NQUNSTyAgIGNleHRlcm4gbmFtZSxzaXplCi1pZmRlZiAgIF9fTk9VX1ZBUl9fCi0gICAgICAgIEVYVFJOICAgbmFtZTpzaXplCi1lbHNlCi0gICAgICAgIEVYVFJOICAgXyZuYW1lJjpzaXplCi1uYW1lICAgIEVRVSAgICAgXyZuYW1lJgotZW5kaWYKLUVORE0KLQotTUFDUk8gICBjZXh0ZXJuZnVuYyBuYW1lLHNpemUKLWlmZGVmICAgX19OT1VfXwotICAgICAgICBFWFRSTiAgIG5hbWU6c2l6ZQotZWxzZQotICAgICAgICBFWFRSTiAgIF8mbmFtZSY6c2l6ZQotbmFtZSAgICBFUVUgICAgIF8mbmFtZSYKLWVuZGlmCi1FTkRNCi0KLU1BQ1JPICAgc3RkZXh0ZXJuZnVuYyAgIG5hbWUsbnVtX2FyZ3Msc2l6ZQotaWZkZWYgICBTVERDQUxMX01BTkdMRQotICAgICAgICBFWFRSTiAgIF8mbmFtZSZAJm51bV9hcmdzJjpzaXplCi1uYW1lICAgIEVRVSAgICAgXyZuYW1lJkAmbnVtX2FyZ3MKLWVsc2UKLSAgICAgICAgRVhUUk4gICBuYW1lOnNpemUKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm8gZm9yIGEgcHVibGljIEMgc3ltYm9sLiBJZiB0aGUgQyBjb21waWxlciByZXF1aXJlcyBsZWFkaW5nCi07IHVuZGVyc2NvcmVzLCB0aGVuIHRoZSB1bmRlcnNjb3JlcyBhcmUgYWRkZWQgdG8gdGhlIHN5bWJvbCBuYW1lcywgb3RoZXJ3aXNlCi07IHRoZXkgYXJlIGxlZnQgb2ZmLiBUaGUgc3ltYm9sIG5hbWUgaXMgcmVmZXJlbmNlZCBpbiB0aGUgYXNzZW1ibGVyIGNvZGUKLTsgdXNpbmcgdGhlIG5vbi11bmRlcnNjb3JlZCBzeW1ib2wgbmFtZS4KLQotTUFDUk8gICBjcHVibGljIG5hbWUKLWlmZGVmICAgX19OT1VfVkFSX18KLW5hbWU6Ci0gICAgICAgIFBVQkxJQyAgbmFtZQotZWxzZQotXyZuYW1lJjoKLSAgICAgICAgUFVCTElDICBfJm5hbWUmCi1uYW1lICAgIEVRVSAgICAgXyZuYW1lJgotZW5kaWYKLUVORE0KLQotOyBNYWNybyBmb3IgYW4gZ2xvYmFsIEMgc3ltYm9sLiBJZiB0aGUgQyBjb21waWxlciByZXF1aXJlcyBsZWFkaW5nCi07IHVuZGVyc2NvcmVzLCB0aGVuIHRoZSB1bmRlcnNjb3JlcyBhcmUgYWRkZWQgdG8gdGhlIHN5bWJvbCBuYW1lcywgb3RoZXJ3aXNlCi07IHRoZXkgYXJlIGxlZnQgb2ZmLiBUaGUgc3ltYm9sIG5hbWUgaXMgcmVmZXJlbmNlZCBpbiB0aGUgYXNzZW1ibGVyIGNvZGUKLTsgdXNpbmcgdGhlIG5vbi11bmRlcnNjb3JlZCBzeW1ib2wgbmFtZS4KLQotTUFDUk8gICBjZ2xvYmFsIG5hbWUKLWlmZGVmICAgX19OT1VfVkFSX18KLSAgICAgICAgUFVCTElDICBuYW1lCi1lbHNlCi0gICAgICAgIFBVQkxJQyAgXyZuYW1lJgotbmFtZSAgICBFUVUgICAgIF8mbmFtZSYKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm8gZm9yIGFuIGdsb2JhbCBDIGZ1bmN0aW9uIHN5bWJvbC4gSWYgdGhlIEMgY29tcGlsZXIgcmVxdWlyZXMgbGVhZGluZwotOyB1bmRlcnNjb3JlcywgdGhlbiB0aGUgdW5kZXJzY29yZXMgYXJlIGFkZGVkIHRvIHRoZSBzeW1ib2wgbmFtZXMsIG90aGVyd2lzZQotOyB0aGV5IGFyZSBsZWZ0IG9mZi4gVGhlIHN5bWJvbCBuYW1lIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGFzc2VtYmxlciBjb2RlCi07IHVzaW5nIHRoZSBub24tdW5kZXJzY29yZWQgc3ltYm9sIG5hbWUuCi0KLU1BQ1JPICAgY2dsb2JhbGZ1bmMgbmFtZQotaWZkZWYgICBfX05PVV9fCi0gICAgICAgIFBVQkxJQyAgbmFtZQotZWxzZQotICAgICAgICBQVUJMSUMgIF8mbmFtZSYKLW5hbWUgICAgRVFVICAgICBfJm5hbWUmCi1lbmRpZgotRU5ETQotCi07IE1hY3JvIHRvIHN0YXJ0IGEgQyBjYWxsYWJsZSBmdW5jdGlvbi4gVGhpcyB3aWxsIGJlIGEgZmFyIGZ1bmN0aW9uIGZvcgotOyAxNi1iaXQgY29kZSwgYW5kIGEgbmVhciBmdW5jdGlvbiBmb3IgMzItYml0IGNvZGUuCi0KLU1BQ1JPICAgY3Byb2NzdGF0aWMgbmFtZSAgICAgICAgOyBTZXQgdXAgbW9kZWwgaW5kZXBlbmRhbnQgcHJpdmF0ZSBwcm9jCi1pZmRlZiBmbGF0bW9kZWwKLVBST0MgICAgbmFtZSBORUFSCi1lbHNlCi1QUk9DICAgIG5hbWUgRkFSCi1lbmRpZgotTG9jYWxTaXplICAgPSAwCi1FTkRNCi0KLU1BQ1JPICAgY3Byb2NzdGFydCBuYW1lICAgICAgICAgOyBTZXQgdXAgbW9kZWwgaW5kZXBlbmRhbnQgcHJvYwotaWZkZWYgZmxhdG1vZGVsCi1pZmRlZiAgIF9fTk9VX18KLVBST0MgICAgbmFtZSBORUFSCi1lbHNlCi1QUk9DICAgIF8mbmFtZSYgTkVBUgotZW5kaWYKLWVsc2UKLWlmZGVmICAgX19OT1VfXwotUFJPQyAgICBuYW1lIEZBUgotZWxzZQotUFJPQyAgICBfJm5hbWUmIEZBUgotZW5kaWYKLWVuZGlmCi1Mb2NhbFNpemUgICA9IDAKLSAgICAgICAgY2dsb2JhbGZ1bmMgbmFtZQotRU5ETQotCi1NQUNSTyAgIGNwcm9jbmVhciBuYW1lICAgICAgICAgIDsgU2V0IHVwIG5lYXIgcHJvYwotaWZkZWYgICBfX05PVV9fCi1QUk9DICAgIG5hbWUgTkVBUgotZWxzZQotUFJPQyAgICBfJm5hbWUmIE5FQVIKLWVuZGlmCi1Mb2NhbFNpemUgICA9IDAKLSAgICAgICAgY2dsb2JhbGZ1bmMgbmFtZQotRU5ETQotCi1NQUNSTyAgIGNwcm9jZmFyIG5hbWUgICAgICAgICAgIDsgU2V0IHVwIGZhciBwcm9jCi1pZmRlZiAgIF9fTk9VX18KLVBST0MgICAgbmFtZSBGQVIKLWVsc2UKLVBST0MgICAgXyZuYW1lJiBGQVIKLWVuZGlmCi1Mb2NhbFNpemUgICA9IDAKLSAgICAgICAgY2dsb2JhbGZ1bmMgbmFtZQotRU5ETQotCi1NQUNSTyAgIGNwcm9jZW5kICAgICAgICAgICAgICAgOyBFbmQgcHJvY2VkdXJlIG1hY3JvCi1FTkRQCi1FTkRNCi0KLTsgVGhpcyBtYWNybyBzZXRzIHVwIGEgcHJvY2VkdXJlIHRvIGJlIGV4cG9ydGVkIGZyb20gYSAxNiBiaXQgRExMLiBTaW5jZSB0aGUKLTsgY2FsbGluZyBjb252ZW50aW9ucyBhcmUgYWx3YXlzIF9mYXIgX3Bhc2NhbCBmb3IgMTYgYml0IERMTCdzLCB3ZSBhY3R1YWxseQotOyByZW5hbWUgdGhpcyByb3V0aW5lIHdpdGggYW4gZXh0cmEgdW5kZXJzY29yZSB3aXRoICdDJyBjYWxsaW5nIGNvbnZlbnRpb25zCi07IGFuZCBhIHNtYWxsIERMTCBzdHViIHdpbGwgYmUgcHJvdmlkZWQgYnkgdGhlIGhpZ2ggbGV2ZWwgY29kZSB0byBjYWxsIHRoZQotOyBhc3NlbWJsZXIgcm91dGluZS4KLQotTUFDUk8gICBjcHJvY3N0YXJ0ZGxsMTYgbmFtZQotaWZkZWYgICBfX1dJTkRPV1MxNl9fCi1jcHJvY3N0YXJ0ICBfJm5hbWUmCi1lbHNlCi1jcHJvY3N0YXJ0ICBuYW1lCi1lbmRpZgotRU5ETQotCi07IE1hY3JvcyBmb3IgZW50ZXJpbmcgYW5kIGV4aXRpbmcgQyBjYWxsYWJsZSBmdW5jdGlvbnMuIE5vdGUgdGhhdCB3ZSBtdXN0Ci07IGFsd2F5cyBzYXZlIGFuZCByZXN0b3JlIHRoZSBTSSBhbmQgREkgcmVnaXN0ZXJzIGZvciBDIGZ1bmN0aW9ucywgYW5kIGZvcgotOyAzMiBiaXQgQyBmdW5jdGlvbnMgd2UgYWxzbyBuZWVkIHRvIHNhdmUgYW5kIHJlc3RvcmUgRUJYIGFuZCBjbGVhciB0aGUKLTsgZGlyZWN0aW9uIGZsYWcuCi0KLU1BQ1JPICAgc2F2ZV9jX3JlZ3MKLWlmZGVmICAgZmxhdG1vZGVsCi0gICAgICAgIHB1c2ggICAgZWJ4Ci1lbmRpZgotICAgICAgICBwdXNoICAgIF9zaQotICAgICAgICBwdXNoICAgIF9kaQotRU5ETQotCi1NQUNSTyAgIGVudGVyX2MKLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgSUZESUZJICA8TG9jYWxTaXplPiw8MD4KLSAgICAgICAgc3ViICAgICBfc3AsTG9jYWxTaXplCi0gICAgRU5ESUYKLSAgICAgICAgc2F2ZV9jX3JlZ3MKLUVORE0KLQotTUFDUk8gICByZXN0b3JlX2NfcmVncwotICAgICAgICBwb3AgICAgIF9kaQotICAgICAgICBwb3AgICAgIF9zaQotaWZkZWYgICBmbGF0bW9kZWwKLSAgICAgICAgcG9wICAgICBlYngKLWVuZGlmCi1FTkRNCi0KLU1BQ1JPICAgbGVhdmVfYwotICAgICAgICByZXN0b3JlX2NfcmVncwotICAgICAgICBjbGQKLSAgICBJRkRJRkkgIDxMb2NhbFNpemU+LDwwPgotICAgICAgICBtb3YgICAgIF9zcCxfYnAKLSAgICBFTkRJRgotICAgICAgICBwb3AgICAgIF9icAotRU5ETQotCi1NQUNSTyAgIHVzZV9lYngKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBwdXNoICAgIGVieAotZW5kaWYKLUVORE0KLQotTUFDUk8gICB1bnVzZV9lYngKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBwb3AgICAgIGVieAotZW5kaWYKLUVORE0KLQotOyBNYWNyb3MgZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIHRoZSB2YWx1ZSBvZiBEUyxFUyxGUyxHUyB3aGVuIGl0IGlzIHRvCi07IGJlIHVzZWQgaW4gYXNzZW1ibHkgcm91dGluZXMuIFRoaXMgZXZhbHVhdGVzIHRvIG5vdGhpbmcgaW4gdGhlIGZsYXQgbWVtb3J5Ci07IG1vZGVsLCBidXQgaXMgc2F2ZXMgYW5kIHJlc3RvcmVzIERTIGluIHRoZSBsYXJnZSBtZW1vcnkgbW9kZWwuCi0KLU1BQ1JPICAgdXNlX2RzCi1pZm5kZWYgZmxhdG1vZGVsCi0gICAgICAgIHB1c2ggICAgZHMKLWVuZGlmCi1FTkRNCi0KLU1BQ1JPICAgdW51c2VfZHMKLWlmbmRlZiBmbGF0bW9kZWwKLSAgICAgICAgcG9wICAgICBkcwotZW5kaWYKLUVORE0KLQotTUFDUk8gICB1c2VfZXMKLWlmbmRlZiBmbGF0bW9kZWwKLSAgICAgICAgcHVzaCAgICBlcwotZW5kaWYKLUVORE0KLQotTUFDUk8gICB1bnVzZV9lcwotaWZuZGVmIGZsYXRtb2RlbAotICAgICAgICBwb3AgICAgIGVzCi1lbmRpZgotRU5ETQotCi07IE1hY3JvcyBmb3IgbG9hZGluZyB0aGUgYWRkcmVzcyBvZiBhIGRhdGEgcG9pbnRlciBpbnRvIGEgc2VnbWVudCBhbmQKLTsgaW5kZXggcmVnaXN0ZXIgcGFpci4gVGhlIG1hY3JvIGV4cGxpY2l0bHkgbG9hZHMgRFMgb3IgRVMgaW4gdGhlIDE2IGJpdAotOyBtZW1vcnkgbW9kZWwsIG9yIGl0IHNpbXBseSBsb2FkcyB0aGUgb2Zmc2V0IGludG8gdGhlIHJlZ2lzdGVyIGluIHRoZSBmbGF0Ci07IG1lbW9yeSBtb2RlbCBzaW5jZSBEUyBhbmQgRVMgYWx3YXlzIHBvaW50IHRvIGFsbCBhZGRyZXNzYWJsZSBtZW1vcnkuIFlvdQotOyBtdXN0IHVzZSB0aGUgY29ycmVjdCBfUkVHIChpZTogX0JYKSBtYWNyb3MgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMuCi0KLU1BQ1JPICAgX2xkcyAgICByZWcsIGFkZHIKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIHJlZyxhZGRyCi1lbHNlCi0gICAgICAgIGxkcyAgICAgcmVnLGFkZHIKLWVuZGlmCi1FTkRNCi0KLU1BQ1JPICAgX2xlcyAgICByZWcsIGFkZHIKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIHJlZyxhZGRyCi1lbHNlCi0gICAgICAgIGxlcyAgICAgcmVnLGFkZHIKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm9zIGZvciBhZGRpbmcgYW5kIHN1YnRyYWN0aW5nIGEgdmFsdWUgZnJvbSByZWdpc3RlcnMuIFR3byB2YWx1ZSBhcmUKLTsgcHJvdmlkZWQsIG9uZSBmb3IgMTYgYml0IG1vZGVzIGFuZCBhbm90aGVyIGZvciAzMiBiaXQgbW9kZXMgKHRoZSBleHRlbmRlZAotOyByZWdpc3RlciBpcyB1c2VkIGluIDMyIGJpdCBtb2RlcykuCi0KLU1BQ1JPICAgX2FkZCAgICByZWcsIHZhbDE2LCB2YWwzMgotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIGFkZCAgICAgZSZyZWcmLCB2YWwzMgotZWxzZQotICAgICAgICBhZGQgICAgIHJlZywgdmFsMTYKLWVuZGlmCi1FTkRNCi0KLU1BQ1JPICAgX3N1YiAgICByZWcsIHZhbDE2LCB2YWwzMgotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIHN1YiAgICAgZSZyZWcmLCB2YWwzMgotZWxzZQotICAgICAgICBzdWIgICAgIHJlZywgdmFsMTYKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm8gdG8gY2xlYXIgdGhlIGhpZ2ggb3JkZXIgd29yZCBmb3IgdGhlIDMyIGJpdCBleHRlbmRlZCByZWdpc3RlcnMuCi07IFRoaXMgaXMgdXNlZCB0byBjb252ZXJ0IGFuIHVuc2lnbmVkIDE2IGJpdCB2YWx1ZSB0byBhbiB1bnNpZ25lZCAzMiBiaXQKLTsgdmFsdWUsIGFuZCB3aWxsIGV2YWx1YXRlIHRvIG5vdGhpbmcgaW4gMTYgYml0IG1vZGVzLgotCi1NQUNSTyAgIGNscmhpICAgcmVnCi1pZmRlZiAgIGZsYXRtb2RlbAotICAgICAgICBtb3Z6eCAgIGUmcmVnJixyZWcKLWVuZGlmCi1FTkRNCi0KLU1BQ1JPICAgc2duaGkgICByZWcKLWlmZGVmICAgZmxhdG1vZGVsCi0gICAgICAgIG1vdnN4ICAgZSZyZWcmLHJlZwotZW5kaWYKLUVORE0KLQotOyBNYWNybyB0byBsb2FkIGFuIGV4dGVuZGVkIHJlZ2lzdGVyIHdpdGggYW4gaW50ZWdlciB2YWx1ZSBpbiBlaXRoZXIgbW9kZQotCi1NQUNSTyAgIGxvYWRpbnQgcmVnLHZhbAotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZSZyZWcmLHZhbAotZWxzZQotICAgICAgICB4b3IgICAgIGUmcmVnJixlJnJlZyYKLSAgICAgICAgbW92ICAgICByZWcsdmFsCi1lbmRpZgotRU5ETQotCi07IE1hY3JvcyB0byBsb2FkIGFuZCBzdG9yZSBpbnRlZ2VyIHZhbHVlcyB3aXRoIHN0cmluZyBpbnN0cnVjdGlvbnMKLQotTUFDUk8gICBMT0RTSU5UCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgbG9kc2QKLWVsc2UKLSAgICAgICAgbG9kc3cKLWVuZGlmCi1FTkRNCi0KLU1BQ1JPICAgU1RPU0lOVAotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIHN0b3NkCi1lbHNlCi0gICAgICAgIHN0b3N3Ci1lbmRpZgotRU5ETQotCi07IE1hY3JvcyB0byBwcm92aWRlIHJlc2IsIHJlc3csIHJlc2QgY29tcGF0aWJpbGl0eSB3aXRoIE5BU00KLQotTUFDUk8gICBkY2xiICAgIGNvdW50Ci1kYiAgY291bnQgZHVwICgwKQotRU5ETQotCi1NQUNSTyAgIGRjbHcgICAgY291bnQKLWR3ICBjb3VudCBkdXAgKDApCi1FTkRNCi0KLU1BQ1JPICAgZGNsZCAgICBjb3VudAotZGQgIGNvdW50IGR1cCAoMCkKLUVORE0KLQotOyBNYWNyb3MgdG8gcHJvdmlkZSByZXNiLCByZXN3LCByZXNkIGNvbXBhdGliaWxpdHkgd2l0aCBOQVNNCi0KLU1BQ1JPICAgcmVzYiAgICBjb3VudAotZGIgIGNvdW50IGR1cCAoPykKLUVORE0KLQotTUFDUk8gICByZXN3ICAgIGNvdW50Ci1kdyAgY291bnQgZHVwICg/KQotRU5ETQotCi1NQUNSTyAgIHJlc2QgICAgY291bnQKLWRkICBjb3VudCBkdXAgKD8pCi1FTkRNCi0KLTsgTWFjcm9zIHRvIGRlY2xhcmUgYXNzZW1ibGVyIHN0dWJzIGZvciBmdW5jdGlvbiBzdHJ1Y3R1cmVzCi0KLU1BQ1JPICAgQkVHSU5fU1RVQlNfREVGIG5hbWUsIGZpcnN0T2Zmc2V0Ci1iZWdkYXRhc2VnICBfU1RVQlMKLWlmZGVmICAgX19OT1VfVkFSX18KLSAgICAgICAgRVhUUk4gICBuYW1lOkRXT1JECi1TVFVCU19TVEFSVCA9ICAgbmFtZQotZWxzZQotICAgICAgICBFWFRSTiAgIF8mbmFtZSY6RFdPUkQKLW5hbWUgICAgRVFVICAgICBfJm5hbWUmCi1TVFVCU19TVEFSVCA9ICAgXyZuYW1lCi1lbmRpZgotZW5kZGF0YXNlZyAgX1NUVUJTCi1iZWdjb2Rlc2VnICBfU1RVQlMKLW9mZiA9IGZpcnN0T2Zmc2V0Ci1FTkRNCi0KLU1BQ1JPICAgREVDTEFSRV9TVFVCICAgIG5hbWUKLWlmZGVmICAgX19OT1VfXwotbmFtZToKLSAgICAgICAgUFVCTElDICBuYW1lCi1lbHNlCi1fJm5hbWU6Ci0gICAgICAgIFBVQkxJQyAgXyZuYW1lCi1lbmRpZgotICAgICAgICBqbXAgICAgIFtEV09SRCBTVFVCU19TVEFSVCtvZmZdCi1vZmYgPSBvZmYgKyA0Ci1FTkRNCi0KLU1BQ1JPICAgU0tJUF9TVFVCICAgIG5hbWUKLW9mZiA9IG9mZiArIDQKLUVORE0KLQotTUFDUk8gICBERUNMQVJFX1NURENBTEwgbmFtZSxudW1fYXJncwotaWZkZWYgICBTVERDQUxMX01BTkdMRQotXyZuYW1lJkAmbnVtX2FyZ3MmOgotICAgICAgICBQVUJMSUMgIF8mbmFtZSZAJm51bV9hcmdzJgotZWxzZQotbmFtZToKLSAgICAgICAgUFVCTElDICBuYW1lCi1lbmRpZgotICAgICAgICBqbXAgICAgIFtEV09SRCBTVFVCU19TVEFSVCtvZmZdCi1vZmYgPSBvZmYgKyA0Ci1FTkRNCi0KLU1BQ1JPICAgRU5EX1NUVUJTX0RFRgotZW5kY29kZXNlZyAgX1NUVUJTCi1FTkRNCi0KLU1BQ1JPICAgQkVHSU5fSU1QT1JUU19ERUYgICBuYW1lCi1CRUdJTl9TVFVCU19ERUYgbmFtZSw0Ci1FTkRNCi0KLWlmbmRlZiBMT0NBTF9ERUNMQVJFX0lNUAotTUFDUk8gICBERUNMQVJFX0lNUCBuYW1lLCBudW1BcmdzCi1ERUNMQVJFX1NUVUIgICAgbmFtZQotRU5ETQotCi1NQUNSTyAgIFNLSVBfSU1QIG5hbWUKLVNLSVBfU1RVQiAgICAgICBuYW1lCi1FTkRNCi0KLU1BQ1JPICAgU0tJUF9JTVAyIG5hbWUsIG51bUFyZ3MKLURFQ0xBUkVfU1RVQiAgICBuYW1lCi1FTkRNCi0KLU1BQ1JPICAgU0tJUF9JTVAzIG5hbWUKLVNLSVBfU1RVQiAgICAgICBuYW1lCi1FTkRNCi1lbmRpZgotCi1NQUNSTyAgIEVORF9JTVBPUlRTX0RFRgotRU5EX1NUVUJTX0RFRgotRU5ETQotCi1NQUNSTyAgIExFQV9MICAgIHJlZyxuYW1lCi0gICAgICAgIGxlYSAgICAgcmVnLFtuYW1lXQotRU5ETQotCi1NQUNSTyAgIExFQV9HICAgIHJlZyxuYW1lCi0gICAgICAgIGxlYSAgICAgcmVnLFtuYW1lXQotRU5ETQotCi1lbmRpZgotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11LmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkODdkNGUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBwdWJsaWMgc3BlY2lmaWMgZnVuY3Rpb25zLgotKiAgICAgICAgICAgICAgIEFueSBhcHBsaWNhdGlvbiBsaW5raW5nIGFnYWluc3QgdXMgc2hvdWxkIG9ubHkKLSogICAgICAgICAgICAgICBpbmNsdWRlIHRoaXMgaGVhZGVyCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fWDg2RU1VX1g4NkVNVV9ICi0jZGVmaW5lIF9fWDg2RU1VX1g4NkVNVV9ICi0KLSNpZmRlZiBTQ0lURUNICi0jaW5jbHVkZSAic2NpdGVjaC5oIgotI2RlZmluZSBYODZBUEkgIF9BU01BUEkKLSNkZWZpbmUgWDg2QVBJUCBfQVNNQVBJUAotdHlwZWRlZiBpbnQgWDg2RU1VX3Bpb0FkZHI7Ci0jZWxzZQotI2luY2x1ZGUgIng4NmVtdS90eXBlcy5oIgotI2RlZmluZSBYODZBUEkKLSNkZWZpbmUgWDg2QVBJUCAqCi0jZW5kaWYKLSNpbmNsdWRlICJ4ODZlbXUvcmVncy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIHBhY2soMSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIHBvbnRlcnMgdG8gcHJvZ3JhbW1lZCBJL08gZnVuY3Rpb25zIHVzZWQgYnkgdGhlCi1lbXVsYXRvci4gVGhpcyBpcyB1c2VkIHNvIHRoYXQgdGhlIHVzZXIgcHJvZ3JhbSBjYW4gaG9vayBhbGwgcHJvZ3JhbW1lZAotSS9PIGZvciB0aGUgZW11bGF0b3IgdG8gaGFuZGxlZCBhcyBuZWNlc3NhcnkgYnkgdGhlIHVzZXIgcHJvZ3JhbS4gQnkKLWRlZmF1bHQgdGhlIGVtdWxhdG9yIGNvbnRhaW5zIHNpbXBsZSBmdW5jdGlvbnMgdGhhdCBkbyBub3QgZG8gYWNjZXNzIHRoZQotaGFyZHdhcmUgaW4gYW55IHdheS4gVG8gYWxsb3cgdGhlIGVtdWFsdG9yIGFjY2VzcyB0aGUgaGFyZHdhcmUsIHlvdSB3aWxsCi1uZWVkIHRvIG92ZXJyaWRlIHRoZSBwcm9ncmFtbWVkIEkvTyBmdW5jdGlvbnMgdXNpbmcgdGhlIFg4NkVNVV9zZXR1cFBpb0Z1bmNzCi1mdW5jdGlvbi4KLQotSEVBREVSOgoteDg2ZW11LmgKLQotTUVNQkVSUzoKLWluYiAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgYnl0ZSBmcm9tIGFuIEkvTyBwb3J0Ci1pbncgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIHdvcmQgZnJvbSBhbiBJL08gcG9ydAotaW5sICAgICAtIEZ1bmN0aW9uIHRvIHJlYWQgYSBkd29yZCBmcm9tIGFuIEkvTyBwb3J0Ci1vdXRiICAgIC0gRnVuY3Rpb24gdG8gd3JpdGUgYSBieXRlIHRvIGFuIEkvTyBwb3J0Ci1vdXR3ICAgIC0gRnVuY3Rpb24gdG8gd3JpdGUgYSB3b3JkIHRvIGFuIEkvTyBwb3J0Ci1vdXRsICAgIC0gRnVuY3Rpb24gdG8gd3JpdGUgYSBkd29yZCB0byBhbiBJL08gcG9ydAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1OCAgICAgIChYODZBUElQIGluYikoWDg2RU1VX3Bpb0FkZHIgYWRkcik7Ci0gICAgdTE2ICAgICAoWDg2QVBJUCBpbncpKFg4NkVNVV9waW9BZGRyIGFkZHIpOwotICAgIHUzMiAgICAgKFg4NkFQSVAgaW5sKShYODZFTVVfcGlvQWRkciBhZGRyKTsKLSAgICB2b2lkICAgIChYODZBUElQIG91dGIpKFg4NkVNVV9waW9BZGRyIGFkZHIsIHU4IHZhbCk7Ci0gICAgdm9pZCAgICAoWDg2QVBJUCBvdXR3KShYODZFTVVfcGlvQWRkciBhZGRyLCB1MTYgdmFsKTsKLSAgICB2b2lkICAgIChYODZBUElQIG91dGwpKFg4NkVNVV9waW9BZGRyIGFkZHIsIHUzMiB2YWwpOwotICAgIH0gWDg2RU1VX3Bpb0Z1bmNzOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9udGVycyB0byBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZQotZW11bGF0b3IuIFRoaXMgaXMgdXNlZCBzbyB0aGF0IHRoZSB1c2VyIHByb2dyYW0gY2FuIGhvb2sgYWxsIG1lbW9yeQotYWNjZXNzIGZ1bmN0aW9ucyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBlbXVsYXRvci4gQnkgZGVmYXVsdCB0aGUgZW11bGF0b3IKLWNvbnRhaW5zIHNpbXBsZSBmdW5jdGlvbnMgdGhhdCBvbmx5IGFjY2VzcyB0aGUgaW50ZXJuYWwgbWVtb3J5IG9mIHRoZQotZW11bGF0b3IuIElmIHlvdSBuZWVkIHNwZWNpYWxpc2VkIGZ1bmN0aW9ucyB0byBoYW5kbGUgYWNjZXNzIHRvIGRpZmZlcmVudAotdHlwZXMgb2YgbWVtb3J5IChpZTogaGFyZHdhcmUgZnJhbWVidWZmZXIgYWNjZXNzZXMgYW5kIEJJT1MgbWVtb3J5IGFjY2VzcwotZXRjKSwgeW91IHdpbGwgbmVlZCB0byBvdmVycmlkZSB0aGlzIHVzaW5nIHRoZSBYODZFTVVfc2V0dXBNZW1GdW5jcwotZnVuY3Rpb24uCi0KLUhFQURFUjoKLXg4NmVtdS5oCi0KLU1FTUJFUlM6Ci1yZGIgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIGJ5dGUgZnJvbSBhbiBhZGRyZXNzCi1yZHcgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIHdvcmQgZnJvbSBhbiBhZGRyZXNzCi1yZGwgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIGR3b3JkIGZyb20gYW4gYWRkcmVzcwotd3JiICAgICAtIEZ1bmN0aW9uIHRvIHdyaXRlIGEgYnl0ZSB0byBhbiBhZGRyZXNzCi13cncgICAgIC0gRnVuY3Rpb24gdG8gd3JpdGUgYSB3b3JkIHRvIGFuIGFkZHJlc3MKLXdybCAgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIGR3b3JkIHRvIGFuIGFkZHJlc3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdTggICAgICAoWDg2QVBJUCByZGIpKHUzMiBhZGRyKTsKLSAgICB1MTYgICAgIChYODZBUElQIHJkdykodTMyIGFkZHIpOwotICAgIHUzMiAgICAgKFg4NkFQSVAgcmRsKSh1MzIgYWRkcik7Ci0gICAgdm9pZCAgICAoWDg2QVBJUCB3cmIpKHUzMiBhZGRyLCB1OCB2YWwpOwotICAgIHZvaWQgICAgKFg4NkFQSVAgd3J3KSh1MzIgYWRkciwgdTE2IHZhbCk7Ci0gICAgdm9pZCAgICAoWDg2QVBJUCB3cmwpKHUzMiBhZGRyLCB1MzIgdmFsKTsKLSAgICB9IFg4NkVNVV9tZW1GdW5jczsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgSGVyZSBhcmUgdGhlIGRlZmF1bHQgbWVtb3J5IHJlYWQgYW5kIHdyaXRlCi0gIGZ1bmN0aW9uIGluIGNhc2UgdGhleSBhcmUgbmVlZGVkIGFzIGZhbGxiYWNrcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1OCBYODZBUEkgcmRiKHUzMiBhZGRyKTsKLWV4dGVybiB1MTYgWDg2QVBJIHJkdyh1MzIgYWRkcik7Ci1leHRlcm4gdTMyIFg4NkFQSSByZGwodTMyIGFkZHIpOwotZXh0ZXJuIHZvaWQgWDg2QVBJIHdyYih1MzIgYWRkciwgdTggdmFsKTsKLWV4dGVybiB2b2lkIFg4NkFQSSB3cncodTMyIGFkZHIsIHUxNiB2YWwpOwotZXh0ZXJuIHZvaWQgWDg2QVBJIHdybCh1MzIgYWRkciwgdTMyIHZhbCk7Ci0KLSNwcmFnbWEgcGFjaygpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHZvaWQgKFg4NkFQSVAgWDg2RU1VX2ludHJGdW5jcykoaW50IG51bSk7Ci1leHRlcm4gWDg2RU1VX2ludHJGdW5jcyBfWDg2RU1VX2ludHJUYWJbMjU2XTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KLSNlbmRpZgotCi12b2lkICAgIFg4NkVNVV9zZXR1cE1lbUZ1bmNzKFg4NkVNVV9tZW1GdW5jcyAqZnVuY3MpOwotdm9pZCAgICBYODZFTVVfc2V0dXBQaW9GdW5jcyhYODZFTVVfcGlvRnVuY3MgKmZ1bmNzKTsKLXZvaWQgICAgWDg2RU1VX3NldHVwSW50ckZ1bmNzKFg4NkVNVV9pbnRyRnVuY3MgZnVuY3NbXSk7Ci12b2lkICAgIFg4NkVNVV9wcmVwYXJlRm9ySW50KGludCBudW0pOwotCi0vKiBkZWNvZGUuYyAqLwotCi12b2lkICAgIFg4NkVNVV9leGVjKHZvaWQpOwotdm9pZCAgICBYODZFTVVfaGFsdF9zeXModm9pZCk7Ci0KLSNpZmRlZiAgREVCVUcKLSNkZWZpbmUgSEFMVF9TWVMoKSAgXAotICAgIHByaW50aygiaGFsdF9zeXM6IGZpbGUgJXMsIGxpbmUgJWRcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyksIFwKLSAgICBYODZFTVVfaGFsdF9zeXMoKQotI2Vsc2UKLSNkZWZpbmUgSEFMVF9TWVMoKSAgWDg2RU1VX2hhbHRfc3lzKCkKLSNlbmRpZgotCi0vKiBEZWJ1ZyBvcHRpb25zICovCi0KLSNkZWZpbmUgREVCVUdfREVDT0RFX0YgICAgICAgICAgMHgwMDAxICAvKiBwcmludCBkZWNvZGVkIGluc3RydWN0aW9uICAqLwotI2RlZmluZSBERUJVR19UUkFDRV9GICAgICAgICAgICAweDAwMDIgIC8qIGR1bXAgcmVncyBiZWZvcmUvYWZ0ZXIgZXhlY3V0aW9uICovCi0jZGVmaW5lIERFQlVHX1NURVBfRiAgICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBERUJVR19ESVNBU1NFTUJMRV9GICAgICAweDAwMDgKLSNkZWZpbmUgREVCVUdfQlJFQUtfRiAgICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIERFQlVHX1NWQ19GICAgICAgICAgICAgIDB4MDAyMAotI2RlZmluZSBERUJVR19TQVZFX0NTX0lQICAgICAgICAweDAwNDAKLSNkZWZpbmUgREVCVUdfRlNfRiAgICAgICAgICAgICAgMHgwMDgwCi0jZGVmaW5lIERFQlVHX1BST0NfRiAgICAgICAgICAgIDB4MDEwMAotI2RlZmluZSBERUJVR19TWVNJTlRfRiAgICAgICAgICAweDAyMDAgLyogYmlvcyBzeXN0ZW0gaW50ZXJydXB0cy4gKi8KLSNkZWZpbmUgREVCVUdfVFJBQ0VDQUxMX0YgICAgICAgMHgwNDAwCi0jZGVmaW5lIERFQlVHX0lOU1RSVU1FTlRfRiAgICAgIDB4MDgwMAotI2RlZmluZSBERUJVR19NRU1fVFJBQ0VfRiAgICAgICAweDEwMDAKLSNkZWZpbmUgREVCVUdfSU9fVFJBQ0VfRiAgICAgICAgMHgyMDAwCi0jZGVmaW5lIERFQlVHX1RSQUNFQ0FMTF9SRUdTX0YgIDB4NDAwMAotI2RlZmluZSBERUJVR19ERUNPREVfTk9QUklOVF9GICAweDgwMDAKLSNkZWZpbmUgREVCVUdfRVhJVCAgICAgICAgICAgICAgMHgxMDAwMAotI2RlZmluZSBERUJVR19TWVNfRiAgICAgICAgICAgICAoREVCVUdfU1ZDX0Z8REVCVUdfRlNfRnxERUJVR19QUk9DX0YpCi0KLXZvaWQgICAgWDg2RU1VX3RyYWNlX3JlZ3Modm9pZCk7Ci12b2lkICAgIFg4NkVNVV90cmFjZV94cmVncyh2b2lkKTsKLXZvaWQgICAgWDg2RU1VX2R1bXBfbWVtb3J5KHUxNiBzZWcsIHUxNiBvZmYsIHUzMiBhbXQpOwotaW50ICAgICBYODZFTVVfdHJhY2Vfb24odm9pZCk7Ci1pbnQgICAgIFg4NkVNVV90cmFjZV9vZmYodm9pZCk7Ci0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgICAgICovCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fWDg2RU1VX1g4NkVNVV9IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11L2ZwdV9yZWdzLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11L2ZwdV9yZWdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3N2IwM2MuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS9mcHVfcmVncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBGUFUgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fWDg2RU1VX0ZQVV9SRUdTX0gKLSNkZWZpbmUgX19YODZFTVVfRlBVX1JFR1NfSAotCi0jaWZkZWYgWDg2X0ZQVV9TVVBQT1JUCi0KLSNwcmFnbWEgcGFjaygxKQotCi0vKiBCYXNpYyA4MDg3IHJlZ2lzdGVyIGNhbiBob2xkIGFueSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogKi8KLQotdW5pb24geDg2X2ZwdV9yZWdfdSB7Ci0gICAgczggICAgICAgICAgICAgICAgICB0ZW5ieXRlc1sxMF07Ci0gICAgZG91YmxlICAgICAgICAgICAgICBkdmFsOwotICAgIGZsb2F0ICAgICAgICAgICAgICAgZnZhbDsKLSAgICBzMTYgICAgICAgICAgICAgICAgIHN2YWw7Ci0gICAgczMyICAgICAgICAgICAgICAgICBsdmFsOwotICAgIH07Ci0KLXN0cnVjdCB4ODZfZnB1X3JlZyB7Ci0gICAgdW5pb24geDg2X2ZwdV9yZWdfdSByZWc7Ci0gICAgY2hhciAgICAgICAgICAgICAgICB0YWc7Ci0gICAgfTsKLQotLyoKLSAqIFNpbmNlIHdlIGFyZSBub3QgZ29pbmcgdG8gd29ycnkgYWJvdXQgdGhlIHByb2JsZW1zIG9mIGFsaWFzaW5nCi0gKiByZWdpc3RlcnMsIGV2ZXJ5IHRpbWUgYSByZWdpc3RlciBpcyBtb2RpZmllZCwgaXRzIHJlc3VsdCB0eXBlIGlzCi0gKiBzZXQgaW4gdGhlIHRhZyBmaWVsZHMgZm9yIHRoYXQgcmVnaXN0ZXIuICBJZiBzb21lIG9wZXJhdGlvbgotICogYXR0ZW1wdHMgdG8gYWNjZXNzIHRoZSB0eXBlIGluIGEgd2F5IGluY29uc2lzdGVudCB3aXRoIGl0cyBjdXJyZW50Ci0gKiBzdG9yYWdlIGZvcm1hdCwgdGhlbiB3ZSBmbGFnIHRoZSBvcGVyYXRpb24uICBJZiBjb21tb24sIHdlJ2xsCi0gKiBhdHRlbXB0IHRoZSBjb252ZXJzaW9uLgotICovCi0KLSNkZWZpbmUgIFg4Nl9GUFVfVkFMSUQgICAgICAgICAgMHg4MAotI2RlZmluZSAgWDg2X0ZQVV9SRUdUWVAocikgICAgICAoKHIpICYgMHg3RikKLQotI2RlZmluZSAgWDg2X0ZQVV9XT1JEICAgICAgICAgICAweDAKLSNkZWZpbmUgIFg4Nl9GUFVfU0hPUlQgICAgICAgICAgMHgxCi0jZGVmaW5lICBYODZfRlBVX0xPTkcgICAgICAgICAgIDB4MgotI2RlZmluZSAgWDg2X0ZQVV9GTE9BVCAgICAgICAgICAweDMKLSNkZWZpbmUgIFg4Nl9GUFVfRE9VQkxFICAgICAgICAgMHg0Ci0jZGVmaW5lICBYODZfRlBVX0xEQkwgICAgICAgICAgIDB4NQotI2RlZmluZSAgWDg2X0ZQVV9CU0QgICAgICAgICAgICAweDYKLQotI2RlZmluZSAgWDg2X0ZQVV9TVEtUT1AgIDAKLQotc3RydWN0IHg4Nl9mcHVfcmVnaXN0ZXJzIHsKLSAgICBzdHJ1Y3QgeDg2X2ZwdV9yZWcgIHg4Nl9mcHVfc3RhY2tbOF07Ci0gICAgaW50ICAgICAgICAgICAgICAgICB4ODZfZnB1X2ZsYWdzOwotICAgIGludCAgICAgICAgICAgICAgICAgeDg2X2ZwdV9jb25maWc7ICAgICAgICAgLyogcm91bmRpbmcgbW9kZXMsIGV0Yy4gKi8KLSAgICBzaG9ydCAgICAgICAgICAgICAgIHg4Nl9mcHVfdG9zLCB4ODZfZnB1X2JvczsKLSAgICB9OwotCi0jcHJhZ21hIHBhY2soKQotCi0vKgotICogVGhlcmUgYXJlIHR3byB2ZXJzaW9ucyBvZiB0aGUgZm9sbG93aW5nIG1hY3JvLgotICoKLSAqIE9uZSB2ZXJzaW9uIGlzIGZvciBvcGNvZGUgRDksIGZvciB3aGljaCB0aGVyZSBhcmUgbW9yZSB0aGFuIDMyCi0gKiBpbnN0cnVjdGlvbnMgZW5jb2RlZCBpbiB0aGUgc2Vjb25kIGJ5dGUgb2YgdGhlIG9wY29kZS4KLSAqCi0gKiBUaGUgb3RoZXIgdmVyc2lvbiwgZGVhbHMgd2l0aCBhbGwgdGhlIG90aGVyIDcgaTg3IG9wY29kZXMsIGZvcgotICogd2hpY2ggdGhlcmUgYXJlIG9ubHkgMzIgc3RyaW5ncyBuZWVkZWQgdG8gZGVzY3JpYmUgdGhlCi0gKiBpbnN0cnVjdGlvbnMuCi0gKi8KLQotI2VuZGlmIC8qIFg4Nl9GUFVfU1VQUE9SVCAqLwotCi0jaWZkZWYgREVCVUcKLSMgZGVmaW5lIERFQ09ERV9QUklOVElOU1RSMzIodCxtb2QscmgscmwpICAgICAgIFwKLSAgICBERUNPREVfUFJJTlRGKHRbKG1vZDw8MykrKHJoKV0pOwotIyBkZWZpbmUgREVDT0RFX1BSSU5USU5TVFIyNTYodCxtb2QscmgscmwpICAgICAgXAotICAgIERFQ09ERV9QUklOVEYodFsobW9kPDw2KSsocmg8PDMpKyhybCldKTsKLSNlbHNlCi0jIGRlZmluZSBERUNPREVfUFJJTlRJTlNUUjMyKHQsbW9kLHJoLHJsKQotIyBkZWZpbmUgREVDT0RFX1BSSU5USU5TVFIyNTYodCxtb2QscmgscmwpCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fWDg2RU1VX0ZQVV9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS94ODZlbXUvcmVncy5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS9yZWdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMjAxN2IuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS9yZWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHg4NiByZWdpc3RlciBkZWZpbml0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19YODZFTVVfUkVHU19ICi0jZGVmaW5lIF9fWDg2RU1VX1JFR1NfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIHBhY2soMSkKLQotLyoKLSAqIEdlbmVyYWwgRUFYLCBFQlgsIEVDWCwgRURYIHR5cGUgcmVnaXN0ZXJzLiAgTm90ZSB0aGF0IGZvcgotICogcG9ydGFiaWxpdHksIGFuZCBzcGVlZCwgdGhlIGlzc3VlIG9mIGJ5dGUgc3dhcHBpbmcgaXMgbm90IGFkZHJlc3NlZAotICogaW4gdGhlIHJlZ2lzdGVycy4gIEFsbCByZWdpc3RlcnMgYXJlIHN0b3JlZCBpbiB0aGUgZGVmYXVsdCBmb3JtYXQKLSAqIGF2YWlsYWJsZSBvbiB0aGUgaG9zdCBtYWNoaW5lLiAgVGhlIG9ubHkgY3JpdGljYWwgaXNzdWUgaXMgdGhhdCB0aGUKLSAqIHJlZ2lzdGVycyBzaG91bGQgbGluZSB1cCBFWEFDVExZIGluIHRoZSBzYW1lIG1hbm5lciBhcyB0aGV5IGRvIGluCi0gKiB0aGUgMzg2LiAgVGhhdCBpczoKLSAqCi0gKiBFQVggJiAweGZmICA9PT0gQUwKLSAqIEVBWCAmIDB4ZmZmZiA9PSBBWAotICoKLSAqIGV0Yy4gIFRoZSByZXN1bHQgaXMgdGhhdCBhbG90IG9mIHRoZSBjYWxjdWxhdGlvbnMgY2FuIHRoZW4gYmUKLSAqIGRvbmUgdXNpbmcgdGhlIG5hdGl2ZSBpbnN0cnVjdGlvbiBzZXQgZnVsbHkuCi0gKi8KLQotI2lmZGVmICBfX0JJR19FTkRJQU5fXwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdTMyIGVfcmVnOwotICAgIH0gSTMyX3JlZ190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdTE2IGZpbGxlcjAsIHhfcmVnOwotICAgIH0gSTE2X3JlZ190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdTggZmlsbGVyMCwgZmlsbGVyMSwgaF9yZWcsIGxfcmVnOwotICAgIH0gSThfcmVnX3Q7Ci0KLSNlbHNlIC8qICFfX0JJR19FTkRJQU5fXyAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdTMyIGVfcmVnOwotICAgIH0gSTMyX3JlZ190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdTE2IHhfcmVnOwotICAgIH0gSTE2X3JlZ190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdTggbF9yZWcsIGhfcmVnOwotICAgIH0gSThfcmVnX3Q7Ci0KLSNlbmRpZiAvKiBCSUdfRU5ESUFOICovCi0KLXR5cGVkZWYgdW5pb24gewotICAgIEkzMl9yZWdfdCAgIEkzMl9yZWc7Ci0gICAgSTE2X3JlZ190ICAgSTE2X3JlZzsKLSAgICBJOF9yZWdfdCAgICBJOF9yZWc7Ci0gICAgfSBpMzg2X2dlbmVyYWxfcmVnaXN0ZXI7Ci0KLXN0cnVjdCBpMzg2X2dlbmVyYWxfcmVncyB7Ci0gICAgaTM4Nl9nZW5lcmFsX3JlZ2lzdGVyIEEsIEIsIEMsIEQ7Ci0gICAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgaTM4Nl9nZW5lcmFsX3JlZ3MgR2VuX3JlZ190OwotCi1zdHJ1Y3QgaTM4Nl9zcGVjaWFsX3JlZ3MgewotICAgIGkzODZfZ2VuZXJhbF9yZWdpc3RlciBTUCwgQlAsIFNJLCBESSwgSVA7Ci0gICAgdTMyIEZMQUdTOwotICAgIH07Ci0KLS8qCi0gKiBTZWdtZW50IHJlZ2lzdGVycyBoZXJlIHJlcHJlc2VudCB0aGUgMTYgYml0IHF1YW50aXRpZXMKLSAqIENTLCBEUywgRVMsIFNTLgotICovCi0KLXN0cnVjdCBpMzg2X3NlZ21lbnRfcmVncyB7Ci0gICAgdTE2IENTLCBEUywgU1MsIEVTLCBGUywgR1M7Ci0gICAgfTsKLQotLyogOCBiaXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFJfQUggIGdlbi5BLkk4X3JlZy5oX3JlZwotI2RlZmluZSBSX0FMICBnZW4uQS5JOF9yZWcubF9yZWcKLSNkZWZpbmUgUl9CSCAgZ2VuLkIuSThfcmVnLmhfcmVnCi0jZGVmaW5lIFJfQkwgIGdlbi5CLkk4X3JlZy5sX3JlZwotI2RlZmluZSBSX0NIICBnZW4uQy5JOF9yZWcuaF9yZWcKLSNkZWZpbmUgUl9DTCAgZ2VuLkMuSThfcmVnLmxfcmVnCi0jZGVmaW5lIFJfREggIGdlbi5ELkk4X3JlZy5oX3JlZwotI2RlZmluZSBSX0RMICBnZW4uRC5JOF9yZWcubF9yZWcKLQotLyogMTYgYml0IHJlZ2lzdGVycyAqLwotI2RlZmluZSBSX0FYICBnZW4uQS5JMTZfcmVnLnhfcmVnCi0jZGVmaW5lIFJfQlggIGdlbi5CLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9DWCAgZ2VuLkMuSTE2X3JlZy54X3JlZwotI2RlZmluZSBSX0RYICBnZW4uRC5JMTZfcmVnLnhfcmVnCi0KLS8qIDMyIGJpdCBleHRlbmRlZCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUl9FQVggIGdlbi5BLkkzMl9yZWcuZV9yZWcKLSNkZWZpbmUgUl9FQlggIGdlbi5CLkkzMl9yZWcuZV9yZWcKLSNkZWZpbmUgUl9FQ1ggIGdlbi5DLkkzMl9yZWcuZV9yZWcKLSNkZWZpbmUgUl9FRFggIGdlbi5ELkkzMl9yZWcuZV9yZWcKLQotLyogc3BlY2lhbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUl9TUCAgc3BjLlNQLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9CUCAgc3BjLkJQLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9TSSAgc3BjLlNJLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9ESSAgc3BjLkRJLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9JUCAgc3BjLklQLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9GTEcgc3BjLkZMQUdTCi0KLS8qIHNwZWNpYWwgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFJfU1AgIHNwYy5TUC5JMTZfcmVnLnhfcmVnCi0jZGVmaW5lIFJfQlAgIHNwYy5CUC5JMTZfcmVnLnhfcmVnCi0jZGVmaW5lIFJfU0kgIHNwYy5TSS5JMTZfcmVnLnhfcmVnCi0jZGVmaW5lIFJfREkgIHNwYy5ESS5JMTZfcmVnLnhfcmVnCi0jZGVmaW5lIFJfSVAgIHNwYy5JUC5JMTZfcmVnLnhfcmVnCi0jZGVmaW5lIFJfRkxHIHNwYy5GTEFHUwotCi0vKiBzcGVjaWFsIHJlZ2lzdGVycyAqLwotI2RlZmluZSBSX0VTUCAgc3BjLlNQLkkzMl9yZWcuZV9yZWcKLSNkZWZpbmUgUl9FQlAgIHNwYy5CUC5JMzJfcmVnLmVfcmVnCi0jZGVmaW5lIFJfRVNJICBzcGMuU0kuSTMyX3JlZy5lX3JlZwotI2RlZmluZSBSX0VESSAgc3BjLkRJLkkzMl9yZWcuZV9yZWcKLSNkZWZpbmUgUl9FSVAgIHNwYy5JUC5JMzJfcmVnLmVfcmVnCi0jZGVmaW5lIFJfRUZMRyBzcGMuRkxBR1MKLQotLyogc2VnbWVudCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUl9DUyAgc2VnLkNTCi0jZGVmaW5lIFJfRFMgIHNlZy5EUwotI2RlZmluZSBSX1NTICBzZWcuU1MKLSNkZWZpbmUgUl9FUyAgc2VnLkVTCi0jZGVmaW5lIFJfRlMgIHNlZy5GUwotI2RlZmluZSBSX0dTICBzZWcuR1MKLQotLyogZmxhZyBjb25kaXRpb25zICAgKi8KLSNkZWZpbmUgRkJfQ0YgMHgwMDAxICAgICAgICAgICAgLyogQ0FSUlkgZmxhZyAgKi8KLSNkZWZpbmUgRkJfUEYgMHgwMDA0ICAgICAgICAgICAgLyogUEFSSVRZIGZsYWcgKi8KLSNkZWZpbmUgRkJfQUYgMHgwMDEwICAgICAgICAgICAgLyogQVVYICBmbGFnICAgKi8KLSNkZWZpbmUgRkJfWkYgMHgwMDQwICAgICAgICAgICAgLyogWkVSTyBmbGFnICAgKi8KLSNkZWZpbmUgRkJfU0YgMHgwMDgwICAgICAgICAgICAgLyogU0lHTiBmbGFnICAgKi8KLSNkZWZpbmUgRkJfVEYgMHgwMTAwICAgICAgICAgICAgLyogVFJBUCBmbGFnICAgKi8KLSNkZWZpbmUgRkJfSUYgMHgwMjAwICAgICAgICAgICAgLyogSU5URVJSVVBUIEVOQUJMRSBmbGFnICovCi0jZGVmaW5lIEZCX0RGIDB4MDQwMCAgICAgICAgICAgIC8qIERJUiBmbGFnICAgICovCi0jZGVmaW5lIEZCX09GIDB4MDgwMCAgICAgICAgICAgIC8qIE9WRVJGTE9XIGZsYWcgKi8KLQotLyogODAyODYgYW5kIGFib3ZlIGFsd2F5cyBoYXZlIGJpdCMxIHNldCAqLwotI2RlZmluZSBGX0FMV0FZU19PTiAgKDB4MDAwMikgICAvKiBmbGFnIGJpdHMgYWx3YXlzIG9uICovCi0KLS8qCi0gKiBEZWZpbmUgYSBtYXNrIGZvciBvbmx5IHRob3NlIGZsYWcgYml0cyB3ZSB3aWxsIGV2ZXIgcGFzcyBiYWNrCi0gKiAodmlhIFBVU0hGKQotICovCi0jZGVmaW5lIEZfTVNLIChGQl9DRnxGQl9QRnxGQl9BRnxGQl9aRnxGQl9TRnxGQl9URnxGQl9JRnxGQl9ERnxGQl9PRikKLQotLyogZm9sbG93aW5nIGJpdHMgbWFza2VkIGluIHRvIGEgMTZiaXQgcXVhbnRpdHkgKi8KLQotI2RlZmluZSBGX0NGIDB4MDAwMSAgICAgICAgICAgICAvKiBDQVJSWSBmbGFnICAqLwotI2RlZmluZSBGX1BGIDB4MDAwNCAgICAgICAgICAgICAvKiBQQVJJVFkgZmxhZyAqLwotI2RlZmluZSBGX0FGIDB4MDAxMCAgICAgICAgICAgICAvKiBBVVggIGZsYWcgICAqLwotI2RlZmluZSBGX1pGIDB4MDA0MCAgICAgICAgICAgICAvKiBaRVJPIGZsYWcgICAqLwotI2RlZmluZSBGX1NGIDB4MDA4MCAgICAgICAgICAgICAvKiBTSUdOIGZsYWcgICAqLwotI2RlZmluZSBGX1RGIDB4MDEwMCAgICAgICAgICAgICAvKiBUUkFQIGZsYWcgICAqLwotI2RlZmluZSBGX0lGIDB4MDIwMCAgICAgICAgICAgICAvKiBJTlRFUlJVUFQgRU5BQkxFIGZsYWcgKi8KLSNkZWZpbmUgRl9ERiAweDA0MDAgICAgICAgICAgICAgLyogRElSIGZsYWcgICAgKi8KLSNkZWZpbmUgRl9PRiAweDA4MDAgICAgICAgICAgICAgLyogT1ZFUkZMT1cgZmxhZyAqLwotCi0jZGVmaW5lIFRPR0dMRV9GTEFHKGZsYWcpICAgICAgIChNLng4Ni5SX0ZMRyBePSAoZmxhZykpCi0jZGVmaW5lIFNFVF9GTEFHKGZsYWcpICAgICAgICAgIChNLng4Ni5SX0ZMRyB8PSAoZmxhZykpCi0jZGVmaW5lIENMRUFSX0ZMQUcoZmxhZykgICAgICAgIChNLng4Ni5SX0ZMRyAmPSB+KGZsYWcpKQotI2RlZmluZSBBQ0NFU1NfRkxBRyhmbGFnKSAgICAgICAoTS54ODYuUl9GTEcgJiAoZmxhZykpCi0jZGVmaW5lIENMRUFSQUxMX0ZMQUcobSkgICAgICAgIChNLng4Ni5SX0ZMRyA9IDApCi0KLSNkZWZpbmUgQ09ORElUSU9OQUxfU0VUX0ZMQUcoQ09ORCxGTEFHKSBcCi0gIGlmIChDT05EKSBTRVRfRkxBRyhGTEFHKTsgZWxzZSBDTEVBUl9GTEFHKEZMQUcpCi0KLSNkZWZpbmUgRl9QRl9DQUxDIDB4MDEwMDAwICAgICAgLyogUEFSSVRZIGZsYWcgaGFzIGJlZW4gY2FsY2VkICAgICovCi0jZGVmaW5lIEZfWkZfQ0FMQyAweDAyMDAwMCAgICAgIC8qIFpFUk8gZmxhZyBoYXMgYmVlbiBjYWxjZWQgICAgICAqLwotI2RlZmluZSBGX1NGX0NBTEMgMHgwNDAwMDAgICAgICAvKiBTSUdOIGZsYWcgaGFzIGJlZW4gY2FsY2VkICAgICAgKi8KLQotI2RlZmluZSBGX0FMTF9DQUxDICAgICAgMHhmZjAwMDAgICAgICAgIC8qIEFsbCBoYXZlIGJlZW4gY2FsY2VkICAgKi8KLQotLyoKLSAqIEVtdWxhdG9yIG1hY2hpbmUgc3RhdGUuCi0gKiBTZWdtZW50IHVzYWdlIGNvbnRyb2wuCi0gKi8KLSNkZWZpbmUgU1lTTU9ERV9TRUdfRFNfU1MgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTWVNNT0RFX1NFR09WUl9DUyAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFNZU01PREVfU0VHT1ZSX0RTICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgU1lTTU9ERV9TRUdPVlJfRVMgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBTWVNNT0RFX1NFR09WUl9GUyAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIFNZU01PREVfU0VHT1ZSX0dTICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgU1lTTU9ERV9TRUdPVlJfU1MgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBTWVNNT0RFX1BSRUZJWF9SRVBFICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIFNZU01PREVfUFJFRklYX1JFUE5FICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgU1lTTU9ERV9QUkVGSVhfREFUQSAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBTWVNNT0RFX1BSRUZJWF9BRERSICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIFNZU01PREVfSU5UUl9QRU5ESU5HICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgU1lTTU9ERV9FWFRSTl9JTlRSICAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBTWVNNT0RFX0hBTFRFRCAgICAgICAgICAweDQwMDAwMDAwCi0KLSNkZWZpbmUgU1lTTU9ERV9TRUdNQVNLIChTWVNNT0RFX1NFR19EU19TUyAgICAgIHwgXAotCQkJIFNZU01PREVfU0VHT1ZSX0NTICAgICAgfCBcCi0JCQkgU1lTTU9ERV9TRUdPVlJfRFMgICAgICB8IFwKLQkJCSBTWVNNT0RFX1NFR09WUl9FUyAgICAgIHwgXAotCQkJIFNZU01PREVfU0VHT1ZSX0ZTICAgICAgfCBcCi0JCQkgU1lTTU9ERV9TRUdPVlJfR1MgICAgICB8IFwKLQkJCSBTWVNNT0RFX1NFR09WUl9TUykKLSNkZWZpbmUgU1lTTU9ERV9DTFJNQVNLIChTWVNNT0RFX1NFR19EU19TUyAgICAgIHwgXAotCQkJIFNZU01PREVfU0VHT1ZSX0NTICAgICAgfCBcCi0JCQkgU1lTTU9ERV9TRUdPVlJfRFMgICAgICB8IFwKLQkJCSBTWVNNT0RFX1NFR09WUl9FUyAgICAgIHwgXAotCQkJIFNZU01PREVfU0VHT1ZSX0ZTICAgICAgfCBcCi0JCQkgU1lTTU9ERV9TRUdPVlJfR1MgICAgICB8IFwKLQkJCSBTWVNNT0RFX1NFR09WUl9TUyAgICAgIHwgXAotCQkJIFNZU01PREVfUFJFRklYX0RBVEEgICAgfCBcCi0JCQkgU1lTTU9ERV9QUkVGSVhfQUREUikKLQotI2RlZmluZSAgSU5UUl9TWU5DSCAgICAgICAgICAgMHgxCi0jZGVmaW5lICBJTlRSX0FTWU5DSCAgICAgICAgICAweDIKLSNkZWZpbmUgIElOVFJfSEFMVEVEICAgICAgICAgIDB4NAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc3RydWN0IGkzODZfZ2VuZXJhbF9yZWdzICAgIGdlbjsKLSAgICBzdHJ1Y3QgaTM4Nl9zcGVjaWFsX3JlZ3MgICAgc3BjOwotICAgIHN0cnVjdCBpMzg2X3NlZ21lbnRfcmVncyAgICBzZWc7Ci0gICAgLyoKLSAgICAgKiBNT0RFIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uOgotICAgICAqICBSRVBFIHByZWZpeCAgICAgICAgICAgICAyIGJpdHMgIHJlcGUscmVwbmUKLSAgICAgKiAgU0VHTUVOVCBvdmVycmlkZXMgICAgICAgNSBiaXRzICBub3JtYWwsRFMsU1MsQ1MsRVMKLSAgICAgKiAgRGVsYXllZCBmbGFnIHNldCAgICAgICAgMyBiaXRzICAoemVybywgc2lnbmVkLCBwYXJpdHkpCi0gICAgICogIHJlc2VydmVkICAgICAgICAgICAgICAgIDYgYml0cwotICAgICAqICBpbnRlcnJ1cHQgIyAgICAgICAgICAgICA4IGJpdHMgIGluc3RydWN0aW9uIHJhaXNlZCBpbnRlcnJ1cHQKLSAgICAgKiAgQklPUyB2aWRlbyBzZWdyZWdzICAgICAgNCBiaXRzCi0gICAgICogIEludGVycnVwdCBQZW5kaW5nICAgICAgIDEgYml0cwotICAgICAqICBFeHRlcm4gaW50ZXJydXB0ICAgICAgICAxIGJpdHMKLSAgICAgKiAgSGFsdGVkICAgICAgICAgICAgICAgICAgMSBiaXRzCi0gICAgICovCi0gICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU7Ci0gICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgIGludG5vOwotICAgIHZvbGF0aWxlIGludCAgICAgICAgICAgICAgICBpbnRyOyAgIC8qIG1hc2sgb2YgcGVuZGluZyBpbnRlcnJ1cHRzICovCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnOwotI2lmZGVmIERFQlVHCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrOwotICAgIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZF9pcDsKLSAgICB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRfY3M7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGVuY19wb3M7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGVuY19zdHJfcG9zOwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfYnVmWzMyXTsgLyogZW5jb2RlZCBieXRlIHN0cmVhbSAgKi8KLSAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZF9idWZbMjU2XTsgLyogZGlzYXNzZW1ibGVkIHN0cmluZ3MgKi8KLSNlbmRpZgotICAgIH0gWDg2RU1VX3JlZ3M7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RydWN0dXJlIG1haW50YWluaW5nIHRoZSBlbXVsYXRvciBtYWNoaW5lIHN0YXRlLgotCi1NRU1CRVJTOgoteDg2ICAgICAgICAgICAgIC0gWDg2IHJlZ2lzdGVycwotbWVtX2Jhc2UgICAgICAgIC0gQmFzZSByZWFsIG1vZGUgbWVtb3J5IGZvciB0aGUgZW11bGF0b3IKLW1lbV9zaXplICAgICAgICAtIFNpemUgb2YgdGhlIHJlYWwgbW9kZSBtZW1vcnkgYmxvY2sgZm9yIHRoZSBlbXVsYXRvcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBYODZFTVVfcmVncyAgICAgeDg2OwotICAgIHVuc2lnbmVkIGxvbmcgICBtZW1fYmFzZTsKLSAgICB1bnNpZ25lZCBsb25nICAgbWVtX3NpemU7Ci0gICAgdm9pZCogICAgICAgICAgIHByaXZhdGU7Ci0gICAgfSBYODZFTVVfc3lzRW52OwotCi0jcHJhZ21hIHBhY2soKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLS8qIEdsb2JhbCBlbXVsYXRvciBtYWNoaW5lIHN0YXRlLgotICoKLSAqIFdlIGtlZXAgaXQgZ2xvYmFsIHRvIGF2b2lkIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGluIHRoZSBjb2RlIGZvciBzcGVlZC4KLSAqLwotCi1leHRlcm4gICAgWDg2RU1VX3N5c0VudiBfWDg2RU1VX2VudjsKLSNkZWZpbmUgICBNICAgICAgICAgICAgIF9YODZFTVVfZW52Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEZ1bmN0aW9uIHRvIGxvZyBpbmZvcm1hdGlvbiBhdCBydW50aW1lICovCi0KLS8qdm9pZCAgICBwcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pOyAqLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICAgICAqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX1g4NkVNVV9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS94ODZlbXUvdHlwZXMuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS94ODZlbXUvdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGExN2M1NC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11L3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgeDg2IGVtdWxhdG9yIHR5cGUgZGVmaW5pdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fWDg2RU1VX1RZUEVTX0gKLSNkZWZpbmUgX19YODZFTVVfVFlQRVNfSAotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEN1cnJlbnRseSBvbmx5IGZvciBMaW51eC8zMmJpdCAqLwotI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKE5PX0xPTkdfTE9ORykKLSNkZWZpbmUgX19IQVNfTE9OR19MT05HX18KLSNlbmRpZgotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgdTg7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgdTE2OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIHUzMjsKLSNpZmRlZiBfX0hBU19MT05HX0xPTkdfXwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgIHU2NDsKLSNlbmRpZgotCi10eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgczg7Ci10eXBlZGVmIHNob3J0ICAgICAgICAgICAgICAgczE2OwotdHlwZWRlZiBsb25nICAgICAgICAgICAgICAgIHMzMjsKLSNpZmRlZiBfX0hBU19MT05HX0xPTkdfXwotdHlwZWRlZiBsb25nIGxvbmcgICAgICAgICAgIHM2NDsKLSNlbmRpZgotCi0vKnR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgdWludDsqLwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgIHNpbnQ7Ci0KLXR5cGVkZWYgdTE2IFg4NkVNVV9waW9BZGRyOwotCi0jZW5kaWYgIC8qIF9fWDg2RU1VX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL2RlYnVnL2xpbnV4L2djYy9nbGliYy5zby9yZWFkbWUudHh0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2dsaWJjLnNvL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODdlZmYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2dsaWJjLnNvL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGZpbGUgaXMganVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9kZWJ1Zy9saW51eC9nY2MvZ2xpYmMvcmVhZG1lLnR4dCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL2RlYnVnL2xpbnV4L2djYy9nbGliYy9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDg3ZWZmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL2RlYnVnL2xpbnV4L2djYy9nbGliYy9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGhpcyBmaWxlIGlzIGp1c3QgdG8gZW5zdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBpcyBjcmVhdGVkLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2xpYmMuc28vcmVhZG1lLnR4dCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL2RlYnVnL2xpbnV4L2djYy9saWJjLnNvL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODdlZmYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2xpYmMuc28vcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgZmlsZSBpcyBqdXN0IHRvIGVuc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgY3JlYXRlZC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL2RlYnVnL2xpbnV4L2djYy9saWJjL3JlYWRtZS50eHQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9kZWJ1Zy9saW51eC9nY2MvbGliYy9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDg3ZWZmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL2RlYnVnL2xpbnV4L2djYy9saWJjL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGZpbGUgaXMganVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9nbGliYy5zby9yZWFkbWUudHh0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvcmVsZWFzZS9saW51eC9nY2MvZ2xpYmMuc28vcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4N2VmZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9nbGliYy5zby9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGhpcyBmaWxlIGlzIGp1c3QgdG8gZW5zdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBpcyBjcmVhdGVkLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvcmVsZWFzZS9saW51eC9nY2MvZ2xpYmMvcmVhZG1lLnR4dCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL3JlbGVhc2UvbGludXgvZ2NjL2dsaWJjL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODdlZmYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvcmVsZWFzZS9saW51eC9nY2MvZ2xpYmMvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgZmlsZSBpcyBqdXN0IHRvIGVuc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgY3JlYXRlZC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL3JlbGVhc2UvbGludXgvZ2NjL2xpYmMuc28vcmVhZG1lLnR4dCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL3JlbGVhc2UvbGludXgvZ2NjL2xpYmMuc28vcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4N2VmZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9saWJjLnNvL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGZpbGUgaXMganVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9saWJjL3JlYWRtZS50eHQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9saWJjL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODdlZmYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvcmVsZWFzZS9saW51eC9nY2MvbGliYy9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGhpcyBmaWxlIGlzIGp1c3QgdG8gZW5zdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBpcyBjcmVhdGVkLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iYzE2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iYzE2Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTRmZTc2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmMxNi5taworKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgQm9ybGFuZCBDKysgNC54IDE2IGJpdCB2ZXJzaW9uLiBTdXBwb3J0cyAxNiBiaXQgRE9TLAotIyAgICAgICAgICAgICAgIERQTUkxNiBET1MgZXh0ZW5kZXIgYW5kIDE2IGJpdCBXaW5kb3dzIGRldmVsb3BtZW50LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlCi0uSU1QT1JUIC5JR05PUkUgOiBVU0VfV0lOMTYgVVNFX0JDNSBCQ19MSUJCQVNFIFVTRV9XSU45NQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBiY2MKLSAgIENGTEFHUyAgICAgICA6PSAtbWwgLUg9YmNjLnN5bSAtaTYwIC1kIC1kYyAtNCAtZjI4NwotLklGICQoVVNFX1RBU00zMikKLSAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKLS5FTElGICQoVVNFX1RBU01YKQotICAgQVMgICAgICAgICAgIDo9IHRhc214Ci0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20KLS5FTkRJRgotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvaUlOQ0xVREUgL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0gICBMRCAgICAgICAgICAgOj0gYmNsaW5rIHRsaW5rLmV4ZQotICAgTERGTEFHUyAgICAgIDo9IC1jCi0gICBSQyAgICAgICAgICAgOj0gYnJjCi0gICBSQ0ZMQUdTICAgICAgOj0KLS5JRiAkKFVTRV9CQzUpCi0uSUYgJChVU0VfV0lOOTUpCi0gICBXSU5fVkVSU0lPTiAgOj0gLVY0LjAKLS5FTkRJRgotLkVORElGCi0gICBMSUJSICAgICAgICAgOj0gdGxpYgotICAgTElCRkxBR1MgICAgIDo9IC9DIC9QMzIKLSAgIElMSUIgICAgICAgICA6PSBpbXBsaWIKLSAgIElMSUJGTEFHUyAgICA6PSAtYwotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAtdgotICAgTERGTEFHUyAgICAgICs9IC12Ci0gICBBU0ZMQUdTICAgICAgKz0gL3ppCi0gICBMSUJGTEFHUyAgICAgKz0gL1AxMjgKLS5FTFNFCi0gICBMREZMQUdTICAgICAgKz0gLXgKLSAgIEFTRkxBR1MgICAgICArPSAvcQotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLU8yIC1rLQotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtTzEgLWstCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLURGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLURCRVRBCi0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGFzIFdpbjE2Ci0uSUYgJChVU0VfV0lOMTYpCi0uSUYgJChCVUlMRF9ETEwpCi0gICBDRkxBR1MgICAgICAgKz0gLVdEIC1Gcy0gLURCVUlMRF9ETEwKLSAgIEFTRkxBR1MgICAgICArPSAtREJVSUxEX0RMTAotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAtVyAtRnMtCi0uRU5ESUYKLSAgIERFRl9MSUJTCQk6PSBpbXBvcnQubGliIG1hdGh3bC5saWIgY3dsLmxpYgotICAgRFhfQVNGTEFHUyAgICs9IC1EX19XSU5ET1dTMTZfXwotICAgTElCX09TICAgICAgID0gV0lOMTYKLS5FTFNFCi0gICBVU0VfUkVBTERPUwk6PSAxCi0gICBERUZfTElCUyAgICAgOj0gbWF0aGwubGliIGZwODcubGliIGNsLmxpYgotICAgTElCX09TICAgICAgID0gRE9TMTYKLS5FTkQKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKFVTRV9EUE1JMTYpCi1QTUxJQiAgICAgICAgICAgOj0gZHBtaTE2XHBtLmxpYgotLkVMU0UKLVBNTElCICAgICAgICAgICA6PSBwbS5saWIKLS5FTkQKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChCQ19MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSBiYzE2Lm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2JjMy5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmMzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzNkODBlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmMzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBCb3JsYW5kIEMrKyAzLjEgdmVyc2lvbi4gU3VwcG9ydHMgMTYgYml0IERPUyBkZXZlbG9wbWVudC4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGJjYwotICAgQ0ZMQUdTICAgICAgIDo9IC1tbCAtSD1iY2Muc3ltIC1pNjAgLWQKLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteAotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtCi0uRU5ESUYKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0gICBMRCAgICAgICAgICAgOj0gYmNsaW5rIHRsaW5rLmV4ZQotICAgTERGTEFHUyAgICAgIDo9IC1jCi0gICBMSUIgICAgICAgICAgOj0gdGxpYgotICAgTElCRkxBR1MgICAgIDo9IC9DCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC12Ci0gICBMREZMQUdTICAgICAgKz0gLXYKLSAgIEFTRkxBR1MgICAgICArPSAvemkKLSAgIExJQkZMQUdTICAgICArPSAvUDEyOAotLkVMU0UKLSAgIExERkxBR1MgICAgICArPSAteAotICAgQVNGTEFHUyAgICAgICs9IC9xCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKLS5JRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAtMyAtTzIKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLTMgLU8xCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1mMjg3IC1ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLURGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLURCRVRBCi0uRU5ECi0gICBVU0VfUkVBTERPUwk6PSAxCi0KLSMgRGVmaW5lIHRoZSBkZWZhdWx0IGxpYnJhcmllcyB0byBsaW5rIHdpdGgKLSAgIERFRl9MSUJTCQk6PSBtYXRobC5saWIgY2wubGliCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFX0RJUilcZG9zMTZcYmMzCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSBiYzMubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmMzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmMzMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ2ZGUxZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2JjMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIEJvcmxhbmQgQysrIDQuMCAzMiBiaXQgdmVyc2lvbi4gU3VwcG9ydHMgQm9ybGFuZCdzIERPUyBQb3dlcgotIyAgICAgICAgICAgICAgIFBhY2sgRFBNSTMyIERPUyBleHRlbmRlciwgUGhhciBMYXAncyBUTlQgRE9TIEV4dGVuZGVyIGFuZAotIyAgICAgICAgICAgICAgIDMyIGJpdCBXaW5kb3dzIGRldmVsb3BtZW50LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlCi0uSU1QT1JUIC5JR05PUkUgOiBVU0VfU01YMzIgVVNFX1ROVCBVU0VfV0lOMzIgVVNFX0JDNSBVU0VfVlhEIEJDX0xJQkJBU0UKLS5JTVBPUlQgLklHTk9SRSA6IFZUT09MU0QKLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBiY2MzMgotLklGICQoVVNFX1ZYRCkKLSAgIENGTEFHUyAgICAgICA6PSAtNCAtaTYwIC1kIC13LXN0dQotLkVMU0UKLSAgIENGTEFHUyAgICAgICA6PSAtNCAtSD1iY2MzMi5zeW0gLWk2MCAtZCAtdy1zdHUKLS5FTkRJRgotLklGICQoVVNFX05BU00pCi0gICBBUwkJCTo9IG5hc20KLSAgIEFTRkxBR1MgICAgICA6PSAtdCAtZiBvYmogLWRfX0ZMQVRfXyAtaUlOQ0xVREUgLWkkKFNDSVRFQ0gpXElOQ0xVREUKLS5FTFNFCi0uSUYgJChVU0VfVEFTTTMyKQotICAgQVMgICAgICAgICAgIDo9IHRhc20zMgotLkVMSUYgJChVU0VfVEFTTVgpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbXgKLS5FTFNFCi0gICBBUyAgICAgICAgICAgOj0gdGFzbQotLkVORElGCi0gICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC93LXJlcyAvdy1tY3AgL0RfX0ZMQVRfXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLS5FTkRJRgotICAgTEQgICAgICAgICAgIDo9IGJjbGluayB0bGluazMyLmV4ZQotICAgTERGTEFHUyAgICAgIDo9IC1jCi0gICBSQyAgICAgICAgICAgOj0gYnJjMzIKLS5JRiAkKFVTRV9CQzUpCi0gICBXSU5fVkVSU0lPTiAgOj0gLVY0LjAKLSAgIFJDRkxBR1MgICAgICA6PSAtMzIKLS5FTFNFCi0gICBSQ0ZMQUdTICAgICAgOj0gLXczMgotLkVORElGCi0gICBMSUIgICAgICAgICAgOj0gdGxpYgotICAgTElCRkxBR1MgICAgIDo9IC9DCi0gICBJTElCICAgICAgICAgOj0gaW1wbGliCi0gICBJTElCRkxBR1MgICAgOj0gLWMKLSAgIElOVEVMX1g4Ngk6PSAxCi0gICBOTVNZTSAgIAkJOj0gJChTT0ZUSUNFX1BBVEgpXG5tc3ltLmV4ZQotICAgTk1TWU1GTEFHUwk6PSAvVFJBTlNMQVRFOnNvdXJjZSxwYWNrYWdlLGFsd2F5cyAvUFJPTVBUIC9TT1VSQ0U6JChTQ0lURUNIKVxzcmNccG07JChTQ0lURUNIKVxzcmNccG1cY29tbW9uOyQoU0NJVEVDSClcc3JjXHBtXHdpbjMyCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC12Ci0gICBMREZMQUdTICAgICAgKz0gLXYKLSAgIExJQkZMQUdTICAgICArPSAvUDI1NgotLklGICQoVVNFX05BU00pCi0gICBBU0ZMQUdTICAgICAgKz0gLUYgYm9ybGFuZCAtZwotLkVMU0UKLSAgIEFTRkxBR1MgICAgICArPSAvemkKLS5FTkRJRgotLkVMU0UKLSAgIExERkxBR1MgICAgICArPSAteAotICAgTElCRkxBR1MJCSs9IC9QMTI4Ci0uSUYgJChVU0VfTkFTTSkKLSAgIEFTRkxBR1MgICAgICArPSAtRiBudWxsCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xCi0uRU5ESUYKLS5FTkQKLQotIyBPcHRpb25hbGx5IGRpc2FibGUgbmFnZ2luZyB3YXJuaW5ncyBpZiBNQVhfV0FSTiBpcyBub3Qgb24KLS5JRiAkKE1BWF9XQVJOKQotLkVMU0UKLSAgIENGTEFHUwkJKz0gLXctYXVzIC13LXBhciAtdy1oaWQgLXctcGlhCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucyAoLTUgLU8yIGJyZWFrcyBCQysrIDQuMC00LjUgc29tZXRpbWVzKQotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC01IC1PMiAtay0KLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLTUgLU8xIC1rLQotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkQKLQotIyBPcHRpb25hbGx5IHVzZSBQaGFyIExhcCdzIFROVCBET1MgRXh0ZW5kZXIsIG90aGVyd2lzZSB1c2UgdGhlIERPUyBQb3dlciBQYWNrCi0uSUYgJChVU0VfVE5UKQotICAgQ0ZMQUdTICAgICAgICs9IC1EX19NU0RPU19fCi0gICBEWF9DRkxBR1MgICAgKz0gLURUTlQKLSAgIERYX0FTRkxBR1MgICArPSAtZFROVAotICAgTElCX09TICAgICAgID0gRE9TMzIKLSAgIERFRl9MSUJTCQk6PSBpbXBvcnQzMi5saWIgY3czMi5saWIgZG9zeDMyLmxpYiB0bnRhcGkubGliCi0uRUxJRiAkKFVTRV9WWEQpCi0gICBMREZMQUdTCQkrPSAtbiAtUC0gLXgKLSAgIENGTEFHUyAgICAgICArPSAtUlQtIC14LSAtT2kgLVZDIC1JJChWVE9PTFNEKVxJTkNMVURFIC1ESVNfMzIgLURXQU5UVlhEV1JBUFMgLURWVE9PTFNEIC1EV0lONDAgLURXSU40MF9PUl9MQVRFUiAtRERFRlNFRz0xIC16Q19MVEVYVCAtekFMQ09ERSAtelJfTERBVEEgLXpUTENPREUKLSAgIERFRl9MSUJTCQk6PSAkKFZUT09MU0QpXGxpYlxjZmJjNDQwZC5saWIgJChWVE9PTFNEKVxsaWJcd3IwYmM0NDAubGliICQoVlRPT0xTRClcbGliXHdyMWJjNDQwLmxpYiAkKFZUT09MU0QpXGxpYlx3cjJiYzQ0MC5saWIgJChWVE9PTFNEKVxsaWJcd3IzYmM0NDAubGliICQoVlRPT0xTRClcbGliXHJ0YmM0NDBkLmxpYgotICAgRFhfQVNGTEFHUyAgICs9IC1kX19WWERfXyAtZF9fQk9STEFORENfXz0xIC1JJChWVE9PTFNEKVxJTkNMVURFIC1JJChWVE9PTFNEKVxMSUJcSU5DTFVERQotICAgTElCX09TICAgICAgID0gVlhECi0uRUxJRiAkKFVTRV9XSU4zMikKLS5JRiAkKFdJTjMyX0dVSSkKLS5FTFNFCi0gICAgQ0ZMQUdTICAgICAgICs9IC1EX19DT05TT0xFX18KLS5FTkRJRgotLklGICQoQlVJTERfRExMKQotICAgQ0ZMQUdTICAgICAgICs9IC1XRCAtREJVSUxEX0RMTAotICAgQVNGTEFHUyAgICAgICs9IC1kQlVJTERfRExMCi0uRUxTRQotICAgQ0ZMQUdTICAgICAgICs9IC1XIC1XTQotLkVORElGCi0uSUYgJChVU0VfQkM1KQotLkVMU0UKLSAgIENGTEFHUwkJKz0gLURfV0lOMzIKLS5FTkRJRgotICAgREVGX0xJQlMJCTo9IGltcG9ydDMyLmxpYiBjdzMybXQubGliCi0gICBEWF9BU0ZMQUdTICAgKz0gLWRfX1dJTkRPV1MzMl9fCi0gICBMSUJfT1MgICAgICAgPSBXSU4zMgotLkVMSUYgJChVU0VfU01YMzIpCi0gICBDRkxBR1MgICAgICAgKz0gLURfX1NNWDMyX18gLURQTUUzMgotICAgRFhfQ0ZMQUdTICAgICs9Ci0gICBEWF9BU0ZMQUdTICAgKz0gLWRfX1NNWDMyX18gLWREUE1JMzIgLWRQTUUzMgotICAgVVNFX1JFQUxET1MJOj0gMQotICAgTElCX09TICAgICAgID0gU01YMzIKLSAgIERFRl9MSUJTICAgICA6PSBjdzMybXQubGliCi0uRUxTRQotICAgVVNFX0RQTUkzMiAgIDo9IDEKLSAgIENGTEFHUyAgICAgICArPSAtRF9fTVNET1NfXwotICAgRFhfQ0ZMQUdTICAgICs9IC1XWCAtRERQTUkzMgotICAgRFhfQVNGTEFHUyAgICs9IC1kRFBNSTMyCi0gICBVU0VfUkVBTERPUwk6PSAxCi0gICBMSUJfT1MgICAgICAgPSBET1MzMgotICAgREVGX0xJQlMJCTo9Ci0uRU5ECi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoQkNfTElCQkFTRSkKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotLklGICQoVVNFX1ROVCkKLVBNTElCICAgICAgICAgICA6PSAkKExJQl9CQVNFKVx0bnRccG0ubGliCi0uRUxJRiAkKFVTRV9EUE1JMzIpCi1QTUxJQiAgICAgICAgICAgOj0gJChMSUJfQkFTRSlcZHBtaTMyXHBtLmxpYgotLkVMU0UKLVBNTElCICAgICAgICAgICA6PSAkKExJQl9CQVNFKVxwbS5saWIKLS5FTkQKLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IGJjMzIubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmNvczIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2Jjb3MyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2FlYjdjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmNvczIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIEJvcmxhbmQgQysrIDIuMCAzMi1iaXQgT1MvMiB2ZXJzaW9uLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlCi0uSU1QT1JUIC5JR05PUkUgOiBVU0VfT1MyR1VJIEJDX0xJQkJBU0UKLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBiY2MKLSAgIENGTEFHUyAgICAgICA6PSAtdy0gLTQgLUg9YmNjMzIuc3ltIC1pNjAgLWQKLS5JRiAkKFVTRV9OQVNNKQotICAgQVMgICAgICAgICAgIDo9IG5hc20KLSAgIEFTRkxBR1MgICAgICA6PSAtdCAtZiBvYmogLWRfX0ZMQVRfXyAtaUlOQ0xVREUgLWkkKFNDSVRFQ0gpXElOQ0xVREUKLS5FTFNFCi0gICBBUyAgICAgICAgICAgOj0gdGFzbQotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvRF9fRkxBVF9fIC9EX19PUzJfXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLS5FTkRJRgotICAgTEQgICAgICAgICAgIDo9IGJjbGluayB0bGluay5leGUKLSAgIExERkxBR1MgICAgICA6PSAtYwotICAgUkMgICAgICAgICAgIDo9IGJyY2MKLSAgIFJDRkxBR1MgICAgICA6PQotICAgTElCICAgICAgICAgIDo9IHRsaWIKLSAgIExJQkZMQUdTICAgICA6PSAvQyAvUDMyCi0gICBJTElCICAgICAgICAgOj0gaW1wbGliCi0gICBJTElCRkxBR1MgICAgOj0gLWMKLS5JRiAkKFVTRV9PUzJHVUkpCi0gICBDRkxBR1MJCSs9IC1EX19PUzJfUE1fXwotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC12Ci0gICBMREZMQUdTICAgICAgKz0gLXYKLSAgIExJQkZMQUdTICAgICArPSAvUDEyOAotLklGICQoVVNFX05BU00pCi0gICBBU0ZMQUdTICAgICAgKz0gLUYgYm9ybGFuZAotLkVMU0UKLSAgIEFTRkxBR1MgICAgICArPSAvemkKLS5FTkRJRgotLkVMU0UKLSAgIExERkxBR1MgICAgICArPSAteAotLklGICQoVVNFX05BU00pCi0gICBBU0ZMQUdTICAgICAgKz0gLUYgbnVsbAotLkVMU0UKLSAgIEFTRkxBR1MgICAgICArPSAvcQotLkVORElGCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKLS5JRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAtNSAtTzIgLWstCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC01IC1PMSAtay0KLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucwotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLWRGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCRVRBCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB1c2UgUGhhciBMYXAncyBUTlQgRE9TIEV4dGVuZGVyLCBvdGhlcndpc2UgdXNlIHRoZSBET1MgUG93ZXIgUGFjawotLklGICQoQlVJTERfRExMKQotICAgQ0ZMQUdTICAgICAgICs9IC1zZCAtc20gLURCVUlMRF9ETEwKLSAgIEFTRkxBR1MgICAgICArPSAtZEJVSUxEX0RMTAotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAtc20KLS5FTkRJRgotICAgREVGX0xJQlMJOj0gb3MyLmxpYiBjMm10LmxpYgotICAgRFhfQVNGTEFHUyAgICs9IC1kX19PUzJfXwotICAgTElCX09TICAgICAgID0gb3MyMzIKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MgICAgICAgICAgKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoQkNfTElCQkFTRSkKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotLklGICQoVVNFX09TMkdVSSkKLURFRl9MSUJTICAgICAgICArPSBwbV9wbS5saWIKLS5FTFNFCi1ERUZfTElCUyAgICAgICAgKz0gcG0ubGliCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IGJjb3MyLm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2NsMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2NsMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMjlhMTUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9jbDE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBNaWNyb3NvZnQgQyA2LjAgMTYgYml0IHZlcnNpb24uIFN1cHBvcnRzIDE2IGJpdAotIyAgICAgICAgICAgICAgIE9TLzIgZGV2ZWxvcG1lbnQuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFZDX0xJQkJBU0UKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9NQVNNCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGNsICAgICAgICMgQy1jb21waWxlciBhbmQgZmxhZ3MKLSAgIENGTEFHUyAgICAgICA6PSAvdyAvR3MKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0NPTU1fXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteCAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTElGICQoVVNFX01BU00pCi0gICBBUyAgICAgICAgICAgOj0gbWFzbSAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLSAgIEFTRkxBR1MgICAgICA6PSAvRF9fQ09NTV9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtICAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTkRJRgotICAgTEQgICAgICAgICAgIDo9IGNsICAgICAgICMgTG9hZGVyIGFuZCBmbGFncwotICAgTERGTEFHUyAgICAgICA9ICQoQ0ZMQUdTKQotICAgUkMgICAgICAgICAgIDo9IHJjICAgICAgICMgV0luZG93cyByZXNvdXJjZSBjb21waWxlcgotICAgUkNGTEFHUyAgICAgIDo9Ci0gICBMSUIgICAgICAgICAgOj0gbGliICAgICAgIyBMaWJyYXJpYW4KLSAgIExJQkZMQUdTICAgICA6PSAvTk9JIC9OT0UKLSAgIElMSUIgICAgICAgICA6PSBpbXBsaWIgICAjIEltcG9ydCBsaWJyYXJpYW4KLSAgIElMSUJGTEFHUyAgICA6PSAvbm9pZ25vcmVjYXNlCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC9aaSAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgQyBjb21waWxlcgotICAgQVNGTEFHUyAgICAgICs9IC96aSAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIGFzc2VtYmxlcgotLkVMU0UKLSAgIEFTRkxBR1MgICAgICArPSAvcSAgICAgICAjIFN1cHByZXNzIG9iamVjdCByZWNvcmRzIG5vdCBuZWVkZWQgZm9yIGxpbmtpbmcKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC9PeAotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0KLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAvRlBpODcgL0RGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAvREZQVTM4NyAvREZQVV9SRUdfUlROCi0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC9EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC9EQkVUQQotLkVORAotCi0jIFVzZSBhIGxhcmdlciBzdGFjayBkdXJpbmcgbGlua2luZyBpZiByZXF1ZXN0ZWQgPz8/PyBIb3cgdGhlIGZ1Y2sgZG8geW91Ci0jIHNwZWNpZnkgbGlua2VyIG9wdGlvbnMgb24gdGhlIENMIGNvbW1hbmQgbGluZT8/Pz8/Ci0KLS5JRiAkKFNUS1NJWkUpCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgZm9yIDE2IGJpdCBXaW5kb3dzCi0uSUYgJChVU0VfV0lOMTYpCi0uSUYgJChCVUlMRF9ETEwpCi0gICBDRkxBR1MgICAgICAgKz0gL0dEIC9BbGZ3IC9EQlVJTERfRExMCi0gICBBU0ZMQUdTICAgICAgKz0gLURCVUlMRF9ETEwKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gL0dBIC9BTAotLkVORElGCi0gICBEWF9BU0ZMQUdTICAgKz0gLURfX1dJTkRPV1MxNl9fCi0gICBMSUJfT1MgICAgICAgPSBXSU4xNgotLkVMU0UKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLSAgIENGTEFHUyAgICAgICArPSAvQUwKLSAgIExJQl9PUyAgICAgICA9IERPUzE2Ci0uRU5ECi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi1QTUxJQiAgICAgICAgICAgOj0gcG0ubGliCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoVkNfTElCQkFTRSkKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gY2wxNi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9jbDM4Ni5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvY2wzODYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTU3ZjkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9jbDM4Ni5taworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIE1pY3Jvc29mdCAzODYgQyA2LjAgMzIgYml0LiBTdXBwb3J0cyAzMiBiaXQKLSMgICAgICAgICAgICAgICBPUy8yIGRldmVsb3BtZW50LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlCi0uSU1QT1JUIC5JR05PUkUgOiBDTF9MSUJCQVNFIFVTRV9WREQKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9NQVNNCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGNsMzg2ICAgICAgICMgQy1jb21waWxlciBhbmQgZmxhZ3MKLSAgICMgTkI6IFRoZSAtWmYgZmxhZyBpcyBBQlNPTFVURUxZIE5FQ0VTU0FSWSB0byBjb21waWxlIElCTSdzIE9TLzIgaGVhZGVycy4KLSAgICMgICAgIEl0IGlzbid0IGRvY3VtZW50ZWQgYW55d2hlcmUgYnV0IG9idmlvdXNseSBhZGRzIHN1cHBvcnQgZm9yIDQ4LWJpdAotICAgIyAgICAgZmFyIHBvaW50ZXJzIChpZS4gX2ZhciBpcyB2YWxpZCBpbiAzMi1iaXQgY29kZSkuIEdyZWF0LgotICAgQ0ZMQUdTICAgICAgIDo9IC1HM3MgLVpmIC1EX18zODZfXwotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvb2kgL0RfX0ZMQVRfXyAvRFNURENBTExfTUFOR0xFIC9EX19OT1VfVkFSX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0uSUYgJChVU0VfVEFTTTMyKQotICAgQVMgICAgICAgICAgIDo9IHRhc20zMgotLkVMSUYgJChVU0VfVEFTTVgpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbXggICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTElGICQoVVNFX01BU00pCi0gICBBUyAgICAgICAgICAgOj0gbWFzbSAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL0RfX0ZMQVRfXyAvRFNURENBTExfTUFOR0xFIC9EX19OT1VfVkFSX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20gICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVORElGCi0gICBMRCAgICAgICAgICAgOj0gbGluazM4NiAgIyBMaW5rZXIgYW5kIGZsYWdzCi0gICBMREZMQUdTICAgICAgID0gJChDRkxBR1MpCi0gICBSQyAgICAgICAgICAgOj0gcmMgICAgICAgIyBXaW5kb3dzIHJlc291cmNlIGNvbXBpbGVyCi0gICBSQ0ZMQUdTICAgICAgOj0KLSAgIExJQiAgICAgICAgICA6PSBsaWIgICAgICAjIExpYnJhcmlhbgotICAgTElCRkxBR1MgICAgIDo9IC9OT0kgL05PRQotICAgSUxJQiAgICAgICAgIDo9IGltcGxpYiAgICMgSW1wb3J0IGxpYnJhcmlhbgotICAgSUxJQkZMQUdTICAgIDo9IC9ub2lnbm9yZWNhc2UKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLVppICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgQyBjb21waWxlcgotICAgQVNGTEFHUyAgICAgICs9IC96aSAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIGFzc2VtYmxlcgotLkVMU0UKLSAgIEFTRkxBR1MgICAgICArPSAvcSAgICAgICAjIFN1cHByZXNzIG9iamVjdCByZWNvcmRzIG5vdCBuZWVkZWQgZm9yIGxpbmtpbmcKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC9PeAotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0KLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAvRlBpODcgL0RGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAvREZQVTM4NyAvREZQVV9SRUdfUlROCi0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC9EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC9EQkVUQQotLkVORAotCi0jIFVzZSBhIGxhcmdlciBzdGFjayBkdXJpbmcgbGlua2luZyBpZiByZXF1ZXN0ZWQgPz8/PyBIb3cgdGhlIGZ1Y2sgZG8geW91Ci0jIHNwZWNpZnkgbGlua2VyIG9wdGlvbnMgb24gdGhlIENMIGNvbW1hbmQgbGluZT8/Pz8/Ci0KLS5JRiAkKFNUS1NJWkUpCi0uRU5ESUYKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLVBNTElCICAgICAgICAgICA6PSBwbS5saWIKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIgICAgOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MgICAgICAgICAgICAgICAgICArPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUiAgICA6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX09TICAgICAgID0gb3MyMzIKLSAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoQ0xfTElCQkFTRSkKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsgICAgOj0gY2wzODYubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvY29tbW9uLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9jb21tb24ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMzcxNTIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9jb21tb24ubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBDb21tb24gbWFrZWZpbGUgdGFyZ2V0cyB1c2VkIGJ5IGFsbCBTY2lUZWNoIFNvZnR3YXJlCi0jICAgICAgICAgICAgICAgbWFrZWZpbGVzLiBUaGlzIGZpbGUgaW5jbHVkZXMgdGFyZ2V0cyBmb3IgY2xlYW5pbmcgdGhlCi0jICAgICAgICAgICAgICAgY3VycmVudCBkaXJlY3RvcnksIGFuZCBtYWludGFpbmluZyB0aGUgc291cmNlIGZpbGVzIHdpdGgKLSMgICAgICAgICAgICAgICBSQ1MuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIE92ZXJyaWRlIGdsb2JhbCBPcGVuR0wgaW5jbHVkZXMgd2hlbiBjb21waWxpbmcgYWdhaW5zdCBNR0wgdmVyc2lvbgotCi0uSUYgJChVU0VfTUdMX09QRU5HTCkKLS5JRiAkKFVOSVhfSE9TVCkKLUNGTEFHUwkJKz0gLUkkKFNDSVRFQ0gpL2luY2x1ZGUvbWdsZ2wKLURFUEVORF9JTkMJKz0gJChTQ0lURUNIKS9pbmNsdWRlL21nbGdsCi0uRUxTRQotQ0ZMQUdTCQkrPSAtSSQoU0NJVEVDSClcaW5jbHVkZVxtZ2xnbAotREVQRU5EX0lOQwkrPSAkKFNDSVRFQ0gpXGluY2x1ZGUvbWdsZ2wKLS5FTkRJRgotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgYWxsIGNvbXBpbGVkIERMTCBmaWxlcwotCi0uSUYgJChVTklYX0hPU1QpCi0uSUYgJChDSEVDS0VEKQotRExMX0RFU1QgICAgOj0gJChTQ0lURUNIX0xJQikvcmVkaXN0L2RlYnVnCi0uRUxTRQotRExMX0RFU1QgICAgOj0gJChTQ0lURUNIX0xJQikvcmVkaXN0L3JlbGVhc2UKLS5FTkRJRgotLkVMU0UKLS5JRiAkKENIRUNLRUQpCi1ETExfREVTVCAgICA6PSAkKFNDSVRFQ0hfTElCKVxyZWRpc3RcZGVidWcKLS5FTFNFCi1ETExfREVTVCAgICA6PSAkKFNDSVRFQ0hfTElCKVxyZWRpc3RccmVsZWFzZQotLkVORElGCi0uRU5ESUYKLQotIyBUYXJnZXQgdG8gYnVpbGQgdGhlIGxpYnJhcnkgYW5kIERMTCBmaWxlIGlmIHNwZWNpZmllZAotCi0uSUYgJChMSUJGSUxFKQotCi1saWI6ICQoTElCRklMRSkKLQotLklGICQoRExMRklMRSkKLQotIyBCdWlsZCBhbmQgaW5zdGFsbCBhIERMTCBmaWxlLCBvciBzaW1wbHkgYnVpbGQgaW1wb3J0IGxpYnJhcnkgYW5kIGluc3RhbGwKLQotLklGICQoQlVJTERfRExMKQotCi0kKERMTEZJTEUpOiAkKE9CSkVDVFMpCi0kKExJQkZJTEUpOiAkKERMTEZJTEUpCi1pbnN0YWxsOiAkKExJQkZJTEUpICQoRExMRklMRSkKLQkkKElOU1RBTEwpICQoTElCRklMRSkgJChMSUJfREVTVCkkKExJQl9FWFRFTkRFUikKLQkkKElOU1RBTEwpICQoRExMRklMRSkgJChETExfREVTVCkKLS5JRiAkKFVTRV9TT0ZUSUNFKQotCSQoSU5TVEFMTCkgJChETExGSUxFOnMvLmRsbC8ubm1zKSAkKERMTF9ERVNUKQotLkVORElGCi0uRUxTRQotCi0kKExJQkZJTEUpOiAkKERMTF9ERVNUKVwkKERMTEZJTEUpCi1pbnN0YWxsOiAkKExJQkZJTEUpCi0JJChJTlNUQUxMKSAkKExJQkZJTEUpICQoTElCX0RFU1QpJChMSUJfRVhURU5ERVIpCi0KLS5FTkRJRgotLkVMU0UKLQotLklGICQoQlVJTERfRExMKQotCi0jIEJ1aWxkIGFuZCBpbnN0YWxsIGEgVW5peCBzaGFyZWQgbGlicmFyeQotCi0kKExJQkZJTEUpOiAkKE9CSkVDVFMpCi1pbnN0YWxsOiAkKExJQkZJTEUpCi0JJChJTlNUQUxMKSAkKExJQkZJTEUpICQoTElCX0RFU1QpJChMSUJfRVhURU5ERVIpCi0JJChJTlNUQUxMKSAkKExJQkZJTEUpICQoRExMX0RFU1QpLyQoTElCRklMRSkuJChWRVJTSU9OKQotCi0uRUxTRQotCi0jIEJ1aWxkIGFuZCBpbnN0YWxsIGEgbm9ybWFsIGxpYnJhcnkgZmlsZQotCi0uSUYgJChVU0VfRExMKQotLkVMU0UKLSQoTElCRklMRSk6ICQoT0JKRUNUUykKLWluc3RhbGw6ICQoTElCRklMRSkKLQkkKElOU1RBTEwpICQoTElCRklMRSkgJChMSUJfREVTVCkkKExJQl9FWFRFTkRFUikKLS5FTkRJRgotLkVORElGCi0uRU5ESUYKLS5FTkRJRgotCi0jIEJ1aWxkIGFuZCBpbnN0YWxsIGEgVnhEIGZpbGUsIGluY2x1ZGluZyBkZWJ1ZyBpbmZvcm1hdGlvbgotCi0uSUYgJChWWERGSUxFKQotJChWWERGSUxFOnMvLnZ4ZC8uZGxsKTogJChPQkpFQ1RTKQotJChWWERGSUxFKTogJChWWERGSUxFOnMvLnZ4ZC8uZGxsKQotaW5zdGFsbDogJChWWERGSUxFKQotCSQoSU5TVEFMTCkgJChWWERGSUxFKSAkKERMTF9ERVNUKQotLklGICQoREJHKQotCSQoSU5TVEFMTCkgJChWWERGSUxFOnMvLnZ4ZC8ubm1zKSAkKERMTF9ERVNUKQotLkVORElGCi0uRU5ESUYKLQotIyBDbGVhbiB1cCBkaXJlY3RvcnkgcmVtb3ZpbmcgYWxsIGZpbGVzIG5vdCBuZWVkZWQgdG8gbWFrZSB0aGUgbGlicmFyeS4KLQotX19DTEVBTl9GSUxFUyA6PSAqLm9iaiAqLm8gKi5zeW0gKi5iYWsgKi50ZGsgKi5zd3AgKi5tYXAgKi5lcnIgKi5jc20gKi5saWIgKi5hcHMgKi5ubXMgKi5zeXMKLV9fQ0xFQU5fRklMRVMgKz0gKi5+KiAqLnRkICoudHIgKi50cj8gKi50ZD8gKi5yd3MgKi5yZXMgKi5leHAgKi5pbGsgKi5wZGIgKi5wY2ggKi5hIGJjYzMyLioKLV9fQ0xFQU5fRklMRVMgKz0gJChMSUJDTEVBTikKLV9fQ0xFQU5FWEVfRklMRVMgOj0gJChfX0NMRUFOX0ZJTEVTKSAqJEUgKi5kcnYgKi5yZXggKi5kbGwgKi52eGQgKi5ubXMgKi5wZWwgKi5zbWYgKi5zby4qCi0KLS5QSE9OWSBjbGVhbjoKLQlAJChSTSkgLWYgLVMgJChta3RtcCAkKF9fQ0xFQU5fRklMRVM6dCJcbiIpKQotCi0uUEhPTlkgY2xlYW5leGU6Ci0JQCQoUk0pIC1mIC1TICQobWt0bXAgJChfX0NMRUFORVhFX0ZJTEVTOnQiXG4iKSkKLQotIyBEZWZpbmUgdGhlIHNvdXJjZSBkaXJlY3RvcmllcyB0byBmaW5kIGNvbW1vbiBmaWxlcwotCi0uSUYgJChOT19TQ0lURUNIX0NPTU1PTikKLS5FTFNFCi0uU09VUkNFOgkJICAgJChTQ0lURUNIKS9zcmMvY29tbW9uCi0uRU5ESUYKLQotIyBDcmVhdGUgdGhlIGluY2x1ZGUgZmlsZSBkZXBlbmRlbmNpZXMgdXNpbmcgdGhlIE1LVVRJTCBtYWtlZGVwIHByb2dyYW0gaWYKLSMgdGhlIGxpc3Qgb2YgZGVwZW5kZW50IG9iamVjdCBmaWxlcyBpcyBkZWZpbmVkCi0KLS5JRiAkKERFUEVORF9PQkopCi1kZXBlbmQ6Ci0JQCQoUk0pIC1mIG1ha2VmaWxlLmRlcAotLklGICQoREVQRU5EX1NSQykKLS5JRiAkKERFUEVORF9JTkMpCi0JQG1ha2VkZXAgLWFtYWtlZmlsZS5kZXAgLXIgLXMgLUlAJChta3RtcCAkKERFUEVORF9JTkM6cy9cL1xcKSkgLVNAJChta3RtcCAkKERFUEVORF9TUkM6cy9cL1xcKTskKFNDSVRFQ0gpL3NyYy9jb21tb24pIEAkKG1rdG1wICQoREVQRU5EX09CSjp0IlxuIilcbikKLS5FTFNFCi0JQG1ha2VkZXAgLWFtYWtlZmlsZS5kZXAgLXIgLXMgLVNAJChta3RtcCAkKERFUEVORF9TUkM6cy9cL1xcKTskKFNDSVRFQ0gpL3NyYy9jb21tb24pIEAkKG1rdG1wICQoREVQRU5EX09CSjp0IlxuIilcbikKLS5FTkRJRgotLkVMU0UKLS5JRiAkKERFUEVORF9JTkMpCi0JQG1ha2VkZXAgLWFtYWtlZmlsZS5kZXAgLXIgLXMgLUlAJChta3RtcCAkKERFUEVORF9JTkM6cy9cL1xcKSkgLVNAJChta3RtcCAkKFNDSVRFQ0gpL3NyYy9jb21tb24pIEAkKG1rdG1wICQoREVQRU5EX09CSjp0IlxuIilcbikKLS5FTFNFCi0JQG1ha2VkZXAgLWFtYWtlZmlsZS5kZXAgLXIgLXMgLVNAJChta3RtcCAkKFNDSVRFQ0gpL3NyYy9jb21tb24pIEAkKG1rdG1wICQoREVQRU5EX09CSjp0IlxuIilcbikKLS5FTkRJRgotLkVORElGCi0JQCQoRUNITykgT2JqZWN0IGZpbGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQuCi0uRU5ESUYKLQotIyBTZXQgdXAgZm9yIGNvbXBpbGluZyBTbmFwIGV4ZWN1dGVhYmxlcyBhbmQgZHluYW1pYyBsaW5rIGxpYnJhcmllcwotCi0uSUYgJChVU0VfU05BUCkKLSNDRkxBR1MgICAgIAkrPSAtSSQoUFJJVkFURSlcaW5jbHVkZVxkcnZsaWIgLUkkKFNDSVRFQ0gpXGluY2x1ZGVcZHJ2bGliIC1EX19TTkFQX18KLUNGTEFHUyAgICAgCSs9IC1EX19TTkFQX18KLUFTRkxBR1MgICAJKz0gLWRfX1NOQVBfXwotI0VYRUxJQlMJCSs9IHNuYXAkTAotLkVORElGCi0KLSMgSW5jbHVkZSBydWxlIGRlZmluaXRpb25zIGZvciB0aGUgY29tcGlsZXIKLQotLklOQ0xVREU6ICIkKFNDSVRFQ0gpL21ha2VkZWZzL3J1bGVzLyQoUlVMRVNfTUFLKSIKLQotIyBJbmNsdWRlIGZpbGUgZGVwZW5kZW5jaWVzCi0KLS5JTkNMVURFIC5JR05PUkU6ICJtYWtlZmlsZS5kZXAiCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2VteC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZW14Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTY5NzkwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZW14Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBPUy8yIHZlcnNpb24gZm9yIEVNWC9HTlUgQy9DKysuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIERpc2FibGUgd2FybmluZ3MgZm9yIG1hY3JvcyByZWRlZmluZWQgaGVyZSB0aGF0IHdlcmUgZ2l2ZW4KLSMgb24gdGhlIGNvbW1hbmQgbGluZS4KLV9fLlNJTEVOVCAgICAgICA6PSAkKC5TSUxFTlQpCi0uU0lMRU5UICAgICAgICAgOj0geWVzCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZSBjb21tb24gdG8gYWxsIGNvbXBpbGVycwotLklNUE9SVCAuSUdOT1JFIDogVEVNUCBTSEVMTCBJTkNMVURFIExJQiBTQ0lURUNIIFBSSVZBVEUgU0NJVEVDSF9MSUIKLS5JTVBPUlQgLklHTk9SRSA6IERCRyBPUFQgT1BUX1NJWkUgQ1JURExMIFNIVyBCRVRBIENIRUNLRUQgTk9fRVhDRVBUIE5PX1JUVEkKLS5JTVBPUlQgLklHTk9SRSA6IEZVTExTQ1JFRU4gU0hPV19BUkdTCi0gICBUTVBESVIgICAgICAgOj0gJChURU1QKQotCi0jIFN0YW5kYXJkIGZpbGUgc3VmZml4IGRlZmluaXRpb25zCi0gICBMICAgICAgICAgICAgOj0gLmxpYiAgICAgICAgICMgTGlicmFyaWVzCi0gICBFICAgICAgICAgICAgOj0gLmV4ZSAgICAgICAgICMgRXhlY3V0YWJsZXMKLSAgIE8gICAgICAgICAgICA6PSAub2JqICAgICAgICAgIyBPYmplY3RzCi0gICBBICAgICAgICAgICAgOj0gLmFzbSAgICAgICAgICMgQXNzZW1ibGVyIHNvdXJjZXMKLSAgIFMgICAgICAgICAgICA6PSAucyAgICAgICAgICAgIyBHTlUgYXNzZW1ibGVyIHNvdXJjZXMKLSAgIFAgICAgICAgICAgICA6PSAuY3BwICAgICAgICAgIyBDKysgc291cmNlcwotCi0jIEZpbGUgcHJlZml4L3N1ZmZpeCBkZWZpbml0aW9ucy4gVGhlIGZvbGxvd2luZyBwcmVmaXhlcyBhcmUgZGVmaW5lZCwgYW5kIGFyZQotIyB1c2VkIHByaW1hcmlseSB0byBhYnN0cmFjdCBiZXR3ZWVuIHRoZSBVbml4IHN0eWxlIGxpYlhYLmEgbmFtaW5nIGNvbnZlbnRpb24KLSMgYW5kIHRoZSBET1MvV2luZG93cy9PUzIgbmFtaW5nIGNvbnZlbnRpb24gb2YgWFgubGliLgotICAgTFAgICAgICAgICAgIDo9ICAgICAgICAgICAgICAjIExQIC0gTGlicmFyeSBmaWxlIHByZWZpeCAobmFtZSBvZiBmaWxlIG9uIGRpc2spCi0gICBMTCAgICAgICAgICAgOj0gLWwgICAgICAgICAgICMgTGlicmFyeSBsaW5rIHByZWZpeCAobmFtZSBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotICAgTEUgICAgICAgICAgIDo9ICAgICAgICAgICAgICAjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IEVNWF9MSUJCQVNFIFVTRV9PUzIzMiBVU0VfT1MyR1VJCi0KLSMgV2UgYXJlIGNvbXBpbGluZyBmb3IgYSAzMiBiaXQgZW52aW9ubWVudAotICAgXzMyQklUXyAgICAgIDo9IDEKLQotIyBETUFLRSB1c2VzIHRoaXMgcmVjaXBlIHRvIHJlbW92ZSBpbnRlcm1lZGlhdGUgdGFyZ2V0cwotLlJFTU9WRSA6OyAkKFJNKSAtZiAkPAotCi0jIFR1cm4gd2FybmluZ3MgYmFjayB0byBwcmV2aW91cyBzZXR0aW5nLgotLlNJTEVOVCA6PSAkKF9fLlNJTEVOVCkKLQotIyBXZSBkb250IHVzZSBUQUJTIGluIG91ciBtYWtlZmlsZXMKLS5OT1RBQlMgICAgICAgICA6PSB5ZXMKLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nLgotICAgQ0MgICAgICAgICAgIDo9IGdjYwotICAgQ0ZMQUdTICAgICAgIDo9IC1abXQgLVpvbWYgLVdhbGwgLUkuIC1JJChJTkNMVURFKQotICAgQ1hYICAgICAgICAgIDo9IGdjYyAteCBjKysgLWZuby1leGNlcHRpb25zIC1mbm8tcnR0aQotLklGICQoVVNFX05BU00pCi0gICBBUyAgICAgICAgICAgOj0gbmFzbQotICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIG9iaiAtRiBudWxsIC1kX19GTEFUX18gLWRfX05PVV9fIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtICAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL29pIC9EX19GTEFUX18gL0RfX05PVV9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotLkVORElGCi0gICBMRCAgICAgICAgICAgOj0gZ2NjCi0gICBMRFhYICAgICAgICAgOj0gZ2NjIC14IGMrKwotICAgTERGTEFHUyAgICAgIDo9IC1MLiAtWm9tZiAtWm10Ci0gICBMSUIgICAgICAgICAgOj0gZW14b21mYXIKLSAgIExJQkZMQUdTICAgICA6PSAtcDMyIHJjdgotCi0gICBZQUNDICAgICAgICAgOj0gYmlzb24gLXkKLSAgIExFWCAgICAgICAgICA6PSBmbGV4Ci0gICBTRUQgICAgICAgICAgOj0gc2VkCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9mZiBleGNlcHRpb25zIGFuZCBSVFRJIGZvciBDKysgY29kZQotLklGICQoTk9fRVhDRVBUKQotICAgQ1hYICAgICAgICAgICs9IC1mbm8tZXhjZXB0aW9ucwotLkVORElGCi0uSUYgJChOT19SVFRJKQotICAgQ1hYICAgICAgICAgICs9IC1mbm8tcnR0aQotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC1nCi0uRUxTRQotIyBXaXRob3V0IC1zLCBlbXggYWx3YXlzIHJ1bnMgTElOSzM4NiB3aXRoIHRoZSAvREVCVUcgb3B0aW9uCi0gICBDRkxBR1MgICAgICAgKz0gLXMKLSAgIExERkxBR1MgICAgICArPSAtcwotIyBOQVNNIGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHlldAotICAgQVNGTEFHUyAgICAgICs9Ci0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUX01BWCkKLSAgIENGTEFHUyAgICAgICArPSAtTzYKLS5FTElGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1PMyAtZm9taXQtZnJhbWUtcG9pbnRlcgotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtT3MKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkRJRgotCi0jIERpc2FibGUgc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcnkKLS5JRiAkKE5PX1JVTlRJTUUpCi1DRkxBR1MgICAgICAgICAgICAgICAgICArPSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jCi0uRU5ESUYKLQotIyBMaW5rIGFnYWluc3QgRU1YIERMTHMgKENSVERMTD0xKSBvciBsaW5rIHdpdGggc3RhdGljIEMgcnVudGltZSBsaWJyYXJpZXMKLS5JRiAkKENSVERMTCkKLSAgTERGTEFHUyAgICAgICArPSAtWmNydGRsbAotLkVMU0UKLSAgQ0ZMQUdTCQkrPSAtWnN5cwotICBMREZMQUdTICAgICAgICs9IC1ac3lzCi0uRU5ESUYKLQotIyBUYXJnZXQgZW52aXJvbm1lbnQgZGVwZW5kYW50IGZsYWdzCi0gICBDRkxBR1MgICAgICAgKz0gLURfX09TMl8zMl9fCi0gICBDRkxBR1MgICAgICAgKz0gLURfX09TMl9fCi0gICBBU0ZMQUdTICAgICAgKz0gLWRfX09TMl9fCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSICAgIDo9ICQoU0NJVEVDSF9MSUIpL2xpYi9kZWJ1ZwotQ0ZMQUdTICAgICAgICAgICs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSICAgIDo9ICQoU0NJVEVDSF9MSUIpL2xpYi9yZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRV9ESVIpXE9TMjMyXCQoRU1YX0xJQkJBU0UpCi0gICBMREZMQUdTICAgICAgKz0gLUwkKExJQl9ERVNUKQotCi0jIEJ1aWxkIDMyLWJpdCBPUy8yIGFwcHMKLS5JRiAkKEJVSUxEX0RMTCkKLSAgIENGTEFHUyAgICAgICArPSAtWmRsbCAtREJVSUxEX0RMTAotICAgTERGTEFHUyAgICAgICs9IC1aZGxsCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKLS5FTFNFCi0uSUYgJChVU0VfT1MyR1VJKQotICAgQ0ZMQUdTICAgICAgICs9IC1EX19PUzJfUE1fXwotICAgTERGTEFHUyAgICAgICs9IC1abGlua2VyIC9QTVRZUEU6UE0KLS5FTFNFCi0uSUYgJChGVUxMU0NSRUVOKQotICAgTERGTEFHUyAgICAgICs9IC1abGlua2VyIC9QTVRZUEU6Tk9WSU8KLS5FTFNFCi0gICBMREZMQUdTICAgICAgKz0gLVpsaW5rZXIgL1BNVFlQRTpWSU8KLS5FTkRJRgotLkVORElGCi0uRU5ESUYKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLVBNTElCICAgICAgICAgICA6PSAtbHBtCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSyAgICA6PSBlbXgubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2Jlb3MubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2djY19iZW9zLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDYyZmRmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2Jlb3MubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIEJlT1MgdmVyc2lvbiBmb3IgR05VIEMvQysrLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBEaXNhYmxlIHdhcm5pbmdzIGZvciBtYWNyb3MgcmVkZWZpbmVkIGhlcmUgdGhhdCB3ZXJlIGdpdmVuCi0jIG9uIHRoZSBjb21tYW5kIGxpbmUuCi1fXy5TSUxFTlQgICAgICAgOj0gJCguU0lMRU5UKQotLlNJTEVOVCAgICAgICAgIDo9IHllcwotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UgY29tbW9uIHRvIGFsbCBjb21waWxlcnMKLS5JTVBPUlQgLklHTk9SRSA6IFRFTVAgU0hFTEwgSU5DTFVERSBMSUIgU0NJVEVDSCBQUklWQVRFIFNDSVRFQ0hfTElCCi0uSU1QT1JUIC5JR05PUkUgOiBEQkcgT1BUIE9QVF9TSVpFIFNIVyBCRVRBIENIRUNLRUQgVVNFX1gxMSBVU0VfTElOVVgKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9FR0NTIFVTRV9QR0NDIFNUQVRJQ19MSUJTIExJQkMKLSAgIFRNUERJUiAgICAgICA6PSAkKFRFTVApCi0KLSMgU3RhbmRhcmQgZmlsZSBzdWZmaXggZGVmaW5pdGlvbnMKLSMKLSMgTk9URTogQmVPUyBkb2VzIG5vdCByZXF1aXJlIGFueSBleHRlbmlvbiBmb3IgZXhlY3V0ZWFibGUgZmlsZXMsIGJ1dCB5b3UKLSMgICAgICAgY2FuIHVzZSBhbiBleHRlbnNpb24gaWYgeW91IHdpc2guIFdlIHVzZSB0aGUgLnggZXh0ZW5zaW9uIGZvciBidWlsZGluZwotIyAgICAgICBleGVjdXRlYWJsZSBmaWxlcyBzbyB0aGF0IHdlIGNhbiB1c2UgaW1wbGljaXQgcnVsZXMgdG8gbWFrZSB0aGUKLSMgICAgICAgbWFrZWZpbGVzIHNpbXBsZXIgYW5kIG1vcmUgcG9ydGFibGUgYmV0d2VlbiBzeXN0ZW1zLiBXaGVuIHlvdSBpbnN0YWxsCi0jICAgICAgIHRoZSBmaWxlcyB0byBhIGxvY2FsIGJpbiBkaXJlY3RvcnksIHlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gcmVtb3ZlCi0jICAgICAgIHRoZSAueCBleHRlbnNpb24uCi0gICBMICAgICAgICAgICAgOj0gLmEgICAJIyBMaWJyYXJpZXMKLSAgIEUgICAgICAgICAgICA6PSAueCAgIAkjIEV4ZWN1dGFibGVzCi0gICBPICAgICAgICAgICAgOj0gLm8gICAJIyBPYmplY3RzCi0gICBBICAgICAgICAgICAgOj0gLmFzbSAgIAkjIEFzc2VtYmxlciBzb3VyY2VzCi0gICBTICAgICAgICAgICAgOj0gLnMgICAgICAgIyBHTlUgYXNzZW1ibGVyIHNvdXJjZXMKLSAgIFAgICAgICAgICAgICA6PSAuY3BwICAgCSMgQysrIHNvdXJjZXMKLQotIyBGaWxlIHByZWZpeC9zdWZmaXggZGVmaW5pdGlvbnMuIFRoZSBmb2xsb3dpbmcgcHJlZml4ZXMgYXJlIGRlZmluZWQsIGFuZCBhcmUKLSMgdXNlZCBwcmltYXJpbHkgdG8gYWJzdHJhY3QgYmV0d2VlbiB0aGUgVW5peCBzdHlsZSBsaWJYWC5hIG5hbWluZyBjb252ZW50aW9uCi0jIGFuZCB0aGUgRE9TL1dpbmRvd3MvT1MyIG5hbWluZyBjb252ZW50aW9uIG9mIFhYLmxpYi4KLSAgIExQICAgICAgICAgICA6PSBsaWIgICAgICAjIExQIC0gTGlicmFyeSBmaWxlIHByZWZpeCAobmFtZSBvZiBmaWxlIG9uIGRpc2spCi0gICBMTCAgICAgICAgICAgOj0gLWwJCSMgTGlicmFyeSBsaW5rIHByZWZpeCAobmFtZSBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotICAgTEUgICAgICAgICAgIDo9IAkJICAgICMgTGlicmFyeSBsaW5rIHN1ZmZpeCAoZXh0ZW5zaW9uIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0KLSMgV2UgdXNlIHRoZSBVbml4IHNoZWxsIGF0IGFsbCB0aW1lcwotICAgU0hFTExGTEFHUyAgIDo9IC1jCi0KLSMgRGVmaW5pdGlvbiBvZiAkKE1BS0UpIG1hY3JvIGZvciByZWN1cnNpdmUgbWFrZXMuCi0gICBNQUtFID0gJChNQUtFQ01EKSAkKE1GTEFHUykKLQotIyBNYWNybyB0byBpbnN0YWxsIGEgbGlicmFyeSBmaWxlCi0gICBJTlNUQUxMICAgICAgOj0gY3AKLQotIyBETUFLRSB1c2VzIHRoaXMgcmVjaXBlIHRvIHJlbW92ZSBpbnRlcm1lZGlhdGUgdGFyZ2V0cwotLlJFTU9WRSA6OyAkKFJNKSAtZiAkPAotCi0jIFR1cm4gd2FybmluZ3MgYmFjayB0byBwcmV2aW91cyBzZXR0aW5nLgotLlNJTEVOVCA6PSAkKF9fLlNJTEVOVCkKLQotIyBXZSBkb250IHVzZSBUQUJTIGluIG91ciBtYWtlZmlsZXMKLS5OT1RBQlMgICAgICAgICA6PSB5ZXMKLQotIyBEZWZpbmUgdGhhdCB3ZSBhcmUgY29tcGlsaW5nIGZvciBCZU9TCi0gICBVU0VfQkVPUyAgICAgOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcuCi0gICBDQyAgICAgICAgICAgOj0gZ2NjCi0gICBDRkxBR1MgICAgICAgOj0gLVdhbGwgLUkuIC1JaW5jbHVkZSAkKElOQ0xVREUpCi0gICBDWFggICAgICAgICAgOj0gZysrCi0gICBBUyAgICAgICAgICAgOj0gbmFzbQotICAgQVNGTEFHUyAgICAgIDo9IC1mIGVsZiAtZF9fRkxBVF9fIC1paW5jbHVkZSAtaSQoU0NJVEVDSCkvaW5jbHVkZSAtZF9fTk9VX18KLSAgIExEICAgICAgICAgICA6PSBnY2MKLSAgIExERkxBR1MgICAgICA6PSAtTC4KLSAgIExJQiAgICAgICAgICA6PSBhcgotICAgTElCRkxBR1MgICAgIDo9IHJjcwotCi0jIExpbmsgdG8gc3RhdGljIGxpYnJhcmllcyBpZiByZXF1ZXN0ZWQKLS5JRiAkKFNUQVRJQ19MSUJTKQotICAgTERGTEFHUyAgICAgICs9IC1zdGF0aWMKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAtZwotLkVMU0UKLSMgTkFTTSBkb2VzIG5vdCBzdXBwb3J0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB5ZXQKLSAgIEFTRkxBR1MgICAgICArPQotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKLS5JRiAkKE9QVF9NQVgpCi0gICBDRkxBR1MgICAgICAgKz0gLU82Ci0uRUxJRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAtTzIKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLU8xCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucwotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLWRGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCRVRBCi0uRU5ESUYKLQotIyBEaXNhYmxlIHN0YW5kYXJkIEMgcnVudGltZSBsaWJyYXJ5Ci0KLS5JRiAkKE5PX1JVTlRJTUUpCi1DRkxBR1MJCQkrPSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jCi0uRU5ESUYKLQotIyBUYXJnZXQgZW52aXJvbm1lbnQgZGVwZW5kYW50IGZsYWdzCi0gICBDRkxBR1MgICAgICAgKz0gLURfX0JFT1NfXwotICAgQVNGTEFHUyAgICAgICs9IC1kX19CRU9TX18gLWRfX1VOSVhfXwotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKS9saWIvZGVidWcKLUNGTEFHUwkJKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQikvbGliL3JlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLUxJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFX0RJUikvYmVvcy9nY2MKLUxERkxBR1MgICAgICArPSAtTCQoTElCX0RFU1QpCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi1QTUxJQiAgICAgICAgICAgOj0gLWxwbQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gZ2NjX2Jlb3MubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2Rvcy5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2Rvcy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1ODljOC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2djY19kb3MubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIERKR1BQIFYyIHBvcnQgb2YgR05VIEMvQysrIHRvIERPUyB3aXRoIERQTUkgb25seS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCi0KLSMgT3ZlcnJpZGUgc29tZSBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucwotICAgTCAgICAgICAgICAgIDo9IC5hICAgICAjIExpYnJhcmllcwotICAgTyAgICAgICAgICAgIDo9IC5vICAgICAjIE9iamVjdHMKLQotIyBPdmVycmlkZSB0aGUgZmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zIGZvciBsaWJyYXJ5IG5hbWluZy4KLSAgIExQICAgICAgICAgICA6PSBsaWIJCSMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAtbAkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0JCQkjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IERKX0xJQkJBU0UKLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBnY2MgICAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCi0gICBDRkxBR1MgICAgICAgOj0gLVdhbGwKLSAgIEFTCQkJOj0gbmFzbQotICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIGNvZmYgLUYgbnVsbCAtZF9fRkxBVF9fIC1kX19HTlVDX18gLWRTVERDQUxMX1VTQ09SRSAtaUlOQ0xVREUgLWkkKFNDSVRFQ0gpXElOQ0xVREUKLSAgIExEICAgICAgICAgICA6PSBkal9sZCAgICAjIExvYWRlciBhbmQgZmxhZ3MKLSAgIExERkxBR1MgICAgICA6PQotICAgTElCICAgICAgICAgIDo9IGFyICAgICAgICMgTGlicmFyaWFuCi0gICBMSUJGTEFHUyAgICAgOj0gcnMKLSAgIFVTRV9OQVNNCQk6PSAxCi0gICBVU0VfR0NDCQk6PSAxCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC1nICAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIEMgY29tcGlsZXIKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1PMgotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtTzEKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucwotCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkQKLQotIyBET1MgZXh0ZW5kZXIgZGVwZW5kYW50IGZsYWdzCi0gICBEWF9DRkxBR1MgICAgKz0KLSAgIERYX0FTRkxBR1MgICArPSAtZERKR1BQCi0gICBVU0VfUkVBTERPUwk6PSAxCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFX0RJUilcRE9TMzJcJChESl9MSUJCQVNFKQotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotUE1MSUIgICAgICAgICAgIDo9IC1scG0KLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IGRqMzIubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2ZyZWVic2QubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2djY19mcmVlYnNkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2I0Yjg1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2ZyZWVic2QubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIExpbnV4IHZlcnNpb24gZm9yIEdOVSBDL0MrKy4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgRGlzYWJsZSB3YXJuaW5ncyBmb3IgbWFjcm9zIHJlZGVmaW5lZCBoZXJlIHRoYXQgd2VyZSBnaXZlbgotIyBvbiB0aGUgY29tbWFuZCBsaW5lLgotX18uU0lMRU5UICAgICAgIDo9ICQoLlNJTEVOVCkKLS5TSUxFTlQgICAgICAgICA6PSB5ZXMKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlIGNvbW1vbiB0byBhbGwgY29tcGlsZXJzCi0uSU1QT1JUIC5JR05PUkUgOiBURU1QIFNIRUxMIElOQ0xVREUgTElCIFNDSVRFQ0ggUFJJVkFURSBTQ0lURUNIX0xJQgotLklNUE9SVCAuSUdOT1JFIDogREJHIE9QVCBPUFRfU0laRSBTSFcgQkVUQSBDSEVDS0VEIFVTRV9YMTEgVVNFX0ZSRUVCU0QKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9FR0NTIFVTRV9QR0NDIFNUQVRJQ19MSUJTCi0gICBUTVBESVIgICAgICAgOj0gJChURU1QKQotCi0jIFN0YW5kYXJkIGZpbGUgc3VmZml4IGRlZmluaXRpb25zCi0jCi0jIE5PVEU6IExpbnV4IGRvZXMgbm90IHJlcXVpcmUgYW55IGV4dGVuaW9uIGZvciBleGVjdXRlYWJsZSBmaWxlcywgYnV0IHlvdQotIyAgICAgICBjYW4gdXNlIGFuIGV4dGVuc2lvbiBpZiB5b3Ugd2lzaC4gV2UgdXNlIHRoZSAueCBleHRlbnNpb24gZm9yIGJ1aWxkaW5nCi0jICAgICAgIGV4ZWN1dGVhYmxlIGZpbGVzIHNvIHRoYXQgd2UgY2FuIHVzZSBpbXBsaWNpdCBydWxlcyB0byBtYWtlIHRoZQotIyAgICAgICBtYWtlZmlsZXMgc2ltcGxlciBhbmQgbW9yZSBwb3J0YWJsZSBiZXR3ZWVuIHN5c3RlbXMuIFdoZW4geW91IGluc3RhbGwKLSMgICAgICAgdGhlIGZpbGVzIHRvIGEgbG9jYWwgYmluIGRpcmVjdG9yeSwgeW91IHdpbGwgcHJvYmFibHkgd2FudCB0byByZW1vdmUKLSMgICAgICAgdGhlIC54IGV4dGVuc2lvbi4KLSAgIEwgICAgICAgICAgICA6PSAuYSAgIAkjIExpYnJhcmllcwotICAgRSAgICAgICAgICAgIDo9IC54ICAgCSMgRXhlY3V0YWJsZXMKLSAgIE8gICAgICAgICAgICA6PSAubyAgIAkjIE9iamVjdHMKLSAgIEEgICAgICAgICAgICA6PSAuYXNtICAgCSMgQXNzZW1ibGVyIHNvdXJjZXMKLSAgIFMgICAgICAgICAgICA6PSAucyAgICAgICAjIEdOVSBhc3NlbWJsZXIgc291cmNlcwotICAgUCAgICAgICAgICAgIDo9IC5jcHAgICAJIyBDKysgc291cmNlcwotCi0jIEZpbGUgcHJlZml4L3N1ZmZpeCBkZWZpbml0aW9ucy4gVGhlIGZvbGxvd2luZyBwcmVmaXhlcyBhcmUgZGVmaW5lZCwgYW5kIGFyZQotIyB1c2VkIHByaW1hcmlseSB0byBhYnN0cmFjdCBiZXR3ZWVuIHRoZSBVbml4IHN0eWxlIGxpYlhYLmEgbmFtaW5nIGNvbnZlbnRpb24KLSMgYW5kIHRoZSBET1MvV2luZG93cy9PUzIgbmFtaW5nIGNvbnZlbnRpb24gb2YgWFgubGliLgotICAgTFAgICAgICAgICAgIDo9IGxpYiAgICAgICMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAtbAkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0gCQkgICAgIyBMaWJyYXJ5IGxpbmsgc3VmZml4IChleHRlbnNpb24gb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLQotIyBXZSB1c2UgdGhlIFVuaXggc2hlbGwgYXQgYWxsIHRpbWVzCi0gICBTSEVMTAkJOj0gL2Jpbi9zaAotICAgU0hFTExGTEFHUyAgIDo9IC1jCi0KLSMgRGVmaW5pdGlvbiBvZiAkKE1BS0UpIG1hY3JvIGZvciByZWN1cnNpdmUgbWFrZXMuCi0gICBNQUtFID0gJChNQUtFQ01EKSAkKE1GTEFHUykKLQotIyBNYWNybyB0byBpbnN0YWxsIGEgbGlicmFyeSBmaWxlCi0gICBJTlNUQUxMICAgICAgOj0gY3AKLQotIyBETUFLRSB1c2VzIHRoaXMgcmVjaXBlIHRvIHJlbW92ZSBpbnRlcm1lZGlhdGUgdGFyZ2V0cwotLlJFTU9WRSA6OyAkKFJNKSAtZiAkPAotCi0jIFR1cm4gd2FybmluZ3MgYmFjayB0byBwcmV2aW91cyBzZXR0aW5nLgotLlNJTEVOVCA6PSAkKF9fLlNJTEVOVCkKLQotIyBXZSBkb250IHVzZSBUQUJTIGluIG91ciBtYWtlZmlsZXMKLS5OT1RBQlMgICAgICAgICA6PSB5ZXMKLQotIyBEZWZpbmUgdGhhdCB3ZSBhcmUgY29tcGlsaW5nIGZvciBGcmVlQlNECi0gICBVU0VfTElOVVggICAgOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcuCi0uSUYgJChVU0VfRUdDUykKLSAgIENDICAgICAgICAgICA6PSBlZ2NzCi0uRUxJRiAkKFVTRV9QR0NDKQotICAgQ0MJCTo9IHBnY2MKLS5FTFNFCi0gICBDQyAgICAgICAgICAgOj0gZ2NjCi0uRU5ESUYKLSAgIENGTEFHUyAgICAgICA6PSAtV2FsbCAtSS4gLUlpbmNsdWRlICQoSU5DTFVERSkKLSAgIENYWCAgICAgICAgICA6PSBnKysKLSAgIEFTICAgICAgICAgICA6PSBuYXNtCi0jIFRPRE86IE9uIGVhcmxpZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAoPDMuMCkgYS5vdXQgaXMgdXNlZCBpbnN0ZWFkIG9mIEVMRgotICAgQVNGTEFHUyAgICAgIDo9IC1mIGVsZiAtZF9fRkxBVF9fIC1paW5jbHVkZSAtaSQoU0NJVEVDSCkvaW5jbHVkZSAtZF9fTk9VX18KLSAgIExEICAgICAgICAgICA6PSBnKysKLSAgIExERkxBR1MgICAgICA6PSAtTC4KLSAgIExJQiAgICAgICAgICA6PSBhcgotICAgTElCRkxBR1MgICAgIDo9IHJjcwotCi0jIExpbmsgdG8gc3RhdGljIGxpYnJhcmllcyBpZiByZXF1ZXN0ZWQKLS5JRiAkKFNUQVRJQ19MSUJTKQotICAgTERGTEFHUyAgICAgICs9IC1zdGF0aWMKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAtZwotLkVMU0UKLSMgTkFTTSBkb2VzIG5vdCBzdXBwb3J0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB5ZXQKLSAgIEFTRkxBR1MgICAgICArPQotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKLS5JRiAkKE9QVF9NQVgpCi0gICBDRkxBR1MgICAgICAgKz0gLU82Ci0uRUxJRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAtTzIKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLU8xCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucwotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLWRGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCRVRBCi0uRU5ESUYKLQotIyBEaXNhYmxlIHN0YW5kYXJkIEMgcnVudGltZSBsaWJyYXJ5Ci0KLS5JRiAkKE5PX1JVTlRJTUUpCi1DRkxBR1MJCQkrPSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jCi0uRU5ESUYKLQotIyBDb21waWxlIGZsYWcgZm9yIHdoZXRoZXIgdG8gYnVpbGQgWDExIG9yIG5vbi1YMTEgbGliCi0uSUYgJChVU0VfWDExKQotICAgQ0ZMQUdTICAgICAgICs9IC1EX19YMTFfXwotLkVORElGCi0KLSMgVGFyZ2V0IGVudmlyb25tZW50IGRlcGVuZGFudCBmbGFncwotICAgQ0ZMQUdTICAgICAgICs9IC1EX19GUkVFQlNEX18KLSAgIEFTRkxBR1MgICAgICArPSAtZF9fRlJFRUJTRF9fIC1kX19VTklYX18KLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQikvbGliL2RlYnVnCi1DRkxBR1MJCSs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpL2xpYi9yZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRV9ESVIpL2ZyZWVic2QvZ2NjCi0gICBMREZMQUdTICAgICAgKz0gLUwkKExJQl9ERVNUKQotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotUE1MSUIgICAgICAgICAgIDo9IC1scG0KLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IGdjY19mcmVlYnNkLm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2djY19saW51eC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2xpbnV4Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmM0Y2VkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2xpbnV4Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBMaW51eCB2ZXJzaW9uIGZvciBHTlUgQy9DKysuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKS9tYWtlZGVmcy9zdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IEdDQzJfTElCQkFTRQotCi0jIE92ZXJyaWRlIHNvbWUgZmlsZSBzdWZmaXggZGVmaW5pdGlvbnMKLSAgIEwgICAgICAgICAgICA6PSAuYSAgICAgIyBMaWJyYXJpZXMKLSAgIE8gICAgICAgICAgICA6PSAubyAgICAgIyBPYmplY3RzCi0KLSMgT3ZlcnJpZGUgdGhlIGZpbGUgcHJlZml4L3N1ZmZpeCBkZWZpbml0aW9ucyBmb3IgbGlicmFyeSBuYW1pbmcuCi0gICBMUCAgICAgICAgICAgOj0gbGliCQkjIExQIC0gTGlicmFyeSBmaWxlIHByZWZpeCAobmFtZSBvZiBmaWxlIG9uIGRpc2spCi0gICBMTCAgICAgICAgICAgOj0gLWwJCSMgTGlicmFyeSBsaW5rIHByZWZpeCAobmFtZSBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotICAgTEUgICAgICAgICAgIDo9CQkJIyBMaWJyYXJ5IGxpbmsgc3VmZml4IChleHRlbnNpb24gb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIERlZmluZSB0aGF0IHdlIGFyZSBjb21waWxpbmcgZm9yIExpbnV4Ci0gICBVU0VfTElOVVggICAgOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcuCi0gICBDQyAgICAgICAgICAgOj0gZ2NjCi0gICBDRkxBR1MgICAgICAgOj0gLVdhbGwgLUkuIC1JaW5jbHVkZSAtSSQoU0NJVEVDSDpzLFwsLykvaW5jbHVkZSAtSSQoUFJJVkFURTpzLFwsLykvaW5jbHVkZQotICAgU0hPV19DRkxBR1MJOj0gLWMKLSAgIENYWCAgICAgICAgICA6PSBnKysKLSAgIEFTICAgICAgICAgICA6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgZWxmIC1kX19GTEFUX18gLWRfX0dOVUNfXyAtaWluY2x1ZGUgLWkkKFNDSVRFQ0gpL2luY2x1ZGUgLWRfX05PVV9fCi0gICBTSE9XX0FTRkxBR1MJOj0gLWYgZWxmCi0gICBMRCAgICAgICAgICAgOj0gZ2NjCi0gICBMRFhYCQkJOj0gZysrCi0gICBMREZMQUdTICAgICAgOj0gLUwuCi0gICBMSUIgICAgICAgICAgOj0gYXIKLSAgIExJQkZMQUdTICAgICA6PSByY3MKLSAgIFlBQ0MJCQk6PSBiaXNvbiAteQotICAgTEVYCQkJOj0gZmxleAotICAgU0VECQkJOj0gc2VkCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC1nCi0gICBTSE9XX0NGTEFHUyAgKz0gLWcKLS5FTFNFCi0jIE5BU00gZG9lcyBub3Qgc3VwcG9ydCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24geWV0Ci0gICBBU0ZMQUdTICAgICAgKz0KLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFRfTUFYKQotICAgQ0ZMQUdTICAgICAgICs9IC1PNgotICAgU0hPV19DRkxBR1MgICs9IC1PNgotLkVMSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLU8yCi0gICBTSE9XX0NGTEFHUyAgKz0gLU8yCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC1PMQotICAgU0hPV19DRkxBR1MgICs9IC1PMQotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgU0hPV19DRkxBR1MgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQotICAgU0hPV19BU0ZMQUdTICs9IC1kQkVUQQotLkVORElGCi0KLSMgRGlzYWJsZSBzdGFuZGFyZCBDIHJ1bnRpbWUgbGlicmFyeQotCi0uSUYgJChOT19SVU5USU1FKQotQ0ZMQUdTCQkJKz0gLWZuby1idWlsdGluIC1ub3N0ZGluYwotLkVORElGCi0KLSMgQ29tcGlsZSBmbGFnIGZvciB3aGV0aGVyIHRvIGJ1aWxkIFgxMSBvciBub24tWDExIGxpYgotLklGICQoVVNFX1gxMSkKLSAgIENGTEFHUyAgICAgICArPSAtRF9fWDExX18KLS5FTkRJRgotCi0jIFRhcmdldCBlbnZpcm9ubWVudCBkZXBlbmRhbnQgZmxhZ3MKLSAgIENGTEFHUyAgICAgICArPSAtRF9fTElOVVhfXwotICAgQVNGTEFHUyAgICAgICs9IC1kX19MSU5VWF9fIC1kX19VTklYX18KLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQikvbGliL2RlYnVnCi1DRkxBR1MJCSAgICArPSAtRENIRUNLRUQ9MQotU0hPV19DRkxBR1MJICAgICs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpL2xpYi9yZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0uSUYgJChMSUJDKQotICAgTElCX0RFU1RfU0hBUkVEICA6PSAkKExJQl9CQVNFX0RJUikvbGludXgvZ2NjL2xpYmMuc28KLSAgIExJQl9ERVNUX1NUQVRJQyAgOj0gJChMSUJfQkFTRV9ESVIpL2xpbnV4L2djYy9saWJjCi0uRUxTRQotICAgTElCX0RFU1RfU0hBUkVEICA6PSAkKExJQl9CQVNFX0RJUikvbGludXgvZ2NjL2dsaWJjLnNvCi0gICBMSUJfREVTVF9TVEFUSUMgIDo9ICQoTElCX0JBU0VfRElSKS9saW51eC9nY2MvZ2xpYmMKLS5FTkRJRgotCi0jIExpbmsgdG8gc3RhdGljIGxpYnJhcmllcyBpZiByZXF1ZXN0ZWQKLS5JRiAkKFNUQVRJQ19MSUJTX0FMTCkKLSAgIExERkxBR1MgICAgICArPSAtc3RhdGljCi0gICBTVEFUSUNfTElCUyAgOj0gMQotLkVORElGCi0KLSMgTGluayB0byBzdGF0aWMgbGlicmFyaWVzIGlmIHJlcXVlc3RlZAotLklGICQoU1RBVElDX0xJQlMpCi0gICBMREZMQUdTICAgICAgKz0gLUwkKExJQl9ERVNUX1NUQVRJQykKLS5FTFNFCi0gICBMREZMQUdTICAgICAgKz0gLUwkKExJQl9ERVNUX1NIQVJFRCkgLUwkKExJQl9ERVNUX1NUQVRJQykKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgZW5hYmxlIHNvbWUgIGR5bmFtaWMgbGlicmFyaWVzIHRvIGJlIGJ1aWx0Ci0uSUYgJChCVUlMRF9ETEwpCi0uSUYgJChWRVJTSU9OTUFKKQotLkVMU0UKLSAgIFZFUlNJT05NQUoJOj0gNQotICAgVkVSU0lPTk1JTgk6PSAwCi0uRU5ESUYKLSAgIFZFUlNJT04gICAgICA6PSAkKFZFUlNJT05NQUopLiQoVkVSU0lPTk1JTikKLSAgIExJQgkJICAgIDo9IGdjYyAtc2hhcmVkCi0gICBMSUJGTEFHUwkgICAgOj0KLSAgIEwJCSAgICA6PSAuc28KLSAgIENGTEFHUwkgICAgKz0gLWZQSUMKLSAgIFNIT1dfQ0ZMQUdTCSs9IC1mUElDCi0gICBBU0ZMQUdTICAgICAgKz0gLURfX1BJQ19fCi0gICBTSE9XX0FTRkxBR1MgKz0gLURfX1BJQ19fCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfREVTVF9TSEFSRUQpCi0uRUxTRQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0RFU1RfU1RBVElDKQotLkVORElGCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi1QTUxJQiAgICAgICAgICAgOj0gLWxwbQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gZ2NjX2xpbnV4Lm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2djY193aW4zMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX3dpbjMyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWNjZjk3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX3dpbjMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBDeWd3aW4gcG9ydCBvZiBHTlUgQy9DKysgdG8gV2luMzIuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IEdDQzJfTElCQkFTRQotCi0jIE92ZXJyaWRlIHNvbWUgZmlsZSBzdWZmaXggZGVmaW5pdGlvbnMKLSAgIEwgICAgICAgICAgICA6PSAuYSAgICAgIyBMaWJyYXJpZXMKLSAgIE8gICAgICAgICAgICA6PSAubyAgICAgIyBPYmplY3RzCi0KLSMgT3ZlcnJpZGUgdGhlIGZpbGUgcHJlZml4L3N1ZmZpeCBkZWZpbml0aW9ucyBmb3IgbGlicmFyeSBuYW1pbmcuCi0gICBMUCAgICAgICAgICAgOj0gbGliCQkjIExQIC0gTGlicmFyeSBmaWxlIHByZWZpeCAobmFtZSBvZiBmaWxlIG9uIGRpc2spCi0gICBMTCAgICAgICAgICAgOj0gLWwJCSMgTGlicmFyeSBsaW5rIHByZWZpeCAobmFtZSBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotICAgTEUgICAgICAgICAgIDo9CQkJIyBMaWJyYXJ5IGxpbmsgc3VmZml4IChleHRlbnNpb24gb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBnY2MgICAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCi0gICBDRkxBR1MgICAgICAgOj0gLVdhbGwgLUkuIC1JaW5jbHVkZSAtSSQoU0NJVEVDSDpzLFwsLykvaW5jbHVkZSAtSSQoUFJJVkFURTpzLFwsLykvaW5jbHVkZQotICAgU0hPV19DRkxBR1MJOj0gLWMKLSAgIENYWCAgICAgICAgICA6PSBnKysKLSAgIEFTCQkJOj0gbmFzbQotICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIGNvZmYgLUYgbnVsbCAtZF9fRkxBVF9fIC1kX19HTlVDX18gLWRTVERDQUxMX1VTQ09SRSAtaUlOQ0xVREUgLWkkKFNDSVRFQ0gpXElOQ0xVREUKLSAgIFNIT1dfQVNGTEFHUwk6PSAtZiBjb2ZmCi0gICBMRCAgICAgICAgICAgOj0gZ2NjICAgIAkjIExvYWRlciBhbmQgZmxhZ3MKLSAgIExEWFgJCQk6PSBnKysKLS5JRiAkKFdJTjMyX0dVSSkKLSAgIExERkxBR1MgICAgICA6PSAtTC4gLW13aW5kb3dzIC1lIF9tYWluQ1JUU3RhcnR1cAotLkVMU0UKLSAgIExERkxBR1MgICAgICA6PSAtTC4KLS5FTkRJRgotICAgUkMgICAgICAgICAgIDo9IHdpbmRyZXMKLSAgIFJDRkxBR1MJCTo9IC1PIGNvZmYKLSAgIExJQiAgICAgICAgICA6PSBhciAgICAgICAjIExpYnJhcmlhbgotICAgTElCRkxBR1MgICAgIDo9IHJjcwotICAgWUFDQwkJCTo9IGJpc29uIC15Ci0gICBMRVgJCQk6PSBmbGV4Ci0gICBTRUQJCQk6PSBzZWQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLWcKLSAgIFNIT1dfQ0ZMQUdTICArPSAtZwotLkVMU0UKLSMgTkFTTSBkb2VzIG5vdCBzdXBwb3J0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB5ZXQKLSAgIEFTRkxBR1MgICAgICArPQotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKLS5JRiAkKE9QVF9NQVgpCi0gICBDRkxBR1MgICAgICAgKz0gLU82Ci0gICBTSE9XX0NGTEFHUyAgKz0gLU82Ci0uRUxJRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAtTzIKLSAgIFNIT1dfQ0ZMQUdTICArPSAtTzIKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLU8xCi0gICBTSE9XX0NGTEFHUyAgKz0gLU8xCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucwotCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIFNIT1dfQ0ZMQUdTICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLSAgIFNIT1dfQVNGTEFHUyArPSAtZEJFVEEKLS5FTkRJRgotCi0jIERPUyBleHRlbmRlciBkZXBlbmRhbnQgZmxhZ3MKLSAgIERYX0NGTEFHUyAgICArPQotICAgRFhfQVNGTEFHUyAgICs9IC1kR0NDX1dJTjMyCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKLVNIT1dfQ0ZMQUdTCSAgICArPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0VfRElSKVxXSU4zMlwkKEdDQzJfTElCQkFTRSkKLSAgIExERkxBR1MgICAgICArPSAtTCQoTElCX0RFU1QpCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi1QTUxJQiAgICAgICAgICAgOj0gLWxwbQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gZ2NjX3dpbjMyLm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2hjMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2hjMzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYjA2NWEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9oYzMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBNZXRhd2FyZSBIaWdoIEMvQysrIDMuMjEgMzIgYml0IHZlcnNpb24uIFN1cHBvcnRzIFBoYXIgTGFwJ3MKLSMgICAgICAgICAgICAgICBUTlQgRE9TIEV4dGVuZGVyLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBoYzM4NiAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCi0gICBDRkxBR1MgICAgICAgOj0KLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteCAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTFNFCi0gICBBUyAgICAgICAgICAgOj0gdGFzbSAgICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCi0uRU5ESUYKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0ZMQVRfXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLSAgIExEICAgICAgICAgICA6PSBoYzM4NgotICAgTERGTEFHUyAgICAgICA9ICQoQ0ZMQUdTKQotICAgTElCICAgICAgICAgIDo9IDM4NmxpYiAgICMgVE5UIDM4NnxsaWIgTGlicmFyaWFuCi0gICBMSUJGTEFHUyAgICAgOj0gLVRDCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC1nICAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIEMgY29tcGlsZXIKLSAgIEFTRkxBR1MgICAgICArPSAvemkgICAgICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBhc3NlbWJsZXIKLS5FTFNFCi0gICBBU0ZMQUdTICAgICAgKz0gL3EgICAgICAgIyBTdXBwcmVzcyBvYmplY3QgcmVjb3JkcyBub3QgbmVlZGVkIGZvciBsaW5raW5nCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKLS5JRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAtNTg2IC1PCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC01ODYgLU8xCi0uRUxTRQotICAgQ0ZMQUdTICAgICAgICs9IC1PMAotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0KLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1ERlBVMzg3Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1EQkVUQQotLkVORAotCi0jIERPUyBleHRlbmRlciBkZXBlbmRhbnQgZmxhZ3MKLSAgIFVTRV9UTlQgICAgICA6PSAxCi0gICBVU0VfUkVBTERPUwk6PSAxCi0gICBEWF9DRkxBR1MgICAgKz0gLURUTlQKLSAgIERYX0FTRkxBR1MgICArPSAtRFROVAotICAgTERGTEFHUyAgICAgICs9IC1MSDpcVE5UXExJQgotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotUE1MSUIgICAgICAgICAgIDo9IHRudFxwbS5saWIKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVxET1MzMlxIQwotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSBoYzMyLm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3FueDQubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3FueDQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODNhZjMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9xbng0Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBRTlggdmVyc2lvbiBmb3IgV2F0Y29tIEMuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIERpc2FibGUgd2FybmluZ3MgZm9yIG1hY3JvcyByZWRlZmluZWQgaGVyZSB0aGF0IHdlcmUgZ2l2ZW4KLSMgb24gdGhlIGNvbW1hbmQgbGluZS4KLV9fLlNJTEVOVCAgICAgICA6PSAkKC5TSUxFTlQpCi0uU0lMRU5UICAgICAgICAgOj0geWVzCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZSBjb21tb24gdG8gYWxsIGNvbXBpbGVycwotLklNUE9SVCAuSUdOT1JFIDogVEVNUCBTSEVMTCBJTkNMVURFIExJQiBTQ0lURUNIIFBSSVZBVEUgU0NJVEVDSF9MSUIKLS5JTVBPUlQgLklHTk9SRSA6IERCRyBPUFQgT1BUX1NJWkUgU0hXIEJFVEEgQ0hFQ0tFRCBVU0VfUU5YIFVTRV9RTlg0Ci0uSU1QT1JUIC5JR05PUkUgOiBVU0VfUEhPVE9OIFVTRV9YMTEgVVNFX0JJT1MgU0hPV19BUkdTIE1BWF9XQVJOIFdDX0xJQkJBU0UKLSAgIFRNUERJUiAgICAgICA6PSAkKFRFTVApCi0KLSMgU3RhbmRhcmQgZmlsZSBzdWZmaXggZGVmaW5pdGlvbnMKLSMKLSMgTk9URTogUW54IGRvZXMgbm90IHJlcXVpcmUgYW55IGV4dGVuc2lvbiBmb3IgZXhlY3V0ZWFibGUgZmlsZXMsIGJ1dCB5b3UKLSMgICAgICAgY2FuIHVzZSBhbiBleHRlbnNpb24gaWYgeW91IHdpc2guIFdlIHVzZSB0aGUgLnggZXh0ZW5zaW9uIGZvciBidWlsZGluZwotIyAgICAgICBleGVjdXRlYWJsZSBmaWxlcyBzbyB0aGF0IHdlIGNhbiB1c2UgaW1wbGljaXQgcnVsZXMgdG8gbWFrZSB0aGUKLSMgICAgICAgbWFrZWZpbGVzIHNpbXBsZXIgYW5kIG1vcmUgcG9ydGFibGUgYmV0d2VlbiBzeXN0ZW1zLiBXaGVuIHlvdSBpbnN0YWxsCi0jICAgICAgIHRoZSBmaWxlcyB0byBhIGxvY2FsIGJpbiBkaXJlY3RvcnksIHlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gcmVtb3ZlCi0jICAgICAgIHRoZSAueCBleHRlbnNpb24uCi0gICBMICAgICAgICAgICAgOj0gLmEgICAJIyBMaWJyYXJpZXMKLSAgIEUgICAgICAgICAgICA6PSAuZXhlICAgCSMgRXhlY3V0YWJsZXMKLSAgIE8gICAgICAgICAgICA6PSAubyAgIAkjIE9iamVjdHMKLSAgIEEgICAgICAgICAgICA6PSAuYXNtICAgCSMgQXNzZW1ibGVyIHNvdXJjZXMKLSAgIFMgICAgICAgICAgICA6PSAucyAgICAgICAjIEdOVSBhc3NlbWJsZXIgc291cmNlcwotICAgUCAgICAgICAgICAgIDo9IC5jcHAgICAJIyBDKysgc291cmNlcwotCi0jIEZpbGUgcHJlZml4L3N1ZmZpeCBkZWZpbml0aW9ucy4gVGhlIGZvbGxvd2luZyBwcmVmaXhlcyBhcmUgZGVmaW5lZCwgYW5kIGFyZQotIyB1c2VkIHByaW1hcmlseSB0byBhYnN0cmFjdCBiZXR3ZWVuIHRoZSBVbml4IHN0eWxlIGxpYlhYLmEgbmFtaW5nIGNvbnZlbnRpb24KLSMgYW5kIHRoZSBET1MvV2luZG93cy9PUzIgbmFtaW5nIGNvbnZlbnRpb24gb2YgWFgubGliLgotICAgTFAgICAgICAgICAgIDo9IGxpYiAgICAgICMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAtbAkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0gCQkgICAgIyBMaWJyYXJ5IGxpbmsgc3VmZml4IChleHRlbnNpb24gb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLQotIyBXZSB1c2UgdGhlIFVuaXggc2hlbGwgYXQgYWxsIHRpbWVzCi0gICBTSEVMTAkJOj0gL2Jpbi9zaAotICAgU0hFTExGTEFHUyAgIDo9IC1jCi0KLSMgRGVmaW5pdGlvbiBvZiAkKE1BS0UpIG1hY3JvIGZvciByZWN1cnNpdmUgbWFrZXMuCi0gICBNQUtFID0gJChNQUtFQ01EKSAkKE1GTEFHUykKLQotIyBNYWNybyB0byBpbnN0YWxsIGEgbGlicmFyeSBmaWxlCi0gICBJTlNUQUxMICAgICAgOj0gY3AKLQotIyBETUFLRSB1c2VzIHRoaXMgcmVjaXBlIHRvIHJlbW92ZSBpbnRlcm1lZGlhdGUgdGFyZ2V0cwotLlJFTU9WRSA6OyAkKFJNKSAtZiAkPAotCi0jIFR1cm4gd2FybmluZ3MgYmFjayB0byBwcmV2aW91cyBzZXR0aW5nLgotLlNJTEVOVCA6PSAkKF9fLlNJTEVOVCkKLQotIyBXZSBkb250IHVzZSBUQUJTIGluIG91ciBtYWtlZmlsZXMKLS5OT1RBQlMgICAgICAgICA6PSB5ZXMKLQotIyBEZWZpbmUgdGhhdCB3ZSBhcmUgY29tcGlsaW5nIGZvciBRTlgKLSAgIFVTRV9RTlggICAgCTo9IDEKLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nLgotICAgQ0MgICAgICAgICAgIDo9IHdjYzM4NgotICAgQ0ZMQUdTICAgICAgIDo9IC1JLiAtSWluY2x1ZGUgJChJTkNMVURFKQotICAgQ1hYICAgICAgICAgIDo9IHdwcDM4NgotICAgQVMgICAgICAgICAgIDo9IG5hc20KLSAgIEFTRkxBR1MgICAgICA6PSAtdCAtZiBvYmogLWRfX0ZMQVRfXyAtZFNURENBTExfTUFOR0xFIC1paW5jbHVkZSAtaSQoU0NJVEVDSCkvaW5jbHVkZQotICAgTEQgICAgICAgICAgIDo9IGNjCi0gICBMREZMQUdTICAgICAgOj0gLUwuCi0gICBMSUIgICAgICAgICAgOj0gYXIKLSAgIExJQkZMQUdTICAgICA6PSByYwotCi0jIFNldCB0aGUgY29tcGlsZXIgd2FybmluZyBsZXZlbAotLklGICQoTUFYX1dBUk4pCi0gICBDRkxBR1MgICAgICAgKz0gLXc0Ci0uRUxTRQotICAgQ0ZMQUdTICAgICAgICs9IC13MQotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC1kMgotICAgTERGTEFHUyAgICAgICs9IC1nMgotLkVMU0UKLSMgTkFTTSBkb2VzIG5vdCBzdXBwb3J0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB5ZXQKLSAgIEFTRkxBR1MgICAgICArPQotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKLS5JRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAtb25hdHgtNXItZnA1Ci0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC1vbmFzbG1yLTVyLWZwNQotLkVMSUYgJChOT09QVCkKLSAgIENGTEFHUyAgICAgICArPSAtb2QtNXIKLS5FTkQKLQotIyBDb21waWxlIGZsYWcgZm9yIHdoZXRoZXIgdG8gYnVpbGQgcGhvdG9uIG9yIG5vbi1waG90b24gbGliCi0uSUYgJChVU0VfUEhPVE9OKQotICAgQ0ZMQUdTICAgICAgICs9IC1EX19QSE9UT05fXwotLkVORElGCi0KLSMgQ29tcGlsZSBmbGFnIGZvciB3aGV0aGVyIHRvIGJ1aWxkIFgxMSBvciBub24tWDExIGxpYgotLklGICQoVVNFX1gxMSkKLSAgIENGTEFHUyAgICAgICArPSAtRF9fWDExX18KLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkRJRgotCi0jIFRhcmdldCBlbnZpcm9ubWVudCBkZXBlbmRhbnQgZmxhZ3MKLSAgIENGTEFHUyAgICAgICArPSAtRF9fUU5YX18gLURfX1VOSVhfXwotICAgQVNGTEFHUyAgICAgICs9IC1kX19RTlhfXyAtZF9fVU5JWF9fCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotICBMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQikvbGliL2RlYnVnCi0gIENGTEFHUwkJKz0gLURDSEVDS0VEPTEKLS5FTFNFCi0gIExJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKS9saWIvcmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKS9xbng0LyQoV0NfTElCQkFTRSkKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQotICAgTERGTEFHUyAgICAgICs9IC1MJChMSUJfREVTVCkKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLVBNTElCICAgICAgICAgICA6PSAtbHBtCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSBxbng0Lm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3FueG50by5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcW54bnRvLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTY4ZWQyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcW54bnRvLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBRTlggTmV1dHJpbm8gdmVyc2lvbiBmb3IgR05VIEMvQysrCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIERpc2FibGUgd2FybmluZ3MgZm9yIG1hY3JvcyByZWRlZmluZWQgaGVyZSB0aGF0IHdlcmUgZ2l2ZW4KLSMgb24gdGhlIGNvbW1hbmQgbGluZS4KLV9fLlNJTEVOVCAgICAgICA6PSAkKC5TSUxFTlQpCi0uU0lMRU5UICAgICAgICAgOj0geWVzCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZSBjb21tb24gdG8gYWxsIGNvbXBpbGVycwotLklNUE9SVCAuSUdOT1JFIDogVEVNUCBTSEVMTCBJTkNMVURFIExJQiBTQ0lURUNIIFBSSVZBVEUgU0NJVEVDSF9MSUIKLS5JTVBPUlQgLklHTk9SRSA6IERCRyBPUFQgT1BUX1NJWkUgU0hXIEJFVEEgQ0hFQ0tFRCBVU0VfUU5YIFVTRV9RTlhOVE8KLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9FR0NTIFVTRV9QSE9UT04gVVNFX1gxMSBVU0VfQklPUwotICAgVE1QRElSICAgICAgIDo9ICQoVEVNUCkKLQotIyBTdGFuZGFyZCBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucwotIwotIyBOT1RFOiBRbnggZG9lcyBub3QgcmVxdWlyZSBhbnkgZXh0ZW5zaW9uIGZvciBleGVjdXRlYWJsZSBmaWxlcywgYnV0IHlvdQotIyAgICAgICBjYW4gdXNlIGFuIGV4dGVuc2lvbiBpZiB5b3Ugd2lzaC4gV2UgdXNlIHRoZSAueCBleHRlbnNpb24gZm9yIGJ1aWxkaW5nCi0jICAgICAgIGV4ZWN1dGVhYmxlIGZpbGVzIHNvIHRoYXQgd2UgY2FuIHVzZSBpbXBsaWNpdCBydWxlcyB0byBtYWtlIHRoZQotIyAgICAgICBtYWtlZmlsZXMgc2ltcGxlciBhbmQgbW9yZSBwb3J0YWJsZSBiZXR3ZWVuIHN5c3RlbXMuIFdoZW4geW91IGluc3RhbGwKLSMgICAgICAgdGhlIGZpbGVzIHRvIGEgbG9jYWwgYmluIGRpcmVjdG9yeSwgeW91IHdpbGwgcHJvYmFibHkgd2FudCB0byByZW1vdmUKLSMgICAgICAgdGhlIC54IGV4dGVuc2lvbi4KLSAgIEwgICAgICAgICAgICA6PSAuYSAgIAkjIExpYnJhcmllcwotICAgRSAgICAgICAgICAgIDo9IC54ICAgCSMgRXhlY3V0YWJsZXMKLSAgIE8gICAgICAgICAgICA6PSAubyAgIAkjIE9iamVjdHMKLSAgIEEgICAgICAgICAgICA6PSAuYXNtICAgCSMgQXNzZW1ibGVyIHNvdXJjZXMKLSAgIFMgICAgICAgICAgICA6PSAucyAgICAgICAjIEdOVSBhc3NlbWJsZXIgc291cmNlcwotICAgUCAgICAgICAgICAgIDo9IC5jcHAgICAJIyBDKysgc291cmNlcwotCi0jIEZpbGUgcHJlZml4L3N1ZmZpeCBkZWZpbml0aW9ucy4gVGhlIGZvbGxvd2luZyBwcmVmaXhlcyBhcmUgZGVmaW5lZCwgYW5kIGFyZQotIyB1c2VkIHByaW1hcmlseSB0byBhYnN0cmFjdCBiZXR3ZWVuIHRoZSBVbml4IHN0eWxlIGxpYlhYLmEgbmFtaW5nIGNvbnZlbnRpb24KLSMgYW5kIHRoZSBET1MvV2luZG93cy9PUzIgbmFtaW5nIGNvbnZlbnRpb24gb2YgWFgubGliLgotICAgTFAgICAgICAgICAgIDo9IGxpYiAgICAgICMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAtbAkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0gCQkgICAgIyBMaWJyYXJ5IGxpbmsgc3VmZml4IChleHRlbnNpb24gb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLQotIyBXZSB1c2UgdGhlIFVuaXggc2hlbGwgYXQgYWxsIHRpbWVzCi0gICBTSEVMTAkJOj0gL2Jpbi9zaAotICAgU0hFTExGTEFHUyAgIDo9IC1jCi0KLSMgRGVmaW5pdGlvbiBvZiAkKE1BS0UpIG1hY3JvIGZvciByZWN1cnNpdmUgbWFrZXMuCi0gICBNQUtFID0gJChNQUtFQ01EKSAkKE1GTEFHUykKLQotIyBNYWNybyB0byBpbnN0YWxsIGEgbGlicmFyeSBmaWxlCi0gICBJTlNUQUxMICAgICAgOj0gY3AKLQotIyBETUFLRSB1c2VzIHRoaXMgcmVjaXBlIHRvIHJlbW92ZSBpbnRlcm1lZGlhdGUgdGFyZ2V0cwotLlJFTU9WRSA6OyAkKFJNKSAtZiAkPAotCi0jIFR1cm4gd2FybmluZ3MgYmFjayB0byBwcmV2aW91cyBzZXR0aW5nLgotLlNJTEVOVCA6PSAkKF9fLlNJTEVOVCkKLQotIyBXZSBkb250IHVzZSBUQUJTIGluIG91ciBtYWtlZmlsZXMKLS5OT1RBQlMgICAgICAgICA6PSB5ZXMKLQotIyBEZWZpbmUgdGhhdCB3ZSBhcmUgY29tcGlsaW5nIGZvciBRTlgKLSAgIFVTRV9RTlggICAgCTo9IDEKLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nLgotICAgQ0MgICAgICAgICAgIDo9IHFjYwotICAgQ0ZMQUdTICAgICAgIDo9IC1WZ2NjX250b3g4NiAtSS4gLUlpbmNsdWRlICQoSU5DTFVERSkKLSAgIENQUEZMQUdTICAgICA6PSAtVmdjY19udG94ODYgLUkuIC1JaW5jbHVkZSAkKElOQ0xVREUpCi0gICBDWFggICAgICAgICAgOj0gUUNDCi0gICBBUyAgICAgICAgICAgOj0gbmFzbQotICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIGVsZiAtZF9fRkxBVF9fIC1kX19HTlVDX18gLWRTVERDQUxMX01BTkdMRSAtaWluY2x1ZGUgLWkkKFNDSVRFQ0gpL2luY2x1ZGUgLWRfX05PVV9fCi0gICBMRCAgICAgICAgICAgOj0gcWNjCi0gICBMREZMQUdTICAgICAgOj0gLVZnY2NfbnRveDg2IC1MLiAtbG0KLSAgIExJQiAgICAgICAgICA6PSBhcgotICAgTElCRkxBR1MgICAgIDo9IHJjCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC1nMgotICAgTERGTEFHUyAgICAgICs9IC1nMgotLkVMU0UKLSMgTkFTTSBkb2VzIG5vdCBzdXBwb3J0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB5ZXQKLSAgIEFTRkxBR1MgICAgICArPQotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKLS5JRiAkKE9QVF9NQVgpCi0gICBDRkxBR1MgICAgICAgKz0gLU90Ci0uRUxJRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAtTwotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtT3MKLS5FTkRJRgotCi0jIENvbXBpbGUgZmxhZyBmb3Igd2hldGhlciB0byBidWlsZCBwaG90b24gb3Igbm9uLXBob3RvbiBsaWIKLS5JRiAkKFVTRV9QSE9UT04pCi0gICBDRkxBR1MgICAgICAgKz0gLURfX1BIT1RPTl9fCi0uRU5ESUYKLQotIyBDb21waWxlIGZsYWcgZm9yIHdoZXRoZXIgdG8gYnVpbGQgWDExIG9yIG5vbi1YMTEgbGliCi0uSUYgJChVU0VfWDExKQotICAgQ0ZMQUdTICAgICAgICs9IC1EX19YMTFfXwotLkVORElGCi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQotLkVORElGCi0KLSMgVGFyZ2V0IGVudmlyb25tZW50IGRlcGVuZGFudCBmbGFncwotICAgQ0ZMQUdTICAgICAgICs9IC1EX19RTlhfXyAtRF9fVU5JWF9fCi0gICBBU0ZMQUdTICAgICAgKz0gLWRfX1FOWF9fIC1kX19VTklYX18KLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi0gIExJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKS9saWIvZGVidWcKLSAgQ0ZMQUdTCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLSAgTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpL2xpYi9yZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfREVTVAk6PSAkKExJQl9CQVNFX0RJUikvcW54bnRvCi0gICBMREZMQUdTICAgICAgKz0gLUwkKExJQl9ERVNUKQotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotUE1MSUIgICAgICAgICAgIDo9IC1scG0KLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IHFueG50by5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iYzE2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iYzE2Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2FlOTEwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvYmMxNi5taworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpIC1jICQ8Ci0lJE86ICUkUCA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpIC1jICQ8Ci0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgcmVzb3VyY2UgZmlsZXMKLSUkUjogJS5yYyA7ICQoUkMpICQoUkNGTEFHUykgLXIgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKLSUkRDogICAgICA7ICQoTEQpICQobWt0bXAgJChMREZMQUdTKSAtQyAtVHdkIGMwZGwub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoREVGX0xJQlMpICQoRVhFTElCUylcbiQqLmRlZikKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChCVUlMRF9ETEwpCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMSUYgJChJTVBPUlRfRExMKQotJSRMOiA7Ci0gICAgQCQoUk0pICRACi0gICAgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTFNFCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKExJQlIpICQoTElCRkxBR1MpICRAIEAkKG1rdG1wICskKCY6dCIgJlxuKyIpXG4pCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoVVNFX1dJTjE2KQotJSRFOiA7ICQoTEQpICQobWt0bXAgJChMREZMQUdTKSAtQyAtVHdlICQoV0lOX1ZFUlNJT04pIGMwd2wub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoREVGX0xJQlMpICQoRVhFTElCUylcbiQqLmRlZikKLS5FTFNFCi0lJEU6IDsgJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1UZGUgYzBsLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKFBNTElCKSAkKERFRl9MSUJTKSAkKEVYRUxJQlMpKQotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2JjMy5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvYmMzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGQwNzFjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvYmMzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1MpKSAtYyAkPAotJSRPOiAlJFAgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUykpIC1jICQ8Ci0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wICQoQVNGTEFHUykpICQoPDpzLC8sXCkKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKExJQlIpICQoTElCRkxBR1MpICRAIEAkKG1rdG1wICskKCY6dCIgJlxuKyIpXG4pCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLSUkRTogOyAkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRkZSBjMGwub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoREVGX0xJQlMpICQoRVhFTElCUykpCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2JjMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2JjMzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzY2UyNWIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iYzMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotLklGICQoVVNFX1ZYRCkKLQotIyBJbXBsaWNpdCBydWxlIGdlbmVyYXRpb24gdG8gYnVpbGQgVnhEJ3MKLQotJSRPOiAlLmMgOwotCSQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpIC1jICQoPDpzLC8sXCkKLQlAJChWVE9PTFNEKVxiaW5cc2VnYWxpYXMuZXhlIC1wICQoVlRPT0xTRClcaW5jbHVkZVxkZWZhdWx0LnNlZyAkQAotCi0lJE86ICUkUCA7Ci0JJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgLWMgJCg8OnMsLyxcKQotCUAkKFZUT09MU0QpXGJpblxzZWdhbGlhcy5leGUgLXAgJChWVE9PTFNEKVxpbmNsdWRlXGRlZmF1bHQuc2VnICRACi0KLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLQotJSRMOiA7ICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCAtKyQoPzp0IiAmXG4tKyIpXG4pCi0KLSUuZGxsOiA7Ci0JQCQoQ1ApICQobWt0bXAgRVhQT1JUU1xuX1RoZV9EREIgQDEpICQqLmRlZgotCXRsaW5rMzIuZXhlIEAkKG1rdG1wICQoTERGTEFHUykgLVRwZCAkKFZUT09MU0Q6cy9cL1xcKVxsaWJcaWNydGJjNC5vYmorXG4kKCY6cy9cL1xcKVxuJCouZGxsXG4kKi5tYXBcbiQoREVGX0xJQlM6cy9cL1xcKSAkKFBNTElCOnMvXC9cXCkgJChFWEVMSUJTOnMvXC9cXClcbiQqLmRlZikKLQlAJChSTSkgLVMgJChta3RtcCAkKi5kZWYpCi0KLSUudnhkOiAlLmRsbCA7Ci0JQCQoQ1ApICQobWt0bXAgRFlOQU1JQ1xuQVRUUklCIElDT0RFIElOSVRcbkFUVFJJQiBMQ09ERSBMT0NLRURcbkFUVFJJQiBQQ09ERSBQQUdFQUJMRVxuQVRUUklCIFNDT0RFIFNUQVRJQ1xuQVRUUklCIERCT0NPREUgREVCVUdcbk1FUkdFIElDT0RFIElOSVREQVQwIElOSVREQVRBKSAkKi5wZWwKLQlAJChWVE9PTFNEKVxiaW5cdnhkdmVyLmV4ZSAkKi52cmMgJCoucmVzCi0JQCQoVlRPT0xTRClcYmluXHBlbGUuZXhlIC1kIC1zICQqLnNtZiAtYyAkKi5wZWwgLW8gJEAgLWsgNDAwICQqLmRsbAotCUAkKFZUT09MU0QpXGJpblxzZXRoZHIuZXhlIC1uICQqIC14ICRAIC1yICQqLnJlcwotLklGICQoREJHKQotCSQoTk1TWU0pIC9UUkFOUzpzb3VyY2UscGFja2FnZSAvU09VUkNFOiQoVlhEU09VUkNFKSAkKi5zbWYKLS5FTkRJRgotCUAkKFJNKSAtUyAkKG1rdG1wICQqLnBlbCkKLQotLkVMU0UKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzLCBsaWJyYXJpZXMgYW5kIGV4ZSdzCi0KLSUkTzogJS5jIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgLWMgJCg8OnMsLyxcKQotJSRPOiAlJFAgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAtYyAkKDw6cywvLFwpCi0uSUYgJChVU0VfTkFTTSkKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTFNFCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcwotJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQotLklGICQoSU1QT1JUX0RMTCkKLS5FTFNFCi0uSUYgJChOT19SVU5USU1FKQotJSREOiA7ICQoTEQpICQobWt0bXAgJChMREZMQUdTKSAtVHBkIC1hYSAkKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChFWEVMSUJTKVxuJCouZGVmKQotLkVMU0UKLSUkRDogOwotCW1ha2VkZWYgJChAOmIpCi0JJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1UcGQgLWFhIGMwZDMyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTOnMvXC9cXCkgJChQTUxJQjpzL1wvXFwpICQoRVhFTElCUylcbiQqLmRlZikKLS5JRiAkKERCRykKLS5JRiAkKFVTRV9TT0ZUSUNFKQotCSQoTk1TWU0pICQoTk1TWU1GTEFHUyk7JChTSV9TT1VSQ0UpICRACi0JdGRzdHJwMzIgJEAKLS5FTkRJRgotLkVORElGCi0uRU5ESUYKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKEJVSUxEX0RMTCkKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxJRiAkKElNUE9SVF9ETEwpCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMU0UKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCArJCgmOnQiICZcbisiKVxuKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLQotLklGICQoVVNFX1dJTjMyKQotLklGICQoV0lOMzJfR1VJKQotJSRFOiA7Ci0JJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1UcGUgLWFhICQoV0lOX1ZFUlNJT04pIGMwdzMyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTOnMvXC9cXCkgJChQTUxJQjpzL1wvXFwpICQoRVhFTElCUylcbiQqLmRlZikKLS5JRiAkKERCRykKLS5JRiAkKFVTRV9TT0ZUSUNFKQotCSQoTk1TWU0pICQoTk1TWU1GTEFHUyk7JChTSV9TT1VSQ0UpICRACi0JdGRzdHJwMzIgJEAKLS5FTkRJRgotLkVORElGCi0uRUxTRQotJSRFOiA7Ci0JJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1UcGUgLWFwIGMweDMyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTOnMvXC9cXCkgJChQTUxJQjpzL1wvXFwpICQoRVhFTElCUylcbiQqLmRlZikKLS5JRiAkKFVTRV9TT0ZUSUNFKQotCSQoTk1TWU0pICQoTk1TWU1GTEFHUyk7JChTSV9TT1VSQ0UpICRACi0JdGRzdHJwMzIgJEAKLS5FTkRJRgotLkVORElGCi0uRUxJRiAkKFVTRV9UTlQpCi0lJEU6IDsKLQlAJChDUCkgJChta3RtcCBzdHViICdnb3RudC5leGUnKSAkKi5kZWYKLQlAJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1UcGUgLWFwIGMweDMyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTKSAkKFBNTElCOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQotLklGICQoRE9TU1RZTEUpCi0JQG1hcmtwaGFyICRACi0uRU5ESUYKLQlAJChSTSkgLVMgJChta3RtcCAkKi5kZWYpCi0uRUxJRiAkKFVTRV9TTVgzMikKLSUkRTogOyAkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRwZSAtYXAgYzB4MzIub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoREVGX0xJQlMpICQoUE1MSUI6cy9cL1xcKSAkKEVYRUxJQlMpXG4kKi5kZWYpCi0uRUxTRQotJSRFOiA7ICQoTEQpICQobWt0bXAgJChMREZMQUdTKSAtVHBlIC1hcCBjMHgzMi5vYmorXG4kKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChERUZfTElCUykgJChQTUxJQjpzL1wvXFwpICQoRVhFTElCUylcbiQqLmRlZikKLS5FTkQKLQotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2Jjb3MyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iY29zMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3M2ZlYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2Jjb3MyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgLWMgJCg8OnMsLyxcKQotJSRPOiAlJFAgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAtYyAkKDw6cywvLFwpCi0uSUYgJChVU0VfTkFTTSkKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTFNFCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcwotJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQotJSREOiA7Ci0JbWFrZWRlZiAkKEA6YikKLQkkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRvZCAtYWEgYzAyZC5vYmorXG4kKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChERUZfTElCUzpzL1wvXFwpICQoRVhFTElCUylcbiQqLmRlZikKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChCVUlMRF9ETEwpCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMSUYgJChJTVBPUlRfRExMKQotJSRMOiA7Ci0gICAgQCQoUk0pICRACi0gICAgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTFNFCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKExJQikgJChMSUJGTEFHUykgJEAgQCQobWt0bXAgKyQoJjp0IiAmXG4rIilcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0KLS5JRiAkKFVTRV9PUzJHVUkpCi0lJEU6IDsgJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1Ub2UgLWFhIGMwMi5vYmorXG4kKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChERUZfTElCUzpzL1wvXFwpICQoRVhFTElCUylcbiQqLmRlZikKLS5FTFNFCi0lJEU6IDsgJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1Ub2UgLWFwIGMwMi5vYmorXG4kKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChERUZfTElCUzpzL1wvXFwpICQoRVhFTElCUylcbiQqLmRlZikKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9jbDE2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9jbDE2Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDg5YTNlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvY2wxNi5taworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpIC9ub2xvZ28gJChDRkxBR1MpIC9jICQ8Ci0lJE86ICUkUCA7ICQoQ0MpIC9ub2xvZ28gJChDRkxBR1MpIC9jICQ8Ci0lJE86ICUkQSA7ICQoQVMpICQoQVNGTEFHUykgJDwgJCogTlVMIE5VTAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwgdXNpbmcgYSByZXNwb25zZSBmaWxlCi0jJSREOiA7IHJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUzpzL1wvXFwpIC1lJEBcbiQoJjp0IlxuIjpzL1wvXFwpXG4kKEVYRUxJQlMpKQotIyUkRDogOyAkKExEKSAkKExERkxBR1MpIC9GZSRAICQmICQoRVhFTElCUykKLSUkRDogOyAgbGluayBAZGVmYXVsdC5yc3AKLQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKEJVSUxEX0RMTCkKLSUkTDogICAgICA7ICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxJRiAkKElNUE9SVF9ETEwpCi0lJEw6ICAgICAgOyAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMU0UKLSUkTDogOyAkKExJQikgL25vbG9nbyAkKExJQkZMQUdTKSAkQCBAJChta3RtcCAtKyQoPzp0IiAmXG4tKyIpICZcbiwsXG4pCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoVVNFX1dJTjE2KQotIyUkRTogOyByY2xpbmsgJChMRCkgJChSQykgJEAgJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjpzL1wvXFwpICQoRVhFTElCUykpCi0lJEU6IDsgJChMRCkgQCQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6cy9cL1xcKSAkKEVYRUxJQlMpKQotLkVMU0UKLSUkRTogOyAkKExEKSBAJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjpzL1wvXFwpICQoUE1MSUIpICQoRVhFTElCUykpCi0uRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvY2wzODYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2NsMzg2Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTBiMjc0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvY2wzODYubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KLSMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCi0jCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCi0jCQkJCWRpZmZlcmVudGx5KS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKLQotLklGICQoTk9fUE1MSUIpCi1QTUxJQiA6PQotLkVORElGCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcwotJSRPOiAlLmMgOyAkKENDKSAtbm9sb2dvICQoQ0ZMQUdTKSAtYyAkPAotJSRPOiAlJFAgOyAkKENDKSAtbm9sb2dvICQoQ0ZMQUdTKSAtYyAkPAotJSRPOiAlJEEgOyAkKEFTKSAkKEFTRkxBR1MpICQ8ICQqIE5VTCBOVUwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcwotJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQotIyUkRDogOyByY2xpbmsgJChMRCkgJChSQykgJEAgJChta3RtcCAkKExERkxBR1M6cy9cL1xcKSAtZSRAXG4kKCY6dCJcbiI6cy9cL1xcKVxuJChFWEVMSUJTKSkKLSMlJEQ6IDsgJChMRCkgJChMREZMQUdTKSAvRmUkQCAkJiAkKEVYRUxJQlMpCi0lJEQ6IDsgIGxpbmszODYgQGRlZmF1bHQucnNwCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBkZXZpY2UgZHJpdmVyIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQotJS5TWVM6IDsgIGxpbmszODYgQGRlZmF1bHQucnNwCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiAgICAgIDsgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTElGICQoSU1QT1JUX0RMTCkKLSUkTDogICAgICA7ICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxTRQotJSRMOiA7ICQoTElCKSAvbm9sb2dvICQoTElCRkxBR1MpICRAIEAkKG1rdG1wIC0rJCg/OnQiICZcbi0rIikgJlxuLCxcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChVU0VfV0lOMTYpCi0jJSRFOiA7IHJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSkKLSUkRTogOyAkKExEKSBAJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjpzL1wvXFwpICQoRVhFTElCUykpCi0uRUxTRQotJSRFOiA7ICQoTEQpIEAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnMvXC9cXCkgJChQTUxJQikgJChFWEVMSUJTKSkKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9kajMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9kajMyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjkxN2JiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZGozMi5taworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkgLWMpICQoPDpzLC8sXCkKLSUkTzogJSRQIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSAtYykgJCg8OnMsLyxcKQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAtbyAkQCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLSUkTDogICAgICA7ICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCAkKCY6cy9cL1xcKVxuKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0lJEU6ICAgICAgOyAkKExEKSAkKExERkxBR1MpICRAIEAkKG1rdG1wICQoJjpzL1wvXFwpICQoRVhFTElCUykgJChQTUxJQikgLWxzdGRjeHggLWxtKQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9lbXgubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2VteC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkMjIzYS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2VteC5taworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyAgICAgICAgICAgICAgIE9TLzIgdmVyc2lvbiBmb3IgRU1YL0dOVSBDL0MrKy4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKLQotLklGICQoTk9fUE1MSUIpCi1QTUxJQiA6PQotLkVORElGCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcwotJSRPOiAlLmMgOwotLklGICQoU0hPV19BUkdTKQotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKDw6cyxcLC8pCi0uRUxTRQotCUBlY2hvICQoQ0MpIC1jICQoPDpzLFwsLykKLQlAJChDQykgLWMgJChDRkxBR1MpICQoPDpzLFwsLykKLS5FTkRJRgotCi0lJE86ICUkUCA7Ci0uSUYgJChTSE9XX0FSR1MpCi0JJChDWFgpIC1jICQoQ0ZMQUdTKSAkKDw6cyxcLC8pCi0uRUxTRQotCUBlY2hvICQoQ1hYKSAtYyAkKDw6cyxcLC8pCi0JQCQoQ1hYKSAtYyAkKENGTEFHUykgJCg8OnMsXCwvKQotLkVORElGCi0KLSUkTzogJSRBIDsKLS5JRiAkKFVTRV9OQVNNKQotLklGICQoU0hPV19BUkdTKQotCSQoQVMpIC1vICRAICQoQVNGTEFHUykgJCg8OnMsXCwvKQotLkVMU0UKLQlAZWNobyAkKEFTKSAkKDw6cyxcLC8pCi0JQCQoQVMpIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUykpICQoPDpzLFwsLykKLS5FTkRJRgotLkVMU0UKLS5JRiAkKFNIT1dfQVJHUykKLQotICAgICQoQVMpICBAJChta3RtcCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVMU0UKLQlAZWNobyAkKEFTKSAkKDw6cywvLFwpCi0gICAgJChBUykgIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRU5ESUYKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLSUkTDogICAgIDsKLS5JRiAkKFNIT1dfQVJHUykKLQkkKExJQikgJChMSUJGTEFHUykgJEAgJCgmOnMsXCwvKQotLkVMU0UKLQlAZWNobyAkKExJQikgJEAKLQlAJChMSUIpICQoTElCRkxBR1MpICRAIEAkKG1rdG1wICQoPzp0IlxuIikpCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotJSRFOiAgICAgOwotLklGICQoU0hPV19BUkdTKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJCgmOnMsXCwvKSAkKEVYRUxJQlMpICQoUE1MSUIpIC1sZ3BwIC1sc3RkY3BwCi0uRUxTRQotCUBlY2hvICQoTEQpICRACi0JQCQoTEQpICQoTERGTEFHUykgLW8gJEAgJCgmOnMsXCwvKSAkKEVYRUxJQlMpICQoUE1MSUIpIC1sZ3BwIC1sc3RkY3BwCi0uRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX2Jlb3MubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY19iZW9zLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODFiNjk4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX2Jlb3MubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KLSMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCi0jCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCi0jCQkJCWRpZmZlcmVudGx5KS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKLQotLklGICQoTk9fUE1MSUIpCi1QTUxJQiA6PQotLkVORElGCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcyBmcm9tIHNvdXJjZSBmaWxlcwotJSRPOiAlLmMgOyAkKENDKSAkKENGTEFHUykgLWMgJDwKLSUkTzogJSRQIDsgJChDWFgpICQoQ0ZMQUdTKSAtYyAkPAotJSRPOiAlJEEgOyAkKEFTKSAkKEFTRkxBR1MpICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUKLSUkTDogICAgIDsgJChMSUIpICQoTElCRkxBR1MpICRAICQmCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlCi0lJEU6ICAgICA7ICQoTEQpICQoTERGTEFHUykgLW8gJEAgJCYgJChFWEVMSUJTKSAkKFBNTElCKQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9nY2NfZnJlZWJzZC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX2ZyZWVic2QubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNGQyMzYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9nY2NfZnJlZWJzZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzIGZyb20gc291cmNlIGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAotJSRPOiAlJFAgOyAkKENYWCkgJChDRkxBR1MpIC1jICQ8Ci0lJE86ICUkQSA7ICQoQVMpIC1vICRAICQoQVNGTEFHUykgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZQotJSRMOiAgICAgOyAkKExJQikgJChMSUJGTEFHUykgJEAgJCYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUKLSUkRTogICAgIDsgJChMRCkgJChMREZMQUdTKSAtbyAkQCAkJiAkKEVYRUxJQlMpICQoUE1MSUIpIC1sbQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9nY2NfbGludXgubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY19saW51eC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5MWZlNS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY19saW51eC5taworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotLklGICQoVVNFX0NYWF9MSU5LRVIpCi1MRAk6PSAkKExEWFgpCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzIGZyb20gc291cmNlIGZpbGVzCi0lJE86ICUuYyA7Ci0uSUYgJChTSE9XX0FSR1MpCi0gICAgJChDQykgLWMgJChDRkxBR1MpICQ8Ci0uRUxTRQotICAgIEAkKEVDSE8pICQoQ0MpICQoU0hPV19DRkxBR1MpICQ8Ci0gICAgQCQoQ0MpIC1jICQoQ0ZMQUdTKSAkPAotLkVORElGCi0KLSUkTzogJSRQIDsKLS5JRiAkKFNIT1dfQVJHUykKLSAgICAkKENYWCkgLWMgJChDRkxBR1MpICQ8Ci0uRUxTRQotICAgIEAkKEVDSE8pICQoQ1hYKSAkKFNIT1dfQ0ZMQUdTKSAkPAotICAgIEAkKENYWCkgLWMgJChDRkxBR1MpICQ8Ci0uRU5ESUYKLQotJSRPOiAlJEEgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoQVMpIC1vICRAICQoQVNGTEFHUykgJDwKLS5FTFNFCi0gICAgQCQoRUNITykgJChBUykgJChTSE9XX0FTRkxBR1MpICQ8Ci0gICAgQCQoQVMpIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUykpICQ8Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiAgICAgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoTElCKSAkKExJQkZMQUdTKSAtV2wsLXNvbmFtZSwkQC4kKFZFUlNJT05NQUopIC1vICRAICQmICQoTElCUykKLS5FTFNFCi0gICAgQCQoRUNITykgJChMSUIpICRACi0gICAgQCQoTElCKSAkKExJQkZMQUdTKSAtV2wsLXNvbmFtZSwkQC4kKFZFUlNJT05NQUopIC1vICRAICQmICQoTElCUykKLS5FTkRJRgotLkVMU0UKLSUkTDogICAgIDsKLS5JRiAkKFNIT1dfQVJHUykKLSAgICAkKExJQikgJChMSUJGTEFHUykgJEAgJCYKLS5FTFNFCi0gICAgQCQoRUNITykgJChMSUIpICRACi0gICAgQCQoTElCKSAkKExJQkZMQUdTKSAkQCAkJgotLkVORElGCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUKLSUkRTogICAgIDsKLS5JRiAkKFNIT1dfQVJHUykKLSAgICAkKExEKSAkKExERkxBR1MpIC1vICRAICQmICQoRVhFTElCUykgJChQTUxJQikgLWxtCi0uRUxTRQotICAgIEAkKEVDSE8pIGxkICRACi0gICAgQCQoTEQpICQoTERGTEFHUykgLW8gJEAgJCYgJChFWEVMSUJTKSAkKFBNTElCKSAtbG0KLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9nY2Nfd2luMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY193aW4zMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg1ZDE2Ni4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY193aW4zMi5taworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotLklGICQoVVNFX0NYWF9MSU5LRVIpCi1MRAk6PSAkKExEWFgpCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzIGZyb20gc291cmNlIGZpbGVzCi0lJE86ICUuYyA7Ci0uSUYgJChTSE9XX0FSR1MpCi0gICAgJChDQykgLWMgJChDRkxBR1M6cy9cL1xcKSAkKDw6cywvLFwpCi0uRUxTRQotICAgIEAkKEVDSE8pICQoQ0MpICQoU0hPV19DRkxBR1M6cy9cL1xcKSAkKDw6cywvLFwpCi0gICAgQCQoQ0MpIC1jICQoQ0ZMQUdTOnMvXC9cXCkgJCg8OnMsLyxcKQotLkVORElGCi0KLSUkTzogJSRQIDsKLS5JRiAkKFNIT1dfQVJHUykKLSAgICAkKENYWCkgLWMgJChDRkxBR1M6cy9cL1xcKSAkKDw6cywvLFwpCi0uRUxTRQotICAgIEAkKEVDSE8pICQoQ1hYKSAkKFNIT1dfQ0ZMQUdTOnMvXC9cXCkgJCg8OnMsLyxcKQotICAgIEAkKENYWCkgLWMgJChDRkxBR1M6cy9cL1xcKSAkKDw6cywvLFwpCi0uRU5ESUYKLQotJSRPOiAlJEEgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoQVMpIC1vICQoQVNGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKLS5FTFNFCi0gICAgQCQoRUNITykgJChBUykgJChTSE9XX0FTRkxBR1M6cy9cL1xcKSAkKDw6cywvLFwpCi0gICAgQCQoQVMpIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcwotJSRSOiAlLnJjIDsgJChSQykgJDwgJChSQ0ZMQUdTKSAtbyAkQAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMCi0jIFRPRE8hCi0jJSREOiA7ICtyY2xpbmsgJChMRCkgJChSQykgJEAgJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjp0IlxuInMvXC9cXCkgJChQTUxJQikgJChFWEVMSUJTKSAkKERFRl9MSUJTKSAkKExERU5ERkxBR1MpKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlCi0lJEw6ICAgICA7Ci0uSUYgJChTSE9XX0FSR1MpCi0gICAgJChMSUIpICQoTElCRkxBR1MpICRAICQmCi0uRUxTRQotICAgIEAkKEVDSE8pICQoTElCKSAkQAotICAgIEAkKExJQikgJChMSUJGTEFHUykgJEAgQCQobWt0bXAgJCgmOnMvXC9cXClcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZQotJSRFOiAgICAgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoTEQpICQoTERGTEFHUykgLW8gJEAgJCYgJChFWEVMSUJTKSAkKFBNTElCKSAtbG0KLS5FTFNFCi0gICAgQCQoRUNITykgbGQgJEAKLSAgICBAJChMRCkgJChMREZMQUdTKSAtbyAkQCBAJChta3RtcCAkKCY6cy9cL1xcKSAkKEVYRUxJQlMpICQoUE1MSUIpIC1sbSkKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9oYzMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9oYzMyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTFlOWFiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvaGMzMi5taworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAotJSRPOiAlJFAgOyAkKENDKSAkKENGTEFHUykgLWMgJDwKLS5JRiAkKFVTRV9OQVNNKQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAtbyAkQCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVMU0UKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLSUkTDogICAgICA7ICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCwkKi5yc3AgLVIgJD8pCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLSUkRTogICAgICA7ICQoTEQpICQoTERGTEFHUykgLW8gJEAgQCQobWt0bXAgJCgmOnMvXC9cXCkgJChQTUxJQikgJChFWEVMSUJTKSAtbGRvc3gzMi5saWIpCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3FueDQubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3FueDQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZGMwMzUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9xbng0Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIFdoZXRoZXIgdG8gbGluayBpbiByZWFsIFZCSU9TIGxpYnJhcnksIG9yIGp1c3QgdGhlIHN0dWIgbGlicmFyeQotCi0uSUYgJChVU0VfQklPUykKLVZCSU9TTElCIDo9IC1sdmJpb3MubGliCi0uRUxTRQotVkJJT1NMSUIgOj0gLWx2YnN0dWJzLmxpYgotLkVORAotCi0jIFJlcXVpcmUgc3BlY2lhbCBwcml2bGVkZ2VzIGZvciBOdWNsZXVzIHByb2dyYW1zIChyZXF1aXJlcyByb290IGFjY2VzcykKLQotLklGICQoVVNFX05VQ0xFVVMpCi1MREZMQUdTCQkrPSAtVDEKLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMgZnJvbSBzb3VyY2UgZmlsZXMKLSUkTzogJS5jIDsKLS5JRiAkKFNIT1dfQVJHUykKLSAgICAkKENDKSAkKENGTEFHUykgJDwKLS5FTFNFCi0gICAgQGVjaG8gJChDQykgLWMgJDwKLQkrQCQoQ0MpICQoQ0ZMQUdTKSAkPCA+IC9kZXYvbnVsbAotLkVORElGCi0KLSUkTzogJSRQIDsKLS5JRiAkKFNIT1dfQVJHUykKLQkkKENYWCkgJChDRkxBR1MpICQ8Ci0uRUxTRQotCUBlY2hvICQoQ1hYKSAtYyAkPAotCStAJChDWFgpICQoQ0ZMQUdTKSAkPCA+IC9kZXYvbnVsbAotLkVORElGCi0KLSUkTzogJSRBIDsKLS5JRiAkKFNIT1dfQVJHUykKLSAgICAkKEFTKSAtbyAkQCAkKEFTRkxBR1MpICQ8Ci0uRUxTRQotICAgIEBlY2hvICQoQVMpICQ8Ci0JQCQoQVMpIC1vICRAICQoQVNGTEFHUykgJDwKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlCi0lJEw6ICAgICA7Ci0uSUYgJChTSE9XX0FSR1MpCi0gICAgJChMSUIpICQoTElCRkxBR1MpIC1xICRAICQmCi0uRUxTRQotICAgIEBlY2hvICQoTElCKSAkQAotCStAJChMSUIpICQoTElCRkxBR1MpIC1xICRAICQmID4gL2Rldi9udWxsCi0uRU5ESUYKLQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZQotJSRFOiAgICAgOwotLklGICQoU0hPV19BUkdTKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJCYgJChFWEVMSUJTKSAkKFBNTElCKSAkKFZCSU9TTElCKQotLkVMU0UKLQlAZWNobyB3bGluayAkQAotCStAJChMRCkgJChMREZMQUdTKSAtbyAkQCAkJiAkKEVYRUxJQlMpICQoUE1MSUIpICQoVkJJT1NMSUIpID4gL2Rldi9udWxsCi0uRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvcW54bnRvLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9xbnhudG8ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0M2FkMWYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9xbnhudG8ubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KLSMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCi0jCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCi0jCQkJCWRpZmZlcmVudGx5KS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKLQotLklGICQoTk9fUE1MSUIpCi1QTUxJQiA6PQotLkVORElGCi0KLSMgV2hldGhlciB0byBsaW5rIGluIHJlYWwgVkJJT1MgbGlicmFyeSwgb3IganVzdCB0aGUgc3R1YiBsaWJyYXJ5Ci0KLS5JRiAkKFVTRV9CSU9TKQotVkJJT1NMSUIgOj0gLWx2YmlvcwotLkVMU0UKLVZCSU9TTElCIDo9IC1sdmJzdHVicwotLkVORAotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMgZnJvbSBzb3VyY2UgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgJChDRkxBR1MpIC1jICQ8Ci0lJE86ICUkUCA7ICQoQ1hYKSAkKENQUEZMQUdTKSAtYyAkPAotJSRPOiAlJEEgOyAkKEFTKSAtbyAkQCAkKEFTRkxBR1MpICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUKLSUkTDogICAgIDsgJChMSUIpICQoTElCRkxBR1MpICRAICQmCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlCi0lJEU6ICAgICA7ICQoTEQpICQoTERGTEFHUykgLW8gJEAgJCYgJChFWEVMSUJTKSAkKFBNTElCKSAkKFZCSU9TTElCKQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9zYzE2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9zYzE2Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzNiY2Q4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvc2MxNi5taworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAotJSRPOiAlJFAgOyAkKENDKSAkKENGTEFHUykgLWMgJDwKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTKSkgJCg8OnMsLyxcKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwgdXNpbmcgYSByZXNwb25zZSBmaWxlCi0lJEQ6IDsgJChMRCkgJChMREZMQUdTKSBAJChta3RtcCAkKCY6cy9cL1xcKSAkKEVYRUxJQlMpKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKEJVSUxEX0RMTCkKLSUkTDogOyAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMSUYgJChJTVBPUlRfRExMKQotJSRMOiA7ICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxTRQotJSRMOiA7ICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCAtKyQoPzp0IiAmXG4tKyIpXG4pCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoVVNFX1dJTjE2KQotJSRFOiA7ICQoTEQpICQoTERGTEFHUykgQCQobWt0bXAgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSkKLS5FTFNFCi0lJEU6IDsgJChMRCkgJChMREZMQUdTKSBAJChta3RtcCAkKCY6cy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpKQotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3NjMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3NjMzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMzE5MDYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9zYzMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgJChDRkxBR1MpIC1jICQ8Ci0lJE86ICUkUCA7ICQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAotLklGICQoVVNFX05BU00pCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRUxTRQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgcmVzb3VyY2UgZmlsZXMKLSUkUjogJS5yYyA7ICQoUkMpICQoUkNGTEFHUykgLXIgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKLSUkRDogOyAkKExEKSAkKExERkxBR1MpIEAkKG1rdG1wLCQqLmxuayAkKCY6cy9cL1xcKSAkKEVYRUxJQlMpIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5tbS5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYikKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChCVUlMRF9ETEwpCi0lJEw6IDsgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTElGICQoSU1QT1JUX0RMTCkKLSUkTDogOyAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMU0UKLSUkTDogOyAkKExJQikgJChMSUJGTEFHUykgJEAgQCQobWt0bXAgLSskKD86dCIgJlxuLSsiKVxuKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKFVTRV9UTlQpCi0lJEU6IDsgJChMRCkgJChMREZMQUdTKSBAJChta3RtcCwkKi5sbmsgJCgmOnMvXC9cXCkgJChQTUxJQikgJChFWEVMSUJTKSkKLS5FTElGICQoVVNFX1dJTjMyKQotJSRFOiA7ICQoTEQpICQoTERGTEFHUykgQCQobWt0bXAsJCoubG5rICQoJjpzL1wvXFwpICQoRVhFTElCUykga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbm1tLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliKQotLkVMU0UKLSUkRTogOyAkKExEKSAkKExERkxBR1MpIEAkKG1rdG1wLCQqLmxuayAkKCY6cy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpKQotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZhMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZhMzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMjAzMTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy92YTMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpICAtYyBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAgJCg8OnMsLyxcKQotJSRPOiAlJFAgOyAkKENQUCkgLWMgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgICQoPDpzLC8sXCkKLS5JRiAkKFVTRV9OQVNNKQotJSRPOiAlJEEgOyAkKEFTKSAgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTFNFCi0lJE86ICUkQSA7ICQoQVMpICBAJChta3RtcCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgcmVzb3VyY2UgZmlsZXMKLSUkUjogJS5yYyA7ICQoUkMpICQoUkNGTEFHUykgLXIgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBoZWxwIGZpbGVzCi0lLmhscDogJS5pcGY7ICQoSVBGQykgJChJUEZDRkxBR1MpICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwgdXNpbmcgYSByZXNwb25zZSBmaWxlCi0uSUYgJChVU0VfT1MyR1VJKQotJSREOiA7IHJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgJCgmOnQiK1xuIjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpICQoUE1MSUIpXG4kKi5kZWZcbikKLS5FTFNFCi0lJEQ6IDsgJChMRCkgL25vZnJlZSAvbm9sIEAkKG1rdG1wICQoTERGTEFHUykgJCgmOnQiK1xuIjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpICQoUE1MSUIpXG4kKi5kZWZcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKEJVSUxEX0RMTCkKLSUkTDogOyAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMSUYgJChJTVBPUlRfRExMKQotJSRMOiA7ICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxTRQotJSRMOiA7ICQoTElCKSAkKExJQkZMQUdTKSBAJChta3RtcCAkQC0rJCg/OnQiJlxuLSsiOnMvXC9cXCk7KQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKFVTRV9PUzJHVUkpCi0lJEU6IDsKLQlyY2xpbmsgJChMRCkgJChSQykgJEAgJChta3RtcCAkKExERkxBR1MpICQoJjp0IitcbiI6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChFWEVMSUJTKSAkKFBNTElCKVxuJCouZGVmXG4pCi0uSUYgJChMWExJVEUpCi0JbHhsaXRlICRACi0uRU5ESUYKLS5FTFNFCi0lJEU6IDsKLQlyY2xpbmsgJChMRCkgJChSQykgJEAgJChta3RtcCAkKExERkxBR1MpICQoJjp0IitcbiI6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChFWEVMSUJTKSAkKFBNTElCKVxuXG4pCi0uSUYgJChMWExJVEUpCi0JbHhsaXRlICRACi0uRU5ESUYKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy92YTM2NS5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvdmEzNjUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNDE4MDEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy92YTM2NS5taworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudGx5KS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKLQotLklGICQoTk9fUE1MSUIpCi1QTUxJQiA6PQotLkVORElGCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcwotJSRPOiAlLmMgOyAkKENDKSAtYyBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAgJCg8OnMsLyxcKQotJSRPOiAlJFAgOyAkKENQUCkgLWMgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgICQoPDpzLC8sXCkKLS5JRiAkKFVTRV9OQVNNKQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAtbyAkQCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVMU0UKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwgdXNpbmcgYSByZXNwb25zZSBmaWxlCi0uSUYgJChVU0VfT1MyR1VJKQotJSREOiA7IHJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgJCgmOnQiK1xuIjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpICQoUE1MSUIpXG4kKi5kZWZcbikKLS5FTFNFCi0lJEQ6IDsgJChMRCkgL25vZnJlZSAvbm9sIEAkKG1rdG1wICQoTERGTEFHUykgJCgmOnQiK1xuIjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpICQoUE1MSUIpXG4kKi5kZWZcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKEJVSUxEX0RMTCkKLSUkTDogOyAkKElMSUIpICQoSUxJQkZMQUdTKSAvb3V0OiRAICQ/Ci0uRUxJRiAkKElNUE9SVF9ETEwpCi0lJEw6IDsgJChJTElCKSAkKElMSUJGTEFHUykgL291dDokQCAkPwotLkVMU0UKLSUkTDogOyAkKExJQikgJChMSUJGTEFHUykgL25vd2Fybjo4NiAvb3V0OiRAIEAkKG1rdG1wICQoPzp0IlxuIjpzL1wvXFwpKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKFVTRV9PUzJHVUkpCi0lJEU6IDsKLQlyY2xpbmsgJChMRCkgJChSQykgJEAgJChta3RtcCAkKExERkxBR1MpICQoJjp0IitcbiI6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChFWEVMSUJTKSAkKFBNTElCKVxuJCouZGVmXG4pCi0uSUYgJChMWExJVEUpCi0JbHhsaXRlICRACi0uRU5ESUYKLS5FTFNFCi0lJEU6IDsKLQlyY2xpbmsgJChMRCkgJChSQykgJEAgJChta3RtcCAkKExERkxBR1MpICQoJjp0IitcbiI6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChFWEVMSUJTKSAkKFBNTElCKVxuXG4pCi0uSUYgJChMWExJVEUpCi0JbHhsaXRlICRACi0uRU5ESUYKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy92YzE2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy92YzE2Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmZjMjcwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvdmMxNi5taworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpIC9ub2xvZ28gJChDRkxBR1MpIC9jICQ8Ci0lJE86ICUkUCA7ICQoQ0MpIC9ub2xvZ28gJChDRkxBR1MpIC9jICQ8Ci0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wICQoQVNGTEFHUykpICQoPDpzLC8sXCkKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcwotJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQotJSREOiA7IHJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgLWUkQFxuJCgmOnQiXG4iOnMvXC9cXClcbiQoRVhFTElCUykpCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiA7Ci0gICAgQCQoUk0pICRACi0gICAgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTElGICQoSU1QT1JUX0RMTCkKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxTRQotJSRMOiA7Ci0gICAgQCQoUk0pICRACi0gICAgJChMSUIpICRAIC9ub2xvZ28gJChMSUJGTEFHUykgQCQobWt0bXAgKyQoJjp0IiAmXG4rIikgJlxuLFxuKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKFVTRV9XSU4xNikKLSUkRTogOyByY2xpbmsgJChMRCkgJChSQykgJEAgJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjpzL1wvXFwpICQoRVhFTElCUykpCi0jJSRFOiA7ICQoTEQpIEAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSkKLS5FTFNFCi0lJEU6IDsgJChMRCkgQCQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6cy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpKQotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZjMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZjMzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZjFhMGMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy92YzMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUdXJuIG9uIHByZS1jb21waWxlZCBoZWFkZXJzIGFzIG5lY2Nlc3NhcnkKLS5JRiAkKFBSRUNPTVBfSERSKQotICAgQ0ZMQUdTICAgICAgICs9IC1ZWCIkKFBSRUNPTVBfSERSKSIKLS5FTkRJRgotCi0jIFR1cm4gb24gcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGFzIG5lY2Vzc2FyeQotLklGICQoVVNFX1JUVEkpCi0JQ0ZMQUdTCQkrPSAvR1IKLS5FTkRJRgotCi0jIFR1cm4gb24gQysrIGV4Y2VwdGlvbiBoYW5kbGluZyBhcyBuZWNlc3NhcnkKLS5JRiAkKFVTRV9DUFBFWENFUFQpCi0JQ0ZMQUdTCQkrPSAvR1gKLS5FTkRJRgotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgL25vbG9nbyBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAvYyAkKDw6cywvLFwpCi0lJE86ICUkUCA7ICQoQ0MpIC9ub2xvZ28gQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgL2MgJCg8OnMsLyxcKQotLklGICQoVVNFX05BU00pCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRUxTRQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgcmVzb3VyY2UgZmlsZXMKLSUkUjogJS5yYyA7ICQoUkMpICQoUkNGTEFHUykgLXIgJDwKLQotIyBJbXBsaWNpdCBydWxlcyBmb3IgYnVpbGRpbmcgTlQgZGV2aWNlIGRyaXZlcnMKLQotJS5zeXM6IDsKLQkkKExEKSAvbm9sb2dvIEAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnQiXG4icy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpICQoREVGX0xJQlMpICQoTERFTkRGTEFHUykpCi0uSUYgJChEQkcpCi0uSUYgJChVU0VfU09GVElDRSkKLQkkKE5NU1lNKSAkKE5NU1lNRkxBR1MpOyQoU0lfU09VUkNFKSAkQAotLkVORElGCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKLS5JRiAkKElNUE9SVF9ETEwpCi0uRUxTRQotLklGICQoTk9fUlVOVElNRSkKLSUkRDogOyAkKExEKSAvbm9sb2dvIEAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnQiXG4icy9cL1xcKSAkKEVYRUxJQlMpICQoREVGX0xJQlMpICQoTERFTkRGTEFHUykpCi0uRUxTRQotJSREOiA7Ci0JbWFrZWRlZiAtdiAkKgotCSQoTEQpIC9ub2xvZ28gQCQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6dCJcbiJzL1wvXFwpICQoUE1MSUIpICQoRVhFTElCUykgJChERUZfTElCUykgJChMREVOREZMQUdTKSkKLS5JRiAkKERCRykKLS5JRiAkKFVTRV9TT0ZUSUNFKQotCSQoTk1TWU0pICQoTk1TWU1GTEFHUyk7JChTSV9TT1VSQ0UpICRACi0uRU5ESUYKLS5FTkRJRgotLkVORElGCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlLiBOb3RlIHRoYXQKLSMgd2UgdXNlIGEgc3BlY2lhbCAuVkNEIGZpbGUgdGhhdCBjb250YWlucyB0aGUgRVhQT1JUIGRlZmluaXRpb25zIGZvciB0aGUKLSMgTWljcm9zb2Z0IGNvbXBpbGVyLCBzaW5jZSB0aGUgTElCIHV0aWxpdHkgYXV0b21hdGljYWxseSBhZGRzIGxlYWRpbmcKLSMgdW5kZXJzY29yZXMgdG8gZXhwb3J0ZWQgZnVuY3Rpb25zLgotLklGICQoSU1QT1JUX0RMTCkKLSUkTDogOwotCW1ha2VkZWYgLXYgJCg/OmIpCi0gICAgQCQoUk0pICRACi0JJChJTElCKSAkKElMSUJGTEFHUykgL0RFRjokKD86YikuZGVmIC9PVVQ6JEAKLS5FTFNFCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKExJQikgJChMSUJGTEFHUykgL291dDokQCBAJChta3RtcCAkKCY6dCJcbiIpXG4pCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoVVNFX1dJTjMyKQotJSRFOiA7Ci0JJChMRCkgL25vbG9nbyBAJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjp0IlxuInMvXC9cXCkgJChQTUxJQikgJChFWEVMSUJTKSAkKERFRl9MSUJTKSAkKExERU5ERkxBR1MpKQotLklGICQoREJHKQotLklGICQoVVNFX1NPRlRJQ0UpCi0JJChOTVNZTSkgJChOTVNZTUZMQUdTKTskKFNJX1NPVVJDRSkgJEAKLS5FTkRJRgotLkVORElGCi0uRUxTRQotJSRFOiA7Ci0JQCQoTEQpIC9ub2xvZ28gQCQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6dCJcbiJzL1wvXFwpICQoUE1MSUIpICQoRVhFTElCUykgJChERUZfTElCUykgJChMREVOREZMQUdTKSkKLS5JRiAkKERPU1NUWUxFKQotCUBtYXJrcGhhciAkQAotLkVORElGCi0uRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvd2MxNi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvd2MxNi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjYTkxNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3djMTYubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KLSMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCi0jCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCi0jCQkJCWRpZmZlcmVudGx5KS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKLQotLklGICQoTk9fUE1MSUIpCi1QTUxJQiA6PQotLkVORElGCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcwotJSRPOiAlLmMgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUykpICQ8Ci0lJE86ICUkUCA7ICQoQ1BQKSBAJChta3RtcCAkKENGTEFHUykpICQ8Ci0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wICQoQVNGTEFHUykpICQoPDpzLC8sXCkKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcwotJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKEJVSUxEX0RMTCkKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoSUxJQikgJChJTElCRkxBR1MpICRAICskPwotLkVMSUYgJChJTVBPUlRfRExMKQotJSRMOiA7Ci0gICAgQCQoUk0pICRACi0gICAgJChJTElCKSAkKElMSUJGTEFHUykgJEAgKyQ/Ci0uRUxTRQotJSRMOiA7Ci0gICAgQCQoUk0pICRACi0gICAgJChMSUIpICQoTElCRkxBR1MpICRAIEAkKG1rdG1wLCQqLnJzcCArJCgmOnQiXG4rIjpzL1wvXFwpXG4pCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoVVNFX1dJTjE2KQotLklGICQoQlVJTERfRExMKQotJSRFOiA7Ci0JQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0IFNZUyB3aW5kb3dzX2RsbFxuTiAkQFxuRiAkKCY6dCIsIjpzL1wvXFwpXG5MSUJSICQoRVhFTElCUzp0IiwiKSkgJCoubG5rCi0JcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuawotCUAkKFJNKSAtUyAkKG1rdG1wICQqLmxuaykKLS5FTFNFCi0lJEU6IDsKLQlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIHdpbmRvd3Ncbk4gJEBcbkYgJCgmOnQiLCI6cy9cL1xcKVxuTElCUiAkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKi5sbmsKLQlAJChSTSkgLVMgJChta3RtcCAkKi5sbmspCi0uRU5ESUYKLS5FTFNFCi0lJEU6IDsKLQlAdHJpbWxpYiAkKG1rdG1wIE9QIHF1aWV0XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikgJChFWEVMSUJTOnQiLCIpKSAkKi5sbmsKLQkkKExEKSAkKExERkxBR1MpIEAkKi5sbmsKLQlAJChSTSkgLVMgJChta3RtcCAkKi5sbmspCi0uRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvd2MzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvd2MzMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzliODgxOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3djMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIFVzZSBhIGxhcmdlciBzdGFjayBkdXJpbmcgbGlua2luZyBpZiByZXF1ZXN0ZWQsIG9yIHVzZSBhIGRlZmF1bHQgc3RhY2sKLSMgb2YgMjAway4gVGhlIHVzdWFsIGRlZmF1bHQgc3RhY2sgcHJvdmlkZWQgYnkgV2F0Y29tIEMrKyBpcyAqd2F5KiB0byBzbWFsbAotIyBmb3IgcmVhbCAzMiBiaXQgY29kZSBkZXZlbG9wbWVudC4gV2UgYWxzbyBuZWVkIGEgKmh1Z2UqIHN0YWNrIGZvciBPcGVuR0wKLSMgc29mdHdhcmUgcmVuZGVyaW5nIGFsc28hCi0uSUYgJChVU0VfUU5YNCkKLSAgICAjIE5vdCBuZWNlc3NhcnkgZm9yIFFOWCBjb2RlLgotLkVMU0UKLS5JRiAkKFNUS1NJWkUpCi0gICAgTERGTEFHUwkJKz0gT1AgU1RBQ0s9JChTVEtTSVpFKQotLkVMU0UKLQlMREZMQUdTCQkrPSBPUCBTVEFDSz0yMDQ4MDAKLS5FTkRJRgotLkVORElGCi0KLSMgVHVybiBvbiBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gYXMgbmVjZXNzYXJ5Ci0uSUYgJChVU0VfUlRUSSkKLQlDUEZMQUdTCQkrPSAteHIKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBwcmUtY29tcGlsZWQgaGVhZGVycwotLklGICQoUFJFQ09NUF9IRFIpCi0JQ0ZMQUdTCQkrPSAtZmhxCi0uRU5ESUYKLQotLklGICQoVVNFX1FOWCkKLSMgV2hldGhlciB0byBsaW5rIGluIHJlYWwgVkJJT1MgbGlicmFyeSwgb3IganVzdCB0aGUgc3R1YiBsaWJyYXJ5Ci0uSUYgJChVU0VfQklPUykKLVZCSU9TTElCIDo9IHZiaW9zLmxpYiwKLS5FTFNFCi1WQklPU0xJQiA6PSB2YnN0dWJzLmxpYiwKLS5FTkQKLSMgUmVxdWlyZSBzcGVjaWFsIHByaXZsZWRnZXMgZm9yIE51Y2xldXMgcHJvZ3JhbXMgKHJlcXVpcmVzIHJvb3QgYWNjZXNzKQotLklGICQoVVNFX05VQ0xFVVMpCi1MREZMQUdTCQkrPSBPUCBQUklWPTEKLS5FTkRJRgotLkVORElGCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcwotLklGICQoV0NfTElCQkFTRSkgPT0gV0MxMEEKLSUkTzogJS5jIDsgJChDQykgJChDRkxBR1MpICQoPDpzLC8sXCkKLSUkTzogJSRQIDsgJChDUFApICQoQ0ZMQUdTKSAkKDw6cywvLFwpCi0uRUxTRQotJSRPOiAlLmMgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0lJE86ICUkUCA7ICQoQ1BQKSBAJChta3RtcCAkKENQRkxBR1M6cy9cL1xcKSAkKENGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRU5ESUYKLS5JRiAkKFVTRV9OQVNNKQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAtbyAkQCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVMU0UKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTkRJRgotCi0jIEltcGxpdCBydWxlIHRvIGNvbXBpbGUgLlMgYXNzZW1ibGVyIGZpbGVzLiBUaGUgZmlyc3QgdmVyc2lvbgotIyB1c2VzIEdBUyBkaXJlY3RseSBhbmQgdGhlIHNlY29uZCB1c2VzIGEgcHJlLXByb2Nlc3NvciB0bwotIyBwcm9kdWNlIE5BU00gY29kZS4KLQotLklGICQoVVNFX0dBUykKLS5JRiAkKFdDX0xJQkJBU0UpID09IFdDMTEKLSUkTzogJSRTIDsgJChHQVMpIC1jIEAkKG1rdG1wICQoR0FTX0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTFNFCi0jIEJsYWNrIG1hZ2ljIHRvIGJ1aWxkIGFzbSBzb3VyY2VzIHdpdGggV2F0Y29tIDEwLjYgKHJlcXVpcmVzIHNlZCkKLSUkTzogJSRTIDsKLQkkKEdBUykgLWMgQCQobWt0bXAgJChHQVNfRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotCXdkaXNhc20gXFwgLWEgJCgqOnMsLyxcKS5vID4gJCgqOnMsLyxcKS5sc3QKLQlzZWQgLWUgInMvXC50ZXh0L19URVhULzsgcy9cLmRhdGEvX0RBVEEvOyBzL1wuYnNzL19CU1MvOyBzL1wuMzg2L1wuNTg2Lzsgcy9sYXIgKmVjeCxjeC9sYXIgZWN4LGVjeC8iICQoKjpzLC8sXCkubHN0ID4gJCgqOnMsLyxcKS5hc20KLQl3YXNtIFxcICQoV0ZMQUdTKSAtenEgLWZyPW51bCAtZnAzIC1mbz0kQCAkKCo6cywvLFwpLmFzbQotCSQoUk0pIC1TICQobWt0bXAgJCgqOnMsLyxcKS5vKQotCSQoUk0pIC1TICQobWt0bXAgJCgqOnMsLyxcKS5sc3QpCi0JJChSTSkgLVMgJChta3RtcCAkKCo6cywvLFwpLmFzbSkKLS5FTkRJRgotLkVMU0UKLSUkTzogJSRTIDsKLQlAZ2NwcCAtRE5BU01fQVNTRU1CTEVSIC1EX19XQVRDT01DX18gLUVQICQoPDpzLC8sXCkgPiAkKCo6cywvLFwpLmFzbQotCW5hc20gQCQobWt0bXAgLWYgb2JqIC1vICRAKSAkKCo6cywvLFwpLmFzbQotCUAkKFJNKSAtUyAkKG1rdG1wICQoKjpzLC8sXCkuYXNtKQotLkVORElGCi0KLSMgU3BlY2lhbCB0YXJnZXQgdG8gYnVpbGQgZGxsc3RhcnQuYXNtIHVzaW5nIEJvcmxhbmQgVEFTTQotZGxsc3RhcnQub2JqOiBkbGxzdGFydC5hc20KLQkkKERMTF9UQVNNKSBAJChta3RtcCAvdCAvbXggL20gL0RfX0ZMQVRfXyAvaSQoU0NJVEVDSClcSU5DTFVERSAvcSkgJChQUklWQVRFKVxzcmNcY29tbW9uXGRsbHN0YXJ0LmFzbQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwgdXNpbmcgYSByZXNwb25zZSBmaWxlCi0uSUYgJChJTVBPUlRfRExMKQotLkVMU0UKLS5JRiAkKFVTRV9PUzIzMikKLSUkRDogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldCBTWVMgb3MydjIgZGxsXG5OICRAXG5GICQoJjp0IixcbiI6cy9cL1xcKVxuTElCUiAkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKi5sbmsKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVMSUYgJChVU0VfV0lOMzIpCi0lJEQ6IDsKLQlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIG50X2RsbFxuTiAkQFxuRiAkKCY6dCIsXG4iOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKERFRkxJQlMpJChFWEVMSUJTOnQiLCIpKSAkKi5sbmsKLQlyY2xpbmsgJChMRCkgJChSQykgJEAgJCoubG5rCi0uSUYgJChMRUFWRV9MSU5LRklMRSkKLS5FTFNFCi0JQCQoUk0pIC1TICQobWt0bXAgKi5sbmspCi0uRU5ESUYKLS5FTFNFCi0lJEQ6IDsKLQlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIHdpbjM4NlxuTiAkKi5yZXhcbkYgJCgmOnQiLFxuIjpzL1wvXFwpXG5MSUJSICQoRVhFTElCUzp0IiwiKSkgJCoubG5rCi0JcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuawotCXdiaW5kICQqIC1kIC1xIC1uCi0uSUYgJChMRUFWRV9MSU5LRklMRSkKLS5FTFNFCi0JQCQoUk0pIC1TICQobWt0bXAgKi5sbmspCi0uRU5ESUYKLS5FTkRJRgotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiA7Ci0JQCQoUk0pICRACi0JJChJTElCKSAkKElMSUJGTEFHUykgJEAgKyQ/Ci0uRUxJRiAkKElNUE9SVF9ETEwpCi0lJEw6IDsKLQlAJChSTSkgJEAKLQkkKElMSUIpICQoSUxJQkZMQUdTKSAkQCArJD8KLS5FTFNFCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKExJQikgJChMSUJGTEFHUykgJEAgQCQobWt0bXAsJCoucnNwICskKCY6dCJcbisiOnMvXC9cXClcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChVU0VfWDMyKQotJSRFOiA7Ci0JQHRyaW1saWIgJChta3RtcCBPUCBxdWlldFxuTiAkQFxuRiAkKCY6dCIsIjpzL1wvXFwpXG5MSUJSICQoUE1MSUIpJChFWEVMSUJTOnQiLCIpKSAkKi5sbmsKLQkkKExEKSAkKExERkxBR1MpIEAkKi5sbmsKLQl4MzJmaXggJEAKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVMSUYgJChVU0VfT1MyMzIpCi0uSUYgJChVU0VfT1MyR1VJKQotJSRFOiA7Ci0JQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0IFNZUyBvczJ2Ml9wbVxuTiAkQFxuRiAkKCY6dCIsIjpzL1wvXFwpXG5MSUJSICQoUE1MSUIpJChFWEVMSUJTOnQiLCIpKSAkKi5sbmsKLQlyY2xpbmsgJChMRCkgJChSQykgJEAgJCoubG5rCi0uSUYgJChMRUFWRV9MSU5LRklMRSkKLS5FTFNFCi0JQCQoUk0pIC1TICQobWt0bXAgKi5sbmspCi0uRU5ESUYKLS5JRiAkKExYTElURSkKLSAJbHhsaXRlICRACi0uRU5ESUYKLS5FTFNFCi0lJEU6IDsKLQlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIG9zMnYyXG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKi5sbmsKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLklGICQoTFhMSVRFKQotIAlseGxpdGUgJEAKLS5FTkRJRgotLkVORElGCi0uRUxJRiAkKFVTRV9TTkFQKQotJSRFOiA7Ci0JQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0IFNZUyBudFxuTiAkQFxuRiAkKCY6dCIsIjpzL1wvXFwpXG5MSUJSICQoREVGTElCUykkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKi5sbmsKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVMSUYgJChVU0VfV0lOMzIpCi0uSUYgJChXSU4zMl9HVUkpCi0lJEU6IDsKLQlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIHdpbjk1XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKERFRkxJQlMpJChFWEVMSUJTOnQiLCIpKSAkKi5sbmsKLQlyY2xpbmsgJChMRCkgJChSQykgJEAgJCoubG5rCi0uSUYgJChMRUFWRV9MSU5LRklMRSkKLS5FTFNFCi0JQCQoUk0pIC1TICQobWt0bXAgKi5sbmspCi0uRU5ESUYKLS5FTFNFCi0lJEU6IDsKLQlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIG50XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKERFRkxJQlMpJChFWEVMSUJTOnQiLCIpKSAkKi5sbmsKLQlyY2xpbmsgJChMRCkgJChSQykgJEAgJCoubG5rCi0uSUYgJChMRUFWRV9MSU5LRklMRSkKLS5FTFNFCi0JQCQoUk0pIC1TICQobWt0bXAgKi5sbmspCi0uRU5ESUYKLS5FTkRJRgotLkVMSUYgJChVU0VfV0lOMzg2KQotJSRFOiA7Ci0JQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0IFNZUyB3aW4zODZcbk4gJCoucmV4XG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCXJjbGluayAkKExEKSB3YmluZCAkKi5yZXggJCoubG5rCi0uSUYgJChMRUFWRV9MSU5LRklMRSkKLS5FTFNFCi0JQCQoUk0pIC1TICQobWt0bXAgKi5sbmspCi0uRU5ESUYKLS5FTElGICQoVVNFX1ROVCkKLSUkRTogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldFxuTiAkQFxuRiAkKCY6dCIsIjpzL1wvXFwpXG5MSUJSIGRvc3gzMi5saWIsdG50YXBpLmxpYiwkKFBNTElCKSQoRVhFTElCUzp0IiwiKSkgJCoubG5rCi0JJChMRCkgQCQqLmxuawotLklGICQoTEVBVkVfTElOS0ZJTEUpCi0uRUxTRQotCUAkKFJNKSAtUyAkKG1rdG1wICoubG5rKQotLkVORElGCi0uSUYgJChET1NTVFlMRSkKLQlAbWFya3BoYXIgJEAKLS5FTkRJRgotLkVMSUYgJChVU0VfUU5YNCkKLSUkRTogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldFxuTiAkQFxuRiAkKCY6dCIsIjpzL1wvXFwpXG5MSUJSICQoUE1MSUIpJChWQklPU0xJQikkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCUAraWYgZXhpc3QgJCouZXhlIGF0dHJpYiAtcyAkKi5leGUgPiBOVUwKLQkkKExEKSBAJCoubG5rCi0JQGF0dHJpYiArcyAkKi5leGUKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVMU0UKLSUkRTogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldFxuTiAkQFxuRiAkKCY6dCIsIjpzL1wvXFwpXG5MSUJSICQoUE1MSUIpJChFWEVMSUJTOnQiLCIpKSAkKi5sbmsKLQkkKExEKSBAJCoubG5rCi0uSUYgJChMRUFWRV9MSU5LRklMRSkKLS5FTFNFCi0JQCQoUk0pIC1TICQobWt0bXAgKi5sbmspCi0uRU5ESUYKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zYzE2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zYzE2Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTlhZDQ1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvc2MxNi5taworKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgU3ltYW50ZWMgQysrIDYueC83LnggMTYgYml0IHZlcnNpb24uIFN1cHBvcnRzIDE2IGJpdCBET1MKLSMgICAgICAgICAgICAgICBhbmQgMTYgYml0IFdpbmRvd3MgZGV2ZWxvcG1lbnQuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFNDX0xJQkJBU0UKLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCi0gICBDQyAgICAgICAgICAgOj0gc2MgICAgICAgIyBDLWNvbXBpbGVyIGFuZCBmbGFncwotICAgQ0ZMQUdTICAgICAgIDo9IC1tbCAtSm0KLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteCAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTFNFCi0gICBBUyAgICAgICAgICAgOj0gdGFzbSAgICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCi0uRU5ESUYKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0NPTU1fXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLSAgIExEICAgICAgICAgICA6PSBzYyAgICAgICAjIExvYWRlciBhbmQgZmxhZ3MKLSAgIExERkxBR1MgICAgICAgPSAkKENGTEFHUykKLSAgIFJDICAgICAgICAgICA6PSByY2MgICAgICAjIFdJbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIKLSAgIFJDRkxBR1MgICAgICA6PSAgICAgICAgICAjIE1hcmsgYXMgV2luMzIgY29tcGF0aWJsZSByZXNvdXJjZXMKLSAgIExJQiAgICAgICAgICA6PSBsaWIgICAgICAjIExpYnJhcmlhbgotICAgTElCRkxBR1MgICAgIDo9IC9OIC9CCi0gICBJTElCICAgICAgICAgOj0gaW1wbGliICAgIyBJbXBvcnQgbGlicmFyaWFuCi0gICBJTElCRkxBR1MgICAgOj0KLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLWcgICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgQyBjb21waWxlcgotLkVMU0UKLSAgIEFTRkxBR1MgICAgICArPSAvcSAgICAgICAjIFN1cHByZXNzIG9iamVjdCByZWNvcmRzIG5vdCBuZWVkZWQgZm9yIGxpbmtpbmcKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC01IC1vK2FsbAotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtNSAtbytzcGFjZQotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0KLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAtZmYgLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtREZQVTM4NyAtREZQVV9SRUdfUlROCi0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1EQkVUQQotLkVORAotCi0jIFVzZXIgYSBsYXJnZXIgc3RhY2sgaWYgcmVxdWVzdGVkCi0KLS5JRiAkKFNUS1NJWkUpCi0gICAgTERGTEFHUyAgICAgKz0gPSQoU1RLU0laRSkKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBmb3IgMTYgYml0IFdpbmRvd3MKLS5JRiAkKFVTRV9XSU4xNikKLS5JRiAkKEJVSUxEX0RMTCkKLSAgIENGTEFHUyAgICAgICArPSAtV0QgLURCVUlMRF9ETEwKLSAgIEFTRkxBR1MgICAgICArPSAtREJVSUxEX0RMTAotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAtV0EKLS5FTkRJRgotICAgRFhfQVNGTEFHUyAgICs9IC1EX19XSU5ET1dTMTZfXwotICAgTElCX09TICAgICAgID0gV0lOMTYKLS5FTFNFCi0gICBVU0VfUkVBTERPUwk6PSAxCi0gICBMSUJfT1MgICAgICAgPSBET1MxNgotLkVORAotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotUE1MSUIgICAgICAgICAgIDo9IHBtLmxpYgotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKLUNGTEFHUwkJCSs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpXCQoTElCX09TKVwkKFNDX0xJQkJBU0UpCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRSkKLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IHNjMTYubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvc2MzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvc2MzMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhNzU3MC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3NjMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIFN5bWFudGVjIEMrKyA2LngvNy54IDMyIGJpdCB2ZXJzaW9uLiBTdXBwb3J0cyB0aGUgRE9TWAotIyAgICAgICAgICAgICAgIGV4dGVuZGVyLCBGbGFzaFRlayBYMzIgYW5kIFBoYXIgTGFwJ3MgVE5UIERPUyBFeHRlbmRlcgotIyAgICAgICAgICAgICAgIGFuZCAzMiBiaXQgV2luZG93cyBkZXZlbG9wbWVudC4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogVVNFX1ROVCBVU0VfWDMyIFVTRV9YMzJWTSBTQ19MSUJCQVNFCi0KLSMgV2UgYXJlIGNvbXBpbGluZyBmb3IgYSAzMiBiaXQgZW52aW9ubWVudAotICAgXzMyQklUXyAgICAgIDo9IDEKLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCi0gICBDQyAgICAgICAgICAgOj0gc2MgICAgICAgIyBDLWNvbXBpbGVyIGFuZCBmbGFncwotICAgQ0ZMQUdTICAgICAgIDo9IC1KbQotLklGICQoVVNFX1RBU00zMikKLSAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKLS5FTElGICQoVVNFX1RBU01YKQotICAgQVMgICAgICAgICAgIDo9IHRhc214ICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtICAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTkRJRgotLklGICQoVVNFX1dJTjMyKQotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvRF9fRkxBVF9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotLkVMU0UKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RFU19OT1RfRFMgL0RfX0NPTU1fXyAvaSQoU0NJVEVDSClcSU5DTFVERQotLkVORElGCi0gICBMRCAgICAgICAgICAgOj0gc2MgICAgICAgIyBMb2FkZXIgYW5kIGZsYWdzCi0gICBMRF9GTEFHUyAgICAgID0KLSAgIFJDICAgICAgICAgICA6PSByY2MgICAgICAjIFdJbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIKLSAgIFJDRkxBR1MgICAgICA6PSAtMzIgICAgICAjIE1hcmsgYXMgV2luMzIgY29tcGF0aWJsZSByZXNvdXJjZXMKLSAgIExJQiAgICAgICAgICA6PSBsaWIgICAgICAjIExpYnJhcmlhbgotICAgTElCRkxBR1MgICAgIDo9IC9OIC9CCi0gICBJTElCICAgICAgICAgOj0gaW1wbGliICAgIyBJbXBvcnQgbGlicmFyaWFuCi0gICBJTElCRkxBR1MgICAgOj0KLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLWcgICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgQyBjb21waWxlciAoRmxhc2hWaWV3KQotLklGICQoVVNFX1ROVCkKLSAgIExERkxBR1MgICAgICArPSAtZnVsbHN5bSAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBUTlQgMzg2bGluayBsaW5rZXIKLS5FTkQKLS5JRiAkKFVTRV9YMzIpIG9yICQoVVNFX1gzMlZNKQotICAgTERGTEFHUyAgICAgICs9IC1ML21hcCAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIEZsYXNoVmlldyBkZWJ1Z2dlcgotLkVORAotLkVMU0UKLSAgIEFTRkxBR1MgICAgICArPSAvcSAgICAgICAjIFN1cHByZXNzIG9iamVjdCByZWNvcmRzIG5vdCBuZWVkZWQgZm9yIGxpbmtpbmcKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC01IC1vK2FsbAotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtNSAtbytzcGFjZQotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0KLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAtZmYgLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtREZQVTM4NyAtREZQVV9SRUdfUlROCi0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1EQkVUQQotLkVORAotCi0jIFVzZXIgYSBsYXJnZXIgc3RhY2sgaWYgcmVxdWVzdGVkCi0KLS5JRiAkKFNUS1NJWkUpCi0gICAgTERGTEFHUyAgICAgKz0gPSQoU1RLU0laRSkKLS5FTkRJRgotCi0uSUYgJChVU0VfVE5UKSAgICAgICAgICAgICAgICAgICMgVXNlIFBoYXIgTGFwJ3MgVE5UIERPUyBFeHRlbmRlcgotICAgQ0ZMQUdTICAgICAgICs9IC1tcAotICAgRFhfQ0ZMQUdTICAgICs9IC1EVE5UCi0gICBBU0ZMQUdTICAgICAgKz0gL0RfX0ZMQVRfXwotICAgRFhfQVNGTEFHUyAgICs9IC1EVE5UCi0gICBMRCAgICAgICAgICAgOj0gMzg2bGluawotICAgTERGTEFHUyAgICAgICs9IEBzYzMyLmRvcyAtZXhlICRACi0gICBMSUJfT1MgICAgICAgPSBET1MzMgotLkVMSUYgJChVU0VfWDMyVk0pICAgICAgICAgICAgICAjIFVzZSBGbGFzaFRlayBYLTMyVk0gRE9TIGV4dGVuZGVyCi0gICBDRkxBR1MgICAgICAgKz0gLW14Ci0gICBEWF9DRkxBR1MgICAgKz0gLURYMzJWTQotICAgQVNGTEFHUyAgICAgICs9IC9EX19YMzg2X18KLSAgIERYX0FTRkxBR1MgICArPSAtRFgzMlZNCi0gICBMRCAgICAgICAgICAgOj0gc2MKLSAgIExERkxBR1MgICAgICArPSAkKENGTEFHUykgeDMydi5saWIKLSAgIExJQl9PUyAgICAgICA9IERPUzMyCi0uRUxJRiAkKFVTRV9YMzIpICAgICAgICAgICAgICAgICMgVXNlIEZsYXNoVGVrIFgtMzIgRE9TIGV4dGVuZGVyCi0gICBDRkxBR1MgICAgICAgKz0gLW14Ci0gICBEWF9DRkxBR1MgICAgKz0gLURYMzJWTQotICAgQVNGTEFHUyAgICAgICs9IC9EX19YMzg2X18KLSAgIERYX0FTRkxBR1MgICArPSAtRFgzMlZNCi0gICBMRCAgICAgICAgICAgOj0gc2MKLSAgIExERkxBR1MgICAgICArPSAkKENGTEFHUykgeDMyLmxpYgotICAgTElCX09TICAgICAgID0gRE9TMzIKLS5FTElGICQoVVNFX1dJTjMyKSAgICAgICAgICAgICAgIyBCdWlsZCAzMiBiaXQgV2luZG93cyBOVCBhcHAKLS5JRiAkKEJVSUxEX0RMTCkKLSAgIENGTEFHUyAgICAgICArPSAtV0QgLW1uCi0gICBBU0ZMQUdTICAgICAgKz0gLURCVUlMRF9ETEwKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gLVdBIC1tbgotLkVORElGCi0gICBEWF9BU0ZMQUdTICAgKz0gLURfX1dJTkRPV1MzMl9fCi0gICBMSUJfT1MgICAgICAgPSBXSU4zMgotLkVMU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSBkZWZhdWx0IFN5bWFudGVjIERPU1ggZXh0ZW5kZXIKLSAgIFVTRV9ET1NYICAgICA6PSAxCi0gICBVU0VfUkVBTERPUwk6PSAxCi0gICBDRkxBR1MgICAgICAgKz0gLW14Ci0gICBEWF9DRkxBR1MgICAgKz0gLURET1NYCi0gICBBU0ZMQUdTICAgICAgKz0gL0RfX1gzODZfXwotICAgRFhfQVNGTEFHUyAgICs9IC1ERE9TWAotICAgTEQgICAgICAgICAgIDo9IHNjCi0gICBMREZMQUdTICAgICAgKz0gJChDRkxBR1MpCi0gICBMSUJfT1MgICAgICAgPSBET1MzMgotLkVORAotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotLklGICQoVVNFX1ROVCkKLVBNTElCICAgICAgICAgICA6PSB0bnRccG0ubGliCi0uRUxJRiAkKFVTRV9YMzIpCi1QTUxJQiAgICAgICAgICAgOj0geDMyXHBtLmxpYgotLkVMU0UKLVBNTElCICAgICAgICAgICA6PSBkb3N4XHBtLmxpYgotLkVORAotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKLUNGTEFHUwkJCSs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpXCQoTElCX09TKVwkKFNDX0xJQkJBU0UpCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRSkKLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IHNjMzIubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvc3RhcnR1cC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvc3RhcnR1cC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiMmJhMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3N0YXJ0dXAubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIENvbW1vbiBzdGFydHVwIHNjcmlwdCB0aGF0IGRlZmluZXMgYWxsIHZhcmlhYmxlcyBjb21tb24gdG8KLSMJCQkJYWxsIHN0YXJ0dXAgc2NyaXB0cy4gVGhlc2UgZGVmaW5lIHRoZSBETUFLRSBydW50aW1lCi0jCQkJCWVudmlyb25tZW50IGFuZCB0aGUgdmFsdWVzIGFyZSBkZXBlbmRhbnQgb24gdGhlIHZlcnNpb24gb2YKLSMJCQkJRE1BS0UgaW4gdXNlLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBEaXNhYmxlIHdhcm5pbmdzIGZvciBtYWNyb3MgcmVkZWZpbmVkIGhlcmUgdGhhdCB3ZXJlIGdpdmVuCi0jIG9uIHRoZSBjb21tYW5kIGxpbmUuCi1fXy5TSUxFTlQgICAgICAgOj0gJCguU0lMRU5UKQotLlNJTEVOVCAgICAgICAgIDo9IHllcwotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UgY29tbW9uIHRvIGFsbCBjb21waWxlcnMKLS5JTVBPUlQgLklHTk9SRSA6IFRFTVAgU0hFTEwgQ09NU1BFQyBJTkNMVURFIExJQiBTQ0lURUNIIFBSSVZBVEUgU0NJVEVDSF9MSUIKLS5JTVBPUlQgLklHTk9SRSA6IERCRyBPUFQgT1BUX1NJWkUgU0hXIEJFVEEgVVNFX1dJTjMyIEZQVSBCVUlMRF9ETEwgQlVJTERfRk9SX0RMTAotLklNUE9SVCAuSUdOT1JFIDogSU1QT1JUX0RMTCBVU0VfVEFTTVggV0lOMzJfR1VJIFVTRV9XSU4xNiBVU0VfTkFTTSBDSEVDS0VECi0uSU1QT1JUIC5JR05PUkUgOiBPUzJfU0hFTEwgU09GVElDRV9QQVRIIE1BWF9XQVJOIFVTRV9TT0ZUSUNFIFVTRV9UQVNNMzIKLS5JTVBPUlQgLklHTk9SRSA6IERMTF9TVEFSVF9UQVNNIFVTRV9TTkFQIFVTRV9YMTEgVVNFX0xJTlVYIFNUQVRJQ19MSUJTIExJQkMKLS5JTVBPUlQgLklHTk9SRSA6IFNIT1dfQVJHUyBCT09UX1NUUkFQX0RNQUtFCi0gICBUTVBESVIgOj0gJChURU1QKQotCi0jIERldGVybWluZSBpZiB0aGUgaG9zdCBtYWNoaW5lIGlzIGEgV2luZG93cy9ET1Mgb3IgVW5peCBib3gKLS5JRiAkKENPTVNQRUMpCi0gICBXSU4zMl9IT1NUICAgOj0gMQotLkVMU0UKLSAgIFVTRV9OQVNNICAgICA6PSAxCi0gICBVTklYX0hPU1QgICAgOj0gMQotLkVORElGCi0KLSMgU2V0dXAgdG8gZWl0aGVyIHVzZXIgTkFTTSBvciBUQVNNIGFzIHRoZSBhc3NlbWJsZXIKLS5JRiAkKFVTRV9OQVNNKQotLkVMU0UKLSAgIFVTRV9UQVNNCQk6PSAxCi0uRU5ESUYKLQotLklGICQoVU5JWF9IT1NUKQotIyBTdGFuZGFyZCBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucwotIwotIyBOT1RFOiBMaW51eC9Vbml4IGRvZXMgbm90IHJlcXVpcmUgYW55IGV4dGVuaW9uIGZvciBleGVjdXRlYWJsZSBmaWxlcywgYnV0IHlvdQotIyAgICAgICBjYW4gdXNlIGFuIGV4dGVuc2lvbiBpZiB5b3Ugd2lzaC4gV2UgdXNlIHRoZSAuZXhlIGV4dGVuc2lvbiBmb3IgYnVpbGRpbmcKLSMgICAgICAgZXhlY3V0ZWFibGUgZmlsZXMgc28gdGhhdCB3ZSBjYW4gdXNlIGltcGxpY2l0IHJ1bGVzIHRvIG1ha2UgdGhlCi0jICAgICAgIG1ha2VmaWxlcyBzaW1wbGVyIGFuZCBtb3JlIHBvcnRhYmxlIGJldHdlZW4gc3lzdGVtcyAoZXhlIGFsc28gbWFrZXMgaXQKLSMgICAgICAgZWFzaWVyIGZvciBjcm9zcy1jb21waWxlL2RlYnVnZ2luZyBzaXR1YXRpb25zKS4gV2hlbiB5b3UgaW5zdGFsbAotIyAgICAgICB0aGUgZmlsZXMgdG8gYSBsb2NhbCBiaW4gZGlyZWN0b3J5LCB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIHJlbW92ZQotIyAgICAgICB0aGUgLmV4ZSBleHRlbnNpb24uCi0gICBMICAgICAgICAgICAgOj0gLmEgICAJIyBMaWJyYXJpZXMKLSAgIEUgICAgICAgICAgICA6PSAuZXhlICAgCSMgRXhlY3V0YWJsZXMgZm9yIGdsaWJjCi0gICBPICAgICAgICAgICAgOj0gLm8gICAJIyBPYmplY3RzCi0gICBBICAgICAgICAgICAgOj0gLmFzbSAgIAkjIEFzc2VtYmxlciBzb3VyY2VzCi0gICBTICAgICAgICAgICAgOj0gLnMgICAgICAgIyBHTlUgYXNzZW1ibGVyIHNvdXJjZXMKLSAgIFAgICAgICAgICAgICA6PSAuY3BwICAgCSMgQysrIHNvdXJjZXMKLQotIyBGaWxlIHByZWZpeC9zdWZmaXggZGVmaW5pdGlvbnMuIFRoZSBmb2xsb3dpbmcgcHJlZml4ZXMgYXJlIGRlZmluZWQsIGFuZCBhcmUKLSMgdXNlZCBwcmltYXJpbHkgdG8gYWJzdHJhY3QgYmV0d2VlbiB0aGUgVW5peCBzdHlsZSBsaWJYWC5hIG5hbWluZyBjb252ZW50aW9uCi0jIGFuZCB0aGUgRE9TL1dpbmRvd3MvT1MyIG5hbWluZyBjb252ZW50aW9uIG9mIFhYLmxpYi4KLSAgIExQICAgICAgICAgICA6PSBsaWIgICAgICAjIExQIC0gTGlicmFyeSBmaWxlIHByZWZpeCAobmFtZSBvZiBmaWxlIG9uIGRpc2spCi0gICBMTCAgICAgICAgICAgOj0gLWwJCSMgTGlicmFyeSBsaW5rIHByZWZpeCAobmFtZSBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotICAgTEUgICAgICAgICAgIDo9IAkJICAgICMgTGlicmFyeSBsaW5rIHN1ZmZpeCAoZXh0ZW5zaW9uIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0KLSMgV2UgdXNlIHRoZSBVbml4IHNoZWxsIGF0IGFsbCB0aW1lcwotICAgU0hFTEwJCTo9IC9iaW4vc2gKLSAgIFNIRUxMRkxBR1MgICA6PSAtYwotCi0uRUxTRQotIyBTdGFuZGFyZCBmaWxlIERPUy9XaW4vT1MyIHN1ZmZpeCBkZWZpbml0aW9ucwotICAgTCAgICAgICAgICAgIDo9IC5saWIgICAJIyBMaWJyYXJpZXMKLS5JRiAkKFVTRV9TTkFQKQotICAgRSAgICAgICAgICAgIDo9IC5zeGUgICAJIyBTbmFwIEV4ZWN1dGFibGVzCi0gICBEICAgICAgICAgICAgOj0gLnNsbCAgCSMgU25hcCBEeW5hbWljIExpbmsgTGlicmFyeSBmaWxlCi0uRUxTRQotICAgRSAgICAgICAgICAgIDo9IC5leGUgICAJIyBFeGVjdXRhYmxlcwotICAgRCAgICAgICAgICAgIDo9IC5kbGwgICAJIyBEeW5hbWljIExpbmsgTGlicmFyeSBmaWxlCi0uRU5ESUYKLSAgIE8gICAgICAgICAgICA6PSAub2JqICAgCSMgT2JqZWN0cwotICAgQSAgICAgICAgICAgIDo9IC5hc20gICAJIyBBc3NlbWJsZXIgc291cmNlcwotICAgUCAgICAgICAgICAgIDo9IC5jcHAgICAJIyBDKysgc291cmNlcwotICAgUiAgICAgICAgICAgIDo9IC5yZXMgICAJIyBDb21waWxlZCByZXNvdXJjZSBmaWxlCi0gICBTCQkJOj0gLnMJCSMgQXNzeW50YXguaCBzdHlsZSBhc3NlbWJsZXIKLQotIyBGaWxlIHByZWZpeC9zdWZmaXggZGVmaW5pdGlvbnMuIFRoZSBmb2xsb3dpbmcgcHJlZml4ZXMgYXJlIGRlZmluZWQsIGFuZCBhcmUKLSMgdXNlZCBwcmltYXJpbHkgdG8gYWJzdHJhY3QgYmV0d2VlbiB0aGUgVW5peCBzdHlsZSBsaWJYWC5hIG5hbWluZyBjb252ZW50aW9uCi0jIGFuZCB0aGUgRE9TL1dpbmRvd3MvT1MyIG5hbWluZyBjb252ZW50aW9uIG9mIFhYLmxpYi4KLSAgIExQICAgICAgICAgICA6PSAJCQkjIExQIC0gTGlicmFyeSBmaWxlIHByZWZpeCAobmFtZSBvZiBmaWxlIG9uIGRpc2spCi0gICBMTCAgICAgICAgICAgOj0gCQkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0gLmxpYgkJIyBMaWJyYXJ5IGxpbmsgc3VmZml4IChleHRlbnNpb24gb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLQotIyBXZSB1c2UgdGhlIERPUy9XaW4vT1MyIHN0eWxlIHNoZWxsIGF0IGFsbCB0aW1lcwotICAgU0hFTEwgICAgICAgIDo9ICQoQ09NU1BFQykKLSAgIEdST1VQU0hFTEwgICA6PSAkKFNIRUxMKQotICAgU0hFTExGTEFHUyAgIDo9ICQoU1dJVENIQVIpYwotICAgR1JPVVBGTEFHUyAgIDo9ICQoU0hFTExGTEFHUykKLSAgIFNIRUxMTUVUQVMgICA6PSAqIj88PgotLklGICQoT1MyX1NIRUxMKQotICAgR1JPVVBTVUZGSVggIDo9IC5jbWQKLS5FTFNFCi0gICBHUk9VUFNVRkZJWCAgOj0gLmJhdAotLkVORElGCi0gICBESVJTRVBTVFIgICAgOj0gXFwKLSAgIERJVkZJTEUgICAgICAgPSAkKFRNUEZJTEU6cywvLFwpCi0KLS5FTkRJRgotCi0jIFN0YW5kYXJkIFVuaXggc3R5bGUgc2hlbGwgY29tbWFuZHMuIFNpbmNlIHRoZXNlIGRvIG5vdCBleGlzdCBvbgotIyByZWd1bGFyIERPUy9XaW4vT1MyIGluc3RhbGxhdGlvbnMgd2UgdXNlIG91ciBvd24gJycgdmVyc2lvbnMKLSMgaW5zdGVhZC4gVG8gYm9vc3RydGFwIGEgbmV3IE9TIHlvdSBtYXkgd2lzaCB0byB1c2UgdGhlIHJlZ3VsYXIKLSMgdW5peCB2ZXJzaW9ucy4KLQotLklGICQoQk9PVF9TVFJBUF9ETUFLRSkKLSAgIENQCQkJOj0gY3AKLSAgIE1ECQkJOj0gbWtkaXIKLSAgIFJNCQkJOj0gcm0KLSAgIEVDSE8JCQk6PSBlY2hvCi0uRUxTRQotICAgQ1AJCQk6PSBrX2NwCi0gICBNRAkJCTo9IGtfbWQKLSAgIFJNCQkJOj0ga19ybQotICAgRUNITwkJCTo9IGtfZWNobwotLkVORElGCi0KLSMgRGVmaW5pdGlvbiBvZiAkKE1BS0UpIG1hY3JvIGZvciByZWN1cnNpdmUgbWFrZXMuCi0gICBNQUtFID0gJChNQUtFQ01EKSAkKE1GTEFHUykKLQotIyBNYWNybyB0byBpbnN0YWxsIGEgbGlicmFyeSBmaWxlCi0gICBJTlNUQUxMICAgICAgOj0gJChDUCkKLQotIyBETUFLRSB1c2VzIHRoaXMgcmVjaXBlIHRvIHJlbW92ZSBpbnRlcm1lZGlhdGUgdGFyZ2V0cwotLlJFTU9WRSA6OyAkKFJNKSAtZiAkPAotCi0jIFR1cm4gd2FybmluZ3MgYmFjayB0byBwcmV2aW91cyBzZXR0aW5nLgotLlNJTEVOVCA6PSAkKF9fLlNJTEVOVCkKLQotIyBXZSBkb250IHVzZSBUQUJTIGluIG91ciBtYWtlZmlsZXMKLS5OT1RBQlMgICAgICAgICA6PSB5ZXMKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvdmEzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvdmEzMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjYTUyMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3ZhMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBJQk0gVmlzdWFsQWdlIEMrKyAzLjAgT1MvMiAzMi1iaXQgdmVyc2lvbi4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogVkFfTElCQkFTRSBVU0VfT1MyMzIgVVNFX09TMkdVSSBGVUxMU0NSRUVOIE5PT1BUIE1BWF9XQVJOCi0KLSMgV2UgYXJlIGNvbXBpbGluZyBmb3IgYSAzMiBiaXQgZW52aW9ubWVudAotICAgXzMyQklUXyAgICAgIDo9IDEKLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCi0gICBDQyAgICAgICAgICAgOj0gaWNjCi0gICBDUFAgICAgICAgICAgOj0gaWNjCi0gICBDRkxBR1MgICAgICAgOj0gL1EgL0c1IC9HbCsgL0ZpIC9TaSAvSi0gL1NzKyAvU3AxIC9HbSsgL0kuCi0uSUYgJChVU0VfTkFTTSkKLSAgIEFTICAgICAgICAgICA6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgb2JqIC1GIG51bGwgLWRfX0ZMQVRfXyAtZFNURENBTExfTUFOR0xFIC1kX19OT1VfVkFSX18gLWlJTkNMVURFIC1pJChTQ0lURUNIKVxJTkNMVURFCi0uRUxTRQotLklGICQoVVNFX1RBU00zMikKLSAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKLS5FTElGICQoVVNFX1RBU01YKQotICAgQVMgICAgICAgICAgIDo9IHRhc214Ci0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20KLS5FTkRJRgotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvRF9fRkxBVF9fIC9EU1REQ0FMTF9NQU5HTEUgL0RfX05PVV9WQVJfXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLS5FTkRJRgotICAgTEQgICAgICAgICAgIDo9IGlsaW5rCi0gICBMREZMQUdTICAgICAgID0gL25vaSAvZXhlcGFjazoyIC9wYWNrY29kZSAvcGFja2RhdGEgL2FsaWduOjMyIC9tYXAgL25vZQotICAgUkMgICAgICAgICAgIDo9IHJjCi0gICBSQ0ZMQUdTICAgICAgOj0gLW4gLXgyCi0gICBMSUIgICAgICAgICAgOj0gaWxpYgotICAgTElCRkxBR1MgICAgIDo9IC9ub2xvZ28KLSAgIElMSUIgICAgICAgICA6PSBpbXBsaWIKLSAgIElMSUJGTEFHUyAgICA6PSAvbm9sb2dvCi0gICBJUEZDICAgICAgICAgOj0gaXBmYwotICAgSVBGQ0ZMQUdTICAgIDo9Ci0gICBJQk1DT0JKICAgICAgOj0gMQotCi0jIFNldCB0aGUgY29tcGlsZXIgd2FybmluZyBsZXZlbAotLklGICQoTUFYX1dBUk4pCi0gICBDRkxBR1MgICAgICAgKz0gL1czCi0uRUxTRQotICAgQ0ZMQUdTICAgICAgICs9IC9XMQotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC9UaQotICAgTERGTEFHUyAgICAgICs9IC9ERQotLkVMU0UKLS5JRiAkKFVTRV9UQVNNKQotICAgQVNGTEFHUyAgICAgICs9IC9xCi0uRU5ESUYKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC9HZmkgL08gL09pCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC9HZmkgL08gL09jCi0uRUxJRiAkKE5PT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC9PLQotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zIG9wdGltaXNlZCBmb3IgUGVudGl1bQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLWRGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCRVRBCi0uRU5ECi0KLSMgQnVpbGQgMzItYml0IE9TLzIgYXBwcwotLklGICQoQlVJTERfRExMKQotICAgQ0ZMQUdTICAgICAgICs9IC9HZS0gL0RCVUlMRF9ETEwKLSAgIExERkxBR1MgICAgICArPSAvRExMIC9OT0UKLSAgIEFTRkxBR1MgICAgICArPSAtZEJVSUxEX0RMTAotLkVMU0UKLS5JRiAkKFVTRV9PUzJHVUkpCi0gICBDRkxBR1MgICAgICAgKz0gLURfX09TMl9QTV9fCi0gICBMREZMQUdTICAgICAgKz0gL1BNVFlQRTpQTQotLkVMU0UKLS5JRiAkKEZVTExTQ1JFRU4pCi0gICBMREZMQUdTICAgICAgKz0gL1BNVFlQRTpOT1ZJTwotLkVMU0UKLSAgIExERkxBR1MgICAgICArPSAvUE1UWVBFOlZJTwotLkVORElGCi0uRU5ESUYKLS5FTkRJRgotICAgRFhfQVNGTEFHUyAgICs9IC1kX19PUzJfXwotICAgTElCX09TICAgICAgID0gb3MyMzIKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKFVTRV9PUzJHVUkpCi0uSUYgJChVU0VfU0REUE1ETEwpCi0jTm90ZTogVGhpcyBpcyBPSyBmb3Igbm93IGJ1dCBtaWdodCBuZWVkIHRvIGJlIGNoYW5nZWQgaWYgdGhlIEdVSSBQTSBsaWJyYXJ5Ci0jICAgICAgd2VyZSByZWFsbHkgZGlmZmVyZW50Ci1QTUxJQiAgICAgICAgICAgOj0gc2RkcG1saWIubGliCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IHBtX3BtLmxpYgotLkVORElGCi0uRUxTRQotLklGICQoVVNFX1NERFBNRExMKQotUE1MSUIgICAgICAgICAgIDo9IHNkZHBtbGliLmxpYgotLkVMU0UKLVBNTElCICAgICAgICAgICA6PSBwbS5saWIKLS5FTkRJRgotLkVORElGCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSICAgIDo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTICAgICAgICAgICs9IC9EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSICAgIDo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpXCQoTElCX09TKVwkKFZBX0xJQkJBU0UpCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRSkKLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLICAgIDo9IHZhMzIubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvdmEzNjUubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3ZhMzY1Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTJlY2NiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvdmEzNjUubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgIAkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgSUJNIFZpc3VhbEFnZSBDKysgMy42NSBPUy8yIDMyLWJpdCB2ZXJzaW9uLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlCi0uSU1QT1JUIC5JR05PUkUgOiBWQV9MSUJCQVNFIFVTRV9PUzIzMiBVU0VfT1MyR1VJIEZVTExTQ1JFRU4gTk9PUFQgTUFYX1dBUk4KLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBpY2MKLSAgIENQUCAgICAgICAgICA6PSBpY2MKLSAgIENGTEFHUyAgICAgICA6PSAvUSAvRzVsIC9GaSAvU2kgL0otIC9TcysgL1NwMSAvR20rIC9JLgotLklGICQoVVNFX05BU00pCi0gICBBUyAgICAgICAgICAgOj0gbmFzbQotICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIG9iaiAtRiBudWxsIC1kX19GTEFUX18gLWRTVERDQUxMX01BTkdMRSAtZF9fTk9VX1ZBUl9fIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQotLkVMU0UKLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteAotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtCi0uRU5ESUYKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0ZMQVRfXyAvRFNURENBTExfTUFOR0xFIC9EX19OT1VfVkFSX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0uRU5ESUYKLSAgIExEICAgICAgICAgICA6PSBpbGluawotICAgTERGTEFHUyAgICAgICA9IC9ub2kgL2V4ZXBhY2sgL3BhY2tjb2RlIC9wYWNrZGF0YSAvYWxpZ246MzIgL21hcCAvbm9lCi0gICBSQyAgICAgICAgICAgOj0gcmMKLSAgIFJDRkxBR1MgICAgICA6PSAvbm9sb2dvCi0gICBMSUIgICAgICAgICAgOj0gaWxpYgotICAgTElCRkxBR1MgICAgIDo9IC9ub2xvZ28KLSAgIElMSUIgICAgICAgICA6PSBpbXBsaWIKLSAgIElMSUJGTEFHUyAgICA6PSAvbm9sb2dvCi0gICBJQk1DT0JKICAgICAgOj0gMQotCi0jIFNldCB0aGUgY29tcGlsZXIgd2FybmluZyBsZXZlbAotLklGICQoTUFYX1dBUk4pCi0gICBDRkxBR1MgICAgICAgKz0gL1czCi0uRUxTRQotICAgQ0ZMQUdTICAgICAgICs9IC9XMQotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC9UaQotICAgTERGTEFHUyAgICAgICs9IC9ERQotLkVMU0UKLS5JRiAkKFVTRV9UQVNNKQotICAgQVNGTEFHUyAgICAgICs9IC9xCi0uRU5ESUYKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC9HZmkgL08gL09pCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC9HZmkgL08gL09jCi0uRUxJRiAkKE5PT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC9PLQotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zIG9wdGltaXNlZCBmb3IgUGVudGl1bQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLWRGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCRVRBCi0uRU5ECi0KLSMgQnVpbGQgMzItYml0IE9TLzIgYXBwcwotLklGICQoQlVJTERfRExMKQotICAgQ0ZMQUdTICAgICAgICs9IC9HbWUtIC9EQlVJTERfRExMCi0gICBMREZMQUdTICAgICAgKz0gL0RMTCAvTk9FCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKLS5FTFNFCi0uSUYgJChVU0VfT1MyR1VJKQotICAgQ0ZMQUdTICAgICAgICs9IC1EX19PUzJfUE1fXwotICAgTERGTEFHUyAgICAgICs9IC9QTVRZUEU6UE0KLS5FTFNFCi0uSUYgJChGVUxMU0NSRUVOKQotICAgTERGTEFHUyAgICAgICs9IC9QTVRZUEU6Tk9WSU8KLS5FTFNFCi0gICBMREZMQUdTICAgICAgKz0gL1BNVFlQRTpWSU8KLS5FTkRJRgotLkVORElGCi0uRU5ESUYKLSAgIERYX0FTRkxBR1MgICArPSAtZF9fT1MyX18KLSAgIExJQl9PUyAgICAgICA9IG9zMjMyCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi0uSUYgJChVU0VfT1MyR1VJKQotUE1MSUIgICAgICAgICAgIDo9IHBtX3BtLmxpYgotLkVMU0UKLVBNTElCICAgICAgICAgICA6PSBwbS5saWIKLS5FTkRJRgotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUiAgICA6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKLUNGTEFHUyAgICAgICAgICArPSAvRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUiAgICA6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChWQV9MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSyAgICA6PSB2YTM2NS5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YzE2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YzE2Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTNiZjljLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvdmMxNi5taworKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgMS54IDE2IGJpdCB2ZXJzaW9uLiBTdXBwb3J0cyAxNiBiaXQKLSMgICAgICAgICAgICAgICBET1MgYW5kIFdpbmRvd3MgZGV2ZWxvcG1lbnQuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFZDX0xJQkJBU0UKLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCi0gICBDQyAgICAgICAgICAgOj0gY2wgICAgICAgIyBDLWNvbXBpbGVyIGFuZCBmbGFncwotICAgQ0ZMQUdTICAgICAgIDo9IC9ZWCAvdyAvRzMgL0dzCi0uSUYgJChVU0VfVEFTTTMyKQotICAgQVMgICAgICAgICAgIDo9IHRhc20zMgotLkVMSUYgJChVU0VfVEFTTVgpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbXggICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCi0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20gICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVORElGCi0gICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9EX19DT01NX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0gICBMRCAgICAgICAgICAgOj0gY2wgICAgICAgIyBMb2FkZXIgYW5kIGZsYWdzCi0gICBMREZMQUdTICAgICAgID0gJChDRkxBR1MpCi0gICBSQyAgICAgICAgICAgOj0gcmMgICAgICAgIyBXSW5kb3dzIHJlc291cmNlIGNvbXBpbGVyCi0gICBSQ0ZMQUdTICAgICAgOj0KLSAgIExJQiAgICAgICAgICA6PSBsaWIgICAgICAjIExpYnJhcmlhbgotICAgTElCRkxBR1MgICAgIDo9IC9OT0kgL05PRQotICAgSUxJQiAgICAgICAgIDo9IGltcGxpYiAgICMgSW1wb3J0IGxpYnJhcmlhbgotICAgSUxJQkZMQUdTICAgIDo9IC9ub2lnbm9yZWNhc2UKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gL1lkIC9aaSAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgQyBjb21waWxlcgotICAgQVNGTEFHUyAgICAgICs9IC96aSAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIGFzc2VtYmxlcgotLkVMU0UKLSAgIEFTRkxBR1MgICAgICArPSAvcSAgICAgICAjIFN1cHByZXNzIG9iamVjdCByZWNvcmRzIG5vdCBuZWVkZWQgZm9yIGxpbmtpbmcKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC9PeAotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0KLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAvRlBpODcgL0RGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAvREZQVTM4NyAvREZQVV9SRUdfUlROCi0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC9EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC9EQkVUQQotLkVORAotCi0jIFVzZSBhIGxhcmdlciBzdGFjayBkdXJpbmcgbGlua2luZyBpZiByZXF1ZXN0ZWQgPz8/PyBIb3cgdGhlIGZ1Y2sgZG8geW91Ci0jIHNwZWNpZnkgbGlua2VyIG9wdGlvbnMgb24gdGhlIENMIGNvbW1hbmQgbGluZT8/Pz8/Ci0KLS5JRiAkKFNUS1NJWkUpCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgZm9yIDE2IGJpdCBXaW5kb3dzCi0uSUYgJChVU0VfV0lOMTYpCi0uSUYgJChCVUlMRF9ETEwpCi0gICBDRkxBR1MgICAgICAgKz0gL0dEIC9BbGZ3IC9EQlVJTERfRExMCi0gICBBU0ZMQUdTICAgICAgKz0gLURCVUlMRF9ETEwKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gL0dBIC9BTAotLkVORElGCi0gICBEWF9BU0ZMQUdTICAgKz0gLURfX1dJTkRPV1MxNl9fCi0gICBMSUJfT1MgICAgICAgPSBXSU4xNgotLkVMU0UKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLSAgIENGTEFHUyAgICAgICArPSAvQUwKLSAgIExJQl9PUyAgICAgICA9IERPUzE2Ci0uRU5ECi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi1QTUxJQiAgICAgICAgICAgOj0gcG0ubGliCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoVkNfTElCQkFTRSkKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gdmMxNi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YzMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YzMyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWM5MDcxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvdmMzMi5taworKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgMi54IDMyIGJpdCB2ZXJzaW9uLiBTdXBwb3J0cyBQaGFyIExhcAotIyAgICAgICAgICAgICAgIFROVCBET1MgRXh0ZW5kZXIgYW5kIDMyIGJpdCBXaW5kb3dzIGRldmVsb3BtZW50LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlCi0uSU1QT1JUIC5JR05PUkUgOiBUTlRfUEFUSCBWQ19MSUJCQVNFIERPU1NUWUxFIFVTRV9UTlQgVVNFX1JUVEFSR0VUIE1TVkNESVIKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9WWEQgVVNFX05URFJWIFVTRV9XMktEUlYgTlRfRERLUk9PVCBVU0VfUlRUSSBVU0VfQ1BQRVhDRVBUCi0KLSMgV2UgYXJlIGNvbXBpbGluZyBmb3IgYSAzMiBiaXQgZW52aW9ubWVudAotICAgXzMyQklUXyAgICAgIDo9IDEKLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCi0gICBDQyAgICAgICAgICAgOj0gY2wgICAgICAgIyBDLWNvbXBpbGVyIGFuZCBmbGFncwotICAgQ0ZMQUdTICAgICAgIDo9Ci0uSUYgJChVU0VfTkFTTSkKLSAgIEFTCQkJOj0gbmFzbQotICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIHdpbjMyIC1GIG51bGwgLWRfX0ZMQVRfXyAtZFNURENBTExfTUFOR0xFIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQotLkVMU0UKLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteCAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTFNFCi0gICBBUyAgICAgICAgICAgOj0gdGFzbSAgICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCi0uRU5ESUYKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0ZMQVRfXyAvRFNURENBTExfTUFOR0xFIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotLkVORElGCi0gICBMRCAgICAgICAgICAgOj0gY2wKLS5JRiAkKFVTRV9XSU4zMikKLSAgIExERkxBR1MgICAgICAgPSAkKENGTEFHUykKLS5JRiAkKFVTRV9OVERSVikKLSAgIExERU5ERkxBR1MgICA9IC1saW5rIC9JTkNSRU1FTlRBTDpOTyAvRFJJVkVSIC9TVUJTWVNURU06TkFUSVZFLDQuMDAgL1ZFUlNJT046NC4wMCAvTUFDSElORTpJMzg2IC9OT0RFRkFVTFRMSUIgL0RFQlVHVFlQRTpDViAvUERCOk5PTkUgL0FMSUdOOjB4MjAgL0JBU0U6MHgxMDAwMCAvRU5UUlk6RHJpdmVyRW50cnlAOAotCSMvTUVSR0U6X3BhZ2U9cGFnZSAvTUVSR0U6X3RleHQ9LnRleHQgL01FUkdFOi5yZGF0YT0udGV4dAotLkVMSUYgJChXSU4zMl9HVUkpCi0gICBMREVOREZMQUdTICAgPSAtbGluayAvSU5DUkVNRU5UQUw6Tk8gL0RFRjokKEA6YikuZGVmIC9TVUJTWVNURU06V0lORE9XUyAvTUFDSElORTpJMzg2IC9ERUJVR1RZUEU6Q1YgL1BEQjpOT05FCi0uRUxTRQotICAgTERFTkRGTEFHUyAgID0gLWxpbmsgL0lOQ1JFTUVOVEFMOk5PIC9TVUJTWVNURU06Q09OU09MRSAvTUFDSElORTpJMzg2IC9ERUJVR1RZUEU6Q1YgL1BEQjpOT05FCi0uRU5ESUYKLS5FTFNFCi0gICBMREZMQUdTICAgICAgID0gJChDRkxBR1MpCi0gICBMREVOREZMQUdTICAgOj0gLWxpbmsgLXN0dWI6JChUTlRfUEFUSDpzL1wvXFwpXFxiaW5cXGdvdG50LmV4ZSAvUERCOk5PTkUKLS5FTkRJRgotICAgUkMgICAgICAgICAgIDo9IHJjICAgICAgICMgV2F0Y29tIHJlc291cmNlIGNvbXBpbGVyCi0gICBSQ0ZMQUdTICAgICAgOj0gICAgICAgICAgIyBNYXJrIGFzIFdpbjMyIGNvbXBhdGlibGUgcmVzb3VyY2VzCi0gICBMSUIgICAgICAgICAgOj0gbGliICAgICAgIyBMaWJyYXJpYW4KLSAgIExJQkZMQUdTICAgICA6PQotICAgSUxJQiAgICAgICAgIDo9IGxpYiAgICAgICMgSW1wb3J0IGxpYnJhcmlhbgotICAgSUxJQkZMQUdTICAgIDo9IC9NQUNISU5FOklYODYKLSAgIElOVEVMX1g4Ngk6PSAxCi0gICBOTVNZTSAgIAkJOj0gJChTT0ZUSUNFX1BBVEgpXG5tc3ltLmV4ZQotLklGICQoVVNFX05URFJWKQotICAgTk1TWU1GTEFHUwk6PSAvVFJBTlNMQVRFOnNvdXJjZSxwYWNrYWdlLGFsd2F5cyAvUFJPTVBUIC9TT1VSQ0U6JChNU1ZDRElSKVxjcnRcc3JjXGludGVsOyQoU0NJVEVDSClcc3JjXHBtOyQoU0NJVEVDSClcc3JjXHBtXGNvbW1vbjskKFNDSVRFQ0gpXHNyY1xwbVxudGRydgotLkVMU0UKLSAgIE5NU1lNRkxBR1MJOj0gL1RSQU5TTEFURTpzb3VyY2UscGFja2FnZSxhbHdheXMgL1BST01QVCAvU09VUkNFOiQoU0NJVEVDSClcc3JjXHBtOyQoU0NJVEVDSClcc3JjXHBtXGNvbW1vbjskKFNDSVRFQ0gpXHNyY1xwbVx3aW4zMgotLkVORElGCi0KLSMgU2V0IHRoZSBjb21waWxlciB3YXJuaW5nIGxldmVsCi0uSUYgJChNQVhfV0FSTikKLSAgIENGTEFHUyAgICAgICArPSAtVzMKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gLVcxCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gL1lkIC9aaSAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgQyBjb21waWxlcgotLklGICQoVVNFX1RBU00pCi0gICBBU0ZMQUdTICAgICAgKz0gL3ppICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgYXNzZW1ibGVyCi0uRU5ESUYKLS5FTFNFCi0uSUYgJChVU0VfVEFTTSkKLSAgIEFTRkxBR1MgICAgICArPSAvcSAgICAgICAjIFN1cHByZXNzIG9iamVjdCByZWNvcmRzIG5vdCBuZWVkZWQgZm9yIGxpbmtpbmcKLS5FTkRJRgotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChWQ19MSUJCQVNFKSA9PSB2YzUKLS5JRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAvRzYgL08yIC9PeCAvT2ktCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC9HNiAvTzEKLS5FTkQKLS5FTFNFCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gL0c1IC9PMiAvT3gKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gL0c1IC9PMQotLkVORAotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC9ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLWRGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gL0RCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCRVRBCi0uRU5ECi0KLSMgVXNlIGEgbGFyZ2VyIHN0YWNrIGR1cmluZyBsaW5raW5nIGlmIHJlcXVlc3RlZCwgb3IgdXNlIGEgZGVmYXVsdCBzdGFjawotIyBvZiA1MGsuIFRoZSB1c3VhbCBkZWZhdWx0IHN0YWNrIHByb3ZpZGVkIGJ5IFZpc3VhbCBDKysgaXMgKndheSogdG8gc21hbGwKLSMgZm9yIHJlYWwgMzIgYml0IGNvZGUgZGV2ZWxvcG1lbnQuCi0KLS5JRiAkKFVTRV9XSU4zMikKLQkjIE5vdCBuZWNlc3NhcnkgZm9yIFdpbjMyIGNvZGUuCi0uRUxTRQotLklGICQoU1RLU0laRSkKLQlMREVOREZMQUdTICArPSAvU1RBQ0s6JChTVEtTSVpFKQotLkVMU0UKLQlMREVOREZMQUdTICArPSAvU1RBQ0s6NTEyMDAKLS5FTkRJRgotLkVORElGCi0KLSMgRE9TIGV4dGVuZGVyIGRlcGVuZGFudCBmbGFncwotLklGICQoVVNFX05URFJWKQkJCQkjIEJ1aWxkIDMyIGJpdCBXaW5kb3dzIE5UIGRyaXZlcgotICAgQ0ZMQUdTICAgICAgICs9IC9MRCAvWmwgL0d5IC9HeiAvR0YgL0RfX05UX0RSSVZFUl9fIC9EX1g4Nl89MSAvRGkzODY9MQotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC9RSWYKLS5FTkRJRgotICAgQVNGTEFHUyAgICAgICs9Ci0gICBERUZfTElCUwkJOj0gaW50NjQubGliIG50b3Nrcm5sLmxpYiBoYWwubGliCi0gICBEWF9BU0ZMQUdTICAgKz0gLWRfX05UX0RSSVZFUl9fCi0uSUYgJChVU0VfVzJLRFJWKQkJCQkjIEJ1aWxkIDMyIGJpdCBXaW5kb3dzIDIwMDAgZHJpdmVyCi0gICBMSUJfT1MgICAgICAgPSBXMktEUlYKLS5FTFNFCi0gICBMSUJfT1MgICAgICAgPSBOVERSVgotLkVORElGCi0uRUxJRiAkKFVTRV9XSU4zMikgICAgICAgICAgICAgICMgQnVpbGQgMzIgYml0IFdpbmRvd3MgTlQgYXBwCi0uSUYgJChXSU4zMl9HVUkpCi0uRUxTRQotICAgIENGTEFHUyAgICAgICArPSAtRF9fQ09OU09MRV9fCi0uRU5ESUYKLS5JRiAkKEJVSUxEX0RMTCkKLSAgIENGTEFHUyAgICAgICArPSAvTVQgL0xEIC9EQlVJTERfRExMCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKLS5JRiAkKE5PX1JVTlRJTUUpCi0gICBMREVOREZMQUdTICAgKz0gL05PREVGQVVMVExJQgotICAgQ0ZMQUdTIAkJKz0gL1psCi0gICBERUZfTElCUwkJOj0KLS5FTFNFCi0gICBERUZfTElCUwkJOj0ga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiB3aW5tbS5saWIgY29tZGxnMzIubGliIGNvbWN0bDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHZlcnNpb24ubGliIHdpbnNwb29sLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiB3c29jazMyLmxpYiBycGNydDQubGliCi0uRU5ESUYKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gL01UCi0gICBERUZfTElCUwkJOj0ga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiB3aW5tbS5saWIgY29tZGxnMzIubGliIGNvbWN0bDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHZlcnNpb24ubGliIHdpbnNwb29sLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiB3c29jazMyLmxpYiBycGNydDQubGliCi0uRU5ESUYKLSAgIERYX0FTRkxBR1MgICArPSAtZF9fV0lORE9XUzMyX18KLSAgIExJQl9PUyAgICAgICA9IFdJTjMyCi0uRUxJRiAkKFVTRV9SVFRBUkdFVCkKLSAgIENGTEFHUyAgICAgICArPSAtRF9fUlRUQVJHRVRfXwotICAgRFhfQ0ZMQUdTICAgICs9Ci0gICBEWF9BU0ZMQUdTICAgKz0gLWRfX1JUVEFSR0VUX18KLSAgIFVTRV9SRUFMRE9TCTo9Ci0gICBMSUJfT1MgICAgICAgPSBSVFQzMgotICAgREVGX0xJQlMgICAgIDo9IGN3MzJtdC5saWIKLS5FTFNFCi0gICBVU0VfVE5UICAgICAgOj0gMQotICAgVVNFX1JFQUxET1MJOj0gMQotICAgQ0ZMQUdTICAgICAgICs9IC9NVCAvRF9fTVNET1MzMl9fCi0gICBEWF9DRkxBR1MgICAgKz0gLURUTlQKLSAgIERYX0FTRkxBR1MgICArPSAtZFROVAotICAgTElCX09TICAgICAgID0gRE9TMzIKLSAgIERFRl9MSUJTCQk6PSBkb3N4MzIubGliIHRudGFwaS5saWIKLS5FTkRJRgotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKLUNGTEFHUwkJCSs9IC9EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpXCQoTElCX09TKVwkKFZDX0xJQkJBU0UpCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRSkKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKFVTRV9UTlQpCi1QTUxJQiAgICAgICAgICAgOj0gJChMSUJfQkFTRTpzL1wvXFwpXFx0bnRcXHBtLmxpYgotLkVMU0UKLVBNTElCICAgICAgICAgICA6PSAkKExJQl9CQVNFOnMvXC9cXClcXHBtLmxpYgotLkVORElGCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSB2YzMyLm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3djMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3djMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMTZmNGMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy93YzE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBXYXRjb20gQysrIDEwLnggMTYgYml0IHZlcnNpb24uIFN1cHBvcnRzIDE2LWJpdCBET1MsCi0jICAgICAgICAgICAgICAgMTYtYml0IFdpbmRvd3MgZGV2ZWxvcG1lbnQgYW5kIDE2LWJpdCBPUy8yIGRldmVsb3BtZW50LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlCi0uSU1QT1JUIC5JR05PUkUgOiBXQ19MSUJCQVNFIFVTRV9XSU4xNiBVU0VfT1MyMTYgVVNFX09TMkdVSQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSB3Y2MgICAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCi0gICBDUFAgICAgICAgICAgOj0gd3BwICAgICAgIyBDKystY29tcGlsZXIgYW5kIGZsYWdzCi0gICBDRkxBR1MgICAgICAgOj0gLW1sLXpxLWotdzItcy1maCAtZmhxCi0uSUYgJChVU0VfVEFTTTMyKQotICAgQVMgICAgICAgICAgIDo9IHRhc20zMgotLkVMSUYgJChVU0VfVEFTTVgpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbXggICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCi0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20gICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVORElGCi0gICBBUyAgICAgICAgICAgOj0gdGFzbSAgICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCi0gICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9EX19MQVJHRV9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotICAgTEQgICAgICAgICAgIDo9IHdsaW5rICAgICMgTG9hZGVyIGFuZCBmbGFncwotICAgTERGTEFHUyAgICAgICA9Ci0gICBSQyAgICAgICAgICAgOj0gd3JjICAgICAgIyBXYXRjb20gcmVzb3VyY2UgY29tcGlsZXIKLSAgIFJDRkxBR1MgICAgICA6PSAvYnQ9d2luZG93cwotICAgTElCICAgICAgICAgIDo9IHdsaWIgICAgICMgTGlicmFyaWFuCi0gICBMSUJGTEFHUyAgICAgOj0gLXEKLSAgIElMSUIgICAgICAgICA6PSB3bGliICAgICAjIEltcG9ydCBsaWJyYXJpYW4KLSAgIElMSUJGTEFHUyAgICA6PSAtYwotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAtZDIgICAgICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyCi0gICBMSUJGTEFHUyAgICAgKz0gLXA9MTI4ICAgIyBMYXJnZXIgcGFnZSBzaXplIGZvciBsaWJyYXJpZXMgd2l0aCBkZWJ1ZyBpbmZvIQotICAgQVNGTEFHUyAgICAgICs9IC96aSAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIGFzc2VtYmxlcgotICAgTERGTEFHUyAgICAgICs9IEQgQSAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIGxpbmtlcgotLkVMU0UKLSAgIEFTRkxBR1MgICAgICArPSAvcSAgICAgICAjIFN1cHByZXNzIG9iamVjdCByZWNvcmRzIG5vdCBuZWVkZWQgZm9yIGxpbmtpbmcKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1vbmF0eC01Ci0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC1vbmFzbG1yLTUKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucyBvcHRpbWlzZWQgZm9yIFBlbnRpdW0KLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1mcGk4Ny1mcDUtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1ERlBVMzg3Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1EQkVUQQotLkVORAotCi0jIFVzZSBhIGxhcmdlciBzdGFjayBkdXJpbmcgbGlua2luZyBpZiByZXF1ZXN0ZWQKLQotLklGICQoU1RLU0laRSkKLSAgICBMREZMQUdTICAgICArPSBPUCBTVEFDSz0kKFNUS1NJWkUpCi0uRU5ESUYKLQotLklGICQoVVNFX09TMjE2KQotLklGICQoQlVJTERfRExMKQotICAgIENGTEFHUyAgICAgICArPSAtYmQtYnQ9b3MyLURCVUlMRF9ETEwKLSAgICBBU0ZMQUdTICAgICAgKz0gLURCVUlMRF9ETEwKLS5FTFNFCi0gICAgQ0ZMQUdTICAgICAgICs9IC1idD1vczIKLS5FTkRJRgotICAgIERYX0FTRkxBR1MgICArPSAtRF9fT1MyMTZfXwotICAgIExJQl9PUyAgICAgICA9IG9zMjE2Ci0uRUxJRiAkKFVTRV9XSU4xNikKLS5JRiAkKEJVSUxEX0RMTCkKLSAgICBDRkxBR1MgICAgICAgKz0gLWJkLWJ0PXdpbmRvd3MtRF9XSU5ET1dTLURCVUlMRF9ETEwKLSAgICBBU0ZMQUdTICAgICAgKz0gLURCVUlMRF9ETEwKLS5FTFNFCi0gICAgQ0ZMQUdTICAgICAgICs9IC1idD13aW5kb3dzLURfV0lORE9XUwotLkVORElGCi0gICAgRFhfQVNGTEFHUyAgICs9IC1EX19XSU5ET1dTMTZfXwotICAgIExJQl9PUyAgICAgICA9IFdJTjE2Ci0uRUxTRQotICAgIFVTRV9SRUFMRE9TICA6PSAxCi0JTElCX09TICAgICAgID0gRE9TMTYKLS5FTkQKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLVBNTElCICAgICAgICAgICA6PSBwbS5saWIsCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoV0NfTElCQkFTRSkKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gd2MxNi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy93YzMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy93YzMyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTE3NWNhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvd2MzMi5taworKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgV2F0Y29tIEMrKyAxMC54IDMyIGJpdCB2ZXJzaW9uLiBTdXBwb3J0cyBSYXRpb25hbCdzIERPUzRHVwotIyAgICAgICAgICAgICAgIERPUyBFeHRlbmRlciwgUE1PREUvVywgQ2F1c2V3YXksIEZsYXNoVGVrJ3MgWDMyLVZNLAotIyAgICAgICAgICAgICAgIFBoYXIgTGFwJ3MgVE5UIERPUyBFeHRlbmRlciwgMzItYml0IFdpbmRvd3MgZGV2ZWxvcG1lbnQgYW5kCi0jCQkJCTMyLWJpdCBPUy8yIGRldmVsb3BtZW50LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlCi0uSU1QT1JUIC5JR05PUkUgOiBVU0VfVE5UIFVTRV9YMzIgVVNFX1gzMlZNIFVTRV9QTU9ERVcgU1RLQ0FMTCBVU0VfQ0FVU0VXQVkKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9XSU4zODYgVVNFX09TMjMyIFVTRV9PUzJHVUkgV0NfTElCQkFTRSBOT09QVCBET1NTVFlMRQotLklNUE9SVCAuSUdOT1JFIDogT1MyX1NIRUxMIFVTRV9DT0RFVklFVyBVU0VfRE9TMzJBIFVTRV9RTlg0IExFQVZFX0xJTktGSUxFCi0KLSMgV2UgYXJlIGNvbXBpbGluZyBmb3IgYSAzMiBiaXQgZW52aW9ubWVudAotICAgXzMyQklUXyAgICAgIDo9IDEKLQotIyBTZXR1cCBzcGVjaWFsIGVudmlyb25tZW50IGZvciBRTlggNCAoVW5peCdpc2gpCi0uSUYgJChVU0VfUU5YNCkKLSAgIFVTRV9RTlggICAgCTo9IDEKLSAgIEwgICAgICAgICAgICA6PSAuYSAgIAkjIExpYnJhcmllcwotICAgTFAgICAgICAgICAgIDo9IGxpYiAgICAgICMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSBsaWIJCSMgTGlicmFyeSBsaW5rIHByZWZpeCAobmFtZSBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotICAgTEUgICAgICAgICAgIDo9IC5hCSAgICAjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotLkVORElGCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IHdjYzM4NgotICAgQ1BQICAgICAgICAgIDo9IHdwcDM4NgotICAgQ0ZMQUdTICAgICAgIDo9IC16cS1qLXMtZnBpODcKLS5JRiAkKFVTRV9OQVNNKQotICAgQVMJCQk6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgb2JqIC1kX19GTEFUX18gLWRTVERDQUxMX01BTkdMRSAtaUlOQ0xVREUgLWkkKFNDSVRFQ0gpXElOQ0xVREUKLS5FTFNFCi0uSUYgJChVU0VfVEFTTTMyKQotICAgQVMgICAgICAgICAgIDo9IHRhc20zMgotICAgRExMX1RBU00gICAgIDo9IHRhc20zMgotLkVMSUYgJChVU0VfVEFTTVgpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbXgKLSAgIERMTF9UQVNNICAgICA6PSB0YXNteAotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtCi0gICBETExfVEFTTSAgICAgOj0gdGFzbQotLkVORElGCi0gICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC93LXJlcyAvdy1tY3AgL0RfX0ZMQVRfXyAvRFNURENBTExfTUFOR0xFIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotICAgR0FTCQkJOj0gZ2NjCi0gICBHQVNfRkxBR1MgCTo9IC1EX19XQVRDT01DX18gLURfX1NXXzNTIC1EX19TV19TIC1VX19HTlVDX18gLVVESkdQUCAtVV9fdW5peF9fIC1XYWxsIC1JLiAtSSQoU0NJVEVDSClcaW5jbHVkZSAteCBhc3NlbWJsZXItd2l0aC1jcHAKLS5FTkRJRgotICAgTEQgICAgICAgICAgIDo9IHdsaW5rCi0gICBMREZMQUdTICAgICAgID0KLS5JRiAkKFVTRV9PUzIzMikKLSAgIFJDICAgICAgICAgICA6PSByYwotLkVMU0UKLSAgIFJDICAgICAgICAgICA6PSB3cmMKLS5FTkRJRgotLklGICQoVVNFX1dJTjMyKQotICAgUkNGTEFHUyAgICAgIDo9IC1xIC9idD1udAotLkVMSUYgJChVU0VfT1MyMzIpCi0uSUYgJChVU0VfT1MyR1VJKQotICAgQ0ZMQUdTCQkrPSAtRF9fT1MyX1BNX18KLS5FTkRJRgotLkVMU0UKLSAgIFJDRkxBR1MgICAgICA6PSAtcQotLkVORElGCi0gICBMSUIgICAgICAgICAgOj0gd2xpYgotICAgTElCRkxBR1MgICAgIDo9IC1xCi0gICBJTElCICAgICAgICAgOj0gd2xpYgotICAgSUxJQkZMQUdTICAgIDo9IC1jCi0gICBJTlRFTF9YODYJOj0gMQotCi0jIFNldCB0aGUgY29tcGlsZXIgd2FybmluZyBsZXZlbAotLklGICQoTUFYX1dBUk4pCi0gICBDRkxBR1MgICAgICAgKz0gLXc0Ci0uRUxTRQotICAgQ0ZMQUdTICAgICAgICs9IC13MQotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAoQ29kZXZpZXcgZm9ybWF0KQotLklGICQoREJHKQotLklGICQoVVNFX1dJTjMyKQotLklGICQoVVNFX0NPREVWSUVXKQotICAgQ0ZMQUdTICAgICAgICs9IC1kMiAtaGMKLSAgIExERkxBR1MgICAgICArPSBEIENPREVWSUVXIE9QVCBDVlBBQ0sKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gLWQyCi0gICBMREZMQUdTCQkrPSBEIEEKLS5FTkRJRgotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAtZDIKLSAgIExERkxBR1MJCSs9IEQgQQotLkVORElGCi0gICBMSUJGTEFHUyAgICAgKz0gLXA9NzY4Ci0uSUYgJChVU0VfTkFTTSkKLSAgIEFTRkxBR1MgICAgICArPSAtRiBib3JsYW5kIC1nCi0uRUxTRQotLklGICQoVVNFX1RBU00zMikKLSAgIEFTRkxBR1MgICAgICArPSAvcQkJIyBUQVNNMzIgZnVja3MgdXAgV2F0Y29tIEMrKyBkZWJ1ZyBpbmZvCi0uRUxJRiAkKE9TMl9TSEVMTCkKLSAgIEFTRkxBR1MgICAgICArPSAvcQkJIyBUQVNNIGZvciBPUy8yIGZ1Y2tzIHVwIFdhdGNvbSBDKysgZGVidWcgaW5mbwotLkVMU0UKLSAgIEFTRkxBR1MgICAgICArPSAvemkKLS5FTkRJRgotLkVORElGCi0uRUxTRQotLklGICQoVVNFX05BU00pCi0gICBBU0ZMQUdTICAgICAgKz0gLUYgbnVsbAotLkVMU0UKLSAgIEFTRkxBR1MgICAgICArPSAvcQotLkVORElGCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMgKHdpdGggb3Igd2l0aG91dCBzdGFjayBjb252ZW50aW9ucykKLS5JRiAkKFNUS0NBTEwpCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLW9uYXR4LTVzLWZwNQotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtb25hc2xtci01cy1mcDUKLS5FTElGICQoTk9PUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLW9kLTVzCi0uRUxTRQotICAgQ0ZMQUdTICAgICAgICs9IC0zcwotLkVORAotLkVMU0UKLS5JRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAtb25hdHgtNXItZnA1Ci0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC1vbmFzbG1yLTVyLWZwNQotLkVMSUYgJChOT09QVCkKLSAgIENGTEFHUyAgICAgICArPSAtb2QtNXIKLS5FTkQKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucyBvcHRpbWlzZWQgZm9yIFBlbnRpdW0KLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQotLkVORAotCi0uSUYgJChVU0VfVE5UKSAgICAgICAgICAgICAgICAgICMgVXNlIFBoYXIgTGFwJ3MgVE5UIERPUyBFeHRlbmRlcgotCUNGTEFHUyAgICAgICArPSAtYnQ9bnQgLURUTlQKLQlBU0ZMQUdTICAgCSArPSAtZFROVAotCUxERkxBR1MgICAgICArPSBTWVMgTlQgT1AgU1RVQj1HT1ROVC5FWEUKLQlMSUJfT1MgICAgICAgPSBET1MzMgotLkVMSUYgJChVU0VfWDMyVk0pICAgICAgICAgICAgICAjIFVzZSBGbGFzaFRlayBYLTMyVk0gRE9TIGV4dGVuZGVyCi0JQ0ZMQUdTICAgICAgICs9IC1idD1kb3MKLQlMREZMQUdTICAgICAgKz0gU1lTIFgzMlJWCi0gICAgRFhfQ0ZMQUdTICAgICs9IC1EWDMyVk0KLQlEWF9BU0ZMQUdTICAgKz0gLWRYMzJWTQotICAgIExJQl9PUyAgICAgICA9IERPUzMyCi0uRUxJRiAkKFVTRV9YMzIpICAgICAgICAgICAgICAgICMgVXNlIEZsYXNoVGVrIFgtMzIgRE9TIGV4dGVuZGVyCi0JQ0ZMQUdTICAgICAgICs9IC1idD1kb3MKLQlMREZMQUdTICAgICAgKz0gU1lTIFgzMlIKLSAgICBEWF9DRkxBR1MgICAgKz0gLURYMzJWTQotCURYX0FTRkxBR1MgICArPSAtZFgzMlZNCi0gICAgTElCX09TICAgICAgID0gRE9TMzIKLS5FTElGICQoVVNFX1FOWDQpICAgICAgICAgICAgICAgIyBCdWlsZCBRTlggNCBhcHAKLQlDRkxBR1MgICAgICAgKz0gLWJ0PXFueDM4NgotCUxERkxBR1MgICAgICArPSBTWVMgUU5YMzg2RkxBVCBPUCBDQVNFRVhBQ1QgT1AgT0ZGU0VUPTQwayBPUCBTVEFDSz0zMmsKLSAgICBDRkxBR1MgICAgCSArPSAtRF9fUU5YX18gLURfX1VOSVhfXwotCUFTRkxBR1MgICAJICs9IC1kX19RTlhfXyAtZF9fVU5JWF9fCi0gICAgTElCX09TICAgICAgID0gUU5YNAotLkVMSUYgJChVU0VfT1MyMzIpCi0uSUYgJChCVUlMRF9ETEwpCi0JQ0ZMQUdTICAgICAgICs9IC1ibS1iZC1idD1vczItc2ctREJVSUxEX0RMTAotCUFTRkxBR1MgICAgICArPSAtZEJVSUxEX0RMTAotLkVMU0UKLQlDRkxBR1MgICAgICAgKz0gLWJtLWJ0PW9zMi1zZwotLkVORElGCi0JRFhfQVNGTEFHUyAgICs9IC1kX19PUzJfXwotICAgIExJQl9PUyAgICAgICA9IG9zMjMyCi0uRUxJRiAkKFVTRV9TTkFQKSAgICAgICAgICAgICAgICMgQnVpbGQgMzIgYml0IFNuYXAgYXBwCi0uSUYgJChCVUlMRF9ETEwpCi0JQ0ZMQUdTICAgICAgICs9IC1ibS1iZC1idD1udC1EQlVJTERfRExMCi0JQVNGTEFHUyAgICAgICs9IC1kQlVJTERfRExMCi0uRUxTRQotCUNGTEFHUyAgICAgICArPSAtYm0tYnQ9bnQtRF9XSU4zMgotLkVORElGCi0JTERGTEFHUwkgICAgICs9IE9QIG5vZGVmYXVsdGxpYnMKLS5JRiAkKFNUS0NBTEwpCi0JREVGTElCUwkJIDo9IGNsaWIzcy5saWIsbWF0aDNzLmxpYixub2VtdTM4Ny5saWIsCi0uRUxTRQotCURFRkxJQlMJCSA6PSBjbGliM3IubGliLG1hdGgzci5saWIsbm9lbXUzODcubGliLAotLkVORElGCi0JTElCX09TICAgICAgID0gU05BUAotLkVMSUYgJChVU0VfV0lOMzIpICAgICAgICAgICAgICAjIEJ1aWxkIDMyIGJpdCBXaW5kb3dzIE5UIGFwcAotLklGICQoV0lOMzJfR1VJKQotLkVMU0UKLSAgICBDRkxBR1MgICAgICAgKz0gLURfX0NPTlNPTEVfXwotLkVORElGCi0uSUYgJChCVUlMRF9ETEwpCi0JQ0ZMQUdTICAgICAgICs9IC1ibS1iZC1idD1udC1zZy1EQlVJTERfRExMIC1EX1dJTjMyCi0JQVNGTEFHUyAgICAgICs9IC1kQlVJTERfRExMCi0uRUxTRQotCUNGTEFHUyAgICAgICArPSAtYm0tYnQ9bnQtc2ctRF9XSU4zMgotLkVORElGCi0JRFhfQVNGTEFHUyAgICs9IC1kX19XSU5ET1dTMzJfXwotCUxJQl9PUyAgICAgICA9IFdJTjMyCi0gICAgREVGTElCUwkgICAgIDo9IGtlcm5lbDMyLmxpYix1c2VyMzIubGliLGdkaTMyLmxpYixhZHZhcGkzMi5saWIsc2hlbGwzMi5saWIsd2lubW0ubGliLGNvbWRsZzMyLmxpYixjb21jdGwzMi5saWIsb2xlMzIubGliLG9sZWF1dDMyLmxpYix2ZXJzaW9uLmxpYix3aW5zcG9vbC5saWIsdXVpZC5saWIsd3NvY2szMi5saWIscnBjcnQ0LmxpYiwKLS5FTElGICQoVVNFX1dJTjM4NikgICAgICAgICAgICAgIyBCdWlsZCAzMiBiaXQgV2luMzg2IGV4dGVuZGVkIGFwcAotLklGICQoQlVJTERfRExMKQotICAgIENGTEFHUyAgICAgICArPSAtYmQtYnQ9d2luZG93cy1EQlVJTERfRExMCi0JQVNGTEFHUyAgICAgICs9IC1kQlVJTERfRExMCi0uRUxTRQotICAgIENGTEFHUyAgICAgICArPSAtYnQ9d2luZG93cwotLkVORElGCi0JRFhfQVNGTEFHUyAgICs9IC1kX19XSU4zODZfXwotICAgIExJQl9PUyAgICAgICA9IFdJTjM4NgotLkVMSUYgJChVU0VfUE1PREVXKSAgICAgICAgICAgICAjIFBNT0RFL1cKLQlDRkxBR1MgICAgICAgKz0gLWJ0PWRvcwotCVVTRV9ET1M0R1cgICA6PSAxCi0JVVNFX1JFQUxET1MgIDo9IDEKLQlMREZMQUdTICAgICAgKz0gU1lTIFBNT0RFVwotCURYX0NGTEFHUyAgICArPSAtRERPUzRHVwotCURYX0FTRkxBR1MgICArPSAtZERPUzRHVwotCUxJQl9PUyAgICAgICA9IERPUzMyCi0uRUxJRiAkKFVTRV9DQVVTRVdBWSkgICAgICAgICAgICMgQ2F1c2V3YXkKLQlDRkxBR1MgICAgICAgKz0gLWJ0PWRvcwotCVVTRV9ET1M0R1cgICA6PSAxCi0JVVNFX1JFQUxET1MgIDo9IDEKLQlMREZMQUdTICAgICAgKz0gU1lTIENBVVNFV0FZCi0JRFhfQ0ZMQUdTICAgICs9IC1ERE9TNEdXCi0JRFhfQVNGTEFHUyAgICs9IC1kRE9TNEdXCi0JTElCX09TICAgICAgID0gRE9TMzIKLS5FTElGICQoVVNFX0RPUzMyQSkgICAgICAgICAgICAgIyBET1MzMi9BCi0JQ0ZMQUdTICAgICAgICs9IC1idD1kb3MKLQlVU0VfRE9TNEdXICAgOj0gMQotCVVTRV9SRUFMRE9TICA6PSAxCi0JTERGTEFHUyAgICAgICs9IFNZUyBET1MzMkEKLQlEWF9DRkxBR1MgICAgKz0gLURET1M0R1cKLQlEWF9BU0ZMQUdTICAgKz0gLWRET1M0R1cKLQlMSUJfT1MgICAgICAgPSBET1MzMgotLkVMU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSBET1M0R1cKLQlDRkxBR1MgICAgICAgKz0gLWJ0PWRvcwotCVVTRV9ET1M0R1cgICA6PSAxCi0JVVNFX1JFQUxET1MgIDo9IDEKLQlMREZMQUdTICAgICAgKz0gU1lTIERPUzRHCi0JRFhfQ0ZMQUdTICAgICs9IC1ERE9TNEdXCi0JRFhfQVNGTEFHUyAgICs9IC1kRE9TNEdXCi0JTElCX09TICAgICAgID0gRE9TMzIKLS5FTkQKLQotIyBEaXNhYmxlIGxpbmtpbmcgdG8gZGVmYXVsdCBDIHJ1bnRpbWUgbGlicmFyeSBhbmQgUE0gbGlicmFyeQotCi0uSUYgJChOT19SVU5USU1FKQotTERGTEFHUwkJCSArPSBPUCBub2RlZmF1bHRsaWJzCi1ERUZMSUJTICAgICAgICAgIDo9Ci0uRUxTRQotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNIGxpYnJhcnkgZmlsZXMKLQotLklGICQoVVNFX1NOQVApICAgICAgICAgICAgICAgCSMgQnVpbGQgMzIgYml0IFNuYXAgYXBwIG9yIGRsbAotUE1MSUIgICAgICAgICAgIDo9Ci0uRUxJRiAkKFVTRV9XSU4zMikKLS5JRiAkKFNUS0NBTEwpCi1QTUxJQiAgICAgICAgICAgOj0gc3BtLmxpYiwKLS5FTFNFCi1QTUxJQiAgICAgICAgICAgOj0gcG0ubGliLAotLkVORElGCi0uRUxJRiAkKFVTRV9PUzIzMikKLS5JRiAkKFNUS0NBTEwpCi0uSUYgJChVU0VfT1MyR1VJKQotUE1MSUIgICAgICAgICAgIDo9IHNwbV9wbS5saWIsCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IHNwbS5saWIsCi0uRU5ESUYKLS5FTFNFCi0uSUYgJChVU0VfT1MyR1VJKQotUE1MSUIgICAgICAgICAgIDo9IHBtX3BtLmxpYiwKLS5FTFNFCi1QTUxJQiAgICAgICAgICAgOj0gcG0ubGliLAotLkVORElGCi0uRU5ESUYKLS5FTElGICQoVVNFX1FOWDQpCi0uSUYgJChTVEtDQUxMKQotUE1MSUIgICAgICAgICAgIDo9IGxpYnNwbS5hLAotLkVMU0UKLVBNTElCICAgICAgICAgICA6PSBsaWJwbS5hLAotLkVORElGCi0uRUxJRiAkKFVTRV9UTlQpCi0uSUYgJChTVEtDQUxMKQotUE1MSUIgICAgICAgICAgIDo9IHRudFxzcG0ubGliLAotLkVMU0UKLVBNTElCICAgICAgICAgICA6PSB0bnRccG0ubGliLAotLkVORElGCi0uRUxJRiAkKFVTRV9YMzIpCi0uSUYgJChTVEtDQUxMKQotUE1MSUIgICAgICAgICAgIDo9IHgzMlxzcG0ubGliLAotLkVMU0UKLVBNTElCICAgICAgICAgICA6PSB4MzJccG0ubGliLAotLkVORElGCi0uRUxTRQotLklGICQoU1RLQ0FMTCkKLVBNTElCICAgICAgICAgICA6PSBkb3M0Z3dcc3BtLmxpYiwKLS5FTFNFCi1QTUxJQiAgICAgICAgICAgOj0gZG9zNGd3XHBtLmxpYiwKLS5FTkRJRgotLkVORElGCi0uRU5ESUYKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChXQ19MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSAgICBMREZMQUdTICs9IG9wIG1hcAotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gd2MzMi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iZXN5cy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iZXN5cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTEyY2U5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvYmVzeXMuYworKysgL2Rldi9udWxsCkBAIC0xLDQwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGluY2x1ZGVzIEJJT1MgZW11bGF0b3IgSS9PIGFuZCBtZW1vcnkgYWNjZXNzCi0qICAgICAgICAgICAgICAgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJpb3NlbXVpLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIE1hY3JvcyB0byByZWFkIGFuZCB3cml0ZSB2YWx1ZXMgdG8geDg2IGJ1cyBtZW1vcnkuIFJlcGxhY2UgdGhlc2UgYXMKLSAqIG5lY2Vzc2FyeSBpZiB5b3UgbmVlZCB0byBkbyBzb21ldGhpbmcgc3BlY2lhbCB0byBhY2Nlc3MgbWVtb3J5IG92ZXIKLSAqIHRoZSBidXMgb24gYSBwYXJ0aWN1bGFyIHByb2Nlc3NvciBmYW1pbHkuCi0gKi8KLQotI2RlZmluZSByZWFkYihiYXNlLG9mZikgICAgICooKHU4KikoKHUzMikoYmFzZSkgKyAob2ZmKSkpCi0jZGVmaW5lIHJlYWR3KGJhc2Usb2ZmKSAgICAgKigodTE2KikoKHUzMikoYmFzZSkgKyAob2ZmKSkpCi0jZGVmaW5lIHJlYWRsKGJhc2Usb2ZmKSAgICAgKigodTMyKikoKHUzMikoYmFzZSkgKyAob2ZmKSkpCi0jZGVmaW5lIHdyaXRlYih2LGJhc2Usb2ZmKSAgKigodTgqKSgodTMyKShiYXNlKSArIChvZmYpKSkgPSAodikKLSNkZWZpbmUgd3JpdGV3KHYsYmFzZSxvZmYpICAqKCh1MTYqKSgodTMyKShiYXNlKSArIChvZmYpKSkgPSAodikKLSNkZWZpbmUgd3JpdGVsKHYsYmFzZSxvZmYpICAqKCh1MzIqKSgodTMyKShiYXNlKSArIChvZmYpKSkgPSAodikKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIERFQlVHCi0jIGRlZmluZSBERUJVR19NRU0oKSAgICAgICAgKE0ueDg2LmRlYnVnICYgREVCVUdfTUVNX1RSQUNFX0YpCi0jZWxzZQotIyBkZWZpbmUgREVCVUdfTUVNKCkKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCi0KLVJFVFVSTlM6Ci1CeXRlIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1SZWFkcyBhIGJ5dGUgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQotcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggWDg2QVBJIEJFX3JkYigKLSAgICB1MzIgYWRkcikKLXsKLSAgICB1OCB2YWwgPSAwOwotCi0gICAgaWYgKGFkZHIgPj0gMHhDMDAwMCAmJiBhZGRyIDw9IF9CRV9lbnYuYmlvc21lbV9saW1pdCkgewotCXZhbCA9ICoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgLSAweEMwMDAwKTsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhGRkZGRikgewotCXZhbCA9IHJlYWRiKF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgLSAweEEwMDAwKTsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+IE0ubWVtX3NpemUgLSAxKSB7Ci1EQiggICAgIHByaW50aygibWVtX3JlYWQ6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCi0JSEFMVF9TWVMoKTsKLQl9Ci0gICAgZWxzZSB7Ci0JdmFsID0gKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyKTsKLQl9Ci1EQiggaWYgKERFQlVHX01FTSgpKQotCXByaW50aygiJSMwOHggMSAtPiAlI3hcbiIsIGFkZHIsIHZhbCk7KQotICAgIHJldHVybiB2YWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkciAgICAtIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKLQotUkVUVVJOUzoKLVdvcmQgdmFsdWUgcmVhZCBmcm9tIGVtdWxhdG9yIG1lbW9yeS4KLQotUkVNQVJLUzoKLVJlYWRzIGEgd29yZCB2YWx1ZSBmcm9tIHRoZSBlbXVsYXRvciBtZW1vcnkuIFdlIGhhdmUgdGhyZWUgZGlzdGluY3QgbWVtb3J5Ci1yZWdpb25zIHRoYXQgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIHdoaWNoIHRoaXMgZnVuY3Rpb24gaGFuZGxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgWDg2QVBJIEJFX3JkdygKLSAgICB1MzIgYWRkcikKLXsKLSAgICB1MTYgdmFsID0gMDsKLQotICAgIGlmIChhZGRyID49IDB4QzAwMDAgJiYgYWRkciA8PSBfQkVfZW52LmJpb3NtZW1fbGltaXQpIHsKLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgxKSB7Ci0JICAgIGFkZHIgLT0gMHhDMDAwMDsKLQkgICAgdmFsID0gKCAqKHU4KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyKSB8Ci0JCSAgICgqKHU4KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyICsgMSkgPDwgOCkpOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgIHZhbCA9ICoodTE2KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyIC0gMHhDMDAwMCk7Ci0JfQotICAgIGVsc2UgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4RkZGRkYpIHsKLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgxKSB7Ci0JICAgIGFkZHIgLT0gMHhBMDAwMDsKLQkgICAgdmFsID0gKCByZWFkYihfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyKSB8Ci0JCSAgIChyZWFkYihfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyICsgMSkgPDwgOCkpOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgIHZhbCA9IHJlYWR3KF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgLSAweEEwMDAwKTsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+IE0ubWVtX3NpemUgLSAyKSB7Ci1EQiggICAgIHByaW50aygibWVtX3JlYWQ6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCi0JSEFMVF9TWVMoKTsKLQl9Ci0gICAgZWxzZSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MSkgewotCSAgICB2YWwgPSAoICoodTgqKShNLm1lbV9iYXNlICsgYWRkcikgfAotCQkgICAoKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMSkgPDwgOCkpOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgIHZhbCA9ICoodTE2KikoTS5tZW1fYmFzZSArIGFkZHIpOwotCX0KLURCKCBpZiAoREVCVUdfTUVNKCkpCi0JcHJpbnRrKCIlIzA4eCAyIC0+ICUjeFxuIiwgYWRkciwgdmFsKTspCi0gICAgcmV0dXJuIHZhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAotCi1SRVRVUk5TOgotTG9uZyB2YWx1ZSByZWFkIGZyb20gZW11bGF0b3IgbWVtb3J5LgotCi1SRU1BUktTOgotUmVhZHMgYSBsb25nIHZhbHVlIGZyb20gdGhlIGVtdWxhdG9yIG1lbW9yeS4gV2UgaGF2ZSB0aHJlZSBkaXN0aW5jdCBtZW1vcnkKLXJlZ2lvbnMgdGhhdCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgd2hpY2ggdGhpcyBmdW5jdGlvbiBoYW5kbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBYODZBUEkgQkVfcmRsKAotICAgIHUzMiBhZGRyKQotewotICAgIHUzMiB2YWwgPSAwOwotCi0gICAgaWYgKGFkZHIgPj0gMHhDMDAwMCAmJiBhZGRyIDw9IF9CRV9lbnYuYmlvc21lbV9saW1pdCkgewotI2lmZGVmIF9fQklHX0VORElBTl9fCi0JaWYgKGFkZHIgJiAweDMpIHsKLQkgICAgYWRkciAtPSAweEMwMDAwOwotCSAgICB2YWwgPSAoICoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgKyAwKSB8Ci0JCSAgICgqKHU4KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyICsgMSkgPDwgOCkgfAotCQkgICAoKih1OCopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciArIDIpIDw8IDE2KSB8Ci0JCSAgICgqKHU4KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyICsgMykgPDwgMjQpKTsKLQkgICAgfQotCWVsc2UKLSNlbmRpZgotCSAgICB2YWwgPSAqKHUzMiopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciAtIDB4QzAwMDApOwotCX0KLSAgICBlbHNlIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MykgewotCSAgICBhZGRyIC09IDB4QTAwMDA7Ci0JICAgIHZhbCA9ICggcmVhZGIoX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkcikgfAotCQkgICAocmVhZGIoX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciArIDEpIDw8ICA4KSB8Ci0JCSAgIChyZWFkYihfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyICsgMikgPDwgMTYpIHwKLQkJICAgKHJlYWRiKF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgKyAzKSA8PCAyNCkpOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgIHZhbCA9IHJlYWRsKF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgLSAweEEwMDAwKTsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+IE0ubWVtX3NpemUgLSA0KSB7Ci1EQiggICAgIHByaW50aygibWVtX3JlYWQ6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCi0JSEFMVF9TWVMoKTsKLQl9Ci0gICAgZWxzZSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MykgewotCSAgICB2YWwgPSAoICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDApIHwKLQkJICAgKCoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDEpIDw8IDgpIHwKLQkJICAgKCoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDIpIDw8IDE2KSB8Ci0JCSAgICgqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAzKSA8PCAyNCkpOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgIHZhbCA9ICoodTMyKikoTS5tZW1fYmFzZSArIGFkZHIpOwotCX0KLURCKCBpZiAoREVCVUdfTUVNKCkpCi0JcHJpbnRrKCIlIzA4eCA0IC0+ICUjeFxuIiwgYWRkciwgdmFsKTspCi0gICAgcmV0dXJuIHZhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAotdmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCi0KLVJFTUFSS1M6Ci1Xcml0ZXMgYSBieXRlIHZhbHVlIHRvIGVtdWxhdG9yIG1lbW9yeS4gV2UgaGF2ZSB0aHJlZSBkaXN0aW5jdCBtZW1vcnkKLXJlZ2lvbnMgdGhhdCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgd2hpY2ggdGhpcyBmdW5jdGlvbiBoYW5kbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWDg2QVBJIEJFX3dyYigKLSAgICB1MzIgYWRkciwKLSAgICB1OCB2YWwpCi17Ci1EQiggaWYgKERFQlVHX01FTSgpKQotCXByaW50aygiJSMwOHggMSA8LSAlI3hcbiIsIGFkZHIsIHZhbCk7KQotICAgIGlmIChhZGRyID49IDB4QzAwMDAgJiYgYWRkciA8PSBfQkVfZW52LmJpb3NtZW1fbGltaXQpIHsKLQkqKHU4KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyIC0gMHhDMDAwMCkgPSB2YWw7Ci0JfQotICAgIGVsc2UgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4RkZGRkYpIHsKLQl3cml0ZWIodmFsLCBfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyIC0gMHhBMDAwMCk7Ci0JfQotICAgIGVsc2UgaWYgKGFkZHIgPiBNLm1lbV9zaXplLTEpIHsKLURCKCAgICAgcHJpbnRrKCJtZW1fd3JpdGU6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCi0JSEFMVF9TWVMoKTsKLQl9Ci0gICAgZWxzZSB7Ci0JKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyKSA9IHZhbDsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkciAgICAtIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKLXZhbCAgICAgLSBWYWx1ZSB0byBzdG9yZQotCi1SRU1BUktTOgotV3JpdGVzIGEgd29yZCB2YWx1ZSB0byBlbXVsYXRvciBtZW1vcnkuIFdlIGhhdmUgdGhyZWUgZGlzdGluY3QgbWVtb3J5Ci1yZWdpb25zIHRoYXQgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIHdoaWNoIHRoaXMgZnVuY3Rpb24gaGFuZGxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFg4NkFQSSBCRV93cncoCi0gICAgdTMyIGFkZHIsCi0gICAgdTE2IHZhbCkKLXsKLURCKCBpZiAoREVCVUdfTUVNKCkpCi0JcHJpbnRrKCIlIzA4eCAyIDwtICUjeFxuIiwgYWRkciwgdmFsKTspCi0gICAgaWYgKGFkZHIgPj0gMHhDMDAwMCAmJiBhZGRyIDw9IF9CRV9lbnYuYmlvc21lbV9saW1pdCkgewotI2lmZGVmIF9fQklHX0VORElBTl9fCi0JaWYgKGFkZHIgJiAweDEpIHsKLQkgICAgYWRkciAtPSAweEMwMDAwOwotCSAgICAqKHU4KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyICsgMCkgPSAodmFsID4+IDApICYgMHhmZjsKLQkgICAgKih1OCopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciArIDEpID0gKHZhbCA+PiA4KSAmIDB4ZmY7Ci0JICAgIH0KLQllbHNlCi0jZW5kaWYKLQkgICAgKih1MTYqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgLSAweEMwMDAwKSA9IHZhbDsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhGRkZGRikgewotI2lmZGVmIF9fQklHX0VORElBTl9fCi0JaWYgKGFkZHIgJiAweDEpIHsKLQkgICAgYWRkciAtPSAweEEwMDAwOwotCSAgICB3cml0ZWIodmFsID4+IDAsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIpOwotCSAgICB3cml0ZWIodmFsID4+IDgsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgKyAxKTsKLQkgICAgfQotCWVsc2UKLSNlbmRpZgotCSAgICB3cml0ZXcodmFsLCBfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyIC0gMHhBMDAwMCk7Ci0JfQotICAgIGVsc2UgaWYgKGFkZHIgPiBNLm1lbV9zaXplLTIpIHsKLURCKCAgICAgcHJpbnRrKCJtZW1fd3JpdGU6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCi0JSEFMVF9TWVMoKTsKLQl9Ci0gICAgZWxzZSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MSkgewotCSAgICAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAwKSA9ICh2YWwgPj4gMCkgJiAweGZmOwotCSAgICAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAxKSA9ICh2YWwgPj4gOCkgJiAweGZmOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgICoodTE2KikoTS5tZW1fYmFzZSArIGFkZHIpID0gdmFsOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAotdmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCi0KLVJFTUFSS1M6Ci1Xcml0ZXMgYSBsb25nIHZhbHVlIHRvIGVtdWxhdG9yIG1lbW9yeS4gV2UgaGF2ZSB0aHJlZSBkaXN0aW5jdCBtZW1vcnkKLXJlZ2lvbnMgdGhhdCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgd2hpY2ggdGhpcyBmdW5jdGlvbiBoYW5kbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWDg2QVBJIEJFX3dybCgKLSAgICB1MzIgYWRkciwKLSAgICB1MzIgdmFsKQotewotREIoIGlmIChERUJVR19NRU0oKSkKLQlwcmludGsoIiUjMDh4IDQgPC0gJSN4XG4iLCBhZGRyLCB2YWwpOykKLSAgICBpZiAoYWRkciA+PSAweEMwMDAwICYmIGFkZHIgPD0gX0JFX2Vudi5iaW9zbWVtX2xpbWl0KSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MSkgewotCSAgICBhZGRyIC09IDB4QzAwMDA7Ci0JICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDApID0gKHZhbCA+PiAgMCkgJiAweGZmOwotCSAgICAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAxKSA9ICh2YWwgPj4gIDgpICYgMHhmZjsKLQkgICAgKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMikgPSAodmFsID4+IDE2KSAmIDB4ZmY7Ci0JICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDMpID0gKHZhbCA+PiAyNCkgJiAweGZmOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgICoodTMyKikoTS5tZW1fYmFzZSArIGFkZHIgLSAweEMwMDAwKSA9IHZhbDsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhGRkZGRikgewotI2lmZGVmIF9fQklHX0VORElBTl9fCi0JaWYgKGFkZHIgJiAweDMpIHsKLQkgICAgYWRkciAtPSAweEEwMDAwOwotCSAgICB3cml0ZWIodmFsID4+ICAwLCBfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyKTsKLQkgICAgd3JpdGViKHZhbCA+PiAgOCwgX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciArIDEpOwotCSAgICB3cml0ZWIodmFsID4+IDE2LCBfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyICsgMSk7Ci0JICAgIHdyaXRlYih2YWwgPj4gMjQsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgKyAxKTsKLQkgICAgfQotCWVsc2UKLSNlbmRpZgotCSAgICB3cml0ZWwodmFsLCBfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyIC0gMHhBMDAwMCk7Ci0JfQotICAgIGVsc2UgaWYgKGFkZHIgPiBNLm1lbV9zaXplLTQpIHsKLURCKCAgICAgcHJpbnRrKCJtZW1fd3JpdGU6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCi0JSEFMVF9TWVMoKTsKLQl9Ci0gICAgZWxzZSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MSkgewotCSAgICAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAwKSA9ICh2YWwgPj4gIDApICYgMHhmZjsKLQkgICAgKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMSkgPSAodmFsID4+ICA4KSAmIDB4ZmY7Ci0JICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDIpID0gKHZhbCA+PiAxNikgJiAweGZmOwotCSAgICAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAzKSA9ICh2YWwgPj4gMjQpICYgMHhmZjsKLQkgICAgfQotCWVsc2UKLSNlbmRpZgotCSAgICAqKHUzMiopKE0ubWVtX2Jhc2UgKyBhZGRyKSA9IHZhbDsKLQl9Ci19Ci0KLS8qIERlYnVnIGZ1bmN0aW9ucyB0byBkbyBJU0EvUENJIGJ1cyBwb3J0IEkvTyAqLwotCi0jaWZkZWYgIERFQlVHCi0jZGVmaW5lIERFQlVHX0lPKCkgICAgICAgICAgKE0ueDg2LmRlYnVnICYgREVCVUdfSU9fVFJBQ0VfRikKLQotdTggWDg2QVBJIEJFX2luYihpbnQgcG9ydCkKLXsKLSAgICB1OCB2YWwgPSBQTV9pbnBiKHBvcnQpOwotICAgIGlmIChERUJVR19JTygpKQotCXByaW50aygiJTA0WDolMDRYOiAgaW5iLiUwNFggLT4gJTAyWFxuIixNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXAsICh1c2hvcnQpcG9ydCwgdmFsKTsKLSAgICByZXR1cm4gdmFsOwotfQotCi11MTYgWDg2QVBJIEJFX2ludyhpbnQgcG9ydCkKLXsKLSAgICB1MTYgdmFsID0gUE1faW5wdyhwb3J0KTsKLSAgICBpZiAoREVCVUdfSU8oKSkKLQlwcmludGsoIiUwNFg6JTA0WDogIGludy4lMDRYIC0+ICUwNFhcbiIsTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwLCAodXNob3J0KXBvcnQsIHZhbCk7Ci0gICAgcmV0dXJuIHZhbDsKLX0KLQotdTMyIFg4NkFQSSBCRV9pbmwoaW50IHBvcnQpCi17Ci0gICAgdTMyIHZhbCA9IFBNX2lucGQocG9ydCk7Ci0gICAgaWYgKERFQlVHX0lPKCkpCi0JcHJpbnRrKCIlMDRYOiUwNFg6ICBpbmwuJTA0WCAtPiAlMDhYXG4iLE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCwgKHVzaG9ydClwb3J0LCB2YWwpOwotICAgIHJldHVybiB2YWw7Ci19Ci0KLXZvaWQgWDg2QVBJIEJFX291dGIoaW50IHBvcnQsIHU4IHZhbCkKLXsKLSAgICBpZiAoREVCVUdfSU8oKSkKLQlwcmludGsoIiUwNFg6JTA0WDogb3V0Yi4lMDRYIDwtICUwMlhcbiIsTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwLCAodXNob3J0KXBvcnQsIHZhbCk7Ci0gICAgUE1fb3V0cGIocG9ydCx2YWwpOwotfQotCi12b2lkIFg4NkFQSSBCRV9vdXR3KGludCBwb3J0LCB1MTYgdmFsKQotewotICAgIGlmIChERUJVR19JTygpKQotCXByaW50aygiJTA0WDolMDRYOiBvdXR3LiUwNFggPC0gJTA0WFxuIixNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXAsICh1c2hvcnQpcG9ydCwgdmFsKTsKLSAgICBQTV9vdXRwdyhwb3J0LHZhbCk7Ci19Ci0KLXZvaWQgWDg2QVBJIEJFX291dGwoaW50IHBvcnQsIHUzMiB2YWwpCi17Ci0gICAgaWYgKERFQlVHX0lPKCkpCi0JcHJpbnRrKCIlMDRYOiUwNFg6IG91dGwuJTA0WCA8LSAlMDhYXG4iLE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCwgKHVzaG9ydClwb3J0LCB2YWwpOwotICAgIFBNX291dHBkKHBvcnQsdmFsKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iaW9zLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jpb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmNGE0Yi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jpb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIGltcGxlbWVudGluZyB0aGUgQklPUyBzcGVjaWZpYyBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmlvc2VtdWkuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbnRubyAgIC0gSW50ZXJydXB0IG51bWJlciBiZWluZyBzZXJ2aWNlZAotCi1SRU1BUktTOgotSGFuZGxlciBmb3IgdW5kZWZpbmVkIGludGVycnVwdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgWDg2QVBJIHVuZGVmaW5lZF9pbnRyKAotICAgIGludCBpbnRubykKLXsKLSAgICBpZiAoQkVfcmR3KGludG5vICogNCArIDIpID09IEJJT1NfU0VHKQotCXByaW50aygiYmlvc0VtdTogdW5kZWZpbmVkIGludGVycnVwdCAleGggY2FsbGVkIVxuIixpbnRubyk7Ci0gICAgZWxzZQotCVg4NkVNVV9wcmVwYXJlRm9ySW50KGludG5vKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbnRubyAgIC0gSW50ZXJydXB0IG51bWJlciBiZWluZyBzZXJ2aWNlZAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBkZWZhdWx0IHN5c3RlbSBCSU9TIEludCAxMGggKHRoZSBkZWZhdWx0IGlzIHN0b3JlZAotaW4gdGhlIEludCA0MmggdmVjdG9yIGJ5IHRoZSBzeXN0ZW0gQklPUyBhdCBib290dXApLiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlCi1hIHNtYWxsIG51bWJlciBvZiBzcGVjaWFsIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBCSU9TIGR1cmluZyBQT1NUIHRpbWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgWDg2QVBJIGludDQyKAotICAgIGludCBpbnRubykKLXsKLSAgICBpZiAoTS54ODYuUl9BSCA9PSAweDEyICYmIE0ueDg2LlJfQkwgPT0gMHgzMikgewotCWlmIChNLng4Ni5SX0FMID09IDApIHsKLQkgICAgLyogRW5hYmxlIENQVSBhY2Nlc3NlcyB0byB2aWRlbyBtZW1vcnkgKi8KLQkgICAgUE1fb3V0cGIoMHgzYzIsIFBNX2lucGIoMHgzY2MpIHwgKHU4KTB4MDIpOwotCSAgICByZXR1cm47Ci0JICAgIH0KLQllbHNlIGlmIChNLng4Ni5SX0FMID09IDEpIHsKLQkgICAgLyogRGlzYWJsZSBDUFUgYWNjZXNzZXMgdG8gdmlkZW8gbWVtb3J5ICovCi0JICAgIFBNX291dHBiKDB4M2MyLCBQTV9pbnBiKDB4M2NjKSAmICh1OCl+MHgwMik7Ci0JICAgIHJldHVybjsKLQkgICAgfQotI2lmZGVmICBERUJVRwotCWVsc2UgewotCSAgICBwcmludGsoImJpb3NFbXUvYmlvcy5pbnQ0MjogdW5rbm93biBmdW5jdGlvbiBBSD0weDEyLCBCTD0weDMyLCBBTD0lIzAyeFxuIixNLng4Ni5SX0FMKTsKLQkgICAgfQotI2VuZGlmCi0JfQotI2lmZGVmICBERUJVRwotICAgIGVsc2UgewotCXByaW50aygiYmlvc0VtdS9iaW9zLmludDQyOiB1bmtub3duIGZ1bmN0aW9uIEFIPSUjMDJ4LCBBTD0lIzAyeCwgQkw9JSMwMnhcbiIsTS54ODYuUl9BSCwgTS54ODYuUl9BTCwgTS54ODYuUl9CTCk7Ci0JfQotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW50bm8gICAtIEludGVycnVwdCBudW1iZXIgYmVpbmcgc2VydmljZWQKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgZGVmYXVsdCBzeXN0ZW0gQklPUyBJbnQgMTBoLiBJZiB0aGUgUE9TVCBjb2RlCi1oYXMgbm90IHlldCByZS12ZWN0b3JlZCB0aGUgSW50IDEwaCBCSU9TIGludGVycnVwdCB2ZWN0b3IsIHdlIGhhbmRsZSB0aGlzCi1ieSBzaW1wbHkgY2FsbGluZyB0aGUgaW50NDIgaW50ZXJydXB0IGhhbmRsZXIgYWJvdmUuIFZlcnkgZWFybHkgaW4gdGhlCi1CSU9TIFBPU1QgcHJvY2VzcywgdGhlIHZlY3RvciBnZXRzIHJlcGxhY2VkIGFuZCB3ZSBzaW1wbHkgbGV0IHRoZSByZWFsCi1tb2RlIGludGVycnVwdCBoYW5kbGVyIHByb2Nlc3MgdGhlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBYODZBUEkgaW50MTAoCi0gICAgaW50IGludG5vKQotewotICAgIGlmIChCRV9yZHcoaW50bm8gKiA0ICsgMikgPT0gQklPU19TRUcpCi0JaW50NDIoaW50bm8pOwotICAgIGVsc2UKLQlYODZFTVVfcHJlcGFyZUZvckludChpbnRubyk7Ci19Ci0KLS8qIFJlc3VsdCBjb2RlcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MgKi8KLQotI2RlZmluZSBTVUNDRVNTRlVMICAgICAgICAgIDB4MDAKLSNkZWZpbmUgRlVOQ19OT1RfU1VQUE9SVCAgICAweDgxCi0jZGVmaW5lIEJBRF9WRU5ET1JfSUQgICAgICAgMHg4MwotI2RlZmluZSBERVZJQ0VfTk9UX0ZPVU5EICAgIDB4ODYKLSNkZWZpbmUgQkFEX1JFR0lTVEVSX05VTUJFUiAweDg3Ci0jZGVmaW5lIFNFVF9GQUlMRUQgICAgICAgICAgMHg4OAotI2RlZmluZSBCVUZGRVJfVE9PX1NNQUxMICAgIDB4ODkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbnRubyAgIC0gSW50ZXJydXB0IG51bWJlciBiZWluZyBzZXJ2aWNlZAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBkZWZhdWx0IEludCAxQWggaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSByZWFsCi1tb2RlIGNvZGUsIHdoaWNoIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBQQ0kgQklPUyBmdW5jdGlvbnMuIFNpbmNlIHdlIG9ubHkKLXdhbnQgdG8gYWxsb3cgdGhlIHJlYWwgbW9kZSBCSU9TIGNvZGUgKm9ubHkqIHNlZSB0aGUgUENJIGNvbmZpZyBzcGFjZSBmb3IKLWl0cyBvd24gZGV2aWNlLCB3ZSBvbmx5IHJldHVybiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmljIFBDSSBjb25maWcKLXNwYWNlIHRoYXQgd2UgaGF2ZSBwYXNzZWQgaW4gdG8gdGhlIGluaXQgZnVuY3Rpb24uIFRoaXMgc29sdmVzIHByb2JsZW1zCi13aGVuIHVzaW5nIHRoZSBCSU9TIHRvIHdhcm0gYm9vdCBhIHNlY29uZGFyeSBhZGFwdGVyIHdoZW4gdGhlcmUgaXMgYW4KLWlkZW50aWNhbCBhZGFwdGVyIGJlZm9yZSBpdCBvbiB0aGUgYnVzIChzb21lIEJJT1MnZXMgZ2V0IGNvbmZ1c2VkIGluIHRoaXMKLWNhc2UpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFg4NkFQSSBpbnQxQSgKLSAgICB1bnVzZWQpCi17Ci0gICAgdTE2IHBjaVNsb3Q7Ci0KLSAgICAvKiBGYWlsIGlmIG5vIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVnaXN0ZXJlZCAqLwotICAgIGlmICghX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8pCi0JcmV0dXJuOwotICAgIHBjaVNsb3QgPSAodTE2KShfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+c2xvdC5pID4+IDgpOwotICAgIHN3aXRjaCAoTS54ODYuUl9BWCkgewotCWNhc2UgMHhCMTAxOiAgICAgICAgICAgICAgICAgICAgLyogUENJIGJpb3MgcHJlc2VudD8gKi8KLQkgICAgTS54ODYuUl9BTCAgPSAweDAwOyAgICAgICAgIC8qIG5vIGNvbmZpZyBzcGFjZS9zcGVjaWFsIGN5Y2xlIGdlbmVyYXRpb24gc3VwcG9ydCAqLwotCSAgICBNLng4Ni5SX0VEWCA9IDB4MjA0OTQzNTA7ICAgLyogIiBJQ1AiICovCi0JICAgIE0ueDg2LlJfQlggID0gMHgwMjEwOyAgICAgICAvKiBWZXJzaW9uIDIuMTAgKi8KLQkgICAgTS54ODYuUl9DTCAgPSAwOyAgICAgICAgICAgIC8qIE1heCBidXMgbnVtYmVyIGluIHN5c3RlbSAqLwotCSAgICBDTEVBUl9GTEFHKEZfQ0YpOwotCSAgICBicmVhazsKLQljYXNlIDB4QjEwMjogICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgUENJIGRldmljZSAqLwotCSAgICBNLng4Ni5SX0FIID0gREVWSUNFX05PVF9GT1VORDsKLQkgICAgaWYgKE0ueDg2LlJfRFggPT0gX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8tPlZlbmRvcklEICYmCi0JCSAgICBNLng4Ni5SX0NYID09IF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5EZXZpY2VJRCAmJgotCQkgICAgTS54ODYuUl9TSSA9PSAwKSB7Ci0JCU0ueDg2LlJfQUggPSBTVUNDRVNTRlVMOwotCQlNLng4Ni5SX0JYID0gcGNpU2xvdDsKLQkJfQotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMHhCMTAzOiAgICAgICAgICAgICAgICAgICAgLyogRmluZCBQQ0kgY2xhc3MgY29kZSAqLwotCSAgICBNLng4Ni5SX0FIID0gREVWSUNFX05PVF9GT1VORDsKLQkgICAgaWYgKE0ueDg2LlJfQ0wgPT0gX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8tPkludGVyZmFjZSAmJgotCQkgICAgTS54ODYuUl9DSCA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+U3ViQ2xhc3MgJiYKLQkJICAgICh1OCkoTS54ODYuUl9FQ1ggPj4gMTYpID09IF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5CYXNlQ2xhc3MpIHsKLQkJTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7Ci0JCU0ueDg2LlJfQlggPSBwY2lTbG90OwotCQl9Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAweEIxMDg6ICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIGNvbmZpZ3VyYXRpb24gYnl0ZSAqLwotCSAgICBNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKLQkgICAgaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgewotCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKLQkJTS54ODYuUl9DTCA9ICh1OClQQ0lfYWNjZXNzUmVnKE0ueDg2LlJfREksMCxQQ0lfUkVBRF9CWVRFLF9CRV9lbnYudmdhSW5mby5wY2lJbmZvKTsKLQkJfQotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMHhCMTA5OiAgICAgICAgICAgICAgICAgICAgLyogUmVhZCBjb25maWd1cmF0aW9uIHdvcmQgKi8KLQkgICAgTS54ODYuUl9BSCA9IEJBRF9SRUdJU1RFUl9OVU1CRVI7Ci0JICAgIGlmIChNLng4Ni5SX0JYID09IHBjaVNsb3QpIHsKLQkJTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7Ci0JCU0ueDg2LlJfQ1ggPSAodTE2KVBDSV9hY2Nlc3NSZWcoTS54ODYuUl9ESSwwLFBDSV9SRUFEX1dPUkQsX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8pOwotCQl9Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAweEIxMEE6ICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIGNvbmZpZ3VyYXRpb24gZHdvcmQgKi8KLQkgICAgTS54ODYuUl9BSCA9IEJBRF9SRUdJU1RFUl9OVU1CRVI7Ci0JICAgIGlmIChNLng4Ni5SX0JYID09IHBjaVNsb3QpIHsKLQkJTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7Ci0JCU0ueDg2LlJfRUNYID0gKHUzMilQQ0lfYWNjZXNzUmVnKE0ueDg2LlJfREksMCxQQ0lfUkVBRF9EV09SRCxfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7Ci0JCX0KLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOwotCSAgICBicmVhazsKLQljYXNlIDB4QjEwQjogICAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIGNvbmZpZ3VyYXRpb24gYnl0ZSAqLwotCSAgICBNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKLQkgICAgaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgewotCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKLQkJUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLE0ueDg2LlJfQ0wsUENJX1dSSVRFX0JZVEUsX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8pOwotCQl9Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAweEIxMEM6ICAgICAgICAgICAgICAgICAgICAvKiBXcml0ZSBjb25maWd1cmF0aW9uIHdvcmQgKi8KLQkgICAgTS54ODYuUl9BSCA9IEJBRF9SRUdJU1RFUl9OVU1CRVI7Ci0JICAgIGlmIChNLng4Ni5SX0JYID09IHBjaVNsb3QpIHsKLQkJTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7Ci0JCVBDSV9hY2Nlc3NSZWcoTS54ODYuUl9ESSxNLng4Ni5SX0NYLFBDSV9XUklURV9XT1JELF9CRV9lbnYudmdhSW5mby5wY2lJbmZvKTsKLQkJfQotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMHhCMTBEOiAgICAgICAgICAgICAgICAgICAgLyogV3JpdGUgY29uZmlndXJhdGlvbiBkd29yZCAqLwotCSAgICBNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKLQkgICAgaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgewotCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKLQkJUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLE0ueDg2LlJfRUNYLFBDSV9XUklURV9EV09SRCxfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7Ci0JCX0KLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICBwcmludGsoImJpb3NFbXUvYmlvcy5pbnQxYTogdW5rbm93biBmdW5jdGlvbiBBWD0lIzA0eFxuIiwgTS54ODYuUl9BWCk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIEJJT1MgZW11bGF0aW9uIGZ1bmN0aW9ucyBmb3IgdGhlIHNwZWNpZmljCi1QQ0kgZGlzcGxheSBkZXZpY2UuIFdlIGluc3VsYXRlIHRoZSByZWFsIG1vZGUgQklPUyBmcm9tIGFueSBvdGhlciBkZXZpY2VzCi1vbiB0aGUgYnVzLCBzbyB0aGF0IGl0IHdpbGwgd29yayBjb3JyZWN0bHkgdGhpbmtpbmcgdGhhdCBpdCBpcyB0aGUgb25seQotZGV2aWNlIHByZXNlbnQgb24gdGhlIGJ1cyAoaWU6IGF2b2lkaW5nIGFueSBhZGFwdGVycyBwcmVzZW50IGluIGZyb20gb2YKLXRoZSBkZXZpY2Ugd2UgYXJlIHRyeWluZyB0byBjb250cm9sKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9CRV9iaW9zX2luaXQoCi0gICAgdTMyICppbnRyVGFiKQotewotICAgIGludCAgICAgICAgICAgICAgICAgaTsKLSAgICBYODZFTVVfaW50ckZ1bmNzICAgIGJpb3NfaW50cl90YWJbMjU2XTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgewotCWludHJUYWJbaV0gPSBCSU9TX1NFRyA8PCAxNjsKLQliaW9zX2ludHJfdGFiW2ldID0gdW5kZWZpbmVkX2ludHI7Ci0JfQotICAgIGJpb3NfaW50cl90YWJbMHgxMF0gPSBpbnQxMDsKLSAgICBiaW9zX2ludHJfdGFiWzB4MUFdID0gaW50MUE7Ci0gICAgYmlvc19pbnRyX3RhYlsweDQyXSA9IGludDQyOwotICAgIFg4NkVNVV9zZXR1cEludHJGdW5jcyhiaW9zX2ludHJfdGFiKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvYmlvc2VtdS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iaW9zZW11LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNTI3MDkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iaW9zZW11LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICBCSU9TIGVtdWxhdG9yIGFuZCBpbnRlcmZhY2UKLSogICAgICAgICAgICAgICAgICAgICAgdG8gUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIE1vZHVsZSBpbXBsZW1lbnRpbmcgdGhlIHN5c3RlbSBzcGVjaWZpYyBmdW5jdGlvbnMuIFRoaXMKLSogICAgICAgICAgICAgICBtb2R1bGUgaXMgYWx3YXlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW4gdGhlIE9TIGRlcGVkZW50Ci0qICAgICAgICAgICAgICAgbGlicmFyaWVzLCBhbmQgbmV2ZXIgaW4gYSBiaW5hcnkgcG9ydGFibGUgZHJpdmVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJpb3NlbXVpLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLUJFX3N5c0VudiAgICAgICAgICAgX0JFX2VudjsKLSNpZmRlZiAgX19EUklWRVJfXwotUE1faW1wb3J0cyAgX1ZBUkFQSSBfUE1faW1wb3J0czsKLSNlbmRpZgotc3RhdGljIFg4NkVNVV9tZW1GdW5jcyBfQkVfbWVtID0gewotICAgIEJFX3JkYiwKLSAgICBCRV9yZHcsCi0gICAgQkVfcmRsLAotICAgIEJFX3dyYiwKLSAgICBCRV93cncsCi0gICAgQkVfd3JsLAotICAgIH07Ci0jaWZkZWYgIERFQlVHCi1zdGF0aWMgWDg2RU1VX3Bpb0Z1bmNzIF9CRV9waW8gPSB7Ci0gICAgQkVfaW5iLAotICAgIEJFX2ludywKLSAgICBCRV9pbmwsCi0gICAgQkVfb3V0YiwKLSAgICBCRV9vdXR3LAotICAgIEJFX291dGwsCi0gICAgfTsKLSNlbHNlCi1zdGF0aWMgWDg2RU1VX3Bpb0Z1bmNzIF9CRV9waW8gPSB7Ci0gICAgKHZvaWQqKVBNX2lucGIsCi0gICAgKHZvaWQqKVBNX2lucHcsCi0gICAgKHZvaWQqKVBNX2lucGQsCi0gICAgKHZvaWQqKVBNX291dHBiLAotICAgICh2b2lkKilQTV9vdXRwdywKLSAgICAodm9pZCopUE1fb3V0cGQsCi0gICAgfTsKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIE9GRihhZGRyKSAgICAgICAodTE2KSgoKGFkZHIpID4+IDApICYgMHhmZmZmKQotI2RlZmluZSBTRUcoYWRkcikgICAgICAgKHUxNikoKChhZGRyKSA+PiA0KSAmIDB4ZjAwMCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1kZWJ1Z0ZsYWdzICAtIEZsYWdzIHRvIGVuYWJsZSBkZWJ1Z2dpbmcgb3B0aW9ucyAoZGVidWcgYnVpbGRzIG9ubHkpCi1tZW1TaXplICAgICAtIEFtb3VudCBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgZm9yIHJlYWwgbW9kZSBtYWNoaW5lCi1pbmZvICAgICAgICAtIFBvaW50ZXIgdG8gZGVmYXVsdCBWR0EgZGV2aWNlIGluZm9ybWF0aW9uCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9ucyBpbml0aWFsaXNlcyB0aGUgQkVsaWIsIGFuZCB1c2VzIHRoZSBwYXNzZWQgaW4KLUJJT1MgaW1hZ2UgYXMgdGhlIEJJT1MgdGhhdCBpcyB1c2VkIGFuZCBlbXVsYXRlZCBhdCAweEMwMDAwLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIEJFX2luaXQoCi0gICAgdTMyIGRlYnVnRmxhZ3MsCi0gICAgaW50IG1lbVNpemUsCi0gICAgQkVfVkdBSW5mbyAqaW5mbykKLXsKLSNpZm5kZWYgX19EUklWRVJfXwotICAgIFBNX2luaXQoKTsKLSNlbmRpZgotICAgIG1lbXNldCgmTSwwLHNpemVvZihNKSk7Ci0gICAgaWYgKG1lbVNpemUgPCAyMDQ4MCkKLQlQTV9mYXRhbEVycm9yKCJFbXVsYXRvciByZXF1aXJlcyBhdCBsZWFzdCAyMEtiIG9mIG1lbW9yeSFcbiIpOwotICAgIGlmICgoTS5tZW1fYmFzZSA9ICh1bnNpZ25lZCBsb25nKW1hbGxvYyhtZW1TaXplKSkgPT0gTlVMTCkKLQlQTV9mYXRhbEVycm9yKCJPdXQgb2YgbWVtb3J5ISIpOwotICAgIE0ubWVtX3NpemUgPSBtZW1TaXplOwotICAgIF9CRV9lbnYuYnVzbWVtX2Jhc2UgPSAodWxvbmcpUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsMHg1RkZGRix0cnVlKTsKLSAgICBNLng4Ni5kZWJ1ZyA9IGRlYnVnRmxhZ3M7Ci0gICAgX0JFX2Jpb3NfaW5pdCgodTMyKilpbmZvLT5Mb3dNZW0pOwotICAgIFg4NkVNVV9zZXR1cE1lbUZ1bmNzKCZfQkVfbWVtKTsKLSAgICBYODZFTVVfc2V0dXBQaW9GdW5jcygmX0JFX3Bpbyk7Ci0gICAgQkVfc2V0VkdBKGluZm8pOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWRlYnVnRmxhZ3MgIC0gRmxhZ3MgdG8gZW5hYmxlIGRlYnVnZ2luZyBvcHRpb25zIChkZWJ1ZyBidWlsZHMgb25seSkKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBlbmFibGUgbG9nZ2luZyBhbmQgZGVidWcgZmxhZ3MKLW9uIGEgZnVuY3Rpb24gY2FsbCBiYXNpcywgc28gd2UgY2FuIHNwZWNpZmljYWxseSBlbmFibGUgbG9nZ2luZyBvbmx5Ci1mb3Igc3BlY2lmaWMgZnVuY3Rpb25zIHRoYXQgYXJlIGNhdXNpbmcgcHJvYmxlbXMgaW4gZGVidWcgbW9kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIEJFX3NldERlYnVnRmxhZ3MoCi0gICAgdTMyIGRlYnVnRmxhZ3MpCi17Ci0gICAgTS54ODYuZGVidWcgPSBkZWJ1Z0ZsYWdzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWluZm8gICAgICAgIC0gUG9pbnRlciB0byBWR0EgZGV2aWNlIGluZm9ybWF0aW9uIHRvIG1ha2UgY3VycmVudAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBWR0EgQklPUyBmdW5jdGlvbnMgaW4gdGhlIGVtdWxhdG9yIHRvIHBvaW50IHRvIHRoZQotc3BlY2lmaWMgVkdBIEJJT1MgaW4gdXNlLiBUaGlzIGluY2x1ZGVzIHN3YXBwaW5nIHRoZSBCSU9TIGludGVycnVwdAotdmVjdG9ycywgQklPUyBpbWFnZSBhbmQgQklPUyBkYXRhIGFyZWEgdG8gdGhlIG5ldyBCSU9TLiBUaGlzIGFsbG93cyB0aGUKLXJlYWwgbW9kZSBCSU9TIHRvIGJlIHN3YXBwZWQgd2l0aG91dCByZXNldHRpbmcgdGhlIGVudGlyZSBlbXVsYXRvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIEJFX3NldFZHQSgKLSAgICBCRV9WR0FJbmZvICppbmZvKQotewotICAgIF9CRV9lbnYudmdhSW5mby5wY2lJbmZvID0gaW5mby0+cGNpSW5mbzsKLSAgICBfQkVfZW52LnZnYUluZm8uQklPU0ltYWdlID0gaW5mby0+QklPU0ltYWdlOwotICAgIGlmIChpbmZvLT5CSU9TSW1hZ2UpIHsKLQlfQkVfZW52LmJpb3NtZW1fYmFzZSA9ICh1bG9uZylpbmZvLT5CSU9TSW1hZ2U7Ci0JX0JFX2Vudi5iaW9zbWVtX2xpbWl0ID0gMHhDMDAwMCArIGluZm8tPkJJT1NJbWFnZUxlbi0xOwotCX0KLSAgICBlbHNlIHsKLQlfQkVfZW52LmJpb3NtZW1fYmFzZSA9IF9CRV9lbnYuYnVzbWVtX2Jhc2UgKyAweDIwMDAwOwotCV9CRV9lbnYuYmlvc21lbV9saW1pdCA9IDB4QzdGRkY7Ci0JfQotICAgIGlmICgqKCh1MzIqKWluZm8tPkxvd01lbSkgPT0gMCkKLQlfQkVfYmlvc19pbml0KCh1MzIqKWluZm8tPkxvd01lbSk7Ci0gICAgbWVtY3B5KCh1OCopTS5tZW1fYmFzZSxpbmZvLT5Mb3dNZW0sc2l6ZW9mKGluZm8tPkxvd01lbSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWluZm8gICAgICAgIC0gUG9pbnRlciB0byBWR0EgZGV2aWNlIGluZm9ybWF0aW9uIHRvIHJldHJpZXZlIGN1cnJlbnQKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgVkdBIEJJT1MgZnVuY3Rpb25zIGN1cnJlbnRseSBhY3RpdmUgaW4gdGhlCi1lbXVsYXRvciwgc28gdGhleSBjYW4gYmUgcmVzdG9yZWQgYXQgYSBsYXRlciBkYXRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgQkVfZ2V0VkdBKAotICAgIEJFX1ZHQUluZm8gKmluZm8pCi17Ci0gICAgaW5mby0+cGNpSW5mbyA9IF9CRV9lbnYudmdhSW5mby5wY2lJbmZvOwotICAgIGluZm8tPkJJT1NJbWFnZSA9IF9CRV9lbnYudmdhSW5mby5CSU9TSW1hZ2U7Ci0gICAgbWVtY3B5KGluZm8tPkxvd01lbSwodTgqKU0ubWVtX2Jhc2Usc2l6ZW9mKGluZm8tPkxvd01lbSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXJfc2VnICAgLSBTZWdtZW50IGZvciBwb2ludGVyIHRvIGNvbnZlcnQKLXJfb2ZmICAgLSBPZmZzZXQgZm9yIHBvaW50ZXIgdG8gY29udmVydAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBtYXBzIGEgcmVhbCBtb2RlIHBvaW50ZXIgaW4gdGhlIGVtdWxhdG9yIG1lbW9yeSB0byBhIHByb3RlY3RlZAotbW9kZSBwb2ludGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGlyZWN0bHkgYWNjZXNzIHRoZSBtZW1vcnkuCi0KLU5PVEU6ICAgVGhlIG1lbW9yeSBpcyAqYWx3YXlzKiBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgc29uIG9uIG5vbi14ODYKLQlzeXN0ZW1zIHlvdSB3aWxsIG5lZWQgdG8gZG8gZW5kaWFuIHRyYW5zbGF0aW9ucyB0byBhY2Nlc3MgdGhpcwotCW1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgQkVfbWFwUmVhbFBvaW50ZXIoCi0gICAgdWludCByX3NlZywKLSAgICB1aW50IHJfb2ZmKQotewotICAgIHUzMiBhZGRyID0gKCh1MzIpcl9zZWcgPDwgNCkgKyByX29mZjsKLQotICAgIGlmIChhZGRyID49IDB4QzAwMDAgJiYgYWRkciA8PSBfQkVfZW52LmJpb3NtZW1fbGltaXQpIHsKLQlyZXR1cm4gKHZvaWQqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgLSAweEMwMDAwKTsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhGRkZGRikgewotCXJldHVybiAodm9pZCopKF9CRV9lbnYuYnVzbWVtX2Jhc2UgKyBhZGRyIC0gMHhBMDAwMCk7Ci0JfQotICAgIHJldHVybiAodm9pZCopKE0ubWVtX2Jhc2UgKyBhZGRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1sZW4gICAgIC0gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIFZFU0EgYnVmZmVyCi1yc2VnICAgIC0gUGxhY2UgdG8gc3RvcmUgVkVTQSBidWZmZXIgc2VnbWVudAotcm9mZiAgICAtIFBsYWNlIHRvIHN0b3JlIFZFU0EgYnVmZmVyIG9mZnNldAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBWRVNBIHRyYW5zZmVyIGJ1ZmZlciBpbiByZWFsCi1tb2RlIGVtdWxhdG9yIG1lbW9yeS4gVGhlIFZFU0EgdHJhbnNmZXIgYnVmZmVyIGlzIGFsd2F5cyAxMDI0IGJ5dGVzIGxvbmcsCi1hbmQgbG9jYXRlZCBhdCAxNUtiIGludG8gdGhlIHN0YXJ0IG9mIHRoZSByZWFsIG1vZGUgbWVtb3J5ICgxNktiIGlzIHdoZXJlCi13ZSBwdXQgdGhlIHJlYWwgbW9kZSBjb2RlIHdlIGV4ZWN1dGUgZm9yIGlzc3VpbmcgaW50ZXJydXB0cykuCi0KLU5PVEU6ICAgVGhlIG1lbW9yeSBpcyAqYWx3YXlzKiBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgc29uIG9uIG5vbi14ODYKLQlzeXN0ZW1zIHlvdSB3aWxsIG5lZWQgdG8gZG8gZW5kaWFuIHRyYW5zbGF0aW9ucyB0byBhY2Nlc3MgdGhpcwotCW1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgQkVfZ2V0VkVTQUJ1ZigKLSAgICB1aW50ICpsZW4sCi0gICAgdWludCAqcnNlZywKLSAgICB1aW50ICpyb2ZmKQotewotICAgICpsZW4gPSAxMDI0OwotICAgICpyc2VnID0gU0VHKDB4MDNDMDApOwotICAgICpyb2ZmID0gT0ZGKDB4MDNDMDApOwotICAgIHJldHVybiAodm9pZCopKE0ubWVtX2Jhc2UgKyAoKHUzMikqcnNlZyA8PCA0KSArICpyb2ZmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DbGVhbnMgdXAgYW5kIGV4aXRzIHRoZSBlbXVsYXRvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIEJFX2V4aXQodm9pZCkKLXsKLSAgICBmcmVlKCh2b2lkKilNLm1lbV9iYXNlKTsKLSAgICBQTV9mcmVlUGh5c2ljYWxBZGRyKCh2b2lkKilfQkVfZW52LmJ1c21lbV9iYXNlLDB4NUZGRkYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNlZyAgICAgLSBTZWdtZW50IG9mIGNvZGUgdG8gY2FsbAotb2ZmICAgICAtIE9mZnNldCBvZiBjb2RlIHRvIGNhbGwKLXJlZ3MgICAgLSBSZWFsIG1vZGUgcmVnaXN0ZXJzIHRvIGxvYWQKLXNyZWdzICAgLSBSZWFsIG1vZGUgc2VnbWVudCByZWdpc3RlcnMgdG8gbG9hZAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbnMgY2FsbHMgYSByZWFsIG1vZGUgZmFyIGZ1bmN0aW9uIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcywKLWFuZCBsb2FkcyBhbGwgdGhlIHg4NiByZWdpc3RlcnMgZnJvbSB0aGUgcGFzc2VkIGluIHJlZ2lzdGVycyBzdHJ1Y3R1cmUuCi1PbiBleGl0IHRoZSByZWdpc3RlcnMgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbCBhcmUgcmV0dXJuZWQgaW4gdGhlIHNhbWUKLXN0cnVjdHVyZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBCRV9jYWxsUmVhbE1vZGUoCi0gICAgdWludCBzZWcsCi0gICAgdWludCBvZmYsCi0gICAgUk1SRUdTICpyZWdzLAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIE0ueDg2LlJfRUFYID0gcmVncy0+ZS5lYXg7Ci0gICAgTS54ODYuUl9FQlggPSByZWdzLT5lLmVieDsKLSAgICBNLng4Ni5SX0VDWCA9IHJlZ3MtPmUuZWN4OwotICAgIE0ueDg2LlJfRURYID0gcmVncy0+ZS5lZHg7Ci0gICAgTS54ODYuUl9FU0kgPSByZWdzLT5lLmVzaTsKLSAgICBNLng4Ni5SX0VESSA9IHJlZ3MtPmUuZWRpOwotICAgIE0ueDg2LlJfRFMgPSBzcmVncy0+ZHM7Ci0gICAgTS54ODYuUl9FUyA9IHNyZWdzLT5lczsKLSAgICBNLng4Ni5SX0ZTID0gc3JlZ3MtPmZzOwotICAgIE0ueDg2LlJfR1MgPSBzcmVncy0+Z3M7Ci0gICAgTS54ODYuUl9DUyA9ICh1MTYpc2VnOwotICAgIE0ueDg2LlJfSVAgPSAodTE2KW9mZjsKLSAgICBNLng4Ni5SX1NTID0gU0VHKE0ubWVtX3NpemUgLSAxKTsKLSAgICBNLng4Ni5SX1NQID0gT0ZGKE0ubWVtX3NpemUgLSAxKTsKLSAgICBYODZFTVVfZXhlYygpOwotICAgIHJlZ3MtPmUuY2ZsYWcgPSBNLng4Ni5SX0VGTEcgJiBGX0NGOwotICAgIHJlZ3MtPmUuZWF4ID0gTS54ODYuUl9FQVg7Ci0gICAgcmVncy0+ZS5lYnggPSBNLng4Ni5SX0VCWDsKLSAgICByZWdzLT5lLmVjeCA9IE0ueDg2LlJfRUNYOwotICAgIHJlZ3MtPmUuZWR4ID0gTS54ODYuUl9FRFg7Ci0gICAgcmVncy0+ZS5lc2kgPSBNLng4Ni5SX0VTSTsKLSAgICByZWdzLT5lLmVkaSA9IE0ueDg2LlJfRURJOwotICAgIHNyZWdzLT5kcyA9IE0ueDg2LlJfRFM7Ci0gICAgc3JlZ3MtPmVzID0gTS54ODYuUl9FUzsKLSAgICBzcmVncy0+ZnMgPSBNLng4Ni5SX0ZTOwotICAgIHNyZWdzLT5ncyA9IE0ueDg2LlJfR1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW50bm8gICAtIEludGVycnVwdCBudW1iZXIgdG8gZXhlY3V0ZQotaW4gICAgICAtIFJlYWwgbW9kZSByZWdpc3RlcnMgdG8gbG9hZAotb3V0ICAgICAtIFBsYWNlIHRvIHN0b3JlIHJlc3VsdGluZyByZWFsIG1vZGUgcmVnaXN0ZXJzCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9ucyBjYWxscyBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgZnVuY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLAotYW5kIGxvYWRzIGFsbCB0aGUgeDg2IHJlZ2lzdGVycyBmcm9tIHRoZSBwYXNzZWQgaW4gcmVnaXN0ZXJzIHN0cnVjdHVyZS4KLU9uIGV4aXQgdGhlIHJlZ2lzdGVycyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsIGFyZSByZXR1cm5lZCBpbiBvdXQgc3R1Y3R1cmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIEJFX2ludDg2KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0KQotewotICAgIE0ueDg2LlJfRUFYID0gaW4tPmUuZWF4OwotICAgIE0ueDg2LlJfRUJYID0gaW4tPmUuZWJ4OwotICAgIE0ueDg2LlJfRUNYID0gaW4tPmUuZWN4OwotICAgIE0ueDg2LlJfRURYID0gaW4tPmUuZWR4OwotICAgIE0ueDg2LlJfRVNJID0gaW4tPmUuZXNpOwotICAgIE0ueDg2LlJfRURJID0gaW4tPmUuZWRpOwotICAgICgodTgqKU0ubWVtX2Jhc2UpWzB4NDAwMF0gPSAweENEOwotICAgICgodTgqKU0ubWVtX2Jhc2UpWzB4NDAwMV0gPSAodTgpaW50bm87Ci0gICAgKCh1OCopTS5tZW1fYmFzZSlbMHg0MDAyXSA9IDB4QzM7Ci0gICAgTS54ODYuUl9DUyA9IFNFRygweDA0MDAwKTsKLSAgICBNLng4Ni5SX0lQID0gT0ZGKDB4MDQwMDApOwotICAgIE0ueDg2LlJfU1MgPSBTRUcoTS5tZW1fc2l6ZSAtIDEpOwotICAgIE0ueDg2LlJfU1AgPSBPRkYoTS5tZW1fc2l6ZSAtIDEpOwotICAgIFg4NkVNVV9leGVjKCk7Ci0gICAgb3V0LT5lLmNmbGFnID0gTS54ODYuUl9FRkxHICYgRl9DRjsKLSAgICBvdXQtPmUuZWF4ID0gTS54ODYuUl9FQVg7Ci0gICAgb3V0LT5lLmVieCA9IE0ueDg2LlJfRUJYOwotICAgIG91dC0+ZS5lY3ggPSBNLng4Ni5SX0VDWDsKLSAgICBvdXQtPmUuZWR4ID0gTS54ODYuUl9FRFg7Ci0gICAgb3V0LT5lLmVzaSA9IE0ueDg2LlJfRVNJOwotICAgIG91dC0+ZS5lZGkgPSBNLng4Ni5SX0VESTsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWludG5vICAgLSBJbnRlcnJ1cHQgbnVtYmVyIHRvIGV4ZWN1dGUKLWluICAgICAgLSBSZWFsIG1vZGUgcmVnaXN0ZXJzIHRvIGxvYWQKLW91dCAgICAgLSBQbGFjZSB0byBzdG9yZSByZXN1bHRpbmcgcmVhbCBtb2RlIHJlZ2lzdGVycwotc3JlZ3MgICAtIFJlYWwgbW9kZSBzZWdtZW50IHJlZ2lzdGVycyB0byBsb2FkCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9ucyBjYWxscyBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgZnVuY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLAotYW5kIGxvYWRzIGFsbCB0aGUgeDg2IHJlZ2lzdGVycyBmcm9tIHRoZSBwYXNzZWQgaW4gcmVnaXN0ZXJzIHN0cnVjdHVyZS4KLU9uIGV4aXQgdGhlIHJlZ2lzdGVycyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsIGFyZSByZXR1cm5lZCBpbiBvdXQgc3R1Y3R1cmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIEJFX2ludDg2eCgKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBNLng4Ni5SX0VBWCA9IGluLT5lLmVheDsKLSAgICBNLng4Ni5SX0VCWCA9IGluLT5lLmVieDsKLSAgICBNLng4Ni5SX0VDWCA9IGluLT5lLmVjeDsKLSAgICBNLng4Ni5SX0VEWCA9IGluLT5lLmVkeDsKLSAgICBNLng4Ni5SX0VTSSA9IGluLT5lLmVzaTsKLSAgICBNLng4Ni5SX0VESSA9IGluLT5lLmVkaTsKLSAgICBNLng4Ni5SX0RTID0gc3JlZ3MtPmRzOwotICAgIE0ueDg2LlJfRVMgPSBzcmVncy0+ZXM7Ci0gICAgTS54ODYuUl9GUyA9IHNyZWdzLT5mczsKLSAgICBNLng4Ni5SX0dTID0gc3JlZ3MtPmdzOwotICAgICgodTgqKU0ubWVtX2Jhc2UpWzB4NDAwMF0gPSAweENEOwotICAgICgodTgqKU0ubWVtX2Jhc2UpWzB4NDAwMV0gPSAodTgpaW50bm87Ci0gICAgKCh1OCopTS5tZW1fYmFzZSlbMHg0MDAyXSA9IDB4QzM7Ci0gICAgTS54ODYuUl9DUyA9IFNFRygweDA0MDAwKTsKLSAgICBNLng4Ni5SX0lQID0gT0ZGKDB4MDQwMDApOwotICAgIE0ueDg2LlJfU1MgPSBTRUcoTS5tZW1fc2l6ZSAtIDEpOwotICAgIE0ueDg2LlJfU1AgPSBPRkYoTS5tZW1fc2l6ZSAtIDEpOwotICAgIFg4NkVNVV9leGVjKCk7Ci0gICAgb3V0LT5lLmNmbGFnID0gTS54ODYuUl9FRkxHICYgRl9DRjsKLSAgICBvdXQtPmUuZWF4ID0gTS54ODYuUl9FQVg7Ci0gICAgb3V0LT5lLmVieCA9IE0ueDg2LlJfRUJYOwotICAgIG91dC0+ZS5lY3ggPSBNLng4Ni5SX0VDWDsKLSAgICBvdXQtPmUuZWR4ID0gTS54ODYuUl9FRFg7Ci0gICAgb3V0LT5lLmVzaSA9IE0ueDg2LlJfRVNJOwotICAgIG91dC0+ZS5lZGkgPSBNLng4Ni5SX0VESTsKLSAgICBzcmVncy0+ZHMgPSBNLng4Ni5SX0RTOwotICAgIHNyZWdzLT5lcyA9IE0ueDg2LlJfRVM7Ci0gICAgc3JlZ3MtPmZzID0gTS54ODYuUl9GUzsKLSAgICBzcmVncy0+Z3MgPSBNLng4Ni5SX0dTOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLSNpZmRlZiAgX19EUklWRVJfXwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUVtcHR5IGxvZyBmdW5jdGlvbiBmb3IgYmluYXJ5IHBvcnRhYmxlIERMTC4gVGhlIEJQRCBpcyBjb21waWxlZCB3aXRob3V0Ci1kZWJ1ZyBpbmZvcm1hdGlvbiwgc28gdmVyeSBsaXR0bGUgaXMgbG9nZ2VkIGFueXdheSBzbyBpdCBpcyBzaW1wbGVyIHRoaXMKLXdheS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHByaW50ayhjb25zdCBjaGFyICptc2csIC4uLikKLXsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GYXRhbCBlcnJvciBoYW5kbGVyIGNhbGxlZCB3aGVuIGEgbm9uLWltcG9ydGVkIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUKLWRyaXZlci4gV2UgbGVhdmUgdGhpcyB0byBhIHJ1bnRpbWUgZXJyb3Igc28gdGhhdCBvbGRlciBhcHBsaWNhdGlvbnMgYW5kCi1zaGVsbCBkcml2ZXJzIHdpbGwgd29yayB3aXRoIG5ld2VyIGJwZCBkcml2ZXJzIHByb3ZpZGVkIG5vIG5ld2VyIGZ1bmN0aW9ucwotYXJlIHJlcXVpcmVkIGJ5IHRoZSBkcml2ZXIgaXRzZWxmLiBJZiB0aGV5IGFyZSwgdGhlIGFwcGxpY2F0aW9uIG9yIHNoZWxsCi1kcml2ZXIgbmVlZHMgdG8gYmUgcmVjb21waWxlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfUE1fZmF0YWxFcnJvckhhbmRsZXIodm9pZCkKLXsKLSAgICBQTV9mYXRhbEVycm9yKCJVbnN1cHBvcnRlZCBQTV9pbXBvcnRzIGltcG9ydCBmdW5jdGlvbiBjYWxsZWQhIFBsZWFzZSByZS1jb21waWxlIVxuIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmVJbXAgICAtIEJFIGxpYnJhcnkgaW1wb3J0cwotYmVJbXAgICAtIEdlbmVyaWMgZW11bGF0b3IgaW1wb3J0cwotCi1SRVRVUk5TOgotUG9pbnRlciB0byBleHBvcnRlZCBmdW5jdGlvbiBsaXN0Ci0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBCSU9TIGVtdWxhdG9yIGxpYnJhcnkgYW5kIHJldHVybnMgdGhlIGxpc3Qgb2YKLWxvYWRlciBsaWJyYXJ5IGV4cG9ydGVkIGZ1bmN0aW9ucy4KLXtzZWNyZXR9Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQkVfZXhwb3J0cyAqIF9DRVhQT1JUIEJFX2luaXRMaWJyYXJ5KAotICAgIFBNX2ltcG9ydHMgKnBtSW1wKQotewotICAgIHN0YXRpYyBCRV9leHBvcnRzIF9CRV9leHBvcnRzID0gewotCXNpemVvZihCRV9leHBvcnRzKSwKLQlCRV9pbml0LAotCUJFX3NldFZHQSwKLQlCRV9nZXRWR0EsCi0JQkVfbWFwUmVhbFBvaW50ZXIsCi0JQkVfZ2V0VkVTQUJ1ZiwKLQlCRV9jYWxsUmVhbE1vZGUsCi0JQkVfaW50ODYsCi0JQkVfaW50ODZ4LAotCU5VTEwsCi0JQkVfZXhpdCwKLQl9OwotICAgIGludCAgICAgaSxtYXg7Ci0gICAgdWxvbmcgICAqcDsKLQotICAgIC8qIEluaXRpYWxpemUgYWxsIGRlZmF1bHQgaW1wb3J0cyB0byBwb2ludCB0byBmYXRhbCBlcnJvciBoYW5kbGVyICovCi0gICAgLyogZm9yIHVwd2FyZHMgY29tcGF0aWJpbGl0eS4gKi8KLSAgICBtYXggPSBzaXplb2YoX1BNX2ltcG9ydHMpL3NpemVvZihCRV9pbml0TGlicmFyeV90KTsKLSAgICBmb3IgKGkgPSAwLHAgPSAodWxvbmcqKSZfUE1faW1wb3J0czsgaSA8IG1heDsgaSsrKQotCSpwKysgPSAodWxvbmcpX1BNX2ZhdGFsRXJyb3JIYW5kbGVyOwotCi0gICAgLyogTm93IGNvcHkgYWxsIG91ciBpbXBvcnRlZCBmdW5jdGlvbnMgKi8KLSAgICBtZW1jcHkoJl9QTV9pbXBvcnRzLHBtSW1wLE1JTihzaXplb2YoX1BNX2ltcG9ydHMpLHBtSW1wLT5kd1NpemUpKTsKLSAgICByZXR1cm4gJl9CRV9leHBvcnRzOwotfQotCi0jZW5kaWYgIC8qIF9fRFJJVkVSX18gKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvYmlvc2VtdWkuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvYmlvc2VtdWkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlZGViYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jpb3NlbXVpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSW50ZXJuYWwgaGVhZGVyIGZpbGUgZm9yIHRoZSBCSU9TIGVtdWxhdG9yIGxpYnJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fQklPU0VNVUlfSAotI2RlZmluZSBfX0JJT1NFTVVJX0gKLQotI2luY2x1ZGUgPGJpb3NlbXUuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIERCKHgpICAgeAotI2Vsc2UKLSNkZWZpbmUgREIoeCkKLSNlbmRpZgotCi0jZGVmaW5lIEJJT1NfU0VHICAgICAgICAweGZmZjAKLQotI2RlZmluZSBNICAgICAgICAgICAgICAgX1g4NkVNVV9lbnYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogYmlvcy5jICovCi0KLXZvaWQgICAgX0JFX2Jpb3NfaW5pdCh1MzIgKmludHJUYWIpOwotdm9pZCAgICBfQkVfc2V0dXBfZnVuY3Modm9pZCk7Ci0KLS8qIGJlc3lzLmMgKi8KLQotdTggICAgICBYODZBUEkgQkVfcmRiKHUzMiBhZGRyKTsKLXUxNiAgICAgWDg2QVBJIEJFX3Jkdyh1MzIgYWRkcik7Ci11MzIgICAgIFg4NkFQSSBCRV9yZGwodTMyIGFkZHIpOwotdm9pZCAgICBYODZBUEkgQkVfd3JiKHUzMiBhZGRyLHU4IHZhbCk7Ci12b2lkICAgIFg4NkFQSSBCRV93cncodTMyIGFkZHIsdTE2IHZhbCk7Ci12b2lkICAgIFg4NkFQSSBCRV93cmwodTMyIGFkZHIsdTMyIHZhbCk7Ci0jaWZkZWYgIERFQlVHCi11OCAgICAgIFg4NkFQSSBCRV9pbmIoaW50IHBvcnQpOwotdTE2ICAgICBYODZBUEkgQkVfaW53KGludCBwb3J0KTsKLXUzMiAgICAgWDg2QVBJIEJFX2lubChpbnQgcG9ydCk7Ci12b2lkICAgIFg4NkFQSSBCRV9vdXRiKGludCBwb3J0LCB1OCB2YWwpOwotdm9pZCAgICBYODZBUEkgQkVfb3V0dyhpbnQgcG9ydCwgdTE2IHZhbCk7Ci12b2lkICAgIFg4NkFQSSBCRV9vdXRsKGludCBwb3J0LCB1MzIgdmFsKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogX19CSU9TRU1VSV9IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L21ha2VmaWxlIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9tYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA3MzBiMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L21ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgICAgICAgICAgICAgICAgICAgICAgICBCSU9TIGVtdWxhdG9yIGFuZCBpbnRlcmZhY2UKLSMgICAgICAgICAgICAgICAgICAgICAgdG8gUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSMKLSMgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0jICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0jICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0jICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSMgIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSMgIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSMgIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0jICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotIyAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSMKLSMgIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotIyAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotIyAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSMgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSMgIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotIyAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotIyAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgbWFrZWZpbGUgZm9yIHRoZSB4ODZlbXUgbGlicmFyeS4gUmVxdWlyZXMKLSMgICAgICAgICAgICAgICB0aGUgU2NpVGVjaCBTb2Z0d2FyZSBtYWtlZmlsZSBkZWZpbml0aW9ucyBwYWNrYWdlIHRvIGJlCi0jICAgICAgICAgICAgICAgaW5zdGFsbGVkLCB3aGljaCB1c2VzIHRoZSBETUFLRSBtYWtlIHByb2dyYW0uCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0uSU1QT1JUIC5JR05PUkU6IERFQlVHCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIERlZmluZSB0aGUgbGlzdHMgb2Ygb2JqZWN0IGZpbGVzCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1ETExfT0JKUyAgICAgICAgPSBkbGxzdGFydCRPIF9wbV9pbXAkTwotQklPU19PQkpTICAgICAgID0gYmlvc2VtdSRPIGJpb3MkTyBiZXN5cyRPCi1YODZfT0JKUyAgICAgICAgPSBzeXMkTyBkZWNvZGUkTyBvcHMkTyBvcHMyJE8gcHJpbV9vcHMkTyBmcHUkTyBkZWJ1ZyRPCi1DRkxBR1MgICAgICAgICAgKz0gLURTQ0lURUNIIC1JJChTQ0lURUNIKVxzcmNceDg2ZW11Ci0KLS5JRiAkKEJVSUxEX0RMTCkKLQotQ0ZMQUdTICAgICAgICAgICs9IC1JJChQUklWQVRFKVxpbmNsdWRlXGRydmxpYiAtSSQoU0NJVEVDSClcaW5jbHVkZVxkcnZsaWIgLURfX0RSSVZFUl9fCi1BU0ZMQUdTICAgICAgICAgKz0gLWRfX0RSSVZFUl9fCi1FWEVMSUJTICAgICAgICAgPSBkcnZsaWIkTAotCi0uRUxTRQotCi0uSUYgJChERUJVRykKLUNGTEFHUyAgICAgICAgICArPSAtRERFQlVHCi0uRU5ESUYKLU9CSkVDVFMgICAgICAgICA9ICQoQklPU19PQkpTKSAkKFg4Nl9PQkpTKQotTElCQ0xFQU4gICAgICAgID0gKi5kbGwgKi5saWIgKi5hCi1MSUJGSUxFICAgICAgICAgPSAkKExQKWJpb3NlbXUkTAotCi0uRU5ESUYKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU2FtcGxlIHRlc3QgcHJvZ3JhbXMKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFsbDogJChMSUJGSUxFKSB3YXJtYm9vdCRFCi0KLXdhcm1ib290JEU6IHdhcm1ib290JE8gJChMSUJGSUxFKQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUYXJnZXQgdG8gYnVpbGQgdGhlIEJpbmFyeSBQb3J0YWJsZSBETEwgdGFyZ2V0Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1iaW9zZW11LmRsbDogJChETExfT0JKUykgJChCSU9TX09CSlMpICQoWDg2X09CSlMpCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRhcmdldCB0byBidWlsZCBhbGwgSW50ZWwgYmluYXJ5IGRyaXZlcnMKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS5QSE9OWSBta2RydjoKLSAgICBAYnVpbGQgd2MxMS13MzIgYmlvc2VtdS5kbGwgLXUgQlVJTERfRExMPTEgTk9fUlVOVElNRT0xIE9QVD0xCi0gICAgQCQoQ1ApIGJpb3NlbXUuZGxsICQoUFJJVkFURSlcbnVjbGV1c1xncmFwaGljc1xiaW9zZW11LmJwZAotICAgIEBkbWFrZSBjbGVhbmV4ZQotCi0uUEhPTlkgZGI6Ci0gICAgQGJ1aWxkIHdjMTEtdzMyIGJpb3NlbXUuZGxsIEJVSUxEX0RMTD0xIE5PX1JVTlRJTUU9MSBPUFQ9MQotICAgIEAkKENQKSBiaW9zZW11LmRsbCAkKFBSSVZBVEUpXG51Y2xldXNcZ3JhcGhpY3NcYmlvc2VtdS5icGQKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIHRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyB0byBjcmVhdGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBmb3IKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURFUEVORF9PQkogICAgICA9IHdhcm1ib290JE8gJChCSU9TX09CSlMpICQoWDg2X09CSlMpICQoRExMX09CSlMpCi1ERVBFTkRfU1JDICAgICAgPSAkKFNDSVRFQ0gpL3NyYy94ODZlbXU7JChQUklWQVRFKS9zcmMvY29tbW9uCi0uU09VUkNFOiAgICAgICAgICAkKFNDSVRFQ0gpL3NyYy94ODZlbXUgJChQUklWQVRFKS9zcmMvY29tbW9uCi0KLS5JTkNMVURFOiAiJChTQ0lURUNIKS9tYWtlZGVmcy9jb21tb24ubWsiCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L21ha2VmaWxlLmNyb3NzIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9tYWtlZmlsZS5jcm9zcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0MTAwMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L21ha2VmaWxlLmNyb3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotQ0MgPSBwcGMtZWxmMzItZ2NjCi1BUiA9IHBwYy1lbGYzMi1hcgotCi1DRkxBR1MgPSAtRF9fRFJJVkVSX18gLUkuLi8uLi9pbmNsdWRlIC1EREVCVUcgLUkuCi0KLUJJT1NfT0JKUyA9IGJpb3NlbXUubyBiaW9zLm8gYmVzeXMubwotWDg2X09CSlMgPSBzeXMubyBkZWNvZGUubyBvcHMubyBwcmltX29wcy5vIGZwdS5vIGRlYnVnLm8KLQotbGliYmlvcy5hOiAkKEJJT1NfT0JKUykKLQkkKEFSKSByY3MgbGliYmlvcy5hICQoQklPU19PQkpTKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvd2FybWJvb3QuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvd2FybWJvb3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkNWZiOC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L3dhcm1ib290LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICBCSU9TIGVtdWxhdG9yIGFuZCBpbnRlcmZhY2UKLSogICAgICAgICAgICAgICAgICAgICAgdG8gUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIE1vZHVsZSB0byBpbXBsZW1lbnQgd2FybSBib290aW5nIG9mIGFsbCBQQ0kvQUdQIGNvbnRyb2xsZXJzCi0qICAgICAgICAgICAgICAgb24gdGhlIGJ1cy4gV2UgdXNlIHRoZSB4ODYgcmVhbCBtb2RlIGVtdWxhdG9yIHRvIHJ1biB0aGUKLSogICAgICAgICAgICAgICBCSU9TIG9uIHRoZSBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgY29udHJvbGxlcnMgdG8gYnJpbmcKLSogICAgICAgICAgICAgICB0aGUgY2FyZHMgdXAuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlICJiaW9zZW11LmgiCi0jaWZuZGVmIF9NQVhfUEFUSAotI2RlZmluZSBfTUFYX1BBVEggMjU2Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIFBDSURldmljZUluZm8gICAgUENJW01BWF9QQ0lfREVWSUNFU107Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICBOdW1QQ0kgPSAtMTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIEJyaWRnZUluZGV4W01BWF9QQ0lfREVWSUNFU10gPSB7MH07Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICBOdW1CcmlkZ2VzOwotc3RhdGljIFBDSUJyaWRnZUluZm8gICAgKkFHUEJyaWRnZSA9IE5VTEw7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICBEZXZpY2VJbmRleFtNQVhfUENJX0RFVklDRVNdID0gezB9Owotc3RhdGljIGludCAgICAgICAgICAgICAgTnVtRGV2aWNlczsKLXN0YXRpYyB1MzIgICAgICAgICAgICAgIGRlYnVnRmxhZ3MgPSAwOwotc3RhdGljIEJFX1ZHQUluZm8gICAgICAgVkdBSW5mb1tNQVhfUENJX0RFVklDRVNdID0ge3swfX07Ci1zdGF0aWMgaWJvb2wgICAgICAgICAgICB1c2VWODYgPSBmYWxzZTsKLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGZvcmNlUG9zdCA9IGZhbHNlOwotCi0vKiBMZW5ndGggb2YgdGhlIEJJT1MgaW1hZ2UgKi8KLQotI2RlZmluZSBNQVhfQklPU0xFTiAgICAgICAgICg2NCAqIDEwMjRMKQotI2RlZmluZSBGSU5BTF9CSU9TTEVOICAgICAgICgzMiAqIDEwMjRMKQotCi0vKiBNYWNybyB0byBkZXRlcm1pbmUgaWYgdGhlIFZHQSBpcyBlbmFibGVkIGFuZCByZXNwb25kaW5nICovCi0KLSNkZWZpbmUgVkdBX05PVF9BQ1RJVkUoKSAgICAoZm9yY2VQb3N0IHx8IChQTV9pbnBiKDB4M0NDKSA9PSAweEZGKSB8fCAoKFBNX2lucGIoMHgzQ0MpICYgMHgyKSA9PSAwKSkKLQotI2RlZmluZSBFTkFCTEVfREVWSUNFKGRldmljZSkgICBcCi0gICAgUENJX3dyaXRlUENJUmVnQigweDQsUENJW0RldmljZUluZGV4W2RldmljZV1dLkNvbW1hbmQgfCAweDcsZGV2aWNlKQotCi0jZGVmaW5lIERJU0FCTEVfREVWSUNFKGRldmljZSkgIFwKLSAgICBQQ0lfd3JpdGVQQ0lSZWdCKDB4NCwwLGRldmljZSkKLQotLyogTWFjcm9zIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBBR1AgVkdBIHJlc291cmNlcyAqLwotCi0jZGVmaW5lIEVOQUJMRV9BR1BfVkdBKCkgICAgXAotICAgIFBDSV9hY2Nlc3NSZWcoMHgzRSxBR1BCcmlkZ2UtPkJyaWRnZUNvbnRyb2wgfCAweDgsUENJX1dSSVRFX1dPUkQsKFBDSURldmljZUluZm8qKUFHUEJyaWRnZSkKLQotI2RlZmluZSBESVNBQkxFX0FHUF9WR0EoKSAgIFwKLSAgICBQQ0lfYWNjZXNzUmVnKDB4M0UsQUdQQnJpZGdlLT5CcmlkZ2VDb250cm9sICYgfjB4OCxQQ0lfV1JJVEVfV09SRCwoUENJRGV2aWNlSW5mbyopQUdQQnJpZGdlKQotCi0jZGVmaW5lIFJFU1RPUkVfQUdQX1ZHQSgpICAgXAotICAgIFBDSV9hY2Nlc3NSZWcoMHgzRSxBR1BCcmlkZ2UtPkJyaWRnZUNvbnRyb2wsUENJX1dSSVRFX1dPUkQsKFBDSURldmljZUluZm8qKUFHUEJyaWRnZSkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1UaGUgYWRkcmVzcyB0byB1c2UgdG8gbWFwIHRoZSBzZWNvbmRhcnkgQklPUyAoUENJL0FHUCBkZXZpY2VzKQotCi1SRU1BUktTOgotU2VhcmNoZXMgYWxsIHRoZSBQQ0kgYmFzZSBhZGRyZXNzIHJlZ2lzdGVycyBmb3IgdGhlIGRldmljZSBsb29raW5nIGZvciBhCi1tZW1vcnkgbWFwcGluZyB0aGF0IGlzIGxhcmdlIGVub3VnaCB0byBob2xkIG91ciBST00gQklPUy4gV2UgdXN1YWxseSBlbmQgdXAKLWZpbmRpbmcgdGhlIGZyYW1lYnVmZmVyIG1hcHBpbmcgKHVzdWFsbHkgQkFSIDB4MTApLCBhbmQgd2UgdXNlIHRoaXMgbWFwcGluZwotdG8gbWFwIHRoZSBCSU9TIGZvciB0aGUgZGV2aWNlIGludG8uIFdlIHVzZSBhIG1hcHBpbmcgdGhhdCBpcyBhbHJlYWR5Ci1hc3NpZ25lZCB0byB0aGUgZGV2aWNlIHRvIGVuc3VyZSB0aGUgbWVtb3J5IHJhbmdlIHdpbGwgYmUgcGFzc2VkIHRocm91Z2gKLWJ5IGFueSBQQ0ktPlBDSSBvciBBR1AtPlBDSSBicmlkZ2UgdGhhdCBtYXkgYmUgcHJlc2VudC4KLQotTk9URTogVXN1YWxseSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBmb3IgQUdQIGRldmljZXMsIGJ1dCBpdCBtYXkgYmUKLSAgICAgIHVzZWQgZm9yIFBDSSBkZXZpY2VzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gUE9TVCdlZCBhbmQgdGhlIEJJT1MKLSAgICAgIFJPTSBiYXNlIGFkZHJlc3MgaGFzIGJlZW4gemVybydlZCBvdXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIFBDSV9maW5kQklPU0FkZHIoCi0gICAgaW50IGRldmljZSkKLXsKLSAgICB1bG9uZyAgIGJhc2Usc2l6ZTsKLSAgICBpbnQgICAgIGJhcjsKLQotICAgIGZvciAoYmFyID0gMHgxMDsgYmFyIDw9IDB4MTQ7IGJhcisrKSB7Ci0JYmFzZSA9IFBDSV9yZWFkUENJUmVnTChiYXIsZGV2aWNlKSAmIH4weEZGOwotCWlmICghKGJhc2UgJiAweDEpKSB7Ci0JICAgIFBDSV93cml0ZVBDSVJlZ0woYmFyLDB4RkZGRkZGRkYsZGV2aWNlKTsKLQkgICAgc2l6ZSA9IFBDSV9yZWFkUENJUmVnTChiYXIsZGV2aWNlKSAmIH4weEZGOwotCSAgICBzaXplID0gfnNpemUrMTsKLQkgICAgUENJX3dyaXRlUENJUmVnTChiYXIsMCxkZXZpY2UpOwotCSAgICBpZiAoc2l6ZSA+PSBNQVhfQklPU0xFTikKLQkJcmV0dXJuIGJhc2U7Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmUtd3JpdGVzIHRoZSBQQ0kgYmFzZSBhZGRyZXNzIHJlZ2lzdGVycyBmb3IgdGhlIHNlY29uZGFyeSBQQ0kgY29udHJvbGxlcgotd2l0aCB0aGUgdmFsdWVzIGZyb20gb3VyIGluaXRpYWwgUENJIGJ1cyBlbnVtZXJhdGlvbi4gVGhpcyBmaXhlcyB1cCB0aGUKLXZhbHVlcyBhZnRlciB3ZSBoYXZlIFBPU1QnZWQgdGhlIHNlY29uZGFyeSBkaXNwbGF5IGNvbnRyb2xsZXIgQklPUywgd2hpY2gKLW1heSBoYXZlIGluY29ycmVjdGx5IHJlLXByb2dyYW1tZWQgdGhlIGJhc2UgcmVnaXN0ZXJzIHRoZSBzYW1lIGFzIHRoZQotcHJpbWFyeSBkaXNwbGF5IGNvbnRyb2xsZXIgKHRoZSBjYXNlIGZvciBpZGVudGljYWwgUzMgY2FyZHMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9QQ0lfZml4dXBTZWNvbmRhcnlCQVJzKHZvaWQpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTnVtRGV2aWNlczsgaSsrKSB7Ci0JUENJX3dyaXRlUENJUmVnTCgweDEwLFBDSVtEZXZpY2VJbmRleFtpXV0uQmFzZUFkZHJlc3MxMCxpKTsKLQlQQ0lfd3JpdGVQQ0lSZWdMKDB4MTQsUENJW0RldmljZUluZGV4W2ldXS5CYXNlQWRkcmVzczE0LGkpOwotCVBDSV93cml0ZVBDSVJlZ0woMHgxOCxQQ0lbRGV2aWNlSW5kZXhbaV1dLkJhc2VBZGRyZXNzMTgsaSk7Ci0JUENJX3dyaXRlUENJUmVnTCgweDFDLFBDSVtEZXZpY2VJbmRleFtpXV0uQmFzZUFkZHJlc3MxQyxpKTsKLQlQQ0lfd3JpdGVQQ0lSZWdMKDB4MjAsUENJW0RldmljZUluZGV4W2ldXS5CYXNlQWRkcmVzczIwLGkpOwotCVBDSV93cml0ZVBDSVJlZ0woMHgyNCxQQ0lbRGV2aWNlSW5kZXhbaV1dLkJhc2VBZGRyZXNzMjQsaSk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVRydWUgaWYgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpc2VkLCBmYWxzZSBpZiBub3QuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBCSU9TIFBPU1QgY29kZSBvbiB0aGUgY29udHJvbGxlci4gV2UgYXNzdW1lIHRoYXQKLWF0IHRoaXMgc3RhZ2UgdGhlIGNvbnRyb2xsZXIgaGFzIGl0cyBJL08gYW5kIG1lbW9yeSBzcGFjZSBlbmFibGVkIGFuZAotdGhhdCBhbGwgb3RoZXIgY29udHJvbGxlcnMgYXJlIGluIGEgZGlzYWJsZWQgc3RhdGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUENJX2RvQklPU1BPU1QoCi0gICAgaW50IGRldmljZSwKLSAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCi0gICAgdm9pZCAqbWFwcGVkQklPUywKLSAgICB1bG9uZyBCSU9TTGVuKQotewotICAgIFJNUkVHUyAgICAgICAgICByZWdzOwotICAgIFJNU1JFR1MgICAgICAgICBzcmVnczsKLQotICAgIC8qIERldGVybWluZSB0aGUgdmFsdWUgdG8gc3RvcmUgaW4gQVggZm9yIEJJT1MgUE9TVCAqLwotICAgIHJlZ3MueC5heCA9ICh1MTYpKFBDSVtEZXZpY2VJbmRleFtkZXZpY2VdXS5zbG90LmkgPj4gOCk7Ci0gICAgaWYgKHVzZVY4NikgewotCS8qIFBvc3QgdGhlIEJJT1MgdXNpbmcgdGhlIFBNIGZ1bmN0aW9ucyAoaWU6IHY4NiBtb2RlIG9uIExpbnV4KSAqLwotCWlmICghUE1fZG9CSU9TUE9TVChyZWdzLnguYXgsQklPU1BoeXNBZGRyLG1hcHBlZEJJT1MsQklPU0xlbikpIHsKLQkgICAgLyogSWYgdGhlIFBNIGZ1bmN0aW9uIGZhaWxzLCB0aGlzIHByb2JhYmx5IG1lYW5zIGFyZSB3ZSBhcmUgb24gKi8KLQkgICAgLyogRE9TIGFuZCBjYW4ndCByZS1tYXAgdGhlIHJlYWwgbW9kZSAweEMwMDAwIHJlZ2lvbi4gSW4gdGhpc2UgKi8KLQkgICAgLyogY2FzZSBpZiB0aGUgZGV2aWNlIGlzIHRoZSBwcmltYXJ5LCB3ZSBjYW4gdXNlIHRoZSByZWFsICovCi0JICAgIC8qIEJJT1MgYXQgMHhDMDAwMCBkaXJlY3RseS4gKi8KLQkgICAgaWYgKGRldmljZSA9PSAwKQotCQlQTV9kb0JJT1NQT1NUKHJlZ3MueC5heCwweEMwMDAwLG1hcHBlZEJJT1MsQklPU0xlbik7Ci0JICAgIH0KLQl9Ci0gICAgZWxzZSB7Ci0JLyogU2V0dXAgdGhlIFg4NiBlbXVsYXRvciBmb3IgdGhlIFZHQSBCSU9TICovCi0JQkVfc2V0VkdBKCZWR0FJbmZvW2RldmljZV0pOwotCi0JLyogRXhlY3V0ZSB0aGUgQklPUyBQT1NUIGNvZGUgKi8KLQlCRV9jYWxsUmVhbE1vZGUoMHhDMDAwLDB4MDAwMywmcmVncywmc3JlZ3MpOwotCi0JLyogQ2xlYW51cCBhbmQgZXhpdCAqLwotCUJFX2dldFZHQSgmVkdBSW5mb1tkZXZpY2VdKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW5pdGlhbGlzZWQsIGZhbHNlIGlmIG5vdC4KLQotUkVNQVJLUzoKLUxvYWRzIGFuZCBQT1NUJ3MgdGhlIHNlY29uZGFyeSBjb250cm9sbGVycyBCSU9TLCBkaXJlY3RseSBmcm9tIHRoZSBCSU9TCi1pbWFnZSB3ZSBjYW4gZXh0cmFjdCBvdmVyIHRoZSBQQ0kgYnVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBQQ0lfcG9zdENvbnRyb2xsZXJzKHZvaWQpCi17Ci0gICAgaW50ICAgICBkZXZpY2U7Ci0gICAgdWxvbmcgICBCSU9TSW1hZ2VMZW4sbWFwcGVkQklPU1BoeXM7Ci0gICAgdWNoYXIgICAqbWFwcGVkQklPUywqY29weU9mQklPUzsKLSAgICBjaGFyICAgIGZpbGVuYW1lW19NQVhfUEFUSF07Ci0gICAgRklMRSAgICAqZjsKLQotICAgIC8qIERpc2FibGUgdGhlIHByaW1hcnkgZGlzcGxheSBjb250cm9sbGVyIGFuZCBBR1AgVkdBIHBhc3MtdGhyb3VnaCAqLwotICAgIERJU0FCTEVfREVWSUNFKDApOwotICAgIGlmIChBR1BCcmlkZ2UpCi0JRElTQUJMRV9BR1BfVkdBKCk7Ci0KLSAgICAvKiBOb3cgUE9TVCBhbGwgdGhlIHNlY29uZGFyeSBjb250cm9sbGVycyAqLwotICAgIGZvciAoZGV2aWNlID0gMDsgZGV2aWNlIDwgTnVtRGV2aWNlczsgZGV2aWNlKyspIHsKLQkvKiBTa2lwIHRoZSBkZXZpY2UgaWYgaXQgaXMgbm90IGVuYWJsZWQgKHByb2JhYmx5IGFuIElTQSBkZXZpY2UpICovCi0JaWYgKERldmljZUluZGV4W2RldmljZV0gPT0gLTEpCi0JICAgIGNvbnRpbnVlOwotCi0JLyogRW5hYmxlIHNlY29uZGFyeSBkaXNwbGF5IGNvbnRyb2xsZXIuIElmIHRoZSBzZWNvbmRhcnkgY29udHJvbGxlciAqLwotCS8qIGlzIG9uIHRoZSBBR1AgYnVzLCB0aGVuIGVuYWJsZSBWR0EgcmVzb3VyY2VzIGZvciB0aGUgQUdQIGRldmljZS4gKi8KLQlFTkFCTEVfREVWSUNFKGRldmljZSk7Ci0JaWYgKEFHUEJyaWRnZSAmJiBBR1BCcmlkZ2UtPlNlY29uZGF5QnVzTnVtYmVyID09IFBDSVtEZXZpY2VJbmRleFtkZXZpY2VdXS5zbG90LnAuQnVzKQotCSAgICBFTkFCTEVfQUdQX1ZHQSgpOwotCi0JLyogQ2hlY2sgaWYgdGhlIGNvbnRyb2xsZXIgaGFzIGFscmVhZHkgYmVlbiBQT1NUJ2VkICovCi0JaWYgKFZHQV9OT1RfQUNUSVZFKCkpIHsKLQkgICAgLyogRmluZCBhIHZpYWJsZSBwbGFjZSB0byBtYXAgdGhlIHNlY29uZGFyeSBQQ0kgQklPUyBpbWFnZSBhbmQgbWFwIGl0ICovCi0JICAgIHByaW50aygiRGV2aWNlICVkIG5vdCBlbmFibGVkLCBzbyBhdHRlbXB0aW5nIHdhcm0gYm9vdCBpdFxuIiwgZGV2aWNlKTsKLQotCSAgICAvKiBGb3IgQUdQIGRldmljZXMgKGFuZCBQQ0kgZGV2aWNlcyB0aGF0IGRvIGhhdmUgdGhlIFJPTSBiYXNlICovCi0JICAgIC8qIGFkZHJlc3MgemVybydlZCBvdXQpIHdlIGhhdmUgdG8gbWFwIHRoZSBCSU9TIHRvIGEgbG9jYXRpb24gKi8KLQkgICAgLyogdGhhdCBpcyBwYXNzZWQgYnkgdGhlIEFHUCBicmlkZ2UgdG8gdGhlIGJ1cy4gU29tZSBBR1AgZGV2aWNlcyAqLwotCSAgICAvKiBoYXZlIHRoZSBST00gYmFzZSBhZGRyZXNzIGFscmVhZHkgc2V0IHVwIGZvciB1cywgYW5kIHNvbWUgKi8KLQkgICAgLyogZG8gbm90ICh3ZSBtYXAgdG8gb25lIG9mIHRoZSBleGlzdGluZyBCQVIgbG9jYXRpb25zIGluICovCi0JICAgIC8qIHRoaXMgY2FzZSkuICovCi0JICAgIG1hcHBlZEJJT1MgPSBOVUxMOwotCSAgICBpZiAoUENJW0RldmljZUluZGV4W2RldmljZV1dLlJPTUJhc2VBZGRyZXNzICE9IDApCi0JCW1hcHBlZEJJT1NQaHlzID0gUENJW0RldmljZUluZGV4W2RldmljZV1dLlJPTUJhc2VBZGRyZXNzICYgfjB4RjsKLQkgICAgZWxzZQotCQltYXBwZWRCSU9TUGh5cyA9IFBDSV9maW5kQklPU0FkZHIoZGV2aWNlKTsKLQkgICAgcHJpbnRrKCJNYXBwaW5nIEJJT1MgaW1hZ2UgdG8gMHglMDhYXG4iLCBtYXBwZWRCSU9TUGh5cyk7Ci0JICAgIG1hcHBlZEJJT1MgPSBQTV9tYXBQaHlzaWNhbEFkZHIobWFwcGVkQklPU1BoeXMsTUFYX0JJT1NMRU4tMSxmYWxzZSk7Ci0JICAgIFBDSV93cml0ZVBDSVJlZ0woMHgzMCxtYXBwZWRCSU9TUGh5cyB8IDB4MSxkZXZpY2UpOwotCSAgICBCSU9TSW1hZ2VMZW4gPSBtYXBwZWRCSU9TWzJdICogNTEyOwotCSAgICBpZiAoKGNvcHlPZkJJT1MgPSBtYWxsb2MoQklPU0ltYWdlTGVuKSkgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICBtZW1jcHkoY29weU9mQklPUyxtYXBwZWRCSU9TLEJJT1NJbWFnZUxlbik7Ci0JICAgIFBNX2ZyZWVQaHlzaWNhbEFkZHIobWFwcGVkQklPUyxNQVhfQklPU0xFTi0xKTsKLQotCSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgY29weSBvZiBCSU9TIGZyb20gc2Vjb25kYXJ5IGNvbnRyb2xsZXJzICovCi0JICAgIFZHQUluZm9bZGV2aWNlXS5wY2lJbmZvID0gJlBDSVtEZXZpY2VJbmRleFtkZXZpY2VdXTsKLQkgICAgVkdBSW5mb1tkZXZpY2VdLkJJT1NJbWFnZSA9IGNvcHlPZkJJT1M7Ci0JICAgIFZHQUluZm9bZGV2aWNlXS5CSU9TSW1hZ2VMZW4gPSBCSU9TSW1hZ2VMZW47Ci0KLQkgICAgLyogUmVzdG9yZSBkZXZpY2UgbWFwcGluZ3MgKi8KLQkgICAgUENJX3dyaXRlUENJUmVnTCgweDMwLFBDSVtEZXZpY2VJbmRleFtkZXZpY2VdXS5ST01CYXNlQWRkcmVzcyxkZXZpY2UpOwotCSAgICBQQ0lfd3JpdGVQQ0lSZWdMKDB4MTAsUENJW0RldmljZUluZGV4W2RldmljZV1dLkJhc2VBZGRyZXNzMTAsZGV2aWNlKTsKLQkgICAgUENJX3dyaXRlUENJUmVnTCgweDE0LFBDSVtEZXZpY2VJbmRleFtkZXZpY2VdXS5CYXNlQWRkcmVzczE0LGRldmljZSk7Ci0KLQkgICAgLyogTm93IGV4ZWN1dGUgdGhlIEJJT1MgUE9TVCBmb3IgdGhlIGRldmljZSAqLwotCSAgICBpZiAoY29weU9mQklPU1swXSA9PSAweDU1ICYmIGNvcHlPZkJJT1NbMV0gPT0gMHhBQSkgewotCQlwcmludGsoIkV4ZWN1dGluZyBCSU9TIFBPU1QgZm9yIGNvbnRyb2xsZXIuXG4iKTsKLQkJUENJX2RvQklPU1BPU1QoZGV2aWNlLG1hcHBlZEJJT1NQaHlzLGNvcHlPZkJJT1MsQklPU0ltYWdlTGVuKTsKLQkJfQotCi0JICAgIC8qIFJlc2V0IHRoZSBzaXplIG9mIHRoZSBCSU9TIGltYWdlIHRvIHRoZSBmaW5hbCBzaXplICovCi0JICAgIFZHQUluZm9bZGV2aWNlXS5CSU9TSW1hZ2VMZW4gPSBGSU5BTF9CSU9TTEVOOwotCi0JICAgIC8qIFNhdmUgdGhlIEJJT1MgYW5kIGludGVycnVwdCB2ZWN0b3IgaW5mb3JtYXRpb24gdG8gZGlzayAqLwotCSAgICBzcHJpbnRmKGZpbGVuYW1lLCIlcy9iaW9zLiUwMmQiLFBNX2dldE51Y2xldXNDb25maWdQYXRoKCksZGV2aWNlKTsKLQkgICAgaWYgKChmID0gZm9wZW4oZmlsZW5hbWUsIndiIikpICE9IE5VTEwpIHsKLQkJZndyaXRlKGNvcHlPZkJJT1MsMSxGSU5BTF9CSU9TTEVOLGYpOwotCQlmd3JpdGUoVkdBSW5mb1tkZXZpY2VdLkxvd01lbSwxLHNpemVvZihWR0FJbmZvW2RldmljZV0uTG93TWVtKSxmKTsKLQkJZmNsb3NlKGYpOwotCQl9Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIHN0b3JlIGNvcHkgb2YgQklPUyBmcm9tIHNlY29uZGFyeSBjb250cm9sbGVycyAqLwotCSAgICBpZiAoKGNvcHlPZkJJT1MgPSBtYWxsb2MoRklOQUxfQklPU0xFTikpID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgVkdBSW5mb1tkZXZpY2VdLnBjaUluZm8gPSAmUENJW0RldmljZUluZGV4W2RldmljZV1dOwotCSAgICBWR0FJbmZvW2RldmljZV0uQklPU0ltYWdlID0gY29weU9mQklPUzsKLQkgICAgVkdBSW5mb1tkZXZpY2VdLkJJT1NJbWFnZUxlbiA9IEZJTkFMX0JJT1NMRU47Ci0KLQkgICAgLyogTG9hZCB0aGUgQklPUyBhbmQgaW50ZXJydXB0IHZlY3RvciBpbmZvcm1hdGlvbiBmcm9tIGRpc2sgKi8KLQkgICAgc3ByaW50ZihmaWxlbmFtZSwiJXMvYmlvcy4lMDJkIixQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCgpLGRldmljZSk7Ci0JICAgIGlmICgoZiA9IGZvcGVuKGZpbGVuYW1lLCJyYiIpKSAhPSBOVUxMKSB7Ci0JCWZyZWFkKGNvcHlPZkJJT1MsMSxGSU5BTF9CSU9TTEVOLGYpOwotCQlmcmVhZChWR0FJbmZvW2RldmljZV0uTG93TWVtLDEsc2l6ZW9mKFZHQUluZm9bZGV2aWNlXS5Mb3dNZW0pLGYpOwotCQlmY2xvc2UoZik7Ci0JCX0KLQkgICAgfQotCi0JLyogRml4IHVwIGFsbCB0aGUgc2Vjb25kYXJ5IFBDSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXJzICovCi0JLyogKHJlc3RvcmVzIHRoZW0gYWxsIGZyb20gdGhlIHZhbHVlcyB3ZSByZWFkIHByZXZpb3VzbHkpICovCi0JX1BDSV9maXh1cFNlY29uZGFyeUJBUnMoKTsKLQotCS8qIERpc2FibGUgdGhlIHNlY29uZGFyeSBjb250cm9sbGVyIGFuZCBBR1AgVkdBIHBhc3MtdGhyb3VnaCAqLwotCURJU0FCTEVfREVWSUNFKGRldmljZSk7Ci0JaWYgKEFHUEJyaWRnZSkKLQkgICAgRElTQUJMRV9BR1BfVkdBKCk7Ci0JfQotCi0gICAgLyogUmVlbmFibGUgcHJpbWFyeSBkaXNwbGF5IGNvbnRyb2xsZXIgYW5kIHJlc2V0IEFHUCBicmlkZ2UgY29udHJvbCAqLwotICAgIGlmIChBR1BCcmlkZ2UpCi0JUkVTVE9SRV9BR1BfVkdBKCk7Ci0gICAgRU5BQkxFX0RFVklDRSgwKTsKLQotICAgIC8qIEZyZWUgcGh5c2ljYWwgQklPUyBpbWFnZSBtYXBwaW5nICovCi0gICAgUE1fZnJlZVBoeXNpY2FsQWRkcihtYXBwZWRCSU9TLE1BWF9CSU9TTEVOLTEpOwotCi0gICAgLyogUmVzdG9yZSB0aGUgWDg2IGVtdWxhdG9yIEJJT1MgaW5mbyB0byBwcmltYXJ5IGNvbnRyb2xsZXIgKi8KLSAgICBpZiAoIXVzZVY4NikKLQlCRV9zZXRWR0EoJlZHQUluZm9bMF0pOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUVudW1lcmF0ZXMgdGhlIFBDSSBidXMgYW5kIGR1bXBzIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0byB0aGUKLWxvZyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEVudW1lcmF0ZVBDSSh2b2lkKQotewotICAgIGludCAgICAgICAgICAgICBpLGluZGV4OwotICAgIFBDSUJyaWRnZUluZm8gICAqaW5mbzsKLQotICAgIHByaW50aygiRGlzcGxheWluZyBlbnVtZXJhdGlvbiBvZiBQQ0kgYnVzICglZCBkZXZpY2VzLCAlZCBkaXNwbGF5IGRldmljZXMpXG4iLAotCU51bVBDSSwgTnVtRGV2aWNlcyk7Ci0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykKLQlwcmludGsoIiAgRGlzcGxheSBkZXZpY2UgJWQgaXMgUENJIGRldmljZSAlZFxuIixpbmRleCxEZXZpY2VJbmRleFtpbmRleF0pOwotICAgIHByaW50aygiXG4iKTsKLSAgICBwcmludGsoIkJ1cyBTbG90IEZuYyBEZXZpY2VJRCAgU3ViU3lzdGVtIFJldiBDbGFzcyBJUlEgSW50IENtZFxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IE51bVBDSTsgaSsrKSB7Ci0JcHJpbnRrKCIlMmQgICAlMmQgICUyZCAgJTA0WDolMDRYICUwNFg6JTA0WCAlMDJYICAlMDJYOiUwMlggJTAyWCAgJTAyWCAgJTA0WCAgICIsCi0JICAgIFBDSVtpXS5zbG90LnAuQnVzLAotCSAgICBQQ0lbaV0uc2xvdC5wLkRldmljZSwKLQkgICAgUENJW2ldLnNsb3QucC5GdW5jdGlvbiwKLQkgICAgUENJW2ldLlZlbmRvcklELAotCSAgICBQQ0lbaV0uRGV2aWNlSUQsCi0JICAgIFBDSVtpXS5TdWJTeXN0ZW1WZW5kb3JJRCwKLQkgICAgUENJW2ldLlN1YlN5c3RlbUlELAotCSAgICBQQ0lbaV0uUmV2SUQsCi0JICAgIFBDSVtpXS5CYXNlQ2xhc3MsCi0JICAgIFBDSVtpXS5TdWJDbGFzcywKLQkgICAgUENJW2ldLkludGVycnVwdExpbmUsCi0JICAgIFBDSVtpXS5JbnRlcnJ1cHRQaW4sCi0JICAgIFBDSVtpXS5Db21tYW5kKTsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKSB7Ci0JICAgIGlmIChEZXZpY2VJbmRleFtpbmRleF0gPT0gaSkKLQkJYnJlYWs7Ci0JICAgIH0KLQlpZiAoaW5kZXggPCBOdW1EZXZpY2VzKQotCSAgICBwcmludGsoIjwtICVkXG4iLCBpbmRleCk7Ci0JZWxzZQotCSAgICBwcmludGsoIlxuIik7Ci0JfQotICAgIHByaW50aygiXG4iKTsKLSAgICBwcmludGsoIkRldmljZUlEICBTdGF0IElmYyBDY2ggTGF0IEhkciBCSVNUXG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTnVtUENJOyBpKyspIHsKLQlwcmludGsoIiUwNFg6JTA0WCAlMDRYICAlMDJYICAlMDJYICAlMDJYICAlMDJYICAlMDJYICAgIiwKLQkgICAgUENJW2ldLlZlbmRvcklELAotCSAgICBQQ0lbaV0uRGV2aWNlSUQsCi0JICAgIFBDSVtpXS5TdGF0dXMsCi0JICAgIFBDSVtpXS5JbnRlcmZhY2UsCi0JICAgIFBDSVtpXS5DYWNoZUxpbmVTaXplLAotCSAgICBQQ0lbaV0uTGF0ZW5jeVRpbWVyLAotCSAgICBQQ0lbaV0uSGVhZGVyVHlwZSwKLQkgICAgUENJW2ldLkJJU1QpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKLQkgICAgaWYgKERldmljZUluZGV4W2luZGV4XSA9PSBpKQotCQlicmVhazsKLQkgICAgfQotCWlmIChpbmRleCA8IE51bURldmljZXMpCi0JICAgIHByaW50aygiPC0gJWRcbiIsIGluZGV4KTsKLQllbHNlCi0JICAgIHByaW50aygiXG4iKTsKLQl9Ci0gICAgcHJpbnRrKCJcbiIpOwotICAgIHByaW50aygiRGV2aWNlSUQgIEJhc2UxMGggIEJhc2UxNGggIEJhc2UxOGggIEJhc2UxQ2ggIEJhc2UyMGggIEJhc2UyNGggIFJPTUJhc2VcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1QQ0k7IGkrKykgewotCXByaW50aygiJTA0WDolMDRYICUwOFggJTA4WCAlMDhYICUwOFggJTA4WCAlMDhYICUwOFggIiwKLQkgICAgUENJW2ldLlZlbmRvcklELAotCSAgICBQQ0lbaV0uRGV2aWNlSUQsCi0JICAgIFBDSVtpXS5CYXNlQWRkcmVzczEwLAotCSAgICBQQ0lbaV0uQmFzZUFkZHJlc3MxNCwKLQkgICAgUENJW2ldLkJhc2VBZGRyZXNzMTgsCi0JICAgIFBDSVtpXS5CYXNlQWRkcmVzczFDLAotCSAgICBQQ0lbaV0uQmFzZUFkZHJlc3MyMCwKLQkgICAgUENJW2ldLkJhc2VBZGRyZXNzMjQsCi0JICAgIFBDSVtpXS5ST01CYXNlQWRkcmVzcyk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgewotCSAgICBpZiAoRGV2aWNlSW5kZXhbaW5kZXhdID09IGkpCi0JCWJyZWFrOwotCSAgICB9Ci0JaWYgKGluZGV4IDwgTnVtRGV2aWNlcykKLQkgICAgcHJpbnRrKCI8LSAlZFxuIiwgaW5kZXgpOwotCWVsc2UKLQkgICAgcHJpbnRrKCJcbiIpOwotCX0KLSAgICBwcmludGsoIlxuIik7Ci0gICAgcHJpbnRrKCJEZXZpY2VJRCAgQkFSMTBMZW4gQkFSMTRMZW4gQkFSMThMZW4gQkFSMUNMZW4gQkFSMjBMZW4gQkFSMjRMZW4gUk9NTGVuXG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTnVtUENJOyBpKyspIHsKLQlwcmludGsoIiUwNFg6JTA0WCAlMDhYICUwOFggJTA4WCAlMDhYICUwOFggJTA4WCAlMDhYICIsCi0JICAgIFBDSVtpXS5WZW5kb3JJRCwKLQkgICAgUENJW2ldLkRldmljZUlELAotCSAgICBQQ0lbaV0uQmFzZUFkZHJlc3MxMExlbiwKLQkgICAgUENJW2ldLkJhc2VBZGRyZXNzMTRMZW4sCi0JICAgIFBDSVtpXS5CYXNlQWRkcmVzczE4TGVuLAotCSAgICBQQ0lbaV0uQmFzZUFkZHJlc3MxQ0xlbiwKLQkgICAgUENJW2ldLkJhc2VBZGRyZXNzMjBMZW4sCi0JICAgIFBDSVtpXS5CYXNlQWRkcmVzczI0TGVuLAotCSAgICBQQ0lbaV0uUk9NQmFzZUFkZHJlc3NMZW4pOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKLQkgICAgaWYgKERldmljZUluZGV4W2luZGV4XSA9PSBpKQotCQlicmVhazsKLQkgICAgfQotCWlmIChpbmRleCA8IE51bURldmljZXMpCi0JICAgIHByaW50aygiPC0gJWRcbiIsIGluZGV4KTsKLQllbHNlCi0JICAgIHByaW50aygiXG4iKTsKLQl9Ci0gICAgcHJpbnRrKCJcbiIpOwotICAgIHByaW50aygiRGlzcGxheWluZyBlbnVtZXJhdGlvbiBvZiAlZCBicmlkZ2UgZGV2aWNlc1xuIixOdW1CcmlkZ2VzKTsKLSAgICBwcmludGsoIlxuIik7Ci0gICAgcHJpbnRrKCJEZXZpY2VJRCAgUCMgUyMgQiMgSU9CICBJT0wgIE1lbUJhc2UgIE1lbUxpbWl0IFByZUJhc2UgIFByZUxpbWl0IEN0cmxcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1CcmlkZ2VzOyBpKyspIHsKLQlpbmZvID0gKFBDSUJyaWRnZUluZm8qKSZQQ0lbQnJpZGdlSW5kZXhbaV1dOwotCXByaW50aygiJTA0WDolMDRYICUwMlggJTAyWCAlMDJYICUwNFggJTA0WCAlMDhYICUwOFggJTA4WCAlMDhYICUwNFhcbiIsCi0JICAgIGluZm8tPlZlbmRvcklELAotCSAgICBpbmZvLT5EZXZpY2VJRCwKLQkgICAgaW5mby0+UHJpbWFyeUJ1c051bWJlciwKLQkgICAgaW5mby0+U2Vjb25kYXlCdXNOdW1iZXIsCi0JICAgIGluZm8tPlN1Ym9yZGluYXRlQnVzTnVtYmVyLAotCSAgICAoKHUxNilpbmZvLT5JT0Jhc2UgPDwgOCkgJiAweEYwMDAsCi0JICAgIGluZm8tPklPTGltaXQgPwotCQkoKHUxNilpbmZvLT5JT0xpbWl0IDw8IDgpIHwgMHhGRkYgOiAwLAotCSAgICAoKHUzMilpbmZvLT5NZW1vcnlCYXNlIDw8IDE2KSAmIDB4RkZGMDAwMDAsCi0JICAgIGluZm8tPk1lbW9yeUxpbWl0ID8KLQkJKCh1MzIpaW5mby0+TWVtb3J5TGltaXQgPDwgMTYpIHwgMHhGRkZGRiA6IDAsCi0JICAgICgodTMyKWluZm8tPlByZWZldGNoYWJsZU1lbW9yeUJhc2UgPDwgMTYpICYgMHhGRkYwMDAwMCwKLQkgICAgaW5mby0+UHJlZmV0Y2hhYmxlTWVtb3J5TGltaXQgPwotCQkoKHUzMilpbmZvLT5QcmVmZXRjaGFibGVNZW1vcnlMaW1pdCA8PCAxNikgfCAweEZGRkZGIDogMCwKLQkgICAgaW5mby0+QnJpZGdlQ29udHJvbCk7Ci0JfQotICAgIHByaW50aygiXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1OdW1iZXIgb2YgZGlzcGxheSBkZXZpY2VzIGZvdW5kLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBlbnVtZXJhdGVzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGRpc3BsYXkgZGV2aWNlcyBvbiB0aGUKLVBDSSBidXMsIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgZm91bmQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBQQ0lfZW51bWVyYXRlRGV2aWNlcyh2b2lkKQotewotICAgIGludCAgICAgICAgICAgICBpLGo7Ci0gICAgUENJQnJpZGdlSW5mbyAgICppbmZvOwotCi0gICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkLCBlbnVtZXJhdGUgYWxsICovCi0gICAgLyogZGV2aWNlcyBvbiB0aGUgUENJIGJ1cy4gKi8KLSAgICBpZiAoTnVtUENJID09IC0xKSB7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9QQ0lfREVWSUNFUzsgaSsrKQotCSAgICBQQ0lbaV0uZHdTaXplID0gc2l6ZW9mKFBDSVtpXSk7Ci0JaWYgKChOdW1QQ0kgPSBQQ0lfZW51bWVyYXRlKFBDSSxNQVhfUENJX0RFVklDRVMpKSA9PSAwKQotCSAgICByZXR1cm4gLTE7Ci0KLQkvKiBCdWlsZCBhIGxpc3Qgb2YgYWxsIFBDSSBicmlkZ2UgZGV2aWNlcyAqLwotCWZvciAoaSA9IDAsTnVtQnJpZGdlcyA9IDAsQnJpZGdlSW5kZXhbMF0gPSAtMTsgaSA8IE51bVBDSTsgaSsrKSB7Ci0JICAgIGlmIChQQ0lbaV0uQmFzZUNsYXNzID09IFBDSV9CUklER0VfQ0xBU1MpIHsKLQkJaWYgKE51bUJyaWRnZXMgPCBNQVhfUENJX0RFVklDRVMpCi0JCSAgICBCcmlkZ2VJbmRleFtOdW1CcmlkZ2VzKytdID0gaTsKLQkJfQotCSAgICB9Ci0KLQkvKiBOb3cgYnVpbGQgYSBsaXN0IG9mIGFsbCBkaXNwbGF5IGNsYXNzIGRldmljZXMgKi8KLQlmb3IgKGkgPSAwLE51bURldmljZXMgPSAxLERldmljZUluZGV4WzBdID0gLTE7IGkgPCBOdW1QQ0k7IGkrKykgewotCSAgICBpZiAoUENJX0lTX0RJU1BMQVlfQ0xBU1MoJlBDSVtpXSkpIHsKLQkJaWYgKChQQ0lbaV0uQ29tbWFuZCAmIDB4MykgPT0gMHgzKSB7Ci0JCSAgICBEZXZpY2VJbmRleFswXSA9IGk7Ci0JCSAgICB9Ci0JCWVsc2UgewotCQkgICAgaWYgKE51bURldmljZXMgPCBNQVhfUENJX0RFVklDRVMpCi0JCQlEZXZpY2VJbmRleFtOdW1EZXZpY2VzKytdID0gaTsKLQkJICAgIH0KLQkJaWYgKFBDSVtpXS5zbG90LnAuQnVzICE9IDApIHsKLQkJICAgIC8qIFRoaXMgZGV2aWNlIGlzIG9uIGEgZGlmZmVyZW50IGJ1cyB0aGFuIHRoZSBwcmltYXJ5ICovCi0JCSAgICAvKiBQQ0kgYnVzLCBzbyBpdCBpcyBwcm9iYWJseSBhbiBBR1AgZGV2aWNlLiBGaW5kIHRoZSAqLwotCQkgICAgLyogQUdQIGJ1cyBkZXZpY2UgdGhhdCBjb250cm9scyB0aGF0IGJ1cyBzbyB3ZSBjYW4gKi8KLQkJICAgIC8qIGNvbnRyb2wgaXQuICovCi0JCSAgICBmb3IgKGogPSAwOyBqIDwgTnVtQnJpZGdlczsgaisrKSB7Ci0JCQlpbmZvID0gKFBDSUJyaWRnZUluZm8qKSZQQ0lbQnJpZGdlSW5kZXhbal1dOwotCQkJaWYgKGluZm8tPlNlY29uZGF5QnVzTnVtYmVyID09IFBDSVtpXS5zbG90LnAuQnVzKSB7Ci0JCQkgICAgQUdQQnJpZGdlID0gaW5mbzsKLQkJCSAgICBicmVhazsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JLyogRW51bWVyYXRlIGFsbCBQQ0kgYW5kIGJyaWRnZSBkZXZpY2VzIHRvIGxvZyBmaWxlICovCi0JRW51bWVyYXRlUENJKCk7Ci0JfQotICAgIHJldHVybiBOdW1EZXZpY2VzOwotfQotCi1GSUxFICpsb2dmaWxlOwotCi12b2lkIHByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ3B0cjsKLSAgICB2YV9zdGFydChhcmdwdHIsIGZtdCk7Ci0gICAgdmZwcmludGYobG9nZmlsZSwgZm10LCBhcmdwdHIpOwotICAgIGZmbHVzaChsb2dmaWxlKTsKLSAgICB2YV9lbmQoYXJncHRyKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKQotewotICAgIHdoaWxlIChhcmdjID4gMSkgewotCWlmIChzdHJpY21wKGFyZ3ZbMV0sIi11c2V2ODYiKSA9PSAwKSB7Ci0JICAgIHVzZVY4NiA9IHRydWU7Ci0JICAgIH0KLQllbHNlIGlmIChzdHJpY21wKGFyZ3ZbMV0sIi1mb3JjZSIpID09IDApIHsKLQkgICAgZm9yY2VQb3N0ID0gdHJ1ZTsKLQkgICAgfQotI2lmZGVmICBERUJVRwotCWVsc2UgaWYgKHN0cmljbXAoYXJndlsxXSwiLWRlY29kZSIpID09IDApIHsKLQkgICAgZGVidWdGbGFncyB8PSBERUJVR19ERUNPREVfRjsKLQkgICAgfQotCWVsc2UgaWYgKHN0cmljbXAoYXJndlsxXSwiLWlvdHJhY2UiKSA9PSAwKSB7Ci0JICAgIGRlYnVnRmxhZ3MgfD0gREVCVUdfSU9fVFJBQ0VfRjsKLQkgICAgfQotI2VuZGlmCi0JZWxzZSB7Ci0JICAgIHByaW50ZigiVXNhZ2U6IHdhcm1ib290IFstdXNldjg2XSBbLWZvcmNlXSBbLWRlY29kZV0gWy1pb3RyYWNlXVxuIik7Ci0JICAgIGV4aXQoLTEpOwotCSAgICB9Ci0JYXJnYy0tOwotCWFyZ3YrKzsKLQl9Ci0gICAgaWYgKChsb2dmaWxlID0gZm9wZW4oIndhcm1ib290LmxvZyIsInciKSkgPT0gTlVMTCkKLQlleGl0KDEpOwotCi0gICAgUE1faW5pdCgpOwotICAgIGlmICghdXNlVjg2KSB7Ci0JLyogSW5pdGlhbGlzZSB0aGUgeDg2IEJJT1MgZW11bGF0b3IgKi8KLQlCRV9pbml0KGZhbHNlLGRlYnVnRmxhZ3MsNjU1MzYsJlZHQUluZm9bMF0pOwotCX0KLQotICAgIC8qIEVudW1lcmF0ZSBhbGwgZGV2aWNlcyAod2hpY2ggUE9TVCdzIHRoZW0gYXQgdGhlIHNhbWUgdGltZSkgKi8KLSAgICBpZiAoUENJX2VudW1lcmF0ZURldmljZXMoKSA8IDEpIHsKLQlwcmludGsoIk5vIFBDSSBkaXNwbGF5IGRldmljZXMgZm91bmQhXG4iKTsKLQlyZXR1cm4gLTE7Ci0JfQotCi0gICAgLyogUG9zdCBhbGwgdGhlIGRpc3BsYXkgY29udHJvbGxlciBCSU9TJ2VzICovCi0gICAgUENJX3Bvc3RDb250cm9sbGVycygpOwotCi0gICAgLyogQ2xlYW51cCBhbmQgZXhpdCB0aGUgZW11bGF0b3IgKi8KLSAgICBpZiAoIXVzZVY4NikKLQlCRV9leGl0KCk7Ci0gICAgZmNsb3NlKGxvZ2ZpbGUpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19hYV9pbXAuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19hYV9pbXAuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWE5MDI0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9fYWFfaW1wLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgQXVkaW8gQXJjaGl0ZWN0dXJlCi07KgotOyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci07KiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotOyogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotOyogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLTsqICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci07KiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci07KiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotOyogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLTsqICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIFRBU00gNC4wIG9yIE5BU00KLTsqIEVudmlyb25tZW50OiBJQk0gUEMgMzIgYml0IFByb3RlY3RlZCBNb2RlLgotOyoKLTsqIERlc2NyaXB0aW9uOiBNb2R1bGUgdG8gaW1wbGVtZW50IHRoZSBpbXBvcnQgc3R1YnMgZm9yIGFsbCB0aGUgTnVjbGV1cwotOyogICAgICAgICAgICAgIEF1ZGlvIEFQSSBmdW5jdGlvbnMgZm9yIEludGVsIGJpbmFyeSBjb21wYXRpYmxlIGRyaXZlcnMuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1CRUdJTl9JTVBPUlRTX0RFRiAgIF9BQV9leHBvcnRzCi1TS0lQX0lNUCAgICBBQV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQotU0tJUF9JTVAgICAgQUFfZXJyb3JNc2cgICAgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEFBX2dldERheXNMZWZ0ICAgICAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1TS0lQX0lNUCAgICBBQV9yZWdpc3RlckxpY2Vuc2UgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQotU0tJUF9JTVAgICAgQUFfZW51bWVyYXRlRGV2aWNlcyAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEFBX2xvYWREcml2ZXIgICAgICAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1ERUNMQVJFX0lNUCBBQV91bmxvYWREcml2ZXIKLURFQ0xBUkVfSU1QIEFBX3NhdmVPcHRpb25zCi1FTkRfSU1QT1JUU19ERUYKLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9fZ2FfaW1wLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9fZ2FfaW1wLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxNzYwMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vX2dhX2ltcC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLTsqCi07KiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLTsqICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci07KiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci07KiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotOyogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLTsqICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLTsqICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci07KiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotOyogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgVEFTTSA0LjAgb3IgTkFTTQotOyogRW52aXJvbm1lbnQ6IElCTSBQQyAzMiBiaXQgUHJvdGVjdGVkIE1vZGUuCi07KgotOyogRGVzY3JpcHRpb246IE1vZHVsZSB0byBpbXBsZW1lbnQgdGhlIGltcG9ydCBzdHVicyBmb3IgYWxsIHRoZSBOdWNsZXVzCi07KiAgICAgICAgICAgICAgR3JhcGhpY3MgQVBJIGZ1bmN0aW9ucyBmb3IgSW50ZWwgYmluYXJ5IGNvbXBhdGlibGUgZHJpdmVycy4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLUJFR0lOX0lNUE9SVFNfREVGICAgX19HQV9leHBvcnRzCi1TS0lQX0lNUCAgICBHQV9zdGF0dXMsMCAgICAgICAgICAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1TS0lQX0lNUCAgICBHQV9lcnJvck1zZywxICAgICAgICAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1TS0lQX0lNUCAgICBHQV9nZXREYXlzTGVmdCwxICAgICAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1TS0lQX0lNUCAgICBHQV9yZWdpc3RlckxpY2Vuc2UsMiAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1TS0lQX0lNUCAgICBHQV9lbnVtZXJhdGVEZXZpY2VzLDEgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1TS0lQX0lNUCAgICBHQV9sb2FkRHJpdmVyLDIgICAgICAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1ERUNMQVJFX0lNUCBHQV9zZXRBY3RpdmVEZXZpY2UsMQotU0tJUF9JTVAgICAgR0FfcmVzZXJ2ZWQxLDAgICAgICAgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQotREVDTEFSRV9JTVAgR0FfdW5sb2FkRHJpdmVyLDEKLURFQ0xBUkVfSU1QIFJFRjJEX2xvYWREcml2ZXIsNgotREVDTEFSRV9JTVAgUkVGMkRfdW5sb2FkRHJpdmVyLDIKLURFQ0xBUkVfSU1QIEdBX2xvYWRSZWYyZCw1Ci1ERUNMQVJFX0lNUCBHQV91bmxvYWRSZWYyZCwxCi1ERUNMQVJFX0lNUCBHQV9zb2Z0U3RlcmVvSW5pdCwxCi1ERUNMQVJFX0lNUCBHQV9zb2Z0U3RlcmVvT24sMAotREVDTEFSRV9JTVAgR0Ffc29mdFN0ZXJlb1NjaGVkdWxlRmxpcCwyCi1ERUNMQVJFX0lNUCBHQV9zb2Z0U3RlcmVvR2V0RmxpcFN0YXR1cywwCi1ERUNMQVJFX0lNUCBHQV9zb2Z0U3RlcmVvV2FpdFRpbGxGbGlwcGVkLDAKLURFQ0xBUkVfSU1QIEdBX3NvZnRTdGVyZW9PZmYsMAotREVDTEFSRV9JTVAgR0Ffc29mdFN0ZXJlb0V4aXQsMAotREVDTEFSRV9JTVAgR0Ffc2F2ZU1vZGVQcm9maWxlLDIKLURFQ0xBUkVfSU1QIEdBX3NhdmVPcHRpb25zLDIKLURFQ0xBUkVfSU1QIEdBX3NhdmVDUlRDVGltaW5ncywxCi1ERUNMQVJFX0lNUCBHQV9yZXN0b3JlQ1JUQ1RpbWluZ3MsMQotREVDTEFSRV9JTVAgRERDX2luaXQsMQotREVDTEFSRV9JTVAgRERDX3JlYWRFRElELDUKLURFQ0xBUkVfSU1QIEVESURfcGFyc2UsMwotREVDTEFSRV9JTVAgTUNTX2JlZ2luLDEKLURFQ0xBUkVfSU1QIE1DU19nZXRDYXBhYmlsaXRpZXNTdHJpbmcsMgotREVDTEFSRV9JTVAgTUNTX2lzQ29udHJvbFN1cHBvcnRlZCwxCi1ERUNMQVJFX0lNUCBNQ1NfZW5hYmxlQ29udHJvbCwyCi1ERUNMQVJFX0lNUCBNQ1NfZ2V0Q29udHJvbE1heCwyCi1ERUNMQVJFX0lNUCBNQ1NfZ2V0Q29udHJvbFZhbHVlLDIKLURFQ0xBUkVfSU1QIE1DU19nZXRDb250cm9sVmFsdWVzLDMKLURFQ0xBUkVfSU1QIE1DU19zZXRDb250cm9sVmFsdWUsMgotREVDTEFSRV9JTVAgTUNTX3NldENvbnRyb2xWYWx1ZXMsMwotREVDTEFSRV9JTVAgTUNTX3Jlc2V0Q29udHJvbCwxCi1ERUNMQVJFX0lNUCBNQ1Nfc2F2ZUN1cnJlbnRTZXR0aW5ncywwCi1ERUNMQVJFX0lNUCBNQ1NfZ2V0VGltaW5nUmVwb3J0LDMKLURFQ0xBUkVfSU1QIE1DU19nZXRTZWxmVGVzdFJlcG9ydCwzCi1ERUNMQVJFX0lNUCBNQ1NfZW5kLDAKLVNLSVBfSU1QICAgIEdBX2xvYWRJbkdVSSwxICAgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLURFQ0xBUkVfSU1QIEREQ193cml0ZUVESUQsNgotREVDTEFSRV9JTVAgR0FfdXNlRG91YmxlU2NhbiwxCi1ERUNMQVJFX0lNUCBHQV9nZXRNYXhSZWZyZXNoUmF0ZSw0Ci1ERUNMQVJFX0lNUCBHQV9jb21wdXRlQ1JUQ1RpbWluZ3MsNgotREVDTEFSRV9JTVAgR0FfYWRkTW9kZSw1Ci1ERUNMQVJFX0lNUCBHQV9hZGRSZWZyZXNoLDUKLURFQ0xBUkVfSU1QIEdBX2RlbE1vZGUsNQotREVDTEFSRV9JTVAgTl9nZXRMb2dOYW1lLDAKLVNLSVBfSU1QMiAgIE5fbG9nCi1ERUNMQVJFX0lNUCBNREJYX2dldEVyckNvZGUsMAotREVDTEFSRV9JTVAgTURCWF9nZXRFcnJvck1zZywwCi1ERUNMQVJFX0lNUCBNREJYX29wZW4sMQotREVDTEFSRV9JTVAgTURCWF9jbG9zZSwwCi1ERUNMQVJFX0lNUCBNREJYX2ZpcnN0LDEKLURFQ0xBUkVfSU1QIE1EQlhfbGFzdCwxCi1ERUNMQVJFX0lNUCBNREJYX25leHQsMQotREVDTEFSRV9JTVAgTURCWF9wcmV2LDEKLURFQ0xBUkVfSU1QIE1EQlhfaW5zZXJ0LDEKLURFQ0xBUkVfSU1QIE1EQlhfdXBkYXRlLDEKLURFQ0xBUkVfSU1QIE1EQlhfZmx1c2gsMAotREVDTEFSRV9JTVAgTURCWF9pbXBvcnRJTkYsMgotU0tJUF9JTVAgICAgR0FfZ2V0R2xvYmFsT3B0aW9ucywyICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQotREVDTEFSRV9JTVAgR0Ffc2V0R2xvYmFsT3B0aW9ucywxCi1ERUNMQVJFX0lNUCBHQV9zYXZlR2xvYmFsT3B0aW9ucywxCi1ERUNMQVJFX0lNUCBHQV9nZXRJbnRlcm5hbE5hbWUsMQotREVDTEFSRV9JTVAgR0FfZ2V0TnVjbGV1c0NvbmZpZ1BhdGgsMAotREVDTEFSRV9JTVAgR0FfZ2V0RmFrZVBDSUlELDAKLVNLSVBfSU1QICAgIEdBX2xvYWRMaWJyYXJ5LDMgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEdBX2lzT0VNVmVyc2lvbiwxICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLURFQ0xBUkVfSU1QIEdBX2lzTGl0ZVZlcnNpb24sMQotREVDTEFSRV9JTVAgR0FfZ2V0RGlzcGxheVNlcmlhbE5vLDEKLURFQ0xBUkVfSU1QIEdBX2dldERpc3BsYXlVc2VyTmFtZSwxCi1TS0lQX0lNUCAgICBHQV9nZXRDdXJyZW50RHJpdmVyLDEgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1TS0lQX0lNUCAgICBHQV9nZXRDdXJyZW50UmVmMmQsMSAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1TS0lQX0lNUCAgICBHQV9nZXRMaWNlbnNlZERldmljZXMsMSAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1ERUNMQVJFX0lNUCBERENfaW5pdEV4dCwyCi1ERUNMQVJFX0lNUCBNQ1NfYmVnaW5FeHQsMgotREVDTEFSRV9JTVAgR0FfbG9hZFJlZ2lvbk1nciwzCi1ERUNMQVJFX0lNUCBHQV91bmxvYWRSZWdpb25NZ3IsMQotREVDTEFSRV9JTVAgR0FfZ2V0UHJvY0FkZHJlc3MsMgotREVDTEFSRV9JTVAgR0FfZW5hYmxlVkJFTW9kZSw1Ci1ERUNMQVJFX0lNUCBHQV9kaXNhYmxlVkJFTW9kZSw1Ci1ERUNMQVJFX0lNUCBHQV9sb2FkTW9kZVByb2ZpbGUsMgotREVDTEFSRV9JTVAgR0FfZ2V0Q1JUQ1RpbWluZ3MsNAotREVDTEFSRV9JTVAgR0Ffc2V0Q1JUQ1RpbWluZ3MsNAotREVDTEFSRV9JTVAgR0Ffc2V0RGVmYXVsdFJlZnJlc2gsNgotREVDTEFSRV9JTVAgR0Ffc2F2ZU1vbml0b3JJbmZvLDIKLURFQ0xBUkVfSU1QIEdBX2RldGVjdFBuUE1vbml0b3IsMwotU0tJUF9JTVAzICAgR0FfcXVlcnlGdW5jdGlvbnMKLVNLSVBfSU1QMyAgIFJFRjJEX3F1ZXJ5RnVuY3Rpb25zCi1FTkRfSU1QT1JUU19ERUYKLQotICAgICAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19nYXRpbWVyLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9fZ2F0aW1lci5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOTRhNjIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19nYXRpbWVyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotOyoKLTsqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotOyogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLTsqICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLTsqICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci07KiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotOyogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotOyogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLTsqICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci07KiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIE5BU00gb3IgVEFTTQotOyogRW52aXJvbm1lbnQ6IElCTSBQQyAzMiBiaXQgUHJvdGVjdGVkIE1vZGUuCi07KgotOyogRGVzY3JpcHRpb246IEFzc2VtYmx5IHN1cHBvcnQgZnVuY3Rpb25zIGZvciB0aGUgTnVjbGV1cyBsaWJyYXJ5IGZvcgotOyogICAgICAgICAgICAgIHRoZSBoaWdoIHJlc29sdXRpb24gdGltaW5nIHN1cHBvcnQgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5Ci07KiAgICAgICAgICAgICAgdGhlIEludGVsIFBlbnRpdW0gYW5kIGNvbXBhdGlibGUgcHJvY2Vzc29ycy4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgX2dhdGltZXIKLQotYmVnY29kZXNlZyAgX2dhdGltZXIKLQotaWZkZWYgICBVU0VfTkFTTQotJW1hY3JvIG1DUFVfSUQgMAotZGIgIDAwRmgsMEEyaAotJWVuZG1hY3JvCi1lbHNlCi1NQUNSTyAgIG1DUFVfSUQKLWRiICAwMEZoLDBBMmgKLUVORE0KLWVuZGlmCi0KLWlmZGVmICAgVVNFX05BU00KLSVtYWNybyBtUkRUU0MgMAotZGIgIDAwRmgsMDMxaAotJWVuZG1hY3JvCi1lbHNlCi1NQUNSTyAgIG1SRFRTQwotZGIgIDAwRmgsMDMxaAotRU5ETQotZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgYm9vbCBfR0FfaGF2ZUNQVUlEKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBEZXRlcm1pbmVzIGlmIHdlIGhhdmUgc3VwcG9ydCBmb3IgdGhlIENQVUlEIGluc3RydWN0aW9uLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9HQV9oYXZlQ1BVSUQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgICAgICA7IEdldCBvcmlnaW5hbCBFRkxBR1MKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgbW92ICAgICBlY3gsIGVheAotICAgICAgICB4b3IgICAgIGVheCwgMjAwMDAwaCAgICAgICAgOyBGbGlwIElEIGJpdCBpbiBFRkxBR1MKLSAgICAgICAgcHVzaCAgICBlYXggICAgICAgICAgICAgICAgIDsgU2F2ZSBuZXcgRUZMQUdTIHZhbHVlIG9uIHN0YWNrCi0gICAgICAgIHBvcGZkICAgICAgICAgICAgICAgICAgICAgICA7IFJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IG5ldyBFRkxBR1MKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgU3RvcmUgbmV3IEVGTEFHUyBpbiBFQVgKLSAgICAgICAgeG9yICAgICBlYXgsIGVjeCAgICAgICAgICAgIDsgQ2FuIG5vdCB0b2dnbGUgSUQgYml0LAotICAgICAgICBqbnogICAgIEBAMSAgICAgICAgICAgICAgICAgOyBQcm9jZXNzb3I9ODA0ODYKLSAgICAgICAgbW92ICAgICBlYXgsMCAgICAgICAgICAgICAgIDsgV2UgZG9udCBoYXZlIENQVUlEIHN1cHBvcnQKLSAgICAgICAgam1wICAgICBAQERvbmUKLUBAMTogICAgbW92ICAgICBlYXgsMSAgICAgICAgICAgICAgIDsgV2UgaGF2ZSBDUFVJRCBzdXBwb3J0Ci1AQERvbmU6IGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVpbnQgX0dBX2dldENQVUlERmVhdHVyZXModm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERldGVybWluZXMgdGhlIENQVSB0eXBlIHVzaW5nIHRoZSBDUFVJRCBpbnN0cnVjdGlvbi4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfR0FfZ2V0Q1BVSURGZWF0dXJlcwotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICB4b3IgICAgIGVheCwgZWF4ICAgICAgICAgICAgOyBTZXQgdXAgZm9yIENQVUlEIGluc3RydWN0aW9uCi0gICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBhbmQgc2F2ZSB2ZW5kb3IgSUQKLSAgICAgICAgY21wICAgICBlYXgsIDEgICAgICAgICAgICAgIDsgTWFrZSBzdXJlIDEgaXMgdmFsaWQgaW5wdXQgZm9yIENQVUlECi0gICAgICAgIGpsICAgICAgQEBGYWlsICAgICAgICAgICAgICA7IFdlIGRvbnQgaGF2ZSB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgeG9yICAgICBlYXgsIGVheAotICAgICAgICBpbmMgICAgIGVheAotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgZmFtaWx5L21vZGVsL3N0ZXBwaW5nL2ZlYXR1cmVzCi0gICAgICAgIG1vdiAgICAgZWF4LCBlZHgKLUBARG9uZTogbGVhdmVfYwotICAgICAgICByZXQKLQotQEBGYWlsOiB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgam1wICAgICBAQERvbmUKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCAgX0dBX3JlYWRUaW1lU3RhbXAoR0FfbGFyZ2VJbnRlZ2VyICp0aW1lKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZHMgdGhlIHRpbWUgc3RhbXAgY291bnRlciBhbmQgcmV0dXJucyB0aGUgNjQtYml0IHJlc3VsdC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfR0FfcmVhZFRpbWVTdGFtcAotCi0gICAgICAgIG1SRFRTQwotICAgICAgICBtb3YgICAgIGVjeCxbZXNwKzRdICAgICA7IEFjY2VzcyBkaXJlY3RseSB3aXRob3V0IHN0YWNrIGZyYW1lCi0gICAgICAgIG1vdiAgICAgW2VjeF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VjeCs0XSxlZHgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE5fdWludDMyIEdBX1RpbWVyRGlmZmVyZW5jZShHQV9sYXJnZUludGVnZXIgKmEsR0FfbGFyZ2VJbnRlZ2VyICpiKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ29tcHV0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gNjQtYml0IG51bWJlcnMgKGEtYikKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBHQV9UaW1lckRpZmZlcmVuY2UKLQotICAgICAgICBBUkcgICAgIGE6RFBUUiwgYjpEUFRSLCB0OkRQVFIKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgbW92ICAgICBlY3gsW2FdCi0gICAgICAgIG1vdiAgICAgZWF4LFtlY3hdICAgICAgIDsgRUFYIDo9IGIubG93Ci0gICAgICAgIG1vdiAgICAgZWN4LFtiXQotICAgICAgICBzdWIgICAgIGVheCxbZWN4XQotICAgICAgICBtb3YgICAgIGVkeCxlYXggICAgICAgICA7IEVEWCA6PSBsb3cgZGlmZmVyZW5jZQotICAgICAgICBtb3YgICAgIGVjeCxbYV0KLSAgICAgICAgbW92ICAgICBlYXgsW2VjeCs0XSAgICAgOyBFQ1ggOj0gYi5oaWdoCi0gICAgICAgIG1vdiAgICAgZWN4LFtiXQotICAgICAgICBzYmIgICAgIGVheCxbZWN4KzRdICAgICA7IEVBWCA6PSBoaWdoIGRpZmZlcmVuY2UKLSAgICAgICAgbW92ICAgICBlYXgsZWR4ICAgICAgICAgOyBSZXR1cm4gbG93IHBhcnQKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07IE1hY3JvIHRvIGRlbGF5IGJyaWVmbHkgdG8gZW5zdXJlIHRoYXQgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgYmV0d2VlbgotOyBzdWNjZXNzaXZlIEkvTyBhY2Nlc3NlcyBzbyB0aGF0IHRoZSBkZXZpY2UgYmVpbmcgYWNjZXNzZWQgY2FuIHJlc3BvbmQKLTsgdG8gYm90aCBhY2Nlc3NlcyBldmVuIG9uIGEgdmVyeSBmYXN0IFBDLgotCi1pZmRlZiAgIFVTRV9OQVNNCi0lbWFjcm8gIERFTEFZX1RJTUVSIDAKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSVlbmRtYWNybwotZWxzZQotbWFjcm8gICBERUxBWV9USU1FUgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotZW5kbQotZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfT1NfZGVsYXk4MjUzKE5fdWludDMyIG1pY3JvU2Vjb25kcyk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBEZWxheXMgZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcywgYnkgZGlyZWN0bHkgcHJvZ3JhbW1pbmcKLTsgdGhlIDgyNTMgdGltZXIgY2hpcHMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX09TX2RlbGF5ODI1MwotCi0gICAgICAgIEFSRyAgICAgbWljcm9TZWM6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLQotOyBTdGFydCB0aW1lciAyIGNvdW50aW5nCi0KLSAgICAgICAgbW92ICAgICBfYXgsW21pY3JvU2VjXSAgICAgIDsgRUFYIDo9IGNvdW50IGluIG1pY3Jvc2Vjb25kcwotICAgICAgICBtb3YgICAgIGVjeCwxMTk2Ci0gICAgICAgIG11bCAgICAgZWN4Ci0gICAgICAgIG1vdiAgICAgZWN4LDEwMDAKLSAgICAgICAgZGl2ICAgICBlY3gKLSAgICAgICAgbW92ICAgICBlY3gsZWF4ICAgICAgICAgICAgIDsgRUNYIDo9IGNvdW50IGluIHRpbWVyIHRpY2tzCi0gICAgICAgIGluICAgICAgYWwsNjFoCi0gICAgICAgIG9yICAgICAgYWwsMQotICAgICAgICBvdXQgICAgIDYxaCxhbAotCi07IFNldCB0aGUgdGltZXIgMiBjb3VudCB0byAwIGFnYWluIHRvIHN0YXJ0IHRoZSB0aW1pbmcgaW50ZXJ2YWwuCi0KLSAgICAgICAgbW92ICAgICBhbCwxMDExMDEwMGIgICAgICAgIDsgc2V0IHVwIHRvIGxvYWQgaW5pdGlhbCAodGltZXIgMikKLSAgICAgICAgb3V0ICAgICA0M2gsYWwgICAgICAgICAgICAgIDsgdGltZXIgY291bnQKLSAgICAgICAgREVMQVlfVElNRVIKLSAgICAgICAgc3ViICAgICBhbCxhbAotICAgICAgICBvdXQgICAgIDQyaCxhbCAgICAgICAgICAgICAgOyBsb2FkIGNvdW50IGxzYgotICAgICAgICBERUxBWV9USU1FUgotICAgICAgICBvdXQgICAgIDQyaCxhbCAgICAgICAgICAgICAgOyBsb2FkIGNvdW50IG1zYgotICAgICAgICB4b3IgICAgIGRpLGRpICAgICAgICAgICAgICAgOyBBbGxvdyBtYXggNjRLIGxvb3AgaXRlcmF0aW9ucwotCi1AQExvb3BTdGFydDoKLSAgICAgICAgZGVjICAgICBkaSAgICAgICAgICAgICAgICAgIDsgVGhpcyBpcyBhIGd1YXJkIGFnYWluc3QgdGhlIHBvc3NpYmlsaXR5IHRoYXQKLSAgICAgICAganogICAgICBAQExvb3BFbmQgICAgICAgICAgIDsgc29tZW9uZSBlZy4gc3RvcHBlZCB0aGUgdGltZXIgYmVoaW5kIG91ciBiYWNrLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBBZnRlciA2NEsgaXRlcmF0aW9ucyB3ZSBiYWlsIG91dCBubyBtYXR0ZXIgd2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAoYW5kIGhvcGUgaXQgd2Fzbid0IHRvbyBzb29uKQotICAgICAgICBtb3YgICAgIGFsLDAwMDAwMDAwYiAgICAgICAgOyBsYXRjaCB0aW1lciAwCi0gICAgICAgIG91dCAgICAgNDNoLGFsCi0gICAgICAgIERFTEFZX1RJTUVSCi0gICAgICAgIGluICAgICAgYWwsNDJoICAgICAgICAgICAgICA7IGxlYXN0IHNpZ25pZmljYW50IGJ5dGUKLSAgICAgICAgREVMQVlfVElNRVIKLSAgICAgICAgbW92ICAgICBhaCxhbAotICAgICAgICBpbiAgICAgIGFsLDQyaCAgICAgICAgICAgICAgOyBtb3N0IHNpZ25pZmljYW50IGJ5dGUKLSAgICAgICAgeGNoZyAgICBhaCxhbAotICAgICAgICBuZWcgICAgIGF4ICAgICAgICAgICAgICAgICAgOyBDb252ZXJ0IGZyb20gY291bnRkb3duIHJlbWFpbmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgdG8gZWxhcHNlZCBjb3VudAotICAgICAgICBjbXAgICAgIGF4LGN4ICAgICAgICAgICAgICAgOyBIYXMgZGVsYXkgZXhwaXJlZD8KLSAgICAgICAgamIgICAgICBAQExvb3BTdGFydCAgICAgICAgIDsgTm8sIHNvIGxvb3AgdGlsbCBkb25lCi0KLTsgU3RvcCB0aW1lciAyIGZyb20gY291bnRpbmcKLUBATG9vcEVuZDoKLSAgICAgICAgaW4gICAgICBhbCw2MUgKLSAgICAgICAgYW5kICAgICBhbCwwRkVoCi0gICAgICAgIG91dCAgICAgNjFILGFsCi0KLTsgU29tZSBwcm9ncmFtcyBoYXZlIGEgcHJvYmxlbSBpZiB3ZSBjaGFuZ2UgdGhlIGNvbnRyb2wgcG9ydDsgYmV0dGVyIGNoYW5nZSBpdAotOyB0byBzb21ldGhpbmcgdGhleSBleHBlY3QgKG1vZGUgMyAtIHNxdWFyZSB3YXZlIGdlbmVyYXRvcikuLi4KLSAgICAgICAgbW92ICAgICBhbCwwQjZoCi0gICAgICAgIG91dCAgICAgNDNoLGFsCi0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotZW5kY29kZXNlZyAgX2dhdGltZXIKLQotICAgICAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19wbV9pbXAuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19wbV9pbXAuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGIxMTc5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9fcG1faW1wLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLTsqICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci07KiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci07KiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotOyogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLTsqICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLTsqICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci07KiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotOyogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgVEFTTSA0LjAgb3IgTkFTTQotOyogRW52aXJvbm1lbnQ6IElCTSBQQyAzMiBiaXQgUHJvdGVjdGVkIE1vZGUuCi07KgotOyogRGVzY3JpcHRpb246IE1vZHVsZSB0byBpbXBsZW1lbnQgdGhlIGltcG9ydCBzdHVicyBmb3IgYWxsIHRoZSBQTQotOyogICAgICAgICAgICAgIEFQSSBmdW5jdGlvbnMgZm9yIEludGVsIGJpbmFyeSBwb3J0YWJsZSBkcml2ZXJzLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotQkVHSU5fSU1QT1JUU19ERUYgICBfUE1faW1wb3J0cwotREVDTEFSRV9JTVAgUE1fZ2V0TW9kZVR5cGUsMAotREVDTEFSRV9JTVAgUE1fZ2V0QklPU1BvaW50ZXIsMAotREVDTEFSRV9JTVAgUE1fZ2V0QTAwMDBQb2ludGVyLDAKLURFQ0xBUkVfSU1QIFBNX21hcFBoeXNpY2FsQWRkciwwCi1ERUNMQVJFX0lNUCBQTV9tYWxsb2NTaGFyZWQsMAotU0tJUF9JTVAgICAgX1BNX3Jlc2VydmVkMSwwCi1ERUNMQVJFX0lNUCBQTV9mcmVlU2hhcmVkLDAKLURFQ0xBUkVfSU1QIFBNX21hcFRvUHJvY2VzcywwCi1ERUNMQVJFX0lNUCBQTV9tYXBSZWFsUG9pbnRlciwwCi1ERUNMQVJFX0lNUCBQTV9hbGxvY1JlYWxTZWcsMAotREVDTEFSRV9JTVAgUE1fZnJlZVJlYWxTZWcsMAotREVDTEFSRV9JTVAgUE1fYWxsb2NMb2NrZWRNZW0sMAotREVDTEFSRV9JTVAgUE1fZnJlZUxvY2tlZE1lbSwwCi1ERUNMQVJFX0lNUCBQTV9jYWxsUmVhbE1vZGUsMAotREVDTEFSRV9JTVAgUE1faW50ODYsMAotREVDTEFSRV9JTVAgUE1faW50ODZ4LDAKLURFQ0xBUkVfSU1QIERQTUlfaW50ODYsMAotREVDTEFSRV9JTVAgUE1fYXZhaWxhYmxlTWVtb3J5LDAKLURFQ0xBUkVfSU1QIFBNX2dldFZFU0FCdWYsMAotREVDTEFSRV9JTVAgUE1fZ2V0T1NUeXBlLDAKLURFQ0xBUkVfSU1QIFBNX2ZhdGFsRXJyb3IsMAotREVDTEFSRV9JTVAgUE1fc2V0QmFua0EsMAotREVDTEFSRV9JTVAgUE1fc2V0QmFua0FCLDAKLURFQ0xBUkVfSU1QIFBNX3NldENSVFN0YXJ0LDAKLURFQ0xBUkVfSU1QIFBNX2dldEN1cnJlbnRQYXQsMAotREVDTEFSRV9JTVAgUE1fZ2V0VkJFQUZQYXRoLDAKLURFQ0xBUkVfSU1QIFBNX2dldE51Y2xldXNQYXRoLDAKLURFQ0xBUkVfSU1QIFBNX2dldE51Y2xldXNDb25maWdQYXRoLDAKLURFQ0xBUkVfSU1QIFBNX2dldFVuaXF1ZUlELDAKLURFQ0xBUkVfSU1QIFBNX2dldE1hY2hpbmVOYW1lLDAKLURFQ0xBUkVfSU1QIFZGX2F2YWlsYWJsZSwwCi1ERUNMQVJFX0lNUCBWRl9pbml0LDAKLURFQ0xBUkVfSU1QIFZGX2V4aXQsMAotREVDTEFSRV9JTVAgUE1fb3BlbkNvbnNvbGUsMAotREVDTEFSRV9JTVAgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSwwCi1ERUNMQVJFX0lNUCBQTV9zYXZlQ29uc29sZVN0YXRlLDAKLURFQ0xBUkVfSU1QIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUsMAotREVDTEFSRV9JTVAgUE1fY2xvc2VDb25zb2xlLDAKLURFQ0xBUkVfSU1QIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24sMAotREVDTEFSRV9JTVAgUE1fc2V0T1NTY3JlZW5XaWR0aCwwCi1ERUNMQVJFX0lNUCBQTV9lbmFibGVXcml0ZUNvbWJpbmUsMAotREVDTEFSRV9JTVAgUE1fYmFja3NsYXNoLDAKLURFQ0xBUkVfSU1QIFBNX2xvY2tEYXRhUGFnZXMsMAotREVDTEFSRV9JTVAgUE1fdW5sb2NrRGF0YVBhZ2VzLDAKLURFQ0xBUkVfSU1QIFBNX2xvY2tDb2RlUGFnZXMsMAotREVDTEFSRV9JTVAgUE1fdW5sb2NrQ29kZVBhZ2VzLDAKLURFQ0xBUkVfSU1QIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyLDAKLURFQ0xBUkVfSU1QIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3ksMAotREVDTEFSRV9JTVAgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyLDAKLURFQ0xBUkVfSU1QIFBNX2RvQklPU1BPU1QsMAotREVDTEFSRV9JTVAgUE1fZ2V0Qm9vdERyaXZlLDAKLURFQ0xBUkVfSU1QIFBNX2ZyZWVQaHlzaWNhbEFkZHIsMAotREVDTEFSRV9JTVAgUE1faW5wYiwwCi1ERUNMQVJFX0lNUCBQTV9pbnB3LDAKLURFQ0xBUkVfSU1QIFBNX2lucGQsMAotREVDTEFSRV9JTVAgUE1fb3V0cGIsMAotREVDTEFSRV9JTVAgUE1fb3V0cHcsMAotREVDTEFSRV9JTVAgUE1fb3V0cGQsMAotU0tJUF9JTVAgICAgX1BNX3Jlc2VydmVkMiwwCi1ERUNMQVJFX0lNUCBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2ssMAotREVDTEFSRV9JTVAgUE1faGF2ZUJJT1NBY2Nlc3MsMAotREVDTEFSRV9JTVAgUE1fa2JoaXQsMAotREVDTEFSRV9JTVAgUE1fZ2V0Y2gsMAotREVDTEFSRV9JTVAgUE1fZmluZEJQRCwwCi1ERUNMQVJFX0lNUCBQTV9nZXRQaHlzaWNhbEFkZHIsMAotREVDTEFSRV9JTVAgUE1fc2xlZXAsMAotREVDTEFSRV9JTVAgUE1fZ2V0Q09NUG9ydCwwCi1ERUNMQVJFX0lNUCBQTV9nZXRMUFRQb3J0LDAKLURFQ0xBUkVfSU1QIFBNX2xvYWRMaWJyYXJ5LDAKLURFQ0xBUkVfSU1QIFBNX2dldFByb2NBZGRyZXNzLDAKLURFQ0xBUkVfSU1QIFBNX2ZyZWVMaWJyYXJ5LDAKLURFQ0xBUkVfSU1QIFBDSV9lbnVtZXJhdGUsMAotREVDTEFSRV9JTVAgUENJX2FjY2Vzc1JlZywwCi1ERUNMQVJFX0lNUCBQQ0lfc2V0SGFyZHdhcmVJUlEsMAotREVDTEFSRV9JTVAgUENJX2dlbmVyYXRlU3BlY2lhbEN5bGUsMAotU0tJUF9JTVAgICAgX1BNX3Jlc2VydmVkMywwCi1ERUNMQVJFX0lNUCBQQ0lCSU9TX2dldEVudHJ5LDAKLURFQ0xBUkVfSU1QIENQVV9nZXRQcm9jZXNzb3JUeXBlLDAKLURFQ0xBUkVfSU1QIENQVV9oYXZlTU1YLDAKLURFQ0xBUkVfSU1QIENQVV9oYXZlM0ROb3csMAotREVDTEFSRV9JTVAgQ1BVX2hhdmVTU0UsMAotREVDTEFSRV9JTVAgQ1BVX2hhdmVSRFRTQywwCi1ERUNMQVJFX0lNUCBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQsMAotREVDTEFSRV9JTVAgWlRpbWVySW5pdCwwCi1ERUNMQVJFX0lNUCBMWlRpbWVyT24sMAotREVDTEFSRV9JTVAgTFpUaW1lckxhcCwwCi1ERUNMQVJFX0lNUCBMWlRpbWVyT2ZmLDAKLURFQ0xBUkVfSU1QIExaVGltZXJDb3VudCwwCi1ERUNMQVJFX0lNUCBMWlRpbWVyT25FeHQsMAotREVDTEFSRV9JTVAgTFpUaW1lckxhcEV4dCwwCi1ERUNMQVJFX0lNUCBMWlRpbWVyT2ZmRXh0LDAKLURFQ0xBUkVfSU1QIExaVGltZXJDb3VudEV4dCwwCi1ERUNMQVJFX0lNUCBVTFpUaW1lck9uLDAKLURFQ0xBUkVfSU1QIFVMWlRpbWVyTGFwLDAKLURFQ0xBUkVfSU1QIFVMWlRpbWVyT2ZmLDAKLURFQ0xBUkVfSU1QIFVMWlRpbWVyQ291bnQsMAotREVDTEFSRV9JTVAgVUxaUmVhZFRpbWUsMAotREVDTEFSRV9JTVAgVUxaRWxhcHNlZFRpbWUsMAotREVDTEFSRV9JTVAgVUxaVGltZXJSZXNvbHV0aW9uLDAKLURFQ0xBUkVfSU1QIFBNX2ZpbmRGaXJzdEZpbGUsMAotREVDTEFSRV9JTVAgUE1fZmluZE5leHRGaWxlLDAKLURFQ0xBUkVfSU1QIFBNX2ZpbmRDbG9zZSwwCi1ERUNMQVJFX0lNUCBQTV9tYWtlcGF0aCwwCi1ERUNMQVJFX0lNUCBQTV9zcGxpdHBhdGgsMAotREVDTEFSRV9JTVAgUE1fZHJpdmVWYWxpZCwwCi1ERUNMQVJFX0lNUCBQTV9nZXRkY3dkLDAKLURFQ0xBUkVfSU1QIFBNX3NldEZpbGVBdHRyLDAKLURFQ0xBUkVfSU1QIFBNX21rZGlyLDAKLURFQ0xBUkVfSU1QIFBNX3JtZGlyLDAKLURFQ0xBUkVfSU1QIFBNX2dldEZpbGVBdHRyLDAKLURFQ0xBUkVfSU1QIFBNX2dldEZpbGVUaW1lLDAKLURFQ0xBUkVfSU1QIFBNX3NldEZpbGVUaW1lLDAKLURFQ0xBUkVfSU1QIENQVV9nZXRQcm9jZXNzb3JOYW1lLDAKLURFQ0xBUkVfSU1QIFBNX2dldFZHQVN0YXRlU2l6ZSwwCi1ERUNMQVJFX0lNUCBQTV9zYXZlVkdBU3RhdGUsMAotREVDTEFSRV9JTVAgUE1fcmVzdG9yZVZHQVN0YXRlLDAKLURFQ0xBUkVfSU1QIFBNX3ZnYUJsYW5rRGlzcGxheSwwCi1ERUNMQVJFX0lNUCBQTV92Z2FVbmJsYW5rRGlzcGxheSwwCi1ERUNMQVJFX0lNUCBQTV9ibG9ja1VudGlsVGltZW91dCwwCi1ERUNMQVJFX0lNUCBfUE1fYWRkNjQsMAotREVDTEFSRV9JTVAgX1BNX3N1YjY0LDAKLURFQ0xBUkVfSU1QIF9QTV9tdWw2NCwwCi1ERUNMQVJFX0lNUCBfUE1fZGl2NjQsMAotREVDTEFSRV9JTVAgX1BNX3NocjY0LDAKLURFQ0xBUkVfSU1QIF9QTV9zYXI2NCwwCi1ERUNMQVJFX0lNUCBfUE1fc2hsNjQsMAotREVDTEFSRV9JTVAgX1BNX25lZzY0LDAKLURFQ0xBUkVfSU1QIFBDSV9maW5kQkFSU2l6ZSwwCi1ERUNMQVJFX0lNUCBQQ0lfcmVhZFJlZ0Jsb2NrLDAKLURFQ0xBUkVfSU1QIFBDSV93cml0ZVJlZ0Jsb2NrLDAKLURFQ0xBUkVfSU1QIFBNX2ZsdXNoVExCLDAKLURFQ0xBUkVfSU1QIFBNX3VzZUxvY2FsTWFsbG9jLDAKLURFQ0xBUkVfSU1QIFBNX21hbGxvYywwCi1ERUNMQVJFX0lNUCBQTV9jYWxsb2MsMAotREVDTEFSRV9JTVAgUE1fcmVhbGxvYywwCi1ERUNMQVJFX0lNUCBQTV9mcmVlLDAKLURFQ0xBUkVfSU1QIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlLDAKLURFQ0xBUkVfSU1QIFBNX2FsbG9jUGFnZSwwCi1ERUNMQVJFX0lNUCBQTV9mcmVlUGFnZSwwCi1ERUNMQVJFX0lNUCBQTV9hZ3BJbml0LDAKLURFQ0xBUkVfSU1QIFBNX2FncEV4aXQsMAotREVDTEFSRV9JTVAgUE1fYWdwUmVzZXJ2ZVBoeXNpY2FsLDAKLURFQ0xBUkVfSU1QIFBNX2FncFJlbGVhc2VQaHlzaWNhbCwwCi1ERUNMQVJFX0lNUCBQTV9hZ3BDb21taXRQaHlzaWNhbCwwCi1ERUNMQVJFX0lNUCBQTV9hZ3BGcmVlUGh5c2ljYWwsMAotREVDTEFSRV9JTVAgUENJX2dldE51bURldmljZXMsMAotREVDTEFSRV9JTVAgUE1fc2V0TG9jYWxCUERQYXRoLDAKLURFQ0xBUkVfSU1QIFBNX2xvYWREaXJlY3REcmF3LDAKLURFQ0xBUkVfSU1QIFBNX3VubG9hZERpcmVjdERyYXcsMAotREVDTEFSRV9JTVAgUE1fZ2V0RGlyZWN0RHJhd1dpbmRvdywwCi1ERUNMQVJFX0lNUCBQTV9kb1N1c3BlbmRBcHAsMAotRU5EX0lNUE9SVFNfREVGCi0KLSAgICAgICAgRU5ECi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWJlb3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWJlb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1Njk4YS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFiZW9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIExpbnV4Ci0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotR0Ffc2hhcmVkSW5mbyAqIE5BUEkgR0FfZ2V0U2hhcmVkSW5mbygKLSAgICBpbnQgZGV2aWNlKQotewotICAgICh2b2lkKWRldmljZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAotICAgIEdBX2V4cG9ydHMgKmdhRXhwKQotewotICAgICh2b2lkKWdhRXhwOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkKLQloYXZlUkRUU0MgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgaWYgKGhhdmVSRFRTQykKLQlfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7Ci0gICAgZWxzZSB7Ci0Jc3RydWN0IHRpbWV2YWwgdDsKLQlnZXR0aW1lb2ZkYXkoJnQsIE5VTEwpOwotCXZhbHVlLT5sb3cgPSB0LnR2X3NlYyoxMDAwMDAwICsgdC50dl91c2VjOwotCXZhbHVlLT5oaWdoID0gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFkb3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWRvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDJkMmYzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWRvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBNU0RPUwotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBNU0RPUyBvcGVyYXRpbmcgc3lzdGVtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtX2hlbHAuaCIKLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlIERPUwotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQotCXJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIF9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWxpYi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhbGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMDNiMjIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhbGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgQXVkaW8gQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueSAzMi1iaXQgcHJvdGVjdGVkIG1vZGUgZW52aXJvbm1lbnQKLSoKLSogRGVzY3JpcHRpb246ICBDIG1vZHVsZSBmb3IgdGhlIEdyYXBoaWNzIEFjY2VsZXJhdG9yIERyaXZlciBBUEkuIFVzZXMKLSogICAgICAgICAgICAgICB0aGUgU2NpVGVjaCBQTSBsaWJyYXJ5IGZvciBpbnRlcmZhY2luZyB3aXRoIERPUwotKiAgICAgICAgICAgICAgIGV4dGVuZGVyIHNwZWNpZmljIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJudWNsZXVzL2F1ZGlvLmgiCi0jaWZkZWYgX19XSU4zMl9WWERfXwotI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBURVNUX0hBUk5FU1MKLWV4dGVybiBQTV9pbXBvcnRzICAgX1ZBUkFQSSBfUE1faW1wb3J0czsKLSNlbHNlCi1BQV9leHBvcnRzICBfVkFSQVBJIF9BQV9leHBvcnRzOwotc3RhdGljIGludCAgICAgICAgICBsb2FkZWQgPSBmYWxzZTsKLXN0YXRpYyBQRV9NT0RVTEUgICAgKmhNb2RCUEQgPSBOVUxMOwotCi0jaWZkZWYgIF9fRFJJVkVSX18KLWV4dGVybiBQTV9pbXBvcnRzIF9QTV9pbXBvcnRzOwotI2Vsc2UKLSNpbmNsdWRlICJwbWltcC5oIgotI2VuZGlmCi0KLXN0YXRpYyBOX2ltcG9ydHMgX05faW1wb3J0cyA9IHsKLSAgICBzaXplb2YoTl9pbXBvcnRzKSwKLSAgICBfT1NfZGVsYXksCi0gICAgfTsKLQotI2lmZGVmICBfX0RSSVZFUl9fCi1leHRlcm4gQUFfaW1wb3J0cyBfQUFfaW1wb3J0czsKLSNlbHNlCi1zdGF0aWMgQUFfaW1wb3J0cyBfQUFfaW1wb3J0cyA9IHsKLSAgICBzaXplb2YoQUFfaW1wb3J0cyksCi0gICAgfTsKLSNlbmRpZgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgRExMX05BTUUgICAgICAgICJhdWRpby5icGQiCi0KLSNpZm5kZWYgVEVTVF9IQVJORVNTCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZhdGFsIGVycm9yIGhhbmRsZXIgZm9yIG5vbi1leHBvcnRlZCBBQV9leHBvcnRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9BQV9mYXRhbEVycm9ySGFuZGxlcih2b2lkKQotewotICAgIFBNX2ZhdGFsRXJyb3IoIlVuc3VwcG9ydGVkIE51Y2xldXMgZXhwb3J0IGZ1bmN0aW9uIGNhbGxlZCEgUGxlYXNlIHVwZ3JhZGUgeW91ciBjb3B5IG9mIE51Y2xldXMhXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2FkcyB0aGUgTnVjbGV1cyBiaW5hcnkgcG9ydGFibGUgRExMIGludG8gbWVtb3J5IGFuZCBpbml0aWxpc2VzIGl0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBMb2FkRHJpdmVyKHZvaWQpCi17Ci0gICAgQUFfaW5pdExpYnJhcnlfdCAgICBBQV9pbml0TGlicmFyeTsKLSAgICBBQV9leHBvcnRzICAgICAgICAgICphYUV4cDsKLSAgICBjaGFyICAgICAgICAgICAgICAgIGZpbGVuYW1lW1BNX01BWF9QQVRIXTsKLSAgICBjaGFyICAgICAgICAgICAgICAgIGJwZHBhdGhbUE1fTUFYX1BBVEhdOwotICAgIGludCAgICAgICAgICAgICAgICAgaSxtYXg7Ci0gICAgdWxvbmcgICAgICAgICAgICAgICAqcDsKLQotICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBsb2FkZWQgdGhlIGRyaXZlciAqLwotICAgIGlmIChsb2FkZWQpCi0JcmV0dXJuIHRydWU7Ci0gICAgUE1faW5pdCgpOwotICAgIF9BQV9leHBvcnRzLmR3U2l6ZSA9IHNpemVvZihfQUFfZXhwb3J0cyk7Ci0KLSAgICAvKiBPcGVuIHRoZSBCUEQgZmlsZSAqLwotICAgIGlmICghUE1fZmluZEJQRChETExfTkFNRSxicGRwYXRoKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgc3RyY3B5KGZpbGVuYW1lLGJwZHBhdGgpOwotICAgIHN0cmNhdChmaWxlbmFtZSxETExfTkFNRSk7Ci0gICAgaWYgKChoTW9kQlBEID0gUEVfbG9hZExpYnJhcnkoZmlsZW5hbWUsZmFsc2UpKSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICBpZiAoKEFBX2luaXRMaWJyYXJ5ID0gKEFBX2luaXRMaWJyYXJ5X3QpUEVfZ2V0UHJvY0FkZHJlc3MoaE1vZEJQRCwiX0FBX2luaXRMaWJyYXJ5IikpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIGJwZHBhdGhbc3RybGVuKGJwZHBhdGgpLTFdID0gMDsKLSAgICBpZiAoc3RyY21wKGJwZHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSkgPT0gMCkKLQlzdHJjcHkoYnBkcGF0aCxQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCgpKTsKLSAgICBlbHNlIHsKLQlQTV9iYWNrc2xhc2goYnBkcGF0aCk7Ci0Jc3RyY2F0KGJwZHBhdGgsImNvbmZpZyIpOwotCX0KLSAgICBpZiAoKGFhRXhwID0gQUFfaW5pdExpYnJhcnkoYnBkcGF0aCxmaWxlbmFtZSwmX1BNX2ltcG9ydHMsJl9OX2ltcG9ydHMsJl9BQV9pbXBvcnRzKSkgPT0gTlVMTCkKLQlQTV9mYXRhbEVycm9yKCJBQV9pbml0TGlicmFyeSBmYWlsZWQhXG4iKTsKLQotICAgIC8qIEluaXRpYWxpemUgYWxsIGRlZmF1bHQgaW1wb3J0cyB0byBwb2ludCB0byBmYXRhbCBlcnJvciBoYW5kbGVyCi0gICAgICogZm9yIHVwd2FyZHMgY29tcGF0aWJpbGl0eSwgYW5kIGNvcHkgdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucy4KLSAgICAgKi8KLSAgICBtYXggPSBzaXplb2YoX0FBX2V4cG9ydHMpL3NpemVvZihBQV9pbml0TGlicmFyeV90KTsKLSAgICBmb3IgKGkgPSAwLHAgPSAodWxvbmcqKSZfQUFfZXhwb3J0czsgaSA8IG1heDsgaSsrKQotCSpwKysgPSAodWxvbmcpX0FBX2ZhdGFsRXJyb3JIYW5kbGVyOwotICAgIG1lbWNweSgmX0FBX2V4cG9ydHMsYWFFeHAsTUlOKHNpemVvZihfQUFfZXhwb3J0cyksYWFFeHAtPmR3U2l6ZSkpOwotICAgIGxvYWRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIHN0dWIgZW50cnkgcG9pbnRzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbGxzIHRvCi0gKiBpbml0aWFsaXNlIHRoZSBOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LCBhbmQgd2UgdXNlIHRoaXMgdG8gbG9hZCBvdXIKLSAqIGRyaXZlciBETEwgZnJvbSBkaXNrIGFuZCBpbml0aWFsaXNlIHRoZSBsaWJyYXJ5IHVzaW5nIGl0LgotICovCi0KLS8qIHtzZWNyZXR9ICovCi1pbnQgTkFQSSBBQV9zdGF0dXModm9pZCkKLXsKLSAgICBpZiAoIWxvYWRlZCkKLQlyZXR1cm4gbkRyaXZlck5vdEZvdW5kOwotICAgIHJldHVybiBfQUFfZXhwb3J0cy5BQV9zdGF0dXMoKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLWNvbnN0IGNoYXIgKiBOQVBJIEFBX2Vycm9yTXNnKAotICAgIE5faW50MzIgc3RhdHVzKQotewotICAgIGlmICghbG9hZGVkKQotCXJldHVybiAiVW5hYmxlIHRvIGxvYWQgTnVjbGV1cyBkZXZpY2UgZHJpdmVyISI7Ci0gICAgcmV0dXJuIF9BQV9leHBvcnRzLkFBX2Vycm9yTXNnKHN0YXR1cyk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1pbnQgTkFQSSBBQV9nZXREYXlzTGVmdCh2b2lkKQotewotICAgIGlmICghTG9hZERyaXZlcigpKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gX0FBX2V4cG9ydHMuQUFfZ2V0RGF5c0xlZnQoKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLWludCBOQVBJIEFBX3JlZ2lzdGVyTGljZW5zZSh1Y2hhciAqbGljZW5zZSkKLXsKLSAgICBpZiAoIUxvYWREcml2ZXIoKSkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gX0FBX2V4cG9ydHMuQUFfcmVnaXN0ZXJMaWNlbnNlKGxpY2Vuc2UpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotaW50IE5BUEkgQUFfZW51bWVyYXRlRGV2aWNlcyh2b2lkKQotewotICAgIGlmICghTG9hZERyaXZlcigpKQotCXJldHVybiAwOwotICAgIHJldHVybiBfQUFfZXhwb3J0cy5BQV9lbnVtZXJhdGVEZXZpY2VzKCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1BQV9kZXZDdHggKiBOQVBJIEFBX2xvYWREcml2ZXIoTl9pbnQzMiBkZXZpY2VJbmRleCkKLXsKLSAgICBpZiAoIUxvYWREcml2ZXIoKSkKLQlyZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gX0FBX2V4cG9ydHMuQUFfbG9hZERyaXZlcihkZXZpY2VJbmRleCk7Ci19Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE5fdWludDMyICAgIGxvdzsKLSAgICBOX3VpbnQzMiAgICBoaWdoOwotICAgIH0gQUFfbGFyZ2VJbnRlZ2VyOwotCi12b2lkICAgIE5BUEkgX09TX2RlbGF5ODI1MyhOX3VpbnQzMiBtaWNyb1NlY29uZHMpOwotaWJvb2wgICBOQVBJIF9HQV9oYXZlQ1BVSUQodm9pZCk7Ci11aW50ICAgIE5BUEkgX0dBX2dldENQVUlERmVhdHVyZXModm9pZCk7Ci12b2lkICAgIE5BUEkgX0dBX3JlYWRUaW1lU3RhbXAoQUFfbGFyZ2VJbnRlZ2VyICp0aW1lKTsKLSNkZWZpbmUgQ1BVX0hhdmVSRFRTQyAgIDB4MDAwMDAwMTAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGRlbGF5cyBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWljcm9zZWNvbmRzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIF9PU19kZWxheSgKLSAgICBOX3VpbnQzMiBtaWNyb1NlY29uZHMpCi17Ci0gICAgc3RhdGljIGlib29sICAgIGluaXRlZCA9IGZhbHNlOwotICAgIExaVGltZXJPYmplY3QgICB0bTsKLQotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKSB7Ci0JaWYgKCFpbml0ZWQpIHsKLQkgICAgWlRpbWVySW5pdCgpOwotCSAgICBpbml0ZWQgPSB0cnVlOwotCSAgICB9Ci0JTFpUaW1lck9uRXh0KCZ0bSk7Ci0Jd2hpbGUgKExaVGltZXJMYXBFeHQoJnRtKSA8IG1pY3JvU2Vjb25kcykKLQkgICAgOwotCUxaVGltZXJPbkV4dCgmdG0pOwotCX0KLSAgICBlbHNlCi0JX09TX2RlbGF5ODI1MyhtaWNyb1NlY29uZHMpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhbGludXguYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWxpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZDQ2OGUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgTGludXgKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGlib29sICAgICAgICBoYXZlUkRUU0M7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdBX3NoYXJlZEluZm8gKiBOQVBJIEdBX2dldFNoYXJlZEluZm8oCi0gICAgaW50IGRldmljZSkKLXsKLSAgICAodm9pZClkZXZpY2U7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCkKLXsKLSAgICAodm9pZClnYUV4cDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JaGF2ZVJEVFNDID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotICAgIGVsc2UgewotCXN0cnVjdCB0aW1ldmFsIHQ7Ci0JZ2V0dGltZW9mZGF5KCZ0LCBOVUxMKTsKLQl2YWx1ZS0+bG93ID0gdC50dl9zZWMqMTAwMDAwMCArIHQudHZfdXNlYzsKLQl2YWx1ZS0+aGlnaCA9IDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2Fhb3MyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFvczIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjOGM5Zi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFvczIuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIE9TLzIgMzItYml0Ci0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIE9TLzIgb3BlcmF0aW5nIHN5c3RlbSBlbnZpcm9ubWVudHMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1faGVscC5oIgotI2RlZmluZSBJTkNMX0RPU0VSUk9SUwotI2RlZmluZSBJTkNMX0RPUwotI2RlZmluZSBJTkNMX1NVQgotI2RlZmluZSBJTkNMX1ZJTwotI2RlZmluZSBJTkNMX0tCRAotI2luY2x1ZGUgPG9zMi5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgSEZJTEUgICAgICAgIGhTRERIZWxwOwotc3RhdGljIHVsb25nICAgICAgICBvdXRMZW47ICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgNjRLYiBib3VuZGFyeSEgICAgKi8KLXN0YXRpYyB1bG9uZyAgICAgICAgcmVzdWx0OyAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIDY0S2IgYm91bmRhcnkhICAgICovCi1zdGF0aWMgaWJvb2wgICAgICAgIGhhdmVSRFRTQzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjb21tb24gZ3JhcGhpY3MgZHJpdmVyIGxvYWRlZCBpbiB0aGUKLWhlbHBlciBWeEQuIFRoZSBtZW1vcnkgZm9yIHRoZSBWeEQgaXMgc2hhcmVkIGJldHdlZW4gYWxsIHByb2Nlc3NlcyB2aWEKLXRoZSBWeEQsIHNvIHRoYXQgdGhlIFZ4RCwgMTYtYml0IGNvZGUgYW5kIDMyLWJpdCBjb2RlIGFsbCBzZWUgdGhlIHNhbWUKLXN0YXRlIHdoZW4gYWNjZXNzaW5nIHRoZSBncmFwaGljcyBiaW5hcnkgcG9ydGFibGUgZHJpdmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdBX3NoYXJlZEluZm8gKiBOQVBJIEdBX2dldFNoYXJlZEluZm8oCi0gICAgaW50IGRldmljZSkKLXsKLSAgICAvKiBJbml0aWFsaXNlIHRoZSBQTSBsaWJyYXJ5IGFuZCBjb25uZWN0IHRvIG91ciBydW50aW1lIERMTCdzICovCi0gICAgUE1faW5pdCgpOwotCi0gICAgLyogT3BlbiBvdXIgaGVscGVyIGRldmljZSBkcml2ZXIgKi8KLSAgICBpZiAoRG9zT3BlbihQTUhFTFBfTkFNRSwmaFNEREhlbHAsJnJlc3VsdCwwLDAsCi0JICAgIEZJTEVfT1BFTiwgT1BFTl9TSEFSRV9ERU5ZTk9ORSB8IE9QRU5fQUNDRVNTX1JFQURXUklURSwKLQkgICAgTlVMTCkpCi0JUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIG9wZW4gU0RESEVMUCQgaGVscGVyIGRldmljZSBkcml2ZXIhIik7Ci0gICAgb3V0TGVuID0gc2l6ZW9mKHJlc3VsdCk7Ci0gICAgRG9zRGV2SU9DdGwoaFNEREhlbHAsUE1IRUxQX0lPQ1RMLFBNSEVMUF9HRVRTSEFSRURJTkZPLAotCU5VTEwsIDAsIE5VTEwsCi0JJnJlc3VsdCwgb3V0TGVuLCAmb3V0TGVuKTsKLSAgICBEb3NDbG9zZShoU0RESGVscCk7Ci0gICAgaWYgKHJlc3VsdCkgewotCS8qIFdlIGhhdmUgZm91bmQgdGhlIHNoYXJlZCBOdWNsZXVzIHBhY2tldC4gQmVjYXVzZSBub3QgYWxsIHByb2Nlc3NlcwotCSAqIG1hcCB0byBTRERQTUkuRExMLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHdlIGNvbm5lY3QgdG8gdGhpcwotCSAqIERMTCBzbyB0aGF0IGl0IGdldHMgbWFwcGVkIGludG8gb3VyIGFkZHJlc3Mgc3BhY2UgKHRoYXQgaXMKLQkgKiB3aGVyZSB0aGUgc2hhcmVkIE51Y2xldXMgcGFja2V0IGlzIGxvY2F0ZWQpLiBTaW1wbHkgZG9pbmcgYQotCSAqIERvc0xvYWRNb2R1bGUgb24gaXQgaXMgZW5vdWdoIGZvciB0aGlzLgotCSAqLwotCUhNT0RVTEUgaE1vZFNERFBNSTsKLQljaGFyICAgIGJ1Zls4MF07Ci0JRG9zTG9hZE1vZHVsZSgoUFNaKWJ1ZixzaXplb2YoYnVmKSwoUFNaKSJTRERQTUkuRExMIiwmaE1vZFNERFBNSSk7Ci0JfQotICAgIHJldHVybiAoR0Ffc2hhcmVkSW5mbyopcmVzdWx0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHApCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQotCWhhdmVSRFRTQyA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlCi0JRG9zVG1yUXVlcnlUaW1lKChRV09SRCopdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhcW54LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFxbnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1MzFiZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFxbnguYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUU5YCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIFFOWCBvcGVyYXRpbmcgc3lzdGVtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpYm9vbCAgICAgICAgaGF2ZVJEVFNDOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1HQV9zaGFyZWRJbmZvICogTkFQSSBHQV9nZXRTaGFyZWRJbmZvKAotICAgIGludCBkZXZpY2UpCi17Ci0gICAgKHZvaWQpZGV2aWNlOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHApCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQotCWhhdmVSRFRTQyA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlIHsKLQlzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0KLQljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHMpOwotCXZhbHVlLT5sb3cgPSAodHMudHZfbnNlYyAvIDEwMDAgKyB0cy50dl9zZWMgKiAxMDAwMDAwKTsKLQl2YWx1ZS0+aGlnaCA9IDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhcnR0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFydHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1YTY3YS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFydHQuYworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUlRUYXJnZXQtMzIKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgUlRUYXJnZXQtMzIgb3BlcmF0aW5nIHN5c3RlbSBlbnZpcm9ubWVudHMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUkRUU0M7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdBX3NoYXJlZEluZm8gKiBOQVBJIEdBX2dldFNoYXJlZEluZm8oCi0gICAgaW50IGRldmljZSkKLXsKLSAgICAodm9pZClkZXZpY2U7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCkKLXsKLSAgICAodm9pZClnYUV4cDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApIHsKLQloYXZlUkRUU0MgPSB0cnVlOwotCXJldHVybiB0cnVlOwotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXNteC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2Fhc214LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MzA2MGYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2Fhc214LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIHNteDMyCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIHNteDMyIHBsYXRmb3JtIC0tIG5vIHZ4RCBzdXBwb3J0LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1HQV9zaGFyZWRJbmZvICogTkFQSSBHQV9nZXRTaGFyZWRJbmZvKAotICAgIGludCBkZXZpY2UpCi17Ci0gICAgKHZvaWQpZGV2aWNlOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHApCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQotCXJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIF9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXZ4ZC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhdnhkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMWIwMmIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhdnhkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFdpbjMyIFZ4RAotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBXaW4zMiBWeEQncy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUkRUU0M7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBpbnRlcm5hbCBzaGFyZWQgaW5mbyBzdHJ1Y3R1cmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotR0Ffc2hhcmVkSW5mbyAqIE5BUEkgR0FfZ2V0U2hhcmVkSW5mbygKLSAgICBpbnQgZGV2aWNlKQotewotICAgIHN0YXRpYyBHQV9zaGFyZWRJbmZvIHNoYXJlZCA9IHswLC0xfTsKLSAgICByZXR1cm4gJnNoYXJlZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAotICAgIEdBX2V4cG9ydHMgKmdhRXhwKQotewotICAgICh2b2lkKWdhRXhwOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkgewotCWhhdmVSRFRTQyA9IHRydWU7Ci0JfQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgaWYgKGhhdmVSRFRTQykKLQlfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7Ci0gICAgZWxzZQotCVZURF9HZXRfUmVhbF9UaW1lKCZ2YWx1ZS0+aGlnaCwmdmFsdWUtPmxvdyk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWF3aW4zMi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2Fhd2luMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxZGY0YS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWF3aW4zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgV2luMzIKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgV2luMzIgb3BlcmF0aW5nIHN5c3RlbSBlbnZpcm9ubWVudHMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1faGVscC5oIgotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNkZWZpbmUgU1RSSUNUCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZiBHQV9NQVhfREVWSUNFUyA+IDQKLSNlcnJvciBHQV9NQVhfREVWSUNFUyBoYXMgY2hhbmdlZCEKLSNlbmRpZgotCi1zdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUkRUU0M7Ci1zdGF0aWMgR0FfbGFyZ2VJbnRlZ2VyICBjb3VudEZyZXE7Ci1zdGF0aWMgR0FfbG9hZERyaXZlcl90ICBPUkdfR0FfbG9hZERyaXZlcjsKLWV4dGVybiBIQU5ETEUgICAgICAgICAgIF9QTV9oRGV2aWNlOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1HZXQgdGhlIGN1cnJlbnQgZ3JhcGhpY3MgZHJpdmVyIGltcG9ydHMgZnJvbSB0aGUgVnhECi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjb21tb24gZ3JhcGhpY3MgZHJpdmVyIGxvYWRlZCBpbiB0aGUKLWhlbHBlciBWeEQuIFRoZSBtZW1vcnkgZm9yIHRoZSBWeEQgaXMgc2hhcmVkIGJldHdlZW4gYWxsIHByb2Nlc3NlcyB2aWEKLXRoZSBWeEQsIHNvIHRoYXQgdGhlIFZ4RCwgMTYtYml0IGNvZGUgYW5kIDMyLWJpdCBjb2RlIGFsbCBzZWUgdGhlIHNhbWUKLXN0YXRlIHdoZW4gYWNjZXNzaW5nIHRoZSBncmFwaGljcyBiaW5hcnkgcG9ydGFibGUgZHJpdmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdBX3NoYXJlZEluZm8gKiBOQVBJIEdBX2dldFNoYXJlZEluZm8oCi0gICAgaW50IGRldmljZSkKLXsKLSAgICBEV09SRCAgIGluQnVmWzFdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBvdXRCdWZbMl07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIFBNX2luaXQoKTsKLSAgICBpbkJ1ZlswXSA9IGRldmljZTsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0VUU0hBUkVESU5GTzMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkgewotCXJldHVybiAoR0Ffc2hhcmVkSW5mbyopb3V0QnVmWzBdOwotCX0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAotICAgIEdBX2V4cG9ydHMgKmdhRXhwKQotewotICAgICh2b2lkKWdhRXhwOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBzb2Z0d2FyZSBzdGVyZW8gbW9kdWxlIGJ5IGVpdGhlciBjYWxsaW5nCi10aGUgTnVjbGV1cyBsaWJyYXJpZXMgZGlyZWN0bHksIG9yIGNhbGxpbmcgaW50byB0aGUgVnhEIGlmIHdlIGFyZSBydW5uaW5nCi1vbiB0aGUgc2hhcmVkIE51Y2xldXMgbGlicmFyaWVzIGxvYWRlZCBieSB0aGUgV2luZG93cyBWeEQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIE5BUEkgX0dBX3NvZnRTdGVyZW9Jbml0KAotICAgIEdBX2RldkN0eCAqZGMpCi17Ci0gICAgaWYgKF9QTV9oRGV2aWNlKSB7Ci0JRFdPUkQgICBpbkJ1ZlsxXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotCURXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLQlEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLQlpbkJ1ZlswXSA9ICh1bG9uZylkYzsKLQlpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0FTVEVSRU9JTklUMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCQlvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKSB7Ci0JICAgIHJldHVybiBvdXRCdWZbMF07Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gdHVybnMgb24gc29mdHdhcmUgc3RlcmVvIG1vZGUsIGVpdGhlciBkaXJlY3RseSBvciB2aWEgdGhlIFZ4RC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBOQVBJIF9HQV9zb2Z0U3RlcmVvT24odm9pZCkKLXsKLSAgICBpZiAoX1BNX2hEZXZpY2UpIHsKLQlEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HQVNURVJFT09OMzIsIE5VTEwsIDAsCi0JICAgIE5VTEwsIDAsIE5VTEwsIE5VTEwpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHNjaGVkdWxlcyBhIHNvZnR3YXJlIHN0ZXJlbyBtb2RlIHBhZ2UgZmxpcCwgZWl0aGVyIGRpcmVjdGx5Ci1vciB2aWEgdGhlIFZ4RC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBOQVBJIF9HQV9zb2Z0U3RlcmVvU2NoZWR1bGVGbGlwKAotICAgIE5fdWludDMyIGxlZnRBZGRyLAotICAgIE5fdWludDMyIHJpZ2h0QWRkcikKLXsKLSAgICBpZiAoX1BNX2hEZXZpY2UpIHsKLQlEV09SRCAgIGluQnVmWzJdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0JRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0JaW5CdWZbMF0gPSAodWxvbmcpbGVmdEFkZHI7Ci0JaW5CdWZbMV0gPSAodWxvbmcpcmlnaHRBZGRyOwotCURldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dBU1RFUkVPRkxJUDMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkgICAgTlVMTCwgMCwgJmNvdW50LCBOVUxMKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiB0dXJucyBvZmYgc29mdHdhcmUgc3RlcmVvIG1vZGUsIGVpdGhlciBkaXJlY3RseSBvciB2aWEgdGhlIFZ4RC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgTl9pbnQzMiBOQVBJIF9HQV9zb2Z0U3RlcmVvR2V0RmxpcFN0YXR1cyh2b2lkKQotewotICAgIGlmIChfUE1faERldmljZSkgewotCURXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLQlEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLQlpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0FTVEVSRU9GTElQU1RBVFVTMzIsIE5VTEwsIDAsCi0JCW91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpIHsKLQkgICAgcmV0dXJuIG91dEJ1ZlswXTsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHR1cm5zIG9mZiBzb2Z0d2FyZSBzdGVyZW8gbW9kZSwgZWl0aGVyIGRpcmVjdGx5IG9yIHZpYSB0aGUgVnhELgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIE5BUEkgX0dBX3NvZnRTdGVyZW9XYWl0VGlsbEZsaXBwZWQodm9pZCkKLXsKLSAgICB3aGlsZSAoIV9HQV9zb2Z0U3RlcmVvR2V0RmxpcFN0YXR1cygpKQotCTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHR1cm5zIG9mZiBzb2Z0d2FyZSBzdGVyZW8gbW9kZSwgZWl0aGVyIGRpcmVjdGx5IG9yIHZpYSB0aGUgVnhELgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIE5BUEkgX0dBX3NvZnRTdGVyZW9PZmYodm9pZCkKLXsKLSAgICBpZiAoX1BNX2hEZXZpY2UpIHsKLQlEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HQVNURVJFT09GRjMyLCBOVUxMLCAwLAotCSAgICBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBkaXNhYmxlIHRoZSBzb2Z0d2FyZSBzdGVyZW8gaGFuZGxlciwgZWl0aGVyIGRpcmVjdGx5IG9yIHZpYQotdGhlIFZ4RC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBOQVBJIF9HQV9zb2Z0U3RlcmVvRXhpdCh2b2lkKQotewotICAgIGlmIChfUE1faERldmljZSkgewotCURldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dBU1RFUkVPRVhJVDMyLCBOVUxMLCAwLAotCSAgICBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV2UgaG9vayB0aGlzIGZ1bmN0aW9uIGluIGhlcmUgc28gdGhhdCB3ZSBjYW4gYXZvaWQgdGhlIG1lbW9yeSBkZXRlY3QgYW5kCi1vdGhlciBkZXN0cnVjdGl2ZSBzZXF1ZW5jZXMgaW4gdGhlIGRyaXZlcnMgaWYgd2UgYXJlIGxvYWRpbmcgdGhlIGRyaXZlcgotZnJvbSBhIFdpbjMyIGFwcGxpY2F0aW9uIChvdXIgZGlzcGxheSBkcml2ZXJzIGluIGNvbnRyYXN0IGxvYWQgdGhlbSBpbnNpZGUKLXRoZSBWeEQgZGlyZWN0bHksIGJ1dCB0aGUgY29udHJvbCBwYW5lbCBhcHBsZXRzIHVzZSB0aGlzIGZ1bmN0aW9uKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgR0FfZGV2Q3R4ICogTkFQSSBfR0FfbG9hZERyaXZlcigKLSAgICBOX2ludDMyIGRldmljZUluZGV4LAotICAgIE5faW50MzIgc2hhcmVkKQotewotICAgIEdBX2RldkN0eCAgICpkYzsKLSAgICBEV09SRCAgICAgICBpbkJ1ZlsxXTsKLSAgICBEV09SRCAgICAgICBvdXRCdWZbMV07Ci0gICAgTl9pbnQzMiAgICAgdG90YWxNZW1vcnkgPSAwLG9sZElPUEw7Ci0KLSAgICBpZiAoZGV2aWNlSW5kZXggPj0gR0FfTUFYX0RFVklDRVMpCi0JUE1fZmF0YWxFcnJvcigiRGV2aWNlSW5kZXggdG9vIGxhcmdlIGluIEdBX2xvYWREcml2ZXIhIik7Ci0gICAgUE1faW5pdCgpOwotICAgIGluQnVmWzBdID0gZGV2aWNlSW5kZXg7Ci0gICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dFVE1FTVNJWkUzMiwKLQkgICAgaW5CdWYsIHNpemVvZihpbkJ1ZiksIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksIE5VTEwsIE5VTEwpKQotCXRvdGFsTWVtb3J5ID0gb3V0QnVmWzBdOwotICAgIGlmICh0b3RhbE1lbW9yeSA9PSAwKQotCXRvdGFsTWVtb3J5ID0gODE5MjsKLSAgICBfR0FfZXhwb3J0cy5HQV9mb3JjZU1lbVNpemUodG90YWxNZW1vcnksc2hhcmVkKTsKLSAgICBvbGRJT1BMID0gUE1fc2V0SU9QTCgzKTsKLSAgICBkYyA9IE9SR19HQV9sb2FkRHJpdmVyKGRldmljZUluZGV4LHNoYXJlZCk7Ci0gICAgUE1fc2V0SU9QTChvbGRJT1BMKTsKLSAgICByZXR1cm4gZGM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApIHsKLQloYXZlUkRUU0MgPSB0cnVlOwotCXJldHVybiB0cnVlOwotCX0KLSAgICBlbHNlIGlmIChRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KChMQVJHRV9JTlRFR0VSKikmY291bnRGcmVxKSkgewotCWhhdmVSRFRTQyA9IGZhbHNlOwotCXJldHVybiB0cnVlOwotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlCi0JUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIqKXZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hZ3BsaWIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hZ3BsaWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc2ZWVkYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWdwbGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkgMzItYml0IHByb3RlY3RlZCBtb2RlIGVudmlyb25tZW50Ci0qCi0qIERlc2NyaXB0aW9uOiAgQyBtb2R1bGUgZm9yIHRoZSBHcmFwaGljcyBBY2NlbGVyYXRvciBEcml2ZXIgQVBJLiBVc2VzCi0qICAgICAgICAgICAgICAgdGhlIFNjaVRlY2ggUE0gbGlicmFyeSBmb3IgaW50ZXJmYWNpbmcgd2l0aCBET1MKLSogICAgICAgICAgICAgICBleHRlbmRlciBzcGVjaWZpYyBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotI2luY2x1ZGUgIm51Y2xldXMvYWdwLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgREVCVUdfQUdQX0RSSVZFUgotc3RhdGljIEFHUF9leHBvcnRzICBfQUdQX2V4cG9ydHM7Ci1zdGF0aWMgaW50ICAgICAgICAgIGxvYWRlZCA9IGZhbHNlOwotc3RhdGljIFBFX01PRFVMRSAgICAqaE1vZEJQRCA9IE5VTEw7Ci0KLXN0YXRpYyBOX2ltcG9ydHMgX05faW1wb3J0cyA9IHsKLSAgICBzaXplb2YoTl9pbXBvcnRzKSwKLSAgICBfT1NfZGVsYXksCi0gICAgfTsKLQotc3RhdGljIEFHUF9pbXBvcnRzIF9BR1BfaW1wb3J0cyA9IHsKLSAgICBzaXplb2YoQUdQX2ltcG9ydHMpLAotICAgIH07Ci0jZW5kaWYKLQotI2luY2x1ZGUgInBtaW1wLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgRExMX05BTUUgICAgICAgICJhZ3AuYnBkIgotCi0jaWZuZGVmIERFQlVHX0FHUF9EUklWRVIKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmF0YWwgZXJyb3IgaGFuZGxlciBmb3Igbm9uLWV4cG9ydGVkIEdBX2V4cG9ydHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0FHUF9mYXRhbEVycm9ySGFuZGxlcih2b2lkKQotewotICAgIFBNX2ZhdGFsRXJyb3IoIlVuc3VwcG9ydGVkIEFHUCBleHBvcnQgZnVuY3Rpb24gY2FsbGVkISBQbGVhc2UgdXBncmFkZSB5b3VyIGNvcHkgb2YgQUdQIVxuIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2hhcmVkICAtIFRydWUgdG8gbG9hZCB0aGUgZHJpdmVyIGludG8gc2hhcmVkIG1lbW9yeS4KLQotUkVNQVJLUzoKLUxvYWRzIHRoZSBOdWNsZXVzIGJpbmFyeSBwb3J0YWJsZSBETEwgaW50byBtZW1vcnkgYW5kIGluaXRpbGlzZXMgaXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIExvYWREcml2ZXIodm9pZCkKLXsKLSAgICBBR1BfaW5pdExpYnJhcnlfdCAgIEFHUF9pbml0TGlicmFyeTsKLSAgICBBR1BfZXhwb3J0cyAgICAgICAgICphZ3BFeHA7Ci0gICAgY2hhciAgICAgICAgICAgICAgICBmaWxlbmFtZVtQTV9NQVhfUEFUSF07Ci0gICAgY2hhciAgICAgICAgICAgICAgICBicGRwYXRoW1BNX01BWF9QQVRIXTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGksbWF4OwotICAgIHVsb25nICAgICAgICAgICAgICAgKnA7Ci0KLSAgICAvKiBDaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgbG9hZGVkIHRoZSBkcml2ZXIgKi8KLSAgICBpZiAobG9hZGVkKQotCXJldHVybiB0cnVlOwotICAgIFBNX2luaXQoKTsKLQotICAgIC8qIE9wZW4gdGhlIEJQRCBmaWxlICovCi0gICAgaWYgKCFQTV9maW5kQlBEKERMTF9OQU1FLGJwZHBhdGgpKQotCXJldHVybiBmYWxzZTsKLSAgICBzdHJjcHkoZmlsZW5hbWUsYnBkcGF0aCk7Ci0gICAgc3RyY2F0KGZpbGVuYW1lLERMTF9OQU1FKTsKLSAgICBpZiAoKGhNb2RCUEQgPSBQRV9sb2FkTGlicmFyeShmaWxlbmFtZSxmYWxzZSkpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmICgoQUdQX2luaXRMaWJyYXJ5ID0gKEFHUF9pbml0TGlicmFyeV90KVBFX2dldFByb2NBZGRyZXNzKGhNb2RCUEQsIl9BR1BfaW5pdExpYnJhcnkiKSkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgYnBkcGF0aFtzdHJsZW4oYnBkcGF0aCktMV0gPSAwOwotICAgIGlmIChzdHJjbXAoYnBkcGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKSA9PSAwKQotCXN0cmNweShicGRwYXRoLFBNX2dldE51Y2xldXNDb25maWdQYXRoKCkpOwotICAgIGVsc2UgewotCVBNX2JhY2tzbGFzaChicGRwYXRoKTsKLQlzdHJjYXQoYnBkcGF0aCwiY29uZmlnIik7Ci0JfQotICAgIGlmICgoYWdwRXhwID0gQUdQX2luaXRMaWJyYXJ5KGJwZHBhdGgsZmlsZW5hbWUsR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKCksJl9OX2ltcG9ydHMsJl9BR1BfaW1wb3J0cykpID09IE5VTEwpCi0JUE1fZmF0YWxFcnJvcigiQUdQX2luaXRMaWJyYXJ5IGZhaWxlZCFcbiIpOwotICAgIF9BR1BfZXhwb3J0cy5kd1NpemUgPSBzaXplb2YoX0FHUF9leHBvcnRzKTsKLSAgICBtYXggPSBzaXplb2YoX0FHUF9leHBvcnRzKS9zaXplb2YoQUdQX2luaXRMaWJyYXJ5X3QpOwotICAgIGZvciAoaSA9IDAscCA9ICh1bG9uZyopJl9BR1BfZXhwb3J0czsgaSA8IG1heDsgaSsrKQotCSpwKysgPSAodWxvbmcpX0FHUF9mYXRhbEVycm9ySGFuZGxlcjsKLSAgICBtZW1jcHkoJl9BR1BfZXhwb3J0cyxhZ3BFeHAsTUlOKHNpemVvZihfQUdQX2V4cG9ydHMpLGFncEV4cC0+ZHdTaXplKSk7Ci0gICAgbG9hZGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIGZvbGxvd2luZyBhcmUgc3R1YiBlbnRyeSBwb2ludHMgdGhhdCB0aGUgYXBwbGljYXRpb24gY2FsbHMgdG8KLSAqIGluaXRpYWxpc2UgdGhlIE51Y2xldXMgbG9hZGVyIGxpYnJhcnksIGFuZCB3ZSB1c2UgdGhpcyB0byBsb2FkIG91cgotICogZHJpdmVyIERMTCBmcm9tIGRpc2sgYW5kIGluaXRpYWxpc2UgdGhlIGxpYnJhcnkgdXNpbmcgaXQuCi0gKi8KLQotLyoge3NlY3JldH0gKi8KLWludCBOQVBJIEFHUF9zdGF0dXModm9pZCkKLXsKLSAgICBpZiAoIWxvYWRlZCkKLQlyZXR1cm4gbkRyaXZlck5vdEZvdW5kOwotICAgIHJldHVybiBfQUdQX2V4cG9ydHMuQUdQX3N0YXR1cygpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotY29uc3QgY2hhciAqIE5BUEkgQUdQX2Vycm9yTXNnKAotICAgIE5faW50MzIgc3RhdHVzKQotewotICAgIGlmICghbG9hZGVkKQotCXJldHVybiAiVW5hYmxlIHRvIGxvYWQgTnVjbGV1cyBkZXZpY2UgZHJpdmVyISI7Ci0gICAgcmV0dXJuIF9BR1BfZXhwb3J0cy5BR1BfZXJyb3JNc2coc3RhdHVzKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLUFHUF9kZXZDdHggKiBOQVBJIEFHUF9sb2FkRHJpdmVyKE5faW50MzIgZGV2aWNlSW5kZXgpCi17Ci0gICAgaWYgKCFMb2FkRHJpdmVyKCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIF9BR1BfZXhwb3J0cy5BR1BfbG9hZERyaXZlcihkZXZpY2VJbmRleCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi12b2lkIE5BUEkgQUdQX3VubG9hZERyaXZlcigKLSAgICBBR1BfZGV2Q3R4ICpkYykKLXsKLSAgICBpZiAobG9hZGVkKQotCV9BR1BfZXhwb3J0cy5BR1BfdW5sb2FkRHJpdmVyKGRjKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLXZvaWQgTkFQSSBBR1BfZ2V0R2xvYmFsT3B0aW9ucygKLSAgICBBR1BfZ2xvYmFsT3B0aW9ucyAqb3B0aW9ucykKLXsKLSAgICBpZiAoTG9hZERyaXZlcigpKQotCV9BR1BfZXhwb3J0cy5BR1BfZ2V0R2xvYmFsT3B0aW9ucyhvcHRpb25zKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLXZvaWQgTkFQSSBBR1Bfc2V0R2xvYmFsT3B0aW9ucygKLSAgICBBR1BfZ2xvYmFsT3B0aW9ucyAqb3B0aW9ucykKLXsKLSAgICBpZiAoTG9hZERyaXZlcigpKQotCV9BR1BfZXhwb3J0cy5BR1Bfc2V0R2xvYmFsT3B0aW9ucyhvcHRpb25zKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLXZvaWQgTkFQSSBBR1Bfc2F2ZUdsb2JhbE9wdGlvbnMoCi0gICAgQUdQX2dsb2JhbE9wdGlvbnMgKm9wdGlvbnMpCi17Ci0gICAgaWYgKGxvYWRlZCkKLQlfQUdQX2V4cG9ydHMuQUdQX3NhdmVHbG9iYWxPcHRpb25zKG9wdGlvbnMpOwotfQotI2VuZGlmCi0KLS8qIHtzZWNyZXR9ICovCi12b2lkIE5BUEkgX09TX2RlbGF5ODI1MyhOX3VpbnQzMiBtaWNyb1NlY29uZHMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZGVsYXlzIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWNyb3NlY29uZHMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgX09TX2RlbGF5KAotICAgIE5fdWludDMyIG1pY3JvU2Vjb25kcykKLXsKLSAgICBzdGF0aWMgaWJvb2wgICAgaW5pdGVkID0gZmFsc2U7Ci0gICAgc3RhdGljIGlib29sICAgIGhhdmVSRFRTQzsKLSAgICBMWlRpbWVyT2JqZWN0ICAgdG07Ci0KLSAgICBpZiAoIWluaXRlZCkgewotI2lmbmRlZiBfX1dJTjMyX1ZYRF9fCi0JLyogVGhpcyBoYXMgYmVlbiBjYXVzaW5nIHByb2JsZW1zIGluIFZ4RCdzIGZvciBzb21lIHJlYXNvbiwgc28gZm9yIG5vdyAqLwotCS8qIHdlIGF2b2lkIHVzaW5nIGl0LiAqLwotCWlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKSB7Ci0JICAgIFpUaW1lckluaXQoKTsKLQkgICAgaGF2ZVJEVFNDID0gdHJ1ZTsKLQkgICAgfQotCWVsc2UKLSNlbmRpZgotCSAgICBoYXZlUkRUU0MgPSBmYWxzZTsKLQlpbml0ZWQgPSB0cnVlOwotCX0KLSAgICBpZiAoaGF2ZVJEVFNDKSB7Ci0JTFpUaW1lck9uRXh0KCZ0bSk7Ci0Jd2hpbGUgKExaVGltZXJMYXBFeHQoJnRtKSA8IG1pY3JvU2Vjb25kcykKLQkgICAgOwotCUxaVGltZXJPbkV4dCgmdG0pOwotCX0KLSAgICBlbHNlCi0JX09TX2RlbGF5ODI1MyhtaWNyb1NlY29uZHMpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2NlbnRlci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2NlbnRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGUxN2MyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9jZW50ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgIERpc3BsYXkgRG9jdG9yIFdpbmRvd3MgSW50ZXJmYWNlIENvZGUKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgaXMgYSBwcm9wcmlldGFyeSB0cmFkZSBzZWNyZXQgb2YgICAgIHwKLSogIHxTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgQ2hpY28sIENBIDk1OTI4IHwKLSogIHxVU0EgKHd3dy5zY2l0ZWNoc29mdC5jb20pLiAgQU5ZIFVOQVVUSE9SSVpFRCBQT1NTRVNTSU9OLCBVU0UsICAgICAgIHwKLSogIHxWSUVXSU5HLCBDT1BZSU5HLCBNT0RJRklDQVRJT04gT1IgRElTU0VNSU5BVElPTiBPRiBUSElTIENPREUgSVMgICAgIHwKLSogIHxTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBVy4gIFVubGVzcyB5b3UgaGF2ZSBjdXJyZW50LCBleHByZXNzICAgICAgIHwKLSogIHx3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBTY2lUZWNoIHRvIHBvc3Nlc3Mgb3IgdXNlIHRoaXMgY29kZSwgeW91IHwKLSogIHxtYXkgYmUgc3ViamVjdCB0byBjaXZpbCBhbmQvb3IgY3JpbWluYWwgcGVuYWx0aWVzLiAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxJZiB5b3UgcmVjZWl2ZWQgdGhpcyBjb2RlIGluIGVycm9yIG9yIHlvdSB3b3VsZCBsaWtlIHRvIHJlcG9ydCAgICAgIHwKLSogIHxpbXByb3BlciB1c2UsIHBsZWFzZSBpbW1lZGlhdGVseSBjb250YWN0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4gYXQgIHwKLSogIHw1MzAtODk0LTg0MDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBDKysgMy4wCi0qIEVudmlyb25tZW50OiAgV2luMTYKLSoKLSogRGVzY3JpcHRpb246ICBEaWFsb2cgZHJpdmVuIGNvbmZpZ3VyYXRpb24gcHJvZ3JhbSBmb3IgVW5pVkJFIGFuZAotKiAgICAgICAgICAgICAgIFdpbkRpcmVjdCBQcm9mZXNzaW9uYWwgcHJvZHVjdHMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiY2VudGVyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgX0VYUE9SVCBDZW50ZXJXaW5kb3coSFdORCBoV25kQ2VudGVyLCBIV05EIHBhcmVudCwgQk9PTCByZXBhaW50KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBDZW50ZXJXaW5kb3cKLSogUGFyYW1ldGVyczogICBoV25kQ2VudGVyICAtIFdpbmRvdyB0byBjZW50ZXIKLSogICAgICAgICAgICAgICBwYXJlbnQgICAgICAtIEhhbmRsZSBmb3IgcGFyZW50IHdpbmRvdwotKiAgICAgICAgICAgICAgIHJlcGFpbnQgICAgIC0gdHJ1ZSBpZiB3aW5kb3cgc2hvdWxkIGJlIHJlLXBhaW50ZWQKLSoKLSogRGVzY3JpcHRpb246ICBDZW50ZXJzIHRoZSBzcGVjaWZpZWQgd2luZG93IHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZQotKiAgICAgICAgICAgICAgIHNwZWNpZmllZCBwYXJlbnQgd2luZG93LiBJZiB0aGUgcGFyZW50IHdpbmRvdyBpcyBOVUxMLCB0aGVuCi0qICAgICAgICAgICAgICAgd2UgY2VudGVyIGl0IHVzaW5nIHRoZSBEZXNrdG9wIHdpbmRvdy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgSFdORCAgICBoV25kUGFyZW50ID0gKHBhcmVudCA/IHBhcmVudCA6IEdldERlc2t0b3BXaW5kb3coKSk7Ci0gICAgUkVDVCAgICBSZWN0UGFyZW50OwotICAgIFJFQ1QgICAgUmVjdENlbnRlcjsKLSAgICBpbnQgICAgIENlbnRlclgsQ2VudGVyWSxIZWlnaHQsV2lkdGg7Ci0KLSAgICBHZXRXaW5kb3dSZWN0KGhXbmRQYXJlbnQsICZSZWN0UGFyZW50KTsKLSAgICBHZXRXaW5kb3dSZWN0KGhXbmRDZW50ZXIsICZSZWN0Q2VudGVyKTsKLQotICAgIFdpZHRoID0gKFJlY3RDZW50ZXIucmlnaHQgLSBSZWN0Q2VudGVyLmxlZnQpOwotICAgIEhlaWdodCA9IChSZWN0Q2VudGVyLmJvdHRvbSAtIFJlY3RDZW50ZXIudG9wKTsKLSAgICBDZW50ZXJYID0gKChSZWN0UGFyZW50LnJpZ2h0IC0gUmVjdFBhcmVudC5sZWZ0KSAtIFdpZHRoKSAvIDI7Ci0gICAgQ2VudGVyWSA9ICgoUmVjdFBhcmVudC5ib3R0b20gLSBSZWN0UGFyZW50LnRvcCkgLSBIZWlnaHQpIC8gMjsKLQotICAgIGlmICgoQ2VudGVyWCA8IDApIHx8IChDZW50ZXJZIDwgMCkpIHsKLQkvKiBUaGUgQ2VudGVyIFdpbmRvdyBpcyBzbWFsbGVyIHRoYW4gdGhlIHBhcmVudCB3aW5kb3cuICovCi0JaWYgKGhXbmRQYXJlbnQgIT0gR2V0RGVza3RvcFdpbmRvdygpKSB7Ci0JICAgIC8qIElmIHRoZSBwYXJlbnQgd2luZG93IGlzIG5vdCB0aGUgZGVza3RvcCB1c2UgdGhlIGRlc2t0b3Agc2l6ZS4gKi8KLQkgICAgQ2VudGVyWCA9IChHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKSAtIFdpZHRoKSAvIDI7Ci0JICAgIENlbnRlclkgPSAoR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTikgLSBIZWlnaHQpIC8gMjsKLQkgICAgfQotCUNlbnRlclggPSAoQ2VudGVyWCA8IDApID8gMDogQ2VudGVyWDsKLQlDZW50ZXJZID0gKENlbnRlclkgPCAwKSA/IDA6IENlbnRlclk7Ci0JfQotICAgIGVsc2UgewotCUNlbnRlclggKz0gUmVjdFBhcmVudC5sZWZ0OwotCUNlbnRlclkgKz0gUmVjdFBhcmVudC50b3A7Ci0JfQotCi0gICAgLyogQ29weSB0aGUgdmFsdWVzIGludG8gUmVjdENlbnRlciAqLwotICAgIFJlY3RDZW50ZXIubGVmdCA9IENlbnRlclg7Ci0gICAgUmVjdENlbnRlci5yaWdodCA9IENlbnRlclggKyBXaWR0aDsKLSAgICBSZWN0Q2VudGVyLnRvcCA9IENlbnRlclk7Ci0gICAgUmVjdENlbnRlci5ib3R0b20gPSBDZW50ZXJZICsgSGVpZ2h0OwotCi0gICAgLyogTW92ZSB0aGUgd2luZG93IHRvIHRoZSBuZXcgbG9jYXRpb24gKi8KLSAgICBNb3ZlV2luZG93KGhXbmRDZW50ZXIsIFJlY3RDZW50ZXIubGVmdCwgUmVjdENlbnRlci50b3AsCi0JICAgIChSZWN0Q2VudGVyLnJpZ2h0IC0gUmVjdENlbnRlci5sZWZ0KSwKLQkgICAgKFJlY3RDZW50ZXIuYm90dG9tIC0gUmVjdENlbnRlci50b3ApLCByZXBhaW50KTsKLX0KLQotdm9pZCBfRVhQT1JUIENlbnRlckxvZ28oSFdORCBoV25kTG9nbywgSFdORCBoV25kUGFyZW50LCBpbnQgQ2VudGVyWSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgQ2VudGVyTG9nbwotKiBQYXJhbWV0ZXJzOiAgIGhXbmRMb2dvICAgIC0gV2luZG93IHRvIGNlbnRlcgotKiAgICAgICAgICAgICAgIGhXbmRQYXJlbnQgIC0gSGFuZGxlIGZvciBwYXJlbnQgd2luZG93Ci0qICAgICAgICAgICAgICAgQ2VudGVyWSAgICAgLSBUb3AgY29vcmRpbmF0ZSBmb3IgbG9nbwotKgotKiBEZXNjcmlwdGlvbjogIENlbnRlcnMgdGhlIHNwZWNpZmllZCB3aW5kb3cgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlCi0qICAgICAgICAgICAgICAgc3BlY2lmaWVkIHBhcmVudCB3aW5kb3cgaW4gdGhlIGhvcml6b250YWwgZGlyZWN0aW9uIG9ubHkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJFQ1QgICAgUmVjdFBhcmVudDsKLSAgICBSRUNUICAgIFJlY3RDZW50ZXI7Ci0gICAgaW50ICAgICBDZW50ZXJYLEhlaWdodCxXaWR0aDsKLQotICAgIEdldFdpbmRvd1JlY3QoaFduZFBhcmVudCwgJlJlY3RQYXJlbnQpOwotICAgIEdldFdpbmRvd1JlY3QoaFduZExvZ28sICZSZWN0Q2VudGVyKTsKLSAgICBXaWR0aCA9IChSZWN0Q2VudGVyLnJpZ2h0IC0gUmVjdENlbnRlci5sZWZ0KTsKLSAgICBIZWlnaHQgPSAoUmVjdENlbnRlci5ib3R0b20gLSBSZWN0Q2VudGVyLnRvcCk7Ci0gICAgQ2VudGVyWCA9ICgoUmVjdFBhcmVudC5yaWdodCAtIFJlY3RQYXJlbnQubGVmdCkgLSBXaWR0aCkgLyAyOwotCi0gICAgLyogQ29weSB0aGUgdmFsdWVzIGludG8gUmVjdENlbnRlciAqLwotICAgIFJlY3RDZW50ZXIubGVmdCA9IENlbnRlclg7Ci0gICAgUmVjdENlbnRlci5yaWdodCA9IENlbnRlclggKyBXaWR0aDsKLSAgICBSZWN0Q2VudGVyLnRvcCA9IENlbnRlclk7Ci0gICAgUmVjdENlbnRlci5ib3R0b20gPSBDZW50ZXJZICsgSGVpZ2h0OwotCi0gICAgLyogTW92ZSB0aGUgd2luZG93IHRvIHRoZSBuZXcgbG9jYXRpb24gKi8KLSAgICBNb3ZlV2luZG93KGhXbmRMb2dvLCBSZWN0Q2VudGVyLmxlZnQsIFJlY3RDZW50ZXIudG9wLAotCSAgICAoUmVjdENlbnRlci5yaWdodCAtIFJlY3RDZW50ZXIubGVmdCksCi0JICAgIChSZWN0Q2VudGVyLmJvdHRvbSAtIFJlY3RDZW50ZXIudG9wKSwgZmFsc2UpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2NtZGxpbmUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9jbWRsaW5lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMWU1ZTEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2NtZGxpbmUuYworKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUaGlzIG1vZHVsZSBjb250YWlucyBjb2RlIHRvIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUsCi0qICAgICAgICAgICAgICAgZXh0cmFjdGluZyBvcHRpb25zIGFuZCBwYXJhbWV0ZXJzIGluIHN0YW5kYXJkIFN5c3RlbSBWCi0qICAgICAgICAgICAgICAgc3R5bGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImNtZGxpbmUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaW50ICAgICBuZXh0YXJndiAgICA9ICAgMTsgICAgICAgICAgLyogSW5kZXggaW50byBhcmd2IGFycmF5ICAgICAgICAgICAgKi8KLWNoYXIgICAgKm5leHRjaGFyICAgPSAgIE5VTEw7ICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBjaGFyYWN0ZXIgICAgICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgSVNfU1dJVENIX0NIQVIoYykgICAgICAgKChjKSA9PSAnLScpCi0jZGVmaW5lIElTX05PVF9TV0lUQ0hfQ0hBUihjKSAgICgoYykgIT0gJy0nKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1QYXJzZSB0aGUgY29tbWFuZCBsaW5lIGZvciBzcGVjaWZpYyBvcHRpb25zCi0KLUhFQURFUjoKLWNtZGxpbmUuaAotCi1QQVJBTUVURVJTOgotYXJnYyAgICAgICAgLSBWYWx1ZSBwYXNzZWQgdG8gcHJvZ3JhbSB0aHJvdWdoIGFyZ2MgdmFyaWFibGUKLWFyZ3YgICAgICAgIC0gUG9pbnRlciB0byB0aGUgYXJndiBhcnJheSBwYXNzZWQgdG8gdGhlIHByb2dyYW0KLWZvcm1hdCAgICAgIC0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBleHBlY3RlZCBmb3JtYXQgb2YgdGhlIGNvbW1hbmQgbGluZQotYXJndW1lbnQgICAgLSBQb2ludGVyIHRvIG9wdGlvbmFsIGFyZ3VtZW50IG9uIGNvbW1hbmQgbGluZQotCi1SRVRVUk5TOgotQ2hhcmFjdGVyIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBuZXh0IG9wdGlvbiBwYXJzZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGJ5Ci1nZXRjbWRvcHQuIFJldHVybnMgQUxMRE9ORSAoLTEpIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgcGFyYW1ldGVycyB0byBiZSBwYXJzZWQKLW9uIHRoZSBjb21tYW5kIGxpbmUsIFBBUkFNRVRFUiAoLTIpIHdoZW4gdGhlIGFyZ3VtZW50IGJlaW5nIHBhcnNlZCBpcyBhCi1wYXJhbWV0ZXIgYW5kIG5vdCBhbiBvcHRpb24gc3dpdGNoIGFuZCBsYXN0bHkgSU5WQUxJRCAoLTMpIGlmIGFuIGVycm9yCi1vY2N1cmVkIHdoaWxlIHBhcnNpbmcgdGhlIGNvbW1hbmQgbGluZS4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIHN3aXRjaGVzIGluIFVOSVggU3lzdGVtIFYgc3R5bGUuCi1XaGVuIGdldGNtZG9wdCBpcyBjYWxsZWQsIGl0IHJldHVybnMgdGhlIGNoYXJhY3RlciBjb2RlIG9mIHRoZSBuZXh0IHZhbGlkCi1vcHRpb24gdGhhdCBpcyBwYXJzZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFzIHNwZWNpZmllZCBieSB0aGUgRm9ybWF0Ci1zdHJpbmcuIFRoZSBmb3JtYXQgc3RyaW5nIHNob3VsZCBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm06Ci0KLSAgICAiYWJjZDplOmY6IgotCi13aGVyZSBhLGIgYW5kIGMgcmVwcmVzZW50IHNpbmdsZSBzd2l0Y2ggc3R5bGUgb3B0aW9ucyBhbmQgdGhlIGNoYXJhY3RlcgotY29kZSByZXR1cm5lZCBieSBnZXRjbWRvcHQgaXMgdGhlIG9ubHkgdmFsdWUgcmV0dXJuZWQuIEFsc28gZCwgZSBhbmQgZgotcmVwcmVzZW50IG9wdGlvbnMgdGhhdCBleHBlY3QgYXJndW1lbnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZW0gb24gdGhlCi1jb21tYW5kIGxpbmUuIFRoZSBhcmd1bWVudCB0aGF0IGZvbGxvd3MgdGhlIG9wdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lIGlzCi1yZXR1cm5lZCB2aWEgYSByZWZlcmVuY2UgaW4gdGhlIHBvaW50ZXIgYXJndW1lbnQuIFRodXMgYSB2YWxpZCBjb21tYW5kIGxpbmUKLWZvciB0aGlzIGZvcm1hdCBzdHJpbmcgbWlnaHQgYmU6Ci0KLSAgICBteXByb2dyYW0gLWFkbGluZXMgLWIgLWYgZm9ybWF0IGluZmlsZSBvdXRmaWxlCi0KLXdoZXJlIGEgYW5kIGIgd2lsbCBiZSByZXR1cm5lZCBhcyBzaW5nbGUgY2hhcmFjdGVyIG9wdGlvbnMgd2l0aCBubyBhcmd1bWVudCwKLXdoaWxlIGQgaXMgcmV0dXJuZWQgd2l0aCB0aGUgYXJndW1lbnQgbGluZXMgYW5kIGYgaXMgcmV0dXJuZWQgd2l0aCB0aGUKLWFyZ3VtZW50IGZvcm1hdC4KLQotV2hlbiBnZXRjbWRvcHQgcmV0dXJucyB3aXRoIFBBUkFNRVRFUiAod2UgYXR0ZW1wdGVkIHRvIHBhcnNlIGEgcGFyYW10ZXIsIG5vdAotYW4gb3B0aW9uKSwgdGhlIGdsb2JhbCB2YXJpYWJsZSBOZXh0QXJndiB3aWxsIGhvbGQgYW4gaW5kZXggaW4gdGhlIGFyZ3YKLWFycmF5IHRvIHRoZSBhcmd1bWVudCBvbiB0aGUgY29tbWFuZCBsaW5lIEFGVEVSIHRoZSBvcHRpb25zLCBpZSBpbiB0aGUKLWFib3ZlIGV4YW1wbGUgdGhlIHN0cmluZyAnaW5maWxlJy4gSWYgdGhlIHBhcmFtZXRlciBpcyBzdWNjZXNzZnVsbHkgdXNlZCwKLU5leHRBcmd2IHNob3VsZCBiZSBpbmNyZW1lbnRlZCBhbmQgZ2V0Y21kb3B0IGNhbiBiZSBjYWxsZWQgYWdhaW4gdG8gcGFyc2UgYW55Ci1tb3JlIG9wdGlvbnMuIFRodXMgeW91IGNhbiBhbHNvIGhhdmUgb3B0aW9ucyBpbnRlcnNwZXJzZWQgdGhyb3VnaHQgdGhlCi1jb21tYW5kIGxpbmUuIGVnOgotCi0gICAgbXlwcm9ncmFtIC1hZGxpbmVzIGluZmlsZSAtYiBvdXRmaWxlIC1mIGZvcm1hdAotCi1jYW4gYmUgbWFkZSB0byBiZSBhIHZhbGlkIGZvcm0gb2YgdGhlIGFib3ZlIGNvbW1hbmQgbGluZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZ2V0Y21kb3B0KAotICAgIGludCBhcmdjLAotICAgIGNoYXIgKiphcmd2LAotICAgIGNoYXIgKmZvcm1hdCwKLSAgICBjaGFyICoqYXJndW1lbnQpCi17Ci0gICAgY2hhciAgICBjaDsKLSAgICBjaGFyICAgICpmb3JtYXRjaGFyOwotCi0gICAgaWYgKGFyZ2MgPiBuZXh0YXJndikgewotCWlmIChuZXh0Y2hhciA9PSBOVUxMKSB7Ci0JICAgIG5leHRjaGFyID0gYXJndltuZXh0YXJndl07ICAgICAgLyogSW5kZXggbmV4dCBhcmd1bWVudCAgICAgICovCi0JICAgIGlmIChuZXh0Y2hhciA9PSBOVUxMKSB7Ci0JCW5leHRhcmd2Kys7Ci0JCXJldHVybiBBTExET05FOyAgICAgICAgICAgICAvKiBObyBtb3JlIG9wdGlvbnMgICAgICAgICAgKi8KLQkJfQotCSAgICBpZiAoSVNfTk9UX1NXSVRDSF9DSEFSKCpuZXh0Y2hhcikpIHsKLQkJbmV4dGNoYXIgPSBOVUxMOwotCQlyZXR1cm4gUEFSQU1FVEVSOyAgICAgICAgICAgLyogV2UgaGF2ZSBhIHBhcmFtZXRlciAgICAgICovCi0JCX0KLQkgICAgbmV4dGNoYXIrKzsgICAgICAgICAgICAgICAgICAgICAvKiBNb3ZlIHBhc3Qgc3dpdGNoIG9wZXJhdG9yICovCi0JICAgIGlmIChJU19TV0lUQ0hfQ0hBUigqbmV4dGNoYXIpKSB7Ci0JCW5leHRjaGFyID0gTlVMTDsKLQkJcmV0dXJuIElOVkFMSUQ7ICAgICAgICAgICAgIC8qIElnbm9yZSByZXN0IG9mIGxpbmUgICAgICAqLwotCQl9Ci0JICAgIH0KLQlpZiAoKGNoID0gKihuZXh0Y2hhcisrKSkgPT0gMCkgewotCSAgICBuZXh0Y2hhciA9IE5VTEw7Ci0JICAgIHJldHVybiBJTlZBTElEOyAgICAgICAgICAgICAgICAgLyogTm8gb3B0aW9ucyBvbiBsaW5lICAgICAgICovCi0JICAgIH0KLQotCWlmIChjaCA9PSAnOicgfHwgIChmb3JtYXRjaGFyID0gc3RyY2hyKGZvcm1hdCwgY2gpKSA9PSBOVUxMKQotCSAgICByZXR1cm4gSU5WQUxJRDsKLQotCWlmICgqKCsrZm9ybWF0Y2hhcikgPT0gJzonKSB7ICAgLyogRXhwZWN0IGFuIGFyZ3VtZW50IGFmdGVyIG9wdGlvbiAqLwotCSAgICBuZXh0YXJndisrOwotCSAgICBpZiAoKm5leHRjaGFyID09IDApIHsKLQkJaWYgKGFyZ2MgPD0gbmV4dGFyZ3YpCi0JCSAgICByZXR1cm4gSU5WQUxJRDsKLQkJbmV4dGNoYXIgPSBhcmd2W25leHRhcmd2KytdOwotCQl9Ci0JICAgICphcmd1bWVudCA9IG5leHRjaGFyOwotCSAgICBuZXh0Y2hhciA9IE5VTEw7Ci0JICAgIH0KLQllbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogV2UgaGF2ZSBhIHN3aXRjaCBzdHlsZSBvcHRpb24gICAgKi8KLQkgICAgaWYgKCpuZXh0Y2hhciA9PSAwKSB7Ci0JCW5leHRhcmd2Kys7Ci0JCW5leHRjaGFyID0gTlVMTDsKLQkJfQotCSAgICAqYXJndW1lbnQgPSBOVUxMOwotCSAgICB9Ci0JcmV0dXJuIGNoOyAgICAgICAgICAgICAgICAgIC8qIHJldHVybiB0aGUgb3B0aW9uIHNwZWNpZmllciAgICAgICovCi0JfQotICAgIG5leHRjaGFyID0gTlVMTDsKLSAgICBuZXh0YXJndisrOwotICAgIHJldHVybiBBTExET05FOyAgICAgICAgICAgICAgICAgLyogbm8gYXJndW1lbnRzIG9uIGNvbW1hbmQgbGluZSAgICAgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1vcHRhcnIgICAgICAtIERlc2NyaXB0aW9uIGZvciB0aGUgb3B0aW9uIHdlIGFyZSBwYXJzaW5nCi1hcmd1bWVudCAgICAtIFN0cmluZyB0byBwYXJzZQotCi1SRVRVUk5TOgotSU5WQUxJRCBvbiBlcnJvciwgQUxMRE9ORSBvbiBzdWNjZXNzLgotCi1SRU1BUktTOgotUGFyc2VzIHRoZSBhcmd1bWVudCBzdHJpbmcgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGFyZ3VtZW50IHRoYXQgaXMKLWV4cGVjdGVkLCBmaWxsaW5nIGluIHRoZSBhcmd1bWVudCBmb3IgdGhhdCBvcHRpb24uIE5vdGUgdGhhdCB0byBwYXJzZSBhCi1zdHJpbmcsIHdlIHNpbXBseSByZXR1cm4gYSBwb2ludGVyIHRvIGFyZ3VtZW50LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcGFyc2Vfb3B0aW9uKAotICAgIE9wdGlvbiAqb3B0YXJyLAotICAgIGNoYXIgKmFyZ3VtZW50KQotewotICAgIGludCAgICAgbnVtX3JlYWQ7Ci0KLSAgICBzd2l0Y2ggKChpbnQpKG9wdGFyci0+dHlwZSkpIHsKLQljYXNlIE9QVF9JTlRFR0VSOgotCSAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJWQiLChpbnQqKW9wdGFyci0+YXJnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBPUFRfSEVYOgotCSAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJXgiLChpbnQqKW9wdGFyci0+YXJnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBPUFRfT0NUQUw6Ci0JICAgIG51bV9yZWFkID0gc3NjYW5mKGFyZ3VtZW50LCIlbyIsKGludCopb3B0YXJyLT5hcmcpOwotCSAgICBicmVhazsKLQljYXNlIE9QVF9VTlNJR05FRDoKLQkgICAgbnVtX3JlYWQgPSBzc2NhbmYoYXJndW1lbnQsIiV1IiwodWludCopb3B0YXJyLT5hcmcpOwotCSAgICBicmVhazsKLQljYXNlIE9QVF9MSU5URUdFUjoKLQkgICAgbnVtX3JlYWQgPSBzc2NhbmYoYXJndW1lbnQsIiVsZCIsKGxvbmcqKW9wdGFyci0+YXJnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBPUFRfTEhFWDoKLQkgICAgbnVtX3JlYWQgPSBzc2NhbmYoYXJndW1lbnQsIiVseCIsKGxvbmcqKW9wdGFyci0+YXJnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBPUFRfTE9DVEFMOgotCSAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJWxvIiwobG9uZyopb3B0YXJyLT5hcmcpOwotCSAgICBicmVhazsKLQljYXNlIE9QVF9MVU5TSUdORUQ6Ci0JICAgIG51bV9yZWFkID0gc3NjYW5mKGFyZ3VtZW50LCIlbHUiLCh1bG9uZyopb3B0YXJyLT5hcmcpOwotCSAgICBicmVhazsKLQljYXNlIE9QVF9GTE9BVDoKLQkgICAgbnVtX3JlYWQgPSBzc2NhbmYoYXJndW1lbnQsIiVmIiwoZmxvYXQqKW9wdGFyci0+YXJnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBPUFRfRE9VQkxFOgotCSAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJWxmIiwoZG91YmxlKilvcHRhcnItPmFyZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgT1BUX0xET1VCTEU6Ci0JICAgIG51bV9yZWFkID0gc3NjYW5mKGFyZ3VtZW50LCIlTGYiLChsb25nIGRvdWJsZSopb3B0YXJyLT5hcmcpOwotCSAgICBicmVhazsKLQljYXNlIE9QVF9TVFJJTkc6Ci0JICAgIG51bV9yZWFkID0gMTsgICAgICAgICAgIC8qIFRoaXMgYWx3YXlzIHdvcmtzICAgICovCi0JICAgICooKGNoYXIqKilvcHRhcnItPmFyZykgPSBhcmd1bWVudDsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgcmV0dXJuIElOVkFMSUQ7Ci0JfQotCi0gICAgaWYgKG51bV9yZWFkID09IDApCi0JcmV0dXJuIElOVkFMSUQ7Ci0gICAgZWxzZQotCXJldHVybiBBTExET05FOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotSEVBREVSOgotY21kbGluZS5oCi0KLVBBUkFNRVRFUlM6Ci1hcmdjICAgICAgICAtIE51bWJlciBvZiBhcmd1bWVudHMgb24gY29tbWFuZCBsaW5lCi1hcmd2ICAgICAgICAtIEFycmF5IG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLW51bV9vcHQgICAgIC0gTnVtYmVyIG9mIG9wdGlvbnMgaW4gb3B0aW9uIGFycmF5Ci1vcHRhcnIgICAgICAtIEFycmF5IHRvIHNwZWNpZnkgaG93IHRvIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUKLWRvX3BhcmFtICAgIC0gUm91dGluZSB0byBoYW5kbGUgYSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyCi0KLVJFVFVSTlM6Ci1BTExET05FLCBJTlZBTElEIG9yIEhFTFAKLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgYWNjb3JkaW5nIHRvIGEgdGFibGUgb2Ygb3B0aW9ucy4gVGhpcwotcm91dGluZSBjYWxscyBnZXRjbWRvcHQgYWJvdmUgdG8gcGFyc2UgZWFjaCBpbmRpdmlkdWFsIG9wdGlvbiBhbmQgYXR0ZW1wdHMKLXRvIHBhcnNlIGVhY2ggb3B0aW9uIGludG8gYSB2YXJpYWJsZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuIFRoZSByb3V0aW5lCi1jYW4gcGFyc2UgaW50ZWdlcnMgYW5kIGxvbmcgaW50ZWdlcnMgaW4gZWl0aGVyIGRlY2ltYWwsIG9jdGFsLCBoZXhhZGVjaW1hbAotbm90YXRpb24sIHVuc2lnbmVkIGludGVnZXJzIGFuZCB1bnNpZ25lZCBsb25ncywgc3RyaW5ncyBhbmQgb3B0aW9uIHN3aXRjaGVzLgotT3B0aW9uIHN3aXRjaGVzIGFyZSBzaW1wbHkgYm9vbGVhbiB2YXJpYWJsZXMgdGhhdCBnZXQgdHVybmVkIG9uIGlmIHRoZQotc3dpdGNoIHdhcyBwYXJzZWQuCi0KLVBhcmFtZXRlcnMgYXJlIGV4dHJhY3RlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYnkgY2FsbGluZyBhIHVzZXIgc3VwcGxpZWQKLXJvdXRpbmUgZG9fcGFyYW0oKSB0byBoYW5kbGUgZWFjaCBwYXJhbWV0ZXIgYXMgaXQgaXMgZW5jb3VudGVyZWQuIFRoZQotcm91dGluZSBkb19wYXJhbSgpIHNob3VsZCBhY2NlcHQgYSBwb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXIgb24gdGhlIGNvbW1hbmQKLWxpbmUgYW5kIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIGhvdyBtYW55IHBhcmFtZXRlcnMgaGF2ZSBiZWVuIGVuY291bnRlcmVkCi0oaWU6IDEgaWYgdGhpcyBpcyB0aGUgZmlyc3QgcGFyYW1ldGVyLCAxMCBpZiBpdCBpcyB0aGUgMTB0aCBldGMpLCBhbmQgcmV0dXJuCi1BTExET05FIHVwb24gc3VjY2Vzc2Z1bGx5IHBhcnNpbmcgaXQgb3IgSU5WQUxJRCBpZiB0aGUgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLgotCi1XZSByZXR1cm4gZWl0aGVyIEFMTERPTkUgaWYgYWxsIHRoZSBvcHRpb25zIHdlcmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwKLUlOVkFMSUQgaWYgYW4gaW52YWxpZCBvcHRpb24gd2FzIGVuY291bnRlcmVkIG9yIEhFTFAgaWYgYW55IG9mIC1oLCAtSCBvcgotLT8gd2VyZSBwcmVzZW50IG9uIHRoZSBjb21tYW5kIGxpbmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGdldGFyZ3MoCi0gICAgaW50IGFyZ2MsCi0gICAgY2hhciAqYXJndltdLAotICAgIGludCBudW1fb3B0LAotICAgIE9wdGlvbiBvcHRhcnJbXSwKLSAgICBpbnQgKCpkb19wYXJhbSkoCi0JY2hhciAqcGFyYW0sCi0JaW50IG51bSkpCi17Ci0gICAgaW50ICAgICBpLG9wdDsKLSAgICBjaGFyICAgICphcmd1bWVudDsKLSAgICBpbnQgICAgIHBhcmFtX251bSA9IDE7Ci0gICAgY2hhciAgICBjbWRzdHJbTUFYQVJHKjIgKyA0XTsKLQotICAgIC8qIEJ1aWxkIHRoZSBjb21tYW5kIHN0cmluZyBmcm9tIHRoZSBhcnJheSBvZiBvcHRpb25zICAgKi8KLQotICAgIHN0cmNweShjbWRzdHIsImhIPyIpOwotICAgIGZvciAoaSA9IDAsb3B0ID0gMzsgaSA8IG51bV9vcHQ7IGkrKyxvcHQrKykgewotCWNtZHN0cltvcHRdID0gb3B0YXJyW2ldLm9wdDsKLQlpZiAob3B0YXJyW2ldLnR5cGUgIT0gT1BUX1NXSVRDSCkgewotCSAgICBjbWRzdHJbKytvcHRdID0gJzonOwotCSAgICB9Ci0JfQotICAgIGNtZHN0cltvcHRdID0gJ1wwJzsKLQotICAgIGZvciAoOzspIHsKLQlvcHQgPSBnZXRjbWRvcHQoYXJnYyxhcmd2LGNtZHN0ciwmYXJndW1lbnQpOwotCXN3aXRjaCAob3B0KSB7Ci0JICAgIGNhc2UgJ0gnOgotCSAgICBjYXNlICdoJzoKLQkgICAgY2FzZSAnPyc6Ci0JCXJldHVybiBIRUxQOwotCSAgICBjYXNlIEFMTERPTkU6Ci0JCXJldHVybiBBTExET05FOwotCSAgICBjYXNlIElOVkFMSUQ6Ci0JCXJldHVybiBJTlZBTElEOwotCSAgICBjYXNlIFBBUkFNRVRFUjoKLQkJaWYgKGRvX3BhcmFtID09IE5VTEwpCi0JCSAgICByZXR1cm4gSU5WQUxJRDsKLQkJaWYgKGRvX3BhcmFtKGFyZ3ZbbmV4dGFyZ3ZdLHBhcmFtX251bSkgPT0gSU5WQUxJRCkKLQkJICAgIHJldHVybiBJTlZBTElEOwotCQluZXh0YXJndisrOwotCQlwYXJhbV9udW0rKzsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0KLQkJLyogU2VhcmNoIGZvciB0aGUgb3B0aW9uIGluIHRoZSBvcHRpb24gYXJyYXkuIFdlIGFyZQotCQkgKiBndWFyYW50ZWVkIHRvIGZpbmQgaXQuCi0JCSAqLwotCi0JCWZvciAoaSA9IDA7IGkgPCBudW1fb3B0OyBpKyspIHsKLQkJICAgIGlmIChvcHRhcnJbaV0ub3B0ID09IG9wdCkKLQkJCWJyZWFrOwotCQkgICAgfQotCQlpZiAob3B0YXJyW2ldLnR5cGUgPT0gT1BUX1NXSVRDSCkKLQkJICAgICooKGlib29sKilvcHRhcnJbaV0uYXJnKSA9IHRydWU7Ci0JCWVsc2UgewotCQkgICAgaWYgKHBhcnNlX29wdGlvbigmb3B0YXJyW2ldLGFyZ3VtZW50KSA9PSBJTlZBTElEKQotCQkJcmV0dXJuIElOVkFMSUQ7Ci0JCSAgICB9Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotSEVBREVSOgotY21kbGluZS5oCi0KLVBBUkFNRVRFUlM6Ci1udW1fb3B0IC0gTnVtYmVyIG9mIG9wdGlvbnMgaW4gdGhlIHRhYmxlCi1vcHRhcnIgIC0gVGFibGUgb2Ygb3B0aW9uIGRlc2NyaXB0aW9ucwotCi1SRU1BUktTOgotUHJpbnRzIHRoZSBkZXNjcmlwdGlvbiBvZiBlYWNoIG9wdGlvbiBpbiBhIHN0YW5kYXJkIGZvcm1hdCB0byB0aGUgc3RhbmRhcmQKLW91dHB1dCBkZXZpY2UuIFRoZSBkZXNjcmlwdGlvbiBmb3IgZWFjaCBvcHRpb24gaXMgb2J0YWluZWQgZnJvbSB0aGUgdGFibGUKLW9mIG9wdGlvbnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwcmludF9kZXNjKAotICAgIGludCBudW1fb3B0LAotICAgIE9wdGlvbiBvcHRhcnJbXSkKLXsKLSAgICBpbnQgICAgIGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX29wdDsgaSsrKSB7Ci0JaWYgKG9wdGFycltpXS50eXBlID09IE9QVF9TV0lUQ0gpCi0JICAgIHByaW50ZigiICAtJWMgICAgICAgJXNcbiIsb3B0YXJyW2ldLm9wdCxvcHRhcnJbaV0uZGVzYyk7Ci0JZWxzZQotCSAgICBwcmludGYoIiAgLSVjPGFyZz4gICVzXG4iLG9wdGFycltpXS5vcHQsb3B0YXJyW2ldLmRlc2MpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUhFQURFUjoKLWNtZGxpbmUuaAotCi1QQVJBTUVURVJTOgotbW9kdWxlTmFtZSAgLSBNb2R1bGUgbmFtZSBmb3IgcHJvZ3JhbQotY21kTGluZSAgICAgLSBDb21tYW5kIGxpbmUgdG8gcGFyc2UKLXBhcmdjICAgICAgIC0gUG9pbnRlciB0byAnYXJnYycgcGFyYW1ldGVyCi1wYXJndiAgICAgICAtIFBvaW50ZXIgdG8gJ2FyZ3YnIHBhcmFtZXRlcgotbWF4QXJnYyAgICAgLSBNYXhpbXVtIGFyZ3YgYXJyYXkgaW5kZXgKLQotUkVNQVJLUzoKLVBhcnNlcyBhIGNvbW1hbmQgbGluZSBmcm9tIGEgc2luZ2xlIHN0cmluZyBpbnRvIHRoZSBDIHN0eWxlICdhcmdjJyBhbmQKLSdhcmd2JyBmb3JtYXQuIE1vc3QgdXNlZnVsIGZvciBXaW5kb3dzIHByb2dyYW1zIHdoZXJlIHRoZSBjb21tYW5kIGxpbmUKLWlzIHBhc3NlZCBpbiB2ZXJiYXRpbS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgcGFyc2VfY29tbWFuZGxpbmUoCi0gICAgY2hhciAqbW9kdWxlTmFtZSwKLSAgICBjaGFyICpjbWRMaW5lLAotICAgIGludCAqcGFyZ2MsCi0gICAgY2hhciAqYXJndltdLAotICAgIGludCBtYXhBcmd2KQotewotICAgIHN0YXRpYyBjaGFyIHN0cls1MTJdOwotICAgIHN0YXRpYyBjaGFyIGZpbGVuYW1lWzI2MF07Ci0gICAgY2hhciAgICAgICAgKnByZXZXb3JkID0gTlVMTDsKLSAgICBpYm9vbCAgICAgICAgaW5RdW90ZSA9IEZBTFNFOwotICAgIGlib29sICAgICAgICBub1N0cmlwID0gRkFMU0U7Ci0gICAgaW50ICAgICAgICAgYXJnYzsKLQotICAgIGFyZ2MgPSAwOwotICAgIHN0cmNweShmaWxlbmFtZSxtb2R1bGVOYW1lKTsKLSAgICBhcmd2W2FyZ2MrK10gPSBmaWxlbmFtZTsKLSAgICBjbWRMaW5lID0gc3RybmNweShzdHIsIGNtZExpbmUsIHNpemVvZihzdHIpLTEpOwotICAgIHdoaWxlICgqY21kTGluZSkgewotCXN3aXRjaCAoKmNtZExpbmUpIHsKLQkgICAgY2FzZSAnIicgOgotCQlpZiAocHJldldvcmQgIT0gTlVMTCkgewotCQkgICAgaWYgKGluUXVvdGUpIHsKLQkJCWlmICghbm9TdHJpcCkKLQkJCSAgICAqY21kTGluZSA9ICdcMCc7Ci0JCQlhcmd2IFthcmdjKytdID0gcHJldldvcmQ7Ci0JCQlwcmV2V29yZCA9IE5VTEw7Ci0JCQl9Ci0JCSAgICBlbHNlCi0JCQlub1N0cmlwID0gVFJVRTsKLQkJICAgIH0KLQkJaW5RdW90ZSA9ICFpblF1b3RlOwotCQlicmVhazsKLQkgICAgY2FzZSAnICcgOgotCSAgICBjYXNlICdcdCcgOgotCQlpZiAoIWluUXVvdGUpIHsKLQkJICAgIGlmIChwcmV2V29yZCAhPSBOVUxMKSB7Ci0JCQkqY21kTGluZSA9ICdcMCc7Ci0JCQlhcmd2IFthcmdjKytdID0gcHJldldvcmQ7Ci0JCQlwcmV2V29yZCA9IE5VTEw7Ci0JCQlub1N0cmlwID0gRkFMU0U7Ci0JCQl9Ci0JCSAgICB9Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0IDoKLQkJaWYgKHByZXZXb3JkID09IE5VTEwpCi0JCSAgICBwcmV2V29yZCA9IGNtZExpbmU7Ci0JCWJyZWFrOwotCQl9Ci0JaWYgKGFyZ2MgPj0gbWF4QXJndiAtIDEpCi0JICAgIGJyZWFrOwotCWNtZExpbmUrKzsKLQl9Ci0KLSAgICBpZiAoKHByZXZXb3JkICE9IE5VTEwgfHwgKGluUXVvdGUgJiYgcHJldldvcmQgIT0gTlVMTCkpICYmIGFyZ2MgPCBtYXhBcmd2IC0gMSkgewotCSpjbWRMaW5lID0gJ1wwJzsKLQlhcmd2IFthcmdjKytdID0gcHJldldvcmQ7Ci0JfQotICAgIGFyZ3ZbYXJnY10gPSBOVUxMOwotCi0gICAgLyogUmV0dXJuIHVwZGF0ZWQgcGFyYW1ldGVycyAqLwotICAgIHJldHVybiAoKnBhcmdjID0gYXJnYyk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FiZW9zLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FiZW9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MzRiZDEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhYmVvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgTGludXgKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotc3RhdGljIGlib29sICAgICAgICAgICAgaGF2ZVJEVFNDOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KLW9mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQotd2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCi1kaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCi10byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKLQotUkVNQVJLUzoKLUluIG9yZGVyIHRvIHN1cHBvcnQgZGVwbG95aW5nIG5ldyBOdWNsZXVzIGRyaXZlcnMgdGhhdCBtYXkgcmVxdWlyZSB1cGRhdGVkCi1QTSBsaWJyYXJ5IGZ1bmN0aW9ucywgd2UgY2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlcmUgaXMgYSBzeXN0ZW0gd2lkZSB2ZXJzaW9uCi1vZiB0aGUgUE0gZnVuY3Rpb25zIGF2YWlsYWJsZS4gSWYgc28gd2UgcmV0dXJuIHRob3NlIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGgKLXRoZSBzeXN0ZW0gd2lkZSBOdWNsZXVzIGRyaXZlcnMsIG90aGVyd2lzZSB0aGUgY29tcGlsZWQgaW4gdmVyc2lvbiBvZiB0aGUgUE0KLWxpYnJhcnkgaXMgdXNlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBsb2NhbCB2ZXJzaW9uIG9mIE51Y2xldXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCi17Ci0gICAgLyogVE9ETzogV2UgbWF5IHZlcnkgd2VsbCB3YW50IHRvIHByb3ZpZGUgYSBzeXN0ZW0gc2hhcmVkIGxpYnJhcnkgKi8KLSAgICAvKiAgICAgICB0aGF0IGVwb3J0cyB0aGUgUE0gZnVuY3Rpb25zIHJlcXVpcmVkIGJ5IHRoZSBOdWNsZXVzIGxpYnJhcnkgKi8KLSAgICAvKiAgICAgICBmb3IgQmVPUyBoZXJlLiBUaGF0IHdpbGwgZWxpbWluYXRlIGZhdGFsIGVycm9ycyBsb2FkaW5nIG5ldyAqLwotICAgIC8qICAgICAgIGRyaXZlcnMgb24gQmVPUyEgKi8KLSAgICByZXR1cm4gJl9QTV9pbXBvcnRzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHAsCi0gICAgaWJvb2wgc2hhcmVkKQotewotICAgICh2b2lkKWdhRXhwOwotICAgICh2b2lkKXNoYXJlZDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNpZm5kZWYgVEVTVF9IQVJORVNTCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfcXVlcnlGdW5jdGlvbnMoCi0gICAgR0FfZGV2Q3R4ICpkYywKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX3F1ZXJ5RnVuY3Rpb25zKGRjLGlkLGZ1bmNzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIFJFRjJEX3F1ZXJ5RnVuY3Rpb25zKAotICAgIFJFRjJEX2RyaXZlciAqcmVmMmQsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5SRUYyRF9xdWVyeUZ1bmN0aW9ucyhyZWYyZCxpZCxmdW5jcyk7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkKLQloYXZlUkRUU0MgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgaWYgKGhhdmVSRFRTQykKLQlfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7Ci0gICAgZWxzZSB7Ci0Jc3RydWN0IHRpbWV2YWwgdDsKLQlnZXR0aW1lb2ZkYXkoJnQsIE5VTEwpOwotCXZhbHVlLT5sb3cgPSB0LnR2X3NlYyoxMDAwMDAwICsgdC50dl91c2VjOwotCXZhbHVlLT5oaWdoID0gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2Fkb3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWRvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmJlNzc2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWRvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgTVNET1MKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgTVNET1Mgb3BlcmF0aW5nIHN5c3RlbS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbV9oZWxwLmgiCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KLW9mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQotd2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCi1kaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCi10byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKLQotUkVNQVJLUzoKLU5vdGhpbmcgdG8gZG8gaGVyZSBmb3IgRE9TLiBCYXNpY2FsbHkgc2luY2UgRE9TIGhhcyBubyBzeXN0ZW0gd2lkZSBzaGFyZWQKLWxpYnJhcnkgbWVjaGFuaXNtIHdlIGFyZSBlc3NlbnRpYWxseSBzY3Jld2VkIGlmIHRoZSBiaW5hcnkgQVBJIGNoYW5nZXMuCi1CeSBkZWZhdWx0IGZvciAzMi1iaXQgRE9TIGFwcHMgdGhlIGxvY2FsIE51Y2xldXMgZHJpdmVycyBzaG91bGQgYWx3YXlzIGJlCi11c2VkIGluIHByZWZlcmVuY2UgdG8gdGhlIHN5c3RlbSB3aWRlIE51Y2xldXMgZHJpdmVycy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9pbXBvcnRzICogTkFQSSBHQV9nZXRTeXN0ZW1QTUltcG9ydHModm9pZCkKLXsKLSAgICByZXR1cm4gJl9QTV9pbXBvcnRzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHAsCi0gICAgaWJvb2wgc2hhcmVkKQotewotICAgICh2b2lkKWdhRXhwOwotICAgICh2b2lkKXNoYXJlZDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNpZiAhZGVmaW5lZChURVNUX0hBUk5FU1MpICYmICFkZWZpbmVkKFZCRVRFU1QpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfcXVlcnlGdW5jdGlvbnMoCi0gICAgR0FfZGV2Q3R4ICpkYywKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX3F1ZXJ5RnVuY3Rpb25zKGRjLGlkLGZ1bmNzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIFJFRjJEX3F1ZXJ5RnVuY3Rpb25zKAotICAgIFJFRjJEX2RyaXZlciAqcmVmMmQsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5SRUYyRF9xdWVyeUZ1bmN0aW9ucyhyZWYyZCxpZCxmdW5jcyk7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUgRE9TCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhbGliLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FsaWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJlYWNjMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FsaWIuYworKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueSAzMi1iaXQgcHJvdGVjdGVkIG1vZGUgZW52aXJvbm1lbnQKLSoKLSogRGVzY3JpcHRpb246ICBDIG1vZHVsZSBmb3IgdGhlIEdyYXBoaWNzIEFjY2VsZXJhdG9yIERyaXZlciBBUEkuIFVzZXMKLSogICAgICAgICAgICAgICB0aGUgU2NpVGVjaCBQTSBsaWJyYXJ5IGZvciBpbnRlcmZhY2luZyB3aXRoIERPUwotKiAgICAgICAgICAgICAgIGV4dGVuZGVyIHNwZWNpZmljIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCi0jaWYgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0jaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKLSNlbHNlCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIFRFU1RfSEFSTkVTUwotR0FfZXhwb3J0cyAgX1ZBUkFQSSBfX0dBX2V4cG9ydHM7Ci1zdGF0aWMgaW50ICAgICAgICAgIGxvYWRlZCA9IGZhbHNlOwotc3RhdGljIFBFX01PRFVMRSAgICAqaE1vZEJQRCA9IE5VTEw7Ci0KLXN0YXRpYyBOX2ltcG9ydHMgX05faW1wb3J0cyA9IHsKLSAgICBzaXplb2YoTl9pbXBvcnRzKSwKLSAgICBfT1NfZGVsYXksCi0gICAgfTsKLQotc3RhdGljIEdBX2ltcG9ydHMgX0dBX2ltcG9ydHMgPSB7Ci0gICAgc2l6ZW9mKEdBX2ltcG9ydHMpLAotICAgIEdBX2dldFNoYXJlZEluZm8sCi0gICAgR0FfVGltZXJJbml0LAotICAgIEdBX1RpbWVyUmVhZCwKLSAgICBHQV9UaW1lckRpZmZlcmVuY2UsCi0gICAgfTsKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIERMTF9OQU1FICAgICAgICAiZ3JhcGhpY3MuYnBkIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgbm8gbG9uZ2VyIHVzZWQgYnV0IHdlIG11c3QgaW1wbGVtZW50IGl0IGFuZCByZXR1cm4gTlVMTAotZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBiaW5hcnkgZHJpdmVycy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1HQV9zaGFyZWRJbmZvICogTkFQSSBHQV9nZXRTaGFyZWRJbmZvKAotICAgIGludCBkZXZpY2UpCi17Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNpZm5kZWYgVEVTVF9IQVJORVNTCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZhdGFsIGVycm9yIGhhbmRsZXIgZm9yIG5vbi1leHBvcnRlZCBHQV9leHBvcnRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9HQV9mYXRhbEVycm9ySGFuZGxlcih2b2lkKQotewotICAgIFBNX2ZhdGFsRXJyb3IoIlVuc3VwcG9ydGVkIE51Y2xldXMgZXhwb3J0IGZ1bmN0aW9uIGNhbGxlZCEgUGxlYXNlIHVwZ3JhZGUgeW91ciBjb3B5IG9mIE51Y2xldXMhXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zaGFyZWQgIC0gVHJ1ZSB0byBsb2FkIHRoZSBkcml2ZXIgaW50byBzaGFyZWQgbWVtb3J5LgotCi1SRU1BUktTOgotTG9hZHMgdGhlIE51Y2xldXMgYmluYXJ5IHBvcnRhYmxlIERMTCBpbnRvIG1lbW9yeSBhbmQgaW5pdGlsaXNlcyBpdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgTG9hZERyaXZlcigKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgR0FfaW5pdExpYnJhcnlfdCAgICBHQV9pbml0TGlicmFyeTsKLSAgICBHQV9leHBvcnRzICAgICAgICAgICpnYUV4cDsKLSAgICBjaGFyICAgICAgICAgICAgICAgIGZpbGVuYW1lW1BNX01BWF9QQVRIXTsKLSAgICBjaGFyICAgICAgICAgICAgICAgIGJwZHBhdGhbUE1fTUFYX1BBVEhdOwotICAgIGludCAgICAgICAgICAgICAgICAgaSxtYXg7Ci0gICAgdWxvbmcgICAgICAgICAgICAgICAqcDsKLQotICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBsb2FkZWQgdGhlIGRyaXZlciAqLwotICAgIGlmIChsb2FkZWQpCi0JcmV0dXJuIHRydWU7Ci0gICAgUE1faW5pdCgpOwotCi0gICAgLyogRmlyc3QgdHJ5IHRvIHNlZSBpZiB3ZSBjYW4gZmluZCB0aGUgc3lzdGVtIHdpZGUgc2hhcmVkIGV4cG9ydHMKLSAgICAgKiBpZiB0aGV5IGFyZSBhdmFpbGFibGUuIFVuZGVyIE9TLzIgdGhpcyBjb25uZWN0cyB0byBvdXIgZ2xvYmFsCi0gICAgICogc2hhcmVkIE51Y2xldXMgbG9hZGVyIGluIFNERFBNSS5ETEwuCi0gICAgICovCi0gICAgX19HQV9leHBvcnRzLmR3U2l6ZSA9IHNpemVvZihfX0dBX2V4cG9ydHMpOwotICAgIGlmIChHQV9nZXRTaGFyZWRFeHBvcnRzKCZfX0dBX2V4cG9ydHMsc2hhcmVkKSkKLQlyZXR1cm4gbG9hZGVkID0gdHJ1ZTsKLQotICAgIC8qIE9wZW4gdGhlIEJQRCBmaWxlICovCi0gICAgaWYgKCFQTV9maW5kQlBEKERMTF9OQU1FLGJwZHBhdGgpKQotCXJldHVybiBmYWxzZTsKLSAgICBzdHJjcHkoZmlsZW5hbWUsYnBkcGF0aCk7Ci0gICAgc3RyY2F0KGZpbGVuYW1lLERMTF9OQU1FKTsKLSAgICBpZiAoKGhNb2RCUEQgPSBQRV9sb2FkTGlicmFyeShmaWxlbmFtZSxzaGFyZWQpKSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICBpZiAoKEdBX2luaXRMaWJyYXJ5ID0gKEdBX2luaXRMaWJyYXJ5X3QpUEVfZ2V0UHJvY0FkZHJlc3MoaE1vZEJQRCwiX0dBX2luaXRMaWJyYXJ5IikpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIGJwZHBhdGhbc3RybGVuKGJwZHBhdGgpLTFdID0gMDsKLSAgICBpZiAoc3RyY21wKGJwZHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSkgPT0gMCkKLQlzdHJjcHkoYnBkcGF0aCxQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCgpKTsKLSAgICBlbHNlIHsKLQlQTV9iYWNrc2xhc2goYnBkcGF0aCk7Ci0Jc3RyY2F0KGJwZHBhdGgsImNvbmZpZyIpOwotCX0KLSAgICBpZiAoKGdhRXhwID0gR0FfaW5pdExpYnJhcnkoc2hhcmVkLGJwZHBhdGgsZmlsZW5hbWUsR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKCksJl9OX2ltcG9ydHMsJl9HQV9pbXBvcnRzKSkgPT0gTlVMTCkKLQlQTV9mYXRhbEVycm9yKCJHQV9pbml0TGlicmFyeSBmYWlsZWQhXG4iKTsKLQotICAgIC8qIEluaXRpYWxpemUgYWxsIGRlZmF1bHQgaW1wb3J0cyB0byBwb2ludCB0byBmYXRhbCBlcnJvciBoYW5kbGVyCi0gICAgICogZm9yIHVwd2FyZHMgY29tcGF0aWJpbGl0eSwgYW5kIGNvcHkgdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucy4KLSAgICAgKi8KLSAgICBtYXggPSBzaXplb2YoX19HQV9leHBvcnRzKS9zaXplb2YoR0FfaW5pdExpYnJhcnlfdCk7Ci0gICAgZm9yIChpID0gMCxwID0gKHVsb25nKikmX19HQV9leHBvcnRzOyBpIDwgbWF4OyBpKyspCi0JKnArKyA9ICh1bG9uZylfR0FfZmF0YWxFcnJvckhhbmRsZXI7Ci0gICAgbWVtY3B5KCZfX0dBX2V4cG9ydHMsZ2FFeHAsTUlOKHNpemVvZihfX0dBX2V4cG9ydHMpLGdhRXhwLT5kd1NpemUpKTsKLSAgICBsb2FkZWQgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSBzdHViIGVudHJ5IHBvaW50cyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBjYWxscyB0bwotICogaW5pdGlhbGlzZSB0aGUgTnVjbGV1cyBsb2FkZXIgbGlicmFyeSwgYW5kIHdlIHVzZSB0aGlzIHRvIGxvYWQgb3VyCi0gKiBkcml2ZXIgRExMIGZyb20gZGlzayBhbmQgaW5pdGlhbGlzZSB0aGUgbGlicmFyeSB1c2luZyBpdC4KLSAqLwotCi0vKiB7c2VjcmV0fSAqLwotaW50IE5BUEkgR0Ffc3RhdHVzKHZvaWQpCi17Ci0gICAgaWYgKCFsb2FkZWQpCi0JcmV0dXJuIG5Ecml2ZXJOb3RGb3VuZDsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX3N0YXR1cygpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotY29uc3QgY2hhciAqIE5BUEkgR0FfZXJyb3JNc2coCi0gICAgTl9pbnQzMiBzdGF0dXMpCi17Ci0gICAgaWYgKCFsb2FkZWQpCi0JcmV0dXJuICJVbmFibGUgdG8gbG9hZCBOdWNsZXVzIGRldmljZSBkcml2ZXIhIjsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX2Vycm9yTXNnKHN0YXR1cyk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1pbnQgTkFQSSBHQV9nZXREYXlzTGVmdChOX2ludDMyIHNoYXJlZCkKLXsKLSAgICBpZiAoIUxvYWREcml2ZXIoc2hhcmVkKSkKLQlyZXR1cm4gLTE7Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9nZXREYXlzTGVmdChzaGFyZWQpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotaW50IE5BUEkgR0FfcmVnaXN0ZXJMaWNlbnNlKHVjaGFyICpsaWNlbnNlLE5faW50MzIgc2hhcmVkKQotewotICAgIGlmICghTG9hZERyaXZlcihzaGFyZWQpKQotCXJldHVybiAwOwotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcmVnaXN0ZXJMaWNlbnNlKGxpY2Vuc2Usc2hhcmVkKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLWlib29sIE5BUEkgR0FfbG9hZEluR1VJKE5faW50MzIgc2hhcmVkKQotewotICAgIGlmICghTG9hZERyaXZlcihzaGFyZWQpKQotCXJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX2xvYWRJbkdVSShzaGFyZWQpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotaW50IE5BUEkgR0FfZW51bWVyYXRlRGV2aWNlcyhOX2ludDMyIHNoYXJlZCkKLXsKLSAgICBpZiAoIUxvYWREcml2ZXIoc2hhcmVkKSkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX2VudW1lcmF0ZURldmljZXMoc2hhcmVkKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLUdBX2RldkN0eCAqIE5BUEkgR0FfbG9hZERyaXZlcihOX2ludDMyIGRldmljZUluZGV4LE5faW50MzIgc2hhcmVkKQotewotICAgIGlmICghTG9hZERyaXZlcihzaGFyZWQpKQotCXJldHVybiBOVUxMOwotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfbG9hZERyaXZlcihkZXZpY2VJbmRleCxzaGFyZWQpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotdm9pZCBOQVBJIEdBX2dldEdsb2JhbE9wdGlvbnMoCi0gICAgR0FfZ2xvYmFsT3B0aW9ucyAqb3B0aW9ucywKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgaWYgKExvYWREcml2ZXIoc2hhcmVkKSkKLQlfX0dBX2V4cG9ydHMuR0FfZ2V0R2xvYmFsT3B0aW9ucyhvcHRpb25zLHNoYXJlZCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1QRV9NT0RVTEUgKiBOQVBJIEdBX2xvYWRMaWJyYXJ5KAotICAgIGNvbnN0IGNoYXIgKnN6QlBETmFtZSwKLSAgICB1bG9uZyAqc2l6ZSwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgaWYgKCFMb2FkRHJpdmVyKHNoYXJlZCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9sb2FkTGlicmFyeShzekJQRE5hbWUsc2l6ZSxzaGFyZWQpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotR0FfZGV2Q3R4ICogTkFQSSBHQV9nZXRDdXJyZW50RHJpdmVyKAotICAgIE5faW50MzIgZGV2aWNlSW5kZXgpCi17Ci0gICAgLyogQmFpbCBmb3Igb2xkZXIgZHJpdmVycyB0aGF0IGRpZG4ndCBleHBvcnQgdGhpcyBmdW5jdGlvbiEgKi8KLSAgICBpZiAoIV9fR0FfZXhwb3J0cy5HQV9nZXRDdXJyZW50RHJpdmVyKQotCXJldHVybiBOVUxMOwotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfZ2V0Q3VycmVudERyaXZlcihkZXZpY2VJbmRleCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1SRUYyRF9kcml2ZXIgKiBOQVBJIEdBX2dldEN1cnJlbnRSZWYyZCgKLSAgICBOX2ludDMyIGRldmljZUluZGV4KQotewotICAgIC8qIEJhaWwgZm9yIG9sZGVyIGRyaXZlcnMgdGhhdCBkaWRuJ3QgZXhwb3J0IHRoaXMgZnVuY3Rpb24hICovCi0gICAgaWYgKCFfX0dBX2V4cG9ydHMuR0FfZ2V0Q3VycmVudFJlZjJkKQotCXJldHVybiBOVUxMOwotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfZ2V0Q3VycmVudFJlZjJkKGRldmljZUluZGV4KTsKLX0KLQotLyoge3NlY3JldH0gKi8KLWludCBOQVBJIEdBX2lzT0VNVmVyc2lvbihpYm9vbCBzaGFyZWQpCi17Ci0gICAgaWYgKCFMb2FkRHJpdmVyKHNoYXJlZCkpCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9pc09FTVZlcnNpb24oc2hhcmVkKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLU5fdWludDMyICogTkFQSSBHQV9nZXRMaWNlbnNlZERldmljZXMoaWJvb2wgc2hhcmVkKQotewotICAgIGlmICghTG9hZERyaXZlcihzaGFyZWQpKQotCXJldHVybiAwOwotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfZ2V0TGljZW5zZWREZXZpY2VzKHNoYXJlZCk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWxpbnV4LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FsaW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2U0ZTg1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWxpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBMaW51eAotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaWJvb2wgICAgICAgIGhhdmVSRFRTQzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1wYXRoICAgIC0gTG9jYWwgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gdG8gb3ZlcnJpZGUgdGhlIGxvY2F0aW9uCi1vZiB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMgdGhhdCBhcmUgbG9hZGVkLiBOb3JtYWxseSB0aGUgbG9hZGVyIGNvZGUKLXdpbGwgbG9vayBpbiB0aGUgc3lzdGVtIE51Y2xldXMgZGlyZWN0b3JpZXMgZmlyc3QsIHRoZW4gaW4gdGhlICdkcml2ZXJzJwotZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgZmluYWxseSByZWxhdGl2ZQotdG8gdGhlIE1HTF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9zZXRMb2NhbFBhdGgoCi0gICAgY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICBQTV9zZXRMb2NhbEJQRFBhdGgocGF0aCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotUG9pbnRlciB0byB0aGUgc3lzdGVtIHdpZGUgUE0gbGlicmFyeSBpbXBvcnRzLCBvciB0aGUgaW50ZXJuYWwgdmVyc2lvbiBpZiBub25lCi0KLVJFTUFSS1M6Ci1JbiBvcmRlciB0byBzdXBwb3J0IGRlcGxveWluZyBuZXcgTnVjbGV1cyBkcml2ZXJzIHRoYXQgbWF5IHJlcXVpcmUgdXBkYXRlZAotUE0gbGlicmFyeSBmdW5jdGlvbnMsIHdlIGNoZWNrIGhlcmUgdG8gc2VlIGlmIHRoZXJlIGlzIGEgc3lzdGVtIHdpZGUgdmVyc2lvbgotb2YgdGhlIFBNIGZ1bmN0aW9ucyBhdmFpbGFibGUuIElmIHNvIHdlIHJldHVybiB0aG9zZSBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoCi10aGUgc3lzdGVtIHdpZGUgTnVjbGV1cyBkcml2ZXJzLCBvdGhlcndpc2UgdGhlIGNvbXBpbGVkIGluIHZlcnNpb24gb2YgdGhlIFBNCi1saWJyYXJ5IGlzIHVzZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gbG9jYWwgdmVyc2lvbiBvZiBOdWNsZXVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX2ltcG9ydHMgKiBOQVBJIEdBX2dldFN5c3RlbVBNSW1wb3J0cyh2b2lkKQotewotICAgIC8qIFRPRE86IFdlIG1heSB2ZXJ5IHdlbGwgd2FudCB0byBwcm92aWRlIGEgc3lzdGVtIHNoYXJlZCBsaWJyYXJ5ICovCi0gICAgLyogICAgICAgdGhhdCBlcG9ydHMgdGhlIFBNIGZ1bmN0aW9ucyByZXF1aXJlZCBieSB0aGUgTnVjbGV1cyBsaWJyYXJ5ICovCi0gICAgLyogICAgICAgZm9yIExpbnV4IGhlcmUuIFRoYXQgd2lsbCBlbGltaW5hdGUgZmF0YWwgZXJyb3JzIGxvYWRpbmcgbmV3ICovCi0gICAgLyogICAgICAgZHJpdmVycyBvbiBMaW51eCEgKi8KLSAgICByZXR1cm4gJl9QTV9pbXBvcnRzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHAsCi0gICAgaWJvb2wgc2hhcmVkKQotewotICAgICh2b2lkKWdhRXhwOwotICAgICh2b2lkKXNoYXJlZDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNpZm5kZWYgVEVTVF9IQVJORVNTCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfcXVlcnlGdW5jdGlvbnMoCi0gICAgR0FfZGV2Q3R4ICpkYywKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX3F1ZXJ5RnVuY3Rpb25zKGRjLGlkLGZ1bmNzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIFJFRjJEX3F1ZXJ5RnVuY3Rpb25zKAotICAgIFJFRjJEX2RyaXZlciAqcmVmMmQsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5SRUYyRF9xdWVyeUZ1bmN0aW9ucyhyZWYyZCxpZCxmdW5jcyk7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkKLQloYXZlUkRUU0MgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgaWYgKGhhdmVSRFRTQykKLQlfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7Ci0gICAgZWxzZSB7Ci0Jc3RydWN0IHRpbWV2YWwgdDsKLQlnZXR0aW1lb2ZkYXkoJnQsIE5VTEwpOwotCXZhbHVlLT5sb3cgPSB0LnR2X3NlYyoxMDAwMDAwICsgdC50dl91c2VjOwotCXZhbHVlLT5oaWdoID0gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FudGRydi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhbnRkcnYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUwZjczNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FudGRydi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgTlQgZGV2aWNlIGRyaXZlcgotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBOVCBkZXZpY2UgZHJpdmVycy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUkRUU0M7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcGF0aCAgICAtIExvY2FsIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgotb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCi13aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKLWRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKLXRvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0Ffc2V0TG9jYWxQYXRoKAotICAgIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgUE1fc2V0TG9jYWxCUERQYXRoKHBhdGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQotCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX2ltcG9ydHMgKiBOQVBJIEdBX2dldFN5c3RlbVBNSW1wb3J0cyh2b2lkKQotewotICAgIHJldHVybiAmX1BNX2ltcG9ydHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgKHZvaWQpc2hhcmVkOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmbmRlZiBURVNUX0hBUk5FU1MKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9xdWVyeUZ1bmN0aW9ucygKLSAgICBHQV9kZXZDdHggKmRjLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgUkVGMkRfcXVlcnlGdW5jdGlvbnMoCi0gICAgUkVGMkRfZHJpdmVyICpyZWYyZCwKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKSB7Ci0JaGF2ZVJEVFNDID0gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlCi0JS2VRdWVyeVN5c3RlbVRpbWUoKExBUkdFX0lOVEVHRVIqKXZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYW9zMi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhb3MyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZTY1MDMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhb3MyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBPUy8yIDMyLWJpdAotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBPUy8yIG9wZXJhdGluZyBzeXN0ZW0gZW52aXJvbm1lbnRzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtX2hlbHAuaCIKLSNkZWZpbmUgSU5DTF9ET1NFUlJPUlMKLSNkZWZpbmUgSU5DTF9ET1MKLSNkZWZpbmUgSU5DTF9TVUIKLSNkZWZpbmUgSU5DTF9WSU8KLSNkZWZpbmUgSU5DTF9LQkQKLSNpbmNsdWRlIDxvczIuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGlib29sICAgIGhhdmVSRFRTQyA9IGZhbHNlOwotc3RhdGljIHVsb25nICAgIHBhcm1zWzNdOyAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyA2NEtiIGJvdW5kYXJ5ISAgICAqLwotc3RhdGljIHVsb25nICAgIHJlc3VsdFs0XTsgICAgICAvKiBNdXN0IG5vdCBjcm9zcyA2NEtiIGJvdW5kYXJ5ISAgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWZ1bmMgICAgICAgIC0gSGVscGVyIGRldmljZSBkcml2ZXIgZnVuY3Rpb24gdG8gY2FsbAotCi1SRVRVUk5TOgotRmlyc3QgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGRldmljZSBkcml2ZXIgaW4gcGFybXNPdXRbMF0KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIG9wZW4gb3VyIGhlbHBlciBkZXZpY2UgZHJpdmVyLCBjYWxsIGl0IGFuZCBjbG9zZSB0aGUgZmlsZQotaGFuZGxlLiBOb3RlIHRoYXQgd2UgaGF2ZSB0byBvcGVuIHRoZSBkZXZpY2UgZHJpdmVyIGZvciBldmVyeSBjYWxsIGJlY2F1c2UKLW9mIHR3byBwcm9ibGVtczoKLQotIDEuIFdlIGNhbm5vdCBvcGVuIGEgc2luZ2xlIGZpbGUgaGFuZGxlIGluIGEgRExMIHRoYXQgaXMgc2hhcmVkIGFtb25nc3QKLSAgICBwcm9ncmFtcywgc2luY2UgZXZlcnkgcHJvY2VzcyBtdXN0IGhhdmUgaXQncyBvd24gb3BlbiBmaWxlIGhhbmRsZS4KLQotIDIuIEZvciBzb21lIHJlYXNvbiB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgbGltaXQgb2YgYWJvdXQgMTIgb3BlbiBmaWxlCi0gICAgaGFuZGxlcyBvbiBhIGRldmljZSBkcml2ZXIgaW4gdGhlIHN5c3RlbS4gSGVuY2Ugd2hlbiB3ZSBvcGVuIG1vcmUKLSAgICB0aGFuIGFib3V0IDEyIGZpbGUgaGFuZGxlcyB0aGluZ3Mgc3RhcnQgdG8gZ28gdmVyeSBzdHJhbmdlLgotCi1IZW5jZSB3ZSBzaW1wbHkgb3BlbiB0aGUgZmlsZSBoYW5kbGUgZXZlcnkgdGltZSB0aGF0IHdlIG5lZWQgdG8gY2FsbCB0aGUKLWRldmljZSBkcml2ZXIgdG8gd29yayBhcm91bmQgdGhlc2UgcHJvYmxlbXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIENhbGxTRERIZWxwKAotICAgIGludCBmdW5jKQotewotICAgIHN0YXRpYyB1bG9uZyAgICBpbkxlbjsgICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgNjRLYiBib3VuZGFyeSEgICAgKi8KLSAgICBzdGF0aWMgdWxvbmcgICAgb3V0TGVuOyAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIDY0S2IgYm91bmRhcnkhICAgICovCi0gICAgSEZJTEUgICAgICAgICAgIGhTRERIZWxwOwotCi0gICAgLyogSWYgdGhpcyBjb2RlIGluIGhlcmUgZmFpbHMsIHdlIGFyZSBzY3Jld2VkISBNYW55IG9mIG91ciBkcml2ZXJzCi0gICAgICogdXNlIHRoaXMgY29kZSBhbmQgZG9uJ3QgaGF2ZSBhIEMgbGlicmFyeSwgc28gd2Ugc2ltcGx5IGFzc3VtZSB3ZQotICAgICAqIGNhbid0IGZhaWwgaGVyZS4KLSAgICAgKi8KLSAgICBEb3NPcGVuKFBNSEVMUF9OQU1FLCZoU0RESGVscCwmcmVzdWx0WzBdLDAsMCwKLQkgICAgRklMRV9PUEVOLCBPUEVOX1NIQVJFX0RFTllOT05FIHwgT1BFTl9BQ0NFU1NfUkVBRFdSSVRFLAotCSAgICBOVUxMKTsKLSAgICBEb3NEZXZJT0N0bChoU0RESGVscCxQTUhFTFBfSU9DVEwsZnVuYywKLQkgICAgICZwYXJtcywgaW5MZW4gPSBzaXplb2YocGFybXMpLCAmaW5MZW4sCi0JICAgICZyZXN1bHQsIG91dExlbiA9IHNpemVvZihyZXN1bHQpLCAmb3V0TGVuKTsKLSAgICBEb3NDbG9zZShoU0RESGVscCk7Ci0gICAgcmV0dXJuIHJlc3VsdFswXTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1wYXRoICAgIC0gTG9jYWwgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gdG8gb3ZlcnJpZGUgdGhlIGxvY2F0aW9uCi1vZiB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMgdGhhdCBhcmUgbG9hZGVkLiBOb3JtYWxseSB0aGUgbG9hZGVyIGNvZGUKLXdpbGwgbG9vayBpbiB0aGUgc3lzdGVtIE51Y2xldXMgZGlyZWN0b3JpZXMgZmlyc3QsIHRoZW4gaW4gdGhlICdkcml2ZXJzJwotZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgZmluYWxseSByZWxhdGl2ZQotdG8gdGhlIE1HTF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9zZXRMb2NhbFBhdGgoCi0gICAgY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICBQTV9zZXRMb2NhbEJQRFBhdGgocGF0aCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotUG9pbnRlciB0byB0aGUgc3lzdGVtIHdpZGUgUE0gbGlicmFyeSBpbXBvcnRzLCBvciB0aGUgaW50ZXJuYWwgdmVyc2lvbiBpZiBub25lCi0KLVJFTUFSS1M6Ci1Gb3IgT1MvMiB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgYmVjYXVzZSBOdWNsZXVzIGlzIGFsd2F5cwotbG9hZGVkIHZpYSB0aGUgc2hhcmVkIFNERFBNSSBkcml2ZXIgd2hlbiBTREQgaXMgbG9hZGVkIHNvIHdlIGRvbid0IG5lZWQKLWEgc3lzdGVtIHdpZGUgUE0gbGlicmFyeSBpbXBvcnRzIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX2ltcG9ydHMgKiBOQVBJIEdBX2dldFN5c3RlbVBNSW1wb3J0cyh2b2lkKQotewotICAgIHJldHVybiAmX1BNX2ltcG9ydHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZ2FFeHAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMKLXNoYXJlZCAgLSBUcnVlIGlmIGNvbm5lY3RpbmcgdG8gdGhlIHNoYXJlZCwgZ2xvYmFsIE51Y2xldXMgZHJpdmVyCi0KLVJFTUFSS1M6Ci1Gb3IgT1MvMiBpZiBTREQgaXMgbG9hZGVkIHdlICphbHdheXMqIGNvbm5lY3QgdG8gdGhlIHNoYXJlZCBOdWNsZXVzIGZ1bmN0aW9ucwotY29udGFpbmVkIHdpdGhpbiB0aGUgU0REUE1JIGRyaXZlci4gVGhpcyBhbGxvd3MgdGhlIE51Y2xldXMgZnVuY3Rpb25zIGNvbnRhaW5lZAotd2l0aGluIHRoaXMgZHJpdmVyIHRvIGJlIHV0aWxpc2VkIGJ5IGFsbCBOdWNsZXVzIGFwcHMgaW4gdGhlIHN5c3RlbSBhbmQKLW1haW50YWlucyBhIGNvbnNpc3RlbnQgc3RhdGUgYmV0d2VlbiB2ZXJzaW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHAsCi0gICAgaWJvb2wgc2hhcmVkKQotewotICAgIC8qIEluIHRlc3QgaGFybmVzcyBtb2RlLCB3ZSBuZWVkIHRvIGxvYWQgYSBsb2NhbCBjb3B5IG9mIE51Y2xldXMgKi8KLSNpZiAhZGVmaW5lZCAoVEVTVF9IQVJORVNTKSB8fCBkZWZpbmVkIChERUJVR19TRERQTUkpCi0gICAgSE1PRFVMRSAgICAgaE1vZFNERFBNSTsKLSAgICBjaGFyICAgICAgICBidWZbODBdOwotICAgIEdBX2V4cG9ydHMgICpleHA7Ci0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBQTSBsaWJyYXJ5IGFuZCBjb25uZWN0IHRvIG91ciBydW50aW1lIERMTCdzICovCi0gICAgUE1faW5pdCgpOwotICAgIGlmIChDYWxsU0RESGVscChQTUhFTFBfR0VUU0hBUkVERVhQKSAhPSAwKSB7Ci0JLyogV2UgaGF2ZSBmb3VuZCB0aGUgc2hhcmVkIE51Y2xldXMgZXhwb3J0cy4gQmVjYXVzZSBub3QgYWxsIHByb2Nlc3NlcwotCSAqIG1hcCB0byBTRERQTUkuRExMLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHdlIGNvbm5lY3QgdG8gdGhpcwotCSAqIERMTCBzbyB0aGF0IGl0IGdldHMgbWFwcGVkIGludG8gb3VyIGFkZHJlc3Mgc3BhY2UgKHRoYXQgaXMKLQkgKiB3aGVyZSB0aGUgc2hhcmVkIE51Y2xldXMgbG9hZGVyIGNvZGUgaXMgbG9jYXRlZCkuIFNpbXBseSBkb2luZyBhCi0JICogRG9zTG9hZE1vZHVsZSBvbiBpdCBpcyBlbm91Z2ggZm9yIHRoaXMuCi0JICovCi0JRG9zTG9hZE1vZHVsZSgoUFNaKWJ1ZixzaXplb2YoYnVmKSwoUFNaKSJTRERQTUkuRExMIiwmaE1vZFNERFBNSSk7Ci0JZXhwID0gKEdBX2V4cG9ydHMqKXJlc3VsdFswXTsKLQltZW1jcHkoZ2FFeHAsZXhwLE1JTihnYUV4cC0+ZHdTaXplLGV4cC0+ZHdTaXplKSk7Ci0JcmV0dXJuIHRydWU7Ci0JfQotI2VuZGlmCi0gICAgKHZvaWQpc2hhcmVkOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmbmRlZiBURVNUX0hBUk5FU1MKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9xdWVyeUZ1bmN0aW9ucygKLSAgICBHQV9kZXZDdHggKmRjLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgUkVGMkRfcXVlcnlGdW5jdGlvbnMoCi0gICAgUkVGMkRfZHJpdmVyICpyZWYyZCwKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQotCWhhdmVSRFRTQyA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlCi0JRG9zVG1yUXVlcnlUaW1lKChRV09SRCopdmFsdWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9uIE9TLzIsIHdlIG5lZWQgc3BlY2lhbCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMgaWYgd2UgYnVpbGQgU0REUE1JIGluCi10ZXN0IGhhcm5lc3MgbW9kZS4gQnV0IGlmIHdlIGJ1aWxkIEdBVGVzdCBldGMuIGluIHRlc3QgbW9kZSwgd2Ugd2FudCB0byB1c2UKLXRoZSBub3JtYWwgQyBydW50aW1lIGZ1bmN0aW9ucywgc28gcm91dGUgdGhlbSBiYWNrIGhlcmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgZGVmaW5lZCAoVEVTVF9IQVJORVNTKSAmJiAhZGVmaW5lZCAoREVCVUdfU0REUE1JKQotCi0vKiBVbmRlZmluZSB0aGVzZSBtYWNyb3MgZmlyc3Qgb3Igd2UnbGwgcmVjdXJzZSB0byBoZWxsISAqLwotI3VuZGVmIG1hbGxvYwotI3VuZGVmIGNhbGxvYwotI3VuZGVmIHJlYWxsb2MKLSN1bmRlZiBmcmVlCi0KLXZvaWQgKlNERFBNSV9tYWxsb2Moc2l6ZV90IHNpemUpIHsKLSAgICByZXR1cm4gbWFsbG9jKHNpemUpOwotfQotCi12b2lkICpTRERQTUlfY2FsbG9jKHNpemVfdCBudW0sIHNpemVfdCBzaXplKSB7Ci0gICAgcmV0dXJuIGNhbGxvYyhudW0sIHNpemUpOwotfQotCi12b2lkIFNERFBNSV9mcmVlKHZvaWQgKnB0cikgewotICAgIGZyZWUocHRyKTsKLX0KLQotdm9pZCAqU0REUE1JX3JlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkgewotICAgIHJldHVybiByZWFsbG9jKHB0ciwgc2l6ZSk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhcW54LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FxbnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1ZDY2Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FxbnguYworKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFFOWAotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBRTlggb3BlcmF0aW5nIHN5c3RlbS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCi0jaW5jbHVkZSA8dGltZS5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaWJvb2wgICAgICAgIGhhdmVSRFRTQzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1wYXRoICAgIC0gTG9jYWwgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gdG8gb3ZlcnJpZGUgdGhlIGxvY2F0aW9uCi1vZiB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMgdGhhdCBhcmUgbG9hZGVkLiBOb3JtYWxseSB0aGUgbG9hZGVyIGNvZGUKLXdpbGwgbG9vayBpbiB0aGUgc3lzdGVtIE51Y2xldXMgZGlyZWN0b3JpZXMgZmlyc3QsIHRoZW4gaW4gdGhlICdkcml2ZXJzJwotZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgZmluYWxseSByZWxhdGl2ZQotdG8gdGhlIE1HTF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9zZXRMb2NhbFBhdGgoCi0gICAgY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICBQTV9zZXRMb2NhbEJQRFBhdGgocGF0aCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotUG9pbnRlciB0byB0aGUgc3lzdGVtIHdpZGUgUE0gbGlicmFyeSBpbXBvcnRzLCBvciB0aGUgaW50ZXJuYWwgdmVyc2lvbiBpZiBub25lCi0KLVJFTUFSS1M6Ci1JbiBvcmRlciB0byBzdXBwb3J0IGRlcGxveWluZyBuZXcgTnVjbGV1cyBkcml2ZXJzIHRoYXQgbWF5IHJlcXVpcmUgdXBkYXRlZAotUE0gbGlicmFyeSBmdW5jdGlvbnMsIHdlIGNoZWNrIGhlcmUgdG8gc2VlIGlmIHRoZXJlIGlzIGEgc3lzdGVtIHdpZGUgdmVyc2lvbgotb2YgdGhlIFBNIGZ1bmN0aW9ucyBhdmFpbGFibGUuIElmIHNvIHdlIHJldHVybiB0aG9zZSBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoCi10aGUgc3lzdGVtIHdpZGUgTnVjbGV1cyBkcml2ZXJzLCBvdGhlcndpc2UgdGhlIGNvbXBpbGVkIGluIHZlcnNpb24gb2YgdGhlIFBNCi1saWJyYXJ5IGlzIHVzZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gbG9jYWwgdmVyc2lvbiBvZiBOdWNsZXVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX2ltcG9ydHMgKiBOQVBJIEdBX2dldFN5c3RlbVBNSW1wb3J0cyh2b2lkKQotewotICAgIC8qIFRPRE86IFdlIG1heSB2ZXJ5IHdlbGwgd2FudCB0byBwcm92aWRlIGEgc3lzdGVtIHNoYXJlZCBsaWJyYXJ5ICovCi0gICAgLyogICAgICAgdGhhdCBlcG9ydHMgdGhlIFBNIGZ1bmN0aW9ucyByZXF1aXJlZCBieSB0aGUgTnVjbGV1cyBsaWJyYXJ5ICovCi0gICAgLyogICAgICAgZm9yIFFOWCBoZXJlLiBUaGF0IHdpbGwgZWxpbWluYXRlIGZhdGFsIGVycm9ycyBsb2FkaW5nIG5ldyAqLwotICAgIC8qICAgICAgIGRyaXZlcnMgb24gUU5YISAqLwotICAgIHJldHVybiAmX1BNX2ltcG9ydHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgKHZvaWQpc2hhcmVkOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmbmRlZiBURVNUX0hBUk5FU1MKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9xdWVyeUZ1bmN0aW9ucygKLSAgICBHQV9kZXZDdHggKmRjLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgUkVGMkRfcXVlcnlGdW5jdGlvbnMoCi0gICAgUkVGMkRfZHJpdmVyICpyZWYyZCwKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQotCWhhdmVSRFRTQyA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlIHsKLQlzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0KLQljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHMpOwotCXZhbHVlLT5sb3cgPSAodHMudHZfbnNlYyAvIDEwMDAgKyB0cy50dl9zZWMgKiAxMDAwMDAwKTsKLQl2YWx1ZS0+aGlnaCA9IDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhcnR0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FydHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0MWY1OS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FydHQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFJUVGFyZ2V0LTMyCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIFJUVGFyZ2V0LTMyIG9wZXJhdGluZyBzeXN0ZW0gZW52aXJvbm1lbnRzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGlib29sICAgICAgICAgICAgaGF2ZVJEVFNDOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KLW9mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQotd2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCi1kaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCi10byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKLQotUkVNQVJLUzoKLUluIG9yZGVyIHRvIHN1cHBvcnQgZGVwbG95aW5nIG5ldyBOdWNsZXVzIGRyaXZlcnMgdGhhdCBtYXkgcmVxdWlyZSB1cGRhdGVkCi1QTSBsaWJyYXJ5IGZ1bmN0aW9ucywgd2UgY2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlcmUgaXMgYSBzeXN0ZW0gd2lkZSB2ZXJzaW9uCi1vZiB0aGUgUE0gZnVuY3Rpb25zIGF2YWlsYWJsZS4gSWYgc28gd2UgcmV0dXJuIHRob3NlIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGgKLXRoZSBzeXN0ZW0gd2lkZSBOdWNsZXVzIGRyaXZlcnMsIG90aGVyd2lzZSB0aGUgY29tcGlsZWQgaW4gdmVyc2lvbiBvZiB0aGUgUE0KLWxpYnJhcnkgaXMgdXNlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBsb2NhbCB2ZXJzaW9uIG9mIE51Y2xldXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCi17Ci0gICAgcmV0dXJuICZfUE1faW1wb3J0czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAotICAgIEdBX2V4cG9ydHMgKmdhRXhwLAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICAodm9pZClnYUV4cDsKLSAgICAodm9pZClzaGFyZWQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0jaWZuZGVmIFRFU1RfSEFSTkVTUwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAotICAgIEdBX2RldkN0eCAqZGMsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKLSAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApIHsKLQloYXZlUkRUU0MgPSB0cnVlOwotCXJldHVybiB0cnVlOwotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXNteC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhc214LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzE5NDEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhc214LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBzbXgzMgotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBzbXgzMiBwbGF0Zm9ybSAtLSBubyB2eEQgc3VwcG9ydC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1wYXRoICAgIC0gTG9jYWwgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gdG8gb3ZlcnJpZGUgdGhlIGxvY2F0aW9uCi1vZiB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMgdGhhdCBhcmUgbG9hZGVkLiBOb3JtYWxseSB0aGUgbG9hZGVyIGNvZGUKLXdpbGwgbG9vayBpbiB0aGUgc3lzdGVtIE51Y2xldXMgZGlyZWN0b3JpZXMgZmlyc3QsIHRoZW4gaW4gdGhlICdkcml2ZXJzJwotZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgZmluYWxseSByZWxhdGl2ZQotdG8gdGhlIE1HTF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9zZXRMb2NhbFBhdGgoCi0gICAgY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICBQTV9zZXRMb2NhbEJQRFBhdGgocGF0aCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotUG9pbnRlciB0byB0aGUgc3lzdGVtIHdpZGUgUE0gbGlicmFyeSBpbXBvcnRzLCBvciB0aGUgaW50ZXJuYWwgdmVyc2lvbiBpZiBub25lCi0KLVJFTUFSS1M6Ci1JbiBvcmRlciB0byBzdXBwb3J0IGRlcGxveWluZyBuZXcgTnVjbGV1cyBkcml2ZXJzIHRoYXQgbWF5IHJlcXVpcmUgdXBkYXRlZAotUE0gbGlicmFyeSBmdW5jdGlvbnMsIHdlIGNoZWNrIGhlcmUgdG8gc2VlIGlmIHRoZXJlIGlzIGEgc3lzdGVtIHdpZGUgdmVyc2lvbgotb2YgdGhlIFBNIGZ1bmN0aW9ucyBhdmFpbGFibGUuIElmIHNvIHdlIHJldHVybiB0aG9zZSBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoCi10aGUgc3lzdGVtIHdpZGUgTnVjbGV1cyBkcml2ZXJzLCBvdGhlcndpc2UgdGhlIGNvbXBpbGVkIGluIHZlcnNpb24gb2YgdGhlIFBNCi1saWJyYXJ5IGlzIHVzZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gbG9jYWwgdmVyc2lvbiBvZiBOdWNsZXVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX2ltcG9ydHMgKiBOQVBJIEdBX2dldFN5c3RlbVBNSW1wb3J0cyh2b2lkKQotewotICAgIHJldHVybiAmX1BNX2ltcG9ydHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgKHZvaWQpc2hhcmVkOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmbmRlZiBURVNUX0hBUk5FU1MKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9xdWVyeUZ1bmN0aW9ucygKLSAgICBHQV9kZXZDdHggKmRjLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgUkVGMkRfcXVlcnlGdW5jdGlvbnMoCi0gICAgUkVGMkRfZHJpdmVyICpyZWYyZCwKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQotCXJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIF9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXZ4ZC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhdnhkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOGJhOGQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhdnhkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW4zMiBWeEQKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgV2luMzIgVnhEJ3MuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGlib29sICAgICAgICAgICAgaGF2ZVJEVFNDOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KLW9mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQotd2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCi1kaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCi10byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKLQotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9pbXBvcnRzICogTkFQSSBHQV9nZXRTeXN0ZW1QTUltcG9ydHModm9pZCkKLXsKLSAgICByZXR1cm4gJl9QTV9pbXBvcnRzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHAsCi0gICAgaWJvb2wgc2hhcmVkKQotewotICAgICh2b2lkKWdhRXhwOwotICAgICh2b2lkKXNoYXJlZDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNpZm5kZWYgVEVTVF9IQVJORVNTCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfcXVlcnlGdW5jdGlvbnMoCi0gICAgR0FfZGV2Q3R4ICpkYywKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX3F1ZXJ5RnVuY3Rpb25zKGRjLGlkLGZ1bmNzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIFJFRjJEX3F1ZXJ5RnVuY3Rpb25zKAotICAgIFJFRjJEX2RyaXZlciAqcmVmMmQsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5SRUYyRF9xdWVyeUZ1bmN0aW9ucyhyZWYyZCxpZCxmdW5jcyk7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkgewotCWhhdmVSRFRTQyA9IHRydWU7Ci0JfQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgaWYgKGhhdmVSRFRTQykKLQlfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7Ci0gICAgZWxzZQotCVZURF9HZXRfUmVhbF9UaW1lKCZ2YWx1ZS0+aGlnaCwmdmFsdWUtPmxvdyk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2F3aW4zMi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhd2luMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0NDMzNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2F3aW4zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgV2luMzIKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgV2luMzIgb3BlcmF0aW5nIHN5c3RlbSBlbnZpcm9ubWVudHMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1faGVscC5oIgotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNkZWZpbmUgU1RSSUNUCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgRExMX05BTUUgICAgICAgICJuZ2FfdzMyLmRsbCIKLQotZXh0ZXJuIEhBTkRMRSAgICAgICAgICAgX1BNX2hEZXZpY2U7Ci1zdGF0aWMgSE1PRFVMRSAgICAgICAgICBoTW9kRExMID0gTlVMTDsKLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIHVzZVJpbmcwRHJpdmVyID0gZmFsc2U7Ci1zdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUkRUU0M7Ci1zdGF0aWMgR0FfbGFyZ2VJbnRlZ2VyICBjb3VudEZyZXE7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTG9hZHMgdGhlIHNoYXJlZCAibmdhX3czMi5kbGwiIGxpYnJhcnkgZnJvbSBkaXNrIGFuZCBjb25uZWN0cyB0byBpdC4gVGhpcwotbGlicmFyeSBpcyAqYWx3YXlzKiBsb2NhdGVkIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgTnVjbGV1cwotZ3JhcGhpY3MuYnBkIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIExvYWRTaGFyZWRETEwodm9pZCkKLXsKLSAgICBjaGFyICAgICAgICAgICAgICAgIGZpbGVuYW1lW1BNX01BWF9QQVRIXTsKLSAgICBjaGFyICAgICAgICAgICAgICAgIGJwZHBhdGhbUE1fTUFYX1BBVEhdOwotCi0gICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IGxvYWRlZCB0aGUgRExMICovCi0gICAgaWYgKGhNb2RETEwpCi0JcmV0dXJuIHRydWU7Ci0gICAgUE1faW5pdCgpOwotCi0gICAgLyogT3BlbiB0aGUgRExMIGZpbGUgKi8KLSAgICBpZiAoIVBNX2ZpbmRCUEQoRExMX05BTUUsYnBkcGF0aCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIHN0cmNweShmaWxlbmFtZSxicGRwYXRoKTsKLSAgICBzdHJjYXQoZmlsZW5hbWUsRExMX05BTUUpOwotICAgIGlmICgoaE1vZERMTCA9IExvYWRMaWJyYXJ5KGZpbGVuYW1lKSkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcGF0aCAgICAtIExvY2FsIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgotb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCi13aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKLWRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKLXRvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLQotTm90ZSB0aGF0IGZvciBXaW4zMiB3ZSBhbHNvIGNhbGwgaW50byB0aGUgbG9hZGVkIFBNSEVMUCBkZXZpY2UgZHJpdmVyCi1hcyBuZWNlc3NhcnkgdG8gY2hhbmdlIHRoZSBsb2NhbCBOdWNsZXVzIHBhdGggZm9yIHN5c3RlbSB3aWRlIE51Y2xldXMKLWRyaXZlcnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIERXT1JEICAgaW5CdWZbMV07Ci0gICAgRFdPUkQgICBvdXRCdWZbMV0sb3V0Q250OwotCi0gICAgUE1fc2V0TG9jYWxCUERQYXRoKHBhdGgpOwotICAgIGlmIChfUE1faERldmljZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCWluQnVmWzBdID0gKERXT1JEKXBhdGg7Ci0JRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0FTRVRMT0NBTFBBVEgzMiwKLQkgICAgaW5CdWYsIHNpemVvZihpbkJ1ZiksIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZvdXRDbnQsIE5VTEwpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKLQotUkVNQVJLUzoKLUluIG9yZGVyIHRvIHN1cHBvcnQgZGVwbG95aW5nIG5ldyBOdWNsZXVzIGRyaXZlcnMgdGhhdCBtYXkgcmVxdWlyZSB1cGRhdGVkCi1QTSBsaWJyYXJ5IGZ1bmN0aW9ucywgd2UgY2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlcmUgaXMgYSBzeXN0ZW0gd2lkZSB2ZXJzaW9uCi1vZiB0aGUgUE0gZnVuY3Rpb25zIGF2YWlsYWJsZS4gSWYgc28gd2UgcmV0dXJuIHRob3NlIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGgKLXRoZSBzeXN0ZW0gd2lkZSBOdWNsZXVzIGRyaXZlcnMsIG90aGVyd2lzZSB0aGUgY29tcGlsZWQgaW4gdmVyc2lvbiBvZiB0aGUgUE0KLWxpYnJhcnkgaXMgdXNlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBsb2NhbCB2ZXJzaW9uIG9mIE51Y2xldXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCi17Ci0gICAgUE1faW1wb3J0cyAqIHBtSW1wOwotICAgIFBNX2ltcG9ydHMgKiAoTkFQSVAgX0dBX2dldFN5c3RlbVBNSW1wb3J0cykodm9pZCk7Ci0KLSAgICBpZiAoTG9hZFNoYXJlZERMTCgpKSB7Ci0JLyogTm90ZSB0aGF0IFZpc3VhbCBDKysgYnVpbGQgRExMJ3Mgd2l0aCBvbmx5IGEgc2luZ2xlIHVuZGVyc2NvcmUgaW4gZnJvbnQKLQkgKiBvZiB0aGUgZXhwb3J0ZWQgbmFtZSB3aGlsZSBXYXRjb20gQyBwcm92aWRlcyB0d28gb2YgdGhlbS4gV2UgY2hlY2sgZm9yCi0JICogYm90aCB0byBhbGxvdyB3b3JraW5nIHdpdGggZWl0aGVyIGNvbXBpbGVkIERMTC4KLQkgKi8KLQlpZiAoKF9HQV9nZXRTeXN0ZW1QTUltcG9ydHMgPSAodm9pZCopR2V0UHJvY0FkZHJlc3MoaE1vZERMTCwiX0dBX2dldFN5c3RlbVBNSW1wb3J0cyIpKSAhPSBOVUxMKSB7Ci0JICAgIGlmICgoX0dBX2dldFN5c3RlbVBNSW1wb3J0cyA9ICh2b2lkKilHZXRQcm9jQWRkcmVzcyhoTW9kRExMLCJfX0dBX2dldFN5c3RlbVBNSW1wb3J0cyIpKSAhPSBOVUxMKSB7Ci0JCXBtSW1wID0gX0dBX2dldFN5c3RlbVBNSW1wb3J0cygpOwotCQltZW1jcHkoJl9QTV9pbXBvcnRzLHBtSW1wLE1JTihfUE1faW1wb3J0cy5kd1NpemUscG1JbXAtPmR3U2l6ZSkpOwotCQlyZXR1cm4gcG1JbXA7Ci0JCX0KLQkgICAgfQotCX0KLSAgICByZXR1cm4gJl9QTV9pbXBvcnRzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWdhRXhwICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zCi1zaGFyZWQgIC0gVHJ1ZSBpZiBjb25uZWN0aW5nIHRvIHRoZSBzaGFyZWQsIGdsb2JhbCBOdWNsZXVzIGRyaXZlcgotCi1SRU1BUktTOgotRm9yIFdpbjMyIGlmIHdlIGFyZSBjb25uZWN0aW5nIHRvIHRoZSBzaGFyZWQsIGdsb2JhbCBOdWNsZXVzIGRyaXZlciAobG9hZGVkCi1hdCByaW5nIDApIHRoZW4gd2UgbmVlZCB0byBsb2FkIGEgc3BlY2lhbCBuZ2FfdzMyLmRsbCBsaWJyYXJ5IHdoaWNoIGNvbnRhaW5zCi10aHVua3MgdG8gY2FsbCBkb3duIGludG8gdGhlIFJpbmcgMCBkZXZpY2UgZHJpdmVyIGFzIG5lY2Vzc2FyeS4gSWYgd2UgYXJlCi1jb25uZWN0aW5nIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2NhbCBOdWNsZXVzIGRyaXZlcnMgKGllOiBOdWNsZXVzIG9uIERpcmVjdERyYXcKLWVtdWxhdGlvbiBsYXllcikgdGhlbiB3ZSBkbyBub3RoaW5nIGhlcmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAotICAgIEdBX2V4cG9ydHMgKmdhRXhwLAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICBHQV9leHBvcnRzICogZXhwOwotICAgIEdBX2V4cG9ydHMgKiAoTkFQSVAgX0dBX2dldFN5c3RlbUdBRXhwb3J0cykodm9pZCk7Ci0KLSAgICB1c2VSaW5nMERyaXZlciA9IGZhbHNlOwotICAgIGlmIChzaGFyZWQpIHsKLQlpZiAoIUxvYWRTaGFyZWRETEwoKSkKLQkgICAgUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIGxvYWQgIiBETExfTkFNRSAiISIpOwotCWlmICgoX0dBX2dldFN5c3RlbUdBRXhwb3J0cyA9ICh2b2lkKilHZXRQcm9jQWRkcmVzcyhoTW9kRExMLCJfR0FfZ2V0U3lzdGVtR0FFeHBvcnRzIikpID09IE5VTEwpCi0JICAgIGlmICgoX0dBX2dldFN5c3RlbUdBRXhwb3J0cyA9ICh2b2lkKilHZXRQcm9jQWRkcmVzcyhoTW9kRExMLCJfX0dBX2dldFN5c3RlbUdBRXhwb3J0cyIpKSA9PSBOVUxMKQotCQlQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gbG9hZCAiIERMTF9OQU1FICIhIik7Ci0JZXhwID0gX0dBX2dldFN5c3RlbUdBRXhwb3J0cygpOwotCW1lbWNweShnYUV4cCxleHAsTUlOKGdhRXhwLT5kd1NpemUsZXhwLT5kd1NpemUpKTsKLQl1c2VSaW5nMERyaXZlciA9IHRydWU7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmbmRlZiBURVNUX0hBUk5FU1MKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9xdWVyeUZ1bmN0aW9ucygKLSAgICBHQV9kZXZDdHggKmRjLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHN0YXRpYyBpYm9vbCAoTkFQSVAgX0dBX3F1ZXJ5RnVuY3Rpb25zKShHQV9kZXZDdHggKmRjLE5fdWludDMyIGlkLHZvaWQgX0ZBUl8gKmZ1bmNzKSA9IE5VTEw7Ci0KLSAgICBpZiAodXNlUmluZzBEcml2ZXIpIHsKLQkvKiBDYWxsIHRoZSB2ZXJzaW9uIGluIG5nYV93MzIuZGxsIGlmIGl0IGlzIGxvYWRlZCAqLwotCWlmICghX0dBX3F1ZXJ5RnVuY3Rpb25zKSB7Ci0JICAgIGlmICgoX0dBX3F1ZXJ5RnVuY3Rpb25zID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9HQV9xdWVyeUZ1bmN0aW9ucyIpKSA9PSBOVUxMKQotCQlpZiAoKF9HQV9xdWVyeUZ1bmN0aW9ucyA9ICh2b2lkKilHZXRQcm9jQWRkcmVzcyhoTW9kRExMLCJfX0dBX3F1ZXJ5RnVuY3Rpb25zIikpID09IE5VTEwpCi0JCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gZ2V0IGV4cG9ydHMgZnJvbSAiIERMTF9OQU1FICIhIik7Ci0JICAgIH0KLQlyZXR1cm4gX0dBX3F1ZXJ5RnVuY3Rpb25zKGRjLGlkLGZ1bmNzKTsKLQl9Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKLSAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHN0YXRpYyBpYm9vbCAoTkFQSVAgX1JFRjJEX3F1ZXJ5RnVuY3Rpb25zKShSRUYyRF9kcml2ZXIgKnJlZjJkLE5fdWludDMyIGlkLHZvaWQgX0ZBUl8gKmZ1bmNzKSA9IE5VTEw7Ci0KLSAgICBpZiAodXNlUmluZzBEcml2ZXIpIHsKLQkvKiBDYWxsIHRoZSB2ZXJzaW9uIGluIG5nYV93MzIuZGxsIGlmIGl0IGlzIGxvYWRlZCAqLwotCWlmICghX1JFRjJEX3F1ZXJ5RnVuY3Rpb25zKSB7Ci0JICAgIGlmICgoX1JFRjJEX3F1ZXJ5RnVuY3Rpb25zID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9SRUYyRF9xdWVyeUZ1bmN0aW9ucyIpKSA9PSBOVUxMKQotCQlpZiAoKF9SRUYyRF9xdWVyeUZ1bmN0aW9ucyA9ICh2b2lkKilHZXRQcm9jQWRkcmVzcyhoTW9kRExMLCJfX1JFRjJEX3F1ZXJ5RnVuY3Rpb25zIikpID09IE5VTEwpCi0JCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gZ2V0IGV4cG9ydHMgZnJvbSAiIERMTF9OQU1FICIhIik7Ci0JICAgIH0KLQlyZXR1cm4gX1JFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKLQl9Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5SRUYyRF9xdWVyeUZ1bmN0aW9ucyhyZWYyZCxpZCxmdW5jcyk7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkgewotCWhhdmVSRFRTQyA9IHRydWU7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIGVsc2UgaWYgKFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koKExBUkdFX0lOVEVHRVIqKSZjb3VudEZyZXEpKSB7Ci0JaGF2ZVJEVFNDID0gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotICAgIGVsc2UKLQlRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2d0ZmNhbGMuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9ndGZjYWxjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNTQ3ZTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2d0ZmNhbGMuYworKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBWRVNBIEdlbmVyYWxpemVkIFRpbWluZyBGb3JtdWxhIChHVEYpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMS4xCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBEZXZlbG9wZWQgYnk6IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkuCi0qCi0qIERlc2NyaXB0aW9uOiAgQyBtb2R1bGUgZm9yIGdlbmVyYXRpbmcgR1RGIGNvbXBhdGlibGUgdGltaW5ncyBnaXZlbiBhIHNldAotKiAgICAgICAgICAgICAgIG9mIGlucHV0IHJlcXVpcmVtZW50cy4gVHJhbnNsYXRlZCBmcm9tIHRoZSBvcmlnaW5hbCBHVEYKLSogICAgICAgICAgICAgICAxLjE0IHNwcmVhZHNoZWV0IGRlZmluaXRpb24uCi0qCi0qICAgICAgICAgICAgICAgQ29tcGlsZSB3aXRoICNkZWZpbmUgVEVTVElORyB0byBidWlsZCBhIGNvbW1hbmQgbGluZSB0ZXN0Ci0qICAgICAgICAgICAgICAgcHJvZ3JhbS4KLSoKLSogICAgICAgICAgICAgICBOT1RFOiBUaGUgY29kZSBpbiBoZXJlIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIGNsYXJpdHkgYW5kCi0qICAgICAgICAgICAgICAgICAgICAgdG8gZm9sbG93IHRoZSBvcmlnaW5hbCBHVEYgc3BlYyBhcyBjbG9zZWx5IGFzCi0qICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiZ3RmLmgiCi0jaWZuZGVmIF9fV0lOMzJfVlhEX18KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBHVEZfY29uc3RhbnRzIEdDID0gewotICAgIDEuOCwgICAgICAgICAgICAgICAgICAgIC8qIE1hcmdpbiBzaXplIGFzIHBlcmNlbnRhZ2Ugb2YgZGlzcGxheSAgICAgKi8KLSAgICA4LCAgICAgICAgICAgICAgICAgICAgICAvKiBDaGFyYWN0ZXIgY2VsbCBncmFudWxhcml0eSAgICAgICAgICAgICAgICovCi0gICAgMSwgICAgICAgICAgICAgICAgICAgICAgLyogTWluaW11bSBmcm9udCBwb3JjaCBpbiBsaW5lcy9jaGFycyAgICAgICAqLwotICAgIDMsICAgICAgICAgICAgICAgICAgICAgIC8qIFdpZHRoIG9mIFYgc3luYyBpbiBsaW5lcyAgICAgICAgICAgICAgICAgKi8KLSAgICA4LCAgICAgICAgICAgICAgICAgICAgICAvKiBXaWR0aCBvZiBIIHN5bmMgYXMgcGVyY2VudCBvZiB0b3RhbCAgICAgICovCi0gICAgNTUwLCAgICAgICAgICAgICAgICAgICAgLyogTWluaW11bSB2ZXJ0aWNhbCBzeW5jICsgYmFjayBwb3JjaCAodXMpICAqLwotICAgIDYwMCwgICAgICAgICAgICAgICAgICAgIC8qIEJsYW5raW5nIGZvcm11bGEgZ3JhZGllbnQgICAgICAgICAgICAgICAgKi8KLSAgICA0MCwgICAgICAgICAgICAgICAgICAgICAvKiBCbGFua2luZyBmb3JtdWxhIG9mZnNldCAgICAgICAgICAgICAgICAgICovCi0gICAgMTI4LCAgICAgICAgICAgICAgICAgICAgLyogQmxhbmtpbmcgZm9ybXVsYSBzY2FsaW5nIGZhY3RvciAgICAgICAgICAqLwotICAgIDIwLCAgICAgICAgICAgICAgICAgICAgIC8qIEJsYW5raW5nIGZvcm11bGEgc2NhbGluZyBmYWN0b3Igd2VpZ2h0ICAgKi8KLSAgICB9OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgX19XSU4zMl9WWERfXwotLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluIGEgVnhELCBzbyB3ZSBzdHViIHRoZW0gb3V0IHNvIHRoaXMKLSAqIG1vZHVsZSB3aWxsIGF0IGxlYXN0IGNvbXBpbGUuIENhbGxpbmcgdGhlIGZ1bmN0aW9ucyBpbiBoZXJlIHdpbGwgZG8KLSAqIHNvbWV0aGluZyB3aWVyZCEKLSAqLwotZG91YmxlIHNxcnQoZG91YmxlIHgpCi17IHJldHVybiB4OyB9Ci0KLWRvdWJsZSBmbG9vcihkb3VibGUgeCkKLXsgcmV0dXJuIHg7IH0KLQotZG91YmxlIHBvdyhkb3VibGUgeCxkb3VibGUgeSkKLXsgcmV0dXJuIHgqeTsgfQotI2VuZGlmCi0KLXN0YXRpYyBkb3VibGUgcm91bmQoZG91YmxlIHYpCi17Ci0gICAgcmV0dXJuIGZsb29yKHYgKyAwLjUpOwotfQotCi1zdGF0aWMgdm9pZCBHZXRJbnRlcm5hbENvbnN0YW50cyhHVEZfY29uc3RhbnRzICpjKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBHZXRJbnRlcm5hbENvbnN0YW50cwotKiBQYXJhbWV0ZXJzOiAgIGMgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBpbnRlcm5hbCBjb25zdGFudHMKLSoKLSogRGVzY3JpcHRpb246ICBDYWxjdWxhdGVzIHRoZSByb3VuZGVkLCBpbnRlcm5hbCBzZXQgb2YgR1RGIGNvbnN0YW50cy4KLSogICAgICAgICAgICAgICBUaGVzZSBjb25zdGFudHMgYXJlIGRpZmZlcmVudCB0byB0aGUgcmVhbCBHVEYgY29uc3RhbnRzCi0qICAgICAgICAgICAgICAgdGhhdCBjYW4gYmUgc2V0IHVwIGZvciB0aGUgbW9uaXRvci4gVGhlIGNhbGN1bGF0aW9ucyB0bwotKiAgICAgICAgICAgICAgIGdldCB0aGVzZSByZWFsIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB0aGUgJ1dvcmsgQXJlYScKLSogICAgICAgICAgICAgICBhZnRlciB0aGUgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHRoZSBFeGNlbCBzcHJlYWRzaGVldC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgYy0+bWFyZ2luID0gR0MubWFyZ2luOwotICAgIGMtPmNlbGxHcmFuID0gcm91bmQoR0MuY2VsbEdyYW4pOwotICAgIGMtPm1pblBvcmNoID0gcm91bmQoR0MubWluUG9yY2gpOwotICAgIGMtPnZTeW5jUnFkID0gcm91bmQoR0MudlN5bmNScWQpOwotICAgIGMtPmhTeW5jID0gR0MuaFN5bmM7Ci0gICAgYy0+bWluVlN5bmNCUCA9IEdDLm1pblZTeW5jQlA7Ci0gICAgaWYgKEdDLmsgPT0gMCkKLQljLT5rID0gMC4wMDE7Ci0gICAgZWxzZQotCWMtPmsgPSBHQy5rOwotICAgIGMtPm0gPSAoYy0+ayAvIDI1NikgKiBHQy5tOwotICAgIGMtPmMgPSAoR0MuYyAtIEdDLmopICogKGMtPmsgLyAyNTYpICsgR0MuajsKLSAgICBjLT5qID0gR0MuajsKLX0KLQotdm9pZCBHVEZfY2FsY1RpbWluZ3MoZG91YmxlIGhQaXhlbHMsZG91YmxlIHZMaW5lcyxkb3VibGUgZnJlcSwKLSAgICBpbnQgdHlwZSxpYm9vbCB3YW50TWFyZ2lucyxpYm9vbCB3YW50SW50ZXJsYWNlLEdURl90aW1pbmdzICp0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBHVEZfY2FsY1RpbWluZ3MKLSogUGFyYW1ldGVyczogICBoUGl4ZWxzICAgICAtIFggcmVzb2x1dGlvbgotKiAgICAgICAgICAgICAgIHZMaW5lcyAgICAgIC0gWSByZXNvbHV0aW9uCi0qICAgICAgICAgICAgICAgZnJlcSAgICAgICAgLSBGcmVxdWVuY3kgKEh6LCBLSHogb3IgTUh6IGRlcGVuZGluZyBvbiB0eXBlKQotKiAgICAgICAgICAgICAgIHR5cGUgICAgICAgIC0gMSAtIHZlcnRpY2FsLCAyIC0gaG9yaXpvbnRhbCwgMyAtIGRvdCBjbG9jawotKiAgICAgICAgICAgICAgIG1hcmdpbnMgICAgIC0gVHJ1ZSBpZiBtYXJnaW5zIHNob3VsZCBiZSBnZW5lcmF0ZWQKLSogICAgICAgICAgICAgICBpbnRlcmxhY2UgICAtIFRydWUgaWYgaW50ZXJsYWNlZCB0aW1pbmdzIHRvIGJlIGdlbmVyYXRlZAotKiAgICAgICAgICAgICAgIHQgICAgICAgICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHJlc3VsdGluZyB0aW1pbmdzCi0qCi0qIERlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlcyBhIHNldCBvZiBHVEYgdGltaW5nIHBhcmFtZXRlcnMgZ2l2ZW4gYSBzcGVjaWZpZWQKLSogICAgICAgICAgICAgICByZXNvbHV0aW9uIGFuZCB2ZXJ0aWNhbCBmcmVxdWVuY3kuIFRoZSBob3Jpem9udGFsIGZyZXF1ZW5jeQotKiAgICAgICAgICAgICAgIGFuZCBkb3QgY2xvY2sgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGlzCi0qICAgICAgICAgICAgICAgcm91dGluZXMuCi0qCi0qICAgICAgICAgICAgICAgRm9yIGludGVybGFjZWQgbW9kZXMgdGhlIENSVEMgcGFyYW1ldGVycyBhcmUgY2FsY3VsYXRlZCBmb3IKLSogICAgICAgICAgICAgICBhIHNpbmdsZSBmaWVsZCwgc28gd2lsbCBiZSBoYWxmIHdoYXQgd291bGQgYmUgdXNlZCBpbgotKiAgICAgICAgICAgICAgIGEgbm9uLWludGVybGFjZWQgbW9kZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgZG91YmxlICAgICAgICAgIGludGVybGFjZSx2RmllbGRSYXRlLGhQZXJpb2Q7Ci0gICAgZG91YmxlICAgICAgICAgIHRvcE1hcmdpbkxpbmVzLGJvdE1hcmdpbkxpbmVzOwotICAgIGRvdWJsZSAgICAgICAgICBsZWZ0TWFyZ2luUGl4ZWxzLHJpZ2h0TWFyZ2luUGl4ZWxzOwotICAgIGRvdWJsZSAgICAgICAgICBoUGVyaW9kRXN0LHZTeW5jQlAsdkJhY2tQb3JjaDsKLSAgICBkb3VibGUgICAgICAgICAgdlRvdGFsTGluZXMsdkZpZWxkUmF0ZUVzdDsKLSAgICBkb3VibGUgICAgICAgICAgaFRvdGFsUGl4ZWxzLGhUb3RhbEFjdGl2ZVBpeGVscyxoQmxhbmtQaXhlbHM7Ci0gICAgZG91YmxlICAgICAgICAgIGlkZWFsRHV0eUN5Y2xlLGhTeW5jV2lkdGgsaFN5bmNCUCxoQmFja1BvcmNoOwotICAgIGRvdWJsZSAgICAgICAgICBpZGVhbEhQZXJpb2Q7Ci0gICAgZG91YmxlICAgICAgICAgIHZGcmVxLGhGcmVxLGRvdENsb2NrOwotICAgIEdURl9jb25zdGFudHMgICBjOwotCi0gICAgLyogR2V0IHJvdW5kZWQgR1RGIGNvbnN0YW50cyB1c2VkIGZvciBpbnRlcm5hbCBjYWxjdWxhdGlvbnMgKi8KLSAgICBHZXRJbnRlcm5hbENvbnN0YW50cygmYyk7Ci0KLSAgICAvKiBNb3ZlIGlucHV0IHBhcmFtZXRlcnMgaW50byBhcHByb3ByaWF0ZSB2YXJpYWJsZXMgKi8KLSAgICB2RnJlcSA9IGhGcmVxID0gZG90Q2xvY2sgPSBmcmVxOwotCi0gICAgLyogUm91bmQgcGl4ZWxzIHRvIGNoYXJhY3RlciBjZWxsIGdyYW51bGFyaXR5ICovCi0gICAgaFBpeGVscyA9IHJvdW5kKGhQaXhlbHMgLyBjLmNlbGxHcmFuKSAqIGMuY2VsbEdyYW47Ci0KLSAgICAvKiBGb3IgaW50ZXJsYWNlZCBtb2RlIGhhbHZlIHRoZSB2ZXJ0aWNhbCBwYXJhbWV0ZXJzLCBhbmQgZG91YmxlCi0gICAgICogdGhlIHJlcXVpcmVkIGZpZWxkIHJlZnJlc2ggcmF0ZS4KLSAgICAgKi8KLSAgICB2RmllbGRSYXRlID0gdkZyZXE7Ci0gICAgaW50ZXJsYWNlID0gMDsKLSAgICBpZiAod2FudEludGVybGFjZSkKLQlkb3RDbG9jayAqPSAyOwotCi0gICAgLyogRGV0ZXJtaW5lIHRoZSBsaW5lcyBmb3IgbWFyZ2lucyAqLwotICAgIGlmICh3YW50TWFyZ2lucykgewotCXRvcE1hcmdpbkxpbmVzID0gcm91bmQoYy5tYXJnaW4gLyAxMDAgKiB2TGluZXMpOwotCWJvdE1hcmdpbkxpbmVzID0gcm91bmQoYy5tYXJnaW4gLyAxMDAgKiB2TGluZXMpOwotCX0KLSAgICBlbHNlIHsKLQl0b3BNYXJnaW5MaW5lcyA9IDA7Ci0JYm90TWFyZ2luTGluZXMgPSAwOwotCX0KLQotICAgIGlmICh0eXBlICE9IEdURl9sb2NrUEYpIHsKLQlpZiAodHlwZSA9PSBHVEZfbG9ja1ZGKSB7Ci0JICAgIC8qIEVzdGltYXRlIHRoZSBob3Jpem9udGFsIHBlcmlvZCAqLwotCSAgICBoUGVyaW9kRXN0ID0gKCgxL3ZGaWVsZFJhdGUpIC0gKGMubWluVlN5bmNCUC8xMDAwMDAwKSkgLwotCQkodkxpbmVzICsgKDIqdG9wTWFyZ2luTGluZXMpICsgYy5taW5Qb3JjaCArIGludGVybGFjZSkgKiAxMDAwMDAwOwotCi0JICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB2U3luYyArIGJhY2sgcG9yY2ggKi8KLQkgICAgdlN5bmNCUCA9IHJvdW5kKGMubWluVlN5bmNCUCAvIGhQZXJpb2RFc3QpOwotCSAgICB9Ci0JZWxzZSBpZiAodHlwZSA9PSBHVEZfbG9ja0hGKSB7Ci0JICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB2U3luYyArIGJhY2sgcG9yY2ggKi8KLQkgICAgdlN5bmNCUCA9IHJvdW5kKChjLm1pblZTeW5jQlAgKiBoRnJlcSkgLyAxMDAwKTsKLQkgICAgfQotCi0JLyogRmluZCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBWIGJhY2sgcG9yY2ggYWxvbmUgKi8KLQl2QmFja1BvcmNoID0gdlN5bmNCUCAtIGMudlN5bmNScWQ7Ci0KLQkvKiBGaW5kIHRoZSB0b3RhbCBudW1iZXIgb2YgbGluZXMgaW4gdGhlIHZlcnRpY2FsIHBlcmlvZCAqLwotCXZUb3RhbExpbmVzID0gdkxpbmVzICsgdG9wTWFyZ2luTGluZXMgKyBib3RNYXJnaW5MaW5lcyArIHZTeW5jQlAKLQkgICAgKyBpbnRlcmxhY2UgKyBjLm1pblBvcmNoOwotCi0JaWYgKHR5cGUgPT0gR1RGX2xvY2tWRikgewotCSAgICAvKiBFc3RpbWF0ZSB0aGUgdmVydGljYWwgZnJlcXVlbmN5ICovCi0JICAgIHZGaWVsZFJhdGVFc3QgPSAxMDAwMDAwIC8gKGhQZXJpb2RFc3QgKiB2VG90YWxMaW5lcyk7Ci0KLQkgICAgLyogRmluZCB0aGUgYWN0dWFsIGhvcml6b250YWwgcGVyaW9kICovCi0JICAgIGhQZXJpb2QgPSAoaFBlcmlvZEVzdCAqIHZGaWVsZFJhdGVFc3QpIC8gdkZpZWxkUmF0ZTsKLQotCSAgICAvKiBGaW5kIHRoZSBhY3R1YWwgdmVydGljYWwgZmllbGQgZnJlcXVlbmN5ICovCi0JICAgIHZGaWVsZFJhdGUgPSAxMDAwMDAwIC8gKGhQZXJpb2QgKiB2VG90YWxMaW5lcyk7Ci0JICAgIH0KLQllbHNlIGlmICh0eXBlID09IEdURl9sb2NrSEYpIHsKLQkgICAgLyogRmluZCB0aGUgYWN0dWFsIHZlcnRpY2FsIGZpZWxkIGZyZXF1ZW5jeSAqLwotCSAgICB2RmllbGRSYXRlID0gKGhGcmVxIC8gdlRvdGFsTGluZXMpICogMTAwMDsKLQkgICAgfQotCX0KLQotICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBwaXhlbHMgaW4gdGhlIGxlZnQgYW5kIHJpZ2h0IG1hcmdpbnMgKi8KLSAgICBpZiAod2FudE1hcmdpbnMpIHsKLQlsZWZ0TWFyZ2luUGl4ZWxzID0gcm91bmQoaFBpeGVscyAqIGMubWFyZ2luKSAvICgxMDAgKiBjLmNlbGxHcmFuKTsKLQlyaWdodE1hcmdpblBpeGVscyA9IHJvdW5kKGhQaXhlbHMgKiBjLm1hcmdpbikgLyAoMTAwICogYy5jZWxsR3Jhbik7Ci0JfQotICAgIGVsc2UgewotCWxlZnRNYXJnaW5QaXhlbHMgPSAwOwotCXJpZ2h0TWFyZ2luUGl4ZWxzID0gMDsKLQl9Ci0KLSAgICAvKiBGaW5kIHRoZSB0b3RhbCBudW1iZXIgb2YgYWN0aXZlIHBpeGVscyBpbiBpbWFnZSArIG1hcmdpbnMgKi8KLSAgICBoVG90YWxBY3RpdmVQaXhlbHMgPSBoUGl4ZWxzICsgbGVmdE1hcmdpblBpeGVscyArIHJpZ2h0TWFyZ2luUGl4ZWxzOwotCi0gICAgaWYgKHR5cGUgPT0gR1RGX2xvY2tWRikgewotCS8qIEZpbmQgdGhlIGlkZWFsIGJsYW5raW5nIGR1dHkgY3ljbGUgKi8KLQlpZGVhbER1dHlDeWNsZSA9IGMuYyAtICgoYy5tICogaFBlcmlvZCkgLyAxMDAwKTsKLQl9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBHVEZfbG9ja0hGKSB7Ci0JLyogRmluZCB0aGUgaWRlYWwgYmxhbmtpbmcgZHV0eSBjeWNsZSAqLwotCWlkZWFsRHV0eUN5Y2xlID0gYy5jIC0gKGMubSAvIGhGcmVxKTsKLQl9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBHVEZfbG9ja1BGKSB7Ci0JLyogRmluZCBpZGVhbCBob3Jpem9udGFsIHBlcmlvZCBmcm9tIGJsYW5raW5nIGR1dHkgY3ljbGUgZm9ybXVsYSAqLwotCWlkZWFsSFBlcmlvZCA9ICgoKGMuYyAtIDEwMCkgKyAoc3FydCgocG93KDEwMC1jLmMsMikpICsKLQkgICAgKDAuNCAqIGMubSAqIChoVG90YWxBY3RpdmVQaXhlbHMgKyByaWdodE1hcmdpblBpeGVscyArCi0JICAgIGxlZnRNYXJnaW5QaXhlbHMpIC8gZG90Q2xvY2spKSkpIC8gKDIgKiBjLm0pKSAqIDEwMDA7Ci0KLQkvKiBGaW5kIHRoZSBpZGVhbCBibGFua2luZyBkdXR5IGN5Y2xlICovCi0JaWRlYWxEdXR5Q3ljbGUgPSBjLmMgLSAoKGMubSAqIGlkZWFsSFBlcmlvZCkgLyAxMDAwKTsKLQl9Ci0KLSAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGluIGJsYW5raW5nIHRpbWUgKi8KLSAgICBoQmxhbmtQaXhlbHMgPSByb3VuZCgoaFRvdGFsQWN0aXZlUGl4ZWxzICogaWRlYWxEdXR5Q3ljbGUpIC8KLQkoKDEwMCAtIGlkZWFsRHV0eUN5Y2xlKSAqIGMuY2VsbEdyYW4pKSAqIGMuY2VsbEdyYW47Ci0KLSAgICAvKiBGaW5kIHRoZSB0b3RhbCBudW1iZXIgb2YgcGl4ZWxzICovCi0gICAgaFRvdGFsUGl4ZWxzID0gaFRvdGFsQWN0aXZlUGl4ZWxzICsgaEJsYW5rUGl4ZWxzOwotCi0gICAgLyogRmluZCB0aGUgaG9yaXpvbnRhbCBiYWNrIHBvcmNoICovCi0gICAgaEJhY2tQb3JjaCA9IHJvdW5kKChoQmxhbmtQaXhlbHMgLyAyKSAvIGMuY2VsbEdyYW4pICogYy5jZWxsR3JhbjsKLQotICAgIC8qIEZpbmQgdGhlIGhvcml6b250YWwgc3luYyB3aWR0aCAqLwotICAgIGhTeW5jV2lkdGggPSByb3VuZCgoKGMuaFN5bmMvMTAwKSAqIGhUb3RhbFBpeGVscykgLyBjLmNlbGxHcmFuKSAqIGMuY2VsbEdyYW47Ci0KLSAgICAvKiBGaW5kIHRoZSBob3Jpem9udGFsIHN5bmMgKyBiYWNrIHBvcmNoICovCi0gICAgaFN5bmNCUCA9IGhCYWNrUG9yY2ggKyBoU3luY1dpZHRoOwotCi0gICAgaWYgKHR5cGUgPT0gR1RGX2xvY2tQRikgewotCS8qIEZpbmQgdGhlIGhvcml6b250YWwgZnJlcXVlbmN5ICovCi0JaEZyZXEgPSAoZG90Q2xvY2sgLyBoVG90YWxQaXhlbHMpICogMTAwMDsKLQotCS8qIEZpbmQgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB2U3luYyArIGJhY2sgcG9yY2ggKi8KLQl2U3luY0JQID0gcm91bmQoKGMubWluVlN5bmNCUCAqIGhGcmVxKSAvIDEwMDApOwotCi0JLyogRmluZCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBWIGJhY2sgcG9yY2ggYWxvbmUgKi8KLQl2QmFja1BvcmNoID0gdlN5bmNCUCAtIGMudlN5bmNScWQ7Ci0KLQkvKiBGaW5kIHRoZSB0b3RhbCBudW1iZXIgb2YgbGluZXMgaW4gdGhlIHZlcnRpY2FsIHBlcmlvZCAqLwotCXZUb3RhbExpbmVzID0gdkxpbmVzICsgdG9wTWFyZ2luTGluZXMgKyBib3RNYXJnaW5MaW5lcyArIHZTeW5jQlAKLQkgICAgKyBpbnRlcmxhY2UgKyBjLm1pblBvcmNoOwotCi0JLyogRmluZCB0aGUgYWN0dWFsIHZlcnRpY2FsIGZpZWxkIGZyZXF1ZW5jeSAqLwotCXZGaWVsZFJhdGUgPSAoaEZyZXEgLyB2VG90YWxMaW5lcykgKiAxMDAwOwotCX0KLSAgICBlbHNlIHsKLQlpZiAodHlwZSA9PSBHVEZfbG9ja1ZGKSB7Ci0JICAgIC8qIEZpbmQgdGhlIGhvcml6b250YWwgZnJlcXVlbmN5ICovCi0JICAgIGhGcmVxID0gMTAwMCAvIGhQZXJpb2Q7Ci0JICAgIH0KLQllbHNlIGlmICh0eXBlID09IEdURl9sb2NrSEYpIHsKLQkgICAgLyogRmluZCB0aGUgaG9yaXpvbnRhbCBmcmVxdWVuY3kgKi8KLQkgICAgaFBlcmlvZCA9IDEwMDAgLyBoRnJlcTsKLQkgICAgfQotCi0JLyogRmluZCB0aGUgcGl4ZWwgY2xvY2sgZnJlcXVlbmN5ICovCi0JZG90Q2xvY2sgPSBoVG90YWxQaXhlbHMgLyBoUGVyaW9kOwotCX0KLQotICAgIC8qIFJldHVybiB0aGUgY29tcHV0ZWQgZnJlcXVlbmNpZXMgKi8KLSAgICB0LT52RnJlcSA9IHZGaWVsZFJhdGU7Ci0gICAgdC0+aEZyZXEgPSBoRnJlcTsKLSAgICB0LT5kb3RDbG9jayA9IGRvdENsb2NrOwotCi0gICAgLyogRGV0ZXJtaW5lIHRoZSB2ZXJ0aWNhbCB0aW1pbmcgcGFyYW1ldGVycyAqLwotICAgIHQtPmguaFRvdGFsID0gKGludCloVG90YWxQaXhlbHM7Ci0gICAgdC0+aC5oRGlzcCA9IChpbnQpaFRvdGFsQWN0aXZlUGl4ZWxzOwotICAgIHQtPmguaFN5bmNTdGFydCA9IHQtPmguaFRvdGFsIC0gKGludCloU3luY0JQOwotICAgIHQtPmguaFN5bmNFbmQgPSB0LT5oLmhUb3RhbCAtIChpbnQpaEJhY2tQb3JjaDsKLSAgICB0LT5oLmhGcm9udFBvcmNoID0gdC0+aC5oU3luY1N0YXJ0IC0gdC0+aC5oRGlzcDsKLSAgICB0LT5oLmhTeW5jV2lkdGggPSAoaW50KWhTeW5jV2lkdGg7Ci0gICAgdC0+aC5oQmFja1BvcmNoID0gKGludCloQmFja1BvcmNoOwotCi0gICAgLyogRGV0ZXJtaW5lIHRoZSB2ZXJ0aWNhbCB0aW1pbmcgcGFyYW1ldGVycyAqLwotICAgIHQtPnYudlRvdGFsID0gKGludCl2VG90YWxMaW5lczsKLSAgICB0LT52LnZEaXNwID0gKGludCl2TGluZXM7Ci0gICAgdC0+di52U3luY1N0YXJ0ID0gdC0+di52VG90YWwgLSAoaW50KXZTeW5jQlA7Ci0gICAgdC0+di52U3luY0VuZCA9IHQtPnYudlRvdGFsIC0gKGludCl2QmFja1BvcmNoOwotICAgIHQtPnYudkZyb250UG9yY2ggPSB0LT52LnZTeW5jU3RhcnQgLSB0LT52LnZEaXNwOwotICAgIHQtPnYudlN5bmNXaWR0aCA9IChpbnQpYy52U3luY1JxZDsKLSAgICB0LT52LnZCYWNrUG9yY2ggPSAoaW50KXZCYWNrUG9yY2g7Ci0gICAgaWYgKHdhbnRJbnRlcmxhY2UpIHsKLQkvKiBIYWx2ZSB0aGUgdGltaW5ncyBmb3IgaW50ZXJsYWNlZCBtb2RlcyAqLwotCXQtPnYudlRvdGFsIC89IDI7Ci0JdC0+di52RGlzcCAvPSAyOwotCXQtPnYudlN5bmNTdGFydCAvPSAyOwotCXQtPnYudlN5bmNFbmQgLz0gMjsKLQl0LT52LnZGcm9udFBvcmNoIC89IDI7Ci0JdC0+di52U3luY1dpZHRoIC89IDI7Ci0JdC0+di52QmFja1BvcmNoIC89IDI7Ci0JdC0+ZG90Q2xvY2sgLz0gMjsKLQl9Ci0KLSAgICAvKiBNYXJrIGFzIEdURiB0aW1pbmcgdXNpbmcgdGhlIHN5bmMgcG9sYXJpdGllcyAqLwotICAgIHQtPmludGVybGFjZSA9ICh3YW50SW50ZXJsYWNlKSA/ICdJJyA6ICdOJzsKLSAgICB0LT5oU3luY1BvbCA9ICctJzsKLSAgICB0LT52U3luY1BvbCA9ICcrJzsKLX0KLQotdm9pZCBHVEZfZ2V0Q29uc3RhbnRzKEdURl9jb25zdGFudHMgKmNvbnN0YW50cykKLXsgKmNvbnN0YW50cyA9IEdDOyB9Ci0KLXZvaWQgR1RGX3NldENvbnN0YW50cyhHVEZfY29uc3RhbnRzICpjb25zdGFudHMpCi17IEdDID0gKmNvbnN0YW50czsgfQotCi0jaWZkZWYgIFRFU1RJTkdfR1RGCi0KLXZvaWQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pCi17Ci0gICAgRklMRSAgICAgICAgKmY7Ci0gICAgZG91YmxlICAgICAgeFBpeGVscyx5UGl4ZWxzLGZyZXE7Ci0gICAgaWJvb2wgICAgICAgaW50ZXJsYWNlOwotICAgIEdURl90aW1pbmdzIHQ7Ci0KLSAgICBpZiAoYXJnYyAhPSA1ICYmIGFyZ2MgIT0gNikgewotCXByaW50ZigiVXNhZ2U6IEdURkNBTEMgPHhQaXhlbHM+IDx5UGl4ZWxzPiA8ZnJlcT4gW1tIel0gW0tIel0gW01Iel1dIFtJXVxuIik7Ci0JcHJpbnRmKCJcbiIpOwotCXByaW50Zigid2hlcmUgPHhQaXhlbHM+IGlzIHRoZSBob3Jpem9udGFsIHJlc29sdXRpb24gb2YgdGhlIG1vZGUsIDx5UGl4ZWxzPiBpcyB0aGVcbiIpOwotCXByaW50ZigidmVydGljYWwgcmVzb2x1dGlvbiBvZiB0aGUgbW9kZS4gVGhlIDxmcmVxPiB2YWx1ZSB3aWxsIGJlIHRoZSBmcmVxdWVuY3kgdG9cbiIpOwotCXByaW50ZigiZHJpdmUgdGhlIGNhbGN1bGF0aW9ucywgYW5kIHdpbGwgYmUgZWl0aGVyIHRoZSB2ZXJ0aWNhbCBmcmVxdWVuY3kgKGluIEh6KVxuIik7Ci0JcHJpbnRmKCJ0aGUgaG9yaXpvbnRhbCBmcmVxdWVuY3kgKGluIEtIeikgb3IgdGhlIGRvdCBjbG9jayAoaW4gTUh6KS4gVG8gZ2VuZXJhdGVcbiIpOwotCXByaW50ZigidGltaW5ncyBmb3IgYW4gaW50ZXJsYWNlZCBtb2RlLCBhZGQgJ0knIHRvIHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgbGluZS5cbiIpOwotCXByaW50ZigiXG4iKTsKLQlwcmludGYoIkZvciBleGFtcGxlIHRvIGdlbmVyYXRlIHRpbWluZ3MgZm9yIDY0MHg0ODAgYXQgNjBIeiB2ZXJ0aWNhbDpcbiIpOwotCXByaW50ZigiXG4iKTsKLQlwcmludGYoIiAgICBHVEZDQUxDIDY0MCA0ODAgNjAgSHpcbiIpOwotCXByaW50ZigiXG4iKTsKLQlwcmludGYoIkZvciBleGFtcGxlIHRvIGdlbmVyYXRlIHRpbWluZ3MgZm9yIDY0MHg0ODAgYXQgMzEuNUtIeiBob3Jpem9udGFsOlxuIik7Ci0JcHJpbnRmKCJcbiIpOwotCXByaW50ZigiICAgIEdURkNBTEMgNjQwIDQ4MCAzMS41IEtIelxuIik7Ci0JcHJpbnRmKCJcbiIpOwotCXByaW50ZigiRm9yIGV4YW1wbGUgdG8gZ2VuZXJhdGUgdGltaW5ncyBmb3IgNjQweDQ4MCB3aXRoIGEgMjUuMTc1TWh6IGRvdCBjbG9jazpcbiIpOwotCXByaW50ZigiXG4iKTsKLQlwcmludGYoIiAgICBHVEZDQUxDIDY0MCA0ODAgMjUuMTc1IE1IelxuIik7Ci0JcHJpbnRmKCJcbiIpOwotCXByaW50ZigiR1RGQ0FMQyB3aWxsIHByaW50IGEgc3VtbWFyeSBvZiB0aGUgcmVzdWx0cyBmb3VuZCwgYW5kIGR1bXAgdGhlIENSVENcbiIpOwotCXByaW50ZigidmFsdWVzIHRvIHRoZSBVVkNPTkZJRy5DUlQgZmlsZSBpbiB0aGUgZm9ybWF0IHVzZWQgYnkgU2NpVGVjaCBEaXNwbGF5IERvY3Rvci5cbiIpOwotCWV4aXQoMSk7Ci0JfQotCi0gICAgLyogR2V0IHZhbHVlcyBmcm9tIGNvbW1hbmQgbGluZSAqLwotICAgIHhQaXhlbHMgPSBhdG9mKGFyZ3ZbMV0pOwotICAgIHlQaXhlbHMgPSBhdG9mKGFyZ3ZbMl0pOwotICAgIGZyZXEgPSBhdG9mKGFyZ3ZbM10pOwotICAgIGludGVybGFjZSA9ICgoYXJnYyA9PSA2KSAmJiAoYXJndls1XVswXSA9PSAnSScpKTsKLQotICAgIC8qIENvbXB1dGUgdGhlIENSVEMgdGltaW5ncyAqLwotICAgIGlmICh0b3VwcGVyKGFyZ3ZbNF1bMF0pID09ICdIJykKLQlHVEZfY2FsY1RpbWluZ3MoeFBpeGVscyx5UGl4ZWxzLGZyZXEsR1RGX2xvY2tWRixmYWxzZSxpbnRlcmxhY2UsJnQpOwotICAgIGVsc2UgaWYgKHRvdXBwZXIoYXJndls0XVswXSkgPT0gJ0snKQotCUdURl9jYWxjVGltaW5ncyh4UGl4ZWxzLHlQaXhlbHMsZnJlcSxHVEZfbG9ja0hGLGZhbHNlLGludGVybGFjZSwmdCk7Ci0gICAgZWxzZSBpZiAodG91cHBlcihhcmd2WzRdWzBdKSA9PSAnTScpCi0JR1RGX2NhbGNUaW1pbmdzKHhQaXhlbHMseVBpeGVscyxmcmVxLEdURl9sb2NrUEYsZmFsc2UsaW50ZXJsYWNlLCZ0KTsKLSAgICBlbHNlIHsKLQlwcmludGYoIlVua25vd24gY29tbWFuZCBsaW5lIVxuIik7Ci0JZXhpdCgxKTsKLQl9Ci0KLSAgICAvKiBEdW1wIHN1bW1hcnkgaW5mbyB0byBzdGFuZGFyZCBvdXRwdXQgKi8KLSAgICBwcmludGYoIkNSVEMgdmFsdWVzIGZvciAlLjBmeCUuMGYgQCAlLjJmICVzXG4iLCB4UGl4ZWxzLCB5UGl4ZWxzLCBmcmVxLCBhcmd2WzRdKTsKLSAgICBwcmludGYoIlxuIik7Ci0gICAgcHJpbnRmKCIgIGhUb3RhbCAgICAgID0gJS00ZCAgICB2VG90YWwgICAgICA9ICUtNGRcbiIsCi0JdC5oLmhUb3RhbCwgdC52LnZUb3RhbCk7Ci0gICAgcHJpbnRmKCIgIGhEaXNwICAgICAgID0gJS00ZCAgICB2RGlzcCAgICAgICA9ICUtNGRcbiIsCi0JdC5oLmhEaXNwLCB0LnYudkRpc3ApOwotICAgIHByaW50ZigiICBoU3luY1N0YXJ0ICA9ICUtNGQgICAgdlN5bmNTdGFydCAgPSAlLTRkXG4iLAotCXQuaC5oU3luY1N0YXJ0LCB0LnYudlN5bmNTdGFydCk7Ci0gICAgcHJpbnRmKCIgIGhTeW5jRW5kICAgID0gJS00ZCAgICB2U3luY0VuZCAgICA9ICUtNGRcbiIsCi0JdC5oLmhTeW5jRW5kLCB0LnYudlN5bmNFbmQpOwotICAgIHByaW50ZigiICBoRnJvbnRQb3JjaCA9ICUtNGQgICAgdkZyb250UG9yY2ggPSAlLTRkXG4iLAotCXQuaC5oRnJvbnRQb3JjaCwgdC52LnZGcm9udFBvcmNoKTsKLSAgICBwcmludGYoIiAgaFN5bmNXaWR0aCAgPSAlLTRkICAgIHZTeW5jV2lkdGggID0gJS00ZFxuIiwKLQl0LmguaFN5bmNXaWR0aCwgdC52LnZTeW5jV2lkdGgpOwotICAgIHByaW50ZigiICBoQmFja1BvcmNoICA9ICUtNGQgICAgdkJhY2tQb3JjaCAgPSAlLTRkXG4iLAotCXQuaC5oQmFja1BvcmNoLCB0LnYudkJhY2tQb3JjaCk7Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHByaW50ZigiICBJbnRlcmxhY2VkICA9ICVzXG4iLCAodC5pbnRlcmxhY2UgPT0gJ0knKSA/ICJZZXMiIDogIk5vIik7Ci0gICAgcHJpbnRmKCIgIEggc3luYyBwb2wgID0gJWNcbiIsIHQuaFN5bmNQb2wpOwotICAgIHByaW50ZigiICBWIHN5bmMgcG9sICA9ICVjXG4iLCB0LnZTeW5jUG9sKTsKLSAgICBwcmludGYoIlxuIik7Ci0gICAgcHJpbnRmKCIgIFZlcnQgZnJlcSAgID0gJS4yZiBIelxuIiwgdC52RnJlcSk7Ci0gICAgcHJpbnRmKCIgIEhvcml6IGZyZXEgID0gJS4yZiBLSHpcbiIsIHQuaEZyZXEpOwotICAgIHByaW50ZigiICBEb3QgQ2xvY2sgICA9ICUuMmYgTWh6XG4iLCAgICB0LmRvdENsb2NrKTsKLQotICAgIC8qIER1bXAgdG8gZmlsZSBpbiBmb3JtYXQgdXNlZCBieSBTY2lUZWNoIERpc3BsYXkgRG9jdG9yICovCi0gICAgaWYgKChmID0gZm9wZW4oIlVWQ09ORklHLkNSVCIsInciKSkgIT0gTlVMTCkgewotCWZwcmludGYoZiwgIlslLjBmICUuMGZdXG4iLCB4UGl4ZWxzLCB5UGl4ZWxzKTsKLQlmcHJpbnRmKGYsICIlZCAlZCAlZCAlZCAnJWMnICVzXG4iLAotCSAgICB0LmguaFRvdGFsLCB0LmguaERpc3AsCi0JICAgIHQuaC5oU3luY1N0YXJ0LCB0LmguaFN5bmNFbmQsCi0JICAgIHQuaFN5bmNQb2wsICh0LmludGVybGFjZSA9PSAnSScpID8gIkkiIDogIk5JIik7Ci0JZnByaW50ZihmLCAiJWQgJWQgJWQgJWQgJyVjJ1xuIiwKLQkgICAgdC52LnZUb3RhbCwgdC52LnZEaXNwLAotCSAgICB0LnYudlN5bmNTdGFydCwgdC52LnZTeW5jRW5kLAotCSAgICB0LnZTeW5jUG9sKTsKLQlmcHJpbnRmKGYsICIlLjJmXG4iLCB0LmRvdENsb2NrKTsKLQlmY2xvc2UoZik7Ci0JfQotfQotCi0jZW5kaWYgIC8qIFRFU1RJTkcgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9saWJjaW1wLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vbGliY2ltcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjczYWQ1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9saWJjaW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTUdMIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIHRvIGltcGxlbWVudCBhIHRoZSBPUyBzcGVjaWZpYyBzaWRlIG9mIHRoZSBCaW5hcnkKLSogICAgICAgICAgICAgICBQb3J0YWJsZSBETEwgQyBydW50aW1lIGxpYnJhcnkuIFRoZSBmdW5jdGlvbnMgaW4gaGVyZQotKiAgICAgICAgICAgICAgIGFyZSBpbXBvcnRlZCBpbnRvIHRoZSBCaW5hcnkgUG9ydGFibGUgRExMJ3MgdG8gaW1wbGVtZW50Ci0qICAgICAgICAgICAgICAgT1Mgc3BlY2lmaWMgc2VydmljZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpZiBkZWZpbmVkKF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlICJkcnZsaWIvcGVsb2FkZXIuaCIKLSNpbmNsdWRlICJkcnZsaWIvYXR0cmliLmgiCi0jaW5jbHVkZSAiZHJ2bGliL2xpYmMvaW5pdC5oIgotI2RlZmluZSBfX0JVSUxESU5HX1BFX0xPQURFUl9fCi0jaW5jbHVkZSAiZHJ2bGliL2xpYmMvZmlsZS5oIgotI2lmIGRlZmluZWQoX19XSU4zMl9WWERfXykKLSNpbmNsdWRlICJ2eGRmaWxlLmgiCi0jZW5kaWYKLSNlbHNlCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxtYWxsb2MuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fVU5JWF9fKQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZWxzZQotI2luY2x1ZGUgPGlvLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJkcnZsaWIvYXR0cmliLmgiCi0jaW5jbHVkZSAiZHJ2bGliL2xpYmMvaW5pdC5oIgotI2RlZmluZSBfX0JVSUxESU5HX1BFX0xPQURFUl9fCi0jaW5jbHVkZSAiZHJ2bGliL2xpYmMvZmlsZS5oIgotI2lmIGRlZmluZWQoX19XSU5ET1dTX18pIHx8IGRlZmluZWQoVE5UKSB8fCBkZWZpbmVkKF9fUlRUQVJHRVRfXykKLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2RlZmluZSBTVFJJQ1QKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLSNpZmRlZiAgX19NU0RPU19fCi0jaW5jbHVkZSA8ZG9zLmg+Ci0jZW5kaWYKLSNpZmRlZiAgX19PUzJfXwotI2RlZmluZSBJTkNMX0RPUwotI2RlZmluZSBJTkNMX0RPU0VSUk9SUwotI2RlZmluZSBJTkNMX1NVQgotI2luY2x1ZGUgPG9zMi5oPgotI2VuZGlmCi0jZW5kaWYKLQotLyogTm8gdGV4dCBvciBiaW5hcnkgbW9kZXMgZm9yIFVuaXggKi8KLQotI2lmbmRlZiBPX0JJTkFSWQotI2RlZmluZSBPX0JJTkFSWSAgICAwCi0jZGVmaW5lIE9fVEVYVCAgICAgIDAKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0jZGVmaW5lIE1BWF9GSUxFUyAgIDE2Ci1zdGF0aWMgRklMRSAqb3BlbkhhbmRsZXNbTUFYX0ZJTEVTXSA9IHtOVUxMfTsKLSNlbmRpZgotCi0vKiA8c3RkbGliLmg+IHN0dWIgZnVuY3Rpb25zICovCi12b2lkICAgIF9DREVDTCBzdHViX2Fib3J0KHZvaWQpOwotaW50ICAgICBfQ0RFQ0wgc3R1Yl9hdGV4aXQodm9pZCAoKikodm9pZCkpOwotdm9pZCAqICBfQ0RFQ0wgc3R1Yl9jYWxsb2Moc2l6ZV90IF9uZWxlbSwgc2l6ZV90IF9zaXplKTsKLXZvaWQgICAgX0NERUNMIHN0dWJfZXhpdChpbnQgX3N0YXR1cyk7Ci12b2lkICAgIF9DREVDTCBzdHViX2ZyZWUodm9pZCAqX3B0cik7Ci1jaGFyICogIF9DREVDTCBzdHViX2dldGVudihjb25zdCBjaGFyICpfbmFtZSk7Ci12b2lkICogIF9DREVDTCBzdHViX21hbGxvYyhzaXplX3QgX3NpemUpOwotdm9pZCAqICBfQ0RFQ0wgc3R1Yl9yZWFsbG9jKHZvaWQgKl9wdHIsIHNpemVfdCBfc2l6ZSk7Ci1pbnQgICAgIF9DREVDTCBzdHViX3N5c3RlbShjb25zdCBjaGFyICpfcyk7Ci1pbnQgICAgIF9DREVDTCBzdHViX3B1dGVudihjb25zdCBjaGFyICpfdmFsKTsKLQotLyogPGxpYmMvZmlsZS5oPiBzdHViIGZ1bmN0aW9ucyAqLwotaW50ICAgICBfQ0RFQ0wgc3R1Yl9vcGVuKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX29mbGFnLCB1bnNpZ25lZCBfbW9kZSk7Ci1pbnQgICAgIF9DREVDTCBzdHViX2FjY2Vzcyhjb25zdCBjaGFyICpfcGF0aCwgaW50IF9hbW9kZSk7Ci1pbnQgICAgIF9DREVDTCBzdHViX2Nsb3NlKGludCBfZmlsZGVzKTsKLW9mZl90ICAgX0NERUNMIHN0dWJfbHNlZWsoaW50IF9maWxkZXMsIG9mZl90IF9vZmZzZXQsIGludCBfd2hlbmNlKTsKLXNpemVfdCAgX0NERUNMIHN0dWJfcmVhZChpbnQgX2ZpbGRlcywgdm9pZCAqX2J1Ziwgc2l6ZV90IF9uYnl0ZSk7Ci1pbnQgICAgIF9DREVDTCBzdHViX3VubGluayhjb25zdCBjaGFyICpfcGF0aCk7Ci1zaXplX3QgIF9DREVDTCBzdHViX3dyaXRlKGludCBfZmlsZGVzLCBjb25zdCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKTsKLWludCAgICAgX0NERUNMIHN0dWJfaXNhdHR5KGludCBfZmlsZGVzKTsKLQotLyogPHN0ZGlvLmg+IHN0dWIgZnVuY3Rpb25zICovCi1pbnQgICAgIF9DREVDTCBzdHViX3JlbW92ZShjb25zdCBjaGFyICpfZmlsZW5hbWUpOwotaW50ICAgICBfQ0RFQ0wgc3R1Yl9yZW5hbWUoY29uc3QgY2hhciAqX29sZCwgY29uc3QgY2hhciAqX25ldyk7Ci0KLS8qIDx0aW1lLmg+IHN0dWIgZnVuY3Rpb25zICovCi10aW1lX3QgIF9DREVDTCBzdHViX3RpbWUodGltZV90ICpfdG9kKTsKLQotLyogPHNpZ25hbC5oPiBzdHViIGZ1bmN0aW9ucyAqLwotaW50ICAgICBfQ0RFQ0wgc3R1Yl9yYWlzZShpbnQpOwotdm9pZCAqICBfQ0RFQ0wgc3R1Yl9zaWduYWwoaW50LCB2b2lkICopOwotCi0vKiA8ZHJ2bGliL2F0dHJpYi5oPiBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgc3R1Yl9PU19zZXRmaWxlYXR0ciAgICBfT1Nfc2V0ZmlsZWF0dHIKLSNkZWZpbmUgc3R1Yl9PU19nZXRjdXJyZW50ZGF0ZSBfT1NfZ2V0Y3VycmVudGRhdGUKLQotTElCQ19pbXBvcnRzICAgIF9WQVJBUEkgX19faW1wb3J0cyA9IHsKLSAgICBzaXplb2YoTElCQ19pbXBvcnRzKSwKLQotICAgIC8qIDxzdGRsaWIuaD4gZXhwb3J0cyAqLwotICAgIHN0dWJfYWJvcnQsCi0gICAgc3R1Yl9hdGV4aXQsCi0gICAgc3R1Yl9jYWxsb2MsCi0gICAgc3R1Yl9leGl0LAotICAgIHN0dWJfZnJlZSwKLSAgICBzdHViX2dldGVudiwKLSAgICBzdHViX21hbGxvYywKLSAgICBzdHViX3JlYWxsb2MsCi0gICAgc3R1Yl9zeXN0ZW0sCi0gICAgc3R1Yl9wdXRlbnYsCi0KLSAgICAvKiA8bGliYy9maWxlLmg+IGV4cG9ydHMgKi8KLSAgICBzdHViX29wZW4sCi0gICAgc3R1Yl9hY2Nlc3MsCi0gICAgc3R1Yl9jbG9zZSwKLSAgICBzdHViX2xzZWVrLAotICAgIHN0dWJfcmVhZCwKLSAgICBzdHViX3VubGluaywKLSAgICBzdHViX3dyaXRlLAotICAgIHN0dWJfaXNhdHR5LAotCi0gICAgLyogPHN0ZGlvLmg+IGV4cG9ydHMgKi8KLSAgICBzdHViX3JlbW92ZSwKLSAgICBzdHViX3JlbmFtZSwKLQotICAgIC8qIDxzaWduYWwuaD4gZnVuY3Rpb25zICovCi0gICAgc3R1Yl9yYWlzZSwKLSAgICBzdHViX3NpZ25hbCwKLQotICAgIC8qIDx0aW1lLmg+IGV4cG9ydHMgKi8KLSAgICBzdHViX3RpbWUsCi0KLSAgICAvKiA8ZHJ2bGliL2F0dHJpYi5oPiBleHBvcnRzICovCi0gICAgc3R1Yl9PU19zZXRmaWxlYXR0ciwKLSAgICBzdHViX09TX2dldGN1cnJlbnRkYXRlLAotICAgIH07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdHViIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIDxzdGRsaWIuaD4gc3R1YiBmdW5jdGlvbnMgKi8KLXZvaWQgX0NERUNMIHN0dWJfYWJvcnQodm9pZCkKLXsKLSNpZiAhZGVmaW5lZCggX19XSU4zMl9WWERfXykgJiYgIWRlZmluZWQoX19OVF9EUklWRVJfXykKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLWludCBfQ0RFQ0wgc3R1Yl9hdGV4aXQodm9pZCAoKmZ1bmMpKHZvaWQpKQotewotI2lmICFkZWZpbmVkKCBfX1dJTjMyX1ZYRF9fKSAmJiAhZGVmaW5lZChfX05UX0RSSVZFUl9fKQotICAgIHJldHVybiBhdGV4aXQoKHZvaWQoKikodm9pZCkpZnVuYyk7Ci0jZWxzZQotICAgIHJldHVybiAtMTsKLSNlbmRpZgotfQotCi12b2lkICogX0NERUNMIHN0dWJfY2FsbG9jKHNpemVfdCBfbmVsZW0sIHNpemVfdCBfc2l6ZSkKLXsgcmV0dXJuIF9fUE1fY2FsbG9jKF9uZWxlbSxfc2l6ZSk7IH0KLQotdm9pZCBfQ0RFQ0wgc3R1Yl9leGl0KGludCBfc3RhdHVzKQotewotI2lmICFkZWZpbmVkKCBfX1dJTjMyX1ZYRF9fKSAmJiAhZGVmaW5lZChfX05UX0RSSVZFUl9fKQotICAgIGV4aXQoX3N0YXR1cyk7Ci0jZW5kaWYKLX0KLQotdm9pZCBfQ0RFQ0wgc3R1Yl9mcmVlKHZvaWQgKl9wdHIpCi17IF9fUE1fZnJlZShfcHRyKTsgfQotCi1jaGFyICogX0NERUNMIHN0dWJfZ2V0ZW52KGNvbnN0IGNoYXIgKl9uYW1lKQotewotI2lmIGRlZmluZWQoIF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKLSAgICByZXR1cm4gTlVMTDsKLSNlbHNlCi0gICAgcmV0dXJuIGdldGVudihfbmFtZSk7Ci0jZW5kaWYKLX0KLQotdm9pZCAqIF9DREVDTCBzdHViX21hbGxvYyhzaXplX3QgX3NpemUpCi17IHJldHVybiBfX1BNX21hbGxvYyhfc2l6ZSk7IH0KLQotdm9pZCAqIF9DREVDTCBzdHViX3JlYWxsb2Modm9pZCAqX3B0ciwgc2l6ZV90IF9zaXplKQoteyByZXR1cm4gX19QTV9yZWFsbG9jKF9wdHIsX3NpemUpOyB9Ci0KLWludCBfQ0RFQ0wgc3R1Yl9zeXN0ZW0oY29uc3QgY2hhciAqX3MpCi17Ci0jaWYgZGVmaW5lZChfX1dJTkRPV1NfXykgfHwgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pIHx8IGRlZmluZWQoX19TTVgzMl9fKSB8fCBkZWZpbmVkKF9fUlRUQVJHRVRfXykKLSAgICAodm9pZClfczsKLSAgICByZXR1cm4gLTE7Ci0jZWxzZQotICAgIHJldHVybiBzeXN0ZW0oX3MpOwotI2VuZGlmCi19Ci0KLWludCBfQ0RFQ0wgc3R1Yl9wdXRlbnYoY29uc3QgY2hhciAqX3ZhbCkKLXsKLSNpZiBkZWZpbmVkKCBfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0gICAgcmV0dXJuIC0xOwotI2Vsc2UKLSAgICByZXR1cm4gcHV0ZW52KChjaGFyKilfdmFsKTsKLSNlbmRpZgotfQotCi10aW1lX3QgX0NERUNMIHN0dWJfdGltZSh0aW1lX3QgKl90b2QpCi17Ci0jaWYgZGVmaW5lZCggX19XSU4zMl9WWERfXykgfHwgZGVmaW5lZChfX05UX0RSSVZFUl9fKQotICAgIHJldHVybiAwOwotI2Vsc2UKLSAgICByZXR1cm4gdGltZShfdG9kKTsKLSNlbmRpZgotfQotCi0jaWYgICAgIGRlZmluZWQoX19NU0RPU19fKQotCi0jaWYgZGVmaW5lZChUTlQpICYmIGRlZmluZWQoX01TQ19WRVIpCi0KLXZvaWQgX0NERUNMIF9PU19zZXRmaWxlYXR0cihjb25zdCBjaGFyICpmaWxlbmFtZSx1bnNpZ25lZCBhdHRyaWIpCi17IFNldEZpbGVBdHRyaWJ1dGVzKChMUFNUUilmaWxlbmFtZSwgKERXT1JEKWF0dHJpYik7IH0KLQotI2Vsc2UKLQotdm9pZCBfQ0RFQ0wgX09TX3NldGZpbGVhdHRyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLHVuc2lnbmVkIGF0dHJpYikKLXsgX2Rvc19zZXRmaWxlYXR0cihmaWxlbmFtZSxhdHRyaWIpOyB9Ci0KLSNlbmRpZgotCi0jZWxpZiAgIGRlZmluZWQoX19XSU4zMl9WWERfXykKLQotI2RlZmluZSBVU0VfTE9DQUxfRklMRUlPCi0jZGVmaW5lIFVTRV9MT0NBTF9HRVREQVRFCi0KLS8qIDxsaWJjL2ZpbGUuaD4gc3R1YiBmdW5jdGlvbnMgKi8KLWludCBfQ0RFQ0wgc3R1Yl9vcGVuKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX29mbGFnLCB1bnNpZ25lZCBfbW9kZSkKLXsKLSAgICBjaGFyICAgIG1vZGVbMTBdOwotICAgIGludCAgICAgaTsKLQotICAgIC8qIEZpbmQgYW4gZW1wdHkgZmlsZSBoYW5kbGUgdG8gdXNlICovCi0gICAgZm9yIChpID0gMzsgaSA8IE1BWF9GSUxFUzsgaSsrKSB7Ci0JaWYgKCFvcGVuSGFuZGxlc1tpXSkKLQkgICAgYnJlYWs7Ci0JfQotICAgIGlmIChvcGVuSGFuZGxlc1tpXSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAvKiBGaW5kIHRoZSBvcGVuIGZsYWdzIHRvIHVzZSAqLwotICAgIGlmIChfb2ZsYWcgJiBfX19PX1RSVU5DKQotCXN0cmNweShtb2RlLCJ3Iik7Ci0gICAgZWxzZSBpZiAoX29mbGFnICYgX19fT19DUkVBVCkKLQlzdHJjcHkobW9kZSwiYSIpOwotICAgIGVsc2UKLQlzdHJjcHkobW9kZSwiciIpOwotICAgIGlmIChfb2ZsYWcgJiBfX19PX0JJTkFSWSkKLQlzdHJjYXQobW9kZSwiYiIpOwotICAgIGlmIChfb2ZsYWcgJiBfX19PX1RFWFQpCi0Jc3RyY2F0KG1vZGUsInQiKTsKLQotICAgIC8qIE9wZW4gdGhlIGZpbGUgYW5kIHN0b3JlIHRoZSBmaWxlIGhhbmRsZSAqLwotICAgIGlmICgob3BlbkhhbmRsZXNbaV0gPSBmb3BlbihfcGF0aCxtb2RlKSkgPT0gTlVMTCkKLQlyZXR1cm4gLTE7Ci0gICAgcmV0dXJuIGk7Ci19Ci0KLWludCBfQ0RFQ0wgc3R1Yl9hY2Nlc3MoY29uc3QgY2hhciAqX3BhdGgsIGludCBfYW1vZGUpCi17IHJldHVybiAtMTsgfQotCi1pbnQgX0NERUNMIHN0dWJfY2xvc2UoaW50IF9maWxkZXMpCi17Ci0gICAgaWYgKF9maWxkZXMgPj0gMyAmJiBvcGVuSGFuZGxlc1tfZmlsZGVzXSkgewotCWZjbG9zZShvcGVuSGFuZGxlc1tfZmlsZGVzXSk7Ci0Jb3BlbkhhbmRsZXNbX2ZpbGRlc10gPSBOVUxMOwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotb2ZmX3QgX0NERUNMIHN0dWJfbHNlZWsoaW50IF9maWxkZXMsIG9mZl90IF9vZmZzZXQsIGludCBfd2hlbmNlKQotewotICAgIGlmIChfZmlsZGVzID49IDMpIHsKLQlmc2VlayhvcGVuSGFuZGxlc1tfZmlsZGVzXSxfb2Zmc2V0LF93aGVuY2UpOwotCXJldHVybiBmdGVsbChvcGVuSGFuZGxlc1tfZmlsZGVzXSk7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1zaXplX3QgX0NERUNMIHN0dWJfcmVhZChpbnQgX2ZpbGRlcywgdm9pZCAqX2J1Ziwgc2l6ZV90IF9uYnl0ZSkKLXsKLSAgICBpZiAoX2ZpbGRlcyA+PSAzKQotCXJldHVybiBmcmVhZChfYnVmLDEsX25ieXRlLG9wZW5IYW5kbGVzW19maWxkZXNdKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IF9DREVDTCBzdHViX3VubGluayhjb25zdCBjaGFyICpfcGF0aCkKLXsKLSAgICBXT1JEIGVycm9yOwotCi0gICAgaWYgKGluaXRDb21wbGV0ZSkgewotCWlmIChSMF9EZWxldGVGaWxlKChjaGFyKilfcGF0aCwwLCZlcnJvcikpCi0JICAgIHJldHVybiAwOwotCXJldHVybiAtMTsKLQl9Ci0gICAgZWxzZQotCXJldHVybiBpX3JlbW92ZShfcGF0aCk7Ci19Ci0KLXNpemVfdCBfQ0RFQ0wgc3R1Yl93cml0ZShpbnQgX2ZpbGRlcywgY29uc3Qgdm9pZCAqX2J1Ziwgc2l6ZV90IF9uYnl0ZSkKLXsKLSAgICBpZiAoX2ZpbGRlcyA+PSAzKQotCXJldHVybiBmd3JpdGUoX2J1ZiwxLF9uYnl0ZSxvcGVuSGFuZGxlc1tfZmlsZGVzXSk7Ci0gICAgcmV0dXJuIF9uYnl0ZTsKLX0KLQotaW50IF9DREVDTCBzdHViX2lzYXR0eShpbnQgX2ZpbGRlcykKLXsgcmV0dXJuIDA7IH0KLQotLyogPHN0ZGlvLmg+IHN0dWIgZnVuY3Rpb25zICovCi1pbnQgX0NERUNMIHN0dWJfcmVtb3ZlKGNvbnN0IGNoYXIgKl9maWxlbmFtZSkKLXsgcmV0dXJuIHN0dWJfdW5saW5rKF9maWxlbmFtZSk7IH0KLQotaW50IF9DREVDTCBzdHViX3JlbmFtZShjb25zdCBjaGFyICpfb2xkLCBjb25zdCBjaGFyICpfbmV3KQoteyByZXR1cm4gLTE7IH0KLQotdm9pZCBfQ0RFQ0wgX09TX3NldGZpbGVhdHRyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLHVuc2lnbmVkIGF0dHJpYikKLXsKLSAgICBXT1JEIGVycm9yOwotICAgIGlmIChpbml0Q29tcGxldGUpCi0JUjBfU2V0RmlsZUF0dHJpYnV0ZXMoKGNoYXIqKWZpbGVuYW1lLGF0dHJpYiwmZXJyb3IpOwotfQotCi0vKiBSZXR1cm4gdGhlIGN1cnJlbnQgZGF0ZSBpbiBkYXlzIHNpbmNlIDEvMS8xOTgwICovCi11bG9uZyBfQ0RFQ0wgX09TX2dldGN1cnJlbnRkYXRlKHZvaWQpCi17Ci0gICAgRFdPUkQgICBkYXRlOwotICAgIFZURF9HZXRfRGF0ZV9BbmRfVGltZSgmZGF0ZSk7Ci0gICAgcmV0dXJuIGRhdGU7Ci19Ci0KLSNlbGlmICAgZGVmaW5lZChfX05UX0RSSVZFUl9fKQotCi0jZGVmaW5lIFVTRV9MT0NBTF9GSUxFSU8KLSNkZWZpbmUgVVNFX0xPQ0FMX0dFVERBVEUKLQotLyogPGxpYmMvZmlsZS5oPiBzdHViIGZ1bmN0aW9ucyAqLwotaW50IF9DREVDTCBzdHViX29wZW4oY29uc3QgY2hhciAqX3BhdGgsIGludCBfb2ZsYWcsIHVuc2lnbmVkIF9tb2RlKQotewotICAgIGNoYXIgICAgbW9kZVsxMF07Ci0gICAgaW50ICAgICBpOwotCi0gICAgLyogRmluZCBhbiBlbXB0eSBmaWxlIGhhbmRsZSB0byB1c2UgKi8KLSAgICBmb3IgKGkgPSAzOyBpIDwgTUFYX0ZJTEVTOyBpKyspIHsKLQlpZiAoIW9wZW5IYW5kbGVzW2ldKQotCSAgICBicmVhazsKLQl9Ci0gICAgaWYgKG9wZW5IYW5kbGVzW2ldKQotCXJldHVybiAtMTsKLQotICAgIC8qIEZpbmQgdGhlIG9wZW4gZmxhZ3MgdG8gdXNlICovCi0gICAgaWYgKF9vZmxhZyAmIF9fX09fVFJVTkMpCi0Jc3RyY3B5KG1vZGUsInciKTsKLSAgICBlbHNlIGlmIChfb2ZsYWcgJiBfX19PX0NSRUFUKQotCXN0cmNweShtb2RlLCJhIik7Ci0gICAgZWxzZQotCXN0cmNweShtb2RlLCJyIik7Ci0gICAgaWYgKF9vZmxhZyAmIF9fX09fQklOQVJZKQotCXN0cmNhdChtb2RlLCJiIik7Ci0gICAgaWYgKF9vZmxhZyAmIF9fX09fVEVYVCkKLQlzdHJjYXQobW9kZSwidCIpOwotCi0gICAgLyogT3BlbiB0aGUgZmlsZSBhbmQgc3RvcmUgdGhlIGZpbGUgaGFuZGxlICovCi0gICAgaWYgKChvcGVuSGFuZGxlc1tpXSA9IGZvcGVuKF9wYXRoLG1vZGUpKSA9PSBOVUxMKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gaTsKLX0KLQotaW50IF9DREVDTCBzdHViX2Nsb3NlKGludCBfZmlsZGVzKQotewotICAgIGlmIChfZmlsZGVzID49IDMgJiYgb3BlbkhhbmRsZXNbX2ZpbGRlc10pIHsKLQlmY2xvc2Uob3BlbkhhbmRsZXNbX2ZpbGRlc10pOwotCW9wZW5IYW5kbGVzW19maWxkZXNdID0gTlVMTDsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLW9mZl90IF9DREVDTCBzdHViX2xzZWVrKGludCBfZmlsZGVzLCBvZmZfdCBfb2Zmc2V0LCBpbnQgX3doZW5jZSkKLXsKLSAgICBpZiAoX2ZpbGRlcyA+PSAzKSB7Ci0JZnNlZWsob3BlbkhhbmRsZXNbX2ZpbGRlc10sX29mZnNldCxfd2hlbmNlKTsKLQlyZXR1cm4gZnRlbGwob3BlbkhhbmRsZXNbX2ZpbGRlc10pOwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotc2l6ZV90IF9DREVDTCBzdHViX3JlYWQoaW50IF9maWxkZXMsIHZvaWQgKl9idWYsIHNpemVfdCBfbmJ5dGUpCi17Ci0gICAgaWYgKF9maWxkZXMgPj0gMykKLQlyZXR1cm4gZnJlYWQoX2J1ZiwxLF9uYnl0ZSxvcGVuSGFuZGxlc1tfZmlsZGVzXSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXNpemVfdCBfQ0RFQ0wgc3R1Yl93cml0ZShpbnQgX2ZpbGRlcywgY29uc3Qgdm9pZCAqX2J1Ziwgc2l6ZV90IF9uYnl0ZSkKLXsKLSAgICBpZiAoX2ZpbGRlcyA+PSAzKQotCXJldHVybiBmd3JpdGUoX2J1ZiwxLF9uYnl0ZSxvcGVuSGFuZGxlc1tfZmlsZGVzXSk7Ci0gICAgcmV0dXJuIF9uYnl0ZTsKLX0KLQotaW50IF9DREVDTCBzdHViX2FjY2Vzcyhjb25zdCBjaGFyICpfcGF0aCwgaW50IF9hbW9kZSkKLXsgcmV0dXJuIC0xOyB9Ci0KLWludCBfQ0RFQ0wgc3R1Yl9pc2F0dHkoaW50IF9maWxkZXMpCi17IHJldHVybiAwOyB9Ci0KLWludCBfQ0RFQ0wgc3R1Yl91bmxpbmsoY29uc3QgY2hhciAqX3BhdGgpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgcmV0dXJuIC0xOwotfQotCi0vKiA8c3RkaW8uaD4gc3R1YiBmdW5jdGlvbnMgKi8KLWludCBfQ0RFQ0wgc3R1Yl9yZW1vdmUoY29uc3QgY2hhciAqX2ZpbGVuYW1lKQoteyByZXR1cm4gc3R1Yl91bmxpbmsoX2ZpbGVuYW1lKTsgfQotCi1pbnQgX0NERUNMIHN0dWJfcmVuYW1lKGNvbnN0IGNoYXIgKl9vbGQsIGNvbnN0IGNoYXIgKl9uZXcpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgcmV0dXJuIC0xOwotfQotCi12b2lkIF9DREVDTCBfT1Nfc2V0ZmlsZWF0dHIoY29uc3QgY2hhciAqZmlsZW5hbWUsdW5zaWduZWQgYXR0cmliKQotewotICAgIHVpbnQgX2F0dHIgPSAwOwotICAgIGlmIChhdHRyaWIgJiBfX0FfUkRPTkxZKQotCV9hdHRyIHw9IEZJTEVfQVRUUklCVVRFX1JFQURPTkxZOwotICAgIGlmIChhdHRyaWIgJiBfX0FfSElEREVOKQotCV9hdHRyIHw9IEZJTEVfQVRUUklCVVRFX0hJRERFTjsKLSAgICBpZiAoYXR0cmliICYgX19BX1NZU1RFTSkKLQlfYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9TWVNURU07Ci0gICAgUE1fc2V0RmlsZUF0dHIoZmlsZW5hbWUsX2F0dHIpOwotfQotCi0vKiBSZXR1cm4gdGhlIGN1cnJlbnQgZGF0ZSBpbiBkYXlzIHNpbmNlIDEvMS8xOTgwICovCi11bG9uZyBfQ0RFQ0wgX09TX2dldGN1cnJlbnRkYXRlKHZvaWQpCi17Ci0gICAgVElNRV9GSUVMRFMgdG07Ci0gICAgX2ludDY0ICAgICAgY291bnQsY291bnRfMV8xXzE5ODA7Ci0KLSAgICB0bS5ZZWFyICAgICAgICAgPSAxOTgwOwotICAgIHRtLk1vbnRoICAgICAgICA9IDE7Ci0gICAgdG0uRGF5ICAgICAgICAgID0gMTsKLSAgICB0bS5Ib3VyICAgICAgICAgPSAwOwotICAgIHRtLk1pbnV0ZSAgICAgICA9IDA7Ci0gICAgdG0uU2Vjb25kICAgICAgID0gMDsKLSAgICB0bS5NaWxsaXNlY29uZHMgPSAwOwotICAgIHRtLldlZWtkYXkgICAgICA9IDA7Ci0gICAgUnRsVGltZUZpZWxkc1RvVGltZSgmdG0sKFBMQVJHRV9JTlRFR0VSKSZjb3VudF8xXzFfMTk4MCk7Ci0gICAgS2VRdWVyeVN5c3RlbVRpbWUoKFBMQVJHRV9JTlRFR0VSKSZjb3VudCk7Ci0gICAgcmV0dXJuICh1bG9uZykoIChjb3VudCAtIGNvdW50XzFfMV8xOTgwKSAvICgoX2ludDY0KTI0ICogKF9pbnQ2NCkzNjAwICogKF9pbnQ2NCkxMDAwMDAwMCkgKTsKLX0KLQotI2VsaWYgICBkZWZpbmVkKF9fV0lORE9XUzMyX18pIHx8IGRlZmluZWQoX19SVFRBUkdFVF9fKQotCi12b2lkIF9DREVDTCBfT1Nfc2V0ZmlsZWF0dHIoY29uc3QgY2hhciAqZmlsZW5hbWUsdW5zaWduZWQgYXR0cmliKQoteyBTZXRGaWxlQXR0cmlidXRlcygoTFBTVFIpZmlsZW5hbWUsIChEV09SRClhdHRyaWIpOyB9Ci0KLSNlbGlmICAgZGVmaW5lZChfX09TMl9fKQotCi0jZGVmaW5lIFVTRV9MT0NBTF9GSUxFSU8KLQotI2lmbmRlZiBXX09LCi0jZGVmaW5lIFdfT0sgICAgICAgICAgICAgICAgICAgIDB4MDIKLSNlbmRpZgotCi12b2lkIF9DREVDTCBfT1Nfc2V0ZmlsZWF0dHIoY29uc3QgY2hhciAqZmlsZW5hbWUsdW5zaWduZWQgYXR0cmliKQotewotICAgIEZJTEVTVEFUVVMzIHM7Ci0gICAgaWYgKERvc1F1ZXJ5UGF0aEluZm8oKFBTWilmaWxlbmFtZSxGSUxfU1RBTkRBUkQsKFBWT0lEKSZzLHNpemVvZihzKSkpCi0JcmV0dXJuOwotICAgIHMuYXR0ckZpbGUgPSBhdHRyaWI7Ci0gICAgRG9zU2V0UGF0aEluZm8oKFBTWilmaWxlbmFtZSxGSUxfU1RBTkRBUkQsKFBWT0lEKSZzLHNpemVvZihzKSwwTCk7Ci19Ci0KLS8qIDxsaWJjL2ZpbGUuaD4gc3R1YiBmdW5jdGlvbnMgKi8KLQotI2RlZmluZSBCVUZfU0laRSAgICA0MDk2Ci0KLS8qIE5vdGU6IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3RhbmRhcmQgVW5peC1pc2ggaGFuZGxlLWJhc2VkIEkvTyBpc24ndAotICogICAgICAgY29tcGxldGUgLSBidXQgdGhhdCB3YXNuJ3QgdGhlIGludGVudCBlaXRoZXIuIE5vdGUgYWxzbyB0aGF0IHdlCi0gKiAgICAgICBkb24ndCBwcmVzZW50bHkgc3VwcG9ydCB0ZXh0IGZpbGUgSS9PLCBzbyBhbGwgdGV4dCBmaWxlcyBlbmQKLSAqICAgICAgIHVwIGluIFVuaXggZm9ybWF0IChhbmQgYXJlIG5vdCB0cmFuc2xhdGVkISkuCi0gKi8KLWludCBfQ0RFQ0wgc3R1Yl9vcGVuKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX29mbGFnLCB1bnNpZ25lZCBfbW9kZSkKLXsKLSAgICBIRklMRSAgIGhhbmRsZTsKLSAgICBVTE9ORyAgIGVycm9yLCBhY3Rpb250YWtlbiwgb3BlbmZsYWcsIG9wZW5tb2RlOwotICAgIGNoYXIgICAgcGF0aFtQTV9NQVhfUEFUSF07Ci0KLSAgICAvKiBEZXRlcm1pbmUgb3BlbiBmbGFncyAqLwotICAgIGlmIChfb2ZsYWcgJiBfX19PX0NSRUFUKSB7Ci0JaWYgKF9vZmxhZyAmIF9fX09fRVhDTCkKLQkgICAgb3BlbmZsYWcgPSBPUEVOX0FDVElPTl9GQUlMX0lGX0VYSVNUUyB8IE9QRU5fQUNUSU9OX0NSRUFURV9JRl9ORVc7Ci0JZWxzZSBpZiAoX29mbGFnICYgX19fT19UUlVOQykKLQkgICAgb3BlbmZsYWcgPSBPUEVOX0FDVElPTl9SRVBMQUNFX0lGX0VYSVNUUyB8IE9QRU5fQUNUSU9OX0NSRUFURV9JRl9ORVc7Ci0JZWxzZQotCSAgICBvcGVuZmxhZyA9IE9QRU5fQUNUSU9OX09QRU5fSUZfRVhJU1RTIHwgT1BFTl9BQ1RJT05fQ1JFQVRFX0lGX05FVzsKLQl9Ci0gICAgZWxzZSBpZiAoX29mbGFnICYgX19fT19UUlVOQykKLQlvcGVuZmxhZyA9IE9QRU5fQUNUSU9OX1JFUExBQ0VfSUZfRVhJU1RTOwotICAgIGVsc2UKLQlvcGVuZmxhZyA9IE9QRU5fQUNUSU9OX09QRU5fSUZfRVhJU1RTOwotCi0gICAgLyogRGV0ZXJtaW5lIG9wZW4gbW9kZSBmbGFncyAqLwotICAgIGlmIChfb2ZsYWcgJiBfX19PX1JET05MWSkKLQlvcGVubW9kZSA9IE9QRU5fQUNDRVNTX1JFQURPTkxZIHwgT1BFTl9TSEFSRV9ERU5ZTk9ORTsKLSAgICBlbHNlIGlmIChfb2ZsYWcgJiBfX19PX1dST05MWSkKLQlvcGVubW9kZSA9IE9QRU5fQUNDRVNTX1dSSVRFT05MWSB8IE9QRU5fU0hBUkVfREVOWVdSSVRFOwotICAgIGVsc2UKLQlvcGVubW9kZSA9IE9QRU5fQUNDRVNTX1JFQURXUklURSB8IE9QRU5fU0hBUkVfREVOWVdSSVRFOwotCi0gICAgLyogQ29weSB0aGUgcGF0aCB0byBhIHZhcmlhYmxlIG9uIHRoZSBzdGFjay4gV2UgbmVlZCB0byBkbyB0aGlzCi0gICAgICogZm9yIE9TLzIgYXMgd2hlbiB0aGUgZHJpdmVycyBhcmUgbG9hZGVkIGludG8gc2hhcmVkIGtlcm5lbAotICAgICAqIG1lbW9yeSwgd2UgY2FuJ3QgcGFzcyBhbiBhZGRyZXNzIGZyb20gdGhhdCBtZW1vcnkgcmFuZ2UgdG8KLSAgICAgKiB0aGlzIGZ1bmN0aW9uLgotICAgICAqLwotICAgIHN0cmNweShwYXRoLF9wYXRoKTsKLSAgICBpZiAoRG9zT3BlbihwYXRoLCAmaGFuZGxlLCAmYWN0aW9udGFrZW4sIDAsIEZJTEVfTk9STUFMLAotCSAgICBvcGVuZmxhZywgb3Blbm1vZGUsIE5VTEwpICE9IE5PX0VSUk9SKQotCXJldHVybiAtMTsKLQotICAgIC8qIEhhbmRsZSBhcHBlbmQgbW9kZSBvZiBvcGVyYXRpb24gKi8KLSAgICBpZiAoX29mbGFnICYgX19fT19BUFBFTkQpIHsKLQlpZiAoRG9zU2V0RmlsZVB0cihoYW5kbGUsIDAsIEZJTEVfRU5ELCAmZXJyb3IpICE9IE5PX0VSUk9SKQotCSAgICByZXR1cm4gLTE7Ci0JfQotICAgIHJldHVybiBoYW5kbGU7Ci19Ci0KLWludCBfQ0RFQ0wgc3R1Yl9hY2Nlc3MoY29uc3QgY2hhciAqX3BhdGgsIGludCBfYW1vZGUpCi17Ci0gICAgY2hhciAgICAgICAgcGF0aFtQTV9NQVhfUEFUSF07Ci0gICAgRklMRVNUQVRVUyAgZnM7Ci0KLSAgICAvKiBDb3B5IHRoZSBwYXRoIHRvIGEgdmFyaWFibGUgb24gdGhlIHN0YWNrLiBXZSBuZWVkIHRvIGRvIHRoaXMKLSAgICAgKiBmb3IgT1MvMiBhcyB3aGVuIHRoZSBkcml2ZXJzIGFyZSBsb2FkZWQgaW50byBzaGFyZWQga2VybmVsCi0gICAgICogbWVtb3J5LCB3ZSBjYW4ndCBwYXNzIGFuIGFkZHJlc3MgZnJvbSB0aGF0IG1lbW9yeSByYW5nZSB0bwotICAgICAqIHRoaXMgZnVuY3Rpb24uCi0gICAgICovCi0gICAgc3RyY3B5KHBhdGgsX3BhdGgpOwotICAgIGlmIChEb3NRdWVyeVBhdGhJbmZvKHBhdGgsIEZJTF9TVEFOREFSRCwgJmZzLCBzaXplb2YoZnMpKSAhPSBOT19FUlJPUikKLQlyZXR1cm4gLTE7Ci0gICAgaWYgKChfYW1vZGUgJiBXX09LKSAmJiAoZnMuYXR0ckZpbGUgJiBGSUxFX1JFQURPTkxZKSkKLQlyZXR1cm4gLTE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBfQ0RFQ0wgc3R1Yl9jbG9zZShpbnQgX2ZpbGRlcykKLXsKLSAgICBpZiAoRG9zQ2xvc2UoX2ZpbGRlcykgIT0gTk9fRVJST1IpCi0JcmV0dXJuIC0xOwotICAgIHJldHVybiAwOwotfQotCi1vZmZfdCBfQ0RFQ0wgc3R1Yl9sc2VlayhpbnQgX2ZpbGRlcywgb2ZmX3QgX29mZnNldCwgaW50IF93aGVuY2UpCi17Ci0gICAgVUxPTkcgIGNiQWN0dWFsLCBvcmlnaW47Ci0KLSAgICBzd2l0Y2ggKF93aGVuY2UpIHsKLQljYXNlIFNFRUtfQ1VSOgotCSAgICBvcmlnaW4gPSBGSUxFX0NVUlJFTlQ7Ci0JICAgIGJyZWFrOwotCWNhc2UgU0VFS19FTkQ6Ci0JICAgIG9yaWdpbiA9IEZJTEVfRU5EOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICBvcmlnaW4gPSBGSUxFX0JFR0lOOwotCX0KLSAgICBpZiAoRG9zU2V0RmlsZVB0cihfZmlsZGVzLCBfb2Zmc2V0LCBvcmlnaW4sICZjYkFjdHVhbCkgIT0gTk9fRVJST1IpCi0JcmV0dXJuIC0xOwotICAgIHJldHVybiBjYkFjdHVhbDsKLX0KLQotc2l6ZV90IF9DREVDTCBzdHViX3JlYWQoaW50IF9maWxkZXMsIHZvaWQgKl9idWYsIHNpemVfdCBfbmJ5dGUpCi17Ci0gICAgVUxPTkcgICBjYkFjdHVhbCA9IDAsY2JSZWFkOwotICAgIHVjaGFyICAgKnAgPSBfYnVmOwotICAgIHVjaGFyICAgZmlsZV9pb19idWZbQlVGX1NJWkVdOwotCi0gICAgLyogV2UgbmVlZCB0byBwZXJmb3JtIHRoZSBwaHlzaWNhbCByZWFkIGluIGNodW5rcyBpbnRvIGEKLSAgICAgKiBhIHRlbXBvcmFyeSBzdGF0aWMgYnVmZmVyLCBzaW5jZSB0aGUgYnVmZmVyIHBhc3NlZCBpbiBtYXkgYmUKLSAgICAgKiBpbiBrZXJuZWwgc3BhY2UgYW5kIHdpbGwgY2F1c2UgRG9zUmVhZCB0byBiYWlsIGludGVybmFsbHkuCi0gICAgICovCi0gICAgd2hpbGUgKF9uYnl0ZSA+IEJVRl9TSVpFKSB7Ci0JaWYgKERvc1JlYWQoX2ZpbGRlcywgZmlsZV9pb19idWYsIEJVRl9TSVpFLCAmY2JSZWFkKSAhPSBOT19FUlJPUikKLQkgICAgcmV0dXJuIC0xOwotCWNiQWN0dWFsICs9IGNiUmVhZDsKLQltZW1jcHkocCxmaWxlX2lvX2J1ZixCVUZfU0laRSk7Ci0JcCArPSBCVUZfU0laRTsKLQlfbmJ5dGUgLT0gQlVGX1NJWkU7Ci0JfQotICAgIGlmIChfbmJ5dGUpIHsKLQlpZiAoRG9zUmVhZChfZmlsZGVzLCBmaWxlX2lvX2J1ZiwgX25ieXRlLCAmY2JSZWFkKSAhPSBOT19FUlJPUikKLQkgICAgcmV0dXJuIC0xOwotCWNiQWN0dWFsICs9IGNiUmVhZDsKLQltZW1jcHkocCxmaWxlX2lvX2J1ZixfbmJ5dGUpOwotCX0KLSAgICByZXR1cm4gY2JBY3R1YWw7Ci19Ci0KLXNpemVfdCBfQ0RFQ0wgc3R1Yl93cml0ZShpbnQgX2ZpbGRlcywgY29uc3Qgdm9pZCAqX2J1Ziwgc2l6ZV90IF9uYnl0ZSkKLXsKLSAgICBVTE9ORyAgIGNiQWN0dWFsID0gMCxjYldyaXRlOwotICAgIHVjaGFyICAgKnAgPSAoUFZPSUQpX2J1ZjsKLSAgICB1Y2hhciAgIGZpbGVfaW9fYnVmW0JVRl9TSVpFXTsKLQotICAgIC8qIFdlIG5lZWQgdG8gcGVyZm9ybSB0aGUgcGh5c2ljYWwgd3JpdGUgaW4gY2h1bmtzIGZyb20gYQotICAgICAqIGEgdGVtcG9yYXJ5IHN0YXRpYyBidWZmZXIsIHNpbmNlIHRoZSBidWZmZXIgcGFzc2VkIGluIG1heSBiZQotICAgICAqIGluIGtlcm5lbCBzcGFjZSBhbmQgd2lsbCBjYXVzZSBEb3NXcml0ZSB0byBiYWlsIGludGVybmFsbHkuCi0gICAgICovCi0gICAgd2hpbGUgKF9uYnl0ZSA+IEJVRl9TSVpFKSB7Ci0JbWVtY3B5KGZpbGVfaW9fYnVmLHAsQlVGX1NJWkUpOwotCWlmIChEb3NXcml0ZShfZmlsZGVzLCBmaWxlX2lvX2J1ZiwgQlVGX1NJWkUsICZjYldyaXRlKSAhPSBOT19FUlJPUikKLQkgICAgcmV0dXJuIC0xOwotCWNiQWN0dWFsICs9IGNiV3JpdGU7Ci0JcCArPSBCVUZfU0laRTsKLQlfbmJ5dGUgLT0gQlVGX1NJWkU7Ci0JfQotICAgIGlmIChfbmJ5dGUpIHsKLQltZW1jcHkoZmlsZV9pb19idWYscCxfbmJ5dGUpOwotCWlmIChEb3NXcml0ZShfZmlsZGVzLCBmaWxlX2lvX2J1ZiwgX25ieXRlLCAmY2JXcml0ZSkgIT0gTk9fRVJST1IpCi0JICAgIHJldHVybiAtMTsKLQljYkFjdHVhbCArPSBjYldyaXRlOwotCX0KLSAgICByZXR1cm4gY2JBY3R1YWw7Ci19Ci0KLWludCBfQ0RFQ0wgc3R1Yl91bmxpbmsoY29uc3QgY2hhciAqX3BhdGgpCi17Ci0gICAgY2hhciAgICBwYXRoW1BNX01BWF9QQVRIXTsKLQotICAgIC8qIENvcHkgdGhlIHBhdGggdG8gYSB2YXJpYWJsZSBvbiB0aGUgc3RhY2suIFdlIG5lZWQgdG8gZG8gdGhpcwotICAgICAqIGZvciBPUy8yIGFzIHdoZW4gdGhlIGRyaXZlcnMgYXJlIGxvYWRlZCBpbnRvIHNoYXJlZCBrZXJuZWwKLSAgICAgKiBtZW1vcnksIHdlIGNhbid0IHBhc3MgYW4gYWRkcmVzcyBmcm9tIHRoYXQgbWVtb3J5IHJhbmdlIHRvCi0gICAgICogdGhpcyBmdW5jdGlvbi4KLSAgICAgKi8KLSAgICBzdHJjcHkocGF0aCxfcGF0aCk7Ci0gICAgaWYgKERvc0RlbGV0ZShwYXRoKSAhPSBOT19FUlJPUikKLQlyZXR1cm4gLTE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBfQ0RFQ0wgc3R1Yl9pc2F0dHkoaW50IF9maWxkZXMpCi17Ci0gICAgVUxPTkcgIGh0eXBlLCBmbGFnczsKLQotICAgIGlmIChEb3NRdWVyeUhUeXBlKF9maWxkZXMsICZodHlwZSwgJmZsYWdzKSAhPSBOT19FUlJPUikKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gKChodHlwZSAmIDB4RkYpID09IEhBTkRUWVBFX0RFVklDRSk7Ci19Ci0KLS8qIDxzdGRpby5oPiBzdHViIGZ1bmN0aW9ucyAqLwotaW50IF9DREVDTCBzdHViX3JlbW92ZShjb25zdCBjaGFyICpfcGF0aCkKLXsKLSAgICBjaGFyICAgIHBhdGhbUE1fTUFYX1BBVEhdOwotCi0gICAgLyogQ29weSB0aGUgcGF0aCB0byBhIHZhcmlhYmxlIG9uIHRoZSBzdGFjay4gV2UgbmVlZCB0byBkbyB0aGlzCi0gICAgICogZm9yIE9TLzIgYXMgd2hlbiB0aGUgZHJpdmVycyBhcmUgbG9hZGVkIGludG8gc2hhcmVkIGtlcm5lbAotICAgICAqIG1lbW9yeSwgd2UgY2FuJ3QgcGFzcyBhbiBhZGRyZXNzIGZyb20gdGhhdCBtZW1vcnkgcmFuZ2UgdG8KLSAgICAgKiB0aGlzIGZ1bmN0aW9uLgotICAgICAqLwotICAgIHN0cmNweShwYXRoLF9wYXRoKTsKLSAgICBpZiAoRG9zRGVsZXRlKHBhdGgpICE9IE5PX0VSUk9SKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IF9DREVDTCBzdHViX3JlbmFtZShjb25zdCBjaGFyICpfb2xkLCBjb25zdCBjaGFyICpfbmV3KQotewotICAgIGNoYXIgICAgb2xkW1BNX01BWF9QQVRIXTsKLSAgICBjaGFyICAgIG5ld1tQTV9NQVhfUEFUSF07Ci0KLSAgICAvKiBDb3B5IHRoZSBwYXRoIHRvIGEgdmFyaWFibGUgb24gdGhlIHN0YWNrLiBXZSBuZWVkIHRvIGRvIHRoaXMKLSAgICAgKiBmb3IgT1MvMiBhcyB3aGVuIHRoZSBkcml2ZXJzIGFyZSBsb2FkZWQgaW50byBzaGFyZWQga2VybmVsCi0gICAgICogbWVtb3J5LCB3ZSBjYW4ndCBwYXNzIGFuIGFkZHJlc3MgZnJvbSB0aGF0IG1lbW9yeSByYW5nZSB0bwotICAgICAqIHRoaXMgZnVuY3Rpb24uCi0gICAgICovCi0gICAgc3RyY3B5KG9sZCxfb2xkKTsKLSAgICBzdHJjcHkobmV3LF9uZXcpOwotICAgIGlmIChEb3NNb3ZlKG9sZCwgbmV3KSAhPSBOT19FUlJPUikKLQlyZXR1cm4gLTE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbHNlCi0KLXZvaWQgX0NERUNMIF9PU19zZXRmaWxlYXR0cihjb25zdCBjaGFyICpmaWxlbmFtZSx1bnNpZ25lZCBhdHRyaWIpCi17IC8qIFVuYWJsZSB0byBzZXQgaGlkZGVuLCBzeXN0ZW0gYXR0cmlidXRlcyBvbiBVbml4LiAqLyB9Ci0KLSNlbmRpZgotCi0jaWZuZGVmIFVTRV9MT0NBTF9GSUxFSU8KLQotLyogPGxpYmMvZmlsZS5oPiBzdHViIGZ1bmN0aW9ucyAqLwotaW50IF9DREVDTCBzdHViX29wZW4oY29uc3QgY2hhciAqX3BhdGgsIGludCBfb2ZsYWcsIHVuc2lnbmVkIF9tb2RlKQotewotICAgIGludCBvZmxhZ190YWJbXSA9IHsKLQlfX19PX1JET05MWSwgICAgT19SRE9OTFksCi0JX19fT19XUk9OTFksICAgIE9fV1JPTkxZLAotCV9fX09fUkRXUiwgICAgICBPX1JEV1IsCi0JX19fT19CSU5BUlksICAgIE9fQklOQVJZLAotCV9fX09fVEVYVCwgICAgICBPX1RFWFQsCi0JX19fT19DUkVBVCwgICAgIE9fQ1JFQVQsCi0JX19fT19FWENMLCAgICAgIE9fRVhDTCwKLQlfX19PX1RSVU5DLCAgICAgT19UUlVOQywKLQlfX19PX0FQUEVORCwgICAgT19BUFBFTkQsCi0JfTsKLSAgICBpbnQgaSxvZmxhZyA9IDA7Ci0KLSAgICAvKiBUcmFuc2xhdGUgdGhlIG9mbGFnJ3MgdG8gdGhlIE9TIGRlcGVuZGVudCB2ZXJzaW9ucyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yob2ZsYWdfdGFiKSAvIHNpemVvZihpbnQpOyBpICs9IDIpIHsKLQlpZiAoX29mbGFnICYgb2ZsYWdfdGFiW2ldKQotCSAgICBvZmxhZyB8PSBvZmxhZ190YWJbaSsxXTsKLQl9Ci0gICAgcmV0dXJuIG9wZW4oX3BhdGgsb2ZsYWcsX21vZGUpOwotfQotCi1pbnQgX0NERUNMIHN0dWJfYWNjZXNzKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX2Ftb2RlKQoteyByZXR1cm4gYWNjZXNzKF9wYXRoLF9hbW9kZSk7IH0KLQotaW50IF9DREVDTCBzdHViX2Nsb3NlKGludCBfZmlsZGVzKQoteyByZXR1cm4gY2xvc2UoX2ZpbGRlcyk7IH0KLQotb2ZmX3QgX0NERUNMIHN0dWJfbHNlZWsoaW50IF9maWxkZXMsIG9mZl90IF9vZmZzZXQsIGludCBfd2hlbmNlKQoteyByZXR1cm4gbHNlZWsoX2ZpbGRlcyxfb2Zmc2V0LF93aGVuY2UpOyB9Ci0KLXNpemVfdCBfQ0RFQ0wgc3R1Yl9yZWFkKGludCBfZmlsZGVzLCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKQoteyByZXR1cm4gcmVhZChfZmlsZGVzLF9idWYsX25ieXRlKTsgfQotCi1pbnQgX0NERUNMIHN0dWJfdW5saW5rKGNvbnN0IGNoYXIgKl9wYXRoKQoteyByZXR1cm4gdW5saW5rKF9wYXRoKTsgfQotCi1zaXplX3QgX0NERUNMIHN0dWJfd3JpdGUoaW50IF9maWxkZXMsIGNvbnN0IHZvaWQgKl9idWYsIHNpemVfdCBfbmJ5dGUpCi17IHJldHVybiB3cml0ZShfZmlsZGVzLF9idWYsX25ieXRlKTsgfQotCi1pbnQgX0NERUNMIHN0dWJfaXNhdHR5KGludCBfZmlsZGVzKQoteyByZXR1cm4gaXNhdHR5KF9maWxkZXMpOyB9Ci0KLS8qIDxzdGRpby5oPiBzdHViIGZ1bmN0aW9ucyAqLwotaW50IF9DREVDTCBzdHViX3JlbW92ZShjb25zdCBjaGFyICpfZmlsZW5hbWUpCi17IHJldHVybiByZW1vdmUoX2ZpbGVuYW1lKTsgfQotCi1pbnQgX0NERUNMIHN0dWJfcmVuYW1lKGNvbnN0IGNoYXIgKl9vbGQsIGNvbnN0IGNoYXIgKl9uZXcpCi17IHJldHVybiByZW5hbWUoX29sZCxfbmV3KTsgfQotCi0jZW5kaWYKLQotI2lmbmRlZiBVU0VfTE9DQUxfR0VUREFURQotCi0vKiBSZXR1cm4gdGhlIGN1cnJlbnQgZGF0ZSBpbiBkYXlzIHNpbmNlIDEvMS8xOTgwICovCi11bG9uZyBfQ0RFQ0wgX09TX2dldGN1cnJlbnRkYXRlKHZvaWQpCi17Ci0gICAgc3RydWN0IHRtIHJlZlRpbWU7Ci0gICAgcmVmVGltZS50bV95ZWFyID0gODA7Ci0gICAgcmVmVGltZS50bV9tb24gID0gMDsKLSAgICByZWZUaW1lLnRtX21kYXkgPSAxOwotICAgIHJlZlRpbWUudG1faG91ciA9IDA7Ci0gICAgcmVmVGltZS50bV9taW4gID0gMDsKLSAgICByZWZUaW1lLnRtX3NlYyAgPSAwOwotICAgIHJlZlRpbWUudG1faXNkc3QgPSAtMTsKLSAgICByZXR1cm4gKHRpbWUoTlVMTCkgLSBta3RpbWUoJnJlZlRpbWUpKSAvICgyNCAqIDM2MDBMKTsKLX0KLQotI2VuZGlmCi0KLWludCBfQ0RFQ0wgc3R1Yl9yYWlzZShpbnQgc2lnKQotewotI2lmIGRlZmluZWQoX19XSU4zMl9WWERfXykgfHwgZGVmaW5lZChfX05UX0RSSVZFUl9fKSB8fCBkZWZpbmVkKF9fU01YMzJfXykKLSAgICByZXR1cm4gLTE7Ci0jZWxzZQotICAgIHJldHVybiByYWlzZShzaWcpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBfX1dJTkRPV1MzMl9fCi10eXBlZGVmIHZvaWQgKCpfX2NvZGVfcHRyKShpbnQpOwotI2Vsc2UKLXR5cGVkZWYgdm9pZCAoKl9fY29kZV9wdHIpKCk7Ci0jZW5kaWYKLQotdm9pZCAqIF9DREVDTCBzdHViX3NpZ25hbChpbnQgc2lnLCB2b2lkICpoYW5kbGVyKQotewotI2lmIGRlZmluZWQoX19XSU4zMl9WWERfXykgfHwgZGVmaW5lZChfX05UX0RSSVZFUl9fKSB8fCBkZWZpbmVkKF9fU01YMzJfXykKLSAgICByZXR1cm4gTlVMTDsKLSNlbHNlCi0gICAgcmV0dXJuICh2b2lkKilzaWduYWwoc2lnLChfX2NvZGVfcHRyKWhhbmRsZXIpOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vbWFrZWZpbGUgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYWMwMzguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL21ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2IFNjaVRlY2ggU29mdHdhcmUuCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgRGVzY3JpcHRvbjogICBNYWtlZmlsZSBmb3IgVW5pVkJFKHRtKSwgVW5pUE9XRVIodG0pLCBVVkJFTGliKHRtKSBhbmQKLSMgICAgICAgICAgICAgICBEUE1TTGliIGxpYnJhcnkgZmlsZXMuIFJlcXVpcmVzIEJvcmxhbmQgQysrIDQuNTIgdG8gYnVpbGQKLSMgICAgICAgICAgICAgICBzb21lIGNvbXBvbmVudHMuCi0jCi0jICREYXRlOiAyMDAyLzEwLzAyIDE1OjM1OjIwICQgJEF1dGhvcjogaGZyaWVkZW4gJAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQ0ZMQUdTICs9IC1EVEVTVElOR19HVEYKLQotZ3RmY2FsYyRFOiAgZ3RmY2FsYyRPCi0KLS5JTkNMVURFOiAiJChTQ0lURUNIKS9tYWtlZGVmcy9jb21tb24ubWsiCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vcGVsb2FkZXIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9wZWxvYWRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTM0YmIwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9wZWxvYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE1HTCBHcmFwaGljcyBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIE1vZHVsZSB0byBpbXBsZW1lbnQgYSBzaW1wbGUgUG9ydGFibGUgQmluYXJ5IERMTCBsb2FkZXIKLSogICAgICAgICAgICAgICBsaWJyYXJ5LiBUaGlzIGxpYnJhcnkgY2FuIGJlIHVzZWQgdG8gbG9hZCBQRSBETEwncyB1bmRlcgotKiAgICAgICAgICAgICAgIGFueSBJbnRlbCBiYXNlZCBPUywgcHJvdmlkZWQgdGhlIERMTCdzIGRvIG5vdCBoYXZlIGFueQotKiAgICAgICAgICAgICAgIGltcG9ydHMgaW4gdGhlIGltcG9ydCB0YWJsZS4KLSoKLSogICAgICAgICAgICAgICBOT1RFOiBUaGlzIGxvYWRlciBtb2R1bGUgZXhwZWN0cyB0aGUgRExMJ3MgdG8gYmUgYnVpbHQgd2l0aAotKiAgICAgICAgICAgICAgICAgICAgIFdhdGNvbSBDKysgYW5kIG1heSBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cyB3aXRoCi0qICAgICAgICAgICAgICAgICAgICAgRExMJ3MgbGlua2VkIGJ5IGFub3RoZXIgY29tcGlsZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiZHJ2bGliL3BlbG9hZGVyLmgiCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlICJkcnZsaWIvbGliYy9pbml0LmgiCi0jaWYgKGRlZmluZWQoX19XSU5ET1dTMzJfXykgfHwgZGVmaW5lZChfX0RSSVZFUl9fKSkgJiYgZGVmaW5lZChDSEVDS0VEKQotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jZGVmaW5lIFNUUklDVAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgImRydmxpYi9wZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50ICAgICAgICAgIHJlc3VsdCA9IFBFX29rOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWYgICAgICAgICAgIC0gSGFuZGxlIHRvIG9wZW4gZmlsZSB0byByZWFkIGRyaXZlciBmcm9tCi1zdGFydE9mZnNldCAtIE9mZnNldCB0byB0aGUgc3RhcnQgb2YgdGhlIGRyaXZlciB3aXRoaW4gdGhlIGZpbGUKLQotUkVUVVJOUzoKLUhhbmRsZSB0byBsb2FkZWQgUEUgRExMLCBvciBOVUxMIG9uIGZhaWx1cmUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGxvYWRzIGEgUG9ydGFibGUgQmluYXJ5IERMTCBsaWJyYXJ5IGZyb20gZGlzaywgcmVsb2NhdGVzCi10aGUgY29kZSBhbmQgcmV0dXJucyBhIGhhbmRsZSB0byB0aGUgbG9hZGVkIGxpYnJhcnkuIFRoaXMgZnVuY3Rpb24gaXMgdGhlCi1zYW1lIGFzIHRoZSByZWd1bGFyIFBFX2xvYWRMaWJyYXJ5IGV4Y2VwdCB0aGF0IGl0IHRha2UgYSBoYW5kbGUgdG8gYW4KLW9wZW4gZmlsZSBhbmQgYW4gb2Zmc2V0IHdpdGhpbiB0aGF0IGZpbGUgZm9yIHRoZSBETEwgdG8gbG9hZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IFBFX3JlYWRIZWFkZXIoCi0gICAgRklMRSAqZiwKLSAgICBsb25nIHN0YXJ0T2Zmc2V0LAotICAgIEZJTEVfSERSICpmaWxlaGRyLAotICAgIE9QVElPTkFMX0hEUiAqb3B0aGRyKQotewotICAgIEVYRV9IRFIgZXhlaGRyOwotICAgIHVsb25nICAgb2Zmc2V0LHNpZ25hdHVyZTsKLQotICAgIC8qIFJlYWQgdGhlIEVYRSBoZWFkZXIgYW5kIGNoZWNrIGZvciB2YWxpZCBoZWFkZXIgc2lnbmF0dXJlICovCi0gICAgcmVzdWx0ID0gUEVfaW52YWxpZERMTEltYWdlOwotICAgIGZzZWVrKGYsIHN0YXJ0T2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgaWYgKGZyZWFkKCZleGVoZHIsIDEsIHNpemVvZihleGVoZHIpLCBmKSAhPSBzaXplb2YoZXhlaGRyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGV4ZWhkci5zaWduYXR1cmUgIT0gMHg1QTREKQotCXJldHVybiBmYWxzZTsKLQotICAgIC8qIE5vdyBzZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgUEUgaGVhZGVyIGRlZmluZWQgYXQgb2Zmc2V0IDB4M0MKLSAgICAgKiBpbiB0aGUgTVMtRE9TIEVYRSBoZWFkZXIsIGFuZCByZWFkIHRoZSBzaWduYXR1cmUgYW5kIGNoZWNrIGl0LgotICAgICAqLwotICAgIGZzZWVrKGYsIHN0YXJ0T2Zmc2V0KzB4M0MsIFNFRUtfU0VUKTsKLSAgICBpZiAoZnJlYWQoJm9mZnNldCwgMSwgc2l6ZW9mKG9mZnNldCksIGYpICE9IHNpemVvZihvZmZzZXQpKQotCXJldHVybiBmYWxzZTsKLSAgICBmc2VlayhmLCBzdGFydE9mZnNldCtvZmZzZXQsIFNFRUtfU0VUKTsKLSAgICBpZiAoZnJlYWQoJnNpZ25hdHVyZSwgMSwgc2l6ZW9mKHNpZ25hdHVyZSksIGYpICE9IHNpemVvZihzaWduYXR1cmUpKQotCXJldHVybiBmYWxzZTsKLSAgICBpZiAoc2lnbmF0dXJlICE9IDB4MDAwMDQ1NTApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgLyogTm93IHJlYWQgdGhlIFBFIGZpbGUgaGVhZGVyIGFuZCBjaGVjayB0aGF0IGl0IGlzIGNvcnJlY3QgKi8KLSAgICBpZiAoZnJlYWQoZmlsZWhkciwgMSwgc2l6ZW9mKCpmaWxlaGRyKSwgZikgIT0gc2l6ZW9mKCpmaWxlaGRyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGZpbGVoZHItPk1hY2hpbmUgIT0gSU1BR0VfRklMRV9NQUNISU5FX0kzODYpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmICghKGZpbGVoZHItPkNoYXJhY3RlcmlzdGljcyAmIElNQUdFX0ZJTEVfMzJCSVRfTUFDSElORSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmICghKGZpbGVoZHItPkNoYXJhY3RlcmlzdGljcyAmIElNQUdFX0ZJTEVfRExMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGZyZWFkKG9wdGhkciwgMSwgc2l6ZW9mKCpvcHRoZHIpLCBmKSAhPSBzaXplb2YoKm9wdGhkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmIChvcHRoZHItPk1hZ2ljICE9IDB4MTBCKQotCXJldHVybiBmYWxzZTsKLQotICAgIC8qIFN1Y2Nlc3MsIHNvIHJldHVybiB0cnVlISAqLwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWYgICAgICAgICAgIC0gSGFuZGxlIHRvIG9wZW4gZmlsZSB0byByZWFkIGRyaXZlciBmcm9tCi1zdGFydE9mZnNldCAtIE9mZnNldCB0byB0aGUgc3RhcnQgb2YgdGhlIGRyaXZlciB3aXRoaW4gdGhlIGZpbGUKLQotUkVUVVJOUzoKLVNpemUgb2YgdGhlIERMTCBmaWxlIG9uIGRpc2ssIG9yIC0xIG9uIGVycm9yCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHNjYW5zIHRoZSBoZWFkZXJzIGZvciBhIFBvcnRhYmxlIEJpbmFyeSBETEwgdG8gZGV0ZXJtaW5lIHRoZQotbGVuZ3RoIG9mIHRoZSBETEwgZmlsZSBvbiBkaXNrLgote3NlY3JldH0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBQRUFQSSBQRV9nZXRGaWxlU2l6ZSgKLSAgICBGSUxFICpmLAotICAgIHVsb25nIHN0YXJ0T2Zmc2V0KQotewotICAgIEZJTEVfSERSICAgICAgICBmaWxlaGRyOwotICAgIE9QVElPTkFMX0hEUiAgICBvcHRoZHI7Ci0gICAgU0VDVElPTl9IRFIgICAgIHNlY3RoZHI7Ci0gICAgdWxvbmcgICAgICAgICAgIHNpemU7Ci0gICAgaW50ICAgICAgICAgICAgIGk7Ci0KLSAgICAvKiBSZWFkIHRoZSBQRSBmaWxlIGhlYWRlcnMgZnJvbSBkaXNrICovCi0gICAgaWYgKCFQRV9yZWFkSGVhZGVyKGYsc3RhcnRPZmZzZXQsJmZpbGVoZHIsJm9wdGhkcikpCi0JcmV0dXJuIDB4RkZGRkZGRkY7Ci0KLSAgICAvKiBTY2FuIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzIHN1bW1pbmcgdXAgdGhlIHRvdGFsIHNpemUgKi8KLSAgICBzaXplID0gb3B0aGRyLlNpemVPZkhlYWRlcnM7Ci0gICAgZm9yIChpID0gMDsgaSA8IGZpbGVoZHIuTnVtYmVyT2ZTZWN0aW9uczsgaSsrKSB7Ci0JaWYgKGZyZWFkKCZzZWN0aGRyLCAxLCBzaXplb2Yoc2VjdGhkciksIGYpICE9IHNpemVvZihzZWN0aGRyKSkKLQkgICAgcmV0dXJuIDB4RkZGRkZGRkY7Ci0Jc2l6ZSArPSBzZWN0aGRyLlNpemVPZlJhd0RhdGE7Ci0JfQotICAgIHJldHVybiBzaXplOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1Mb2FkcyBhIFBvcnRhYmxlIEJpbmFyeSBETEwgaW50byBtZW1vcnkgZnJvbSBhbiBvcGVuIGZpbGUKLQotSEVBREVSOgotcGVsb2FkZXIuaAotCi1QQVJBTUVURVJTOgotZiAgICAgICAgICAgLSBIYW5kbGUgdG8gb3BlbiBmaWxlIHRvIHJlYWQgZHJpdmVyIGZyb20KLXN0YXJ0T2Zmc2V0IC0gT2Zmc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgZHJpdmVyIHdpdGhpbiB0aGUgZmlsZQotc2l6ZSAgICAgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgc2l6ZSBvZiB0aGUgZHJpdmVyIGxvYWRlZAotc2hhcmVkICAgICAgLSBUcnVlIHRvIGxvYWQgbW9kdWxlIGludG8gc2hhcmVkIG1lbW9yeQotCi1SRVRVUk5TOgotSGFuZGxlIHRvIGxvYWRlZCBQRSBETEwsIG9yIE5VTEwgb24gZmFpbHVyZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gbG9hZHMgYSBQb3J0YWJsZSBCaW5hcnkgRExMIGxpYnJhcnkgZnJvbSBkaXNrLCByZWxvY2F0ZXMKLXRoZSBjb2RlIGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBsb2FkZWQgbGlicmFyeS4gVGhpcyBmdW5jdGlvbiBpcyB0aGUKLXNhbWUgYXMgdGhlIHJlZ3VsYXIgUEVfbG9hZExpYnJhcnkgZXhjZXB0IHRoYXQgaXQgdGFrZSBhIGhhbmRsZSB0byBhbgotb3BlbiBmaWxlIGFuZCBhbiBvZmZzZXQgd2l0aGluIHRoYXQgZmlsZSBmb3IgdGhlIERMTCB0byBsb2FkLgotCi1TRUUgQUxTTzoKLVBFX2xvYWRMaWJyYXJ5LCBQRV9nZXRQcm9jQWRkcmVzcywgUEVfZnJlZUxpYnJhcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QRV9NT0RVTEUgKiBQRUFQSSBQRV9sb2FkTGlicmFyeUV4dCgKLSAgICBGSUxFICpmLAotICAgIHVsb25nIHN0YXJ0T2Zmc2V0LAotICAgIHVsb25nICpzaXplLAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICBGSUxFX0hEUiAgICAgICAgZmlsZWhkcjsKLSAgICBPUFRJT05BTF9IRFIgICAgb3B0aGRyOwotICAgIFNFQ1RJT05fSERSICAgICBzZWN0aGRyOwotICAgIHVsb25nICAgICAgICAgICBvZmZzZXQscGFnZU9mZnNldDsKLSAgICB1bG9uZyAgICAgICAgICAgdGV4dF9vZmYsdGV4dF9hZGRyLHRleHRfc2l6ZTsKLSAgICB1bG9uZyAgICAgICAgICAgZGF0YV9vZmYsZGF0YV9hZGRyLGRhdGFfc2l6ZSxkYXRhX2VuZDsKLSAgICB1bG9uZyAgICAgICAgICAgZXhwb3J0X29mZixleHBvcnRfYWRkcixleHBvcnRfc2l6ZSxleHBvcnRfZW5kOwotICAgIHVsb25nICAgICAgICAgICByZWxvY19vZmYscmVsb2Nfc2l6ZTsKLSAgICB1bG9uZyAgICAgICAgICAgaW1hZ2Vfc2l6ZTsKLSAgICBpbnQgICAgICAgICAgICAgaSxkZWx0YSxudW1GaXh1cHM7Ci0gICAgdXNob3J0ICAgICAgICAgIHJlbG9jVHlwZSwqZml4dXA7Ci0gICAgUEVfTU9EVUxFICAgICAgICpoTW9kID0gTlVMTDsKLSAgICB2b2lkICAgICAgICAgICAgKnJlbG9jID0gTlVMTDsKLSAgICBCQVNFX1JFTE9DQVRJT04gKmJhc2VSZWxvYzsKLSAgICBJbml0TGliQ190ICAgICAgSW5pdExpYkM7Ci0KLSAgICAvKiBSZWFkIHRoZSBQRSBmaWxlIGhlYWRlcnMgZnJvbSBkaXNrICovCi0gICAgaWYgKCFQRV9yZWFkSGVhZGVyKGYsc3RhcnRPZmZzZXQsJmZpbGVoZHIsJm9wdGhkcikpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBTY2FuIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzIGFuZCBmaW5kIHRoZSBuZWNlc3Nhcnkgc2VjdGlvbnMgKi8KLSAgICB0ZXh0X29mZiA9IGRhdGFfb2ZmID0gcmVsb2Nfb2ZmID0gZXhwb3J0X29mZiA9IDA7Ci0gICAgdGV4dF9hZGRyID0gdGV4dF9zaXplID0gMDsKLSAgICBkYXRhX2FkZHIgPSBkYXRhX3NpemUgPSBkYXRhX2VuZCA9IDA7Ci0gICAgZXhwb3J0X2FkZHIgPSBleHBvcnRfc2l6ZSA9IGV4cG9ydF9lbmQgPSAwOwotICAgIHJlbG9jX3NpemUgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBmaWxlaGRyLk51bWJlck9mU2VjdGlvbnM7IGkrKykgewotCWlmIChmcmVhZCgmc2VjdGhkciwgMSwgc2l6ZW9mKHNlY3RoZHIpLCBmKSAhPSBzaXplb2Yoc2VjdGhkcikpCi0JICAgIGdvdG8gRXJyb3I7Ci0JaWYgKHN0cmNtcChzZWN0aGRyLk5hbWUsICIuZWRhdGEiKSA9PSAwIHx8IHN0cmNtcChzZWN0aGRyLk5hbWUsICIucmRhdGEiKSA9PSAwKSB7Ci0JICAgIC8qIEV4cG9ydHMgc2VjdGlvbiAqLwotCSAgICBleHBvcnRfb2ZmID0gc2VjdGhkci5Qb2ludGVyVG9SYXdEYXRhOwotCSAgICBleHBvcnRfYWRkciA9IHNlY3RoZHIuVmlydHVhbEFkZHJlc3M7Ci0JICAgIGV4cG9ydF9zaXplID0gc2VjdGhkci5TaXplT2ZSYXdEYXRhOwotCSAgICBleHBvcnRfZW5kID0gZXhwb3J0X2FkZHIgKyBleHBvcnRfc2l6ZTsKLQkgICAgfQotCWVsc2UgaWYgKHN0cmNtcChzZWN0aGRyLk5hbWUsICIuaWRhdGEiKSA9PSAwKSB7Ci0JICAgIC8qIEltcG9ydHMgc2VjdGlvbiwgaWdub3JlICovCi0JICAgIH0KLQllbHNlIGlmIChzdHJjbXAoc2VjdGhkci5OYW1lLCAiLnJlbG9jIikgPT0gMCkgewotCSAgICAvKiBSZWxvY2F0aW9ucyBzZWN0aW9uICovCi0JICAgIHJlbG9jX29mZiA9IHNlY3RoZHIuUG9pbnRlclRvUmF3RGF0YTsKLQkgICAgcmVsb2Nfc2l6ZSA9IHNlY3RoZHIuU2l6ZU9mUmF3RGF0YTsKLQkgICAgfQotCWVsc2UgaWYgKCF0ZXh0X29mZiAmJiBzZWN0aGRyLkNoYXJhY3RlcmlzdGljcyAmIElNQUdFX1NDTl9DTlRfQ09ERSkgewotCSAgICAvKiBDb2RlIHNlY3Rpb24gKi8KLQkgICAgdGV4dF9vZmYgPSBzZWN0aGRyLlBvaW50ZXJUb1Jhd0RhdGE7Ci0JICAgIHRleHRfYWRkciA9IHNlY3RoZHIuVmlydHVhbEFkZHJlc3M7Ci0JICAgIHRleHRfc2l6ZSA9IHNlY3RoZHIuU2l6ZU9mUmF3RGF0YTsKLQkgICAgfQotCWVsc2UgaWYgKCFkYXRhX29mZiAmJiBzZWN0aGRyLkNoYXJhY3RlcmlzdGljcyAmIElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSkgewotCSAgICAvKiBEYXRhIHNlY3Rpb24gKi8KLQkgICAgZGF0YV9vZmYgPSBzZWN0aGRyLlBvaW50ZXJUb1Jhd0RhdGE7Ci0JICAgIGRhdGFfYWRkciA9IHNlY3RoZHIuVmlydHVhbEFkZHJlc3M7Ci0JICAgIGRhdGFfc2l6ZSA9IHNlY3RoZHIuU2l6ZU9mUmF3RGF0YTsKLQkgICAgZGF0YV9lbmQgPSBkYXRhX2FkZHIgKyBkYXRhX3NpemU7Ci0JICAgIH0KLQl9Ci0KLSAgICAvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGFsbCB0aGUgc2VjdGlvbnMgd2UgbmVlZCAqLwotICAgIGlmICghdGV4dF9vZmYgfHwgIWRhdGFfb2ZmIHx8ICFleHBvcnRfb2ZmIHx8ICFyZWxvY19vZmYpIHsKLQlyZXN1bHQgPSBQRV9pbnZhbGlkRExMSW1hZ2U7Ci0JZ290byBFcnJvcjsKLQl9Ci0KLSAgICAvKiBGaW5kIHRoZSBzaXplIG9mIHRoZSBpbWFnZSB0byBsb2FkIGFsbG9jYXRlIG1lbW9yeSBmb3IgaXQgKi8KLSAgICBpbWFnZV9zaXplID0gTUFYKGV4cG9ydF9lbmQsZGF0YV9lbmQpIC0gdGV4dF9hZGRyOwotICAgICpzaXplID0gc2l6ZW9mKFBFX01PRFVMRSkgKyBpbWFnZV9zaXplICsgNDA5NjsKLSAgICBpZiAoc2hhcmVkKQotCWhNb2QgPSBQTV9tYWxsb2NTaGFyZWQoKnNpemUpOwotICAgIGVsc2UKLQloTW9kID0gUE1fbWFsbG9jKCpzaXplKTsKLSAgICByZWxvYyA9IFBNX21hbGxvYyhyZWxvY19zaXplKTsKLSAgICBpZiAoIWhNb2QgfHwgIXJlbG9jKSB7Ci0JcmVzdWx0ID0gUEVfb3V0T2ZNZW1vcnk7Ci0JZ290byBFcnJvcjsKLQl9Ci0KLSAgICBoTW9kLT50ZXh0ID0gKHVjaGFyKilST1VORF80SygodWxvbmcpaE1vZCArIHNpemVvZihQRV9NT0RVTEUpKTsKLSAgICBoTW9kLT5kYXRhID0gKHVjaGFyKikoKHVsb25nKWhNb2QtPnRleHQgKyAoZGF0YV9hZGRyIC0gdGV4dF9hZGRyKSk7Ci0gICAgaE1vZC0+ZXhwb3J0ID0gKHVjaGFyKikoKHVsb25nKWhNb2QtPnRleHQgKyAoZXhwb3J0X2FkZHIgLSB0ZXh0X2FkZHIpKTsKLSAgICBoTW9kLT50ZXh0QmFzZSA9IHRleHRfYWRkcjsKLSAgICBoTW9kLT5kYXRhQmFzZSA9IGRhdGFfYWRkcjsKLSAgICBoTW9kLT5leHBvcnRCYXNlID0gZXhwb3J0X2FkZHI7Ci0gICAgaE1vZC0+ZXhwb3J0RGlyID0gb3B0aGRyLkRhdGFEaXJlY3RvcnlbMF0uUmVsVmlydHVhbEFkZHJlc3MgLSBleHBvcnRfYWRkcjsKLSAgICBoTW9kLT5zaGFyZWQgPSBzaGFyZWQ7Ci0KLSAgICAvKiBOb3cgcmVhZCB0aGUgc2VjdGlvbiBpbWFnZXMgZnJvbSBkaXNrICovCi0gICAgcmVzdWx0ID0gUEVfaW52YWxpZERMTEltYWdlOwotICAgIGZzZWVrKGYsIHN0YXJ0T2Zmc2V0K3RleHRfb2ZmLCBTRUVLX1NFVCk7Ci0gICAgaWYgKGZyZWFkKGhNb2QtPnRleHQsIDEsIHRleHRfc2l6ZSwgZikgIT0gdGV4dF9zaXplKQotCWdvdG8gRXJyb3I7Ci0gICAgZnNlZWsoZiwgc3RhcnRPZmZzZXQrZGF0YV9vZmYsIFNFRUtfU0VUKTsKLSAgICBpZiAoZnJlYWQoaE1vZC0+ZGF0YSwgMSwgZGF0YV9zaXplLCBmKSAhPSBkYXRhX3NpemUpCi0JZ290byBFcnJvcjsKLSAgICBmc2VlayhmLCBzdGFydE9mZnNldCtleHBvcnRfb2ZmLCBTRUVLX1NFVCk7Ci0gICAgaWYgKGZyZWFkKGhNb2QtPmV4cG9ydCwgMSwgZXhwb3J0X3NpemUsIGYpICE9IGV4cG9ydF9zaXplKQotCWdvdG8gRXJyb3I7Ci0gICAgZnNlZWsoZiwgc3RhcnRPZmZzZXQrcmVsb2Nfb2ZmLCBTRUVLX1NFVCk7Ci0gICAgaWYgKGZyZWFkKHJlbG9jLCAxLCByZWxvY19zaXplLCBmKSAhPSByZWxvY19zaXplKQotCWdvdG8gRXJyb3I7Ci0KLSAgICAvKiBOb3cgcGVyZm9ybSByZWxvY2F0aW9ucyBvbiBhbGwgc2VjdGlvbnMgaW4gdGhlIGltYWdlICovCi0gICAgZGVsdGEgPSAodWxvbmcpaE1vZC0+dGV4dCAtIG9wdGhkci5JbWFnZUJhc2UgLSB0ZXh0X2FkZHI7Ci0gICAgYmFzZVJlbG9jID0gKEJBU0VfUkVMT0NBVElPTiopcmVsb2M7Ci0gICAgZm9yICg7OykgewotCS8qIENoZWNrIGZvciB0ZXJtaW5hdGlvbiBjb25kaXRpb24gKi8KLQlpZiAoIWJhc2VSZWxvYy0+UGFnZVJWQSB8fCAhYmFzZVJlbG9jLT5CbG9ja1NpemUpCi0JICAgIGJyZWFrOwotCi0JLyogRG8gZml4dXBzICovCi0JcGFnZU9mZnNldCA9IGJhc2VSZWxvYy0+UGFnZVJWQSAtIGhNb2QtPnRleHRCYXNlOwotCW51bUZpeHVwcyA9IChiYXNlUmVsb2MtPkJsb2NrU2l6ZSAtIHNpemVvZihCQVNFX1JFTE9DQVRJT04pKSAvIHNpemVvZih1c2hvcnQpOwotCWZpeHVwID0gKHVzaG9ydCopKGJhc2VSZWxvYyArIDEpOwotCWZvciAoaSA9IDA7IGkgPCBudW1GaXh1cHM7IGkrKykgewotCSAgICByZWxvY1R5cGUgPSAqZml4dXAgPj4gMTI7Ci0JICAgIGlmIChyZWxvY1R5cGUpIHsKLQkJb2Zmc2V0ID0gcGFnZU9mZnNldCArICgqZml4dXAgJiAweDBGRkYpOwotCQkqKHVsb25nKikoaE1vZC0+dGV4dCArIG9mZnNldCkgKz0gZGVsdGE7Ci0JCX0KLQkgICAgZml4dXArKzsKLQkgICAgfQotCi0JLyogTW92ZSB0byBuZXh0IHJlbG9jYXRpb24gYmxvY2sgKi8KLQliYXNlUmVsb2MgPSAoQkFTRV9SRUxPQ0FUSU9OKikoKHVsb25nKWJhc2VSZWxvYyArIGJhc2VSZWxvYy0+QmxvY2tTaXplKTsKLQl9Ci0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBmb3IgdGhlIGxvYWRlZCBETEwgKi8KLSAgICByZXN1bHQgPSBQRV91bmFibGVUb0luaXRMaWJDOwotICAgIGlmICgoSW5pdExpYkMgPSAoSW5pdExpYkNfdClQRV9nZXRQcm9jQWRkcmVzcyhoTW9kLCJfSW5pdExpYkMiKSkgPT0gTlVMTCkKLQlnb3RvIEVycm9yOwotICAgIGlmICghSW5pdExpYkMoJl9fX2ltcG9ydHMsUE1fZ2V0T1NUeXBlKCkpKQotCWdvdG8gRXJyb3I7Ci0KLSAgICAvKiBDbGVhbiB1cCwgY2xvc2UgdGhlIGZpbGUgYW5kIHJldHVybiB0aGUgbG9hZGVkIG1vZHVsZSBoYW5kbGUgKi8KLSAgICBQTV9mcmVlKHJlbG9jKTsKLSAgICByZXN1bHQgPSBQRV9vazsKLSAgICByZXR1cm4gaE1vZDsKLQotRXJyb3I6Ci0gICAgaWYgKHNoYXJlZCkKLQlQTV9mcmVlU2hhcmVkKGhNb2QpOwotICAgIGVsc2UKLQlQTV9mcmVlKGhNb2QpOwotICAgIFBNX2ZyZWUocmVsb2MpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1Mb2FkcyBhIFBvcnRhYmxlIEJpbmFyeSBETEwgaW50byBtZW1vcnkKLQotSEVBREVSOgotcGVsb2FkZXIuaAotCi1QQVJBTUVURVJTOgotc3pETExOYW1lICAgLSBOYW1lIG9mIHRoZSBQRSBETEwgbGlicmFyeSB0byBsb2FkCi1zaGFyZWQgICAgICAtIFRydWUgdG8gbG9hZCBtb2R1bGUgaW50byBzaGFyZWQgbWVtb3J5Ci0KLVJFVFVSTlM6Ci1IYW5kbGUgdG8gbG9hZGVkIFBFIERMTCwgb3IgTlVMTCBvbiBmYWlsdXJlLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBsb2FkcyBhIFBvcnRhYmxlIEJpbmFyeSBETEwgbGlicmFyeSBmcm9tIGRpc2ssIHJlbG9jYXRlcwotdGhlIGNvZGUgYW5kIHJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGxvYWRlZCBsaWJyYXJ5LiBUaGlzIGZ1bmN0aW9uCi13aWxsIG9ubHkgd29yayBvbiBETEwncyB0aGF0IGRvIG5vdCBoYXZlIGFueSBpbXBvcnRzLCBzaW5jZSB3ZSBkb24ndAotcmVzb2x2ZSBpbXBvcnQgZGVwZW5kZW5jaWVzIGluIHRoaXMgZnVuY3Rpb24uCi0KLVNFRSBBTFNPOgotUEVfZ2V0UHJvY0FkZHJlc3MsIFBFX2ZyZWVMaWJyYXJ5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUEVfTU9EVUxFICogUEVBUEkgUEVfbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pETExOYW1lLAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICBQRV9NT0RVTEUgICAqaE1vZDsKLQotI2lmIChkZWZpbmVkKF9fV0lORE9XUzMyX18pIHx8IGRlZmluZWQoX19EUklWRVJfXykpICYmIGRlZmluZWQoQ0hFQ0tFRCkKLSAgICBpZiAoIXNoYXJlZCkgewotCVBNX01PRFVMRSAgICAgICBoSW5zdDsKLQlJbml0TGliQ190ICAgICAgSW5pdExpYkM7Ci0KLQkvKiBGb3IgV2luMzIgaWYgYXJlIGJ1aWxkaW5nIGNoZWNrZWQgbGlicmFyaWVzIGZvciBkZWJ1Z2dpbmcsIHdlIHVzZQotCSAqIHRoZSByZWFsIFdpbjMyIERMTCBmdW5jdGlvbnMgc28gdGhhdCB3ZSBjYW4gZGVidWcgdGhlIHJlc3VsdGluZyBETEwKLQkgKiBmaWxlcyB3aXRoIHRoZSBXaW4zMiBkZWJ1Z2dlcnMuIE5vdGUgdGhhdCB3ZSBjYW4ndCBkbyB0aGlzIGlmCi0JICogd2UgbmVlZCB0byBsb2FkIHRoZSBmaWxlcyBpbnRvIGEgc2hhcmVkIG1lbW9yeSBjb250ZXh0LgotCSAqLwotCWlmICgoaEluc3QgPSBQTV9sb2FkTGlicmFyeShzekRMTE5hbWUpKSA9PSBOVUxMKSB7Ci0JICAgIHJlc3VsdCA9IFBFX2ZpbGVOb3RGb3VuZDsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQotCS8qIEluaXRpYWxpc2UgdGhlIEMgcnVudGltZSBsaWJyYXJ5IGZvciB0aGUgbG9hZGVkIERMTCAqLwotCXJlc3VsdCA9IFBFX3VuYWJsZVRvSW5pdExpYkM7Ci0JaWYgKChJbml0TGliQyA9ICh2b2lkKilQTV9nZXRQcm9jQWRkcmVzcyhoSW5zdCwiX0luaXRMaWJDIikpID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCWlmICghSW5pdExpYkMoJl9fX2ltcG9ydHMsUE1fZ2V0T1NUeXBlKCkpKQotCSAgICByZXR1cm4gTlVMTDsKLQotCS8qIEFsbG9jYXRlIHRoZSBQRV9NT0RVTEUgc3RydWN0dXJlICovCi0JaWYgKChoTW9kID0gUE1fbWFsbG9jKHNpemVvZigqaE1vZCkpKSA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQloTW9kLT50ZXh0ID0gKHZvaWQqKWhJbnN0OwotCWhNb2QtPnNoYXJlZCA9IC0xOwotCi0JLyogRExMIGxvYWRlZCBzdWNjZXNzZnVsbHkgc28gcmV0dXJuIG1vZHVsZSBoYW5kbGUgKi8KLQlyZXN1bHQgPSBQRV9vazsKLQlyZXR1cm4gaE1vZDsKLQl9Ci0gICAgZWxzZQotI2VuZGlmCi0JewotCUZJTEUgICAgICAgICpmOwotCXVsb25nICAgICAgIHNpemU7Ci0KLQkvKiBBdHRlbXB0IHRvIG9wZW4gdGhlIGZpbGUgb24gZGlzayAqLwotCWlmIChzaGFyZWQgPCAwKQotCSAgICBzaGFyZWQgPSAwOwotCWlmICgoZiA9IGZvcGVuKHN6RExMTmFtZSwicmIiKSkgPT0gTlVMTCkgewotCSAgICByZXN1bHQgPSBQRV9maWxlTm90Rm91bmQ7Ci0JICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JaE1vZCA9IFBFX2xvYWRMaWJyYXJ5RXh0KGYsMCwmc2l6ZSxzaGFyZWQpOwotCWZjbG9zZShmKTsKLQlyZXR1cm4gaE1vZDsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUxvYWRzIGEgUG9ydGFibGUgQmluYXJ5IERMTCBpbnRvIG1lbW9yeQotCi1IRUFERVI6Ci1wZWxvYWRlci5oCi0KLVBBUkFNRVRFUlM6Ci1zekRMTE5hbWUgICAtIE5hbWUgb2YgdGhlIFBFIERMTCBsaWJyYXJ5IHRvIGxvYWQKLXNoYXJlZCAgICAgIC0gVHJ1ZSB0byBsb2FkIG1vZHVsZSBpbnRvIHNoYXJlZCBtZW1vcnkKLQotUkVUVVJOUzoKLUhhbmRsZSB0byBsb2FkZWQgUEUgRExMLCBvciBOVUxMIG9uIGZhaWx1cmUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSByZWd1bGFyIFBFX2xvYWRMaWJyYXJ5IGZ1bmN0aW9uLCBleGNlcHQKLXRoYXQgaXQgbG9va3MgZm9yIHRoZSBkcml2ZXJzIGluIHRoZSBNR0xfUk9PVC9kcml2ZXJzIGRpcmVjdG9yeSBvciBhCi0vZHJpdmVycyBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotCi1TRUUgQUxTTzoKLVBFX2xvYWRMaWJyYXJ5TUdMLCBQRV9nZXRQcm9jQWRkcmVzcywgUEVfZnJlZUxpYnJhcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QRV9NT0RVTEUgKiBQRUFQSSBQRV9sb2FkTGlicmFyeU1HTCgKLSAgICBjb25zdCBjaGFyICpzekRMTE5hbWUsCi0gICAgaWJvb2wgc2hhcmVkKQotewotI2lmICFkZWZpbmVkKF9fV0lOMzJfVlhEX18pICYmICFkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0gICAgUEVfTU9EVUxFICAgKmhNb2Q7Ci0jZW5kaWYKLSAgICBjaGFyICAgICAgICBwYXRoWzI1Nl0gPSAiIjsKLQotICAgIC8qIFdlIGxvb2sgaW4gdGhlICdkcml2ZXJzJyBkaXJlY3RvcnksIG9wdGlvbmFsbHkgdW5kZXIgdGhlIE1HTF9ST09UCi0gICAgICogZW52aXJvbm1lbnQgdmFyaWFibGUgZGlyZWN0b3J5LgotICAgICAqLwotI2lmICFkZWZpbmVkKF9fV0lOMzJfVlhEX18pICYmICFkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0gICAgaWYgKGdldGVudigiTUdMX1JPT1QiKSkgewotCXN0cmNweShwYXRoLGdldGVudigiTUdMX1JPT1QiKSk7Ci0JUE1fYmFja3NsYXNoKHBhdGgpOwotCX0KLSAgICBzdHJjYXQocGF0aCwiZHJpdmVycyIpOwotICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKLSAgICBzdHJjYXQocGF0aCxzekRMTE5hbWUpOwotICAgIGlmICgoaE1vZCA9IFBFX2xvYWRMaWJyYXJ5KHBhdGgsc2hhcmVkKSkgIT0gTlVMTCkKLQlyZXR1cm4gaE1vZDsKLSNlbmRpZgotICAgIHN0cmNweShwYXRoLCJkcml2ZXJzIik7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLHN6RExMTmFtZSk7Ci0gICAgcmV0dXJuIFBFX2xvYWRMaWJyYXJ5KHBhdGgsc2hhcmVkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotR2V0cyBhIGZ1bmN0aW9uIGFkZHJlc3MgZnJvbSBhIFBvcnRhYmxlIEJpbmFyeSBETEwKLQotSEVBREVSOgotcGVsb2FkZXIuaAotCi1QQVJBTUVURVJTOgotaE1vZHVsZSAgICAgLSBIYW5kbGUgdG8gYSBsb2FkZWQgUEUgRExMIGxpYnJhcnkKLXN6UHJvY05hbWUgIC0gTmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBhZGRyZXNzIG9mCi0KLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBmdW5jdGlvbiwgb3IgTlVMTCBvbiBmYWlsdXJlLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG5hbWVkLCBleHBvcnRlZCBmdW5jdGlvbiBpbiBhIGxvYWRlZCBQRQotRExMIGxpYnJhcnksIGFuZCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbi4gSWYgdGhlIGZ1bmN0aW9uIGlzCi1ub3QgZm91bmQgaW4gdGhlIGxpYnJhcnksIHRoaXMgZnVuY3Rpb24gcmV0dXJuIE5VTEwuCi0KLVNFRSBBTFNPOgotUEVfbG9hZExpYnJhcnksIFBFX2ZyZWVMaWJyYXJ5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBFQVBJIFBFX2dldFByb2NBZGRyZXNzKAotICAgIFBFX01PRFVMRSAqaE1vZHVsZSwKLSAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQotewotI2lmIChkZWZpbmVkKF9fV0lORE9XUzMyX18pIHx8IGRlZmluZWQoX19EUklWRVJfXykpICYmIGRlZmluZWQoQ0hFQ0tFRCkKLSAgICBpZiAoaE1vZHVsZS0+c2hhcmVkID09IC0xKQotCXJldHVybiAodm9pZCopUE1fZ2V0UHJvY0FkZHJlc3MoaE1vZHVsZS0+dGV4dCxzelByb2NOYW1lKTsKLSAgICBlbHNlCi0jZW5kaWYKLQl7Ci0JdWludCAgICAgICAgICAgICAgICBpOwotCUVYUE9SVF9ESVJFQ1RPUlkgICAgKmV4cG9ydHM7Ci0JdWxvbmcgICAgICAgICAgICAgICBmdW5jT2Zmc2V0OwotCXVsb25nICAgICAgICAgICAgICAgKkFkZHJlc3NUYWJsZTsKLQl1bG9uZyAgICAgICAgICAgICAgICpOYW1lVGFibGU7Ci0JdXNob3J0ICAgICAgICAgICAgICAqT3JkaW5hbFRhYmxlOwotCWNoYXIgICAgICAgICAgICAgICAgKm5hbWU7Ci0KLQkvKiBGaW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBleHBvcnQgdGFibGVzIGZyb20gdGhlIGV4cG9ydCBzZWN0aW9uICovCi0JaWYgKCFoTW9kdWxlKQotCSAgICByZXR1cm4gTlVMTDsKLQlleHBvcnRzID0gKEVYUE9SVF9ESVJFQ1RPUlkqKShoTW9kdWxlLT5leHBvcnQgKyBoTW9kdWxlLT5leHBvcnREaXIpOwotCUFkZHJlc3NUYWJsZSA9ICh1bG9uZyopKGhNb2R1bGUtPmV4cG9ydCArIGV4cG9ydHMtPkFkZHJlc3NUYWJsZVJWQSAtIGhNb2R1bGUtPmV4cG9ydEJhc2UpOwotCU5hbWVUYWJsZSA9ICh1bG9uZyopKGhNb2R1bGUtPmV4cG9ydCArIGV4cG9ydHMtPk5hbWVUYWJsZVJWQSAtIGhNb2R1bGUtPmV4cG9ydEJhc2UpOwotCU9yZGluYWxUYWJsZSA9ICh1c2hvcnQqKShoTW9kdWxlLT5leHBvcnQgKyBleHBvcnRzLT5PcmRpbmFsVGFibGVSVkEgLSBoTW9kdWxlLT5leHBvcnRCYXNlKTsKLQotCS8qIFNlYXJjaCB0aGUgZXhwb3J0IG5hbWUgdGFibGUgdG8gZmluZCB0aGUgZnVuY3Rpb24gbmFtZSAqLwotCWZvciAoaSA9IDA7IGkgPCBleHBvcnRzLT5OdW1iZXJPZk5hbWVQb2ludGVyczsgaSsrKSB7Ci0JICAgIG5hbWUgPSAoY2hhciopKGhNb2R1bGUtPmV4cG9ydCArIE5hbWVUYWJsZVtpXSAtIGhNb2R1bGUtPmV4cG9ydEJhc2UpOwotCSAgICBpZiAoc3RyY21wKG5hbWUsc3pQcm9jTmFtZSkgPT0gMCkKLQkJYnJlYWs7Ci0JICAgIH0KLQlpZiAoaSA9PSBleHBvcnRzLT5OdW1iZXJPZk5hbWVQb2ludGVycykKLQkgICAgcmV0dXJuIE5VTEw7Ci0JZnVuY09mZnNldCA9IEFkZHJlc3NUYWJsZVtPcmRpbmFsVGFibGVbaV1dOwotCWlmICghZnVuY09mZnNldCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JcmV0dXJuICh2b2lkKikoaE1vZHVsZS0+dGV4dCArIGZ1bmNPZmZzZXQgLSBoTW9kdWxlLT50ZXh0QmFzZSk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1GcmVlcyBhIGxvYWRlZCBQb3J0YWJsZSBCaW5hcnkgRExMCi0KLUhFQURFUjoKLXBlbG9hZGVyLmgKLQotUEFSQU1FVEVSUzoKLWhNb2R1bGUgICAgIC0gSGFuZGxlIHRvIGEgbG9hZGVkIFBFIERMTCBsaWJyYXJ5IHRvIGZyZWUKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZnJlZXMgYSBsb2FkZWQgUEUgRExMIGxpYnJhcnkgZnJvbSBtZW1vcnkuCi0KLVNFRSBBTFNPOgotUEVfZ2V0UHJvY0FkZHJlc3MsIFBFX2xvYWRMaWJyYXJ5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQRUFQSSBQRV9mcmVlTGlicmFyeSgKLSAgICBQRV9NT0RVTEUgKmhNb2R1bGUpCi17Ci0gICAgVGVybWluYXRlTGliQ190IFRlcm1pbmF0ZUxpYkM7Ci0KLSNpZiAoZGVmaW5lZChfX1dJTkRPV1MzMl9fKSB8fCBkZWZpbmVkKF9fRFJJVkVSX18pKSAmJiBkZWZpbmVkKENIRUNLRUQpCi0gICAgaWYgKGhNb2R1bGUtPnNoYXJlZCA9PSAtMSkgewotCS8qIFJ1biB0aGUgQyBydW50aW1lIGxpYnJhcnkgZXhpdCBjb2RlIG9uIG1vZHVsZSB1bmxvYWQgKi8KLQlpZiAoKFRlcm1pbmF0ZUxpYkMgPSAoVGVybWluYXRlTGliQ190KVBNX2dldFByb2NBZGRyZXNzKGhNb2R1bGUtPnRleHQsIl9UZXJtaW5hdGVMaWJDIikpICE9IE5VTEwpCi0JICAgIFRlcm1pbmF0ZUxpYkMoKTsKLQlQTV9mcmVlTGlicmFyeShoTW9kdWxlLT50ZXh0KTsKLQlQTV9mcmVlKGhNb2R1bGUpOwotCX0KLSAgICBlbHNlCi0jZW5kaWYKLQl7Ci0JaWYgKGhNb2R1bGUpIHsKLQkgICAgLyogUnVuIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBleGl0IGNvZGUgb24gbW9kdWxlIHVubG9hZCAqLwotCSAgICBpZiAoKFRlcm1pbmF0ZUxpYkMgPSAoVGVybWluYXRlTGliQ190KVBFX2dldFByb2NBZGRyZXNzKGhNb2R1bGUsIl9UZXJtaW5hdGVMaWJDIikpICE9IE5VTEwpCi0JCVRlcm1pbmF0ZUxpYkMoKTsKLQkgICAgaWYgKGhNb2R1bGUtPnNoYXJlZCkKLQkJUE1fZnJlZVNoYXJlZChoTW9kdWxlKTsKLQkgICAgZWxzZQotCQlQTV9mcmVlKGhNb2R1bGUpOwotCSAgICB9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBlcnJvciBjb2RlIGZvciB0aGUgbGFzdCBvcGVyYXRpb24KLQotSEVBREVSOgotcGVsb2FkZXIuaAotCi1SRVRVUk5TOgotRXJyb3IgY29kZSBmb3IgdGhlIGxhc3Qgb3BlcmF0aW9uLgotCi1TRUUgQUxTTzoKLVBFX2dldFByb2NBZGRyZXNzLCBQRV9sb2FkTGlicmFyeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQRUFQSSBQRV9nZXRFcnJvcih2b2lkKQotewotICAgIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vdmVzYXZiZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL3Zlc2F2YmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2OWU1Yy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vdmVzYXZiZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgVGhlIFN1cGVyVkdBIEtpdCAtIFVuaVZCRSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBLaXQKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgSUJNIFBDIFJlYWwgTW9kZSBhbmQgMTYvMzIgYml0IFByb3RlY3RlZCBNb2RlLgotKgotKiBEZXNjcmlwdGlvbjogIE1vZHVsZSB0byBpbXBsZW1lbnQgYSBDIGNhbGxhYmxlIGludGVyZmFjZSB0byB0aGUgc3RhbmRhcmQKLSogICAgICAgICAgICAgICBWRVNBIFZCRSByb3V0aW5lcy4gWW91IHNob3VsZCByaXAgb3V0IHRoaXMgbW9kdWxlIGFuZCB1c2UgaXQKLSogICAgICAgICAgICAgICBkaXJlY3RseSBpbiB5b3VyIG93biBhcHBsaWNhdGlvbnMsIG9yIHlvdSBjYW4gdXNlIHRoZQotKiAgICAgICAgICAgICAgIGhpZ2ggbGV2ZWwgU0RLIGZ1bmN0aW9ucy4KLSoKLSogICAgICAgICAgICAgICBNVVNUIGJlIGNvbXBpbGVkIGluIHRoZSBMQVJHRSBvciBGTEFUIG1vZGVscy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInZlc2F2YmUuaCIKLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIFZCRV9TVUNDRVNTICAgICAweDAwNEYKLSNkZWZpbmUgTUFYX0xJTl9QVFJTICAgIDEwCi0KLXN0YXRpYyB1aW50ICAgICAgICAgVkVTQUJ1Zl9sZW4gPSAxMDI0Oy8qIExlbmd0aCBvZiB0aGUgVkVTQUJ1ZiBidWZmZXIgICovCi1zdGF0aWMgaWJvb2wgICAgICAgIGhhdmVSaXZhMTI4OyAgICAvKiBUcnVlIGlmIHdlIGhhdmUgYSBSaXZhMTI4ICAgICAgICAqLwotc3RhdGljIFZCRV9zdGF0ZSAgICBkZWZTdGF0ZSA9IHswfTsgLyogRGVmYXVsdCBzdGF0ZSBidWZmZXIgICAgICAgICAgICAgKi8KLXN0YXRpYyBWQkVfc3RhdGUgICAgKnN0YXRlID0gJmRlZlN0YXRlOyAvKiBQb2ludGVyIHRvIGN1cnJlbnQgYnVmZmVyICAgICovCi1zdGF0aWMgaW50ICAgICAgICAgIFZCRV9zaGFyZWQgPSAwOwotI2lmbmRlZiBSRUFMTU9ERQotc3RhdGljIGNoYXIgICAgICAgICBsb2NhbEJ1Zls1MTJdOyAgLyogR2xvYmFsIFBNIHN0cmluZyB0cmFuc2xhdGUgYnVmICAgKi8KLSNkZWZpbmUgTUFYX0xPQ0FMX0JVRiAmbG9jYWxCdWZbNTExXQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHN0YXRpYyBmdW5jdGlvbiBpbiBXaW5EaXJlY3QgZm9yIHBhc3NpbmcgMzItYml0IHJlZ2lzdGVycyB0byBCSU9TICovCi1pbnQgUE1BUEkgV0RfaW50Mzg2KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQpOwotCi12b2lkIFZCRUFQSSBWQkVfaW5pdCh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfaW5pdAotKgotKiBEZXNjcmlwdGlvbjogIEluaXRpYWxpc2VzIHRoZSBWQkUgdHJhbnNmZXIgYnVmZmVyIGluIHJlYWwgbW9kZSBEQy5tZW1vcnkuCi0qICAgICAgICAgICAgICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgVkVTQVZCRSBtb2R1bGUgZXZlcnkgdGltZQotKiAgICAgICAgICAgICAgIGl0IG5lZWRzIHRvIHVzZSB0aGUgdHJhbnNmZXIgYnVmZmVyLCBzbyB3ZSBzaW1wbHkgYWxsb2NhdGUKLSogICAgICAgICAgICAgICBpdCBvbmNlIGFuZCB0aGVuIHJldHVybi4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgaWYgKCFzdGF0ZS0+VkVTQUJ1Zl9wdHIpIHsKLQkvKiBBbGxvY2F0ZSBhIGdsb2JhbCBidWZmZXIgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgVkVTQSBWQkUgKi8KLQlpZiAoKHN0YXRlLT5WRVNBQnVmX3B0ciA9IFBNX2dldFZFU0FCdWYoJlZFU0FCdWZfbGVuLCAmc3RhdGUtPlZFU0FCdWZfcnNlZywgJnN0YXRlLT5WRVNBQnVmX3JvZmYpKSA9PSBOVUxMKQotCSAgICBQTV9mYXRhbEVycm9yKCJWRVNBVkJFLkM6IFJlYWwgbW9kZSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQhIik7Ci0JfQotfQotCi12b2lkICogVkJFQVBJIFZCRV9nZXRSTUJ1Zih1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0Uk1CdWYKLSoKLSogRGVzY3JpcHRpb246ICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxvY2F0aW9uIGFuZCBsZW5ndGggb2YgdGhlIHJlYWwKLSogICAgICAgICAgICAgICBtb2RlIG1lbW9yeSBidWZmZXIgZm9yIGNhbGxpbmcgcmVhbCBtb2RlIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgKmxlbiA9IFZFU0FCdWZfbGVuOwotICAgICpyc2VnID0gc3RhdGUtPlZFU0FCdWZfcnNlZzsKLSAgICAqcm9mZiA9IHN0YXRlLT5WRVNBQnVmX3JvZmY7Ci0gICAgcmV0dXJuIHN0YXRlLT5WRVNBQnVmX3B0cjsKLX0KLQotdm9pZCBWQkVBUEkgVkJFX3NldFN0YXRlQnVmZmVyKFZCRV9zdGF0ZSAqcykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX3NldFN0YXRlQnVmZmVyCi0qCi0qIERlc2NyaXB0aW9uOiAgVGhpcyBmdW5jdGlvbnMgc2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgYnVmZmVyIGZvciB0aGUKLSogICAgICAgICAgICAgICBWQkUgbW9kdWxlIHRvIHRoZSBwYXNzZWQgaW4gYnVmZmVyLiBCeSBkZWZhdWx0IHRoZSBpbnRlcm5hbAotKiAgICAgICAgICAgICAgIGdsb2JhbCBidWZmZXIgaXMgdXNlZCwgYnV0IHlvdSBtdXN0IHVzZSBzZXBhcmF0ZSBidWZmZXJzCi0qICAgICAgICAgICAgICAgZm9yIGVhY2ggZGV2aWNlIGluIGEgbXVsdGktY29udHJvbGxlciBlbnZpcm9ubWVudC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgc3RhdGUgPSBzOwotfQotCi12b2lkIFZCRUFQSSBWQkVfY2FsbEVTREkoUk1SRUdTICpyZWdzLCB2b2lkICpidWZmZXIsIGludCBzaXplKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfY2FsbEVTREkKLSogUGFyYW1ldGVyczogICByZWdzICAgIC0gUmVnaXN0ZXJzIHRvIGxvYWQgd2hlbiBjYWxsaW5nIFZCRQotKiAgICAgICAgICAgICAgIGJ1ZmZlciAgLSBCdWZmZXIgdG8gY29weSBWQkUgaW5mbyBibG9jayB0bwotKiAgICAgICAgICAgICAgIHNpemUgICAgLSBTaXplIG9mIGJ1ZmZlciB0byBmaWxsCi0qCi0qIERlc2NyaXB0aW9uOiAgQ2FsbHMgdGhlIFZFU0EgVkJFIGFuZCBwYXNzZXMgaW4gYSBidWZmZXIgZm9yIHRoZSBWQkUgdG8KLSogICAgICAgICAgICAgICBzdG9yZSBpbmZvcm1hdGlvbiBpbiwgd2hpY2ggaXMgdGhlbiBjb3BpZWQgaW50byB0aGUgdXNlcnMKLSogICAgICAgICAgICAgICBidWZmZXIgc3BhY2UuIFRoaXMgd29ya3MgaW4gcHJvdGVjdGVkIG1vZGUgYXMgdGhlIGJ1ZmZlcgotKiAgICAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgVkVTQSBWQkUgaXMgYWxsb2NhdGVkIGluIGNvbnZlbnRpb25hbAotKiAgICAgICAgICAgICAgIG1lbW9yeSwgYW5kIGlzIHRoZW4gY29waWVkIGludG8gdGhlIHVzZXJzIG1lbW9yeSBibG9jay4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1TUkVHUyBzcmVnczsKLQotICAgIGlmICghc3RhdGUtPlZFU0FCdWZfcHRyKQotCVBNX2ZhdGFsRXJyb3IoIllvdSAqTVVTVCogY2FsbCBWQkVfaW5pdCgpIGJlZm9yZSB5b3UgY2FuIGNhbGwgdGhlIFZFU0FWQkUuQyBtb2R1bGUhIik7Ci0gICAgc3JlZ3MuZXMgPSAodXNob3J0KXN0YXRlLT5WRVNBQnVmX3JzZWc7Ci0gICAgcmVncy0+eC5kaSA9ICh1c2hvcnQpc3RhdGUtPlZFU0FCdWZfcm9mZjsKLSAgICBtZW1jcHkoc3RhdGUtPlZFU0FCdWZfcHRyLCBidWZmZXIsIHNpemUpOwotICAgIFBNX2ludDg2eCgweDEwLCByZWdzLCByZWdzLCAmc3JlZ3MpOwotICAgIG1lbWNweShidWZmZXIsIHN0YXRlLT5WRVNBQnVmX3B0ciwgc2l6ZSk7Ci19Ci0KLSNpZm5kZWYgUkVBTE1PREUKLXN0YXRpYyBjaGFyICpWQkVfY29weVN0clRvTG9jYWwoY2hhciAqcCxjaGFyICpyZWFsUHRyLGNoYXIgKm1heCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2NvcHlTdHJUb0xvY2FsCi0qIFBhcmFtZXRlcnM6ICAgcCAgICAgICAtIEZsYXQgbW9kZWwgYnVmZmVyIHRvIGNvcHkgdG8KLSogICAgICAgICAgICAgICByZWFsUHRyIC0gUmVhbCBtb2RlIHBvaW50ZXIgdG8gY29weQotKiBSZXR1cm5zOiAgICAgIFBvaW50ZXIgdG8gdGhlIG5leHQgYnl0ZSBhZnRlciBzdHJpbmcKLSoKLSogRGVzY3JpcHRpb246ICBDb3BpZXMgdGhlIHN0cmluZyBmcm9tIHRoZSByZWFsIG1vZGUgbG9jYXRpb24gcG9pbnRlZCB0bwotKiAgICAgICAgICAgICAgIGJ5ICdyZWFsUHRyJyBpbnRvIHRoZSBmbGF0IG1vZGVsIGJ1ZmZlciBwb2ludGVkIHRvIGJ5Ci0qICAgICAgICAgICAgICAgJ3AnLiBXZSByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXh0IGJ5dGUgcGFzdCB0aGUgY29waWVkCi0qICAgICAgICAgICAgICAgc3RyaW5nLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICB1Y2hhciAgICp2OwotCi0gICAgdiA9IFBNX21hcFJlYWxQb2ludGVyKCh1aW50KSgodWxvbmcpcmVhbFB0ciA+PiAxNiksICh1aW50KSgodWxvbmcpcmVhbFB0ciAmIDB4RkZGRikpOwotICAgIHdoaWxlICgqdiAhPSAwICYmIHAgPCBtYXgpCi0JKnArKyA9ICp2Kys7Ci0gICAgKnArKyA9IDA7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyB2b2lkIFZCRV9jb3B5U2hvcnRUb0xvY2FsKHVzaG9ydCAqcCx1c2hvcnQgKnJlYWxQdHIpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9jb3B5U2hvcnRUb0xvY2FsCi0qIFBhcmFtZXRlcnM6ICAgcCAgICAgICAtIEZsYXQgbW9kZWwgYnVmZmVyIHRvIGNvcHkgdG8KLSogICAgICAgICAgICAgICByZWFsUHRyIC0gUmVhbCBtb2RlIHBvaW50ZXIgdG8gY29weQotKgotKiBEZXNjcmlwdGlvbjogIENvcGllcyB0aGUgbW9kZSB0YWJsZSBmcm9tIHJlYWwgbW9kZSBtZW1vcnkgdG8gdGhlIGZsYXQKLSogICAgICAgICAgICAgICBtb2RlbCBidWZmZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIHVzaG9ydCAgKnY7Ci0KLSAgICB2ID0gUE1fbWFwUmVhbFBvaW50ZXIoKHVpbnQpKCh1bG9uZylyZWFsUHRyID4+IDE2KSwodWludCkoKHVsb25nKXJlYWxQdHIgJiAweEZGRkYpKTsKLSAgICB3aGlsZSAoKnYgIT0gMHhGRkZGKQotCSpwKysgPSAqdisrOwotICAgICpwID0gMHhGRkZGOwotfQotI2VuZGlmCi0KLWludCBWQkVBUEkgVkJFX2RldGVjdEVYVChWQkVfdmdhSW5mbyAqdmdhSW5mbyxpYm9vbCBmb3JjZVVuaVZCRSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2RldGVjdAotKiBQYXJhbWV0ZXJzOiAgIHZnYUluZm8gLSBQbGFjZSB0byBzdG9yZSB0aGUgVkdBIGluZm9ybWF0aW9uIGJsb2NrCi0qIFJldHVybnM6ICAgICAgVkJFIHZlcnNpb24gbnVtYmVyLCBvciAwIGlmIG5vdCBkZXRlY3RlZC4KLSoKLSogRGVzY3JpcHRpb246ICBEZXRlY3RzIGlmIGEgVkVTQSBWQkUgaXMgb3V0IHRoZXJlIGFuZCBmdW5jdGlvbmluZwotKiAgICAgICAgICAgICAgIGNvcnJlY3RseS4gSWYgd2UgZGV0ZWN0IGEgVkJFIGludGVyZmFjZSB3ZSByZXR1cm4gdGhlCi0qICAgICAgICAgICAgICAgVkdBSW5mb0Jsb2NrIHJldHVybmVkIGJ5IHRoZSBWQkUgYW5kIHRoZSBWQkUgdmVyc2lvbiBudW1iZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwMDsgICAgIC8qIEdldCBTdXBlclZHQSBpbmZvcm1hdGlvbiAqLwotICAgIGlmIChmb3JjZVVuaVZCRSkgewotCXJlZ3MueC5ieCA9IDB4MTIzNDsKLQlyZWdzLnguY3ggPSAweDQzMjE7Ci0JfQotICAgIGVsc2UgewotCXJlZ3MueC5ieCA9IDA7Ci0JcmVncy54LmN4ID0gMDsKLQl9Ci0gICAgc3RybmNweSh2Z2FJbmZvLT5WRVNBU2lnbmF0dXJlLCJWQkUyIiw0KTsKLSAgICBWQkVfY2FsbEVTREkoJnJlZ3MsIHZnYUluZm8sIHNpemVvZigqdmdhSW5mbykpOwotICAgIGlmIChyZWdzLnguYXggIT0gVkJFX1NVQ0NFU1MpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKHN0cm5jbXAodmdhSW5mby0+VkVTQVNpZ25hdHVyZSwiVkVTQSIsNCkgIT0gMCkKLQlyZXR1cm4gMDsKLQotICAgIC8qIENoZWNrIGZvciBib2d1cyBCSU9TZXMgdGhhdCByZXR1cm4gYSBWQkUgdmVyc2lvbiBudW1iZXIgdGhhdCBpcwotICAgICAqIG5vdCBjb3JyZWN0LCBhbmQgZml4IGl0IHVwLiBXZSBhbHNvIGNoZWNrIHRoZSBPZW1WZW5kb3JOYW1lUHRyIGZvciBhCi0gICAgICogdmFsaWQgdmFsdWUsIGFuZCBpZiBpdCBpcyBpbnZhbGlkIHRoZW4gd2UgYWxzbyByZXNldCB0byBWQkUgMS4yLgotICAgICAqLwotICAgIGlmICh2Z2FJbmZvLT5WRVNBVmVyc2lvbiA+PSAweDIwMCAmJiB2Z2FJbmZvLT5PZW1WZW5kb3JOYW1lUHRyID09IDApCi0JdmdhSW5mby0+VkVTQVZlcnNpb24gPSAweDEwMjsKLSNpZm5kZWYgUkVBTE1PREUKLSAgICAvKiBSZWxvY2F0ZSBhbGwgdGhlIGluZGlyZWN0IGluZm9ybWF0aW9uIChtb2RlIHRhYmxlcywgT0VNIHN0cmluZ3MKLSAgICAgKiBldGMpIGZyb20gdGhlIGxvdyAxTWIgbWVtb3J5IHJlZ2lvbiBpbnRvIGEgc3RhdGljIGJ1ZmZlciBpbgotICAgICAqIG91ciBkZWZhdWx0IGRhdGEgc2VnbWVudC4gV2UgZG8gdGhpcyB0byBpbnN1bGF0ZSB0aGUgYXBwbGljYXRpb24KLSAgICAgKiBmcm9tIG1hcHBpbmcgdGhlIHN0cmluZ3MgZnJvbSByZWFsIG1vZGUgdG8gcHJvdGVjdGVkIG1vZGUuCi0gICAgICovCi0gICAgewotCWNoYXIgKnAsKnAyOwotICAgICBwMiA9IFZCRV9jb3B5U3RyVG9Mb2NhbChsb2NhbEJ1Zix2Z2FJbmZvLT5PZW1TdHJpbmdQdHIsTUFYX0xPQ0FMX0JVRik7Ci0gICAgIHZnYUluZm8tPk9lbVN0cmluZ1B0ciA9IGxvY2FsQnVmOwotICAgICBpZiAodmdhSW5mby0+VkVTQVZlcnNpb24gPj0gMHgyMDApIHsKLQkgcCA9IFZCRV9jb3B5U3RyVG9Mb2NhbChwMix2Z2FJbmZvLT5PZW1WZW5kb3JOYW1lUHRyLE1BWF9MT0NBTF9CVUYpOwotCSB2Z2FJbmZvLT5PZW1WZW5kb3JOYW1lUHRyID0gcDI7Ci0JIHAyID0gVkJFX2NvcHlTdHJUb0xvY2FsKHAsdmdhSW5mby0+T2VtUHJvZHVjdE5hbWVQdHIsTUFYX0xPQ0FMX0JVRik7Ci0JIHZnYUluZm8tPk9lbVByb2R1Y3ROYW1lUHRyID0gcDsKLQkgcCA9IFZCRV9jb3B5U3RyVG9Mb2NhbChwMix2Z2FJbmZvLT5PZW1Qcm9kdWN0UmV2UHRyLE1BWF9MT0NBTF9CVUYpOwotCSB2Z2FJbmZvLT5PZW1Qcm9kdWN0UmV2UHRyID0gcDI7Ci0JIFZCRV9jb3B5U2hvcnRUb0xvY2FsKCh1c2hvcnQqKXAsdmdhSW5mby0+VmlkZW9Nb2RlUHRyKTsKLQkgdmdhSW5mby0+VmlkZW9Nb2RlUHRyID0gKHVzaG9ydCopcDsKLQkgfQotICAgICBlbHNlIHsKLQkgVkJFX2NvcHlTaG9ydFRvTG9jYWwoKHVzaG9ydCopcDIsdmdhSW5mby0+VmlkZW9Nb2RlUHRyKTsKLQkgdmdhSW5mby0+VmlkZW9Nb2RlUHRyID0gKHVzaG9ydCopcDI7Ci0JIH0KLSAgICB9Ci0jZW5kaWYKLSAgICBzdGF0ZS0+VkJFTWVtb3J5ID0gdmdhSW5mby0+VG90YWxNZW1vcnkgKiA2NDsKLQotICAgIC8qIENoZWNrIGZvciBSaXZhMTI4IGJhc2VkIGNhcmRzIHNpbmNlIHRoZXkgaGF2ZSBicm9rZW4gdHJpcGxlIGJ1ZmZlcmluZwotICAgICAqIGFuZCBzdGVyZW8gc3VwcG9ydC4KLSAgICAgKi8KLSAgICBoYXZlUml2YTEyOCA9IGZhbHNlOwotICAgIGlmICh2Z2FJbmZvLT5WRVNBVmVyc2lvbiA+PSAweDMwMCAmJgotCSAgIChzdHJzdHIodmdhSW5mby0+T2VtU3RyaW5nUHRyLCJOVmlkaWEiKSAhPSBOVUxMIHx8Ci0JICAgIHN0cnN0cih2Z2FJbmZvLT5PZW1TdHJpbmdQdHIsIlJpdmEiKSAhPSBOVUxMKSkgewotCWhhdmVSaXZhMTI4ID0gdHJ1ZTsKLQl9Ci0KLSAgICAvKiBDaGVjayBmb3IgTWF0cm94IEc0MDAgY2FyZHMgd2hpY2ggY2xhaW0gdG8gYmUgVkJFIDMuMAotICAgICAqIGNvbXBsaWFudCB5ZXQgdGhleSBkb24ndCBpbXBsZW1lbnQgdGhlIHJlZnJlc2ggcmF0ZSBjb250cm9sCi0gICAgICogZnVuY3Rpb25zLgotICAgICAqLwotICAgIGlmICh2Z2FJbmZvLT5WRVNBVmVyc2lvbiA+PSAweDMwMCAmJiAoc3RyY21wKHZnYUluZm8tPk9lbVByb2R1Y3ROYW1lUHRyLCJNYXRyb3ggRzQwMCIpID09IDApKQotCXZnYUluZm8tPlZFU0FWZXJzaW9uID0gMHgyMDA7Ci0gICAgcmV0dXJuIChzdGF0ZS0+VkJFVmVyc2lvbiA9IHZnYUluZm8tPlZFU0FWZXJzaW9uKTsKLX0KLQotaW50IFZCRUFQSSBWQkVfZGV0ZWN0KFZCRV92Z2FJbmZvICp2Z2FJbmZvKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZGV0ZWN0Ci0qIFBhcmFtZXRlcnM6ICAgdmdhSW5mbyAtIFBsYWNlIHRvIHN0b3JlIHRoZSBWR0EgaW5mb3JtYXRpb24gYmxvY2sKLSogUmV0dXJuczogICAgICBWQkUgdmVyc2lvbiBudW1iZXIsIG9yIDAgaWYgbm90IGRldGVjdGVkLgotKgotKiBEZXNjcmlwdGlvbjogIERldGVjdHMgaWYgYSBWRVNBIFZCRSBpcyBvdXQgdGhlcmUgYW5kIGZ1bmN0aW9uaW5nCi0qICAgICAgICAgICAgICAgY29ycmVjdGx5LiBJZiB3ZSBkZXRlY3QgYSBWQkUgaW50ZXJmYWNlIHdlIHJldHVybiB0aGUKLSogICAgICAgICAgICAgICBWR0FJbmZvQmxvY2sgcmV0dXJuZWQgYnkgdGhlIFZCRSBhbmQgdGhlIFZCRSB2ZXJzaW9uIG51bWJlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgcmV0dXJuIFZCRV9kZXRlY3RFWFQodmdhSW5mbyxmYWxzZSk7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfZ2V0TW9kZUluZm8oaW50IG1vZGUsVkJFX21vZGVJbmZvICptb2RlSW5mbykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2dldE1vZGVJbmZvCi0qIFBhcmFtZXRlcnM6ICAgbW9kZSAgICAgICAgLSBWQkUgbW9kZSB0byBnZXQgaW5mb3JtYXRpb24gZm9yCi0qICAgICAgICAgICAgICAgbW9kZUluZm8gICAgLSBQbGFjZSB0byBzdG9yZSBWQkUgbW9kZSBpbmZvcm1hdGlvbgotKiBSZXR1cm5zOiAgICAgIFRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgZnVuY3Rpb24gZmFpbGVkLgotKgotKiBEZXNjcmlwdGlvbjogIE9idGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyB2aWRlbyBtb2RlIGZyb20gdGhlCi0qICAgICAgICAgICAgICAgVkJFLiBZb3Ugc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIHZpZGVvIG1vZGUKLSogICAgICAgICAgICAgICB5b3Ugd2lzaCB0byBzZXQsIGFzIHRoZSBuZXcgVkJFIDIuMCBtb2RlIG51bWJlcnMgbWF5IGJlCi0qICAgICAgICAgICAgICAgY29tcGxldGVseSBhcmJpdHJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLSAgICBpbnQgICAgIGJpdHM7Ci0KLSAgICByZWdzLnguYXggPSAweDRGMDE7ICAgICAgICAgICAgIC8qIEdldCBtb2RlIGluZm9ybWF0aW9uICAgICAgICAgKi8KLSAgICByZWdzLnguY3ggPSAodXNob3J0KW1vZGU7Ci0gICAgVkJFX2NhbGxFU0RJKCZyZWdzLCBtb2RlSW5mbywgc2l6ZW9mKCptb2RlSW5mbykpOwotICAgIGlmIChyZWdzLnguYXggIT0gVkJFX1NVQ0NFU1MpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmICgobW9kZUluZm8tPk1vZGVBdHRyaWJ1dGVzICYgdmJlTWRBdmFpbGFibGUpID09IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgLyogTWFwIG91dCB0cmlwbGUgYnVmZmVyIGFuZCBzdGVyZW8gZmxhZ3MgZm9yIE5WaWRpYSBSaXZhMTI4Ci0gICAgICogY2hpcHMuCi0gICAgICovCi0gICAgaWYgKGhhdmVSaXZhMTI4KSB7Ci0JbW9kZUluZm8tPk1vZGVBdHRyaWJ1dGVzICY9IH52YmVNZFRyaXBsZUJ1ZjsKLQltb2RlSW5mby0+TW9kZUF0dHJpYnV0ZXMgJj0gfnZiZU1kU3RlcmVvOwotCX0KLQotICAgIC8qIFN1cHBvcnQgb2xkIHN0eWxlIFJHQiBkZWZpbml0aW9ucyBmb3IgVkJFIDEuMSBCSU9TZXMgKi8KLSAgICBiaXRzID0gbW9kZUluZm8tPkJpdHNQZXJQaXhlbDsKLSAgICBpZiAobW9kZUluZm8tPk1lbW9yeU1vZGVsID09IHZiZU1lbVBLICYmIGJpdHMgPiA4KSB7Ci0JbW9kZUluZm8tPk1lbW9yeU1vZGVsID0gdmJlTWVtUkdCOwotCXN3aXRjaCAoYml0cykgewotCSAgICBjYXNlIDE1OgotCQltb2RlSW5mby0+UmVkTWFza1NpemUgPSA1OwotCQltb2RlSW5mby0+UmVkRmllbGRQb3NpdGlvbiA9IDEwOwotCQltb2RlSW5mby0+R3JlZW5NYXNrU2l6ZSA9IDU7Ci0JCW1vZGVJbmZvLT5HcmVlbkZpZWxkUG9zaXRpb24gPSA1OwotCQltb2RlSW5mby0+Qmx1ZU1hc2tTaXplID0gNTsKLQkJbW9kZUluZm8tPkJsdWVGaWVsZFBvc2l0aW9uID0gMDsKLQkJbW9kZUluZm8tPlJzdmRNYXNrU2l6ZSA9IDE7Ci0JCW1vZGVJbmZvLT5Sc3ZkRmllbGRQb3NpdGlvbiA9IDE1OwotCQlicmVhazsKLQkgICAgY2FzZSAxNjoKLQkJbW9kZUluZm8tPlJlZE1hc2tTaXplID0gNTsKLQkJbW9kZUluZm8tPlJlZEZpZWxkUG9zaXRpb24gPSAxMTsKLQkJbW9kZUluZm8tPkdyZWVuTWFza1NpemUgPSA1OwotCQltb2RlSW5mby0+R3JlZW5GaWVsZFBvc2l0aW9uID0gNTsKLQkJbW9kZUluZm8tPkJsdWVNYXNrU2l6ZSA9IDU7Ci0JCW1vZGVJbmZvLT5CbHVlRmllbGRQb3NpdGlvbiA9IDA7Ci0JCW1vZGVJbmZvLT5Sc3ZkTWFza1NpemUgPSAwOwotCQltb2RlSW5mby0+UnN2ZEZpZWxkUG9zaXRpb24gPSAwOwotCQlicmVhazsKLQkgICAgY2FzZSAyNDoKLQkJbW9kZUluZm8tPlJlZE1hc2tTaXplID0gODsKLQkJbW9kZUluZm8tPlJlZEZpZWxkUG9zaXRpb24gPSAxNjsKLQkJbW9kZUluZm8tPkdyZWVuTWFza1NpemUgPSA4OwotCQltb2RlSW5mby0+R3JlZW5GaWVsZFBvc2l0aW9uID0gODsKLQkJbW9kZUluZm8tPkJsdWVNYXNrU2l6ZSA9IDg7Ci0JCW1vZGVJbmZvLT5CbHVlRmllbGRQb3NpdGlvbiA9IDA7Ci0JCW1vZGVJbmZvLT5Sc3ZkTWFza1NpemUgPSAwOwotCQltb2RlSW5mby0+UnN2ZEZpZWxkUG9zaXRpb24gPSAwOwotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgIC8qIENvbnZlcnQgdGhlIDMyayBkaXJlY3QgY29sb3IgbW9kZXMgb2YgVkJFIDEuMisgQklPU2VzIHRvCi0gICAgICogYmUgcmVjb2duaXNlZCBhcyAxNSBiaXRzIHBlciBwaXhlbCBtb2Rlcy4KLSAgICAgKi8KLSAgICBpZiAoYml0cyA9PSAxNiAmJiBtb2RlSW5mby0+UnN2ZE1hc2tTaXplID09IDEpCi0JbW9kZUluZm8tPkJpdHNQZXJQaXhlbCA9IDE1OwotCi0gICAgLyogRml4IHVwIGJvZ3VzIEJJT1MnZXMgdGhhdCByZXBvcnQgaW5jb3JyZWN0IHJlc2VydmVkIHBpeGVsIG1hc2tzCi0gICAgICogZm9yIDMySyBjb2xvciBtb2Rlcy4gUXVpdGUgYSBudW1iZXIgb2YgQklPUydlcyBoYXZlIHRoaXMgcHJvYmxlbSwKLSAgICAgKiBhbmQgdGhpcyBhZmZlY3RzIG91ciBPUy8yIGRyaXZlcnMgaW4gVkJFIGZhbGxiYWNrIG1vZGUuCi0gICAgICovCi0gICAgaWYgKGJpdHMgPT0gMTUgJiYgKG1vZGVJbmZvLT5Sc3ZkTWFza1NpemUgIT0gMSB8fCBtb2RlSW5mby0+UnN2ZEZpZWxkUG9zaXRpb24gIT0gMTUpKSB7Ci0JbW9kZUluZm8tPlJzdmRNYXNrU2l6ZSA9IDE7Ci0JbW9kZUluZm8tPlJzdmRGaWVsZFBvc2l0aW9uID0gMTU7Ci0JfQotICAgIHJldHVybiB0cnVlOwotfQotCi1sb25nIFZCRUFQSSBWQkVfZ2V0UGFnZVNpemUoVkJFX21vZGVJbmZvICptaSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2dldFBhZ2VTaXplCi0qIFBhcmFtZXRlcnM6ICAgbWkgIC0gUG9pbnRlciB0byBtb2RlIGluZm9ybWF0aW9uIGJsb2NrCi0qIFJldHVybnM6ICAgICAgQ2FjdWxhdGVkIHBhZ2Ugc2l6ZSBpbiBieXRlcyByb3VuZGVkIHRvIGNvcnJlY3QgYm91bmRhcnkKLSoKLSogRGVzY3JpcHRpb246ICBDb21wdXRlcyB0aGUgcGFnZSBzaXplIGluIGJ5dGVzIGZvciB0aGUgc3BlY2lmaWVkIG1vZGUKLSogICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBibG9jaywgcm91bmRlZCB1cCB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkKLSogICAgICAgICAgICAgICAoOGssIDE2aywgMzJrIG9yIDY0aykuIFBhZ2VzID49IDY0ayBpbiBzaXplIGFyZSBhbHdheXMKLSogICAgICAgICAgICAgICByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IDY0ayBib3VuZGFyeSAoc28gdGhlIHN0YXJ0IG9mIGEKLSogICAgICAgICAgICAgICBwYWdlIGlzIGFsd2F5cyBiYW5rIGFsaWduZWQpLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBsb25nIHNpemU7Ci0KLSAgICBzaXplID0gKGxvbmcpbWktPkJ5dGVzUGVyU2NhbkxpbmUgKiAobG9uZyltaS0+WVJlc29sdXRpb247Ci0gICAgaWYgKG1pLT5CaXRzUGVyUGl4ZWwgPT0gNCkgewotCS8qIFdlIGhhdmUgYSAxNiBjb2xvciB2aWRlbyBtb2RlLCBzbyByb3VuZCB1cCB0aGUgcGFnZSBzaXplIHRvCi0JICogOGssIDE2aywgMzJrIG9yIDY0ayBib3VuZGFyaWVzIGRlcGVuZGluZyBvbiBob3cgbGFyZ2UgaXQgaXMuCi0JICovCi0KLQlzaXplID0gKHNpemUgKyAweDFGRkZMKSAmIDB4RkZGRkUwMDBMOwotCWlmIChzaXplICE9IDB4MjAwMCkgewotCSAgICBzaXplID0gKHNpemUgKyAweDNGRkZMKSAmIDB4RkZGRkMwMDBMOwotCSAgICBpZiAoc2l6ZSAhPSAweDQwMDApIHsKLQkJc2l6ZSA9IChzaXplICsgMHg3RkZGTCkgJiAweEZGRkY4MDAwTDsKLQkJaWYgKHNpemUgIT0gMHg4MDAwKQotCQkgICAgc2l6ZSA9IChzaXplICsgMHhGRkZGTCkgJiAweEZGRkYwMDAwTDsKLQkJfQotCSAgICB9Ci0JfQotICAgIGVsc2Ugc2l6ZSA9IChzaXplICsgMHhGRkZGTCkgJiAweEZGRkYwMDAwTDsKLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9zZXRWaWRlb01vZGVFeHQoaW50IG1vZGUsVkJFX0NSVENJbmZvICpjcnRjKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0VmlkZW9Nb2RlRXh0Ci0qIFBhcmFtZXRlcnM6ICAgbW9kZSAgICAtIFN1cGVyVkdBIHZpZGVvIG1vZGUgdG8gc2V0LgotKiBSZXR1cm5zOiAgICAgIFRydWUgaWYgdGhlIG1vZGUgd2FzIHNldCwgZmFsc2UgaWYgbm90LgotKgotKiBEZXNjcmlwdGlvbjogIEF0dGVtcHRzIHRvIHNldCB0aGUgc3BlY2lmaWVkIHZpZGVvIG1vZGUuIFRoaXMgdmVyc2lvbgotKiAgICAgICAgICAgICAgIGluY2x1ZGVzIHN1cHBvcnQgZm9yIHRoZSBWQkUvQ29yZSAzLjAgcmVmcmVzaCByYXRlIGNvbnRyb2wKLSogICAgICAgICAgICAgICBtZWNoYW5pc20uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIGlmIChzdGF0ZS0+VkJFVmVyc2lvbiA8IDB4MjAwICYmIG1vZGUgPCAweDEwMCkgewotCS8qIFNvbWUgVkJFIGltcGxlbWVudGF0aW9ucyBiYXJmIHRlcnJpYmx5IGlmIHlvdSB0cnkgdG8gc2V0IG5vbi1WQkUKLQkgKiB2aWRlbyBtb2RlcyB3aXRoIHRoZSBWQkUgc2V0IG1vZGUgY2FsbC4gVkJFIDIuMCBpbXBsZW1lbnRhdGlvbnMKLQkgKiBtdXN0IGJlIGFibGUgdG8gaGFuZGxlIHRoaXMuCi0JICovCi0JcmVncy5oLmFsID0gKHVzaG9ydCltb2RlOwotCXJlZ3MuaC5haCA9IDA7Ci0JUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0JfQotICAgIGVsc2UgewotCWlmIChzdGF0ZS0+VkJFVmVyc2lvbiA8IDB4MzAwICYmIChtb2RlICYgdmJlUmVmcmVzaEN0cmwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JcmVncy54LmF4ID0gMHg0RjAyOwotCXJlZ3MueC5ieCA9ICh1c2hvcnQpbW9kZTsKLQlpZiAoKG1vZGUgJiB2YmVSZWZyZXNoQ3RybCkgJiYgY3J0YykKLQkgICAgVkJFX2NhbGxFU0RJKCZyZWdzLCBjcnRjLCBzaXplb2YoKmNydGMpKTsKLQllbHNlCi0JICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCWlmIChyZWdzLnguYXggIT0gVkJFX1NVQ0NFU1MpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfc2V0VmlkZW9Nb2RlKGludCBtb2RlKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0VmlkZW9Nb2RlCi0qIFBhcmFtZXRlcnM6ICAgbW9kZSAgICAtIFN1cGVyVkdBIHZpZGVvIG1vZGUgdG8gc2V0LgotKiBSZXR1cm5zOiAgICAgIFRydWUgaWYgdGhlIG1vZGUgd2FzIHNldCwgZmFsc2UgaWYgbm90LgotKgotKiBEZXNjcmlwdGlvbjogIEF0dGVtcHRzIHRvIHNldCB0aGUgc3BlY2lmaWVkIHZpZGVvIG1vZGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIHJldHVybiBWQkVfc2V0VmlkZW9Nb2RlRXh0KG1vZGUsTlVMTCk7Ci19Ci0KLWludCBWQkVBUEkgVkJFX2dldFZpZGVvTW9kZSh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0VmlkZW9Nb2RlCi0qIFJldHVybnM6ICAgICAgQ3VycmVudCB2aWRlbyBtb2RlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwMzsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICBpZiAocmVncy54LmF4ICE9IFZCRV9TVUNDRVNTKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gcmVncy54LmJ4OwotfQotCi1pYm9vbCBWQkVBUEkgVkJFX3NldEJhbmsoaW50IHdpbmRvdyxpbnQgYmFuaykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX3NldEJhbmsKLSogUGFyYW1ldGVyczogICB3aW5kb3cgIC0gV2luZG93IHRvIHNldAotKiAgICAgICAgICAgICAgIGJhbmsgICAgLSBCYW5rIG51bWJlciB0byBzZXQgd2luZG93IHRvCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICByZWdzLnguYXggPSAweDRGMDU7Ci0gICAgcmVncy5oLmJoID0gMDsKLSAgICByZWdzLmguYmwgPSB3aW5kb3c7Ci0gICAgcmVncy54LmR4ID0gYmFuazsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICByZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOwotfQotCi1pbnQgVkJFQVBJIFZCRV9nZXRCYW5rKGludCB3aW5kb3cpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9zZXRCYW5rCi0qIFBhcmFtZXRlcnM6ICAgd2luZG93ICAtIFdpbmRvdyB0byByZWFkCi0qIFJldHVybnM6ICAgICAgQmFuayBudW1iZXIgZm9yIHRoZSB3aW5kb3cgKC0xIG9uIGZhaWx1cmUpCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwNTsKLSAgICByZWdzLmguYmggPSAxOwotICAgIHJlZ3MuaC5ibCA9IHdpbmRvdzsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICBpZiAocmVncy54LmF4ICE9IFZCRV9TVUNDRVNTKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gcmVncy54LmR4OwotfQotCi1pYm9vbCBWQkVBUEkgVkJFX3NldFBpeGVsc1BlckxpbmUoaW50IHBpeGVsc1BlckxpbmUsaW50ICpuZXdCeXRlcywKLSAgICBpbnQgKm5ld1BpeGVscyxpbnQgKm1heFNjYW5saW5lcykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX3NldFBpeGVsc1BlckxpbmUKLSogUGFyYW1ldGVyczogICBwaXhlbHNQZXJMaW5lICAgLSBQaXhlbHMgcGVyIHNjYW5saW5lCi0qICAgICAgICAgICAgICAgbmV3Qnl0ZXMgICAgICAgIC0gU3RvcmFnZSBmb3IgYnl0ZXMgcGVyIGxpbmUgdmFsdWUgc2V0Ci0qICAgICAgICAgICAgICAgbmV3UGl4ZWxzICAgICAgIC0gU3RvcmFnZSBmb3IgcGl4ZWxzIHBlciBsaW5lIHZhbHVlIHNldAotKiAgICAgICAgICAgICAgIG1heFNjYW5MaW5lcyAgICAtIFN0b3JhZ2UgZm9yIG1heGltdW0gbnVtYmVyIG9mIHNjYW5saW5lcwotKiBSZXR1cm5zOiAgICAgIFRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQotKgotKiBEZXNjcmlwdGlvbjogIFNldHMgdGhlIHNjYW5saW5lIGxlbmd0aCBmb3IgdGhlIHZpZGVvIG1vZGUgdG8gdGhlIHNwZWNpZmllZAotKiAgICAgICAgICAgICAgIG51bWJlciBvZiBwaXhlbHMgcGVyIHNjYW5saW5lLiBJZiB5b3UgbmVlZCBtb3JlIGdyYW51bGFyaXR5Ci0qICAgICAgICAgICAgICAgaW4gVHJ1ZUNvbG9yIG1vZGVzLCB1c2UgdGhlIFZCRV9zZXRCeXRlc1BlckxpbmUgcm91dGluZQotKiAgICAgICAgICAgICAgIChvbmx5IHZhbGlkIGZvciBWQkUgMi4wKS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHg0RjA2OwotICAgIHJlZ3MuaC5ibCA9IDA7Ci0gICAgcmVncy54LmN4ID0gcGl4ZWxzUGVyTGluZTsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICAqbmV3Qnl0ZXMgPSByZWdzLnguYng7Ci0gICAgKm5ld1BpeGVscyA9IHJlZ3MueC5jeDsKLSAgICAqbWF4U2NhbmxpbmVzID0gcmVncy54LmR4OwotICAgIHJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfc2V0Qnl0ZXNQZXJMaW5lKGludCBieXRlc1BlckxpbmUsaW50ICpuZXdCeXRlcywKLSAgICBpbnQgKm5ld1BpeGVscyxpbnQgKm1heFNjYW5saW5lcykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX3NldEJ5dGVzUGVyTGluZQotKiBQYXJhbWV0ZXJzOiAgIHBpeGVsc1BlckxpbmUgICAtIFBpeGVscyBwZXIgc2NhbmxpbmUKLSogICAgICAgICAgICAgICBuZXdCeXRlcyAgICAgICAgLSBTdG9yYWdlIGZvciBieXRlcyBwZXIgbGluZSB2YWx1ZSBzZXQKLSogICAgICAgICAgICAgICBuZXdQaXhlbHMgICAgICAgLSBTdG9yYWdlIGZvciBwaXhlbHMgcGVyIGxpbmUgdmFsdWUgc2V0Ci0qICAgICAgICAgICAgICAgbWF4U2NhbkxpbmVzICAgIC0gU3RvcmFnZSBmb3IgbWF4aW11bSBudW1iZXIgb2Ygc2NhbmxpbmVzCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlCi0qCi0qIERlc2NyaXB0aW9uOiAgU2V0cyB0aGUgc2NhbmxpbmUgbGVuZ3RoIGZvciB0aGUgdmlkZW8gbW9kZSB0byB0aGUgc3BlY2lmaWVkCi0qICAgICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHBlciBzY2FubGluZSAodmFsaWQgZm9yIFZCRSAyLjAgb25seSkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwNjsKLSAgICByZWdzLmguYmwgPSAyOwotICAgIHJlZ3MueC5jeCA9IGJ5dGVzUGVyTGluZTsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICAqbmV3Qnl0ZXMgPSByZWdzLnguYng7Ci0gICAgKm5ld1BpeGVscyA9IHJlZ3MueC5jeDsKLSAgICAqbWF4U2NhbmxpbmVzID0gcmVncy54LmR4OwotICAgIHJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfZ2V0U2NhbmxpbmVMZW5ndGgoaW50ICpieXRlc1BlckxpbmUsaW50ICpwaXhlbHNQZXJMaW5lLAotICAgIGludCAqbWF4U2NhbmxpbmVzKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0U2NhbmxpbmVMZW5ndGgKLSogUGFyYW1ldGVyczogICBieXRlc1BlckxpbmUgICAgLSBTdG9yYWdlIGZvciBieXRlcyBwZXIgc2NhbmxpbmUKLSogICAgICAgICAgICAgICBwaXhlbHNQZXJMaW5lICAgLSBTdG9yYWdlIGZvciBwaXhlbHMgcGVyIHNjYW5saW5lCi0qICAgICAgICAgICAgICAgbWF4U2NhbkxpbmVzICAgIC0gU3RvcmFnZSBmb3IgbWF4aW11bSBudW1iZXIgb2Ygc2NhbmxpbmVzCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwNjsKLSAgICByZWdzLmguYmwgPSAxOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgICpieXRlc1BlckxpbmUgPSByZWdzLnguYng7Ci0gICAgKnBpeGVsc1BlckxpbmUgPSByZWdzLnguY3g7Ci0gICAgKm1heFNjYW5saW5lcyA9IHJlZ3MueC5keDsKLSAgICByZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOwotfQotCi1pYm9vbCBWQkVBUEkgVkJFX2dldE1heFNjYW5saW5lTGVuZ3RoKGludCAqbWF4Qnl0ZXMsaW50ICptYXhQaXhlbHMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRNYXhTY2FubGluZUxlbmd0aAotKiBQYXJhbWV0ZXJzOiAgIG1heEJ5dGVzICAgIC0gTWF4aW11bSBzY2FubGluZSB3aWR0aCBpbiBieXRlcwotKiAgICAgICAgICAgICAgIG1heFBpeGVscyAgIC0gTWF4aW11bSBzY2FubGluZSB3aWR0aCBpbiBwaXhlbHMKLSogUmV0dXJuczogICAgICBUcnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIGZ1bmN0aW9uIGZhaWxlZAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICByZWdzLnguYXggPSAweDRGMDY7Ci0gICAgcmVncy5oLmJsID0gMzsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICAqbWF4Qnl0ZXMgPSByZWdzLnguYng7Ci0gICAgKm1heFBpeGVscyA9IHJlZ3MueC5jeDsKLSAgICByZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOwotfQotCi1pYm9vbCBWQkVBUEkgVkJFX3NldERpc3BsYXlTdGFydChpbnQgeCxpbnQgeSxpYm9vbCB3YWl0VlJUKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0RGlzcGxheVN0YXJ0Ci0qIFBhcmFtZXRlcnM6ICAgeCx5ICAgICAtIFBvc2l0aW9uIG9mIHRoZSBmaXJzdCBwaXhlbCB0byBkaXNwbGF5Ci0qICAgICAgICAgICAgICAgd2FpdFZSVCAtIFRydWUgdG8gd2FpdCBmb3IgcmV0cmFjZSwgZmFsc2UgaWYgbm90Ci0qIFJldHVybnM6ICAgICAgVHJ1ZSBpZiBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KLSoKLSogRGVzY3JpcHRpb246ICBTZXRzIHRoZSBuZXcgc3RhcnRpbmcgZGlzcGxheSBwb3NpdGlvbiB0byBpbXBsZW1lbnQKLSogICAgICAgICAgICAgICBoYXJkd2FyZSBzY3JvbGxpbmcuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwNzsKLSAgICBpZiAod2FpdFZSVCkKLQlyZWdzLnguYnggPSAweDgwOwotICAgIGVsc2UgcmVncy54LmJ4ID0gMHgwMDsKLSAgICByZWdzLnguY3ggPSB4OwotICAgIHJlZ3MueC5keCA9IHk7Ci0gICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0gICAgcmV0dXJuIHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUzsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9nZXREaXNwbGF5U3RhcnQoaW50ICp4LGludCAqeSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2dldERpc3BsYXlTdGFydAotKiBQYXJhbWV0ZXJzOiAgIHgseSAtIFBsYWNlIHRvIHN0b3JlIHN0YXJ0aW5nIGFkZHJlc3MgdmFsdWUKLSogUmV0dXJuczogICAgICBUcnVlIGlmIGZ1bmN0aW9uIHdhcyBzdWNjZXNzZnVsLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICByZWdzLnguYXggPSAweDRGMDc7Ci0gICAgcmVncy54LmJ4ID0gMHgwMTsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICAqeCA9IHJlZ3MueC5jeDsKLSAgICAqeSA9IHJlZ3MueC5keDsKLSAgICByZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOwotfQotCi1pYm9vbCBWQkVBUEkgVkJFX3NldERpc3BsYXlTdGFydEFsdCh1bG9uZyBzdGFydEFkZHIsaWJvb2wgd2FpdFZSVCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX3NldERpc3BsYXlTdGFydEFsdAotKiBQYXJhbWV0ZXJzOiAgIHN0YXJ0QWRkciAgIC0gMzItYml0IHN0YXJ0aW5nIGFkZHJlc3MgaW4gZGlzcGxheSBtZW1vcnkKLSogICAgICAgICAgICAgICB3YWl0VlJUICAgICAtIFRydWUgdG8gd2FpdCBmb3IgdmVydGljYWwgcmV0cmFjZSwgZmFsc2UgaWYgbm90Ci0qIFJldHVybnM6ICAgICAgVHJ1ZSBpZiBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgbm90IHN1cHBvcnRlZC4KLSoKLSogRGVzY3JpcHRpb246ICBTZXRzIHRoZSBuZXcgc3RhcnRpbmcgZGlzcGxheSBwb3NpdGlvbiB0byB0aGUgc3BlY2lmaWVkCi0qICAgICAgICAgICAgICAgMzItYml0IGRpc3BsYXkgc3RhcnQgYWRkcmVzcy4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMKLSogICAgICAgICAgICAgICBkaWZmZXJlbnQgdGhlIHRoZSB2ZXJzaW9uIGFib3ZlLCBzaW5jZSBpdCB0YWtlcyBhIDMyLWJpdAotKiAgICAgICAgICAgICAgIGJ5dGUgb2Zmc2V0IGluIHZpZGVvIG1lbW9yeSBhcyB0aGUgc3RhcnRpbmcgYWRkcmVzcyB3aGljaAotKiAgICAgICAgICAgICAgIGdpdmVzIHRoZSBwcm9ncmFtbWVyIG1heGltdW0gY29udHJvbCBvdmVyIHRoZSBzdGF0IGFkZHJlc3MuCi0qCi0qICAgICAgICAgICAgICAgTk9URTogUmVxdWlyZXMgVkJFL0NvcmUgMy4wCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIGlmIChzdGF0ZS0+VkJFVmVyc2lvbiA+PSAweDMwMCkgewotCXJlZ3MueC5heCA9IDB4NEYwNzsKLQlyZWdzLnguYnggPSB3YWl0VlJUID8gMHg4MiA6IDB4MDI7Ci0JcmVncy5lLmVjeCA9IHN0YXJ0QWRkcjsKLQlQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLQlyZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOwotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWludCBWQkVBUEkgVkJFX2dldERpc3BsYXlTdGFydFN0YXR1cyh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0RGlzcGxheVN0YXJ0U3RhdHVzCi0qIFJldHVybnM6ICAgICAgMCBpZiBsYXN0IGZsaXAgbm90IG9jY3VycmVkLCAxIGlmIGFscmVhZHkgZmxpcHBlZAotKiAgICAgICAgICAgICAgIC0xIGlmIG5vdCBzdXBwb3J0ZWQKLSoKLSogRGVzY3JpcHRpb246ICBSZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIHByZXZpb3VzIGRpc3BsYXkgc3RhcnQgcmVxdWVzdC4KLSogICAgICAgICAgICAgICBJZiB0aGlzIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCB0aGUgcHJvZ3JhbW1lciBjYW4gaW1wbGVtZW50Ci0qICAgICAgICAgICAgICAgaGFyZHdhcmUgdHJpcGxlIGJ1ZmZlcmluZyB1c2luZyB0aGlzIGZ1bmN0aW9uLgotKgotKiAgICAgICAgICAgICAgIE5PVEU6IFJlcXVpcmVzIFZCRS9Db3JlIDMuMAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgzMDApIHsKLQlyZWdzLnguYXggPSAweDRGMDc7Ci0JcmVncy54LmJ4ID0gMHgwMDA0OwotCVBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCWlmIChyZWdzLnguYXggPT0gVkJFX1NVQ0NFU1MpCi0JICAgIHJldHVybiAocmVncy54LmN4ICE9IDApOwotCX0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfZW5hYmxlU3RlcmVvTW9kZSh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZW5hYmxlU3RlcmVvTW9kZQotKiBSZXR1cm5zOiAgICAgIFRydWUgaWYgc3RlcmVvIG1vZGUgZW5hYmxlZCwgZmFsc2UgaWYgbm90IHN1cHBvcnRlZC4KLSoKLSogRGVzY3JpcHRpb246ICBQdXRzIHRoZSBzeXN0ZW0gaW50byBoYXJkd2FyZSBzdGVyZW8gbW9kZSBmb3IgTEMgc2h1dHRlcgotKiAgICAgICAgICAgICAgIGdsYXNzZXMsIHdoZXJlIHRoZSBkaXNwbGF5IHN3YXBzIGJldHdlZW4gdHdvIGRpc3BsYXkgc3RhcnQKLSogICAgICAgICAgICAgICBhZGRyZXNzZXMgZXZlcnkgdmVydGljYWwgcmV0cmFjZS4KLSoKLSogICAgICAgICAgICAgICBOT1RFOiBSZXF1aXJlcyBWQkUvQ29yZSAzLjAKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uID49IDB4MzAwKSB7Ci0JcmVncy54LmF4ID0gMHg0RjA3OwotCXJlZ3MueC5ieCA9IDB4MDAwNTsKLQlQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLQlyZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOwotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfZGlzYWJsZVN0ZXJlb01vZGUodm9pZCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2Rpc2FibGVTdGVyZW9Nb2RlCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBpZiBzdGVyZW8gbW9kZSBkaXNhYmxlZCwgZmFsc2UgaWYgbm90IHN1cHBvcnRlZC4KLSoKLSogRGVzY3JpcHRpb246ICBQdXRzIHRoZSBzeXN0ZW0gYmFjayBpbnRvIG5vcm1hbCwgbm9uLXN0ZXJlbyBkaXNwbGF5IG1vZGUKLSogICAgICAgICAgICAgICBhZnRlciBoYXZpbmcgc3RlcmVvIG1vZGUgZW5hYmxlZC4KLSoKLSogICAgICAgICAgICAgICBOT1RFOiBSZXF1aXJlcyBWQkUvQ29yZSAzLjAKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uID49IDB4MzAwKSB7Ci0JcmVncy54LmF4ID0gMHg0RjA3OwotCXJlZ3MueC5ieCA9IDB4MDAwNjsKLQlQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLQlyZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOwotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfc2V0U3RlcmVvRGlzcGxheVN0YXJ0KHVsb25nIGxlZnRBZGRyLHVsb25nIHJpZ2h0QWRkciwKLSAgICBpYm9vbCB3YWl0VlJUKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0U3RlcmVvRGlzcGxheVN0YXJ0Ci0qIFBhcmFtZXRlcnM6ICAgbGVmdEFkZHIgICAgLSAzMi1iaXQgc3RhcnQgYWRkcmVzcyBmb3IgbGVmdCBpbWFnZQotKiAgICAgICAgICAgICAgIHJpZ2h0QWRkciAgIC0gMzItYml0IHN0YXJ0IGFkZHJlc3MgZm9yIHJpZ2h0IGltYWdlCi0qICAgICAgICAgICAgICAgd2FpdFZSVCAgICAgLSBUcnVlIHRvIHdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2UsIGZhbHNlIGlmIG5vdAotKiBSZXR1cm5zOiAgICAgIFRydWUgaWYgZnVuY3Rpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIG5vdCBzdXBwb3J0ZWQuCi0qCi0qIERlc2NyaXB0aW9uOiAgU2V0cyB0aGUgbmV3IHN0YXJ0aW5nIGRpc3BsYXkgcG9zaXRpb24gdG8gdGhlIHNwZWNpZmllZAotKiAgICAgICAgICAgICAgIDMyLWJpdCBkaXNwbGF5IHN0YXJ0IGFkZHJlc3MuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzCi0qICAgICAgICAgICAgICAgZGlmZmVyZW50IHRoZSB0aGUgdmVyc2lvbiBhYm92ZSwgc2luY2UgaXQgdGFrZXMgYSAzMi1iaXQKLSogICAgICAgICAgICAgICBieXRlIG9mZnNldCBpbiB2aWRlbyBtZW1vcnkgYXMgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgd2hpY2gKLSogICAgICAgICAgICAgICBnaXZlcyB0aGUgcHJvZ3JhbW1lciBtYXhpbXVtIGNvbnRyb2wgb3ZlciB0aGUgc3RhdCBhZGRyZXNzLgotKgotKiAgICAgICAgICAgICAgIE5PVEU6IFJlcXVpcmVzIFZCRS9Db3JlIDMuMAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgzMDApIHsKLQlyZWdzLnguYXggPSAweDRGMDc7Ci0JcmVncy54LmJ4ID0gd2FpdFZSVCA/IDB4ODMgOiAweDAzOwotCXJlZ3MuZS5lY3ggPSBsZWZ0QWRkcjsKLQlyZWdzLmUuZWR4ID0gcmlnaHRBZGRyOwotCVBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCXJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdWxvbmcgVkJFQVBJIFZCRV9nZXRDbG9zZXN0Q2xvY2sodXNob3J0IG1vZGUsdWxvbmcgcGl4ZWxDbG9jaykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2dldENsb3Nlc3RDbG9jawotKiBQYXJhbWV0ZXJzOiAgIG1vZGUgICAgICAgIC0gVkJFIG1vZGUgdG8gYmUgdXNlZCAoaW5jbHVkZSB2YmVMaW5lYXJCdWZmZXIpCi0qICAgICAgICAgICAgICAgcGl4ZWxDbG9jayAgLSBEZXNpcmVkIHBpeGVsIGNsb2NrCi0qIFJldHVybnM6ICAgICAgQ2xvc2VzdCBwaXhlbCBjbG9jayB0byBkZXNpcmVkIGNsb2NrICgtMSBpZiBub3Qgc3VwcG9ydGVkKQotKgotKiBEZXNjcmlwdGlvbjogIENhbGxzIHRoZSBWQkUvQ29yZSAzLjAgaW50ZXJmYWNlIHRvIGRldGVybWluZSB0aGUgY2xvc2VzdAotKiAgICAgICAgICAgICAgIHBpeGVsIGNsb2NrIHRvIHRoZSByZXF1ZXN0ZWQgdmFsdWUuIFRoZSBCSU9TIHdpbGwgYWx3YXlzCi0qICAgICAgICAgICAgICAgc2VhcmNoIGZvciBhIHBpeGVsIGNsb2NrIHRoYXQgaXMgbm8gbW9yZSB0aGFuIDElIGJlbG93IHRoZQotKiAgICAgICAgICAgICAgIHJlcXVlc3RlZCBjbG9jayBvciBzb21ld2hlcmUgaGlnaGVyIHRoYW4gdGhlIGNsb2NrLiBJZiB0aGUKLSogICAgICAgICAgICAgICBjbG9jayBpcyBoaWdoZXIgbm90ZSB0aGF0IGl0IG1heSB3ZWxsIGJlIG1hbnkgTWh6IGhpZ2hlcgotKiAgICAgICAgICAgICAgIHRoYXQgcmVxdWVzdGVkIGFuZCB0aGUgYXBwbGljYXRpb24gd2lsbCBoYXZlIHRvIGNoZWNrIHRoYXQKLSogICAgICAgICAgICAgICB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgc3VpdGFibGUgZm9yIGl0J3MgbmVlZHMuIFRoaXMgZnVuY3Rpb24KLSogICAgICAgICAgICAgICByZXR1cm5zIHRoZSBhY3R1YWwgcGl4ZWwgY2xvY2sgdGhhdCB3aWxsIGJlIHByb2dyYW1tZWQgYnkKLSogICAgICAgICAgICAgICB0aGUgaGFyZHdhcmUuCi0qCi0qICAgICAgICAgICAgICAgTm90ZSB0aGF0IGlmIHRoZSBwaXhlbCBjbG9jayB3aWxsIGJlIHVzZWQgd2l0aCBhIGxpbmVhcgotKiAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyIG1vZGUsIG1ha2Ugc3VyZSB5b3UgcGFzcyBpbiB0aGUgbGluZWFyCi0qICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgZmxhZyB0byB0aGlzIGZ1bmN0aW9uLgotKgotKiAgICAgICAgICAgICAgIE5PVEU6IFJlcXVpcmVzIFZCRS9Db3JlIDMuMAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgzMDApIHsKLQlyZWdzLnguYXggPSAweDRGMEI7Ci0JcmVncy5oLmJsID0gMHgwMDsKLQlyZWdzLmUuZWN4ID0gcGl4ZWxDbG9jazsKLQlyZWdzLnguZHggPSBtb2RlOwotCVBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCWlmIChyZWdzLnguYXggPT0gVkJFX1NVQ0NFU1MpCi0JICAgIHJldHVybiByZWdzLmUuZWN4OwotCX0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfc2V0REFDV2lkdGgoaW50IHdpZHRoKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0REFDV2lkdGgKLSogUGFyYW1ldGVyczogICB3aWR0aCAgIC0gV2lkdGggdG8gc2V0IHRoZSBEQUMgdG8KLSogUmV0dXJuczogICAgICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHg0RjA4OwotICAgIHJlZ3MuaC5ibCA9IDB4MDA7Ci0gICAgcmVncy5oLmJoID0gd2lkdGg7Ci0gICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0gICAgcmV0dXJuIHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUzsKLX0KLQotaW50IFZCRUFQSSBWQkVfZ2V0REFDV2lkdGgodm9pZCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2dldERBQ1dpZHRoCi0qIFJldHVybnM6ICAgICAgQ3VycmVudCB3aWR0aCBvZiB0aGUgcGFsZXR0ZSBEQUMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHg0RjA4OwotICAgIHJlZ3MuaC5ibCA9IDB4MDE7Ci0gICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0gICAgaWYgKHJlZ3MueC5heCAhPSBWQkVfU1VDQ0VTUykKLQlyZXR1cm4gLTE7Ci0gICAgcmV0dXJuIHJlZ3MuaC5iaDsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9zZXRQYWxldHRlKGludCBzdGFydCxpbnQgbnVtLFZCRV9wYWxldHRlICpwYWwsaWJvb2wgd2FpdFZSVCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX3NldFBhbGV0dGUKLSogUGFyYW1ldGVyczogICBzdGFydCAgIC0gU3RhcnRpbmcgcGFsZXR0ZSBpbmRleCB0byBwcm9ncmFtCi0qICAgICAgICAgICAgICAgbnVtICAgICAtIE51bWJlciBvZiBwYWxldHRlIGluZGV4ZXMgdG8gcHJvZ3JhbQotKiAgICAgICAgICAgICAgIHBhbCAgICAgLSBQYWxldHRlIGJ1ZmZlciBjb250YWluaW5nIHZhbHVlcwotKiAgICAgICAgICAgICAgIHdhaXRWUlQgLSBXYWl0IGZvciB2ZXJ0aWNhbCByZXRyYWNlIGZsYWcKLSogUmV0dXJuczogICAgICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUKLSoKLSogRGVzY3JpcHRpb246ICBTZXRzIGEgYmxvY2sgb2YgcGFsZXR0ZSByZWdpc3RlcnMgYnkgY2FsbGluZyB0aGUgVkJFIDIuMAotKiAgICAgICAgICAgICAgIEJJT1MuIFRoaXMgZnVuY3Rpb24gd2lsbCBmYWlsIG9uIFZCRSAxLjIgaW1wbGVtZW50YXRpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICByZWdzLnguYXggPSAweDRGMDk7Ci0gICAgcmVncy5oLmJsID0gd2FpdFZSVCA/IDB4ODAgOiAweDAwOwotICAgIHJlZ3MueC5jeCA9IG51bTsKLSAgICByZWdzLnguZHggPSBzdGFydDsKLSAgICBWQkVfY2FsbEVTREkoJnJlZ3MsIHBhbCwgc2l6ZW9mKFZCRV9wYWxldHRlKSAqIG51bSk7Ci0gICAgcmV0dXJuIHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUzsKLX0KLQotdm9pZCAqIFZCRUFQSSBWQkVfZ2V0QmFua2VkUG9pbnRlcihWQkVfbW9kZUluZm8gKm1vZGVJbmZvKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0QmFua2VkUG9pbnRlcgotKiBQYXJhbWV0ZXJzOiAgIG1vZGVJbmZvICAgIC0gTW9kZSBpbmZvIGJsb2NrIGZvciB2aWRlbyBtb2RlCi0qIFJldHVybnM6ICAgICAgU2VsZWN0b3IgdG8gdGhlIGxpbmVhciBmcmFtZWJ1ZmZlciAoMCBvbiBmYWlsdXJlKQotKgotKiBEZXNjcmlwdGlvbjogIFJldHVybnMgYSBuZWFyIHBvaW50ZXIgdG8gdGhlIFZHQSBmcmFtZWJ1ZmZlciBhcmVhLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICAvKiBXZSBqdXN0IG1hcCB0aGUgcG9pbnRlciBldmVyeSB0aW1lLCBzaW5jZSB0aGUgcG9pbnRlciB3aWxsIGFsd2F5cwotICAgICAqIGJlIGluIHJlYWwgbW9kZSBtZW1vcnksIHNvIHdlIHdvbnQgYWN0dWFsbHkgYmUgbWFwcGluZyBhbnkgcmVhbAotICAgICAqIG1lbW9yeS4KLSAgICAgKgotICAgICAqIE5PVEU6IFdlIGNhbm5vdCBjdXJyZW50bHkgbWFwIGEgbmVhciBwb2ludGVyIHRvIHRoZSBiYW5rZWQgZnJhbWUKLSAgICAgKiAgICAgICBidWZmZXIgZm9yIFdhdGNvbSBXaW4zODYsIHNvIHdlIGNyZWF0ZSBhIDE2OjE2IGZhciBwb2ludGVyIHRvCi0gICAgICogICAgICAgdGhlIHZpZGVvIG1lbW9yeS4gQWxsIHRoZSBhc3NlbWJsZXIgY29kZSB3aWxsIHJlbmRlciB0byB0aGUKLSAgICAgKiAgICAgICB2aWRlbyBtZW1vcnkgYnkgbG9hZGluZyB0aGUgc2VsZWN0b3IgcmF0aGVyIHRoYW4gdXNpbmcgYQotICAgICAqICAgICAgIG5lYXIgcG9pbnRlci4KLSAgICAgKi8KLSAgICB1bG9uZyBzZWcgPSAodXNob3J0KW1vZGVJbmZvLT5XaW5BU2VnbWVudDsKLSAgICBpZiAoc2VnICE9IDApIHsKLQlpZiAoc2VnID09IDB4QTAwMCkKLQkgICAgcmV0dXJuICh2b2lkKilQTV9nZXRBMDAwMFBvaW50ZXIoKTsKLQllbHNlCi0JICAgIHJldHVybiAodm9pZCopUE1fbWFwUGh5c2ljYWxBZGRyKHNlZyA8PCA0LDB4RkZGRix0cnVlKTsKLQl9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNpZm5kZWYgUkVBTE1PREUKLQotdm9pZCAqIFZCRUFQSSBWQkVfZ2V0TGluZWFyUG9pbnRlcihWQkVfbW9kZUluZm8gKm1vZGVJbmZvKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0TGluZWFyUG9pbnRlcgotKiBQYXJhbWV0ZXJzOiAgIG1vZGVJbmZvICAgIC0gTW9kZSBpbmZvIGJsb2NrIGZvciB2aWRlbyBtb2RlCi0qIFJldHVybnM6ICAgICAgU2VsZWN0b3IgdG8gdGhlIGxpbmVhciBmcmFtZWJ1ZmZlciAoMCBvbiBmYWlsdXJlKQotKgotKiBEZXNjcmlwdGlvbjogIFJldHVybnMgYSBuZWFyIHBvaW50ZXIgdG8gdGhlIGxpbmVhciBmcmFtZWJ1ZmZlciBmb3IgdGhlIHZpZGVvCi0qICAgICAgICAgICAgICAgbW9kZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgc3RhdGljIHVsb25nIHBoeXNQdHJbTUFYX0xJTl9QVFJTXSA9IHswfTsKLSAgICBzdGF0aWMgdm9pZCAqbGluUHRyW01BWF9MSU5fUFRSU10gPSB7MH07Ci0gICAgc3RhdGljIGludCBudW1QdHJzID0gMDsKLSAgICBpbnQgaTsKLQotICAgIC8qIFNlYXJjaCBmb3IgYW4gYWxyZWFkeSBtYXBwZWQgcG9pbnRlciAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1QdHJzOyBpKyspIHsKLQlpZiAocGh5c1B0cltpXSA9PSBtb2RlSW5mby0+UGh5c0Jhc2VQdHIpCi0JICAgIHJldHVybiBsaW5QdHJbaV07Ci0JfQotICAgIGlmIChudW1QdHJzIDwgTUFYX0xJTl9QVFJTKSB7Ci0JcGh5c1B0cltudW1QdHJzXSA9IG1vZGVJbmZvLT5QaHlzQmFzZVB0cjsKLQlsaW5QdHJbbnVtUHRyc10gPSBQTV9tYXBQaHlzaWNhbEFkZHIobW9kZUluZm8tPlBoeXNCYXNlUHRyLChzdGF0ZS0+VkJFTWVtb3J5ICogMTAyNEwpLTEsdHJ1ZSk7Ci0JcmV0dXJuIGxpblB0cltudW1QdHJzKytdOwotCX0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgSW5pdFBNQ29kZSh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBJbml0UE1Db2RlICAtIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZSB2ZXJzaW9uCi0qCi0qIERlc2NyaXB0aW9uOiAgRmluZHMgdGhlIGFkZHJlc3Mgb2YgYW5kIHJlbG9jYXRlcyB0aGUgcHJvdGVjdGVkIG1vZGUKLSogICAgICAgICAgICAgICBjb2RlIGJsb2NrIGZyb20gdGhlIFZCRSAyLjAgaW50byBhIGxvY2FsIG1lbW9yeSBibG9jay4gVGhlCi0qICAgICAgICAgICAgICAgbWVtb3J5IGJsb2NrIGlzIGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpIGFuZCBtdXN0IGJlIGZyZWVkCi0qICAgICAgICAgICAgICAgd2l0aCBWQkVfZnJlZVBNQ29kZSgpIGFmdGVyIGdyYXBoaWNzIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuCi0qCi0qICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgYnVmZmVyIF9tdXN0XyBiZSByZWNvcGllZCBhZnRlciBlYWNoIG1vZGUgc2V0LAotKiAgICAgICAgICAgICAgIGFzIHRoZSByb3V0aW5lcyB3aWxsIGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcKLSogICAgICAgICAgICAgICB2aWRlbyBtb2RlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgICAgICByZWdzOwotICAgIFJNU1JFR1MgICAgIHNyZWdzOwotICAgIHVjaGFyICAgICAgICpjb2RlOwotICAgIGludCAgICAgICAgIHBtTGVuOwotCi0gICAgaWYgKCFzdGF0ZS0+cG1JbmZvICYmIHN0YXRlLT5WQkVWZXJzaW9uID49IDB4MjAwKSB7Ci0JcmVncy54LmF4ID0gMHg0RjBBOwotCXJlZ3MueC5ieCA9IDA7Ci0JUE1faW50ODZ4KDB4MTAsJnJlZ3MsJnJlZ3MsJnNyZWdzKTsKLQlpZiAocmVncy54LmF4ICE9IFZCRV9TVUNDRVNTKQotCSAgICByZXR1cm47Ci0JaWYgKFZCRV9zaGFyZWQpCi0JICAgIHN0YXRlLT5wbUluZm8gPSBQTV9tYWxsb2NTaGFyZWQocmVncy54LmN4KTsKLQllbHNlCi0JICAgIHN0YXRlLT5wbUluZm8gPSBQTV9tYWxsb2MocmVncy54LmN4KTsKLQlpZiAoc3RhdGUtPnBtSW5mbyA9PSBOVUxMKQotCSAgICByZXR1cm47Ci0Jc3RhdGUtPnBtSW5mbzMyID0gc3RhdGUtPnBtSW5mbzsKLQlwbUxlbiA9IHJlZ3MueC5jeDsKLQotCS8qIFJlbG9jYXRlIHRoZSBibG9jayBpbnRvIG91ciBsb2NhbCBkYXRhIHNlZ21lbnQgKi8KLQljb2RlID0gUE1fbWFwUmVhbFBvaW50ZXIoc3JlZ3MuZXMscmVncy54LmRpKTsKLQltZW1jcHkoc3RhdGUtPnBtSW5mbyxjb2RlLHBtTGVuKTsKLQotCS8qIE5vdyBkbyBhIHNhbml0eSBjaGVjayBvbiB0aGUgaW5mb3JtYXRpb24gd2UgcmVjaWV2ZSB0byBlbnN1cmUKLQkgKiB0aGF0IGlzIGlzIGNvcnJlY3QuIFNvbWUgQklPUyByZXR1cm4gdG90YWxseSBib2d1cyBpbmZvcm1hdGlvbgotCSAqIGluIGhlcmUgKE1hdHJveCBpcyBvbmUpISBVbmRlciBET1MgdGhpcyB3b3JrcyBPSywgYnV0IHVuZGVyIE9TLzIKLQkgKiB3ZSBhcmUgc2NyZXdlZC4KLQkgKi8KLQlpZiAoc3RhdGUtPnBtSW5mby0+c2V0V2luZG93ID49IHBtTGVuIHx8Ci0JICAgIHN0YXRlLT5wbUluZm8tPnNldERpc3BsYXlTdGFydCA+PSBwbUxlbiB8fAotCSAgICBzdGF0ZS0+cG1JbmZvLT5zZXRQYWxldHRlID49IHBtTGVuIHx8Ci0JICAgIHN0YXRlLT5wbUluZm8tPklPUHJpdkluZm8gPj0gcG1MZW4pIHsKLQkgICAgaWYgKFZCRV9zaGFyZWQpCi0JCVBNX2ZyZWVTaGFyZWQoc3RhdGUtPnBtSW5mbyk7Ci0JICAgIGVsc2UKLQkJUE1fZnJlZShzdGF0ZS0+cG1JbmZvKTsKLQkgICAgc3RhdGUtPnBtSW5mbzMyID0gc3RhdGUtPnBtSW5mbyA9IE5VTEw7Ci0JICAgIHJldHVybjsKLQkgICAgfQotCi0JLyogUmVhZCB0aGUgSU8gcHJpdmVsZWRnZSBpbmZvIGFuZCBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0bwotCSAqIHBhc3MgYSBzZWxlY3RvciB0byBNTUlPIHJlZ2lzdGVycyB0byB0aGUgYmFuayBzd2l0Y2ggY29kZS4KLQkgKiBTaW5jZSB3ZSBubyBsb25nZXIgc3VwcG9ydCBzZWxlY3RvciBhbGxvY2F0aW9uLCB3ZSBubyBsb25nZXIKLQkgKiBzdXBwb3J0IHRoaXMgbWVjaGFuaXNtIHNvIHdlIGRpc2FibGUgdGhlIHByb3RlY3RlZCBtb2RlCi0JICogaW50ZXJmYWNlIGluIHRoaXMgY2FzZS4KLQkgKi8KLQlpZiAoc3RhdGUtPnBtSW5mby0+SU9Qcml2SW5mbyAmJiAhc3RhdGUtPk1NSU9TZWwpIHsKLQkgICAgdXNob3J0ICpwID0gKHVzaG9ydCopKCh1Y2hhciopc3RhdGUtPnBtSW5mbyArIHN0YXRlLT5wbUluZm8tPklPUHJpdkluZm8pOwotCSAgICB3aGlsZSAoKnAgIT0gMHhGRkZGKQotCQlwKys7Ci0JICAgIHArKzsKLQkgICAgaWYgKCpwICE9IDB4RkZGRikKLQkJVkJFX2ZyZWVQTUNvZGUoKTsKLQkgICAgfQotCX0KLX0KLQotdm9pZCAqIFZCRUFQSSBWQkVfZ2V0U2V0QmFuayh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0U2V0QmFuawotKiBSZXR1cm5zOiAgICAgIFBvaW50ZXIgdG8gdGhlIDMyIFZCRSAyLjAgYml0IGJhbmsgc3dpdGNoaW5nIHJvdXRpbmUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIGlmIChzdGF0ZS0+VkJFVmVyc2lvbiA+PSAweDIwMCkgewotCUluaXRQTUNvZGUoKTsKLQlpZiAoc3RhdGUtPnBtSW5mbykKLQkgICAgcmV0dXJuICh1Y2hhciopc3RhdGUtPnBtSW5mbyArIHN0YXRlLT5wbUluZm8tPnNldFdpbmRvdzsKLQl9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgKiBWQkVBUEkgVkJFX2dldFNldERpc3BsYXlTdGFydCh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0U2V0RGlzcGxheVN0YXJ0Ci0qIFJldHVybnM6ICAgICAgUG9pbnRlciB0byB0aGUgMzIgVkJFIDIuMCBiaXQgQ1JUIHN0YXJ0IGFkZHJlc3Mgcm91dGluZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uID49IDB4MjAwKSB7Ci0JSW5pdFBNQ29kZSgpOwotCWlmIChzdGF0ZS0+cG1JbmZvKQotCSAgICByZXR1cm4gKHVjaGFyKilzdGF0ZS0+cG1JbmZvICsgc3RhdGUtPnBtSW5mby0+c2V0RGlzcGxheVN0YXJ0OwotCX0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCAqIFZCRUFQSSBWQkVfZ2V0U2V0UGFsZXR0ZSh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0U2V0UGFsZXR0ZQotKiBSZXR1cm5zOiAgICAgIFBvaW50ZXIgdG8gdGhlIDMyIFZCRSAyLjAgYml0IHBhbGV0dGUgcHJvZ3JhbW1pbmcgcm91dGluZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uID49IDB4MjAwKSB7Ci0JSW5pdFBNQ29kZSgpOwotCWlmIChzdGF0ZS0+cG1JbmZvKQotCSAgICByZXR1cm4gKHVjaGFyKilzdGF0ZS0+cG1JbmZvICsgc3RhdGUtPnBtSW5mby0+c2V0UGFsZXR0ZTsKLQl9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgVkJFQVBJIFZCRV9mcmVlUE1Db2RlKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9mcmVlUE1Db2RlCi0qCi0qIERlc2NyaXB0aW9uOiAgVGhpcyByb3V0aW5lIGZyZWVzIHRoZSBwcm90ZWN0ZWQgbW9kZSBjb2RlIGJsb2NrcyB0aGF0Ci0qICAgICAgICAgICAgICAgd2UgY29waWVkIGZyb20gdGhlIFZCRSAyLjAgaW50ZXJmYWNlLiBUaGlzIHJvdXRpbmUgbXVzdAotKiAgICAgICAgICAgICAgIGJlIGFmdGVyIHlvdSBoYXZlIGZpbmlzaGVkIGdyYXBoaWNzIHByb2Nlc3NpbmcgdG8gZnJlZSB1cAotKiAgICAgICAgICAgICAgIHRoZSBtZW1vcnkgb2NjdXBpZWQgYnkgdGhlIHJvdXRpbmVzLiBUaGlzIGlzIG5lY2Vzc2FyeQotKiAgICAgICAgICAgICAgIGJlY2F1c2UgdGhlIFBNIGluZm8gbWVtb3J5IGJsb2NrIG11c3QgYmUgcmUtY29waWVkIGFmdGVyCi0qICAgICAgICAgICAgICAgZXZlcnkgdmlkZW8gbW9kZSBzZXQgZnJvbSB0aGUgVkJFIDIuMCBpbXBsZW1lbnRhdGlvbi4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgaWYgKHN0YXRlLT5wbUluZm8pIHsKLQlpZiAoVkJFX3NoYXJlZCkKLQkgICAgUE1fZnJlZVNoYXJlZChzdGF0ZS0+cG1JbmZvKTsKLQllbHNlCi0JICAgIFBNX2ZyZWUoc3RhdGUtPnBtSW5mbyk7Ci0Jc3RhdGUtPnBtSW5mbyA9IE5VTEw7Ci0Jc3RhdGUtPnBtSW5mbzMyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgVkJFQVBJIFZCRV9zaGFyZVBNQ29kZSh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2hhcmVQTUNvZGUKLSoKLSogRGVzY3JpcHRpb246ICBFbmFibGVzIGludGVybmFsIHNoYXJpbmcgb2YgdGhlIFBNIGNvZGUgYnVmZmVyIGZvciBPUy8yLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBWQkVfc2hhcmVkID0gdHJ1ZTsKLX0KLQotLyogU2V0IG9mIGNvZGUgc3R1YnMgdXNlZCB0byBidWlsZCB0aGUgZmluYWwgYmFuayBzd2l0Y2ggY29kZSAqLwotCi0jZGVmaW5lIFZCRTIwX2FkanVzdE9mZnNldCAgNwotCi1zdGF0aWMgdWNoYXIgVkJFMjBBX2JhbmtGdW5jMzJfU3RhcnRbXSA9IHsKLSAgICAweDUzLDB4NTEsICAgICAgICAgICAgICAgICAgLyogIHB1c2ggICAgZWJ4LGVjeCAgICAgKi8KLSAgICAweDhCLDB4RDAsICAgICAgICAgICAgICAgICAgLyogIG1vdiAgICAgZWR4LGVheCAgICAgKi8KLSAgICAweDMzLDB4REIsICAgICAgICAgICAgICAgICAgLyogIHhvciAgICAgZWJ4LGVieCAgICAgKi8KLSAgICAweEIxLDB4MDAsICAgICAgICAgICAgICAgICAgLyogIG1vdiAgICAgY2wsMCAgICAgICAgKi8KLSAgICAweEQyLDB4RTIsICAgICAgICAgICAgICAgICAgLyogIHNobCAgICAgZGwsY2wgICAgICAgKi8KLSAgICB9OwotCi1zdGF0aWMgdWNoYXIgVkJFMjBfYmFua0Z1bmMzMl9FbmRbXSA9IHsKLSAgICAweDU5LDB4NUIsICAgICAgICAgICAgICAgICAgLyogIHBvcCAgICAgZWN4LGVieCAgICAgKi8KLSAgICB9OwotCi1zdGF0aWMgdWNoYXIgYmFua0Z1bmMzMlsxMDBdOwotCi0jZGVmaW5lIGNvcHkocCxiLGEpIG1lbWNweShiLGEsc2l6ZW9mKGEpKTsgKHApID0gKGIpICsgc2l6ZW9mKGEpCi0KLWlib29sIFZCRUFQSSBWQkVfZ2V0QmFua0Z1bmMzMihpbnQgKmNvZGVMZW4sdm9pZCAqKmJhbmtGdW5jLGludCBkdWFsQmFua3MsCi0gICAgaW50IGJhbmtBZGp1c3QpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRCYW5rRnVuYzMyCi0qIFBhcmFtZXRlcnM6ICAgY29kZUxlbiAgICAgLSBQbGFjZSB0byBzdG9yZSBsZW5ndGggb2YgY29kZQotKiAgICAgICAgICAgICAgIGJhbmtGdW5jICAgIC0gUGxhY2UgdG8gc3RvcmUgcG9pbnRlciB0byBiYW5rIHN3aXRjaCBjb2RlCi0qICAgICAgICAgICAgICAgZHVhbEJhbmtzICAgLSBUcnVlIGlmIGR1YWwgYmFua3MgYXJlIGluIGVmZmVjdAotKiAgICAgICAgICAgICAgIGJhbmtBZGp1c3QgIC0gQmFuayBzaGlmdCBhZGp1c3RtZW50IGZhY3RvcgotKiBSZXR1cm5zOiAgICAgIFRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgbm90IGNvbXBhdGlibGUuCi0qCi0qIERlc2NyaXB0aW9uOiAgQ3JlYXRlcyBhIGxvY2FsIDMyIGJpdCBiYW5rIHN3aXRjaCBmdW5jdGlvbiBmcm9tIHRoZQotKiAgICAgICAgICAgICAgIFZCRSAyLjAgYmFuayBzd2l0Y2ggY29kZSB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUKLSogICAgICAgICAgICAgICB2aXJ0dWFsIGZsYXQgZnJhbWVidWZmZXIgZGV2aWNlcyAoZG9lcyBub3QgaGF2ZSBhIHJldHVybgotKiAgICAgICAgICAgICAgIGluc3RydWN0aW9uIGF0IHRoZSBlbmQgYW5kIHRha2VzIHRoZSBiYW5rIG51bWJlciBpbiBFQVgKLSogICAgICAgICAgICAgICBub3QgRURYKS4gTm90ZSB0aGF0IHRoaXMgMzIgYml0IGNvZGUgY2Fubm90IGluY2x1ZGUgaW50IDEwaAotKiAgICAgICAgICAgICAgIGluc3RydWN0aW9ucywgc28gd2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB3ZSBoYXZlIFZCRSAyLjAKLSogICAgICAgICAgICAgICBvciBsYXRlci4KLSoKLSogICAgICAgICAgICAgICBOb3RlIHRoYXQgd2UgbmVlZCB0byBrbm93IHRoZSBsZW5ndGggb2YgdGhlIDMyIGJpdAotKiAgICAgICAgICAgICAgIGJhbmsgc3dpdGNoIGZ1bmN0aW9uLCB3aGljaCB0aGUgc3RhbmRhcmQgVkJFIDIuMCBzcGVjCi0qICAgICAgICAgICAgICAgZG9lcyBub3QgcHJvdmlkZS4gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIHdlIGhhdmUKLSogICAgICAgICAgICAgICBleHRlbmRlZCB0aGUgVkJFIDIuMCBzdGF0ZS0+cG1JbmZvIHN0cnVjdHVyZSBpbiBVbmlWQkUgNS4yIGluIGEKLSogICAgICAgICAgICAgICB3YXkgdG8gc3VwcG9ydCB0aGlzLCBhbmQgd2UgaG9wZSB0aGF0IHRoaXMgd2lsbCBiZWNvbWUKLSogICAgICAgICAgICAgICBhIFZCRSAyLjAgYW1tZW5kbWVudC4KLSoKLSogICAgICAgICAgICAgICBOb3RlIGFsc28gdGhhdCB3ZSBjYW5ub3QgcnVuIHRoZSBsaW5lYXIgZnJhbWVidWZmZXIKLSogICAgICAgICAgICAgICBlbXVsYXRpb24gY29kZSB3aXRoIGJhbmsgc3dpdGNoaW5nIHJvdXRpbmVzIHRoYXQgcmVxdWlyZQotKiAgICAgICAgICAgICAgIGEgc2VsZWN0b3IgdG8gdGhlIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXJzIHBhc3NlZCBpbiBFUy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgaW50ICAgICBsZW47Ci0gICAgdWNoYXIgICAqY29kZTsKLSAgICB1Y2hhciAgICpwOwotCi0gICAgSW5pdFBNQ29kZSgpOwotICAgIGlmIChzdGF0ZS0+VkJFVmVyc2lvbiA+PSAweDIwMCAmJiBzdGF0ZS0+cG1JbmZvMzIgJiYgIXN0YXRlLT5NTUlPU2VsKSB7Ci0JY29kZSA9ICh1Y2hhciopc3RhdGUtPnBtSW5mbzMyICsgc3RhdGUtPnBtSW5mbzMyLT5zZXRXaW5kb3c7Ci0JaWYgKHN0YXRlLT5wbUluZm8zMi0+ZXh0ZW5zaW9uU2lnID09IFZCRTIwX0VYVF9TSUcpCi0JICAgIGxlbiA9IHN0YXRlLT5wbUluZm8zMi0+c2V0V2luZG93TGVuLTE7Ci0JZWxzZSB7Ci0JICAgIC8qIFdlIGFyZSBydW5uaW5nIG9uIGEgc3lzdGVtIHdpdGhvdXQgdGhlIFVuaVZCRSA1LjIgZXh0ZW5zaW9uLgotCSAgICAgKiBXZSBkbyBhcyBiZXN0IHdlIGNhbiBieSBzY2FubmluZyB0aHJvdWdoIHRoZSBjb2RlIGZvciB0aGUKLQkgICAgICogcmV0IGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoLiBUaGlzIGlzIG5vdCBmb29scHJvb2YsCi0JICAgICAqIGJ1dCBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8uCi0JICAgICAqLwotCSAgICBwID0gY29kZTsKLQkgICAgd2hpbGUgKCpwICE9IDB4QzMpCi0JCXArKzsKLQkgICAgbGVuID0gcCAtIGNvZGU7Ci0JICAgIH0KLQlpZiAoKGxlbiArIHNpemVvZihWQkUyMEFfYmFua0Z1bmMzMl9TdGFydCkgKyBzaXplb2YoVkJFMjBfYmFua0Z1bmMzMl9FbmQpKSA+IHNpemVvZihiYW5rRnVuYzMyKSkKLQkgICAgUE1fZmF0YWxFcnJvcigiMzItYml0IGJhbmsgc3dpdGNoIGZ1bmN0aW9uIHRvbyBsb25nISIpOwotCWNvcHkocCxiYW5rRnVuYzMyLFZCRTIwQV9iYW5rRnVuYzMyX1N0YXJ0KTsKLQltZW1jcHkocCxjb2RlLGxlbik7Ci0JcCArPSBsZW47Ci0JY29weShwLHAsVkJFMjBfYmFua0Z1bmMzMl9FbmQpOwotCSpjb2RlTGVuID0gcCAtIGJhbmtGdW5jMzI7Ci0JYmFua0Z1bmMzMltWQkUyMF9hZGp1c3RPZmZzZXRdID0gKHVjaGFyKWJhbmtBZGp1c3Q7Ci0JKmJhbmtGdW5jID0gYmFua0Z1bmMzMjsKLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvY3B1aW5mby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9jcHVpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiM2FmZTIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9jcHVpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAqKiogVE9ETzogQUREIFlPVVIgT1MgRU5WSVJPTk1FTlQgTkFNRSBIRVJFICoqKgotKgotKiBEZXNjcmlwdGlvbjogIE1vZHVsZSB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgdG8gbWVhc3VyZSB0aGUKLSogICAgICAgICAgICAgICBDUFUgZnJlcXVlbmN5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPE9TLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5jcmVhc2UgdGhlIHRocmVhZCBwcmlvcml0eSB0byBtYXhpbXVtLCBpZiBwb3NzaWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IFNldE1heFRocmVhZFByaW9yaXR5KHZvaWQpCi17Ci0gICAgdGhyZWFkX2lkIHRoaWQgPSBmaW5kX3RocmVhZChOVUxMKTsKLSAgICB0aHJlYWRfaW5mbyB0aW5mbzsKLSAgICBnZXRfdGhyZWFkX2luZm8odGhpZCwgJnRpbmZvKTsKLSAgICBzZXRfdGhyZWFkX3ByaW9yaXR5KHRoaWQsIEJfUkVBTF9USU1FX1BSSU9SSVRZKTsKLSAgICByZXR1cm4gdGluZm8ucHJpb3JpdHk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgb3JpZ2luYWwgdGhyZWFkIHByaW9yaXR5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFJlc3RvcmVUaHJlYWRQcmlvcml0eSgKLSAgICBpbnQgcHJpb3JpdHkpCi17Ci0gICAgdGhyZWFkX2lkIHRoaWQgPSBmaW5kX3RocmVhZChOVUxMKTsKLSAgICBzZXRfdGhyZWFkX3ByaW9yaXR5KHRoaWQsIHByaW9yaXR5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAotICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCi17Ci0gICAgLyogVE9ETzogUmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIgaW4gaGVyZS4gWW91IHNob3VsZCB0cnkgdG8gKi8KLSAgICAvKiAgICAgICBub3JtYWxpc2UgdGhpcyB2YWx1ZSB0byBiZSBhcm91bmQgMTAwLDAwMCB0aWNrcyBwZXIgc2Vjb25kLiAqLwotICAgIGZyZXEtPmxvdyA9IDEwMDAwMDA7Ci0gICAgZnJlcS0+aGlnaCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlLgotCi1UT0RPOiBJbXBsZW1lbnQgdGhpcyB0byByZWFkIHRoZSBjb3VudGVyLiBJdCBzaG91bGQgYmUgZG9uZSBhcyBhIG1hY3JvCi0gICAgICBmb3IgYWNjdXJhY3kuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBHZXRDb3VudGVyKHQpIHsgKigoYmlndGltZV90KikgdCkgPSBzeXN0ZW1fdGltZSgpOyB9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL2V2ZW50LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL2V2ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYzZjMGEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEJlT1MKLSoKLSogRGVzY3JpcHRpb246ICBCZU9TIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaCBjcm9zcyBwbGF0Zm9ybQotKiAgICAgICAgICAgICAgIGV2ZW50IGxpYnJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdXNob3J0ICAgICAgIGtleVVwTXNnWzI1Nl0gPSB7MH07LyogVGFibGUgb2Yga2V5IHVwIG1lc3NhZ2VzICAgICAqLwotc3RhdGljIGludCAgICAgICAgICByYW5nZVgscmFuZ2VZOyAgICAgIC8qIFJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzICAgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVGhlc2UgYXJlIG5vdCB1c2VkIHVuZGVyIG5vbi1ET1Mgc3lzdGVtcyAqLwotI2RlZmluZSBfRVZUX2Rpc2FibGVJbnQoKSAgICAgICAxCi0jZGVmaW5lIF9FVlRfcmVzdG9yZUludChmbGFncykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIFNjYW4gY29kZSB0byB0ZXN0Ci0KLVJFTUFSS1M6Ci1UaGlzIG1hY3JvIGRldGVybWluZXMgaWYgYSBzcGVjaWZpZWQga2V5IGlzIGN1cnJlbnRseSBkb3duIGF0IHRoZQotdGltZSB0aGF0IHRoZSBjYWxsIGlzIG1hZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX2lzS2V5RG93bihzY2FuQ29kZSkgICAgKGtleVVwTXNnW3NjYW5Db2RlXSAhPSAwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB0aWNrcyBzaW5jZSBzeXN0ZW0KLXN0YXJ0dXAgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHBsYWNlZCBpbnRvCi10aGUgdGltZSBzdGFtcCBmaWVsZHMgb2YgZXZlbnRzLCBhbmQgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXV0byBtb3VzZSBkb3duCi1ldmVudHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX0VWVF9nZXRUaWNrcyh2b2lkKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciB5b3VyIE9TISAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVB1bXBzIGFsbCBtZXNzYWdlcyBpbiB0aGUgYXBwbGljYXRpb24gbWVzc2FnZSBxdWV1ZSBpbnRvIG91ciBldmVudCBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQotewotICAgIC8qIFRPRE86IFRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gcmVhZCBhbGwga2V5Ym9hcmQgYW5kIG1vdXNlICovCi0gICAgLyogICAgICAgZXZlbnRzIGZyb20gdGhlIE9TIHNwZWNpZmljIGV2ZW50IHF1ZXVlLCB0cmFuc2xhdGUgdGhlbSBhbmQgcG9zdCAqLwotICAgIC8qICAgICAgIHRoZW0gaW50byB0aGUgU2NpVGVjaCBldmVudCBxdWV1ZS4gKi8KLSAgICAvKiAqLwotICAgIC8qIE5PVEU6IFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBpbXBvcnRhbnQgdGhpbmdzIHRoYXQgdGhpcyBmdW5jdGlvbiBtdXN0ICovCi0gICAgLyogICAgICAgdGFrZSBjYXJlIG9mOiAqLwotICAgIC8qICovCi0gICAgLyogIDEuIFN1cHBvcnQgZm9yIEtFWURPV04sIEtFWVJFUEVBVCBhbmQgS0VZVVAgaXMgcmVxdWlyZWQuICovCi0gICAgLyogKi8KLSAgICAvKiAgMi4gU3VwcG9ydCBmb3IgcmVhZGluZyBoYXJkd2FyZSBzY2FuIGNvZGUgYXMgd2VsbCBhcyBBU0NJSSAqLwotICAgIC8qICAgICB0cmFuc2xhdGVkIHZhbHVlcyBpcyByZXF1aXJlZC4gR2FtZXMgdXNlIHRoZSBzY2FuIGNvZGVzIHJhdGhlciAqLwotICAgIC8qICAgICB0aGFuIEFTQ0lJIHZhbHVlcy4gU2NhbiBjb2RlcyBnbyBpbnRvIHRoZSBoaWdoIG9yZGVyIGJ5dGUgb2YgdGhlICovCi0gICAgLyogICAgIGtleWJvYXJkIG1lc3NhZ2UgZmllbGQuICovCi0gICAgLyogKi8KLSAgICAvKiAgMy4gU3VwcG9ydCBmb3IgYXQgbGVhc3QgcmVhZGluZyBtb3VzZSBtb3Rpb24gZGF0YSAobWlja2V5cykgZnJvbSB0aGUgKi8KLSAgICAvKiAgICAgbW91c2UgaXMgcmVxdWlyZWQuIFVzaW5nIHRoZSBtaWNrZXkgdmFsdWVzLCB3ZSBjYW4gdGhlbiB0cmFuc2xhdGUgKi8KLSAgICAvKiAgICAgdG8gbW91c2UgY3Vyc29yIGNvb3JkaW5hdGVzIHNjYWxlZCB0byB0aGUgcmFuZ2Ugb2YgdGhlIGN1cnJlbnQgKi8KLSAgICAvKiAgICAgZ3JhcGhpY3MgZGlzcGxheSBtb2RlLiBNb3VzZSB2YWx1ZXMgYXJlIHNjYWxlZCBiYXNlZCBvbiB0aGUgKi8KLSAgICAvKiAgICAgZ2xvYmFsICdyYW5nZVgnIGFuZCAncmFuZ2VZJy4gKi8KLSAgICAvKiAqLwotICAgIC8qICA0LiBTdXBwb3J0IGZvciBhIHRpbWVzdGFtcCBmb3IgdGhlIGV2ZW50cyBpcyByZXF1aXJlZCwgd2hpY2ggaXMgKi8KLSAgICAvKiAgICAgZGVmaW5lZCBhcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBzb21lIGV2ZW50ICh1c3VhbGx5ICovCi0gICAgLyogICAgIHN5c3RlbSBzdGFydHVwKS4gVGhpcyBpcyB0aGUgdGltZXN0YW1wIHdoZW4gdGhlIGV2ZW50IG9jY3VycmVkICovCi0gICAgLyogICAgIChpZTogYXQgaW50ZXJydXB0IHRpbWUpIG5vdCB3aGVuIGl0IHdhcyBzdHVmZiBpbnRvIHRoZSBTY2lUZWNoICovCi0gICAgLyogICAgIGV2ZW50IHF1ZXVlLiAqLwotICAgIC8qICovCi0gICAgLyogIDUuIFN1cHBvcnQgZm9yIG1vdXNlIGRvdWJsZSBjbGljayBldmVudHMuIElmIHRoZSBPUyBoYXMgYSBuYXRpdmUgKi8KLSAgICAvKiAgICAgbWVjaGFuaXNtIHRvIGRldGVybWluZSB0aGlzLCBpdCBzaG91bGQgYmUgdXNlZC4gT3RoZXJ3aXNlIHRoZSAqLwotICAgIC8qICAgICB0aW1lIHN0YW1wIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBieSB0aGUgZ2VuZXJpYyBldmVudCBjb2RlICovCi0gICAgLyogICAgIHRvIGdlbmVyYXRlIGRvdWJsZSBjbGljayBldmVudHMuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBtYWNyby9mdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnRzIHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZQota2V5Ym9hcmQgdG8gb3VyIGV2ZW50IGxpYnJhcmllcyBub3JtYWxpc2VkIGZvcm1hdC4gV2Ugb25seSBoYXZlIG9uZSBzY2FuCi1jb2RlIGZvciB0aGUgJ0EnIGtleSwgYW5kIHVzZSBzaGlmdCBtb2RpZmllcnMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEKLUN0cmwtRjEsIEFsdC1GMSBldGMuIFRoZSByYXcgc2NhbiBjb2RlcyBmcm9tIHRoZSBrZXlib2FyZCB3b3JrIHRoaXMgd2F5LAotYnV0IHRoZSBPUyBnaXZlcyB1cyAnY29va2VkJyBzY2FuIGNvZGVzLCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSB0aGVtIGJhY2sKLXRvIHRoZSByYXcgZm9ybWF0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9tYXNrS2V5Q29kZShldnQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2FmZWx5IGFib3J0IHRoZSBldmVudCBtb2R1bGUgdXBvbiBjYXRjaGluZyBhIGZhdGFsIGVycm9yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9hYm9ydCgpCi17Ci0gICAgRVZUX2V4aXQoKTsKLSAgICBQTV9mYXRhbEVycm9yKCJVbmhhbmRsZWQgZXhjZXB0aW9uISIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1vdXNlTW92ZSAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuZXZlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZAotCi1SRU1BUktTOgotSW5pdGlsaWFzZSB0aGUgZXZlbnQgaGFuZGxpbmcgbW9kdWxlLiBIZXJlIHdlIGluc3RhbGwgb3VyIG1vdXNlIGhhbmRsaW5nIElTUgotdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGFueSBidXR0b24ncyBhcmUgcHJlc3NlZCBvciByZWxlYXNlZC4gV2UgYWxzbyBidWlsZAotdGhlIGZyZWUgbGlzdCBvZiBldmVudHMgaW4gdGhlIGV2ZW50IHF1ZXVlLgotCi1XZSB1c2UgaGFuZGxlciBudW1iZXIgMiBvZiB0aGUgbW91c2UgbGlicmFyaWVzIGludGVycnVwdCBoYW5kbGVycyBmb3Igb3VyCi1ldmVudCBoYW5kbGluZyByb3V0aW5lcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfaW5pdCgKLSAgICBfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKQotewotICAgIC8qIEluaXRpYWxpc2UgdGhlIGV2ZW50IHF1ZXVlICovCi0gICAgX21vdXNlTW92ZSA9IG1vdXNlTW92ZTsKLSAgICBpbml0RXZlbnRRdWV1ZSgpOwotICAgIG1lbXNldChrZXlVcE1zZywwLHNpemVvZihrZXlVcE1zZykpOwotCi0gICAgLyogVE9ETzogRG8gYW55IE9TIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uIGhlcmUgKi8KLQotICAgIC8qIENhdGNoIHByb2dyYW0gdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KLSAgICBzaWduYWwoU0lHQUJSVCwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0ZQRSwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0lOVCwgX0VWVF9hYm9ydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1DaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQotc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcwotbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMpCi17Ci0gICAgcmFuZ2VYID0geFJlczsKLSAgICByYW5nZVkgPSB5UmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWlsaXNlcyB0aGUgaW50ZXJuYWwgZXZlbnQgaGFuZGxpbmcgbW9kdWxlcy4gVGhlIEVWVF9zdXNwZW5kIGZ1bmN0aW9uCi1jYW4gYmUgY2FsbGVkIHRvIHN1c3BlbmQgZXZlbnQgaGFuZGxpbmcgKHN1Y2ggYXMgd2hlbiBzaGVsbGluZyBvdXQgdG8gRE9TKSwKLWFuZCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3VtZSBpdCBhZ2FpbiBsYXRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9yZXN1bWUodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBub24gRE9TIHN5c3RlbXMgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLVN1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KLWRlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfc3VzcGVuZCh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIG5vbiBET1Mgc3lzdGVtcyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX2V4aXQodm9pZCkKLXsKLSAgICAvKiBSZXN0b3JlIHNpZ25hbCBoYW5kbGVycyAqLwotICAgIHNpZ25hbChTSUdBQlJULCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHRlBFLCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKLQotICAgIC8qIFRPRE86IERvIGFueSBPUyBzcGVjaWZpYyBjbGVhbnVwIGluIGhlcmUgKi8KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3Mvb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3Mvb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzZDczZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBCZU9TCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoaXMgaXMgd2hlcmUgeW91IGluY2x1ZGUgT1Mgc3BlY2lmaWMgaGVhZGVycyBmb3IgdGhlIGV2ZW50IGhhbmRsaW5nICovCi0vKiBsaWJyYXJ5LiAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9wbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGNiMWI4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDUzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBCZU9TCi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiBUT0RPOiBJbmNsdWRlIGFueSBCZU9TIHNwZWNpZmljIGhlYWRlcnMgaGVyZSEgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBEbyBhbnkgaW5pdGlhbGlzYXRpb24gaW4gaGVyZS4gVGhpcyBpbmNsdWRlcyBnZXR0aW5nIElPUEwgKi8KLSAgICAvKiAgICAgICBhY2Nlc3MgZm9yIHRoZSBwcm9jZXNzIGNhbGxpbmcgUE1faW5pdC4gVGhpcyB3aWxsIGdldCBjYWxsZWQgKi8KLSAgICAvKiAgICAgICBtb3JlIHRoYW4gb25jZS4gKi8KLQotICAgIC8qIFRPRE86IElmIHlvdSBzdXBwb3J0IHRoZSBzdXBwbGllZCBNVFJSIHJlZ2lzdGVyIHN0dWZmICh5b3UgbmVlZCB0byAqLwotICAgIC8qICAgICAgIGJlIGF0IHJpbmcgMCBmb3IgdGhpcyEpLCB5b3Ugc2hvdWxkIGluaXRpYWxpc2UgaXQgaW4gaGVyZS4gKi8KLQotLyogTVRSUl9pbml0KCk7ICovCi19Ci0KLWxvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCi17IHJldHVybiBfT1NfQkVPUzsgfQotCi1pbnQgUE1BUEkgUE1fZ2V0TW9kZVR5cGUodm9pZCkKLXsgcmV0dXJuIFBNXzM4NjsgfQotCi12b2lkIFBNQVBJIFBNX2JhY2tzbGFzaChjaGFyICpzKQotewotICAgIHVpbnQgcG9zID0gc3RybGVuKHMpOwotICAgIGlmIChzW3Bvcy0xXSAhPSAnLycpIHsKLQlzW3Bvc10gPSAnLyc7Ci0Jc1twb3MrMV0gPSAnXDAnOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRGYXRhbEVycm9yQ2xlYW51cCgKLSAgICB2b2lkIChQTUFQSVAgY2xlYW51cCkodm9pZCkpCi17Ci0gICAgZmF0YWxFcnJvckNsZWFudXAgPSBjbGVhbnVwOwotfQotCi12b2lkIFBNQVBJIFBNX2ZhdGFsRXJyb3IoY29uc3QgY2hhciAqbXNnKQotewotICAgIC8qIFRPRE86IElmIHlvdSBhcmUgcnVubmluZyBpbiBhIEdVSSBlbnZpcm9ubWVudCB3aXRob3V0IGEgY29uc29sZSwgKi8KLSAgICAvKiAgICAgICB0aGlzIG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gYnJpbmcgdXAgYSBmYXRhbCBlcnJvciBtZXNzYWdlICovCi0gICAgLyogICAgICAgYm94IGFuZCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0uICovCi0gICAgaWYgKGZhdGFsRXJyb3JDbGVhbnVwKQotCWZhdGFsRXJyb3JDbGVhbnVwKCk7Ci0gICAgZnByaW50ZihzdGRlcnIsIiVzXG4iLCBtc2cpOwotICAgIGV4aXQoMSk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKHVpbnQgKmxlbix1aW50ICpyc2VnLHVpbnQgKnJvZmYpCi17Ci0gICAgLyogTm8gQklPUyBhY2Nlc3MgZm9yIHRoZSBCZU9TICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGEga2V5IGlzIGF2YWlsYWJsZSB0byBiZSByZWFkLiBUaGlzICovCi0gICAgLyogICAgICAgc2hvdWxkIGJlIGltcGxlbWVudGVkLCBidXQgaXMgbW9zdGx5IHVzZWQgYnkgdGhlIHRlc3QgcHJvZ3JhbXMgKi8KLSAgICAvKiAgICAgICB0aGVzZSBkYXlzLiAqLwotICAgIHJldHVybiB0cnVlOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIHJldHVybnMgdGhlIEFTQ0lJIGNvZGUgb2YgdGhlIGtleSBwcmVzc2VkLiBUaGlzICovCi0gICAgLyogICAgICAgc2hvdWxkIGJlIGltcGxlbWVudGVkLCBidXQgaXMgbW9zdGx5IHVzZWQgYnkgdGhlIHRlc3QgcHJvZ3JhbXMgKi8KLSAgICAvKiAgICAgICB0aGVzZSBkYXlzLiAqLwotICAgIHJldHVybiAweEQ7Ci19Ci0KLWludCBQTUFQSSBQTV9vcGVuQ29uc29sZSh2b2lkKQotewotICAgIC8qIFRPRE86IE9wZW5zIHVwIGEgZnVsbHNjcmVlbiBjb25zb2xlIGZvciBncmFwaGljcyBvdXRwdXQuIElmIHlvdXIgKi8KLSAgICAvKiAgICAgICBjb25zb2xlIGRvZXMgbm90IGhhdmUgZ3JhcGhpY3MvdGV4dCBtb2RlcywgdGhpcyBjYW4gYmUgbGVmdCAqLwotICAgIC8qICAgICAgIGVtcHR5LiBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgaXMgdG8gZGlzYWJsZSBjb25zb2xlIHN3aXRjaGluZyAqLwotICAgIC8qICAgICAgIHdoZW4gaW4gZ3JhcGhpY3MgbW9kZXMgaWYgeW91IGNhbiBzd2l0Y2ggYXdheSBmcm9tIGZ1bGxzY3JlZW4gKi8KLSAgICAvKiAgICAgICBjb25zb2xlcyAoaWYgeW91IHdhbnQgdG8gYWxsb3cgc3dpdGNoaW5nLCB0aGlzIGNhbiBiZSBkb25lICovCi0gICAgLyogICAgICAgZWxzZXdoZXJlIHdpdGggYSBmdWxsIHNhdmUvcmVzdG9yZSBzdGF0ZSBvZiB0aGUgZ3JhcGhpY3MgbW9kZSkuICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKHZvaWQpCi17Ci0gICAgLyogVE9ETzogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgY29uc29sZSBzdGF0ZSBidWZmZXIgdXNlZCB0byBzYXZlIHRoZSAqLwotICAgIC8qICAgICAgIHN0YXRlIG9mIHRoZSBjb25zb2xlIGJlZm9yZSBnb2luZyBpbnRvIGdyYXBoaWNzIG1vZGUuIFRoaXMgaXMgKi8KLSAgICAvKiAgICAgICB1c2VkIHRvIHJlc3RvcmUgdGhlIGNvbnNvbGUgYmFjayB0byBub3JtYWwgd2hlbiB3ZSBhcmUgZG9uZS4gKi8KLSAgICByZXR1cm4gMTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKHZvaWQgKnN0YXRlQnVmLGludCBjb25zb2xlX2lkKQotewotICAgIC8qIFRPRE86IFNhdmVzIHRoZSBzdGF0ZSBvZiB0aGUgY29uc29sZSBpbnRvIHRoZSBzdGF0ZSBidWZmZXIuIFRoaXMgaXMgKi8KLSAgICAvKiAgICAgICB1c2VkIHRvIHJlc3RvcmUgdGhlIGNvbnNvbGUgYmFjayB0byBub3JtYWwgd2hlbiB3ZSBhcmUgZG9uZS4gKi8KLSAgICAvKiAgICAgICBXZSB3aWxsIGFsd2F5cyByZXN0b3JlIDgweDI1IHRleHQgbW9kZSBhZnRlciBiZWluZyBpbiBncmFwaGljcyAqLwotICAgIC8qICAgICAgIG1vZGUsIHNvIGlmIHJlc3RvcmluZyB0ZXh0IG1vZGUgaXMgYWxsIHlvdSBuZWVkIHRvIGRvIHRoaXMgY2FuICovCi0gICAgLyogICAgICAgYmUgbGVmdCBlbXB0eS4gKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKGNvbnN0IHZvaWQgKnN0YXRlQnVmLGludCBjb25zb2xlX2lkKQotewotICAgIC8qIFRPRE86IFJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlIGZyb20gdGhlIHN0YXRlIGJ1ZmZlci4gVGhpcyBpcyAqLwotICAgIC8qICAgICAgIHVzZWQgdG8gcmVzdG9yZSB0aGUgY29uc29sZSBiYWNrIHRvIG5vcm1hbCB3aGVuIHdlIGFyZSBkb25lLiAqLwotICAgIC8qICAgICAgIFdlIHdpbGwgYWx3YXlzIHJlc3RvcmUgODB4MjUgdGV4dCBtb2RlIGFmdGVyIGJlaW5nIGluIGdyYXBoaWNzICovCi0gICAgLyogICAgICAgbW9kZSwgc28gaWYgcmVzdG9yaW5nIHRleHQgbW9kZSBpcyBhbGwgeW91IG5lZWQgdG8gZG8gdGhpcyBjYW4gKi8KLSAgICAvKiAgICAgICBiZSBsZWZ0IGVtcHR5LiAqLwotfQotCi12b2lkIFBNQVBJIFBNX2Nsb3NlQ29uc29sZShpbnQgY29uc29sZV9pZCkKLXsKLSAgICAvKiBUT0RPOiBDbG9zZSB0aGUgY29uc29sZSB3aGVuIHdlIGFyZSBkb25lLCBnb2luZyBiYWNrIHRvIHRleHQgbW9kZS4gKi8KLX0KLQotdm9pZCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKGludCB4LGludCB5KQotewotICAgIC8qIFRPRE86IFNldCB0aGUgT1MgY29uc29sZSBjdXJzb3IgbG9jYXRpb24gdG8gdGhlIG5ldyB2YWx1ZS4gVGhpcyBpcyAqLwotICAgIC8qICAgICAgIGdlbmVyYWxseSB1c2VkIGZvciBuZXcgT1MgcG9ydHMgKHVzZWQgbW9zdGx5IGZvciBET1MpLiAqLwotfQotCi12b2lkIFBNX3NldE9TU2NyZWVuV2lkdGgoaW50IHdpZHRoLGludCBoZWlnaHQpCi17Ci0gICAgLyogVE9ETzogU2V0IHRoZSBPUyBjb25zb2xlIHNjcmVlbiB3aWR0aC4gVGhpcyBpcyBnZW5lcmFsbHkgdW51c2VkIGZvciAqLwotICAgIC8qICAgICAgIG5ldyBPUyBwb3J0cy4gKi8KLX0KLQotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUE1faW50SGFuZGxlciBpaCwgaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBUT0RPOiBJbnN0YWxsIGEgcmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBoYW5kbGVyLiBOb3JtYWxseSB0aGlzICovCi0gICAgLyogICAgICAgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGZyb20gbW9zdCBPUydlcyBpbiB1c2VyIGxhbmQsIHNvIGFuICovCi0gICAgLyogICAgICAgYWx0ZXJuYXRpdmUgbWVjaGFuaXNtIGlzIG5lZWRlZCB0byBlbmFibGUgc29mdHdhcmUgc3RlcmVvLiAqLwotICAgIC8qICAgICAgIEhlbmNlIGxlYXZlIHRoaXMgdW5pbXBsZW1lbnRlZCB1bmxlc3MgeW91IGhhdmUgYSBoaWdoIHByaW9yaXR5ICovCi0gICAgLyogICAgICAgbWVjaGFuaXNtIHRvIGNhbGwgdGhlIDMyLWJpdCBjYWxsYmFjayB3aGVuIHRoZSByZWFsIHRpbWUgY2xvY2sgKi8KLSAgICAvKiAgICAgICBpbnRlcnJ1cHQgZmlyZXMuICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBUT0RPOiBTZXQgdGhlIHJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgZnJlcXVlbmN5LiBVc2VkIGZvciBzdGVyZW8gKi8KLSAgICAvKiAgICAgICBMQyBzaHV0dGVyIGdsYXNzZXMgd2hlbiBkb2luZyBzb2Z0d2FyZSBzdGVyZW8uIFVzdWFsbHkgc2V0cyAqLwotICAgIC8qICAgICAgIHRoZSBmcmVxdWVuY3kgdG8gYXJvdW5kIDIwNDggSHouICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgLyogVE9ETzogUmVzdG9yZXMgdGhlIHJlYWwgdGltZSBjbG9jayBoYW5kbGVyLiAqLwotfQotCi1jaGFyICogUE1BUEkgUE1fZ2V0Q3VycmVudFBhdGgoCi0gICAgY2hhciAqcGF0aCwKLSAgICBpbnQgbWF4TGVuKQotewotICAgIHJldHVybiBnZXRjd2QocGF0aCxtYXhMZW4pOwotfQotCi1jaGFyIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKQoteyByZXR1cm4gJy8nOyB9Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRWQkVBRlBhdGgodm9pZCkKLXsgcmV0dXJuIFBNX2dldE51Y2xldXNDb25maWdQYXRoKCk7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpCi17Ci0gICAgY2hhciAqZW52ID0gZ2V0ZW52KCJOVUNMRVVTX1BBVEgiKTsKLSAgICByZXR1cm4gZW52ID8gZW52IDogIi91c3IvbGliL251Y2xldXMiOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07Ci0gICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCi17Ci0gICAgLyogVE9ETzogUmV0dXJuIGEgdW5pcXVlIElEIGZvciB0aGUgbWFjaGluZS4gSWYgYSB1bmlxdWUgSUQgaXMgbm90ICovCi0gICAgLyogICAgICAgYXZhaWxhYmxlLCByZXR1cm4gdGhlIG1hY2hpbmUgbmFtZS4gKi8KLSAgICBzdGF0aWMgY2hhciBidWZbMTI4XTsKLSAgICBnZXRob3N0bmFtZShidWYsIDEyOCk7Ci0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCi17Ci0gICAgLyogVE9ETzogUmV0dXJuIHRoZSBuZXR3b3JrIG1hY2hpbmUgbmFtZSBmb3IgdGhlIG1hY2hpbmUuICovCi0gICAgc3RhdGljIGNoYXIgYnVmWzEyOF07Ci0gICAgZ2V0aG9zdG5hbWUoYnVmLCAxMjgpOwotICAgIHJldHVybiBidWY7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQotewotICAgIC8qIE5vIEJJT1MgYWNjZXNzIG9uIHRoZSBCZU9TICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKLXsKLSAgICBzdGF0aWMgdm9pZCAqYmFua1B0cjsKLSAgICBpZiAoIWJhbmtQdHIpCi0JYmFua1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLDB4RkZGRix0cnVlKTsKLSAgICByZXR1cm4gYmFua1B0cjsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gbWFwcyBhIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIHRvIGEgbGluZWFyICovCi0gICAgLyogICAgICAgYWRkcmVzcyBpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiAqLwotCi0gICAgLyogTk9URTogVGhpcyBmdW5jdGlvbiAqbXVzdCogYmUgYWJsZSB0byBoYW5kbGUgYW55IHBoc3lpY2FsIGJhc2UgKi8KLSAgICAvKiAgICAgICBhZGRyZXNzLCBhbmQgaGVuY2UgeW91IHdpbGwgaGF2ZSB0byBoYW5kbGUgcm91bmRpbmcgb2YgKi8KLSAgICAvKiAgICAgICB0aGUgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIHRvIGEgcGFnZSBib3VuZGFyeSAoaWU6IDRLYiBvbiAqLwotICAgIC8qICAgICAgIHg4NiBDUFUncykgdG8gYmUgYWJsZSB0byBwcm9wZXJseSBtYXAgaW4gdGhlIG1lbW9yeSAqLwotICAgIC8qICAgICAgIHJlZ2lvbi4gKi8KLQotICAgIC8qIE5PVEU6IElmIHBvc3NpYmxlIHRoZSBpc0NhY2hlZCBiaXQgc2hvdWxkIGJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgKi8KLSAgICAvKiAgICAgICB0aGUgUENEIChQYWdlIENhY2hlIERpc2FibGUpIGFuZCBQV1QgKFBhZ2UgV3JpdGUgVGhyb3VnaCkgKi8KLSAgICAvKiAgICAgICBiaXRzIGFyZSBzZXQgdG8gZGlzYWJsZSBjYWNoaW5nIGZvciBhIG1lbW9yeSBtYXBwaW5nIHVzZWQgKi8KLSAgICAvKiAgICAgICBmb3IgTU1JTyByZWdpc3RlciBhY2Nlc3MuIFdlIGFsc28gZGlzYWJsZSBjYWNoaW5nIHVzaW5nICovCi0gICAgLyogICAgICAgdGhlIE1UUlIgcmVnaXN0ZXJzIGZvciBQZW50aXVtIFBybyBhbmQgbGF0ZXIgY2hpcHNldHMgc28gaWYgKi8KLSAgICAvKiAgICAgICBNVFJSIHN1cHBvcnQgaXMgZW5hYmxlZCBmb3IgeW91ciBPUyB0aGVuIHlvdSBjYW4gc2FmZWx5IGlnbm9yZSAqLwotICAgIC8qICAgICAgIHRoZSBpc0NhY2hlZCBmbGFnIGFuZCBhbHdheXMgZW5hYmxlIGNhY2hpbmcgaW4gdGhlIHBhZ2UgKi8KLSAgICAvKiAgICAgICB0YWJsZXMuICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcih2b2lkICpwdHIsdWxvbmcgbGltaXQpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiB3aWxsIGZyZWUgYSBwaHlzaWNhbCBtZW1vcnkgbWFwcGluZyBwcmV2aW91c2x5ICovCi0gICAgLyogICAgICAgYWxsb2NhdGVkIHdpdGggUE1fbWFwUGh5c2ljYWxBZGRyKCkgaWYgYXQgYWxsIHBvc3NpYmxlLiBJZiAqLwotICAgIC8qICAgICAgIHlvdSBjYW4ndCBmcmVlIHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5ncywgc2ltcGx5IGRvIG5vdGhpbmcuICovCi19Ci0KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcih2b2lkICpwKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgKi8KLSAgICAvKiAgICAgICBhZGRyZXNzLiAqLwotICAgIHJldHVybiAweEZGRkZGRkZGVUw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2xlZXAodWxvbmcgbWlsbGlzZWNvbmRzKQotewotICAgIC8qIFRPRE86IFB1dCB0aGUgcHJvY2VzcyB0byBzbGVlcCBmb3IgbWlsbGlzZWNvbmRzICovCi19Ci0KLWludCBQTUFQSSBQTV9nZXRDT01Qb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzRjg7Ci0JY2FzZSAxOiByZXR1cm4gMHgyRjg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0TFBUUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0JDOwotCWNhc2UgMTogcmV0dXJuIDB4Mzc4OwotCWNhc2UgMjogcmV0dXJuIDB4Mjc4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hbGxvY1NoYXJlZChsb25nIHNpemUpCi17Ci0gICAgLyogVE9ETzogVGhpcyBpcyB1c2VkIHRvIGFsbG9jYXRlIG1lbW9yeSB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3MgKi8KLSAgICAvKiAgICAgICB0aGF0IGFsbCBhY2Nlc3MgdGhlIGNvbW1vbiBOdWNsZXVzIGRyaXZlcnMgdmlhIGEgY29tbW9uIGRpc3BsYXkgKi8KLSAgICAvKiAgICAgICBkcml2ZXIgRExMLiBJZiB5b3VyIE9TIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIG1lbW9yeSAob3IgaWYgKi8KLSAgICAvKiAgICAgICB0aGUgZGlzcGxheSBkcml2ZXIgZG9lcyBub3QgbmVlZCB0byBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5ICovCi0gICAgLyogICAgICAgZm9yIGVhY2ggcHJvY2VzcyBhZGRyZXNzIHNwYWNlKSwgdGhpcyBzaG91bGQganVzdCBjYWxsIFBNX21hbGxvYy4gKi8KLSAgICByZXR1cm4gUE1fbWFsbG9jKHNpemUpOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQodm9pZCAqcHRyKQotewotICAgIC8qIFRPRE86IEZyZWUgdGhlIHNoYXJlZCBtZW1vcnkgYmxvY2suIFRoaXMgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIGNvbnRleHQgKi8KLSAgICAvKiAgICAgICBvZiB0aGUgb3JpZ2luYWwgY2FsbGluZyBwcm9jZXNzIHRoYXQgYWxsb2NhdGVkIHRoZSBzaGFyZWQgKi8KLSAgICAvKiAgICAgICBtZW1vcnkgd2l0aCBQTV9tYWxsb2NTaGFyZWQuIFNpbXBseSBjYWxsIGZyZWUgaWYgeW91IGRvIG5vdCAqLwotICAgIC8qICAgICAgIG5lZWQgdGhpcy4gKi8KLSAgICBQTV9mcmVlKHB0cik7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3Modm9pZCAqYmFzZSx1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbWFwIGEgcGh5c2ljYWwgbWVtb3J5IG1hcHBpbmcgKi8KLSAgICAvKiAgICAgICBwcmV2aW91c2x5IGFsbG9jYXRlZCB3aXRoIFBNX21hcFBoeXNpY2FsQWRkciBpbnRvIHRoZSAqLwotICAgIC8qICAgICAgIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIGNhbGxpbmcgcHJvY2Vzcy4gSWYgdGhlIG1lbW9yeSBtYXBwaW5nICovCi0gICAgLyogICAgICAgYWxsb2NhdGVkIGJ5IFBNX21hcFBoeXNpY2FsQWRkciBpcyBnbG9iYWwgdG8gYWxsIHByb2Nlc3NlcywgKi8KLSAgICAvKiAgICAgICBzaW1wbHkgcmV0dXJuIHRoZSBwb2ludGVyLiAqLwotICAgIHJldHVybiBiYXNlOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIodWludCByX3NlZyx1aW50IHJfb2ZmKQotewotICAgIC8qIE5vIEJJT1MgYWNjZXNzIG9uIHRoZSBCZU9TICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKQotewotICAgIC8qIE5vIEJJT1MgYWNjZXNzIG9uIHRoZSBCZU9TICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcodm9pZCAqbWVtKQotewotICAgIC8qIE5vIEJJT1MgYWNjZXNzIG9uIHRoZSBCZU9TICovCi19Ci0KLXZvaWQgUE1BUEkgRFBNSV9pbnQ4NihpbnQgaW50bm8sIERQTUlfcmVncyAqcmVncykKLXsKLSAgICAvKiBObyBCSU9TIGFjY2VzcyBvbiB0aGUgQmVPUyAqLwotfQotCi1pbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKLXsKLSAgICAvKiBObyBCSU9TIGFjY2VzcyBvbiB0aGUgQmVPUyAqLwotICAgIHJldHVybiAwOwotfQotCi1pbnQgUE1BUEkgUE1faW50ODZ4KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgLyogTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBQTUFQSSBQTV9jYWxsUmVhbE1vZGUodWludCBzZWcsdWludCBvZmYsIFJNUkVHUyAqaW4sCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgLyogTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MgKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKLXsKLSAgICAvKiBUT0RPOiBSZXBvcnQgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgbWVtb3J5LCBib3RoIHRoZSBhbW91bnQgb2YgKi8KLSAgICAvKiAgICAgICBwaHlzaWNhbCBtZW1vcnkgbGVmdCBhbmQgdGhlIGFtb3VudCBvZiB2aXJ0dWFsIG1lbW9yeSBsZWZ0LiAqLwotICAgIC8qICAgICAgIElmIHRoZSBPUyBkb2VzIG5vdCBwcm92aWRlIHRoZXNlIHNlcnZpY2VzLCByZXBvcnQgMCdzLiAqLwotICAgICpwaHlzaWNhbCA9ICp0b3RhbCA9IDA7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSh1aW50IHNpemUsdWxvbmcgKnBoeXNBZGRyLGlib29sIGNvbnRpZ3VvdXMsaWJvb2wgYmVsb3cxNk1lZykKLXsKLSAgICAvKiBUT0RPOiBBbGxvY2F0ZSBhIGJsb2NrIG9mIGxvY2tlZCwgcGh5c2ljYWwgbWVtb3J5IG9mIHRoZSBzcGVjaWZpZWQgKi8KLSAgICAvKiAgICAgICBzaXplLiBUaGlzIGlzIHVzZWQgZm9yIGJ1cyBtYXN0ZXIgb3BlcmF0aW9ucy4gSWYgdGhpcyBpcyBub3QgKi8KLSAgICAvKiAgICAgICBzdXBwb3J0ZWQgYnkgdGhlIE9TLCByZXR1cm4gTlVMTCBhbmQgYnVzIG1hc3RlcmluZyB3aWxsIG5vdCAqLwotICAgIC8qICAgICAgIGJlIHVzZWQuICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSh2b2lkICpwLHVpbnQgc2l6ZSxpYm9vbCBjb250aWd1b3VzKQotewotICAgIC8qIFRPRE86IEZyZWUgYSBtZW1vcnkgYmxvY2sgYWxsb2NhdGVkIHdpdGggUE1fYWxsb2NMb2NrZWRNZW0uICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0EoaW50IGJhbmspCi17Ci0gICAgLyogTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MgKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRCYW5rQUIoaW50IGJhbmspCi17Ci0gICAgLyogTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MgKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRDUlRTdGFydChpbnQgeCxpbnQgeSxpbnQgd2FpdFZSVCkKLXsKLSAgICAvKiBObyBCSU9TIGFjY2VzcyBvbiB0aGUgQmVPUyAqLwotfQotCi1pYm9vbCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUodWxvbmcgYmFzZSx1bG9uZyBsZW5ndGgsdWludCB0eXBlKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGVuYWJsZSBQZW50aXVtIFBybyBhbmQgUGVudGl1bSBJSSBNVFJSICovCi0gICAgLyogICAgICAgd3JpdGUgY29tYmluaW5nIGZvciB0aGUgcGFzc2VkIGluIHBoeXNpY2FsIG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KLSAgICAvKiAgICAgICBhbmQgbGVuZ3RoLiBOb3JtYWxseSB0aGlzIGlzIGRvbmUgdmlhIGNhbGxzIHRvIGFuIE9TIHNwZWNpZmljICovCi0gICAgLyogICAgICAgZGV2aWNlIGRyaXZlciBhcyB0aGlzIGNhbiBvbmx5IGJlIGRvbmUgYXQgcmluZyAwLiAqLwotICAgIC8qICovCi0gICAgLyogTk9URTogVGhpcyBpcyBhICp2ZXJ5KiBpbXBvcnRhbnQgZnVuY3Rpb24gdG8gaW1wbGVtZW50ISBJZiB5b3UgZG8gKi8KLSAgICAvKiAgICAgICBub3QgaW1wbGVtZW50LCBncmFwaGljcyBwZXJmb3JtYW5jZSBvbiB0aGUgbGF0ZXN0IEludGVsIGNoaXBzICovCi0gICAgLyogICAgICAgd2lsbCBiZSBzZXZlcmx5IGltcGFpcmVkLiBGb3Igc2FtcGxlIGNvZGUgdGhhdCBjYW4gYmUgdXNlZCAqLwotICAgIC8qICAgICAgIGRpcmVjdGx5IGluIGEgcmluZyAwIGRldmljZSBkcml2ZXIsIHNlZSB0aGUgTVNET1MgaW1wbGVtZW50YXRpb24gKi8KLSAgICAvKiAgICAgICB3aGljaCBpbmNsdWRlcyBhc3NlbWJsZXIgY29kZSB0byBkbyB0aGlzIGRpcmVjdGx5IChpZiB0aGUgKi8KLSAgICAvKiAgICAgICBwcm9ncmFtIGlzIHJ1bm5pbmcgYXQgcmluZyAwKS4gKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWlib29sIFBNQVBJIFBNX2RvQklPU1BPU1QodXNob3J0IGF4VmFsLHVsb25nIEJJT1NQaHlzQWRkcix2b2lkICptYXBwZWRCSU9TKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBydW4gdGhlIEJJT1MgUE9TVCBjb2RlIG9uIGEgc2Vjb25kYXJ5ICovCi0gICAgLyogICAgICAgY29udHJvbGxlciB0byBpbml0aWFsaXNlIGl0IGZvciB1c2UuIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSAqLwotICAgIC8qICAgICAgIGZvciBtdWx0aS1jb250cm9sbGVyIG9wZXJhdGlvbiwgYnV0IGl0IHdpbGwgbWFrZSBpdCBhIGxvdCAqLwotICAgIC8qICAgICAgIG1vcmUgY29udmVuaWNlbnQgZm9yIGVuZCB1c2VycyAob3RoZXJ3aXNlIHRoZXkgaGF2ZSB0byBib290ICovCi0gICAgLyogICAgICAgdGhlIHN5c3RlbSBvbmNlIHdpdGggdGhlIHNlY29uZGFyeSBjb250cm9sbGVyIGFzIHByaW1hcnksIGFuZCAqLwotICAgIC8qICAgICAgIHRoZW4gYm9vdCB3aXRoIGJvdGggY29udHJvbGxlcnMgaW5zdGFsbGVkKS4gKi8KLSAgICAvKiAqLwotICAgIC8qICAgICAgIEV2ZW4gaWYgeW91IGRvbid0IHN1cHBvcnQgZnVsbCBCSU9TIGFjY2VzcywgaXQgd291bGQgYmUgKi8KLSAgICAvKiAgICAgICBhZHZpc2VhYmxlIHRvIGJlIGFibGUgdG8gUE9TVCB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXJzIGluIHRoZSAqLwotICAgIC8qICAgICAgIHN5c3RlbSB1c2luZyB0aGlzIGZ1bmN0aW9uIGFzIGEgbWluaW11bSByZXF1aXJlbWVudC4gU29tZSAqLwotICAgIC8qICAgICAgIGdyYXBoaWNzIGhhcmR3YXJlIGhhcyByZWdpc3RlcnMgdGhhdCBjb250YWluIHZhbHVlcyB0aGF0IG9ubHkgKi8KLSAgICAvKiAgICAgICB0aGUgQklPUyBrbm93cyBhYm91dCwgd2hpY2ggbWFrZXMgYnJpbmcgdXAgYSBjYXJkIGZyb20gY29sZCAqLwotICAgIC8qICAgICAgIHJlc2V0IGRpZmZpY3VsdCBpZiB0aGUgQklPUyBoYXMgbm90IFBPU1QnZWQgaXQuICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgUE1BUEkgUE1fZmluZEZpcnN0RmlsZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpZmluZERhdGE7Ci0gICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBuZXh0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZmluZE5leHRGaWxlKAotICAgIHVsb25nIGhhbmRsZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgKHZvaWQpaGFuZGxlOwotICAgICh2b2lkKWZpbmREYXRhOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCi0gICAgdWxvbmcgaGFuZGxlKQotewotICAgICh2b2lkKWhhbmRsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZSBpcyBhIHZhbGlkIGRyaXZlIG9yIG5vdC4gVW5kZXIgVW5peCB0aGlzCi1mdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZXhjZXB0IGEgdmFsdWUgb2YgMyAoY29uc2lkZXJlZAotdGhlIHJvb3QgZHJpdmUsIGFuZCBlcXVpdmFsZW50IHRvIEM6IGZvciBub24tVW5peCBzeXN0ZW1zKS4gVGhlIGRyaXZlCi1udW1iZXJpbmcgaXM6Ci0KLSAgICAxICAgLSBEcml2ZSBBOgotICAgIDIgICAtIERyaXZlIEI6Ci0gICAgMyAgIC0gRHJpdmUgQzoKLSAgICBldGMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCi0gICAgY2hhciBkcml2ZSkKLXsKLSAgICBpZiAoZHJpdmUgPT0gMykKLQlyZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWZlZCBkcml2ZS4KLVVuZGVyIFVuaXggdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcmVnYXJkbGVzcwotb2Ygd2hhdCB0aGUgdmFsdWUgb2YgJ2RyaXZlJyBpcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2dldGRjd2QoCi0gICAgaW50IGRyaXZlLAotICAgIGNoYXIgKmRpciwKLSAgICBpbnQgbGVuKQotewotICAgICh2b2lkKWRyaXZlOwotICAgIGdldGN3ZChkaXIsbGVuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgdWludCBhdHRyaWIpCi17Ci0gICAgLyogVE9ETzogU2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgZmlsZSAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWF0dHJpYjsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvdmZsYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5ZWYyYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL3ZmbGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBEdW1teSBtb2R1bGU7IG5vIHZpcnR1YWwgZnJhbWVidWZmZXIgZm9yIHRoaXMgT1MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotCi1pYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKLXsKLSAgICBiYXNlQWRkciA9IGJhc2VBZGRyOwotICAgIGJhbmtTaXplID0gYmFua1NpemU7Ci0gICAgY29kZUxlbiA9IGNvZGVMZW47Ci0gICAgYmFua0Z1bmMgPSBiYW5rRnVuYzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCi17Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy96dGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUyOGI3My4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL3p0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogICoqKiBUT0RPOiBBREQgWU9VUiBPUyBFTlZJUk9OTUVOVCBOQU1FIEhFUkUgKioqCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBaZW4gVGltZXIgbW9kdWxlIGludGVybmFscy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9aVGltZXJJbml0KHZvaWQpCi17Ci0gICAgLyogVE9ETzogRG8gYW55IHNwZWNpZmljIGludGVybmFsIGluaXRpYWxpc2F0aW9uIGluIGhlcmUgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdGFydCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9MWlRpbWVyT24oCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgLyogVE9ETzogU3RhcnQgdGhlIFplbiBUaW1lciBjb3VudGluZy4gVGhpcyBzaG91bGQgYmUgYSBtYWNybyBpZiAqLwotICAgIC8qICAgICAgIHBvc3NpYmxlLiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGxhcCB0aW1lIHNpbmNlIHRoZSB0aW1lciB3YXMgc3RhcnRlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX0xaVGltZXJMYXAoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgLyogVE9ETzogQ29tcHV0ZSB0aGUgbGFwIHRpbWUgYmV0d2VlbiB0aGUgY3VycmVudCB0aW1lIGFuZCB3aGVuIHRoZSAqLwotICAgIC8qICAgICAgIHRpbWVyIHdhcyBzdGFydGVkLiAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVN0b3AgdGhlIFplbiBUaW1lciBjb3VudGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfTFpUaW1lck9mZigKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICAvKiBUT0RPOiBTdG9wIHRoZSB0aW1lciBjb3VudGluZy4gU2hvdWxkIGJlIGEgbWFjcm8gaWYgcG9zc2libGUuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGluIG1pY3Jvc2Vjb25kcyBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgdGltaW5ncy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX0xaVGltZXJDb3VudCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICAvKiBUT0RPOiBDb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgYW5kIHJldHVybiBpdC4gQWx3YXlzIG1pY3Jvc2Vjb25kcy4gKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGFzIG1pY3Jvc2Vjb25kcyBwZXIgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFVMWlRJTUVSX1JFU09MVVRJT04gMQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIExvbmcgUGVyaW9kIHRpbWVyIGZyb20gdGhlIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9VTFpSZWFkVGltZSh2b2lkKQotewotICAgIC8qIFRPRE86IFJlYWQgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGZyb20gdGhlIE9TLiBUaGUgcmVzb2x1dGlvbiBvZiB0aGlzICovCi0gICAgLyogICAgICAgdGltZXIgc2hvdWxkIGJlIGFyb3VuZCAxLzIwIG9mIGEgc2Vjb25kIGZvciB0aW1pbmcgbG9uZyAqLwotICAgIC8qICAgICAgIHBlcmlvZHMgaWYgcG9zc2libGUuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQotd2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCi1hY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCi1wYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoteyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvZGVwYWdlL3VzX2VuZy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29kZXBhZ2UvdXNfZW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYTg3MTQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29kZXBhZ2UvdXNfZW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgS2V5Ym9hcmQgdHJhbnNsYXRpb24gY29kZSBwYWdlcyBmb3IgVVMgRW5nbGlzaCBrZXlib2FyZHMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiZXZlbnQuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVGhpcyB0YWJsZSBpcyB1c2VkIGZvciBhbGwgbm9ybWFsIGtleSB0cmFuc2xhdGlvbnMsIGFuZCBpcyB0aGUgZmFsbGJhY2sKLSAqIHRhYmxlIGlmIHRoZSBrZXkgaXMgbm90IGZvdW5kIGluIGFueSBvZiB0aGUgb3RoZXIgdHJhbnNsYXRpb24gdGFibGVzLgotICogSWYgdGhlIGNvZGUgaXMgbm90IGZvdW5kIGluIHRoaXMgdGFibGUsIHRoZSBBU0NJSSBjb2RlIGlzIHNldCB0byAwIHRvCi0gKiBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIEFTQ0lJIGNvZGUgZXF1aXZhbGVudCBmb3IgdGhpcyBrZXkuCi0gKi8KLXN0YXRpYyBjb2RlcGFnZV9lbnRyeV90IFVTX25vcm1hbFtdID0gewotICAgIHsweDAxLCAgMHgxQn0sCi0gICAgezB4MDIsICAnMSd9LAotICAgIHsweDAzLCAgJzInfSwKLSAgICB7MHgwNCwgICczJ30sCi0gICAgezB4MDUsICAnNCd9LAotICAgIHsweDA2LCAgJzUnfSwKLSAgICB7MHgwNywgICc2J30sCi0gICAgezB4MDgsICAnNyd9LAotICAgIHsweDA5LCAgJzgnfSwKLSAgICB7MHgwQSwgICc5J30sCi0gICAgezB4MEIsICAnMCd9LAotICAgIHsweDBDLCAgJy0nfSwKLSAgICB7MHgwRCwgICc9J30sCi0gICAgezB4MEUsICAweDA4fSwKLSAgICB7MHgwRiwgIDB4MDl9LAotICAgIHsweDEwLCAgJ3EnfSwKLSAgICB7MHgxMSwgICd3J30sCi0gICAgezB4MTIsICAnZSd9LAotICAgIHsweDEzLCAgJ3InfSwKLSAgICB7MHgxNCwgICd0J30sCi0gICAgezB4MTUsICAneSd9LAotICAgIHsweDE2LCAgJ3UnfSwKLSAgICB7MHgxNywgICdpJ30sCi0gICAgezB4MTgsICAnbyd9LAotICAgIHsweDE5LCAgJ3AnfSwKLSAgICB7MHgxQSwgICdbJ30sCi0gICAgezB4MUIsICAnXSd9LAotICAgIHsweDFDLCAgMHgwRH0sCi0gICAgezB4MUUsICAnYSd9LAotICAgIHsweDFGLCAgJ3MnfSwKLSAgICB7MHgyMCwgICdkJ30sCi0gICAgezB4MjEsICAnZid9LAotICAgIHsweDIyLCAgJ2cnfSwKLSAgICB7MHgyMywgICdoJ30sCi0gICAgezB4MjQsICAnaid9LAotICAgIHsweDI1LCAgJ2snfSwKLSAgICB7MHgyNiwgICdsJ30sCi0gICAgezB4MjcsICAnOyd9LAotICAgIHsweDI4LCAgJ1wnJ30sCi0gICAgezB4MjksICAnYCd9LAotICAgIHsweDJCLCAgJ1xcJ30sCi0gICAgezB4MkMsICAneid9LAotICAgIHsweDJELCAgJ3gnfSwKLSAgICB7MHgyRSwgICdjJ30sCi0gICAgezB4MkYsICAndid9LAotICAgIHsweDMwLCAgJ2InfSwKLSAgICB7MHgzMSwgICduJ30sCi0gICAgezB4MzIsICAnbSd9LAotICAgIHsweDMzLCAgJywnfSwKLSAgICB7MHgzNCwgICcuJ30sCi0gICAgezB4MzUsICAnLyd9LAotICAgIHsweDM3LCAgJyonfSwgICAgICAgICAgIC8qIEtleXBhZCAqLwotICAgIHsweDM5LCAgJyAnfSwKLSAgICB7MHg0QSwgICctJ30sICAgICAgICAgICAvKiBLZXlwYWQgKi8KLSAgICB7MHg0RSwgICcrJ30sICAgICAgICAgICAvKiBLZXlwYWQgKi8KLSAgICB7MHg2MCwgIDB4MER9LCAgICAgICAgICAvKiBLZXlwYWQgKi8KLSAgICB7MHg2MSwgICcvJ30sICAgICAgICAgICAvKiBLZXlwYWQgKi8KLSAgICB9OwotCi0vKiBUaGlzIHRhYmxlIGlzIHVzZWQgZm9yIHdoZW4gQ0FQU0xPQ0sgaXMgYWN0aXZlIGFuZCB0aGUgc2hpZnQgb3IgY3RybAotICoga2V5cyBhcmUgbm90IGRvd24uIElmIHRoZSBjb2RlIGlzIG5vdCBmb3VuZCBpbiB0aGlzIHRhYmxlLCB0aGUgbm9ybWFsCi0gKiB0YWJsZSBhYm92ZSBpcyB0aGVuIHNlYXJjaGVkLgotICovCi1zdGF0aWMgY29kZXBhZ2VfZW50cnlfdCBVU19jYXBzW10gPSB7Ci0gICAgezB4MTAsICAnUSd9LAotICAgIHsweDExLCAgJ1cnfSwKLSAgICB7MHgxMiwgICdFJ30sCi0gICAgezB4MTMsICAnUid9LAotICAgIHsweDE0LCAgJ1QnfSwKLSAgICB7MHgxNSwgICdZJ30sCi0gICAgezB4MTYsICAnVSd9LAotICAgIHsweDE3LCAgJ0knfSwKLSAgICB7MHgxOCwgICdPJ30sCi0gICAgezB4MTksICAnUCd9LAotICAgIHsweDFFLCAgJ0EnfSwKLSAgICB7MHgxRiwgICdTJ30sCi0gICAgezB4MjAsICAnRCd9LAotICAgIHsweDIxLCAgJ0YnfSwKLSAgICB7MHgyMiwgICdHJ30sCi0gICAgezB4MjMsICAnSCd9LAotICAgIHsweDI0LCAgJ0onfSwKLSAgICB7MHgyNSwgICdLJ30sCi0gICAgezB4MjYsICAnTCd9LAotICAgIHsweDJDLCAgJ1onfSwKLSAgICB7MHgyRCwgICdYJ30sCi0gICAgezB4MkUsICAnQyd9LAotICAgIHsweDJGLCAgJ1YnfSwKLSAgICB7MHgzMCwgICdCJ30sCi0gICAgezB4MzEsICAnTid9LAotICAgIHsweDMyLCAgJ00nfSwKLSAgICB9OwotCi0vKiBUaGlzIHRhYmxlIGlzIHVzZWQgZm9yIHdoZW4gc2hpZnQga2V5IGlzIGRvd24sIGJ1dCB0aGUgY3RybCBrZXkgaXMgbm90Ci0gKiBkb3duIGFuZCBDQVBTTE9DSyBpcyBub3QgYWN0aXZlLiBJZiB0aGUgY29kZSBpcyBub3QgZm91bmQgaW4gdGhpcyB0YWJsZSwKLSAqIHRoZSBub3JtYWwgdGFibGUgYWJvdmUgaXMgdGhlbiBzZWFyY2hlZC4KLSAqLwotc3RhdGljIGNvZGVwYWdlX2VudHJ5X3QgVVNfc2hpZnRbXSA9IHsKLSAgICB7MHgwMiwgICchJ30sCi0gICAgezB4MDMsICAnQCd9LAotICAgIHsweDA0LCAgJyMnfSwKLSAgICB7MHgwNSwgICckJ30sCi0gICAgezB4MDYsICAnJSd9LAotICAgIHsweDA3LCAgJ14nfSwKLSAgICB7MHgwOCwgICcmJ30sCi0gICAgezB4MDksICAnKid9LAotICAgIHsweDBBLCAgJygnfSwKLSAgICB7MHgwQiwgICcpJ30sCi0gICAgezB4MEMsICAnXyd9LAotICAgIHsweDBELCAgJysnfSwKLSAgICB7MHgxMCwgICdRJ30sCi0gICAgezB4MTEsICAnVyd9LAotICAgIHsweDEyLCAgJ0UnfSwKLSAgICB7MHgxMywgICdSJ30sCi0gICAgezB4MTQsICAnVCd9LAotICAgIHsweDE1LCAgJ1knfSwKLSAgICB7MHgxNiwgICdVJ30sCi0gICAgezB4MTcsICAnSSd9LAotICAgIHsweDE4LCAgJ08nfSwKLSAgICB7MHgxOSwgICdQJ30sCi0gICAgezB4MUEsICAneyd9LAotICAgIHsweDFCLCAgJ30nfSwKLSAgICB7MHgxRSwgICdBJ30sCi0gICAgezB4MUYsICAnUyd9LAotICAgIHsweDIwLCAgJ0QnfSwKLSAgICB7MHgyMSwgICdGJ30sCi0gICAgezB4MjIsICAnRyd9LAotICAgIHsweDIzLCAgJ0gnfSwKLSAgICB7MHgyNCwgICdKJ30sCi0gICAgezB4MjUsICAnSyd9LAotICAgIHsweDI2LCAgJ0wnfSwKLSAgICB7MHgyNywgICc6J30sCi0gICAgezB4MjgsICAnIid9LAotICAgIHsweDI5LCAgJ34nfSwKLSAgICB7MHgyQiwgICd8J30sCi0gICAgezB4MkMsICAnWid9LAotICAgIHsweDJELCAgJ1gnfSwKLSAgICB7MHgyRSwgICdDJ30sCi0gICAgezB4MkYsICAnVid9LAotICAgIHsweDMwLCAgJ0InfSwKLSAgICB7MHgzMSwgICdOJ30sCi0gICAgezB4MzIsICAnTSd9LAotICAgIHsweDMzLCAgJzwnfSwKLSAgICB7MHgzNCwgICc+J30sCi0gICAgezB4MzUsICAnPyd9LAotICAgIH07Ci0KLS8qIFRoaXMgdGFibGUgaXMgdXNlZCBmb3Igd2hlbiBDQVBTTE9DSyBpcyBhY3RpdmUgYW5kIHRoZSBzaGlmdCBrZXkgaXMKLSAqIGRvd24sIGJ1dCB0aGUgY3RybCBrZXkgaXMgbm90LiBJZiB0aGUgY29kZSBpcyBub3QgZm91bmQgaW4gdGhpcyB0YWJsZSwKLSAqIHRoZSBzaGlmdCB0YWJsZSBhYm92ZSBpcyB0aGVuIHNlYXJjaGVkLgotICovCi1zdGF0aWMgY29kZXBhZ2VfZW50cnlfdCBVU19zaGlmdENhcHNbXSA9IHsKLSAgICB7MHgxMCwgICdxJ30sCi0gICAgezB4MTEsICAndyd9LAotICAgIHsweDEyLCAgJ2UnfSwKLSAgICB7MHgxMywgICdyJ30sCi0gICAgezB4MTQsICAndCd9LAotICAgIHsweDE1LCAgJ3knfSwKLSAgICB7MHgxNiwgICd1J30sCi0gICAgezB4MTcsICAnaSd9LAotICAgIHsweDE4LCAgJ28nfSwKLSAgICB7MHgxOSwgICdwJ30sCi0gICAgezB4MUUsICAnYSd9LAotICAgIHsweDFGLCAgJ3MnfSwKLSAgICB7MHgyMCwgICdkJ30sCi0gICAgezB4MjEsICAnZid9LAotICAgIHsweDIyLCAgJ2cnfSwKLSAgICB7MHgyMywgICdoJ30sCi0gICAgezB4MjQsICAnaid9LAotICAgIHsweDI1LCAgJ2snfSwKLSAgICB7MHgyNiwgICdsJ30sCi0gICAgezB4MkMsICAneid9LAotICAgIHsweDJELCAgJ3gnfSwKLSAgICB7MHgyRSwgICdjJ30sCi0gICAgezB4MkYsICAndid9LAotICAgIHsweDMwLCAgJ2InfSwKLSAgICB7MHgzMSwgICduJ30sCi0gICAgezB4MzIsICAnbSd9LAotICAgIH07Ci0KLS8qIFRoaXMgdGFibGUgaXMgdXNlZCBmb3IgYWxsIGtleSB0cmFuc2xhdGlvbnMgd2hlbiB0aGUgY3RybCBrZXkgaXMgZG93biwKLSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIHRoZSBzaGlmdCBrZXkgYW5kIENBUFNMT0NLLiBJZiB0aGUgY29kZSBpcwotICogbm90IGZvdW5kIGluIHRoaXMgdGFibGUsIHRoZSBBU0NJSSBjb2RlIGlzIHNldCB0byAwIHRvIGluZGljYXRlIHRoYXQKLSAqIHRoZXJlIGlzIG5vIEFTQ0lJIGNvZGUgZXF1aXZhbGVudCBmb3IgdGhpcyBrZXkuCi0gKi8KLXN0YXRpYyBjb2RlcGFnZV9lbnRyeV90IFVTX2N0cmxbXSA9IHsKLSAgICB7MHgwMSwgIDB4MUJ9LAotICAgIHsweDA2LCAgMHgxRX0sCi0gICAgezB4MEMsICAweDFGfSwKLSAgICB7MHgwRSwgIDB4N0Z9LAotICAgIHsweDEwLCAgMHgxMX0sCi0gICAgezB4MTEsICAweDE3fSwKLSAgICB7MHgxMiwgIDB4MDV9LAotICAgIHsweDEzLCAgMHgxMn0sCi0gICAgezB4MTQsICAweDE0fSwKLSAgICB7MHgxNSwgIDB4MTl9LAotICAgIHsweDE2LCAgMHgxNn0sCi0gICAgezB4MTcsICAweDA5fSwKLSAgICB7MHgxOCwgIDB4MEZ9LAotICAgIHsweDE5LCAgMHgxMH0sCi0gICAgezB4MUEsICAweDFCfSwKLSAgICB7MHgxQiwgIDB4MUR9LAotICAgIHsweDFDLCAgMHgwQX0sCi0gICAgezB4MUUsICAweDAxfSwKLSAgICB7MHgxRiwgIDB4MTN9LAotICAgIHsweDIwLCAgMHgwNH0sCi0gICAgezB4MjEsICAweDA2fSwKLSAgICB7MHgyMiwgIDB4MDd9LAotICAgIHsweDIzLCAgMHgwOH0sCi0gICAgezB4MjQsICAweDBBfSwKLSAgICB7MHgyNSwgIDB4MEJ9LAotICAgIHsweDI2LCAgMHgwQ30sCi0gICAgezB4MkIsICAweDFDfSwKLSAgICB7MHgyQywgIDB4MUF9LAotICAgIHsweDJELCAgMHgxOH0sCi0gICAgezB4MkUsICAweDAzfSwKLSAgICB7MHgyRiwgIDB4MTZ9LAotICAgIHsweDMwLCAgMHgwMn0sCi0gICAgezB4MzEsICAweDBFfSwKLSAgICB7MHgzMiwgIDB4MER9LAotICAgIHsweDM5LCAgJyAnfSwKLSAgICB9OwotCi1zdGF0aWMgY29kZXBhZ2VfZW50cnlfdCBVU19udW1QYWRbXSA9IHsKLSAgICB7MHg0QywgICc1J30sCi0gICAgezB4NjIsICAnNCd9LAotICAgIHsweDYzLCAgJzYnfSwKLSAgICB7MHg2NCwgICc4J30sCi0gICAgezB4NjUsICAnMid9LAotICAgIHsweDY2LCAgJzAnfSwKLSAgICB7MHg2NywgICcuJ30sCi0gICAgezB4NjgsICAnNyd9LAotICAgIHsweDY5LCAgJzEnfSwKLSAgICB7MHg2QSwgICc5J30sCi0gICAgezB4NkIsICAnMyd9LAotICAgIH07Ci0KLWNvZGVwYWdlX3QgX0NQX1VTX0VuZ2xpc2ggPSB7Ci0gICAgIlVTIEVuZ2xpc2giLAotICAgIFVTX25vcm1hbCwgICAgICBFVlRfQVJSX1NJWkUoVVNfbm9ybWFsKSwKLSAgICBVU19jYXBzLCAgICAgICAgRVZUX0FSUl9TSVpFKFVTX2NhcHMpLAotICAgIFVTX3NoaWZ0LCAgICAgICBFVlRfQVJSX1NJWkUoVVNfc2hpZnQpLAotICAgIFVTX3NoaWZ0Q2FwcywgICBFVlRfQVJSX1NJWkUoVVNfc2hpZnRDYXBzKSwKLSAgICBVU19jdHJsLCAgICAgICAgRVZUX0FSUl9TSVpFKFVTX2N0cmwpLAotICAgIFVTX251bVBhZCwgICAgICBFVlRfQVJSX1NJWkUoVVNfbnVtUGFkKSwKLSAgICB9OwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhOGU4Zi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24uYworKysgL2Rldi9udWxsCkBAIC0xLDQ4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBNb2R1bGUgY29udGFpbmluZyBjb2RlIGNvbW1vbiB0byBhbGwgcGxhdGZvcm1zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCi0jaWYgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fT1MyX1ZERF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0jaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKLSNlbHNlCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiB7c2VjcmV0fSAqLwotbG9uZyBfVkFSQVBJICAgIF9fX2Rydl9vc190eXBlID0gX09TX1VOU1VQUE9SVEVEOwotc3RhdGljIGNoYXIgICAgIGxvY2FsQlBEUGF0aFtQTV9NQVhfUEFUSF0gPSAiIjsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1wYXRoICAgIC0gTG9jYWwgcGF0aCB0byB0aGUgTnVjbGV1cyBCUEQgZHJpdmVyIGZpbGVzLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgotb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCi13aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKLWRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKLXRvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gQnkgZGVmYXVsdCB0aGUgbG9jYWwgQlBEIHBhdGggaXMKLWFsd2F5cyBzZXQgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIG5vdCBpbml0aWFsaXNlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldExvY2FsQlBEUGF0aCgKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIFBNX2luaXQoKTsKLSAgICBzdHJuY3B5KGxvY2FsQlBEUGF0aCxwYXRoLHNpemVvZihsb2NhbEJQRFBhdGgpKTsKLSAgICBsb2NhbEJQRFBhdGhbc2l6ZW9mKGxvY2FsQlBEUGF0aCktMV0gPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJwZHBhdGggICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGFjdHVhbCBwYXRoIHRvIHRoZSBmaWxlCi1jYWNoZWRwYXRoICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBjYWNoZWQgQlBEIGRyaXZlciBwYXRoCi10cnlwYXRoICAgICAtIFBhdGggdG8gdHJ5IHRvIGZpbmQgdGhlIEJQRCBmaWxlIGluCi1zdWJwYXRoICAgICAtIE9wdGlvbmFsIHN1YiBwYXRoIHRvIGFwcGVuZCB0byB0cnlwYXRoCi1kbGxuYW1lICAgICAtIE5hbWUgb2YgdGhlIEJpbmFyeSBQb3J0YWJsZSBETEwgdG8gbG9hZAotCi1SRVRVUk5TOgotVHJ1ZSBpZiBmb3VuZCwgZmFsc2UgaWYgbm90LgotCi1SRU1BUktTOgotVHJ5cyB0aGUgc3BlY2lmaWVkIHBhdGggdG8gc2VlIGlmIHRoZSBCUEQgZmlsZSBjYW4gYmUgZm91bmQgb3Igbm90LiBJZiBzbywKLXRoZSBwYXRoIHVzZWQgaXMgcmV0dXJuZWQgaW4gYnBkcGF0aCBhbmQgY2FjaGVkcGF0aC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgVHJ5UGF0aCgKLSAgICBjaGFyICpicGRwYXRoLAotICAgIGNoYXIgKmNhY2hlZHBhdGgsCi0gICAgY29uc3QgY2hhciAqdHJ5cGF0aCwKLSAgICBjb25zdCBjaGFyICpzdWJwYXRoLAotICAgIGNvbnN0IGNoYXIgKmRsbG5hbWUpCi17Ci0gICAgY2hhciAgICBmaWxlbmFtZVsyNTZdOwotICAgIEZJTEUgICAgKmY7Ci0KLSAgICBzdHJjcHkoYnBkcGF0aCwgdHJ5cGF0aCk7Ci0gICAgUE1fYmFja3NsYXNoKGJwZHBhdGgpOwotICAgIHN0cmNhdChicGRwYXRoLHN1YnBhdGgpOwotICAgIFBNX2JhY2tzbGFzaChicGRwYXRoKTsKLSAgICBzdHJjcHkoZmlsZW5hbWUsYnBkcGF0aCk7Ci0gICAgc3RyY2F0KGZpbGVuYW1lLGRsbG5hbWUpOwotICAgIGlmICgoZiA9IGZvcGVuKGZpbGVuYW1lLCJyYiIpKSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICBpZiAoY2FjaGVkcGF0aCkKLQlzdHJjcHkoY2FjaGVkcGF0aCxicGRwYXRoKTsKLSAgICBmY2xvc2UoZik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotVHJ1ZSBpZiBsb2NhbCBvdmVycmlkZSBlbmFibGVkLCBmYWxzZSBpZiBub3QuCi0KLVJFTUFSS1M6Ci1UZXN0cyB0byBzZWUgaWYgdGhlIGxvY2FsIG92ZXJyaWRlIG9wdGlvbiBpcyBlbmFibGVkLCBhbmQgaWYgc28gaXQgd2lsbAotbG9vayBmb3IgdGhlIE51Y2xldXMgZHJpdmVycyBpbiB0aGUgbG9jYWwgYXBwbGljYXRpb24gZGlyZWN0b3JpZXMgaW4KLXByZWZlcmVuY2UgdG8gdGhlIE51Y2xldXMgc3lzdGVtIGRpcmVjdG9yaWVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBHZXRMb2NhbE92ZXJyaWRlKHZvaWQpCi17Ci0gICAgY2hhciAgICAgICAgICAgIGZpbGVuYW1lWzI1Nl07Ci0gICAgRklMRSAgICAgICAgICAgICpmOwotICAgIHN0YXRpYyBpYm9vbCAgICBsb2NhbF9vdmVycmlkZSA9IC0xOwotCi0gICAgaWYgKGxvY2FsX292ZXJyaWRlID09IC0xKSB7Ci0JbG9jYWxfb3ZlcnJpZGUgPSBmYWxzZTsKLQlzdHJjcHkoZmlsZW5hbWUsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7Ci0JUE1fYmFja3NsYXNoKGZpbGVuYW1lKTsKLQlzdHJjYXQoZmlsZW5hbWUsImdyYXBoaWNzLmluaSIpOwotCWlmICgoZiA9IGZvcGVuKGZpbGVuYW1lLCJyIikpICE9IE5VTEwpIHsKLQkgICAgd2hpbGUgKCFmZW9mKGYpICYmIGZnZXRzKGZpbGVuYW1lLHNpemVvZihmaWxlbmFtZSksZikpIHsKLQkJaWYgKHN0cm5pY21wKGZpbGVuYW1lLCJ1c2Vsb2NhbCIsOCkgPT0gMCkgewotCQkgICAgbG9jYWxfb3ZlcnJpZGUgPSAoKCooZmlsZW5hbWUrOSkgLSAnMCcpID09IDEpOwotCQkgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgZmNsb3NlKGYpOwotCSAgICB9Ci0JfQotICAgIHJldHVybiBsb2NhbF9vdmVycmlkZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIGRlYnVnIGxvZyBmaWxlLgotCi1IRUFERVI6Ci1wbWFwaS5oCi0KLVBBUkFNRVRFUlM6Ci1kbGxuYW1lIC0gTmFtZSBvZiB0aGUgQmluYXJ5IFBvcnRhYmxlIERMTCB0byBsb2FkCi1icGRwYXRoIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGFjdHVhbCBwYXRoIHRvIHRoZSBmaWxlCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIGZvdW5kLCBmYWxzZSBpZiBub3QuCi0KLVJFTUFSS1M6Ci1GaW5kcyB0aGUgbG9jYXRpb24gb2YgYSBzcGVjaWZpYyBCaW5hcnkgUG9ydGFibGUgRExMLCBieSBzZWFyY2hpbmcgYWxsCi10aGUgc3RhbmRhcmQgU2NpVGVjaCBOdWNsZXVzIGRyaXZlciBsb2NhdGlvbnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZmluZEJQRCgKLSAgICBjb25zdCBjaGFyICpkbGxuYW1lLAotICAgIGNoYXIgKmJwZHBhdGgpCi17Ci0gICAgc3RhdGljIGNoYXIgY2FjaGVkcGF0aFtQTV9NQVhfUEFUSF0gPSAiIjsKLQotICAgIC8qIE9uIHRoZSBmaXJzdCBjYWxsIGRldGVybWluZSB0aGUgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXJzICovCi0gICAgaWYgKGNhY2hlZHBhdGhbMF0gPT0gMCkgewotCS8qIEZpcnN0IHRyeSBpbiB0aGUgZ2xvYmFsIHN5c3RlbSBOdWNsZXVzIGRyaXZlciBwYXRoIGlmCi0JICogdGhlIGxvY2FsIG92ZXJyaWRlIHNldHRpbmcgaXMgbm90IGVuYWJsZWQuCi0JICovCi0JUE1faW5pdCgpOwotCWlmICghR2V0TG9jYWxPdmVycmlkZSgpKSB7Ci0JICAgIGlmIChUcnlQYXRoKGJwZHBhdGgsY2FjaGVkcGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpLCIiLGRsbG5hbWUpKQotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgfQotCi0JLyogTmV4dCB0cnkgaW4gdGhlIGxvY2FsIGFwcGxpY2F0aW9uIGRpcmVjdG9yeSBpZiBhdmFpbGFibGUgKi8KLQlpZiAobG9jYWxCUERQYXRoWzBdICE9IDApIHsKLQkgICAgaWYgKFRyeVBhdGgoYnBkcGF0aCxjYWNoZWRwYXRoLGxvY2FsQlBEUGF0aCwiIixkbGxuYW1lKSkKLQkJcmV0dXJuIHRydWU7Ci0JICAgIH0KLQllbHNlIHsKLSNpZiAhZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSAmJiAhZGVmaW5lZChfX05UX0RSSVZFUl9fKQotCSAgICBjaGFyICAgICptZ2xfcm9vdDsKLQkgICAgaWYgKChtZ2xfcm9vdCA9IGdldGVudigiTUdMX1JPT1QiKSkgIT0gTlVMTCkgewotCQlpZiAoVHJ5UGF0aChicGRwYXRoLGNhY2hlZHBhdGgsbWdsX3Jvb3QsImRyaXZlcnMiLGRsbG5hbWUpKQotCQkgICAgcmV0dXJuIHRydWU7Ci0JCX0KLSNlbmRpZgotCSAgICBQTV9nZXRDdXJyZW50UGF0aChicGRwYXRoLFBNX01BWF9QQVRIKTsKLQkgICAgaWYgKFRyeVBhdGgoYnBkcGF0aCxjYWNoZWRwYXRoLGJwZHBhdGgsImRyaXZlcnMiLGRsbG5hbWUpKQotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgfQotCi0JLyogRmluYWxseSB0cnkgaW4gdGhlIGdsb2JhbCBzeXN0ZW0gcGF0aCBhZ2FpbiBzbyB0aGF0IHdlCi0JICogd2lsbCBzdGlsbCBmaW5kIHRoZSBkcml2ZXJzIGluIHRoZSBnbG9iYWwgc3lzdGVtIHBhdGggaWYKLQkgKiB0aGUgbG9jYWwgb3ZlcnJpZGUgb3B0aW9uIGlzIG9uLCBidXQgdGhlIGFwcGxpY2F0aW9uIGRvZXMKLQkgKiBub3QgaGF2ZSBhbnkgbG9jYWwgb3ZlcnJpZGUgZHJpdmVycy4KLQkgKi8KLQlpZiAoVHJ5UGF0aChicGRwYXRoLGNhY2hlZHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSwiIixkbGxuYW1lKSkKLQkgICAgcmV0dXJuIHRydWU7Ci0KLQkvKiBXaG9vcHMsIHdlIGNhbid0IGZpbmQgdGhlIEJQRCBmaWxlISAqLwotCXJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAvKiBBbHdheXMgdHJ5IGluIHRoZSBwcmV2aW91c2x5IGRpc2NvdmVyZWQgcGF0aCAqLwotICAgIHJldHVybiBUcnlQYXRoKGJwZHBhdGgsTlVMTCxjYWNoZWRwYXRoLCIiLGRsbG5hbWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvcGllcyBhIHN0cmluZyBpbnRvIGFub3RoZXIsIGFuZCByZXR1cm5zIGRlc3QgKyBzdHJsZW4oc3JjKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgY2hhciAqX3N0cGNweSgKLSAgICBjaGFyICpfZGVzdCwKLSAgICBjb25zdCBjaGFyICpfc3JjKQotewotICAgIGlmICghX2Rlc3QgfHwgIV9zcmMpCi0JcmV0dXJuIDA7Ci0gICAgd2hpbGUgKCgqX2Rlc3QrKyA9ICpfc3JjKyspICE9IDApCi0JOwotICAgIHJldHVybiAtLV9kZXN0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvcGllcyBhIHN0cmluZyBpbnRvIGFub3RoZXIsIHN0b3BwaW5nIGF0IHRoZSBtYXhpbXVtIGxlbmd0aC4gVGhlIHN0cmluZwotaXMgcHJvcGVybHkgdGVybWluYXRlZCAodW5saWtlIHN0cm5jcHkpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNhZmVfc3RybmNweSgKLSAgICBjaGFyICpkc3QsCi0gICAgY29uc3QgY2hhciAqc3JjLAotICAgIHVuc2lnbmVkIG1heGxlbikKLXsKLSAgICBpZiAoZHN0KSB7Ci0JaWYoc3RybGVuKHNyYykgPj0gbWF4bGVuKSB7Ci0JICAgIHN0cm5jcHkoZHN0LCBzcmMsIG1heGxlbik7Ci0JICAgIGRzdFttYXhsZW5dID0gMDsKLQkgICAgfQotCWVsc2UKLQkgICAgc3RyY3B5KGRzdCwgc3JjKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGV0ZXJtaW5zIGlmIHRoZSBkb3Qgc2VwYXJhdG9yIGlzIHByZXNlbnQgaW4gdGhlIHN0cmluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGZpbmREb3QoCi0gICAgY2hhciAqcCkKLXsKLSAgICBpZiAoKihwLTEpID09ICcuJykKLQlwLS07Ci0gICAgc3dpdGNoICgqLS1wKSB7Ci0JY2FzZSAnOic6Ci0JICAgIGlmICgqKHAtMikgIT0gJ1wwJykKLQkJYnJlYWs7Ci0JY2FzZSAnLyc6Ci0JY2FzZSAnXFwnOgotCWNhc2UgJ1wwJzoKLQkgICAgcmV0dXJuIHRydWU7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotTWFrZSBhIGZ1bGwgcGF0aG5hbWUgZnJvbSBzcGxpdCBjb21wb25lbnRzLgotCi1IRUFERVI6Ci1wbWFwaS5oCi0KLVBBUkFNRVRFUlM6Ci1wYXRoICAgIC0gUGxhY2UgdG8gc3RvcmUgZnVsbCBwYXRoCi1kcml2ZSAgIC0gRHJpdmUgY29tcG9uZW50IGZvciBwYXRoCi1kaXIgICAgIC0gRGlyZWN0b3J5IGNvbXBvbmVudCBmb3IgcGF0aAotbmFtZSAgICAtIEZpbGVuYW1lIGNvbXBvbmVudCBmb3IgcGF0aAotZXh0ICAgICAtIEV4dGVuc2lvbiBjb21wb25lbnQgZm9yIHBhdGgKLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIG1ha2UgYSBmdWxsIHBhdGhuYW1lIGZyb20gc3BsaXQgY29tcG9uZW50cy4gVW5kZXIgVW5peCB0aGUKLWRyaXZlIGNvbXBvbmVudCB3aWxsIHVzdWFsbHkgYmUgZW1wdHkuIElmIHRoZSBkcml2ZSwgZGlyLCBuYW1lLCBvciBleHQKLXBhcmFtZXRlcnMgYXJlIG51bGwgb3IgZW1wdHksIHRoZXkgYXJlIG5vdCBpbnNlcnRlZCBpbiB0aGUgcGF0aCBzdHJpbmcuCi1PdGhlcndpc2UsIGlmIHRoZSBkcml2ZSBkb2Vzbid0IGVuZCB3aXRoIGEgY29sb24sIG9uZSBpcyBpbnNlcnRlZCBpbiB0aGUKLXBhdGguIElmIHRoZSBkaXIgZG9lc24ndCBlbmQgaW4gYSBzbGFzaCwgb25lIGlzIGluc2VydGVkIGluIHRoZSBwYXRoLgotSWYgdGhlIGV4dCBkb2Vzbid0IHN0YXJ0IHdpdGggYSBkb3QsIG9uZSBpcyBpbnNlcnRlZCBpbiB0aGUgcGF0aC4KLQotVGhlIG1heGltdW0gc2l6ZXMgZm9yIHRoZSBwYXRoIHN0cmluZyBpcyBnaXZlbiBieSB0aGUgY29uc3RhbnQgUE1fTUFYX1BBVEgsCi13aGljaCBpbmNsdWRlcyBzcGFjZSBmb3IgdGhlIG51bGwtdGVybWluYXRvci4KLQotU0VFIEFMU086Ci1QTV9zcGxpdFBhdGgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX21ha2VwYXRoKAotICAgIGNoYXIgKnBhdGgsCi0gICAgY29uc3QgY2hhciAqZHJpdmUsCi0gICAgY29uc3QgY2hhciAqZGlyLAotICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgY29uc3QgY2hhciAqZXh0KQotewotICAgIGlmIChkcml2ZSAmJiAqZHJpdmUpIHsKLQkqcGF0aCsrID0gKmRyaXZlOwotCSpwYXRoKysgPSAnOic7Ci0JfQotICAgIGlmIChkaXIgJiYgKmRpcikgewotCXBhdGggPSBfc3RwY3B5KHBhdGgsZGlyKTsKLQlpZiAoKihwYXRoLTEpICE9ICdcXCcgJiYgKihwYXRoLTEpICE9ICcvJykKLSNpZmRlZiAgX19VTklYX18KLQkgICAgKnBhdGgrKyA9ICcvJzsKLSNlbHNlCi0JICAgICpwYXRoKysgPSAnXFwnOwotI2VuZGlmCi0JfQotICAgIGlmIChuYW1lKQotCXBhdGggPSBfc3RwY3B5KHBhdGgsbmFtZSk7Ci0gICAgaWYgKGV4dCAmJiAqZXh0KSB7Ci0JaWYgKCpleHQgIT0gJy4nKQotCSAgICAqcGF0aCsrID0gJy4nOwotCXBhdGggPSBfc3RwY3B5KHBhdGgsZXh0KTsKLQl9Ci0gICAgKnBhdGggPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1TcGxpdCBhIGZ1bGwgcGF0aG5hbWUgaW50byBjb21wb25lbnRzLgotCi1IRUFERVI6Ci1wbWFwaS5oCi0KLVBBUkFNRVRFUlM6Ci1wYXRoICAgIC0gRnVsbCBwYXRoIHRvIHNwbGl0Ci1kcml2ZSAgIC0gRHJpdmUgY29tcG9uZW50IGZvciBwYXRoCi1kaXIgICAgIC0gRGlyZWN0b3J5IGNvbXBvbmVudCBmb3IgcGF0aAotbmFtZSAgICAtIEZpbGVuYW1lIGNvbXBvbmVudCBmb3IgcGF0aAotZXh0ICAgICAtIEV4dGVuc2lvbiBjb21wb25lbnQgZm9yIHBhdGgKLQotUkVUVVJOUzoKLUZsYWdzIGluZGljYXRpbmcgd2hhdCBjb21wb25lbnRzIHdlcmUgcGFyc2VkLgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gc3BsaXQgYSBmdWxsIHBhdGhtYW1lIGludG8gc2VwYXJhdGUgY29tcG9uZW50cyBpbiB0aGUgZm9ybQotCi0gICAgWDpcRElSXFNVQkRJUlxOQU1FLkVYVAotCi1hbmQgc3BsaXRzIHBhdGggaW50byBpdHMgZm91ciBjb21wb25lbnRzLiBJdCB0aGVuIHN0b3JlcyB0aG9zZSBjb21wb25lbnRzCi1pbiB0aGUgc3RyaW5ncyBwb2ludGVkIHRvIGJ5IGRyaXZlLCBkaXIsIG5hbWUgYW5kIGV4dC4gKEVhY2ggY29tcG9uZW50IGlzCi1yZXF1aXJlZCBidXQgY2FuIGJlIGEgTlVMTCwgd2hpY2ggbWVhbnMgdGhlIGNvcnJlc3BvbmRpbmcgY29tcG9uZW50IHdpbGwgYmUKLXBhcnNlZCBidXQgbm90IHN0b3JlZCkuCi0KLVRoZSBtYXhpbXVtIHNpemVzIGZvciB0aGVzZSBzdHJpbmdzIGFyZSBnaXZlbiBieSB0aGUgY29uc3RhbnRzIFBNX01BWF9EUklWRQotYW5kIFBNX01BWF9QQVRILiBQTV9NQVhfRFJJVkUgaXMgYWx3YXlzIDQsIGFuZCBQTV9NQVhfUEFUSCBpcyB1c3VhbGx5IGF0Ci1sZWFzdCAyNTYgY2hhcmFjdGVycy4gVW5kZXIgVW5peCB0aGUgZGlyLCBuYW1lIGFuZCBleHQgY29tcG9uZW50cyBtYXkgYmUKLXVwIHRvIHRoZSBmdWxsIHBhdGggaW4gbGVuZ3RoLgotCi1TRUUgQUxTTzoKLVBNX21ha2VQYXRoCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX3NwbGl0cGF0aCgKLSAgICBjb25zdCBjaGFyICpwYXRoLAotICAgIGNoYXIgKmRyaXZlLAotICAgIGNoYXIgKmRpciwKLSAgICBjaGFyICpuYW1lLAotICAgIGNoYXIgKmV4dCkKLXsKLSAgICBjaGFyICAgICpwOwotICAgIGludCAgICAgdGVtcCxyZXQ7Ci0gICAgY2hhciAgICBidWZbUE1fTUFYX1BBVEgrMl07Ci0KLSAgICAvKiBTZXQgYWxsIHN0cmluZyB0byBkZWZhdWx0IHZhbHVlIHplcm8gKi8KLSAgICByZXQgPSAwOwotICAgIGlmIChkcml2ZSkgICpkcml2ZSA9IDA7Ci0gICAgaWYgKGRpcikgICAgKmRpciA9IDA7Ci0gICAgaWYgKG5hbWUpICAgKm5hbWUgPSAwOwotICAgIGlmIChleHQpICAgICpleHQgPSAwOwotCi0gICAgLyogQ29weSBmaWxlbmFtZSBpbnRvIHRlbXBsYXRlIHVwIHRvIFBNX01BWF9QQVRIIGNoYXJhY3RlcnMgKi8KLSAgICBwID0gYnVmOwotICAgIGlmICgodGVtcCA9IHN0cmxlbihwYXRoKSkgPiBQTV9NQVhfUEFUSCkKLQl0ZW1wID0gUE1fTUFYX1BBVEg7Ci0gICAgKnArKyA9IDA7Ci0gICAgc3RybmNweShwLCBwYXRoLCB0ZW1wKTsKLSAgICAqKHAgKz0gdGVtcCkgPSAwOwotCi0gICAgLyogU3BsaXQgdGhlIGZpbGVuYW1lIGFuZCBmaWxsIGNvcnJlc3BvbmRpbmcgbm9uemVybyBwb2ludGVycyAqLwotICAgIHRlbXAgPSAwOwotICAgIGZvciAoOzspIHsKLQlzd2l0Y2ggKCotLXApIHsKLQkgICAgY2FzZSAnLic6Ci0JCWlmICghdGVtcCAmJiAoKihwKzEpID09ICdcMCcpKQotCQkgICAgdGVtcCA9IGZpbmREb3QocCk7Ci0JCWlmICgoIXRlbXApICYmICgocmV0ICYgUE1fSEFTX0VYVEVOU0lPTikgPT0gMCkpIHsKLQkJICAgIHJldCB8PSBQTV9IQVNfRVhURU5TSU9OOwotCQkgICAgc2FmZV9zdHJuY3B5KGV4dCwgcCwgUE1fTUFYX1BBVEggLSAxKTsKLQkJICAgICpwID0gMDsKLQkJICAgIH0KLQkJY29udGludWU7Ci0JICAgIGNhc2UgJzonOgotCQlpZiAocCAhPSAmYnVmWzJdKQotCQkgICAgY29udGludWU7Ci0JICAgIGNhc2UgJ1wwJzoKLQkJaWYgKHRlbXApIHsKLQkJICAgIGlmICgqKytwKQotCQkJcmV0IHw9IFBNX0hBU19ESVJFQ1RPUlk7Ci0JCSAgICBzYWZlX3N0cm5jcHkoZGlyLCBwLCBQTV9NQVhfUEFUSCAtIDEpOwotCQkgICAgKnAtLSA9IDA7Ci0JCSAgICBicmVhazsKLQkJICAgIH0KLQkgICAgY2FzZSAnLyc6Ci0JICAgIGNhc2UgJ1xcJzoKLQkJaWYgKCF0ZW1wKSB7Ci0JCSAgICB0ZW1wKys7Ci0JCSAgICBpZiAoKisrcCkKLQkJCXJldCB8PSBQTV9IQVNfRklMRU5BTUU7Ci0JCSAgICBzYWZlX3N0cm5jcHkobmFtZSwgcCwgUE1fTUFYX1BBVEggLSAxKTsKLQkJICAgICpwLS0gPSAwOwotCQkgICAgaWYgKCpwID09IDAgfHwgKCpwID09ICc6JyAmJiBwID09ICZidWZbMl0pKQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCWNvbnRpbnVlOwotCSAgICBjYXNlICcqJzoKLQkgICAgY2FzZSAnPyc6Ci0JCWlmICghdGVtcCkKLQkJICAgIHJldCB8PSBQTV9IQVNfV0lMRENBUkRTOwotCSAgICBkZWZhdWx0OgotCQljb250aW51ZTsKLQkgICAgfQotCWJyZWFrOwotCX0KLSAgICBpZiAoKnAgPT0gJzonKSB7Ci0JaWYgKGJ1ZlsxXSkKLQkgICAgcmV0IHw9IFBNX0hBU19EUklWRTsKLQlzYWZlX3N0cm5jcHkoZHJpdmUsICZidWZbMV0sIFBNX01BWF9EUklWRSAtIDEpOwotCX0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1CbG9jayB1bnRpbCBhIHNwZWNpZmljIHRpbWUgaGFzIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgY2FsbAotCi1IRUFERVI6Ci1wbWFwaS5oCi0KLVBBUkFNRVRFUlM6Ci1taWxsaXNlY29uZHMgICAgLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZvciBkZWxheQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHRoZSBjYWxsaW5nIHRocmVhZCBvciBwcm9jZXNzIHVudGlsIHRoZSBzcGVjaWZpZWQKLW51bWJlciBvZiBtaWxsaXNlY29uZHMgaGF2ZSBwYXNzZWQgc2luY2UgdGhlIC9sYXN0LyBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uCi1UaGUgZmlyc3QgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkuIE9uCi1zdWJzcXVlbnQgY2FsbHMgaXQgd2lsbCBibG9jayB1bnRpbCB0aGUgc3BlY2lmaWVkIHRpbWUgaGFzIGVsYXBzZWQsIG9yIGl0Ci13aWxsIHJldHVybiBpbW1lZGlhdGVseSBpZiB0aGUgdGltZSBoYXMgYWxyZWFkeSBlbGFwc2VkLgotCi1UaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB0byBwcm92aWRlIGNvbnN0YW50IHRpbWUgZnVuY3Rpb25hbGl0eSBpbiBhCi1wcm9ncmFtLCBzdWNoIGFzIGEgZnJhbWUgcmF0ZSBsaW1pdGVyIGZvciBncmFwaGljcyBhcHBsaWNhdGlvbnMgZXRjLgotCi1TRUUgQUxTTzoKLVBNX3NsZWVwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9ibG9ja1VudGlsVGltZW91dCgKLSAgICB1bG9uZyBtaWxsaXNlY29uZHMpCi17Ci0gICAgdWxvbmcgICAgICAgICAgICAgICAgICAgbWljcm9zZWNvbmRzID0gbWlsbGlzZWNvbmRzICogMTAwMEwsbXNEZWxheTsKLSAgICBzdGF0aWMgTFpUaW1lck9iamVjdCAgICB0bTsKLSAgICBzdGF0aWMgaWJvb2wgICAgICAgICAgICBmaXJzdFRpbWUgPSB0cnVlOwotCi0gICAgaWYgKGZpcnN0VGltZSkgewotCWZpcnN0VGltZSA9IGZhbHNlOwotCUxaVGltZXJPbkV4dCgmdG0pOwotCX0KLSAgICBlbHNlIHsKLQlpZiAoKG1zRGVsYXkgPSAobWljcm9zZWNvbmRzIC0gTFpUaW1lckxhcEV4dCgmdG0pKSAvIDEwMDBMKSA+IDApCi0JICAgIFBNX3NsZWVwKG1zRGVsYXkpOwotCXdoaWxlIChMWlRpbWVyTGFwRXh0KCZ0bSkgPCBtaWNyb3NlY29uZHMpCi0JICAgIDsKLQlMWlRpbWVyT2ZmRXh0KCZ0bSk7Ci0JTFpUaW1lck9uRXh0KCZ0bSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19jcHVpbmZvLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fY3B1aW5mby5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZWJlZDcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19jcHVpbmZvLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDYwMCArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICBOQVNNIG9yIFRBU00gQXNzZW1ibGVyCi07KiBFbnZpcm9ubWVudDogSW50ZWwgMzIgYml0IFByb3RlY3RlZCBNb2RlLgotOyoKLTsqIERlc2NyaXB0aW9uOiBDb2RlIHRvIGRldGVybWluZSB0aGUgSW50ZWwgcHJvY2Vzc29yIHR5cGUuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIKLQotaGVhZGVyICAgICAgX2NwdWluZm8KLQotYmVnZGF0YXNlZyAgX2NwdWluZm8gICAgICAgICAgICAgICAgOyBTdGFydCBvZiBkYXRhIHNlZ21lbnQKLQotY2FjaGVfaWQgICAgZGIgICIwMTIzNDU2Nzg5MDEyMzQ1NiIKLWludGVsX2lkICAgIGRiICAiR2VudWluZUludGVsIiAgICAgIDsgSW50ZWwgdmVuZG9yIElECi1jeXJpeF9pZCAgICBkYiAgIkN5cml4SW5zdGVhZCIgICAgICA7IEN5cml4IHZlbmRvciBJRAotYW1kX2lkICAgICAgZGIgICJBdXRoZW50aWNBTUQiICAgICAgOyBBTUQgdmVuZG9yIElECi1pZHRfaWQgICAgICBkYiAgIkNlbnRhdXJIYXVscyIgICAgICA7IElEVCB2ZW5kb3IgSUQKLQotQ1BVX0lEVCAgICAgRVFVIDAxMDAwaCAgICAgICAgICAgICAgOyBGbGFnIGZvciBJRFQgcHJvY2Vzc29ycwotQ1BVX0N5cml4ICAgRVFVIDAyMDAwaCAgICAgICAgICAgICAgOyBGbGFnIGZvciBDeXJpeCBwcm9jZXNzb3JzCi1DUFVfQU1EICAgICBFUVUgMDQwMDBoICAgICAgICAgICAgICA7IEZsYWcgZm9yIEFNRCBwcm9jZXNzb3JzCi1DUFVfSW50ZWwgICBFUVUgMDgwMDBoICAgICAgICAgICAgICA7IEZsYWcgZm9yIEludGVsIHByb2Nlc3NvcnMKLQotZW5kZGF0YXNlZyAgX2NwdWluZm8KLQotYmVnY29kZXNlZyAgX2NwdWluZm8gICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotaWZkZWYgICBVU0VfTkFTTQotJW1hY3JvIG1DUFVfSUQgMAotZGIgIDAwRmgsMEEyaAotJWVuZG1hY3JvCi1lbHNlCi1NQUNSTyAgIG1DUFVfSUQKLWRiICAwMEZoLDBBMmgKLUVORE0KLWVuZGlmCi0KLWlmZGVmICAgVVNFX05BU00KLSVtYWNybyBtUkRUU0MgMAotZGIgIDAwRmgsMDMxaAotJWVuZG1hY3JvCi1lbHNlCi1NQUNSTyAgIG1SRFRTQwotZGIgIDAwRmgsMDMxaAotRU5ETQotZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgYm9vbCBfQ1BVX2NoZWNrODAzODYodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERldGVybWluZXMgaWYgd2UgaGF2ZSBhbiBpMzg2IHByb2Nlc3Nvci4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX2NoZWNrODAzODYKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgeG9yICAgICBlZHgsZWR4ICAgICAgICAgICAgIDsgRURYID0gMCwgbm90IGFuIDgwMzg2Ci0gICAgICAgIG1vdiAgICAgYngsIHNwCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGFuZCAgICAgc3AsIH4zCi1lbHNlCi0gICAgICAgIGFuZCAgICAgc3AsIG5vdCAzCi1lbmRpZgotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICAgICAgOyBQdXNoIG9yaWdpbmFsIEVGTEFHUwotICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBHZXQgb3JpZ2luYWwgRUZMQUdTCi0gICAgICAgIG1vdiAgICAgZWN4LCBlYXggICAgICAgICAgICA7IFNhdmUgb3JpZ2luYWwgRUZMQUdTCi0gICAgICAgIHhvciAgICAgZWF4LCA0MDAwMGggICAgICAgICA7IEZsaXAgQUMgYml0IGluIEVGTEFHUwotICAgICAgICBwdXNoICAgIGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIG5ldyBFRkxBR1MgdmFsdWUgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgICBzdGFjawotICAgICAgICBwb3BmZCAgICAgICAgICAgICAgICAgICAgICAgOyBSZXBsYWNlIGN1cnJlbnQgRUZMQUdTIHZhbHVlCi0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgICAgICA7IEdldCBuZXcgRUZMQUdTCi0gICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgICAgICA7IFN0b3JlIG5ldyBFRkxBR1MgaW4gRUFYCi0gICAgICAgIHhvciAgICAgZWF4LCBlY3ggICAgICAgICAgICA7IENhbid0IHRvZ2dsZSBBQyBiaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICAgcHJvY2Vzc29yPTgwMzg2Ci0gICAgICAgIGpueiAgICAgQEBEb25lICAgICAgICAgICAgICA7IEp1bXAgaWYgbm90IGFuIDgwMzg2IHByb2Nlc3NvcgotICAgICAgICBpbmMgICAgIGVkeCAgICAgICAgICAgICAgICAgOyBXZSBoYXZlIGFuIDgwMzg2Ci0KLUBARG9uZTogcHVzaCAgICBlY3gKLSAgICAgICAgcG9wZmQKLSAgICAgICAgbW92ICAgICBzcCwgYngKLSAgICAgICAgbW92ICAgICBlYXgsIGVkeAotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBib29sIF9DUFVfY2hlY2s4MDQ4Nih2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRGV0ZXJtaW5lcyBpZiB3ZSBoYXZlIGFuIGk0ODYgcHJvY2Vzc29yLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9DUFVfY2hlY2s4MDQ4NgotCi0gICAgICAgIGVudGVyX2MKLQotOyBEaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBpNDg2IGFuZCBQZW50aXVtIGJ5IHRoZSBhYmlsaXR5IHRvIHNldCB0aGUgSUQgZmxhZwotOyBpbiB0aGUgRUZMQUdTIHJlZ2lzdGVyLiBJZiB0aGUgSUQgZmxhZyBpcyBzZXQsIHRoZW4gd2UgY2FuIHVzZSB0aGUgQ1BVSUQKLTsgaW5zdHJ1Y3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBmaW5hbCB2ZXJzaW9uIG9mIHRoZSBjaGlwLiBPdGhlcndpc2Ugd2UKLTsgc2ltcGx5IGhhdmUgYW4gODA0ODYuCi0KLTsgRGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgaTQ4NiBhbmQgUGVudGl1bSBieSB0aGUgYWJpbGl0eSB0byBzZXQgdGhlIElEIGZsYWcKLTsgaW4gdGhlIEVGTEFHUyByZWdpc3Rlci4gSWYgdGhlIElEIGZsYWcgaXMgc2V0LCB0aGVuIHdlIGNhbiB1c2UgdGhlIENQVUlECi07IGluc3RydWN0aW9uIHRvIGRldGVybWluZSB0aGUgZmluYWwgdmVyc2lvbiBvZiB0aGUgY2hpcC4gT3RoZXJ3aXNlIHdlCi07IHNpbXBseSBoYXZlIGFuIDgwNDg2LgotCi0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgICAgICA7IEdldCBvcmlnaW5hbCBFRkxBR1MKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgbW92ICAgICBlY3gsIGVheAotICAgICAgICB4b3IgICAgIGVheCwgMjAwMDAwaCAgICAgICAgOyBGbGlwIElEIGJpdCBpbiBFRkxBR1MKLSAgICAgICAgcHVzaCAgICBlYXggICAgICAgICAgICAgICAgIDsgU2F2ZSBuZXcgRUZMQUdTIHZhbHVlIG9uIHN0YWNrCi0gICAgICAgIHBvcGZkICAgICAgICAgICAgICAgICAgICAgICA7IFJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IG5ldyBFRkxBR1MKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgU3RvcmUgbmV3IEVGTEFHUyBpbiBFQVgKLSAgICAgICAgeG9yICAgICBlYXgsIGVjeCAgICAgICAgICAgIDsgQ2FuIG5vdCB0b2dnbGUgSUQgYml0LAotICAgICAgICBqbnogICAgIEBAMSAgICAgICAgICAgICAgICAgOyBQcm9jZXNzb3I9ODA0ODYKLSAgICAgICAgbW92ICAgICBlYXgsMSAgICAgICAgICAgICAgIDsgV2UgZG9udCBoYXZlIGEgUGVudGl1bQotICAgICAgICBqbXAgICAgIEBARG9uZQotQEAxOiAgICBtb3YgICAgIGVheCwwICAgICAgICAgICAgICAgOyBXZSBoYXZlIFBlbnRpdW0gb3IgbGF0ZXIKLUBARG9uZTogbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgYm9vbCBfQ1BVX2NoZWNrQ2xvbmUodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENoZWNrcyBpZiB0aGUgaTM4NiBvciBpNDg2IHByb2Nlc3NvciBpcyBhIGNsb25lIG9yIGdlbnVpbmUgSW50ZWwuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0NQVV9jaGVja0Nsb25lCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgYXgsNTU1NWggICAgICAgICAgICA7IENoZWNrIHRvIG1ha2Ugc3VyZSB0aGlzIGlzIGEgMzItYml0IHByb2Nlc3NvcgotICAgICAgICB4b3IgICAgIGR4LGR4Ci0gICAgICAgIG1vdiAgICAgY3gsMmgKLSAgICAgICAgZGl2ICAgICBjeCAgICAgICAgICAgICAgICAgIDsgUGVyZm9ybSBEaXZpc2lvbgotICAgICAgICBjbGMKLSAgICAgICAgam56ICAgICBAQE5vQ2xvbmUKLSAgICAgICAgam1wICAgICBAQENsb25lCi1AQE5vQ2xvbmU6Ci0gICAgICAgIHN0YwotQEBDbG9uZToKLSAgICAgICAgcHVzaGZkCi0gICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgICAgICA7IEdldCB0aGUgZmxhZ3MKLSAgICAgICAgYW5kICAgICBlYXgsMQotICAgICAgICB4b3IgICAgIGVheCwxICAgICAgICAgICAgICAgOyBFQVg9MCBpcyBwcm9iYWJseSBJbnRlbCwgRUFYPTEgaXMgYSBDbG9uZQotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGJvb2wgX0NQVV9oYXZlQ1BVSUQodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERldGVybWluZXMgaWYgd2UgaGF2ZSBzdXBwb3J0IGZvciB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0NQVV9oYXZlQ1BVSUQKLQotICAgICAgICBlbnRlcl9jCi0KLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICAgICAgOyBHZXQgb3JpZ2luYWwgRUZMQUdTCi0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIG1vdiAgICAgZWN4LCBlYXgKLSAgICAgICAgeG9yICAgICBlYXgsIDIwMDAwMGggICAgICAgIDsgRmxpcCBJRCBiaXQgaW4gRUZMQUdTCi0gICAgICAgIHB1c2ggICAgZWF4ICAgICAgICAgICAgICAgICA7IFNhdmUgbmV3IEVGTEFHUyB2YWx1ZSBvbiBzdGFjawotICAgICAgICBwb3BmZCAgICAgICAgICAgICAgICAgICAgICAgOyBSZXBsYWNlIGN1cnJlbnQgRUZMQUdTIHZhbHVlCi0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgICAgICA7IEdldCBuZXcgRUZMQUdTCi0gICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgICAgICA7IFN0b3JlIG5ldyBFRkxBR1MgaW4gRUFYCi0gICAgICAgIHhvciAgICAgZWF4LCBlY3ggICAgICAgICAgICA7IENhbiBub3QgdG9nZ2xlIElEIGJpdCwKLSAgICAgICAgam56ICAgICBAQDEgICAgICAgICAgICAgICAgIDsgUHJvY2Vzc29yPTgwNDg2Ci0gICAgICAgIG1vdiAgICAgZWF4LDAgICAgICAgICAgICAgICA7IFdlIGRvbnQgaGF2ZSBDUFVJRCBzdXBwb3J0Ci0gICAgICAgIGptcCAgICAgQEBEb25lCi1AQDE6ICAgIG1vdiAgICAgZWF4LDEgICAgICAgICAgICAgICA7IFdlIGhhdmUgQ1BVSUQgc3VwcG9ydAotZWxzZQotICAgICAgICBtb3YgICAgIGVheCwwICAgICAgICAgICAgICAgOyBDUFVJRCByZXF1aXJlcyAzMi1iaXQgcG1vZGUKLWVuZGlmCi1AQERvbmU6IGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVpbnQgX0NQVV9jaGVja0NQVUlEKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBEZXRlcm1pbmVzIHRoZSBDUFUgdHlwZSB1c2luZyB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0NQVV9jaGVja0NQVUlECi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIHhvciAgICAgZWF4LCBlYXggICAgICAgICAgICA7IFNldCB1cCBmb3IgQ1BVSUQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGFuZCBzYXZlIHZlbmRvciBJRAotICAgICAgICBjbXAgICAgIGVheCwgMSAgICAgICAgICAgICAgOyBNYWtlIHN1cmUgMSBpcyB2YWxpZCBpbnB1dCBmb3IgQ1BVSUQKLSAgICAgICAgamwgICAgICBAQEZhaWwgICAgICAgICAgICAgIDsgV2UgZG9udCBoYXZlIHRoZSBDUFVJRCBpbnN0cnVjdGlvbgotICAgICAgICB4b3IgICAgIGVheCxlYXggICAgICAgICAgICAgOyBBc3N1bWUgdmVuZG9yIGlzIHVua25vd24KLQotOyBDaGVjayBmb3IgR2VudWluZUludGVsIHByb2Nlc3NvcnMKLQotICAgICAgICBMRUFfTCAgIGVzaSxpbnRlbF9pZAotICAgICAgICBjbXAgICAgIFtEV09SRCBlc2ldLCBlYngKLSAgICAgICAgam5lICAgICBAQE5vdEludGVsCi0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaSs0XSwgZWR4Ci0gICAgICAgIGpuZSAgICAgQEBOb3RJbnRlbAotICAgICAgICBjbXAgICAgIFtEV09SRCBlc2krOF0sIGVjeAotICAgICAgICBqbmUgICAgIEBATm90SW50ZWwKLSAgICAgICAgbW92ICAgICBlYXgsQ1BVX0ludGVsICAgICAgIDsgRmxhZyB0aGF0IHdlIGhhdmUgR2VudWluZUludGVsCi0gICAgICAgIGptcCAgICAgQEBGb3VuZFZlbmRvcgotCi07IENoZWNrIGZvciBDeXJpeEluc3RlYWQgcHJvY2Vzc29ycwotCi1AQE5vdEludGVsOgotICAgICAgICBMRUFfTCAgIGVzaSxjeXJpeF9pZAotICAgICAgICBjbXAgICAgIFtEV09SRCBlc2ldLCBlYngKLSAgICAgICAgam5lICAgICBAQE5vdEN5cml4Ci0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaSs0XSwgZWR4Ci0gICAgICAgIGpuZSAgICAgQEBOb3RDeXJpeAotICAgICAgICBjbXAgICAgIFtEV09SRCBlc2krOF0sIGVjeAotICAgICAgICBqbmUgICAgIEBATm90Q3lyaXgKLSAgICAgICAgbW92ICAgICBlYXgsQ1BVX0N5cml4ICAgICAgIDsgRmxhZyB0aGF0IHdlIGhhdmUgQ3lyaXhJbnN0ZWFkCi0gICAgICAgIGptcCAgICAgQEBGb3VuZFZlbmRvcgotCi07IENoZWNrIGZvciBBdXRoZW50aWNBTUQgcHJvY2Vzc29ycwotCi1AQE5vdEN5cml4OgotICAgICAgICBMRUFfTCAgIGVzaSxhbWRfaWQKLSAgICAgICAgY21wICAgICBbRFdPUkQgZXNpXSwgZWJ4Ci0gICAgICAgIGpuZSAgICAgQEBOb3RBTUQKLSAgICAgICAgY21wICAgICBbRFdPUkQgZXNpKzRdLCBlZHgKLSAgICAgICAgam5lICAgICBAQE5vdEFNRAotICAgICAgICBjbXAgICAgIFtEV09SRCBlc2krOF0sIGVjeAotICAgICAgICBqbmUgICAgIEBATm90QU1ECi0gICAgICAgIG1vdiAgICAgZWF4LENQVV9BTUQgICAgICAgICA7IEZsYWcgdGhhdCB3ZSBoYXZlIEF1dGhlbnRpY0FNRAotICAgICAgICBqbXAgICAgIEBARm91bmRWZW5kb3IKLQotOyBDaGVjayBmb3IgQ2VudGF1ckhhdWxzIHByb2Nlc3NvcnMKLQotQEBOb3RBTUQ6Ci0gICAgICAgIExFQV9MICAgZXNpLGlkdF9pZAotICAgICAgICBjbXAgICAgIFtEV09SRCBlc2ldLCBlYngKLSAgICAgICAgam5lICAgICBAQE5vdElEVAotICAgICAgICBjbXAgICAgIFtEV09SRCBlc2krNF0sIGVkeAotICAgICAgICBqbmUgICAgIEBATm90SURUCi0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaSs4XSwgZWN4Ci0gICAgICAgIGpuZSAgICAgQEBOb3RJRFQKLSAgICAgICAgbW92ICAgICBlYXgsQ1BVX0lEVCAgICAgICAgIDsgRmxhZyB0aGF0IHdlIGhhdmUgQXV0aGVudGljSURUCi0gICAgICAgIGptcCAgICAgQEBGb3VuZFZlbmRvcgotCi1AQE5vdElEVDoKLQotQEBGb3VuZFZlbmRvcjoKLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgeG9yICAgICBlYXgsIGVheAotICAgICAgICBpbmMgICAgIGVheAotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgZmFtaWx5L21vZGVsL3N0ZXBwaW5nL2ZlYXR1cmVzCi0gICAgICAgIGFuZCAgICAgZWF4LCAwRjAwaAotICAgICAgICBzaHIgICAgIGVheCwgOCAgICAgICAgICAgICAgOyBJc29sYXRlIGZhbWlseQotICAgICAgICBhbmQgICAgIGVheCwgMEZoCi0gICAgICAgIHBvcCAgICAgZWN4Ci0gICAgICAgIG9yICAgICAgZWF4LGVjeCAgICAgICAgICAgICA7IENvbWJpbmUgaW4gdGhlIGNsb25lIGZsYWcKLUBARG9uZTogbGVhdmVfYwotICAgICAgICByZXQKLQotQEBGYWlsOiB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgam1wICAgICBAQERvbmUKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWludCBfQ1BVX2dldENQVUlETW9kZWwodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERldGVybWluZXMgdGhlIENQVSB0eXBlIHVzaW5nIHRoZSBDUFVJRCBpbnN0cnVjdGlvbi4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX2dldENQVUlETW9kZWwKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgeG9yICAgICBlYXgsIGVheCAgICAgICAgICAgIDsgU2V0IHVwIGZvciBDUFVJRCBpbnN0cnVjdGlvbgotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgYW5kIHNhdmUgdmVuZG9yIElECi0gICAgICAgIGNtcCAgICAgZWF4LCAxICAgICAgICAgICAgICA7IE1ha2Ugc3VyZSAxIGlzIHZhbGlkIGlucHV0IGZvciBDUFVJRAotICAgICAgICBqbCAgICAgIEBARmFpbCAgICAgICAgICAgICAgOyBXZSBkb250IGhhdmUgdGhlIENQVUlEIGluc3RydWN0aW9uCi0gICAgICAgIHhvciAgICAgZWF4LCBlYXgKLSAgICAgICAgaW5jICAgICBlYXgKLSAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGZhbWlseS9tb2RlbC9zdGVwcGluZy9mZWF0dXJlcwotICAgICAgICBhbmQgICAgIGVheCwgMEYwaAotICAgICAgICBzaHIgICAgIGVheCwgNCAgICAgICAgICAgICAgOyBJc29sYXRlIG1vZGVsCi1AQERvbmU6IGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLUBARmFpbDogeG9yICAgICBlYXgsZWF4Ci0gICAgICAgIGptcCAgICAgQEBEb25lCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVpbnQgX0NQVV9nZXRDUFVJRFN0ZXBwaW5nKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBEZXRlcm1pbmVzIHRoZSBDUFUgdHlwZSB1c2luZyB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0NQVV9nZXRDUFVJRFN0ZXBwaW5nCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIHhvciAgICAgZWF4LCBlYXggICAgICAgICAgICA7IFNldCB1cCBmb3IgQ1BVSUQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGFuZCBzYXZlIHZlbmRvciBJRAotICAgICAgICBjbXAgICAgIGVheCwgMSAgICAgICAgICAgICAgOyBNYWtlIHN1cmUgMSBpcyB2YWxpZCBpbnB1dCBmb3IgQ1BVSUQKLSAgICAgICAgamwgICAgICBAQEZhaWwgICAgICAgICAgICAgIDsgV2UgZG9udCBoYXZlIHRoZSBDUFVJRCBpbnN0cnVjdGlvbgotICAgICAgICB4b3IgICAgIGVheCwgZWF4Ci0gICAgICAgIGluYyAgICAgZWF4Ci0gICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBmYW1pbHkvbW9kZWwvc3RlcHBpbmcvZmVhdHVyZXMKLSAgICAgICAgYW5kICAgICBlYXgsIDAwRmggICAgICAgICAgIDsgSXNvbGF0ZSBzdGVwcGluZwotQEBEb25lOiBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1AQEZhaWw6IHhvciAgICAgZWF4LGVheAotICAgICAgICBqbXAgICAgIEBARG9uZQotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1aW50IF9DUFVfZ2V0Q1BVSURGZWF0dXJlcyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRGV0ZXJtaW5lcyB0aGUgQ1BVIHR5cGUgdXNpbmcgdGhlIENQVUlEIGluc3RydWN0aW9uLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9DUFVfZ2V0Q1BVSURGZWF0dXJlcwotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICB4b3IgICAgIGVheCwgZWF4ICAgICAgICAgICAgOyBTZXQgdXAgZm9yIENQVUlEIGluc3RydWN0aW9uCi0gICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBhbmQgc2F2ZSB2ZW5kb3IgSUQKLSAgICAgICAgY21wICAgICBlYXgsIDEgICAgICAgICAgICAgIDsgTWFrZSBzdXJlIDEgaXMgdmFsaWQgaW5wdXQgZm9yIENQVUlECi0gICAgICAgIGpsICAgICAgQEBGYWlsICAgICAgICAgICAgICA7IFdlIGRvbnQgaGF2ZSB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgeG9yICAgICBlYXgsIGVheAotICAgICAgICBpbmMgICAgIGVheAotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgZmFtaWx5L21vZGVsL3N0ZXBwaW5nL2ZlYXR1cmVzCi0gICAgICAgIG1vdiAgICAgZWF4LCBlZHgKLUBARG9uZTogbGVhdmVfYwotICAgICAgICByZXQKLQotQEBGYWlsOiB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgam1wICAgICBAQERvbmUKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWludCBfQ1BVX2dldENhY2hlU2l6ZSh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRGV0ZXJtaW5lcyB0aGUgQ1BVIGNhY2hlIHNpemUgZm9yIEludGVsIHByb2Nlc3NvcnMKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX2dldENhY2hlU2l6ZQotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgeG9yICAgICBlYXgsIGVheCAgICAgICAgICAgIDsgU2V0IHVwIGZvciBDUFVJRCBpbnN0cnVjdGlvbgotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgYW5kIHNhdmUgdmVuZG9yIElECi0gICAgICAgIGNtcCAgICAgZWF4LDIgICAgICAgICAgICAgICA7IE1ha2Ugc3VyZSAyIGlzIHZhbGlkIGlucHV0IGZvciBDUFVJRAotICAgICAgICBqbCAgICAgIEBARmFpbCAgICAgICAgICAgICAgOyBXZSBkb250IGhhdmUgdGhlIENQVUlEIGluc3RydWN0aW9uCi0gICAgICAgIG1vdiAgICAgZWF4LDIKLSAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGNhY2hlIGRlc2NyaXB0b3JzCi0gICAgICAgIExFQV9MICAgZXNpLGNhY2hlX2lkICAgICAgICA7IEdldCBhZGRyZXNzIG9mIGNhY2hlIElEICgtZlBJQyBhd2FyZSkKLSAgICAgICAgc2hyICAgICBlYXgsOAotICAgICAgICBtb3YgICAgIFtlc2krMF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VzaSszXSxlYngKLSAgICAgICAgbW92ICAgICBbZXNpKzddLGVjeAotICAgICAgICBtb3YgICAgIFtlc2krMTFdLGVkeAotICAgICAgICB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgTEVBX0wgICBlc2ksY2FjaGVfaWQgICAgICAgIDsgR2V0IGFkZHJlc3Mgb2YgY2FjaGUgSUQgKC1mUElDIGF3YXJlKQotICAgICAgICBtb3YgICAgIGVkaSwxNQotQEBTY2FuTG9vcDoKLSAgICAgICAgY21wICAgICBbQllURSBlc2ldLDQxaAotICAgICAgICBtb3YgICAgIGVheCwxMjgKLSAgICAgICAgamUgICAgICBAQERvbmUKLSAgICAgICAgY21wICAgICBbQllURSBlc2ldLDQyaAotICAgICAgICBtb3YgICAgIGVheCwyNTYKLSAgICAgICAgamUgICAgICBAQERvbmUKLSAgICAgICAgY21wICAgICBbQllURSBlc2ldLDQzaAotICAgICAgICBtb3YgICAgIGVheCw1MTIKLSAgICAgICAgamUgICAgICBAQERvbmUKLSAgICAgICAgY21wICAgICBbQllURSBlc2ldLDQ0aAotICAgICAgICBtb3YgICAgIGVheCwxMDI0Ci0gICAgICAgIGplICAgICAgQEBEb25lCi0gICAgICAgIGNtcCAgICAgW0JZVEUgZXNpXSw0NWgKLSAgICAgICAgbW92ICAgICBlYXgsMjA0OAotICAgICAgICBqZSAgICAgIEBARG9uZQotICAgICAgICBpbmMgICAgIGVzaQotICAgICAgICBkZWMgICAgIGVkaQotICAgICAgICBqbnogICAgIEBAU2Nhbkxvb3AKLQotQEBEb25lOiBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1AQEZhaWw6IHhvciAgICAgZWF4LGVheAotICAgICAgICBqbXAgICAgIEBARG9uZQotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1aW50IF9DUFVfaGF2ZTNETm93KHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBEZXRlcm1pbmVzIHRoZSBDUFUgdHlwZSB1c2luZyB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0NQVV9oYXZlM0ROb3cKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgbW92ICAgICBlYXgsODAwMDAwMDBoICAgICAgIDsgUXVlcnkgZm9yIGV4dGVuZGVkIGZ1bmN0aW9ucwotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgZXh0ZW5kZWQgZnVuY3Rpb24gbGltaXQKLSAgICAgICAgY21wICAgICBlYXgsODAwMDAwMDFoCi0gICAgICAgIGpiZSAgICAgQEBGYWlsICAgICAgICAgICAgICA7IE5vcGUsIHdlIGRvbnQgaGF2ZSBmdW5jdGlvbiA4MDAwMDAwMDFoCi0gICAgICAgIG1vdiAgICAgZWF4LDgwMDAwMDAxaCAgICAgICA7IFNldHVwIGV4dGVuZGVkIGZ1bmN0aW9uIDgwMDAwMDAwMWgKLSAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgYW5kIGdldCB0aGUgaW5mb3JtYXRpb24KLSAgICAgICAgdGVzdCAgICBlZHgsODAwMDAwMDBoICAgICAgIDsgQml0IDMxIGlzIHNldCBpZiAzRE5vdyEgcHJlc2VudAotICAgICAgICBqeiAgICAgIEBARmFpbCAgICAgICAgICAgICAgOyBOb3BlLCB3ZSBkb250IGhhdmUgM0ROb3cgc3VwcG9ydAotICAgICAgICBtb3YgICAgIGVheCwxICAgICAgICAgICAgICAgOyBZZXAsIHdlIGhhdmUgM0ROb3chIHN1cHBvcnQhCi1AQERvbmU6IGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLUBARmFpbDogeG9yICAgICBlYXgsZWF4Ci0gICAgICAgIGptcCAgICAgQEBEb25lCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIF9DUFVfcXVpY2tSRFRTQyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZHMgdGhlIHRpbWUgc3RhbXAgY291bnRlciBhbmQgcmV0dXJucyB0aGUgbG93IG9yZGVyIDMyLWJpdHMKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX3F1aWNrUkRUU0MKLQotICAgICAgICBtUkRUU0MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX0NQVV9ydW5CU0ZMb29wKHVsb25nIGludGVyYXRpb25zKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUnVucyBhIGxvb3Agb2YgQlNGIGluc3RydWN0aW9ucyBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgaXRlcmF0aW9ucwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9DUFVfcnVuQlNGTG9vcAotCi0gICAgICAgIEFSRyAgICAgaXRlcmF0aW9uczpVTE9ORwotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBwdXNoICAgIF9ieAotCi0gICAgICAgIG1vdiAgICAgZWR4LFtpdGVyYXRpb25zXQotICAgICAgICBtb3YgICAgIGVheCw4MDAwMDAwMGgKLSAgICAgICAgbW92ICAgICBlYngsZWR4Ci0KLSAgICAgICAgQUxJR04gICA0Ci0KLUBAbG9vcDogYnNmICAgICBlY3gsZWF4Ci0gICAgICAgIGRlYyAgICAgZWJ4Ci0gICAgICAgIGpueiAgICAgQEBsb29wCi0KLSAgICAgICAgcG9wICAgICBfYngKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgIF9DUFVfcmVhZFRpbWVTdGFtcChDUFVfbGFyZ2VJbnRlZ2VyICp0aW1lKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWRzIHRoZSB0aW1lIHN0YW1wIGNvdW50ZXIgYW5kIHJldHVybnMgdGhlIDY0LWJpdCByZXN1bHQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0NQVV9yZWFkVGltZVN0YW1wCi0KLSAgICAgICAgbVJEVFNDCi0gICAgICAgIG1vdiAgICAgZWN4LFtlc3ArNF0gICAgIDsgQWNjZXNzIGRpcmVjdGx5IHdpdGhvdXQgc3RhY2sgZnJhbWUKLSAgICAgICAgbW92ICAgICBbZWN4XSxlYXgKLSAgICAgICAgbW92ICAgICBbZWN4KzRdLGVkeAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWxvbmcgX0NQVV9kaWZmVGltZTY0KENQVV9sYXJnZUludGVnZXIgKnQxLENQVV9sYXJnZUludGVnZXIgKnQyLENQVV9sYXJnZUludGVnZXIgKnQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byA2NC1iaXQgbnVtYmVycy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX2RpZmZUaW1lNjQKLQotICAgICAgICBBUkcgICAgIHQxOkRQVFIsIHQyOkRQVFIsIHQ6RFBUUgotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIGVjeCxbdDJdCi0gICAgICAgIG1vdiAgICAgZWF4LFtlY3hdICAgICAgIDsgRUFYIDo9IHQyLmxvdwotICAgICAgICBtb3YgICAgIGVjeCxbdDFdCi0gICAgICAgIHN1YiAgICAgZWF4LFtlY3hdCi0gICAgICAgIG1vdiAgICAgZWR4LGVheCAgICAgICAgIDsgRURYIDo9IGxvdyBkaWZmZXJlbmNlCi0gICAgICAgIG1vdiAgICAgZWN4LFt0Ml0KLSAgICAgICAgbW92ICAgICBlYXgsW2VjeCs0XSAgICAgOyBFQ1ggOj0gdDIuaGlnaAotICAgICAgICBtb3YgICAgIGVjeCxbdDFdCi0gICAgICAgIHNiYiAgICAgZWF4LFtlY3grNF0gICAgIDsgRUFYIDo9IGhpZ2ggZGlmZmVyZW5jZQotCi0gICAgICAgIG1vdiAgICAgZWJ4LFt0XSAgICAgICAgIDsgU3RvcmUgdGhlIHJlc3VsdAotICAgICAgICBtb3YgICAgIFtlYnhdLGVkeCAgICAgICA7IFN0b3JlIGxvdyBwYXJ0Ci0gICAgICAgIG1vdiAgICAgW2VieCs0XSxlYXggICAgIDsgU3RvcmUgaGlnaCBwYXJ0Ci0gICAgICAgIG1vdiAgICAgZWF4LGVkeCAgICAgICAgIDsgUmV0dXJuIGxvdyBwYXJ0Ci1pZm5kZWYgZmxhdG1vZGVsCi0gICAgICAgIHNobGQgICAgZWR4LGVheCwxNiAgICAgIDsgUmV0dXJuIGluIERYOkFYCi1lbmRpZgotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bG9uZyBfQ1BVX2NhbGNNaWNyb1NlYyhDUFVfbGFyZ2VJbnRlZ2VyICpjb3VudCx1bG9uZyBmcmVxKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENvbXB1dGVzIHRoZSB2YWx1ZSBpbiBtaWNyb3NlY29uZHMgZm9yIHRoZSBlbGFwc2VkIHRpbWUgd2l0aCBtYXhpbXVtCi07IHByZWNpc2lvbi4gVGhlIGZvcm11bGEgd2UgdXNlIGlzOgotOwotOyAgIHVzID0gKCgoZGlmZiAqIDB4MTAwMDAwKSAvIGZyZXEpICogMTAwMDAwMCkgLyAweDEwMDAwMCkKLTsKLTsgVGhlIHBvd2VyIG9mIHR3byBtdWx0aXBsZSBiZWZvcmUgdGhlIGZpcnN0IGRpdmlkZSBhbGxvd3MgdXMgdG8gc2NhbGUgdGhlCi07IDY0LWJpdCBkaWZmZXJlbmNlIHVzaW5nIHNpbXBsZSBzaGlmdHMsIGFuZCB0aGVuIHRoZSBkaXZpZGUgYnJpbmdzIHRoZQotOyBmaW5hbCByZXN1bHQgaW50byB0aGUgcmFuZ2UgdG8gZml0IGludG8gYSAzMi1iaXQgaW50ZWdlci4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX2NhbGNNaWNyb1NlYwotCi0gICAgICAgIEFSRyAgICAgY291bnQ6RFBUUiwgZnJlcTpVTE9ORwotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIGVjeCxbY291bnRdCi0gICAgICAgIG1vdiAgICAgZWF4LFtlY3hdICAgICAgIDsgRUFYIDo9IGxvdyBwYXJ0Ci0gICAgICAgIG1vdiAgICAgZWR4LFtlY3grNF0gICAgIDsgRURYIDo9IGhpZ2ggcGFydAotICAgICAgICBzaGxkICAgIGVkeCxlYXgsMjAKLSAgICAgICAgc2hsICAgICBlYXgsMjAgICAgICAgICAgOyBkaWZmICogMHgxMDAwMDAKLSAgICAgICAgZGl2ICAgICBbRFdPUkQgZnJlcV0gICAgOyAoZGlmZiAqIDB4MTAwMDAwKSAvIGZyZXEKLSAgICAgICAgbW92ICAgICBlY3gsMTAwMDAwMAotICAgICAgICB4b3IgICAgIGVkeCxlZHgKLSAgICAgICAgbXVsICAgICBlY3ggICAgICAgICAgICAgOyAoKGRpZmYgKiAweDEwMDAwMCkgLyBmcmVxKSAqIDEwMDAwMDApCi0gICAgICAgIHNocmQgICAgZWF4LGVkeCwyMCAgICAgIDsgKChkaWZmICogMHgxMDAwMDApIC8gZnJlcSkgKiAxMDAwMDAwKSAvIDB4MTAwMDAwCi1pZm5kZWYgZmxhdG1vZGVsCi0gICAgICAgIHNobGQgICAgZWR4LGVheCwxNiAgICAgIDsgUmV0dXJuIGluIERYOkFYCi1lbmRpZgotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bG9uZyBfQ1BVX211bERpdih1bG9uZyBhLHVsb25nIGIsdWxvbmcgYyk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDb21wdXRlcyB0aGUgZm9sbG93aW5nIHdpdGggNjQtYml0IGludGVnZXIgcHJlY2lzaW9uOgotOwotOyAgIHJlc3VsdCA9IChhICogYikgLyBjCi07Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0NQVV9tdWxEaXYKLQotICAgICAgICBBUkcgICAgIGE6VUxPTkcsIGI6VUxPTkcsIGM6VUxPTkcKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgZWF4LFthXQotICAgICAgICBpbXVsICAgIFtVTE9ORyBiXQotICAgICAgICBpZGl2ICAgIFtVTE9ORyBjXQotaWZuZGVmIGZsYXRtb2RlbAotICAgICAgICBzaGxkICAgIGVkeCxlYXgsMTYgICAgICA7IFJldHVybiBpbiBEWDpBWAotZW5kaWYKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotZW5kY29kZXNlZyAgX2NwdWluZm8KLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fZG1hLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fZG1hLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2ZTFlOC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX2RtYS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogMTYvMzIgYml0IFJpbmcgMCBkZXZpY2UgZHJpdmVyCi07KgotOyogRGVzY3JpcHRpb246IEFzc2VtYmxlciBzdXBwb3J0IHJvdXRpbmVzIGZvciBJU0EgRE1BIGNvbnRyb2xsZXIuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1oZWFkZXIgICAgICBfZG1hICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1iZWdkYXRhc2VnICBfZG1hICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgZGF0YSBzZWdtZW50Ci0KLWNwdWJsaWMgX1BNX0RNQURhdGFTdGFydAotCi07IERNQSByZWdpc3RlciBJL08gYWRkcmVzc2VzIGZvciBjaGFubmVscyAwLTcgKGV4Y2VwdCA0KQotCi1ETUFDX3BhZ2UgICAgICAgZGIgMDg3aCwwODNoLDA4MWgsMDgyaCwgLTEsMDhCaCwwODloLDA4QWgKLURNQUNfYWRkciAgICAgICBkYiAwMDBoLDAwMmgsMDA0aCwwMDZoLCAtMSwwQzRoLDBDOGgsMENDaAotRE1BQ19jbnQgICAgICAgIGRiIDAwMWgsMDAzaCwwMDVoLDAwN2gsIC0xLDBDNmgsMENBaCwwQ0VoCi1ETUFDX21hc2sgICAgICAgZGIgMDBBaCwwMEFoLDAwQWgsMDBBaCwgLTEsMEQ0aCwwRDRoLDBENGgKLURNQUNfbW9kZSAgICAgICBkYiAwMEJoLDAwQmgsMDBCaCwwMEJoLCAtMSwwRDZoLDBENmgsMEQ2aAotRE1BQ19GRiAgICAgICAgIGRiIDAwQ2gsMDBDaCwwMENoLDAwQ2gsIC0xLDBEOGgsMEQ4aCwwRDhoCi0KLWNwdWJsaWMgX1BNX0RNQURhdGFFbmQKLQotZW5kZGF0YXNlZyAgX2RtYQotCi1iZWdjb2Rlc2VnICBfZG1hICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLWlmZGVmICAgZmxhdG1vZGVsCi0KLWNwdWJsaWMgX1BNX0RNQUNvZGVTdGFydAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX0RNQUNEaXNhYmxlKGludCBjaGFubmVsKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1hc2tzIERNQSBjaGFubmVsLCBpbmhpYml0aW5nIERNQSB0cmFuc2ZlcnMKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9ETUFDRGlzYWJsZQotCi0gICAgICAgIEFSRyAgICAgY2hhbm5lbDpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBlYnAKLSAgICAgICAgbW92ICAgICBlYnAsZXNwCi0gICAgICAgIG1vdiAgICAgZWN4LFtjaGFubmVsXSAgICAgICA7IEVDWCBpbmRleGVzIERNQUMgcmVnaXN0ZXIgdGFibGVzCi0gICAgICAgIG1vdiAgICAgZGgsMCAgICAgICAgICAgICAgICA7IERIID0gMCBmb3IgRE1BQyByZWdpc3RlciBwb3J0IGFjY2VzcwotICAgICAgICBtb3YgICAgIGFsLGNsCi0gICAgICAgIGFuZCAgICAgYWwsMTFiCi0gICAgICAgIG9yICAgICAgYWwsMTAwYiAgICAgICAgICAgICA7IEFMID0gKGNoYW5uZWwgJiAzKSB8ICJzZXQgbWFzayBiaXQiCi0gICAgICAgIG1vdiAgICAgZGwsW0RNQUNfbWFzaytlY3hdCi0gICAgICAgIG91dCAgICAgZHgsYWwKLSAgICAgICAgcG9wICAgICBlYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fRE1BQ0VuYWJsZShpbnQgY2hhbm5lbCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBVbm1hc2tzIERNQSBjaGFubmVsLCBlbmFibGluZyBETUEgdHJhbnNmZXJzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fRE1BQ0VuYWJsZQotCi0gICAgICAgIEFSRyAgICAgY2hhbm5lbDpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBlYnAKLSAgICAgICAgbW92ICAgICBlYnAsZXNwCi0gICAgICAgIG1vdiAgICAgZWN4LFtjaGFubmVsXSAgICAgICA7IEVDWCBpbmRleGVzIERNQUMgcmVnaXN0ZXIgdGFibGVzCi0gICAgICAgIG1vdiAgICAgZGgsMCAgICAgICAgICAgICAgICA7IERIID0gMCBmb3IgRE1BQyByZWdpc3RlciBwb3J0IGFjY2VzcwotICAgICAgICBtb3YgICAgIGFsLGNsCi0gICAgICAgIGFuZCAgICAgYWwsMTFiICAgICAgICAgICAgICA7IEFMID0gKGNoYW5uZWwgJiAzKSwgInNldCBtYXNrIGJpdCI9MAotICAgICAgICBtb3YgICAgIGRsLFtETUFDX21hc2srZWN4XQotICAgICAgICBvdXQgICAgIGR4LGFsCi0gICAgICAgIHBvcCAgICAgZWJwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX0RNQUNQcm9ncmFtKGludCBjaGFubmVsLGludCBtb2RlLHVsb25nIGJ1ZmZlclBoeXMsaW50IGNvdW50KTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFB1cnBvc2U6IFByb2dyYW0gRE1BIGNvbnRyb2xsZXIgdG8gcGVyZm9ybSB0cmFuc2ZlciBmcm9tIGZpcnN0IDE2TUIKLTsgYmFzZWQgb24gcHJldmlvdXNseSBzZWxlY3RlZCBtb2RlIGFuZCBjaGFubmVsLiBETUEgdHJhbnNmZXIgbWF5IGJlIGVuYWJsZWQKLTsgYnkgc3Vic2VxdWVudCBjYWxsIHRvIFBNX0RNQUNFbmFibGUuCi07Ci07IEVudHJ5OiAgICBjaGFubmVsIC0gRE1BIGNoYW5uZWwgaW4gdXNlICgwLTcpCi07ICAgICAgICAgICBtb2RlICAgIC0gU2VsZWN0ZWQgRE1BTU9ERSB0eXBlIGZvciB0cmFuc2ZlcgotOyAgICAgICAgICAgYnVmZmVyICAtIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIERNQSBidWZmZXIKLTsgICAgICAgICAgIGNvdW50ICAgLSBETUEgYnl0ZSBjb3VudCAoMS02NTUzNiBieXRlcykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9ETUFDUHJvZ3JhbQotCi0gICAgICAgIEFSRyAgICAgY2hhbm5lbDpVSU5ULCBtb2RlOlVJTlQsIGJ1ZmZlclBoeXM6VUxPTkcsIGNvdW50OlVJTlQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2hmZAotICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBEaXNhYmxlIGludGVycnVwdHMKLQotOyBNYXNrIERNQSBjaGFubmVsIHRvIGRpc2FibGUgaXQKLQotICAgICAgICBtb3YgICAgIGVieCxbY2hhbm5lbF0gICAgICAgOyBFQlggaW5kZXhlcyBETUFDIHJlZ2lzdGVyIHRhYmxlcwotICAgICAgICBtb3YgICAgIGRoLDAgICAgICAgICAgICAgICAgOyBESCA9IDAgZm9yIERNQUMgcmVnaXN0ZXIgcG9ydCBhY2Nlc3MKLSAgICAgICAgbW92ICAgICBhbCxibAotICAgICAgICBhbmQgICAgIGFsLDExYgotICAgICAgICBvciAgICAgIGFsLDEwMGIgICAgICAgICAgICAgOyBBTCA9IChjaGFubmVsICYgMykgfCAic2V0IG1hc2sgYml0IgotICAgICAgICBtb3YgICAgIGRsLFtETUFDX21hc2srZWJ4XQotICAgICAgICBvdXQgICAgIGR4LGFsCi0KLTsgR2VuZXJhdGUgSU9XIHRvIGNsZWFyIEZGIHRvZ2dsZSBzdGF0ZQotCi0gICAgICAgIG1vdiAgICAgYWwsMAotICAgICAgICBtb3YgICAgIGRsLFtETUFDX0ZGK2VieF0KLSAgICAgICAgb3V0ICAgICBkeCxhbAotCi07IENvbXB1dGUgYnVmZmVyIGFkZHJlc3MgdG8gcHJvZ3JhbQotCi0gICAgICAgIG1vdiAgICAgZWF4LFtidWZmZXJQaHlzXSAgICA7IEFYIDo9IERNQSBhZGRyZXNzIG9mZnNldAotICAgICAgICBtb3YgICAgIGVjeCxlYXgKLSAgICAgICAgc2hyICAgICBlY3gsMTYgICAgICAgICAgICAgIDsgQ0wgOj0gYnVmZmVyUGh5cyA+PiAxNiAoRE1BIHBhZ2UpCi0gICAgICAgIG1vdiAgICAgZXNpLFtjb3VudF0gICAgICAgICA7IEVTSSA9ICMgb2YgYnl0ZXMgdG8gdHJhbnNmZXIKLSAgICAgICAgY21wICAgICBlYngsNCAgICAgICAgICAgICAgIDsgMTYtYml0IGNoYW5uZWw/Ci0gICAgICAgIGpiICAgICAgQEBXcml0ZURNQUMgICAgICAgICA7IE5vLCBwcm9ncmFtIERNQUMKLSAgICAgICAgc2hyICAgICBlYXgsMSAgICAgICAgICAgICAgIDsgWWVzLCBjb252ZXJ0IGFkZHJlc3MgYW5kIGNvdW50Ci0gICAgICAgIHNociAgICAgZXNpLDEgICAgICAgICAgICAgICA7IHRvIDE2LWJpdCwgMTI4Sy9wYWdlIGZvcm1hdAotCi07IFNldCB0aGUgRE1BIGFkZHJlc3Mgd29yZCAoYml0cyAwLTE1KQotCi1AQFdyaXRlRE1BQzoKLSAgICAgICAgbW92ICAgICBkbCxbRE1BQ19hZGRyK2VieF0KLSAgICAgICAgb3V0ICAgICBkeCxhbAotICAgICAgICBtb3YgICAgIGFsLGFoCi0gICAgICAgIG91dCAgICAgZHgsYWwKLQotOyBTZXQgRE1BIHRyYW5zZmVyIGNvdW50Ci0KLSAgICAgICAgbW92ICAgICBlYXgsZXNpCi0gICAgICAgIGRlYyAgICAgZWF4ICAgICAgICAgICAgICAgICA7IEVTSSA9ICMgb2YgYnl0ZXMgdG8gdHJhbnNmZXIgLSAxCi0gICAgICAgIG1vdiAgICAgZGwsW0RNQUNfY250K2VieF0KLSAgICAgICAgb3V0ICAgICBkeCxhbAotICAgICAgICBtb3YgICAgIGFsLGFoCi0gICAgICAgIG91dCAgICAgZHgsYWwKLQotOyBTZXQgRE1BIHBhZ2UgYnl0ZSAoYml0cyAxNi0yMykKLQotICAgICAgICBtb3YgICAgIGFsLGNsCi0gICAgICAgIG1vdiAgICAgZGwsW0RNQUNfcGFnZStlYnhdCi0gICAgICAgIG91dCAgICAgZHgsYWwKLQotOyBTZXQgdGhlIERNQSBjaGFubmVsIG1vZGUKLQotICAgICAgICBtb3YgICAgIGFsLGJsCi0gICAgICAgIGFuZCAgICAgYWwsMTFiCi0gICAgICAgIG9yICAgICAgYWwsW0JZVEUgbW9kZV0gICAgICA7IEVBWCA9IChjaGFubmVsICYgMykgfCBtb2RlCi0gICAgICAgIG1vdiAgICAgZGwsW0RNQUNfbW9kZStlYnhdCi0gICAgICAgIG91dCAgICAgZHgsYWwKLQotICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBTTVAgc2FmZSBpbnRlcnJ1cHQgc3RhdGUgcmVzdG9yZSEKLSAgICAgICAgdGVzdCAgICBlYXgsMjAwaAotICAgICAgICBqeiAgICAgIEBAMQotICAgICAgICBzdGkKLUBAMTogICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWxvbmcgUE1BUEkgUE1fRE1BQ1Bvc2l0aW9uKGludCBjaGFubmVsKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybnMgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gYSBkbWEgdHJhbnNmZXIuIEludGVycnVwdHMgc2hvdWxkIGJlCi07IGRpc2FibGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fRE1BQ1Bvc2l0aW9uCi0KLSAgICAgICAgQVJHICAgICBjaGFubmVsOlVJTlQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgZWN4LFtjaGFubmVsXSAgICAgICA7IEVDWCBpbmRleGVzIERNQUMgcmVnaXN0ZXIgdGFibGVzCi0gICAgICAgIG1vdiAgICAgZGgsMCAgICAgICAgICAgICAgICA7IERIID0gMCBmb3IgRE1BQyByZWdpc3RlciBwb3J0IGFjY2VzcwotCi07IEdlbmVyYXRlIElPVyB0byBjbGVhciBGRiB0b2dnbGUgc3RhdGUKLQotICAgICAgICBtb3YgICAgIGFsLDAKLSAgICAgICAgbW92ICAgICBkbCxbRE1BQ19GRitlYnhdCi0gICAgICAgIG91dCAgICAgZHgsYWwKLSAgICAgICAgeG9yICAgICBlYXgsZWF4Ci0gICAgICAgIHhvciAgICAgZWN4LGVjeAotCi07IE5vdyByZWFkIHRoZSBjdXJyZW50IHBvc2l0aW9uIGZvciB0aGUgY2hhbm5lbAotCi1AQFJlYWRMb29wOgotICAgICAgICBtb3YgICAgIGRsLFtETUFDX2NudCtlYnhdCi0gICAgICAgIG91dCAgICAgZHgsYWwKLSAgICAgICAgaW4gICAgICBhbCxkeAotICAgICAgICBtb3YgICAgIGNsLGFsCi0gICAgICAgIGluICAgICAgYWwsZHgKLSAgICAgICAgbW92ICAgICBjaCxhbCAgICAgICAgICAgICAgIDsgRUNYIDo9IGZpcnN0IGNvdW50IHJlYWQKLSAgICAgICAgaW4gICAgICBhbCxkeAotICAgICAgICBtb3YgICAgIGFoLGFsCi0gICAgICAgIGluICAgICAgYWwsZHgKLSAgICAgICAgeGNoZyAgICBhbCxhaCAgICAgICAgICAgICAgIDsgRUFYIDo9IHNlY29uZCBjb3VudCByZWFkCi0gICAgICAgIHN1YiAgICAgZWN4LGVheAotICAgICAgICBjbXAgICAgIGVjeCw0MGgKLSAgICAgICAgamcgICAgICBAQFJlYWRMb29wCi0gICAgICAgIGNtcCAgICAgZWJ4LDQgICAgICAgICAgICAgICA7IDE2LWJpdCBjaGFubmVsPwotICAgICAgICBqYiAgICAgIEBARXhpdCAgICAgICAgICAgICAgOyBObywgd2UgYXJlIGRvbmUKLSAgICAgICAgc2hsICAgICBlYXgsMSAgICAgICAgICAgICAgIDsgWWVzLCBhZGp1c3QgdG8gYnl0ZSBhZGRyZXNzCi0KLUBARXhpdDogbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotCi1jcHVibGljIF9QTV9ETUFDb2RlRW5kCi0KLWVuZGlmCi0KLWVuZGNvZGVzZWcgIF9kbWEKLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9faW50NjQuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19pbnQ2NC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZWMxYjUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19pbnQ2NC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgTkFTTSBvciBUQVNNIEFzc2VtYmxlcgotOyogRW52aXJvbm1lbnQ6IEludGVsIDMyIGJpdCBQcm90ZWN0ZWQgTW9kZS4KLTsqCi07KiBEZXNjcmlwdGlvbjogQ29kZSBmb3IgNjQtYml0IGFyaGl0aG1ldGljCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIKLQotaGVhZGVyICAgICAgX2ludDY0Ci0KLWJlZ2NvZGVzZWcgIF9pbnQ2NCAgICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLWFfbG93ICAgICAgIEVRVSAwNGggICAgICAgICAgICAgICAgIDsgQWNjZXNzIGFfbG93IGRpcmVjdGx5IG9uIHN0YWNrCi1hX2hpZ2ggICAgICBFUVUgMDhoICAgICAgICAgICAgICAgICA7IEFjY2VzcyBhX2hpZ2ggZGlyZWN0bHkgb24gc3RhY2sKLWJfbG93ICAgICAgIEVRVSAwQ2ggICAgICAgICAgICAgICAgIDsgQWNjZXNzIGJfbG93IGRpcmVjdGx5IG9uIHN0YWNrCi1zaGlmdCAgICAgICBFUVUgMENoICAgICAgICAgICAgICAgICA7IEFjY2VzcyBzaGlmdCBkaXJlY3RseSBvbiBzdGFjawotcmVzdWx0XzIgICAgRVFVIDBDaCAgICAgICAgICAgICAgICAgOyBBY2Nlc3MgcmVzdWx0IGRpcmVjdGx5IG9uIHN0YWNrCi1iX2hpZ2ggICAgICBFUVUgMTBoICAgICAgICAgICAgICAgICA7IEFjY2VzcyBiX2hpZ2ggZGlyZWN0bHkgb24gc3RhY2sKLXJlc3VsdF8zICAgIEVRVSAxMGggICAgICAgICAgICAgICAgIDsgQWNjZXNzIHJlc3VsdCBkaXJlY3RseSBvbiBzdGFjawotcmVzdWx0XzQgICAgRVFVIDE0aCAgICAgICAgICAgICAgICAgOyBBY2Nlc3MgcmVzdWx0IGRpcmVjdGx5IG9uIHN0YWNrCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX1BNX2FkZDY0KHUzMiBhX2xvdyx1MzIgYV9oaWdoLHUzMiBiX2xvdyx1MzIgYl9oaWdoLF9fdTY0ICpyZXN1bHQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQWRkcyB0d28gNjQtYml0IG51bWJlcnMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX2FkZDY0Ci0KLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvd10KLSAgICAgICAgYWRkICAgICBlYXgsW2VzcCtiX2xvd10KLSAgICAgICAgbW92ICAgICBlZHgsW2VzcCthX2hpZ2hdCi0gICAgICAgIGFkYyAgICAgZWR4LFtlc3ArYl9oaWdoXQotICAgICAgICBtb3YgICAgIGVjeCxbZXNwK3Jlc3VsdF80XQotICAgICAgICBtb3YgICAgIFtlY3hdLGVheAotICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9QTV9zdWI2NCh1MzIgYV9sb3csdTMyIGFfaGlnaCx1MzIgYl9sb3csdTMyIGJfaGlnaCxfX3U2NCAqcmVzdWx0KTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFN1YnRyYWN0cyB0d28gNjQtYml0IG51bWJlcnMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3N1YjY0Ci0KLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvd10KLSAgICAgICAgc3ViICAgICBlYXgsW2VzcCtiX2xvd10KLSAgICAgICAgbW92ICAgICBlZHgsW2VzcCthX2hpZ2hdCi0gICAgICAgIHNiYiAgICAgZWR4LFtlc3ArYl9oaWdoXQotICAgICAgICBtb3YgICAgIGVjeCxbZXNwK3Jlc3VsdF80XQotICAgICAgICBtb3YgICAgIFtlY3hdLGVheAotICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9QTV9tdWw2NCh1MzIgYV9oaWdoLHUzMiBhX2xvdyx1MzIgYl9oaWdoLHUzMiBiX2xvdyxfX3U2NCAqcmVzdWx0KTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE11bHRpcGxlcyB0d28gNjQtYml0IG51bWJlcnMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX211bDY0Ci0KLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2hpZ2hdCi0gICAgICAgIG1vdiAgICAgZWN4LFtlc3ArYl9oaWdoXQotICAgICAgICBvciAgICAgIGVjeCxlYXgKLSAgICAgICAgbW92ICAgICBlY3gsW2VzcCtiX2xvd10KLSAgICAgICAgam56ICAgICBAQEZ1bGxNdWx0aXBseQotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XSAgICAgICAgIDsgRURYOkVBWCA9IGIubG93ICogYS5sb3cKLSAgICAgICAgbXVsICAgICBlY3gKLSAgICAgICAgbW92ICAgICBlY3gsW2VzcCtyZXN1bHRfNF0KLSAgICAgICAgbW92ICAgICBbZWN4XSxlYXgKLSAgICAgICAgbW92ICAgICBbZWN4KzRdLGVkeAotICAgICAgICByZXQKLQotQEBGdWxsTXVsdGlwbHk6Ci0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIG11bCAgICAgZWN4ICAgICAgICAgICAgICAgICAgICAgOyBFRFg6RUFYID0gYS5oaWdoICogYi5sb3cKLSAgICAgICAgbW92ICAgICBlYngsZWF4Ci0gICAgICAgIG1vdiAgICAgZWF4LFtlc3ArYV9sb3crNF0KLSAgICAgICAgbXVsICAgICBbRFdPUkQgZXNwK2JfaGlnaCs0XSAgICA7IEVEWDpFQVggPSBiLmhpZ2ggKiBhLmxvdwotICAgICAgICBhZGQgICAgIGVieCxlYXgKLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvdys0XQotICAgICAgICBtdWwgICAgIGVjeCAgICAgICAgICAgICAgICAgICAgIDsgRURYOkVBWCA9IGEubG93ICogYi5sb3cKLSAgICAgICAgYWRkICAgICBlZHgsZWJ4Ci0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIG1vdiAgICAgZWN4LFtlc3ArcmVzdWx0XzRdCi0gICAgICAgIG1vdiAgICAgW2VjeF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VjeCs0XSxlZHgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX1BNX2RpdjY0KHUzMiBhX2xvdyx1MzIgYV9oaWdoLHUzMiBiX2xvdyx1MzIgYl9oaWdoLF9fdTY0ICpyZXN1bHQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRGl2aWRlcyB0d28gNjQtYml0IG51bWJlcnMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX2RpdjY0Ci0KLSAgICAgICAgcHVzaCAgICBlZGkKLSAgICAgICAgcHVzaCAgICBlc2kKLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgeG9yICAgICBlZGksZWRpCi0gICAgICAgIG1vdiAgICAgZWF4LFtlc3ArYV9oaWdoKzBDaF0KLSAgICAgICAgb3IgICAgICBlYXgsZWF4Ci0gICAgICAgIGpucyAgICAgQEBBTm90TmVnCi0KLTsgRGl2aWRlbmQgaXMgbmVnYXRpdmUsIHNvIG5lZ2F0ZSBpdCBhbmQgc2F2ZSByZXN1bHQgZm9yIGxhdGVyCi0KLSAgICAgICAgaW5jICAgICBlZGkKLSAgICAgICAgbW92ICAgICBlZHgsW2VzcCthX2xvdyswQ2hdCi0gICAgICAgIG5lZyAgICAgZWF4Ci0gICAgICAgIG5lZyAgICAgZWR4Ci0gICAgICAgIHNiYiAgICAgZWF4LDAKLSAgICAgICAgbW92ICAgICBbZXNwK2FfaGlnaCswQ2hdLGVheAotICAgICAgICBtb3YgICAgIFtlc3ArYV9sb3crMENoXSxlZHgKLQotQEBBTm90TmVnOgotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2JfaGlnaCswQ2hdCi0gICAgICAgIG9yICAgICAgZWF4LGVheAotICAgICAgICBqbnMgICAgIEBAQk5vdE5lZwotCi07IERpdmlzb3IgaXMgbmVnYXRpdmUsIHNvIG5lZ2F0ZSBpdCBhbmQgc2F2ZSByZXN1bHQgZm9yIGxhdGVyCi0KLSAgICAgICAgaW5jICAgICBlZGkKLSAgICAgICAgbW92ICAgICBlZHgsW2VzcCtiX2xvdyswQ2hdCi0gICAgICAgIG5lZyAgICAgZWF4Ci0gICAgICAgIG5lZyAgICAgZWR4Ci0gICAgICAgIHNiYiAgICAgZWF4LDAKLSAgICAgICAgbW92ICAgICBbZXNwK2JfaGlnaCswQ2hdLGVheAotICAgICAgICBtb3YgICAgIFtlc3ArYl9sb3crMENoXSxlZHgKLQotQEBCTm90TmVnOgotICAgICAgICBvciAgICAgIGVheCxlYXgKLSAgICAgICAgam56ICAgICBAQEJIaWdoTm90WmVybwotCi07IGIuaGlnaCBpcyB6ZXJvLCBzbyBoYW5kbGUgdGhpcyBmYXN0ZXIKLQotICAgICAgICBtb3YgICAgIGVjeCxbZXNwK2JfbG93KzBDaF0KLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2hpZ2grMENoXQotICAgICAgICB4b3IgICAgIGVkeCxlZHgKLSAgICAgICAgZGl2ICAgICBlY3gKLSAgICAgICAgbW92ICAgICBlYngsZWF4Ci0gICAgICAgIG1vdiAgICAgZWF4LFtlc3ArYV9sb3crMENoXQotICAgICAgICBkaXYgICAgIGVjeAotICAgICAgICBtb3YgICAgIGVkeCxlYngKLSAgICAgICAgam1wICAgICBAQEJIaWdoWmVybwotCi1AQEJIaWdoTm90WmVybzoKLSAgICAgICAgbW92ICAgICBlYngsZWF4Ci0gICAgICAgIG1vdiAgICAgZWN4LFtlc3ArYl9sb3crMENoXQotICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaCswQ2hdCi0gICAgICAgIG1vdiAgICAgZWF4LFtlc3ArYV9sb3crMENoXQotCi07IFNoaWZ0IHZhbHVlcyByaWdodCB1bnRpbCBiLmhpZ2ggYmVjb21lcyB6ZXJvCi0KLUBAU2hpZnRMb29wOgotICAgICAgICBzaHIgICAgIGVieCwxCi0gICAgICAgIHJjciAgICAgZWN4LDEKLSAgICAgICAgc2hyICAgICBlZHgsMQotICAgICAgICByY3IgICAgIGVheCwxCi0gICAgICAgIG9yICAgICAgZWJ4LGVieAotICAgICAgICBqbnogICAgIEBAU2hpZnRMb29wCi0KLTsgTm93IGNvbXBsZXRlIHRoZSBkaXZpZGUgcHJvY2VzcwotCi0gICAgICAgIGRpdiAgICAgZWN4Ci0gICAgICAgIG1vdiAgICAgZXNpLGVheAotICAgICAgICBtdWwgICAgIFtEV09SRCBlc3ArYl9oaWdoKzBDaF0KLSAgICAgICAgbW92ICAgICBlY3gsZWF4Ci0gICAgICAgIG1vdiAgICAgZWF4LFtlc3ArYl9sb3crMENoXQotICAgICAgICBtdWwgICAgIGVzaQotICAgICAgICBhZGQgICAgIGVkeCxlY3gKLSAgICAgICAgamIgICAgICBAQDgKLSAgICAgICAgY21wICAgICBlZHgsW2VzcCthX2hpZ2grMENoXQotICAgICAgICBqYSAgICAgIEBAOAotICAgICAgICBqYiAgICAgIEBAOQotICAgICAgICBjbXAgICAgIGVheCxbZXNwK2FfbG93KzBDaF0KLSAgICAgICAgamJlICAgICBAQDkKLUBAODogICAgZGVjICAgICBlc2kKLUBAOTogICAgeG9yICAgICBlZHgsZWR4Ci0gICAgICAgIG1vdiAgICAgZWF4LGVzaQotCi1AQEJIaWdoWmVybzoKLSAgICAgICAgZGVjICAgICBlZGkKLSAgICAgICAgam56ICAgICBAQERvbmUKLQotOyBUaGUgcmVzdWx0IG5lZWRzIHRvIGJlIG5lZ2F0ZWQgYXMgZWl0aGVyIGEgb3IgYiB3YXMgbmVnYXRpdmUKLQotICAgICAgICBuZWcgICAgIGVkeAotICAgICAgICBuZWcgICAgIGVheAotICAgICAgICBzYmIgICAgIGVkeCwwCi0KLUBARG9uZTogcG9wICAgICBlYngKLSAgICAgICAgcG9wICAgICBlc2kKLSAgICAgICAgcG9wICAgICBlZGkKLSAgICAgICAgbW92ICAgICBlY3gsW2VzcCtyZXN1bHRfNF0KLSAgICAgICAgbW92ICAgICBbZWN4XSxlYXgKLSAgICAgICAgbW92ICAgICBbZWN4KzRdLGVkeAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgX19pNjQgX1BNX3NocjY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLHMzMiBzaGlmdCxfX3U2NCAqcmVzdWx0KTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFNoaWZ0IGEgNjQtYml0IG51bWJlciByaWdodAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9zaHI2NAotCi0gICAgICAgIG1vdiAgICAgZWF4LFtlc3ArYV9sb3ddCi0gICAgICAgIG1vdiAgICAgZWR4LFtlc3ArYV9oaWdoXQotICAgICAgICBtb3YgICAgIGNsLFtlc3Arc2hpZnRdCi0gICAgICAgIHNocmQgICAgZWR4LGVheCxjbAotICAgICAgICBtb3YgICAgIGVjeCxbZXNwK3Jlc3VsdF8zXQotICAgICAgICBtb3YgICAgIFtlY3hdLGVheAotICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBfX2k2NCBfUE1fc2FyNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9fdTY0ICpyZXN1bHQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2hpZnQgYSA2NC1iaXQgbnVtYmVyIHJpZ2h0IChzaWduZWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3NhcjY0Ci0KLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvd10KLSAgICAgICAgbW92ICAgICBlZHgsW2VzcCthX2hpZ2hdCi0gICAgICAgIG1vdiAgICAgY2wsW2VzcCtzaGlmdF0KLSAgICAgICAgc2FyICAgICBlZHgsY2wKLSAgICAgICAgcmNyICAgICBlYXgsY2wKLSAgICAgICAgbW92ICAgICBlY3gsW2VzcCtyZXN1bHRfM10KLSAgICAgICAgbW92ICAgICBbZWN4XSxlYXgKLSAgICAgICAgbW92ICAgICBbZWN4KzRdLGVkeAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgX19pNjQgX1BNX3NobDY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLHMzMiBzaGlmdCxfX3U2NCAqcmVzdWx0KTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFNoaWZ0IGEgNjQtYml0IG51bWJlciBsZWZ0Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3NobDY0Ci0KLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvd10KLSAgICAgICAgbW92ICAgICBlZHgsW2VzcCthX2hpZ2hdCi0gICAgICAgIG1vdiAgICAgY2wsW2VzcCtzaGlmdF0KLSAgICAgICAgc2hsZCAgICBlZHgsZWF4LGNsCi0gICAgICAgIG1vdiAgICAgZWN4LFtlc3ArcmVzdWx0XzNdCi0gICAgICAgIG1vdiAgICAgW2VjeF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VjeCs0XSxlZHgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IF9faTY0IF9QTV9uZWc2NCh1MzIgYV9sb3csczMyIGFfaGlnaCxfX3U2NCAqcmVzdWx0KTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFNoaWZ0IGEgNjQtYml0IG51bWJlciBsZWZ0Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX25lZzY0Ci0KLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvd10KLSAgICAgICAgbW92ICAgICBlZHgsW2VzcCthX2hpZ2hdCi0gICAgICAgIG5lZyAgICAgZWF4Ci0gICAgICAgIG5lZyAgICAgZWR4Ci0gICAgICAgIHNiYiAgICAgZWF4LDAKLSAgICAgICAgbW92ICAgICBlY3gsW2VzcCtyZXN1bHRfMl0KLSAgICAgICAgbW92ICAgICBbZWN4XSxlYXgKLSAgICAgICAgbW92ICAgICBbZWN4KzRdLGVkeAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotCi1lbmRjb2Rlc2VnICBfaW50NjQKLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fam95LmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fam95LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmMWVjZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX2pveS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyCi07KiBFbnZpcm9ubWVudDogSW50ZWwgeDg2LCBhbnkgT1MKLTsqCi07KiBEZXNjcmlwdGlvbjogQXNzZW1ibHkgbGFuZ3VhZ2Ugc3VwcG9ydCByb3V0aW5lcyBmb3IgcmVhZGluZyBhbmFsb2d1ZQotOyogICAgICAgICAgICAgIGpveXN0aWNrcy4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIGlkZWFsCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWlmZGVmIGZsYXRtb2RlbAotCi1oZWFkZXIgIF9qb3kgICAgICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1iZWdjb2Rlc2VnICBfam95ICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGluaXRUaW1lcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2V0cyB1cCA4MjUzIHRpbWVyIDIgKFBDIHNwZWFrZXIpIHRvIHN0YXJ0IHRpbWluZywgYnV0IG5vdCBwcm9kdWNlIG91dHB1dC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXRpYyBpbml0VGltZXIKLQotOyBTdGFydCB0aW1lciAyIGNvdW50aW5nCi0KLSAgICAgICAgaW4gICAgICBhbCw2MWgKLSAgICAgICAgYW5kICAgICBhbCwwRkRoICAgICAgICAgICAgIDsgRGlzYWJsZSBzcGVha2VyIG91dHB1dCAoanVzdCBpbiBjYXNlKQotICAgICAgICBvciAgICAgIGFsLDEKLSAgICAgICAgb3V0ICAgICA2MWgsYWwKLQotOyBTZXQgdGhlIHRpbWVyIDIgY291bnQgdG8gMCBhZ2FpbiB0byBzdGFydCB0aGUgdGltaW5nIGludGVydmFsLgotCi0gICAgICAgIG1vdiAgICAgYWwsMTAxMTAxMDBiICAgICAgICA7IHNldCB1cCB0byBsb2FkIGluaXRpYWwgKHRpbWVyIDIpCi0gICAgICAgIG91dCAgICAgNDNoLGFsICAgICAgICAgICAgICA7IHRpbWVyIGNvdW50Ci0gICAgICAgIHN1YiAgICAgYWwsYWwKLSAgICAgICAgb3V0ICAgICA0MmgsYWwgICAgICAgICAgICAgIDsgbG9hZCBjb3VudCBsc2IKLSAgICAgICAgb3V0ICAgICA0MmgsYWwgICAgICAgICAgICAgIDsgbG9hZCBjb3VudCBtc2IKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHJlYWRUaW1lcjIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWRzIHRoZSBudW1iZXIgb2YgdGlja3MgZnJvbSB0aGUgODI1MyB0aW1lciBjaGlwIHVzaW5nIGNoYW5uZWwgMiAoUEMKLTsgc3BlYWtlcikuIFRoaXMgaXMgbm9uLWRlc3RydWN0aXZlIGFuZCBkb2VzIG5vdCBzY3JldyB1cCBvdGhlciBsaWJyYXJpZXMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGF0aWMgcmVhZFRpbWVyCi0KLSAgICAgICAgeG9yICAgICBhbCxhbCAgICAgICAgICAgICAgIDsgTGF0Y2ggdGltZXIgMCBjb21tYW5kCi0gICAgICAgIG91dCAgICAgNDNoLGFsICAgICAgICAgICAgICA7IExhdGNoIHRpbWVyCi0gICAgICAgIGluICAgICAgYWwsNDJoICAgICAgICAgICAgICA7IGxlYXN0IHNpZ25pZmljYW50IGJ5dGUKLSAgICAgICAgbW92ICAgICBhaCxhbAotICAgICAgICBpbiAgICAgIGFsLDQyaCAgICAgICAgICAgICAgOyBtb3N0IHNpZ25pZmljYW50IGJ5dGUKLSAgICAgICAgeGNoZyAgICBhaCxhbAotICAgICAgICBhbmQgICAgIGVheCwwRkZGRmgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGV4aXRUaW1lcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU3RvcHMgdGhlIDgyNTMgdGltZXIgMiAoUEMgc3BlYWtlcikgY291bnRpbmcKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXRpYyBleGl0VGltZXIKLQotOyBTdG9wIHRpbWVyIDIgZnJvbSBjb3VudGluZwotCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIGluICAgICAgYWwsNjFoCi0gICAgICAgIGFuZCAgICAgYWwsMEZFaAotICAgICAgICBvdXQgICAgIDYxaCxhbAotICAgICAgICAKLTsgU29tZSBwcm9ncmFtcyBoYXZlIGEgcHJvYmxlbSBpZiB3ZSBjaGFuZ2UgdGhlIGNvbnRyb2wgcG9ydDsgYmV0dGVyIGNoYW5nZSBpdAotOyB0byBzb21ldGhpbmcgdGhleSBleHBlY3QgKG1vZGUgMyAtIHNxdWFyZSB3YXZlIGdlbmVyYXRvcikuLi4KLSAgICAgICAgbW92ICAgICBhbCwwQjZoCi0gICAgICAgIG91dCAgICAgNDNoLGFsCi0gICAgICAgIAotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IF9FVlRfcmVhZEpveUF4aXMoaW50IGptYXNrLGludCAqYXhpcyk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGdW5jdGlvbiB0byBwb2xsIHRoZSBqb3lzdGljayB0byByZWFkIHRoZSBjdXJyZW50IGF4aXMgcG9zaXRpb25zLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9FVlRfcmVhZEpveUF4aXMKLQotICAgICAgICBBUkcgICAgIGptYXNrOlVJTlQsIGF4aXM6RFBUUgotCi0gICAgICAgIExPQ0FMICAgZmlyc3RUaWNrOlVJTlQsIGxhc3RUaWNrOlVJTlQsIHRvdGFsVGlja3M6VUlOVCA9IExvY2FsU2l6ZQotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIGVieCxbam1hc2tdCi0gICAgICAgIG1vdiAgICAgZWRpLFtheGlzXQotICAgICAgICBtb3YgICAgIGVjeCwoMTE5MzE4MC8xMDApCi0gICAgICAgIGFuZCAgICAgZWJ4LDAxMTExYiAgICAgICAgICA7IE1hc2sgb3V0IHN1cHBvcnRlZCBheGVzCi0gICAgICAgIG1vdiAgICAgZHgsMjAxaCAgICAgICAgICAgICA7IERYIDo9IGpveXN0aWNrIEkvTyBwb3J0Ci0gICAgICAgIGNhbGwgICAgaW5pdFRpbWVyICAgICAgICAgICA7IFN0YXJ0IHRpbWVyIDIgY291bnRpbmcKLSAgICAgICAgY2FsbCAgICByZWFkVGltZXIgICAgICAgICAgIDsgUmV0dXJucyBjb3VudGVyIGluIEVBWAotICAgICAgICBtb3YgICAgIFtsYXN0VGlja10sZWF4Ci0KLUBAV2FpdFN0YWJsZToKLSAgICAgICAgaW4gICAgICBhbCxkeAotICAgICAgICBhbmQgICAgIGFsLGJsICAgICAgICAgICAgICAgOyBXYWl0IGZvciB0aGUgYXhlcyBpbiBxdWVzdGlvbiB0byBiZQotICAgICAgICBqeiAgICAgIEBAU3RhYmxlICAgICAgICAgICAgOyAgZG9uZSByZWFkaW5nLi4uCi0gICAgICAgIGNhbGwgICAgcmVhZFRpbWVyICAgICAgICAgICA7IFJldHVybnMgY291bnRlciBpbiBFQVgKLSAgICAgICAgeGNoZyAgICBlYXgsW2xhc3RUaWNrXQotICAgICAgICBjbXAgICAgIGVheCxbbGFzdFRpY2tdCi0gICAgICAgIGpiICAgICAgQEAxCi0gICAgICAgIHN1YiAgICAgZWF4LFtsYXN0VGlja10KLUBAMTogICAgYWRkICAgICBbdG90YWxUaWNrc10sZWF4Ci0gICAgICAgIGNtcCAgICAgW3RvdGFsVGlja3NdLGVjeCAgICA7IENoZWNrIGZvciB0aW1lb3V0Ci0gICAgICAgIGphZSAgICAgQEBTdGFibGUKLSAgICAgICAgam1wICAgICBAQFdhaXRTdGFibGUKLQotQEBTdGFibGU6Ci0gICAgICAgIG1vdiAgICAgYWwsMEZGaAotICAgICAgICBvdXQgICAgIGR4LGFsICAgICAgICAgICAgICAgOyBTdGFydCBqb3lzdGljayByZWFkaW5nCi0gICAgICAgIGNhbGwgICAgaW5pdFRpbWVyICAgICAgICAgICA7IFN0YXJ0IHRpbWVyIDIgY291bnRpbmcKLSAgICAgICAgY2FsbCAgICByZWFkVGltZXIgICAgICAgICAgIDsgUmV0dXJucyBjb3VudGVyIGluIEVBWAotICAgICAgICBtb3YgICAgIFtmaXJzdFRpY2tdLGVheCAgICAgOyBTdG9yZSBpbml0aWFsIGNvdW50Ci0gICAgICAgIG1vdiAgICAgW2xhc3RUaWNrXSxlYXgKLSAgICAgICAgbW92ICAgICBbRFdPUkQgdG90YWxUaWNrc10sMAotICAgICAgICBjbGkKLQotQEBQb2xsTG9vcDoKLSAgICAgICAgaW4gICAgICBhbCxkeCAgICAgICAgICAgICAgIDsgUmVhZCBKb3lzdGljayBwb3J0Ci0gICAgICAgIG5vdCAgICAgYWwKLSAgICAgICAgYW5kICAgICBhbCxibCAgICAgICAgICAgICAgIDsgTWFzayBvZmYgY2hhbm5lbHMgd2UgZG9uJ3Qgd2FudCB0byByZWFkCi0gICAgICAgIGpueiAgICAgQEBBeGlzRmxpcHBlZCAgICAgICA7IFNlZSBpZiBhbnkgb2YgdGhlIGNoYW5uZWxzIGZsaXBwZWQKLSAgICAgICAgY2FsbCAgICByZWFkVGltZXIgICAgICAgICAgIDsgUmV0dXJucyBjb3VudGVyIGluIEVBWAotICAgICAgICB4Y2hnICAgIGVheCxbbGFzdFRpY2tdCi0gICAgICAgIGNtcCAgICAgZWF4LFtsYXN0VGlja10KLSAgICAgICAgamIgICAgICBAQDIKLSAgICAgICAgc3ViICAgICBlYXgsW2xhc3RUaWNrXQotQEAyOiAgICBhZGQgICAgIFt0b3RhbFRpY2tzXSxlYXgKLSAgICAgICAgY21wICAgICBbdG90YWxUaWNrc10sZWN4ICAgIDsgQ2hlY2sgZm9yIHRpbWVvdXQKLSAgICAgICAgamFlICAgICBAQFRpbWVkT3V0Ci0gICAgICAgIGptcCAgICAgQEBQb2xsTG9vcAotCi1AQEF4aXNGbGlwcGVkOgotICAgICAgICB4b3IgICAgIGVzaSxlc2kKLSAgICAgICAgbW92ICAgICBhaCwxCi0gICAgICAgIHRlc3QgICAgYWwsYWgKLSAgICAgICAgam56ICAgICBAQFN0b3JlQ291bnQgICAgICAgIDsgSm95c3RpY2sgMSwgWCBheGlzIGZsaXBwZWQKLSAgICAgICAgYWRkICAgICBlc2ksNAotICAgICAgICBtb3YgICAgIGFoLDIKLSAgICAgICAgdGVzdCAgICBhbCxhaAotICAgICAgICBqbnogICAgIEBAU3RvcmVDb3VudCAgICAgICAgOyBKb3lzdGljayAxLCBZIGF4aXMgZmxpcHBlZAotICAgICAgICBhZGQgICAgIGVzaSw0Ci0gICAgICAgIG1vdiAgICAgYWgsNAotICAgICAgICB0ZXN0ICAgIGFsLGFoCi0gICAgICAgIGpueiAgICAgQEBTdG9yZUNvdW50ICAgICAgICA7IEpveXN0aWNrIDIsIFggYXhpcyBmbGlwcGVkCi0gICAgICAgIGFkZCAgICAgZXNpLDQgICAgICAgICAgICAgICA7IEpveXN0aWNrIDIsIFkgYXhpcyBmbGlwcGVkCi0gICAgICAgIG1vdiAgICAgYWgsOAotCi1AQFN0b3JlQ291bnQ6Ci0gICAgICAgIG9yICAgICAgYmgsYWggICAgICAgICAgICAgICA7IEluZGljYXRlIHRoaXMgYXhpcyBpcyBhY3RpdmUKLSAgICAgICAgeG9yICAgICBibCxhaCAgICAgICAgICAgICAgIDsgVW5tYXJrIHRoZSBjaGFubmVscyB0aGF0IGp1c3QgdHJpcHBlZAotICAgICAgICBjYWxsICAgIHJlYWRUaW1lciAgICAgICAgICAgOyBSZXR1cm5zIGNvdW50ZXIgaW4gRUFYCi0gICAgICAgIHhjaGcgICAgZWF4LFtsYXN0VGlja10KLSAgICAgICAgY21wICAgICBlYXgsW2xhc3RUaWNrXQotICAgICAgICBqYiAgICAgIEBAMwotICAgICAgICBzdWIgICAgIGVheCxbbGFzdFRpY2tdCi1AQDM6ICAgIGFkZCAgICAgW3RvdGFsVGlja3NdLGVheAotICAgICAgICBtb3YgICAgIGVheCxbdG90YWxUaWNrc10KLSAgICAgICAgbW92ICAgICBbZWRpK2VzaV0sZWF4ICAgICAgIDsgUmVjb3JkIHRoZSB0aW1lIHRoaXMgY2hhbm5lbCBmbGlwcGVkCi0gICAgICAgIGNtcCAgICAgYmwsMCAgICAgICAgICAgICAgICA7IElmIHRoZXJlIGFyZSBtb3JlIGNoYW5uZWxzIHRvIHJlYWQsCi0gICAgICAgIGpuZSAgICAgQEBQb2xsTG9vcCAgICAgICAgICA7ICAga2VlcCBsb29waW5nCi0KLUBAVGltZWRPdXQ6Ci0gICAgICAgIHN0aQotICAgICAgICBjYWxsICAgIGV4aXRUaW1lciAgICAgICAgICAgOyBTdG9wIHRpbWVyIDIgY291bnRpbmcKLSAgICAgICAgbW92enggICBlYXgsYmggICAgICAgICAgICAgIDsgUmV0dXJuIHRoZSBtYXNrIG9mIHdvcmtpbmcgYXhlcwotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgX0VWVF9yZWFkSm95QnV0dG9ucyh2b2lkKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZ1bmN0aW9uIHRvIHBvbGwgdGhlIGN1cnJlbnQgam95c3RpY2sgYnV0dG9ucwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9FVlRfcmVhZEpveUJ1dHRvbnMKLQotICAgICAgICBtb3YgICAgIGR4LDAyMDFoCi0gICAgICAgIGluICAgICAgYWwsZHgKLSAgICAgICAgc2hyICAgICBhbCw0Ci0gICAgICAgIG5vdCAgICAgYWwKLSAgICAgICAgYW5kICAgICBlYXgsMEZoCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfam95Ci0KLWVuZGlmCi0KLSAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19tdHJyLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fbXRyci5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMGE2OTYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19tdHJyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KLTsqIEVudmlyb25tZW50OiAxNi8zMiBiaXQgUmluZyAwIGRldmljZSBkcml2ZXIKLTsqCi07KiBEZXNjcmlwdGlvbjogQXNzZW1ibGVyIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBNZW1vcnkgVHlwZSBSYW5nZSBSZWdpc3RlcgotOyogICAgICAgICAgICAgIChNVFJSKSBtb2R1bGUuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1oZWFkZXIgICAgICBfbXRyciAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1iZWdkYXRhc2VnICBfbXRycgotCi1pZmRlZiAgIERPUzRHVwotICAgIGNleHRlcm4gX1BNX2hhdmVDYXVzZVdheSxVSU5UCi1lbmRpZgotCi1lbmRkYXRhc2VnICBfbXRycgotCi1iZWdjb2Rlc2VnICBfbXRyciAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLVA1ODYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaWJvb2wgX01UUlJfaXNSaW5nMCh2b2lkKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENoZWNrcyB0byBzZWUgaWYgd2UgYXJlIHJ1bm5pbmcgYXQgcmluZyAwLiBUaGlzIGNoZWNrIGlzIG9ubHkgcmVsZXZhbnQKLTsgZm9yIDMyLWJpdCBET1M0R1cgYW5kIGNvbXBhdGlibGUgcHJvZ3JhbXMuIElmIHdlIGFyZSBub3QgcnVubmluZyB1bmRlcgotOyBET1M0R1csIHRoZW4gd2Ugc2ltcGx5IGFzc3VtZSB3ZSBhcmUgYSByaW5nIDAgZGV2aWNlIGRyaXZlci4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY25lYXIgICBfTVRSUl9pc1JpbmcwCi0KLTsgQXJlIHdlIHJ1bm5pbmcgdW5kZXIgQ2F1c2VXYXk/Ci0KLWlmZGVmICAgRE9TNEdXCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgbW92ICAgICBheCxjcwotICAgICAgICBhbmQgICAgIGVheCwzCi0gICAgICAgIHhvciAgICAgZWF4LDMKLSAgICAgICAgam56ICAgICBAQEV4aXQKLQotOyBDYXVzZVdheSBydW5zIHRoZSBhcHBzIGF0IHJpbmcgMywgYnV0IGltcGxlbWVudHMgc3VwcG9ydCBmb3Igc3BlY2lmaWMKLTsgcmluZyAwIGluc3RydWN0aW9ucyB0aGF0IHdlIG5lZWQgdG8gZ2V0IHN0dWZmIGRvbmUgdW5kZXIgcmVhbCBET1MuCi0KLSAgICAgICAgbW92ICAgICBlYXgsMQotICAgICAgICBjbXAgICAgIFtVSU5UIF9QTV9oYXZlQ2F1c2VXYXldLDAKLSAgICAgICAgam56ICAgICBAQEV4aXQKLUBARmFpbDogeG9yICAgICBlYXgsZWF4Ci1AQEV4aXQ6IGxlYXZlX2MKLSAgICAgICAgcmV0Ci1lbHNlCi1pZmRlZiBfX1NNWDMyX18KLSAgICAgICAgbW92ICAgICBlYXgsMSAgICAgICAgICAgICAgICAgICA7IFNNWCBpcyByaW5nIDAhCi0gICAgICAgIHJldAotZWxzZQotaWZkZWYgX19WWERfXwotICAgICAgICBtb3YgICAgIGVheCwxICAgICAgICAgICAgICAgICAgIDsgVnhEIGlzIHJpbmcgMCEKLSAgICAgICAgcmV0Ci1lbHNlCi1pZmRlZiBfX05UX0RSSVZFUl9fCi0gICAgICAgIG1vdiAgICAgZWF4LDEgICAgICAgICAgICAgICAgICAgOyBOVC9XMksgaXMgcmluZyAwIQotICAgICAgICByZXQKLWVsc2UKLWVsc2UKLSAgICAgICAgeG9yICAgICBlYXgsZWF4ICAgICAgICAgICAgICAgICA7IEFzc3VtZSByaW5nIDMgZm9yIDMyLWJpdCBET1MKLSAgICAgICAgcmV0Ci1lbmRpZgotZW5kaWYKLWVuZGlmCi1lbmRpZgotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bG9uZyBfTVRSUl9kaXNhYmxlSW50KHZvaWQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJuIHByb2Nlc3NvciBpbnRlcnJ1cHQgc3RhdHVzIGFuZCBkaXNhYmxlIGludGVycnVwdHMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX01UUlJfZGlzYWJsZUludAotCi0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgIDsgUHV0IGZsYWcgd29yZCBvbiBzdGFjawotICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICA7IERpc2FibGUgaW50ZXJydXB0cyEKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgOyBkZXBvc2l0IGZsYWcgd29yZCBpbiByZXR1cm4gcmVnaXN0ZXIKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX01UUlJfcmVzdG9yZUludCh1bG9uZyBwcyk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXN0b3JlIHByb2Nlc3NvciBpbnRlcnJ1cHQgc3RhdHVzLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9NVFJSX3Jlc3RvcmVJbnQKLQotICAgICAgICBBUkcgICAgIHBzOlVMT05HCi0KLSAgICAgICAgcHVzaCAgICBlYnAKLSAgICAgICAgbW92ICAgICBlYnAsZXNwICAgICAgICAgOyBTZXQgdXAgc3RhY2sgZnJhbWUKLSAgICAgICAgbW92ICAgICBlY3gsW3BzXQotICAgICAgICB0ZXN0ICAgIGVjeCwyMDBoICAgICAgICA7IFNNUCBzYWZlIGludGVycnVwdCBmbGFnIHJlc3RvcmUhCi0gICAgICAgIGp6ICAgICAgQEAxCi0gICAgICAgIHN0aQotQEAxOiAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWxvbmcgX01UUlJfc2F2ZUNSNCh2b2lkKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFNhdmUgdGhlIHZhbHVlIG9mIENSNCBhbmQgY2xlYXIgdGhlIFBhZ2UgR2xvYmFsIEVuYWJsZSAoYml0IDcpLiBXZSBhbHNvCi07IGRpc2FibGUgYW5kIGZsdXNoIHRoZSBjYWNoZXMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX01UUlJfc2F2ZUNSNAotCi0gICAgICAgIGVudGVyX2MKLQotOyBTYXZlIHZhbHVlIG9mIENSNCBhbmQgY2xlYXIgUGFnZSBHbG9iYWwgRW5hYmxlIChiaXQgNykKLQotICAgICAgICBtb3YgICAgIGVieCxjcjQKLSAgICAgICAgbW92ICAgICBlYXgsZWJ4Ci0gICAgICAgIGFuZCAgICAgYWwsN0ZoCi0gICAgICAgIG1vdiAgICAgY3I0LGVheAotCi07IERpc2FibGUgYW5kIGZsdXNoIGNhY2hlcwotCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMAotICAgICAgICBvciAgICAgIGVheCw0MDAwMDAwMGgKLSAgICAgICAgd2JpbnZkCi0gICAgICAgIG1vdiAgICAgY3IwLGVheAotICAgICAgICB3YmludmQKLQotOyBSZXR1cm4gdmFsdWUgZnJvbSBDUjQKLQotICAgICAgICBtb3YgICAgIGVheCxlYngKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfTVRSUl9yZXN0b3JlQ1I0KHVsb25nIGNyNFZhbCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFNhdmUgdGhlIHZhbHVlIG9mIENSNCBhbmQgY2xlYXIgdGhlIFBhZ2UgR2xvYmFsIEVuYWJsZSAoYml0IDcpLiBXZSBhbHNvCi07IGRpc2FibGUgYW5kIGZsdXNoIHRoZSBjYWNoZXMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX01UUlJfcmVzdG9yZUNSNAotCi0gICAgICAgIEFSRyAgICAgY3I0VmFsOlVMT05HCi0KLSAgICAgICAgZW50ZXJfYwotCi07IEVuYWJsZSBjYWNoZXMKLQotICAgICAgICBtb3YgICAgIGVheCxjcjAKLSAgICAgICAgYW5kICAgICBlYXgsMEJGRkZGRkZGaAotICAgICAgICBtb3YgICAgIGNyMCxlYXgKLSAgICAgICAgbW92ICAgICBlYXgsW2NyNFZhbF0KLSAgICAgICAgbW92ICAgICBjcjQsZWF4Ci0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVjaGFyIF9NVFJSX2dldEN4ODYodWNoYXIgcmVnKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWQgYSBDeXJpeCBDUFUgaW5kZXhlZCByZWdpc3RlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9NVFJSX2dldEN4ODYKLQotICAgICAgICBBUkcgICAgIHJlZzpVQ0hBUgotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgbW92ICAgICBhbCxbcmVnXQotICAgICAgICBvdXQgICAgIDIyaCxhbAotICAgICAgICBpbiAgICAgIGFsLDIzaAotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1Y2hhciBfTVRSUl9zZXRDeDg2KHVjaGFyIHJlZyx1Y2hhciB2YWwpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgV3JpdGUgYSBDeXJpeCBDUFUgaW5kZXhlZCByZWdpc3RlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9NVFJSX3NldEN4ODYKLQotICAgICAgICBBUkcgICAgIHJlZzpVQ0hBUiwgdmFsOlVDSEFSCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGFsLFtyZWddCi0gICAgICAgIG91dCAgICAgMjJoLGFsCi0gICAgICAgIG1vdiAgICAgYWwsW3ZhbF0KLSAgICAgICAgb3V0ICAgICAyM2gsYWwKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfTVRSUl9yZWFkTVNSKHVvbmcgcmVnLCB1bG9uZyBGQVIgKmVheCwgdWxvbmcgRkFSICplZHgpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgV3JpdGVzIHRoZSBzcGVjaWZpYyBNYWNoaW5lIFN0YXR1cyBSZWdpc3RlciB1c2VkIG9uIHRoZSBuZXdlciBJbnRlbAotOyBQZW50aXVtIFBybyBhbmQgUGVudGl1bSBJSSBtb3RoZXJib2FyZHMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NuZWFyICAgX01UUlJfcmVhZE1TUgotCi0gICAgICAgIEFSRyAgICAgcmVnOlVMT05HLCB2X2VheDpEUFRSLCB2X2VkeDpEUFRSCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGVjeCxbcmVnXQotICAgICAgICByZG1zcgotICAgICAgICBtb3YgICAgIGVieCxbdl9lYXhdCi0gICAgICAgIG1vdiAgICAgW2VieF0sZWF4Ci0gICAgICAgIG1vdiAgICAgZWJ4LFt2X2VkeF0KLSAgICAgICAgbW92ICAgICBbZWJ4XSxlZHgKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfTVRSUl93cml0ZU1TUih1b25nIHJlZywgdWxvbmcgZWF4LCB1bG9uZyBlZHgpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgV3JpdGVzIHRoZSBzcGVjaWZpYyBNYWNoaW5lIFN0YXR1cyBSZWdpc3RlciB1c2VkIG9uIHRoZSBuZXdlciBJbnRlbAotOyBQZW50aXVtIFBybyBhbmQgUGVudGl1bSBJSSBtb3RoZXJib2FyZHMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NuZWFyICAgX01UUlJfd3JpdGVNU1IKLQotICAgICAgICBBUkcgICAgIHJlZzpVTE9ORywgdl9lYXg6VUxPTkcsIHZfZWR4OlVMT05HCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGVjeCxbcmVnXQotICAgICAgICBtb3YgICAgIGVheCxbdl9lYXhdCi0gICAgICAgIG1vdiAgICAgZWR4LFt2X2VkeF0KLSAgICAgICAgd3Jtc3IKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotZW5kY29kZXNlZyAgX210cnIKLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fcGNpaGVscC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX3BjaWhlbHAuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjhkYmNjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fcGNpaGVscC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogQW55Ci07KgotOyogRGVzY3JpcHRpb246IEhlbHBlciBhc3NlbWJsZXIgZnVuY3Rpb25zIGZvciBQQ0kgYWNjZXNzIG1vZHVsZS4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgX3BjaWxpYgotCi1iZWdjb2Rlc2VnICBfcGNpbGliCi0KLWlmZGVmIGZsYXRtb2RlbAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1Y2hhciBfQVNNQVBJIF9CSU9TMzJfc2VydmljZSgKLTsgICB1bG9uZyBzZXJ2aWNlLAotOyAgIHVsb25nIGZ1bmMsCi07ICAgdWxvbmcgKnBoeXNCYXNlLAotOyAgIHVsb25nICpsZW5ndGgsCi07ICAgdWxvbmcgKnNlcnZpY2VPZmZzZXQsCi07ICAgUENJQklPU19lbnRyeSBlbnRyeSk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDYWxsIHRoZSBCSU9TMzIgc2VydmljZXMgZGlyZWN0b3J5Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgIF9CSU9TMzJfc2VydmljZQotCi0gICAgICAgIEFSRyAgICAgc2VydmljZTpVTE9ORywgZnVuYzpVTE9ORywgcGh5c0Jhc2U6RFBUUiwgbGVuOkRQVFIsIG9mZjpEUFRSLCBlbnRyeTpRV09SRAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgbW92ICAgICBlYXgsW3NlcnZpY2VdCi0gICAgICAgIG1vdiAgICAgZWJ4LFtmdW5jXQotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbZW50cnldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW0ZXT1JEIGVudHJ5XQotZW5kaWYKLSAgICAgICAgbW92ICAgICBlc2ksW3BoeXNCYXNlXQotICAgICAgICBtb3YgICAgIFtlc2ldLGVieAotICAgICAgICBtb3YgICAgIGVzaSxbbGVuXQotICAgICAgICBtb3YgICAgIFtlc2ldLGVjeAotICAgICAgICBtb3YgICAgIGVzaSxbb2ZmXQotICAgICAgICBtb3YgICAgIFtlc2ldLGVkeAotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1c2hvcnQgX0FTTUFQSSBfUENJQklPU19pc1ByZXNlbnQodWxvbmcgaV9lYXgsdWxvbmcgKm9fZWR4LHVzaG9ydCAqb2VheCwKLTsgICB1Y2hhciAqb19jbCxQQ0lCSU9TX2VudHJ5IGVudHJ5KQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2FsbCB0aGUgUENJIEJJT1MgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIHByZXNlbnQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgIF9QQ0lCSU9TX2lzUHJlc2VudAotCi0gICAgICAgIEFSRyAgICAgaV9lYXg6VUxPTkcsIG9fZWR4OkRQVFIsIG9lYXg6RFBUUiwgb19jbDpEUFRSLCBlbnRyeTpRV09SRAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgbW92ICAgICBlYXgsW2lfZWF4XQotaWZkZWYgICBmbGF0bW9kZWwKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW2VudHJ5XQotZWxzZQotICAgICAgICBjYWxsICAgIFtGV09SRCBlbnRyeV0KLWVuZGlmCi1lbHNlCi0gICAgICAgIGludCAgICAgMUFoCi1lbmRpZgotICAgICAgICBfbGVzICAgIF9zaSxbb19lZHhdCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2ldLGVkeAotICAgICAgICBfbGVzICAgIF9zaSxbb2VheF0KLSAgICAgICAgbW92ICAgICBbX0VTIF9zaV0sYXgKLSAgICAgICAgX2xlcyAgICBfc2ksW29fY2xdCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2ldLGNsCi0gICAgICAgIG1vdiAgICAgYXgsYngKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWxvbmcgX1BDSUJJT1Nfc2VydmljZSh1bG9uZyByX2VheCx1bG9uZyByX2VieCx1bG9uZyByX2VkaSx1bG9uZyByX2VjeCwKLTsgICBQQ0lCSU9TX2VudHJ5IGVudHJ5KQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2FsbCB0aGUgUENJIEJJT1Mgc2VydmljZXMsIGVpdGhlciB2aWEgdGhlIDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSBlbnRyeQotOyBwb2ludCBvciB2aWEgdGhlIEludCAxQWggMTYtYml0IGludGVycnVwdC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgX1BDSUJJT1Nfc2VydmljZQotCi0gICAgICAgIEFSRyAgICAgcl9lYXg6VUxPTkcsIHJfZWJ4OlVMT05HLCByX2VkaTpVTE9ORywgcl9lY3g6VUxPTkcsIGVudHJ5OlFXT1JECi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGVheCxbcl9lYXhdCi0gICAgICAgIG1vdiAgICAgZWJ4LFtyX2VieF0KLSAgICAgICAgbW92ICAgICBlZGksW3JfZWRpXQotICAgICAgICBtb3YgICAgIGVjeCxbcl9lY3hdCi1pZmRlZiAgIGZsYXRtb2RlbAotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbZW50cnldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW0ZXT1JEIGVudHJ5XQotZW5kaWYKLWVsc2UKLSAgICAgICAgaW50ICAgICAxQWgKLWVuZGlmCi0gICAgICAgIG1vdiAgICAgZWF4LGVjeAotaWZuZGVmICBmbGF0bW9kZWwKLSAgICAgICAgc2hsZCAgICBlZHgsZWF4LDE2ICAgICAgOyBSZXR1cm4gcmVzdWx0IGluIERYOkFYCi1lbmRpZgotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgX1BDSUJJT1NfZ2V0Um91dGluZyhQQ0lSb3V0aW5nT3B0aW9uc0J1ZmZlciAqYnVmLFBDSUJJT1NfZW50cnkgZW50cnkpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgR2V0IHRoZSByb3V0aW5nIG9wdGlvbnMgZm9yIFBDSSBkZXZpY2VzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgIF9QQ0lCSU9TX2dldFJvdXRpbmcKLQotICAgICAgICBBUkcgICAgIGJ1ZjpEUFRSLCBlbnRyeTpRV09SRAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgbW92ICAgICBlYXgsMEIxMEVoCi0gICAgICAgIG1vdiAgICAgYngsMAotICAgICAgICBfbGVzICAgIF9kaSxbYnVmXQotaWZkZWYgICBmbGF0bW9kZWwKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW2VudHJ5XQotZWxzZQotICAgICAgICBjYWxsICAgIFtGV09SRCBlbnRyeV0KLWVuZGlmCi1lbHNlCi0gICAgICAgIGludCAgICAgMUFoCi1lbmRpZgotICAgICAgICBtb3Z6eCAgIGVheCxhaAotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpYm9vbCBfUENJQklPU19zZXRJUlEoaW50IGJ1c0RldixpbnQgaW50UGluLGludCBJUlEsUENJQklPU19lbnRyeSBlbnRyeSk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDaGFuZ2UgdGhlIElSUSByb3V0aW5nIGZvciB0aGUgUENJIGRldmljZQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgICBfUENJQklPU19zZXRJUlEKLQotICAgICAgICBBUkcgICAgIGJ1c0RldjpVSU5ULCBpbnRQaW46VUlOVCwgSVJROlVJTlQsIGVudHJ5OlFXT1JECi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGVheCwwQjEwRmgKLSAgICAgICAgbW92ICAgICBieCxbVVNIT1JUIGJ1c0Rldl0KLSAgICAgICAgbW92ICAgICBjbCxbQllURSBpbnRQaW5dCi0gICAgICAgIG1vdiAgICAgY2gsW0JZVEUgSVJRXQotaWZkZWYgICBmbGF0bW9kZWwKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW2VudHJ5XQotZWxzZQotICAgICAgICBjYWxsICAgIFtGV09SRCBlbnRyeV0KLWVuZGlmCi1lbHNlCi0gICAgICAgIGludCAgICAgMUFoCi1lbmRpZgotICAgICAgICBtb3YgICAgIGVheCwxCi0gICAgICAgIGpuYyAgICAgQEAxCi0gICAgICAgIHhvciAgICAgZWF4LGVheCAgICAgICAgIDsgRnVuY3Rpb24gZmFpbGVkIQotQEAxOiAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bG9uZyBfUENJQklPU19zcGVjaWFsQ3ljbGUoaW50IGJ1cyx1bG9uZyBkYXRhLFBDSUJJT1NfZW50cnkgZW50cnkpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgR2VuZXJhdGUgYSBzcGVjaWFsIGN5Y2xlIHZpYSB0aGUgUENJIEJJT1MuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgIF9QQ0lCSU9TX3NwZWNpYWxDeWNsZQotCi0gICAgICAgIEFSRyAgICAgYnVzOlVJTlQsIGRhdGE6VUxPTkcsIGVudHJ5OlFXT1JECi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGVheCwwQjEwNmgKLSAgICAgICAgbW92ICAgICBiaCxbQllURSBidXNdCi0gICAgICAgIG1vdiAgICAgZWN4LFtkYXRhXQotaWZkZWYgICBmbGF0bW9kZWwKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW2VudHJ5XQotZWxzZQotICAgICAgICBjYWxsICAgIFtGV09SRCBlbnRyeV0KLWVuZGlmCi1lbHNlCi0gICAgICAgIGludCAgICAgMUFoCi1lbmRpZgotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1c2hvcnQgX1BDSV9nZXRDUyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgICBfUENJX2dldENTCi0KLSAgICAgICAgbW92ICAgICBheCxjcwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX2lucGIoaW50IHBvcnQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkcyBhIGJ5dGUgZnJvbSB0aGUgc3BlY2lmaWVkIHBvcnQKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9pbnBiCi0KLSAgICAgICAgQVJHICAgICBwb3J0OlVJTlQKLQotICAgICAgICBwdXNoICAgIF9icAotICAgICAgICBtb3YgICAgIF9icCxfc3AKLSAgICAgICAgeG9yICAgICBfYXgsX2F4Ci0gICAgICAgIG1vdiAgICAgX2R4LFtwb3J0XQotICAgICAgICBpbiAgICAgIGFsLGR4Ci0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgUE1faW5wdyhpbnQgcG9ydCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWRzIGEgd29yZCBmcm9tIHRoZSBzcGVjaWZpZWQgcG9ydAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2lucHcKLQotICAgICAgICBBUkcgICAgIHBvcnQ6VUlOVAotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICB4b3IgICAgIF9heCxfYXgKLSAgICAgICAgbW92ICAgICBfZHgsW3BvcnRdCi0gICAgICAgIGluICAgICAgYXgsZHgKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIFBNX2lucGQoaW50IHBvcnQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkcyBhIHdvcmQgZnJvbSB0aGUgc3BlY2lmaWVkIHBvcnQKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9pbnBkCi0KLSAgICAgICAgQVJHICAgICBwb3J0OlVJTlQKLQotICAgICAgICBwdXNoICAgIF9icAotICAgICAgICBtb3YgICAgIF9icCxfc3AKLSAgICAgICAgbW92ICAgICBfZHgsW3BvcnRdCi0gICAgICAgIGluICAgICAgZWF4LGR4Ci1pZm5kZWYgZmxhdG1vZGVsCi0gICAgICAgIHNobGQgICAgZWR4LGVheCwxNiAgICAgIDsgRFg6QVggPSByZXN1bHQKLWVuZGlmCi0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX291dHBiKGludCBwb3J0LGludCB2YWx1ZSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFdyaXRlIGEgYnl0ZSB0byB0aGUgc3BlY2lmaWVkIHBvcnQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fb3V0cGIKLQotICAgICAgICBBUkcgICAgIHBvcnQ6VUlOVCwgdmFsdWU6VUlOVAotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBtb3YgICAgIF9keCxbcG9ydF0KLSAgICAgICAgbW92ICAgICBfYXgsW3ZhbHVlXQotICAgICAgICBvdXQgICAgIGR4LGFsCi0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX291dHB3KGludCBwb3J0LGludCB2YWx1ZSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFdyaXRlIGEgd29yZCB0byB0aGUgc3BlY2lmaWVkIHBvcnQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fb3V0cHcKLQotICAgICAgICBBUkcgICAgIHBvcnQ6VUlOVCwgdmFsdWU6VUlOVAotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBtb3YgICAgIF9keCxbcG9ydF0KLSAgICAgICAgbW92ICAgICBfYXgsW3ZhbHVlXQotICAgICAgICBvdXQgICAgIGR4LGF4Ci0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX291dHBkKGludCBwb3J0LHVsb25nIHZhbHVlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgV3JpdGUgYSB3b3JkIHRvIHRoZSBzcGVjaWZpZWQgcG9ydC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9vdXRwZAotCi0gICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCB2YWx1ZTpVTE9ORwotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBtb3YgICAgIF9keCxbcG9ydF0KLSAgICAgICAgbW92ICAgICBlYXgsW3ZhbHVlXQotICAgICAgICBvdXQgICAgIGR4LGVheAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotZW5kY29kZXNlZyAgX3BjaWxpYgotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL2FncC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL2FncC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTNiYzg4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9hZ3AuYworKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgUmluZyAwIGRldmljZSBkcml2ZXIKLSoKLSogRGVzY3JpcHRpb246ICBHZW5lcmljIG1vZHVsZSB0byBpbXBsZW1lbnQgQUdQIHN1cHBvcnQgZnVuY3Rpb25zIHVzaW5nIHRoZQotKiAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBBR1Agc3VwcG9ydCBkcml2ZXJzLiBJZiB0aGUgT1MgcHJvdmlkZXMKLSogICAgICAgICAgICAgICBuYXRpdmUgQUdQIHN1cHBvcnQsIHRoaXMgbW9kdWxlIHNob3VsZCAqTk9UKiBiZSB1c2VkLiBJbnN0ZWFkCi0qICAgICAgICAgICAgICAgd3JhcHBlcnMgc2hvdWxkIGJlIHBsYWNlZCBhcm91bmQgdGhlIE9TIHN1cHBvcnQgZnVuY3Rpb25zCi0qICAgICAgICAgICAgICAgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2lmbmRlZiBSRUFMTU9ERQotI2luY2x1ZGUgIm51Y2xldXMvYWdwLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBBR1BfZGV2Q3R4ICAgICAgICphZ3A7Ci1zdGF0aWMgQUdQX2RyaXZlckZ1bmNzICBkcml2ZXI7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotU2l6ZSBvZiBBR1AgYXBlcnR1cmUgaW4gTUIgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgQUdQIGRyaXZlciBpbiB0aGUgc3lzdGVtIGFuZCByZXR1cm5zIHRoZQotc2l6ZSBvZiB0aGUgYXZhaWxhYmxlIEFHUCBhcGVydHVyZSBpbiBtZWdhYnl0ZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgUE1BUEkgUE1fYWdwSW5pdCh2b2lkKQotewotICAgIGlmICgoYWdwID0gQUdQX2xvYWREcml2ZXIoMCkpID09IE5VTEwpCi0JcmV0dXJuIDA7Ci0gICAgZHJpdmVyLmR3U2l6ZSA9IHNpemVvZihkcml2ZXIpOwotICAgIGlmICghYWdwLT5RdWVyeUZ1bmN0aW9ucyhBR1BfR0VUX0RSSVZFUkZVTkNTLCZkcml2ZXIpKQotCXJldHVybiAwOwotICAgIHN3aXRjaCAoZHJpdmVyLkdldEFwZXJ0dXJlU2l6ZSgpKSB7Ci0JY2FzZSBhZ3BTaXplNE1COiAgICByZXR1cm4gNDsKLQljYXNlIGFncFNpemU4TUI6ICAgIHJldHVybiA4OwotCWNhc2UgYWdwU2l6ZTE2TUI6ICAgcmV0dXJuIDE2OwotCWNhc2UgYWdwU2l6ZTMyTUI6ICAgcmV0dXJuIDMyOwotCWNhc2UgYWdwU2l6ZTY0TUI6ICAgcmV0dXJuIDY0OwotCWNhc2UgYWdwU2l6ZTEyOE1COiAgcmV0dXJuIDEyODsKLQljYXNlIGFncFNpemUyNTZNQjogIHJldHVybiAyNTY7Ci0JY2FzZSBhZ3BTaXplNTEyTUI6ICByZXR1cm4gNTEyOwotCWNhc2UgYWdwU2l6ZTFHQjogICAgcmV0dXJuIDEwMjQ7Ci0JY2FzZSBhZ3BTaXplMkdCOiAgICByZXR1cm4gMjA0ODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjbG9zZXMgZG93biB0aGUgbG9hZGVkIEFHUCBkcml2ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9hZ3BFeGl0KHZvaWQpCi17Ci0gICAgQUdQX3VubG9hZERyaXZlcihhZ3ApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW51bVBhZ2VzICAgIC0gTnVtYmVyIG9mIG1lbW9yeSBwYWdlcyB0aGF0IHNob3VsZCBiZSByZXNlcnZlZAotdHlwZSAgICAgICAgLSBUeXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZQotcGh5c0NvbnRleHQgLSBSZXR1cm5zIHRoZSBwaHlzaWNhbCBjb250ZXh0IGhhbmRsZSBmb3IgdGhlIG1hcHBpbmcKLXBoeXNBZGRyICAgIC0gUmV0dXJucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIG1hcHBpbmcKLQotUkVUVVJOUzoKLVRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVzZXJ2ZXMgYSByYW5nZSBvZiBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzc2VzIG9uIHRoZSBzeXN0ZW0KLWJ1cyB3aGljaCB0aGUgQUdQIGNvbnRyb2xsZXIgd2lsbCByZXNwb25kIHRvLiBJZiB0aGlzIGZ1bmN0aW9uIHN1Y2NlZWRzLAotdGhlIEFHUCBjb250cm9sbGVyIGNhbiByZXNwb25kIHRvIHRoZSByZXNlcnZlZCBwaHlzaWNhbCBhZGRyZXNzIHJhbmdlIG9uCi10aGUgYnVzLiBIb3dldmVyIHlvdSBtdXN0IGZpcnN0IGNhbGwgQUdQX2NvbW1pdFBoeXNpY2FsIHRvIGNhdXNlIHRoaXMgbWVtb3J5Ci10byBhY3R1YWxseSBiZSBjb21taXR0ZWQgZm9yIHVzZSBiZWZvcmUgaXQgY2FuIGJlIGFjY2Vzc2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2FncFJlc2VydmVQaHlzaWNhbCgKLSAgICB1bG9uZyBudW1QYWdlcywKLSAgICBpbnQgdHlwZSwKLSAgICB2b2lkICoqcGh5c0NvbnRleHQsCi0gICAgUE1fcGh5c0FkZHIgKnBoeXNBZGRyKQotewotICAgIHN3aXRjaCAodHlwZSkgewotCWNhc2UgUE1fYWdwVW5jYWNoZWQ6Ci0JICAgIHR5cGUgPSBhZ3BVbmNhY2hlZDsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV9hZ3BXcml0ZUNvbWJpbmU6Ci0JICAgIHR5cGUgPSBhZ3BXcml0ZUNvbWJpbmU7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fYWdwSW50ZWxEQ0FDSEU6Ci0JICAgIHR5cGUgPSBhZ3BJbnRlbERDQUNIRTsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICByZXR1cm4gZHJpdmVyLlJlc2VydmVQaHlzaWNhbChudW1QYWdlcyx0eXBlLHBoeXNDb250ZXh0LHBoeXNBZGRyKSA9PSBuT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcGh5c0NvbnRleHQgLSBQaHlzaWNhbCBBR1AgY29udGV4dCB0byByZWxlYXNlCi0KLVJFVFVSTlM6Ci1UcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGEgcmFuZ2Ugb2YgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3NlcyBvbiB0aGUgc3lzdGVtCi1idXMgd2hpY2ggdGhlIEFHUCBjb250cm9sbGVyIHdpbGwgcmVzcG9uZCB0by4gQWxsIGNvbW1pdHRlZCBtZW1vcnkgZm9yCi10aGUgcGh5c2ljYWwgYWRkcmVzcyByYW5nZSBjb3ZlcmVkIGJ5IHRoZSBjb250ZXh0IHdpbGwgYmUgcmVsZWFzZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fYWdwUmVsZWFzZVBoeXNpY2FsKAotICAgIHZvaWQgKnBoeXNDb250ZXh0KQotewotICAgIHJldHVybiBkcml2ZXIuUmVsZWFzZVBoeXNpY2FsKHBoeXNDb250ZXh0KSA9PSBuT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcGh5c0NvbnRleHQgLSBQaHlzaWNhbCBBR1AgY29udGV4dCB0byBjb21taXQgbWVtb3J5IGZvcgotbnVtUGFnZXMgICAgLSBOdW1iZXIgb2YgcGFnZXMgdG8gYmUgY29tbWl0dGVkCi1zdGFydE9mZnNldCAtIE9mZnNldCBpbiBwYWdlcyBpbnRvIHRoZSByZXNlcnZlZCBwaHlzaWNhbCBjb250ZXh0Ci1waHlzQWRkciAgICAtIFJldHVybnMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGNvbW1pdHRlZCBtZW1vcnkKLQotUkVUVVJOUzoKLVRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gY29tbWl0cyBpbnRvIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgY29udGV4dCB0aGF0IHdhcyBwcmV2aW91c2x5Ci1yZXNlcnZlZCBieSBhIGNhbGwgdG8gUmVzZXJ2ZVBoeXNpY2FsLiBZb3UgY2FuIHVzZSB0aGUgc3RhcnRPZmZzZXQgYW5kCi1udW1QYWdlcyBwYXJhbWV0ZXJzIHRvIG9ubHkgY29tbWl0IHBvcnRpb25zIG9mIHRoZSByZXNlcnZlZCBtZW1vcnkgcmFuZ2UgYXQKLWEgdGltZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9hZ3BDb21taXRQaHlzaWNhbCgKLSAgICB2b2lkICpwaHlzQ29udGV4dCwKLSAgICB1bG9uZyBudW1QYWdlcywKLSAgICB1bG9uZyBzdGFydE9mZnNldCwKLSAgICBQTV9waHlzQWRkciAqcGh5c0FkZHIpCi17Ci0gICAgcmV0dXJuIGRyaXZlci5Db21taXRQaHlzaWNhbChwaHlzQ29udGV4dCxudW1QYWdlcyxzdGFydE9mZnNldCxwaHlzQWRkcikgPT0gbk9LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBoeXNDb250ZXh0IC0gUGh5c2ljYWwgQUdQIGNvbnRleHQgdG8gZnJlZSBtZW1vcnkgZm9yCi1udW1QYWdlcyAgICAtIE51bWJlciBvZiBwYWdlcyB0byBiZSBmcmVlZAotc3RhcnRPZmZzZXQgLSBPZmZzZXQgaW4gcGFnZXMgaW50byB0aGUgcmVzZXJ2ZWQgcGh5c2ljYWwgY29udGV4dAotCi1SRVRVUk5TOgotVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBmcmVlcyBtZW1vcnkgcHJldmlvdXNseSBjb21taXR0ZWQgYnkgdGhlIENvbW1pdFBoeXNpY2FsCi1mdW5jdGlvbi4gTm90ZSB0aGF0IHlvdSBjYW4gZnJlZSBhIHBvcnRpb24gb2YgYSBtZW1vcnkgcmFuZ2UgdGhhdCB3YXMKLXByZXZpb3VzbHkgY29tbWl0dGVkIGlmIHlvdSB3aXNoLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2FncEZyZWVQaHlzaWNhbCgKLSAgICB2b2lkICpwaHlzQ29udGV4dCwKLSAgICB1bG9uZyBudW1QYWdlcywKLSAgICB1bG9uZyBzdGFydE9mZnNldCkKLXsKLSAgICByZXR1cm4gZHJpdmVyLkZyZWVQaHlzaWNhbChwaHlzQ29udGV4dCxudW1QYWdlcyxzdGFydE9mZnNldCkgPT0gbk9LOwotfQotCi0jZW5kaWYgIC8qICFSRUFMTU9ERSAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL2tleWJvYXJkLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24va2V5Ym9hcmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4NjdiZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24va2V5Ym9hcmQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBEaXJlY3Qga2V5Ym9hcmQgZXZlbnQgaGFuZGxpbmcgbW9kdWxlLiBUaGlzIG1vZHVsZSBjb250YWlucwotKiAgICAgICAgICAgICAgIGNvZGUgdG8gcHJvY2VzcyByYXcgc2NhbiBjb2RlIGluZm9ybWF0aW9uLCBjb252ZXJ0IGl0IHRvCi0qICAgICAgICAgICAgICAgdmlydHVhbCBzY2FuIGNvZGVzIGFuZCBkbyBjb2RlIHBhZ2UgdHJhbnNsYXRpb24gdG8gQVNDSUkKLSogICAgICAgICAgICAgICBmb3IgZGlmZmVyZW50IGludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0cy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2NhbkNvZGUgICAgLSBLZXlib2FyZCBzY2FuIGNvZGUgdG8gdHJhbnNsYXRlCi10YWJsZSAgICAgICAtIENvZGUgcGFnZSB0YWJsZSB0byBzZWFyY2gKLWNvdW50ICAgICAgIC0gTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNvZGUgcGFnZSB0YWJsZQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZSBzY2FuIGNvZGVzIGZyb20ga2V5Ym9hcmQgc2NhbiBjb2RlcyB0byBBU0NJSQotY29kZXMgdXNpbmcgYSBiaW5hcnkgc2VhcmNoIG9uIHRoZSBjb2RlIHBhZ2UgdGFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVjaGFyIHRyYW5zbGF0ZVNjYW4oCi0gICAgdWNoYXIgc2NhbkNvZGUsCi0gICAgY29kZXBhZ2VfZW50cnlfdCAqdGFibGUsCi0gICAgaW50IGNvdW50KQotewotICAgIGNvZGVwYWdlX2VudHJ5X3QgICAgKnRlc3Q7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBuLHBpdm90LHZhbDsKLQotICAgIGZvciAobiA9IGNvdW50OyBuID4gMDsgKSB7Ci0JcGl2b3QgPSBuID4+IDE7Ci0JdGVzdCA9IHRhYmxlICsgcGl2b3Q7Ci0JdmFsID0gc2NhbkNvZGUgLSB0ZXN0LT5zY2FuQ29kZTsKLQlpZiAodmFsIDwgMCkKLQkgICAgbiA9IHBpdm90OwotCWVsc2UgaWYgKHZhbCA9PSAwKQotCSAgICByZXR1cm4gdGVzdC0+YXNjaWlDb2RlOwotCWVsc2UgewotCSAgICB0YWJsZSA9IHRlc3QgKyAxOwotCSAgICBuIC09IHBpdm90ICsgMTsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIG1hY3JvL2Z1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydHMgdGhlIHNjYW4gY29kZXMgcmVwb3J0ZWQgYnkgdGhlCi1rZXlib2FyZCB0byBvdXIgZXZlbnQgbGlicmFyaWVzIG5vcm1hbGlzZWQgZm9ybWF0LiBXZSBvbmx5IGhhdmUgb25lIHNjYW4KLWNvZGUgZm9yIHRoZSAnQScga2V5LCBhbmQgdXNlIHNoaWZ0IG1vZGlmaWVycyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYQotQ3RybC1GMSwgQWx0LUYxIGV0Yy4gVGhlIHJhdyBzY2FuIGNvZGVzIGZyb20gdGhlIGtleWJvYXJkIHdvcmsgdGhpcyB3YXksCi1idXQgdGhlIE9TIGdpdmVzIHVzICdjb29rZWQnIHNjYW4gY29kZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZW0gYmFjawotdG8gdGhlIHJhdyBmb3JtYXQuCi17c2VjcmV0fQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9tYXNrS2V5Q29kZSgKLSAgICBldmVudF90ICpldnQpCi17Ci0gICAgaW50IGFzY2lpLHNjYW4gPSBFVlRfc2NhbkNvZGUoZXZ0LT5tZXNzYWdlKTsKLQotICAgIGV2dC0+bWVzc2FnZSAmPSB+MHhGRjsKLSAgICBpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfTlVNTE9DSykgewotCWlmICgoYXNjaWkgPSB0cmFuc2xhdGVTY2FuKHNjYW4sRVZULmNvZGVQYWdlLT5udW1QYWQsRVZULmNvZGVQYWdlLT5udW1QYWRMZW4pKSAhPSAwKSB7Ci0JICAgIGV2dC0+bWVzc2FnZSB8PSBhc2NpaTsKLQkgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9DVFJMU1RBVEUpIHsKLQlldnQtPm1lc3NhZ2UgfD0gdHJhbnNsYXRlU2NhbihzY2FuLEVWVC5jb2RlUGFnZS0+Y3RybCxFVlQuY29kZVBhZ2UtPmN0cmxMZW4pOwotCXJldHVybjsKLQl9Ci0gICAgaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX0NBUFNMT0NLKSB7Ci0JaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX1NISUZUS0VZKSB7Ci0JICAgIGlmICgoYXNjaWkgPSB0cmFuc2xhdGVTY2FuKHNjYW4sRVZULmNvZGVQYWdlLT5zaGlmdENhcHMsRVZULmNvZGVQYWdlLT5zaGlmdENhcHNMZW4pKSAhPSAwKSB7Ci0JCWV2dC0+bWVzc2FnZSB8PSBhc2NpaTsKLQkJcmV0dXJuOwotCQl9Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgaWYgKChhc2NpaSA9IHRyYW5zbGF0ZVNjYW4oc2NhbixFVlQuY29kZVBhZ2UtPmNhcHMsRVZULmNvZGVQYWdlLT5jYXBzTGVuKSkgIT0gMCkgewotCQlldnQtPm1lc3NhZ2UgfD0gYXNjaWk7Ci0JCXJldHVybjsKLQkJfQotCSAgICB9Ci0JfQotICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9TSElGVEtFWSkgewotCWlmICgoYXNjaWkgPSB0cmFuc2xhdGVTY2FuKHNjYW4sRVZULmNvZGVQYWdlLT5zaGlmdCxFVlQuY29kZVBhZ2UtPnNoaWZ0TGVuKSkgIT0gMCkgewotCSAgICBldnQtPm1lc3NhZ2UgfD0gYXNjaWk7Ci0JICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICBldnQtPm1lc3NhZ2UgfD0gdHJhbnNsYXRlU2NhbihzY2FuLEVWVC5jb2RlUGFnZS0+bm9ybWFsLEVWVC5jb2RlUGFnZS0+bm9ybWFsTGVuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm5zIHRydWUgaWYgdGhlIGtleSB3aXRoIHRoZSBzcGVjaWZpZWQgc2NhbiBjb2RlIGlzIGJlaW5nIGhlbGQgZG93bi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgX0VWVF9pc0tleURvd24oCi0gICAgdWNoYXIgc2NhbkNvZGUpCi17Ci0gICAgaWYgKHNjYW5Db2RlID4gMHg3RikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgZWxzZQotCXJldHVybiBFVlQua2V5VGFibGVbc2NhbkNvZGVdICE9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotd2hhdCAgICAgICAgLSBFdmVudCBjb2RlCi1tZXNzYWdlICAgICAtIEV2ZW50IG1lc3NhZ2UgKEFTQ0lJIGNvZGUgYW5kIHNjYW4gY29kZSkKLQotUkVNQVJLUzoKLUFkZHMgYSBuZXcga2V5Ym9hcmQgZXZlbnQgdG8gdGhlIGV2ZW50IHF1ZXVlLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20KLXdpdGhpbiB0aGUga2V5Ym9hcmQgaW50ZXJydXB0IHN1YnJvdXRpbmUhCi0KLU5PVEU6ICAgSW50ZXJydXB0cyBhcmUgT0ZGIHdoZW4gdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUga2V5Ym9hcmQgSVNSLAotCWFuZCB3ZSBsZWF2ZSB0aGVtIE9GRiB0aGUgZW50aXJlIHRpbWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWRkS2V5RXZlbnQoCi0gICAgdWludCB3aGF0LAotICAgIHVpbnQgbWVzc2FnZSkKLXsKLSAgICBldmVudF90IGV2dDsKLQotICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0JLyogU2F2ZSBpbmZvcm1hdGlvbiBpbiBldmVudCByZWNvcmQgKi8KLQlldnQud2hlbiA9IF9FVlRfZ2V0VGlja3MoKTsKLQlldnQud2hhdCA9IHdoYXQ7Ci0JZXZ0Lm1lc3NhZ2UgPSBtZXNzYWdlIHwgMHgxMDAwMFVMOwotCWV2dC53aGVyZV94ID0gMDsKLQlldnQud2hlcmVfeSA9IDA7Ci0JZXZ0LnJlbGF0aXZlX3ggPSAwOwotCWV2dC5yZWxhdGl2ZV95ID0gMDsKLQlldnQubW9kaWZpZXJzID0gRVZULmtleU1vZGlmaWVyczsKLQlpZiAoZXZ0LndoYXQgPT0gRVZUX0tFWVJFUEVBVCkgewotCSAgICBpZiAoRVZULm9sZEtleSAhPSAtMSkKLQkJRVZULmV2dHFbRVZULm9sZEtleV0ubWVzc2FnZSArPSAweDEwMDAwVUw7Ci0JICAgIGVsc2UgewotCQlFVlQub2xkS2V5ID0gRVZULmZyZWVIZWFkOwotCQlhZGRFdmVudCgmZXZ0KTsgICAgICAgICAvKiBBZGQgdG8gdGFpbCBvZiBldmVudCBxdWV1ZSAgICovCi0JCX0KLQkgICAgfQotCWVsc2UgewotI2lmZGVmIF9fUU5YX18KLQkgICAgX0VWVF9tYXNrS2V5Q29kZSgmZXZ0KTsKLSNlbmRpZgotCSAgICBhZGRFdmVudCgmZXZ0KTsgICAgICAgICAgICAgLyogQWRkIHRvIHRhaWwgb2YgZXZlbnQgcXVldWUgICAqLwotCSAgICB9Ci0JRVZULm9sZE1vdmUgPSAtMTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiB3YWl0cyBmb3IgdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIgdG8gc2V0IHRoZSByZWFkeS1mb3Itd3JpdGUKLWJpdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGtiV2FpdEZvcldyaXRlUmVhZHkodm9pZCkKLXsKLSAgICBpbnQgdGltZW91dCA9IDgxOTI7Ci0gICAgd2hpbGUgKCh0aW1lb3V0ID4gMCkgJiYgKFBNX2lucGIoMHg2NCkgJiAweDAyKSkKLQl0aW1lb3V0LS07Ci0gICAgcmV0dXJuICh0aW1lb3V0ID4gMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiB3YWl0cyBmb3IgdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIgdG8gc2V0IHRoZSByZWFkeS1mb3ItcmVhZAotYml0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQga2JXYWl0Rm9yUmVhZFJlYWR5KHZvaWQpCi17Ci0gICAgaW50IHRpbWVvdXQgPSA4MTkyOwotICAgIHdoaWxlICgodGltZW91dCA+IDApICYmICghKFBNX2lucGIoMHg2NCkgJiAweDAxKSkpCi0JdGltZW91dC0tOwotICAgIHJldHVybiAodGltZW91dCA+IDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWRhdGEgICAgLSBEYXRhIHRvIHNlbmQgdG8gdGhlIGtleWJvYXJkCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHNlbmRzIGEgZGF0YSBieXRlIHRvIHRoZSBrZXlib2FyZCBjb250cm9sbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQga2JTZW5kRGF0YSgKLSAgICB1Y2hhciBkYXRhKQotewotICAgIGludCByZXNlbmRzID0gNDsKLSAgICBpbnQgdGltZW91dCwgdGVtcDsKLQotICAgIGRvIHsKLQlpZiAoIWtiV2FpdEZvcldyaXRlUmVhZHkoKSkKLQkgICAgcmV0dXJuIDA7Ci0JUE1fb3V0cGIoMHg2MCxkYXRhKTsKLQl0aW1lb3V0ID0gODE5MjsKLQl3aGlsZSAoLS10aW1lb3V0ID4gMCkgewotCSAgICBpZiAoIWtiV2FpdEZvclJlYWRSZWFkeSgpKQotCQlyZXR1cm4gMDsKLQkgICAgdGVtcCA9IFBNX2lucGIoMHg2MCk7Ci0JICAgIGlmICh0ZW1wID09IDB4RkEpCi0JCXJldHVybiAxOwotCSAgICBpZiAodGVtcCA9PSAweEZFKQotCQlicmVhazsKLQkgICAgfQotCX0gd2hpbGUgKChyZXNlbmRzLS0gPiAwKSAmJiAodGltZW91dCA+IDApKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tb2RpZmllcnMgICAtIEtleWJvYXJkIG1vZGlmaWVyIGZsYWdzCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlLXByb2dyYW1zIHRoZSBMRUQncyBvbiB0aGUga2V5Ym9hcmQgdG8gdGhlIHZhbHVlcyBzdG9yZWQKLWluIHRoZSBwYXNzZWQgaW4gbW9kaWZpZXIgZmxhZ3MuIElmIHRoZSAnYWxsb3dMRURTJyBmbGFnIGlzIGZhbHNlLCB0aGlzCi1mdW5jdGlvbiBkb2VzIG5vdGhpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc2V0TEVEUygKLSAgICB1aW50IG1vZGlmaWVycykKLXsKLSAgICBpZiAoRVZULmFsbG93TEVEUykgewotCWlmICgha2JTZW5kRGF0YSgweEVEKSB8fCAha2JTZW5kRGF0YSgobW9kaWZpZXJzPj45KSAmIDcpKSB7Ci0JICAgIGtiU2VuZERhdGEoMHhGNCk7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcHJvY2VzcyByYXcgc2NhbiBjb2RlcyByZWFkIGZyb20gdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIuCi0KLU5PVEU6ICAgSW50ZXJydXB0cyBhcmUgT0ZGIHdoZW4gdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUga2V5Ym9hcmQgSVNSLAotCWFuZCB3ZSBsZWF2ZSB0aGVtIE9GRiB0aGUgZW50aXJlIHRpbWUuCi17c2VjcmV0fQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcHJvY2Vzc1Jhd1NjYW5Db2RlKAotICAgIGludCBzY2FuKQotewotICAgIHN0YXRpYyBpbnQgIHBhdXNlTG9vcCA9IDA7Ci0gICAgc3RhdGljIGludCAgZXh0ZW5kZWQgPSAwOwotICAgIGludCAgICAgICAgIHdoYXQ7Ci0KLSAgICBpZiAocGF1c2VMb29wKSB7Ci0JLyogU2tpcCBzY2FuIGNvZGVzIHVudGlsIHRoZSBwYXVzZSBrZXkgc2VxdWVuY2UgaGFzIGJlZW4gcmVhZCAqLwotCXBhdXNlTG9vcC0tOwotCX0KLSAgICBlbHNlIGlmIChzY2FuID09IDB4RTApIHsKLQkvKiBUaGlzIHNpZ25hbHMgdGhlIHN0YXJ0IG9mIGFuIGV4dGVuZGVkIHNjYW4gY29kZSBzZXF1ZW5jZSAqLwotCWV4dGVuZGVkID0gMTsKLQl9Ci0gICAgZWxzZSBpZiAoc2NhbiA9PSAweEUxKSB7Ci0JLyogVGhlIFBhdXNlIGtleSBzZW5kcyBhIHN0cmFuZ2Ugc2NhbiBjb2RlIHNlcXVlbmNlLCB3aGljaCBpczoKLQkgKgotCSAqICBFMSAxRCA1MiBFMSA5RCBEMgotCSAqCi0JICogSG93ZXZlciB0aGVyZSBpcyBuZXZlciBhbnkgcmVsZWFzZSBjb2RlIG5vciBhbnkgYXV0by1yZXBlYXQgZm9yCi0JICogdGhpcyBrZXkuIEZvciB0aGlzIHJlYXNvbiB3ZSBzaW1wbHkgaWdub3JlIHRoZSBrZXkgYW5kIHNraXAgdGhlCi0JICogbmV4dCA1IHNjYW4gY29kZXMgcmVhZCBmcm9tIHRoZSBrZXlib2FyZC4KLQkgKi8KLQlwYXVzZUxvb3AgPSA1OwotCX0KLSAgICBlbHNlIHsKLQkvKiBQcm9jZXNzIHRoZSBzY2FuIGNvZGUgbm9ybWFsbHkgKGl0IG1heSBiZSBhbiBleHRlbmRlZCBjb2RlCi0JICogaG93ZXZlciEpLiBCaXQgNyBtZWFucyBrZXkgd2FzIHJlbGVhc2VkLCBhbmQgYml0cyAwLTYgYXJlIHRoZQotCSAqIHNjYW4gY29kZS4KLQkgKi8KLQl3aGF0ID0gKHNjYW4gJiAweDgwKSA/IEVWVF9LRVlVUCA6IEVWVF9LRVlET1dOOwotCXNjYW4gJj0gMHg3RjsKLQlpZiAoZXh0ZW5kZWQpIHsKLQkgICAgZXh0ZW5kZWQgPSAwOwotCSAgICBpZiAoc2NhbiA9PSAweDJBIHx8IHNjYW4gPT0gMHgzNikgewotCQkvKiBJZ25vcmUgdGhlc2UgZXh0ZW5kZWQgc2NhbiBjb2RlIHNlcXVlbmNlcy4gVGhlc2UgYXJlCi0JCSAqIHVzZWQgYnkgdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIgdG8gd3JhcCBhcm91bmQgY2VydGFpbgotCQkgKiBrZXkgc2VxdWVuY2VzIGZvciB0aGUga2V5cGFkIChhbmQgd2hlbiBOVU1MT0NLIGlzIGRvd24KLQkJICogaW50ZXJuYWxseSkuCi0JCSAqLwotCQlyZXR1cm47Ci0JCX0KLQotCSAgICAvKiBDb252ZXJ0IGV4dGVuZGVkIGNvZGVzIGZvciBrZXkgc2VxdWVuY2VzIHRoYXQgd2UgbWFwIHRvCi0JICAgICAqIHZpcnR1YWwgc2NhbiBjb2RlcyBzbyB0aGUgdXNlciBjYW4gZGV0ZWN0IHRoZW0gaW4gdGhlaXIKLQkgICAgICogY29kZS4KLQkgICAgICovCi0JICAgIHN3aXRjaCAoc2NhbikgewotCQljYXNlIEtCX2xlZnRDdHJsOiAgIHNjYW4gPSBLQl9yaWdodEN0cmw7ICAgIGJyZWFrOwotCQljYXNlIEtCX2xlZnRBbHQ6ICAgIHNjYW4gPSBLQl9yaWdodEFsdDsgICAgIGJyZWFrOwotCQljYXNlIEtCX2RpdmlkZTogICAgIHNjYW4gPSBLQl9wYWREaXZpZGU7ICAgIGJyZWFrOwotCQljYXNlIEtCX2VudGVyOiAgICAgIHNjYW4gPSBLQl9wYWRFbnRlcjsgICAgIGJyZWFrOwotCQljYXNlIEtCX3BhZFRpbWVzOiAgIHNjYW4gPSBLQl9zeXNSZXE7ICAgICAgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgLyogQ29udmVydCByZWd1bGFyIHNjYW4gY29kZXMgZm9yIGtleSBzZXF1ZW5jZXMgdGhhdCB3ZSBtYXAgdG8KLQkgICAgICogdmlydHVhbCBzY2FuIGNvZGVzIHNvIHRoZSB1c2VyIGNhbiBkZXRlY3QgdGhlbSBpbiB0aGVpcgotCSAgICAgKiBjb2RlLgotCSAgICAgKi8KLQkgICAgc3dpdGNoIChzY2FuKSB7Ci0JCWNhc2UgS0JfbGVmdDogICAgICAgc2NhbiA9IEtCX3BhZExlZnQ7ICAgICAgYnJlYWs7Ci0JCWNhc2UgS0JfcmlnaHQ6ICAgICAgc2NhbiA9IEtCX3BhZFJpZ2h0OyAgICAgYnJlYWs7Ci0JCWNhc2UgS0JfdXA6ICAgICAgICAgc2NhbiA9IEtCX3BhZFVwOyAgICAgICAgYnJlYWs7Ci0JCWNhc2UgS0JfZG93bjogICAgICAgc2NhbiA9IEtCX3BhZERvd247ICAgICAgYnJlYWs7Ci0JCWNhc2UgS0JfaW5zZXJ0OiAgICAgc2NhbiA9IEtCX3BhZEluc2VydDsgICAgYnJlYWs7Ci0JCWNhc2UgS0JfZGVsZXRlOiAgICAgc2NhbiA9IEtCX3BhZERlbGV0ZTsgICAgYnJlYWs7Ci0JCWNhc2UgS0JfaG9tZTogICAgICAgc2NhbiA9IEtCX3BhZEhvbWU7ICAgICAgYnJlYWs7Ci0JCWNhc2UgS0JfZW5kOiAgICAgICAgc2NhbiA9IEtCX3BhZEVuZDsgICAgICAgYnJlYWs7Ci0JCWNhc2UgS0JfcGFnZVVwOiAgICAgc2NhbiA9IEtCX3BhZFBhZ2VVcDsgICAgYnJlYWs7Ci0JCWNhc2UgS0JfcGFnZURvd246ICAgc2NhbiA9IEtCX3BhZFBhZ2VEb3duOyAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JLyogRGV0ZXJtaW5lIGlmIHRoZSBrZXkgaXMgYW4gVVAsIERPV04gb3IgUkVQRUFUIGFuZCBtYWludGFpbiB0aGUKLQkgKiB1cC9kb3duIHN0YXR1cyBvZiBhbGwga2V5cyBpbiBvdXIgZ2xvYmFsIGtleSBhcnJheS4KLQkgKi8KLQlpZiAod2hhdCA9PSBFVlRfS0VZRE9XTikgewotCSAgICBpZiAoRVZULmtleVRhYmxlW3NjYW5dKQotCQl3aGF0ID0gRVZUX0tFWVJFUEVBVDsKLQkgICAgZWxzZQotCQlFVlQua2V5VGFibGVbc2Nhbl0gPSBzY2FuOwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIEVWVC5rZXlUYWJsZVtzY2FuXSA9IDA7Ci0JICAgIH0KLQotCS8qIEhhbmRsZSBzaGlmdCBrZXkgbW9kaWZpZXJzICovCi0JaWYgKHdoYXQgIT0gRVZUX0tFWVJFUEVBVCkgewotCSAgICBzd2l0Y2ggKHNjYW4pIHsKLQkJY2FzZSBLQl9jYXBzTG9jazoKLQkJICAgIGlmICh3aGF0ID09IEVWVF9LRVlET1dOKQotCQkJRVZULmtleU1vZGlmaWVycyBePSBFVlRfQ0FQU0xPQ0s7Ci0JCSAgICBzZXRMRURTKEVWVC5rZXlNb2RpZmllcnMpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgS0JfbnVtTG9jazoKLQkJICAgIGlmICh3aGF0ID09IEVWVF9LRVlET1dOKQotCQkJRVZULmtleU1vZGlmaWVycyBePSBFVlRfTlVNTE9DSzsKLQkJICAgIHNldExFRFMoRVZULmtleU1vZGlmaWVycyk7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBLQl9zY3JvbGxMb2NrOgotCQkgICAgaWYgKHdoYXQgPT0gRVZUX0tFWURPV04pCi0JCQlFVlQua2V5TW9kaWZpZXJzIF49IEVWVF9TQ1JPTExMT0NLOwotCQkgICAgc2V0TEVEUyhFVlQua2V5TW9kaWZpZXJzKTsKLQkJICAgIGJyZWFrOwotCQljYXNlIEtCX2xlZnRTaGlmdDoKLQkJICAgIGlmICh3aGF0ID09IEVWVF9LRVlVUCkKLQkJCUVWVC5rZXlNb2RpZmllcnMgJj0gfkVWVF9MRUZUU0hJRlQ7Ci0JCSAgICBlbHNlCi0JCQlFVlQua2V5TW9kaWZpZXJzIHw9IEVWVF9MRUZUU0hJRlQ7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBLQl9yaWdodFNoaWZ0OgotCQkgICAgaWYgKHdoYXQgPT0gRVZUX0tFWVVQKQotCQkJRVZULmtleU1vZGlmaWVycyAmPSB+RVZUX1JJR0hUU0hJRlQ7Ci0JCSAgICBlbHNlCi0JCQlFVlQua2V5TW9kaWZpZXJzIHw9IEVWVF9SSUdIVFNISUZUOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgS0JfbGVmdEN0cmw6Ci0JCSAgICBpZiAod2hhdCA9PSBFVlRfS0VZVVApCi0JCQlFVlQua2V5TW9kaWZpZXJzICY9IH5FVlRfTEVGVENUUkw7Ci0JCSAgICBlbHNlCi0JCQlFVlQua2V5TW9kaWZpZXJzIHw9IEVWVF9MRUZUQ1RSTDsKLQkJICAgIGJyZWFrOwotCQljYXNlIEtCX3JpZ2h0Q3RybDoKLQkJICAgIGlmICh3aGF0ID09IEVWVF9LRVlVUCkKLQkJCUVWVC5rZXlNb2RpZmllcnMgJj0gfkVWVF9SSUdIVENUUkw7Ci0JCSAgICBlbHNlCi0JCQlFVlQua2V5TW9kaWZpZXJzIHw9IEVWVF9SSUdIVENUUkw7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBLQl9sZWZ0QWx0OgotCQkgICAgaWYgKHdoYXQgPT0gRVZUX0tFWVVQKQotCQkJRVZULmtleU1vZGlmaWVycyAmPSB+RVZUX0xFRlRBTFQ7Ci0JCSAgICBlbHNlCi0JCQlFVlQua2V5TW9kaWZpZXJzIHw9IEVWVF9MRUZUQUxUOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgS0JfcmlnaHRBbHQ6Ci0JCSAgICBpZiAod2hhdCA9PSBFVlRfS0VZVVApCi0JCQlFVlQua2V5TW9kaWZpZXJzICY9IH5FVlRfUklHSFRBTFQ7Ci0JCSAgICBlbHNlCi0JCQlFVlQua2V5TW9kaWZpZXJzIHw9IEVWVF9SSUdIVEFMVDsKLQkJICAgIGJyZWFrOwotI2lmZGVmIFNVUFBPUlRfQ1RSTF9BTFRfREVMCi0JCWNhc2UgS0JfZGVsZXRlOgotCQkgICAgaWYgKChFVlQua2V5TW9kaWZpZXJzICYgRVZUX0NUUkxTVEFURSkgJiYgKEVWVC5rZXlNb2RpZmllcnMgJiBFVlRfQUxUU1RBVEUpKQotCQkJUmVib290KCk7Ci0JCSAgICBicmVhazsKLSNlbmRpZgotCQl9Ci0JICAgIH0KLQotCS8qIEFkZCB0aGUgdW50cmFuc2xhdGVkIGtleSBjb2RlIHRvIHRoZSBldmVudCBxdWV1ZS4gQWxsCi0JICogdHJhbnNsYXRpb24gdG8gQVNDSUkgZnJvbSB0aGUga2V5IGNvZGVzIG9jY3VycyB3aGVuIHRoZSBrZXkKLQkgKiBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgcXVldWUsIHNhdmluZyB0aW1lIGluIHRoZSBsb3cgbGV2ZWwKLQkgKiBpbnRlcnJ1cHQgaGFuZGxlci4KLQkgKi8KLQlhZGRLZXlFdmVudCh3aGF0LHNjYW4gPDwgOCk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1FbmFibGVzL2Rpc2FibGVzIHRoZSB1cGRhdGUgb2YgdGhlIGtleWJvYXJkIExFRCBzdGF0dXMgaW5kaWNhdG9ycy4KLQotSEVBREVSOgotZXZlbnQuaAotCi1QQVJBTUVURVJTOgotZW5hYmxlICAtIFRydWUgdG8gZW5hYmxlLCBmYWxzZSB0byBkaXNhYmxlCi0KLVJFTUFSS1M6Ci1FbmFibGVzIHRoZSB1cGRhdGUgb2YgdGhlIGtleWJvYXJkIExFRCBzdGF0dXMgaW5kaWNhdG9ycy4gU29tZXRpbWVzIGl0IG1heQotYmUgY29udmVuaWVudCBpbiB0aGUgYXBwbGljYXRpb24gdG8gdHVybiBvZmYgdGhlIHVwZGF0aW5nIG9mIHRoZSBMRUQKLXN0YXR1cyBpbmRpY2F0b3JzIChzdWNoIGFzIGlmIGEgZ2FtZSBpcyB1c2luZyB0aGUgQ0FQU0xPQ0sga2V5IGZvciBzb21lCi1mdW5jdGlvbikuIFBhc3NpbmcgaW4gYSB2YWx1ZSBvZiBGQUxTRSB0byB0aGlzIGZ1bmN0aW9uIHdpbGwgdHVybiBvZmYgYWxsCi10aGUgTEVEUywgYW5kIHN0b3AgdXBkYXRpbmcgdGhlbSB3aGVuIHRoZSBpbnRlcm5hbCBzdGF0dXMgY2hhbmdlcyAobm90ZQotaG93ZXZlciB0aGF0IGludGVybmFsbHkgd2Ugc3RpbGwga2VlcCB0cmFjayBvZiB0aGUgdG9nZ2xlIGtleSBzdGF0dXMhKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfYWxsb3dMRURTKAotICAgIGlib29sIGVuYWJsZSkKLXsKLSAgICBFVlQuYWxsb3dMRURTID0gdHJ1ZTsKLSAgICBpZiAoZW5hYmxlKQotCXNldExFRFMoRVZULmtleU1vZGlmaWVycyk7Ci0gICAgZWxzZQotCXNldExFRFMoMCk7Ci0gICAgRVZULmFsbG93TEVEUyA9IGVuYWJsZTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9tYWxsb2MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9tYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlZjIyMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vbWFsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIGZvciBpbXBsZW1lbnRpbmcgdGhlIFBNIGxpYnJhcnkgb3ZlcnJpZGVhYmxlIG1lbW9yeQotKiAgICAgICAgICAgICAgIGFsbG9jYXRvciBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCAqICgqX19QTV9tYWxsb2MpKHNpemVfdCBzaXplKSAgICAgICAgICAgICAgPSBtYWxsb2M7Ci12b2lkICogKCpfX1BNX2NhbGxvYykoc2l6ZV90IG5lbGVtLHNpemVfdCBzaXplKSA9IGNhbGxvYzsKLXZvaWQgKiAoKl9fUE1fcmVhbGxvYykodm9pZCAqcHRyLHNpemVfdCBzaXplKSAgID0gcmVhbGxvYzsKLXZvaWQgKCpfX1BNX2ZyZWUpKHZvaWQgKnApICAgICAgICAgICAgICAgICAgICAgID0gZnJlZTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotVXNlIGxvY2FsIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLgotCi1IRUFERVI6Ci1wbWFwaS5oCi0KLVBBUkFNRVRFUlM6Ci1tYWxsb2MgIC0gUG9pbnRlciB0byBuZXcgbWFsbG9jIHJvdXRpbmUgdG8gdXNlCi1jYWxsb2MgIC0gUG9pbnRlciB0byBuZXcgY2FhbGxvYyByb3V0aW5lIHRvIHVzZQotcmVhbGxvYyAtIFBvaW50ZXIgdG8gbmV3IHJlYWxsb2Mgcm91dGluZSB0byB1c2UKLWZyZWUgICAgLSBQb2ludGVyIHRvIG5ldyBmcmVlIHJvdXRpbmUgdG8gdXNlCi0KLVJFTUFSS1M6Ci1UZWxscyB0aGUgUE0gbGlicmFyeSB0byB1c2UgYSBzZXQgb2YgdXNlciBzcGVjaWZpZWQgbWVtb3J5IGFsbG9jYXRpb24KLXJvdXRpbmVzIGluc3RlYWQgb2YgdXNpbmcgdGhlIG5vcm1hbCBtYWxsb2MvY2FsbG9jL3JlYWxsb2MvZnJlZSBzdGFuZGFyZAotQyBsaWJyYXJ5IGZ1bmN0aW9ucy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdpc2ggdG8gdXNlIGEgdGhpcmQgcGFydHkKLWRlYnVnZ2luZyBtYWxsb2MgbGlicmFyeSBvciBwZXJoYXBzIGEgc2V0IG9mIGZhc3RlciBtZW1vcnkgYWxsb2NhdGlvbgotZnVuY3Rpb25zIHdpdGggdGhlIFBNIGxpYnJhcnksIG9yIGFueSBhcHBzIHRoYXQgdXNlIHRoZSBQTSBsaWJyYXJ5IChzdWNoIGFzCi10aGUgTUdMKS4gT25jZSB5b3UgaGF2ZSByZWdpc3RlcmVkIHlvdXIgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMsIGFsbAotY2FsbHMgdG8gUE1fbWFsbG9jLCBQTV9jYWxsb2MsIFBNX3JlYWxsb2MgYW5kIFBNX2ZyZWUgd2lsbCBiZSByZXZlY3RvcmVkIHRvCi15b3VyIGxvY2FsIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLgotCi1UaGlzIGlzIGFsc28gdXNlZnVsIGlmIHlvdSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YganVzdCBob3cgbXVjaCBwaHlzaWNhbAotbWVtb3J5IHlvdXIgcHJvZ3JhbSBoYXMgYmVlbiB1c2luZy4gWW91IGNhbiB1c2UgdGhlIFBNX2F2YWlsYWJsZU1lbW9yeQotZnVuY3Rpb24gdG8gZmluZCBvdXQgaG93IG11Y2ggcGh5c2ljYWwgbWVtb3J5IGlzIGF2YWlsYWJsZSB3aGVuIHRoZSBwcm9ncmFtCi1zdGFydHMsIGFuZCB0aGVuIHlvdSBjYW4gdXNlIHlvdXIgb3duIGxvY2FsIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIHRvCi1rZWVwIHRyYWNrIG9mIGhvdyBtdWNoIG1lbW9yeSBoYXMgYmVlbiB1c2VkIGFuZCBmcmVlZC4KLQotTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGF0IHRoZSBzdGFydCBvZiB5b3VyIGFwcGxpY2F0aW9uLAotICAgICAgYmVmb3JlIHlvdSBpbml0aWFsaXNlIGFueSBvdGhlciBjb21wb25lbnRzIG9yIGxpYnJhcmllcy4KLQotTk9URTogQ29kZSBjb21waWxlZCBpbnRvIEJpbmFyeSBQb3J0YWJsZSBETEwncyBhbmQgRHJpdmVycyBhdXRvbWF0aWNhbGx5Ci0gICAgICBlbmQgdXAgY2FsbGluZyB0aGVzZSBmdW5jdGlvbnMgdmlhIHRoZSBCUEQgQyBydW50aW1lIGxpYnJhcnkuCi0KLVNFRSBBTFNPOgotUE1fbWFsbG9jLCBQTV9jYWxsb2MsIFBNX3JlYWxsb2MsIFBNX2ZyZWUsIFBNX2F2YWlsYWJsZU1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fdXNlTG9jYWxNYWxsb2MoCi0gICAgdm9pZCAqICgqbWFsbG9jKShzaXplX3Qgc2l6ZSksCi0gICAgdm9pZCAqICgqY2FsbG9jKShzaXplX3QgbmVsZW0sc2l6ZV90IHNpemUpLAotICAgIHZvaWQgKiAoKnJlYWxsb2MpKHZvaWQgKnB0cixzaXplX3Qgc2l6ZSksCi0gICAgdm9pZCAoKmZyZWUpKHZvaWQgKnApKQotewotICAgIF9fUE1fbWFsbG9jID0gbWFsbG9jOwotICAgIF9fUE1fY2FsbG9jID0gY2FsbG9jOwotICAgIF9fUE1fcmVhbGxvYyA9IHJlYWxsb2M7Ci0gICAgX19QTV9mcmVlID0gZnJlZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQWxsb2NhdGUgYSBibG9jayBvZiBtZW1vcnkuCi0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLXNpemUgICAgLSBTaXplIG9mIGJsb2NrIHRvIGFsbG9jYXRlIGluIGJ5dGVzCi0KLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIGFsbG9jYXRlZCBibG9jaywgb3IgTlVMTCBpZiBvdXQgb2YgbWVtb3J5LgotCi1SRU1BUktTOgotQWxsb2NhdGVzIGEgYmxvY2sgb2YgbWVtb3J5IG9mIGxlbmd0aCBzaXplLiBJZiB5b3UgaGF2ZSBjaGFuZ2VkIHRoZSBtZW1vcnkKLWFsbG9jYXRpb24gcm91dGluZXMgd2l0aCB0aGUgUE1fdXNlTG9jYWxNYWxsb2MgZnVuY3Rpb24sIHRoZW4gY2FsbHMgdG8gdGhpcwotZnVuY3Rpb24gd2lsbCBhY3R1YWxseSBtYWtlIGNhbGxzIHRvIHRoZSBsb2NhbCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcwotdGhhdCB5b3UgaGF2ZSByZWdpc3RlcmVkLgotCi1TRUUgQUxTTzoKLVBNX2NhbGxvYywgUE1fcmVhbGxvYywgUE1fZnJlZSwgUE1fdXNlTG9jYWxNYWxsb2MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFsbG9jKAotICAgIHNpemVfdCBzaXplKQotewotICAgIHJldHVybiBfX1BNX21hbGxvYyhzaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQWxsb2NhdGUgYW5kIGNsZWFyIGEgbGFyZ2UgbWVtb3J5IGJsb2NrLgotCi1IRUFERVI6Ci1wbWFwaS5oCi0KLVBBUkFNRVRFUlM6Ci1uZWxlbSAgIC0gbnVtYmVyIG9mIGNvbnRpZ3VvdXMgc2l6ZS1ieXRlIHVuaXRzIHRvIGFsbG9jYXRlCi1zaXplICAgIC0gc2l6ZSBvZiB1bml0IGluIGJ5dGVzCi0KLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnkgaWYgc3VjY2Vzc2Z1bCwgTlVMTCBpZiBvdXQgb2YgbWVtb3J5LgotCi1SRU1BUktTOgotQWxsb2NhdGVzIGEgYmxvY2sgb2YgbWVtb3J5IG9mIGxlbmd0aCAoc2l6ZSAqIG5lbGVtKSwgYW5kIGNsZWFycyB0aGUKLWFsbG9jYXRlZCBhcmVhIHdpdGggemVyb3MgKDApLiBJZiB5b3UgaGF2ZSBjaGFuZ2VkIHRoZSBtZW1vcnkgYWxsb2NhdGlvbgotcm91dGluZXMgd2l0aCB0aGUgUE1fdXNlTG9jYWxNYWxsb2MgZnVuY3Rpb24sIHRoZW4gY2FsbHMgdG8gdGhpcyBmdW5jdGlvbgotd2lsbCBhY3R1YWxseSBtYWtlIGNhbGxzIHRvIHRoZSBsb2NhbCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyB0aGF0IHlvdQotaGF2ZSByZWdpc3RlcmVkLgotCi1TRUUgQUxTTzoKLVBNX21hbGxvYywgUE1fcmVhbGxvYywgUE1fZnJlZSwgUE1fdXNlTG9jYWxNYWxsb2MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fY2FsbG9jKAotICAgIHNpemVfdCBuZWxlbSwKLSAgICBzaXplX3Qgc2l6ZSkKLXsKLSAgICByZXR1cm4gX19QTV9jYWxsb2MobmVsZW0sc2l6ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJlLWFsbG9jYXRlIGEgYmxvY2sgb2YgbWVtb3J5Ci0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLXB0ciAgICAgLSBQb2ludGVyIHRvIGJsb2NrIHRvIHJlc2l6ZQotc2l6ZSAgICAtIHNpemUgb2YgdW5pdCBpbiBieXRlcwotCi1SRVRVUk5TOgotUG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5IGlmIHN1Y2Nlc3NmdWwsIE5VTEwgaWYgb3V0IG9mIG1lbW9yeS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhbGxvY2F0ZXMgYSBibG9jayBvZiBtZW1vcnkgdGhhdCBoYXMgYmVlbiBwcmV2aW91c2x5IGJlZW4KLWFsbG9jYXRlZCB0byB0aGUgbmV3IG9mIHNpemUuIFRoZSBuZXcgc2l6ZSBtYXkgYmUgc21hbGxlciBvciBsYXJnZXIgdGhhbgotdGhlIG9yaWdpbmFsIGJsb2NrIG9mIG1lbW9yeS4gSWYgeW91IGhhdmUgY2hhbmdlZCB0aGUgbWVtb3J5IGFsbG9jYXRpb24KLXJvdXRpbmVzIHdpdGggdGhlIFBNX3VzZUxvY2FsTWFsbG9jIGZ1bmN0aW9uLCB0aGVuIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24KLXdpbGwgYWN0dWFsbHkgbWFrZSBjYWxscyB0byB0aGUgbG9jYWwgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgdGhhdCB5b3UKLWhhdmUgcmVnaXN0ZXJlZC4KLQotU0VFIEFMU086Ci1QTV9tYWxsb2MsIFBNX2NhbGxvYywgUE1fZnJlZSwgUE1fdXNlTG9jYWxNYWxsb2MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fcmVhbGxvYygKLSAgICB2b2lkICpwdHIsCi0gICAgc2l6ZV90IHNpemUpCi17Ci0gICAgcmV0dXJuIF9fUE1fcmVhbGxvYyhwdHIsc2l6ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUZyZWVzIGEgYmxvY2sgb2YgbWVtb3J5LgotCi1IRUFERVI6Ci1wbWFwaS5oCi0KLVBBUkFNRVRFUlM6Ci1wICAgLSBQb2ludGVyIHRvIG1lbW9yeSBibG9jayB0byBmcmVlCi0KLVJFTUFSS1M6Ci1GcmVlcyBhIGJsb2NrIG9mIG1lbW9yeSBwcmV2aW91c2x5IGFsbG9jYXRlZCB3aXRoIGVpdGhlciBQTV9tYWxsb2MsCi1QTV9jYWxsb2Mgb3IgUE1fcmVhbGxvYy4KLQotU0VFIEFMU086Ci1QTV9tYWxsb2MsIFBNX2NhbGxvYywgUE1fcmVhbGxvYywgUE1fdXNlTG9jYWxNYWxsb2MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWUoCi0gICAgdm9pZCAqcCkKLXsKLSAgICBfX1BNX2ZyZWUocCk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vbXRyci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL210cnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVkNWY0NS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vbXRyci5jCisrKyAvZGV2L251bGwKQEAgLTEsODY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICAgICAgICAgICAgIEhlYXZpbHkgYmFzZWQgb24gY29kZSBjb3B5cmlnaHQgKEMpIFJpY2hhcmQgR29vY2gKLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgUmluZyAwIGRldmljZSBkcml2ZXIKLSoKLSogRGVzY3JpcHRpb246ICBHZW5lcmljIE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVyIChNVFJSKSBmdW5jdGlvbnMgdG8KLSogICAgICAgICAgICAgICBtYW5pcHVsYXRlIHRoZSBNVFJSIHJlZ2lzdGVycyBvbiBzdXBwb3J0ZWQgQ1BVJ3MuIFRoaXMgY29kZQotKiAgICAgICAgICAgICAgICptdXN0KiBydW4gYXQgcmluZyAwLCBzbyB5b3UgY2FuJ3Qgbm9ybWFsbHkgaW5jbHVkZSB0aGlzCi0qICAgICAgICAgICAgICAgY29kZSBkaXJlY3RseSBpbiBub3JtYWwgYXBwbGljYXRpb25zICh0aGUgZXhjZXB0IGlzIERPUzRHVwotKiAgICAgICAgICAgICAgIGFwcHMgd2hpY2ggcnVuIGF0IHJpbmcgMCB1bmRlciByZWFsIERPUykuIFRodXMgdGhpcyBjb2RlCi0qICAgICAgICAgICAgICAgd2lsbCBub3JtYWxseSBiZSBjb21waWxlZCBpbnRvIGEgcmluZyAwIGRldmljZSBkcml2ZXIgZm9yCi0qICAgICAgICAgICAgICAgdGhlIHRhcmdldCBvcGVyYXRpbmcgc3lzdGVtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAienRpbWVyYy5oIgotI2luY2x1ZGUgIm10cnIuaCIKLQotI2lmbmRlZiBSRUFMTU9ERQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBJbnRlbCBwcmUtZGVmaW5lZCBNVFJSIHJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIE5VTV9GSVhFRF9SQU5HRVMgICAgICAgIDg4Ci0jZGVmaW5lIElOVEVMX2NhcF9NU1IgICAgICAgICAgIDB4MEZFCi0jZGVmaW5lIElOVEVMX2RlZlR5cGVfTVNSICAgICAgIDB4MkZGCi0jZGVmaW5lIElOVEVMX2ZpeDY0S18wMDAwMF9NU1IgIDB4MjUwCi0jZGVmaW5lIElOVEVMX2ZpeDE2S184MDAwMF9NU1IgIDB4MjU4Ci0jZGVmaW5lIElOVEVMX2ZpeDE2S19BMDAwMF9NU1IgIDB4MjU5Ci0jZGVmaW5lIElOVEVMX2ZpeDRLX0MwMDAwX01TUiAgIDB4MjY4Ci0jZGVmaW5lIElOVEVMX2ZpeDRLX0M4MDAwX01TUiAgIDB4MjY5Ci0jZGVmaW5lIElOVEVMX2ZpeDRLX0QwMDAwX01TUiAgIDB4MjZBCi0jZGVmaW5lIElOVEVMX2ZpeDRLX0Q4MDAwX01TUiAgIDB4MjZCCi0jZGVmaW5lIElOVEVMX2ZpeDRLX0UwMDAwX01TUiAgIDB4MjZDCi0jZGVmaW5lIElOVEVMX2ZpeDRLX0U4MDAwX01TUiAgIDB4MjZECi0jZGVmaW5lIElOVEVMX2ZpeDRLX0YwMDAwX01TUiAgIDB4MjZFCi0jZGVmaW5lIElOVEVMX2ZpeDRLX0Y4MDAwX01TUiAgIDB4MjZGCi0KLS8qIE1hY3JvcyB0byBmaW5kIHRoZSBhZGRyZXNzIG9mIGEgcGFyaWN1bGFyIE1TUiByZWdpc3RlciAqLwotCi0jZGVmaW5lIElOVEVMX3BoeXNCYXNlX01TUihyZWcpICgweDIwMCArIDIgKiAocmVnKSkKLSNkZWZpbmUgSU5URUxfcGh5c01hc2tfTVNSKHJlZykgKDB4MjAwICsgMiAqIChyZWcpICsgMSkKLQotLyogQ3lyaXggQ1BVIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaW5kZXhlcyAqLwotI2RlZmluZSBDWDg2X0NDUjAgMHhDMAotI2RlZmluZSBDWDg2X0NDUjEgMHhDMQotI2RlZmluZSBDWDg2X0NDUjIgMHhDMgotI2RlZmluZSBDWDg2X0NDUjMgMHhDMwotI2RlZmluZSBDWDg2X0NDUjQgMHhFOAotI2RlZmluZSBDWDg2X0NDUjUgMHhFOQotI2RlZmluZSBDWDg2X0NDUjYgMHhFQQotI2RlZmluZSBDWDg2X0RJUjAgMHhGRQotI2RlZmluZSBDWDg2X0RJUjEgMHhGRgotI2RlZmluZSBDWDg2X0FSUl9CQVNFIDB4QzQKLSNkZWZpbmUgQ1g4Nl9SQ1JfQkFTRSAweERDCi0KLS8qIFN0cnVjdHVyZSB0byBtYWludGFpbiBtYWNoaW5lIHN0YXRlIHdoaWxlIHVwZGF0aW5nIE1UUlIgcmVnaXN0ZXJzICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIGZsYWdzOwotICAgIHVsb25nICAgZGVmVHlwZUxvOwotICAgIHVsb25nICAgZGVmVHlwZUhpOwotICAgIHVsb25nICAgY3I0VmFsOwotICAgIHVsb25nICAgY2NyMzsKLSAgICB9IE1UUlJDb250ZXh0OwotCi1zdGF0aWMgaW50ICAgICAgbnVtTVRSUiA9IC0xOwotc3RhdGljIGludCAgICAgIGNwdUZhbWlseSxjcHVUeXBlLGNwdVN0ZXBwaW5nOwotc3RhdGljIHZvaWQgICAgICgqZ2V0TVRSUikodWludCByZWcsdWxvbmcgKmJhc2UsdWxvbmcgKnNpemUsaW50ICp0eXBlKSA9IE5VTEw7Ci1zdGF0aWMgdm9pZCAgICAgKCpzZXRNVFJSKSh1aW50IHJlZyx1bG9uZyBiYXNlLHVsb25nIHNpemUsaW50IHR5cGUpID0gTlVMTDsKLXN0YXRpYyBpbnQgICAgICAoKmdldEZyZWVSZWdpb24pKHVsb25nIGJhc2UsdWxvbmcgc2l6ZSkgPSBOVUxMOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVJldHVybnMgbm9uLXplcm8gaWYgd2UgaGF2ZSB0aGUgd3JpdGUtY29tYmluaW5nIG1lbW9yeSB0eXBlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBNVFJSX2hhdmVXcml0ZUNvbWJpbmUodm9pZCkKLXsKLSAgICB1bG9uZyAgIGNvbmZpZyxkdW1teTsKLQotICAgIHN3aXRjaCAoY3B1RmFtaWx5KSB7Ci0JY2FzZSBDUFVfQU1EOgotCSAgICBpZiAoY3B1VHlwZSA8IENQVV9BTURBdGhsb24pIHsKLQkJLyogQU1EIEs2LTIgc3RlcHBpbmcgOCBhbmQgbGF0ZXIgc3VwcG9ydCB0aGUgTVRSUiByZWdpc3RlcnMuCi0JCSAqIFRoZSBlYXJsaWVyIEs2LTIgc3RlcHBpbmdzICgzMDBNaHogbW9kZWxzKSBkbyBub3QKLQkJICogc3VwcG9ydCBNVFJSJ3MuCi0JCSAqLwotCQlpZiAoKGNwdVR5cGUgPCBDUFVfQU1ESzZfMikgfHwgKGNwdVR5cGUgPT0gQ1BVX0FNREs2XzIgJiYgY3B1U3RlcHBpbmcgPCA4KSkKLQkJICAgIHJldHVybiAwOwotCQlyZXR1cm4gMTsKLQkJfQotCSAgICAvKiBGYWxsIHRocm91Z2ggZm9yIEFNRCBBdGhsb24gd2hpY2ggdXNlcyBQNiBzdHlsZSBNVFJSJ3MgKi8KLQljYXNlIENQVV9JbnRlbDoKLQkgICAgX01UUlJfcmVhZE1TUihJTlRFTF9jYXBfTVNSLCZjb25maWcsJmR1bW15KTsKLQkgICAgcmV0dXJuIChjb25maWcgJiAoMSA8PCAxMCkpOwotCWNhc2UgQ1BVX0N5cml4OgotCSAgICAvKiBDeXJpeCA2eDg2IGFuZCBsYXRlciBzdXBwb3J0IHRoZSBNVFJSIHJlZ2lzdGVycyAqLwotCSAgICBpZiAoY3B1VHlwZSA8IENQVV9DeXJpeDZ4ODYpCi0JCXJldHVybiAwOwotCSAgICByZXR1cm4gMTsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLQotUkVUVVJOUzoKLVRoZSBpbmRleCBvZiB0aGUgcmVnaW9uIG9uIHN1Y2Nlc3MsIGVsc2UgLTEgb24gZXJyb3IuCi0KLVJFTUFSS1M6Ci1HZW5lcmljIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIGEgZnJlZSBNVFJSIHJlZ2lzdGVyIHRvIGJlIHVzZWQKLWZvciBjcmVhdGluZyBhIG5ldyBtYXBwaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgR0VORVJJQ19nZXRGcmVlUmVnaW9uKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgc2l6ZSkKLXsKLSAgICBpbnQgICAgIGksbHR5cGU7Ci0gICAgdWxvbmcgICBsYmFzZSxsc2l6ZTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1NVFJSOyBpKyspIHsKLQlnZXRNVFJSKGksJmxiYXNlLCZsc2l6ZSwmbHR5cGUpOwotCWlmIChsc2l6ZSA8IDEpCi0JICAgIHJldHVybiBpOwotCX0KLSAgICAodm9pZCliYXNlOwotICAgICh2b2lkKXNpemU7Ci0gICAgcmV0dXJuIC0xOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi0KLVJFVFVSTlM6Ci1UaGUgaW5kZXggb2YgdGhlIHJlZ2lvbiBvbiBzdWNjZXNzLCBlbHNlIC0xIG9uIGVycm9yLgotCi1SRU1BUktTOgotR2VuZXJpYyBmdW5jdGlvbiB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiBhIGZyZWUgTVRSUiByZWdpc3RlciB0byBiZSB1c2VkCi1mb3IgY3JlYXRpbmcgYSBuZXcgbWFwcGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IEFNREs2X2dldEZyZWVSZWdpb24oCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplKQotewotICAgIGludCAgICAgaSxsdHlwZTsKLSAgICB1bG9uZyAgIGxiYXNlLGxzaXplOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bU1UUlI7IGkrKykgewotCWdldE1UUlIoaSwmbGJhc2UsJmxzaXplLCZsdHlwZSk7Ci0JaWYgKGxzaXplIDwgMSkKLQkgICAgcmV0dXJuIGk7Ci0JfQotICAgICh2b2lkKWJhc2U7Ci0gICAgKHZvaWQpc2l6ZTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLQotUkVUVVJOUzoKLVRoZSBpbmRleCBvZiB0aGUgcmVnaW9uIG9uIHN1Y2Nlc3MsIGVsc2UgLTEgb24gZXJyb3IuCi0KLVJFTUFSS1M6Ci1DeXJpeCBzcGVjaWZpYyBmdW5jdGlvbiB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiBhIGZyZWUgTVRSUiByZWdpc3RlciB0byBiZQotdXNlZCBmb3IgY3JlYXRpbmcgYSBuZXcgbWFwcGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IENZUklYX2dldEZyZWVSZWdpb24oCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplKQotewotICAgIGludCAgICAgaSxsdHlwZTsKLSAgICB1bG9uZyAgIGxiYXNlLCBsc2l6ZTsKLQotICAgIGlmIChzaXplID4gMHgyMDAwMDAwVUwpIHsKLQkvKiBJZiB3ZSBhcmUgdG8gc2V0IHVwIGEgcmVnaW9uID4zMk0gdGhlbiBsb29rIGF0IEFSUjcgaW1tZWRpYXRlbHkgKi8KLQlnZXRNVFJSKDcsJmxiYXNlLCZsc2l6ZSwmbHR5cGUpOwotCWlmIChsc2l6ZSA8IDEpCi0JICAgIHJldHVybiA3OwotCX0KLSAgICBlbHNlIHsKLQkvKiBDaGVjayBBUlIwLTYgcmVnaXN0ZXJzICovCi0JZm9yIChpID0gMDsgaSA8IDc7IGkrKykgewotCSAgICBnZXRNVFJSKGksJmxiYXNlLCZsc2l6ZSwmbHR5cGUpOwotCSAgICBpZiAobHNpemUgPCAxKQotCQlyZXR1cm4gaTsKLQkgICAgfQotCS8qIFRyeSBBUlI3IGJ1dCBpdHMgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IDI1NksgKi8KLQlnZXRNVFJSKDcsJmxiYXNlLCZsc2l6ZSwmbHR5cGUpOwotCWlmICgobHNpemUgPCAxKSAmJiAoc2l6ZSA+PSAweDQwMDAwKSkKLQkgICAgcmV0dXJuIGk7Ci0JfQotICAgICh2b2lkKWJhc2U7Ci0gICAgcmV0dXJuIC0xOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWMgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBtYWNoaW5lIGNvbnRleHQgYWNyb3NzIHRoZSBjYWxsCi0KLVJFTUFSS1M6Ci1QdXRzIHRoZSBwcm9jZXNzb3IgaW50byBhIHN0YXRlIHdoZXJlIE1UUlJzIGNhbiBiZSBzYWZlbHkgdXBkYXRlZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIE1UUlJfYmVnaW5VcGRhdGUoCi0gICAgTVRSUkNvbnRleHQgKmMpCi17Ci0gICAgYy0+ZmxhZ3MgPSBfTVRSUl9kaXNhYmxlSW50KCk7Ci0gICAgaWYgKGNwdUZhbWlseSAhPSBDUFVfQU1EIHx8IChjcHVGYW1pbHkgPT0gQ1BVX0FNRCAmJiBjcHVUeXBlID49IENQVV9BTURBdGhsb24pKSB7Ci0Jc3dpdGNoIChjcHVGYW1pbHkpIHsKLQkgICAgY2FzZSBDUFVfSW50ZWw6Ci0JICAgIGNhc2UgQ1BVX0FNRDoKLQkJLyogRGlzYWJsZSBNVFJScywgYW5kIHNldCB0aGUgZGVmYXVsdCB0eXBlIHRvIHVuY2FjaGVkICovCi0JCWMtPmNyNFZhbCA9IF9NVFJSX3NhdmVDUjQoKTsKLQkJX01UUlJfcmVhZE1TUihJTlRFTF9kZWZUeXBlX01TUiwmYy0+ZGVmVHlwZUxvLCZjLT5kZWZUeXBlSGkpOwotCQlfTVRSUl93cml0ZU1TUihJTlRFTF9kZWZUeXBlX01TUixjLT5kZWZUeXBlTG8gJiAweEYzMDBVTCxjLT5kZWZUeXBlSGkpOwotCQlicmVhazsKLQkgICAgY2FzZSBDUFVfQ3lyaXg6Ci0JCWMtPmNjcjMgPSBfTVRSUl9nZXRDeDg2KENYODZfQ0NSMyk7Ci0JCV9NVFJSX3NldEN4ODYoQ1g4Nl9DQ1IzLCAodWNoYXIpKChjLT5jY3IzICYgMHgwRikgfCAweDEwKSk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWMgICAtIFBsYWNlIHRvIHJlc3RvcmUgdGhlIG1hY2hpbmUgY29udGV4dCBmcm9tCi0KLVJFTUFSS1M6Ci1SZXN0b3JlcyB0aGUgcHJvY2Vzc29yIGFmdGVyIHVwZGF0aW5nIGFueSBvZiB0aGUgcmVnaXN0ZXJzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgTVRSUl9lbmRVcGRhdGUoCi0gICAgTVRSUkNvbnRleHQgKmMpCi17Ci0gICAgaWYgKGNwdUZhbWlseSAhPSBDUFVfQU1EIHx8IChjcHVGYW1pbHkgPT0gQ1BVX0FNRCAmJiBjcHVUeXBlID49IENQVV9BTURBdGhsb24pKSB7Ci0JUE1fZmx1c2hUTEIoKTsKLQlzd2l0Y2ggKGNwdUZhbWlseSkgewotCSAgICBjYXNlIENQVV9JbnRlbDoKLQkgICAgY2FzZSBDUFVfQU1EOgotCQlfTVRSUl93cml0ZU1TUihJTlRFTF9kZWZUeXBlX01TUixjLT5kZWZUeXBlTG8sYy0+ZGVmVHlwZUhpKTsKLQkJX01UUlJfcmVzdG9yZUNSNChjLT5jcjRWYWwpOwotCQlicmVhazsKLQkgICAgY2FzZSBDUFVfQ3lyaXg6Ci0JCV9NVFJSX3NldEN4ODYoQ1g4Nl9DQ1IzLCh1Y2hhciljLT5jY3IzKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAoaWYgZW5hYmxlZCBwcmV2aW91c2x5KSAqLwotICAgIF9NVFJSX3Jlc3RvcmVJbnQoYy0+ZmxhZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXJlZyAgICAgLSBNVFJSIHJlZ2lzdGVyIHRvIHJlYWQKLWJhc2UgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHR5cGUgb2YgdGhlIE1UUlIgcmVnaXN0ZXIKLQotUkVNQVJLUzoKLUludGVsIHNwZWNpZmljIGZ1bmN0aW9uIHRvIHJlYWQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgTVRSUiByZWdpc3Rlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBJTlRFTF9nZXRNVFJSKAotICAgIHVpbnQgcmVnLAotICAgIHVsb25nICpiYXNlLAotICAgIHVsb25nICpzaXplLAotICAgIGludCAqdHlwZSkKLXsKLSAgICB1bG9uZyBoaSxtYXNrTG8sYmFzZUxvOwotCi0gICAgX01UUlJfcmVhZE1TUihJTlRFTF9waHlzTWFza19NU1IocmVnKSwmbWFza0xvLCZoaSk7Ci0gICAgaWYgKChtYXNrTG8gJiAweDgwMCkgPT0gMCkgewotCS8qIE1UUlIgaXMgZGlzYWJsZWQsIHNvIGl0IGlzIGZyZWUgKi8KLQkqYmFzZSA9IDA7Ci0JKnNpemUgPSAwOwotCSp0eXBlID0gMDsKLQlyZXR1cm47Ci0JfQotICAgIF9NVFJSX3JlYWRNU1IoSU5URUxfcGh5c0Jhc2VfTVNSKHJlZyksJmJhc2VMbywmaGkpOwotICAgIG1hc2tMbyA9IChtYXNrTG8gJiAweEZGRkZGMDAwVUwpOwotICAgICpzaXplID0gfihtYXNrTG8gLSAxKTsKLSAgICAqYmFzZSA9IChiYXNlTG8gJiAweEZGRkZGMDAwVUwpOwotICAgICp0eXBlID0gKGJhc2VMbyAmIDB4RkYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXJlZyAgICAgLSBNVFJSIHJlZ2lzdGVyIHRvIHNldAotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLXR5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKLQotUkVNQVJLUzoKLUludGVsIHNwZWNpZmljIGZ1bmN0aW9uIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBNVFJSIHJlZ2lzdGVyIHRvCi10aGUgcGFzc2VkIGluIGJhc2UsIHNpemUgYW5kIHR5cGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgSU5URUxfc2V0TVRSUigKLSAgICB1aW50IHJlZywKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIHNpemUsCi0gICAgaW50IHR5cGUpCi17Ci0gICAgTVRSUkNvbnRleHQgYzsKLQotICAgIE1UUlJfYmVnaW5VcGRhdGUoJmMpOwotICAgIGlmIChzaXplID09IDApIHsKLQkvKiBUaGUgaW52YWxpZCBiaXQgaXMga2VwdCBpbiB0aGUgbWFzaywgc28gd2Ugc2ltcGx5IGNsZWFyIHRoZQotCSAqIHJlbGV2YW50IG1hc2sgcmVnaXN0ZXIgdG8gZGlzYWJsZSBhIHJhbmdlLgotCSAqLwotCV9NVFJSX3dyaXRlTVNSKElOVEVMX3BoeXNNYXNrX01TUihyZWcpLDAsMCk7Ci0JfQotICAgIGVsc2UgewotCV9NVFJSX3dyaXRlTVNSKElOVEVMX3BoeXNCYXNlX01TUihyZWcpLGJhc2UgfCB0eXBlLDApOwotCV9NVFJSX3dyaXRlTVNSKElOVEVMX3BoeXNNYXNrX01TUihyZWcpLH4oc2l6ZSAtIDEpIHwgMHg4MDAsMCk7Ci0JfQotICAgIE1UUlJfZW5kVXBkYXRlKCZjKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EaXNhYmxlZCBiYW5rZWQgd3JpdGUgY29tYmluZyBmb3IgSW50ZWwgcHJvY2Vzc29ycy4gV2UgYWx3YXlzIGRpc2FibGUgdGhpcwotYmVjYXVzZSBpdCBpbnZhcmlhYmx5IGNhdXNlcyBwcm9ibGVtcyB3aXRoIG9sZGVyIGhhcmR3YXJlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIElOVEVMX2Rpc2FibGVCYW5rZWRXcml0ZUNvbWJpbmUodm9pZCkKLXsKLSAgICBNVFJSQ29udGV4dCBjOwotCi0gICAgTVRSUl9iZWdpblVwZGF0ZSgmYyk7Ci0gICAgX01UUlJfd3JpdGVNU1IoSU5URUxfZml4MTZLX0EwMDAwX01TUiwwLDApOwotICAgIE1UUlJfZW5kVXBkYXRlKCZjKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1yZWcgICAgIC0gTVRSUiByZWdpc3RlciB0byBzZXQKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFTUFSS1M6Ci1JbnRlbCBzcGVjaWZpYyBmdW5jdGlvbiB0byBzZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgTVRSUiByZWdpc3RlciB0bwotdGhlIHBhc3NlZCBpbiBiYXNlLCBzaXplIGFuZCB0eXBlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEFNRF9nZXRNVFJSKAotICAgIHVpbnQgcmVnLAotICAgIHVsb25nICpiYXNlLAotICAgIHVsb25nICpzaXplLAotICAgIGludCAqdHlwZSkKLXsKLSAgICB1bG9uZyAgIGxvdyxoaWdoOwotCi0gICAgLyogIFVwcGVyIGR3b3JkIGlzIHJlZ2lvbiAxLCBsb3dlciBpcyByZWdpb24gMCAgKi8KLSAgICBfTVRSUl9yZWFkTVNSKDB4QzAwMDAwODUsICZsb3csICZoaWdoKTsKLSAgICBpZiAocmVnID09IDEpCi0JbG93ID0gaGlnaDsKLQotICAgIC8qIEZpbmQgdGhlIGJhc2UgYW5kIHR5cGUgZm9yIHRoZSByZWdpb24gKi8KLSAgICAqYmFzZSA9IGxvdyAmIDB4RkZGRTAwMDA7Ci0gICAgKnR5cGUgPSAwOwotICAgIGlmIChsb3cgJiAxKQotCSp0eXBlID0gUE1fTVRSUl9VTkNBQ0hBQkxFOwotICAgIGlmIChsb3cgJiAyKQotCSp0eXBlID0gUE1fTVRSUl9XUkNPTUI7Ci0gICAgaWYgKChsb3cgJiAzKSA9PSAwKSB7Ci0JKnNpemUgPSAwOwotCXJldHVybjsKLQl9Ci0KLSAgICAvKiBUaGlzIG5lZWRzIGEgbGl0dGxlIGV4cGxhaW5pbmcuIFRoZSBzaXplIGlzIHN0b3JlZCBhcyBhbgotICAgICAqIGludmVydGVkIG1hc2sgb2YgYml0cyBvZiAxMjhLIGdyYW51bGFyaXR5IDE1IGJpdHMgbG9uZyBvZmZzZXQKLSAgICAgKiAyIGJpdHMKLSAgICAgKgotICAgICAqIFNvIHRvIGdldCBhIHNpemUgd2UgZG8gaW52ZXJ0IHRoZSBtYXNrIGFuZCBhZGQgMSB0byB0aGUgbG93ZXN0Ci0gICAgICogbWFzayBiaXQgKDQgYXMgaXRzIDIgYml0cyBpbikuIFRoaXMgZ2l2ZXMgdXMgYSBzaXplIHdlIHRoZW4gc2hpZnQKLSAgICAgKiB0byB0dXJuIGludG8gMTI4SyBibG9ja3MKLSAgICAgKgotICAgICAqICBlZyAgICAgICAgICAgICAgMTExIDExMTEgMTExMSAxMTAwICAgICAgaXMgNTEySwotICAgICAqCi0gICAgICogIGludmVydCAgICAgICAgICAwMDAgMDAwMCAwMDAwIDAwMTEKLSAgICAgKiAgKzEgICAgICAgICAgICAgIDAwMCAwMDAwIDAwMDAgMDEwMAotICAgICAqICAqMTI4SyAgIC4uLgotICAgICAqLwotICAgIGxvdyA9ICh+bG93KSAmIDB4MEZGRkM7Ci0gICAgKnNpemUgPSAobG93ICsgNCkgPDwgMTU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcmVnICAgICAtIE1UUlIgcmVnaXN0ZXIgdG8gc2V0Ci1iYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCi1zaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgotdHlwZSAgICAtIFR5cGUgdG8gcGxhY2UgaW50byB0aGUgTVRSUiByZWdpc3RlcgotCi1SRU1BUktTOgotSW50ZWwgc3BlY2lmaWMgZnVuY3Rpb24gdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIE1UUlIgcmVnaXN0ZXIgdG8KLXRoZSBwYXNzZWQgaW4gYmFzZSwgc2l6ZSBhbmQgdHlwZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBBTURfc2V0TVRSUigKLSAgICB1aW50IHJlZywKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIHNpemUsCi0gICAgaW50IHR5cGUpCi17Ci0gICAgdWxvbmcgICAgICAgbG93LGhpZ2gsbmV3VmFsOwotICAgIE1UUlJDb250ZXh0IGM7Ci0KLSAgICBNVFJSX2JlZ2luVXBkYXRlKCZjKTsKLSAgICBfTVRSUl9yZWFkTVNSKDB4QzAwMDAwODUsICZsb3csICZoaWdoKTsKLSAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0JLyogQ2xlYXIgcmVnaXN0ZXIgdG8gZGlzYWJsZSAqLwotCWlmIChyZWcpCi0JICAgIGhpZ2ggPSAwOwotCWVsc2UKLQkgICAgbG93ID0gMDsKLQl9Ci0gICAgZWxzZSB7Ci0JLyogU2V0IHRoZSByZWdpc3RlciB0byB0aGUgYmFzZSAoYWxyZWFkeSBzaGlmdGVkIGZvciB1cyksIHRoZQotCSAqIHR5cGUgKG9mZiBieSBvbmUpIGFuZCBhbiBpbnZlcnRlZCBiaXRtYXNrIG9mIHRoZSBzaXplCi0JICogVGhlIHNpemUgaXMgdGhlIG9ubHkgb2RkIGJpdC4gV2UgYXJlIGZlZCBzYXkgNTEySwotCSAqIFdlIGludmVydCB0aGlzIGFuZCB3ZSBnZXQgMTExIDExMTEgMTExMSAxMDExIGJ1dAotCSAqIGlmIHlvdSBzdWJ0cmFjdCBvbmUgYW5kIGludmVydCB5b3UgZ2V0IHRoZSBkZXNpcmVkCi0JICogMTExIDExMTEgMTExMSAxMTAwIG1hc2sKLQkgKi8KLQluZXdWYWwgPSAoKCh+KHNpemUtMSkpID4+IDE1KSAmIDB4MDAwMUZGRkMpIHwgYmFzZSB8ICh0eXBlKzEpOwotCWlmIChyZWcpCi0JICAgIGhpZ2ggPSBuZXdWYWw7Ci0JZWxzZQotCSAgICBsb3cgPSBuZXdWYWw7Ci0JfQotCi0gICAgLyogVGhlIHdyaXRlYmFjayBydWxlIGlzIHF1aXRlIHNwZWNpZmljLiBTZWUgdGhlIG1hbnVhbC4gSXRzCi0gICAgICogZGlzYWJsZSBsb2NhbCBpbnRlcnJ1cHRzLCB3cml0ZSBiYWNrIHRoZSBjYWNoZSwgc2V0IHRoZSBNVFJSCi0gICAgICovCi0gICAgUE1fZmx1c2hUTEIoKTsKLSAgICBfTVRSUl93cml0ZU1TUigweEMwMDAwMDg1LCBsb3csIGhpZ2gpOwotICAgIE1UUlJfZW5kVXBkYXRlKCZjKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1yZWcgICAgIC0gTVRSUiByZWdpc3RlciB0byBzZXQKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFTUFSS1M6Ci1JbnRlbCBzcGVjaWZpYyBmdW5jdGlvbiB0byBzZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgTVRSUiByZWdpc3RlciB0bwotdGhlIHBhc3NlZCBpbiBiYXNlLCBzaXplIGFuZCB0eXBlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIENZUklYX2dldE1UUlIoCi0gICAgdWludCByZWcsCi0gICAgdWxvbmcgKmJhc2UsCi0gICAgdWxvbmcgKnNpemUsCi0gICAgaW50ICp0eXBlKQotewotICAgIE1UUlJDb250ZXh0IGM7Ci0gICAgdWNoYXIgICAgICAgYXJyID0gQ1g4Nl9BUlJfQkFTRSArIHJlZyozOwotICAgIHVjaGFyICAgICAgIHJjcixzaGlmdDsKLQotICAgIC8qIFNhdmUgZmxhZ3MgYW5kIGRpc2FibGUgaW50ZXJydXB0cyAqLwotICAgIE1UUlJfYmVnaW5VcGRhdGUoJmMpOwotICAgICgodWNoYXIqKWJhc2UpWzNdICA9IF9NVFJSX2dldEN4ODYoYXJyKTsKLSAgICAoKHVjaGFyKiliYXNlKVsyXSAgPSBfTVRSUl9nZXRDeDg2KCh1Y2hhcikoYXJyKzEpKTsKLSAgICAoKHVjaGFyKiliYXNlKVsxXSAgPSBfTVRSUl9nZXRDeDg2KCh1Y2hhcikoYXJyKzIpKTsKLSAgICByY3IgPSBfTVRSUl9nZXRDeDg2KCh1Y2hhcikoQ1g4Nl9SQ1JfQkFTRSArIHJlZykpOwotICAgIE1UUlJfZW5kVXBkYXRlKCZjKTsKLQotICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzIGlmIGl0IHdhcyBlbmFibGVkIHByZXZpb3VzbHkgKi8KLSAgICBzaGlmdCA9ICgodWNoYXIqKWJhc2UpWzFdICYgMHgwZjsKLSAgICAqYmFzZSAmPSAweEZGRkZGMDAwVUw7Ci0KLSAgICAvKiBQb3dlciBvZiB0d28sIGF0IGxlYXN0IDRLIG9uIEFSUjAtQVJSNiwgMjU2SyBvbiBBUlI3Ci0gICAgICogTm90ZTogc2hpZnQ9PTB4RiBtZWFucyA0RywgdGhpcyBpcyB1bnN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBpZiAoc2hpZnQpCi0JKnNpemUgPSAocmVnIDwgNyA/IDB4ODAwVUwgOiAweDIwMDAwVUwpIDw8IHNoaWZ0OwotICAgIGVsc2UKLQkqc2l6ZSA9IDA7Ci0KLSAgICAvKiBCaXQgMCBpcyBDYWNoZSBFbmFibGUgb24gQVJSNywgQ2FjaGUgRGlzYWJsZSBvbiBBUlIwLUFSUjYgKi8KLSAgICBpZiAocmVnIDwgNykgewotCXN3aXRjaCAocmNyKSB7Ci0JICAgIGNhc2UgIDE6ICp0eXBlID0gUE1fTVRSUl9VTkNBQ0hBQkxFOyBicmVhazsKLQkgICAgY2FzZSAgODogKnR5cGUgPSBQTV9NVFJSX1dSQkFDSzsgICAgIGJyZWFrOwotCSAgICBjYXNlICA5OiAqdHlwZSA9IFBNX01UUlJfV1JDT01COyAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjQ6Ci0JICAgIGRlZmF1bHQ6ICp0eXBlID0gUE1fTVRSUl9XUlRIUk9VR0g7ICBicmVhazsKLQkgICAgfQotCX0KLSAgICBlbHNlIHsKLQlzd2l0Y2ggKHJjcikgewotCSAgICBjYXNlICAwOiAqdHlwZSA9IFBNX01UUlJfVU5DQUNIQUJMRTsgYnJlYWs7Ci0JICAgIGNhc2UgIDg6ICp0eXBlID0gUE1fTVRSUl9XUkNPTUI7ICAgICBicmVhazsKLQkgICAgY2FzZSAgOTogKnR5cGUgPSBQTV9NVFJSX1dSQkFDSzsgICAgIGJyZWFrOwotCSAgICBjYXNlIDI1OgotCSAgICBkZWZhdWx0OiAqdHlwZSA9IFBNX01UUlJfV1JUSFJPVUdIOyAgYnJlYWs7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcmVnICAgICAtIE1UUlIgcmVnaXN0ZXIgdG8gc2V0Ci1iYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCi1zaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgotdHlwZSAgICAtIFR5cGUgdG8gcGxhY2UgaW50byB0aGUgTVRSUiByZWdpc3RlcgotCi1SRU1BUktTOgotSW50ZWwgc3BlY2lmaWMgZnVuY3Rpb24gdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIE1UUlIgcmVnaXN0ZXIgdG8KLXRoZSBwYXNzZWQgaW4gYmFzZSwgc2l6ZSBhbmQgdHlwZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBDWVJJWF9zZXRNVFJSKAotICAgIHVpbnQgcmVnLAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgc2l6ZSwKLSAgICBpbnQgdHlwZSkKLXsKLSAgICBNVFJSQ29udGV4dCBjOwotICAgIHVjaGFyICAgICAgIGFyciA9IENYODZfQVJSX0JBU0UgKyByZWcqMzsKLSAgICB1Y2hhciAgICAgICBhcnJfdHlwZSxhcnJfc2l6ZTsKLQotICAgIC8qIENvdW50IGRvd24gZnJvbSAzMk0gKEFSUjAtQVJSNikgb3IgZnJvbSAyRyAoQVJSNykgKi8KLSAgICBzaXplID4+PSAocmVnIDwgNyA/IDEyIDogMTgpOwotICAgIHNpemUgJj0gMHg3RkZGOyAvKiBNYWtlIHN1cmUgYXJyX3NpemUgPD0gMTQgKi8KLSAgICBmb3IgKGFycl9zaXplID0gMDsgc2l6ZTsgYXJyX3NpemUrKywgc2l6ZSA+Pj0gMSkKLQk7Ci0gICAgaWYgKHJlZyA8IDcpIHsKLQlzd2l0Y2ggKHR5cGUpIHsKLQkgICAgY2FzZSBQTV9NVFJSX1VOQ0FDSEFCTEU6ICAgIGFycl90eXBlID0gIDE7IGJyZWFrOwotCSAgICBjYXNlIFBNX01UUlJfV1JDT01COiAgICAgICAgYXJyX3R5cGUgPSAgOTsgYnJlYWs7Ci0JICAgIGNhc2UgUE1fTVRSUl9XUlRIUk9VR0g6ICAgICBhcnJfdHlwZSA9IDI0OyBicmVhazsKLQkgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIGFycl90eXBlID0gIDg7IGJyZWFrOwotCSAgICB9Ci0JfQotICAgIGVsc2UgewotCXN3aXRjaCAodHlwZSkgewotCSAgICBjYXNlIFBNX01UUlJfVU5DQUNIQUJMRTogICAgYXJyX3R5cGUgPSAgMDsgYnJlYWs7Ci0JICAgIGNhc2UgUE1fTVRSUl9XUkNPTUI6ICAgICAgICBhcnJfdHlwZSA9ICA4OyBicmVhazsKLQkgICAgY2FzZSBQTV9NVFJSX1dSVEhST1VHSDogICAgIGFycl90eXBlID0gMjU7IGJyZWFrOwotCSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgYXJyX3R5cGUgPSAgOTsgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgTVRSUl9iZWdpblVwZGF0ZSgmYyk7Ci0gICAgX01UUlJfc2V0Q3g4NigodWNoYXIpYXJyLCAgICAgKCh1Y2hhciopJmJhc2UpWzNdKTsKLSAgICBfTVRSUl9zZXRDeDg2KCh1Y2hhcikoYXJyKzEpLCAoKHVjaGFyKikmYmFzZSlbMl0pOwotICAgIF9NVFJSX3NldEN4ODYoKHVjaGFyKShhcnIrMiksICh1Y2hhcikoKCgodWNoYXIqKSZiYXNlKVsxXSkgfCBhcnJfc2l6ZSkpOwotICAgIF9NVFJSX3NldEN4ODYoKHVjaGFyKShDWDg2X1JDUl9CQVNFICsgcmVnKSwgKHVjaGFyKWFycl90eXBlKTsKLSAgICBNVFJSX2VuZFVwZGF0ZSgmYyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT24gQ3lyaXggNng4NihNWCkgYW5kIE1JSSB0aGUgQVJSMyBpcyBzcGVjaWFsOiBpdCBoYXMgY29ubmVjdGlvbgotd2l0aCB0aGUgU01NIChTeXN0ZW0gTWFuYWdlbWVudCBNb2RlKSBtb2RlLiBTbyB3ZSBuZWVkIHRoZSBmb2xsb3dpbmc6Ci1DaGVjayB3aGV0aGVyIFNNSV9MT0NLIChDQ1IzIGJpdCAwKSBpcyBzZXQKLSAgaWYgaXQgaXMgc2V0LCBBUlIzIGNhbm5vdCBiZSBjaGFuZ2VkICAoaXQgY2Fubm90IGJlIGNoYW5nZWQgdW50aWwgdGhlCi0gICAgbmV4dCBwcm9jZXNzb3IgcmVzZXQpCi0gIGlmIGl0IGlzIHJlc2V0LCB0aGVuIHdlIGNhbiBjaGFuZ2UgaXQsIHNldCBhbGwgdGhlIG5lZWRlZCBiaXRzOgotICAgLSBkaXNhYmxlIGFjY2VzcyB0byBTTU0gbWVtb3J5IHRocm91Z2ggQVJSMyByYW5nZSAoQ0NSMSBiaXQgNyByZXNldCkKLSAgIC0gZGlzYWJsZSBhY2Nlc3MgdG8gU01NIG1lbW9yeSAoQ0NSMSBiaXQgMiByZXNldCkKLSAgIC0gZGlzYWJsZSBTTU0gbW9kZSAoQ0NSMSBiaXQgMSByZXNldCkKLSAgIC0gZGlzYWJsZSB3cml0ZSBwcm90ZWN0aW9uIG9mIEFSUjMgKENDUjYgYml0IDEgcmVzZXQpCi0gICAtIChtYXliZSkgZGlzYWJsZSBBUlIzCi1KdXN0IHRvIGJlIHN1cmUsIHdlIGVuYWJsZSBBUlIgdXNhZ2UgYnkgdGhlIHByb2Nlc3NvciAoQ0NSNSBiaXQgNSBzZXQpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgQ1lSSVhfaW5pdEFSUih2b2lkKQotewotICAgIE1UUlJDb250ZXh0IGM7Ci0gICAgdWNoYXIgICAgICAgY2NyWzddOwotICAgIGludCAgICAgICAgIGNjcmNbN10gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKLQotICAgIC8qIEJlZ2luIHVwZGF0aW5nICovCi0gICAgTVRSUl9iZWdpblVwZGF0ZSgmYyk7Ci0KLSAgICAvKiBTYXZlIGFsbCBDQ1JzIGxvY2FsbHkgKi8KLSAgICBjY3JbMF0gPSBfTVRSUl9nZXRDeDg2KENYODZfQ0NSMCk7Ci0gICAgY2NyWzFdID0gX01UUlJfZ2V0Q3g4NihDWDg2X0NDUjEpOwotICAgIGNjclsyXSA9IF9NVFJSX2dldEN4ODYoQ1g4Nl9DQ1IyKTsKLSAgICBjY3JbM10gPSAodWNoYXIpYy5jY3IzOwotICAgIGNjcls0XSA9IF9NVFJSX2dldEN4ODYoQ1g4Nl9DQ1I0KTsKLSAgICBjY3JbNV0gPSBfTVRSUl9nZXRDeDg2KENYODZfQ0NSNSk7Ci0gICAgY2NyWzZdID0gX01UUlJfZ2V0Q3g4NihDWDg2X0NDUjYpOwotICAgIGlmIChjY3JbM10gJiAxKQotCWNjcmNbM10gPSAxOwotICAgIGVsc2UgewotCS8qIERpc2FibGUgU01NIG1vZGUgKGJpdCAxKSwgYWNjZXNzIHRvIFNNTSBtZW1vcnkgKGJpdCAyKSBhbmQKLQkgKiBhY2Nlc3MgdG8gU01NIG1lbW9yeSB0aHJvdWdoIEFSUjMgKGJpdCA3KS4KLQkgKi8KLQlpZiAoY2NyWzZdICYgMHgwMikgewotCSAgICBjY3JbNl0gJj0gMHhGRDsKLQkgICAgY2NyY1s2XSA9IDE7ICAgICAgICAvKiBEaXNhYmxlIHdyaXRlIHByb3RlY3Rpb24gb2YgQVJSMy4gKi8KLQkgICAgX01UUlJfc2V0Q3g4NihDWDg2X0NDUjYsY2NyWzZdKTsKLQkgICAgfQotCX0KLQotICAgIC8qIElmIHdlIGNoYW5nZWQgQ0NSMSBpbiBtZW1vcnksIGNoYW5nZSBpdCBpbiB0aGUgcHJvY2Vzc29yLCB0b28uICovCi0gICAgaWYgKGNjcmNbMV0pCi0JX01UUlJfc2V0Q3g4NihDWDg2X0NDUjEsY2NyWzFdKTsKLQotICAgIC8qIEVuYWJsZSBBUlIgdXNhZ2UgYnkgdGhlIHByb2Nlc3NvciAqLwotICAgIGlmICghKGNjcls1XSAmIDB4MjApKSB7Ci0JY2NyWzVdIHw9IDB4MjA7Ci0JY2NyY1s1XSA9IDE7Ci0JX01UUlJfc2V0Q3g4NihDWDg2X0NDUjUsY2NyWzVdKTsKLQl9Ci0KLSAgICAvKiBXZSBhcmUgZmluaXNoZWQgdXBkYXRpbmcgKi8KLSAgICBNVFJSX2VuZFVwZGF0ZSgmYyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgTVRSUiBtb2R1bGUsIGJ5IGRldGVjdGluZyB0aGUgcHJvY2Vzc29yIHR5cGUgYW5kIGRldGVybWluaW5nCi1pZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIHRoZSBNVFJSIGZ1bmN0aW9uYWxpdHkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNVFJSX2luaXQodm9pZCkKLXsKLSAgICBpbnQgICAgIGksY3B1LGx0eXBlOwotICAgIHVsb25nICAgZWF4LGVkeCxsYmFzZSxsc2l6ZTsKLQotICAgIC8qIENoZWNrIHRoYXQgd2UgaGF2ZSBhIGNvbXBhdGlibGUgQ1BVICovCi0gICAgaWYgKG51bU1UUlIgPT0gLTEpIHsKLQludW1NVFJSID0gMDsKLQlpZiAoIV9NVFJSX2lzUmluZzAoKSkKLQkgICAgcmV0dXJuOwotCWNwdSA9IENQVV9nZXRQcm9jZXNzb3JUeXBlKCk7Ci0JY3B1RmFtaWx5ID0gY3B1ICYgQ1BVX2ZhbWlseU1hc2s7Ci0JY3B1VHlwZSA9IGNwdSAmIENQVV9tYXNrOwotCWNwdVN0ZXBwaW5nID0gKGNwdSAmIENQVV9zdGVwcGluZ01hc2spID4+IENQVV9zdGVwcGluZ1NoaWZ0OwotCXN3aXRjaCAoY3B1RmFtaWx5KSB7Ci0JICAgIGNhc2UgQ1BVX0ludGVsOgotCQkvKiBJbnRlbCBQZW50aXVtIFBybyBhbmQgbGF0ZXIgc3VwcG9ydCB0aGUgTVRSUiByZWdpc3RlcnMgKi8KLQkJaWYgKGNwdVR5cGUgPCBDUFVfUGVudGl1bVBybykKLQkJICAgIHJldHVybjsKLQkJX01UUlJfcmVhZE1TUihJTlRFTF9jYXBfTVNSLCZlYXgsJmVkeCk7Ci0JCW51bU1UUlIgPSBlYXggJiAweEZGOwotCQlnZXRNVFJSID0gSU5URUxfZ2V0TVRSUjsKLQkJc2V0TVRSUiA9IElOVEVMX3NldE1UUlI7Ci0JCWdldEZyZWVSZWdpb24gPSBHRU5FUklDX2dldEZyZWVSZWdpb247Ci0JCUlOVEVMX2Rpc2FibGVCYW5rZWRXcml0ZUNvbWJpbmUoKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQ1BVX0FNRDoKLQkJLyogQU1EIEs2LTIgYW5kIGxhdGVyIHN1cHBvcnQgdGhlIE1UUlIgcmVnaXN0ZXJzICovCi0JCWlmICgoY3B1VHlwZSA8IENQVV9BTURLNl8yKSB8fCAoY3B1VHlwZSA9PSBDUFVfQU1ESzZfMiAmJiBjcHVTdGVwcGluZyA8IDgpKQotCQkgICAgcmV0dXJuOwotCQlpZiAoY3B1VHlwZSA8IENQVV9BTURBdGhsb24pIHsKLQkJICAgIG51bU1UUlIgPSAyOyAgICAgICAgLyogQU1EIENQVSdzIGhhdmUgMiBNVFJSJ3MgKi8KLQkJICAgIGdldE1UUlIgPSBBTURfZ2V0TVRSUjsKLQkJICAgIHNldE1UUlIgPSBBTURfc2V0TVRSUjsKLQkJICAgIGdldEZyZWVSZWdpb24gPSBBTURLNl9nZXRGcmVlUmVnaW9uOwotCi0JCSAgICAvKiBGb3Igc29tZSByZWFzb24gc29tZSBJQk0gc3lzdGVtcyB3aXRoIEs2LTIgcHJvY2Vzc29ycwotCQkgICAgICogaGF2ZSB3cml0ZSBjb21iaW5lZCBlbmFibGVkIGZvciB0aGUgc3lzdGVtIEJJT1MKLQkJICAgICAqIHJlZ2lvbiBmcm9tIDB4RTAwMDAgdG8gMHhGRkZGRkYuIFdlIG5lZWQgKmJvdGgqIE1UUlIncwotCQkgICAgICogZm9yIG91ciBvd24gZ3JhcGhpY3MgZHJpdmVycywgc28gaWYgd2UgZGV0ZWN0IGFueQotCQkgICAgICogcmVnaW9ucyBiZWxvdyB0aGUgMU1lZyBib3VuZGFyeSwgd2UgcmVtb3ZlIHRoZW0KLQkJICAgICAqIHNvIHdlIGNhbiB1c2UgdGhpcyBNVFJSIHJlZ2lzdGVyIG91cnNlbHZlcy4KLQkJICAgICAqLwotCQkgICAgZm9yIChpID0gMDsgaSA8IG51bU1UUlI7IGkrKykgewotCQkJZ2V0TVRSUihpLCZsYmFzZSwmbHNpemUsJmx0eXBlKTsKLQkJCWlmIChsYmFzZSA8IDB4MTAwMDAwKQotCQkJICAgIHNldE1UUlIoaSwwLDAsMCk7Ci0JCQl9Ci0JCSAgICB9Ci0JCWVsc2UgewotCQkgICAgLyogQU1EIEF0aGxvbiB1c2VzIFA2IHN0eWxlIE1UUlIncyAqLwotCQkgICAgX01UUlJfcmVhZE1TUihJTlRFTF9jYXBfTVNSLCZlYXgsJmVkeCk7Ci0JCSAgICBudW1NVFJSID0gZWF4ICYgMHhGRjsKLQkJICAgIGdldE1UUlIgPSBJTlRFTF9nZXRNVFJSOwotCQkgICAgc2V0TVRSUiA9IElOVEVMX3NldE1UUlI7Ci0JCSAgICBnZXRGcmVlUmVnaW9uID0gR0VORVJJQ19nZXRGcmVlUmVnaW9uOwotCQkgICAgSU5URUxfZGlzYWJsZUJhbmtlZFdyaXRlQ29tYmluZSgpOwotCQkgICAgfQotCQlicmVhazsKLQkgICAgY2FzZSBDUFVfQ3lyaXg6Ci0JCS8qIEN5cml4IDZ4ODYgYW5kIGxhdGVyIHN1cHBvcnQgdGhlIE1UUlIgcmVnaXN0ZXJzICovCi0JCWlmIChjcHVUeXBlIDwgQ1BVX0N5cml4Nng4NiB8fCBjcHVUeXBlID49IENQVV9DeXJpeE1lZGlhR1gpCi0JCSAgICByZXR1cm47Ci0JCW51bU1UUlIgPSA4OyAgICAgICAgLyogQ3lyaXggQ1BVJ3MgaGF2ZSA4IEFSUidzICovCi0JCWdldE1UUlIgPSBDWVJJWF9nZXRNVFJSOwotCQlzZXRNVFJSID0gQ1lSSVhfc2V0TVRSUjsKLQkJZ2V0RnJlZVJlZ2lvbiA9IENZUklYX2dldEZyZWVSZWdpb247Ci0JCUNZUklYX2luaXRBUlIoKTsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCXJldHVybjsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCi1zaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgotdHlwZSAgICAtIFR5cGUgdG8gcGxhY2UgaW50byB0aGUgTVRSUiByZWdpc3RlcgotCi1SRVRVUk5TOgotRXJyb3IgY29kZSBkZXNjcmliaW5nIHRoZSByZXN1bHQuCi0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBlbmFibGUgd3JpdGUgY29tYmluaW5nIGZvciB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBvZiBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IE1UUlJfZW5hYmxlV3JpdGVDb21iaW5lKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgc2l6ZSwKLSAgICB1aW50IHR5cGUpCi17Ci0gICAgaW50ICAgICBpOwotICAgIGludCAgICAgbHR5cGU7Ci0gICAgdWxvbmcgICBsYmFzZSxsc2l6ZSxsYXN0OwotCi0gICAgLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgQ1BVIHRoYXQgc3VwcG9ydHMgTVRSUidzIGFuZCB0eXBlIGlzIHZhbGlkICovCi0gICAgaWYgKG51bU1UUlIgPD0gMCkgewotCWlmICghX01UUlJfaXNSaW5nMCgpKQotCSAgICByZXR1cm4gUE1fTVRSUl9FUlJfTk9fT1NfU1VQUE9SVDsKLQlyZXR1cm4gUE1fTVRSUl9OT1RfU1VQUE9SVEVEOwotCX0KLSAgICBpZiAodHlwZSA+PSBQTV9NVFJSX01BWCkKLQlyZXR1cm4gUE1fTVRSUl9FUlJfUEFSQU1TOwotCi0gICAgLyogSWYgdGhlIHR5cGUgaXMgV0MsIGNoZWNrIHRoYXQgdGhpcyBwcm9jZXNzb3Igc3VwcG9ydHMgaXQgKi8KLSAgICBpZiAoIU1UUlJfaGF2ZVdyaXRlQ29tYmluZSgpKQotCXJldHVybiBQTV9NVFJSX0VSUl9OT1dSQ09NQjsKLQotICAgIC8qIEFkanVzdCB0aGUgYm91bmRhcmllcyBkZXBlbmRpbmcgb24gdGhlIENQVSB0eXBlICovCi0gICAgc3dpdGNoIChjcHVGYW1pbHkpIHsKLQljYXNlIENQVV9BTUQ6Ci0JICAgIGlmIChjcHVUeXBlIDwgQ1BVX0FNREF0aGxvbikgewotCQkvKiBBcHBseSB0aGUgSzYgYmxvY2sgYWxpZ25tZW50IGFuZCBzaXplIHJ1bGVzLiBJbiBvcmRlcjoKLQkJICogIG8gVW5jYWNoZWQgb3IgZ2F0aGVyaW5nIG9ubHkKLQkJICogIG8gMTI4SyBvciBiaWdnZXIgYmxvY2sKLQkJICogIG8gUG93ZXIgb2YgMiBibG9jawotCQkgKiAgbyBiYXNlIHN1aXRhYmx5IGFsaWduZWQgdG8gdGhlIHBvd2VyCi0JCSAqLwotCQlpZiAodHlwZSA+IFBNX01UUlJfV1JDT01CICYmIChzaXplIDwgKDEgPDwgMTcpIHx8IChzaXplICYgfihzaXplLTEpKS1zaXplIHx8IChiYXNlICYgKHNpemUtMSkpKSkKLQkJICAgIHJldHVybiBQTV9NVFJSX0VSUl9OT1RfQUxJR05FRDsKLQkJYnJlYWs7Ci0JCX0KLQkgICAgLyogRmFsbCB0aHJvdWdoIGZvciBBTUQgQXRobG9uIHdoaWNoIHVzZXMgUDYgc3R5bGUgTVRSUidzICovCi0JY2FzZSBDUFVfSW50ZWw6Ci0JY2FzZSBDUFVfQ3lyaXg6Ci0JICAgIGlmICgoYmFzZSAmIDB4RkZGKSB8fCAoc2l6ZSAmIDB4RkZGKSkgewotCQkvKiBCYXNlIGFuZCBzaXplIG11c3QgYmUgbXVsdGlwbGVzIG9mIDRLYiAqLwotCQlyZXR1cm4gUE1fTVRSUl9FUlJfTk9UXzRLQl9BTElHTkVEOwotCQl9Ci0JICAgIGlmIChiYXNlIDwgMHgxMDAwMDApIHsKLQkJLyogQmFzZSBtdXN0IGJlID49IDFNYiAqLwotCQlyZXR1cm4gUE1fTVRSUl9FUlJfQkVMT1dfMU1COwotCQl9Ci0KLQkgICAgLyogQ2hlY2sgdXBwZXIgYml0cyBvZiBiYXNlIGFuZCBsYXN0IGFyZSBlcXVhbCBhbmQgbG93ZXIgYml0cwotCSAgICAgKiBhcmUgMCBmb3IgYmFzZSBhbmQgMSBmb3IgbGFzdAotCSAgICAgKi8KLQkgICAgbGFzdCA9IGJhc2UgKyBzaXplIC0gMTsKLQkgICAgZm9yIChsYmFzZSA9IGJhc2U7ICEobGJhc2UgJiAxKSAmJiAobGFzdCAmIDEpOyBsYmFzZSA9IGxiYXNlID4+IDEsIGxhc3QgPSBsYXN0ID4+IDEpCi0JCTsKLQkgICAgaWYgKGxiYXNlICE9IGxhc3QpIHsKLQkJLyogQmFzZSBpcyBub3QgYWxpZ25lZCBvbiB0aGUgY29ycmVjdCBib3VuZGFyeSAqLwotCQlyZXR1cm4gUE1fTVRSUl9FUlJfTk9UX0FMSUdORUQ7Ci0JCX0KLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgcmV0dXJuIFBNX01UUlJfTk9UX1NVUFBPUlRFRDsKLQl9Ci0KLSAgICAvKiBTZWFyY2ggZm9yIGV4aXN0aW5nIE1UUlIgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTVRSUjsgKytpKSB7Ci0JZ2V0TVRSUihpLCZsYmFzZSwmbHNpemUsJmx0eXBlKTsKLQlpZiAobGJhc2UgPT0gMCAmJiBsc2l6ZSA9PSAwKQotCSAgICBjb250aW51ZTsKLQlpZiAoYmFzZSA+IGxiYXNlICsgKGxzaXplLTEpKQotCSAgICBjb250aW51ZTsKLQlpZiAoKGJhc2UgPCBsYmFzZSkgJiYgKGJhc2Urc2l6ZS0xIDwgbGJhc2UpKQotCSAgICBjb250aW51ZTsKLQotCS8qIENoZWNrIHRoYXQgd2UgZG9uJ3Qgb3ZlcmxhcCBhbiBleGlzdGluZyByZWdpb24gKi8KLQlpZiAodHlwZSAhPSBQTV9NVFJSX1VOQ0FDSEFCTEUpIHsKLQkgICAgaWYgKChiYXNlIDwgbGJhc2UpIHx8IChiYXNlK3NpemUtMSA+IGxiYXNlK2xzaXplLTEpKQotCQlyZXR1cm4gUE1fTVRSUl9FUlJfT1ZFUkxBUDsKLQkgICAgfQotCWVsc2UgaWYgKGJhc2UgPT0gbGJhc2UgJiYgc2l6ZSA9PSBsc2l6ZSkgewotCSAgICAvKiBUaGUgcmVnaW9uIGFscmVhZHkgZXhpc3RzIHNvIGxlYXZlIGl0IGFsb25lICovCi0JICAgIHJldHVybiBQTV9NVFJSX0VSUl9PSzsKLQkgICAgfQotCi0JLyogTmV3IHJlZ2lvbiBpcyBlbmNsb3NlZCBieSBhbiBleGlzdGluZyByZWdpb24sIHNvIG9ubHkgYWxsb3cKLQkgKiBhIG5ldyB0eXBlIHRvIGJlIGNyZWF0ZWQgaWYgd2UgYXJlIHNldHRpbmcgYSByZWdpb24gdG8gYmUKLQkgKiB1bmNhY2hlYWJsZSAoc3VjaCBhcyBNTUlPIHJlZ2lzdGVycyB3aXRoaW4gYSBmcmFtZWJ1ZmZlcikuCi0JICovCi0JaWYgKGx0eXBlICE9IChpbnQpdHlwZSkgewotCSAgICBpZiAodHlwZSA9PSBQTV9NVFJSX1VOQ0FDSEFCTEUpCi0JCWNvbnRpbnVlOwotCSAgICByZXR1cm4gUE1fTVRSUl9FUlJfVFlQRV9NSVNNQVRDSDsKLQkgICAgfQotCXJldHVybiBQTV9NVFJSX0VSUl9PSzsKLQl9Ci0KLSAgICAvKiBTZWFyY2ggZm9yIGFuIGVtcHR5IE1UUlIgKi8KLSAgICBpZiAoKGkgPSBnZXRGcmVlUmVnaW9uKGJhc2Usc2l6ZSkpIDwgMCkKLQlyZXR1cm4gUE1fTVRSUl9FUlJfTk9ORV9GUkVFOwotICAgIHNldE1UUlIoaSxiYXNlLHNpemUsdHlwZSk7Ci0gICAgcmV0dXJuIFBNX01UUlJfRVJSX09LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWNhbGxiYWNrICAgIC0gRnVuY3Rpb24gdG8gY2FsbGJhY2sgd2l0aCB3cml0ZSBjb21iaW5lIGluZm9ybWF0aW9uCi0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBlbnVtZXJhdGUgYWxsIHdyaXRlIGNvbWJpbmUgcmVnaW9ucyBjdXJyZW50bHkgZW5hYmxlZCBmb3IgdGhlCi1wcm9jZXNzb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2VudW1Xcml0ZUNvbWJpbmUoCi0gICAgUE1fZW51bVdyaXRlQ29tYmluZV90IGNhbGxiYWNrKQotewotICAgIGludCAgICAgaSxsdHlwZTsKLSAgICB1bG9uZyAgIGxiYXNlLGxzaXplOwotCi0gICAgLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgQ1BVIHRoYXQgc3VwcG9ydHMgTVRSUidzIGFuZCB0eXBlIGlzIHZhbGlkICovCi0gICAgaWYgKG51bU1UUlIgPD0gMCkgewotCWlmICghX01UUlJfaXNSaW5nMCgpKQotCSAgICByZXR1cm4gUE1fTVRSUl9FUlJfTk9fT1NfU1VQUE9SVDsKLQlyZXR1cm4gUE1fTVRSUl9OT1RfU1VQUE9SVEVEOwotCX0KLQotICAgIC8qIEVudW1lcmF0ZSBhbGwgZXhpc3RpbmcgTVRSUidzICovCi0gICAgZm9yIChpID0gMDsgaSA8IG51bU1UUlI7ICsraSkgewotCWdldE1UUlIoaSwmbGJhc2UsJmxzaXplLCZsdHlwZSk7Ci0JY2FsbGJhY2sobGJhc2UsbHNpemUsbHR5cGUpOwotCX0KLSAgICByZXR1cm4gUE1fTVRSUl9FUlJfT0s7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9wY2lsaWIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9wY2lsaWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1NDJmYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vcGNpbGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIGZvciBpbnRlcmZhY2luZyB0byB0aGUgUENJIGJ1cyBhbmQgY29uZmlndXJhdGlvbgotKiAgICAgICAgICAgICAgIHNwYWNlIHJlZ2lzdGVycy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgInBjaWxpYi5oIgotI2lmICFkZWZpbmVkKF9fV0lOMzJfVlhEX18pICYmICFkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBwYWNrKDEpCi0KLS8qIExlbmd0aCBvZiB0aGUgbWVtb3J5IG1hcHBpbmcgZm9yIHRoZSBQQ0kgQklPUyAqLwotCi0jZGVmaW5lIEJJT1NfTElNSVQgICAgICAgICAgKDEyOCAqIDEwMjRMIC0gMSkKLQotLyogTWFjcm9zIGZvciBhY2Nlc3NpbmcgdGhlIFBDSSBCSU9TIGZ1bmN0aW9ucyBmcm9tIDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSAqLwotCi0jZGVmaW5lIEJJT1MzMl9TSUdOQVRVUkUgICAgKCgodWxvbmcpJ18nIDw8IDApICsgKCh1bG9uZyknMycgPDwgOCkgKyAoKHVsb25nKScyJyA8PCAxNikgKyAoKHVsb25nKSdfJyA8PCAyNCkpCi0jZGVmaW5lIFBDSV9TSUdOQVRVUkUgICAgICAgKCgodWxvbmcpJ1AnIDw8IDApICsgKCh1bG9uZyknQycgPDwgOCkgKyAoKHVsb25nKSdJJyA8PCAxNikgKyAoKHVsb25nKScgJyA8PCAyNCkpCi0jZGVmaW5lIFBDSV9TRVJWSUNFICAgICAgICAgKCgodWxvbmcpJyQnIDw8IDApICsgKCh1bG9uZyknUCcgPDwgOCkgKyAoKHVsb25nKSdDJyA8PCAxNikgKyAoKHVsb25nKSdJJyA8PCAyNCkpCi0jZGVmaW5lIFBDSV9CSU9TX1BSRVNFTlQgICAgMHhCMTAxCi0jZGVmaW5lIEZJTkRfUENJX0RFVklDRSAgICAgMHhCMTAyCi0jZGVmaW5lIEZJTkRfUENJX0NMQVNTICAgICAgMHhCMTAzCi0jZGVmaW5lIEdFTkVSQVRFX1NQRUNJQUwgICAgMHhCMTA2Ci0jZGVmaW5lIFJFQURfQ09ORklHX0JZVEUgICAgMHhCMTA4Ci0jZGVmaW5lIFJFQURfQ09ORklHX1dPUkQgICAgMHhCMTA5Ci0jZGVmaW5lIFJFQURfQ09ORklHX0RXT1JEICAgMHhCMTBBCi0jZGVmaW5lIFdSSVRFX0NPTkZJR19CWVRFICAgMHhCMTBCCi0jZGVmaW5lIFdSSVRFX0NPTkZJR19XT1JEICAgMHhCMTBDCi0jZGVmaW5lIFdSSVRFX0NPTkZJR19EV09SRCAgMHhCMTBECi0jZGVmaW5lIEdFVF9JUlFfUk9VVElOR19PUFQgMHhCMTBFCi0jZGVmaW5lIFNFVF9QQ0lfSVJRICAgICAgICAgMHhCMTBGCi0KLS8qIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHN0cnVjdHVyZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBlbnRyeSBwb2ludCB0byB0aGUKLSAqIEJJT1MzMiBTZXJ2aWNlIERpcmVjdG9yeSwgYXMgZG9jdW1lbnRlZCBpbiBQQ0kgMi4xIEJJT1MgU3BlY2ljaXRpb24uCi0gKi8KLQotdHlwZWRlZiB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLQl1bG9uZyBzaWduYXR1cmU7ICAgICAgICAvKiBfMzJfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl1bG9uZyBlbnRyeTsgICAgICAgICAgICAvKiAzMiBiaXQgcGh5c2ljYWwgYWRkcmVzcyAgICAgICAgICAgICAgKi8KLQl1Y2hhciByZXZpc2lvbjsgICAgICAgICAvKiBSZXZpc2lvbiBsZXZlbCwgMCAgICAgICAgICAgICAgICAgICAgKi8KLQl1Y2hhciBsZW5ndGg7ICAgICAgICAgICAvKiBMZW5ndGggaW4gcGFyYWdyYXBocyBzaG91bGQgYmUgMDEgICAgKi8KLQl1Y2hhciBjaGVja3N1bTsgICAgICAgICAvKiBBbGwgYnl0ZXMgbXVzdCBhZGQgdXAgdG8gemVybyAgICAgICAgKi8KLQl1Y2hhciByZXNlcnZlZFs1XTsgICAgICAvKiBNdXN0IGJlIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl9IGZpZWxkczsKLSAgICBjaGFyIGNoYXJzWzE2XTsKLSAgICB9IFBDSV9iaW9zMzI7Ci0KLS8qIFN0cnVjdHVyZSBmb3IgYSBmYXIgcG9pbnRlciB0byBjYWxsIHRoZSBQQ0kgQklPUyBzZXJ2aWNlcyB3aXRoICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIGFkZHJlc3M7Ci0gICAgdXNob3J0ICBzZWdtZW50OwotICAgIH0gUENJQklPU19lbnRyeTsKLQotLyogTWFjcm9zIHRvIGNvcHkgYSBzdHJ1Y3R1cmUgdGhhdCBpbmNsdWRlcyBkd1NpemUgbWVtYmVycyAqLwotCi0jZGVmaW5lIENPUFlfU1RSVUNUVVJFKGQscykgbWVtY3B5KGQscyxNSU4oKHMpLT5kd1NpemUsKGQpLT5kd1NpemUpKQotCi0jcHJhZ21hIHBhY2soKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdWNoYXIgICAgICAgICAgICAqQklPU0ltYWdlID0gTlVMTDsgIC8qIEJJT1MgaW1hZ2UgbWFwcGluZyAgICAgICAqLwotc3RhdGljIGludCAgICAgICAgICAgICAgUENJQklPU1ZlcnNpb24gPSAtMTsvKiBQQ0kgQklPUyB2ZXJzaW9uICAgICAgICAgKi8KLXN0YXRpYyBQQ0lCSU9TX2VudHJ5ICAgIFBDSUVudHJ5OyAgICAgICAgICAgLyogUENJIHNlcnZpY2VzIGVudHJ5IHBvaW50ICovCi1zdGF0aWMgdWxvbmcgICAgICAgICAgICBQQ0lQaHlzRW50cnkgPSAwOyAgIC8qIFBoeXNpY2FsIGFkZHJlc3MgICAgICAgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBFeHRlcm5hbCBhc3NlbWJsZXIgaGVscGVyIGZ1bmN0aW9ucyAqLwotCi11Y2hhciAgIF9BU01BUEkgX0JJT1MzMl9zZXJ2aWNlKHVsb25nIHNlcnZpY2UsdWxvbmcgZnVuY3Rpb24sdWxvbmcgKnBoeXNCYXNlLHVsb25nICpsZW5ndGgsdWxvbmcgKnNlcnZpY2VPZmZzZXQsUENJQklPU19lbnRyeSBlbnRyeSk7Ci11c2hvcnQgIF9BU01BUEkgX1BDSUJJT1NfaXNQcmVzZW50KHVsb25nIGlfZWF4LHVsb25nICpvX2VkeCx1c2hvcnQgKm9fYXgsdWNoYXIgKm9fY2wsUENJQklPU19lbnRyeSBlbnRyeSk7Ci11bG9uZyAgIF9BU01BUEkgX1BDSUJJT1Nfc2VydmljZSh1bG9uZyByX2VheCx1bG9uZyByX2VieCx1bG9uZyByX2VkaSx1bG9uZyByX2VjeCxQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKLWludCAgICAgX0FTTUFQSSBfUENJQklPU19nZXRSb3V0aW5nKFBDSVJvdXRpbmdPcHRpb25zQnVmZmVyICpidWYsUENJQklPU19lbnRyeSBlbnRyeSk7Ci1pYm9vbCAgIF9BU01BUEkgX1BDSUJJT1Nfc2V0SVJRKGludCBidXNEZXYsaW50IGludFBpbixpbnQgSVJRLFBDSUJJT1NfZW50cnkgZW50cnkpOwotdWxvbmcgICBfQVNNQVBJIF9QQ0lCSU9TX3NwZWNpYWxDeWNsZShpbnQgYnVzLHVsb25nIGRhdGEsUENJQklPU19lbnRyeSBlbnRyeSk7Ci11c2hvcnQgIF9BU01BUEkgX1BDSV9nZXRDUyh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9ucyByZXR1cm5zIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBQQ0kgQklPUyBlbnRyeSBwb2ludC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfQVNNQVBJIFBDSUJJT1NfZ2V0RW50cnkodm9pZCkKLXsgcmV0dXJuIFBDSVBoeXNFbnRyeTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWh3VHlwZSAgLSBQbGFjZSB0byBzdG9yZSB0aGUgUENJIGhhcmR3YXJlIGFjY2VzcyBtZWNoYW5pc20gZmxhZ3MKLWxhc3RCdXMgLSBQbGFjZSB0byBzdG9yZSB0aGUgaW5kZXggb2YgdGhlIGxhc3QgUENJIGJ1cyBpbiB0aGUgc3lzdGVtCi0KLVJFVFVSTlM6Ci1WZXJzaW9uIG51bWJlciBvZiB0aGUgUENJIEJJT1MgZm91bmQuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhlIFBDSSBCSU9TIGlzIHByZXNlbnQgaW4gdGhlIHN5c3RlbSwgYW5kIGlmCi1zbyByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MgZGV0ZWN0IGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgUENJQklPU19kZXRlY3QoCi0gICAgdWNoYXIgKmh3VHlwZSwKLSAgICB1Y2hhciAqbGFzdEJ1cykKLXsKLSAgICB1bG9uZyAgIHNpZ25hdHVyZTsKLSAgICB1c2hvcnQgIHN0YXQsdmVyc2lvbjsKLQotI2lmbmRlZiBfXzE2QklUX18KLSAgICBQQ0lCSU9TX2VudHJ5ICAgQklPU0VudHJ5ID0gezB9OwotICAgIHVjaGFyICAgICAgICAgICAqQklPU0VuZDsKLSAgICBQQ0lfYmlvczMyICAgICAgKkJJT1NEaXI7Ci0gICAgdWxvbmcgICAgICAgICAgIHBoeXNCYXNlLGxlbmd0aCxvZmZzZXQ7Ci0KLSAgICAvKiBCYWlsIGlmIHdlIGhhdmUgYWxyZWFkeSBkZXRlY3RlZCBubyBCSU9TIGlzIHByZXNlbnQgKi8KLSAgICBpZiAoUENJQklPU1ZlcnNpb24gPT0gMCkKLQlyZXR1cm4gMDsKLQotICAgIC8qIEZpcnN0IHNjYW4gdGhlIG1lbW9yeSBmcm9tIDB4RTAwMDAgdG8gMHhGRkZGRiBsb29raW5nIGZvciB0aGUKLSAgICAgKiBCSU9TMzIgc2VydmljZSBkaXJlY3RvcnksIHNvIHdlIGNhbiBkZXRlcm1pbmUgaWYgd2UgY2FuIGNhbGwgaXQKLSAgICAgKiBmcm9tIDMyLWJpdCBwcm90ZWN0ZWQgbW9kZS4KLSAgICAgKi8KLSAgICBpZiAoUENJQklPU1ZlcnNpb24gPT0gLTEpIHsKLQlQQ0lCSU9TVmVyc2lvbiA9IDA7Ci0JQklPU0ltYWdlID0gUE1fbWFwUGh5c2ljYWxBZGRyKDB4RTAwMDAsQklPU19MSU1JVCxmYWxzZSk7Ci0JaWYgKCFCSU9TSW1hZ2UpCi0JICAgIHJldHVybiAwOwotCUJJT1NFbmQgPSBCSU9TSW1hZ2UgKyAweDIwMDAwOwotCWZvciAoQklPU0RpciA9IChQQ0lfYmlvczMyKilCSU9TSW1hZ2U7IEJJT1NEaXIgPCAoUENJX2Jpb3MzMiopQklPU0VuZDsgQklPU0RpcisrKSB7Ci0JICAgIHVjaGFyICAgc3VtOwotCSAgICBpbnQgICAgIGksbGVuZ3RoOwotCi0JICAgIGlmIChCSU9TRGlyLT5maWVsZHMuc2lnbmF0dXJlICE9IEJJT1MzMl9TSUdOQVRVUkUpCi0JCWNvbnRpbnVlOwotCSAgICBsZW5ndGggPSBCSU9TRGlyLT5maWVsZHMubGVuZ3RoICogMTY7Ci0JICAgIGlmICghbGVuZ3RoKQotCQljb250aW51ZTsKLQkgICAgZm9yIChzdW0gPSBpID0gMDsgaSA8IGxlbmd0aCA7IGkrKykKLQkJc3VtICs9IEJJT1NEaXItPmNoYXJzW2ldOwotCSAgICBpZiAoc3VtICE9IDApCi0JCWNvbnRpbnVlOwotCSAgICBCSU9TRW50cnkuYWRkcmVzcyA9ICh1bG9uZylCSU9TSW1hZ2UgKyAoQklPU0Rpci0+ZmllbGRzLmVudHJ5IC0gMHhFMDAwMCk7Ci0JICAgIEJJT1NFbnRyeS5zZWdtZW50ID0gX1BDSV9nZXRDUygpOwotCSAgICBicmVhazsKLQkgICAgfQotCi0JLyogSWYgd2UgZm91bmQgdGhlIEJJT1MzMiBkaXJlY3RvcnksIGNhbGwgaXQgdG8gZ2V0IHRoZSBhZGRyZXNzIG9mIHRoZQotCSAqIFBDSSBzZXJ2aWNlcy4KLQkgKi8KLQlpZiAoQklPU0VudHJ5LmFkZHJlc3MgPT0gMCkKLQkgICAgcmV0dXJuIDA7Ci0JaWYgKF9CSU9TMzJfc2VydmljZShQQ0lfU0VSVklDRSwwLCZwaHlzQmFzZSwmbGVuZ3RoLCZvZmZzZXQsQklPU0VudHJ5KSAhPSAwKQotCSAgICByZXR1cm4gMDsKLQlQQ0lQaHlzRW50cnkgPSBwaHlzQmFzZSArIG9mZnNldDsKLQlQQ0lFbnRyeS5hZGRyZXNzID0gKHVsb25nKUJJT1NJbWFnZSArIChQQ0lQaHlzRW50cnkgLSAweEUwMDAwKTsKLQlQQ0lFbnRyeS5zZWdtZW50ID0gX1BDSV9nZXRDUygpOwotCX0KLSNlbmRpZgotICAgIC8qIFdlIGZvdW5kIHRoZSBCSU9TIGVudHJ5LCBzbyBub3cgZG8gdGhlIHZlcnNpb24gY2hlY2sgKi8KLSAgICB2ZXJzaW9uID0gX1BDSUJJT1NfaXNQcmVzZW50KFBDSV9CSU9TX1BSRVNFTlQsJnNpZ25hdHVyZSwmc3RhdCxsYXN0QnVzLFBDSUVudHJ5KTsKLSAgICBpZiAodmVyc2lvbiA+IDAgJiYgKChzdGF0ID4+IDgpID09IDApICYmIHNpZ25hdHVyZSA9PSBQQ0lfU0lHTkFUVVJFKSB7Ci0JKmh3VHlwZSA9IHN0YXQgJiAweEZGOwotCXJldHVybiBQQ0lCSU9TVmVyc2lvbiA9IHZlcnNpb247Ci0JfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWluZm8gICAgLSBBcnJheSBvZiBQQ0lEZXZpY2VJbmZvIHN0cnVjdHVyZXMgdG8gY2hlY2sgYWdhaW5zdAotaW5kZXggICAtIEluZGV4IG9mIHRoZSBjdXJyZW50IGRldmljZSB0byBjaGVjawotCi1SRVRVUk5TOgotVHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIGEgZHVwbGljYXRlLCBmYWxzZSBpZiBub3QuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGdvZXMgdGhyb3VnaCB0aGUgbGlzdCBvZiBhbGwgZGV2aWNlcyBwcmVjZWVkaW5nIHRoZSBuZXdseQotZm91bmQgZGV2aWNlIGluIHRoZSBpbmZvIHN0cnVjdHVyZSwgYW5kIGNoZWNrcyB0aGF0IHRoZSBkZXZpY2UgaXMgbm90IGEKLWR1cGxpY2F0ZSBvZiBhIHByZXZpb3VzIGRldmljZS4gU29tZSBkZXZpY2VzIGluY29ycmVjdGx5IGVudW1lcmF0ZQotdGhlbXNlbHZlcyBhdCBkaWZmZXJlbnQgZnVuY3Rpb24gYWRkcmVzc2VzIHNvIHdlIGNoZWNrIGhlcmUgdG8gZXhjbHVkZQotdGhvc2UgY2FzZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIENoZWNrRHVwbGljYXRlKAotICAgIFBDSURldmljZUluZm8gKmluZm8sCi0gICAgUENJRGV2aWNlSW5mbyAqcHJldikKLXsKLSAgICAvKiBJZ25vcmUgZGV2aWNlcyB3aXRoIGEgdmVuZG9yIElEIG9mIDAgKi8KLSAgICBpZiAoaW5mby0+VmVuZG9ySUQgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgIC8qIE5PVEU6IFdlIG9ubHkgY2hlY2sgYWdhaW5zdCB0aGUgY3VycmVudCBkZXZpY2Ugb24KLSAgICAgKiAgICAgICB0aGUgYnVzIHRvIGVuc3VyZSB0aGF0IHdlIGRvIG5vdCBleGNsdWRlCi0gICAgICogICAgICAgbXVsdGlwbGUgY29udHJvbGxlcnMgb2YgdGhlIHNhbWUgZGV2aWNlIElELgotICAgICAqLwotICAgIGlmIChpbmZvLT5zbG90LnAuQnVzID09IHByZXYtPnNsb3QucC5CdXMgJiYKLQlpbmZvLT5zbG90LnAuRGV2aWNlID09IHByZXYtPnNsb3QucC5EZXZpY2UgJiYKLQlpbmZvLT5EZXZpY2VJRCA9PSBwcmV2LT5EZXZpY2VJRCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAgICAgLSBBcnJheSBvZiBQQ0lEZXZpY2VJbmZvIHN0cnVjdHVyZXMgdG8gZmlsbCBpbgotbWF4RGV2aWNlcyAgLSBNYXhpbXVtIG51bWJlciBvZiBvZiBkZXZpY2VzIHRvIGVudW1lcmF0ZSBpbnRvIGFycmF5Ci0KLVJFVFVSTlM6Ci1OdW1iZXIgb2YgUENJIGRldmljZXMgZm91bmQgYW5kIGVudW1lcmF0ZWQgb24gdGhlIFBDSSBidXMsIDAgaWYgbm90IFBDSS4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVudW1lcmF0ZSBhbGwgYXZhaWxhYmxlIGRldmljZXMgb24gdGhlIFBDSSBidXMgaW50byBhbiBhcnJheQotb2YgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBibG9ja3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBQQ0lfZW51bWVyYXRlTWVjaDEoCi0gICAgUENJRGV2aWNlSW5mbyBpbmZvW10pCi17Ci0gICAgaW50ICAgICAgICAgICAgIGJ1cyxkZXZpY2UsZnVuY3Rpb24saSxudW1Gb3VuZCA9IDA7Ci0gICAgdWxvbmcgICAgICAgICAgICpscCx0bXA7Ci0gICAgUENJc2xvdCAgICAgICAgIHNsb3QgPSB7ezAsMCwwLDAsMCwwLDF9fTsKLSAgICBQQ0lEZXZpY2VJbmZvICAgcGNpLHByZXYgPSB7MH07Ci0KLSAgICAvKiBUcnkgUENJIGFjY2VzcyBtZWNoYW5pc20gMSAqLwotICAgIFBNX291dHBiKDB4Q0ZCLDB4MDEpOwotICAgIHRtcCA9IFBNX2lucGQoMHhDRjgpOwotICAgIFBNX291dHBkKDB4Q0Y4LHNsb3QuaSk7Ci0gICAgaWYgKChQTV9pbnBkKDB4Q0Y4KSA9PSBzbG90LmkpICYmIChQTV9pbnBkKDB4Q0ZDKSAhPSAweEZGRkZGRkZGVUwpKSB7Ci0JLyogUENJIGFjY2VzcyBtZWNoYW5pc20gMSAtIHRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtICovCi0JZm9yIChidXMgPSAwOyBidXMgPCA4OyBidXMrKykgewotCSAgICBzbG90LnAuQnVzID0gYnVzOwotCSAgICBmb3IgKGRldmljZSA9IDA7IGRldmljZSA8IDMyOyBkZXZpY2UrKykgewotCQlzbG90LnAuRGV2aWNlID0gZGV2aWNlOwotCQlmb3IgKGZ1bmN0aW9uID0gMDsgZnVuY3Rpb24gPCA4OyBmdW5jdGlvbisrKSB7Ci0JCSAgICBzbG90LnAuRnVuY3Rpb24gPSBmdW5jdGlvbjsKLQkJICAgIHNsb3QucC5SZWdpc3RlciA9IDA7Ci0JCSAgICBQTV9vdXRwZCgweENGOCxzbG90LmkpOwotCQkgICAgaWYgKFBNX2lucGQoMHhDRkMpICE9IDB4RkZGRkZGRkZVTCkgewotCQkJbWVtc2V0KCZwY2ksMCxzaXplb2YocGNpKSk7Ci0JCQlwY2kuZHdTaXplID0gc2l6ZW9mKHBjaSk7Ci0JCQlwY2kubWVjaDEgPSAxOwotCQkJcGNpLnNsb3QgPSBzbG90OwotCQkJbHAgPSAodWxvbmcqKSYocGNpLlZlbmRvcklEKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBOVU1fUENJX1JFRzsgaSsrLCBscCsrKSB7Ci0JCQkgICAgc2xvdC5wLlJlZ2lzdGVyID0gaTsKLQkJCSAgICBQTV9vdXRwZCgweENGOCxzbG90LmkpOwotCQkJICAgICpscCA9IFBNX2lucGQoMHhDRkMpOwotCQkJICAgIH0KLQkJCWlmICghQ2hlY2tEdXBsaWNhdGUoJnBjaSwmcHJldikpIHsKLQkJCSAgICBpZiAoaW5mbykKLQkJCQlDT1BZX1NUUlVDVFVSRSgmaW5mb1tudW1Gb3VuZF0sJnBjaSk7Ci0JCQkgICAgKytudW1Gb3VuZDsKLQkJCSAgICB9Ci0JCQlwcmV2ID0gcGNpOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCS8qIERpc2FibGUgUENJIGNvbmZpZyBjeWNsZSBvbiBleGl0ICovCi0JUE1fb3V0cGQoMHhDRjgsMCk7Ci0JcmV0dXJuIG51bUZvdW5kOwotCX0KLSAgICBQTV9vdXRwZCgweENGOCx0bXApOwotCi0gICAgLyogTm8gaGFyZHdhcmUgYWNjZXNzIG1lY2hhbmlzbSAxIGZvdW5kICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAgICAgLSBBcnJheSBvZiBQQ0lEZXZpY2VJbmZvIHN0cnVjdHVyZXMgdG8gZmlsbCBpbgotbWF4RGV2aWNlcyAgLSBNYXhpbXVtIG51bWJlciBvZiBvZiBkZXZpY2VzIHRvIGVudW1lcmF0ZSBpbnRvIGFycmF5Ci0KLVJFVFVSTlM6Ci1OdW1iZXIgb2YgUENJIGRldmljZXMgZm91bmQgYW5kIGVudW1lcmF0ZWQgb24gdGhlIFBDSSBidXMsIDAgaWYgbm90IFBDSS4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVudW1lcmF0ZSBhbGwgYXZhaWxhYmxlIGRldmljZXMgb24gdGhlIFBDSSBidXMgaW50byBhbiBhcnJheQotb2YgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBibG9ja3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBQQ0lfZW51bWVyYXRlTWVjaDIoCi0gICAgUENJRGV2aWNlSW5mbyBpbmZvW10pCi17Ci0gICAgaW50ICAgICAgICAgICAgIGJ1cyxkZXZpY2UsZnVuY3Rpb24saSxudW1Gb3VuZCA9IDA7Ci0gICAgdXNob3J0ICAgICAgICAgIGRldmljZUlPOwotICAgIHVsb25nICAgICAgICAgICAqbHA7Ci0gICAgUENJc2xvdCAgICAgICAgIHNsb3QgPSB7ezAsMCwwLDAsMCwwLDF9fTsKLSAgICBQQ0lEZXZpY2VJbmZvICAgcGNpLHByZXYgPSB7MH07Ci0KLSAgICAvKiBUcnkgUENJIGFjY2VzcyBtZWNoYW5pc20gMiAqLwotICAgIFBNX291dHBiKDB4Q0ZCLDB4MDApOwotICAgIFBNX291dHBiKDB4Q0Y4LDB4MDApOwotICAgIFBNX291dHBiKDB4Q0ZBLDB4MDApOwotICAgIGlmIChQTV9pbnBiKDB4Q0Y4KSA9PSAweDAwICYmIFBNX2lucGIoMHhDRkIpID09IDB4MDApIHsKLQkvKiBQQ0kgYWNjZXNzIG1lY2hhbmlzbSAyIC0gdGhlIG9sZGVyIG1lY2hhbmlzbSBmb3IgbGVnYWN5IGJ1c3NlcyAqLwotCWZvciAoYnVzID0gMDsgYnVzIDwgMjsgYnVzKyspIHsKLQkgICAgc2xvdC5wLkJ1cyA9IGJ1czsKLQkgICAgUE1fb3V0cGIoMHhDRkEsKHVjaGFyKWJ1cyk7Ci0JICAgIGZvciAoZGV2aWNlID0gMDsgZGV2aWNlIDwgMTY7IGRldmljZSsrKSB7Ci0JCXNsb3QucC5EZXZpY2UgPSBkZXZpY2U7Ci0JCWRldmljZUlPID0gMHhDMDAwICsgKGRldmljZSA8PCA4KTsKLQkJZm9yIChmdW5jdGlvbiA9IDA7IGZ1bmN0aW9uIDwgODsgZnVuY3Rpb24rKykgewotCQkgICAgc2xvdC5wLkZ1bmN0aW9uID0gZnVuY3Rpb247Ci0JCSAgICBzbG90LnAuUmVnaXN0ZXIgPSAwOwotCQkgICAgUE1fb3V0cGIoMHhDRjgsKHVjaGFyKSgoZnVuY3Rpb24gPDwgMSkgfCAweDEwKSk7Ci0JCSAgICBpZiAoUE1faW5wZChkZXZpY2VJTykgIT0gMHhGRkZGRkZGRlVMKSB7Ci0JCQltZW1zZXQoJnBjaSwwLHNpemVvZihwY2kpKTsKLQkJCXBjaS5kd1NpemUgPSBzaXplb2YocGNpKTsKLQkJCXBjaS5tZWNoMSA9IDA7Ci0JCQlwY2kuc2xvdCA9IHNsb3Q7Ci0JCQlscCA9ICh1bG9uZyopJihwY2kuVmVuZG9ySUQpOwotCQkJZm9yIChpID0gMDsgaSA8IE5VTV9QQ0lfUkVHOyBpKyssIGxwKyspIHsKLQkJCSAgICBzbG90LnAuUmVnaXN0ZXIgPSBpOwotCQkJICAgICpscCA9IFBNX2lucGQoZGV2aWNlSU8gKyAoaSA8PCAyKSk7Ci0JCQkgICAgfQotCQkJaWYgKCFDaGVja0R1cGxpY2F0ZSgmcGNpLCZwcmV2KSkgewotCQkJICAgIGlmIChpbmZvKQotCQkJCUNPUFlfU1RSVUNUVVJFKCZpbmZvW251bUZvdW5kXSwmcGNpKTsKLQkJCSAgICArK251bUZvdW5kOwotCQkJICAgIH0KLQkJCXByZXYgPSBwY2k7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JLyogRGlzYWJsZSBQQ0kgY29uZmlnIGN5Y2xlIG9uIGV4aXQgKi8KLQlQTV9vdXRwYigweENGOCwwKTsKLQlyZXR1cm4gbnVtRm91bmQ7Ci0JfQotCi0gICAgLyogTm8gaGFyZHdhcmUgYWNjZXNzIG1lY2hhbmlzbSAyIGZvdW5kICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbnMgcmVhZHMgYSBjb25maWd1cmF0aW9uIGR3b3JkIHZpYSB0aGUgUENJIEJJT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIFBDSUJJT1NfcmVhZERXT1JEKAotICAgIGludCBpbmRleCwKLSAgICB1bG9uZyBzbG90KQotewotICAgIHJldHVybiAodWxvbmcpX1BDSUJJT1Nfc2VydmljZShSRUFEX0NPTkZJR19EV09SRCxzbG90ID4+IDgsaW5kZXgsMCxQQ0lFbnRyeSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAgICAgLSBBcnJheSBvZiBQQ0lEZXZpY2VJbmZvIHN0cnVjdHVyZXMgdG8gZmlsbCBpbgotbWF4RGV2aWNlcyAgLSBNYXhpbXVtIG51bWJlciBvZiBvZiBkZXZpY2VzIHRvIGVudW1lcmF0ZSBpbnRvIGFycmF5Ci0KLVJFVFVSTlM6Ci1OdW1iZXIgb2YgUENJIGRldmljZXMgZm91bmQgYW5kIGVudW1lcmF0ZWQgb24gdGhlIFBDSSBidXMsIDAgaWYgbm90IFBDSS4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVudW1lcmF0ZSBhbGwgYXZhaWxhYmxlIGRldmljZXMgb24gdGhlIFBDSSBidXMgaW50byBhbiBhcnJheQotb2YgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBibG9ja3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBQQ0lfZW51bWVyYXRlQklPUygKLSAgICBQQ0lEZXZpY2VJbmZvIGluZm9bXSkKLXsKLSAgICB1Y2hhciAgICAgICAgICAgaHdUeXBlLGxhc3RCdXM7Ci0gICAgaW50ICAgICAgICAgICAgIGJ1cyxkZXZpY2UsZnVuY3Rpb24saSxudW1Gb3VuZCA9IDA7Ci0gICAgdWxvbmcgICAgICAgICAgICpscDsKLSAgICBQQ0lzbG90ICAgICAgICAgc2xvdCA9IHt7MCwwLDAsMCwwLDAsMX19OwotICAgIFBDSURldmljZUluZm8gICBwY2kscHJldiA9IHswfTsKLQotICAgIGlmIChQQ0lCSU9TX2RldGVjdCgmaHdUeXBlLCZsYXN0QnVzKSkgewotCS8qIFBDSSBCSU9TIGFjY2VzcyAtIHRoZSB1bHRpbWF0ZSBmYWxsYmFjayAqLwotCWZvciAoYnVzID0gMDsgYnVzIDw9IGxhc3RCdXM7IGJ1cysrKSB7Ci0JICAgIHNsb3QucC5CdXMgPSBidXM7Ci0JICAgIGZvciAoZGV2aWNlID0gMDsgZGV2aWNlIDwgMzI7IGRldmljZSsrKSB7Ci0JCXNsb3QucC5EZXZpY2UgPSBkZXZpY2U7Ci0JCWZvciAoZnVuY3Rpb24gPSAwOyBmdW5jdGlvbiA8IDg7IGZ1bmN0aW9uKyspIHsKLQkJICAgIHNsb3QucC5GdW5jdGlvbiA9IGZ1bmN0aW9uOwotCQkgICAgaWYgKFBDSUJJT1NfcmVhZERXT1JEKDAsc2xvdC5pKSAhPSAweEZGRkZGRkZGVUwpIHsKLQkJCW1lbXNldCgmcGNpLDAsc2l6ZW9mKHBjaSkpOwotCQkJcGNpLmR3U2l6ZSA9IHNpemVvZihwY2kpOwotCQkJcGNpLm1lY2gxID0gMjsKLQkJCXBjaS5zbG90ID0gc2xvdDsKLQkJCWxwID0gKHVsb25nKikmKHBjaS5WZW5kb3JJRCk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1BDSV9SRUc7IGkrKywgbHArKykKLQkJCSAgICAqbHAgPSBQQ0lCSU9TX3JlYWREV09SRChpIDw8IDIsc2xvdC5pKTsKLQkJCWlmICghQ2hlY2tEdXBsaWNhdGUoJnBjaSwmcHJldikpIHsKLQkJCSAgICBpZiAoaW5mbykKLQkJCQlDT1BZX1NUUlVDVFVSRSgmaW5mb1tudW1Gb3VuZF0sJnBjaSk7Ci0JCQkgICAgKytudW1Gb3VuZDsKLQkJCSAgICB9Ci0JCQlwcmV2ID0gcGNpOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAvKiBSZXR1cm4gbnVtYmVyIG9mIGRldmljZXMgZm91bmQgKi8KLSAgICByZXR1cm4gbnVtRm91bmQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAgICAgLSBBcnJheSBvZiBQQ0lEZXZpY2VJbmZvIHN0cnVjdHVyZXMgdG8gZmlsbCBpbgotbWF4RGV2aWNlcyAgLSBNYXhpbXVtIG51bWJlciBvZiBvZiBkZXZpY2VzIHRvIGVudW1lcmF0ZSBpbnRvIGFycmF5Ci0KLVJFVFVSTlM6Ci1OdW1iZXIgb2YgUENJIGRldmljZXMgZm91bmQgYW5kIGVudW1lcmF0ZWQgb24gdGhlIFBDSSBidXMsIDAgaWYgbm90IFBDSS4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVudW1lcmF0ZSBhbGwgYXZhaWxhYmxlIGRldmljZXMgb24gdGhlIFBDSSBidXMgaW50byBhbiBhcnJheQotb2YgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBibG9ja3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IF9BU01BUEkgUENJX2VudW1lcmF0ZSgKLSAgICBQQ0lEZXZpY2VJbmZvIGluZm9bXSkKLXsKLSAgICBpbnQgbnVtRm91bmQ7Ci0KLSAgICAvKiBGaXJzdCB0cnkgdmlhIHRoZSBkaXJlY3QgYWNjZXNzIG1lY2hhbmlzbXMgd2hpY2ggYXJlIGZhc3RlciBpZiB3ZQotICAgICAqIGhhdmUgdGhlbSAobmVhcmx5IGFsd2F5cykuIFRoZSBCSU9TIGlzIHVzZWQgYXMgYSBmYWxsYmFjaywgYW5kIGZvcgotICAgICAqIHN0dWZmIHdlIGNhbid0IGRvIGRpcmVjdGx5LgotICAgICAqLwotICAgIGlmICgobnVtRm91bmQgPSBQQ0lfZW51bWVyYXRlTWVjaDEoaW5mbykpID09IDApIHsKLQlpZiAoKG51bUZvdW5kID0gUENJX2VudW1lcmF0ZU1lY2gyKGluZm8pKSA9PSAwKSB7Ci0JICAgIGlmICgobnVtRm91bmQgPSBQQ0lfZW51bWVyYXRlQklPUyhpbmZvKSkgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIG51bUZvdW5kOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWluZm8gICAgICAgIC0gQXJyYXkgb2YgUENJRGV2aWNlSW5mbyBzdHJ1Y3R1cmVzIHRvIGZpbGwgaW4KLW1heERldmljZXMgIC0gTWF4aW11bSBudW1iZXIgb2Ygb2YgZGV2aWNlcyB0byBlbnVtZXJhdGUgaW50byBhcnJheQotCi1SRVRVUk5TOgotTnVtYmVyIG9mIFBDSSBkZXZpY2VzIGZvdW5kIGFuZCBlbnVtZXJhdGVkIG9uIHRoZSBQQ0kgYnVzLCAwIGlmIG5vdCBQQ0kuCi0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBlbnVtZXJhdGUgYWxsIGF2YWlsYWJsZSBkZXZpY2VzIG9uIHRoZSBQQ0kgYnVzIGludG8gYW4gYXJyYXkKLW9mIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYmxvY2tzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBfQVNNQVBJIFBDSV9nZXROdW1EZXZpY2VzKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBDSV9lbnVtZXJhdGUoTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFyIC0gQmFzZSBhZGRyZXNzIHRvIG1lYXN1cmUKLXBjaSAtIFBDSSBkZXZpY2UgdG8gYWNjZXNzCi0KLVJFVFVSTlM6Ci1TaXplIG9mIHRoZSBQQ0kgYmFzZSBhZGRyZXNzIGluIGJ5dGVzCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIG1lYXN1cmVzIHRoZSBzaXplIG9mIHRoZSBQQ0kgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIGluIGJ5dGVzLAotYnkgd3JpdGluZyBhbGwgRidzIHRvIHRoZSByZWdpc3RlciwgYW5kIHJlYWRpbmcgdGhlIHZhbHVlIGJhY2suIFRoZSBzaXplCi1vZiB0aGUgYmFzZSBhZGRyZXNzIGlzIGRldGVybWluZXMgYnkgdGhlIGJpdHMgdGhhdCBhcmUgaGFyZHdpcmVkIHRvIHplcm8ncy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfQVNNQVBJIFBDSV9maW5kQkFSU2l6ZSgKLSAgICBpbnQgYmFyLAotICAgIFBDSURldmljZUluZm8gKnBjaSkKLXsKLSAgICB1bG9uZyAgIGJhc2Usc2l6ZSA9IDA7Ci0KLSAgICBiYXNlID0gUENJX2FjY2Vzc1JlZyhiYXIsMCxQQ0lfUkVBRF9EV09SRCxwY2kpOwotICAgIGlmIChiYXNlICYmICEoYmFzZSAmIDB4MSkpIHsKLQkvKiBGb3Igc29tZSBzdHJhbmdlIHJlYXNvbiBzb21lIGRldmljZXMgZG9uJ3QgcHJvcGVybHkgZGVjb2RlCi0JICogdGhlaXIgYmFzZSBhZGRyZXNzIHJlZ2lzdGVycyAoSW50ZWwgUENJL1BDSSBicmlkZ2VzISksIGFuZAotCSAqIHdlIHJlYWQgY29tcGxldGVseSBib2d1cyB2YWx1ZXMuIFdlIGNoZWNrIGZvciB0aGF0IGhlcmUKLQkgKiBhbmQgY2xlYXIgb3V0IHRob3NlIEJBUidzLgotCSAqCi0JICogV2UgY2hlY2sgZm9yIHRoYXQgaGVyZSBiZWNhdXNlIGF0IGxlYXN0IHRoZSBsb3cgMTIgYml0cwotCSAqIG9mIHRoZSBhZGRyZXNzIHJhbmdlIG11c3QgYmUgemVyb3MsIHNpbmNlIHRoZSBwYWdlIHNpemUKLQkgKiBvbiBJQTMyIHByb2Nlc3NvcnMgaXMgYWx3YXlzIDRLYi4KLQkgKi8KLQlpZiAoKGJhc2UgJiAweEZGRikgPT0gMCkgewotCSAgICBQQ0lfYWNjZXNzUmVnKGJhciwweEZGRkZGRkZGLFBDSV9XUklURV9EV09SRCxwY2kpOwotCSAgICBzaXplID0gUENJX2FjY2Vzc1JlZyhiYXIsMCxQQ0lfUkVBRF9EV09SRCxwY2kpICYgfjB4RkY7Ci0JICAgIHNpemUgPSB+c2l6ZSsxOwotCSAgICBQQ0lfYWNjZXNzUmVnKGJhcixiYXNlLFBDSV9XUklURV9EV09SRCxwY2kpOwotCSAgICB9Ci0JfQotICAgIHBjaS0+c2xvdC5wLlJlZ2lzdGVyID0gMDsKLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbmRleCAgIC0gRFdPUkQgaW5kZXggb2YgdGhlIHJlZ2lzdGVyIHRvIGFjY2VzcwotdmFsdWUgICAtIFZhbHVlIHRvIHdyaXRlIHRvIHRoZSByZWdpc3RlciBmb3Igd3JpdGUgYWNjZXNzCi1mdW5jICAgIC0gRnVuY3Rpb24gdG8gaW1wbGVtZW50Ci0KLVJFVFVSTlM6Ci1UaGUgdmFsdWUgcmVhZCBmcm9tIHRoZSByZWdpc3RlciBmb3IgcmVhZCBvcGVyYXRpb25zCi0KLVJFTUFSS1M6Ci1UaGUgZnVuY3Rpb24gY29kZSBhcmUgZGVmaW5lZCBhcyBmb2xsb3dzCi0KLWNvZGUgICAgLSBmdW5jdGlvbgotMCAgICAgICAtIFJlYWQgQllURQotMSAgICAgICAtIFJlYWQgV09SRAotMiAgICAgICAtIFJlYWQgRFdPUkQKLTMgICAgICAgLSBXcml0ZSBCWVRFCi00ICAgICAgIC0gV3JpdGUgV09SRAotNSAgICAgICAtIFdyaXRlIERXT1JECi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX0FTTUFQSSBQQ0lfYWNjZXNzUmVnKAotICAgIGludCBpbmRleCwKLSAgICB1bG9uZyB2YWx1ZSwKLSAgICBpbnQgZnVuYywKLSAgICBQQ0lEZXZpY2VJbmZvICppbmZvKQotewotICAgIGludCBpb2Jhc2U7Ci0KLSAgICBpZiAoaW5mby0+bWVjaDEgPT0gMikgewotCS8qIFVzZSBQQ0kgQklPUyBhY2Nlc3Mgc2luY2Ugd2UgZG9udCBoYXZlIGRpcmVjdCBoYXJkd2FyZSBhY2Nlc3MgKi8KLQlzd2l0Y2ggKGZ1bmMpIHsKLQkgICAgY2FzZSBQQ0lfUkVBRF9CWVRFOgotCQlyZXR1cm4gKHVjaGFyKV9QQ0lCSU9TX3NlcnZpY2UoUkVBRF9DT05GSUdfQllURSxpbmZvLT5zbG90LmkgPj4gOCxpbmRleCwwLFBDSUVudHJ5KTsKLQkgICAgY2FzZSBQQ0lfUkVBRF9XT1JEOgotCQlyZXR1cm4gKHVzaG9ydClfUENJQklPU19zZXJ2aWNlKFJFQURfQ09ORklHX1dPUkQsaW5mby0+c2xvdC5pID4+IDgsaW5kZXgsMCxQQ0lFbnRyeSk7Ci0JICAgIGNhc2UgUENJX1JFQURfRFdPUkQ6Ci0JCXJldHVybiAodWxvbmcpX1BDSUJJT1Nfc2VydmljZShSRUFEX0NPTkZJR19EV09SRCxpbmZvLT5zbG90LmkgPj4gOCxpbmRleCwwLFBDSUVudHJ5KTsKLQkgICAgY2FzZSBQQ0lfV1JJVEVfQllURToKLQkJX1BDSUJJT1Nfc2VydmljZShXUklURV9DT05GSUdfQllURSxpbmZvLT5zbG90LmkgPj4gOCxpbmRleCx2YWx1ZSxQQ0lFbnRyeSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFBDSV9XUklURV9XT1JEOgotCQlfUENJQklPU19zZXJ2aWNlKFdSSVRFX0NPTkZJR19XT1JELGluZm8tPnNsb3QuaSA+PiA4LGluZGV4LHZhbHVlLFBDSUVudHJ5KTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgUENJX1dSSVRFX0RXT1JEOgotCQlfUENJQklPU19zZXJ2aWNlKFdSSVRFX0NPTkZJR19EV09SRCxpbmZvLT5zbG90LmkgPj4gOCxpbmRleCx2YWx1ZSxQQ0lFbnRyeSk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotICAgIGVsc2UgewotCS8qIFVzZSBkaXJlY3QgaGFyZHdhcmUgYWNjZXNzIG1lY2hhbmlzbXMgKi8KLQlpZiAoaW5mby0+bWVjaDEpIHsKLQkgICAgLyogUENJIGFjY2VzcyBtZWNoYW5pc20gMSAqLwotCSAgICBpb2Jhc2UgPSAweENGQyArIChpbmRleCAmIDMpOwotCSAgICBpbmZvLT5zbG90LnAuUmVnaXN0ZXIgPSBpbmRleCA+PiAyOwotCSAgICBQTV9vdXRwZCgweENGOCxpbmZvLT5zbG90LmkpOwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIC8qIFBDSSBhY2Nlc3MgbWVjaGFuaXNtIDIgKi8KLQkgICAgUE1fb3V0cGIoMHhDRjgsKHVjaGFyKSgoaW5mby0+c2xvdC5wLkZ1bmN0aW9uIDw8IDEpIHwgMHgxMCkpOwotCSAgICBQTV9vdXRwYigweENGQSwodWNoYXIpaW5mby0+c2xvdC5wLkJ1cyk7Ci0JICAgIGlvYmFzZSA9IDB4QzAwMCArIChpbmZvLT5zbG90LnAuRGV2aWNlIDw8IDgpICsgaW5kZXg7Ci0JICAgIH0KLQlzd2l0Y2ggKGZ1bmMpIHsKLQkgICAgY2FzZSBQQ0lfUkVBRF9CWVRFOgotCSAgICBjYXNlIFBDSV9SRUFEX1dPUkQ6Ci0JICAgIGNhc2UgUENJX1JFQURfRFdPUkQ6ICAgIHZhbHVlID0gUE1faW5wZChpb2Jhc2UpOyAgICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENJX1dSSVRFX0JZVEU6ICAgIFBNX291dHBiKGlvYmFzZSwodWNoYXIpdmFsdWUpOyAgYnJlYWs7Ci0JICAgIGNhc2UgUENJX1dSSVRFX1dPUkQ6ICAgIFBNX291dHB3KGlvYmFzZSwodXNob3J0KXZhbHVlKTsgYnJlYWs7Ci0JICAgIGNhc2UgUENJX1dSSVRFX0RXT1JEOiAgIFBNX291dHBkKGlvYmFzZSwodWxvbmcpdmFsdWUpOyAgYnJlYWs7Ci0JICAgIH0KLQlQTV9vdXRwZCgweENGOCwwKTsKLQl9Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW51bURldmljZXMgIC0gTnVtYmVyIG9mIGRldmljZXMgdG8gcXVlcnkgaW5mbyBmb3IKLQotUkVUVVJOUzoKLTAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IsIG51bWJlciBvZiBkZXZpY2VzIHRvIGVudW1lcmF0ZSBpZiBudW1EZXZpY2VzID0gMAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgUENJIHJvdXRpbmcgaW5mb3JtYXRpb24uIElmIHlvdSBwYXNzIGEgdmFsdWUgb2YKLTAgZm9yIG51bURldmljZXMsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gd2l0aCB0aGUgbnVtYmVyIG9mIGRldmljZXMKLW5lZWRlZCBpbiB0aGUgcm91dGluZyBidWZmZXIgdGhhdCB3aWxsIGJlIGZpbGxlZCBpbiBieSB0aGUgQklPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBfQVNNQVBJIFBDSV9nZXRJUlFSb3V0aW5nT3B0aW9ucygKLSAgICBpbnQgbnVtRGV2aWNlcywKLSAgICBQQ0lSb3V0ZUluZm8gKmJ1ZmZlcikKLXsKLSAgICBQQ0lSb3V0aW5nT3B0aW9uc0J1ZmZlciBidWY7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgcmV0OwotCi0gICAgaWYgKFBDSVBoeXNFbnRyeSkgewotCWJ1Zi5CdWZmZXJTaXplID0gbnVtRGV2aWNlcyAqIHNpemVvZihQQ0lSb3V0ZUluZm8pOwotCWJ1Zi5EYXRhQnVmZmVyID0gYnVmZmVyOwotCWlmICgocmV0ID0gX1BDSUJJT1NfZ2V0Um91dGluZygmYnVmLFBDSUVudHJ5KSkgPT0gMHg4OSkKLQkgICAgcmV0dXJuIGJ1Zi5CdWZmZXJTaXplIC8gc2l6ZW9mKFBDSVJvdXRlSW5mbyk7Ci0JaWYgKHJldCAhPSAwKQotCSAgICByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7Ci0JfQotCi0gICAgLyogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGlzIHZpYSB0aGUgUENJIEJJT1MgZnVuY3Rpb25zICovCi0gICAgcmV0dXJuIC0xOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWluZm8gICAgLSBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGRldmljZQotaW50UGluICAtIFZhbHVlIHRvIHN0b3JlIGluIHRoZSBQQ0kgSW50ZXJydXB0UGluIHJlZ2lzdGVyCi1JUlEgICAgIC0gTmV3IElTQSBJUlEgdG8gbWFwIHRoZSBQQ0kgaW50ZXJydXB0IHRvICgwLTE1KQotCi1SRVRVUk5TOgotVHJ1ZSBvbiBzdWNjZXNzLCBvciBmYWxzZSBpZiB0aGlzIGZ1bmN0aW9uIGZhaWxlZC4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgUENJIElSUSByb3V0aW5nIGZvciB0aGUgc3BlY2lmaWVkIGRldmljZSB0byB0aGUKLWRlc2lyZWQgUENJIGludGVycnVwdCBhbmQgdGhlIGRlc2lyZWQgSVNBIGJ1cyBjb21wYXRpYmxlIElSUS4gVGhpcyBmdW5jdGlvbgotbWF5IG5vdCBiZSBzdXBwb3J0ZWQgYnkgdGhlIFBDSSBCSU9TLCBpbiB3aGljaCBjYXNlIHRoaXMgZnVuY3Rpb24gd2lsbAotZmFpbC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBfQVNNQVBJIFBDSV9zZXRIYXJkd2FyZUlSUSgKLSAgICBQQ0lEZXZpY2VJbmZvICppbmZvLAotICAgIHVpbnQgaW50UGluLAotICAgIHVpbnQgSVJRKQotewotICAgIGlmIChQQ0lQaHlzRW50cnkpIHsKLQlpZiAoX1BDSUJJT1Nfc2V0SVJRKGluZm8tPnNsb3QuaSA+PiA4LGludFBpbixJUlEsUENJRW50cnkpKSB7Ci0JICAgIGluZm8tPnUudHlwZTAuSW50ZXJydXB0UGluID0gaW50UGluOwotCSAgICBpbmZvLT51LnR5cGUwLkludGVycnVwdExpbmUgPSBJUlE7Ci0JICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JcmV0dXJuIGZhbHNlOwotCX0KLQotICAgIC8qIFdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdGhpcyB2aWEgdGhlIFBDSSBCSU9TIGZ1bmN0aW9ucyAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1idXMgICAgICAgICAgICAgICAgIC0gQnVzIG51bWJlciB0byBnZW5lcmF0ZSB0aGUgc3BlY2lhbCBjeWNsZSBmb3IKLXNwZWNpYWxDeWNsZURhdGEgICAgLSBEYXRhIHRvIHNlbmQgZm9yIHRoZSBzcGVjaWFsIGN5bGUKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIGEgc3BlY2lhbCBjeWNsZSBvbiB0aGUgc3BlY2lmaWVkIGJ1cyB1c2luZyB3aXRoCi10aGUgc3BlY2lmaWVkIGRhdGEuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfQVNNQVBJIFBDSV9nZW5lcmF0ZVNwZWNpYWxDeWxlKAotICAgIHVpbnQgYnVzLAotICAgIHVsb25nIHNwZWNpYWxDeWNsZURhdGEpCi17Ci0gICAgaWYgKFBDSVBoeXNFbnRyeSkKLQlfUENJQklPU19zcGVjaWFsQ3ljbGUoYnVzLHNwZWNpYWxDeWNsZURhdGEsUENJRW50cnkpOwotICAgIC8qIFdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdGhpcyB2aWEgdGhlIFBDSSBCSU9TIGZ1bmN0aW9ucyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWluZm8gICAgLSBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIGJsb2NrIGZvciBkZXZpY2UgdG8gYWNjZXNzCi1pbmRleCAgIC0gSW5kZXggb2YgcmVnaXN0ZXIgdG8gc3RhcnQgcmVhZGluZyBmcm9tCi1kc3QgICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHZhbHVlcyByZWFkIGZyb20gY29uZmlndXJhdGlvbiBzcGFjZQotY291bnQgICAtIENvdW50IG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSBjb25maWd1cmF0aW9uIHNwYWNlCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBhIGJsb2NrIG9mIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHJlZ2lzdGVycwotZnJvbSB0aGUgY29uZmlndXJhdGlvbiBzcGFjZSBpbnRvIHRoZSBwYXNzZWQgaW4gZGF0YSBibG9jay4gVGhpcyBmdW5jdGlvbgotd2lsbCBwcm9wZXJseSBoYW5kbGUgcmVhZGluZyBub24tRFdPUkQgYWxpZ25lZCBkYXRhIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24KLXNwYWNlIGNvcnJlY3RseS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9BU01BUEkgUENJX3JlYWRSZWdCbG9jaygKLSAgICBQQ0lEZXZpY2VJbmZvICppbmZvLAotICAgIGludCBpbmRleCwKLSAgICB2b2lkICpkc3QsCi0gICAgaW50IGNvdW50KQotewotICAgIHVjaGFyICAgKnBiOwotICAgIHVsb25nICAgKnBkOwotICAgIGludCAgICAgaTsKLSAgICBpbnQgICAgIHN0YXJ0Q291bnQgPSAoaW5kZXggJiAzKTsKLSAgICBpbnQgICAgIG1pZGRsZUNvdW50ID0gKGNvdW50IC0gc3RhcnRDb3VudCkgPj4gMjsKLSAgICBpbnQgICAgIGVuZENvdW50ID0gY291bnQgLSBtaWRkbGVDb3VudCAqIDQgLSBzdGFydENvdW50OwotCi0gICAgZm9yIChpID0gMCxwYiA9IGRzdDsgaSA8IHN0YXJ0Q291bnQ7IGkrKywgaW5kZXgrKykgewotCSpwYisrID0gKHVjaGFyKVBDSV9hY2Nlc3NSZWcoaW5kZXgsMCxQQ0lfUkVBRF9CWVRFLGluZm8pOwotCX0KLSAgICBmb3IgKGkgPSAwLHBkID0gKHVsb25nKilwYjsgaSA8IG1pZGRsZUNvdW50OyBpKyssIGluZGV4ICs9IDQpIHsKLQkqcGQrKyA9ICh1bG9uZylQQ0lfYWNjZXNzUmVnKGluZGV4LDAsUENJX1JFQURfRFdPUkQsaW5mbyk7Ci0JfQotICAgIGZvciAoaSA9IDAscGIgPSAodWNoYXIqKXBkOyBpIDwgZW5kQ291bnQ7IGkrKywgaW5kZXgrKykgewotCSpwYisrID0gKHVjaGFyKVBDSV9hY2Nlc3NSZWcoaW5kZXgsMCxQQ0lfUkVBRF9CWVRFLGluZm8pOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbmZvICAgIC0gUENJIGRldmljZSBpbmZvcm1hdGlvbiBibG9jayBmb3IgZGV2aWNlIHRvIGFjY2VzcwotaW5kZXggICAtIEluZGV4IG9mIHJlZ2lzdGVyIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbQotZHN0ICAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSB2YWx1ZXMgcmVhZCBmcm9tIGNvbmZpZ3VyYXRpb24gc3BhY2UKLWNvdW50ICAgLSBDb3VudCBvZiBieXRlcyB0byByZWFkIGZyb20gY29uZmlndXJhdGlvbiBzcGFjZQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdyaXRlIGEgYmxvY2sgb2YgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgcmVnaXN0ZXJzCi10byB0aGUgY29uZmlndXJhdGlvbiBzcGFjZSBmcm9tIHRoZSBwYXNzZWQgaW4gZGF0YSBibG9jay4gVGhpcyBmdW5jdGlvbgotd2lsbCBwcm9wZXJseSBoYW5kbGUgd3JpdGluZyBub24tRFdPUkQgYWxpZ25lZCBkYXRhIHRvIHRoZSBjb25maWd1cmF0aW9uCi1zcGFjZSBjb3JyZWN0bHkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfQVNNQVBJIFBDSV93cml0ZVJlZ0Jsb2NrKAotICAgIFBDSURldmljZUluZm8gKmluZm8sCi0gICAgaW50IGluZGV4LAotICAgIHZvaWQgKnNyYywKLSAgICBpbnQgY291bnQpCi17Ci0gICAgdWNoYXIgICAqcGI7Ci0gICAgdWxvbmcgICAqcGQ7Ci0gICAgaW50ICAgICBpOwotICAgIGludCAgICAgc3RhcnRDb3VudCA9IChpbmRleCAmIDMpOwotICAgIGludCAgICAgbWlkZGxlQ291bnQgPSAoY291bnQgLSBzdGFydENvdW50KSA+PiAyOwotICAgIGludCAgICAgZW5kQ291bnQgPSBjb3VudCAtIG1pZGRsZUNvdW50ICogNCAtIHN0YXJ0Q291bnQ7Ci0KLSAgICBmb3IgKGkgPSAwLHBiID0gc3JjOyBpIDwgc3RhcnRDb3VudDsgaSsrLCBpbmRleCsrKSB7Ci0JUENJX2FjY2Vzc1JlZyhpbmRleCwqcGIrKyxQQ0lfV1JJVEVfQllURSxpbmZvKTsKLQl9Ci0gICAgZm9yIChpID0gMCxwZCA9ICh1bG9uZyopcGI7IGkgPCBtaWRkbGVDb3VudDsgaSsrLCBpbmRleCArPSA0KSB7Ci0JUENJX2FjY2Vzc1JlZyhpbmRleCwqcGQrKyxQQ0lfV1JJVEVfRFdPUkQsaW5mbyk7Ci0JfQotICAgIGZvciAoaSA9IDAscGIgPSAodWNoYXIqKXBkOyBpIDwgZW5kQ291bnQ7IGkrKywgaW5kZXgrKykgewotCVBDSV9hY2Nlc3NSZWcoaW5kZXgsKnBiKyssUENJX1dSSVRFX0JZVEUsaW5mbyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL3VuaXhpby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL3VuaXhpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2E2NmE3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi91bml4aW8uYworKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBNb2R1bGUgY29udGFpbmluZyBVbml4IEkvTyBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHtzZWNyZXR9ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgRElSICAgICAqZDsKLSAgICBjaGFyICAgIHBhdGhbUE1fTUFYX1BBVEhdOwotICAgIGNoYXIgICAgbWFza1tQTV9NQVhfUEFUSF07Ci0gICAgfSBQTV9maW5kSGFuZGxlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUludGVybmFsIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIGZpbmQgZGF0YSB0byB0aGUgZ2VuZXJpYyBpbnRlcmZhY2UuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY29udmVydEZpbmREYXRhKAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSwKLSAgICBzdHJ1Y3QgZGlyZW50ICpibGssCi0gICAgY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICB1bG9uZyAgICAgICBkd1NpemUgPSBmaW5kRGF0YS0+ZHdTaXplOwotICAgIHN0cnVjdCBzdGF0IHN0OwotICAgIGNoYXIgICAgICAgIGZpbGVuYW1lW1BNX01BWF9QQVRIXTsKLQotICAgIG1lbXNldChmaW5kRGF0YSwwLGZpbmREYXRhLT5kd1NpemUpOwotICAgIGZpbmREYXRhLT5kd1NpemUgPSBkd1NpemU7Ci0gICAgc3RyY3B5KGZpbGVuYW1lLHBhdGgpOwotICAgIFBNX2JhY2tzbGFzaChmaWxlbmFtZSk7Ci0gICAgc3RyY2F0KGZpbGVuYW1lLGJsay0+ZF9uYW1lKTsKLSAgICBzdGF0KGZpbGVuYW1lLCZzdCk7Ci0gICAgaWYgKCEoc3Quc3RfbW9kZSAmIFNfSVdSSVRFKSkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfUkVBRE9OTFk7Ci0gICAgaWYgKHN0LnN0X21vZGUgJiBTX0lGRElSKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9ESVJFQ1RPUlk7Ci0gICAgZmluZERhdGEtPnNpemVMbyA9IHN0LnN0X3NpemU7Ci0gICAgZmluZERhdGEtPnNpemVIaSA9IDA7Ci0gICAgc3RybmNweShmaW5kRGF0YS0+bmFtZSxibGstPmRfbmFtZSxQTV9NQVhfUEFUSCk7Ci0gICAgZmluZERhdGEtPm5hbWVbUE1fTUFYX1BBVEgtMV0gPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURldGVybWluZXMgaWYgYSBmaWxlIG5hbWUgbWF0Y2hlcyB0aGUgcGFzc2VkIGluIHBhdHRlcm4uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIGZpbGVtYXRjaCgKLSAgICBjaGFyICpwYXR0ZXJuLAotICAgIGNoYXIgKmRpcnBhdGgsCi0gICAgc3RydWN0IGRpcmVudCAqZGlyZSkKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICBpbnQgICAgICAgICBpID0gMCxqID0gMCxsYXN0Y2hhciA9ICdcMCc7Ci0gICAgY2hhciAgICAgICAgZnVsbHBhdGhbUE1fTUFYX1BBVEhdOwotCi0gICAgc3RyY3B5KGZ1bGxwYXRoLGRpcnBhdGgpOwotICAgIFBNX2JhY2tzbGFzaChmdWxscGF0aCk7Ci0gICAgc3RyY2F0KGZ1bGxwYXRoLCBkaXJlLT5kX25hbWUpOwotICAgIGlmIChzdGF0KGZ1bGxwYXRoLCAmc3QpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIGZvciAoOyBpIDwgKGludClzdHJsZW4oZGlyZS0+ZF9uYW1lKSAmJiBqIDwgKGludClzdHJsZW4ocGF0dGVybik7IGkrKywgaisrKSB7Ci0JaWYgKHBhdHRlcm5bal0gPT0gJyonICYmIGxhc3RjaGFyICE9ICdcXCcpIHsKLQkgICAgaWYgKHBhdHRlcm5baisxXSA9PSAnXDAnKQotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgd2hpbGUgKGRpcmUtPmRfbmFtZVtpKytdICE9IHBhdHRlcm5baisxXSkgewotCQlpZiAoZGlyZS0+ZF9uYW1lW2ldID09ICdcMCcpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgaSAtPSAyOwotCSAgICB9Ci0JZWxzZSBpZiAoZGlyZS0+ZF9uYW1lW2ldICE9IHBhdHRlcm5bal0gJiYKLQkJIShwYXR0ZXJuW2pdID09ICc/JyAmJiBsYXN0Y2hhciAhPSAnXFwnKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCWxhc3RjaGFyID0gcGF0dGVybltpXTsKLQl9Ci0gICAgaWYgKGogPT0gKGludClzdHJsZW4ocGF0dGVybikgJiYgaSA9PSAoaW50KXN0cmxlbihkaXJlLT5kX25hbWUpKQotCXJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBmaXJzdCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9maW5kRmlyc3RGaWxlKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICBQTV9maW5kSGFuZGxlICAgKmQ7Ci0gICAgc3RydWN0IGRpcmVudCAgICpkaXJlOwotICAgIGNoYXIgICAgICAgICAgICBuYW1lW1BNX01BWF9QQVRIXTsKLSAgICBjaGFyICAgICAgICAgICAgZXh0W1BNX01BWF9QQVRIXTsKLQotICAgIGlmICgoZCA9IFBNX21hbGxvYyhzaXplb2YoKmQpKSkgPT0gTlVMTCkKLQlyZXR1cm4gUE1fRklMRV9JTlZBTElEOwotICAgIFBNX3NwbGl0cGF0aChmaWxlbmFtZSxOVUxMLGQtPnBhdGgsbmFtZSxleHQpOwotICAgIHN0cmNweShkLT5tYXNrLG5hbWUpOwotICAgIHN0cmNhdChkLT5tYXNrLGV4dCk7Ci0gICAgaWYgKHN0cmxlbihkLT5wYXRoKSA9PSAwKQotCXN0cmNweShkLT5wYXRoLCAiLiIpOwotICAgIGlmIChkLT5wYXRoW3N0cmxlbihkLT5wYXRoKS0xXSA9PSAnLycpCi0JZC0+cGF0aFtzdHJsZW4oZC0+cGF0aCktMV0gPSAwOwotICAgIGlmICgoZC0+ZCA9IG9wZW5kaXIoZC0+cGF0aCkpICE9IE5VTEwpIHsKLQl3aGlsZSAoKGRpcmUgPSByZWFkZGlyKGQtPmQpKSAhPSBOVUxMKSB7Ci0JICAgIGlmIChmaWxlbWF0Y2goZC0+bWFzayxkLT5wYXRoLGRpcmUpKSB7Ci0JCWNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSxkaXJlLGQtPnBhdGgpOwotCQlyZXR1cm4gZDsKLQkJfQotCSAgICB9Ci0JY2xvc2VkaXIoZC0+ZCk7Ci0JfQotICAgIFBNX2ZyZWUoZCk7Ci0gICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBuZXh0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZmluZE5leHRGaWxlKAotICAgIHZvaWQgKmhhbmRsZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgUE1fZmluZEhhbmRsZSAgICpkID0gaGFuZGxlOwotICAgIHN0cnVjdCBkaXJlbnQgICAqZGlyZTsKLQotICAgIHdoaWxlICgoZGlyZSA9IHJlYWRkaXIoZC0+ZCkpICE9IE5VTEwpIHsKLQlpZiAoZmlsZW1hdGNoKGQtPm1hc2ssZC0+cGF0aCxkaXJlKSkgewotCSAgICBjb252ZXJ0RmluZERhdGEoZmluZERhdGEsZGlyZSxkLT5wYXRoKTsKLQkgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZpbmRDbG9zZSgKLSAgICB2b2lkICpoYW5kbGUpCi17Ci0gICAgUE1fZmluZEhhbmRsZSAgICpkID0gaGFuZGxlOwotCi0gICAgY2xvc2VkaXIoZC0+ZCk7Ci0gICAgZnJlZShkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZSBpcyBhIHZhbGlkIGRyaXZlIG9yIG5vdC4gVW5kZXIgVW5peCB0aGlzCi1mdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZXhjZXB0IGEgdmFsdWUgb2YgMyAoY29uc2lkZXJlZAotdGhlIHJvb3QgZHJpdmUsIGFuZCBlcXVpdmFsZW50IHRvIEM6IGZvciBub24tVW5peCBzeXN0ZW1zKS4gVGhlIGRyaXZlCi1udW1iZXJpbmcgaXM6Ci0KLSAgICAxICAgLSBEcml2ZSBBOgotICAgIDIgICAtIERyaXZlIEI6Ci0gICAgMyAgIC0gRHJpdmUgQzoKLSAgICBldGMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCi0gICAgY2hhciBkcml2ZSkKLXsKLSAgICBpZiAoZHJpdmUgPT0gMykKLQlyZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWZlZCBkcml2ZS4KLVVuZGVyIFVuaXggdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcmVnYXJkbGVzcwotb2Ygd2hhdCB0aGUgdmFsdWUgb2YgJ2RyaXZlJyBpcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2dldGRjd2QoCi0gICAgaW50IGRyaXZlLAotICAgIGNoYXIgKmRpciwKLSAgICBpbnQgbGVuKQotewotICAgICh2b2lkKWRyaXZlOwotICAgIGdldGN3ZChkaXIsbGVuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgdWludCBhdHRyaWIpCi17Ci0gICAgc3RydWN0IHN0YXQgc3Q7Ci0gICAgbW9kZV90ICAgICAgbW9kZTsKLQotICAgIHN0YXQoZmlsZW5hbWUsJnN0KTsKLSAgICBtb2RlID0gc3Quc3RfbW9kZTsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9SRUFET05MWSkKLQltb2RlICY9IH5TX0lXUklURTsKLSAgICBlbHNlCi0JbW9kZSB8PSBTX0lXUklURTsKLSAgICBjaG1vZChmaWxlbmFtZSxtb2RlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQgUE1BUEkgUE1fZ2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgc3RydWN0IHN0YXQgc3Q7Ci0KLSAgICBzdGF0KGZpbGVuYW1lLCZzdCk7Ci0gICAgaWYgKHN0LnN0X21vZGUgJiBTX0lXUklURSkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gUE1fRklMRV9SRUFET05MWTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fbWtkaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgcmV0dXJuIG1rZGlyKGZpbGVuYW1lLDB4MUZGKSA9PSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ybWRpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICByZXR1cm4gcm1kaXIoZmlsZW5hbWUpID09IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9nZXRGaWxlVGltZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBpYm9vbCBnbVRpbWUsCi0gICAgUE1fdGltZSAqdGltZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClnbVRpbWU7Ci0gICAgKHZvaWQpdGltZTsKLSAgICBQTV9mYXRhbEVycm9yKCJQTV9nZXRGaWxlVGltZSBub3QgaW1wbGVtZW50ZWQgeWV0ISIpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBzZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3NldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWdtVGltZTsKLSAgICAodm9pZCl0aW1lOwotICAgIFBNX2ZhdGFsRXJyb3IoIlBNX3NldEZpbGVUaW1lIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL3ZnYXN0YXRlLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vdmdhc3RhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1NmU5YS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vdmdhc3RhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgICAgICAgICAgICAgICAgUG9ydGlvbnMgY29weXJpZ2h0IChDKSBKb3NoIFZhbmRlcmhvb2YKLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBGdW5jdGlvbnMgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgVkdBIGhhcmR3YXJlIHN0YXRlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaWYgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0jaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKLSNlbHNlCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVkdBIGluZGV4IHJlZ2lzdGVyIHBvcnRzICovCi0jZGVmaW5lIENSVF9JICAgMHgzRDQgICAgICAgLyogQ1JUIENvbnRyb2xsZXIgSW5kZXggICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBVFRfSVcgIDB4M0MwICAgICAgIC8qIEF0dHJpYnV0ZSBDb250cm9sbGVyIEluZGV4ICYgRGF0YSAgICAgICAgKi8KLSNkZWZpbmUgR1JBX0kgICAweDNDRSAgICAgICAvKiBHcmFwaGljcyBDb250cm9sbGVyIEluZGV4ICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNFUV9JICAgMHgzQzQgICAgICAgLyogU2VxdWVuY2VyIEluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKiBWR0EgZGF0YSByZWdpc3RlciBwb3J0cyAqLwotI2RlZmluZSBDUlRfRCAgIDB4M0Q1ICAgICAgIC8qIENSVCBDb250cm9sbGVyIERhdGEgUmVnaXN0ZXIgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQVRUX1IgICAweDNDMSAgICAgICAvKiBBdHRyaWJ1dGUgQ29udHJvbGxlciBEYXRhIFJlYWQgUmVnaXN0ZXIgICovCi0jZGVmaW5lIEdSQV9EICAgMHgzQ0YgICAgICAgLyogR3JhcGhpY3MgQ29udHJvbGxlciBEYXRhIFJlZ2lzdGVyICAgICAgICAqLwotI2RlZmluZSBTRVFfRCAgIDB4M0M1ICAgICAgIC8qIFNlcXVlbmNlciBEYXRhIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTUlTX1IgICAweDNDQyAgICAgICAvKiBNaXNjIE91dHB1dCBSZWFkIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE1JU19XICAgMHgzQzIgICAgICAgLyogTWlzYyBPdXRwdXQgV3JpdGUgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJUzFfUiAgIDB4M0RBICAgICAgIC8qIElucHV0IFN0YXR1cyBSZWdpc3RlciAxICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUEVMX0lXICAweDNDOCAgICAgICAvKiBQRUwgV3JpdGUgSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFBFTF9JUiAgMHgzQzcgICAgICAgLyogUEVMIFJlYWQgSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBQRUxfRCAgIDB4M0M5ICAgICAgIC8qIFBFTCBEYXRhIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyogc3RhbmRhcmQgVkdBIGluZGV4ZXMgbWF4IGNvdW50cyAqLwotI2RlZmluZSBDUlRfQyAgIDI0ICAgICAgICAgIC8qIDI0ICBDUlQgQ29udHJvbGxlciBSZWdpc3RlcnMgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQVRUX0MgICAyMSAgICAgICAgICAvKiAyMSAgQXR0cmlidXRlIENvbnRyb2xsZXIgUmVnaXN0ZXJzICAgICAgICovCi0jZGVmaW5lIEdSQV9DICAgOSAgICAgICAgICAgLyogOSAgIEdyYXBoaWNzIENvbnRyb2xsZXIgUmVnaXN0ZXJzICAgICAgICAqLwotI2RlZmluZSBTRVFfQyAgIDUgICAgICAgICAgIC8qIDUgICBTZXF1ZW5jZXIgUmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTUlTX0MgICAxICAgICAgICAgICAvKiAxICAgTWlzYyBPdXRwdXQgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFBBTF9DICAgNzY4ICAgICAgICAgLyogNzY4IFBhbGV0dGUgUmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGT05UX0MgIDgxOTIgICAgICAgIC8qIFRvdGFsIHNpemUgb2YgY2hhcmFjdGVyIGdlbmVyYXRvciBSQU0gICAgKi8KLQotLyogVkdBIHJlZ2lzdGVycyBzYXZpbmcgaW5kZXhlcyAqLwotI2RlZmluZSBDUlQgICAgIDAgICAgICAgICAgIC8qIENSVCBDb250cm9sbGVyIFJlZ2lzdGVycyBzdGFydCAgICAgICAgICAgKi8KLSNkZWZpbmUgQVRUICAgICAoQ1JUK0NSVF9DKSAvKiBBdHRyaWJ1dGUgQ29udHJvbGxlciBSZWdpc3RlcnMgc3RhcnQgICAgICovCi0jZGVmaW5lIEdSQSAgICAgKEFUVCtBVFRfQykgLyogR3JhcGhpY3MgQ29udHJvbGxlciBSZWdpc3RlcnMgc3RhcnQgICAgICAqLwotI2RlZmluZSBTRVEgICAgIChHUkErR1JBX0MpIC8qIFNlcXVlbmNlciBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTUlTICAgICAoU0VRK1NFUV9DKSAvKiBHZW5lcmFsIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFBBTCAgICAgKE1JUytNSVNfQykgLyogVkdBIFBhbGV0dGUgUmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGT05UICAgIChQQUwrUEFMX0MpIC8qIFZHQSBmb250IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyogTWFjcm9zIGZvciBwb3J0IEkvTyB3aXRoIGFyZ3VtZW50cyByZXZlcnNlZCAqLwotCi0jZGVmaW5lIF9wb3J0X291dCh2LHApICBQTV9vdXRwYihwLCh1Y2hhcikodikpCi0jZGVmaW5lIF9wb3J0X2luKHApICAgICBQTV9pbnBiKHApCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgVkdBIHN0YXRlIGJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0VkdBU3RhdGVTaXplKHZvaWQpCi17Ci0gICAgcmV0dXJuIENSVF9DICsgQVRUX0MgKyBHUkFfQyArIFNFUV9DICsgTUlTX0MgKyBQQUxfQyArIEZPTlRfQzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWxheSBmb3IgYSBzaG9ydCBwZXJpb2Qgb2YgdGltZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB2Z2FfZGVsYXkodm9pZCkKLXsKLSAgICBpbnQgaTsKLQotICAgIC8qIEZvciB0aGUgbG9vcCBoZXJlIHdlIHByb2dyYW0gdGhlIFBPU1QgcmVnaXN0ZXIuIFRoZSBsZW5ndGggb2YgdGhpcwotICAgICAqIGRlbGF5IGlzIGRlcGVuZGFudCBvbmx5IG9uIElTQSBidXMgc3BlZWQsIGJ1dCBpdCBpcyBlbm91Z2ggZm9yCi0gICAgICogd2hhdCB3ZSBuZWVkLgotICAgICAqLwotICAgIGZvciAoaSA9IDA7IGkgPD0gMTA7IGkrKykKLQlQTV9vdXRwYigweDgwLCAwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1wb3J0ICAgIC0gSS9PIHBvcnQgdG8gcmVhZCB2YWx1ZSBmcm9tCi1pbmRleCAgIC0gUG9ydCBpbmRleCB0byByZWFkCi0KLVJFVFVSTlM6Ci1CeXRlIHJlYWQgZnJvbSAncG9ydCcgcmVnaXN0ZXIgJ2luZGV4Jy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdXNob3J0IHZnYV9yZGlueCgKLSAgICB1c2hvcnQgcG9ydCwKLSAgICB1c2hvcnQgaW5kZXgpCi17Ci0gICAgUE1fb3V0cGIocG9ydCwodWNoYXIpaW5kZXgpOwotICAgIHJldHVybiBQTV9pbnBiKHBvcnQrMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcG9ydCAgICAtIEkvTyBwb3J0IHRvIHdyaXRlIHRvCi1pbmRleCAgIC0gUG9ydCBpbmRleCB0byB3cml0ZQotdmFsdWUgICAtIEJ5dGUgdG8gd3JpdGUgdG8gcG9ydAotCi1SRU1BUktTOgotV3JpdGVzIGEgYnl0ZSB2YWx1ZSB0byB0aGUgJ3BvcnQnIHJlZ2lzdGVyICdpbmRleCcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdmdhX3dyaW54KAotICAgIHVzaG9ydCBwb3J0LAotICAgIHVzaG9ydCBpbmRleCwKLSAgICB1c2hvcnQgdmFsdWUpCi17Ci0gICAgUE1fb3V0cGIocG9ydCwodWNoYXIpaW5kZXgpOwotICAgIFBNX291dHBiKHBvcnQrMSwodWNoYXIpdmFsdWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhdmUgdGhlIGNvbG9yIHBhbGV0dGUgdmFsdWVzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdmdhX3NhdmVwYWxldHRlKAotICAgIHVjaGFyICpwYWwpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBfcG9ydF9vdXQoMCwgUEVMX0lSKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNzY4OyBpKyspIHsKLQl2Z2FfZGVsYXkoKTsKLQkqcGFsKysgPSBfcG9ydF9pbihQRUxfRCk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIGNvbG9yIHBhbGV0dGUgdmFsdWVzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdmdhX3Jlc3RvcmVwYWxldHRlKAotICAgIGNvbnN0IHVjaGFyICpwYWwpCi17Ci0gICAgaW50IGk7Ci0KLSAgICAvKiByZXN0b3JlIHNhdmVkIHBhbGV0dGUgKi8KLSAgICBfcG9ydF9vdXQoMCwgUEVMX0lXKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNzY4OyBpKyspIHsKLQl2Z2FfZGVsYXkoKTsKLQlfcG9ydF9vdXQoKnBhbCsrLCBQRUxfRCk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGZvbnQgZGF0YSBmcm9tIHRoZSBWR0EgY2hhcmFjdGVyIGdlbmVyYXRvciBSQU0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB2Z2Ffc2F2ZUZvbnQoCi0gICAgdWNoYXIgKmRhdGEpCi17Ci0gICAgdWNoYXIgICAqQTAwMDBQdHIgPSBQTV9nZXRBMDAwMFBvaW50ZXIoKTsKLSAgICB1Y2hhciAgIHNhdmVbN107Ci0KLSAgICAvKiBFbmFibGUgYWNjZXNzIHRvIGNoYXJhY3RlciBnZW5lcmF0b3IgUkFNICovCi0gICAgc2F2ZVswXSA9ICh1Y2hhcil2Z2FfcmRpbngoU0VRX0ksMHgwMCk7Ci0gICAgc2F2ZVsxXSA9ICh1Y2hhcil2Z2FfcmRpbngoU0VRX0ksMHgwMik7Ci0gICAgc2F2ZVsyXSA9ICh1Y2hhcil2Z2FfcmRpbngoU0VRX0ksMHgwNCk7Ci0gICAgc2F2ZVszXSA9ICh1Y2hhcil2Z2FfcmRpbngoU0VRX0ksMHgwMCk7Ci0gICAgc2F2ZVs0XSA9ICh1Y2hhcil2Z2FfcmRpbngoR1JBX0ksMHgwNCk7Ci0gICAgc2F2ZVs1XSA9ICh1Y2hhcil2Z2FfcmRpbngoR1JBX0ksMHgwNSk7Ci0gICAgc2F2ZVs2XSA9ICh1Y2hhcil2Z2FfcmRpbngoR1JBX0ksMHgwNik7Ci0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDAsMHgwMSk7Ci0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDIsMHgwNCk7Ci0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDQsMHgwNyk7Ci0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDAsMHgwMyk7Ci0gICAgdmdhX3dyaW54KEdSQV9JLDB4MDQsMHgwMik7Ci0gICAgdmdhX3dyaW54KEdSQV9JLDB4MDUsMHgwMCk7Ci0gICAgdmdhX3dyaW54KEdSQV9JLDB4MDYsMHgwMCk7Ci0KLSAgICAvKiBDb3B5IGNoYXJhY3RlciBnZW5lcmF0b3IgUkFNICovCi0gICAgbWVtY3B5KGRhdGEsQTAwMDBQdHIsRk9OVF9DKTsKLQotICAgIC8qIFJlc3RvcmUgVkdBIHN0YXRlICovCi0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDAsc2F2ZVswXSk7Ci0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDIsc2F2ZVsxXSk7Ci0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDQsc2F2ZVsyXSk7Ci0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDAsc2F2ZVszXSk7Ci0gICAgdmdhX3dyaW54KEdSQV9JLDB4MDQsc2F2ZVs0XSk7Ci0gICAgdmdhX3dyaW54KEdSQV9JLDB4MDUsc2F2ZVs1XSk7Ci0gICAgdmdhX3dyaW54KEdSQV9JLDB4MDYsc2F2ZVs2XSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRG93bmxvYWRzIHRoZSBmb250IGRhdGEgdG8gdGhlIFZHQSBjaGFyYWN0ZXIgZ2VuZXJhdG9yIFJBTQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHZnYV9yZXN0b3JlRm9udCgKLSAgICBjb25zdCB1Y2hhciAqZGF0YSkKLXsKLSAgICB1Y2hhciAgICpBMDAwMFB0ciA9IFBNX2dldEEwMDAwUG9pbnRlcigpOwotCi0gICAgLyogRW5hYmxlIGFjY2VzcyB0byBjaGFyYWN0ZXIgZ2VuZXJhdG9yIFJBTSAqLwotICAgIHZnYV93cmlueChTRVFfSSwweDAwLDB4MDEpOwotICAgIHZnYV93cmlueChTRVFfSSwweDAyLDB4MDQpOwotICAgIHZnYV93cmlueChTRVFfSSwweDA0LDB4MDcpOwotICAgIHZnYV93cmlueChTRVFfSSwweDAwLDB4MDMpOwotICAgIHZnYV93cmlueChHUkFfSSwweDA0LDB4MDIpOwotICAgIHZnYV93cmlueChHUkFfSSwweDA1LDB4MDApOwotICAgIHZnYV93cmlueChHUkFfSSwweDA2LDB4MDApOwotCi0gICAgLyogQ29weSBmb250IGJhY2sgdG8gY2hhcmFjdGVyIGdlbmVyYXRvciBSQU0gKi8KLSAgICBtZW1jcHkoQTAwMDBQdHIsZGF0YSxGT05UX0MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhdmUgdGhlIHN0YXRlIG9mIGFsbCBWR0EgY29tcGF0aWJsZSByZWdpc3RlcnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NhdmVWR0FTdGF0ZSgKLSAgICB2b2lkICpzdGF0ZUJ1ZikKLXsKLSAgICB1Y2hhciAgICpyZWdzID0gc3RhdGVCdWY7Ci0gICAgaW50ICAgICBpOwotCi0gICAgLyogU2F2ZSBzdGF0ZSBvZiBWR0EgcmVnaXN0ZXJzICovCi0gICAgZm9yIChpID0gMDsgaSA8IENSVF9DOyBpKyspIHsKLQlfcG9ydF9vdXQoaSwgQ1JUX0kpOwotCXJlZ3NbQ1JUICsgaV0gPSBfcG9ydF9pbihDUlRfRCk7Ci0JfQotICAgIGZvciAoaSA9IDA7IGkgPCBBVFRfQzsgaSsrKSB7Ci0JX3BvcnRfaW4oSVMxX1IpOwotCXZnYV9kZWxheSgpOwotCV9wb3J0X291dChpLCBBVFRfSVcpOwotCXZnYV9kZWxheSgpOwotCXJlZ3NbQVRUICsgaV0gPSBfcG9ydF9pbihBVFRfUik7Ci0JdmdhX2RlbGF5KCk7Ci0JfQotICAgIGZvciAoaSA9IDA7IGkgPCBHUkFfQzsgaSsrKSB7Ci0JX3BvcnRfb3V0KGksIEdSQV9JKTsKLQlyZWdzW0dSQSArIGldID0gX3BvcnRfaW4oR1JBX0QpOwotCX0KLSAgICBmb3IgKGkgPSAwOyBpIDwgU0VRX0M7IGkrKykgewotCV9wb3J0X291dChpLCBTRVFfSSk7Ci0JcmVnc1tTRVEgKyBpXSA9IF9wb3J0X2luKFNFUV9EKTsKLQl9Ci0gICAgcmVnc1tNSVNdID0gX3BvcnRfaW4oTUlTX1IpOwotCi0gICAgLyogU2F2ZSB0aGUgVkdBIHBhbGV0dGUgdmFsdWVzICovCi0gICAgdmdhX3NhdmVwYWxldHRlKCZyZWdzW1BBTF0pOwotCi0gICAgLyogU2F2ZSB0aGUgVkdBIGNoYXJhY3RlciBnZW5lcmF0b3IgUkFNICovCi0gICAgdmdhX3NhdmVGb250KCZyZWdzW0ZPTlRdKTsKLQotICAgIC8qIFR1cm4gdGhlIFZHQSBkaXNwbGF5IGJhY2sgb24gKi8KLSAgICBQTV92Z2FVbmJsYW5rRGlzcGxheSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldG9yZSB0aGUgc3RhdGUgb2YgYWxsIFZHQSBjb21wYXRpYmxlIHJlZ2lzdGVycwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVZHQVN0YXRlKAotICAgIGNvbnN0IHZvaWQgKnN0YXRlQnVmKQotewotICAgIGNvbnN0IHVjaGFyICpyZWdzID0gc3RhdGVCdWY7Ci0gICAgaW50ICAgICAgICAgaTsKLQotICAgIC8qIEJsYW5rIHRoZSBkaXNwbGF5IGJlZm9yZSB3ZSBzdGFydCB0aGUgcmVzdG9yZSAqLwotICAgIFBNX3ZnYUJsYW5rRGlzcGxheSgpOwotCi0gICAgLyogUmVzdG9yZSB0aGUgVkdBIGNoYXJhY3RlciBnZW5lcmF0b3IgUkFNICovCi0gICAgdmdhX3Jlc3RvcmVGb250KCZyZWdzW0ZPTlRdKTsKLQotICAgIC8qIFJlc3RvcmUgdGhlIFZHQSBwYWxldHRlIHZhbHVlcyAqLwotICAgIHZnYV9yZXN0b3JlcGFsZXR0ZSgmcmVnc1tQQUxdKTsKLQotICAgIC8qIFJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBWR0EgY29tcGF0aWJsZSByZWdpc3RlcnMgKi8KLSAgICBfcG9ydF9vdXQocmVnc1tNSVNdLCBNSVNfVyk7Ci0KLSAgICAvKiBEZWxheSB0byBhbGxvdyBjbG9jayBjaGFuZ2UgdG8gc2V0dGxlICovCi0gICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCi0JdmdhX2RlbGF5KCk7Ci0KLSAgICAvKiBTeW5jaHJvbm91cyByZXNldCBvbiAqLwotICAgIF9wb3J0X291dCgweDAwLFNFUV9JKTsKLSAgICBfcG9ydF9vdXQoMHgwMSxTRVFfRCk7Ci0KLSAgICAvKiBXcml0ZSBzZXFldWVuY2VyIHJlZ2lzdGVycyAqLwotICAgIF9wb3J0X291dCgxLCBTRVFfSSk7Ci0gICAgX3BvcnRfb3V0KHJlZ3NbU0VRICsgMV0gfCAweDIwLCBTRVFfRCk7Ci0gICAgZm9yIChpID0gMjsgaSA8IFNFUV9DOyBpKyspIHsKLQlfcG9ydF9vdXQoaSwgU0VRX0kpOwotCV9wb3J0X291dChyZWdzW1NFUSArIGldLCBTRVFfRCk7Ci0JfQotCi0gICAgLyogU3luY2hyb25vdXMgcmVzZXQgb2ZmICovCi0gICAgX3BvcnRfb3V0KDB4MDAsU0VRX0kpOwotICAgIF9wb3J0X291dCgweDAzLFNFUV9EKTsKLQotICAgIC8qIERlcHJvdGVjdCBDUlQgcmVnaXN0ZXJzIDAtNyBhbmQgd3JpdGUgQ1JUQyAqLwotICAgIF9wb3J0X291dCgweDExLCBDUlRfSSk7Ci0gICAgX3BvcnRfb3V0KF9wb3J0X2luKENSVF9EKSAmIDB4N0YsIENSVF9EKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgQ1JUX0M7IGkrKykgewotCV9wb3J0X291dChpLCBDUlRfSSk7Ci0JX3BvcnRfb3V0KHJlZ3NbQ1JUICsgaV0sIENSVF9EKTsKLQl9Ci0gICAgZm9yIChpID0gMDsgaSA8IEdSQV9DOyBpKyspIHsKLQlfcG9ydF9vdXQoaSwgR1JBX0kpOwotCV9wb3J0X291dChyZWdzW0dSQSArIGldLCBHUkFfRCk7Ci0JfQotICAgIGZvciAoaSA9IDA7IGkgPCBBVFRfQzsgaSsrKSB7Ci0JX3BvcnRfaW4oSVMxX1IpOyAgICAgICAgLyogcmVzZXQgZmxpcC1mbG9wICovCi0JdmdhX2RlbGF5KCk7Ci0JX3BvcnRfb3V0KGksIEFUVF9JVyk7Ci0JdmdhX2RlbGF5KCk7Ci0JX3BvcnRfb3V0KHJlZ3NbQVRUICsgaV0sIEFUVF9JVyk7Ci0JdmdhX2RlbGF5KCk7Ci0JfQotCi0gICAgLyogRW5zdXJlIHRoZSBWR0Egc2NyZWVuIGlzIHR1cm5lZCBvbiAqLwotICAgIFBNX3ZnYVVuYmxhbmtEaXNwbGF5KCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGlzYWJsZXMgdGhlIFZHQSBkaXNwbGF5IGZvciBzY3JlZW4gb3V0cHV0IG1ha2luZyBpdCBibGFuay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3ZnYUJsYW5rRGlzcGxheSh2b2lkKQotewotICAgIC8qIFR1cm4gc2NyZWVuIG9mZiAqLwotICAgIF9wb3J0X291dCgweDAxLCBTRVFfSSk7Ci0gICAgX3BvcnRfb3V0KF9wb3J0X2luKFNFUV9EKSB8IDB4MjAsIFNFUV9EKTsKLQotICAgIC8qIERpc2FibGUgdmlkZW8gb3V0cHV0ICovCi0gICAgX3BvcnRfaW4oSVMxX1IpOwotICAgIHZnYV9kZWxheSgpOwotICAgICBfcG9ydF9vdXQoMHgwMCwgQVRUX0lXKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FbmFibGVzIHRoZSBWR0EgZGlzcGxheSBmb3Igc2NyZWVuIG91dHB1dC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3ZnYVVuYmxhbmtEaXNwbGF5KHZvaWQpCi17Ci0gICAgLyogVHVybiBzY3JlZW4gYmFjayBvbiAqLwotICAgIF9wb3J0X291dCgweDAxLCBTRVFfSSk7Ci0gICAgX3BvcnRfb3V0KF9wb3J0X2luKFNFUV9EKSAmIDB4REYsIFNFUV9EKTsKLQotICAgIC8qIEVuYWJsZSB2aWRlbyBvdXRwdXQgKi8KLSAgICBfcG9ydF9pbihJUzFfUik7Ci0gICAgdmdhX2RlbGF5KCk7Ci0gICAgX3BvcnRfb3V0KDB4MjAsIEFUVF9JVyk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jcHVpbmZvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jcHVpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNjJlODEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY3B1aW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsODA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIE1haW4gbW9kdWxlIHRvIGltcGxlbWVudCB0aGUgWmVuIFRpbWVyIHN1cHBvcnQgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInp0aW1lci5oIgotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAib3NoZHIuaCIKLSNpZiAhZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSAmJiAhZGVmaW5lZChfX09TMl9WRERfXykgJiYgIWRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4dGVybmFsIEludGVsIGFzc2VtYmxlciBmdW5jdGlvbnMgKi8KLSNpZmRlZiAgX19JTlRFTF9fCi0vKiB7c2VjcmV0fSAqLwotaWJvb2wgICBfQVNNQVBJIF9DUFVfaGF2ZUNQVUlEKHZvaWQpOwotLyoge3NlY3JldH0gKi8KLWlib29sICAgX0FTTUFQSSBfQ1BVX2NoZWNrODAzODYodm9pZCk7Ci0vKiB7c2VjcmV0fSAqLwotaWJvb2wgICBfQVNNQVBJIF9DUFVfY2hlY2s4MDQ4Nih2b2lkKTsKLS8qIHtzZWNyZXR9ICovCi11aW50ICAgIF9BU01BUEkgX0NQVV9jaGVja0NQVUlEKHZvaWQpOwotLyoge3NlY3JldH0gKi8KLXVpbnQgICAgX0FTTUFQSSBfQ1BVX2dldENQVUlETW9kZWwodm9pZCk7Ci0vKiB7c2VjcmV0fSAqLwotdWludCAgICBfQVNNQVBJIF9DUFVfZ2V0Q1BVSURTdGVwcGluZyh2b2lkKTsKLS8qIHtzZWNyZXR9ICovCi11aW50ICAgIF9BU01BUEkgX0NQVV9nZXRDUFVJREZlYXR1cmVzKHZvaWQpOwotLyoge3NlY3JldH0gKi8KLXVpbnQgICAgX0FTTUFQSSBfQ1BVX2dldENhY2hlU2l6ZSh2b2lkKTsKLS8qIHtzZWNyZXR9ICovCi11aW50ICAgIF9BU01BUEkgX0NQVV9oYXZlM0ROb3codm9pZCk7Ci0vKiB7c2VjcmV0fSAqLwotaWJvb2wgICBfQVNNQVBJIF9DUFVfY2hlY2tDbG9uZSh2b2lkKTsKLS8qIHtzZWNyZXR9ICovCi12b2lkICAgIF9BU01BUEkgX0NQVV9yZWFkVGltZVN0YW1wKENQVV9sYXJnZUludGVnZXIgKnRpbWUpOwotLyoge3NlY3JldH0gKi8KLXZvaWQgICAgX0FTTUFQSSBfQ1BVX3J1bkJTRkxvb3AodWxvbmcgaXRlcmF0aW9ucyk7Ci0vKiB7c2VjcmV0fSAqLwotdWxvbmcgICBfQVNNQVBJIF9DUFVfbXVsRGl2KHVsb25nIGEsdWxvbmcgYix1bG9uZyBjKTsKLS8qIHtzZWNyZXR9ICovCi12b2lkIFpUaW1lclF1aWNrSW5pdCh2b2lkKTsKLSNkZWZpbmUgQ1BVX0hhdmVNTVggICAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgQ1BVX0hhdmVSRFRTQyAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgQ1BVX0hhdmVTU0UgICAgIDB4MDIwMDAwMDAKLSNlbmRpZgotCi0jaWYgICAgIGRlZmluZWQoX19TTVgzMl9fKQotI2luY2x1ZGUgInNteC9jcHVpbmZvLmMiCi0jZWxpZiAgIGRlZmluZWQoX19SVFRBUkdFVF9fKQotI2luY2x1ZGUgInJ0dGFyZ2V0L2NwdWluZm8uYyIKLSNlbGlmICAgZGVmaW5lZChfX1JFQUxET1NfXykKLSNpbmNsdWRlICJkb3MvY3B1aW5mby5jIgotI2VsaWYgICBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0jaW5jbHVkZSAibnRkcnYvY3B1aW5mby5jIgotI2VsaWYgICBkZWZpbmVkKF9fV0lOMzJfVlhEX18pCi0jaW5jbHVkZSAidnhkL2NwdWluZm8uYyIKLSNlbGlmICAgZGVmaW5lZChfX1dJTkRPV1MzMl9fKQotI2luY2x1ZGUgIndpbjMyL2NwdWluZm8uYyIKLSNlbGlmICAgZGVmaW5lZChfX09TMl9WRERfXykKLSNpbmNsdWRlICJ2ZGQvY3B1aW5mby5jIgotI2VsaWYgICBkZWZpbmVkKF9fT1MyX18pCi0jaW5jbHVkZSAib3MyL2NwdWluZm8uYyIKLSNlbGlmICAgZGVmaW5lZChfX0xJTlVYX18pCi0jaW5jbHVkZSAibGludXgvY3B1aW5mby5jIgotI2VsaWYgICBkZWZpbmVkKF9fUU5YX18pCi0jaW5jbHVkZSAicW54L2NwdWluZm8uYyIKLSNlbGlmICAgZGVmaW5lZChfX0JFT1NfXykKLSNpbmNsdWRlICJiZW9zL2NwdWluZm8uYyIKLSNlbHNlCi0jZXJyb3IgIENQVSBsaWJyYXJ5IG5vdCBwb3J0ZWQgdG8gdGhpcyBwbGF0Zm9ybSB5ZXQhCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIGludGVyZmFjZSByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIGFuIEkvTyBwb3J0IGxvY2F0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1Y2hhciByZGlueCgKLSAgICBpbnQgcG9ydCwKLSAgICBpbnQgaW5kZXgpCi17Ci0gICAgUE1fb3V0cGIocG9ydCwodWNoYXIpaW5kZXgpOwotICAgIHJldHVybiBQTV9pbnBiKHBvcnQrMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV3JpdGUgYW4gSS9PIHBvcnQgbG9jYXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgd3JpbngoCi0gICAgdXNob3J0IHBvcnQsCi0gICAgdXNob3J0IGluZGV4LAotICAgIHVzaG9ydCB2YWx1ZSkKLXsKLSAgICBQTV9vdXRwYihwb3J0LCh1Y2hhcilpbmRleCk7Ci0gICAgUE1fb3V0cGIocG9ydCsxLCh1Y2hhcil2YWx1ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRW5hYmxlcyB0aGUgQ3lyaXggQ1BVSUQgaW5zdHJ1Y3Rpb24gdG8gcHJvcGVybHkgZGV0ZWN0IE1lZGlhR1ggYW5kIDZ4ODYKLXByb2Nlc3NvcnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0NQVV9lbmFibGVDeXJpeENQVUlEKHZvaWQpCi17Ci0gICAgdWNoYXIgICBjY3IzOwotCi0gICAgUE1faW5pdCgpOwotICAgIGNjcjMgPSByZGlueCgweDIyLDB4QzMpOwotICAgIHdyaW54KDB4MjIsMHhDMywodWNoYXIpKGNjcjMgfCAweDEwKSk7Ci0gICAgd3JpbngoMHgyMiwweEU4LCh1Y2hhcikocmRpbngoMHgyMiwweEU4KSB8IDB4ODApKTsKLSAgICB3cmlueCgweDIyLDB4QzMsY2NyMyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIHR5cGUgb2YgcHJvY2Vzc29yIGluIHRoZSBzeXN0ZW0uCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVJFVFVSTlM6Ci1OdW1lcmljYWwgaWRlbnRpZmllciBmb3IgdGhlIGluc3RhbGxlZCBwcm9jZXNzb3IKLQotUkVNQVJLUzoKLVJldHVybnMgdGhlIHR5cGUgb2YgcHJvY2Vzc29yIGluIHRoZSBzeXN0ZW0uIE5vdGUgdGhhdCBpZiB0aGUgQ1BVIGlzIGFuCi11bmtub3duIFBlbnRpdW0gZmFtaWx5IHByb2Nlc3NvciB0aGF0IHdlIGRvbid0IGhhdmUgYW4gZW51bWVyYXRpb24gZm9yLAotdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgdmFsdWUgb2YgQ1BVX1Vua1BlbnRpdW0KLShkZXBlbmRpbmcgb24gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBDUFVJRCBpbnN0cnVjdGlvbikuCi0KLVNFRSBBTFNPOgotQ1BVX2dldFByb2Nlc3NvclNwZWVkLCBDUFVfaGF2ZU1NWCwgQ1BVX2dldFByb2Nlc3Nvck5hbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50IFpBUEkgQ1BVX2dldFByb2Nlc3NvclR5cGUodm9pZCkKLXsKLSNpZiAgICAgZGVmaW5lZChfX0lOVEVMX18pCi0gICAgdWludCAgICAgICAgICAgIGNwdSx2ZW5kb3IsbW9kZWwsY2FjaGVTaXplOwotICAgIHN0YXRpYyBpYm9vbCAgICBmaXJzdFRpbWUgPSB0cnVlOwotCi0gICAgaWYgKF9DUFVfaGF2ZUNQVUlEKCkpIHsKLQljcHUgPSBfQ1BVX2NoZWNrQ1BVSUQoKTsKLQl2ZW5kb3IgPSBjcHUgJiB+Q1BVX21hc2s7Ci0JaWYgKHZlbmRvciA9PSBDUFVfSW50ZWwpIHsKLQkgICAgLyogQ2hlY2sgZm9yIEludGVsIHByb2Nlc3NvcnMgKi8KLQkgICAgc3dpdGNoIChjcHUgJiBDUFVfbWFzaykgewotCQljYXNlIDQ6IGNwdSA9IENQVV9pNDg2OyAgICAgICAgIGJyZWFrOwotCQljYXNlIDU6IGNwdSA9IENQVV9QZW50aXVtOyAgICAgIGJyZWFrOwotCQljYXNlIDY6Ci0JCSAgICBpZiAoKG1vZGVsID0gX0NQVV9nZXRDUFVJRE1vZGVsKCkpID09IDEpCi0JCQljcHUgPSBDUFVfUGVudGl1bVBybzsKLQkJICAgIGVsc2UgaWYgKG1vZGVsIDw9IDYpIHsKLQkJCWNhY2hlU2l6ZSA9IF9DUFVfZ2V0Q2FjaGVTaXplKCk7Ci0JCQlpZiAoKG1vZGVsID09IDUgJiYgY2FjaGVTaXplID09IDApIHx8Ci0JCQkgICAgKG1vZGVsID09IDUgJiYgY2FjaGVTaXplID09IDI1NikgfHwKLQkJCSAgICAobW9kZWwgPT0gNiAmJiBjYWNoZVNpemUgPT0gMTI4KSkKLQkJCSAgICBjcHUgPSBDUFVfQ2VsZXJvbjsKLQkJCWVsc2UKLQkJCSAgICBjcHUgPSBDUFVfUGVudGl1bUlJOwotCQkJfQotCQkgICAgZWxzZSBpZiAobW9kZWwgPj0gNykgewotCQkJLyogTW9kZWwgNyA9PSBQZW50aXVtIElJSSAqLwotCQkJLyogTW9kZWwgOCA9PSBDZWxlcm9uL1BlbnRpdW0gSUlJIENvcHBlcm1pbmUgKi8KLQkJCWNhY2hlU2l6ZSA9IF9DUFVfZ2V0Q2FjaGVTaXplKCk7Ci0JCQlpZiAoKG1vZGVsID09IDggJiYgY2FjaGVTaXplID09IDEyOCkpCi0JCQkgICAgY3B1ID0gQ1BVX0NlbGVyb247Ci0JCQllbHNlCi0JCQkgICAgY3B1ID0gQ1BVX1BlbnRpdW1JSUk7Ci0JCQl9Ci0JCSAgICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAgIGNwdSA9IENQVV9VbmtJbnRlbDsKLQkJfQotCSAgICB9Ci0JZWxzZSBpZiAodmVuZG9yID09IENQVV9DeXJpeCkgewotCSAgICAvKiBDaGVjayBmb3IgQ3lyaXggcHJvY2Vzc29ycyAqLwotCSAgICBzd2l0Y2ggKGNwdSAmIENQVV9tYXNrKSB7Ci0JCWNhc2UgNDoKLQkJICAgIGlmICgobW9kZWwgPSBfQ1BVX2dldENQVUlETW9kZWwoKSkgPT0gNCkKLQkJCWNwdSA9IENQVV9DeXJpeE1lZGlhR1g7Ci0JCSAgICBlbHNlCi0JCQljcHUgPSBDUFVfVW5rQ3lyaXg7Ci0JCSAgICBicmVhazsKLQkJY2FzZSA1OgotCQkgICAgaWYgKChtb2RlbCA9IF9DUFVfZ2V0Q1BVSURNb2RlbCgpKSA9PSAyKQotCQkJY3B1ID0gQ1BVX0N5cml4Nng4NjsKLQkJICAgIGVsc2UgaWYgKG1vZGVsID09IDQpCi0JCQljcHUgPSBDUFVfQ3lyaXhNZWRpYUdYbTsKLQkJICAgIGVsc2UKLQkJCWNwdSA9IENQVV9VbmtDeXJpeDsKLQkJICAgIGJyZWFrOwotCQljYXNlIDY6Ci0JCSAgICBpZiAoKG1vZGVsID0gX0NQVV9nZXRDUFVJRE1vZGVsKCkpIDw9IDEpCi0JCQljcHUgPSBDUFVfQ3lyaXg2eDg2TVg7Ci0JCSAgICBlbHNlCi0JCQljcHUgPSBDUFVfVW5rQ3lyaXg7Ci0JCSAgICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAgIGNwdSA9IENQVV9VbmtDeXJpeDsKLQkJfQotCSAgICB9Ci0JZWxzZSBpZiAodmVuZG9yID09IENQVV9BTUQpIHsKLQkgICAgLyogQ2hlY2sgZm9yIEFNRCBwcm9jZXNzb3JzICovCi0JICAgIHN3aXRjaCAoY3B1ICYgQ1BVX21hc2spIHsKLQkJY2FzZSA0OgotCQkgICAgaWYgKChtb2RlbCA9IF9DUFVfZ2V0Q1BVSURNb2RlbCgpKSA9PSAwKQotCQkJY3B1ID0gQ1BVX0FNREFtNXg4NjsKLQkJICAgIGVsc2UKLQkJCWNwdSA9IENQVV9BTURBbTQ4NjsKLQkJICAgIGJyZWFrOwotCQljYXNlIDU6Ci0JCSAgICBpZiAoKG1vZGVsID0gX0NQVV9nZXRDUFVJRE1vZGVsKCkpIDw9IDMpCi0JCQljcHUgPSBDUFVfQU1ESzU7Ci0JCSAgICBlbHNlIGlmIChtb2RlbCA8PSA3KQotCQkJY3B1ID0gQ1BVX0FNREs2OwotCQkgICAgZWxzZSBpZiAobW9kZWwgPT0gOCkKLQkJCWNwdSA9IENQVV9BTURLNl8yOwotCQkgICAgZWxzZSBpZiAobW9kZWwgPT0gOSkKLQkJCWNwdSA9IENQVV9BTURLNl9JSUk7Ci0JCSAgICBlbHNlIGlmIChtb2RlbCA9PSAxMykgewotCQkJaWYgKF9DUFVfZ2V0Q1BVSURTdGVwcGluZygpIDw9IDMpCi0JCQkgICAgY3B1ID0gQ1BVX0FNREs2X0lJSXBsdXM7Ci0JCQllbHNlCi0JCQkgICAgY3B1ID0gQ1BVX0FNREs2XzJwbHVzOwotCQkJfQotCQkgICAgZWxzZQotCQkJY3B1ID0gQ1BVX1Vua0FNRDsKLQkJICAgIGJyZWFrOwotCQljYXNlIDY6Ci0JCSAgICBpZiAoKG1vZGVsID0gX0NQVV9nZXRDUFVJRE1vZGVsKCkpID09IDMpCi0JCQljcHUgPSBDUFVfQU1ERHVyb247Ci0JCSAgICBlbHNlCi0JCQljcHUgPSBDUFVfQU1EQXRobG9uOwotCQkgICAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgICBjcHUgPSBDUFVfVW5rQU1EOwotCQl9Ci0JICAgIH0KLQllbHNlIGlmICh2ZW5kb3IgPT0gQ1BVX0lEVCkgewotCSAgICAvKiBDaGVjayBmb3IgSURUIFdpbkNoaXAgcHJvY2Vzc29ycyAqLwotCSAgICBzd2l0Y2ggKGNwdSAmIENQVV9tYXNrKSB7Ci0JCWNhc2UgNToKLQkJICAgIGlmICgobW9kZWwgPSBfQ1BVX2dldENQVUlETW9kZWwoKSkgPD0gNCkKLQkJCWNwdSA9IENQVV9XaW5DaGlwQzY7Ci0JCSAgICBlbHNlIGlmIChtb2RlbCA9PSA4KQotCQkJY3B1ID0gQ1BVX1dpbkNoaXAyOwotCQkgICAgZWxzZQotCQkJY3B1ID0gQ1BVX1Vua0lEVDsKLQkJICAgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgICAgY3B1ID0gQ1BVX1Vua0lEVDsKLQkJfQotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIC8qIEFzc3VtZSBhIFBlbnRpdW0gY29tcGF0aWJsZSBJbnRlbCBjbG9uZSAqLwotCSAgICBjcHUgPSBDUFVfUGVudGl1bTsKLQkgICAgfQotCXJldHVybiBjcHUgfCB2ZW5kb3IgfCAoX0NQVV9nZXRDUFVJRFN0ZXBwaW5nKCkgPDwgQ1BVX3N0ZXBwaW5nU2hpZnQpOwotCX0KLSAgICBlbHNlIHsKLQlpZiAoX0NQVV9jaGVjazgwMzg2KCkpCi0JICAgIGNwdSA9IENQVV9pMzg2OwotCWVsc2UgIGlmIChfQ1BVX2NoZWNrODA0ODYoKSkgewotCSAgICAvKiBJZiB3ZSBnZXQgaGVyZSB3ZSBtYXkgaGF2ZSBhIEN5cml4IHByb2Nlc3NvciBzbyB3ZSBjYW4gdHJ5Ci0JICAgICAqIGVuYWJsaW5nIHRoZSBDUFVJRCBpbnN0cnVjdGlvbiBhbmQgdHJ5aW5nIGFnYWluLgotCSAgICAgKi8KLQkgICAgaWYgKGZpcnN0VGltZSkgewotCQlmaXJzdFRpbWUgPSBmYWxzZTsKLQkJX0NQVV9lbmFibGVDeXJpeENQVUlEKCk7Ci0JCXJldHVybiBDUFVfZ2V0UHJvY2Vzc29yVHlwZSgpOwotCQl9Ci0JICAgIGNwdSA9IENQVV9pNDg2OwotCSAgICB9Ci0JZWxzZQotCSAgICBjcHUgPSBDUFVfUGVudGl1bTsKLQlpZiAoIV9DUFVfY2hlY2tDbG9uZSgpKQotCSAgICByZXR1cm4gY3B1IHwgQ1BVX0ludGVsOwotCXJldHVybiBjcHU7Ci0JfQotI2VsaWYgICBkZWZpbmVkKF9fQUxQSEFfXykKLSAgICByZXR1cm4gQ1BVX0FscGhhOwotI2VsaWYgICBkZWZpbmVkKF9fTUlQU19fKQotICAgIHJldHVybiBDUFVfTWlwczsKLSNlbGlmICAgZGVmaW5lZChfX1BQQ19fKQotICAgIHJldHVybiBDUFVfUG93ZXJQQzsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRydWUgaWYgdGhlIHByb2Nlc3NvciBzdXBwb3J0cyBJbnRlbCBNTVggZXh0ZW5zaW9ucy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLVRydWUgaWYgTU1YIGlzIGF2YWlsYWJsZSwgZmFsc2UgaWYgbm90LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgdGhlIEludGVsIE1NWCBleHRlbmRlZAotaW5zdHJ1Y3Rpb24gc2V0LgotCi1TRUUgQUxTTzoKLUNQVV9nZXRQcm9jZXNzb3JUeXBlLCBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQsIENQVV9oYXZlM0ROb3csIENQVV9oYXZlU1NFLAotQ1BVX2dldFByb2Nlc3Nvck5hbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBaQVBJIENQVV9oYXZlTU1YKHZvaWQpCi17Ci0jaWZkZWYgIF9fSU5URUxfXwotICAgIGlmIChfQ1BVX2hhdmVDUFVJRCgpKQotCXJldHVybiAoX0NQVV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZU1NWCkgIT0gMDsKLSAgICByZXR1cm4gZmFsc2U7Ci0jZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRydWUgaWYgdGhlIHByb2Nlc3NvciBzdXBwb3J0cyBBTUQgM0ROb3chIGV4dGVuc2lvbnMuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIDNETm93ISBpcyBhdmFpbGFibGUsIGZhbHNlIGlmIG5vdC4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIHRoZSBBTUQgM0ROb3chIGV4dGVuZGVkCi1pbnN0cnVjdGlvbiBzZXQuCi0KLVNFRSBBTFNPOgotQ1BVX2dldFByb2Nlc3NvclR5cGUsIENQVV9nZXRQcm9jZXNzb3JTcGVlZCwgQ1BVX2hhdmVNTVgsIENQVV9oYXZlU1NFLAotQ1BVX2dldFByb2Nlc3Nvck5hbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBaQVBJIENQVV9oYXZlM0ROb3codm9pZCkKLXsKLSNpZmRlZiAgX19JTlRFTF9fCi0gICAgaWYgKF9DUFVfaGF2ZUNQVUlEKCkpCi0JcmV0dXJuIF9DUFVfaGF2ZTNETm93KCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotI2Vsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgSW50ZWwgS05JIGV4dGVuc2lvbnMuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIEludGVsIEtOSSBpcyBhdmFpbGFibGUsIGZhbHNlIGlmIG5vdC4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIHRoZSBJbnRlbCBLTkkgZXh0ZW5kZWQKLWluc3RydWN0aW9uIHNldC4KLQotU0VFIEFMU086Ci1DUFVfZ2V0UHJvY2Vzc29yVHlwZSwgQ1BVX2dldFByb2Nlc3NvclNwZWVkLCBDUFVfaGF2ZU1NWCwgQ1BVX2hhdmUzRE5vdywKLUNQVV9nZXRQcm9jZXNzb3JOYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgWkFQSSBDUFVfaGF2ZVNTRSh2b2lkKQotewotI2lmZGVmICBfX0lOVEVMX18KLSAgICBpZiAoX0NQVV9oYXZlQ1BVSUQoKSkKLQlyZXR1cm4gKF9DUFVfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVTU0UpICE9IDA7Ci0gICAgcmV0dXJuIGZhbHNlOwotI2Vsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1UcnVlIGlmIHRoZSBSVFNDIGluc3RydWN0aW9uIGlzIGF2YWlsYWJsZSwgZmFsc2UgaWYgbm90LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgdGhlIEludGVsIFJEVFNDCi1pbnN0cnVjdGlvbiwgZm9yIGhpZ2ggcHJlY2lzaW9uIHRpbWluZy4gSWYgdGhlIHByb2Nlc3NvciBpcyBub3QgYW4gSW50ZWwgb3IKLUludGVsIGNsb25lIENQVSwgdGhpcyBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UuCi0KLURFU0NSSVBUSU9OOgotUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgUkRUU0MgZXh0ZW5zaW9ucy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLVRydWUgaWYgUlRTQyBpcyBhdmFpbGFibGUsIGZhbHNlIGlmIG5vdC4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIHRoZSBSRFRTQyBpbnN0cnVjdGlvbgotZm9yIHJlYWRpbmcgdGhlIHByb2Nlc3NvciB0aW1lIHN0YW1wIGNvdW50ZXIuCi0KLVNFRSBBTFNPOgotQ1BVX2dldFByb2Nlc3NvclR5cGUsIENQVV9nZXRQcm9jZXNzb3JTcGVlZCwgQ1BVX2hhdmVNTVgsIENQVV9oYXZlM0ROb3csCi1DUFVfZ2V0UHJvY2Vzc29yTmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFpBUEkgQ1BVX2hhdmVSRFRTQyh2b2lkKQotewotI2lmZGVmICBfX0lOVEVMX18KLSAgICBpZiAoX0NQVV9oYXZlQ1BVSUQoKSkKLQlyZXR1cm4gKF9DUFVfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMDsKLSAgICByZXR1cm4gZmFsc2U7Ci0jZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotfQotCi0jaWZkZWYgIF9fSU5URUxfXwotCi0jZGVmaW5lIElURVJBVElPTlMgICAgICAxNjAwMAotI2RlZmluZSBTQU1QTElOR1MgICAgICAgMgotI2RlZmluZSBJTk5FUl9MT09QUyAgICAgNDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSWYgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgdGltZSBzdGFtcCByZWFkaW5nLCBidXQgaXMgYXQgbGVhc3QgYSAzODYgb3IKLWFib3ZlLCB1dGlsaXplIG1ldGhvZCBvZiB0aW1pbmcgYSBsb29wIG9mIEJTRiBpbnN0cnVjdGlvbnMgd2hpY2ggdGFrZSBhCi1rbm93biBudW1iZXIgb2YgY3ljbGVzIHRvIHJ1biBvbiBpMzg2KHRtKSwgaTQ4Nih0bSksIGFuZCBQZW50aXVtKFIpCi1wcm9jZXNzb3JzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBHZXRCU0ZDcHVTcGVlZCgKLSAgICB1bG9uZyBjeWNsZXMpCi17Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciB0MCx0MSxjb3VudF9mcmVxOwotICAgIHVsb25nICAgdGlja3M7ICAgICAgICAgICAgICAvKiBNaWNyb3NlY29uZHMgZWxhcHNlZCBkdXJpbmcgdGVzdCAgICAgKi8KLSAgICB1bG9uZyAgIGN1cnJlbnQ7ICAgICAgICAgICAgLyogVmFyaWFibGUgdG8gc3RvcmUgdGltZSBlbGFwc2VkICAgICAgICovCi0gICAgaW50ICAgICBpLGosaVByaW9yaXR5OwotICAgIHVsb25nICAgbG93ZXN0ICA9ICh1bG9uZyktMTsKLQotICAgIGlQcmlvcml0eSA9IFNldE1heFRocmVhZFByaW9yaXR5KCk7Ci0gICAgR2V0Q291bnRlckZyZXF1ZW5jeSgmY291bnRfZnJlcSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IFNBTVBMSU5HUzsgaSsrKSB7Ci0JR2V0Q291bnRlcigmdDApOwotCWZvciAoaiA9IDA7IGogPCBJTk5FUl9MT09QUzsgaisrKQotCSAgICBfQ1BVX3J1bkJTRkxvb3AoSVRFUkFUSU9OUyk7Ci0JR2V0Q291bnRlcigmdDEpOwotCWN1cnJlbnQgPSB0MS5sb3cgLSB0MC5sb3c7Ci0JaWYgKGN1cnJlbnQgPCBsb3dlc3QpCi0JICAgIGxvd2VzdCA9IGN1cnJlbnQ7Ci0JfQotICAgIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpUHJpb3JpdHkpOwotCi0gICAgLyogQ29tcHV0ZSBmcmVxdWVuY3kgKi8KLSAgICB0aWNrcyA9IF9DUFVfbXVsRGl2KGxvd2VzdCwxMDAwMDAwLGNvdW50X2ZyZXEubG93KTsKLSAgICBpZiAoKHRpY2tzICUgY291bnRfZnJlcS5sb3cpID4gKGNvdW50X2ZyZXEubG93LzIpKQotCXRpY2tzKys7ICAgICAgICAgICAgLyogUm91bmQgdXAgaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYgKHRpY2tzID09IDApCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuICgoY3ljbGVzKklOTkVSX0xPT1BTKS90aWNrcyk7Ci19Ci0KLSNkZWZpbmUgVE9MRVJBTkNFICAgICAgIDEKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PbiBwcm9jZXNzb3JzIHN1cHBvcnRpbmcgdGhlIFJlYWQgVGltZSBTdGFtcCBvcGNvZGUsIGNvbXBhcmUgZWxhcHNlZAotdGltZSBvbiB0aGUgSGlnaC1SZXNvbHV0aW9uIENvdW50ZXIgd2l0aCBlbGFwc2VkIGN5Y2xlcyBvbiB0aGUgVGltZQotU3RhbXAgUmVnaXN0ZXIuCi0KLVRoZSBpbm5lciBsb29wIHJ1bnMgdXAgdG8gMjAgdGltZXMgb3J1bnRpbCB0aGUgYXZlcmFnZSBvZiB0aGUgcHJldmlvdXMKLXRocmVlIGNhbGN1bGF0ZWQgZnJlcXVlbmNpZXMgaXMgd2l0aGluIDEgTUh6IG9mIGVhY2ggb2YgdGhlIGluZGl2aWR1YWwKLWNhbGN1bGF0ZWQgZnJlcXVlbmNpZXMuIFRoaXMgcmVzYW1wbGluZyBpbmNyZWFzZXMgdGhlIGFjY3VyYWN5IG9mIHRoZQotcmVzdWx0cyBzaW5jZSBvdXRzaWRlIGZhY3RvcnMgY291bGQgYWZmZWN0IHRoaXMgY2FsY3VsYXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIEdldFJEVFNDQ3B1U3BlZWQoCi0gICAgaWJvb2wgYWNjdXJhdGUpCi17Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciAgICB0MCx0MSxzMCxzMSxjb3VudF9mcmVxOwotICAgIHU2NCAgICAgICAgICAgICAgICAgc3RhbXAwLCBzdGFtcDEsIHRpY2tzMCwgdGlja3MxOwotICAgIHU2NCAgICAgICAgICAgICAgICAgdG90YWxfY3ljbGVzLCBjeWNsZXMsIGh6LCBmcmVxOwotICAgIHU2NCAgICAgICAgICAgICAgICAgdG90YWxfdGlja3MsIHRpY2tzOwotICAgIGludCAgICAgICAgICAgICAgICAgdHJpZXMsaVByaW9yaXR5OwotICAgIHVsb25nICAgICAgICAgICAgICAgbWF4Q291bnQ7Ci0KLSAgICBQTV9zZXQ2NF8zMih0b3RhbF9jeWNsZXMsMCk7Ci0gICAgUE1fc2V0NjRfMzIodG90YWxfdGlja3MsMCk7Ci0gICAgbWF4Q291bnQgPSBhY2N1cmF0ZSA/IDYwMDAwMCA6IDMwMDAwOwotICAgIGlQcmlvcml0eSA9IFNldE1heFRocmVhZFByaW9yaXR5KCk7Ci0gICAgR2V0Q291bnRlckZyZXF1ZW5jeSgmY291bnRfZnJlcSk7Ci0gICAgUE1fc2V0NjQoZnJlcSxjb3VudF9mcmVxLmhpZ2gsY291bnRfZnJlcS5sb3cpOwotICAgIGZvciAodHJpZXMgPSAwOyB0cmllcyA8IDM7IHRyaWVzKyspIHsKLQkvKiBMb29wIHVudGlsIDEwMCB0aWNrcyBoYXZlIHBhc3NlZCBzaW5jZSBsYXN0IHJlYWQgb2YgaGktcmVzCi0JICogY291bnRlci4gVGhpcyBhY2NvdW50cyBmb3Igb3ZlcmhlYWQgbGF0ZXIuCi0JICovCi0JR2V0Q291bnRlcigmdDApOwotCXQxLmxvdyA9IHQwLmxvdzsKLQl0MS5oaWdoID0gdDAuaGlnaDsKLQl3aGlsZSAoKHQxLmxvdyAtIHQwLmxvdykgPCAxMDApIHsKLQkgICAgR2V0Q291bnRlcigmdDEpOwotCSAgICBfQ1BVX3JlYWRUaW1lU3RhbXAoJnMwKTsKLQkgICAgfQotCi0JLyogTG9vcCB1bnRpbCAzMDAwMCB0aWNrcyBoYXZlIHBhc3NlZCBzaW5jZSBsYXN0IHJlYWQgb2YgaGktcmVzIGNvdW50ZXIuCi0JICogVGhpcyBhbGxvd3MgZm9yIGVsYXBzZWQgdGltZSBmb3Igc2FtcGxpbmcuIEZvciBhIGhpLXJlcyBmcmVxdWVuY3kKLQkgKiBvZiAxTUh6LCB0aGlzIGlzIGFib3V0IDAuMDMgb2YgYSBzZWNvbmQuIFRoZSBmcmVxdWVuY3kgcmVwb3J0ZWQKLQkgKiBieSB0aGUgT1MgZGVwZW5kZW50IGNvZGUgc2hvdWxkIGJlIHR1bmVkIHRvIHByb3ZpZGUgYSBnb29kCi0JICogc2FtcGxlIHBlcmlvZCBkZXBlbmRpbmcgb24gdGhlIGFjY3VyYWN5IG9mIHRoZSBPUyB0aW1lcnMgKGllOgotCSAqIGlmIHRoZSBhY2N1cmFjeSBpcyBsb3dlciwgbG93ZXIgdGhlIGZyZXF1ZW5jeSB0byBzcGVuZCBtb3JlIHRpbWUKLQkgKiBpbiB0aGUgaW5uZXIgbG9vcCB0byBnZXQgYmV0dGVyIGFjY3VyYWN5KS4KLQkgKi8KLQl0MC5sb3cgPSB0MS5sb3c7Ci0JdDAuaGlnaCA9IHQxLmhpZ2g7Ci0Jd2hpbGUgKCh0MS5sb3cgLSB0MC5sb3cpIDwgbWF4Q291bnQpIHsKLQkgICAgR2V0Q291bnRlcigmdDEpOwotCSAgICBfQ1BVX3JlYWRUaW1lU3RhbXAoJnMxKTsKLQkgICAgfQotCi0JLyogRmluZCB0aGUgZGlmZmVyZW5jZSBkdXJpbmcgdGhlIHRpbWluZyBsb29wICovCi0JUE1fc2V0NjQoc3RhbXAwLHMwLmhpZ2gsczAubG93KTsKLQlQTV9zZXQ2NChzdGFtcDEsczEuaGlnaCxzMS5sb3cpOwotCVBNX3NldDY0KHRpY2tzMCx0MC5oaWdoLHQwLmxvdyk7Ci0JUE1fc2V0NjQodGlja3MxLHQxLmhpZ2gsdDEubG93KTsKLQlQTV9zdWI2NChjeWNsZXMsc3RhbXAxLHN0YW1wMCk7Ci0JUE1fc3ViNjQodGlja3MsdGlja3MxLHRpY2tzMCk7Ci0KLQkvKiBTdW0gdXAgdGhlIHJlc3VsdHMgKi8KLQlQTV9hZGQ2NCh0b3RhbF90aWNrcyx0b3RhbF90aWNrcyx0aWNrcyk7Ci0JUE1fYWRkNjQodG90YWxfY3ljbGVzLHRvdGFsX2N5Y2xlcyxjeWNsZXMpOwotCX0KLSAgICBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoaVByaW9yaXR5KTsKLQotICAgIC8qIENvbXB1dGUgZnJlcXVlbmN5IGluIEh6ICovCi0gICAgUE1fbXVsNjQoaHosdG90YWxfY3ljbGVzLGZyZXEpOwotICAgIFBNX2RpdjY0KGh6LGh6LHRvdGFsX3RpY2tzKTsKLSAgICByZXR1cm4gUE1fNjR0bzMyKGh6KTsKLX0KLQotI2VuZGlmICAvKiBfX0lOVEVMX18gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyB0aGUgc3BlZWQgb2YgdGhlIHByb2Nlc3NvciBpbiBNSHouCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVBBUkFNRVRFUlM6Ci1hY2N1cmF0ZSAgICAtIFRydWUgb2YgdGhlIHNwZWVkIHNob3VsZCBiZSBtZWFzdXJlZCBhY2N1cmF0ZWx5Ci0KLVJFVFVSTlM6Ci1Qcm9jZXNzb3Igc3BlZWQgaW4gTUh6LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzcGVlZCBvZiB0aGUgQ1BVIGluIE1Iei4gTm90ZSB0aGF0IGlmIHRoZSBzcGVlZAotY2Fubm90IGJlIGRldGVybWluZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gMC4KLQotSWYgdGhlIGFjY3VyYXRlIHBhcmFtZXRlciBpcyBzZXQgdG8gdHJ1ZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHNwZW5kIGxvbmdlcgotcHJvZmlsaW5nIHRoZSBzcGVlZCBvZiB0aGUgQ1BVLCBhbmQgd2lsbCBub3Qgcm91bmQgdGhlIENQVSBzcGVlZCB0aGF0IGlzCi1yZXBvcnRlZC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGhpZ2hseSBhY2N1cmF0ZSB0aW1pbmcgdXNpbmcgdGhlIFBlbnRpdW0KLVJEVFNDIGluc3RydWN0aW9uLCBidXQgaXQgZG9lcyB0YWtlIGEgbG90IGxvbmdlciBmb3IgdGhlIHByb2ZpbGluZyB0bwotcHJvZHVjZSBhY2N1cmF0ZSByZXN1bHRzLgotCi1TRUUgQUxTTzoKLUNQVV9nZXRQcm9jZXNzb3JTcGVlZEluSHosIENQVV9nZXRQcm9jZXNzb3JUeXBlLCBDUFVfaGF2ZU1NWCwKLUNQVV9nZXRQcm9jZXNzb3JOYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgWkFQSSBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQoCi0gICAgaWJvb2wgYWNjdXJhdGUpCi17Ci0jaWYgZGVmaW5lZChfX0lOVEVMX18pCi0gICAgLyogTnVtYmVyIG9mIGN5Y2xlcyBuZWVkZWQgdG8gZXhlY3V0ZSBhIHNpbmdsZSBCU0YgaW5zdHJ1Y3Rpb24gb24gaTM4NisKLSAgICAgKiBwcm9jZXNzb3JzLgotICAgICAqLwotICAgIHVsb25nICAgY3B1U3BlZWQ7Ci0gICAgdWludCAgICBpOwotICAgIHN0YXRpYyAgdWxvbmcgaW50ZWxfY3ljbGVzW10gPSB7Ci0JMTE1LDQ3LDQzLAotCX07Ci0gICAgc3RhdGljICB1bG9uZyBjeXJpeF9jeWNsZXNbXSA9IHsKLQkzOCwzOCw1Miw1MiwKLQl9OwotICAgIHN0YXRpYyAgdWxvbmcgYW1kX2N5Y2xlc1tdID0gewotCTQ5LAotCX07Ci0gICAgc3RhdGljICB1bG9uZyBrbm93bl9zcGVlZHNbXSA9IHsKLQkxMDAwLDk1MCw5MDAsODUwLDgwMCw3NTAsNzAwLDY1MCw2MDAsNTUwLDUwMCw0NTAsNDMzLDQwMCwzNTAsCi0JMzMzLDMwMCwyNjYsMjMzLDIwMCwxNjYsMTUwLDEzMywxMjAsMTAwLDkwLDc1LDY2LDYwLDUwLDMzLDIwLDAsCi0JfTsKLQotICAgIGlmIChDUFVfaGF2ZVJEVFNDKCkpIHsKLQljcHVTcGVlZCA9IChHZXRSRFRTQ0NwdVNwZWVkKGFjY3VyYXRlKSArIDUwMDAwMCkgLyAxMDAwMDAwOwotCX0KLSAgICBlbHNlIHsKLQlpbnQgdHlwZSA9IENQVV9nZXRQcm9jZXNzb3JUeXBlKCk7Ci0JaW50IHByb2Nlc3NvciA9IHR5cGUgJiBDUFVfbWFzazsKLQlpbnQgdmVuZG9yID0gdHlwZSAmIENQVV9mYW1pbHlNYXNrOwotCWlmICh2ZW5kb3IgPT0gQ1BVX0ludGVsKQotCSAgICBjcHVTcGVlZCA9IEdldEJTRkNwdVNwZWVkKElURVJBVElPTlMgKiBpbnRlbF9jeWNsZXNbcHJvY2Vzc29yIC0gQ1BVX2kzODZdKTsKLQllbHNlIGlmICh2ZW5kb3IgPT0gQ1BVX0N5cml4KQotCSAgICBjcHVTcGVlZCA9IEdldEJTRkNwdVNwZWVkKElURVJBVElPTlMgKiBjeXJpeF9jeWNsZXNbcHJvY2Vzc29yIC0gQ1BVX0N5cml4Nng4Nl0pOwotCWVsc2UgaWYgKHZlbmRvciA9PSBDUFVfQU1EKQotCSAgICBjcHVTcGVlZCA9IEdldEJTRkNwdVNwZWVkKElURVJBVElPTlMgKiBhbWRfY3ljbGVzWzBdKTsKLQllbHNlCi0JICAgIHJldHVybiAwOwotCX0KLQotICAgIC8qIE5vdyBub3JtYWxpc2UgdGhlIHJlc3VsdHMgZ2l2ZW4ga25vd24gcHJvY2Vzc29ycyBzcGVlZHMsIGlmIHRoZQotICAgICAqIHNwZWVkIHdlIG1lYXN1cmUgaXMgd2l0aGluIDJNSHogb2YgdGhlIGV4cGVjdGVkIHZhbHVlcwotICAgICAqLwotICAgIGlmICghYWNjdXJhdGUpIHsKLQlmb3IgKGkgPSAwOyBrbm93bl9zcGVlZHNbaV0gIT0gMDsgaSsrKSB7Ci0JICAgIGlmIChjcHVTcGVlZCA+PSAoa25vd25fc3BlZWRzW2ldLTMpICYmIGNwdVNwZWVkIDw9IChrbm93bl9zcGVlZHNbaV0rMykpIHsKLQkJcmV0dXJuIGtub3duX3NwZWVkc1tpXTsKLQkJfQotCSAgICB9Ci0JfQotICAgIHJldHVybiBjcHVTcGVlZDsKLSNlbHNlCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyB0aGUgc3BlZWQgb2YgdGhlIHByb2Nlc3NvciBpbiBIei4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLUFjY3VyYXRlIHByb2Nlc3NvciBzcGVlZCBpbiBIei4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWNjdXJhdGUgc3BlZWQgb2YgdGhlIENQVSBpbiBIei4gTm90ZSB0aGF0IGlmIHRoZQotc3BlZWQgY2Fubm90IGJlIGRldGVybWluZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gMC4KLQotVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQgZnVuY3Rpb24sIGV4Y2VwdCB0aGF0Ci1pdCBhdHRlbXB0cyB0byBhY2N1cmF0ZWx5IG1lYXN1cmUgdGhlIENQVSBzcGVlZCBpbiBIei4gVGhpcyBpcyB1c2VkCi1pbnRlcm5hbGx5IGluIHRoZSBaZW4gVGltZXIgbGlicmFyaWVzIHRvIHByb3ZpZGUgYWNjdXJhdGUgcmVhbCB3b3JsZCB0aW1pbmcKLWluZm9ybWF0aW9uLiBUaGlzIGlzIGltcG9ydGFudCBmb3IgaGlnaGx5IGFjY3VyYXRlIHRpbWluZyB1c2luZyB0aGUgUGVudGl1bQotUkRUU0MgaW5zdHJ1Y3Rpb24sIGJ1dCBpdCBkb2VzIHRha2UgYSBsb3QgbG9uZ2VyIGZvciB0aGUgcHJvZmlsaW5nIHRvCi1wcm9kdWNlIGFjY3VyYXRlIHJlc3VsdHMuCi0KLVNFRSBBTFNPOgotQ1BVX2dldFByb2Nlc3NvclNwZWVkLCBDUFVfZ2V0UHJvY2Vzc29yVHlwZSwgQ1BVX2hhdmVNTVgsCi1DUFVfZ2V0UHJvY2Vzc29yTmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFpBUEkgQ1BVX2dldFByb2Nlc3NvclNwZWVkSW5IWigKLSAgICBpYm9vbCBhY2N1cmF0ZSkKLXsKLSNpZiBkZWZpbmVkKF9fSU5URUxfXykKLSAgICBpZiAoQ1BVX2hhdmVSRFRTQygpKSB7Ci0JcmV0dXJuIEdldFJEVFNDQ3B1U3BlZWQoYWNjdXJhdGUpOwotCX0KLSAgICByZXR1cm4gQ1BVX2dldFByb2Nlc3NvclNwZWVkKGZhbHNlKSAqIDEwMDAwMDA7Ci0jZWxzZQotICAgIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgYSBzdHJpbmcgZGVmaW5pbmcgdGhlIHNwZWVkIGFuZCBuYW1lIG9mIHRoZSBwcm9jZXNzb3IuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVJFVFVSTlM6Ci1Qcm9jZXNzb3IgbmFtZSBzdHJpbmcuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gRW5nbGlzaCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgc3BlZWQgYW5kIG5hbWUgb2YgdGhlCi1DUFUuCi0KLVNFRSBBTFNPOgotQ1BVX2dldFByb2Nlc3NvclR5cGUsIENQVV9oYXZlTU1YLCBDUFVfZ2V0UHJvY2Vzc29yTmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIgKiBaQVBJIENQVV9nZXRQcm9jZXNzb3JOYW1lKHZvaWQpCi17Ci0jaWYgZGVmaW5lZChfX0lOVEVMX18pCi0gICAgc3RhdGljIGludCAgY3B1LHNwZWVkID0gLTE7Ci0gICAgc3RhdGljIGNoYXIgbmFtZVs4MF07Ci0KLSAgICBpZiAoc3BlZWQgPT0gLTEpIHsKLQljcHUgPSBDUFVfZ2V0UHJvY2Vzc29yVHlwZSgpOwotCXNwZWVkID0gQ1BVX2dldFByb2Nlc3NvclNwZWVkKGZhbHNlKTsKLQl9Ci0gICAgc3ByaW50ZihuYW1lLCIlZCBNSHogIiwgc3BlZWQpOwotICAgIHN3aXRjaCAoY3B1ICYgQ1BVX21hc2spIHsKLQljYXNlIENQVV9pMzg2OgotCSAgICBzdHJjYXQobmFtZSwiSW50ZWwgaTM4NiBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfaTQ4NjoKLQkgICAgc3RyY2F0KG5hbWUsIkludGVsIGk0ODYgcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX1BlbnRpdW06Ci0JICAgIHN0cmNhdChuYW1lLCJJbnRlbCBQZW50aXVtIHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9QZW50aXVtUHJvOgotCSAgICBzdHJjYXQobmFtZSwiSW50ZWwgUGVudGl1bSBQcm8gcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX1BlbnRpdW1JSToKLQkgICAgc3RyY2F0KG5hbWUsIkludGVsIFBlbnRpdW0gSUkgcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0NlbGVyb246Ci0JICAgIHN0cmNhdChuYW1lLCJJbnRlbCBDZWxlcm9uIHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9QZW50aXVtSUlJOgotCSAgICBzdHJjYXQobmFtZSwiSW50ZWwgUGVudGl1bSBJSUkgcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX1Vua0ludGVsOgotCSAgICBzdHJjYXQobmFtZSwiVW5rbm93biBJbnRlbCBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQ3lyaXg2eDg2OgotCSAgICBzdHJjYXQobmFtZSwiQ3lyaXggNng4NiBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQ3lyaXg2eDg2TVg6Ci0JICAgIHN0cmNhdChuYW1lLCJDeXJpeCA2eDg2TVggcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0N5cml4TWVkaWFHWDoKLQkgICAgc3RyY2F0KG5hbWUsIkN5cml4IE1lZGlhR1ggcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0N5cml4TWVkaWFHWG06Ci0JICAgIHN0cmNhdChuYW1lLCJDeXJpeCBNZWRpYUdYbSBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfVW5rQ3lyaXg6Ci0JICAgIHN0cmNhdChuYW1lLCJVbmtub3duIEN5cml4IHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9BTURBbTQ4NjoKLQkgICAgc3RyY2F0KG5hbWUsIkFNRCBBbTQ4NiBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQU1EQW01eDg2OgotCSAgICBzdHJjYXQobmFtZSwiQU1EIEFtNXg4NiBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQU1ESzU6Ci0JICAgIHN0cmNhdChuYW1lLCJBTUQgSzUgcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0FNREs2OgotCSAgICBzdHJjYXQobmFtZSwiQU1EIEs2IHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9BTURLNl8yOgotCSAgICBzdHJjYXQobmFtZSwiQU1EIEs2LTIgcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0FNREs2X0lJSToKLQkgICAgc3RyY2F0KG5hbWUsIkFNRCBLNi1JSUkgcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0FNREs2XzJwbHVzOgotCSAgICBzdHJjYXQobmFtZSwiQU1EIEs2LTIrIHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9BTURLNl9JSUlwbHVzOgotCSAgICBzdHJjYXQobmFtZSwiQU1EIEs2LUlJSSsgcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX1Vua0FNRDoKLQkgICAgc3RyY2F0KG5hbWUsIlVua25vd24gQU1EIHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9BTURBdGhsb246Ci0JICAgIHN0cmNhdChuYW1lLCJBTUQgQXRobG9uIHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9BTUREdXJvbjoKLQkgICAgc3RyY2F0KG5hbWUsIkFNRCBEdXJvbiBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfV2luQ2hpcEM2OgotCSAgICBzdHJjYXQobmFtZSwiSURUIFdpbkNoaXAgQzYgcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX1dpbkNoaXAyOgotCSAgICBzdHJjYXQobmFtZSwiSURUIFdpbkNoaXAgMiBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfVW5rSURUOgotCSAgICBzdHJjYXQobmFtZSwiVW5rbm93biBJRFQgcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIHN0cmNhdChuYW1lLCJVbmtub3duIHByb2Nlc3NvciIpOwotCX0KLSAgICBpZiAoQ1BVX2hhdmVNTVgoKSkKLQlzdHJjYXQobmFtZSwiIHdpdGggTU1YKFIpIik7Ci0gICAgaWYgKENQVV9oYXZlM0ROb3coKSkKLQlzdHJjYXQobmFtZSwiLCAzRE5vdyEoUikiKTsKLSAgICBpZiAoQ1BVX2hhdmVTU0UoKSkKLQlzdHJjYXQobmFtZSwiLCBTU0UoUikiKTsKLSAgICByZXR1cm4gbmFtZTsKLSNlbHNlCi0gICAgcmV0dXJuICJVbmtub3duIjsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZGVidWcuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2RlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWJmMDkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZGVidWcuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBNYWluIG1vZHVsZSBjb250YWluaW5nIGRlYnVnIGNoZWNraW5nIGZlYXR1cmVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaWZkZWYgIF9fV0lOMzJfVlhEX18KLSNpbmNsdWRlICJ2eGRmaWxlLmgiCi0jZWxpZiBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0jaW5jbHVkZSAibnRkcml2ZXIuaCIKLSNlbGlmIGRlZmluZWQoX19PUzJfVkREX18pCi0jaW5jbHVkZSAidmRkZmlsZS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHtzZWNyZXR9ICovCi12b2lkICgqX0NIS19mYWlsKShpbnQgZmF0YWwsY29uc3QgY2hhciAqbXNnLGNvbnN0IGNoYXIgKmNvbmQsY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSkgPSBfQ0hLX2RlZmF1bHRGYWlsOwotc3RhdGljIGNoYXIgbG9nRmlsZVsyNTZdID0gIiI7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiAgQ0hFQ0tFRAotdm9pZCBfQ0hLX2RlZmF1bHRGYWlsKAotICAgIGludCBmYXRhbCwKLSAgICBjb25zdCBjaGFyICptc2csCi0gICAgY29uc3QgY2hhciAqY29uZCwKLSAgICBjb25zdCBjaGFyICpmaWxlLAotICAgIGludCBsaW5lKQotewotICAgIEZJTEUgICAgKmY7Ci0gICAgY2hhciAgICBidWZbMjU2XTsKLQotICAgIGlmIChsb2dGaWxlWzBdID09IDApIHsKLQlzdHJjcHkobG9nRmlsZSxQTV9nZXROdWNsZXVzUGF0aCgpKTsKLQlQTV9iYWNrc2xhc2gobG9nRmlsZSk7Ci0Jc3RyY2F0KGxvZ0ZpbGUsInNjaXRlY2gubG9nIik7Ci0JfQotICAgIGlmICgoZiA9IGZvcGVuKGxvZ0ZpbGUsImErIikpICE9IE5VTEwpIHsKLSNpZiBkZWZpbmVkKF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19PUzJfVkREX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKLQlzcHJpbnRmKGJ1Zixtc2csY29uZCxmaWxlLGxpbmUpOwotCWZ3cml0ZShidWYsMSxzdHJsZW4oYnVmKSxmKTsKLSNlbHNlCi0JZnByaW50ZihmLG1zZyxjb25kLGZpbGUsbGluZSk7Ci0jZW5kaWYKLQlmY2xvc2UoZik7Ci0JfQotICAgIGlmIChmYXRhbCkgewotCXNwcmludGYoYnVmLCJDaGVjayBmYWlsZWQ6IGNoZWNrICclcycgZm9yIGRldGFpbHMiLCBsb2dGaWxlKTsKLQlQTV9mYXRhbEVycm9yKGJ1Zik7Ci0JfQotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBkZWJ1ZyBsb2cgZmlsZS4KLQotSEVBREVSOgotcG1hcGkuaAotCi1QQVJBTUVURVJTOgotbG9nRmlsZVBhdGggLSBGdWxsIGZpbGUgYW5kIHBhdGggbmFtZSB0byBkZWJ1ZyBsb2cgZmlsZS4KLQotUkVNQVJLUzoKLVNldHMgdGhlIG5hbWUgYW5kIGxvY2F0aW9uIG9mIHRoZSBkZWJ1ZyBsb2cgZmlsZS4gVGhlIGRlYnVnIGxvZyBmaWxlIGlzCi1jcmVhdGVkIGFuZCB3cml0dGVuIHRvIHdoZW4gcnVudGltZSBjaGVja3MsIHdhcm5pbmdzIGFuZCBmYWlsdXJlIGNvbmRpdGlvbnMKLWFyZSBsb2dnZWQgdG8gZGlzayB3aGVuIGNvZGUgaXMgY29tcGlsZWQgaW4gQ0hFQ0tFRCBtb2RlLiBCeSBkZWZhdWx0IHRoZQotbG9nIGZpbGUgaXMgY2FsbGVkICdzY2l0ZWNoLmxvZycgYW5kIGdvZXMgaW50byB0aGUgY3VycmVudCBTY2lUZWNoIE51Y2xldXMKLXBhdGggZm9yIHRoZSBhcHBsaWNhdGlvbi4gWW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBzZXQgdGhlIGZpbGVuYW1lCi1hbmQgbG9jYXRpb24gb2YgdGhlIGRlYnVnIGxvZyBmaWxlIHRvIHlvdXIgb3duIGFwcGxpY2F0aW9uIHNwZWNpZmljCi1kaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXREZWJ1Z0xvZygKLSAgICBjb25zdCBjaGFyICpsb2dGaWxlUGF0aCkKLXsKLSAgICBzdHJjcHkobG9nRmlsZSxsb2dGaWxlUGF0aCk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX2V2ZW50LmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9fZXZlbnQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmRjYWFiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9fZXZlbnQuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIKLTsqIEVudmlyb25tZW50OiBJQk0gUEMgKE1TIERPUykKLTsqCi07KiBEZXNjcmlwdGlvbjogQXNzZW1ibHkgbGFuZ3VhZ2Ugc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGV2ZW50IG1vZHVsZS4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIGlkZWFsCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWlmZGVmIGZsYXRtb2RlbAotCi1oZWFkZXIgIF9ldmVudCAgICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1iZWdkYXRhc2VnICBfZXZlbnQKLQotICAgIGNleHRlcm4gIF9FVlRfYmlvc1B0cixEUFRSCi0KLWlmZGVmICAgVVNFX05BU00KLSVkZWZpbmUgS0JfSEVBRCAgICAgV09SRCBlc2krMDFBaCAgIDsgS2V5Ym9hcmQgYnVmZmVyIGhlYWQgaW4gQklPUyBkYXRhIGFyZWEKLSVkZWZpbmUgS0JfVEFJTCAgICAgV09SRCBlc2krMDFDaCAgIDsgS2V5Ym9hcmQgYnVmZmVyIHRhaWwgaW4gQklPUyBkYXRhIGFyZWEKLSVkZWZpbmUgS0JfU1RBUlQgICAgV09SRCBlc2krMDgwaCAgIDsgU3RhcnQgb2Yga2V5Ym9hcmQgYnVmZmVyIGluIEJJT1MgZGF0YSBhcmVhCi0lZGVmaW5lIEtCX0VORCAgICAgIFdPUkQgZXNpKzA4MmggICA7IEVuZCBvZiBrZXlib2FyZCBidWZmZXIgaW4gQklPUyBkYXRhIGFyZWEKLWVsc2UKLUtCX0hFQUQgICAgIEVRVSBXT1JEIGVzaSswMUFoICAgICAgIDsgS2V5Ym9hcmQgYnVmZmVyIGhlYWQgaW4gQklPUyBkYXRhIGFyZWEKLUtCX1RBSUwgICAgIEVRVSBXT1JEIGVzaSswMUNoICAgICAgIDsgS2V5Ym9hcmQgYnVmZmVyIHRhaWwgaW4gQklPUyBkYXRhIGFyZWEKLUtCX1NUQVJUICAgIEVRVSBXT1JEIGVzaSswODBoICAgICAgIDsgU3RhcnQgb2Yga2V5Ym9hcmQgYnVmZmVyIGluIEJJT1MgZGF0YSBhcmVhCi1LQl9FTkQgICAgICBFUVUgV09SRCBlc2krMDgyaCAgICAgICA7IEVuZCBvZiBrZXlib2FyZCBidWZmZXIgaW4gQklPUyBkYXRhIGFyZWEKLWVuZGlmCi0KLWVuZGRhdGFzZWcgIF9ldmVudAotCi1iZWdjb2Rlc2VnICBfZXZlbnQgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLSAgICBjcHVibGljIF9FVlRfY29kZVN0YXJ0Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBfRVZUX2dldEtleUNvZGUodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybnMgdGhlIGtleSBjb2RlIGZvciB0aGUgbmV4dCBhdmFpbGFibGUga2V5IGJ5IGV4dHJhY3RpbmcgaXQgZnJvbQotOyB0aGUgQklPUyBrZXlib2FyZCBidWZmZXIuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0VWVF9nZXRLZXlDb2RlCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgZXNpLFtfRVZUX2Jpb3NQdHJdCi0gICAgICAgIHhvciAgICAgZWJ4LGVieAotICAgICAgICB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgbW92ICAgICBieCxbS0JfSEVBRF0KLSAgICAgICAgY21wICAgICBieCxbS0JfVEFJTF0KLSAgICAgICAganogICAgICBAQERvbmUKLSAgICAgICAgeG9yICAgICBlYXgsZWF4Ci0gICAgICAgIG1vdiAgICAgYXgsW2VzaStlYnhdICAgIDsgRUFYIDo9IGNoYXJhY3RlciBmcm9tIGtleWJvYXJkIGJ1ZmZlcgotICAgICAgICBpbmMgICAgIF9ieAotICAgICAgICBpbmMgICAgIF9ieAotICAgICAgICBjbXAgICAgIGJ4LFtLQl9FTkRdICAgICA7IEhpdCB0aGUgZW5kIG9mIHRoZSBrZXlib2FyZCBidWZmZXI/Ci0gICAgICAgIGpsICAgICAgQEAxCi0gICAgICAgIG1vdiAgICAgYngsW0tCX1NUQVJUXQotQEAxOiAgICBtb3YgICAgIFtLQl9IRUFEXSxieCAgICA7IFVwZGF0ZSBrZXlib2FyZCBidWZmZXIgaGVhZCBwb2ludGVyCi0KLUBARG9uZTogbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgVGhpcyBmdW5jdGlvbiB3b3VsZCBub3JtYWxseSBkbyBub3RoaW5nLCBob3dldmVyIGR1ZSB0byBzdHJhbmdlIGJ1Z3MKLTsgaW4gdGhlIFdpbmRvd3MgMy4xIGFuZCBPUy8yIERPUyBib3hlcywgd2UgZG9uJ3QgZ2V0IGFueSBoYXJkd2FyZSBrZXlib2FyZAotOyBpbnRlcnJ1cHRzIHVubGVzcyB3ZSBwZXJpb2RpY2FsbHkgY2FsbCB0aGUgQklPUyBrZXlib2FyZCBmdW5jdGlvbnMuIEhlbmNlCi07IHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgZXZlcnkgdGltZSB0aGF0IHdlIGNoZWNrIGZvciBldmVudHMsIGFuZCB3b3JrcwotOyBhcm91bmQgdGhpcyBwcm9ibGVtIChpbiBlc3NlbmNlIGl0IHRlbGxzIHRoZSBET1MgVkRNIHRvIHB1bXAgdGhlCi07IGtleWJvYXJkIGV2ZW50cyB0byBvdXIgcHJvZ3JhbSA7LSkuCi07Ci07IE5vdGUgdGhhdCB0aGlzIGJ1ZyBpcyBub3QgcHJlc2VudCB1bmRlciBXaW4gOXggRE9TIGJveGVzLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9FVlRfcHVtcE1lc3NhZ2VzCi0KLSAgICAgICAgbW92ICAgICBhaCwxMWggICAgICAgICAgOyBGdW5jdGlvbiAtIENoZWNrIGtleWJvYXJkIHN0YXR1cwotICAgICAgICBpbnQgICAgIDE2aCAgICAgICAgICAgICA7IENhbGwgQklPUwotICAgICAgICAKLSAgICAgICAgbW92ICAgICBheCwgMEJoICAgICAgICAgOyBSZXNldCBNb3ZlIE1vdXNlCi0gICAgICAgIGludCAgICAgMzNoCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgX0VWVF9kaXNhYmxlSW50KHZvaWQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJuIHByb2Nlc3NvciBpbnRlcnJ1cHQgc3RhdHVzIGFuZCBkaXNhYmxlIGludGVycnVwdHMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0VWVF9kaXNhYmxlSW50Ci0KLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBQdXQgZmxhZyB3b3JkIG9uIHN0YWNrCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgRGlzYWJsZSBpbnRlcnJ1cHRzIQotICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICA7IGRlcG9zaXQgZmxhZyB3b3JkIGluIHJldHVybiByZWdpc3RlcgotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfRVZUX3Jlc3RvcmVJbnQoaW50IHBzKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlc3RvcmUgcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0VWVF9yZXN0b3JlSW50Ci0KLSAgICAgICAgQVJHICAgICBwczpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBlYnAKLSAgICAgICAgbW92ICAgICBlYnAsZXNwICAgICAgICAgOyBTZXQgdXAgc3RhY2sgZnJhbWUKLSAgICAgICAgcHVzaCAgICBbRFdPUkQgcHNdCi0gICAgICAgIHBvcGYgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBwcm9jZXNzb3Igc3RhdHVzIChhbmQgaW50ZXJydXB0cykKLSAgICAgICAgcG9wICAgICBlYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBFVlRfcmRpbngoaW50IHBvcnQsaW50IGluZGV4KQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZHMgYW4gaW5kZXhlZCByZWdpc3RlciB2YWx1ZSBmcm9tIGFuIEkvTyBwb3J0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIEVWVF9yZGlueAotCi0gICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCBpbmRleDpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBlYnAKLSAgICAgICAgbW92ICAgICBlYnAsZXNwCi0gICAgICAgIG1vdiAgICAgZWR4LFtwb3J0XQotICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQotICAgICAgICBvdXQgICAgIGR4LGFsCi0gICAgICAgIGluYyAgICAgZHgKLSAgICAgICAgaW4gICAgICBhbCxkeAotICAgICAgICBtb3Z6eCAgIGVheCxhbAotICAgICAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBFVlRfd3JpbngoaW50IHBvcnQsaW50IGluZGV4LGludCB2YWx1ZSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFdyaXRlcyBhbiBpbmRleGVkIHJlZ2lzdGVyIHZhbHVlIHRvIGFuIEkvTyBwb3J0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIEVWVF93cmlueAotCi0gICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCBpbmRleDpVSU5ULCB2YWx1ZTpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBlYnAKLSAgICAgICAgbW92ICAgICBlYnAsZXNwCi0gICAgICAgIG1vdiAgICAgZWR4LFtwb3J0XQotICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQotICAgICAgICBtb3YgICAgIGFoLFtCWVRFIHZhbHVlXQotICAgICAgICBvdXQgICAgIGR4LGF4Ci0gICAgICAgIHBvcCAgICAgZWJwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi0gICAgY3B1YmxpYyBfRVZUX2NvZGVFbmQKLQotZW5kY29kZXNlZyAgX2V2ZW50Ci0KLWVuZGlmCi0KLSAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19senRpbWVyLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9fbHp0aW1lci5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YTljNzkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19senRpbWVyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDQzOCArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICBOQVNNIG9yIFRBU00gQXNzZW1ibGVyCi07KiBFbnZpcm9ubWVudDogSUJNIFBDIChNUyBET1MpCi07KgotOyogRGVzY3JpcHRpb246IFVzZXMgdGhlIDgyNTMgdGltZXIgYW5kIHRoZSBCSU9TIHRpbWUtb2YtZGF5IGNvdW50IHRvIHRpbWUKLTsqICAgICAgICAgICAgICB0aGUgcGVyZm9ybWFuY2Ugb2YgY29kZSB0aGF0IHRha2VzIGxlc3MgdGhhbiBhbiBob3VyIHRvCi07KiAgICAgICAgICAgICAgZXhlY3V0ZS4KLTsqCi07KiAgICAgICAgICAgICAgVGhlIHJvdXRpbmVzIGluIHRoaXMgcGFja2FnZSBvbmx5IHdvcmtzIHdpdGggaW50ZXJydXB0cwotOyogICAgICAgICAgICAgIGVuYWJsZWQsIGFuZCBpbiBmYWN0IHdpbGwgZXhwbGljaXRseSB0dXJuIGludGVycnVwdHMgb24KLTsqICAgICAgICAgICAgICBpbiBvcmRlciB0byBlbnN1cmUgd2UgZ2V0IGFjY3VyYXRlIHJlc3VsdHMgZnJvbSB0aGUgdGltZXIuCi07KgotOyogIEV4dGVybmFsbHkgJ0MnIGNhbGxhYmxlIHJvdXRpbmVzOgotOyoKLTsqICBMWl90aW1lck9uOiAgICAgU2F2ZXMgdGhlIEJJT1MgdGltZSBvZiBkYXkgY291bnQgYW5kIHN0YXJ0cyB0aGUKLTsqICAgICAgICAgICAgICAgICAgbG9uZyBwZXJpb2QgWmVuIFRpbWVyLgotOyoKLTsqICBMWl90aW1lckxhcDogICAgTGF0Y2hlcyB0aGUgY3VycmVudCBjb3VudCwgYW5kIGtlZXBzIHRoZSB0aW1lciBydW5uaW5nCi07KgotOyogIExaX3RpbWVyT2ZmOiAgICBTdG9wcyB0aGUgbG9uZy1wZXJpb2QgWmVuIFRpbWVyIGFuZCBzYXZlcyB0aGUgdGltZXIKLTsqICAgICAgICAgICAgICAgICAgY291bnQgYW5kIHRoZSBCSU9TIHRpbWUgb2YgZGF5IGNvdW50LgotOyoKLTsqICBMWl90aW1lckNvdW50OiAgUmV0dXJucyBhbiB1bnNpZ25lZCBsb25nIHJlcHJlc2VudGluZyB0aGUgdGltZWQgY291bnQKLTsqICAgICAgICAgICAgICAgICAgaW4gbWljcm9zZWNvbmRzLiBJZiBtb3JlIHRoYW4gYW4gaG91ciBwYXNzZWQgZHVyaW5nCi07KiAgICAgICAgICAgICAgICAgIHRoZSB0aW1pbmcgaW50ZXJ2YWwsIExaX3RpbWVyQ291bnQgd2lsbCByZXR1cm4gdGhlCi07KiAgICAgICAgICAgICAgICAgIHZhbHVlIDB4RkZGRkZGRkYgKGFuIGludmFsaWQgY291bnQpLgotOyoKLTsqICBOb3RlOiAgIElmIGVpdGhlciBtb3JlIHRoYW4gYW4gaG91ciBwYXNzZXMgYmV0d2VlbiBjYWxscyB0byBMWl90aW1lck9uCi07KiAgICAgICAgICBhbmQgTFpfdGltZXJPZmYsIGFuIGVycm9yIGlzIHJlcG9ydGVkLiBGb3IgdGltaW5nIGNvZGUgdGhhdCB0YWtlcwotOyogICAgICAgICAgbW9yZSB0aGFuIGEgZmV3IG1pbnV0ZXMgdG8gZXhlY3V0ZSwgdXNlIHRoZSBsb3cgcmVzb2x1dGlvbgotOyogICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGNvZGUsIHdoaWNoIHNob3VsZCBiZSBhY2N1cmF0ZQotOyogICAgICAgICAgZW5vdWdoIGZvciBtb3N0IHB1cnBvc2VzLgotOyoKLTsqICBOb3RlOiAgIEVhY2ggYmxvY2sgb2YgY29kZSBiZWluZyB0aW1lZCBzaG91bGQgaWRlYWxseSBiZSBydW4gc2V2ZXJhbAotOyogICAgICAgICAgdGltZXMsIHdpdGggYXQgbGVhc3QgdHdvIHNpbWlsYXIgcmVhZGluZ3MgcmVxdWlyZWQgdG8KLTsqICAgICAgICAgIGVzdGFibGlzaCBhIHRydWUgbWVhc3VyZW1lbnQsIGluIG9yZGVyIHRvIGVsaW1pbmF0ZSBhbnkKLTsqICAgICAgICAgIHZhcmlhYmlsaXR5IGNhdXNlZCBieSBpbnRlcnJ1cHRzLgotOyoKLTsqICBOb3RlOiAgIEludGVycnVwdHMgbXVzdCBub3QgYmUgZGlzYWJsZWQgZm9yIG1vcmUgdGhhbiA1NCBtcyBhdCBhCi07KiAgICAgICAgICBzdHJldGNoIGR1cmluZyB0aGUgdGltaW5nIGludGVydmFsLiBCZWNhdXNlIGludGVycnVwdHMgYXJlCi07KiAgICAgICAgICBlbmFibGVkLCBrZXksIG1pY2UsIGFuZCBvdGhlciBkZXZpY2VzIHRoYXQgZ2VuZXJhdGUgaW50ZXJydXB0cwotOyogICAgICAgICAgc2hvdWxkIG5vdCBiZSB1c2VkIGR1cmluZyB0aGUgdGltaW5nIGludGVydmFsLgotOyoKLTsqICBOb3RlOiAgIEFueSBleHRyYSBjb2RlIHJ1bm5pbmcgb2ZmIHRoZSB0aW1lciBpbnRlcnJ1cHQgKHN1Y2ggYXMKLTsqICAgICAgICAgIHNvbWUgbWVtb3J5IHJlc2lkZW50IHV0aWxpdGllcykgd2lsbCBpbmNyZWFzZSB0aGUgdGltZQotOyogICAgICAgICAgbWVhc3VyZWQgYnkgdGhlIFplbiBUaW1lci4KLTsqCi07KiAgTm90ZTogICBUaGVzZSByb3V0aW5lcyBjYW4gaW50cm9kdWNlIGluYWNjdXJhY2llcyBvZiB1cCB0byBhIGZldwotOyogICAgICAgICAgdGVudGhzIG9mIGEgc2Vjb25kIGludG8gdGhlIHN5c3RlbSBjbG9jayBjb3VudCBmb3IgZWFjaAotOyogICAgICAgICAgY29kZSBzZWN0aW9uIGJlaW5nIHRpbWVkLiBDb25zZXF1ZW50bHksIGl0J3MgYSBnb29kIGlkZWEgdG8KLTsqICAgICAgICAgIHJlYm9vdCBhdCB0aGUgY29uY2x1c2lvbiBvZiB0aW1pbmcgc2Vzc2lvbnMuIChUaGUKLTsqICAgICAgICAgIGJhdHRlcnktYmFja2VkIGNsb2NrLCBpZiBhbnksIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgWmVuCi07KiAgICAgICAgICB0aW1lci4pCi07KgotOyogIEFsbCByZWdpc3RlcnMgYW5kIGFsbCBmbGFncyBhcmUgcHJlc2VydmVkIGJ5IGFsbCByb3V0aW5lcywgZXhjZXB0Ci07KiAgaW50ZXJydXB0cyB3aGljaCBhcmUgYWx3YXlzIHR1cm5lZCBvbgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiCi0KLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ci07IEVxdWF0ZXMgdXNlZCBieSBsb25nIHBlcmlvZCBaZW4gVGltZXIKLTsKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLTsgQmFzZSBhZGRyZXNzIG9mIDgyNTMgdGltZXIgY2hpcAotCi1CQVNFXzgyNTMgICAgICAgZXF1ICAgICA0MGgKLQotOyBUaGUgYWRkcmVzcyBvZiB0aGUgdGltZXIgMCBjb3VudCByZWdpc3RlcnMgaW4gdGhlIDgyNTMKLQotVElNRVJfMF84MjUzICAgIGVxdSAgICAgQkFTRV84MjUzICsgMAotCi07IFRoZSBhZGRyZXNzIG9mIHRoZSBtb2RlIHJlZ2lzdGVyIGluIHRoZSA4MjUzCi0KLU1PREVfODI1MyAgICAgICBlcXUgICAgIEJBU0VfODI1MyArIDMKLQotOyBUaGUgYWRkcmVzcyBvZiB0aGUgQklPUyB0aW1lciBjb3VudCB2YXJpYWJsZSBpbiB0aGUgQklPUyBkYXRhIGFyZWEuCi0KLVRJTUVSX0NPVU5UICAgICBlcXUgICAgIDZDaAotCi07IE1hY3JvIHRvIGRlbGF5IGJyaWVmbHkgdG8gZW5zdXJlIHRoYXQgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgYmV0d2VlbgotOyBzdWNjZXNzaXZlIEkvTyBhY2Nlc3NlcyBzbyB0aGF0IHRoZSBkZXZpY2UgYmVpbmcgYWNjZXNzZWQgY2FuIHJlc3BvbmQKLTsgdG8gYm90aCBhY2Nlc3NlcyBldmVuIG9uIGEgdmVyeSBmYXN0IFBDLgotCi1pZmRlZiAgIFVTRV9OQVNNCi0lbWFjcm8gIERFTEFZIDAKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSVlbmRtYWNybwotZWxzZQotbWFjcm8gICBERUxBWQotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotZW5kbQotZW5kaWYKLQotaGVhZGVyICAgICAgX2x6dGltZXIKLQotYmVnZGF0YXNlZyAgX2x6dGltZXIKLQotICAgICAgICBjZXh0ZXJuICBfWlRpbWVyQklPU1B0cixEUFRSCi0KLVN0YXJ0QklPU0NvdW50ICAgICAgZGQgIDAgICAgICAgOyBTdGFydGluZyBCSU9TIGNvdW50IGR3b3JkCi1FbmRCSU9TQ291bnQgICAgICAgIGRkICAwICAgICAgIDsgRW5kaW5nIEJJT1MgY291bnQgZHdvcmQKLUVuZFRpbWVkQ291bnQgICAgICAgZHcgIDAgICAgICAgOyBUaW1lciAwIGNvdW50IGF0IHRoZSBlbmQgb2YgdGltaW5nIHBlcmlvZAotCi1lbmRkYXRhc2VnICBfbHp0aW1lcgotCi1iZWdjb2Rlc2VnICBfbHp0aW1lciAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIExaX3RpbWVyT24odm9pZCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBTdGFydHMgdGhlIExvbmcgcGVyaW9kIFplbiB0aW1lciBjb3VudGluZy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBMWl90aW1lck9uCi0KLTsgU2V0IHRoZSB0aW1lciAwIG9mIHRoZSA4MjUzIHRvIG1vZGUgMiAoZGl2aWRlLWJ5LU4pLCB0byBjYXVzZQotOyBsaW5lYXIgY291bnRpbmcgcmF0aGVyIHRoYW4gY291bnQtYnktdHdvIGNvdW50aW5nLiBBbHNvIHN0b3BzCi07IHRpbWVyIDAgdW50aWwgdGhlIHRpbWVyIGNvdW50IGlzIGxvYWRlZCwgZXhjZXB0IG9uIFBTLzIgY29tcHV0ZXJzLgotCi0gICAgICAgIG1vdiAgICAgYWwsMDAxMTAxMDBiICAgICAgICA7IG1vZGUgMgotICAgICAgICBvdXQgICAgIE1PREVfODI1MyxhbAotCi07IFNldCB0aGUgdGltZXIgY291bnQgdG8gMCwgc28gd2Uga25vdyB3ZSB3b24ndCBnZXQgYW5vdGhlciB0aW1lcgotOyBpbnRlcnJ1cHQgcmlnaHQgYXdheS4gTm90ZTogdGhpcyBpbnRyb2R1Y2VzIGFuIGluYWNjdXJhY3kgb2YgdXAgdG8gNTQgbXMKLTsgaW4gdGhlIHN5c3RlbSBjbG9jayBjb3VudCBlYWNoIHRpbWUgaXQgaXMgZXhlY3V0ZWQuCi0KLSAgICAgICAgREVMQVkKLSAgICAgICAgc3ViICAgICBhbCxhbAotICAgICAgICBvdXQgICAgIFRJTUVSXzBfODI1MyxhbCAgICAgOyBsc2IKLSAgICAgICAgREVMQVkKLSAgICAgICAgb3V0ICAgICBUSU1FUl8wXzgyNTMsYWwgICAgIDsgbXNiCi0KLTsgU3RvcmUgdGhlIHRpbWluZyBzdGFydCBCSU9TIGNvdW50Ci0KLSAgICAgICAgdXNlX2VzCi1pZmRlZiAgIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIGVieCxbX1pUaW1lckJJT1NQdHJdCi1lbHNlCi0gICAgICAgIGxlcyAgICAgYngsW19aVGltZXJCSU9TUHRyXQotZW5kaWYKLSAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgICAgIDsgTm8gaW50ZXJydXB0cyB3aGlsZSB3ZSBncmFiIHRoZSBjb3VudAotICAgICAgICBtb3YgICAgIGVheCxbX0VTIF9ieCtUSU1FUl9DT1VOVF0KLSAgICAgICAgc3RpCi0gICAgICAgIG1vdiAgICAgW1N0YXJ0QklPU0NvdW50XSxlYXgKLSAgICAgICAgdW51c2VfZXMKLQotOyBTZXQgdGhlIHRpbWVyIGNvdW50IHRvIDAgYWdhaW4gdG8gc3RhcnQgdGhlIHRpbWluZyBpbnRlcnZhbC4KLQotICAgICAgICBtb3YgICAgIGFsLDAwMTEwMTAwYiAgICAgICAgOyBzZXQgdXAgdG8gbG9hZCBpbml0aWFsCi0gICAgICAgIG91dCAgICAgTU9ERV84MjUzLGFsICAgICAgICA7IHRpbWVyIGNvdW50Ci0gICAgICAgIERFTEFZCi0gICAgICAgIHN1YiAgICAgYWwsYWwKLSAgICAgICAgb3V0ICAgICBUSU1FUl8wXzgyNTMsYWwgICAgIDsgbG9hZCBjb3VudCBsc2IKLSAgICAgICAgREVMQVkKLSAgICAgICAgb3V0ICAgICBUSU1FUl8wXzgyNTMsYWwgICAgIDsgbG9hZCBjb3VudCBtc2IKLQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBMWl90aW1lck9mZih2b2lkKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFN0b3BzIHRoZSBsb25nIHBlcmlvZCBaZW4gdGltZXIgYW5kIHNhdmVzIGNvdW50LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIExaX3RpbWVyT2ZmCi0KLTsgTGF0Y2ggdGhlIHRpbWVyIGNvdW50LgotCi0gICAgICAgIG1vdiAgICAgYWwsMDAwMDAwMDBiICAgICAgICA7IGxhdGNoIHRpbWVyIDAKLSAgICAgICAgb3V0ICAgICBNT0RFXzgyNTMsYWwKLSAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgICAgIDsgU3RvcCB0aGUgQklPUyBjb3VudAotCi07IFJlYWQgdGhlIEJJT1MgY291bnQuIChTaW5jZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwgdGhlIEJJT1MKLTsgY291bnQgd29uJ3QgY2hhbmdlKS4KLQotICAgICAgICB1c2VfZXMKLWlmZGVmICAgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfWlRpbWVyQklPU1B0cl0KLWVsc2UKLSAgICAgICAgbGVzICAgICBieCxbX1pUaW1lckJJT1NQdHJdCi1lbmRpZgotICAgICAgICBtb3YgICAgIGVheCxbX0VTIF9ieCtUSU1FUl9DT1VOVF0KLSAgICAgICAgbW92ICAgICBbRW5kQklPU0NvdW50XSxlYXgKLSAgICAgICAgdW51c2VfZXMKLQotOyBSZWFkIG91dCB0aGUgY291bnQgd2UgbGF0Y2hlZCBlYXJsaWVyLgotCi0gICAgICAgIGluICAgICAgYWwsVElNRVJfMF84MjUzICAgICA7IGxlYXN0IHNpZ25pZmljYW50IGJ5dGUKLSAgICAgICAgREVMQVkKLSAgICAgICAgbW92ICAgICBhaCxhbAotICAgICAgICBpbiAgICAgIGFsLFRJTUVSXzBfODI1MyAgICAgOyBtb3N0IHNpZ25pZmljYW50IGJ5dGUKLSAgICAgICAgeGNoZyAgICBhaCxhbAotICAgICAgICBuZWcgICAgIGF4ICAgICAgICAgICAgICAgICAgOyBDb252ZXJ0IGZyb20gY291bnRkb3duIHJlbWFpbmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgdG8gZWxhcHNlZCBjb3VudAotICAgICAgICBtb3YgICAgIFtFbmRUaW1lZENvdW50XSxheAotICAgICAgICBzdGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBMZXQgdGhlIEJJT1MgY291bnQgY29udGludWUKLQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdW5zaWduZWQgbG9uZyBMWl90aW1lckxhcCh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTGF0Y2hlcyB0aGUgY3VycmVudCBjb3VudCBhbmQgY29udmVydHMgaXQgdG8gYSBtaWNyb3NlY29uZCB0aW1pbmcgdmFsdWUsCi07IGJ1dCBsZWF2ZXMgdGhlIHRpbWVyIHN0aWxsIHJ1bm5pbmcuIFdlIGRvbnQgY2hlY2sgZm9yIGFuZCBvdmVyZmxvdywKLTsgd2hlcmUgdGhlIHRpbWUgaGFzIGdvbmUgb3ZlciBhbiBob3VyIGluIHRoaXMgcm91dGluZSwgc2luY2Ugd2Ugd2FudCBpdAotOyB0byBleGVjdXRlIGFzIGZhc3QgYXMgcG9zc2libGUuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgTFpfdGltZXJMYXAKLQotICAgICAgICBwdXNoICAgIGVieCAgICAgICAgICAgICAgICAgOyBTYXZlIEVCWCBmb3IgMzIgYml0IGNvZGUKLQotOyBMYXRjaCB0aGUgdGltZXIgY291bnQuCi0KLSAgICAgICAgbW92ICAgICBhbCwwMDAwMDAwMGIgICAgICAgIDsgbGF0Y2ggdGltZXIgMAotICAgICAgICBvdXQgICAgIE1PREVfODI1MyxhbAotICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBTdG9wIHRoZSBCSU9TIGNvdW50Ci0KLTsgUmVhZCB0aGUgQklPUyBjb3VudC4gKFNpbmNlIGludGVycnVwdHMgYXJlIGRpc2FibGVkLCB0aGUgQklPUwotOyBjb3VudCB3b250IGNoYW5nZSkuCi0KLSAgICAgICAgdXNlX2VzCi1pZmRlZiAgIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIGVieCxbX1pUaW1lckJJT1NQdHJdCi1lbHNlCi0gICAgICAgIGxlcyAgICAgYngsW19aVGltZXJCSU9TUHRyXQotZW5kaWYKLSAgICAgICAgbW92ICAgICBlYXgsW19FUyBfYngrVElNRVJfQ09VTlRdCi0gICAgICAgIG1vdiAgICAgW0VuZEJJT1NDb3VudF0sZWF4Ci0gICAgICAgIHVudXNlX2VzCi0KLTsgUmVhZCBvdXQgdGhlIGNvdW50IHdlIGxhdGNoZWQgZWFybGllci4KLQotICAgICAgICBpbiAgICAgIGFsLFRJTUVSXzBfODI1MyAgICAgOyBsZWFzdCBzaWduaWZpY2FudCBieXRlCi0gICAgICAgIERFTEFZCi0gICAgICAgIG1vdiAgICAgYWgsYWwKLSAgICAgICAgaW4gICAgICBhbCxUSU1FUl8wXzgyNTMgICAgIDsgbW9zdCBzaWduaWZpY2FudCBieXRlCi0gICAgICAgIHhjaGcgICAgYWgsYWwKLSAgICAgICAgbmVnICAgICBheCAgICAgICAgICAgICAgICAgIDsgQ29udmVydCBmcm9tIGNvdW50ZG93biByZW1haW5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgIHRvIGVsYXBzZWQgY291bnQKLSAgICAgICAgbW92ICAgICBbRW5kVGltZWRDb3VudF0sYXgKLSAgICAgICAgc3RpICAgICAgICAgICAgICAgICAgICAgICAgIDsgTGV0IHRoZSBCSU9TIGNvdW50IGNvbnRpbnVlCi0KLTsgU2VlIGlmIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCBhbmQgYWRqdXN0IHRoZSBmaW5pc2hpbmcgQklPUwotOyBjb3VudCBieSB0aGUgbnVtYmVyIG9mIHRpY2tzIGluIDI0IGhvdXJzLiBXZSB3b250IGJlIGFibGUgdG8gZGV0ZWN0Ci07IG1vcmUgdGhhbiAyNCBob3VycywgYnV0IGF0IGxlYXN0IHdlIGNhbiB0aW1lIGFjcm9zcyBhIG1pZG5pZ2h0Ci07IGJvdW5kYXJ5Ci0KLSAgICAgICAgbW92ICAgICBlYXgsW0VuZEJJT1NDb3VudF0gICAgICA7IElzIGVuZCA8IHN0YXJ0PwotICAgICAgICBjbXAgICAgIGVheCxbU3RhcnRCSU9TQ291bnRdCi0gICAgICAgIGphZSAgICAgQEBDYWxjQklPU1RpbWUgICAgICAgICAgOyBObywgY2FsY3VsYXRlIHRoZSB0aW1lIHRha2VuCi0KLTsgQWRqdXN0IHRoZSBmaW5pc2hpbmcgdGltZSBieSBhZGRpbmcgdGhlIG51bWJlciBvZiB0aWNrcyBpbiAyNCBob3VycwotOyAoMTU3MzA0MCkuCi0KLSAgICAgICAgYWRkICAgICBbRFdPUkQgRW5kQklPU0NvdW50XSwxODAwQjBoCi0KLTsgQ29udmVydCB0aGUgQklPUyB0aW1lIHRvIG1pY3Jvc2Vjb25kcwotCi1AQENhbGNCSU9TVGltZToKLSAgICAgICAgbW92ICAgICBheCxbV09SRCBFbmRCSU9TQ291bnRdCi0gICAgICAgIHN1YiAgICAgYXgsW1dPUkQgU3RhcnRCSU9TQ291bnRdCi0gICAgICAgIG1vdiAgICAgZHgsNTQ5MjUgICAgICAgICAgICA7IE51bWJlciBvZiBtaWNyb3NlY29uZHMgZWFjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgQklPUyBjb3VudCByZXByZXNlbnRzLgotICAgICAgICBtdWwgICAgIGR4Ci0gICAgICAgIG1vdiAgICAgYngsYXggICAgICAgICAgICAgICA7IHNldCBhc2lkZSBCSU9TIGNvdW50IGluCi0gICAgICAgIG1vdiAgICAgY3gsZHggICAgICAgICAgICAgICA7ICBtaWNyb3NlY29uZHMKLQotOyBDb252ZXJ0IHRpbWVyIGNvdW50IHRvIG1pY3Jvc2Vjb25kcwotCi0gICAgICAgIHB1c2ggICAgX3NpCi0gICAgICAgIG1vdiAgICAgYXgsW0VuZFRpbWVkQ291bnRdCi0gICAgICAgIG1vdiAgICAgc2ksODM4MQotICAgICAgICBtdWwgICAgIHNpCi0gICAgICAgIG1vdiAgICAgc2ksMTAwMDAKLSAgICAgICAgZGl2ICAgICBzaSAgICAgICAgICAgICAgICAgIDsgKiAwLjgzODEgPSAqIDgzODEgLyAxMDAwMAotICAgICAgICBwb3AgICAgIF9zaQotCi07IEFkZCB0aGUgdGltZXIgYW5kIEJJT1MgY291bnRzIHRvZ2V0aGVyIHRvIGdldCBhbiBvdmVyYWxsIHRpbWUgaW4KLTsgbWljcm9zZWNvbmRzLgotCi0gICAgICAgIGFkZCAgICAgYXgsYngKLSAgICAgICAgYWRjICAgICBjeCwwCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc2hsICAgICBlY3gsMTYKLSAgICAgICAgbW92ICAgICBjeCxheAotICAgICAgICBtb3YgICAgIGVheCxlY3ggICAgICAgICAgICAgOyBFQVggOj0gdGltZXIgY291bnQKLWVsc2UKLSAgICAgICAgbW92ICAgICBkeCxjeAotZW5kaWYKLSAgICAgICAgcG9wICAgICBlYnggICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBFQlggZm9yIDMyIGJpdCBjb2RlCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bnNpZ25lZCBsb25nIExaX3RpbWVyQ291bnQodm9pZCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm5zIGFuIHVuc2lnbmVkIGxvbmcgcmVwcmVzZW50aW5nIHRoZSBuZXQgdGltZSBpbiBtaWNyb3NlY29uZHMuCi07Ci07IElmIGFuIGhvdXIgaGFzIHBhc3NlZCB3aGlsZSB0aW1pbmcsIHdlIHJldHVybiAweEZGRkZGRkZGIGFzIHRoZSBjb3VudAotOyAod2hpY2ggaXMgbm90IGEgcG9zc2libGUgY291bnQgaW4gaXRzZWxmKS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBMWl90aW1lckNvdW50Ci0KLSAgICAgICAgcHVzaCAgICBlYnggICAgICAgICAgICAgICAgIDsgU2F2ZSBFQlggZm9yIDMyIGJpdCBjb2RlCi0KLTsgU2VlIGlmIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCBhbmQgYWRqdXN0IHRoZSBmaW5pc2hpbmcgQklPUwotOyBjb3VudCBieSB0aGUgbnVtYmVyIG9mIHRpY2tzIGluIDI0IGhvdXJzLiBXZSB3b250IGJlIGFibGUgdG8gZGV0ZWN0Ci07IG1vcmUgdGhhbiAyNCBob3VycywgYnV0IGF0IGxlYXN0IHdlIGNhbiB0aW1lIGFjcm9zcyBhIG1pZG5pZ2h0Ci07IGJvdW5kYXJ5Ci0KLSAgICAgICAgbW92ICAgICBlYXgsW0VuZEJJT1NDb3VudF0gICAgICA7IElzIGVuZCA8IHN0YXJ0PwotICAgICAgICBjbXAgICAgIGVheCxbU3RhcnRCSU9TQ291bnRdCi0gICAgICAgIGphZSAgICAgQEBDaGVja0ZvckhvdXIgICAgICAgICAgOyBObywgY2hlY2sgZm9yIGhvdXIgcGFzc2luZwotCi07IEFkanVzdCB0aGUgZmluaXNoaW5nIHRpbWUgYnkgYWRkaW5nIHRoZSBudW1iZXIgb2YgdGlja3MgaW4gMjQgaG91cnMKLTsgKDE1NzMwNDApLgotCi0gICAgICAgIGFkZCAgICAgW0RXT1JEIEVuZEJJT1NDb3VudF0sMTgwMEIwaAotCi07IFNlZSBpZiBtb3JlIHRoYW4gYW4gaG91ciBwYXNzZWQgZHVyaW5nIHRpbWluZy4gSWYgc28sIG5vdGlmeSB0aGUgdXNlci4KLQotQEBDaGVja0ZvckhvdXI6Ci0gICAgICAgIG1vdiAgICAgYXgsW1dPUkQgU3RhcnRCSU9TQ291bnQrMl0KLSAgICAgICAgY21wICAgICBheCxbV09SRCBFbmRCSU9TQ291bnQrMl0KLSAgICAgICAganogICAgICBAQENhbGNCSU9TVGltZSAgICAgIDsgSG91ciBjb3VudCBkaWRuJ3QgY2hhbmdlLCBzbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgZXZlcnl0aGluZyBpcyBmaW5lCi0KLSAgICAgICAgaW5jICAgICBheAotICAgICAgICBjbXAgICAgIGF4LFtXT1JEIEVuZEJJT1NDb3VudCsyXQotICAgICAgICBqbnogICAgIEBAVGVzdFRvb0xvbmcgICAgICAgOyBUd28gaG91ciBib3VuZGFyaWVzIHBhc3NlZCwgc28gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICByZXN1bHRzIGFyZSBubyBnb29kCi0gICAgICAgIG1vdiAgICAgYXgsW1dPUkQgRW5kQklPU0NvdW50XQotICAgICAgICBjbXAgICAgIGF4LFtXT1JEIFN0YXJ0QklPU0NvdW50XQotICAgICAgICBqYiAgICAgIEBAQ2FsY0JJT1NUaW1lICAgICAgOyBhIHNpbmdsZSBob3VyIGJvdW5kYXJ5IHBhc3NlZC4gVGhhdCdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IE9LLCBzbyBsb25nIGFzIHRoZSB0b3RhbCB0aW1lIHdhc24ndAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBtb3JlIHRoYW4gYW4gaG91ci4KLQotOyBPdmVyIGFuIGhvdXIgZWxhcHNlZCBwYXNzZWQgZHVyaW5nIHRpbWluZywgd2hpY2ggcmVuZGVycwotOyB0aGUgcmVzdWx0cyBpbnZhbGlkLiBOb3RpZnkgdGhlIHVzZXIuIFRoaXMgbWlzc2VzIHRoZSBjYXNlIHdoZXJlIGEKLTsgbXVsdGlwbGUgb2YgMjQgaG91cnMgaGFzIHBhc3NlZCwgYnV0IHdlJ2xsIHJlbHkgb24gdGhlIHBlcnNwaWNhY2l0eSBvZgotOyB0aGUgdXNlciB0byBkZXRlY3QgdGhhdCBjYXNlIDotKS4KLQotQEBUZXN0VG9vTG9uZzoKLWlmZGVmICAgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZWF4LDBGRkZGRkZGRmgKLWVsc2UKLSAgICAgICAgbW92ICAgICBheCwwRkZGRmgKLSAgICAgICAgbW92ICAgICBkeCwwRkZGRmgKLWVuZGlmCi0gICAgICAgIGptcCAgICAgc2hvcnQgQEBEb25lCi0KLTsgQ29udmVydCB0aGUgQklPUyB0aW1lIHRvIG1pY3Jvc2Vjb25kcwotCi1AQENhbGNCSU9TVGltZToKLSAgICAgICAgbW92ICAgICBheCxbV09SRCBFbmRCSU9TQ291bnRdCi0gICAgICAgIHN1YiAgICAgYXgsW1dPUkQgU3RhcnRCSU9TQ291bnRdCi0gICAgICAgIG1vdiAgICAgZHgsNTQ5MjUgICAgICAgICAgICA7IE51bWJlciBvZiBtaWNyb3NlY29uZHMgZWFjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgQklPUyBjb3VudCByZXByZXNlbnRzLgotICAgICAgICBtdWwgICAgIGR4Ci0gICAgICAgIG1vdiAgICAgYngsYXggICAgICAgICAgICAgICA7IHNldCBhc2lkZSBCSU9TIGNvdW50IGluCi0gICAgICAgIG1vdiAgICAgY3gsZHggICAgICAgICAgICAgICA7ICBtaWNyb3NlY29uZHMKLQotOyBDb252ZXJ0IHRpbWVyIGNvdW50IHRvIG1pY3Jvc2Vjb25kcwotCi0gICAgICAgIHB1c2ggICAgX3NpCi0gICAgICAgIG1vdiAgICAgYXgsW0VuZFRpbWVkQ291bnRdCi0gICAgICAgIG1vdiAgICAgc2ksODM4MQotICAgICAgICBtdWwgICAgIHNpCi0gICAgICAgIG1vdiAgICAgc2ksMTAwMDAKLSAgICAgICAgZGl2ICAgICBzaSAgICAgICAgICAgICAgICAgIDsgKiAwLjgzODEgPSAqIDgzODEgLyAxMDAwMAotICAgICAgICBwb3AgICAgIF9zaQotCi07IEFkZCB0aGUgdGltZXIgYW5kIEJJT1MgY291bnRzIHRvZ2V0aGVyIHRvIGdldCBhbiBvdmVyYWxsIHRpbWUgaW4KLTsgbWljcm9zZWNvbmRzLgotCi0gICAgICAgIGFkZCAgICAgYXgsYngKLSAgICAgICAgYWRjICAgICBjeCwwCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc2hsICAgICBlY3gsMTYKLSAgICAgICAgbW92ICAgICBjeCxheAotICAgICAgICBtb3YgICAgIGVheCxlY3ggICAgICAgICAgICAgOyBFQVggOj0gdGltZXIgY291bnQKLWVsc2UKLSAgICAgICAgbW92ICAgICBkeCxjeAotZW5kaWYKLQotQEBEb25lOiBwb3AgICAgIGVieCAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIEVCWCBmb3IgMzIgYml0IGNvZGUKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWNwcm9jc3RhcnQgICBMWl9kaXNhYmxlCi0gICAgICAgIGNsaQotICAgICAgICByZXQKLWNwcm9jZW5kCi0KLWNwcm9jc3RhcnQgICBMWl9lbmFibGUKLSAgICAgICAgc3RpCi0gICAgICAgIHJldAotY3Byb2NlbmQKLQotZW5kY29kZXNlZyAgX2x6dGltZXIKLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9fcG0uYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19wbS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYjVjZjMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19wbS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw2NTYgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogSUJNIFBDIFJlYWwgbW9kZSBhbmQgMTYvMzIgYml0IHByb3RlY3RlZCBtb2RlCi07KgotOyogRGVzY3JpcHRpb246IExvdyBsZXZlbCBhc3NlbWJseSBzdXBwb3J0IGZvciB0aGUgUE0gbGlicmFyeSBzcGVjaWZpYyB0bwotOyogICAgICAgICAgICAgIE1TRE9TLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgICAgIF9wbWRvcyAgICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1iZWdkYXRhc2VnICBfcG1kb3MKLQotaWZuZGVmICBmbGF0bW9kZWwKLQotc3RydWMgICBybXJlZ3NfcwotYXggICAgICAgICAgZHcgID8KLWF4X2hpZ2ggICAgIGR3ICA/Ci1ieCAgICAgICAgICBkdyAgPwotYnhfaGlnaCAgICAgZHcgID8KLWN4ICAgICAgICAgIGR3ICA/Ci1jeF9oaWdoICAgICBkdyAgPwotZHggICAgICAgICAgZHcgID8KLWR4X2hpZ2ggICAgIGR3ICA/Ci1zaSAgICAgICAgICBkdyAgPwotc2lfaGlnaCAgICAgZHcgID8KLWRpICAgICAgICAgIGR3ICA/Ci1kaV9oaWdoICAgICBkdyAgPwotY2ZsYWcgICAgICAgZHcgID8KLWNmbGFnX2hpZ2ggIGR3ICA/Ci1lbmRzICAgIHJtcmVnc19zCi1STVJFR1MgID0gKHJtcmVnc19zIFBUUiBlczpieCkKLQotc3RydWMgICBybXNyZWdzX3MKLWVzICAgICAgZHcgID8KLWNzICAgICAgZHcgID8KLXNzICAgICAgZHcgID8KLWRzICAgICAgZHcgID8KLWVuZHMgICAgcm1zcmVnc19zCi1STVNSRUdTID0gKHJtc3JlZ3NfcyBQVFIgZXM6YngpCi0KLWVuZGlmICAgOyAhZmxhdG1vZGVsCi0KLWlmZGVmIGZsYXRtb2RlbAotICAgIGNleHRlcm4gX1BNX3NhdmVkRFMsVVNIT1JUCi0gICAgY2V4dGVybiBfUE1fVlhEX29mZixVSU5UCi0gICAgY2V4dGVybiBfUE1fVlhEX3NlbCxVSU5UCi1pZmRlZiAgIERPUzRHVwotICAgIGNleHRlcm4gX1BNX2hhdmVDYXVzZVdheSxVSU5UCi1lbmRpZgotZW5kaWYKLWludGVsX2lkICAgICAgICBkYiAgIkdlbnVpbmVJbnRlbCIgIDsgSW50ZWwgdmVuZG9yIElECi0KLVBNSEVMUF9HRVRQREIgICAgICAgRVFVIDAwMjZoCi1QTUhFTFBfRkxVU0hUTEIgICAgIEVRVSAwMDI3aAotCi1lbmRkYXRhc2VnICBfcG1kb3MKLQotUDU4NgotCi1iZWdjb2Rlc2VnICBfcG1kb3MgICAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi1pZm5kZWYgIGZsYXRtb2RlbAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX2NhbGxSZWFsTW9kZSh1bnNpZ25lZCBzLHVuc2lnbmVkIG8sIFJNUkVHUyAqcmVncywKLTsgICBSTVNSRUdTICpzcmVncykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENhbGxzIGEgcmVhbCBtb2RlIHByb2NlZHVyZSwgbG9hZGluZyB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIHZhbHVlcwotOyBmcm9tIHRoZSBwYXNzZWQgaW4gc3RydWN0dXJlcy4gT25seSB0aGUgRFMgYW5kIEVTIHJlZ2lzdGVyIGFyZSBsb2FkZWQKLTsgZnJvbSB0aGUgU1JFR1Mgc3RydWN0dXJlLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2NhbGxSZWFsTW9kZQotCi0gICAgICAgIEFSRyAgICAgczpXT1JELCBvOldPUkQsIHJlZ3M6RFdPUkQsIHNyZWdzOkRXT1JECi0KLSAgICAgICAgTE9DQUwgICBhZGRyOkRXT1JELCBieFZhbDpXT1JELCBlc1ZhbDpXT1JELCBmbGFnczpXT1JEID0gTG9jYWxTaXplCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBwdXNoICAgIGRzCi0gICAgICAgIHB1c2ggICAgZXMKLQotICAgICAgICBtb3YgICAgIGF4LFtvXSAgICAgICAgICAgICAgOyBCdWlsZCB0aGUgYWRkcmVzcyB0byBjYWxsIGluICdhZGRyJwotICAgICAgICBtb3YgICAgIFtXT1JEIGFkZHJdLGF4Ci0gICAgICAgIG1vdiAgICAgYXgsW3NdCi0gICAgICAgIG1vdiAgICAgW1dPUkQgYWRkcisyXSxheAotCi0gICAgICAgIGxlcyAgICAgYngsW3NyZWdzXQotICAgICAgICBtb3YgICAgIGF4LFtSTVNSRUdTLmRzXQotICAgICAgICBtb3YgICAgIGRzLGF4ICAgICAgICAgICAgICAgOyBEUyA6PSBwYXNzZWQgaW4gdmFsdWUKLSAgICAgICAgbW92ICAgICBheCxbUk1TUkVHUy5lc10KLSAgICAgICAgbW92ICAgICBbZXNWYWxdLGF4Ci0gICAgICAgIGxlcyAgICAgYngsW3JlZ3NdCi0gICAgICAgIG1vdiAgICAgYXgsW1JNUkVHUy5ieF0KLSAgICAgICAgbW92ICAgICBbYnhWYWxdLGF4Ci0gICAgICAgIG1vdiAgICAgYXgsW1JNUkVHUy5heF0gICAgICA7IEFYIDo9IHBhc3NlZCBpbiB2YWx1ZQotICAgICAgICBtb3YgICAgIGN4LFtSTVJFR1MuY3hdICAgICAgOyBDWCA6PSBwYXNzZWQgaW4gdmFsdWUKLSAgICAgICAgbW92ICAgICBkeCxbUk1SRUdTLmR4XSAgICAgIDsgRFggOj0gcGFzc2VkIGluIHZhbHVlCi0gICAgICAgIG1vdiAgICAgc2ksW1JNUkVHUy5zaV0gICAgICA7IFNJIDo9IHBhc3NlZCBpbiB2YWx1ZQotICAgICAgICBtb3YgICAgIGRpLFtSTVJFR1MuZGldICAgICAgOyBESSA6PSBwYXNzZWQgaW4gdmFsdWUKLSAgICAgICAgcHVzaCAgICBicAotICAgICAgICBwdXNoICAgIFtlc1ZhbF0KLSAgICAgICAgcG9wICAgICBlcyAgICAgICAgICAgICAgICAgIDsgRVMgOj0gcGFzc2VkIGluIHZhbHVlCi0gICAgICAgIG1vdiAgICAgYngsW2J4VmFsXSAgICAgICAgICA7IEJYIDo9IHBhc3NlZCBpbiB2YWx1ZQotCi0gICAgICAgIGNhbGwgICAgW2FkZHJdICAgICAgICAgICAgICA7IENhbGwgdGhlIHNwZWNpZmllZCByb3V0aW5lCi0KLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBmbGFncyBmb3IgbGF0ZXIKLSAgICAgICAgcG9wICAgICBbZmxhZ3NdCi0KLSAgICAgICAgcG9wICAgICBicAotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHBvcCAgICAgW2VzVmFsXQotICAgICAgICBwdXNoICAgIGJ4Ci0gICAgICAgIHBvcCAgICAgW2J4VmFsXQotICAgICAgICBsZXMgICAgIGJ4LFtzcmVnc10KLSAgICAgICAgcHVzaCAgICBkcwotICAgICAgICBwb3AgICAgIFtSTVNSRUdTLmRzXSAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgW2VzVmFsXQotICAgICAgICBwb3AgICAgIFtSTVNSRUdTLmVzXSAgICAgICAgOyBTYXZlIHZhbHVlIG9mIEVTCi0gICAgICAgIGxlcyAgICAgYngsW3JlZ3NdCi0gICAgICAgIG1vdiAgICAgW1JNUkVHUy5heF0sYXggICAgICA7IFNhdmUgdmFsdWUgb2YgQVgKLSAgICAgICAgbW92ICAgICBbUk1SRUdTLmN4XSxjeCAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBDWAotICAgICAgICBtb3YgICAgIFtSTVJFR1MuZHhdLGR4ICAgICAgOyBTYXZlIHZhbHVlIG9mIERYCi0gICAgICAgIG1vdiAgICAgW1JNUkVHUy5zaV0sc2kgICAgICA7IFNhdmUgdmFsdWUgb2YgU0kKLSAgICAgICAgbW92ICAgICBbUk1SRUdTLmRpXSxkaSAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBESQotICAgICAgICBtb3YgICAgIGF4LFtmbGFnc10gICAgICAgICAgOyBSZXR1cm4gZmxhZ3MKLSAgICAgICAgYW5kICAgICBheCwxaCAgICAgICAgICAgICAgIDsgSXNvbGF0ZSBjYXJyeSBmbGFnCi0gICAgICAgIG1vdiAgICAgW1JNUkVHUy5jZmxhZ10sYXggICA7IFNhdmUgY2FycnkgZmxhZyBzdGF0dXMKLSAgICAgICAgbW92ICAgICBheCxbYnhWYWxdCi0gICAgICAgIG1vdiAgICAgW1JNUkVHUy5ieF0sYXggICAgICA7IFNhdmUgdmFsdWUgb2YgQlgKLQotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZWdyZWFkKFBNU1JFR1MgKnNyZWdzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiBhbGwgc2VnbWVudCByZWdpc3RlcnMKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ZGxsMTYgUE1fc2VncmVhZAotCi0gICAgICAgIEFSRyAgICAgc3JlZ3M6RFBUUgotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIGF4LGVzCi0gICAgICAgIF9sZXMgICAgX3NpLFtzcmVnc10KLSAgICAgICAgbW92ICAgICBbX0VTIF9zaV0sYXgKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSsyXSxjcwotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzRdLHNzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krNl0sZHMKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSs4XSxmcwotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzEwXSxncwotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTsgQ3JlYXRlIGEgdGFibGUgb2YgdGhlIDI1NiBkaWZmZXJlbnQgaW50ZXJydXB0IGNhbGxzIHRoYXQgd2UgY2FuIGp1bXAKLTsgaW50bwotCi1pZmRlZiAgIFVTRV9OQVNNCi0KLSVhc3NpZ24gaW50bm8gMAotCi1pbnRUYWJsZToKLSVyZXAgICAgMjU2Ci0gICAgICAgIGRiICAgICAgMENEaAotICAgICAgICBkYiAgICAgIGludG5vCi0lYXNzaWduIGludG5vICAgaW50bm8gKyAxCi0gICAgICAgIHJldAotICAgICAgICBub3AKLSVlbmRyZXAKLQotZWxzZQotCi1pbnRubyA9IDAKLQotaW50VGFibGU6Ci0gICAgICAgIFJFUFQgICAgMjU2Ci0gICAgICAgIGRiICAgICAgMENEaAotICAgICAgICBkYiAgICAgIGludG5vCi1pbnRubyA9IGludG5vICsgMQotICAgICAgICByZXQKLSAgICAgICAgbm9wCi0gICAgICAgIEVORE0KLQotZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgX1BNX2dlbkludCAgICAtIEdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBpbnRlcnJ1cHQKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY25lYXIgICBfUE1fZ2VuSW50Ci0KLSAgICAgICAgcHVzaCAgICBfYXggICAgICAgICAgICAgICAgICAgICA7IFNhdmUgX2F4Ci0gICAgICAgIHB1c2ggICAgX2J4ICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIF9ieAotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZWJ4LFtVSU5UIGVzcCsxMl0gICAgICAgOyBFQlggOj0gaW50ZXJydXB0IG51bWJlcgotZWxzZQotICAgICAgICBtb3YgICAgIGJ4LHNwICAgICAgICAgICAgICAgICAgIDsgTWFrZSBzdXJlIEVTUCBpcyB6ZXJvZWQKLSAgICAgICAgbW92ICAgICBieCxbVUlOVCBzczpieCs2XSAgICAgICA7IEJYIDo9IGludGVycnVwdCBudW1iZXIKLWVuZGlmCi0gICAgICAgIG1vdiAgICAgX2F4LG9mZnNldCBpbnRUYWJsZSAgICAgOyBQb2ludCB0byBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiB0YWJsZQotICAgICAgICBzaGwgICAgIF9ieCwyICAgICAgICAgICAgICAgICAgIDsgX0JYIDo9IGluZGV4IGludG8gdGFibGUKLSAgICAgICAgYWRkICAgICBfYXgsX2J4ICAgICAgICAgICAgICAgICA7IF9BWCA6PSBwb2ludGVyIHRvIGludGVycnVwdCBjb2RlCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgeGNoZyAgICBlYXgsW2VzcCs0XSAgICAgICAgICAgICA7IFJlc3RvcmUgZWF4LCBhbmQgc2V0IGZvciBpbnQKLWVsc2UKLSAgICAgICAgbW92ICAgICBieCxzcAotICAgICAgICB4Y2hnICAgIGF4LFtzczpieCsyXSAgICAgICAgICAgIDsgUmVzdG9yZSBheCwgYW5kIHNldCBmb3IgaW50Ci1lbmRpZgotICAgICAgICBwb3AgICAgIF9ieCAgICAgICAgICAgICAgICAgICAgIDsgcmVzdG9yZSBfYngKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBQTV9pbnQzODZ4KGludCBpbnRubywgUE1SRUdTICppbiwgUE1SRUdTICpvdXQsUE1TUkVHUyAqc3JlZ3MpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJc3N1ZXMgYSBzb2Z0d2FyZSBpbnRlcnJ1cHQgaW4gcHJvdGVjdGVkIG1vZGUuIFRoaXMgcm91dGluZSBoYXMgYmVlbgotOyB3cml0dGVuIHRvIGFsbG93IHVzZXIgcHJvZ3JhbXMgdG8gbG9hZCBDUyBhbmQgRFMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzCi07IG90aGVyIHRoYW4gdGhlIGRlZmF1bHQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydGRsbDE2IFBNX2ludDM4NngKLQotICAgICAgICBBUkcgICAgIGludG5vOlVJTlQsIGlucHRyOkRQVFIsIG91dHB0cjpEUFRSLCBzcmVnczpEUFRSCi0KLSAgICAgICAgTE9DQUwgICBmbGFnczpVSU5ULCBzdl9kczpVSU5ULCBzdl9lc2k6VUxPTkcgPSBMb2NhbFNpemUKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2ggICAgZHMKLSAgICAgICAgcHVzaCAgICBlcyAgICAgICAgICAgICAgICAgIDsgU2F2ZSBzZWdtZW50IHJlZ2lzdGVycwotICAgICAgICBwdXNoICAgIGZzCi0gICAgICAgIHB1c2ggICAgZ3MKLQotICAgICAgICBfbGRzICAgIF9zaSxbc3JlZ3NdICAgICAgICAgOyBEUzpfU0kgLT4gTG9hZCBzZWdtZW50IHJlZ2lzdGVycwotICAgICAgICBtb3YgICAgIGVzLFtfc2ldCi0gICAgICAgIG1vdiAgICAgYngsW19zaSs2XQotICAgICAgICBtb3YgICAgIFtzdl9kc10sX2J4ICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIHVzZXIgRFMgb24gc3RhY2sKLSAgICAgICAgbW92ICAgICBmcyxbX3NpKzhdCi0gICAgICAgIG1vdiAgICAgZ3MsW19zaSsxMF0KLQotICAgICAgICBfbGRzICAgIF9zaSxbaW5wdHJdICAgICAgICAgOyBMb2FkIENQVSByZWdpc3RlcnMKLSAgICAgICAgbW92ICAgICBlYXgsW19zaV0KLSAgICAgICAgbW92ICAgICBlYngsW19zaSs0XQotICAgICAgICBtb3YgICAgIGVjeCxbX3NpKzhdCi0gICAgICAgIG1vdiAgICAgZWR4LFtfc2krMTJdCi0gICAgICAgIG1vdiAgICAgZWRpLFtfc2krMjBdCi0gICAgICAgIG1vdiAgICAgZXNpLFtfc2krMTZdCi0KLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIF9icCAgICAgICAgICAgICAgICAgOyBTb21lIGludGVycnVwdHMgdHJhc2ggdGhpcyEKLSAgICAgICAgY2xjICAgICAgICAgICAgICAgICAgICAgICAgIDsgR2VuZXJhdGUgdGhlIGludGVycnVwdAotICAgICAgICBwdXNoICAgIFtVSU5UIGludG5vXQotICAgICAgICBtb3YgICAgIGRzLFtXT1JEIHN2X2RzXSAgICAgOyBTZXQgdmFsdWUgb2YgdXNlcidzIERTIHNlbGVjdG9yCi0gICAgICAgIGNhbGwgICAgX1BNX2dlbkludAotICAgICAgICBwb3AgICAgIF9icCAgICAgICAgICAgICAgICAgOyBQb3AgaW50bm8gZnJvbSBzdGFjayAoZmxhZ3MgdW5jaGFuZ2VkKQotICAgICAgICBwb3AgICAgIF9icCAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHZhbHVlIG9mIHN0YWNrIGZyYW1lIHBvaW50ZXIKLSAgICAgICAgcG9wICAgICBkcyAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSB2YWx1ZSBvZiBEUwotCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgICAgICA7IFNhdmUgZmxhZ3MgZm9yIGxhdGVyCi0gICAgICAgIHBvcCAgICAgW1VJTlQgZmxhZ3NdCi0gICAgICAgIHB1c2ggICAgZXNpICAgICAgICAgICAgICAgICA7IFNhdmUgRVNJIGZvciBsYXRlcgotICAgICAgICBwb3AgICAgIFtEV09SRCBzdl9lc2ldCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgICAgICA7IFNhdmUgRFMgZm9yIGxhdGVyCi0gICAgICAgIHBvcCAgICAgW1VJTlQgc3ZfZHNdCi0KLSAgICAgICAgX2xkcyAgICBfc2ksW291dHB0cl0gICAgICAgIDsgU2F2ZSBDUFUgcmVnaXN0ZXJzCi0gICAgICAgIG1vdiAgICAgW19zaV0sZWF4Ci0gICAgICAgIG1vdiAgICAgW19zaSs0XSxlYngKLSAgICAgICAgbW92ICAgICBbX3NpKzhdLGVjeAotICAgICAgICBtb3YgICAgIFtfc2krMTJdLGVkeAotICAgICAgICBwdXNoICAgIFtEV09SRCBzdl9lc2ldCi0gICAgICAgIHBvcCAgICAgW0RXT1JEIF9zaSsxNl0KLSAgICAgICAgbW92ICAgICBbX3NpKzIwXSxlZGkKLQotICAgICAgICBtb3YgICAgIF9ieCxbZmxhZ3NdICAgICAgICAgOyBSZXR1cm4gZmxhZ3MKLSAgICAgICAgYW5kICAgICBlYngsMWggICAgICAgICAgICAgIDsgSXNvbGF0ZSBjYXJyeSBmbGFnCi0gICAgICAgIG1vdiAgICAgW19zaSsyNF0sZWJ4ICAgICAgICA7IFNhdmUgY2FycnkgZmxhZyBzdGF0dXMKLQotICAgICAgICBfbGRzICAgIF9zaSxbc3JlZ3NdICAgICAgICAgOyBTYXZlIHNlZ21lbnQgcmVnaXN0ZXJzCi0gICAgICAgIG1vdiAgICAgW19zaV0sZXMKLSAgICAgICAgbW92ICAgICBfYngsW3N2X2RzXQotICAgICAgICBtb3YgICAgIFtfc2krNl0sYnggICAgICAgICAgOyBHZXQgcmV0dXJuZWQgRFMgZnJvbSBzdGFjawotICAgICAgICBtb3YgICAgIFtfc2krOF0sZnMKLSAgICAgICAgbW92ICAgICBbX3NpKzEwXSxncwotCi0gICAgICAgIHBvcCAgICAgZ3MgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgc2VnbWVudCByZWdpc3RlcnMKLSAgICAgICAgcG9wICAgICBmcwotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotaWZuZGVmIGZsYXRtb2RlbAotX1BNX3NhdmVkRFMgICAgIGR3ICBfREFUQSAgICAgICAgICAgOyBTYXZlZCB2YWx1ZSBvZiBEUwotZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zYXZlRFModm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFNhdmUgdGhlIHZhbHVlIG9mIERTIGludG8gYSBzZWN0aW9uIG9mIHRoZSBjb2RlIHNlZ21lbnQsIHNvIHRoYXQgd2UgY2FuCi07IHF1aWNrbHkgbG9hZCB0aGlzIHZhbHVlIGF0IGEgbGF0ZXIgZGF0ZSBpbiB0aGUgUE1fbG9hZERTKCkgcm91dGluZSBmcm9tCi07IGluc2lkZSBpbnRlcnJ1cHQgaGFuZGxlcnMgZXRjLiBUaGUgbWV0aG9kIHRvIGRvIHRoaXMgaXMgZGlmZmVyZW50Ci07IGRlcGVuZGluZyBvbiB0aGUgRE9TIGV4dGVuZGVyIGJlaW5nIHVzZWQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydGRsbDE2IFBNX3NhdmVEUwotCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICBbX1BNX3NhdmVkRFNdLGRzICAgIDsgU3RvcmUgYXdheSBpbiBkYXRhIHNlZ21lbnQKLWVuZGlmCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX2xvYWREUyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUm91dGluZSB0byBsb2FkIHRoZSBEUyByZWdpc3RlciB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgY3VycmVudAotOyBET1MgZXh0ZW5kZXIuIE9ubHkgdGhlIERTIHJlZ2lzdGVyIGlzIGxvYWRlZCwgbm90IHRoZSBFUyByZWdpc3Rlciwgc28KLTsgaWYgeW91IHdpc2ggdG8gY2FsbCBDIGNvZGUsIHlvdSB3aWxsIG5lZWQgdG8gYWxzbyBsb2FkIHRoZSBFUyByZWdpc3RlcgotOyBpbiAzMiBiaXQgcHJvdGVjdGVkIG1vZGUuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydGRsbDE2IFBNX2xvYWREUwotCi0gICAgICAgIG1vdiAgICAgZHMsW2NzOl9QTV9zYXZlZERTXSA7IFdlIGNhbiBhY2Nlc3MgdGhlIHByb3BlciBEUyB0aHJvdWdoIENTCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1pZmRlZiBmbGF0bW9kZWwKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaWJvb2wgRFBNSV9hbGxvY2F0ZUNhbGxiYWNrKHZvaWQgKCpwbWNvZGUpKCksIHZvaWQgKnJtcmVncywgbG9uZyAqUk1DQikKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfRFBNSV9hbGxvY2F0ZUNhbGxiYWNrCi0KLSAgICAgICAgQVJHICAgICBwbWNvZGU6Q1BUUiwgcm1yZWdzOkRQVFIsIFJNQ0I6RFBUUgotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaCAgICBkcwotICAgICAgICBwdXNoICAgIGVzCi0KLSAgICAgICAgcHVzaCAgICBjcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIG1vdiAgICAgZXNpLFtwbWNvZGVdICAgIDsgRFM6RVNJIC0+IHByb3RlY3RlZCBtb2RlIGNvZGUgdG8gY2FsbAotICAgICAgICBtb3YgICAgIGVkaSxbcm1yZWdzXSAgICA7IEVTOkVESSAtPiByZWFsIG1vZGUgcmVnaXN0ZXIgYnVmZmVyCi0gICAgICAgIG1vdiAgICAgYXgsMzAzaCAgICAgICAgIDsgQVggOj0gYWxsb2NhdGUgcmVhbG1vZGUgY2FsbGJhY2sgZnVuY3Rpb24KLSAgICAgICAgaW50ICAgICAzMWgKLSAgICAgICAgbW92ICAgICBlYXgsMCAgICAgICAgICAgOyBSZXR1cm4gZmFpbHVyZSEKLSAgICAgICAgamMgICAgICBAQEZhaWwKLQotICAgICAgICBtb3YgICAgIGVheCxbUk1DQl0KLSAgICAgICAgc2hsICAgICBlY3gsMTYKLSAgICAgICAgbW92ICAgICBjeCxkeAotICAgICAgICBtb3YgICAgIFtlczplYXhdLGVjeCAgICA7IFJldHVybiByZWFsIG1vZGUgYWRkcmVzcwotICAgICAgICBtb3YgICAgIGVheCwxICAgICAgICAgICA7IFJldHVybiBzdWNjZXNzIQotCi1AQEZhaWw6IHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIERQTUlfZnJlZUNhbGxiYWNrKGxvbmcgUk1DQikKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfRFBNSV9mcmVlQ2FsbGJhY2sKLQotICAgICAgICBBUkcgICAgIFJNQ0I6VUxPTkcKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgbW92ICAgICBjeCxbV09SRCBSTUNCKzJdCi0gICAgICAgIG1vdiAgICAgZHgsW1dPUkQgUk1DQl0gIDsgQ1g6RFggOj0gcmVhbCBtb2RlIGNhbGxiYWNrCi0gICAgICAgIG1vdiAgICAgYXgsMzA0aAotICAgICAgICBpbnQgICAgIDMxaAotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGlmCi0KLTsgTWFjcm8gdG8gZGVsYXkgYnJpZWZseSB0byBlbnN1cmUgdGhhdCBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCBiZXR3ZWVuCi07IHN1Y2Nlc3NpdmUgSS9PIGFjY2Vzc2VzIHNvIHRoYXQgdGhlIGRldmljZSBiZWluZyBhY2Nlc3NlZCBjYW4gcmVzcG9uZAotOyB0byBib3RoIGFjY2Vzc2VzIGV2ZW4gb24gYSB2ZXJ5IGZhc3QgUEMuCi0KLWlmZGVmICAgVVNFX05BU00KLSVtYWNybyAgREVMQVkgMAotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotJWVuZG1hY3JvCi0lbWFjcm8gIElPREVMQVlOIDEKLSVyZXAgICAgJTEKLSAgICAgICAgREVMQVkKLSVlbmRyZXAKLSVlbmRtYWNybwotZWxzZQotbWFjcm8gICBERUxBWQotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotZW5kbQotbWFjcm8gICBJT0RFTEFZTiAgICBOCi0gICAgcmVwdCAgICBOCi0gICAgICAgIERFTEFZCi0gICAgZW5kbQotZW5kbQotZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWNoYXIgX1BNX3JlYWRDTU9TKGludCBpbmRleCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgQ01PUyByZWdpc3Rlci4gV2UgZG8gdGhpcyB3aXRoIGJvdGgKLTsgbm9ybWFsIGludGVycnVwdHMgYW5kIE5NSSBkaXNhYmxlZC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fcmVhZENNT1MKLQotICAgICAgICBBUkcgICAgIGluZGV4OlVJTlQKLQotICAgICAgICBwdXNoICAgIF9icAotICAgICAgICBtb3YgICAgIF9icCxfc3AKLSAgICAgICAgcHVzaGZkCi0gICAgICAgIG1vdiAgICAgYWwsW0JZVEUgaW5kZXhdCi0gICAgICAgIG9yICAgICAgYWwsODBoICAgICAgICAgICAgICA7IEFkZCBkaXNhYmxlIE5NSSBmbGFnCi0gICAgICAgIGNsaQotICAgICAgICBvdXQgICAgIDcwaCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIGluICAgICAgYWwsNzFoCi0gICAgICAgIG1vdiAgICAgYWgsYWwKLSAgICAgICAgeG9yICAgICBhbCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIG91dCAgICAgNzBoLGFsICAgICAgICAgICAgICA7IFJlLWVuYWJsZSBOTUkKLSAgICAgICAgc3RpCi0gICAgICAgIG1vdiAgICAgYWwsYWggICAgICAgICAgICAgICA7IFJldHVybiB2YWx1ZSBpbiBBTAotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fd3JpdGVDTU9TKGludCBpbmRleCx1Y2hhciB2YWx1ZSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgQ01PUyByZWdpc3Rlci4gV2UgZG8gdGhpcyB3aXRoIGJvdGgKLTsgbm9ybWFsIGludGVycnVwdHMgYW5kIE5NSSBkaXNhYmxlZC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fd3JpdGVDTU9TCi0KLSAgICAgICAgQVJHICAgICBpbmRleDpVSU5ULCB2YWx1ZTpVQ0hBUgotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBwdXNoZmQKLSAgICAgICAgbW92ICAgICBhbCxbQllURSBpbmRleF0KLSAgICAgICAgb3IgICAgICBhbCw4MGggICAgICAgICAgICAgIDsgQWRkIGRpc2FibGUgTk1JIGZsYWcKLSAgICAgICAgY2xpCi0gICAgICAgIG91dCAgICAgNzBoLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgbW92ICAgICBhbCxbdmFsdWVdCi0gICAgICAgIG91dCAgICAgNzFoLGFsCi0gICAgICAgIHhvciAgICAgYWwsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZS1lbmFibGUgTk1JCi0gICAgICAgIHN0aQotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotaWZkZWYgICBmbGF0bW9kZWwKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IF9QTV9wYWdpbmdFbmFibGVkKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm5zIDEgaWYgcGFnaW5nIGlzIGVuYWJsZWQsIDAgaWYgbm90IG9yIC0xIGlmIG5vdCBhdCByaW5nIDAKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fcGFnaW5nRW5hYmxlZAotCi0gICAgICAgIG1vdiAgICAgZWF4LC0xCi1pZmRlZiAgIERPUzRHVwotICAgICAgICBtb3YgICAgIGN4LGNzCi0gICAgICAgIGFuZCAgICAgZWN4LDMKLSAgICAgICAganogICAgICBAQFJpbmcwCi0gICAgICAgIGNtcCAgICAgW1VJTlQgX1BNX2hhdmVDYXVzZVdheV0sMAotICAgICAgICBqbnogICAgIEBAUmluZzAKLSAgICAgICAgam1wICAgICBAQEV4aXQKLQotQEBSaW5nMDoKLSAgICAgICAgbW92ICAgICBlYXgsY3IwICAgICAgICAgICAgICAgICA7IExvYWQgQ1IwCi0gICAgICAgIHNociAgICAgZWF4LDMxICAgICAgICAgICAgICAgICAgOyBJc29sYXRlIHBhZ2luZyBlbmFibGVkIGJpdAotZW5kaWYKLUBARXhpdDogcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IF9QTV9nZXRQREIgLSBSZXR1cm4gdGhlIFBhZ2UgVGFibGUgRGlyZWN0b3J5IEJhc2UgYWRkcmVzcwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9nZXRQREIKLQotaWZkZWYgICBET1M0R1cKLSAgICAgICAgbW92ICAgICBheCxjcwotICAgICAgICBhbmQgICAgIGVheCwzCi0gICAgICAgIGp6ICAgICAgQEBSaW5nMAotICAgICAgICBjbXAgICAgIFtVSU5UIF9QTV9oYXZlQ2F1c2VXYXldLDAKLSAgICAgICAgam56ICAgICBAQFJpbmcwCi1lbmRpZgotCi07IENhbGwgVnhEIGlmIHJ1bm5pbmcgYXQgcmluZyAzIGluIGEgRE9TIGJveAotCi0gICAgICAgIGNtcCAgICAgW1dPUkQgX1BNX1ZYRF9zZWxdLDAKLSAgICAgICAganogICAgICBAQEZhaWwKLSAgICAgICAgbW92ICAgICBlYXgsUE1IRUxQX0dFVFBEQgotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsICAgIGZhciBkd29yZCBbX1BNX1ZYRF9vZmZdCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW0ZDUFRSIF9QTV9WWERfb2ZmXQotZW5kaWYKLSAgICAgICAgcmV0Ci0KLUBAUmluZzA6Ci1pZmRlZiAgIERPUzRHVwotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgYW5kICAgICBlYXgsMEZGRkZGMDAwaAotICAgICAgICByZXQKLWVuZGlmCi1AQEZhaWw6IHhvciAgICAgZWF4LGVheAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fZmx1c2hUTEIgLSBGbHVzaCB0aGUgVHJhbnNsYXRpb24gTG9va2FzaWRlIGJ1ZmZlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2ZsdXNoVExCCi0KLSAgICAgICAgbW92ICAgICBheCxjcwotICAgICAgICBhbmQgICAgIGVheCwzCi0gICAgICAgIGp6ICAgICAgQEBSaW5nMAotaWZkZWYgICBET1M0R1cKLSAgICAgICAgY21wICAgICBbVUlOVCBfUE1faGF2ZUNhdXNlV2F5XSwwCi0gICAgICAgIGpueiAgICAgQEBSaW5nMAotZW5kaWYKLQotOyBDYWxsIFZ4RCBpZiBydW5uaW5nIGF0IHJpbmcgMyBpbiBhIERPUyBib3gKLQotICAgICAgICBjbXAgICAgIFtXT1JEIF9QTV9WWERfc2VsXSwwCi0gICAgICAgIGp6ICAgICAgQEBGYWlsCi0gICAgICAgIG1vdiAgICAgZWF4LFBNSEVMUF9GTFVTSFRMQgotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsICAgIGZhciBkd29yZCBbX1BNX1ZYRF9vZmZdCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW0ZDUFRSIF9QTV9WWERfb2ZmXQotZW5kaWYKLSAgICAgICAgcmV0Ci0KLUBAUmluZzA6Ci1pZmRlZiAgIERPUzRHVwotICAgICAgICB3YmludmQgICAgICAgICAgICAgICAgICA7IEZsdXNoIHRoZSBDUFUgY2FjaGUKLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgIDsgRmx1c2ggdGhlIFRMQgotZW5kaWYKLUBARmFpbDogcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGlmCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX1BNX1Z4RENhbGwoVlhEX3JlZ3MgZmFyICpyLHVpbnQgb2ZmLHVpbnQgc2VsKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fVnhEQ2FsbAotCi0gICAgICAgIEFSRyAgICAgcjpEUFRSLCBvZmY6VUlOVCwgc2VsOlVJTlQKLQotICAgICAgICBlbnRlcl9jCi0KLTsgTG9hZCBhbGwgcmVnaXN0ZXJzIGZyb20gdGhlIHJlZ2lzdGVycyBzdHJ1Y3R1cmUKLQotICAgICAgICBtb3YgICAgIGVieCxbcl0KLSAgICAgICAgbW92ICAgICBlYXgsW2VieCswXQotICAgICAgICBtb3YgICAgIGVjeCxbZWJ4KzhdCi0gICAgICAgIG1vdiAgICAgZWR4LFtlYngrMTJdCi0gICAgICAgIG1vdiAgICAgZXNpLFtlYngrMTZdCi0gICAgICAgIG1vdiAgICAgZWRpLFtlYngrMjBdCi0gICAgICAgIG1vdiAgICAgZWJ4LFtlYngrNF0gICAgICAgICA7IFRyYXNoZXMgQlggc3RydWN0dXJlIHBvaW50ZXIhCi0KLTsgQ2FsbCB0aGUgVnhEIGVudHJ5IHBvaW50IChvbiBzdGFjaykKLQotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbb2ZmXQotZWxzZQotICAgICAgICBjYWxsICAgIFtGQ1BUUiBvZmZdCi1lbmRpZgotCi07IFNhdmUgYWxsIHJlZ2lzdGVycyBiYWNrIGluIHRoZSBzdHJ1Y3R1cmUKLQotICAgICAgICBwdXNoICAgIGVieCAgICAgICAgICAgICAgICAgOyBQdXNoIEVCWCBvbnRvIHN0YWNrIGZvciBsYXRlcgotICAgICAgICBtb3YgICAgIGVieCxbcl0KLSAgICAgICAgbW92ICAgICBbZWJ4KzBdLGVheAotICAgICAgICBtb3YgICAgIFtlYngrOF0sZWN4Ci0gICAgICAgIG1vdiAgICAgW2VieCsxMl0sZWR4Ci0gICAgICAgIG1vdiAgICAgW2VieCsxNl0sZXNpCi0gICAgICAgIG1vdiAgICAgW2VieCsyMF0sZWRpCi0gICAgICAgIHBvcCAgICAgW0RXT1JEIGVieCs0XSAgICAgICA7IFNhdmUgdmFsdWUgb2YgRUJYIGZyb20gc3RhY2sKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfcG1kb3MKLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9fcG1kb3MuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19wbWRvcy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNzQxZjMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19wbWRvcy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMTA1ICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgVEFTTSA0LjAgb3IgTkFTTQotOyogRW52aXJvbm1lbnQ6IElCTSBQQyBSZWFsIG1vZGUgYW5kIDE2LzMyIGJpdCBwcm90ZWN0ZWQgbW9kZQotOyoKLTsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgYXNzZW1ibHkgc3VwcG9ydCBmb3IgdGhlIFBNIGxpYnJhcnkgc3BlY2lmaWMgdG8KLTsqICAgICAgICAgICAgICBNU0RPUyBpbnRlcnJ1cHQgaGFuZGxpbmcuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1oZWFkZXIgICAgICBfcG1kb3MgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi07IERlZmluZSB0aGUgc2l6ZSBvZiBvdXIgbG9jYWwgc3RhY2tzLiBGb3IgcmVhbCBtb2RlIGNvZGUgdGhleSBjYW50IGJlCi07IHRoYXQgYmlnLCBidXQgZm9yIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZSBjb2RlIHdlIGNhbiBtYWtlIHRoZW0gbmljZSBhbmQKLTsgbGFyZ2Ugc28gdGhhdCBjb21wbGV4IEMgZnVuY3Rpb25zIGNhbiBiZSB1c2VkLgotCi1pZmRlZiBmbGF0bW9kZWwKLU1PVVNFX1NUQUNLIEVRVSA0MDk2Ci1USU1FUl9TVEFDSyBFUVUgNDA5NgotS0VZX1NUQUNLICAgRVFVIDEwMjQKLUlOVDEwX1NUQUNLIEVRVSAxMDI0Ci1JUlFfU1RBQ0sgICBFUVUgMTAyNAotZWxzZQotTU9VU0VfU1RBQ0sgRVFVIDEwMjQKLVRJTUVSX1NUQUNLIEVRVSA1MTIKLUtFWV9TVEFDSyAgIEVRVSAyNTYKLUlOVDEwX1NUQUNLIEVRVSAyNTYKLUlSUV9TVEFDSyAgIEVRVSAyNTYKLWVuZGlmCi0KLWlmZGVmICAgVVNFX05BU00KLQotOyBNYWNybyB0byBsb2FkIERTIGFuZCBFUyByZWdpc3RlcnMgd2l0aCBjb3JyZWN0IHZhbHVlLgotCi0laW1hY3JvICAgTE9BRF9EUyAwCi0laWZkZWYgIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIGRzLFtjczpfUE1fc2F2ZWREU10KLSAgICAgICAgbW92ICAgICBlcyxbY3M6X1BNX3NhdmVkRFNdCi0lZWxzZQotICAgICAgICBwdXNoICAgIGF4Ci0gICAgICAgIG1vdiAgICAgYXgsX0RBVEEKLSAgICAgICAgbW92ICAgICBkcyxheAotICAgICAgICBwb3AgICAgIGF4Ci0lZW5kaWYKLSVlbmRtYWNybwotCi07IE5vdGUgdGhhdCBpbnRlcnJ1cHRzIHdlIGRpc2FibGUgaW50ZXJydXB0cyBkdXJpbmcgdGhlIGZvbGxvd2luZyBzdGFjawotOyAlaW1hY3JvIGZvciBjb3JyZWN0IG9wZXJhdGlvbiwgYnV0IHdlIGRvIG5vdCBlbmFibGUgdGhlbSBhZ2Fpbi4gTm9ybWFsbHkKLTsgdGhlc2UgJWltYWNyb3MgYXJlIHVzZWQgd2l0aGluIGludGVycnVwdCBoYW5kbGVycyBzbyBpbnRlcnJ1cHRzIHNob3VsZAotOyBhbHJlYWR5IGJlIG9mZi4gV2UgdHVybiB0aGVtIGJhY2sgb24gZXhwbGljaXRseSBsYXRlciBpZiB0aGUgdXNlciBjb2RlCi07IG5lZWRzIHRoZW0gdG8gYmUgYmFjayBvbi4KLQotOyBNYWNybyB0byBzd2l0Y2ggdG8gYSBuZXcgbG9jYWwgc3RhY2suCi0KLSVpbWFjcm8gTkVXU1RLICAxCi0gICAgICAgIGNsaQotICAgICAgICBtb3YgICAgIFtzZWdfJTFdLHNzCi0gICAgICAgIG1vdiAgICAgW3B0cl8lMV0sX3NwCi0gICAgICAgIG1vdiAgICAgW1RlbXBTZWddLGRzCi0gICAgICAgIG1vdiAgICAgc3MsW1RlbXBTZWddCi0gICAgICAgIG1vdiAgICAgX3NwLG9mZnNldCAlMQotJWVuZG1hY3JvCi0KLTsgJWltYWNybyB0byBzd2l0Y2ggYmFjayB0byB0aGUgb2xkIHN0YWNrLgotCi0laW1hY3JvICAgUkVTVFNUSyAgIDEKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgc3MsW3NlZ18lMV0KLSAgICAgICAgbW92ICAgICBfc3AsW3B0cl8lMV0KLSVlbmRtYWNybwotCi07ICVpbWFjcm8gdG8gc3dhcCB0aGUgY3VycmVudCBzdGFjayB3aXRoIHRoZSBvbmUgc2F2ZWQgYXdheS4KLQotJWltYWNybyBTV0FQU1RLIDEKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgYXgsc3MKLSAgICAgICAgeGNoZyAgICBheCxbc2VnXyUxXQotICAgICAgICBtb3YgICAgIHNzLGF4Ci0gICAgICAgIHhjaGcgICAgX3NwLFtwdHJfJTFdCi0lZW5kbWFjcm8KLQotZWxzZQotCi07IE1hY3JvIHRvIGxvYWQgRFMgYW5kIEVTIHJlZ2lzdGVycyB3aXRoIGNvcnJlY3QgdmFsdWUuCi0KLU1BQ1JPICAgTE9BRF9EUwotaWZkZWYgICBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICBkcyxbY3M6X1BNX3NhdmVkRFNdCi0gICAgICAgIG1vdiAgICAgZXMsW2NzOl9QTV9zYXZlZERTXQotZWxzZQotICAgICAgICBwdXNoICAgIGF4Ci0gICAgICAgIG1vdiAgICAgYXgsX0RBVEEKLSAgICAgICAgbW92ICAgICBkcyxheAotICAgICAgICBwb3AgICAgIGF4Ci1lbmRpZgotRU5ETQotCi07IE5vdGUgdGhhdCBpbnRlcnJ1cHRzIHdlIGRpc2FibGUgaW50ZXJydXB0cyBkdXJpbmcgdGhlIGZvbGxvd2luZyBzdGFjawotOyBtYWNybyBmb3IgY29ycmVjdCBvcGVyYXRpb24sIGJ1dCB3ZSBkbyBub3QgZW5hYmxlIHRoZW0gYWdhaW4uIE5vcm1hbGx5Ci07IHRoZXNlIG1hY3JvcyBhcmUgdXNlZCB3aXRoaW4gaW50ZXJydXB0IGhhbmRsZXJzIHNvIGludGVycnVwdHMgc2hvdWxkCi07IGFscmVhZHkgYmUgb2ZmLiBXZSB0dXJuIHRoZW0gYmFjayBvbiBleHBsaWNpdGx5IGxhdGVyIGlmIHRoZSB1c2VyIGNvZGUKLTsgbmVlZHMgdGhlbSB0byBiZSBiYWNrIG9uLgotCi07IE1hY3JvIHRvIHN3aXRjaCB0byBhIG5ldyBsb2NhbCBzdGFjay4KLQotTUFDUk8gICBORVdTVEsgIHN0a25hbWUKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgW3NlZ18mc3RrbmFtZSZdLHNzCi0gICAgICAgIG1vdiAgICAgW3B0cl8mc3RrbmFtZSZdLF9zcAotICAgICAgICBtb3YgICAgIFtUZW1wU2VnXSxkcwotICAgICAgICBtb3YgICAgIHNzLFtUZW1wU2VnXQotICAgICAgICBtb3YgICAgIF9zcCxvZmZzZXQgc3RrbmFtZQotRU5ETQotCi07IE1hY3JvIHRvIHN3aXRjaCBiYWNrIHRvIHRoZSBvbGQgc3RhY2suCi0KLU1BQ1JPICAgUkVTVFNUSyBzdGtuYW1lCi0gICAgICAgIGNsaQotICAgICAgICBtb3YgICAgIHNzLFtzZWdfJnN0a25hbWUmXQotICAgICAgICBtb3YgICAgIF9zcCxbcHRyXyZzdGtuYW1lJl0KLUVORE0KLQotOyBNYWNybyB0byBzd2FwIHRoZSBjdXJyZW50IHN0YWNrIHdpdGggdGhlIG9uZSBzYXZlZCBhd2F5LgotCi1NQUNSTyAgIFNXQVBTVEsgc3RrbmFtZQotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBheCxzcwotICAgICAgICB4Y2hnICAgIGF4LFtzZWdfJnN0a25hbWUmXQotICAgICAgICBtb3YgICAgIHNzLGF4Ci0gICAgICAgIHhjaGcgICAgX3NwLFtwdHJfJnN0a25hbWUmXQotRU5ETQotCi1lbmRpZgotCi1iZWdkYXRhc2VnICBfcG1kb3MKLQotaWZkZWYgZmxhdG1vZGVsCi0gICAgY2V4dGVybiBfUE1fc2F2ZWREUyxVU0hPUlQKLWVuZGlmCi0gICAgY2V4dGVybiBfUE1fY3JpdEhhbmRsZXIsQ1BUUgotICAgIGNleHRlcm4gX1BNX2JyZWFrSGFuZGxlcixDUFRSCi0gICAgY2V4dGVybiBfUE1fdGltZXJIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV9ydGNIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV9rZXlIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV9rZXkxNUhhbmRsZXIsQ1BUUgotICAgIGNleHRlcm4gX1BNX21vdXNlSGFuZGxlcixDUFRSCi0gICAgY2V4dGVybiBfUE1faW50MTBIYW5kbGVyLENQVFIKLQotICAgIGNleHRlcm4gX1BNX2N0cmxDUHRyLERQVFIKLSAgICBjZXh0ZXJuIF9QTV9jdHJsQlB0cixEUFRSCi0gICAgY2V4dGVybiBfUE1fY3JpdFB0cixEUFRSCi0KLSAgICBjZXh0ZXJuIF9QTV9wcmV2VGltZXIsRkNQVFIKLSAgICBjZXh0ZXJuIF9QTV9wcmV2UlRDLEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldktleSxGQ1BUUgotICAgIGNleHRlcm4gX1BNX3ByZXZLZXkxNSxGQ1BUUgotICAgIGNleHRlcm4gX1BNX3ByZXZCcmVhayxGQ1BUUgotICAgIGNleHRlcm4gX1BNX3ByZXZDdHJsQyxGQ1BUUgotICAgIGNleHRlcm4gX1BNX3ByZXZDcml0aWNhbCxGQ1BUUgotICAgIGNleHRlcm4gX1BNX3ByZXZSZWFsVGltZXIsVUxPTkcKLSAgICBjZXh0ZXJuIF9QTV9wcmV2UmVhbFJUQyxVTE9ORwotICAgIGNleHRlcm4gX1BNX3ByZXZSZWFsS2V5LFVMT05HCi0gICAgY2V4dGVybiBfUE1fcHJldlJlYWxLZXkxNSxVTE9ORwotICAgIGNleHRlcm4gX1BNX3ByZXZSZWFsSW50MTAsVUxPTkcKLQotY3B1YmxpYyBfUE1fcG1kb3NEYXRhU3RhcnQKLQotOyBBbGxvY2F0ZSBzcGFjZSBmb3IgYWxsIG9mIHRoZSBsb2NhbCBzdGFja3MgdGhhdCB3ZSBuZWVkLiBUaGVzZSBzdGFja3MKLTsgYXJlIG5vdCB2ZXJ5IGxhcmdlLCBidXQgc2hvdWxkIGJlIGxhcmdlIGVub3VnaCBmb3IgbW9zdCBwdXJwb3NlcwotOyAoZ2VuZXJhbGx5IHlvdSB3YW50IHRvIGhhbmRsZSB0aGVzZSBpbnRlcnJ1cHRzIHF1aWNrbHksIHNpbXBseSBzdG9yaW5nCi07IHRoZSBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgYW5kIHRoZW4gcmV0dXJuaW5nKS4gSWYgeW91IG5lZWQgYmlnZ2VyCi07IHN0YWNrcyB0aGVuIGNoYW5nZSB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gaGVyZS4KLQotICAgICAgICAgICAgQUxJR04gICA0Ci0gICAgICAgICAgICBkY2xiIE1PVVNFX1NUQUNLICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKLU1zU3RhY2s6ICAgICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQotcHRyX01zU3RhY2sgRFVJTlQgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKLXNlZ19Nc1N0YWNrIGR3ICAgICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAotCi0gICAgICAgICAgICBBTElHTiAgIDQKLSAgICAgICAgICAgIGRjbGIgSU5UMTBfU1RBQ0sgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQotSW50MTBTdGFjazogICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCi1wdHJfSW50MTBTdGFjayAgRFVJTlQgICAwICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAotc2VnX0ludDEwU3RhY2sgIGR3ICAgICAgMCAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50Ci0KLSAgICAgICAgICAgIEFMSUdOICAgNAotICAgICAgICAgICAgZGNsYiBUSU1FUl9TVEFDSyAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCi1UbVN0YWNrOiAgICAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKLXB0cl9UbVN0YWNrIERVSU5UICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0Ci1zZWdfVG1TdGFjayBkdyAgICAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKLQotICAgICAgICAgICAgQUxJR04gICA0Ci0gICAgICAgICAgICBkY2xiIFRJTUVSX1NUQUNLICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKLVJ0Y1N0YWNrOiAgICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQotcHRyX1J0Y1N0YWNrIERVSU5UICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKLXNlZ19SdGNTdGFjayBkdyAgICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAotUnRjSW5zaWRlICAgZHcgICAgICAwICAgICAgICAgICA7IEFyZSB3ZSBzdGlsbCBoYW5kbGluZyBjdXJyZW50IGludGVycnVwdAotCi0gICAgICAgICAgICBBTElHTiAgIDQKLSAgICAgICAgICAgIGRjbGIgS0VZX1NUQUNLICAgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQotS3lTdGFjazogICAgICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCi1wdHJfS3lTdGFjayBEVUlOVCAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAotc2VnX0t5U3RhY2sgZHcgICAgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50Ci1LeUluc2lkZSAgICBkdyAgICAgIDAgICAgICAgICAgIDsgQXJlIHdlIHN0aWxsIGhhbmRsaW5nIGN1cnJlbnQgaW50ZXJydXB0Ci0KLSAgICAgICAgICAgIEFMSUdOICAgNAotICAgICAgICAgICAgZGNsYiBLRVlfU1RBQ0sgICAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCi1LeTE1U3RhY2s6ICAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKLXB0cl9LeTE1U3RhY2sgICBEVUlOVCAgIDAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0Ci1zZWdfS3kxNVN0YWNrICAgZHcgICAgICAwICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKLQotVGVtcFNlZyAgICAgZHcgICAgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIHN0YWNrIHNlZ21lbnQKLQotY3B1YmxpYyBfUE1fcG1kb3NEYXRhRW5kCi0KLWVuZGRhdGFzZWcgIF9wbWRvcwotCi1iZWdjb2Rlc2VnICBfcG1kb3MgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLWNwdWJsaWMgX1BNX3BtZG9zQ29kZVN0YXJ0Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX21vdXNlSVNSIC0gTW91c2UgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSW50ZXJydXB0IHN1YnJvdXRpbmUgY2FsbGVkIGJ5IHRoZSBtb3VzZSBkcml2ZXIgdXBvbiBpbnRlcnJ1cHRzLCB0bwotOyBkaXNwYXRjaCBjb250cm9sIHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gSW50ZXJydXB0cyBhcmUgb24KLTsgd2hlbiB3ZSBjYWxsIHRoZSB1c2VyIGNvZGUuCi07Ci07IEl0IGlzIF9leHRyZW1lbHlfIGltcG9ydGFudCB0byBzYXZlIHRoZSBzdGF0ZSBvZiB0aGUgZXh0ZW5kZWQgcmVnaXN0ZXJzCi07IGFzIHRoZXNlIG1heSB3ZWxsIGJlIHRyYXNoZWQgYnkgdGhlIHJvdXRpbmVzIGNhbGxlZCBmcm9tIGhlcmUgYW5kIG5vdAotOyByZXN0b3JlZCBjb3JyZWN0bHkgYnkgdGhlIG1vdXNlIGludGVyZmFjZSBtb2R1bGUuCi07Ci07IE5PVEU6IFRoaXMgcm91dGluZSBzd2l0Y2hlcyB0byBhIGxvY2FsIHN0YWNrIGJlZm9yZSBjYWxsaW5nIGFueSBDIGNvZGUsCi07ICAgICAgIGFuZCBoZW5jZSBpcyBfbm90XyByZS1lbnRyYW50LiBGb3IgbW91c2UgaGFuZGxlcnMgdGhpcyBpcyBub3QgYQotOyAgICAgICBwcm9ibGVtLCBhcyB0aGUgbW91c2UgZHJpdmVyIGFyYml0cmF0ZXMgY2FsbHMgdG8gdGhlIHVzZXIgbW91c2UKLTsgICAgICAgaGFuZGxlciBmb3IgdXMuCi07Ci07IEVudHJ5OiAgICBBWCAgLSBDb25kaXRpb24gbWFzayBnaXZpbmcgcmVhc29uIGZvciBjYWxsCi07ICAgICAgICAgICBCWCAgLSBNb3VzZSBidXR0b24gc3RhdGUKLTsgICAgICAgICAgIENYICAtIEhvcml6b250YWwgY3Vyc29yIGNvb3JkaW5hdGUKLTsgICAgICAgICAgIERYICAtIFZlcnRpY2FsIGN1cnNvciBjb29yZGluYXRlCi07ICAgICAgICAgICBTSSAgLSBIb3Jpem9udGFsIG1pY2tleSB2YWx1ZQotOyAgICAgICAgICAgREkgIC0gVmVydGljYWwgbWlja2V5IHZhbHVlCi07Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaWZkZWYgICBESkdQUAotY3Byb2NzdGFydCAgX1BNX21vdXNlSVNSCi1lbHNlCi1jcHJvY2ZhciAgICBfUE1fbW91c2VJU1IKLWVuZGlmCi0KLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcHVzaGFkICAgICAgICAgICAgICAgICAgOyBTYXZlIF9hbGxfIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCi0KLSAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi0gICAgICAgIE5FV1NUSyAgTXNTdGFjayAgICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCi0KLTsgQ2FsbCB0aGUgaW5zdGFsbGVkIGhpZ2ggbGV2ZWwgQyBjb2RlIHJvdXRpbmUKLQotICAgICAgICBjbHJoaSAgIGR4ICAgICAgICAgICAgICA7IENsZWFyIG91dCBoaWdoIG9yZGVyIHZhbHVlcwotICAgICAgICBjbHJoaSAgIGN4Ci0gICAgICAgIGNscmhpICAgYngKLSAgICAgICAgY2xyaGkgICBheAotICAgICAgICBzZ25oaSAgIHNpCi0gICAgICAgIHNnbmhpICAgZGkKLQotICAgICAgICBwdXNoICAgIF9kaQotICAgICAgICBwdXNoICAgIF9zaQotICAgICAgICBwdXNoICAgIF9keAotICAgICAgICBwdXNoICAgIF9jeAotICAgICAgICBwdXNoICAgIF9ieAotICAgICAgICBwdXNoICAgIF9heAotICAgICAgICBzdGkgICAgICAgICAgICAgICAgICAgICA7IEVuYWJsZSBpbnRlcnJ1cHRzCi0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX21vdXNlSGFuZGxlcl0KLSAgICAgICAgX2FkZCAgICBzcCwxMiwyNAotCi0gICAgICAgIFJFU1RTVEsgTXNTdGFjayAgICAgICAgIDsgUmVzdG9yZSBwcmV2aW91cyBzdGFjawotCi0gICAgICAgIHBvcGFkICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICByZXQgICAgICAgICAgICAgICAgICAgICA7IFdlIGFyZSBkb25lISEKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fdGltZXJJU1IgLSBUaW1lciBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHRpbWVyIGludGVycnVwdCwgdG8gZGlzcGF0Y2ggY29udHJvbAotOyB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbCByZWdpc3RlcnMKLTsgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIEludGVycnVwdHMgYXJlICpvZmYqCi07IHdoZW4gd2UgY2FsbCB0aGUgdXNlciBjb2RlLgotOwotOyBOT1RFOiBUaGlzIHJvdXRpbmUgc3dpdGNoZXMgdG8gYSBsb2NhbCBzdGFjayBiZWZvcmUgY2FsbGluZyBhbnkgQyBjb2RlLAotOyAgICAgICBhbmQgaGVuY2UgaXMgX25vdF8gcmUtZW50cmFudC4gTWFrZSBzdXJlIHlvdXIgQyBjb2RlIGV4ZWN1dGVzIGFzCi07ICAgICAgIHF1aWNrbHkgYXMgcG9zc2libGUsIHNpbmNlIGEgdGltZXIgb3ZlcnJ1biB3aWxsIHNpbXBseSBoYW5nIHRoZQotOyAgICAgICBzeXN0ZW0uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX3RpbWVySVNSCi0KLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcHVzaGFkICAgICAgICAgICAgICAgICAgOyBTYXZlIF9hbGxfIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCi0KLSAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi0KLSAgICAgICAgTkVXU1RLICBUbVN0YWNrICAgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fdGltZXJIYW5kbGVyXQotICAgICAgICBSRVNUU1RLIFRtU3RhY2sgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKLQotICAgICAgICBwb3BhZCAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgYWxsIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fY2hhaW5QcmV2VGltZXIgLSBDaGFpbiB0byBwcmV2aW91cyB0aW1lciBpbnRlcnJ1cHQgYW5kIHJldHVybgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2hhaW5zIHRvIHRoZSBwcmV2aW91cyB0aW1lciBpbnRlcnJ1cHQgcm91dGluZSBhbmQgcmV0dXJucyBjb250cm9sCi07IGJhY2sgdG8gdGhlIGhpZ2ggbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fY2hhaW5QcmV2VGltZXIKLQotaWZkZWYgICBUTlQKLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgcHVzaCAgICBlY3gKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAotICAgICAgICBtb3YgICAgIGF4LDI1MEVoICAgICAgICA7IENhbGwgcmVhbCBtb2RlIHByb2NlZHVyZSBmdW5jdGlvbgotICAgICAgICBtb3YgICAgIGVieCxbX1BNX3ByZXZSZWFsVGltZXJdCi0gICAgICAgIG1vdiAgICAgZWN4LDEgICAgICAgICAgIDsgQ29weSByZWFsIG1vZGUgZmxhZ3MgdG8gcmVhbCBtb2RlIHN0YWNrCi0gICAgICAgIGludCAgICAgMjFoICAgICAgICAgICAgIDsgQ2FsbCB0aGUgcmVhbCBtb2RlIGNvZGUKLSAgICAgICAgcG9wZmQKLSAgICAgICAgcG9wICAgICBlY3gKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgcmV0Ci1lbHNlCi0gICAgICAgIFNXQVBTVEsgVG1TdGFjayAgICAgICAgIDsgU3dhcCBiYWNrIHRvIHByZXZpb3VzIHN0YWNrCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBzdGF0ZSBvZiBpbnRlcnJ1cHQgZmxhZwotICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0Ci1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgZmFyIGR3b3JkIFtfUE1fcHJldlRpbWVyXQotZWxzZQotICAgICAgICBjYWxsICAgIFtfUE1fcHJldlRpbWVyXQotZW5kaWYKLSAgICAgICAgcG9wZiAgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHN0YXRlIG9mIGludGVycnVwdCBmbGFnCi0gICAgICAgIFNXQVBTVEsgVG1TdGFjayAgICAgICAgIDsgU3dhcCBiYWNrIHRvIEMgc3RhY2sgYWdhaW4KLSAgICAgICAgcmV0Ci1lbmRpZgotCi1jcHJvY2VuZAotCi07IE1hY3JvIHRvIGRlbGF5IGJyaWVmbHkgdG8gZW5zdXJlIHRoYXQgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgYmV0d2VlbgotOyBzdWNjZXNzaXZlIEkvTyBhY2Nlc3NlcyBzbyB0aGF0IHRoZSBkZXZpY2UgYmVpbmcgYWNjZXNzZWQgY2FuIHJlc3BvbmQKLTsgdG8gYm90aCBhY2Nlc3NlcyBldmVuIG9uIGEgdmVyeSBmYXN0IFBDLgotCi1pZmRlZiAgIFVTRV9OQVNNCi0lbWFjcm8gIERFTEFZIDAKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSVlbmRtYWNybwotJW1hY3JvICBJT0RFTEFZTiAxCi0lcmVwICAgICUxCi0gICAgICAgIERFTEFZCi0lZW5kcmVwCi0lZW5kbWFjcm8KLWVsc2UKLW1hY3JvICAgREVMQVkKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLWVuZG0KLW1hY3JvICAgSU9ERUxBWU4gICAgTgotICAgIHJlcHQgICAgTgotICAgICAgICBERUxBWQotICAgIGVuZG0KLWVuZG0KLWVuZGlmCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX3J0Y0lTUiAtIFJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHRpbWVyIGludGVycnVwdCwgdG8gZGlzcGF0Y2ggY29udHJvbAotOyB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbCByZWdpc3RlcnMKLTsgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIEludGVycnVwdHMgYXJlICpvZmYqCi07IHdoZW4gd2UgY2FsbCB0aGUgdXNlciBjb2RlLgotOwotOyBOT1RFOiBUaGlzIHJvdXRpbmUgc3dpdGNoZXMgdG8gYSBsb2NhbCBzdGFjayBiZWZvcmUgY2FsbGluZyBhbnkgQyBjb2RlLAotOyAgICAgICBhbmQgaGVuY2UgaXMgX25vdF8gcmUtZW50cmFudC4gTWFrZSBzdXJlIHlvdXIgQyBjb2RlIGV4ZWN1dGVzIGFzCi07ICAgICAgIHF1aWNrbHkgYXMgcG9zc2libGUsIHNpbmNlIGEgdGltZXIgb3ZlcnJ1biB3aWxsIHNpbXBseSBoYW5nIHRoZQotOyAgICAgICBzeXN0ZW0uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX3J0Y0lTUgotCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoYWQgICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIF9hbGxfIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZwotCi07IENsZWFyIHByaW9yaXR5IGludGVycnVwdCBjb250cm9sbGVyIGFuZCByZS1lbmFibGUgaW50ZXJydXB0cyBzbyB3ZQotOyBkb250IGxvY2sgdGhpbmdzIHVwIGZvciBsb25nLgotCi0gICAgICAgIG1vdiAgICAgYWwsMjBoCi0gICAgICAgIG91dCAgICAgMEEwaCxhbAotICAgICAgICBvdXQgICAgIDAyMGgsYWwKLQotOyBDbGVhciByZWFsLXRpbWUgY2xvY2sgdGltZW91dAotCi0gICAgICAgIGluICAgICAgYWwsNzBoICAgICAgICAgICAgICA7IFJlYWQgQ01PUyBpbmRleCByZWdpc3RlcgotICAgICAgICBwdXNoICAgIF9heCAgICAgICAgICAgICAgICAgOyAgYW5kIHNhdmUgZm9yIGxhdGVyCi0gICAgICAgIElPREVMQVlOIDMKLSAgICAgICAgbW92ICAgICBhbCwwQ2gKLSAgICAgICAgb3V0ICAgICA3MGgsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBpbiAgICAgIGFsLDcxaAotCi07IENhbGwgdGhlIEMgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24KLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi0gICAgICAgIGNtcCAgICAgW0JZVEUgUnRjSW5zaWRlXSwxICA7IENoZWNrIGZvciBtdXR1YWwgZXhjbHVzaW9uCi0gICAgICAgIGplICAgICAgQEBFeGl0Ci0gICAgICAgIG1vdiAgICAgW0JZVEUgUnRjSW5zaWRlXSwxCi0gICAgICAgIE5FV1NUSyAgUnRjU3RhY2sgICAgICAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjawotICAgICAgICBzdGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBSZS1lbmFibGUgaW50ZXJydXB0cwotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9ydGNIYW5kbGVyXQotICAgICAgICBSRVNUU1RLIFJ0Y1N0YWNrICAgICAgICAgICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCi0gICAgICAgIG1vdiAgICAgW0JZVEUgUnRjSW5zaWRlXSwwCi0KLUBARXhpdDogcG9wICAgICBfYXgKLSAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmVzdG9yZSBDTU9TIGluZGV4IHJlZ2lzdGVyCi0gICAgICAgIHBvcGFkICAgICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgYWxsIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0Ci0KLWNwcm9jZW5kCi0KLWlmZGVmIGZsYXRtb2RlbAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1faXJxSVNSVGVtcGxhdGUgLSBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBJUlEgdGVtcGxhdGUKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciBhbnkgaW50ZXJydXB0LCB0byBkaXNwYXRjaCBjb250cm9sCi07IHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gV2Ugc2F2ZSB0aGUgc3RhdGUgb2YgYWxsIHJlZ2lzdGVycwotOyBpbiB0aGlzIHJvdXRpbmUsIGFuZCBzd2l0Y2ggdG8gYSBsb2NhbCBzdGFjay4gSW50ZXJydXB0cyBhcmUgKm9mZioKLTsgd2hlbiB3ZSBjYWxsIHRoZSB1c2VyIGNvZGUuCi07Ci07IE5PVEU6IFRoaXMgcm91dGluZSBzd2l0Y2hlcyB0byBhIGxvY2FsIHN0YWNrIGJlZm9yZSBjYWxsaW5nIGFueSBDIGNvZGUsCi07ICAgICAgIGFuZCBoZW5jZSBpcyBfbm90XyByZS1lbnRyYW50LiBNYWtlIHN1cmUgeW91ciBDIGNvZGUgZXhlY3V0ZXMgYXMKLTsgICAgICAgcXVpY2tseSBhcyBwb3NzaWJsZS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1faXJxSVNSVGVtcGxhdGUKLQotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBtb3YgICAgIGVieCwwICAgICAgICAgICA7IFJlbG9jYXRpb24gYWRqdXN0bWVudCBmYWN0b3IKLSAgICAgICAgam1wICAgICBfX0lSUUVudHJ5Ci0KLTsgR2xvYmFsIHZhcmlhYmxlcyBzdG9yZWQgaW4gdGhlIElSUSB0aHVuayBjb2RlIHNlZ21lbnQKLQotX0NIYW5kbGVyICAgICAgIGRkICAgICAgMCAgICAgICA7IFBvaW50ZXIgdG8gQyBpbnRlcnJ1cHQgaGFuZGxlcgotX1ByZXZJUlEgICAgICAgIGRkICAgICAgMCAgICAgICA7IFByZXZpb3VzIElSUSBoYW5kbGVyCi0gICAgICAgICAgICAgICAgZGQgICAgICAwCi1fSVJRICAgICAgICAgICAgZGQgICAgICAwICAgICAgIDsgSVJRIHdlIGFyZSBob29rZWQgZm9yCi1wdHJfSVJRU3RhY2sgICAgRFVJTlQgICAwICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAotc2VnX0lSUVN0YWNrICAgIGR3ICAgICAgMCAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50Ci1fSW5zaWRlICAgICAgICAgZGIgICAgICAwICAgICAgIDsgTXV0dWFsIGV4Y2x1c2lvbiBmbGFnCi0gICAgICAgIEFMSUdOICAgNAotICAgICAgICBkY2xiIElSUV9TVEFDSyAgICAgICAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjawotX0lSUVN0YWNrOiAgICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCi0KLTsgQ2hlY2sgZm9yIGFuZCByZWplY3Qgc3B1cmlvdXMgSVJRIDcgc2lnbmFscwotCi1fX0lSUUVudHJ5OgotICAgICAgICBjbXAgICAgIFtCWVRFIGNzOmVieCtfSVJRXSw3ICAgIDsgU3B1cmlvdXMgSVJRcyBvY2N1ciBvbmx5IG9uIElSUSA3Ci0gICAgICAgIGptcCAgICAgQEBWYWxpZElSUQotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBtb3YgICAgIGFsLDEwMTFiICAgICAgICAgICAgOyBPQ1czOiByZWFkIElTUgotICAgICAgICBvdXQgICAgIDIwaCxhbCAgICAgICAgICAgICAgOyAoSW50ZWwgUGVyaXBoZXJhbCBDb21wb25lbnRzLCAxOTkxLAotICAgICAgICBpbiAgICAgIGFsLDIwaCAgICAgICAgICAgICAgOyBwLiAzLTE4OCkKLSAgICAgICAgc2hsICAgICBhbCwxICAgICAgICAgICAgICAgIDsgU2V0IEMgPSBiaXQgNyAoSVJRIDcpIG9mIElTUiByZWdpc3RlcgotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICBqYyAgICAgIEBAVmFsaWRJUlEKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0Ci0KLTsgU2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBkdXJhdGlvbiBvZiBJUlEgaGFuZGxlcgotCi1AQFZhbGlkSVJROgotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcHVzaGFkICAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYWxsXyBleHRlbmRlZCByZWdpc3RlcnMKLSAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKLSAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgotCi07IFNlbmQgYW4gRU9JIHRvIHRoZSBQSUMKLQotICAgICAgICBtb3YgICAgIGFsLDIwaCAgICAgICAgICAgICAgOyBTZW5kIEVPSSB0byBQSUMKLSAgICAgICAgY21wICAgICBbQllURSBlYngrX0lSUV0sOCAgIDsgQ2xlYXIgUElDMSBmaXJzdCBpZiBJUlEgPj0gOAotICAgICAgICBqYiAgICAgIEBAMQotICAgICAgICBvdXQgICAgIDBBMGgsYWwKLUBAMTogICAgb3V0ICAgICAyMGgsYWwKLQotOyBDaGVjayBmb3IgbXV0dWFsIGV4Y2x1c2lvbgotCi0gICAgICAgIGNtcCAgICAgW0JZVEUgZWJ4K19JbnNpZGVdLDEKLSAgICAgICAgamUgICAgICBAQENoYWluT2xkSGFuZGxlcgotICAgICAgICBtb3YgICAgIFtCWVRFIGVieCtfSW5zaWRlXSwxCi0KLTsgQ2FsbCB0aGUgQyBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbgotCi0gICAgICAgIG1vdiAgICAgW2VieCtzZWdfSVJRU3RhY2tdLHNzICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKLSAgICAgICAgbW92ICAgICBbZWJ4K3B0cl9JUlFTdGFja10sZXNwCi0gICAgICAgIG1vdiAgICAgW1RlbXBTZWddLGRzCi0gICAgICAgIG1vdiAgICAgc3MsW1RlbXBTZWddCi0gICAgICAgIGxlYSAgICAgZXNwLFtlYngrX0lSUVN0YWNrXQotICAgICAgICBzdGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgUmUtZW5hYmxlIGludGVycnVwdHMKLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgY2FsbCAgICBbRFdPUkQgZWJ4K19DSGFuZGxlcl0KLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgc3MsW2VieCtzZWdfSVJRU3RhY2tdICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCi0gICAgICAgIG1vdiAgICAgZXNwLFtlYngrcHRyX0lSUVN0YWNrXQotICAgICAgICBvciAgICAgIGVheCxlYXgKLSAgICAgICAganogICAgICBAQENoYWluT2xkSGFuZGxlciAgIDsgQ2hhaW4gaWYgbm90IGhhbmRsZWQgZm9yIHNoYXJlZCBJUlEKLQotQEBFeGl0OiBtb3YgICAgIFtCWVRFIGVieCtfSW5zaWRlXSwwCi0gICAgICAgIHBvcGFkICAgICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgYWxsIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0Ci0KLUBAQ2hhaW5PbGRIYW5kbGVyOgotICAgICAgICBjbXAgICAgIFtEV09SRCBlYngrX1ByZXZJUlFdLDAKLSAgICAgICAganogICAgICBAQEV4aXQKLSAgICAgICAgbW92ICAgICBbQllURSBlYngrX0luc2lkZV0sMAotICAgICAgICBtb3YgICAgIGVheCxbRFdPUkQgZWJ4K19QcmV2SVJRXQotICAgICAgICBtb3YgICAgIGVieCxbRFdPUkQgZWJ4K19QcmV2SVJRKzRdCi0gICAgICAgIG1vdiAgICAgW0RXT1JEIF9QcmV2SVJRXSxlYXgKLSAgICAgICAgbW92ICAgICBbRFdPUkQgX1ByZXZJUlErNF0sZWJ4Ci0gICAgICAgIHBvcGFkICAgICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgYWxsIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgam1wICAgICBbY3M6X1ByZXZJUlFdICAgICAgIDsgQ2hhaW4gdG8gcHJldmlvdXMgSVJRIGhhbmRsZXIKLQotY3Byb2NlbmQKLWNwdWJsaWMgX1BNX2lycUlTUlRlbXBsYXRlRW5kCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9rZXlJU1IgLSBrZXlib2FyZCBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIGtleWJvYXJkIGludGVycnVwdCwgdG8gZGlzcGF0Y2ggY29udHJvbAotOyB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbCByZWdpc3RlcnMKLTsgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIEludGVycnVwdHMgYXJlICpvZmYqCi07IHdoZW4gd2UgY2FsbCB0aGUgdXNlciBjb2RlLgotOwotOyBOT1RFOiBUaGlzIHJvdXRpbmUgc3dpdGNoZXMgdG8gYSBsb2NhbCBzdGFjayBiZWZvcmUgY2FsbGluZyBhbnkgQyBjb2RlLAotOyAgICAgICBhbmQgaGVuY2UgaXMgX25vdF8gcmUtZW50cmFudC4gSG93ZXZlciB3ZSBlbnN1cmUgd2l0aGluIHRoaXMgcm91dGluZQotOyAgICAgICBtdXR1YWwgZXhjbHVzaW9uIHRvIHRoZSBrZXlib2FyZCBoYW5kbGluZyByb3V0aW5lLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9rZXlJU1IKLQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoYWQgICAgICAgICAgICAgICAgICA7IFNhdmUgX2FsbF8gZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLQotICAgICAgICBjbXAgICAgIFtCWVRFIEt5SW5zaWRlXSwxICAgOyBDaGVjayBmb3IgbXV0dWFsIGV4Y2x1c2lvbgotICAgICAgICBqZSAgICAgIEBAUmVpc3N1ZWQKLQotICAgICAgICBtb3YgICAgIFtCWVRFIEt5SW5zaWRlXSwxCi0gICAgICAgIE5FV1NUSyAgS3lTdGFjayAgICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCi0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX2tleUhhbmRsZXJdICAgOyBDYWxsIEMgY29kZQotICAgICAgICBSRVNUU1RLIEt5U3RhY2sgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKLSAgICAgICAgbW92ICAgICBbQllURSBLeUluc2lkZV0sMAotCi1AQEV4aXQ6IHBvcGFkICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAotCi07IFdoZW4gdGhlIEJJT1Mga2V5Ym9hcmQgaGFuZGxlciBuZWVkcyB0byBjaGFuZ2UgdGhlIFNISUZUIHN0YXR1cyBsaWdodHMKLTsgb24gdGhlIGtleWJvYXJkLCBpbiB0aGUgcHJvY2VzcyBvZiBkb2luZyB0aGlzIHRoZSBrZXlib2FyZCBjb250cm9sbGVyCi07IHJlLWlzc3VlcyBhbm90aGVyIGludGVycnVwdCwgd2hpbGUgdGhlIGN1cnJlbnQgaGFuZGxlciBpcyBzdGlsbCBleGVjdXRpbmcuCi07IElmIHdlIHJlY2lldmUgYW5vdGhlciBpbnRlcnJ1cHQgd2hpbGUgc3RpbGwgaGFuZGxpbmcgdGhlIGN1cnJlbnQgb25lLAotOyB0aGVuIHNpbXBseSBjaGFpbiBkaXJlY3RseSB0byB0aGUgcHJldmlvdXMgaGFuZGxlci4KLTsKLTsgTm90ZSB0aGF0IGZvciBtb3N0IERPUyBleHRlbmRlcnMsIHRoZSByZWFsIG1vZGUgaW50ZXJydXB0IGhhbmRsZXIgdGhhdCB3ZQotOyBpbnN0YWxsIHRha2VzIGNhcmUgb2YgdGhpcyBmb3IgdXMuCi0KLUBAUmVpc3N1ZWQ6Ci1pZmRlZiAgIFROVAotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0Ci0gICAgICAgIG1vdiAgICAgYXgsMjUwRWggICAgICAgIDsgQ2FsbCByZWFsIG1vZGUgcHJvY2VkdXJlIGZ1bmN0aW9uCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fcHJldlJlYWxLZXldCi0gICAgICAgIG1vdiAgICAgZWN4LDEgICAgICAgICAgIDsgQ29weSByZWFsIG1vZGUgZmxhZ3MgdG8gcmVhbCBtb2RlIHN0YWNrCi0gICAgICAgIGludCAgICAgMjFoICAgICAgICAgICAgIDsgQ2FsbCB0aGUgcmVhbCBtb2RlIGNvZGUKLSAgICAgICAgcG9wZmQKLSAgICAgICAgcG9wICAgICBlY3gKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcG9wICAgICBlYXgKLWVsc2UKLSAgICAgICAgcHVzaGYKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9wcmV2S2V5XQotZWxzZQotICAgICAgICBjYWxsICAgIFtfUE1fcHJldktleV0KLWVuZGlmCi1lbmRpZgotICAgICAgICBqbXAgICAgIEBARXhpdAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9jaGFpblByZXZrZXkgLSBDaGFpbiB0byBwcmV2aW91cyBrZXkgaW50ZXJydXB0IGFuZCByZXR1cm4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENoYWlucyB0byB0aGUgcHJldmlvdXMga2V5IGludGVycnVwdCByb3V0aW5lIGFuZCByZXR1cm5zIGNvbnRyb2wKLTsgYmFjayB0byB0aGUgaGlnaCBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlci4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9jaGFpblByZXZLZXkKLQotaWZkZWYgICBUTlQKLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgcHVzaCAgICBlY3gKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAotICAgICAgICBtb3YgICAgIGF4LDI1MEVoICAgICAgICA7IENhbGwgcmVhbCBtb2RlIHByb2NlZHVyZSBmdW5jdGlvbgotICAgICAgICBtb3YgICAgIGVieCxbX1BNX3ByZXZSZWFsS2V5XQotICAgICAgICBtb3YgICAgIGVjeCwxICAgICAgICAgICA7IENvcHkgcmVhbCBtb2RlIGZsYWdzIHRvIHJlYWwgbW9kZSBzdGFjawotICAgICAgICBpbnQgICAgIDIxaCAgICAgICAgICAgICA7IENhbGwgdGhlIHJlYWwgbW9kZSBjb2RlCi0gICAgICAgIHBvcGZkCi0gICAgICAgIHBvcCAgICAgZWN4Ci0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIHJldAotZWxzZQotCi07IFlJS0VTISBGb3Igc29tZSBzdHJhbmdlIHJlYXNvbiwgd2hlbiBleGVjdXRpb24gcmV0dXJucyBmcm9tIHRoZQotOyBwcmV2aW91cyBrZXlib2FyZCBoYW5kbGVyLCBpbnRlcnJ1cHRzIGFyZSByZS1lbmFibGVkISEgU2luY2Ugd2UgZXhwZWN0Ci07IGludGVycnVwdHMgdG8gcmVtYWluIG9mZiBkdXJpbmcgdGhlIGR1cmF0aW9uIG9mIG91ciBoYW5kbGVyLCB0aGlzIGNhbgotOyBjYXVzZSBoYXZvYy4gSG93ZXZlciBvdXIgc3RhY2sgbWFjcm9zIGFsd2F5cyB0dXJuIG9mZiBpbnRlcnJ1cHRzLCBzbyB0aGV5Ci07IHdpbGwgYmUgb2ZmIHdoZW4gd2UgZXhpdCB0aGlzIHJvdXRpbmUuIE9idmlvdXNseSB0aGVyZSBpcyBhIHRpbnkgd2VlbnkKLTsgd2luZG93IHdoZW4gaW50ZXJydXB0cyB3aWxsIGJlIGVuYWJsZWQsIGJ1dCB0aGVyZSBpcyBub3RoaW5nIHdlIGNhbgotOyBkbyBhYm91dCB0aGlzLgotCi0gICAgICAgIFNXQVBTVEsgS3lTdGFjayAgICAgICAgIDsgU3dhcCBiYWNrIHRvIHByZXZpb3VzIHN0YWNrCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgUHVzaCBmbGFncyBvbiBzdGFjayB0byBzaW11bGF0ZSBpbnRlcnJ1cHQKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9wcmV2S2V5XQotZWxzZQotICAgICAgICBjYWxsICAgIFtfUE1fcHJldktleV0KLWVuZGlmCi0gICAgICAgIFNXQVBTVEsgS3lTdGFjayAgICAgICAgIDsgU3dhcCBiYWNrIHRvIEMgc3RhY2sgYWdhaW4KLSAgICAgICAgcmV0Ci1lbmRpZgotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9rZXkxNUlTUiAtIEludCAxNWgga2V5Ym9hcmQgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgVGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIGlmIHdlIGhhdmUgYmVlbiBjYWxsZWQgdG8gaGFuZGxlIHRoZSBJbnQgMTVoCi07IGtleWJvYXJkIGludGVycnVwdCBjYWxsb3V0IGZyb20gcmVhbCBtb2RlLgotOwotOyAgIEVudHJ5OiAgQVggIC0gSGFyZHdhcmUgc2NhbiBjb2RlIHRvIHByb2Nlc3MKLTsgICBFeGl0OiAgIEFYICAtIEhhcmR3YXJlIHNjYW4gY29kZSB0byBwcm9jZXNzICgwIHRvIGlnbm9yZSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fa2V5MTVJU1IKLQotICAgICAgICBwdXNoICAgIGRzCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgTE9BRF9EUwotICAgICAgICBjbXAgICAgIGFoLDRGaAotICAgICAgICBqbnogICAgIEBATm90T3VycyAgICAgICA7IFF1aXQgaWYgbm90IGtleWJvYXJkIGNhbGxvdXQKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZwotICAgICAgICB4b3IgICAgIGFoLGFoICAgICAgICAgICA7IEFYIDo9IHNjYW4gY29kZQotICAgICAgICBORVdTVEsgIEt5MTVTdGFjayAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjawotICAgICAgICBwdXNoICAgIF9heAotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9rZXkxNUhhbmRsZXJdIDsgQ2FsbCBDIGNvZGUKLSAgICAgICAgX2FkZCAgICBzcCwyLDQKLSAgICAgICAgUkVTVFNUSyBLeTE1U3RhY2sgICAgICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCi0gICAgICAgIHRlc3QgICAgYXgsYXgKLSAgICAgICAganogICAgICBAQDEKLSAgICAgICAgc3RjICAgICAgICAgICAgICAgICAgICAgOyBTZXQgY2FycnkgdG8gcHJvY2VzcyBhcyBub3JtYWwKLSAgICAgICAgam1wICAgICBAQDIKLUBAMTogICAgY2xjICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBjYXJyeSB0byBpZ25vcmUgc2NhbiBjb2RlCi1AQDI6ICAgIHBvcGFkCi0gICAgICAgIGptcCAgICAgQEBFeGl0ICAgICAgICAgIDsgV2UgYXJlIGRvbmUKLQotQEBOb3RPdXJzOgotaWZkZWYgICBUTlQKLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgcHVzaCAgICBlY3gKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAotICAgICAgICBtb3YgICAgIGF4LDI1MEVoICAgICAgICA7IENhbGwgcmVhbCBtb2RlIHByb2NlZHVyZSBmdW5jdGlvbgotICAgICAgICBtb3YgICAgIGVieCxbX1BNX3ByZXZSZWFsS2V5MTVdCi0gICAgICAgIG1vdiAgICAgZWN4LDEgICAgICAgICAgIDsgQ29weSByZWFsIG1vZGUgZmxhZ3MgdG8gcmVhbCBtb2RlIHN0YWNrCi0gICAgICAgIGludCAgICAgMjFoICAgICAgICAgICAgIDsgQ2FsbCB0aGUgcmVhbCBtb2RlIGNvZGUKLSAgICAgICAgcG9wZmQKLSAgICAgICAgcG9wICAgICBlY3gKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcG9wICAgICBlYXgKLWVsc2UKLSAgICAgICAgcHVzaGYKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9wcmV2S2V5MTVdCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW19QTV9wcmV2S2V5MTVdCi1lbmRpZgotZW5kaWYKLUBARXhpdDogcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgcmV0ZiAgICA0Ci1lbHNlCi0gICAgICAgIHJldGYgICAgMgotZW5kaWYKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fYnJlYWtJU1IgLSBDb250cm9sIEJyZWFrIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgQ3RybC1CcmVhayBpbnRlcnJ1cHQuIFdlIHNpbXBseSBzZXQKLTsgdGhlIEN0cmwtQnJlYWsgZmxhZyB0byBhIDEgYW5kIGxlYXZlIChub3RlIHRoYXQgdGhpcyBpcyBhY2Nlc3NlZCB0aHJvdWdoCi07IGEgZmFyIHBvaW50ZXIsIGFzIGl0IG1heSB3ZWxsIGJlIGxvY2F0ZWQgaW4gY29udmVudGlvbmFsIG1lbW9yeSkuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX2JyZWFrSVNSCi0KLSAgICAgICAgc3RpCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2ggICAgX2J4Ci0KLSAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICBlYngsW19QTV9jdHJsQlB0cl0KLWVsc2UKLSAgICAgICAgbGVzICAgICBieCxbX1BNX2N0cmxCUHRyXQotZW5kaWYKLSAgICAgICAgbW92ICAgICBbVUlOVCBfRVMgX2J4XSwxCi0KLTsgUnVuIGFsdGVybmF0ZSBicmVhayBoYW5kbGVyIGNvZGUgaWYgaW5zdGFsbGVkCi0KLSAgICAgICAgY21wICAgICBbQ1BUUiBfUE1fYnJlYWtIYW5kbGVyXSwwCi0gICAgICAgIGplICAgICAgQEBFeGl0Ci0KLSAgICAgICAgcHVzaGFkCi0gICAgICAgIG1vdiAgICAgX2F4LDEKLSAgICAgICAgcHVzaCAgICBfYXgKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fYnJlYWtIYW5kbGVyXSA7IENhbGwgQyBjb2RlCi0gICAgICAgIHBvcCAgICAgX2F4Ci0gICAgICAgIHBvcGFkCi0KLUBARXhpdDogcG9wICAgICBfYngKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBQTV9jdHJsQnJlYWtIaXQoaW50IGNsZWFyRmxhZykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIEN0cmwtQnJlYWsgZmxhZyBhbmQgcG9zc2libHkgY2xlYXJzIGl0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2N0cmxCcmVha0hpdAotCi0gICAgICAgIEFSRyAgICAgY2xlYXJGbGFnOlVJTlQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBpbnRlcnJ1cHQgc3RhdHVzCi0gICAgICAgIHB1c2ggICAgZXMKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIGVieCxbX1BNX2N0cmxCUHRyXQotZWxzZQotICAgICAgICBsZXMgICAgIGJ4LFtfUE1fY3RybEJQdHJdCi1lbmRpZgotICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICA7IE5vIGludGVycnVwdHMgdGhhbmtzIQotICAgICAgICBtb3YgICAgIF9heCxbX0VTIF9ieF0KLSAgICAgICAgdGVzdCAgICBbQllURSBjbGVhckZsYWddLDEKLSAgICAgICAganogICAgICBAQERvbmUKLSAgICAgICAgbW92ICAgICBbVUlOVCBfRVMgX2J4XSwwCi0KLUBARG9uZTogcG9wICAgICBlcwotICAgICAgICBwb3BmICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgaW50ZXJydXB0IHN0YXR1cwotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9jdHJsQ0lTUiAtIENvbnRyb2wgQnJlYWsgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBDdHJsLUMgaW50ZXJydXB0LiBXZSBzaW1wbHkgc2V0Ci07IHRoZSBDdHJsLUMgZmxhZyB0byBhIDEgYW5kIGxlYXZlIChub3RlIHRoYXQgdGhpcyBpcyBhY2Nlc3NlZCB0aHJvdWdoCi07IGEgZmFyIHBvaW50ZXIsIGFzIGl0IG1heSB3ZWxsIGJlIGxvY2F0ZWQgaW4gY29udmVudGlvbmFsIG1lbW9yeSkuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX2N0cmxDSVNSCi0KLSAgICAgICAgc3RpCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2ggICAgX2J4Ci0KLSAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICBlYngsW19QTV9jdHJsQ1B0cl0KLWVsc2UKLSAgICAgICAgbGVzICAgICBieCxbX1BNX2N0cmxDUHRyXQotZW5kaWYKLSAgICAgICAgbW92ICAgICBbVUlOVCBfRVMgX2J4XSwxCi0KLTsgUnVuIGFsdGVybmF0ZSBicmVhayBoYW5kbGVyIGNvZGUgaWYgaW5zdGFsbGVkCi0KLSAgICAgICAgY21wICAgICBbQ1BUUiBfUE1fYnJlYWtIYW5kbGVyXSwwCi0gICAgICAgIGplICAgICAgQEBFeGl0Ci0KLSAgICAgICAgcHVzaGFkCi0gICAgICAgIG1vdiAgICAgX2F4LDAKLSAgICAgICAgcHVzaCAgICBfYXgKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fYnJlYWtIYW5kbGVyXSA7IENhbGwgQyBjb2RlCi0gICAgICAgIHBvcCAgICAgX2F4Ci0gICAgICAgIHBvcGFkCi0KLUBARXhpdDogcG9wICAgICBfYngKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0Ci0gICAgICAgIGlyZXRkCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBQTV9jdHJsQ0hpdChpbnQgY2xlYXJGbGFnKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgQ3RybC1DIGZsYWcgYW5kIHBvc3NpYmx5IGNsZWFycyBpdC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9jdHJsQ0hpdAotCi0gICAgICAgIEFSRyAgICAgY2xlYXJGbGFnOlVJTlQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBpbnRlcnJ1cHQgc3RhdHVzCi0gICAgICAgIHB1c2ggICAgZXMKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIGVieCxbX1BNX2N0cmxDUHRyXQotZWxzZQotICAgICAgICBsZXMgICAgIGJ4LFtfUE1fY3RybENQdHJdCi1lbmRpZgotICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICA7IE5vIGludGVycnVwdHMgdGhhbmtzIQotICAgICAgICBtb3YgICAgIF9heCxbX0VTIF9ieF0KLSAgICAgICAgdGVzdCAgICBbQllURSBjbGVhckZsYWddLDEKLSAgICAgICAganogICAgICBAQERvbmUKLSAgICAgICAgbW92ICAgICBbVUlOVCBfRVMgX2J4XSwwCi0KLUBARG9uZToKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3BmICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgaW50ZXJydXB0IHN0YXR1cwotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9jcml0aWNhbElTUiAtIENvbnRyb2wgRXJyb3IgaGFuZGxlciBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIE1TRE9TIENyaXRpY2FsIEVycm9yIGludGVycnVwdCwgdG8gZGlzcGF0Y2gKLTsgY29udHJvbCB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbAotOyByZWdpc3RlcnMgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIFdlIGFsc28gcGFzcwotOyB0aGUgdmFsdWVzIG9mIHRoZSBBWCBhbmQgREkgcmVnaXN0ZXJzIHRvIHRoZSBhcyBwb2ludGVycywgc28gdGhhdCB0aGUKLTsgdmFsdWVzIGNhbiBiZSBtb2RpZmllZCBiZWZvcmUgcmV0dXJuaW5nIHRvIE1TRE9TLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9jcml0aWNhbElTUgotCi0gICAgICAgIHN0aQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoICAgIF9ieCAgICAgICAgICAgICA7IFNhdmUgcmVnaXN0ZXIgdmFsdWVzIGNoYW5nZWQKLSAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZwotCi0gICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fY3JpdFB0cl0KLWVsc2UKLSAgICAgICAgbGVzICAgICBieCxbX1BNX2NyaXRQdHJdCi1lbmRpZgotICAgICAgICBtb3YgICAgIFtfRVMgX2J4XSxheAotICAgICAgICBtb3YgICAgIFtfRVMgX2J4KzJdLGRpCi0KLTsgUnVuIGFsdGVybmF0ZSBjcml0aWNhbCBoYW5kbGVyIGNvZGUgaWYgaW5zdGFsbGVkCi0KLSAgICAgICAgY21wICAgICBbQ1BUUiBfUE1fY3JpdEhhbmRsZXJdLDAKLSAgICAgICAgamUgICAgICBAQE5vQWx0SGFuZGxlcgotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBwdXNoICAgIF9kaQotICAgICAgICBwdXNoICAgIF9heAotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9jcml0SGFuZGxlcl0gIDsgQ2FsbCBDIGNvZGUKLSAgICAgICAgX2FkZCAgICBzcCw0LDgKLSAgICAgICAgcG9wYWQKLQotICAgICAgICBwb3AgICAgIF9ieAotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotQEBOb0FsdEhhbmRsZXI6Ci0gICAgICAgIG1vdiAgICAgYXgsMyAgICAgICAgICAgIDsgVGVsbCBNU0RPUyB0byBmYWlsIHRoZSBvcGVyYXRpb24KLSAgICAgICAgcG9wICAgICBfYngKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBQTV9jcml0aWNhbEVycm9yKGludCAqYXhWYWwsaW50ICpkaVZhbCxpbnQgY2xlYXJGbGFnKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY3JpdGljYWwgZXJyb3IgZmxhZ3MsIGFuZCB0aGUgdmFsdWVzIHRoYXQKLTsgTVNET1MgcGFzc2VkIGluIHRoZSBBWCBhbmQgREkgcmVnaXN0ZXJzIHRvIG91ciBoYW5kbGVyLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2NyaXRpY2FsRXJyb3IKLQotICAgICAgICBBUkcgICAgIGF4VmFsOkRQVFIsIGRpVmFsOkRQVFIsIGNsZWFyRmxhZzpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICA7IFNhdmUgaW50ZXJydXB0IHN0YXR1cwotICAgICAgICBwdXNoICAgIGVzCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICBlYngsW19QTV9jcml0UHRyXQotZWxzZQotICAgICAgICBsZXMgICAgIGJ4LFtfUE1fY3JpdFB0cl0KLWVuZGlmCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgTm8gaW50ZXJydXB0cyB0aGFua3MhCi0gICAgICAgIHhvciAgICAgX2F4LF9heAotICAgICAgICB4b3IgICAgIF9kaSxfZGkKLSAgICAgICAgbW92ICAgICBheCxbX0VTIF9ieF0KLSAgICAgICAgbW92ICAgICBkaSxbX0VTIF9ieCsyXQotICAgICAgICB0ZXN0ICAgIFtCWVRFIGNsZWFyRmxhZ10sMQotICAgICAgICBqeiAgICAgIEBATm9DbGVhcgotICAgICAgICBtb3YgICAgIFtVTE9ORyBfRVMgX2J4XSwwCi1AQE5vQ2xlYXI6Ci0gICAgICAgIF9sZXMgICAgX2J4LFtheFZhbF0KLSAgICAgICAgbW92ICAgICBbX0VTIF9ieF0sX2F4Ci0gICAgICAgIF9sZXMgICAgX2J4LFtkaVZhbF0KLSAgICAgICAgbW92ICAgICBbX0VTIF9ieF0sX2RpCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wZiAgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGludGVycnVwdCBzdGF0dXMKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssIFBNX21vdXNlSGFuZGxlciBtaCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fc2V0TW91c2VIYW5kbGVyCi0KLSAgICAgICAgQVJHICAgICBtb3VzZU1hc2s6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaCAgICBlcwotCi0gICAgICAgIG1vdiAgICAgYXgsMENoICAgICAgICAgIDsgQVggOj0gRnVuY3Rpb24gMTIgLSBpbnN0YWxsIGludGVycnVwdCBzdWIKLSAgICAgICAgbW92ICAgICBfY3gsW21vdXNlTWFza10gOyBDWCA6PSBtb3VzZSBtYXNrCi0gICAgICAgIG1vdiAgICAgX2R4LG9mZnNldCBfUE1fbW91c2VJU1IKLSAgICAgICAgcHVzaCAgICBjcwotICAgICAgICBwb3AgICAgIGVzICAgICAgICAgICAgICA7IEVTOl9EWCAtPiBtb3VzZSBoYW5kbGVyCi0gICAgICAgIGludCAgICAgMzNoICAgICAgICAgICAgIDsgQ2FsbCBtb3VzZSBkcml2ZXIKLQotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWlmZGVmIGZsYXRtb2RlbAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX21vdXNlUE1DQih2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTW91c2UgcmVhbG1vZGUgY2FsbGJhY2sgcm91dGluZS4gVXBvbiBlbnRyeSB0byB0aGlzIHJvdXRpbmUsIHdlIHJlY2lldmUKLTsgdGhlIGZvbGxvd2luZyBmcm9tIHRoZSBEUE1JIHNlcnZlcjoKLTsKLTsgICBFbnRyeTogIERTOl9TSSAgLT4gUmVhbCBtb2RlIHN0YWNrIGF0IHRpbWUgb2YgY2FsbAotOyAgICAgICAgICAgRVM6X0RJICAtPiBSZWFsIG1vZGUgcmVnaXN0ZXIgZGF0YSBzdHJ1Y3R1cmUKLTsgICAgICAgICAgIFNTOl9TUCAgLT4gTG9ja2VkIHByb3RlY3RlZCBtb2RlIHN0YWNrIHRvIHVzZQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9tb3VzZVBNQ0IKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgbW92ICAgICBlYXgsW2VzOl9kaSsxQ2hdICAgIDsgTG9hZCByZWdpc3RlciB2YWx1ZXMgZnJvbSByZWFsIG1vZGUKLSAgICAgICAgbW92ICAgICBlYngsW2VzOl9kaSsxMGhdCi0gICAgICAgIG1vdiAgICAgZWN4LFtlczpfZGkrMThoXQotICAgICAgICBtb3YgICAgIGVkeCxbZXM6X2RpKzE0aF0KLSAgICAgICAgbW92ICAgICBlc2ksW2VzOl9kaSswNGhdCi0gICAgICAgIG1vdiAgICAgZWRpLFtlczpfZGldCi0gICAgICAgIGNhbGwgICAgX1BNX21vdXNlSVNSICAgICAgICA7IENhbGwgdGhlIG1vdXNlIGhhbmRsZXIKLSAgICAgICAgcG9wYWQKLQotICAgICAgICBtb3YgICAgIGF4LFtkczpfc2ldCi0gICAgICAgIG1vdiAgICAgW2VzOl9kaSsyQWhdLGF4ICAgICA7IFBsdWcgaW4gcmV0dXJuIElQIGFkZHJlc3MKLSAgICAgICAgbW92ICAgICBheCxbZHM6X3NpKzJdCi0gICAgICAgIG1vdiAgICAgW2VzOl9kaSsyQ2hdLGF4ICAgICA7IFBsdWcgaW4gcmV0dXJuIENTIHZhbHVlCi0gICAgICAgIGFkZCAgICAgW1dPUkQgZXM6X2RpKzJFaF0sNCA7IFJlbW92ZSByZXR1cm4gYWRkcmVzcyBmcm9tIHN0YWNrCi0gICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgICAgICA7IEdvIGJhY2sgdG8gcmVhbCBtb2RlIQotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX2ludDEwUE1DQih2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50MTAgcmVhbG1vZGUgY2FsbGJhY2sgcm91dGluZS4gVXBvbiBlbnRyeSB0byB0aGlzIHJvdXRpbmUsIHdlIHJlY2lldmUKLTsgdGhlIGZvbGxvd2luZyBmcm9tIHRoZSBEUE1JIHNlcnZlcjoKLTsKLTsgICBFbnRyeTogIERTOkVTSSAgLT4gUmVhbCBtb2RlIHN0YWNrIGF0IHRpbWUgb2YgY2FsbAotOyAgICAgICAgICAgRVM6RURJICAtPiBSZWFsIG1vZGUgcmVnaXN0ZXIgZGF0YSBzdHJ1Y3R1cmUKLTsgICAgICAgICAgIFNTOkVTUCAgLT4gTG9ja2VkIHByb3RlY3RlZCBtb2RlIHN0YWNrIHRvIHVzZQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgICAgICBfUE1faW50MTBQTUNCCi0KLSAgICAgICAgcHVzaGFkCi0gICAgICAgIHB1c2ggICAgZHMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoICAgIGZzCi0KLSAgICAgICAgcHVzaGZkCi0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIG1vdiAgICAgW2VzOmVkaSsyMGhdLGF4ICAgICA7IFNhdmUgcmV0dXJuIGZsYWcgc3RhdHVzCi0gICAgICAgIG1vdiAgICAgYXgsW2RzOmVzaV0KLSAgICAgICAgbW92ICAgICBbZXM6ZWRpKzJBaF0sYXggICAgIDsgUGx1ZyBpbiByZXR1cm4gSVAgYWRkcmVzcwotICAgICAgICBtb3YgICAgIGF4LFtkczplc2krMl0KLSAgICAgICAgbW92ICAgICBbZXM6ZWRpKzJDaF0sYXggICAgIDsgUGx1ZyBpbiByZXR1cm4gQ1MgdmFsdWUKLSAgICAgICAgYWRkICAgICBbV09SRCBlczplZGkrMkVoXSw0IDsgUmVtb3ZlIHJldHVybiBhZGRyZXNzIGZyb20gc3RhY2sKLQotOyBDYWxsIHRoZSBpbnN0YWxsIGludDEwIGhhbmRsZXIgaW4gcHJvdGVjdGVkIG1vZGUuIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQKLTsgd2l0aCBEUyBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0YSBzZWxlY3RvciwgYW5kIEVTOkVESSBwb2ludGluZyB0aGUgdGhlCi07IHJlYWwgbW9kZSBEUE1JIHJlZ2lzdGVyIHN0cnVjdHVyZSBhdCB0aGUgdGltZSBvZiB0aGUgaW50ZXJydXB0LiBUaGUKLTsgaGFuZGxlIG11c3QgYmUgd3JpdHRlbiBpbiBhc3NlbWJsZXIgdG8gYmUgYWJsZSB0byBleHRyYWN0IHRoZSByZWFsIG1vZGUKLTsgcmVnaXN0ZXIgdmFsdWVzIGZyb20gdGhlIHN0cnVjdHVyZQotCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcG9wICAgICBmcyAgICAgICAgICAgICAgICAgIDsgRlM6RURJIC0+IHJlYWwgbW9kZSByZWdpc3RlcnMKLSAgICAgICAgTE9BRF9EUwotICAgICAgICBORVdTVEsgIEludDEwU3RhY2sgICAgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKLQotICAgICAgICBjYWxsICAgIFtfUE1faW50MTBIYW5kbGVyXQotCi0gICAgICAgIFJFU1RTVEsgSW50MTBTdGFjayAgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKLSAgICAgICAgcG9wICAgICBmcwotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgcG9wYWQKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgICAgIDsgR28gYmFjayB0byByZWFsIG1vZGUhCi0KLWNwcm9jZW5kCi0KLWVuZGlmCi0KLWNwdWJsaWMgX1BNX3BtZG9zQ29kZUVuZAotCi1lbmRjb2Rlc2VnICBfcG1kb3MKLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9fdmZsYXQuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL192ZmxhdC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTg1YTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL192ZmxhdC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw2NTIgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICAgICAgICAgIEJhc2VkIG9uIG9yaWdpbmFsIGNvZGUgQ29weXJpZ2h0IDE5OTQgT3R0byBDaHJvbnMKLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBsYXRlcgotOyogRW52aXJvbm1lbnQ6IElCTSBQQyAzMiBiaXQgcHJvdGVjdGVkIG1vZGUKLTsqCi07KiBEZXNjcmlwdGlvbjogTG93IGxldmVsIHBhZ2UgZmF1bHQgaGFuZGxlciBmb3IgdmlydHVhbCBsaW5lYXIgZnJhbWVidWZmZXJzLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLSAgICAgICAgSlVNUFMKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICAgICAgX3ZmbGF0ICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKLQotVkZMQVRfU1RBUlQgICAgIEVRVSAwRjAwMDAwMDBoCi1WRkxBVF9FTkQgICAgICAgRVFVIDBGMDNGRkZGRmgKLVBBR0VfUFJFU0VOVCAgICBFUVUgMQotUEFHRV9OT1RQUkVTRU5UIEVRVSAwCi1QQUdFX1JFQUQgICAgICAgRVFVIDAKLVBBR0VfV1JJVEUgICAgICBFUVUgMgotCi1pZmRlZiAgIERPUzRHVwotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBET1M0Ry9XIGZsYXQgbGluZWFyIGZyYW1lYnVmZmVyIGVtdWxhdGlvbi4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWJlZ2RhdGFzZWcgIF92ZmxhdAotCi07IE5lYXIgcG9pbnRlcnMgdG8gdGhlIHBhZ2UgZGlyZWN0b3J5IGJhc2UgYW5kIG91ciBwYWdlIHRhYmxlcy4gQWxsIG9mCi07IHRoaXMgbWVtb3J5IGlzIGFsd2F5cyBsb2NhdGVkIGluIHRoZSBmaXJzdCBNYiBvZiBET1MgbWVtb3J5LgotCi1QREJSICAgICAgICAgICAgZGQgIDAgICAgICAgICAgICAgICA7IFBhZ2UgZGlyZWN0b3J5IGJhc2UgcmVnaXN0ZXIgKENSMykKLWFjY2Vzc1BhZ2VBZGRyICBkZCAgMAotYWNjZXNzUGFnZVRhYmxlIGRkICAwCi0KLTsgQ2F1c2VXYXkgcGFnZSBkaXJlY3RvcnkgJiAxc3QgcGFnZSB0YWJsZSBsaW5lYXIgYWRkcmVzc2VzLgotCi1DYXVzZVdheURJUkxpbmVhciBkZCAwCi1DYXVzZVdheTFzdExpbmVhciBkZCAwCi0KLTsgUGxhY2UgdG8gc3RvcmUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBQYWdlIFRhYmxlIERpcmVjdG9yeSBiZWZvcmUgd2UKLTsgaW50aWFsaXNlZCBvdXIgdmlydHVhbCBidWZmZXIgY29kZS4KLQotcGFnZURpcmVjdG9yeTogIHJlc2QgMTAyNCAgICAgICAgICAgOyBTYXZlZCBwYWdlIHRhYmxlIGRpcmVjdG9yeQotCi1WYWxpZENTICAgICAgICAgZHcgIDAgICAgICAgICAgICAgICA7IFZhbGlkIENTIGZvciBwYWdlIGZhdWx0cwotUmluZzBDUyAgICAgICAgIGR3ICAwICAgICAgICAgICAgICAgOyBPdXIgcmluZyAwIGNvZGUgc2VsZWN0b3IKLUxhc3RQYWdlICAgICAgICBkZCAgMCAgICAgICAgICAgICAgIDsgTGFzdCBwYWdlIHdlIG1hcHBlZCBpbgotQmFua0Z1bmNCdWY6ICAgIHJlc2IgMTAxICAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBiYW5rIHN3aXRjaCBjb2RlCi1CYW5rRnVuY1B0ciAgICAgZGQgIG9mZnNldCBCYW5rRnVuY0J1ZgotCi1JTlQxNEdhdGU6Ci1JTlQxNE9mZnNldCAgICAgZGQgICAgICAwICAgICAgICAgICA7IGVpcCBvZiBvcmlnaW5hbCB2ZWN0b3IKLUlOVDE0U2VsZWN0b3IgICBkdyAgICAgIDAgICAgICAgICAgIDsgY3Mgb2Ygb3JpZ2luYWwgdmVjdG9yCi0KLSAgICAgICAgY2V4dGVybiBfUE1fc2F2ZWREUyxVU0hPUlQKLSAgICAgICAgY2V4dGVybiBWRl9oYXZlQ2F1c2VXYXksQk9PTAotCi1lbmRkYXRhc2VnICBfdmZsYXQKLQotYmVnY29kZXNlZyAgX3ZmbGF0ICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi0gICAgICAgIGNleHRlcm4gVkZfbWFsbG9jLEZQVFIKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUEZfaGFuZGxlcjY0ayAtIFBhZ2UgZmF1bHQgaGFuZGxlciBmb3IgNjRrIGJhbmtzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBUaGUgaGFuZGxlciBiZWxvdyBpcyBhIDMyIGJpdCByaW5nIDAgcGFnZSBmYXVsdCBoYW5kbGVyLiAgSXQgcmVjZWl2ZXMKLTsgY29udHJvbCBpbW1lZGlhdGVseSBhZnRlciBhbnkgcGFnZSBmYXVsdCBvciBhZnRlciBhbiBJUlE2IChoYXJkd2FyZQotOyBpbnRlcnJ1cHQpLiBUaGlzIHByb3ZpZGVzIHRoZSBmYXN0ZXN0IHBvc3NpYmxlIGhhbmRsaW5nIG9mIHBhZ2UgZmF1bHRzCi07IHNpbmNlIGl0IGp1bXAgZGlyZWN0bHkgaGVyZS4gIElmIHRoaXMgaXMgYSBwYWdlIGZhdWx0LCB0aGUgbnVtYmVyCi07IGltbWVkaWF0ZWx5IG9uIHRoZSBzdGFjayB3aWxsIGJlIGFuIGVycm9yIGNvZGUsIGF0IG9mZnNldCA0IHdpbGwgYmUKLTsgdGhlIGVpcCBvZiB0aGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24sIGF0IG9mZnNldCA4IHdpbGwgYmUgdGhlIGNzIG9mIHRoZQotOyBmYXVsdGluZyBpbnN0cnVjdGlvbi4gIElmIGl0IGlzIGEgaGFyZHdhcmUgaW50ZXJydXB0LCBpdCB3aWxsIG5vdCBoYXZlCi07IHRoZSBlcnJvciBjb2RlIGFuZCB0aGUgZWZsYWdzIHdpbGwgYmUgYXQgb2Zmc2V0IDguCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgUEZfaGFuZGxlcjY0awotCi07IENoZWNrIGlmIHRoaXMgaXMgYSBwcm9jZXNzb3IgZXhlY2VwdGlvbiBvciBhIHBhZ2UgZmF1bHQKLQotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBtb3YgICAgIGF4LFtjczpWYWxpZENTXSAgICAgOyBVc2UgQ1Mgb3ZlcnJpZGUgdG8gYWNjZXNzIGRhdGEKLSAgICAgICAgY21wICAgICBbc3M6ZXNwKzEyXSxheCAgICAgIDsgSXMgdGhpcyBhIHBhZ2UgZmF1bHQ/Ci0gICAgICAgIGpuZSAgICAgQEBUb09sZEhhbmRsZXIgICAgICA7IE5vcGUsIGp1bXAgdG8gdGhlIHByZXZpb3VzIGhhbmRsZXIKLQotOyBHZXQgYWRkcmVzcyBvZiBwYWdlIGZhdWx0IGFuZCBjaGVjayBpZiB3aXRoaW4gb3VyIGhhbmRsZXJzIHJhbmdlCi0KLSAgICAgICAgbW92ICAgICBlYXgsY3IyICAgICAgICAgICAgIDsgRUJYIGhhcyBwYWdlIGZhdWx0IGxpbmVhciBhZGRyZXNzCi0gICAgICAgIGNtcCAgICAgZWF4LFZGTEFUX1NUQVJUICAgICA7IElzIHRoZSBmYXVsdCBsZXNzIHRoYW4gb3Vycz8KLSAgICAgICAgamIgICAgICBAQFRvT2xkSGFuZGxlciAgICAgIDsgWWVwLCBnbyB0byBwcmV2aW91cyBoYW5kbGVyCi0gICAgICAgIGNtcCAgICAgZWF4LFZGTEFUX0VORCAgICAgICA7IElzIHRoZSBmYXVsdCBtb3JlIHRoYW4gb3Vycz8KLSAgICAgICAgamFlICAgICBAQFRvT2xkSGFuZGxlciAgICAgIDsgWWVwLCBnbyB0byBwcmV2aW91cyBoYW5kbGVyCi0KLTsgVGhpcyBpcyBvdXIgcGFnZSBmYXVsdCwgc28gd2UgbmVlZCB0byBoYW5kbGUgaXQKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgcHVzaCAgICBkcwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIG1vdiAgICAgZWJ4LGVheCAgICAgICAgICAgICA7IEVCWCA6PSBwYWdlIGZhdWx0IGFkZHJlc3MKLSAgICAgICAgYW5kICAgICBlYngsaW52ZXJ0IDBGRkZGaCAgIDsgTWFzayB0byA2NGsgYmFuayBib3VuZGFyeQotICAgICAgICBtb3YgICAgIGRzLFtjczpfUE1fc2F2ZWREU107IExvYWQgc2VnbWVudCByZWdpc3RlcnMKLSAgICAgICAgbW92ICAgICBlcyxbY3M6X1BNX3NhdmVkRFNdCi0KLTsgTWFwIGluIHRoZSBwYWdlIHRhYmxlIGZvciBvdXIgdmlydHVhbCBmcmFtZWJ1ZmZlciBhcmVhIGZvciBtb2RpZmljYXRpb24KLQotICAgICAgICBtb3YgICAgIGVkaSxbUERCUl0gICAgICAgICAgOyBFREkgcG9pbnRzIHRvIHBhZ2UgZGlyZWN0b3J5Ci0gICAgICAgIG1vdiAgICAgZWR4LGVieCAgICAgICAgICAgICA7IEVEWCA9IGxpbmVhciBhZGRyZXNzCi0gICAgICAgIHNociAgICAgZWR4LDIyICAgICAgICAgICAgICA7IEVEWCA9IG9mZnNldCB0byBwYWdlIGRpcmVjdG9yeQotICAgICAgICBtb3YgICAgIGVkeCxbZWR4KjQrZWRpXSAgICAgOyBFRFggPSBwaHlzaWNhbCBwYWdlIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgbW92ICAgICBlYXgsZWR4Ci0gICAgICAgIG1vdiAgICAgZWR4LFthY2Nlc3NQYWdlVGFibGVdCi0gICAgICAgIG9yICAgICAgZWF4LDcKLSAgICAgICAgbW92ICAgICBbZWR4XSxlYXgKLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICA7IFVwZGF0ZSBwYWdlIHRhYmxlIGNhY2hlCi0KLTsgTWFyayBhbGwgcGFnZXMgdmFsaWQgZm9yIHRoZSBuZXcgcGFnZSBmYXVsdCBhcmVhCi0KLSAgICAgICAgbW92ICAgICBlc2ksZWJ4ICAgICAgICAgICAgIDsgRVNJIDo9IGxpbmVhciBhZGRyZXNzIGZvciBwYWdlCi0gICAgICAgIHNociAgICAgZXNpLDEwCi0gICAgICAgIGFuZCAgICAgZXNpLDBGRkZoICAgICAgICAgICA7IE9mZnNldCBpbnRvIHBhZ2UgdGFibGUKLSAgICAgICAgYWRkICAgICBlc2ksW2FjY2Vzc1BhZ2VBZGRyXQotaWZkZWYgICBVU0VfTkFTTQotJWFzc2lnbiBvZmYgMAotJXJlcCAxNgotICAgICAgICBvciAgICAgIFtEV09SRCBlc2krb2ZmXSwwMDAwMDAwMDAxaCA7IEVuYWJsZSBwYWdlcwotJWFzc2lnbiBvZmYgb2ZmKzQKLSVlbmRyZXAKLWVsc2UKLW9mZiA9IDAKLVJFUFQgICAgMTYKLSAgICAgICAgb3IgICAgICBbRFdPUkQgZXNpK29mZl0sMDAwMDAwMDAwMWggOyBFbmFibGUgcGFnZXMKLW9mZiA9IG9mZis0Ci1FTkRNCi1lbmRpZgotCi07IE1hcmsgYWxsIHBhZ2VzIGludmFsaWQgZm9yIHRoZSBwcmV2aW91c2x5IG1hcHBlZCBhcmVhCi0KLSAgICAgICAgeGNoZyAgICBlc2ksW0xhc3RQYWdlXSAgICAgIDsgU2F2ZSBsYXN0IHBhZ2UgZm9yIG5leHQgcGFnZSBmYXVsdAotICAgICAgICB0ZXN0ICAgIGVzaSxlc2kKLSAgICAgICAganogICAgICBAQERvbmVNYXBwaW5nICAgICAgIDsgRG9udCB1cGRhdGUgaWYgZmlyc3QgdGltZSByb3VuZAotaWZkZWYgICBVU0VfTkFTTQotJWFzc2lnbiBvZmYgMAotJXJlcCAxNgotICAgICAgICBvciAgICAgIFtEV09SRCBlc2krb2ZmXSwwRkZGRkZGRkVoICA7IERpc2FibGUgcGFnZXMKLSVhc3NpZ24gb2ZmIG9mZis0Ci0lZW5kcmVwCi1lbHNlCi1vZmYgPSAwCi1SRVBUICAgIDE2Ci0gICAgICAgIGFuZCAgICAgW0RXT1JEIGVzaStvZmZdLDBGRkZGRkZGRWggIDsgRGlzYWJsZSBwYWdlcwotb2ZmID0gb2ZmKzQKLUVORE0KLWVuZGlmCi0KLUBARG9uZU1hcHBpbmc6Ci0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICAgICAgOyBGbHVzaCB0aGUgVExCCi0KLTsgTm93IHByb2dyYW0gdGhlIG5ldyBTdXBlclZHQSBzdGFydGluZyBiYW5rIGFkZHJlc3MKLQotICAgICAgICBtb3YgICAgIGVheCxlYnggICAgICAgICAgICAgOyBFQVggOj0gcGFnZSBmYXVsdCBhZGRyZXNzCi0gICAgICAgIHNociAgICAgZWF4LDE2Ci0gICAgICAgIGFuZCAgICAgZWF4LDBGRmggICAgICAgICAgICA7IE1hc2sgdG8gMC0yNTUKLSAgICAgICAgY2FsbCAgICBbQmFua0Z1bmNQdHJdICAgICAgIDsgQ2FsbCB0aGUgYmFuayBzd2l0Y2ggZnVuY3Rpb24KLQotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgcG9wYWQKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgYWRkICAgICBlc3AsNCAgICAgICAgICAgICAgIDsgUG9wIHRoZSBlcnJvciBjb2RlIGZyb20gc3RhY2sKLSAgICAgICAgaXJldGQgICAgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIHRvIGZhdWx0aW5nIGluc3RydWN0aW9uCi0KLUBAVG9PbGRIYW5kbGVyOgotICAgICAgICBwb3AgICAgIGVheAotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBqbXAgZmFyIGR3b3JkIFtjczpJTlQxNEdhdGVdOyBDaGFpbiB0byBwcmV2aW91cyBoYW5kbGVyCi1lbHNlCi0gICAgICAgIGptcCAgICAgW0ZXT1JEIGNzOklOVDE0R2F0ZV07IENoYWluIHRvIHByZXZpb3VzIGhhbmRsZXIKLWVuZGlmCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBGX2hhbmRsZXI0ayAgLSBQYWdlIGZhdWx0IGhhbmRsZXIgZm9yIDRrIGJhbmtzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBUaGUgaGFuZGxlciBiZWxvdyBpcyBhIDMyIGJpdCByaW5nIDAgcGFnZSBmYXVsdCBoYW5kbGVyLiAgSXQgcmVjZWl2ZXMKLTsgY29udHJvbCBpbW1lZGlhdGVseSBhZnRlciBhbnkgcGFnZSBmYXVsdCBvciBhZnRlciBhbiBJUlE2IChoYXJkd2FyZQotOyBpbnRlcnJ1cHQpLiBUaGlzIHByb3ZpZGVzIHRoZSBmYXN0ZXN0IHBvc3NpYmxlIGhhbmRsaW5nIG9mIHBhZ2UgZmF1bHRzCi07IHNpbmNlIGl0IGp1bXAgZGlyZWN0bHkgaGVyZS4gIElmIHRoaXMgaXMgYSBwYWdlIGZhdWx0LCB0aGUgbnVtYmVyCi07IGltbWVkaWF0ZWx5IG9uIHRoZSBzdGFjayB3aWxsIGJlIGFuIGVycm9yIGNvZGUsIGF0IG9mZnNldCA0IHdpbGwgYmUKLTsgdGhlIGVpcCBvZiB0aGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24sIGF0IG9mZnNldCA4IHdpbGwgYmUgdGhlIGNzIG9mIHRoZQotOyBmYXVsdGluZyBpbnN0cnVjdGlvbi4gIElmIGl0IGlzIGEgaGFyZHdhcmUgaW50ZXJydXB0LCBpdCB3aWxsIG5vdCBoYXZlCi07IHRoZSBlcnJvciBjb2RlIGFuZCB0aGUgZWZsYWdzIHdpbGwgYmUgYXQgb2Zmc2V0IDguCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgUEZfaGFuZGxlcjRrCi0KLTsgRmlsbCBpbiB3aGVuIHdlIGhhdmUgdGVzdGVkIGFsbCB0aGUgNjRLYiBjb2RlCi0KLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgam1wIGZhciBkd29yZCBbY3M6SU5UMTRHYXRlXTsgQ2hhaW4gdG8gcHJldmlvdXMgaGFuZGxlcgotZWxzZQotICAgICAgICBqbXAgICAgIFtGV09SRCBjczpJTlQxNEdhdGVdOyBDaGFpbiB0byBwcmV2aW91cyBoYW5kbGVyCi1lbmRpZgotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIEluc3RhbGxGYXVsdEhhbmRsZXIodm9pZCAqYmFzZUFkZHIsaW50IGJhbmtTaXplKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSW5zdGFsbGVzIHRoZSBwYWdlIGZhdWx0IGhhbmRsZXIgZGlyZWN0bHkgaW50IHRoZSBpbnRlcnJ1cHQgZGVzY3JpcHRvcgotOyB0YWJsZSBmb3IgbWF4aW11bSBwZXJmb3JtYW5jZS4gVGhpcyBvZiBjb3Vyc2UgcmVxdWlyZXMgcmluZyAwIGFjY2VzcywKLTsgYnV0IG5vbmUgb2YgdGhpcyBzdHVmZiB3aWxsIHJ1biB3aXRob3V0IHJpbmcgMCEKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBJbnN0YWxsRmF1bHRIYW5kbGVyCi0KLSAgICAgICAgQVJHICAgICBiYXNlQWRkcjpVTE9ORywgYmFua1NpemU6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIFtEV09SRCBMYXN0UGFnZV0sMCAgOyBObyBwYWdlcyBoYXZlIGJlZW4gbWFwcGVkCi0gICAgICAgIG1vdiAgICAgYXgsY3MKLSAgICAgICAgbW92ICAgICBbVmFsaWRDU10sYXggICAgICAgIDsgU2F2ZSBDUyB2YWx1ZSBmb3IgcGFnZSBmYXVsdHMKLQotOyBQdXQgYWRkcmVzcyBvZiBvdXIgcGFnZSBmYXVsdCBoYW5kbGVyIGludG8gdGhlIElEVCBkaXJlY3RseQotCi0gICAgICAgIHN1YiAgICAgZXNwLDYgICAgICAgICAgICAgICA7IEFsbG9jYXRlIHNwYWNlIG9uIHN0YWNrCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIHNpZHQgICAgW3NzOmVzcF0gICAgICAgICAgICA7IFN0b3JlIHBvaW50ZXIgdG8gSURUCi1lbHNlCi0gICAgICAgIHNpZHQgICAgW0ZXT1JEIHNzOmVzcF0gICAgICA7IFN0b3JlIHBvaW50ZXIgdG8gSURUCi1lbmRpZgotICAgICAgICBwb3AgICAgIGF4ICAgICAgICAgICAgICAgICAgOyBhZGQgZXNwLDIKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgQWJzb2x1dGUgYWRkcmVzcyBvZiBJRFQKLSAgICAgICAgYWRkICAgICBlYXgsMTQqOCAgICAgICAgICAgIDsgUG9pbnQgdG8gSW50ICMxNAotCi07IE5vdGUgdGhhdCBJbnRlcnJ1cHQgZ2F0ZXMgZG8gbm90IGhhdmUgdGhlIGhpZ2ggYW5kIGxvdyB3b3JkIG9mIHRoZQotOyBvZmZzZXQgaW4gYWRqYWNlbnQgd29yZHMgaW4gbWVtb3J5LCB0aGVyZSBhcmUgNCBieXRlcyBzZXBhcmF0aW5nIHRoZW0uCi0KLSAgICAgICAgbW92ICAgICBlY3gsW2VheF0gICAgICAgICAgIDsgR2V0IGNzIGFuZCBsb3cgMTYgYml0cyBvZiBvZmZzZXQKLSAgICAgICAgbW92ICAgICBlZHgsW2VheCs2XSAgICAgICAgIDsgR2V0IGhpZ2ggMTYgYml0cyBvZiBvZmZzZXQgaW4gZHgKLSAgICAgICAgc2hsICAgICBlZHgsMTYKLSAgICAgICAgbW92ICAgICBkeCxjeCAgICAgICAgICAgICAgIDsgZWR4IGhhcyBvZmZzZXQKLSAgICAgICAgbW92ICAgICBbSU5UMTRPZmZzZXRdLGVkeCAgIDsgU2F2ZSBvZmZzZXQKLSAgICAgICAgc2hyICAgICBlY3gsMTYKLSAgICAgICAgbW92ICAgICBbSU5UMTRTZWxlY3Rvcl0sY3ggIDsgU2F2ZSBvcmlnaW5hbCBjcwotICAgICAgICBtb3YgICAgIFtlYXgrMl0sY3MgICAgICAgICAgOyBJbnN0YWxsIG5ldyBjcwotICAgICAgICBtb3YgICAgIGVkeCxvZmZzZXQgUEZfaGFuZGxlcjY0awotICAgICAgICBjbXAgICAgIFtVSU5UIGJhbmtTaXplXSw0Ci0gICAgICAgIGpuZSAgICAgQEAxCi0gICAgICAgIG1vdiAgICAgZWR4LG9mZnNldCBQRl9oYW5kbGVyNGsKLUBAMTogICAgbW92ICAgICBbZWF4XSxkeCAgICAgICAgICAgIDsgSW5zdGFsbCBsb3cgd29yZCBvZiBvZmZzZXQKLSAgICAgICAgc2hyICAgICBlZHgsMTYKLSAgICAgICAgbW92ICAgICBbZWF4KzZdLGR4ICAgICAgICAgIDsgSW5zdGFsbCBoaWdoIHdvcmQgb2Ygb2Zmc2V0Ci0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBSZW1vdmVGYXVsdEhhbmRsZXIodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENsb3NlcyBkb3duIHRoZSB2aXJ0dWFsIGZyYW1lYnVmZmVyIHNlcnZpY2VzIGFuZCByZXN0b3JlcyB0aGUgcHJldmlvdXMKLTsgcGFnZSBmYXVsdCBoYW5kbGVyLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFJlbW92ZUZhdWx0SGFuZGxlcgotCi0gICAgICAgIGVudGVyX2MKLQotOyBSZW1vdmUgcGFnZSBmYXVsdCBoYW5kbGVyIGZyb20gSURUCi0KLSAgICAgICAgc3ViICAgICBlc3AsNiAgICAgICAgICAgICAgIDsgQWxsb2NhdGUgc3BhY2Ugb24gc3RhY2sKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgc2lkdCAgICBbc3M6ZXNwXSAgICAgICAgICAgIDsgU3RvcmUgcG9pbnRlciB0byBJRFQKLWVsc2UKLSAgICAgICAgc2lkdCAgICBbRldPUkQgc3M6ZXNwXSAgICAgIDsgU3RvcmUgcG9pbnRlciB0byBJRFQKLWVuZGlmCi0KLSAgICAgICAgcG9wICAgICBheCAgICAgICAgICAgICAgICAgIDsgYWRkIGVzcCwyCi0gICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgICAgICA7IEFic29sdXRlIGFkZHJlc3Mgb2YgSURUCi0gICAgICAgIGFkZCAgICAgZWF4LDE0KjggICAgICAgICAgICA7IFBvaW50IHRvIEludCAjMTQKLSAgICAgICAgbW92ICAgICBjeCxbSU5UMTRTZWxlY3Rvcl0KLSAgICAgICAgbW92ICAgICBbZWF4KzJdLGN4ICAgICAgICAgIDsgUmVzdG9yZSBvcmlnaW5hbCBDUwotICAgICAgICBtb3YgICAgIGVkeCxbSU5UMTRPZmZzZXRdCi0gICAgICAgIG1vdiAgICAgW2VheF0sZHggICAgICAgICAgICA7IEluc3RhbGwgbG93IHdvcmQgb2Ygb2Zmc2V0Ci0gICAgICAgIHNociAgICAgZWR4LDE2Ci0gICAgICAgIG1vdiAgICAgW2VheCs2XSxkeCAgICAgICAgICA7IEluc3RhbGwgaGlnaCB3b3JkIG9mIG9mZnNldAotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgSW5zdGFsbEJhbmtGdW5jKGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSW5zdGFsbHMgdGhlIGJhbmsgc3dpdGNoIGZ1bmN0aW9uIGJ5IHJlbG9jYXRpbmcgaXQgaW50byBvdXIgZGF0YSBzZWdtZW50Ci07IGFuZCBtYWtpbmcgaXQgaW50byBhIGNhbGxhYmxlIGZ1bmN0aW9uLiBXZSBkbyBpdCB0aGlzIHdheSB0byBtYWtlIHRoZQotOyBjb2RlIGlkZW50aWNhbCB0byB0aGUgd2F5IHRoYXQgdGhlIFZmbGF0RCBkZXZpY2VzIHdvcmsgdW5kZXIgV2luZG93cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBJbnN0YWxsQmFua0Z1bmMKLQotICAgICAgICBBUkcgICAgIGNvZGVMZW46VUlOVCwgYmFua0Z1bmM6RFBUUgotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIGVzaSxbYmFua0Z1bmNdICAgICAgOyBDb3B5IHRoZSBjb2RlIGludG8gYnVmZmVyCi0gICAgICAgIG1vdiAgICAgZWRpLG9mZnNldCBCYW5rRnVuY0J1ZgotICAgICAgICBtb3YgICAgIGVjeCxbY29kZUxlbl0KLSAgICByZXAgbW92c2IKLSAgICAgICAgbW92ICAgICBbQllURSBlZGldLDBDM2ggICAgIDsgVGVybWluYXRlIHRoZSBmdW5jdGlvbiB3aXRoIGEgbmVhciByZXQKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgSW5pdFBhZ2luZyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSW5pdGlhbGl6ZXMgcGFnaW5nIHN5c3RlbS4gSWYgcGFnaW5nIGlzIG5vdCBlbmFibGVkLCBidWlsZHMgYSBwYWdlIHRhYmxlCi07IGRpcmVjdG9yeSBhbmQgcGFnZSB0YWJsZXMgZm9yIHBoeXNpY2FsIG1lbW9yeQotOwotOyAgIEV4aXQ6ICAgICAgIDAgICAtIFN1Y2Nlc3NmdWwKLTsgICAgICAgICAgICAgICAtMSAgLSBDb3VsZG4ndCBpbml0aWFsaXplIHBhZ2luZyBtZWNoYW5pc20KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBJbml0UGFnaW5nCi0KLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgcHVzaCAgICBlY3gKLSAgICAgICAgcHVzaCAgICBlZHgKLSAgICAgICAgcHVzaCAgICBlc2kKLSAgICAgICAgcHVzaCAgICBlZGkKLQotOyBBcmUgd2UgcnVubmluZyB1bmRlciBDYXVzZVdheT8KLQotICAgICAgICBtb3YgICAgIGF4LDBGRkY5aAotICAgICAgICBpbnQgICAgIDMxaAotICAgICAgICBqYyAgICAgIEBATm90Q2F1c2V3YXkKLSAgICAgICAgY21wICAgICBlY3gsIkNBVVMiCi0gICAgICAgIGpueiAgICAgQEBOb3RDYXVzZXdheQotICAgICAgICBjbXAgICAgIGVkeCwiRVdBWSIKLSAgICAgICAgam56ICAgICBAQE5vdENhdXNld2F5Ci0KLSAgICAgICAgbW92ICAgICBbQk9PTCBWRl9oYXZlQ2F1c2VXYXldLDEKLSAgICAgICAgbW92ICAgICBbQ2F1c2VXYXlESVJMaW5lYXJdLGVzaQotICAgICAgICBtb3YgICAgIFtDYXVzZVdheTFzdExpbmVhcl0sZWRpCi0KLTsgQ2hlY2sgZm9yIERQTUkKLQotICAgICAgICBtb3YgICAgIGF4LDBmZjAwaAotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIGludCAgICAgMzFoCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgc2hyICAgICBlZGksMgotICAgICAgICBhbmQgICAgIGVkaSwzCi0gICAgICAgIGNtcCAgICAgZWRpLDIKLSAgICAgICAganogICAgICBAQEVyckV4aXQgICAgICAgICAgICAgICA7IE5vdCBzdXBwb3J0ZWQgdW5kZXIgRFBNSQotCi0gICAgICAgIG1vdiAgICAgZWF4LFtDYXVzZVdheURJUkxpbmVhcl0KLSAgICAgICAgam1wICAgICBAQENvcHlDUjMKLQotQEBOb3RDYXVzZXdheToKLSAgICAgICAgbW92ICAgICBheCxjcwotICAgICAgICB0ZXN0ICAgIGF4LDMgICAgICAgICAgICAgICAgICAgIDsgV2hpY2ggcmluZyBhcmUgd2UgcnVubmluZwotICAgICAgICBqbnogICAgIEBARXJyRXhpdCAgICAgICAgICAgICAgIDsgTmVlZHMgemVybyByaW5nIHRvIGFjY2VzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcGFnZSB0YWJsZXMgKENSMykKLSAgICAgICAgbW92ICAgICBlYXgsY3IwICAgICAgICAgICAgICAgICA7IExvYWQgQ1IwCi0gICAgICAgIHRlc3QgICAgZWF4LDgwMDAwMDAwaCAgICAgICAgICAgOyBJcyBwYWdpbmcgZW5hYmxlZD8KLSAgICAgICAganogICAgICBAQEVyckV4aXQgICAgICAgICAgICAgICA7IE5vLCB3ZSBtdXN0IGhhdmUgcGFnaW5nIQotCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMyAgICAgICAgICAgICAgICAgOyBMb2FkIGRpcmVjdG9yeSBhZGRyZXNzCi0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGgKLQotQEBDb3B5Q1IzOgotICAgICAgICBtb3YgICAgIFtQREJSXSxlYXggICAgICAgICAgICAgIDsgU2F2ZSBpdAotICAgICAgICBtb3YgICAgIGVzaSxlYXgKLSAgICAgICAgbW92ICAgICBlZGksb2Zmc2V0IHBhZ2VEaXJlY3RvcnkKLSAgICAgICAgbW92ICAgICBlY3gsMTAyNAotICAgICAgICBjbGQKLSAgICAgICAgcmVwICAgICBtb3ZzZCAgICAgICAgICAgICAgICAgICA7IENvcHkgdGhlIG9yaWdpbmFsIHBhZ2UgdGFibGUgZGlyZWN0b3J5Ci0gICAgICAgIGNtcCAgICAgW0RXT1JEIGFjY2Vzc1BhZ2VBZGRyXSwwOyBDaGVjayBpZiB3ZSBoYXZlIGFsbG9jYXRlZCBwYWdlCi0gICAgICAgIGpuZSAgICAgQEBIYXZlUmVhbE1lbSAgICAgICAgICAgOyB0YWJsZSBhbHJlYWR5ICh3ZSBjYW50IGZyZWUgaXQpCi0KLSAgICAgICAgbW92ICAgICBlYXgsMDEwMGggICAgICAgICAgICAgICA7IERQTUkgRE9TIGFsbG9jYXRlCi0gICAgICAgIG1vdiAgICAgZWJ4LDgxOTIvMTYKLSAgICAgICAgaW50ICAgICAzMWggICAgICAgICAgICAgICAgICAgICA7IEFsbG9jYXRlIDgxOTIgYnl0ZXMKLSAgICAgICAgYW5kICAgICBlYXgsMEZGRkZoCi0gICAgICAgIHNobCAgICAgZWF4LDQgICAgICAgICAgICAgICAgICAgOyBFQVggcG9pbnRzIHRvIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkKLSAgICAgICAgYWRkICAgICBlYXgsNDA5NQotICAgICAgICBhbmQgICAgIGVheCwwRkZGRkYwMDBoICAgICAgICAgIDsgUGFnZSBhbGlnbgotICAgICAgICBtb3YgICAgIFthY2Nlc3NQYWdlQWRkcl0sZWF4Ci0KLUBASGF2ZVJlYWxNZW06Ci0gICAgICAgIG1vdiAgICAgZWF4LFthY2Nlc3NQYWdlQWRkcl0gICAgOyBFQVggLT4gcGFnZSB0YWJsZSBpbiAxc3QgTWIKLSAgICAgICAgc2hyICAgICBlYXgsMTIKLSAgICAgICAgYW5kICAgICBlYXgsM0ZGaCAgICAgICAgICAgICAgICA7IFBhZ2UgdGFibGUgb2Zmc2V0Ci0gICAgICAgIHNobCAgICAgZWF4LDIKLSAgICAgICAgY21wICAgICBbQk9PTCBWRl9oYXZlQ2F1c2VXYXldLDAKLSAgICAgICAganogICAgICBAQE5vdENXMAotICAgICAgICBtb3YgICAgIGVieCxbQ2F1c2VXYXkxc3RMaW5lYXJdCi0gICAgICAgIGptcCAgICAgQEBQdXQxc3QKLQotQEBOb3RDVzA6Ci0gICAgICAgIG1vdiAgICAgZWJ4LFtQREJSXQotICAgICAgICBtb3YgICAgIGVieCxbZWJ4XQotICAgICAgICBhbmQgICAgIGVieCwwRkZGRkYwMDBoICAgICAgICAgIDsgUGFnZSB0YWJsZSBmb3IgMXN0IG1lZ2FieXRlCi0KLUBAUHV0MXN0OgotICAgICAgICBhZGQgICAgIGVheCxlYngKLSAgICAgICAgbW92ICAgICBbYWNjZXNzUGFnZVRhYmxlXSxlYXgKLSAgICAgICAgc3ViICAgICBlYXgsZWF4ICAgICAgICAgICAgICAgICA7IE5vIGVycm9yCi0gICAgICAgIGptcCAgICAgQEBFeGl0Ci0KLUBARXJyRXhpdDoKLSAgICAgICAgbW92ICAgICBlYXgsLTEKLQotQEBFeGl0OiBwb3AgICAgIGVkaQotICAgICAgICBwb3AgICAgIGVzaQotICAgICAgICBwb3AgICAgIGVkeAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBDbG9zZVBhZ2luZyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2xvc2VzIHRoZSBwYWdpbmcgc3lzdGVtCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgQ2xvc2VQYWdpbmcKLQotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoICAgIGVkeAotICAgICAgICBwdXNoICAgIGVzaQotICAgICAgICBwdXNoICAgIGVkaQotCi0gICAgICAgIG1vdiAgICAgZWF4LFthY2Nlc3NQYWdlQWRkcl0KLSAgICAgICAgY2FsbCAgICBBY2Nlc3NQYWdlICAgICAgICAgICAgICA7IFJlc3RvcmUgQWNjZXNzUGFnZSBtYXBwaW5nCi0gICAgICAgIG1vdiAgICAgZWRpLFtQREJSXQotICAgICAgICBtb3YgICAgIGVzaSxvZmZzZXQgcGFnZURpcmVjdG9yeQotICAgICAgICBtb3YgICAgIGVjeCwxMDI0Ci0gICAgICAgIGNsZAotICAgICAgICByZXAgICAgIG1vdnNkICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZSBkaXJlY3RvcnkKLQotQEBFeGl0OiBwb3AgICAgIGVkaQotICAgICAgICBwb3AgICAgIGVzaQotICAgICAgICBwb3AgICAgIGVkeAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgbG9uZyBBY2Nlc3NQYWdlKGxvbmcgcGh5cykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1hcHMgYSBrbm93biBwYWdlIHRvIGdpdmVuIHBoeXNpY2FsIG1lbW9yeQotOyAgIEVudHJ5OiAgICAgIEVBWCAtIFBoeXNpY2FsIG1lbW9yeQotOyAgIEV4aXQ6ICAgICAgIEVBWCAtIExpbmVhciBtZW1vcnkgYWRkcmVzcyBvZiBtYXBwZWQgcGh5cyBtZW0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXRpYyAgICAgQWNjZXNzUGFnZQotCi0gICAgICAgIHB1c2ggICAgZWR4Ci0gICAgICAgIG1vdiAgICAgZWR4LFthY2Nlc3NQYWdlVGFibGVdCi0gICAgICAgIG9yICAgICAgZWF4LDcKLSAgICAgICAgbW92ICAgICBbZWR4XSxlYXgKLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICAgICAgOyBVcGRhdGUgcGFnZSB0YWJsZSBjYWNoZQotICAgICAgICBtb3YgICAgIGVheCxbYWNjZXNzUGFnZUFkZHJdCi0gICAgICAgIHBvcCAgICAgZWR4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBsb25nIEdldFBoeXNpY2FsQWRkcmVzcyhsb25nIGxpbmVhcikKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybnMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgbGluZWFyIGFkZHJlc3MKLTsgICBFbnRyeTogICAgICBFQVggLSBMaW5lYXIgYWRkcmVzcyB0byBjb252ZXJ0Ci07ICAgRXhpdDogICAgICAgRUFYIC0gUGh5c2ljYWwgYWRkcmVzcwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhdGljICAgICBHZXRQaHlzaWNhbEFkZHJlc3MKLQotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVkeAotICAgICAgICBtb3YgICAgIGVkeCxlYXgKLSAgICAgICAgc2hyICAgICBlZHgsMjIgICAgICAgICAgICAgICAgICA7IEVEWCBpcyB0aGUgZGlyZWN0b3J5IG9mZnNldAotICAgICAgICBtb3YgICAgIGVieCxbUERCUl0KLSAgICAgICAgbW92ICAgICBlZHgsW2VkeCo0K2VieF0gICAgICAgICA7IExvYWQgcGFnZSB0YWJsZSBhZGRyZXNzCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIG1vdiAgICAgZWF4LGVkeAotICAgICAgICBjYWxsICAgIEFjY2Vzc1BhZ2UgICAgICAgICAgICAgIDsgQWNjZXNzIHRoZSBwYWdlIHRhYmxlCi0gICAgICAgIG1vdiAgICAgZWR4LGVheAotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICBzaHIgICAgIGVheCwxMgotICAgICAgICBhbmQgICAgIGVheCwwM0ZGaCAgICAgICAgICAgICAgIDsgRUFYIG9mZnNldCBpbnRvIHBhZ2UgdGFibGUKLSAgICAgICAgbW92ICAgICBlYXgsW2VkeCtlYXgqNF0gICAgICAgICA7IExvYWQgcGh5c2ljYWwgYWRkcmVzcwotICAgICAgICBhbmQgICAgIGVheCwwRkZGRkYwMDBoCi0gICAgICAgIHBvcCAgICAgZWR4Ci0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIENyZWF0ZVBhZ2VUYWJsZShsb25nIHBhZ2VERW50cnkpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDcmVhdGVzIGEgcGFnZSB0YWJsZSBmb3Igc3BlY2lmaWMgYWRkcmVzcyAoNE1CKQotOyAgICAgICBFbnRyeTogIEVBWCAtIFBhZ2UgZGlyZWN0b3J5IGVudHJ5ICh0b3AgMTAtYml0cyBvZiBhZGRyZXNzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhdGljICAgICBDcmVhdGVQYWdlVGFibGUKLQotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoICAgIGVkeAotICAgICAgICBwdXNoICAgIGVkaQotICAgICAgICBtb3YgICAgIGVieCxlYXggICAgICAgICAgICAgICAgIDsgU2F2ZSBhZGRyZXNzCi0gICAgICAgIG1vdiAgICAgZWF4LDgxOTIKLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgY2FsbCAgICBWRl9tYWxsb2MgICAgICAgICAgICAgIDsgQWxsb2NhdGUgcGFnZSB0YWJsZSBkaXJlY3RvcnkKLSAgICAgICAgYWRkICAgICBlc3AsNAotICAgICAgICBhZGQgICAgIGVheCwwRkZGaAotICAgICAgICBhbmQgICAgIGVheCwwRkZGRkYwMDBoICAgICAgICAgIDsgUGFnZSBhbGlnbiAoNEtCKQotICAgICAgICBtb3YgICAgIGVkaSxlYXggICAgICAgICAgICAgICAgIDsgU2F2ZSBwYWdlIHRhYmxlIGxpbmVhciBhZGRyZXNzCi0gICAgICAgIHN1YiAgICAgZWF4LGVheCAgICAgICAgICAgICAgICAgOyBGaWxsIHdpdGggemVybwotICAgICAgICBtb3YgICAgIGVjeCwxMDI0Ci0gICAgICAgIGNsZAotICAgICAgICByZXAgICAgIHN0b3NkICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgcGFnZSB0YWJsZQotICAgICAgICBzdWIgICAgIGVkaSw0MDk2Ci0gICAgICAgIG1vdiAgICAgZWF4LGVkaQotICAgICAgICBjYWxsICAgIEdldFBoeXNpY2FsQWRkcmVzcwotICAgICAgICBtb3YgICAgIGVkeCxbUERCUl0KLSAgICAgICAgb3IgICAgICBlYXgsNyAgICAgICAgICAgICAgICAgICA7IFByZXNlbnQvd3JpdGUvdXNlciBiaXQKLSAgICAgICAgbW92ICAgICBbZWR4K2VieCo0XSxlYXggICAgICAgICA7IFNhdmUgcGh5c2ljYWwgYWRkcmVzcyBpbnRvIHBhZ2UgZGlyZWN0b3J5Ci0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICAgICAgICAgIDsgVXBkYXRlIHBhZ2UgdGFibGUgY2FjaGUKLSAgICAgICAgcG9wICAgICBlZGkKLSAgICAgICAgcG9wICAgICBlZHgKLSAgICAgICAgcG9wICAgICBlY3gKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgTWFwUGh5c2ljYWwyTGluZWFyKHVsb25nIHBBZGRyLCB1bG9uZyBsQWRkciwgaW50IHBhZ2VzLCBpbnQgZmxhZ3MpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTWFwcyBwaHlzaWNhbCBtZW1vcnkgaW50byBsaW5lYXIgbWVtb3J5Ci07ICAgRW50cnk6ICAgICAgcEFkZHIgICAtIFBoeXNpY2FsIGFkZHJlc3MKLTsgICAgICAgICAgICAgICBsQWRkciAgIC0gTGluZWFyIGFkZHJlc3MKLTsgICAgICAgICAgICAgICBwYWdlcyAgIC0gTnVtYmVyIG9mIDRLIHBhZ2VzIHRvIG1hcAotOyAgICAgICAgICAgICAgIGZsYWdzICAgLSBQYWdlIGZsYWdzCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IDAgICA9ICAgICAgIHByZXNlbnQKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMSAgID0gICAgICAgUmVhZCgwKS9Xcml0ZSgxKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIE1hcFBoeXNpY2FsMkxpbmVhcgotCi0gICAgICAgIEFSRyAgICAgcEFkZHI6VUxPTkcsIGxBZGRyOlVMT05HLCBwYWdlczpVSU5ULCBwZmxhZ3M6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBhbmQgICAgIFtVTE9ORyBwQWRkcl0sMEZGRkZGMDAwaDsgUGFnZSBib3VuZGFyeQotICAgICAgICBhbmQgICAgIFtVTE9ORyBsQWRkcl0sMEZGRkZGMDAwaDsgUGFnZSBib3VuZGFyeQotICAgICAgICBtb3YgICAgIGVjeCxbcGZsYWdzXQotICAgICAgICBhbmQgICAgIGVjeCwxMWIgICAgICAgICAgICAgICAgIDsgSnVzdCB0d28gYml0cwotICAgICAgICBvciAgICAgIGVjeCwxMDBiICAgICAgICAgICAgICAgIDsgU3VwZXJ2aXNvciBiaXQKLSAgICAgICAgbW92ICAgICBbcGZsYWdzXSxlY3gKLQotICAgICAgICBtb3YgICAgIGVkeCxbbEFkZHJdCi0gICAgICAgIHNociAgICAgZWR4LDIyICAgICAgICAgICAgICAgICAgOyBFRFggPSBEaXJlY3RvcnkKLSAgICAgICAgbW92ICAgICBlc2ksW1BEQlJdCi0gICAgICAgIG1vdiAgICAgZWRpLFtwYWdlc10gICAgICAgICAgICAgOyBFREkgcGFnZSBjb3VudAotICAgICAgICBtb3YgICAgIGVieCxbbEFkZHJdCi0KLUBAQ3JlYXRlTG9vcDoKLSAgICAgICAgbW92ICAgICBlY3gsW2VzaStlZHgqNF0gICAgICAgICA7IExvYWQgcGFnZSB0YWJsZSBhZGRyZXNzCi0gICAgICAgIHRlc3QgICAgZWN4LDEgICAgICAgICAgICAgICAgICAgOyBJcyBpdCBwcmVzZW50PwotICAgICAgICBqbnogICAgIEBAVGFibGVPSwotICAgICAgICBtb3YgICAgIGVheCxlZHgKLSAgICAgICAgY2FsbCAgICBDcmVhdGVQYWdlVGFibGUgICAgICAgICA7IENyZWF0ZSBhIHBhZ2UgdGFibGUKLUBAVGFibGVPSzoKLSAgICAgICAgbW92ICAgICBlYXgsZWJ4Ci0gICAgICAgIHNociAgICAgZWF4LDEyCi0gICAgICAgIGFuZCAgICAgZWF4LDNGRmgKLSAgICAgICAgc3ViICAgICBlYXgsMTAyNAotICAgICAgICBuZWcgICAgIGVheCAgICAgICAgICAgICAgICAgICAgIDsgRUFYID0gcGFnZSBjb3VudCBpbiB0aGlzIHRhYmxlCi0gICAgICAgIGluYyAgICAgZWR4ICAgICAgICAgICAgICAgICAgICAgOyBOZXh0IHRhYmxlCi0gICAgICAgIG1vdiAgICAgZWJ4LDAgICAgICAgICAgICAgICAgICAgOyBOZXh0IHRpbWUgd2UnbGwgbWFwIDFLIHBhZ2VzCi0gICAgICAgIHN1YiAgICAgZWRpLGVheCAgICAgICAgICAgICAgICAgOyBTdWJ0cmFjdCBtYXBwZWQgcGFnZXMgZnJvbSBwYWdlIGNvdW50Ci0gICAgICAgIGpucyAgICAgQEBDcmVhdGVMb29wICAgICAgICAgICAgOyBDcmVhdGUgbW9yZSB0YWJsZXMgaWYgbmVjZXNzYXJ5Ci0KLSAgICAgICAgbW92ICAgICBlY3gsW3BhZ2VzXSAgICAgICAgICAgICA7IEVDWCA9IFBhZ2UgY291bnQKLSAgICAgICAgbW92ICAgICBlc2ksW2xBZGRyXQotICAgICAgICBzaHIgICAgIGVzaSwxMiAgICAgICAgICAgICAgICAgIDsgT2Zmc2V0IHBhcnQgaXNuJ3QgbmVlZGVkCi0gICAgICAgIG1vdiAgICAgZWRpLFtwQWRkcl0KLUBATWFwcGluZ0xvb3A6Ci0gICAgICAgIG1vdiAgICAgZWF4LGVzaQotICAgICAgICBzaHIgICAgIGVheCwxMCAgICAgICAgICAgICAgICAgIDsgRUFYID0gb2Zmc2V0IHRvIHBhZ2UgZGlyZWN0b3J5Ci0gICAgICAgIG1vdiAgICAgZWJ4LFtQREJSXQotICAgICAgICBtb3YgICAgIGVheCxbZWF4KjQrZWJ4XSAgICAgICAgIDsgRUFYID0gcGFnZSB0YWJsZSBhZGRyZXNzCi0gICAgICAgIGNhbGwgICAgQWNjZXNzUGFnZQotICAgICAgICBtb3YgICAgIGVieCxlc2kKLSAgICAgICAgYW5kICAgICBlYngsM0ZGaCAgICAgICAgICAgICAgICA7IEVCWCA9IG9mZnNldCB0byBwYWdlIHRhYmxlCi0gICAgICAgIG1vdiAgICAgZWR4LGVkaQotICAgICAgICBhZGQgICAgIGVkaSw0MDk2ICAgICAgICAgICAgICAgIDsgTmV4dCBwaHlzaWNhbCBhZGRyZXNzCi0gICAgICAgIGluYyAgICAgZXNpICAgICAgICAgICAgICAgICAgICAgOyBOZXh0IGxpbmVhciBwYWdlCi0gICAgICAgIG9yICAgICAgZWR4LFtwZmxhZ3NdICAgICAgICAgICAgOyBVcGRhdGUgZmxhZ3MuLi4KLSAgICAgICAgbW92ICAgICBbZWF4K2VieCo0XSxlZHggICAgICAgICA7IFN0b3JlIHBhZ2UgdGFibGUgZW50cnkKLSAgICAgICAgbG9vcCAgICBAQE1hcHBpbmdMb29wCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICAgICAgICAgIDsgVXBkYXRlIHBhZ2UgdGFibGUgY2FjaGUKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfdmZsYXQKLQotZW5kaWYKLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9jcHVpbmZvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvY3B1aW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTExN2M3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9jcHVpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBET1MKLSoKLSogRGVzY3JpcHRpb246ICBNU0RPUyBzcGVjaWZpYyBjb2RlIGZvciB0aGUgQ1BVIGRldGVjdGlvbiBtb2R1bGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBFeHRlcm5hbCB0aW1pbmcgZnVuY3Rpb24gKi8KLQotdm9pZCBfX1pUaW1lckluaXQodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRG8gbm90aGluZyBmb3IgRE9TIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aHJlYWQgcHJpb3JpdGllcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFNldE1heFRocmVhZFByaW9yaXR5KCkgICAgICAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRG8gbm90aGluZyBmb3IgRE9TIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aHJlYWQgcHJpb3JpdGllcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpKSAgICAodm9pZCkoaSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAotICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCi17Ci0gICAgdWxvbmcgICByZXNvbHV0aW9uOwotCi0gICAgX19aVGltZXJJbml0KCk7Ci0gICAgVUxaVGltZXJSZXNvbHV0aW9uKCZyZXNvbHV0aW9uKTsKLSAgICBmcmVxLT5sb3cgPSAodWxvbmcpKDEwMDAwMDAwMDAwLjAgLyByZXNvbHV0aW9uKTsKLSAgICBmcmVxLT5oaWdoID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHQpLT5sb3cgPSBVTFpSZWFkVGltZSgpICogMTAwMDBMOyAgXAotICAgICh0KS0+aGlnaCA9IDA7ICAgICAgICAgICAgICAgICAgICAgIFwKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL2V2ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjlkMTEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL2V2ZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IERPUwotKgotKiBEZXNjcmlwdGlvbjogIDMyLWJpdCBET1MgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtCi0qICAgICAgICAgICAgICAgZXZlbnQgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWlib29sIF9WQVJBUEkgICBfRVZUX3VzZUV2ZW50cyA9IHRydWU7ICAvKiBUcnVlIHRvIHVzZSBldmVudCBoYW5kbGluZyAgICovCi1pYm9vbCBfVkFSQVBJICAgX0VWVF9pbnN0YWxsZWQgPSAwOyAgICAgLyogRXZlbnQgaGFuZGVycyBpbnN0YWxsZWQ/ICAgICAqLwotdWNoYXIgX1ZBUkFQSSAgICpfRVZUX2Jpb3NQdHIgPSBOVUxMOyAgIC8qIFBvaW50ZXIgdG8gdGhlIEJJT1MgZGF0YSBhcmVhICovCi1zdGF0aWMgaWJvb2wgICAgaGF2ZU1vdXNlID0gZmFsc2U7ICAgICAgLyogVHJ1ZSBpZiB3ZSBoYXZlIGEgbW91c2UgICAgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBFeHRlcm5hbCBhc3NlbWJsZXIgZnVuY3Rpb25zICovCi0KLXZvaWQgICAgRVZUQVBJIF9FVlRfcG9sbEpveXN0aWNrKHZvaWQpOwotdWludCAgICBFVlRBUEkgX0VWVF9kaXNhYmxlSW50KHZvaWQpOwotdWludCAgICBFVlRBUEkgX0VWVF9yZXN0b3JlSW50KHVpbnQgZmxhZ3MpOwotdm9pZCAgICBFVlRBUEkgX0VWVF9jb2RlU3RhcnQodm9pZCk7Ci12b2lkICAgIEVWVEFQSSBfRVZUX2NvZGVFbmQodm9pZCk7Ci12b2lkICAgIEVWVEFQSSBfRVZUX2NDb2RlU3RhcnQodm9pZCk7Ci12b2lkICAgIEVWVEFQSSBfRVZUX2NDb2RlRW5kKHZvaWQpOwotaW50ICAgICBFVlRBUEkgX0VWVF9nZXRLZXlDb2RlKHZvaWQpOwotdm9pZCAgICBFVlRBUEkgX0VWVF9wdW1wTWVzc2FnZXModm9pZCk7Ci1pbnQgICAgIEVWVEFQSSBFVlRfcmRpbngoaW50IHBvcnQsaW50IGluZGV4KTsKLXZvaWQgICAgRVZUQVBJIEVWVF93cmlueChpbnQgcG9ydCxpbnQgaW5kZXgsaW50IHZhbHVlKTsKLQotI2lmZGVmIE5PX0tFWUJPQVJEX0lOVEVSUlVQVAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcHVtcCBhbGwga2V5Ym9hcmQgbWVzc2FnZXMgZnJvbSB0aGUgQklPUyBrZXlib2FyZAotaGFuZGxlciBpbnRvIG91ciBldmVudCBxdWV1ZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBhdm9pZCB1c2luZyB0aGUKLWluc3RhbGxhYmxlIGtleWJvYXJkIGhhbmRsZXIgaWYgdGhpcyBpcyBjYXVzaW5nIHByb2JsZW1zLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEVWVEFQSSBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQotewotICAgIFJNUkVHUyAgcmVnczsKLQl1aW50ICAgIGtleSxwczsKLQotCS8qIFNpbmNlIHRoZSBrZXlib2FyZCBJU1IgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpZiBOT19JREVfQlVHIGhhcwotCSAqIGJlZW4gZGVmaW5lZCwgd2UgZmlyc3QgY2hlY2sgZm9yIGFueSBwZW5kaW5nIGtleWJvYXJkIGV2ZW50cwotCSAqIGhlcmUsIGFuZCBpZiB0aGVyZSBhcmUgc29tZSBpbnNlcnQgdGhlbSBpbnRvIHRoZSBldmVudCBxdWV1ZSB0bwotCSAqIGJlIHBpY2tlZCB1cCBsYXRlciAtIHdoYXQgYSBrbHVkZ2UuCi0JICovCi0Jd2hpbGUgKChrZXkgPSBfRVZUX2dldEtleUNvZGUoKSkgIT0gMCkgewotCQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOwotCQlhZGRLZXlFdmVudChFVlRfS0VZRE9XTiwga2V5KTsKLQkJX0VWVF9yZXN0b3JlSW50KHBzKTsKLQkJfQotCi0gICAgcmVncy54LmF4ID0gMHgwQjsgICAgICAgICAgIC8qIFJlc2V0IE1vdmUgTW91c2UgKi8KLSAgICBQTV9pbnQ4NigweDMzLCZyZWdzLCZyZWdzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB0aWNrcyBzaW5jZSBzeXN0ZW0KLXN0YXJ0dXAgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHBsYWNlZCBpbnRvCi10aGUgdGltZSBzdGFtcCBmaWVsZHMgb2YgZXZlbnRzLCBhbmQgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXV0byBtb3VzZSBkb3duCi1ldmVudHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX0VWVF9nZXRUaWNrcyh2b2lkKQotewotICAgIHJldHVybiAodWxvbmcpUE1fZ2V0TG9uZyhfRVZUX2Jpb3NQdHIrMHg2QykgKiA1NVVMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYm9vdHMgdGhlIG1hY2hpbmUgZnJvbSBET1MgKHdhcm0gYm9vdCkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBSZWJvb3Qodm9pZCkKLXsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0gICAgUE1TUkVHUyBzcmVnczsKLQotICAgIHVzaG9ydCAqcmVib290VHlwZSA9IFBNX21hcFJlYWxQb2ludGVyKDB4NDAsMHg3Mik7Ci0gICAgKnJlYm9vdFR5cGUgPSAweDEyMzQ7Ci0gICAgUE1fY2FsbFJlYWxNb2RlKDB4RkZGRiwweDAwMDAsJnJlZ3MsJnNyZWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbmNsdWRlIGdlbmVyaWMgcmF3IHNjYW5jb2RlIGtleWJvYXJkIG1vZHVsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFNVUFBPUlRfQ1RSTF9BTFRfREVMCi0jaW5jbHVkZSAiY29tbW9uL2tleWJvYXJkLmMiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBmb29scyB0aGUgRE9TIG1vdXNlIGRyaXZlciBpbnRvIHRoaW5raW5nIHRoYXQgaXQgaXMgcnVubmluZwotaW4gZ3JhcGhpY3MgbW9kZSwgcmF0aGVyIHRoYW4gdGV4dCBtb2RlIHNvIHdlIGFsd2F5cyBnZXQgdmlydHVhbCBjb29yZGluYXRlcwotY29ycmVjdGx5IHJhdGhlciB0aGFuIGNoYXJhY3RlciBjb29yZGluYXRlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgX0VWVF9mb29sTW91c2Uodm9pZCkKLXsKLSAgICBpbnQgb2xkbW9kZSA9IFBNX2dldEJ5dGUoX0VWVF9iaW9zUHRyKzB4NDkpOwotICAgIFBNX3NldEJ5dGUoX0VWVF9iaW9zUHRyKzB4NDksMHgxMCk7Ci0gICAgb2xkbW9kZSB8PSAoRVZUX3JkaW54KDB4M0M0LDB4MikgPDwgOCk7Ci0gICAgcmV0dXJuIG9sZG1vZGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiB1bmZvb2xzIHRoZSBET1MgbW91c2UgZHJpdmVyIGFmdGVyIHdlIGhhdmUgZmluaXNoZWQgY2FsbGluZyBpdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfdW5mb29sTW91c2UoCi0gICAgaW50IG9sZG1vZGUpCi17Ci0gICAgUE1fc2V0Qnl0ZShfRVZUX2Jpb3NQdHIrMHg0OSxvbGRtb2RlKTsKLQotICAgIC8qIFNvbWUgbW91c2UgZHJpdmVycyByZXNldCB0aGUgcGxhbmUgbWFzayByZWdpc3RlciBmb3IgVkdBIHBsYW5lIDQKLSAgICAgKiBtb2Rlcywgd2hpY2ggc2NyZXdzIHVwIHRoZSBkaXNwbGF5IG9uIHNvbWUgVkdBIGNvbXBhdGlibGUgY29udHJvbGxlcnMKLSAgICAgKiBpbiBTdXBlclZHQSBtb2Rlcy4gV2UgcmVzZXQgdGhlIHZhbHVlIGJhY2sgYWdhaW4gaW4gaGVyZSB0byBzb2x2ZQotICAgICAqIHRoZSBwcm9ibGVtLgotICAgICAqLwotICAgIEVWVF93cmlueCgweDNDNCwweDIsb2xkbW9kZSA+PiA4KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZXRlcm1pbmVzIGlmIHdlIGhhdmUgYSBtb3VzZSBhdHRhY2hlZCBhbmQgZnVuY3Rpb25pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIGRldGVjdE1vdXNlKHZvaWQpCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIFJNU1JFR1Mgc3JlZ3M7Ci0gICAgdWNoYXIgICAqcDsKLSAgICBpYm9vbCAgIHJldHZhbDsKLQotICAgIHJlZ3MueC5heCA9IDB4MzUzMzsgICAgICAgICAgICAgICAgIC8qIEdldCBpbnRlcnJ1cHQgdmVjdG9yIDB4MzMgICAgKi8KLSAgICBQTV9pbnQ4NngoMHgyMSwmcmVncywmcmVncywmc3JlZ3MpOwotCi0gICAgLyogQ2hlY2sgdGhhdCBpbnRlcnJ1cHQgdmVjdG9yIDB4MzMgaXMgbm90IGEgemVybywgYW5kIHRoYXQgdGhlIGZpcnN0Ci0gICAgICogaW5zdHJ1Y3Rpb24gaW4gdGhlIGludGVycnVwdCB2ZWN0b3IgaXMgbm90IGFuIElSRVQgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSAgICBwID0gUE1fbWFwUmVhbFBvaW50ZXIoc3JlZ3MuZXMsIHJlZ3MueC5ieCk7Ci0gICAgcmV0dmFsID0gKChzcmVncy5lcyAhPSAwKSB8fCAocmVncy54LmJ4ICE9IDApKSAmJiAoUE1fZ2V0Qnl0ZShwKSAhPSAyMDcpOwotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotd2hhdCAgICAgICAgLSBFdmVudCBjb2RlCi1tZXNzYWdlICAgICAtIEV2ZW50IG1lc3NhZ2UKLXgseSAgICAgICAgIC0gTW91c2UgcG9zaXRpb24gYXQgdGltZSBvZiBldmVudAotYnV0X3N0YXQgICAgLSBNb3VzZSBidXR0b24gc3RhdHVzIGF0IHRpbWUgb2YgZXZlbnQKLQotUkVNQVJLUzoKLUFkZHMgYSBuZXcgbW91c2UgZXZlbnQgdG8gdGhlIGV2ZW50IHF1ZXVlLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gd2l0aGluCi10aGUgbW91c2UgaW50ZXJydXB0IHN1YnJvdXRpbmUsIHNvIGl0IG11c3QgYmUgZWZmaWNpZW50LgotCi1OT1RFOiAgIEludGVycnVwdHMgTVVTVCBiZSBPRkYgd2hpbGUgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBlbnN1cmUgd2UgaGF2ZQotCW11dHVhbGx5IGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gb3VyIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyBmb3IKLQlpbnRlcnJ1cHQgZHJpdmVuIHN5c3RlbXMgKGxpa2UgdW5kZXIgRE9TKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhZGRNb3VzZUV2ZW50KAotICAgIHVpbnQgd2hhdCwKLSAgICB1aW50IG1lc3NhZ2UsCi0gICAgaW50IHgsCi0gICAgaW50IHksCi0gICAgaW50IG1pY2tleVgsCi0gICAgaW50IG1pY2tleVksCi0gICAgdWludCBidXRfc3RhdCkKLXsKLSAgICBldmVudF90IGV2dDsKLQotICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0JLyogU2F2ZSBpbmZvcm1hdGlvbiBpbiBldmVudCByZWNvcmQuICovCi0JZXZ0LndoZW4gPSBfRVZUX2dldFRpY2tzKCk7Ci0JZXZ0LndoYXQgPSB3aGF0OwotCWV2dC5tZXNzYWdlID0gbWVzc2FnZTsKLQlldnQubW9kaWZpZXJzID0gYnV0X3N0YXQ7Ci0JZXZ0LndoZXJlX3ggPSB4OyAgICAgICAgICAgICAgICAvKiBTYXZlIG1vdXNlIGV2ZW50IHBvc2l0aW9uICAgICovCi0JZXZ0LndoZXJlX3kgPSB5OwotCWV2dC5yZWxhdGl2ZV94ID0gbWlja2V5WDsKLQlldnQucmVsYXRpdmVfeSA9IG1pY2tleVk7Ci0JZXZ0Lm1vZGlmaWVycyB8PSBFVlQua2V5TW9kaWZpZXJzOwotCWFkZEV2ZW50KCZldnQpOyAgICAgICAgICAgICAgICAgLyogQWRkIHRvIHRhaWwgb2YgZXZlbnQgcXVldWUgICAqLwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tYXNrICAgICAgICAtIEV2ZW50IG1hc2sKLWJ1dHN0YXRlICAgIC0gQnV0dG9uIHN0YXRlCi14ICAgICAgICAgICAtIE1vdXNlIHggY29vcmRpbmF0ZQoteSAgICAgICAgICAgLSBNb3VzZSB5IGNvb3JkaW5hdGUKLQotUkVNQVJLUzoKLU1vdXNlIGV2ZW50IGhhbmRsaW5nIHJvdXRpbmUuIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhIG1vdXNlIGV2ZW50IG9jY3VycywKLWFuZCB3ZSBjYWxsIHRoZSBhZGRNb3VzZUV2ZW50KCkgcm91dGluZSB0byBhZGQgdGhlIGFwcHJvcHJpYXRlIG1vdXNlIGV2ZW50Ci10byB0aGUgZXZlbnQgcXVldWUuCi0KLU5vdGU6IEludGVycnVwdHMgYXJlIE9OIHdoZW4gdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgbW91c2UgZHJpdmVyIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRVZUQVBJIG1vdXNlSVNSKAotICAgIHVpbnQgbWFzaywKLSAgICB1aW50IGJ1dHN0YXRlLAotICAgIGludCB4LAotICAgIGludCB5LAotICAgIGludCBtaWNrZXlYLAotICAgIGludCBtaWNrZXlZKQotewotICAgIHVpbnQgICAgcHM7Ci0gICAgdWludCAgICBidXR0b25NYXNrOwotCi0gICAgaWYgKG1hc2sgJiAxKSB7Ci0JLyogU2F2ZSB0aGUgY3VycmVudCBtb3VzZSBjb29yZGluYXRlcyAqLwotCUVWVC5teCA9IHg7IEVWVC5teSA9IHk7Ci0KLQkvKiBJZiB0aGUgbGFzdCBldmVudCB3YXMgYSBtb3ZlbWVudCBldmVudCwgdGhlbiBtb2RpZnkgdGhlIGxhc3QKLQkgKiBldmVudCByYXRoZXIgdGhhbiBwb3N0IGEgbmV3IG9uZSwgc28gdGhhdCB0aGUgcXVldWUgd2lsbCBub3QKLQkgKiBiZWNvbWUgc2F0dXJhdGVkLiBCZWZvcmUgd2UgbW9kaWZ5IHRoZSBkYXRhIHN0cnVjdHVyZXMsIHdlCi0JICogTVVTVCBlbnN1cmUgdGhhdCBpbnRlcnJ1cHRzIGFyZSBvZmYuCi0JICovCi0JcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsKLQlpZiAoRVZULm9sZE1vdmUgIT0gLTEpIHsKLQkgICAgRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3ggPSB4OyAgLyogTW9kaWZ5IGV4aXN0aW5nIG9uZSAgKi8KLQkgICAgRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3kgPSB5OwotCSAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ucmVsYXRpdmVfeCArPSBtaWNrZXlYOwotCSAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ucmVsYXRpdmVfeSArPSBtaWNrZXlZOwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIEVWVC5vbGRNb3ZlID0gRVZULmZyZWVIZWFkOyAgICAgICAgIC8qIFNhdmUgaWQgb2YgdGhpcyBtb3ZlIGV2ZW50ICAgKi8KLQkgICAgYWRkTW91c2VFdmVudChFVlRfTU9VU0VNT1ZFLDAseCx5LG1pY2tleVgsbWlja2V5WSxidXRzdGF0ZSk7Ci0JICAgIH0KLQlfRVZUX3Jlc3RvcmVJbnQocHMpOwotCX0KLSAgICBpZiAobWFzayAmIDB4MkEpIHsKLQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOwotCWJ1dHRvbk1hc2sgPSAwOwotCWlmIChtYXNrICYgMikgIGJ1dHRvbk1hc2sgfD0gRVZUX0xFRlRCTUFTSzsKLQlpZiAobWFzayAmIDgpICBidXR0b25NYXNrIHw9IEVWVF9SSUdIVEJNQVNLOwotCWlmIChtYXNrICYgMzIpIGJ1dHRvbk1hc2sgfD0gRVZUX01JRERMRUJNQVNLOwotCWFkZE1vdXNlRXZlbnQoRVZUX01PVVNFRE9XTixidXR0b25NYXNrLHgseSwwLDAsYnV0c3RhdGUpOwotCUVWVC5vbGRNb3ZlID0gLTE7Ci0JX0VWVF9yZXN0b3JlSW50KHBzKTsKLQl9Ci0gICAgaWYgKG1hc2sgJiAweDU0KSB7Ci0JcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsKLQlidXR0b25NYXNrID0gMDsKLQlpZiAobWFzayAmIDIpICBidXR0b25NYXNrIHw9IEVWVF9MRUZUQk1BU0s7Ci0JaWYgKG1hc2sgJiA4KSAgYnV0dG9uTWFzayB8PSBFVlRfUklHSFRCTUFTSzsKLQlpZiAobWFzayAmIDMyKSBidXR0b25NYXNrIHw9IEVWVF9NSURETEVCTUFTSzsKLQlhZGRNb3VzZUV2ZW50KEVWVF9NT1VTRVVQLGJ1dHRvbk1hc2sseCx5LDAsMCxidXRzdGF0ZSk7Ci0JRVZULm9sZE1vdmUgPSAtMTsKLQlfRVZUX3Jlc3RvcmVJbnQocHMpOwotCX0KLSAgICBFVlQub2xkS2V5ID0gLTE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotS2V5Ym9hcmQgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24uCi0KLU5PVEU6ICAgSW50ZXJydXB0cyBhcmUgT0ZGIHdoZW4gdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUga2V5Ym9hcmQgSVNSLAotCWFuZCB3ZSBsZWF2ZSB0aGVtIE9GRiB0aGUgZW50aXJlIHRpbWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRVZUQVBJIGtleWJvYXJkSVNSKHZvaWQpCi17Ci0gICAgcHJvY2Vzc1Jhd1NjYW5Db2RlKFBNX2lucGIoMHg2MCkpOwotICAgIFBNX291dHBiKDB4MjAsMHgyMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2FmZWx5IGFib3J0IHRoZSBldmVudCBtb2R1bGUgdXBvbiBjYXRjaGluZyBhIGZhdGFsIGVycm9yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9hYm9ydCgpCi17Ci0gICAgRVZUX2V4aXQoKTsKLSAgICBQTV9mYXRhbEVycm9yKCJVbmhhbmRsZWQgZXhjZXB0aW9uISIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1vdXNlTW92ZSAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuZXZlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZAotCi1SRU1BUktTOgotSW5pdGlsaWFzZSB0aGUgZXZlbnQgaGFuZGxpbmcgbW9kdWxlLiBIZXJlIHdlIGluc3RhbGwgb3VyIG1vdXNlIGhhbmRsaW5nIElTUgotdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGFueSBidXR0b24ncyBhcmUgcHJlc3NlZCBvciByZWxlYXNlZC4gV2UgYWxzbyBidWlsZAotdGhlIGZyZWUgbGlzdCBvZiBldmVudHMgaW4gdGhlIGV2ZW50IHF1ZXVlLgotCi1XZSB1c2UgaGFuZGxlciBudW1iZXIgMiBvZiB0aGUgbW91c2UgbGlicmFyaWVzIGludGVycnVwdCBoYW5kbGVycyBmb3Igb3VyCi1ldmVudCBoYW5kbGluZyByb3V0aW5lcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfaW5pdCgKLSAgICBfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKQotewotICAgIGludCAgICAgaTsKLQotICAgIFBNX2luaXQoKTsKLSAgICBFVlQubW91c2VNb3ZlID0gbW91c2VNb3ZlOwotICAgIF9FVlRfYmlvc1B0ciA9IFBNX2dldEJJT1NQb2ludGVyKCk7Ci0gICAgRVZUX3Jlc3VtZSgpOwotCi0gICAgLyogR3JhYiBhbGwgY2hhcmFjdGVycyBwZW5kaW5nIGluIHRoZSBrZXlib2FyZCBidWZmZXIgYW5kIHN0dWZmCi0gICAgICogdGhlbSBpbnRvIG91ciBldmVudCBidWZmZXIuIFRoaXMgYWxsb3dzIHVzIHRvIHBpY2sgdXAgYW55IGtleXByZXNzZXMKLSAgICAgKiB3aGlsZSB0aGUgcHJvZ3JhbSBpcyBpbml0aWFsaXNpbmcuCi0gICAgICovCi0gICAgd2hpbGUgKChpID0gX0VWVF9nZXRLZXlDb2RlKCkpICE9IDApCi0JYWRkS2V5RXZlbnQoRVZUX0tFWURPV04saSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KLWNhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAotYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9yZXN1bWUodm9pZCkKLXsKLSAgICBzdGF0aWMgaW50ICAgICAgbG9ja2VkID0gMDsKLSAgICBpbnQgICAgICAgICAgICAgc3RhdDsKLSAgICB1Y2hhciAgICAgICAgICAgbW9kczsKLSAgICBQTV9sb2NrSGFuZGxlICAgbGg7IC8qIFVudXNlZCBpbiBET1MgKi8KLQotICAgIGlmIChfRVZUX3VzZUV2ZW50cykgewotCS8qIEluaXRpYWxpc2UgdGhlIGV2ZW50IHF1ZXVlIGFuZCBlbmFibGUgb3VyIGludGVycnVwdCBoYW5kbGVycyAqLwotCWluaXRFdmVudFF1ZXVlKCk7Ci0jaWZuZGVmIE5PX0tFWUJPQVJEX0lOVEVSUlVQVAotCVBNX3NldEtleUhhbmRsZXIoa2V5Ym9hcmRJU1IpOwotI2VuZGlmCi0jaWZuZGVmIE5PX01PVVNFX0lOVEVSUlVQVAotCWlmICgoaGF2ZU1vdXNlID0gZGV0ZWN0TW91c2UoKSkgIT0gMCkgewotCSAgICBpbnQgb2xkbW9kZSA9IF9FVlRfZm9vbE1vdXNlKCk7Ci0JICAgIFBNX3NldE1vdXNlSGFuZGxlcigweEZGRkYsbW91c2VJU1IpOwotCSAgICBfRVZUX3VuZm9vbE1vdXNlKG9sZG1vZGUpOwotCSAgICB9Ci0jZW5kaWYKLQotCS8qIFJlYWQgdGhlIGtleWJvYXJkIG1vZGlmaWVyIGZsYWdzIGZyb20gdGhlIEJJT1MgdG8gZ2V0IHRoZQotCSAqIGNvcnJlY3QgaW5pdGlhbGlzYXRpb24gc3RhdGUuIFRoZSBvbmx5IHN0YXRlIHdlIGNhcmUgYWJvdXQgaXMKLQkgKiB0aGUgY29ycmVjdCB0b2dnbGUgc3RhdGUgZmxhZ3Mgc3VjaCBhcyBTQ1JPTExMT0NLLCBOVU1MT0NLIGFuZAotCSAqIENBUFNMT0NLLgotCSAqLwotCUVWVC5rZXlNb2RpZmllcnMgPSAwOwotCW1vZHMgPSBQTV9nZXRCeXRlKF9FVlRfYmlvc1B0cisweDE3KTsKLQlpZiAobW9kcyAmIDB4MTApCi0JICAgIEVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX1NDUk9MTExPQ0s7Ci0JaWYgKG1vZHMgJiAweDIwKQotCSAgICBFVlQua2V5TW9kaWZpZXJzIHw9IEVWVF9OVU1MT0NLOwotCWlmIChtb2RzICYgMHg0MCkKLQkgICAgRVZULmtleU1vZGlmaWVycyB8PSBFVlRfQ0FQU0xPQ0s7Ci0KLQkvKiBMb2NrIGFsbCBvZiB0aGUgY29kZSBhbmQgZGF0YSB1c2VkIGJ5IG91ciBwcm90ZWN0ZWQgbW9kZSBpbnRlcnJ1cHQKLQkgKiBoYW5kbGluZyByb3V0aW5lcywgc28gdGhhdCBpdCB3aWxsIGNvbnRpbnVlIHRvIHdvcmsgY29ycmVjdGx5Ci0JICogdW5kZXIgcmVhbCBtb2RlLgotCSAqLwotCWlmICghbG9ja2VkKSB7Ci0JICAgIC8qIEl0IGlzIGRpZmZpY3VsdCB0byBlbnN1cmUgdGhhdCB3ZSBsb2NrIG91ciBnbG9iYWwgZGF0YSwgc28gd2UKLQkgICAgICogZG8gdGhpcyBieSB0YWtpbmcgdGhlIGFkZHJlc3Mgb2YgYSB2YXJpYWJsZSBsb2NraW5nIGFsbCBkYXRhCi0JICAgICAqIDJLYiBvbiBlaXRoZXIgc2lkZS4gVGhpcyBzaG91bGQgcHJvcGVybHkgY292ZXIgdGhlIGdsb2JhbCBkYXRhCi0JICAgICAqIHVzZWQgYnkgdGhlIG1vZHVsZSAodGhlIG90aGVyIGFsdGVybmF0aXZlIGlzIHRvIGRlY2xhcmUgdGhlCi0JICAgICAqIHZhcmlhYmxlcyBpbiBhc3NlbWJsZXIsIGluIHdoaWNoIGNhc2Ugd2Uga25vdyBpdCB3aWxsIGJlCi0JICAgICAqIGNvcnJlY3QpLgotCSAgICAgKi8KLQkgICAgc3RhdCAgPSAhUE1fbG9ja0RhdGFQYWdlcygmRVZULHNpemVvZihFVlQpLCZsaCk7Ci0JICAgIHN0YXQgfD0gIVBNX2xvY2tEYXRhUGFnZXMoJl9FVlRfYmlvc1B0cixzaXplb2YoX0VWVF9iaW9zUHRyKSwmbGgpOwotCSAgICBzdGF0IHw9ICFQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpX0VWVF9jQ29kZVN0YXJ0LChpbnQpX0VWVF9jQ29kZUVuZC0oaW50KV9FVlRfY0NvZGVTdGFydCwmbGgpOwotCSAgICBzdGF0IHw9ICFQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpX0VWVF9jb2RlU3RhcnQsKGludClfRVZUX2NvZGVFbmQtKGludClfRVZUX2NvZGVTdGFydCwmbGgpOwotCSAgICBpZiAoc3RhdCkgewotCQlQTV9mYXRhbEVycm9yKCJQYWdlIGxvY2tpbmcgc2VydmljZXMgZmFpbGVkIC0gaW50ZXJydXB0IGhhbmRsaW5nIG5vdCBzYWZlISIpOwotCQlleGl0KDEpOwotCQl9Ci0JICAgIGxvY2tlZCA9IDE7Ci0JICAgIH0KLQotCS8qIENhdGNoIHByb2dyYW0gdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KLQlzaWduYWwoU0lHQUJSVCwgX0VWVF9hYm9ydCk7Ci0Jc2lnbmFsKFNJR0ZQRSwgX0VWVF9hYm9ydCk7Ci0Jc2lnbmFsKFNJR0lOVCwgX0VWVF9hYm9ydCk7Ci0JX0VWVF9pbnN0YWxsZWQgPSB0cnVlOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUNoYW5nZXMgdGhlIHJhbmdlIG9mIGNvb3JkaW5hdGVzIHJldHVybmVkIGJ5IHRoZSBtb3VzZSBmdW5jdGlvbnMgdG8gdGhlCi1zcGVjaWZpZWQgcmFuZ2Ugb2YgdmFsdWVzLiBUaGlzIGlzIHVzZWQgd2hlbiBjaGFuZ2luZyBiZXR3ZWVuIGdyYXBoaWNzCi1tb2RlcyBzZXQgdGhlIHJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IGRpc3BsYXkgbW9kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZSgKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcykKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICBpZiAoaGF2ZU1vdXNlKSB7Ci0JaW50IG9sZG1vZGUgPSBfRVZUX2Zvb2xNb3VzZSgpOwotCVBNX3Jlc2V0TW91c2VEcml2ZXIoMSk7Ci0JcmVncy54LmF4ID0gNzsgIC8qIE1vdXNlIGZ1bmN0aW9uIDcgLSBTZXQgaG9yaXpvbnRhbCBtaW4gYW5kIG1heCAqLwotCXJlZ3MueC5jeCA9IDA7Ci0JcmVncy54LmR4ID0geFJlczsKLQlQTV9pbnQ4NigweDMzLCZyZWdzLCZyZWdzKTsKLQlyZWdzLnguYXggPSA4OyAgLyogTW91c2UgZnVuY3Rpb24gOCAtIFNldCB2ZXJ0aWNhbCBtaW4gYW5kIG1heCAgICovCi0JcmVncy54LmN4ID0gMDsKLQlyZWdzLnguZHggPSB5UmVzOwotCVBNX2ludDg2KDB4MzMsJnJlZ3MsJnJlZ3MpOwotCV9FVlRfdW5mb29sTW91c2Uob2xkbW9kZSk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotTW9kaWZlcyB0aGUgbW91c2UgY29vcmRpbmF0ZXMgYXMgbmVjZXNzYXJ5IGlmIHNjYWxpbmcgdG8gT1MgY29vcmRpbmF0ZXMsCi1hbmQgc2V0cyB0aGUgT1MgbW91c2UgY3Vyc29yIHBvc2l0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9zZXRNb3VzZVBvcygKLSAgICBpbnQgKngsCi0gICAgaW50ICp5KQotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIGlmIChoYXZlTW91c2UpIHsKLQlpbnQgb2xkbW9kZSA9IF9FVlRfZm9vbE1vdXNlKCk7Ci0JcmVncy54LmF4ID0gNDsgICAgICAvKiBNb3VzZSBmdW5jdGlvbiA0IC0gU2V0IG1vdXNlIHBvc2l0aW9uICAgICovCi0JcmVncy54LmN4ID0gKng7ICAgICAvKiBOZXcgaG9yaXpvbnRhbCBjb29yZGluYXRlICAgICAgICAgICAgICAgICovCi0JcmVncy54LmR4ID0gKnk7ICAgICAvKiBOZXcgdmVydGljYWwgY29vcmRpbmF0ZSAgICAgICAgICAgICAgICAgICovCi0JUE1faW50ODYoMHgzMywmcmVncywmcmVncyk7Ci0JX0VWVF91bmZvb2xNb3VzZShvbGRtb2RlKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1TdXNwZW5kcyBhbGwgb2Ygb3VyIGV2ZW50IGhhbmRsaW5nIG9wZXJhdGlvbnMuIFRoaXMgaXMgYWxzbyB1c2VkIHRvCi1kZS1pbnN0YWxsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zdXNwZW5kKHZvaWQpCi17Ci0gICAgdWNoYXIgICBtb2RzOwotCi0gICAgaWYgKF9FVlRfaW5zdGFsbGVkKSB7Ci0JLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IGhhbmRsZXJzICovCi0JUE1fcmVzdG9yZUtleUhhbmRsZXIoKTsKLQlpZiAoaGF2ZU1vdXNlKQotCSAgICBQTV9yZXN0b3JlTW91c2VIYW5kbGVyKCk7Ci0Jc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOwotCXNpZ25hbChTSUdGUEUsIFNJR19ERkwpOwotCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotCi0JLyogU2V0IHRoZSBrZXlib2FyZCBtb2RpZmllciBmbGFncyBpbiB0aGUgQklPUyB0byBvdXIgdmFsdWVzICovCi0JRVZUX2FsbG93TEVEUyh0cnVlKTsKLQltb2RzID0gUE1fZ2V0Qnl0ZShfRVZUX2Jpb3NQdHIrMHgxNykgJiB+MHg3MDsKLQlpZiAoRVZULmtleU1vZGlmaWVycyAmIEVWVF9TQ1JPTExMT0NLKQotCSAgICBtb2RzIHw9IDB4MTA7Ci0JaWYgKEVWVC5rZXlNb2RpZmllcnMgJiBFVlRfTlVNTE9DSykKLQkgICAgbW9kcyB8PSAweDIwOwotCWlmIChFVlQua2V5TW9kaWZpZXJzICYgRVZUX0NBUFNMT0NLKQotCSAgICBtb2RzIHw9IDB4NDA7Ci0JUE1fc2V0Qnl0ZShfRVZUX2Jpb3NQdHIrMHgxNyxtb2RzKTsKLQotCS8qIEZsYWcgdGhhdCB3ZSBhcmUgbm8gbG9uZ2VyIGluc3RhbGxlZCAqLwotCV9FVlRfaW5zdGFsbGVkID0gZmFsc2U7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9leGl0KHZvaWQpCi17Ci0gICAgRVZUX3N1c3BlbmQoKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL29zaGRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZThlMDAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgRE9TCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9wbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQ5ZTM0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9wbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAxNi8zMiBiaXQgRE9TCi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlICJ6dGltZXJjLmgiCi0jaW5jbHVkZSAibXRyci5oIgotI2luY2x1ZGUgInBtX2hlbHAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGRvcy5oPgotI2luY2x1ZGUgPGNvbmlvLmg+Ci0jaWZkZWYgIF9fR05VQ19fCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL25lYXJwdHIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxkaXJlY3QuaD4KLSNlbmRpZgotI2lmZGVmICBfX0JPUkxBTkRDX18KLSNwcmFnbWEgd2FybiAtcGFyCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCAgICAgb2xkTW9kZTsKLSAgICBpbnQgICAgIG9sZDUwTGluZXM7Ci0gICAgfSBET1Nfc3RhdGVCdWY7Ci0KLSNkZWZpbmUgTUFYX1JNX0JMT0NLUyAgIDEwCi0KLXN0YXRpYyBzdHJ1Y3QgewotICAgIHZvaWQgICAgKnA7Ci0gICAgdWludCAgICB0YWc7Ci0gICAgfSBybUJsb2Nrc1tNQVhfUk1fQkxPQ0tTXTsKLQotc3RhdGljIHVpbnQgICAgIFZFU0FCdWZfbGVuID0gMTAyNDsgICAgIC8qIExlbmd0aCBvZiB0aGUgVkVTQUJ1ZiBidWZmZXIgICAgICovCi1zdGF0aWMgdm9pZCAgICAgKlZFU0FCdWZfcHRyID0gTlVMTDsgICAgLyogTmVhciBwb2ludGVyIHRvIFZFU0FCdWYgICAgICAgICAgKi8KLXN0YXRpYyB1aW50ICAgICBWRVNBQnVmX3JzZWc7ICAgICAgICAgICAvKiBSZWFsIG1vZGUgc2VnbWVudCBvZiBWRVNBQnVmICAgICAqLwotc3RhdGljIHVpbnQgICAgIFZFU0FCdWZfcm9mZjsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBvZmZzZXQgb2YgVkVTQUJ1ZiAgICAgICovCi1zdGF0aWMgdm9pZCAgICAgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOwotdXNob3J0IF9WQVJBUEkgIF9QTV9zYXZlZERTID0gMDsKLSNpZmRlZiAgRE9TNEdXCi1zdGF0aWMgdWxvbmcgICAgUERCID0gMCwqcFBEQiA9IE5VTEw7Ci0jZW5kaWYKLSNpZm5kZWYgUkVBTE1PREUKLXN0YXRpYyBjaGFyICAgICBWWERfbmFtZVtdID0gUE1IRUxQX05BTUU7Ci1zdGF0aWMgY2hhciAgICAgVlhEX21vZHVsZVtdID0gUE1IRUxQX01PRFVMRTsKLXN0YXRpYyBjaGFyICAgICBWWERfRERCTmFtZVtdID0gUE1IRUxQX0REQk5BTUU7Ci1zdGF0aWMgdWludCAgICAgVlhEX3ZlcnNpb24gPSAtMTsKLXN0YXRpYyB1aW50ICAgICBWWERfbG9hZE9mZiA9IDA7Ci1zdGF0aWMgdWludCAgICAgVlhEX2xvYWRTZWwgPSAwOwotdWludCBfVkFSQVBJICAgIF9QTV9WWERfb2ZmID0gMDsKLXVpbnQgX1ZBUkFQSSAgICBfUE1fVlhEX3NlbCA9IDA7Ci1pbnQgX1ZBUkFQSSAgICAgX1BNX2hhdmVDYXVzZVdheSA9IC0xOwotCi0vKiBNZW1vcnkgbWFwcGluZyBjYWNoZSAqLwotCi0jZGVmaW5lIE1BWF9NRU1PUllfTUFQUElOR1MgMTAwCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWxvbmcgICBwaHlzaWNhbDsKLSAgICB1bG9uZyAgIGxpbmVhcjsKLSAgICB1bG9uZyAgIGxpbWl0OwotICAgIH0gbW1hcHBpbmc7Ci1zdGF0aWMgbW1hcHBpbmcgICAgIG1hcHNbTUFYX01FTU9SWV9NQVBQSU5HU10gPSB7MH07Ci1zdGF0aWMgaW50ICAgICAgICAgIG51bU1hcHMgPSAwOwotCi0vKiBQYWdlIHNpemVkIGJsb2NrIGNhY2hlICovCi0KLSNkZWZpbmUgUEFHRVNfUEVSX0JMT0NLICAgICAxMDAKLSNkZWZpbmUgRlJFRUxJU1RfTkVYVChwKSAgICAoKih2b2lkKiopKHApKQotdHlwZWRlZiBzdHJ1Y3QgcGFnZWJsb2NrIHsKLSAgICBzdHJ1Y3QgcGFnZWJsb2NrICAgICpuZXh0OwotICAgIHN0cnVjdCBwYWdlYmxvY2sgICAgKnByZXY7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAqZnJlZUxpc3RTdGFydDsKLSAgICB2b2lkICAgICAgICAgICAgICAgICpmcmVlTGlzdDsKLSAgICB2b2lkICAgICAgICAgICAgICAgICpmcmVlTGlzdEVuZDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGZyZWVDb3VudDsKLSAgICB9IHBhZ2VibG9jazsKLXN0YXRpYyBwYWdlYmxvY2sgICAgKnBhZ2VCbG9ja3MgPSBOVUxMOwotI2VuZGlmCi0KLS8qIFN0YXJ0IG9mIGFsbCBwYWdlIHRhYmxlcyBpbiBDYXVzZVdheSAqLwotCi0jZGVmaW5lIENXX1BBR0VfVEFCTEVfU1RBUlQgKDEwMjRVTCo0MDk2VUwqMTAyM1VMKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBFeHRlcm5hbCBhc3NlbWJsZXIgZnVuY3Rpb25zICovCi0KLXVsb25nICAgX0FTTUFQSSBfUE1fZ2V0UERCKHZvaWQpOwotaW50ICAgICBfQVNNQVBJIF9QTV9wYWdpbmdFbmFibGVkKHZvaWQpOwotdm9pZCAgICBfQVNNQVBJIF9QTV9WeERDYWxsKFZYRF9yZWdzICpyZWdzLHVpbnQgb2ZmLHVpbnQgc2VsKTsKLQotI2lmbmRlZiBSRUFMTU9ERQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FeGl0IGZ1bmN0aW9uIHRvIHVubG9hZCB0aGUgZHluYW1pY2FsbHkgbG9hZGVkIFZ4RAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFVubG9hZFZ4RCh2b2lkKQotewotICAgIFBNU1JFR1MgICAgIHNyZWdzOwotICAgIFZYRF9yZWdzICAgIHI7Ci0KLSAgICByLmVheCA9IDI7Ci0gICAgci5lYnggPSAwOwotICAgIHIuZWR4ID0gKHVpbnQpVlhEX21vZHVsZTsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0jaWZkZWYgIF9fMTZCSVRfXwotICAgIHIuZHMgPSAoKHVsb25nKVZYRF9tb2R1bGUpID4+IDE2OwotI2Vsc2UKLSAgICByLmRzID0gc3JlZ3MuZHM7Ci0jZW5kaWYKLSAgICByLmVzID0gc3JlZ3MuZXM7Ci0gICAgX1BNX1Z4RENhbGwoJnIsVlhEX2xvYWRPZmYsVlhEX2xvYWRTZWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUV4dGVybmFsIGZ1bmN0aW9uIHRvIGNhbGwgdGhlIFBNSEVMUCBoZWxwZXIgVnhELgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fVnhEQ2FsbCgKLSAgICBWWERfcmVncyAqcmVncykKLXsKLSAgICBpZiAoX1BNX1ZYRF9zZWwgIT0gMCB8fCBfUE1fVlhEX29mZiAhPSAwKQotCV9QTV9WeERDYWxsKHJlZ3MsX1BNX1ZYRF9vZmYsX1BNX1ZYRF9zZWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLUJDRCBjb2RlZCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgVnhELCBvciAwIGlmIG5vdCBsb2FkZWQgKGllOiAweDIwMiAtIDIuMikKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBWeEQgdGhhdCB3ZSBoYXZlIGNvbm5lY3RlZCB0by4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50IFBNQVBJIFBNSEVMUF9nZXRWZXJzaW9uKHZvaWQpCi17Ci0gICAgVlhEX3JlZ3MgICAgcjsKLQotICAgIC8qIENhbGwgdGhlIGhlbHBlciBWeEQgdG8gZGV0ZXJtaW5lIHRoZSB2ZXJzaW9uIG51bWJlciAqLwotICAgIGlmIChfUE1fVlhEX3NlbCAhPSAwIHx8IF9QTV9WWERfb2ZmICE9IDApIHsKLQltZW1zZXQoJnIsMCxzaXplb2YocikpOwotCXIuZWF4ID0gQVBJX05VTShQTUhFTFBfR0VUVkVSKTsKLQlfUE1fVnhEQ2FsbCgmcixfUE1fVlhEX29mZixfUE1fVlhEX3NlbCk7Ci0JcmV0dXJuIFZYRF92ZXJzaW9uID0gKHVpbnQpci5lYXg7Ci0JfQotICAgIHJldHVybiBWWERfdmVyc2lvbiA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUNvbm5lY3RzIHRvIHRoZSBoZWxwZXIgVnhEIGFuZCByZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlcgotCi1SRVRVUk5TOgotVHJ1ZSBpZiB0aGUgVnhEIHdhcyBmb3VuZCBhbmQgbG9hZGVkLCBmYWxzZSBvdGhlcndpc2UuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGNvbm5lY3RzIHRvIHRoZSBWeEQgKGxvYWRpbmcgaXQgaWYgaXQgaXMgZHluYW1pY2FsbHkgbG9hZGFibGUpCi1hbmQgcmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIFZ4RC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgUE1IRUxQX2Nvbm5lY3Qodm9pZCkKLXsKLSAgICBQTVJFR1MgICAgICByZWdzOwotICAgIFBNU1JFR1MgICAgIHNyZWdzOwotICAgIFZYRF9yZWdzICAgIHI7Ci0KLSAgICAvKiBCYWlsIGVhcmx5IGlmIHdlIGhhdmUgYWxyZWFkIGNvbm5lY3RlZCAqLwotICAgIGlmIChWWERfdmVyc2lvbiAhPSAtMSkKLQlyZXR1cm4gVlhEX3ZlcnNpb24gIT0gMDsKLQotICAgIC8qIEdldCB0aGUgc3RhdGljIFNEREhFTFAuVlhEIGVudHJ5IHBvaW50IGlmIGF2YWlsYWJsZSAqLwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZWdzLnguYXggPSAweDE2ODQ7Ci0gICAgcmVncy54LmJ4ID0gU0RESEVMUF9EZXZpY2VJRDsKLSAgICByZWdzLnguZGkgPSAwOwotICAgIHNyZWdzLmVzID0gMDsKLSAgICBQTV9pbnQzODZ4KDB4MkYsJnJlZ3MsJnJlZ3MsJnNyZWdzKTsKLSAgICBfUE1fVlhEX3NlbCA9IHNyZWdzLmVzOwotICAgIF9QTV9WWERfb2ZmID0gcmVncy54LmRpOwotICAgIGlmIChfUE1fVlhEX3NlbCAhPSAwIHx8IF9QTV9WWERfb2ZmICE9IDApIHsKLQlpZiAoUE1IRUxQX2dldFZlcnNpb24oKSA+PSBQTUhFTFBfVkVSU0lPTikKLQkgICAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgLyogSWYgd2UgZ2V0IGhlcmUsIHRoZW4gZWl0aGVyIFNEREhFTFAuVlhEIGlzIG5vdCBsb2FkZWQsIG9yIGl0IGlzIGFuCi0gICAgICogZWFybGllciB2ZXJzaW9uLiBJbiB0aGlzIGNhc2UgdHJ5IHRvIGR5bmFtaWNhbGx5IGxvYWQgdGhlIFBNSEVMUC5WWEQKLSAgICAgKiBoZWxwZXIgVnhEIGluc3RlYWQuCi0gICAgICovCi0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MueC5heCA9IDB4MTY4NDsKLSAgICByZWdzLnguYnggPSBWWERMRFJfRGV2aWNlSUQ7Ci0gICAgcmVncy54LmRpID0gMDsKLSAgICBzcmVncy5lcyA9IDA7Ci0gICAgUE1faW50Mzg2eCgweDJGLCZyZWdzLCZyZWdzLCZzcmVncyk7Ci0gICAgVlhEX2xvYWRTZWwgPSBzcmVncy5lczsKLSAgICBWWERfbG9hZE9mZiA9IHJlZ3MueC5kaTsKLSAgICBpZiAoVlhEX2xvYWRTZWwgPT0gMCAmJiBWWERfbG9hZE9mZiA9PSAwKQotCXJldHVybiBWWERfdmVyc2lvbiA9IDA7Ci0gICAgci5lYXggPSAxOwotICAgIHIuZWJ4ID0gMDsKLSAgICByLmVkeCA9ICh1aW50KVZYRF9uYW1lOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByLmRzID0gc3JlZ3MuZHM7Ci0gICAgci5lcyA9IHNyZWdzLmVzOwotICAgIF9QTV9WeERDYWxsKCZyLFZYRF9sb2FkT2ZmLFZYRF9sb2FkU2VsKTsKLSAgICBpZiAoci5lYXggIT0gMCkKLQlyZXR1cm4gVlhEX3ZlcnNpb24gPSAwOwotCi0gICAgLyogR2V0IHRoZSBkeW5hbWljIFZ4RCBlbnRyeSBwb2ludCBzbyB3ZSBjYW4gY2FsbCBpdCAqLwotICAgIGF0ZXhpdChVbmxvYWRWeEQpOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZWdzLnguYXggPSAweDE2ODQ7Ci0gICAgcmVncy54LmJ4ID0gMDsKLSAgICByZWdzLmUuZWRpID0gKHVpbnQpVlhEX0REQk5hbWU7Ci0gICAgUE1faW50Mzg2eCgweDJGLCZyZWdzLCZyZWdzLCZzcmVncyk7Ci0gICAgX1BNX1ZYRF9zZWwgPSBzcmVncy5lczsKLSAgICBfUE1fVlhEX29mZiA9IHJlZ3MueC5kaTsKLSAgICBpZiAoX1BNX1ZYRF9zZWwgPT0gMCAmJiBfUE1fVlhEX29mZiA9PSAwKQotCXJldHVybiBWWERfdmVyc2lvbiA9IDA7Ci0gICAgaWYgKFBNSEVMUF9nZXRWZXJzaW9uKCkgPj0gUE1IRUxQX1ZFUlNJT04pCi0JcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIFZYRF92ZXJzaW9uID0gMDsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFBNIGxpYnJhcnkuIEZpcnN0IHdlIHRyeSB0byBjb25uZWN0IHRvIGEgc3RhdGljIFNEREhFTFAuVlhECi1oZWxwZXIgVnhELCBhbmQgY2hlY2sgdGhhdCBpdCBpcyBhIHZlcnNpb24gd2UgY2FuIHVzZS4gSWYgbm90IHdlIHRyeSB0bwotZHluYW1pY2FsbHkgbG9hZCB0aGUgUE1IRUxQLlZYRCBoZWxwZXIgVnhECi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9pbml0KHZvaWQpCi17Ci0jaWZuZGVmIFJFQUxNT0RFCi0gICAgUE1SRUdTICByZWdzOwotCi0gICAgLyogQ2hlY2sgaWYgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgQ2F1c2VXYXkgdW5kZXIgcmVhbCBET1MgKi8KLSAgICBpZiAoX1BNX2hhdmVDYXVzZVdheSA9PSAtMSkgewotCS8qIENoZWNrIGlmIHdlIGFyZSBydW5uaW5nIHVuZGVyIERQTUkgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsIG5vdCBiZQotCSAqIGFibGUgdG8gdXNlIG91ciBzcGVjaWFsIHJpbmcgMCBDYXVzZVdheSBmdW5jdGlvbnMuCi0JICovCi0JX1BNX2hhdmVDYXVzZVdheSA9IGZhbHNlOwotCXJlZ3MueC5heCA9IDB4RkYwMDsKLQlQTV9pbnQzODYoMHgzMSwmcmVncywmcmVncyk7Ci0JaWYgKHJlZ3MueC5jZmxhZyB8fCAhKHJlZ3MuZS5lZGkgJiA4KSkgewotCSAgICAvKiBXZSBhcmUgbm90IHVuZGVyIERQTUksIHNvIG5vdyBjaGVjayBpZiBDYXVzZVdheSBpcyBhY3RpdmUgKi8KLQkgICAgcmVncy54LmF4ID0gMHhGRkY5OwotCSAgICBQTV9pbnQzODYoMHgzMSwmcmVncywmcmVncyk7Ci0JICAgIGlmICghcmVncy54LmNmbGFnICYmIHJlZ3MuZS5lY3ggPT0gMHg0MzQxNTU1MyAmJiByZWdzLmUuZWR4ID09IDB4NDU1NzQxNTkpCi0JCV9QTV9oYXZlQ2F1c2VXYXkgPSB0cnVlOwotCSAgICB9Ci0KLQkvKiBOb3cgY29ubmVjdCB0byBQTUhFTFAuVlhEIGFuZCBpbml0aWFsaXNlIE1UUlIgbW9kdWxlICovCi0JaWYgKCFQTUhFTFBfY29ubmVjdCgpKQotCSAgICBNVFJSX2luaXQoKTsKLQl9Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCi1zaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgotdHlwZSAgICAtIFR5cGUgdG8gcGxhY2UgaW50byB0aGUgTVRSUiByZWdpc3RlcgotCi1SRVRVUk5TOgotRXJyb3IgY29kZSBkZXNjcmliaW5nIHRoZSByZXN1bHQuCi0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBlbmFibGUgd3JpdGUgY29tYmluaW5nIGZvciB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBvZiBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2VuYWJsZVdyaXRlQ29tYmluZSgKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIHNpemUsCi0gICAgdWludCB0eXBlKQotewotI2lmbmRlZiBSRUFMTU9ERQotICAgIFZYRF9yZWdzICAgIHJlZ3M7Ci0KLSAgICBpZiAoUE1IRUxQX2Nvbm5lY3QoKSkgewotCW1lbXNldCgmcmVncywwLHNpemVvZihyZWdzKSk7Ci0JcmVncy5lYXggPSBBUElfTlVNKFBNSEVMUF9FTkFCTEVMRkJDT01CKTsKLQlyZWdzLmVieCA9IGJhc2U7Ci0JcmVncy5lY3ggPSBzaXplOwotCXJlZ3MuZWR4ID0gdHlwZTsKLQlfUE1fVnhEQ2FsbCgmcmVncyxfUE1fVlhEX29mZixfUE1fVlhEX3NlbCk7Ci0JcmV0dXJuIHJlZ3MuZWF4OwotCX0KLSAgICByZXR1cm4gTVRSUl9lbmFibGVXcml0ZUNvbWJpbmUoYmFzZSxzaXplLHR5cGUpOwotI2Vsc2UKLSAgICByZXR1cm4gUE1fTVRSUl9OT1RfU1VQUE9SVEVEOwotI2VuZGlmCi19Ci0KLWlib29sIFBNQVBJIFBNX2hhdmVCSU9TQWNjZXNzKHZvaWQpCi17IHJldHVybiB0cnVlOyB9Ci0KLWxvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCi17IHJldHVybiBfT1NfRE9TOyB9Ci0KLWludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQotewotI2lmIGRlZmluZWQoUkVBTE1PREUpCi0gICAgcmV0dXJuIFBNX3JlYWxNb2RlOwotI2VsaWYgZGVmaW5lZChQTTI4NikKLSAgICByZXR1cm4gUE1fMjg2OwotI2VsaWYgZGVmaW5lZChQTTM4NikKLSAgICByZXR1cm4gUE1fMzg2OwotI2VuZGlmCi19Ci0KLXZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKGNoYXIgKnMpCi17Ci0gICAgdWludCBwb3MgPSBzdHJsZW4ocyk7Ci0gICAgaWYgKHNbcG9zLTFdICE9ICdcXCcpIHsKLQlzW3Bvc10gPSAnXFwnOwotCXNbcG9zKzFdID0gJ1wwJzsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCi0gICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQotewotICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCi0JZmF0YWxFcnJvckNsZWFudXAoKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiJXNcbiIsIG1zZyk7Ci0gICAgZXhpdCgxKTsKLX0KLQotc3RhdGljIHZvaWQgRXhpdFZCRUJ1Zih2b2lkKQotewotICAgIGlmIChWRVNBQnVmX3B0cikKLQlQTV9mcmVlUmVhbFNlZyhWRVNBQnVmX3B0cik7Ci0gICAgVkVTQUJ1Zl9wdHIgPSAwOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0VkVTQUJ1Zih1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKQotewotICAgIGlmICghVkVTQUJ1Zl9wdHIpIHsKLQkvKiBBbGxvY2F0ZSBhIGdsb2JhbCBidWZmZXIgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgVkVTQSBWQkUgKi8KLQlpZiAoKFZFU0FCdWZfcHRyID0gUE1fYWxsb2NSZWFsU2VnKFZFU0FCdWZfbGVuLCAmVkVTQUJ1Zl9yc2VnLCAmVkVTQUJ1Zl9yb2ZmKSkgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JYXRleGl0KEV4aXRWQkVCdWYpOwotCX0KLSAgICAqbGVuID0gVkVTQUJ1Zl9sZW47Ci0gICAgKnJzZWcgPSBWRVNBQnVmX3JzZWc7Ci0gICAgKnJvZmYgPSBWRVNBQnVmX3JvZmY7Ci0gICAgcmV0dXJuIFZFU0FCdWZfcHRyOwotfQotCi1pbnQgUE1BUEkgUE1faW50Mzg2KGludCBpbnRubywgUE1SRUdTICppbiwgUE1SRUdTICpvdXQpCi17Ci0gICAgUE1TUkVHUyBzcmVnczsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmV0dXJuIFBNX2ludDM4NngoaW50bm8saW4sb3V0LCZzcmVncyk7Ci19Ci0KLS8qIFJvdXRpbmVzIHRvIHNldCBhbmQgZ2V0IHRoZSByZWFsIG1vZGUgaW50ZXJydXB0IHZlY3RvcnMsIGJ5IG1ha2luZwotICogZGlyZWN0IHJlYWwgbW9kZSBjYWxscyB0byBET1MgYW5kIGJ5cGFzc2luZyB0aGUgRE9TIGV4dGVuZGVycyBBUEkuCi0gKiBUaGlzIGlzIHRoZSBzYWZlc3Qgd2F5IHRvIGhhbmRsZSB0aGlzLCBhcyBzb21lIHNlcnZlcnMgdHJ5IHRvIGJlCi0gKiBzbWFydCBhYm91dCBjaGFuZ2luZyByZWFsIG1vZGUgdmVjdG9ycy4KLSAqLwotCi12b2lkIFBNQVBJIF9QTV9nZXRSTXZlY3QoaW50IGludG5vLCBsb25nICpyZWFsaXNyKQotewotICAgIFJNUkVHUyAgcmVnczsKLSAgICBSTVNSRUdTIHNyZWdzOwotCi0gICAgUE1fc2F2ZURTKCk7Ci0gICAgcmVncy5oLmFoID0gMHgzNTsKLSAgICByZWdzLmguYWwgPSBpbnRubzsKLSAgICBQTV9pbnQ4NngoMHgyMSwgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOwotICAgICpyZWFsaXNyID0gKChsb25nKXNyZWdzLmVzIDw8IDE2KSB8IHJlZ3MueC5ieDsKLX0KLQotdm9pZCBQTUFQSSBfUE1fc2V0Uk12ZWN0KGludCBpbnRubywgbG9uZyByZWFsaXNyKQotewotICAgIFJNUkVHUyAgcmVnczsKLSAgICBSTVNSRUdTIHNyZWdzOwotCi0gICAgUE1fc2F2ZURTKCk7Ci0gICAgcmVncy5oLmFoID0gMHgyNTsKLSAgICByZWdzLmguYWwgPSBpbnRubzsKLSAgICBzcmVncy5kcyA9IChpbnQpKHJlYWxpc3IgPj4gMTYpOwotICAgIHJlZ3MueC5keCA9IChpbnQpKHJlYWxpc3IgJiAweEZGRkYpOwotICAgIFBNX2ludDg2eCgweDIxLCAmcmVncywgJnJlZ3MsICZzcmVncyk7Ci19Ci0KLXZvaWQgUE1BUEkgX1BNX2FkZFJlYWxNb2RlQmxvY2sodm9pZCAqbWVtLHVpbnQgdGFnKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9STV9CTE9DS1M7IGkrKykgewotCWlmIChybUJsb2Nrc1tpXS5wID09IE5VTEwpIHsKLQkgICAgcm1CbG9ja3NbaV0ucCA9IG1lbTsKLQkgICAgcm1CbG9ja3NbaV0udGFnID0gdGFnOwotCSAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgUE1fZmF0YWxFcnJvcigiVG8gbWFueSByZWFsIG1vZGUgbWVtb3J5IGJsb2NrIGFsbG9jYXRpb25zISIpOwotfQotCi11aW50IFBNQVBJIF9QTV9maW5kUmVhbE1vZGVCbG9jayh2b2lkICptZW0pCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1JNX0JMT0NLUzsgaSsrKSB7Ci0JaWYgKHJtQmxvY2tzW2ldLnAgPT0gbWVtKQotCSAgICByZXR1cm4gcm1CbG9ja3NbaV0udGFnOwotCX0KLSAgICBQTV9mYXRhbEVycm9yKCJDb3VsZCBub3QgZmluZCBwcmlvciByZWFsIG1vZGUgbWVtb3J5IGJsb2NrIGFsbG9jYXRpb24hIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKLSAgICBjaGFyICpwYXRoLAotICAgIGludCBtYXhMZW4pCi17Ci0gICAgcmV0dXJuIGdldGN3ZChwYXRoLG1heExlbik7Ci19Ci0KLWNoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCi17IHJldHVybiAnQyc7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQoteyByZXR1cm4gImM6XFwiOyB9Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLSAgICBjaGFyICAgICAgICAqZW52OwotCi0gICAgaWYgKChlbnYgPSBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpKSAhPSBOVUxMKQotCXJldHVybiBlbnY7Ci0gICAgaWYgKChlbnYgPSBnZXRlbnYoIldJTkJPT1RESVIiKSkgIT0gTlVMTCkgewotCS8qIFJ1bm5pbmcgaW4gYSBXaW5kb3dzIDl4IERPUyBib3ggb3IgRE9TIG1vZGUgKi8KLQlzdHJjcHkocGF0aCxlbnYpOwotCXN0cmNhdChwYXRoLCJcXHN5c3RlbVxcbnVjbGV1cyIpOwotCXJldHVybiBwYXRoOwotCX0KLSAgICBpZiAoKGVudiA9IGdldGVudigiU3lzdGVtUm9vdCIpKSAhPSBOVUxMKSB7Ci0JLyogUnVubmluZyBpbiBhbiBOVC8ySyBET1MgYm94ICovCi0Jc3RyY3B5KHBhdGgsZW52KTsKLQlzdHJjYXQocGF0aCwiXFxzeXN0ZW0zMlxcbnVjbGV1cyIpOwotCXJldHVybiBwYXRoOwotCX0KLSAgICByZXR1cm4gImM6XFxudWNsZXVzIjsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOwotICAgIHN0cmNweShwYXRoLFBNX2dldE51Y2xldXNQYXRoKCkpOwotICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKLSAgICBzdHJjYXQocGF0aCwiY29uZmlnIik7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKQoteyByZXR1cm4gIkRPUyI7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCi17IHJldHVybiAiRE9TIjsgfQotCi1pbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKLXsKLSAgICByZXR1cm4ga2JoaXQoKTsKLX0KLQotaW50IFBNQVBJIFBNX2dldGNoKHZvaWQpCi17Ci0gICAgcmV0dXJuIGdldGNoKCk7Ci19Ci0KLVBNX0hXTkQgUE1BUEkgUE1fb3BlbkNvbnNvbGUoUE1fSFdORCBod25kVXNlcixpbnQgZGV2aWNlLGludCB4UmVzLGludCB5UmVzLGludCBicHAsaWJvb2wgZnVsbFNjcmVlbikKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgRE9TICovCi0gICAgKHZvaWQpaHduZFVzZXI7Ci0gICAgKHZvaWQpZGV2aWNlOwotICAgICh2b2lkKXhSZXM7Ci0gICAgKHZvaWQpeVJlczsKLSAgICAodm9pZClicHA7Ci0gICAgKHZvaWQpZnVsbFNjcmVlbjsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKLXsKLSAgICByZXR1cm4gc2l6ZW9mKERPU19zdGF0ZUJ1Zik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSh2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIFJNUkVHUyAgICAgICAgICByZWdzOwotICAgIERPU19zdGF0ZUJ1ZiAgICAqc2IgPSBzdGF0ZUJ1ZjsKLQotICAgIC8qIFNhdmUgdGhlIG9sZCB2aWRlbyBtb2RlIHN0YXRlICovCi0gICAgcmVncy5oLmFoID0gMHgwRjsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICBzYi0+b2xkTW9kZSA9IHJlZ3MuaC5hbCAmIDB4N0Y7Ci0gICAgc2ItPm9sZDUwTGluZXMgPSBmYWxzZTsKLSAgICBpZiAoc2ItPm9sZE1vZGUgPT0gMHgzKSB7Ci0JcmVncy54LmF4ID0gMHgxMTMwOwotCXJlZ3MueC5ieCA9IDA7Ci0JcmVncy54LmR4ID0gMDsKLQlQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLQlzYi0+b2xkNTBMaW5lcyA9IChyZWdzLmguZGwgPT0gNDIgfHwgcmVncy5oLmRsID09IDQ5KTsKLQl9Ci0gICAgKHZvaWQpaHduZENvbnNvbGU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKGludCAoX0FTTUFQSVAgc2F2ZVN0YXRlKShpbnQgZmxhZ3MpKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBET1MgKi8KLSAgICAodm9pZClzYXZlU3RhdGU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShjb25zdCB2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIFJNUkVHUyAgICAgICAgICAgICAgcmVnczsKLSAgICBjb25zdCBET1Nfc3RhdGVCdWYgICpzYiA9IHN0YXRlQnVmOwotCi0gICAgLyogUmV0b3JlIDUwIGxpbmUgbW9kZSBpZiBzZXQgKi8KLSAgICBpZiAoc2ItPm9sZDUwTGluZXMpIHsKLQlyZWdzLnguYXggPSAweDExMTI7Ci0JcmVncy54LmJ4ID0gMDsKLQlQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLQl9Ci0gICAgKHZvaWQpaHduZENvbnNvbGU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fY2xvc2VDb25zb2xlKFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIERPUyAqLwotICAgICh2b2lkKWh3bmRDb25zb2xlOwotfQotCi12b2lkIFBNQVBJIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24oaW50IHgsaW50IHkpCi17Ci0gICAgdWNoYXIgKl9iaW9zUHRyID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKLSAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4NTAseCk7Ci0gICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDUxLHkpOwotfQotCi12b2lkIFBNQVBJIFBNX3NldE9TU2NyZWVuV2lkdGgoaW50IHdpZHRoLGludCBoZWlnaHQpCi17Ci0gICAgdWNoYXIgKl9iaW9zUHRyID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKLSAgICBQTV9zZXRXb3JkKF9iaW9zUHRyKzB4NEEsd2lkdGgpOwotICAgIFBNX3NldFdvcmQoX2Jpb3NQdHIrMHg0Qyx3aWR0aCoyKTsKLSAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4ODQsaGVpZ2h0LTEpOwotICAgIGlmIChoZWlnaHQgPiAyNSkgewotCVBNX3NldFdvcmQoX2Jpb3NQdHIrMHg2MCwweDA2MDcpOwotCVBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg4NSwweDA4KTsKLQl9Ci0gICAgZWxzZSB7Ci0JUE1fc2V0V29yZChfYmlvc1B0cisweDYwLDB4MEQwRSk7Ci0JUE1fc2V0Qnl0ZShfYmlvc1B0cisweDg1LDB4MDE2KTsKLQl9Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYWxsb2NTaGFyZWQobG9uZyBzaXplKQotewotICAgIHJldHVybiBQTV9tYWxsb2Moc2l6ZSk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCh2b2lkICpwdHIpCi17Ci0gICAgUE1fZnJlZShwdHIpOwotfQotCi0jZGVmaW5lIEdldFJNVmVjdChpbnRubyxpc3IpICAgICooaXNyKSA9ICgodWxvbmcqKXJtWmVyb1B0cilbaW50bm9dCi0jZGVmaW5lIFNldFJNVmVjdChpbnRubyxpc3IpICAgICgodWxvbmcqKXJtWmVyb1B0cilbaW50bm9dID0gKGlzcikKLQotaWJvb2wgUE1BUEkgUE1fZG9CSU9TUE9TVCgKLSAgICB1c2hvcnQgYXhWYWwsCi0gICAgdWxvbmcgQklPU1BoeXNBZGRyLAotICAgIHZvaWQgKm1hcHBlZEJJT1MsCi0gICAgdWxvbmcgQklPU0xlbikKLXsKLSAgICBzdGF0aWMgaW50ICAgICAgZmlyc3RUaW1lID0gdHJ1ZTsKLSAgICBzdGF0aWMgdWNoYXIgICAgKnJtWmVyb1B0cjsKLSAgICBsb25nICAgICAgICAgICAgQ3VycmVudDEwLEN1cnJlbnQ2RCxDdXJyZW50NDI7Ci0gICAgUk1SRUdTICAgICAgICAgIHJlZ3M7Ci0gICAgUk1TUkVHUyAgICAgICAgIHNyZWdzOwotCi0gICAgLyogQ3JlYXRlIGEgemVybyBtZW1vcnkgbWFwcGluZyBmb3IgdXMgdG8gdXNlICovCi0gICAgaWYgKGZpcnN0VGltZSkgewotCXJtWmVyb1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigwLDB4N0ZGRix0cnVlKTsKLQlmaXJzdFRpbWUgPSBmYWxzZTsKLQl9Ci0KLSAgICAvKiBSZW1hcCB0aGUgc2Vjb25kYXJ5IEJJT1MgdG8gMHhDMDAwMCBwaHlzaWNhbCAqLwotICAgIGlmIChCSU9TUGh5c0FkZHIgIT0gMHhDMDAwMEwgfHwgQklPU0xlbiA+IDMyNzY4KSB7Ci0JLyogRE9TIGNhbm5vdCB2aXJ0dWFsbHkgcmVtYXAgdGhlIEJJT1MsIHNvIHdlIGNhbiBvbmx5IHdvcmsgaWYgYWxsCi0JICogdGhlIHNlY29uZGFyeSBjb250cm9sbGVycyBhcmUgaWRlbnRpY2FsLCBhbmQgd2UgdGhlbiB1c2UgdGhlCi0JICogQklPUyBvbiB0aGUgZmlyc3QgY29udHJvbGxlciBmb3IgYWxsIHRoZSByZW1haW5pbmcgY29udHJvbGxlcnMuCi0JICoKLQkgKiBGb3IgT1MnZXMgdGhhdCBkbyB2aXJ0dWFsIG1lbW9yeSwgYW5kIHJlbWFwcGluZyBvZiAweEMwMDAwCi0JICogcGh5c2ljYWwgKHBlcmhhcHMgYSBjb3B5IG9uIHdyaXRlIG1hcHBpbmcpIHNob3VsZCBiZSBhbGwgdGhhdAotCSAqIGlzIG5lZWRlZC4KLQkgKi8KLQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgLyogU2F2ZSBjdXJyZW50IGhhbmRsZXJzIG9mIGludCAxMGggYW5kIDZEaCAqLwotICAgIEdldFJNVmVjdCgweDEwLCZDdXJyZW50MTApOwotICAgIEdldFJNVmVjdCgweDZELCZDdXJyZW50NkQpOwotCi0gICAgLyogUE9TVCB0aGUgc2Vjb25kYXJ5IEJJT1MgKi8KLSAgICBHZXRSTVZlY3QoMHg0MiwmQ3VycmVudDQyKTsKLSAgICBTZXRSTVZlY3QoMHgxMCxDdXJyZW50NDIpOyAgLyogUmVzdG9yZSBpbnQgMTBoIHRvIFNURC1CSU9TICovCi0gICAgcmVncy54LmF4ID0gYXhWYWw7Ci0gICAgUE1fY2FsbFJlYWxNb2RlKDB4QzAwMCwweDAwMDMsJnJlZ3MsJnNyZWdzKTsKLQotICAgIC8qIFJlc3RvcmUgY3VycmVudCBoYW5kbGVycyAqLwotICAgIFNldFJNVmVjdCgweDEwLEN1cnJlbnQxMCk7Ci0gICAgU2V0Uk1WZWN0KDB4NkQsQ3VycmVudDZEKTsKLQotICAgIC8qIFNlY29uZCB0aGUgcHJpbWFyeSBCSU9TIG1hcHBpbiAxOjEgZm9yIDB4QzAwMDAgcGh5c2ljYWwgKi8KLSAgICBpZiAoQklPU1BoeXNBZGRyICE9IDB4QzAwMDBMKSB7Ci0JLyogRE9TIGRvZXMgbm90IHN1cHBvcnQgdGhpcyAqLwotCSh2b2lkKW1hcHBlZEJJT1M7Ci0JfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFBNQVBJIFBNX3NsZWVwKHVsb25nIG1pbGxpc2Vjb25kcykKLXsKLSAgICB1bG9uZyAgICAgICAgICAgbWljcm9zZWNvbmRzID0gbWlsbGlzZWNvbmRzICogMTAwMEw7Ci0gICAgTFpUaW1lck9iamVjdCAgIHRtOwotCi0gICAgTFpUaW1lck9uRXh0KCZ0bSk7Ci0gICAgd2hpbGUgKExaVGltZXJMYXBFeHQoJnRtKSA8IG1pY3Jvc2Vjb25kcykKLQk7Ci0gICAgTFpUaW1lck9mZkV4dCgmdG0pOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKLXsKLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNGODsKLQljYXNlIDE6IHJldHVybiAweDJGODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQotewotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0JDOwotCWNhc2UgMTogcmV0dXJuIDB4Mzc4OwotCWNhc2UgMjogcmV0dXJuIDB4Mjc4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotUE1fTU9EVUxFIFBNQVBJIFBNX2xvYWRMaWJyYXJ5KAotICAgIGNvbnN0IGNoYXIgKnN6RExMTmFtZSkKLXsKLSAgICAodm9pZClzekRMTE5hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSwKLSAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQotewotICAgICh2b2lkKWhNb2R1bGU7Ci0gICAgKHZvaWQpc3pQcm9jTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSkKLXsKLSAgICAodm9pZCloTW9kdWxlOwotfQotCi1pbnQgUE1BUEkgUE1fc2V0SU9QTCgKLSAgICBpbnQgbGV2ZWwpCi17Ci0gICAgcmV0dXJuIGxldmVsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUludGVybmFsIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIGZpbmQgZGF0YSB0byB0aGUgZ2VuZXJpYyBpbnRlcmZhY2UuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY29udmVydEZpbmREYXRhKAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSwKLSAgICBzdHJ1Y3QgZmluZF90ICpibGspCi17Ci0gICAgdWxvbmcgICBkd1NpemUgPSBmaW5kRGF0YS0+ZHdTaXplOwotCi0gICAgbWVtc2V0KGZpbmREYXRhLDAsZmluZERhdGEtPmR3U2l6ZSk7Ci0gICAgZmluZERhdGEtPmR3U2l6ZSA9IGR3U2l6ZTsKLSAgICBpZiAoYmxrLT5hdHRyaWIgJiBfQV9SRE9OTFkpCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX1JFQURPTkxZOwotICAgIGlmIChibGstPmF0dHJpYiAmIF9BX1NVQkRJUikKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfRElSRUNUT1JZOwotICAgIGlmIChibGstPmF0dHJpYiAmIF9BX0FSQ0gpCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX0FSQ0hJVkU7Ci0gICAgaWYgKGJsay0+YXR0cmliICYgX0FfSElEREVOKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9ISURERU47Ci0gICAgaWYgKGJsay0+YXR0cmliICYgX0FfU1lTVEVNKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9TWVNURU07Ci0gICAgZmluZERhdGEtPnNpemVMbyA9IGJsay0+c2l6ZTsKLSAgICBzdHJuY3B5KGZpbmREYXRhLT5uYW1lLGJsay0+bmFtZSxQTV9NQVhfUEFUSCk7Ci0gICAgZmluZERhdGEtPm5hbWVbUE1fTUFYX1BBVEgtMV0gPSAwOwotfQotCi0jZGVmaW5lIEZJTkRfTUFTSyAgIChfQV9SRE9OTFkgfCBfQV9BUkNIIHwgX0FfU1VCRElSIHwgX0FfSElEREVOIHwgX0FfU1lTVEVNKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIHN0cnVjdCBmaW5kX3QgKmJsazsKLQotICAgIGlmICgoYmxrID0gUE1fbWFsbG9jKHNpemVvZigqYmxrKSkpID09IE5VTEwpCi0JcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKLSAgICBpZiAoX2Rvc19maW5kZmlyc3QoKGNoYXIqKWZpbGVuYW1lLEZJTkRfTUFTSyxibGspID09IDApIHsKLQljb252ZXJ0RmluZERhdGEoZmluZERhdGEsYmxrKTsKLQlyZXR1cm4gYmxrOwotCX0KLSAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCi0gICAgdm9pZCAqaGFuZGxlLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICBzdHJ1Y3QgZmluZF90ICpibGsgPSBoYW5kbGU7Ci0KLSAgICBpZiAoX2Rvc19maW5kbmV4dChibGspID09IDApIHsKLQljb252ZXJ0RmluZERhdGEoZmluZERhdGEsYmxrKTsKLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZpbmRDbG9zZSgKLSAgICB2b2lkICpoYW5kbGUpCi17Ci0gICAgUE1fZnJlZShoYW5kbGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGRyaXZlIGlzIGEgdmFsaWQgZHJpdmUgb3Igbm90LiBVbmRlciBVbml4IHRoaXMKLWZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbnl0aGluZyBleGNlcHQgYSB2YWx1ZSBvZiAzIChjb25zaWRlcmVkCi10aGUgcm9vdCBkcml2ZSwgYW5kIGVxdWl2YWxlbnQgdG8gQzogZm9yIG5vbi1Vbml4IHN5c3RlbXMpLiBUaGUgZHJpdmUKLW51bWJlcmluZyBpczoKLQotICAgIDEgICAtIERyaXZlIEE6Ci0gICAgMiAgIC0gRHJpdmUgQjoKLSAgICAzICAgLSBEcml2ZSBDOgotICAgIGV0YwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZHJpdmVWYWxpZCgKLSAgICBjaGFyIGRyaXZlKQotewotICAgIFJNUkVHUyAgcmVnczsKLSAgICByZWdzLmguZGwgPSAodWNoYXIpKGRyaXZlIC0gJ0EnICsgMSk7Ci0gICAgcmVncy5oLmFoID0gMHgzNjsgICAgICAgICAgICAgICAvKiBHZXQgZGlzayBpbmZvcm1hdGlvbiBzZXJ2aWNlICovCi0gICAgUE1faW50ODYoMHgyMSwmcmVncywmcmVncyk7Ci0gICAgcmV0dXJuIHJlZ3MueC5heCAhPSAweEZGRkY7ICAgICAvKiBBWCA9IDB4RkZGRiBpZiBkaXNrIGlzIGludmFsaWQgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgotVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCi1vZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKLSAgICBpbnQgZHJpdmUsCi0gICAgY2hhciAqZGlyLAotICAgIGludCBsZW4pCi17Ci0gICAgdWludCBvbGREcml2ZSxtYXhEcml2ZXM7Ci0gICAgX2Rvc19nZXRkcml2ZSgmb2xkRHJpdmUpOwotICAgIF9kb3Nfc2V0ZHJpdmUoZHJpdmUsJm1heERyaXZlcyk7Ci0gICAgZ2V0Y3dkKGRpcixsZW4pOwotICAgIF9kb3Nfc2V0ZHJpdmUob2xkRHJpdmUsJm1heERyaXZlcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIHVpbnQgYXR0cmliKQotewotI2lmIGRlZmluZWQoVE5UKSAmJiBkZWZpbmVkKF9NU0NfVkVSKQotICAgIERXT1JEIGF0dHIgPSAwOwotCi0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfUkVBRE9OTFkpCi0JYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9SRUFET05MWTsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9BUkNISVZFKQotCWF0dHIgfD0gRklMRV9BVFRSSUJVVEVfQVJDSElWRTsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9ISURERU4pCi0JYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9ISURERU47Ci0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfU1lTVEVNKQotCWF0dHIgfD0gRklMRV9BVFRSSUJVVEVfU1lTVEVNOwotICAgIFNldEZpbGVBdHRyaWJ1dGVzKChMUFNUUilmaWxlbmFtZSwgYXR0cik7Ci0jZWxzZQotICAgIHVpbnQgYXR0ciA9IDA7Ci0KLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9SRUFET05MWSkKLQlhdHRyIHw9IF9BX1JET05MWTsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9BUkNISVZFKQotCWF0dHIgfD0gX0FfQVJDSDsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9ISURERU4pCi0JYXR0ciB8PSBfQV9ISURERU47Ci0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfU1lTVEVNKQotCWF0dHIgfD0gX0FfU1lTVEVNOwotICAgIF9kb3Nfc2V0ZmlsZWF0dHIoZmlsZW5hbWUsYXR0cik7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fbWtkaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0jaWZkZWYgIF9fR05VQ19fCi0gICAgcmV0dXJuIG1rZGlyKGZpbGVuYW1lLFNfSVJVU1IpID09IDA7Ci0jZWxzZQotICAgIHJldHVybiBta2RpcihmaWxlbmFtZSkgPT0gMDsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ybWRpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICByZXR1cm4gcm1kaXIoZmlsZW5hbWUpID09IDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBHZW5lcmljIERQTUkgcm91dGluZXMgY29tbW9uIHRvIDE2LzMyIGJpdCBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBSRUFMTU9ERQotdWxvbmcgUE1BUEkgRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKHVsb25nIHBoeXNBZGRyLHVsb25nIGxpbWl0KQotewotICAgIFBNUkVHUyAgcjsKLSAgICBpbnQgICAgIGk7Ci0gICAgdWxvbmcgICBiYXNlQWRkcixiYXNlT2ZzLHJvdW5kZWRMaW1pdDsKLQotICAgIC8qIFdlIGNhbid0IG1hcCBtZW1vcnkgYmVsb3cgMU1iLCBidXQgdGhlIGxpbmVhciBhZGRyZXNzIGFyZSBhbHJlYWR5Ci0gICAgICogbWFwcGVkIDE6MSBmb3IgdGhpcyBtZW1vcnkgYW55d2F5IHNvIHdlIGp1c3QgcmV0dXJuIHRoZSBiYXNlIGFkZHJlc3MuCi0gICAgICovCi0gICAgaWYgKHBoeXNBZGRyIDwgMHgxMDAwMDBMKQotCXJldHVybiBwaHlzQWRkcjsKLQotICAgIC8qIFNlYXJjaCB0YWJsZSBvZiBleGlzdGluZyBtYXBwaW5ncyB0byBzZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IG1hcHBlZAotICAgICAqIGEgcmVnaW9uIG9mIG1lbW9yeSB0aGF0IHdpbGwgc2VydmUgdGhpcyBwdXJwb3NlLiBXZSBkbyB0aGlzIGJlY2F1c2UKLSAgICAgKiBEUE1JIDAuOSBkb2VzIG5vdCBhbGxvdyB1cyB0byBmcmVlIHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5ncywgYW5kIGlmCi0gICAgICogdGhlIG1hcHBpbmdzIGdldCByZS11c2VkIGluIHRoZSBwcm9ncmFtIHdlIHdhbnQgdG8gYXZvaWQgYWxsb2NhdGluZwotICAgICAqIG1vcmUgbWFwcGluZ3MgdGhhbiBuZWNlc3NhcnkuCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IG51bU1hcHM7IGkrKykgewotCWlmIChtYXBzW2ldLnBoeXNpY2FsID09IHBoeXNBZGRyICYmIG1hcHNbaV0ubGltaXQgPT0gbGltaXQpCi0JICAgIHJldHVybiBtYXBzW2ldLmxpbmVhcjsKLQl9Ci0KLSAgICAvKiBGaW5kIGEgZnJlZSBzbG90IGluIG91ciBwaHlzaWNhbCBtZW1vcnkgbWFwcGluZyB0YWJsZSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1NYXBzOyBpKyspIHsKLQlpZiAobWFwc1tpXS5saW1pdCA9PSAwKQotCSAgICBicmVhazsKLQl9Ci0gICAgaWYgKGkgPT0gbnVtTWFwcykgewotCWkgPSBudW1NYXBzKys7Ci0JaWYgKGkgPT0gTUFYX01FTU9SWV9NQVBQSU5HUykKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgLyogUm91bmQgdGhlIHBoeXNpY2FsIGFkZHJlc3MgdG8gYSA0S2IgYm91bmRhcnkgYW5kIHRoZSBsaW1pdCB0byBhCi0gICAgICogNEtiLTEgYm91bmRhcnkgYmVmb3JlIHBhc3NpbmcgdGhlIHZhbHVlcyB0byBEUE1JIGFzIHNvbWUgZXh0ZW5kZXJzCi0gICAgICogd2lsbCBmYWlsIHRoZSBjYWxscyB1bmxlc3MgdGhpcyBpcyB0aGUgY2FzZS4gSWYgd2Ugcm91bmQgdGhlCi0gICAgICogcGh5c2ljYWwgYWRkcmVzcywgdGhlbiB3ZSBhbHNvIGFkZCBhbiBleHRyYSBvZmZzZXQgaW50byB0aGUgYWRkcmVzcwotICAgICAqIHRoYXQgd2UgcmV0dXJuLgotICAgICAqLwotICAgIGJhc2VPZnMgPSBwaHlzQWRkciAmIDQwOTU7Ci0gICAgYmFzZUFkZHIgPSBwaHlzQWRkciAmIH40MDk1OwotICAgIHJvdW5kZWRMaW1pdCA9ICgobGltaXQrYmFzZU9mcysxKzQwOTUpICYgfjQwOTUpLTE7Ci0gICAgci54LmF4ID0gMHg4MDA7Ci0gICAgci54LmJ4ID0gYmFzZUFkZHIgPj4gMTY7Ci0gICAgci54LmN4ID0gYmFzZUFkZHIgJiAweEZGRkY7Ci0gICAgci54LnNpID0gcm91bmRlZExpbWl0ID4+IDE2OwotICAgIHIueC5kaSA9IHJvdW5kZWRMaW1pdCAmIDB4RkZGRjsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICBpZiAoci54LmNmbGFnKQotCXJldHVybiAweEZGRkZGRkZGVUw7Ci0gICAgbWFwc1tpXS5waHlzaWNhbCA9IHBoeXNBZGRyOwotICAgIG1hcHNbaV0ubGltaXQgPSBsaW1pdDsKLSAgICBtYXBzW2ldLmxpbmVhciA9ICgodWxvbmcpci54LmJ4IDw8IDE2KSArIHIueC5jeCArIGJhc2VPZnM7Ci0gICAgcmV0dXJuIG1hcHNbaV0ubGluZWFyOwotfQotCi1pbnQgUE1BUEkgRFBNSV9zZXRTZWxlY3RvckJhc2UodXNob3J0IHNlbCx1bG9uZyBsaW5BZGRyKQotewotICAgIFBNUkVHUyAgcjsKLQotICAgIHIueC5heCA9IDc7ICAgICAgICAgICAgICAgICAgICAgLyogRFBNSSBzZXQgc2VsZWN0b3IgYmFzZSBhZGRyZXNzICAgKi8KLSAgICByLnguYnggPSBzZWw7Ci0gICAgci54LmN4ID0gbGluQWRkciA+PiAxNjsKLSAgICByLnguZHggPSBsaW5BZGRyICYgMHhGRkZGOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIGlmIChyLnguY2ZsYWcpCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXVsb25nIFBNQVBJIERQTUlfZ2V0U2VsZWN0b3JCYXNlKHVzaG9ydCBzZWwpCi17Ci0gICAgUE1SRUdTICByOwotCi0gICAgci54LmF4ID0gNjsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIGdldCBzZWxlY3RvciBiYXNlIGFkZHJlc3MgICAqLwotICAgIHIueC5ieCA9IHNlbDsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICByZXR1cm4gKCh1bG9uZylyLnguY3ggPDwgMTYpICsgci54LmR4OwotfQotCi1pbnQgUE1BUEkgRFBNSV9zZXRTZWxlY3RvckxpbWl0KHVzaG9ydCBzZWwsdWxvbmcgbGltaXQpCi17Ci0gICAgUE1SRUdTICByOwotCi0gICAgci54LmF4ID0gODsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIHNldCBzZWxlY3RvciBsaW1pdCAgICAgICAgICAqLwotICAgIHIueC5ieCA9IHNlbDsKLSAgICByLnguY3ggPSBsaW1pdCA+PiAxNjsKLSAgICByLnguZHggPSBsaW1pdCAmIDB4RkZGRjsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICBpZiAoci54LmNmbGFnKQotCXJldHVybiAwOwotICAgIHJldHVybiAxOwotfQotCi11aW50IFBNQVBJIERQTUlfY3JlYXRlU2VsZWN0b3IodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCkKLXsKLSAgICB1aW50ICAgIHNlbDsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICAvKiBBbGxvY2F0ZSAxIGRlc2NyaXB0b3IgKi8KLSAgICByLnguYXggPSAwOwotICAgIHIueC5jeCA9IDE7Ci0gICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0gICAgaWYgKHIueC5jZmxhZykgcmV0dXJuIDA7Ci0gICAgc2VsID0gci54LmF4OwotCi0gICAgLyogU2V0IHRoZSBkZXNjcmlwdG9yIGFjY2VzcyByaWdodHMgKGZvciBhIDMyIGJpdCBwYWdlIGdyYW51bGFyCi0gICAgICogc2VnbWVudCkuCi0gICAgICovCi0gICAgaWYgKGxpbWl0ID49IDB4MTAwMDBMKSB7Ci0Jci54LmF4ID0gOTsKLQlyLnguYnggPSBzZWw7Ci0Jci54LmN4ID0gMHg0MEYzOwotCVBNX2ludDM4NigweDMxLCAmciwgJnIpOwotCX0KLQotICAgIC8qIE1hcCBwaHlzaWNhbCBtZW1vcnkgYW5kIGNyZWF0ZSBzZWxlY3RvciAqLwotICAgIGlmICgoYmFzZSA9IERQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcihiYXNlLGxpbWl0KSkgPT0gMHhGRkZGRkZGRlVMKQotCXJldHVybiAwOwotICAgIGlmICghRFBNSV9zZXRTZWxlY3RvckJhc2Uoc2VsLGJhc2UpKQotCXJldHVybiAwOwotICAgIGlmICghRFBNSV9zZXRTZWxlY3RvckxpbWl0KHNlbCxsaW1pdCkpCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHNlbDsKLX0KLQotdm9pZCBQTUFQSSBEUE1JX2ZyZWVTZWxlY3Rvcih1aW50IHNlbCkKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLnguYXggPSAxOwotICAgIHIueC5ieCA9IHNlbDsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLX0KLQotaW50IFBNQVBJIERQTUlfbG9ja0xpbmVhclBhZ2VzKHVsb25nIGxpbmVhcix1bG9uZyBsZW4pCi17Ci0gICAgUE1SRUdTICByOwotCi0gICAgci54LmF4ID0gMHg2MDA7ICAgICAgICAgICAgICAgICAgICAgLyogRFBNSSBMb2NrIExpbmVhciBSZWdpb24gICAgICAqLwotICAgIHIueC5ieCA9IChsaW5lYXIgPj4gMTYpOyAgICAgICAgICAgIC8qIExpbmVhciBhZGRyZXNzIGluIEJYOkNYICAgICAgKi8KLSAgICByLnguY3ggPSAobGluZWFyICYgMHhGRkZGKTsKLSAgICByLnguc2kgPSAobGVuID4+IDE2KTsgICAgICAgICAgICAgICAvKiBMZW5ndGggaW4gU0k6REkgICAgICAgICAgICAgICovCi0gICAgci54LmRpID0gKGxlbiAmIDB4RkZGRik7Ci0gICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0gICAgcmV0dXJuICghci54LmNmbGFnKTsKLX0KLQotaW50IFBNQVBJIERQTUlfdW5sb2NrTGluZWFyUGFnZXModWxvbmcgbGluZWFyLHVsb25nIGxlbikKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLnguYXggPSAweDYwMTsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIFVubG9jayBMaW5lYXIgUmVnaW9uICAgICovCi0gICAgci54LmJ4ID0gKGxpbmVhciA+PiAxNik7ICAgICAgICAgICAgLyogTGluZWFyIGFkZHJlc3MgaW4gQlg6Q1ggICAgICAqLwotICAgIHIueC5jeCA9IChsaW5lYXIgJiAweEZGRkYpOwotICAgIHIueC5zaSA9IChsZW4gPj4gMTYpOyAgICAgICAgICAgICAgIC8qIExlbmd0aCBpbiBTSTpESSAgICAgICAgICAgICAgKi8KLSAgICByLnguZGkgPSAobGVuICYgMHhGRkZGKTsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICByZXR1cm4gKCFyLnguY2ZsYWcpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFkanVzdCB0aGUgcGFnZSB0YWJsZSBjYWNoaW5nIGJpdHMgZGlyZWN0bHkuIFJlcXVpcmVzIHJpbmcgMCBhY2Nlc3MgYW5kCi1vbmx5IHdvcmtzIHdpdGggRE9TNEdXIGFuZCBjb21wYXRpYmxlIGV4dGVuZGVycyAoQ2F1c2VXYXkgYWxzbyB3b3JrcyBzaW5jZQotaXQgaGFzIGRpcmVjdCBzdXBwb3J0IGZvciB0aGUgcmluZyAwIGluc3RydWN0aW9ucyB3ZSBuZWVkIGZyb20gcmluZyAzKS4gV2lsbAotbm90IHdvcmsgaW4gYSBET1MgYm94LCBidXQgd2UgY2FsbCBpbnRvIHRoZSByaW5nIDAgaGVscGVyIFZ4RCBzbyB3ZSBzaG91bGQKLW5ldmVyIGdldCBoZXJlIGluIGEgRE9TIGJveCBhbnl3YXkgKGFzc3VtaW5nIHRoZSBWeEQgaXMgcHJlc2VudCkuIElmIHdlCi1kbyBnZXQgaGVyZSBhbmQgd2UgYXJlIGluIHdpbmRvd3MsIHRoaXMgY29kZSB3aWxsIGJlIHNraXBwZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUE1fYWRqdXN0UGFnZVRhYmxlcygKLSAgICB1bG9uZyBsaW5lYXIsCi0gICAgdWxvbmcgbGltaXQsCi0gICAgaWJvb2wgaXNDYWNoZWQpCi17Ci0jaWZkZWYgIERPUzRHVwotICAgIGludCAgICAgc3RhcnRQREIsZW5kUERCLGlQREIsc3RhcnRQYWdlLGVuZFBhZ2Usc3RhcnQsZW5kLGlQYWdlOwotICAgIHVsb25nICAgYW5kTWFzayxvck1hc2sscGFnZVRhYmxlLCpwUGFnZVRhYmxlOwotCi0gICAgYW5kTWFzayA9IH4weDE4OwotICAgIG9yTWFzayA9IChpc0NhY2hlZCkgPyAweDAwIDogMHgxODsKLSAgICBpZiAoX1BNX3BhZ2luZ0VuYWJsZWQoKSA9PSAxICYmIChQREIgPSBfUE1fZ2V0UERCKCkpICE9IDApIHsKLQlpZiAoX1BNX2hhdmVDYXVzZVdheSkgewotCSAgICAvKiBDYXVzZVdheSBpcyBhIGxpdHRsZSBkaWZmZXJlbnQgaW4gdGhlIHBhZ2UgdGFibGUgaGFuZGxpbmcuCi0JICAgICAqIFRoZSBjb2RlIHRoYXQgd2UgdXNlIGZvciBET1M0Ry9XIGRvZXMgbm90IGFwcGVhciB0byB3b3JrCi0JICAgICAqIHdpdGggQ2F1c2VXYXkgY29ycmVjdGx5IGFzIGl0IGRvZXMgbm90IGFwcGVhciB0byBhbGxvdyB1cwotCSAgICAgKiB0byBtYXAgdGhlIHBhZ2UgdGFibGVzIGRpcmVjdGx5LiBJbnN0ZWFkIHdlIGNhbiBkaXJlY3RseQotCSAgICAgKiBhY2Nlc3MgdGhlIHBhZ2UgdGFibGUgZW50cmllcyBpbiBleHRlbmRlZCBtZW1vcnkgd2hlcmUKLQkgICAgICogQ2F1c2VXYXkgYWx3YXlzIGxvY2F0ZXMgdGhlbSAoc3RhcnRpbmcgYXQgMTAyNCo0MDk2KjEwMjMpCi0JICAgICAqLwotCSAgICBzdGFydFBhZ2UgPSAobGluZWFyID4+IDEyKTsKLQkgICAgZW5kUGFnZSA9ICgobGluZWFyK2xpbWl0KSA+PiAxMik7Ci0JICAgIHBQYWdlVGFibGUgPSAodWxvbmcqKUNXX1BBR0VfVEFCTEVfU1RBUlQ7Ci0JICAgIGZvciAoaVBhZ2UgPSBzdGFydFBhZ2U7IGlQYWdlIDw9IGVuZFBhZ2U7IGlQYWdlKyspCi0JCXBQYWdlVGFibGVbaVBhZ2VdID0gKHBQYWdlVGFibGVbaVBhZ2VdICYgYW5kTWFzaykgfCBvck1hc2s7Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgcFBEQiA9ICh1bG9uZyopRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKFBEQiwweEZGRik7Ci0JICAgIGlmIChwUERCKSB7Ci0JCXN0YXJ0UERCID0gKGxpbmVhciA+PiAyMikgJiAweDNGRjsKLQkJc3RhcnRQYWdlID0gKGxpbmVhciA+PiAxMikgJiAweDNGRjsKLQkJZW5kUERCID0gKChsaW5lYXIrbGltaXQpID4+IDIyKSAmIDB4M0ZGOwotCQllbmRQYWdlID0gKChsaW5lYXIrbGltaXQpID4+IDEyKSAmIDB4M0ZGOwotCQlmb3IgKGlQREIgPSBzdGFydFBEQjsgaVBEQiA8PSBlbmRQREI7IGlQREIrKykgewotCQkgICAgcGFnZVRhYmxlID0gcFBEQltpUERCXSAmIH4weEZGRjsKLQkJICAgIHBQYWdlVGFibGUgPSAodWxvbmcqKURQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcihwYWdlVGFibGUsMHhGRkYpOwotCQkgICAgc3RhcnQgPSAoaVBEQiA9PSBzdGFydFBEQikgPyBzdGFydFBhZ2UgOiAwOwotCQkgICAgZW5kID0gKGlQREIgPT0gZW5kUERCKSA/IGVuZFBhZ2UgOiAweDNGRjsKLQkJICAgIGZvciAoaVBhZ2UgPSBzdGFydDsgaVBhZ2UgPD0gZW5kOyBpUGFnZSsrKQotCQkJcFBhZ2VUYWJsZVtpUGFnZV0gPSAocFBhZ2VUYWJsZVtpUGFnZV0gJiBhbmRNYXNrKSB8IG9yTWFzazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JUE1fZmx1c2hUTEIoKTsKLQl9Ci0jZW5kaWYKLX0KLQotdm9pZCAqIFBNQVBJIERQTUlfbWFwUGh5c2ljYWxBZGRyKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgUE1TUkVHUyAgICAgc3JlZ3M7Ci0gICAgdWxvbmcgICAgICAgbGluQWRkcjsKLSAgICB1bG9uZyAgICAgICBEU0Jhc2VBZGRyOwotCi0gICAgLyogR2V0IHRoZSBiYXNlIGFkZHJlc3MgZm9yIHRoZSBkZWZhdWx0IERTIHNlbGVjdG9yICovCi0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIERTQmFzZUFkZHIgPSBEUE1JX2dldFNlbGVjdG9yQmFzZShzcmVncy5kcyk7Ci0gICAgaWYgKChiYXNlIDwgMHgxMDAwMDApICYmIChEU0Jhc2VBZGRyID09IDApKSB7Ci0JLyogRFMgaXMgemVybyBiYXNlZCwgc28gd2UgY2FuIGRpcmVjdGx5IGFjY2VzcyB0aGUgZmlyc3QgMU1iIG9mCi0JICogc3lzdGVtIG1lbW9yeSAobGlrZSB1bmRlciBET1M0R1cpLgotCSAqLwotCXJldHVybiAodm9pZCopYmFzZTsKLQl9Ci0KLSAgICAvKiBNYXAgdGhlIG1lbW9yeSB0byBhIGxpbmVhciBhZGRyZXNzIHVzaW5nIERQTUkgZnVuY3Rpb24gMHg4MDAgKi8KLSAgICBpZiAoKGxpbkFkZHIgPSBEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIoYmFzZSxsaW1pdCkpID09IDB4RkZGRkZGRkYpIHsKLQlpZiAoYmFzZSA+PSAweDEwMDAwMCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JLyogSWYgdGhlIGxpbmVhciBhZGRyZXNzIG1hcHBpbmcgZmFpbHMgYnV0IHdlIGFyZSB0cnlpbmcgdG8KLQkgKiBtYXAgYW4gYXJlYSBpbiB0aGUgZmlyc3QgMU1iIG9mIHN5c3RlbSBtZW1vcnksIHRoZW4gd2UgbXVzdAotCSAqIGJlIHJ1bm5pbmcgdW5kZXIgYSBXaW5kb3dzIG9yIE9TLzIgRE9TIGJveC4gVW5kZXIgdGhlc2UKLQkgKiBlbnZpcm9ubWVudHMgd2UgY2FuIHVzZSB0aGUgc2VnbWVudCB3cmFwIGFyb3VuZCBhcyBhIGZhbGxiYWNrCi0JICogbWVhc3VyZSwgYXMgdGhpcyBkb2VzIHdvcmsgcHJvcGVybHkuCi0JICovCi0JbGluQWRkciA9IGJhc2U7Ci0JfQotCi0gICAgLyogTm93IGV4cGFuZCB0aGUgZGVmYXVsdCBEUyBzZWxlY3RvciB0byA0R2Igc28gd2UgY2FuIGFjY2VzcyBpdCAqLwotICAgIGlmICghRFBNSV9zZXRTZWxlY3RvckxpbWl0KHNyZWdzLmRzLDB4RkZGRkZGRkZVTCkpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBGaW5hbGx5IGVuYWJsZSBjYWNoaW5nIGZvciB0aGUgcGFnZSB0YWJsZXMgdGhhdCB3ZSBqdXN0IG1hcHBlZCBpbiwKLSAgICAgKiBzaW5jZSBET1M0R1cgYW5kIFBNT0RFL1cgY3JlYXRlIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMgd2l0aG91dAotICAgICAqIGNhY2hpbmcgZW5hYmxlZCB3aGljaCBodXJ0cyB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGxpbmVhciBmcmFtZWJ1ZmZlcgotICAgICAqIGFzIGl0IGRpc2FibGVzIHdyaXRlIGNvbWJpbmluZyBvbiBQZW50aXVtIFBybyBhbmQgYWJvdmUgcHJvY2Vzc29ycy4KLSAgICAgKgotICAgICAqIEZvciB0aG9zZSBwcm9jZXNzb3JzIGNhY2hlIGRpc2FibGluZyBpcyBiZXR0ZXIgaGFuZGxlZCB0aHJvdWdoIHRoZQotICAgICAqIE1UUlIgcmVnaXN0ZXJzIGFueXdheSAod2UgY2FuIHdyaXRlIGNvbWJpbmUgYSByZWdpb24gYnV0IGRpc2FibGUKLSAgICAgKiBjYWNoaW5nKSBzbyB0aGF0IE1NSU8gcmVnaXN0ZXIgcmVnaW9ucyBkbyBub3Qgc2NyZXcgdXAuCi0gICAgICovCi0gICAgaWYgKERTQmFzZUFkZHIgPT0gMCkKLQlQTV9hZGp1c3RQYWdlVGFibGVzKGxpbkFkZHIsbGltaXQsaXNDYWNoZWQpOwotCi0gICAgLyogTm93IHJldHVybiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgaW50byB0aGUgZGVmYXVsdCBEUyAqLwotICAgIHJldHVybiAodm9pZCopKGxpbkFkZHIgLSBEU0Jhc2VBZGRyKTsKLX0KLQotI2lmIGRlZmluZWQoUE0zODYpCi0KLS8qIFNvbWUgRE9TIGV4dGVuZGVyIGltcGxlbWVudGF0aW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBjYWxsaW5nIGEKLSAqIHJlYWwgbW9kZSBwcm9jZWR1cmUgZnJvbSBwcm90ZWN0ZWQgbW9kZS4gSG93ZXZlciB3ZSBjYW4gc2ltdWxhdGUgd2hhdAotICogd2UgbmVlZCB0ZW1wb3JhcmlseSBob29raW5nIHRoZSBJTlQgNkFoIHZlY3RvciB3aXRoIGEgc21hbGwgcmVhbCBtb2RlCi0gKiBzdHViIHRoYXQgd2lsbCBjYWxsIG91ciByZWFsIG1vZGUgY29kZSBmb3IgdXMuCi0gKi8KLQotc3RhdGljIHVjaGFyIGludDZBSGFuZGxlcltdID0gewotICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsICAgICAgICAvKiAgX19QTU9ERV9jYWxsUmVhbCB2YXJpYWJsZSAgICAgICAgICAgKi8KLSAgICAweEZCLCAgICAgICAgICAgICAgICAgICAgICAgLyogIHN0aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgyRSwweEZGLDB4MUUsMHgwMCwweDAwLCAgIC8qICBjYWxsICAgIFtjczpfX1BNT0RFX2NhbGxSZWFsXSAgICAgICAqLwotICAgIDB4Q0YsICAgICAgICAgICAgICAgICAgICAgICAvKiAgaXJldGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB9Owotc3RhdGljIHVjaGFyICpjclB0ciA9IE5VTEw7IC8qIFBvaW50ZXIgdG8gb2YgaW50IDZBIGhhbmRsZXIgICAgICAgICAqLwotc3RhdGljIHVpbnQgY3JSU2VnLGNyUk9mZjsgIC8qIFJlYWwgbW9kZSBzZWc6b2Zmc2V0IG9mIGhhbmRsZXIgICAgICAqLwotCi12b2lkIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSh1aW50IHNlZyx1aW50IG9mZiwgUk1SRUdTICppbiwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICB1Y2hhciAgICpwOwotICAgIHVpbnQgICAgb2xkU2VnLG9sZE9mZjsKLQotICAgIGlmICghY3JQdHIpIHsKLQkvKiBBbGxvY2F0ZSBhbmQgY29weSB0aGUgbWVtb3J5IGJsb2NrIG9ubHkgb25jZSAqLwotCWNyUHRyID0gUE1fYWxsb2NSZWFsU2VnKHNpemVvZihpbnQ2QUhhbmRsZXIpLCAmY3JSU2VnLCAmY3JST2ZmKTsKLQltZW1jcHkoY3JQdHIsaW50NkFIYW5kbGVyLHNpemVvZihpbnQ2QUhhbmRsZXIpKTsKLQl9Ci0gICAgUE1fc2V0V29yZChjclB0cixvZmYpOyAgICAgICAgICAgICAgLyogUGx1ZyBpbiBhZGRyZXNzIHRvIGNhbGwgICovCi0gICAgUE1fc2V0V29yZChjclB0cisyLHNlZyk7Ci0gICAgcCA9IFBNX21hcFJlYWxQb2ludGVyKDAsMHg2QSAqIDQpOwotICAgIG9sZE9mZiA9IFBNX2dldFdvcmQocCk7ICAgICAgICAgICAgIC8qIFNhdmUgb2xkIGhhbmRsZXIgYWRkcmVzcyAqLwotICAgIG9sZFNlZyA9IFBNX2dldFdvcmQocCsyKTsKLSAgICBQTV9zZXRXb3JkKHAsY3JST2ZmKzQpOyAgICAgICAgICAgICAvKiBIb29rIDZBIGhhbmRsZXIgICAgICAgICAgKi8KLSAgICBQTV9zZXRXb3JkKHArMixjclJTZWcpOwotICAgIFBNX2ludDg2eCgweDZBLCBpbiwgaW4sIHNyZWdzKTsgICAgIC8qIENhbGwgcmVhbCBtb2RlIGNvZGUgICAgICAqLwotICAgIFBNX3NldFdvcmQocCxvbGRPZmYpOyAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgb2xkIGhhbmRsZXIgICAgICAqLwotICAgIFBNX3NldFdvcmQocCsyLG9sZFNlZyk7Ci19Ci0KLSNlbmRpZiAgLyogUE0zODYgKi8KLQotI2VuZGlmICAvKiAhUkVBTE1PREUgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZXMgYSBibG9jayBvZiBsb2NrZWQsIHBoeXNpY2FsbHkgY29udGlndW91cyBtZW1vcnkuIFRoZSBtZW1vcnkKLW1heSBiZSByZXF1aXJlZCB0byBiZSBiZWxvdyB0aGUgMTZNZWcgYm91bmRhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jTG9ja2VkTWVtKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1bG9uZyAqcGh5c0FkZHIsCi0gICAgaWJvb2wgY29udGlndW91cywKLSAgICBpYm9vbCBiZWxvdzE2TWVnKQotewotICAgIHVjaGFyICAgICAgICAgICAqcCwqcm91bmRlZFA7Ci0gICAgdWludCAgICAgICAgICAgIHJfc2VnLHJfb2ZmOwotICAgIHVpbnQgICAgICAgICAgICByb3VuZGVkU2l6ZSA9IChzaXplICsgNCArIDB4RkZGKSAmIH4weEZGRjsKLSAgICBQTV9sb2NrSGFuZGxlICAgbGg7IC8qIFVudXNlZCBpbiBET1MgKi8KLSNpZm5kZWYgUkVBTE1PREUKLSAgICBWWERfcmVncyAgICAgICAgcmVnczsKLQotICAgIC8qIElmIHdlIGhhdmUgY29ubmVjdGVkIHRvIG91ciBoZWxwZXIgVnhEIGluIGEgV2luZG93cyBET1MgYm94LCB1c2UgdGhlCi0gICAgICogaGVscGVyIFZ4RCBzZXJ2aWNlcyB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5IHRoYXQgd2UgbmVlZC4KLSAgICAgKi8KLSAgICBpZiAoVlhEX3ZlcnNpb24pIHsKLQltZW1zZXQoJnJlZ3MsMCxzaXplb2YocmVncykpOwotCXJlZ3MuZWF4ID0gQVBJX05VTShQTUhFTFBfQUxMT0NMT0NLRUQpOwotCXJlZ3MuZWJ4ID0gc2l6ZTsKLQlyZWdzLmVjeCA9ICh1bG9uZylwaHlzQWRkcjsKLQlyZWdzLmVkeCA9IGNvbnRpZ3VvdXMgfCAoYmVsb3cxNk1lZyA8PCA4KTsKLQlfUE1fVnhEQ2FsbCgmcmVncyxfUE1fVlhEX29mZixfUE1fVlhEX3NlbCk7Ci0JcmV0dXJuICh2b2lkKilyZWdzLmVheDsKLQl9Ci0KLSAgICAvKiBJZiB0aGUgbWVtb3J5IGlzIG5vdCBjb250aWd1b3VzLCB3ZSBzaW1wbHkgbmVlZCB0byBhbGxvY2F0ZSBpdAotICAgICAqIHVzaW5nIHJlZ3VsYXIgbWVtb3J5IGFsbG9jYXRpb24gc2VydmljZXMsIGFuZCBsb2NrIGl0IGRvd24KLSAgICAgKiBpbiBtZW1vcnkuCi0gICAgICoKLSAgICAgKiBGb3IgY29udGlndW91cyBtZW1vcnkgYmxvY2tzLCB0aGUgb25seSB3YXkgdG8gZ3VhcmFudGVlIGNvbnRpZ3VvdXMgcGh5c2ljYWwKLSAgICAgKiBtZW1vcnkgYWRkcmVzc2VzIHVuZGVyIERPUyBpcyB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5IGJlbG93IHRoZQotICAgICAqIDFNZWcgYm91bmRhcnkgYXMgcmVhbCBtb2RlIG1lbW9yeS4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCB3ZSBtdXN0IHBhZ2UgYWxpZ24gdGhlIG1lbW9yeSBibG9jaywgYW5kIHdlIGFsc28gbXVzdAotICAgICAqIGtlZXAgdHJhY2sgb2YgdGhlIG5vbi1hbGlnbmVkIHBvaW50ZXIgc28gd2UgY2FuIHByb3Blcmx5IGZyZWUKLSAgICAgKiBpdCBsYXRlci4gSGVuY2Ugd2UgYWN0dWFsbHkgYWxsb2NhdGUgNCBieXRlcyBtb3JlIHRoYW4gdGhlCi0gICAgICogc2l6ZSByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IDRLIGJvdW5kYXJ5LgotICAgICAqLwotICAgIGlmICghY29udGlndW91cykKLQlwID0gUE1fbWFsbG9jKHJvdW5kZWRTaXplKTsKLSAgICBlbHNlCi0jZW5kaWYKLQlwID0gUE1fYWxsb2NSZWFsU2VnKHJvdW5kZWRTaXplLCZyX3NlZywmcl9vZmYpOwotICAgIGlmIChwID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgcm91bmRlZFAgPSAodm9pZCopKCgodWxvbmcpcCArIDB4RkZGKSAmIH4weEZGRik7Ci0gICAgKigodWxvbmcqKShyb3VuZGVkUCArIHNpemUpKSA9ICh1bG9uZylwOwotICAgIFBNX2xvY2tEYXRhUGFnZXMocm91bmRlZFAsc2l6ZSwmbGgpOwotICAgIGlmICgoKnBoeXNBZGRyID0gUE1fZ2V0UGh5c2ljYWxBZGRyKHJvdW5kZWRQKSkgPT0gMHhGRkZGRkZGRikgewotCVBNX2ZyZWVMb2NrZWRNZW0ocm91bmRlZFAsc2l6ZSxjb250aWd1b3VzKTsKLQlyZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICAvKiBEaXNhYmxlIGNhY2hpbmcgZm9yIHRoZSBtZW1vcnkgc2luY2UgaXQgaXMgcHJvYmFibHkgYSBETUEgYnVmZmVyICovCi0jaWZuZGVmIFJFQUxNT0RFCi0gICAgUE1fYWRqdXN0UGFnZVRhYmxlcygodWxvbmcpcm91bmRlZFAsc2l6ZS0xLGZhbHNlKTsKLSNlbmRpZgotICAgIHJldHVybiByb3VuZGVkUDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2YgbG9ja2VkIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0odm9pZCAqcCx1aW50IHNpemUsaWJvb2wgY29udGlndW91cykKLXsKLSNpZm5kZWYgUkVBTE1PREUKLSAgICBWWERfcmVncyAgICAgICAgcmVnczsKLSAgICBQTV9sb2NrSGFuZGxlICAgbGg7IC8qIFVudXNlZCBpbiBET1MgKi8KLQotICAgIGlmICghcCkKLQlyZXR1cm47Ci0gICAgaWYgKFZYRF92ZXJzaW9uKSB7Ci0JbWVtc2V0KCZyZWdzLDAsc2l6ZW9mKHJlZ3MpKTsKLQlyZWdzLmVheCA9IEFQSV9OVU0oUE1IRUxQX0ZSRUVMT0NLRUQpOwotCXJlZ3MuZWJ4ID0gKHVsb25nKXA7Ci0JcmVncy5lY3ggPSBzaXplOwotCXJlZ3MuZWR4ID0gY29udGlndW91czsKLQlfUE1fVnhEQ2FsbCgmcmVncyxfUE1fVlhEX29mZixfUE1fVlhEX3NlbCk7Ci0JcmV0dXJuOwotCX0KLSAgICBQTV91bmxvY2tEYXRhUGFnZXMocCxzaXplLCZsaCk7Ci0gICAgaWYgKCFjb250aWd1b3VzKQotCWZyZWUoKigodm9pZCoqKSgodWNoYXIqKXAgKyBzaXplKSkpOwotICAgIGVsc2UKLSNlbmRpZgotCVBNX2ZyZWVSZWFsU2VnKCooKHZvaWQqKikoKGNoYXIqKXAgKyBzaXplKSkpOwotfQotCi0jaWZuZGVmIFJFQUxNT0RFCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlcyBhIG5ldyBibG9jayBvZiBwYWdlcyBmb3IgdGhlIHBhZ2UgYmxvY2sgbWFuYWdlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgcGFnZWJsb2NrICpQTV9hZGROZXdQYWdlQmxvY2sodm9pZCkKLXsKLSAgICBpbnQgICAgICAgICBpLHNpemU7Ci0gICAgcGFnZWJsb2NrICAgKm5ld0Jsb2NrOwotICAgIGNoYXIgICAgICAgICpwLCpuZXh0OwotCi0gICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgbmV3IHBhZ2UgYmxvY2ssIGFuZCBhZGQgdG8gaGVhZCBvZiBsaXN0ICovCi0gICAgc2l6ZSA9IFBBR0VTX1BFUl9CTE9DSyAqIFBNX1BBR0VfU0laRSArIChQTV9QQUdFX1NJWkUtMSkgKyBzaXplb2YocGFnZWJsb2NrKTsKLSAgICBpZiAoKG5ld0Jsb2NrID0gUE1fbWFsbG9jKHNpemUpKSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgIG5ld0Jsb2NrLT5wcmV2ID0gTlVMTDsKLSAgICBuZXdCbG9jay0+bmV4dCA9IHBhZ2VCbG9ja3M7Ci0gICAgaWYgKHBhZ2VCbG9ja3MpCi0JcGFnZUJsb2Nrcy0+cHJldiA9IG5ld0Jsb2NrOwotICAgIHBhZ2VCbG9ja3MgPSBuZXdCbG9jazsKLQotICAgIC8qIEluaXRpYWxpc2UgdGhlIHBhZ2UgYWxpZ25lZCBmcmVlIGxpc3QgZm9yIHRoZSBwYWdlIGJsb2NrICovCi0gICAgbmV3QmxvY2stPmZyZWVDb3VudCA9IFBBR0VTX1BFUl9CTE9DSzsKLSAgICBuZXdCbG9jay0+ZnJlZUxpc3QgPSBwID0gKGNoYXIqKSgoKHVsb25nKShuZXdCbG9jayArIDEpICsgKFBNX1BBR0VfU0laRS0xKSkgJiB+KFBNX1BBR0VfU0laRS0xKSk7Ci0gICAgbmV3QmxvY2stPmZyZWVMaXN0U3RhcnQgPSBuZXdCbG9jay0+ZnJlZUxpc3Q7Ci0gICAgbmV3QmxvY2stPmZyZWVMaXN0RW5kID0gcCArIChQQUdFU19QRVJfQkxPQ0stMSkgKiBQTV9QQUdFX1NJWkU7Ci0gICAgZm9yIChpID0gMDsgaSA8IFBBR0VTX1BFUl9CTE9DSzsgaSsrLHAgPSBuZXh0KQotCUZSRUVMSVNUX05FWFQocCkgPSBuZXh0ID0gcCArIFBNX1BBR0VfU0laRTsKLSAgICBGUkVFTElTVF9ORVhUKHAgLSBQTV9QQUdFX1NJWkUpID0gTlVMTDsKLSAgICByZXR1cm4gbmV3QmxvY2s7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZXMgYSBwYWdlIGFsaWduZWQgYW5kIHBhZ2Ugc2l6ZWQgYmxvY2sgb2YgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUGFnZSgKLSAgICBpYm9vbCBsb2NrZWQpCi17Ci0jaWZuZGVmIFJFQUxNT0RFCi0gICAgVlhEX3JlZ3MgICAgICAgIHJlZ3M7Ci0gICAgcGFnZWJsb2NrICAgICAgICpibG9jazsKLSAgICB2b2lkICAgICAgICAgICAgKnA7Ci0gICAgUE1fbG9ja0hhbmRsZSAgIGxoOyAvKiBVbnVzZWQgaW4gRE9TICovCi0KLSAgICAvKiBDYWxsIHRoZSBoZWxwZXIgVnhEIGZvciB0aGlzIHNlcnZpY2UgaWYgd2UgYXJlIHJ1bm5pbmcgaW4gYSBET1MgYm94ICovCi0gICAgaWYgKFZYRF92ZXJzaW9uKSB7Ci0JbWVtc2V0KCZyZWdzLDAsc2l6ZW9mKHJlZ3MpKTsKLQlyZWdzLmVheCA9IEFQSV9OVU0oUE1IRUxQX0FMTE9DUEFHRSk7Ci0JcmVncy5lYnggPSBsb2NrZWQ7Ci0JX1BNX1Z4RENhbGwoJnJlZ3MsX1BNX1ZYRF9vZmYsX1BNX1ZYRF9zZWwpOwotCXJldHVybiAodm9pZCopcmVncy5lYXg7Ci0JfQotCi0gICAgLyogU2NhbiB0aGUgYmxvY2sgbGlzdCBsb29raW5nIGZvciBhbnkgZnJlZSBibG9ja3MuIEFsbG9jYXRlIGEgbmV3Ci0gICAgICogcGFnZSBibG9jayBpZiBubyBmcmVlIGJsb2NrcyBhcmUgZm91bmQuCi0gICAgICovCi0gICAgZm9yIChibG9jayA9IHBhZ2VCbG9ja3M7IGJsb2NrICE9IE5VTEw7IGJsb2NrID0gYmxvY2stPm5leHQpIHsKLQlpZiAoYmxvY2stPmZyZWVDb3VudCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIGlmIChibG9jayA9PSBOVUxMICYmIChibG9jayA9IFBNX2FkZE5ld1BhZ2VCbG9jaygpKSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgIGJsb2NrLT5mcmVlQ291bnQtLTsKLSAgICBwID0gYmxvY2stPmZyZWVMaXN0OwotICAgIGJsb2NrLT5mcmVlTGlzdCA9IEZSRUVMSVNUX05FWFQocCk7Ci0gICAgaWYgKGxvY2tlZCkKLQlQTV9sb2NrRGF0YVBhZ2VzKHAsUE1fUEFHRV9TSVpFLCZsaCk7Ci0gICAgcmV0dXJuIHA7Ci0jZWxzZQotICAgIHJldHVybiBOVUxMOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIHBhZ2UgYWxpZ25lZCBhbmQgcGFnZSBzaXplZCBibG9jayBvZiBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVQYWdlKAotICAgIHZvaWQgKnApCi17Ci0jaWZuZGVmIFJFQUxNT0RFCi0gICAgVlhEX3JlZ3MgICAgcmVnczsKLSAgICBwYWdlYmxvY2sgICAqYmxvY2s7Ci0KLSAgICAvKiBDYWxsIHRoZSBoZWxwZXIgVnhEIGZvciB0aGlzIHNlcnZpY2UgaWYgd2UgYXJlIHJ1bm5pbmcgaW4gYSBET1MgYm94ICovCi0gICAgaWYgKFZYRF92ZXJzaW9uKSB7Ci0JbWVtc2V0KCZyZWdzLDAsc2l6ZW9mKHJlZ3MpKTsKLQlyZWdzLmVheCA9IEFQSV9OVU0oUE1IRUxQX0ZSRUVQQUdFKTsKLQlyZWdzLmVieCA9ICh1bG9uZylwOwotCV9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKLQlyZXR1cm47Ci0JfQotCi0gICAgLyogRmlyc3QgZmluZCB0aGUgcGFnZSBibG9jayB0aGF0IHRoaXMgcGFnZSBiZWxvbmdzIHRvICovCi0gICAgZm9yIChibG9jayA9IHBhZ2VCbG9ja3M7IGJsb2NrICE9IE5VTEw7IGJsb2NrID0gYmxvY2stPm5leHQpIHsKLQlpZiAocCA+PSBibG9jay0+ZnJlZUxpc3RTdGFydCAmJiBwIDw9IGJsb2NrLT5mcmVlTGlzdEVuZCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIENIRUNLKGJsb2NrICE9IE5VTEwpOwotCi0gICAgLyogTm93IGZyZWUgdGhlIGJsb2NrIGJ5IGFkZGluZyBpdCB0byB0aGUgZnJlZSBsaXN0ICovCi0gICAgRlJFRUxJU1RfTkVYVChwKSA9IGJsb2NrLT5mcmVlTGlzdDsKLSAgICBibG9jay0+ZnJlZUxpc3QgPSBwOwotICAgIGlmICgrK2Jsb2NrLT5mcmVlQ291bnQgPT0gUEFHRVNfUEVSX0JMT0NLKSB7Ci0JLyogSWYgYWxsIHBhZ2VzIGluIHRoZSBwYWdlIGJsb2NrIGFyZSBub3cgZnJlZSwgZnJlZSB0aGUgZW50aXJlCi0JICogcGFnZSBibG9jayBpdHNlbGYuCi0JICovCi0JaWYgKGJsb2NrID09IHBhZ2VCbG9ja3MpIHsKLQkgICAgLyogRGVsZXRlIGZyb20gaGVhZCAqLwotCSAgICBwYWdlQmxvY2tzID0gYmxvY2stPm5leHQ7Ci0JICAgIGlmIChibG9jay0+bmV4dCkKLQkJYmxvY2stPm5leHQtPnByZXYgPSBOVUxMOwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIC8qIERlbGV0ZSBmcm9tIG1pZGRsZSBvZiBsaXN0ICovCi0JICAgIENIRUNLKGJsb2NrLT5wcmV2ICE9IE5VTEwpOwotCSAgICBibG9jay0+cHJldi0+bmV4dCA9IGJsb2NrLT5uZXh0OwotCSAgICBpZiAoYmxvY2stPm5leHQpCi0JCWJsb2NrLT5uZXh0LT5wcmV2ID0gYmxvY2stPnByZXY7Ci0JICAgIH0KLQlQTV9mcmVlKGJsb2NrKTsKLQl9Ci0jZWxzZQotICAgICh2b2lkKXA7Ci0jZW5kaWYKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIERPUyBSZWFsIE1vZGUgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgUkVBTE1PREUKLQotI2lmbmRlZiBNS19GUAotI2RlZmluZSBNS19GUChzLG8pICAoICh2b2lkIGZhciAqKSggKCh1bG9uZykocykgPDwgMTYpICsgXAotCQkgICAgKHVsb25nKShvKSApKQotI2VuZGlmCi0KLXZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcih1aW50IHJfc2VnLHVpbnQgcl9vZmYpCi17IHJldHVybiBNS19GUChyX3NlZyxyX29mZik7IH0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCi17Ci0gICAgcmV0dXJuIE1LX0ZQKDB4NDAsMCk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKLXsKLSAgICByZXR1cm4gTUtfRlAoMHhBMDAwLDApOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgdWludCBzZWwgPSBiYXNlID4+IDQ7Ci0gICAgdWludCBvZmYgPSBiYXNlICYgMHhGOwotICAgIGxpbWl0ID0gbGltaXQ7Ci0gICAgcmV0dXJuIE1LX0ZQKHNlbCxvZmYpOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIodm9pZCAqcHRyLHVsb25nIGxpbWl0KQoteyBwdHIgPSBwdHI7IH0KLQotdWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCi17Ci0gICAgcmV0dXJuICgoKCh1bG9uZylwID4+IDE2KSA8PCA0KSArICh1c2hvcnQpcCk7Ci19Ci0KLWlib29sIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKHZvaWQgKnAsdWxvbmcgbGVuZ3RoLHVsb25nICpwaHlzQWRkcmVzcykKLXsgcmV0dXJuIGZhbHNlOyB9Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3Modm9pZCAqYmFzZSx1bG9uZyBsaW1pdCkKLXsgcmV0dXJuICh2b2lkKiliYXNlOyB9Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKQotewotICAgIC8qIENhbGwgbWFsbG9jKCkgdG8gYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdXMgKi8KLSAgICB2b2lkICpwID0gUE1fbWFsbG9jKHNpemUpOwotICAgICpyX3NlZyA9IEZQX1NFRyhwKTsKLSAgICAqcl9vZmYgPSBGUF9PRkYocCk7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcodm9pZCAqbWVtKQotewotICAgIGlmIChtZW0pIFBNX2ZyZWUobWVtKTsKLX0KLQotaW50IFBNQVBJIFBNX2ludDg2KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQpCi17Ci0gICAgcmV0dXJuIFBNX2ludDM4NihpbnRubyxpbixvdXQpOwotfQotCi1pbnQgUE1BUEkgUE1faW50ODZ4KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgcmV0dXJuIFBNX2ludDM4NngoaW50bm8saW4sb3V0LHNyZWdzKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKLXsKLSAgICBQTVJFR1MgcmVnczsKLQotICAgIHJlZ3MuaC5haCA9IDB4NDg7Ci0gICAgcmVncy54LmJ4ID0gMHhGRkZGOwotICAgIFBNX2ludDg2KDB4MjEsJnJlZ3MsJnJlZ3MpOwotICAgICpwaHlzaWNhbCA9ICp0b3RhbCA9IHJlZ3MueC5ieCAqIDE2VUw7Ci19Ci0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogUGhhciBMYXAgVE5UIERPUyBFeHRlbmRlciBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBUTlQKLQotI2luY2x1ZGUgPHBsZG9zMzIuaD4KLSNpbmNsdWRlIDxwaGFybGFwLmg+Ci0jaW5jbHVkZSA8aHczODYuaD4KLQotc3RhdGljIHVjaGFyICp6ZXJvUHRyID0gTlVMTDsKLQotdm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCi17Ci0gICAgaWYgKCF6ZXJvUHRyKQotCXplcm9QdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMCwweEZGRkZGLHRydWUpOwotICAgIHJldHVybiAodm9pZCopKHplcm9QdHIgKyAweDQwMCk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKLXsKLSAgICBzdGF0aWMgdm9pZCAqYmFua1B0cjsKLSAgICBpZiAoIWJhbmtQdHIpCi0JYmFua1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLDB4RkZGRix0cnVlKTsKLSAgICByZXR1cm4gYmFua1B0cjsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKQotewotICAgIENPTkZJR19JTkYgIGNvbmZpZzsKLSAgICBVTE9ORyAgICAgICBvZmZzZXQ7Ci0gICAgaW50ICAgICAgICAgZXJyOwotICAgIHVsb25nICAgICAgIGJhc2VBZGRyLGJhc2VPZnMsbmV3TGltaXQ7Ci0gICAgVlhEX3JlZ3MgICAgcmVnczsKLQotICAgIC8qIElmIHdlIGhhdmUgY29ubmVjdGVkIHRvIG91ciBoZWxwZXIgVnhEIGluIGEgV2luZG93cyBET1MgYm94LCB1c2UKLSAgICAgKiB0aGUgaGVscGVyIFZ4RCBzZXJ2aWNlcyB0byBtYXAgbWVtb3J5IGluc3RlYWQgb2YgdGhlIERQTUkgc2VydmljZXMuCi0gICAgICogV2UgZG8gdGhpcyBiZWNhdXNlIHRoZSBoZWxwZXIgVnhEIGNhbiBwcm9wZXJseSBkaXNhYmxlIGNhY2hpbmcKLSAgICAgKiB3aGVyZSBuZWNlc3NhcnksIHdoaWNoIHdlIGNhbiBvbmx5IGRvIGRpcmVjdGx5IGhlcmUgaWYgd2UgYXJlCi0gICAgICogcnVubmluZyBhdCByaW5nIDAgKGllOiB1bmRlciByZWFsIERPUykuCi0gICAgICovCi0gICAgaWYgKFZYRF92ZXJzaW9uID09IC0xKQotCVBNX2luaXQoKTsKLSAgICBpZiAoVlhEX3ZlcnNpb24pIHsKLQltZW1zZXQoJnJlZ3MsMCxzaXplb2YocmVncykpOwotCXJlZ3MuZWF4ID0gQVBJX05VTShQTUhFTFBfTUFQUEhZUyk7Ci0JcmVncy5lYnggPSBiYXNlOwotCXJlZ3MuZWN4ID0gbGltaXQ7Ci0JcmVncy5lZHggPSBpc0NhY2hlZDsKLQlfUE1fVnhEQ2FsbCgmcmVncyxfUE1fVlhEX29mZixfUE1fVlhEX3NlbCk7Ci0JcmV0dXJuICh2b2lkKilyZWdzLmVheDsKLQl9Ci0KLSAgICAvKiBSb3VuZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byBhIDRLYiBib3VuZGFyeSBhbmQgdGhlIGxpbWl0IHRvIGEKLSAgICAgKiA0S2ItMSBib3VuZGFyeSBiZWZvcmUgcGFzc2luZyB0aGUgdmFsdWVzIHRvIFROVC4gSWYgd2Ugcm91bmQgdGhlCi0gICAgICogcGh5c2ljYWwgYWRkcmVzcywgdGhlbiB3ZSBhbHNvIGFkZCBhbiBleHRyYSBvZmZzZXQgaW50byB0aGUgYWRkcmVzcwotICAgICAqIHRoYXQgd2UgcmV0dXJuLgotICAgICAqLwotICAgIGJhc2VPZnMgPSBiYXNlICYgNDA5NTsKLSAgICBiYXNlQWRkciA9IGJhc2UgJiB+NDA5NTsKLSAgICBuZXdMaW1pdCA9ICgobGltaXQrYmFzZU9mcysxKzQwOTUpICYgfjQwOTUpLTE7Ci0gICAgX2R4X2NvbmZpZ19pbmYoJmNvbmZpZywgKFVDSEFSKikmY29uZmlnKTsKLSAgICBlcnIgPSBfZHhfbWFwX3BoeXMoY29uZmlnLmNfZHNfc2VsLGJhc2VBZGRyLChuZXdMaW1pdCArIDQwOTUpIC8gNDA5Niwmb2Zmc2V0KTsKLSAgICBpZiAoZXJyID09IDEzMCkgewotCS8qIElmIHRoZSBUTlQgZnVuY3Rpb24gZmFpbGVkLCB3ZSBhcmUgcnVubmluZyBpbiBhIERQTUkgZW52aXJvbm1lbnQKLQkgKiBhbmQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB3b3JrLiBIb3dldmVyIHdlIGtub3cgaG93IHRvIGhhbmRsZQotCSAqIERQTUkgcHJvcGVybHksIHNvIHdlIHVzZSBvdXIgZ2VuZXJpYyBEUE1JIGZ1bmN0aW9ucyB0byBkbwotCSAqIHdoYXQgdGhlIFROVCBydW50aW1lIGxpYnJhcmllcyBjYW4ndC4KLQkgKi8KLQlyZXR1cm4gRFBNSV9tYXBQaHlzaWNhbEFkZHIoYmFzZSxsaW1pdCxpc0NhY2hlZCk7Ci0JfQotICAgIGlmIChlcnIgPT0gMCkKLQlyZXR1cm4gKHZvaWQqKShvZmZzZXQgKyBiYXNlT2ZzKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKLXsKLX0KLQotdWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCi17IHJldHVybiAweEZGRkZGRkZGVUw7IH0KLQotaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2Uodm9pZCAqcCx1bG9uZyBsZW5ndGgsdWxvbmcgKnBoeXNBZGRyZXNzKQoteyByZXR1cm4gZmFsc2U7IH0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQoteyByZXR1cm4gKHZvaWQqKWJhc2U7IH0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKLXsKLSAgICBpZiAoIXplcm9QdHIpCi0JemVyb1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigwLDB4RkZGRkYpOwotICAgIHJldHVybiAodm9pZCopKHplcm9QdHIgKyBNS19QSFlTKHJfc2VnLHJfb2ZmKSk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKQotewotICAgIFVTSE9SVCAgYWRkcix0OwotICAgIHZvaWQgICAgKnA7Ci0KLSAgICBpZiAoX2R4X3JlYWxfYWxsb2MoKHNpemUgKyAweEYpID4+IDQsJmFkZHIsJnQpICE9IDApCi0JcmV0dXJuIDA7Ci0gICAgKnJfc2VnID0gYWRkcjsgICAgICAgICAgICAgICAgICAvKiBSZWFsIG1vZGUgc2VnbWVudCBhZGRyZXNzICAgICovCi0gICAgKnJfb2ZmID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBSZWFsIG1vZGUgc2VnbWVudCBvZmZzZXQgICAgICovCi0gICAgcCA9IFBNX21hcFJlYWxQb2ludGVyKCpyX3NlZywqcl9vZmYpOwotICAgIF9QTV9hZGRSZWFsTW9kZUJsb2NrKHAsYWRkcik7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcodm9pZCAqbWVtKQotewotICAgIGlmIChtZW0pIF9keF9yZWFsX2ZyZWUoX1BNX2ZpbmRSZWFsTW9kZUJsb2NrKG1lbSkpOwotfQotCi0jZGVmaW5lIElORFBNSShyZWcpICAgICBybXJlZ3MucmVnID0gcmVncy0+cmVnCi0jZGVmaW5lIE9VVERQTUkocmVnKSAgICByZWdzLT5yZWcgPSBybXJlZ3MucmVnCi0KLXZvaWQgUE1BUEkgRFBNSV9pbnQ4NihpbnQgaW50bm8sIERQTUlfcmVncyAqcmVncykKLXsKLSAgICBTV0lfUkVHUyAgICBybXJlZ3M7Ci0KLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIElORFBNSShlYXgpOyBJTkRQTUkoZWJ4KTsgSU5EUE1JKGVjeCk7IElORFBNSShlZHgpOyBJTkRQTUkoZXNpKTsgSU5EUE1JKGVkaSk7Ci0KLSAgICBfZHhfcmVhbF9pbnQoaW50bm8sJnJtcmVncyk7Ci0KLSAgICBPVVREUE1JKGVheCk7IE9VVERQTUkoZWJ4KTsgT1VURFBNSShlY3gpOyBPVVREUE1JKGVkeCk7IE9VVERQTUkoZXNpKTsgT1VURFBNSShlZGkpOwotICAgIHJlZ3MtPmZsYWdzID0gcm1yZWdzLmZsYWdzOwotfQotCi0jZGVmaW5lIElOKHJlZykgICAgIHJtcmVncy5yZWcgPSBpbi0+ZS5yZWcKLSNkZWZpbmUgT1VUKHJlZykgICAgb3V0LT5lLnJlZyA9IHJtcmVncy5yZWcKLQotaW50IFBNQVBJIFBNX2ludDg2KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQpCi17Ci0gICAgU1dJX1JFR1MgICAgcm1yZWdzOwotCi0gICAgbWVtc2V0KCZybXJlZ3MsIDAsIHNpemVvZihybXJlZ3MpKTsKLSAgICBJTihlYXgpOyBJTihlYngpOyBJTihlY3gpOyBJTihlZHgpOyBJTihlc2kpOyBJTihlZGkpOwotCi0gICAgX2R4X3JlYWxfaW50KGludG5vLCZybXJlZ3MpOwotCi0gICAgT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVkeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKLSAgICBvdXQtPnguY2ZsYWcgPSBybXJlZ3MuZmxhZ3MgJiAweDE7Ci0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotaW50IFBNQVBJIFBNX2ludDg2eChpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIFNXSV9SRUdTICAgIHJtcmVnczsKLQotICAgIG1lbXNldCgmcm1yZWdzLCAwLCBzaXplb2Yocm1yZWdzKSk7Ci0gICAgSU4oZWF4KTsgSU4oZWJ4KTsgSU4oZWN4KTsgSU4oZWR4KTsgSU4oZXNpKTsgSU4oZWRpKTsKLSAgICBybXJlZ3MuZXMgPSBzcmVncy0+ZXM7Ci0gICAgcm1yZWdzLmRzID0gc3JlZ3MtPmRzOwotCi0gICAgX2R4X3JlYWxfaW50KGludG5vLCZybXJlZ3MpOwotCi0gICAgT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVkeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKLSAgICBzcmVncy0+ZXMgPSBybXJlZ3MuZXM7Ci0gICAgc3JlZ3MtPmNzID0gcm1yZWdzLmNzOwotICAgIHNyZWdzLT5zcyA9IHJtcmVncy5zczsKLSAgICBzcmVncy0+ZHMgPSBybXJlZ3MuZHM7Ci0gICAgb3V0LT54LmNmbGFnID0gcm1yZWdzLmZsYWdzICYgMHgxOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KHVsb25nICpwaHlzaWNhbCx1bG9uZyAqdG90YWwpCi17Ci0gICAgUE1SRUdTICByOwotICAgIHVpbnQgICAgZGF0YVsyNV07Ci0KLSAgICByLnguYXggPSAweDI1MjA7ICAgICAgICAgICAgICAgIC8qIEdldCBmcmVlIG1lbW9yeSBpbmZvICovCi0gICAgci54LmJ4ID0gMDsKLSAgICByLmUuZWR4ID0gKHVpbnQpZGF0YTsKLSAgICBQTV9pbnQzODYoMHgyMSwgJnIsICZyKTsKLSAgICAqcGh5c2ljYWwgPSBkYXRhWzIxXSAqIDQwOTY7Ci0gICAgKnRvdGFsID0gZGF0YVsyM10gKiA0MDk2OwotfQotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFN5bWFudGVjIEMrKyBET1NYIGFuZCBGbGFzaFRlayBYLTMyL1gtMzJWTSBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgZGVmaW5lZChET1NYKSB8fCBkZWZpbmVkKFgzMlZNKQotCi0jaWZkZWYgIFgzMlZNCi0jaW5jbHVkZSA8eDMyLmg+Ci0KLSNkZWZpbmUgX3gzODZfbWtfcHJvdGVjdGVkX3B0cihwKSAgIF94MzJfbWtfcHJvdGVjdGVkX3B0cigodm9pZCopcCkKLSNkZWZpbmUgX3gzODZfZnJlZV9wcm90ZWN0ZWRfcHRyKHApIF94MzJfZnJlZV9wcm90ZWN0ZWRfcHRyKHApCi0jZGVmaW5lIF94Mzg2X3plcm9fYmFzZV9wdHIgICAgICAgICBfeDMyX3plcm9fYmFzZV9wdHIKLSNlbHNlCi1leHRlcm4gdm9pZCAqX3gzODZfemVyb19iYXNlX3B0cjsKLSNlbmRpZgotCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIodWludCByX3NlZyx1aW50IHJfb2ZmKQotewotICAgIHJldHVybiAodm9pZCopKCh1bG9uZylfeDM4Nl96ZXJvX2Jhc2VfcHRyICsgTUtfUEhZUyhyX3NlZyxyX29mZikpOwotfQotCi12b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKHVpbnQgc2l6ZSx1aW50ICpyX3NlZyx1aW50ICpyX29mZikKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLmguYWggPSAweDQ4OyAgICAgICAgICAgICAgICAgIC8qIERPUyBmdW5jdGlvbiA0OGggLSBhbGxvY2F0ZSBtZW0gICovCi0gICAgci54LmJ4ID0gKHNpemUgKyAweEYpID4+IDQ7ICAgICAvKiBOdW1iZXIgb2YgcGFyYWdyYXBocyB0byBhbGxvY2F0ZSAqLwotICAgIFBNX2ludDM4NigweDIxLCAmciwgJnIpOyAgICAgICAgLyogQ2FsbCBET1MgZXh0ZW5kZXIgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoci54LmNmbGFnKQotCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAvKiBDb3VsZCBub3QgYWxsb2NhdGUgdGhlIG1lbW9yeSAgICAqLwotICAgICpyX3NlZyA9IHIuZS5lYXg7Ci0gICAgKnJfb2ZmID0gMDsKLSAgICByZXR1cm4gUE1fbWFwUmVhbFBvaW50ZXIoKnJfc2VnLCpyX29mZik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcodm9pZCAqbWVtKQotewotICAgIC8qIENhbm5vdCBkZS1hbGxvY2F0ZSB0aGlzIG1lbW9yeSAqLwotICAgIG1lbSA9IG1lbTsKLX0KLQotI3ByYWdtYSBwYWNrKDEpCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1c2hvcnQgIGludG5vOwotICAgIHVzaG9ydCAgZHM7Ci0gICAgdXNob3J0ICBlczsKLSAgICB1c2hvcnQgIGZzOwotICAgIHVzaG9ydCAgZ3M7Ci0gICAgdWxvbmcgICBlYXg7Ci0gICAgdWxvbmcgICBlZHg7Ci0gICAgfSBfUk1SRUdTOwotCi0jcHJhZ21hIHBhY2soKQotCi0jZGVmaW5lIElOKHJlZykgICAgIHJlZ3MuZS5yZWcgPSBpbi0+ZS5yZWcKLSNkZWZpbmUgT1VUKHJlZykgICAgb3V0LT5lLnJlZyA9IHJlZ3MuZS5yZWcKLQotaW50IFBNQVBJIFBNX2ludDg2KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQpCi17Ci0gICAgX1JNUkVHUyBybXJlZ3M7Ci0gICAgUE1SRUdTICByZWdzOwotICAgIFBNU1JFR1MgcG1zcmVnczsKLQotICAgIHJtcmVncy5pbnRubyA9IGludG5vOwotICAgIHJtcmVncy5lYXggPSBpbi0+ZS5lYXg7Ci0gICAgcm1yZWdzLmVkeCA9IGluLT5lLmVkeDsKLSAgICBJTihlYngpOyBJTihlY3gpOyBJTihlc2kpOyBJTihlZGkpOwotICAgIHJlZ3MueC5heCA9IDB4MjUxMTsKLSAgICByZWdzLmUuZWR4ID0gKHVpbnQpKCZybXJlZ3MpOwotICAgIFBNX3NlZ3JlYWQoJnBtc3JlZ3MpOwotICAgIFBNX2ludDM4NngoMHgyMSwmcmVncywmcmVncywmcG1zcmVncyk7Ci0KLSAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZXNpKTsgT1VUKGVkaSk7Ci0gICAgb3V0LT54LmR4ID0gcm1yZWdzLmVkeDsKLSAgICBvdXQtPnguY2ZsYWcgPSByZWdzLnguY2ZsYWc7Ci0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotaW50IFBNQVBJIFBNX2ludDg2eChpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0LCBSTVNSRUdTICpzcmVncykKLXsKLSAgICBfUk1SRUdTIHJtcmVnczsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0gICAgUE1TUkVHUyBwbXNyZWdzOwotCi0gICAgcm1yZWdzLmludG5vID0gaW50bm87Ci0gICAgcm1yZWdzLmVheCA9IGluLT5lLmVheDsKLSAgICBybXJlZ3MuZWR4ID0gaW4tPmUuZWR4OwotICAgIHJtcmVncy5lcyA9IHNyZWdzLT5lczsKLSAgICBybXJlZ3MuZHMgPSBzcmVncy0+ZHM7Ci0gICAgSU4oZWJ4KTsgSU4oZWN4KTsgSU4oZXNpKTsgSU4oZWRpKTsKLSAgICByZWdzLnguYXggPSAweDI1MTE7Ci0gICAgcmVncy5lLmVkeCA9ICh1aW50KSgmcm1yZWdzKTsKLSAgICBQTV9zZWdyZWFkKCZwbXNyZWdzKTsKLSAgICBQTV9pbnQzODZ4KDB4MjEsJnJlZ3MsJnJlZ3MsJnBtc3JlZ3MpOwotCi0gICAgT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVzaSk7IE9VVChlZGkpOwotICAgIHNyZWdzLT5lcyA9IHJtcmVncy5lczsKLSAgICBzcmVncy0+ZHMgPSBybXJlZ3MuZHM7Ci0gICAgb3V0LT54LmR4ID0gcm1yZWdzLmVkeDsKLSAgICBvdXQtPnguY2ZsYWcgPSByZWdzLnguY2ZsYWc7Ci0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCi17Ci0gICAgcmV0dXJuICh2b2lkKikoKHVsb25nKV94Mzg2X3plcm9fYmFzZV9wdHIgKyAweDQwMCk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKLXsKLSAgICByZXR1cm4gKHZvaWQqKSgodWxvbmcpX3gzODZfemVyb19iYXNlX3B0ciArIDB4QTAwMDApOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgVlhEX3JlZ3MgICAgcmVnczsKLQotICAgIC8qIElmIHdlIGhhdmUgY29ubmVjdGVkIHRvIG91ciBoZWxwZXIgVnhEIGluIGEgV2luZG93cyBET1MgYm94LCB1c2UKLSAgICAgKiB0aGUgaGVscGVyIFZ4RCBzZXJ2aWNlcyB0byBtYXAgbWVtb3J5IGluc3RlYWQgb2YgdGhlIERQTUkgc2VydmljZXMuCi0gICAgICogV2UgZG8gdGhpcyBiZWNhdXNlIHRoZSBoZWxwZXIgVnhEIGNhbiBwcm9wZXJseSBkaXNhYmxlIGNhY2hpbmcKLSAgICAgKiB3aGVyZSBuZWNlc3NhcnksIHdoaWNoIHdlIGNhbiBvbmx5IGRvIGRpcmVjdGx5IGhlcmUgaWYgd2UgYXJlCi0gICAgICogcnVubmluZyBhdCByaW5nIDAgKGllOiB1bmRlciByZWFsIERPUykuCi0gICAgICovCi0gICAgaWYgKFZYRF92ZXJzaW9uID09IC0xKQotCVBNX2luaXQoKTsKLSAgICBpZiAoVlhEX3ZlcnNpb24pIHsKLQltZW1zZXQoJnJlZ3MsMCxzaXplb2YocmVncykpOwotCXJlZ3MuZWF4ID0gQVBJX05VTShQTUhFTFBfTUFQUEhZUyk7Ci0JcmVncy5lYnggPSBiYXNlOwotCXJlZ3MuZWN4ID0gbGltaXQ7Ci0JcmVncy5lZHggPSBpc0NhY2hlZDsKLQlfUE1fVnhEQ2FsbCgmcmVncyxfUE1fVlhEX29mZixfUE1fVlhEX3NlbCk7Ci0JcmV0dXJuICh2b2lkKilyZWdzLmVheDsKLQl9Ci0KLSAgICBpZiAoYmFzZSA+IDB4MTAwMDAwKQotCXJldHVybiBfeDM4Nl9tYXBfcGh5c2ljYWxfYWRkcmVzcygodm9pZCopYmFzZSxsaW1pdCk7Ci0gICAgcmV0dXJuICh2b2lkKikoKHVsb25nKV94Mzg2X3plcm9fYmFzZV9wdHIgKyBiYXNlKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBNYXBwaW5nIGNhbm5vdCBiZSBmcmVlZCAqLwotfQotCi11bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCkKLXsgcmV0dXJuIDB4RkZGRkZGRkZVTDsgfQotCi1pYm9vbCBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHJSYW5nZSh2b2lkICpwLHVsb25nIGxlbmd0aCx1bG9uZyAqcGh5c0FkZHJlc3MpCi17IHJldHVybiBmYWxzZTsgfQotCi12b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKHZvaWQgKmJhc2UsdWxvbmcgbGltaXQpCi17IHJldHVybiAodm9pZCopYmFzZTsgfQotCi11bG9uZyBfY2RlY2wgX1gzMl9nZXRQaHlzTWVtKHZvaWQpOwotCi12b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSh1bG9uZyAqcGh5c2ljYWwsdWxvbmcgKnRvdGFsKQotewotICAgIFBNUkVHUyAgcmVnczsKLQotICAgIC8qIEdldCB0b3RhbCBtZW1vcnkgYXZhaWxhYmxlLCBpbmNsdWRpbmcgdmlydHVhbCBtZW1vcnkgKi8KLSAgICByZWdzLnguYXggPSAweDM1MEI7Ci0gICAgUE1faW50Mzg2KDB4MjEsJnJlZ3MsJnJlZ3MpOwotICAgICp0b3RhbCA9IHJlZ3MuZS5lYXg7Ci0KLSAgICAvKiBHZXQgcGh5c2ljYWwgbWVtb3J5IGF2YWlsYWJsZSAqLwotICAgICpwaHlzaWNhbCA9IF9YMzJfZ2V0UGh5c01lbSgpOwotICAgIGlmICgqcGh5c2ljYWwgPiAqdG90YWwpCi0JKnBoeXNpY2FsID0gKnRvdGFsOwotfQotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEJvcmxhbmQncyBEUE1JMzIsIFdhdGNvbSBET1M0R1cgYW5kIERKR1BQIERQTUkgc3VwcG9ydCByb3V0aW5lcyAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgZGVmaW5lZChEUE1JMzIpIHx8IGRlZmluZWQoRE9TNEdXKSB8fCBkZWZpbmVkKERKR1BQKQotCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsKLSAgICByZXR1cm4gUE1fbWFwUGh5c2ljYWxBZGRyKDB4NDAwLDB4RkZGRix0cnVlKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQotewotICAgIHJldHVybiBQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwweEZGRkYsdHJ1ZSk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCxpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICBWWERfcmVncyAgICByZWdzOwotCi0jaWZkZWYgIERKR1BQCi0gICAgLyogRW5hYmxlIG5lYXIgcG9pbnRlcnMgZm9yIERKR1BQIFYyICovCi0gICAgX19kamdwcF9uZWFycHRyX2VuYWJsZSgpOwotI2VuZGlmCi0gICAgLyogSWYgd2UgaGF2ZSBjb25uZWN0ZWQgdG8gb3VyIGhlbHBlciBWeEQgaW4gYSBXaW5kb3dzIERPUyBib3gsIHVzZQotICAgICAqIHRoZSBoZWxwZXIgVnhEIHNlcnZpY2VzIHRvIG1hcCBtZW1vcnkgaW5zdGVhZCBvZiB0aGUgRFBNSSBzZXJ2aWNlcy4KLSAgICAgKiBXZSBkbyB0aGlzIGJlY2F1c2UgdGhlIGhlbHBlciBWeEQgY2FuIHByb3Blcmx5IGRpc2FibGUgY2FjaGluZwotICAgICAqIHdoZXJlIG5lY2Vzc2FyeSwgd2hpY2ggd2UgY2FuIG9ubHkgZG8gZGlyZWN0bHkgaGVyZSBpZiB3ZSBhcmUKLSAgICAgKiBydW5uaW5nIGF0IHJpbmcgMCAoaWU6IHVuZGVyIHJlYWwgRE9TKS4KLSAgICAgKi8KLSAgICBpZiAoVlhEX3ZlcnNpb24gPT0gLTEpCi0JUE1faW5pdCgpOwotICAgIGlmIChWWERfdmVyc2lvbikgewotCW1lbXNldCgmcmVncywwLHNpemVvZihyZWdzKSk7Ci0JcmVncy5lYXggPSBBUElfTlVNKFBNSEVMUF9NQVBQSFlTKTsKLQlyZWdzLmVieCA9IGJhc2U7Ci0JcmVncy5lY3ggPSBsaW1pdDsKLQlyZWdzLmVkeCA9IGlzQ2FjaGVkOwotCV9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKLQlyZXR1cm4gKHZvaWQqKXJlZ3MuZWF4OwotCX0KLSAgICByZXR1cm4gRFBNSV9tYXBQaHlzaWNhbEFkZHIoYmFzZSxsaW1pdCxpc0NhY2hlZCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcih2b2lkICpwdHIsdWxvbmcgbGltaXQpCi17Ci0gICAgLyogTWFwcGluZyBjYW5ub3QgYmUgZnJlZWQgKi8KLSAgICAodm9pZClwdHI7Ci0gICAgKHZvaWQpbGltaXQ7Ci19Ci0KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcih2b2lkICpwKQotewotICAgIHVsb25nICAgcGh5c0FkZHI7Ci0gICAgaWYgKCFQTV9nZXRQaHlzaWNhbEFkZHJSYW5nZShwLDEsJnBoeXNBZGRyKSkKLQlyZXR1cm4gMHhGRkZGRkZGRjsKLSAgICByZXR1cm4gcGh5c0FkZHIgfCAoKHVsb25nKXAgJiAweEZGRik7Ci19Ci0KLWlib29sIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKAotICAgIHZvaWQgKnAsCi0gICAgdWxvbmcgbGVuZ3RoLAotICAgIHVsb25nICpwaHlzQWRkcmVzcykKLXsKLSAgICBWWERfcmVncyAgICByZWdzOwotICAgIHVsb25nICAgICAgIHB0ZTsKLSAgICBQTVNSRUdTICAgICBzcmVnczsKLSAgICB1bG9uZyAgICAgICBEU0Jhc2VBZGRyOwotCi0gICAgLyogSWYgd2UgaGF2ZSBjb25uZWN0ZWQgdG8gb3VyIGhlbHBlciBWeEQgaW4gYSBXaW5kb3dzIERPUyBib3gsIHVzZSB0aGUKLSAgICAgKiBoZWxwZXIgVnhEIHNlcnZpY2VzIHRvIGZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYW4gYWRkcmVzcy4KLSAgICAgKi8KLSAgICBpZiAoVlhEX3ZlcnNpb24pIHsKLQltZW1zZXQoJnJlZ3MsMCxzaXplb2YocmVncykpOwotCXJlZ3MuZWF4ID0gQVBJX05VTShQTUhFTFBfR0VUUEhZU0lDQUxBRERSUkFOR0UpOwotCXJlZ3MuZWJ4ID0gKHVsb25nKXA7Ci0JcmVncy5lY3ggPSAodWxvbmcpbGVuZ3RoOwotCXJlZ3MuZWR4ID0gKHVsb25nKXBoeXNBZGRyZXNzOwotCV9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKLQlyZXR1cm4gcmVncy5lYXg7Ci0JfQotCi0gICAgLyogRmluZCBiYXNlIGFkZHJlc3MgZm9yIGRlZmF1bHQgRFMgc2VsZWN0b3IgKi8KLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgRFNCYXNlQWRkciA9IERQTUlfZ2V0U2VsZWN0b3JCYXNlKHNyZWdzLmRzKTsKLQotICAgIC8qIE90aGVyd2lzZSBkaXJlY3RseSBhY2Nlc3MgdGhlIHBhZ2UgdGFibGVzIHRvIGRldGVybWluZSB0aGUKLSAgICAgKiBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcy4gTm90ZSB0aGF0IHdlIHRvdWNoIHRoZSBtZW1vcnkgYmVmb3JlCi0gICAgICogY2FsbGluZywgb3RoZXJ3aXNlIHRoZSBtZW1vcnkgbWF5IG5vdCBiZSBwYWdlZCBpbiBjb3JyZWN0bHkuCi0gICAgICovCi0gICAgcHRlID0gKigodWxvbmcqKXApOwotI2lmZGVmICBET1M0R1cKLSAgICBpZiAoX1BNX3BhZ2luZ0VuYWJsZWQoKSA9PSAwKSB7Ci0JaW50ICAgICBjb3VudDsKLQl1bG9uZyAgIGxpbkFkZHIgPSAodWxvbmcpcDsKLQotCS8qIFdoZW4gcGFnaW5nIGlzIGRpc2FibGVkIHBoeXNpY2FsPWxpbmVhciAqLwotCWZvciAoY291bnQgPSAobGVuZ3RoKzB4RkZGKSA+PiAxMjsgY291bnQgPiAwOyBjb3VudC0tKSB7Ci0JICAgICpwaHlzQWRkcmVzcysrID0gbGluQWRkcjsKLQkgICAgbGluQWRkciArPSA0MDk2OwotCSAgICB9Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIGVsc2UgaWYgKChQREIgPSBfUE1fZ2V0UERCKCkpICE9IDAgJiYgRFNCYXNlQWRkciA9PSAwKSB7Ci0JaW50ICAgICBzdGFydFBEQixlbmRQREIsaVBEQixzdGFydFBhZ2UsZW5kUGFnZSxzdGFydCxlbmQsaVBhZ2U7Ci0JdWxvbmcgICBwYWdlVGFibGUsKnBQYWdlVGFibGUsbGluQWRkciA9ICh1bG9uZylwOwotCXVsb25nICAgbGltaXQgPSBsZW5ndGgtMTsKLQotCXBQREIgPSAodWxvbmcqKURQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcihQREIsMHhGRkYpOwotCWlmIChwUERCKSB7Ci0JICAgIHN0YXJ0UERCID0gKGxpbkFkZHIgPj4gMjIpICYgMHgzRkZMOwotCSAgICBzdGFydFBhZ2UgPSAobGluQWRkciA+PiAxMikgJiAweDNGRkw7Ci0JICAgIGVuZFBEQiA9ICgobGluQWRkcitsaW1pdCkgPj4gMjIpICYgMHgzRkZMOwotCSAgICBlbmRQYWdlID0gKChsaW5BZGRyK2xpbWl0KSA+PiAxMikgJiAweDNGRkw7Ci0JICAgIGZvciAoaVBEQiA9IHN0YXJ0UERCOyBpUERCIDw9IGVuZFBEQjsgaVBEQisrKSB7Ci0JCXBhZ2VUYWJsZSA9IHBQREJbaVBEQl0gJiB+MHhGRkZMOwotCQlwUGFnZVRhYmxlID0gKHVsb25nKilEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIocGFnZVRhYmxlLDB4RkZGKTsKLQkJc3RhcnQgPSAoaVBEQiA9PSBzdGFydFBEQikgPyBzdGFydFBhZ2UgOiAwOwotCQllbmQgPSAoaVBEQiA9PSBlbmRQREIpID8gZW5kUGFnZSA6IDB4M0ZGTDsKLQkJZm9yIChpUGFnZSA9IHN0YXJ0OyBpUGFnZSA8PSBlbmQ7IGlQYWdlKyspCi0JCSAgICAqcGh5c0FkZHJlc3MrKyA9IChwUGFnZVRhYmxlW2lQYWdlXSAmIH4weEZGRik7Ci0JCX0KLQkgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3Modm9pZCAqYmFzZSx1bG9uZyBsaW1pdCkKLXsKLSAgICAodm9pZClsaW1pdDsKLSAgICByZXR1cm4gKHZvaWQqKWJhc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcih1aW50IHJfc2VnLHVpbnQgcl9vZmYpCi17Ci0gICAgc3RhdGljIHVjaGFyICp6ZXJvUHRyID0gTlVMTDsKLQotICAgIGlmICghemVyb1B0cikKLQl6ZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRix0cnVlKTsKLSAgICByZXR1cm4gKHZvaWQqKSh6ZXJvUHRyICsgTUtfUEhZUyhyX3NlZyxyX29mZikpOwotfQotCi12b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKHVpbnQgc2l6ZSx1aW50ICpyX3NlZyx1aW50ICpyX29mZikKLXsKLSAgICBQTVJFR1MgICAgICByOwotICAgIHZvaWQgICAgICAgICpwOwotCi0gICAgci54LmF4ID0gMHgxMDA7ICAgICAgICAgICAgICAgICAvKiBEUE1JIGFsbG9jYXRlIERPUyBtZW1vcnkgICAgICAgICAqLwotICAgIHIueC5ieCA9IChzaXplICsgMHhGKSA+PiA0OyAgICAgLyogbnVtYmVyIG9mIHBhcmFncmFwaHMgICAgICAgICAgICAgKi8KLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICBpZiAoci54LmNmbGFnKQotCXJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBEUE1JIGNhbGwgZmFpbGVkICAgICAgICAgICAgICAgICAqLwotICAgICpyX3NlZyA9IHIueC5heDsgICAgICAgICAgICAgICAgLyogUmVhbCBtb2RlIHNlZ21lbnQgICAgICAgICAgICAgICAgKi8KLSAgICAqcl9vZmYgPSAwOwotICAgIHAgPSBQTV9tYXBSZWFsUG9pbnRlcigqcl9zZWcsKnJfb2ZmKTsKLSAgICBfUE1fYWRkUmVhbE1vZGVCbG9jayhwLHIueC5keCk7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcodm9pZCAqbWVtKQotewotICAgIFBNUkVHUyAgcjsKLQotICAgIGlmIChtZW0pIHsKLQlyLnguYXggPSAweDEwMTsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIGZyZWUgRE9TIG1lbW9yeSAgICAgICAgICovCi0Jci54LmR4ID0gX1BNX2ZpbmRSZWFsTW9kZUJsb2NrKG1lbSk7LyogRFggOj0gc2VsZWN0b3IgZnJvbSAweDEwMCAgICAqLwotCVBNX2ludDM4NigweDMxLCAmciwgJnIpOwotCX0KLX0KLQotc3RhdGljIERQTUlfaGFuZGxlcl90ICAgRFBNSV9pbnQxMCA9IE5VTEw7Ci0KLXZvaWQgUE1BUEkgRFBNSV9zZXRJbnQxMEhhbmRsZXIoRFBNSV9oYW5kbGVyX3QgaGFuZGxlcikKLXsKLSAgICBEUE1JX2ludDEwID0gaGFuZGxlcjsKLX0KLQotdm9pZCBQTUFQSSBEUE1JX2ludDg2KGludCBpbnRubywgRFBNSV9yZWdzICpyZWdzKQotewotICAgIFBNUkVHUyAgICAgIHI7Ci0gICAgUE1TUkVHUyAgICAgc3I7Ci0KLSAgICBpZiAoaW50bm8gPT0gMHgxMCAmJiBEUE1JX2ludDEwKSB7Ci0JaWYgKERQTUlfaW50MTAocmVncykpCi0JICAgIHJldHVybjsKLQl9Ci0gICAgUE1fc2VncmVhZCgmc3IpOwotICAgIHIueC5heCA9IDB4MzAwOyAgICAgICAgICAgICAgICAgLyogRFBNSSBpc3N1ZSByZWFsIGludGVycnVwdCAgICAqLwotICAgIHIuaC5ibCA9IGludG5vOwotICAgIHIuaC5iaCA9IDA7Ci0gICAgci54LmN4ID0gMDsKLSAgICBzci5lcyA9IHNyLmRzOwotICAgIHIuZS5lZGkgPSAodWludClyZWdzOwotICAgIFBNX2ludDM4NngoMHgzMSwgJnIsICZyLCAmc3IpOyAgLyogSXNzdWUgdGhlIGludGVycnVwdCAgICAgICAgICAqLwotfQotCi0jZGVmaW5lIElOKHJlZykgICAgIHJtcmVncy5yZWcgPSBpbi0+ZS5yZWcKLSNkZWZpbmUgT1VUKHJlZykgICAgb3V0LT5lLnJlZyA9IHJtcmVncy5yZWcKLQotaW50IFBNQVBJIFBNX2ludDg2KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQpCi17Ci0gICAgRFBNSV9yZWdzICAgcm1yZWdzOwotCi0gICAgbWVtc2V0KCZybXJlZ3MsIDAsIHNpemVvZihybXJlZ3MpKTsKLSAgICBJTihlYXgpOyBJTihlYngpOyBJTihlY3gpOyBJTihlZHgpOyBJTihlc2kpOyBJTihlZGkpOwotCi0gICAgRFBNSV9pbnQ4NihpbnRubywmcm1yZWdzKTsgICAgICAvKiBEUE1JIGlzc3VlIHJlYWwgaW50ZXJydXB0ICAgICovCi0KLSAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZWR4KTsgT1VUKGVzaSk7IE9VVChlZGkpOwotICAgIG91dC0+eC5jZmxhZyA9IHJtcmVncy5mbGFncyAmIDB4MTsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi1pbnQgUE1BUEkgUE1faW50ODZ4KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgRFBNSV9yZWdzICAgcm1yZWdzOwotCi0gICAgbWVtc2V0KCZybXJlZ3MsIDAsIHNpemVvZihybXJlZ3MpKTsKLSAgICBJTihlYXgpOyBJTihlYngpOyBJTihlY3gpOyBJTihlZHgpOyBJTihlc2kpOyBJTihlZGkpOwotICAgIHJtcmVncy5lcyA9IHNyZWdzLT5lczsKLSAgICBybXJlZ3MuZHMgPSBzcmVncy0+ZHM7Ci0KLSAgICBEUE1JX2ludDg2KGludG5vLCZybXJlZ3MpOyAgICAgIC8qIERQTUkgaXNzdWUgcmVhbCBpbnRlcnJ1cHQgICAgKi8KLQotICAgIE9VVChlYXgpOyBPVVQoZWJ4KTsgT1VUKGVjeCk7IE9VVChlZHgpOyBPVVQoZXNpKTsgT1VUKGVkaSk7Ci0gICAgc3JlZ3MtPmVzID0gcm1yZWdzLmVzOwotICAgIHNyZWdzLT5jcyA9IHJtcmVncy5jczsKLSAgICBzcmVncy0+c3MgPSBybXJlZ3Muc3M7Ci0gICAgc3JlZ3MtPmRzID0gcm1yZWdzLmRzOwotICAgIG91dC0+eC5jZmxhZyA9IHJtcmVncy5mbGFncyAmIDB4MTsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi0jcHJhZ21hIHBhY2soMSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVpbnQgICAgTGFyZ2VzdEJsb2NrQXZhaWw7Ci0JdWludCAgICBNYXhVbmxvY2tlZFBhZ2U7Ci0JdWludCAgICBMYXJnZXN0TG9ja2FibGVQYWdlOwotCXVpbnQgICAgTGluQWRkclNwYWNlOwotCXVpbnQgICAgTnVtRnJlZVBhZ2VzQXZhaWw7Ci0JdWludCAgICBOdW1QaHlzaWNhbFBhZ2VzRnJlZTsKLQl1aW50ICAgIFRvdGFsUGh5c2ljYWxQYWdlczsKLQl1aW50ICAgIEZyZWVMaW5BZGRyU3BhY2U7Ci0JdWludCAgICBTaXplT2ZQYWdlRmlsZTsKLQl1aW50ICAgIHJlc1szXTsKLQl9IE1lbUluZm87Ci0KLSNwcmFnbWEgcGFjaygpCi0KLXZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KHVsb25nICpwaHlzaWNhbCx1bG9uZyAqdG90YWwpCi17Ci0gICAgUE1SRUdTICByOwotICAgIFBNU1JFR1Mgc3I7Ci0gICAgTWVtSW5mbyBtZW1JbmZvOwotCi0gICAgUE1fc2VncmVhZCgmc3IpOwotICAgIHIueC5heCA9IDB4NTAwOyAgICAgICAgICAgICAgICAgLyogRFBNSSBnZXQgZnJlZSBtZW1vcnkgaW5mbyAqLwotICAgIHNyLmVzID0gc3IuZHM7Ci0gICAgci5lLmVkaSA9ICh1aW50KSZtZW1JbmZvOwotICAgIFBNX2ludDM4NngoMHgzMSwgJnIsICZyLCAmc3IpOyAgLyogSXNzdWUgdGhlIGludGVycnVwdCAqLwotICAgICpwaHlzaWNhbCA9IG1lbUluZm8uTnVtUGh5c2ljYWxQYWdlc0ZyZWUgKiA0MDk2OwotICAgICp0b3RhbCA9IG1lbUluZm8uTGFyZ2VzdEJsb2NrQXZhaWw7Ci0gICAgaWYgKCp0b3RhbCA8ICpwaHlzaWNhbCkKLQkqcGh5c2ljYWwgPSAqdG90YWw7Ci19Ci0KLSNlbmRpZgotCi0jaWZuZGVmIF9fMTZCSVRfXwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBiYW5rcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBKAotICAgIGludCBiYW5rKQotewotICAgIERQTUlfcmVncyAgIHJlZ3M7Ci0gICAgbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YocmVncykpOwotICAgIHJlZ3MuZWF4ID0gMHg0RjA1OwotICAgIHJlZ3MuZWJ4ID0gMHgwMDAwOwotICAgIHJlZ3MuZWR4ID0gYmFuazsKLSAgICBEUE1JX2ludDg2KDB4MTAsJnJlZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBiYW5rcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBQigKLSAgICBpbnQgYmFuaykKLXsKLSAgICBEUE1JX3JlZ3MgICByZWdzOwotICAgIG1lbXNldCgmcmVncywgMCwgc2l6ZW9mKHJlZ3MpKTsKLSAgICByZWdzLmVheCA9IDB4NEYwNTsKLSAgICByZWdzLmVieCA9IDB4MDAwMDsKLSAgICByZWdzLmVkeCA9IGJhbms7Ci0gICAgRFBNSV9pbnQ4NigweDEwLCZyZWdzKTsKLSAgICByZWdzLmVheCA9IDB4NEYwNTsKLSAgICByZWdzLmVieCA9IDB4MDAwMTsKLSAgICByZWdzLmVkeCA9IGJhbms7Ci0gICAgRFBNSV9pbnQ4NigweDEwLCZyZWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBWQkUvQ29yZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gY2hhbmdlIGRpc3BsYXkgc3RhcnQgYWRkcmVzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldENSVFN0YXJ0KAotICAgIGludCB4LAotICAgIGludCB5LAotICAgIGludCB3YWl0VlJUKQotewotICAgIERQTUlfcmVncyAgIHJlZ3M7Ci0gICAgbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YocmVncykpOwotICAgIHJlZ3MuZWF4ID0gMHg0RjA3OwotICAgIHJlZ3MuZWJ4ID0gd2FpdFZSVDsKLSAgICByZWdzLmVjeCA9IHg7Ci0gICAgcmVncy5lZHggPSB5OwotICAgIERQTUlfaW50ODYoMHgxMCwmcmVncyk7Ci19Ci0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludCBQTUFQSSBQTV9nZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2dldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBzZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3NldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9wbWRvcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3BtZG9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlY2MyZGEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3BtZG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDE2LzMyIGJpdCBET1MKLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKLSogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKLSogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5Ci0qICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKLSogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZG9zLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgUkVBTE1PREUKLXN0YXRpYyBpbnQgIGdsb2JhbERhdGFTdGFydDsKLSNlbmRpZgotCi1QTV9jcml0aWNhbEhhbmRsZXIgIF9WQVJBUEkgX1BNX2NyaXRIYW5kbGVyID0gTlVMTDsKLVBNX2JyZWFrSGFuZGxlciAgICAgX1ZBUkFQSSBfUE1fYnJlYWtIYW5kbGVyID0gTlVMTDsKLVBNX2ludEhhbmRsZXIgICAgICAgX1ZBUkFQSSBfUE1fdGltZXJIYW5kbGVyID0gTlVMTDsKLVBNX2ludEhhbmRsZXIgICAgICAgX1ZBUkFQSSBfUE1fcnRjSGFuZGxlciA9IE5VTEw7Ci1QTV9pbnRIYW5kbGVyICAgICAgIF9WQVJBUEkgX1BNX2tleUhhbmRsZXIgPSBOVUxMOwotUE1fa2V5MTVIYW5kbGVyICAgICBfVkFSQVBJIF9QTV9rZXkxNUhhbmRsZXIgPSBOVUxMOwotUE1fbW91c2VIYW5kbGVyICAgICBfVkFSQVBJIF9QTV9tb3VzZUhhbmRsZXIgPSBOVUxMOwotUE1faW50SGFuZGxlciAgICAgICBfVkFSQVBJIF9QTV9pbnQxMEhhbmRsZXIgPSBOVUxMOwotaW50ICAgICAgICAgICAgICAgICBfVkFSQVBJIF9QTV9tb3VzZU1hc2s7Ci0KLXVjaGFyICogICAgIF9WQVJBUEkgX1BNX2N0cmxDUHRyOyAgICAgICAgICAgICAgIC8qIExvY2F0aW9uIG9mIEN0cmwtQyBmbGFnICAgICAgKi8KLXVjaGFyICogICAgIF9WQVJBUEkgX1BNX2N0cmxCUHRyOyAgICAgICAgICAgICAgIC8qIExvY2F0aW9uIG9mIEN0cmwtQnJlYWsgZmxhZyAgKi8KLXVjaGFyICogICAgIF9WQVJBUEkgX1BNX2NyaXRQdHI7ICAgICAgICAgICAgICAgIC8qIExvY2F0aW9uIG9mIENyaXRpY2FsIGVycm9yIEJmKi8KLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZUaW1lciA9IFBNTlVMTDsgICAgIC8qIFByZXZpb3VzIHRpbWVyIGhhbmRsZXIgICAgICAgKi8KLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZSVEMgPSBQTU5VTEw7ICAgICAgIC8qIFByZXZpb3VzIFJUQyBoYW5kbGVyICAgICAgICAgKi8KLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZLZXkgPSBQTU5VTEw7ICAgICAgIC8qIFByZXZpb3VzIGtleSBoYW5kbGVyICAgICAgICAgKi8KLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZLZXkxNSA9IFBNTlVMTDsgICAgIC8qIFByZXZpb3VzIGtleTE1IGhhbmRsZXIgICAgICAgKi8KLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZCcmVhayA9IFBNTlVMTDsgICAgIC8qIFByZXZpb3VzIGJyZWFrIGhhbmRsZXIgICAgICAgKi8KLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZDdHJsQyA9IFBNTlVMTDsgICAgIC8qIFByZXZpb3VzIEN0cmxDIGhhbmRsZXIgICAgICAgKi8KLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZDcml0aWNhbCA9IFBNTlVMTDsgIC8qIFByZXZpb3VzIGNyaXRpY2FsIGhhbmRsZXIgICAgKi8KLWxvbmcgICAgICAgIF9WQVJBUEkgX1BNX3ByZXZSZWFsVGltZXI7ICAgICAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSB0aW1lciAgICAgKi8KLWxvbmcgICAgICAgIF9WQVJBUEkgX1BNX3ByZXZSZWFsUlRDOyAgICAgICAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBSVEMgICAgICAgKi8KLWxvbmcgICAgICAgIF9WQVJBUEkgX1BNX3ByZXZSZWFsS2V5OyAgICAgICAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBrZXkgICAgICAgKi8KLWxvbmcgICAgICAgIF9WQVJBUEkgX1BNX3ByZXZSZWFsS2V5MTU7ICAgICAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBrZXkxNSAgICAgKi8KLWxvbmcgICAgICAgIF9WQVJBUEkgX1BNX3ByZXZSZWFsSW50MTA7ICAgICAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBpbnQgMTBoICAgKi8KLXN0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZENNT1NSZWdBOyAgICAgICAgICAgIC8qIENNT1MgcmVnaXN0ZXIgQSBjb250ZW50cyAgICAgKi8KLXN0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZENNT1NSZWdCOyAgICAgICAgICAgIC8qIENNT1MgcmVnaXN0ZXIgQiBjb250ZW50cyAgICAgKi8KLXN0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZFJUQ1BJQzI7ICAgICAgICAgICAgIC8qIE1hc2sgdmFsdWUgZm9yIFJUQyBJUlE4ICAgICAgKi8KLQotLyogU3RydWN0dXJlIHRvIG1haW50YWluIGluZm9ybWF0aW9uIGFib3V0IGhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVycywKLSAqIGluY2x1ZGUgYSBjb3B5IG9mIHRoZSBoYXJkd2FyZSBJUlEgYXNzZW1ibGVyIHRodW5rIChvbmUgZm9yIGVhY2gKLSAqIGhvb2tlZCBpbnRlcnJ1cHQgaGFuZGxlcikuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVjaGFyICAgICAgIElSUTsKLSAgICB1Y2hhciAgICAgICBJUlFWZWN0OwotICAgIHVjaGFyICAgICAgIHByZXZQSUM7Ci0gICAgdWNoYXIgICAgICAgcHJldlBJQzI7Ci0gICAgUE1GQVJQVFIgICAgcHJldkhhbmRsZXI7Ci0gICAgbG9uZyAgICAgICAgcHJldlJlYWxoYW5kbGVyOwotICAgIHVjaGFyICAgICAgIHRodW5rWzFdOwotICAgIC8qIElSUSBhc3NlbWJsZXIgdGh1bmsgZm9sbG93cyAuLi4gKi8KLSAgICB9IF9QTV9JUlFIYW5kbGU7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdsb2JhbHMgZm9yIGxvY2tpbmcgaW50ZXJydXB0IGhhbmRsZXJzIGluIF9wbWRvcy5hc20gKi8KLQotI2lmbmRlZiBSRUFMTU9ERQotZXh0ZXJuIGludCAgX1ZBUkFQSSBfUE1fcG1kb3NEYXRhU3RhcnQ7Ci1leHRlcm4gaW50ICBfVkFSQVBJIF9QTV9wbWRvc0RhdGFFbmQ7Ci1leHRlcm4gaW50ICBfVkFSQVBJIF9QTV9ETUFEYXRhU3RhcnQ7Ci1leHRlcm4gaW50ICBfVkFSQVBJIF9QTV9ETUFEYXRhRW5kOwotdm9pZCBfQVNNQVBJIF9QTV9wbWRvc0NvZGVTdGFydCh2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fcG1kb3NDb2RlRW5kKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9ETUFDb2RlU3RhcnQodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX0RNQUNvZGVFbmQodm9pZCk7Ci0jZW5kaWYKLQotLyogUHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0IGhhbmRsZXJzLCBhbHNvIGNhbGxlZCBieSBQTSBjYWxsYmFja3MgYmVsb3cgKi8KLQotdm9pZCBfQVNNQVBJIF9QTV90aW1lcklTUih2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fcnRjSVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9pcnFJU1JUZW1wbGF0ZSh2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1faXJxSVNSVGVtcGxhdGVFbmQodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX2tleUlTUih2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fa2V5MTVJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX2JyZWFrSVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9jdHJsQ0lTUih2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fY3JpdGljYWxJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX21vdXNlSVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9pbnQxMFBNQ0Iodm9pZCk7Ci0KLS8qIFByb3RlY3RlZCBtb2RlIERQTUkgY2FsbGJhY2sgaGFuZGxlcnMgKi8KLQotdm9pZCBfQVNNQVBJIF9QTV9tb3VzZVBNQ0Iodm9pZCk7Ci0KLS8qIFJvdXRpbmUgdG8gaW5zdGFsbCBhIG1vdXNlIGhhbmRsZXIgZnVuY3Rpb24gKi8KLQotdm9pZCBfQVNNQVBJIF9QTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2spOwotCi0vKiBSb3V0aW5lIHRvIGFsbG9jYXRlIERQTUkgcmVhbCBtb2RlIGNhbGxiYWNrIHJvdXRpbmVzICovCi0KLWlib29sIF9BU01BUEkgX0RQTUlfYWxsb2NhdGVDYWxsYmFjayh2b2lkIChfQVNNQVBJICpwbWNvZGUpKCksdm9pZCAqcm1yZWdzLGxvbmcgKlJNQ0IpOwotdm9pZCBfQVNNQVBJIF9EUE1JX2ZyZWVDYWxsYmFjayhsb25nIFJNQ0IpOwotCi0vKiBEUE1JIGhlbHBlciBmdW5jdGlvbnMgaW4gUE1MSVRFLkMgKi8KLQotdWxvbmcgICBQTUFQSSBEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIodWxvbmcgcGh5c0FkZHIsdWxvbmcgbGltaXQpOwotaW50ICAgICBQTUFQSSBEUE1JX3NldFNlbGVjdG9yQmFzZSh1c2hvcnQgc2VsLHVsb25nIGxpbkFkZHIpOwotdWxvbmcgICBQTUFQSSBEUE1JX2dldFNlbGVjdG9yQmFzZSh1c2hvcnQgc2VsKTsKLWludCAgICAgUE1BUEkgRFBNSV9zZXRTZWxlY3RvckxpbWl0KHVzaG9ydCBzZWwsdWxvbmcgbGltaXQpOwotdWludCAgICBQTUFQSSBEUE1JX2NyZWF0ZVNlbGVjdG9yKHVsb25nIGJhc2UsdWxvbmcgbGltaXQpOwotdm9pZCAgICBQTUFQSSBEUE1JX2ZyZWVTZWxlY3Rvcih1aW50IHNlbCk7Ci1pbnQgICAgIFBNQVBJIERQTUlfbG9ja0xpbmVhclBhZ2VzKHVsb25nIGxpbmVhcix1bG9uZyBsZW4pOwotaW50ICAgICBQTUFQSSBEUE1JX3VubG9ja0xpbmVhclBhZ2VzKHVsb25nIGxpbmVhcix1bG9uZyBsZW4pOwotCi0vKiBGdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgQ01PUyByZWdpc3RlcnMgKi8KLQotdWNoYXIgICBQTUFQSSBfUE1fcmVhZENNT1MoaW50IGluZGV4KTsKLXZvaWQgICAgUE1BUEkgX1BNX3dyaXRlQ01PUyhpbnQgaW5kZXgsdWNoYXIgdmFsdWUpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogR2VuZXJpYyByb3V0aW5lcyBjb21tb24gdG8gYWxsIGVudmlyb25tZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgUE1BUEkgUE1fcmVzZXRNb3VzZURyaXZlcihpbnQgaGFyZFJlc2V0KQotewotICAgIFJNUkVHUyAgICAgICAgICByZWdzOwotICAgIFBNX21vdXNlSGFuZGxlciBvbGRIYW5kbGVyID0gX1BNX21vdXNlSGFuZGxlcjsKLQotICAgIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIoKTsKLSAgICByZWdzLnguYXggPSBoYXJkUmVzZXQgPyAwIDogMzM7Ci0gICAgUE1faW50ODYoMHgzMywgJnJlZ3MsICZyZWdzKTsKLSAgICBpZiAob2xkSGFuZGxlcikKLQlQTV9zZXRNb3VzZUhhbmRsZXIoX1BNX21vdXNlTWFzaywgb2xkSGFuZGxlcik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeShpbnQgZnJlcXVlbmN5KQotewotICAgIHN0YXRpYyBzaG9ydCBjb252ZXJ0W10gPSB7Ci0JODE5MiwKLQk0MDk2LAotCTIwNDgsCi0JMTAyNCwKLQk1MTIsCi0JMjU2LAotCTEyOCwKLQk2NCwKLQkzMiwKLQkxNiwKLQk4LAotCTQsCi0JMiwKLQktMSwKLQl9OwotICAgIGludCBpOwotCi0gICAgLyogRmlyc3QgY2xlYXIgYW55IHBlbmRpbmcgUlRDIHRpbWVvdXQgaWYgbm90IGNsZWFyZWQgKi8KLSAgICBfUE1fcmVhZENNT1MoMHgwQyk7Ci0gICAgaWYgKGZyZXF1ZW5jeSA9PSAwKSB7Ci0JLyogRGlzYWJsZSBSVEMgdGltb3V0ICovCi0JX1BNX3dyaXRlQ01PUygweDBBLF9QTV9vbGRDTU9TUmVnQSk7Ci0JX1BNX3dyaXRlQ01PUygweDBCLF9QTV9vbGRDTU9TUmVnQiAmIDB4MEYpOwotCX0KLSAgICBlbHNlIHsKLQkvKiBDb252ZXJ0IGZyZXF1ZW5jeSB2YWx1ZSB0byBSVEMgY2xvY2sgaW5kZXhlcyAqLwotCWZvciAoaSA9IDA7IGNvbnZlcnRbaV0gIT0gLTE7IGkrKykgewotCSAgICBpZiAoY29udmVydFtpXSA9PSBmcmVxdWVuY3kpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkvKiBTZXQgUlRDIHRpbW91dCB2YWx1ZSBhbmQgZW5hYmxlIHRpbWVvdXQgKi8KLQlfUE1fd3JpdGVDTU9TKDB4MEEsMHgyMCB8IChpKzMpKTsKLQlfUE1fd3JpdGVDTU9TKDB4MEIsKF9QTV9vbGRDTU9TUmVnQiAmIDB4MEYpIHwgMHg0MCk7Ci0JfQotfQotCi0jaWZuZGVmIFJFQUxNT0RFCi0KLXN0YXRpYyB2b2lkIFBNQVBJIGxvY2tQTUhhbmRsZXJzKHZvaWQpCi17Ci0gICAgc3RhdGljIGludCAgICAgIGxvY2tlZCA9IDA7Ci0gICAgaW50ICAgICAgICAgICAgIHN0YXQ7Ci0gICAgUE1fbG9ja0hhbmRsZSAgIGxoOyAvKiBVbnVzZWQgaW4gRE9TICovCi0KLSAgICAvKiBMb2NrIGFsbCBvZiB0aGUgY29kZSBhbmQgZGF0YSB1c2VkIGJ5IG91ciBwcm90ZWN0ZWQgbW9kZSBpbnRlcnJ1cHQKLSAgICAgKiBoYW5kbGluZyByb3V0aW5lcywgc28gdGhhdCBpdCB3aWxsIGNvbnRpbnVlIHRvIHdvcmsgY29ycmVjdGx5Ci0gICAgICogdW5kZXIgcmVhbCBtb2RlLgotICAgICAqLwotICAgIGlmICghbG9ja2VkKSB7Ci0JUE1fc2F2ZURTKCk7Ci0Jc3RhdCAgPSAhUE1fbG9ja0RhdGFQYWdlcygmZ2xvYmFsRGF0YVN0YXJ0LTIwNDgsNDA5NiwmbGgpOwotCXN0YXQgfD0gIVBNX2xvY2tEYXRhUGFnZXMoJl9QTV9wbWRvc0RhdGFTdGFydCwoaW50KSZfUE1fcG1kb3NEYXRhRW5kIC0gKGludCkmX1BNX3BtZG9zRGF0YVN0YXJ0LCZsaCk7Ci0Jc3RhdCB8PSAhUE1fbG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKV9QTV9wbWRvc0NvZGVTdGFydCwoaW50KV9QTV9wbWRvc0NvZGVFbmQtKGludClfUE1fcG1kb3NDb2RlU3RhcnQsJmxoKTsKLQlzdGF0IHw9ICFQTV9sb2NrRGF0YVBhZ2VzKCZfUE1fRE1BRGF0YVN0YXJ0LChpbnQpJl9QTV9ETUFEYXRhRW5kIC0gKGludCkmX1BNX0RNQURhdGFTdGFydCwmbGgpOwotCXN0YXQgfD0gIVBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilfUE1fRE1BQ29kZVN0YXJ0LChpbnQpX1BNX0RNQUNvZGVFbmQtKGludClfUE1fRE1BQ29kZVN0YXJ0LCZsaCk7Ci0JaWYgKHN0YXQpIHsKLQkgICAgcHJpbnRmKCJQYWdlIGxvY2tpbmcgc2VydmljZXMgZmFpbGVkIC0gaW50ZXJydXB0IGhhbmRsaW5nIG5vdCBzYWZlIVxuIik7Ci0JICAgIGV4aXQoMSk7Ci0JICAgIH0KLQlsb2NrZWQgPSAxOwotCX0KLX0KLQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBET1MgUmVhbCBNb2RlIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIFJFQUxNT0RFCi0KLSNpZm5kZWYgTUtfRlAKLSNkZWZpbmUgTUtfRlAocyxvKSAgKCAodm9pZCBmYXIgKikoICgodWxvbmcpKHMpIDw8IDE2KSArIFwKLQkJICAgICh1bG9uZykobykgKSkKLSNlbmRpZgotCi1pbnQgUE1BUEkgUE1fc2V0TW91c2VIYW5kbGVyKGludCBtYXNrLCBQTV9tb3VzZUhhbmRsZXIgbWgpCi17Ci0gICAgUE1fc2F2ZURTKCk7Ci0gICAgX1BNX21vdXNlSGFuZGxlciA9IG1oOwotICAgIF9QTV9zZXRNb3VzZUhhbmRsZXIoX1BNX21vdXNlTWFzayA9IG1hc2spOwotICAgIHJldHVybiAxOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIodm9pZCkKLXsKLSAgICB1bmlvbiBSRUdTICAgICAgcmVnczsKLQotICAgIGlmIChfUE1fbW91c2VIYW5kbGVyKSB7Ci0JcmVncy54LmF4ID0gMzM7Ci0JaW50ODYoMHgzMywgJnJlZ3MsICZyZWdzKTsKLQlfUE1fbW91c2VIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0VGltZXJIYW5kbGVyKFBNX2ludEhhbmRsZXIgdGgpCi17Ci0gICAgX1BNX2dldFJNdmVjdCgweDgsIChsb25nKikmX1BNX3ByZXZUaW1lcik7Ci0gICAgX1BNX3RpbWVySGFuZGxlciA9IHRoOwotICAgIF9QTV9zZXRSTXZlY3QoMHg4LCAobG9uZylfUE1fdGltZXJJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVUaW1lckhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3RpbWVySGFuZGxlcikgewotCV9QTV9zZXRSTXZlY3QoMHg4LCAobG9uZylfUE1fcHJldlRpbWVyKTsKLQlfUE1fdGltZXJIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLWlib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKFBNX2ludEhhbmRsZXIgdGgsaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBTYXZlIHRoZSBvbGQgQ01PUyByZWFsIHRpbWUgY2xvY2sgdmFsdWVzICovCi0gICAgX1BNX29sZENNT1NSZWdBID0gX1BNX3JlYWRDTU9TKDB4MEEpOwotICAgIF9QTV9vbGRDTU9TUmVnQiA9IF9QTV9yZWFkQ01PUygweDBCKTsKLQotICAgIC8qIFNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBoYW5kbGVyICovCi0gICAgX1BNX2dldFJNdmVjdCgweDcwLCAobG9uZyopJl9QTV9wcmV2UlRDKTsKLSAgICBfUE1fcnRjSGFuZGxlciA9IHRoOwotICAgIF9QTV9zZXRSTXZlY3QoMHg3MCwgKGxvbmcpX1BNX3J0Y0lTUik7Ci0KLSAgICAvKiBQcm9ncmFtIHRoZSByZWFsIHRpbWUgY2xvY2sgZGVmYXVsdCBmcmVxdWVuY3kgKi8KLSAgICBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGZyZXF1ZW5jeSk7Ci0KLSAgICAvKiBVbm1hc2sgSVJROCBpbiB0aGUgUElDMiAqLwotICAgIF9QTV9vbGRSVENQSUMyID0gUE1faW5wYigweEExKTsKLSAgICBQTV9vdXRwYigweEExLF9QTV9vbGRSVENQSUMyICYgMHhGRSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9ydGNIYW5kbGVyKSB7Ci0JLyogUmVzdG9yZSBDTU9TIHJlZ2lzdGVycyBhbmQgbWFzayBSVEMgY2xvY2sgKi8KLQlfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKLQlfUE1fd3JpdGVDTU9TKDB4MEIsX1BNX29sZENNT1NSZWdCKTsKLQlQTV9vdXRwYigweEExLChQTV9pbnBiKDB4QTEpICYgMHhGRSkgfCAoX1BNX29sZFJUQ1BJQzIgJiB+MHhGRSkpOwotCi0JLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IHZlY3RvciAqLwotCV9QTV9zZXRSTXZlY3QoMHg3MCwgKGxvbmcpX1BNX3ByZXZSVEMpOwotCV9QTV9ydGNIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0S2V5SGFuZGxlcihQTV9pbnRIYW5kbGVyIGtoKQotewotICAgIF9QTV9nZXRSTXZlY3QoMHg5LCAobG9uZyopJl9QTV9wcmV2S2V5KTsKLSAgICBfUE1fa2V5SGFuZGxlciA9IGtoOwotICAgIF9QTV9zZXRSTXZlY3QoMHg5LCAobG9uZylfUE1fa2V5SVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlS2V5SGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fa2V5SGFuZGxlcikgewotCV9QTV9zZXRSTXZlY3QoMHg5LCAobG9uZylfUE1fcHJldktleSk7Ci0JX1BNX2tleUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRLZXkxNUhhbmRsZXIoUE1fa2V5MTVIYW5kbGVyIGtoKQotewotICAgIF9QTV9nZXRSTXZlY3QoMHgxNSwgKGxvbmcqKSZfUE1fcHJldktleTE1KTsKLSAgICBfUE1fa2V5MTVIYW5kbGVyID0ga2g7Ci0gICAgX1BNX3NldFJNdmVjdCgweDE1LCAobG9uZylfUE1fa2V5MTVJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVLZXkxNUhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX2tleTE1SGFuZGxlcikgewotCV9QTV9zZXRSTXZlY3QoMHgxNSwgKGxvbmcpX1BNX3ByZXZLZXkxNSk7Ci0JX1BNX2tleTE1SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoUE1fYnJlYWtIYW5kbGVyIGJoKQotewotICAgIHN0YXRpYyBpbnQgIGN0cmxDRmxhZyxjdHJsQkZsYWc7Ci0KLSAgICBfUE1fY3RybENQdHIgPSAodWNoYXIqKSZjdHJsQ0ZsYWc7Ci0gICAgX1BNX2N0cmxCUHRyID0gKHVjaGFyKikmY3RybEJGbGFnOwotICAgIF9QTV9nZXRSTXZlY3QoMHgxQiwgKGxvbmcqKSZfUE1fcHJldkJyZWFrKTsKLSAgICBfUE1fZ2V0Uk12ZWN0KDB4MjMsIChsb25nKikmX1BNX3ByZXZDdHJsQyk7Ci0gICAgX1BNX2JyZWFrSGFuZGxlciA9IGJoOwotICAgIF9QTV9zZXRSTXZlY3QoMHgxQiwgKGxvbmcpX1BNX2JyZWFrSVNSKTsKLSAgICBfUE1fc2V0Uk12ZWN0KDB4MjMsIChsb25nKV9QTV9jdHJsQ0lTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEJyZWFrSGFuZGxlcih2b2lkKQotewotICAgIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoTlVMTCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcHJldkJyZWFrKSB7Ci0JX1BNX3NldFJNdmVjdCgweDFCLCAobG9uZylfUE1fcHJldkJyZWFrKTsKLQlfUE1fc2V0Uk12ZWN0KDB4MjMsIChsb25nKV9QTV9wcmV2Q3RybEMpOwotCV9QTV9wcmV2QnJlYWsgPSBOVUxMOwotCV9QTV9icmVha0hhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKFBNX2NyaXRpY2FsSGFuZGxlciBjaCkKLXsKLSAgICBzdGF0aWMgIHNob3J0IGNyaXRCdWZbMl07Ci0KLSAgICBfUE1fY3JpdFB0ciA9ICh1Y2hhciopY3JpdEJ1ZjsKLSAgICBfUE1fZ2V0Uk12ZWN0KDB4MjQsIChsb25nKikmX1BNX3ByZXZDcml0aWNhbCk7Ci0gICAgX1BNX2NyaXRIYW5kbGVyID0gY2g7Ci0gICAgX1BNX3NldFJNdmVjdCgweDI0LCAobG9uZylfUE1fY3JpdGljYWxJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxDcml0aWNhbEhhbmRsZXIodm9pZCkKLXsKLSAgICBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKE5VTEwpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVDcml0aWNhbEhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3ByZXZDcml0aWNhbCkgewotCV9QTV9zZXRSTXZlY3QoMHgyNCwgKGxvbmcpX1BNX3ByZXZDcml0aWNhbCk7Ci0JX1BNX3ByZXZDcml0aWNhbCA9IE5VTEw7Ci0JX1BNX2NyaXRIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLWludCBQTUFQSSBQTV9sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcCA9IHA7ICBsZW4gPSBsZW47ICAgICAgLyogRG8gbm90aGluZyBmb3IgcmVhbCBtb2RlICovCi0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBwID0gcDsgIGxlbiA9IGxlbjsgICAgICAvKiBEbyBub3RoaW5nIGZvciByZWFsIG1vZGUgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcCA9IHA7ICBsZW4gPSBsZW47ICAgICAgLyogRG8gbm90aGluZyBmb3IgcmVhbCBtb2RlICovCi0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcCA9IHA7ICBsZW4gPSBsZW47ICAgICAgLyogRG8gbm90aGluZyBmb3IgcmVhbCBtb2RlICovCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZ2V0UE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgKmlzcikKLXsKLSAgICBsb25nIHQ7Ci0gICAgX1BNX2dldFJNdmVjdChpbnRubywmdCk7Ci0gICAgKmlzciA9ICh2b2lkKil0OwotfQotCi12b2lkIFBNQVBJIFBNX3NldFBNdmVjdChpbnQgaW50bm8sIFBNX2ludEhhbmRsZXIgaXNyKQotewotICAgIFBNX3NhdmVEUygpOwotICAgIF9QTV9zZXRSTXZlY3QoaW50bm8sKGxvbmcpaXNyKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgaXNyKQotewotICAgIF9QTV9zZXRSTXZlY3QoaW50bm8sKGxvbmcpaXNyKTsKLX0KLQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBQaGFyIExhcCBUTlQgRE9TIEV4dGVuZGVyIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIFROVAotCi0jaW5jbHVkZSA8cGxkb3MzMi5oPgotI2luY2x1ZGUgPHBoYXJsYXAuaD4KLSNpbmNsdWRlIDxodzM4Ni5oPgotCi1zdGF0aWMgbG9uZyBwcmV2UmVhbEJyZWFrOyAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBicmVhayBoYW5kbGVyICAgICAqLwotc3RhdGljIGxvbmcgcHJldlJlYWxDdHJsQzsgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUgQ3RybEMgaGFuZGxlciAgICAgKi8KLXN0YXRpYyBsb25nIHByZXZSZWFsQ3JpdGljYWw7ICAgLyogUHJldiByZWFsIG1vZGUgY3JpdGljYWwgaGFuZGxlciAgICAgICovCi1zdGF0aWMgdWNoYXIgKm1vdXNlUHRyOwotCi0vKiBUaGUgZm9sbG93aW5nIHJlYWwgbW9kZSByb3V0aW5lIGlzIHVzZWQgdG8gY2FsbCBhIDMyIGJpdCBwcm90ZWN0ZWQKLSAqIG1vZGUgRkFSIGZ1bmN0aW9uIGZyb20gcmVhbCBtb2RlLiBXZSB1c2UgdGhpcyBmb3IgcGFzc2luZyB1cCBjb250cm9sCi0gKiBmcm9tIHRoZSByZWFsIG1vZGUgbW91c2UgY2FsbGJhY2sgdG8gb3VyIHByb3RlY3RlZCBtb2RlIGNvZGUuCi0gKi8KLQotc3RhdGljIFVDSEFSIHJlYWxIYW5kbGVyW10gPSB7ICAgICAgLyogUmVhbCBtb2RlIGNvZGUgZ2VuZXJpYyBoYW5kbGVyICAgKi8KLSAgICAweDAwLDB4MDAsMHgwMCwweDAwLCAgICAgICAgICAgIC8qIF9fUE1fY2FsbFByb3RwICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgwMCwweDAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBfX1BNX3Byb3RDUyAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsICAgICAgICAgICAgLyogX19QTV9wcm90SGFuZGxlciAgICAgICAgICAgICAgICAgKi8KLSAgICAweDY2LDB4NjAsICAgICAgICAgICAgICAgICAgICAgIC8qICBwdXNoYWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgxRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgcHVzaCAgICBkcyAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4NkEsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgLyogIHB1c2ggICAgMCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDZBLDB4MDAsICAgICAgICAgICAgICAgICAgICAgIC8qICBwdXNoICAgIDAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgyRSwweEZGLDB4MzYsMHgwNCwweDAwLCAgICAgICAvKiAgcHVzaCAgICBbY3M6X19QTV9wcm90Q1NdICAgICAgICAqLwotICAgIDB4NjYsMHgyRSwweEZGLDB4MzYsMHgwNiwweDAwLCAgLyogIHB1c2ggICAgW2NzOl9fUE1fcHJvdEhhbmRsZXJdICAgKi8KLSAgICAweDJFLDB4RkYsMHgxRSwweDAwLDB4MDAsICAgICAgIC8qICBjYWxsICAgIFtjczpfX1BNX2NhbGxQcm90cF0gICAgICovCi0gICAgMHg4MywweEM0LDB4MEEsICAgICAgICAgICAgICAgICAvKiAgYWRkICAgICBzcCwxMCAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4MUYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHBvcCAgICAgZHMgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDY2LDB4NjEsICAgICAgICAgICAgICAgICAgICAgIC8qICBwb3BhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHhDQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgcmV0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIH07Ci0KLS8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGluc3RhbGxzIHRoZSBhYm92ZSByZWFsbW9kZSBjYWxsYmFjayBtZWNoYW5pc20KLSAqIGluIHJlYWwgbW9kZSBtZW1vcnkgZm9yIGNhbGxpbmcgdGhlIHByb3RlY3RlZCBtb2RlIHJvdXRpbmUuCi0gKi8KLQotdWNoYXIgKiBpbnN0YWxsQ2FsbGJhY2sodm9pZCAoUE1BUEkgKnBtQ0IpKCksdWludCAqcnNlZywgdWludCAqcm9mZikKLXsKLSAgICBDT05GSUdfSU5GICBjb25maWc7Ci0gICAgUkVBTFBUUiAgICAgcmVhbEJ1ZkFkcixjYWxsUHJvdHA7Ci0gICAgVUxPTkcgICAgICAgYnVmU2l6ZTsKLSAgICBGQVJQVFIgICAgICBwcm90QnVmQWRyOwotICAgIHVjaGFyICAgICAgICpwOwotCi0gICAgLyogR2V0IGFkZHJlc3Mgb2YgcmVhbCBtb2RlIHJvdXRpbmUgdG8gY2FsbCB1cCB0byBwcm90ZWN0ZWQgbW9kZSAgICAqLwotICAgIF9keF9ybWxpbmtfZ2V0KCZjYWxsUHJvdHAsICZyZWFsQnVmQWRyLCAmYnVmU2l6ZSwgJnByb3RCdWZBZHIpOwotICAgIF9keF9jb25maWdfaW5mKCZjb25maWcsIChVQ0hBUiopJmNvbmZpZyk7Ci0KLSAgICAvKiBGaWxsIGluIHRoZSB2YWx1ZXMgaW4gdGhlIHJlYWwgbW9kZSBjb2RlIHNlZ21lbnQgc28gdGhhdCBpdCB3aWxsCi0gICAgICogY2FsbCB0aGUgY29ycmVjdCByb3V0aW5lLgotICAgICAqLwotICAgICooKFJFQUxQVFIqKSZyZWFsSGFuZGxlclswXSkgPSBjYWxsUHJvdHA7Ci0gICAgKigoVVNIT1JUKikmcmVhbEhhbmRsZXJbNF0pID0gY29uZmlnLmNfY3Nfc2VsOwotICAgICooKFVMT05HKikmcmVhbEhhbmRsZXJbNl0pID0gKFVMT05HKXBtQ0I7Ci0KLSAgICAvKiBDb3B5IHRoZSByZWFsIG1vZGUgaGFuZGxlciB0byByZWFsIG1vZGUgbWVtb3J5ICAgKi8KLSAgICBpZiAoKHAgPSBQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKHJlYWxIYW5kbGVyKSxyc2VnLHJvZmYpKSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgIG1lbWNweShwLHJlYWxIYW5kbGVyLHNpemVvZihyZWFsSGFuZGxlcikpOwotCi0gICAgLyogU2tpcCBwYXN0IGdsb2JhbCB2YXJpYWJscyBpbiByZWFsIG1vZGUgY29kZSBzZWdtZW50ICovCi0gICAgKnJvZmYgKz0gMHgwQTsKLSAgICByZXR1cm4gcDsKLX0KLQotaW50IFBNQVBJIFBNX3NldE1vdXNlSGFuZGxlcihpbnQgbWFzaywgUE1fbW91c2VIYW5kbGVyIG1oKQotewotICAgIFJNUkVHUyAgICAgIHJlZ3M7Ci0gICAgUk1TUkVHUyAgICAgc3JlZ3M7Ci0gICAgdWludCAgICAgICAgcnNlZyxyb2ZmOwotCi0gICAgbG9ja1BNSGFuZGxlcnMoKTsgICAgICAgICAgIC8qIEVuc3VyZSBvdXIgaGFuZGxlcnMgYXJlIGxvY2tlZCAgICovCi0KLSAgICBpZiAoKG1vdXNlUHRyID0gaW5zdGFsbENhbGxiYWNrKF9QTV9tb3VzZUlTUiwgJnJzZWcsICZyb2ZmKSkgPT0gTlVMTCkKLQlyZXR1cm4gMDsKLSAgICBfUE1fbW91c2VIYW5kbGVyID0gbWg7Ci0KLSAgICAvKiBJbnN0YWxsIHRoZSByZWFsIG1vZGUgbW91c2UgaGFuZGxlciAgKi8KLSAgICBzcmVncy5lcyA9IHJzZWc7Ci0gICAgcmVncy54LmR4ID0gcm9mZjsKLSAgICByZWdzLnguY3ggPSBfUE1fbW91c2VNYXNrID0gbWFzazsKLSAgICByZWdzLnguYXggPSAweEM7Ci0gICAgUE1faW50ODZ4KDB4MzMsICZyZWdzLCAmcmVncywgJnNyZWdzKTsKLSAgICByZXR1cm4gMTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlTW91c2VIYW5kbGVyKHZvaWQpCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgaWYgKF9QTV9tb3VzZUhhbmRsZXIpIHsKLQlyZWdzLnguYXggPSAzMzsKLQlQTV9pbnQ4NigweDMzLCAmcmVncywgJnJlZ3MpOwotCVBNX2ZyZWVSZWFsU2VnKG1vdXNlUHRyKTsKLQlfUE1fbW91c2VIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZ2V0UE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgKmlzcikKLXsKLSAgICBGQVJQVFIgIHBoOwotCi0gICAgX2R4X3BtaXZfZ2V0KGludG5vLCAmcGgpOwotICAgIGlzci0+c2VsID0gRlBfU0VMKHBoKTsKLSAgICBpc3ItPm9mZiA9IEZQX09GRihwaCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0UE12ZWN0KGludCBpbnRubywgUE1faW50SGFuZGxlciBpc3IpCi17Ci0gICAgQ09ORklHX0lORiAgY29uZmlnOwotICAgIEZBUlBUUiAgICAgIHBoOwotCi0gICAgUE1fc2F2ZURTKCk7Ci0gICAgX2R4X2NvbmZpZ19pbmYoJmNvbmZpZywgKFVDSEFSKikmY29uZmlnKTsKLSAgICBGUF9TRVQocGgsKHVpbnQpaXNyLGNvbmZpZy5jX2NzX3NlbCk7Ci0gICAgX2R4X3BtaXZfc2V0KGludG5vLHBoKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgaXNyKQotewotICAgIEZBUlBUUiAgcGg7Ci0KLSAgICBGUF9TRVQocGgsaXNyLm9mZixpc3Iuc2VsKTsKLSAgICBfZHhfcG1pdl9zZXQoaW50bm8scGgpOwotfQotCi1zdGF0aWMgdm9pZCBnZXRJU1IoaW50IGludG5vLCBQTUZBUlBUUiAqcG1pc3IsIGxvbmcgKnJlYWxpc3IpCi17Ci0gICAgUE1fZ2V0UE12ZWN0KGludG5vLHBtaXNyKTsKLSAgICBfUE1fZ2V0Uk12ZWN0KGludG5vLCByZWFsaXNyKTsKLX0KLQotc3RhdGljIHZvaWQgcmVzdG9yZUlTUihpbnQgaW50bm8sIFBNRkFSUFRSIHBtaXNyLCBsb25nIHJlYWxpc3IpCi17Ci0gICAgX1BNX3NldFJNdmVjdChpbnRubyxyZWFsaXNyKTsKLSAgICBQTV9yZXN0b3JlUE12ZWN0KGludG5vLHBtaXNyKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0SVNSKGludCBpbnRubywgdm9pZCAoUE1BUEkgKmlzcikoKSkKLXsKLSAgICBDT05GSUdfSU5GICBjb25maWc7Ci0gICAgRkFSUFRSICAgICAgcGg7Ci0KLSAgICBsb2NrUE1IYW5kbGVycygpOyAgICAgICAgICAgLyogRW5zdXJlIG91ciBoYW5kbGVycyBhcmUgbG9ja2VkICAgKi8KLQotICAgIF9keF9jb25maWdfaW5mKCZjb25maWcsIChVQ0hBUiopJmNvbmZpZyk7Ci0gICAgRlBfU0VUKHBoLCh1aW50KWlzcixjb25maWcuY19jc19zZWwpOwotICAgIF9keF9hcG1pdl9zZXQoaW50bm8scGgpOwotfQotCi12b2lkIFBNQVBJIFBNX3NldFRpbWVySGFuZGxlcihQTV9pbnRIYW5kbGVyIHRoKQotewotICAgIGdldElTUigweDgsICZfUE1fcHJldlRpbWVyLCAmX1BNX3ByZXZSZWFsVGltZXIpOwotICAgIF9QTV90aW1lckhhbmRsZXIgPSB0aDsKLSAgICBzZXRJU1IoMHg4LCBfUE1fdGltZXJJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVUaW1lckhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3RpbWVySGFuZGxlcikgewotCXJlc3RvcmVJU1IoMHg4LCBfUE1fcHJldlRpbWVyLCBfUE1fcHJldlJlYWxUaW1lcik7Ci0JX1BNX3RpbWVySGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi1pYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcihQTV9pbnRIYW5kbGVyIHRoLGludCBmcmVxdWVuY3kpCi17Ci0gICAgLyogU2F2ZSB0aGUgb2xkIENNT1MgcmVhbCB0aW1lIGNsb2NrIHZhbHVlcyAqLwotICAgIF9QTV9vbGRDTU9TUmVnQSA9IF9QTV9yZWFkQ01PUygweDBBKTsKLSAgICBfUE1fb2xkQ01PU1JlZ0IgPSBfUE1fcmVhZENNT1MoMHgwQik7Ci0KLSAgICAvKiBTZXQgdGhlIHJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgaGFuZGxlciAqLwotICAgIGdldElTUigweDcwLCAmX1BNX3ByZXZSVEMsICZfUE1fcHJldlJlYWxSVEMpOwotICAgIF9QTV9ydGNIYW5kbGVyID0gdGg7Ci0gICAgc2V0SVNSKDB4NzAsIF9QTV9ydGNJU1IpOwotCi0gICAgLyogUHJvZ3JhbSB0aGUgcmVhbCB0aW1lIGNsb2NrIGRlZmF1bHQgZnJlcXVlbmN5ICovCi0gICAgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeShmcmVxdWVuY3kpOwotCi0gICAgLyogVW5tYXNrIElSUTggaW4gdGhlIFBJQzIgKi8KLSAgICBfUE1fb2xkUlRDUElDMiA9IFBNX2lucGIoMHhBMSk7Ci0gICAgUE1fb3V0cGIoMHhBMSxfUE1fb2xkUlRDUElDMiAmIDB4RkUpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcnRjSGFuZGxlcikgewotCS8qIFJlc3RvcmUgQ01PUyByZWdpc3RlcnMgYW5kIG1hc2sgUlRDIGNsb2NrICovCi0JX1BNX3dyaXRlQ01PUygweDBBLF9QTV9vbGRDTU9TUmVnQSk7Ci0JX1BNX3dyaXRlQ01PUygweDBCLF9QTV9vbGRDTU9TUmVnQik7Ci0JUE1fb3V0cGIoMHhBMSwoUE1faW5wYigweEExKSAmIDB4RkUpIHwgKF9QTV9vbGRSVENQSUMyICYgfjB4RkUpKTsKLQotCS8qIFJlc3RvcmUgdGhlIGludGVycnVwdCB2ZWN0b3IgKi8KLQlyZXN0b3JlSVNSKDB4NzAsIF9QTV9wcmV2UlRDLCBfUE1fcHJldlJlYWxSVEMpOwotCV9QTV9ydGNIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0S2V5SGFuZGxlcihQTV9pbnRIYW5kbGVyIGtoKQotewotICAgIGdldElTUigweDksICZfUE1fcHJldktleSwgJl9QTV9wcmV2UmVhbEtleSk7Ci0gICAgX1BNX2tleUhhbmRsZXIgPSBraDsKLSAgICBzZXRJU1IoMHg5LCBfUE1fa2V5SVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlS2V5SGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fa2V5SGFuZGxlcikgewotCXJlc3RvcmVJU1IoMHg5LCBfUE1fcHJldktleSwgX1BNX3ByZXZSZWFsS2V5KTsKLQlfUE1fa2V5SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX3NldEtleTE1SGFuZGxlcihQTV9rZXkxNUhhbmRsZXIga2gpCi17Ci0gICAgZ2V0SVNSKDB4MTUsICZfUE1fcHJldktleTE1LCAmX1BNX3ByZXZSZWFsS2V5MTUpOwotICAgIF9QTV9rZXkxNUhhbmRsZXIgPSBraDsKLSAgICBzZXRJU1IoMHgxNSwgX1BNX2tleTE1SVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlS2V5MTVIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9rZXkxNUhhbmRsZXIpIHsKLQlyZXN0b3JlSVNSKDB4MTUsIF9QTV9wcmV2S2V5MTUsIF9QTV9wcmV2UmVhbEtleTE1KTsKLQlfUE1fa2V5MTVIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihQTV9icmVha0hhbmRsZXIgYmgpCi17Ci0gICAgc3RhdGljIGludCAgY3RybENGbGFnLGN0cmxCRmxhZzsKLQotICAgIF9QTV9jdHJsQ1B0ciA9ICh1Y2hhciopJmN0cmxDRmxhZzsKLSAgICBfUE1fY3RybEJQdHIgPSAodWNoYXIqKSZjdHJsQkZsYWc7Ci0gICAgZ2V0SVNSKDB4MUIsICZfUE1fcHJldkJyZWFrLCAmcHJldlJlYWxCcmVhayk7Ci0gICAgZ2V0SVNSKDB4MjMsICZfUE1fcHJldkN0cmxDLCAmcHJldlJlYWxDdHJsQyk7Ci0gICAgX1BNX2JyZWFrSGFuZGxlciA9IGJoOwotICAgIHNldElTUigweDFCLCBfUE1fYnJlYWtJU1IpOwotICAgIHNldElTUigweDIzLCBfUE1fY3RybENJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxCcmVha0hhbmRsZXIodm9pZCkKLXsKLSAgICBQTV9pbnN0YWxsQWx0QnJlYWtIYW5kbGVyKE5VTEwpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3ByZXZCcmVhay5zZWwpIHsKLQlyZXN0b3JlSVNSKDB4MUIsIF9QTV9wcmV2QnJlYWssIHByZXZSZWFsQnJlYWspOwotCXJlc3RvcmVJU1IoMHgyMywgX1BNX3ByZXZDdHJsQywgcHJldlJlYWxDdHJsQyk7Ci0JX1BNX3ByZXZCcmVhay5zZWwgPSAwOwotCV9QTV9icmVha0hhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKFBNX2NyaXRpY2FsSGFuZGxlciBjaCkKLXsKLSAgICBzdGF0aWMgc2hvcnQgICAgY3JpdEJ1ZlsyXTsKLQotICAgIF9QTV9jcml0UHRyID0gKHVjaGFyKiljcml0QnVmOwotICAgIGdldElTUigweDI0LCAmX1BNX3ByZXZDcml0aWNhbCwgJnByZXZSZWFsQ3JpdGljYWwpOwotICAgIF9QTV9jcml0SGFuZGxlciA9IGNoOwotICAgIHNldElTUigweDI0LCBfUE1fY3JpdGljYWxJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxDcml0aWNhbEhhbmRsZXIodm9pZCkKLXsKLSAgICBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKE5VTEwpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVDcml0aWNhbEhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3ByZXZDcml0aWNhbC5zZWwpIHsKLQlyZXN0b3JlSVNSKDB4MjQsIF9QTV9wcmV2Q3JpdGljYWwsIHByZXZSZWFsQ3JpdGljYWwpOwotCV9QTV9wcmV2Q3JpdGljYWwuc2VsID0gMDsKLQlfUE1fY3JpdEhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICByZXR1cm4gKF9keF9sb2NrX3Bnc24ocCxsZW4pID09IDApOwotfQotCi1pbnQgUE1BUEkgUE1fdW5sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcmV0dXJuIChfZHhfdWxvY2tfcGdzbihwLGxlbikgPT0gMCk7Ci19Ci0KLWludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIENPTkZJR19JTkYgIGNvbmZpZzsKLSAgICBGQVJQVFIgICAgICBmcDsKLQotICAgIF9keF9jb25maWdfaW5mKCZjb25maWcsIChVQ0hBUiopJmNvbmZpZyk7Ci0gICAgRlBfU0VUKGZwLHAsY29uZmlnLmNfY3Nfc2VsKTsKLSAgICByZXR1cm4gKF9keF9sb2NrX3BncyhmcCxsZW4pID09IDApOwotfQotCi1pbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIENPTkZJR19JTkYgIGNvbmZpZzsKLSAgICBGQVJQVFIgICAgICBmcDsKLQotICAgIF9keF9jb25maWdfaW5mKCZjb25maWcsIChVQ0hBUiopJmNvbmZpZyk7Ci0gICAgRlBfU0VUKGZwLHAsY29uZmlnLmNfY3Nfc2VsKTsKLSAgICByZXR1cm4gKF9keF91bG9ja19wZ3MoZnAsbGVuKSA9PSAwKTsKLX0KLQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBTeW1hbnRlYyBDKysgRE9TWCBhbmQgRmxhc2hUZWsgWC0zMi9YLTMyVk0gc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmIGRlZmluZWQoRE9TWCkgfHwgZGVmaW5lZChYMzJWTSkKLQotI2lmZGVmICBYMzJWTQotI2luY2x1ZGUgPHgzMi5oPgotI2VuZGlmCi0KLXN0YXRpYyBsb25nIHByZXZSZWFsQnJlYWs7ICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGJyZWFrIGhhbmRsZXIgICAgICovCi1zdGF0aWMgbG9uZyBwcmV2UmVhbEN0cmxDOyAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBDdHJsQyBoYW5kbGVyICAgICAqLwotc3RhdGljIGxvbmcgcHJldlJlYWxDcml0aWNhbDsgICAvKiBQcmV2IHJlYWwgbW9kZSBjcml0aWNhbCBoYW5kbGVyICAgICAgKi8KLQotc3RhdGljIHVpbnQgbW91c2VTZWwgPSAwLG1vdXNlT2ZmOwotCi0vKiBUaGUgZm9sbG93aW5nIHJlYWwgbW9kZSByb3V0aW5lIGlzIHVzZWQgdG8gY2FsbCBhIDMyIGJpdCBwcm90ZWN0ZWQKLSAqIG1vZGUgRkFSIGZ1bmN0aW9uIGZyb20gcmVhbCBtb2RlLiBXZSB1c2UgdGhpcyBmb3IgcGFzc2luZyB1cCBjb250cm9sCi0gKiBmcm9tIHRoZSByZWFsIG1vZGUgbW91c2UgY2FsbGJhY2sgdG8gb3VyIHByb3RlY3RlZCBtb2RlIGNvZGUuCi0gKi8KLQotc3RhdGljIGNoYXIgcmVhbEhhbmRsZXJbXSA9IHsgICAgICAgLyogUmVhbCBtb2RlIGNvZGUgZ2VuZXJpYyBoYW5kbGVyICAgKi8KLSAgICAweDAwLDB4MDAsMHgwMCwweDAwLCAgICAgICAgICAgIC8qIF9fUE1fY2FsbFByb3RwICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgwMCwweDAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBfX1BNX3Byb3RDUyAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsICAgICAgICAgICAgLyogX19QTV9wcm90SGFuZGxlciAgICAgICAgICAgICAgICAgKi8KLSAgICAweDFFLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBwdXNoICAgIGRzICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHg2QSwweDAwLCAgICAgICAgICAgICAgICAgICAgICAvKiAgcHVzaCAgICAwICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4NkEsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgLyogIHB1c2ggICAgMCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDJFLDB4RkYsMHgzNiwweDA0LDB4MDAsICAgICAgIC8qICBwdXNoICAgIFtjczpfX1BNX3Byb3RDU10gICAgICAgICovCi0gICAgMHg2NiwweDJFLDB4RkYsMHgzNiwweDA2LDB4MDAsICAvKiAgcHVzaCAgICBbY3M6X19QTV9wcm90SGFuZGxlcl0gICAqLwotICAgIDB4MkUsMHhGRiwweDFFLDB4MDAsMHgwMCwgICAgICAgLyogIGNhbGwgICAgW2NzOl9fUE1fY2FsbFByb3RwXSAgICAgKi8KLSAgICAweDgzLDB4QzQsMHgwQSwgICAgICAgICAgICAgICAgIC8qICBhZGQgICAgIHNwLDEwICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgxRiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgcG9wICAgICBkcyAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4Q0IsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHJldGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB9OwotCi0vKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBpbnN0YWxscyB0aGUgYWJvdmUgcmVhbG1vZGUgY2FsbGJhY2sgbWVjaGFuaXNtCi0gKiBpbiByZWFsIG1vZGUgbWVtb3J5IGZvciBjYWxsaW5nIHRoZSBwcm90ZWN0ZWQgbW9kZSByb3V0aW5lLgotICovCi0KLWludCBpbnN0YWxsQ2FsbGJhY2sodm9pZCAoUE1BUEkgKnBtQ0IpKCksdWludCAqcHNlbCwgdWludCAqcG9mZiwKLSAgICB1aW50ICpyc2VnLCB1aW50ICpyb2ZmKQotewotICAgIFBNUkVHUyAgICAgICAgICByZWdzOwotICAgIFBNU1JFR1MgICAgICAgICBzcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4MjUwRDsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgUE1faW50Mzg2eCgweDIxLCZyZWdzLCZyZWdzLCZzcmVncyk7ICAgIC8qIEdldCBSTSBjYWxsYmFjayBhZGRyZXNzICAqLwotCi0gICAgLyogRmlsbCBpbiB0aGUgdmFsdWVzIGluIHRoZSByZWFsIG1vZGUgY29kZSBzZWdtZW50IHNvIHRoYXQgaXQgd2lsbAotICAgICAqIGNhbGwgdGhlIGNvcnJlY3Qgcm91dGluZS4KLSAgICAgKi8KLSAgICAqKCh1bG9uZyopJnJlYWxIYW5kbGVyWzBdKSA9IHJlZ3MuZS5lYXg7Ci0gICAgKigodXNob3J0KikmcmVhbEhhbmRsZXJbNF0pID0gc3JlZ3MuY3M7Ci0gICAgKigodWxvbmcqKSZyZWFsSGFuZGxlcls2XSkgPSAodWxvbmcpcG1DQjsKLQotICAgIC8qIENvcHkgdGhlIHJlYWwgbW9kZSBoYW5kbGVyIHRvIHJlYWwgbW9kZSBtZW1vcnkgKG9ubHkgYWxsb2NhdGUgdGhlCi0gICAgICogYnVmZmVyIG9uY2Ugc2luY2Ugd2UgY2FudCBkZWFsbG9hdGUgaXQgd2l0aCBYMzIpLgotICAgICAqLwotICAgIGlmICgqcHNlbCA9PSAwKSB7Ci0JaWYgKCFQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKHJlYWxIYW5kbGVyKSxwc2VsLHBvZmYscnNlZyxyb2ZmKSkKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIFBNX21lbWNweWZuKCpwc2VsLCpwb2ZmLHJlYWxIYW5kbGVyLHNpemVvZihyZWFsSGFuZGxlcikpOwotCi0gICAgLyogU2tpcCBwYXN0IGdsb2JhbCB2YXJpYWJsZXMgaW4gcmVhbCBtb2RlIGNvZGUgc2VnbWVudCAqLwotICAgICpyb2ZmICs9IDB4MEE7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBQTUFQSSBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssIFBNX21vdXNlSGFuZGxlciBtaCkKLXsKLSAgICBSTVJFR1MgICAgICByZWdzOwotICAgIFJNU1JFR1MgICAgIHNyZWdzOwotICAgIHVpbnQgICAgcnNlZyxyb2ZmOwotCi0gICAgbG9ja1BNSGFuZGxlcnMoKTsgICAgICAgICAgIC8qIEVuc3VyZSBvdXIgaGFuZGxlcnMgYXJlIGxvY2tlZCAgICovCi0KLSAgICBpZiAoIWluc3RhbGxDYWxsYmFjayhfUE1fbW91c2VJU1IsICZtb3VzZVNlbCwgJm1vdXNlT2ZmLCAmcnNlZywgJnJvZmYpKQotCXJldHVybiAwOwotICAgIF9QTV9tb3VzZUhhbmRsZXIgPSBtaDsKLQotICAgIC8qIEluc3RhbGwgdGhlIHJlYWwgbW9kZSBtb3VzZSBoYW5kbGVyICAqLwotICAgIHNyZWdzLmVzID0gcnNlZzsKLSAgICByZWdzLnguZHggPSByb2ZmOwotICAgIHJlZ3MueC5jeCA9IF9QTV9tb3VzZU1hc2sgPSBtYXNrOwotICAgIHJlZ3MueC5heCA9IDB4QzsKLSAgICBQTV9pbnQ4NngoMHgzMywgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOwotICAgIHJldHVybiAxOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIodm9pZCkKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICBpZiAoX1BNX21vdXNlSGFuZGxlcikgewotCXJlZ3MueC5heCA9IDMzOwotCVBNX2ludDg2KDB4MzMsICZyZWdzLCAmcmVncyk7Ci0JX1BNX21vdXNlSGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX2dldFBNdmVjdChpbnQgaW50bm8sIFBNRkFSUFRSICppc3IpCi17Ci0gICAgUE1SRUdTICByZWdzOwotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0KLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmVncy54LmF4ID0gMHgyNTAyOyAgICAgICAgIC8qIEdldCBQTSBpbnRlcnJ1cHQgdmVjdG9yICAgICAgICAgICAgICAqLwotICAgIHJlZ3MueC5jeCA9IGludG5vOwotICAgIFBNX2ludDM4NngoMHgyMSwgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOwotICAgIGlzci0+c2VsID0gc3JlZ3MuZXM7Ci0gICAgaXNyLT5vZmYgPSByZWdzLmUuZWJ4OwotfQotCi12b2lkIFBNQVBJIFBNX3NldFBNdmVjdChpbnQgaW50bm8sIFBNX2ludEhhbmRsZXIgaXNyKQotewotICAgIFBNRkFSUFRSICAgIHBtaXNyOwotICAgIFBNU1JFR1MgICAgIHNyZWdzOwotCi0gICAgUE1fc2F2ZURTKCk7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHBtaXNyLnNlbCA9IHNyZWdzLmNzOwotICAgIHBtaXNyLm9mZiA9ICh1aW50KWlzcjsKLSAgICBQTV9yZXN0b3JlUE12ZWN0KGludG5vLCBwbWlzcik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVBNdmVjdChpbnQgaW50bm8sIFBNRkFSUFRSIGlzcikKLXsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0gICAgUE1TUkVHUyBzcmVnczsKLQotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZWdzLnguYXggPSAweDI1MDU7ICAgICAgICAgLyogU2V0IFBNIGludGVycnVwdCB2ZWN0b3IgICAgICAgICAgICAgICovCi0gICAgcmVncy54LmN4ID0gaW50bm87Ci0gICAgc3JlZ3MuZHMgPSBpc3Iuc2VsOwotICAgIHJlZ3MuZS5lZHggPSBpc3Iub2ZmOwotICAgIFBNX2ludDM4NngoMHgyMSwgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBnZXRJU1IoaW50IGludG5vLCBQTUZBUlBUUiAqcG1pc3IsIGxvbmcgKnJlYWxpc3IpCi17Ci0gICAgUE1fZ2V0UE12ZWN0KGludG5vLHBtaXNyKTsKLSAgICBfUE1fZ2V0Uk12ZWN0KGludG5vLHJlYWxpc3IpOwotfQotCi1zdGF0aWMgdm9pZCByZXN0b3JlSVNSKGludCBpbnRubywgUE1GQVJQVFIgcG1pc3IsIGxvbmcgcmVhbGlzcikKLXsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0gICAgUE1TUkVHUyBzcmVnczsKLQotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZWdzLnguYXggPSAweDI1MDc7ICAgICAgICAgLyogU2V0IHJlYWwgYW5kIFBNIHZlY3RvcnMgICAgICAgICAgICAgICovCi0gICAgcmVncy54LmN4ID0gaW50bm87Ci0gICAgc3JlZ3MuZHMgPSBwbWlzci5zZWw7Ci0gICAgcmVncy5lLmVkeCA9IHBtaXNyLm9mZjsKLSAgICByZWdzLmUuZWJ4ID0gcmVhbGlzcjsKLSAgICBQTV9pbnQzODZ4KDB4MjEsICZyZWdzLCAmcmVncywgJnNyZWdzKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0SVNSKGludCBpbnRubywgdm9pZCAqaXNyKQotewotICAgIFBNUkVHUyAgcmVnczsKLSAgICBQTVNSRUdTIHNyZWdzOwotCi0gICAgbG9ja1BNSGFuZGxlcnMoKTsgICAgICAgICAgIC8qIEVuc3VyZSBvdXIgaGFuZGxlcnMgYXJlIGxvY2tlZCAgICAgICAqLwotCi0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MueC5heCA9IDB4MjUwNjsgICAgICAgICAvKiBIb29rIHJlYWwgYW5kIHByb3RlY3RlZCB2ZWN0b3JzICAgICAgKi8KLSAgICByZWdzLnguY3ggPSBpbnRubzsKLSAgICBzcmVncy5kcyA9IHNyZWdzLmNzOwotICAgIHJlZ3MuZS5lZHggPSAodWludClpc3I7Ci0gICAgUE1faW50Mzg2eCgweDIxLCAmcmVncywgJnJlZ3MsICZzcmVncyk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0VGltZXJIYW5kbGVyKFBNX2ludEhhbmRsZXIgdGgpCi17Ci0gICAgZ2V0SVNSKDB4OCwgJl9QTV9wcmV2VGltZXIsICZfUE1fcHJldlJlYWxUaW1lcik7Ci0gICAgX1BNX3RpbWVySGFuZGxlciA9IHRoOwotICAgIHNldElTUigweDgsIF9QTV90aW1lcklTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVRpbWVySGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fdGltZXJIYW5kbGVyKSB7Ci0JcmVzdG9yZUlTUigweDgsIF9QTV9wcmV2VGltZXIsIF9QTV9wcmV2UmVhbFRpbWVyKTsKLQlfUE1fdGltZXJIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLWlib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKFBNX2ludEhhbmRsZXIgdGgsaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBTYXZlIHRoZSBvbGQgQ01PUyByZWFsIHRpbWUgY2xvY2sgdmFsdWVzICovCi0gICAgX1BNX29sZENNT1NSZWdBID0gX1BNX3JlYWRDTU9TKDB4MEEpOwotICAgIF9QTV9vbGRDTU9TUmVnQiA9IF9QTV9yZWFkQ01PUygweDBCKTsKLQotICAgIC8qIFNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBoYW5kbGVyICovCi0gICAgZ2V0SVNSKDB4NzAsICZfUE1fcHJldlJUQywgJl9QTV9wcmV2UmVhbFJUQyk7Ci0gICAgX1BNX3J0Y0hhbmRsZXIgPSB0aDsKLSAgICBzZXRJU1IoMHg3MCwgX1BNX3J0Y0lTUik7Ci0KLSAgICAvKiBQcm9ncmFtIHRoZSByZWFsIHRpbWUgY2xvY2sgZGVmYXVsdCBmcmVxdWVuY3kgKi8KLSAgICBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGZyZXF1ZW5jeSk7Ci0KLSAgICAvKiBVbm1hc2sgSVJROCBpbiB0aGUgUElDMiAqLwotICAgIF9QTV9vbGRSVENQSUMyID0gUE1faW5wYigweEExKTsKLSAgICBQTV9vdXRwYigweEExLF9QTV9vbGRSVENQSUMyICYgMHhGRSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9ydGNIYW5kbGVyKSB7Ci0JLyogUmVzdG9yZSBDTU9TIHJlZ2lzdGVycyBhbmQgbWFzayBSVEMgY2xvY2sgKi8KLQlfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKLQlfUE1fd3JpdGVDTU9TKDB4MEIsX1BNX29sZENNT1NSZWdCKTsKLQlQTV9vdXRwYigweEExLChQTV9pbnBiKDB4QTEpICYgMHhGRSkgfCAoX1BNX29sZFJUQ1BJQzIgJiB+MHhGRSkpOwotCi0JLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IHZlY3RvciAqLwotCXJlc3RvcmVJU1IoMHg3MCwgX1BNX3ByZXZSVEMsIF9QTV9wcmV2UmVhbFJUQyk7Ci0JX1BNX3J0Y0hhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRLZXlIYW5kbGVyKFBNX2ludEhhbmRsZXIga2gpCi17Ci0gICAgZ2V0SVNSKDB4OSwgJl9QTV9wcmV2S2V5LCAmX1BNX3ByZXZSZWFsS2V5KTsKLSAgICBfUE1fa2V5SGFuZGxlciA9IGtoOwotICAgIHNldElTUigweDksIF9QTV9rZXlJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVLZXlIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9rZXlIYW5kbGVyKSB7Ci0JcmVzdG9yZUlTUigweDksIF9QTV9wcmV2S2V5LCBfUE1fcHJldlJlYWxLZXkpOwotCV9QTV9rZXlIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0S2V5MTVIYW5kbGVyKFBNX2tleTE1SGFuZGxlciBraCkKLXsKLSAgICBnZXRJU1IoMHgxNSwgJl9QTV9wcmV2S2V5MTUsICZfUE1fcHJldlJlYWxLZXkxNSk7Ci0gICAgX1BNX2tleTE1SGFuZGxlciA9IGtoOwotICAgIHNldElTUigweDE1LCBfUE1fa2V5MTVJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVLZXkxNUhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX2tleTE1SGFuZGxlcikgewotCXJlc3RvcmVJU1IoMHgxNSwgX1BNX3ByZXZLZXkxNSwgX1BNX3ByZXZSZWFsS2V5MTUpOwotCV9QTV9rZXkxNUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQWx0QnJlYWtIYW5kbGVyKFBNX2JyZWFrSGFuZGxlciBiaCkKLXsKLSAgICBzdGF0aWMgaW50ICBjdHJsQ0ZsYWcsY3RybEJGbGFnOwotCi0gICAgX1BNX2N0cmxDUHRyID0gKHVjaGFyKikmY3RybENGbGFnOwotICAgIF9QTV9jdHJsQlB0ciA9ICh1Y2hhciopJmN0cmxCRmxhZzsKLSAgICBnZXRJU1IoMHgxQiwgJl9QTV9wcmV2QnJlYWssICZwcmV2UmVhbEJyZWFrKTsKLSAgICBnZXRJU1IoMHgyMywgJl9QTV9wcmV2Q3RybEMsICZwcmV2UmVhbEN0cmxDKTsKLSAgICBfUE1fYnJlYWtIYW5kbGVyID0gYmg7Ci0gICAgc2V0SVNSKDB4MUIsIF9QTV9icmVha0lTUik7Ci0gICAgc2V0SVNSKDB4MjMsIF9QTV9jdHJsQ0lTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEJyZWFrSGFuZGxlcih2b2lkKQotewotICAgIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoTlVMTCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcHJldkJyZWFrLnNlbCkgewotCXJlc3RvcmVJU1IoMHgxQiwgX1BNX3ByZXZCcmVhaywgcHJldlJlYWxCcmVhayk7Ci0JcmVzdG9yZUlTUigweDIzLCBfUE1fcHJldkN0cmxDLCBwcmV2UmVhbEN0cmxDKTsKLQlfUE1fcHJldkJyZWFrLnNlbCA9IDA7Ci0JX1BNX2JyZWFrSGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoUE1fY3JpdGljYWxIYW5kbGVyIGNoKQotewotICAgIHN0YXRpYyBzaG9ydCAgICBjcml0QnVmWzJdOwotCi0gICAgX1BNX2NyaXRQdHIgPSAodWNoYXIqKWNyaXRCdWY7Ci0gICAgZ2V0SVNSKDB4MjQsICZfUE1fcHJldkNyaXRpY2FsLCAmcHJldlJlYWxDcml0aWNhbCk7Ci0gICAgX1BNX2NyaXRIYW5kbGVyID0gY2g7Ci0gICAgc2V0SVNSKDB4MjQsIF9QTV9jcml0aWNhbElTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbENyaXRpY2FsSGFuZGxlcih2b2lkKQotewotICAgIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoTlVMTCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNyaXRpY2FsSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcHJldkNyaXRpY2FsLnNlbCkgewotCXJlc3RvcmVJU1IoMHgyNCwgX1BNX3ByZXZDcml0aWNhbCwgcHJldlJlYWxDcml0aWNhbCk7Ci0JX1BNX3ByZXZDcml0aWNhbC5zZWwgPSAwOwotCV9QTV9jcml0SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHJldHVybiAoX3gzODZfbWVtbG9jayhwLGxlbikgPT0gMCk7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICByZXR1cm4gKF94Mzg2X21lbXVubG9jayhwLGxlbikgPT0gMCk7Ci19Ci0KLWludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHJldHVybiAoX3gzODZfbWVtbG9jayhwLGxlbikgPT0gMCk7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcmV0dXJuIChfeDM4Nl9tZW11bmxvY2socCxsZW4pID09IDApOwotfQotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEJvcmxhbmQncyBEUE1JMzIgRE9TIFBvd2VyIFBhY2sgRXh0ZW5kZXIgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIERQTUkzMgotI2RlZmluZSBHRU5FUklDX0RQTUkzMiAgICAgICAgICAvKiBVc2UgZ2VuZXJpYyAzMiBiaXQgRFBNSSByb3V0aW5lcyAqLwotCi12b2lkIFBNQVBJIFBNX2dldFBNdmVjdChpbnQgaW50bm8sIFBNRkFSUFRSICppc3IpCi17Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHgyMDQ7Ci0gICAgcmVncy5oLmJsID0gaW50bm87Ci0gICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOwotICAgIGlzci0+c2VsID0gcmVncy54LmN4OwotICAgIGlzci0+b2ZmID0gcmVncy5lLmVkeDsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRQTXZlY3QoaW50IGludG5vLCBQTV9pbnRIYW5kbGVyIGlzcikKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIFBNUkVHUyAgcmVnczsKLQotICAgIFBNX3NhdmVEUygpOwotICAgIHJlZ3MueC5heCA9IDB4MjA1OyAgICAgICAgICAvKiBTZXQgcHJvdGVjdGVkIG1vZGUgdmVjdG9yICAgICAgICAqLwotICAgIHJlZ3MuaC5ibCA9IGludG5vOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZWdzLnguY3ggPSBzcmVncy5jczsKLSAgICByZWdzLmUuZWR4ID0gKHVpbnQpaXNyOwotICAgIFBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgaXNyKQotewotICAgIFBNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4MjA1OwotICAgIHJlZ3MuaC5ibCA9IGludG5vOwotICAgIHJlZ3MueC5jeCA9IGlzci5zZWw7Ci0gICAgcmVncy5lLmVkeCA9IGlzci5vZmY7Ci0gICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOwotfQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBXYXRjb20gQy9DKysgd2l0aCBSYXRpb25hbCBET1MvNEdXIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBET1M0R1cKLSNkZWZpbmUgR0VORVJJQ19EUE1JMzIgICAgICAgICAgLyogVXNlIGdlbmVyaWMgMzIgYml0IERQTUkgcm91dGluZXMgKi8KLQotI2RlZmluZSBNT1VTRV9TVVBQT1JURUQgICAgICAgICAvKiBET1M0R1cgZGlyZWN0bHkgc3VwcG9ydHMgbW91c2UgICAqLwotCi0vKiBXZSB1c2UgdGhlIG5vcm1hbCBET1Mgc2VydmljZXMgdG8gc2F2ZSBhbmQgcmVzdG9yZSBpbnRlcnJ1cHRzIGhhbmRsZXJzCi0gKiBmb3IgV2F0Y29tIEMrKywgYmVjYXVzZSB1c2luZyB0aGUgZGlyZWN0IERQTUkgZnVuY3Rpb25zIGRvZXMgbm90Ci0gKiBhcHBlYXIgdG8gd29yayBwcm9wZXJseS4gQXQgbGVhc3QgaWYgd2UgdXNlIHRoZSBEUE1JIGZ1bmN0aW9ucywgd2UKLSAqIGRvbnQgZ2V0IHRoZSBhdXRvLXBhc3N1cCBmZWF0dXJlIHRoYXQgd2UgbmVlZCB0byBjb3JyZWN0bHkgdHJhcAotICogcmVhbCBhbmQgcHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0cyB3aXRob3V0IGluc3RhbGxpbmcgQmktbW9kZWwKLSAqIGludGVycnVwdCBoYW5kbGVycy4KLSAqLwotCi12b2lkIFBNQVBJIFBNX2dldFBNdmVjdChpbnQgaW50bm8sIFBNRkFSUFRSICppc3IpCi17Ci0gICAgUE1SRUdTICByZWdzOwotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0KLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmVncy5oLmFoID0gMHgzNTsKLSAgICByZWdzLmguYWwgPSBpbnRubzsKLSAgICBQTV9pbnQzODZ4KDB4MjEsJnJlZ3MsJnJlZ3MsJnNyZWdzKTsKLSAgICBpc3ItPnNlbCA9IHNyZWdzLmVzOwotICAgIGlzci0+b2ZmID0gcmVncy5lLmVieDsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRQTXZlY3QoaW50IGludG5vLCBQTV9pbnRIYW5kbGVyIGlzcikKLXsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0gICAgUE1TUkVHUyBzcmVnczsKLQotICAgIFBNX3NhdmVEUygpOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZWdzLmguYWggPSAweDI1OwotICAgIHJlZ3MuaC5hbCA9IGludG5vOwotICAgIHNyZWdzLmRzID0gc3JlZ3MuY3M7Ci0gICAgcmVncy5lLmVkeCA9ICh1aW50KWlzcjsKLSAgICBQTV9pbnQzODZ4KDB4MjEsJnJlZ3MsJnJlZ3MsJnNyZWdzKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgaXNyKQotewotICAgIFBNUkVHUyAgcmVnczsKLSAgICBQTVNSRUdTIHNyZWdzOwotCi0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MuaC5haCA9IDB4MjU7Ci0gICAgcmVncy5oLmFsID0gaW50bm87Ci0gICAgc3JlZ3MuZHMgPSBpc3Iuc2VsOwotICAgIHJlZ3MuZS5lZHggPSBpc3Iub2ZmOwotICAgIFBNX2ludDM4NngoMHgyMSwmcmVncywmcmVncywmc3JlZ3MpOwotfQotCi1pbnQgUE1BUEkgUE1fc2V0TW91c2VIYW5kbGVyKGludCBtYXNrLCBQTV9tb3VzZUhhbmRsZXIgbWgpCi17Ci0gICAgbG9ja1BNSGFuZGxlcnMoKTsgICAgICAgICAgIC8qIEVuc3VyZSBvdXIgaGFuZGxlcnMgYXJlIGxvY2tlZCAgICovCi0KLSAgICBfUE1fbW91c2VIYW5kbGVyID0gbWg7Ci0gICAgX1BNX3NldE1vdXNlSGFuZGxlcihfUE1fbW91c2VNYXNrID0gbWFzayk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZU1vdXNlSGFuZGxlcih2b2lkKQotewotICAgIFBNUkVHUyAgcmVnczsKLQotICAgIGlmIChfUE1fbW91c2VIYW5kbGVyKSB7Ci0JcmVncy54LmF4ID0gMzM7Ci0JUE1faW50Mzg2KDB4MzMsICZyZWdzLCAmcmVncyk7Ci0JX1BNX21vdXNlSGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIERKR1BQIHBvcnQgb2YgR05VIEMrKyBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgREpHUFAKLSNkZWZpbmUgR0VORVJJQ19EUE1JMzIgICAgICAgICAgLyogVXNlIGdlbmVyaWMgMzIgYml0IERQTUkgcm91dGluZXMgKi8KLQotdm9pZCBQTUFQSSBQTV9nZXRQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiAqaXNyKQotewotICAgIFBNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4MjA0OwotICAgIHJlZ3MuaC5ibCA9IGludG5vOwotICAgIFBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKLSAgICBpc3ItPnNlbCA9IHJlZ3MueC5jeDsKLSAgICBpc3ItPm9mZiA9IHJlZ3MuZS5lZHg7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0UE12ZWN0KGludCBpbnRubywgUE1faW50SGFuZGxlciBpc3IpCi17Ci0gICAgUE1TUkVHUyBzcmVnczsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0KLSAgICBQTV9zYXZlRFMoKTsKLSAgICByZWdzLnguYXggPSAweDIwNTsgICAgICAgICAgLyogU2V0IHByb3RlY3RlZCBtb2RlIHZlY3RvciAgICAgICAgKi8KLSAgICByZWdzLmguYmwgPSBpbnRubzsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmVncy54LmN4ID0gc3JlZ3MuY3M7Ci0gICAgcmVncy5lLmVkeCA9ICh1aW50KWlzcjsKLSAgICBQTV9pbnQzODYoMHgzMSwmcmVncywmcmVncyk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVBNdmVjdChpbnQgaW50bm8sIFBNRkFSUFRSIGlzcikKLXsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0KLSAgICByZWdzLnguYXggPSAweDIwNTsKLSAgICByZWdzLmguYmwgPSBpbnRubzsKLSAgICByZWdzLnguY3ggPSBpc3Iuc2VsOwotICAgIHJlZ3MuZS5lZHggPSBpc3Iub2ZmOwotICAgIFBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKLX0KLQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBHZW5lcmljIDMyIGJpdCBEUE1JIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmIGRlZmluZWQoR0VORVJJQ19EUE1JMzIpCi0KLXN0YXRpYyBsb25nIHByZXZSZWFsQnJlYWs7ICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGJyZWFrIGhhbmRsZXIgICAgICovCi1zdGF0aWMgbG9uZyBwcmV2UmVhbEN0cmxDOyAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBDdHJsQyBoYW5kbGVyICAgICAqLwotc3RhdGljIGxvbmcgcHJldlJlYWxDcml0aWNhbDsgICAvKiBQcmV2IHJlYWwgbW9kZSBjcml0aWNhbCBoYW5kbGVyICAgICAgKi8KLQotI2lmbmRlZiBNT1VTRV9TVVBQT1JURUQKLQotLyogVGhlIGZvbGxvd2luZyByZWFsIG1vZGUgcm91dGluZSBpcyB1c2VkIHRvIGNhbGwgYSAzMiBiaXQgcHJvdGVjdGVkCi0gKiBtb2RlIEZBUiBmdW5jdGlvbiBmcm9tIHJlYWwgbW9kZS4gV2UgdXNlIHRoaXMgZm9yIHBhc3NpbmcgdXAgY29udHJvbAotICogZnJvbSB0aGUgcmVhbCBtb2RlIG1vdXNlIGNhbGxiYWNrIHRvIG91ciBwcm90ZWN0ZWQgbW9kZSBjb2RlLgotICovCi0KLXN0YXRpYyBsb25nIG1vdXNlUk1DQjsgICAgICAgICAgLyogTW91c2UgcmVhbCBtb2RlIGNhbGxiYWNrIGFkZHJlc3MgICAgICovCi1zdGF0aWMgdWNoYXIgKm1vdXNlUHRyOwotc3RhdGljIGNoYXIgbW91c2VSZWdzWzB4MzJdOyAgICAvKiBSZWFsIG1vZGUgcmVncyBmb3IgbW91c2UgY2FsbGJhY2sgICAgKi8KLXN0YXRpYyB1Y2hhciBtb3VzZUhhbmRsZXJbXSA9IHsKLSAgICAweDAwLDB4MDAsMHgwMCwweDAwLCAgICAgICAgLyogX3JlYWxSTUNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgyRSwweEZGLDB4MUUsMHgwMCwweDAwLCAgIC8qICBjYWxsICAgIFtjczpfcmVhbFJNQ0JdICAgICAgICAgICAgICAqLwotICAgIDB4Q0IsICAgICAgICAgICAgICAgICAgICAgICAvKiAgcmV0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB9OwotCi1pbnQgUE1BUEkgUE1fc2V0TW91c2VIYW5kbGVyKGludCBtYXNrLCBQTV9tb3VzZUhhbmRsZXIgbWgpCi17Ci0gICAgUk1SRUdTICAgICAgcmVnczsKLSAgICBSTVNSRUdTICAgICBzcmVnczsKLSAgICB1aW50ICAgICAgICByc2VnLHJvZmY7Ci0KLSAgICBsb2NrUE1IYW5kbGVycygpOyAgICAgICAgICAgLyogRW5zdXJlIG91ciBoYW5kbGVycyBhcmUgbG9ja2VkICAgKi8KLQotICAgIC8qIENvcHkgdGhlIHJlYWwgbW9kZSBoYW5kbGVyIHRvIHJlYWwgbW9kZSBtZW1vcnkgICAqLwotICAgIGlmICgobW91c2VQdHIgPSBQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKG1vdXNlSGFuZGxlciksJnJzZWcsJnJvZmYpKSA9PSBOVUxMKQotCXJldHVybiAwOwotICAgIG1lbWNweShtb3VzZVB0cixtb3VzZUhhbmRsZXIsc2l6ZW9mKG1vdXNlSGFuZGxlcikpOwotICAgIGlmICghX0RQTUlfYWxsb2NhdGVDYWxsYmFjayhfUE1fbW91c2VQTUNCLCBtb3VzZVJlZ3MsICZtb3VzZVJNQ0IpKQotCVBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSByZWFsIG1vZGUgY2FsbGJhY2shXG4iKTsKLSAgICBQTV9zZXRMb25nKG1vdXNlUHRyLG1vdXNlUk1DQik7Ci0KLSAgICAvKiBJbnN0YWxsIHRoZSByZWFsIG1vZGUgbW91c2UgaGFuZGxlciAgKi8KLSAgICBfUE1fbW91c2VIYW5kbGVyID0gbWg7Ci0gICAgc3JlZ3MuZXMgPSByc2VnOwotICAgIHJlZ3MueC5keCA9IHJvZmYrNDsKLSAgICByZWdzLnguY3ggPSBfUE1fbW91c2VNYXNrID0gbWFzazsKLSAgICByZWdzLnguYXggPSAweEM7Ci0gICAgUE1faW50ODZ4KDB4MzMsICZyZWdzLCAmcmVncywgJnNyZWdzKTsKLSAgICByZXR1cm4gMTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlTW91c2VIYW5kbGVyKHZvaWQpCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgaWYgKF9QTV9tb3VzZUhhbmRsZXIpIHsKLQlyZWdzLnguYXggPSAzMzsKLQlQTV9pbnQ4NigweDMzLCAmcmVncywgJnJlZ3MpOwotCVBNX2ZyZWVSZWFsU2VnKG1vdXNlUHRyKTsKLQlfRFBNSV9mcmVlQ2FsbGJhY2sobW91c2VSTUNCKTsKLQlfUE1fbW91c2VIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBnZXRJU1IoaW50IGludG5vLCBQTUZBUlBUUiAqcG1pc3IsIGxvbmcgKnJlYWxpc3IpCi17Ci0gICAgUE1fZ2V0UE12ZWN0KGludG5vLHBtaXNyKTsKLSAgICBfUE1fZ2V0Uk12ZWN0KGludG5vLHJlYWxpc3IpOwotfQotCi1zdGF0aWMgdm9pZCByZXN0b3JlSVNSKGludCBpbnRubywgUE1GQVJQVFIgcG1pc3IsIGxvbmcgcmVhbGlzcikKLXsKLSAgICBfUE1fc2V0Uk12ZWN0KGludG5vLHJlYWxpc3IpOwotICAgIFBNX3Jlc3RvcmVQTXZlY3QoaW50bm8scG1pc3IpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRJU1IoaW50IGludG5vLCB2b2lkICgqIFBNQVBJIHBtaXNyKSgpKQotewotICAgIGxvY2tQTUhhbmRsZXJzKCk7ICAgICAgICAgICAvKiBFbnN1cmUgb3VyIGhhbmRsZXJzIGFyZSBsb2NrZWQgICAqLwotICAgIFBNX3NldFBNdmVjdChpbnRubyxwbWlzcik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0VGltZXJIYW5kbGVyKFBNX2ludEhhbmRsZXIgdGgpCi17Ci0gICAgZ2V0SVNSKDB4OCwgJl9QTV9wcmV2VGltZXIsICZfUE1fcHJldlJlYWxUaW1lcik7Ci0gICAgX1BNX3RpbWVySGFuZGxlciA9IHRoOwotICAgIHNldElTUigweDgsIF9QTV90aW1lcklTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVRpbWVySGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fdGltZXJIYW5kbGVyKSB7Ci0JcmVzdG9yZUlTUigweDgsIF9QTV9wcmV2VGltZXIsIF9QTV9wcmV2UmVhbFRpbWVyKTsKLQlfUE1fdGltZXJIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLWlib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKFBNX2ludEhhbmRsZXIgdGgsaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBTYXZlIHRoZSBvbGQgQ01PUyByZWFsIHRpbWUgY2xvY2sgdmFsdWVzICovCi0gICAgX1BNX29sZENNT1NSZWdBID0gX1BNX3JlYWRDTU9TKDB4MEEpOwotICAgIF9QTV9vbGRDTU9TUmVnQiA9IF9QTV9yZWFkQ01PUygweDBCKTsKLQotICAgIC8qIFNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBoYW5kbGVyICovCi0gICAgZ2V0SVNSKDB4NzAsICZfUE1fcHJldlJUQywgJl9QTV9wcmV2UmVhbFJUQyk7Ci0gICAgX1BNX3J0Y0hhbmRsZXIgPSB0aDsKLSAgICBzZXRJU1IoMHg3MCwgX1BNX3J0Y0lTUik7Ci0KLSAgICAvKiBQcm9ncmFtIHRoZSByZWFsIHRpbWUgY2xvY2sgZGVmYXVsdCBmcmVxdWVuY3kgKi8KLSAgICBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGZyZXF1ZW5jeSk7Ci0KLSAgICAvKiBVbm1hc2sgSVJROCBpbiB0aGUgUElDMiAqLwotICAgIF9QTV9vbGRSVENQSUMyID0gUE1faW5wYigweEExKTsKLSAgICBQTV9vdXRwYigweEExLF9QTV9vbGRSVENQSUMyICYgMHhGRSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9ydGNIYW5kbGVyKSB7Ci0JLyogUmVzdG9yZSBDTU9TIHJlZ2lzdGVycyBhbmQgbWFzayBSVEMgY2xvY2sgKi8KLQlfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKLQlfUE1fd3JpdGVDTU9TKDB4MEIsX1BNX29sZENNT1NSZWdCKTsKLQlQTV9vdXRwYigweEExLChQTV9pbnBiKDB4QTEpICYgMHhGRSkgfCAoX1BNX29sZFJUQ1BJQzIgJiB+MHhGRSkpOwotCi0JLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IHZlY3RvciAqLwotCXJlc3RvcmVJU1IoMHg3MCwgX1BNX3ByZXZSVEMsIF9QTV9wcmV2UmVhbFJUQyk7Ci0JX1BNX3J0Y0hhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotUE1fSVJRSGFuZGxlIFBNQVBJIFBNX3NldElSUUhhbmRsZXIoCi0gICAgaW50IElSUSwKLSAgICBQTV9pcnFIYW5kbGVyIGloKQotewotICAgIGludCAgICAgICAgICAgICB0aHVua1NpemUsUElDbWFzayxjaGFpblByZXZpb3VzOwotICAgIHVsb25nICAgICAgICAgICBvZmZzZXRBZGp1c3Q7Ci0gICAgX1BNX0lSUUhhbmRsZSAgICpoYW5kbGU7Ci0KLSAgICB0aHVua1NpemUgPSAodWxvbmcpX1BNX2lycUlTUlRlbXBsYXRlRW5kIC0gKHVsb25nKV9QTV9pcnFJU1JUZW1wbGF0ZTsKLSAgICBpZiAoKGhhbmRsZSA9IFBNX21hbGxvYyhzaXplb2YoX1BNX0lSUUhhbmRsZSkgKyB0aHVua1NpemUpKSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgIGhhbmRsZS0+SVJRID0gSVJROwotICAgIGhhbmRsZS0+cHJldlBJQyA9IFBNX2lucGIoMHgyMSk7Ci0gICAgaGFuZGxlLT5wcmV2UElDMiA9IFBNX2lucGIoMHhBMSk7Ci0gICAgaWYgKElSUSA8IDgpIHsKLQloYW5kbGUtPklSUVZlY3QgPSAoSVJRICsgOCk7Ci0JUElDbWFzayA9ICgxIDw8IElSUSk7Ci0JY2hhaW5QcmV2aW91cyA9ICgoaGFuZGxlLT5wcmV2UElDICYgUElDbWFzaykgPT0gMCk7Ci0JfQotICAgIGVsc2UgewotCWhhbmRsZS0+SVJRVmVjdCA9ICgweDYwICsgSVJRICsgOCk7Ci0JUElDbWFzayA9ICgoMSA8PCBJUlEpIHwgMHg0KTsKLQljaGFpblByZXZpb3VzID0gKChoYW5kbGUtPnByZXZQSUMyICYgKFBJQ21hc2sgPj4gOCkpID09IDApOwotCX0KLQotICAgIC8qIENvcHkgYW5kIHNldHVwIHRoZSBhc3NlbWJsZXIgdGh1bmsgKi8KLSAgICBvZmZzZXRBZGp1c3QgPSAodWxvbmcpaGFuZGxlLT50aHVuayAtICh1bG9uZylfUE1faXJxSVNSVGVtcGxhdGU7Ci0gICAgbWVtY3B5KGhhbmRsZS0+dGh1bmssX1BNX2lycUlTUlRlbXBsYXRlLHRodW5rU2l6ZSk7Ci0gICAgKigodWxvbmcqKSZoYW5kbGUtPnRodW5rWzJdKSA9IG9mZnNldEFkanVzdDsKLSAgICAqKCh1bG9uZyopJmhhbmRsZS0+dGh1bmtbMTErMF0pID0gKHVsb25nKWloOwotICAgIGlmIChjaGFpblByZXZpb3VzKSB7Ci0JKigodWxvbmcqKSZoYW5kbGUtPnRodW5rWzExKzRdKSA9IGhhbmRsZS0+cHJldkhhbmRsZXIub2ZmOwotCSooKHVsb25nKikmaGFuZGxlLT50aHVua1sxMSs4XSkgPSBoYW5kbGUtPnByZXZIYW5kbGVyLnNlbDsKLQl9Ci0gICAgZWxzZSB7Ci0JKigodWxvbmcqKSZoYW5kbGUtPnRodW5rWzExKzRdKSA9IDA7Ci0JKigodWxvbmcqKSZoYW5kbGUtPnRodW5rWzExKzhdKSA9IDA7Ci0JfQotICAgICooKHVsb25nKikmaGFuZGxlLT50aHVua1sxMSsxMl0pID0gSVJROwotCi0gICAgLyogU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSAgICBnZXRJU1IoaGFuZGxlLT5JUlFWZWN0LCAmaGFuZGxlLT5wcmV2SGFuZGxlciwgJmhhbmRsZS0+cHJldlJlYWxoYW5kbGVyKTsKLSAgICBzZXRJU1IoaGFuZGxlLT5JUlFWZWN0LCAoUE1faW50SGFuZGxlciloYW5kbGUtPnRodW5rKTsKLQotICAgIC8qIFVubWFzayB0aGUgSVJRIGluIHRoZSBQSUMgKi8KLSAgICBQTV9vdXRwYigweEExLGhhbmRsZS0+cHJldlBJQzIgJiB+KFBJQ21hc2sgPj4gOCkpOwotICAgIFBNX291dHBiKDB4MjEsaGFuZGxlLT5wcmV2UElDICYgflBJQ21hc2spOwotICAgIHJldHVybiBoYW5kbGU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUlSUUhhbmRsZXIoCi0gICAgUE1fSVJRSGFuZGxlIGlycUhhbmRsZSkKLXsKLSAgICBpbnQgICAgICAgICAgICAgUElDbWFzazsKLSAgICBfUE1fSVJRSGFuZGxlICAgKmhhbmRsZSA9IGlycUhhbmRsZTsKLQotICAgIC8qIFJlc3RvcmUgUElDIG1hc2sgZm9yIHRoZSBpbnRlcnJ1cHQgKi8KLSAgICBpZiAoaGFuZGxlLT5JUlEgPCA4KQotCVBJQ21hc2sgPSAoMSA8PCBoYW5kbGUtPklSUSk7Ci0gICAgZWxzZQotCVBJQ21hc2sgPSAoKDEgPDwgaGFuZGxlLT5JUlEpIHwgMHg0KTsKLSAgICBQTV9vdXRwYigweEExLChQTV9pbnBiKDB4QTEpICYgfihQSUNtYXNrID4+IDgpKSB8IChoYW5kbGUtPnByZXZQSUMyICYgKFBJQ21hc2sgPj4gOCkpKTsKLSAgICBQTV9vdXRwYigweDIxLChQTV9pbnBiKDB4MjEpICYgflBJQ21hc2spIHwgKGhhbmRsZS0+cHJldlBJQyAmIFBJQ21hc2spKTsKLQotICAgIC8qIFJlc3RvcmUgdGhlIGludGVycnVwdCB2ZWN0b3IgKi8KLSAgICByZXN0b3JlSVNSKGhhbmRsZS0+SVJRVmVjdCwgaGFuZGxlLT5wcmV2SGFuZGxlciwgaGFuZGxlLT5wcmV2UmVhbGhhbmRsZXIpOwotCi0gICAgLyogRmluYWxseSBmcmVlIHRoZSB0aHVuayAqLwotICAgIFBNX2ZyZWUoaGFuZGxlKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRLZXlIYW5kbGVyKFBNX2ludEhhbmRsZXIga2gpCi17Ci0gICAgZ2V0SVNSKDB4OSwgJl9QTV9wcmV2S2V5LCAmX1BNX3ByZXZSZWFsS2V5KTsKLSAgICBfUE1fa2V5SGFuZGxlciA9IGtoOwotICAgIHNldElTUigweDksIF9QTV9rZXlJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVLZXlIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9rZXlIYW5kbGVyKSB7Ci0JcmVzdG9yZUlTUigweDksIF9QTV9wcmV2S2V5LCBfUE1fcHJldlJlYWxLZXkpOwotCV9QTV9rZXlIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0S2V5MTVIYW5kbGVyKFBNX2tleTE1SGFuZGxlciBraCkKLXsKLSAgICBnZXRJU1IoMHgxNSwgJl9QTV9wcmV2S2V5MTUsICZfUE1fcHJldlJlYWxLZXkxNSk7Ci0gICAgX1BNX2tleTE1SGFuZGxlciA9IGtoOwotICAgIHNldElTUigweDE1LCBfUE1fa2V5MTVJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVLZXkxNUhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX2tleTE1SGFuZGxlcikgewotCXJlc3RvcmVJU1IoMHgxNSwgX1BNX3ByZXZLZXkxNSwgX1BNX3ByZXZSZWFsS2V5MTUpOwotCV9QTV9rZXkxNUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotLyogUmVhbCBtb2RlIEN0cmwtQyBhbmQgQ3RybC1CcmVhayBoYW5kbGVyLiBUaGlzIGhhbmRsZXIgc2ltcGx5IHNldHMgYQotICogZmxhZyBpbiB0aGUgcmVhbCBtb2RlIGNvZGUgc2VnbWVudCBhbmQgZXhpdC4gV2Ugc2F2ZSB0aGUgbG9jYXRpb24KLSAqIG9mIHRoaXMgZmxhZyBpbiByZWFsIG1vZGUgbWVtb3J5IHNvIHRoYXQgYm90aCB0aGUgcmVhbCBtb2RlIGFuZAotICogcHJvdGVjdGVkIG1vZGUgY29kZSB3aWxsIGJlIG1vZGlmeWluZyB0aGUgc2FtZSBmbGFncy4KLSAqLwotCi0jaWZuZGVmIERPUzRHVwotc3RhdGljIHVjaGFyIGN0cmxIYW5kbGVyW10gPSB7Ci0gICAgMHgwMCwweDAwLDB4MDAsMHgwMCwgICAgICAgICAgICAvKiAgY3RybEJGbGFnICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4NjYsMHgyRSwweEM3LDB4MDYsMHgwMCwweDAwLAotICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsICAgICAgICAgICAgLyogIG1vdiAgICAgW2NzOmN0cmxCRmxhZ10sMSAgICAgICAgKi8KLSAgICAweENGLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBpcmV0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgfTsKLSNlbmRpZgotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoUE1fYnJlYWtIYW5kbGVyIGJoKQotewotI2lmbmRlZiBET1M0R1cKLSAgICB1aW50ICAgIHJzZWcscm9mZjsKLSNlbHNlCi0gICAgc3RhdGljIGludCAgY3RybENGbGFnLGN0cmxCRmxhZzsKLQotICAgIF9QTV9jdHJsQ1B0ciA9ICh1Y2hhciopJmN0cmxDRmxhZzsKLSAgICBfUE1fY3RybEJQdHIgPSAodWNoYXIqKSZjdHJsQkZsYWc7Ci0jZW5kaWYKLQotICAgIGdldElTUigweDFCLCAmX1BNX3ByZXZCcmVhaywgJnByZXZSZWFsQnJlYWspOwotICAgIGdldElTUigweDIzLCAmX1BNX3ByZXZDdHJsQywgJnByZXZSZWFsQ3RybEMpOwotICAgIF9QTV9icmVha0hhbmRsZXIgPSBiaDsKLSAgICBzZXRJU1IoMHgxQiwgX1BNX2JyZWFrSVNSKTsKLSAgICBzZXRJU1IoMHgyMywgX1BNX2N0cmxDSVNSKTsKLQotI2lmbmRlZiBET1M0R1cKLSAgICAvKiBIb29rIHRoZSByZWFsIG1vZGUgdmVjdG9ycyBmb3IgdGhlc2UgaGFuZGxlcnMsIGFzIHRoZXNlIGFyZSBub3QKLSAgICAgKiBub3JtYWxseSByZWZsZWN0ZWQgYnkgdGhlIERQTUkgc2VydmVyIHVwIHRvIHByb3RlY3RlZCBtb2RlCi0gICAgICovCi0gICAgX1BNX2N0cmxCUHRyID0gUE1fYWxsb2NSZWFsU2VnKHNpemVvZihjdHJsSGFuZGxlcikqMiwgJnJzZWcsICZyb2ZmKTsKLSAgICBtZW1jcHkoX1BNX2N0cmxCUHRyLGN0cmxIYW5kbGVyLHNpemVvZihjdHJsSGFuZGxlcikpOwotICAgIG1lbWNweShfUE1fY3RybEJQdHIrc2l6ZW9mKGN0cmxIYW5kbGVyKSxjdHJsSGFuZGxlcixzaXplb2YoY3RybEhhbmRsZXIpKTsKLSAgICBfUE1fY3RybENQdHIgPSBfUE1fY3RybEJQdHIgKyBzaXplb2YoY3RybEhhbmRsZXIpOwotICAgIF9QTV9zZXRSTXZlY3QoMHgxQiwoKGxvbmcpcnNlZyA8PCAxNikgfCAocm9mZis0KSk7Ci0gICAgX1BNX3NldFJNdmVjdCgweDIzLCgobG9uZylyc2VnIDw8IDE2KSB8IChyb2ZmK3NpemVvZihjdHJsSGFuZGxlcikrNCkpOwotI2VuZGlmCi19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEJyZWFrSGFuZGxlcih2b2lkKQotewotICAgIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoTlVMTCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcHJldkJyZWFrLnNlbCkgewotCXJlc3RvcmVJU1IoMHgxQiwgX1BNX3ByZXZCcmVhaywgcHJldlJlYWxCcmVhayk7Ci0JcmVzdG9yZUlTUigweDIzLCBfUE1fcHJldkN0cmxDLCBwcmV2UmVhbEN0cmxDKTsKLQlfUE1fcHJldkJyZWFrLnNlbCA9IDA7Ci0JX1BNX2JyZWFrSGFuZGxlciA9IE5VTEw7Ci0jaWZuZGVmIERPUzRHVwotCVBNX2ZyZWVSZWFsU2VnKF9QTV9jdHJsQlB0cik7Ci0jZW5kaWYKLQl9Ci19Ci0KLS8qIFJlYWwgbW9kZSBDcml0aWNhbCBFcnJvciBoYW5kbGVyLiBUaGlzIGhhbmRsZXIgc2ltcGx5IHNhdmVzIHRoZSBBWCBhbmQKLSAqIERJIHZhbHVlcyBpbiB0aGUgcmVhbCBtb2RlIGNvZGUgc2VnbWVudCBhbmQgZXhpdHMuIFdlIHNhdmUgdGhlIGxvY2F0aW9uCi0gKiBvZiB0aGlzIGZsYWcgaW4gcmVhbCBtb2RlIG1lbW9yeSBzbyB0aGF0IGJvdGggdGhlIHJlYWwgbW9kZSBhbmQKLSAqIHByb3RlY3RlZCBtb2RlIGNvZGUgd2lsbCBiZSBtb2RpZnlpbmcgdGhlIHNhbWUgZmxhZ3MuCi0gKi8KLQotI2lmbmRlZiBET1M0R1cKLXN0YXRpYyB1Y2hhciBjcml0aWNhbEhhbmRsZXJbXSA9IHsKLSAgICAweDAwLDB4MDAsICAgICAgICAgICAgICAgICAgICAgIC8qICBheENvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgwMCwweDAwLCAgICAgICAgICAgICAgICAgICAgICAvKiAgZGlDb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4MkUsMHhBMywweDAwLDB4MDAsICAgICAgICAgICAgLyogIG1vdiAgICAgW2NzOmF4Q29kZV0sYXggICAgICAgICAgKi8KLSAgICAweDJFLDB4ODksMHgzRSwweDAyLDB4MDAsICAgICAgIC8qICBtb3YgICAgIFtjczpkaUNvZGVdLGRpICAgICAgICAgICovCi0gICAgMHhCOCwweDAzLDB4MDAsICAgICAgICAgICAgICAgICAvKiAgbW92ICAgICBheCwzICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4Q0YsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGlyZXRmICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB9OwotI2VuZGlmCi0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEFsdENyaXRpY2FsSGFuZGxlcihQTV9jcml0aWNhbEhhbmRsZXIgY2gpCi17Ci0jaWZuZGVmIERPUzRHVwotICAgIHVpbnQgICAgcnNlZyxyb2ZmOwotI2Vsc2UKLSAgICBzdGF0aWMgIHNob3J0ICAgY3JpdEJ1ZlsyXTsKLQotICAgIF9QTV9jcml0UHRyID0gKHVjaGFyKiljcml0QnVmOwotI2VuZGlmCi0KLSAgICBnZXRJU1IoMHgyNCwgJl9QTV9wcmV2Q3JpdGljYWwsICZwcmV2UmVhbENyaXRpY2FsKTsKLSAgICBfUE1fY3JpdEhhbmRsZXIgPSBjaDsKLSAgICBzZXRJU1IoMHgyNCwgX1BNX2NyaXRpY2FsSVNSKTsKLQotI2lmbmRlZiBET1M0R1cKLSAgICAvKiBIb29rIHRoZSByZWFsIG1vZGUgdmVjdG9yLCBhcyB0aGlzIGlzIG5vdCBub3JtYWxseSByZWZsZWN0ZWQgYnkgdGhlCi0gICAgICogRFBNSSBzZXJ2ZXIgdXAgdG8gcHJvdGVjdGVkIG1vZGUuCi0gICAgICovCi0gICAgX1BNX2NyaXRQdHIgPSBQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKGNyaXRpY2FsSGFuZGxlcikqMiwgJnJzZWcsICZyb2ZmKTsKLSAgICBtZW1jcHkoX1BNX2NyaXRQdHIsY3JpdGljYWxIYW5kbGVyLHNpemVvZihjcml0aWNhbEhhbmRsZXIpKTsKLSAgICBfUE1fc2V0Uk12ZWN0KDB4MjQsKChsb25nKXJzZWcgPDwgMTYpIHwgKHJvZmYrNCkpOwotI2VuZGlmCi19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbENyaXRpY2FsSGFuZGxlcih2b2lkKQotewotICAgIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoTlVMTCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNyaXRpY2FsSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcHJldkNyaXRpY2FsLnNlbCkgewotCXJlc3RvcmVJU1IoMHgyNCwgX1BNX3ByZXZDcml0aWNhbCwgcHJldlJlYWxDcml0aWNhbCk7Ci0JUE1fZnJlZVJlYWxTZWcoX1BNX2NyaXRQdHIpOwotCV9QTV9wcmV2Q3JpdGljYWwuc2VsID0gMDsKLQlfUE1fY3JpdEhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZXR1cm4gRFBNSV9sb2NrTGluZWFyUGFnZXMoKHVpbnQpcCArIERQTUlfZ2V0U2VsZWN0b3JCYXNlKHNyZWdzLmRzKSxsZW4pOwotfQotCi1pbnQgUE1BUEkgUE1fdW5sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgUE1TUkVHUyBzcmVnczsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmV0dXJuIERQTUlfdW5sb2NrTGluZWFyUGFnZXMoKHVpbnQpcCArIERQTUlfZ2V0U2VsZWN0b3JCYXNlKHNyZWdzLmRzKSxsZW4pOwotfQotCi1pbnQgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZXR1cm4gRFBNSV9sb2NrTGluZWFyUGFnZXMoKHVpbnQpcCArIERQTUlfZ2V0U2VsZWN0b3JCYXNlKHNyZWdzLmNzKSxsZW4pOwotfQotCi1pbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJldHVybiBEUE1JX3VubG9ja0xpbmVhclBhZ2VzKCh1aW50KXAgKyBEUE1JX2dldFNlbGVjdG9yQmFzZShzcmVncy5jcyksbGVuKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy92ZmxhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2U5YjZjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy92ZmxhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBET1MKLSoKLSogRGVzY3JpcHRpb246ICBNYWluIEMgbW9kdWxlIGZvciB0aGUgVkZsYXQgZnJhbWVidWZmZXIgcm91dGluZXMuIFRoZSBwYWdlCi0qICAgICAgICAgICAgICAgZmF1bHQgaGFuZGxlciBpcyBhbHdheXMgaW5zdGFsbGVkIHRvIGhhbmRsZSB1cCB0byBhIDRNYgotKiAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyIHdpdGggYSB3aW5kb3cgc2l6ZSBvZiA0S2Igb3IgNjRLYiBpbiBzaXplLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZG9zLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBET1M0Ry9XLCBQTU9ERS9XIGFuZCBDYXVzZVdheSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmIGRlZmluZWQoRE9TNEdXKQotCi0jZGVmaW5lIFZGTEFUX1NUQVJUX0FERFIgICAgMHhGMDAwMDAwMFUKLSNkZWZpbmUgVkZMQVRfRU5EX0FERFIgICAgICAweEYwM0ZGRkZGVQotI2RlZmluZSBWRkxBVF9MSU1JVCAgICAgICAgIChWRkxBVF9FTkRfQUREUiAtIFZGTEFUX1NUQVJUX0FERFIpCi0jZGVmaW5lIFBBR0VfUFJFU0VOVCAgICAgICAgMQotI2RlZmluZSBQQUdFX05PVFBSRVNFTlQgICAgIDAKLSNkZWZpbmUgUEFHRV9SRUFEICAgICAgICAgICAwCi0jZGVmaW5lIFBBR0VfV1JJVEUgICAgICAgICAgMgotCi1QUklWQVRFIGlib29sICAgaW5zdGFsbGVkID0gZmFsc2U7Ci1QUklWQVRFIGlib29sICAgaGF2ZURQTUkgPSBmYWxzZTsKLVBVQkxJQyAgaWJvb2wgICBfQVNNQVBJIFZGX2hhdmVDYXVzZVdheSA9IGZhbHNlOwotUFVCTElDICB1Y2hhciAqIF9BU01BUEkgVkZfemVyb1B0ciA9IE5VTEw7Ci0KLS8qIExvdyBsZXZlbCBhc3NlbWJsZXIgY29kZSAqLwotCi1pbnQgICAgIF9BU01BUEkgSW5pdFBhZ2luZyh2b2lkKTsKLXZvaWQgICAgX0FTTUFQSSBDbG9zZVBhZ2luZyh2b2lkKTsKLXZvaWQgICAgX0FTTUFQSSBNYXBQaHlzaWNhbDJMaW5lYXIodWxvbmcgcEFkZHIsIHVsb25nIGxBZGRyLCBpbnQgcGFnZXMsIGludCBmbGFncyk7Ci12b2lkICAgIF9BU01BUEkgSW5zdGFsbEZhdWx0SGFuZGxlcih1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUpOwotdm9pZCAgICBfQVNNQVBJIFJlbW92ZUZhdWx0SGFuZGxlcih2b2lkKTsKLXZvaWQgICAgX0FTTUFQSSBJbnN0YWxsQmFua0Z1bmMoaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpOwotCi12b2lkICogX0FTTUFQSSBWRl9tYWxsb2ModWludCBzaXplKQoteyByZXR1cm4gUE1fbWFsbG9jKHNpemUpOyB9Ci0KLXZvaWQgX0FTTUFQSSBWRl9mcmVlKHZvaWQgKnApCi17IFBNX2ZyZWUocCk7IH0KLQotUFJJVkFURSBpYm9vbCBDaGVja0RQTUkodm9pZCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgQ2hlY2tEUE1JCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBpZiB3ZSBhcmUgcnVubmluZyB1bmRlciBEUE1JCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFBNUkVHUyAgcmVnczsKLQotICAgIGlmIChoYXZlRFBNSSkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgIC8qIENoZWNrIGlmIHdlIGFyZSBydW5uaW5nIHVuZGVyIERQTUkgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsIG5vdCBiZQotICAgICAqIGFibGUgdG8gaW5zdGFsbCBvdXIgcGFnZSBmYXVsdCBoYW5kbGVycy4gV2UgY2FuIGhvd2V2ZXIgdXNlIHRoZQotICAgICAqIERWQS4zODYgb3IgVkZMQVRELjM4NiB2aXJ0dWFsIGRldmljZSBkcml2ZXJzIGlmIHRoZXkgYXJlIHByZXNlbnQuCi0gICAgICovCi0gICAgcmVncy54LmF4ID0gMHhGRjAwOwotICAgIFBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKLSAgICBpZiAoIXJlZ3MueC5jZmxhZyAmJiAocmVncy5lLmVkaSAmIDgpKQotCXJldHVybiAoaGF2ZURQTUkgPSB0cnVlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWlib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWRl9hdmFpbGFibGUKLSogUmV0dXJuczogICAgICBUcnVlIGlmIHZpcnR1YWwgYnVmZmVyIGlzIGF2YWlsYWJsZSwgZmFsc2UgaWYgbm90LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBpZiAoIVZGX3plcm9QdHIpCi0JVkZfemVyb1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigwLDB4RkZGRkZGRkYsdHJ1ZSk7Ci0gICAgaWYgKENoZWNrRFBNSSgpKQotCXJldHVybiBmYWxzZTsKLQotICAgIC8qIFN0YW5kYXJkIERPUzRHVywgUE1PREUvVyBhbmQgQ2F1c2V3YXkgKi8KLSAgICBpZiAoSW5pdFBhZ2luZygpID09IC0xKQotCXJldHVybiBmYWxzZTsKLSAgICBDbG9zZVBhZ2luZygpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkICogUE1BUEkgSW5pdERQTUkodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBJbml0RE9TNEdXCi0qIFBhcmFtZXRlcnM6ICAgYmFzZUFkZHIgICAgLSBCYXNlIGFkZHJlc3Mgb2YgZnJhbWVidWZmZXIgYmFuayB3aW5kb3cKLSogICAgICAgICAgICAgICBiYW5rU2l6ZSAgICAtIFBoeXNpY2FsIHNpemUgb2YgYmFua3MgaW4gS2IgKDQgb3IgNjQpCi0qICAgICAgICAgICAgICAgY29kZUxlbiAgICAgLSBMZW5ndGggb2YgMzIgYml0IGJhbmsgc3dpdGNoIGZ1bmN0aW9uCi0qICAgICAgICAgICAgICAgYmFua0Z1bmMgICAgLSBQb2ludGVyIHRvIHByb3RlY3RlZCBtb2RlIGJhbmsgZnVuY3Rpb24KLSogUmV0dXJuczogICAgICBOZWFyIHBvaW50ZXIgdG8gdmlydHVhbCBmcmFtZWJ1ZmZlciwgb3IgTlVMTCBvbiBmYWlsdXJlLgotKgotKiBEZXNjcmlwdGlvbjogIEluc3RhbGxzIHRoZSB2aXJ0dWFsIGxpbmVhciBmcmFtZWJ1ZmZlciBoYW5kbGluZyBmb3IKLSogICAgICAgICAgICAgICBEUE1JIGVudmlyb25tZW50cy4gVGhpcyByZXF1aXJlcyB0aGUgRFZBLjM4NiBvciBWRkxBVEQuMzg2Ci0qICAgICAgICAgICAgICAgdmlydHVhbCBkZXZpY2UgZHJpdmVycyB0byBiZSBpbnN0YWxsZWQgYW5kIGZ1bmN0aW9uaW5nLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICAodm9pZCliYXNlQWRkcjsKLSAgICAodm9pZCliYW5rU2l6ZTsKLSAgICAodm9pZCljb2RlTGVuOwotICAgICh2b2lkKWJhbmtGdW5jOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkICogUE1BUEkgSW5pdERPUzRHVyh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIEluaXRET1M0R1cKLSogUGFyYW1ldGVyczogICBiYXNlQWRkciAgICAtIEJhc2UgYWRkcmVzcyBvZiBmcmFtZWJ1ZmZlciBiYW5rIHdpbmRvdwotKiAgICAgICAgICAgICAgIGJhbmtTaXplICAgIC0gUGh5c2ljYWwgc2l6ZSBvZiBiYW5rcyBpbiBLYiAoNCBvciA2NCkKLSogICAgICAgICAgICAgICBjb2RlTGVuICAgICAtIExlbmd0aCBvZiAzMiBiaXQgYmFuayBzd2l0Y2ggZnVuY3Rpb24KLSogICAgICAgICAgICAgICBiYW5rRnVuYyAgICAtIFBvaW50ZXIgdG8gcHJvdGVjdGVkIG1vZGUgYmFuayBmdW5jdGlvbgotKiBSZXR1cm5zOiAgICAgIE5lYXIgcG9pbnRlciB0byB2aXJ0dWFsIGZyYW1lYnVmZmVyLCBvciBOVUxMIG9uIGZhaWx1cmUuCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5zdGFsbHMgdGhlIHZpcnR1YWwgbGluZWFyIGZyYW1lYnVmZmVyIGhhbmRsaW5nIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBET1M0R1cgZXh0ZW5kZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIGludCAgICAgaTsKLQotICAgIGlmIChJbml0UGFnaW5nKCkgPT0gLTEpCi0JcmV0dXJuIE5VTEw7ICAgICAgICAgICAgLyogQ2Fubm90IGRvIGhhcmR3YXJlIHBhZ2luZyEgICAgICAgKi8KLQotICAgIC8qIE1hcCA0TUIgb2YgdmlkZW8gbWVtb3J5IGludG8gbGluZWFyIGFkZHJlc3Mgc3BhY2UgKHJlYWQvd3JpdGUpICovCi0gICAgaWYgKGJhbmtTaXplID09IDY0KSB7Ci0JZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKLQkgICAgTWFwUGh5c2ljYWwyTGluZWFyKGJhc2VBZGRyLFZGTEFUX1NUQVJUX0FERFIrKGk8PDE2KSwxNiwKLQkJUEFHRV9XUklURSB8IFBBR0VfTk9UUFJFU0VOVCk7Ci0JICAgIH0KLQl9Ci0gICAgZWxzZSB7Ci0JZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykgewotCSAgICBNYXBQaHlzaWNhbDJMaW5lYXIoYmFzZUFkZHIsVkZMQVRfU1RBUlRfQUREUisoaTw8MTIpLDEsCi0JCVBBR0VfV1JJVEUgfCBQQUdFX05PVFBSRVNFTlQpOwotCSAgICB9Ci0JfQotCi0gICAgLyogSW5zdGFsbCBvdXIgcGFnZSBmYXVsdCBoYW5kbGVyIGFuZCBiYW5rcyBzd2l0Y2ggZnVuY3Rpb24gKi8KLSAgICBJbnN0YWxsRmF1bHRIYW5kbGVyKGJhc2VBZGRyLGJhbmtTaXplKTsKLSAgICBJbnN0YWxsQmFua0Z1bmMoY29kZUxlbixiYW5rRnVuYyk7Ci0gICAgaW5zdGFsbGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gKHZvaWQqKVZGTEFUX1NUQVJUX0FERFI7Ci19Ci0KLXZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkZfaW5pdAotKiBQYXJhbWV0ZXJzOiAgIGJhc2VBZGRyICAgIC0gQmFzZSBhZGRyZXNzIG9mIGZyYW1lYnVmZmVyIGJhbmsgd2luZG93Ci0qICAgICAgICAgICAgICAgYmFua1NpemUgICAgLSBQaHlzaWNhbCBzaXplIG9mIGJhbmtzIGluIEtiICg0IG9yIDY0KQotKiAgICAgICAgICAgICAgIGNvZGVMZW4gICAgIC0gTGVuZ3RoIG9mIDMyIGJpdCBiYW5rIHN3aXRjaCBmdW5jdGlvbgotKiAgICAgICAgICAgICAgIGJhbmtGdW5jICAgIC0gUG9pbnRlciB0byBwcm90ZWN0ZWQgbW9kZSBiYW5rIGZ1bmN0aW9uCi0qIFJldHVybnM6ICAgICAgTmVhciBwb2ludGVyIHRvIHZpcnR1YWwgZnJhbWVidWZmZXIsIG9yIE5VTEwgb24gZmFpbHVyZS4KLSoKLSogRGVzY3JpcHRpb246ICBJbnN0YWxscyB0aGUgdmlydHVhbCBsaW5lYXIgZnJhbWVidWZmZXIgaGFuZGxpbmcuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIGlmIChpbnN0YWxsZWQpCi0JcmV0dXJuICh2b2lkKilWRkxBVF9TVEFSVF9BRERSOwotICAgIGlmIChjb2RlTGVuID4gMTAwKQotCXJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBCYW5rIGZ1bmN0aW9uIGlzIHRvbyBsYXJnZSEgICAgICAqLwotICAgIGlmICghVkZfemVyb1B0cikKLQlWRl96ZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRkZGRix0cnVlKTsKLSAgICBpZiAoQ2hlY2tEUE1JKCkpCi0JcmV0dXJuIEluaXREUE1JKGJhc2VBZGRyLGJhbmtTaXplLGNvZGVMZW4sYmFua0Z1bmMpOwotICAgIHJldHVybiBJbml0RE9TNEdXKGJhc2VBZGRyLGJhbmtTaXplLGNvZGVMZW4sYmFua0Z1bmMpOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkZfZXhpdAotKgotKiBEZXNjcmlwdGlvbjogIENsb3NlcyBkb3duIHRoZSB2aXJ0dWFsIGZyYW1lYnVmZmVyIHNlcnZpY2VzIGFuZAotKiAgICAgICAgICAgICAgIHJlc3RvcmVzIHRoZSBwcmV2aW91cyBwYWdlIGZhdWx0IGhhbmRsZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIGlmIChpbnN0YWxsZWQpIHsKLQlpZiAoaGF2ZURQTUkpIHsKLQkgICAgLyogRFBNSSBzdXBwb3J0ICovCi0JICAgIH0KLQllbHNlIHsKLQkgICAgLyogU3RhbmRhcmQgRE9TNEdXIGFuZCBQTU9ERS9XIHN1cHBvcnQgKi8KLQkgICAgUmVtb3ZlRmF1bHRIYW5kbGVyKCk7Ci0JICAgIENsb3NlUGFnaW5nKCk7Ci0JICAgIH0KLQlpbnN0YWxsZWQgPSBmYWxzZTsKLQl9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBTdXBwb3J0IG1hcHBlZCBvdXQgZm9yIG90aGVyIGNvbXBpbGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2Vsc2UKLQotaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkICogUE1BUEkgVkZfaW5pdCh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCi17Ci0gICAgKHZvaWQpYmFzZUFkZHI7Ci0gICAgKHZvaWQpYmFua1NpemU7Ci0gICAgKHZvaWQpY29kZUxlbjsKLSAgICAodm9pZCliYW5rRnVuYzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCi17Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3p0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2FiMTZjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy96dGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBNU0RPUwotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdWNoYXIgKiBfVkFSQVBJIF9aVGltZXJCSU9TUHRyOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBFeHRlcm5hbCBhc3NlbWJsZXIgZnVuY3Rpb25zICovCi0KLXZvaWQgICAgX0FTTUFQSSBMWl90aW1lck9uKHZvaWQpOwotdWxvbmcgICBfQVNNQVBJIExaX3RpbWVyTGFwKHZvaWQpOwotdm9pZCAgICBfQVNNQVBJIExaX3RpbWVyT2ZmKHZvaWQpOwotdWxvbmcgICBfQVNNQVBJIExaX3RpbWVyQ291bnQodm9pZCk7Ci12b2lkICAgIF9BU01BUEkgTFpfZGlzYWJsZSh2b2lkKTsKLXZvaWQgICAgX0FTTUFQSSBMWl9lbmFibGUodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfX1pUaW1lckluaXQodm9pZCkKLXsKLSAgICBfWlRpbWVyQklPU1B0ciA9IFBNX2dldEJJT1NQb2ludGVyKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lck9uKHRtKSAgICAgTFpfdGltZXJPbigpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lckxhcCh0bSkgICAgICAgIExaX3RpbWVyTGFwKCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyT2ZmKHRtKSAgICAgICAgTFpfdGltZXJPZmYoKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJDb3VudCh0bSkgIExaX3RpbWVyQ291bnQoKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAgICAgNTQ5MjUKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBMb25nIFBlcmlvZCB0aW1lciB2YWx1ZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKLXsKLSAgICB1bG9uZyAgIHRpY2tzOwotICAgIExaX2Rpc2FibGUoKTsgICAgICAgICAgICAvKiBUdXJuIG9mIGludGVycnVwdHMgICAgICAgICAgICAgICAqLwotICAgIHRpY2tzID0gUE1fZ2V0TG9uZyhfWlRpbWVyQklPU1B0cisweDZDKTsKLSAgICBMWl9lbmFibGUoKTsgICAgICAgICAgICAgLyogVHVybiBvbiBpbnRlcnJ1cHRzIGFnYWluICAgICAgICAgKi8KLSAgICByZXR1cm4gdGlja3M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQotd2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCi1hY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCi1wYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfX1VMWkVsYXBzZWRUaW1lKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCkKLXsKLSAgICBpZiAoZmluaXNoIDwgc3RhcnQpCi0JZmluaXNoICs9IDE1NzMwNDBMOyAgICAgICAgIC8qIE51bWJlciBvZiB0aWNrcyBpbiAyNCBob3VycyAgICAgICovCi0gICAgcmV0dXJuIGZpbmlzaCAtIHN0YXJ0OwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2V2ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZjQ1ODYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDExMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgTWFpbiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFNjaVRlY2ggY3Jvc3MgcGxhdGZvcm0gZXZlbnQKLSogICAgICAgICAgICAgICBsaWJyYXJ5LiBUaGlzIG1vZHVsZSBjb250YWlucyBhbGwgdGhlIGdlbmVyaWMgY3Jvc3MgcGxhdGZvcm0KLSogICAgICAgICAgICAgICBjb2RlLCBhbmQgcHVsbHMgaW4gbW9kdWxlcyBzcGVjaWZpYyB0byBlYWNoIHRhcmdldCBPUwotKiAgICAgICAgICAgICAgIGVudmlyb25tZW50LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImV2ZW50LmgiCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJvc2hkci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIEVWRU5UUVNJWkUgICAgICAxMDAgICAgIC8qIE51bWJlciBvZiBldmVudHMgaW4gZXZlbnQgcXVldWUgICAgICAqLwotI2RlZmluZSBKT1lfTlVNX0FYRVMgICAgNCAgICAgICAvKiBOdW1iZXIgb2Ygam95c3RpY2sgYXhlcyBzdXBwb3J0ZWQgICAgKi8KLQotc3RhdGljIHN0cnVjdCB7Ci0gICAgaW50ICAgICAgICAgbXgsbXk7ICAgICAgICAgICAgICAvKiBDdXJyZW50IG1vdXNlIHBvc2l0aW9uICAgICAgICAgICAqLwotICAgIGludCAgICAgICAgIGhlYWQ7ICAgICAgICAgICAgICAgLyogSGVhZCBvZiBldmVudCBxdWV1ZSAgICAgICAgICAgICAgKi8KLSAgICBpbnQgICAgICAgICB0YWlsOyAgICAgICAgICAgICAgIC8qIFRhaWwgb2YgZXZlbnQgcXVldWUgICAgICAgICAgICAgICovCi0gICAgaW50ICAgICAgICAgZnJlZUhlYWQ7ICAgICAgICAgICAvKiBIZWFkIG9mIGZyZWUgbGlzdCAgICAgICAgICAgICAgICAqLwotICAgIGludCAgICAgICAgIGNvdW50OyAgICAgICAgICAgICAgLyogTm8uIG9mIGl0ZW1zIGN1cnJlbnRseSBpbiBxdWV1ZSAgKi8KLSAgICBldmVudF90ICAgICBldnRxW0VWRU5UUVNJWkVdOyAgIC8qIFRoZSBxdWV1ZSBzdHJ1Y3R1cmUgaXRzZWxmICAgICAgICovCi0gICAgaW50ICAgICAgICAgb2xkTW92ZTsgICAgICAgICAgICAvKiBQcmV2aW91cyBtb3ZlbWVudCBldmVudCAgICAgICAgICAqLwotICAgIGludCAgICAgICAgIG9sZEtleTsgICAgICAgICAgICAgLyogUHJldmlvdXMga2V5IHJlcGVhdCBldmVudCAgICAgICAgKi8KLSAgICBpbnQgICAgICAgICBvbGRKb3lNb3ZlOyAgICAgICAgIC8qIFByZXZpb3VzIGpveXN0aWNrIG1vdmVtZW50IGV2ZW50ICovCi0gICAgaW50ICAgICAgICAgam95TWFzazsgICAgICAgICAgICAvKiBNYXNrIG9mIGpveXN0aWNrIGF4ZXMgcHJlc2VudCAgICAqLwotICAgIGludCAgICAgICAgIGpveU1pbltKT1lfTlVNX0FYRVNdOwotICAgIGludCAgICAgICAgIGpveUNlbnRlcltKT1lfTlVNX0FYRVNdOwotICAgIGludCAgICAgICAgIGpveU1heFtKT1lfTlVNX0FYRVNdOwotICAgIGludCAgICAgICAgIGpveVByZXZbSk9ZX05VTV9BWEVTXTsKLSAgICBpbnQgICAgICAgICBqb3lCdXRTdGF0ZTsKLSAgICB1bG9uZyAgICAgICBkb3VibGVDbGljazsKLSAgICB1bG9uZyAgICAgICBhdXRvUmVwZWF0OwotICAgIHVsb25nICAgICAgIGF1dG9EZWxheTsKLSAgICB1bG9uZyAgICAgICBhdXRvVGlja3M7Ci0gICAgdWxvbmcgICAgICAgZG91YmxlQ2xpY2tUaHJlc2g7Ci0gICAgdWxvbmcgICAgICAgZmlyc3RBdXRvOwotICAgIGludCAgICAgICAgIGF1dG9Nb3VzZV94OwotICAgIGludCAgICAgICAgIGF1dG9Nb3VzZV95OwotICAgIGV2ZW50X3QgICAgIGRvd25Nb3VzZTsKLSAgICB1bG9uZyAgICAgICBrZXlNb2RpZmllcnM7ICAgICAgIC8qIEN1cnJlbnQga2V5Ym9hcmQgbW9kaWZpZXJzICAgICAgICovCi0gICAgdWNoYXIgICAgICAga2V5VGFibGVbMTI4XTsgICAgICAvKiBUYWJsZSBvZiBrZXkgdXAvZG93biBmbGFncyAgICAgICAqLwotICAgIGlib29sICAgICAgIGFsbG93TEVEUzsgICAgICAgICAgLyogVHJ1ZSBpZiBMRURTIHNob3VsZCBjaGFuZ2UgICAgICAgKi8KLSAgICBfRVZUX3VzZXJFdmVudEZpbHRlciAgICB1c2VyRXZlbnRDYWxsYmFjazsKLSAgICBfRVZUX21vdXNlTW92ZUhhbmRsZXIgICBtb3VzZU1vdmU7Ci0gICAgX0VWVF9oZWFydEJlYXRDYWxsYmFjayAgaGVhcnRCZWF0OwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpoZWFydEJlYXRQYXJhbXM7Ci0gICAgY29kZXBhZ2VfdCAgICAgICAgICAgICAgKmNvZGVQYWdlOwotICAgIH0gRVZUOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgZGVmaW5lZChfX1JFQUxET1NfXykgfHwgZGVmaW5lZChfX1NNWDMyX18pCi0vKiB7c2VjcmV0fSAqLwotdm9pZCBFVlRBUEkgX0VWVF9jQ29kZVN0YXJ0KHZvaWQpIHt9Ci0jZW5kaWYKLQotLyogRXh0ZXJuYWwgYXNzZW1ibGVyIGZ1bmN0aW9ucyAqLwotCi1pbnQgRVZUQVBJIF9FVlRfcmVhZEpveUF4aXMoaW50IG1hc2ssaW50ICpheGlzKTsKLWludCBFVlRBUEkgX0VWVF9yZWFkSm95QnV0dG9ucyh2b2lkKTsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotCi11bG9uZyBfRVZUX2dldFRpY2tzKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWV2dCAtIEV2ZW50IHRvIGFkZCB0byB0aGUgZXZlbnQgcXVldWUKLQotUkVNQVJLUzoKLUFkZHMgYW4gZXZlbnQgdG8gdGhlIGV2ZW50IHF1ZXVlIGJ5IHRhY2tpbmcgaXQgb250byB0aGUgdGFpbCBvZiB0aGUgZXZlbnQKLXF1ZXVlLiBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IGF0IGxlYXN0IG9uZSBzcG90IGlzIGF2YWlsYWJsZSBvbiB0aGUKLWZyZWVMaXN0IGZvciB0aGUgZXZlbnQgdG8gYmUgaW5zZXJ0ZWQuCi0KLU5PVEU6ICAgSW50ZXJydXB0cyBNVVNUIGJlIE9GRiB3aGlsZSB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGVuc3VyZSB3ZSBoYXZlCi0JbXV0dWFsbHkgZXhjbHVzaXZlIGFjY2VzcyB0byBvdXIgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvcgotCWludGVycnVwdCBkcml2ZW4gc3lzdGVtcyAobGlrZSB1bmRlciBET1MpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFkZEV2ZW50KAotICAgIGV2ZW50X3QgKmV2dCkKLXsKLSAgICBpbnQgZXZ0SUQ7Ci0KLSAgICAvKiBDaGVjayBmb3IgbW91c2UgZG91YmxlIGNsaWNrIGV2ZW50cyAqLwotICAgIGlmIChldnQtPndoYXQgJiBFVlRfTU9VU0VFVlQpIHsKLQlFVlQuYXV0b01vdXNlX3ggPSBldnQtPndoZXJlX3g7Ci0JRVZULmF1dG9Nb3VzZV95ID0gZXZ0LT53aGVyZV95OwotCWlmICgoZXZ0LT53aGF0ICYgRVZUX01PVVNFRE9XTikgJiYgIShldnQtPm1lc3NhZ2UgJiBFVlRfREJMQ0xJQ0spKSB7Ci0JICAgIC8qIERldGVybWluZSBpZiB0aGUgbGFzdCBtb3VzZSBldmVudCB3YXMgYSBkb3VibGUgY2xpY2sgZXZlbnQgKi8KLQkgICAgdWludCBkaWZmX3ggPSBBQlMoZXZ0LT53aGVyZV94IC0gRVZULmRvd25Nb3VzZS53aGVyZV94KTsKLQkgICAgdWludCBkaWZmX3kgPSBBQlMoZXZ0LT53aGVyZV95IC0gRVZULmRvd25Nb3VzZS53aGVyZV95KTsKLQkgICAgaWYgKChldnQtPm1lc3NhZ2UgPT0gRVZULmRvd25Nb3VzZS5tZXNzYWdlKQotCQkmJiAoKGV2dC0+d2hlbiAtIEVWVC5kb3duTW91c2Uud2hlbikgPD0gRVZULmRvdWJsZUNsaWNrKQotCQkmJiAoZGlmZl94IDw9IEVWVC5kb3VibGVDbGlja1RocmVzaCkKLQkJJiYgKGRpZmZfeSA8PSBFVlQuZG91YmxlQ2xpY2tUaHJlc2gpKSB7Ci0JCWV2dC0+bWVzc2FnZSB8PSBFVlRfREJMQ0xJQ0s7Ci0JCUVWVC5kb3duTW91c2UgPSAqZXZ0OwotCQlFVlQuZG93bk1vdXNlLndoZW4gPSAwOwotCQl9Ci0JICAgIGVsc2UKLQkJRVZULmRvd25Nb3VzZSA9ICpldnQ7Ci0JICAgIEVWVC5hdXRvVGlja3MgPSBfRVZUX2dldFRpY2tzKCk7Ci0JICAgIH0KLQllbHNlIGlmIChldnQtPndoYXQgJiBFVlRfTU9VU0VVUCkgewotCSAgICBFVlQuZG93bk1vdXNlLndoYXQgPSBFVlRfTlVMTEVWVDsKLQkgICAgRVZULmZpcnN0QXV0byA9IHRydWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAvKiBDYWxsIHVzZXIgc3VwcGxpZWQgY2FsbGJhY2sgdG8gbW9kaWZ5IHRoZSBldmVudCBpZiBkZXNpcmVkICovCi0gICAgaWYgKEVWVC51c2VyRXZlbnRDYWxsYmFjaykgewotCWlmICghRVZULnVzZXJFdmVudENhbGxiYWNrKGV2dCkpCi0JICAgIHJldHVybjsKLQl9Ci0KLSAgICAvKiBHZXQgc3BvdCB0byBwbGFjZSB0aGUgZXZlbnQgZnJvbSB0aGUgZnJlZSBsaXN0ICovCi0gICAgZXZ0SUQgPSBFVlQuZnJlZUhlYWQ7Ci0gICAgRVZULmZyZWVIZWFkID0gRVZULmV2dHFbRVZULmZyZWVIZWFkXS5uZXh0OwotCi0gICAgLyogQWRkIHRvIHRoZSBFVlQudGFpbCBvZiB0aGUgZXZlbnQgcXVldWUgICAqLwotICAgIGV2dC0+bmV4dCA9IC0xOwotICAgIGV2dC0+cHJldiA9IEVWVC50YWlsOwotICAgIGlmIChFVlQudGFpbCAhPSAtMSkKLQlFVlQuZXZ0cVtFVlQudGFpbF0ubmV4dCA9IGV2dElEOwotICAgIGVsc2UKLQlFVlQuaGVhZCA9IGV2dElEOwotICAgIEVWVC50YWlsID0gZXZ0SUQ7Ci0gICAgRVZULmV2dHFbZXZ0SURdID0gKmV2dDsKLSAgICBFVlQuY291bnQrKzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbnRlcm5hbCBmdW5jdGlvbiB0byBpbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSB0byB0aGUgZW1wdHkgc3RhdGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaW5pdEV2ZW50UXVldWUodm9pZCkKLXsKLSAgICBpbnQgaTsKLQotICAgIC8qIEJ1aWxkIGZyZWUgbGlzdCwgYW5kIGluaXRpYWxpemUgZ2xvYmFsIGRhdGEgc3RydWN0dXJlcyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBFVkVOVFFTSVpFOyBpKyspCi0JRVZULmV2dHFbaV0ubmV4dCA9IGkrMTsKLSAgICBFVlQuZXZ0cVtFVkVOVFFTSVpFLTFdLm5leHQgPSAtMTsgICAgICAgLyogVGVybWluYXRlIGxpc3QgICAgICAgICAgICovCi0gICAgRVZULmNvdW50ID0gRVZULmZyZWVIZWFkID0gMDsKLSAgICBFVlQuaGVhZCA9IEVWVC50YWlsID0gLTE7Ci0gICAgRVZULm9sZE1vdmUgPSAtMTsKLSAgICBFVlQub2xkS2V5ID0gLTE7Ci0gICAgRVZULm9sZEpveU1vdmUgPSAtMTsKLSAgICBFVlQuam95QnV0U3RhdGUgPSAwOwotICAgIEVWVC5teCA9IEVWVC5teSA9IDA7Ci0gICAgRVZULmtleU1vZGlmaWVycyA9IDA7Ci0gICAgRVZULmFsbG93TEVEUyA9IHRydWU7Ci0KLSAgICAvKiBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG1vdXNlIGRvdWJsZSBjbGljayBhbmQgbW91c2UgYXV0byBldmVudHMgKi8KLSAgICBFVlQuZG91YmxlQ2xpY2sgPSA0NDA7Ci0gICAgRVZULmF1dG9SZXBlYXQgPSA1NTsKLSAgICBFVlQuYXV0b0RlbGF5ID0gMzMwOwotICAgIEVWVC5hdXRvVGlja3MgPSAwOwotICAgIEVWVC5kb3VibGVDbGlja1RocmVzaCA9IDU7Ci0gICAgRVZULmZpcnN0QXV0byA9IHRydWU7Ci0gICAgRVZULmF1dG9Nb3VzZV94ID0gRVZULmF1dG9Nb3VzZV95ID0gMDsKLSAgICBtZW1zZXQoJkVWVC5kb3duTW91c2UsMCxzaXplb2YoRVZULmRvd25Nb3VzZSkpOwotCi0gICAgLyogU2V0dXAgZGVmYXVsdCBwb2ludGVycyBmb3IgZXZlbnQgbGlicmFyeSAqLwotICAgIEVWVC51c2VyRXZlbnRDYWxsYmFjayA9IE5VTEw7Ci0gICAgRVZULmNvZGVQYWdlID0gJl9DUF9VU19FbmdsaXNoOwotCi0gICAgLyogSW5pdGlhbGlzZSB0aGUgam95c3RpY2sgbW9kdWxlIGFuZCBkbyBiYXNpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwotICAgICAqIHRoZSBqb3lzdGljayBpcyBjZW50ZXJlZC4KLSAgICAgKi8KLSAgICBFVlQuam95TWFzayA9IEVWVF9qb3lJc1ByZXNlbnQoKTsKLX0KLQotI2lmIGRlZmluZWQoTkVFRF9TQ0FMRV9KT1lfQVhJUykgfHwgIWRlZmluZWQoVVNFX09TX0pPWVNUSUNLKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHNjYWxlcyBhIGpveXN0aWNrIGF4aXMgdmFsdWUgdG8gbm9ybWFsaXNlZCBmb3JtLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgc2NhbGVKb3lBeGlzKAotICAgIGludCByYXcsCi0gICAgaW50IGF4aXMpCi17Ci0gICAgaW50IHNjYWxlZCxyYW5nZTsKLQotICAgIC8qIE1ha2Ugc3VyZSB0aGUgam95c3RpY2sgaXMgY2FsaWJyYXRlZCBwcm9wZXJseSAqLwotICAgIGlmIChFVlQuam95Q2VudGVyW2F4aXNdIC0gRVZULmpveU1pbltheGlzXSA8IDUpCi0JcmV0dXJuIHJhdzsKLSAgICBpZiAoRVZULmpveU1heFtheGlzXSAtIEVWVC5qb3lDZW50ZXJbYXhpc10gPCA1KQotCXJldHVybiByYXc7Ci0KLSAgICAvKiBOb3cgc2NhbGUgdGhlIGNvb3JkaW5hdGVzIHRvIC0xMjggdG8gMTI3ICovCi0gICAgcmF3IC09IEVWVC5qb3lDZW50ZXJbYXhpc107Ci0gICAgaWYgKHJhdyA8IDApCi0JcmFuZ2UgPSBFVlQuam95Q2VudGVyW2F4aXNdLUVWVC5qb3lNaW5bYXhpc107Ci0gICAgZWxzZQotCXJhbmdlID0gRVZULmpveU1heFtheGlzXS1FVlQuam95Q2VudGVyW2F4aXNdOwotICAgIHNjYWxlZCA9IChyYXcgKiAxMjgpIC8gcmFuZ2U7Ci0gICAgaWYgKHNjYWxlZCA8IC0xMjgpCi0Jc2NhbGVkID0gLTEyODsKLSAgICBpZiAoc2NhbGVkID4gMTI3KQotCXNjYWxlZCA9IDEyNzsKLSAgICByZXR1cm4gc2NhbGVkOwotfQotI2VuZGlmCi0KLSNpZiAgICAgZGVmaW5lZChfX1NNWDMyX18pCi0jaW5jbHVkZSAic214L2V2ZW50LmMiCi0jZWxpZiAgIGRlZmluZWQoX19SVFRBUkdFVF9fKQotI2luY2x1ZGUgInJ0dGFyZ2V0L2V2ZW50LmMiCi0jZWxpZiAgIGRlZmluZWQoX19SRUFMRE9TX18pCi0jaW5jbHVkZSAiZG9zL2V2ZW50LmMiCi0jZWxpZiAgIGRlZmluZWQoX19XSU5ET1dTMzJfXykKLSNpbmNsdWRlICJ3aW4zMi9ldmVudC5jIgotI2VsaWYgICBkZWZpbmVkKF9fT1MyX18pCi0jaWYgICAgIGRlZmluZWQoX19PUzJfUE1fXykKLSNpbmNsdWRlICJvczJwbS9ldmVudC5jIgotI2Vsc2UKLSNpbmNsdWRlICJvczIvZXZlbnQuYyIKLSNlbmRpZgotI2VsaWYgICBkZWZpbmVkKF9fTElOVVhfXykKLSNpZiAgICAgZGVmaW5lZChfX1VTRV9YMTFfXykKLSNpbmNsdWRlICJ4MTEvZXZlbnQuYyIKLSNlbHNlCi0jaW5jbHVkZSAibGludXgvZXZlbnQuYyIKLSNlbmRpZgotI2VsaWYgICBkZWZpbmVkKF9fUU5YX18pCi0jaWYgICAgIGRlZmluZWQoX19VU0VfUEhPVE9OX18pCi0jaW5jbHVkZSAicGhvdG9uL2V2ZW50LmMiCi0jZWxpZiAgIGRlZmluZWQoX19VU0VfWDExX18pCi0jaW5jbHVkZSAieDExL2V2ZW50LmMiCi0jZWxzZQotI2luY2x1ZGUgInFueC9ldmVudC5jIgotI2VuZGlmCi0jZWxpZiAgIGRlZmluZWQoX19CRU9TX18pCi0jaW5jbHVkZSAiYmVvcy9ldmVudC5jIgotI2Vsc2UKLSNlcnJvciAgRXZlbnQgbGlicmFyeSBub3QgcG9ydGVkIHRvIHRoaXMgcGxhdGZvcm0geWV0IQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBpbnRlcmZhY2Ugcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIElmIFVTRV9PU19KT1lTVElDSyBpcyBkZWZpbmVkLCB0aGUgT1Mgc3BlY2lmaWMgbGlicmFyaWVzIHdpbGwgaW1wbGVtZW50Ci0gKiB0aGUgam95c3RpY2sgY29kZSByYXRoZXIgdGhhbiB1c2luZyB0aGUgZ2VuZXJpYyBPUyBwb3J0YWJsZSB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgVVNFX09TX0pPWVNUSUNLCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBtYXNrIGluZGljYXRpbmcgd2hhdCBqb3lzdGljayBheGVzIGFyZSBhdHRhY2hlZC4KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGRldGVjdCB0aGUgYXR0YWNoZWQgam95c3RpY2tzLCBhbmQgZGV0ZXJtaW5lCi13aGF0IGF4ZXMgYXJlIHByZXNlbnQgYW5kIGZ1bmN0aW9uaW5nLiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmUtZGV0ZWN0IGFueQotYXR0YWNoZWQgam95c3RpY2tzIHdoZW4gaXQgaXMgY2FsbGVkLCBzbyBpZiB0aGUgdXNlciBmb3Jnb3QgdG8gYXR0YWNoCi10aGUgam95c3RpY2sgd2hlbiB0aGUgYXBwbGljYXRpb24gc3RhcnRlZCwgeW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gdG8KLXJlLWRldGVjdCBhbnkgbmV3bHkgYXR0YWNoZWQgam95c3RpY2tzLgotCi1TRUUgQUxTTzoKLUVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95U2V0Q2VudGVyLCBFVlRfam95SXNQcmVzZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IEVWVEFQSSBFVlRfam95SXNQcmVzZW50KHZvaWQpCi17Ci0gICAgaW50IG1hc2ssaTsKLQotICAgIG1lbXNldChFVlQuam95TWluLDAsc2l6ZW9mKEVWVC5qb3lNaW4pKTsKLSAgICBtZW1zZXQoRVZULmpveUNlbnRlciwwLHNpemVvZihFVlQuam95Q2VudGVyKSk7Ci0gICAgbWVtc2V0KEVWVC5qb3lNYXgsMCxzaXplb2YoRVZULmpveU1heCkpOwotICAgIG1lbXNldChFVlQuam95UHJldiwwLHNpemVvZihFVlQuam95UHJldikpOwotICAgIEVWVC5qb3lCdXRTdGF0ZSA9IDA7Ci0jaWZkZWYgX19MSU5VWF9fCi0gICAgUE1faW5pdCgpOwotI2VuZGlmCi0gICAgbWFzayA9IF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95Q2VudGVyKTsKLSAgICBpZiAobWFzaykgewotCWZvciAoaSA9IDA7IGkgPCBKT1lfTlVNX0FYRVM7IGkrKykKLQkgICAgRVZULmpveU1heFtpXSA9IEVWVC5qb3lDZW50ZXJbaV0qMjsKLQl9Ci0gICAgcmV0dXJuIG1hc2s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVBvbGxzIHRoZSBqb3lzdGljayBmb3IgcG9zaXRpb24gYW5kIGJ1dHRvbiBpbmZvcm1hdGlvbi4KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gcG9sbCBhbmFsb2d1ZSBqb3lzdGlja3MgZm9yIGJ1dHRvbiBhbmQgcG9zaXRpb24KLWluZm9ybWF0aW9uLiBJdCBzaG91bGQgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggbWFpbiBsb29wIG9mIHRoZSB1c2VyCi1hcHBsaWNhdGlvbiwganVzdCBiZWZvcmUgcHJvY2Vzc2luZyBhbGwgcGVuZGluZyBldmVudHMgdmlhIEVWVF9nZXROZXh0LgotQWxsIGluZm9ybWF0aW9uIHBvbGxlZCBmcm9tIHRoZSBqb3lzdGljayB3aWxsIGJlIHBvc3RlZCB0byB0aGUgZXZlbnQKLXF1ZXVlIGZvciBsYXRlciByZXRyaWV2YWwuCi0KLU5vdGU6ICAgTW9zdCBhbmFsb2d1ZSBqb3lzdGlja3Mgd2lsbCBwcm92aWRlIHJlYWRpbmdzIHRoYXQgY2hhbmdlIGV2ZW4KLQl0aG91Z2ggdGhlIGpveXN0aWNrIGhhcyBub3QgbW92ZWQuIEhlbmNlIGlmIHlvdSBjYWxsIHRoaXMgcm91dGluZQotCXlvdSB3aWxsIGxpa2VseSBnZXQgYW4gRVZUX0pPWU1PVkUgZXZlbnQgZXZlcnkgdGltZSB0aHJvdWdoIHlvdXIKLQlldmVudCBsb29wLgotCi1TRUUgQUxTTzoKLUVWVF9nZXROZXh0LCBFVlRfcGVla05leHQsIEVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LAotRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9wb2xsSm95c3RpY2sodm9pZCkKLXsKLSAgICBldmVudF90IGV2dDsKLSAgICBpbnQgICAgIGksYXhpc1tKT1lfTlVNX0FYRVNdLG5ld0J1dFN0YXRlLG1hc2ssbW92ZWQscHM7Ci0KLSAgICBpZiAoRVZULmpveU1hc2spIHsKLQkvKiBSZWFkIGpveXN0aWNrIGF4ZXMgYW5kIHBvc3QgbW92ZW1lbnQgZXZlbnRzIGlmIHRoZXkgaGF2ZQotCSAqIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBwb2xsZWQuIFVudGlsIHRoZSBldmVudHMgYXJlCi0JICogYWN0dWFsbHkgZmx1c2hlZCwgd2Uga2VlcCBtb2RpZnlpbmcgdGhlIHNhbWUgam95c3RpY2sgbW92ZW1lbnQKLQkgKiBldmVudCwgc28geW91IHdvbid0IGdldCBtdWx0aXBsZSBtb3ZlbWVudCBldmVudAotCSAqLwotCW1hc2sgPSBfRVZUX3JlYWRKb3lBeGlzKEVWVC5qb3lNYXNrLGF4aXMpOwotCW5ld0J1dFN0YXRlID0gX0VWVF9yZWFkSm95QnV0dG9ucygpOwotCW1vdmVkID0gZmFsc2U7Ci0JZm9yIChpID0gMDsgaSA8IEpPWV9OVU1fQVhFUzsgaSsrKSB7Ci0JICAgIGlmIChtYXNrICYgKEVWVF9KT1lfQVhJU19YMSA8PCBpKSkKLQkJYXhpc1tpXSA9IHNjYWxlSm95QXhpcyhheGlzW2ldLGkpOwotCSAgICBlbHNlCi0JCWF4aXNbaV0gPSBFVlQuam95UHJldltpXTsKLQkgICAgaWYgKGF4aXNbaV0gIT0gRVZULmpveVByZXZbaV0pCi0JCW1vdmVkID0gdHJ1ZTsKLQkgICAgfQotCWlmIChtb3ZlZCkgewotCSAgICBtZW1jcHkoRVZULmpveVByZXYsYXhpcyxzaXplb2YoRVZULmpveVByZXYpKTsKLQkgICAgcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsKLQkgICAgaWYgKEVWVC5vbGRKb3lNb3ZlICE9IC0xKSB7Ci0JCS8qIE1vZGlmeSB0aGUgZXhpc3Rpbmcgam95c3RpY2sgbW92ZW1lbnQgZXZlbnQgKi8KLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLm1lc3NhZ2UgPSBuZXdCdXRTdGF0ZTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLndoZXJlX3ggPSBFVlQuam95UHJldlswXTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLndoZXJlX3kgPSBFVlQuam95UHJldlsxXTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLnJlbGF0aXZlX3ggPSBFVlQuam95UHJldlsyXTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLnJlbGF0aXZlX3kgPSBFVlQuam95UHJldlszXTsKLQkJfQotCSAgICBlbHNlIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0JCS8qIEFkZCBhIG5ldyBqb3lzdGljayBtb3ZlbWVudCBldmVudCAqLwotCQlFVlQub2xkSm95TW92ZSA9IEVWVC5mcmVlSGVhZDsKLQkJbWVtc2V0KCZldnQsMCxzaXplb2YoZXZ0KSk7Ci0JCWV2dC53aGF0ID0gRVZUX0pPWU1PVkU7Ci0JCWV2dC5tZXNzYWdlID0gRVZULmpveUJ1dFN0YXRlOwotCQlldnQud2hlcmVfeCA9IEVWVC5qb3lQcmV2WzBdOwotCQlldnQud2hlcmVfeSA9IEVWVC5qb3lQcmV2WzFdOwotCQlldnQucmVsYXRpdmVfeCA9IEVWVC5qb3lQcmV2WzJdOwotCQlldnQucmVsYXRpdmVfeSA9IEVWVC5qb3lQcmV2WzNdOwotCQlhZGRFdmVudCgmZXZ0KTsKLQkJfQotCSAgICBfRVZUX3Jlc3RvcmVJbnQocHMpOwotCSAgICB9Ci0KLQkvKiBSZWFkIHRoZSBqb3lzdGljayBidXR0b25zLCBhbmQgcG9zdCBldmVudHMgdG8gcmVmbGVjdCB0aGUgY2hhbmdlCi0JICogaW4gc3RhdGUgZm9yIHRoZSBqb3lzdGljayBidXR0b25zLgotCSAqLwotCWlmIChuZXdCdXRTdGF0ZSAhPSBFVlQuam95QnV0U3RhdGUpIHsKLQkgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKLQkJLyogQWRkIGEgbmV3IGpveXN0aWNrIGNsaWNrIGV2ZW50ICovCi0JCXBzID0gX0VWVF9kaXNhYmxlSW50KCk7Ci0JCW1lbXNldCgmZXZ0LDAsc2l6ZW9mKGV2dCkpOwotCQlldnQud2hhdCA9IEVWVF9KT1lDTElDSzsKLQkJZXZ0Lm1lc3NhZ2UgPSBuZXdCdXRTdGF0ZTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLndoZXJlX3ggPSBFVlQuam95UHJldlswXTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLndoZXJlX3kgPSBFVlQuam95UHJldlsxXTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLnJlbGF0aXZlX3ggPSBFVlQuam95UHJldlsyXTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLnJlbGF0aXZlX3kgPSBFVlQuam95UHJldlszXTsKLQkJYWRkRXZlbnQoJmV2dCk7Ci0JCV9FVlRfcmVzdG9yZUludChwcyk7Ci0JCX0KLQkgICAgRVZULmpveUJ1dFN0YXRlID0gbmV3QnV0U3RhdGU7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUNhbGlicmF0ZXMgdGhlIGpveXN0aWNrIHVwcGVyIGxlZnQgcG9zaXRpb24KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAotd2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwotdGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgotVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgdXBwZXIgbGVmdAotcG9zaXRpb24gYW5kIHRoZW4gaGF2ZSB0aGVtIHByZXNzIGEga2V5IG9yIGJ1dHRvbi4gYW5kIHRoZW4gY2FsbCB0aGlzCi1mdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB3aWxsIHRoZW4gcmVhZCB0aGUgam95c3RpY2sgYW5kIHVwZGF0ZSB0aGUKLWNhbGlicmF0aW9uIGZhY3RvcnMuCi0KLVVzdWFsbHksIGFzc3VtaW5nIHRoYXQgdGhlIHN0aWNrIHdhcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IHdhcwotaW5pdGlhbGl6ZWQsIHlvdSByZWFsbHkgb25seSBuZWVkIHRvIGNhbGwgRVZUX2pveVNldExvd2VyUmlnaHQgc2luY2UgdGhlCi11cHBlciBsZWZ0IHBvc2l0aW9uIGlzIHVzdWFsbHkgYWx3YXlzIDAsMCBvbiBtb3N0IGpveXN0aWNrcy4gSG93ZXZlciwgdGhlCi1zYWZlc3QgcHJvY2VkdXJlIGlzIHRvIGNhbGwgYWxsIHRocmVlIGNhbGlicmF0aW9uIGZ1bmN0aW9ucy4KLQotU0VFIEFMU086Ci1FVlRfam95U2V0VXBwZXJMZWZ0LCBFVlRfam95U2V0TG93ZXJSaWdodCwgRVZUX2pveUlzUHJlc2VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9qb3lTZXRVcHBlckxlZnQodm9pZCkKLXsKLSAgICBfRVZUX3JlYWRKb3lBeGlzKEVWVF9KT1lfQVhJU19BTEwsRVZULmpveU1pbik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUNhbGlicmF0ZXMgdGhlIGpveXN0aWNrIGxvd2VyIHJpZ2h0IHBvc2l0aW9uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gemVybyBpbiBvbiBiZXR0ZXIgam95c3RpY2sgY2FsaWJyYXRpb24gZmFjdG9ycywKLXdoaWNoIG1heSB3b3JrIGJldHRlciB0aGFuIHRoZSBkZWZhdWx0IHNpbXBsaXN0aWMgY2FsaWJyYXRpb24gKHdoaWNoIGFzc3VtZXMKLXRoZSBqb3lzdGljayBpcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IGlzIGluaXRpYWxpc2VkKS4KLVRvIHVzZSB0aGlzIGZ1bmN0aW9uLCBhc2sgdGhlIHVzZXIgdG8gaG9sZCB0aGUgc3RpY2sgaW4gdGhlIGxvd2VyIHJpZ2h0Ci1wb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKLWZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQotY2FsaWJyYXRpb24gZmFjdG9ycy4KLQotVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCi1pbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKLXVwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKLXNhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgotCi1TRUUgQUxTTzoKLUVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRDZW50ZXIsIEVWVF9qb3lJc1ByZXNlbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfam95U2V0TG93ZXJSaWdodCh2b2lkKQotewotICAgIF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95TWF4KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgY2VudGVyIHBvc2l0aW9uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gemVybyBpbiBvbiBiZXR0ZXIgam95c3RpY2sgY2FsaWJyYXRpb24gZmFjdG9ycywKLXdoaWNoIG1heSB3b3JrIGJldHRlciB0aGFuIHRoZSBkZWZhdWx0IHNpbXBsaXN0aWMgY2FsaWJyYXRpb24gKHdoaWNoIGFzc3VtZXMKLXRoZSBqb3lzdGljayBpcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IGlzIGluaXRpYWxpc2VkKS4KLVRvIHVzZSB0aGlzIGZ1bmN0aW9uLCBhc2sgdGhlIHVzZXIgdG8gaG9sZCB0aGUgc3RpY2sgaW4gdGhlIGNlbnRlcgotcG9zaXRpb24gYW5kIHRoZW4gaGF2ZSB0aGVtIHByZXNzIGEga2V5IG9yIGJ1dHRvbi4gYW5kIHRoZW4gY2FsbCB0aGlzCi1mdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB3aWxsIHRoZW4gcmVhZCB0aGUgam95c3RpY2sgYW5kIHVwZGF0ZSB0aGUKLWNhbGlicmF0aW9uIGZhY3RvcnMuCi0KLVVzdWFsbHksIGFzc3VtaW5nIHRoYXQgdGhlIHN0aWNrIHdhcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IHdhcwotaW5pdGlhbGl6ZWQsIHlvdSByZWFsbHkgb25seSBuZWVkIHRvIGNhbGwgRVZUX2pveVNldExvd2VyUmlnaHQgc2luY2UgdGhlCi11cHBlciBsZWZ0IHBvc2l0aW9uIGlzIHVzdWFsbHkgYWx3YXlzIDAsMCBvbiBtb3N0IGpveXN0aWNrcy4gSG93ZXZlciwgdGhlCi1zYWZlc3QgcHJvY2VkdXJlIGlzIHRvIGNhbGwgYWxsIHRocmVlIGNhbGlicmF0aW9uIGZ1bmN0aW9ucy4KLQotU0VFIEFMU086Ci1FVlRfam95U2V0VXBwZXJMZWZ0LCBFVlRfam95U2V0TG93ZXJSaWdodCwgRVZUX2pveVNldENlbnRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9qb3lTZXRDZW50ZXIodm9pZCkKLXsKLSAgICBfRVZUX3JlYWRKb3lBeGlzKEVWVF9KT1lfQVhJU19BTEwsRVZULmpveUNlbnRlcik7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUG9zdHMgYSB1c2VyIGRlZmluZWQgZXZlbnQgdG8gdGhlIGV2ZW50IHF1ZXVlCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVUVVJOUzoKLVRydWUgaWYgZXZlbnQgd2FzIHBvc3RlZCwgZmFsc2UgaWYgZXZlbnQgcXVldWUgaXMgZnVsbC4KLQotUEFSQU1FVEVSUzoKLXdoYXQgICAgICAgIC0gVHlwZSBjb2RlIGZvciBtZXNzYWdlIHRvIHBvc3QKLW1lc3NhZ2UgICAgIC0gRXZlbnQgc3BlY2lmaWMgbWVzc2FnZSB0byBwb3N0Ci1tb2RpZmllcnMgICAtIEV2ZW50IHNwZWNpZmljIG1vZGlmaWVyIGZsYWdzIHRvIHBvc3QKLQotUkVNQVJLUzoKLVRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHBvc3QgdXNlciBkZWZpbmVkIGV2ZW50cyB0byB0aGUgZXZlbnQgcXVldWUuCi0KLVNFRSBBTFNPOgotRVZUX2ZsdXNoLCBFVlRfZ2V0TmV4dCwgRVZUX3BlZWtOZXh0LCBFVlRfaGFsdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIEVWVEFQSSBFVlRfcG9zdCgKLSAgICB1bG9uZyB3aGljaCwKLSAgICB1bG9uZyB3aGF0LAotICAgIHVsb25nIG1lc3NhZ2UsCi0gICAgdWxvbmcgbW9kaWZpZXJzKQotewotICAgIGV2ZW50X3QgZXZ0OwotICAgIHVpbnQgICAgcHM7Ci0KLSAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkgewotCS8qIFNhdmUgaW5mb3JtYXRpb24gaW4gZXZlbnQgcmVjb3JkICovCi0JcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsKLQlldnQud2hpY2ggPSB3aGljaDsKLQlldnQud2hlbiA9IF9FVlRfZ2V0VGlja3MoKTsKLQlldnQud2hhdCA9IHdoYXQ7Ci0JZXZ0Lm1lc3NhZ2UgPSBtZXNzYWdlOwotCWV2dC5tb2RpZmllcnMgPSBtb2RpZmllcnM7Ci0JYWRkRXZlbnQoJmV2dCk7ICAgICAgICAgICAgIC8qIEFkZCB0byBFVlQudGFpbCBvZiBldmVudCBxdWV1ZSAgICovCi0JX0VWVF9yZXN0b3JlSW50KHBzKTsKLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgZWxzZQotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotRmx1c2hlcyBhbGwgZXZlbnRzIG9mIGEgc3BlY2lmaWVkIHR5cGUgZnJvbSB0aGUgZXZlbnQgcXVldWUuCi0KLVBBUkFNRVRFUlM6Ci1tYXNrICAgIC0gTWFzayBzcGVjaWZ5aW5nIHRoZSB0eXBlcyBvZiBldmVudHMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZAotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1GbHVzaGVzIChyZW1vdmVzKSBhbGwgcGVuZGluZyBldmVudHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGZyb20gdGhlIGV2ZW50Ci1xdWV1ZS4gWW91IG1heSBjb21iaW5lIHRoZSBtYXNrcyBmb3IgZGlmZmVyZW50IGV2ZW50IHR5cGVzIHdpdGggYSBzaW1wbGUKLWxvZ2ljYWwgT1IuCi0KLVNFRSBBTFNPOgotRVZUX2dldE5leHQsIEVWVF9oYWx0LCBFVlRfcGVla05leHQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfZmx1c2goCi0gICAgdWxvbmcgbWFzaykKLXsKLSAgICBldmVudF90IGV2dDsKLQotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmx1c2ggYWxsIGV2ZW50cyAqLwotCUVWVF9nZXROZXh0KCZldnQsbWFzayk7Ci0JfSB3aGlsZSAoZXZ0LndoYXQgIT0gRVZUX05VTExFVlQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1IYWx0cyB1bnRpbCBhbmQgZXZlbnQgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGlzIHJlY2lldmVkLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVBBUkFNRVRFUlM6Ci1ldnQgICAgIC0gUG9pbnRlciB0bwotbWFzayAgICAtIE1hc2sgc3BlY2lmeWluZyB0aGUgdHlwZXMgb2YgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb25zIGhhbHRzIGV4Y2V1dGlvbiB1bnRpbCBhbiBldmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMKLXJlY2lldmVkIGludG8gdGhlIGV2ZW50IHF1ZXVlLiBJdCBkb2VzIG5vdCBmbHVzaCB0aGUgZXZlbnQgcXVldWUgb2YgZXZlbnRzCi1iZWZvcmUgcGVyZm9ybWluZyB0aGUgYnVzeSBsb29wLiBIb3dldmVyIHRoaXMgZnVuY3Rpb24gZG9lcyB0aHJvdyBhd2F5Ci1hbnkgZXZlbnRzIG90aGVyIHRoYW4gdGhlIG9uZXMgeW91IGhhdmUgcmVxdWVzdGVkIHZpYSB0aGUgZXZlbnQgbWFzaywgdG8KLWF2b2lkIHRoZSBldmVudCBxdWV1ZSBmaWxsaW5nIHVwIHdpdGggdW53YW50ZWQgZXZlbnRzIChsaWtlIEVWVF9LRVlVUCBvcgotRVZUX01PVVNFTU9WRSBldmVudHMpLgotCi1TRUUgQUxTTzoKLUVWVF9nZXROZXh0LCBFVlRfZmx1c2gsIEVWVF9wZWVrTmV4dAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9oYWx0KAotICAgIGV2ZW50X3QgKmV2dCwKLSAgICB1bG9uZyBtYXNrKQotewotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2FpdCBmb3IgYW4gZXZlbnQgICAgKi8KLQlpZiAobWFzayAmIChFVlRfSk9ZRVZUKSkKLQkgICAgRVZUX3BvbGxKb3lzdGljaygpOwotCUVWVF9nZXROZXh0KGV2dCxFVlRfRVZFUllFVlQpOwotCX0gd2hpbGUgKCEoZXZ0LT53aGF0ICYgbWFzaykpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1QZWVrcyBhdCB0aGUgbmV4dCBwZW5kaW5nIGV2ZW50IGluIHRoZSBldmVudCBxdWV1ZS4KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRVRVUk5TOgotVHJ1ZSBpZiBhbiBldmVudCBpcyBwZW5kaW5nLCBmYWxzZSBpZiBub3QuCi0KLVBBUkFNRVRFUlM6Ci1ldnQgICAgIC0gUG9pbnRlciB0byBzdHJ1Y3R1cmUgdG8gcmV0dXJuIHRoZSBldmVudCBpbmZvIGluCi1tYXNrICAgIC0gTWFzayBzcGVjaWZ5aW5nIHRoZSB0eXBlcyBvZiBldmVudHMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZAotCi1SRU1BUktTOgotUGVla3MgYXQgdGhlIG5leHQgcGVuZGluZyBldmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW4gdGhlIGV2ZW50IHF1ZXVlLiBUaGUKLW1hc2sgcGFyYW1ldGVyIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBldmVudHMgdG8gYmUgcGVla2VkIGF0LCBhbmQKLWNhbiBiZSBhbnkgbG9naWNhbCBjb21iaW5hdGlvbiBvZiBhbnkgb2YgdGhlIGZsYWdzIGRlZmluZWQgYnkgdGhlCi1FVlRfZXZlbnRUeXBlIGVudW1lcmF0aW9uLgotCi1JbiBjb250cmFzdCB0byBFVlRfZ2V0TmV4dCwgdGhlIGV2ZW50IGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIGV2ZW50IHF1ZXVlLgotWW91IG1heSBjb21iaW5lIHRoZSBtYXNrcyBmb3IgZGlmZmVyZW50IGV2ZW50IHR5cGVzIHdpdGggYSBzaW1wbGUgbG9naWNhbCBPUi4KLQotU0VFIEFMU086Ci1FVlRfZmx1c2gsIEVWVF9nZXROZXh0LCBFVlRfaGFsdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIEVWVEFQSSBFVlRfcGVla05leHQoCi0gICAgZXZlbnRfdCAqZXZ0LAotICAgIHVsb25nIG1hc2spCi17Ci0gICAgaW50ICAgICBldnRJRDsKLSAgICB1aW50ICAgIHBzOwotCi0gICAgaWYgKEVWVC5oZWFydEJlYXQpCi0JRVZULmhlYXJ0QmVhdChFVlQuaGVhcnRCZWF0UGFyYW1zKTsKLSAgICBfRVZUX3B1bXBNZXNzYWdlcygpOyAgICAgICAgICAgICAgICAvKiBQdW1wIGFsbCBtZXNzYWdlcyBpbnRvIHF1ZXVlICovCi0gICAgRVZULm1vdXNlTW92ZShFVlQubXgsRVZULm15KTsgICAgICAgLyogTW92ZSB0aGUgbW91c2UgY3Vyc29yICAgICAgICAqLwotICAgIGV2dC0+d2hhdCA9IEVWVF9OVUxMRVZUOyAgICAgICAgICAgIC8qIERlZmF1bHQgdG8gbnVsbCBldmVudCAgICAgICAgKi8KLSAgICBpZiAoRVZULmNvdW50KSB7Ci0JLyogSXQgaXMgcG9zc2libGUgdGhhdCBhbiBldmVudCBiZSBwb3N0ZWQgd2hpbGUgd2UgYXJlIHRyeWluZwotCSAqIHRvIGFjY2VzcyB0aGUgZXZlbnQgcXVldWUuIFRoaXMgd291bGQgY3JlYXRlIHByb2JsZW1zIHNpbmNlCi0JICogd2UgbWF5IGVuZCB1cCB3aXRoIGludmFsaWQgZGF0YSBmb3Igb3VyIGV2ZW50IHF1ZXVlIHBvaW50ZXJzLiBUbwotCSAqIGFsbGV2aWF0ZSB0aGlzLCBhbGwgaW50ZXJydXB0cyBhcmUgc3VzcGVuZGVkIHdoaWxlIHdlIG1hbmlwdWxhdGUKLQkgKiBvdXIgcG9pbnRlcnMuCi0JICovCi0JcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsgICAgICAgICAgICAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICAgICAgICovCi0JZm9yIChldnRJRCA9IEVWVC5oZWFkOyBldnRJRCAhPSAtMTsgZXZ0SUQgPSBFVlQuZXZ0cVtldnRJRF0ubmV4dCkgewotCSAgICBpZiAoRVZULmV2dHFbZXZ0SURdLndoYXQgJiBtYXNrKQotCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgLyogRm91bmQgYW4gZXZlbnQgICAgICAgICAgICovCi0JICAgIH0KLQlpZiAoZXZ0SUQgPT0gLTEpIHsKLQkgICAgX0VWVF9yZXN0b3JlSW50KHBzKTsKLQkgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAvKiBFdmVudCB3YXMgbm90IGZvdW5kICAgICAgKi8KLQkgICAgfQotCSpldnQgPSBFVlQuZXZ0cVtldnRJRF07ICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gdGhlIGV2ZW50ICAgICAgICAgKi8KLQlfRVZUX3Jlc3RvcmVJbnQocHMpOwotCWlmIChldnQtPndoYXQgJiBFVlRfS0VZRVZUKQotCSAgICBfRVZUX21hc2tLZXlDb2RlKGV2dCk7Ci0JfQotICAgIHJldHVybiBldnQtPndoYXQgIT0gRVZUX05VTExFVlQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHJpZXZlcyB0aGUgbmV4dCBwZW5kaW5nIGV2ZW50IGZyb20gdGhlIGV2ZW50IHF1ZXVlLgotCi1QQVJBTUVURVJTOgotZXZ0ICAgICAtIFBvaW50ZXIgdG8gc3RydWN0dXJlIHRvIHJldHVybiB0aGUgZXZlbnQgaW5mbyBpbgotbWFzayAgICAtIE1hc2sgc3BlY2lmeWluZyB0aGUgdHlwZXMgb2YgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQKLQotSEVBREVSOgotZXZlbnQuaAotCi1SRVRVUk5TOgotVHJ1ZSBpZiBhbiBldmVudCB3YXMgcGVuZGluZywgZmFsc2UgaWYgbm90LgotCi1SRU1BUktTOgotUmV0cmlldmVzIHRoZSBuZXh0IHBlbmRpbmcgZXZlbnQgZnJvbSB0aGUgZXZlbnQgcXVldWUsIGFuZCBzdG9yZXMgaXQgaW4gYQotZXZlbnRfdCBzdHJ1Y3R1cmUuIFRoZSBtYXNrIHBhcmFtZXRlciBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgZXZlbnRzCi10byBiZSByZW1vdmVkLCBhbmQgY2FuIGJlIGFueSBsb2dpY2FsIGNvbWJpbmF0aW9uIG9mIGFueSBvZiB0aGUgZmxhZ3MgZGVmaW5lZAotYnkgdGhlIEVWVF9ldmVudFR5cGUgZW51bWVyYXRpb24uCi0KLVRoZSB3aGF0IGZpZWxkIG9mIHRoZSBldmVudCBjb250YWlucyB0aGUgZXZlbnQgY29kZSBvZiB0aGUgZXZlbnQgdGhhdCB3YXMKLWV4dHJhY3RlZC4gQWxsIGFwcGxpY2F0aW9uIHNwZWNpZmljIGV2ZW50cyBzaG91bGQgYmVnaW4gd2l0aCB0aGUgRVZUX1VTRVJFVlQKLWNvZGUgYW5kIGJ1aWxkIGZyb20gdGhlcmUuIFNpbmNlIHRoZSBldmVudCBjb2RlIGlzIHN0b3JlZCBpbiBhbiBpbnRlZ2VyLAotdGhlcmUgaXMgYSBtYXhpbXVtIG9mIDMyIGRpZmZlcmVudCBldmVudCBjb2RlcyB0aGF0IGNhbiBiZSBkaXN0aW5ndWlzaGVkLgotWW91IGNhbiBzdG9yZSBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXZlbnQgaW4gdGhlIG1lc3NhZ2UgZmllbGQgdG8KLWRpc3Rpbmd1aXNoIGJldHdlZW4gZXZlbnRzIG9mIHRoZSBzYW1lIGNsYXNzIChmb3IgaW5zdGFuY2UgdGhlIGJ1dHRvbiB1c2VkIGluCi1hIEVWVF9NT1VTRURPV04gZXZlbnQpLgotCi1JZiBhbiBldmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgd2FzIG5vdCBpbiB0aGUgZXZlbnQgcXVldWUsIHRoZSB3aGF0IGZpZWxkCi1vZiB0aGUgZXZlbnQgd2lsbCBiZSBzZXQgdG8gTlVMTEVWVCwgYW5kIHRoZSByZXR1cm4gdmFsdWUgd2lsbCByZXR1cm4gZmFsc2UuCi0KLU5vdGU6ICAgWW91IHNob3VsZCAvYWx3YXlzLyB1c2UgdGhlIEVWVF9FVkVSWUVWVCBtYXNrIGZvciBleHRyYWN0aW5nIGV2ZW50cwotCWZyb20geW91ciBtYWluIGV2ZW50IGxvb3AgaGFuZGxlci4gVXNpbmcgYSBtYXNrIGZvciBvbmx5IGEgc3BlY2lmaWMKLQl0eXBlIG9mIGV2ZW50IGZvciBsb25nIHBlcmlvZHMgb2YgdGltZSB3aWxsIGNhdXNlIHRoZSBldmVudCBxdWV1ZSB0bwotCWZpbGwgdXAgd2l0aCBldmVudHMgb2YgdGhlIHR5cGUgeW91IGFyZSBpZ25vcmluZywgZXZlbnR1YWxseSBjYXVzaW5nCi0JdGhlIGFwcGxpY2F0aW9uIHRvIGhhbmcgd2hlbiB0aGUgZXZlbnQgcXVldWUgYmVjb21lcyBmdWxsLgotCi1TRUUgQUxTTzoKLUVWVF9mbHVzaCwgRVZUX2hhbHQsIEVWVF9wZWVrTmV4dAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIEVWVEFQSSBFVlRfZ2V0TmV4dCgKLSAgICBldmVudF90ICpldnQsCi0gICAgdWxvbmcgbWFzaykKLXsKLSAgICBpbnQgICAgIGV2dElELG5leHQscHJldjsKLSAgICB1aW50ICAgIHBzOwotCi0gICAgaWYgKEVWVC5oZWFydEJlYXQpCi0JRVZULmhlYXJ0QmVhdChFVlQuaGVhcnRCZWF0UGFyYW1zKTsKLSAgICBfRVZUX3B1bXBNZXNzYWdlcygpOyAgICAgICAgICAgICAgICAvKiBQdW1wIGFsbCBtZXNzYWdlcyBpbnRvIHF1ZXVlICovCi0gICAgRVZULm1vdXNlTW92ZShFVlQubXgsRVZULm15KTsgICAgICAgLyogTW92ZSB0aGUgbW91c2UgY3Vyc29yICAgICAgICAqLwotICAgIGV2dC0+d2hhdCA9IEVWVF9OVUxMRVZUOyAgICAgICAgICAgIC8qIERlZmF1bHQgdG8gbnVsbCBldmVudCAgICAgICAgKi8KLSAgICBpZiAoRVZULmNvdW50KSB7Ci0JLyogSXQgaXMgcG9zc2libGUgdGhhdCBhbiBldmVudCBiZSBwb3N0ZWQgd2hpbGUgd2UgYXJlIHRyeWluZwotCSAqIHRvIGFjY2VzcyB0aGUgZXZlbnQgcXVldWUuIFRoaXMgd291bGQgY3JlYXRlIHByb2JsZW1zIHNpbmNlCi0JICogd2UgbWF5IGVuZCB1cCB3aXRoIGludmFsaWQgZGF0YSBmb3Igb3VyIGV2ZW50IHF1ZXVlIHBvaW50ZXJzLiBUbwotCSAqIGFsbGV2aWF0ZSB0aGlzLCBhbGwgaW50ZXJydXB0cyBhcmUgc3VzcGVuZGVkIHdoaWxlIHdlIG1hbmlwdWxhdGUKLQkgKiBvdXIgcG9pbnRlcnMuCi0JICovCi0JcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsgICAgICAgICAgICAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICAgICAgICovCi0JZm9yIChldnRJRCA9IEVWVC5oZWFkOyBldnRJRCAhPSAtMTsgZXZ0SUQgPSBFVlQuZXZ0cVtldnRJRF0ubmV4dCkgewotCSAgICBpZiAoRVZULmV2dHFbZXZ0SURdLndoYXQgJiBtYXNrKQotCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgLyogRm91bmQgYW4gZXZlbnQgICAgICAgICAgICovCi0JICAgIH0KLQlpZiAoZXZ0SUQgPT0gLTEpIHsKLQkgICAgX0VWVF9yZXN0b3JlSW50KHBzKTsKLQkgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAvKiBFdmVudCB3YXMgbm90IGZvdW5kICAgICAgKi8KLQkgICAgfQotCW5leHQgPSBFVlQuZXZ0cVtldnRJRF0ubmV4dDsKLQlwcmV2ID0gRVZULmV2dHFbZXZ0SURdLnByZXY7Ci0JaWYgKHByZXYgIT0gLTEpCi0JICAgIEVWVC5ldnRxW3ByZXZdLm5leHQgPSBuZXh0OwotCWVsc2UKLQkgICAgRVZULmhlYWQgPSBuZXh0OwotCWlmIChuZXh0ICE9IC0xKQotCSAgICBFVlQuZXZ0cVtuZXh0XS5wcmV2ID0gcHJldjsKLQllbHNlCi0JICAgIEVWVC50YWlsID0gcHJldjsKLQkqZXZ0ID0gRVZULmV2dHFbZXZ0SURdOyAgICAgICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBldmVudCAgICAgICAgICovCi0JRVZULmV2dHFbZXZ0SURdLm5leHQgPSBFVlQuZnJlZUhlYWQ7ICAgICAgICAvKiBhbmQgcmV0dXJuIHRvIGZyZWUgbGlzdCAgKi8KLQlFVlQuZnJlZUhlYWQgPSBldnRJRDsKLQlFVlQuY291bnQtLTsKLQlpZiAoZXZ0LT53aGF0ID09IEVWVF9NT1VTRU1PVkUpCi0JICAgIEVWVC5vbGRNb3ZlID0gLTE7Ci0JaWYgKGV2dC0+d2hhdCA9PSBFVlRfS0VZUkVQRUFUKQotCSAgICBFVlQub2xkS2V5ID0gLTE7Ci0JaWYgKGV2dC0+d2hhdCA9PSBFVlRfSk9ZTU9WRSkKLQkgICAgRVZULm9sZEpveU1vdmUgPSAtMTsKLQlfRVZUX3Jlc3RvcmVJbnQocHMpOyAgICAgICAgICAgICAgICAvKiBlbmFibGUgaW50ZXJydXB0cyAgICAgICAgKi8KLQlpZiAoZXZ0LT53aGF0ICYgRVZUX0tFWUVWVCkKLQkgICAgX0VWVF9tYXNrS2V5Q29kZShldnQpOwotCX0KLQotICAgIC8qIElmIHRoZXJlIGlzIG5vIGV2ZW50IHBlbmRpbmcsIGNoZWNrIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBhbiBhdXRvCi0gICAgICogbW91c2UgZG93biBldmVudCBpZiB0aGUgbW91c2UgaXMgc3RpbGwgY3VycmVudGx5IGRvd24uCi0gICAgICovCi0gICAgaWYgKGV2dC0+d2hhdCA9PSBFVlRfTlVMTEVWVCAmJiBFVlQuYXV0b1JlcGVhdCAmJiAobWFzayAmIEVWVF9NT1VTRUFVVE8pICYmIChFVlQuZG93bk1vdXNlLndoYXQgJiBFVlRfTU9VU0VET1dOKSkgewotCXVsb25nIHRpY2tzID0gX0VWVF9nZXRUaWNrcygpOwotCWlmICgodGlja3MgLSBFVlQuYXV0b1RpY2tzKSA+PSAoRVZULmF1dG9SZXBlYXQgKyAoRVZULmZpcnN0QXV0byA/IEVWVC5hdXRvRGVsYXkgOiAwKSkpIHsKLQkgICAgZXZ0LT53aGF0ID0gRVZUX01PVVNFQVVUTzsKLQkgICAgZXZ0LT5tZXNzYWdlID0gRVZULmRvd25Nb3VzZS5tZXNzYWdlOwotCSAgICBldnQtPm1vZGlmaWVycyA9IEVWVC5kb3duTW91c2UubW9kaWZpZXJzOwotCSAgICBldnQtPndoZXJlX3ggPSBFVlQuYXV0b01vdXNlX3g7Ci0JICAgIGV2dC0+d2hlcmVfeSA9IEVWVC5hdXRvTW91c2VfeTsKLQkgICAgZXZ0LT5yZWxhdGl2ZV94ID0gMDsKLQkgICAgZXZ0LT5yZWxhdGl2ZV95ID0gMDsKLQkgICAgRVZULmF1dG9UaWNrcyA9IGV2dC0+d2hlbiA9IHRpY2tzOwotCSAgICBFVlQuZmlyc3RBdXRvID0gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIGV2dC0+d2hhdCAhPSBFVlRfTlVMTEVWVDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotSW5zdGFsbHMgYSB1c2VyIHN1cHBsaWVkIGV2ZW50IGZpbHRlciBjYWxsYmFjayBmb3IgZXZlbnQgaGFuZGxpbmcuCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUEFSQU1FVEVSUzoKLXVzZXJFdmVudEZpbHRlciAtIEFkZHJlc3Mgb2YgdXNlciBzdXBwbGllZCBldmVudCBmaWx0ZXIgY2FsbGJhY2sKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWVyIHRvIGluc3RhbGwgYW4gZXZlbnQgZmlsdGVyCi1jYWxsYmFjayBmb3IgZXZlbnQgaGFuZGxpbmcuIE9uY2UgeW91IGluc3RhbGwgeW91ciBjYWxsYmFjaywgdGhlIE1HTAotZXZlbnQgaGFuZGxpbmcgcm91dGluZXMgd2lsbCBjYWxsIHlvdXIgY2FsbGJhY2sgd2l0aCBhIHBvaW50ZXIgdG8gdGhlCi1uZXcgZXZlbnQgdGhhdCB3aWxsIGJlIHBsYWNlZCBpbnRvIHRoZSBldmVudCBxdWV1ZS4gWW91ciBjYWxsYmFjayBjYW4gdGhlCi1tb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBldmVudCBiZWZvcmUgaXQgaXMgcGxhY2VkIGludG8gdGhlIHF1ZXVlIChmb3IKLWluc3RhbmNlIGFkZGluZyBjdXN0b20gaW5mb3JtYXRpb24gb3IgcGVyaGFwcyBoaWdoIHByZWNpc2lvbiB0aW1pbmcKLWluZm9ybWF0aW9uKS4KLQotSWYgeW91ciBjYWxsYmFjayByZXR1cm5zIEZBTFNFLCB0aGUgZXZlbnQgd2lsbCBiZSBpZ25vcmUgYW5kIHdpbGwgbm90IGJlCi1wb3N0ZWQgdG8gdGhlIGV2ZW50IHF1ZXVlLiBZb3Ugc2hvdWxkIGFsd2F5cyByZXR1cm4gdHJ1ZSBmcm9tIHlvdXIgZXZlbnQKLWNhbGxiYWNrIHVubGVzcyB5b3UgcGxhbiB0byB1c2UgdGhlIGV2ZW50cyBpbW1lZGlhdGVseSB0aGF0IHRoZXkgYXJlCi1yZWNpZXZlZC4KLQotTm90ZTogICBZb3VyIGV2ZW50IGNhbGxiYWNrIG1heSBiZSBjYWxsZWQgaW4gcmVzcG9uc2UgdG8gYSBoYXJkd2FyZQotCWludGVycnVwdCBhbmQgd2lsbCBiZSBleGVjdXRpbmcgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGhhcmR3YXJlCi0JaW50ZXJydXB0IGhhbmRsZXIgdW5kZXIgTVNET1MgKGllOiBrZXlib2FyZCBpbnRlcnJ1cHQgb3IgbW91c2UKLQlpbnRlcnJ1cHQpLiBGb3IgdGhpcyByZWFzb24gdGhlIGNvZGUgcGFnZXMgZm9yIHRoZSBjYWxsYmFjayB0aGF0Ci0JeW91IHJlZ2lzdGVyIG11c3QgYmUgbG9ja2VkIGluIG1lbW9yeSB3aXRoIHRoZSBQTV9sb2NrQ29kZVBhZ2VzCi0JZnVuY3Rpb24uIFlvdSBtdXN0IGFsc28gbG9jayBkb3duIGFueSBkYXRhIHBhZ2VzIHRoYXQgeW91ciBmdW5jdGlvbgotCW5lZWRzIHRvIHJlZmVyZW5jZSBhcyB3ZWxsLgotCi1Ob3RlOiAgIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyBmaWx0ZXIgY2FsbGJhY2sgdG8gcHJvY2VzcyBldmVudHMgYXQgdGhlCi0JdGltZSB0aGV5IGFyZSBhY3RpdmF0ZWQgYnkgdGhlIHVzZXIgKGllOiB3aGVuIHRoZSB1c2VyIGhpdHMgdGhlCi0Ja2V5IG9yIG1vdmVzIHRoZSBtb3VzZSksIGJ1dCBtYWtlIHN1cmUgeW91ciBjb2RlIHJ1bnMgYXMgZmFzdCBhcwotCXBvc3NpYmxlIGFzIGl0IHdpbGwgYmUgZXhlY3V0aW5nIGluc2lkZSB0aGUgY29udGV4dCBvZiBhbiBpbnRlcnJ1cHQKLQloYW5kbGVyIG9uIHNvbWUgc3lzdGVtcy4KLQotU0VFIEFMU086Ci1FVlRfZ2V0TmV4dCwgRVZUX3BlZWtOZXh0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldFVzZXJFdmVudEZpbHRlcigKLSAgICBfRVZUX3VzZXJFdmVudEZpbHRlciBmaWx0ZXIpCi17Ci0gICAgRVZULnVzZXJFdmVudENhbGxiYWNrID0gZmlsdGVyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1JbnN0YWxscyBhIHVzZXIgc3VwcGxpZWQgZXZlbnQgaGVhcnRiZWF0IGNhbGxiYWNrIGZ1bmN0aW9uLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVBBUkFNRVRFUlM6Ci1jYWxsYmFjayAgICAtIEFkZHJlc3Mgb2YgdXNlciBzdXBwbGllZCBldmVudCBoZWFydGJlYXQgY2FsbGJhY2sKLXBhcmFtcyAgICAgIC0gUGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBldmVudCBoZWFydGJlYXQgZnVuY3Rpb24KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWVyIHRvIGluc3RhbGwgYW4gZXZlbnQgaGVhdGJlYXQKLWZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZXZlcnkgdGltZSB0aGF0IEVWVF9nZXROZXh0IG9yIEVWVF9wZWVrTmV4dAotaXMgY2FsbGVkLiBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIHNpbXVsYXRpbmcgdGV4dCBtb2RlIGN1cnNvcnMgaW5zaWRlCi1ldmVudCBoYW5kbGluZyBjb2RlIHdoZW4gcnVubmluZyBpbiBncmFwaGljcyBtb2RlcyBhcyBvcHBvc2VkIHRvIGhhcmR3YXJlCi10ZXh0IG1vZGVzLgotCi1TRUUgQUxTTzoKLUVWVF9nZXROZXh0LCBFVlRfcGVla05leHQsIEVWVF9nZXRIZWFydEJlYXRDYWxsYmFjawotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zZXRIZWFydEJlYXRDYWxsYmFjaygKLSAgICBfRVZUX2hlYXJ0QmVhdENhbGxiYWNrIGNhbGxiYWNrLAotICAgIHZvaWQgKnBhcmFtcykKLXsKLSAgICBFVlQuaGVhcnRCZWF0ID0gY2FsbGJhY2s7Ci0gICAgRVZULmhlYXJ0QmVhdFBhcmFtcyA9IHBhcmFtczsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBjdXJyZW50IHVzZXIgc3VwcGxpZWQgZXZlbnQgaGVhcnRiZWF0IGNhbGxiYWNrIGZ1bmN0aW9uLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVBBUkFNRVRFUlM6Ci1jYWxsYmFjayAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBhZGRyZXNzIG9mIHVzZXIgc3VwcGxpZWQgZXZlbnQgaGVhcnRiZWF0IGNhbGxiYWNrCi1wYXJhbXMgICAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGhlYXJ0YmVhdCBmdW5jdGlvbgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZXZlbnQgaGVhdGJlYXQgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZAotZXZlcnkgdGltZSB0aGF0IEVWVF9nZXROZXh0IG9yIEVWVF9wZWVrTmV4dCBpcyBjYWxsZWQuCi0KLVNFRSBBTFNPOgotRVZUX2dldE5leHQsIEVWVF9wZWVrTmV4dCwgRVZUX3NldEhlYXJ0QmVhdENhbGxiYWNrCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2dldEhlYXJ0QmVhdENhbGxiYWNrKAotICAgIF9FVlRfaGVhcnRCZWF0Q2FsbGJhY2sgKmNhbGxiYWNrLAotICAgIHZvaWQgKipwYXJhbXMpCi17Ci0gICAgKmNhbGxiYWNrID0gRVZULmhlYXJ0QmVhdDsKLSAgICAqcGFyYW1zID0gRVZULmhlYXJ0QmVhdFBhcmFtczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotRGV0ZXJtaW5lcyBpZiBhIHNwZWNpZmllZCBrZXkgaXMgY3VycmVudGx5IGRvd24uCi0KLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIFNjYW4gY29kZSB0byB0ZXN0Ci0KLVJFVFVSTlM6Ci1UcnVlIG9mIHRoZSBzcGVjaWZpZWQga2V5IGlzIGN1cnJlbnRseSBoZWxkIGRvd24uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiBhIHNwZWNpZmllZCBrZXkgaXMgY3VycmVudGx5IGRvd24gYXQgdGhlCi10aW1lIHRoYXQgdGhlIGNhbGwgaXMgbWFkZS4gWW91IHNpbXBseSBuZWVkIHRvIHBhc3MgaW4gdGhlIHNjYW4gY29kZSBvZgotdGhlIGtleSB0aGF0IHlvdSB3aXNoIHRvIHRlc3QsIGFuZCB0aGUgTUdMIHdpbGwgdGVsbCB5b3UgaWYgaXQgaXMgY3VycmVudGx5Ci1kb3duIG9yIG5vdC4gVGhlIE1HTCBkb2VzIHRoaXMgYnkga2VlcGluZyB0cmFjayBvZiB0aGUgdXAgYW5kIGRvd24gc3RhdGUKLW9mIGFsbCB0aGUga2V5cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBFVlRBUEkgRVZUX2lzS2V5RG93bigKLSAgICB1Y2hhciBzY2FuQ29kZSkKLXsKLSAgICByZXR1cm4gX0VWVF9pc0tleURvd24oc2NhbkNvZGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1TZXQgdGhlIG1vdXNlIHBvc2l0aW9uIGZvciB0aGUgZXZlbnQgbW9kdWxlCi0KLVBBUkFNRVRFUlM6Ci14ICAgLSBYIGNvb3JkaW5hdGUgdG8gbW92ZSB0aGUgbW91c2UgY3Vyc29yIHBvc2l0aW9uIHRvCi15ICAgLSBZIGNvb3JkaW5hdGUgdG8gbW92ZSB0aGUgbW91c2UgY3Vyc29yIHBvc2l0aW9uIHRvCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gbW92ZXMgdGhlIG1vdXNlIGN1cnNvciBwb3NpdGlvbiBmb3IgdGhlIGV2ZW50IG1vZHVsZSB0byB0aGUKLXNwZWNpZmllZCBsb2NhdGlvbi4KLQotU0VFIEFMU086Ci1FVlRfZ2V0TW91c2VQb3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0TW91c2VQb3MoCi0gICAgaW50IHgsCi0gICAgaW50IHkpCi17Ci0gICAgRVZULm14ID0geDsKLSAgICBFVlQubXkgPSB5OwotICAgIF9FVlRfc2V0TW91c2VQb3MoJkVWVC5teCwmRVZULm15KTsKLSAgICBFVlQubW91c2VNb3ZlKEVWVC5teCxFVlQubXkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBjdXJyZW50IG1vdXNlIGN1cnNvciBsb2NhdGlvbi4KLQotSEVBREVSOgotZXZlbnQuaAotCi1QQVJBTUVURVJTOgoteCAgIC0gUGxhY2UgdG8gc3RvcmUgdmFsdWUgZm9yIG1vdXNlIHggY29vcmRpbmF0ZSAoc2NyZWVuIGNvb3JkaW5hdGVzKQoteSAgIC0gUGxhY2UgdG8gc3RvcmUgdmFsdWUgZm9yIG1vdXNlIHkgY29vcmRpbmF0ZSAoc2NyZWVuIGNvb3JkaW5hdGVzKQotCi1SRU1BUktTOgotT2J0YWlucyB0aGUgY3VycmVudCBtb3VzZSBjdXJzb3IgcG9zaXRpb24gaW4gc2NyZWVuIGNvb3JkaW5hdGVzLiBOb3JtYWxseSB0aGUKLW1vdXNlIGN1cnNvciBsb2NhdGlvbiBpcyB0cmFja2VkIHVzaW5nIHRoZSBtb3VzZSBtb3ZlbWVudCBldmVudHMgdGhhdCBhcmUKLXBvc3RlZCB0byB0aGUgZXZlbnQgcXVldWUgd2hlbiB0aGUgbW91c2UgbW92ZXMsIGhvd2V2ZXIgdGhpcyByb3V0aW5lCi1wcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSBtZXRob2Qgb2YgcG9sbGluZyB0aGUgbW91c2UgY3Vyc29yIGxvY2F0aW9uLgotCi1TRUUgQUxTTzoKLUVWVF9zZXRNb3VzZVBvcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9nZXRNb3VzZVBvcygKLSAgICBpbnQgKngsCi0gICAgaW50ICp5KQotewotICAgICp4ID0gRVZULm14OwotICAgICp5ID0gRVZULm15OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNvZGUgcGFnZSBmb3IgdHJhbnNsYXRpb24gb2Yga2V5Ym9hcmQgY2hhcmFjdGVycy4KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRVRVUk5TOgotUG9pbnRlciB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBjb2RlIHBhZ2UgdHJhbnNsYXRpb24gdGFibGUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNvZGUgcGFnZQotdHJhbnNsYXRpb24gdGFibGUuIFNlZSBFVlRfc2V0Q29kZVBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLVNFRSBBTFNPOgotRVZUX3NldENvZGVQYWdlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29kZXBhZ2VfdCAqIEVWVEFQSSBFVlRfZ2V0Q29kZVBhZ2Uodm9pZCkKLXsKLSAgICByZXR1cm4gRVZULmNvZGVQYWdlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1TZXRzIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNvZGUgcGFnZSBmb3IgdHJhbnNsYXRpb24gb2Yga2V5Ym9hcmQgY2hhcmFjdGVycy4KLQotSEVBREVSOgotZXZlbnQuaAotCi1QQVJBTUVURVJTOgotcGFnZSAgICAtIE5ldyBjb2RlIHBhZ2UgdG8gbWFrZSBhY3RpdmUKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgYSBuZXcgY29kZSBwYWdlIHRyYW5zbGF0aW9uIHRhYmxlIHRoYXQgaXMgdXNlZAotdG8gdHJhbnNsYXRlIHZpcnR1YWwgc2NhbiBjb2RlIHZhbHVlcyB0byBBU0NJSSBjaGFyYWN0ZXJzIGZvciBkaWZmZXJlbnQKLWtleWJvYXJkIGNvbmZpZ3VyYXRpb25zLiBUaGUgZGVmYXVsdCBpcyB1c3VhbGx5IFVTIEVuZ2xpc2gsIGFsdGhvdWdoIGlmCi1wb3NzaWJsZSB0aGUgUE0gbGlicmFyeSB3aWxsIGF1dG8tZGV0ZWN0IHRoZSBjb3JyZWN0IGNvZGUgcGFnZSB0cmFuc2xhdGlvbgotZm9yIHRoZSB0YXJnZXQgT1MgaWYgT1Mgc2VydmljZXMgYXJlIGF2YWlsYWJsZSB0byBkZXRlcm1pbmUgd2hhdCB0eXBlIG9mCi1rZXlib2FyZCBpcyBjdXJyZW50bHkgYXR0YWNoZWQuCi0KLVNFRSBBTFNPOgotRVZUX2dldENvZGVQYWdlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldENvZGVQYWdlKAotICAgIGNvZGVwYWdlX3QgKnBhZ2UpCi17Ci0gICAgRVZULmNvZGVQYWdlID0gcGFnZTsKLX0KLQotLyogVGhlIGZvbGxvd2luZyBjb250YWlucyBmYWtlIEMgcHJvdG90eXBlcyBhbmQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCi0gKiBtYWNybyBmdW5jdGlvbnMgaW4gdGhlIGV2ZW50LmggaGVhZGVyIGZpbGUuIFRoZXNlIGV4aXN0IHNvbGV5IHNvCi0gKiB0aGF0IERvY0pldCB3aWxsIGNvcnJlY3RseSBwdWxsIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGVzZSBmdW5jdGlvbnMuCi0gKi8KLSNpZmRlZiAgSU5DTFVERV9ET0NfRlVOQ1RJT05TCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLU1hY3JvIHRvIGV4dHJhY3QgdGhlIEFTQ0lJIGNvZGUgZnJvbSBhIG1lc3NhZ2UuCi0KLVBBUkFNRVRFUlM6Ci1tZXNzYWdlIC0gTWVzc2FnZSB0byBleHRyYWN0IEFTQ0lJIGNvZGUgZnJvbQotCi1SRVRVUk5TOgotQVNDSUkgY29kZSBleHRyYWN0ZWQgZnJvbSB0aGUgbWVzc2FnZS4KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotTWFjcm8gdG8gZXh0cmFjdCB0aGUgQVNDSUkgY29kZSBmcm9tIHRoZSBtZXNzYWdlIGZpZWxkIG9mIHRoZSBldmVudF90Ci1zdHJ1Y3R1cmUuIFlvdSBwYXNzIHRoZSBtZXNzYWdlIGZpZWxkIHRvIHRoZSBtYWNybyBhcyB0aGUgcGFyYW1ldGVyIGFuZAotdGhlIEFTQ0lJIGNvZGUgaXMgdGhlIHJlc3VsdCwgZm9yIGV4YW1wbGU6Ci0KLSAgICBldmVudF90IEVWVC5teUV2ZW50OwotICAgIHVjaGFyICAgY29kZTsKLSAgICBjb2RlID0gRVZUX2FzY2lpQ29kZShFVlQubXlFdmVudC5tZXNzYWdlKTsKLQotU0VFIEFMU086Ci1FVlRfc2NhbkNvZGUsIEVWVF9yZXBlYXRDb3VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVjaGFyIEVWVF9hc2NpaUNvZGUoCi0gICAgdWxvbmcgbWVzc2FnZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLU1hY3JvIHRvIGV4dHJhY3QgdGhlIGtleWJvYXJkIHNjYW4gY29kZSBmcm9tIGEgbWVzc2FnZS4KLQotSEVBREVSOgotZXZlbnQuaAotCi1QQVJBTUVURVJTOgotbWVzc2FnZSAtIE1lc3NhZ2UgdG8gZXh0cmFjdCBzY2FuIGNvZGUgZnJvbQotCi1SRVRVUk5TOgotS2V5Ym9hcmQgc2NhbiBjb2RlIGV4dHJhY3RlZCBmcm9tIHRoZSBtZXNzYWdlLgotCi1SRU1BUktTOgotTWFjcm8gdG8gZXh0cmFjdCB0aGUga2V5Ym9hcmQgc2NhbiBjb2RlIGZyb20gdGhlIG1lc3NhZ2UgZmllbGQgb2YgdGhlIGV2ZW50Ci1zdHJ1Y3R1cmUuIFlvdSBwYXNzIHRoZSBtZXNzYWdlIGZpZWxkIHRvIHRoZSBtYWNybyBhcyB0aGUgcGFyYW1ldGVyIGFuZAotdGhlIHNjYW4gY29kZSBpcyB0aGUgcmVzdWx0LCBmb3IgZXhhbXBsZToKLQotICAgIGV2ZW50X3QgRVZULm15RXZlbnQ7Ci0gICAgdWNoYXIgICBjb2RlOwotICAgIGNvZGUgPSBFVlRfc2NhbkNvZGUoRVZULm15RXZlbnQubWVzc2FnZSk7Ci0KLU5PVEU6ICAgU2NhbiBjb2RlcyBpbiB0aGUgZXZlbnQgbGlicmFyeSBhcmUgbm90IHJlYWxseSBoYXJkd2FyZSBzY2FuIGNvZGVzLAotCWJ1dCByYXRoZXIgdmlydHVhbCBzY2FuIGNvZGVzIGFzIGdlbmVyYXRlZCBieSBhIGxvdyBsZXZlbCBrZXlib2FyZAotCWludGVyZmFjZSBkcml2ZXIuIEFsbCB2aXJ0dWFsIHNjYW4gY29kZSB2YWx1ZXMgYXJlIGRlZmluZWQgYnkgdGhlCi0JRVZUX3NjYW5Db2Rlc1R5cGUgZW51bWVyYXRpb24sIGFuZCB3aWxsIGJlIGlkZW50aWNhbCBhY3Jvc3MgYWxsCi0Jc3VwcG9ydHMgT1MnZXMgYW5kIHBsYXRmb3Jtcy4KLQotU0VFIEFMU086Ci1FVlRfYXNjaWlDb2RlLCBFVlRfcmVwZWF0Q291bnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11Y2hhciBFVlRfc2NhbkNvZGUoCi0gICAgdWxvbmcgbWVzc2FnZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLU1hY3JvIHRvIGV4dHJhY3QgdGhlIHJlcGVhdCBjb3VudCBmcm9tIGEgbWVzc2FnZS4KLQotSEVBREVSOgotZXZlbnQuaAotCi1QQVJBTUVURVJTOgotbWVzc2FnZSAtIE1lc3NhZ2UgdG8gZXh0cmFjdCByZXBlYXQgY291bnQgZnJvbQotCi1SRVRVUk5TOgotUmVwZWF0IGNvdW50IGV4dHJhY3RlZCBmcm9tIHRoZSBtZXNzYWdlLgotCi1SRU1BUktTOgotTWFjcm8gdG8gZXh0cmFjdCB0aGUgcmVwZWF0IGNvdW50IGZyb20gdGhlIG1lc3NhZ2UgZmllbGQgb2YgdGhlIGV2ZW50Ci1zdHJ1Y3R1cmUuIFRoZSByZXBlYXQgY291bnQgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSBrZXkgcmVwZWF0ZWQKLWJlZm9yZSB0aGVyZSB3YXMgYW5vdGhlciBrZXlib2FyZCBldmVudCB0byBiZSBwbGFjZSBpbiB0aGUgcXVldWUsIGFuZAotYWxsb3dzIHRoZSBldmVudCBoYW5kbGluZyBjb2RlIHRvIGF2b2lkIGtleWJvYXJkIGJ1ZmZlciBvdmVyZmxvdwotY29uZGl0aW9ucyB3aGVuIGEgc2luZ2xlIGtleSBpcyBoZWxkIGRvd24gYnkgdGhlIHVzZXIuIElmIHlvdSBhcmUgcHJvY2Vzc2luZwotYSBrZXkgcmVwZWF0IGNvZGUsIHlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gY2hlY2sgdGhpcyBmaWVsZCB0byBzZWUgaG93Ci1tYW55IGtleSByZXBlYXRzIHlvdSBzaG91bGQgcHJvY2VzcyBmb3IgdGhpcyBtZXNzYWdlLgotCi1TRUUgQUxTTzoKLUVWVF9hc2NpaUNvZGUsIEVWVF9yZXBlYXRDb3VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXNob3J0IEVWVF9yZXBlYXRDb3VudCgKLSAgICB1bG9uZyBtZXNzYWdlKTsKLQotI2VuZGlmICAvKiBET0MgRlVOQ1RJT05TICovCi0KLSNpZiBkZWZpbmVkKF9fUkVBTERPU19fKSB8fCBkZWZpbmVkKF9fU01YMzJfXykKLS8qIHtzZWNyZXR9ICovCi12b2lkIEVWVEFQSSBfRVZUX2NDb2RlRW5kKHZvaWQpIHt9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L2NwdWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg4ZDIxMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9jcHVpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBMaW51eAotKgotKiBEZXNjcmlwdGlvbjogIExpbnV4IHNwZWNpZmljIGNvZGUgZm9yIHRoZSBDUFUgZGV0ZWN0aW9uIG1vZHVsZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDx6dGltZXIuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UT0RPOiBXZSBzaG91bGQgaW1wbGVtZW50IHRoaXMgZm9yIExpbnV4IQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU2V0TWF4VGhyZWFkUHJpb3JpdHkoKSAgMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRPRE86IFdlIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmb3IgTGludXghCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoaSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAotICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCi17Ci0gICAgZnJlcS0+bG93ID0gMTAwMDAwMDsKLSAgICBmcmVxLT5oaWdoID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN0cnVjdCB0aW1ldmFsIHR2OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldHRpbWVvZmRheSgmdHYsTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICh0KS0+bG93ID0gdHYudHZfc2VjKjEwMDAwMDAgKyB0di50dl91c2VjOyAgXAotICAgICh0KS0+aGlnaCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L2V2ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMzg3MzIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvZXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIExpbnV4Ci0qCi0qIERlc2NyaXB0aW9uOiAgTGludXggZnVsbHNjcmVlbiBjb25zb2xlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaAotKiAgICAgICAgICAgICAgIGNyb3NzIHBsYXRmb3JtIGV2ZW50IGxpYnJhcnkuCi0qICAgICAgICAgICAgICAgUG9ydGlvbnMgcmlwcGVkIHN0cmFpZ3RoIGZyb20gdGhlIGdwbSBzb3VyY2UgY29kZSBmb3IgbW91c2UKLSogICAgICAgICAgICAgICBoYW5kbGluZy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWV4dGVybiBpbnQgICAgICAgICAgICAgIF9QTV9jb25zb2xlX2ZkOwotc3RhdGljIHVzaG9ydCAgICAgICAgICAga2V5VXBNc2dbMjU2XSA9IHswfTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIF9FVlRfbW91c2VfZmQgPSAwOwotc3RhdGljIGludCAgICAgICAgICAgICAgcmFuZ2VfeCwgcmFuZ2VfeTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIG9wdF9iYXVkID0gMTIwMCwgb3B0X3NhbXBsZSA9IDEwMDsKLSNpZmRlZiBVU0VfT1NfSk9ZU1RJQ0sKLXN0YXRpYyBzaG9ydCAgICAgICAgICAgICpheGlzMCA9IE5VTEwsICpheGlzMSA9IE5VTEw7Ci1zdGF0aWMgdWNoYXIgICAgICAgICAgICAqYnV0czAgPSBOVUxMLCAqYnV0czEgPSBOVUxMOwotc3RhdGljIGludCAgICAgICAgICAgICAgam95c3RpY2swX2ZkID0gMCwgam95c3RpY2sxX2ZkID0gMDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIGpzX3ZlcnNpb24gPSAwOwotI2VuZGlmCi0KLS8qIFRoaXMgZGVmaW5lcyB0aGUgc3VwcG9ydGVkIG1vdXNlIGRyaXZlcnMgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBFVlRfbm9Nb3VzZSA9IC0xLAotICAgIEVWVF9taWNyb3NvZnQgPSAwLAotICAgIEVWVF9wczIsCi0gICAgRVZUX21vdXNlc3lzdGVtcywKLSAgICBFVlRfZ3BtLAotICAgIEVWVF9NTXNlcmllcywKLSAgICBFVlRfbG9naXRlY2gsCi0gICAgRVZUX2J1c21vdXNlLAotICAgIEVWVF9tb3VzZW1hbiwKLSAgICBFVlRfaW50ZWxsaW1vdXNlLAotICAgIEVWVF9pbnRlbGxpbW91c2VfcHMyLAotICAgIH0gbW91c2VfZHJpdmVyc190OwotCi1zdGF0aWMgbW91c2VfZHJpdmVyc190IG1vdXNlX2RyaXZlciA9IEVWVF9ub01vdXNlOwotc3RhdGljIGNoYXIgbW91c2VfZGV2WzIwXSA9ICIvZGV2L21vdXNlIjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgICAgKm5hbWU7Ci0gICAgaW50ICAgICBmbGFnczsKLSAgICB2b2lkICAgICgqaW5pdCkodm9pZCk7Ci0gICAgdWNoYXIgICBwcm90b1s0XTsKLSAgICBpbnQgICAgIHBhY2tldF9sZW47Ci0gICAgaW50ICAgICByZWFkOwotICAgIH0gbW91c2VfaW5mbzsKLQotI2RlZmluZSBTVERfRkxHIChDUkVBRCB8IENMT0NBTCB8IEhVUENMKQotCi1zdGF0aWMgdm9pZCBfRVZUX21vdXNlX2luaXQodm9pZCk7Ci1zdGF0aWMgdm9pZCBfRVZUX2xvZ2l0ZWNoX2luaXQodm9pZCk7Ci1zdGF0aWMgdm9pZCBfRVZUX3BucG1vdXNlX2luaXQodm9pZCk7Ci0KLW1vdXNlX2luZm8gbW91c2VfaW5mb3NbXSA9IHsKLSAgICB7Ik1pY3Jvc29mdCIsICAgICAgIENTNyB8IEIxMjAwIHwgU1REX0ZMRywgICAgICAgICAgICAgIF9FVlRfbW91c2VfaW5pdCwgICAgezB4NDAsIDB4NDAsIDB4NDAsIDB4MDB9LCAzLCAxfSwKLSAgICB7IlBTMiIsICAgICAgICAgICAgIFNURF9GTEcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgezB4YzAsIDB4MDAsIDB4MDAsIDB4MDB9LCAzLCAxfSwKLSAgICB7Ik1vdXNlU3lzdGVtcyIsICAgIENTOCB8IENTVE9QQiB8IFNURF9GTEcsICAgICAgICAgICAgIF9FVlRfbW91c2VfaW5pdCwgICAgezB4ZjgsIDB4ODAsIDB4MDAsIDB4MDB9LCA1LCA1fSwKLSAgICB7IkdQTSIsICAgICAgICAgICAgIENTOCB8IENTVE9QQiB8IFNURF9GTEcsICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgezB4ZjgsIDB4ODAsIDB4MDAsIDB4MDB9LCA1LCA1fSwKLSAgICB7Ik1NU2VyaWVzIiwgICAgICAgIENTOCB8IFBBUkVOQiB8IFBBUk9ERCB8IFNURF9GTEcsICAgIF9FVlRfbW91c2VfaW5pdCwgICAgezB4ZTAsIDB4ODAsIDB4ODAsIDB4MDB9LCAzLCAxfSwKLSAgICB7IkxvZ2l0ZWNoIiwgICAgICAgIENTOCB8IENTVE9QQiB8IFNURF9GTEcsICAgICAgICAgICAgIF9FVlRfbG9naXRlY2hfaW5pdCwgezB4ZTAsIDB4ODAsIDB4ODAsIDB4MDB9LCAzLCAzfSwKLSAgICB7IkJ1c01vdXNlIiwgICAgICAgIFNURF9GTEcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgezB4ZjgsIDB4ODAsIDB4MDAsIDB4MDB9LCAzLCAzfSwKLSAgICB7Ik1vdXNlTWFuIiwgICAgICAgIENTNyB8IFNURF9GTEcsICAgICAgICAgICAgICAgICAgICAgIF9FVlRfbW91c2VfaW5pdCwgICAgezB4NDAsIDB4NDAsIDB4NDAsIDB4MDB9LCAzLCAxfSwKLSAgICB7IkludGVsbGlNb3VzZSIsICAgIENTNyB8IFNURF9GTEcsICAgICAgICAgICAgICAgICAgICAgIF9FVlRfcG5wbW91c2VfaW5pdCwgezB4YzAsIDB4NDAsIDB4YzAsIDB4MDB9LCA0LCAxfSwKLSAgICB7IklNUFMyIiwgICAgICAgICAgIENTNyB8IFNURF9GTEcsICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgezB4YzAsIDB4NDAsIDB4YzAsIDB4MDB9LCA0LCAxfSwgLyogPyAqLwotICAgIH07Ci0KLSNkZWZpbmUgTkJfTUlDRSAoc2l6ZW9mKG1vdXNlX2luZm9zKS9zaXplb2YobW91c2VfaW5mbykpCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBhcmUgdXNlZCB0byBjaGFuZ2UgdGhlIGRlZmF1bHRzIGFib3ZlICovCi0KLSNkZWZpbmUgRU5WX01PVVNFRFJWICJNR0xfTU9VU0VEUlYiCi0jZGVmaW5lIEVOVl9NT1VTRURFViAiTUdMX01PVVNFREVWIgotI2RlZmluZSBFTlZfTU9VU0VTUEQgIk1HTF9NT1VTRVNQRCIKLSNkZWZpbmUgRU5WX0pPWURFVjAgICJNR0xfSk9ZREVWMSIKLSNkZWZpbmUgRU5WX0pPWURFVjEgICJNR0xfSk9ZREVWMiIKLQotLyogU2NhbmNvZGUgbWFwcGluZ3Mgb24gTGludXggZm9yIHNwZWNpYWwga2V5cyAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IHNjYW47Ci0gICAgaW50IG1hcDsKLSAgICB9IGtleW1hcDsKLQotLyogVE9ETzogRml4IHRoaXMgYW5kIHNldCBpdCB1cCBzbyB3ZSBjYW4gZG8gYSBiaW5hcnkgc2VhcmNoISAqLwotCi1rZXltYXAga2V5bWFwc1tdID0gewotICAgIHs5NiwgS0JfcGFkRW50ZXJ9LAotICAgIHs3NCwgS0JfcGFkTWludXN9LAotICAgIHs3OCwgS0JfcGFkUGx1c30sCi0gICAgezU1LCBLQl9wYWRUaW1lc30sCi0gICAgezk4LCBLQl9wYWREaXZpZGV9LAotICAgIHs3MSwgS0JfcGFkSG9tZX0sCi0gICAgezcyLCBLQl9wYWRVcH0sCi0gICAgezczLCBLQl9wYWRQYWdlVXB9LAotICAgIHs3NSwgS0JfcGFkTGVmdH0sCi0gICAgezc2LCBLQl9wYWRDZW50ZXJ9LAotICAgIHs3NywgS0JfcGFkUmlnaHR9LAotICAgIHs3OSwgS0JfcGFkRW5kfSwKLSAgICB7ODAsIEtCX3BhZERvd259LAotICAgIHs4MSwgS0JfcGFkUGFnZURvd259LAotICAgIHs4MiwgS0JfcGFkSW5zZXJ0fSwKLSAgICB7ODMsIEtCX3BhZERlbGV0ZX0sCi0gICAgezEwNSxLQl9sZWZ0fSwKLSAgICB7MTA4LEtCX2Rvd259LAotICAgIHsxMDYsS0JfcmlnaHR9LAotICAgIHsxMDMsS0JfdXB9LAotICAgIHsxMTAsS0JfaW5zZXJ0fSwKLSAgICB7MTAyLEtCX2hvbWV9LAotICAgIHsxMDQsS0JfcGFnZVVwfSwKLSAgICB7MTExLEtCX2RlbGV0ZX0sCi0gICAgezEwNyxLQl9lbmR9LAotICAgIHsxMDksS0JfcGFnZURvd259LAotICAgIHsxMjUsS0JfbGVmdFdpbmRvd3N9LAotICAgIHsxMjYsS0JfcmlnaHRXaW5kb3dzfSwKLSAgICB7MTI3LEtCX21lbnV9LAotICAgIHsxMDAsS0JfcmlnaHRBbHR9LAotICAgIHs5NyxLQl9yaWdodEN0cmx9LAotICAgIH07Ci0KLS8qIEFuZCB0aGUga2V5cGFkIHdpdGggbnVtIGxvY2sgdHVybmVkIG9uIChjaGFuZ2VzIHRoZSBBU0NJSSBjb2RlIG9ubHkpICovCi0KLWtleW1hcCBrZXlwYWRbXSA9IHsKLSAgICB7NzEsIEFTQ0lJXzd9LAotICAgIHs3MiwgQVNDSUlfOH0sCi0gICAgezczLCBBU0NJSV85fSwKLSAgICB7NzUsIEFTQ0lJXzR9LAotICAgIHs3NiwgQVNDSUlfNX0sCi0gICAgezc3LCBBU0NJSV82fSwKLSAgICB7NzksIEFTQ0lJXzF9LAotICAgIHs4MCwgQVNDSUlfMn0sCi0gICAgezgxLCBBU0NJSV8zfSwKLSAgICB7ODIsIEFTQ0lJXzB9LAotICAgIHs4MywgQVNDSUlfcGVyaW9kfSwKLSAgICB9OwotCi0jZGVmaW5lIE5CX0tFWU1BUFMgKHNpemVvZihrZXltYXBzKS9zaXplb2Yoa2V5bWFwc1swXSkpCi0jZGVmaW5lIE5CX0tFWVBBRCAoc2l6ZW9mKGtleXBhZCkvc2l6ZW9mKGtleXBhZFswXSkpCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgICAgIHNhbXBsZTsKLSAgICBjaGFyICAgIGNvZGVbMl07Ci0gICAgfSBzYW1wbGVfcmF0ZTsKLQotc2FtcGxlX3JhdGUgc2FtcGxldGFiW109ewotICAgIHsgIDAsIk8ifSwKLSAgICB7IDE1LCJKIn0sCi0gICAgeyAyNywiSyJ9LAotICAgIHsgNDIsIkwifSwKLSAgICB7IDYwLCJSIn0sCi0gICAgeyA4NSwiTSJ9LAotICAgIHsxMjUsIlEifSwKLSAgICB7MUU5LCJOIn0sCi0gICAgfTsKLQotLyogTnVtYmVyIG9mIGtleWNvZGVzIHRvIHJlYWQgYXQgYSB0aW1lIGZyb20gdGhlIGNvbnNvbGUgKi8KLQotI2RlZmluZSBLQkRSRUFEQlVGRkVSU0laRSAzMgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgTGludXggKi8KLSNkZWZpbmUgX0VWVF9kaXNhYmxlSW50KCkgICAgICAgMQotI2RlZmluZSBfRVZUX3Jlc3RvcmVJbnQoZmxhcHMpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdGVzdAotCi1SRU1BUktTOgotVGhpcyBtYWNybyBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKLXRpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9pc0tleURvd24oc2NhbkNvZGUpICAgIChrZXlVcE1zZ1tzY2FuQ29kZV0gIT0gMCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGlja3Mgc2luY2Ugc3lzdGVtCi1zdGFydHVwIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgdmFsdWUgdGhhdCBpcyBwbGFjZWQgaW50bwotdGhlIHRpbWUgc3RhbXAgZmllbGRzIG9mIGV2ZW50cywgYW5kIGlzIHVzZWQgdG8gaW1wbGVtZW50IGF1dG8gbW91c2UgZG93bgotZXZlbnRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9FVlRfZ2V0VGlja3Modm9pZCkKLXsKLSAgICBzdGF0aWMgdWludCAgICAgc3RhcnR0aW1lID0gMDsKLSAgICBzdHJ1Y3QgdGltZXZhbCAgdDsKLQotICAgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7Ci0gICAgaWYgKHN0YXJ0dGltZSA9PSAwKQotICAgICAgc3RhcnR0aW1lID0gdC50dl9zZWMgKiAxMDAwICsgKHQudHZfdXNlYy8xMDAwKTsKLSAgICByZXR1cm4gKCh0LnR2X3NlYyAqIDEwMDAgKyAodC50dl91c2VjLzEwMDApKSAtIHN0YXJ0dGltZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU21hbGwgVW5peCBmdW5jdGlvbiB0aGF0IGNoZWNrcyBmb3IgYXZhaWxhYmlsaXR5IG9uIGEgZmlsZSB1c2luZyBzZWxlY3QoKQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBkYXRhUmVhZHkoCi0gICAgaW50IGZkKQotewotICAgIHN0YXRpYyBzdHJ1Y3QgdGltZXZhbCAgIHQgPSB7IDBMLCAwTCB9OwotICAgIGZkX3NldCAgICAgICAgICAgICAgICAgIGZkczsKLQotICAgIEZEX1pFUk8oJmZkcyk7Ci0gICAgRkRfU0VUKGZkLCAmZmRzKTsKLSAgICByZXR1cm4gc2VsZWN0KGZkKzEsICZmZHMsIE5VTEwsIE5VTEwsICZ0KSA+IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZHMgbW91c2UgZGF0YSBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIG1vdXNlIGRyaXZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgcmVhZE1vdXNlRGF0YSgKLSAgICBpbnQgKmJ1dHRvbnMsCi0gICAgaW50ICpkeCwKLSAgICBpbnQgKmR5KQotewotICAgIHN0YXRpYyB1Y2hhciAgICBkYXRhWzMyXSxwcmV2ID0gMDsKLSAgICBpbnQgICAgICAgICAgICAgY250ID0gMCxyZXQ7Ci0gICAgbW91c2VfaW5mbyAgICAgICpkcnY7Ci0KLSAgICAvKiBSZWFkIHRoZSBmaXJzdCBieXRlIHRvIGNoZWNrIGZvciB0aGUgcHJvdG9jb2wgKi8KLSAgICBkcnYgPSAmbW91c2VfaW5mb3NbbW91c2VfZHJpdmVyXTsKLSAgICBpZiAocmVhZChfRVZUX21vdXNlX2ZkLCBkYXRhLCBkcnYtPnJlYWQpICE9IGRydi0+cmVhZCkgewotCXBlcnJvcigicmVhZCIpOwotCXJldHVybiBmYWxzZTsKLQl9Ci0gICAgaWYgKChkYXRhWzBdICYgZHJ2LT5wcm90b1swXSkgIT0gZHJ2LT5wcm90b1sxXSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAvKiBMb2FkIGEgd2hvbGUgcHJvdG9jb2wgcGFja2V0ICovCi0gICAgY250ICs9IGRydi0+cmVhZDsKLSAgICB3aGlsZSAoY250IDwgZHJ2LT5wYWNrZXRfbGVuKSB7Ci0JcmV0ID0gcmVhZChfRVZUX21vdXNlX2ZkLCBkYXRhK2NudCwgZHJ2LT5yZWFkKTsKLQlpZiAocmV0ID09IGRydi0+cmVhZCkKLQkgICAgY250ICs9IHJldDsKLQllbHNlIHsKLQkgICAgcGVycm9yKCJyZWFkIik7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICBpZiAoKGRhdGFbMV0gJiBkcnYtPnByb3RvWzJdKSAhPSBkcnYtPnByb3RvWzNdKQotCXJldHVybiBmYWxzZTsKLQotICAgIC8qIE5vdyBkZWNvZGUgdGhlIHByb3RvY29sIHBhY2tldCAqLwotICAgIHN3aXRjaCAobW91c2VfZHJpdmVyKSB7Ci0JY2FzZSBFVlRfbWljcm9zb2Z0OgotCSAgICBpZiAoZGF0YVswXSA9PSAweDQwICYmICEocHJldnxkYXRhWzFdfGRhdGFbMl0pKQotCQkqYnV0dG9ucyA9IDI7ICAgLyogVGhpcmQgYnV0dG9uIG9uIE1TIGNvbXBhdGlibGUgbW91c2UgKi8KLQkgICAgZWxzZQotCQkqYnV0dG9ucz0gKChkYXRhWzBdICYgMHgyMCkgPj4gMykgfCAoKGRhdGFbMF0gJiAweDEwKSA+PiA0KTsKLQkgICAgcHJldiA9ICpidXR0b25zOwotCSAgICAqZHggPSAoY2hhcikoKChkYXRhWzBdICYgMHgwMykgPDwgNikgfCAoZGF0YVsxXSAmIDB4M0YpKTsKLQkgICAgKmR5ID0gKGNoYXIpKCgoZGF0YVswXSAmIDB4MEMpIDw8IDQpIHwgKGRhdGFbMl0gJiAweDNGKSk7Ci0JICAgIGJyZWFrOwotCWNhc2UgRVZUX3BzMjoKLQkgICAgKmJ1dHRvbnMgPSAhIShkYXRhWzBdJjEpICogNCArICEhKGRhdGFbMF0mMikgKiAxICsgISEoZGF0YVswXSY0KSAqIDI7Ci0JICAgIGlmIChkYXRhWzFdICE9IDApCi0JCSpkeCA9IChkYXRhWzBdICYgMHgxMCkgPyBkYXRhWzFdLTI1NiA6IGRhdGFbMV07Ci0JICAgIGVsc2UKLQkJKmR4ID0gMDsKLQkgICAgaWYgKGRhdGFbMl0gIT0gMCkKLQkJKmR5ID0gLSgoZGF0YVswXSAmIDB4MjApID8gZGF0YVsyXS0yNTYgOiBkYXRhWzJdKTsKLQkgICAgZWxzZQotCQkqZHkgPSAwOwotCSAgICBicmVhazsKLQljYXNlIEVWVF9tb3VzZXN5c3RlbXM6IGNhc2UgRVZUX2dwbToKLQkgICAgKmJ1dHRvbnMgPSAofmRhdGFbMF0pICYgMHgwNzsKLQkgICAgKmR4ID0gKGNoYXIpKGRhdGFbMV0pICsgKGNoYXIpKGRhdGFbM10pOwotCSAgICAqZHkgPSAtKChjaGFyKShkYXRhWzJdKSArIChjaGFyKShkYXRhWzRdKSk7Ci0JICAgIGJyZWFrOwotCWNhc2UgRVZUX2xvZ2l0ZWNoOgotCSAgICAqYnV0dG9ucz0gZGF0YVswXSAmIDB4MDc7Ci0JICAgICpkeCA9IChkYXRhWzBdICYgMHgxMCkgPyAgIGRhdGFbMV0gOiAtIGRhdGFbMV07Ci0JICAgICpkeSA9IChkYXRhWzBdICYgMHgwOCkgPyAtIGRhdGFbMl0gOiAgIGRhdGFbMl07Ci0JICAgIGJyZWFrOwotCWNhc2UgRVZUX2J1c21vdXNlOgotCSAgICAqYnV0dG9ucz0gKH5kYXRhWzBdKSAmIDB4MDc7Ci0JICAgICpkeCA9IChjaGFyKWRhdGFbMV07Ci0JICAgICpkeSA9IC0oY2hhcilkYXRhWzJdOwotCSAgICBicmVhazsKLQljYXNlIEVWVF9NTXNlcmllczoKLQkgICAgKmJ1dHRvbnMgPSBkYXRhWzBdICYgMHgwNzsKLQkgICAgKmR4ID0gKGRhdGFbMF0gJiAweDEwKSA/ICAgZGF0YVsxXSA6IC0gZGF0YVsxXTsKLQkgICAgKmR5ID0gKGRhdGFbMF0gJiAweDA4KSA/IC0gZGF0YVsyXSA6ICAgZGF0YVsyXTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBFVlRfaW50ZWxsaW1vdXNlOgotCSAgICAqYnV0dG9ucyA9ICgoZGF0YVswXSAmIDB4MjApID4+IDMpICAvKiBsZWZ0ICovCi0JCSAgICAgfCAoKGRhdGFbM10gJiAweDEwKSA+PiAzKSAgLyogbWlkZGxlICovCi0JCSAgICAgfCAoKGRhdGFbMF0gJiAweDEwKSA+PiA0KTsgLyogcmlnaHQgKi8KLQkgICAgKmR4ID0gKGNoYXIpKCgoZGF0YVswXSAmIDB4MDMpIDw8IDYpIHwgKGRhdGFbMV0gJiAweDNGKSk7Ci0JICAgICpkeSA9IChjaGFyKSgoKGRhdGFbMF0gJiAweDBDKSA8PCA0KSB8IChkYXRhWzJdICYgMHgzRikpOwotCSAgICBicmVhazsKLQljYXNlIEVWVF9pbnRlbGxpbW91c2VfcHMyOgotCSAgICAqYnV0dG9ucyA9IChkYXRhWzBdICYgMHgwNCkgPj4gMSAvKiBNaWRkbGUgKi8KLQkJfCAoZGF0YVswXSAmIDB4MDIpID4+IDEgLyogUmlnaHQgKi8KLQkJfCAoZGF0YVswXSAmIDB4MDEpIDw8IDI7IC8qIExlZnQgKi8KLQkgICAgKmR4ID0gKGRhdGFbMF0gJiAweDEwKSA/ICAgIGRhdGFbMV0tMjU2ICA6ICBkYXRhWzFdOwotCSAgICAqZHkgPSAoZGF0YVswXSAmIDB4MjApID8gIC0oZGF0YVsyXS0yNTYpIDogLWRhdGFbMl07Ci0JICAgIGJyZWFrOwotCWNhc2UgRVZUX21vdXNlbWFuOiB7Ci0JICAgIHN0YXRpYyBpbnQgICAgICBnZXRleHRyYTsKLQkgICAgc3RhdGljIHVjaGFyICAgIHByZXY9MDsKLQkgICAgdWNoYXIgICAgICAgICAgIGI7Ci0KLQkgICAgLyogVGhlIGRhbW5lZCBNb3VzZU1hbiBoYXMgMy80IGJ5dGVzIHBhY2tldHMuIFRoZSBleHRyYSBieXRlCi0JICAgICAqIGlzIG9ubHkgdGhlcmUgaWYgdGhlIG1pZGRsZSBidXR0b24gaXMgYWN0aXZlLgotCSAgICAgKiBJIGdldCB0aGUgZXh0cmEgYnl0ZSBhcyBhIHBhY2tldCB3aXRoIG1hZ2ljIG51bWJlcnMgaW4gaXQuCi0JICAgICAqIGFuZCB0aGVuIHN3aXRjaCB0byA0LWJ5dGUgbW9kZS4KLQkgICAgICovCi0JICAgIGlmIChkYXRhWzFdID09IDB4QUEgJiYgZGF0YVsyXSA9PSAweDU1KSB7Ci0JCS8qIEdvdCB1bmV4cGVjdGVkIGZvdXJ0aCBieXRlICovCi0JCWlmICgoYiA9ICgqZGF0YT4+NCkpID4gMHgzKQotCQkgICAgcmV0dXJuIGZhbHNlOyAgLyoganVzdCBhIHNhbml0eSBjaGVjayAqLwotCQkqZHggPSAqZHkgPSAwOwotCQlkcnYtPnBhY2tldF9sZW49NDsKLQkJZ2V0ZXh0cmE9MDsKLQkJfQotCSAgICBlbHNlIHsKLQkJLyogR290IDMvNCwgYXMgZXhwZWN0ZWQgKi8KLQkJLyogTW90aW9uIGlzIGluZGVwZW5kZW50IG9mIHBhY2tldGxlbi4uLiAqLwotCQkqZHggPSAoY2hhcikoKChkYXRhWzBdICYgMHgwMykgPDwgNikgfCAoZGF0YVsxXSAmIDB4M0YpKTsKLQkJKmR5ID0gKGNoYXIpKCgoZGF0YVswXSAmIDB4MEMpIDw8IDQpIHwgKGRhdGFbMl0gJiAweDNGKSk7Ci0JCXByZXYgPSAoKGRhdGFbMF0gJiAweDIwKSA+PiAzKSB8ICgoZGF0YVswXSAmIDB4MTApID4+IDQpOwotCQlpZiAoZHJ2LT5wYWNrZXRfbGVuPT00KQotCQkgICAgYiA9IGRhdGFbM10+PjQ7Ci0JCX0KLQkgICAgaWYgKGRydi0+cGFja2V0X2xlbiA9PSA0KSB7Ci0JCWlmIChiID09IDApIHsKLQkJICAgIGRydi0+cGFja2V0X2xlbiA9IDM7Ci0JCSAgICBnZXRleHRyYSA9IDE7Ci0JCSAgICB9Ci0JCWVsc2UgewotCQkgICAgaWYgKGIgJiAweDIpCi0JCQlwcmV2IHw9IDI7Ci0JCSAgICB9Ci0JCX0KLQkgICAgKmJ1dHRvbnMgPSBwcmV2OwotCi0JICAgIC8qIFRoaXMgImNob3JkLW1pZGRsZSIgYmVoYXZpb3VyIHdhcyByZXBvcnRlZCBieSBEYXZpZCBBLiB2YW4gTGVldXdlbiAqLwotCSAgICBpZiAoKChwcmV2IF4gKmJ1dHRvbnMpICYgNSkgPT0gNSkKLQkJKmJ1dHRvbnMgPSAqYnV0dG9ucyA/IDIgOiAwOwotCSAgICBwcmV2ID0gKmJ1dHRvbnM7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JY2FzZSBFVlRfbm9Nb3VzZToKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgICBicmVhazsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEga2V5cHJlc3MgdmlhIHRoZSBrZXkgbWFwcGluZyB0YWJsZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgZ2V0S2V5TWFwcGluZygKLSAgICBrZXltYXAgKnRhYiwKLSAgICBpbnQgbmIsCi0gICAgaW50IGtleSkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvcihpID0gMDsgaSA8IG5iOyBpKyspIHsKLQlpZiAodGFiW2ldLnNjYW4gPT0ga2V5KQotCSAgICByZXR1cm4gdGFiW2ldLm1hcDsKLQl9Ci0gICAgcmV0dXJuIGtleTsKLX0KLQotI2lmZGVmIFVTRV9PU19KT1lTVElDSwotCi1zdGF0aWMgY2hhciBqczBfYXhlcyA9IDAsIGpzMF9idXR0b25zID0gMDsKLXN0YXRpYyBjaGFyIGpzMV9heGVzID0gMCwganMxX2J1dHRvbnMgPSAwOwotc3RhdGljIGNoYXIgam95c3RpY2swX2RldlsyMF0gPSAiL2Rldi9qczAiOwotc3RhdGljIGNoYXIgam95c3RpY2sxX2RldlsyMF0gPSAiL2Rldi9qczEiOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNyZWF0ZSBhIGpveXN0aWNrIGV2ZW50IGZyb20gdGhlIGpveXN0aWNrIGRhdGEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBtYWtlSm95RXZlbnQoCi0gICAgZXZlbnRfdCAqZXZ0KQotewotICAgIGV2dC0+bWVzc2FnZSA9IDA7Ci0gICAgaWYgKGJ1dHMwICYmIGF4aXMwKSB7Ci0JaWYgKGJ1dHMwWzBdKSBldnQtPm1lc3NhZ2UgfD0gRVZUX0pPWTFfQlVUVE9OQTsKLQlpZiAoYnV0czBbMV0pIGV2dC0+bWVzc2FnZSB8PSBFVlRfSk9ZMV9CVVRUT05COwotCWV2dC0+d2hlcmVfeCA9IGF4aXMwWzBdOwotCWV2dC0+d2hlcmVfeSA9IGF4aXMwWzFdOwotCX0KLSAgICBlbHNlCi0JZXZ0LT53aGVyZV94ID0gZXZ0LT53aGVyZV95ID0gMDsKLSAgICBpZiAoYnV0czEgJiYgYXhpczEpIHsKLQlpZiAoYnV0czFbMF0pIGV2dC0+bWVzc2FnZSB8PSBFVlRfSk9ZMl9CVVRUT05BOwotCWlmIChidXRzMVsxXSkgZXZ0LT5tZXNzYWdlIHw9IEVWVF9KT1kyX0JVVFRPTkI7Ci0JZXZ0LT53aGVyZV94ID0gYXhpczFbMF07Ci0JZXZ0LT53aGVyZV95ID0gYXhpczFbMV07Ci0JfQotICAgIGVsc2UKLQlldnQtPndoZXJlX3ggPSBldnQtPndoZXJlX3kgPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGpveXN0aWNrIGF4aXMgZGF0YQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBFVlRBUEkgX0VWVF9yZWFkSm95QXhpcygKLSAgICBpbnQgam1hc2ssCi0gICAgaW50ICpheGlzKQotewotICAgIGludCBtYXNrID0gMDsKLQotICAgIGlmICgoanNfdmVyc2lvbiAmIH4weGZmZmYpID09IDApIHsKLQkvKiBPbGQgMC54IGRyaXZlciAqLwotCXN0cnVjdCBKU19EQVRBX1RZUEUganM7Ci0JaWYgKGpveXN0aWNrMF9mZCAmJiByZWFkKGpveXN0aWNrMF9mZCwgJmpzLCBKU19SRVRVUk4pID09IEpTX1JFVFVSTikgewotCSAgICBpZiAoam1hc2sgJiBFVlRfSk9ZX0FYSVNfWDEpCi0JCWF4aXNbMF0gPSBqcy54OwotCSAgICBpZiAoam1hc2sgJiBFVlRfSk9ZX0FYSVNfWTEpCi0JCWF4aXNbMV0gPSBqcy55OwotCSAgICBtYXNrIHw9IEVWVF9KT1lfQVhJU19YMXxFVlRfSk9ZX0FYSVNfWTE7Ci0JICAgIH0KLQlpZiAoam95c3RpY2sxX2ZkICYmIHJlYWQoam95c3RpY2sxX2ZkLCAmanMsIEpTX1JFVFVSTikgPT0gSlNfUkVUVVJOKSB7Ci0JICAgIGlmIChqbWFzayAmIEVWVF9KT1lfQVhJU19YMikKLQkJYXhpc1syXSA9IGpzLng7Ci0JICAgIGlmIChqbWFzayAmIEVWVF9KT1lfQVhJU19ZMikKLQkJYXhpc1szXSA9IGpzLnk7Ci0JICAgIG1hc2sgfD0gRVZUX0pPWV9BWElTX1gyfEVWVF9KT1lfQVhJU19ZMjsKLQkgICAgfQotCX0KLSAgICBlbHNlIHsKLQlpZiAoYXhpczApIHsKLQkgICAgaWYgKGptYXNrICYgRVZUX0pPWV9BWElTX1gxKQotCQlheGlzWzBdID0gYXhpczBbMF07Ci0JICAgIGlmIChqbWFzayAmIEVWVF9KT1lfQVhJU19ZMSkKLQkJYXhpc1sxXSA9IGF4aXMwWzFdOwotCSAgICBtYXNrIHw9IEVWVF9KT1lfQVhJU19YMSB8IEVWVF9KT1lfQVhJU19ZMTsKLQkgICAgfQotCWlmIChheGlzMSkgewotCSAgICBpZiAoam1hc2sgJiBFVlRfSk9ZX0FYSVNfWDIpCi0JCWF4aXNbMl0gPSBheGlzMVswXTsKLQkgICAgaWYgKGptYXNrICYgRVZUX0pPWV9BWElTX1kyKQotCQlheGlzWzNdID0gYXhpczFbMV07Ci0JICAgIG1hc2sgfD0gRVZUX0pPWV9BWElTX1gyIHwgRVZUX0pPWV9BWElTX1kyOwotCSAgICB9Ci0JfQotICAgIHJldHVybiBtYXNrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGpveXN0aWNrIGJ1dHRvbiBkYXRhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IEVWVEFQSSBfRVZUX3JlYWRKb3lCdXR0b25zKHZvaWQpCi17Ci0gICAgaW50IGJ1dHMgPSAwOwotCi0gICAgaWYgKChqc192ZXJzaW9uICYgfjB4ZmZmZikgPT0gMCkgewotCS8qIE9sZCAwLnggZHJpdmVyICovCi0Jc3RydWN0IEpTX0RBVEFfVFlQRSBqczsKLQlpZiAoam95c3RpY2swX2ZkICYmIHJlYWQoam95c3RpY2swX2ZkLCAmanMsIEpTX1JFVFVSTikgPT0gSlNfUkVUVVJOKQotCSAgICBidXRzID0ganMuYnV0dG9uczsKLQlpZiAoam95c3RpY2sxX2ZkICYmIHJlYWQoam95c3RpY2sxX2ZkLCAmanMsIEpTX1JFVFVSTikgPT0gSlNfUkVUVVJOKQotCSAgICBidXRzIHw9IGpzLmJ1dHRvbnMgPDwgMjsKLQl9Ci0gICAgZWxzZSB7Ci0JaWYgKGJ1dHMwKQotCSAgICBidXRzIHw9IEVWVF9KT1kxX0JVVFRPTkEqYnV0czBbMF0gKyBFVlRfSk9ZMV9CVVRUT05CKmJ1dHMwWzFdOwotCWlmIChidXRzMSkKLQkgICAgYnV0cyB8PSBFVlRfSk9ZMl9CVVRUT05BKmJ1dHMxWzBdICsgRVZUX0pPWTJfQlVUVE9OQipidXRzMVsxXTsKLQl9Ci0gICAgcmV0dXJuIGJ1dHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIG1hc2sgaW5kaWNhdGluZyB3aGF0IGpveXN0aWNrIGF4ZXMgYXJlIGF0dGFjaGVkLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBhdHRhY2hlZCBqb3lzdGlja3MsIGFuZCBkZXRlcm1pbmUKLXdoYXQgYXhlcyBhcmUgcHJlc2VudCBhbmQgZnVuY3Rpb25pbmcuIFRoaXMgZnVuY3Rpb24gd2lsbCByZS1kZXRlY3QgYW55Ci1hdHRhY2hlZCBqb3lzdGlja3Mgd2hlbiBpdCBpcyBjYWxsZWQsIHNvIGlmIHRoZSB1c2VyIGZvcmdvdCB0byBhdHRhY2gKLXRoZSBqb3lzdGljayB3aGVuIHRoZSBhcHBsaWNhdGlvbiBzdGFydGVkLCB5b3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0bwotcmUtZGV0ZWN0IGFueSBuZXdseSBhdHRhY2hlZCBqb3lzdGlja3MuCi0KLVNFRSBBTFNPOgotRVZUX2pveVNldExvd2VyUmlnaHQsIEVWVF9qb3lTZXRDZW50ZXIsIEVWVF9qb3lJc1ByZXNlbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgRVZUQVBJIEVWVF9qb3lJc1ByZXNlbnQodm9pZCkKLXsKLSAgICBzdGF0aWMgaW50ICAgICAgbWFzayA9IDA7Ci0gICAgaW50ICAgICAgICAgICAgIGk7Ci0gICAgY2hhciAgICAgICAgICAgICp0bXAsIG5hbWUwWzEyOF0sIG5hbWUxWzEyOF07Ci0gICAgc3RhdGljIGlib29sICAgIGluaXRlZCA9IGZhbHNlOwotCi0gICAgaWYgKGluaXRlZCkKLQlyZXR1cm4gbWFzazsKLSAgICBtZW1zZXQoRVZULmpveU1pbiwwLHNpemVvZihFVlQuam95TWluKSk7Ci0gICAgbWVtc2V0KEVWVC5qb3lDZW50ZXIsMCxzaXplb2YoRVZULmpveUNlbnRlcikpOwotICAgIG1lbXNldChFVlQuam95TWF4LDAsc2l6ZW9mKEVWVC5qb3lNYXgpKTsKLSAgICBtZW1zZXQoRVZULmpveVByZXYsMCxzaXplb2YoRVZULmpveVByZXYpKTsKLSAgICBFVlQuam95QnV0U3RhdGUgPSAwOwotICAgIGlmICgodG1wID0gZ2V0ZW52KEVOVl9KT1lERVYwKSkgIT0gTlVMTCkKLQlzdHJjcHkoam95c3RpY2swX2Rldix0bXApOwotICAgIGlmICgodG1wID0gZ2V0ZW52KEVOVl9KT1lERVYxKSkgIT0gTlVMTCkKLQlzdHJjcHkoam95c3RpY2sxX2Rldix0bXApOwotICAgIGlmICgoam95c3RpY2swX2ZkID0gb3Blbihqb3lzdGljazBfZGV2LCBPX1JET05MWSkpIDwgMCkKLQlqb3lzdGljazBfZmQgPSAwOwotICAgIGlmICgoam95c3RpY2sxX2ZkID0gb3Blbihqb3lzdGljazFfZGV2LCBPX1JET05MWSkpIDwgMCkKLQlqb3lzdGljazFfZmQgPSAwOwotICAgIGlmICgham95c3RpY2swX2ZkICYmICFqb3lzdGljazFfZmQpIC8qIE5vIGpveXN0aWNrcyBkZXRlY3RlZCAqLwotCXJldHVybiAwOwotICAgIGluaXRlZCA9IHRydWU7Ci0gICAgaWYgKGlvY3RsKGpveXN0aWNrMF9mZCA/IGpveXN0aWNrMF9mZCA6IGpveXN0aWNrMV9mZCwgSlNJT0NHVkVSU0lPTiwgJmpzX3ZlcnNpb24pIDwgMCkKLQlyZXR1cm4gMDsKLQotICAgIC8qIEluaXRpYWxpc2Ugam95c3RpY2sgMCAqLwotICAgIGlmIChqb3lzdGljazBfZmQpIHsKLQlpb2N0bChqb3lzdGljazBfZmQsIEpTSU9DR05BTUUoc2l6ZW9mKG5hbWUwKSksIG5hbWUwKTsKLQlpZiAoanNfdmVyc2lvbiAmIH4weGZmZmYpIHsKLQkgICAgc3RydWN0IGpzX2V2ZW50IGpzOwotCi0JICAgIGlvY3RsKGpveXN0aWNrMF9mZCwgSlNJT0NHQVhFUywgJmpzMF9heGVzKTsKLQkgICAgaW9jdGwoam95c3RpY2swX2ZkLCBKU0lPQ0dCVVRUT05TLCAmanMwX2J1dHRvbnMpOwotCSAgICBheGlzMCA9IFBNX2NhbGxvYygoaW50KWpzMF9heGVzLCBzaXplb2Yoc2hvcnQpKTsKLQkgICAgYnV0czAgPSBQTV9tYWxsb2MoKGludClqczBfYnV0dG9ucyk7Ci0JICAgIC8qIFJlYWQgdGhlIGluaXRpYWwgZXZlbnRzICovCi0JICAgIHdoaWxlKGRhdGFSZWFkeShqb3lzdGljazBfZmQpCi0JCSAgJiYgcmVhZChqb3lzdGljazBfZmQsICZqcywgc2l6ZW9mKHN0cnVjdCBqc19ldmVudCkpID09IHNpemVvZihzdHJ1Y3QganNfZXZlbnQpCi0JCSAgJiYgKGpzLnR5cGUgJiBKU19FVkVOVF9JTklUKQotCQkgICkgewotCQlpZiAoanMudHlwZSAmIEpTX0VWRU5UX0JVVFRPTikKLQkJICAgIGJ1dHMwW2pzLm51bWJlcl0gPSBqcy52YWx1ZTsKLQkJZWxzZSBpZiAoanMudHlwZSAmIEpTX0VWRU5UX0FYSVMpCi0JCSAgICBheGlzMFtqcy5udW1iZXJdID0gc2NhbGVKb3lBeGlzKGpzLnZhbHVlLGpzLm51bWJlcik7Ci0JCX0KLQkgICAgfQotCWVsc2UgewotCSAgICBqczBfYXhlcyA9IDI7Ci0JICAgIGpzMF9idXR0b25zID0gMjsKLQkgICAgYXhpczAgPSBQTV9jYWxsb2MoKGludClqczBfYXhlcywgc2l6ZW9mKHNob3J0KSk7Ci0JICAgIGJ1dHMwID0gUE1fbWFsbG9jKChpbnQpanMwX2J1dHRvbnMpOwotCSAgICB9Ci0JfQotCi0gICAgLyogSW5pdGlhbGlzZSBqb3lzdGljayAxICovCi0gICAgaWYgKGpveXN0aWNrMV9mZCkgewotCWlvY3RsKGpveXN0aWNrMV9mZCwgSlNJT0NHTkFNRShzaXplb2YobmFtZTEpKSwgbmFtZTEpOwotCWlmIChqc192ZXJzaW9uICYgfjB4ZmZmZikgewotCSAgICBzdHJ1Y3QganNfZXZlbnQganM7Ci0KLQkgICAgaW9jdGwoam95c3RpY2sxX2ZkLCBKU0lPQ0dBWEVTLCAmanMxX2F4ZXMpOwotCSAgICBpb2N0bChqb3lzdGljazFfZmQsIEpTSU9DR0JVVFRPTlMsICZqczFfYnV0dG9ucyk7Ci0JICAgIGF4aXMxID0gUE1fY2FsbG9jKChpbnQpanMxX2F4ZXMsIHNpemVvZihzaG9ydCkpOwotCSAgICBidXRzMSA9IFBNX21hbGxvYygoaW50KWpzMV9idXR0b25zKTsKLQkgICAgLyogUmVhZCB0aGUgaW5pdGlhbCBldmVudHMgKi8KLQkgICAgd2hpbGUoZGF0YVJlYWR5KGpveXN0aWNrMV9mZCkKLQkJICAmJiByZWFkKGpveXN0aWNrMV9mZCwgJmpzLCBzaXplb2Yoc3RydWN0IGpzX2V2ZW50KSk9PXNpemVvZihzdHJ1Y3QganNfZXZlbnQpCi0JCSAgJiYgKGpzLnR5cGUgJiBKU19FVkVOVF9JTklUKQotCQkgICkgewotCQlpZiAoanMudHlwZSAmIEpTX0VWRU5UX0JVVFRPTikKLQkJICAgIGJ1dHMxW2pzLm51bWJlcl0gPSBqcy52YWx1ZTsKLQkJZWxzZSBpZiAoanMudHlwZSAmIEpTX0VWRU5UX0FYSVMpCi0JCSAgICBheGlzMVtqcy5udW1iZXJdID0gc2NhbGVKb3lBeGlzKGpzLnZhbHVlLGpzLm51bWJlcjw8Mik7Ci0JCX0KLQkgICAgfQotCWVsc2UgewotCSAgICBqczFfYXhlcyA9IDI7Ci0JICAgIGpzMV9idXR0b25zID0gMjsKLQkgICAgYXhpczEgPSBQTV9jYWxsb2MoKGludClqczFfYXhlcywgc2l6ZW9mKHNob3J0KSk7Ci0JICAgIGJ1dHMxID0gUE1fbWFsbG9jKChpbnQpanMxX2J1dHRvbnMpOwotCSAgICB9Ci0JfQotCi0jaWZkZWYgIENIRUNLRUQKLSAgICBmcHJpbnRmKHN0ZGVyciwiVXNpbmcgam95c3RpY2sgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWRcbiIsCi0JICAgIGpzX3ZlcnNpb24gPj4gMTYsIChqc192ZXJzaW9uID4+IDgpICYgMHhmZiwganNfdmVyc2lvbiAmIDB4ZmYpOwotICAgIGlmIChqb3lzdGljazBfZmQpCi0JZnByaW50ZihzdGRlcnIsIkpveXN0aWNrIDEgKCVzKTogJXNcbiIsIGpveXN0aWNrMF9kZXYsIG5hbWUwKTsKLSAgICBpZiAoam95c3RpY2sxX2ZkKQotCWZwcmludGYoc3RkZXJyLCJKb3lzdGljayAyICglcyk6ICVzXG4iLCBqb3lzdGljazFfZGV2LCBuYW1lMSk7Ci0jZW5kaWYKLSAgICBtYXNrID0gX0VWVF9yZWFkSm95QXhpcyhFVlRfSk9ZX0FYSVNfQUxMLEVWVC5qb3lDZW50ZXIpOwotICAgIGlmIChtYXNrKSB7Ci0JZm9yIChpID0gMDsgaSA8IEpPWV9OVU1fQVhFUzsgaSsrKQotCSAgICBFVlQuam95TWF4W2ldID0gRVZULmpveUNlbnRlcltpXSoyOwotCX0KLSAgICByZXR1cm4gbWFzazsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUG9sbHMgdGhlIGpveXN0aWNrIGZvciBwb3NpdGlvbiBhbmQgYnV0dG9uIGluZm9ybWF0aW9uLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1UaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBwb2xsIGFuYWxvZ3VlIGpveXN0aWNrcyBmb3IgYnV0dG9uIGFuZCBwb3NpdGlvbgotaW5mb3JtYXRpb24uIEl0IHNob3VsZCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBtYWluIGxvb3Agb2YgdGhlIHVzZXIKLWFwcGxpY2F0aW9uLCBqdXN0IGJlZm9yZSBwcm9jZXNzaW5nIGFsbCBwZW5kaW5nIGV2ZW50cyB2aWEgRVZUX2dldE5leHQuCi1BbGwgaW5mb3JtYXRpb24gcG9sbGVkIGZyb20gdGhlIGpveXN0aWNrIHdpbGwgYmUgcG9zdGVkIHRvIHRoZSBldmVudAotcXVldWUgZm9yIGxhdGVyIHJldHJpZXZhbC4KLQotTm90ZTogICBNb3N0IGFuYWxvZ3VlIGpveXN0aWNrcyB3aWxsIHByb3ZpZGUgcmVhZGluZ3MgdGhhdCBjaGFuZ2UgZXZlbgotCXRob3VnaCB0aGUgam95c3RpY2sgaGFzIG5vdCBtb3ZlZC4gSGVuY2UgaWYgeW91IGNhbGwgdGhpcyByb3V0aW5lCi0JeW91IHdpbGwgbGlrZWx5IGdldCBhbiBFVlRfSk9ZTU9WRSBldmVudCBldmVyeSB0aW1lIHRocm91Z2ggeW91cgotCWV2ZW50IGxvb3AuCi0KLVNFRSBBTFNPOgotRVZUX2dldE5leHQsIEVWVF9wZWVrTmV4dCwgRVZUX2pveVNldFVwcGVyTGVmdCwgRVZUX2pveVNldExvd2VyUmlnaHQsCi1FVlRfam95U2V0Q2VudGVyLCBFVlRfam95SXNQcmVzZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3BvbGxKb3lzdGljayh2b2lkKQotewotICAgIGV2ZW50X3QgZXZ0OwotICAgIGludCAgICAgaSxheGlzW0pPWV9OVU1fQVhFU10sbmV3QnV0U3RhdGUsbWFzayxtb3ZlZCxwczsKLQotICAgIGlmICgoanNfdmVyc2lvbiAmIH4weEZGRkYpID09IDAgJiYgRVZULmpveU1hc2spIHsKLQkvKiBSZWFkIGpveXN0aWNrIGF4ZXMgYW5kIHBvc3QgbW92ZW1lbnQgZXZlbnRzIGlmIHRoZXkgaGF2ZQotCSAqIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBwb2xsZWQuIFVudGlsIHRoZSBldmVudHMgYXJlCi0JICogYWN0dWFsbHkgZmx1c2hlZCwgd2Uga2VlcCBtb2RpZnlpbmcgdGhlIHNhbWUgam95c3RpY2sgbW92ZW1lbnQKLQkgKiBldmVudCwgc28geW91IHdvbid0IGdldCBtdWx0aXBsZSBtb3ZlbWVudCBldmVudAotCSAqLwotCW1hc2sgPSBfRVZUX3JlYWRKb3lBeGlzKEVWVC5qb3lNYXNrLGF4aXMpOwotCW5ld0J1dFN0YXRlID0gX0VWVF9yZWFkSm95QnV0dG9ucygpOwotCW1vdmVkID0gZmFsc2U7Ci0JZm9yIChpID0gMDsgaSA8IEpPWV9OVU1fQVhFUzsgaSsrKSB7Ci0JICAgIGlmIChtYXNrICYgKEVWVF9KT1lfQVhJU19YMSA8PCBpKSkKLQkJYXhpc1tpXSA9IHNjYWxlSm95QXhpcyhheGlzW2ldLGkpOwotCSAgICBlbHNlCi0JCWF4aXNbaV0gPSBFVlQuam95UHJldltpXTsKLQkgICAgaWYgKGF4aXNbaV0gIT0gRVZULmpveVByZXZbaV0pCi0JCW1vdmVkID0gdHJ1ZTsKLQkgICAgfQotCWlmIChtb3ZlZCkgewotCSAgICBtZW1jcHkoRVZULmpveVByZXYsYXhpcyxzaXplb2YoRVZULmpveVByZXYpKTsKLQkgICAgcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsKLQkgICAgaWYgKEVWVC5vbGRKb3lNb3ZlICE9IC0xKSB7Ci0JCS8qIE1vZGlmeSB0aGUgZXhpc3Rpbmcgam95c3RpY2sgbW92ZW1lbnQgZXZlbnQgKi8KLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLm1lc3NhZ2UgPSBuZXdCdXRTdGF0ZTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLndoZXJlX3ggPSBFVlQuam95UHJldlswXTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLndoZXJlX3kgPSBFVlQuam95UHJldlsxXTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLnJlbGF0aXZlX3ggPSBFVlQuam95UHJldlsyXTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLnJlbGF0aXZlX3kgPSBFVlQuam95UHJldlszXTsKLQkJfQotCSAgICBlbHNlIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0JCS8qIEFkZCBhIG5ldyBqb3lzdGljayBtb3ZlbWVudCBldmVudCAqLwotCQlFVlQub2xkSm95TW92ZSA9IEVWVC5mcmVlSGVhZDsKLQkJbWVtc2V0KCZldnQsMCxzaXplb2YoZXZ0KSk7Ci0JCWV2dC53aGF0ID0gRVZUX0pPWU1PVkU7Ci0JCWV2dC5tZXNzYWdlID0gRVZULmpveUJ1dFN0YXRlOwotCQlldnQud2hlcmVfeCA9IEVWVC5qb3lQcmV2WzBdOwotCQlldnQud2hlcmVfeSA9IEVWVC5qb3lQcmV2WzFdOwotCQlldnQucmVsYXRpdmVfeCA9IEVWVC5qb3lQcmV2WzJdOwotCQlldnQucmVsYXRpdmVfeSA9IEVWVC5qb3lQcmV2WzNdOwotCQlhZGRFdmVudCgmZXZ0KTsKLQkJfQotCSAgICBfRVZUX3Jlc3RvcmVJbnQocHMpOwotCSAgICB9Ci0KLQkvKiBSZWFkIHRoZSBqb3lzdGljayBidXR0b25zLCBhbmQgcG9zdCBldmVudHMgdG8gcmVmbGVjdCB0aGUgY2hhbmdlCi0JICogaW4gc3RhdGUgZm9yIHRoZSBqb3lzdGljayBidXR0b25zLgotCSAqLwotCWlmIChuZXdCdXRTdGF0ZSAhPSBFVlQuam95QnV0U3RhdGUpIHsKLQkgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKLQkJLyogQWRkIGEgbmV3IGpveXN0aWNrIG1vdmVtZW50IGV2ZW50ICovCi0JCXBzID0gX0VWVF9kaXNhYmxlSW50KCk7Ci0JCW1lbXNldCgmZXZ0LDAsc2l6ZW9mKGV2dCkpOwotCQlldnQud2hhdCA9IEVWVF9KT1lDTElDSzsKLQkJZXZ0Lm1lc3NhZ2UgPSBuZXdCdXRTdGF0ZTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLndoZXJlX3ggPSBFVlQuam95UHJldlswXTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLndoZXJlX3kgPSBFVlQuam95UHJldlsxXTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLnJlbGF0aXZlX3ggPSBFVlQuam95UHJldlsyXTsKLQkJRVZULmV2dHFbRVZULm9sZEpveU1vdmVdLnJlbGF0aXZlX3kgPSBFVlQuam95UHJldlszXTsKLQkJYWRkRXZlbnQoJmV2dCk7Ci0JCV9FVlRfcmVzdG9yZUludChwcyk7Ci0JCX0KLQkgICAgRVZULmpveUJ1dFN0YXRlID0gbmV3QnV0U3RhdGU7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUNhbGlicmF0ZXMgdGhlIGpveXN0aWNrIHVwcGVyIGxlZnQgcG9zaXRpb24KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAotd2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwotdGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgotVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgdXBwZXIgbGVmdAotcG9zaXRpb24gYW5kIHRoZW4gaGF2ZSB0aGVtIHByZXNzIGEga2V5IG9yIGJ1dHRvbi4gYW5kIHRoZW4gY2FsbCB0aGlzCi1mdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB3aWxsIHRoZW4gcmVhZCB0aGUgam95c3RpY2sgYW5kIHVwZGF0ZSB0aGUKLWNhbGlicmF0aW9uIGZhY3RvcnMuCi0KLVVzdWFsbHksIGFzc3VtaW5nIHRoYXQgdGhlIHN0aWNrIHdhcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IHdhcwotaW5pdGlhbGl6ZWQsIHlvdSByZWFsbHkgb25seSBuZWVkIHRvIGNhbGwgRVZUX2pveVNldExvd2VyUmlnaHQgc2luY2UgdGhlCi11cHBlciBsZWZ0IHBvc2l0aW9uIGlzIHVzdWFsbHkgYWx3YXlzIDAsMCBvbiBtb3N0IGpveXN0aWNrcy4gSG93ZXZlciwgdGhlCi1zYWZlc3QgcHJvY2VkdXJlIGlzIHRvIGNhbGwgYWxsIHRocmVlIGNhbGlicmF0aW9uIGZ1bmN0aW9ucy4KLQotU0VFIEFMU086Ci1FVlRfam95U2V0VXBwZXJMZWZ0LCBFVlRfam95U2V0TG93ZXJSaWdodCwgRVZUX2pveUlzUHJlc2VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9qb3lTZXRVcHBlckxlZnQodm9pZCkKLXsKLSAgICBfRVZUX3JlYWRKb3lBeGlzKEVWVF9KT1lfQVhJU19BTEwsRVZULmpveU1pbik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUNhbGlicmF0ZXMgdGhlIGpveXN0aWNrIGxvd2VyIHJpZ2h0IHBvc2l0aW9uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gemVybyBpbiBvbiBiZXR0ZXIgam95c3RpY2sgY2FsaWJyYXRpb24gZmFjdG9ycywKLXdoaWNoIG1heSB3b3JrIGJldHRlciB0aGFuIHRoZSBkZWZhdWx0IHNpbXBsaXN0aWMgY2FsaWJyYXRpb24gKHdoaWNoIGFzc3VtZXMKLXRoZSBqb3lzdGljayBpcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IGlzIGluaXRpYWxpc2VkKS4KLVRvIHVzZSB0aGlzIGZ1bmN0aW9uLCBhc2sgdGhlIHVzZXIgdG8gaG9sZCB0aGUgc3RpY2sgaW4gdGhlIGxvd2VyIHJpZ2h0Ci1wb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKLWZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQotY2FsaWJyYXRpb24gZmFjdG9ycy4KLQotVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCi1pbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKLXVwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKLXNhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgotCi1TRUUgQUxTTzoKLUVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRDZW50ZXIsIEVWVF9qb3lJc1ByZXNlbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfam95U2V0TG93ZXJSaWdodCh2b2lkKQotewotICAgIF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95TWF4KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgY2VudGVyIHBvc2l0aW9uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gemVybyBpbiBvbiBiZXR0ZXIgam95c3RpY2sgY2FsaWJyYXRpb24gZmFjdG9ycywKLXdoaWNoIG1heSB3b3JrIGJldHRlciB0aGFuIHRoZSBkZWZhdWx0IHNpbXBsaXN0aWMgY2FsaWJyYXRpb24gKHdoaWNoIGFzc3VtZXMKLXRoZSBqb3lzdGljayBpcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IGlzIGluaXRpYWxpc2VkKS4KLVRvIHVzZSB0aGlzIGZ1bmN0aW9uLCBhc2sgdGhlIHVzZXIgdG8gaG9sZCB0aGUgc3RpY2sgaW4gdGhlIGNlbnRlcgotcG9zaXRpb24gYW5kIHRoZW4gaGF2ZSB0aGVtIHByZXNzIGEga2V5IG9yIGJ1dHRvbi4gYW5kIHRoZW4gY2FsbCB0aGlzCi1mdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB3aWxsIHRoZW4gcmVhZCB0aGUgam95c3RpY2sgYW5kIHVwZGF0ZSB0aGUKLWNhbGlicmF0aW9uIGZhY3RvcnMuCi0KLVVzdWFsbHksIGFzc3VtaW5nIHRoYXQgdGhlIHN0aWNrIHdhcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IHdhcwotaW5pdGlhbGl6ZWQsIHlvdSByZWFsbHkgb25seSBuZWVkIHRvIGNhbGwgRVZUX2pveVNldExvd2VyUmlnaHQgc2luY2UgdGhlCi11cHBlciBsZWZ0IHBvc2l0aW9uIGlzIHVzdWFsbHkgYWx3YXlzIDAsMCBvbiBtb3N0IGpveXN0aWNrcy4gSG93ZXZlciwgdGhlCi1zYWZlc3QgcHJvY2VkdXJlIGlzIHRvIGNhbGwgYWxsIHRocmVlIGNhbGlicmF0aW9uIGZ1bmN0aW9ucy4KLQotU0VFIEFMU086Ci1FVlRfam95U2V0VXBwZXJMZWZ0LCBFVlRfam95U2V0TG93ZXJSaWdodCwgRVZUX2pveVNldENlbnRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9qb3lTZXRDZW50ZXIodm9pZCkKLXsKLSAgICBfRVZUX3JlYWRKb3lBeGlzKEVWVF9KT1lfQVhJU19BTEwsRVZULmpveUNlbnRlcik7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QdW1wcyBhbGwgbWVzc2FnZXMgaW4gdGhlIG1lc3NhZ2UgcXVldWUgZnJvbSBMaW51eCBpbnRvIG91ciBldmVudCBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQotewotICAgIGV2ZW50X3QgICAgICAgICAgICAgICAgIGV2dDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBpLG51bWtleXMsIGM7Ci0gICAgaWJvb2wgICAgICAgICAgICAgICAgICAgcmVsZWFzZTsKLSAgICBzdGF0aWMgc3RydWN0IGtiZW50cnkgICBrZTsKLSAgICBzdGF0aWMgY2hhciAgICAgICAgICAgICBidWZbS0JEUkVBREJVRkZFUlNJWkVdOwotICAgIHN0YXRpYyB1c2hvcnQgICAgICAgICAgIHJlcGVhdEtleVsxMjhdID0gezB9OwotCi0gICAgLyogUG9sbCBrZXlib2FyZCBldmVudHMgKi8KLSAgICB3aGlsZSAoZGF0YVJlYWR5KF9QTV9jb25zb2xlX2ZkKSAmJiAobnVta2V5cyA9IHJlYWQoX1BNX2NvbnNvbGVfZmQsIGJ1ZiwgS0JEUkVBREJVRkZFUlNJWkUpKSA+IDApIHsKLQlmb3IgKGkgPSAwOyBpIDwgbnVta2V5czsgaSsrKSB7Ci0JICAgIGMgPSBidWZbaV07Ci0JICAgIHJlbGVhc2UgPSBjICYgMHg4MDsKLQkgICAgYyAmPSAweDdGOwotCi0JICAgIC8qIFRPRE86ICAgIFRoaXMgaXMgd3JvbmchIFdlIG5lZWQgdGhpcyB0byBiZSB0aGUgdGltZSBzdGFtcCBhdCAqLwotCSAgICAvKiAgICAgICAgICAqKiBpbnRlcnJ1cHQgKiogdGltZSEhIE9uZSBzb2x1dGlvbiB3b3VsZCBiZSB0byAqLwotCSAgICAvKiAgICAgICAgICBwdXQgdGhlIGtleWJvYXJkIGFuZCBtb3VzZSBwb2xsaW5nIGxvb3BzIGludG8gKi8KLQkgICAgLyogICAgICAgICAgYSBzZXBhcmF0ZSB0aHJlYWQgdGhhdCBjYW4gYmxvY2sgb24gSS9PIHRvIHRoZSAqLwotCSAgICAvKiAgICAgICAgICBuZWNlc3NheSBmaWxlIGRlc2NyaXB0b3IuICovCi0JICAgIGV2dC53aGVuID0gX0VWVF9nZXRUaWNrcygpOwotCi0JICAgIGlmIChyZWxlYXNlKSB7Ci0JCS8qIEtleSByZWxlYXNlZCAqLwotCQlldnQud2hhdCA9IEVWVF9LRVlVUDsKLQkJc3dpdGNoIChjKSB7Ci0JCSAgICBjYXNlIEtCX2xlZnRTaGlmdDoKLQkJCV9QTV9tb2RpZmllcnMgJj0gfkVWVF9MRUZUU0hJRlQ7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgS0JfcmlnaHRTaGlmdDoKLQkJCV9QTV9tb2RpZmllcnMgJj0gfkVWVF9SSUdIVFNISUZUOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIDI5OgotCQkJX1BNX21vZGlmaWVycyAmPSB+KEVWVF9MRUZUQ1RSTHxFVlRfQ1RSTFNUQVRFKTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSA5NzogICAgICAgICAgICAvKiBDb250cm9sICovCi0JCQlfUE1fbW9kaWZpZXJzICY9IH5FVlRfQ1RSTFNUQVRFOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIDU2OgotCQkJX1BNX21vZGlmaWVycyAmPSB+KEVWVF9MRUZUQUxUfEVWVF9BTFRTVEFURSk7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgMTAwOgotCQkJX1BNX21vZGlmaWVycyAmPSB+RVZUX0FMVFNUQVRFOwotCQkJYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgfQotCQlldnQubW9kaWZpZXJzID0gX1BNX21vZGlmaWVyczsKLQkJZXZ0Lm1lc3NhZ2UgPSBrZXlVcE1zZ1tjXTsKLQkJaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCi0JCSAgICBhZGRFdmVudCgmZXZ0KTsKLQkJa2V5VXBNc2dbY10gPSAwOwotCQlyZXBlYXRLZXlbY10gPSAwOwotCQl9Ci0JICAgIGVsc2UgewotCQkvKiBLZXkgcHJlc3NlZCAqLwotCQlldnQud2hhdCA9IEVWVF9LRVlET1dOOwotCQlzd2l0Y2ggKGMpIHsKLQkJICAgIGNhc2UgS0JfbGVmdFNoaWZ0OgotCQkJX1BNX21vZGlmaWVycyB8PSBFVlRfTEVGVFNISUZUOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEtCX3JpZ2h0U2hpZnQ6Ci0JCQlfUE1fbW9kaWZpZXJzIHw9IEVWVF9SSUdIVFNISUZUOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIDI5OgotCQkJX1BNX21vZGlmaWVycyB8PSBFVlRfTEVGVENUUkx8RVZUX0NUUkxTVEFURTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSA5NzogICAgICAgICAgICAvKiBDb250cm9sICovCi0JCQlfUE1fbW9kaWZpZXJzIHw9IEVWVF9DVFJMU1RBVEU7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgNTY6Ci0JCQlfUE1fbW9kaWZpZXJzIHw9IEVWVF9MRUZUQUxUfEVWVF9BTFRTVEFURTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSAxMDA6Ci0JCQlfUE1fbW9kaWZpZXJzIHw9IEVWVF9BTFRTVEFURTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBLQl9jYXBzTG9jazogICAvKiBDYXBzIExvY2sgKi8KLQkJCV9QTV9sZWRzIF49IExFRF9DQVA7Ci0JCQlpb2N0bChfUE1fY29uc29sZV9mZCwgS0RTRVRMRUQsIF9QTV9sZWRzKTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBLQl9udW1Mb2NrOiAgICAvKiBOdW0gTG9jayAqLwotCQkJX1BNX2xlZHMgXj0gTEVEX05VTTsKLQkJCWlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLRFNFVExFRCwgX1BNX2xlZHMpOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEtCX3Njcm9sbExvY2s6IC8qIFNjcm9sbCBMb2NrICovCi0JCQlfUE1fbGVkcyBePSBMRURfU0NSOwotCQkJaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtEU0VUTEVELCBfUE1fbGVkcyk7Ci0JCQlicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICB9Ci0JCWV2dC5tb2RpZmllcnMgPSBfUE1fbW9kaWZpZXJzOwotCQlpZiAoa2V5VXBNc2dbY10pIHsKLQkJICAgIGV2dC53aGF0ID0gRVZUX0tFWVJFUEVBVDsKLQkJICAgIGV2dC5tZXNzYWdlID0ga2V5VXBNc2dbY10gfCAocmVwZWF0S2V5W2NdKysgPDwgMTYpOwotCQkgICAgfQotCQllbHNlIHsKLQkJICAgIGludCBhc2M7Ci0KLQkJICAgIGV2dC5tZXNzYWdlID0gZ2V0S2V5TWFwcGluZyhrZXltYXBzLCBOQl9LRVlNQVBTLCBjKSA8PCA4OwotCQkgICAga2Uua2JfaW5kZXggPSBjOwotCQkgICAga2Uua2JfdGFibGUgPSAwOwotCQkgICAgaWYgKChfUE1fbW9kaWZpZXJzICYgRVZUX1NISUZUS0VZKSB8fCAoX1BNX2xlZHMgJiBMRURfQ0FQKSkKLQkJCWtlLmtiX3RhYmxlIHw9IEtfU0hJRlRUQUI7Ci0JCSAgICBpZiAoX1BNX21vZGlmaWVycyAmIChFVlRfTEVGVEFMVCB8IEVWVF9BTFRTVEFURSkpCi0JCQlrZS5rYl90YWJsZSB8PSBLX0FMVFRBQjsKLQkJICAgIGlmIChpb2N0bChfUE1fY29uc29sZV9mZCwgS0RHS0JFTlQsICh1bnNpZ25lZCBsb25nKSZrZSk8MCkKLQkJCXBlcnJvcigiaW9jdGwoS0RHS0JFTlQpIik7Ci0JCSAgICBpZiAoKF9QTV9sZWRzICYgTEVEX05VTSkgJiYgKGdldEtleU1hcHBpbmcoa2V5cGFkLCBOQl9LRVlQQUQsIGMpIT1jKSkgewotCQkJYXNjID0gZ2V0S2V5TWFwcGluZyhrZXlwYWQsIE5CX0tFWVBBRCwgYyk7Ci0JCQl9Ci0JCSAgICBlbHNlIHsKLQkJCXN3aXRjaCAoYykgewotCQkJICAgIGNhc2UgMTQ6Ci0JCQkJYXNjID0gQVNDSUlfYmFja3NwYWNlOwotCQkJCWJyZWFrOwotCQkJICAgIGNhc2UgMTU6Ci0JCQkJYXNjID0gQVNDSUlfdGFiOwotCQkJCWJyZWFrOwotCQkJICAgIGNhc2UgMjg6Ci0JCQkgICAgY2FzZSA5NjoKLQkJCQlhc2MgPSBBU0NJSV9lbnRlcjsKLQkJCQlicmVhazsKLQkJCSAgICBjYXNlIDE6Ci0JCQkJYXNjID0gQVNDSUlfZXNjOwotCQkJICAgIGRlZmF1bHQ6Ci0JCQkJYXNjID0ga2Uua2JfdmFsdWUgJiAweEZGOwotCQkJCWlmIChhc2MgPCAweDFCKQotCQkJCSAgICBhc2MgPSAwOwotCQkJCWJyZWFrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIGlmICgoX1BNX21vZGlmaWVycyAmIChFVlRfQ1RSTFNUQVRFfEVWVF9MRUZUQ1RSTCkpICYmIGlzYWxwaGEoYXNjKSkKLQkJCWV2dC5tZXNzYWdlIHw9IHRvdXBwZXIoYXNjKSAtICdBJyArIDE7Ci0JCSAgICBlbHNlCi0JCQlldnQubWVzc2FnZSB8PSBhc2M7Ci0JCSAgICBrZXlVcE1zZ1tjXSA9IGV2dC5tZXNzYWdlOwotCQkgICAgcmVwZWF0S2V5W2NdKys7Ci0JCSAgICB9Ci0JCWlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQkgICAgYWRkRXZlbnQoJmV2dCk7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgIC8qIFBvbGwgbW91c2UgZXZlbnRzICovCi0gICAgaWYgKF9FVlRfbW91c2VfZmQpIHsKLQlpbnQgICAgICAgICBkeCwgZHksIGJ1dHM7Ci0Jc3RhdGljIGludCAgb2xkYnV0czsKLQotCXdoaWxlIChkYXRhUmVhZHkoX0VWVF9tb3VzZV9mZCkpIHsKLQkgICAgaWYgKHJlYWRNb3VzZURhdGEoJmJ1dHMsICZkeCwgJmR5KSkgewotCQlFVlQubXggKz0gZHg7Ci0JCUVWVC5teSArPSBkeTsKLQkJaWYgKEVWVC5teCA8IDApIEVWVC5teCA9IDA7Ci0JCWlmIChFVlQubXkgPCAwKSBFVlQubXkgPSAwOwotCQlpZiAoRVZULm14ID4gcmFuZ2VfeCkgRVZULm14ID0gcmFuZ2VfeDsKLQkJaWYgKEVWVC5teSA+IHJhbmdlX3kpIEVWVC5teSA9IHJhbmdlX3k7Ci0JCWV2dC53aGVyZV94ID0gRVZULm14OwotCQlldnQud2hlcmVfeSA9IEVWVC5teTsKLQkJZXZ0LnJlbGF0aXZlX3ggPSBkeDsKLQkJZXZ0LnJlbGF0aXZlX3kgPSBkeTsKLQotCQkvKiBUT0RPOiAgICBUaGlzIGlzIHdyb25nISBXZSBuZWVkIHRoaXMgdG8gYmUgdGhlIHRpbWUgc3RhbXAgYXQgKi8KLQkJLyogICAgICAgICAgKiogaW50ZXJydXB0ICoqIHRpbWUhISBPbmUgc29sdXRpb24gd291bGQgYmUgdG8gKi8KLQkJLyogICAgICAgICAgcHV0IHRoZSBrZXlib2FyZCBhbmQgbW91c2UgcG9sbGluZyBsb29wcyBpbnRvICovCi0JCS8qICAgICAgICAgIGEgc2VwYXJhdGUgdGhyZWFkIHRoYXQgY2FuIGJsb2NrIG9uIEkvTyB0byB0aGUgKi8KLQkJLyogICAgICAgICAgbmVjZXNzYXkgZmlsZSBkZXNjcmlwdG9yLiAqLwotCQlldnQud2hlbiA9IF9FVlRfZ2V0VGlja3MoKTsKLQkJZXZ0Lm1vZGlmaWVycyA9IF9QTV9tb2RpZmllcnM7Ci0JCWlmIChidXRzICYgNCkKLQkJICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX0xFRlRCVVQ7Ci0JCWlmIChidXRzICYgMSkKLQkJICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX1JJR0hUQlVUOwotCQlpZiAoYnV0cyAmIDIpCi0JCSAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9NSURETEVCVVQ7Ci0KLQkJLyogTGVmdCBjbGljayBldmVudHMgKi8KLQkJaWYgKChidXRzJjQpICE9IChvbGRidXRzJjQpKSB7Ci0JCSAgICBpZiAoYnV0cyY0KQotCQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOwotCQkgICAgZWxzZQotCQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKLQkJICAgIGV2dC5tZXNzYWdlID0gRVZUX0xFRlRCTUFTSzsKLQkJICAgIEVWVC5vbGRNb3ZlID0gLTE7Ci0JCSAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKLQkJCWFkZEV2ZW50KCZldnQpOwotCQkgICAgfQotCi0JCS8qIFJpZ2h0IGNsaWNrIGV2ZW50cyAqLwotCQlpZiAoKGJ1dHMmMSkgIT0gKG9sZGJ1dHMmMSkpIHsKLQkJICAgIGlmIChidXRzJjEpCi0JCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV047Ci0JCSAgICBlbHNlCi0JCQlldnQud2hhdCA9IEVWVF9NT1VTRVVQOwotCQkgICAgZXZ0Lm1lc3NhZ2UgPSBFVlRfUklHSFRCTUFTSzsKLQkJICAgIEVWVC5vbGRNb3ZlID0gLTE7Ci0JCSAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKLQkJCWFkZEV2ZW50KCZldnQpOwotCQkgICAgfQotCi0JCS8qIE1pZGRsZSBjbGljayBldmVudHMgKi8KLQkJaWYgKChidXRzJjIpICE9IChvbGRidXRzJjIpKSB7Ci0JCSAgICBpZiAoYnV0cyYyKQotCQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOwotCQkgICAgZWxzZQotCQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKLQkJICAgIGV2dC5tZXNzYWdlID0gRVZUX01JRERMRUJNQVNLOwotCQkgICAgRVZULm9sZE1vdmUgPSAtMTsKLQkJICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQkJYWRkRXZlbnQoJmV2dCk7Ci0JCSAgICB9Ci0KLQkJLyogTW91c2UgbW92ZW1lbnQgZXZlbnQgKi8KLQkJaWYgKGR4IHx8IGR5KSB7Ci0JCSAgICBldnQud2hhdCA9IEVWVF9NT1VTRU1PVkU7Ci0JCSAgICBldnQubWVzc2FnZSA9IDA7Ci0JCSAgICBpZiAoRVZULm9sZE1vdmUgIT0gLTEpIHsKLQkJCS8qIE1vZGlmeSBleGlzdGluZyBtb3ZlbWVudCBldmVudCAqLwotCQkJRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3ggPSBldnQud2hlcmVfeDsKLQkJCUVWVC5ldnRxW0VWVC5vbGRNb3ZlXS53aGVyZV95ID0gZXZ0LndoZXJlX3k7Ci0JCQl9Ci0JCSAgICBlbHNlIHsKLQkJCS8qIFNhdmUgaWQgb2YgdGhpcyBtb3ZlbWVudCBldmVudCAqLwotCQkJRVZULm9sZE1vdmUgPSBFVlQuZnJlZUhlYWQ7Ci0JCQlpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKLQkJCSAgICBhZGRFdmVudCgmZXZ0KTsKLQkJCX0KLQkJICAgIH0KLQkJb2xkYnV0cyA9IGJ1dHM7Ci0JCX0KLQkgICAgfQotCX0KLQotI2lmZGVmIFVTRV9PU19KT1lTVElDSwotICAgIC8qIFBvbGwgam95c3RpY2sgZXZlbnRzIHVzaW5nIHRoZSAxLnggam95c3RpY2sgZHJpdmVyIEFQSSBpbiB0aGUgMi4yIGtlcm5lbHMgKi8KLSAgICBpZiAoanNfdmVyc2lvbiAmIH4weGZmZmYpIHsKLQlzdGF0aWMgc3RydWN0IGpzX2V2ZW50ICBqczsKLQotCS8qIFJlYWQgam95c3RpY2sgYXhpcyAwICovCi0JZXZ0LndoZW4gPSAwOwotCWV2dC5tb2RpZmllcnMgPSBfUE1fbW9kaWZpZXJzOwotCWlmIChqb3lzdGljazBfZmQgJiYgZGF0YVJlYWR5KGpveXN0aWNrMF9mZCkgJiYKLQkJcmVhZChqb3lzdGljazBfZmQsICZqcywgc2l6ZW9mKGpzKSkgPT0gc2l6ZW9mKGpzKSkgewotCSAgICBpZiAoanMudHlwZSAmIEpTX0VWRU5UX0JVVFRPTikgewotCQlpZiAoanMubnVtYmVyIDwgMikgeyAvKiBPbmx5IDIgYnV0dG9ucyBmb3Igbm93IDooICovCi0JCSAgICBidXRzMFtqcy5udW1iZXJdID0ganMudmFsdWU7Ci0JCSAgICBldnQud2hhdCA9IEVWVF9KT1lDTElDSzsKLQkJICAgIG1ha2VKb3lFdmVudCgmZXZ0KTsKLQkJICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQkJYWRkRXZlbnQoJmV2dCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgZWxzZSBpZiAoanMudHlwZSAmIEpTX0VWRU5UX0FYSVMpIHsKLQkJYXhpczBbanMubnVtYmVyXSA9IHNjYWxlSm95QXhpcyhqcy52YWx1ZSxqcy5udW1iZXIpOwotCQlldnQud2hhdCA9IEVWVF9KT1lNT1ZFOwotCQlpZiAoRVZULm9sZEpveU1vdmUgIT0gLTEpIHsKLQkJICAgIG1ha2VKb3lFdmVudCgmRVZULmV2dHFbRVZULm9sZEpveU1vdmVdKTsKLQkJICAgIH0KLQkJZWxzZSBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkgewotCQkgICAgRVZULm9sZEpveU1vdmUgPSBFVlQuZnJlZUhlYWQ7Ci0JCSAgICBtYWtlSm95RXZlbnQoJmV2dCk7Ci0JCSAgICBhZGRFdmVudCgmZXZ0KTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkvKiBSZWFkIGpveXN0aWNrIGF4aXMgMSAqLwotCWlmIChqb3lzdGljazFfZmQgJiYgZGF0YVJlYWR5KGpveXN0aWNrMV9mZCkgJiYKLQkJcmVhZChqb3lzdGljazFfZmQsICZqcywgc2l6ZW9mKGpzKSk9PXNpemVvZihqcykpIHsKLQkgICAgaWYgKGpzLnR5cGUgJiBKU19FVkVOVF9CVVRUT04pIHsKLQkJaWYgKGpzLm51bWJlciA8IDIpIHsgLyogT25seSAyIGJ1dHRvbnMgZm9yIG5vdyA6KCAqLwotCQkgICAgYnV0czFbanMubnVtYmVyXSA9IGpzLnZhbHVlOwotCQkgICAgZXZ0LndoYXQgPSBFVlRfSk9ZQ0xJQ0s7Ci0JCSAgICBtYWtlSm95RXZlbnQoJmV2dCk7Ci0JCSAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKLQkJCWFkZEV2ZW50KCZldnQpOwotCQkgICAgfQotCQl9Ci0JICAgIGVsc2UgaWYgKGpzLnR5cGUgJiBKU19FVkVOVF9BWElTKSB7Ci0JCWF4aXMxW2pzLm51bWJlcl0gPSBzY2FsZUpveUF4aXMoanMudmFsdWUsanMubnVtYmVyPDwyKTsKLQkJZXZ0LndoYXQgPSBFVlRfSk9ZTU9WRTsKLQkJaWYgKEVWVC5vbGRKb3lNb3ZlICE9IC0xKSB7Ci0JCSAgICBtYWtlSm95RXZlbnQoJkVWVC5ldnRxW0VWVC5vbGRKb3lNb3ZlXSk7Ci0JCSAgICB9Ci0JCWVsc2UgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKLQkJICAgIEVWVC5vbGRKb3lNb3ZlID0gRVZULmZyZWVIZWFkOwotCQkgICAgbWFrZUpveUV2ZW50KCZldnQpOwotCQkgICAgYWRkRXZlbnQoJmV2dCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKLWtleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgotY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgX1BNX21vZGlmaWVycyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYQotQ3RybC1GMSwgQWx0LUYxIGV0Yy4gVGhlIHJhdyBzY2FuIGNvZGVzIGZyb20gdGhlIGtleWJvYXJkIHdvcmsgdGhpcyB3YXksCi1idXQgdGhlIE9TIGdpdmVzIHVzICdjb29rZWQnIHNjYW4gY29kZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZW0gYmFjawotdG8gdGhlIHJhdyBmb3JtYXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX21hc2tLZXlDb2RlKGV2dCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHNwZWVkIG9mIHRoZSBzZXJpYWwgcG9ydAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgc2V0c3BlZWQoCi0gICAgaW50IGZkLAotICAgIGludCBvbGQsCi0gICAgaW50IG5ldywKLSAgICB1bnNpZ25lZCBzaG9ydCBmbGFncykKLXsKLSAgICBzdHJ1Y3QgdGVybWlvcyB0dHk7Ci0gICAgY2hhciAqYzsKLQotICAgIHRjZ2V0YXR0cihmZCwgJnR0eSk7Ci0gICAgdHR5LmNfaWZsYWcgPSBJR05CUksgfCBJR05QQVI7Ci0gICAgdHR5LmNfb2ZsYWcgPSAwOwotICAgIHR0eS5jX2xmbGFnID0gMDsKLSAgICB0dHkuY19saW5lID0gMDsKLSAgICB0dHkuY19jY1tWVElNRV0gPSAwOwotICAgIHR0eS5jX2NjW1ZNSU5dID0gMTsKLSAgICBzd2l0Y2ggKG9sZCkgewotCWNhc2UgOTYwMDogIHR0eS5jX2NmbGFnID0gZmxhZ3MgfCBCOTYwMDsgYnJlYWs7Ci0JY2FzZSA0ODAwOiAgdHR5LmNfY2ZsYWcgPSBmbGFncyB8IEI0ODAwOyBicmVhazsKLQljYXNlIDI0MDA6ICB0dHkuY19jZmxhZyA9IGZsYWdzIHwgQjI0MDA7IGJyZWFrOwotCWNhc2UgMTIwMDoKLQlkZWZhdWx0OiAgICB0dHkuY19jZmxhZyA9IGZsYWdzIHwgQjEyMDA7IGJyZWFrOwotCX0KLSAgICB0Y3NldGF0dHIoZmQsIFRDU0FGTFVTSCwgJnR0eSk7Ci0gICAgc3dpdGNoIChuZXcpIHsKLQljYXNlIDk2MDA6ICBjID0gIipxIjsgIHR0eS5jX2NmbGFnID0gZmxhZ3MgfCBCOTYwMDsgYnJlYWs7Ci0JY2FzZSA0ODAwOiAgYyA9ICIqcCI7ICB0dHkuY19jZmxhZyA9IGZsYWdzIHwgQjQ4MDA7IGJyZWFrOwotCWNhc2UgMjQwMDogIGMgPSAiKm8iOyAgdHR5LmNfY2ZsYWcgPSBmbGFncyB8IEIyNDAwOyBicmVhazsKLQljYXNlIDEyMDA6Ci0JZGVmYXVsdDogICAgYyA9ICIqbiI7ICB0dHkuY19jZmxhZyA9IGZsYWdzIHwgQjEyMDA7IGJyZWFrOwotCX0KLSAgICB3cml0ZShmZCwgYywgMik7Ci0gICAgdXNsZWVwKDEwMDAwMCk7Ci0gICAgdGNzZXRhdHRyKGZkLCBUQ1NBRkxVU0gsICZ0dHkpOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUdlbmVyaWMgbW91c2UgZHJpdmVyIGluaXQgY29kZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9FVlRfbW91c2VfaW5pdCh2b2lkKQotewotICAgIGludCBpOwotCi0gICAgLyogQ2hhbmdlIGZyb20gYW55IGF2YWlsYWJsZSBzcGVlZCB0byB0aGUgY2hvc2VuIG9uZSAqLwotICAgIGZvciAoaSA9IDk2MDA7IGkgPj0gMTIwMDsgaSAvPSAyKQotCXNldHNwZWVkKF9FVlRfbW91c2VfZmQsIGksIG9wdF9iYXVkLCBtb3VzZV9pbmZvc1ttb3VzZV9kcml2ZXJdLmZsYWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2dpdGVjaCBtb3VzZSBkcml2ZXIgaW5pdCBjb2RlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0VWVF9sb2dpdGVjaF9pbml0KHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgaTsKLSAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0gICAgaW50ICAgICAgICAgYnVzbW91c2U7Ci0KLSAgICAvKiBpcyB0aGlzIGEgc2VyaWFsLSBvciBhIGJ1cy0gbW91c2U/ICovCi0gICAgaWYgKGZzdGF0KF9FVlRfbW91c2VfZmQsJmJ1ZikgPT0gLTEpCi0JcGVycm9yKCJmc3RhdCIpOwotICAgIGkgPSBNQUpPUihidWYuc3RfcmRldik7Ci0gICAgaWYgKHN0YXQoIi9kZXYvdHR5UzAiLCZidWYpID09IC0xKQotCXBlcnJvcigic3RhdCIpOwotICAgIGJ1c21vdXNlPShpICE9IE1BSk9SKGJ1Zi5zdF9yZGV2KSk7Ci0KLSAgICAvKiBGaXggdGhlIGhvd21hbnkgZmllbGQsIHNvIHRoYXQgc2VyaWFsIG1pY2UgaGF2ZSAxLCB3aGlsZSBidXNtaWNlIGhhdmUgMyAqLwotICAgIG1vdXNlX2luZm9zW21vdXNlX2RyaXZlcl0ucmVhZCA9IGJ1c21vdXNlID8gMyA6IDE7Ci0KLSAgICAvKiBDaGFuZ2UgZnJvbSBhbnkgYXZhaWxhYmxlIHNwZWVkIHRvIHRoZSBjaG9zZW4gb25lICovCi0gICAgZm9yIChpID0gOTYwMDsgaSA+PSAxMjAwOyBpIC89IDIpCi0Jc2V0c3BlZWQoX0VWVF9tb3VzZV9mZCwgaSwgb3B0X2JhdWQsIG1vdXNlX2luZm9zW21vdXNlX2RyaXZlcl0uZmxhZ3MpOwotCi0gICAgLyogVGhpcyBzdHVmZiBpcyBwZWN1bGlhciBvZiBsb2dpdGVjaCBtaWNlLCBhbHNvIGZvciB0aGUgc2VyaWFsIG9uZXMgKi8KLSAgICB3cml0ZShfRVZUX21vdXNlX2ZkLCAiUyIsIDEpOwotICAgIHNldHNwZWVkKF9FVlRfbW91c2VfZmQsIG9wdF9iYXVkLCBvcHRfYmF1ZCxDUzggfFBBUkVOQiB8UEFST0REIHxDUkVBRCB8Q0xPQ0FMIHxIVVBDTCk7Ci0KLSAgICAvKiBDb25maWd1cmUgdGhlIHNhbXBsZSByYXRlICovCi0gICAgZm9yIChpID0gMDsgb3B0X3NhbXBsZSA8PSBzYW1wbGV0YWJbaV0uc2FtcGxlOyBpKyspCi0JOwotICAgIHdyaXRlKF9FVlRfbW91c2VfZmQsc2FtcGxldGFiW2ldLmNvZGUsMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWljcm9zb2Z0IEludGVsbGltb3VzZSBpbml0IGNvZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfRVZUX3BucG1vdXNlX2luaXQodm9pZCkKLXsKLSAgICBzdHJ1Y3QgdGVybWlvcyB0dHk7Ci0KLSAgICB0Y2dldGF0dHIoX0VWVF9tb3VzZV9mZCwgJnR0eSk7Ci0gICAgdHR5LmNfaWZsYWcgPSBJR05CUksgfCBJR05QQVI7Ci0gICAgdHR5LmNfb2ZsYWcgPSAwOwotICAgIHR0eS5jX2xmbGFnID0gMDsKLSAgICB0dHkuY19saW5lID0gMDsKLSAgICB0dHkuY19jY1tWVElNRV0gPSAwOwotICAgIHR0eS5jX2NjW1ZNSU5dID0gMTsKLSAgICB0dHkuY19jZmxhZyA9IG1vdXNlX2luZm9zW21vdXNlX2RyaXZlcl0uZmxhZ3MgfCBCMTIwMDsKLSAgICB0Y3NldGF0dHIoX0VWVF9tb3VzZV9mZCwgVENTQUZMVVNILCAmdHR5KTsgLyogc2V0IHBhcmFtZXRlcnMgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tb3VzZU1vdmUgICAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbmV2ZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQKLQotUkVNQVJLUzoKLUluaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZyBJU1IKLXRvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28gYnVpbGQKLXRoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KLQotV2UgdXNlIGhhbmRsZXIgbnVtYmVyIDIgb2YgdGhlIG1vdXNlIGxpYnJhcmllcyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIG91cgotZXZlbnQgaGFuZGxpbmcgcm91dGluZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2luaXQoCi0gICAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyIG1vdXNlTW92ZSkKLXsKLSAgICBpbnQgICAgICAgICBpOwotICAgIGNoYXIgICAgICAgICp0bXA7Ci0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSAqLwotICAgIEVWVC5tb3VzZU1vdmUgPSBtb3VzZU1vdmU7Ci0gICAgaW5pdEV2ZW50UXVldWUoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0Ja2V5VXBNc2dbaV0gPSAwOwotCi0gICAgLyogS2V5Ym9hcmQgaW5pdGlhbGl6YXRpb24gKi8KLSAgICBpZiAoX1BNX2NvbnNvbGVfZmQgPT0gLTEpCi0JUE1fZmF0YWxFcnJvcigiWW91IG11c3QgZmlyc3QgY2FsbCBQTV9vcGVuQ29uc29sZSB0byB1c2UgdGhlIEVWVCBmdW5jdGlvbnMhIik7Ci0gICAgX1BNX2tleWJvYXJkX3Jhd21vZGUoKTsKLSAgICBmY250bChfUE1fY29uc29sZV9mZCxGX1NFVEZMLGZjbnRsKF9QTV9jb25zb2xlX2ZkLEZfR0VURkwpIHwgT19OT05CTE9DSyk7Ci0KLSAgICAvKiBNb3VzZSBpbml0aWFsaXphdGlvbiAqLwotICAgIGlmICgodG1wID0gZ2V0ZW52KEVOVl9NT1VTRURSVikpICE9IE5VTEwpIHsKLQlmb3IgKGkgPSAwOyBpIDwgTkJfTUlDRTsgaSsrKSB7Ci0JICAgIGlmICghc3RyY2FzZWNtcCh0bXAsIG1vdXNlX2luZm9zW2ldLm5hbWUpKSB7Ci0JCW1vdXNlX2RyaXZlciA9IGk7Ci0JCWJyZWFrOwotCQl9Ci0JICAgIH0KLQlpZiAoaSA9PSBOQl9NSUNFKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCJVbmtub3duIG1vdXNlIGRyaXZlcjogJXNcbiIsIHRtcCk7Ci0JICAgIG1vdXNlX2RyaXZlciA9IEVWVF9ub01vdXNlOwotCSAgICBfRVZUX21vdXNlX2ZkID0gMDsKLQkgICAgfQotCX0KLSAgICBpZiAobW91c2VfZHJpdmVyICE9IEVWVF9ub01vdXNlKSB7Ci0JaWYgKG1vdXNlX2RyaXZlciA9PSBFVlRfZ3BtKQotCSAgICBzdHJjcHkobW91c2VfZGV2LCIvZGV2L2dwbWRhdGEiKTsKLQlpZiAoKHRtcCA9IGdldGVudihFTlZfTU9VU0VERVYpKSAhPSBOVUxMKQotCSAgICBzdHJjcHkobW91c2VfZGV2LHRtcCk7Ci0jaWZkZWYgIENIRUNLRUQKLQlmcHJpbnRmKHN0ZGVyciwiVXNpbmcgdGhlICVzIE1HTCBtb3VzZSBkcml2ZXIgb24gJXMuXG4iLCBtb3VzZV9pbmZvc1ttb3VzZV9kcml2ZXJdLm5hbWUsIG1vdXNlX2Rldik7Ci0jZW5kaWYKLQlpZiAoKF9FVlRfbW91c2VfZmQgPSBvcGVuKG1vdXNlX2RldiwgT19SRFdSKSkgPCAwKSB7Ci0JICAgIHBlcnJvcigib3BlbiIpOwotCSAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuIG1vdXNlIGRldmljZSAlcywgZHJvcHBpbmcgbW91c2Ugc3VwcG9ydC5cbiIsIG1vdXNlX2Rldik7Ci0JICAgIHNsZWVwKDEpOwotCSAgICBtb3VzZV9kcml2ZXIgPSBFVlRfbm9Nb3VzZTsKLQkgICAgX0VWVF9tb3VzZV9mZCA9IDA7Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgY2hhciBjOwotCi0JICAgIC8qIEluaXQgYW5kIGZsdXNoIHRoZSBtb3VzZSBwZW5kaW5nIGlucHV0IHF1ZXVlICovCi0JICAgIGlmIChtb3VzZV9pbmZvc1ttb3VzZV9kcml2ZXJdLmluaXQpCi0JCW1vdXNlX2luZm9zW21vdXNlX2RyaXZlcl0uaW5pdCgpOwotCSAgICB3aGlsZShkYXRhUmVhZHkoX0VWVF9tb3VzZV9mZCkgJiYgcmVhZChfRVZUX21vdXNlX2ZkLCAmYywgMSkgPT0gMSkKLQkJOwotCSAgICB9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotQ2hhbmdlcyB0aGUgcmFuZ2Ugb2YgY29vcmRpbmF0ZXMgcmV0dXJuZWQgYnkgdGhlIG1vdXNlIGZ1bmN0aW9ucyB0byB0aGUKLXNwZWNpZmllZCByYW5nZSBvZiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB3aGVuIGNoYW5naW5nIGJldHdlZW4gZ3JhcGhpY3MKLW1vZGVzIHNldCB0aGUgcmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgZm9yIHRoZSBuZXcgZGlzcGxheSBtb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVJhbmdlKAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzKQotewotICAgIHJhbmdlX3ggPSB4UmVzOwotICAgIHJhbmdlX3kgPSB5UmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotTW9kaWZlcyB0aGUgbW91c2UgY29vcmRpbmF0ZXMgYXMgbmVjZXNzYXJ5IGlmIHNjYWxpbmcgdG8gT1MgY29vcmRpbmF0ZXMsCi1hbmQgc2V0cyB0aGUgT1MgbW91c2UgY3Vyc29yIHBvc2l0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9zZXRNb3VzZVBvcyh4LHkpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KLWNhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAotYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3Jlc3VtZSh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIExpbnV4ICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1TdXNwZW5kcyBhbGwgb2Ygb3VyIGV2ZW50IGhhbmRsaW5nIG9wZXJhdGlvbnMuIFRoaXMgaXMgYWxzbyB1c2VkIHRvCi1kZS1pbnN0YWxsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3N1c3BlbmQodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBMaW51eCAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX2V4aXQodm9pZCkKLXsKLSAgICAvKiBSZXN0b3JlIHNpZ25hbCBoYW5kbGVycyAqLwotICAgIF9QTV9yZXN0b3JlX2tiX21vZGUoKTsKLSAgICBpZiAoX0VWVF9tb3VzZV9mZCkgewotCWNsb3NlKF9FVlRfbW91c2VfZmQpOwotCV9FVlRfbW91c2VfZmQgPSAwOwotCX0KLSNpZmRlZiBVU0VfT1NfSk9ZU1RJQ0sKLSAgICBpZiAoam95c3RpY2swX2ZkKSB7Ci0JY2xvc2Uoam95c3RpY2swX2ZkKTsKLQlmcmVlKGF4aXMwKTsKLQlmcmVlKGJ1dHMwKTsKLQlqb3lzdGljazBfZmQgPSAwOwotCX0KLSAgICBpZiAoam95c3RpY2sxX2ZkKSB7Ci0JY2xvc2Uoam95c3RpY2sxX2ZkKTsKLQlmcmVlKGF4aXMxKTsKLQlmcmVlKGJ1dHMxKTsKLQlqb3lzdGljazFfZmQgPSAwOwotCX0KLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvZXZlbnQuc3ZnYSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L2V2ZW50LnN2Z2EKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMzU4YTAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvZXZlbnQuc3ZnYQorKysgL2Rldi9udWxsCkBAIC0xLDEwNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgIFRoZSBTdXBlclZHQSBLaXQgLSBVbmlWQkUgU29mdHdhcmUgRGV2ZWxvcG1lbnQgS2l0Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIElCTSBQQyAoTVMgRE9TKQotKgotKiBEZXNjcmlwdGlvbjogIFJvdXRpbmVzIHRvIHByb3ZpZGUgYSBMaW51eCBldmVudCBxdWV1ZSwgd2hpY2ggYXV0b21hdGljYWxseQotKiAgICAgICAgICAgICAgIGhhbmRsZXMga2V5Ym9hcmQgYW5kIG1vdXNlIGV2ZW50cyBmb3IgdGhlIExpbnV4IGNvbXBhdGFiaWxpdHkKLSogICAgICAgICAgICAgICBsaWJyYXJpZXMuIEJhc2VkIG9uIHRoZSBldmVudCBoYW5kbGluZyBjb2RlIGluIHRoZSBNR0wuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXlib2FyZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tkLmg+Ci0jaW5jbHVkZSA8bGludXgvdnQuaD4KLSNpbmNsdWRlIDxncG0uaD4KLSNpbmNsdWRlICJwbS5oIgotI2luY2x1ZGUgInZlc2F2YmUuaCIKLSNpbmNsdWRlICJ3ZGlyZWN0LmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgRVZFTlRRU0laRSAgMTAwICAgICAgICAgICAgIC8qIE51bWJlciBvZiBldmVudHMgaW4gZXZlbnQgcXVldWUgICovCi0KLXN0YXRpYyBpbnQgICAgICBoZWFkID0gLTE7ICAgICAgICAgIC8qIEhlYWQgb2YgZXZlbnQgcXVldWUgICAgICAgICAgICAgICovCi1zdGF0aWMgaW50ICAgICAgdGFpbCA9IC0xOyAgICAgICAgICAvKiBUYWlsIG9mIGV2ZW50IHF1ZXVlICAgICAgICAgICAgICAqLwotc3RhdGljIGludCAgICAgIGZyZWVIZWFkID0gLTE7ICAgICAgLyogSGVhZCBvZiBmcmVlIGxpc3QgICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBpbnQgICAgICBjb3VudCA9IDA7ICAgICAgICAgIC8qIE5vLiBvZiBpdGVtcyBjdXJyZW50bHkgaW4gcXVldWUgICovCi1zdGF0aWMgV0RfZXZlbnQgZXZ0cVtFVkVOVFFTSVpFXTsgICAvKiBUaGUgcXVldWUgc3RydWN0dXJlIGl0c2VsZiAgICAgICovCi1zdGF0aWMgaW50ICAgICAgb2xkTW92ZSA9IC0xOyAgICAgICAvKiBQcmV2aW91cyBtb3ZlbWVudCBldmVudCAgICAgICAgICAqLwotc3RhdGljIGludCAgICAgIG9sZEtleSA9IC0xOyAgICAgICAgLyogUHJldmlvdXMga2V5IHJlcGVhdCBldmVudCAgICAgICAgKi8KLXN0YXRpYyBpbnQgICAgICBteCxteTsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgbW91c2UgcG9zaXRpb24gICAgICAgICAgICovCi1zdGF0aWMgaW50ICAgICAgeFJlcyx5UmVzOyAgICAgICAgICAvKiBTY3JlZW4gcmVzb2x1dGlvbiBjb29yZGluYXRlcyAgICAqLwotc3RhdGljIHZvaWQgICAgICpzdGF0ZUJ1ZjsgICAgICAgICAgLyogUG9pbnRlciB0byBjb25zb2xlIHN0YXRlIGJ1ZmZlciAgKi8KLXN0YXRpYyBpbnQgICAgICBjb25uOyAgICAgICAgICAgICAgIC8qIEdQTSBmaWxlIGRlc2NyaXB0b3IgZm9yIG1vdXNlIGhhbmRsaW5nICovCi1zdGF0aWMgaW50ICAgICAgdHR5X2ZkOyAgICAgICAgICAgICAvKiBGaWxlIGRlc2NyaXB0b3IgZm9yIC9kZXYvY29uc29sZSAqLwotZXh0ZXJuIGludCAgICAgIHR0eV92YzsgICAgICAgICAgICAgLyogVmlydHVhbCBjb25zb2xlIElELCBmcm9tIHRoZSBQTS9Qcm8gbGlicmFyeSAqLwotc3RhdGljIGlib29sICAgIGtleV9kb3duWzEyOF07ICAgICAgLyogU3RhdGUgb2YgYWxsIGtleWJvYXJkIGtleXMgICAgICAgKi8KLXN0YXRpYyBzdHJ1Y3QgdGVybWlvcyBvbGRfY29uZjsgICAgIC8qIFNhdmVkIHRlcm1pbmFsIGNvbmZpZ3VyYXRpb24gICAgICovCi1zdGF0aWMgaW50ICAgICAgb2xka2Jtb2RlOyAgICAgICAgICAvKiBhbmQgcHJldmlvdXMga2V5Ym9hcmQgbW9kZSAgICAgICAqLwotc3RydWN0IHZ0X21vZGUgIG9sZHZ0bW9kZTsgICAgICAgICAgLyogT2xkIHZpcnR1YWwgdGVybWluYWwgbW9kZSAgICAgICAgKi8KLXN0YXRpYyBpbnQgICAgICBvbGRfZmxhZ3M7ICAgICAgICAgIC8qIE9sZCBmbGFncyBmb3IgZmNudGwgICAgICAgICAgICAgICovCi1zdGF0aWMgdWxvbmcgICAga2V5X21vZGlmaWVyczsgICAgICAvKiBLZXlib2FyZCBtb2RpZmllcnMgICAgICAgICAgICAgICAqLwotc3RhdGljIGludCAgICAgIGZvcmJpZF92dF9yZWxlYXNlPTA7LyogRmxhZyB0byBmb3JiaWQgcmVsZWFzZSBvZiBWVCAgICAgKi8KLXN0YXRpYyBpbnQgICAgICBmb3JiaWRfdnRfYWNxdWlyZT0wOy8qIEZsYWcgdG8gZm9yYmlkIGNhdHVyZSBvZiBWVCAgICAgICovCi1zdGF0aWMgaW50ICAgICAgb2xkbW9kZTsgICAgICAgICAgICAvKiBPbGQgU1ZHQSBtb2RlIHNhdmVkIGZvciBWVCBzd2l0Y2gqLwotc3RhdGljIGludCAgICAgIGluaXRtb2RlOyAgICAgICAgICAgLyogSW5pdGlhbCB0ZXh0IG1vZGUgICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBpYm9vbCAgICBpbnN0YWxsZWQgPSBmYWxzZTsgIC8qIFRydWUgaWYgd2UgYXJlIGluc3RhbGxlZCAgICAgICAgICovCi1zdGF0aWMgdm9pZCAgICAgKF9BU01BUEkgKm1vdmVDdXJzb3IpKGludCB4LGludCB5KSA9IE5VTEw7Ci1zdGF0aWMgaW50ICAgICAgKF9BU01BUEkgKnN1c3BlbmRBcHBDYWxsYmFjaykoaW50IGZsYWdzKSA9IE5VTEw7Ci0KLSNpZiAwCi0vKiBLZXlib2FyZCBUcmFuc2xhdGlvbiB0YWJsZSBmcm9tIHNjYW5jb2RlcyB0byBBU0NJSSAqLwotCi1zdGF0aWMgdWNoYXIga2V5VGFibGVbMTI4XSA9Ci0iXDBcMDMzMTIzNDU2Nzg5MC09XDAxMCIKLSJcMDExcXdlcnR5dWlvcFtdXDAxNSIKLSJcMGFzZGZnaGprbDsnYFwwXFwiCi0ienhjdmJubSwuL1wwKlwwIFwwIgotIlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCIgICAgICAvKiBGdW5jdGlvbiBrZXlzICovCi0iNzg5LTQ1NisxMjMwLlwwXDBcMFwwXDAiICAgICAgIC8qIEtleXBhZCBrZXlzICovCi0iXDBcMFwwXDBcMFwwXDBcMDE1XDAvIjsKLQotc3RhdGljIHVjaGFyIGtleVRhYmxlU2hpZnRlZFsxMjhdID0KLSJcMFwwMzMhQCMkJV4mKigpXytcMDEwIgotIlwwMTFRV0VSVFlVSU9Qe31cMDE1IgotIlwwQVNERkdISktMOlwiflwwfCIKLSJaWENWQk5NPD4/XDAqXDAgXDAiCi0iXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIiAgICAgIC8qIEZ1bmN0aW9uIGtleXMgKi8KLSI3ODktNDU2KzEyMzAuXDBcMFwwXDBcMCIgICAgICAgLyogS2V5cGFkIGtleXMgKi8KLSJcMFwwXDBcMFwwXDBcMFwwMTVcMC8iOwotI2VuZGlmCi0KLS8qIE1hY3JvcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBDQVBTIGFuZCBOVU0gbG9jayBzdGF0ZXMgKi8KLQotI2RlZmluZSBFVlRfQ0FQU1NUQVRFICAgMHgwMTAwCi0jZGVmaW5lIEVWVF9OVU1TVEFURSAgICAweDAyMDAKLQotLyogSGVscGVyIG1hY3JvcyBmb3IgZGVhbGluZyB3aXRoIHRpbWVycyAqLwotCi0jZGVmaW5lIFRJQ0tTX1RPX1VTRUModCkgKCh0KSo2NTUzNi4wLzEuMTkzMTgwKQotI2RlZmluZSBVU0VDX1RPX1RJQ0tTKHUpICgodSkqMS4xOTMxODAvNjU1MzYuMCkKLQotLyogTnVtYmVyIG9mIGtleWNvZGVzIHRvIHJlYWQgYXQgYSB0aW1lIGZyb20gdGhlIGNvbnNvbGUgKi8KLQotI2RlZmluZSBLQkRSRUFEQlVGRkVSU0laRSAzMgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBzdGFtcCBpbiB1bml0cyBvZiAxOC4yIHRpY2tzIHBlciBzZWNvbmQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIGdldFRpbWVTdGFtcCh2b2lkKQotewotICAgIHJldHVybiAodWxvbmcpKGNsb2NrKCkgLyAoQ0xPQ0tTX1BFUl9TRUMgLyAxOC4yKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZXZ0IC0gRXZlbnQgdG8gcGxhY2Ugb250byBldmVudCBxdWV1ZQotCi1SRU1BUktTOgotQWRkcyBhbiBldmVudCB0byB0aGUgZXZlbnQgcXVldWUgYnkgdGFja2luZyBpdCBvbnRvIHRoZSB0YWlsIG9mIHRoZSBldmVudAotcXVldWUuIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgYXQgbGVhc3Qgb25lIHNwb3QgaXMgYXZhaWxhYmxlIG9uIHRoZQotZnJlZUxpc3QgZm9yIHRoZSBldmVudCB0byBiZSBpbnNlcnRlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhZGRFdmVudCgKLSAgICBXRF9ldmVudCAqZXZ0KQotewotICAgIGludCAgICAgICAgIGV2dElEOwotCi0gICAgLyogR2V0IHNwb3QgdG8gcGxhY2UgdGhlIGV2ZW50IGZyb20gdGhlIGZyZWUgbGlzdCAqLwotICAgIGV2dElEID0gZnJlZUhlYWQ7Ci0gICAgZnJlZUhlYWQgPSBldnRxW2ZyZWVIZWFkXS5uZXh0OwotCi0gICAgLyogQWRkIHRvIHRoZSB0YWlsIG9mIHRoZSBldmVudCBxdWV1ZSAgICovCi0gICAgZXZ0LT5uZXh0ID0gLTE7Ci0gICAgZXZ0LT5wcmV2ID0gdGFpbDsKLSAgICBpZiAodGFpbCAhPSAtMSkKLSAgICAgICAgZXZ0cVt0YWlsXS5uZXh0ID0gZXZ0SUQ7Ci0gICAgZWxzZQotICAgICAgICBoZWFkID0gZXZ0SUQ7Ci0gICAgdGFpbCA9IGV2dElEOwotICAgIGV2dHFbZXZ0SURdID0gKmV2dDsKLSAgICBjb3VudCsrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXdoYXQgICAgICAgIC0gRXZlbnQgY29kZQotbWVzc2FnZSAgICAgLSBFdmVudCBtZXNzYWdlCi1tb2RpZmllcnMgICAtIGtleWJvYXJkIG1vZGlmaWVycwoteCAgICAgICAgICAgLSBNb3VzZSBYIHBvc2l0aW9uIGF0IHRpbWUgb2YgZXZlbnQKLXkgICAgICAgICAgIC0gTW91c2UgWSBwb3NpdGlvbiBhdCB0aW1lIG9mIGV2ZW50Ci1idXRfc3RhdCAgICAtIE1vdXNlIGJ1dHRvbiBzdGF0dXMgYXQgdGltZSBvZiBldmVudAotCi1SRU1BUktTOgotQWRkcyBhIG5ldyBtb3VzZSBldmVudCB0byB0aGUgZXZlbnQgcXVldWUuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbQotd2l0aGluIHRoZSBtb3VzZSBpbnRlcnJ1cHQgc3Vicm91dGluZSwgc28gaXQgbXVzdCBiZSBlZmZpY2llbnQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWRkTW91c2VFdmVudCgKLSAgICB1aW50IHdoYXQsCi0gICAgdWludCBtZXNzYWdlLAotICAgIGludCB4LAotICAgIGludCB5LAotICAgIHVpbnQgYnV0X3N0YXQpCi17Ci0gICAgV0RfZXZlbnQgICAgZXZ0OwotCi0gICAgaWYgKGNvdW50IDwgRVZFTlRRU0laRSkgewotICAgICAgICBldnQud2hhdCA9IHdoYXQ7Ci0gICAgICAgIGV2dC53aGVuID0gZ2V0VGltZVN0YW1wKCk7Ci0gICAgICAgIGV2dC5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgZXZ0Lm1vZGlmaWVycyA9IGJ1dF9zdGF0IHwga2V5X21vZGlmaWVyczsKLSAgICAgICAgZXZ0LndoZXJlX3ggPSB4OwotICAgICAgICBldnQud2hlcmVfeSA9IHk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiKCVkLCVkKSwgYnV0dG9ucyAlbGRcbiIsIHgseSwgZXZ0Lm1vZGlmaWVycyk7Ci0gICAgICAgIGFkZEV2ZW50KCZldnQpOyAgICAgICAgICAgICAgICAgLyogQWRkIHRvIHRhaWwgb2YgZXZlbnQgcXVldWUgICAqLwotICAgICAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2NhbmNvZGUgICAgLSBSYXcga2V5Ym9hcmQgc2NhbiBjb2RlCi1tb2RpZmllcnMgICAtIEtleWJvYXJkIG1vZGlmaWVycyBmbGFncwotCi1SRU1BUktTOgotQ29udmVydHMgdGhlIHJhdyBzY2FuIGNvZGUgaW50byB0aGUgYXBwcm9wcmlhdGUgQVNDSUkgY29kZSB1c2luZyB0aGUgc2NhbgotY29kZSBhbmQgdGhlIGtleWJvYXJkIG1vZGlmaWVyIGZsYWdzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBnZXRLZXlNZXNzYWdlKAotICAgIHVpbnQgc2NhbmNvZGUsCi0gICAgdWxvbmcgbW9kaWZpZXJzKQotewotICAgIHVzaG9ydCAgY29kZSA9IHNjYW5jb2RlIDw8IDg7Ci0gICAgdXNob3J0ICBhc2NpaTsKLSAgICBzdHJ1Y3Qga2JlbnRyeSBrZTsKLQotICAgIGtlLmtiX2luZGV4ID0gc2NhbmNvZGU7Ci0KLSAgICAvKiBGaW5kIHRoZSBiYXNpYyBBU0NJSSBjb2RlIGZvciB0aGUgc2NhbiBjb2RlICovCi0gICAgaWYgKG1vZGlmaWVycyAmIEVWVF9DQVBTU1RBVEUpIHsKLSAgICAgICAgaWYgKG1vZGlmaWVycyAmIEVWVF9TSElGVEtFWSkKLSAgICAgICAgICBrZS5rYl90YWJsZSA9IEtfTk9STVRBQjsKLSAgICAgICAgLy8gICAgICAgICAgYXNjaWkgPSB0b2xvd2VyKGtleVRhYmxlU2hpZnRlZFtzY2FuY29kZV0pOwotICAgICAgICBlbHNlCi0gICAgICAgICAga2Uua2JfdGFibGUgPSBLX1NISUZUVEFCOwotICAgICAgICAvLyAgICAgICAgICBhc2NpaSA9IHRvdXBwZXIoa2V5VGFibGVbc2NhbmNvZGVdKTsKLSAgICAgICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAobW9kaWZpZXJzICYgRVZUX1NISUZUS0VZKQotICAgICAgICAgIGtlLmtiX3RhYmxlID0gS19TSElGVFRBQjsKLSAgICAgICAgICAvLyBhc2NpaSA9IGtleVRhYmxlU2hpZnRlZFtzY2FuY29kZV07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBrZS5rYl90YWJsZSA9IEtfTk9STVRBQjsKLSAgICAgICAgICAvLyBhc2NpaSA9IGtleVRhYmxlW3NjYW5jb2RlXTsKLSAgICAgICAgfQotICAgIGlmKG1vZGlmaWVycyAmIEVWVF9BTFRTVEFURSkKLSAgICAgIGtlLmtiX3RhYmxlIHw9IEtfQUxUVEFCOwotCi0gICAgaWYgKGlvY3RsKHR0eV9mZCwgS0RHS0JFTlQsICh1bnNpZ25lZCBsb25nKSZrZSkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJLREdLQkVOVCBhdCBpbmRleCAlZCBpbiB0YWJsZSAlZDogIiwKLSAgICAgICAgICAgIHNjYW5jb2RlLCBrZS5rYl90YWJsZSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBhc2NpaSA9IGtlLmtiX3ZhbHVlOwotCi0gICAgLyogQWRkIEFTQ0lJIGNvZGUgaWYga2V5IGlzIG5vdCBhbHQnZWQgb3IgY3RybCdlZCAqLwotICAgIGlmICghKG1vZGlmaWVycyAmIChFVlRfQUxUU1RBVEUgfCBFVlRfQ1RSTFNUQVRFKSkpCi0gICAgICAgIGNvZGUgfD0gYXNjaWk7Ci0KLSAgICByZXR1cm4gY29kZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci13aGF0ICAgICAgICAtIEV2ZW50IGNvZGUKLXNjYW5jb2RlICAgIC0gUmF3IHNjYW5jb2RlIG9mIGtleWJvYXJkIGV2ZW50IHRvIGFkZAotCi1SRU1BUktTOgotQWRkcyBhIG5ldyBrZXlib2FyZCBldmVudCB0byB0aGUgZXZlbnQgcXVldWUuIFdlIG9ubHkgdGFrZSBLRVlVUCBhbmQKLUtFWURPV04gZXZlbnQgY29kZXMsIGhvd2V2ZXIgaWYgYSBrZXkgaXMgYWxyZWFkeSBkb3duIHdlIGNvbnZlcnQgdGhlIEtFWURPV04KLXRvIGEgS0VZUkVQRUFULgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFkZEtleUV2ZW50KAotICAgIHVpbnQgd2hhdCwKLSAgICB1aW50IHNjYW5jb2RlKQotewotICAgIFdEX2V2ZW50ICAgIGV2dDsKLQotICAgIGlmIChjb3VudCA8IEVWRU5UUVNJWkUpIHsKLSAgICAgICAgZXZ0LndoYXQgPSB3aGF0OwotICAgICAgICBldnQud2hlbiA9IGdldFRpbWVTdGFtcCgpOwotICAgICAgICBldnQubWVzc2FnZSA9IGdldEtleU1lc3NhZ2Uoc2NhbmNvZGUsa2V5X21vZGlmaWVycykgfCAweDEwMDAwVUw7Ci0gICAgICAgIGV2dC53aGVyZV94ID0gZXZ0LndoZXJlX3kgPSAwOwotICAgICAgICBldnQubW9kaWZpZXJzID0ga2V5X21vZGlmaWVyczsKLSAgICAgICAgaWYgKGV2dC53aGF0ID09IEVWVF9LRVlVUCkKLSAgICAgICAgICAgIGtleV9kb3duW3NjYW5jb2RlXSA9IGZhbHNlOwotICAgICAgICBlbHNlIGlmIChldnQud2hhdCA9PSBFVlRfS0VZRE9XTikgewotICAgICAgICAgICAgaWYgKGtleV9kb3duW3NjYW5jb2RlXSkgewotICAgICAgICAgICAgICAgIGlmIChvbGRLZXkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZXZ0cVtvbGRLZXldLm1lc3NhZ2UgKz0gMHgxMDAwMFVMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX0tFWVJFUEVBVDsKLSAgICAgICAgICAgICAgICAgICAgb2xkS2V5ID0gZnJlZUhlYWQ7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEV2ZW50KCZldnQpOwotICAgICAgICAgICAgICAgICAgICBvbGRNb3ZlID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAga2V5X2Rvd25bc2NhbmNvZGVdID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICBhZGRFdmVudCgmZXZ0KTsKLSAgICAgICAgb2xkTW92ZSA9IC0xOwotICAgICAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2lnIC0gU2lnbmFsIGJlaW5nIHNlbnQgdG8gdGhpcyBzaWduYWwgaGFuZGxlcgotCi1SRU1BUktTOgotU2lnbmFsIGhhbmRsZXIgZm9yIHRoZSB0aW1lci4gVGhpcyByb3V0aW5lIHRha2VzIGNhcmUgb2YgcGVyaW9kaWNhbGx5Ci1wb3N0aW5nIHRpbWVyIGV2ZW50cyB0byB0aGUgZXZlbnQgcXVldWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB0aW1lckhhbmRsZXIoCi0gICAgaW50IHNpZykKLXsKLSAgICBXRF9ldmVudCAgICBldnQ7Ci0KLSAgICBpZiAoc2lnID09IFNJR0FMUk0pIHsKLSAgICAgICAgaWYgKGNvdW50IDwgRVZFTlRRU0laRSkgewotICAgICAgICAgICAgZXZ0LndoZW4gPSBnZXRUaW1lU3RhbXAoKTsKLSAgICAgICAgICAgIGV2dC53aGF0ID0gRVZUX1RJTUVSVElDSzsKLSAgICAgICAgICAgIGV2dC5tZXNzYWdlID0gMDsKLSAgICAgICAgICAgIGV2dC53aGVyZV94ID0gZXZ0LndoZXJlX3kgPSAwOwotICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyA9IDA7Ci0gICAgICAgICAgICBhZGRFdmVudCgmZXZ0KTsKLSAgICAgICAgICAgIG9sZE1vdmUgPSAtMTsKLSAgICAgICAgICAgIG9sZEtleSA9IC0xOwotICAgICAgICAgICAgfQotICAgICAgICBzaWduYWwoU0lHQUxSTSwgdGltZXJIYW5kbGVyKTsKLSAgICAgICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIHRlcm1pbmFsIHRvIG5vcm1hbCBvcGVyYXRpb24gb24gZXhpdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHJlc3RvcmVfdGVybSh2b2lkKQotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIGlmIChpbnN0YWxsZWQpIHsKLSAgICAgICAgLyogUmVzdG9yZSB0ZXh0IG1vZGUgYW5kIHRoZSBzdGF0ZSBvZiB0aGUgY29uc29sZSAqLwotICAgICAgICByZWdzLnguYXggPSAweDM7Ci0gICAgICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgICAgICBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKHN0YXRlQnVmLHR0eV9mZCk7Ci0KLSAgICAgICAgLyogUmVzdG9yZSBjb25zb2xlIHRvIG5vcm1hbCBvcGVyYXRpb24gKi8KLSAgICAgICAgaW9jdGwodHR5X2ZkLCBWVF9TRVRNT0RFLCAmb2xkdnRtb2RlKTsKLSAgICAgICAgaW9jdGwodHR5X2ZkLCBLRFNLQk1PREUsIG9sZGtibW9kZSk7Ci0gICAgICAgIHRjc2V0YXR0cih0dHlfZmQsIFRDU0FGTFVTSCwgJm9sZF9jb25mKTsKLSAgICAgICAgZmNudGwodHR5X2ZkLEZfU0VURkwsb2xkX2ZsYWdzICY9IH5PX05PTkJMT0NLKTsKLSAgICAgICAgUE1fY2xvc2VDb25zb2xlKHR0eV9mZCk7Ci0KLSAgICAgICAgLyogQ2xvc2UgdGhlIG1vdXNlIGRyaXZlciAqLwotICAgICAgICBjbG9zZShjb25uKTsKLQotICAgICAgICAvKiBGbGFnIHRoYXQgd2UgYXJlIG5vdCBubyBsb25nZXIgaW5zdGFsbGVkICovCi0gICAgICAgIGluc3RhbGxlZCA9IGZhbHNlOwotICAgICAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2lnbmFsIGhhbmRsZXIgdG8gY2FwdHVyZSBmb3JjZWQgcHJvZ3JhbSB0ZXJtaW5hdGlvbiBjb25kaXRpb25zIHNvIHRoYXQKLXdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBleGl0SGFuZGxlcihpbnQgc2lnKQotewotICAgIGV4aXQoLTEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNsZWVwIHVudGlsIHRoZSB2aXJ0dWFsIHRlcm1pbmFsIGlzIGFjdGl2ZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgd2FpdF92dF9hY3RpdmUodm9pZCkKLXsKLSAgICB3aGlsZSAoaW9jdGwodHR5X2ZkLCBWVF9XQUlUQUNUSVZFLCB0dHlfdmMpIDwgMCkgewotICAgICAgICBpZiAoKGVycm5vICE9IEVBR0FJTikgJiYgKGVycm5vICE9IEVJTlRSKSkgewotICAgICAgICAgICAgcGVycm9yKCJpb2N0bChWVF9XQUlUQUNUSVZFKSIpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgdXNsZWVwKDE1MDAwMCk7Ci0gICAgICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TaWduYWwgaGFuZGxlciBjYWxsZWQgd2hlbiBvdXIgdmlydHVhbCB0ZXJtaW5hbCBoYXMgYmVlbiByZWxlYXNlZCBhbmQgd2UgYXJlCi1sb3NpbmcgdGhlIGFjdGl2ZSBmb2N1cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCByZWxlYXNlX3Z0X3NpZ25hbChpbnQgbikKLXsKLSAgICBmb3JiaWRfdnRfYWNxdWlyZSA9IDE7Ci0gICAgaWYgKGZvcmJpZF92dF9yZWxlYXNlKSB7Ci0gICAgICAgIGZvcmJpZF92dF9hY3F1aXJlID0gMDsKLSAgICAgICAgaW9jdGwodHR5X2ZkLCBWVF9SRUxESVNQLCAwKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAvLyBUT0RPOiBDYWxsIHRoZSB1c2VyIHN1cHBsaWVkIHN1c3BlbmRBcHBDYWxsYmFjayBhbmQgcmVzdG9yZSB0ZXh0Ci0gICAgLy8gICAgICAgbW9kZSAoc2F2aW5nIHRoZSBleGlzdGluZyBtb2RlIHNvIHdlIGNhbiByZXN0b3JlIGl0KS4KLSAgICAvLwotICAgIC8vICAgICAgIEFsc28gaWYgdGhlIHN1c3BlbmRBcHBDYWxsYmFjayBpcyBOVUxMIHRoZW4gd2UgaGF2ZSB0bwotICAgIC8vICAgICAgIGlnbm9yZSB0aGUgc3dpdGNoIHJlcXVlc3QhCi0gICAgaWYoc3VzcGVuZEFwcENhbGxiYWNrKXsKLSAgICAgIG9sZG1vZGUgPSBWQkVfZ2V0VmlkZW9Nb2RlKCk7Ci0gICAgICBzdXNwZW5kQXBwQ2FsbGJhY2sodHJ1ZSk7Ci0gICAgICBWQkVfc2V0VmlkZW9Nb2RlKGluaXRtb2RlKTsKLSAgICB9Ci0KLSAgICBpb2N0bCh0dHlfZmQsIFZUX1JFTERJU1AsIDEpOwotICAgIGZvcmJpZF92dF9hY3F1aXJlID0gMDsKLSAgICB3YWl0X3Z0X2FjdGl2ZSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNpZ25hbCBoYW5kbGVyIGNhbGxlZCB3aGVuIG91ciB2aXJ0dWFsIHRlcm1pbmFsIGhhcyBiZWVuIHJlLWFxdWlyZWQgYW5kIHdlCi1hcmUgbm93IHJlZ2FpaW5nIHRoZSBhY3RpdmUgZm9jdXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWNxdWlyZV92dF9zaWduYWwoaW50IG4pCi17Ci0gICAgZm9yYmlkX3Z0X3JlbGVhc2UgPSAxOwotICAgIGlmIChmb3JiaWRfdnRfYWNxdWlyZSkgewotICAgICAgICBmb3JiaWRfdnRfcmVsZWFzZSA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgLy8gVE9ETzogUmVzdG9yZSB0aGUgb2xkIGRpc3BsYXkgbW9kZSwgY2FsbCB0aGUgdXNlciBzdXNwZW5kQXBwQ2FsbGJhY2sKLSAgICAvLyAgICAgICBhbmQgYW5kIHdlIHdpbGwgYmUgYmFjayBpbiBncmFwaGljcyBtb2RlLgotCi0gICAgaWYoc3VzcGVuZEFwcENhbGxiYWNrKXsKLSAgICAgIFZCRV9zZXRWaWRlb01vZGUob2xkbW9kZSk7Ci0gICAgICBzdXNwZW5kQXBwQ2FsbGJhY2soZmFsc2UpOwotICAgIH0KLQotICAgIGlvY3RsKHR0eV9mZCwgVlRfUkVMRElTUCwgVlRfQUNLQUNRKTsKLSAgICBmb3JiaWRfdnRfcmVsZWFzZSA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gc2V0IHRoZSBhY3Rpb24gZm9yIGEgc3BlY2lmaWMgc2lnbmFsIHRvIGNhbGwgb3VyIHNpZ25hbCBoYW5kbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNldF9zaWdhY3Rpb24oaW50IHNpZyx2b2lkICgqaGFuZGxlcikoaW50KSkKLXsKLSAgICBzdHJ1Y3Qgc2lnYWN0aW9uICAgIHNpZ2E7Ci0KLSAgICBzaWdhLnNhX2hhbmRsZXIgPSBoYW5kbGVyOwotICAgIHNpZ2Euc2FfZmxhZ3MgPSBTQV9SRVNUQVJUOwotICAgIG1lbXNldCgmKHNpZ2Euc2FfbWFzayksIDAsIHNpemVvZihzaWdzZXRfdCkpOwotICAgIHNpZ2FjdGlvbihzaWcsICZzaWdhLCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byB0YWtlIG92ZXIgY29udHJvbCBvZiBWVCBzd2l0Y2hpbmcgc28gdGhhdCB3ZSBjYW4gY2FwdHVyZQotdmlydHVhbCB0ZXJtaW5hbCByZWxlYXNlIGFuZCBhcXVpcmUgc2lnbmFscywgYWxsb3dpbmcgdXMgdG8gcHJvcGVybHkKLXN1cHBvcnQgVlQgc3dpdGNoaW5nIHdoaWxlIGluIGdyYXBoaWNzIG1vZGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHRha2VfdnRfY29udHJvbCh2b2lkKQotewotICAgIHN0cnVjdCB2dF9tb2RlICAgICAgdnRtb2RlOwotCi0gICAgaW9jdGwodHR5X2ZkLCBWVF9HRVRNT0RFLCAmdnRtb2RlKTsKLSAgICBvbGR2dG1vZGUgPSB2dG1vZGU7Ci0gICAgdnRtb2RlLm1vZGUgPSBWVF9QUk9DRVNTOwotICAgIHZ0bW9kZS5yZWxzaWcgPSBTSUdVU1IxOwotICAgIHZ0bW9kZS5hY3FzaWcgPSBTSUdVU1IyOwotICAgIHNldF9zaWdhY3Rpb24oU0lHVVNSMSwgcmVsZWFzZV92dF9zaWduYWwpOwotICAgIHNldF9zaWdhY3Rpb24oU0lHVVNSMiwgYWNxdWlyZV92dF9zaWduYWwpOwotICAgIGlvY3RsKHR0eV9mZCwgVlRfU0VUTU9ERSwgJm9sZHZ0bW9kZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSBzaGlmdCBrZXlib2FyZCBMRUQncyBiYXNlZCBvbiB0aGUgY3VycmVudCBrZXlib2FyZCBtb2RpZmllcnMgZmxhZ3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdXBkYXRlTEVEU3RhdHVzKHZvaWQpCi17Ci0gICAgaW50IHN0YXRlID0gMDsKLSAgICBpZiAoa2V5X21vZGlmaWVycyAmIEVWVF9DQVBTU1RBVEUpCi0gICAgICAgIHN0YXRlIHw9IExFRF9DQVA7Ci0gICAgaWYgKGtleV9tb2RpZmllcnMgJiBFVlRfTlVNU1RBVEUpCi0gICAgICAgIHN0YXRlIHw9IExFRF9OVU07Ci0gICAgaW9jdGwodHR5X2ZkLEtEU0VUTEVELHN0YXRlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuY29kZSAgICAtIFJhdyBzY2FuIGNvZGUgdG8gaGFuZGxlCi0KLVJFTUFSS1M6Ci1IYW5kbGVzIHRoZSBzaGlmdCBrZXkgbW9kaWZpZXJzIGFuZCBrZWVwcyB0cmFjayBvZiB0aGUgc2hpZnQga2V5IHN0YXRlcwotc28gdGhhdCB3ZSBjYW4gcmV0dXJuIHRoZSBjb3JyZWN0IEFTQ0lJIGNvZGVzIGZvciB0aGUga2V5Ym9hcmQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdG9nZ2xlTW9kaWZpZXJzKAotICAgIGludCBzY2FuY29kZSkKLXsKLSAgICBzdGF0aWMgaW50IGNhcHNfZG93biA9IDAsbnVtX2Rvd24gPSAwOwotCi0gICAgaWYgKHNjYW5jb2RlICYgMHg4MCkgewotICAgICAgICAvKiBIYW5kbGUga2V5LXJlbGVhc2UgZnVuY3Rpb24gKi8KLSAgICAgICAgc2NhbmNvZGUgJj0gMHg3RjsKLSAgICAgICAgaWYgKHNjYW5jb2RlID09IDB4MkEgfHwgc2NhbmNvZGUgPT0gMHgzNikKLSAgICAgICAgICAgIGtleV9tb2RpZmllcnMgJj0gfkVWVF9TSElGVEtFWTsKLSAgICAgICAgZWxzZSBpZiAoc2NhbmNvZGUgPT0gMHgxRCB8fCBzY2FuY29kZSA9PSAweDYxKQotICAgICAgICAgICAga2V5X21vZGlmaWVycyAmPSB+RVZUX0NUUkxTVEFURTsKLSAgICAgICAgZWxzZSBpZiAoc2NhbmNvZGUgPT0gMHgzOCB8fCBzY2FuY29kZSA9PSAweDY0KQotICAgICAgICAgICAga2V5X21vZGlmaWVycyAmPSB+RVZUX0FMVFNUQVRFOwotICAgICAgICBlbHNlIGlmIChzY2FuY29kZSA9PSAweDNBKQotICAgICAgICAgICAgY2Fwc19kb3duID0gZmFsc2U7Ci0gICAgICAgIGVsc2UgaWYgKHNjYW5jb2RlID09IDB4NDUpCi0gICAgICAgICAgICBudW1fZG93biA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIEhhbmRsZSBrZXktZG93biBmdW5jdGlvbiAqLwotICAgICAgICBzY2FuY29kZSAmPSAweDdGOwotICAgICAgICBpZiAoc2NhbmNvZGUgPT0gMHgyQSB8fCBzY2FuY29kZSA9PSAweDM2KQotICAgICAgICAgICAga2V5X21vZGlmaWVycyB8PSBFVlRfU0hJRlRLRVk7Ci0gICAgICAgIGVsc2UgaWYgKHNjYW5jb2RlID09IDB4MUQgfHwgc2NhbmNvZGUgPT0gMHg2MSkKLSAgICAgICAgICAgIGtleV9tb2RpZmllcnMgfD0gRVZUX0NUUkxTVEFURTsKLSAgICAgICAgZWxzZSBpZiAoc2NhbmNvZGUgPT0gMHgzOCB8fCBzY2FuY29kZSA9PSAweDY0KQotICAgICAgICAgICAga2V5X21vZGlmaWVycyB8PSBFVlRfQUxUU1RBVEU7Ci0gICAgICAgIGVsc2UgaWYgKHNjYW5jb2RlID09IDB4M0EpIHsKLSAgICAgICAgICAgIGlmICghY2Fwc19kb3duKSB7Ci0gICAgICAgICAgICAgICAga2V5X21vZGlmaWVycyBePSBFVlRfQ0FQU1NUQVRFOwotICAgICAgICAgICAgICAgIHVwZGF0ZUxFRFN0YXR1cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhcHNfZG93biA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNjYW5jb2RlID09IDB4NDUpIHsKLSAgICAgICAgICAgIGlmICghbnVtX2Rvd24pIHsKLSAgICAgICAgICAgICAgICBrZXlfbW9kaWZpZXJzIF49IEVWVF9OVU1TVEFURTsKLSAgICAgICAgICAgICAgICB1cGRhdGVMRURTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBudW1fZG93biA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIHRoYXQgaGF2ZSBjaGFuZ2VkIGZyb20gMCB0byAxCi0oYSBuZWdhdGl2ZSB2YWx1ZSBtZWFucyB0aGUgbnVtYmVyIG9mIGJpdHMgdGhhdCBoYXZlIGNoYW5nZWQgZnJvbSAxIHRvIDApIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBjb21wYXJlQml0cyhzaG9ydCBhLCBzaG9ydCBiKQotewotICAgIGludCByZXQgPSAwOwotICAgIGlmKCAoYSYxKSAhPSAoYiYxKSApIHJldCArPSAoYiYxKSA/IDEgOiAtMTsKLSAgICBpZiggKGEmMikgIT0gKGImMikgKSByZXQgKz0gKGImMikgPyAxIDogLTE7Ci0gICAgaWYoIChhJjQpICE9IChiJjQpICkgcmV0ICs9IChiJjQpID8gMSA6IC0xOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UdXJucyBvZmYgYWxsIGtleWJvYXJkIHN0YXRlIGJlY2F1c2Ugd2UgY2FuJ3QgcmVseSBvbiB0aGVtIGFueW1vcmUgYXMgc29vbgotYXMgd2Ugc3dpdGNoIFZUJ3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGtleWJvYXJkX2NsZWFyc3RhdGUodm9pZCkKLXsKLSAga2V5X21vZGlmaWVycyA9IDA7Ci0gIG1lbXNldChrZXlfZG93biwgMCwgc2l6ZW9mKGtleV9kb3duKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUHVtcHMgYWxsIGV2ZW50cyBmcm9tIHRoZSBjb25zb2xlIGV2ZW50IHF1ZXVlIGludG8gdGhlIFdpbkRpcmVjdCBldmVudCBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBwdW1wRXZlbnRzKHZvaWQpCi17Ci0gICAgc3RhdGljIHVjaGFyICAgIGJ1ZltLQkRSRUFEQlVGRkVSU0laRV07Ci0gICAgc3RhdGljIGNoYXIgICAgIGRhdGFbNV07Ci0gICAgc3RhdGljIGludCAgICAgIG9sZF9idXRzLCBvbGRfbXgsIG9sZF9teTsKLSAgICBzdGF0aWMgc3RydWN0IHRpbWV2YWwgdDsKLSAgICBmZF9zZXQgZmRzOwotICAgIGludCAgICAgICAgICAgICBudW1rZXlzLGk7Ci0gICAgaW50ICAgICAgICAgICAgIGR4LCBkeSwgYnV0czsKLQotICAgIC8qIFJlYWQgYWxsIHBlbmRpbmcga2V5cHJlc3NlcyBmcm9tIGtleWJvYXJkIGJ1ZmZlciBhbmQgcHJvY2VzcyAqLwotICAgIHdoaWxlICgobnVta2V5cyA9IHJlYWQodHR5X2ZkLCBidWYsIEtCRFJFQURCVUZGRVJTSVpFKSkgPiAwKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1rZXlzOyBpKyspIHsKLSAgICAgICAgICAgIHRvZ2dsZU1vZGlmaWVycyhidWZbaV0pOwotICAgICAgICAgICAgaWYgKGtleV9tb2RpZmllcnMgJiBFVlRfQUxUU1RBVEUpewotICAgICAgICAgICAgICBpbnQgZmtleSA9IDA7Ci0KLSAgICAgICAgICAgICAgLy8gRG8gVlQgc3dpdGNoaW5nIGhlcmUgZm9yIEFsdCtGeCBrZXlwcmVzc2VzCi0gICAgICAgICAgICAgIHN3aXRjaChidWZbaV0gJiAweDdGKXsKLSAgICAgICAgICAgICAgY2FzZSA1OSAuLi4gNjg6IC8qIEYxIHRvIEYxMCAqLwotICAgICAgICAgICAgICAgIGZrZXkgPSAoYnVmW2ldICYgMHg3RikgLSA1ODsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSA4NzogLyogRjExICovCi0gICAgICAgICAgICAgIGNhc2UgODg6IC8qIEYxMiAqLwotICAgICAgICAgICAgICAgIGZrZXkgPSAoYnVmW2ldICYgMHg3RikgLSA3NjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZihma2V5KXsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdnRfc3RhdCB2dHM7Ci0gICAgICAgICAgICAgICAgaW9jdGwodHR5X2ZkLCBWVF9HRVRTVEFURSwgJnZ0cyk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoZmtleSAhPSB2dHMudl9hY3RpdmUpewotICAgICAgICAgICAgICAgICAga2V5Ym9hcmRfY2xlYXJzdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgaW9jdGwodHR5X2ZkLCBWVF9BQ1RJVkFURSwgZmtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChidWZbaV0gJiAweDgwKQotICAgICAgICAgICAgICAgIGFkZEtleUV2ZW50KEVWVF9LRVlVUCxidWZbaV0gJiAweDdGKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhZGRLZXlFdmVudChFVlRfS0VZRE9XTixidWZbaV0gJiAweDdGKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBJZiB3ZSB3YW50IHRvIGhhbmRsZSBWQyBzd2l0Y2hpbmcgd2Ugd2lsbCBuZWVkIHRvIGRvIGl0Ci0gICAgICAgIC8vICAgICAgIGluIGhlcmUgc28gdGhhdCB3ZSBjYW4gc3dpdGNoIGF3YXkgZnJvbSB0aGUgVkMgYW5kIHRoZW4KLSAgICAgICAgLy8gICAgICAgc3dpdGNoIGJhY2sgdG8gaXQgbGF0ZXIuIFJpZ2h0IG5vdyBWQyBzd2l0Y2hpbmcgaXMgZGlzYWJsZWQKLSAgICAgICAgLy8gICAgICAgYW5kIGluIG9yZGVyIHRvIGVuYWJsZSBpdCB3ZSBuZWVkIHRvIHNhdmUvcmVzdG9yZSB0aGUgc3RhdGUKLSAgICAgICAgLy8gICAgICAgb2YgdGhlIGdyYXBoaWNzIHNjcmVlbiAodXNpbmcgdGhlIHN1c3BlbmRBcHBDYWxsYmFjayBhbmQKLSAgICAgICAgLy8gICAgICAgc2F2aW5nL3Jlc3RvcmluZyB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgZGlzcGxheSBtb2RlKS4KLQotICAgICAgICB9Ci0KLSAgICAvKiBSZWFkIGFsbCBwZW5kaW5nIG1vdXNlIGV2ZW50cyBhbmQgcHJvY2VzcyB0aGVtICovCi0gICAgaWYoY29ubiA+IDApewotICAgICAgICBGRF9aRVJPKCZmZHMpOwotICAgICAgICBGRF9TRVQoY29ubiwgJmZkcyk7Ci0gICAgICAgIHQudHZfc2VjID0gdC50dl91c2VjID0gMEw7Ci0gICAgICAgIHdoaWxlIChzZWxlY3QoY29ubisxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdCkgPiAwKSB7Ci0gICAgICAgICAgICBpZihyZWFkKGNvbm4sIGRhdGEsIDUpID09IDUpewotICAgICAgICAgICAgICAgIGJ1dHMgPSAofmRhdGFbMF0pICYgMHgwNzsKLSAgICAgICAgICAgICAgICBkeCA9IChjaGFyKShkYXRhWzFdKSArIChjaGFyKShkYXRhWzNdKTsKLSAgICAgICAgICAgICAgICBkeSA9IC0oKGNoYXIpKGRhdGFbMl0pICsgKGNoYXIpKGRhdGFbNF0pKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBteCArPSBkeDsgbXkgKz0gZHk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGR4IHx8IGR5KQotICAgICAgICAgICAgICAgICAgICBhZGRNb3VzZUV2ZW50KEVWVF9NT1VTRU1PVkUsIDAsIG14LCBteSwgYnV0cyk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGJ1dHMgIT0gb2xkX2J1dHMpewotICAgICAgICAgICAgICAgICAgICBpbnQgYyA9IGNvbXBhcmVCaXRzKGJ1dHMsb2xkX2J1dHMpOwotICAgICAgICAgICAgICAgICAgICBpZihjPjApCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRNb3VzZUV2ZW50KEVWVF9NT1VTRURPV04sIDAsIG14LCBteSwgYnV0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYzwwKQotICAgICAgICAgICAgICAgICAgICAgICAgYWRkTW91c2VFdmVudChFVlRfTU9VU0VVUCwgMCwgbXgsIG15LCBidXRzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2xkX214ID0gbXg7IG9sZF9teSA9IG15OwotICAgICAgICAgICAgICAgIG9sZF9idXRzID0gYnV0czsKLSAgICAgICAgICAgICAgICBGRF9TRVQoY29ubiwgJmZkcyk7Ci0gICAgICAgICAgICAgICAgdC50dl9zZWMgPSB0LnR2X3VzZWMgPSAwTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIGludGVyZmFjZSByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci13aGljaCAgICAgICAtIFdoaWNoIGNvZGUgZm9yIGV2ZW50IHRvIHBvc3QKLXdoYXQgICAgICAgIC0gRXZlbnQgY29kZSBmb3IgZXZlbnQgdG8gcG9zdAotbWVzc2FnZSAgICAgLSBFdmVudCBtZXNzYWdlCi1tb2RpZmllcnMgICAtIFNoaWZ0IGtleS9tb3VzZSBidXR0b24gbW9kaWZpZXJzCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIHRoZSBldmVudCB3YXMgcG9zdGVkLCBmYWxzZSBpZiBxdWV1ZSBpcyBmdWxsLgotCi1SRU1BUktTOgotUG9zdHMgYW4gZXZlbnQgdG8gdGhlIGV2ZW50IHF1ZXVlLiBUaGlzIHJvdXRpbmUgY2FuIGJlIHVzZWQgdG8gcG9zdCBhbnkgdHlwZQotb2YgZXZlbnQgaW50byB0aGUgcXVldWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgX1dEQVBJIFdEX3Bvc3RFdmVudCgKLSAgICB1bG9uZyB3aGljaCwKLSAgICB1aW50IHdoYXQsCi0gICAgdWxvbmcgbWVzc2FnZSwKLSAgICB1bG9uZyBtb2RpZmllcnMpCi17Ci0gICAgV0RfZXZlbnQgICAgZXZ0OwotCi0gICAgaWYgKGNvdW50IDwgRVZFTlRRU0laRSkgewotICAgICAgICAvKiBTYXZlIGluZm9ybWF0aW9uIGluIGV2ZW50IHJlY29yZCAqLwotICAgICAgICBldnQud2hpY2ggPSB3aGljaDsKLSAgICAgICAgZXZ0LndoYXQgPSB3aGF0OwotICAgICAgICBldnQud2hlbiA9IGdldFRpbWVTdGFtcCgpOwotICAgICAgICBldnQubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICAgIGV2dC5tb2RpZmllcnMgPSBtb2RpZmllcnM7Ci0gICAgICAgIGFkZEV2ZW50KCZldnQpOyAgICAgICAgICAgICAvKiBBZGQgdG8gdGFpbCBvZiBldmVudCBxdWV1ZSAgICovCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbWFzayAgICAtIEV2ZW50IG1hc2sgdG8gdXNlCi0KLVJFTUFSS1M6Ci1GbHVzaGVzIGFsbCB0aGUgZXZlbnQgc3BlY2lmaWVkIGluICdtYXNrJyBmcm9tIHRoZSBldmVudCBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9XREFQSSBXRF9mbHVzaEV2ZW50KAotICAgIHVpbnQgbWFzaykKLXsKLSAgICBXRF9ldmVudCAgICBldnQ7Ci0KLSAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsdXNoIGFsbCBldmVudHMgKi8KLSAgICAgICAgV0RfZ2V0RXZlbnQoJmV2dCxtYXNrKTsKLSAgICAgICAgfSB3aGlsZSAoZXZ0LndoYXQgIT0gRVZUX05VTExFVlQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWV2dCAgICAgLSBQbGFjZSB0byBzdG9yZSBldmVudAotbWFzayAgICAtIEV2ZW50IG1hc2sgdG8gdXNlCi0KLVJFTUFSS1M6Ci1IYWx0cyBwcm9ncmFtIGV4ZWN1dGlvbiB1bnRpbCBhIHNwZWNpZmllZCBldmVudCBvY2N1cnMuIFRoZSBldmVudCBpcwotcmV0dXJuZWQuIEFsbCBwZW5kaW5nIGV2ZW50cyBub3QgaW4gdGhlIHNwZWNpZmllZCBtYXNrIHdpbGwgYmUgaWdub3JlZCBhbmQKLXJlbW92ZWQgZnJvbSB0aGUgcXVldWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfV0RBUEkgV0RfaGFsdEV2ZW50KAotICAgIFdEX2V2ZW50ICpldnQsCi0gICAgdWludCBtYXNrKQotewotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2FpdCBmb3IgYW4gZXZlbnQgICAgKi8KLSAgICAgICAgV0RfZ2V0RXZlbnQoZXZ0LEVWVF9FVkVSWUVWVCk7Ci0gICAgICAgIH0gd2hpbGUgKCEoZXZ0LT53aGF0ICYgbWFzaykpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWV2dCAgICAgLSBQbGFjZSB0byBzdG9yZSBldmVudAotbWFzayAgICAtIEV2ZW50IG1hc2sgdG8gdXNlCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIGFuIGV2ZW50IHdhcyBwZW5kaW5nLgotCi1SRU1BUktTOgotUmV0cmlldmVzIHRoZSBuZXh0IHBlbmRpbmcgZXZlbnQgZGVmaW5lZCBpbiAnbWFzaycgZnJvbSB0aGUgZXZlbnQgcXVldWUuCi1UaGUgZXZlbnQgcXVldWUgaXMgYWRqdXN0ZWQgdG8gcmVmbGVjdCB0aGUgbmV3IHN0YXRlIGFmdGVyIHRoZSBldmVudCBoYXMKLWJlZW4gcmVtb3ZlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBfV0RBUEkgV0RfZ2V0RXZlbnQoCi0gICAgV0RfZXZlbnQgKmV2dCwKLSAgICB1aW50IG1hc2spCi17Ci0gICAgaW50ICAgICBldnRJRCxuZXh0LHByZXY7Ci0KLSAgICBwdW1wRXZlbnRzKCk7Ci0gICAgaWYgKG1vdmVDdXJzb3IpCi0gICAgICAgIG1vdmVDdXJzb3IobXgsbXkpOyAgICAgICAgICAgICAgICAgIC8qIE1vdmUgdGhlIG1vdXNlIGN1cnNvciAgICAqLwotICAgIGV2dC0+d2hhdCA9IEVWVF9OVUxMRVZUOyAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IHRvIG51bGwgZXZlbnQgICAgKi8KLQotICAgIGlmIChjb3VudCkgewotICAgICAgICBmb3IgKGV2dElEID0gaGVhZDsgZXZ0SUQgIT0gLTE7IGV2dElEID0gZXZ0cVtldnRJRF0ubmV4dCkgewotICAgICAgICAgICAgaWYgKGV2dHFbZXZ0SURdLndoYXQgJiBtYXNrKQotICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAvKiBGb3VuZCBhbiBldmVudCAgICAgICAgICAgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgaWYgKGV2dElEID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAvKiBFdmVudCB3YXMgbm90IGZvdW5kICAgICAgKi8KLSAgICAgICAgbmV4dCA9IGV2dHFbZXZ0SURdLm5leHQ7Ci0gICAgICAgIHByZXYgPSBldnRxW2V2dElEXS5wcmV2OwotICAgICAgICBpZiAocHJldiAhPSAtMSkKLSAgICAgICAgICAgIGV2dHFbcHJldl0ubmV4dCA9IG5leHQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGhlYWQgPSBuZXh0OwotICAgICAgICBpZiAobmV4dCAhPSAtMSkKLSAgICAgICAgICAgIGV2dHFbbmV4dF0ucHJldiA9IHByZXY7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRhaWwgPSBwcmV2OwotICAgICAgICAqZXZ0ID0gZXZ0cVtldnRJRF07ICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gdGhlIGV2ZW50ICAgICAgICAgKi8KLSAgICAgICAgZXZ0cVtldnRJRF0ubmV4dCA9IGZyZWVIZWFkOyAgICAgICAgLyogYW5kIHJldHVybiB0byBmcmVlIGxpc3QgICovCi0gICAgICAgIGZyZWVIZWFkID0gZXZ0SUQ7Ci0gICAgICAgIGNvdW50LS07Ci0gICAgICAgIGlmIChldnQtPndoYXQgPT0gRVZUX01PVVNFTU9WRSkKLSAgICAgICAgICAgIG9sZE1vdmUgPSAtMTsKLSAgICAgICAgaWYgKGV2dC0+d2hhdCA9PSBFVlRfS0VZUkVQRUFUKQotICAgICAgICAgICAgb2xkS2V5ID0gLTE7Ci0gICAgICAgIH0KLSAgICByZXR1cm4gZXZ0LT53aGF0ICE9IEVWVF9OVUxMRVZUOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWV2dCAgICAgLSBQbGFjZSB0byBzdG9yZSBldmVudAotbWFzayAgICAtIEV2ZW50IG1hc2sgdG8gdXNlCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIGFuIGV2ZW50IGlzIHBlbmRpbmcuCi0KLVJFTUFSS1M6Ci1QZWVrcyBhdCB0aGUgbmV4dCBwZW5kaW5nIGV2ZW50IGRlZmluZWQgaW4gJ21hc2snIGluIHRoZSBldmVudCBxdWV1ZS4gVGhlCi1ldmVudCBpcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSBldmVudCBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBfV0RBUEkgV0RfcGVla0V2ZW50KAotICAgIFdEX2V2ZW50ICpldnQsCi0gICAgdWludCBtYXNrKQotewotICAgIGludCAgICAgZXZ0SUQ7Ci0KLSAgICBwdW1wRXZlbnRzKCk7Ci0gICAgaWYgKG1vdmVDdXJzb3IpCi0gICAgICAgIG1vdmVDdXJzb3IobXgsbXkpOyAgICAgICAgICAgICAgICAgIC8qIE1vdmUgdGhlIG1vdXNlIGN1cnNvciAgICAqLwotICAgIGV2dC0+d2hhdCA9IEVWVF9OVUxMRVZUOyAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IHRvIG51bGwgZXZlbnQgICAgKi8KLQotICAgIGlmIChjb3VudCkgewotICAgICAgICBmb3IgKGV2dElEID0gaGVhZDsgZXZ0SUQgIT0gLTE7IGV2dElEID0gZXZ0cVtldnRJRF0ubmV4dCkgewotICAgICAgICAgICAgaWYgKGV2dHFbZXZ0SURdLndoYXQgJiBtYXNrKQotICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAvKiBGb3VuZCBhbiBldmVudCAgICAgICAgICAgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgaWYgKGV2dElEID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAvKiBFdmVudCB3YXMgbm90IGZvdW5kICAgICAgKi8KLQotICAgICAgICAqZXZ0ID0gZXZ0cVtldnRJRF07ICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gdGhlIGV2ZW50ICAgICAgICAgKi8KLSAgICAgICAgfQotICAgIHJldHVybiBldnQtPndoYXQgIT0gRVZUX05VTExFVlQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaHduZE1haW4gICAgLSBIYW5kbGUgdG8gbWFpbiB3aW5kb3cKLV94UmVzICAgICAgIC0gWCByZXNvbHV0aW9uIG9mIGdyYXBoaWNzIG1vZGUgdG8gYmUgdXNlZAotX3lSZXMgICAgICAgLSBZIHJlc29sdWxpb24gb2YgZ3JhcGhpY3MgbW9kZSB0byBiZSB1c2VkCi0KLVJFVFVSTlM6Ci1IYW5kbGUgdG8gdGhlIGZ1bGxzY3JlZW4gZXZlbnQgd2luZG93IGlmICh3ZSByZXR1cm4gaHduZE1haW4gb24gTGludXgpCi0KLVJFTUFSS1M6Ci1Jbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcKLUlTUiB0byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvCi1idWlsZCB0aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV0RfSFdORCBfV0RBUEkgV0Rfc3RhcnRGdWxsU2NyZWVuKAotICAgIFdEX0hXTkQgaHduZE1haW4sCi0gICAgaW50IF94UmVzLAotICAgIGludCBfeVJlcykKLXsKLSAgICBpbnQgICAgICAgICAgICAgaTsKLSAgICBzdHJ1Y3QgdGVybWlvcyAgY29uZjsKLSAgICBpZiAoIWluc3RhbGxlZCkgewotICAgICAgICBHcG1fQ29ubmVjdCBncG07Ci0KLSAgICAgICAgLyogQnVpbGQgZnJlZSBsaXN0LCBhbmQgaW5pdGlhbGlzZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBFVkVOVFFTSVpFOyBpKyspCi0gICAgICAgICAgICBldnRxW2ldLm5leHQgPSBpKzE7Ci0gICAgICAgIGV2dHFbRVZFTlRRU0laRS0xXS5uZXh0ID0gLTE7ICAgICAgIC8qIFRlcm1pbmF0ZSBsaXN0ICAgICAgICAgICAqLwotICAgICAgICBjb3VudCA9IGZyZWVIZWFkID0gMDsKLSAgICAgICAgaGVhZCA9IHRhaWwgPSAtMTsKLSAgICAgICAgb2xkTW92ZSA9IC0xOwotICAgICAgICBvbGRLZXkgPSAtMTsKLSAgICAgICAgeFJlcyA9IF94UmVzOwotICAgICAgICB5UmVzID0gX3lSZXM7Ci0KLSAgICAgICAgLyogT3BlbiB0aGUgY29uc29sZSBkZXZpY2UgYW5kIGluaXRpYWxpc2UgaXQgZm9yIHJhdyBtb2RlICovCi0gICAgICAgIHR0eV9mZCA9IFBNX29wZW5Db25zb2xlKCk7Ci0KLSAgICAgICAgLyogV2FpdCB1bnRpbCB2aXJ0dWFsIHRlcm1pbmFsIGlzIGFjdGl2ZSBhbmQgdGFrZSBvdmVyIGNvbnRyb2wgKi8KLSAgICAgICAgd2FpdF92dF9hY3RpdmUoKTsKLSAgICAgICAgdGFrZV92dF9jb250cm9sKCk7Ci0KLSAgICAgICAgLyogSW5pdGlhbGlzZSBrZXlib2FyZCBoYW5kbGluZyB0byByYXcgbW9kZSAqLwotICAgICAgICBpZiAoaW9jdGwodHR5X2ZkLCBLREdLQk1PREUsICZvbGRrYm1vZGUpKSB7Ci0gICAgICAgICAgICBwcmludGYoIldEX3N0YXJ0RnVsbFNjcmVlbjogY2Fubm90IGdldCBrZXlib2FyZCBtb2RlLlxuIik7Ci0gICAgICAgICAgICBleGl0KC0xKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgb2xkX2ZsYWdzID0gZmNudGwodHR5X2ZkLEZfR0VURkwpOwotICAgICAgICBmY250bCh0dHlfZmQsRl9TRVRGTCxvbGRfZmxhZ3MgfD0gT19OT05CTE9DSyk7Ci0gICAgICAgIHRjZ2V0YXR0cih0dHlfZmQsICZjb25mKTsKLSAgICAgICAgb2xkX2NvbmYgPSBjb25mOwotICAgICAgICBjb25mLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPIHwgRUNIT0UgfCBFQ0hPSyB8IEVDSE9OTCB8IE5PRkxTSCB8IElTSUcpOwotICAgICAgICBjb25mLmNfaWZsYWcgJj0gfihJU1RSSVAgfCBJR05DUiB8IElDUk5MIHwgSU5MQ1IgfCBCUktJTlQgfCBQQVJNUksgfCBJTlBDSyB8IElVQ0xDIHwgSVhPTiB8IElYT0ZGKTsKLSAgICAgICAgY29uZi5jX2lmbGFnICB8PSAoSUdOQlJLIHwgSUdOUEFSKTsKLSAgICAgICAgY29uZi5jX2NjW1ZNSU5dID0gMTsKLSAgICAgICAgY29uZi5jX2NjW1ZUSU1FXSA9IDA7Ci0gICAgICAgIGNvbmYuY19jY1tWU1VTUF0gPSAwOwotICAgICAgICB0Y3NldGF0dHIodHR5X2ZkLCBUQ1NBRkxVU0gsICZjb25mKTsKLSAgICAgICAgaW9jdGwodHR5X2ZkLCBLRFNLQk1PREUsIEtfTUVESVVNUkFXKTsKLQotICAgICAgICAvKiBDbGVhciB0aGUga2V5Ym9hcmQgc3RhdGUgaW5mb3JtYXRpb24gKi8KLSAgICAgICAgbWVtc2V0KGtleV9kb3duLCAwLCBzaXplb2Yoa2V5X2Rvd24pKTsKLSAgICAgICAgaW9jdGwodHR5X2ZkLEtEU0VUTEVELGtleV9tb2RpZmllcnMgPSAwKTsKLQotICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBtb3VzZSBjb25uZWN0aW9uIAotICAgICAgICAgICBUaGUgdXNlciAqTVVTVCogcnVuIGdwbSB3aXRoIHRoZSAgb3B0aW9uIC1SIGZvciB0aGlzIHRvIHdvcmsgKG9yIGhhdmUgYSBNb3VzZVN5c3RlbXMgbW91c2UpCi0gICAgICAgICovCi0gICAgICAgIGlmKEdwbV9PcGVuKCZncG0sMCkgPiAwKXsgLyogR1BNIGF2YWlsYWJsZSAqLwotICAgICAgICAgICAgaWYgKChjb25uID0gb3BlbihHUE1fTk9ERV9GSUZPLE9fUkRPTkxZfE9fU1lOQykpIDwgMCkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiV0Rfc3RhcnRGdWxsU2NyZWVuOiBDYW4ndCBvcGVuIG1vdXNlIGNvbm5lY3Rpb24uXG4iKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiV2FybmluZzogd2hlbiBub3QgdXNpbmcgZ3BtIC1SLCBvbmx5IE1vdXNlU3lzdGVtcyBtaWNlIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIik7Ci0gICAgICAgICAgICBpZiAoKGNvbm4gPSBvcGVuKCIvZGV2L21vdXNlIixPX1JET05MWXxPX1NZTkMpKSA8IDApCi0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIldEX3N0YXJ0RnVsbFNjcmVlbjogQ2FuJ3Qgb3BlbiAvZGV2L21vdXNlLlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgR3BtX0Nsb3NlKCk7Ci0KLSAgICAgICAgLyogVE9ETzogU2NhbGUgdGhlIG1vdXNlIGNvb3JkaW5hdGVzIHRvIHRoZSBzcGVjaWZpYyByZXNvbHV0aW9uICovCi0KLSAgICAgICAgLyogU2F2ZSB0aGUgc3RhdGUgb2YgdGhlIGNvbnNvbGUgKi8KLSAgICAgICAgaWYgKChzdGF0ZUJ1ZiA9IG1hbGxvYyhQTV9nZXRDb25zb2xlU3RhdGVTaXplKCkpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBwcmludGYoIk91dCBvZiBtZW1vcnkhXG4iKTsKLSAgICAgICAgICAgIGV4aXQoLTEpOwotICAgICAgICAgICAgfQotICAgICAgICBQTV9zYXZlQ29uc29sZVN0YXRlKHN0YXRlQnVmLHR0eV9mZCk7Ci0gICAgICAgIGluaXRtb2RlID0gVkJFX2dldFZpZGVvTW9kZSgpOwotCi0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHNpZ25hbCBoYW5kbGVyIGZvciB0aW1lciBldmVudHMgKi8KLSAgICAgICAgc2lnbmFsKFNJR0FMUk0sIHRpbWVySGFuZGxlcik7Ci0KLSAgICAgICAgLyogQ2FwdHVyZSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLwotICAgICAgICBzaWduYWwoU0lHVEVSTSwgZXhpdEhhbmRsZXIpOwotICAgICAgICBzaWduYWwoU0lHSU5ULCBleGl0SGFuZGxlcik7Ci0gICAgICAgIHNpZ25hbChTSUdRVUlULCBleGl0SGFuZGxlcik7Ci0gICAgICAgIGF0ZXhpdChyZXN0b3JlX3Rlcm0pOwotCi0gICAgICAgIC8qIFNpZ25hbCB0aGF0IHdlIGFyZSBpbnN0YWxsZWQgKi8KLSAgICAgICAgaW5zdGFsbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIHJldHVybiBod25kTWFpbjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1MZXRzIHRoZSBsaWJyYXJ5IGtub3cgd2hlbiBmdWxsc2NyZWVuIGdyYXBoaWNzIG1vZGUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgc28KLXRoYXQgd2UgY2FuIHByb3Blcmx5IHNjYWxlIHRoZSBtb3VzZSBkcml2ZXIgY29vcmRpbmF0ZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfV0RBUEkgV0RfaW5GdWxsU2NyZWVuKHZvaWQpCi17Ci0gICAgLyogTm90aGluZyB0byBkbyBpbiBoZXJlICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bwotZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9XREFQSSBXRF9yZXN0b3JlR0RJKHZvaWQpCi17Ci0gICAgcmVzdG9yZV90ZXJtKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotdGlja3MgICAtIE51bWJlciBvZiB0aWNrcyBiZXR3ZWVuIHRpbWVyIHRpY2sgbWVzc2FnZXMKLQotUkVUVVJOUzoKLVByZXZpb3VzIHZhbHVlIGZvciB0aGUgdGltZXIgdGljayBldmVudCBzcGFjaW5nLgotCi1SRU1BUktTOgotVGhlIGV2ZW50IG1vZHVsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgcGVyaW9kaWMgdGltZXIgdGljayBldmVudHMgZm9yCi15b3UsIHdpdGggJ3RpY2tzJyBiZXR3ZWVuIGVhY2ggZXZlbnQgcG9zdGluZy4gSWYgeW91IHNldCB0aGUgdmFsdWUgb2YKLSd0aWNrcycgdG8gMCwgdGhlIHRpbWVyIHRpY2sgZXZlbnRzIGFyZSB0dXJuZWQgb2ZmLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBfV0RBUEkgV0Rfc2V0VGltZXJUaWNrKAotICAgIGludCB0aWNrcykKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgIG9sZDsKLSAgICBzdHJ1Y3QgaXRpbWVydmFsICAgIHRpbTsKLSAgICBsb25nICAgICAgICAgICAgICAgIG1zID0gVElDS1NfVE9fVVNFQyh0aWNrcyk7Ci0KLSAgICBnZXRpdGltZXIoSVRJTUVSX1JFQUwsICZ0aW0pOwotICAgIG9sZCA9IFVTRUNfVE9fVElDS1ModGltLml0X3ZhbHVlLnR2X3NlYyoxMDAwMDAwLjAgKyB0aW0uaXRfdmFsdWUudHZfdXNlYyk7Ci0gICAgdGltLml0X2ludGVydmFsLnR2X3NlYyAgPSBtcyAvIDEwMDAwMDA7Ci0gICAgdGltLml0X2ludGVydmFsLnR2X3VzZWMgPSBtcyAlIDEwMDAwMDA7Ci0gICAgc2V0aXRpbWVyKElUSU1FUl9SRUFMLCAmdGltLCBOVUxMKTsKLSAgICByZXR1cm4gb2xkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNhdmVTdGF0ZSAgIC0gQWRkcmVzcyBvZiBzdXNwZW5kIGFwcCBjYWxsYmFjayB0byByZWdpc3RlcgotCi1SRU1BUktTOgotUmVnaXN0ZXJzIGEgdXNlciBhcHBsaWNhdGlvbiBzdXBwbGllZCBzdXNwZW5kIGFwcGxpY2F0aW9uIGNhbGxiYWNrIHNvIHRoYXQKLXdlIGNhbiBwcm9wZXJseSBoYW5kbGUgdmlydHVhbCB0ZXJtaW5hbCBzd2l0Y2hpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfV0RBUEkgV0Rfc2V0U3VzcGVuZEFwcENhbGxiYWNrKAotICAgIGludCAoX0FTTUFQSSAqc2F2ZVN0YXRlKShpbnQgZmxhZ3MpKQotewotICBzdXNwZW5kQXBwQ2FsbGJhY2sgPSBzYXZlU3RhdGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgoteCAgIC0gTmV3IFggY29vcmRpbmF0ZSB0byBtb3ZlIHRoZSBtb3VzZSBjdXJzb3IgdG8KLXkgICAtIE5ldyBZIGNvb3JkaW5hdGUgdG8gbW92ZSB0aGUgbW91c2UgY3Vyc29yIHRvCi0KLVJFTUFSS1M6Ci1Nb3ZlcyB0byBtb3VzZSBjdXJzb3IgdG8gdGhlIHNwZWNpZmllZCBjb29yZGluYXRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX1dEQVBJIFdEX3NldE1vdXNlUG9zKAotICAgIGludCB4LAotICAgIGludCB5KQotewotICAgIG14ID0geDsKLSAgICBteSA9IHk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgoteCAgIC0gUGxhY2UgdG8gc3RvcmUgWCBjb29yZGluYXRlIG9mIG1vdXNlIGN1cnNvcgoteSAgIC0gUGxhY2UgdG8gc3RvcmUgWSBjb29yZGluYXRlIG9mIG1vdXNlIGN1cnNvcgotCi1SRU1BUktTOgotUmVhZHMgdGhlIGN1cnJlbnQgbW91c2UgY3Vyc29yIGxvY2F0aW9uIGludCAqc2NyZWVuKiBjb29yZGluYXRlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9XREFQSSBXRF9nZXRNb3VzZVBvcygKLSAgICBpbnQgKngsCi0gICAgaW50ICp5KQotewotICAgICp4ID0gbXg7Ci0gICAgKnkgPSBteTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tY2IgLSBBZGRyZXNzIG9mIG1vdXNlIGNhbGxiYWNrIGZ1bmN0aW9uCi0KLVJFTUFSS1M6Ci1SZWdpc3RlcnMgYW4gYXBwbGljYXRpb24gc3VwcGxpZWQgbW91c2UgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQKLXdoZW5ldmVyIHRoZSBtb3VzZSBjdXJzb3IgbW92ZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfV0RBUEkgV0Rfc2V0TW91c2VDYWxsYmFjaygKLSAgICB2b2lkIChfQVNNQVBJICptY2IpKGludCB4LGludCB5KSkKLXsKLSAgICBtb3ZlQ3Vyc29yID0gbWNiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXhSZXMgICAgLSBOZXcgWCByZXNvbHV0aW9uIG9mIGdyYXBoaWNzIG1vZGUKLXlSZXMgICAgLSBOZXcgWSByZXNvbHV0aW9uIG9mIGdyYXBoaWNzIG1vZGUKLQotUkVNQVJLUzoKLVRoaXMgaXMgY2FsbGVkIHRvIGluZm9ybSB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZSB0aGF0IHRoZSBzY3JlZW4gcmVzb2x1dGlvbgotaGFzIGNoYW5nZWQgc28gdGhhdCB0aGUgbW91c2UgY29vcmRpbmF0ZXMgY2FuIGJlIHNjYWxlZCBhcHByb3ByaWF0ZWx5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX1dEQVBJIFdEX2NoYW5nZVJlc29sdXRpb24oCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMpCi17Ci0gICAgLy8gIEdwbV9GaXRWYWx1ZXMoeFJlcywgeVJlcyk7ICAvLyA/PwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNjYW5jb2RlICAgIC0gU2NhbiBjb2RlIHRvIGNoZWNrIGlmIGEga2V5IGlzIGRvd24KLQotUkVNQVJLUzoKLURldGVybWluZXMgaWYgYSBwYXJ0aWN1bGFyIGtleSBpcyBkb3duIGJhc2VkIG9uIHRoZSBzY2FuIGNvZGUgZm9yIHRoZSBrZXkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgX1dEQVBJIFdEX2lzS2V5RG93bigKLSAgICB1Y2hhciBzY2FuY29kZSkKLXsgICAKLSAgICByZXR1cm4ga2V5X2Rvd25bc2NhbmNvZGVdOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURldGVybWluZXMgaWYgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHJ1biBpbiBzYWZlIG1vZGUuIE5vdCBuZWNlc3NhcnkgZm9yCi1hbnl0aGluZyBidXQgYnJva2VuIFdpbmRvd3MgOTUgZGlzcGxheSBkcml2ZXJzIHNvIHdlIHJldHVybiBmYWxzZSBmb3IKLUxpbnV4LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBfV0RBUEkgV0RfaXNTYWZlTW9kZSh2b2lkKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkZWRmYi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9vc2hkci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIExpbnV4Ci0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBhbGwgdGhlIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgva2V5Ym9hcmQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZC5oPgotI2luY2x1ZGUgPGxpbnV4L3Z0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpZmRlZiBVU0VfT1NfSk9ZU1RJQ0sKLSNpbmNsdWRlIDxsaW51eC9qb3lzdGljay5oPgotI2VuZGlmCi0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLS8qIEludGVybmFsIGdsb2JhbCB2YXJpYWJsZXMgKi8KLQotZXh0ZXJuIGludCBfUE1fY29uc29sZV9mZCxfUE1fbGVkcyxfUE1fbW9kaWZpZXJzOwotCi0vKiBJbnRlcm5hbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0KLXZvaWQgX1BNX3Jlc3RvcmVfa2JfbW9kZSh2b2lkKTsKLXZvaWQgX1BNX2tleWJvYXJkX3Jhd21vZGUodm9pZCk7Ci0KLS8qIExpbnV4IG5lZWRzIHRoZSBnZW5lcmljIGpveXN0aWNrIHNjYWxpbmcgY29kZSAqLwotCi0jZGVmaW5lIE5FRURfU0NBTEVfSk9ZX0FYSVMKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L3BtLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9wbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTJhODM1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L3BtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODA5ICswLDAgQEAKLTsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgICAgICAgICAgICAgICAgUG9ydGlvbnMgY29weXJpZ2h0IChDKSBKb3NoIFZhbmRlcmhvb2YKLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBMaW51eAotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAotKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQotKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKLSogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAotKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9rZC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3Z0Lmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHRlcm1pb3MuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5c2NhbGwuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2lmZGVmIEVOQUJMRV9NVFJSCi0jaW5jbHVkZSA8YXNtL210cnIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGFzbS92bTg2Lmg+Ci0jaWZkZWYgX19HTElCQ19fCi0jaW5jbHVkZSA8c3lzL3Blcm0uaD4KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIFJFQUxfTUVNX0JBU0UgICAgICAgKCh2b2lkICopMHgxMDAwMCkKLSNkZWZpbmUgUkVBTF9NRU1fU0laRSAgICAgICAweDEwMDAwCi0jZGVmaW5lIFJFQUxfTUVNX0JMT0NLUyAgICAgMHgxMDAKLSNkZWZpbmUgREVGQVVMVF9WTTg2X0ZMQUdTICAoSUZfTUFTSyB8IElPUExfTUFTSykKLSNkZWZpbmUgREVGQVVMVF9TVEFDS19TSVpFICAweDEwMDAKLSNkZWZpbmUgUkVUVVJOX1RPXzMyX0lOVCAgICAyNTUKLQotLyogUXVpY2sgYW5kIGRpcnR5IGZpeCBmb3Igdm04NigpIHN5c2NhbGwgZnJvbSBscm1pIDAuNiAqLwotc3RhdGljIGludAotdm04NihzdHJ1Y3Qgdm04Nl9zdHJ1Y3QgKnZtKQotICAgIHsKLSAgICBpbnQgcjsKLSNpZmRlZiBfX1BJQ19fCi0gICAgYXNtIHZvbGF0aWxlICgKLSAgICAgInB1c2hsICUlZWJ4XG5cdCIKLSAgICAgIm1vdmwgJTIsICUlZWJ4XG5cdCIKLSAgICAgImludCAkMHg4MFxuXHQiCi0gICAgICJwb3BsICUlZWJ4IgotICAgICA6ICI9YSIgKHIpCi0gICAgIDogIjAiICgxMTMpLCAiciIgKHZtKSk7Ci0jZWxzZQotICAgIGFzbSB2b2xhdGlsZSAoCi0gICAgICJpbnQgJDB4ODAiCi0gICAgIDogIj1hIiAocikKLSAgICAgOiAiMCIgKDExMyksICJiIiAodm0pKTsKLSNlbmRpZgotICAgIHJldHVybiByOwotICAgIH0KLQotCi1zdGF0aWMgc3RydWN0IHsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWR5OwotICAgIHVuc2lnbmVkIHNob3J0ICAgICAgcmV0X3NlZywgcmV0X29mZjsKLSAgICB1bnNpZ25lZCBzaG9ydCAgICAgIHN0YWNrX3NlZywgc3RhY2tfb2ZmOwotICAgIHN0cnVjdCB2bTg2X3N0cnVjdCAgdm07Ci0gICAgfSBjb250ZXh0ID0gezB9OwotCi1zdHJ1Y3QgbWVtX2Jsb2NrIHsKLSAgICB1bnNpZ25lZCBpbnQgc2l6ZSA6IDIwOwotICAgIHVuc2lnbmVkIGludCBmcmVlIDogMTsKLSAgICB9OwotCi1zdGF0aWMgc3RydWN0IHsKLSAgICBpbnQgcmVhZHk7Ci0gICAgaW50IGNvdW50OwotICAgIHN0cnVjdCBtZW1fYmxvY2sgYmxvY2tzW1JFQUxfTUVNX0JMT0NLU107Ci0gICAgfSBtZW1faW5mbyA9IHswfTsKLQotaW50ICAgICAgICAgICAgICAgICAgICAgX1BNX2NvbnNvbGVfZmQgPSAtMTsKLWludCAgICAgICAgICAgICAgICAgICAgIF9QTV9sZWRzID0gMCxfUE1fbW9kaWZpZXJzID0gMDsKLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGluaXRlZCA9IGZhbHNlOwotc3RhdGljIGludCAgICAgICAgICAgICAgdHR5X3ZjID0gMDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIGNvbnNvbGVfY291bnQgPSAwOwotc3RhdGljIGludCAgICAgICAgICAgICAgc3RhcnR1cF92YzsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIGZkX21lbSA9IDA7Ci1zdGF0aWMgaWJvb2wgICAgICAgICAgICBpbl9yYXdfbW9kZSA9IGZhbHNlOwotI2lmZGVmIEVOQUJMRV9NVFJSCi1zdGF0aWMgaW50ICAgICAgICAgICAgICBtdHJyX2ZkOwotI2VuZGlmCi1zdGF0aWMgdWludCBWRVNBQnVmX2xlbiA9IDEwMjQ7ICAgICAvKiBMZW5ndGggb2YgdGhlIFZFU0FCdWYgYnVmZmVyICAgICAqLwotc3RhdGljIHZvaWQgKlZFU0FCdWZfcHRyID0gTlVMTDsgICAgLyogTmVhciBwb2ludGVyIHRvIFZFU0FCdWYgICAgICAgICAgKi8KLXN0YXRpYyB1aW50IFZFU0FCdWZfcnNlZzsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IG9mIFZFU0FCdWYgICAgICovCi1zdGF0aWMgdWludCBWRVNBQnVmX3JvZmY7ICAgICAgICAgICAvKiBSZWFsIG1vZGUgb2Zmc2V0IG9mIFZFU0FCdWYgICAgICAqLwotI2lmZGVmIFRSQUNFX0lPCi1zdGF0aWMgdWxvbmcgICAgICAgICAgICB0cmFjZUFkZHI7Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIFRSQUNFX0lPCi1leHRlcm4gdm9pZCBwcmludGsoY2hhciAqbXNnLC4uLik7Ci0jZW5kaWYKLQotc3RhdGljIGlubGluZSB2b2lkIHBvcnRfb3V0KGludCB2YWx1ZSwgaW50IHBvcnQpCi17Ci0jaWZkZWYgVFJBQ0VfSU8KLSAgICBwcmludGsoIiUwNFg6JTA0WDogb3V0Yi4lMDRYIDwtICUwMlhcbiIsIHRyYWNlQWRkciA+PiAxNiwgdHJhY2VBZGRyICYgMHhGRkZGLCAodXNob3J0KXBvcnQsICh1Y2hhcil2YWx1ZSk7Ci0jZW5kaWYKLSAgICBhc20gdm9sYXRpbGUgKCJvdXRiICUwLCUxIgotCSAgOjoiYSIgKCh1bnNpZ25lZCBjaGFyKSB2YWx1ZSksICJkIigodW5zaWduZWQgc2hvcnQpIHBvcnQpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHBvcnRfb3V0dyhpbnQgdmFsdWUsIGludCBwb3J0KQotewotI2lmZGVmIFRSQUNFX0lPCi0gICAgcHJpbnRrKCIlMDRYOiUwNFg6IG91dHcuJTA0WCA8LSAlMDRYXG4iLCB0cmFjZUFkZHIgPj4gMTYsdHJhY2VBZGRyICYgMHhGRkZGLCAodXNob3J0KXBvcnQsICh1c2hvcnQpdmFsdWUpOwotI2VuZGlmCi0gICAgYXNtIHZvbGF0aWxlICgib3V0dyAlMCwlMSIKLQkgOjoiYSIgKCh1bnNpZ25lZCBzaG9ydCkgdmFsdWUpLCAiZCIoKHVuc2lnbmVkIHNob3J0KSBwb3J0KSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwb3J0X291dGwoaW50IHZhbHVlLCBpbnQgcG9ydCkKLXsKLSNpZmRlZiBUUkFDRV9JTwotICAgIHByaW50aygiJTA0WDolMDRYOiBvdXRsLiUwNFggPC0gJTA4WFxuIiwgdHJhY2VBZGRyID4+IDE2LHRyYWNlQWRkciAmIDB4RkZGRiwgKHVzaG9ydClwb3J0LCAodWxvbmcpdmFsdWUpOwotI2VuZGlmCi0gICAgYXNtIHZvbGF0aWxlICgib3V0bCAlMCwlMSIKLQkgOjoiYSIgKCh1bnNpZ25lZCBsb25nKSB2YWx1ZSksICJkIigodW5zaWduZWQgc2hvcnQpIHBvcnQpKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcG9ydF9pbihpbnQgcG9ydCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIHZhbHVlOwotICAgIGFzbSB2b2xhdGlsZSAoImluYiAlMSwlMCIKLQkgICAgICA6Ij1hIiAoKHVuc2lnbmVkIGNoYXIpdmFsdWUpCi0JICAgICAgOiJkIigodW5zaWduZWQgc2hvcnQpIHBvcnQpKTsKLSNpZmRlZiBUUkFDRV9JTwotICAgIHByaW50aygiJTA0WDolMDRYOiAgaW5iLiUwNFggLT4gJTAyWFxuIiwgdHJhY2VBZGRyID4+IDE2LHRyYWNlQWRkciAmIDB4RkZGRiwgKHVzaG9ydClwb3J0LCAodWNoYXIpdmFsdWUpOwotI2VuZGlmCi0gICAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwb3J0X2ludyhpbnQgcG9ydCkKLXsKLSAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKLSAgICBhc20gdm9sYXRpbGUgKCJpbncgJTEsJTAiCi0JICAgICAgOiI9YSIgKCh1bnNpZ25lZCBzaG9ydCl2YWx1ZSkKLQkgICAgICA6ImQiKCh1bnNpZ25lZCBzaG9ydCkgcG9ydCkpOwotI2lmZGVmIFRSQUNFX0lPCi0gICAgcHJpbnRrKCIlMDRYOiUwNFg6ICBpbncuJTA0WCAtPiAlMDRYXG4iLCB0cmFjZUFkZHIgPj4gMTYsdHJhY2VBZGRyICYgMHhGRkZGLCAodXNob3J0KXBvcnQsICh1c2hvcnQpdmFsdWUpOwotI2VuZGlmCi0gICAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwb3J0X2lubChpbnQgcG9ydCkKLXsKLSAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgIGFzbSB2b2xhdGlsZSAoImlubCAlMSwlMCIKLQkgICAgICA6Ij1hIiAoKHVuc2lnbmVkIGxvbmcpdmFsdWUpCi0JICAgICAgOiJkIigodW5zaWduZWQgc2hvcnQpIHBvcnQpKTsKLSNpZmRlZiBUUkFDRV9JTwotICAgIHByaW50aygiJTA0WDolMDRYOiAgaW5sLiUwNFggLT4gJTA4WFxuIiwgdHJhY2VBZGRyID4+IDE2LHRyYWNlQWRkciAmIDB4RkZGRiwgKHVzaG9ydClwb3J0LCAodWxvbmcpdmFsdWUpOwotI2VuZGlmCi0gICAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgaW50IHJlYWxfbWVtX2luaXQodm9pZCkKLXsKLSAgICB2b2lkICAgICptOwotICAgIGludCAgICAgZmRfemVybzsKLQotICAgIGlmIChtZW1faW5mby5yZWFkeSkKLQlyZXR1cm4gMTsKLQotICAgIGlmICgoZmRfemVybyA9IG9wZW4oIi9kZXYvemVybyIsIE9fUkRPTkxZKSkgPT0gLTEpCi0JUE1fZmF0YWxFcnJvcigiWW91IG11c3QgaGF2ZSByb290IHByaXZsZWRnZXMgdG8gcnVuIHRoaXMgcHJvZ3JhbSEiKTsKLSAgICBpZiAoKG0gPSBtbWFwKCh2b2lkICopUkVBTF9NRU1fQkFTRSwgUkVBTF9NRU1fU0laRSwKLQkgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKLQkgICAgTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUsIGZkX3plcm8sIDApKSA9PSAodm9pZCAqKS0xKSB7Ci0JY2xvc2UoZmRfemVybyk7Ci0JUE1fZmF0YWxFcnJvcigiWW91IG11c3QgaGF2ZSByb290IHByaXZsZWRnZXMgdG8gcnVuIHRoaXMgcHJvZ3JhbSEiKTsKLQl9Ci0gICAgbWVtX2luZm8ucmVhZHkgPSAxOwotICAgIG1lbV9pbmZvLmNvdW50ID0gMTsKLSAgICBtZW1faW5mby5ibG9ja3NbMF0uc2l6ZSA9IFJFQUxfTUVNX1NJWkU7Ci0gICAgbWVtX2luZm8uYmxvY2tzWzBdLmZyZWUgPSAxOwotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBpbnNlcnRfYmxvY2soaW50IGkpCi17Ci0gICAgbWVtbW92ZSgKLQltZW1faW5mby5ibG9ja3MgKyBpICsgMSwKLQltZW1faW5mby5ibG9ja3MgKyBpLAotCShtZW1faW5mby5jb3VudCAtIGkpICogc2l6ZW9mKHN0cnVjdCBtZW1fYmxvY2spKTsKLSAgICBtZW1faW5mby5jb3VudCsrOwotfQotCi1zdGF0aWMgdm9pZCBkZWxldGVfYmxvY2soaW50IGkpCi17Ci0gICAgbWVtX2luZm8uY291bnQtLTsKLQotICAgIG1lbW1vdmUoCi0JbWVtX2luZm8uYmxvY2tzICsgaSwKLQltZW1faW5mby5ibG9ja3MgKyBpICsgMSwKLQkobWVtX2luZm8uY291bnQgLSBpKSAqIHNpemVvZihzdHJ1Y3QgbWVtX2Jsb2NrKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYml0KHVuc2lnbmVkIGludCBiaXQsIHZvaWQgKmFycmF5KQotewotICAgIHVuc2lnbmVkIGNoYXIgKmEgPSBhcnJheTsKLSAgICBhW2JpdCAvIDhdIHw9ICgxIDw8IChiaXQgJSA4KSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9pbnRfc2VnKGludCBpKQotewotICAgIHJldHVybiAqKHVuc2lnbmVkIHNob3J0ICopKGkgKiA0ICsgMik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9pbnRfb2ZmKGludCBpKQotewotICAgIHJldHVybiAqKHVuc2lnbmVkIHNob3J0ICopKGkgKiA0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHB1c2h3KHVuc2lnbmVkIHNob3J0IGkpCi17Ci0gICAgc3RydWN0IHZtODZfcmVncyAqciA9ICZjb250ZXh0LnZtLnJlZ3M7Ci0gICAgci0+ZXNwIC09IDI7Ci0gICAgKih1bnNpZ25lZCBzaG9ydCAqKSgoKHVuc2lnbmVkIGludClyLT5zcyA8PCA0KSArIHItPmVzcCkgPSBpOwotfQotCi1pYm9vbCBQTUFQSSBQTV9oYXZlQklPU0FjY2Vzcyh2b2lkKQoteyByZXR1cm4gdHJ1ZTsgfQotCi12b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKLXsKLSAgICB2b2lkICAgICptOwotICAgIHVpbnQgICAgcl9zZWcscl9vZmY7Ci0KLSAgICBpZiAoaW5pdGVkKQotCXJldHVybjsKLQotICAgIC8qIE1hcCB0aGUgSW50ZXJydXB0IFZlY3RvcnMgKDB4MCAtIDB4NDAwKSArIEJJT1MgZGF0YSAoMHg0MDAgLSAweDUwMikKLSAgICAgKiBhbmQgdGhlIHBoeXNpY2FsIGZyYW1lYnVmZmVyIGFuZCBST00gaW1hZ2VzIGZyb20gKDB4YTAwMDAgLSAweDEwMDAwMCkKLSAgICAgKi8KLSAgICByZWFsX21lbV9pbml0KCk7Ci0gICAgaWYgKCFmZF9tZW0gJiYgKGZkX21lbSA9IG9wZW4oIi9kZXYvbWVtIiwgT19SRFdSKSkgPT0gLTEpIHsKLQlQTV9mYXRhbEVycm9yKCJZb3UgbXVzdCBoYXZlIHJvb3QgcHJpdmlsZWdlcyB0byBydW4gdGhpcyBwcm9ncmFtISIpOwotCX0KLSAgICBpZiAoKG0gPSBtbWFwKCh2b2lkICopMCwgMHg1MDIsCi0JICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCi0JICAgIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFLCBmZF9tZW0sIDApKSA9PSAodm9pZCAqKS0xKSB7Ci0JUE1fZmF0YWxFcnJvcigiWW91IG11c3QgaGF2ZSByb290IHByaXZpbGVnZXMgdG8gcnVuIHRoaXMgcHJvZ3JhbSEiKTsKLQl9Ci0gICAgaWYgKChtID0gbW1hcCgodm9pZCAqKTB4QTAwMDAsIDB4QzAwMDAgLSAweEEwMDAwLAotCSAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfRklYRUQgfCBNQVBfU0hBUkVELCBmZF9tZW0sIDB4QTAwMDApKSA9PSAodm9pZCAqKS0xKSB7Ci0JUE1fZmF0YWxFcnJvcigiWW91IG11c3QgaGF2ZSByb290IHByaXZpbGVnZXMgdG8gcnVuIHRoaXMgcHJvZ3JhbSEiKTsKLQl9Ci0gICAgaWYgKChtID0gbW1hcCgodm9pZCAqKTB4QzAwMDAsIDB4RDAwMDAgLSAweEMwMDAwLAotCSAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLAotCSAgICBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSwgZmRfbWVtLCAweEMwMDAwKSkgPT0gKHZvaWQgKiktMSkgewotCVBNX2ZhdGFsRXJyb3IoIllvdSBtdXN0IGhhdmUgcm9vdCBwcml2aWxlZ2VzIHRvIHJ1biB0aGlzIHByb2dyYW0hIik7Ci0JfQotICAgIGlmICgobSA9IG1tYXAoKHZvaWQgKikweEQwMDAwLCAweDEwMDAwMCAtIDB4RDAwMDAsCi0JICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9GSVhFRCB8IE1BUF9TSEFSRUQsIGZkX21lbSwgMHhEMDAwMCkpID09ICh2b2lkICopLTEpIHsKLQlQTV9mYXRhbEVycm9yKCJZb3UgbXVzdCBoYXZlIHJvb3QgcHJpdmlsZWdlcyB0byBydW4gdGhpcyBwcm9ncmFtISIpOwotCX0KLSAgICBpbml0ZWQgPSAxOwotCi0gICAgLyogQWxsb2NhdGUgYSBzdGFjayAqLwotICAgIG0gPSBQTV9hbGxvY1JlYWxTZWcoREVGQVVMVF9TVEFDS19TSVpFLCZyX3NlZywmcl9vZmYpOwotICAgIGNvbnRleHQuc3RhY2tfc2VnID0gcl9zZWc7Ci0gICAgY29udGV4dC5zdGFja19vZmYgPSByX29mZitERUZBVUxUX1NUQUNLX1NJWkU7Ci0KLSAgICAvKiBBbGxvY2F0ZSB0aGUgcmV0dXJuIHRvIDMyIGJpdCByb3V0aW5lICovCi0gICAgbSA9IFBNX2FsbG9jUmVhbFNlZygyLCZyX3NlZywmcl9vZmYpOwotICAgIGNvbnRleHQucmV0X3NlZyA9IHJfc2VnOwotICAgIGNvbnRleHQucmV0X29mZiA9IHJfb2ZmOwotICAgICgodWNoYXIqKW0pWzBdID0gMHhDRDsgICAgICAgICAvKiBpbnQgb3Bjb2RlICovCi0gICAgKCh1Y2hhciopbSlbMV0gPSBSRVRVUk5fVE9fMzJfSU5UOwotICAgIG1lbXNldCgmY29udGV4dC52bSwgMCwgc2l6ZW9mKGNvbnRleHQudm0pKTsKLQotICAgIC8qIEVuYWJsZSBrZXJuZWwgZW11bGF0aW9uIG9mIGFsbCBpbnRzIGV4Y2VwdCBSRVRVUk5fVE9fMzJfSU5UICovCi0gICAgbWVtc2V0KCZjb250ZXh0LnZtLmludF9yZXZlY3RvcmVkLCAwLCBzaXplb2YoY29udGV4dC52bS5pbnRfcmV2ZWN0b3JlZCkpOwotICAgIHNldF9iaXQoUkVUVVJOX1RPXzMyX0lOVCwgJmNvbnRleHQudm0uaW50X3JldmVjdG9yZWQpOwotICAgIGNvbnRleHQucmVhZHkgPSAxOwotI2lmZGVmIEVOQUJMRV9NVFJSCi0gICAgbXRycl9mZCA9ICBvcGVuKCIvZGV2L2NwdS9tdHJyIiwgT19SRFdSLCAwKTsKLSAgICBpZiAobXRycl9mZCA8IDApCi0gICAgICAgbXRycl9mZCA9ICBvcGVuKCIvcHJvYy9tdHJyIiwgT19SRFdSLCAwKTsKLSNlbmRpZgotICAgIC8qIEVuYWJsZSBJL08gcGVybWlzc2lvbnMgdG8gZGlyZWN0bHkgYWNjZXNzIEkvTyBwb3J0cy4gV2UgYnJlYWsgdGhlCi0gICAgICogYWxsb2NhdGlvbiBpbnRvIHR3byBwYXJ0cywgb25lIGZvciB0aGUgcG9ydHMgZnJvbSAwLTB4M0ZGIGFuZAotICAgICAqIGFub3RoZXIgZm9yIHRoZSByZW1haW5pbmcgcG9ydHMgdXAgdG8gMHhGRkZGLiBTdGFuZGFyZCBMaW51eCBrZXJuZWxzCi0gICAgICogb25seSBhbGxvdyB0aGUgZmlyc3QgMHg0MDAgcG9ydHMgdG8gYmUgZW5hYmxlZCwgc28gdG8gZW5hYmxlIGFsbAotICAgICAqIDY1NTM2IHBvcnRzIHlvdSBuZWVkIGEgcGF0Y2hlZCBrZXJuZWwgdGhhdCB3aWxsIGVuYWJsZSB0aGUgZnVsbAotICAgICAqIDhLYiBJL08gcGVybWlzc2lvbnMgYml0bWFwLgotICAgICAqLwotI2lmbmRlZiBUUkFDRV9JTwotICAgIGlvcGVybSgweDAsMHg0MDAsMSk7Ci0gICAgaW9wZXJtKDB4NDAwLDB4MTAwMDAtMHg0MDAsMSk7Ci0jZW5kaWYKLSAgICBpb3BsKDMpOwotfQotCi1sb25nIFBNQVBJIFBNX2dldE9TVHlwZSh2b2lkKQoteyByZXR1cm4gX09TX0xJTlVYOyB9Ci0KLWludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQoteyByZXR1cm4gUE1fMzg2OyB9Ci0KLXZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKGNoYXIgKnMpCi17Ci0gICAgdWludCBwb3MgPSBzdHJsZW4ocyk7Ci0gICAgaWYgKHNbcG9zLTFdICE9ICcvJykgewotCXNbcG9zXSA9ICcvJzsKLQlzW3BvcysxXSA9ICdcMCc7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAotICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKLXsKLSAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcihjb25zdCBjaGFyICptc2cpCi17Ci0gICAgaWYgKGZhdGFsRXJyb3JDbGVhbnVwKQotCWZhdGFsRXJyb3JDbGVhbnVwKCk7Ci0gICAgZnByaW50ZihzdGRlcnIsIiVzXG4iLCBtc2cpOwotICAgIGZmbHVzaChzdGRlcnIpOwotICAgIGV4aXQoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEV4aXRWQkVCdWYodm9pZCkKLXsKLSAgICBpZiAoVkVTQUJ1Zl9wdHIpCi0JUE1fZnJlZVJlYWxTZWcoVkVTQUJ1Zl9wdHIpOwotICAgIFZFU0FCdWZfcHRyID0gMDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYodWludCAqbGVuLHVpbnQgKnJzZWcsdWludCAqcm9mZikKLXsKLSAgICBpZiAoIVZFU0FCdWZfcHRyKSB7Ci0JLyogQWxsb2NhdGUgYSBnbG9iYWwgYnVmZmVyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIFZFU0EgVkJFICovCi0JaWYgKChWRVNBQnVmX3B0ciA9IFBNX2FsbG9jUmVhbFNlZyhWRVNBQnVmX2xlbiwgJlZFU0FCdWZfcnNlZywgJlZFU0FCdWZfcm9mZikpID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCWF0ZXhpdChFeGl0VkJFQnVmKTsKLQl9Ci0gICAgKmxlbiA9IFZFU0FCdWZfbGVuOwotICAgICpyc2VnID0gVkVTQUJ1Zl9yc2VnOwotICAgICpyb2ZmID0gVkVTQUJ1Zl9yb2ZmOwotICAgIHJldHVybiBWRVNBQnVmX3B0cjsKLX0KLQotLyogTmV3IHJhdyBjb25zb2xlIGJhc2VkIGdldGNoIGFuZCBrYmhpdCBmdW5jdGlvbnMgKi8KLQotI2RlZmluZSBLQl9DQVBTICAgICBMRURfQ0FQIC8qIDQgKi8KLSNkZWZpbmUgS0JfTlVNTE9DSyAgTEVEX05VTSAvKiAyICovCi0jZGVmaW5lIEtCX1NDUk9MTCAgIExFRF9TQ1IgLyogMSAqLwotI2RlZmluZSBLQl9TSElGVCAgICA4Ci0jZGVmaW5lIEtCX0NPTlRST0wgIDE2Ci0jZGVmaW5lIEtCX0FMVCAgICAgIDMyCi0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIHNhdmUgdGhlIGtleWJvYXJkIG1vZGUgdG8gZGlzay4gV2Ugc2F2ZSBpdCB0byBkaXNrCi0gKiBzbyB0aGF0IHdlIGNhbiBwcm9wZXJseSByZXN0b3JlIHRoZSBtb2RlIGxhdGVyIGlmIHRoZSBwcm9ncmFtIGNyYXNoZWQuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHN0cnVjdCB0ZXJtaW9zICB0ZXJtaW9zOwotICAgIGludCAgICAgICAgICAgICBrYl9tb2RlOwotICAgIGludCAgICAgICAgICAgICBsZWRzOwotICAgIGludCAgICAgICAgICAgICBmbGFnczsKLSAgICBpbnQgICAgICAgICAgICAgc3RhcnR1cF92YzsKLSAgICB9IGtleWJvYXJkX21vZGU7Ci0KLS8qIE5hbWUgb2YgdGhlIGZpbGUgdXNlZCB0byBzYXZlIGtleWJvYXJkIG1vZGUgaW5mb3JtYXRpb24gKi8KLQotI2RlZmluZSBLQk1PREVfREFUICAia2Jtb2RlLmRhdCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PcGVuIHRoZSBrZXlib2FyZCBtb2RlIGZpbGUgb24gZGlzay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgRklMRSAqb3Blbl9rYl9tb2RlKAotICAgIGNoYXIgKm1vZGUsCi0gICAgY2hhciAqcGF0aCkKLXsKLSAgICBpZiAoIVBNX2ZpbmRCUEQoImdyYXBoaWNzLmJwZCIscGF0aCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLEtCTU9ERV9EQVQpOwotICAgIHJldHVybiBmb3BlbihwYXRoLG1vZGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIGtleWJvYXJkIHRvIG5vcm1hbCBtb2RlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfUE1fcmVzdG9yZV9rYl9tb2RlKHZvaWQpCi17Ci0gICAgRklMRSAgICAgICAgICAgICprYm1vZGU7Ci0gICAga2V5Ym9hcmRfbW9kZSAgIG1vZGU7Ci0gICAgY2hhciAgICAgICAgICAgIHBhdGhbUE1fTUFYX1BBVEhdOwotCi0gICAgaWYgKF9QTV9jb25zb2xlX2ZkICE9IC0xICYmIChrYm1vZGUgPSBvcGVuX2tiX21vZGUoInJiIixwYXRoKSkgIT0gTlVMTCkgewotCWlmIChmcmVhZCgmbW9kZSwxLHNpemVvZihtb2RlKSxrYm1vZGUpID09IHNpemVvZihtb2RlKSkgewotCSAgICBpZiAobW9kZS5zdGFydHVwX3ZjID4gMCkKLQkJaW9jdGwoX1BNX2NvbnNvbGVfZmQsIFZUX0FDVElWQVRFLCBtb2RlLnN0YXJ0dXBfdmMpOwotCSAgICBpb2N0bChfUE1fY29uc29sZV9mZCwgS0RTS0JNT0RFLCBtb2RlLmtiX21vZGUpOwotCSAgICBpb2N0bChfUE1fY29uc29sZV9mZCwgS0RTRVRMRUQsIG1vZGUubGVkcyk7Ci0JICAgIHRjc2V0YXR0cihfUE1fY29uc29sZV9mZCwgVENTQUZMVVNILCAmbW9kZS50ZXJtaW9zKTsKLQkgICAgZmNudGwoX1BNX2NvbnNvbGVfZmQsRl9TRVRGTCxtb2RlLmZsYWdzKTsKLQkgICAgfQotCWZjbG9zZShrYm1vZGUpOwotCXVubGluayhwYXRoKTsKLQlpbl9yYXdfbW9kZSA9IGZhbHNlOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfUE1fYWJvcnQoCi0gICAgaW50IHNpZ25vKQotewotICAgIGNoYXIgICAgYnVmWzgwXTsKLQotICAgIHNwcmludGYoYnVmLCJUZXJtaW5hdGluZyBvbiBzaWduYWwgJWQiLHNpZ25vKTsKLSAgICBfUE1fcmVzdG9yZV9rYl9tb2RlKCk7Ci0gICAgUE1fZmF0YWxFcnJvcihidWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVB1dCB0aGUga2V5Ym9hcmQgaW50byByYXcgbW9kZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX1BNX2tleWJvYXJkX3Jhd21vZGUodm9pZCkKLXsKLSAgICBzdHJ1Y3QgdGVybWlvcyBjb25mOwotICAgIEZJTEUgICAgICAgICAgICAqa2Jtb2RlOwotICAgIGtleWJvYXJkX21vZGUgICBtb2RlOwotICAgIGNoYXIgICAgICAgICAgICBwYXRoW1BNX01BWF9QQVRIXTsKLSAgICBpbnQgICAgICAgICAgICAgaTsKLSAgICBzdGF0aWMgaW50IHNpZ19saXN0W10gPSB7Ci0JU0lHSFVQLAotCVNJR0lOVCwKLQlTSUdRVUlULAotCVNJR0lMTCwKLQlTSUdUUkFQLAotCVNJR0FCUlQsCi0JU0lHSU9ULAotCVNJR0JVUywKLQlTSUdGUEUsCi0JU0lHS0lMTCwKLQlTSUdTRUdWLAotCVNJR1RFUk0sCi0JfTsKLQotICAgIGlmICgoa2Jtb2RlID0gb3Blbl9rYl9tb2RlKCJyYiIscGF0aCkpID09IE5VTEwpIHsKLQlpZiAoKGtibW9kZSA9IG9wZW5fa2JfbW9kZSgid2IiLHBhdGgpKSA9PSBOVUxMKQotCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gb3BlbiBrYm1vZGUuZGF0IGZpbGUgZm9yIHdyaXRpbmchIik7Ci0JaWYgKGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLREdLQk1PREUsICZtb2RlLmtiX21vZGUpKQotCSAgICBwZXJyb3IoIktER0tCTU9ERSIpOwotCWlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLREdFVExFRCwgJm1vZGUubGVkcyk7Ci0JX1BNX2xlZHMgPSBtb2RlLmxlZHMgJiAweEY7Ci0JX1BNX21vZGlmaWVycyA9IDA7Ci0JdGNnZXRhdHRyKF9QTV9jb25zb2xlX2ZkLCAmbW9kZS50ZXJtaW9zKTsKLQljb25mID0gbW9kZS50ZXJtaW9zOwotCWNvbmYuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8gfCBJU0lHKTsKLQljb25mLmNfaWZsYWcgJj0gfihJU1RSSVAgfCBJR05DUiB8IElDUk5MIHwgSU5MQ1IgfCBCUktJTlQgfCBQQVJNUksgfCBJTlBDSyB8IElVQ0xDIHwgSVhPTiB8IElYT0ZGKTsKLQljb25mLmNfaWZsYWcgIHw9IChJR05CUksgfCBJR05QQVIpOwotCWNvbmYuY19jY1tWTUlOXSA9IDE7Ci0JY29uZi5jX2NjW1ZUSU1FXSA9IDA7Ci0JY29uZi5jX2NjW1ZTVVNQXSA9IDA7Ci0JdGNzZXRhdHRyKF9QTV9jb25zb2xlX2ZkLCBUQ1NBRkxVU0gsICZjb25mKTsKLQltb2RlLmZsYWdzID0gZmNudGwoX1BNX2NvbnNvbGVfZmQsRl9HRVRGTCk7Ci0JaWYgKGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLRFNLQk1PREUsIEtfTUVESVVNUkFXKSkKLQkgICAgcGVycm9yKCJLRFNLQk1PREUiKTsKLQlhdGV4aXQoX1BNX3Jlc3RvcmVfa2JfbW9kZSk7Ci0JZm9yIChpID0gMDsgaSA8IHNpemVvZihzaWdfbGlzdCkvc2l6ZW9mKHNpZ19saXN0WzBdKTsgaSsrKQotCSAgICBzaWduYWwoc2lnX2xpc3RbaV0sIF9QTV9hYm9ydCk7Ci0JbW9kZS5zdGFydHVwX3ZjID0gc3RhcnR1cF92YzsKLQlpZiAoZndyaXRlKCZtb2RlLDEsc2l6ZW9mKG1vZGUpLGtibW9kZSkgIT0gc2l6ZW9mKG1vZGUpKQotCSAgICBQTV9mYXRhbEVycm9yKCJFcnJvciB3cml0aW5nIGtibW9kZS5kYXQhIik7Ci0JZmNsb3NlKGtibW9kZSk7Ci0JaW5fcmF3X21vZGUgPSB0cnVlOwotCX0KLX0KLQotaW50IFBNQVBJIFBNX2tiaGl0KHZvaWQpCi17Ci0gICAgZmRfc2V0IHM7Ci0gICAgc3RydWN0IHRpbWV2YWwgdHYgPSB7IDAsIDAgfTsKLQotICAgIGlmIChjb25zb2xlX2NvdW50ID09IDApCi0JUE1fZmF0YWxFcnJvcigiWW91ICptdXN0KiBvcGVuIGEgY29uc29sZSBiZWZvcmUgdXNpbmcgUE1fa2JoaXQhIik7Ci0gICAgaWYgKCFpbl9yYXdfbW9kZSkKLQlfUE1fa2V5Ym9hcmRfcmF3bW9kZSgpOwotICAgIEZEX1pFUk8oJnMpOwotICAgIEZEX1NFVChfUE1fY29uc29sZV9mZCwgJnMpOwotICAgIHJldHVybiBzZWxlY3QoX1BNX2NvbnNvbGVfZmQrMSwgJnMsIE5VTEwsIE5VTEwsICZ0dikgPiAwOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKLXsKLSAgICBzdGF0aWMgdWNoYXIgICAgYzsKLSAgICBpbnQgcmVsZWFzZTsKLSAgICBzdGF0aWMgc3RydWN0IGtiZW50cnkga2U7Ci0KLSAgICBpZiAoY29uc29sZV9jb3VudCA9PSAwKQotCVBNX2ZhdGFsRXJyb3IoIllvdSAqbXVzdCogb3BlbiBhIGNvbnNvbGUgYmVmb3JlIHVzaW5nIFBNX2dldGNoISIpOwotICAgIGlmICghaW5fcmF3X21vZGUpCi0JX1BNX2tleWJvYXJkX3Jhd21vZGUoKTsKLSAgICB3aGlsZSAocmVhZChfUE1fY29uc29sZV9mZCwgJmMsIDEpID4gMCkgewotCXJlbGVhc2UgPSBjICYgMHg4MDsKLQljICY9IDB4N0Y7Ci0JaWYgKHJlbGVhc2UpIHsKLQkgICAgc3dpdGNoKGMpewotCQljYXNlIDQyOiBjYXNlIDU0OiAvKiBTaGlmdCAqLwotCQkgICAgX1BNX21vZGlmaWVycyAmPSB+S0JfU0hJRlQ7Ci0JCSAgICBicmVhazsKLQkJY2FzZSAyOTogY2FzZSA5NzogLyogQ29udHJvbCAqLwotCQkgICAgX1BNX21vZGlmaWVycyAmPSB+S0JfQ09OVFJPTDsKLQkJICAgIGJyZWFrOwotCQljYXNlIDU2OiBjYXNlIDEwMDogLyogQWx0IC8gQWx0R3IgKi8KLQkJICAgIF9QTV9tb2RpZmllcnMgJj0gfktCX0FMVDsKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgIGNvbnRpbnVlOwotCSAgICB9Ci0Jc3dpdGNoIChjKSB7Ci0JICAgIGNhc2UgNDI6IGNhc2UgNTQ6IC8qIFNoaWZ0ICovCi0JCV9QTV9tb2RpZmllcnMgfD0gS0JfU0hJRlQ7Ci0JCSBicmVhazsKLQkgICAgY2FzZSAyOTogY2FzZSA5NzogLyogQ29udHJvbCAqLwotCQlfUE1fbW9kaWZpZXJzIHw9IEtCX0NPTlRST0w7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDU2OiBjYXNlIDEwMDogLyogQWx0IC8gQWx0R3IgKi8KLQkJX1BNX21vZGlmaWVycyB8PSBLQl9BTFQ7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDU4OiAvKiBDYXBzIExvY2sgKi8KLQkJX1BNX21vZGlmaWVycyBePSBLQl9DQVBTOwotCQlpb2N0bChfUE1fY29uc29sZV9mZCwgS0RTRVRMRUQsIF9QTV9tb2RpZmllcnMgJiA3KTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNjk6IC8qIE51bSBMb2NrICovCi0JCV9QTV9tb2RpZmllcnMgXj0gS0JfTlVNTE9DSzsKLQkJaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtEU0VUTEVELCBfUE1fbW9kaWZpZXJzICYgNyk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDcwOiAvKiBTY3JvbGwgTG9jayAqLwotCQlfUE1fbW9kaWZpZXJzIF49IEtCX1NDUk9MTDsKLQkJaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtEU0VUTEVELCBfUE1fbW9kaWZpZXJzICYgNyk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDI4OgotCQlyZXR1cm4gMHgxQzsKLQkgICAgZGVmYXVsdDoKLQkJa2Uua2JfaW5kZXggPSBjOwotCQlrZS5rYl90YWJsZSA9IDA7Ci0JCWlmICgoX1BNX21vZGlmaWVycyAmIEtCX1NISUZUKSB8fCAoX1BNX21vZGlmaWVycyAmIEtCX0NBUFMpKQotCQkgICAga2Uua2JfdGFibGUgfD0gS19TSElGVFRBQjsKLQkJaWYgKF9QTV9tb2RpZmllcnMgJiBLQl9BTFQpCi0JCSAgICBrZS5rYl90YWJsZSB8PSBLX0FMVFRBQjsKLQkJaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtER0tCRU5ULCAodWxvbmcpJmtlKTsKLQkJYyA9IGtlLmtiX3ZhbHVlICYgMHhGRjsKLQkJcmV0dXJuIGM7Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2xlZXAgdW50aWwgdGhlIHZpcnR1YWwgdGVybWluYWwgaXMgYWN0aXZlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgd2FpdF92dF9hY3RpdmUoCi0gICAgaW50IF9QTV9jb25zb2xlX2ZkKQotewotICAgIHdoaWxlIChpb2N0bChfUE1fY29uc29sZV9mZCwgVlRfV0FJVEFDVElWRSwgdHR5X3ZjKSA8IDApIHsKLQlpZiAoKGVycm5vICE9IEVBR0FJTikgJiYgKGVycm5vICE9IEVJTlRSKSkgewotCSAgICBwZXJyb3IoImlvY3RsKFZUX1dBSVRBQ1RJVkUpIik7Ci0JICAgIGV4aXQoMSk7Ci0JICAgIH0KLQl1c2xlZXAoMTUwMDAwKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2hlY2tzIHRoZSBvd25lciBvZiB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgY29uc29sZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGNoZWNrX293bmVyKAotICAgIGludCB2YykKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBzYnVmOwotICAgIGNoYXIgZm5hbWVbMzBdOwotCi0gICAgc3ByaW50ZihmbmFtZSwgIi9kZXYvdHR5JWQiLCB2Yyk7Ci0gICAgaWYgKChzdGF0KGZuYW1lLCAmc2J1ZikgPj0gMCkgJiYgKGdldHVpZCgpID09IHNidWYuc3RfdWlkKSkKLQlyZXR1cm4gMTsKLSAgICBwcmludGYoIllvdSBtdXN0IGJlIHRoZSBvd25lciBvZiB0aGUgY3VycmVudCBjb25zb2xlIHRvIHVzZSB0aGlzIHByb2dyYW0uXG4iKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DaGVja3MgaWYgdGhlIGNvbnNvbGUgaXMgY3VycmVudGx5IGluIGdyYXBoaWNzIG1vZGUsIGFuZCBpZiBzbyB3ZSBmb3JjaWJseQotcmVzdG9yZSBpdCBiYWNrIHRvIHRleHQgbW9kZSBhZ2Fpbi4gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZW4gYSBOdWNsZXVzIG9yCi1NR0wgcHJvZ3JhbSBjcmFzaGVzIGFuZCBsZWF2ZXMgdGhlIGNvbnNvbGUgaW4gZ3JhcGhpY3MgbW9kZS4gUnVubmluZyB0aGUKLXRleHRtb2RlIHV0aWxpdHkgKG9yIGFueSBvdGhlciBOdWNsZXVzL01HTCBwcm9ncmFtKSB2aWEgYSB0ZWxuZXQgc2Vzc2lvbgotaW50byB0aGUgbWFjaGluZSB3aWxsIHJlc3RvcmUgaXQgYmFjayB0byBub3JtYWwuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgcmVzdG9yZV90ZXh0X2NvbnNvbGUoCi0gICAgaW50IGNvbnNvbGVfaWQpCi17Ci0gICAgaWYgKGlvY3RsKGNvbnNvbGVfaWQsIEtEU0VUTU9ERSwgS0RfVEVYVCkgPCAwKQotCUxPR1dBUk4oImlvY3RsKEtEU0VUTU9ERSkgZmFpbGVkIik7Ci0gICAgX1BNX3Jlc3RvcmVfa2JfbW9kZSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9wZW5zIHVwIHRoZSBjb25zb2xlIGRldmljZSBmb3Igb3V0cHV0IGJ5IGZpbmRpbmcgYW4gYXBwcm9wcmlhdGUgdmlydXRhbAotY29uc29sZSB0aGF0IHdlIGNhbiBydW4gb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZSgKLSAgICBQTV9IV05EIGh3bmRVc2VyLAotICAgIGludCBkZXZpY2UsCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMsCi0gICAgaW50IGJwcCwKLSAgICBpYm9vbCBmdWxsU2NyZWVuKQotewotICAgIHN0cnVjdCB2dF9tb2RlICB2dG07Ci0gICAgc3RydWN0IHZ0X3N0YXQgIHZ0czsKLSAgICBzdHJ1Y3Qgc3RhdCAgICAgc2J1ZjsKLSAgICBjaGFyICAgICAgICAgICAgZm5hbWVbMzBdOwotCi0gICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IG9wZW5lZCB0aGUgY29uc29sZSAqLwotICAgIGlmIChjb25zb2xlX2NvdW50KyspCi0JcmV0dXJuIF9QTV9jb25zb2xlX2ZkOwotCi0gICAgLyogTm93LCBpdCB3b3VsZCBiZSBncmVhdCBpZiB3ZSBjb3VsZCB1c2UgL2Rldi90dHkgYW5kIHNlZSB3aGF0IGl0IGlzCi0gICAgICogY29ubmVjdGVkIHRvLiBBbGFzLCB3ZSBjYW5ub3QgZmluZCBvdXQgcmVsaWFibHkgd2hhdCBWQyAvZGV2L3R0eSBpcwotICAgICAqIGJvdW5kIHRvLiBUaHVzIHdlIHBhcnNlIHN0ZGluIHRocm91Z2ggc3RkZXJyIGZvciBhIHJlbGlhYmxlIFZDLgotICAgICAqLwotICAgIHN0YXJ0dXBfdmMgPSAwOwotICAgIGZvciAoX1BNX2NvbnNvbGVfZmQgPSAwOyBfUE1fY29uc29sZV9mZCA8IDM7IF9QTV9jb25zb2xlX2ZkKyspIHsKLQlpZiAoZnN0YXQoX1BNX2NvbnNvbGVfZmQsICZzYnVmKSA8IDApCi0JICAgIGNvbnRpbnVlOwotCWlmIChpb2N0bChfUE1fY29uc29sZV9mZCwgVlRfR0VUTU9ERSwgJnZ0bSkgPCAwKQotCSAgICBjb250aW51ZTsKLQlpZiAoKHNidWYuc3RfcmRldiAmIDB4RkYwMCkgIT0gMHg0MDApCi0JICAgIGNvbnRpbnVlOwotCWlmICghKHNidWYuc3RfcmRldiAmIDB4RkYpKQotCSAgICBjb250aW51ZTsKLQl0dHlfdmMgPSBzYnVmLnN0X3JkZXYgJiAweEZGOwotCXJlc3RvcmVfdGV4dF9jb25zb2xlKF9QTV9jb25zb2xlX2ZkKTsKLQlyZXR1cm4gX1BNX2NvbnNvbGVfZmQ7Ci0JfQotICAgIGlmICgoX1BNX2NvbnNvbGVfZmQgPSBvcGVuKCIvZGV2L2NvbnNvbGUiLCBPX1JEV1IpKSA8IDApIHsKLQlwcmludGYoIm9wZW5fZGV2X2NvbnNvbGU6IGNhbid0IG9wZW4gL2Rldi9jb25zb2xlIFxuIik7Ci0JZXhpdCgxKTsKLQl9Ci0gICAgaWYgKGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBWVF9PUEVOUVJZLCAmdHR5X3ZjKSA8IDApCi0JZ290byBFcnJvcjsKLSAgICBpZiAodHR5X3ZjIDw9IDApCi0JZ290byBFcnJvcjsKLSAgICBzcHJpbnRmKGZuYW1lLCAiL2Rldi90dHklZCIsIHR0eV92Yyk7Ci0gICAgY2xvc2UoX1BNX2NvbnNvbGVfZmQpOwotCi0gICAgLyogQ2hhbmdlIG91ciBjb250cm9sIHRlcm1pbmFsICovCi0gICAgc2V0c2lkKCk7Ci0KLSAgICAvKiBXZSBtdXN0IHVzZSBSRFdSIHRvIGFsbG93IGZvciBvdXRwdXQuLi4gKi8KLSAgICBpZiAoKChfUE1fY29uc29sZV9mZCA9IG9wZW4oZm5hbWUsIE9fUkRXUikpID49IDApICYmCi0JICAgIChpb2N0bChfUE1fY29uc29sZV9mZCwgVlRfR0VUU1RBVEUsICZ2dHMpID49IDApKSB7Ci0JaWYgKCFjaGVja19vd25lcih2dHMudl9hY3RpdmUpKQotCSAgICBnb3RvIEVycm9yOwotCXJlc3RvcmVfdGV4dF9jb25zb2xlKF9QTV9jb25zb2xlX2ZkKTsKLQotCS8qIFN1Y2Nlc3MsIHJlZGlyZWN0IGFsbCBzdGRpb3MgKi8KLQlmZmx1c2goc3RkaW4pOwotCWZmbHVzaChzdGRvdXQpOwotCWZmbHVzaChzdGRlcnIpOwotCWNsb3NlKDApOwotCWNsb3NlKDEpOwotCWNsb3NlKDIpOwotCWR1cChfUE1fY29uc29sZV9mZCk7Ci0JZHVwKF9QTV9jb25zb2xlX2ZkKTsKLQlkdXAoX1BNX2NvbnNvbGVfZmQpOwotCi0JLyogY2xlYXIgc2NyZWVuIGFuZCBzd2l0Y2ggdG8gaXQgKi8KLQlmd3JpdGUoIlxlW0hcZVtKIiwgNiwgMSwgc3RkZXJyKTsKLQlmZmx1c2goc3RkZXJyKTsKLQlpZiAodHR5X3ZjICE9IHZ0cy52X2FjdGl2ZSkgewotCSAgICBzdGFydHVwX3ZjID0gdnRzLnZfYWN0aXZlOwotCSAgICBpb2N0bChfUE1fY29uc29sZV9mZCwgVlRfQUNUSVZBVEUsIHR0eV92Yyk7Ci0JICAgIHdhaXRfdnRfYWN0aXZlKF9QTV9jb25zb2xlX2ZkKTsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gX1BNX2NvbnNvbGVfZmQ7Ci0KLUVycm9yOgotICAgIGlmIChfUE1fY29uc29sZV9mZCA+IDIpCi0JY2xvc2UoX1BNX2NvbnNvbGVfZmQpOwotICAgIGNvbnNvbGVfY291bnQgPSAwOwotICAgIFBNX2ZhdGFsRXJyb3IoCi0JIk5vdCBydW5uaW5nIGluIGEgZ3JhcGhpY3MgY2FwYWJsZSBjb25zb2xlLFxuIgotCSJhbmQgdW5hYmxlIHRvIGZpbmQgb25lLlxuIik7Ci0gICAgcmV0dXJuIC0xOwotfQotCi0jZGVmaW5lIEZPTlRfQyAgMHgxMDAwMCAgICAgLyogNjRLQiBmb3IgZm9udCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvbnNvbGUgc3RhdGUgYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKHZvaWQpCi17Ci0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIHJldHVybiBQTV9nZXRWR0FTdGF0ZVNpemUoKSArIEZPTlRfQyoyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhdmUgdGhlIHN0YXRlIG9mIHRoZSBMaW51eCBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSh2b2lkICpzdGF0ZUJ1ZixpbnQgY29uc29sZV9pZCkKLXsKLSAgICB1Y2hhciAgICpyZWdzID0gc3RhdGVCdWY7Ci0KLSAgICAvKiBTYXZlIHRoZSBjdXJyZW50IGNvbnNvbGUgZm9udCAqLwotICAgIGlmIChpb2N0bChjb25zb2xlX2lkLEdJT19GT05ULCZyZWdzW1BNX2dldFZHQVN0YXRlU2l6ZSgpXSkgPCAwKQotCXBlcnJvcigiaW9jdGwoR0lPX0ZPTlQpIik7Ci0KLSAgICAvKiBJbmZvcm0gdGhlIExpbnV4IGNvbnNvbGUgdGhhdCB3ZSBhcmUgZ29pbmcgaW50byBncmFwaGljcyBtb2RlICovCi0gICAgaWYgKGlvY3RsKGNvbnNvbGVfaWQsIEtEU0VUTU9ERSwgS0RfR1JBUEhJQ1MpIDwgMCkKLQlwZXJyb3IoImlvY3RsKEtEU0VUTU9ERSkiKTsKLQotICAgIC8qIFNhdmUgc3RhdGUgb2YgVkdBIHJlZ2lzdGVycyAqLwotICAgIFBNX3NhdmVWR0FTdGF0ZShzdGF0ZUJ1Zik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKGludCAoX0FTTUFQSVAgc2F2ZVN0YXRlKShpbnQgZmxhZ3MpKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCBzdXBwb3J0IGZvciBhbGxvd2luZyBjb25zb2xlIHN3aXRjaGluZyEgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgTGludXggY29uc29sZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoY29uc3Qgdm9pZCAqc3RhdGVCdWYsUE1fSFdORCBjb25zb2xlX2lkKQotewotICAgIGNvbnN0IHVjaGFyICpyZWdzID0gc3RhdGVCdWY7Ci0KLSAgICAvKiBSZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgVkdBIGNvbXBhdGlibGUgcmVnaXN0ZXJzICovCi0gICAgUE1fcmVzdG9yZVZHQVN0YXRlKHN0YXRlQnVmKTsKLQotICAgIC8qIEluZm9ybSB0aGUgTGludXggY29uc29sZSB0aGF0IHdlIGFyZSBiYWNrIGZyb20gZ3JhcGhpY3MgbW9kZXMgKi8KLSAgICBpZiAoaW9jdGwoY29uc29sZV9pZCwgS0RTRVRNT0RFLCBLRF9URVhUKSA8IDApCi0JTE9HV0FSTigiaW9jdGwoS0RTRVRNT0RFKSBmYWlsZWQiKTsKLQotICAgIC8qIFJlc3RvcmUgdGhlIG9sZCBjb25zb2xlIGZvbnQgKi8KLSAgICBpZiAoaW9jdGwoY29uc29sZV9pZCxQSU9fRk9OVCwmcmVnc1tQTV9nZXRWR0FTdGF0ZVNpemUoKV0pIDwgMCkKLQlMT0dXQVJOKCJpb2N0bChLRFNFVE1PREUpIGZhaWxlZCIpOwotCi0gICAgLyogQ29taW5nIGJhY2sgZnJvbSBncmFwaGljcyBtb2RlIG9uIExpbnV4IGFsc28gcmVzdG9yZWQgdGhlIHByZXZpb3VzCi0gICAgICogdGV4dCBtb2RlIGNvbnNvbGUgY29udGVudHMsIHNvIHdlIG5lZWQgdG8gY2xlYXIgdGhlIHNjcmVlbiB0byBnZXQKLSAgICAgKiBhcm91bmQgdGhpcyBzaW5jZSB0aGUgY3Vyc29yIGRvZXMgbm90IGdldCBob21lZCBieSBvdXIgY29kZS4KLSAgICAgKi8KLSAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLSAgICBwcmludGYoIlwwMzNbSFwwMzNbSiIpOwotICAgIGZmbHVzaChzdGRvdXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNsb3NlIHRoZSBMaW51eCBjb25zb2xlIGFuZCBwdXQgaXQgYmFjayB0byBub3JtYWwuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoUE1fSFdORCBfUE1fY29uc29sZV9mZCkKLXsKLSAgICAvKiBSZXN0b3JlIGNvbnNvbGUgdG8gbm9ybWFsIG9wZXJhdGlvbiAqLwotICAgIGlmICgtLWNvbnNvbGVfY291bnQgPT0gMCkgewotCS8qIFJlLWFjdGl2YXRlIHRoZSBvcmlnaW5hbCB2aXJ0dWFsIGNvbnNvbGUgKi8KLQlpZiAoc3RhcnR1cF92YyA+IDApCi0JICAgIGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBWVF9BQ1RJVkFURSwgc3RhcnR1cF92Yyk7Ci0KLQkvKiBDbG9zZSB0aGUgY29uc29sZSBmaWxlIGRlc2NyaXB0b3IgKi8KLQlpZiAoX1BNX2NvbnNvbGVfZmQgPiAyKQotCSAgICBjbG9zZShfUE1fY29uc29sZV9mZCk7Ci0JX1BNX2NvbnNvbGVfZmQgPSAtMTsKLQl9Ci19Ci0KLXZvaWQgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbihpbnQgeCxpbnQgeSkKLXsKLSAgICAvKiBOb3RoaW5nIHRvIGRvIGluIGhlcmUgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHNjcmVlbiB3aWR0aCBhbmQgaGVpZ2h0IGZvciB0aGUgTGludXggY29uc29sZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNX3NldE9TU2NyZWVuV2lkdGgoaW50IHdpZHRoLGludCBoZWlnaHQpCi17Ci0gICAgc3RydWN0IHdpbnNpemUgIHdzOwotICAgIHN0cnVjdCB2dF9zaXplcyB2czsKLQotICAgIC8qIFJlc2l6ZSB0aGUgc29mdHdhcmUgdGVybWluYWwgKi8KLSAgICB3cy53c19jb2wgPSB3aWR0aDsKLSAgICB3cy53c19yb3cgPSBoZWlnaHQ7Ci0gICAgaW9jdGwoX1BNX2NvbnNvbGVfZmQsIFRJT0NTV0lOU1osICZ3cyk7Ci0KLSAgICAvKiBBbmQgdGhlIGhhcmR3YXJlICovCi0gICAgdnMudl9yb3dzID0gaGVpZ2h0OwotICAgIHZzLnZfY29scyA9IHdpZHRoOwotICAgIHZzLnZfc2Nyb2xsc2l6ZSA9IDA7Ci0gICAgaW9jdGwoX1BNX2NvbnNvbGVfZmQsIFZUX1JFU0laRSwgJnZzKTsKLX0KLQotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUE1faW50SGFuZGxlciBpaCwgaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBmb3IgTGludXggKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeShpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBMaW51eCAqLwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBMaW51eCAqLwotfQotCi1jaGFyICogUE1BUEkgUE1fZ2V0Q3VycmVudFBhdGgoCi0gICAgY2hhciAqcGF0aCwKLSAgICBpbnQgbWF4TGVuKQotewotICAgIHJldHVybiBnZXRjd2QocGF0aCxtYXhMZW4pOwotfQotCi1jaGFyIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKQoteyByZXR1cm4gJy8nOyB9Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRWQkVBRlBhdGgodm9pZCkKLXsgcmV0dXJuIFBNX2dldE51Y2xldXNDb25maWdQYXRoKCk7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpCi17Ci0gICAgY2hhciAqZW52ID0gZ2V0ZW52KCJOVUNMRVVTX1BBVEgiKTsKLSAgICByZXR1cm4gZW52ID8gZW52IDogIi91c3IvbGliL251Y2xldXMiOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07Ci0gICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgYnVmWzEyOF07Ci0gICAgZ2V0aG9zdG5hbWUoYnVmLCAxMjgpOwotICAgIHJldHVybiBidWY7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMjhdOwotICAgIGdldGhvc3RuYW1lKGJ1ZiwgMTI4KTsKLSAgICByZXR1cm4gYnVmOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsKLSAgICBzdGF0aWMgdWNoYXIgKnplcm9QdHIgPSBOVUxMOwotICAgIGlmICghemVyb1B0cikKLQl6ZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRix0cnVlKTsKLSAgICByZXR1cm4gKHZvaWQqKSh6ZXJvUHRyICsgMHg0MDApOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCi17Ci0gICAgLyogUE1faW5pdCBtYXBzIGluIHRoZSAweEEwMDAwIGZyYW1lYnVmZmVyIHJlZ2lvbiAxOjEgd2l0aCBvdXIKLSAgICAgKiBhZGRyZXNzIG1hcHBpbmcsIHNvIHdlIGNhbiByZXR1cm4gdGhlIGFkZHJlc3MgaGVyZS4KLSAgICAgKi8KLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgcmV0dXJuICh2b2lkKikoMHhBMDAwMCk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCxpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICB1Y2hhciAgICpwOwotICAgIHVsb25nICAgYmFzZUFkZHIsYmFzZU9mczsKLQotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpZiAoYmFzZSA+PSAweEEwMDAwICYmIGJhc2UgPCAweDEwMDAwMCkKLQlyZXR1cm4gKHZvaWQqKWJhc2U7Ci0gICAgaWYgKCFmZF9tZW0gJiYgKGZkX21lbSA9IG9wZW4oIi9kZXYvbWVtIiwgT19SRFdSKSkgPT0gLTEpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBSb3VuZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byBhIDRLYiBib3VuZGFyeSBhbmQgdGhlIGxpbWl0IHRvIGEKLSAgICAgKiA0S2ItMSBib3VuZGFyeSBiZWZvcmUgcGFzc2luZyB0aGUgdmFsdWVzIHRvIG1tYXAuIElmIHdlIHJvdW5kIHRoZQotICAgICAqIHBoeXNpY2FsIGFkZHJlc3MsIHRoZW4gd2UgYWxzbyBhZGQgYW4gZXh0cmEgb2Zmc2V0IGludG8gdGhlIGFkZHJlc3MKLSAgICAgKiB0aGF0IHdlIHJldHVybi4KLSAgICAgKi8KLSAgICBiYXNlT2ZzID0gYmFzZSAmIDQwOTU7Ci0gICAgYmFzZUFkZHIgPSBiYXNlICYgfjQwOTU7Ci0gICAgbGltaXQgPSAoKGxpbWl0K2Jhc2VPZnMrMSs0MDk1KSAmIH40MDk1KS0xOwotICAgIGlmICgocCA9IG1tYXAoMCwgbGltaXQrMSwKLQkgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKLQkgICAgZmRfbWVtLCBiYXNlQWRkcikpID09ICh2b2lkICopLTEpCi0JcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuICh2b2lkKikocCtiYXNlT2ZzKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKLXsKLSAgICBpZiAoKHVsb25nKXB0ciA+PSAweDEwMDAwMCkKLQltdW5tYXAocHRyLGxpbWl0KzEpOwotfQotCi11bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyICovCi0gICAgLyogICAgICAgYWRkcmVzcy4gKi8KLSAgICByZXR1cm4gMHhGRkZGRkZGRlVMOwotfQotCi1pYm9vbCBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHJSYW5nZSh2b2lkICpwLHVsb25nIGxlbmd0aCx1bG9uZyAqcGh5c0FkZHJlc3MpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCBhIHJhbmdlIG9mIHBoeXNpY2FsIGFkZHJlc3NlcyAqLwotICAgIC8qICAgICAgIGZvciBhIGxpbmVhciBhZGRyZXNzLiAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zbGVlcCh1bG9uZyBtaWxsaXNlY29uZHMpCi17Ci0gICAgLyogVE9ETzogUHV0IHRoZSBwcm9jZXNzIHRvIHNsZWVwIGZvciBtaWxsaXNlY29uZHMgKi8KLX0KLQotaW50IFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNGODsKLQljYXNlIDE6IHJldHVybiAweDJGODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzQkM7Ci0JY2FzZSAxOiByZXR1cm4gMHgzNzg7Ci0JY2FzZSAyOiByZXR1cm4gMHgyNzg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKGxvbmcgc2l6ZSkKLXsKLSAgICByZXR1cm4gUE1fbWFsbG9jKHNpemUpOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQodm9pZCAqcHRyKQotewotICAgIFBNX2ZyZWUocHRyKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQoteyByZXR1cm4gKHZvaWQqKWJhc2U7IH0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKLXsKLSAgICAvKiBQTV9pbml0IG1hcHMgaW4gdGhlIDB4QTAwMDAtMHgxMDAwMDAgcmVnaW9uIDE6MSB3aXRoIG91cgotICAgICAqIGFkZHJlc3MgbWFwcGluZywgYXMgd2VsbCBhcyBhbGwgbWVtb3J5IGJsb2NrcyBpbiBhIDE6MSBhZGRyZXNzCi0gICAgICogbWFwcGluZyBzbyB3ZSBjYW4gc2ltcGx5IHJldHVybiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBpbiBoZXJlLgotICAgICAqLwotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICByZXR1cm4gKHZvaWQqKU1LX1BIWVMocl9zZWcscl9vZmYpOwotfQotCi12b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKHVpbnQgc2l6ZSx1aW50ICpyX3NlZyx1aW50ICpyX29mZikKLXsKLSAgICBpbnQgICAgIGk7Ci0gICAgY2hhciAgICAqciA9IChjaGFyICopUkVBTF9NRU1fQkFTRTsKLQotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpZiAoIW1lbV9pbmZvLnJlYWR5KQotCXJldHVybiBOVUxMOwotICAgIGlmIChtZW1faW5mby5jb3VudCA9PSBSRUFMX01FTV9CTE9DS1MpCi0JcmV0dXJuIE5VTEw7Ci0gICAgc2l6ZSA9IChzaXplICsgMTUpICYgfjE1OwotICAgIGZvciAoaSA9IDA7IGkgPCBtZW1faW5mby5jb3VudDsgaSsrKSB7Ci0JaWYgKG1lbV9pbmZvLmJsb2Nrc1tpXS5mcmVlICYmIHNpemUgPCBtZW1faW5mby5ibG9ja3NbaV0uc2l6ZSkgewotCSAgICBpbnNlcnRfYmxvY2soaSk7Ci0JICAgIG1lbV9pbmZvLmJsb2Nrc1tpXS5zaXplID0gc2l6ZTsKLQkgICAgbWVtX2luZm8uYmxvY2tzW2ldLmZyZWUgPSAwOwotCSAgICBtZW1faW5mby5ibG9ja3NbaSArIDFdLnNpemUgLT0gc2l6ZTsKLQkgICAgKnJfc2VnID0gKHVpbnQpKHIpID4+IDQ7Ci0JICAgICpyX29mZiA9ICh1aW50KShyKSAmIDB4RjsKLQkgICAgcmV0dXJuICh2b2lkICopcjsKLQkgICAgfQotCXIgKz0gbWVtX2luZm8uYmxvY2tzW2ldLnNpemU7Ci0JfQotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKHZvaWQgKm1lbSkKLXsKLSAgICBpbnQgICAgIGk7Ci0gICAgY2hhciAgICAqciA9IChjaGFyICopUkVBTF9NRU1fQkFTRTsKLQotICAgIGlmICghbWVtX2luZm8ucmVhZHkpCi0JcmV0dXJuOwotICAgIGkgPSAwOwotICAgIHdoaWxlIChtZW0gIT0gKHZvaWQgKilyKSB7Ci0JciArPSBtZW1faW5mby5ibG9ja3NbaV0uc2l6ZTsKLQlpKys7Ci0JaWYgKGkgPT0gbWVtX2luZm8uY291bnQpCi0JICAgIHJldHVybjsKLQl9Ci0gICAgbWVtX2luZm8uYmxvY2tzW2ldLmZyZWUgPSAxOwotICAgIGlmIChpICsgMSA8IG1lbV9pbmZvLmNvdW50ICYmIG1lbV9pbmZvLmJsb2Nrc1tpICsgMV0uZnJlZSkgewotCW1lbV9pbmZvLmJsb2Nrc1tpXS5zaXplICs9IG1lbV9pbmZvLmJsb2Nrc1tpICsgMV0uc2l6ZTsKLQlkZWxldGVfYmxvY2soaSArIDEpOwotCX0KLSAgICBpZiAoaSAtIDEgPj0gMCAmJiBtZW1faW5mby5ibG9ja3NbaSAtIDFdLmZyZWUpIHsKLQltZW1faW5mby5ibG9ja3NbaSAtIDFdLnNpemUgKz0gbWVtX2luZm8uYmxvY2tzW2ldLnNpemU7Ci0JZGVsZXRlX2Jsb2NrKGkpOwotCX0KLX0KLQotI2RlZmluZSBESVJFQ1RJT05fRkxBRyAgKDEgPDwgMTApCi0KLXN0YXRpYyB2b2lkIGVtX2lucyhpbnQgc2l6ZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgZWR4LCBlZGk7Ci0KLSAgICBlZHggPSBjb250ZXh0LnZtLnJlZ3MuZWR4ICYgMHhmZmZmOwotICAgIGVkaSA9IGNvbnRleHQudm0ucmVncy5lZGkgJiAweGZmZmY7Ci0gICAgZWRpICs9ICh1bnNpZ25lZCBpbnQpY29udGV4dC52bS5yZWdzLmRzIDw8IDQ7Ci0gICAgaWYgKGNvbnRleHQudm0ucmVncy5lZmxhZ3MgJiBESVJFQ1RJT05fRkxBRykgewotCWlmIChzaXplID09IDQpCi0JICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgaW5zbDsgY2xkIgotCSAgICAgOiAiPUQiIChlZGkpIDogImQiIChlZHgpLCAiMCIgKGVkaSkpOwotCWVsc2UgaWYgKHNpemUgPT0gMikKLQkgICAgYXNtIHZvbGF0aWxlICgic3RkOyBpbnN3OyBjbGQiCi0JICAgICA6ICI9RCIgKGVkaSkgOiAiZCIgKGVkeCksICIwIiAoZWRpKSk7Ci0JZWxzZQotCSAgICBhc20gdm9sYXRpbGUgKCJzdGQ7IGluc2I7IGNsZCIKLQkgICAgIDogIj1EIiAoZWRpKSA6ICJkIiAoZWR4KSwgIjAiIChlZGkpKTsKLQl9Ci0gICAgZWxzZSB7Ci0JaWYgKHNpemUgPT0gNCkKLQkgICAgYXNtIHZvbGF0aWxlICgiY2xkOyBpbnNsIgotCSAgICAgOiAiPUQiIChlZGkpIDogImQiIChlZHgpLCAiMCIgKGVkaSkpOwotCWVsc2UgaWYgKHNpemUgPT0gMikKLQkgICAgYXNtIHZvbGF0aWxlICgiY2xkOyBpbnN3IgotCSAgICAgOiAiPUQiIChlZGkpIDogImQiIChlZHgpLCAiMCIgKGVkaSkpOwotCWVsc2UKLQkgICAgYXNtIHZvbGF0aWxlICgiY2xkOyBpbnNiIgotCSAgICAgOiAiPUQiIChlZGkpIDogImQiIChlZHgpLCAiMCIgKGVkaSkpOwotCX0KLSAgICBlZGkgLT0gKHVuc2lnbmVkIGludCljb250ZXh0LnZtLnJlZ3MuZHMgPDwgNDsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWRpICY9IDB4ZmZmZjAwMDA7Ci0gICAgY29udGV4dC52bS5yZWdzLmVkaSB8PSBlZGkgJiAweGZmZmY7Ci19Ci0KLXN0YXRpYyB2b2lkIGVtX3JlcF9pbnMoaW50IHNpemUpCi17Ci0gICAgdW5zaWduZWQgaW50IGVjeCwgZWR4LCBlZGk7Ci0KLSAgICBlY3ggPSBjb250ZXh0LnZtLnJlZ3MuZWN4ICYgMHhmZmZmOwotICAgIGVkeCA9IGNvbnRleHQudm0ucmVncy5lZHggJiAweGZmZmY7Ci0gICAgZWRpID0gY29udGV4dC52bS5yZWdzLmVkaSAmIDB4ZmZmZjsKLSAgICBlZGkgKz0gKHVuc2lnbmVkIGludCljb250ZXh0LnZtLnJlZ3MuZHMgPDwgNDsKLSAgICBpZiAoY29udGV4dC52bS5yZWdzLmVmbGFncyAmIERJUkVDVElPTl9GTEFHKSB7Ci0JaWYgKHNpemUgPT0gNCkKLQkgICAgYXNtIHZvbGF0aWxlICgic3RkOyByZXA7IGluc2w7IGNsZCIKLQkgICAgIDogIj1EIiAoZWRpKSwgIj1jIiAoZWN4KQotCSAgICAgOiAiZCIgKGVkeCksICIwIiAoZWRpKSwgIjEiIChlY3gpKTsKLQllbHNlIGlmIChzaXplID09IDIpCi0JICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgcmVwOyBpbnN3OyBjbGQiCi0JICAgICA6ICI9RCIgKGVkaSksICI9YyIgKGVjeCkKLQkgICAgIDogImQiIChlZHgpLCAiMCIgKGVkaSksICIxIiAoZWN4KSk7Ci0JZWxzZQotCSAgICBhc20gdm9sYXRpbGUgKCJzdGQ7IHJlcDsgaW5zYjsgY2xkIgotCSAgICAgOiAiPUQiIChlZGkpLCAiPWMiIChlY3gpCi0JICAgICA6ICJkIiAoZWR4KSwgIjAiIChlZGkpLCAiMSIgKGVjeCkpOwotCX0KLSAgICBlbHNlIHsKLQlpZiAoc2l6ZSA9PSA0KQotCSAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IHJlcDsgaW5zbCIKLQkgICAgIDogIj1EIiAoZWRpKSwgIj1jIiAoZWN4KQotCSAgICAgOiAiZCIgKGVkeCksICIwIiAoZWRpKSwgIjEiIChlY3gpKTsKLQllbHNlIGlmIChzaXplID09IDIpCi0JICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBpbnN3IgotCSAgICAgOiAiPUQiIChlZGkpLCAiPWMiIChlY3gpCi0JICAgICA6ICJkIiAoZWR4KSwgIjAiIChlZGkpLCAiMSIgKGVjeCkpOwotCWVsc2UKLQkgICAgYXNtIHZvbGF0aWxlICgiY2xkOyByZXA7IGluc2IiCi0JICAgICA6ICI9RCIgKGVkaSksICI9YyIgKGVjeCkKLQkgICAgIDogImQiIChlZHgpLCAiMCIgKGVkaSksICIxIiAoZWN4KSk7Ci0JfQotCi0gICAgZWRpIC09ICh1bnNpZ25lZCBpbnQpY29udGV4dC52bS5yZWdzLmRzIDw8IDQ7Ci0gICAgY29udGV4dC52bS5yZWdzLmVkaSAmPSAweGZmZmYwMDAwOwotICAgIGNvbnRleHQudm0ucmVncy5lZGkgfD0gZWRpICYgMHhmZmZmOwotICAgIGNvbnRleHQudm0ucmVncy5lY3ggJj0gMHhmZmZmMDAwMDsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWN4IHw9IGVjeCAmIDB4ZmZmZjsKLX0KLQotc3RhdGljIHZvaWQgZW1fb3V0cyhpbnQgc2l6ZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgZWR4LCBlc2k7Ci0KLSAgICBlZHggPSBjb250ZXh0LnZtLnJlZ3MuZWR4ICYgMHhmZmZmOwotICAgIGVzaSA9IGNvbnRleHQudm0ucmVncy5lc2kgJiAweGZmZmY7Ci0gICAgZXNpICs9ICh1bnNpZ25lZCBpbnQpY29udGV4dC52bS5yZWdzLmRzIDw8IDQ7Ci0gICAgaWYgKGNvbnRleHQudm0ucmVncy5lZmxhZ3MgJiBESVJFQ1RJT05fRkxBRykgewotCWlmIChzaXplID09IDQpCi0JICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgb3V0c2w7IGNsZCIKLQkgICAgIDogIj1TIiAoZXNpKSA6ICJkIiAoZWR4KSwgIjAiIChlc2kpKTsKLQllbHNlIGlmIChzaXplID09IDIpCi0JICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgb3V0c3c7IGNsZCIKLQkgICAgIDogIj1TIiAoZXNpKSA6ICJkIiAoZWR4KSwgIjAiIChlc2kpKTsKLQllbHNlCi0JICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgb3V0c2I7IGNsZCIKLQkgICAgIDogIj1TIiAoZXNpKSA6ICJkIiAoZWR4KSwgIjAiIChlc2kpKTsKLQl9Ci0gICAgZWxzZSB7Ci0JaWYgKHNpemUgPT0gNCkKLQkgICAgYXNtIHZvbGF0aWxlICgiY2xkOyBvdXRzbCIKLQkgICAgIDogIj1TIiAoZXNpKSA6ICJkIiAoZWR4KSwgIjAiIChlc2kpKTsKLQllbHNlIGlmIChzaXplID09IDIpCi0JICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgb3V0c3ciCi0JICAgICA6ICI9UyIgKGVzaSkgOiAiZCIgKGVkeCksICIwIiAoZXNpKSk7Ci0JZWxzZQotCSAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IG91dHNiIgotCSAgICAgOiAiPVMiIChlc2kpIDogImQiIChlZHgpLCAiMCIgKGVzaSkpOwotCX0KLQotICAgIGVzaSAtPSAodW5zaWduZWQgaW50KWNvbnRleHQudm0ucmVncy5kcyA8PCA0OwotICAgIGNvbnRleHQudm0ucmVncy5lc2kgJj0gMHhmZmZmMDAwMDsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZXNpIHw9IGVzaSAmIDB4ZmZmZjsKLX0KLQotc3RhdGljIHZvaWQgZW1fcmVwX291dHMoaW50IHNpemUpCi17Ci0gICAgdW5zaWduZWQgaW50IGVjeCwgZWR4LCBlc2k7Ci0KLSAgICBlY3ggPSBjb250ZXh0LnZtLnJlZ3MuZWN4ICYgMHhmZmZmOwotICAgIGVkeCA9IGNvbnRleHQudm0ucmVncy5lZHggJiAweGZmZmY7Ci0gICAgZXNpID0gY29udGV4dC52bS5yZWdzLmVzaSAmIDB4ZmZmZjsKLSAgICBlc2kgKz0gKHVuc2lnbmVkIGludCljb250ZXh0LnZtLnJlZ3MuZHMgPDwgNDsKLSAgICBpZiAoY29udGV4dC52bS5yZWdzLmVmbGFncyAmIERJUkVDVElPTl9GTEFHKSB7Ci0JaWYgKHNpemUgPT0gNCkKLQkgICAgYXNtIHZvbGF0aWxlICgic3RkOyByZXA7IG91dHNsOyBjbGQiCi0JICAgICA6ICI9UyIgKGVzaSksICI9YyIgKGVjeCkKLQkgICAgIDogImQiIChlZHgpLCAiMCIgKGVzaSksICIxIiAoZWN4KSk7Ci0JZWxzZSBpZiAoc2l6ZSA9PSAyKQotCSAgICBhc20gdm9sYXRpbGUgKCJzdGQ7IHJlcDsgb3V0c3c7IGNsZCIKLQkgICAgIDogIj1TIiAoZXNpKSwgIj1jIiAoZWN4KQotCSAgICAgOiAiZCIgKGVkeCksICIwIiAoZXNpKSwgIjEiIChlY3gpKTsKLQllbHNlCi0JICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgcmVwOyBvdXRzYjsgY2xkIgotCSAgICAgOiAiPVMiIChlc2kpLCAiPWMiIChlY3gpCi0JICAgICA6ICJkIiAoZWR4KSwgIjAiIChlc2kpLCAiMSIgKGVjeCkpOwotCX0KLSAgICBlbHNlIHsKLQlpZiAoc2l6ZSA9PSA0KQotCSAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IHJlcDsgb3V0c2wiCi0JICAgICA6ICI9UyIgKGVzaSksICI9YyIgKGVjeCkKLQkgICAgIDogImQiIChlZHgpLCAiMCIgKGVzaSksICIxIiAoZWN4KSk7Ci0JZWxzZSBpZiAoc2l6ZSA9PSAyKQotCSAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IHJlcDsgb3V0c3ciCi0JICAgICA6ICI9UyIgKGVzaSksICI9YyIgKGVjeCkKLQkgICAgIDogImQiIChlZHgpLCAiMCIgKGVzaSksICIxIiAoZWN4KSk7Ci0JZWxzZQotCSAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IHJlcDsgb3V0c2IiCi0JICAgICA6ICI9UyIgKGVzaSksICI9YyIgKGVjeCkKLQkgICAgIDogImQiIChlZHgpLCAiMCIgKGVzaSksICIxIiAoZWN4KSk7Ci0JfQotCi0gICAgZXNpIC09ICh1bnNpZ25lZCBpbnQpY29udGV4dC52bS5yZWdzLmRzIDw8IDQ7Ci0gICAgY29udGV4dC52bS5yZWdzLmVzaSAmPSAweGZmZmYwMDAwOwotICAgIGNvbnRleHQudm0ucmVncy5lc2kgfD0gZXNpICYgMHhmZmZmOwotICAgIGNvbnRleHQudm0ucmVncy5lY3ggJj0gMHhmZmZmMDAwMDsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWN4IHw9IGVjeCAmIDB4ZmZmZjsKLX0KLQotc3RhdGljIGludCBlbXVsYXRlKHZvaWQpCi17Ci0gICAgdW5zaWduZWQgY2hhciAqaW5zbjsKLSAgICBzdHJ1Y3QgewotCXVuc2lnbmVkIGludCBzaXplIDogMTsKLQl1bnNpZ25lZCBpbnQgcmVwIDogMTsKLQl9IHByZWZpeCA9IHsgMCwgMCB9OwotICAgIGludCBpID0gMDsKLQotICAgIGluc24gPSAodW5zaWduZWQgY2hhciAqKSgodW5zaWduZWQgaW50KWNvbnRleHQudm0ucmVncy5jcyA8PCA0KTsKLSAgICBpbnNuICs9IGNvbnRleHQudm0ucmVncy5laXA7Ci0KLSAgICB3aGlsZSAoMSkgewotI2lmZGVmIFRSQUNFX0lPCi0JdHJhY2VBZGRyID0gKCh1bG9uZyljb250ZXh0LnZtLnJlZ3MuY3MgPDwgMTYpICsgY29udGV4dC52bS5yZWdzLmVpcCArIGk7Ci0jZW5kaWYKLQlpZiAoaW5zbltpXSA9PSAweDY2KSB7Ci0JICAgIHByZWZpeC5zaXplID0gMSAtIHByZWZpeC5zaXplOwotCSAgICBpKys7Ci0JICAgIH0KLQllbHNlIGlmIChpbnNuW2ldID09IDB4ZjMpIHsKLQkgICAgcHJlZml4LnJlcCA9IDE7Ci0JICAgIGkrKzsKLQkgICAgfQotCWVsc2UgaWYgKGluc25baV0gPT0gMHhmMCB8fCBpbnNuW2ldID09IDB4ZjIKLQkgICAgIHx8IGluc25baV0gPT0gMHgyNiB8fCBpbnNuW2ldID09IDB4MmUKLQkgICAgIHx8IGluc25baV0gPT0gMHgzNiB8fCBpbnNuW2ldID09IDB4M2UKLQkgICAgIHx8IGluc25baV0gPT0gMHg2NCB8fCBpbnNuW2ldID09IDB4NjUKLQkgICAgIHx8IGluc25baV0gPT0gMHg2NykgewotCSAgICAvKiB0aGVzZSBwcmVmaXhlcyBhcmUganVzdCBpZ25vcmVkICovCi0JICAgIGkrKzsKLQkgICAgfQotCWVsc2UgaWYgKGluc25baV0gPT0gMHg2YykgewotCSAgICBpZiAocHJlZml4LnJlcCkKLQkJZW1fcmVwX2lucygxKTsKLQkgICAgZWxzZQotCQllbV9pbnMoMSk7Ci0JICAgIGkrKzsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQllbHNlIGlmIChpbnNuW2ldID09IDB4NmQpIHsKLQkgICAgaWYgKHByZWZpeC5yZXApIHsKLQkJaWYgKHByZWZpeC5zaXplKQotCQkgICAgZW1fcmVwX2lucyg0KTsKLQkJZWxzZQotCQkgICAgZW1fcmVwX2lucygyKTsKLQkJfQotCSAgICBlbHNlIHsKLQkJaWYgKHByZWZpeC5zaXplKQotCQkgICAgZW1faW5zKDQpOwotCQllbHNlCi0JCSAgICBlbV9pbnMoMik7Ci0JCX0KLQkgICAgaSsrOwotCSAgICBicmVhazsKLQkgICAgfQotCWVsc2UgaWYgKGluc25baV0gPT0gMHg2ZSkgewotCSAgICBpZiAocHJlZml4LnJlcCkKLQkJZW1fcmVwX291dHMoMSk7Ci0JICAgIGVsc2UKLQkJZW1fb3V0cygxKTsKLQkgICAgaSsrOwotCSAgICBicmVhazsKLQkgICAgfQotCWVsc2UgaWYgKGluc25baV0gPT0gMHg2ZikgewotCSAgICBpZiAocHJlZml4LnJlcCkgewotCQlpZiAocHJlZml4LnNpemUpCi0JCSAgICBlbV9yZXBfb3V0cyg0KTsKLQkJZWxzZQotCQkgICAgZW1fcmVwX291dHMoMik7Ci0JCX0KLQkgICAgZWxzZSB7Ci0JCWlmIChwcmVmaXguc2l6ZSkKLQkJICAgIGVtX291dHMoNCk7Ci0JCWVsc2UKLQkJICAgIGVtX291dHMoMik7Ci0JCX0KLQkgICAgaSsrOwotCSAgICBicmVhazsKLQkgICAgfQotCWVsc2UgaWYgKGluc25baV0gPT0gMHhlYykgewotCSAgICAqKCh1Y2hhciopJmNvbnRleHQudm0ucmVncy5lYXgpID0gcG9ydF9pbihjb250ZXh0LnZtLnJlZ3MuZWR4KTsKLQkgICAgaSsrOwotCSAgICBicmVhazsKLQkgICAgfQotCWVsc2UgaWYgKGluc25baV0gPT0gMHhlZCkgewotCSAgICBpZiAocHJlZml4LnNpemUpCi0JCSooKHVsb25nKikmY29udGV4dC52bS5yZWdzLmVheCkgPSBwb3J0X2lubChjb250ZXh0LnZtLnJlZ3MuZWR4KTsKLQkgICAgZWxzZQotCQkqKCh1c2hvcnQqKSZjb250ZXh0LnZtLnJlZ3MuZWF4KSA9IHBvcnRfaW53KGNvbnRleHQudm0ucmVncy5lZHgpOwotCSAgICBpKys7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JZWxzZSBpZiAoaW5zbltpXSA9PSAweGVlKSB7Ci0JICAgIHBvcnRfb3V0KGNvbnRleHQudm0ucmVncy5lYXgsY29udGV4dC52bS5yZWdzLmVkeCk7Ci0JICAgIGkrKzsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQllbHNlIGlmIChpbnNuW2ldID09IDB4ZWYpIHsKLQkgICAgaWYgKHByZWZpeC5zaXplKQotCQlwb3J0X291dGwoY29udGV4dC52bS5yZWdzLmVheCxjb250ZXh0LnZtLnJlZ3MuZWR4KTsKLQkgICAgZWxzZQotCQlwb3J0X291dHcoY29udGV4dC52bS5yZWdzLmVheCxjb250ZXh0LnZtLnJlZ3MuZWR4KTsKLQkgICAgaSsrOwotCSAgICBicmVhazsKLQkgICAgfQotCWVsc2UKLQkgICAgcmV0dXJuIDA7Ci0JfQotCi0gICAgY29udGV4dC52bS5yZWdzLmVpcCArPSBpOwotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBkZWJ1Z19pbmZvKGludCB2cmV0KQotewotICAgIGludCBpOwotICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0KLSAgICBmcHV0cygidm04NigpIGZhaWxlZFxuIiwgc3RkZXJyKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgInJldHVybiA9IDB4JXhcbiIsIHZyZXQpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZWF4ID0gMHglMDhseFxuIiwgY29udGV4dC52bS5yZWdzLmVheCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJlYnggPSAweCUwOGx4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZWJ4KTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImVjeCA9IDB4JTA4bHhcbiIsIGNvbnRleHQudm0ucmVncy5lY3gpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZWR4ID0gMHglMDhseFxuIiwgY29udGV4dC52bS5yZWdzLmVkeCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJlc2kgPSAweCUwOGx4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZXNpKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImVkaSA9IDB4JTA4bHhcbiIsIGNvbnRleHQudm0ucmVncy5lZGkpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZWJwID0gMHglMDhseFxuIiwgY29udGV4dC52bS5yZWdzLmVicCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJlaXAgPSAweCUwOGx4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZWlwKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImNzICA9IDB4JTA0eFxuIiwgY29udGV4dC52bS5yZWdzLmNzKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImVzcCA9IDB4JTA4bHhcbiIsIGNvbnRleHQudm0ucmVncy5lc3ApOwotICAgIGZwcmludGYoc3RkZXJyLCAic3MgID0gMHglMDR4XG4iLCBjb250ZXh0LnZtLnJlZ3Muc3MpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZHMgID0gMHglMDR4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZHMpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZXMgID0gMHglMDR4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZXMpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZnMgID0gMHglMDR4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZnMpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZ3MgID0gMHglMDR4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZ3MpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZWZsYWdzICA9IDB4JTA4bHhcbiIsIGNvbnRleHQudm0ucmVncy5lZmxhZ3MpOwotICAgIGZwdXRzKCJjczppcCA9IFsgIiwgc3RkZXJyKTsKLSAgICBwID0gKHVuc2lnbmVkIGNoYXIgKikoKGNvbnRleHQudm0ucmVncy5jcyA8PCA0KSArIChjb250ZXh0LnZtLnJlZ3MuZWlwICYgMHhmZmZmKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpCi0JICAgIGZwcmludGYoc3RkZXJyLCAiJTAyeCAiLCAodW5zaWduZWQgaW50KXBbaV0pOwotICAgIGZwdXRzKCJdXG4iLCBzdGRlcnIpOwotICAgIGZmbHVzaChzdGRlcnIpOwotfQotCi1zdGF0aWMgaW50IHJ1bl92bTg2KHZvaWQpCi17Ci0gICAgdW5zaWduZWQgaW50IHZyZXQ7Ci0KLSAgICBmb3IgKDs7KSB7Ci0JdnJldCA9IHZtODYoJmNvbnRleHQudm0pOwotCWlmIChWTTg2X1RZUEUodnJldCkgPT0gVk04Nl9JTlR4KSB7Ci0JICAgIHVuc2lnbmVkIGludCB2ID0gVk04Nl9BUkcodnJldCk7Ci0JICAgIGlmICh2ID09IFJFVFVSTl9UT18zMl9JTlQpCi0JCXJldHVybiAxOwotCSAgICBwdXNodyhjb250ZXh0LnZtLnJlZ3MuZWZsYWdzKTsKLQkgICAgcHVzaHcoY29udGV4dC52bS5yZWdzLmNzKTsKLQkgICAgcHVzaHcoY29udGV4dC52bS5yZWdzLmVpcCk7Ci0JICAgIGNvbnRleHQudm0ucmVncy5jcyA9IGdldF9pbnRfc2VnKHYpOwotCSAgICBjb250ZXh0LnZtLnJlZ3MuZWlwID0gZ2V0X2ludF9vZmYodik7Ci0JICAgIGNvbnRleHQudm0ucmVncy5lZmxhZ3MgJj0gfihWSUZfTUFTSyB8IFRGX01BU0spOwotCSAgICBjb250aW51ZTsKLQkgICAgfQotCWlmIChWTTg2X1RZUEUodnJldCkgIT0gVk04Nl9VTktOT1dOKQotCSAgICBicmVhazsKLQlpZiAoIWVtdWxhdGUoKSkKLQkgICAgYnJlYWs7Ci0JfQotICAgIGRlYnVnX2luZm8odnJldCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgSU5EKGVyZWcpIGNvbnRleHQudm0ucmVncy5lcmVnID0gcmVncy0+ZXJlZwotI2RlZmluZSBPVVREKGVyZWcpIHJlZ3MtPmVyZWcgPSBjb250ZXh0LnZtLnJlZ3MuZXJlZwotCi12b2lkIFBNQVBJIERQTUlfaW50ODYoaW50IGludG5vLCBEUE1JX3JlZ3MgKnJlZ3MpCi17Ci0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIG1lbXNldCgmY29udGV4dC52bS5yZWdzLCAwLCBzaXplb2YoY29udGV4dC52bS5yZWdzKSk7Ci0gICAgSU5EKGVheCk7IElORChlYngpOyBJTkQoZWN4KTsgSU5EKGVkeCk7IElORChlc2kpOyBJTkQoZWRpKTsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWZsYWdzID0gREVGQVVMVF9WTTg2X0ZMQUdTOwotICAgIGNvbnRleHQudm0ucmVncy5jcyA9IGdldF9pbnRfc2VnKGludG5vKTsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWlwID0gZ2V0X2ludF9vZmYoaW50bm8pOwotICAgIGNvbnRleHQudm0ucmVncy5zcyA9IGNvbnRleHQuc3RhY2tfc2VnOwotICAgIGNvbnRleHQudm0ucmVncy5lc3AgPSBjb250ZXh0LnN0YWNrX29mZjsKLSAgICBwdXNodyhERUZBVUxUX1ZNODZfRkxBR1MpOwotICAgIHB1c2h3KGNvbnRleHQucmV0X3NlZyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfb2ZmKTsKLSAgICBydW5fdm04NigpOwotICAgIE9VVEQoZWF4KTsgT1VURChlYngpOyBPVVREKGVjeCk7IE9VVEQoZWR4KTsgT1VURChlc2kpOyBPVVREKGVkaSk7Ci0gICAgcmVncy0+ZmxhZ3MgPSBjb250ZXh0LnZtLnJlZ3MuZWZsYWdzOwotfQotCi0jZGVmaW5lIElOKGVyZWcpIGNvbnRleHQudm0ucmVncy5lcmVnID0gaW4tPmUuZXJlZwotI2RlZmluZSBPVVQoZXJlZykgb3V0LT5lLmVyZWcgPSBjb250ZXh0LnZtLnJlZ3MuZXJlZwotCi1pbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKLXsKLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgbWVtc2V0KCZjb250ZXh0LnZtLnJlZ3MsIDAsIHNpemVvZihjb250ZXh0LnZtLnJlZ3MpKTsKLSAgICBJTihlYXgpOyBJTihlYngpOyBJTihlY3gpOyBJTihlZHgpOyBJTihlc2kpOyBJTihlZGkpOwotICAgIGNvbnRleHQudm0ucmVncy5lZmxhZ3MgPSBERUZBVUxUX1ZNODZfRkxBR1M7Ci0gICAgY29udGV4dC52bS5yZWdzLmNzID0gZ2V0X2ludF9zZWcoaW50bm8pOwotICAgIGNvbnRleHQudm0ucmVncy5laXAgPSBnZXRfaW50X29mZihpbnRubyk7Ci0gICAgY29udGV4dC52bS5yZWdzLnNzID0gY29udGV4dC5zdGFja19zZWc7Ci0gICAgY29udGV4dC52bS5yZWdzLmVzcCA9IGNvbnRleHQuc3RhY2tfb2ZmOwotICAgIHB1c2h3KERFRkFVTFRfVk04Nl9GTEFHUyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfc2VnKTsKLSAgICBwdXNodyhjb250ZXh0LnJldF9vZmYpOwotICAgIHJ1bl92bTg2KCk7Ci0gICAgT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVkeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKLSAgICBvdXQtPnguY2ZsYWcgPSBjb250ZXh0LnZtLnJlZ3MuZWZsYWdzICYgMTsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi1pbnQgUE1BUEkgUE1faW50ODZ4KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGlmIChpbnRubyA9PSAweDIxKSB7Ci0JdGltZV90IHRvZGF5ID0gdGltZShOVUxMKTsKLQlzdHJ1Y3QgdG0gKnQ7Ci0JdCA9IGxvY2FsdGltZSgmdG9kYXkpOwotCW91dC0+eC5jeCA9IHQtPnRtX3llYXIgKyAxOTAwOwotCW91dC0+aC5kaCA9IHQtPnRtX21vbiArIDE7Ci0Jb3V0LT5oLmRsID0gdC0+dG1fbWRheTsKLQl9Ci0gICAgZWxzZSB7Ci0JdW5zaWduZWQgaW50IHNlZywgb2ZmOwotCXNlZyA9IGdldF9pbnRfc2VnKGludG5vKTsKLQlvZmYgPSBnZXRfaW50X29mZihpbnRubyk7Ci0JbWVtc2V0KCZjb250ZXh0LnZtLnJlZ3MsIDAsIHNpemVvZihjb250ZXh0LnZtLnJlZ3MpKTsKLQlJTihlYXgpOyBJTihlYngpOyBJTihlY3gpOyBJTihlZHgpOyBJTihlc2kpOyBJTihlZGkpOwotCWNvbnRleHQudm0ucmVncy5lZmxhZ3MgPSBERUZBVUxUX1ZNODZfRkxBR1M7Ci0JY29udGV4dC52bS5yZWdzLmNzID0gc2VnOwotCWNvbnRleHQudm0ucmVncy5laXAgPSBvZmY7Ci0JY29udGV4dC52bS5yZWdzLmVzID0gc3JlZ3MtPmVzOwotCWNvbnRleHQudm0ucmVncy5kcyA9IHNyZWdzLT5kczsKLQljb250ZXh0LnZtLnJlZ3MuZnMgPSBzcmVncy0+ZnM7Ci0JY29udGV4dC52bS5yZWdzLmdzID0gc3JlZ3MtPmdzOwotCWNvbnRleHQudm0ucmVncy5zcyA9IGNvbnRleHQuc3RhY2tfc2VnOwotCWNvbnRleHQudm0ucmVncy5lc3AgPSBjb250ZXh0LnN0YWNrX29mZjsKLQlwdXNodyhERUZBVUxUX1ZNODZfRkxBR1MpOwotCXB1c2h3KGNvbnRleHQucmV0X3NlZyk7Ci0JcHVzaHcoY29udGV4dC5yZXRfb2ZmKTsKLQlydW5fdm04NigpOwotCU9VVChlYXgpOyBPVVQoZWJ4KTsgT1VUKGVjeCk7IE9VVChlZHgpOyBPVVQoZXNpKTsgT1VUKGVkaSk7Ci0Jc3JlZ3MtPmVzID0gY29udGV4dC52bS5yZWdzLmVzOwotCXNyZWdzLT5kcyA9IGNvbnRleHQudm0ucmVncy5kczsKLQlzcmVncy0+ZnMgPSBjb250ZXh0LnZtLnJlZ3MuZnM7Ci0Jc3JlZ3MtPmdzID0gY29udGV4dC52bS5yZWdzLmdzOwotCW91dC0+eC5jZmxhZyA9IGNvbnRleHQudm0ucmVncy5lZmxhZ3MgJiAxOwotCX0KLSAgICByZXR1cm4gb3V0LT5lLmVheDsKLX0KLQotI2RlZmluZSBPVVRSKGVyZWcpIGluLT5lLmVyZWcgPSBjb250ZXh0LnZtLnJlZ3MuZXJlZwotCi12b2lkIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSh1aW50IHNlZyx1aW50IG9mZiwgUk1SRUdTICppbiwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgbWVtc2V0KCZjb250ZXh0LnZtLnJlZ3MsIDAsIHNpemVvZihjb250ZXh0LnZtLnJlZ3MpKTsKLSAgICBJTihlYXgpOyBJTihlYngpOyBJTihlY3gpOyBJTihlZHgpOyBJTihlc2kpOyBJTihlZGkpOwotICAgIGNvbnRleHQudm0ucmVncy5lZmxhZ3MgPSBERUZBVUxUX1ZNODZfRkxBR1M7Ci0gICAgY29udGV4dC52bS5yZWdzLmNzID0gc2VnOwotICAgIGNvbnRleHQudm0ucmVncy5laXAgPSBvZmY7Ci0gICAgY29udGV4dC52bS5yZWdzLnNzID0gY29udGV4dC5zdGFja19zZWc7Ci0gICAgY29udGV4dC52bS5yZWdzLmVzcCA9IGNvbnRleHQuc3RhY2tfb2ZmOwotICAgIGNvbnRleHQudm0ucmVncy5lcyA9IHNyZWdzLT5lczsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZHMgPSBzcmVncy0+ZHM7Ci0gICAgY29udGV4dC52bS5yZWdzLmZzID0gc3JlZ3MtPmZzOwotICAgIGNvbnRleHQudm0ucmVncy5ncyA9IHNyZWdzLT5nczsKLSAgICBwdXNodyhERUZBVUxUX1ZNODZfRkxBR1MpOwotICAgIHB1c2h3KGNvbnRleHQucmV0X3NlZyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfb2ZmKTsKLSAgICBydW5fdm04NigpOwotICAgIE9VVFIoZWF4KTsgT1VUUihlYngpOyBPVVRSKGVjeCk7IE9VVFIoZWR4KTsgT1VUUihlc2kpOyBPVVRSKGVkaSk7Ci0gICAgc3JlZ3MtPmVzID0gY29udGV4dC52bS5yZWdzLmVzOwotICAgIHNyZWdzLT5kcyA9IGNvbnRleHQudm0ucmVncy5kczsKLSAgICBzcmVncy0+ZnMgPSBjb250ZXh0LnZtLnJlZ3MuZnM7Ci0gICAgc3JlZ3MtPmdzID0gY29udGV4dC52bS5yZWdzLmdzOwotICAgIGluLT54LmNmbGFnID0gY29udGV4dC52bS5yZWdzLmVmbGFncyAmIDE7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KHVsb25nICpwaHlzaWNhbCx1bG9uZyAqdG90YWwpCi17Ci0gICAgRklMRSAgICAqbWVtID0gZm9wZW4oIi9wcm9jL21lbWluZm8iLCJyIik7Ci0gICAgY2hhciAgICBidWZbMTAyNF07Ci0KLSAgICBmZ2V0cyhidWYsMTAyNCxtZW0pOwotICAgIGZnZXRzKGJ1ZiwxMDI0LG1lbSk7Ci0gICAgc3NjYW5mKGJ1ZiwiTWVtOiAlKmQgJSpkICVsZCIsIHBoeXNpY2FsKTsKLSAgICBmZ2V0cyhidWYsMTAyNCxtZW0pOwotICAgIHNzY2FuZihidWYsIlN3YXA6ICUqZCAlKmQgJWxkIiwgdG90YWwpOwotICAgIGZjbG9zZShtZW0pOwotICAgICp0b3RhbCArPSAqcGh5c2ljYWw7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSh1aW50IHNpemUsdWxvbmcgKnBoeXNBZGRyLGlib29sIGNvbnRpZ3VvdXMsaWJvb2wgYmVsb3cxNk0pCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIExpbnV4ICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSh2b2lkICpwLHVpbnQgc2l6ZSxpYm9vbCBjb250aWd1b3VzKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBMaW51eCAqLwotfQotCi12b2lkICogUE1BUEkgUE1fYWxsb2NQYWdlKAotICAgIGlib29sIGxvY2tlZCkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBmb3IgTGludXggKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUGFnZSgKLSAgICB2b2lkICpwKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBMaW51eCAqLwotfQotCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBKGludCBiYW5rKQotewotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBtZW1zZXQoJmNvbnRleHQudm0ucmVncywgMCwgc2l6ZW9mKGNvbnRleHQudm0ucmVncykpOwotICAgIGNvbnRleHQudm0ucmVncy5lYXggPSAweDRGMDU7Ci0gICAgY29udGV4dC52bS5yZWdzLmVieCA9IDB4MDAwMDsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWR4ID0gYmFuazsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWZsYWdzID0gREVGQVVMVF9WTTg2X0ZMQUdTOwotICAgIGNvbnRleHQudm0ucmVncy5jcyA9IGdldF9pbnRfc2VnKDB4MTApOwotICAgIGNvbnRleHQudm0ucmVncy5laXAgPSBnZXRfaW50X29mZigweDEwKTsKLSAgICBjb250ZXh0LnZtLnJlZ3Muc3MgPSBjb250ZXh0LnN0YWNrX3NlZzsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZXNwID0gY29udGV4dC5zdGFja19vZmY7Ci0gICAgcHVzaHcoREVGQVVMVF9WTTg2X0ZMQUdTKTsKLSAgICBwdXNodyhjb250ZXh0LnJldF9zZWcpOwotICAgIHB1c2h3KGNvbnRleHQucmV0X29mZik7Ci0gICAgcnVuX3ZtODYoKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRCYW5rQUIoaW50IGJhbmspCi17Ci0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIG1lbXNldCgmY29udGV4dC52bS5yZWdzLCAwLCBzaXplb2YoY29udGV4dC52bS5yZWdzKSk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVheCA9IDB4NEYwNTsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWJ4ID0gMHgwMDAwOwotICAgIGNvbnRleHQudm0ucmVncy5lZHggPSBiYW5rOwotICAgIGNvbnRleHQudm0ucmVncy5lZmxhZ3MgPSBERUZBVUxUX1ZNODZfRkxBR1M7Ci0gICAgY29udGV4dC52bS5yZWdzLmNzID0gZ2V0X2ludF9zZWcoMHgxMCk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVpcCA9IGdldF9pbnRfb2ZmKDB4MTApOwotICAgIGNvbnRleHQudm0ucmVncy5zcyA9IGNvbnRleHQuc3RhY2tfc2VnOwotICAgIGNvbnRleHQudm0ucmVncy5lc3AgPSBjb250ZXh0LnN0YWNrX29mZjsKLSAgICBwdXNodyhERUZBVUxUX1ZNODZfRkxBR1MpOwotICAgIHB1c2h3KGNvbnRleHQucmV0X3NlZyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfb2ZmKTsKLSAgICBydW5fdm04NigpOwotICAgIGNvbnRleHQudm0ucmVncy5lYXggPSAweDRGMDU7Ci0gICAgY29udGV4dC52bS5yZWdzLmVieCA9IDB4MDAwMTsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWR4ID0gYmFuazsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWZsYWdzID0gREVGQVVMVF9WTTg2X0ZMQUdTOwotICAgIGNvbnRleHQudm0ucmVncy5jcyA9IGdldF9pbnRfc2VnKDB4MTApOwotICAgIGNvbnRleHQudm0ucmVncy5laXAgPSBnZXRfaW50X29mZigweDEwKTsKLSAgICBjb250ZXh0LnZtLnJlZ3Muc3MgPSBjb250ZXh0LnN0YWNrX3NlZzsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZXNwID0gY29udGV4dC5zdGFja19vZmY7Ci0gICAgcHVzaHcoREVGQVVMVF9WTTg2X0ZMQUdTKTsKLSAgICBwdXNodyhjb250ZXh0LnJldF9zZWcpOwotICAgIHB1c2h3KGNvbnRleHQucmV0X29mZik7Ci0gICAgcnVuX3ZtODYoKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRDUlRTdGFydChpbnQgeCxpbnQgeSxpbnQgd2FpdFZSVCkKLXsKLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgbWVtc2V0KCZjb250ZXh0LnZtLnJlZ3MsIDAsIHNpemVvZihjb250ZXh0LnZtLnJlZ3MpKTsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWF4ID0gMHg0RjA3OwotICAgIGNvbnRleHQudm0ucmVncy5lYnggPSB3YWl0VlJUOwotICAgIGNvbnRleHQudm0ucmVncy5lY3ggPSB4OwotICAgIGNvbnRleHQudm0ucmVncy5lZHggPSB5OwotICAgIGNvbnRleHQudm0ucmVncy5lZmxhZ3MgPSBERUZBVUxUX1ZNODZfRkxBR1M7Ci0gICAgY29udGV4dC52bS5yZWdzLmNzID0gZ2V0X2ludF9zZWcoMHgxMCk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVpcCA9IGdldF9pbnRfb2ZmKDB4MTApOwotICAgIGNvbnRleHQudm0ucmVncy5zcyA9IGNvbnRleHQuc3RhY2tfc2VnOwotICAgIGNvbnRleHQudm0ucmVncy5lc3AgPSBjb250ZXh0LnN0YWNrX29mZjsKLSAgICBwdXNodyhERUZBVUxUX1ZNODZfRkxBR1MpOwotICAgIHB1c2h3KGNvbnRleHQucmV0X3NlZyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfb2ZmKTsKLSAgICBydW5fdm04NigpOwotfQotCi1pbnQgUE1BUEkgUE1fZW5hYmxlV3JpdGVDb21iaW5lKHVsb25nIGJhc2UsdWxvbmcgbGVuZ3RoLHVpbnQgdHlwZSkKLXsKLSNpZmRlZiBFTkFCTEVfTVRSUgotICAgIHN0cnVjdCBtdHJyX3NlbnRyeSBzZW50cnk7Ci0KLSAgICBpZiAobXRycl9mZCA8IDApCi0JcmV0dXJuIFBNX01UUlJfRVJSX05PX09TX1NVUFBPUlQ7Ci0gICAgc2VudHJ5LmJhc2UgPSBiYXNlOwotICAgIHNlbnRyeS5zaXplID0gbGVuZ3RoOwotICAgIHNlbnRyeS50eXBlID0gdHlwZTsKLSAgICBpZiAoaW9jdGwobXRycl9mZCwgTVRSUklPQ19BRERfRU5UUlksICZzZW50cnkpID09IC0xKSB7Ci0JLyogVE9ETzogTmVlZCB0byBkZWNvZGUgTVRSUiBlcnJvciBjb2RlcyEhICovCi0JcmV0dXJuIFBNX01UUlJfTk9UX1NVUFBPUlRFRDsKLQl9Ci0gICAgcmV0dXJuIFBNX01UUlJfRVJSX09LOwotI2Vsc2UKLSAgICByZXR1cm4gUE1fTVRSUl9FUlJfTk9fT1NfU1VQUE9SVDsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWNhbGxiYWNrICAgIC0gRnVuY3Rpb24gdG8gY2FsbGJhY2sgd2l0aCB3cml0ZSBjb21iaW5lIGluZm9ybWF0aW9uCi0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBlbnVtZXJhdGUgYWxsIHdyaXRlIGNvbWJpbmUgcmVnaW9ucyBjdXJyZW50bHkgZW5hYmxlZCBmb3IgdGhlCi1wcm9jZXNzb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2VudW1Xcml0ZUNvbWJpbmUoCi0gICAgUE1fZW51bVdyaXRlQ29tYmluZV90IGNhbGxiYWNrKQotewotI2lmZGVmIEVOQUJMRV9NVFJSCi0gICAgc3RydWN0IG10cnJfZ2VudHJ5IGdlbnRyeTsKLQotICAgIGlmIChtdHJyX2ZkIDwgMCkKLQlyZXR1cm4gUE1fTVRSUl9FUlJfTk9fT1NfU1VQUE9SVDsKLQotICAgIGZvciAoZ2VudHJ5LnJlZ251bSA9IDA7IGlvY3RsIChtdHJyX2ZkLCBNVFJSSU9DX0dFVF9FTlRSWSwgJmdlbnRyeSkgPT0gMDsKLQkgKytnZW50cnkucmVnbnVtKSB7Ci0JaWYgKGdlbnRyeS5zaXplID4gMCkgewotCSAgICAvKiBXQVJOSU5HOiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSB0eXBlcyBpbiBwbWFwaS5oIG1hdGNoIHRoZSBvbmVzICovCi0JICAgIC8qIGluIHRoZSBMaW51eCBrZXJuZWwgKG10cnIuaCkgKi8KLQkgICAgY2FsbGJhY2soZ2VudHJ5LmJhc2UsIGdlbnRyeS5zaXplLCBnZW50cnkudHlwZSk7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBQTV9NVFJSX0VSUl9PSzsKLSNlbHNlCi0gICAgcmV0dXJuIFBNX01UUlJfRVJSX05PX09TX1NVUFBPUlQ7Ci0jZW5kaWYKLX0KLQotaWJvb2wgUE1BUEkgUE1fZG9CSU9TUE9TVCgKLSAgICB1c2hvcnQgYXhWYWwsCi0gICAgdWxvbmcgQklPU1BoeXNBZGRyLAotICAgIHZvaWQgKmNvcHlPZkJJT1MsCi0gICAgdWxvbmcgQklPU0xlbikKLXsKLSAgICBjaGFyICAgICAgICAqYmlvc19wdHIgPSAoY2hhciopMHhDMDAwMDsKLSAgICBjaGFyICAgICAgICAqb2xkX2Jpb3M7Ci0gICAgdWxvbmcgICAgICAgQ3VycmVudDEwLCBDdXJyZW50NkQsICpydmVjID0gMDsKLSAgICBSTVJFR1MgICAgICByZWdzOwotICAgIFJNU1JFR1MgICAgIHNyZWdzOwotCi0gICAgLyogVGhlIEJJT1MgaXMgbWFwcGVkIHRvIDB4QzAwMDAgd2l0aCBhIHByaXZhdGUgbWVtb3J5IG1hcHBpbmcgZW5hYmxlZAotICAgICAqIHdoaWNoIG1lYW5zIHdlIGhhdmUgYSBjb3B5IG9uIHdyaXRlIHNjaGVtZS4gSGVuY2Ugd2Ugc2ltcGx5IGNvcHkKLSAgICAgKiB0aGUgc2Vjb25kYXJ5IEJJT1MgaW1hZ2Ugb3ZlciB0aGUgdG9wIG9mIHRoZSBvbGQgb25lLgotICAgICAqLwotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpZiAoKG9sZF9iaW9zID0gUE1fbWFsbG9jKEJJT1NMZW4pKSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICBpZiAoQklPU1BoeXNBZGRyICE9IDB4QzAwMDApIHsKLQltZW1jcHkob2xkX2Jpb3MsYmlvc19wdHIsQklPU0xlbik7Ci0JbWVtY3B5KGJpb3NfcHRyLGNvcHlPZkJJT1MsQklPU0xlbik7Ci0JfQotCi0gICAgLyogVGhlIGludGVycnVwdCB2ZWN0b3JzIHNob3VsZCBhbHJlYWR5IGJlIG1tYXAoKSdlZCBmcm9tIDAtMHg0MDAgaW4gUE1faW5pdCAqLwotICAgIEN1cnJlbnQxMCA9IHJ2ZWNbMHgxMF07Ci0gICAgQ3VycmVudDZEID0gcnZlY1sweDZEXTsKLQotICAgIC8qIFBPU1QgdGhlIHNlY29uZGFyeSBCSU9TICovCi0gICAgcnZlY1sweDEwXSA9IHJ2ZWNbMHg0Ml07IC8qIFJlc3RvcmUgaW50IDEwaCB0byBTVEQtQklPUyAqLwotICAgIHJlZ3MueC5heCA9IGF4VmFsOwotICAgIFBNX2NhbGxSZWFsTW9kZSgweEMwMDAsMHgwMDAzLCZyZWdzLCZzcmVncyk7Ci0KLSAgICAvKiBSZXN0b3JlIGludGVycnVwdCB2ZWN0b3JzICovCi0gICAgcnZlY1sweDEwXSA9IEN1cnJlbnQxMDsKLSAgICBydmVjWzB4NkRdID0gQ3VycmVudDZEOwotCi0gICAgLyogUmVzdG9yZSBvcmlnaW5hbCBCSU9TIGltYWdlICovCi0gICAgaWYgKEJJT1NQaHlzQWRkciAhPSAweEMwMDAwKQotCW1lbWNweShiaW9zX3B0cixvbGRfYmlvcyxCSU9TTGVuKTsKLSAgICBQTV9mcmVlKG9sZF9iaW9zKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBwID0gcDsgIGxlbiA9IGxlbjsKLSAgICByZXR1cm4gMTsKLX0KLQotaW50IFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHAgPSBwOyAgbGVuID0gbGVuOwotICAgIHJldHVybiAxOwotfQotCi1pbnQgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBwID0gcDsgIGxlbiA9IGxlbjsKLSAgICByZXR1cm4gMTsKLX0KLQotaW50IFBNQVBJIFBNX3VubG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBwID0gcDsgIGxlbiA9IGxlbjsKLSAgICByZXR1cm4gMTsKLX0KLQotUE1fTU9EVUxFIFBNQVBJIFBNX2xvYWRMaWJyYXJ5KAotICAgIGNvbnN0IGNoYXIgKnN6RExMTmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyB0byBsb2FkIHNoYXJlZCBsaWJyYXJpZXMhICovCi0gICAgKHZvaWQpc3pETExOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0UHJvY0FkZHJlc3MoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUsCi0gICAgY29uc3QgY2hhciAqc3pQcm9jTmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICAodm9pZCloTW9kdWxlOwotICAgICh2b2lkKXN6UHJvY05hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZUxpYnJhcnkoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgKHZvaWQpaE1vZHVsZTsKLX0KLQotaW50IFBNQVBJIFBNX3NldElPUEwoCi0gICAgaW50IGxldmVsKQotewotICAgIC8qIFRPRE86IE1vdmUgdGhlIElPUEwgc3dpdGNoaW5nIGludG8gdGhpcyBmdW5jdGlvbiEhICovCi0gICAgcmV0dXJuIGxldmVsOwotfQotCi12b2lkIFBNQVBJIFBNX2ZsdXNoVExCKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBvbiBMaW51eC4gKi8KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC92ZmxhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzllZjJjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L3ZmbGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBEdW1teSBtb2R1bGU7IG5vIHZpcnR1YWwgZnJhbWVidWZmZXIgZm9yIHRoaXMgT1MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotCi1pYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKLXsKLSAgICBiYXNlQWRkciA9IGJhc2VBZGRyOwotICAgIGJhbmtTaXplID0gYmFua1NpemU7Ci0gICAgY29kZUxlbiA9IGNvZGVMZW47Ci0gICAgYmFua0Z1bmMgPSBiYW5rRnVuYzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCi17Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC96dGltZXIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L3p0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjliYWUyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L3p0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgTGludXgKLSoKLSogRGVzY3JpcHRpb246ICBMaW51eCBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFplbiBUaW1lciBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX19aVGltZXJJbml0KHZvaWQpCi17Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVXNlIHRoZSBnZXR0aW1lb2ZkYXkoKSBmdW5jdGlvbiB0byBnZXQgbWljcm9zZWNvbmQgcHJlY2lzaW9uIChwcm9iYWJseSBsZXNzCi10aG91Z2gpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlubGluZSB1bG9uZyBfX1VMWlJlYWRUaW1lKHZvaWQpCi17Ci0gICAgc3RydWN0IHRpbWV2YWwgdDsKLSAgICBnZXR0aW1lb2ZkYXkoJnQsIE5VTEwpOwotICAgIHJldHVybiB0LnR2X3NlYyoxMDAwMDAwICsgdC50dl91c2VjOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVN0YXJ0IHRoZSBaZW4gVGltZXIgY291bnRpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJPbih0bSkgICAgIHRtLT5zdGFydC5sb3cgPSBfX1VMWlJlYWRUaW1lKCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBsYXAgdGltZSBzaW5jZSB0aGUgdGltZXIgd2FzIHN0YXJ0ZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJMYXAodG0pICAgICAgICAoX19VTFpSZWFkVGltZSgpIC0gdG0tPnN0YXJ0LmxvdykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyT2ZmKHRtKSAgICAgICAgdG0tPmVuZC5sb3cgPSBfX1VMWlJlYWRUaW1lKCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyQ291bnQodG0pICAodG0tPmVuZC5sb3cgLSB0bS0+c3RhcnQubG93KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQotd2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCi1hY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCi1wYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfX1VMWkVsYXBzZWRUaW1lKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCkKLXsgcmV0dXJuIGZpbmlzaCAtIHN0YXJ0OyB9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9tYWtlZmlsZSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL21ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjVmMGUzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL21ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5NiBTY2lUZWNoIFNvZnR3YXJlLgotIyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBtYWtlZmlsZSBmb3IgdGhlIFBNIGxpYnJhcnkuIEJ1aWxkcyB0aGUgbGlicmFyeQotIyAgICAgICAgICAgICAgIGZpbGUgYW5kIGFsbCB0ZXN0IHByb2dyYW1zLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotLklNUE9SVCAuSUdOT1JFIDogREVCVUdfQUdQX0RSSVZFUiBURVNUX0hBUk5FU1MgREVCVUdfU0REUE1JCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEFkZCBET1MgZXh0ZW5kZXIgZGVwZW5kYW50IGZsYWdzIHRvIGNvbW1hbmQgbGluZQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ0ZMQUdTICAgICAgICAgICs9ICQoRFhfQ0ZMQUdTKQotQVNGTEFHUyAgICAgICAgICs9ICQoRFhfQVNGTEFHUykKLU5PX1BNTElCICAgICAgICA6PSAxCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEluY2x1ZGUgZGVmaW5pdGlvbnMgc3BlY2lmaWMgZm9yIHRoZSB0YXJnZXQgc3lzdGVtCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0uSUYgJChVU0VfVlhEKQotCi0jIEJ1aWxkaW5nIGZvciBXaW4zMiBWeEQgKG1pbmltYWwgUE0gbGlicmFyeSBpbXBsZW1lbnRhdGlvbikKLQotTElCTkFNRSAgICAgICAgID0gcG0KLU9CSkVDVFMgICAgICAgICA9IHBtJE8gdmZsYXQkTyB6dGltZXIkTyBjcHVpbmZvJE8gbXRyciRPIGZpbGVpbyRPIHBjaWxpYiRPIFwKLSAgICAgICAgICAgICAgICAgIGFncCRPIG1hbGxvYyRPIHZnYXN0YXRlJE8gZ2F2eGQkTyBfcG0kTyBfbXRyciRPIF9jcHVpbmZvJE8gXAotICAgICAgICAgICAgICAgICAgX2ludDY0JE8gX3BjaWhlbHAkTwotREVQRU5EX1NSQyAgICAgIDo9IHZ4ZDtjb21tb247Y29kZXBhZ2U7dGVzdHMKLS5TT1VSQ0U6ICAgICAgICAgICB2eGQgY29tbW9uIGNvZGVwYWdlIHRlc3RzCi0KLS5FTElGICQoVVNFX05URFJWKQotCi0jIEJ1aWxkaW5nIGZvciBOVCBkZXZpY2UgZHJpdmVycyAobWluaW1hbCBQTSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uKQotCi1MSUJOQU1FICAgICAgICAgPSBwbQotT0JKRUNUUyAgICAgICAgID0gcG0kTyB2ZmxhdCRPIHp0aW1lciRPIGNwdWluZm8kTyBtdHJyJE8gbWVtJE8gaXJxJE8gaW50ODYkTyBcCi0gICAgICAgICAgICAgICAgICBzdGRpbyRPIHN0ZGxpYiRPIHBjaWxpYiRPIGFncCRPIG1hbGxvYyRPIHZnYXN0YXRlJE8gZ2FudGRydiRPIFwKLSAgICAgICAgICAgICAgICAgIF9wbSRPIF9tdHJyJE8gX2NwdWluZm8kTyBfaW50NjQkTyBfcGNpaGVscCRPIF9pcnEkTwotREVQRU5EX1NSQyAgICAgIDo9IG50ZHJ2O2NvbW1vbjtjb2RlcGFnZTt0ZXN0cwotLlNPVVJDRTogICAgICAgICAgIG50ZHJ2IGNvbW1vbiBjb2RlcGFnZSB0ZXN0cwotCi0uRUxJRiAkKFVTRV9XSU4zMikKLQotIyBCdWlsZGluZyBmb3IgV2luMzIKLQotQ0ZMQUdTICAgICAgICAgICs9IC1EVVNFX09TX0pPWVNUSUNLCi1MSUJOQU1FICAgICAgICAgPSBwbQotT0JKRUNUUyAgICAgICAgID0gcG0kTyB2ZmxhdCRPIGV2ZW50JE8gZGRyYXckTyB6dGltZXIkTyBjcHVpbmZvJE8gcGNpbGliJE8gXAotICAgICAgICAgICAgICAgICAgYWdwJE8gbWFsbG9jJE8gdmdhc3RhdGUkTyBnYXdpbjMyJE8gbnRzZXJ2YyRPIF9qb3kkTyBfY3B1aW5mbyRPIFwKLSAgICAgICAgICAgICAgICAgIF9pbnQ2NCRPIF9wY2loZWxwJE8KLURFUEVORF9TUkMgICAgICA6PSB3aW4zMjtjb21tb247Y29kZXBhZ2U7dGVzdHMKLS5TT1VSQ0U6ICAgICAgICAgICB3aW4zMiBjb21tb24gY29kZXBhZ2UgdGVzdHMKLQotLkVMSUYgJChVU0VfT1MyMzIpCi0KLSMgQnVpbGRpbmcgZm9yIE9TLzIKLQotLklGICQoVVNFX09TMkdVSSkKLUxJQk5BTUUgICAgICAgICA9IHBtX3BtCi0uRUxTRQotTElCTkFNRSAgICAgICAgID0gcG0KLS5FTkRJRgotT0JKRUNUUyAgICAgICAgID0gcG0kTyB2ZmxhdCRPIGV2ZW50JE8genRpbWVyJE8gY3B1aW5mbyRPIG10cnIkTyBwY2lsaWIkTyBcCi0gICAgICAgICAgICAgICAgICBhZ3AkTyBtYWxsb2MkTyB2Z2FzdGF0ZSRPIGdhb3MyJE8gX3Btb3MyJE8gX2pveSRPIF9jcHVpbmZvJE8gXAotICAgICAgICAgICAgICAgICAgX2ludDY0JE8gX3BjaWhlbHAkTyBkb3NzY3RsJE8KLURFUEVORF9TUkMgICAgICA6PSBvczI7Y29tbW9uO2NvZGVwYWdlO3Rlc3RzCi0uU09VUkNFOiAgICAgICAgICAgb3MyIGNvbW1vbiBjb2RlcGFnZSB0ZXN0cwotCi0uRUxJRiAkKFVTRV9RTlgpCi0KLSMgQnVpbGRpbmcgZm9yIFFOWAotCi1VU0VfQklPUyAgICAgICAgOj0gMQotLklGICQoVVNFX1BIT1RPTikKLUxJQk5BTUUgICAgICAgICA9IHBtX3BoCi0uRUxJRiAkKFVTRV9YMTEpCi1MSUJOQU1FICAgICAgICAgPSBwbV94MTEKLS5FTFNFCi1MSUJOQU1FICAgICAgICAgPSBwbQotLkVORElGCi1PQkpFQ1RTICAgICAgICAgPSBwbSRPIHZmbGF0JE8gZXZlbnQkTyB6dGltZXIkTyBjcHVpbmZvJE8gbXRyciRPIHBjaWxpYiRPIFwKLSAgICAgICAgICAgICAgICAgIGFncCRPIG1hbGxvYyRPIG10cnJxbngkTyB1bml4aW8kTyB2Z2FzdGF0ZSRPIGdhcW54JE8gX2pveSRPIFwKLSAgICAgICAgICAgICAgICAgIF9tdHJycW54JE8gX2NwdWluZm8kTyBfaW50NjQkTyBfcGNpaGVscCRPCi1ERVBFTkRfU1JDICAgICAgOj0gcW54O2NvbW1vbjtjb2RlcGFnZTt0ZXN0cwotLlNPVVJDRTogICAgICAgICAgIHFueCBjb21tb24gY29kZXBhZ2UgdGVzdHMKLQotIyBJbmRpY2F0ZSB0aGF0IHRoaXMgcHJvZ3JhbSB1c2VzIE51Y2xldXMgZGV2aWNlIGRyaXZlcnMgKHNvIG5lZWRzIEkvTyBhY2Nlc3MpCi1VU0VfTlVDTEVVUyAgICAgOj0gMQotCi0uRUxJRiAkKFVTRV9MSU5VWCkKLQotIyBCdWlsZGluZyBmb3IgTGludXgKLQotQ0ZMQUdTICAgICAgICAgICs9IC1ERU5BQkxFX01UUlIgLURVU0VfT1NfSk9ZU1RJQ0sKLS5JRiAkKFVTRV9YMTEpCi1MSUJOQU1FICAgICAgICAgPSBwbV94MTEKLS5FTFNFCi1MSUJOQU1FICAgICAgICAgPSBwbQotLkVORElGCi1PQkpFQ1RTICAgICAgICAgPSBwbSRPIHZmbGF0JE8gZXZlbnQkTyB6dGltZXIkTyBjcHVpbmZvJE8gcGNpbGliJE8gXAotICAgICAgICAgICAgICAgICAgYWdwJE8gbWFsbG9jJE8gdW5peGlvJE8gdmdhc3RhdGUkTyBnYWxpbnV4JE8gX2NwdWluZm8kTyBcCi0gICAgICAgICAgICAgICAgICBfaW50NjQkTyBfcGNpaGVscCRPCi1ERVBFTkRfU1JDICAgICAgOj0gbGludXg7Y29tbW9uO2NvZGVwYWdlO3Rlc3RzO3gxMQotLlNPVVJDRTogICAgICAgICAgIGxpbnV4IGNvbW1vbiBjb2RlcGFnZSB0ZXN0cyB4MTEKLQotIyBCdWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5Ci0uSUYgJChTT0ZJTEUpCi1MSUIgICAgICAgICAgICAgOj0gbGQKLUxJQkZMQUdTICAgICAgICA6PSAtciAtbwotQ0ZMQUdTICAgICAgICAgICs9IC1mUElDCi0uRU5ESUYKLQotLkVMSUYgJChVU0VfQkVPUykKLQotIyBCdWlsZGluZyBmb3IgQmVPUyBHVUkKLQotTElCTkFNRSAgICAgICAgID0gcG0KLU9CSkVDVFMgICAgICAgICA9IHBtJE8gdmZsYXQkTyBldmVudCRPIHp0aW1lciRPIGNwdWluZm8kTyBwY2lsaWIkTyBcCi0gICAgICAgICAgICAgICAgICBhZ3AkTyBtYWxsb2MkTyB2Z2FzdGF0ZSRPIGdhYmVvcyRPIF9qb3kkTyBfY3B1aW5mbyRPIFwKLSAgICAgICAgICAgICAgICAgIF9pbnQ2NCRPIF9wY2loZWxwJE8KLURFUEVORF9TUkMgICAgICA6PSBiZW9zO2NvbW1vbjtjb2RlcGFnZTt0ZXN0cwotLlNPVVJDRTogICAgICAgICAgIGJlb3MgY29tbW9uIGNvZGVwYWdlIHRlc3RzCi0KLS5FTElGICQoVVNFX1NNWDMyKQotCi0jIEJ1aWxkaW5nIGZvciBTTVgKLQotTElCTkFNRSAgICAgICAgID0gcG0KLU9CSkVDVFMgICAgICAgICA9IHBtJE8gcG1zbXgkTyB2ZmxhdCRPIGV2ZW50JE8genRpbWVyJE8gY3B1aW5mbyRPIG10cnIkTyBwY2lsaWIkTyBcCi0gICAgICAgICAgICAgICAgICBhZ3AkTyBtYWxsb2MkTyB2Z2FzdGF0ZSRPIGdhc214JE8gX3BtJE8gX3Btc214JE8gX210cnIkTyBfZXZlbnQkTyBcCi0gICAgICAgICAgICAgICAgICBfam95JE8gX2NwdWluZm8kTyBfaW50NjQkTyBfcGNpaGVscCRPIF9senRpbWVyJE8KLURFUEVORF9TUkMgICAgICA6PSBzbXg7Y29tbW9uO2NvZGVwYWdlO3Rlc3RzCi0uU09VUkNFOiAgICAgICAgICAgc214IGNvbW1vbiBjb2RlcGFnZSB0ZXN0cwotCi0uRUxJRiAkKFVTRV9SVFRBUkdFVCkKLQotIyBCdWlsZGluZyBmb3IgUlRUYXJnZXQtMzIKLQotTElCTkFNRSAgICAgICAgID0gcG0KLU9CSkVDVFMgICAgICAgICA9IHBtJE8gdmZsYXQkTyBldmVudCRPIHp0aW1lciRPIGNwdWluZm8kTyBtdHJyJE8gcGNpbGliJE8gXAotICAgICAgICAgICAgICAgICAgYWdwJE8gbWFsbG9jJE8gdmdhc3RhdGUkTyBnYXJ0dCRPIF9tdHJyJE8gX2pveSRPIF9jcHVpbmZvJE8gXAotICAgICAgICAgICAgICAgICAgX2ludDY0JE8gX3BjaWhlbHAkTwotREVQRU5EX1NSQyAgICAgIDo9IHJ0dGFyZ2V0O2NvbW1vbjtjb2RlcGFnZTt0ZXN0cwotLlNPVVJDRTogICAgICAgICAgIHJ0dGFyZ2V0IGNvbW1vbiBjb2RlcGFnZSB0ZXN0cwotCi0uRUxTRQotCi0jIEJ1aWxkaW5nIGZvciBNU0RPUwotCi1MSUJOQU1FICAgICAgICAgPSBwbQotT0JKRUNUUyAgICAgICAgID0gcG0kTyBwbWRvcyRPIHZmbGF0JE8gZXZlbnQkTyB6dGltZXIkTyBjcHVpbmZvJE8gbXRyciRPIFwKLSAgICAgICAgICAgICAgICAgIGFncCRPIG1hbGxvYyRPIHBjaWxpYiRPIHZnYXN0YXRlJE8gZ2Fkb3MkTyBcCi0gICAgICAgICAgICAgICAgICBfcG0kTyBfcG1kb3MkTyBfbXRyciRPIF92ZmxhdCRPIF9ldmVudCRPIF9qb3kkTyBfcGNpaGVscCRPIFwKLSAgICAgICAgICAgICAgICAgIF9jcHVpbmZvJE8gX2ludDY0JE8gX2x6dGltZXIkTyBfZG1hJE8KLURFUEVORF9TUkMgICAgICA6PSBkb3M7Y29tbW9uO2NvZGVwYWdlO3Rlc3RzCi0uU09VUkNFOiAgICAgICAgICAgZG9zIGNvbW1vbiBjb2RlcGFnZSB0ZXN0cwotCi0uRU5ESUYKLQotIyBPYmplY3QgbW9kdWxlcyBmb3Iga2V5Ym9hcmQgY29kZSBwYWdlcwotCi1PQkpFQ1RTICAgICAgICAgKz0gdXNfZW5nJE8KLQotIyBDb21tb24gb2JqZWN0IG1vZHVsZXMKLQotT0JKRUNUUyAgICAgICAgICs9IGNvbW1vbiRPCi0uSUYgJChDSEVDS0VEKQotT0JKRUNUUyAgICAgICAgICs9IGRlYnVnJE8KLS5FTkRJRgotCi0jIE51Y2xldXMgbG9hZGVyIGxpYnJhcnkgb2JqZWN0IG1vZHVsZXMuIE5vdGUgdGhhdCB3aGVuIGNvbXBpbGluZyBhIHRlc3QgaGFybmVzcwotIyBsaWJyYXJ5IHdlIG5lZWQgdG8gZXhjbHVkZSB0aGUgTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLQotLklGICQoVEVTVF9IQVJORVNTKQotQ0ZMQUdTICAgICAgICAgICs9IC1EVEVTVF9IQVJORVNTIC1EUE1MSUIKLUxJQk5BTUUgICAgICAgICA9IHBtX3Rlc3QKLS5FTFNFCi1PQkpFQ1RTICAgICAgICAgKz0gZ2FsaWIkTyBfZ2FfaW1wJE8KLS5FTkRJRgotCi0uSUYgJChERUJVR19TRERQTUkpCi1DRkxBR1MgICAgICAgICAgKz0gLURERUJVR19TRERQTUkKLS5FTkRJRgotCi0jIEFHUCBsaWJyYXJ5IG9iamVjdCBtb2R1bGVzCi0KLS5JRiAkKERFQlVHX0FHUF9EUklWRVIpCi1DRkxBR1MgICAgICAgICAgKz0gLURERUJVR19BR1BfRFJJVkVSCi1PQkpFQ1RTICAgICAgICAgKz0gYWdwbGliJE8KLS5FTFNFCi1PQkpFQ1RTICAgICAgICAgKz0gYWdwbGliJE8gcGVsb2FkZXIkTyBsaWJjaW1wJE8gX2dhdGltZXIkTwotLkVORElGCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5hbWUgb2YgbGlicmFyeSBhbmQgZ2VuZXJpYyBvYmplY3QgZmlsZXMgcmVxdWlyZWQgdG8gYnVpbGQgaXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS5JRiAkKFNUS0NBTEwpCi1MSUJGSUxFICAgICAgICAgPSBzJChMUCkkKExJQk5BTUUpJEwKLS5FTFNFCi1MSUJGSUxFICAgICAgICAgPSAkKExQKSQoTElCTkFNRSkkTAotLkVORElGCi1MSUJDTEVBTiAgICAgICAgPSAqLmxpYiAqLmEKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hhbmdlIGRlc3RpbmF0aW9uIGZvciBsaWJyYXJ5IGZpbGUgZGVwZW5kaW5nIHRoZSBleHRlbmRlciBiZWluZyB1c2VkLiBUaGlzCi0jIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciBET1MgZXh0ZW5kZXIgc2luY2UgdGhlIGZpbGUgZ28gaW50byBhIHN1YmRpcmVjdG9yeQotIyBpbiB0aGUgbm9ybWFsIGxpYnJhcnkgZGlyZWN0b3J5LCBvbmUgZm9yIGVhY2ggc3VwcG9ydGVkIGV4dGVuZGVyLiBPdGhlcgotIyBPUydlcyBwdXQgdGhlIGZpbGUgaW50byB0aGUgcmVndWxhciBsaWJyYXJ5IGRpcmVjdG9yeSwgc2luY2UgdGhlcmUgaXMKLSMgb25seSBvbmUgcGVyIE9TIGluIHRoaXMgY2FzZS4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU1LX1BNT0RFICAgICAgICA9IDEKLQotLklGICQoVEVTVF9IQVJORVNTKQotTElCX0RFU1QgICAgICAgIDo9ICQoTElCX0JBU0UpCi0uRUxJRiAkKFVTRV9UTlQpCi1MSUJfREVTVCAgICAgICAgOj0gJChMSUJfQkFTRSlcdG50Ci0uRUxJRiAkKFVTRV9ET1M0R1cpCi1MSUJfREVTVCAgICAgICAgOj0gJChMSUJfQkFTRSlcZG9zNGd3Ci0uRUxJRiAkKFVTRV9YMzIpCi1MSUJfREVTVCAgICAgICAgOj0gJChMSUJfQkFTRSlceDMyCi0uRUxJRiAkKFVTRV9EUE1JMTYpCi1MSUJfREVTVCAgICAgICAgOj0gJChMSUJfQkFTRSlcZHBtaTE2Ci0uRUxJRiAkKFVTRV9EUE1JMzIpCi1MSUJfREVTVCAgICAgICAgOj0gJChMSUJfQkFTRSlcZHBtaTMyCi0uRUxJRiAkKFVTRV9ET1NYKQotTElCX0RFU1QgICAgICAgIDo9ICQoTElCX0JBU0UpXGRvc3gKLS5FTkQKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTmFtZXMgb2YgYWxsIGV4ZWN1dGFibGUgZmlsZXMgYnVpbHQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS5JRiAkKFVTRV9SRUFMRE9TKQotRVhFRklMRVMgICAgICAgID0gbWVtdGVzdCRFIGJpb3NwdHIkRSB2aWRlbyRFIGlzdmVzYSRFIGNhbGxyZWFsJEUgICAgICAgXAotICAgICAgICAgICAgICAgICAgbW91c2UkRSB0aWNrJEUga2V5JEUga2V5MTUkRSBicmskRSBhbHRicmskRSAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgY3JpdGljYWwkRSBhbHRjcml0JEUgdmZ0ZXN0JEUgcnRjJEUgZ2V0Y2gkRSAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgY3B1JEUgdGltZXJjJEUgdGltZXJjcHAkRSBzaG93cGNpJEUgdXN3YyRFIGJsb2NrJEUKLS5FTFNFCi1FWEVGSUxFUyAgICAgICAgPSBtZW10ZXN0JEUgdmlkZW8kRSBpc3Zlc2EkRSBjYWxscmVhbCRFIHZmdGVzdCRFIGdldGNoJEUgXAotICAgICAgICAgICAgICAgICAgY3B1JEUgdGltZXJjJEUgdGltZXJjcHAkRSBzaG93cGNpJEUgdXN3YyRFIGJsb2NrJEUgXAotICAgICAgICAgICAgICAgICAgc2F2ZSRFIHJlc3RvcmUkRQotLkVORElGCi0KLWFsbDogJChFWEVGSUxFUykKLQotJChFWEVGSUxFUyk6ICQoTElCRklMRSkKLQotbWVtdGVzdCRFOiAgbWVtdGVzdCRPCi1iaW9zcHRyJEU6ICBiaW9zcHRyJE8KLXZpZGVvJEU6ICAgIHZpZGVvJE8KLWlzdmVzYSRFOiAgIGlzdmVzYSRPCi1tb3VzZSRFOiAgICBtb3VzZSRPCi10aWNrJEU6ICAgICB0aWNrJE8KLWtleSRFOiAgICAgIGtleSRPCi1rZXkxNSRFOiAgICBrZXkxNSRPCi1icmskRTogICAgICBicmskTwotYWx0YnJrJEU6ICAgYWx0YnJrJE8KLWNyaXRpY2FsJEU6IGNyaXRpY2FsJE8KLWFsdGNyaXQkRTogIGFsdGNyaXQkTwotY2FsbHJlYWwkRTogY2FsbHJlYWwkTwotdmZ0ZXN0JEU6ICAgdmZ0ZXN0JE8KLXJ0YyRFOiAgICAgIHJ0YyRPCi1nZXRjaCRFOiAgICBnZXRjaCRPCi1jcHUkRTogICAgICBjcHUkTwotdGltZXJjJEU6ICAgdGltZXJjJE8KLXRpbWVyY3BwJEU6IHRpbWVyY3BwJE8KLXNob3dwY2kkRTogIHNob3dwY2kkTwotdXN3YyRFOiAgICAgdXN3YyRPCi1ibG9jayRFOiAgICBibG9jayRPCi1zYXZlJEU6ICAgICBzYXZlJE8KLXJlc3RvcmUkRTogIHJlc3RvcmUkTwotdGVzdCRFOiAgICAgdGVzdCRPIF90ZXN0JE8KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIHRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyB0byBjcmVhdGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBmb3IKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURFUEVORF9PQkogICAgICA6PSAkKE9CSkVDVFMpIG1lbXRlc3QkTyBiaW9zcHRyJE8gdmlkZW8kTyBpc3Zlc2EkTyBtb3VzZSRPICBcCi0gICAgICAgICAgICAgICAgICAgdGljayRPIGtleSRPIGtleSRPIGJyayRPIGFsdGJyayRPIGNyaXRpY2FsJE8gYWx0Y3JpdCRPICAgXAotICAgICAgICAgICAgICAgICAgIGNhbGxyZWFsJE8gdmZ0ZXN0JE8gZ2V0Y2gkTyB0aW1lcmNwcCRPCi0KLS5JTkNMVURFOiAiJChTQ0lURUNIKS9tYWtlZGVmcy9jb21tb24ubWsiCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L19pcnEuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvX2lycS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExODI0YTAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvX2lycS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogMzItYml0IFdpbmRvd3MgTlQgZGV2aWNlIGRyaXZlcgotOyoKLTsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgYXNzZW1ibHkgc3VwcG9ydCBmb3IgdGhlIFBNIGxpYnJhcnkgc3BlY2lmaWMgdG8KLTsqICAgICAgICAgICAgICBXaW5kb3dzIE5UIGRldmljZSBkcml2ZXJzLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICAgICAgX2lycSAgICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKLQotYmVnZGF0YXNlZyAgX2lycQotCi0gICAgY2V4dGVybiBfUE1fcnRjSGFuZGxlcixDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldlJUQyxGQ1BUUgotCi1SdGNJbnNpZGUgICBkdyAgICAgIDAgICAgICAgICAgIDsgQXJlIHdlIHN0aWxsIGhhbmRsaW5nIGN1cnJlbnQgaW50ZXJydXB0Ci1zaWR0QnVmICAgICBkZiAgICAgIDAgICAgICAgICAgIDsgQnVmZmVyIGZvciBzaWR0IGluc3RydWN0aW9uCi0KLWVuZGRhdGFzZWcgIF9pcnEKLQotYmVnY29kZXNlZyAgX2lycSAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi1jcHVibGljIF9QTV9pcnFDb2RlU3RhcnQKLQotOyBNYWNybyB0byBkZWxheSBicmllZmx5IHRvIGVuc3VyZSB0aGF0IGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIGJldHdlZW4KLTsgc3VjY2Vzc2l2ZSBJL08gYWNjZXNzZXMgc28gdGhhdCB0aGUgZGV2aWNlIGJlaW5nIGFjY2Vzc2VkIGNhbiByZXNwb25kCi07IHRvIGJvdGggYWNjZXNzZXMgZXZlbiBvbiBhIHZlcnkgZmFzdCBQQy4KLQotaWZkZWYgICBVU0VfTkFTTQotJW1hY3JvICBERUxBWSAwCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0lZW5kbWFjcm8KLSVtYWNybyAgSU9ERUxBWU4gMQotJXJlcCAgICAlMQotICAgICAgICBERUxBWQotJWVuZHJlcAotJWVuZG1hY3JvCi1lbHNlCi1tYWNybyAgIERFTEFZCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi1lbmRtCi1tYWNybyAgIElPREVMQVlOICAgIE4KLSAgICByZXB0ICAgIE4KLSAgICAgICAgREVMQVkKLSAgICBlbmRtCi1lbmRtCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9ydGNJU1IgLSBSZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSB0aW1lciBpbnRlcnJ1cHQsIHRvIGRpc3BhdGNoIGNvbnRyb2wKLTsgdG8gaGlnaCBsZXZlbCBDIGJhc2VkIHN1YnJvdXRpbmVzLiBXZSBzYXZlIHRoZSBzdGF0ZSBvZiBhbGwgcmVnaXN0ZXJzCi07IGluIHRoaXMgcm91dGluZSwgYW5kIHN3aXRjaCB0byBhIGxvY2FsIHN0YWNrLiBJbnRlcnJ1cHRzIGFyZSAqb2ZmKgotOyB3aGVuIHdlIGNhbGwgdGhlIHVzZXIgY29kZS4KLTsKLTsgTk9URTogVGhpcyByb3V0aW5lIHN3aXRjaGVzIHRvIGEgbG9jYWwgc3RhY2sgYmVmb3JlIGNhbGxpbmcgYW55IEMgY29kZSwKLTsgICAgICAgYW5kIGhlbmNlIGlzIF9ub3RfIHJlLWVudHJhbnQuIE1ha2Ugc3VyZSB5b3VyIEMgY29kZSBleGVjdXRlcyBhcwotOyAgICAgICBxdWlja2x5IGFzIHBvc3NpYmxlLCBzaW5jZSBhIHRpbWVyIG92ZXJydW4gd2lsbCBzaW1wbHkgaGFuZyB0aGUKLTsgICAgICAgc3lzdGVtLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9ydGNJU1IKLQotOysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCi07IElmIHdlIGVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBjYWxsIGludG8gYW55IEMgYmFzZWQgaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUsCi07IHdlIG5lZWQgdG8gc2V0dXAgYSBidW5jaCBvZiBpbXBvcnRhbnQgaW5mb3JtYXRpb24gZm9yIHRoZSBOVCBrZXJuZWwuIFRoZQotOyBjb2RlIGJlbG93IHRha2VzIGNhcmUgb2YgdGhpcyBob3VzZWtlZXBpbmcgZm9yIHVzIChzZWUgVW5kb2N1bWVudGVkIE5UIGZvcgotOyBkZXRhaWxzKS4gSWYgd2UgZG9uJ3QgZG8gdGhpcyBob3VzZWtlZXBpbmcgYW5kIGludGVycnVwdHMgYXJlIGVuYWJsZWQsCi07IHRoZSBrZXJuZWwgd2lsbCBiZWNvbWUgdmVyeSB1bnN0YWJsZSBhbmQgY3Jhc2ggd2l0aGluIDEwIHNlY29uZHMgb3Igc28uCi07KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgcHVzaGZkCi0gICAgICAgIHB1c2ggICAgZnMKLQotICAgICAgICBtb3YgICAgIGVieCwwMDAwMDAzMGgKLSAgICAgICAgbW92ICAgICBmcyxieAotICAgICAgICBzdWIgICAgIGVzcCw1MGgKLSAgICAgICAgbW92ICAgICBlYnAsZXNwCi0KLTsgU2V0dXAgdGhlIGV4Y2VwdGlvbiBmcmFtZSB0byBOVUxMCi0KLSAgICAgICAgbW92ICAgICBlYngsW0RXT1JEIGNzOjBGRkRGRjAwMGhdCi0gICAgICAgIG1vdiAgICAgW0RXT1JEIGRzOjBGRkRGRjAwMGhdLCAwRkZGRkZGRkZoCi0gICAgICAgIG1vdiAgICAgW0RXT1JEIGVicF0sZWJ4Ci0KLTsgU2F2ZSBhd2F5IHRoZSBleGlzdGluZyBLU1MgZWJwCi0KLSAgICAgICAgbW92ICAgICBlc2ksW0RXT1JEIGNzOjBGRkRGRjEyNGhdCi0gICAgICAgIG1vdiAgICAgZWJ4LFtEV09SRCBlc2krMDAwMDAxMjhoXQotICAgICAgICBtb3YgICAgIFtEV09SRCBlYnArNGhdLGVieAotICAgICAgICBtb3YgICAgIFtEV09SRCBlc2krMDAwMDAxMjhoXSxlYnAKLQotOyBTYXZlIGF3YXkgdGhlIGtlcm5lbCB0aW1lIGFuZCB0aGUgdGhyZWFkIG1vZGUgKGtlcm5lbC91c2VyKQotCi0gICAgICAgIG1vdiAgICAgZWRpLFtEV09SRCBlc2krMDAwMDAxMzdoXQotICAgICAgICBtb3YgICAgIFtEV09SRCBlYnArOGhdLGVkaQotCi07IFNldCB0aGUgdGhyZWFkIG1vZGUgKGtlcm5lbC91c2VyKSBiYXNlZCBvbiB0aGUgY29kZSBzZWxlY3RvcgotCi0gICAgICAgIG1vdiAgICAgZWJ4LFtEV09SRCBlYnArN0NoXQotICAgICAgICBhbmQgICAgIGVieCwwMQotICAgICAgICBtb3YgICAgIFtCWVRFIGVzaSswMDAwMDEzN2hdLGJsCi0KLTsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotOyBFbmQgb2Ygc3BlY2lhbCBpbnRlcnJ1cHQgUHJvbG9nIGNvZGUKLTsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotCi07IENsZWFyIHByaW9yaXR5IGludGVycnVwdCBjb250cm9sbGVyIGFuZCByZS1lbmFibGUgaW50ZXJydXB0cyBzbyB3ZQotOyBkb250IGxvY2sgdGhpbmdzIHVwIGZvciBsb25nLgotCi0gICAgICAgIG1vdiAgICAgYWwsMjBoCi0gICAgICAgIG91dCAgICAgMEEwaCxhbAotICAgICAgICBvdXQgICAgIDAyMGgsYWwKLQotOyBDbGVhciByZWFsLXRpbWUgY2xvY2sgdGltZW91dAotCi0gICAgICAgIGluICAgICAgYWwsNzBoICAgICAgICAgICAgICA7IFJlYWQgQ01PUyBpbmRleCByZWdpc3RlcgotICAgICAgICBwdXNoICAgIGVheCAgICAgICAgICAgICAgICAgOyAgYW5kIHNhdmUgZm9yIGxhdGVyCi0gICAgICAgIElPREVMQVlOIDMKLSAgICAgICAgbW92ICAgICBhbCwwQ2gKLSAgICAgICAgb3V0ICAgICA3MGgsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBpbiAgICAgIGFsLDcxaAotCi07IENhbGwgdGhlIEMgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24KLQotICAgICAgICBjbXAgICAgIFtCWVRFIFJ0Y0luc2lkZV0sMSAgOyBDaGVjayBmb3IgbXV0dWFsIGV4Y2x1c2lvbgotICAgICAgICBqZSAgICAgIEBARXhpdAotICAgICAgICBtb3YgICAgIFtCWVRFIFJ0Y0luc2lkZV0sMQotICAgICAgICBzdGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBFbmFibGUgaW50ZXJydXB0cwotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZyBmb3IgQyBjb2RlCi0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX3J0Y0hhbmRsZXJdCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgICAgICA7IERpc2FibGUgaW50ZXJydXB0cyBvbiBleGl0IQotICAgICAgICBtb3YgICAgIFtCWVRFIFJ0Y0luc2lkZV0sMAotCi1AQEV4aXQ6IHBvcCAgICAgZWF4Ci0gICAgICAgIG91dCAgICAgNzBoLGFsICAgICAgICAgICAgICA7IFJlc3RvcmUgQ01PUyBpbmRleCByZWdpc3RlcgotCi07KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKLTsgU3RhcnQgb2Ygc3BlY2lhbCBlcGlsb2cgY29kZSB0byByZXN0b3JlIHN0dWZmIG9uIGV4aXQgZnJvbSBoYW5kbGVyCi07KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKLQotOyBSZXN0b3JlIHRoZSBLU1MgZWJwCi0KLSAgICAgICAgbW92ICAgICBlc2ksW0RXT1JEIGNzOjBGRkRGRjEyNGhdCi0gICAgICAgIG1vdiAgICAgZWJ4LFtEV09SRCBlYnArNF0KLSAgICAgICAgbW92ICAgICBbRFdPUkQgZXNpKzAwMDAwMTI4aF0sZWJ4Ci0KLTsgUmVzdG9yZSB0aGUgZXhjZXB0aW9uIGZyYW1lCi0KLSAgICAgICAgbW92ICAgICBlYngsW0RXT1JEIGVicF0KLSAgICAgICAgbW92ICAgICBbRFdPUkQgZnM6MDAwMDAwMDBdLGVieAotCi07IFJlc3RvcmUgdGhlIHRocmVhZCBtb2RlCi0KLSAgICAgICAgbW92ICAgICBlYngsW0RXT1JEIGVicCs4aF0KLSAgICAgICAgbW92ICAgICBlc2ksW0RXT1JEIGZzOjAwMDAwMTI0aF0KLSAgICAgICAgbW92ICAgICBbQllURSBlc2krMDAwMDAxMzdoXSxibAotICAgICAgICBhZGQgICAgIGVzcCwgNTBoCi0gICAgICAgIHBvcCAgICAgZnMKLSAgICAgICAgcG9wZmQKLSAgICAgICAgcG9wYWQKLQotOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotICAgICAgICBpcmV0Ci0KLWNwcm9jZW5kCi0KLWNwdWJsaWMgX1BNX2lycUNvZGVFbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fZ2V0SVNSKGludCBpcnEsUE1GQVJQVFIgKmhhbmRsZXIpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBzcGVjaWZpYyBJUlEgaGFuZGxlciBkaXJlY3QgZnJvbSB0aGUgSURULgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9nZXRJU1IKLQotICAgICAgICBBUkcgICAgIGlkdEVudHJ5OlVJTlQsIGhhbmRsZXI6RFBUUgotCi0gICAgICAgIGVudGVyX2MgMAotICAgICAgICBtb3YgICAgIGVjeCxbaGFuZGxlcl0gICAgICAgICAgIDsgR2V0IGFkZHJlc3Mgb2YgaGFuZGxlciB0byBmaWxsIGluCi0gICAgICAgIHNpZHQgICAgW3NpZHRCdWZdICAgICAgICAgICAgICAgOyBHZXQgSURUUiByZWdpc3RlciBpbnRvIHNpZHRCdWYKLSAgICAgICAgbW92ICAgICBlYXgsW0RXT1JEIHNpZHRCdWYrMl0gICA7IEdldCBhZGRyZXNzIG9mIElEVCBpbnRvIEVBWAotICAgICAgICBtb3YgICAgIGVieCxbaWR0RW50cnldCi0gICAgICAgIGxlYSAgICAgZWF4LFtlYXgrZWJ4KjhdICAgICAgICAgOyBHZXQgZW50cnkgaW4gdGhlIElEVAotICAgICAgICBtb3Z6eCAgIGVkeCxbV09SRCBlYXgrNl0gICAgICAgIDsgR2V0IGhpZ2ggb3JkZXIgMTYtYml0cwotICAgICAgICBzaGwgICAgIGVkeCwxNiAgICAgICAgICAgICAgICAgIDsgTW92ZSBpbnRvIHRvcCAxNi1iaXRzIG9mIGFkZHJlc3MKLSAgICAgICAgbW92ICAgICBkeCxbV09SRCBlYXhdICAgICAgICAgICA7IEdldCBsb3cgb3JkZXIgMTYtYml0cwotICAgICAgICBtb3YgICAgIFtEV09SRCBlY3hdLGVkeCAgICAgICAgIDsgU3RvcmUgbGluZWFyIGFkZHJlc3Mgb2YgaGFuZGxlcgotICAgICAgICBtb3YgICAgIGR4LFtXT1JEIGVheCsyXSAgICAgICAgIDsgR2V0IHNlbGVjdG9yIHZhbHVlCi0gICAgICAgIG1vdiAgICAgW1dPUkQgZWN4KzRdLGR4ICAgICAgICAgOyBTdG9yZSBzZWxlY3RvciB2YWx1ZQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZCAgICBfUE1fZ2V0SVNSCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX1BNX3NldElTUihpbnQgaXJxLHZvaWQgKmhhbmRsZXIpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRnVuY3Rpb24gdG8gc2V0IHRoZSBzcGVjaWZpYyBJUlEgaGFuZGxlciBkaXJlY3QgaW4gdGhlIElEVC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fc2V0SVNSCi0KLSAgICAgICAgQVJHICAgICBpcnE6VUlOVCwgaGFuZGxlcjpDUFRSCi0KLSAgICAgICAgZW50ZXJfYyAwCi0gICAgICAgIG1vdiAgICAgZWN4LFtoYW5kbGVyXSAgICAgICAgICAgOyBHZXQgYWRkcmVzcyBvZiBuZXcgaGFuZGxlcgotICAgICAgICBtb3YgICAgIGR4LGNzICAgICAgICAgICAgICAgICAgIDsgR2V0IHNlbGVjdG9yIGZvciBuZXcgaGFuZGxlcgotICAgICAgICBzaWR0ICAgIFtzaWR0QnVmXSAgICAgICAgICAgICAgIDsgR2V0IElEVFIgcmVnaXN0ZXIgaW50byBzaWR0QnVmCi0gICAgICAgIG1vdiAgICAgZWF4LFtEV09SRCBzaWR0QnVmKzJdICAgOyBHZXQgYWRkcmVzcyBvZiBJRFQgaW50byBFQVgKLSAgICAgICAgbW92ICAgICBlYngsW2lkdEVudHJ5XQotICAgICAgICBsZWEgICAgIGVheCxbZWF4K2VieCo4XSAgICAgICAgIDsgR2V0IGVudHJ5IGluIHRoZSBJRFQKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgW1dPUkQgZWF4KzJdLGR4ICAgICAgICAgOyBTdG9yZSBjb2RlIHNlZ21lbnQgc2VsZWN0b3IKLSAgICAgICAgbW92ICAgICBbV09SRCBlYXhdLGN4ICAgICAgICAgICA7IFN0b3JlIGxvdyBvcmRlciBiaXRzIG9mIGhhbmRsZXIKLSAgICAgICAgc2hyICAgICBlY3gsMTYKLSAgICAgICAgbW92ICAgICBbV09SRCBlYXgrNl0sY3ggICAgICAgICA7IFN0b3JlIGhpZ2ggb3JkZXIgYml0cyBvZiBoYW5kbGVyCi0gICAgICAgIHN0aQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZCAgICBfUE1fc2V0SVNSCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX1BNX3Jlc3RvcmVJU1IoaW50IGlycSxQTUZBUlBUUiAqaGFuZGxlcik7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGdW5jdGlvbiB0byBzZXQgdGhlIHNwZWNpZmljIElSUSBoYW5kbGVyIGRpcmVjdCBpbiB0aGUgSURULgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9yZXN0b3JlSVNSCi0KLSAgICAgICAgQVJHICAgICBpcnE6VUlOVCwgaGFuZGxlcjpDUFRSCi0KLSAgICAgICAgZW50ZXJfYyAwCi0gICAgICAgIG1vdiAgICAgZWN4LFtoYW5kbGVyXQotICAgICAgICBtb3YgICAgIGR4LFtXT1JEIGVjeCs0XSAgICAgICAgIDsgR2V0IHNlbGVjdG9yIGZvciBvbGQgaGFuZGxlcgotICAgICAgICBtb3YgICAgIGVjeCxbRFdPUkQgZWN4XSAgICAgICAgIDsgR2V0IGFkZHJlc3Mgb2Ygb2xkIGhhbmRsZXIKLSAgICAgICAgc2lkdCAgICBbc2lkdEJ1Zl0gICAgICAgICAgICAgICA7IEdldCBJRFRSIHJlZ2lzdGVyIGludG8gc2lkdEJ1ZgotICAgICAgICBtb3YgICAgIGVheCxbRFdPUkQgc2lkdEJ1ZisyXSAgIDsgR2V0IGFkZHJlc3Mgb2YgSURUIGludG8gRUFYCi0gICAgICAgIG1vdiAgICAgZWJ4LFtpZHRFbnRyeV0KLSAgICAgICAgbGVhICAgICBlYXgsW2VheCtlYngqOF0gICAgICAgICA7IEdldCBlbnRyeSBpbiB0aGUgSURUCi0gICAgICAgIGNsaQotICAgICAgICBtb3YgICAgIFtXT1JEIGVheCsyXSxkeCAgICAgICAgIDsgU3RvcmUgY29kZSBzZWdtZW50IHNlbGVjdG9yCi0gICAgICAgIG1vdiAgICAgW1dPUkQgZWF4XSxjeCAgICAgICAgICAgOyBTdG9yZSBsb3cgb3JkZXIgYml0cyBvZiBoYW5kbGVyCi0gICAgICAgIHNociAgICAgZWN4LDE2Ci0gICAgICAgIG1vdiAgICAgW1dPUkQgZWF4KzZdLGN4ICAgICAgICAgOyBTdG9yZSBoaWdoIG9yZGVyIGJpdHMgb2YgaGFuZGxlcgotICAgICAgICBzdGkKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQgICAgX1BNX3Jlc3RvcmVJU1IKLQotZW5kY29kZXNlZyAgX2lycQotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9fcG0uYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvX3BtLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiMjc2ZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9fcG0uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgVEFTTSA0LjAgb3IgTkFTTQotOyogRW52aXJvbm1lbnQ6IDMyLWJpdCBXaW5kb3dzIE5UIGRldmljZSBkcml2ZXIKLTsqCi07KiBEZXNjcmlwdGlvbjogTG93IGxldmVsIGFzc2VtYmx5IHN1cHBvcnQgZm9yIHRoZSBQTSBsaWJyYXJ5IHNwZWNpZmljIHRvCi07KiAgICAgICAgICAgICAgV2luZG93cyBOVCBkZXZpY2UgZHJpdmVycy4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1oZWFkZXIgICAgICBfcG0gICAgICAgICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKLQotUDU4NgotCi1iZWdkYXRhc2VnCi0KLTsgV2F0Y29tIEMrKyBleHRlcm5hbHMgcmVxdWlyZWQgdG8gbGluayB3aGVuIGNvbXBpbGluZyBmbG9hdGluZyBwb2ludAotOyBDIGNvZGUuIFRoZXkgYXJlIG5vdCBhY3R1YWxseSB1c2VkIGluIHRoZSBjb2RlIGJlY2F1c2Ugd2UgY29tcGlsZSB3aXRoCi07IGlubGluZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMsIGhvd2V2ZXIgdGhlIGNvbXBpbGVyIHN0aWxsIGdlbmVyYXRlcwotOyB0aGUgcmVmZXJlbmNlcyBpbiB0aGUgb2JqZWN0IG1vZHVsZXMuCi0KLV9fODA4NyAgICAgIGRkICAwCi0gICAgICAgICAgICBQVUJMSUMgIF9fODA4NwotX19pbXRocmVhZDoKLV9fZmx0dXNlZDoKLV9mbHR1c2VkXyAgIGRkICAwCi0gICAgICAgICAgICBQVUJMSUMgIF9faW10aHJlYWQKLSAgICAgICAgICAgIFBVQkxJQyAgX2ZsdHVzZWRfCi0gICAgICAgICAgICBQVUJMSUMgIF9fZmx0dXNlZAotCi1lbmRkYXRhc2VnCi0KLWJlZ2NvZGVzZWcgIF9wbSAgICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZWdyZWFkKFBNU1JFR1MgKnNyZWdzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiBhbGwgc2VnbWVudCByZWdpc3RlcnMKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9zZWdyZWFkCi0KLSAgICAgICAgQVJHICAgICBzcmVnczpEUFRSCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgYXgsZXMKLSAgICAgICAgX2xlcyAgICBfc2ksW3NyZWdzXQotICAgICAgICBtb3YgICAgIFtfRVMgX3NpXSxheAotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzJdLGNzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krNF0sc3MKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSs2XSxkcwotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzhdLGZzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krMTBdLGdzCi0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX2ludDM4NngoaW50IGludG5vLCBQTVJFR1MgKmluLCBQTVJFR1MgKm91dCxQTVNSRUdTICpzcmVncykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElzc3VlcyBhIHNvZnR3YXJlIGludGVycnVwdCBpbiBwcm90ZWN0ZWQgbW9kZS4gVGhpcyByb3V0aW5lIGhhcyBiZWVuCi07IHdyaXR0ZW4gdG8gYWxsb3cgdXNlciBwcm9ncmFtcyB0byBsb2FkIENTIGFuZCBEUyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMKLTsgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9pbnQzODZ4Ci0KLTsgTm90IHVzZWQgZm9yIE5UIGRldmljZSBkcml2ZXJzCi0KLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fc2V0QmFua0EoaW50IGJhbmspCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgICAgIFBNX3NldEJhbmtBCi0KLTsgTm90IHVzZWQgZm9yIE5UIGRldmljZSBkcml2ZXJzCi0KLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fc2V0QmFua0FCKGludCBiYW5rKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgICAgICBQTV9zZXRCYW5rQUIKLQotOyBOb3QgdXNlZCBmb3IgTlQgZGV2aWNlIGRyaXZlcnMKLQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZXRDUlRTdGFydChpbnQgeCxpbnQgeSxpbnQgd2FpdFZSVCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgICAgUE1fc2V0Q1JUU3RhcnQKLQotOyBOb3QgdXNlZCBmb3IgTlQgZGV2aWNlIGRyaXZlcnMKLQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOyBNYWNybyB0byBkZWxheSBicmllZmx5IHRvIGVuc3VyZSB0aGF0IGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIGJldHdlZW4KLTsgc3VjY2Vzc2l2ZSBJL08gYWNjZXNzZXMgc28gdGhhdCB0aGUgZGV2aWNlIGJlaW5nIGFjY2Vzc2VkIGNhbiByZXNwb25kCi07IHRvIGJvdGggYWNjZXNzZXMgZXZlbiBvbiBhIHZlcnkgZmFzdCBQQy4KLQotaWZkZWYgICBVU0VfTkFTTQotJW1hY3JvICBERUxBWSAwCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0lZW5kbWFjcm8KLSVtYWNybyAgSU9ERUxBWU4gMQotJXJlcCAgICAlMQotICAgICAgICBERUxBWQotJWVuZHJlcAotJWVuZG1hY3JvCi1lbHNlCi1tYWNybyAgIERFTEFZCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi1lbmRtCi1tYWNybyAgIElPREVMQVlOICAgIE4KLSAgICByZXB0ICAgIE4KLSAgICAgICAgREVMQVkKLSAgICBlbmRtCi1lbmRtCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1Y2hhciBfUE1fcmVhZENNT1MoaW50IGluZGV4KQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBDTU9TIHJlZ2lzdGVyLiBXZSBkbyB0aGlzIHdpdGggYm90aAotOyBub3JtYWwgaW50ZXJydXB0cyBhbmQgTk1JIGRpc2FibGVkLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9yZWFkQ01PUwotCi0gICAgICAgIEFSRyAgICAgaW5kZXg6VUlOVAotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBwdXNoZmQKLSAgICAgICAgbW92ICAgICBhbCxbQllURSBpbmRleF0KLSAgICAgICAgb3IgICAgICBhbCw4MGggICAgICAgICAgICAgIDsgQWRkIGRpc2FibGUgTk1JIGZsYWcKLSAgICAgICAgY2xpCi0gICAgICAgIG91dCAgICAgNzBoLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgaW4gICAgICBhbCw3MWgKLSAgICAgICAgbW92ICAgICBhaCxhbAotICAgICAgICB4b3IgICAgIGFsLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmUtZW5hYmxlIE5NSQotICAgICAgICBtb3YgICAgIGFsLGFoICAgICAgICAgICAgICAgOyBSZXR1cm4gdmFsdWUgaW4gQUwKLSAgICAgICAgcG9wZmQKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX1BNX3dyaXRlQ01PUyhpbnQgaW5kZXgsdWNoYXIgdmFsdWUpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIENNT1MgcmVnaXN0ZXIuIFdlIGRvIHRoaXMgd2l0aCBib3RoCi07IG5vcm1hbCBpbnRlcnJ1cHRzIGFuZCBOTUkgZGlzYWJsZWQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3dyaXRlQ01PUwotCi0gICAgICAgIEFSRyAgICAgaW5kZXg6VUlOVCwgdmFsdWU6VUNIQVIKLQotICAgICAgICBwdXNoICAgIF9icAotICAgICAgICBtb3YgICAgIF9icCxfc3AKLSAgICAgICAgcHVzaGZkCi0gICAgICAgIG1vdiAgICAgYWwsW0JZVEUgaW5kZXhdCi0gICAgICAgIG9yICAgICAgYWwsODBoICAgICAgICAgICAgICA7IEFkZCBkaXNhYmxlIE5NSSBmbGFnCi0gICAgICAgIGNsaQotICAgICAgICBvdXQgICAgIDcwaCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIG1vdiAgICAgYWwsW3ZhbHVlXQotICAgICAgICBvdXQgICAgIDcxaCxhbAotICAgICAgICB4b3IgICAgIGFsLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmUtZW5hYmxlIE5NSQotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgZG91YmxlIF9mdG9sKGRvdWJsZSBmKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2FsbHMgdG8gX19mdG9sIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIEJvcmxhbmQgQysrIGNvbXBpbGVyIGZvciBjb2RlCi07IHRoYXQgbmVlZHMgdG8gY29udmVydCBhIGZsb2F0aW5nIHBvaW50IHR5cGUgdG8gYW4gaW50ZWdyYWwgdHlwZS4KLTsKLTsgSW5wdXQ6IGZsb2F0aW5nIHBvaW50IG51bWJlciBvbiB0aGUgdG9wIG9mIHRoZSAnODcuCi07Ci07IE91dHB1dDogYSAoc2lnbmVkIG9yIHVuc2lnbmVkKSBsb25nIGluIEVBWAotOyBBbGwgb3RoZXIgcmVnaXN0ZXJzIHByZXNlcnZlZC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX2Z0b2wKLQotICAgICAgICBMT0NBTCAgIHRlbXAxOldPUkQsIHRlbXAyOlFXT1JEID0gTG9jYWxTaXplCi0KLSAgICAgICAgcHVzaCAgICBlYnAKLSAgICAgICAgbW92ICAgICBlYnAsZXNwCi0gICAgICAgIHN1YiAgICAgZXNwLExvY2FsU2l6ZQotCi0gICAgICAgIGZzdGN3ICAgW3RlbXAxXSAgICAgICAgICAgICAgICAgOyBzYXZlIHRoZSBjb250cm9sIHdvcmQKLSAgICAgICAgZndhaXQKLSAgICAgICAgbW92ICAgICBhbCxbQllURSB0ZW1wMSsxXQotICAgICAgICBvciAgICAgIFtCWVRFIHRlbXAxKzFdLDBDaCAgICAgIDsgc2V0IHJvdW5kaW5nIGNvbnRyb2wgdG8gY2hvcAotICAgICAgICBmbGRjdyAgIFt0ZW1wMV0KLSAgICAgICAgZmlzdHAgICBbdGVtcDJdICAgICAgICAgICAgICAgICA7IGNvbnZlcnQgdG8gNjQtYml0IGludGVnZXIKLSAgICAgICAgbW92ICAgICBbQllURSB0ZW1wMSsxXSxhbAotICAgICAgICBmbGRjdyAgIFt0ZW1wMV0gICAgICAgICAgICAgICAgIDsgcmVzdG9yZSB0aGUgY29udHJvbCB3b3JkCi0gICAgICAgIG1vdiAgICAgZWF4LFtEV09SRCB0ZW1wMl0gICAgICAgOyByZXR1cm4gTFMgMzIgYml0cwotICAgICAgICBtb3YgICAgIGVkeCxbRFdPUkQgdGVtcDIrNF0gICAgIDsgICAgICAgIE1TIDMyIGJpdHMKLQotICAgICAgICBtb3YgICAgIGVzcCxlYnAKLSAgICAgICAgcG9wICAgICBlYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IF9QTV9nZXRQREIgLSBSZXR1cm4gdGhlIFBhZ2UgVGFibGUgRGlyZWN0b3J5IEJhc2UgYWRkcmVzcwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9nZXRQREIKLQotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgYW5kICAgICBlYXgsMEZGRkZGMDAwaAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRmx1c2ggdGhlIFRyYW5zbGF0aW9uIExvb2thc2lkZSBidWZmZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9mbHVzaFRMQgotCi0gICAgICAgIHdiaW52ZCAgICAgICAgICAgICAgICAgIDsgRmx1c2ggdGhlIENQVSBjYWNoZQotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgOyBGbHVzaCB0aGUgVExCCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfcG0KLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L2NwdWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1YjA3Yy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9jcHVpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBWeEQKLSoKLSogRGVzY3JpcHRpb246ICBWeEQgc3BlY2lmaWMgY29kZSBmb3IgdGhlIENQVSBkZXRlY3Rpb24gbW9kdWxlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EbyBub3RoaW5nIGZvciBWeEQncwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU2V0TWF4VGhyZWFkUHJpb3JpdHkoKSAgICAgIDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EbyBub3RoaW5nIGZvciBWeEQncwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgUmVzdG9yZVRocmVhZFByaW9yaXR5KGkpICAgICh2b2lkKShpKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKLXsKLSAgICBLZVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKilmcmVxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIExBUkdFX0lOVEVHRVIgbHQgPSBLZVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKE5VTEwpOyAgICAgXAotICAgICh0KS0+bG93ID0gbHQuTG93UGFydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh0KS0+aGlnaCA9IGx0LkhpZ2hQYXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvaW50ODYuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L2ludDg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MjY0OGIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvaW50ODYuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBOVCBkZXZpY2UgZHJpdmVycy4KLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHJlYWwgbW9kZSBzb2Z0d2FyZSBpbnRlcnJ1cHQKLSogICAgICAgICAgICAgICBoYW5kbGluZyBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotI2luY2x1ZGUgIm10cnIuaCIKLSNpbmNsdWRlICJvc2hkci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVdlIGRvIGhhdmUgbGltaXRlZCBCSU9TIGFjY2VzcyB1bmRlciBXaW5kb3dzIE5UIGRldmljZSBkcml2ZXJzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2hhdmVCSU9TQWNjZXNzKHZvaWQpCi17Ci0gICAgLyogUmV0dXJuIGZhbHNlIHVubGVzcyB3ZSBoYXZlIGZ1bGwgYnVmZmVyIHBhc3NpbmchICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWxlbiAgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIKLXJzZWcgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgcmVhbCBtb2RlIHNlZ21lbnQgb2YgdGhlIGJ1ZmZlcgotcm9mZiAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSByZWFsIG1vZGUgb2Zmc2V0IG9mIHRoZSBidWZmZXIKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBnbG9iYWwgVkVTQSB0cmFuc2ZlcgotYnVmZmVyIHRoYXQgaXMgdXNlZCBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBWRVNBIEJJT1MgZnVuY3Rpb25zIGZyb20KLVdpbjE2IGFuZCBXaW4zMiBwcm9ncmFtcyB1bmRlciBXaW5kb3dzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKAotICAgIHVpbnQgKmxlbiwKLSAgICB1aW50ICpyc2VnLAotICAgIHVpbnQgKnJvZmYpCi17Ci0gICAgLyogTm8gYnVmZmVycyBzdXBwb3J0ZWQgdW5kZXIgV2luZG93cyBOVCAoV2luZG93cyBYUCBoYXMgdGhlbSBob3dldmVyIGlmICovCi0gICAgLyogd2UgZXZlciBkZWNpZGUgdG8gc3VwcG9ydCB0aGlzISkgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIHByb3RlY3RlZCBtb2RlIHNvZnR3YXJlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50Mzg2KAotICAgIGludCBpbnRubywKLSAgICBQTVJFR1MgKmluLAotICAgIFBNUkVHUyAqb3V0KQotewotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJldHVybiBQTV9pbnQzODZ4KGludG5vLGluLG91dCwmc3JlZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1hcCBhIHJlYWwgbW9kZSBwb2ludGVyIHRvIGEgcHJvdGVjdGVkIG1vZGUgcG9pbnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIoCi0gICAgdWludCByX3NlZywKLSAgICB1aW50IHJfb2ZmKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBXaW5kb3dzIE5UIGRyaXZlcnMhICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgYSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZygKLSAgICB1aW50IHNpemUsCi0gICAgdWludCAqcl9zZWcsCi0gICAgdWludCAqcl9vZmYpCi17Ci0gICAgLyogTm90IHN1cHBvcnRlZCBpbiBOVCBkcml2ZXJzICovCi0gICAgKHZvaWQpc2l6ZTsKLSAgICAodm9pZClyX3NlZzsKLSAgICAodm9pZClyX29mZjsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2YgcmVhbCBtb2RlIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKAotICAgIHZvaWQgKm1lbSkKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZCltZW07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSByZWFsIG1vZGUgaW50ZXJydXB0IChwYXJhbWV0ZXJzIGluIERQTUkgY29tcGF0aWJsZSBzdHJ1Y3R1cmUpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBEUE1JX2ludDg2KAotICAgIGludCBpbnRubywKLSAgICBEUE1JX3JlZ3MgKnJlZ3MpCi17Ci0gICAgLyogTm90IHVzZWQgaW4gTlQgZHJpdmVycyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgYSBWODYgcmVhbCBtb2RlIGZ1bmN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCByZWdpc3RlciB2YWx1ZXMKLWxvYWRlZCBiZWZvcmUgdGhlIGNhbGwuIFRoZSBjYWxsIHJldHVybnMgd2l0aCBhIGZhciByZXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9jYWxsUmVhbE1vZGUoCi0gICAgdWludCBzZWcsCi0gICAgdWludCBvZmYsCi0gICAgUk1SRUdTICpyZWdzLAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIC8qIFRPRE8hISAqLwotI2lmIDAKLSAgICBDTElFTlRfU1RSVUNUIHNhdmVSZWdzOwotCi0gICAgLyogQmFpbCBpZiB3ZSBkbyBub3QgaGF2ZSBCSU9TIGFjY2VzcyAoaWU6IHRoZSBWeEQgd2FzIGR5bmFtaWNhbGx5Ci0gICAgICogbG9hZGVkLCBhbmQgbm90IHN0YXRpY2FsbHkgbG9hZGVkLgotICAgICAqLwotICAgIGlmICghX1BNX2hhdmVCSU9TKQotCXJldHVybjsKLQotICAgIFRSQUNFKCJTRERIRUxQOiBFbnRlcmluZyBQTV9jYWxsUmVhbE1vZGUoKVxuIik7Ci0gICAgQmVnaW5fTmVzdF9WODZfRXhlYygpOwotICAgIExvYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLHJlZ3Msc3JlZ3MpOwotICAgIFNpbXVsYXRlX0Zhcl9DYWxsKHNlZywgb2ZmKTsKLSAgICBSZXN1bWVfRXhlYygpOwotICAgIFJlYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLHJlZ3Msc3JlZ3MpOwotICAgIEVuZF9OZXN0X0V4ZWMoKTsKLSAgICBUUkFDRSgiU0RESEVMUDogRXhpdGluZyBQTV9jYWxsUmVhbE1vZGUoKVxuIik7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIFY4NiByZWFsIG1vZGUgaW50ZXJydXB0IHdpdGggdGhlIHNwZWNpZmllZCByZWdpc3RlciB2YWx1ZXMKLWxvYWRlZCBiZWZvcmUgdGhlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODYoCi0gICAgaW50IGludG5vLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1SRUdTICpvdXQpCi17Ci0gICAgLyogVE9ETyEhICovCi0jaWYgMAotICAgIFJNU1JFR1MgICAgICAgICBzcmVncyA9IHswfTsKLSAgICBDTElFTlRfU1RSVUNUICAgc2F2ZVJlZ3M7Ci0gICAgdXNob3J0ICAgICAgICAgIG9sZERpc2FibGU7Ci0KLSAgICAvKiBEaXNhYmxlIHBhc3MtdXAgdG8gb3VyIFZ4RCBoYW5kbGVyIHNvIHdlIGRpcmVjdGx5IGNhbGwgQklPUyAqLwotICAgIFRSQUNFKCJTRERIRUxQOiBFbnRlcmluZyBQTV9pbnQ4NigpXG4iKTsKLSAgICBpZiAoZGlzYWJsZVRTUkZsYWcpIHsKLQlvbGREaXNhYmxlID0gKmRpc2FibGVUU1JGbGFnOwotCSpkaXNhYmxlVFNSRmxhZyA9IDA7Ci0JfQotICAgIEJlZ2luX05lc3RfVjg2X0V4ZWMoKTsKLSAgICBMb2FkVjg2UmVnaXN0ZXJzKCZzYXZlUmVncyxpbiwmc3JlZ3MpOwotICAgIEV4ZWNfSW50KGludG5vKTsKLSAgICBSZWFkVjg2UmVnaXN0ZXJzKCZzYXZlUmVncyxvdXQsJnNyZWdzKTsKLSAgICBFbmRfTmVzdF9FeGVjKCk7Ci0KLSAgICAvKiBSZS1lbmFibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgaWYgcHJldmlvdXNseSBlbmFibGVkICovCi0gICAgaWYgKGRpc2FibGVUU1JGbGFnKQotCSpkaXNhYmxlVFNSRmxhZyA9IG9sZERpc2FibGU7Ci0KLSAgICBUUkFDRSgiU0RESEVMUDogRXhpdGluZyBQTV9pbnQ4NigpXG4iKTsKLSNlbHNlCi0gICAgKm91dCA9ICppbjsKLSNlbmRpZgotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSBWODYgcmVhbCBtb2RlIGludGVycnVwdCB3aXRoIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgdmFsdWVzCi1sb2FkZWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2ludDg2eCgKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICAvKiBUT0RPISEgKi8KLSNpZiAwCi0gICAgQ0xJRU5UX1NUUlVDVCAgIHNhdmVSZWdzOwotICAgIHVzaG9ydCAgICAgICAgICBvbGREaXNhYmxlOwotCi0gICAgLyogQmFpbCBpZiB3ZSBkbyBub3QgaGF2ZSBCSU9TIGFjY2VzcyAoaWU6IHRoZSBWeEQgd2FzIGR5bmFtaWNhbGx5Ci0gICAgICogbG9hZGVkLCBhbmQgbm90IHN0YXRpY2FsbHkgbG9hZGVkLgotICAgICAqLwotICAgIGlmICghX1BNX2hhdmVCSU9TKSB7Ci0JKm91dCA9ICppbjsKLQlyZXR1cm4gb3V0LT54LmF4OwotCX0KLQotICAgIC8qIERpc2FibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgc28gd2UgZGlyZWN0bHkgY2FsbCBCSU9TICovCi0gICAgVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2ludDg2eCgpXG4iKTsKLSAgICBpZiAoZGlzYWJsZVRTUkZsYWcpIHsKLQlvbGREaXNhYmxlID0gKmRpc2FibGVUU1JGbGFnOwotCSpkaXNhYmxlVFNSRmxhZyA9IDA7Ci0JfQotICAgIEJlZ2luX05lc3RfVjg2X0V4ZWMoKTsKLSAgICBMb2FkVjg2UmVnaXN0ZXJzKCZzYXZlUmVncyxpbixzcmVncyk7Ci0gICAgRXhlY19JbnQoaW50bm8pOwotICAgIFJlYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLG91dCxzcmVncyk7Ci0gICAgRW5kX05lc3RfRXhlYygpOwotCi0gICAgLyogUmUtZW5hYmxlIHBhc3MtdXAgdG8gb3VyIFZ4RCBoYW5kbGVyIGlmIHByZXZpb3VzbHkgZW5hYmxlZCAqLwotICAgIGlmIChkaXNhYmxlVFNSRmxhZykKLQkqZGlzYWJsZVRTUkZsYWcgPSBvbGREaXNhYmxlOwotCi0gICAgVFJBQ0UoIlNEREhFTFA6IEV4aXRpbmcgUE1faW50ODZ4KClcbiIpOwotI2Vsc2UKLSAgICAqb3V0ID0gKmluOwotI2VuZGlmCi0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L2lycS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvaXJxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDUyMDQ3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L2lycS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIE5UIGRldmljZSBkcml2ZXJzLgotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgTlQgZHJpdmVyIElSUSBtYW5hZ2VtZW50IGZ1bmN0aW9ucwotKiAgICAgICAgICAgICAgIGZvciB0aGUgUE0gbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgInBtaW50LmgiCi0jaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCi0jaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKLSNpbmNsdWRlICJtdHJyLmgiCi0jaW5jbHVkZSAib3NoZHIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCAgICAgICAgICBnbG9iYWxEYXRhU3RhcnQ7Ci1zdGF0aWMgdWNoYXIgICAgICAgIF9QTV9vbGRDTU9TUmVnQTsKLXN0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZENNT1NSZWdCOwotc3RhdGljIHVjaGFyICAgICAgICBfUE1fb2xkUlRDUElDMjsKLXN0YXRpYyB1bG9uZyAgICAgICAgUlRDX2lkdEVudHJ5OwotUE1faW50SGFuZGxlciAgICAgICBfUE1fcnRjSGFuZGxlciA9IE5VTEw7Ci1QTUZBUlBUUiAgICBfVkFSQVBJIF9QTV9wcmV2UlRDID0gUE1OVUxMOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBGdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgQ01PUyByZWdpc3RlcnMgKi8KLQotdWNoYXIgICBfQVNNQVBJIF9QTV9yZWFkQ01PUyhpbnQgaW5kZXgpOwotdm9pZCAgICBfQVNNQVBJIF9QTV93cml0ZUNNT1MoaW50IGluZGV4LHVjaGFyIHZhbHVlKTsKLXZvaWQgICAgX0FTTUFQSSBfUE1fcnRjSVNSKHZvaWQpOwotdm9pZCAgICBfQVNNQVBJIF9QTV9nZXRJU1IoaW50IGlycSxQTUZBUlBUUiAqaGFuZGxlcik7Ci12b2lkICAgIF9BU01BUEkgX1BNX3NldElTUihpbnQgaXJxLHZvaWQgKmhhbmRsZXIpOwotdm9pZCAgICBfQVNNQVBJIF9QTV9yZXN0b3JlSVNSKGludCBpcnEsUE1GQVJQVFIgKmhhbmRsZXIpOwotdm9pZCAgICBfQVNNQVBJIF9QTV9pcnFDb2RlU3RhcnQodm9pZCk7Ci12b2lkICAgIF9BU01BUEkgX1BNX2lycUNvZGVFbmQodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgZnJlcXVlbmN5IChmb3Igc3RlcmVvIG1vZGVzKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koCi0gICAgaW50IGZyZXF1ZW5jeSkKLXsKLSAgICBzdGF0aWMgc2hvcnQgY29udmVydFtdID0gewotCTgxOTIsCi0JNDA5NiwKLQkyMDQ4LAotCTEwMjQsCi0JNTEyLAotCTI1NiwKLQkxMjgsCi0JNjQsCi0JMzIsCi0JMTYsCi0JOCwKLQk0LAotCTIsCi0JLTEsCi0JfTsKLSAgICBpbnQgaTsKLQotICAgIC8qIEZpcnN0IGNsZWFyIGFueSBwZW5kaW5nIFJUQyB0aW1lb3V0IGlmIG5vdCBjbGVhcmVkICovCi0gICAgX1BNX3JlYWRDTU9TKDB4MEMpOwotICAgIGlmIChmcmVxdWVuY3kgPT0gMCkgewotCS8qIERpc2FibGUgUlRDIHRpbW91dCAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSwodWNoYXIpX1BNX29sZENNT1NSZWdBKTsKLQlfUE1fd3JpdGVDTU9TKDB4MEIsKHVjaGFyKShfUE1fb2xkQ01PU1JlZ0IgJiAweDBGKSk7Ci0JfQotICAgIGVsc2UgewotCS8qIENvbnZlcnQgZnJlcXVlbmN5IHZhbHVlIHRvIFJUQyBjbG9jayBpbmRleGVzICovCi0JZm9yIChpID0gMDsgY29udmVydFtpXSAhPSAtMTsgaSsrKSB7Ci0JICAgIGlmIChjb252ZXJ0W2ldID09IGZyZXF1ZW5jeSkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCS8qIFNldCBSVEMgdGltb3V0IHZhbHVlIGFuZCBlbmFibGUgdGltZW91dCAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSwodWNoYXIpKDB4MjAgfCAoaSszKSkpOwotCV9QTV93cml0ZUNNT1MoMHgwQiwodWNoYXIpKChfUE1fb2xkQ01PU1JlZ0IgJiAweDBGKSB8IDB4NDApKTsKLQl9Ci19Ci0KLWlib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKFBNX2ludEhhbmRsZXIgdGgsaW50IGZyZXF1ZW5jeSkKLXsKLSAgICBzdGF0aWMgaWJvb2wgICAgbG9ja2VkID0gZmFsc2U7Ci0KLSAgICAvKiBTYXZlIHRoZSBvbGQgQ01PUyByZWFsIHRpbWUgY2xvY2sgdmFsdWVzICovCi0gICAgX1BNX29sZENNT1NSZWdBID0gX1BNX3JlYWRDTU9TKDB4MEEpOwotICAgIF9QTV9vbGRDTU9TUmVnQiA9IF9QTV9yZWFkQ01PUygweDBCKTsKLQotICAgIC8qIEluc3RhbGwgdGhlIGludGVycnVwdCBoYW5kbGVyICovCi0gICAgUlRDX2lkdEVudHJ5ID0gMHgzODsKLSAgICBfUE1fZ2V0SVNSKFJUQ19pZHRFbnRyeSwgJl9QTV9wcmV2UlRDKTsKLSAgICBfUE1fcnRjSGFuZGxlciA9IHRoOwotICAgIF9QTV9zZXRJU1IoUlRDX2lkdEVudHJ5LCBfUE1fcnRjSVNSKTsKLQotICAgIC8qIFByb2dyYW0gdGhlIHJlYWwgdGltZSBjbG9jayBkZWZhdWx0IGZyZXF1ZW5jeSAqLwotICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koZnJlcXVlbmN5KTsKLQotICAgIC8qIFVubWFzayBJUlE4IGluIHRoZSBQSUMyICovCi0gICAgX1BNX29sZFJUQ1BJQzIgPSBQTV9pbnBiKDB4QTEpOwotICAgIFBNX291dHBiKDB4QTEsKHVjaGFyKShfUE1fb2xkUlRDUElDMiAmIDB4RkUpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3J0Y0hhbmRsZXIpIHsKLQkvKiBSZXN0b3JlIENNT1MgcmVnaXN0ZXJzIGFuZCBtYXNrIFJUQyBjbG9jayAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSxfUE1fb2xkQ01PU1JlZ0EpOwotCV9QTV93cml0ZUNNT1MoMHgwQixfUE1fb2xkQ01PU1JlZ0IpOwotCVBNX291dHBiKDB4QTEsKHVjaGFyKSgoUE1faW5wYigweEExKSAmIDB4RkUpIHwgKF9QTV9vbGRSVENQSUMyICYgfjB4RkUpKSk7Ci0KLQkvKiBSZXN0b3JlIHRoZSBpbnRlcnJ1cHQgdmVjdG9yICovCi0JX1BNX3Jlc3RvcmVJU1IoUlRDX2lkdEVudHJ5LCAmX1BNX3ByZXZSVEMpOwotCV9QTV9ydGNIYW5kbGVyID0gTlVMTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9tZW0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L21lbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTI4YzZhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L21lbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIE5UIGRldmljZSBkcml2ZXJzLgotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgTlQgZHJpdmVyIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucwotKiAgICAgICAgICAgICAgIGZvciB0aGUgUE0gbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCi0jaW5jbHVkZSAibXRyci5oIgotI2luY2x1ZGUgIm9zaGRyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgTUFYX01FTU9SWV9TSEFSRUQgICAgICAgICAgIDEwMAotI2RlZmluZSBNQVhfTUVNT1JZX01BUFBJTkdTICAgICAgICAgMTAwCi0jZGVmaW5lIE1BWF9NRU1PUllfTE9DS0VEICAgICAgICAgICAxMDAKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHZvaWQgICAgKmxpbmVhcjsKLSAgICB1bG9uZyAgIGxlbmd0aDsKLSAgICBQTURMICAgIHBNZGw7Ci0gICAgfSBtZW1zaGFyZWQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB2b2lkICAgICpsaW5lYXI7Ci0gICAgdm9pZCAgICAqbW1Jb01hcHBlZDsKLSAgICB1bG9uZyAgIGxlbmd0aDsKLSAgICBQTURMICAgIHBNZGw7Ci0gICAgfSBtZW1sb2NrZWQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIHBoeXNpY2FsOwotICAgIHVsb25nICAgbGluZWFyOwotICAgIHVsb25nICAgbGVuZ3RoOwotICAgIGlib29sICAgaXNDYWNoZWQ7Ci0gICAgfSBtbWFwcGluZzsKLQotc3RhdGljIGludCAgICAgICAgICBudW1NYXBwaW5ncyA9IDA7Ci1zdGF0aWMgbWVtc2hhcmVkICAgIHNoYXJlZFtNQVhfTUVNT1JZX01BUFBJTkdTXSA9IHswfTsKLXN0YXRpYyBtbWFwcGluZyAgICAgbWFwc1tNQVhfTUVNT1JZX01BUFBJTkdTXTsKLXN0YXRpYyBtZW1sb2NrZWQgICAgbG9ja2VkW01BWF9NRU1PUllfTE9DS0VEXTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdWxvbmcgICBQTUFQSSBfUE1fZ2V0UERCKHZvaWQpOwotCi0vKiBQYWdlIHRhYmxlIGVudHJ5IGZsYWdzICovCi0KLSNkZWZpbmUgUEFHRV9GTEFHU19QUkVTRU5UCQkJMHgwMDAwMDAwMQotI2RlZmluZSBQQUdFX0ZMQUdTX1dSSVRFQUJMRQkJMHgwMDAwMDAwMgotI2RlZmluZSBQQUdFX0ZMQUdTX1VTRVIJCQkJMHgwMDAwMDAwNAotI2RlZmluZSBQQUdFX0ZMQUdTX1dSSVRFX1RIUk9VR0gJMHgwMDAwMDAwOAotI2RlZmluZSBQQUdFX0ZMQUdTX0NBQ0hFX0RJU0FCTEUJMHgwMDAwMDAxMAotI2RlZmluZSBQQUdFX0ZMQUdTX0FDQ0VTU0VECQkJMHgwMDAwMDAyMAotI2RlZmluZSBQQUdFX0ZMQUdTX0RJUlRZCQkJMHgwMDAwMDA0MAotI2RlZmluZSBQQUdFX0ZMQUdTXzRNQgkgICAgICAgICAgICAweDAwMDAwMDgwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAgICAgLSBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSB0byBtYXBzIGluCi1saW1pdCAgICAgICAtIExpbWl0IG9mIHBoeXNpY2FsIG1lbW9yeSB0byByZWdpb24gdG8gbWFwcyBpbgotCi1SRVRVUk5TOgotTGluZWFyIGFkZHJlc3Mgb2YgdGhlIG5ld2x5IG1hcHBlZCBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1NYXBzIGEgcGh5c2ljYWwgbWVtb3J5IHJhbmdlIHRvIGEgbGluZWFyIG1lbW9yeSByYW5nZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX1BNX21hcFBoeXNpY2FsVG9MaW5lYXIoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBsaW1pdCwKLSAgICBpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICB1bG9uZyAgICAgICAgICAgICAgIGxlbmd0aCA9IGxpbWl0KzE7Ci0gICAgUEhZU0lDQUxfQUREUkVTUyAgICBwYUlvQmFzZSA9IHswfTsKLQotICAgIC8qIE5UIGxvdmVzIGxhcmdlIEludHMgKi8KLSAgICBwYUlvQmFzZSA9IFJ0bENvbnZlcnRVbG9uZ1RvTGFyZ2VJbnRlZ2VyKCBiYXNlICk7Ci0KLSAgICAvKiBNYXAgSU8gc3BhY2UgaW50byBLZXJuZWwgKi8KLSAgICBpZiAoaXNDYWNoZWQpCi0JcmV0dXJuIChVTE9ORylNbU1hcElvU3BhY2UocGFJb0Jhc2UsIGxlbmd0aCwgTW1DYWNoZWQgKTsKLSAgICBlbHNlCi0JcmV0dXJuIChVTE9ORylNbU1hcElvU3BhY2UocGFJb0Jhc2UsIGxlbmd0aCwgTW1Ob25DYWNoZWQgKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BZGp1c3QgdGhlIHBhZ2UgdGFibGUgY2FjaGluZyBiaXRzIGRpcmVjdGx5LiBSZXF1aXJlcyByaW5nIDAgYWNjZXNzIGFuZAotb25seSB3b3JrcyB3aXRoIERPUzRHVyBhbmQgY29tcGF0aWJsZSBleHRlbmRlcnMgKENhdXNlV2F5IGFsc28gd29ya3Mgc2luY2UKLWl0IGhhcyBkaXJlY3Qgc3VwcG9ydCBmb3IgdGhlIHJpbmcgMCBpbnN0cnVjdGlvbnMgd2UgbmVlZCBmcm9tIHJpbmcgMykuIFdpbGwKLW5vdCB3b3JrIGluIGEgRE9TIGJveCwgYnV0IHdlIGNhbGwgaW50byB0aGUgcmluZyAwIGhlbHBlciBWeEQgc28gd2Ugc2hvdWxkCi1uZXZlciBnZXQgaGVyZSBpbiBhIERPUyBib3ggYW55d2F5IChhc3N1bWluZyB0aGUgVnhEIGlzIHByZXNlbnQpLiBJZiB3ZQotZG8gZ2V0IGhlcmUgYW5kIHdlIGFyZSBpbiB3aW5kb3dzLCB0aGlzIGNvZGUgd2lsbCBiZSBza2lwcGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9QTV9hZGp1c3RQYWdlVGFibGVzKAotICAgIHVsb25nIGxpbmVhciwKLSAgICB1bG9uZyBsaW1pdCwKLQlpYm9vbCBpc0dsb2JhbCwKLSAgICBpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICBpbnQgICAgIHN0YXJ0UERCLGVuZFBEQixpUERCLHN0YXJ0UGFnZSxlbmRQYWdlLHN0YXJ0LGVuZCxpUGFnZTsKLSAgICB1bG9uZyAgIHBhZ2VUYWJsZSwqcFBEQiwqcFBhZ2VUYWJsZTsKLQl1bG9uZwltYXNrID0gMHhGRkZGRkZGRjsKLQl1bG9uZwliaXRzID0gMHgwMDAwMDAwMDsKLQotCS8qIEVuYWJsZSB1c2VyIGxldmVsIGFjY2VzcyBmb3IgcGFnZSB0YWJsZSBlbnRyeSAqLwotCWlmIChpc0dsb2JhbCkgewotCQltYXNrICY9IH5QQUdFX0ZMQUdTX1VTRVI7Ci0JCWJpdHMgfD0gUEFHRV9GTEFHU19VU0VSOwotCQl9Ci0KLQkvKiBEaXNhYmxlIFBDRCBiaXQgaWYgcGFnZSB0YWJsZSBlbnRyeSBzaG91bGQgYmUgdW5jYWNoZWQgKi8KLQlpZiAoIWlzQ2FjaGVkKSB7Ci0JCW1hc2sgJj0gfihQQUdFX0ZMQUdTX0NBQ0hFX0RJU0FCTEUgfCBQQUdFX0ZMQUdTX1dSSVRFX1RIUk9VR0gpOwotCQliaXRzIHw9IChQQUdFX0ZMQUdTX0NBQ0hFX0RJU0FCTEUgfCBQQUdFX0ZMQUdTX1dSSVRFX1RIUk9VR0gpOwotCQl9Ci0KLSAgICBwUERCID0gKHVsb25nKilfUE1fbWFwUGh5c2ljYWxUb0xpbmVhcihfUE1fZ2V0UERCKCksMHhGRkYsdHJ1ZSk7Ci0gICAgaWYgKHBQREIpIHsKLQlzdGFydFBEQiA9IChsaW5lYXIgPj4gMjIpICYgMHgzRkY7Ci0Jc3RhcnRQYWdlID0gKGxpbmVhciA+PiAxMikgJiAweDNGRjsKLQllbmRQREIgPSAoKGxpbmVhcitsaW1pdCkgPj4gMjIpICYgMHgzRkY7Ci0JZW5kUGFnZSA9ICgobGluZWFyK2xpbWl0KSA+PiAxMikgJiAweDNGRjsKLQlmb3IgKGlQREIgPSBzdGFydFBEQjsgaVBEQiA8PSBlbmRQREI7IGlQREIrKykgewotCSAgICAvKiBTZXQgdGhlIGJpdHMgaW4gdGhlIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IC0gcmVxdWlyZWQgYXMgcGVyICovCi0JICAgIC8qIFBlbnRpdW0gNCBtYW51YWwuIFRoaXMgYWxzbyB0YWtlcyBjYXJlIG9mIHRoZSA0TUIgcGFnZSBlbnRyaWVzICovCi0JICAgIHBQREJbaVBEQl0gPSAocFBEQltpUERCXSAmIG1hc2spIHwgYml0czsKLQkgICAgaWYgKCEocFBEQltpUERCXSAmIFBBR0VfRkxBR1NfNE1CKSkgewotCQkvKiBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIDRLQiBwYWdlcyB0aGVuIHdlIG5lZWQgdG8gaXRlcmF0ZSAqLwotCQkvKiB0aHJvdWdoIGVhY2ggb2YgdGhlIHBhZ2UgdGFibGUgZW50cmllcyAqLwotCQlwYWdlVGFibGUgPSBwUERCW2lQREJdICYgfjB4RkZGOwotCQlwUGFnZVRhYmxlID0gKHVsb25nKilfUE1fbWFwUGh5c2ljYWxUb0xpbmVhcihwYWdlVGFibGUsMHhGRkYsdHJ1ZSk7Ci0JCXN0YXJ0ID0gKGlQREIgPT0gc3RhcnRQREIpID8gc3RhcnRQYWdlIDogMDsKLQkJZW5kID0gKGlQREIgPT0gZW5kUERCKSA/IGVuZFBhZ2UgOiAweDNGRjsKLQkJZm9yIChpUGFnZSA9IHN0YXJ0OyBpUGFnZSA8PSBlbmQ7IGlQYWdlKyspIHsKLQkJICAgIHBQYWdlVGFibGVbaVBhZ2VdID0gKHBQYWdlVGFibGVbaVBhZ2VdICYgbWFzaykgfCBiaXRzOwotCQkgICAgfQotCQlNbVVubWFwSW9TcGFjZShwUGFnZVRhYmxlLDB4RkZGKTsKLQkJfQotCSAgICB9Ci0JTW1Vbm1hcElvU3BhY2UocFBEQiwweEZGRik7Ci0JUE1fZmx1c2hUTEIoKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5LiBGb3IgTlQgd2UgYWxsb2NhdGUgc2hhcmVkIG1lbW9yeQotYXMgbG9ja2VkLCBnbG9iYWwgbWVtb3J5IHRoYXQgaXMgYWNjZXNzaWJsZSBmcm9tIGFueSBtZW1vcnkgY29udGV4dAotKGluY2x1ZGluZyBpbnRlcnJ1cHQgdGltZSBjb250ZXh0KSwgd2hpY2ggYWxsb3dzIHVzIHRvIGxvYWQgb3VyIGltcG9ydGFudAotZGF0YSBzdHJ1Y3R1cmUgYW5kIGNvZGUgc3VjaCB0aGF0IHdlIGNhbiBhY2Nlc3MgaXQgZGlyZWN0bHkgZnJvbSBhIHJpbmcKLTAgaW50ZXJydXB0IGNvbnRleHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hbGxvY1NoYXJlZCgKLSAgICBsb25nIHNpemUpCi17Ci0gICAgaW50ICAgICAgICAgaTsKLQotICAgIC8qIEZpcnN0IGZpbmQgYSBmcmVlIHNsb3QgaW4gb3VyIHNoYXJlZCBtZW1vcnkgdGFibGUgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01FTU9SWV9TSEFSRUQ7IGkrKykgewotCWlmIChzaGFyZWRbaV0ubGluZWFyID09IDApCi0JICAgIGJyZWFrOwotCX0KLSAgICBpZiAoaSA9PSBNQVhfTUVNT1JZX1NIQVJFRCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIEFsbG9jYXRlIHRoZSBwYWdlZCBwb29sICovCi0gICAgc2hhcmVkW2ldLmxpbmVhciA9IEV4QWxsb2NhdGVQb29sKFBhZ2VkUG9vbCwgc2l6ZSk7Ci0KLSAgICAvKiBDcmVhdGUgYSBsaXN0IHRvIG1hbmFnZSB0aGlzIGFsbG9jYXRpb24gKi8KLSAgICBzaGFyZWRbaV0ucE1kbCA9IElvQWxsb2NhdGVNZGwoc2hhcmVkW2ldLmxpbmVhcixzaXplLEZBTFNFLEZBTFNFLChQSVJQKSBOVUxMKTsKLQotICAgIC8qIExvY2sgdGhpcyBhbGxvY2F0aW9uIGluIG1lbW9yeSAqLwotICAgIE1tUHJvYmVBbmRMb2NrUGFnZXMoc2hhcmVkW2ldLnBNZGwsS2VybmVsTW9kZSxJb01vZGlmeUFjY2Vzcyk7Ci0KLSAgICAvKiBNb2RpZnkgYml0cyB0byBncmFudCB1c2VyIGFjY2VzcyAqLwotICAgIF9QTV9hZGp1c3RQYWdlVGFibGVzKCh1bG9uZylzaGFyZWRbaV0ubGluZWFyLCBzaXplLCB0cnVlLCB0cnVlKTsKLSAgICByZXR1cm4gKHZvaWQqKXNoYXJlZFtpXS5saW5lYXI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQoCi0gICAgdm9pZCAqcCkKLXsKLSAgICBpbnQgaTsKLQotICAgIC8qIEZpbmQgYSBzaGFyZWQgbWVtb3J5IGJsb2NrIGluIG91ciB0YWJsZSBhbmQgZnJlZSBpdCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUVNT1JZX1NIQVJFRDsgaSsrKSB7Ci0JaWYgKHNoYXJlZFtpXS5saW5lYXIgPT0gcCkgewotCSAgICAvKiBVbmxvY2sgd2hhdCB3ZSBsb2NrZWQgKi8KLQkgICAgTW1VbmxvY2tQYWdlcyhzaGFyZWRbaV0ucE1kbCk7Ci0KLQkgICAgLyogRnJlZSBvdXIgTURMICovCi0JICAgIElvRnJlZU1kbChzaGFyZWRbaV0ucE1kbCk7Ci0KLQkgICAgLyogRnJlZSBvdXIgbWVtICovCi0JICAgIEV4RnJlZVBvb2woc2hhcmVkW2ldLmxpbmVhcik7Ci0KLQkgICAgLyogRmxhZyB0aGF0IGlzIGVudHJ5IGlzIGF2YWlsYWJsZSAqLwotCSAgICBzaGFyZWRbaV0ubGluZWFyID0gMDsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEgcGh5c2ljYWwgYWRkcmVzcyB0byBhIGxpbmVhciBhZGRyZXNzIGluIHRoZSBjYWxsZXJzIHByb2Nlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIGxpbWl0LAotICAgIGlib29sIGlzQ2FjaGVkKQotewotICAgIHVsb25nICAgbGluZWFyLGxlbmd0aCA9IGxpbWl0KzE7Ci0gICAgaW50ICAgICBpOwotCi0gICAgLyogU2VhcmNoIHRhYmxlIG9mIGV4aXN0aW5nIG1hcHBpbmdzIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgbWFwcGVkICovCi0gICAgLyogYSByZWdpb24gb2YgbWVtb3J5IHRoYXQgd2lsbCBzZXJ2ZSB0aGlzIHB1cnBvc2UuICovCi0gICAgZm9yIChpID0gMDsgaSA8IG51bU1hcHBpbmdzOyBpKyspIHsKLQlpZiAobWFwc1tpXS5waHlzaWNhbCA9PSBiYXNlICYmIG1hcHNbaV0ubGVuZ3RoID09IGxlbmd0aCAmJiBtYXBzW2ldLmlzQ2FjaGVkID09IGlzQ2FjaGVkKSB7Ci0JICAgIF9QTV9hZGp1c3RQYWdlVGFibGVzKCh1bG9uZyltYXBzW2ldLmxpbmVhciwgbWFwc1tpXS5sZW5ndGgsIHRydWUsIGlzQ2FjaGVkKTsKLQkgICAgcmV0dXJuICh2b2lkKiltYXBzW2ldLmxpbmVhcjsKLQkgICAgfQotCX0KLSAgICBpZiAobnVtTWFwcGluZ3MgPT0gTUFYX01FTU9SWV9NQVBQSU5HUykKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIFdlIGRpZCBub3QgZmluZCBhbnkgcHJldmlvdXNseSBtYXBwZWQgbWVtb3J5IHJlZ2lvbiwgc28gbWFwcyBpdCBpbi4gKi8KLSAgICBpZiAoKGxpbmVhciA9IF9QTV9tYXBQaHlzaWNhbFRvTGluZWFyKGJhc2UsbGltaXQsaXNDYWNoZWQpKSA9PSAweEZGRkZGRkZGKQotCXJldHVybiBOVUxMOwotICAgIG1hcHNbbnVtTWFwcGluZ3NdLnBoeXNpY2FsID0gYmFzZTsKLSAgICBtYXBzW251bU1hcHBpbmdzXS5sZW5ndGggPSBsZW5ndGg7Ci0gICAgbWFwc1tudW1NYXBwaW5nc10ubGluZWFyID0gbGluZWFyOwotICAgIG1hcHNbbnVtTWFwcGluZ3NdLmlzQ2FjaGVkID0gaXNDYWNoZWQ7Ci0gICAgbnVtTWFwcGluZ3MrKzsKLQotICAgIC8qIEdyYW50IHVzZXIgYWNjZXNzIHRvIHRoaXMgSS9PIHNwYWNlICovCi0gICAgX1BNX2FkanVzdFBhZ2VUYWJsZXMoKHVsb25nKWxpbmVhciwgbGVuZ3RoLCB0cnVlLCBpc0NhY2hlZCk7Ci0gICAgcmV0dXJuICh2b2lkKilsaW5lYXI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIHBoeXNpY2FsIGFkZHJlc3MgbWFwcGluZyBhbGxvY2F0ZWQgYnkgUE1fbWFwUGh5c2ljYWxBZGRyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcigKLSAgICB2b2lkICpwdHIsCi0gICAgdWxvbmcgbGltaXQpCi17Ci0gICAgLyogV2UgZG9uJ3QgZnJlZSB0aGUgbWVtb3J5IG1hcHBpbmdzIGluIGhlcmUgYmVjYXVzZSB3ZSBjYWNoZSBhbGwgKi8KLSAgICAvKiB0aGUgbWVtb3J5IG1hcHBpbmdzIHdlIGNyZWF0ZSBpbiB0aGUgc3lzdGVtIGZvciBsYXRlciB1c2UuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbGVkIHdoZW4gdGhlIGRldmljZSBkcml2ZXIgdW5sb2FkcyB0byBmcmVlIGFsbCB0aGUgcGFnZSB0YWJsZSBtYXBwaW5ncyEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIF9QTV9mcmVlTWVtb3J5TWFwcGluZ3Modm9pZCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1NYXBwaW5nczsgaSsrKQotCU1tVW5tYXBJb1NwYWNlKCh2b2lkICopbWFwc1tpXS5saW5lYXIsbWFwc1tpXS5sZW5ndGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgbWVtb3J5IGFkZHJlc3MgaW4gY3VycmVudCBwcm9jZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcigKLSAgICB2b2lkICpwKQotewotICAgIFBIWVNJQ0FMX0FERFJFU1MgICAgcGFPdXJBZGRyZXNzOwotCi0gICAgcGFPdXJBZGRyZXNzID0gTW1HZXRQaHlzaWNhbEFkZHJlc3MocCk7Ci0gICAgcmV0dXJuIHBhT3VyQWRkcmVzcy5Mb3dQYXJ0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgbWVtb3J5IGFkZHJlc3MgaW4gY3VycmVudCBwcm9jZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKAotICAgIHZvaWQgKnAsCi0gICAgdWxvbmcgbGVuZ3RoLAotICAgIHVsb25nICpwaHlzQWRkcmVzcykKLXsKLSAgICBpbnQgICAgIGk7Ci0gICAgdWxvbmcgICBsaW5lYXIgPSAodWxvbmcpcCAmIH4weEZGRjsKLQotICAgIGZvciAoaSA9IChsZW5ndGggKyAweEZGRikgPj4gMTI7IGkgPiAwOyBpLS0pIHsKLQlpZiAoKCpwaHlzQWRkcmVzcysrID0gUE1fZ2V0UGh5c2ljYWxBZGRyKCh2b2lkKilsaW5lYXIpKSA9PSAweEZGRkZGRkZGKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JbGluZWFyICs9IDQwOTY7Ci0JfQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlcyBhIGJsb2NrIG9mIGxvY2tlZCBwaHlzaWNhbCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jTG9ja2VkTWVtKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1bG9uZyAqcGh5c0FkZHIsCi0gICAgaWJvb2wgY29udGlndW91cywKLSAgICBpYm9vbCBiZWxvdzE2TSkKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0gICAgUEhZU0lDQUxfQUREUkVTUyAgICBwYU91ckFkZHJlc3M7Ci0KLSAgICAvKiBGaXJzdCBmaW5kIGEgZnJlZSBzbG90IGluIG91ciBzaGFyZWQgbWVtb3J5IHRhYmxlICovCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9NRU1PUllfTE9DS0VEOyBpKyspIHsKLQlpZiAobG9ja2VkW2ldLmxpbmVhciA9PSAwKQotCSAgICBicmVhazsKLQl9Ci0gICAgaWYgKGkgPT0gTUFYX01FTU9SWV9MT0NLRUQpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBIaWdoZXN0QWNjZXB0YWJsZUFkZHJlc3MgLSBTcGVjaWZpZXMgdGhlIGhpZ2hlc3QgdmFsaWQgcGh5c2ljYWwgYWRkcmVzcyAqLwotICAgIC8qIHRoZSBkcml2ZXIgY2FuIHVzZS4gRm9yIGV4YW1wbGUsIGlmIGEgZGV2aWNlIGNhbiBvbmx5IHJlZmVyZW5jZSBwaHlzaWNhbCAqLwotICAgIC8qIG1lbW9yeSBpbiB0aGUgbG93ZXIgMTZNQiwgdGhpcyB2YWx1ZSB3b3VsZCBiZSBzZXQgdG8gMHgwMDAwMDAwMEZGRkZGRi4gKi8KLSAgICBwYU91ckFkZHJlc3MuSGlnaFBhcnQgPSAwOwotICAgIGlmIChiZWxvdzE2TSkKLQlwYU91ckFkZHJlc3MuTG93UGFydCA9IDB4MDBGRkZGRkY7Ci0gICAgZWxzZQotCXBhT3VyQWRkcmVzcy5Mb3dQYXJ0ID0gMHhGRkZGRkZGRjsKLQotICAgIGlmIChjb250aWd1b3VzKSB7Ci0JLyogQWxsb2NhdGUgZnJvbSB0aGUgbm9uLXBhZ2VkIHBvb2wgKHVuZm9ydHVuYXRlbHkgNE1CIHBhZ2VzKSAqLwotCWxvY2tlZFtpXS5saW5lYXIgPSBNbUFsbG9jYXRlQ29udGlndW91c01lbW9yeShzaXplLCBwYU91ckFkZHJlc3MpOwotCWlmICghbG9ja2VkW2ldLmxpbmVhcikKLQkgICAgcmV0dXJuIE5VTEw7Ci0KLQkvKiBGbGFnIG5vIE1ETCAqLwotCWxvY2tlZFtpXS5wTWRsID0gTlVMTDsKLQotCS8qIE1hcCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIG1lbW9yeSBzbyB3ZSBjYW4gbWFuYWdlICovCi0JLyogdGhlIHBhZ2UgdGFibGVzIGluIDRLQiBjaHVua3MgbWFwcGVkIGludG8gdXNlciBzcGFjZS4gKi8KLQotCS8qIFRPRE86IE1hcCB0aGlzIHdpdGggdGhlIHBoeXNpY2FsIGFkZHJlc3MgdG8gdGhlIGxpbmVhciBhZGRyZXNzcyAqLwotCWxvY2tlZFtpXS5tbUlvTWFwcGVkID0gbG9ja2VkW2ldLmxpbmVhcjsKLQotCS8qIE1vZGlmeSBiaXRzIHRvIGdyYW50IHVzZXIgYWNjZXNzLCBmbGFnIG5vdCBjYWNoZWQgKi8KLQlfUE1fYWRqdXN0UGFnZVRhYmxlcygodWxvbmcpbG9ja2VkW2ldLm1tSW9NYXBwZWQsIHNpemUsIHRydWUsIGZhbHNlKTsKLQlyZXR1cm4gKHZvaWQqKWxvY2tlZFtpXS5tbUlvTWFwcGVkOwotCX0KLSAgICBlbHNlIHsKLQkvKiBBbGxvY2F0ZSBmcm9tIHRoZSBwYWdlZCBwb29sICovCi0JbG9ja2VkW2ldLmxpbmVhciA9IEV4QWxsb2NhdGVQb29sKFBhZ2VkUG9vbCwgc2l6ZSk7Ci0JaWYgKCFsb2NrZWRbaV0ubGluZWFyKQotCSAgICByZXR1cm4gTlVMTDsKLQotCS8qIENyZWF0ZSBhIGxpc3QgdG8gbWFuYWdlIHRoaXMgYWxsb2NhdGlvbiAqLwotCWxvY2tlZFtpXS5wTWRsID0gSW9BbGxvY2F0ZU1kbChsb2NrZWRbaV0ubGluZWFyLHNpemUsRkFMU0UsRkFMU0UsKFBJUlApIE5VTEwpOwotCi0JLyogTG9jayB0aGlzIGFsbG9jYXRpb24gaW4gbWVtb3J5ICovCi0JTW1Qcm9iZUFuZExvY2tQYWdlcyhsb2NrZWRbaV0ucE1kbCxLZXJuZWxNb2RlLElvTW9kaWZ5QWNjZXNzKTsKLQotCS8qIE1vZGlmeSBiaXRzIHRvIGdyYW50IHVzZXIgYWNjZXNzLCBmbGFnIG5vdCBjYWNoZWQgKi8KLQlfUE1fYWRqdXN0UGFnZVRhYmxlcygodWxvbmcpbG9ja2VkW2ldLmxpbmVhciwgc2l6ZSwgdHJ1ZSwgZmFsc2UpOwotCXJldHVybiAodm9pZCopbG9ja2VkW2ldLmxpbmVhcjsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZXMgYSBibG9jayBvZiBsb2NrZWQgcGh5c2ljYWwgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSgKLSAgICB2b2lkICpwLAotICAgIHVpbnQgc2l6ZSwKLSAgICBpYm9vbCBjb250aWd1b3VzKQotewotICAgIGludCBpOwotCi0gICAgLyogRmluZCBhIGxvY2tlZCBtZW1vcnkgYmxvY2sgaW4gb3VyIHRhYmxlIGFuZCBmcmVlIGl0ICovCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9NRU1PUllfTE9DS0VEOyBpKyspIHsKLQlpZiAobG9ja2VkW2ldLmxpbmVhciA9PSBwKSB7Ci0JICAgIC8qIEFuIE1kbCBpbmRpY2F0ZXMgdGhhdCB3ZSB1c2VkIHRoZSBwYWdlZCBwb29sLCBhbmQgbG9ja2VkIGl0LCAqLwotCSAgICAvKiBzbyBub3cgd2UgaGF2ZSB0byB1bmxvY2ssIGZyZWUgdGhlIE1ETCwgYW5kIGZyZWUgcGFnZWQgKi8KLQkgICAgaWYgKGxvY2tlZFtpXS5wTWRsKSB7Ci0JCS8qIFVubG9jayB3aGF0IHdlIGxvY2tlZCBhbmQgZnJlZSB0aGUgTWRsICovCi0JCU1tVW5sb2NrUGFnZXMobG9ja2VkW2ldLnBNZGwpOwotCQlJb0ZyZWVNZGwobG9ja2VkW2ldLnBNZGwpOwotCQlFeEZyZWVQb29sKGxvY2tlZFtpXS5saW5lYXIpOwotCQl9Ci0JICAgIGVsc2UgewotCQkvKiBUT0RPOiBGcmVlIHRoZSBtbUlvTWFwIG1hcHBpbmcgZm9yIHRoZSBtZW1vcnkhICovCi0KLQkJLyogRnJlZSBub24tcGFnZWQgcG9vbCAqLwotCQlNbUZyZWVDb250aWd1b3VzTWVtb3J5KGxvY2tlZFtpXS5saW5lYXIpOwotCQl9Ci0KLQkgICAgLyogRmxhZyB0aGF0IGlzIGVudHJ5IGlzIGF2YWlsYWJsZSAqLwotCSAgICBsb2NrZWRbaV0ubGluZWFyID0gMDsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGVzIGEgcGFnZSBhbGlnbmVkIGFuZCBwYWdlIHNpemVkIGJsb2NrIG9mIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1BhZ2UoCi0gICAgaWJvb2wgbG9ja2VkKQotewotICAgIC8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgZnJvbSB0aGUgbm9uLXBhZ2VkIHBvb2wgaWYgd2Ugd2FudCB0aGUgbWVtb3J5ICovCi0gICAgLyogdG8gYmUgbG9ja2VkLiAqLwotICAgIHJldHVybiBFeEFsbG9jYXRlUG9vbCgKLQlsb2NrZWQgPyBOb25QYWdlZFBvb2xDYWNoZUFsaWduZWQgOiBQYWdlZFBvb2xDYWNoZUFsaWduZWQsCi0JUEFHRV9TSVpFKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgcGFnZSBhbGlnbmVkIGFuZCBwYWdlIHNpemVkIGJsb2NrIG9mIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVBhZ2UoCi0gICAgdm9pZCAqcCkKLXsKLSAgICBpZiAocCkgRXhGcmVlUG9vbChwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXMoCi0gICAgdm9pZCAqcCwKLSAgICB1aW50IGxlbiwKLSAgICBQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBNREwgKnBNZGw7Ci0KLSAgICAvKiBDcmVhdGUgYSBsaXN0IHRvIG1hbmFnZSB0aGlzIGFsbG9jYXRpb24gKi8KLSAgICBpZiAoKHBNZGwgPSBJb0FsbG9jYXRlTWRsKHAsbGVuLEZBTFNFLEZBTFNFLChQSVJQKU5VTEwpKSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgIC8qIExvY2sgdGhpcyBhbGxvY2F0aW9uIGluIG1lbW9yeSAqLwotICAgIE1tUHJvYmVBbmRMb2NrUGFnZXMocE1kbCxLZXJuZWxNb2RlLElvTW9kaWZ5QWNjZXNzKTsKLSAgICAqKChQTURMKikoJmxoLT5oKSkgPSBwTWRsOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVVubG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXMoCi0gICAgdm9pZCAqcCwKLSAgICB1aW50IGxlbiwKLSAgICBQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBpZiAocCAmJiBsaCkgewotCS8qIFVubG9jayB3aGF0IHdlIGxvY2tlZCAqLwotCU1ETCAqcE1kbCA9ICooKFBNREwqKSgmbGgtPmgpKTsKLQlNbVVubG9ja1BhZ2VzKHBNZGwpOwotCUlvRnJlZU1kbChwTWRsKTsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKAotICAgIHZvaWQgKCpwKSgpLAotICAgIHVpbnQgbGVuLAotICAgIFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHJldHVybiBQTV9sb2NrRGF0YVBhZ2VzKCh2b2lkKilwLGxlbixsaCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVW5sb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX3VubG9ja0NvZGVQYWdlcygKLSAgICB2b2lkICgqcCkoKSwKLSAgICB1aW50IGxlbiwKLSAgICBQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICByZXR1cm4gUE1fdW5sb2NrRGF0YVBhZ2VzKCh2b2lkKilwLGxlbixsaCk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjViN2JhZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9vc2hkci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgTlQgZHJpdmVycwotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fTlREUlZfT1NIRFJfSAotI2RlZmluZSBfX05URFJWX09TSERSX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCBUeXBlZGVmcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogSW50ZXJuYWwgdW5pY29kZSBzdHJpbmcgaGFuZGxpbmcgZnVuY3Rpb25zICovCi0KLVVOSUNPREVfU1RSSU5HICogICAgX1BNX0NTdHJpbmdUb1VuaWNvZGVTdHJpbmcoY29uc3QgY2hhciAqY3N0cik7Ci12b2lkICAgICAgICAgICAgICAgIF9QTV9GcmVlVW5pY29kZVN0cmluZyhVTklDT0RFX1NUUklORyAqdW5pU3RyKTsKLQotI2VuZGlmICAvKiBfX05URFJWX09TSERSX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3BtLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9wbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjYwNjMxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3BtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgTlQgZGV2aWNlIGRyaXZlcnMuCi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotI2luY2x1ZGUgIm10cnIuaCIKLSNpbmNsdWRlICJvc2hkci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1jaGFyICAgICAgICAgICAgICAgIF9QTV9jbnRQYXRoW1BNX01BWF9QQVRIXSA9ICIiOwotY2hhciAgICAgICAgICAgICAgICBfUE1fbnVjbGV1c1BhdGhbUE1fTUFYX1BBVEhdID0gIiI7Ci1zdGF0aWMgdm9pZCAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7Ci0KLXN0YXRpYyBjaGFyICpzek5UV2luZG93c0tleSAgICAgPSAiXFxSRUdJU1RSWVxcTWFjaGluZVxcU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93cyBOVFxcQ3VycmVudFZlcnNpb24iOwotc3RhdGljIGNoYXIgKnN6TlRTeXN0ZW1Sb290ICAgICA9ICJTeXN0ZW1Sb290IjsKLXN0YXRpYyBjaGFyICpzek1hY2hpbmVOYW1lS2V5ICAgPSAiXFxSRUdJU1RSWVxcTWFjaGluZVxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcQ29tcHV0ZXJOYW1lXFxDb21wdXRlck5hbWUiOwotc3RhdGljIGNoYXIgKnN6TWFjaGluZU5hbWVLZXlOVCA9ICJcXFJFR0lTVFJZXFxNYWNoaW5lXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxDb21wdXRlck5hbWVcXEFjdGl2ZUNvbXB1dGVyTmFtZSI7Ci1zdGF0aWMgY2hhciAqc3pNYWNoaW5lTmFtZSAgICAgID0gIkNvbXB1dGVyTmFtZSI7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgUE0gbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKLXsKLSAgICAvKiBJbml0aWFsaWFzZSB0aGUgTVRSUiBtb2R1bGUgKi8KLSAgICBNVFJSX2luaXQoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gdHlwZSBpZGVudGlmaWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWxvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCi17Ci0gICAgcmV0dXJuIF9PU19XSU5OVERSVjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHJ1bnRpbWUgdHlwZSBpZGVudGlmaWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQotewotICAgIHJldHVybiBQTV8zODY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWRkIGEgZmlsZSBkaXJlY3Rvcnkgc2VwYXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGVuYW1lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKGNoYXIgKnMpCi17Ci0gICAgdWludCBwb3MgPSBzdHJsZW4ocyk7Ci0gICAgaWYgKHNbcG9zLTFdICE9ICdcXCcpIHsKLQlzW3Bvc10gPSAnXFwnOwotCXNbcG9zKzFdID0gJ1wwJzsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWRkIGEgdXNlciBkZWZpbmVkIFBNX2ZhdGFsRXJyb3IgY2xlYW51cCBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAotICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKLXsKLSAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlIGZhdGFsIGVycm9ycyBpbnRlcm5hbGx5IGluIHRoZSBkcml2ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKAotICAgIGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgICBVTE9ORyAgIEJ1Z0NoZWNrQ29kZSA9IDA7Ci0gICAgVUxPTkcgICBNb3JlQnVnQ2hlY2tEYXRhWzRdID0gezB9OwotICAgIGNoYXIgICAgKnA7Ci0gICAgVUxPTkcgICBsZW47Ci0KLSAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCi0JZmF0YWxFcnJvckNsZWFudXAoKTsKLQotI2lmZGVmIERCRwkvKiBTZW5kIG91dHB1dCB0byBkZWJ1Z2dlciwganVzdCByZXR1cm4gc28gYXMgbm90IHRvIGZvcmNlIGEgcmVib290ICovCi0jcHJhZ21hIG1lc3NhZ2UoIklORk86IGJ1aWxkaW5nIGZvciBkZWJ1ZywgUE1fZmF0YWxFcnJvcigpIHJlLXJvdXRlZCIpCi0JREJHTVNHMigiU0RESEVMUD4gUE1fZmF0YWxFcnJvcigpOiBFUlJPUjogJXNcbiIsIG1zZyk7Ci0JcmV0dXJuIDsKLSNlbmRpZgotICAgIC8qIEtlQnVnQ2hlY2tFeCBicmluZ3MgZG93biB0aGUgc3lzdGVtIGluIGEgY29udHJvbGxlZCAqLwotICAgIC8qIG1hbm5lciB3aGVuIHRoZSBjYWxsZXIgZGlzY292ZXJzIGFuIHVucmVjb3ZlcmFibGUgKi8KLSAgICAvKiBpbmNvbnNpc3RlbmN5IHRoYXQgd291bGQgY29ycnVwdCB0aGUgc3lzdGVtIGlmICovCi0gICAgLyogdGhlIGNhbGxlciBjb250aW51ZWQgdG8gcnVuLiAqLwotICAgIC8qICovCi0gICAgLyogaGFjayAtIGR1bXAgdGhlIGZpcnN0IDIwIGNoYXJzIGluIGhleCB1c2luZyB0aGUgdmFyaWFibGVzICovCi0gICAgLyogICAgICBwcm92aWRlZCAtIEVhY2ggVUxPTkcgaXMgZXF1YWwgdG8gZm91ciBjaGFyYWN0ZXJzLi4uICovCi0gICAgZm9yKGxlbiA9IDA7IGxlbiA8IDIwOyBsZW4rKykKLQlpZiAobXNnW2xlbl0gPT0gKGNoYXIpMCkKLQkgICAgYnJlYWs7Ci0KLSAgICAvKiBUaGlzIGxvb2tzIGJhZCBidXQgaXQncyBxdWljayBhbmQgcmVsaWFibGUuLi4gKi8KLSAgICBwID0gKGNoYXIgKikmQnVnQ2hlY2tDb2RlOwotICAgIGlmKGxlbiA+IDApIHBbM10gPSBtc2dbMF07Ci0gICAgaWYobGVuID4gMSkgcFsyXSA9IG1zZ1sxXTsKLSAgICBpZihsZW4gPiAyKSBwWzFdID0gbXNnWzJdOwotICAgIGlmKGxlbiA+IDMpIHBbMF0gPSBtc2dbM107Ci0KLSAgICBwID0gKGNoYXIgKikmTW9yZUJ1Z0NoZWNrRGF0YVswXTsKLSAgICBpZihsZW4gPiA0KSBwWzNdID0gbXNnWzRdOwotICAgIGlmKGxlbiA+IDUpIHBbMl0gPSBtc2dbNV07Ci0gICAgaWYobGVuID4gNikgcFsxXSA9IG1zZ1s2XTsKLSAgICBpZihsZW4gPiA3KSBwWzBdID0gbXNnWzddOwotCi0gICAgcCA9IChjaGFyICopJk1vcmVCdWdDaGVja0RhdGFbMV07Ci0gICAgaWYobGVuID4gOCkgcFszXSA9IG1zZ1s4XTsKLSAgICBpZihsZW4gPiA5KSBwWzJdID0gbXNnWzldOwotICAgIGlmKGxlbiA+IDEwKSBwWzFdID0gbXNnWzEwXTsKLSAgICBpZihsZW4gPiAxMSkgcFswXSA9IG1zZ1sxMV07Ci0KLSAgICBwID0gKGNoYXIgKikmTW9yZUJ1Z0NoZWNrRGF0YVsyXTsKLSAgICBpZihsZW4gPiAxMikgcFszXSA9IG1zZ1sxMl07Ci0gICAgaWYobGVuID4gMTMpIHBbMl0gPSBtc2dbMTNdOwotICAgIGlmKGxlbiA+IDE0KSBwWzFdID0gbXNnWzE0XTsKLSAgICBpZihsZW4gPiAxNSkgcFswXSA9IG1zZ1sxNV07Ci0KLSAgICBwID0gKGNoYXIgKikmTW9yZUJ1Z0NoZWNrRGF0YVszXTsKLSAgICBpZihsZW4gPiAxNikgcFszXSA9IG1zZ1sxNl07Ci0gICAgaWYobGVuID4gMTcpIHBbMl0gPSBtc2dbMTddOwotICAgIGlmKGxlbiA+IDE4KSBwWzFdID0gbXNnWzE4XTsKLSAgICBpZihsZW4gPiAxOSkgcFswXSA9IG1zZ1sxOV07Ci0KLSAgICAvKiBIYWx0IHRoZSBzeXN0ZW0hICovCi0gICAgS2VCdWdDaGVja0V4KEJ1Z0NoZWNrQ29kZSwgTW9yZUJ1Z0NoZWNrRGF0YVswXSwgTW9yZUJ1Z0NoZWNrRGF0YVsxXSwgTW9yZUJ1Z0NoZWNrRGF0YVsyXSwgTW9yZUJ1Z0NoZWNrRGF0YVszXSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gcGF0aCBvciB3b3JraW5nIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyICogUE1BUEkgUE1fZ2V0Q3VycmVudFBhdGgoCi0gICAgY2hhciAqcGF0aCwKLSAgICBpbnQgbWF4TGVuKQotewotICAgIHN0cm5jcHkocGF0aCxfUE1fY250UGF0aCxtYXhMZW4pOwotICAgIHBhdGhbbWF4TGVuLTFdID0gMDsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zektleSAgICAgICAtIEtleSB0byBxdWVyeSAoY2FuIGNvbnRhaW4gdmVyc2lvbiBudW1iZXIgZm9ybWF0dGluZykKLXN6VmFsdWUgICAgIC0gVmFsdWUgdG8gZ2V0IGluZm9ybWF0aW9uIGZvcgotdmFsdWUgICAgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgcmVnaXN0cnkga2V5IGRhdGEgcmVhZAotc2l6ZSAgICAgICAgLSBTaXplIG9mIHRoZSBzdHJpbmcgYnVmZmVyIHRvIHJlYWQgaW50bwotCi1SRVRVUk5TOgotdHJ1ZSBpZiB0aGUga2V5IHdhcyBmb3VuZCwgZmFsc2UgaWYgbm90LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBSRUdfcXVlcnlTdHJpbmcoCi0gICAgY2hhciAqc3pLZXksCi0gICAgY29uc3QgY2hhciAqc3pWYWx1ZSwKLSAgICBjaGFyICp2YWx1ZSwKLSAgICBEV09SRCBzaXplKQotewotICAgIGlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotICAgIE5UU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgcnZhbDsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLSAgICBIQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZTsKLSAgICBPQkpFQ1RfQVRUUklCVVRFUyAgICAgICAgICAgICAgIGtleUF0dHJpYnV0ZXM7Ci0gICAgVU5JQ09ERV9TVFJJTkcgICAgICAgICAgICAgICAgICAqdW5pS2V5ID0gTlVMTDsKLSAgICBVTklDT0RFX1NUUklORyAgICAgICAgICAgICAgICAgICp1bmlWYWx1ZSA9IE5VTEw7Ci0gICAgUEtFWV9WQUxVRV9GVUxMX0lORk9STUFUSU9OCQlmdWxsSW5mbyA9IE5VTEw7Ci0gICAgU1RSSU5HICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdkYXRhOwotICAgIFVOSUNPREVfU1RSSU5HICAgICAgICAgICAgICAgICAgdW5pZGF0YTsKLQotICAgIC8qIENvbnZlcnQgc3RyaW5ncyB0byBVbmlDb2RlICovCi0gICAgc3RhdHVzID0gZmFsc2U7Ci0gICAgaWYgKCh1bmlLZXkgPSBfUE1fQ1N0cmluZ1RvVW5pY29kZVN0cmluZyhzektleSkpID09IE5VTEwpCi0JZ290byBFeGl0OwotICAgIGlmICgodW5pVmFsdWUgPSBfUE1fQ1N0cmluZ1RvVW5pY29kZVN0cmluZyhzelZhbHVlKSkgPT0gTlVMTCkKLQlnb3RvIEV4aXQ7Ci0KLSAgICAvKiBPcGVuIHRoZSBrZXkgKi8KLSAgICBJbml0aWFsaXplT2JqZWN0QXR0cmlidXRlcyggJmtleUF0dHJpYnV0ZXMsCi0JCQkJdW5pS2V5LAotCQkJCU9CSl9DQVNFX0lOU0VOU0lUSVZFLAotCQkJCU5VTEwsCi0JCQkJTlVMTCApOwotICAgIHJ2YWwgPSBad09wZW5LZXkoICZIYW5kbGUsCi0JCSAgICAgIEtFWV9BTExfQUNDRVNTLAotCQkgICAgICAma2V5QXR0cmlidXRlcyApOwotICAgIGlmICghTlRfU1VDQ0VTUyhydmFsKSkKLQlnb3RvIEV4aXQ7Ci0KLSAgICAvKiBRdWVyeSB0aGUgdmFsdWUgKi8KLSAgICBsZW5ndGggPSBzaXplb2YgKEtFWV9WQUxVRV9GVUxMX0lORk9STUFUSU9OKQotCSAgICsgc2l6ZSAqIHNpemVvZihXQ0hBUik7Ci0gICAgaWYgKChmdWxsSW5mbyA9IEV4QWxsb2NhdGVQb29sIChQYWdlZFBvb2wsIGxlbmd0aCkpID09IE5VTEwpCi0JZ290byBFeGl0OwotICAgIFJ0bFplcm9NZW1vcnkoZnVsbEluZm8sIGxlbmd0aCk7Ci0gICAgcnZhbCA9IFp3UXVlcnlWYWx1ZUtleSAoSGFuZGxlLAotCQkJICAgIHVuaVZhbHVlLAotCQkJICAgIEtleVZhbHVlRnVsbEluZm9ybWF0aW9uLAotCQkJICAgIGZ1bGxJbmZvLAotCQkJICAgIGxlbmd0aCwKLQkJCSAgICAmbGVuZ3RoKTsKLSAgICBpZiAoTlRfU1VDQ0VTUyAocnZhbCkpIHsKLQkvKiBDcmVhdGUgdGhlIFVuaUNvZGUgc3RyaW5nIHNvIHdlIGNhbiBjb252ZXJ0IGl0ICovCi0JdW5pZGF0YS5CdWZmZXIgPSAoUFdDSEFSKSgoKFBDSEFSKWZ1bGxJbmZvKSArIGZ1bGxJbmZvLT5EYXRhT2Zmc2V0KTsKLQl1bmlkYXRhLkxlbmd0aCA9IChVU0hPUlQpZnVsbEluZm8tPkRhdGFMZW5ndGg7Ci0JdW5pZGF0YS5NYXhpbXVtTGVuZ3RoID0gKFVTSE9SVClmdWxsSW5mby0+RGF0YUxlbmd0aCArIHNpemVvZihXQ0hBUik7Ci0KLQkvKiBDb252ZXJ0IHVuaWNvZGUgdW5pdmFsdWUgdG8gYW5zaSBzdHJpbmcuICovCi0JcnZhbCA9IFJ0bFVuaWNvZGVTdHJpbmdUb0Fuc2lTdHJpbmcoJnN0cmluZ2RhdGEsICZ1bmlkYXRhLCBUUlVFKTsKLQlpZiAoTlRfU1VDQ0VTUyhydmFsKSkgewotCSAgICBzdHJjcHkodmFsdWUsc3RyaW5nZGF0YS5CdWZmZXIpOwotCSAgICBzdGF0dXMgPSB0cnVlOwotCSAgICB9Ci0JfQotCi1FeGl0OgotICAgIGlmIChmdWxsSW5mbykgRXhGcmVlUG9vbChmdWxsSW5mbyk7Ci0gICAgaWYgKHVuaUtleSkgX1BNX0ZyZWVVbmljb2RlU3RyaW5nKHVuaUtleSk7Ci0gICAgaWYgKHVuaVZhbHVlKSBfUE1fRnJlZVVuaWNvZGVTdHJpbmcodW5pVmFsdWUpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBkcml2ZSBsZXR0ZXIgZm9yIHRoZSBib290IGRyaXZlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCi17Ci0gICAgY2hhciBwYXRoWzI1Nl07Ci0gICAgaWYgKFJFR19xdWVyeVN0cmluZyhzek5UV2luZG93c0tleSxzek5UU3lzdGVtUm9vdCxwYXRoLHNpemVvZihwYXRoKSkpCi0JcmV0dXJuICdjJzsKLSAgICByZXR1cm4gcGF0aFswXTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHBhdGggdG8gdGhlIFZCRS9BRiBkcml2ZXIgZmlsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQotewotICAgIHJldHVybiAiYzpcXCI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07Ci0KLSAgICBpZiAoc3RybGVuKF9QTV9udWNsZXVzUGF0aCkgPiAwKSB7Ci0Jc3RyY3B5KHBhdGgsX1BNX251Y2xldXNQYXRoKTsKLQlQTV9iYWNrc2xhc2gocGF0aCk7Ci0JcmV0dXJuIHBhdGg7Ci0JfQotICAgIGlmICghUkVHX3F1ZXJ5U3RyaW5nKHN6TlRXaW5kb3dzS2V5LHN6TlRTeXN0ZW1Sb290LHBhdGgsc2l6ZW9mKHBhdGgpKSkKLQlzdHJjcHkocGF0aCwiYzpcXHdpbm50Iik7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLCJzeXN0ZW0zMlxcbnVjbGV1cyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgTnVjbGV1cyBjb25maWd1cmF0aW9uIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLSAgICBzdHJjcHkocGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbWFjaGluZSBpZiBwb3NzaWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKLXsKLSAgICByZXR1cm4gUE1fZ2V0TWFjaGluZU5hbWUoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1HZXQgdGhlIG5hbWUgb2YgdGhlIG1hY2hpbmUgb24gdGhlIG5ldHdvcmsuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgbmFtZVsyNTZdOwotCi0gICAgaWYgKFJFR19xdWVyeVN0cmluZyhzek1hY2hpbmVOYW1lS2V5LHN6TWFjaGluZU5hbWUsbmFtZSxzaXplb2YobmFtZSkpKQotCXJldHVybiBuYW1lOwotICAgIGlmIChSRUdfcXVlcnlTdHJpbmcoc3pNYWNoaW5lTmFtZUtleU5ULHN6TWFjaGluZU5hbWUsbmFtZSxzaXplb2YobmFtZSkpKQotCXJldHVybiBuYW1lOwotICAgIHJldHVybiAiVW5rbm93biI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2hlY2sgaWYgYSBrZXkgaGFzIGJlZW4gcHJlc3NlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKLXsKLSAgICAvKiBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzICovCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV2FpdCBmb3IgYW5kIHJldHVybiB0aGUgbmV4dCBrZXlwcmVzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKLXsKLSAgICAvKiBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzICovCi0gICAgcmV0dXJuIDB4RDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PcGVuIGEgY29uc29sZSBmb3Igb3V0cHV0IHRvIHRoZSBzY3JlZW4sIGNyZWF0aW5nIHRoZSBtYWluIGV2ZW50IGhhbmRsaW5nCi13aW5kb3cgaWYgbmVjZXNzYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX0hXTkQgUE1BUEkgUE1fb3BlbkNvbnNvbGUoCi0gICAgUE1fSFdORCBod25kVXNlciwKLSAgICBpbnQgZGV2aWNlLAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzLAotICAgIGludCBicHAsCi0gICAgaWJvb2wgZnVsbFNjcmVlbikKLXsKLSAgICAvKiBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzICovCi0gICAgKHZvaWQpaHduZFVzZXI7Ci0gICAgKHZvaWQpZGV2aWNlOwotICAgICh2b2lkKXhSZXM7Ci0gICAgKHZvaWQpeVJlczsKLSAgICAodm9pZClicHA7Ci0gICAgKHZvaWQpZnVsbFNjcmVlbjsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GaW5kIHRoZSBzaXplIG9mIHRoZSBjb25zb2xlIHN0YXRlIGJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSh2b2lkKQotewotICAgIC8qIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYXZlIHRoZSBzdGF0ZSBvZiB0aGUgY29uc29sZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NhdmVDb25zb2xlU3RhdGUoCi0gICAgdm9pZCAqc3RhdGVCdWYsCi0gICAgUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzICovCi0gICAgKHZvaWQpc3RhdGVCdWY7Ci0gICAgKHZvaWQpaHduZENvbnNvbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSBzdXNwZW5kIGFwcGxpY2F0aW9uIGNhbGxiYWNrIGZvciB0aGUgZnVsbHNjcmVlbiBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKAotICAgIFBNX3NhdmVTdGF0ZV9jYiBzYXZlU3RhdGUpCi17Ci0gICAgLyogTm90IHVzZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKXNhdmVTdGF0ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSBjb25zb2xlIHN0YXRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZSgKLSAgICBjb25zdCB2b2lkICpzdGF0ZUJ1ZiwKLSAgICBQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIC8qIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClzdGF0ZUJ1ZjsKLSAgICAodm9pZClod25kQ29uc29sZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DbG9zZSB0aGUgZnVsbHNjcmVlbiBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fY2xvc2VDb25zb2xlKAotICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgLyogTm90IHVzZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKWh3bmRDb25zb2xlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgbG9jYXRpb24gb2YgdGhlIE9TIGNvbnNvbGUgY3Vyc29yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbigKLSAgICBpbnQgeCwKLSAgICBpbnQgeSkKLXsKLSAgICAvKiBOb3RoaW5nIHRvIGRvIGZvciBXaW5kb3dzICovCi0gICAgKHZvaWQpeDsKLSAgICAodm9pZCl5OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgd2lkdGggb2YgdGhlIE9TIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRPU1NjcmVlbldpZHRoKAotICAgIGludCB3aWR0aCwKLSAgICBpbnQgaGVpZ2h0KQotewotICAgIC8qIE5vdGhpbmcgdG8gZG8gZm9yIFdpbmRvd3MgKi8KLSAgICAodm9pZCl3aWR0aDsKLSAgICAodm9pZCloZWlnaHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwcyBhIHNoYXJlZCBtZW1vcnkgYmxvY2sgaW50byBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UuIERvZXMgbm90aGluZyBzaW5jZQotdGhlIG1lbW9yeSBibG9ja3MgYXJlIGFscmVhZHkgZ2xvYmFsbHkgbWFwcGVkIGludG8gYWxsIHByb2Nlc3Nlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKAotICAgIHZvaWQgKmJhc2UsCi0gICAgdWxvbmcgbGltaXQpCi17Ci0gICAgLyogTm90IHVzZWQgYW55bW9yZSAqLwotICAgICh2b2lkKWJhc2U7Ci0gICAgKHZvaWQpbGltaXQ7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRXhlY3V0ZSB0aGUgUE9TVCBvbiB0aGUgc2Vjb25kYXJ5IEJJT1MgZm9yIGEgY29udHJvbGxlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAotICAgIHVzaG9ydCBheFZhbCwKLSAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCi0gICAgdm9pZCAqbWFwcGVkQklPUywKLSAgICB1bG9uZyBCSU9TTGVuKQotewotICAgIC8qIFRoaXMgbWF5IG5vdCBiZSBwb3NzaWJsZSBpbiBOVCBhbmQgc2hvdWxkIGJlIGRvbmUgYnkgdGhlIE9TIGFueXdheSAqLwotICAgICh2b2lkKWF4VmFsOwotICAgICh2b2lkKUJJT1NQaHlzQWRkcjsKLSAgICAodm9pZCltYXBwZWRCSU9TOwotICAgICh2b2lkKUJJT1NMZW47Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlYWwgbW9kZSBCSU9TIGRhdGEgYXJlYS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsKLSAgICAvKiBOb3RlIHRoYXQgb24gTlQgdGhpcyBwcm9iYWJseSBkb2VzIG5vdCBkbyB3aGF0IHdlIGV4cGVjdCEgKi8KLSAgICByZXR1cm4gUE1fbWFwUGh5c2ljYWxBZGRyKDB4NDAwLCAweDEwMDAsIHRydWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiBhIHBvaW50ZXIgdG8gMHhBMDAwMCBwaHlzaWNhbCBWR0EgZ3JhcGhpY3MgZnJhbWVidWZmZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQotewotICAgIHJldHVybiBQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwweEZGRkYsZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNsZWVwIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zbGVlcCgKLSAgICB1bG9uZyBtaWxsaXNlY29uZHMpCi17Ci0gICAgLyogV2UgbmV2ZXIgdXNlIHRoaXMgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKW1pbGxpc2Vjb25kczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGJhc2UgSS9PIHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgQ09NIHBvcnQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNGODsKLQljYXNlIDE6IHJldHVybiAweDJGODsKLQljYXNlIDI6IHJldHVybiAweDNFODsKLQljYXNlIDM6IHJldHVybiAweDJFODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBiYXNlIEkvTyBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIExQVCBwb3J0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzQkM7Ci0JY2FzZSAxOiByZXR1cm4gMHgzNzg7Ci0JY2FzZSAyOiByZXR1cm4gMHgyNzg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybnMgYXZhaWxhYmxlIG1lbW9yeS4gTm90IHBvc3NpYmxlIHVuZGVyIFdpbmRvd3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkoCi0gICAgdWxvbmcgKnBoeXNpY2FsLAotICAgIHVsb25nICp0b3RhbCkKLXsKLSAgICAqcGh5c2ljYWwgPSAqdG90YWwgPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9TIHNwZWNpZmljIHNoYXJlZCBsaWJyYXJpZXMgbm90IHN1cHBvcnRlZCBpbnNpZGUgYSBWeEQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pETExOYW1lKQotewotICAgIC8qIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClzekRMTE5hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhIFZ4RAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSwKLSAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQotewotICAgIC8qIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZCloTW9kdWxlOwotICAgICh2b2lkKXN6UHJvY05hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhIFZ4RAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZUxpYnJhcnkoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUpCi17Ci0gICAgLyogTm90IHVzZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKWhNb2R1bGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICpQTUFQSSBQTV9maW5kRmlyc3RGaWxlKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzdGFydCBhIGRpcmVjdG9yeSBlbnVtZXJhdGlvbiBzZWFyY2ggKi8KLSAgICAvKiAgICAgICBnaXZlbiB0aGUgZmlsZW5hbWUgKHdpdGggd2lsZGNhcmRzKS4gVGhlIGRhdGEgc2hvdWxkIGJlICovCi0gICAgLyogICAgICAgY29udmVydGVkIGFuZCByZXR1cm5lZCBpbiB0aGUgZmluZERhdGEgc3RhbmRhcmQgZm9ybS4gKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClmaW5kRGF0YTsKLSAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCi0gICAgdm9pZCAqaGFuZGxlLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIHRoZSBuZXh0IGZpbGUgaW4gZGlyZWN0b3J5IGVudW1lcmF0aW9uICovCi0gICAgLyogICAgICAgc2VhcmNoIGdpdmVuIHRoZSBzZWFyY2ggY3JpdGVyaWEgZGVmaW5lZCBpbiB0aGUgY2FsbCB0byAqLwotICAgIC8qICAgICAgIFBNX2ZpbmRGaXJzdEZpbGUuIFRoZSBkYXRhIHNob3VsZCBiZSBjb252ZXJ0ZWQgYW5kIHJldHVybmVkICovCi0gICAgLyogICAgICAgaW4gdGhlIGZpbmREYXRhIHN0YW5kYXJkIGZvcm0uICovCi0gICAgKHZvaWQpaGFuZGxlOwotICAgICh2b2lkKWZpbmREYXRhOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCi0gICAgdm9pZCAqaGFuZGxlKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MuIFRoaXMgbWF5IGRvICovCi0gICAgLyogICAgICAgbm90aGluZyBmb3Igc29tZSBPUydlcy4gKi8KLSAgICAodm9pZCloYW5kbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZHJpdmUgaXMgYSB2YWxpZCBkcml2ZSBvciBub3QuIFVuZGVyIFVuaXggdGhpcwotZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueXRoaW5nIGV4Y2VwdCBhIHZhbHVlIG9mIDMgKGNvbnNpZGVyZWQKLXRoZSByb290IGRyaXZlLCBhbmQgZXF1aXZhbGVudCB0byBDOiBmb3Igbm9uLVVuaXggc3lzdGVtcykuIFRoZSBkcml2ZQotbnVtYmVyaW5nIGlzOgotCi0gICAgMSAgIC0gRHJpdmUgQToKLSAgICAyICAgLSBEcml2ZSBCOgotICAgIDMgICAtIERyaXZlIEM6Ci0gICAgZXRjCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9kcml2ZVZhbGlkKAotICAgIGNoYXIgZHJpdmUpCi17Ci0gICAgLyogTm90IHN1cHBvcnRlZCBpbiBOVCBkcml2ZXJzICovCi0gICAgKHZvaWQpZHJpdmU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmlmZWQgZHJpdmUuCi1VbmRlciBVbml4IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHJlZ2FyZGxlc3MKLW9mIHdoYXQgdGhlIHZhbHVlIG9mICdkcml2ZScgaXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9nZXRkY3dkKAotICAgIGludCBkcml2ZSwKLSAgICBjaGFyICpkaXIsCi0gICAgaW50IGxlbikKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClkcml2ZTsKLSAgICAodm9pZClkaXI7Ci0gICAgKHZvaWQpbGVuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFVFVSTlM6Ci1FcnJvciBjb2RlIGRlc2NyaWJpbmcgdGhlIHJlc3VsdC4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZW5hYmxlV3JpdGVDb21iaW5lKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgc2l6ZSwKLSAgICB1aW50IHR5cGUpCi17Ci0gICAgcmV0dXJuIE1UUlJfZW5hYmxlV3JpdGVDb21iaW5lKGJhc2Usc2l6ZSx0eXBlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgdWludCBhdHRyaWIpCi17Ci0gICAgTlRTVEFUVVMgICAgICAgICAgICAgICAgc3RhdHVzOwotICAgIEFDQ0VTU19NQVNLICAgICAgICAgICAgIERlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFOwotICAgIE9CSkVDVF9BVFRSSUJVVEVTICAgICAgIE9iamVjdEF0dHJpYnV0ZXM7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgU2hhcmVBY2Nlc3MgPSBGSUxFX1NIQVJFX1JFQUQ7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgQ3JlYXRlRGlzcG9zaXRpb24gPSBGSUxFX09QRU47Ci0gICAgSEFORExFICAgICAgICAgICAgICAgICAgRmlsZUhhbmRsZSA9IE5VTEw7Ci0gICAgVU5JQ09ERV9TVFJJTkcgICAgICAgICAgKnVuaUZpbGUgPSBOVUxMOwotICAgIElPX1NUQVRVU19CTE9DSyAgICAgICAgIElvU3RhdHVzQmxvY2s7Ci0gICAgRklMRV9CQVNJQ19JTkZPUk1BVElPTiAgRmlsZUJhc2ljOwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIGtlcm5lbEZpbGVuYW1lW1BNX01BWF9QQVRIKzVdOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIEZpbGVBdHRyaWJ1dGVzID0gMDsKLQotICAgIC8qIENvbnZlcnQgZmlsZSBhdHRyaWJ1dGUgZmxhZ3MgKi8KLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9SRUFET05MWSkKLQlGaWxlQXR0cmlidXRlcyB8PSBGSUxFX0FUVFJJQlVURV9SRUFET05MWTsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9BUkNISVZFKQotCUZpbGVBdHRyaWJ1dGVzIHw9IEZJTEVfQVRUUklCVVRFX0FSQ0hJVkU7Ci0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfSElEREVOKQotCUZpbGVBdHRyaWJ1dGVzIHw9IEZJTEVfQVRUUklCVVRFX0hJRERFTjsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9TWVNURU0pCi0JRmlsZUF0dHJpYnV0ZXMgfD0gRklMRV9BVFRSSUJVVEVfU1lTVEVNOwotCi0gICAgLyogQWRkIHByZWZpeCBmb3IgYWRkcmVzc2luZyB0aGUgZmlsZSBzeXN0ZW0uICJcPz9cIiBpcyBzaG9ydCBmb3IgIlxEb3NEZXZpY2VzXCIgKi8KLSAgICBzdHJjcHkoa2VybmVsRmlsZW5hbWUsICJcXD8/XFwiKTsKLSAgICBzdHJjYXQoa2VybmVsRmlsZW5hbWUsIGZpbGVuYW1lKTsKLQotICAgIC8qIENvbnZlcnQgZmlsZW5hbWUgc3RyaW5nIHRvIGFuc2kgc3RyaW5nICovCi0gICAgaWYgKCh1bmlGaWxlID0gX1BNX0NTdHJpbmdUb1VuaWNvZGVTdHJpbmcoa2VybmVsRmlsZW5hbWUpKSA9PSBOVUxMKQotCWdvdG8gRXhpdDsKLQotICAgIC8qIE11c3Qgb3BlbiBhIGZpbGUgdG8gcXVlcnkgaXQncyBhdHRyaWJ1dGVzICovCi0gICAgSW5pdGlhbGl6ZU9iamVjdEF0dHJpYnV0ZXMgKCZPYmplY3RBdHRyaWJ1dGVzLAotCQkJCXVuaUZpbGUsCi0JCQkJT0JKX0NBU0VfSU5TRU5TSVRJVkUsCi0JCQkJTlVMTCwKLQkJCQlOVUxMICk7Ci0gICAgc3RhdHVzID0gWndDcmVhdGVGaWxlKCAmRmlsZUhhbmRsZSwKLQkJCSAgICBEZXNpcmVkQWNjZXNzIHwgU1lOQ0hST05JWkUsCi0JCQkgICAgJk9iamVjdEF0dHJpYnV0ZXMsCi0JCQkgICAgJklvU3RhdHVzQmxvY2ssCi0JCQkgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKkFsbG9jYXRpb25TaXplICBPUFRJT05BTCwgKi8KLQkJCSAgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwsCi0JCQkgICAgU2hhcmVBY2Nlc3MsCi0JCQkgICAgQ3JlYXRlRGlzcG9zaXRpb24sCi0JCQkgICAgRklMRV9SQU5ET01fQUNDRVNTLCAgICAgICAgLypDcmVhdGVPcHRpb25zLCAqLwotCQkJICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLypFYUJ1ZmZlciAgT1BUSU9OQUwsICovCi0JCQkgICAgMCAgICAgICAgICAgICAgICAgICAgICAvKkVhTGVuZ3RoIChyZXF1aXJlZCBpZiBFYUJ1ZmZlcikgKi8KLQkJCSAgICApOwotICAgIGlmICghTlRfU1VDQ0VTUyAoc3RhdHVzKSkKLQlnb3RvIEV4aXQ7Ci0KLSAgICAvKiBRdWVyeSB0aW1lc3RhbXBzICovCi0gICAgc3RhdHVzID0gWndRdWVyeUluZm9ybWF0aW9uRmlsZShGaWxlSGFuZGxlLAotCQkJCSAgICAmSW9TdGF0dXNCbG9jaywKLQkJCQkgICAgJkZpbGVCYXNpYywKLQkJCQkgICAgc2l6ZW9mKEZJTEVfQkFTSUNfSU5GT1JNQVRJT04pLAotCQkJCSAgICBGaWxlQmFzaWNJbmZvcm1hdGlvbgotCQkJCSAgICApOwotICAgIGlmICghTlRfU1VDQ0VTUyAoc3RhdHVzKSkKLQlnb3RvIEV4aXQ7Ci0KLSAgICAvKiBDaGFuZ2UgdGhlIGZvdXIgYml0cyB3ZSBjaGFuZ2UgKi8KLSAgICBGaWxlQmFzaWMuRmlsZUF0dHJpYnV0ZXMgJj0gfihGSUxFX0FUVFJJQlVURV9SRUFET05MWSB8IEZJTEVfQVRUUklCVVRFX0FSQ0hJVkUKLQkJCQkgIHwgRklMRV9BVFRSSUJVVEVfSElEREVOIHwgRklMRV9BVFRSSUJVVEVfU1lTVEVNKTsKLSAgICBGaWxlQmFzaWMuRmlsZUF0dHJpYnV0ZXMgfD0gRmlsZUF0dHJpYnV0ZXM7Ci0KLSAgICAvKiBTZXQgdGltZXN0YW1wcyAqLwotICAgIFp3U2V0SW5mb3JtYXRpb25GaWxlKCAgIEZpbGVIYW5kbGUsCi0JCQkgICAgJklvU3RhdHVzQmxvY2ssCi0JCQkgICAgJkZpbGVCYXNpYywKLQkJCSAgICBzaXplb2YoRklMRV9CQVNJQ19JTkZPUk1BVElPTiksCi0JCQkgICAgRmlsZUJhc2ljSW5mb3JtYXRpb24KLQkJCSAgICApOwotCi1FeGl0OgotICAgIGlmIChGaWxlSGFuZGxlKSBad0Nsb3NlKEZpbGVIYW5kbGUpOwotICAgIGlmICh1bmlGaWxlKSBfUE1fRnJlZVVuaWNvZGVTdHJpbmcodW5pRmlsZSk7Ci0gICAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludCBQTUFQSSBQTV9nZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBOVFNUQVRVUyAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gICAgQUNDRVNTX01BU0sgICAgICAgICAgICAgRGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEU7Ci0gICAgT0JKRUNUX0FUVFJJQlVURVMgICAgICAgT2JqZWN0QXR0cmlidXRlczsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBTaGFyZUFjY2VzcyA9IEZJTEVfU0hBUkVfUkVBRDsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBDcmVhdGVEaXNwb3NpdGlvbiA9IEZJTEVfT1BFTjsKLSAgICBIQU5ETEUgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlID0gTlVMTDsKLSAgICBVTklDT0RFX1NUUklORyAgICAgICAgICAqdW5pRmlsZSA9IE5VTEw7Ci0gICAgSU9fU1RBVFVTX0JMT0NLICAgICAgICAgSW9TdGF0dXNCbG9jazsKLSAgICBGSUxFX0JBU0lDX0lORk9STUFUSU9OICBGaWxlQmFzaWM7Ci0gICAgY2hhciAgICAgICAgICAgICAgICAgICAga2VybmVsRmlsZW5hbWVbUE1fTUFYX1BBVEgrNV07Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgRmlsZUF0dHJpYnV0ZXMgPSAwOwotICAgIHVpbnQgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IDA7Ci0KLSAgICAvKiBBZGQgcHJlZml4IGZvciBhZGRyZXNzaW5nIHRoZSBmaWxlIHN5c3RlbS4gIlw/P1wiIGlzIHNob3J0IGZvciAiXERvc0RldmljZXNcIiAqLwotICAgIHN0cmNweShrZXJuZWxGaWxlbmFtZSwgIlxcPz9cXCIpOwotICAgIHN0cmNhdChrZXJuZWxGaWxlbmFtZSwgZmlsZW5hbWUpOwotCi0gICAgLyogQ29udmVydCBmaWxlbmFtZSBzdHJpbmcgdG8gYW5zaSBzdHJpbmcgKi8KLSAgICBpZiAoKHVuaUZpbGUgPSBfUE1fQ1N0cmluZ1RvVW5pY29kZVN0cmluZyhrZXJuZWxGaWxlbmFtZSkpID09IE5VTEwpCi0JZ290byBFeGl0OwotCi0gICAgLyogTXVzdCBvcGVuIGEgZmlsZSB0byBxdWVyeSBpdCdzIGF0dHJpYnV0ZXMgKi8KLSAgICBJbml0aWFsaXplT2JqZWN0QXR0cmlidXRlcyAoJk9iamVjdEF0dHJpYnV0ZXMsCi0JCQkJdW5pRmlsZSwKLQkJCQlPQkpfQ0FTRV9JTlNFTlNJVElWRSwKLQkJCQlOVUxMLAotCQkJCU5VTEwgKTsKLSAgICBzdGF0dXMgPSBad0NyZWF0ZUZpbGUoICZGaWxlSGFuZGxlLAotCQkJICAgRGVzaXJlZEFjY2VzcyB8IFNZTkNIUk9OSVpFLAotCQkJICAgJk9iamVjdEF0dHJpYnV0ZXMsCi0JCQkgICAmSW9TdGF0dXNCbG9jaywKLQkJCSAgIE5VTEwsICAgICAgICAgICAgICAgICAgLypBbGxvY2F0aW9uU2l6ZSAgT1BUSU9OQUwsICovCi0JCQkgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwsCi0JCQkgICBTaGFyZUFjY2VzcywKLQkJCSAgIENyZWF0ZURpc3Bvc2l0aW9uLAotCQkJICAgRklMRV9SQU5ET01fQUNDRVNTLCAgICAgICAgLypDcmVhdGVPcHRpb25zLCAqLwotCQkJICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKkVhQnVmZmVyICBPUFRJT05BTCwgKi8KLQkJCSAgIDAgICAgICAgICAgICAgICAgICAgICAgLypFYUxlbmd0aCAocmVxdWlyZWQgaWYgRWFCdWZmZXIpICovCi0JCQkgICApOwotICAgIGlmICghTlRfU1VDQ0VTUyAoc3RhdHVzKSkKLQlnb3RvIEV4aXQ7Ci0KLSAgICAvKiBRdWVyeSB0aW1lc3RhbXBzICovCi0gICAgc3RhdHVzID0gWndRdWVyeUluZm9ybWF0aW9uRmlsZShGaWxlSGFuZGxlLAotCQkJCSAgICAmSW9TdGF0dXNCbG9jaywKLQkJCQkgICAgJkZpbGVCYXNpYywKLQkJCQkgICAgc2l6ZW9mKEZJTEVfQkFTSUNfSU5GT1JNQVRJT04pLAotCQkJCSAgICBGaWxlQmFzaWNJbmZvcm1hdGlvbgotCQkJCSAgICApOwotICAgIGlmICghTlRfU1VDQ0VTUyAoc3RhdHVzKSkKLQlnb3RvIEV4aXQ7Ci0KLSAgICAvKiBUcmFuc2xhdGUgdGhlIGZpbGUgYXR0cmlidXRlcyAqLwotICAgIGlmIChGaWxlQmFzaWMuRmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkKLQlyZXR2YWwgfD0gUE1fRklMRV9SRUFET05MWTsKLSAgICBpZiAoRmlsZUJhc2ljLkZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfQVJDSElWRSkKLQlyZXR2YWwgfD0gUE1fRklMRV9BUkNISVZFOwotICAgIGlmIChGaWxlQmFzaWMuRmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ISURERU4pCi0JcmV0dmFsIHw9IFBNX0ZJTEVfSElEREVOOwotICAgIGlmIChGaWxlQmFzaWMuRmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9TWVNURU0pCi0JcmV0dmFsIHw9IFBNX0ZJTEVfU1lTVEVNOwotCi1FeGl0OgotICAgIGlmIChGaWxlSGFuZGxlKSBad0Nsb3NlKEZpbGVIYW5kbGUpOwotICAgIGlmICh1bmlGaWxlKSBfUE1fRnJlZVVuaWNvZGVTdHJpbmcodW5pRmlsZSk7Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fbWtkaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgLyogTm90IHN1cHBvcnRlZCBpbiBOVCBkcml2ZXJzICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ybWRpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9nZXRGaWxlVGltZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBpYm9vbCBnbVRpbWUsCi0gICAgUE1fdGltZSAqdGltZSkKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClnbVRpbWU7Ci0gICAgKHZvaWQpdGltZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gc2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9zZXRGaWxlVGltZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBpYm9vbCBnbVRpbWUsCi0gICAgUE1fdGltZSAqdGltZSkKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClnbVRpbWU7Ci0gICAgKHZvaWQpdGltZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9zdGRpby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvc3RkaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU4ZjFjOC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9zdGRpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIE5UIGRyaXZlcgotKgotKiBEZXNjcmlwdGlvbjogIEMgbGlicmFyeSBjb21wYXRpYmxlIEkvTyBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoaW4gYSBXaW5kb3dzCi0qICAgICAgICAgICAgICAgTlQgZHJpdmVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAib3NoZHIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFpbiBDb2RlIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1OVCBkcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmb3BlbiBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1GSUxFICogZm9wZW4oCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgY29uc3QgY2hhciAqbW9kZSkKLXsKLSAgICBBQ0NFU1NfTUFTSyAgICAgICAgICAgICAgICAgRGVzaXJlZEFjY2VzczsgICAgICAvKiBmb3IgWndDcmVhdGVGaWxlLi4uICovCi0gICAgT0JKRUNUX0FUVFJJQlVURVMgICAgICAgICAgIE9iamVjdEF0dHJpYnV0ZXM7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgIFNoYXJlQWNjZXNzOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVEaXNwb3NpdGlvbjsKLSAgICBOVFNUQVRVUyAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlOwotICAgIFVOSUNPREVfU1RSSU5HICAgICAgICAgICAgICAqdW5pRmlsZSA9IE5VTEw7Ci0gICAgUFdDSEFSICAgICAgICAgICAgICAgICAgICAgIGJ1ZkZpbGUgPSBOVUxMOwotICAgIElPX1NUQVRVU19CTE9DSyAgICAgICAgICAgICBJb1N0YXR1c0Jsb2NrOwotICAgIEZJTEVfU1RBTkRBUkRfSU5GT1JNQVRJT04gICBGaWxlSW5mb3JtYXRpb247Ci0gICAgRklMRV9QT1NJVElPTl9JTkZPUk1BVElPTiAgIEZpbGVQb3NpdGlvbjsKLSAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsRmlsZW5hbWVbUE1fTUFYX1BBVEgrNV07Ci0gICAgRklMRSAgICAgICAgICAgICAgICAgICAgICAgICpmOwotCi0gICAgLyogQWRkIHByZWZpeCBmb3IgYWRkcmVzc2luZyB0aGUgZmlsZSBzeXN0ZW0uICJcPz9cIiBpcyBzaG9ydCBmb3IgIlxEb3NEZXZpY2VzXCIgKi8KLSAgICBzdHJjcHkoa2VybmVsRmlsZW5hbWUsICJcXD8/XFwiKTsKLSAgICBzdHJjYXQoa2VybmVsRmlsZW5hbWUsIGZpbGVuYW1lKTsKLSAgICBpZiAoKGYgPSBQTV9tYWxsb2Moc2l6ZW9mKEZJTEUpKSkgPT0gTlVMTCkKLQlnb3RvIEVycm9yOwotICAgIGYtPm9mZnNldCA9IDA7Ci0gICAgZi0+dGV4dCA9IChtb2RlWzFdID09ICd0JyB8fCBtb2RlWzJdID09ICd0Jyk7Ci0gICAgZi0+d3JpdGVtb2RlID0gKG1vZGVbMF0gPT0gJ3cnKSB8fCAobW9kZVswXSA9PSAnYScpOwotICAgIGlmIChtb2RlWzBdID09ICdyJykgewotCS8qIG9tb2RlID0gT1BFTl9BQ0NFU1NfUkVBRE9OTFkgfCBPUEVOX1NIQVJFX0NPTVBBVElCTEU7ICovCi0JLyogYWN0aW9uID0gQUNUSU9OX0lGRVhJU1RTX09QRU4gfCBBQ1RJT05fSUZOT1RFWElTVFNfRkFJTDsgKi8KLQlEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19SRUFEOwotCVNoYXJlQWNjZXNzID0gRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURTsKLQlDcmVhdGVEaXNwb3NpdGlvbiA9IEZJTEVfT1BFTjsKLQl9Ci0gICAgZWxzZSBpZiAobW9kZVswXSA9PSAndycpIHsKLQkvKiBvbW9kZSA9IE9QRU5fQUNDRVNTX1dSSVRFT05MWSB8IE9QRU5fU0hBUkVfQ09NUEFUSUJMRTsgKi8KLQkvKiBhY3Rpb24gPSBBQ1RJT05fSUZFWElTVFNfVFJVTkNBVEUgfCBBQ1RJT05fSUZOT1RFWElTVFNfQ1JFQVRFOyAqLwotCURlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1dSSVRFOwotCVNoYXJlQWNjZXNzID0gRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURTsKLQlDcmVhdGVEaXNwb3NpdGlvbiA9IEZJTEVfU1VQRVJTRURFOwotCX0KLSAgICBlbHNlIHsKLQkvKiBvbW9kZSA9IE9QRU5fQUNDRVNTX1JFQURXUklURSB8IE9QRU5fU0hBUkVfQ09NUEFUSUJMRTsgKi8KLQkvKiBhY3Rpb24gPSBBQ1RJT05fSUZFWElTVFNfT1BFTiB8IEFDVElPTl9JRk5PVEVYSVNUU19DUkVBVEU7ICovCi0JRGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEU7Ci0JU2hhcmVBY2Nlc3MgPSBGSUxFX1NIQVJFX1JFQUQ7Ci0JQ3JlYXRlRGlzcG9zaXRpb24gPSBGSUxFX09QRU5fSUY7Ci0JfQotCi0gICAgLyogQ29udmVydCBmaWxlbmFtZSBzdHJpbmcgdG8gYW5zaSBzdHJpbmcgYW5kIHRoZW4gdG8gVW5pQ29kZSBzdHJpbmcgKi8KLSAgICBpZiAoKHVuaUZpbGUgPSBfUE1fQ1N0cmluZ1RvVW5pY29kZVN0cmluZyhrZXJuZWxGaWxlbmFtZSkpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBDcmVhdGUgdGhlIGZpbGUgKi8KLSAgICBJbml0aWFsaXplT2JqZWN0QXR0cmlidXRlcyAoJk9iamVjdEF0dHJpYnV0ZXMsCi0JCQkJdW5pRmlsZSwKLQkJCQlPQkpfQ0FTRV9JTlNFTlNJVElWRSwKLQkJCQlOVUxMLAotCQkJCU5VTEwpOwotICAgIHN0YXR1cyA9IFp3Q3JlYXRlRmlsZSggJkZpbGVIYW5kbGUsCi0JCQkgICAgRGVzaXJlZEFjY2VzcyB8IFNZTkNIUk9OSVpFLAotCQkJICAgICZPYmplY3RBdHRyaWJ1dGVzLAotCQkJICAgICZJb1N0YXR1c0Jsb2NrLAotCQkJICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRpb25TaXplICBPUFRJT05BTCwgKi8KLQkJCSAgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwsCi0JCQkgICAgU2hhcmVBY2Nlc3MsCi0JCQkgICAgQ3JlYXRlRGlzcG9zaXRpb24sCi0JCQkgICAgRklMRV9SQU5ET01fQUNDRVNTLCAgICAgLyogQ3JlYXRlT3B0aW9ucywgKi8KLQkJCSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvKiBFYUJ1ZmZlciAgT1BUSU9OQUwsICovCi0JCQkgICAgMCAgICAgICAgICAgICAgICAgICAgICAgLyogRWFMZW5ndGggKHJlcXVpcmVkIGlmIEVhQnVmZmVyKSAqLwotCQkJICAgICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQotCWdvdG8gRXJyb3I7Ci0gICAgZi0+aGFuZGxlID0gKGludClGaWxlSGFuZGxlOwotCi0gICAgLyogRGV0ZXJtaW5lIHNpemUgb2YgdGhlIGZpbGUgKi8KLSAgICBzdGF0dXMgPSBad1F1ZXJ5SW5mb3JtYXRpb25GaWxlKCAgRmlsZUhhbmRsZSwKLQkJCQkgICAgICAmSW9TdGF0dXNCbG9jaywKLQkJCQkgICAgICAmRmlsZUluZm9ybWF0aW9uLAotCQkJCSAgICAgIHNpemVvZihGSUxFX1NUQU5EQVJEX0lORk9STUFUSU9OKSwKLQkJCQkgICAgICBGaWxlU3RhbmRhcmRJbmZvcm1hdGlvbgotCQkJCSAgICAgICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQotCWdvdG8gRXJyb3I7Ci0gICAgZi0+ZmlsZXNpemUgPSBGaWxlSW5mb3JtYXRpb24uRW5kT2ZGaWxlLkxvd1BhcnQ7Ci0KLSAgICAvKiBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgaWYgd2UgYXJlIGFwcGVuZGluZyAqLwotICAgIGlmIChtb2RlWzBdID09ICdhJykgewotCUZpbGVQb3NpdGlvbi5DdXJyZW50Qnl0ZU9mZnNldC5IaWdoUGFydCA9IDA7Ci0JRmlsZVBvc2l0aW9uLkN1cnJlbnRCeXRlT2Zmc2V0Lkxvd1BhcnQgPSBmLT5maWxlc2l6ZTsKLQlzdGF0dXMgPSBad1NldEluZm9ybWF0aW9uRmlsZSggIEZpbGVIYW5kbGUsCi0JCQkJCSZJb1N0YXR1c0Jsb2NrLAotCQkJCQkmRmlsZVBvc2l0aW9uLAotCQkJCQlzaXplb2YoRklMRV9QT1NJVElPTl9JTkZPUk1BVElPTiksCi0JCQkJCUZpbGVQb3NpdGlvbkluZm9ybWF0aW9uCi0JCQkJCSk7Ci0JaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQotCSAgICBnb3RvIEVycm9yOwotCX0KLSAgICByZXR1cm4gZjsKLQotRXJyb3I6Ci0gICAgaWYgKGYpIFBNX2ZyZWUoZik7Ci0gICAgaWYgKHVuaUZpbGUpIF9QTV9GcmVlVW5pY29kZVN0cmluZyh1bmlGaWxlKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1OVCBkcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmcmVhZCBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zaXplX3QgZnJlYWQoCi0gICAgdm9pZCAqcHRyLAotICAgIHNpemVfdCBzaXplLAotICAgIHNpemVfdCBuLAotICAgIEZJTEUgKmYpCi17Ci0gICAgTlRTVEFUVVMgICAgICAgIHN0YXR1czsKLSAgICBJT19TVEFUVVNfQkxPQ0sgSW9TdGF0dXNCbG9jazsKLSAgICBMQVJHRV9JTlRFR0VSICAgQnl0ZU9mZnNldDsKLQotICAgIC8qIFJlYWQgYW55IGV4dHJhIGJ5dGVzIGZyb20gdGhlIGZpbGUgKi8KLSAgICBCeXRlT2Zmc2V0LkhpZ2hQYXJ0ID0gMDsKLSAgICBCeXRlT2Zmc2V0Lkxvd1BhcnQgPSBmLT5vZmZzZXQ7Ci0gICAgc3RhdHVzID0gWndSZWFkRmlsZSggKEhBTkRMRSlmLT5oYW5kbGUsCi0JCQkgTlVMTCwgICAgICAgICAgICAgIC8qSU4gSEFORExFICBFdmVudCAgT1BUSU9OQUwsICovCi0JCQkgTlVMTCwgICAgICAgICAgICAgIC8qICBJTiBQSU9fQVBDX1JPVVRJTkUgIEFwY1JvdXRpbmUgIE9QVElPTkFMLCAqLwotCQkJIE5VTEwsICAgICAgICAgICAgICAvKiAgSU4gUFZPSUQgIEFwY0NvbnRleHQgIE9QVElPTkFMLCAqLwotCQkJICZJb1N0YXR1c0Jsb2NrLAotCQkJIHB0ciwgICAgICAgICAgICAgICAvKiAgT1VUIFBWT0lEICBCdWZmZXIsICovCi0JCQkgc2l6ZSAqIG4sICAgICAgICAgIC8qSU4gVUxPTkcgIExlbmd0aCwgKi8KLQkJCSAmQnl0ZU9mZnNldCwgICAgICAgLypPUFRJT05BTCwgKi8KLQkJCSBOVUxMICAgICAgICAgICAgICAgLypJTiBQVUxPTkcgIEtleSAgT1BUSU9OQUwgKi8KLQkJCSApOwotICAgIGlmICghTlRfU1VDQ0VTUyAoc3RhdHVzKSkKLQlyZXR1cm4gMDsKLSAgICBmLT5vZmZzZXQgKz0gSW9TdGF0dXNCbG9jay5JbmZvcm1hdGlvbjsKLSAgICByZXR1cm4gSW9TdGF0dXNCbG9jay5JbmZvcm1hdGlvbiAvIHNpemU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTlQgZHJpdmVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZndyaXRlIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXNpemVfdCBmd3JpdGUoCi0gICAgY29uc3Qgdm9pZCAqcHRyLAotICAgIHNpemVfdCBzaXplLAotICAgIHNpemVfdCBuLAotICAgIEZJTEUgKmYpCi17Ci0gICAgTlRTVEFUVVMgICAgICAgIHN0YXR1czsKLSAgICBJT19TVEFUVVNfQkxPQ0sgSW9TdGF0dXNCbG9jazsKLSAgICBMQVJHRV9JTlRFR0VSICAgQnl0ZU9mZnNldDsKLQotICAgIGlmICghZi0+d3JpdGVtb2RlKQotCXJldHVybiAwOwotICAgIEJ5dGVPZmZzZXQuSGlnaFBhcnQgPSAwOwotICAgIEJ5dGVPZmZzZXQuTG93UGFydCA9IGYtPm9mZnNldDsKLSAgICBzdGF0dXMgPSBad1dyaXRlRmlsZSggKEhBTkRMRSlmLT5oYW5kbGUsCi0JCQkgIE5VTEwsICAgICAgICAgICAgIC8qSU4gSEFORExFICBFdmVudCAgT1BUSU9OQUwsICovCi0JCQkgIE5VTEwsICAgICAgICAgICAgIC8qICBJTiBQSU9fQVBDX1JPVVRJTkUgIEFwY1JvdXRpbmUgIE9QVElPTkFMLCAqLwotCQkJICBOVUxMLCAgICAgICAgICAgICAvKiAgSU4gUFZPSUQgIEFwY0NvbnRleHQgIE9QVElPTkFMLCAqLwotCQkJICAmSW9TdGF0dXNCbG9jaywKLQkJCSAgKHZvaWQqKXB0ciwgICAgICAgLyogIE9VVCBQVk9JRCAgQnVmZmVyLCAqLwotCQkJICBzaXplICogbiwgICAgICAgICAvKklOIFVMT05HICBMZW5ndGgsICovCi0JCQkgICZCeXRlT2Zmc2V0LCAgICAgIC8qT1BUSU9OQUwsICovCi0JCQkgIE5VTEwgICAgICAgICAgICAgIC8qSU4gUFVMT05HICBLZXkgIE9QVElPTkFMICovCi0JCQkgICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQotCXJldHVybiAwOwotICAgIGYtPm9mZnNldCArPSBJb1N0YXR1c0Jsb2NrLkluZm9ybWF0aW9uOwotICAgIGlmIChmLT5vZmZzZXQgPiBmLT5maWxlc2l6ZSkKLQlmLT5maWxlc2l6ZSA9IGYtPm9mZnNldDsKLSAgICByZXR1cm4gSW9TdGF0dXNCbG9jay5JbmZvcm1hdGlvbiAvIHNpemU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTlQgZHJpdmVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmZsdXNoIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmZmx1c2goCi0gICAgRklMRSAqZikKLXsKLSAgICAvKiBOb3RoaW5nIHRvIGRvIGhlcmUgYXMgd2UgYXJlIG5vdCBkb2luZyBidWZmZXJlZCBJL08gKi8KLSAgICAodm9pZClmOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZzZWVrIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmc2VlaygKLSAgICBGSUxFICpmLAotICAgIGxvbmcgaW50IG9mZnNldCwKLSAgICBpbnQgd2hlbmNlKQotewotICAgIE5UU1RBVFVTICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gICAgRklMRV9QT1NJVElPTl9JTkZPUk1BVElPTiAgIEZpbGVQb3NpdGlvbjsKLSAgICBJT19TVEFUVVNfQkxPQ0sgICAgICAgICAgICAgSW9TdGF0dXNCbG9jazsKLQotICAgIGlmICh3aGVuY2UgPT0gMCkKLQlmLT5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgZWxzZSBpZiAod2hlbmNlID09IDEpCi0JZi0+b2Zmc2V0ICs9IG9mZnNldDsKLSAgICBlbHNlIGlmICh3aGVuY2UgPT0gMikKLQlmLT5vZmZzZXQgPSBmLT5maWxlc2l6ZSArIG9mZnNldDsKLSAgICBGaWxlUG9zaXRpb24uQ3VycmVudEJ5dGVPZmZzZXQuSGlnaFBhcnQgPSAwOwotICAgIEZpbGVQb3NpdGlvbi5DdXJyZW50Qnl0ZU9mZnNldC5Mb3dQYXJ0ID0gZi0+b2Zmc2V0OwotICAgIHN0YXR1cyA9IFp3U2V0SW5mb3JtYXRpb25GaWxlKCAoSEFORExFKWYtPmhhbmRsZSwKLQkJCQkgICAmSW9TdGF0dXNCbG9jaywKLQkJCQkgICAmRmlsZVBvc2l0aW9uLAotCQkJCSAgIHNpemVvZihGSUxFX1BPU0lUSU9OX0lORk9STUFUSU9OKSwKLQkJCQkgICBGaWxlUG9zaXRpb25JbmZvcm1hdGlvbgotCQkJCSAgICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1OVCBkcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmdGVsbCBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1sb25nIGZ0ZWxsKAotICAgIEZJTEUgKmYpCi17Ci0gICAgcmV0dXJuIGYtPm9mZnNldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1OVCBkcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmZW9mIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmZW9mKAotICAgIEZJTEUgKmYpCi17Ci0gICAgcmV0dXJuIChmLT5vZmZzZXQgPT0gZi0+ZmlsZXNpemUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZnZXRzIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIgKmZnZXRzKAotICAgIGNoYXIgKnMsCi0gICAgaW50IG4sCi0gICAgRklMRSAqZikKLXsKLSAgICBpbnQgICAgIGxlbjsKLSAgICBjaGFyICAgICpjczsKLQotICAgIC8qIFJlYWQgdGhlIGVudGlyZSBidWZmZXIgaW50byBtZW1vcnkgKG91ciBmdW5jdGlvbnMgYXJlIHVuYnVmZmVyZWQhKSAqLwotICAgIGlmICgobGVuID0gZnJlYWQocywxLG4sZikpID09IDApCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBTZWFyY2ggZm9yICdcbicgb3IgZW5kIG9mIHN0cmluZyAqLwotICAgIGlmIChuID4gbGVuKQotCW4gPSBsZW47Ci0gICAgY3MgPSBzOwotICAgIHdoaWxlICgtLW4gPiAwKSB7Ci0JaWYgKCpjcyA9PSAnXG4nKQotCSAgICBicmVhazsKLQljcysrOwotCX0KLSAgICAqY3MgPSAnXDAnOwotICAgIHJldHVybiBzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZwdXRzIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmcHV0cygKLSAgICBjb25zdCBjaGFyICpzLAotICAgIEZJTEUgKmYpCi17Ci0gICAgcmV0dXJuIGZ3cml0ZShzLDEsc3RybGVuKHMpLGYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZjbG9zZSBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZmNsb3NlKAotICAgIEZJTEUgKmYpCi17Ci0gICAgWndDbG9zZSgoSEFORExFKWYtPmhhbmRsZSk7Ci0gICAgUE1fZnJlZShmKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3N0ZGxpYi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvc3RkbGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZjBjYmYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvc3RkbGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgTlQgZHJpdmVyCi0qCi0qIERlc2NyaXB0aW9uOiAgQyBsaWJyYXJ5IGNvbXBhdGlibGUgc3RkbGliLmggZnVuY3Rpb25zIGZvciB1c2Ugd2l0aGluIGEKLSogICAgICAgICAgICAgICBXaW5kb3dzIE5UIGRyaXZlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgIm9zaGRyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1haW4gQ29kZSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUE1fbWFsbG9jIG92ZXJyaWRlIGZ1bmN0aW9uIGZvciBOdWNsZXVzIGRyaXZlcnMgbG9hZGVkIGluIE5UIGRyaXZlcnMncy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogbWFsbG9jKAotICAgIHNpemVfdCBzaXplKQotewotICAgIHJldHVybiBQTV9tYWxsb2NTaGFyZWQoc2l6ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotY2FsbG9jIGxpYnJhcnkgZnVuY3Rpb24gZm9yIE51Y2xldXMgZHJpdmVycyBsb2FkZWQgaW4gTlQgZHJpdmVycydzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBjYWxsb2MoCi0gICAgc2l6ZV90IG5lbGVtLAotICAgIHNpemVfdCBzaXplKQotewotICAgIHZvaWQgKnAgPSBQTV9tYWxsb2NTaGFyZWQobmVsZW0gKiBzaXplKTsKLSAgICBpZiAocCkKLQltZW1zZXQocCwwLG5lbGVtICogc2l6ZSk7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUE1fcmVhbGxvYyBvdmVycmlkZSBmdW5jdGlvbiBmb3IgTnVjbGV1cyBkcml2ZXJzIGxvYWRlZCBpbiBWeEQncy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogcmVhbGxvYygKLSAgICB2b2lkICpwdHIsCi0gICAgc2l6ZV90IHNpemUpCi17Ci0gICAgdm9pZCAqcCA9IFBNX21hbGxvY1NoYXJlZChzaXplKTsKLSAgICBpZiAocCkgewotCW1lbWNweShwLHB0cixzaXplKTsKLQlQTV9mcmVlU2hhcmVkKHB0cik7Ci0JfQotICAgIHJldHVybiBwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVBNX2ZyZWUgb3ZlcnJpZGUgZnVuY3Rpb24gZm9yIE51Y2xldXMgZHJpdmVycyBsb2FkZWQgaW4gVnhEJ3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBmcmVlKAotICAgIHZvaWQgKnApCi17Ci0gICAgUE1fZnJlZVNoYXJlZChwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1jc3RyICAgIC0gQyBzdHlsZSBBTlNJIHN0cmluZyB0byBjb252ZXJ0Ci0KLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBVbmlDb2RlIHN0cmluZyBzdHJ1Y3R1cmUgb3IgTlVMTCBvbiBmYWlsdXJlIHRvIGFsbG9jYXRlIG1lbW9yeQotCi1SRU1BUktTOgotQ29udmVydHMgYSBDIHN0eWxlIHN0cmluZyB0byBhIFVuaUNvZGUgc3RyaW5nIHN0cnVjdHVyZSB0aGF0IGNhbiBiZSBwYXNzZWQKLWRpcmVjdGx5IHRvIE5UIGtlcm5lbCBmdW5jdGlvbnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVU5JQ09ERV9TVFJJTkcgKl9QTV9DU3RyaW5nVG9Vbmljb2RlU3RyaW5nKAotICAgIGNvbnN0IGNoYXIgKmNzdHIpCi17Ci0gICAgaW50ICAgICAgICAgICAgIGxlbmd0aDsKLSAgICBBTlNJX1NUUklORyAgICAgYW5zaVN0cjsKLSAgICBVTklDT0RFX1NUUklORyAgKnVuaVN0cjsKLQotICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHN0cmluZyBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoKHVuaVN0ciA9IEV4QWxsb2NhdGVQb29sKE5vblBhZ2VkUG9vbCwgc2l6ZW9mKFVOSUNPREVfU1RSSU5HKSkpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB3aWRlIHN0cmluZyBpdHNlbGYgKi8KLSAgICBsZW5ndGggPSAoc3RybGVuKGNzdHIpICogc2l6ZW9mKFdDSEFSKSkgKyBzaXplb2YoV0NIQVIpOwotICAgIGlmICgodW5pU3RyLT5CdWZmZXIgPSBFeEFsbG9jYXRlUG9vbChOb25QYWdlZFBvb2wsIGxlbmd0aCkpID09IE5VTEwpIHsKLQlFeEZyZWVQb29sKHVuaVN0cik7Ci0JcmV0dXJuIE5VTEw7Ci0JfQotICAgIFJ0bFplcm9NZW1vcnkodW5pU3RyLT5CdWZmZXIsIGxlbmd0aCk7Ci0gICAgdW5pU3RyLT5MZW5ndGggPSAwOwotICAgIHVuaVN0ci0+TWF4aW11bUxlbmd0aCA9IChVU0hPUlQpbGVuZ3RoOwotCi0gICAgLyogQ29udmVydCBmaWxlbmFtZSBzdHJpbmcgdG8gYW5zaSBzdHJpbmcgYW5kIHRoZW4gdG8gVW5pQ29kZSBzdHJpbmcgKi8KLSAgICBSdGxJbml0QW5zaVN0cmluZygmYW5zaVN0ciwgY3N0cik7Ci0gICAgUnRsQW5zaVN0cmluZ1RvVW5pY29kZVN0cmluZyh1bmlTdHIsICZhbnNpU3RyLCBGQUxTRSk7Ci0gICAgcmV0dXJuIHVuaVN0cjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci11bmlTdHIgIC0gVW5pQ29kZSBzdHJpbmcgc3RydWN0dXJlIHRvIGZyZWUKLQotUkVNQVJLUzoKLUZyZWVzIGEgc3RyaW5nIGFsbG9jYXRlZCBieSB0aGUgYWJvdmUgX1BNX0NTdHJpbmdUb1VuaWNvZGVTdHJpbmcgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfUE1fRnJlZVVuaWNvZGVTdHJpbmcoCi0gICAgVU5JQ09ERV9TVFJJTkcgKnVuaVN0cikKLXsKLSAgICBpZiAodW5pU3RyKSB7Ci0JRXhGcmVlUG9vbCh1bmlTdHItPkJ1ZmZlcik7Ci0JRXhGcmVlUG9vbCh1bmlTdHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi92ZmxhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDFjZTFjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3ZmbGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBEdW1teSBtb2R1bGU7IG5vIHZpcnR1YWwgZnJhbWVidWZmZXIgZm9yIHRoaXMgT1MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotCi1pYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKLXsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCi17Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi96dGltZXIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3p0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGM0YmQ0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3p0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIFZ4RAotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBDUFVfbGFyZ2VJbnRlZ2VyIGNvdW50RnJlcTsKLXN0YXRpYyB1bG9uZyAgICAgICAgICAgIHN0YXJ0LGZpbmlzaDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBaZW4gVGltZXIgbW9kdWxlIGludGVybmFscy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfX1pUaW1lckluaXQodm9pZCkKLXsKLSAgICBLZVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKikmY291bnRGcmVxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9fTFpUaW1lck9uKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIExBUkdFX0lOVEVHRVIgbHQgPSBLZVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKE5VTEwpOwotICAgIHRtLT5zdGFydC5sb3cgPSBsdC5Mb3dQYXJ0OwotICAgIHRtLT5zdGFydC5oaWdoID0gbHQuSGlnaFBhcnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19MWlRpbWVyTGFwKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIExBUkdFX0lOVEVHRVIgICAgICAgdG1MYXAgPSBLZVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKE5VTEwpOwotICAgIENQVV9sYXJnZUludGVnZXIgICAgdG1Db3VudDsKLQotICAgIF9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LChDUFVfbGFyZ2VJbnRlZ2VyKikmdG1MYXAsJnRtQ291bnQpOwotICAgIHJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmdG1Db3VudCxjb3VudEZyZXEubG93KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9fTFpUaW1lck9mZigKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBMQVJHRV9JTlRFR0VSIGx0ID0gS2VRdWVyeVBlcmZvcm1hbmNlQ291bnRlcihOVUxMKTsKLSAgICB0bS0+ZW5kLmxvdyA9IGx0Lkxvd1BhcnQ7Ci0gICAgdG0tPmVuZC5oaWdoID0gbHQuSGlnaFBhcnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19MWlRpbWVyQ291bnQoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciAgICB0bUNvdW50OwotCi0gICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtLT5lbmQsJnRtQ291bnQpOwotICAgIHJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmdG1Db3VudCxjb3VudEZyZXEubG93KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGFzIG1pY3Jvc2Vjb25kcyBwZXIgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFVMWlRJTUVSX1JFU09MVVRJT04gICAgIDEKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBMb25nIFBlcmlvZCB0aW1lciB2YWx1ZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKLXsKLSAgICBMQVJHRV9JTlRFR0VSIGNvdW50OwotICAgIEtlUXVlcnlTeXN0ZW1UaW1lKCZjb3VudCk7Ci0gICAgcmV0dXJuICh1bG9uZykoKigoX2ludDY0KikmY291bnQpIC8gMTApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suIE5vdGUgdGhhdCB3ZSBjaGVjayB0byBzZWUKLXdoZXRoZXIgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkLCBhbmQgaWYgc28gYWRqdXN0IHRoZSBmaW5pc2ggdGltZSB0bwotYWNjb3VudCBmb3IgdGhpcy4gV2UgY2Fubm90IGRldGVjdCBpZiBtb3JlIHRoYXQgb25lIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcwotcGFzc2VkLCBzbyBpZiB0aGlzIGhhcHBlbnMgd2Ugd2lsbCBiZSBnZW5lcmF0aW5nIGVycm9ub3VzIHJlc3VsdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX19VTFpFbGFwc2VkVGltZSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpCi17IHJldHVybiBmaW5pc2ggLSBzdGFydDsgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL19wbW9zMi5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvX3Btb3MyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxZjBmNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvX3Btb3MyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KLTsqIEVudmlyb25tZW50OiBPUy8yIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZQotOyoKLTsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgYXNzZW1ibHkgc3VwcG9ydCBmb3IgdGhlIFBNIGxpYnJhcnkgc3BlY2lmaWMKLTsqICAgICAgICAgICAgICB0byBPUy8yCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICAgICAgX3Btb3MyICAgICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2RhdGFzZWcgIF9wbW9zMgotCi0gICAgICAgIGNnbG9iYWwgX1BNX2lvZW50cnkKLSAgICAgICAgY2dsb2JhbCBfUE1fZ2R0Ci1fUE1faW9lbnRyeSAgICAgZGQgIDAgICAgICAgICAgICAgICA7IE9mZnNldCB0byBjYWxsIGdhdGUKLV9QTV9nZHQgICAgICAgICBkdyAgMCAgICAgICAgICAgICAgIDsgU2VsZWN0b3IgdG8gY2FsbCBnYXRlCi0KLWVuZGRhdGFzZWcgIF9wbW9zMgotCi1iZWdjb2Rlc2VnICBfcG1vczIgICAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgUE1fc2V0SU9QTChpbnQgaW9wbCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENoYW5nZSB0aGUgSU9QTCBsZXZlbCBmb3IgdGhlIDMyLWJpdCB0YXNrLiBSZXR1cm5zIHRoZSBwcmV2aW91cyBsZXZlbAotOyBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgZm9yIHRoZSB0YXNrIGNvcnJlY3RseS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9zZXRJT1BMCi0KLSAgICAgICAgQVJHICAgICBpb3BsOlVJTlQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgICAgICA7IFNhdmUgdGhlIG9sZCBFRkxBR1MgZm9yIGxhdGVyCi0gICAgICAgIG1vdiAgICAgZWN4LFtpb3BsXSAgICAgICAgICA7IEVDWCA6PSBJT1BMIGxldmVsCi0gICAgICAgIHhvciAgICAgZWJ4LGVieCAgICAgICAgICAgICA7IENoYW5nZSBJT1BMIGxldmVsIGZ1bmN0aW9uIGNvZGUgKDApCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgZmFyIGR3b3JkIFtfUE1faW9lbnRyeV0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbRldPUkQgX1BNX2lvZW50cnldCi1lbmRpZgotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICBhbmQgICAgIGVheCwwMDExMDAwMDAwMDAwMDAwYgotICAgICAgICBzaHIgICAgIGVheCwxMgotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9QTV9zZXRHRFRTZWxMaW1pdCh1c2hvcnQgc2VsZWN0b3IsIHVsb25nIGxpbWl0KTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENoYW5nZSB0aGUgR0RUIHNlbGVjdG9yIGxpbWl0IHRvIGdpdmVuIHZhbHVlLiBVc2VkIHRvIGNoYW5nZSBzZWxlY3RvcgotOyBsaW1pdHMgdG8gYWRkcmVzcyB0aGUgZW50aXJlIHN5c3RlbSBhZGRyZXNzIHNwYWNlLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9zZXRHRFRTZWxMaW1pdAotCi0gICAgICAgIEFSRyAgICAgc2VsZWN0b3I6VVNIT1JULCBsaW1pdDpVSU5UCi0gICAgICAgIAotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHN1YiAgICAgZXNwLDIwICAgICAgICAgICAgICA7IE1ha2Ugcm9vbSBmb3Igc2VsZWN0b3IgZGF0YSBvbiBzdGFjawotICAgICAgICBtb3YgICAgIGVjeCxlc3AgICAgICAgICAgICAgOyBFQ1ggOj0gc2VsZWN0b3IgZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgbW92ICAgICBieCxbc2VsZWN0b3JdICAgICAgIDsgRmlsbCBvdXQgdGhlIGRhdGEgc3RydWN0dXJlCi0gICAgICAgIGFuZCAgICAgYngsMEZGRjhoICAgICAgICAgICA7IEtpY2sgb3V0IHRoZSBMRFQvR0RUIGFuZCBEUEwgYml0cyAgICAgCi0gICAgICAgIG1vdiAgICAgW1dPUkQgZWN4XSxieAotICAgICAgICBtb3YgICAgIGVieCxbbGltaXRdCi0gICAgICAgIG1vdiAgICAgW0RXT1JEIGVjeCs0XSxlYngKLSAgICAgICAgbW92ICAgICBlYngsNSAgICAgICAgICAgICAgIDsgU2V0IEdEVCBzZWxlY3RvciBsaW1pdCBmdW5jdGlvbiBjb2RlICAgICAgCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgZmFyIGR3b3JkIFtfUE1faW9lbnRyeV0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbRldPUkQgX1BNX2lvZW50cnldCi1lbmRpZgotICAgICAgICBhZGQgICAgIGVzcCwyMAotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZCAgICAKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWNoYXIgX01UUlJfZ2V0Q3g4Nih1Y2hhciByZWcpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCBhIEN5cml4IENQVSBpbmRleGVkIHJlZ2lzdGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX01UUlJfZ2V0Q3g4NgotCi0gICAgICAgIEFSRyAgICAgcmVnOlVDSEFSCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGFsLFtyZWddCi0gICAgICAgIG91dCAgICAgMjJoLGFsCi0gICAgICAgIGluICAgICAgYWwsMjNoCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVjaGFyIF9NVFJSX3NldEN4ODYodWNoYXIgcmVnLHVjaGFyIHZhbCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBXcml0ZSBhIEN5cml4IENQVSBpbmRleGVkIHJlZ2lzdGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX01UUlJfc2V0Q3g4NgotCi0gICAgICAgIEFSRyAgICAgcmVnOlVDSEFSLCB2YWw6VUNIQVIKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgYWwsW3JlZ10KLSAgICAgICAgb3V0ICAgICAyMmgsYWwKLSAgICAgICAgbW92ICAgICBhbCxbdmFsXQotICAgICAgICBvdXQgICAgIDIzaCxhbAotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bG9uZyBfTVRSUl9kaXNhYmxlSW50KHZvaWQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJuIHByb2Nlc3NvciBpbnRlcnJ1cHQgc3RhdHVzIGFuZCBkaXNhYmxlIGludGVycnVwdHMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX01UUlJfZGlzYWJsZUludAotCi07IERvIG5vdGhpbmchCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9NVFJSX3Jlc3RvcmVJbnQodWxvbmcgcHMpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVzdG9yZSBwcm9jZXNzb3IgaW50ZXJydXB0IHN0YXR1cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9yZXN0b3JlSW50Ci0KLTsgRG8gbm90aGluZyEKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgRGVidWdJbnQodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBEZWJ1Z0ludAotCi0gICAgICAgIGludCAgICAgMwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotZW5kY29kZXNlZyAgX3Btb3MyCi0KLSAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQotICAgICAgICAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9jcHVpbmZvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvY3B1aW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGU0MDBkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9jcHVpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBPUy8yCi0qCi0qIERlc2NyaXB0aW9uOiAgT1MvMiBzcGVjaWZpYyBjb2RlIGZvciB0aGUgQ1BVIGRldGVjdGlvbiBtb2R1bGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRPRE86IFRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVkIGZvciBPUy8yIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU2V0TWF4VGhyZWFkUHJpb3JpdHkoKSAgMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRPRE86IFRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVkIGZvciBPUy8yIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgUmVzdG9yZVRocmVhZFByaW9yaXR5KGkpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgR2V0Q291bnRlckZyZXF1ZW5jeSgKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICpmcmVxKQotewotICAgIGZyZXEtPmxvdyA9IDEwMDAwMDsKLSAgICBmcmVxLT5oaWdoID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVUxPTkcgICBjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIERvc1F1ZXJ5U3lzSW5mbyggUVNWX01TX0NPVU5ULCBRU1ZfTVNfQ09VTlQsICZjb3VudCwgc2l6ZW9mKFVMT05HKSApOyAgIFwKLSAgICAodCktPmxvdyA9IGNvdW50ICogMTAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHQpLT5oaWdoID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL2V2ZW50LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjYzE5Yi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvZXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBJQk0gUEMgKE9TLzIpCi0qCi0qIERlc2NyaXB0aW9uOiAgT1MvMiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFNjaVRlY2ggY3Jvc3MgcGxhdGZvcm0KLSogICAgICAgICAgICAgICBldmVudCBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRGVmaW5lIGdlbmVyb3VzIGtleWJvYXJkIG1vbml0b3IgY2lyY3VsYXIgYnVmZmVyIHNpemUgdG8gbWluaW1pemUKLSAqIHRoZSBkYW5nZXIgb2YgbG9zaW5nIGtleXN0cm9rZXMKLSAqLwotI2RlZmluZSBLRVlCVUZTSVpFICAoRVZFTlRRU0laRSArIDEwKQotCi1zdGF0aWMgaW50ICAgICAgb2xkTW91c2VTdGF0ZTsgICAgICAgICAgLyogT2xkIG1vdXNlIHN0YXRlICAgICAgICAgICAgICAgKi8KLXN0YXRpYyB1bG9uZyAgICBvbGRLZXlNZXNzYWdlOyAgICAgICAgICAvKiBPbGQga2V5Ym9hcmQgc3RhdGUgICAgICAgICAgICAqLwotc3RhdGljIHVzaG9ydCAgIGtleVVwTXNnWzI1Nl0gPSB7MH07ICAgIC8qIFRhYmxlIG9mIGtleSB1cCBtZXNzYWdlcyAgICAgICovCi1zdGF0aWMgaW50ICAgICAgcmFuZ2VYLHJhbmdlWTsgICAgICAgICAgLyogUmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgICAgKi8KLUhNT1UgICAgICAgICAgICBfRVZUX2hNb3VzZTsgICAgICAgICAgICAvKiBIYW5kbGUgdG8gdGhlIG1vdXNlIGRyaXZlciAgICAqLwotSE1PTklUT1IgICAgICAgIF9FVlRfaEtiZE1vbjsgICAgICAgICAgIC8qIEhhbmRsZSB0byB0aGUga2V5Ym9hcmQgZHJpdmVyICovCi1USUQgICAgICAgICAgICAga2JkTW9uVElEID0gMDsgICAgICAgICAgLyogS2V5Ym9hcmQgbW9uaXRvciB0aHJlYWQgSUQgICAgKi8KLUhFViAgICAgICAgICAgICBoZXZTdGFydDsgICAgICAgICAgICAgICAvKiBTdGFydCBldmVudCBzZW1hcGhvcmUgaGFuZGxlICAqLwotQk9PTCAgICAgICAgICAgIGJNb25SdW5uaW5nOyAgICAgICAgICAgIC8qIEZsYWcgc2V0IGlmIG1vbml0b3IgdGhyZWFkIE9LICovCi1ITVRYICAgICAgICAgICAgaG10eEtleUJ1ZjsgICAgICAgICAgICAgLyogTXV0ZXggcHJvdGVjdGluZyBrZXkgYnVmZmVyICAgKi8KLUtFWVBBQ0tFVCAgICAgICBrZXlNb25Qa3RzW0tFWUJVRlNJWkVdOyAvKiBBcnJheSBvZiBtb25pdG9yIGtleSBwYWNrZXRzICAqLwotaW50ICAgICAgICAgICAgIGtwSGVhZCA9IDA7ICAgICAgICAgICAgIC8qIEtleSBwYWNrZXQgYnVmZmVyIGhlYWQgICAgICAgICovCi1pbnQgICAgICAgICAgICAga3BUYWlsID0gMDsgICAgICAgICAgICAgLyogS2V5IHBhY2tldCBidWZmZXIgdGFpbCAgICAgICAgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVGhlc2UgYXJlIG5vdCB1c2VkIHVuZGVyIE9TLzIgKi8KLSNkZWZpbmUgX0VWVF9kaXNhYmxlSW50KCkgICAgICAgMQotI2RlZmluZSBfRVZUX3Jlc3RvcmVJbnQoZmxhZ3MpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdGVzdAotCi1SRU1BUktTOgotVGhpcyBtYWNybyBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKLXRpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9pc0tleURvd24oc2NhbkNvZGUpICAgIChrZXlVcE1zZ1tzY2FuQ29kZV0gIT0gMCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGlja3Mgc2luY2Ugc3lzdGVtCi1zdGFydHVwIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgdmFsdWUgdGhhdCBpcyBwbGFjZWQgaW50bwotdGhlIHRpbWUgc3RhbXAgZmllbGRzIG9mIGV2ZW50cywgYW5kIGlzIHVzZWQgdG8gaW1wbGVtZW50IGF1dG8gbW91c2UgZG93bgotZXZlbnRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9FVlRfZ2V0VGlja3Modm9pZCkKLXsKLSAgICBVTE9ORyAgIGNvdW50OwotICAgIERvc1F1ZXJ5U3lzSW5mbyggUVNWX01TX0NPVU5ULCBRU1ZfTVNfQ09VTlQsICZjb3VudCwgc2l6ZW9mKFVMT05HKSApOwotICAgIHJldHVybiBjb3VudDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db252ZXJ0cyBhIG1pY2tleSBtb3ZlbWVudCB2YWx1ZSB0byBhIHBpeGVsIGFkanVzdG1lbnQgdmFsdWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBNaWNrZXlUb1BpeGVsKAotICAgIGludCBtaWNrZXkpCi17Ci0gICAgLyogVE9ETzogV2UgY2FuIGFkZCBzb21lIGNvZGUgaW4gaGVyZSB0byBoYW5kbGUgJ2FjY2VsZXJhdGlvbicgZm9yICovCi0gICAgLyogICAgICAgdGhlIG1vdXNlIGN1cnNvci4gRm9yIG5vdyBqdXN0IHVzZSB0aGUgbWlja2V5cy4gKi8KLSAgICByZXR1cm4gbWlja2V5OwotfQotCi0vKiBTb21lIHVzZWZ1bCBkZWZpbmVzIGFueSB0eXBlZGVmcyB1c2VkIGluIHRoZSBrZXlib2FyZCBoYW5kbGluZyAqLwotI2RlZmluZSBLRVlfUkVMRUFTRSAgICAgICAgICAgICAweDQwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUHVtcHMgYWxsIG1lc3NhZ2VzIGluIHRoZSBtZXNzYWdlIHF1ZXVlIGZyb20gT1MvMiBpbnRvIG91ciBldmVudCBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQotewotICAgIEtCRElORk8gICAgICAgICBrZXlJbmZvOyAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgYSA2NEsgYm91bmRhcnkgKi8KLSAgICBLQkRLRVlJTkZPICAgICAga2V5OyAgICAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5ICovCi0gICAgTU9VUVVFSU5GTyAgICAgIG1xdWV1ZTsgICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyBhIDY0SyBib3VuZGFyeSAqLwotICAgIE1PVUVWRU5USU5GTyAgICBtb3VzZTsgICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgYSA2NEsgYm91bmRhcnkgKi8KLSAgICB1c2hvcnQgICAgICAgICAgbVdhaXQ7ICAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5ICovCi0gICAgS0VZUEFDS0VUICAgICAgIGtwOyAgICAgICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyBhIDY0SyBib3VuZGFyeSAqLwotICAgIGV2ZW50X3QgICAgICAgICBldnQ7Ci0gICAgaW50ICAgICAgICAgICAgIHNjYW47Ci0gICAgaWJvb2wgICAgICAgICAgIG5vSW5wdXQgPSBUUlVFOyAvKiBGbGFnIHRvIGRldGVybWluZSBpZiBhbnkgaW5wdXQgd2FzIGF2YWlsYWJsZSAqLwotCi0gICAgLyogRmlyc3Qgb2YgYWxsLCBjaGVjayBpZiB3ZSBzaG91bGQgZG8gYW55IHNlc3Npb24gc3dpdGNoIHdvcmsgKi8KLSAgICBfX1BNX2NoZWNrQ29uc29sZVN3aXRjaCgpOwotCi0gICAgLyogUHVtcCBhbGwga2V5Ym9hcmQgbWVzc2FnZXMgZnJvbSBvdXIgY2lyY3VsYXIgYnVmZmVyICovCi0gICAgZm9yICg7OykgewotCS8qIENoZWNrIHRoYXQgdGhlIG1vbml0b3IgdGhyZWFkIGlzIHN0aWxsIHJ1bm5pbmcgKi8KLQlpZiAoIWJNb25SdW5uaW5nKQotCSAgICBQTV9mYXRhbEVycm9yKCJLZXlib2FyZCBtb25pdG9yIHRocmVhZCBkaWVkISIpOwotCi0JLyogUHJvdGVjdCBrZXlwYWNrZXQgYnVmZmVyIHdpdGggbXV0ZXggKi8KLQlEb3NSZXF1ZXN0TXV0ZXhTZW0oaG10eEtleUJ1ZiwgU0VNX0lOREVGSU5JVEVfV0FJVCk7Ci0JaWYgKGtwSGVhZCA9PSBrcFRhaWwpIHsKLQkgICAgRG9zUmVsZWFzZU11dGV4U2VtKGhtdHhLZXlCdWYpOwotCSAgICBicmVhazsKLQkgICAgfQotCi0Jbm9JbnB1dCA9IEZBTFNFOwotCi0JLyogUmVhZCBwYWNrZXQgZnJvbSBjaXJjdWxhciBidWZmZXIgYW5kIHJlbW92ZSBpdCAqLwotCW1lbWNweSgma3AsICZrZXlNb25Qa3RzW2twVGFpbF0sIHNpemVvZihLRVlQQUNLRVQpKTsKLQlpZiAoKytrcFRhaWwgPT0gS0VZQlVGU0laRSkKLQkgICAga3BUYWlsID0gMDsKLQlEb3NSZWxlYXNlTXV0ZXhTZW0oaG10eEtleUJ1Zik7Ci0KLQkvKiBDb21wZW5zYXRlIGZvciB0aGUgMHhFMCBjaGFyYWN0ZXIgKi8KLQlpZiAoa3AuWGxhdGVkU2NhbiAmJiBrcC5YbGF0ZWRDaGFyID09IDB4RTApCi0JICAgIGtwLlhsYXRlZENoYXIgPSAwOwotCi0JLyogRGV0ZXJtaW5lIHR5cGUgb2Yga2V5Ym9hcmQgZXZlbnQgKi8KLQltZW1zZXQoJmV2dCwwLHNpemVvZihldnQpKTsKLQlpZiAoa3AuS2JkRERGbGFnV29yZCAmIEtFWV9SRUxFQVNFKQotCSAgICBldnQud2hhdCA9IEVWVF9LRVlVUDsKLQllbHNlCi0JICAgIGV2dC53aGF0ID0gRVZUX0tFWURPV047Ci0KLQkvKiBDb252ZXJ0IGtleWJvYXJkIGNvZGVzICovCi0Jc2NhbiA9IGtwLk1vbkZsYWdXb3JkID4+IDg7Ci0JaWYgKGV2dC53aGF0ID09IEVWVF9LRVlVUCkgewotCSAgICAvKiBHZXQgbWVzc2FnZSBmb3Iga2V5dXAgY29kZSBmcm9tIHRhYmxlIG9mIGNhY2hlZCBkb3duIHZhbHVlcyAqLwotCSAgICBldnQubWVzc2FnZSA9IGtleVVwTXNnW3NjYW5dOwotCSAgICBrZXlVcE1zZ1tzY2FuXSA9IDA7Ci0JICAgIG9sZEtleU1lc3NhZ2UgPSAtMTsKLQkgICAgfQotCWVsc2UgewotCSAgICBldnQubWVzc2FnZSA9ICgodWxvbmcpc2NhbiA8PCA4KSB8IGtwLlhsYXRlZENoYXI7Ci0JICAgIGlmIChldnQubWVzc2FnZSA9PSBrZXlVcE1zZ1tzY2FuXSkgewotCQlldnQud2hhdCA9IEVWVF9LRVlSRVBFQVQ7Ci0JCWV2dC5tZXNzYWdlIHw9IDB4MTAwMDA7Ci0JCX0KLQkgICAgb2xkS2V5TWVzc2FnZSA9IGV2dC5tZXNzYWdlICYgMHgwRkZGRjsKLQkgICAga2V5VXBNc2dbc2Nhbl0gPSAodXNob3J0KWV2dC5tZXNzYWdlOwotCSAgICB9Ci0KLQkgLyogQ29udmVydCBzaGlmdCBzdGF0ZSBtb2RpZmllcnMgKi8KLQkgaWYgKGtwLnUuU2hpZnRTdGF0ZSAmIDB4MDAwMSkKLQkgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX1JJR0hUU0hJRlQ7Ci0JIGlmIChrcC51LlNoaWZ0U3RhdGUgJiAweDAwMDIpCi0JICAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9MRUZUU0hJRlQ7Ci0JIGlmIChrcC51LlNoaWZ0U3RhdGUgJiAweDAxMDApCi0JICAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9MRUZUQ1RSTDsKLQkgaWYgKGtwLnUuU2hpZnRTdGF0ZSAmIDB4MDIwMCkKLQkgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX0xFRlRBTFQ7Ci0JIGlmIChrcC51LlNoaWZ0U3RhdGUgJiAweDA0MDApCi0JICAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9SSUdIVENUUkw7Ci0JIGlmIChrcC51LlNoaWZ0U3RhdGUgJiAweDA4MDApCi0JICAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9SSUdIVEFMVDsKLQkgRVZULm9sZE1vdmUgPSAtMTsKLQotCSAvKiBBZGQgdGltZSBzdGFtcCBhbmQgYWRkIHRoZSBldmVudCB0byB0aGUgcXVldWUgKi8KLQkgZXZ0LndoZW4gPSBrZXkudGltZTsKLQkgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCi0JICAgICBhZGRFdmVudCgmZXZ0KTsKLQkgfQotCi0gICAgLyogRG9uJ3QganVzdCBmbHVzaCBiZWNhdXNlIHRoYXQgdGVybWluYWxseSBjb25mdXNlcyB0aGUgbW9uaXRvciAqLwotICAgIGRvIHsKLQlLYmRDaGFySW4oJmtleSwgSU9fTk9XQUlULCAwKTsKLQl9IHdoaWxlIChrZXkuZmJTdGF0dXMgJiBLQkRUUkZfRklOQUxfQ0hBUl9JTik7Ci0KLSAgICAvKiBQdW1wIGFsbCBtb3VzZSBtZXNzYWdlcyAqLwotICAgIEtiZEdldFN0YXR1cygma2V5SW5mbywwKTsKLSAgICAvKiBDaGVjayByZXR1cm4gY29kZSAtIG1vdXNlIG1heSBub3QgYmUgb3BlcmF0aW9uYWwhISAqLwotICAgIGlmIChNb3VHZXROdW1RdWVFbCgmbXF1ZXVlLF9FVlRfaE1vdXNlKSA9PSBOT19FUlJPUikgewotCXdoaWxlIChtcXVldWUuY0V2ZW50cykgewotCSAgICB3aGlsZSAobXF1ZXVlLmNFdmVudHMtLSkgewotCQltZW1zZXQoJmV2dCwwLHNpemVvZihldnQpKTsKLQkJbVdhaXQgPSBNT1VfTk9XQUlUOwotCQlNb3VSZWFkRXZlbnRRdWUoJm1vdXNlLCZtV2FpdCxfRVZUX2hNb3VzZSk7Ci0KLQkJLyogVXBkYXRlIHRoZSBtb3VzZSBwb3NpdGlvbi4gV2UgZ2V0IHRoZSBtb3VzZSBjb29yZGluYXRlcwotCQkgKiBpbiBtaWNrZXlzIHNvIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZXNlIGludG8gcGl4ZWxzIGFuZAotCQkgKiBtb3ZlIG91ciBtb3VzZSBwb3NpdGlvbi4gSWYgd2UgZG9uJ3QgZG8gdGhpcywgT1MvMiBnaXZlcwotCQkgKiB1cyB0aGUgY29vcmRpbmF0ZXMgaW4gY2hhcmFjdGVyIHBvc2l0aW9ucyBzaW5jZSBpdCBzdGlsbAotCQkgKiB0aGlua3Mgd2UgYXJlIGluIHRleHQgbW9kZSEKLQkJICovCi0JCUVWVC5teCArPSBNaWNrZXlUb1BpeGVsKG1vdXNlLmNvbCk7Ci0JCUVWVC5teSArPSBNaWNrZXlUb1BpeGVsKG1vdXNlLnJvdyk7Ci0JCWlmIChFVlQubXggPCAwKSBFVlQubXggPSAwOwotCQlpZiAoRVZULm15IDwgMCkgRVZULm15ID0gMDsKLQkJaWYgKEVWVC5teCA+IHJhbmdlWCkgICAgRVZULm14ID0gcmFuZ2VYOwotCQlpZiAoRVZULm15ID4gcmFuZ2VZKSAgICBFVlQubXkgPSByYW5nZVk7Ci0JCWV2dC53aGVyZV94ID0gRVZULm14OwotCQlldnQud2hlcmVfeSA9IEVWVC5teTsKLQkJZXZ0LnJlbGF0aXZlX3ggPSBtb3VzZS5jb2w7Ci0JCWV2dC5yZWxhdGl2ZV95ID0gbW91c2Uucm93OwotCQlldnQud2hlbiA9IGtleS50aW1lOwotCQlpZiAobW91c2UuZnMgJiAoTU9VU0VfQk4xX0RPV04gfCBNT1VTRV9NT1RJT05fV0lUSF9CTjFfRE9XTikpCi0JCSAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9MRUZUQlVUOwotCQlpZiAobW91c2UuZnMgJiAoTU9VU0VfQk4yX0RPV04gfCBNT1VTRV9NT1RJT05fV0lUSF9CTjJfRE9XTikpCi0JCSAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9SSUdIVEJVVDsKLQkJaWYgKG1vdXNlLmZzICYgKE1PVVNFX0JOM19ET1dOIHwgTU9VU0VfTU9USU9OX1dJVEhfQk4zX0RPV04pKQotCQkgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTUlERExFQlVUOwotCQlpZiAoa2V5SW5mby5mc1N0YXRlICYgMHgwMDAxKQotCQkgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRTSElGVDsKLQkJaWYgKGtleUluZm8uZnNTdGF0ZSAmIDB4MDAwMikKLQkJICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX0xFRlRTSElGVDsKLQkJaWYgKGtleUluZm8uZnNTdGF0ZSAmIDB4MDEwMCkKLQkJICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX0xFRlRDVFJMOwotCQlpZiAoa2V5SW5mby5mc1N0YXRlICYgMHgwMjAwKQotCQkgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVEFMVDsKLQkJaWYgKGtleUluZm8uZnNTdGF0ZSAmIDB4MDQwMCkKLQkJICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX1JJR0hUQ1RSTDsKLQkJaWYgKGtleUluZm8uZnNTdGF0ZSAmIDB4MDgwMCkKLQkJICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX1JJR0hUQUxUOwotCi0JCS8qIENoZWNrIGZvciBsZWZ0IG1vdXNlIGNsaWNrIGV2ZW50cyAqLwotCQkvKiAweDA2ID09IChNT1VTRV9CTjFfRE9XTiB8IE1PVVNFX01PVElPTl9XSVRIX0JOMV9ET1dOKSAqLwotCQlpZiAoKChtb3VzZS5mcyAmIDB4MDAwNikgJiYgIShvbGRNb3VzZVN0YXRlICYgMHgwMDA2KSkKLQkJCXx8ICghKG1vdXNlLmZzICYgMHgwMDA2KSAmJiAob2xkTW91c2VTdGF0ZSAmIDB4MDAwNikpKSB7Ci0JCSAgICBpZiAobW91c2UuZnMgJiAweDAwMDYpCi0JCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV047Ci0JCSAgICBlbHNlCi0JCQlldnQud2hhdCA9IEVWVF9NT1VTRVVQOwotCQkgICAgZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLOwotCQkgICAgRVZULm9sZE1vdmUgPSAtMTsKLQkJICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQkJYWRkRXZlbnQoJmV2dCk7Ci0JCSAgICB9Ci0KLQkJLyogQ2hlY2sgZm9yIHJpZ2h0IG1vdXNlIGNsaWNrIGV2ZW50cyAqLwotCQkvKiAweDAwMTggPT0gKE1PVVNFX0JOMl9ET1dOIHwgTU9VU0VfTU9USU9OX1dJVEhfQk4yX0RPV04pICovCi0JCWlmICgoKG1vdXNlLmZzICYgMHgwMDE4KSAmJiAhKG9sZE1vdXNlU3RhdGUgJiAweDAwMTgpKQotCQkJfHwgKCEobW91c2UuZnMgJiAweDAwMTgpICYmIChvbGRNb3VzZVN0YXRlICYgMHgwMDE4KSkpIHsKLQkJICAgIGlmIChtb3VzZS5mcyAmIDB4MDAxOCkKLQkJCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLQkJICAgIGVsc2UKLQkJCWV2dC53aGF0ID0gRVZUX01PVVNFVVA7Ci0JCSAgICBldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOwotCQkgICAgRVZULm9sZE1vdmUgPSAtMTsKLQkJICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQkJYWRkRXZlbnQoJmV2dCk7Ci0JCSAgICB9Ci0KLQkJLyogQ2hlY2sgZm9yIG1pZGRsZSBtb3VzZSBjbGljayBldmVudHMgKi8KLQkJLyogMHgwMDYwID09IChNT1VTRV9CTjNfRE9XTiB8IE1PVVNFX01PVElPTl9XSVRIX0JOM19ET1dOKSAqLwotCQlpZiAoKChtb3VzZS5mcyAmIDB4MDA2MCkgJiYgIShvbGRNb3VzZVN0YXRlICYgMHgwMDYwKSkKLQkJCXx8ICghKG1vdXNlLmZzICYgMHgwMDYwKSAmJiAob2xkTW91c2VTdGF0ZSAmIDB4MDA2MCkpKSB7Ci0JCSAgICBpZiAobW91c2UuZnMgJiAweDAwNjApCi0JCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV047Ci0JCSAgICBlbHNlCi0JCQlldnQud2hhdCA9IEVWVF9NT1VTRVVQOwotCQkgICAgZXZ0Lm1lc3NhZ2UgPSBFVlRfTUlERExFQk1BU0s7Ci0JCSAgICBFVlQub2xkTW92ZSA9IC0xOwotCQkgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCi0JCQlhZGRFdmVudCgmZXZ0KTsKLQkJICAgIH0KLQotCQkvKiBDaGVjayBmb3IgbW91c2UgbW92ZW1lbnQgZXZlbnQgKi8KLQkJaWYgKG1vdXNlLmZzICYgMHgwMDJCKSB7Ci0JCSAgICBldnQud2hhdCA9IEVWVF9NT1VTRU1PVkU7Ci0JCSAgICBpZiAoRVZULm9sZE1vdmUgIT0gLTEpIHsKLQkJCUVWVC5ldnRxW0VWVC5vbGRNb3ZlXS53aGVyZV94ID0gZXZ0LndoZXJlX3g7LyogTW9kaWZ5IGV4aXN0aW5nIG9uZSAgKi8KLQkJCUVWVC5ldnRxW0VWVC5vbGRNb3ZlXS53aGVyZV95ID0gZXZ0LndoZXJlX3k7Ci0JCQl9Ci0JCSAgICBlbHNlIHsKLQkJCUVWVC5vbGRNb3ZlID0gRVZULmZyZWVIZWFkOyAvKiBTYXZlIGlkIG9mIHRoaXMgbW92ZSBldmVudCAgICovCi0JCQlpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKLQkJCSAgICBhZGRFdmVudCgmZXZ0KTsKLQkJCX0KLQkJICAgIH0KLQotCQkvKiBTYXZlIGN1cnJlbnQgbW91c2Ugc3RhdGUgKi8KLQkJb2xkTW91c2VTdGF0ZSA9IG1vdXNlLmZzOwotCQl9Ci0JICAgIE1vdUdldE51bVF1ZUVsKCZtcXVldWUsX0VWVF9oTW91c2UpOwotCSAgICB9Ci0JICAgIG5vSW5wdXQgPSBGQUxTRTsKLQl9Ci0KLSAgICAvKiBJZiB0aGVyZSB3YXMgbm8gaW5wdXQgYXZhaWxhYmxlLCBnaXZlIHVwIHRoZSBjdXJyZW50IHRpbWVzbGljZQotICAgICAqIE5vdGU6IERvc1NsZWVwKDApIHdpbGwgZWZmZWN0aXZlbHkgZG8gbm90aGluZyBpZiBubyBvdGhlciB0aHJlYWQgaXMgcmVhZHkuIEhlbmNlCi0gICAgICogRG9zU2xlZXAoMCkgd2lsbCBzdGlsbCB1c2UgMTAwJSBDUFUgX2J1dF8gc2hvdWxkIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBwcm9ncmFtcy4KLSAgICAgKi8KLSAgICBpZiAobm9JbnB1dCkKLQlEb3NTbGVlcCgwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIG1hY3JvL2Z1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydHMgdGhlIHNjYW4gY29kZXMgcmVwb3J0ZWQgYnkgdGhlCi1rZXlib2FyZCB0byBvdXIgZXZlbnQgbGlicmFyaWVzIG5vcm1hbGlzZWQgZm9ybWF0LiBXZSBvbmx5IGhhdmUgb25lIHNjYW4KLWNvZGUgZm9yIHRoZSAnQScga2V5LCBhbmQgdXNlIHNoaWZ0IG1vZGlmaWVycyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYQotQ3RybC1GMSwgQWx0LUYxIGV0Yy4gVGhlIHJhdyBzY2FuIGNvZGVzIGZyb20gdGhlIGtleWJvYXJkIHdvcmsgdGhpcyB3YXksCi1idXQgdGhlIE9TIGdpdmVzIHVzICdjb29rZWQnIHNjYW4gY29kZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZW0gYmFjawotdG8gdGhlIHJhdyBmb3JtYXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX21hc2tLZXlDb2RlKGV2dCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1LZXlib2FyZCBtb25pdG9yIHRocmVhZC4gTmVlZGVkIHRvIGNhdGNoIGJvdGgga2V5dXAgYW5kIGtleWRvd24gZXZlbnRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9rYmRNb25UaHJlYWQoCi0gICAgdm9pZCAqcGFyYW1zKQotewotICAgIEFQSVJFVCAgICAgICByYzsKLSAgICBLRVlQQUNLRVQgICAga3A7Ci0gICAgVVNIT1JUICAgICAgIGNvdW50ID0gc2l6ZW9mKEtFWVBBQ0tFVCk7Ci0gICAgTU9OQlVGICAgICAgIG1vbkluYnVmOwotICAgIE1PTkJVRiAgICAgICBtb25PdXRidWY7Ci0gICAgaW50ICAgICAgICAgIGtwTmV3OwotCi0gICAgLyogUmFpc2UgdGhyZWFkIHByaW9yaXR5IGZvciBoaWdoZXIgcmVzcG9uc2l2ZW5lc3MgKi8KLSAgICBEb3NTZXRQcmlvcml0eShQUlRZU19USFJFQUQsIFBSVFlDX1RJTUVDUklUSUNBTCwgMCwgMCk7Ci0gICAgbW9uSW5idWYuY2IgID0gc2l6ZW9mKG1vbkluYnVmKSAtIHNpemVvZihtb25JbmJ1Zi5jYik7Ci0gICAgbW9uT3V0YnVmLmNiID0gc2l6ZW9mKG1vbk91dGJ1ZikgLSBzaXplb2YobW9uT3V0YnVmLmNiKTsKLSAgICBiTW9uUnVubmluZyA9IEZBTFNFOwotCi0gICAgLyogUmVnaXN0ZXIgdGhlIGJ1ZmZlcnMgdG8gYmUgdXNlZCBmb3IgbW9uaXRvcmluZyBmb3IgY3VycmVudCBzZXNzaW9uICovCi0gICAgaWYgKERvc01vblJlZyhfRVZUX2hLYmRNb24sICZtb25JbmJ1ZiwgKFVMT05HKikmbW9uT3V0YnVmLE1PTklUT1JfRU5ELCAtMSkpIHsKLQlEb3NQb3N0RXZlbnRTZW0oaGV2U3RhcnQpOyAgLyogdW5ibG9jayB0aGUgbWFpbiB0aHJlYWQgKi8KLQlyZXR1cm47Ci0JfQotCi0gICAgLyogVW5ibG9jayB0aGUgbWFpbiB0aHJlYWQgYW5kIHRlbGwgaXQgd2UncmUgT0sqLwotICAgIGJNb25SdW5uaW5nID0gVFJVRTsKLSAgICBEb3NQb3N0RXZlbnRTZW0oaGV2U3RhcnQpOwotICAgIHdoaWxlIChiTW9uUnVubmluZykgeyAgLyogU3RhcnQgYW4gZW5kbGVzcyBsb29wICovCi0JLyogUmVhZCBkYXRhIGZyb20ga2V5Ym9hcmQgZHJpdmVyICovCi0JcmMgPSBEb3NNb25SZWFkKChQQllURSkmbW9uSW5idWYsIElPX1dBSVQsIChQQllURSkma3AsIChQVVNIT1JUKSZjb3VudCk7Ci0JaWYgKHJjKSB7Ci0jaWZkZWYgQ0hFQ0tFRAotCSAgICBpZiAoYk1vblJ1bm5pbmcpCi0JCXByaW50ZigiRXJyb3IgaW4gRG9zTW9uUmVhZCwgcmMgPSAlbGRcbiIsIHJjKTsKLSNlbmRpZgotCSAgICBiTW9uUnVubmluZyA9IEZBTFNFOwotCSAgICByZXR1cm47Ci0JICAgIH0KLQotCS8qIFBhc3MgRkxVU0ggcGFja2V0cyBpbW1lZGlhdGVseSAqLwotCWlmIChrcC5Nb25GbGFnV29yZCAmIDQpIHsKLSNpZmRlZiBDSEVDS0VECi0JICAgIHByaW50ZigiRmx1c2ggcGFja2V0IVxuIik7Ci0jZW5kaWYKLQkgICAgRG9zTW9uV3JpdGUoKFBCWVRFKSZtb25PdXRidWYsIChQQllURSkma3AsIGNvdW50KTsKLQkgICAgY29udGludWU7Ci0JICAgIH0KLQotCS8qVE9ETzogdG8gYmUgcmVtb3ZlZCAqLwotCS8qIFNraXAgZXh0ZW5kZWQgc2NhbmNvZGVzICYgc29tZSBvdGhlcnMgKi8KLQlpZiAoKChrcC5Nb25GbGFnV29yZCA+PiA4KSA9PSAweEUwKSB8fCAoKGtwLktiZERERmxhZ1dvcmQgJiAweDBGKSA9PSAweDBGKSkgewotCSAgICBEb3NNb25Xcml0ZSgoUEJZVEUpJm1vbk91dGJ1ZiwgKFBCWVRFKSZrcCwgY291bnQpOwotCSAgICBjb250aW51ZTsKLQkgICAgfQotCi0vKiAgICAgIHByaW50ZigiUmF3U2NhbiA9ICVYLCBYbGF0ZWRTY2FuID0gJVgsIGZiU3RhdHVzID0gJVgsIEtiZERERmxhZ3MgPSAlWFxuIiwgKi8KLS8qICAgICAgICAgIGtwLk1vbkZsYWdXb3JkID4+IDgsIGtwLlhsYXRlZFNjYW4sIGtwLnUuU2hpZnRTdGF0ZSwga3AuS2JkRERGbGFnV29yZCk7ICovCi0KLQkvKiBQcm90ZWN0IGFjY2VzcyB0byBidWZmZXIgd2l0aCBtdXRleCBzZW1hcGhvcmUgKi8KLQlyYyA9IERvc1JlcXVlc3RNdXRleFNlbShobXR4S2V5QnVmLCAxMDAwKTsKLQlpZiAocmMpIHsKLSNpZmRlZiBDSEVDS0VECi0JICAgIHByaW50ZigiQ2FuJ3QgZ2V0IGFjY2VzcyB0byBtdXRleCwgcmMgPSAlbGRcbiIsIHJjKTsKLSNlbmRpZgotCSAgICBiTW9uUnVubmluZyA9IEZBTFNFOwotCSAgICByZXR1cm47Ci0JICAgIH0KLQotCS8qIFN0b3JlIHBhY2tldCBpbiBjaXJjdWxhciBidWZmZXIsIGRyb3AgaXQgaWYgaXQncyBmdWxsICovCi0Ja3BOZXcgPSBrcEhlYWQgKyAxOwotCWlmIChrcE5ldyA9PSBLRVlCVUZTSVpFKQotCSAgICBrcE5ldyA9IDA7Ci0JaWYgKGtwTmV3ICE9IGtwVGFpbCkgewotCSAgICBtZW1jcHkoJmtleU1vblBrdHNba3BIZWFkXSwgJmtwLCBzaXplb2YoS0VZUEFDS0VUKSk7Ci0JICAgIC8qIFRPRE86IGZpeCB0aGlzISAqLwotCSAgICAvKiBDb252ZXJ0IGJyZWFrIHRvIG1ha2UgY29kZSAqLwotCSAgICBrZXlNb25Qa3RzW2twSGVhZF0uTW9uRmxhZ1dvcmQgJj0gMHg3RkZGOwotCSAgICBrcEhlYWQgPSBrcE5ldzsKLQkgICAgfQotCURvc1JlbGVhc2VNdXRleFNlbShobXR4S2V5QnVmKTsKLQotCS8qIEZpbmFsbHkgd3JpdGUgdGhlIHBhY2tldCAqLwotCXJjID0gRG9zTW9uV3JpdGUoKFBCWVRFKSZtb25PdXRidWYsIChQQllURSkma3AsIGNvdW50KTsKLQlpZiAocmMpIHsKLSNpZmRlZiBDSEVDS0VECi0JICAgIGlmIChiTW9uUnVubmluZykKLQkJcHJpbnRmKCJFcnJvciBpbiBEb3NNb25Xcml0ZSwgcmMgPSAlbGRcbiIsIHJjKTsKLSNlbmRpZgotCSAgICBiTW9uUnVubmluZyA9IEZBTFNFOwotCSAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgKHZvaWQpcGFyYW1zOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfYWJvcnQoCi0gICAgaW50IHNpZ25hbCkKLXsKLSAgICBFVlRfZXhpdCgpOwotICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCi0KLVJFTUFSS1M6Ci1Jbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCi10byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCi10aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCi0KLVdlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKLWV2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9pbml0KAotICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCi17Ci0gICAgdXNob3J0ICBzdGF0OwotCi0gICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KLSAgICBQTV9pbml0KCk7Ci0gICAgRVZULm1vdXNlTW92ZSA9IG1vdXNlTW92ZTsKLSAgICBpbml0RXZlbnRRdWV1ZSgpOwotICAgIG9sZE1vdXNlU3RhdGUgPSAwOwotICAgIG9sZEtleU1lc3NhZ2UgPSAwOwotICAgIG1lbXNldChrZXlVcE1zZywwLHNpemVvZihrZXlVcE1zZykpOwotCi0gICAgLyogT3BlbiB0aGUgbW91c2UgZHJpdmVyLCBhbmQgc2V0IGl0IHVwIHRvIHJlcG9ydCBldmVudHMgaW4gbWlja2V5cyAqLwotICAgIE1vdU9wZW4oTlVMTCwmX0VWVF9oTW91c2UpOwotICAgIHN0YXQgPSAweDdGOwotICAgIE1vdVNldEV2ZW50TWFzaygmc3RhdCxfRVZUX2hNb3VzZSk7Ci0gICAgc3RhdCA9IChNT1VfTk9EUkFXIHwgTU9VX01JQ0tFWVMpIDw8IDg7Ci0gICAgTW91U2V0RGV2U3RhdHVzKCZzdGF0LF9FVlRfaE1vdXNlKTsKLQotICAgIC8qIE9wZW4gdGhlIGtleWJvYXJkIG1vbml0b3IgICovCi0gICAgaWYgKERvc01vbk9wZW4oKFBTWikiS0JEJCIsICZfRVZUX2hLYmRNb24pKQotCVBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBvcGVuIGtleWJvYXJkIG1vbml0b3IhIik7Ci0KLSAgICAvKiBDcmVhdGUgZXZlbnQgc2VtYXBob3JlLCB0aGUgbW9uaXRvciB3aWxsIHBvc3QgaXQgd2hlbiBpdCdzIGluaXRhbGl6ZWQgKi8KLSAgICBpZiAoRG9zQ3JlYXRlRXZlbnRTZW0oTlVMTCwgJmhldlN0YXJ0LCAwLCBGQUxTRSkpCi0JUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBldmVudCBzZW1hcGhvcmUhIik7Ci0KLSAgICAvKiBDcmVhdGUgbXV0ZXggc2VtYXBob3JlIHByb3RlY3RpbmcgdGhlIGtleXBhY2tldCBidWZmZXIgKi8KLSAgICBpZiAoRG9zQ3JlYXRlTXV0ZXhTZW0oTlVMTCwgJmhtdHhLZXlCdWYsIDAsIEZBTFNFKSkKLQlQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gY3JlYXRlIG11dGV4IHNlbWFwaG9yZSEiKTsKLQotICAgIC8qIFN0YXJ0IGtleWJvYXJkIG1vbml0b3IgdGhyZWFkLCB1c2UgMzJLIHN0YWNrICovCi0gICAga2JkTW9uVElEID0gX2JlZ2ludGhyZWFkKF9rYmRNb25UaHJlYWQsIE5VTEwsIDB4ODAwMCwgTlVMTCk7Ci0KLSAgICAvKiBOb3cgYmxvY2sgdW50aWwgdGhlIG1vbml0b3IgdGhyZWFkIGlzIHVwIGFuZCBydW5uaW5nICovCi0gICAgLyogR2l2ZSB0aGUgdGhyZWFkIG9uZSBzZWNvbmQgKi8KLSAgICBEb3NXYWl0RXZlbnRTZW0oaGV2U3RhcnQsIDEwMDApOwotICAgIGlmICghYk1vblJ1bm5pbmcpIHsgIC8qIENoZWNrIHRoZSB0aHJlYWQgaXMgT0sgKi8KLQlEb3NNb25DbG9zZShfRVZUX2hLYmRNb24pOwotCVBNX2ZhdGFsRXJyb3IoIktleWJvYXJkIG1vbml0b3IgdGhyZWFkIGRpZG4ndCBpbml0aWFsaXplISIpOwotCX0KLQotICAgIC8qIENhdGNoIHByb2dyYW0gdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KLSAgICBzaWduYWwoU0lHQUJSVCwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0ZQRSwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0lOVCwgX0VWVF9hYm9ydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1DaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQotc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcwotbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMpCi17Ci0gICAgcmFuZ2VYID0geFJlczsKLSAgICByYW5nZVkgPSB5UmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotTW9kaWZlcyB0aGUgbW91c2UgY29vcmRpbmF0ZXMgYXMgbmVjZXNzYXJ5IGlmIHNjYWxpbmcgdG8gT1MgY29vcmRpbmF0ZXMsCi1hbmQgc2V0cyB0aGUgT1MgbW91c2UgY3Vyc29yIHBvc2l0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9zZXRNb3VzZVBvcyh4LHkpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KLWNhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAotYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3Jlc3VtZSh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIE9TLzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLVN1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KLWRlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfc3VzcGVuZCh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIE9TLzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUV4aXRzIHRoZSBldmVudCBtb2R1bGUgZm9yIHByb2dyYW0gdGVybWluYXRhdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9leGl0KHZvaWQpCi17Ci0gICAgQVBJUkVUICAgcmM7Ci0KLSAgICAvKiBSZXN0b3JlIHNpZ25hbCBoYW5kbGVycyAqLwotICAgIHNpZ25hbChTSUdBQlJULCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHRlBFLCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKLQotICAgIC8qIENsb3NlIHRoZSBtb3VzZSBkcml2ZXIgKi8KLSAgICBNb3VDbG9zZShfRVZUX2hNb3VzZSk7Ci0KLSAgICAvKiBTdG9wIHRoZSBrZXlib2FyZCBtb25pdG9yIHRocmVhZCBhbmQgY2xvc2UgdGhlIG1vbml0b3IgKi8KLSAgICBiTW9uUnVubmluZyA9IEZBTFNFOwotICAgIHJjID0gRG9zS2lsbFRocmVhZChrYmRNb25USUQpOwotI2lmZGVmIENIRUNLRUQKLSAgICBpZiAocmMpCi0JcHJpbnRmKCJEb3NLaWxsVGhyZWFkIGZhaWxlZCwgcmMgPSAlbGRcbiIsIHJjKTsKLSNlbmRpZgotICAgIHJjID0gRG9zTW9uQ2xvc2UoX0VWVF9oS2JkTW9uKTsKLSNpZmRlZiBDSEVDS0VECi0gICAgaWYgKHJjKSB7Ci0JcHJpbnRmKCJEb3NNb25DbG9zZSBmYWlsZWQsIHJjID0gJWxkXG4iLCByYyk7Ci0JfQotI2VuZGlmCi0gICAgRG9zQ2xvc2VFdmVudFNlbShoZXZTdGFydCk7Ci0gICAgRG9zQ2xvc2VNdXRleFNlbShobXR4S2V5QnVmKTsKLSAgICBLYmRGbHVzaEJ1ZmZlcigwKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9tb24uaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhkMzlmYi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IE9TLzIKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1MvMiBrZXlib2FyZCBtb25pdG9yIHN0dWZmLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogTW9uaXRvcnMgc3R1ZmYgKi8KLQotI2RlZmluZSBNT05JVE9SX0RFRkFVTFQgMHgwMDAwCi0jZGVmaW5lIE1PTklUT1JfQkVHSU4gICAgICAgIDEKLSNkZWZpbmUgTU9OSVRPUl9FTkQgICAgICAgICAgMgotCi10eXBlZGVmIFNIQU5ETEUgICBITU9OSVRPUjsKLXR5cGVkZWYgSE1PTklUT1IgKlBITU9OSVRPUjsKLQotdHlwZWRlZiBzdHJ1Y3QgX0tFWVBBQ0tFVCB7Ci0gIFVTSE9SVCAgTW9uRmxhZ1dvcmQ7Ci0gIFVDSEFSICAgWGxhdGVkQ2hhcjsKLSAgVUNIQVIgICBYbGF0ZWRTY2FuOwotICBVQ0hBUiAgIERCQ1NTdGF0dXM7Ci0gIFVDSEFSICAgREJDU1NoaWZ0OwotCi0gIHVuaW9uCi0gIHsKLSAgICBVU0hPUlQgIFNoaWZ0U3RhdGU7Ci0gICAgVVNIT1JUICBMYXllckluZGV4OwotICB9IHU7Ci0KLSAgVUxPTkcgICBNaWxsaXNlY29uZHM7Ci0gIFVTSE9SVCAgS2JkRERGbGFnV29yZDsKLX0gS0VZUEFDS0VUOwotCi10eXBlZGVmIHN0cnVjdCBfTUxOUEFDS0VUIHsKLSAgVVNIT1JUICBNb25GbGFnV29yZDsKLSAgVVNIT1JUICBJT0NUTDsKLSAgVVNIT1JUICBDUElkOwotICBVU0hPUlQgIENQSW5kZXg7Ci0gIFVMT05HICAgUmVzZXJ2ZWQ7Ci0gIFVTSE9SVCAgS2JkRERGbGFnV29yZDsKLX0gTUxOUEFDS0VUOwotCi0vKiBEQkNTU3RhdHVzICovCi0KLSNkZWZpbmUgU0ZfU0hJRlRTICAgICAgICAgICAgICAxICAvKiBJZiBzZXQgdG8gMSwgc2hpZnQgc3RhdHVzIHJldHVybmVkIHdpdGhvdXQgYSBjaGFyYWN0ZXIgKi8KLSNkZWZpbmUgU0ZfTk9UQ0hBUiAgICAgICAgICAgICAyICAvKiAwIC0gU2NhbiBjb2RlIGlzIGEgY2hhcmFjdGVyICovCi0JCQkJICAvKiAxIC0gU2NhbiBjb2RlIGlzIG5vdCBhIGNoYXJhY3RlcjsgKi8KLQkJCQkgIC8qICAgICBpbnN0ZWFkIGl0IGlzIGFuIGV4dGVuZGVkIGtleSBjb2RlIGZyb20gdGhlIGtleWJvYXJkLiAqLwotI2RlZmluZSBTRl9JTU1FRElBVEUgICAgICAgICAgMzIgIC8qIElmIHNldCB0byAxLCBpbW1lZGlhdGUgY29udmVyc2lvbiByZXF1ZXN0ZWQgKi8KLSNkZWZpbmUgU0ZfVFlQRU1BU0sgICAgICAgICAgMTkyICAvKiBIYXMgdGhlIGZvbGxvd2luZyB2YWx1ZXM6ICovCi0JCQkJICAvKiAwMCAtIFVuZGVmaW5lZCAqLwotCQkJCSAgLyogMDEgLSBGaW5hbCBjaGFyYWN0ZXI7IGludGVyaW0gY2hhcmFjdGVyIGZsYWcgaXMgdHVybmVkIG9mZiAqLwotCQkJCSAgLyogMTAgLSBJbnRlcmltIGNoYXJhY3RlciAqLwotCQkJCSAgLyogMTEgLSBGaW5hbCBjaGFyYWN0ZXI7IGludGVyaW0gY2hhcmFjdGVyIGZsYWcgaXMgdHVybmVkIG9uLiAqLwotLyogTW9uRmxhZ1dvcmQgKi8KLQotI2RlZmluZSBNRl9PUEVOICAgICAgICAgICAgICAgIDEgIC8qIG9wZW4gKi8KLSNkZWZpbmUgTUZfQ0xPU0UgICAgICAgICAgICAgICAyICAvKiBjbG9zZSAqLwotI2RlZmluZSBNRl9GTFVTSCAgICAgICAgICAgICAgIDQgIC8qIGlzIGZsdXNoIHBhY2tldCAqLwotCi0vKiBLYmREREZsYWdXb3JkICovCi0KLSNkZWZpbmUgS0ZfTk9UU1FQQUNLRVQgICAgICAxMDI0ICAvKiBEb24ndCBwdXQgdGhpcyBwYWNrZXQgaW4gU1EgYnVmZmVyICovCi0jZGVmaW5lIEtGX0FDQ0VOVEVES0VZICAgICAgIDUxMiAgLyogS2V5IHdhcyB0cmFuc2xhdGVkIHVzaW5nIHByZXZpb3VzIGFjY2VudC4gKi8KLSNkZWZpbmUgS0ZfTVVMVElNQUtFICAgICAgICAgMjU2ICAvKiBLZXkgd2FzIHJlcGVhdGVkIG1ha2Ugb2YgYSB0b2dnbGUga2V5LiAqLwotI2RlZmluZSBLRl9TRUNPTkRBUllLRVkgICAgICAxMjggIC8qIFByZXZpb3VzIHNjYW4gY29kZSB3YXMgdGhlIEUwIHByZWZpeCBjb2RlLiAqLwotI2RlZmluZSBLRl9LRVlCUkVBSyAgICAgICAgICAgNjQgIC8qIFRoaXMgaXMgdGhlIGJyZWFrIG9mIHRoZSBrZXkuICovCi0jZGVmaW5lIEtGX0tFWVRZUEVNQVNLICAgICAgICA2MyAgLyogSXNvbGF0ZXMgdGhlIEtleSBUeXBlIGZpZWxkIG9mIERERmxhZ3MuICovCi0jZGVmaW5lIEtGX1VOREVGS0VZICAgICAgICAgICA2MyAgLyogS2V5IHBhY2tldCBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgS0ZfU1lTUkVRS0VZICAgICAgICAgIDIzICAvKiBUaGlzIGtleSBwYWNrZXQgaXMgdGhlIFN5c1JlcSBrZXkgKDQ5OTApICovCi0jZGVmaW5lIEtGX1BSSU5URkxVU0hLRVkgICAgICAyMiAgLyogVGhpcyBwYWNrZXQgaXMgQ3QtQWx0LVBydFNjciAqLwotI2RlZmluZSBLRl9QU1BSSU5URUNIT0tFWSAgICAgMjEgIC8qIFRoaXMgcGFja2V0IGlzIEN0bC1QICovCi0jZGVmaW5lIEtGX1BSSU5URUNIT0tFWSAgICAgICAyMCAgLyogVGhpcyBwYWNrZXQgaXMgQ3RsLVBydFNjciAqLwotI2RlZmluZSBLRl9QUlRTQ1JLRVkgICAgICAgICAgMTkgIC8qIFRoaXMgcGFja2V0IGlzIFBydFNjciAqLwotI2RlZmluZSBLRl9QU0JSRUFLS0VZICAgICAgICAgMTggIC8qIFRoaXMgcGFja2V0IGlzIEN0bC1DICovCi0jZGVmaW5lIEtGX0JSRUFLS0VZICAgICAgICAgICAxNyAgLyogVGhpcyBwYWNrZXQgaXMgQ3RsLUJyZWFrICovCi0jZGVmaW5lIEtGX0FDQ0VOVEtFWSAgICAgICAgICAxNiAgLyogVGhpcyBwYWNrZXQgaXMgYW4gYWNjZW50IGtleSAqLwotI2RlZmluZSBLRl9YUk9SUE5PVCAgICAgICAgICAgMTMgIC8qIFRoaXMgcGFja2V0IGlzIGEgUmVhZCBvciBQZWVrIE5vdGlmaWNhdGlvbiBQY3QuICovCi0jZGVmaW5lIEtGX01MTk9USUZJQ0FUSU9OICAgICAxNCAgLyogcGFja2V0IGlzIGEgTXVsdGktTGF5ZXIgTkxTIHBhY2tldCAqLwotI2RlZmluZSBLRl9IT1RLRVlQQUNLRVQgICAgICAgMTIgIC8qIFRoaXMgcGFja2V0IGlzIHRoZSBob3Qga2V5LiAqLwotI2RlZmluZSBLRl9CQURLRVlDT01CTyAgICAgICAgMTEgIC8qIEFjY2VudC9jaGFyIGNvbWJvIHVuZGVmaW5lZCwgYmVlcCBvbmx5LiAqLwotI2RlZmluZSBLRl9XQUtFVVBLRVkgICAgICAgICAgMTAgIC8qIFRoaXMgcGFja2V0IGlzIG9uZSBmb2xsb3dpbmcgUEFVU0VLRVkgKi8KLSNkZWZpbmUgS0ZfUFNQQVVTRUtFWSAgICAgICAgICA5ICAvKiBUaGlzIHBhY2tldCBpcyBDdGwtUyAqLwotI2RlZmluZSBLRl9QQVVTRUtFWSAgICAgICAgICAgIDggIC8qIFRoaXMgcGFja2V0IGlzIEN0bC1OdW1sb2NrIG9yIFBBVVNFICovCi0jZGVmaW5lIEtGX1NISUZUTUFTSyAgICAgICAgICAgNyAgLyogS2V5IGlzIGEgc2hpZnQgS2V5ICovCi0jZGVmaW5lIEtGX0RVTVBLRVkgICAgICAgICAgICAgNiAgLyogVGhpcyBwYWNrZXQgaXMgQ3RsLU51bWxvY2stTnVtTG9jayAqLwotI2RlZmluZSBLRl9SRUJPT1RLRVkgICAgICAgICAgIDUgIC8qIFRoaXMgcGFja2V0IGlzIEN0bC1BbHQtRGVsICovCi0jZGVmaW5lIEtGX1JFU0VORENPREUgICAgICAgICAgNCAgLyogVGhpcyBwYWNrZXQgaXMgcmVzZW5kIGNvZGUgZnJvbSBjb250cm9sbGVyICovCi0jZGVmaW5lIEtGX09WRVJSVU5DT0RFICAgICAgICAgMyAgLyogVGhpcyBwYWNrZXQgaXMgb3ZlcnJ1biBjb2RlIGZyb20gY29udHJvbGxlciAqLwotI2RlZmluZSBLRl9TRUNQUkVGSVhDT0RFICAgICAgIDIgIC8qIFRoaXMgcGFja2V0IGlzIEUwL0UxIHNjYW4gY29kZSAqLwotI2RlZmluZSBLRl9BQ0tDT0RFICAgICAgICAgICAgIDEgIC8qIFRoaXMgcGFja2V0IGlzIGFjayBjb2RlIGZyb20ga2V5Ym9hcmQgKi8KLQotCi10eXBlZGVmIHN0cnVjdCBfTU9OQlVGIHsKLSAgVVNIT1JUICAgIGNiOwotICBLRVlQQUNLRVQgQnVmZmVyOwotICBCWVRFICAgICAgUmVzZXJ2ZWRbMjBdOwotfSBNT05CVUY7Ci0KLSNkZWZpbmUgUlNfU1lTUkVHICAgICAgMzI3NjggIC8qIEJpdCAxNSAgU3lzUmVxIGtleSBkb3duICovCi0jZGVmaW5lIFJTX0NBUFNMT0NLICAgIDE2Mzg0ICAvKiBCaXQgMTQgIENhcHMgTG9jayBrZXkgZG93biAqLwotI2RlZmluZSBSU19OVU1MT0NLICAgICAgODE5MiAgLyogQml0IDEzICBOdW1Mb2NrIGtleSBkb3duICovCi0jZGVmaW5lIFJTX1NDUk9MTExPQ0sgICA0MDk2ICAvKiBCaXQgMTIgIFNjcm9sbCBMb2NrIGtleSBkb3duICovCi0jZGVmaW5lIFJTX1JBTFQgICAgICAgICAyMDQ4ICAvKiBCaXQgMTEgIFJpZ2h0IEFsdCBrZXkgZG93biAqLwotI2RlZmluZSBSU19SQ09OVFJPTCAgICAgMTAyNCAgLyogQml0IDEwICBSaWdodCBDdHJsIGtleSBkb3duICovCi0jZGVmaW5lIFJTX0xBTFQgICAgICAgICAgNTEyICAvKiBCaXQgIDkgIExlZnQgQWx0IGtleSBkb3duICovCi0jZGVmaW5lIFJTX0xDT05UUk9MICAgICAgMjU2ICAvKiBCaXQgIDggIExlZnQgQ3RybCBrZXkgZG93biAqLwotI2RlZmluZSBSU19JTlNFUlQgICAgICAgIDEyOCAgLyogQml0ICA3ICBJbnNlcnQgb24gKi8KLSNkZWZpbmUgUlNfQ0FQUyAgICAgICAgICAgNjQgIC8qIEJpdCAgNiAgQ2FwcyBMb2NrIG9uICovCi0jZGVmaW5lIFJTX05VTSAgICAgICAgICAgIDMyICAvKiBCaXQgIDUgIE51bUxvY2sgb24gKi8KLSNkZWZpbmUgUlNfU0NST0xMICAgICAgICAgMTYgIC8qIEJpdCAgNCAgU2Nyb2xsIExvY2sgb24gKi8KLSNkZWZpbmUgUlNfQUxUICAgICAgICAgICAgIDggIC8qIEJpdCAgMyAgRWl0aGVyIEFsdCBrZXkgZG93biAqLwotI2RlZmluZSBSU19DT05UUk9MICAgICAgICAgNCAgLyogQml0ICAyICBFaXRoZXIgQ3RybCBrZXkgZG93biAqLwotI2RlZmluZSBSU19MU0hJRlQgICAgICAgICAgMiAgLyogQml0ICAxICBMZWZ0IFNoaWZ0IGtleSBkb3duICovCi0jZGVmaW5lIFJTX1JTSElGVCAgICAgICAgICAxICAvKiBCaXQgIDAgIFJpZ2h0IFNoaWZ0IGtleSBkb3duICovCi0KLQotI2RlZmluZSBDU19SQ09OVFJPTCAgICAgOTEgICAgLyogUmlnaHQgQ29udHJvbCAqLwotI2RlZmluZSBDU19MU0hJRlQgICAgICAgNDIgICAgLyogTGVmdCBTaGlmdCAqLwotI2RlZmluZSBDU19SU0hJRlQgICAgICAgNTQgICAgLyogUmlnaHQgU2hpZnQgKi8KLSNkZWZpbmUgQ1NfTEFMVCAgICAgICAgIDU2ICAgIC8qIExlZnQgQWx0ICovCi0jZGVmaW5lIENTX1JBTFQgICAgICAgICA5NCAgICAvKiBSaWdodCBBbHQgKi8KLQotCi0vKiBEb3NNb24qIHByb3RvdHlwZXMgKi8KLSNpZmRlZiBfX0VNWF9fCi0gICAgI2RlZmluZSAgQVBJUkVUMTYgICAgICAgIFVTSE9SVAotICAgICNkZWZpbmUgIEFQSUVOVFJZMTYKLSNlbHNlCi0gICAgI2RlZmluZSAgRG9zTW9uT3BlbiAgICAgIERPUzE2TU9OT1BFTgotICAgICNkZWZpbmUgIERvc01vbkNsb3NlICAgICBET1MxNk1PTkNMT1NFCi0gICAgI2RlZmluZSAgRG9zTW9uUmVnICAgICAgIERPUzE2TU9OUkVHCi0gICAgI2RlZmluZSAgRG9zTW9uUmVhZCAgICAgIERPUzE2TU9OUkVBRAotICAgICNkZWZpbmUgIERvc01vbldyaXRlICAgICBET1MxNk1PTldSSVRFCi0gICAgI2RlZmluZSAgRG9zR2V0SW5mb1NlZyAgIERPUzE2R0VUSU5GT1NFRwotI2VuZGlmCi0KLUFQSVJFVDE2IEFQSUVOVFJZMTYgRG9zTW9uT3BlbiAgIChQU1ogcHN6RGV2TmFtZSwgUEhNT05JVE9SIHBobW9uKTsKLUFQSVJFVDE2IEFQSUVOVFJZMTYgRG9zTW9uQ2xvc2UgIChITU9OSVRPUiBobW9uKTsKLUFQSVJFVDE2IEFQSUVOVFJZMTYgRG9zTW9uUmVnICAgIChITU9OSVRPUiBobW9uLCBNT05CVUYgKnBiSW5CdWYsIC8qTU9OQlVGKi9VTE9ORyAqcGJPdXRCdWYsIFVTSE9SVCBmUG9zaXRpb24sIFVTSE9SVCB1c0luZGV4KTsKLUFQSVJFVDE2IEFQSUVOVFJZMTYgRG9zTW9uUmVhZCAgIChQQllURSBwYkluQnVmLCBVU0hPUlQgZldhaXQsIFBCWVRFIHBiRGF0YUJ1ZiwgUFVTSE9SVCBwY2JEYXRhKTsKLUFQSVJFVDE2IEFQSUVOVFJZMTYgRG9zTW9uV3JpdGUgIChQQllURSBwYk91dEJ1ZiwgUEJZVEUgcGJEYXRhQnVmLCBVU0hPUlQgY2JEYXRhKTsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL29zaGRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YWExYzYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgT1MvMgotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIElOQ0xfRE9TUFJPRklMRQotI2RlZmluZSBJTkNMX0RPU0VSUk9SUwotI2RlZmluZSBJTkNMX0RPUwotI2RlZmluZSBJTkNMX1NVQgotI2RlZmluZSBJTkNMX1ZJTwotI2RlZmluZSBJTkNMX0tCRAotI2luY2x1ZGUgPG9zMi5oPgotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLSNpbmNsdWRlICJvczIvbW9uLmgiCi0KLXZvaWQgX19QTV9jaGVja0NvbnNvbGVTd2l0Y2godm9pZCk7CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9wbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTZlZWFkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9wbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgT1MvMgotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAotKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQotKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKLSogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAotKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCi0jaW5jbHVkZSAicG1faGVscC5oIgotI2luY2x1ZGUgIm10cnIuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLSNpZm5kZWYgX19FTVhfXwotI2luY2x1ZGUgPGRpcmVjdC5oPgotI2VuZGlmCi0jZGVmaW5lIElOQ0xfRE9TRVJST1JTCi0jZGVmaW5lIElOQ0xfRE9TCi0jZGVmaW5lIElOQ0xfU1VCCi0jZGVmaW5lIElOQ0xfVklPCi0jZGVmaW5lIElOQ0xfS0JECi0jaW5jbHVkZSA8b3MyLmg+Ci0KLS8qIFNlbWFwaG9yZSBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIG91ciBiYWNrZ3JvdW5kIGRhZW1vbiAqLwotI2RlZmluZSBTSEFSRURTRU0gICAoKFBTWikiXFxTRU0zMlxcU0REXFxEQUVNT04iKQotI2RlZmluZSBEQUVNT05fTkFNRSAiU0REREFFTU4uRVhFIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBQdWJsaWMgc3RydWN0dXJlcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggVklERU9QTUkgZm9yIGltcGxlbWVudGluZwotICogdGhlIGFiaWxpdHkgdG8gY2FsbCB0aGUgcmVhbCBtb2RlIEJJT1MgZnVuY3Rpb25zLgotICovCi0KLXR5cGVkZWYgc3RydWN0IF9WSURFT01PREVJTkZPIHsKLSAgICBVTE9ORyAgIG1pTW9kZUlkOwotICAgIFVTSE9SVCAgdXNUeXBlOwotICAgIFVTSE9SVCAgdXNJbnQxME1vZGVTZXQ7Ci0gICAgVVNIT1JUICB1c1hSZXNvbHV0aW9uOwotICAgIFVTSE9SVCAgdXNZUmVzb2x1dGlvbjsKLSAgICBVTE9ORyAgIHVsQnVmZmVyQWRkcmVzczsKLSAgICBVTE9ORyAgIHVsQXBlcnR1cmVTaXplOwotICAgIEJZVEUgICAgYkJpdHNQZXJQaXhlbDsKLSAgICBCWVRFICAgIGJCaXRQbGFuZXM7Ci0gICAgQllURSAgICBiWENoYXJTaXplOwotICAgIEJZVEUgICAgYllDaGFyU2l6ZTsKLSAgICBVU0hPUlQgIHVzQnl0ZXNQZXJTY2FuTGluZTsKLSAgICBVU0hPUlQgIHVzVGV4dFJvd3M7Ci0gICAgVUxPTkcgICB1bFBhZ2VMZW5ndGg7Ci0gICAgVUxPTkcgICB1bFNhdmVTaXplOwotICAgIEJZVEUgICAgYlZydFJlZnJlc2g7Ci0gICAgQllURSAgICBiSHJ0UmVmcmVzaDsKLSAgICBCWVRFICAgIGJWcnRQb2xQb3M7Ci0gICAgQllURSAgICBiSHJ0UG9sUG9zOwotICAgIENIQVIgICAgYlJlZE1hc2tTaXplOwotICAgIENIQVIgICAgYlJlZEZpZWxkUG9zaXRpb247Ci0gICAgQ0hBUiAgICBiR3JlZW5NYXNrU2l6ZTsKLSAgICBDSEFSICAgIGJHcmVlbkZpZWxkUG9zaXRpb247Ci0gICAgQ0hBUiAgICBiQmx1ZU1hc2tTaXplOwotICAgIENIQVIgICAgYkJsdWVGaWVsZFBvc2l0aW9uOwotICAgIENIQVIgICAgYlJzdmRNYXNrU2l6ZTsKLSAgICBDSEFSICAgIGJSc3ZkRmllbGRQb3NpdGlvbjsKLSAgICBVTE9ORyAgIHVsQ29sb3JzOwotICAgIFVMT05HICAgdWxSZXNlcnZlZFszXTsKLSAgICB9IFZJREVPTU9ERUlORk8sIEZBUiAqUFZJREVPTU9ERUlORk87Ci0KLXR5cGVkZWYgc3RydWN0IF9BREFQVEVSSU5GTyB7Ci0gICAgVUxPTkcgICAgICAgdWxBZGFwdGVySUQ7Ci0gICAgQ0hBUiAgICAgICAgc3pPRU1TdHJpbmdbMTI4XTsKLSAgICBDSEFSICAgICAgICBzekRBQ1N0cmluZ1sxMjhdOwotICAgIENIQVIgICAgICAgIHN6UmV2aXNpb25bMTI4XTsKLSAgICBVTE9ORyAgICAgICB1bFRvdGFsTWVtb3J5OwotICAgIFVMT05HICAgICAgIHVsTU1JT0Jhc2VBZGRyZXNzOwotICAgIFVMT05HICAgICAgIHVsUElPQmFzZUFkZHJlc3M7Ci0gICAgQllURSAgICAgICAgYkJ1c1R5cGU7Ci0gICAgQllURSAgICAgICAgYkVuZGlhbjsKLSAgICBVU0hPUlQgICAgICB1c0RldmljZUJ1c0lEOwotICAgIFVTSE9SVCAgICAgIHVzVmVuZG9yQnVzSUQ7Ci0gICAgVVNIT1JUICAgICAgU2xvdElEOwotICAgIH0gQURBUFRFUklORk8sIEZBUiAqUEFEQVBURVJJTkZPOwotCi10eXBlZGVmIHN0cnVjdCBfVklERU9fQURBUFRFUiB7Ci0gICAgdm9pZCAgICAgICAgICAgICpodmlkZW87Ci0gICAgQURBUFRFUklORk8gICAgIEFkYXB0ZXI7Ci0gICAgVklERU9NT0RFSU5GTyAgIE1vZGVJbmZvOwotICAgIH0gVklERU9fQURBUFRFUiwgRkFSICpQVklERU9fQURBUFRFUjsKLQotLyogUE1JUkVRVUVTVF9TT0ZUV0FSRUlOVCBzdHJ1Y3R1cmVzIGZyb20gT1MvMiBEREsgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVMT05HIHVsRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVkRNIGluaXRpYWxpemF0aW9uIHR5cGUgKi8KLSNkZWZpbmUgVkRNX1BPU1RMT0FEICAgICAgICAgICAgICAgICAgICAweDEgICAgIC8qIGFkYXB0ZXIganVzdCBsb2FkZWQsIHVzZWQgaW50ZXJuYWxseSBmb3IgaW5pdGlhbGl6YXRpb24gKi8KLSNkZWZpbmUgVkRNX0lOSVRJQUxJWkUgICAgICAgICAgICAgICAgICAweDIgICAgIC8qIGZvcmNlIGluaXRpYWxpemF0aW9uIG9mIGEgcGVybWFuZW50bHkgb3BlbiBWRE0sIGV2ZW4gaWYgcHJldmlvdXNseSBpbml0aWFsaXplZCAqLwotI2RlZmluZSBWRE1fVEVSTUlOQVRFX1BPU1RJTklUSUFMSVpFICAgIDB4NiAgICAgLypzdGFydCBWRE0gd2l0aCBpbml0aWFsaXphdGlvbiwgYnV0IGNsb3NlIGl0IGFmdGVyd2FyZHMgKGluY2x1ZGVzIFZETV9JTklUSUFMSVpFKSAqLwotI2RlZmluZSBWRE1fUVVFUllfQ0FQQUJJTElUWSAgICAgICAgICAgIDB4MTAgICAgLyogcXVlcnkgdGhlIGN1cnJlbnQgaW50IDEwIGNhcGFiaWxpdHkgKi8KLSNkZWZpbmUgVkRNX0ZVTExfVkRNX0NSRUFURUQgICAgICAgICAgICAweDIwICAgIC8qIGEgZnVsbCBWRE0gaXMgY3JlYXRlZCAqLwotI2RlZmluZSBWRE1fTUlOSV9WRE1fQ1JFQVRFRCAgICAgICAgICAgIDB4NDAgICAgLyogYSBtaW5pIFZETSBpcyBjcmVhdGVkICovCi0jZGVmaW5lIFZETV9NSU5JX1ZETV9TVVBQT1JURUQgICAgICAgICAgMHg4MCAgICAvKiBtaW5pIFZETSBzdXBwb3J0IGlzIGF2YWlsYWJsZSAqLwotICAgIFBDSEFSIHN6TmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVkRNIGluaXRpYWxpemF0aW9uIHByb2dyYW0gKi8KLSAgICBQQ0hBUiBzekFyZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZETSBpbml0aWFsaXphdGlvbiBhcmd1bWVudHMgKi8KLSAgICB9SU5JVFZETTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIEJZVEUgYkJ1ZmZlclR5cGU7Ci0jZGVmaW5lIEJVRkZFUl9OT05FICAgICAwCi0jZGVmaW5lIElOUFVUX0JVRkZFUiAgICAxCi0jZGVmaW5lIE9VVFBVVF9CVUZGRVIgICAyCi0gICAgQllURSBiUmVzZXJ2ZWQ7Ci0gICAgQllURSBiU2VsQ1JGOwotICAgIEJZVEUgYk9mZkNSRjsKLSAgICBQVk9JRCBwQWRkcmVzczsKLSAgICBVTE9ORyB1bFNpemU7Ci0gICAgfSBCVUZGRVIsICpQQlVGRkVSOwotCi10eXBlZGVmIHN0cnVjdCB2Y3JmX3MgewotICAgIFVMT05HIHJlZ19lYXg7Ci0gICAgVUxPTkcgcmVnX2VieDsKLSAgICBVTE9ORyByZWdfZWN4OwotICAgIFVMT05HIHJlZ19lZHg7Ci0gICAgVUxPTkcgcmVnX2VicDsKLSAgICBVTE9ORyByZWdfZXNpOwotICAgIFVMT05HIHJlZ19lZGk7Ci0gICAgVUxPTkcgcmVnX2RzOwotICAgIFVMT05HIHJlZ19lczsKLSAgICBVTE9ORyByZWdfZnM7Ci0gICAgVUxPTkcgcmVnX2dzOwotICAgIFVMT05HIHJlZ19jczsKLSAgICBVTE9ORyByZWdfZWlwOwotICAgIFVMT05HIHJlZ19lZmxhZzsKLSAgICBVTE9ORyByZWdfc3M7Ci0gICAgVUxPTkcgcmVnX2VzcDsKLSAgICB9IFZDUkY7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBVTE9ORyAgIHVsQklPU0ludE5vOwotICAgIFZDUkYgICAgYUNSRjsKLSAgICBCVUZGRVIgIHBCWzJdOwotICAgIH0gSU5UQ1JGOwotCi0jZGVmaW5lIFBNSVJFUVVFU1RfTE9BRFBNSUZJTEUgICAgICAgICAgMjEKLSNkZWZpbmUgUE1JUkVRVUVTVF9JREVOVElGWUFEQVBURVIgICAgICAyMgotI2RlZmluZSBQTUlSRVFVRVNUX1NPRlRXQVJFSU5UICAgICAgICAgIDIzCi0KLSNpZmRlZiAgUFRSX0RFQ0xfSU5fRlJPTlQKLSNkZWZpbmUgRVhQRU5UUllQICAgKiBFWFBFTlRSWQotI2Vsc2UKLSNkZWZpbmUgRVhQRU5UUllQICAgRVhQRU5UUlkgKgotI2VuZGlmCi0KLS8qIEVudHJ5IHBvaW50IHRvIFZJREVPUE1JMzJSZXF1ZXN0LiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGJ5IGV4dGVybmFsCi0gKiBjb2RlIHRoYXQgaGFzIGFscmVhZHkgbG9hZGVkIFZJREVPUE1JIHRvIGF2b2lkIGxvYWRpbmcgaXQgdHdpY2UuCi0gKi8KLQotQVBJUkVUIChFWFBFTlRSWVAgUE1fVklERU9QTUkzMlJlcXVlc3QpKFBWSURFT19BREFQVEVSLCBVTE9ORywgUFZPSUQsIFBWT0lEKSA9IE5VTEw7Ci1zdGF0aWMgaWJvb2wgICAgICAgIGhhdmVJbnQxMCA9IC0xOyAvKiBUcnVlIGlmIHdlIGhhdmUgSW50IDEwIHN1cHBvcnQgICAqLwotc3RhdGljIGlib29sICAgICAgICB1c2VWUE1JID0gdHJ1ZTsgLyogRmFsc2UgaWYgVklERU9QTUkgdW5hdmFpbGFibGUgICAgKi8KLXN0YXRpYyBWSURFT19BREFQVEVSIEFkYXB0ZXI7ICAgICAgIC8qIFZpZGVvIGFkYXB0ZXIgZm9yIFZJREVPUE1JICAgICAgICovCi1zdGF0aWMgdWNoYXIgICAgICAgIFJNQnVmWzEwMjRdOyAgICAvKiBGYWtlIHJlYWwgbW9kZSB0cmFuc2ZlciBidWZmZXIgICAqLwotc3RhdGljIHVpbnQgICAgICAgICBWRVNBQnVmX2xlbiA9IDEwMjQ7LyogTGVuZ3RoIG9mIHRoZSBWRVNBQnVmIGJ1ZmZlciAgKi8KLXN0YXRpYyB2b2lkICAgICAgICAgKlZFU0FCdWZfcHRyID0gTlVMTDsvKiBOZWFyIHBvaW50ZXIgdG8gVkVTQUJ1ZiAgICAgICovCi1zdGF0aWMgdWludCAgICAgICAgIFZFU0FCdWZfcnNlZzsgICAvKiBSZWFsIG1vZGUgc2VnbWVudCBvZiBWRVNBQnVmICAgICAqLwotc3RhdGljIHVpbnQgICAgICAgICBWRVNBQnVmX3JvZmY7ICAgLyogUmVhbCBtb2RlIG9mZnNldCBvZiBWRVNBQnVmICAgICAgKi8KLXN0YXRpYyB1Y2hhciAqICAgICAgbG93TWVtID0gTlVMTDsKLXN0YXRpYyBpYm9vbCAgICAgICAgaXNTZXNzaW9uU3dpdGNoaW5nID0gZmFsc2U7Ci1zdGF0aWMgdWxvbmcgICAgICAgIHBhcm1zSW5bNF07ICAgICAvKiBNdXN0IG5vdCBjcm9zcyA2NEtiIGJvdW5kYXJ5ISAgICAqLwotc3RhdGljIHVsb25nICAgICAgICBwYXJtc091dFs0XTsgICAgLyogTXVzdCBub3QgY3Jvc3MgNjRLYiBib3VuZGFyeSEgICAgKi8KLWV4dGVybiB1c2hvcnQgICAgICAgX1BNX2dkdDsKLXN0YXRpYyB2b2lkIChQTUFQSVAgZmF0YWxFcnJvckNsZWFudXApKHZvaWQpID0gTlVMTDsKLQotLyogRG9zU3lzQ3RsIHByb3RvdHlwZS4gSXQgaXMgbm90IGRlY2xhcmVkIGluIHRoZSBoZWFkZXJzIGJ1dCBpdCBpcyBpbiB0aGUKLSAqIHN0YW5kYXJkIGltcG9ydCBsaWJyYXJpZXMgKERPU0NBTExTLjg3NikuIEZ1bm55LgotICovCi1BUElSRVQgQVBJRU5UUlkgRG9zU3lzQ3RsKFVMT05HIHVsRnVuY3Rpb24sIFBWT0lEIHB2RGF0YSk7Ci0KLS8qIFRoaXMgaXMgdGhlIHN0YWNrIHNpemUgZm9yIHRoZSB0aHJlYWRzIHRoYXQgdHJhY2sgdGhlIHNlc3Npb24gc3dpdGNoIGV2ZW50ICovCi0jZGVmaW5lIFNFU1NJT05fU1dJVENIX1NUQUNLX1NJWkUgICAzMjc2OAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVklPTU9ERUlORk8gICAgIHZtaTsKLSAgICBVU0hPUlQgICAgICAgICAgQ3Vyc29yWDsKLSAgICBVU0hPUlQgICAgICAgICAgQ3Vyc29yWTsKLSAgICBVQ0hBUiAgICAgICAgICAgRnJhbWVCdWZmZXJbMV07Ci0gICAgfSBDT05TT0xFX1NBVkU7Ci0KLXR5cGVkZWYgc3RydWN0IF9TRVNXSVRDSFJFQyB7Ci0gICAgLyogVGhlIGZvbGxvd2luZyB2YXJpYWJsZSBpcyB2b2xhdGlsZSBiZWNhdXNlIG9mIFBNX1NVU1BFTkRfQVBQICAgICAgICAgKi8KLSAgICB2b2xhdGlsZSBpbnQgICAgRmxhZ3M7ICAgICAgICAgIC8qIC0xIG9yIFBNX0RFQUNUSVZBVEUgb3IgUE1fUkVBQ1RJVkFURSAqLwotICAgIFBNX3NhdmVTdGF0ZV9jYiBDYWxsYmFjazsgICAgICAgLyogU2F2ZS9yZXN0b3JlIGNvbnRleHQgY2FsbGJhY2sgICAgICAgICovCi0gICAgSE1UWCAgICAgICAgICAgIE11dGV4OyAgICAgICAgICAvKiBFeGNsdXNpdmUgYWNjZXNzIG11dGV4ICAgICAgICAgICAgICAgKi8KLSAgICBIRVYgICAgICAgICAgICAgRXZlbnQ7ICAgICAgICAgIC8qIFBvc3RlZCBhZnRlciBjYWxsYmFjayBpcyBjYWxsZWQgICAgICAqLwotICAgIH0gU0VTV0lUQ0hSRUM7Ci0KLS8qIFBhZ2Ugc2l6ZWQgYmxvY2sgY2FjaGUgKi8KLQotI2RlZmluZSBQQUdFU19QRVJfQkxPQ0sgICAgIDMyCi0jZGVmaW5lIFBBR0VfQkxPQ0tfU0laRSAgICAgKFBBR0VTX1BFUl9CTE9DSyAqIFBNX1BBR0VfU0laRSArIChQTV9QQUdFX1NJWkUtMSkgKyBzaXplb2YocGFnZWJsb2NrKSkKLSNkZWZpbmUgRlJFRUxJU1RfTkVYVChwKSAgICAoKih2b2lkKiopKHApKQotdHlwZWRlZiBzdHJ1Y3QgcGFnZWJsb2NrIHsKLSAgICBzdHJ1Y3QgcGFnZWJsb2NrICAgICpuZXh0OwotICAgIHN0cnVjdCBwYWdlYmxvY2sgICAgKnByZXY7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAqZnJlZUxpc3RTdGFydDsKLSAgICB2b2lkICAgICAgICAgICAgICAgICpmcmVlTGlzdDsKLSAgICB2b2lkICAgICAgICAgICAgICAgICpmcmVlTGlzdEVuZDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGZyZWVDb3VudDsKLSAgICBQTV9sb2NrSGFuZGxlICAgICAgIGxvY2tIYW5kbGU7Ci0gICAgfSBwYWdlYmxvY2s7Ci0KLXN0YXRpYyBwYWdlYmxvY2sgICAgKnBhZ2VCbG9ja3MgPSBOVUxMOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWZ1bmMgICAgICAgIC0gSGVscGVyIGRldmljZSBkcml2ZXIgZnVuY3Rpb24gdG8gY2FsbAotCi1SRVRVUk5TOgotRmlyc3QgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGRldmljZSBkcml2ZXIgaW4gcGFybXNPdXRbMF0KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIG9wZW4gb3VyIGhlbHBlciBkZXZpY2UgZHJpdmVyLCBjYWxsIGl0IGFuZCBjbG9zZSB0aGUgZmlsZQotaGFuZGxlLiBOb3RlIHRoYXQgd2UgaGF2ZSB0byBvcGVuIHRoZSBkZXZpY2UgZHJpdmVyIGZvciBldmVyeSBjYWxsIGJlY2F1c2UKLW9mIHR3byBwcm9ibGVtczoKLQotIDEuIFdlIGNhbm5vdCBvcGVuIGEgc2luZ2xlIGZpbGUgaGFuZGxlIGluIGEgRExMIHRoYXQgaXMgc2hhcmVkIGFtb25nc3QKLSAgICBwcm9ncmFtcywgc2luY2UgZXZlcnkgcHJvY2VzcyBtdXN0IGhhdmUgaXQncyBvd24gb3BlbiBmaWxlIGhhbmRsZS4KLQotIDIuIEZvciBzb21lIHJlYXNvbiB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgbGltaXQgb2YgYWJvdXQgMTIgb3BlbiBmaWxlCi0gICAgaGFuZGxlcyBvbiBhIGRldmljZSBkcml2ZXIgaW4gdGhlIHN5c3RlbS4gSGVuY2Ugd2hlbiB3ZSBvcGVuIG1vcmUKLSAgICB0aGFuIGFib3V0IDEyIGZpbGUgaGFuZGxlcyB0aGluZ3Mgc3RhcnQgdG8gZ28gdmVyeSBzdHJhbmdlLgotCi1IZW5jZSB3ZSBzaW1wbHkgb3BlbiB0aGUgZmlsZSBoYW5kbGUgZXZlcnkgdGltZSB0aGF0IHdlIG5lZWQgdG8gY2FsbCB0aGUKLWRldmljZSBkcml2ZXIgdG8gd29yayBhcm91bmQgdGhlc2UgcHJvYmxlbXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIENhbGxTRERIZWxwKAotICAgIGludCBmdW5jKQotewotICAgIHN0YXRpYyB1bG9uZyAgICBpbkxlbjsgICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgNjRLYiBib3VuZGFyeSEgICAgKi8KLSAgICBzdGF0aWMgdWxvbmcgICAgb3V0TGVuOyAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIDY0S2IgYm91bmRhcnkhICAgICovCi0gICAgSEZJTEUgICAgICAgICAgIGhTRERIZWxwOwotICAgIFVMT05HICAgICAgICAgICByYzsKLSAgICB1bG9uZyAgICAgICAgICAgcmVzdWx0OwotCi0gICAgaWYgKChyYyA9IERvc09wZW4oUE1IRUxQX05BTUUsJmhTRERIZWxwLCZyZXN1bHQsMCwwLAotCSAgICBGSUxFX09QRU4sIE9QRU5fU0hBUkVfREVOWU5PTkUgfCBPUEVOX0FDQ0VTU19SRUFEV1JJVEUsCi0JICAgIE5VTEwpKSAhPSAwKSB7Ci0JaWYgKHJjID09IDQpIHsgIC8qIERpZCB3ZSBydW4gb3V0IG9mIGZpbGUgaGFuZGxlcz8gKi8KLQkgICAgVUxPTkcgICB1bE5ld0ZIczsKLQkgICAgTE9ORyAgICBsQWRkRkhzID0gNTsKLQotCSAgICBpZiAoRG9zU2V0UmVsTWF4RkgoJmxBZGRGSHMsICZ1bE5ld0ZIcykgIT0gMCkKLQkJUE1fZmF0YWxFcnJvcigiRmFpbGVkIHRvIHJhaXNlIHRoZSBmaWxlIGhhbmRsZXMgbGltaXQhIik7Ci0JICAgIGVsc2UgewotCQlpZiAoKHJjID0gRG9zT3BlbihQTUhFTFBfTkFNRSwmaFNEREhlbHAsJnJlc3VsdCwwLDAsCi0JCQlGSUxFX09QRU4sIE9QRU5fU0hBUkVfREVOWU5PTkUgfCBPUEVOX0FDQ0VTU19SRUFEV1JJVEUsCi0JCQlOVUxMKSkgIT0gMCkgewotCQkgICAgUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIG9wZW4gU0RESEVMUCQgaGVscGVyIGRldmljZSBkcml2ZXIhICgjMikiKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JZWxzZQotCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gb3BlbiBTRERIRUxQJCBoZWxwZXIgZGV2aWNlIGRyaXZlciEiKTsKLQl9Ci0gICAgaWYgKERvc0RldklPQ3RsKGhTRERIZWxwLFBNSEVMUF9JT0NUTCxmdW5jLAotCSAgICAmcGFybXNJbiwgaW5MZW4gPSBzaXplb2YocGFybXNJbiksICZpbkxlbiwKLQkgICAgJnBhcm1zT3V0LCBvdXRMZW4gPSBzaXplb2YocGFybXNPdXQpLCAmb3V0TGVuKSAhPSAwKQotCVBNX2ZhdGFsRXJyb3IoIkZhaWx1cmUgY2FsbGluZyBTRERIRUxQJCBoZWxwZXIgZGV2aWNlIGRyaXZlciEiKTsKLSAgICBEb3NDbG9zZShoU0RESGVscCk7Ci0gICAgcmV0dXJuIHBhcm1zT3V0WzBdOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIG9uIGEgREJDUyBzeXN0ZW0uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgX19Jc0RCQ1NTeXN0ZW0odm9pZCkKLXsKLSAgICBDSEFSICAgICAgICBhY2hEQkNTSW5mb1sxMl07Ci0gICAgQ09VTlRSWUNPREUgY2NTdHJ1Y3QgPSB7MCwgMH07Ci0KLSAgICBtZW1zZXQoYWNoREJDU0luZm8sIDAsIDEyKTsKLQotICAgIC8qIEdldCB0aGUgREJDUyB2ZWN0b3IgLSBpZiBpdCdzIG5vdCBlbXB0eSwgd2UncmUgb24gREJDUyAqLwotICAgIERvc1F1ZXJ5REJDU0VudihzaXplb2YoYWNoREJDU0luZm8pLCAmY2NTdHJ1Y3QsIGFjaERCQ1NJbmZvKTsKLSAgICBpZiAoYWNoREJDU0luZm9bMF0gIT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICBlbHNlCi0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURldGVybWluZSBpZiBQTVNIRUxMIGlzIHJ1bm5pbmcgLSBpZiBpdCBpc24ndCwgd2UgY2FuJ3QgdXNlIGNlcnRhaW4gY2FsbHMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBfX2lzU2hlbGxMb2FkZWQodm9pZCkKLXsKLSAgICBQVk9JRCAgIHB0cjsKLQotICAgIGlmIChEb3NHZXROYW1lZFNoYXJlZE1lbSgmcHRyLCAoUFNaKSJcXFNIQVJFTUVNXFxQTUdMT0JBTC5NRU0iLCBQQUdfUkVBRCkgPT0gTk9fRVJST1IpIHsKLQlEb3NGcmVlTWVtKHB0cik7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBQTSBsaWJyYXJ5IGFuZCBjb25uZWN0IHRvIG91ciBoZWxwZXIgZGV2aWNlIGRyaXZlci4gSWYgd2UKLWNhbm5vdCBjb25uZWN0IHRvIG91ciBoZWxwZXIgZGV2aWNlIGRyaXZlciwgd2UgYmFpbCBvdXQgd2l0aCBhbiBlcnJvcgotbWVzc2FnZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKLXsKLSAgICBpZiAoIWxvd01lbSkgewotCS8qIE9idGFpbiB0aGUgMzItPjE2IGNhbGxnYXRlIGZyb20gdGhlIGRldmljZSBkcml2ZXIgdG8gZW5hYmxlIElPUEwgKi8KLQlpZiAoKF9QTV9nZHQgPSBDYWxsU0RESGVscChQTUhFTFBfR0VUR0RUMzIpKSA9PSAwKQotCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gb2J0YWluIGNhbGwgZ2F0ZSBzZWxlY3RvciEiKTsKLQotCVBNX3NldElPUEwoMyk7Ci0KLQkvKiBNYXAgdGhlIGZpcnN0IE1iIG9mIHBoeXNpY2FsIG1lbW9yeSBpbnRvIGxvd01lbSAqLwotCWlmICgobG93TWVtID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRix0cnVlKSkgPT0gTlVMTCkKLQkgICAgUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIG1hcCBmaXJzdCBNYiBwaHlzaWNhbCBtZW1vcnkhIik7Ci0KLQkvKiBJbml0aWFsaXNlIHRoZSBNVFJSIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KLQlNVFJSX2luaXQoKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgUE0gbGlicmFyeSBmb3IgQklPUyBhY2Nlc3MgdmlhIFZJREVPUE1JLiBUaGlzIHNob3VsZCB3b3JrCi13aXRoIGFueSBHUkFERCBkcml2ZXIsIGluY2x1ZGluZyBTREQvMi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgSW5pdEludDEwKHZvaWQpCi17Ci0gICAgSE1PRFVMRSAgICAgaE1vZEdFTlBNSSxoTW9kU0REUE1JLGhNb2RWaWRlb1BNSTsKLSAgICBDSEFSICAgICAgICBidWZbODBdLHBhdGhbX01BWF9QQVRIXTsKLSAgICBIRVYgICAgICAgICBoZXZEYWVtb24gPSBOVUxMSEFORExFOwotICAgIFJFU1VMVENPREVTIHJlc0NvZGVzOwotCi0gICAgaWYgKGhhdmVJbnQxMCA9PSAtMSkgewotCS8qIENvbm5lY3QgdG8gVklERU9QTUkgYW5kIGdldCBlbnRyeSBwb2ludC4gTm90ZSB0aGF0IHdlIG9ubHkKLQkgKiBkbyB0aGlzIGlmIEdFTlBNSSBvciBTRERQTUkgYXJlIGFscmVhZHkgbG9hZGVkLCBzaW5jZSB3ZSBuZWVkCi0JICogYSBHUkFERCBiYXNlZCBkcml2ZXIgZm9yIHRoaXMgdG8gd29yay4KLQkgKi8KLQlQTV9pbml0KCk7Ci0JaGF2ZUludDEwID0gZmFsc2U7Ci0JaWYgKERvc1F1ZXJ5TW9kdWxlSGFuZGxlKChQU1opIkdFTlBNSS5ETEwiLCZoTW9kR0VOUE1JKSAhPSAwKQotCSAgICBoTW9kR0VOUE1JID0gTlVMTEhBTkRMRTsKLQlpZiAoRG9zUXVlcnlNb2R1bGVIYW5kbGUoKFBTWikiU0REUE1JLkRMTCIsJmhNb2RTRERQTUkpICE9IDApCi0JICAgIGhNb2RTRERQTUkgPSBOVUxMSEFORExFOwotCWlmIChoTW9kR0VOUE1JIHx8IGhNb2RTRERQTUkpIHsKLQkgICAgaWYgKERvc0xvYWRNb2R1bGUoKFBTWilidWYsc2l6ZW9mKGJ1ZiksKFBTWikiVklERU9QTUkuRExMIiwmaE1vZFZpZGVvUE1JKSA9PSAwKSB7Ci0JCWlmIChEb3NRdWVyeVByb2NBZGRyKGhNb2RWaWRlb1BNSSwwLChQU1opIlZJREVPUE1JMzJSZXF1ZXN0Iiwodm9pZCopJlBNX1ZJREVPUE1JMzJSZXF1ZXN0KSAhPSAwKQotCQkgICAgUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIGdldCBWSURFT1BNSTMyUmVxdWVzdCBlbnRyeSBwb2ludCEiKTsKLQkJc3RyY3B5KHBhdGgsIlg6XFxPUzJcXFNWR0FEQVRBLlBNSSIpOwotCQlwYXRoWzBdID0gUE1fZ2V0Qm9vdERyaXZlKCk7Ci0JCWlmIChQTV9WSURFT1BNSTMyUmVxdWVzdCgmQWRhcHRlcixQTUlSRVFVRVNUX0xPQURQTUlGSUxFLHBhdGgsTlVMTCkgIT0gMCkgewotCQkgICAgRG9zRnJlZU1vZHVsZShoTW9kVmlkZW9QTUkpOwotCQkgICAgUE1fVklERU9QTUkzMlJlcXVlc3QgPSBOVUxMOwotCQkgICAgaGF2ZUludDEwID0gZmFsc2U7Ci0JCSAgICB9Ci0JCWVsc2UgewotCQkgICAgLyogQXR0ZW1wdCB0byBpbml0aWFsaXNlIHRoZSBmdWxsIFZETSBpbiB0aGUgc3lzdGVtLiBUaGlzIHdpbGwgb25seQotCQkgICAgICogd29yayBpZiBWUFJQTUkuU1lTIGlzIGxvYWRlZCwgYnV0IGl0IHByb3ZpZGVzIHN1cHBvcnQgZm9yIHBhc3NpbmcKLQkJICAgICAqIHZhbHVlcyBpbiBFUy9EUy9FU0kvRURJIGJldHdlZW4gdGhlIEJJT1Mgd2hpY2ggZG9lcyBub3Qgd29yayB3aXRoCi0JCSAgICAgKiBrZXJuZWwgVkRNJ3MgaW4gZml4cGFja3MgZWFybGllciB0aGFuIEZQMTUuIEZQMTUgYW5kIGxhdGVyIGFuZAotCQkgICAgICogdGhlIG5ldyBXYXJwIDQuNTEgYW5kIFdhcnAgU2VydmVyIGNvbnZlbmllbmNlIHBhY2tzIHNob3VsZCB3b3JrCi0JCSAgICAgKiBmaW5lIHdpdGggdGhlIGtlcm5lbCBtaW5pLVZETS4KLQkJICAgICAqCi0JCSAgICAgKiBBbHNvIHRoZSBmdWxsIFZETSBpcyB0aGUgb25seSBzb2x1dGlvbiBmb3IgcmVhbGx5IG9sZCBrZXJuZWxzCi0JCSAgICAgKiAoYnV0IEdSQUREIHdvbid0IHJ1biBvbiB0aGVtIHNvIHRoaXMgaXMgc3VwZXJmbHVvdXMgOy0pLgotCQkgICAgICovCi0JCSAgICBJTklUVkRNIEluaXRWRE0gPSB7VkRNX0lOSVRJQUxJWkUsTlVMTCxOVUxMfTsKLQkJICAgIFBNX1ZJREVPUE1JMzJSZXF1ZXN0KCZBZGFwdGVyLFBNSVJFUVVFU1RfU09GVFdBUkVJTlQsJkluaXRWRE0sTlVMTCk7Ci0JCSAgICBoYXZlSW50MTAgPSB0cnVlOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgLyogQSBHUkFERCBkcml2ZXIgaXNuJ3QgbG9hZGVkLCBoZW5jZSB3ZSBjYW4ndCB1c2UgVklERU9QTUkuIEJ1dCB3ZSB3aWxsIHRyeQotCSAgICAgKiB0byBhY2Nlc3MgdGhlIG1pbmktVkRNIGRpcmVjdGx5LCBmaXJzdCB2ZXJpZnlpbmcgdGhhdCB0aGUgc3VwcG9ydCBpcwotCSAgICAgKiBhdmFpbGFibGUgaW4gdGhlIGtlcm5lbCAoaXQgc2hvdWxkIGJlIGZvciBrZXJuZWxzIHRoYXQgc3VwcG9ydCBHUkFERCkuCi0JICAgICAqIFRoaXMgbWF5IGJlIG5lZWRlZCBpbiBhIGNvbW1hbmQgbGluZSBib290IG9yIGlmIG5vbi1HUkFERCBkcml2ZXIgaXMKLQkgICAgICogdXNlZCAoTWF0cm94IG9yIGNsYXNzaWMgVkdBKS4KLQkgICAgICogTm90ZTogYmVjYXVzZSBvZiBwcm9ibGVtcyB3aXRoIG1pbmktVkRNIHN1cHBvcnQgaW4gdGhlIGtlcm5lbCwgd2UgaGF2ZSB0bwotCSAgICAgKiBzcGF3biBhIGRhZW1vbiBwcm9jZXNzIHRoYXQgd2lsbCBkbyB0aGUgYWN0dWFsIG1pbmktVkRNIGFjY2VzcyBmb3IgdXMuCi0JICAgICAqLwotCSAgICAgLyogVHJ5IHRvIG9wZW4gc2hhcmVkIHNlbWFwaG9yZSB0byBzZWUgaWYgb3VyIGRhZW1vbiBpcyBhbHJlYWR5IHVwICovCi0JICAgIGlmIChEb3NPcGVuRXZlbnRTZW0oU0hBUkVEU0VNLCAmaGV2RGFlbW9uKSA9PSBOT19FUlJPUikgewotCQlpZiAoRG9zV2FpdEV2ZW50U2VtKGhldkRhZW1vbiwgMSkgPT0gTk9fRVJST1IpIHsKLQkJICAgIC8qIElmIHNlbWFwaG9yZSBpcyBwb3N0ZWQsIGFsbCBpcyB3ZWxsICovCi0JCSAgICB1c2VWUE1JICAgPSBmYWxzZTsKLQkJICAgIGhhdmVJbnQxMCA9IHRydWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgZWxzZSB7Ci0JCS8qIENyZWF0ZSBzaGFyZWQgZXZlbnQgc2VtYXBob3JlICovCi0JCWlmIChEb3NDcmVhdGVFdmVudFNlbShTSEFSRURTRU0sICZoZXZEYWVtb24sIERDX1NFTV9TSEFSRUQsIEZBTFNFKSA9PSBOT19FUlJPUikgewotCQkgICAgUE1fZmluZEJQRChEQUVNT05fTkFNRSwgcGF0aCk7Ci0JCSAgICBzdHJjYXQocGF0aCwgREFFTU9OX05BTUUpOwotCQkgICAgaWYgKERvc0V4ZWNQZ20oYnVmLCBzaXplb2YoYnVmKSwgRVhFQ19CQUNLR1JPVU5ELCAoUFNaKURBRU1PTl9OQU1FLAotCQkJTlVMTCwgJnJlc0NvZGVzLCAoUFNaKXBhdGgpID09IE5PX0VSUk9SKSB7Ci0JCQkvKiBUaGUgZGFlbW9uIHdhcyBzdWNjZXNzZnVsbHkgc3Bhd25lZCwgbm93IGdpdmUgaXQgYSBzZWMgdG8gY29tZSB1cCAqLwotCQkJaWYgKERvc1dhaXRFdmVudFNlbShoZXZEYWVtb24sIDIwMDApID09IE5PX0VSUk9SKSB7Ci0JCQkgICAgLyogSXQncyB1cCEgKi8KLQkJCSAgICB1c2VWUE1JICAgPSBmYWxzZTsKLQkJCSAgICBoYXZlSW50MTAgPSB0cnVlOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIHJldHVybiBoYXZlSW50MTA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV2UgInByb2JhYmx5IiBoYXZlIEJJT1MgYWNjZXNzIHVuZGVyIE9TLzIgYnV0IHdlIGhhdmUgdG8gdmVyaWZ5L2luaXRpYWxpemUgaXQKLWZpcnN0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2hhdmVCSU9TQWNjZXNzKHZvaWQpCi17Ci0gICAgcmV0dXJuIEluaXRJbnQxMCgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0eXBlIGlkZW50aWZpZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKLXsKLSAgICByZXR1cm4gX09TX09TMjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHJ1bnRpbWUgdHlwZSBpZGVudGlmaWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQotewotICAgIHJldHVybiBQTV8zODY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWRkIGEgZmlsZSBkaXJlY3Rvcnkgc2VwYXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGVuYW1lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKAotICAgIGNoYXIgKnMpCi17Ci0gICAgdWludCBwb3MgPSBzdHJsZW4ocyk7Ci0gICAgaWYgKHNbcG9zLTFdICE9ICdcXCcpIHsKLQlzW3Bvc10gPSAnXFwnOwotCXNbcG9zKzFdID0gJ1wwJzsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWRkIGEgdXNlciBkZWZpbmVkIFBNX2ZhdGFsRXJyb3IgY2xlYW51cCBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAotICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKLXsKLSAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVwb3J0IGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uIGFuZCBoYWx0IHRoZSBwcm9ncmFtLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcigKLSAgICBjb25zdCBjaGFyICptc2cpCi17Ci0gICAgLyogQmUgcHJlcGFyZSB0byBiZSBjYWxsZWQgcmVjdXJzaXZlbHkgKGZhaWxlZCB0byBmYWlsIHNpdHVhdGlvbiA6LSkgKi8KLSAgICBzdGF0aWMgaW50IGZhdGFsRXJyb3JDb3VudCA9IDA7Ci0gICAgaWYgKGZhdGFsRXJyb3JDb3VudCsrID09IDApIHsKLQlpZiAoZmF0YWxFcnJvckNsZWFudXApCi0JICAgIGZhdGFsRXJyb3JDbGVhbnVwKCk7Ci0JfQotICAgIGZwcmludGYoc3RkZXJyLCIlc1xuIiwgbXNnKTsKLSAgICBleGl0KDEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIHRoZSByZWFsIG1vZGUgVkVTQSB0cmFuc2ZlciBidWZmZXIgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgQklPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0VkVTQUJ1ZigKLSAgICB1aW50ICpsZW4sCi0gICAgdWludCAqcnNlZywKLSAgICB1aW50ICpyb2ZmKQotewotICAgIGlmICghVkVTQUJ1Zl9wdHIpIHsKLQkvKiBBbGxvY2F0ZSBhIGdsb2JhbCBidWZmZXIgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgVkVTQSBWQkUgKi8KLQlpZiAoKFZFU0FCdWZfcHRyID0gUE1fYWxsb2NSZWFsU2VnKFZFU0FCdWZfbGVuLCAmVkVTQUJ1Zl9yc2VnLCAmVkVTQUJ1Zl9yb2ZmKSkgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICpsZW4gPSBWRVNBQnVmX2xlbjsKLSAgICAqcnNlZyA9IFZFU0FCdWZfcnNlZzsKLSAgICAqcm9mZiA9IFZFU0FCdWZfcm9mZjsKLSAgICByZXR1cm4gVkVTQUJ1Zl9wdHI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2hlY2sgaWYgYSBrZXkgaGFzIGJlZW4gcHJlc3NlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKLXsKLSAgICBLQkRLRVlJTkZPICAga2V5OyAgICAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5ICAgICovCi0KLSAgICBLYmRQZWVrKCZrZXksIDApOwotICAgIHJldHVybiAoa2V5LmZiU3RhdHVzICYgS0JEVFJGX0ZJTkFMX0NIQVJfSU4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVdhaXQgZm9yIGFuZCByZXR1cm4gdGhlIG5leHQga2V5cHJlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldGNoKHZvaWQpCi17Ci0gICAgS0JES0VZSU5GTyAgIGtleTsgICAgICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyBhIDY0SyBib3VuZGFyeSAgICAqLwotCi0gICAgS2JkQ2hhckluKCZrZXksSU9fV0FJVCwwKTsKLSAgICByZXR1cm4ga2V5LmNoQ2hhcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PcGVuIGEgZnVsbHNjcmVlbiBjb25zb2xlIGZvciBvdXRwdXQgdG8gdGhlIHNjcmVlbi4gVGhpcyByZXF1aXJlcyB0aGF0Ci10aGUgYXBwbGljYXRpb24gYmUgYSBmdWxsc2NyZWVuIFZJTyBwcm9ncmFtLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX0hXTkQgUE1BUEkgUE1fb3BlbkNvbnNvbGUoCi0gICAgUE1fSFdORCBod25kVXNlciwKLSAgICBpbnQgZGV2aWNlLAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzLAotICAgIGludCBicHAsCi0gICAgaWJvb2wgZnVsbFNjcmVlbikKLXsKLSAgICAodm9pZClod25kVXNlcjsKLSAgICAodm9pZClkZXZpY2U7Ci0gICAgKHZvaWQpeFJlczsKLSAgICAodm9pZCl5UmVzOwotICAgICh2b2lkKWJwcDsKLSAgICAodm9pZClmdWxsU2NyZWVuOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZpbmQgdGhlIHNpemUgb2YgdGhlIGNvbnNvbGUgc3RhdGUgYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKHZvaWQpCi17Ci0gICAgVklPTU9ERUlORk8gdm1pOwotICAgIHZtaS5jYiA9IHNpemVvZiAoVklPTU9ERUlORk8pOwotICAgIFZpb0dldE1vZGUgKCZ2bWksIChIVklPKTApOwotICAgIHJldHVybiBzaXplb2YgKENPTlNPTEVfU0FWRSkgLSAxICsgdm1pLmNvbCAqIHZtaS5yb3cgKiAyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhdmUgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSgKLSAgICB2b2lkICpzdGF0ZUJ1ZiwKLSAgICBQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIFVTSE9SVCAgICAgICAgICBmYmxlbjsKLSAgICBDT05TT0xFX1NBVkUgICAgKmNzID0gKENPTlNPTEVfU0FWRSopc3RhdGVCdWY7Ci0gICAgVklPTU9ERUlORk8gICAgIHZtaTsKLQotICAgIC8qIFRoZSByZWFzb24gZm9yIHRoZSBWSU9NT0RFSU5GTyBqdWdnbGluZyBpcyAxNi1iaXQgY29kZS4gQmVjYXVzZSB0aGUgdXNlcgotICAgICAqIGFsbG9jYXRlcyB0aGUgc3RhdGUgYnVmZmVyLCBjZC0+dm1pIG1pZ2h0IGJlIGNyb3NzaW5nIHRoZSA2NEsgYm91bmRhcnkgYW5kCi0gICAgICogdGhlIDE2LWJpdCBBUEkgd291bGQgZmFpbC4gSWYgd2UgY3JlYXRlIGFub3RoZXIgY29weSBvbiBzdGFjaywgdGhlIGNvbXBpbGVyCi0gICAgICogc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSA2NEsgYm91bmRhcnkgd2lsbCBub3QgYmUgY3Jvc3NlZCAoaXQgYWRqdXN0cyB0aGUgc3RhY2sKLSAgICAgKiBpZiBpdCBzaG91bGQgY3Jvc3MpLgotICAgICAqLwotICAgIHZtaS5jYiA9IHNpemVvZihWSU9NT0RFSU5GTyk7Ci0gICAgVmlvR2V0TW9kZSgmdm1pLChIVklPKTApOwotICAgIG1lbWNweSgmY3MtPnZtaSwgJnZtaSwgc2l6ZW9mKFZJT01PREVJTkZPKSk7Ci0gICAgVmlvR2V0Q3VyUG9zKCZjcy0+Q3Vyc29yWSwgJmNzLT5DdXJzb3JYLCAoSFZJTykwKTsKLSAgICBmYmxlbiA9IGNzLT52bWkuY29sICogY3MtPnZtaS5yb3cgKiAyOwotICAgIFZpb1JlYWRDZWxsU3RyKChQQ0gpY3MtPkZyYW1lQnVmZmVyLCAmZmJsZW4sIDAsIDAsIChIVklPKTApOwotfQotCi0vKiBHbG9iYWwgdmFyaWFibGUgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiB0aHJlYWRzICovCi1zdGF0aWMgU0VTV0lUQ0hSRUMgU2VzU3dpdGNoUmVjID0geyAtMSB9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGxlZCBieSBleHRlcm5hbCByb3V0aW5lcyBhdCBsZWFzdCBvbmNlIHBlciBmcmFtZSB0byBjaGVjayB3aGVuZXZlciBhCi1zZXNzaW9uIHNhdmUvcmVzdG9yZSBzaG91bGQgYmUgcGVyZm9ybWVkLiBTaW5jZSB3ZSByZWNlaXZlIHN1Y2ggbm90aWZpY2F0aW9ucwotYXN5bmNyb25vdXNseSwgd2UgY2FuJ3QgcGVyZm9ybSBhbGwgcmVxdWlyZWQgb3BlcmF0aW9ucyBhdCB0aGF0IHRpbWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfX1BNX2NoZWNrQ29uc29sZVN3aXRjaCh2b2lkKQotewotICAgIGludCAgICAgICAgICAgICBGbGFncywgTW9kZTsKLSAgICBQTV9zYXZlU3RhdGVfY2IgQ2FsbGJhY2s7Ci0KLSAgICAvKiBRdWljayBvcHRpbWl6ZWQgcGF0aCBmb3IgbW9zdCBjb21tb24gY2FzZSAqLwotICAgIGlmIChTZXNTd2l0Y2hSZWMuRmxhZ3MgPT0gLTEpCi0JcmV0dXJuOwotCi1hZ2FpbjoKLSAgICBpZiAoRG9zUmVxdWVzdE11dGV4U2VtKFNlc1N3aXRjaFJlYy5NdXRleCwgMTAwKSkKLQlyZXR1cm47Ci0gICAgRmxhZ3MgPSBTZXNTd2l0Y2hSZWMuRmxhZ3M7Ci0gICAgQ2FsbGJhY2sgPSBTZXNTd2l0Y2hSZWMuQ2FsbGJhY2s7Ci0gICAgU2VzU3dpdGNoUmVjLkZsYWdzID0gLTE7Ci0gICAgRG9zUmVsZWFzZU11dGV4U2VtKFNlc1N3aXRjaFJlYy5NdXRleCk7Ci0KLSAgICBpc1Nlc3Npb25Td2l0Y2hpbmcgPSB0cnVlOyAgICAgICAgICAgIC8qIFByZXZlbnQgVklPIGNhbGxzICovCi0gICAgTW9kZSA9IENhbGxiYWNrKEZsYWdzKTsKLSAgICBpc1Nlc3Npb25Td2l0Y2hpbmcgPSBmYWxzZTsKLSAgICBEb3NQb3N0RXZlbnRTZW0oU2VzU3dpdGNoUmVjLkV2ZW50KTsKLSAgICBpZiAoRmxhZ3MgPT0gUE1fREVBQ1RJVkFURSAmJiBNb2RlID09IFBNX1NVU1BFTkRfQVBQKQotCS8qIFN1c3BlbmQgYXBwbGljYXRpb24gdW50aWwgd2Ugc3dpdGNoIGJhY2sgdG8gb3VyIGFwcGxpY2F0aW9uICovCi0JZm9yICg7OykgewotCSAgICBEb3NTbGVlcCAoNTAwKTsKLQkgICAgLyogU2VzU3dpdGNoUmVjLkZsYWdzIGlzIHZvbGF0aWxlIHNvIG9wdGltaXplcgotCSAgICAgKiB3b24ndCBsb2FkIGl0IGludG8gYSByZWdpc3RlcgotCSAgICAgKi8KLQkgICAgaWYgKFNlc1N3aXRjaFJlYy5GbGFncyAhPSAtMSkKLQkJZ290byBhZ2FpbjsKLQkgICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVdhaXRzIHVudGlsIG1haW4gdGhyZWFkIHByb2Nlc3NlcyB0aGUgc2Vzc2lvbiBzd2l0Y2ggZXZlbnQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX1BNX1Nlc3Npb25Td2l0Y2hFdmVudCgKLSAgICBQTV9zYXZlU3RhdGVfY2Igc2F2ZVN0YXRlLAotICAgIGludCBmbGFncykKLXsKLSAgICBVTE9ORyBDb3VudDsKLQotICAgIGlmIChEb3NSZXF1ZXN0TXV0ZXhTZW0oU2VzU3dpdGNoUmVjLk11dGV4LCAxMDAwMCkpCi0JcmV0dXJuOwotCi0gICAgLyogV2UncmUgZ29pbmcgdG8gd2FpdCBvbiB0aGF0IHNlbWFwaG9yZSAqLwotICAgIERvc1Jlc2V0RXZlbnRTZW0oU2VzU3dpdGNoUmVjLkV2ZW50LCAmQ291bnQpOwotICAgIFNlc1N3aXRjaFJlYy5DYWxsYmFjayA9IHNhdmVTdGF0ZTsKLSAgICBTZXNTd2l0Y2hSZWMuRmxhZ3MgPSBmbGFnczsKLSAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oU2VzU3dpdGNoUmVjLk11dGV4KTsKLQotICAgIC8qIE5vdyB3YWl0IHVudGlsIGFsbCByZXF1aXJlZCBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZSAqLwotICAgIERvc1dhaXRFdmVudFNlbSAoU2VzU3dpdGNoUmVjLkV2ZW50LCAxMDAwMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBpcyB0aGUgdGhyZWFkIHJlc3BvbnNpYmxlIGZvciB0cmFja2luZyBzd2l0Y2hlcyBiYWNrIHRvIG91cgotZnVsbHNjcmVlbiBzZXNzaW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9QTV9Db25zb2xlU3dpdGNoKAotICAgIFBNX3NhdmVTdGF0ZV9jYiBzYXZlU3RhdGUpCi17Ci0gICAgVVNIT1JUIE5vdGlmeVR5cGU7Ci0KLSAgICBmb3IgKDs7KSB7Ci0JaWYgKFZpb01vZGVXYWl0KFZNV1JfUE9QVVAsICZOb3RpZnlUeXBlLCAwKSAhPSAwKQotCSAgICBicmVhazsKLQlfUE1fU2Vzc2lvblN3aXRjaEV2ZW50KHNhdmVTdGF0ZSwgUE1fUkVBQ1RJVkFURSk7Ci0JfQotICAgIFZpb01vZGVVbmRvKFVORE9JX1JFTEVBU0VPV05FUiwgVU5ET0tfRVJST1JDT0RFLCAoSFZJTykwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGlzIHRoZSB0aHJlYWQgcmVzcG9uc2libGUgZm9yIHRyYWNraW5nIHNjcmVlbiBwb3B1cHMgKHVzdWFsbHkgZmF0YWwKLWVycm9yIGhhbmRsZXIgdXNlcyB0aGVtKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfUE1fQ29uc29sZVBvcHVwKAotICAgIFBNX3NhdmVTdGF0ZV9jYiBzYXZlU3RhdGUpCi17Ci0gICAgVVNIT1JUIE5vdGlmeVR5cGU7Ci0gICAgZm9yICg7OykgewotCWlmIChWaW9TYXZSZWRyYXdXYWl0KFZTUldJX1NBVkVBTkRSRURSQVcsICZOb3RpZnlUeXBlLCAwKSAhPSAwKQotCSAgICBicmVhazsKLQlpZiAoTm90aWZ5VHlwZSA9PSBWU1JXTl9TQVZFKQotCSAgICBfUE1fU2Vzc2lvblN3aXRjaEV2ZW50KHNhdmVTdGF0ZSwgUE1fREVBQ1RJVkFURSk7Ci0JZWxzZSBpZiAoTm90aWZ5VHlwZSA9PSBWU1JXTl9SRURSQVcpCi0JICAgIF9QTV9TZXNzaW9uU3dpdGNoRXZlbnQoc2F2ZVN0YXRlLCBQTV9SRUFDVElWQVRFKTsKLQl9Ci0gICAgVmlvU2F2UmVkcmF3VW5kbyhVTkRPSV9SRUxFQVNFT1dORVIsIFVORE9LX0VSUk9SQ09ERSwgKEhWSU8pMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSBzdXNwZW5kIGFwcGxpY2F0aW9uIGNhbGxiYWNrIGZvciB0aGUgZnVsbHNjcmVlbiBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKAotICAgIFBNX3NhdmVTdGF0ZV9jYiBzYXZlU3RhdGUpCi17Ci0gICAgLyogSWYgUE0gaXNuJ3QgbG9hZGVkLCB0aGlzIHN0dWZmIHdpbGwgY2F1c2UgY3Jhc2hlcyEgKi8KLSAgICBpZiAoX19pc1NoZWxsTG9hZGVkKCkpIHsKLQlpZiAoc2F2ZVN0YXRlKSB7Ci0JICAgIC8qIENyZWF0ZSB0aGUgdGhyZWFkcyByZXNwb25zaWJsZSBmb3IgdHJhY2tpbmcgY29uc29sZSBzd2l0Y2hlcyAqLwotCSAgICBTZXNTd2l0Y2hSZWMuRmxhZ3MgPSAtMTsKLQkgICAgRG9zQ3JlYXRlTXV0ZXhTZW0oTlVMTCwgJlNlc1N3aXRjaFJlYy5NdXRleCwgMCwgRkFMU0UpOwotCSAgICBEb3NDcmVhdGVFdmVudFNlbShOVUxMLCAmU2VzU3dpdGNoUmVjLkV2ZW50LCAwLCBGQUxTRSk7Ci0JICAgIF9iZWdpbnRocmVhZCAoKHZvaWQoKikodm9pZCopKV9QTV9Db25zb2xlU3dpdGNoLE5VTEwsU0VTU0lPTl9TV0lUQ0hfU1RBQ0tfU0laRSwgKHZvaWQqKXNhdmVTdGF0ZSk7Ci0JICAgIF9iZWdpbnRocmVhZCAoKHZvaWQoKikodm9pZCopKV9QTV9Db25zb2xlUG9wdXAsTlVMTCxTRVNTSU9OX1NXSVRDSF9TVEFDS19TSVpFLCAodm9pZCopc2F2ZVN0YXRlKTsKLQkgICAgfQotCWVsc2UgewotCSAgICAvKiBLaWxsIHRoZSB0aHJlYWRzIHJlc3BvbnNpYmxlIGZvciB0cmFja2luZyBjb25zb2xlIHN3aXRjaGVzICovCi0JICAgIFZpb01vZGVVbmRvKFVORE9JX1JFTEVBU0VPV05FUiwgVU5ET0tfVEVSTUlOQVRFLCAoSFZJTykwKTsKLQkgICAgVmlvU2F2UmVkcmF3VW5kbyhVTkRPSV9SRUxFQVNFT1dORVIsIFVORE9LX1RFUk1JTkFURSwgKEhWSU8pMCk7Ci0JICAgIERvc0Nsb3NlRXZlbnRTZW0oU2VzU3dpdGNoUmVjLkV2ZW50KTsKLQkgICAgRG9zQ2xvc2VNdXRleFNlbShTZXNTd2l0Y2hSZWMuTXV0ZXgpOwotCSAgICB9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIGNvbnNvbGUgc3RhdGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKAotICAgIGNvbnN0IHZvaWQgKnN0YXRlQnVmLAotICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgQ09OU09MRV9TQVZFICpjcyA9IChDT05TT0xFX1NBVkUgKilzdGF0ZUJ1ZjsKLSAgICBWSU9NT0RFSU5GTyAgdm1pOwotCi0gICAgaWYgKCFjcykKLQlyZXR1cm47Ci0KLSAgICBtZW1jcHkoJnZtaSwgJmNzLT52bWksIHNpemVvZiAoVklPTU9ERUlORk8pKTsKLSAgICBWaW9TZXRNb2RlKCZ2bWksIChIVklPKTApOwotICAgIFZpb1NldEN1clBvcyhjcy0+Q3Vyc29yWSwgY3MtPkN1cnNvclgsIChIVklPKTApOwotICAgIFZpb1dydENlbGxTdHIoKFBDSCljcy0+RnJhbWVCdWZmZXIsIGNzLT52bWkuY29sICogY3MtPnZtaS5yb3cgKiAyLDAsIDAsIChIVklPKTApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNsb3NlIHRoZSBmdWxsc2NyZWVuIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoCi0gICAgUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBLaWxsIHRoZSB0aHJlYWRzIHJlc3BvbnNpYmxlIGZvciB0cmFja2luZyBjb25zb2xlIHN3aXRjaGVzICovCi0gICAgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKE5VTEwpOwotICAgICh2b2lkKWh3bmRDb25zb2xlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgbG9jYXRpb24gb2YgdGhlIE9TIGNvbnNvbGUgY3Vyc29yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbigKLSAgICBpbnQgeCwKLSAgICBpbnQgeSkKLXsKLSAgICAvKiBJZiBzZXNzaW9uIHN3aXRjaCBpcyBpbiBwcm9ncmVzcywgY2FsbGluZyBpbnRvIFZJTyBjYXVzZXMgZGVhZGxvY2tzISAqLwotICAgIC8qIEFsc28gdGhpcyBjYWxsIHRvIFZJTyBzY3Jld3MgdXAgb3VyIGNvbnNvbGUgbGlicmFyeSBvbiBEQkNTIGJveGVzLi4uICovCi0gICAgaWYgKCFpc1Nlc3Npb25Td2l0Y2hpbmcgJiYgIV9fSXNEQkNTU3lzdGVtKCkpCi0JVmlvU2V0Q3VyUG9zKHkseCwwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHdpZHRoIG9mIHRoZSBPUyBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1fc2V0T1NTY3JlZW5XaWR0aCgKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCkKLXsKLSAgICAvKiBOb3RoaW5nIHRvIGRvIGluIGhlcmUgKi8KLSAgICAodm9pZCl3aWR0aDsKLSAgICAodm9pZCloZWlnaHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaGFuZGxlciAodXNlZCBmb3Igc29mdHdhcmUgc3RlcmVvIG1vZGVzKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcigKLSAgICBQTV9pbnRIYW5kbGVyIGloLAotICAgIGludCBmcmVxdWVuY3kpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgKHZvaWQpaWg7Ci0gICAgKHZvaWQpZnJlcXVlbmN5OwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHJlYWwgdGltZSBjbG9jayBmcmVxdWVuY3kgKGZvciBzdGVyZW8gbW9kZXMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeSgKLSAgICBpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgICh2b2lkKWZyZXF1ZW5jeTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSBvcmlnaW5hbCByZWFsIHRpbWUgY2xvY2sgaGFuZGxlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIHBhdGggb3Igd29ya2luZyBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciAqIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKAotICAgIGNoYXIgKnBhdGgsCi0gICAgaW50IG1heExlbikKLXsKLSAgICByZXR1cm4gZ2V0Y3dkKHBhdGgsbWF4TGVuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGRyaXZlIGxldHRlciBmb3IgdGhlIGJvb3QgZHJpdmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKLXsKLSAgICB1bG9uZyAgIGJvb3QgPSAzOwotICAgIERvc1F1ZXJ5U3lzSW5mbyhRU1ZfQk9PVF9EUklWRSxRU1ZfQk9PVF9EUklWRSwmYm9vdCxzaXplb2YoYm9vdCkpOwotICAgIHJldHVybiAoY2hhcikoJ2EnICsgYm9vdCAtIDEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgVkJFL0FGIGRyaXZlciBmaWxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFtDQ0hNQVhQQVRIXTsKLSAgICBzdHJjcHkocGF0aCwieDpcXCIpOwotICAgIHBhdGhbMF0gPSBQTV9nZXRCb290RHJpdmUoKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbQ0NITUFYUEFUSF07Ci0gICAgaWYgKGdldGVudigiTlVDTEVVU19QQVRIIikgIT0gTlVMTCkKLQlyZXR1cm4gZ2V0ZW52KCJOVUNMRVVTX1BBVEgiKTsKLSAgICBzdHJjcHkocGF0aCwieDpcXG9zMlxcZHJpdmVycyIpOwotICAgIHBhdGhbMF0gPSBQTV9nZXRCb290RHJpdmUoKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsIm51Y2xldXMiKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHBhdGggdG8gdGhlIE51Y2xldXMgY29uZmlndXJhdGlvbiBmaWxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoW0NDSE1BWFBBVEhdOwotICAgIHN0cmNweShwYXRoLFBNX2dldE51Y2xldXNQYXRoKCkpOwotICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKLSAgICBzdHJjYXQocGF0aCwiY29uZmlnIik7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBtYWNoaW5lIGlmIHBvc3NpYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKQotewotICAgIHJldHVybiBQTV9nZXRNYWNoaW5lTmFtZSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUdldCB0aGUgbmFtZSBvZiB0aGUgbWFjaGluZSBvbiB0aGUgbmV0d29yay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBuYW1lWzQwXSwqZW52OwotCi0gICAgaWYgKChlbnYgPSBnZXRlbnYoIkhPU1ROQU1FIikpICE9IE5VTEwpIHsKLQlzdHJuY3B5KG5hbWUsZW52LHNpemVvZihuYW1lKSk7Ci0JbmFtZVtzaXplb2YobmFtZSktMV0gPSAwOwotCXJldHVybiBuYW1lOwotCX0KLSAgICByZXR1cm4gIk9TMiI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVhbCBtb2RlIEJJT1MgZGF0YSBhcmVhLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQotewotICAgIFBNX2luaXQoKTsKLSAgICByZXR1cm4gbG93TWVtICsgMHg0MDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byAweEEwMDAwIHBoeXNpY2FsIFZHQSBncmFwaGljcyBmcmFtZWJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCi17Ci0gICAgUE1faW5pdCgpOwotICAgIHJldHVybiBsb3dNZW0gKyAweEEwMDAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1hcCBhIHBoeXNpY2FsIGFkZHJlc3MgdG8gYSBsaW5lYXIgYWRkcmVzcyBpbiB0aGUgY2FsbGVycyBwcm9jZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBsaW1pdCwKLSAgICBpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICB1bG9uZyAgIGJhc2VBZGRyLGJhc2VPZnMsbGluZWFyOwotCi0gICAgLyogUm91bmQgdGhlIHBoeXNpY2FsIGFkZHJlc3MgdG8gYSA0S2IgYm91bmRhcnkgYW5kIHRoZSBsaW1pdCB0byBhCi0gICAgICogNEtiLTEgYm91bmRhcnkgYmVmb3JlIHBhc3NpbmcgdGhlIHZhbHVlcyB0byBtbWFwLiBJZiB3ZSByb3VuZCB0aGUKLSAgICAgKiBwaHlzaWNhbCBhZGRyZXNzLCB0aGVuIHdlIGFsc28gYWRkIGFuIGV4dHJhIG9mZnNldCBpbnRvIHRoZSBhZGRyZXNzCi0gICAgICogdGhhdCB3ZSByZXR1cm4uCi0gICAgICovCi0gICAgYmFzZU9mcyA9IGJhc2UgJiA0MDk1OwotICAgIGJhc2VBZGRyID0gYmFzZSAmIH40MDk1OwotICAgIGxpbWl0ID0gKChsaW1pdCtiYXNlT2ZzKzErNDA5NSkgJiB+NDA5NSktMTsKLSAgICBwYXJtc0luWzBdID0gYmFzZUFkZHI7Ci0gICAgcGFybXNJblsxXSA9IGxpbWl0OwotICAgIHBhcm1zSW5bMl0gPSBpc0NhY2hlZDsKLSAgICBpZiAoKGxpbmVhciA9IENhbGxTRERIZWxwKFBNSEVMUF9NQVBQSFlTKSkgPT0gMCkKLQlyZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gKHZvaWQqKShsaW5lYXIgKyBiYXNlT2ZzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgcGh5c2ljYWwgYWRkcmVzcyBtYXBwaW5nIGFsbG9jYXRlZCBieSBQTV9tYXBQaHlzaWNhbEFkZHIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKAotICAgIHZvaWQgKnB0ciwKLSAgICB1bG9uZyBsaW1pdCkKLXsKLSAgICBwYXJtc0luWzBdID0gKHVsb25nKXB0cjsKLSAgICBwYXJtc0luWzFdID0gbGltaXQ7Ci0gICAgQ2FsbFNEREhlbHAoUE1IRUxQX0ZSRUVQSFlTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyIG1lbW9yeSBhZGRyZXNzIGluIGN1cnJlbnQgcHJvY2Vzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIoCi0gICAgdm9pZCAqcCkKLXsKLSAgICBwYXJtc0luWzBdID0gKHVsb25nKXA7Ci0gICAgcmV0dXJuIENhbGxTRERIZWxwKFBNSEVMUF9HRVRQSFlTSUNBTEFERFIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgbWVtb3J5IGFkZHJlc3MgaW4gY3VycmVudCBwcm9jZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKAotICAgIHZvaWQgKnAsCi0gICAgdWxvbmcgbGVuZ3RoLAotICAgIHVsb25nICpwaHlzQWRkcmVzcykKLXsKLSAgICBwYXJtc0luWzBdID0gKHVsb25nKXA7Ci0gICAgcGFybXNJblsxXSA9ICh1bG9uZylsZW5ndGg7Ci0gICAgcGFybXNJblsyXSA9ICh1bG9uZylwaHlzQWRkcmVzczsKLSAgICByZXR1cm4gQ2FsbFNEREhlbHAoUE1IRUxQX0dFVFBIWVNJQ0FMQUREUlJBTkdFKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2xlZXAoCi0gICAgdWxvbmcgbWlsbGlzZWNvbmRzKQotewotICAgIERvc1NsZWVwKG1pbGxpc2Vjb25kcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBiYXNlIEkvTyBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIENPTSBwb3J0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRDT01Qb3J0KAotICAgIGludCBwb3J0KQotewotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0Y4OwotCWNhc2UgMTogcmV0dXJuIDB4MkY4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGJhc2UgSS9PIHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgTFBUIHBvcnQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldExQVFBvcnQoCi0gICAgaW50IHBvcnQpCi17Ci0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzQkM7Ci0JY2FzZSAxOiByZXR1cm4gMHgzNzg7Ci0JY2FzZSAyOiByZXR1cm4gMHgyNzg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeS4gRm9yIFdpbjl4IHdlIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnkKLWFzIGxvY2tlZCwgZ2xvYmFsIG1lbW9yeSB0aGF0IGlzIGFjY2Vzc2libGUgZnJvbSBhbnkgbWVtb3J5IGNvbnRleHQKLShpbmNsdWRpbmcgaW50ZXJydXB0IHRpbWUgY29udGV4dCksIHdoaWNoIGFsbG93cyB1cyB0byBsb2FkIG91ciBpbXBvcnRhbnQKLWRhdGEgc3RydWN0dXJlIGFuZCBjb2RlIHN1Y2ggdGhhdCB3ZSBjYW4gYWNjZXNzIGl0IGRpcmVjdGx5IGZyb20gYSByaW5nCi0wIGludGVycnVwdCBjb250ZXh0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYWxsb2NTaGFyZWQoCi0gICAgbG9uZyBzaXplKQotewotICAgIHBhcm1zSW5bMF0gPSBzaXplOwotICAgIHJldHVybiAodm9pZCopQ2FsbFNEREhlbHAoUE1IRUxQX01BTExPQ1NIQVJFRCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlU2hhcmVkKAotICAgIHZvaWQgKnB0cikKLXsKLSAgICBwYXJtc0luWzBdID0gKHVsb25nKXB0cjsKLSAgICBDYWxsU0RESGVscChQTUhFTFBfRlJFRVNIQVJFRCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEgbGluZWFyIG1lbW9yeSBhZGRyZXNzIHRvIHRoZSBjYWxsaW5nIHByb2Nlc3MgYWRkcmVzcyBzcGFjZS4gVGhlCi1hZGRyZXNzIHdpbGwgaGF2ZSBiZWVuIGFsbG9jYXRlZCBpbiBhbm90aGVyIHByb2Nlc3MgdXNpbmcgdGhlCi1QTV9tYXBQaHlzaWNhbEFkZHIgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2VzcygKLSAgICB2b2lkICpiYXNlLAotICAgIHVsb25nIGxpbWl0KQotewotICAgIHVsb25nICAgYmFzZUFkZHIsYmFzZU9mczsKLQotICAgIC8qIFJvdW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgNEtiIGJvdW5kYXJ5IGFuZCB0aGUgbGltaXQgdG8gYQotICAgICAqIDRLYi0xIGJvdW5kYXJ5IGJlZm9yZSBwYXNzaW5nIHRoZSB2YWx1ZXMgdG8gbW1hcC4gSWYgd2Ugcm91bmQgdGhlCi0gICAgICogcGh5c2ljYWwgYWRkcmVzcywgdGhlbiB3ZSBhbHNvIGFkZCBhbiBleHRyYSBvZmZzZXQgaW50byB0aGUgYWRkcmVzcwotICAgICAqIHRoYXQgd2UgcmV0dXJuLgotICAgICAqLwotICAgIGJhc2VPZnMgPSAodWxvbmcpYmFzZSAmIDQwOTU7Ci0gICAgYmFzZUFkZHIgPSAodWxvbmcpYmFzZSAmIH40MDk1OwotICAgIGxpbWl0ID0gKChsaW1pdCtiYXNlT2ZzKzErNDA5NSkgJiB+NDA5NSktMTsKLSAgICBwYXJtc0luWzBdID0gKHVsb25nKWJhc2VBZGRyOwotICAgIHBhcm1zSW5bMV0gPSBsaW1pdDsKLSAgICByZXR1cm4gKHZvaWQqKShDYWxsU0RESGVscChQTUhFTFBfTUFQVE9QUk9DRVNTKStiYXNlT2ZzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSByZWFsIG1vZGUgcG9pbnRlciB0byBhIHByb3RlY3RlZCBtb2RlIHBvaW50ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKAotICAgIHVpbnQgcl9zZWcsCi0gICAgdWludCByX29mZikKLXsKLSAgICBpZiAocl9zZWcgPT0gMHhGRkZGKQotCXJldHVybiAmUk1CdWZbcl9vZmZdOwotICAgIHJldHVybiBsb3dNZW0gKyBNS19QSFlTKHJfc2VnLHJfb2ZmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1aW50ICpyX3NlZywKLSAgICB1aW50ICpyX29mZikKLXsKLSAgICBpZiAoc2l6ZSA+IHNpemVvZihSTUJ1ZikpCi0JcmV0dXJuIE5VTEw7Ci0gICAgKnJfc2VnID0gMHhGRkZGOwotICAgICpyX29mZiA9IDB4MDAwMDsKLSAgICByZXR1cm4gJlJNQnVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcoCi0gICAgdm9pZCAqbWVtKQotewotICAgIC8qIE5vdGhpbmcgdG8gZG8gaW4gaGVyZSAqLwotICAgICh2b2lkKW1lbTsKLX0KLQotI2RlZmluZSBJTkRQTUkocmVnKSAgICAgcm1yZWdzLmFDUkYucmVnXyMjcmVnID0gcmVncy0+cmVnCi0jZGVmaW5lIE9VVERQTUkocmVnKSAgICByZWdzLT5yZWcgPSBybXJlZ3MuYUNSRi5yZWdfIyNyZWcKLQotI2RlZmluZSBSRUdfT0ZGU0VUKGZpZWxkKSAgKCgoVUxPTkcpJigoKFZDUkYqKTApLT5maWVsZCkpICAvIHNpemVvZihVTE9ORykpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSByZWFsIG1vZGUgaW50ZXJydXB0IChwYXJhbWV0ZXJzIGluIERQTUkgY29tcGF0aWJsZSBzdHJ1Y3R1cmUpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBEUE1JX2ludDg2KAotICAgIGludCBpbnRubywKLSAgICBEUE1JX3JlZ3MgKnJlZ3MpCi17Ci0gICAgSU5UQ1JGICBybXJlZ3M7Ci0gICAgdWxvbmcgICBlYXggPSAwOwotCi0gICAgaWYgKCFJbml0SW50MTAoKSkKLQlyZXR1cm47Ci0gICAgbWVtc2V0KCZybXJlZ3MsIDAsIHNpemVvZihybXJlZ3MpKTsKLSAgICBybXJlZ3MudWxCSU9TSW50Tm8gPSBpbnRubzsKLSAgICBJTkRQTUkoZWF4KTsgSU5EUE1JKGVieCk7IElORFBNSShlY3gpOyBJTkRQTUkoZWR4KTsgSU5EUE1JKGVzaSk7IElORFBNSShlZGkpOwotICAgIHJtcmVncy5hQ1JGLnJlZ19kcyA9IHJlZ3MtPmRzOwotICAgIHJtcmVncy5hQ1JGLnJlZ19lcyA9IHJlZ3MtPmVzOwotICAgIGlmIChpbnRubyA9PSAweDEwKSB7Ci0JZWF4ID0gcm1yZWdzLmFDUkYucmVnX2VheDsKLQlzd2l0Y2ggKGVheCAmIDB4RkZGRikgewotCSAgICBjYXNlIDB4NEYwMDoKLQkJLyogV2UgaGF2ZSB0byBoYWNrIHRoZSB3YXkgdGhpcyBmdW5jdGlvbiB3b3JrcywgZHVlIHRvCi0JCSAqIHNvbWUgYnVncyBpbiB0aGUgSUJNIG1pbmktVkRNIEJJT1Mgc3VwcG9ydC4gU3BlY2lmaWNhbGx5Ci0JCSAqIHdlIG5lZWQgdG8gbWFrZSB0aGUgaW5wdXQgYnVmZmVyIGFuZCBvdXRwdXQgYnVmZmVyIHRoZQotCQkgKiAnc2FtZScgYnVmZmVyLCBhbmQgdGhhdCBFUzpTSSBwb2ludHMgdG8gdGhlIG91dHB1dAotCQkgKiBidWZmZXIgKGlnbm9yZWQgYnkgdGhlIEJJT1MpLiBUaGUgZGF0YSB3aWxsIGVuZCB1cAotCQkgKiBiZWluZyByZXR1cm5lZCBpbiB0aGUgaW5wdXQgYnVmZmVyLCBleGNlcHQgZm9yIHRoZQotCQkgKiBmaXJzdCBmb3VyIGJ5dGVzICgnVkVTQScpIHRoYXQgd2lsbCBub3QgYmUgcmV0dXJuZWQuCi0JCSAqLwotCQlybXJlZ3MucEJbMF0uYkJ1ZmZlclR5cGUgPSBJTlBVVF9CVUZGRVI7Ci0JCXJtcmVncy5wQlswXS5iU2VsQ1JGID0gUkVHX09GRlNFVChyZWdfZXMpOwotCQlybXJlZ3MucEJbMF0uYk9mZkNSRiA9IFJFR19PRkZTRVQocmVnX2VkaSk7Ci0JCXJtcmVncy5wQlswXS5wQWRkcmVzcyA9IFJNQnVmOwotCQlybXJlZ3MucEJbMF0udWxTaXplID0gNDsKLQkJcm1yZWdzLnBCWzFdLmJCdWZmZXJUeXBlID0gT1VUUFVUX0JVRkZFUjsKLQkJcm1yZWdzLnBCWzFdLmJTZWxDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lcyk7Ci0JCXJtcmVncy5wQlsxXS5iT2ZmQ1JGID0gUkVHX09GRlNFVChyZWdfZXNpKTsKLQkJcm1yZWdzLnBCWzFdLnBBZGRyZXNzID0gKChQQllURSlSTUJ1ZikrNDsKLQkJcm1yZWdzLnBCWzFdLnVsU2l6ZSA9IDUxMi00OwotCQlicmVhazsKLQkgICAgY2FzZSAweDRGMDE6Ci0JCXJtcmVncy5wQlswXS5iQnVmZmVyVHlwZSA9IE9VVFBVVF9CVUZGRVI7Ci0JCXJtcmVncy5wQlswXS5iU2VsQ1JGID0gUkVHX09GRlNFVChyZWdfZXMpOwotCQlybXJlZ3MucEJbMF0uYk9mZkNSRiA9IFJFR19PRkZTRVQocmVnX2VkaSk7Ci0JCXJtcmVncy5wQlswXS5wQWRkcmVzcyA9IFJNQnVmOwotCQlybXJlZ3MucEJbMF0udWxTaXplID0gMjU2OwotCQlicmVhazsKLQkgICAgY2FzZSAweDRGMDI6Ci0JCXJtcmVncy5wQlswXS5iQnVmZmVyVHlwZSA9IElOUFVUX0JVRkZFUjsKLQkJcm1yZWdzLnBCWzBdLmJTZWxDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lcyk7Ci0JCXJtcmVncy5wQlswXS5iT2ZmQ1JGID0gUkVHX09GRlNFVChyZWdfZWRpKTsKLQkJcm1yZWdzLnBCWzBdLnBBZGRyZXNzID0gUk1CdWY7Ci0JCXJtcmVncy5wQlswXS51bFNpemUgPSAyNTY7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDB4NEYwOToKLQkJcm1yZWdzLnBCWzBdLmJCdWZmZXJUeXBlID0gSU5QVVRfQlVGRkVSOwotCQlybXJlZ3MucEJbMF0uYlNlbENSRiA9IFJFR19PRkZTRVQocmVnX2VzKTsKLQkJcm1yZWdzLnBCWzBdLmJPZmZDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lZGkpOwotCQlybXJlZ3MucEJbMF0ucEFkZHJlc3MgPSBSTUJ1ZjsKLQkJcm1yZWdzLnBCWzBdLnVsU2l6ZSA9IDEwMjQ7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDB4NEYwQToKLQkJLyogRHVlIHRvIGJ1Z3MgaW4gdGhlIG1pbmktVkRNIGluIE9TLzIsIHRoZSAweDRGMEEgcHJvdGVjdGVkCi0JCSAqIG1vZGUgaW50ZXJmYWNlIGZ1bmN0aW9ucyB3aWxsIG5vdCB3b3JrICh3ZSBuZXZlciBnZXQgYW55Ci0JCSAqIHNlbGVjdG9ycyByZXR1cm5lZCksIHNvIHdlIGZhaWwgdGhpcyBmdW5jdGlvbiBoZXJlLiBUaGUKLQkJICogcmVzdCBvZiB0aGUgVkJFL0NvcmUgZHJpdmVyIHdpbGwgd29yayBwcm9wZXJseSBpZiB0aGlzCi0JCSAqIGZ1bmN0aW9uIGlzIGZhaWxlZCwgYmVjYXVzZSB0aGUgVkJFIDIuMCBhbmQgMy4wIHNwZWNzCi0JCSAqIGFsbG93IGZvciB0aGlzLgotCQkgKi8KLQkJcmVncy0+ZWF4ID0gMHgwMTRGOwotCQlyZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgaWYgKHVzZVZQTUkpCi0JUE1fVklERU9QTUkzMlJlcXVlc3QoJkFkYXB0ZXIsUE1JUkVRVUVTVF9TT0ZUV0FSRUlOVCxOVUxMLCZybXJlZ3MpOwotICAgIGVsc2UgewotCURvc1N5c0N0bCg2LCAmcm1yZWdzKTsKLQl9Ci0KLSAgICBPVVREUE1JKGVheCk7IE9VVERQTUkoZWJ4KTsgT1VURFBNSShlY3gpOyBPVVREUE1JKGVkeCk7IE9VVERQTUkoZXNpKTsgT1VURFBNSShlZGkpOwotICAgIGlmICgoKHJlZ3MtPmVheCAmIDB4RkZGRikgPT0gMHgwMDRGKSAmJiAoKGVheCAmIDB4RkZGRikgPT0gMHg0RjAwKSkgewotCS8qIEhhY2sgdG8gZml4IHVwIHRoZSBtaXNzaW5nICdWRVNBJyBzdHJpbmcgZm9yIG1pbmktVkRNICovCi0JbWVtY3B5KFJNQnVmLCJWRVNBIiw0KTsKLQl9Ci0gICAgcmVncy0+ZHMgPSBybXJlZ3MuYUNSRi5yZWdfZHM7Ci0gICAgcmVncy0+ZXMgPSBybXJlZ3MuYUNSRi5yZWdfZXM7Ci0gICAgcmVncy0+ZmxhZ3MgPSBybXJlZ3MuYUNSRi5yZWdfZWZsYWc7Ci19Ci0KLSNkZWZpbmUgSU4ocmVnKSAgICAgcm1yZWdzLnJlZyA9IGluLT5lLnJlZwotI2RlZmluZSBPVVQocmVnKSAgICBvdXQtPmUucmVnID0gcm1yZWdzLnJlZwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODYoCi0gICAgaW50IGludG5vLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1SRUdTICpvdXQpCi17Ci0gICAgRFBNSV9yZWdzICAgcm1yZWdzOwotCi0gICAgbWVtc2V0KCZybXJlZ3MsIDAsIHNpemVvZihybXJlZ3MpKTsKLSAgICBJTihlYXgpOyBJTihlYngpOyBJTihlY3gpOyBJTihlZHgpOyBJTihlc2kpOyBJTihlZGkpOwotICAgIERQTUlfaW50ODYoaW50bm8sJnJtcmVncyk7Ci0gICAgT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVkeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKLSAgICBvdXQtPnguY2ZsYWcgPSBybXJlZ3MuZmxhZ3MgJiAweDE7Ci0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2ludDg2eCgKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBEUE1JX3JlZ3MgICBybXJlZ3M7Ci0KLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0gICAgcm1yZWdzLmVzID0gc3JlZ3MtPmVzOwotICAgIHJtcmVncy5kcyA9IHNyZWdzLT5kczsKLSAgICBEUE1JX2ludDg2KGludG5vLCZybXJlZ3MpOwotICAgIE9VVChlYXgpOyBPVVQoZWJ4KTsgT1VUKGVjeCk7IE9VVChlZHgpOyBPVVQoZXNpKTsgT1VUKGVkaSk7Ci0gICAgc3JlZ3MtPmVzID0gcm1yZWdzLmVzOwotICAgIHNyZWdzLT5jcyA9IHJtcmVncy5jczsKLSAgICBzcmVncy0+c3MgPSBybXJlZ3Muc3M7Ci0gICAgc3JlZ3MtPmRzID0gcm1yZWdzLmRzOwotICAgIG91dC0+eC5jZmxhZyA9IHJtcmVncy5mbGFncyAmIDB4MTsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgYSByZWFsIG1vZGUgZmFyIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKAotICAgIHVpbnQgc2VnLAotICAgIHVpbnQgb2ZmLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgUE1fZmF0YWxFcnJvcigiUE1fY2FsbFJlYWxNb2RlIG5vdCBzdXBwb3J0ZWQgb24gT1MvMiEiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KAotICAgIHVsb25nICpwaHlzaWNhbCwKLSAgICB1bG9uZyAqdG90YWwpCi17Ci0gICAgLyogVW5hYmxlIHRvIGdldCByZWxpYWJsZSB2YWx1ZXMgZnJvbSBPUy8yIGZvciB0aGlzICovCi0gICAgKnBoeXNpY2FsID0gKnRvdGFsID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIGxvY2tlZCwgcGh5c2ljYWwgbWVtb3J5IGZvciBETUEgb3BlcmF0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NMb2NrZWRNZW0oCi0gICAgdWludCBzaXplLAotICAgIHVsb25nICpwaHlzQWRkciwKLSAgICBpYm9vbCBjb250aWd1b3VzLAotICAgIGlib29sIGJlbG93MTZNKQotewotICAgIHBhcm1zSW5bMF0gPSBzaXplOwotICAgIHBhcm1zSW5bMV0gPSBjb250aWd1b3VzOwotICAgIHBhcm1zSW5bMl0gPSBiZWxvdzE2TTsKLSAgICBDYWxsU0RESGVscChQTUhFTFBfQUxMT0NMT0NLRUQpOwotICAgICpwaHlzQWRkciA9IHBhcm1zT3V0WzFdOwotICAgIHJldHVybiAodm9pZCopcGFybXNPdXRbMF07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIGxvY2tlZCBwaHlzaWNhbCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKAotICAgIHZvaWQgKnAsCi0gICAgdWludCBzaXplLAotICAgIGlib29sIGNvbnRpZ3VvdXMpCi17Ci0gICAgcGFybXNJblswXSA9ICh1bG9uZylwOwotICAgIENhbGxTRERIZWxwKFBNSEVMUF9GUkVFTE9DS0VEKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZXMgYSBuZXcgYmxvY2sgb2YgcGFnZXMgZm9yIHRoZSBwYWdlIGJsb2NrIG1hbmFnZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHBhZ2VibG9jayAqUE1fYWRkTmV3UGFnZUJsb2NrKHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgaTsKLSAgICBwYWdlYmxvY2sgICAqbmV3QmxvY2s7Ci0gICAgY2hhciAgICAgICAgKnAsKm5leHQ7Ci0KLSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBuZXcgcGFnZSBibG9jaywgYW5kIGFkZCB0byBoZWFkIG9mIGxpc3QgKi8KLSAgICBpZiAoRG9zQWxsb2NTaGFyZWRNZW0oKHZvaWQqKikmbmV3QmxvY2ssTlVMTCxQQUdFX0JMT0NLX1NJWkUsT0JKX0dFVFRBQkxFIHwgUEFHX1JFQUQgfCBQQUdfV1JJVEUgfCBQQUdfQ09NTUlUKSkKLQlyZXR1cm4gTlVMTDsKLSAgICBpZiAoIVBNX2xvY2tEYXRhUGFnZXMobmV3QmxvY2ssUEFHRV9CTE9DS19TSVpFLCZuZXdCbG9jay0+bG9ja0hhbmRsZSkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgbmV3QmxvY2stPnByZXYgPSBOVUxMOwotICAgIG5ld0Jsb2NrLT5uZXh0ID0gcGFnZUJsb2NrczsKLSAgICBpZiAocGFnZUJsb2NrcykKLQlwYWdlQmxvY2tzLT5wcmV2ID0gbmV3QmxvY2s7Ci0gICAgcGFnZUJsb2NrcyA9IG5ld0Jsb2NrOwotCi0gICAgLyogSW5pdGlhbGlzZSB0aGUgcGFnZSBhbGlnbmVkIGZyZWUgbGlzdCBmb3IgdGhlIHBhZ2UgYmxvY2sgKi8KLSAgICBuZXdCbG9jay0+ZnJlZUNvdW50ID0gUEFHRVNfUEVSX0JMT0NLOwotICAgIG5ld0Jsb2NrLT5mcmVlTGlzdCA9IHAgPSAoY2hhciopKCgodWxvbmcpKG5ld0Jsb2NrICsgMSkgKyAoUE1fUEFHRV9TSVpFLTEpKSAmIH4oUE1fUEFHRV9TSVpFLTEpKTsKLSAgICBuZXdCbG9jay0+ZnJlZUxpc3RTdGFydCA9IG5ld0Jsb2NrLT5mcmVlTGlzdDsKLSAgICBuZXdCbG9jay0+ZnJlZUxpc3RFbmQgPSBwICsgKFBBR0VTX1BFUl9CTE9DSy0xKSAqIFBNX1BBR0VfU0laRTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgUEFHRVNfUEVSX0JMT0NLOyBpKysscCA9IG5leHQpCi0JRlJFRUxJU1RfTkVYVChwKSA9IG5leHQgPSBwICsgUE1fUEFHRV9TSVpFOwotICAgIEZSRUVMSVNUX05FWFQocCAtIFBNX1BBR0VfU0laRSkgPSBOVUxMOwotICAgIHJldHVybiBuZXdCbG9jazsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZXMgYSBwYWdlIGFsaWduZWQgYW5kIHBhZ2Ugc2l6ZWQgYmxvY2sgb2YgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUGFnZSgKLSAgICBpYm9vbCBsb2NrZWQpCi17Ci0gICAgcGFnZWJsb2NrICAgKmJsb2NrOwotICAgIHZvaWQgICAgICAgICpwOwotCi0gICAgLyogU2NhbiB0aGUgYmxvY2sgbGlzdCBsb29raW5nIGZvciBhbnkgZnJlZSBibG9ja3MuIEFsbG9jYXRlIGEgbmV3Ci0gICAgICogcGFnZSBibG9jayBpZiBubyBmcmVlIGJsb2NrcyBhcmUgZm91bmQuCi0gICAgICovCi0gICAgZm9yIChibG9jayA9IHBhZ2VCbG9ja3M7IGJsb2NrICE9IE5VTEw7IGJsb2NrID0gYmxvY2stPm5leHQpIHsKLQlpZiAoYmxvY2stPmZyZWVDb3VudCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIGlmIChibG9jayA9PSBOVUxMICYmIChibG9jayA9IFBNX2FkZE5ld1BhZ2VCbG9jaygpKSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgIGJsb2NrLT5mcmVlQ291bnQtLTsKLSAgICBwID0gYmxvY2stPmZyZWVMaXN0OwotICAgIGJsb2NrLT5mcmVlTGlzdCA9IEZSRUVMSVNUX05FWFQocCk7Ci0gICAgKHZvaWQpbG9ja2VkOwotICAgIHJldHVybiBwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBwYWdlIGFsaWduZWQgYW5kIHBhZ2Ugc2l6ZWQgYmxvY2sgb2YgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUGFnZSgKLSAgICB2b2lkICpwKQotewotICAgIHBhZ2VibG9jayAgICpibG9jazsKLQotICAgIC8qIEZpcnN0IGZpbmQgdGhlIHBhZ2UgYmxvY2sgdGhhdCB0aGlzIHBhZ2UgYmVsb25ncyB0byAqLwotICAgIGZvciAoYmxvY2sgPSBwYWdlQmxvY2tzOyBibG9jayAhPSBOVUxMOyBibG9jayA9IGJsb2NrLT5uZXh0KSB7Ci0JaWYgKHAgPj0gYmxvY2stPmZyZWVMaXN0U3RhcnQgJiYgcCA8PSBibG9jay0+ZnJlZUxpc3RFbmQpCi0JICAgIGJyZWFrOwotCX0KLSAgICBDSEVDSyhibG9jayAhPSBOVUxMKTsKLQotICAgIC8qIE5vdyBmcmVlIHRoZSBibG9jayBieSBhZGRpbmcgaXQgdG8gdGhlIGZyZWUgbGlzdCAqLwotICAgIEZSRUVMSVNUX05FWFQocCkgPSBibG9jay0+ZnJlZUxpc3Q7Ci0gICAgYmxvY2stPmZyZWVMaXN0ID0gcDsKLSAgICBpZiAoKytibG9jay0+ZnJlZUNvdW50ID09IFBBR0VTX1BFUl9CTE9DSykgewotCS8qIElmIGFsbCBwYWdlcyBpbiB0aGUgcGFnZSBibG9jayBhcmUgbm93IGZyZWUsIGZyZWUgdGhlIGVudGlyZQotCSAqIHBhZ2UgYmxvY2sgaXRzZWxmLgotCSAqLwotCWlmIChibG9jayA9PSBwYWdlQmxvY2tzKSB7Ci0JICAgIC8qIERlbGV0ZSBmcm9tIGhlYWQgKi8KLQkgICAgcGFnZUJsb2NrcyA9IGJsb2NrLT5uZXh0OwotCSAgICBpZiAoYmxvY2stPm5leHQpCi0JCWJsb2NrLT5uZXh0LT5wcmV2ID0gTlVMTDsKLQkgICAgfQotCWVsc2UgewotCSAgICAvKiBEZWxldGUgZnJvbSBtaWRkbGUgb2YgbGlzdCAqLwotCSAgICBDSEVDSyhibG9jay0+cHJldiAhPSBOVUxMKTsKLQkgICAgYmxvY2stPnByZXYtPm5leHQgPSBibG9jay0+bmV4dDsKLQkgICAgaWYgKGJsb2NrLT5uZXh0KQotCQlibG9jay0+bmV4dC0+cHJldiA9IGJsb2NrLT5wcmV2OwotCSAgICB9Ci0KLQkvKiBVbmxvY2sgdGhlIG1lbW9yeSBhbmQgZnJlZSBpdCAqLwotCVBNX3VubG9ja0RhdGFQYWdlcyhibG9jayxQQUdFX0JMT0NLX1NJWkUsJmJsb2NrLT5sb2NrSGFuZGxlKTsKLQlEb3NGcmVlTWVtKGJsb2NrKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGluIGFsbCB0aGUgc2hhcmVkIG1lbW9yeSBibG9ja3MgZm9yIG1hbmFnaW5nIHRoZSBtZW1vcnkgcGFnZXMgYWJvdmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9tYXBTaGFyZWRQYWdlcyh2b2lkKQotewotICAgIHBhZ2VibG9jayAgICpibG9jazsKLQotICAgIC8qIE1hcCBhbGwgdGhlIHBhZ2UgYmxvY2tzIGFib3ZlIGludG8gdGhlIHNoYXJlZCBtZW1vcnkgZm9yIHByb2Nlc3MgKi8KLSAgICBmb3IgKGJsb2NrID0gcGFnZUJsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+bmV4dCkgewotCURvc0dldFNoYXJlZE1lbShibG9jaywgUEFHX1JFQUQgfCBQQUdfV1JJVEUpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXMoCi0gICAgdm9pZCAqcCwKLSAgICB1aW50IGxlbiwKLSAgICBQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKQotewotICAgIHBhcm1zSW5bMF0gPSAodWxvbmcpcDsKLSAgICBwYXJtc0luWzFdID0gbGVuOwotICAgIENhbGxTRERIZWxwKFBNSEVMUF9MT0NLUEFHRVMpOwotICAgIGxvY2tIYW5kbGUtPmhbMF0gPSBwYXJtc091dFsxXTsKLSAgICBsb2NrSGFuZGxlLT5oWzFdID0gcGFybXNPdXRbMl07Ci0gICAgbG9ja0hhbmRsZS0+aFsyXSA9IHBhcm1zT3V0WzNdOwotICAgIHJldHVybiBwYXJtc091dFswXTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1VbmxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fdW5sb2NrRGF0YVBhZ2VzKAotICAgIHZvaWQgKnAsCi0gICAgdWludCBsZW4sCi0gICAgUE1fbG9ja0hhbmRsZSAqbG9ja0hhbmRsZSkKLXsKLSAgICBwYXJtc0luWzBdID0gbG9ja0hhbmRsZS0+aFswXTsKLSAgICBwYXJtc0luWzFdID0gbG9ja0hhbmRsZS0+aFsxXTsKLSAgICBwYXJtc0luWzJdID0gbG9ja0hhbmRsZS0+aFsyXTsKLSAgICByZXR1cm4gQ2FsbFNEREhlbHAoUE1IRUxQX1VOTE9DS1BBR0VTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXMoCi0gICAgdm9pZCAoKnApKCksCi0gICAgdWludCBsZW4sCi0gICAgUE1fbG9ja0hhbmRsZSAqbG9ja0hhbmRsZSkKLXsKLSAgICBwYXJtc0luWzBdID0gKHVsb25nKXA7Ci0gICAgcGFybXNJblsxXSA9IGxlbjsKLSAgICBDYWxsU0RESGVscChQTUhFTFBfTE9DS1BBR0VTKTsKLSAgICBsb2NrSGFuZGxlLT5oWzBdID0gcGFybXNPdXRbMV07Ci0gICAgbG9ja0hhbmRsZS0+aFsxXSA9IHBhcm1zT3V0WzJdOwotICAgIGxvY2tIYW5kbGUtPmhbMl0gPSBwYXJtc091dFszXTsKLSAgICByZXR1cm4gcGFybXNPdXRbMF07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVW5sb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX3VubG9ja0NvZGVQYWdlcygKLSAgICB2b2lkICgqcCkoKSwKLSAgICB1aW50IGxlbiwKLSAgICBQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKQotewotICAgIHBhcm1zSW5bMF0gPSBsb2NrSGFuZGxlLT5oWzBdOwotICAgIHBhcm1zSW5bMV0gPSBsb2NrSGFuZGxlLT5oWzFdOwotICAgIHBhcm1zSW5bMl0gPSBsb2NrSGFuZGxlLT5oWzJdOwotICAgIHJldHVybiBDYWxsU0RESGVscChQTUhFTFBfVU5MT0NLUEFHRVMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBiYW5rcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBKAotICAgIGludCBiYW5rKQotewotICAgIElOVENSRiAgcm1yZWdzOwotCi0gICAgaWYgKCFJbml0SW50MTAoKSkKLQlyZXR1cm47Ci0gICAgbWVtc2V0KCZybXJlZ3MsIDAsIHNpemVvZihybXJlZ3MpKTsKLSAgICBybXJlZ3MudWxCSU9TSW50Tm8gPSAweDEwOwotICAgIHJtcmVncy5hQ1JGLnJlZ19lYXggPSAweDRGMDU7Ci0gICAgcm1yZWdzLmFDUkYucmVnX2VieCA9IDB4MDAwMDsKLSAgICBybXJlZ3MuYUNSRi5yZWdfZWR4ID0gYmFuazsKLSAgICBQTV9WSURFT1BNSTMyUmVxdWVzdCgmQWRhcHRlcixQTUlSRVFVRVNUX1NPRlRXQVJFSU5ULCZybXJlZ3MsTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0FCKAotICAgIGludCBiYW5rKQotewotICAgIElOVENSRiAgcm1yZWdzOwotCi0gICAgaWYgKCFJbml0SW50MTAoKSkKLQlyZXR1cm47Ci0gICAgbWVtc2V0KCZybXJlZ3MsIDAsIHNpemVvZihybXJlZ3MpKTsKLSAgICBybXJlZ3MudWxCSU9TSW50Tm8gPSAweDEwOwotICAgIHJtcmVncy5hQ1JGLnJlZ19lYXggPSAweDRGMDU7Ci0gICAgcm1yZWdzLmFDUkYucmVnX2VieCA9IDB4MDAwMDsKLSAgICBybXJlZ3MuYUNSRi5yZWdfZWR4ID0gYmFuazsKLSAgICBQTV9WSURFT1BNSTMyUmVxdWVzdCgmQWRhcHRlcixQTUlSRVFVRVNUX1NPRlRXQVJFSU5ULCZybXJlZ3MsTlVMTCk7Ci0gICAgcm1yZWdzLnVsQklPU0ludE5vID0gMHgxMDsKLSAgICBybXJlZ3MuYUNSRi5yZWdfZWF4ID0gMHg0RjA1OwotICAgIHJtcmVncy5hQ1JGLnJlZ19lYnggPSAweDAwMDE7Ci0gICAgcm1yZWdzLmFDUkYucmVnX2VkeCA9IGJhbms7Ci0gICAgUE1fVklERU9QTUkzMlJlcXVlc3QoJkFkYXB0ZXIsUE1JUkVRVUVTVF9TT0ZUV0FSRUlOVCwmcm1yZWdzLE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBzdGFydCBhZGRyZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0Q1JUU3RhcnQoCi0gICAgaW50IHgsCi0gICAgaW50IHksCi0gICAgaW50IHdhaXRWUlQpCi17Ci0gICAgSU5UQ1JGICBybXJlZ3M7Ci0KLSAgICBpZiAoIUluaXRJbnQxMCgpKQotCXJldHVybjsKLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIHJtcmVncy51bEJJT1NJbnRObyA9IDB4MTA7Ci0gICAgcm1yZWdzLmFDUkYucmVnX2VheCA9IDB4NEYwNzsKLSAgICBybXJlZ3MuYUNSRi5yZWdfZWJ4ID0gd2FpdFZSVDsKLSAgICBybXJlZ3MuYUNSRi5yZWdfZWN4ID0geDsKLSAgICBybXJlZ3MuYUNSRi5yZWdfZWR4ID0geTsKLSAgICBQTV9WSURFT1BNSTMyUmVxdWVzdCgmQWRhcHRlcixQTUlSRVFVRVNUX1NPRlRXQVJFSU5ULCZybXJlZ3MsTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRXhlY3V0ZSB0aGUgUE9TVCBvbiB0aGUgc2Vjb25kYXJ5IEJJT1MgZm9yIGEgY29udHJvbGxlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAotICAgIHVzaG9ydCBheFZhbCwKLSAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCi0gICAgdm9pZCAqbWFwcGVkQklPUywKLSAgICB1bG9uZyBCSU9TTGVuKQotewotICAgICh2b2lkKWF4VmFsOwotICAgICh2b2lkKUJJT1NQaHlzQWRkcjsKLSAgICAodm9pZCltYXBwZWRCSU9TOwotICAgICh2b2lkKUJJT1NMZW47Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFVFVSTlM6Ci1FcnJvciBjb2RlIGRlc2NyaWJpbmcgdGhlIHJlc3VsdC4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZW5hYmxlV3JpdGVDb21iaW5lKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgc2l6ZSwKLSAgICB1aW50IHR5cGUpCi17Ci0gICAgcmV0dXJuIE1UUlJfZW5hYmxlV3JpdGVDb21iaW5lKGJhc2Usc2l6ZSx0eXBlKTsKLX0KLQotLyogVE9ETzogTW92ZSB0aGUgTVRSUiBoZWxwZXIgc3R1ZmYgaW50byB0aGUgY2FsbCBnYXRlLCBvciBiZXR0ZXIgeWV0ICovCi0vKiAgICAgICBlbnRpcmVseSBpbnRvIHRoZSByaW5nIDAgaGVscGVyIGRyaXZlciEhICovCi0KLS8qIE1UUlIgaGVscGVyIGZ1bmN0aW9ucy4gVG8gbWFrZSBpdCBlYXNpZXIgdG8gaW1wbGVtZW50IHRoZSBNVFJSIHN1cHBvcnQKLSAqIHVuZGVyIE9TLzIsIHdlIHNpbXBseSBwdXQgb3VyIHJpbmcgMCBoZWxwZXIgZnVuY3Rpb25zIGludG8gdGhlCi0gKiBoZWxwZXIgZGV2aWNlIGRyaXZlciByYXRoZXIgdGhhbiB0aGUgZW50aXJlIE1UUlIgbW9kdWxlLiBUaGlzIG1ha2VzCi0gKiBpdCBlYXNpZXIgdG8gbWFpbnRhaW4gdGhlIE1UUlIgc3VwcG9ydCBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGRlYWwKLSAqIHdpdGggMTYtYml0IHJpbmcgMCBjb2RlIGluIHRoZSBNVFJSIGxpYnJhcnkuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GbHVzaCB0aGUgdHJhbnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZsdXNoVExCKHZvaWQpCi17Ci0gICAgQ2FsbFNEREhlbHAoUE1IRUxQX0ZMVVNIVExCKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdHJ1ZSBpZiByaW5nIDAgKG9yIGlmIHdlIGNhbiBjYWxsIHRoZSBoZWxwZXJzIGZ1bmN0aW9ucyBhdCByaW5nIDApCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgX0FTTUFQSSBfTVRSUl9pc1JpbmcwKHZvaWQpCi17Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgQ1I0IHJlZ2lzdGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX0FTTUFQSSBfTVRSUl9zYXZlQ1I0KHZvaWQpCi17Ci0gICAgcmV0dXJuIENhbGxTRERIZWxwKFBNSEVMUF9TQVZFQ1I0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgQ1I0IHJlZ2lzdGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfQVNNQVBJIF9NVFJSX3Jlc3RvcmVDUjQodWxvbmcgY3I0VmFsKQotewotICAgIHBhcm1zSW5bMF0gPSBjcjRWYWw7Ci0gICAgQ2FsbFNEREhlbHAoUE1IRUxQX1JFU1RPUkVDUjQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgYSBtYWNoaW5lIHN0YXR1cyByZWdpc3RlciBmb3IgdGhlIENQVS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9BU01BUEkgX01UUlJfcmVhZE1TUigKLSAgICB1bG9uZyByZWcsCi0gICAgdWxvbmcgKmVheCwKLSAgICB1bG9uZyAqZWR4KQotewotICAgIHBhcm1zSW5bMF0gPSByZWc7Ci0gICAgQ2FsbFNEREhlbHAoUE1IRUxQX1JFQURNU1IpOwotICAgICplYXggPSBwYXJtc091dFswXTsKLSAgICAqZWR4ID0gcGFybXNPdXRbMV07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV3JpdGUgYSBtYWNoaW5lIHN0YXR1cyByZWdpc3RlciBmb3IgdGhlIENQVS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9BU01BUEkgX01UUlJfd3JpdGVNU1IoCi0gICAgdWxvbmcgcmVnLAotICAgIHVsb25nIGVheCwKLSAgICB1bG9uZyBlZHgpCi17Ci0gICAgcGFybXNJblswXSA9IHJlZzsKLSAgICBwYXJtc0luWzFdID0gZWF4OwotICAgIHBhcm1zSW5bMl0gPSBlZHg7Ci0gICAgQ2FsbFNEREhlbHAoUE1IRUxQX1dSSVRFTVNSKTsKLX0KLQotUE1fTU9EVUxFIFBNQVBJIFBNX2xvYWRMaWJyYXJ5KAotICAgIGNvbnN0IGNoYXIgKnN6RExMTmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyB0byBsb2FkIHNoYXJlZCBsaWJyYXJpZXMhICovCi0gICAgKHZvaWQpc3pETExOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0UHJvY0FkZHJlc3MoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUsCi0gICAgY29uc3QgY2hhciAqc3pQcm9jTmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICAodm9pZCloTW9kdWxlOwotICAgICh2b2lkKXN6UHJvY05hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZUxpYnJhcnkoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgKHZvaWQpaE1vZHVsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbnRlcm5hbCBmdW5jdGlvbiB0byBjb252ZXJ0IHRoZSBmaW5kIGRhdGEgdG8gdGhlIGdlbmVyaWMgaW50ZXJmYWNlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNvbnZlcnRGaW5kRGF0YSgKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEsCi0gICAgRklMRUZJTkRCVUYzICpibGspCi17Ci0gICAgdWxvbmcgICBkd1NpemUgPSBmaW5kRGF0YS0+ZHdTaXplOwotCi0gICAgbWVtc2V0KGZpbmREYXRhLDAsZmluZERhdGEtPmR3U2l6ZSk7Ci0gICAgZmluZERhdGEtPmR3U2l6ZSA9IGR3U2l6ZTsKLSAgICBpZiAoYmxrLT5hdHRyRmlsZSAmIEZJTEVfUkVBRE9OTFkpCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX1JFQURPTkxZOwotICAgIGlmIChibGstPmF0dHJGaWxlICYgRklMRV9ESVJFQ1RPUlkpCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX0RJUkVDVE9SWTsKLSAgICBpZiAoYmxrLT5hdHRyRmlsZSAmIEZJTEVfQVJDSElWRUQpCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX0FSQ0hJVkU7Ci0gICAgaWYgKGJsay0+YXR0ckZpbGUgJiBGSUxFX0hJRERFTikKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfSElEREVOOwotICAgIGlmIChibGstPmF0dHJGaWxlICYgRklMRV9TWVNURU0pCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX1NZU1RFTTsKLSAgICBmaW5kRGF0YS0+c2l6ZUxvID0gYmxrLT5jYkZpbGU7Ci0gICAgZmluZERhdGEtPnNpemVIaSA9IDA7Ci0gICAgc3RybmNweShmaW5kRGF0YS0+bmFtZSxibGstPmFjaE5hbWUsUE1fTUFYX1BBVEgpOwotICAgIGZpbmREYXRhLT5uYW1lW1BNX01BWF9QQVRILTFdID0gMDsKLX0KLQotI2RlZmluZSBGSU5EX01BU0sgICAoRklMRV9BUkNISVZFRCB8IEZJTEVfRElSRUNUT1JZIHwgRklMRV9TWVNURU0gfCBGSUxFX0hJRERFTiB8IEZJTEVfUkVBRE9OTFkpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICpQTUFQSSBQTV9maW5kRmlyc3RGaWxlKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICBGSUxFRklOREJVRjMgICAgYmxrOwotICAgIEhESVIgICAgICAgICAgICBoZGlyID0gSERJUl9DUkVBVEU7Ci0gICAgdWxvbmcgICAgICAgICAgIGNvdW50ID0gMTsKLQotICAgIGlmIChEb3NGaW5kRmlyc3QoKFBTWilmaWxlbmFtZSwmaGRpcixGSU5EX01BU0ssJmJsayxzaXplb2YoYmxrKSwmY291bnQsRklMX1NUQU5EQVJEKSA9PSBOT19FUlJPUikgewotCWNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSwmYmxrKTsKLQlyZXR1cm4gKHZvaWQqKWhkaXI7Ci0JfQotICAgIHJldHVybiBQTV9GSUxFX0lOVkFMSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgbmV4dCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2ZpbmROZXh0RmlsZSgKLSAgICB2b2lkICpoYW5kbGUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIEZJTEVGSU5EQlVGMyAgICBibGs7Ci0gICAgdWxvbmcgICAgICAgICAgIGNvdW50ID0gMTsKLQotICAgIGlmIChEb3NGaW5kTmV4dCgoSERJUiloYW5kbGUsJmJsayxzaXplb2YoYmxrKSwmY291bnQpID09IE5PX0VSUk9SKSB7Ci0JY29udmVydEZpbmREYXRhKGZpbmREYXRhLCZibGspOwotCXJldHVybiB0cnVlOwotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2xvc2UgdGhlIGZpbmQgcHJvY2VzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmluZENsb3NlKAotICAgIHZvaWQgKmhhbmRsZSkKLXsKLSAgICBEb3NGaW5kQ2xvc2UoKEhESVIpaGFuZGxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZSBpcyBhIHZhbGlkIGRyaXZlIG9yIG5vdC4gVW5kZXIgVW5peCB0aGlzCi1mdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZXhjZXB0IGEgdmFsdWUgb2YgMyAoY29uc2lkZXJlZAotdGhlIHJvb3QgZHJpdmUsIGFuZCBlcXVpdmFsZW50IHRvIEM6IGZvciBub24tVW5peCBzeXN0ZW1zKS4gVGhlIGRyaXZlCi1udW1iZXJpbmcgaXM6Ci0KLSAgICAwICAgLSBDdXJyZW50IGRyaXZlCi0gICAgMSAgIC0gRHJpdmUgQToKLSAgICAyICAgLSBEcml2ZSBCOgotICAgIDMgICAtIERyaXZlIEM6Ci0gICAgZXRjCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9kcml2ZVZhbGlkKAotICAgIGNoYXIgZHJpdmUpCi17Ci0gICAgdWxvbmcgICBjbnREaXNrLGNudERyaXZlTWFwOwotICAgIGlib29sICAgdmFsaWQ7Ci0KLSAgICBEb3NRdWVyeUN1cnJlbnREaXNrKCZjbnREaXNrLCZjbnREcml2ZU1hcCk7Ci0gICAgdmFsaWQgPSAoRG9zU2V0RGVmYXVsdERpc2soZHJpdmUpID09IE5PX0VSUk9SKTsKLSAgICBEb3NTZXREZWZhdWx0RGlzayhjbnREaXNrKTsKLSAgICByZXR1cm4gdmFsaWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWZlZCBkcml2ZS4KLVVuZGVyIFVuaXggdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcmVnYXJkbGVzcwotb2Ygd2hhdCB0aGUgdmFsdWUgb2YgJ2RyaXZlJyBpcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2dldGRjd2QoCi0gICAgaW50IGRyaXZlLAotICAgIGNoYXIgKmRpciwKLSAgICBpbnQgbGVuKQotewotICAgIHVsb25nIGxlbmd0aCA9IGxlbjsKLQotICAgIERvc1F1ZXJ5Q3VycmVudERpcihkcml2ZSwgKFBTWilkaXIsICZsZW5ndGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICB1aW50IGF0dHJpYikKLXsKLSAgICBGSUxFU1RBVFVTMyBzOwotCi0gICAgaWYgKERvc1F1ZXJ5UGF0aEluZm8oKFBTWilmaWxlbmFtZSxGSUxfU1RBTkRBUkQsKFBWT0lEKSZzLHNpemVvZihzKSkpCi0JcmV0dXJuOwotICAgIHMuYXR0ckZpbGUgPSAwOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQotCXMuYXR0ckZpbGUgfD0gRklMRV9SRUFET05MWTsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9BUkNISVZFKQotCXMuYXR0ckZpbGUgfD0gRklMRV9BUkNISVZFRDsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9ISURERU4pCi0Jcy5hdHRyRmlsZSB8PSBGSUxFX0hJRERFTjsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9TWVNURU0pCi0Jcy5hdHRyRmlsZSB8PSBGSUxFX1NZU1RFTTsKLSAgICBEb3NTZXRQYXRoSW5mbygoUFNaKWZpbGVuYW1lLEZJTF9TVEFOREFSRCwoUFZPSUQpJnMsc2l6ZW9mKHMpLDBMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQgUE1BUEkgUE1fZ2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgRklMRVNUQVRVUzMgZnMzOwotICAgIHVpbnQgICAgICAgIHJldHZhbCA9IDA7Ci0KLSAgICBpZiAoRG9zUXVlcnlQYXRoSW5mbygoUFNaKWZpbGVuYW1lLCBGSUxfU1RBTkRBUkQsICZmczMsIHNpemVvZihGSUxFU1RBVFVTMykpKQotCXJldHVybiAwOwotICAgIGlmIChmczMuYXR0ckZpbGUgJiBGSUxFX1JFQURPTkxZKQotCXJldHZhbCB8PSBQTV9GSUxFX1JFQURPTkxZOwotICAgIGlmIChmczMuYXR0ckZpbGUgJiBGSUxFX0FSQ0hJVkVEKQotCXJldHZhbCB8PSBQTV9GSUxFX0FSQ0hJVkU7Ci0gICAgaWYgKGZzMy5hdHRyRmlsZSAmIEZJTEVfSElEREVOKQotCXJldHZhbCB8PSBQTV9GSUxFX0hJRERFTjsKLSAgICBpZiAoZnMzLmF0dHJGaWxlICYgRklMRV9TWVNURU0pCi0JcmV0dmFsIHw9IFBNX0ZJTEVfU1lTVEVNOwotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY3JlYXRlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX21rZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIHJldHVybiBEb3NDcmVhdGVEaXIoKFBTWilmaWxlbmFtZSxOVUxMKSA9PSBOT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byByZW1vdmUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fcm1kaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgcmV0dXJuIERvc0RlbGV0ZURpcigoUFNaKWZpbGVuYW1lKSA9PSBOT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2dldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIEZJTEVTVEFUVVMzIGZzMzsKLSAgICBzdHJ1Y3QgdG0gICB0YzsKLSAgICBzdHJ1Y3QgdG0gICAqcmV0OwotICAgIHRpbWVfdCAgICAgIHR0OwotCi0gICAgaWYgKERvc1F1ZXJ5UGF0aEluZm8oKFBTWilmaWxlbmFtZSwgRklMX1NUQU5EQVJELCAmZnMzLCBzaXplb2YoRklMRVNUQVRVUzMpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGdtVGltZSkgewotCXRjLnRtX3llYXIgPSBmczMuZmRhdGVMYXN0V3JpdGUueWVhciArIDgwOwotCXRjLnRtX21vbiA9IGZzMy5mZGF0ZUxhc3RXcml0ZS5tb250aCAtIDE7Ci0JdGMudG1fbWRheSA9IGZzMy5mZGF0ZUxhc3RXcml0ZS5kYXk7Ci0JdGMudG1faG91ciA9IGZzMy5mdGltZUxhc3RXcml0ZS5ob3VyczsKLQl0Yy50bV9taW4gPSBmczMuZnRpbWVMYXN0V3JpdGUubWludXRlczsKLQl0Yy50bV9zZWMgPSBmczMuZnRpbWVMYXN0V3JpdGUudHdvc2VjcyAqIDI7Ci0JaWYoKHR0ID0gbWt0aW1lKCZ0YykpID09IC0xKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JaWYoIShyZXQgPSBnbXRpbWUoJnR0KSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl0aW1lLT5zZWMgPSByZXQtPnRtX3NlYzsKLQl0aW1lLT5kYXkgPSByZXQtPnRtX21kYXk7Ci0JdGltZS0+bW9uID0gcmV0LT50bV9tb24gKyAxOwotCXRpbWUtPnllYXIgPSByZXQtPnRtX3llYXIgLSA4MDsKLQl0aW1lLT5taW4gPSByZXQtPnRtX21pbjsKLQl0aW1lLT5ob3VyID0gcmV0LT50bV9ob3VyOwotCX0KLSAgICBlbHNlIHsKLQl0aW1lLT5zZWMgPSBmczMuZnRpbWVMYXN0V3JpdGUudHdvc2VjcyAqIDI7Ci0JdGltZS0+ZGF5ID0gZnMzLmZkYXRlTGFzdFdyaXRlLmRheTsKLQl0aW1lLT5tb24gPSBmczMuZmRhdGVMYXN0V3JpdGUubW9udGg7Ci0JdGltZS0+eWVhciA9IGZzMy5mZGF0ZUxhc3RXcml0ZS55ZWFyOwotCXRpbWUtPm1pbiA9IGZzMy5mdGltZUxhc3RXcml0ZS5taW51dGVzOwotCXRpbWUtPmhvdXIgPSBmczMuZnRpbWVMYXN0V3JpdGUuaG91cnM7Ci0JfQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHNldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fc2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgRklMRVNUQVRVUzMgZnMzOwotICAgIHN0cnVjdCB0bSAgIHRjOwotICAgIHN0cnVjdCB0bSAgICpyZXQ7Ci0gICAgdGltZV90ICAgICAgdHQ7Ci0KLSAgICBpZiAoRG9zUXVlcnlQYXRoSW5mbygoUFNaKWZpbGVuYW1lLEZJTF9TVEFOREFSRCwoUFZPSUQpJmZzMyxzaXplb2YoZnMzKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmIChnbVRpbWUpIHsKLQl0Yy50bV95ZWFyID0gdGltZS0+eWVhciArIDgwOwotCXRjLnRtX21vbiA9IHRpbWUtPm1vbiAtIDE7Ci0JdGMudG1fbWRheSA9IHRpbWUtPmRheTsKLQl0Yy50bV9ob3VyID0gdGltZS0+aG91cjsKLQl0Yy50bV9taW4gPSB0aW1lLT5taW47Ci0JdGMudG1fc2VjID0gdGltZS0+c2VjOwotCWlmKCh0dCA9IG1rdGltZSgmdGMpKSA9PSAtMSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCXJldCA9IGxvY2FsdGltZSgmdHQpOwotCWZzMy5mdGltZUxhc3RXcml0ZS50d29zZWNzID0gcmV0LT50bV9zZWMgLyAyOwotCWZzMy5mZGF0ZUxhc3RXcml0ZS5kYXkgPSByZXQtPnRtX21kYXk7Ci0JZnMzLmZkYXRlTGFzdFdyaXRlLm1vbnRoID0gcmV0LT50bV9tb24gKyAxOwotCWZzMy5mZGF0ZUxhc3RXcml0ZS55ZWFyID0gcmV0LT50bV95ZWFyIC0gODA7Ci0JZnMzLmZ0aW1lTGFzdFdyaXRlLm1pbnV0ZXMgPSByZXQtPnRtX21pbjsKLQlmczMuZnRpbWVMYXN0V3JpdGUuaG91cnMgPSByZXQtPnRtX2hvdXI7Ci0JfQotICAgIGVsc2UgewotCWZzMy5mdGltZUxhc3RXcml0ZS50d29zZWNzID0gdGltZS0+c2VjIC8gMjsKLQlmczMuZmRhdGVMYXN0V3JpdGUuZGF5ID0gdGltZS0+ZGF5OwotCWZzMy5mZGF0ZUxhc3RXcml0ZS5tb250aCA9IHRpbWUtPm1vbjsKLQlmczMuZmRhdGVMYXN0V3JpdGUueWVhciA9IHRpbWUtPnllYXI7Ci0JZnMzLmZ0aW1lTGFzdFdyaXRlLm1pbnV0ZXMgPSB0aW1lLT5taW47Ci0JZnMzLmZ0aW1lTGFzdFdyaXRlLmhvdXJzID0gdGltZS0+aG91cjsKLQl9Ci0gICAgbWVtY3B5KCZmczMuZmRhdGVMYXN0QWNjZXNzLCAmZnMzLmZkYXRlTGFzdFdyaXRlLCBzaXplb2YoRkRBVEUpKTsKLSAgICBtZW1jcHkoJmZzMy5mZGF0ZUNyZWF0aW9uLCAmZnMzLmZkYXRlTGFzdFdyaXRlLCBzaXplb2YoRkRBVEUpKTsKLSAgICBtZW1jcHkoJmZzMy5mdGltZUxhc3RBY2Nlc3MsICZmczMuZnRpbWVMYXN0V3JpdGUsIHNpemVvZihGVElNRSkpOwotICAgIG1lbWNweSgmZnMzLmZ0aW1lQ3JlYXRpb24sICZmczMuZnRpbWVMYXN0V3JpdGUsIHNpemVvZihGVElNRSkpOwotICAgIERvc1NldFBhdGhJbmZvKChQU1opZmlsZW5hbWUsRklMX1NUQU5EQVJELChQVk9JRCkmZnMzLHNpemVvZihGSUxFU1RBVFVTMyksMEwpOwotICAgIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvdmZsYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5ZWYyYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvdmZsYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWlib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotewotICAgIGJhc2VBZGRyID0gYmFzZUFkZHI7Ci0gICAgYmFua1NpemUgPSBiYW5rU2l6ZTsKLSAgICBjb2RlTGVuID0gY29kZUxlbjsKLSAgICBiYW5rRnVuYyA9IGJhbmtGdW5jOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi96dGltZXIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi96dGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmZmU0My4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvenRpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgT1MvMgotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1bG9uZyAgICBmcmVxdWVuY3k7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfX1pUaW1lckluaXQodm9pZCkKLXsKLSAgICBEb3NUbXJRdWVyeUZyZXEoJmZyZXF1ZW5jeSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RhcnQgdGhlIFplbiBUaW1lciBjb3VudGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lck9uKHRtKSBEb3NUbXJRdWVyeVRpbWUoKFFXT1JEKikmdG0tPnN0YXJ0KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGxhcCB0aW1lIHNpbmNlIHRoZSB0aW1lciB3YXMgc3RhcnRlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19MWlRpbWVyTGFwKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIENQVV9sYXJnZUludGVnZXIgICAgdG1MYXAsdG1Db3VudDsKLQotICAgIERvc1RtclF1ZXJ5VGltZSgoUVdPUkQqKSZ0bUxhcCk7Ci0gICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtTGFwLCZ0bUNvdW50KTsKLSAgICByZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsZnJlcXVlbmN5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyT2ZmKHRtKSAgICBEb3NUbXJRdWVyeVRpbWUoKFFXT1JEKikmdG0tPmVuZCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJDb3VudCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyIHRtQ291bnQ7Ci0KLSAgICBfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmdG0tPmVuZCwmdG1Db3VudCk7Ci0gICAgcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGZyZXF1ZW5jeSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCB0aW1lciBhcyBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OICAgICAxMDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgTG9uZyBQZXJpb2QgdGltZXIgdmFsdWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX1VMWlJlYWRUaW1lKHZvaWQpCi17Ci0gICAgVUxPTkcgICBjb3VudDsKLSAgICBEb3NRdWVyeVN5c0luZm8oIFFTVl9NU19DT1VOVCwgUVNWX01TX0NPVU5ULCAmY291bnQsIHNpemVvZihVTE9ORykgKTsKLSAgICByZXR1cm4gY291bnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQotd2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCi1hY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCi1wYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfX1VMWkVsYXBzZWRUaW1lKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCkKLXsgcmV0dXJuIGZpbmlzaCAtIHN0YXJ0OyB9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczJwbS9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MycG0vZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmMjBhOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczJwbS9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIElCTSBQQyAoT1MvMikKLSoKLSogRGVzY3JpcHRpb246ICBPUy8yIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaCBjcm9zcyBwbGF0Zm9ybQotKiAgICAgICAgICAgICAgIGV2ZW50IGxpYnJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50ICAgICAgICAgIG9sZE1vdXNlU3RhdGU7ICAgICAgLyogT2xkIG1vdXNlIHN0YXRlICAgICAgICAgICAgICAqLwotc3RhdGljIHVsb25nICAgICAgICBvbGRLZXlNZXNzYWdlOyAgICAgIC8qIE9sZCBrZXlib2FyZCBzdGF0ZSAgICAgICAgICAgKi8KLXN0YXRpYyB1c2hvcnQgICAgICAga2V5VXBNc2dbMjU2XSA9IHswfTsvKiBUYWJsZSBvZiBrZXkgdXAgbWVzc2FnZXMgICAgICovCi1zdGF0aWMgaW50ICAgICAgICAgIHJhbmdlWCxyYW5nZVk7ICAgICAgLyogUmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgICAqLwotSE1PVSAgICAgICAgICAgICAgICBfRVZUX2hNb3VzZTsgICAgICAgIC8qIEhhbmRsZSB0byB0aGUgbW91c2UgZHJpdmVyICAgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVGhlc2UgYXJlIG5vdCB1c2VkIHVuZGVyIE9TLzIgKi8KLSNkZWZpbmUgX0VWVF9kaXNhYmxlSW50KCkgICAgICAgMQotI2RlZmluZSBfRVZUX3Jlc3RvcmVJbnQoZmxhZ3MpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdGVzdAotCi1SRU1BUktTOgotVGhpcyBtYWNybyBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKLXRpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9pc0tleURvd24oc2NhbkNvZGUpICAgIChrZXlVcE1zZ1tzY2FuQ29kZV0gIT0gMCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QdW1wcyBhbGwgbWVzc2FnZXMgaW4gdGhlIG1lc3NhZ2UgcXVldWUgZnJvbSBPUy8yIGludG8gb3VyIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIE9TLzIgUHJlc2VudGF0aW9uIE1hbmFnZXIgYXBwcyEgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIG1hY3JvL2Z1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydHMgdGhlIHNjYW4gY29kZXMgcmVwb3J0ZWQgYnkgdGhlCi1rZXlib2FyZCB0byBvdXIgZXZlbnQgbGlicmFyaWVzIG5vcm1hbGlzZWQgZm9ybWF0LiBXZSBvbmx5IGhhdmUgb25lIHNjYW4KLWNvZGUgZm9yIHRoZSAnQScga2V5LCBhbmQgdXNlIHNoaWZ0IG1vZGlmaWVycyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYQotQ3RybC1GMSwgQWx0LUYxIGV0Yy4gVGhlIHJhdyBzY2FuIGNvZGVzIGZyb20gdGhlIGtleWJvYXJkIHdvcmsgdGhpcyB3YXksCi1idXQgdGhlIE9TIGdpdmVzIHVzICdjb29rZWQnIHNjYW4gY29kZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZW0gYmFjawotdG8gdGhlIHJhdyBmb3JtYXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX21hc2tLZXlDb2RlKGV2dCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX2Fib3J0KCkKLXsKLSAgICBFVlRfZXhpdCgpOwotICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCi0KLVJFTUFSS1M6Ci1Jbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCi10byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCi10aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCi0KLVdlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKLWV2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9pbml0KAotICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCi17Ci0gICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KLSAgICBFVlQubW91c2VNb3ZlID0gbW91c2VNb3ZlOwotICAgIGluaXRFdmVudFF1ZXVlKCk7Ci0gICAgb2xkTW91c2VTdGF0ZSA9IDA7Ci0gICAgb2xkS2V5TWVzc2FnZSA9IDA7Ci0gICAgbWVtc2V0KGtleVVwTXNnLDAsc2l6ZW9mKGtleVVwTXNnKSk7Ci0KLSAgICAvKiBUT0RPOiBPUy8yIFBNIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uIGNvZGUhICovCi0KLSAgICAvKiBDYXRjaCBwcm9ncmFtIHRlcm1pbmF0aW9uIHNpZ25hbHMgc28gd2UgY2FuIGNsZWFuIHVwIHByb3Blcmx5ICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIF9FVlRfYWJvcnQpOwotICAgIHNpZ25hbChTSUdGUEUsIF9FVlRfYWJvcnQpOwotICAgIHNpZ25hbChTSUdJTlQsIF9FVlRfYWJvcnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotQ2hhbmdlcyB0aGUgcmFuZ2Ugb2YgY29vcmRpbmF0ZXMgcmV0dXJuZWQgYnkgdGhlIG1vdXNlIGZ1bmN0aW9ucyB0byB0aGUKLXNwZWNpZmllZCByYW5nZSBvZiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB3aGVuIGNoYW5naW5nIGJldHdlZW4gZ3JhcGhpY3MKLW1vZGVzIHNldCB0aGUgcmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgZm9yIHRoZSBuZXcgZGlzcGxheSBtb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVJhbmdlKAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzKQotewotICAgIHJhbmdlWCA9IHhSZXM7Ci0gICAgcmFuZ2VZID0geVJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgotY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCi1hbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfcmVzdW1lKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgT1MvMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bwotZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9zdXNwZW5kKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgT1MvMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX2V4aXQodm9pZCkKLXsKLSAgICAvKiBSZXN0b3JlIHNpZ25hbCBoYW5kbGVycyAqLwotICAgIHNpZ25hbChTSUdBQlJULCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHRlBFLCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKLQotICAgIC8qIFRPRE86IE9TLzIgUE0gc3BlY2lmaWMgZXhpdCBjb2RlICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1Nb2RpZmVzIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcyBuZWNlc3NhcnkgaWYgc2NhbGluZyB0byBPUyBjb29yZGluYXRlcywKLWFuZCBzZXRzIHRoZSBPUyBtb3VzZSBjdXJzb3IgcG9zaXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX3NldE1vdXNlUG9zKHgseSkKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMnBtL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczJwbS9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjY5ZjgyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMnBtL29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgT1MvMgotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIElOQ0xfRE9TRVJST1JTCi0jZGVmaW5lIElOQ0xfRE9TCi0jZGVmaW5lIElOQ0xfU1VCCi0jZGVmaW5lIElOQ0xfVklPCi0jZGVmaW5lIElOQ0xfS0JECi0jaW5jbHVkZSA8b3MyLmg+CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0ZTVjOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vc2hkci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgdG8gcHVsbCBpbiBPUyBzcGVjaWZpYyBoZWFkZXJzIGZvciB0aGUgdGFyZ2V0Ci0qICAgICAgICAgICAgICAgT1MgZW52aXJvbm1lbnQuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgICAgIGRlZmluZWQoX19TTVgzMl9fKQotI2luY2x1ZGUgInNteC9vc2hkci5oIgotI2VsaWYgICBkZWZpbmVkKF9fUlRUQVJHRVRfXykKLSNpbmNsdWRlICJydHRhcmdldC9vc2hkci5oIgotI2VsaWYgICBkZWZpbmVkKF9fUkVBTERPU19fKQotI2luY2x1ZGUgImRvcy9vc2hkci5oIgotI2VsaWYgICBkZWZpbmVkKF9fV0lOMzJfVlhEX18pCi0jaW5jbHVkZSAidnhkL29zaGRyLmgiCi0jZWxpZiAgIGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlICJudGRydi9vc2hkci5oIgotI2VsaWYgICBkZWZpbmVkKF9fV0lORE9XUzMyX18pCi0jaW5jbHVkZSAid2luMzIvb3NoZHIuaCIKLSNlbGlmICAgZGVmaW5lZChfX09TMl9WRERfXykKLSNpbmNsdWRlICJ2eGQvb3NoZHIuaCIKLSNlbGlmICAgZGVmaW5lZChfX09TMl9fKQotI2lmICAgICBkZWZpbmVkKF9fT1MyX1BNX18pCi0jaW5jbHVkZSAib3MycG0vb3NoZHIuaCIKLSNlbHNlCi0jaW5jbHVkZSAib3MyL29zaGRyLmgiCi0jZW5kaWYKLSNlbGlmICAgZGVmaW5lZChfX0xJTlVYX18pCi0jaWYgICAgIGRlZmluZWQoX19VU0VfWDExX18pCi0jaW5jbHVkZSAieDExL29zaGRyLmgiCi0jZWxzZQotI2luY2x1ZGUgImxpbnV4L29zaGRyLmgiCi0jZW5kaWYKLSNlbGlmICAgZGVmaW5lZChfX1FOWF9fKQotI2lmICAgICBkZWZpbmVkKF9fVVNFX1BIT1RPTl9fKQotI2luY2x1ZGUgInBob3Rvbi9vc2hkci5oIgotI2VsaWYgICBkZWZpbmVkKF9fVVNFX1gxMV9fKQotI2luY2x1ZGUgIngxMS9vc2hkci5oIgotI2Vsc2UKLSNpbmNsdWRlICJxbngvb3NoZHIuaCIKLSNlbmRpZgotI2VsaWYgICBkZWZpbmVkKF9fQkVPU19fKQotI2luY2x1ZGUgImJlb3Mvb3NoZHIuaCIKLSNlbHNlCi0jZXJyb3IgIFBNIGxpYnJhcnkgbm90IHBvcnRlZCB0byB0aGlzIHBsYXRmb3JtIHlldCEKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcGhvdG9uL2V2ZW50LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9waG90b24vZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxZGExNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9waG90b24vZXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUU5YIFBob3RvbiBHVUkKLSoKLSogRGVzY3JpcHRpb246ICBRTlggZnVsbHNjcmVlbiBjb25zb2xlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaAotKiAgICAgICAgICAgICAgIGNyb3NzIHBsYXRmb3JtIGV2ZW50IGxpYnJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdXNob3J0ICAgICAgIGtleVVwTXNnWzI1Nl0gPSB7MH07LyogVGFibGUgb2Yga2V5IHVwIG1lc3NhZ2VzICAgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgTGludXggKi8KLSNkZWZpbmUgX0VWVF9kaXNhYmxlSW50KCkgICAgICAgMQotI2RlZmluZSBfRVZUX3Jlc3RvcmVJbnQoZmxhZ3MpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdGVzdAotCi1SRU1BUktTOgotVGhpcyBtYWNybyBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKLXRpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBfRVZUX2lzS2V5RG93bigKLSAgICB1Y2hhciBzY2FuY29kZSkKLXsKLSAgICByZXR1cm4gKEtleVN0YXRlWyhzY2FuY29kZSAmIDB4ZjgpID4+IDNdICYgKDEgPDwgKHNjYW5jb2RlICYgMHg3KSkgPwotCXRydWUgOiBmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0cmlldmVzIGFsbCBldmVudHMgZnJvbSB0aGUgbW91c2Uva2V5Ym9hcmQgZXZlbnQgcXVldWUgYW5kIHN0dWZmcyB0aGVtCi1pbnRvIHRoZSBNR0wgZXZlbnQgcXVldWUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQotewotICAgIGludCAgICAgICAgIHBpZDsKLSAgICB1aW50ICAgICAgICAgICAgbXNnLCBidXRfc3RhdCwgbWVzc2FnZTsKLSAgICB1Y2hhciAgICAgICAgICAgZXZ0W3NpemVvZiAoUGhFdmVudF90KSArIDEwMjRdOwotICAgIFBoRXZlbnRfdCAgICAgICAqZXZlbnQgPSAodm9pZCAqKWV2dDsKLSAgICBQaEtleUV2ZW50X3QgICAgICAgICprZXk7Ci0gICAgUGhQb2ludGVyRXZlbnRfdCAgICAqbW91c2U7Ci0gICAgc3RhdGljIGludCAgICAgIGV4dGVuZGVkOwotICAgIGV2ZW50X3QgICAgICAgICBfZXZ0OwotCi0gICAgd2hpbGUgKGNvdW50IDwgRVZFTlRRU0laRSkgewotCXVpbnQgICAgbW9kcyA9IDAsIGtleXAgPSAwOwotCi0JcGlkID0gQ3JlY2VpdmUoMCwgJm1zZywgc2l6ZW9mIChtc2cpKTsKLQotCWlmIChwaWQgPT0gLTEpCi0JICAgIHJldHVybjsKLQotCWlmIChQaEV2ZW50UmVhZChwaWQsIGV2ZW50LCBzaXplb2YgKGV2dCkpID09IFBoX0VWRU5UX01TRykgewotCSAgICBtZW1zZXQoJmV2dCwgMCwgc2l6ZW9mIChldnQpKTsKLQkgICAgaWYgKGV2ZW50LT50eXBlID09IFBoX0VWX0tFWSkgewotCQlrZXkgPSBQaEdldERhdGEoZXZlbnQpOwotCi0JCWlmIChrZXktPmtleV9mbGFncyAmIEtFWV9TQ0FOX1ZBTElEKSB7Ci0JCSAgICBrZXlwID0ga2V5LT5rZXlfc2NhbjsKLQkJICAgIGlmIChrZXktPmtleV9mbGFncyAmIEtFWV9ET1dOKQotCQkJS2V5U3RhdGVbKGtleXAgJiAweGY4MDApID4+IDExXQotCQkJICAgIHw9IDEgPDwgKChrZXlwICYgMHg3MDApID4+IDgpOwotCQkgICAgZWxzZQotCQkJS2V5U3RhdGVbKGtleXAgJiAweGY4MDApID4+IDExXQotCQkJICAgICY9IH4oMSA8PCAoKGtleXAgJiAweDcwMCkgPj4gOCkpOwotCQl9Ci0JCWlmICgoa2V5LT5rZXlfZmxhZ3MgJiBLRVlfU1lNX1ZBTElEKSB8fCBleHRlbmRlZCkKLQkJICAgIGtleXAgfD0ga2V5LT5rZXlfc3ltOwotCi0JCS8qIE5vIHdheSB0byB0ZWxsIGxlZnQgZnJvbSByaWdodC4uLiAqLwotCQlpZiAoa2V5LT5rZXlfbW9kcyAmIEtFWU1PRF9TSElGVCkKLQkJICAgIG1vZHMgPSAoRVZUX0xFRlRTSElGVCB8IEVWVF9SSUdIVFNISUZUKTsKLQkJaWYgKGtleS0+a2V5X21vZHMgJiBLRVlNT0RfQ1RSTCkKLQkJICAgIG1vZHMgfD0gKEVWVF9DVFJMU1RBVEUgfCBFVlRfTEVGVENUUkwpOwotCQlpZiAoa2V5LT5rZXlfbW9kcyAmIEtFWU1PRF9BTFQpCi0JCSAgICBtb2RzIHw9IChFVlRfQUxUU1RBVEUgfCBFVlRfTEVGVEFMVCk7Ci0KLQkJX2V2dC53aGVuID0gZXZ0LT50aW1lc3RhbXA7Ci0JCWlmIChrZXktPmtleV9mbGFncyAmIEtFWV9SRVBFQVQpIHsKLQkJICAgIF9ldnQud2hhdCA9IEVWVF9LRVlSRVBFQVQ7Ci0JCSAgICBfZXZ0Lm1lc3NhZ2UgPSAweDEwMDAwOwotCQkgICAgfQotCQllbHNlIGlmIChrZXktPmtleV9mbGFncyAmIEtFWV9ET1dOKQotCQkgICAgX2V2dC53aGF0ID0gRVZUX0tFWURPV047Ci0JCWVsc2UKLQkJICAgIF9ldnQud2hhdCA9IEVWVF9LRVlVUDsKLQkJX2V2dC5tb2RpZmllcnMgPSBtb2RzOwotCQlfZXZ0Lm1lc3NhZ2UgfD0ga2V5cDsKLQotCQlhZGRFdmVudCgmX2V2dCk7Ci0KLQkJc3dpdGNoKGtleS0+a2V5X3NjYW4gJiAweGZmMDApIHsKLQkJICAgIGNhc2UgMHhlMDAwOgotCQkJZXh0ZW5kZWQgPSAxOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIDB4ZTAwMToKLQkJCWV4dGVuZGVkID0gMjsKLQkJCWJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJCWlmIChleHRlbmRlZCkKLQkJCSAgICBleHRlbmRlZC0tOwotCQkgICAgfQotCQl9Ci0JICAgIGVsc2UgaWYgKGV2ZW50LT50eXBlICYgUGhfRVZfUFRSX0FMTCkgewotCQlidXRfc3RhdCA9IG1lc3NhZ2UgPSAwOwotCQltb3VzZSA9IFBoR2V0RGF0YShldmVudCk7Ci0KLQkJaWYgKG1vdXNlLT5idXR0b25fc3RhdGUgJiBQaF9CVVRUT05fMykKLQkJICAgIGJ1dF9zdGF0ID0gRVZUX0xFRlRCVVQ7Ci0JCWlmIChtb3VzZS0+YnV0dG9ucyAmIFBoX0JVVFRPTl8zKQotCQkgICAgbWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7Ci0KLQkJaWYgKG1vdXNlLT5idXR0b25fc3RhdGUgJiBQaF9CVVRUT05fMSkKLQkJICAgIGJ1dF9zdGF0IHw9IEVWVF9SSUdIVEJVVDsKLQkJaWYgKG1vdXNlLT5idXR0b25zICYgUGhfQlVUVE9OXzEpCi0JCSAgICBtZXNzYWdlIHw9IEVWVF9SSUdIVEJNQVNLOwotCi0JCV9ldnQud2hlbiA9IGV2dC0+dGltZXN0YW1wOwotCQlpZiAoZXZlbnQtPnR5cGUgJiBQaF9FVl9QVFJfTU9USU9OKSB7Ci0JCSAgICBfZXZ0LndoYXQgPSBFVlRfTU9VU0VNT1ZFOwotCQkgICAgX2V2dC53aGVyZV94ID0gbW91c2UtPnBvcy54OwotCQkgICAgX2V2dC53aGVyZV95ID0gbW91c2UtPnBvcy55OwotCQkgICAgX2V2dC5tb2RpZmllcnMgPSBidXRfc3RhdDsKLQkJICAgIGFkZEV2ZW50KCZfZXZ0KTsKLQkJICAgIH0KLQkJaWYgKGV2ZW50LT50eXBlICYgUGhfRVZfQlVUX1BSRVNTKQotCQkgICAgX2V2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLQkJZWxzZQotCQkgICAgX2V2dC53aGF0ID0gRVZUX01PVVNFVVA7Ci0JCV9ldnQud2hlcmVfeCA9IG1vdXNlLT5wb3MueDsKLQkJX2V2dC53aGVyZV95ID0gbW91c2UtPnBvcy55OwotCQlfZXZ0Lm1vZGlmaWVycyA9IGJ1dF9zdGF0OwotCQlfZXZ0Lm1lc3NhZ2UgPSBtZXNzYWdlOwotCQlhZGRFdmVudCgmX2V2dCk7Ci0JCX0KLQkgICAgfQotCWVsc2UKLQkgICAgcmV0dXJuOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIG1hY3JvL2Z1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydHMgdGhlIHNjYW4gY29kZXMgcmVwb3J0ZWQgYnkgdGhlCi1rZXlib2FyZCB0byBvdXIgZXZlbnQgbGlicmFyaWVzIG5vcm1hbGlzZWQgZm9ybWF0LiBXZSBvbmx5IGhhdmUgb25lIHNjYW4KLWNvZGUgZm9yIHRoZSAnQScga2V5LCBhbmQgdXNlIHNoaWZ0IG1vZGlmaWVycyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYQotQ3RybC1GMSwgQWx0LUYxIGV0Yy4gVGhlIHJhdyBzY2FuIGNvZGVzIGZyb20gdGhlIGtleWJvYXJkIHdvcmsgdGhpcyB3YXksCi1idXQgdGhlIE9TIGdpdmVzIHVzICdjb29rZWQnIHNjYW4gY29kZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZW0gYmFjawotdG8gdGhlIHJhdyBmb3JtYXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX21hc2tLZXlDb2RlKGV2dCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX2Fib3J0KAotICAgIGludCBzaWdubykKLXsKLSAgICBjaGFyICAgIGJ1Zls4MF07Ci0KLSAgICBFVlRfZXhpdCgpOwotICAgIHNwcmludGYoYnVmLCJUZXJtaW5hdGluZyBvbiBzaWduYWwgJWQiLHNpZ25vKTsKLSAgICBQTV9mYXRhbEVycm9yKGJ1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCi0KLVJFTUFSS1M6Ci1Jbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCi10byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCi10aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCi0KLVdlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKLWV2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9pbml0KAotICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCi17Ci0gICAgaW50ICAgICAgICAgaTsKLQotICAgIC8qIEluaXRpYWxpc2UgdGhlIGV2ZW50IHF1ZXVlICovCi0gICAgX21vdXNlTW92ZSA9IG1vdXNlTW92ZTsKLSAgICBpbml0RXZlbnRRdWV1ZSgpOwotICAgIG1lbXNldCgodm9pZCAqKUtleVN0YXRlLCAwLCBzaXplb2YgKEtleVN0YXRlKSk7Ci0KLSAgICAvKiBDYXRjaCBwcm9ncmFtIHRlcm1pbmF0aW9uIHNpZ25hbHMgc28gd2UgY2FuIGNsZWFuIHVwIHByb3Blcmx5ICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIF9FVlRfYWJvcnQpOwotICAgIHNpZ25hbChTSUdGUEUsIF9FVlRfYWJvcnQpOwotICAgIHNpZ25hbChTSUdJTlQsIF9FVlRfYWJvcnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotQ2hhbmdlcyB0aGUgcmFuZ2Ugb2YgY29vcmRpbmF0ZXMgcmV0dXJuZWQgYnkgdGhlIG1vdXNlIGZ1bmN0aW9ucyB0byB0aGUKLXNwZWNpZmllZCByYW5nZSBvZiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB3aGVuIGNoYW5naW5nIGJldHdlZW4gZ3JhcGhpY3MKLW1vZGVzIHNldCB0aGUgcmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgZm9yIHRoZSBuZXcgZGlzcGxheSBtb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVJhbmdlKAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzKQotewotICAgIC8qIFRPRE86IE5lZWQgdG8gY2FsbCBJbnB1dCB0byBjaGFuZ2UgdGhlIGNvb3JkaW5hdGVzIHRoYXQgaXQgcmV0dXJucyAqLwotICAgIC8qICAgICAgIGZvciBtb3VzZSBldmVudHMhISAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWlsaXNlcyB0aGUgaW50ZXJuYWwgZXZlbnQgaGFuZGxpbmcgbW9kdWxlcy4gVGhlIEVWVF9zdXNwZW5kIGZ1bmN0aW9uCi1jYW4gYmUgY2FsbGVkIHRvIHN1c3BlbmQgZXZlbnQgaGFuZGxpbmcgKHN1Y2ggYXMgd2hlbiBzaGVsbGluZyBvdXQgdG8gRE9TKSwKLWFuZCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3VtZSBpdCBhZ2FpbiBsYXRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9yZXN1bWUodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBQaG90b24gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLVN1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KLWRlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfc3VzcGVuZCh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIFBob3RvbiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX2V4aXQodm9pZCkKLXsKLSAgICAvKiBSZXN0b3JlIHNpZ25hbCBoYW5kbGVycyAqLwotICAgIHNpZ25hbChTSUdBQlJULCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHRlBFLCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Bob3Rvbi9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcGhvdG9uL29zaGRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNzI1NjMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcGhvdG9uL29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUU5YIFBob3RvbiBHVUkKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN5cy9tb3VzZS5oPgotI2luY2x1ZGUgPHN5cy9rZXlib2FyZC5oPgotI2luY2x1ZGUgPHN5cy9mZC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8Y29uaW8uaD4KLSNpbmNsdWRlIDxwcm9jZXNzLmg+Ci0jaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgotI2luY2x1ZGUgPFBoLmg+CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbS52cHcgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbS52cHcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZTY4YTcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG0udnB3CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotW0RlcGVuZGVuY2llc10NCi1bQ3VycmVudFByb2plY3RdDQotY3VycHJvaj1wbWxpbnV4LnZwag0KLVtQcm9qZWN0RmlsZXNdDQotcG1jb21tb24udnBqDQotcG1kb3MudnBqDQotcG1saW51eC52cGoNCi1wbXFueC52cGoNCi1wbXZ4ZC52cGoNCi1wbXdpbjMyLnZwag0KLXpfc2FtcGxlcy52cGoNCi0uLlxhLWdsb2JhbCBpbmNsdWRlcy52cGoNCi1bVHJlZUV4cGFuc2lvbl0NCi0iLi5cYS1nbG9iYWwgaW5jbHVkZXMudnBqIiAwDQotcG1jb21tb24udnBqIDANCi1wbWRvcy52cGogMA0KLXBtbGludXgudnBqIDANCi1wbXFueC52cGogMA0KLXBtdnhkLnZwaiAwDQotcG13aW4zMi52cGogMA0KLXpfc2FtcGxlcy52cGogMSAxDQotW1N0YXRlXQ0KLVNDUkVFTjogMTI4MCAxMDI0IDAgMCA5NjAgNzQ2IDAgMCBNIDAgMCAwIDAgOTc3IDYzMQ0KLUNXRDogQzpcc2NpdGVjaFxzcmNccG0NCi1GSUxFSElTVDogOQ0KLUM6XHNjaXRlY2hcbWFrZWRlZnNcZ2NjX3dpbjMyLm1rDQotQzpcc2NpdGVjaFxiaW5cZ2NjMi13MzIuYmF0DQotQzpcc2NpdGVjaFxiaW5cZ2NjMi1jMzIuYmF0DQotQzpcc2NpdGVjaFxiaW5cZ2NjMi1saW51eC5iYXQNCi1DOlxzY2l0ZWNoXG1ha2VkZWZzXGdjY19saW51eC5taw0KLUM6XHNjaXRlY2hcc3JjXHBtXGxpbnV4XGV2ZW50LmMNCi1DOlxzY2l0ZWNoXHNyY1xwbVxsaW51eFxvc2hkci5oDQotQzpcc2NpdGVjaFxzcmNccG1cZXZlbnQuYw0KLUM6XHNjaXRlY2hcc3JjXHBtXHBtbGludXgudnBqDQotW1Byb2plY3REYXRlc10NCi1wbWNvbW1vbi52cGo9MjAwMTA1MTcxNjQzMzUyOTANCi1wbWRvcy52cGo9MjAwMTA1MTcxNjQzMzUyOTANCi1wbWxpbnV4LnZwaj0yMDAxMDYyMDE3NTgyOTgxMg0KLXBtcW54LnZwaj0yMDAxMDUxNzE2NDMzNTI5MA0KLXBtdnhkLnZwaj0yMDAxMDUxNzE2NDMzNTMwNg0KLXBtd2luMzIudnBqPTIwMDEwNTE3MTY0MzM1MzA2DQotel9zYW1wbGVzLnZwaj0yMDAxMDUxNzE2NDMzNTMwNg0KLS4uXGEtZ2xvYmFsIGluY2x1ZGVzLnZwaj0yMDAxMDUxNzE2NDMzNDk3OA0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtY29tbW9uLnZwaiBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtY29tbW9uLnZwagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhiODcyZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbWNvbW1vbi52cGoKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1bQ09NUElMRVJdDQotdmVyc2lvbj01LjBiDQotTUFDUk89XG4NCi1hY3RpdmVjb25maWc9LHdjMTAtZDMyDQotRklMVEVSTkFNRT1Tb3VyY2UgRmlsZXNcbkluY2x1ZGUgRmlsZXNcbkFzc2VtYmxlciBGaWxlc1xuT3RoZXIgRmlsZXNcbg0KLUZJTFRFUlBBVFRFUk49Ki5jOyouY3BwOyouY3h4OyoucHJnOyoucGFzOyouZHByOyouYmFzOyouamF2YTsqLnNjOyouZTsqLmNvYjsqLmh0bWw7Ki5yY1xuKi5oXG4qLmFzbVxuKi4qXG4NCi1GSUxURVJBU1NPQ0lBVEVGSUxFVFlQRVM9MCAwIDAgMCANCi1GSUxURVJBUFBDT01NQU5EPVxuXG5cblxuDQotdmNzcHJvamVjdD1TQ0M6UGVyZm9yY2UgU0NNOi8vZGVwb3QNCi12Y3Nsb2NhbHBhdGg9U0NDOlBlcmZvcmNlIFNDTTpjOlwNCi1jb21waWxlPWNvbmN1cnxjYXB0dXJlfGhpZGV8OkNvbXBpbGU6JkNvbXBpbGUsDQotbWFrZT1jb25jdXJ8Y2FwdHVyZXxoaWRlfGNsZWFyfHNhdmVhbGx8OkJ1aWxkOiZCdWlsZCwNCi1yZWJ1aWxkPWNvbmN1cnxjYXB0dXJlfGhpZGV8Y2xlYXJ8c2F2ZWFsbHw6UmVidWlsZDomUmVidWlsZCwNCi1kZWJ1Zz1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfDpEZWJ1ZzomRGVidWcsDQotZXhlY3V0ZT1oaWRlfHNhdmVub25lfDpFeGVjdXRlOkUmeGVjdXRlLA0KLXVzZXIxPWhpZGV8OlVzZXIgMTpVc2VyIDEsDQotdXNlcjI9aGlkZXw6VXNlciAyOlVzZXIgMiwNCi13b3JraW5nZGlyPS4NCi1pbmNsdWRlZGlycz0lKFNDSVRFQ0gpXGluY2x1ZGU7JShQUklWQVRFKVxpbmNsdWRlDQotcmVmZmlsZT0NCi1bRklMRVNdDQotY29tbW9uLmMNCi1jcHVpbmZvLmMNCi1kZWJ1Zy5jDQotZXZlbnQuYw0KLW1ha2VmaWxlDQotb3NoZHIuaA0KLXp0aW1lci5jDQotLi5cY29tbW9uXGFncGxpYi5jDQotY29kZXBhZ2VcdXNfZW5nLmMNCi1jb21tb25cX2NwdWluZm8uYXNtDQotY29tbW9uXF9kbWEuYXNtDQotY29tbW9uXF9pbnQ2NC5hc20NCi1jb21tb25cX2pveS5hc20NCi1jb21tb25cX210cnIuYXNtDQotY29tbW9uXF9wY2lsaWIuYXNtDQotY29tbW9uXGFncC5jDQotY29tbW9uXGtleWJvYXJkLmMNCi1jb21tb25cbWFsbG9jLmMNCi1jb21tb25cbXRyci5jDQotY29tbW9uXHBjaWxpYi5jDQotY29tbW9uXHVuaXhpby5jDQotY29tbW9uXHZnYXN0YXRlLmMNCi1bQVNTT0NJQVRJT05dDQotW0NPTkZJR1VSQVRJT05TXQ0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtZG9zLnZwaiBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtZG9zLnZwagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1NzUxMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbWRvcy52cGoKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1bU2NpVGVjaF0NCi1jb21waWxlcj13YzEwLSANCi10YXJnZXRvcz1kMzIgDQotW0NPTVBJTEVSXQ0KLXZlcnNpb249NS4wYg0KLU1BQ1JPPWVuYWJsZV9jdXJyZW50X2NvbXBpbGVyXG4NCi1hY3RpdmVjb25maWc9LFRFU1RfSEFSTkVTUz0xDQotRklMVEVSTkFNRT1Tb3VyY2UgRmlsZXNcbkluY2x1ZGUgRmlsZXNcbkFzc2VtYmxlciBGaWxlc1xuDQotRklMVEVSUEFUVEVSTj0qLmM7Ki5jcHA7Ki5jeHg7Ki5wcmc7Ki5wYXM7Ki5kcHI7Ki5iYXM7Ki5qYXZhOyouc2M7Ki5lOyouY29iOyouaHRtbDsqLnJjXG4qLmhcbiouYXNtXG4NCi1GSUxURVJBU1NPQ0lBVEVGSUxFVFlQRVM9MCAwIDAgDQotRklMVEVSQVBQQ09NTUFORD1cblxuXG4NCi12Y3Nwcm9qZWN0PVNDQzpQZXJmb3JjZSBTQ006Ly9kZXBvdA0KLXZjc2xvY2FscGF0aD1TQ0M6UGVyZm9yY2UgU0NNOmM6XA0KLWNvbXBpbGU9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8OkNvbXBpbGU6JkNvbXBpbGUsZG1ha2UgJW4ub2JqIC11ICViDQotbWFrZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpCdWlsZDomQnVpbGQsZG1ha2UgaW5zdGFsbCAlYg0KLXJlYnVpbGQ9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZWFsbHw6UmVidWlsZDomUmVidWlsZCxkbWFrZSBjbGVhbmV4ZSAmIGRtYWtlIGluc3RhbGwgLXUgJWINCi1kZWJ1Zz1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfDpEZWJ1ZzomRGVidWcsDQotZXhlY3V0ZT1oaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpFeGVjdXRlOkUmeGVjdXRlLA0KLXVzZXIxPWhpZGV8OlVzZXIgMTpVc2VyIDEsDQotdXNlcjI9aGlkZXw6VXNlciAyOlVzZXIgMiwNCi11c2VydG9vbF9jbGVhbl9kaXJlY3Rvcnk9Y29uY3VyfGNhcHR1cmV8aGlkZXxzYXZlbm9uZXxub2NoYW5nZWRpcnw6Q2xlYW4gRGlyZWN0b3J5OkMmbGVhbiBEaXJlY3RvcnksZG1ha2UgY2xlYW5leGUNCi13b3JraW5nZGlyPS4NCi1pbmNsdWRlZGlycz0lKFNDSVRFQ0gpXGluY2x1ZGU7JShQUklWQVRFKVxpbmNsdWRlDQotcmVmZmlsZT0NCi1bRklMRVNdDQotZG9zXF9ldmVudC5hc20NCi1kb3NcX2x6dGltZXIuYXNtDQotZG9zXF9wbS5hc20NCi1kb3NcX3BtZG9zLmFzbQ0KLWRvc1xfdmZsYXQuYXNtDQotZG9zXGNwdWluZm8uYw0KLWRvc1xldmVudC5jDQotZG9zXG9zaGRyLmgNCi1kb3NccG0uYw0KLWRvc1xwbWRvcy5jDQotZG9zXHZmbGF0LmMNCi1kb3NcenRpbWVyLmMNCi1bQVNTT0NJQVRJT05dDQotW0NPTkZJR1VSQVRJT05TXQ0KLWNvbmZpZz0sTk9STUFMX0JVSUxEPTENCi1jb25maWc9LFRFU1RfSEFSTkVTUz0xDQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1saW51eC52cGogYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbWxpbnV4LnZwagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmYmY4NC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbWxpbnV4LnZwagorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLVtTY2lUZWNoXQ0KLWNvbXBpbGVyPWdjYzItDQotdGFyZ2V0b3M9bGludXgNCi1bQ09NUElMRVJdDQotdmVyc2lvbj01LjBiDQotTUFDUk89ZW5hYmxlX2N1cnJlbnRfY29tcGlsZXJcbg0KLUZJTFRFUk5BTUU9U291cmNlIEZpbGVzXG5JbmNsdWRlIEZpbGVzXG5Bc3NlbWJsZXIgRmlsZXNcbg0KLUZJTFRFUlBBVFRFUk49Ki5jOyouY3BwOyouY3h4OyoucHJnOyoucGFzOyouZHByOyouYmFzOyouamF2YTsqLnNjOyouZTsqLmNvYjsqLmh0bWw7Ki5yY1xuKi5oXG4qLmFzbVxuDQotRklMVEVSQVNTT0NJQVRFRklMRVRZUEVTPTAgMCAwDQotRklMVEVSQVBQQ09NTUFORD1cblxuXG4NCi12Y3Nwcm9qZWN0PVNDQzpQZXJmb3JjZSBTQ006Ly9kZXBvdA0KLXZjc2xvY2FscGF0aD1TQ0M6UGVyZm9yY2UgU0NNOmM6XA0KLWFjdGl2ZWNvbmZpZz0saW5zdGFsbCBCVUlMRF9ETEw9MQ0KLWNvbXBpbGU9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8OkNvbXBpbGU6JkNvbXBpbGUsZG1ha2UgJW4ubyAtdQ0KLW1ha2U9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZWFsbHw6QnVpbGQ6JkJ1aWxkLGRtYWtlICViDQotcmVidWlsZD1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpSZWJ1aWxkOiZSZWJ1aWxkLGRtYWtlIGNsZWFuZXhlICYgZG1ha2UgLXUgJWINCi1kZWJ1Zz1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfDpEZWJ1ZzomRGVidWcsDQotZXhlY3V0ZT1oaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpFeGVjdXRlOkUmeGVjdXRlLA0KLXVzZXIxPWhpZGV8OlVzZXIgMTpVc2VyIDEsDQotdXNlcjI9aGlkZXw6VXNlciAyOlVzZXIgMiwNCi11c2VydG9vbF9jbGVhbl9kaXJlY3Rvcnk9Y29uY3VyfGNhcHR1cmV8aGlkZXxzYXZlbm9uZXxub2NoYW5nZWRpcnw6Q2xlYW4gRGlyZWN0b3J5OkMmbGVhbiBEaXJlY3RvcnksZG1ha2UgY2xlYW5leGUNCi13b3JraW5nZGlyPS4NCi1pbmNsdWRlZGlycz0lKFNDSVRFQ0gpXGluY2x1ZGU7JShQUklWQVRFKVxpbmNsdWRlDQotcmVmZmlsZT0NCi1bRklMRVNdDQotbGludXhcY3B1aW5mby5jDQotbGludXhcZXZlbnQuYw0KLWxpbnV4XG9zaGRyLmgNCi1saW51eFxwbS5jDQotbGludXhcdmZsYXQuYw0KLWxpbnV4XHp0aW1lci5jDQotW0FTU09DSUFUSU9OXQ0KLVtDT05GSUdVUkFUSU9OU10NCi1jb25maWc9LGluc3RhbGwgQlVJTERfRExMPTENCi1jb25maWc9LGluc3RhbGwNCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbW50ZHJ2LnZwaiBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtbnRkcnYudnBqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWMzNWE3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtbnRkcnYudnBqCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotW1NjaVRlY2hdDQotY29tcGlsZXI9dmM2MC0gDQotdGFyZ2V0b3M9ZHJ2dzJrDQotW0NPTVBJTEVSXQ0KLXZlcnNpb249NS4wYg0KLU1BQ1JPPWVuYWJsZV9jdXJyZW50X2NvbXBpbGVyXG4NCi1hY3RpdmVjb25maWc9LHdjMTAtZDMyDQotRklMVEVSTkFNRT1Tb3VyY2UgRmlsZXNcbkluY2x1ZGUgRmlsZXNcbkFzc2VtYmxlciBGaWxlc1xuDQotRklMVEVSUEFUVEVSTj0qLmM7Ki5jcHA7Ki5jeHg7Ki5wcmc7Ki5wYXM7Ki5kcHI7Ki5iYXM7Ki5qYXZhOyouc2M7Ki5lOyouY29iOyouaHRtbDsqLnJjXG4qLmhcbiouYXNtXG4NCi1GSUxURVJBU1NPQ0lBVEVGSUxFVFlQRVM9MCAwIDANCi1GSUxURVJBUFBDT01NQU5EPVxuXG5cbg0KLXZjc3Byb2plY3Q9U0NDOlBlcmZvcmNlIFNDTTovL2RlcG90DQotdmNzbG9jYWxwYXRoPVNDQzpQZXJmb3JjZSBTQ006YzpcDQotY29tcGlsZT1jb25jdXJ8Y2FwdHVyZXw6Q29tcGlsZTomQ29tcGlsZSxkbWFrZSAlbi5vYmoNCi1tYWtlPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OkJ1aWxkOiZCdWlsZCxkbWFrZSBpbnN0YWxsDQotcmVidWlsZD1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpSZWJ1aWxkOiZSZWJ1aWxkLGRtYWtlIGNsZWFuZXhlICYgZG1ha2UgaW5zdGFsbCAtdQ0KLWRlYnVnPWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8OkRlYnVnOiZEZWJ1ZywNCi1leGVjdXRlPWhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkV4ZWN1dGU6RSZ4ZWN1dGUsDQotdXNlcjE9aGlkZXw6VXNlciAxOlVzZXIgMSwNCi11c2VyMj1oaWRlfDpVc2VyIDI6VXNlciAyLA0KLXVzZXJ0b29sX2NsZWFuX2RpcmVjdG9yeT1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfDpDbGVhbiBEaXJlY3Rvcnk6JkNsZWFuIERpcmVjdG9yeSxkbWFrZSBjbGVhbmV4ZQ0KLXdvcmtpbmdkaXI9Lg0KLWluY2x1ZGVkaXJzPSUoU0NJVEVDSClcaW5jbHVkZTslKFBSSVZBVEUpXGluY2x1ZGUNCi1yZWZmaWxlPQ0KLVtGSUxFU10NCi0uLlwuLlxpbmNsdWRlXG50ZHJpdmVyLmgNCi1udGRydlxfcG0uYXNtDQotbnRkcnZcY3B1aW5mby5jDQotbnRkcnZcaW50ODYuYw0KLW50ZHJ2XGlycS5jDQotbnRkcnZcbWVtLmMNCi1udGRydlxvc2hkci5oDQotbnRkcnZccG0uYw0KLW50ZHJ2XHN0ZGlvLmMNCi1udGRydlxzdGRsaWIuYw0KLW50ZHJ2XHZmbGF0LmMNCi1udGRydlx6dGltZXIuYw0KLVtBU1NPQ0lBVElPTl0NCi1bQ09ORklHVVJBVElPTlNdDQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1xbngudnBqIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1xbngudnBqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTQxNzAyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtcW54LnZwagorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLVtTY2lUZWNoXQ0KLWNvbXBpbGVyPXdjMTAtDQotdGFyZ2V0b3M9cW54DQotW0NPTVBJTEVSXQ0KLXZlcnNpb249NS4wYg0KLU1BQ1JPPWVuYWJsZV9jdXJyZW50X2NvbXBpbGVyXG4NCi1hY3RpdmVjb25maWc9LHdjMTAtZDMyDQotRklMVEVSTkFNRT1Tb3VyY2UgRmlsZXNcbkluY2x1ZGUgRmlsZXNcbkFzc2VtYmxlciBGaWxlc1xuDQotRklMVEVSUEFUVEVSTj0qLmM7Ki5jcHA7Ki5jeHg7Ki5wcmc7Ki5wYXM7Ki5kcHI7Ki5iYXM7Ki5qYXZhOyouc2M7Ki5lOyouY29iOyouaHRtbDsqLnJjXG4qLmhcbiouYXNtXG4NCi1GSUxURVJBU1NPQ0lBVEVGSUxFVFlQRVM9MCAwIDANCi1GSUxURVJBUFBDT01NQU5EPVxuXG5cbg0KLXZjc3Byb2plY3Q9U0NDOlBlcmZvcmNlIFNDTTovL2RlcG90DQotdmNzbG9jYWxwYXRoPVNDQzpQZXJmb3JjZSBTQ006YzpcDQotY29tcGlsZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnw6Q29tcGlsZTomQ29tcGlsZSxkbWFrZSAlbi5vYmoNCi1tYWtlPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OkJ1aWxkOiZCdWlsZCxkbWFrZSBpbnN0YWxsDQotcmVidWlsZD1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpSZWJ1aWxkOiZSZWJ1aWxkLGRtYWtlIGNsZWFuZXhlICYgZG1ha2UgaW5zdGFsbCAtdQ0KLWRlYnVnPWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8OkRlYnVnOiZEZWJ1ZywNCi1leGVjdXRlPWhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkV4ZWN1dGU6RSZ4ZWN1dGUsDQotdXNlcjE9aGlkZXw6VXNlciAxOlVzZXIgMSwNCi11c2VyMj1oaWRlfDpVc2VyIDI6VXNlciAyLA0KLXVzZXJ0b29sX2NsZWFuX2RpcmVjdG9yeT1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpDbGVhbiBEaXJlY3Rvcnk6QyZsZWFuIERpcmVjdG9yeSxkbWFrZSBjbGVhbmV4ZQ0KLXdvcmtpbmdkaXI9Lg0KLWluY2x1ZGVkaXJzPSUoU0NJVEVDSClcaW5jbHVkZTslKFBSSVZBVEUpXGluY2x1ZGUNCi1yZWZmaWxlPQ0KLVtGSUxFU10NCi1xbnhcX210cnJxbnguYXNtDQotcW54XGNwdWluZm8uYw0KLXFueFxldmVudC5jDQotcW54XG10cnJxbnguYw0KLXFueFxvc2hkci5oDQotcW54XHBtLmMNCi1xbnhcdmZsYXQuYw0KLXFueFx6dGltZXIuYw0KLVtBU1NPQ0lBVElPTl0NCi1bQ09ORklHVVJBVElPTlNdDQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG12eGQudnBqIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG12eGQudnBqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmNmOTExLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtdnhkLnZwagorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLVtTY2lUZWNoXQ0KLWNvbXBpbGVyPWJjNTAtDQotdGFyZ2V0b3M9dnhkDQotW0NPTVBJTEVSXQ0KLXZlcnNpb249NS4wYg0KLU1BQ1JPPWVuYWJsZV9jdXJyZW50X2NvbXBpbGVyXG4NCi1hY3RpdmVjb25maWc9LHdjMTAtZDMyDQotRklMVEVSTkFNRT1Tb3VyY2UgRmlsZXNcbkluY2x1ZGUgRmlsZXNcbkFzc2VtYmxlciBGaWxlc1xuDQotRklMVEVSUEFUVEVSTj0qLmM7Ki5jcHA7Ki5jeHg7Ki5wcmc7Ki5wYXM7Ki5kcHI7Ki5iYXM7Ki5qYXZhOyouc2M7Ki5lOyouY29iOyouaHRtbDsqLnJjXG4qLmhcbiouYXNtXG4NCi1GSUxURVJBU1NPQ0lBVEVGSUxFVFlQRVM9MCAwIDAgDQotRklMVEVSQVBQQ09NTUFORD1cblxuXG4NCi12Y3Nwcm9qZWN0PVNDQzpQZXJmb3JjZSBTQ006Ly9kZXBvdA0KLXZjc2xvY2FscGF0aD1TQ0M6UGVyZm9yY2UgU0NNOmM6XA0KLWNvbXBpbGU9Y29uY3VyfGNhcHR1cmV8bm9jaGFuZ2VkaXJ8OkNvbXBpbGU6JkNvbXBpbGUsZG1ha2UgJW4ub2JqDQotbWFrZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfG5vY2hhbmdlZGlyfDpCdWlsZDomQnVpbGQsZG1ha2UgaW5zdGFsbA0KLXJlYnVpbGQ9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZWFsbHxub2NoYW5nZWRpcnw6UmVidWlsZDomUmVidWlsZCxkbWFrZSBjbGVhbmV4ZSAmIGRtYWtlIGluc3RhbGwgLXUNCi1kZWJ1Zz1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpEZWJ1ZzomRGVidWcsDQotZXhlY3V0ZT1oaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpFeGVjdXRlOkUmeGVjdXRlLA0KLXVzZXIxPWhpZGV8OlVzZXIgMTpVc2VyIDEsDQotdXNlcjI9aGlkZXw6VXNlciAyOlVzZXIgMiwNCi11c2VydG9vbF9jbGVhbl9kaXJlY3Rvcnk9Y29uY3VyfGNhcHR1cmV8aGlkZXxzYXZlbm9uZXxub2NoYW5nZWRpcnw6Q2xlYW4gRGlyZWN0b3J5OiZDbGVhbiBEaXJlY3RvcnksZG1ha2UgY2xlYW5leGUNCi13b3JraW5nZGlyPS4NCi1pbmNsdWRlZGlycz0lKFNDSVRFQ0gpXGluY2x1ZGU7JShQUklWQVRFKVxpbmNsdWRlDQotcmVmZmlsZT0NCi1bRklMRVNdDQotdnhkXF9wbS5hc20NCi12eGRcY3B1aW5mby5jDQotdnhkXGZpbGVpby5jDQotdnhkXG9zaGRyLmgNCi12eGRccG0uYw0KLXZ4ZFx2ZmxhdC5jDQotdnhkXHp0aW1lci5jDQotW0FTU09DSUFUSU9OXQ0KLVtDT05GSUdVUkFUSU9OU10NCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbXdpbjMyLnZwaiBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Btd2luMzIudnBqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2U2ODIyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Btd2luMzIudnBqCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotW1NjaVRlY2hdDQotY29tcGlsZXI9dmM2MC0gDQotdGFyZ2V0b3M9YzMyIA0KLVtDT01QSUxFUl0NCi12ZXJzaW9uPTUuMGINCi1NQUNSTz1lbmFibGVfY3VycmVudF9jb21waWxlclxuDQotYWN0aXZlY29uZmlnPSx3YzEwLWQzMg0KLUZJTFRFUk5BTUU9U291cmNlIEZpbGVzXG5JbmNsdWRlIEZpbGVzXG5Bc3NlbWJsZXIgRmlsZXNcbg0KLUZJTFRFUlBBVFRFUk49Ki5jOyouY3BwOyouY3h4OyoucHJnOyoucGFzOyouZHByOyouYmFzOyouamF2YTsqLnNjOyouZTsqLmNvYjsqLmh0bWw7Ki5yY1xuKi5oXG4qLmFzbVxuDQotRklMVEVSQVNTT0NJQVRFRklMRVRZUEVTPTAgMCAwIA0KLUZJTFRFUkFQUENPTU1BTkQ9XG5cblxuDQotdmNzcHJvamVjdD1TQ0M6UGVyZm9yY2UgU0NNOi8vZGVwb3QNCi12Y3Nsb2NhbHBhdGg9U0NDOlBlcmZvcmNlIFNDTTpjOlwNCi1jb21waWxlPWNvbmN1cnxjYXB0dXJlfDpDb21waWxlOiZDb21waWxlLGRtYWtlICVuLm9iag0KLW1ha2U9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZWFsbHw6QnVpbGQ6JkJ1aWxkLGRtYWtlIGluc3RhbGwNCi1yZWJ1aWxkPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OlJlYnVpbGQ6JlJlYnVpbGQsZG1ha2UgY2xlYW5leGUgJiBkbWFrZSBpbnN0YWxsIC11DQotZGVidWc9Y29uY3VyfGNhcHR1cmV8aGlkZXxzYXZlbm9uZXw6RGVidWc6JkRlYnVnLA0KLWV4ZWN1dGU9aGlkZXxzYXZlbm9uZXxub2NoYW5nZWRpcnw6RXhlY3V0ZTpFJnhlY3V0ZSwNCi11c2VyMT1oaWRlfDpVc2VyIDE6VXNlciAxLA0KLXVzZXIyPWhpZGV8OlVzZXIgMjpVc2VyIDIsDQotdXNlcnRvb2xfY2xlYW5fZGlyZWN0b3J5PWNvbmN1cnxjYXB0dXJlfHNhdmVub25lfDpDbGVhbiBEaXJlY3Rvcnk6JkNsZWFuIERpcmVjdG9yeSxkbWFrZSBjbGVhbmV4ZQ0KLXdvcmtpbmdkaXI9Lg0KLWluY2x1ZGVkaXJzPSUoU0NJVEVDSClcaW5jbHVkZTslKFBSSVZBVEUpXGluY2x1ZGUNCi1yZWZmaWxlPQ0KLVtGSUxFU10NCi13aW4zMlxfcG13aW4zMi5hc20NCi13aW4zMlxjcHVpbmZvLmMNCi13aW4zMlxkZHJhdy5jDQotd2luMzJcZXZlbnQuYw0KLXdpbjMyXG9zaGRyLmgNCi13aW4zMlxwbS5jDQotd2luMzJcdmZsYXQuYw0KLXdpbjMyXHp0aW1lci5jDQotW0FTU09DSUFUSU9OXQ0KLVtDT05GSUdVUkFUSU9OU10NCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvX210cnJxbnguYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L19tdHJycW54LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzZmUxMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvX210cnJxbnguYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIE5BU00KLTsqIEVudmlyb25tZW50OiBRTlgKLTsqCi07KiBEZXNjcmlwdGlvbjogQXNzZW1ibGVyIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBNZW1vcnkgVHlwZSBSYW5nZSBSZWdpc3RlcgotOyogICAgICAgICAgICAgIChNVFJSKSBtb2R1bGUgZm9yIFFOWC4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgICAgIF9tdHJycW54ICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1iZWdkYXRhc2VnICBfbXRycnFueCAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi1pZmRlZiAgIFVTRV9OQVNNCi0lZGVmaW5lIFIwX0ZMVVNIX1RMQiAgICAwCi0lZGVmaW5lIFIwX1NBVkVfQ1I0ICAgICAxCi0lZGVmaW5lIFIwX1JFU1RPUkVfQ1I0ICAyCi0lZGVmaW5lIFIwX1JFQURfTVNSICAgICAzCi0lZGVmaW5lIFIwX1dSSVRFX01TUiAgICA0Ci1lbHNlCi1SMF9GTFVTSF9UTEIgICAgICAgIEVRVSAwCi1SMF9TQVZFX0NSNCAgICAgICAgIEVRVSAxCi1SMF9SRVNUT1JFX0NSNCAgICAgIEVRVSAyCi1SMF9SRUFEX01TUiAgICAgICAgIEVRVSAzCi1SMF9XUklURV9NU1IgICAgICAgIEVRVSA0Ci1lbmRpZgotCi1jcHVibGljIF9QTV9SMAotX1BNX1IwX3NlcnZpY2UgICAgICBkZCAgMAotX1BNX1IwX3JlZyAgICAgICAgICBkZCAgMAotX1BNX1IwX2VheCAgICAgICAgICBkZCAgMAotX1BNX1IwX2VkeCAgICAgICAgICBkZCAgMAotCi1lbmRkYXRhc2VnICBfbXRycnFueCAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi1iZWdjb2Rlc2VnICBfbXRycnFueCAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi1QNTg2Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIF9NVFJSX2Rpc2FibGVJbnQodm9pZCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm4gcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9kaXNhYmxlSW50Ci0KLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXQgZmxhZyB3b3JkIG9uIHN0YWNrCi07ICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgRGlzYWJsZSBpbnRlcnJ1cHRzIQotICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICA7IGRlcG9zaXQgZmxhZyB3b3JkIGluIHJldHVybiByZWdpc3RlcgotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfTVRSUl9yZXN0b3JlSW50KHVsb25nIHBzKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlc3RvcmUgcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX01UUlJfcmVzdG9yZUludAotCi0gICAgICAgIEFSRyAgICAgcHM6VUxPTkcKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AgICAgICAgICA7IFNldCB1cCBzdGFjayBmcmFtZQotICAgICAgICBwdXNoICAgIFtVTE9ORyBwc10KLSAgICAgICAgcG9wZmQgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHByb2Nlc3NvciBzdGF0dXMgKGFuZCBpbnRlcnJ1cHRzKQotICAgICAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWNoYXIgX01UUlJfZ2V0Q3g4Nih1Y2hhciByZWcpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCBhIEN5cml4IENQVSBpbmRleGVkIHJlZ2lzdGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX01UUlJfZ2V0Q3g4NgotCi0gICAgICAgIEFSRyAgICAgcmVnOlVDSEFSCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGFsLFtyZWddCi0gICAgICAgIG91dCAgICAgMjJoLGFsCi0gICAgICAgIGluICAgICAgYWwsMjNoCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVjaGFyIF9NVFJSX3NldEN4ODYodWNoYXIgcmVnLHVjaGFyIHZhbCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBXcml0ZSBhIEN5cml4IENQVSBpbmRleGVkIHJlZ2lzdGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX01UUlJfc2V0Q3g4NgotCi0gICAgICAgIEFSRyAgICAgcmVnOlVDSEFSLCB2YWw6VUNIQVIKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgYWwsW3JlZ10KLSAgICAgICAgb3V0ICAgICAyMmgsYWwKLSAgICAgICAgbW92ICAgICBhbCxbdmFsXQotICAgICAgICBvdXQgICAgIDIzaCxhbAotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bG9uZyBfUE1fcmluZzBfaXNyKHZvaWQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmluZyAwIGNsb2NrIGludGVycnVwdCBoYW5kbGVyIHRoYXQgd2UgdXNlIHRvIGV4ZWN1dGUgdGhlIE1UUlIgc3VwcG9ydAotOyBjb2RlLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jbmVhciAgIF9QTV9yaW5nMF9pc3IKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fZmx1c2hUTEIodm9pZCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgcHVzaGFkCi0gICAgICAgIGNtcCAgICAgW0RXT1JEIF9QTV9SMF9zZXJ2aWNlXSxSMF9GTFVTSF9UTEIKLSAgICAgICAgam5lICAgICBAQDEKLSAgICAgICAgd2JpbnZkICAgICAgICAgICAgICAgICAgOyBGbHVzaCB0aGUgQ1BVIGNhY2hlCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMyAgICAgICAgIAotICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICA7IEZsdXNoIHRoZSBUTEIKLSAgICAgICAgam1wICAgICBAQEV4aXQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIF9NVFJSX3NhdmVDUjQodm9pZCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBAMTogICAgY21wICAgICBbRFdPUkQgX1BNX1IwX3NlcnZpY2VdLFIwX1NBVkVfQ1I0Ci0gICAgICAgIGpuZSAgICAgQEAyCi0KLTsgU2F2ZSB2YWx1ZSBvZiBDUjQgYW5kIGNsZWFyIFBhZ2UgR2xvYmFsIEVuYWJsZSAoYml0IDcpCi0KLSAgICAgICAgbW92ICAgICBlYngsY3I0Ci0gICAgICAgIG1vdiAgICAgZWF4LGVieAotICAgICAgICBhbmQgICAgIGFsLDdGaAotICAgICAgICBtb3YgICAgIGNyNCxlYXgKLQotOyBEaXNhYmxlIGFuZCBmbHVzaCBjYWNoZXMKLQotICAgICAgICBtb3YgICAgIGVheCxjcjAKLSAgICAgICAgb3IgICAgICBlYXgsNDAwMDAwMDBoCi0gICAgICAgIHdiaW52ZAotICAgICAgICBtb3YgICAgIGNyMCxlYXgKLSAgICAgICAgd2JpbnZkCi0KLTsgUmV0dXJuIHZhbHVlIGZyb20gQ1I0Ci0KLSAgICAgICAgbW92ICAgICBbX1BNX1IwX3JlZ10sZWJ4Ci0gICAgICAgIGptcCAgICAgQEBFeGl0Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9NVFJSX3Jlc3RvcmVDUjQodWxvbmcgY3I0VmFsKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AQDI6ICAgIGNtcCAgICAgW0RXT1JEIF9QTV9SMF9zZXJ2aWNlXSxSMF9SRVNUT1JFX0NSNAotICAgICAgICBqbmUgICAgIEBAMwotCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMAotICAgICAgICBhbmQgICAgIGVheCwwQkZGRkZGRkZoCi0gICAgICAgIG1vdiAgICAgY3IwLGVheAotICAgICAgICBtb3YgICAgIGVheCxbX1BNX1IwX3JlZ10KLSAgICAgICAgbW92ICAgICBjcjQsZWF4Ci0gICAgICAgIGptcCAgICAgQEBFeGl0Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9NVFJSX3JlYWRNU1IoaW50IHJlZywgdWxvbmcgRkFSICplYXgsIHVsb25nIEZBUiAqZWR4KTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQEAzOiAgICBjbXAgICAgIFtEV09SRCBfUE1fUjBfc2VydmljZV0sUjBfUkVBRF9NU1IKLSAgICAgICAgam5lICAgICBAQDQKLQotICAgICAgICBtb3YgICAgIGVjeCxbX1BNX1IwX3JlZ10KLSAgICAgICAgcmRtc3IKLSAgICAgICAgbW92ICAgICBbX1BNX1IwX2VheF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW19QTV9SMF9lZHhdLGVkeAotICAgICAgICBqbXAgICAgIEBARXhpdAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfTVRSUl93cml0ZU1TUihpbnQgcmVnLCB1bG9uZyBlYXgsIHVsb25nIGVkeCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBANDogICAgY21wICAgICBbRFdPUkQgX1BNX1IwX3NlcnZpY2VdLFIwX1dSSVRFX01TUgotICAgICAgICBqbmUgICAgIEBARXhpdAotCi0gICAgICAgIG1vdiAgICAgZWN4LFtfUE1fUjBfcmVnXQotICAgICAgICBtb3YgICAgIGVheCxbX1BNX1IwX2VheF0KLSAgICAgICAgbW92ICAgICBlZHgsW19QTV9SMF9lZHhdCi0gICAgICAgIHdybXNyCi0gICAgICAgIGptcCAgICAgQEBFeGl0Ci0KLUBARXhpdDogbW92ICAgICBbRFdPUkQgX1BNX1IwX3NlcnZpY2VdLC0xCi0gICAgICAgIHBvcGFkCi0gICAgICAgIG1vdiAgICAgZWF4LDAKLSAgICAgICAgcmV0ZgotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfbXRycnFueAotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9jcHVpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NzgyNTQyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9jcHVpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBRTlgKLSoKLSogRGVzY3JpcHRpb246ICBRTlggc3BlY2lmaWMgY29kZSBmb3IgdGhlIENQVSBkZXRlY3Rpb24gbW9kdWxlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UT0RPOiBXZSBzaG91bGQgaW1wbGVtZW50IHRoaXMgZm9yIFFOWCEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFNldE1heFRocmVhZFByaW9yaXR5KCkgIDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UT0RPOiBXZSBzaG91bGQgaW1wbGVtZW50IHRoaXMgZm9yIFFOWCEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKLXsKLSAgICBmcmVxLT5sb3cgPSBDTE9DS1NfUEVSX1NFQyAqIDEwMDA7Ci0gICAgZnJlcS0+aGlnaCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgR2V0Q291bnRlcih0KSAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHQpLT5sb3cgPSBjbG9jaygpICogMTAwMDsgIFwKLSAgICAodCktPmhpZ2ggPSAwOyAgICAgICAgICAgICAgXAotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L2V2ZW50LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVjZDUxNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvZXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDYwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUU5YCi0qCi0qIERlc2NyaXB0aW9uOiAgUU5YIGZ1bGxzY3JlZW4gY29uc29sZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFNjaVRlY2gKLSogICAgICAgICAgICAgICBjcm9zcyBwbGF0Zm9ybSBldmVudCBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgX19RTlhOVE9fXwotc3RhdGljIHN0cnVjdCBfbW91c2VfY3RybCAgICpfUE1fbW91c2VfY3RsOwotc3RhdGljIGludCAgICAgICAgICBfUE1fa2V5Ym9hcmRfZmQgPSAtMTsKLS8qc3RhdGljIGludCAgICAgICAgICAgIF9QTV9tb2RpZmllcnMsIF9QTV9sZWRzOyAqLwotI2Vsc2UKLXN0YXRpYyBpbnQgICAgICAgICAga2JkX2ZkID0gLTEsIG1vdXNlX2ZkID0gLTE7Ci0jZW5kaWYKLXN0YXRpYyBpbnQgICAgICAgICAga2lsbF9waWQgPSAwOwotc3RhdGljIHVzaG9ydCAgICAgICBrZXlVcE1zZ1syNTZdID0gezB9Oy8qIFRhYmxlIG9mIGtleSB1cCBtZXNzYWdlcyAgICAgKi8KLXN0YXRpYyBpbnQgICAgICAgICAgcmFuZ2VYLHJhbmdlWTsgICAgICAvKiBSYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyAgICovCi0KLSNkZWZpbmUgVElNRV9UT19NU0VDKF9fdCkgICAoKF9fdCkudHZfbnNlYyAvIDEwMDAwMDAgKyAoX190KS50dl9zZWMgKiAxMDAwKQotCi0jZGVmaW5lIExFRF9OVU0gICAgICAgICAxCi0jZGVmaW5lIExFRF9DQVAgICAgICAgICAyCi0jZGVmaW5lIExFRF9TQ1IgICAgICAgICA0Ci0KLS8qIFNjYW5jb2RlIG1hcHBpbmdzIG9uIFFOWCBmb3Igc3BlY2lhbCBrZXlzICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgc2NhbjsKLSAgICBpbnQgbWFwOwotICAgIH0ga2V5bWFwOwotCi0vKiBUT0RPOiBGaXggdGhpcyBhbmQgc2V0IGl0IHVwIHNvIHdlIGNhbiBkbyBhIGJpbmFyeSBzZWFyY2ghICovCi0KLWtleW1hcCBrZXltYXBzW10gPSB7Ci0gICAgezk2LCBLQl9wYWRFbnRlcn0sCi0gICAgezc0LCBLQl9wYWRNaW51c30sCi0gICAgezc4LCBLQl9wYWRQbHVzfSwKLSAgICB7NTUsIEtCX3BhZFRpbWVzfSwKLSAgICB7OTgsIEtCX3BhZERpdmlkZX0sCi0gICAgezcxLCBLQl9wYWRIb21lfSwKLSAgICB7NzIsIEtCX3BhZFVwfSwKLSAgICB7NzMsIEtCX3BhZFBhZ2VVcH0sCi0gICAgezc1LCBLQl9wYWRMZWZ0fSwKLSAgICB7NzYsIEtCX3BhZENlbnRlcn0sCi0gICAgezc3LCBLQl9wYWRSaWdodH0sCi0gICAgezc5LCBLQl9wYWRFbmR9LAotICAgIHs4MCwgS0JfcGFkRG93bn0sCi0gICAgezgxLCBLQl9wYWRQYWdlRG93bn0sCi0gICAgezgyLCBLQl9wYWRJbnNlcnR9LAotICAgIHs4MywgS0JfcGFkRGVsZXRlfSwKLSAgICB7MTA1LEtCX2xlZnR9LAotICAgIHsxMDgsS0JfZG93bn0sCi0gICAgezEwNixLQl9yaWdodH0sCi0gICAgezEwMyxLQl91cH0sCi0gICAgezExMCxLQl9pbnNlcnR9LAotICAgIHsxMDIsS0JfaG9tZX0sCi0gICAgezEwNCxLQl9wYWdlVXB9LAotICAgIHsxMTEsS0JfZGVsZXRlfSwKLSAgICB7MTA3LEtCX2VuZH0sCi0gICAgezEwOSxLQl9wYWdlRG93bn0sCi0gICAgezEyNSxLQl9sZWZ0V2luZG93c30sCi0gICAgezEyNixLQl9yaWdodFdpbmRvd3N9LAotICAgIHsxMjcsS0JfbWVudX0sCi0gICAgezEwMCxLQl9yaWdodEFsdH0sCi0gICAgezk3LEtCX3JpZ2h0Q3RybH0sCi0gICAgfTsKLQotLyogQW5kIHRoZSBrZXlwYWQgd2l0aCBudW0gbG9jayB0dXJuZWQgb24gKGNoYW5nZXMgdGhlIEFTQ0lJIGNvZGUgb25seSkgKi8KLQota2V5bWFwIGtleXBhZFtdID0gewotICAgIHs3MSwgQVNDSUlfN30sCi0gICAgezcyLCBBU0NJSV84fSwKLSAgICB7NzMsIEFTQ0lJXzl9LAotICAgIHs3NSwgQVNDSUlfNH0sCi0gICAgezc2LCBBU0NJSV81fSwKLSAgICB7NzcsIEFTQ0lJXzZ9LAotICAgIHs3OSwgQVNDSUlfMX0sCi0gICAgezgwLCBBU0NJSV8yfSwKLSAgICB7ODEsIEFTQ0lJXzN9LAotICAgIHs4MiwgQVNDSUlfMH0sCi0gICAgezgzLCBBU0NJSV9wZXJpb2R9LAotICAgIH07Ci0KLSNkZWZpbmUgTkJfS0VZTUFQUyAoc2l6ZW9mKGtleW1hcHMpL3NpemVvZihrZXltYXBzWzBdKSkKLSNkZWZpbmUgTkJfS0VZUEFEIChzaXplb2Yoa2V5cGFkKS9zaXplb2Yoa2V5cGFkWzBdKSkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbmNsdWRlIGdlbmVyaWMgcmF3IHNjYW5jb2RlIGtleWJvYXJkIG1vZHVsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiY29tbW9uL2tleWJvYXJkLmMiCi0KLS8qIFRoZXNlIGFyZSBub3QgdXNlZCB1bmRlciBRTlggKi8KLSNkZWZpbmUgX0VWVF9kaXNhYmxlSW50KCkgICAgICAgMQotI2RlZmluZSBfRVZUX3Jlc3RvcmVJbnQoZmxhZ3MpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNpbmNlIHN5c3RlbQotc3RhcnR1cCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIHZhbHVlIHRoYXQgaXMgcGxhY2VkIGludG8KLXRoZSB0aW1lIHN0YW1wIGZpZWxkcyBvZiBldmVudHMsIGFuZCBpcyB1c2VkIHRvIGltcGxlbWVudCBhdXRvIG1vdXNlIGRvd24KLWV2ZW50cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfRVZUX2dldFRpY2tzKHZvaWQpCi17Ci0gICAgc3RydWN0IHRpbWVzcGVjIHQ7Ci0gICAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwmdCk7Ci0gICAgcmV0dXJuICh0LnR2X25zZWMgLyAxMDAwMDAwICsgdC50dl9zZWMgKiAxMDAwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db252ZXJ0cyBhIG1pY2tleSBtb3ZlbWVudCB2YWx1ZSB0byBhIHBpeGVsIGFkanVzdG1lbnQgdmFsdWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBNaWNrZXlUb1BpeGVsKAotICAgIGludCBtaWNrZXkpCi17Ci0gICAgLyogVE9ETzogV2UgY2FuIGFkZCBzb21lIGNvZGUgaW4gaGVyZSB0byBoYW5kbGUgJ2FjY2VsZXJhdGlvbicgZm9yICovCi0gICAgLyogICAgICAgdGhlIG1vdXNlIGN1cnNvci4gRm9yIG5vdyBqdXN0IHVzZSB0aGUgbWlja2V5cy4gKi8KLSAgICByZXR1cm4gbWlja2V5OwotfQotCi0jaWZkZWYgX19RTlhOVE9fXwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXRyaWV2ZXMgYWxsIGV2ZW50cyBmcm9tIHRoZSBtb3VzZS9rZXlib2FyZCBldmVudCBxdWV1ZSBhbmQgc3R1ZmZzIHRoZW0KLWludG8gdGhlIE1HTCBldmVudCBxdWV1ZSBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgcmMxLCByYzI7Ci0gICAgc3RydWN0IF9rZXlib2FyZF9wYWNrZXQga2V5OwotICAgIHN0cnVjdCBfbW91c2VfcGFja2V0ICAgIG1zOwotICAgIHN0YXRpYyBsb25nICAgICBvbGRfYnV0dG9ucyA9IDA7Ci0gICAgdWludCAgICAgICAgICAgIG1lc3NhZ2UgPSAwLCBidXRfc3RhdCA9IDAsIG1vZHMgPSAwOwotICAgIGV2ZW50X3QgICAgICAgICBldnQ7Ci0KLSAgICB3aGlsZSAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkgewotCXJjMSA9IHJlYWQoa2JkX2ZkLCAodm9pZCAqKSZrZXksIHNpemVvZihrZXkpKTsKLQlpZiAocmMxID09IC0xKSB7Ci0JICAgIGlmIChlcnJubyA9PSBFQUdBSU4pCi0JCXJjMSA9IDA7Ci0JICAgIGVsc2UgewotCQlwZXJyb3IoImdldEV2ZW50cyIpOwotCQlQTV9mYXRhbEVycm9yKCJLZXlib2FyZCBlcnJvciIpOwotCQl9Ci0JICAgIH0KLQlpZiAocmMxID4gMCkgewotCSAgICBtZW1zZXQoJmV2dCwgMCwgc2l6ZW9mKGV2dCkpOwotCSAgICBpZiAoa2V5LmRhdGEubW9kaWZpZXJzICYgS0VZTU9EX1NISUZUKQotCQltb2RzIHw9IEVWVF9MRUZUU0hJRlQ7Ci0JICAgIGlmIChrZXkuZGF0YS5tb2RpZmllcnMgJiBLRVlNT0RfQ1RSTCkKLQkJbW9kcyB8PSBFVlRfQ1RSTFNUQVRFOwotCSAgICBpZiAoa2V5LmRhdGEubW9kaWZpZXJzICYgS0VZTU9EX0FMVCkKLQkJbW9kcyB8PSBFVlRfQUxUU1RBVEU7Ci0KLQkgICAgLyogTm93IHN0b3JlIHRoZSBrZXlib2FyZCBldmVudCBkYXRhICovCi0JICAgIGV2dC53aGVuID0gVElNRV9UT19NU0VDKGtleS50aW1lKTsKLQkgICAgaWYgKGtleS5kYXRhLmZsYWdzICYgS0VZX1NDQU5fVkFMSUQpCi0JCWV2dC5tZXNzYWdlIHw9IChrZXkuZGF0YS5rZXlfc2NhbiAmIDB4N0YpIDw8IDg7Ci0JICAgIGlmICgoa2V5LmRhdGEuZmxhZ3MgJiBLRVlfU1lNX1ZBTElEKSAmJgotCQkoKChrZXkuZGF0YS5rZXlfc3ltICYgMHhmZjAwKSA9PSAweGYwMDAgJiYKLQkJKGtleS5kYXRhLmtleV9zeW0gJiAweGZmKSA8IDB4MjApIHx8Ci0JCWtleS5kYXRhLmtleV9zeW0gPCAweDgwKSkKLQkJZXZ0Lm1lc3NhZ2UgfD0gKGtleS5kYXRhLmtleV9zeW0gJiAweEZGKTsKLQkgICAgZXZ0Lm1vZGlmaWVycyA9IG1vZHM7Ci0JICAgIGlmIChrZXkuZGF0YS5mbGFncyAmIEtFWV9ET1dOKSB7Ci0JCWV2dC53aGF0ID0gRVZUX0tFWURPV047Ci0JCWtleVVwTXNnW2V2dC5tZXNzYWdlID4+IDhdID0gKHVzaG9ydClldnQubWVzc2FnZTsKLQkJfQotCSAgICBlbHNlIGlmIChrZXkuZGF0YS5mbGFncyAmIEtFWV9SRVBFQVQpIHsKLQkJZXZ0Lm1lc3NhZ2UgfD0gMHgxMDAwMDsKLQkJZXZ0LndoYXQgPSBFVlRfS0VZUkVQRUFUOwotCQl9Ci0JICAgIGVsc2UgewotCQlldnQud2hhdCA9IEVWVF9LRVlVUDsKLQkJZXZ0Lm1lc3NhZ2UgPSBrZXlVcE1zZ1tldnQubWVzc2FnZSA+PiA4XTsKLQkJaWYgKGV2dC5tZXNzYWdlID09IDApCi0JCSAgICBjb250aW51ZTsKLQkJa2V5VXBNc2dbZXZ0Lm1lc3NhZ2UgPj4gOF0gPSAwOwotCQl9Ci0KLQkgICAgLyogTm93IGFkZCB0aGUgbmV3IGV2ZW50IHRvIHRoZSBldmVudCBxdWV1ZSAqLwotCSAgICBhZGRFdmVudCgmZXZ0KTsKLQkgICAgfQotCXJjMiA9IHJlYWQobW91c2VfZmQsICh2b2lkICopJm1zLCBzaXplb2YgKG1zKSk7Ci0JaWYgKHJjMiA9PSAtMSkgewotCSAgICBpZiAoZXJybm8gPT0gRUFHQUlOKQotCQlyYzIgPSAwOwotCSAgICBlbHNlIHsKLQkJcGVycm9yKCJnZXRFdmVudHMiKTsKLQkJUE1fZmF0YWxFcnJvcigiTW91c2UgZXJyb3IiKTsKLQkJfQotCSAgICB9Ci0JaWYgKHJjMiA+IDApIHsKLQkgICAgbWVtc2V0KCZldnQsIDAsIHNpemVvZihldnQpKTsKLQkgICAgbXMuaGRyLmJ1dHRvbnMgJj0KLQkJKF9QT0lOVEVSX0JVVFRPTl9MRUZUIHwgX1BPSU5URVJfQlVUVE9OX1JJR0hUKTsKLQkgICAgaWYgKG1zLmhkci5idXR0b25zICYgX1BPSU5URVJfQlVUVE9OX0xFRlQpCi0JCWJ1dF9zdGF0ID0gRVZUX0xFRlRCVVQ7Ci0JICAgIGlmICgobXMuaGRyLmJ1dHRvbnMgJiBfUE9JTlRFUl9CVVRUT05fTEVGVCkgIT0KLQkJKG9sZF9idXR0b25zICYgX1BPSU5URVJfQlVUVE9OX0xFRlQpKQotCQltZXNzYWdlID0gRVZUX0xFRlRCTUFTSzsKLQkgICAgaWYgKG1zLmhkci5idXR0b25zICYgX1BPSU5URVJfQlVUVE9OX1JJR0hUKQotCQlidXRfc3RhdCB8PSBFVlRfUklHSFRCVVQ7Ci0JICAgIGlmICgobXMuaGRyLmJ1dHRvbnMgJiBfUE9JTlRFUl9CVVRUT05fUklHSFQpICE9Ci0JCShvbGRfYnV0dG9ucyAmIF9QT0lOVEVSX0JVVFRPTl9SSUdIVCkpCi0JCW1lc3NhZ2UgfD0gRVZUX1JJR0hUQk1BU0s7Ci0JICAgIGlmIChtcy5keCB8fCBtcy5keSkgewotCQltcy5keSA9IC1tcy5keTsKLQkJRVZULm14ICs9IE1pY2tleVRvUGl4ZWwobXMuZHgpOwotCQlFVlQubXkgKz0gTWlja2V5VG9QaXhlbChtcy5keSk7Ci0JCWlmIChFVlQubXggPCAwKSBFVlQubXggPSAwOwotCQlpZiAoRVZULm15IDwgMCkgRVZULm15ID0gMDsKLQkJaWYgKEVWVC5teCA+IHJhbmdlWCkgICAgRVZULm14ID0gcmFuZ2VYOwotCQlpZiAoRVZULm15ID4gcmFuZ2VZKSAgICBFVlQubXkgPSByYW5nZVk7Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFTU9WRTsKLQkJZXZ0LndoZW4gPSBUSU1FX1RPX01TRUMobXMuaGRyLnRpbWUpOwotCQlldnQud2hlcmVfeCA9IEVWVC5teDsKLQkJZXZ0LndoZXJlX3kgPSBFVlQubXk7Ci0JCWV2dC5yZWxhdGl2ZV94ID0gbXMuZHg7Ci0JCWV2dC5yZWxhdGl2ZV95ID0gbXMuZHk7Ci0JCWV2dC5tb2RpZmllcnMgPSBidXRfc3RhdDsKLQkJYWRkRXZlbnQoJmV2dCk7Ci0JCX0KLQkgICAgZXZ0LndoYXQgPSBtcy5oZHIuYnV0dG9ucyA8IG9sZF9idXR0b25zID8KLQkJRVZUX01PVVNFVVAgOiBFVlRfTU9VU0VET1dOOwotCSAgICBldnQud2hlbiA9IFRJTUVfVE9fTVNFQyhtcy5oZHIudGltZSk7Ci0JICAgIGV2dC53aGVyZV94ID0gRVZULm14OwotCSAgICBldnQud2hlcmVfeSA9IEVWVC5teTsKLQkgICAgZXZ0LnJlbGF0aXZlX3ggPSBtcy5keDsKLQkgICAgZXZ0LnJlbGF0aXZlX3kgPSBtcy5keTsKLQkgICAgZXZ0Lm1vZGlmaWVycyA9IGJ1dF9zdGF0OwotCSAgICBldnQubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JICAgIGlmIChtcy5oZHIuYnV0dG9ucyAhPSBvbGRfYnV0dG9ucykgewotCQlhZGRFdmVudCgmZXZ0KTsKLQkJb2xkX2J1dHRvbnMgPSBtcy5oZHIuYnV0dG9uczsKLQkJfQotCSAgICB9Ci0JaWYgKHJjMSArIHJjMiA9PSAwKQotCSAgICBicmVhazsKLQl9Ci19Ci0jZWxzZQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXRyaWV2ZXMgYWxsIGV2ZW50cyBmcm9tIHRoZSBtb3VzZS9rZXlib2FyZCBldmVudCBxdWV1ZSBhbmQgc3R1ZmZzIHRoZW0KLWludG8gdGhlIE1HTCBldmVudCBxdWV1ZSBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgc3RydWN0IG1vdXNlX2V2ZW50ICAgICAgZXY7Ci0gICAgaW50ICAgICAgICAgICAgIHJjOwotICAgIHN0YXRpYyBsb25nICAgICAgICAgb2xkX2J1dHRvbnMgPSAwOwotICAgIHVpbnQgICAgICAgICAgICAgICAgbWVzc2FnZSA9IDAsIGJ1dF9zdGF0ID0gMDsKLSAgICBldmVudF90ICAgICAgICAgICAgIGV2dDsKLSAgICBjaGFyICAgICAgICAgICAgICAgIGJ1ZlszMl07Ci0gICAgaW50ICAgICAgICAgICAgIG51bWtleXMsIGk7Ci0KLSAgICAvKiBQb2xsIGtleWJvYXJkIGV2ZW50cyAqLwotICAgIHdoaWxlICgobnVta2V5cyA9IHJlYWQoX1BNX2tleWJvYXJkX2ZkLCBidWYsIHNpemVvZiBidWYpKSA+IDApIHsKLQlmb3IgKGkgPSAwOyBpIDwgbnVta2V5czsgaSsrKSB7Ci0JICAgIHByb2Nlc3NSYXdTY2FuQ29kZShidWZbaV0pOwotCSAgICB9Ci0JfQotCi0gICAgaWYgKF9QTV9tb3VzZV9jdGwgPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICAvKiBHb2JibGUgcGVuZGluZyBtb3VzZSBldmVudHMgKi8KLSAgICB3aGlsZSAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkgewotCXJjID0gbW91c2VfcmVhZChfUE1fbW91c2VfY3RsLCAmZXYsIDEsIDAsIE5VTEwpOwotCWlmIChyYyA9PSAtMSkgewotCSAgICBwZXJyb3IoImdldEV2ZW50cyIpOwotCSAgICBQTV9mYXRhbEVycm9yKCJNb3VzZSBlcnJvciAoSW5wdXQgdGVybWluYXRlZD8pIik7Ci0JICAgIH0KLQlpZiAocmMgPT0gMCkKLQkgICAgYnJlYWs7Ci0KLQltZXNzYWdlID0gMCwgYnV0X3N0YXQgPSAwOwotCW1lbXNldCgmZXZ0LCAwLCBzaXplb2YoZXZ0KSk7Ci0KLQlldi5idXR0b25zICY9IChfTU9VU0VfTEVGVCB8IF9NT1VTRV9SSUdIVCk7Ci0JaWYgKGV2LmJ1dHRvbnMgJiBfTU9VU0VfTEVGVCkKLQkgICAgYnV0X3N0YXQgPSBFVlRfTEVGVEJVVDsKLQlpZiAoKGV2LmJ1dHRvbnMgJiBfTU9VU0VfTEVGVCkgIT0gKG9sZF9idXR0b25zICYgX01PVVNFX0xFRlQpKQotCSAgICBtZXNzYWdlID0gRVZUX0xFRlRCTUFTSzsKLQlpZiAoZXYuYnV0dG9ucyAmIF9NT1VTRV9SSUdIVCkKLQkgICAgYnV0X3N0YXQgfD0gRVZUX1JJR0hUQlVUOwotCWlmICgoZXYuYnV0dG9ucyAmIF9NT1VTRV9SSUdIVCkgIT0gKG9sZF9idXR0b25zICYgX01PVVNFX1JJR0hUKSkKLQkgICAgbWVzc2FnZSB8PSBFVlRfUklHSFRCTUFTSzsKLQlpZiAoZXYuZHggfHwgZXYuZHkpIHsKLQkgICAgZXYuZHkgPSAtZXYuZHk7Ci0JICAgIEVWVC5teCArPSBNaWNrZXlUb1BpeGVsKGV2LmR4KTsKLQkgICAgRVZULm15ICs9IE1pY2tleVRvUGl4ZWwoZXYuZHkpOwotCSAgICBpZiAoRVZULm14IDwgMCkgRVZULm14ID0gMDsKLQkgICAgaWYgKEVWVC5teSA8IDApIEVWVC5teSA9IDA7Ci0JICAgIGlmIChFVlQubXggPiByYW5nZVgpICAgIEVWVC5teCA9IHJhbmdlWDsKLQkgICAgaWYgKEVWVC5teSA+IHJhbmdlWSkgICAgRVZULm15ID0gcmFuZ2VZOwotCSAgICBldnQud2hhdCA9IEVWVF9NT1VTRU1PVkU7Ci0JICAgIGV2dC53aGVuID0gZXYudGltZXN0YW1wKjEwMDsKLQkgICAgZXZ0LndoZXJlX3ggPSBFVlQubXg7Ci0JICAgIGV2dC53aGVyZV95ID0gRVZULm15OwotCSAgICBldnQucmVsYXRpdmVfeCA9IGV2LmR4OwotCSAgICBldnQucmVsYXRpdmVfeSA9IGV2LmR5OwotCSAgICBldnQubW9kaWZpZXJzID0gYnV0X3N0YXQ7Ci0JICAgIGFkZEV2ZW50KCZldnQpOwotCSAgICB9Ci0JZXZ0LndoYXQgPSBldi5idXR0b25zIDwgb2xkX2J1dHRvbnMgPyBFVlRfTU9VU0VVUCA6IEVWVF9NT1VTRURPV047Ci0JZXZ0LndoZW4gPSBldi50aW1lc3RhbXAqMTAwOwotCWV2dC53aGVyZV94ID0gRVZULm14OwotCWV2dC53aGVyZV95ID0gRVZULm15OwotCWV2dC5yZWxhdGl2ZV94ID0gZXYuZHg7Ci0JZXZ0LnJlbGF0aXZlX3kgPSBldi5keTsKLQlldnQubW9kaWZpZXJzID0gYnV0X3N0YXQ7Ci0JZXZ0Lm1lc3NhZ2UgPSBtZXNzYWdlOwotCWlmIChldi5idXR0b25zICE9IG9sZF9idXR0b25zKSB7Ci0JICAgIGFkZEV2ZW50KCZldnQpOwotCSAgICBvbGRfYnV0dG9ucyA9IGV2LmJ1dHRvbnM7Ci0JICAgIH0KLQl9Ci19Ci0jZW5kaWYgIC8qIF9fUU5YTlRPX18gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIG1hY3JvL2Z1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydHMgdGhlIHNjYW4gY29kZXMgcmVwb3J0ZWQgYnkgdGhlCi1rZXlib2FyZCB0byBvdXIgZXZlbnQgbGlicmFyaWVzIG5vcm1hbGlzZWQgZm9ybWF0LiBXZSBvbmx5IGhhdmUgb25lIHNjYW4KLWNvZGUgZm9yIHRoZSAnQScga2V5LCBhbmQgdXNlIHNoaWZ0IG1vZGlmaWVycyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYQotQ3RybC1GMSwgQWx0LUYxIGV0Yy4gVGhlIHJhdyBzY2FuIGNvZGVzIGZyb20gdGhlIGtleWJvYXJkIHdvcmsgdGhpcyB3YXksCi1idXQgdGhlIE9TIGdpdmVzIHVzICdjb29rZWQnIHNjYW4gY29kZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZW0gYmFjawotdG8gdGhlIHJhdyBmb3JtYXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX21hc2tLZXlDb2RlKGV2dCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX2Fib3J0KAotICAgIGludCBzaWdubykKLXsKLSAgICBjaGFyICAgIGJ1Zls4MF07Ci0KLSAgICBFVlRfZXhpdCgpOwotICAgIHNwcmludGYoYnVmLCJUZXJtaW5hdGluZyBvbiBzaWduYWwgJWQiLHNpZ25vKTsKLSAgICBQTV9mYXRhbEVycm9yKGJ1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCi0KLVJFTUFSS1M6Ci1Jbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCi10byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCi10aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCi0KLVdlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKLWV2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9pbml0KAotICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCi17Ci0gICAgaW50ICAgICAgICAgaTsKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICBjaGFyICAgICAgICAqaWFyZ1sxNl07Ci0jaWZkZWYgX19RTlhOVE9fXwotICAgIGNoYXIgICAgICAgIGJ1ZlsxMjhdOwotICAgIEZJTEUgICAgICAgICpwOwotICAgIGludCAgICAgICAgIGFyZ25vLGxlbjsKLSNlbmRpZgotCi0jaWZkZWYgX19RTlhOVE9fXwotICAgIFRocmVhZEN0bChfTlRPX1RDVExfSU8sIDApOyAvKiBTbyBqb3lzdGljayBjb2RlIHdvbid0IGJsb3cgdXAgKi8KLSNlbmRpZgotCi0gICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KLSAgICBFVlQubW91c2VNb3ZlID0gbW91c2VNb3ZlOwotICAgIGluaXRFdmVudFF1ZXVlKCk7Ci0gICAgbWVtc2V0KGtleVVwTXNnLDAsc2l6ZW9mKGtleVVwTXNnKSk7Ci0KLSNpZmRlZiBfX1FOWE5UT19fCi0gICAgLyoKLSAgICAgKiBVc2VyIG1heSBhbHJlYWR5IGhhdmUgaW5wdXQgcnVubmluZyB3aXRoIHRoZSByaWdodCBwYXJhbWV0ZXJzLgotICAgICAqIFRodXMgdGhleSBjb3VsZCBzdGFydCBpbnB1dCBhdCBib290IHRpbWUsIHVzaW5nIHRoZSBvdXRwdXQgb2YKLSAgICAgKiBpbnB1dHRyYXAsIHBhc3NpbmcgdGhlIHRoZSAtciBmbGFnIHRvIG1ha2UgaXQgcnVuIGFzIGEgcmVzb3VyY2UKLSAgICAgKiBtYW5hZ2VyLgotICAgICAqLwotICAgIGlmICgobW91c2VfZmQgPSBvcGVuKCIvZGV2L21vdXNlMCIsIE9fUkRPTkxZIHwgT19OT05CTE9DSykpIDwgMCkgewotCS8qIFJ1biBpbnB1dHRyYXAgdG8gZ2V0IHRoZSBhcmdzIGZvciBpbnB1dCAqLwotCWlmICgocCA9IHBvcGVuKCJpbnB1dHRyYXAiLCAiciIpKSA9PSBOVUxMKQotCSAgICBQTV9mYXRhbEVycm9yKCJFcnJvciBydW5uaW5nICdpbnB1dHRyYXAnIik7Ci0JZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgcCk7Ci0JcGNsb3NlKHApOwotCi0JLyogQnVpbGQgdGhlIGFyZ3VtZW50IGxpc3QgKi8KLQlsZW4gPSBzdHJsZW4oYnVmKTsKLQlpYXJnWzBdID0gYnVmOwotCWZvciAoaSA9IDAsIGFyZ25vID0gMDsgaSA8IGxlbiAmJiBhcmdubyA8IDE1OykgewotCSAgICBpZiAoYXJnbm8gPT0gMSkgewotCQkvKgotCQkgKiBBZGQgZmxhZ3MgdG8gaW5wdXQncyBhcmcgbGlzdC4KLQkJICogJy1yJyBtZWFucyBydW4gYXMgcmVzb3VyY2UKLQkJICogbWFuYWdlciwgcHJvdmlkaW5nIHRoZSAvZGV2L21vdXNlCi0JCSAqIGFuZCAvZGV2L2tleWJvYXJkIGludGVyZmFjZXMuCi0JCSAqICctUCcgc3VwcmVzc2VzIHRoZSAvZGV2L3Bob3RvbgotCQkgKiBtZWNoYW5pc20uCi0JCSAqLwotCQlpYXJnW2FyZ25vKytdID0gIi1QciI7Ci0JCWNvbnRpbnVlOwotCQl9Ci0JICAgIHdoaWxlIChidWZbaV0gPT0gJyAnKQotCQlpKys7Ci0JICAgIGlmIChidWZbaV0gPT0gJ1wwJyB8fCBidWZbaV0gPT0gJ1xuJykKLQkJYnJlYWs7Ci0JICAgIGlhcmdbYXJnbm8rK10gPSAmYnVmW2ldOwotCSAgICB3aGlsZSAoYnVmW2ldICE9ICcgJwotCQkmJiBidWZbaV0gIT0gJ1wwJyAmJiBidWZbaV0gIT0gJ1xuJykKLQkJaSsrOwotCSAgICBidWZbaSsrXSA9ICdcMCc7Ci0JICAgIH0KLQlpYXJnW2FyZ25vXSA9IE5VTEw7Ci0KLQlpZiAoKGtpbGxfcGlkID0gc3Bhd252cChQX05PV0FJVE8sIGlhcmdbMF0sIGlhcmcpKSA9PSAtMSkgewotCSAgICBwZXJyb3IoInNwYXduaW5nIGlucHV0IHJlc21nciIpOwotCSAgICBQTV9mYXRhbEVycm9yKCJDb3VsZCBub3Qgc3RhcnQgaW5wdXQgcmVzbWdyIik7Ci0JICAgIH0KLQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCSAgICBpZiAoc3RhdCgiL2Rldi9tb3VzZTAiLCAmc3QpID09IDApCi0JCWJyZWFrOwotCSAgICBzbGVlcCgxKTsKLQkgICAgfQotCWlmICgobW91c2VfZmQgPSBvcGVuKCIvZGV2L21vdXNlMCIsIE9fUkRPTkxZfE9fTk9OQkxPQ0spKSA8IDApIHsKLQkgICAgcGVycm9yKCIvZGV2L21vdXNlMCIpOwotCSAgICBQTV9mYXRhbEVycm9yKCJDb3VsZCBub3Qgb3BlbiAvZGV2L21vdXNlMCIpOwotCSAgICB9Ci0JfQotICAgIGlmICgoa2JkX2ZkID0gb3BlbigiL2Rldi9rZXlib2FyZDAiLCBPX1JET05MWXxPX05PTkJMT0NLKSkgPCAwKSB7Ci0JcGVycm9yKCIvZGV2L2tleWJvYXJkMCIpOwotCVBNX2ZhdGFsRXJyb3IoIkNvdWxkIG5vdCBvcGVuIC9kZXYva2V5Ym9hcmQwIik7Ci0JfQotI2Vsc2UKLSAgICAvKiBDb25uZWN0IHRvIElucHV0L01vdXNlIGZvciBldmVudCBoYW5kbGluZyAqLwotICAgIGlmIChfUE1fbW91c2VfY3RsID09IE5VTEwpIHsKLQlfUE1fbW91c2VfY3RsID0gbW91c2Vfb3BlbigwLCAiL2Rldi9tb3VzZSIsIDApOwotCi0JLyogIk1vdXNlIiBpcyBub3QgcnVubmluZzsgYXR0ZW1wdCB0byBzdGFydCBpdCAqLwotCWlmIChfUE1fbW91c2VfY3RsID09IE5VTEwpIHsKLQkgICAgaWFyZ1swXSA9ICJtb3VzZXRyYXAiOwotCSAgICBpYXJnWzFdID0gInN0YXJ0IjsKLQkgICAgaWFyZ1syXSA9IE5VTEw7Ci0JICAgIGlmICgoa2lsbF9waWQgPSBzcGF3bnZwKFBfTk9XQUlUTywgaWFyZ1swXSwgKHZvaWQqKWlhcmcpKSA9PSAtMSkKLQkJcGVycm9yKCJzcGF3biAobW91c2V0cmFwKSIpOwotCSAgICBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJICAgIGlmIChzdGF0KCIvZGV2L21vdXNlIiwgJnN0KSA9PSAwKQotCQkJYnJlYWs7Ci0JCSAgICBzbGVlcCgxKTsKLQkJICAgIH0KLQkJX1BNX21vdXNlX2N0bCA9IG1vdXNlX29wZW4oMCwgIi9kZXYvbW91c2UiLCAwKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIGlmIChfUE1fa2V5Ym9hcmRfZmQgPT0gLTEpCi0JX1BNX2tleWJvYXJkX2ZkID0gb3BlbigiL2Rldi9rYmQiLCBPX1JET05MWXxPX05PTkJMT0NLKTsKLSNlbmRpZgotCi0gICAgLyogQ2F0Y2ggcHJvZ3JhbSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLwotICAgIHNpZ25hbChTSUdBQlJULCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHRlBFLCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHSU5ULCBfRVZUX2Fib3J0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUNoYW5nZXMgdGhlIHJhbmdlIG9mIGNvb3JkaW5hdGVzIHJldHVybmVkIGJ5IHRoZSBtb3VzZSBmdW5jdGlvbnMgdG8gdGhlCi1zcGVjaWZpZWQgcmFuZ2Ugb2YgdmFsdWVzLiBUaGlzIGlzIHVzZWQgd2hlbiBjaGFuZ2luZyBiZXR3ZWVuIGdyYXBoaWNzCi1tb2RlcyBzZXQgdGhlIHJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IGRpc3BsYXkgbW9kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZSgKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcykKLXsKLSAgICByYW5nZVggPSB4UmVzOwotICAgIHJhbmdlWSA9IHlSZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1Nb2RpZmVzIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcyBuZWNlc3NhcnkgaWYgc2NhbGluZyB0byBPUyBjb29yZGluYXRlcywKLWFuZCBzZXRzIHRoZSBPUyBtb3VzZSBjdXJzb3IgcG9zaXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX3NldE1vdXNlUG9zKHgseSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgotY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCi1hbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfcmVzdW1lKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgUU5YICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1TdXNwZW5kcyBhbGwgb2Ygb3VyIGV2ZW50IGhhbmRsaW5nIG9wZXJhdGlvbnMuIFRoaXMgaXMgYWxzbyB1c2VkIHRvCi1kZS1pbnN0YWxsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3N1c3BlbmQodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBRTlggKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUV4aXRzIHRoZSBldmVudCBtb2R1bGUgZm9yIHByb2dyYW0gdGVybWluYXRhdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9leGl0KHZvaWQpCi17Ci0jaWZkZWYgX19RTlhOVE9fXwotICAgIGNoYXIgICAgYzsKLSAgICBpbnQgZmxhZ3M7Ci0KLSAgICBpZiAoa2JkX2ZkICE9IC0xKSB7Ci0JY2xvc2Uoa2JkX2ZkKTsKLQlrYmRfZmQgPSAtMTsKLQl9Ci0gICAgaWYgKG1vdXNlX2ZkICE9IC0xKSB7Ci0JY2xvc2UobW91c2VfZmQpOwotCW1vdXNlX2ZkID0gLTE7Ci0JfQotI2VuZGlmCi0KLSAgICAvKiBSZXN0b3JlIHNpZ25hbCBoYW5kbGVycyAqLwotICAgIHNpZ25hbChTSUdBQlJULCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHRlBFLCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKLQotI2lmbmRlZiBfX1FOWE5UT19fCi0gICAgLyogS2lsbCB0aGUgSW5wdXQvTW91c2UgZHJpdmVyIGlmIHdlIGhhdmUgc3Bhd25lZCBpdCAqLwotICAgIGlmIChfUE1fbW91c2VfY3RsICE9IE5VTEwpIHsKLQlzdHJ1Y3QgX2ZkX2VudHJ5ICAgIGZkZTsKLQl1aW50ICAgICAgICAgICAgcGlkID0gMDsKLQotCS8qIEZpbmQgb3V0IHRoZSBwaWQgb2YgdGhlIG1vdXNlIGRyaXZlciAqLwotCWlmIChraWxsX3BpZCA+IDApIHsKLQkgICAgaWYgKHFueF9mZF9xdWVyeSgwLAotCQkwLCBfUE1fbW91c2VfY3RsLT5mZCwgJmZkZSkgIT0gLTEpCi0JCXBpZCA9IGZkZS5waWQ7Ci0JICAgIH0KLQltb3VzZV9jbG9zZShfUE1fbW91c2VfY3RsKTsKLQlfUE1fbW91c2VfY3RsID0gTlVMTDsKLQotCWlmIChwaWQgPiAwKSB7Ci0JICAgIC8qIEZvciBzb21lIHJlYXNvbnMgdGhlIFBJRCdzIGFyZSBkaWZmZXJlbnQgdW5kZXIgUU5YNCwKLQkgICAgICogc28gd2UgdXNlIHRoZSBvbGQgbWVjaGFuaXNtIHRvIGtpbGwgdGhlIG1vdXNlIHNlcnZlci4KLQkgICAgICovCi0JICAgIGtpbGwocGlkLCBTSUdURVJNKTsKLQkgICAga2lsbF9waWQgPSAwOwotCSAgICB9Ci0JfQotI2VuZGlmCi0gICAgaWYgKGtpbGxfcGlkID4gMCkgewotCWtpbGwoa2lsbF9waWQsIFNJR1RFUk0pOwotCWtpbGxfcGlkID0gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvbXRycnFueC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L210cnJxbnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk2MGM3NS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvbXRycnFueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFFOWAotKgotKiBEZXNjcmlwdGlvbjogIE1UUlIgaGVscGVyIGZ1bmN0aW9ucyBtb2R1bGUuIFRvIG1ha2UgaXQgZWFzaWVyIHRvIGltcGxlbWVudAotKiAgICAgICAgICAgICAgIHRoZSBNVFJSIHN1cHBvcnQgdW5kZXIgUU5YLCB3ZSBzaW1wbHkgcHV0IG91ciByaW5nIDAgaGVscGVyCi0qICAgICAgICAgICAgICAgZnVuY3Rpb25zIGludG8gc3R1YnMgdGhhdCBydW4gdGhlbSBhdCByaW5nIDAgdXNpbmcgd2hhdGV2ZXIKLSogICAgICAgICAgICAgICBtZWNoYW5pc20gaXMgYXZhaWxhYmxlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpZmRlZiBfX1FOWE5UT19fCi0jaW5jbHVkZSA8c3lzL25ldXRyaW5vLmg+Ci0jaW5jbHVkZSA8c3lzL3N5c3BhZ2UuaD4KLSNlbHNlCi0jaW5jbHVkZSA8aTg2Lmg+Ci0jaW5jbHVkZSA8c3lzL2lycWluZm8uaD4KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIFIwX0ZMVVNIX1RMQiAgICAwCi0jZGVmaW5lIFIwX1NBVkVfQ1I0ICAgICAxCi0jZGVmaW5lIFIwX1JFU1RPUkVfQ1I0ICAyCi0jZGVmaW5lIFIwX1JFQURfTVNSICAgICAzCi0jZGVmaW5lIFIwX1dSSVRFX01TUiAgICA0Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgICAgIHNlcnZpY2U7Ci0gICAgaW50ICAgICByZWc7Ci0gICAgdWxvbmcgICBlYXg7Ci0gICAgdWxvbmcgICBlZHg7Ci0gICAgfSBSMF9kYXRhOwotCi1leHRlcm4gdm9sYXRpbGUgUjBfZGF0YSBfUE1fUjA7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBfX1FOWE5UT19fCi1jb25zdCBzdHJ1Y3Qgc2lnZXZlbnQgKiBfQVNNQVBJIF9QTV9yaW5nMF9pc3Iodm9pZCAqYXJnLCBpbnQgaWQpOwotI2Vsc2UKLXBpZF90IGZhciBfQVNNQVBJIF9QTV9yaW5nMF9pc3IoKTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0cnVlIGlmIHJpbmcgMCAob3IgaWYgd2UgY2FuIGNhbGwgdGhlIGhlbHBlcnMgZnVuY3Rpb25zIGF0IHJpbmcgMCkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBfQVNNQVBJIF9NVFJSX2lzUmluZzAodm9pZCkKLXsKLSNpZmRlZiBfX1FOWE5UT19fCi0gICAgcmV0dXJuIGZhbHNlOyAgIC8qIE5vdCBpbXBsZW1lbnRlZCB5ZXQhICovCi0jZWxzZQotICAgIHJldHVybiB0cnVlOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZXhlY3V0ZSBhIHNlcnZpY2UgYXQgcmluZyAwLiBUaGlzIGlzIGRvbmUgdXNpbmcgdGhlIGNsb2NrCi1pbnRlcnJ1cHQgaGFuZGxlciBzaW5jZSB0aGUgY29kZSB3ZSBhdHRhY2ggdG8gaXQgd2lsbCBhbHdheXMgcnVuIGF0IHJpbmcgMC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBDYWxsUmluZzAodm9pZCkKLXsKLSNpZmRlZiBfX1FOWE5UT19fCi0gICAgdWludCAgICBjbG9ja19pbnRubyA9IFNZU1BBR0VfRU5UUlkocXRpbWUpLT5pbnRyOwotI2Vsc2UKLSAgICB1aW50ICAgIGNsb2NrX2ludG5vID0gMDsgICAgLyogY2xvY2sgaXJxICovCi0jZW5kaWYKLSAgICBpbnQgICAgIGludHJpZDsKLQotI2lmZGVmIF9fUU5YTlRPX18KLSAgICBtbG9jaygodm9pZCopJl9QTV9SMCwgc2l6ZW9mKF9QTV9SMCkpOwotICAgIFRocmVhZEN0bChfTlRPX1RDVExfSU8sIDApOwotI2VuZGlmCi0jaWZkZWYgX19RTlhOVE9fXwotICAgIGlmICgoaW50cmlkID0gSW50ZXJydXB0QXR0YWNoKF9OVE9fSU5UUl9DTEFTU19FWFRFUk5BTCB8IGNsb2NrX2ludG5vLAotCV9QTV9yaW5nMF9pc3IsICh2b2lkKikmX1BNX1IwLCBzaXplb2YoX1BNX1IwKSwgX05UT19JTlRSX0ZMQUdTX0VORCkpID09IC0xKSB7Ci0jZWxzZQotICAgIGlmICgoaW50cmlkID0gcW54X2hpbnRfYXR0YWNoKGNsb2NrX2ludG5vLCBfUE1fcmluZzBfaXNyLCBGUF9TRUcoJl9QTV9SMCkpKSA9PSAtMSkgewotI2VuZGlmCi0JcGVycm9yKCJBdHRhY2giKTsKLQlleGl0KC0xKTsKLQl9Ci0gICAgd2hpbGUgKF9QTV9SMC5zZXJ2aWNlICE9IC0xKQotCTsKLSNpZmRlZiBfX1FOWE5UT19fCi0gICAgSW50ZXJydXB0RGV0YWNoSWQoaW50cmlkKTsKLSNlbHNlCi0gICAgcW54X2hpbnRfZGV0YWNoKGludHJpZCk7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GbHVzaCB0aGUgdHJhbnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZsdXNoVExCKHZvaWQpCi17Ci0gICAgX1BNX1IwLnNlcnZpY2UgPSBSMF9GTFVTSF9UTEI7Ci0gICAgQ2FsbFJpbmcwKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgQ1I0IHJlZ2lzdGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX0FTTUFQSSBfTVRSUl9zYXZlQ1I0KHZvaWQpCi17Ci0gICAgX1BNX1IwLnNlcnZpY2UgPSBSMF9TQVZFX0NSNDsKLSAgICBDYWxsUmluZzAoKTsKLSAgICByZXR1cm4gX1BNX1IwLnJlZzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgQ1I0IHJlZ2lzdGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfQVNNQVBJIF9NVFJSX3Jlc3RvcmVDUjQodWxvbmcgY3I0VmFsKQotewotICAgIF9QTV9SMC5zZXJ2aWNlID0gUjBfUkVTVE9SRV9DUjQ7Ci0gICAgX1BNX1IwLnJlZyA9IGNyNFZhbDsKLSAgICBDYWxsUmluZzAoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIGEgbWFjaGluZSBzdGF0dXMgcmVnaXN0ZXIgZm9yIHRoZSBDUFUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfQVNNQVBJIF9NVFJSX3JlYWRNU1IoCi0gICAgaW50IHJlZywKLSAgICB1bG9uZyAqZWF4LAotICAgIHVsb25nICplZHgpCi17Ci0gICAgX1BNX1IwLnNlcnZpY2UgPSBSMF9SRUFEX01TUjsKLSAgICBfUE1fUjAucmVnID0gcmVnOwotICAgIENhbGxSaW5nMCgpOwotICAgICplYXggPSBfUE1fUjAuZWF4OwotICAgICplZHggPSBfUE1fUjAuZWR4OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVdyaXRlIGEgbWFjaGluZSBzdGF0dXMgcmVnaXN0ZXIgZm9yIHRoZSBDUFUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfQVNNQVBJIF9NVFJSX3dyaXRlTVNSKAotICAgIGludCByZWcsCi0gICAgdWxvbmcgZWF4LAotICAgIHVsb25nIGVkeCkKLXsKLSAgICBfUE1fUjAuc2VydmljZSA9IFIwX1dSSVRFX01TUjsKLSAgICBfUE1fUjAucmVnID0gcmVnOwotICAgIF9QTV9SMC5lYXggPSBlYXg7Ci0gICAgX1BNX1IwLmVkeCA9IGVkeDsKLSAgICBDYWxsUmluZzAoKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L29zaGRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjExOTMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFFOWAotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaWZuZGVmIF9fUU5YTlRPX18KLSNpbmNsdWRlIDxzeXMvbW91c2UuaD4KLSNpbmNsdWRlIDxzeXMva2V5Ym9hcmQuaD4KLSNpbmNsdWRlIDxzeXMvZmQuaD4KLSNpbmNsdWRlIDxjb25pby5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvZGNtZF9pbnB1dC5oPgotCi0vKiBUaGluZ3MgJ2JvcnJvd2VkJyBmcm9tIHBob3Rvbi9rZXljb2Rlcy5oICovCi0KLS8qCi0gKiBLZXlib2FyZCBtb2RpZmllcnMKLSAqLwotI2RlZmluZSBLRVlNT0RCSVRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgS0VZTU9EQklUX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEtFWU1PREJJVF9BTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBLRVlNT0RCSVRfQUxUR1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgS0VZTU9EQklUX1NITDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIEtFWU1PREJJVF9NT0Q2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBLRVlNT0RCSVRfTU9ENyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgS0VZTU9EQklUX01PRDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3Ci0KLSNkZWZpbmUgS0VZTU9EQklUX1NISUZUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIEtFWU1PREJJVF9DVFJMX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOQotI2RlZmluZSBLRVlNT0RCSVRfQUxUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCi0jZGVmaW5lIEtFWU1PREJJVF9BTFRHUl9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKLSNkZWZpbmUgS0VZTU9EQklUX1NITDNfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMgotI2RlZmluZSBLRVlNT0RCSVRfTU9ENl9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIEtFWU1PREJJVF9NT0Q3X0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgS0VZTU9EQklUX01PRDhfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQotCi0jZGVmaW5lIEtFWU1PREJJVF9DQVBTX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgS0VZTU9EQklUX05VTV9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNwotI2RlZmluZSBLRVlNT0RCSVRfU0NST0xMX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4Ci0KLSNkZWZpbmUgS0VZTU9EX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfU0hJRlQpCi0jZGVmaW5lIEtFWU1PRF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX0NUUkwpCi0jZGVmaW5lIEtFWU1PRF9BTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX0FMVCkKLSNkZWZpbmUgS0VZTU9EX0FMVEdSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfQUxUR1IpCi0jZGVmaW5lIEtFWU1PRF9TSEwzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX1NITDMpCi0jZGVmaW5lIEtFWU1PRF9NT0Q2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX01PRDYpCi0jZGVmaW5lIEtFWU1PRF9NT0Q3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX01PRDcpCi0jZGVmaW5lIEtFWU1PRF9NT0Q4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX01PRDgpCi0KLSNkZWZpbmUgS0VZTU9EX1NISUZUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfU0hJRlRfTE9DSykKLSNkZWZpbmUgS0VZTU9EX0NUUkxfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfQ1RSTF9MT0NLKQotI2RlZmluZSBLRVlNT0RfQUxUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9BTFRfTE9DSykKLSNkZWZpbmUgS0VZTU9EX0FMVEdSX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfQUxUR1JfTE9DSykKLSNkZWZpbmUgS0VZTU9EX1NITDNfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfU0hMM19MT0NLKQotI2RlZmluZSBLRVlNT0RfTU9ENl9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9NT0Q2X0xPQ0spCi0jZGVmaW5lIEtFWU1PRF9NT0Q3X0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX01PRDdfTE9DSykKLSNkZWZpbmUgS0VZTU9EX01PRDhfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfTU9EOF9MT0NLKQotCi0jZGVmaW5lIEtFWU1PRF9DQVBTX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX0NBUFNfTE9DSykKLSNkZWZpbmUgS0VZTU9EX05VTV9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfTlVNX0xPQ0spCi0jZGVmaW5lIEtFWU1PRF9TQ1JPTExfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX1NDUk9MTF9MT0NLKQotCi0vKgotICogS2V5Ym9hcmQgZmxhZ3MKLSAqLwotI2RlZmluZSBLRVlfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgICAvKiBLZXkgd2FzIHByZXNzZWQgZG93biAqLwotI2RlZmluZSBLRVlfUkVQRUFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgICAvKiBLZXkgd2FzIHJlcGVhdGVkICovCi0jZGVmaW5lIEtFWV9TQ0FOX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMCAgICAgIC8qIFNjYW5jb2RlIGlzIHZhbGlkICovCi0jZGVmaW5lIEtFWV9TWU1fVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MCAgICAgIC8qIEtleSBzeW1ib2wgaXMgdmFsaWQgKi8KLSNkZWZpbmUgS0VZX0NBUF9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwICAgICAgLyogS2V5IGNhcCBpcyB2YWxpZCAqLwotI2RlZmluZSBLRVlfREVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAgICAgICAvKiBLZXkgc3ltYm9sIGlzIGEgREVBRCBrZXkgKi8KLSNkZWZpbmUgS0VZX09FTV9DQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwICAgICAgLyogS2V5IGNhcCBpcyBhbiBPRU0gc2NhbiBjb2RlIGZyb20ga2V5Ym9hcmQgKi8KLQotI2VuZGlmICAvKiBfX1FOWE5UT19fICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9wbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTkzZWUwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9wbS5jCisrKyAvZGV2L251bGwKQEAgLTEsODkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFFOWAotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAotKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQotKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKLSogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAotKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCi0jaW5jbHVkZSAibXRyci5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHRlcm1pb3MuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSAicW54L3ZiaW9zLmgiCi0jaWZuZGVmIF9fUU5YTlRPX18KLSNpbmNsdWRlIDxzeXMvc2VnaW5mby5oPgotI2luY2x1ZGUgPHN5cy9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8Y29uaW8uaD4KLSNpbmNsdWRlIDxpODYuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3lzL25ldXRyaW5vLmg+Ci0jaW5jbHVkZSA8c3lzL2RjbWRfY2hyLmg+Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHVpbnQgVkVTQUJ1Zl9sZW4gPSAxMDI0OyAgICAgLyogTGVuZ3RoIG9mIHRoZSBWRVNBQnVmIGJ1ZmZlciAgICAgKi8KLXN0YXRpYyB2b2lkICpWRVNBQnVmX3B0ciA9IE5VTEw7ICAgIC8qIE5lYXIgcG9pbnRlciB0byBWRVNBQnVmICAgICAgICAgICovCi1zdGF0aWMgdWludCBWRVNBQnVmX3JzZWc7ICAgICAgICAgICAvKiBSZWFsIG1vZGUgc2VnbWVudCBvZiBWRVNBQnVmICAgICAqLwotc3RhdGljIHVpbnQgVkVTQUJ1Zl9yb2ZmOyAgICAgICAgICAgLyogUmVhbCBtb2RlIG9mZnNldCBvZiBWRVNBQnVmICAgICAgKi8KLXN0YXRpYyBWQklPU3JlZ3NfdCAgKlZSZWdzID0gTlVMTDsgIC8qIFBvaW50ZXIgdG8gVkJJT1MgcmVnaXN0ZXJzICAgICAgICovCi1zdGF0aWMgaW50IHJhd19jb3VudCA9IDA7Ci1zdGF0aWMgc3RydWN0IF9jb25zb2xlX2N0cmwgKmNjID0gTlVMTDsKLXN0YXRpYyBpbnQgY29uc29sZV9jb3VudCA9IDA7Ci1zdGF0aWMgaW50IHJtYnVmX2ludXNlID0gMDsKLQotc3RhdGljIHZvaWQgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKLXsKLSAgICBjaGFyICpmb3JjZTsKLQotICAgIGlmIChWUmVncyA9PSBOVUxMKSB7Ci0jaWZkZWYgIF9fUU5YTlRPX18KLQlUaHJlYWRDdGwoX05UT19UQ1RMX0lPLCAwKTsgLyogR2V0IElPIHByaXZpbGlkZ2UgKi8KLSNlbmRpZgotCWZvcmNlID0gZ2V0ZW52KCJWQklPU19NRVRIT0QiKTsKLQlWUmVncyA9IFZCSU9TaW5pdChmb3JjZSA/IGF0b2koZm9yY2UpIDogMCk7Ci0JfQotI2lmbmRlZiAgX19RTlhOVE9fXwotICAgIE1UUlJfaW5pdCgpOwotI2VuZGlmCi19Ci0KLWlib29sIFBNQVBJIFBNX2hhdmVCSU9TQWNjZXNzKHZvaWQpCi17IHJldHVybiBWUmVncyAhPSBOVUxMOyB9Ci0KLWxvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCi17IHJldHVybiBfT1NfUU5YOyB9Ci0KLWludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQoteyByZXR1cm4gUE1fMzg2OyB9Ci0KLXZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKGNoYXIgKnMpCi17Ci0gICAgdWludCBwb3MgPSBzdHJsZW4ocyk7Ci0gICAgaWYgKHNbcG9zLTFdICE9ICcvJykgewotCXNbcG9zXSA9ICcvJzsKLQlzW3BvcysxXSA9ICdcMCc7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAotICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKLXsKLSAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcihjb25zdCBjaGFyICptc2cpCi17Ci0gICAgaWYgKGZhdGFsRXJyb3JDbGVhbnVwKQotCWZhdGFsRXJyb3JDbGVhbnVwKCk7Ci0gICAgZnByaW50ZihzdGRlcnIsIiVzXG4iLCBtc2cpOwotICAgIGV4aXQoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEV4aXRWQkVCdWYodm9pZCkKLXsKLSAgICBpZiAoVkVTQUJ1Zl9wdHIpCi0JUE1fZnJlZVJlYWxTZWcoVkVTQUJ1Zl9wdHIpOwotICAgIFZFU0FCdWZfcHRyID0gMDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYodWludCAqbGVuLHVpbnQgKnJzZWcsdWludCAqcm9mZikKLXsKLSAgICBpZiAoIVZFU0FCdWZfcHRyKSB7Ci0JLyogQWxsb2NhdGUgYSBnbG9iYWwgYnVmZmVyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIFZFU0EgVkJFICovCi0JaWYgKChWRVNBQnVmX3B0ciA9IFBNX2FsbG9jUmVhbFNlZyhWRVNBQnVmX2xlbiwgJlZFU0FCdWZfcnNlZywgJlZFU0FCdWZfcm9mZikpID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCWF0ZXhpdChFeGl0VkJFQnVmKTsKLQl9Ci0gICAgKmxlbiA9IFZFU0FCdWZfbGVuOwotICAgICpyc2VnID0gVkVTQUJ1Zl9yc2VnOwotICAgICpyb2ZmID0gVkVTQUJ1Zl9yb2ZmOwotICAgIHJldHVybiBWRVNBQnVmX3B0cjsKLX0KLQotc3RhdGljIGludCB0ZXJtX3Jhdyh2b2lkKQotewotICAgIHN0cnVjdCB0ZXJtaW9zICB0ZXJtaW9zX3A7Ci0KLSAgICBpZiAocmF3X2NvdW50KysgPiAwKQotCXJldHVybiAwOwotCi0gICAgLyogR28gaW50byAicmF3IiBpbnB1dCBtb2RlICovCi0gICAgaWYgKHRjZ2V0YXR0cihTVERJTl9GSUxFTk8sICZ0ZXJtaW9zX3ApKQotCXJldHVybiAtMTsKLQotICAgIHRlcm1pb3NfcC5jX2NjW1ZNSU5dID0gIDE7Ci0gICAgdGVybWlvc19wLmNfY2NbVlRJTUVdID0gIDA7Ci0gICAgdGVybWlvc19wLmNfbGZsYWcgJj0gfiggRUNIT3xJQ0FOT058SVNJR3xFQ0hPRXxFQ0hPS3xFQ0hPTkwpOwotICAgIHRjc2V0YXR0cihTVERJTl9GSUxFTk8sIFRDU0FEUkFJTiwgJnRlcm1pb3NfcCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHRlcm1fcmVzdG9yZSh2b2lkKQotewotICAgIHN0cnVjdCB0ZXJtaW9zICB0ZXJtaW9zX3A7Ci0KLSAgICBpZiAocmF3X2NvdW50LS0gIT0gMSkKLQlyZXR1cm47Ci0KLSAgICB0Y2dldGF0dHIoU1RESU5fRklMRU5PLCAmdGVybWlvc19wKTsKLSAgICB0ZXJtaW9zX3AuY19sZmxhZyB8PSAoRUNIT3xJQ0FOT058SVNJR3xFQ0hPRXxFQ0hPS3xFQ0hPTkwpOwotICAgIHRlcm1pb3NfcC5jX29mbGFnIHw9IChPUE9TVCk7Ci0gICAgdGNzZXRhdHRyKFNURElOX0ZJTEVOTywgVENTQURSQUlOLCAmdGVybWlvc19wKTsKLX0KLQotaW50IFBNQVBJIFBNX2tiaGl0KHZvaWQpCi17Ci0gICAgaW50IGJsb2NraW5nLCBjOwotCi0gICAgaWYgKHRlcm1fcmF3KCkgPT0gLTEpCi0JcmV0dXJuIDA7Ci0KLSAgICAvKiBHbyBpbnRvIG5vbiBibG9ja2luZyBtb2RlICovCi0gICAgYmxvY2tpbmcgPSBmY250bChTVERJTl9GSUxFTk8sIEZfR0VURkwpIHwgT19OT05CTE9DSzsKLSAgICBmY250bChTVERJTl9GSUxFTk8sIEZfU0VURkwsIGJsb2NraW5nKTsKLSAgICBjID0gZ2V0YyhzdGRpbik7Ci0KLSAgICAvKiByZXN0b3JlIGJsb2NraW5nIG1vZGUgKi8KLSAgICBmY250bChTVERJTl9GSUxFTk8sIEZfU0VURkwsIGJsb2NraW5nICYgfk9fTk9OQkxPQ0spOwotICAgIHRlcm1fcmVzdG9yZSgpOwotICAgIGlmIChjICE9IEVPRikgewotCXVuZ2V0YyhjLCBzdGRpbik7Ci0JcmV0dXJuIGM7Ci0JfQotICAgIGNsZWFyZXJyKHN0ZGluKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFBNQVBJIFBNX2dldGNoKHZvaWQpCi17Ci0gICAgaW50IGM7Ci0KLSAgICBpZiAodGVybV9yYXcoKSA9PSAtMSkKLQlyZXR1cm4gKDApOwotICAgIGMgPSBnZXRjKHN0ZGluKTsKLSNpZiBkZWZpbmVkKF9fUU5YX18pICYmICFkZWZpbmVkKF9fUU5YTlRPX18pCi0gICAgaWYgKGMgPT0gMHhBKQotCWMgPSAweDBEOwotICAgIGVsc2UgaWYgKGMgPT0gMHg3RikKLQljID0gMHgwODsKLSNlbmRpZgotICAgIHRlcm1fcmVzdG9yZSgpOwotICAgIHJldHVybiBjOwotfQotCi1QTV9IV05EIFBNQVBJIFBNX29wZW5Db25zb2xlKAotICAgIFBNX0hXTkQgaHduZFVzZXIsCi0gICAgaW50IGRldmljZSwKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcywKLSAgICBpbnQgYnBwLAotICAgIGlib29sIGZ1bGxTY3JlZW4pCi17Ci0jaWZuZGVmIF9fUU5YTlRPX18KLSAgICBpbnQgZmQ7Ci0KLSAgICBpZiAoY29uc29sZV9jb3VudCsrKQotCXJldHVybiAwOwotICAgIGlmICgoZmQgPSBvcGVuKCIvZGV2L2NvbjEiLCBPX1JEV1IpKSA9PSAtMSkKLQlyZXR1cm4gLTE7Ci0gICAgY2MgPSBjb25zb2xlX29wZW4oZmQsIE9fUkRXUik7Ci0gICAgY2xvc2UoZmQpOwotICAgIGlmIChjYyA9PSBOVUxMKQotCXJldHVybiAtMTsKLSNlbmRpZgotICAgIHJldHVybiAxOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSh2b2lkKQotewotICAgIHJldHVybiBQTV9nZXRWR0FTdGF0ZVNpemUoKSArIHNpemVvZihpbnQpICogMzsKLX0KLQotdm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKHZvaWQgKnN0YXRlQnVmLGludCBjb25zb2xlX2lkKQotewotI2lmZGVmIF9fUU5YTlRPX18KLSAgICBpbnQgICAgIGZkOwotICAgIGludCAgICAgZmxhZ3M7Ci0KLSAgICBpZiAoKGZkID0gb3BlbigiL2Rldi9jb24xIiwgT19SRFdSKSkgPT0gLTEpCi0JcmV0dXJuOwotICAgIGZsYWdzID0gX0NPTkNUTF9JTlZJU0lCTEVfQ0hHIHwgX0NPTkNUTF9JTlZJU0lCTEU7Ci0gICAgZGV2Y3RsKGZkLCBEQ01EX0NIUl9TRVJDVEwsICZmbGFncywgc2l6ZW9mIGZsYWdzLCAwKTsKLSAgICBjbG9zZShmZCk7Ci0jZWxzZQotICAgIHVjaGFyICAgKmJ1ZiA9ICYoKHVjaGFyKilzdGF0ZUJ1ZilbUE1fZ2V0VkdBU3RhdGVTaXplKCldOwotCi0gICAgLyogU2F2ZSBRTlggNCBjb25zb2xlIHN0YXRlICovCi0gICAgY29uc29sZV9yZWFkKGNjLCAtMSwgMCwgTlVMTCwgMCwKLQkoaW50ICopYnVmKzEsIChpbnQgKilidWYrMiwgTlVMTCk7Ci0gICAgKihpbnQgKilidWYgPSBjb25zb2xlX2N0cmwoY2MsIC0xLAotCUNPTlNPTEVfTk9SRVNJWkUgfCBDT05TT0xFX05PU1dJVENIIHwgQ09OU09MRV9JTlZJU0lCTEUsCi0JQ09OU09MRV9OT1JFU0laRSB8IENPTlNPTEVfTk9TV0lUQ0ggfCBDT05TT0xFX0lOVklTSUJMRSk7Ci0KLSAgICAvKiBTYXZlIHN0YXRlIG9mIFZHQSByZWdpc3RlcnMgKi8KLSAgICBQTV9zYXZlVkdBU3RhdGUoc3RhdGVCdWYpOwotI2VuZGlmCi19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKGludCAoX0FTTUFQSVAgc2F2ZVN0YXRlKShpbnQgZmxhZ3MpKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCBzdXBwb3J0IGZvciBjb25zb2xlIHN3aXRjaGluZyBpZiBwb3NzaWJsZSAqLwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoY29uc3Qgdm9pZCAqc3RhdGVCdWYsUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSNpZmRlZiBfX1FOWE5UT19fCi0gICAgaW50ICAgICBmZDsKLSAgICBpbnQgICAgIGZsYWdzOwotCi0gICAgaWYgKChmZCA9IG9wZW4oIi9kZXYvY29uMSIsIE9fUkRXUikpID09IC0xKQotCXJldHVybjsKLSAgICBmbGFncyA9IF9DT05DVExfSU5WSVNJQkxFX0NIRzsKLSAgICBkZXZjdGwoZmQsIERDTURfQ0hSX1NFUkNUTCwgJmZsYWdzLCBzaXplb2YgZmxhZ3MsIDApOwotICAgIGNsb3NlKGZkKTsKLSNlbHNlCi0gICAgdWNoYXIgICAqYnVmID0gJigodWNoYXIqKXN0YXRlQnVmKVtQTV9nZXRWR0FTdGF0ZVNpemUoKV07Ci0KLSAgICAvKiBSZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgVkdBIGNvbXBhdGlibGUgcmVnaXN0ZXJzICovCi0gICAgUE1fcmVzdG9yZVZHQVN0YXRlKHN0YXRlQnVmKTsKLQotICAgIC8qIFJlc3RvcmUgUU5YIDQgY29uc29sZSBzdGF0ZSAqLwotICAgIGNvbnNvbGVfY3RybChjYywgLTEsICooaW50ICopYnVmLAotCUNPTlNPTEVfTk9SRVNJWkUgfCBDT05TT0xFX05PU1dJVENIIHwgQ09OU09MRV9JTlZJU0lCTEUpOwotICAgIGNvbnNvbGVfd3JpdGUoY2MsIC0xLCAwLCBOVUxMLCAwLAotCShpbnQgKilidWYrMSwgKGludCAqKWJ1ZisyLCBOVUxMKTsKLSNlbmRpZgotfQotCi12b2lkIFBNQVBJIFBNX2Nsb3NlQ29uc29sZShQTV9IV05EIGh3bmRDb25zb2xlKQotewotI2lmbmRlZiBfX1FOWE5UT19fCi0gICAgaWYgKC0tY29uc29sZV9jb3VudCA9PSAwKSB7Ci0JY29uc29sZV9jbG9zZShjYyk7Ci0JY2MgPSBOVUxMOwotCX0KLSNlbmRpZgotfQotCi12b2lkIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24oaW50IHgsaW50IHkpCi17Ci0gICAgaWYgKCFjYykKLQlyZXR1cm47Ci0jaWZuZGVmIF9fUU5YTlRPX18KLSAgICBjb25zb2xlX3dyaXRlKGNjLCAtMSwgMCwgTlVMTCwgMCwgJnksICZ4LCBOVUxMKTsKLSNlbmRpZgotfQotCi12b2lkIFBNX3NldE9TU2NyZWVuV2lkdGgoaW50IHdpZHRoLGludCBoZWlnaHQpCi17Ci19Ci0KLWlib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKFBNX2ludEhhbmRsZXIgaWgsIGludCBmcmVxdWVuY3kpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIFFOWCAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGludCBmcmVxdWVuY3kpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIFFOWCAqLwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBRTlggKi8KLX0KLQotY2hhciAqIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKAotICAgIGNoYXIgKnBhdGgsCi0gICAgaW50IG1heExlbikKLXsKLSAgICByZXR1cm4gZ2V0Y3dkKHBhdGgsbWF4TGVuKTsKLX0KLQotY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKLXsgcmV0dXJuICcvJzsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCi17IHJldHVybiBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCgpOyB9Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQotewotICAgIGNoYXIgKmVudiA9IGdldGVudigiTlVDTEVVU19QQVRIIik7Ci0jaWZkZWYgX19RTlhOVE9fXwotI2lmZGVmIF9fWDg2X18KLSAgICByZXR1cm4gZW52ID8gZW52IDogIi9udG8vc2NpdGVjaC94ODYvYmluIjsKLSNlbGlmIGRlZmluZWQgKF9fUFBDX18pCi0gICAgcmV0dXJuIGVudiA/IGVudiA6ICIvbnRvL3NjaXRlY2gvcHBjYmUvYmluIjsKLSNlbGlmIGRlZmluZWQgKF9fTUlQU19fKQotI2lmZGVmIF9fQklHRU5ESUFOX18KLSAgICByZXR1cm4gZW52ID8gZW52IDogIi9udG8vc2NpdGVjaC9taXBzYmUvYmluIjsKLSNlbHNlCi0gICAgcmV0dXJuIGVudiA/IGVudiA6ICIvbnRvL3NjaXRlY2gvbWlwc2xlL2JpbiI7Ci0jZW5kaWYKLSNlbGlmIGRlZmluZWQgKF9fU0hfXykKLSNpZmRlZiBfX0JJR0VORElBTl9fCi0gICAgcmV0dXJuIGVudiA/IGVudiA6ICIvbnRvL3NjaXRlY2gvc2hiZS9iaW4iOwotI2Vsc2UKLSAgICByZXR1cm4gZW52ID8gZW52IDogIi9udG8vc2NpdGVjaC9zaGxlL2JpbiI7Ci0jZW5kaWYKLSNlbGlmIGRlZmluZWQgKF9fQVJNX18pCi0gICAgcmV0dXJuIGVudiA/IGVudiA6ICIvbnRvL3NjaXRlY2gvYXJtbGUvYmluIjsKLSNlbmRpZgotI2Vsc2UgICAvKiBRTlggNCAqLwotICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL3FueDQvc2NpdGVjaC9iaW4iOwotI2VuZGlmCi19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbNTEyXTsKLSAgICBjaGFyICAgICAgICAqZW52OwotI2lmZGVmIF9fUU5YTlRPX18KLSAgICBjaGFyIHRlbXBbNjRdOwotICAgIGdldGhvc3RuYW1lKHRlbXAsIHNpemVvZiAodGVtcCkpOwotICAgIHRlbXBbc2l6ZW9mICh0ZW1wKSAtIDFdID0gJ1wwJzsgICAgIC8qIFBhcmFub2lkICovCi0gICAgc3ByaW50ZihwYXRoLCIvZXRjL2NvbmZpZy9zY2l0ZWNoLyVzL2NvbmZpZyIsIHRlbXApOwotI2Vsc2UKLSAgICBzcHJpbnRmKHBhdGgsIi9ldGMvY29uZmlnL3NjaXRlY2gvJWQvY29uZmlnIiwgZ2V0bmlkKCkpOwotI2VuZGlmCi0gICAgaWYgKChlbnYgPSBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpKSAhPSBOVUxMKSB7Ci0Jc3RyY3B5KHBhdGgsZW52KTsKLQlQTV9iYWNrc2xhc2gocGF0aCk7Ci0Jc3RyY2F0KHBhdGgsImNvbmZpZyIpOwotCX0KLSAgICByZXR1cm4gcGF0aDsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgYnVmWzEyOF07Ci0jaWZkZWYgX19RTlhOVE9fXwotICAgIGdldGhvc3RuYW1lKGJ1Ziwgc2l6ZW9mIChidWYpKTsKLSNlbHNlCi0gICAgc3ByaW50ZihidWYsIm5vZGUlZCIsIGdldG5pZCgpKTsKLSNlbmRpZgotICAgIHJldHVybiBidWY7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMjhdOwotI2lmZGVmIF9fUU5YTlRPX18KLSAgICBnZXRob3N0bmFtZShidWYsIHNpemVvZiAoYnVmKSk7Ci0jZWxzZQotICAgIHNwcmludGYoYnVmLCJub2RlJWQiLCBnZXRuaWQoKSk7Ci0jZW5kaWYKLSAgICByZXR1cm4gYnVmOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsKLSAgICByZXR1cm4gUE1fbWFwUmVhbFBvaW50ZXIoMCwgMHg0MDApOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCi17Ci0gICAgc3RhdGljIHZvaWQgKnB0ciA9IE5VTEw7Ci0gICAgdm9pZCAqZnJlZXB0cjsKLSAgICB1bnNpZ25lZCBvZmZzZXQsIGksIG1hcGxlbjsKLQotICAgIGlmIChwdHIgIT0gTlVMTCkKLQlyZXR1cm4gcHRyOwotCi0gICAgLyogU29tZSB0cmlja2VyeSBpcyByZXF1aXJlZCB0byBnZXQgdGhlIGxpbmVhciBhZGRyZXNzIDY0SyBhbGlnbmVkICovCi0gICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotCXB0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLDB4RkZGRix0cnVlKTsKLQlvZmZzZXQgPSAweDEwMDAwIC0gKCh1bnNpZ25lZClwdHIgJSAweDEwMDAwKTsKLQlpZiAoIW9mZnNldCkKLQkgICAgYnJlYWs7Ci0JbXVubWFwKHB0ciwgMHgxMDAwMCk7Ci0JbWFwbGVuID0gMHgxMDAwMCArIG9mZnNldDsKLQlmcmVlcHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAtb2Zmc2V0LCBtYXBsZW4tMSx0cnVlKTsKLQlwdHIgPSAodm9pZCAqKShvZmZzZXQgKyAodW5zaWduZWQpZnJlZXB0cik7Ci0JaWYgKDB4MTAwMDAgLSAoKHVuc2lnbmVkKXB0ciAlIDB4MTAwMDApKQotCSAgICBicmVhazsKLQltdW5tYXAoZnJlZXB0ciwgbWFwbGVuKTsKLQl9Ci0gICAgaWYgKGkgPT0gNSkgewotCXByaW50ZigiQ291bGQgbm90IGdldCBhIDY0SyBhbGlnbmVkIGxpbmVhciBhZGRyZXNzIGZvciBBMDAwMCByZWdpb25cbiIpOwotCWV4aXQoMSk7Ci0JfQotICAgIHJldHVybiBwdHI7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCxpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICB1Y2hhcl90ICpwOwotICAgIHVuc2lnbmVkIG87Ci0gICAgdW5zaWduZWQgcHJvdCA9IFBST1RfUkVBRHxQUk9UX1dSSVRFfChpc0NhY2hlZD8wOlBST1RfTk9DQUNIRSk7Ci0jaWZkZWYgX19QQUdFU0laRQotICAgIGludCBwYWdlc2l6ZSA9IF9fUEFHRVNJWkU7Ci0jZWxzZQotICAgIGludCBwYWdlc2l6ZSA9IDQwOTY7Ci0jZW5kaWYKLSAgICBpbnQgcm91bmRkb3duID0gYmFzZSAlIHBhZ2VzaXplOwotI2lmbmRlZiBfX1FOWE5UT19fCi0gICAgc3RhdGljIGludCBfX1ZpZEZEID0gLTE7Ci0jZW5kaWYKLQotICAgIGlmIChyb3VuZGRvd24pIHsKLQlpZiAoYmFzZSA8IHJvdW5kZG93bikKLQkgICAgcmV0dXJuIE5VTEw7Ci0JYmFzZSAtPSByb3VuZGRvd247Ci0JbGltaXQgKz0gcm91bmRkb3duOwotCX0KLQotI2lmbmRlZiBfX1FOWE5UT19fCi0gICAgaWYgKF9fVmlkRkQgPCAwKSB7Ci0JaWYgKChfX1ZpZEZEID0gc2htX29wZW4oICJQaHlzaWNhbCIsIE9fUkRXUiwgMDc3NyApKSA9PSAtMSkgewotCSAgICBwZXJyb3IoICJDYW5ub3Qgb3BlbiBQaHlzaWNhbCBtZW1vcnkiICk7Ci0JICAgIGV4aXQoMSk7Ci0JICAgIH0KLQl9Ci0gICAgbyA9IGJhc2UgJiAweEZGRjsKLSAgICBsaW1pdCA9IChsaW1pdCArIG8gKyAweEZGRikgJiB+MHhGRkY7Ci0gICAgaWYgKChpbnQpKHAgPSBtbWFwKCAwLCBsaW1pdCwgcHJvdCwgTUFQX1NIQVJFRCwKLQkgICAgX19WaWRGRCwgYmFzZSApKSA9PSAtMSApIHsKLQlyZXR1cm4gTlVMTDsKLQl9Ci0gICAgcCArPSBvOwotI2Vsc2UKLSAgICBpZiAoKHAgPSBtbWFwKDAsIGxpbWl0LCBwcm90LCBNQVBfUEhZUyB8IE1BUF9TSEFSRUQsCi0JICAgIE5PRkQsIGJhc2UpKSA9PSBNQVBfRkFJTEVEKSB7Ci0JcmV0dXJuICh2b2lkICopLTE7Ci0JfQotI2VuZGlmCi0gICAgcmV0dXJuIChwICsgcm91bmRkb3duKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKLXsKLSAgICBtdW5tYXAocHRyLGxpbWl0KzEpOwotfQotCi11bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyICovCi0gICAgLyogICAgICAgYWRkcmVzcy4gKi8KLSAgICByZXR1cm4gMHhGRkZGRkZGRlVMOwotfQotCi1pYm9vbCBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHJSYW5nZSgKLSAgICB2b2lkICpwLAotICAgIHVsb25nIGxlbmd0aCwKLSAgICB1bG9uZyAqcGh5c0FkZHJlc3MpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFBNQVBJIFBNX3NsZWVwKHVsb25nIG1pbGxpc2Vjb25kcykKLXsKLSAgICAvKiBUT0RPOiBQdXQgdGhlIHByb2Nlc3MgdG8gc2xlZXAgZm9yIG1pbGxpc2Vjb25kcyAqLwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0Y4OwotCWNhc2UgMTogcmV0dXJuIDB4MkY4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNCQzsKLQljYXNlIDE6IHJldHVybiAweDM3ODsKLQljYXNlIDI6IHJldHVybiAweDI3ODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYWxsb2NTaGFyZWQobG9uZyBzaXplKQotewotICAgIHJldHVybiBQTV9tYWxsb2Moc2l6ZSk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCh2b2lkICpwdHIpCi17Ci0gICAgUE1fZnJlZShwdHIpOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKHZvaWQgKmJhc2UsdWxvbmcgbGltaXQpCi17IHJldHVybiAodm9pZCopYmFzZTsgfQotCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIodWludCByX3NlZyx1aW50IHJfb2ZmKQotewotICAgIHZvaWQgKnA7Ci0KLSAgICBQTV9pbml0KCk7Ci0KLSAgICBpZiAoKHAgPSBWQklPU2dldG1lbXB0cihyX3NlZywgcl9vZmYsIFZSZWdzKSkgPT0gKHZvaWQgKiktMSkKLQlyZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gcDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZyh1aW50IHNpemUsdWludCAqcl9zZWcsdWludCAqcl9vZmYpCi17Ci0gICAgaWYgKHNpemUgPiAxMDI0KSB7Ci0JcHJpbnRmKCJQTV9hbGxvY1JlYWxTZWc6IGNhbid0IGhhbmRsZSAlZCBieXRlc1xuIiwgc2l6ZSk7Ci0JcmV0dXJuIDA7Ci0JfQotICAgIGlmIChybWJ1Zl9pbnVzZSAhPSAwKSB7Ci0JcHJpbnRmKCJQTV9hbGxvY1JlYWxTZWc6IHRyYW5zZmVyIGFyZWEgYWxyZWFkeSBpbiB1c2VcbiIpOwotCXJldHVybiAwOwotCX0KLSAgICBQTV9pbml0KCk7Ci0gICAgcm1idWZfaW51c2UgPSAxOwotICAgICpyX3NlZyA9IFZCSU9TX1RyYW5zQnVmVlNlZyhWUmVncyk7Ci0gICAgKnJfb2ZmID0gVkJJT1NfVHJhbnNCdWZWT2ZmKFZSZWdzKTsKLSAgICByZXR1cm4gKHZvaWQqKVZCSU9TX1RyYW5zQnVmUHRyKFZSZWdzKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCi17Ci0gICAgaWYgKHJtYnVmX2ludXNlID09IDApIHsKLQlwcmludGYoIlBNX2ZyZWVSZWFsU2VnOiBub3RoaW5nIHdhcyBhbGxvY2F0ZWRcbiIpOwotCXJldHVybjsKLQl9Ci0gICAgcm1idWZfaW51c2UgPSAwOwotfQotCi12b2lkIFBNQVBJIERQTUlfaW50ODYoaW50IGludG5vLCBEUE1JX3JlZ3MgKnJlZ3MpCi17Ci0gICAgUE1faW5pdCgpOwotICAgIGlmIChWUmVncyA9PSBOVUxMKQotCXJldHVybjsKLQotICAgIFZSZWdzLT5sLmVheCA9IHJlZ3MtPmVheDsKLSAgICBWUmVncy0+bC5lYnggPSByZWdzLT5lYng7Ci0gICAgVlJlZ3MtPmwuZWN4ID0gcmVncy0+ZWN4OwotICAgIFZSZWdzLT5sLmVkeCA9IHJlZ3MtPmVkeDsKLSAgICBWUmVncy0+bC5lc2kgPSByZWdzLT5lc2k7Ci0gICAgVlJlZ3MtPmwuZWRpID0gcmVncy0+ZWRpOwotCi0gICAgVkJJT1NpbnQoaW50bm8sIFZSZWdzLCAxMDI0KTsKLQotICAgIHJlZ3MtPmVheCA9IFZSZWdzLT5sLmVheDsKLSAgICByZWdzLT5lYnggPSBWUmVncy0+bC5lYng7Ci0gICAgcmVncy0+ZWN4ID0gVlJlZ3MtPmwuZWN4OwotICAgIHJlZ3MtPmVkeCA9IFZSZWdzLT5sLmVkeDsKLSAgICByZWdzLT5lc2kgPSBWUmVncy0+bC5lc2k7Ci0gICAgcmVncy0+ZWRpID0gVlJlZ3MtPmwuZWRpOwotICAgIHJlZ3MtPmZsYWdzID0gVlJlZ3MtPncuZmxhZ3MgJiAweDE7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQ4NihpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0KQotewotICAgIFBNX2luaXQoKTsKLSAgICBpZiAoVlJlZ3MgPT0gTlVMTCkKLQlyZXR1cm4gMDsKLQotICAgIFZSZWdzLT5sLmVheCA9IGluLT5lLmVheDsKLSAgICBWUmVncy0+bC5lYnggPSBpbi0+ZS5lYng7Ci0gICAgVlJlZ3MtPmwuZWN4ID0gaW4tPmUuZWN4OwotICAgIFZSZWdzLT5sLmVkeCA9IGluLT5lLmVkeDsKLSAgICBWUmVncy0+bC5lc2kgPSBpbi0+ZS5lc2k7Ci0gICAgVlJlZ3MtPmwuZWRpID0gaW4tPmUuZWRpOwotCi0gICAgVkJJT1NpbnQoaW50bm8sIFZSZWdzLCAxMDI0KTsKLQotICAgIG91dC0+ZS5lYXggPSBWUmVncy0+bC5lYXg7Ci0gICAgb3V0LT5lLmVieCA9IFZSZWdzLT5sLmVieDsKLSAgICBvdXQtPmUuZWN4ID0gVlJlZ3MtPmwuZWN4OwotICAgIG91dC0+ZS5lZHggPSBWUmVncy0+bC5lZHg7Ci0gICAgb3V0LT5lLmVzaSA9IFZSZWdzLT5sLmVzaTsKLSAgICBvdXQtPmUuZWRpID0gVlJlZ3MtPmwuZWRpOwotICAgIG91dC0+eC5jZmxhZyA9IFZSZWdzLT53LmZsYWdzICYgMHgxOwotCi0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotaW50IFBNQVBJIFBNX2ludDg2eChpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIFBNX2luaXQoKTsKLSAgICBpZiAoVlJlZ3MgPT0gTlVMTCkKLQlyZXR1cm4gMDsKLQotICAgIGlmIChpbnRubyA9PSAweDIxKSB7Ci0JdGltZV90IHRvZGF5ID0gdGltZShOVUxMKTsKLQlzdHJ1Y3QgdG0gKnQ7Ci0JdCA9IGxvY2FsdGltZSgmdG9kYXkpOwotCW91dC0+eC5jeCA9IHQtPnRtX3llYXIgKyAxOTAwOwotCW91dC0+aC5kaCA9IHQtPnRtX21vbiArIDE7Ci0Jb3V0LT5oLmRsID0gdC0+dG1fbWRheTsKLQlyZXR1cm4gMDsKLQl9Ci0gICAgZWxzZSB7Ci0JVlJlZ3MtPmwuZWF4ID0gaW4tPmUuZWF4OwotCVZSZWdzLT5sLmVieCA9IGluLT5lLmVieDsKLQlWUmVncy0+bC5lY3ggPSBpbi0+ZS5lY3g7Ci0JVlJlZ3MtPmwuZWR4ID0gaW4tPmUuZWR4OwotCVZSZWdzLT5sLmVzaSA9IGluLT5lLmVzaTsKLQlWUmVncy0+bC5lZGkgPSBpbi0+ZS5lZGk7Ci0JVlJlZ3MtPncuZXMgPSBzcmVncy0+ZXM7Ci0JVlJlZ3MtPncuZHMgPSBzcmVncy0+ZHM7Ci0KLQlWQklPU2ludChpbnRubywgVlJlZ3MsIDEwMjQpOwotCi0Jb3V0LT5lLmVheCA9IFZSZWdzLT5sLmVheDsKLQlvdXQtPmUuZWJ4ID0gVlJlZ3MtPmwuZWJ4OwotCW91dC0+ZS5lY3ggPSBWUmVncy0+bC5lY3g7Ci0Jb3V0LT5lLmVkeCA9IFZSZWdzLT5sLmVkeDsKLQlvdXQtPmUuZXNpID0gVlJlZ3MtPmwuZXNpOwotCW91dC0+ZS5lZGkgPSBWUmVncy0+bC5lZGk7Ci0Jb3V0LT54LmNmbGFnID0gVlJlZ3MtPncuZmxhZ3MgJiAweDE7Ci0Jc3JlZ3MtPmVzID0gVlJlZ3MtPncuZXM7Ci0Jc3JlZ3MtPmRzID0gVlJlZ3MtPncuZHM7Ci0KLQlyZXR1cm4gb3V0LT54LmF4OwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9jYWxsUmVhbE1vZGUodWludCBzZWcsdWludCBvZmYsIFJNUkVHUyAqaW4sCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgUE1faW5pdCgpOwotICAgIGlmIChWUmVncyA9PSBOVUxMKQotCXJldHVybjsKLQotICAgIFZSZWdzLT5sLmVheCA9IGluLT5lLmVheDsKLSAgICBWUmVncy0+bC5lYnggPSBpbi0+ZS5lYng7Ci0gICAgVlJlZ3MtPmwuZWN4ID0gaW4tPmUuZWN4OwotICAgIFZSZWdzLT5sLmVkeCA9IGluLT5lLmVkeDsKLSAgICBWUmVncy0+bC5lc2kgPSBpbi0+ZS5lc2k7Ci0gICAgVlJlZ3MtPmwuZWRpID0gaW4tPmUuZWRpOwotICAgIFZSZWdzLT53LmVzID0gc3JlZ3MtPmVzOwotICAgIFZSZWdzLT53LmRzID0gc3JlZ3MtPmRzOwotCi0gICAgVkJJT1NjYWxsKHNlZywgb2ZmLCBWUmVncywgMTAyNCk7Ci0KLSAgICBpbi0+ZS5lYXggPSBWUmVncy0+bC5lYXg7Ci0gICAgaW4tPmUuZWJ4ID0gVlJlZ3MtPmwuZWJ4OwotICAgIGluLT5lLmVjeCA9IFZSZWdzLT5sLmVjeDsKLSAgICBpbi0+ZS5lZHggPSBWUmVncy0+bC5lZHg7Ci0gICAgaW4tPmUuZXNpID0gVlJlZ3MtPmwuZXNpOwotICAgIGluLT5lLmVkaSA9IFZSZWdzLT5sLmVkaTsKLSAgICBpbi0+eC5jZmxhZyA9IFZSZWdzLT53LmZsYWdzICYgMHgxOwotICAgIHNyZWdzLT5lcyA9IFZSZWdzLT53LmVzOwotICAgIHNyZWdzLT5kcyA9IFZSZWdzLT53LmRzOwotfQotCi12b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSh1bG9uZyAqcGh5c2ljYWwsdWxvbmcgKnRvdGFsKQotewotI2lmbmRlZiBfX1FOWE5UT19fCi0gICAgKnBoeXNpY2FsID0gKnRvdGFsID0gX21lbWF2bCgpOwotI2VuZGlmCi19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKLSAgICB1aW50IHNpemUsCi0gICAgdWxvbmcgKnBoeXNBZGRyLAotICAgIGlib29sIGNvbnRpZ3VvdXMsCi0gICAgaWJvb2wgYmVsb3cxNk0pCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgb24gUU5YICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSgKLSAgICB2b2lkICpwLAotICAgIHVpbnQgc2l6ZSwKLSAgICBpYm9vbCBjb250aWd1b3VzKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIG9uIFFOWCAqLwotfQotCi12b2lkICogUE1BUEkgUE1fYWxsb2NQYWdlKAotICAgIGlib29sIGxvY2tlZCkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBvbiBRTlggKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUGFnZSgKLSAgICB2b2lkICpwKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIG9uIFFOWCAqLwotfQotCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBKGludCBiYW5rKQotewotICAgIFBNX2luaXQoKTsKLSAgICBpZiAoVlJlZ3MgPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICBWUmVncy0+bC5lYXggPSAweDRGMDU7Ci0gICAgVlJlZ3MtPmwuZWJ4ID0gMHgwMDAwOwotICAgIFZSZWdzLT5sLmVkeCA9IGJhbms7Ci0gICAgVkJJT1NpbnQoMHgxMCwgVlJlZ3MsIDEwMjQpOwotfQotCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBQihpbnQgYmFuaykKLXsKLSAgICBQTV9pbml0KCk7Ci0gICAgaWYgKFZSZWdzID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgVlJlZ3MtPmwuZWF4ID0gMHg0RjA1OwotICAgIFZSZWdzLT5sLmVieCA9IDB4MDAwMDsKLSAgICBWUmVncy0+bC5lZHggPSBiYW5rOwotICAgIFZCSU9TaW50KDB4MTAsIFZSZWdzLCAxMDI0KTsKLQotICAgIFZSZWdzLT5sLmVheCA9IDB4NEYwNTsKLSAgICBWUmVncy0+bC5lYnggPSAweDAwMDE7Ci0gICAgVlJlZ3MtPmwuZWR4ID0gYmFuazsKLSAgICBWQklPU2ludCgweDEwLCBWUmVncywgMTAyNCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0Q1JUU3RhcnQoaW50IHgsaW50IHksaW50IHdhaXRWUlQpCi17Ci0gICAgUE1faW5pdCgpOwotICAgIGlmIChWUmVncyA9PSBOVUxMKQotCXJldHVybjsKLQotICAgIFZSZWdzLT5sLmVheCA9IDB4NEYwNzsKLSAgICBWUmVncy0+bC5lYnggPSB3YWl0VlJUOwotICAgIFZSZWdzLT5sLmVjeCA9IHg7Ci0gICAgVlJlZ3MtPmwuZWR4ID0geTsKLSAgICBWQklPU2ludCgweDEwLCBWUmVncywgMTAyNCk7Ci19Ci0KLWlib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCi0gICAgdXNob3J0IGF4VmFsLAotICAgIHVsb25nIEJJT1NQaHlzQWRkciwKLSAgICB2b2lkICpjb3B5T2ZCSU9TLAotICAgIHVsb25nIEJJT1NMZW4pCi17Ci0gICAgKHZvaWQpYXhWYWw7Ci0gICAgKHZvaWQpQklPU1BoeXNBZGRyOwotICAgICh2b2lkKWNvcHlPZkJJT1M7Ci0gICAgKHZvaWQpQklPU0xlbjsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWludCBQTUFQSSBQTV9sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcCA9IHA7ICBsZW4gPSBsZW47Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBwID0gcDsgIGxlbiA9IGxlbjsKLSAgICByZXR1cm4gMTsKLX0KLQotaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcCA9IHA7ICBsZW4gPSBsZW47Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcCA9IHA7ICBsZW4gPSBsZW47Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLVBNX01PRFVMRSBQTUFQSSBQTV9sb2FkTGlicmFyeSgKLSAgICBjb25zdCBjaGFyICpzekRMTE5hbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgdG8gbG9hZCBzaGFyZWQgbGlicmFyaWVzISAqLwotICAgICh2b2lkKXN6RExMTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldFByb2NBZGRyZXNzKAotICAgIFBNX01PRFVMRSBoTW9kdWxlLAotICAgIGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgKHZvaWQpaE1vZHVsZTsKLSAgICAodm9pZClzelByb2NOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVMaWJyYXJ5KAotICAgIFBNX01PRFVMRSBoTW9kdWxlKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgICh2b2lkKWhNb2R1bGU7Ci19Ci0KLWludCBQTUFQSSBQTV9zZXRJT1BMKAotICAgIGludCBsZXZlbCkKLXsKLSAgICAvKiBRTlggaGFuZGxlcyBJT1BMIHNlbGVjdGlvbiBhdCB0aGUgcHJvZ3JhbSBsaW5rIGxldmVsLiAqLwotICAgIHJldHVybiBsZXZlbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCi1zaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgotdHlwZSAgICAtIFR5cGUgdG8gcGxhY2UgaW50byB0aGUgTVRSUiByZWdpc3RlcgotCi1SRVRVUk5TOgotRXJyb3IgY29kZSBkZXNjcmliaW5nIHRoZSByZXN1bHQuCi0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBlbmFibGUgd3JpdGUgY29tYmluaW5nIGZvciB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBvZiBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2VuYWJsZVdyaXRlQ29tYmluZSgKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIHNpemUsCi0gICAgdWludCB0eXBlKQotewotI2lmbmRlZiAgX19RTlhOVE9fXwotICAgIHJldHVybiBNVFJSX2VuYWJsZVdyaXRlQ29tYmluZShiYXNlLHNpemUsdHlwZSk7Ci0jZWxzZQotICAgIHJldHVybiBQTV9NVFJSX05PVF9TVVBQT1JURUQ7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC92ZmxhdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L3ZmbGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OWVmMmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L3ZmbGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBEdW1teSBtb2R1bGU7IG5vIHZpcnR1YWwgZnJhbWVidWZmZXIgZm9yIHRoaXMgT1MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotCi1pYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKLXsKLSAgICBiYXNlQWRkciA9IGJhc2VBZGRyOwotICAgIGJhbmtTaXplID0gYmFua1NpemU7Ci0gICAgY29kZUxlbiA9IGNvZGVMZW47Ci0gICAgYmFua0Z1bmMgPSBiYW5rRnVuYzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCi17Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvenRpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNzQwOTcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L3p0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUU5YCi0qCi0qIERlc2NyaXB0aW9uOiAgUU5YIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfX1pUaW1lckluaXQodm9pZCkKLXsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Vc2UgdGhlIGdldHRpbWVvZmRheSgpIGZ1bmN0aW9uIHRvIGdldCBtaWNyb3NlY29uZCBwcmVjaXNpb24gKHByb2JhYmx5IGxlc3MKLXRob3VnaCkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19VTFpSZWFkVGltZSh2b2lkKQotewotICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKLSAgICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHMpOwotICAgIHJldHVybiAodHMudHZfbnNlYyAvIDEwMDAgKyB0cy50dl9zZWMgKiAxMDAwMDAwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdGFydCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyT24odG0pICAgICB0bS0+c3RhcnQubG93ID0gX19VTFpSZWFkVGltZSgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgbGFwIHRpbWUgc2luY2UgdGhlIHRpbWVyIHdhcyBzdGFydGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyTGFwKHRtKSAgICAgICAgKF9fVUxaUmVhZFRpbWUoKSAtIHRtLT5zdGFydC5sb3cpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lck9mZih0bSkgICAgICAgIHRtLT5lbmQubG93ID0gX19VTFpSZWFkVGltZSgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lckNvdW50KHRtKSAgKHRtLT5lbmQubG93IC0gdG0tPnN0YXJ0LmxvdykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGFzIG1pY3Jvc2Vjb25kcyBwZXIgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFVMWlRJTUVSX1JFU09MVVRJT04gMQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suIE5vdGUgdGhhdCB3ZSBjaGVjayB0byBzZWUKLXdoZXRoZXIgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkLCBhbmQgaWYgc28gYWRqdXN0IHRoZSBmaW5pc2ggdGltZSB0bwotYWNjb3VudCBmb3IgdGhpcy4gV2UgY2Fubm90IGRldGVjdCBpZiBtb3JlIHRoYXQgb25lIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcwotcGFzc2VkLCBzbyBpZiB0aGlzIGhhcHBlbnMgd2Ugd2lsbCBiZSBnZW5lcmF0aW5nIGVycm9ub3VzIHJlc3VsdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX19VTFpFbGFwc2VkVGltZSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpCi17IHJldHVybiBmaW5pc2ggLSBzdGFydDsgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvY3B1aW5mby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvY3B1aW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjMyYzNlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFJUVGFyZ2V0LTMyCi0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyB0byBtZWFzdXJlIHRoZQotKiAgICAgICAgICAgICAgIENQVSBmcmVxdWVuY3kuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaWJvb2wgaGF2ZVBlcmZvcm1hbmNlQ291bnRlcjsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbmNyZWFzZSB0aGUgdGhyZWFkIHByaW9yaXR5IHRvIG1heGltdW0sIGlmIHBvc3NpYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgU2V0TWF4VGhyZWFkUHJpb3JpdHkodm9pZCkKLXsKLSAgICBpbnQgICAgIG9sZFByaW9yaXR5OwotICAgIEhBTkRMRSAgaFRocmVhZCA9IEdldEN1cnJlbnRUaHJlYWQoKTsKLQotICAgIG9sZFByaW9yaXR5ID0gR2V0VGhyZWFkUHJpb3JpdHkoaFRocmVhZCk7Ci0gICAgaWYgKG9sZFByaW9yaXR5ICE9IFRIUkVBRF9QUklPUklUWV9FUlJPUl9SRVRVUk4pCi0JU2V0VGhyZWFkUHJpb3JpdHkoaFRocmVhZCwgVEhSRUFEX1BSSU9SSVRZX1RJTUVfQ1JJVElDQUwpOwotICAgIHJldHVybiBvbGRQcmlvcml0eTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSBvcmlnaW5hbCB0aHJlYWQgcHJpb3JpdHkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUmVzdG9yZVRocmVhZFByaW9yaXR5KAotICAgIGludCBvbGRQcmlvcml0eSkKLXsKLSAgICBIQU5ETEUgIGhUaHJlYWQgPSBHZXRDdXJyZW50VGhyZWFkKCk7Ci0KLSAgICBpZiAob2xkUHJpb3JpdHkgIT0gVEhSRUFEX1BSSU9SSVRZX0VSUk9SX1JFVFVSTikKLQlTZXRUaHJlYWRQcmlvcml0eShoVGhyZWFkLCBvbGRQcmlvcml0eSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgR2V0Q291bnRlckZyZXF1ZW5jeSgKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICpmcmVxKQotewotICAgIGlmICghUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgoTEFSR0VfSU5URUdFUiopZnJlcSkpIHsKLQloYXZlUGVyZm9ybWFuY2VDb3VudGVyID0gZmFsc2U7Ci0JZnJlcS0+bG93ID0gMTAwMDAwOwotCWZyZXEtPmhpZ2ggPSAwOwotCX0KLSAgICBlbHNlCi0JaGF2ZVBlcmZvcm1hbmNlQ291bnRlciA9IHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgR2V0Q291bnRlcih0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoaGF2ZVBlcmZvcm1hbmNlQ291bnRlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopdCk7ICAgICAgICAgXAotICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSh0KS0+bG93ID0gdGltZUdldFRpbWUoKSAqIDEwMDsgICAgICAgICAgICAgICAgICAgICBcCi0JKHQpLT5oaWdoID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L2V2ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MmExNGEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvZXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUlRUYXJnZXQtMzIKLSoKLSogRGVzY3JpcHRpb246ICBXaW4zMiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFNjaVRlY2ggY3Jvc3MgcGxhdGZvcm0KLSogICAgICAgICAgICAgICBldmVudCBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHVzaG9ydCAgIGtleVVwTXNnWzI1Nl0gPSB7MH07ICAgIC8qIFRhYmxlIG9mIGtleSB1cCBtZXNzYWdlcyAgICAgKi8KLXN0YXRpYyBpbnQgICAgICByYW5nZVgscmFuZ2VZOyAgICAgICAgICAvKiBSYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFRoZXNlIGFyZSBub3QgdXNlZCB1bmRlciBXaW4zMiAqLwotI2RlZmluZSBfRVZUX2Rpc2FibGVJbnQoKSAgICAgICAxCi0jZGVmaW5lIF9FVlRfcmVzdG9yZUludChmbGFncykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIFNjYW4gY29kZSB0byB0ZXN0Ci0KLVJFTUFSS1M6Ci1UaGlzIG1hY3JvIGRldGVybWluZXMgaWYgYSBzcGVjaWZpZWQga2V5IGlzIGN1cnJlbnRseSBkb3duIGF0IHRoZQotdGltZSB0aGF0IHRoZSBjYWxsIGlzIG1hZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX2lzS2V5RG93bihzY2FuQ29kZSkgICAgKGtleVVwTXNnW3NjYW5Db2RlXSAhPSAwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB0aWNrcyBzaW5jZSBzeXN0ZW0KLXN0YXJ0dXAgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHBsYWNlZCBpbnRvCi10aGUgdGltZSBzdGFtcCBmaWVsZHMgb2YgZXZlbnRzLCBhbmQgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXV0byBtb3VzZSBkb3duCi1ldmVudHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX0VWVF9nZXRUaWNrcyh2b2lkKQoteyByZXR1cm4gdGltZUdldFRpbWUoKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVB1bXBzIGFsbCBtZXNzYWdlcyBpbiB0aGUgbWVzc2FnZSBxdWV1ZSBmcm9tIFdpbjMyIGludG8gb3VyIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9wdW1wTWVzc2FnZXModm9pZCkKLXsKLSAgICBNU0cgICAgIG1zZzsKLSAgICBNU0cgICAgIGNoYXJNc2c7Ci0gICAgZXZlbnRfdCBldnQ7Ci0KLSAgICB3aGlsZSAoUGVla01lc3NhZ2UoJm1zZyxOVUxMLDAsMCxQTV9SRU1PVkUpKSB7Ci0JbWVtc2V0KCZldnQsMCxzaXplb2YoZXZ0KSk7Ci0Jc3dpdGNoIChtc2cubWVzc2FnZSkgewotCSAgICBjYXNlIFdNX01PVVNFTU9WRToKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VNT1ZFOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9MQlVUVE9OREJMQ0xLOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV047Ci0JCWV2dC5tZXNzYWdlID0gRVZUX0xFRlRCTUFTSyB8IEVWVF9EQkxDTElDSzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fTEJVVFRPTkRPV046Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9MQlVUVE9OVVA6Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFVVA7Ci0JCWV2dC5tZXNzYWdlID0gRVZUX0xFRlRCTUFTSzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fUkJVVFRPTkRCTENMSzoKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOIHwgRVZUX0RCTENMSUNLOwotCQlldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9SQlVUVE9ORE9XTjoKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOwotCQlldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9SQlVUVE9OVVA6Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFVVA7Ci0JCWV2dC5tZXNzYWdlID0gRVZUX1JJR0hUQk1BU0s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX0tFWURPV046Ci0JICAgIGNhc2UgV01fU1lTS0VZRE9XTjoKLQkJaWYgKEhJV09SRChtc2cubFBhcmFtKSAmIEtGX1JFUEVBVCkgewotCQkgICAgZXZ0LndoYXQgPSBFVlRfS0VZUkVQRUFUOwotCQkgICAgfQotCQllbHNlIHsKLQkJICAgIGV2dC53aGF0ID0gRVZUX0tFWURPV047Ci0JCSAgICB9Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX0tFWVVQOgotCSAgICBjYXNlIFdNX1NZU0tFWVVQOgotCQlldnQud2hhdCA9IEVWVF9LRVlVUDsKLQkJYnJlYWs7Ci0JICAgIH0KLQotCS8qIENvbnZlcnQgbW91c2UgZXZlbnQgbW9kaWZpZXIgZmxhZ3MgKi8KLQlpZiAoZXZ0LndoYXQgJiBFVlRfTU9VU0VFVlQpIHsKLQkgICAgZXZ0LndoZXJlX3ggPSBtc2cucHQueDsKLQkgICAgZXZ0LndoZXJlX3kgPSBtc2cucHQueTsKLQkgICAgaWYgKGV2dC53aGF0ID09IEVWVF9NT1VTRU1PVkUpIHsKLQkJaWYgKG9sZE1vdmUgIT0gLTEpIHsKLQkJICAgIGV2dHFbb2xkTW92ZV0ud2hlcmVfeCA9IGV2dC53aGVyZV94Oy8qIE1vZGlmeSBleGlzdGluZyBvbmUgICovCi0JCSAgICBldnRxW29sZE1vdmVdLndoZXJlX3kgPSBldnQud2hlcmVfeTsKLQkJICAgIGV2dC53aGF0ID0gMDsKLQkJICAgIH0KLQkJZWxzZSB7Ci0JCSAgICBvbGRNb3ZlID0gZnJlZUhlYWQ7IC8qIFNhdmUgaWQgb2YgdGhpcyBtb3ZlIGV2ZW50ICAgKi8KLQkJICAgIH0KLQkJfQotCSAgICBlbHNlCi0JCW9sZE1vdmUgPSAtMTsKLQkgICAgaWYgKG1zZy53UGFyYW0gJiBNS19MQlVUVE9OKQotCQlldnQubW9kaWZpZXJzIHw9IEVWVF9MRUZUQlVUOwotCSAgICBpZiAobXNnLndQYXJhbSAmIE1LX1JCVVRUT04pCi0JCWV2dC5tb2RpZmllcnMgfD0gRVZUX1JJR0hUQlVUOwotCSAgICBpZiAobXNnLndQYXJhbSAmIE1LX1NISUZUKQotCQlldnQubW9kaWZpZXJzIHw9IEVWVF9TSElGVEtFWTsKLQkgICAgaWYgKG1zZy53UGFyYW0gJiBNS19DT05UUk9MKQotCQlldnQubW9kaWZpZXJzIHw9IEVWVF9DVFJMU1RBVEU7Ci0JICAgIH0KLQotCS8qIENvbnZlcnQga2V5Ym9hcmQgY29kZXMgKi8KLQlUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOwotCWlmIChldnQud2hhdCAmIEVWVF9LRVlFVlQpIHsKLQkgICAgaW50IHNjYW5Db2RlID0gKG1zZy5sUGFyYW0gPj4gMTYpICYgMHhGRjsKLQkgICAgaWYgKGV2dC53aGF0ID09IEVWVF9LRVlVUCkgewotCQkvKiBHZXQgbWVzc2FnZSBmb3Iga2V5dXAgY29kZSBmcm9tIHRhYmxlIG9mIGNhY2hlZCBkb3duIHZhbHVlcyAqLwotCQlldnQubWVzc2FnZSA9IGtleVVwTXNnW3NjYW5Db2RlXTsKLQkJa2V5VXBNc2dbc2NhbkNvZGVdID0gMDsKLQkJfQotCSAgICBlbHNlIHsKLQkJaWYgKFBlZWtNZXNzYWdlKCZjaGFyTXNnLE5VTEwsV01fQ0hBUixXTV9DSEFSLFBNX1JFTU9WRSkpCi0JCSAgICBldnQubWVzc2FnZSA9IGNoYXJNc2cud1BhcmFtOwotCQlpZiAoUGVla01lc3NhZ2UoJmNoYXJNc2csTlVMTCxXTV9TWVNDSEFSLFdNX1NZU0NIQVIsUE1fUkVNT1ZFKSkKLQkJICAgIGV2dC5tZXNzYWdlID0gY2hhck1zZy53UGFyYW07Ci0JCWV2dC5tZXNzYWdlIHw9ICgobXNnLmxQYXJhbSA+PiA4KSAmIDB4RkYwMCk7Ci0JCWtleVVwTXNnW3NjYW5Db2RlXSA9ICh1c2hvcnQpZXZ0Lm1lc3NhZ2U7Ci0JCX0KLQkgICAgaWYgKGV2dC53aGF0ID09IEVWVF9LRVlSRVBFQVQpCi0JCWV2dC5tZXNzYWdlIHw9IChtc2cubFBhcmFtIDw8IDE2KTsKLQkgICAgaWYgKEhJV09SRChtc2cubFBhcmFtKSAmIEtGX0FMVERPV04pCi0JCWV2dC5tb2RpZmllcnMgfD0gRVZUX0FMVFNUQVRFOwotCSAgICBpZiAoR2V0S2V5U3RhdGUoVktfU0hJRlQpICYgMHg4MDAwVSkKLQkJZXZ0Lm1vZGlmaWVycyB8PSBFVlRfU0hJRlRLRVk7Ci0JICAgIGlmIChHZXRLZXlTdGF0ZShWS19DT05UUk9MKSAmIDB4ODAwMFUpCi0JCWV2dC5tb2RpZmllcnMgfD0gRVZUX0NUUkxTVEFURTsKLQkgICAgb2xkTW92ZSA9IC0xOwotCSAgICB9Ci0KLQlpZiAoZXZ0LndoYXQgIT0gMCkgewotCSAgICAvKiBBZGQgdGltZSBzdGFtcCBhbmQgYWRkIHRoZSBldmVudCB0byB0aGUgcXVldWUgKi8KLQkgICAgZXZ0LndoZW4gPSBtc2cudGltZTsKLQkgICAgaWYgKGNvdW50IDwgRVZFTlRRU0laRSkgewotCQlhZGRFdmVudCgmZXZ0KTsKLQkJfQotCSAgICB9Ci0JRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIG1hY3JvL2Z1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydHMgdGhlIHNjYW4gY29kZXMgcmVwb3J0ZWQgYnkgdGhlCi1rZXlib2FyZCB0byBvdXIgZXZlbnQgbGlicmFyaWVzIG5vcm1hbGlzZWQgZm9ybWF0LiBXZSBvbmx5IGhhdmUgb25lIHNjYW4KLWNvZGUgZm9yIHRoZSAnQScga2V5LCBhbmQgdXNlIHNoaWZ0IG1vZGlmaWVycyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYQotQ3RybC1GMSwgQWx0LUYxIGV0Yy4gVGhlIHJhdyBzY2FuIGNvZGVzIGZyb20gdGhlIGtleWJvYXJkIHdvcmsgdGhpcyB3YXksCi1idXQgdGhlIE9TIGdpdmVzIHVzICdjb29rZWQnIHNjYW4gY29kZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZW0gYmFjawotdG8gdGhlIHJhdyBmb3JtYXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX21hc2tLZXlDb2RlKGV2dCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX2Fib3J0KCkKLXsKLSAgICBFVlRfZXhpdCgpOwotICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCi0KLVJFTUFSS1M6Ci1Jbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCi10byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCi10aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCi0KLVdlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKLWV2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9pbml0KAotICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCi17Ci0gICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KLSAgICBfbW91c2VNb3ZlID0gbW91c2VNb3ZlOwotICAgIGluaXRFdmVudFF1ZXVlKCk7Ci0gICAgbWVtc2V0KGtleVVwTXNnLDAsc2l6ZW9mKGtleVVwTXNnKSk7Ci0KLSAgICAvKiBDYXRjaCBwcm9ncmFtIHRlcm1pbmF0aW9uIHNpZ25hbHMgc28gd2UgY2FuIGNsZWFuIHVwIHByb3Blcmx5ICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIF9FVlRfYWJvcnQpOwotICAgIHNpZ25hbChTSUdGUEUsIF9FVlRfYWJvcnQpOwotICAgIHNpZ25hbChTSUdJTlQsIF9FVlRfYWJvcnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotQ2hhbmdlcyB0aGUgcmFuZ2Ugb2YgY29vcmRpbmF0ZXMgcmV0dXJuZWQgYnkgdGhlIG1vdXNlIGZ1bmN0aW9ucyB0byB0aGUKLXNwZWNpZmllZCByYW5nZSBvZiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB3aGVuIGNoYW5naW5nIGJldHdlZW4gZ3JhcGhpY3MKLW1vZGVzIHNldCB0aGUgcmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgZm9yIHRoZSBuZXcgZGlzcGxheSBtb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVJhbmdlKAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzKQotewotICAgIHJhbmdlWCA9IHhSZXM7Ci0gICAgcmFuZ2VZID0geVJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLU1vZGlmZXMgdGhlIG1vdXNlIGNvb3JkaW5hdGVzIGFzIG5lY2Vzc2FyeSBpZiBzY2FsaW5nIHRvIE9TIGNvb3JkaW5hdGVzLAotYW5kIHNldHMgdGhlIE9TIG1vdXNlIGN1cnNvciBwb3NpdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfc2V0TW91c2VQb3MoCi0gICAgaW50ICp4LAotICAgIGludCAqeSkKLXsKLSAgICBTZXRDdXJzb3JQb3MoKngsKnkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWlsaXNlcyB0aGUgaW50ZXJuYWwgZXZlbnQgaGFuZGxpbmcgbW9kdWxlcy4gVGhlIEVWVF9zdXNwZW5kIGZ1bmN0aW9uCi1jYW4gYmUgY2FsbGVkIHRvIHN1c3BlbmQgZXZlbnQgaGFuZGxpbmcgKHN1Y2ggYXMgd2hlbiBzaGVsbGluZyBvdXQgdG8gRE9TKSwKLWFuZCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3VtZSBpdCBhZ2FpbiBsYXRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9yZXN1bWUodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBXaW4zMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bwotZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9zdXNwZW5kKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgV2luMzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUV4aXRzIHRoZSBldmVudCBtb2R1bGUgZm9yIHByb2dyYW0gdGVybWluYXRhdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9leGl0KHZvaWQpCi17Ci0gICAgLyogUmVzdG9yZSBzaWduYWwgaGFuZGxlcnMgKi8KLSAgICBzaWduYWwoU0lHQUJSVCwgU0lHX0RGTCk7Ci0gICAgc2lnbmFsKFNJR0ZQRSwgU0lHX0RGTCk7Ci0gICAgc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1MmRhZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC9vc2hkci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUlRUYXJnZXQtMzIKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jZGVmaW5lIFNUUklDVAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxtbXN5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDdlZDYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDcwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBSVFRhcmdldC0zMgotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAotKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQotKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKLSogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAotKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2RlZmluZSBTVFJJQ1QKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8bW1zeXN0ZW0uaD4KLSNpZmRlZiAgX19CT1JMQU5EQ19fCi0jcHJhZ21hIHdhcm4gLXBhcgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkICAgICAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgTVRSUl9pbml0KHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFBNIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9pbml0KHZvaWQpCi17Ci0gICAgLyogVE9ETzogZE8gYW55IHNwZWNpYWwgaW5pdCBjb2RlIGluIGhlcmUuICovCi0gICAgTVRSUl9pbml0KCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHR5cGUgaWRlbnRpZmllci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1sb25nIFBNQVBJIFBNX2dldE9TVHlwZSh2b2lkKQotewotICAgIHJldHVybiBfT1NfUlRUQVJHRVQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBydW50aW1lIHR5cGUgaWRlbnRpZmllci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0TW9kZVR5cGUodm9pZCkKLXsKLSAgICByZXR1cm4gUE1fMzg2OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFkZCBhIGZpbGUgZGlyZWN0b3J5IHNlcGFyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBmaWxlbmFtZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2JhY2tzbGFzaCgKLSAgICBjaGFyICpzKQotewotICAgIHVpbnQgcG9zID0gc3RybGVuKHMpOwotICAgIGlmIChzW3Bvcy0xXSAhPSAnXFwnKSB7Ci0Jc1twb3NdID0gJ1xcJzsKLQlzW3BvcysxXSA9ICdcMCc7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFkZCBhIHVzZXIgZGVmaW5lZCBQTV9mYXRhbEVycm9yIGNsZWFudXAgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGYXRhbEVycm9yQ2xlYW51cCgKLSAgICB2b2lkIChQTUFQSVAgY2xlYW51cCkodm9pZCkpCi17Ci0gICAgZmF0YWxFcnJvckNsZWFudXAgPSBjbGVhbnVwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlcG9ydCBhIGZhdGFsIGVycm9yIGNvbmRpdGlvbiBhbmQgaGFsdCB0aGUgcHJvZ3JhbS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZhdGFsRXJyb3IoCi0gICAgY29uc3QgY2hhciAqbXNnKQotewotICAgIGlmIChmYXRhbEVycm9yQ2xlYW51cCkKLQlmYXRhbEVycm9yQ2xlYW51cCgpOwotICAgIC8qIFRPRE86IERpc3BsYXkgYSBmYXRhbCBlcnJvciBtZXNzYWdlIGFuZCBleGl0ISAqLwotLyogIE1lc3NhZ2VCb3goTlVMTCxtc2csIkZhdGFsIEVycm9yISIsIE1CX0lDT05FWENMQU1BVElPTik7ICovCi0gICAgZXhpdCgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSB0aGUgcmVhbCBtb2RlIFZFU0EgdHJhbnNmZXIgYnVmZmVyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIEJJT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYoCi0gICAgdWludCAqbGVuLAotICAgIHVpbnQgKnJzZWcsCi0gICAgdWludCAqcm9mZikKLXsKLSAgICAvKiBObyBCSU9TIGFjY2VzcyBmb3IgdGhlIFJUVGFyZ2V0ICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2hlY2sgaWYgYSBrZXkgaGFzIGJlZW4gcHJlc3NlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBOZWVkIHRvIGNoZWNrIGlmIGEga2V5IGlzIHdhaXRpbmcgb24gdGhlIGtleWJvYXJkIHF1ZXVlICovCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV2FpdCBmb3IgYW5kIHJldHVybiB0aGUgbmV4dCBrZXlwcmVzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKLXsKLSAgICAvKiBUT0RPOiBOZWVkIHRvIG9idGFpbiB0aGUgbmV4dCBrZXlwcmVzcywgYW5kIGJsb2NrIHVudGlsIG9uZSBpcyBoaXQgKi8KLSAgICByZXR1cm4gMHhEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgbG9jYXRpb24gb2YgdGhlIE9TIGNvbnNvbGUgY3Vyc29yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbigKLSAgICBpbnQgeCwKLSAgICBpbnQgeSkKLXsKLSAgICAvKiBOb3RoaW5nIHRvIGRvIGZvciBSVFRhcmdldC0zMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgd2lkdGggb2YgdGhlIE9TIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTV9zZXRPU1NjcmVlbldpZHRoKAotICAgIGludCB3aWR0aCwKLSAgICBpbnQgaGVpZ2h0KQotewotICAgIC8qIE5vdGhpbmcgdG8gZG8gZm9yIFJUVGFyZ2V0LTMyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaGFuZGxlciAodXNlZCBmb3Igc29mdHdhcmUgc3RlcmVvIG1vZGVzKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcigKLSAgICBQTV9pbnRIYW5kbGVyIGloLAotICAgIGludCBmcmVxdWVuY3kpCi17Ci0gICAgLyogTm90IHN1cHBvcnRlZCBmb3IgUlRUYXJnZXQtMzIgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgZnJlcXVlbmN5IChmb3Igc3RlcmVvIG1vZGVzKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koCi0gICAgaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIHVuZGVyIFJUVGFyZ2V0LTMyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgb3JpZ2luYWwgcmVhbCB0aW1lIGNsb2NrIGhhbmRsZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIHVuZGVyIFJUVGFyZ2V0LTMyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gcGF0aCBvciB3b3JraW5nIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyICogUE1BUEkgUE1fZ2V0Q3VycmVudFBhdGgoCi0gICAgY2hhciAqcGF0aCwKLSAgICBpbnQgbWF4TGVuKQotewotICAgIHJldHVybiBnZXRjd2QocGF0aCxtYXhMZW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgZHJpdmUgbGV0dGVyIGZvciB0aGUgYm9vdCBkcml2ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKQotewotICAgIHJldHVybiAnYyc7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBWQkUvQUYgZHJpdmVyIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRWQkVBRlBhdGgodm9pZCkKLXsKLSAgICByZXR1cm4gImM6XFwiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpCi17Ci0gICAgLyogVE9ETzogUG9pbnQgdGhpcyBhdCB0aGUgcGF0aCB3aGVuIHRoZSBOdWNsZXVzIGRyaXZlcnMgd2lsbCBiZSBmb3VuZCAqLwotICAgIHJldHVybiAiYzpcXG51Y2xldXMiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgTnVjbGV1cyBjb25maWd1cmF0aW9uIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLSAgICBzdHJjcHkocGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbWFjaGluZSBpZiBwb3NzaWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKLXsKLSAgICByZXR1cm4gUE1fZ2V0TWFjaGluZU5hbWUoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1HZXQgdGhlIG5hbWUgb2YgdGhlIG1hY2hpbmUgb24gdGhlIG5ldHdvcmsuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCi17Ci0gICAgLyogTm90IG5lY2Vzc2FyeSBmb3IgUlRUYXJnZXQtMzIgKi8KLSAgICByZXR1cm4gIlVua25vd24iOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlYWwgbW9kZSBCSU9TIGRhdGEgYXJlYS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgUlRUYXJnZXQtMzIgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gYSBwb2ludGVyIHRvIDB4QTAwMDAgcGh5c2ljYWwgVkdBIGdyYXBoaWNzIGZyYW1lYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKLXsKLSAgICBzdGF0aWMgdm9pZCAqYmFua1B0cjsKLSAgICBpZiAoIWJhbmtQdHIpCi0JYmFua1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLDB4RkZGRix0cnVlKTsKLSAgICByZXR1cm4gYmFua1B0cjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgbGluZWFyIGFkZHJlc3MgaW4gdGhlIGNhbGxlcnMgcHJvY2Vzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgbGltaXQsCi0gICAgaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgLyogVE9ETzogTWFwIGEgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgdG8gYSBsaW5lYXIgYWRkcmVzcyAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBwaHlzaWNhbCBhZGRyZXNzIG1hcHBpbmcgYWxsb2NhdGVkIGJ5IFBNX21hcFBoeXNpY2FsQWRkci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIoCi0gICAgdm9pZCAqcHRyLAotICAgIHVsb25nIGxpbWl0KQotewotICAgIC8qIFRPRE86IEZyZWUgdGhlIHBoeXNpY2FsIGFkZHJlc3MgbWFwcGluZyAqLwotfQotCi11bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyICovCi0gICAgLyogICAgICAgYWRkcmVzcy4gKi8KLSAgICByZXR1cm4gMHhGRkZGRkZGRlVMOwotfQotCi12b2lkIFBNQVBJIFBNX3NsZWVwKHVsb25nIG1pbGxpc2Vjb25kcykKLXsKLSAgICBTbGVlcChtaWxsaXNlY29uZHMpOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0Y4OwotCWNhc2UgMTogcmV0dXJuIDB4MkY4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNCQzsKLQljYXNlIDE6IHJldHVybiAweDM3ODsKLQljYXNlIDI6IHJldHVybiAweDI3ODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgYSBibG9jayBvZiAodW5uYW1lZCkgc2hhcmVkIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKAotICAgIGxvbmcgc2l6ZSkKLXsKLSAgICByZXR1cm4gUE1fbWFsbG9jKHNpemUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCgKLSAgICB2b2lkICpwdHIpCi17Ci0gICAgUE1fZnJlZShwdHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1hcCBhIGxpbmVhciBtZW1vcnkgYWRkcmVzcyB0byB0aGUgY2FsbGluZyBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UuIFRoZQotYWRkcmVzcyB3aWxsIGhhdmUgYmVlbiBhbGxvY2F0ZWQgaW4gYW5vdGhlciBwcm9jZXNzIHVzaW5nIHRoZQotUE1fbWFwUGh5c2ljYWxBZGRyIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3MoCi0gICAgdm9pZCAqYmFzZSwKLSAgICB1bG9uZyBsaW1pdCkKLXsKLSAgICByZXR1cm4gYmFzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSByZWFsIG1vZGUgcG9pbnRlciB0byBhIHByb3RlY3RlZCBtb2RlIHBvaW50ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKAotICAgIHVpbnQgcl9zZWcsCi0gICAgdWludCByX29mZikKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgUlRUYXJnZXQtMzIgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1aW50ICpyX3NlZywKLSAgICB1aW50ICpyX29mZikKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgUlRUYXJnZXQtMzIgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2YgcmVhbCBtb2RlIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKAotICAgIHZvaWQgKm1lbSkKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgUlRUYXJnZXQtMzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgKHBhcmFtZXRlcnMgaW4gRFBNSSBjb21wYXRpYmxlIHN0cnVjdHVyZSkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIERQTUlfaW50ODYoCi0gICAgaW50IGludG5vLAotICAgIERQTUlfcmVncyAqcmVncykKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgUlRUYXJnZXQtMzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2ludDg2KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0KQotewotICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODZ4KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgYSByZWFsIG1vZGUgZmFyIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKAotICAgIHVpbnQgc2VnLAotICAgIHVpbnQgb2ZmLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBhbW91bnQgb2YgYXZhaWxhYmxlIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSgKLSAgICB1bG9uZyAqcGh5c2ljYWwsCi0gICAgdWxvbmcgKnRvdGFsKQotewotICAgIC8qIFRPRE86IEZpZ3VyZSBvdXQgaG93IHRvIGRldGVybWluZSB0aGUgYXZhaWxhYmxlIG1lbW9yeS4gTm90IGVudGlyZWx5ICovCi0gICAgLyogICAgICAgY3JpdGljYWwgc28gcmV0dXJuaW5nIDAgaXMgT0suICovCi0gICAgKnBoeXNpY2FsID0gKnRvdGFsID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIGxvY2tlZCwgcGh5c2ljYWwgbWVtb3J5IGZvciBETUEgb3BlcmF0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NMb2NrZWRNZW0oCi0gICAgdWludCBzaXplLAotICAgIHVsb25nICpwaHlzQWRkciwKLSAgICBpYm9vbCBjb250aWd1b3VzLAotICAgIGlib29sIGJlbG93MTZNKQotewotICAgIC8qIFRPRE86IEFsbG9jYXRlIGEgYmxvY2sgb2YgbG9ja2VkLCBwaHN5aWNhbGx5IGNvbnRpZ291cyBtZW1vcnkgZm9yIERNQSAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiBsb2NrZWQgcGh5c2ljYWwgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSgKLSAgICB2b2lkICpwLAotICAgIHVpbnQgc2l6ZSwKLQotICAgIGlib29sIGNvbnRpZ3VvdXMpCi17Ci0gICAgLyogVE9ETzogRnJlZSBhIGxvY2tlZCBtZW1vcnkgYnVmZmVyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0EoCi0gICAgaW50IGJhbmspCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0FCKAotICAgIGludCBiYW5rKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBzdGFydCBhZGRyZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0Q1JUU3RhcnQoCi0gICAgaW50IHgsCi0gICAgaW50IHksCi0gICAgaW50IHdhaXRWUlQpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRXhlY3V0ZSB0aGUgUE9TVCBvbiB0aGUgc2Vjb25kYXJ5IEJJT1MgZm9yIGEgY29udHJvbGxlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAotICAgIHVzaG9ydCBheFZhbCwKLSAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCi0gICAgdm9pZCAqbWFwcGVkQklPUykKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgUlRUYXJnZXQtMzIgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLVBNX01PRFVMRSBQTUFQSSBQTV9sb2FkTGlicmFyeSgKLSAgICBjb25zdCBjaGFyICpzekRMTE5hbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgdG8gbG9hZCBzaGFyZWQgbGlicmFyaWVzISAqLwotICAgICh2b2lkKXN6RExMTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldFByb2NBZGRyZXNzKAotICAgIFBNX01PRFVMRSBoTW9kdWxlLAotICAgIGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgKHZvaWQpaE1vZHVsZTsKLSAgICAodm9pZClzelByb2NOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVMaWJyYXJ5KAotICAgIFBNX01PRFVMRSBoTW9kdWxlKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgICh2b2lkKWhNb2R1bGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBQTUFQSSBQTV9maW5kRmlyc3RGaWxlKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzdGFydCBhIGRpcmVjdG9yeSBlbnVtZXJhdGlvbiBzZWFyY2ggKi8KLSAgICAvKiAgICAgICBnaXZlbiB0aGUgZmlsZW5hbWUgKHdpdGggd2lsZGNhcmRzKS4gVGhlIGRhdGEgc2hvdWxkIGJlICovCi0gICAgLyogICAgICAgY29udmVydGVkIGFuZCByZXR1cm5lZCBpbiB0aGUgZmluZERhdGEgc3RhbmRhcmQgZm9ybS4gKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClmaW5kRGF0YTsKLSAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCi0gICAgdWxvbmcgaGFuZGxlLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIHRoZSBuZXh0IGZpbGUgaW4gZGlyZWN0b3J5IGVudW1lcmF0aW9uICovCi0gICAgLyogICAgICAgc2VhcmNoIGdpdmVuIHRoZSBzZWFyY2ggY3JpdGVyaWEgZGVmaW5lZCBpbiB0aGUgY2FsbCB0byAqLwotICAgIC8qICAgICAgIFBNX2ZpbmRGaXJzdEZpbGUuIFRoZSBkYXRhIHNob3VsZCBiZSBjb252ZXJ0ZWQgYW5kIHJldHVybmVkICovCi0gICAgLyogICAgICAgaW4gdGhlIGZpbmREYXRhIHN0YW5kYXJkIGZvcm0uICovCi0gICAgKHZvaWQpaGFuZGxlOwotICAgICh2b2lkKWZpbmREYXRhOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCi0gICAgdWxvbmcgaGFuZGxlKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MuIFRoaXMgbWF5IGRvICovCi0gICAgLyogICAgICAgbm90aGluZyBmb3Igc29tZSBPUydlcy4gKi8KLSAgICAodm9pZCloYW5kbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZHJpdmUgaXMgYSB2YWxpZCBkcml2ZSBvciBub3QuIFVuZGVyIFVuaXggdGhpcwotZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueXRoaW5nIGV4Y2VwdCBhIHZhbHVlIG9mIDMgKGNvbnNpZGVyZWQKLXRoZSByb290IGRyaXZlLCBhbmQgZXF1aXZhbGVudCB0byBDOiBmb3Igbm9uLVVuaXggc3lzdGVtcykuIFRoZSBkcml2ZQotbnVtYmVyaW5nIGlzOgotCi0gICAgMSAgIC0gRHJpdmUgQToKLSAgICAyICAgLSBEcml2ZSBCOgotICAgIDMgICAtIERyaXZlIEM6Ci0gICAgZXRjCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9kcml2ZVZhbGlkKAotICAgIGNoYXIgZHJpdmUpCi17Ci0gICAgaWYgKGRyaXZlID09IDMpCi0JcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmlmZWQgZHJpdmUuCi1VbmRlciBVbml4IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHJlZ2FyZGxlc3MKLW9mIHdoYXQgdGhlIHZhbHVlIG9mICdkcml2ZScgaXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9nZXRkY3dkKAotICAgIGludCBkcml2ZSwKLSAgICBjaGFyICpkaXIsCi0gICAgaW50IGxlbikKLXsKLSAgICAodm9pZClkcml2ZTsKLSAgICBnZXRjd2QoZGlyLGxlbik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIHVpbnQgYXR0cmliKQotewotICAgIC8qIFRPRE86IFNldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIGZpbGUgKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClhdHRyaWI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY3JlYXRlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX21rZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIHJldHVybiBta2RpcihmaWxlbmFtZSkgPT0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byByZW1vdmUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fcm1kaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgcmV0dXJuIHJtZGlyKGZpbGVuYW1lKSA9PSAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L3ZmbGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOWRmZTYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvdmZsYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFJUVGFyZ2V0LTMyCi0qCi0qIERlc2NyaXB0aW9uOiAgRHVtbXkgbW9kdWxlOyBubyB2aXJ0dWFsIGZyYW1lYnVmZmVyIGZvciB0aGlzIE9TCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpZmRlZiAgX19CT1JMQU5EQ19fCi0jcHJhZ21hIHdhcm4gLXBhcgotI2VuZGlmCi0KLWlib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotewotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvenRpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYzE4NGQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvenRpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUlRUYXJnZXQtMzIKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFplbiBUaW1lciBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgQ1BVX2xhcmdlSW50ZWdlciBjb3VudEZyZXE7Ci1zdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUGVyZm9ybWFuY2VDb3VudGVyOwotc3RhdGljIHVsb25nICAgICAgICAgICAgc3RhcnQsZmluaXNoOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX19aVGltZXJJbml0KHZvaWQpCi17Ci0jaWZkZWYgIE5PX0FTU0VNQkxFUgotICAgIGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIgPSBmYWxzZTsKLSNlbHNlCi0gICAgaGF2ZVBlcmZvcm1hbmNlQ291bnRlciA9IFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koKExBUkdFX0lOVEVHRVIqKSZjb3VudEZyZXEpOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RhcnQgdGhlIFplbiBUaW1lciBjb3VudGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfX0xaVGltZXJPbigKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBpZiAoaGF2ZVBlcmZvcm1hbmNlQ291bnRlcikKLQlRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopJnRtLT5zdGFydCk7Ci0gICAgZWxzZQotCXRtLT5zdGFydC5sb3cgPSB0aW1lR2V0VGltZSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGxhcCB0aW1lIHNpbmNlIHRoZSB0aW1lciB3YXMgc3RhcnRlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19MWlRpbWVyTGFwKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIENQVV9sYXJnZUludGVnZXIgICAgdG1MYXAsdG1Db3VudDsKLQotICAgIGlmIChoYXZlUGVyZm9ybWFuY2VDb3VudGVyKSB7Ci0JUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIqKSZ0bUxhcCk7Ci0JX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtTGFwLCZ0bUNvdW50KTsKLQlyZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsY291bnRGcmVxLmxvdyk7Ci0JfQotICAgIGVsc2UgewotCXRtTGFwLmxvdyA9IHRpbWVHZXRUaW1lKCk7Ci0JcmV0dXJuICh0bUxhcC5sb3cgLSB0bS0+c3RhcnQubG93KSAqIDEwMDBMOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdG9wIHRoZSBaZW4gVGltZXIgY291bnRpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX19MWlRpbWVyT2ZmKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIGlmIChoYXZlUGVyZm9ybWFuY2VDb3VudGVyKQotCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKikmdG0tPmVuZCk7Ci0gICAgZWxzZQotCXRtLT5lbmQubG93ID0gdGltZUdldFRpbWUoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgaW4gbWljcm9zZWNvbmRzIGJldHdlZW4gc3RhcnQgYW5kIGVuZCB0aW1pbmdzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJDb3VudCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIHRtQ291bnQ7Ci0KLSAgICBpZiAoaGF2ZVBlcmZvcm1hbmNlQ291bnRlcikgewotCV9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LCZ0bS0+ZW5kLCZ0bUNvdW50KTsKLQlyZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsY291bnRGcmVxLmxvdyk7Ci0JfQotICAgIGVsc2UKLQlyZXR1cm4gKHRtLT5lbmQubG93IC0gdG0tPnN0YXJ0LmxvdykgKiAxMDAwTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGFzIG1pY3Jvc2Vjb25kcyBwZXIgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFVMWlRJTUVSX1JFU09MVVRJT04gICAgIDEwMDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBMb25nIFBlcmlvZCB0aW1lciBmcm9tIHRoZSBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX1VMWlJlYWRUaW1lKHZvaWQpCi17IHJldHVybiB0aW1lR2V0VGltZSgpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQotd2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCi1hY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCi1wYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfX1VMWkVsYXBzZWRUaW1lKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCkKLXsgcmV0dXJuIGZpbmlzaCAtIHN0YXJ0OyB9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX2V2ZW50LmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fZXZlbnQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTYyYjFmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fZXZlbnQuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIKLTsqIEVudmlyb25tZW50OiBJQk0gUEMgKE1TIERPUykKLTsqCi07KiBEZXNjcmlwdGlvbjogQXNzZW1ibHkgbGFuZ3VhZ2Ugc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGV2ZW50IG1vZHVsZS4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIGlkZWFsCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWlmZGVmIGZsYXRtb2RlbAotCi1oZWFkZXIgIF9ldmVudCAgICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1iZWdkYXRhc2VnICBfZXZlbnQKLQotICAgIGNleHRlcm4gIF9FVlRfYmlvc1B0cixEUFRSCi0KLSAgICBjcHVibGljIF9FVlRfZGF0YVN0YXJ0Ci0KLWlmZGVmICAgVVNFX05BU00KLSVkZWZpbmUgS0JfSEVBRCAgICAgV09SRCBlc2krMDFBaCAgIDsgS2V5Ym9hcmQgYnVmZmVyIGhlYWQgaW4gQklPUyBkYXRhIGFyZWEKLSVkZWZpbmUgS0JfVEFJTCAgICAgV09SRCBlc2krMDFDaCAgIDsgS2V5Ym9hcmQgYnVmZmVyIHRhaWwgaW4gQklPUyBkYXRhIGFyZWEKLSVkZWZpbmUgS0JfU1RBUlQgICAgV09SRCBlc2krMDgwaCAgIDsgU3RhcnQgb2Yga2V5Ym9hcmQgYnVmZmVyIGluIEJJT1MgZGF0YSBhcmVhCi0lZGVmaW5lIEtCX0VORCAgICAgIFdPUkQgZXNpKzA4MmggICA7IEVuZCBvZiBrZXlib2FyZCBidWZmZXIgaW4gQklPUyBkYXRhIGFyZWEKLWVsc2UKLUtCX0hFQUQgICAgIEVRVSBXT1JEIGVzaSswMUFoICAgICAgIDsgS2V5Ym9hcmQgYnVmZmVyIGhlYWQgaW4gQklPUyBkYXRhIGFyZWEKLUtCX1RBSUwgICAgIEVRVSBXT1JEIGVzaSswMUNoICAgICAgIDsgS2V5Ym9hcmQgYnVmZmVyIHRhaWwgaW4gQklPUyBkYXRhIGFyZWEKLUtCX1NUQVJUICAgIEVRVSBXT1JEIGVzaSswODBoICAgICAgIDsgU3RhcnQgb2Yga2V5Ym9hcmQgYnVmZmVyIGluIEJJT1MgZGF0YSBhcmVhCi1LQl9FTkQgICAgICBFUVUgV09SRCBlc2krMDgyaCAgICAgICA7IEVuZCBvZiBrZXlib2FyZCBidWZmZXIgaW4gQklPUyBkYXRhIGFyZWEKLWVuZGlmCi0KLSAgICBjcHVibGljIF9FVlRfZGF0YUVuZAotCi1lbmRkYXRhc2VnICBfZXZlbnQKLQotYmVnY29kZXNlZyAgX2V2ZW50ICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi0gICAgY3B1YmxpYyBfRVZUX2NvZGVTdGFydAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgX0VWVF9nZXRLZXlDb2RlKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm5zIHRoZSBrZXkgY29kZSBmb3IgdGhlIG5leHQgYXZhaWxhYmxlIGtleSBieSBleHRyYWN0aW5nIGl0IGZyb20KLTsgdGhlIEJJT1Mga2V5Ym9hcmQgYnVmZmVyLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9FVlRfZ2V0S2V5Q29kZQotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIGVzaSxbX0VWVF9iaW9zUHRyXQotICAgICAgICB4b3IgICAgIGVieCxlYngKLSAgICAgICAgeG9yICAgICBlYXgsZWF4Ci0gICAgICAgIG1vdiAgICAgYngsW0tCX0hFQURdCi0gICAgICAgIGNtcCAgICAgYngsW0tCX1RBSUxdCi0gICAgICAgIGp6ICAgICAgQEBEb25lCi0gICAgICAgIHhvciAgICAgZWF4LGVheAotICAgICAgICBtb3YgICAgIGF4LFtlc2krZWJ4XSAgICA7IEVBWCA6PSBjaGFyYWN0ZXIgZnJvbSBrZXlib2FyZCBidWZmZXIKLSAgICAgICAgaW5jICAgICBfYngKLSAgICAgICAgaW5jICAgICBfYngKLSAgICAgICAgY21wICAgICBieCxbS0JfRU5EXSAgICAgOyBIaXQgdGhlIGVuZCBvZiB0aGUga2V5Ym9hcmQgYnVmZmVyPwotICAgICAgICBqbCAgICAgIEBAMQotICAgICAgICBtb3YgICAgIGJ4LFtLQl9TVEFSVF0KLUBAMTogICAgbW92ICAgICBbS0JfSEVBRF0sYnggICAgOyBVcGRhdGUga2V5Ym9hcmQgYnVmZmVyIGhlYWQgcG9pbnRlcgotCi1AQERvbmU6IGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBfRVZUX2Rpc2FibGVJbnQodm9pZCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm4gcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfRVZUX2Rpc2FibGVJbnQKLQotICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICA7IFB1dCBmbGFnIHdvcmQgb24gc3RhY2sKLSAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgOyBEaXNhYmxlIGludGVycnVwdHMhCi0gICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgIDsgZGVwb3NpdCBmbGFnIHdvcmQgaW4gcmV0dXJuIHJlZ2lzdGVyCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9FVlRfcmVzdG9yZUludChpbnQgcHMpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVzdG9yZSBwcm9jZXNzb3IgaW50ZXJydXB0IHN0YXR1cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfRVZUX3Jlc3RvcmVJbnQKLQotICAgICAgICBBUkcgICAgIHBzOlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AgICAgICAgICA7IFNldCB1cCBzdGFjayBmcmFtZQotICAgICAgICBwdXNoICAgIFtEV09SRCBwc10KLSAgICAgICAgcG9wZiAgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHByb2Nlc3NvciBzdGF0dXMgKGFuZCBpbnRlcnJ1cHRzKQotICAgICAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IEVWVF9yZGlueChpbnQgcG9ydCxpbnQgaW5kZXgpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkcyBhbiBpbmRleGVkIHJlZ2lzdGVyIHZhbHVlIGZyb20gYW4gSS9PIHBvcnQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgRVZUX3JkaW54Ci0KLSAgICAgICAgQVJHICAgICBwb3J0OlVJTlQsIGluZGV4OlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgbW92ICAgICBlZHgsW3BvcnRdCi0gICAgICAgIG1vdiAgICAgYWwsW0JZVEUgaW5kZXhdCi0gICAgICAgIG91dCAgICAgZHgsYWwKLSAgICAgICAgaW5jICAgICBkeAotICAgICAgICBpbiAgICAgIGFsLGR4Ci0gICAgICAgIG1vdnp4ICAgZWF4LGFsCi0gICAgICAgIHBvcCAgICAgZWJwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIEVWVF93cmlueChpbnQgcG9ydCxpbnQgaW5kZXgsaW50IHZhbHVlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgV3JpdGVzIGFuIGluZGV4ZWQgcmVnaXN0ZXIgdmFsdWUgdG8gYW4gSS9PIHBvcnQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgRVZUX3dyaW54Ci0KLSAgICAgICAgQVJHICAgICBwb3J0OlVJTlQsIGluZGV4OlVJTlQsIHZhbHVlOlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgbW92ICAgICBlZHgsW3BvcnRdCi0gICAgICAgIG1vdiAgICAgYWwsW0JZVEUgaW5kZXhdCi0gICAgICAgIG1vdiAgICAgYWgsW0JZVEUgdmFsdWVdCi0gICAgICAgIG91dCAgICAgZHgsYXgKLSAgICAgICAgcG9wICAgICBlYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLSAgICBjcHVibGljIF9FVlRfY29kZUVuZAotCi1lbmRjb2Rlc2VnICBfZXZlbnQKLQotZW5kaWYKLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX2x6dGltZXIuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19senRpbWVyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4ZWVhNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX2x6dGltZXIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgTkFTTSBvciBUQVNNIEFzc2VtYmxlcgotOyogRW52aXJvbm1lbnQ6IHNteCAzMiBiaXQgaW50ZWwgQ1BVCi07KgotOyogRGVzY3JpcHRpb246IFNNWCBkb2VzIG5vdCBzdXBwb3J0IDQ4NidzLCBzbyB0aGlzIG1vZHVsZSBpcyBub3QgbmVjZXNzYXJ5LgotOyoKLTsqICBBbGwgcmVnaXN0ZXJzIGFuZCBhbGwgZmxhZ3MgYXJlIHByZXNlcnZlZCBieSBhbGwgcm91dGluZXMsIGV4Y2VwdAotOyogIGludGVycnVwdHMgd2hpY2ggYXJlIGFsd2F5cyB0dXJuZWQgb24KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIgotCi1oZWFkZXIgICAgICBfbHp0aW1lcgotCi1iZWdkYXRhc2VnICBfbHp0aW1lcgotCi1lbmRkYXRhc2VnICBfbHp0aW1lcgotCi1iZWdjb2Rlc2VnICBfbHp0aW1lciAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi1jcHJvY3N0YXJ0ICAgTFpfZGlzYWJsZQotICAgICAgICBjbGkKLSAgICAgICAgcmV0Ci1jcHJvY2VuZAotCi1jcHJvY3N0YXJ0ICAgTFpfZW5hYmxlCi0gICAgICAgIHN0aQotICAgICAgICByZXQKLWNwcm9jZW5kCi0KLWVuZGNvZGVzZWcgIF9senRpbWVyCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX3BtLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fcG0uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzdjYjIxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fcG0uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgVEFTTSA0LjAgb3IgTkFTTQotOyogRW52aXJvbm1lbnQ6IDMyLWJpdCBTTVggZW1iZWRkZWQgc3lzdGVtcyBkZXZlbG9wbWVudAotOyoKLTsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgYXNzZW1ibHkgc3VwcG9ydCBmb3IgdGhlIFBNIGxpYnJhcnkgc3BlY2lmaWMgdG8KLTsqICAgICAgICAgICAgICBTTVguCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICAgICAgX3BtICAgICAgICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2RhdGFzZWcgIF9wbQotCi0gICAgY2V4dGVybiBfUE1fc2F2ZWREUyxVU0hPUlQKLQotaW50ZWxfaWQgICAgICAgIGRiICAiR2VudWluZUludGVsIiAgOyBJbnRlbCB2ZW5kb3IgSUQKLQotZW5kZGF0YXNlZyAgX3BtCi0KLWJlZ2NvZGVzZWcgIF9wbSAgICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZWdyZWFkKFBNU1JFR1MgKnNyZWdzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiBhbGwgc2VnbWVudCByZWdpc3RlcnMKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ZGxsMTYgUE1fc2VncmVhZAotCi0gICAgICAgIEFSRyAgICAgc3JlZ3M6RFBUUgotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIGF4LGVzCi0gICAgICAgIF9sZXMgICAgX3NpLFtzcmVnc10KLSAgICAgICAgbW92ICAgICBbX0VTIF9zaV0sYXgKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSsyXSxjcwotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzRdLHNzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krNl0sZHMKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSs4XSxmcwotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzEwXSxncwotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTsgQ3JlYXRlIGEgdGFibGUgb2YgdGhlIDI1NiBkaWZmZXJlbnQgaW50ZXJydXB0IGNhbGxzIHRoYXQgd2UgY2FuIGp1bXAKLTsgaW50bwotCi1pZmRlZiAgIFVTRV9OQVNNCi0KLSVhc3NpZ24gaW50bm8gMAotCi1pbnRUYWJsZToKLSVyZXAgICAgMjU2Ci0gICAgICAgIGRiICAgICAgMENEaAotICAgICAgICBkYiAgICAgIGludG5vCi0lYXNzaWduIGludG5vICAgaW50bm8gKyAxCi0gICAgICAgIHJldAotICAgICAgICBub3AKLSVlbmRyZXAKLQotZWxzZQotCi1pbnRubyA9IDAKLQotaW50VGFibGU6Ci0gICAgICAgIFJFUFQgICAgMjU2Ci0gICAgICAgIGRiICAgICAgMENEaAotICAgICAgICBkYiAgICAgIGludG5vCi1pbnRubyA9IGludG5vICsgMQotICAgICAgICByZXQKLSAgICAgICAgbm9wCi0gICAgICAgIEVORE0KLQotZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgX1BNX2dlbkludCAgICAtIEdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBpbnRlcnJ1cHQKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY25lYXIgICBfUE1fZ2VuSW50Ci0KLSAgICAgICAgcHVzaCAgICBfYXggICAgICAgICAgICAgICAgICAgICA7IFNhdmUgX2F4Ci0gICAgICAgIHB1c2ggICAgX2J4ICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIF9ieAotICAgICAgICBtb3YgICAgIGVieCxbVUlOVCBlc3ArMTJdICAgICAgIDsgRUJYIDo9IGludGVycnVwdCBudW1iZXIKLSAgICAgICAgbW92ICAgICBfYXgsb2Zmc2V0IGludFRhYmxlICAgICA7IFBvaW50IHRvIGludGVycnVwdCBnZW5lcmF0aW9uIHRhYmxlCi0gICAgICAgIHNobCAgICAgX2J4LDIgICAgICAgICAgICAgICAgICAgOyBfQlggOj0gaW5kZXggaW50byB0YWJsZQotICAgICAgICBhZGQgICAgIF9heCxfYnggICAgICAgICAgICAgICAgIDsgX0FYIDo9IHBvaW50ZXIgdG8gaW50ZXJydXB0IGNvZGUKLSAgICAgICAgeGNoZyAgICBlYXgsW2VzcCs0XSAgICAgICAgICAgICA7IFJlc3RvcmUgZWF4LCBhbmQgc2V0IGZvciBpbnQKLSAgICAgICAgcG9wICAgICBfYnggICAgICAgICAgICAgICAgICAgICA7IHJlc3RvcmUgX2J4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgUE1faW50Mzg2eChpbnQgaW50bm8sIFBNUkVHUyAqaW4sIFBNUkVHUyAqb3V0LFBNU1JFR1MgKnNyZWdzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSXNzdWVzIGEgc29mdHdhcmUgaW50ZXJydXB0IGluIHByb3RlY3RlZCBtb2RlLiBUaGlzIHJvdXRpbmUgaGFzIGJlZW4KLTsgd3JpdHRlbiB0byBhbGxvdyB1c2VyIHByb2dyYW1zIHRvIGxvYWQgQ1MgYW5kIERTIHdpdGggZGlmZmVyZW50IHZhbHVlcwotOyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnRkbGwxNiBQTV9pbnQzODZ4Ci0KLSAgICAgICAgQVJHICAgICBpbnRubzpVSU5ULCBpbnB0cjpEUFRSLCBvdXRwdHI6RFBUUiwgc3JlZ3M6RFBUUgotCi0gICAgICAgIExPQ0FMICAgZmxhZ3M6VUlOVCwgc3ZfZHM6VUlOVCwgc3ZfZXNpOlVMT05HID0gTG9jYWxTaXplCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBwdXNoICAgIGRzCi0gICAgICAgIHB1c2ggICAgZXMgICAgICAgICAgICAgICAgICA7IFNhdmUgc2VnbWVudCByZWdpc3RlcnMKLSAgICAgICAgcHVzaCAgICBmcwotICAgICAgICBwdXNoICAgIGdzCi0KLSAgICAgICAgX2xkcyAgICBfc2ksW3NyZWdzXSAgICAgICAgIDsgRFM6X1NJIC0+IExvYWQgc2VnbWVudCByZWdpc3RlcnMKLSAgICAgICAgbW92ICAgICBlcyxbX3NpXQotICAgICAgICBtb3YgICAgIGJ4LFtfc2krNl0KLSAgICAgICAgbW92ICAgICBbc3ZfZHNdLF9ieCAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiB1c2VyIERTIG9uIHN0YWNrCi0gICAgICAgIG1vdiAgICAgZnMsW19zaSs4XQotICAgICAgICBtb3YgICAgIGdzLFtfc2krMTBdCi0KLSAgICAgICAgX2xkcyAgICBfc2ksW2lucHRyXSAgICAgICAgIDsgTG9hZCBDUFUgcmVnaXN0ZXJzCi0gICAgICAgIG1vdiAgICAgZWF4LFtfc2ldCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfc2krNF0KLSAgICAgICAgbW92ICAgICBlY3gsW19zaSs4XQotICAgICAgICBtb3YgICAgIGVkeCxbX3NpKzEyXQotICAgICAgICBtb3YgICAgIGVkaSxbX3NpKzIwXQotICAgICAgICBtb3YgICAgIGVzaSxbX3NpKzE2XQotCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBfYnAgICAgICAgICAgICAgICAgIDsgU29tZSBpbnRlcnJ1cHRzIHRyYXNoIHRoaXMhCi0gICAgICAgIGNsYyAgICAgICAgICAgICAgICAgICAgICAgICA7IEdlbmVyYXRlIHRoZSBpbnRlcnJ1cHQKLSAgICAgICAgcHVzaCAgICBbVUlOVCBpbnRub10KLSAgICAgICAgbW92ICAgICBkcyxbV09SRCBzdl9kc10gICAgIDsgU2V0IHZhbHVlIG9mIHVzZXIncyBEUyBzZWxlY3RvcgotICAgICAgICBjYWxsICAgIF9QTV9nZW5JbnQKLSAgICAgICAgcG9wICAgICBfYnAgICAgICAgICAgICAgICAgIDsgUG9wIGludG5vIGZyb20gc3RhY2sgKGZsYWdzIHVuY2hhbmdlZCkKLSAgICAgICAgcG9wICAgICBfYnAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSB2YWx1ZSBvZiBzdGFjayBmcmFtZSBwb2ludGVyCi0gICAgICAgIHBvcCAgICAgZHMgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgdmFsdWUgb2YgRFMKLQotICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIGZsYWdzIGZvciBsYXRlcgotICAgICAgICBwb3AgICAgIFtVSU5UIGZsYWdzXQotICAgICAgICBwdXNoICAgIGVzaSAgICAgICAgICAgICAgICAgOyBTYXZlIEVTSSBmb3IgbGF0ZXIKLSAgICAgICAgcG9wICAgICBbRFdPUkQgc3ZfZXNpXQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICAgICAgOyBTYXZlIERTIGZvciBsYXRlcgotICAgICAgICBwb3AgICAgIFtVSU5UIHN2X2RzXQotCi0gICAgICAgIF9sZHMgICAgX3NpLFtvdXRwdHJdICAgICAgICA7IFNhdmUgQ1BVIHJlZ2lzdGVycwotICAgICAgICBtb3YgICAgIFtfc2ldLGVheAotICAgICAgICBtb3YgICAgIFtfc2krNF0sZWJ4Ci0gICAgICAgIG1vdiAgICAgW19zaSs4XSxlY3gKLSAgICAgICAgbW92ICAgICBbX3NpKzEyXSxlZHgKLSAgICAgICAgcHVzaCAgICBbRFdPUkQgc3ZfZXNpXQotICAgICAgICBwb3AgICAgIFtEV09SRCBfc2krMTZdCi0gICAgICAgIG1vdiAgICAgW19zaSsyMF0sZWRpCi0KLSAgICAgICAgbW92ICAgICBfYngsW2ZsYWdzXSAgICAgICAgIDsgUmV0dXJuIGZsYWdzCi0gICAgICAgIGFuZCAgICAgZWJ4LDFoICAgICAgICAgICAgICA7IElzb2xhdGUgY2FycnkgZmxhZwotICAgICAgICBtb3YgICAgIFtfc2krMjRdLGVieCAgICAgICAgOyBTYXZlIGNhcnJ5IGZsYWcgc3RhdHVzCi0KLSAgICAgICAgX2xkcyAgICBfc2ksW3NyZWdzXSAgICAgICAgIDsgU2F2ZSBzZWdtZW50IHJlZ2lzdGVycwotICAgICAgICBtb3YgICAgIFtfc2ldLGVzCi0gICAgICAgIG1vdiAgICAgX2J4LFtzdl9kc10KLSAgICAgICAgbW92ICAgICBbX3NpKzZdLGJ4ICAgICAgICAgIDsgR2V0IHJldHVybmVkIERTIGZyb20gc3RhY2sKLSAgICAgICAgbW92ICAgICBbX3NpKzhdLGZzCi0gICAgICAgIG1vdiAgICAgW19zaSsxMF0sZ3MKLQotICAgICAgICBwb3AgICAgIGdzICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHNlZ21lbnQgcmVnaXN0ZXJzCi0gICAgICAgIHBvcCAgICAgZnMKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fc2F2ZURTKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBTYXZlIHRoZSB2YWx1ZSBvZiBEUyBpbnRvIGEgc2VjdGlvbiBvZiB0aGUgY29kZSBzZWdtZW50LCBzbyB0aGF0IHdlIGNhbgotOyBxdWlja2x5IGxvYWQgdGhpcyB2YWx1ZSBhdCBhIGxhdGVyIGRhdGUgaW4gdGhlIFBNX2xvYWREUygpIHJvdXRpbmUgZnJvbQotOyBpbnNpZGUgaW50ZXJydXB0IGhhbmRsZXJzIGV0Yy4gVGhlIG1ldGhvZCB0byBkbyB0aGlzIGlzIGRpZmZlcmVudAotOyBkZXBlbmRpbmcgb24gdGhlIERPUyBleHRlbmRlciBiZWluZyB1c2VkLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnRkbGwxNiBQTV9zYXZlRFMKLQotICAgICAgICBtb3YgICAgIFtfUE1fc2F2ZWREU10sZHMgICAgOyBTdG9yZSBhd2F5IGluIGRhdGEgc2VnbWVudAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9sb2FkRFModm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJvdXRpbmUgdG8gbG9hZCB0aGUgRFMgcmVnaXN0ZXIgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQKLTsgRE9TIGV4dGVuZGVyLiBPbmx5IHRoZSBEUyByZWdpc3RlciBpcyBsb2FkZWQsIG5vdCB0aGUgRVMgcmVnaXN0ZXIsIHNvCi07IGlmIHlvdSB3aXNoIHRvIGNhbGwgQyBjb2RlLCB5b3Ugd2lsbCBuZWVkIHRvIGFsc28gbG9hZCB0aGUgRVMgcmVnaXN0ZXIKLTsgaW4gMzIgYml0IHByb3RlY3RlZCBtb2RlLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnRkbGwxNiBQTV9sb2FkRFMKLQotICAgICAgICBtb3YgICAgIGRzLFtjczpfUE1fc2F2ZWREU10gOyBXZSBjYW4gYWNjZXNzIHRoZSBwcm9wZXIgRFMgdGhyb3VnaCBDUwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZXRCYW5rQShpbnQgYmFuaykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgICAgUE1fc2V0QmFua0EKLQotICAgICAgICBBUkcgICAgIGJhbms6VUlOVAotCi0gICAgICAgIHB1c2ggICAgZWJwCi0gICAgICAgIG1vdiAgICAgZWJwLGVzcAotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBtb3YgICAgIF9ieCwwCi0gICAgICAgIG1vdiAgICAgX2F4LDRGMDVoCi0gICAgICAgIG1vdiAgICAgX2R4LFtiYW5rXQotICAgICAgICBpbnQgICAgIDEwaAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZXRCYW5rQUIoaW50IGJhbmspCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgICAgIFBNX3NldEJhbmtBQgotCi0gICAgICAgIEFSRyAgICAgYmFuazpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBlYnAKLSAgICAgICAgbW92ICAgICBlYnAsZXNwCi0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIG1vdiAgICAgX2J4LDAKLSAgICAgICAgbW92ICAgICBfYXgsNEYwNWgKLSAgICAgICAgbW92ICAgICBfZHgsW2JhbmtdCi0gICAgICAgIGludCAgICAgMTBoCi0gICAgICAgIG1vdiAgICAgX2J4LDEKLSAgICAgICAgbW92ICAgICBfYXgsNEYwNWgKLSAgICAgICAgbW92ICAgICBfZHgsW2JhbmtdCi0gICAgICAgIGludCAgICAgMTBoCi0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIHBvcCAgICAgZWJwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NldENSVFN0YXJ0KGludCB4LGludCB5LGludCB3YWl0VlJUKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgICAgICBQTV9zZXRDUlRTdGFydAotCi0gICAgICAgIEFSRyAgICAgeDpVSU5ULCB5OlVJTlQsIHdhaXRWUlQ6VUlOVAotCi0gICAgICAgIHB1c2ggICAgZWJwCi0gICAgICAgIG1vdiAgICAgZWJwLGVzcAotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBtb3YgICAgIF9ieCxbd2FpdFZSVF0KLSAgICAgICAgbW92ICAgICBfY3gsW3hdCi0gICAgICAgIG1vdiAgICAgX2R4LFt5XQotICAgICAgICBtb3YgICAgIF9heCw0RjA3aAotICAgICAgICBpbnQgICAgIDEwaAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IF9QTV9pbnAoaW50IHBvcnQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkcyBhIGJ5dGUgZnJvbSB0aGUgc3BlY2lmaWVkIHBvcnQKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1faW5wCi0KLSAgICAgICAgQVJHICAgICBwb3J0OlVJTlQKLQotICAgICAgICBwdXNoICAgIF9icAotICAgICAgICBtb3YgICAgIF9icCxfc3AKLSAgICAgICAgeG9yICAgICBfYXgsX2F4Ci0gICAgICAgIG1vdiAgICAgX2R4LFtwb3J0XQotICAgICAgICBpbiAgICAgIGFsLGR4Ci0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9QTV9vdXRwKGludCBwb3J0LGludCB2YWx1ZSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFdyaXRlIGEgYnl0ZSB0byB0aGUgc3BlY2lmaWVkIHBvcnQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX291dHAKLQotICAgICAgICBBUkcgICAgIHBvcnQ6VUlOVCwgdmFsdWU6VUlOVAotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBtb3YgICAgIF9keCxbcG9ydF0KLSAgICAgICAgbW92ICAgICBfYXgsW3ZhbHVlXQotICAgICAgICBvdXQgICAgIGR4LGFsCi0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07IE1hY3JvIHRvIGRlbGF5IGJyaWVmbHkgdG8gZW5zdXJlIHRoYXQgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgYmV0d2VlbgotOyBzdWNjZXNzaXZlIEkvTyBhY2Nlc3NlcyBzbyB0aGF0IHRoZSBkZXZpY2UgYmVpbmcgYWNjZXNzZWQgY2FuIHJlc3BvbmQKLTsgdG8gYm90aCBhY2Nlc3NlcyBldmVuIG9uIGEgdmVyeSBmYXN0IFBDLgotCi1pZmRlZiAgIFVTRV9OQVNNCi0lbWFjcm8gIERFTEFZIDAKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSVlbmRtYWNybwotJW1hY3JvICBJT0RFTEFZTiAxCi0lcmVwICAgICUxCi0gICAgICAgIERFTEFZCi0lZW5kcmVwCi0lZW5kbWFjcm8KLWVsc2UKLW1hY3JvICAgREVMQVkKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLWVuZG0KLW1hY3JvICAgSU9ERUxBWU4gICAgTgotICAgIHJlcHQgICAgTgotICAgICAgICBERUxBWQotICAgIGVuZG0KLWVuZG0KLWVuZGlmCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVjaGFyIF9QTV9yZWFkQ01PUyhpbnQgaW5kZXgpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIENNT1MgcmVnaXN0ZXIuIFdlIGRvIHRoaXMgd2l0aCBib3RoCi07IG5vcm1hbCBpbnRlcnJ1cHRzIGFuZCBOTUkgZGlzYWJsZWQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3JlYWRDTU9TCi0KLSAgICAgICAgQVJHICAgICBpbmRleDpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIHB1c2hmZAotICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQotICAgICAgICBvciAgICAgIGFsLDgwaCAgICAgICAgICAgICAgOyBBZGQgZGlzYWJsZSBOTUkgZmxhZwotICAgICAgICBjbGkKLSAgICAgICAgb3V0ICAgICA3MGgsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBpbiAgICAgIGFsLDcxaAotICAgICAgICBtb3YgICAgIGFoLGFsCi0gICAgICAgIHhvciAgICAgYWwsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZS1lbmFibGUgTk1JCi0gICAgICAgIHN0aQotICAgICAgICBtb3YgICAgIGFsLGFoICAgICAgICAgICAgICAgOyBSZXR1cm4gdmFsdWUgaW4gQUwKLSAgICAgICAgcG9wZmQKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX1BNX3dyaXRlQ01PUyhpbnQgaW5kZXgsdWNoYXIgdmFsdWUpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIENNT1MgcmVnaXN0ZXIuIFdlIGRvIHRoaXMgd2l0aCBib3RoCi07IG5vcm1hbCBpbnRlcnJ1cHRzIGFuZCBOTUkgZGlzYWJsZWQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3dyaXRlQ01PUwotCi0gICAgICAgIEFSRyAgICAgaW5kZXg6VUlOVCwgdmFsdWU6VUNIQVIKLQotICAgICAgICBwdXNoICAgIF9icAotICAgICAgICBtb3YgICAgIF9icCxfc3AKLSAgICAgICAgcHVzaGZkCi0gICAgICAgIG1vdiAgICAgYWwsW0JZVEUgaW5kZXhdCi0gICAgICAgIG9yICAgICAgYWwsODBoICAgICAgICAgICAgICA7IEFkZCBkaXNhYmxlIE5NSSBmbGFnCi0gICAgICAgIGNsaQotICAgICAgICBvdXQgICAgIDcwaCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIG1vdiAgICAgYWwsW3ZhbHVlXQotICAgICAgICBvdXQgICAgIDcxaCxhbAotICAgICAgICB4b3IgICAgIGFsLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmUtZW5hYmxlIE5NSQotICAgICAgICBzdGkKLSAgICAgICAgcG9wZmQKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IF9QTV9nZXRQREIgLSBSZXR1cm4gdGhlIFBhZ2UgVGFibGUgRGlyZWN0b3J5IEJhc2UgYWRkcmVzcwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9nZXRQREIKLQotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgYW5kICAgICBlYXgsMEZGRkZGMDAwaAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgX1BNX2ZsdXNoVExCIC0gRmx1c2ggdGhlIFRyYW5zbGF0aW9uIExvb2thc2lkZSBidWZmZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9mbHVzaFRMQgotCi0gICAgICAgIHdiaW52ZCAgICAgICAgICAgICAgICAgIDsgRmx1c2ggdGhlIENQVSBjYWNoZQotICAgICAgICBtb3YgICAgIGVheCxjcjMgICAgICAgICAKLSAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgOyBGbHVzaCB0aGUgVExCCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfcG0KLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fcG1zbXguYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19wbXNteC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNTJjZTMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19wbXNteC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw5MzMgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogMzItYml0IFNNWCBlbWJlZGRlZCBzeXN0ZW1zIGRldmVsb3BtZW50Ci07KgotOyogRGVzY3JpcHRpb246IExvdyBsZXZlbCBhc3NlbWJseSBzdXBwb3J0IGZvciB0aGUgUE0gbGlicmFyeSBzcGVjaWZpYyB0bwotOyogICAgICAgICAgICAgIFNNWCBpbnRlcnJ1cHQgaGFuZGxpbmcuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1oZWFkZXIgICAgICBfcG1zbXggICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi07IERlZmluZSB0aGUgc2l6ZSBvZiBvdXIgbG9jYWwgc3RhY2tzLiBGb3IgcmVhbCBtb2RlIGNvZGUgdGhleSBjYW50IGJlCi07IHRoYXQgYmlnLCBidXQgZm9yIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZSBjb2RlIHdlIGNhbiBtYWtlIHRoZW0gbmljZSBhbmQKLTsgbGFyZ2Ugc28gdGhhdCBjb21wbGV4IEMgZnVuY3Rpb25zIGNhbiBiZSB1c2VkLgotCi1NT1VTRV9TVEFDSyBFUVUgNDA5NgotVElNRVJfU1RBQ0sgRVFVIDQwOTYKLUtFWV9TVEFDSyAgIEVRVSAxMDI0Ci1JTlQxMF9TVEFDSyBFUVUgMTAyNAotCi1pZmRlZiAgIFVTRV9OQVNNCi0KLTsgTWFjcm8gdG8gbG9hZCBEUyBhbmQgRVMgcmVnaXN0ZXJzIHdpdGggY29ycmVjdCB2YWx1ZS4KLQotJWltYWNybyAgIExPQURfRFMgMAotICAgICAgICBtb3YgICAgIGRzLFtjczpfUE1fc2F2ZWREU10KLSAgICAgICAgbW92ICAgICBlcyxbY3M6X1BNX3NhdmVkRFNdCi0lZW5kbWFjcm8KLQotOyBOb3RlIHRoYXQgaW50ZXJydXB0cyB3ZSBkaXNhYmxlIGludGVycnVwdHMgZHVyaW5nIHRoZSBmb2xsb3dpbmcgc3RhY2sKLTsgJWltYWNybyBmb3IgY29ycmVjdCBvcGVyYXRpb24sIGJ1dCB3ZSBkbyBub3QgZW5hYmxlIHRoZW0gYWdhaW4uIE5vcm1hbGx5Ci07IHRoZXNlICVpbWFjcm9zIGFyZSB1c2VkIHdpdGhpbiBpbnRlcnJ1cHQgaGFuZGxlcnMgc28gaW50ZXJydXB0cyBzaG91bGQKLTsgYWxyZWFkeSBiZSBvZmYuIFdlIHR1cm4gdGhlbSBiYWNrIG9uIGV4cGxpY2l0bHkgbGF0ZXIgaWYgdGhlIHVzZXIgY29kZQotOyBuZWVkcyB0aGVtIHRvIGJlIGJhY2sgb24uCi0KLTsgTWFjcm8gdG8gc3dpdGNoIHRvIGEgbmV3IGxvY2FsIHN0YWNrLgotCi0laW1hY3JvIE5FV1NUSyAgMQotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBbc2VnXyUxXSxzcwotICAgICAgICBtb3YgICAgIFtwdHJfJTFdLF9zcAotICAgICAgICBtb3YgICAgIFtUZW1wU2VnXSxkcwotICAgICAgICBtb3YgICAgIHNzLFtUZW1wU2VnXQotICAgICAgICBtb3YgICAgIF9zcCxvZmZzZXQgJTEKLSVlbmRtYWNybwotCi07ICVpbWFjcm8gdG8gc3dpdGNoIGJhY2sgdG8gdGhlIG9sZCBzdGFjay4KLQotJWltYWNybyAgIFJFU1RTVEsgICAxCi0gICAgICAgIGNsaQotICAgICAgICBtb3YgICAgIHNzLFtzZWdfJTFdCi0gICAgICAgIG1vdiAgICAgX3NwLFtwdHJfJTFdCi0lZW5kbWFjcm8KLQotOyAlaW1hY3JvIHRvIHN3YXAgdGhlIGN1cnJlbnQgc3RhY2sgd2l0aCB0aGUgb25lIHNhdmVkIGF3YXkuCi0KLSVpbWFjcm8gU1dBUFNUSyAxCi0gICAgICAgIGNsaQotICAgICAgICBtb3YgICAgIGF4LHNzCi0gICAgICAgIHhjaGcgICAgYXgsW3NlZ18lMV0KLSAgICAgICAgbW92ICAgICBzcyxheAotICAgICAgICB4Y2hnICAgIF9zcCxbcHRyXyUxXQotJWVuZG1hY3JvCi0KLWVsc2UKLQotOyBNYWNybyB0byBsb2FkIERTIGFuZCBFUyByZWdpc3RlcnMgd2l0aCBjb3JyZWN0IHZhbHVlLgotCi1NQUNSTyAgIExPQURfRFMKLSAgICAgICAgbW92ICAgICBkcyxbY3M6X1BNX3NhdmVkRFNdCi0gICAgICAgIG1vdiAgICAgZXMsW2NzOl9QTV9zYXZlZERTXQotRU5ETQotCi07IE5vdGUgdGhhdCBpbnRlcnJ1cHRzIHdlIGRpc2FibGUgaW50ZXJydXB0cyBkdXJpbmcgdGhlIGZvbGxvd2luZyBzdGFjawotOyBtYWNybyBmb3IgY29ycmVjdCBvcGVyYXRpb24sIGJ1dCB3ZSBkbyBub3QgZW5hYmxlIHRoZW0gYWdhaW4uIE5vcm1hbGx5Ci07IHRoZXNlIG1hY3JvcyBhcmUgdXNlZCB3aXRoaW4gaW50ZXJydXB0IGhhbmRsZXJzIHNvIGludGVycnVwdHMgc2hvdWxkCi07IGFscmVhZHkgYmUgb2ZmLiBXZSB0dXJuIHRoZW0gYmFjayBvbiBleHBsaWNpdGx5IGxhdGVyIGlmIHRoZSB1c2VyIGNvZGUKLTsgbmVlZHMgdGhlbSB0byBiZSBiYWNrIG9uLgotCi07IE1hY3JvIHRvIHN3aXRjaCB0byBhIG5ldyBsb2NhbCBzdGFjay4KLQotTUFDUk8gICBORVdTVEsgIHN0a25hbWUKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgW3NlZ18mc3RrbmFtZSZdLHNzCi0gICAgICAgIG1vdiAgICAgW3B0cl8mc3RrbmFtZSZdLF9zcAotICAgICAgICBtb3YgICAgIFtUZW1wU2VnXSxkcwotICAgICAgICBtb3YgICAgIHNzLFtUZW1wU2VnXQotICAgICAgICBtb3YgICAgIF9zcCxvZmZzZXQgc3RrbmFtZQotRU5ETQotCi07IE1hY3JvIHRvIHN3aXRjaCBiYWNrIHRvIHRoZSBvbGQgc3RhY2suCi0KLU1BQ1JPICAgUkVTVFNUSyBzdGtuYW1lCi0gICAgICAgIGNsaQotICAgICAgICBtb3YgICAgIHNzLFtzZWdfJnN0a25hbWUmXQotICAgICAgICBtb3YgICAgIF9zcCxbcHRyXyZzdGtuYW1lJl0KLUVORE0KLQotOyBNYWNybyB0byBzd2FwIHRoZSBjdXJyZW50IHN0YWNrIHdpdGggdGhlIG9uZSBzYXZlZCBhd2F5LgotCi1NQUNSTyAgIFNXQVBTVEsgc3RrbmFtZQotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBheCxzcwotICAgICAgICB4Y2hnICAgIGF4LFtzZWdfJnN0a25hbWUmXQotICAgICAgICBtb3YgICAgIHNzLGF4Ci0gICAgICAgIHhjaGcgICAgX3NwLFtwdHJfJnN0a25hbWUmXQotRU5ETQotCi1lbmRpZgotCi1iZWdkYXRhc2VnICBfcG1zbXgKLQotICAgIGNleHRlcm4gX1BNX3NhdmVkRFMsVVNIT1JUCi0gICAgY2V4dGVybiBfUE1fY3JpdEhhbmRsZXIsQ1BUUgotICAgIGNleHRlcm4gX1BNX2JyZWFrSGFuZGxlcixDUFRSCi0gICAgY2V4dGVybiBfUE1fdGltZXJIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV9ydGNIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV9rZXlIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV9rZXkxNUhhbmRsZXIsQ1BUUgotICAgIGNleHRlcm4gX1BNX21vdXNlSGFuZGxlcixDUFRSCi0gICAgY2V4dGVybiBfUE1faW50MTBIYW5kbGVyLENQVFIKLQotICAgIGNleHRlcm4gX1BNX2N0cmxDUHRyLERQVFIKLSAgICBjZXh0ZXJuIF9QTV9jdHJsQlB0cixEUFRSCi0gICAgY2V4dGVybiBfUE1fY3JpdFB0cixEUFRSCi0KLSAgICBjZXh0ZXJuIF9QTV9wcmV2VGltZXIsRkNQVFIKLSAgICBjZXh0ZXJuIF9QTV9wcmV2UlRDLEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldktleSxGQ1BUUgotICAgIGNleHRlcm4gX1BNX3ByZXZLZXkxNSxGQ1BUUgotICAgIGNleHRlcm4gX1BNX3ByZXZCcmVhayxGQ1BUUgotICAgIGNleHRlcm4gX1BNX3ByZXZDdHJsQyxGQ1BUUgotICAgIGNleHRlcm4gX1BNX3ByZXZDcml0aWNhbCxGQ1BUUgotICAgIGNleHRlcm4gX1BNX3ByZXZSZWFsVGltZXIsVUxPTkcKLSAgICBjZXh0ZXJuIF9QTV9wcmV2UmVhbFJUQyxVTE9ORwotICAgIGNleHRlcm4gX1BNX3ByZXZSZWFsS2V5LFVMT05HCi0gICAgY2V4dGVybiBfUE1fcHJldlJlYWxLZXkxNSxVTE9ORwotICAgIGNleHRlcm4gX1BNX3ByZXZSZWFsSW50MTAsVUxPTkcKLQotY3B1YmxpYyBfUE1fcG1zbXhEYXRhU3RhcnQKLQotOyBBbGxvY2F0ZSBzcGFjZSBmb3IgYWxsIG9mIHRoZSBsb2NhbCBzdGFja3MgdGhhdCB3ZSBuZWVkLiBUaGVzZSBzdGFja3MKLTsgYXJlIG5vdCB2ZXJ5IGxhcmdlLCBidXQgc2hvdWxkIGJlIGxhcmdlIGVub3VnaCBmb3IgbW9zdCBwdXJwb3NlcwotOyAoZ2VuZXJhbGx5IHlvdSB3YW50IHRvIGhhbmRsZSB0aGVzZSBpbnRlcnJ1cHRzIHF1aWNrbHksIHNpbXBseSBzdG9yaW5nCi07IHRoZSBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgYW5kIHRoZW4gcmV0dXJuaW5nKS4gSWYgeW91IG5lZWQgYmlnZ2VyCi07IHN0YWNrcyB0aGVuIGNoYW5nZSB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gaGVyZS4KLQotICAgICAgICAgICAgQUxJR04gICA0Ci0gICAgICAgICAgICBkY2xiIE1PVVNFX1NUQUNLICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKLU1zU3RhY2s6ICAgICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQotcHRyX01zU3RhY2sgRFVJTlQgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKLXNlZ19Nc1N0YWNrIGR3ICAgICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAotCi0gICAgICAgICAgICBBTElHTiAgIDQKLSAgICAgICAgICAgIGRjbGIgSU5UMTBfU1RBQ0sgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQotSW50MTBTdGFjazogICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCi1wdHJfSW50MTBTdGFjayAgRFVJTlQgICAwICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAotc2VnX0ludDEwU3RhY2sgIGR3ICAgICAgMCAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50Ci0KLSAgICAgICAgICAgIEFMSUdOICAgNAotICAgICAgICAgICAgZGNsYiBUSU1FUl9TVEFDSyAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCi1UbVN0YWNrOiAgICAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKLXB0cl9UbVN0YWNrIERVSU5UICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0Ci1zZWdfVG1TdGFjayBkdyAgICAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKLQotICAgICAgICAgICAgQUxJR04gICA0Ci0gICAgICAgICAgICBkY2xiIFRJTUVSX1NUQUNLICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKLVJ0Y1N0YWNrOiAgICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQotcHRyX1J0Y1N0YWNrIERVSU5UICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKLXNlZ19SdGNTdGFjayBkdyAgICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAotUnRjSW5zaWRlICAgZHcgICAgICAwICAgICAgICAgICA7IEFyZSB3ZSBzdGlsbCBoYW5kbGluZyBjdXJyZW50IGludGVycnVwdAotCi0gICAgICAgICAgICBBTElHTiAgIDQKLSAgICAgICAgICAgIGRjbGIgS0VZX1NUQUNLICAgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQotS3lTdGFjazogICAgICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCi1wdHJfS3lTdGFjayBEVUlOVCAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAotc2VnX0t5U3RhY2sgZHcgICAgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50Ci1LeUluc2lkZSAgICBkdyAgICAgIDAgICAgICAgICAgIDsgQXJlIHdlIHN0aWxsIGhhbmRsaW5nIGN1cnJlbnQgaW50ZXJydXB0Ci0KLSAgICAgICAgICAgIEFMSUdOICAgNAotICAgICAgICAgICAgZGNsYiBLRVlfU1RBQ0sgICAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCi1LeTE1U3RhY2s6ICAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKLXB0cl9LeTE1U3RhY2sgICBEVUlOVCAgIDAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0Ci1zZWdfS3kxNVN0YWNrICAgZHcgICAgICAwICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKLQotVGVtcFNlZyAgICAgZHcgICAgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIHN0YWNrIHNlZ21lbnQKLQotY3B1YmxpYyBfUE1fcG1zbXhEYXRhRW5kCi0KLWVuZGRhdGFzZWcgIF9wbXNteAotCi1iZWdjb2Rlc2VnICBfcG1zbXggICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLWNwdWJsaWMgX1BNX3Btc214Q29kZVN0YXJ0Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX21vdXNlSVNSIC0gTW91c2UgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSW50ZXJydXB0IHN1YnJvdXRpbmUgY2FsbGVkIGJ5IHRoZSBtb3VzZSBkcml2ZXIgdXBvbiBpbnRlcnJ1cHRzLCB0bwotOyBkaXNwYXRjaCBjb250cm9sIHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gSW50ZXJydXB0cyBhcmUgb24KLTsgd2hlbiB3ZSBjYWxsIHRoZSB1c2VyIGNvZGUuCi07Ci07IEl0IGlzIF9leHRyZW1lbHlfIGltcG9ydGFudCB0byBzYXZlIHRoZSBzdGF0ZSBvZiB0aGUgZXh0ZW5kZWQgcmVnaXN0ZXJzCi07IGFzIHRoZXNlIG1heSB3ZWxsIGJlIHRyYXNoZWQgYnkgdGhlIHJvdXRpbmVzIGNhbGxlZCBmcm9tIGhlcmUgYW5kIG5vdAotOyByZXN0b3JlZCBjb3JyZWN0bHkgYnkgdGhlIG1vdXNlIGludGVyZmFjZSBtb2R1bGUuCi07Ci07IE5PVEU6IFRoaXMgcm91dGluZSBzd2l0Y2hlcyB0byBhIGxvY2FsIHN0YWNrIGJlZm9yZSBjYWxsaW5nIGFueSBDIGNvZGUsCi07ICAgICAgIGFuZCBoZW5jZSBpcyBfbm90XyByZS1lbnRyYW50LiBGb3IgbW91c2UgaGFuZGxlcnMgdGhpcyBpcyBub3QgYQotOyAgICAgICBwcm9ibGVtLCBhcyB0aGUgbW91c2UgZHJpdmVyIGFyYml0cmF0ZXMgY2FsbHMgdG8gdGhlIHVzZXIgbW91c2UKLTsgICAgICAgaGFuZGxlciBmb3IgdXMuCi07Ci07IEVudHJ5OiAgICBBWCAgLSBDb25kaXRpb24gbWFzayBnaXZpbmcgcmVhc29uIGZvciBjYWxsCi07ICAgICAgICAgICBCWCAgLSBNb3VzZSBidXR0b24gc3RhdGUKLTsgICAgICAgICAgIENYICAtIEhvcml6b250YWwgY3Vyc29yIGNvb3JkaW5hdGUKLTsgICAgICAgICAgIERYICAtIFZlcnRpY2FsIGN1cnNvciBjb29yZGluYXRlCi07ICAgICAgICAgICBTSSAgLSBIb3Jpem9udGFsIG1pY2tleSB2YWx1ZQotOyAgICAgICAgICAgREkgIC0gVmVydGljYWwgbWlja2V5IHZhbHVlCi07Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX21vdXNlSVNSCi0KLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcHVzaGFkICAgICAgICAgICAgICAgICAgOyBTYXZlIF9hbGxfIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCi0KLSAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi0gICAgICAgIE5FV1NUSyAgTXNTdGFjayAgICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCi0KLTsgQ2FsbCB0aGUgaW5zdGFsbGVkIGhpZ2ggbGV2ZWwgQyBjb2RlIHJvdXRpbmUKLQotICAgICAgICBjbHJoaSAgIGR4ICAgICAgICAgICAgICA7IENsZWFyIG91dCBoaWdoIG9yZGVyIHZhbHVlcwotICAgICAgICBjbHJoaSAgIGN4Ci0gICAgICAgIGNscmhpICAgYngKLSAgICAgICAgY2xyaGkgICBheAotICAgICAgICBzZ25oaSAgIHNpCi0gICAgICAgIHNnbmhpICAgZGkKLQotICAgICAgICBwdXNoICAgIF9kaQotICAgICAgICBwdXNoICAgIF9zaQotICAgICAgICBwdXNoICAgIF9keAotICAgICAgICBwdXNoICAgIF9jeAotICAgICAgICBwdXNoICAgIF9ieAotICAgICAgICBwdXNoICAgIF9heAotICAgICAgICBzdGkgICAgICAgICAgICAgICAgICAgICA7IEVuYWJsZSBpbnRlcnJ1cHRzCi0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX21vdXNlSGFuZGxlcl0KLSAgICAgICAgX2FkZCAgICBzcCwxMiwyNAotCi0gICAgICAgIFJFU1RTVEsgTXNTdGFjayAgICAgICAgIDsgUmVzdG9yZSBwcmV2aW91cyBzdGFjawotCi0gICAgICAgIHBvcGFkICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICByZXQgICAgICAgICAgICAgICAgICAgICA7IFdlIGFyZSBkb25lISEKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fdGltZXJJU1IgLSBUaW1lciBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHRpbWVyIGludGVycnVwdCwgdG8gZGlzcGF0Y2ggY29udHJvbAotOyB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbCByZWdpc3RlcnMKLTsgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIEludGVycnVwdHMgYXJlICpvZmYqCi07IHdoZW4gd2UgY2FsbCB0aGUgdXNlciBjb2RlLgotOwotOyBOT1RFOiBUaGlzIHJvdXRpbmUgc3dpdGNoZXMgdG8gYSBsb2NhbCBzdGFjayBiZWZvcmUgY2FsbGluZyBhbnkgQyBjb2RlLAotOyAgICAgICBhbmQgaGVuY2UgaXMgX25vdF8gcmUtZW50cmFudC4gTWFrZSBzdXJlIHlvdXIgQyBjb2RlIGV4ZWN1dGVzIGFzCi07ICAgICAgIHF1aWNrbHkgYXMgcG9zc2libGUsIHNpbmNlIGEgdGltZXIgb3ZlcnJ1biB3aWxsIHNpbXBseSBoYW5nIHRoZQotOyAgICAgICBzeXN0ZW0uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX3RpbWVySVNSCi0KLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcHVzaGFkICAgICAgICAgICAgICAgICAgOyBTYXZlIF9hbGxfIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCi0KLSAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi0KLSAgICAgICAgTkVXU1RLICBUbVN0YWNrICAgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fdGltZXJIYW5kbGVyXQotICAgICAgICBSRVNUU1RLIFRtU3RhY2sgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKLQotICAgICAgICBwb3BhZCAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgYWxsIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fY2hhaW5QcmV2VGltZXIgLSBDaGFpbiB0byBwcmV2aW91cyB0aW1lciBpbnRlcnJ1cHQgYW5kIHJldHVybgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2hhaW5zIHRvIHRoZSBwcmV2aW91cyB0aW1lciBpbnRlcnJ1cHQgcm91dGluZSBhbmQgcmV0dXJucyBjb250cm9sCi07IGJhY2sgdG8gdGhlIGhpZ2ggbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fY2hhaW5QcmV2VGltZXIKLQotaWZkZWYgICBUTlQKLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgcHVzaCAgICBlY3gKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAotICAgICAgICBtb3YgICAgIGF4LDI1MEVoICAgICAgICA7IENhbGwgcmVhbCBtb2RlIHByb2NlZHVyZSBmdW5jdGlvbgotICAgICAgICBtb3YgICAgIGVieCxbX1BNX3ByZXZSZWFsVGltZXJdCi0gICAgICAgIG1vdiAgICAgZWN4LDEgICAgICAgICAgIDsgQ29weSByZWFsIG1vZGUgZmxhZ3MgdG8gcmVhbCBtb2RlIHN0YWNrCi0gICAgICAgIGludCAgICAgMjFoICAgICAgICAgICAgIDsgQ2FsbCB0aGUgcmVhbCBtb2RlIGNvZGUKLSAgICAgICAgcG9wZmQKLSAgICAgICAgcG9wICAgICBlY3gKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgcmV0Ci1lbHNlCi0gICAgICAgIFNXQVBTVEsgVG1TdGFjayAgICAgICAgIDsgU3dhcCBiYWNrIHRvIHByZXZpb3VzIHN0YWNrCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBzdGF0ZSBvZiBpbnRlcnJ1cHQgZmxhZwotICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0Ci1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgZmFyIGR3b3JkIFtfUE1fcHJldlRpbWVyXQotZWxzZQotICAgICAgICBjYWxsICAgIFtfUE1fcHJldlRpbWVyXQotZW5kaWYKLSAgICAgICAgcG9wZiAgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHN0YXRlIG9mIGludGVycnVwdCBmbGFnCi0gICAgICAgIFNXQVBTVEsgVG1TdGFjayAgICAgICAgIDsgU3dhcCBiYWNrIHRvIEMgc3RhY2sgYWdhaW4KLSAgICAgICAgcmV0Ci1lbmRpZgotCi1jcHJvY2VuZAotCi07IE1hY3JvIHRvIGRlbGF5IGJyaWVmbHkgdG8gZW5zdXJlIHRoYXQgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgYmV0d2VlbgotOyBzdWNjZXNzaXZlIEkvTyBhY2Nlc3NlcyBzbyB0aGF0IHRoZSBkZXZpY2UgYmVpbmcgYWNjZXNzZWQgY2FuIHJlc3BvbmQKLTsgdG8gYm90aCBhY2Nlc3NlcyBldmVuIG9uIGEgdmVyeSBmYXN0IFBDLgotCi1pZmRlZiAgIFVTRV9OQVNNCi0lbWFjcm8gIERFTEFZIDAKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSVlbmRtYWNybwotJW1hY3JvICBJT0RFTEFZTiAxCi0lcmVwICAgICUxCi0gICAgICAgIERFTEFZCi0lZW5kcmVwCi0lZW5kbWFjcm8KLWVsc2UKLW1hY3JvICAgREVMQVkKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLWVuZG0KLW1hY3JvICAgSU9ERUxBWU4gICAgTgotICAgIHJlcHQgICAgTgotICAgICAgICBERUxBWQotICAgIGVuZG0KLWVuZG0KLWVuZGlmCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX3J0Y0lTUiAtIFJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHRpbWVyIGludGVycnVwdCwgdG8gZGlzcGF0Y2ggY29udHJvbAotOyB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbCByZWdpc3RlcnMKLTsgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIEludGVycnVwdHMgYXJlICpvZmYqCi07IHdoZW4gd2UgY2FsbCB0aGUgdXNlciBjb2RlLgotOwotOyBOT1RFOiBUaGlzIHJvdXRpbmUgc3dpdGNoZXMgdG8gYSBsb2NhbCBzdGFjayBiZWZvcmUgY2FsbGluZyBhbnkgQyBjb2RlLAotOyAgICAgICBhbmQgaGVuY2UgaXMgX25vdF8gcmUtZW50cmFudC4gTWFrZSBzdXJlIHlvdXIgQyBjb2RlIGV4ZWN1dGVzIGFzCi07ICAgICAgIHF1aWNrbHkgYXMgcG9zc2libGUsIHNpbmNlIGEgdGltZXIgb3ZlcnJ1biB3aWxsIHNpbXBseSBoYW5nIHRoZQotOyAgICAgICBzeXN0ZW0uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX3J0Y0lTUgotCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoYWQgICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIF9hbGxfIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZwotCi07IENsZWFyIHByaW9yaXR5IGludGVycnVwdCBjb250cm9sbGVyIGFuZCByZS1lbmFibGUgaW50ZXJydXB0cyBzbyB3ZQotOyBkb250IGxvY2sgdGhpbmdzIHVwIGZvciBsb25nLgotCi0gICAgICAgIG1vdiAgICAgYWwsMjBoCi0gICAgICAgIG91dCAgICAgMEEwaCxhbAotICAgICAgICBvdXQgICAgIDAyMGgsYWwKLQotOyBDbGVhciByZWFsLXRpbWUgY2xvY2sgdGltZW91dAotCi0gICAgICAgIGluICAgICAgYWwsNzBoICAgICAgICAgICAgICA7IFJlYWQgQ01PUyBpbmRleCByZWdpc3RlcgotICAgICAgICBwdXNoICAgIF9heCAgICAgICAgICAgICAgICAgOyAgYW5kIHNhdmUgZm9yIGxhdGVyCi0gICAgICAgIElPREVMQVlOIDMKLSAgICAgICAgbW92ICAgICBhbCwwQ2gKLSAgICAgICAgb3V0ICAgICA3MGgsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBpbiAgICAgIGFsLDcxaAotCi07IENhbGwgdGhlIEMgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24KLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi0gICAgICAgIGNtcCAgICAgW0JZVEUgUnRjSW5zaWRlXSwxICA7IENoZWNrIGZvciBtdXR1YWwgZXhjbHVzaW9uCi0gICAgICAgIGplICAgICAgQEBFeGl0Ci0gICAgICAgIG1vdiAgICAgW0JZVEUgUnRjSW5zaWRlXSwxCi0gICAgICAgIHN0aSAgICAgICAgICAgICAgICAgICAgICAgICA7IFJlLWVuYWJsZSBpbnRlcnJ1cHRzCi0gICAgICAgIE5FV1NUSyAgUnRjU3RhY2sgICAgICAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjawotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9ydGNIYW5kbGVyXQotICAgICAgICBSRVNUU1RLIFJ0Y1N0YWNrICAgICAgICAgICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCi0gICAgICAgIG1vdiAgICAgW0JZVEUgUnRjSW5zaWRlXSwwCi0KLUBARXhpdDogcG9wICAgICBfYXgKLSAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmVzdG9yZSBDTU9TIGluZGV4IHJlZ2lzdGVyCi0gICAgICAgIHBvcGFkICAgICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgYWxsIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2tleUlTUiAtIGtleWJvYXJkIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUga2V5Ym9hcmQgaW50ZXJydXB0LCB0byBkaXNwYXRjaCBjb250cm9sCi07IHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gV2Ugc2F2ZSB0aGUgc3RhdGUgb2YgYWxsIHJlZ2lzdGVycwotOyBpbiB0aGlzIHJvdXRpbmUsIGFuZCBzd2l0Y2ggdG8gYSBsb2NhbCBzdGFjay4gSW50ZXJydXB0cyBhcmUgKm9mZioKLTsgd2hlbiB3ZSBjYWxsIHRoZSB1c2VyIGNvZGUuCi07Ci07IE5PVEU6IFRoaXMgcm91dGluZSBzd2l0Y2hlcyB0byBhIGxvY2FsIHN0YWNrIGJlZm9yZSBjYWxsaW5nIGFueSBDIGNvZGUsCi07ICAgICAgIGFuZCBoZW5jZSBpcyBfbm90XyByZS1lbnRyYW50LiBIb3dldmVyIHdlIGVuc3VyZSB3aXRoaW4gdGhpcyByb3V0aW5lCi07ICAgICAgIG11dHVhbCBleGNsdXNpb24gdG8gdGhlIGtleWJvYXJkIGhhbmRsaW5nIHJvdXRpbmUuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX2tleUlTUgotCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2hhZCAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYWxsXyBleHRlbmRlZCByZWdpc3RlcnMKLSAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZwotCi0gICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgotCi0gICAgICAgIGNtcCAgICAgW0JZVEUgS3lJbnNpZGVdLDEgICA7IENoZWNrIGZvciBtdXR1YWwgZXhjbHVzaW9uCi0gICAgICAgIGplICAgICAgQEBSZWlzc3VlZAotCi0gICAgICAgIG1vdiAgICAgW0JZVEUgS3lJbnNpZGVdLDEKLSAgICAgICAgTkVXU1RLICBLeVN0YWNrICAgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fa2V5SGFuZGxlcl0gICA7IENhbGwgQyBjb2RlCi0gICAgICAgIFJFU1RTVEsgS3lTdGFjayAgICAgICAgIDsgUmVzdG9yZSBwcmV2aW91cyBzdGFjawotICAgICAgICBtb3YgICAgIFtCWVRFIEt5SW5zaWRlXSwwCi0KLUBARXhpdDogcG9wYWQgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGFsbCBleHRlbmRlZCByZWdpc3RlcnMKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0Ci0KLTsgV2hlbiB0aGUgQklPUyBrZXlib2FyZCBoYW5kbGVyIG5lZWRzIHRvIGNoYW5nZSB0aGUgU0hJRlQgc3RhdHVzIGxpZ2h0cwotOyBvbiB0aGUga2V5Ym9hcmQsIGluIHRoZSBwcm9jZXNzIG9mIGRvaW5nIHRoaXMgdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIKLTsgcmUtaXNzdWVzIGFub3RoZXIgaW50ZXJydXB0LCB3aGlsZSB0aGUgY3VycmVudCBoYW5kbGVyIGlzIHN0aWxsIGV4ZWN1dGluZy4KLTsgSWYgd2UgcmVjaWV2ZSBhbm90aGVyIGludGVycnVwdCB3aGlsZSBzdGlsbCBoYW5kbGluZyB0aGUgY3VycmVudCBvbmUsCi07IHRoZW4gc2ltcGx5IGNoYWluIGRpcmVjdGx5IHRvIHRoZSBwcmV2aW91cyBoYW5kbGVyLgotOwotOyBOb3RlIHRoYXQgZm9yIG1vc3QgRE9TIGV4dGVuZGVycywgdGhlIHJlYWwgbW9kZSBpbnRlcnJ1cHQgaGFuZGxlciB0aGF0IHdlCi07IGluc3RhbGwgdGFrZXMgY2FyZSBvZiB0aGlzIGZvciB1cy4KLQotQEBSZWlzc3VlZDoKLWlmZGVmICAgVE5UCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIHB1c2ggICAgZWN4Ci0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgIDsgUHVzaCBmbGFncyBvbiBzdGFjayB0byBzaW11bGF0ZSBpbnRlcnJ1cHQKLSAgICAgICAgbW92ICAgICBheCwyNTBFaCAgICAgICAgOyBDYWxsIHJlYWwgbW9kZSBwcm9jZWR1cmUgZnVuY3Rpb24KLSAgICAgICAgbW92ICAgICBlYngsW19QTV9wcmV2UmVhbEtleV0KLSAgICAgICAgbW92ICAgICBlY3gsMSAgICAgICAgICAgOyBDb3B5IHJlYWwgbW9kZSBmbGFncyB0byByZWFsIG1vZGUgc3RhY2sKLSAgICAgICAgaW50ICAgICAyMWggICAgICAgICAgICAgOyBDYWxsIHRoZSByZWFsIG1vZGUgY29kZQotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBwb3AgICAgIGVheAotZWxzZQotICAgICAgICBwdXNoZgotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbX1BNX3ByZXZLZXldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW19QTV9wcmV2S2V5XQotZW5kaWYKLWVuZGlmCi0gICAgICAgIGptcCAgICAgQEBFeGl0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2NoYWluUHJldmtleSAtIENoYWluIHRvIHByZXZpb3VzIGtleSBpbnRlcnJ1cHQgYW5kIHJldHVybgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2hhaW5zIHRvIHRoZSBwcmV2aW91cyBrZXkgaW50ZXJydXB0IHJvdXRpbmUgYW5kIHJldHVybnMgY29udHJvbAotOyBiYWNrIHRvIHRoZSBoaWdoIGxldmVsIGludGVycnVwdCBoYW5kbGVyLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2NoYWluUHJldktleQotCi1pZmRlZiAgIFROVAotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0Ci0gICAgICAgIG1vdiAgICAgYXgsMjUwRWggICAgICAgIDsgQ2FsbCByZWFsIG1vZGUgcHJvY2VkdXJlIGZ1bmN0aW9uCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fcHJldlJlYWxLZXldCi0gICAgICAgIG1vdiAgICAgZWN4LDEgICAgICAgICAgIDsgQ29weSByZWFsIG1vZGUgZmxhZ3MgdG8gcmVhbCBtb2RlIHN0YWNrCi0gICAgICAgIGludCAgICAgMjFoICAgICAgICAgICAgIDsgQ2FsbCB0aGUgcmVhbCBtb2RlIGNvZGUKLSAgICAgICAgcG9wZmQKLSAgICAgICAgcG9wICAgICBlY3gKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgcmV0Ci1lbHNlCi0KLTsgWUlLRVMhIEZvciBzb21lIHN0cmFuZ2UgcmVhc29uLCB3aGVuIGV4ZWN1dGlvbiByZXR1cm5zIGZyb20gdGhlCi07IHByZXZpb3VzIGtleWJvYXJkIGhhbmRsZXIsIGludGVycnVwdHMgYXJlIHJlLWVuYWJsZWQhISBTaW5jZSB3ZSBleHBlY3QKLTsgaW50ZXJydXB0cyB0byByZW1haW4gb2ZmIGR1cmluZyB0aGUgZHVyYXRpb24gb2Ygb3VyIGhhbmRsZXIsIHRoaXMgY2FuCi07IGNhdXNlIGhhdm9jLiBIb3dldmVyIG91ciBzdGFjayBtYWNyb3MgYWx3YXlzIHR1cm4gb2ZmIGludGVycnVwdHMsIHNvIHRoZXkKLTsgd2lsbCBiZSBvZmYgd2hlbiB3ZSBleGl0IHRoaXMgcm91dGluZS4gT2J2aW91c2x5IHRoZXJlIGlzIGEgdGlueSB3ZWVueQotOyB3aW5kb3cgd2hlbiBpbnRlcnJ1cHRzIHdpbGwgYmUgZW5hYmxlZCwgYnV0IHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuCi07IGRvIGFib3V0IHRoaXMuCi0KLSAgICAgICAgU1dBUFNUSyBLeVN0YWNrICAgICAgICAgOyBTd2FwIGJhY2sgdG8gcHJldmlvdXMgc3RhY2sKLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbX1BNX3ByZXZLZXldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW19QTV9wcmV2S2V5XQotZW5kaWYKLSAgICAgICAgU1dBUFNUSyBLeVN0YWNrICAgICAgICAgOyBTd2FwIGJhY2sgdG8gQyBzdGFjayBhZ2FpbgotICAgICAgICByZXQKLWVuZGlmCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2tleTE1SVNSIC0gSW50IDE1aCBrZXlib2FyZCBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBUaGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgaWYgd2UgaGF2ZSBiZWVuIGNhbGxlZCB0byBoYW5kbGUgdGhlIEludCAxNWgKLTsga2V5Ym9hcmQgaW50ZXJydXB0IGNhbGxvdXQgZnJvbSByZWFsIG1vZGUuCi07Ci07ICAgRW50cnk6ICBBWCAgLSBIYXJkd2FyZSBzY2FuIGNvZGUgdG8gcHJvY2VzcwotOyAgIEV4aXQ6ICAgQVggIC0gSGFyZHdhcmUgc2NhbiBjb2RlIHRvIHByb2Nlc3MgKDAgdG8gaWdub3JlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9rZXkxNUlTUgotCi0gICAgICAgIHB1c2ggICAgZHMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBMT0FEX0RTCi0gICAgICAgIGNtcCAgICAgYWgsNEZoCi0gICAgICAgIGpueiAgICAgQEBOb3RPdXJzICAgICAgIDsgUXVpdCBpZiBub3Qga2V5Ym9hcmQgY2FsbG91dAotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCi0gICAgICAgIHhvciAgICAgYWgsYWggICAgICAgICAgIDsgQVggOj0gc2NhbiBjb2RlCi0gICAgICAgIE5FV1NUSyAgS3kxNVN0YWNrICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCi0gICAgICAgIHB1c2ggICAgX2F4Ci0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX2tleTE1SGFuZGxlcl0gOyBDYWxsIEMgY29kZQotICAgICAgICBfYWRkICAgIHNwLDIsNAotICAgICAgICBSRVNUU1RLIEt5MTVTdGFjayAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKLSAgICAgICAgdGVzdCAgICBheCxheAotICAgICAgICBqeiAgICAgIEBAMQotICAgICAgICBzdGMgICAgICAgICAgICAgICAgICAgICA7IFNldCBjYXJyeSB0byBwcm9jZXNzIGFzIG5vcm1hbAotICAgICAgICBqbXAgICAgIEBAMgotQEAxOiAgICBjbGMgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGNhcnJ5IHRvIGlnbm9yZSBzY2FuIGNvZGUKLUBAMjogICAgcG9wYWQKLSAgICAgICAgam1wICAgICBAQEV4aXQgICAgICAgICAgOyBXZSBhcmUgZG9uZQotCi1AQE5vdE91cnM6Ci1pZmRlZiAgIFROVAotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0Ci0gICAgICAgIG1vdiAgICAgYXgsMjUwRWggICAgICAgIDsgQ2FsbCByZWFsIG1vZGUgcHJvY2VkdXJlIGZ1bmN0aW9uCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fcHJldlJlYWxLZXkxNV0KLSAgICAgICAgbW92ICAgICBlY3gsMSAgICAgICAgICAgOyBDb3B5IHJlYWwgbW9kZSBmbGFncyB0byByZWFsIG1vZGUgc3RhY2sKLSAgICAgICAgaW50ICAgICAyMWggICAgICAgICAgICAgOyBDYWxsIHRoZSByZWFsIG1vZGUgY29kZQotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBwb3AgICAgIGVheAotZWxzZQotICAgICAgICBwdXNoZgotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbX1BNX3ByZXZLZXkxNV0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbX1BNX3ByZXZLZXkxNV0KLWVuZGlmCi1lbmRpZgotQEBFeGl0OiBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgcmV0ZiAgICA0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2JyZWFrSVNSIC0gQ29udHJvbCBCcmVhayBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIEN0cmwtQnJlYWsgaW50ZXJydXB0LiBXZSBzaW1wbHkgc2V0Ci07IHRoZSBDdHJsLUJyZWFrIGZsYWcgdG8gYSAxIGFuZCBsZWF2ZSAobm90ZSB0aGF0IHRoaXMgaXMgYWNjZXNzZWQgdGhyb3VnaAotOyBhIGZhciBwb2ludGVyLCBhcyBpdCBtYXkgd2VsbCBiZSBsb2NhdGVkIGluIGNvbnZlbnRpb25hbCBtZW1vcnkpLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9icmVha0lTUgotCi0gICAgICAgIHN0aQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoICAgIF9ieAotCi0gICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgotICAgICAgICBtb3YgICAgIGVieCxbX1BNX2N0cmxCUHRyXQotICAgICAgICBtb3YgICAgIFtVSU5UIF9FUyBfYnhdLDEKLQotOyBSdW4gYWx0ZXJuYXRlIGJyZWFrIGhhbmRsZXIgY29kZSBpZiBpbnN0YWxsZWQKLQotICAgICAgICBjbXAgICAgIFtDUFRSIF9QTV9icmVha0hhbmRsZXJdLDAKLSAgICAgICAgamUgICAgICBAQEV4aXQKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgbW92ICAgICBfYXgsMQotICAgICAgICBwdXNoICAgIF9heAotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9icmVha0hhbmRsZXJdIDsgQ2FsbCBDIGNvZGUKLSAgICAgICAgcG9wICAgICBfYXgKLSAgICAgICAgcG9wYWQKLQotQEBFeGl0OiBwb3AgICAgIF9ieAotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX2N0cmxCcmVha0hpdChpbnQgY2xlYXJGbGFnKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgQ3RybC1CcmVhayBmbGFnIGFuZCBwb3NzaWJseSBjbGVhcnMgaXQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fY3RybEJyZWFrSGl0Ci0KLSAgICAgICAgQVJHICAgICBjbGVhckZsYWc6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBTYXZlIGludGVycnVwdCBzdGF0dXMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBtb3YgICAgIGVieCxbX1BNX2N0cmxCUHRyXQotICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICA7IE5vIGludGVycnVwdHMgdGhhbmtzIQotICAgICAgICBtb3YgICAgIF9heCxbX0VTIF9ieF0KLSAgICAgICAgdGVzdCAgICBbQllURSBjbGVhckZsYWddLDEKLSAgICAgICAganogICAgICBAQERvbmUKLSAgICAgICAgbW92ICAgICBbVUlOVCBfRVMgX2J4XSwwCi0KLUBARG9uZTogcG9wICAgICBlcwotICAgICAgICBwb3BmICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgaW50ZXJydXB0IHN0YXR1cwotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9jdHJsQ0lTUiAtIENvbnRyb2wgQnJlYWsgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBDdHJsLUMgaW50ZXJydXB0LiBXZSBzaW1wbHkgc2V0Ci07IHRoZSBDdHJsLUMgZmxhZyB0byBhIDEgYW5kIGxlYXZlIChub3RlIHRoYXQgdGhpcyBpcyBhY2Nlc3NlZCB0aHJvdWdoCi07IGEgZmFyIHBvaW50ZXIsIGFzIGl0IG1heSB3ZWxsIGJlIGxvY2F0ZWQgaW4gY29udmVudGlvbmFsIG1lbW9yeSkuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX2N0cmxDSVNSCi0KLSAgICAgICAgc3RpCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2ggICAgX2J4Ci0KLSAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fY3RybENQdHJdCi0gICAgICAgIG1vdiAgICAgW1VJTlQgX0VTIF9ieF0sMQotCi07IFJ1biBhbHRlcm5hdGUgYnJlYWsgaGFuZGxlciBjb2RlIGlmIGluc3RhbGxlZAotCi0gICAgICAgIGNtcCAgICAgW0NQVFIgX1BNX2JyZWFrSGFuZGxlcl0sMAotICAgICAgICBqZSAgICAgIEBARXhpdAotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBtb3YgICAgIF9heCwwCi0gICAgICAgIHB1c2ggICAgX2F4Ci0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX2JyZWFrSGFuZGxlcl0gOyBDYWxsIEMgY29kZQotICAgICAgICBwb3AgICAgIF9heAotICAgICAgICBwb3BhZAotCi1AQEV4aXQ6IHBvcCAgICAgX2J4Ci0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAotICAgICAgICBpcmV0ZAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgUE1fY3RybENIaXQoaW50IGNsZWFyRmxhZykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIEN0cmwtQyBmbGFnIGFuZCBwb3NzaWJseSBjbGVhcnMgaXQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fY3RybENIaXQKLQotICAgICAgICBBUkcgICAgIGNsZWFyRmxhZzpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICA7IFNhdmUgaW50ZXJydXB0IHN0YXR1cwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fY3RybENQdHJdCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgTm8gaW50ZXJydXB0cyB0aGFua3MhCi0gICAgICAgIG1vdiAgICAgX2F4LFtfRVMgX2J4XQotICAgICAgICB0ZXN0ICAgIFtCWVRFIGNsZWFyRmxhZ10sMQotICAgICAgICBqeiAgICAgIEBARG9uZQotICAgICAgICBtb3YgICAgIFtVSU5UIF9FUyBfYnhdLDAKLQotQEBEb25lOgotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcGYgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBpbnRlcnJ1cHQgc3RhdHVzCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2NyaXRpY2FsSVNSIC0gQ29udHJvbCBFcnJvciBoYW5kbGVyIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgTVNET1MgQ3JpdGljYWwgRXJyb3IgaW50ZXJydXB0LCB0byBkaXNwYXRjaAotOyBjb250cm9sIHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gV2Ugc2F2ZSB0aGUgc3RhdGUgb2YgYWxsCi07IHJlZ2lzdGVycyBpbiB0aGlzIHJvdXRpbmUsIGFuZCBzd2l0Y2ggdG8gYSBsb2NhbCBzdGFjay4gV2UgYWxzbyBwYXNzCi07IHRoZSB2YWx1ZXMgb2YgdGhlIEFYIGFuZCBESSByZWdpc3RlcnMgdG8gdGhlIGFzIHBvaW50ZXJzLCBzbyB0aGF0IHRoZQotOyB2YWx1ZXMgY2FuIGJlIG1vZGlmaWVkIGJlZm9yZSByZXR1cm5pbmcgdG8gTVNET1MuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX2NyaXRpY2FsSVNSCi0KLSAgICAgICAgc3RpCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2ggICAgX2J4ICAgICAgICAgICAgIDsgU2F2ZSByZWdpc3RlciB2YWx1ZXMgY2hhbmdlZAotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCi0KLSAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fY3JpdFB0cl0KLSAgICAgICAgbW92ICAgICBbX0VTIF9ieF0sYXgKLSAgICAgICAgbW92ICAgICBbX0VTIF9ieCsyXSxkaQotCi07IFJ1biBhbHRlcm5hdGUgY3JpdGljYWwgaGFuZGxlciBjb2RlIGlmIGluc3RhbGxlZAotCi0gICAgICAgIGNtcCAgICAgW0NQVFIgX1BNX2NyaXRIYW5kbGVyXSwwCi0gICAgICAgIGplICAgICAgQEBOb0FsdEhhbmRsZXIKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgcHVzaCAgICBfZGkKLSAgICAgICAgcHVzaCAgICBfYXgKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fY3JpdEhhbmRsZXJdICA7IENhbGwgQyBjb2RlCi0gICAgICAgIF9hZGQgICAgc3AsNCw4Ci0gICAgICAgIHBvcGFkCi0KLSAgICAgICAgcG9wICAgICBfYngKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0Ci0KLUBATm9BbHRIYW5kbGVyOgotICAgICAgICBtb3YgICAgIGF4LDMgICAgICAgICAgICA7IFRlbGwgTVNET1MgdG8gZmFpbCB0aGUgb3BlcmF0aW9uCi0gICAgICAgIHBvcCAgICAgX2J4Ci0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgUE1fY3JpdGljYWxFcnJvcihpbnQgKmF4VmFsLGludCAqZGlWYWwsaW50IGNsZWFyRmxhZykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNyaXRpY2FsIGVycm9yIGZsYWdzLCBhbmQgdGhlIHZhbHVlcyB0aGF0Ci07IE1TRE9TIHBhc3NlZCBpbiB0aGUgQVggYW5kIERJIHJlZ2lzdGVycyB0byBvdXIgaGFuZGxlci4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9jcml0aWNhbEVycm9yCi0KLSAgICAgICAgQVJHICAgICBheFZhbDpEUFRSLCBkaVZhbDpEUFRSLCBjbGVhckZsYWc6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBTYXZlIGludGVycnVwdCBzdGF0dXMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBtb3YgICAgIGVieCxbX1BNX2NyaXRQdHJdCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgTm8gaW50ZXJydXB0cyB0aGFua3MhCi0gICAgICAgIHhvciAgICAgX2F4LF9heAotICAgICAgICB4b3IgICAgIF9kaSxfZGkKLSAgICAgICAgbW92ICAgICBheCxbX0VTIF9ieF0KLSAgICAgICAgbW92ICAgICBkaSxbX0VTIF9ieCsyXQotICAgICAgICB0ZXN0ICAgIFtCWVRFIGNsZWFyRmxhZ10sMQotICAgICAgICBqeiAgICAgIEBATm9DbGVhcgotICAgICAgICBtb3YgICAgIFtVTE9ORyBfRVMgX2J4XSwwCi1AQE5vQ2xlYXI6Ci0gICAgICAgIF9sZXMgICAgX2J4LFtheFZhbF0KLSAgICAgICAgbW92ICAgICBbX0VTIF9ieF0sX2F4Ci0gICAgICAgIF9sZXMgICAgX2J4LFtkaVZhbF0KLSAgICAgICAgbW92ICAgICBbX0VTIF9ieF0sX2RpCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wZiAgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGludGVycnVwdCBzdGF0dXMKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssIFBNX21vdXNlSGFuZGxlciBtaCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fc2V0TW91c2VIYW5kbGVyCi0KLSAgICAgICAgQVJHICAgICBtb3VzZU1hc2s6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaCAgICBlcwotCi0gICAgICAgIG1vdiAgICAgYXgsMENoICAgICAgICAgIDsgQVggOj0gRnVuY3Rpb24gMTIgLSBpbnN0YWxsIGludGVycnVwdCBzdWIKLSAgICAgICAgbW92ICAgICBfY3gsW21vdXNlTWFza10gOyBDWCA6PSBtb3VzZSBtYXNrCi0gICAgICAgIG1vdiAgICAgX2R4LG9mZnNldCBfUE1fbW91c2VJU1IKLSAgICAgICAgcHVzaCAgICBjcwotICAgICAgICBwb3AgICAgIGVzICAgICAgICAgICAgICA7IEVTOl9EWCAtPiBtb3VzZSBoYW5kbGVyCi0gICAgICAgIGludCAgICAgMzNoICAgICAgICAgICAgIDsgQ2FsbCBtb3VzZSBkcml2ZXIKLQotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fbW91c2VQTUNCKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNb3VzZSByZWFsbW9kZSBjYWxsYmFjayByb3V0aW5lLiBVcG9uIGVudHJ5IHRvIHRoaXMgcm91dGluZSwgd2UgcmVjaWV2ZQotOyB0aGUgZm9sbG93aW5nIGZyb20gdGhlIERQTUkgc2VydmVyOgotOwotOyAgIEVudHJ5OiAgRFM6X1NJICAtPiBSZWFsIG1vZGUgc3RhY2sgYXQgdGltZSBvZiBjYWxsCi07ICAgICAgICAgICBFUzpfREkgIC0+IFJlYWwgbW9kZSByZWdpc3RlciBkYXRhIHN0cnVjdHVyZQotOyAgICAgICAgICAgU1M6X1NQICAtPiBMb2NrZWQgcHJvdGVjdGVkIG1vZGUgc3RhY2sgdG8gdXNlCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX21vdXNlUE1DQgotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBtb3YgICAgIGVheCxbZXM6X2RpKzFDaF0gICAgOyBMb2FkIHJlZ2lzdGVyIHZhbHVlcyBmcm9tIHJlYWwgbW9kZQotICAgICAgICBtb3YgICAgIGVieCxbZXM6X2RpKzEwaF0KLSAgICAgICAgbW92ICAgICBlY3gsW2VzOl9kaSsxOGhdCi0gICAgICAgIG1vdiAgICAgZWR4LFtlczpfZGkrMTRoXQotICAgICAgICBtb3YgICAgIGVzaSxbZXM6X2RpKzA0aF0KLSAgICAgICAgbW92ICAgICBlZGksW2VzOl9kaV0KLSAgICAgICAgY2FsbCAgICBfUE1fbW91c2VJU1IgICAgICAgIDsgQ2FsbCB0aGUgbW91c2UgaGFuZGxlcgotICAgICAgICBwb3BhZAotCi0gICAgICAgIG1vdiAgICAgYXgsW2RzOl9zaV0KLSAgICAgICAgbW92ICAgICBbZXM6X2RpKzJBaF0sYXggICAgIDsgUGx1ZyBpbiByZXR1cm4gSVAgYWRkcmVzcwotICAgICAgICBtb3YgICAgIGF4LFtkczpfc2krMl0KLSAgICAgICAgbW92ICAgICBbZXM6X2RpKzJDaF0sYXggICAgIDsgUGx1ZyBpbiByZXR1cm4gQ1MgdmFsdWUKLSAgICAgICAgYWRkICAgICBbV09SRCBlczpfZGkrMkVoXSw0IDsgUmVtb3ZlIHJldHVybiBhZGRyZXNzIGZyb20gc3RhY2sKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgICAgIDsgR28gYmFjayB0byByZWFsIG1vZGUhCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1faW50MTBQTUNCKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQxMCByZWFsbW9kZSBjYWxsYmFjayByb3V0aW5lLiBVcG9uIGVudHJ5IHRvIHRoaXMgcm91dGluZSwgd2UgcmVjaWV2ZQotOyB0aGUgZm9sbG93aW5nIGZyb20gdGhlIERQTUkgc2VydmVyOgotOwotOyAgIEVudHJ5OiAgRFM6RVNJICAtPiBSZWFsIG1vZGUgc3RhY2sgYXQgdGltZSBvZiBjYWxsCi07ICAgICAgICAgICBFUzpFREkgIC0+IFJlYWwgbW9kZSByZWdpc3RlciBkYXRhIHN0cnVjdHVyZQotOyAgICAgICAgICAgU1M6RVNQICAtPiBMb2NrZWQgcHJvdGVjdGVkIG1vZGUgc3RhY2sgdG8gdXNlCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgICAgIF9QTV9pbnQxMFBNQ0IKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgcHVzaCAgICBkcwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2ggICAgZnMKLQotICAgICAgICBwdXNoZmQKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgbW92ICAgICBbZXM6ZWRpKzIwaF0sYXggICAgIDsgU2F2ZSByZXR1cm4gZmxhZyBzdGF0dXMKLSAgICAgICAgbW92ICAgICBheCxbZHM6ZXNpXQotICAgICAgICBtb3YgICAgIFtlczplZGkrMkFoXSxheCAgICAgOyBQbHVnIGluIHJldHVybiBJUCBhZGRyZXNzCi0gICAgICAgIG1vdiAgICAgYXgsW2RzOmVzaSsyXQotICAgICAgICBtb3YgICAgIFtlczplZGkrMkNoXSxheCAgICAgOyBQbHVnIGluIHJldHVybiBDUyB2YWx1ZQotICAgICAgICBhZGQgICAgIFtXT1JEIGVzOmVkaSsyRWhdLDQgOyBSZW1vdmUgcmV0dXJuIGFkZHJlc3MgZnJvbSBzdGFjawotCi07IENhbGwgdGhlIGluc3RhbGwgaW50MTAgaGFuZGxlciBpbiBwcm90ZWN0ZWQgbW9kZS4gVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZAotOyB3aXRoIERTIHNldCB0byB0aGUgY3VycmVudCBkYXRhIHNlbGVjdG9yLCBhbmQgRVM6RURJIHBvaW50aW5nIHRoZSB0aGUKLTsgcmVhbCBtb2RlIERQTUkgcmVnaXN0ZXIgc3RydWN0dXJlIGF0IHRoZSB0aW1lIG9mIHRoZSBpbnRlcnJ1cHQuIFRoZQotOyBoYW5kbGUgbXVzdCBiZSB3cml0dGVuIGluIGFzc2VtYmxlciB0byBiZSBhYmxlIHRvIGV4dHJhY3QgdGhlIHJlYWwgbW9kZQotOyByZWdpc3RlciB2YWx1ZXMgZnJvbSB0aGUgc3RydWN0dXJlCi0KLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwb3AgICAgIGZzICAgICAgICAgICAgICAgICAgOyBGUzpFREkgLT4gcmVhbCBtb2RlIHJlZ2lzdGVycwotICAgICAgICBMT0FEX0RTCi0gICAgICAgIE5FV1NUSyAgSW50MTBTdGFjayAgICAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjawotCi0gICAgICAgIGNhbGwgICAgW19QTV9pbnQxMEhhbmRsZXJdCi0KLSAgICAgICAgUkVTVFNUSyBJbnQxMFN0YWNrICAgICAgICAgIDsgUmVzdG9yZSBwcmV2aW91cyBzdGFjawotICAgICAgICBwb3AgICAgIGZzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBwb3BhZAotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICAgICAgOyBHbyBiYWNrIHRvIHJlYWwgbW9kZSEKLQotY3Byb2NlbmQKLQotY3B1YmxpYyBfUE1fcG1zbXhDb2RlRW5kCi0KLWVuZGNvZGVzZWcgIF9wbXNteAotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L192ZmxhdC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX3ZmbGF0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5ODVhOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX3ZmbGF0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDY1MiArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgICAgICAgICAgQmFzZWQgb24gb3JpZ2luYWwgY29kZSBDb3B5cmlnaHQgMTk5NCBPdHRvIENocm9ucwotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIGxhdGVyCi07KiBFbnZpcm9ubWVudDogSUJNIFBDIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZQotOyoKLTsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgcGFnZSBmYXVsdCBoYW5kbGVyIGZvciB2aXJ0dWFsIGxpbmVhciBmcmFtZWJ1ZmZlcnMuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotICAgICAgICBKVU1QUwotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1oZWFkZXIgICAgICBfdmZsYXQgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1WRkxBVF9TVEFSVCAgICAgRVFVIDBGMDAwMDAwMGgKLVZGTEFUX0VORCAgICAgICBFUVUgMEYwM0ZGRkZGaAotUEFHRV9QUkVTRU5UICAgIEVRVSAxCi1QQUdFX05PVFBSRVNFTlQgRVFVIDAKLVBBR0VfUkVBRCAgICAgICBFUVUgMAotUEFHRV9XUklURSAgICAgIEVRVSAyCi0KLWlmZGVmICAgRE9TNEdXCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERPUzRHL1cgZmxhdCBsaW5lYXIgZnJhbWVidWZmZXIgZW11bGF0aW9uLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYmVnZGF0YXNlZyAgX3ZmbGF0Ci0KLTsgTmVhciBwb2ludGVycyB0byB0aGUgcGFnZSBkaXJlY3RvcnkgYmFzZSBhbmQgb3VyIHBhZ2UgdGFibGVzLiBBbGwgb2YKLTsgdGhpcyBtZW1vcnkgaXMgYWx3YXlzIGxvY2F0ZWQgaW4gdGhlIGZpcnN0IE1iIG9mIERPUyBtZW1vcnkuCi0KLVBEQlIgICAgICAgICAgICBkZCAgMCAgICAgICAgICAgICAgIDsgUGFnZSBkaXJlY3RvcnkgYmFzZSByZWdpc3RlciAoQ1IzKQotYWNjZXNzUGFnZUFkZHIgIGRkICAwCi1hY2Nlc3NQYWdlVGFibGUgZGQgIDAKLQotOyBDYXVzZVdheSBwYWdlIGRpcmVjdG9yeSAmIDFzdCBwYWdlIHRhYmxlIGxpbmVhciBhZGRyZXNzZXMuCi0KLUNhdXNlV2F5RElSTGluZWFyIGRkIDAKLUNhdXNlV2F5MXN0TGluZWFyIGRkIDAKLQotOyBQbGFjZSB0byBzdG9yZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIFBhZ2UgVGFibGUgRGlyZWN0b3J5IGJlZm9yZSB3ZQotOyBpbnRpYWxpc2VkIG91ciB2aXJ0dWFsIGJ1ZmZlciBjb2RlLgotCi1wYWdlRGlyZWN0b3J5OiAgcmVzZCAxMDI0ICAgICAgICAgICA7IFNhdmVkIHBhZ2UgdGFibGUgZGlyZWN0b3J5Ci0KLVZhbGlkQ1MgICAgICAgICBkdyAgMCAgICAgICAgICAgICAgIDsgVmFsaWQgQ1MgZm9yIHBhZ2UgZmF1bHRzCi1SaW5nMENTICAgICAgICAgZHcgIDAgICAgICAgICAgICAgICA7IE91ciByaW5nIDAgY29kZSBzZWxlY3RvcgotTGFzdFBhZ2UgICAgICAgIGRkICAwICAgICAgICAgICAgICAgOyBMYXN0IHBhZ2Ugd2UgbWFwcGVkIGluCi1CYW5rRnVuY0J1ZjogICAgcmVzYiAxMDEgICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIGJhbmsgc3dpdGNoIGNvZGUKLUJhbmtGdW5jUHRyICAgICBkZCAgb2Zmc2V0IEJhbmtGdW5jQnVmCi0KLUlOVDE0R2F0ZToKLUlOVDE0T2Zmc2V0ICAgICBkZCAgICAgIDAgICAgICAgICAgIDsgZWlwIG9mIG9yaWdpbmFsIHZlY3RvcgotSU5UMTRTZWxlY3RvciAgIGR3ICAgICAgMCAgICAgICAgICAgOyBjcyBvZiBvcmlnaW5hbCB2ZWN0b3IKLQotICAgICAgICBjZXh0ZXJuIF9QTV9zYXZlZERTLFVTSE9SVAotICAgICAgICBjZXh0ZXJuIFZGX2hhdmVDYXVzZVdheSxCT09MCi0KLWVuZGRhdGFzZWcgIF92ZmxhdAotCi1iZWdjb2Rlc2VnICBfdmZsYXQgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLSAgICAgICAgY2V4dGVybiBWRl9tYWxsb2MsRlBUUgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQRl9oYW5kbGVyNjRrIC0gUGFnZSBmYXVsdCBoYW5kbGVyIGZvciA2NGsgYmFua3MKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFRoZSBoYW5kbGVyIGJlbG93IGlzIGEgMzIgYml0IHJpbmcgMCBwYWdlIGZhdWx0IGhhbmRsZXIuICBJdCByZWNlaXZlcwotOyBjb250cm9sIGltbWVkaWF0ZWx5IGFmdGVyIGFueSBwYWdlIGZhdWx0IG9yIGFmdGVyIGFuIElSUTYgKGhhcmR3YXJlCi07IGludGVycnVwdCkuIFRoaXMgcHJvdmlkZXMgdGhlIGZhc3Rlc3QgcG9zc2libGUgaGFuZGxpbmcgb2YgcGFnZSBmYXVsdHMKLTsgc2luY2UgaXQganVtcCBkaXJlY3RseSBoZXJlLiAgSWYgdGhpcyBpcyBhIHBhZ2UgZmF1bHQsIHRoZSBudW1iZXIKLTsgaW1tZWRpYXRlbHkgb24gdGhlIHN0YWNrIHdpbGwgYmUgYW4gZXJyb3IgY29kZSwgYXQgb2Zmc2V0IDQgd2lsbCBiZQotOyB0aGUgZWlwIG9mIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiwgYXQgb2Zmc2V0IDggd2lsbCBiZSB0aGUgY3Mgb2YgdGhlCi07IGZhdWx0aW5nIGluc3RydWN0aW9uLiAgSWYgaXQgaXMgYSBoYXJkd2FyZSBpbnRlcnJ1cHQsIGl0IHdpbGwgbm90IGhhdmUKLTsgdGhlIGVycm9yIGNvZGUgYW5kIHRoZSBlZmxhZ3Mgd2lsbCBiZSBhdCBvZmZzZXQgOC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBQRl9oYW5kbGVyNjRrCi0KLTsgQ2hlY2sgaWYgdGhpcyBpcyBhIHByb2Nlc3NvciBleGVjZXB0aW9uIG9yIGEgcGFnZSBmYXVsdAotCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIG1vdiAgICAgYXgsW2NzOlZhbGlkQ1NdICAgICA7IFVzZSBDUyBvdmVycmlkZSB0byBhY2Nlc3MgZGF0YQotICAgICAgICBjbXAgICAgIFtzczplc3ArMTJdLGF4ICAgICAgOyBJcyB0aGlzIGEgcGFnZSBmYXVsdD8KLSAgICAgICAgam5lICAgICBAQFRvT2xkSGFuZGxlciAgICAgIDsgTm9wZSwganVtcCB0byB0aGUgcHJldmlvdXMgaGFuZGxlcgotCi07IEdldCBhZGRyZXNzIG9mIHBhZ2UgZmF1bHQgYW5kIGNoZWNrIGlmIHdpdGhpbiBvdXIgaGFuZGxlcnMgcmFuZ2UKLQotICAgICAgICBtb3YgICAgIGVheCxjcjIgICAgICAgICAgICAgOyBFQlggaGFzIHBhZ2UgZmF1bHQgbGluZWFyIGFkZHJlc3MKLSAgICAgICAgY21wICAgICBlYXgsVkZMQVRfU1RBUlQgICAgIDsgSXMgdGhlIGZhdWx0IGxlc3MgdGhhbiBvdXJzPwotICAgICAgICBqYiAgICAgIEBAVG9PbGRIYW5kbGVyICAgICAgOyBZZXAsIGdvIHRvIHByZXZpb3VzIGhhbmRsZXIKLSAgICAgICAgY21wICAgICBlYXgsVkZMQVRfRU5EICAgICAgIDsgSXMgdGhlIGZhdWx0IG1vcmUgdGhhbiBvdXJzPwotICAgICAgICBqYWUgICAgIEBAVG9PbGRIYW5kbGVyICAgICAgOyBZZXAsIGdvIHRvIHByZXZpb3VzIGhhbmRsZXIKLQotOyBUaGlzIGlzIG91ciBwYWdlIGZhdWx0LCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdAotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBwdXNoICAgIGRzCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgbW92ICAgICBlYngsZWF4ICAgICAgICAgICAgIDsgRUJYIDo9IHBhZ2UgZmF1bHQgYWRkcmVzcwotICAgICAgICBhbmQgICAgIGVieCxpbnZlcnQgMEZGRkZoICAgOyBNYXNrIHRvIDY0ayBiYW5rIGJvdW5kYXJ5Ci0gICAgICAgIG1vdiAgICAgZHMsW2NzOl9QTV9zYXZlZERTXTsgTG9hZCBzZWdtZW50IHJlZ2lzdGVycwotICAgICAgICBtb3YgICAgIGVzLFtjczpfUE1fc2F2ZWREU10KLQotOyBNYXAgaW4gdGhlIHBhZ2UgdGFibGUgZm9yIG91ciB2aXJ0dWFsIGZyYW1lYnVmZmVyIGFyZWEgZm9yIG1vZGlmaWNhdGlvbgotCi0gICAgICAgIG1vdiAgICAgZWRpLFtQREJSXSAgICAgICAgICA7IEVESSBwb2ludHMgdG8gcGFnZSBkaXJlY3RvcnkKLSAgICAgICAgbW92ICAgICBlZHgsZWJ4ICAgICAgICAgICAgIDsgRURYID0gbGluZWFyIGFkZHJlc3MKLSAgICAgICAgc2hyICAgICBlZHgsMjIgICAgICAgICAgICAgIDsgRURYID0gb2Zmc2V0IHRvIHBhZ2UgZGlyZWN0b3J5Ci0gICAgICAgIG1vdiAgICAgZWR4LFtlZHgqNCtlZGldICAgICA7IEVEWCA9IHBoeXNpY2FsIHBhZ2UgdGFibGUgYWRkcmVzcwotICAgICAgICBtb3YgICAgIGVheCxlZHgKLSAgICAgICAgbW92ICAgICBlZHgsW2FjY2Vzc1BhZ2VUYWJsZV0KLSAgICAgICAgb3IgICAgICBlYXgsNwotICAgICAgICBtb3YgICAgIFtlZHhdLGVheAotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgICAgIDsgVXBkYXRlIHBhZ2UgdGFibGUgY2FjaGUKLQotOyBNYXJrIGFsbCBwYWdlcyB2YWxpZCBmb3IgdGhlIG5ldyBwYWdlIGZhdWx0IGFyZWEKLQotICAgICAgICBtb3YgICAgIGVzaSxlYnggICAgICAgICAgICAgOyBFU0kgOj0gbGluZWFyIGFkZHJlc3MgZm9yIHBhZ2UKLSAgICAgICAgc2hyICAgICBlc2ksMTAKLSAgICAgICAgYW5kICAgICBlc2ksMEZGRmggICAgICAgICAgIDsgT2Zmc2V0IGludG8gcGFnZSB0YWJsZQotICAgICAgICBhZGQgICAgIGVzaSxbYWNjZXNzUGFnZUFkZHJdCi1pZmRlZiAgIFVTRV9OQVNNCi0lYXNzaWduIG9mZiAwCi0lcmVwIDE2Ci0gICAgICAgIG9yICAgICAgW0RXT1JEIGVzaStvZmZdLDAwMDAwMDAwMDFoIDsgRW5hYmxlIHBhZ2VzCi0lYXNzaWduIG9mZiBvZmYrNAotJWVuZHJlcAotZWxzZQotb2ZmID0gMAotUkVQVCAgICAxNgotICAgICAgICBvciAgICAgIFtEV09SRCBlc2krb2ZmXSwwMDAwMDAwMDAxaCA7IEVuYWJsZSBwYWdlcwotb2ZmID0gb2ZmKzQKLUVORE0KLWVuZGlmCi0KLTsgTWFyayBhbGwgcGFnZXMgaW52YWxpZCBmb3IgdGhlIHByZXZpb3VzbHkgbWFwcGVkIGFyZWEKLQotICAgICAgICB4Y2hnICAgIGVzaSxbTGFzdFBhZ2VdICAgICAgOyBTYXZlIGxhc3QgcGFnZSBmb3IgbmV4dCBwYWdlIGZhdWx0Ci0gICAgICAgIHRlc3QgICAgZXNpLGVzaQotICAgICAgICBqeiAgICAgIEBARG9uZU1hcHBpbmcgICAgICAgOyBEb250IHVwZGF0ZSBpZiBmaXJzdCB0aW1lIHJvdW5kCi1pZmRlZiAgIFVTRV9OQVNNCi0lYXNzaWduIG9mZiAwCi0lcmVwIDE2Ci0gICAgICAgIG9yICAgICAgW0RXT1JEIGVzaStvZmZdLDBGRkZGRkZGRWggIDsgRGlzYWJsZSBwYWdlcwotJWFzc2lnbiBvZmYgb2ZmKzQKLSVlbmRyZXAKLWVsc2UKLW9mZiA9IDAKLVJFUFQgICAgMTYKLSAgICAgICAgYW5kICAgICBbRFdPUkQgZXNpK29mZl0sMEZGRkZGRkZFaCAgOyBEaXNhYmxlIHBhZ2VzCi1vZmYgPSBvZmYrNAotRU5ETQotZW5kaWYKLQotQEBEb25lTWFwcGluZzoKLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICA7IEZsdXNoIHRoZSBUTEIKLQotOyBOb3cgcHJvZ3JhbSB0aGUgbmV3IFN1cGVyVkdBIHN0YXJ0aW5nIGJhbmsgYWRkcmVzcwotCi0gICAgICAgIG1vdiAgICAgZWF4LGVieCAgICAgICAgICAgICA7IEVBWCA6PSBwYWdlIGZhdWx0IGFkZHJlc3MKLSAgICAgICAgc2hyICAgICBlYXgsMTYKLSAgICAgICAgYW5kICAgICBlYXgsMEZGaCAgICAgICAgICAgIDsgTWFzayB0byAwLTI1NQotICAgICAgICBjYWxsICAgIFtCYW5rRnVuY1B0cl0gICAgICAgOyBDYWxsIHRoZSBiYW5rIHN3aXRjaCBmdW5jdGlvbgotCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBwb3BhZAotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICBhZGQgICAgIGVzcCw0ICAgICAgICAgICAgICAgOyBQb3AgdGhlIGVycm9yIGNvZGUgZnJvbSBzdGFjawotICAgICAgICBpcmV0ZCAgICAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gdG8gZmF1bHRpbmcgaW5zdHJ1Y3Rpb24KLQotQEBUb09sZEhhbmRsZXI6Ci0gICAgICAgIHBvcCAgICAgZWF4Ci1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGptcCBmYXIgZHdvcmQgW2NzOklOVDE0R2F0ZV07IENoYWluIHRvIHByZXZpb3VzIGhhbmRsZXIKLWVsc2UKLSAgICAgICAgam1wICAgICBbRldPUkQgY3M6SU5UMTRHYXRlXTsgQ2hhaW4gdG8gcHJldmlvdXMgaGFuZGxlcgotZW5kaWYKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUEZfaGFuZGxlcjRrICAtIFBhZ2UgZmF1bHQgaGFuZGxlciBmb3IgNGsgYmFua3MKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFRoZSBoYW5kbGVyIGJlbG93IGlzIGEgMzIgYml0IHJpbmcgMCBwYWdlIGZhdWx0IGhhbmRsZXIuICBJdCByZWNlaXZlcwotOyBjb250cm9sIGltbWVkaWF0ZWx5IGFmdGVyIGFueSBwYWdlIGZhdWx0IG9yIGFmdGVyIGFuIElSUTYgKGhhcmR3YXJlCi07IGludGVycnVwdCkuIFRoaXMgcHJvdmlkZXMgdGhlIGZhc3Rlc3QgcG9zc2libGUgaGFuZGxpbmcgb2YgcGFnZSBmYXVsdHMKLTsgc2luY2UgaXQganVtcCBkaXJlY3RseSBoZXJlLiAgSWYgdGhpcyBpcyBhIHBhZ2UgZmF1bHQsIHRoZSBudW1iZXIKLTsgaW1tZWRpYXRlbHkgb24gdGhlIHN0YWNrIHdpbGwgYmUgYW4gZXJyb3IgY29kZSwgYXQgb2Zmc2V0IDQgd2lsbCBiZQotOyB0aGUgZWlwIG9mIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiwgYXQgb2Zmc2V0IDggd2lsbCBiZSB0aGUgY3Mgb2YgdGhlCi07IGZhdWx0aW5nIGluc3RydWN0aW9uLiAgSWYgaXQgaXMgYSBoYXJkd2FyZSBpbnRlcnJ1cHQsIGl0IHdpbGwgbm90IGhhdmUKLTsgdGhlIGVycm9yIGNvZGUgYW5kIHRoZSBlZmxhZ3Mgd2lsbCBiZSBhdCBvZmZzZXQgOC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBQRl9oYW5kbGVyNGsKLQotOyBGaWxsIGluIHdoZW4gd2UgaGF2ZSB0ZXN0ZWQgYWxsIHRoZSA2NEtiIGNvZGUKLQotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBqbXAgZmFyIGR3b3JkIFtjczpJTlQxNEdhdGVdOyBDaGFpbiB0byBwcmV2aW91cyBoYW5kbGVyCi1lbHNlCi0gICAgICAgIGptcCAgICAgW0ZXT1JEIGNzOklOVDE0R2F0ZV07IENoYWluIHRvIHByZXZpb3VzIGhhbmRsZXIKLWVuZGlmCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgSW5zdGFsbEZhdWx0SGFuZGxlcih2b2lkICpiYXNlQWRkcixpbnQgYmFua1NpemUpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJbnN0YWxsZXMgdGhlIHBhZ2UgZmF1bHQgaGFuZGxlciBkaXJlY3RseSBpbnQgdGhlIGludGVycnVwdCBkZXNjcmlwdG9yCi07IHRhYmxlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlLiBUaGlzIG9mIGNvdXJzZSByZXF1aXJlcyByaW5nIDAgYWNjZXNzLAotOyBidXQgbm9uZSBvZiB0aGlzIHN0dWZmIHdpbGwgcnVuIHdpdGhvdXQgcmluZyAwIQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIEluc3RhbGxGYXVsdEhhbmRsZXIKLQotICAgICAgICBBUkcgICAgIGJhc2VBZGRyOlVMT05HLCBiYW5rU2l6ZTpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgW0RXT1JEIExhc3RQYWdlXSwwICA7IE5vIHBhZ2VzIGhhdmUgYmVlbiBtYXBwZWQKLSAgICAgICAgbW92ICAgICBheCxjcwotICAgICAgICBtb3YgICAgIFtWYWxpZENTXSxheCAgICAgICAgOyBTYXZlIENTIHZhbHVlIGZvciBwYWdlIGZhdWx0cwotCi07IFB1dCBhZGRyZXNzIG9mIG91ciBwYWdlIGZhdWx0IGhhbmRsZXIgaW50byB0aGUgSURUIGRpcmVjdGx5Ci0KLSAgICAgICAgc3ViICAgICBlc3AsNiAgICAgICAgICAgICAgIDsgQWxsb2NhdGUgc3BhY2Ugb24gc3RhY2sKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgc2lkdCAgICBbc3M6ZXNwXSAgICAgICAgICAgIDsgU3RvcmUgcG9pbnRlciB0byBJRFQKLWVsc2UKLSAgICAgICAgc2lkdCAgICBbRldPUkQgc3M6ZXNwXSAgICAgIDsgU3RvcmUgcG9pbnRlciB0byBJRFQKLWVuZGlmCi0gICAgICAgIHBvcCAgICAgYXggICAgICAgICAgICAgICAgICA7IGFkZCBlc3AsMgotICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBBYnNvbHV0ZSBhZGRyZXNzIG9mIElEVAotICAgICAgICBhZGQgICAgIGVheCwxNCo4ICAgICAgICAgICAgOyBQb2ludCB0byBJbnQgIzE0Ci0KLTsgTm90ZSB0aGF0IEludGVycnVwdCBnYXRlcyBkbyBub3QgaGF2ZSB0aGUgaGlnaCBhbmQgbG93IHdvcmQgb2YgdGhlCi07IG9mZnNldCBpbiBhZGphY2VudCB3b3JkcyBpbiBtZW1vcnksIHRoZXJlIGFyZSA0IGJ5dGVzIHNlcGFyYXRpbmcgdGhlbS4KLQotICAgICAgICBtb3YgICAgIGVjeCxbZWF4XSAgICAgICAgICAgOyBHZXQgY3MgYW5kIGxvdyAxNiBiaXRzIG9mIG9mZnNldAotICAgICAgICBtb3YgICAgIGVkeCxbZWF4KzZdICAgICAgICAgOyBHZXQgaGlnaCAxNiBiaXRzIG9mIG9mZnNldCBpbiBkeAotICAgICAgICBzaGwgICAgIGVkeCwxNgotICAgICAgICBtb3YgICAgIGR4LGN4ICAgICAgICAgICAgICAgOyBlZHggaGFzIG9mZnNldAotICAgICAgICBtb3YgICAgIFtJTlQxNE9mZnNldF0sZWR4ICAgOyBTYXZlIG9mZnNldAotICAgICAgICBzaHIgICAgIGVjeCwxNgotICAgICAgICBtb3YgICAgIFtJTlQxNFNlbGVjdG9yXSxjeCAgOyBTYXZlIG9yaWdpbmFsIGNzCi0gICAgICAgIG1vdiAgICAgW2VheCsyXSxjcyAgICAgICAgICA7IEluc3RhbGwgbmV3IGNzCi0gICAgICAgIG1vdiAgICAgZWR4LG9mZnNldCBQRl9oYW5kbGVyNjRrCi0gICAgICAgIGNtcCAgICAgW1VJTlQgYmFua1NpemVdLDQKLSAgICAgICAgam5lICAgICBAQDEKLSAgICAgICAgbW92ICAgICBlZHgsb2Zmc2V0IFBGX2hhbmRsZXI0awotQEAxOiAgICBtb3YgICAgIFtlYXhdLGR4ICAgICAgICAgICAgOyBJbnN0YWxsIGxvdyB3b3JkIG9mIG9mZnNldAotICAgICAgICBzaHIgICAgIGVkeCwxNgotICAgICAgICBtb3YgICAgIFtlYXgrNl0sZHggICAgICAgICAgOyBJbnN0YWxsIGhpZ2ggd29yZCBvZiBvZmZzZXQKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFJlbW92ZUZhdWx0SGFuZGxlcih2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2xvc2VzIGRvd24gdGhlIHZpcnR1YWwgZnJhbWVidWZmZXIgc2VydmljZXMgYW5kIHJlc3RvcmVzIHRoZSBwcmV2aW91cwotOyBwYWdlIGZhdWx0IGhhbmRsZXIuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUmVtb3ZlRmF1bHRIYW5kbGVyCi0KLSAgICAgICAgZW50ZXJfYwotCi07IFJlbW92ZSBwYWdlIGZhdWx0IGhhbmRsZXIgZnJvbSBJRFQKLQotICAgICAgICBzdWIgICAgIGVzcCw2ICAgICAgICAgICAgICAgOyBBbGxvY2F0ZSBzcGFjZSBvbiBzdGFjawotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBzaWR0ICAgIFtzczplc3BdICAgICAgICAgICAgOyBTdG9yZSBwb2ludGVyIHRvIElEVAotZWxzZQotICAgICAgICBzaWR0ICAgIFtGV09SRCBzczplc3BdICAgICAgOyBTdG9yZSBwb2ludGVyIHRvIElEVAotZW5kaWYKLQotICAgICAgICBwb3AgICAgIGF4ICAgICAgICAgICAgICAgICAgOyBhZGQgZXNwLDIKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgQWJzb2x1dGUgYWRkcmVzcyBvZiBJRFQKLSAgICAgICAgYWRkICAgICBlYXgsMTQqOCAgICAgICAgICAgIDsgUG9pbnQgdG8gSW50ICMxNAotICAgICAgICBtb3YgICAgIGN4LFtJTlQxNFNlbGVjdG9yXQotICAgICAgICBtb3YgICAgIFtlYXgrMl0sY3ggICAgICAgICAgOyBSZXN0b3JlIG9yaWdpbmFsIENTCi0gICAgICAgIG1vdiAgICAgZWR4LFtJTlQxNE9mZnNldF0KLSAgICAgICAgbW92ICAgICBbZWF4XSxkeCAgICAgICAgICAgIDsgSW5zdGFsbCBsb3cgd29yZCBvZiBvZmZzZXQKLSAgICAgICAgc2hyICAgICBlZHgsMTYKLSAgICAgICAgbW92ICAgICBbZWF4KzZdLGR4ICAgICAgICAgIDsgSW5zdGFsbCBoaWdoIHdvcmQgb2Ygb2Zmc2V0Ci0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBJbnN0YWxsQmFua0Z1bmMoaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJbnN0YWxscyB0aGUgYmFuayBzd2l0Y2ggZnVuY3Rpb24gYnkgcmVsb2NhdGluZyBpdCBpbnRvIG91ciBkYXRhIHNlZ21lbnQKLTsgYW5kIG1ha2luZyBpdCBpbnRvIGEgY2FsbGFibGUgZnVuY3Rpb24uIFdlIGRvIGl0IHRoaXMgd2F5IHRvIG1ha2UgdGhlCi07IGNvZGUgaWRlbnRpY2FsIHRvIHRoZSB3YXkgdGhhdCB0aGUgVmZsYXREIGRldmljZXMgd29yayB1bmRlciBXaW5kb3dzLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIEluc3RhbGxCYW5rRnVuYwotCi0gICAgICAgIEFSRyAgICAgY29kZUxlbjpVSU5ULCBiYW5rRnVuYzpEUFRSCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgZXNpLFtiYW5rRnVuY10gICAgICA7IENvcHkgdGhlIGNvZGUgaW50byBidWZmZXIKLSAgICAgICAgbW92ICAgICBlZGksb2Zmc2V0IEJhbmtGdW5jQnVmCi0gICAgICAgIG1vdiAgICAgZWN4LFtjb2RlTGVuXQotICAgIHJlcCBtb3ZzYgotICAgICAgICBtb3YgICAgIFtCWVRFIGVkaV0sMEMzaCAgICAgOyBUZXJtaW5hdGUgdGhlIGZ1bmN0aW9uIHdpdGggYSBuZWFyIHJldAotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBJbml0UGFnaW5nKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJbml0aWFsaXplcyBwYWdpbmcgc3lzdGVtLiBJZiBwYWdpbmcgaXMgbm90IGVuYWJsZWQsIGJ1aWxkcyBhIHBhZ2UgdGFibGUKLTsgZGlyZWN0b3J5IGFuZCBwYWdlIHRhYmxlcyBmb3IgcGh5c2ljYWwgbWVtb3J5Ci07Ci07ICAgRXhpdDogICAgICAgMCAgIC0gU3VjY2Vzc2Z1bAotOyAgICAgICAgICAgICAgIC0xICAtIENvdWxkbid0IGluaXRpYWxpemUgcGFnaW5nIG1lY2hhbmlzbQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIEluaXRQYWdpbmcKLQotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoICAgIGVkeAotICAgICAgICBwdXNoICAgIGVzaQotICAgICAgICBwdXNoICAgIGVkaQotCi07IEFyZSB3ZSBydW5uaW5nIHVuZGVyIENhdXNlV2F5PwotCi0gICAgICAgIG1vdiAgICAgYXgsMEZGRjloCi0gICAgICAgIGludCAgICAgMzFoCi0gICAgICAgIGpjICAgICAgQEBOb3RDYXVzZXdheQotICAgICAgICBjbXAgICAgIGVjeCwiQ0FVUyIKLSAgICAgICAgam56ICAgICBAQE5vdENhdXNld2F5Ci0gICAgICAgIGNtcCAgICAgZWR4LCJFV0FZIgotICAgICAgICBqbnogICAgIEBATm90Q2F1c2V3YXkKLQotICAgICAgICBtb3YgICAgIFtCT09MIFZGX2hhdmVDYXVzZVdheV0sMQotICAgICAgICBtb3YgICAgIFtDYXVzZVdheURJUkxpbmVhcl0sZXNpCi0gICAgICAgIG1vdiAgICAgW0NhdXNlV2F5MXN0TGluZWFyXSxlZGkKLQotOyBDaGVjayBmb3IgRFBNSQotCi0gICAgICAgIG1vdiAgICAgYXgsMGZmMDBoCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgaW50ICAgICAzMWgKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBzaHIgICAgIGVkaSwyCi0gICAgICAgIGFuZCAgICAgZWRpLDMKLSAgICAgICAgY21wICAgICBlZGksMgotICAgICAgICBqeiAgICAgIEBARXJyRXhpdCAgICAgICAgICAgICAgIDsgTm90IHN1cHBvcnRlZCB1bmRlciBEUE1JCi0KLSAgICAgICAgbW92ICAgICBlYXgsW0NhdXNlV2F5RElSTGluZWFyXQotICAgICAgICBqbXAgICAgIEBAQ29weUNSMwotCi1AQE5vdENhdXNld2F5OgotICAgICAgICBtb3YgICAgIGF4LGNzCi0gICAgICAgIHRlc3QgICAgYXgsMyAgICAgICAgICAgICAgICAgICAgOyBXaGljaCByaW5nIGFyZSB3ZSBydW5uaW5nCi0gICAgICAgIGpueiAgICAgQEBFcnJFeGl0ICAgICAgICAgICAgICAgOyBOZWVkcyB6ZXJvIHJpbmcgdG8gYWNjZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwYWdlIHRhYmxlcyAoQ1IzKQotICAgICAgICBtb3YgICAgIGVheCxjcjAgICAgICAgICAgICAgICAgIDsgTG9hZCBDUjAKLSAgICAgICAgdGVzdCAgICBlYXgsODAwMDAwMDBoICAgICAgICAgICA7IElzIHBhZ2luZyBlbmFibGVkPwotICAgICAgICBqeiAgICAgIEBARXJyRXhpdCAgICAgICAgICAgICAgIDsgTm8sIHdlIG11c3QgaGF2ZSBwYWdpbmchCi0KLSAgICAgICAgbW92ICAgICBlYXgsY3IzICAgICAgICAgICAgICAgICA7IExvYWQgZGlyZWN0b3J5IGFkZHJlc3MKLSAgICAgICAgYW5kICAgICBlYXgsMEZGRkZGMDAwaAotCi1AQENvcHlDUjM6Ci0gICAgICAgIG1vdiAgICAgW1BEQlJdLGVheCAgICAgICAgICAgICAgOyBTYXZlIGl0Ci0gICAgICAgIG1vdiAgICAgZXNpLGVheAotICAgICAgICBtb3YgICAgIGVkaSxvZmZzZXQgcGFnZURpcmVjdG9yeQotICAgICAgICBtb3YgICAgIGVjeCwxMDI0Ci0gICAgICAgIGNsZAotICAgICAgICByZXAgICAgIG1vdnNkICAgICAgICAgICAgICAgICAgIDsgQ29weSB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZSBkaXJlY3RvcnkKLSAgICAgICAgY21wICAgICBbRFdPUkQgYWNjZXNzUGFnZUFkZHJdLDA7IENoZWNrIGlmIHdlIGhhdmUgYWxsb2NhdGVkIHBhZ2UKLSAgICAgICAgam5lICAgICBAQEhhdmVSZWFsTWVtICAgICAgICAgICA7IHRhYmxlIGFscmVhZHkgKHdlIGNhbnQgZnJlZSBpdCkKLQotICAgICAgICBtb3YgICAgIGVheCwwMTAwaCAgICAgICAgICAgICAgIDsgRFBNSSBET1MgYWxsb2NhdGUKLSAgICAgICAgbW92ICAgICBlYngsODE5Mi8xNgotICAgICAgICBpbnQgICAgIDMxaCAgICAgICAgICAgICAgICAgICAgIDsgQWxsb2NhdGUgODE5MiBieXRlcwotICAgICAgICBhbmQgICAgIGVheCwwRkZGRmgKLSAgICAgICAgc2hsICAgICBlYXgsNCAgICAgICAgICAgICAgICAgICA7IEVBWCBwb2ludHMgdG8gbmV3bHkgYWxsb2NhdGVkIG1lbW9yeQotICAgICAgICBhZGQgICAgIGVheCw0MDk1Ci0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGggICAgICAgICAgOyBQYWdlIGFsaWduCi0gICAgICAgIG1vdiAgICAgW2FjY2Vzc1BhZ2VBZGRyXSxlYXgKLQotQEBIYXZlUmVhbE1lbToKLSAgICAgICAgbW92ICAgICBlYXgsW2FjY2Vzc1BhZ2VBZGRyXSAgICA7IEVBWCAtPiBwYWdlIHRhYmxlIGluIDFzdCBNYgotICAgICAgICBzaHIgICAgIGVheCwxMgotICAgICAgICBhbmQgICAgIGVheCwzRkZoICAgICAgICAgICAgICAgIDsgUGFnZSB0YWJsZSBvZmZzZXQKLSAgICAgICAgc2hsICAgICBlYXgsMgotICAgICAgICBjbXAgICAgIFtCT09MIFZGX2hhdmVDYXVzZVdheV0sMAotICAgICAgICBqeiAgICAgIEBATm90Q1cwCi0gICAgICAgIG1vdiAgICAgZWJ4LFtDYXVzZVdheTFzdExpbmVhcl0KLSAgICAgICAgam1wICAgICBAQFB1dDFzdAotCi1AQE5vdENXMDoKLSAgICAgICAgbW92ICAgICBlYngsW1BEQlJdCi0gICAgICAgIG1vdiAgICAgZWJ4LFtlYnhdCi0gICAgICAgIGFuZCAgICAgZWJ4LDBGRkZGRjAwMGggICAgICAgICAgOyBQYWdlIHRhYmxlIGZvciAxc3QgbWVnYWJ5dGUKLQotQEBQdXQxc3Q6Ci0gICAgICAgIGFkZCAgICAgZWF4LGVieAotICAgICAgICBtb3YgICAgIFthY2Nlc3NQYWdlVGFibGVdLGVheAotICAgICAgICBzdWIgICAgIGVheCxlYXggICAgICAgICAgICAgICAgIDsgTm8gZXJyb3IKLSAgICAgICAgam1wICAgICBAQEV4aXQKLQotQEBFcnJFeGl0OgotICAgICAgICBtb3YgICAgIGVheCwtMQotCi1AQEV4aXQ6IHBvcCAgICAgZWRpCi0gICAgICAgIHBvcCAgICAgZXNpCi0gICAgICAgIHBvcCAgICAgZWR4Ci0gICAgICAgIHBvcCAgICAgZWN4Ci0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIENsb3NlUGFnaW5nKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDbG9zZXMgdGhlIHBhZ2luZyBzeXN0ZW0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBDbG9zZVBhZ2luZwotCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIHB1c2ggICAgZWN4Ci0gICAgICAgIHB1c2ggICAgZWR4Ci0gICAgICAgIHB1c2ggICAgZXNpCi0gICAgICAgIHB1c2ggICAgZWRpCi0KLSAgICAgICAgbW92ICAgICBlYXgsW2FjY2Vzc1BhZ2VBZGRyXQotICAgICAgICBjYWxsICAgIEFjY2Vzc1BhZ2UgICAgICAgICAgICAgIDsgUmVzdG9yZSBBY2Nlc3NQYWdlIG1hcHBpbmcKLSAgICAgICAgbW92ICAgICBlZGksW1BEQlJdCi0gICAgICAgIG1vdiAgICAgZXNpLG9mZnNldCBwYWdlRGlyZWN0b3J5Ci0gICAgICAgIG1vdiAgICAgZWN4LDEwMjQKLSAgICAgICAgY2xkCi0gICAgICAgIHJlcCAgICAgbW92c2QgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwYWdlIHRhYmxlIGRpcmVjdG9yeQotCi1AQEV4aXQ6IHBvcCAgICAgZWRpCi0gICAgICAgIHBvcCAgICAgZXNpCi0gICAgICAgIHBvcCAgICAgZWR4Ci0gICAgICAgIHBvcCAgICAgZWN4Ci0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBsb25nIEFjY2Vzc1BhZ2UobG9uZyBwaHlzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTWFwcyBhIGtub3duIHBhZ2UgdG8gZ2l2ZW4gcGh5c2ljYWwgbWVtb3J5Ci07ICAgRW50cnk6ICAgICAgRUFYIC0gUGh5c2ljYWwgbWVtb3J5Ci07ICAgRXhpdDogICAgICAgRUFYIC0gTGluZWFyIG1lbW9yeSBhZGRyZXNzIG9mIG1hcHBlZCBwaHlzIG1lbQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhdGljICAgICBBY2Nlc3NQYWdlCi0KLSAgICAgICAgcHVzaCAgICBlZHgKLSAgICAgICAgbW92ICAgICBlZHgsW2FjY2Vzc1BhZ2VUYWJsZV0KLSAgICAgICAgb3IgICAgICBlYXgsNwotICAgICAgICBtb3YgICAgIFtlZHhdLGVheAotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgICAgICAgICA7IFVwZGF0ZSBwYWdlIHRhYmxlIGNhY2hlCi0gICAgICAgIG1vdiAgICAgZWF4LFthY2Nlc3NQYWdlQWRkcl0KLSAgICAgICAgcG9wICAgICBlZHgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGxvbmcgR2V0UGh5c2ljYWxBZGRyZXNzKGxvbmcgbGluZWFyKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBsaW5lYXIgYWRkcmVzcwotOyAgIEVudHJ5OiAgICAgIEVBWCAtIExpbmVhciBhZGRyZXNzIHRvIGNvbnZlcnQKLTsgICBFeGl0OiAgICAgICBFQVggLSBQaHlzaWNhbCBhZGRyZXNzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGF0aWMgICAgIEdldFBoeXNpY2FsQWRkcmVzcwotCi0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIHB1c2ggICAgZWR4Ci0gICAgICAgIG1vdiAgICAgZWR4LGVheAotICAgICAgICBzaHIgICAgIGVkeCwyMiAgICAgICAgICAgICAgICAgIDsgRURYIGlzIHRoZSBkaXJlY3Rvcnkgb2Zmc2V0Ci0gICAgICAgIG1vdiAgICAgZWJ4LFtQREJSXQotICAgICAgICBtb3YgICAgIGVkeCxbZWR4KjQrZWJ4XSAgICAgICAgIDsgTG9hZCBwYWdlIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgbW92ICAgICBlYXgsZWR4Ci0gICAgICAgIGNhbGwgICAgQWNjZXNzUGFnZSAgICAgICAgICAgICAgOyBBY2Nlc3MgdGhlIHBhZ2UgdGFibGUKLSAgICAgICAgbW92ICAgICBlZHgsZWF4Ci0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIHNociAgICAgZWF4LDEyCi0gICAgICAgIGFuZCAgICAgZWF4LDAzRkZoICAgICAgICAgICAgICAgOyBFQVggb2Zmc2V0IGludG8gcGFnZSB0YWJsZQotICAgICAgICBtb3YgICAgIGVheCxbZWR4K2VheCo0XSAgICAgICAgIDsgTG9hZCBwaHlzaWNhbCBhZGRyZXNzCi0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGgKLSAgICAgICAgcG9wICAgICBlZHgKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgQ3JlYXRlUGFnZVRhYmxlKGxvbmcgcGFnZURFbnRyeSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENyZWF0ZXMgYSBwYWdlIHRhYmxlIGZvciBzcGVjaWZpYyBhZGRyZXNzICg0TUIpCi07ICAgICAgIEVudHJ5OiAgRUFYIC0gUGFnZSBkaXJlY3RvcnkgZW50cnkgKHRvcCAxMC1iaXRzIG9mIGFkZHJlc3MpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGF0aWMgICAgIENyZWF0ZVBhZ2VUYWJsZQotCi0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIHB1c2ggICAgZWN4Ci0gICAgICAgIHB1c2ggICAgZWR4Ci0gICAgICAgIHB1c2ggICAgZWRpCi0gICAgICAgIG1vdiAgICAgZWJ4LGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIGFkZHJlc3MKLSAgICAgICAgbW92ICAgICBlYXgsODE5MgotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBjYWxsICAgIFZGX21hbGxvYyAgICAgICAgICAgICAgOyBBbGxvY2F0ZSBwYWdlIHRhYmxlIGRpcmVjdG9yeQotICAgICAgICBhZGQgICAgIGVzcCw0Ci0gICAgICAgIGFkZCAgICAgZWF4LDBGRkZoCi0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGggICAgICAgICAgOyBQYWdlIGFsaWduICg0S0IpCi0gICAgICAgIG1vdiAgICAgZWRpLGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIHBhZ2UgdGFibGUgbGluZWFyIGFkZHJlc3MKLSAgICAgICAgc3ViICAgICBlYXgsZWF4ICAgICAgICAgICAgICAgICA7IEZpbGwgd2l0aCB6ZXJvCi0gICAgICAgIG1vdiAgICAgZWN4LDEwMjQKLSAgICAgICAgY2xkCi0gICAgICAgIHJlcCAgICAgc3Rvc2QgICAgICAgICAgICAgICAgICAgOyBDbGVhciBwYWdlIHRhYmxlCi0gICAgICAgIHN1YiAgICAgZWRpLDQwOTYKLSAgICAgICAgbW92ICAgICBlYXgsZWRpCi0gICAgICAgIGNhbGwgICAgR2V0UGh5c2ljYWxBZGRyZXNzCi0gICAgICAgIG1vdiAgICAgZWR4LFtQREJSXQotICAgICAgICBvciAgICAgIGVheCw3ICAgICAgICAgICAgICAgICAgIDsgUHJlc2VudC93cml0ZS91c2VyIGJpdAotICAgICAgICBtb3YgICAgIFtlZHgrZWJ4KjRdLGVheCAgICAgICAgIDsgU2F2ZSBwaHlzaWNhbCBhZGRyZXNzIGludG8gcGFnZSBkaXJlY3RvcnkKLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICAgICAgOyBVcGRhdGUgcGFnZSB0YWJsZSBjYWNoZQotICAgICAgICBwb3AgICAgIGVkaQotICAgICAgICBwb3AgICAgIGVkeAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBNYXBQaHlzaWNhbDJMaW5lYXIodWxvbmcgcEFkZHIsIHVsb25nIGxBZGRyLCBpbnQgcGFnZXMsIGludCBmbGFncyk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNYXBzIHBoeXNpY2FsIG1lbW9yeSBpbnRvIGxpbmVhciBtZW1vcnkKLTsgICBFbnRyeTogICAgICBwQWRkciAgIC0gUGh5c2ljYWwgYWRkcmVzcwotOyAgICAgICAgICAgICAgIGxBZGRyICAgLSBMaW5lYXIgYWRkcmVzcwotOyAgICAgICAgICAgICAgIHBhZ2VzICAgLSBOdW1iZXIgb2YgNEsgcGFnZXMgdG8gbWFwCi07ICAgICAgICAgICAgICAgZmxhZ3MgICAtIFBhZ2UgZmxhZ3MKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMCAgID0gICAgICAgcHJlc2VudAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCAxICAgPSAgICAgICBSZWFkKDApL1dyaXRlKDEpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgTWFwUGh5c2ljYWwyTGluZWFyCi0KLSAgICAgICAgQVJHICAgICBwQWRkcjpVTE9ORywgbEFkZHI6VUxPTkcsIHBhZ2VzOlVJTlQsIHBmbGFnczpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIGFuZCAgICAgW1VMT05HIHBBZGRyXSwwRkZGRkYwMDBoOyBQYWdlIGJvdW5kYXJ5Ci0gICAgICAgIGFuZCAgICAgW1VMT05HIGxBZGRyXSwwRkZGRkYwMDBoOyBQYWdlIGJvdW5kYXJ5Ci0gICAgICAgIG1vdiAgICAgZWN4LFtwZmxhZ3NdCi0gICAgICAgIGFuZCAgICAgZWN4LDExYiAgICAgICAgICAgICAgICAgOyBKdXN0IHR3byBiaXRzCi0gICAgICAgIG9yICAgICAgZWN4LDEwMGIgICAgICAgICAgICAgICAgOyBTdXBlcnZpc29yIGJpdAotICAgICAgICBtb3YgICAgIFtwZmxhZ3NdLGVjeAotCi0gICAgICAgIG1vdiAgICAgZWR4LFtsQWRkcl0KLSAgICAgICAgc2hyICAgICBlZHgsMjIgICAgICAgICAgICAgICAgICA7IEVEWCA9IERpcmVjdG9yeQotICAgICAgICBtb3YgICAgIGVzaSxbUERCUl0KLSAgICAgICAgbW92ICAgICBlZGksW3BhZ2VzXSAgICAgICAgICAgICA7IEVESSBwYWdlIGNvdW50Ci0gICAgICAgIG1vdiAgICAgZWJ4LFtsQWRkcl0KLQotQEBDcmVhdGVMb29wOgotICAgICAgICBtb3YgICAgIGVjeCxbZXNpK2VkeCo0XSAgICAgICAgIDsgTG9hZCBwYWdlIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgdGVzdCAgICBlY3gsMSAgICAgICAgICAgICAgICAgICA7IElzIGl0IHByZXNlbnQ/Ci0gICAgICAgIGpueiAgICAgQEBUYWJsZU9LCi0gICAgICAgIG1vdiAgICAgZWF4LGVkeAotICAgICAgICBjYWxsICAgIENyZWF0ZVBhZ2VUYWJsZSAgICAgICAgIDsgQ3JlYXRlIGEgcGFnZSB0YWJsZQotQEBUYWJsZU9LOgotICAgICAgICBtb3YgICAgIGVheCxlYngKLSAgICAgICAgc2hyICAgICBlYXgsMTIKLSAgICAgICAgYW5kICAgICBlYXgsM0ZGaAotICAgICAgICBzdWIgICAgIGVheCwxMDI0Ci0gICAgICAgIG5lZyAgICAgZWF4ICAgICAgICAgICAgICAgICAgICAgOyBFQVggPSBwYWdlIGNvdW50IGluIHRoaXMgdGFibGUKLSAgICAgICAgaW5jICAgICBlZHggICAgICAgICAgICAgICAgICAgICA7IE5leHQgdGFibGUKLSAgICAgICAgbW92ICAgICBlYngsMCAgICAgICAgICAgICAgICAgICA7IE5leHQgdGltZSB3ZSdsbCBtYXAgMUsgcGFnZXMKLSAgICAgICAgc3ViICAgICBlZGksZWF4ICAgICAgICAgICAgICAgICA7IFN1YnRyYWN0IG1hcHBlZCBwYWdlcyBmcm9tIHBhZ2UgY291bnQKLSAgICAgICAgam5zICAgICBAQENyZWF0ZUxvb3AgICAgICAgICAgICA7IENyZWF0ZSBtb3JlIHRhYmxlcyBpZiBuZWNlc3NhcnkKLQotICAgICAgICBtb3YgICAgIGVjeCxbcGFnZXNdICAgICAgICAgICAgIDsgRUNYID0gUGFnZSBjb3VudAotICAgICAgICBtb3YgICAgIGVzaSxbbEFkZHJdCi0gICAgICAgIHNociAgICAgZXNpLDEyICAgICAgICAgICAgICAgICAgOyBPZmZzZXQgcGFydCBpc24ndCBuZWVkZWQKLSAgICAgICAgbW92ICAgICBlZGksW3BBZGRyXQotQEBNYXBwaW5nTG9vcDoKLSAgICAgICAgbW92ICAgICBlYXgsZXNpCi0gICAgICAgIHNociAgICAgZWF4LDEwICAgICAgICAgICAgICAgICAgOyBFQVggPSBvZmZzZXQgdG8gcGFnZSBkaXJlY3RvcnkKLSAgICAgICAgbW92ICAgICBlYngsW1BEQlJdCi0gICAgICAgIG1vdiAgICAgZWF4LFtlYXgqNCtlYnhdICAgICAgICAgOyBFQVggPSBwYWdlIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgY2FsbCAgICBBY2Nlc3NQYWdlCi0gICAgICAgIG1vdiAgICAgZWJ4LGVzaQotICAgICAgICBhbmQgICAgIGVieCwzRkZoICAgICAgICAgICAgICAgIDsgRUJYID0gb2Zmc2V0IHRvIHBhZ2UgdGFibGUKLSAgICAgICAgbW92ICAgICBlZHgsZWRpCi0gICAgICAgIGFkZCAgICAgZWRpLDQwOTYgICAgICAgICAgICAgICAgOyBOZXh0IHBoeXNpY2FsIGFkZHJlc3MKLSAgICAgICAgaW5jICAgICBlc2kgICAgICAgICAgICAgICAgICAgICA7IE5leHQgbGluZWFyIHBhZ2UKLSAgICAgICAgb3IgICAgICBlZHgsW3BmbGFnc10gICAgICAgICAgICA7IFVwZGF0ZSBmbGFncy4uLgotICAgICAgICBtb3YgICAgIFtlYXgrZWJ4KjRdLGVkeCAgICAgICAgIDsgU3RvcmUgcGFnZSB0YWJsZSBlbnRyeQotICAgICAgICBsb29wICAgIEBATWFwcGluZ0xvb3AKLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICAgICAgOyBVcGRhdGUgcGFnZSB0YWJsZSBjYWNoZQotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGNvZGVzZWcgIF92ZmxhdAotCi1lbmRpZgotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9jcHVpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDdlNTcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBTTVggZW1iZWRkZWQgc3lzdGVtcyBkZXZlbG9wbWVudC4KLSoKLSogRGVzY3JpcHRpb246ICBTTVggc3BlY2lmaWMgY29kZSBmb3IgdGhlIENQVSBkZXRlY3Rpb24gbW9kdWxlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRXh0ZXJuYWwgdGltaW5nIGZ1bmN0aW9uICovCi0KLXZvaWQgX19aVGltZXJJbml0KHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURvIG5vdGhpbmcgZm9yIERPUyBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhyZWFkIHByaW9yaXRpZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTZXRNYXhUaHJlYWRQcmlvcml0eSgpICAgICAgMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURvIG5vdGhpbmcgZm9yIERPUyBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhyZWFkIHByaW9yaXRpZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoaSkgICAgKHZvaWQpKGkpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgR2V0Q291bnRlckZyZXF1ZW5jeSgKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICpmcmVxKQotewotICAgIHVsb25nIHJlc29sdXRpb247Ci0KLSAgICBfX1pUaW1lckluaXQoKTsKLSAgICBVTFpUaW1lclJlc29sdXRpb24oJnJlc29sdXRpb24pOwotICAgIGZyZXEtPmxvdyA9ICh1bG9uZykoMTAwMDAwMDAwMDAuMCAvIHJlc29sdXRpb24pOwotICAgIGZyZXEtPmhpZ2ggPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodCktPmxvdyA9IFVMWlJlYWRUaW1lKCkgKiAxMDAwMEw7ICBcCi0gICAgKHQpLT5oaWdoID0gMDsgICAgICAgICAgICAgICAgICAgICAgXAotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L2V2ZW50LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzYzI2MS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvZXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgU01YIGVtYmVkZGVkIHN5c3RlbXMgZGV2ZWxvcG1lbnQKLSoKLSogRGVzY3JpcHRpb246ICAzMi1iaXQgU01YIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaCBjcm9zcyBwbGF0Zm9ybQotKiAgICAgICAgICAgICAgIGV2ZW50IGxpYnJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic214L3BzMm1vdXNlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWlib29sIF9WQVJBUEkgICBfRVZUX3VzZUV2ZW50cyA9IHRydWU7ICAvKiBUcnVlIHRvIHVzZSBldmVudCBoYW5kbGluZyAgICovCi1pYm9vbCBfVkFSQVBJICAgX0VWVF9pbnN0YWxsZWQgPSAwOyAgICAgLyogRXZlbnQgaGFuZGVycyBpbnN0YWxsZWQ/ICAgICAqLwotdWNoYXIgX1ZBUkFQSSAgICpfRVZUX2Jpb3NQdHIgPSBOVUxMOyAgIC8qIFBvaW50ZXIgdG8gdGhlIEJJT1MgZGF0YSBhcmVhICovCi1zdGF0aWMgaWJvb2wgICAgaGF2ZU1vdXNlID0gZmFsc2U7ICAgICAgLyogVHJ1ZSBpZiB3ZSBoYXZlIGEgbW91c2UgICAgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBFeHRlcm5hbCBhc3NlbWJsZXIgZnVuY3Rpb25zICovCi0KLXZvaWQgICAgRVZUQVBJIF9FVlRfcG9sbEpveXN0aWNrKHZvaWQpOwotdWludCAgICBFVlRBUEkgX0VWVF9kaXNhYmxlSW50KHZvaWQpOwotdWludCAgICBFVlRBUEkgX0VWVF9yZXN0b3JlSW50KHVpbnQgZmxhZ3MpOwotdm9pZCAgICBFVlRBUEkgX0VWVF9jb2RlU3RhcnQodm9pZCk7Ci12b2lkICAgIEVWVEFQSSBfRVZUX2NvZGVFbmQodm9pZCk7Ci12b2lkICAgIEVWVEFQSSBfRVZUX2NDb2RlU3RhcnQodm9pZCk7Ci12b2lkICAgIEVWVEFQSSBfRVZUX2NDb2RlRW5kKHZvaWQpOwotaW50ICAgICBFVlRBUEkgX0VWVF9nZXRLZXlDb2RlKHZvaWQpOwotaW50ICAgICBFVlRBUEkgRVZUX3JkaW54KGludCBwb3J0LGludCBpbmRleCk7Ci12b2lkICAgIEVWVEFQSSBFVlRfd3JpbngoaW50IHBvcnQsaW50IGluZGV4LGludCB2YWx1ZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRG8gbm90aGluZyBmb3IgRE9TLCBiZWNhdXNlIHdlIGFyZSBmdWxseSBpbnRlcnJ1cHQgZHJpdmVuLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9wdW1wTWVzc2FnZXMoKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB0aWNrcyBzaW5jZSBzeXN0ZW0KLXN0YXJ0dXAgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHBsYWNlZCBpbnRvCi10aGUgdGltZSBzdGFtcCBmaWVsZHMgb2YgZXZlbnRzLCBhbmQgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXV0byBtb3VzZSBkb3duCi1ldmVudHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX0VWVF9nZXRUaWNrcyh2b2lkKQotewotICAgIHJldHVybiAodWxvbmcpUE1fZ2V0TG9uZyhfRVZUX2Jpb3NQdHIrMHg2QykgKiA1NVVMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluY2x1ZGUgZ2VuZXJpYyByYXcgc2NhbmNvZGUga2V5Ym9hcmQgbW9kdWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJjb21tb24va2V5Ym9hcmQuYyIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZXRlcm1pbmVzIGlmIHdlIGhhdmUgYSBtb3VzZSBhdHRhY2hlZCBhbmQgZnVuY3Rpb25pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIGRldGVjdE1vdXNlKHZvaWQpCi17Ci0gICByZXR1cm4ocHMyUXVlcnkoKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotd2hhdCAgICAgICAgLSBFdmVudCBjb2RlCi1tZXNzYWdlICAgICAtIEV2ZW50IG1lc3NhZ2UKLXgseSAgICAgICAgIC0gTW91c2UgcG9zaXRpb24gYXQgdGltZSBvZiBldmVudAotYnV0X3N0YXQgICAgLSBNb3VzZSBidXR0b24gc3RhdHVzIGF0IHRpbWUgb2YgZXZlbnQKLQotUkVNQVJLUzoKLUFkZHMgYSBuZXcgbW91c2UgZXZlbnQgdG8gdGhlIGV2ZW50IHF1ZXVlLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gd2l0aGluCi10aGUgbW91c2UgaW50ZXJydXB0IHN1YnJvdXRpbmUsIHNvIGl0IG11c3QgYmUgZWZmaWNpZW50LgotCi1OT1RFOiAgIEludGVycnVwdHMgTVVTVCBiZSBPRkYgd2hpbGUgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBlbnN1cmUgd2UgaGF2ZQotCW11dHVhbGx5IGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gb3VyIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyBmb3IKLQlpbnRlcnJ1cHQgZHJpdmVuIHN5c3RlbXMgKGxpa2UgdW5kZXIgRE9TKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhZGRNb3VzZUV2ZW50KAotICAgIHVpbnQgd2hhdCwKLSAgICB1aW50IG1lc3NhZ2UsCi0gICAgaW50IHgsCi0gICAgaW50IHksCi0gICAgaW50IG1pY2tleVgsCi0gICAgaW50IG1pY2tleVksCi0gICAgdWludCBidXRfc3RhdCkKLXsKLSAgICBldmVudF90IGV2dDsKLQotICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0JLyogU2F2ZSBpbmZvcm1hdGlvbiBpbiBldmVudCByZWNvcmQuICovCi0JZXZ0LndoZW4gPSBfRVZUX2dldFRpY2tzKCk7Ci0JZXZ0LndoYXQgPSB3aGF0OwotCWV2dC5tZXNzYWdlID0gbWVzc2FnZTsKLQlldnQubW9kaWZpZXJzID0gYnV0X3N0YXQ7Ci0JZXZ0LndoZXJlX3ggPSB4OyAgICAgICAgICAgICAgICAvKiBTYXZlIG1vdXNlIGV2ZW50IHBvc2l0aW9uICAgICovCi0JZXZ0LndoZXJlX3kgPSB5OwotCWV2dC5yZWxhdGl2ZV94ID0gbWlja2V5WDsKLQlldnQucmVsYXRpdmVfeSA9IG1pY2tleVk7Ci0JZXZ0Lm1vZGlmaWVycyB8PSBFVlQua2V5TW9kaWZpZXJzOwotCWFkZEV2ZW50KCZldnQpOyAgICAgICAgICAgICAgICAgLyogQWRkIHRvIHRhaWwgb2YgZXZlbnQgcXVldWUgICAqLwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tYXNrICAgICAgICAtIEV2ZW50IG1hc2sKLWJ1dHN0YXRlICAgIC0gQnV0dG9uIHN0YXRlCi14ICAgICAgICAgICAtIE1vdXNlIHggY29vcmRpbmF0ZQoteSAgICAgICAgICAgLSBNb3VzZSB5IGNvb3JkaW5hdGUKLQotUkVNQVJLUzoKLU1vdXNlIGV2ZW50IGhhbmRsaW5nIHJvdXRpbmUuIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhIG1vdXNlIGV2ZW50IG9jY3VycywKLWFuZCB3ZSBjYWxsIHRoZSBhZGRNb3VzZUV2ZW50KCkgcm91dGluZSB0byBhZGQgdGhlIGFwcHJvcHJpYXRlIG1vdXNlIGV2ZW50Ci10byB0aGUgZXZlbnQgcXVldWUuCi0KLU5vdGU6IEludGVycnVwdHMgYXJlIE9OIHdoZW4gdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgbW91c2UgZHJpdmVyIGNvZGUuCi0vKkFNOiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGhhcyBub3QgYWN0dWFsbHkgYmVlbiBwb3J0ZWQgZnJvbSBET1MgeWV0IGFuZCBzaG91bGQgbm90ICovCi0vKkFNOiBiZSBpbnN0YWxsZWQgdW50aWwgaXQgaXMuICovCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRVZUQVBJIG1vdXNlSVNSKAotICAgIHVpbnQgbWFzaywKLSAgICB1aW50IGJ1dHN0YXRlLAotICAgIGludCB4LAotICAgIGludCB5LAotICAgIGludCBtaWNrZXlYLAotICAgIGludCBtaWNrZXlZKQotewotICAgIFJNUkVHUyAgcmVnczsKLSAgICB1aW50ICAgIHBzOwotCi0gICAgaWYgKG1hc2sgJiAxKSB7Ci0JLyogU2F2ZSB0aGUgY3VycmVudCBtb3VzZSBjb29yZGluYXRlcyAqLwotCUVWVC5teCA9IHg7IEVWVC5teSA9IHk7Ci0KLQkvKiBJZiB0aGUgbGFzdCBldmVudCB3YXMgYSBtb3ZlbWVudCBldmVudCwgdGhlbiBtb2RpZnkgdGhlIGxhc3QKLQkgKiBldmVudCByYXRoZXIgdGhhbiBwb3N0IGEgbmV3IG9uZSwgc28gdGhhdCB0aGUgcXVldWUgd2lsbCBub3QKLQkgKiBiZWNvbWUgc2F0dXJhdGVkLiBCZWZvcmUgd2UgbW9kaWZ5IHRoZSBkYXRhIHN0cnVjdHVyZXMsIHdlCi0JICogTVVTVCBlbnN1cmUgdGhhdCBpbnRlcnJ1cHRzIGFyZSBvZmYuCi0JICovCi0JcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsKLQlpZiAoRVZULm9sZE1vdmUgIT0gLTEpIHsKLQkgICAgRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3ggPSB4OyAgICAgICAgICAvKiBNb2RpZnkgZXhpc3Rpbmcgb25lICAqLwotCSAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ud2hlcmVfeSA9IHk7Ci0JICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS5yZWxhdGl2ZV94ICs9IG1pY2tleVg7Ci0JICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS5yZWxhdGl2ZV95ICs9IG1pY2tleVk7Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgRVZULm9sZE1vdmUgPSBFVlQuZnJlZUhlYWQ7ICAgICAgICAgLyogU2F2ZSBpZCBvZiB0aGlzIG1vdmUgZXZlbnQgICAqLwotCSAgICBhZGRNb3VzZUV2ZW50KEVWVF9NT1VTRU1PVkUsMCx4LHksbWlja2V5WCxtaWNrZXlZLGJ1dHN0YXRlKTsKLQkgICAgfQotCV9FVlRfcmVzdG9yZUludChwcyk7Ci0JfQotICAgIGlmIChtYXNrICYgMHgyQSkgewotCXBzID0gX0VWVF9kaXNhYmxlSW50KCk7Ci0JYWRkTW91c2VFdmVudChFVlRfTU9VU0VET1dOLG1hc2sgPj4gMSx4LHksMCwwLGJ1dHN0YXRlKTsKLQlFVlQub2xkTW92ZSA9IC0xOwotCV9FVlRfcmVzdG9yZUludChwcyk7Ci0JfQotICAgIGlmIChtYXNrICYgMHg1NCkgewotCXBzID0gX0VWVF9kaXNhYmxlSW50KCk7Ci0JYWRkTW91c2VFdmVudChFVlRfTU9VU0VVUCxtYXNrID4+IDIseCx5LDAsMCxidXRzdGF0ZSk7Ci0JRVZULm9sZE1vdmUgPSAtMTsKLQlfRVZUX3Jlc3RvcmVJbnQocHMpOwotCX0KLSAgICBFVlQub2xkS2V5ID0gLTE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotS2V5Ym9hcmQgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24uCi0KLU5PVEU6ICAgSW50ZXJydXB0cyBhcmUgT0ZGIHdoZW4gdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUga2V5Ym9hcmQgSVNSLAotCWFuZCB3ZSBsZWF2ZSB0aGVtIE9GRiB0aGUgZW50aXJlIHRpbWUuIFRoaXMgaGFzIGJlZW4gbW9kaWZpZWQgdG8gd29yawotICAgICAgaW4gY29uanVuY3Rpb24gd2l0aCBzbXgga2V5Ym9hcmQgaGFuZGxlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBFVlRBUEkga2V5Ym9hcmRJU1Iodm9pZCkKLXsKLSAgIFBNX2NoYWluUHJldktleSgpOwotICAgIHByb2Nlc3NSYXdTY2FuQ29kZShQTV9pbnBiKDB4NjApKTsKLSAgICBQTV9vdXRwYigweDIwLDB4MjApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfYWJvcnQoKQotewotICAgIEVWVF9leGl0KCk7Ci0gICAgUE1fZmF0YWxFcnJvcigiVW5oYW5kbGVkIGV4Y2VwdGlvbiEiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tb3VzZU1vdmUgICAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbmV2ZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQKLQotUkVNQVJLUzoKLUluaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZyBJU1IKLXRvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28gYnVpbGQKLXRoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KLQotV2UgdXNlIGhhbmRsZXIgbnVtYmVyIDIgb2YgdGhlIG1vdXNlIGxpYnJhcmllcyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIG91cgotZXZlbnQgaGFuZGxpbmcgcm91dGluZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2luaXQoCi0gICAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyIG1vdXNlTW92ZSkKLXsKLSAgICBpbnQgICAgIGk7Ci0KLSAgICBFVlQubW91c2VNb3ZlID0gbW91c2VNb3ZlOwotICAgIF9FVlRfYmlvc1B0ciA9IFBNX2dldEJJT1NQb2ludGVyKCk7Ci0gICAgRVZUX3Jlc3VtZSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWlsaXNlcyB0aGUgaW50ZXJuYWwgZXZlbnQgaGFuZGxpbmcgbW9kdWxlcy4gVGhlIEVWVF9zdXNwZW5kIGZ1bmN0aW9uCi1jYW4gYmUgY2FsbGVkIHRvIHN1c3BlbmQgZXZlbnQgaGFuZGxpbmcgKHN1Y2ggYXMgd2hlbiBzaGVsbGluZyBvdXQgdG8gRE9TKSwKLWFuZCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3VtZSBpdCBhZ2FpbiBsYXRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfcmVzdW1lKHZvaWQpCi17Ci0gICAgc3RhdGljIGludCAgICAgIGxvY2tlZCA9IDA7Ci0gICAgaW50ICAgICAgICAgICAgIHN0YXQ7Ci0gICAgdWNoYXIgICAgICAgICAgIG1vZHM7Ci0gICAgUE1fbG9ja0hhbmRsZSAgIGxoOwotCi0gICAgaWYgKF9FVlRfdXNlRXZlbnRzKSB7Ci0JLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgYW5kIGVuYWJsZSBvdXIgaW50ZXJydXB0IGhhbmRsZXJzICovCi0JaW5pdEV2ZW50UXVldWUoKTsKLQlQTV9zZXRLZXlIYW5kbGVyKGtleWJvYXJkSVNSKTsKLQlpZiAoKGhhdmVNb3VzZSA9IGRldGVjdE1vdXNlKCkpICE9IDApCi0JICAgIFBNX3NldE1vdXNlSGFuZGxlcigweEZGRkYsbW91c2VJU1IpOwotCi0JLyogUmVhZCB0aGUga2V5Ym9hcmQgbW9kaWZpZXIgZmxhZ3MgZnJvbSB0aGUgQklPUyB0byBnZXQgdGhlCi0JICogY29ycmVjdCBpbml0aWFsaXNhdGlvbiBzdGF0ZS4gVGhlIG9ubHkgc3RhdGUgd2UgY2FyZSBhYm91dCBpcwotCSAqIHRoZSBjb3JyZWN0IHRvZ2dsZSBzdGF0ZSBmbGFncyBzdWNoIGFzIFNDUk9MTExPQ0ssIE5VTUxPQ0sgYW5kCi0JICogQ0FQU0xPQ0suCi0JICovCi0JRVZULmtleU1vZGlmaWVycyA9IDA7Ci0JbW9kcyA9IFBNX2dldEJ5dGUoX0VWVF9iaW9zUHRyKzB4MTcpOwotCWlmIChtb2RzICYgMHgxMCkKLQkgICAgRVZULmtleU1vZGlmaWVycyB8PSBFVlRfU0NST0xMTE9DSzsKLQlpZiAobW9kcyAmIDB4MjApCi0JICAgIEVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX05VTUxPQ0s7Ci0JaWYgKG1vZHMgJiAweDQwKQotCSAgICBFVlQua2V5TW9kaWZpZXJzIHw9IEVWVF9DQVBTTE9DSzsKLQotCS8qIExvY2sgYWxsIG9mIHRoZSBjb2RlIGFuZCBkYXRhIHVzZWQgYnkgb3VyIHByb3RlY3RlZCBtb2RlIGludGVycnVwdAotCSAqIGhhbmRsaW5nIHJvdXRpbmVzLCBzbyB0aGF0IGl0IHdpbGwgY29udGludWUgdG8gd29yayBjb3JyZWN0bHkKLQkgKiB1bmRlciByZWFsIG1vZGUuCi0JICovCi0JaWYgKCFsb2NrZWQpIHsKLQkgICAgLyogSXQgaXMgZGlmZmljdWx0IHRvIGVuc3VyZSB0aGF0IHdlIGxvY2sgb3VyIGdsb2JhbCBkYXRhLCBzbyB3ZQotCSAgICAgKiBkbyB0aGlzIGJ5IHRha2luZyB0aGUgYWRkcmVzcyBvZiBhIHZhcmlhYmxlIGxvY2tpbmcgYWxsIGRhdGEKLQkgICAgICogMktiIG9uIGVpdGhlciBzaWRlLiBUaGlzIHNob3VsZCBwcm9wZXJseSBjb3ZlciB0aGUgZ2xvYmFsIGRhdGEKLQkgICAgICogdXNlZCBieSB0aGUgbW9kdWxlICh0aGUgb3RoZXIgYWx0ZXJuYXRpdmUgaXMgdG8gZGVjbGFyZSB0aGUKLQkgICAgICogdmFyaWFibGVzIGluIGFzc2VtYmxlciwgaW4gd2hpY2ggY2FzZSB3ZSBrbm93IGl0IHdpbGwgYmUKLQkgICAgICogY29ycmVjdCkuCi0JICAgICAqLwotCSAgICBzdGF0ICA9ICFQTV9sb2NrRGF0YVBhZ2VzKCZFVlQsc2l6ZW9mKEVWVCksJmxoKTsKLQkgICAgc3RhdCB8PSAhUE1fbG9ja0RhdGFQYWdlcygmX0VWVF9iaW9zUHRyLHNpemVvZihfRVZUX2Jpb3NQdHIpLCZsaCk7Ci0JICAgIHN0YXQgfD0gIVBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilfRVZUX2NDb2RlU3RhcnQsKGludClfRVZUX2NDb2RlRW5kLShpbnQpX0VWVF9jQ29kZVN0YXJ0LCZsaCk7Ci0JICAgIHN0YXQgfD0gIVBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilfRVZUX2NvZGVTdGFydCwoaW50KV9FVlRfY29kZUVuZC0oaW50KV9FVlRfY29kZVN0YXJ0LCZsaCk7Ci0JICAgIGlmIChzdGF0KSB7Ci0JCVBNX2ZhdGFsRXJyb3IoIlBhZ2UgbG9ja2luZyBzZXJ2aWNlcyBmYWlsZWQgLSBpbnRlcnJ1cHQgaGFuZGxpbmcgbm90IHNhZmUhIik7Ci0JCWV4aXQoMSk7Ci0JCX0KLQkgICAgbG9ja2VkID0gMTsKLQkgICAgfQotCi0JX0VWVF9pbnN0YWxsZWQgPSB0cnVlOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUNoYW5nZXMgdGhlIHJhbmdlIG9mIGNvb3JkaW5hdGVzIHJldHVybmVkIGJ5IHRoZSBtb3VzZSBmdW5jdGlvbnMgdG8gdGhlCi1zcGVjaWZpZWQgcmFuZ2Ugb2YgdmFsdWVzLiBUaGlzIGlzIHVzZWQgd2hlbiBjaGFuZ2luZyBiZXR3ZWVuIGdyYXBoaWNzCi1tb2RlcyBzZXQgdGhlIHJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IGRpc3BsYXkgbW9kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZSgKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcykKLXsKLSAgICBpZiAoaGF2ZU1vdXNlKSB7Ci0JcHMyTW91c2VTdG9wKCk7Ci0JcHMyTW91c2VTdGFydCggMCwgeFJlcywgMCwgeVJlcywgLTEsIC0xLCAtMSk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotTW9kaWZlcyB0aGUgbW91c2UgY29vcmRpbmF0ZXMgYXMgbmVjZXNzYXJ5IGlmIHNjYWxpbmcgdG8gT1MgY29vcmRpbmF0ZXMsCi1hbmQgc2V0cyB0aGUgT1MgbW91c2UgY3Vyc29yIHBvc2l0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9zZXRNb3VzZVBvcygKLSAgICBpbnQgKngsCi0gICAgaW50ICp5KQotewotICAgIGlmIChoYXZlTW91c2UpCi0JcHMyTW91c2VNb3ZlKCp4LCAqeSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1TdXNwZW5kcyBhbGwgb2Ygb3VyIGV2ZW50IGhhbmRsaW5nIG9wZXJhdGlvbnMuIFRoaXMgaXMgYWxzbyB1c2VkIHRvCi1kZS1pbnN0YWxsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zdXNwZW5kKHZvaWQpCi17Ci0gICAgdWNoYXIgICBtb2RzOwotCi0gICAgaWYgKF9FVlRfaW5zdGFsbGVkKSB7Ci0JUE1fcmVzdG9yZUtleUhhbmRsZXIoKTsKLSAgICBpZiAoaGF2ZU1vdXNlKQotCVBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIoKTsKLQotCS8qIFNldCB0aGUga2V5Ym9hcmQgbW9kaWZpZXIgZmxhZ3MgaW4gdGhlIEJJT1MgdG8gb3VyIHZhbHVlcyAqLwotCUVWVF9hbGxvd0xFRFModHJ1ZSk7Ci0JbW9kcyA9IFBNX2dldEJ5dGUoX0VWVF9iaW9zUHRyKzB4MTcpICYgfjB4NzA7Ci0JaWYgKEVWVC5rZXlNb2RpZmllcnMgJiBFVlRfU0NST0xMTE9DSykKLQkgICAgbW9kcyB8PSAweDEwOwotCWlmIChFVlQua2V5TW9kaWZpZXJzICYgRVZUX05VTUxPQ0spCi0JICAgIG1vZHMgfD0gMHgyMDsKLQlpZiAoRVZULmtleU1vZGlmaWVycyAmIEVWVF9DQVBTTE9DSykKLQkgICAgbW9kcyB8PSAweDQwOwotCVBNX3NldEJ5dGUoX0VWVF9iaW9zUHRyKzB4MTcsbW9kcyk7Ci0KLQkvKiBGbGFnIHRoYXQgd2UgYXJlIG5vIGxvbmdlciBpbnN0YWxsZWQgKi8KLQlfRVZUX2luc3RhbGxlZCA9IGZhbHNlOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUV4aXRzIHRoZSBldmVudCBtb2R1bGUgZm9yIHByb2dyYW0gdGVybWluYXRhdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfZXhpdCh2b2lkKQotewotICAgIEVWVF9zdXNwZW5kKCk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmY4ZGFhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9vc2hkci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFNNWCBlbWJlZGRlZCBzeXN0ZW1zIGRldmVsb3BtZW50LgotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L3BtLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvcG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllZTNkNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDExODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzIgYml0IFNNWCBlbWJlZGRlZCBzeXN0ZW1zIGRldmVsb3BtZW50LgotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAotKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQotKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKLSogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAotKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCi0jaW5jbHVkZSAienRpbWVyYy5oIgotI2luY2x1ZGUgImV2ZW50LmgiCi0jaW5jbHVkZSAibXRyci5oIgotI2luY2x1ZGUgInBtX2hlbHAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGRvcy5oPgotI2luY2x1ZGUgPGNvbmlvLmg+Ci0jaWZkZWYgIF9fR05VQ19fCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL25lYXJwdHIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxkaXJlY3QuaD4KLSNlbmRpZgotI2lmZGVmICBfX0JPUkxBTkRDX18KLSNwcmFnbWEgd2FybiAtcGFyCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCAgICAgb2xkTW9kZTsKLSAgICBpbnQgICAgIG9sZDUwTGluZXM7Ci0gICAgfSBET1Nfc3RhdGVCdWY7Ci0KLSNkZWZpbmUgTUFYX1JNX0JMT0NLUyAgIDEwCi0KLXN0YXRpYyBzdHJ1Y3QgewotICAgIHZvaWQgICAgKnA7Ci0gICAgdWludCAgICB0YWc7Ci0gICAgfSBybUJsb2Nrc1tNQVhfUk1fQkxPQ0tTXTsKLQotc3RhdGljIHVpbnQgICAgIFZFU0FCdWZfbGVuID0gMTAyNDsgICAgIC8qIExlbmd0aCBvZiB0aGUgVkVTQUJ1ZiBidWZmZXIgICAgICovCi1zdGF0aWMgdm9pZCAgICAgKlZFU0FCdWZfcHRyID0gTlVMTDsgICAgLyogTmVhciBwb2ludGVyIHRvIFZFU0FCdWYgICAgICAgICAgKi8KLXN0YXRpYyB1aW50ICAgICBWRVNBQnVmX3JzZWc7ICAgICAgICAgICAvKiBSZWFsIG1vZGUgc2VnbWVudCBvZiBWRVNBQnVmICAgICAqLwotc3RhdGljIHVpbnQgICAgIFZFU0FCdWZfcm9mZjsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBvZmZzZXQgb2YgVkVTQUJ1ZiAgICAgICovCi1zdGF0aWMgdm9pZCAgICAgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOwotdXNob3J0IF9WQVJBUEkgIF9QTV9zYXZlZERTID0gMDsKLXN0YXRpYyB1bG9uZyAgICBQREIgPSAwLCpwUERCID0gTlVMTDsKLXN0YXRpYyB1aW50ICAgICBWWERfdmVyc2lvbiA9IC0xOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11bG9uZyAgIF9BU01BUEkgX1BNX2dldFBEQih2b2lkKTsKLXZvaWQgICAgX0FTTUFQSSBfUE1fVnhEQ2FsbChWWERfcmVncyAqcmVncyx1aW50IG9mZix1aW50IHNlbCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRXh0ZXJuYWwgZnVuY3Rpb24gdG8gY2FsbCB0aGUgUE1IRUxQIGhlbHBlciBWeEQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9WeERDYWxsKAotICAgIFZYRF9yZWdzICpyZWdzKQotewotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLUJDRCBjb2RlZCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgVnhELCBvciAwIGlmIG5vdCBsb2FkZWQgKGllOiAweDIwMiAtIDIuMikKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBWeEQgdGhhdCB3ZSBoYXZlIGNvbm5lY3RlZCB0by4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50IFBNQVBJIFBNSEVMUF9nZXRWZXJzaW9uKHZvaWQpCi17Ci0gICAgcmV0dXJuIFZYRF92ZXJzaW9uID0gMDsKLX0KLQotdm9pZCBQTUFQSSBQTV9pbml0KHZvaWQpCi17Ci0jaWZuZGVmIFJFQUxNT0RFCi0gICAgTVRSUl9pbml0KCk7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCi1zaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgotdHlwZSAgICAtIFR5cGUgdG8gcGxhY2UgaW50byB0aGUgTVRSUiByZWdpc3RlcgotCi1SRVRVUk5TOgotRXJyb3IgY29kZSBkZXNjcmliaW5nIHRoZSByZXN1bHQuCi0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBlbmFibGUgd3JpdGUgY29tYmluaW5nIGZvciB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBvZiBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2VuYWJsZVdyaXRlQ29tYmluZSgKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIHNpemUsCi0gICAgdWludCB0eXBlKQotewotI2lmbmRlZiBSRUFMTU9ERQotICAgIHJldHVybiBNVFJSX2VuYWJsZVdyaXRlQ29tYmluZShiYXNlLHNpemUsdHlwZSk7Ci0jZWxzZQotICAgIHJldHVybiBQTV9NVFJSX05PVF9TVVBQT1JURUQ7Ci0jZW5kaWYKLX0KLQotaWJvb2wgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCkKLXsgcmV0dXJuIGZhbHNlOyB9Ci0KLWxvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCi17IHJldHVybiBfT1NfU01YOyB9Ci0KLWludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQoteyByZXR1cm4gUE1fMzg2OyB9Ci0KLXZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKGNoYXIgKnMpCi17Ci0gICAgdWludCBwb3MgPSBzdHJsZW4ocyk7Ci0gICAgaWYgKHNbcG9zLTFdICE9ICdcXCcpIHsKLQlzW3Bvc10gPSAnXFwnOwotCXNbcG9zKzFdID0gJ1wwJzsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCi0gICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQotewotICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKLX0KLQotdm9pZCBNR0xPdXRwdXQoY2hhciAqKTsKLQotdm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCi0JZmF0YWxFcnJvckNsZWFudXAoKTsKLSAgICBNR0xPdXRwdXQobXNnKTsKLS8qIE5vIHN1cHBvcnQgZm9yIGZwcmludGYoKSB1bmRlciBzbXggY3VycmVudGx5ISAqLwotLyogIGZwcmludGYoc3RkZXJyLCIlc1xuIiwgbXNnKTsgKi8KLSAgICBleGl0KDEpOwotfQotCi1zdGF0aWMgdm9pZCBFeGl0VkJFQnVmKHZvaWQpCi17Ci0gICAgaWYgKFZFU0FCdWZfcHRyKQotCVBNX2ZyZWVSZWFsU2VnKFZFU0FCdWZfcHRyKTsKLSAgICBWRVNBQnVmX3B0ciA9IDA7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKHVpbnQgKmxlbix1aW50ICpyc2VnLHVpbnQgKnJvZmYpCi17Ci0gICAgaWYgKCFWRVNBQnVmX3B0cikgewotCS8qIEFsbG9jYXRlIGEgZ2xvYmFsIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBWRVNBIFZCRSAqLwotCWlmICgoVkVTQUJ1Zl9wdHIgPSBQTV9hbGxvY1JlYWxTZWcoVkVTQUJ1Zl9sZW4sICZWRVNBQnVmX3JzZWcsICZWRVNBQnVmX3JvZmYpKSA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQlhdGV4aXQoRXhpdFZCRUJ1Zik7Ci0JfQotICAgICpsZW4gPSBWRVNBQnVmX2xlbjsKLSAgICAqcnNlZyA9IFZFU0FCdWZfcnNlZzsKLSAgICAqcm9mZiA9IFZFU0FCdWZfcm9mZjsKLSAgICByZXR1cm4gVkVTQUJ1Zl9wdHI7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQzODYoaW50IGludG5vLCBQTVJFR1MgKmluLCBQTVJFR1MgKm91dCkKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZXR1cm4gUE1faW50Mzg2eChpbnRubyxpbixvdXQsJnNyZWdzKTsKLX0KLQotLyogUm91dGluZXMgdG8gc2V0IGFuZCBnZXQgdGhlIHJlYWwgbW9kZSBpbnRlcnJ1cHQgdmVjdG9ycywgYnkgbWFraW5nCi0gKiBkaXJlY3QgcmVhbCBtb2RlIGNhbGxzIHRvIERPUyBhbmQgYnlwYXNzaW5nIHRoZSBET1MgZXh0ZW5kZXJzIEFQSS4KLSAqIFRoaXMgaXMgdGhlIHNhZmVzdCB3YXkgdG8gaGFuZGxlIHRoaXMsIGFzIHNvbWUgc2VydmVycyB0cnkgdG8gYmUKLSAqIHNtYXJ0IGFib3V0IGNoYW5naW5nIHJlYWwgbW9kZSB2ZWN0b3JzLgotICovCi0KLXZvaWQgUE1BUEkgX1BNX2dldFJNdmVjdChpbnQgaW50bm8sIGxvbmcgKnJlYWxpc3IpCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIFJNU1JFR1Mgc3JlZ3M7Ci0KLSAgICBQTV9zYXZlRFMoKTsKLSAgICByZWdzLmguYWggPSAweDM1OwotICAgIHJlZ3MuaC5hbCA9IGludG5vOwotICAgIFBNX2ludDg2eCgweDIxLCAmcmVncywgJnJlZ3MsICZzcmVncyk7Ci0gICAgKnJlYWxpc3IgPSAoKGxvbmcpc3JlZ3MuZXMgPDwgMTYpIHwgcmVncy54LmJ4OwotfQotCi12b2lkIFBNQVBJIF9QTV9zZXRSTXZlY3QoaW50IGludG5vLCBsb25nIHJlYWxpc3IpCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIFJNU1JFR1Mgc3JlZ3M7Ci0KLSAgICBQTV9zYXZlRFMoKTsKLSAgICByZWdzLmguYWggPSAweDI1OwotICAgIHJlZ3MuaC5hbCA9IGludG5vOwotICAgIHNyZWdzLmRzID0gKGludCkocmVhbGlzciA+PiAxNik7Ci0gICAgcmVncy54LmR4ID0gKGludCkocmVhbGlzciAmIDB4RkZGRik7Ci0gICAgUE1faW50ODZ4KDB4MjEsICZyZWdzLCAmcmVncywgJnNyZWdzKTsKLX0KLQotdm9pZCBQTUFQSSBfUE1fYWRkUmVhbE1vZGVCbG9jayh2b2lkICptZW0sdWludCB0YWcpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1JNX0JMT0NLUzsgaSsrKSB7Ci0JaWYgKHJtQmxvY2tzW2ldLnAgPT0gTlVMTCkgewotCSAgICBybUJsb2Nrc1tpXS5wID0gbWVtOwotCSAgICBybUJsb2Nrc1tpXS50YWcgPSB0YWc7Ci0JICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICBQTV9mYXRhbEVycm9yKCJUbyBtYW55IHJlYWwgbW9kZSBtZW1vcnkgYmxvY2sgYWxsb2NhdGlvbnMhIik7Ci19Ci0KLXVpbnQgUE1BUEkgX1BNX2ZpbmRSZWFsTW9kZUJsb2NrKHZvaWQgKm1lbSkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUk1fQkxPQ0tTOyBpKyspIHsKLQlpZiAocm1CbG9ja3NbaV0ucCA9PSBtZW0pCi0JICAgIHJldHVybiBybUJsb2Nrc1tpXS50YWc7Ci0JfQotICAgIFBNX2ZhdGFsRXJyb3IoIkNvdWxkIG5vdCBmaW5kIHByaW9yIHJlYWwgbW9kZSBtZW1vcnkgYmxvY2sgYWxsb2NhdGlvbiEiKTsKLSAgICByZXR1cm4gMDsKLX0KLQotY2hhciAqIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKAotICAgIGNoYXIgKnBhdGgsCi0gICAgaW50IG1heExlbikKLXsKLSAgICByZXR1cm4gZ2V0Y3dkKHBhdGgsbWF4TGVuKTsKLX0KLQotY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKLXsgcmV0dXJuICdDJzsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCi17IHJldHVybiAiYzpcXCI7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOwotICAgIGNoYXIgICAgICAgICplbnY7Ci0KLSAgICBpZiAoKGVudiA9IGdldGVudigiTlVDTEVVU19QQVRIIikpICE9IE5VTEwpCi0JcmV0dXJuIGVudjsKLSAgICByZXR1cm4gImM6XFxudWNsZXVzIjsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOwotICAgIHN0cmNweShwYXRoLFBNX2dldE51Y2xldXNQYXRoKCkpOwotICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKLSAgICBzdHJjYXQocGF0aCwiY29uZmlnIik7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKQoteyByZXR1cm4gIlNNWCI7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCi17IHJldHVybiAiU01YIjsgfQotCi1pbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKLXsKLSAgICBpbnQgICAgIGhpdDsKLSAgICBldmVudF90IGV2dDsKLQotICAgIGhpdCA9IEVWVF9wZWVrTmV4dCgmZXZ0LEVWVF9LRVlET1dOIHwgRVZUX0tFWVJFUEVBVCk7Ci0gICAgRVZUX2ZsdXNoKH4oRVZUX0tFWURPV04gfCBFVlRfS0VZUkVQRUFUKSk7Ci0gICAgcmV0dXJuIGhpdDsKLX0KLQotaW50IFBNQVBJIFBNX2dldGNoKHZvaWQpCi17Ci0gICBldmVudF90IGV2dDsKLQotICAgIEVWVF9oYWx0KCZldnQsRVZUX0tFWURPV04pOwotICAgcmV0dXJuIEVWVF9hc2NpaUNvZGUoZXZ0Lm1lc3NhZ2UpOwotfQotCi1QTV9IV05EIFBNQVBJIFBNX29wZW5Db25zb2xlKFBNX0hXTkQgaHduZFVzZXIsaW50IGRldmljZSxpbnQgeFJlcyxpbnQgeVJlcyxpbnQgYnBwLGlib29sIGZ1bGxTY3JlZW4pCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFNNWCAqLwotICAgICh2b2lkKWh3bmRVc2VyOwotICAgICh2b2lkKWRldmljZTsKLSAgICAodm9pZCl4UmVzOwotICAgICh2b2lkKXlSZXM7Ci0gICAgKHZvaWQpYnBwOwotICAgICh2b2lkKWZ1bGxTY3JlZW47Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKHZvaWQpCi17Ci0gICAgcmV0dXJuIHNpemVvZihET1Nfc3RhdGVCdWYpOwotfQotCi12b2lkIFBNQVBJIFBNX3NhdmVDb25zb2xlU3RhdGUodm9pZCAqc3RhdGVCdWYsUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICBSTVJFR1MgICAgICAgICAgcmVnczsKLSAgICBET1Nfc3RhdGVCdWYgICAgKnNiID0gc3RhdGVCdWY7Ci0KLSAgICAvKiBTYXZlIHRoZSBvbGQgdmlkZW8gbW9kZSBzdGF0ZSAqLwotICAgIHJlZ3MuaC5haCA9IDB4MEY7Ci0gICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0gICAgc2ItPm9sZE1vZGUgPSByZWdzLmguYWwgJiAweDdGOwotICAgIHNiLT5vbGQ1MExpbmVzID0gZmFsc2U7Ci0gICAgaWYgKHNiLT5vbGRNb2RlID09IDB4MykgewotCXJlZ3MueC5heCA9IDB4MTEzMDsKLQlyZWdzLnguYnggPSAwOwotCXJlZ3MueC5keCA9IDA7Ci0JUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0Jc2ItPm9sZDUwTGluZXMgPSAocmVncy5oLmRsID09IDQyIHx8IHJlZ3MuaC5kbCA9PSA0OSk7Ci0JfQotICAgICh2b2lkKWh3bmRDb25zb2xlOwotfQotCi12b2lkIFBNQVBJIFBNX3NldFN1c3BlbmRBcHBDYWxsYmFjayhpbnQgKF9BU01BUElQIHNhdmVTdGF0ZSkoaW50IGZsYWdzKSkKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgU01YICovCi0gICAgKHZvaWQpc2F2ZVN0YXRlOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoY29uc3Qgdm9pZCAqc3RhdGVCdWYsUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICBSTVJFR1MgICAgICAgICAgICAgIHJlZ3M7Ci0gICAgY29uc3QgRE9TX3N0YXRlQnVmICAqc2IgPSBzdGF0ZUJ1ZjsKLQotICAgIC8qIFJldG9yZSA1MCBsaW5lIG1vZGUgaWYgc2V0ICovCi0gICAgaWYgKHNiLT5vbGQ1MExpbmVzKSB7Ci0JcmVncy54LmF4ID0gMHgxMTEyOwotCXJlZ3MueC5ieCA9IDA7Ci0JUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0JfQotICAgICh2b2lkKWh3bmRDb25zb2xlOwotfQotCi12b2lkIFBNQVBJIFBNX2Nsb3NlQ29uc29sZShQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBTTVggKi8KLSAgICAodm9pZClod25kQ29uc29sZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKGludCB4LGludCB5KQotewotICAgIHVjaGFyICpfYmlvc1B0ciA9IFBNX2dldEJJT1NQb2ludGVyKCk7Ci0gICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDUwLHgpOwotICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg1MSx5KTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRPU1NjcmVlbldpZHRoKGludCB3aWR0aCxpbnQgaGVpZ2h0KQotewotICAgIHVjaGFyICpfYmlvc1B0ciA9IFBNX2dldEJJT1NQb2ludGVyKCk7Ci0gICAgUE1fc2V0V29yZChfYmlvc1B0cisweDRBLHdpZHRoKTsKLSAgICBQTV9zZXRXb3JkKF9iaW9zUHRyKzB4NEMsd2lkdGgqMik7Ci0gICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDg0LGhlaWdodC0xKTsKLSAgICBpZiAoaGVpZ2h0ID4gMjUpIHsKLQlQTV9zZXRXb3JkKF9iaW9zUHRyKzB4NjAsMHgwNjA3KTsKLQlQTV9zZXRCeXRlKF9iaW9zUHRyKzB4ODUsMHgwOCk7Ci0JfQotICAgIGVsc2UgewotCVBNX3NldFdvcmQoX2Jpb3NQdHIrMHg2MCwweDBEMEUpOwotCVBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg4NSwweDAxNik7Ci0JfQotfQotCi12b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKGxvbmcgc2l6ZSkKLXsKLSAgICByZXR1cm4gUE1fbWFsbG9jKHNpemUpOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQodm9pZCAqcHRyKQotewotICAgIFBNX2ZyZWUocHRyKTsKLX0KLQotI2RlZmluZSBHZXRSTVZlY3QoaW50bm8saXNyKSAgICAqKGlzcikgPSAoKHVsb25nKilybVplcm9QdHIpW2ludG5vXQotI2RlZmluZSBTZXRSTVZlY3QoaW50bm8saXNyKSAgICAoKHVsb25nKilybVplcm9QdHIpW2ludG5vXSA9IChpc3IpCi0KLWlib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCi0gICAgdXNob3J0IGF4VmFsLAotICAgIHVsb25nIEJJT1NQaHlzQWRkciwKLSAgICB2b2lkICptYXBwZWRCSU9TLAotICAgIHVsb25nIEJJT1NMZW4pCi17Ci0gICAgc3RhdGljIGludCAgICAgIGZpcnN0VGltZSA9IHRydWU7Ci0gICAgc3RhdGljIHVjaGFyICAgICpybVplcm9QdHI7Ci0gICAgbG9uZyAgICAgICAgICAgIEN1cnJlbnQxMCxDdXJyZW50NkQsQ3VycmVudDQyOwotICAgIFJNUkVHUyAgICAgICAgICByZWdzOwotICAgIFJNU1JFR1MgICAgICAgICBzcmVnczsKLQotICAgIC8qIENyZWF0ZSBhIHplcm8gbWVtb3J5IG1hcHBpbmcgZm9yIHVzIHRvIHVzZSAqLwotICAgIGlmIChmaXJzdFRpbWUpIHsKLQlybVplcm9QdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMCwweDdGRkYsdHJ1ZSk7Ci0JZmlyc3RUaW1lID0gZmFsc2U7Ci0JfQotCi0gICAgLyogUmVtYXAgdGhlIHNlY29uZGFyeSBCSU9TIHRvIDB4QzAwMDAgcGh5c2ljYWwgKi8KLSAgICBpZiAoQklPU1BoeXNBZGRyICE9IDB4QzAwMDBMIHx8IEJJT1NMZW4gPiAzMjc2OCkgewotCS8qIFNNWCBjYW5ub3QgdmlydHVhbGx5IHJlbWFwIHRoZSBCSU9TLCBzbyB3ZSBjYW4gb25seSB3b3JrIGlmIGFsbAotCSAqIHRoZSBzZWNvbmRhcnkgY29udHJvbGxlcnMgYXJlIGlkZW50aWNhbCwgYW5kIHdlIHRoZW4gdXNlIHRoZQotCSAqIEJJT1Mgb24gdGhlIGZpcnN0IGNvbnRyb2xsZXIgZm9yIGFsbCB0aGUgcmVtYWluaW5nIGNvbnRyb2xsZXJzLgotCSAqCi0JICogRm9yIE9TJ2VzIHRoYXQgZG8gdmlydHVhbCBtZW1vcnksIGFuZCByZW1hcHBpbmcgb2YgMHhDMDAwMAotCSAqIHBoeXNpY2FsIChwZXJoYXBzIGEgY29weSBvbiB3cml0ZSBtYXBwaW5nKSBzaG91bGQgYmUgYWxsIHRoYXQKLQkgKiBpcyBuZWVkZWQuCi0JICovCi0JcmV0dXJuIGZhbHNlOwotCX0KLQotICAgIC8qIFNhdmUgY3VycmVudCBoYW5kbGVycyBvZiBpbnQgMTBoIGFuZCA2RGggKi8KLSAgICBHZXRSTVZlY3QoMHgxMCwmQ3VycmVudDEwKTsKLSAgICBHZXRSTVZlY3QoMHg2RCwmQ3VycmVudDZEKTsKLQotICAgIC8qIFBPU1QgdGhlIHNlY29uZGFyeSBCSU9TICovCi0gICAgR2V0Uk1WZWN0KDB4NDIsJkN1cnJlbnQ0Mik7Ci0gICAgU2V0Uk1WZWN0KDB4MTAsQ3VycmVudDQyKTsgIC8qIFJlc3RvcmUgaW50IDEwaCB0byBTVEQtQklPUyAqLwotICAgIHJlZ3MueC5heCA9IGF4VmFsOwotICAgIFBNX2NhbGxSZWFsTW9kZSgweEMwMDAsMHgwMDAzLCZyZWdzLCZzcmVncyk7Ci0KLSAgICAvKiBSZXN0b3JlIGN1cnJlbnQgaGFuZGxlcnMgKi8KLSAgICBTZXRSTVZlY3QoMHgxMCxDdXJyZW50MTApOwotICAgIFNldFJNVmVjdCgweDZELEN1cnJlbnQ2RCk7Ci0KLSAgICAvKiBTZWNvbmQgdGhlIHByaW1hcnkgQklPUyBtYXBwaW4gMToxIGZvciAweEMwMDAwIHBoeXNpY2FsICovCi0gICAgaWYgKEJJT1NQaHlzQWRkciAhPSAweEMwMDAwTCkgewotCS8qIFNNWCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgKi8KLQkodm9pZCltYXBwZWRCSU9TOwotCX0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zbGVlcCh1bG9uZyBtaWxsaXNlY29uZHMpCi17Ci0gICAgdWxvbmcgICAgICAgICAgIG1pY3Jvc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAqIDEwMDBMOwotICAgIExaVGltZXJPYmplY3QgICB0bTsKLQotICAgIExaVGltZXJPbkV4dCgmdG0pOwotICAgIHdoaWxlIChMWlRpbWVyTGFwRXh0KCZ0bSkgPCBtaWNyb3NlY29uZHMpCi0JOwotICAgIExaVGltZXJPZmZFeHQoJnRtKTsKLX0KLQotaW50IFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpCi17Ci0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzRjg7Ci0JY2FzZSAxOiByZXR1cm4gMHgyRjg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0TFBUUG9ydChpbnQgcG9ydCkKLXsKLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNCQzsKLQljYXNlIDE6IHJldHVybiAweDM3ODsKLQljYXNlIDI6IHJldHVybiAweDI3ODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLVBNX01PRFVMRSBQTUFQSSBQTV9sb2FkTGlicmFyeSgKLSAgICBjb25zdCBjaGFyICpzekRMTE5hbWUpCi17Ci0gICAgKHZvaWQpc3pETExOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0UHJvY0FkZHJlc3MoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUsCi0gICAgY29uc3QgY2hhciAqc3pQcm9jTmFtZSkKLXsKLSAgICAodm9pZCloTW9kdWxlOwotICAgICh2b2lkKXN6UHJvY05hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZUxpYnJhcnkoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUpCi17Ci0gICAgKHZvaWQpaE1vZHVsZTsKLX0KLQotaW50IFBNQVBJIFBNX3NldElPUEwoCi0gICAgaW50IGxldmVsKQotewotICAgIHJldHVybiBsZXZlbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbnRlcm5hbCBmdW5jdGlvbiB0byBjb252ZXJ0IHRoZSBmaW5kIGRhdGEgdG8gdGhlIGdlbmVyaWMgaW50ZXJmYWNlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNvbnZlcnRGaW5kRGF0YSgKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEsCi0gICAgc3RydWN0IGZpbmRfdCAqYmxrKQotewotICAgIHVsb25nICAgZHdTaXplID0gZmluZERhdGEtPmR3U2l6ZTsKLQotICAgIG1lbXNldChmaW5kRGF0YSwwLGZpbmREYXRhLT5kd1NpemUpOwotICAgIGZpbmREYXRhLT5kd1NpemUgPSBkd1NpemU7Ci0gICAgaWYgKGJsay0+YXR0cmliICYgX0FfUkRPTkxZKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9SRUFET05MWTsKLSAgICBpZiAoYmxrLT5hdHRyaWIgJiBfQV9TVUJESVIpCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX0RJUkVDVE9SWTsKLSAgICBpZiAoYmxrLT5hdHRyaWIgJiBfQV9BUkNIKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9BUkNISVZFOwotICAgIGlmIChibGstPmF0dHJpYiAmIF9BX0hJRERFTikKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfSElEREVOOwotICAgIGlmIChibGstPmF0dHJpYiAmIF9BX1NZU1RFTSkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfU1lTVEVNOwotICAgIGZpbmREYXRhLT5zaXplTG8gPSBibGstPnNpemU7Ci0gICAgc3RybmNweShmaW5kRGF0YS0+bmFtZSxibGstPm5hbWUsUE1fTUFYX1BBVEgpOwotICAgIGZpbmREYXRhLT5uYW1lW1BNX01BWF9QQVRILTFdID0gMDsKLX0KLQotI2RlZmluZSBGSU5EX01BU0sgICAoX0FfUkRPTkxZIHwgX0FfQVJDSCB8IF9BX1NVQkRJUiB8IF9BX0hJRERFTiB8IF9BX1NZU1RFTSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBmaXJzdCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9maW5kRmlyc3RGaWxlKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICBzdHJ1Y3QgZmluZF90ICpibGs7Ci0KLSAgICBpZiAoKGJsayA9IFBNX21hbGxvYyhzaXplb2YoKmJsaykpKSA9PSBOVUxMKQotCXJldHVybiBQTV9GSUxFX0lOVkFMSUQ7Ci0gICAgaWYgKF9kb3NfZmluZGZpcnN0KChjaGFyKilmaWxlbmFtZSxGSU5EX01BU0ssYmxrKSA9PSAwKSB7Ci0JY29udmVydEZpbmREYXRhKGZpbmREYXRhLGJsayk7Ci0JcmV0dXJuIGJsazsKLQl9Ci0gICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBuZXh0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZmluZE5leHRGaWxlKAotICAgIHZvaWQgKmhhbmRsZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgc3RydWN0IGZpbmRfdCAqYmxrID0gaGFuZGxlOwotCi0gICAgaWYgKF9kb3NfZmluZG5leHQoYmxrKSA9PSAwKSB7Ci0JY29udmVydEZpbmREYXRhKGZpbmREYXRhLGJsayk7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCi0gICAgdm9pZCAqaGFuZGxlKQotewotICAgIFBNX2ZyZWUoaGFuZGxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZSBpcyBhIHZhbGlkIGRyaXZlIG9yIG5vdC4gVW5kZXIgVW5peCB0aGlzCi1mdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZXhjZXB0IGEgdmFsdWUgb2YgMyAoY29uc2lkZXJlZAotdGhlIHJvb3QgZHJpdmUsIGFuZCBlcXVpdmFsZW50IHRvIEM6IGZvciBub24tVW5peCBzeXN0ZW1zKS4gVGhlIGRyaXZlCi1udW1iZXJpbmcgaXM6Ci0KLSAgICAxICAgLSBEcml2ZSBBOgotICAgIDIgICAtIERyaXZlIEI6Ci0gICAgMyAgIC0gRHJpdmUgQzoKLSAgICBldGMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCi0gICAgY2hhciBkcml2ZSkKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0gICAgcmVncy5oLmRsID0gKHVjaGFyKShkcml2ZSAtICdBJyArIDEpOwotICAgIHJlZ3MuaC5haCA9IDB4MzY7ICAgICAgICAgICAgICAgLyogR2V0IGRpc2sgaW5mb3JtYXRpb24gc2VydmljZSAqLwotICAgIFBNX2ludDg2KDB4MjEsJnJlZ3MsJnJlZ3MpOwotICAgIHJldHVybiByZWdzLnguYXggIT0gMHhGRkZGOyAgICAgLyogQVggPSAweEZGRkYgaWYgZGlzayBpcyBpbnZhbGlkICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWZlZCBkcml2ZS4KLVVuZGVyIFVuaXggdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcmVnYXJkbGVzcwotb2Ygd2hhdCB0aGUgdmFsdWUgb2YgJ2RyaXZlJyBpcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2dldGRjd2QoCi0gICAgaW50IGRyaXZlLAotICAgIGNoYXIgKmRpciwKLSAgICBpbnQgbGVuKQotewotICAgIHVpbnQgb2xkRHJpdmUsbWF4RHJpdmVzOwotICAgIF9kb3NfZ2V0ZHJpdmUoJm9sZERyaXZlKTsKLSAgICBfZG9zX3NldGRyaXZlKGRyaXZlLCZtYXhEcml2ZXMpOwotICAgIGdldGN3ZChkaXIsbGVuKTsKLSAgICBfZG9zX3NldGRyaXZlKG9sZERyaXZlLCZtYXhEcml2ZXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICB1aW50IGF0dHJpYikKLXsKLSNpZiBkZWZpbmVkKFROVCkgJiYgZGVmaW5lZChfTVNDX1ZFUikKLSAgICBEV09SRCBhdHRyID0gMDsKLQotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQotCWF0dHIgfD0gRklMRV9BVFRSSUJVVEVfUkVBRE9OTFk7Ci0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfQVJDSElWRSkKLQlhdHRyIHw9IEZJTEVfQVRUUklCVVRFX0FSQ0hJVkU7Ci0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfSElEREVOKQotCWF0dHIgfD0gRklMRV9BVFRSSUJVVEVfSElEREVOOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1NZU1RFTSkKLQlhdHRyIHw9IEZJTEVfQVRUUklCVVRFX1NZU1RFTTsKLSAgICBTZXRGaWxlQXR0cmlidXRlcygoTFBTVFIpZmlsZW5hbWUsIGF0dHIpOwotI2Vsc2UKLSAgICB1aW50IGF0dHIgPSAwOwotCi0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfUkVBRE9OTFkpCi0JYXR0ciB8PSBfQV9SRE9OTFk7Ci0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfQVJDSElWRSkKLQlhdHRyIHw9IF9BX0FSQ0g7Ci0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfSElEREVOKQotCWF0dHIgfD0gX0FfSElEREVOOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1NZU1RFTSkKLQlhdHRyIHw9IF9BX1NZU1RFTTsKLSAgICBfZG9zX3NldGZpbGVhdHRyKGZpbGVuYW1lLGF0dHIpOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY3JlYXRlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX21rZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotI2lmZGVmICBfX0dOVUNfXwotICAgIHJldHVybiBta2RpcihmaWxlbmFtZSxTX0lSVVNSKSA9PSAwOwotI2Vsc2UKLS8qQU06ICAgcmV0dXJuIG1rZGlyKGZpbGVuYW1lKSA9PSAwOyAqLwotICAgIHJldHVybihmYWxzZSk7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byByZW1vdmUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fcm1kaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0vKkFNOiAgIHJldHVybiBybWRpcihmaWxlbmFtZSkgPT0gMDsgKi8KLSAgICByZXR1cm4oZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlcyBhIGJsb2NrIG9mIGxvY2tlZCwgcGh5c2ljYWxseSBjb250aWd1b3VzIG1lbW9yeS4gVGhlIG1lbW9yeQotbWF5IGJlIHJlcXVpcmVkIHRvIGJlIGJlbG93IHRoZSAxNk1lZyBib3VuZGFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NMb2NrZWRNZW0oCi0gICAgdWludCBzaXplLAotICAgIHVsb25nICpwaHlzQWRkciwKLSAgICBpYm9vbCBjb250aWd1b3VzLAotICAgIGlib29sIGJlbG93MTZNKQotewotICAgIHZvaWQgICAgICAgICAgICAqcDsKLSAgICB1aW50ICAgICAgICAgICAgcl9zZWcscl9vZmY7Ci0gICAgUE1fbG9ja0hhbmRsZSAgIGxoOwotCi0gICAgLyogVW5kZXIgRE9TIHRoZSBvbmx5IHdheSB0byBrbm93IHRoZSBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcyBpcyB0bwotICAgICAqIGFsbG9jYXRlIHRoZSBtZW1vcnkgYmVsb3cgdGhlIDFNZWcgYm91bmRhcnkgYXMgcmVhbCBtb2RlIG1lbW9yeS4KLSAgICAgKiBXZSBhbHNvIGFsbG9jYXRlIDQwOTUgYnl0ZXMgbW9yZSBtZW1vcnkgdGhhbiB3ZSBuZWVkLCBzbyB3ZSBjYW4KLSAgICAgKiBwcm9wZXJseSBwYWdlIGFsaWduIHRoZSBzdGFydCBvZiB0aGUgbWVtb3J5IGJsb2NrIGZvciBETUEgb3BlcmF0aW9ucy4KLSAgICAgKi8KLSAgICBpZiAoc2l6ZSA+IDQwOTYpCi0JcmV0dXJuIE5VTEw7Ci0gICAgaWYgKChwID0gUE1fYWxsb2NSZWFsU2VnKChzaXplICsgMHhGRkYpICYgfjB4RkZGLCZyX3NlZywmcl9vZmYpKSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgICpwaHlzQWRkciA9ICgocl9zZWcgPDwgNCkgKyByX29mZiArIDB4RkZGKSAmIH4weEZGRjsKLSAgICBQTV9sb2NrRGF0YVBhZ2VzKHAsc2l6ZSoyLCZsaCk7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSh2b2lkICpwLHVpbnQgc2l6ZSxpYm9vbCBjb250aWd1b3VzKQotewotICAgICh2b2lkKXNpemU7Ci0gICAgUE1fZnJlZVJlYWxTZWcocCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBHZW5lcmljIERQTUkgcm91dGluZXMgY29tbW9uIHRvIDE2LzMyIGJpdCBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdWxvbmcgUE1BUEkgRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKHVsb25nIHBoeXNBZGRyLHVsb25nIGxpbWl0KQotewotICAgIFBNUkVHUyAgcjsKLSAgICB1bG9uZyAgIHBoeXNPZnM7Ci0KLSAgICBpZiAocGh5c0FkZHIgPCAweDEwMDAwMEwpIHsKLQkvKiBXZSBjYW4ndCBtYXAgbWVtb3J5IGJlbG93IDFNYiwgYnV0IHRoZSBsaW5lYXIgYWRkcmVzcyBhcmUgYWxyZWFkeQotCSAqIG1hcHBlZCAxOjEgZm9yIHRoaXMgbWVtb3J5IGFueXdheSBzbyB3ZSBqdXN0IHJldHVybiB0aGUgYmFzZSBhZGRyZXNzLgotCSAqLwotCXJldHVybiBwaHlzQWRkcjsKLQl9Ci0KLSAgICAvKiBSb3VuZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byBhIDRLYiBib3VuZGFyeSBhbmQgdGhlIGxpbWl0IHRvIGEKLSAgICAgKiA0S2ItMSBib3VuZGFyeSBiZWZvcmUgcGFzc2luZyB0aGUgdmFsdWVzIHRvIERQTUkgYXMgc29tZSBleHRlbmRlcnMKLSAgICAgKiB3aWxsIGZhaWwgdGhlIGNhbGxzIHVubGVzcyB0aGlzIGlzIHRoZSBjYXNlLiBJZiB3ZSByb3VuZCB0aGUKLSAgICAgKiBwaHlzaWNhbCBhZGRyZXNzLCB0aGVuIHdlIGFsc28gYWRkIGFuIGV4dHJhIG9mZnNldCBpbnRvIHRoZSBhZGRyZXNzCi0gICAgICogdGhhdCB3ZSByZXR1cm4uCi0gICAgICovCi0gICAgcGh5c09mcyA9IHBoeXNBZGRyICYgNDA5NTsKLSAgICBwaHlzQWRkciA9IHBoeXNBZGRyICYgfjQwOTU7Ci0gICAgbGltaXQgPSAoKGxpbWl0K3BoeXNPZnMrMSs0MDk1KSAmIH40MDk1KS0xOwotCi0gICAgci54LmF4ID0gMHg4MDA7ICAgICAgICAgICAgICAgICAvKiBEUE1JIG1hcCBwaHlzaWNhbCB0byBsaW5lYXIgICAgICAqLwotICAgIHIueC5ieCA9IHBoeXNBZGRyID4+IDE2OwotICAgIHIueC5jeCA9IHBoeXNBZGRyICYgMHhGRkZGOwotICAgIHIueC5zaSA9IGxpbWl0ID4+IDE2OwotICAgIHIueC5kaSA9IGxpbWl0ICYgMHhGRkZGOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIGlmIChyLnguY2ZsYWcpCi0JcmV0dXJuIDB4RkZGRkZGRkZVTDsKLSAgICByZXR1cm4gKCh1bG9uZylyLnguYnggPDwgMTYpICsgci54LmN4ICsgcGh5c09mczsKLX0KLQotaW50IFBNQVBJIERQTUlfc2V0U2VsZWN0b3JCYXNlKHVzaG9ydCBzZWwsdWxvbmcgbGluQWRkcikKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLnguYXggPSA3OyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgc2V0IHNlbGVjdG9yIGJhc2UgYWRkcmVzcyAgICovCi0gICAgci54LmJ4ID0gc2VsOwotICAgIHIueC5jeCA9IGxpbkFkZHIgPj4gMTY7Ci0gICAgci54LmR4ID0gbGluQWRkciAmIDB4RkZGRjsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICBpZiAoci54LmNmbGFnKQotCXJldHVybiAwOwotICAgIHJldHVybiAxOwotfQotCi11bG9uZyBQTUFQSSBEUE1JX2dldFNlbGVjdG9yQmFzZSh1c2hvcnQgc2VsKQotewotICAgIFBNUkVHUyAgcjsKLQotICAgIHIueC5heCA9IDY7ICAgICAgICAgICAgICAgICAgICAgLyogRFBNSSBnZXQgc2VsZWN0b3IgYmFzZSBhZGRyZXNzICAgKi8KLSAgICByLnguYnggPSBzZWw7Ci0gICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0gICAgcmV0dXJuICgodWxvbmcpci54LmN4IDw8IDE2KSArIHIueC5keDsKLX0KLQotaW50IFBNQVBJIERQTUlfc2V0U2VsZWN0b3JMaW1pdCh1c2hvcnQgc2VsLHVsb25nIGxpbWl0KQotewotICAgIFBNUkVHUyAgcjsKLQotICAgIHIueC5heCA9IDg7ICAgICAgICAgICAgICAgICAgICAgLyogRFBNSSBzZXQgc2VsZWN0b3IgbGltaXQgICAgICAgICAgKi8KLSAgICByLnguYnggPSBzZWw7Ci0gICAgci54LmN4ID0gbGltaXQgPj4gMTY7Ci0gICAgci54LmR4ID0gbGltaXQgJiAweEZGRkY7Ci0gICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0gICAgaWYgKHIueC5jZmxhZykKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gMTsKLX0KLQotdWludCBQTUFQSSBEUE1JX2NyZWF0ZVNlbGVjdG9yKHVsb25nIGJhc2UsdWxvbmcgbGltaXQpCi17Ci0gICAgdWludCAgICBzZWw7Ci0gICAgUE1SRUdTICByOwotCi0gICAgLyogQWxsb2NhdGUgMSBkZXNjcmlwdG9yICovCi0gICAgci54LmF4ID0gMDsKLSAgICByLnguY3ggPSAxOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIGlmIChyLnguY2ZsYWcpIHJldHVybiAwOwotICAgIHNlbCA9IHIueC5heDsKLQotICAgIC8qIFNldCB0aGUgZGVzY3JpcHRvciBhY2Nlc3MgcmlnaHRzIChmb3IgYSAzMiBiaXQgcGFnZSBncmFudWxhcgotICAgICAqIHNlZ21lbnQsIHJpbmcgMCkuCi0gICAgICovCi0gICAgci54LmF4ID0gOTsKLSAgICByLnguYnggPSBzZWw7Ci0gICAgci54LmN4ID0gMHg0MDkzOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotCi0gICAgLyogTWFwIHBoeXNpY2FsIG1lbW9yeSBhbmQgY3JlYXRlIHNlbGVjdG9yICovCi0gICAgaWYgKChiYXNlID0gRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKGJhc2UsbGltaXQpKSA9PSAweEZGRkZGRkZGVUwpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKCFEUE1JX3NldFNlbGVjdG9yQmFzZShzZWwsYmFzZSkpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKCFEUE1JX3NldFNlbGVjdG9yTGltaXQoc2VsLGxpbWl0KSkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gc2VsOwotfQotCi12b2lkIFBNQVBJIERQTUlfZnJlZVNlbGVjdG9yKHVpbnQgc2VsKQotewotICAgIFBNUkVHUyAgcjsKLQotICAgIHIueC5heCA9IDE7Ci0gICAgci54LmJ4ID0gc2VsOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotfQotCi1pbnQgUE1BUEkgRFBNSV9sb2NrTGluZWFyUGFnZXModWxvbmcgbGluZWFyLHVsb25nIGxlbikKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLnguYXggPSAweDYwMDsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIExvY2sgTGluZWFyIFJlZ2lvbiAgICAgICovCi0gICAgci54LmJ4ID0gKGxpbmVhciA+PiAxNik7ICAgICAgICAgICAgLyogTGluZWFyIGFkZHJlc3MgaW4gQlg6Q1ggICAgICAqLwotICAgIHIueC5jeCA9IChsaW5lYXIgJiAweEZGRkYpOwotICAgIHIueC5zaSA9IChsZW4gPj4gMTYpOyAgICAgICAgICAgICAgIC8qIExlbmd0aCBpbiBTSTpESSAgICAgICAgICAgICAgKi8KLSAgICByLnguZGkgPSAobGVuICYgMHhGRkZGKTsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICByZXR1cm4gKCFyLnguY2ZsYWcpOwotfQotCi1pbnQgUE1BUEkgRFBNSV91bmxvY2tMaW5lYXJQYWdlcyh1bG9uZyBsaW5lYXIsdWxvbmcgbGVuKQotewotICAgIFBNUkVHUyAgcjsKLQotICAgIHIueC5heCA9IDB4NjAxOyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgVW5sb2NrIExpbmVhciBSZWdpb24gICAgKi8KLSAgICByLnguYnggPSAobGluZWFyID4+IDE2KTsgICAgICAgICAgICAvKiBMaW5lYXIgYWRkcmVzcyBpbiBCWDpDWCAgICAgICovCi0gICAgci54LmN4ID0gKGxpbmVhciAmIDB4RkZGRik7Ci0gICAgci54LnNpID0gKGxlbiA+PiAxNik7ICAgICAgICAgICAgICAgLyogTGVuZ3RoIGluIFNJOkRJICAgICAgICAgICAgICAqLwotICAgIHIueC5kaSA9IChsZW4gJiAweEZGRkYpOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIHJldHVybiAoIXIueC5jZmxhZyk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBEUE1JX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKQotewotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0gICAgdWxvbmcgICBsaW5BZGRyOwotICAgIHVsb25nICAgRFNCYXNlQWRkcjsKLQotICAgIC8qIEdldCB0aGUgYmFzZSBhZGRyZXNzIGZvciB0aGUgZGVmYXVsdCBEUyBzZWxlY3RvciAqLwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICBEU0Jhc2VBZGRyID0gRFBNSV9nZXRTZWxlY3RvckJhc2Uoc3JlZ3MuZHMpOwotICAgIGlmICgoYmFzZSA8IDB4MTAwMDAwKSAmJiAoRFNCYXNlQWRkciA9PSAwKSkgewotCS8qIERTIGlzIHplcm8gYmFzZWQsIHNvIHdlIGNhbiBkaXJlY3RseSBhY2Nlc3MgdGhlIGZpcnN0IDFNYiBvZgotCSAqIHN5c3RlbSBtZW1vcnkgKGxpa2UgdW5kZXIgRE9TNEdXKS4KLQkgKi8KLQlyZXR1cm4gKHZvaWQqKWJhc2U7Ci0JfQotCi0gICAgLyogTWFwIHRoZSBtZW1vcnkgdG8gYSBsaW5lYXIgYWRkcmVzcyB1c2luZyBEUE1JIGZ1bmN0aW9uIDB4ODAwICovCi0gICAgaWYgKChsaW5BZGRyID0gRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKGJhc2UsbGltaXQpKSA9PSAwKSB7Ci0JaWYgKGJhc2UgPj0gMHgxMDAwMDApCi0JICAgIHJldHVybiBOVUxMOwotCS8qIElmIHRoZSBsaW5lYXIgYWRkcmVzcyBtYXBwaW5nIGZhaWxzIGJ1dCB3ZSBhcmUgdHJ5aW5nIHRvCi0JICogbWFwIGFuIGFyZWEgaW4gdGhlIGZpcnN0IDFNYiBvZiBzeXN0ZW0gbWVtb3J5LCB0aGVuIHdlIG11c3QKLQkgKiBiZSBydW5uaW5nIHVuZGVyIGEgV2luZG93cyBvciBPUy8yIERPUyBib3guIFVuZGVyIHRoZXNlCi0JICogZW52aXJvbm1lbnRzIHdlIGNhbiB1c2UgdGhlIHNlZ21lbnQgd3JhcCBhcm91bmQgYXMgYSBmYWxsYmFjawotCSAqIG1lYXN1cmUsIGFzIHRoaXMgZG9lcyB3b3JrIHByb3Blcmx5LgotCSAqLwotCWxpbkFkZHIgPSBiYXNlOwotCX0KLQotICAgIC8qIE5vdyBleHBhbmQgdGhlIGRlZmF1bHQgRFMgc2VsZWN0b3IgdG8gNEdiIHNvIHdlIGNhbiBhY2Nlc3MgaXQgKi8KLSAgICBpZiAoIURQTUlfc2V0U2VsZWN0b3JMaW1pdChzcmVncy5kcywweEZGRkZGRkZGVUwpKQotCXJldHVybiBOVUxMOwotCi0gICAgLyogRmluYWxseSBlbmFibGUgY2FjaGluZyBmb3IgdGhlIHBhZ2UgdGFibGVzIHRoYXQgd2UganVzdCBtYXBwZWQgaW4sCi0gICAgICogc2luY2UgRE9TNEdXIGFuZCBQTU9ERS9XIGNyZWF0ZSB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzIHdpdGhvdXQKLSAgICAgKiBjYWNoaW5nIGVuYWJsZWQgd2hpY2ggaHVydHMgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBsaW5lYXIgZnJhbWVidWZmZXIKLSAgICAgKiBhcyBpdCBkaXNhYmxlcyB3cml0ZSBjb21iaW5pbmcgb24gUGVudGl1bSBQcm8gYW5kIGFib3ZlIHByb2Nlc3NvcnMuCi0gICAgICoKLSAgICAgKiBGb3IgdGhvc2UgcHJvY2Vzc29ycyBjYWNoZSBkaXNhYmxpbmcgaXMgYmV0dGVyIGhhbmRsZWQgdGhyb3VnaCB0aGUKLSAgICAgKiBNVFJSIHJlZ2lzdGVycyBhbnl3YXkgKHdlIGNhbiB3cml0ZSBjb21iaW5lIGEgcmVnaW9uIGJ1dCBkaXNhYmxlCi0gICAgICogY2FjaGluZykgc28gdGhhdCBNTUlPIHJlZ2lzdGVyIHJlZ2lvbnMgZG8gbm90IHNjcmV3IHVwLgotICAgICAqLwotICAgIGlmIChpc0NhY2hlZCkgewotCWlmICgoUERCID0gX1BNX2dldFBEQigpKSAhPSAwICYmIERTQmFzZUFkZHIgPT0gMCkgewotCSAgICBpbnQgICAgIHN0YXJ0UERCLGVuZFBEQixpUERCLHN0YXJ0UGFnZSxlbmRQYWdlLHN0YXJ0LGVuZCxpUGFnZTsKLQkgICAgdWxvbmcgICBwYWdlVGFibGUsKnBQYWdlVGFibGU7Ci0JICAgIGlmICghcFBEQikgewotCQlpZiAoUERCID49IDB4MTAwMDAwKQotCQkgICAgcFBEQiA9ICh1bG9uZyopRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKFBEQiwweEZGRik7Ci0JCWVsc2UKLQkJICAgIHBQREIgPSAodWxvbmcqKVBEQjsKLQkJfQotCSAgICBpZiAocFBEQikgewotCQlzdGFydFBEQiA9IChsaW5BZGRyID4+IDIyKSAmIDB4M0ZGOwotCQlzdGFydFBhZ2UgPSAobGluQWRkciA+PiAxMikgJiAweDNGRjsKLQkJZW5kUERCID0gKChsaW5BZGRyK2xpbWl0KSA+PiAyMikgJiAweDNGRjsKLQkJZW5kUGFnZSA9ICgobGluQWRkcitsaW1pdCkgPj4gMTIpICYgMHgzRkY7Ci0JCWZvciAoaVBEQiA9IHN0YXJ0UERCOyBpUERCIDw9IGVuZFBEQjsgaVBEQisrKSB7Ci0JCSAgICBwYWdlVGFibGUgPSBwUERCW2lQREJdICYgfjB4RkZGOwotCQkgICAgaWYgKHBhZ2VUYWJsZSA+PSAweDEwMDAwMCkKLQkJCXBQYWdlVGFibGUgPSAodWxvbmcqKURQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcihwYWdlVGFibGUsMHhGRkYpOwotCQkgICAgZWxzZQotCQkJcFBhZ2VUYWJsZSA9ICh1bG9uZyopcGFnZVRhYmxlOwotCQkgICAgc3RhcnQgPSAoaVBEQiA9PSBzdGFydFBEQikgPyBzdGFydFBhZ2UgOiAwOwotCQkgICAgZW5kID0gKGlQREIgPT0gZW5kUERCKSA/IGVuZFBhZ2UgOiAweDNGRjsKLQkJICAgIGZvciAoaVBhZ2UgPSBzdGFydDsgaVBhZ2UgPD0gZW5kOyBpUGFnZSsrKQotCQkJcFBhZ2VUYWJsZVtpUGFnZV0gJj0gfjB4MTg7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQotICAgIC8qIE5vdyByZXR1cm4gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGludG8gdGhlIGRlZmF1bHQgRFMgKi8KLSAgICByZXR1cm4gKHZvaWQqKShsaW5BZGRyIC0gRFNCYXNlQWRkcik7Ci19Ci0KLS8qIFNvbWUgRE9TIGV4dGVuZGVyIGltcGxlbWVudGF0aW9ucyBkbyBub3QgZGlyZWN0bHkgc3VwcG9ydCBjYWxsaW5nIGEKLSAqIHJlYWwgbW9kZSBwcm9jZWR1cmUgZnJvbSBwcm90ZWN0ZWQgbW9kZS4gSG93ZXZlciB3ZSBjYW4gc2ltdWxhdGUgd2hhdAotICogd2UgbmVlZCB0ZW1wb3JhcmlseSBob29raW5nIHRoZSBJTlQgNkFoIHZlY3RvciB3aXRoIGEgc21hbGwgcmVhbCBtb2RlCi0gKiBzdHViIHRoYXQgd2lsbCBjYWxsIG91ciByZWFsIG1vZGUgY29kZSBmb3IgdXMuCi0gKi8KLQotc3RhdGljIHVjaGFyIGludDZBSGFuZGxlcltdID0gewotICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsICAgICAgICAvKiAgX19QTU9ERV9jYWxsUmVhbCB2YXJpYWJsZSAgICAgICAgICAgKi8KLSAgICAweEZCLCAgICAgICAgICAgICAgICAgICAgICAgLyogIHN0aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgyRSwweEZGLDB4MUUsMHgwMCwweDAwLCAgIC8qICBjYWxsICAgIFtjczpfX1BNT0RFX2NhbGxSZWFsXSAgICAgICAqLwotICAgIDB4Q0YsICAgICAgICAgICAgICAgICAgICAgICAvKiAgaXJldGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB9Owotc3RhdGljIHVjaGFyICpjclB0ciA9IE5VTEw7IC8qIFBvaW50ZXIgdG8gb2YgaW50IDZBIGhhbmRsZXIgICAgICAgICAqLwotc3RhdGljIHVpbnQgY3JSU2VnLGNyUk9mZjsgIC8qIFJlYWwgbW9kZSBzZWc6b2Zmc2V0IG9mIGhhbmRsZXIgICAgICAqLwotCi12b2lkIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSh1aW50IHNlZyx1aW50IG9mZiwgUk1SRUdTICppbiwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICB1Y2hhciAgICpwOwotICAgIHVpbnQgICAgb2xkU2VnLG9sZE9mZjsKLQotICAgIGlmICghY3JQdHIpIHsKLQkvKiBBbGxvY2F0ZSBhbmQgY29weSB0aGUgbWVtb3J5IGJsb2NrIG9ubHkgb25jZSAqLwotCWNyUHRyID0gUE1fYWxsb2NSZWFsU2VnKHNpemVvZihpbnQ2QUhhbmRsZXIpLCAmY3JSU2VnLCAmY3JST2ZmKTsKLQltZW1jcHkoY3JQdHIsaW50NkFIYW5kbGVyLHNpemVvZihpbnQ2QUhhbmRsZXIpKTsKLQl9Ci0gICAgUE1fc2V0V29yZChjclB0cixvZmYpOyAgICAgICAgICAgICAgLyogUGx1ZyBpbiBhZGRyZXNzIHRvIGNhbGwgICovCi0gICAgUE1fc2V0V29yZChjclB0cisyLHNlZyk7Ci0gICAgcCA9IFBNX21hcFJlYWxQb2ludGVyKDAsMHg2QSAqIDQpOwotICAgIG9sZE9mZiA9IFBNX2dldFdvcmQocCk7ICAgICAgICAgICAgIC8qIFNhdmUgb2xkIGhhbmRsZXIgYWRkcmVzcyAqLwotICAgIG9sZFNlZyA9IFBNX2dldFdvcmQocCsyKTsKLSAgICBQTV9zZXRXb3JkKHAsY3JST2ZmKzQpOyAgICAgICAgICAgICAvKiBIb29rIDZBIGhhbmRsZXIgICAgICAgICAgKi8KLSAgICBQTV9zZXRXb3JkKHArMixjclJTZWcpOwotICAgIFBNX2ludDg2eCgweDZBLCBpbiwgaW4sIHNyZWdzKTsgICAgIC8qIENhbGwgcmVhbCBtb2RlIGNvZGUgICAgICAqLwotICAgIFBNX3NldFdvcmQocCxvbGRPZmYpOyAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgb2xkIGhhbmRsZXIgICAgICAqLwotICAgIFBNX3NldFdvcmQocCsyLG9sZFNlZyk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQoteyByZXR1cm4gUE1fbWFwUGh5c2ljYWxBZGRyKDB4NDAwLDB4RkZGRix0cnVlKTsgfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCi17IHJldHVybiBQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwweEZGRkYsdHJ1ZSk7IH0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKQoteyByZXR1cm4gRFBNSV9tYXBQaHlzaWNhbEFkZHIoYmFzZSxsaW1pdCxpc0NhY2hlZCk7IH0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBNYXBwaW5nIGNhbm5vdCBiZSBmcmVlICovCi19Ci0KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcih2b2lkICpwKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgKi8KLSAgICAvKiAgICAgICBhZGRyZXNzLiAqLwotICAgICh2b2lkKXA7Ci0gICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQotewotICAgICh2b2lkKWxpbWl0OwotICAgIHJldHVybiAodm9pZCopYmFzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKLXsKLSAgICBzdGF0aWMgdWNoYXIgKnplcm9QdHIgPSBOVUxMOwotCi0gICAgaWYgKCF6ZXJvUHRyKQotCXplcm9QdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMCwweEZGRkZGLHRydWUpOwotICAgIHJldHVybiAodm9pZCopKHplcm9QdHIgKyBNS19QSFlTKHJfc2VnLHJfb2ZmKSk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKQotewotICAgIFBNUkVHUyAgICAgIHI7Ci0gICAgdm9pZCAgICAgICAgKnA7Ci0KLSAgICByLnguYXggPSAweDEwMDsgICAgICAgICAgICAgICAgIC8qIERQTUkgYWxsb2NhdGUgRE9TIG1lbW9yeSAgICAgICAgICovCi0gICAgci54LmJ4ID0gKHNpemUgKyAweEYpID4+IDQ7ICAgICAvKiBudW1iZXIgb2YgcGFyYWdyYXBocyAgICAgICAgICAgICAqLwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIGlmIChyLnguY2ZsYWcpCi0JcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIERQTUkgY2FsbCBmYWlsZWQgICAgICAgICAgICAgICAgICovCi0gICAgKnJfc2VnID0gci54LmF4OyAgICAgICAgICAgICAgICAvKiBSZWFsIG1vZGUgc2VnbWVudCAgICAgICAgICAgICAgICAqLwotICAgICpyX29mZiA9IDA7Ci0gICAgcCA9IFBNX21hcFJlYWxQb2ludGVyKCpyX3NlZywqcl9vZmYpOwotICAgIF9QTV9hZGRSZWFsTW9kZUJsb2NrKHAsci54LmR4KTsKLSAgICByZXR1cm4gcDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCi17Ci0gICAgUE1SRUdTICByOwotCi0gICAgci54LmF4ID0gMHgxMDE7ICAgICAgICAgICAgICAgICAgICAgLyogRFBNSSBmcmVlIERPUyBtZW1vcnkgICAgICAgICAqLwotICAgIHIueC5keCA9IF9QTV9maW5kUmVhbE1vZGVCbG9jayhtZW0pOy8qIERYIDo9IHNlbGVjdG9yIGZyb20gMHgxMDAgICAgKi8KLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLX0KLQotc3RhdGljIERQTUlfaGFuZGxlcl90ICAgRFBNSV9pbnQxMCA9IE5VTEw7Ci0KLXZvaWQgUE1BUEkgRFBNSV9zZXRJbnQxMEhhbmRsZXIoRFBNSV9oYW5kbGVyX3QgaGFuZGxlcikKLXsKLSAgICBEUE1JX2ludDEwID0gaGFuZGxlcjsKLX0KLQotdm9pZCBQTUFQSSBEUE1JX2ludDg2KGludCBpbnRubywgRFBNSV9yZWdzICpyZWdzKQotewotICAgIFBNUkVHUyAgICAgIHI7Ci0gICAgUE1TUkVHUyAgICAgc3I7Ci0KLSAgICBpZiAoaW50bm8gPT0gMHgxMCAmJiBEUE1JX2ludDEwKSB7Ci0JaWYgKERQTUlfaW50MTAocmVncykpCi0JICAgIHJldHVybjsKLQl9Ci0gICAgUE1fc2VncmVhZCgmc3IpOwotICAgIHIueC5heCA9IDB4MzAwOyAgICAgICAgICAgICAgICAgLyogRFBNSSBpc3N1ZSByZWFsIGludGVycnVwdCAgICAqLwotICAgIHIuaC5ibCA9IGludG5vOwotICAgIHIuaC5iaCA9IDA7Ci0gICAgci54LmN4ID0gMDsKLSAgICBzci5lcyA9IHNyLmRzOwotICAgIHIuZS5lZGkgPSAodWludClyZWdzOwotICAgIFBNX2ludDM4NngoMHgzMSwgJnIsICZyLCAmc3IpOyAgLyogSXNzdWUgdGhlIGludGVycnVwdCAgICAgICAgICAqLwotfQotCi0jZGVmaW5lIElOKHJlZykgICAgIHJtcmVncy5yZWcgPSBpbi0+ZS5yZWcKLSNkZWZpbmUgT1VUKHJlZykgICAgb3V0LT5lLnJlZyA9IHJtcmVncy5yZWcKLQotaW50IFBNQVBJIFBNX2ludDg2KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQpCi17Ci0gICAgRFBNSV9yZWdzICAgcm1yZWdzOwotCi0gICAgbWVtc2V0KCZybXJlZ3MsIDAsIHNpemVvZihybXJlZ3MpKTsKLSAgICBJTihlYXgpOyBJTihlYngpOyBJTihlY3gpOyBJTihlZHgpOyBJTihlc2kpOyBJTihlZGkpOwotCi0vKiBUaGVzZSByZWFsIG1vZGUgaW50cyBtYXkgY2F1c2UgY3Jhc2hlcy4gKi8KLS8qQU06ICAgRFBNSV9pbnQ4NihpbnRubywmcm1yZWdzKTsgICAgICAvIyMjKiBEUE1JIGlzc3VlIHJlYWwgaW50ZXJydXB0ICAgICovCi0KLSAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZWR4KTsgT1VUKGVzaSk7IE9VVChlZGkpOwotICAgIG91dC0+eC5jZmxhZyA9IHJtcmVncy5mbGFncyAmIDB4MTsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi1pbnQgUE1BUEkgUE1faW50ODZ4KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgRFBNSV9yZWdzICAgcm1yZWdzOwotCi0gICAgbWVtc2V0KCZybXJlZ3MsIDAsIHNpemVvZihybXJlZ3MpKTsKLSAgICBJTihlYXgpOyBJTihlYngpOyBJTihlY3gpOyBJTihlZHgpOyBJTihlc2kpOyBJTihlZGkpOwotICAgIHJtcmVncy5lcyA9IHNyZWdzLT5lczsKLSAgICBybXJlZ3MuZHMgPSBzcmVncy0+ZHM7Ci0KLS8qQU06ICAgRFBNSV9pbnQ4NihpbnRubywmcm1yZWdzKTsgICAgICAvIyMjKiBEUE1JIGlzc3VlIHJlYWwgaW50ZXJydXB0ICAgICovCi0KLSAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZWR4KTsgT1VUKGVzaSk7IE9VVChlZGkpOwotICAgIHNyZWdzLT5lcyA9IHJtcmVncy5lczsKLSAgICBzcmVncy0+Y3MgPSBybXJlZ3MuY3M7Ci0gICAgc3JlZ3MtPnNzID0gcm1yZWdzLnNzOwotICAgIHNyZWdzLT5kcyA9IHJtcmVncy5kczsKLSAgICBvdXQtPnguY2ZsYWcgPSBybXJlZ3MuZmxhZ3MgJiAweDE7Ci0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotI3ByYWdtYSBwYWNrKDEpCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1aW50ICAgIExhcmdlc3RCbG9ja0F2YWlsOwotCXVpbnQgICAgTWF4VW5sb2NrZWRQYWdlOwotCXVpbnQgICAgTGFyZ2VzdExvY2thYmxlUGFnZTsKLQl1aW50ICAgIExpbkFkZHJTcGFjZTsKLQl1aW50ICAgIE51bUZyZWVQYWdlc0F2YWlsOwotCXVpbnQgICAgTnVtUGh5c2ljYWxQYWdlc0ZyZWU7Ci0JdWludCAgICBUb3RhbFBoeXNpY2FsUGFnZXM7Ci0JdWludCAgICBGcmVlTGluQWRkclNwYWNlOwotCXVpbnQgICAgU2l6ZU9mUGFnZUZpbGU7Ci0JdWludCAgICByZXNbM107Ci0JfSBNZW1JbmZvOwotCi0jcHJhZ21hIHBhY2soKQotCi12b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSh1bG9uZyAqcGh5c2ljYWwsdWxvbmcgKnRvdGFsKQotewotICAgIFBNUkVHUyAgcjsKLSAgICBQTVNSRUdTIHNyOwotICAgIE1lbUluZm8gbWVtSW5mbzsKLQotICAgIFBNX3NlZ3JlYWQoJnNyKTsKLSAgICByLnguYXggPSAweDUwMDsgICAgICAgICAgICAgICAgIC8qIERQTUkgZ2V0IGZyZWUgbWVtb3J5IGluZm8gKi8KLSAgICBzci5lcyA9IHNyLmRzOwotICAgIHIuZS5lZGkgPSAodWludCkmbWVtSW5mbzsKLSAgICBQTV9pbnQzODZ4KDB4MzEsICZyLCAmciwgJnNyKTsgIC8qIElzc3VlIHRoZSBpbnRlcnJ1cHQgKi8KLSAgICAqcGh5c2ljYWwgPSBtZW1JbmZvLk51bVBoeXNpY2FsUGFnZXNGcmVlICogNDA5NjsKLSAgICAqdG90YWwgPSBtZW1JbmZvLkxhcmdlc3RCbG9ja0F2YWlsOwotICAgIGlmICgqdG90YWwgPCAqcGh5c2ljYWwpCi0JKnBoeXNpY2FsID0gKnRvdGFsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludCBQTUFQSSBQTV9nZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2dldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBzZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3NldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9wbXNteC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L3Btc214LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTMxYmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L3Btc214LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFNNWCBlbWJlZGRlZCBzeXN0ZW1zIGRldmVsb3BtZW50Ci0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGRvcy5oPgotI2luY2x1ZGUgInNteC9wczJtb3VzZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50ICBnbG9iYWxEYXRhU3RhcnQ7Ci0KLVBNX2NyaXRpY2FsSGFuZGxlciAgX1ZBUkFQSSBfUE1fY3JpdEhhbmRsZXIgPSBOVUxMOwotUE1fYnJlYWtIYW5kbGVyICAgICBfVkFSQVBJIF9QTV9icmVha0hhbmRsZXIgPSBOVUxMOwotUE1faW50SGFuZGxlciAgICAgICBfVkFSQVBJIF9QTV90aW1lckhhbmRsZXIgPSBOVUxMOwotUE1faW50SGFuZGxlciAgICAgICBfVkFSQVBJIF9QTV9ydGNIYW5kbGVyID0gTlVMTDsKLVBNX2ludEhhbmRsZXIgICAgICAgX1ZBUkFQSSBfUE1fa2V5SGFuZGxlciA9IE5VTEw7Ci1QTV9rZXkxNUhhbmRsZXIgICAgIF9WQVJBUEkgX1BNX2tleTE1SGFuZGxlciA9IE5VTEw7Ci1QTV9tb3VzZUhhbmRsZXIgICAgIF9WQVJBUEkgX1BNX21vdXNlSGFuZGxlciA9IE5VTEw7Ci1QTV9pbnRIYW5kbGVyICAgICAgIF9WQVJBUEkgX1BNX2ludDEwSGFuZGxlciA9IE5VTEw7Ci1pbnQgICAgICAgICAgICAgICAgIF9WQVJBUEkgX1BNX21vdXNlTWFzazsKLQotdWNoYXIgKiAgICAgX1ZBUkFQSSBfUE1fY3RybENQdHI7ICAgICAgICAgICAgICAgLyogTG9jYXRpb24gb2YgQ3RybC1DIGZsYWcgICAgICAqLwotdWNoYXIgKiAgICAgX1ZBUkFQSSBfUE1fY3RybEJQdHI7ICAgICAgICAgICAgICAgLyogTG9jYXRpb24gb2YgQ3RybC1CcmVhayBmbGFnICAqLwotdWNoYXIgKiAgICAgX1ZBUkFQSSBfUE1fY3JpdFB0cjsgICAgICAgICAgICAgICAgLyogTG9jYXRpb24gb2YgQ3JpdGljYWwgZXJyb3IgQmYqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldlRpbWVyID0gUE1OVUxMOyAgICAgLyogUHJldmlvdXMgdGltZXIgaGFuZGxlciAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldlJUQyA9IFBNTlVMTDsgICAgICAgLyogUHJldmlvdXMgUlRDIGhhbmRsZXIgICAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldktleSA9IFBNTlVMTDsgICAgICAgLyogUHJldmlvdXMga2V5IGhhbmRsZXIgICAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldktleTE1ID0gUE1OVUxMOyAgICAgLyogUHJldmlvdXMga2V5MTUgaGFuZGxlciAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldkJyZWFrID0gUE1OVUxMOyAgICAgLyogUHJldmlvdXMgYnJlYWsgaGFuZGxlciAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldkN0cmxDID0gUE1OVUxMOyAgICAgLyogUHJldmlvdXMgQ3RybEMgaGFuZGxlciAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldkNyaXRpY2FsID0gUE1OVUxMOyAgLyogUHJldmlvdXMgY3JpdGljYWwgaGFuZGxlciAgICAqLwotbG9uZyAgICAgICAgX1ZBUkFQSSBfUE1fcHJldlJlYWxUaW1lcjsgICAgICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIHRpbWVyICAgICAqLwotbG9uZyAgICAgICAgX1ZBUkFQSSBfUE1fcHJldlJlYWxSVEM7ICAgICAgICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIFJUQyAgICAgICAqLwotbG9uZyAgICAgICAgX1ZBUkFQSSBfUE1fcHJldlJlYWxLZXk7ICAgICAgICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGtleSAgICAgICAqLwotbG9uZyAgICAgICAgX1ZBUkFQSSBfUE1fcHJldlJlYWxLZXkxNTsgICAgICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGtleTE1ICAgICAqLwotbG9uZyAgICAgICAgX1ZBUkFQSSBfUE1fcHJldlJlYWxJbnQxMDsgICAgICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGludCAxMGggICAqLwotc3RhdGljIHVjaGFyICAgICAgICBfUE1fb2xkQ01PU1JlZ0E7ICAgICAgICAgICAgLyogQ01PUyByZWdpc3RlciBBIGNvbnRlbnRzICAgICAqLwotc3RhdGljIHVjaGFyICAgICAgICBfUE1fb2xkQ01PU1JlZ0I7ICAgICAgICAgICAgLyogQ01PUyByZWdpc3RlciBCIGNvbnRlbnRzICAgICAqLwotc3RhdGljIHVjaGFyICAgICAgICBfUE1fb2xkUlRDUElDMjsgICAgICAgICAgICAgLyogTWFzayB2YWx1ZSBmb3IgUlRDIElSUTggICAgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHbG9iYWxzIGZvciBsb2NraW5nIGludGVycnVwdCBoYW5kbGVycyBpbiBfcG1zbXguYXNtICovCi0KLWV4dGVybiBpbnQgIF9BU01BUEkgX1BNX3Btc214RGF0YVN0YXJ0OwotZXh0ZXJuIGludCAgX0FTTUFQSSBfUE1fcG1zbXhEYXRhRW5kOwotdm9pZCBfQVNNQVBJIF9QTV9wbXNteENvZGVTdGFydCh2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fcG1zbXhDb2RlRW5kKHZvaWQpOwotCi0vKiBQcm90ZWN0ZWQgbW9kZSBpbnRlcnJ1cHQgaGFuZGxlcnMsIGFsc28gY2FsbGVkIGJ5IFBNIGNhbGxiYWNrcyBiZWxvdyAqLwotCi12b2lkIF9BU01BUEkgX1BNX3RpbWVySVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9ydGNJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX2tleUlTUih2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fa2V5MTVJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX2JyZWFrSVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9jdHJsQ0lTUih2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fY3JpdGljYWxJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX21vdXNlSVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9pbnQxMFBNQ0Iodm9pZCk7Ci0KLS8qIFByb3RlY3RlZCBtb2RlIERQTUkgY2FsbGJhY2sgaGFuZGxlcnMgKi8KLQotdm9pZCBfQVNNQVBJIF9QTV9tb3VzZVBNQ0Iodm9pZCk7Ci0KLS8qIFJvdXRpbmUgdG8gaW5zdGFsbCBhIG1vdXNlIGhhbmRsZXIgZnVuY3Rpb24gKi8KLQotdm9pZCBfQVNNQVBJIF9QTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2spOwotCi0vKiBSb3V0aW5lIHRvIGFsbG9jYXRlIERQTUkgcmVhbCBtb2RlIGNhbGxiYWNrIHJvdXRpbmVzICovCi0KLXZvaWQgX0FTTUFQSSBfRFBNSV9hbGxvY2F0ZUNhbGxiYWNrKHZvaWQgKF9BU01BUEkgKnBtY29kZSkoKSx2b2lkICpybXJlZ3MsbG9uZyAqUk1DQik7Ci12b2lkIF9BU01BUEkgX0RQTUlfZnJlZUNhbGxiYWNrKGxvbmcgUk1DQik7Ci0KLS8qIERQTUkgaGVscGVyIGZ1bmN0aW9ucyBpbiBQTUxJVEUuQyAqLwotCi11bG9uZyAgIFBNQVBJIERQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcih1bG9uZyBwaHlzQWRkcix1bG9uZyBsaW1pdCk7Ci1pbnQgICAgIFBNQVBJIERQTUlfc2V0U2VsZWN0b3JCYXNlKHVzaG9ydCBzZWwsdWxvbmcgbGluQWRkcik7Ci11bG9uZyAgIFBNQVBJIERQTUlfZ2V0U2VsZWN0b3JCYXNlKHVzaG9ydCBzZWwpOwotaW50ICAgICBQTUFQSSBEUE1JX3NldFNlbGVjdG9yTGltaXQodXNob3J0IHNlbCx1bG9uZyBsaW1pdCk7Ci11aW50ICAgIFBNQVBJIERQTUlfY3JlYXRlU2VsZWN0b3IodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCk7Ci12b2lkICAgIFBNQVBJIERQTUlfZnJlZVNlbGVjdG9yKHVpbnQgc2VsKTsKLWludCAgICAgUE1BUEkgRFBNSV9sb2NrTGluZWFyUGFnZXModWxvbmcgbGluZWFyLHVsb25nIGxlbik7Ci1pbnQgICAgIFBNQVBJIERQTUlfdW5sb2NrTGluZWFyUGFnZXModWxvbmcgbGluZWFyLHVsb25nIGxlbik7Ci0KLS8qIEZ1bmN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSBDTU9TIHJlZ2lzdGVycyAqLwotCi11Y2hhciAgIFBNQVBJIF9QTV9yZWFkQ01PUyhpbnQgaW5kZXgpOwotdm9pZCAgICBQTUFQSSBfUE1fd3JpdGVDTU9TKGludCBpbmRleCx1Y2hhciB2YWx1ZSk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBHZW5lcmljIHJvdXRpbmVzIGNvbW1vbiB0byBhbGwgZW52aXJvbm1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBQTUFQSSBQTV9yZXNldE1vdXNlRHJpdmVyKGludCBoYXJkUmVzZXQpCi17Ci0gICAgcHMyTW91c2VSZXNldCgpOwotfQotCi12b2lkIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koaW50IGZyZXF1ZW5jeSkKLXsKLSAgICBzdGF0aWMgc2hvcnQgY29udmVydFtdID0gewotCTgxOTIsCi0JNDA5NiwKLQkyMDQ4LAotCTEwMjQsCi0JNTEyLAotCTI1NiwKLQkxMjgsCi0JNjQsCi0JMzIsCi0JMTYsCi0JOCwKLQk0LAotCTIsCi0JLTEsCi0JfTsKLSAgICBpbnQgaTsKLQotICAgIC8qIEZpcnN0IGNsZWFyIGFueSBwZW5kaW5nIFJUQyB0aW1lb3V0IGlmIG5vdCBjbGVhcmVkICovCi0gICAgX1BNX3JlYWRDTU9TKDB4MEMpOwotICAgIGlmIChmcmVxdWVuY3kgPT0gMCkgewotCS8qIERpc2FibGUgUlRDIHRpbW91dCAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSxfUE1fb2xkQ01PU1JlZ0EpOwotCV9QTV93cml0ZUNNT1MoMHgwQixfUE1fb2xkQ01PU1JlZ0IgJiAweDBGKTsKLQl9Ci0gICAgZWxzZSB7Ci0JLyogQ29udmVydCBmcmVxdWVuY3kgdmFsdWUgdG8gUlRDIGNsb2NrIGluZGV4ZXMgKi8KLQlmb3IgKGkgPSAwOyBjb252ZXJ0W2ldICE9IC0xOyBpKyspIHsKLQkgICAgaWYgKGNvbnZlcnRbaV0gPT0gZnJlcXVlbmN5KQotCQlicmVhazsKLQkgICAgfQotCi0JLyogU2V0IFJUQyB0aW1vdXQgdmFsdWUgYW5kIGVuYWJsZSB0aW1lb3V0ICovCi0JX1BNX3dyaXRlQ01PUygweDBBLChfUE1fb2xkQ01PU1JlZ0EgJiAweEYwKSB8IChpKzMpKTsKLQlfUE1fd3JpdGVDTU9TKDB4MEIsKF9QTV9vbGRDTU9TUmVnQiAmIDB4MEYpIHwgMHg0MCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBQTUFQSSBsb2NrUE1IYW5kbGVycyh2b2lkKQotewotICAgIHN0YXRpYyBpbnQgICAgICBsb2NrZWQgPSAwOwotICAgIGludCAgICAgICAgICAgICBzdGF0ID0gMDsKLSAgICBQTV9sb2NrSGFuZGxlICAgbGg7Ci0KLSAgICAvKiBMb2NrIGFsbCBvZiB0aGUgY29kZSBhbmQgZGF0YSB1c2VkIGJ5IG91ciBwcm90ZWN0ZWQgbW9kZSBpbnRlcnJ1cHQKLSAgICAgKiBoYW5kbGluZyByb3V0aW5lcywgc28gdGhhdCBpdCB3aWxsIGNvbnRpbnVlIHRvIHdvcmsgY29ycmVjdGx5Ci0gICAgICogdW5kZXIgcmVhbCBtb2RlLgotICAgICAqLwotICAgIGlmICghbG9ja2VkKSB7Ci0JUE1fc2F2ZURTKCk7Ci0Jc3RhdCAgPSAhUE1fbG9ja0RhdGFQYWdlcygmZ2xvYmFsRGF0YVN0YXJ0LTIwNDgsNDA5NiwmbGgpOwotCXN0YXQgfD0gIVBNX2xvY2tEYXRhUGFnZXMoJl9QTV9wbXNteERhdGFTdGFydCwoaW50KSZfUE1fcG1zbXhEYXRhRW5kIC0gKGludCkmX1BNX3Btc214RGF0YVN0YXJ0LCZsaCk7Ci0Jc3RhdCB8PSAhUE1fbG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKV9QTV9wbXNteENvZGVTdGFydCwoaW50KV9QTV9wbXNteENvZGVFbmQtKGludClfUE1fcG1zbXhDb2RlU3RhcnQsJmxoKTsKLQlpZiAoc3RhdCkgewotCSAgICBwcmludGYoIlBhZ2UgbG9ja2luZyBzZXJ2aWNlcyBmYWlsZWQgLSBpbnRlcnJ1cHQgaGFuZGxpbmcgbm90IHNhZmUhXG4iKTsKLQkgICAgZXhpdCgxKTsKLQkgICAgfQotCWxvY2tlZCA9IDE7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX2dldFBNdmVjdChpbnQgaW50bm8sIFBNRkFSUFRSICppc3IpCi17Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHgyMDQ7Ci0gICAgcmVncy5oLmJsID0gaW50bm87Ci0gICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOwotICAgIGlzci0+c2VsID0gcmVncy54LmN4OwotICAgIGlzci0+b2ZmID0gcmVncy5lLmVkeDsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRQTXZlY3QoaW50IGludG5vLCBQTV9pbnRIYW5kbGVyIGlzcikKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIFBNUkVHUyAgcmVnczsKLQotICAgIFBNX3NhdmVEUygpOwotICAgIHJlZ3MueC5heCA9IDB4MjA1OyAgICAgICAgICAvKiBTZXQgcHJvdGVjdGVkIG1vZGUgdmVjdG9yICAgICAgICAqLwotICAgIHJlZ3MuaC5ibCA9IGludG5vOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZWdzLnguY3ggPSBzcmVncy5jczsKLSAgICByZWdzLmUuZWR4ID0gKHVpbnQpaXNyOwotICAgIFBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgaXNyKQotewotICAgIFBNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4MjA1OwotICAgIHJlZ3MuaC5ibCA9IGludG5vOwotICAgIHJlZ3MueC5jeCA9IGlzci5zZWw7Ci0gICAgcmVncy5lLmVkeCA9IGlzci5vZmY7Ci0gICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOwotfQotCi1zdGF0aWMgbG9uZyBwcmV2UmVhbEJyZWFrOyAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBicmVhayBoYW5kbGVyICAgICAqLwotc3RhdGljIGxvbmcgcHJldlJlYWxDdHJsQzsgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUgQ3RybEMgaGFuZGxlciAgICAgKi8KLXN0YXRpYyBsb25nIHByZXZSZWFsQ3JpdGljYWw7ICAgLyogUHJldiByZWFsIG1vZGUgY3JpdGljYWwgaGFuZGxlciAgICAgICovCi0KLWludCBQTUFQSSBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssIFBNX21vdXNlSGFuZGxlciBtaCkKLXsKLSAgICBsb2NrUE1IYW5kbGVycygpOyAgICAgICAgICAgLyogRW5zdXJlIG91ciBoYW5kbGVycyBhcmUgbG9ja2VkICAgKi8KLQotICAgIF9QTV9tb3VzZUhhbmRsZXIgPSBtaDsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlTW91c2VIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9tb3VzZUhhbmRsZXIpCi0JX1BNX21vdXNlSGFuZGxlciA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGdldElTUihpbnQgaW50bm8sIFBNRkFSUFRSICpwbWlzciwgbG9uZyAqcmVhbGlzcikKLXsKLSAgICBQTV9nZXRQTXZlY3QoaW50bm8scG1pc3IpOwotfQotCi1zdGF0aWMgdm9pZCByZXN0b3JlSVNSKGludCBpbnRubywgUE1GQVJQVFIgcG1pc3IsIGxvbmcgcmVhbGlzcikKLXsKLSAgICBQTV9yZXN0b3JlUE12ZWN0KGludG5vLHBtaXNyKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0SVNSKGludCBpbnRubywgdm9pZCAoKiBQTUFQSSBwbWlzcikoKSkKLXsKLSAgICBsb2NrUE1IYW5kbGVycygpOyAgICAgICAgICAgLyogRW5zdXJlIG91ciBoYW5kbGVycyBhcmUgbG9ja2VkICAgKi8KLSAgICBQTV9zZXRQTXZlY3QoaW50bm8scG1pc3IpOwotfQotCi12b2lkIFBNQVBJIFBNX3NldFRpbWVySGFuZGxlcihQTV9pbnRIYW5kbGVyIHRoKQotewotICAgIGdldElTUihQTV9JUlEwLCAmX1BNX3ByZXZUaW1lciwgJl9QTV9wcmV2UmVhbFRpbWVyKTsKLSAgICBfUE1fdGltZXJIYW5kbGVyID0gdGg7Ci0gICAgc2V0SVNSKFBNX0lSUTAsIF9QTV90aW1lcklTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVRpbWVySGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fdGltZXJIYW5kbGVyKSB7Ci0JcmVzdG9yZUlTUihQTV9JUlEwLCBfUE1fcHJldlRpbWVyLCBfUE1fcHJldlJlYWxUaW1lcik7Ci0JX1BNX3RpbWVySGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi1pYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcihQTV9pbnRIYW5kbGVyIHRoLGludCBmcmVxdWVuY3kpCi17Ci0gICAgLyogU2F2ZSB0aGUgb2xkIENNT1MgcmVhbCB0aW1lIGNsb2NrIHZhbHVlcyAqLwotICAgIF9QTV9vbGRDTU9TUmVnQSA9IF9QTV9yZWFkQ01PUygweDBBKTsKLSAgICBfUE1fb2xkQ01PU1JlZ0IgPSBfUE1fcmVhZENNT1MoMHgwQik7Ci0KLSAgICAvKiBTZXQgdGhlIHJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgaGFuZGxlciAqLwotICAgIGdldElTUigweDcwLCAmX1BNX3ByZXZSVEMsICZfUE1fcHJldlJlYWxSVEMpOwotICAgIF9QTV9ydGNIYW5kbGVyID0gdGg7Ci0gICAgc2V0SVNSKDB4NzAsIF9QTV9ydGNJU1IpOwotCi0gICAgLyogUHJvZ3JhbSB0aGUgcmVhbCB0aW1lIGNsb2NrIGRlZmF1bHQgZnJlcXVlbmN5ICovCi0gICAgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeShmcmVxdWVuY3kpOwotCi0gICAgLyogVW5tYXNrIElSUTggaW4gdGhlIFBJQzIgKi8KLSAgICBfUE1fb2xkUlRDUElDMiA9IFBNX2lucGIoMHhBMSk7Ci0gICAgUE1fb3V0cGIoMHhBMSxfUE1fb2xkUlRDUElDMiAmIDB4RkUpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcnRjSGFuZGxlcikgewotCS8qIFJlc3RvcmUgQ01PUyByZWdpc3RlcnMgYW5kIG1hc2sgUlRDIGNsb2NrICovCi0JX1BNX3dyaXRlQ01PUygweDBBLF9QTV9vbGRDTU9TUmVnQSk7Ci0JX1BNX3dyaXRlQ01PUygweDBCLF9QTV9vbGRDTU9TUmVnQik7Ci0JUE1fb3V0cGIoMHhBMSwoUE1faW5wYigweEExKSAmIDB4RkUpIHwgKF9QTV9vbGRSVENQSUMyICYgfjB4RkUpKTsKLQotCS8qIFJlc3RvcmUgdGhlIGludGVycnVwdCB2ZWN0b3IgKi8KLQlyZXN0b3JlSVNSKDB4NzAsIF9QTV9wcmV2UlRDLCBfUE1fcHJldlJlYWxSVEMpOwotCV9QTV9ydGNIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0S2V5SGFuZGxlcihQTV9pbnRIYW5kbGVyIGtoKQotewotICAgIGdldElTUihQTV9JUlExLCAmX1BNX3ByZXZLZXksICZfUE1fcHJldlJlYWxLZXkpOwotICAgIF9QTV9rZXlIYW5kbGVyID0ga2g7Ci0gICAgc2V0SVNSKFBNX0lSUTEsIF9QTV9rZXlJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVLZXlIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9rZXlIYW5kbGVyKSB7Ci0JcmVzdG9yZUlTUihQTV9JUlExLCBfUE1fcHJldktleSwgX1BNX3ByZXZSZWFsS2V5KTsKLQlfUE1fa2V5SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX3NldEtleTE1SGFuZGxlcihQTV9rZXkxNUhhbmRsZXIga2gpCi17Ci0gICAgZ2V0SVNSKDB4MTUsICZfUE1fcHJldktleTE1LCAmX1BNX3ByZXZSZWFsS2V5MTUpOwotICAgIF9QTV9rZXkxNUhhbmRsZXIgPSBraDsKLSAgICBzZXRJU1IoMHgxNSwgX1BNX2tleTE1SVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlS2V5MTVIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9rZXkxNUhhbmRsZXIpIHsKLQlyZXN0b3JlSVNSKDB4MTUsIF9QTV9wcmV2S2V5MTUsIF9QTV9wcmV2UmVhbEtleTE1KTsKLQlfUE1fa2V5MTVIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLS8qIFJlYWwgbW9kZSBDdHJsLUMgYW5kIEN0cmwtQnJlYWsgaGFuZGxlci4gVGhpcyBoYW5kbGVyIHNpbXBseSBzZXRzIGEKLSAqIGZsYWcgaW4gdGhlIHJlYWwgbW9kZSBjb2RlIHNlZ21lbnQgYW5kIGV4aXQuIFdlIHNhdmUgdGhlIGxvY2F0aW9uCi0gKiBvZiB0aGlzIGZsYWcgaW4gcmVhbCBtb2RlIG1lbW9yeSBzbyB0aGF0IGJvdGggdGhlIHJlYWwgbW9kZSBhbmQKLSAqIHByb3RlY3RlZCBtb2RlIGNvZGUgd2lsbCBiZSBtb2RpZnlpbmcgdGhlIHNhbWUgZmxhZ3MuCi0gKi8KLQotc3RhdGljIHVjaGFyIGN0cmxIYW5kbGVyW10gPSB7Ci0gICAgMHgwMCwweDAwLDB4MDAsMHgwMCwgICAgICAgICAgICAvKiAgY3RybEJGbGFnICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4NjYsMHgyRSwweEM3LDB4MDYsMHgwMCwweDAwLAotICAgIDB4MDEsMHgwMCwweDAwLDB4MDAsICAgICAgICAgICAgLyogIG1vdiAgICAgW2NzOmN0cmxCRmxhZ10sMSAgICAgICAgKi8KLSAgICAweENGLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBpcmV0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgfTsKLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQWx0QnJlYWtIYW5kbGVyKFBNX2JyZWFrSGFuZGxlciBiaCkKLXsKLSAgICB1aW50ICAgIHJzZWcscm9mZjsKLQotICAgIGdldElTUigweDFCLCAmX1BNX3ByZXZCcmVhaywgJnByZXZSZWFsQnJlYWspOwotICAgIGdldElTUigweDIzLCAmX1BNX3ByZXZDdHJsQywgJnByZXZSZWFsQ3RybEMpOwotICAgIF9QTV9icmVha0hhbmRsZXIgPSBiaDsKLSAgICBzZXRJU1IoMHgxQiwgX1BNX2JyZWFrSVNSKTsKLSAgICBzZXRJU1IoMHgyMywgX1BNX2N0cmxDSVNSKTsKLQotICAgIC8qIEhvb2sgdGhlIHJlYWwgbW9kZSB2ZWN0b3JzIGZvciB0aGVzZSBoYW5kbGVycywgYXMgdGhlc2UgYXJlIG5vdAotICAgICAqIG5vcm1hbGx5IHJlZmxlY3RlZCBieSB0aGUgRFBNSSBzZXJ2ZXIgdXAgdG8gcHJvdGVjdGVkIG1vZGUKLSAgICAgKi8KLSAgICBfUE1fY3RybEJQdHIgPSBQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKGN0cmxIYW5kbGVyKSoyLCAmcnNlZywgJnJvZmYpOwotICAgIG1lbWNweShfUE1fY3RybEJQdHIsY3RybEhhbmRsZXIsc2l6ZW9mKGN0cmxIYW5kbGVyKSk7Ci0gICAgbWVtY3B5KF9QTV9jdHJsQlB0citzaXplb2YoY3RybEhhbmRsZXIpLGN0cmxIYW5kbGVyLHNpemVvZihjdHJsSGFuZGxlcikpOwotICAgIF9QTV9jdHJsQ1B0ciA9IF9QTV9jdHJsQlB0ciArIHNpemVvZihjdHJsSGFuZGxlcik7Ci0gICAgX1BNX3NldFJNdmVjdCgweDFCLCgobG9uZylyc2VnIDw8IDE2KSB8IChyb2ZmKzQpKTsKLSAgICBfUE1fc2V0Uk12ZWN0KDB4MjMsKChsb25nKXJzZWcgPDwgMTYpIHwgKHJvZmYrc2l6ZW9mKGN0cmxIYW5kbGVyKSs0KSk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEJyZWFrSGFuZGxlcih2b2lkKQotewotICAgIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoTlVMTCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcHJldkJyZWFrLnNlbCkgewotCXJlc3RvcmVJU1IoMHgxQiwgX1BNX3ByZXZCcmVhaywgcHJldlJlYWxCcmVhayk7Ci0JcmVzdG9yZUlTUigweDIzLCBfUE1fcHJldkN0cmxDLCBwcmV2UmVhbEN0cmxDKTsKLQlfUE1fcHJldkJyZWFrLnNlbCA9IDA7Ci0JX1BNX2JyZWFrSGFuZGxlciA9IE5VTEw7Ci0JUE1fZnJlZVJlYWxTZWcoX1BNX2N0cmxCUHRyKTsKLQl9Ci19Ci0KLS8qIFJlYWwgbW9kZSBDcml0aWNhbCBFcnJvciBoYW5kbGVyLiBUaGlzIGhhbmRsZXIgc2ltcGx5IHNhdmVzIHRoZSBBWCBhbmQKLSAqIERJIHZhbHVlcyBpbiB0aGUgcmVhbCBtb2RlIGNvZGUgc2VnbWVudCBhbmQgZXhpdHMuIFdlIHNhdmUgdGhlIGxvY2F0aW9uCi0gKiBvZiB0aGlzIGZsYWcgaW4gcmVhbCBtb2RlIG1lbW9yeSBzbyB0aGF0IGJvdGggdGhlIHJlYWwgbW9kZSBhbmQKLSAqIHByb3RlY3RlZCBtb2RlIGNvZGUgd2lsbCBiZSBtb2RpZnlpbmcgdGhlIHNhbWUgZmxhZ3MuCi0gKi8KLQotc3RhdGljIHVjaGFyIGNyaXRpY2FsSGFuZGxlcltdID0gewotICAgIDB4MDAsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgLyogIGF4Q29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDAwLDB4MDAsICAgICAgICAgICAgICAgICAgICAgIC8qICBkaUNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgyRSwweEEzLDB4MDAsMHgwMCwgICAgICAgICAgICAvKiAgbW92ICAgICBbY3M6YXhDb2RlXSxheCAgICAgICAgICAqLwotICAgIDB4MkUsMHg4OSwweDNFLDB4MDIsMHgwMCwgICAgICAgLyogIG1vdiAgICAgW2NzOmRpQ29kZV0sZGkgICAgICAgICAgKi8KLSAgICAweEI4LDB4MDMsMHgwMCwgICAgICAgICAgICAgICAgIC8qICBtb3YgICAgIGF4LDMgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHhDRiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgaXJldGYgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIH07Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEFsdENyaXRpY2FsSGFuZGxlcihQTV9jcml0aWNhbEhhbmRsZXIgY2gpCi17Ci0gICAgdWludCAgICByc2VnLHJvZmY7Ci0KLSAgICBnZXRJU1IoMHgyNCwgJl9QTV9wcmV2Q3JpdGljYWwsICZwcmV2UmVhbENyaXRpY2FsKTsKLSAgICBfUE1fY3JpdEhhbmRsZXIgPSBjaDsKLSAgICBzZXRJU1IoMHgyNCwgX1BNX2NyaXRpY2FsSVNSKTsKLQotICAgIC8qIEhvb2sgdGhlIHJlYWwgbW9kZSB2ZWN0b3IsIGFzIHRoaXMgaXMgbm90IG5vcm1hbGx5IHJlZmxlY3RlZCBieSB0aGUKLSAgICAgKiBEUE1JIHNlcnZlciB1cCB0byBwcm90ZWN0ZWQgbW9kZS4KLSAgICAgKi8KLSAgICBfUE1fY3JpdFB0ciA9IFBNX2FsbG9jUmVhbFNlZyhzaXplb2YoY3JpdGljYWxIYW5kbGVyKSoyLCAmcnNlZywgJnJvZmYpOwotICAgIG1lbWNweShfUE1fY3JpdFB0cixjcml0aWNhbEhhbmRsZXIsc2l6ZW9mKGNyaXRpY2FsSGFuZGxlcikpOwotICAgIF9QTV9zZXRSTXZlY3QoMHgyNCwoKGxvbmcpcnNlZyA8PCAxNikgfCAocm9mZis0KSk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbENyaXRpY2FsSGFuZGxlcih2b2lkKQotewotICAgIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoTlVMTCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNyaXRpY2FsSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcHJldkNyaXRpY2FsLnNlbCkgewotCXJlc3RvcmVJU1IoMHgyNCwgX1BNX3ByZXZDcml0aWNhbCwgcHJldlJlYWxDcml0aWNhbCk7Ci0JUE1fZnJlZVJlYWxTZWcoX1BNX2NyaXRQdHIpOwotCV9QTV9wcmV2Q3JpdGljYWwuc2VsID0gMDsKLQlfUE1fY3JpdEhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZXR1cm4gRFBNSV9sb2NrTGluZWFyUGFnZXMoKHVpbnQpcCArIERQTUlfZ2V0U2VsZWN0b3JCYXNlKHNyZWdzLmRzKSxsZW4pOwotfQotCi1pbnQgUE1BUEkgUE1fdW5sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgUE1TUkVHUyBzcmVnczsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmV0dXJuIERQTUlfdW5sb2NrTGluZWFyUGFnZXMoKHVpbnQpcCArIERQTUlfZ2V0U2VsZWN0b3JCYXNlKHNyZWdzLmRzKSxsZW4pOwotfQotCi1pbnQgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLS8qQU06IGNhdXNlcyBtaW5vciBnbGl0Y2ggd2l0aCAqLwotLypBTTogb2xkZXIgdmVyc2lvbnMgcG1FYXN5IHdoaWNoIGRvbid0IGFsbG93IERQTUkgMDYgb24gKi8KLS8qQU06IENvZGUgc2VsZWN0b3IgMHgwQyAtLSBhc3N1bWUgYmFzZSBpcyAwIHdoaWNoIGl0IHNob3VsZCBiZS4gKi8KLSAgICByZXR1cm4gRFBNSV9sb2NrTGluZWFyUGFnZXMoKHVpbnQpcCxsZW4pOwotfQotCi1pbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJldHVybiBEUE1JX3VubG9ja0xpbmVhclBhZ2VzKCh1aW50KXAsbGVuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC92ZmxhdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L3ZmbGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OWVmMmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L3ZmbGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBEdW1teSBtb2R1bGU7IG5vIHZpcnR1YWwgZnJhbWVidWZmZXIgZm9yIHRoaXMgT1MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotCi1pYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKLXsKLSAgICBiYXNlQWRkciA9IGJhc2VBZGRyOwotICAgIGJhbmtTaXplID0gYmFua1NpemU7Ci0gICAgY29kZUxlbiA9IGNvZGVMZW47Ci0gICAgYmFua0Z1bmMgPSBiYW5rRnVuYzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCi17Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvenRpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NDExOTIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L3p0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBTTVggZW1iZWRkZWQgc3lzdGVtcyBkZXZlbG9wbWVudAotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KLSogICAgIExaVGltZXIgbm90IHN1cHBvcnRlZCBmb3Igc214IChhcyBuZWVkZWQgZm9yIGk0ODYgcHJvY2Vzc29ycyksIG9ubHkKLSogICAgIFVMWlRpbWVyIGlzIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHNteCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1leHRlcm4gdWxvbmcgICAgICBfY2RlY2wgZXRpbWU7ICAgICAvKiBlbGFwc2VkIHRpbWUgKi8KLWV4dGVybiB1bG9uZyAgICAgIF9jZGVjbCB4dGlja3NfcGVyX3NlY29uZCh2b2lkKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRXh0ZXJuYWwgYXNzZW1ibGVyIGZ1bmN0aW9ucyAqLwotCi12b2lkICAgIF9BU01BUEkgTFpfZGlzYWJsZSh2b2lkKTsKLXZvaWQgICAgX0FTTUFQSSBMWl9lbmFibGUodm9pZCk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBaZW4gVGltZXIgbW9kdWxlIGludGVybmFscy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9fWlRpbWVySW5pdCh2b2lkKQotewotfQotCi11bG9uZyByZXRlcnIodm9pZCkKLXsKLSAgIFBNX2ZhdGFsRXJyb3IoIlplbiBUaW1lciBub3Qgc3VwcG9ydGVkIGZvciBzbXguIik7Ci0gICByZXR1cm4oMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lck9uKHRtKSAgICAgUE1fZmF0YWxFcnJvcigiWmVuIFRpbWVyIG5vdCBzdXBwb3J0ZWQgZm9yIHNteC4iKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJMYXAodG0pICAgIHJldGVycigpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lck9mZih0bSkgICAgUE1fZmF0YWxFcnJvcigiWmVuIFRpbWVyIG5vdCBzdXBwb3J0ZWQgZm9yIHNteC4iKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJDb3VudCh0bSkgIHJldGVycigpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCB0aW1lciBhcyBzZWNvbmRzIHBlciB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAgICAgKHVsb25nKSgxMDAwMDAwL3h0aWNrc19wZXJfc2Vjb25kKCkpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgTG9uZyBQZXJpb2QgdGltZXIgdmFsdWUgZnJvbSB0aGUgc214IHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKLXsKLSAgICB1bG9uZyAgIHRpY2tzOwotICAgIExaX2Rpc2FibGUoKTsgICAgICAgICAgICAvKiBUdXJuIG9mIGludGVycnVwdHMgICAgICAgICAgICAgICAqLwotICAgIHRpY2tzID0gZXRpbWU7Ci0gICAgTFpfZW5hYmxlKCk7ICAgICAgICAgICAgIC8qIFR1cm4gb24gaW50ZXJydXB0cyBhZ2FpbiAgICAgICAgICovCi0gICAgcmV0dXJuIHRpY2tzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suIE5vdGUgdGhhdCB3ZSBjaGVjayB0byBzZWUKLXdoZXRoZXIgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkLCBhbmQgaWYgc28gYWRqdXN0IHRoZSBmaW5pc2ggdGltZSB0bwotYWNjb3VudCBmb3IgdGhpcy4gV2UgY2Fubm90IGRldGVjdCBpZiBtb3JlIHRoYXQgb25lIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcwotcGFzc2VkLCBzbyBpZiB0aGlzIGhhcHBlbnMgd2Ugd2lsbCBiZSBnZW5lcmF0aW5nIGVycm9ub3VzIHJlc3VsdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX19VTFpFbGFwc2VkVGltZSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpCi17Ci0gICAgaWYgKGZpbmlzaCA8IHN0YXJ0KQotCWZpbmlzaCArPSB4dGlja3NfcGVyX3NlY29uZCgpICogMzYwMCAqMjQ7ICAgICAgIC8qIE51bWJlciBvZiB0aWNrcyBpbiAyNCBob3VycyAgICAgICovCi0gICAgcmV0dXJuIGZpbmlzaCAtIHN0YXJ0OwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9jcHVpbmZvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL2NwdWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxNWU5MC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogICoqKiBUT0RPOiBBREQgWU9VUiBPUyBFTlZJUk9OTUVOVCBOQU1FIEhFUkUgKioqCi0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyB0byBtZWFzdXJlIHRoZQotKiAgICAgICAgICAgICAgIENQVSBmcmVxdWVuY3kuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluY3JlYXNlIHRoZSB0aHJlYWQgcHJpb3JpdHkgdG8gbWF4aW11bSwgaWYgcG9zc2libGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBTZXRNYXhUaHJlYWRQcmlvcml0eSh2b2lkKQotewotICAgIC8qIFRPRE86IElmIHlvdSBoYXZlIHRocmVhZCBwcmlvcml0aWVzLCBpbmNyZWFzZSBpdCB0byBtYXhpbXVtIGZvciB0aGUgKi8KLSAgICAvKiAgICAgICB0aHJlYWQgZm9yIHRpbWluZyB0aGUgQ1BVIGZyZXF1ZW5jeS4gKi8KLSAgICByZXR1cm4gb2xkUHJpb3JpdHk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgb3JpZ2luYWwgdGhyZWFkIHByaW9yaXR5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFJlc3RvcmVUaHJlYWRQcmlvcml0eSgKLSAgICBpbnQgcHJpb3JpdHkpCi17Ci0gICAgLyogVE9ETzogUmVzdG9yZSB0aGUgb3JpZ2luYWwgdGhyZWFkIHByaW9yaXR5IG9uIGV4aXQuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgR2V0Q291bnRlckZyZXF1ZW5jeSgKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICpmcmVxKQotewotICAgIC8qIFRPRE86IFJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyIGluIGhlcmUuIFlvdSBzaG91bGQgdHJ5IHRvICovCi0gICAgLyogICAgICAgbm9ybWFsaXNlIHRoaXMgdmFsdWUgdG8gYmUgYXJvdW5kIDEwMCwwMDAgdGlja3MgcGVyIHNlY29uZC4gKi8KLSAgICBmcmVxLT5sb3cgPSAwOwotICAgIGZyZXEtPmhpZ2ggPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KLQotVE9ETzogSW1wbGVtZW50IHRoaXMgdG8gcmVhZCB0aGUgY291bnRlci4gSXQgc2hvdWxkIGJlIGRvbmUgYXMgYSBtYWNybwotICAgICAgZm9yIGFjY3VyYWN5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgR2V0Q291bnRlcih0KSAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodCktPmxvdyA9IDA7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAodCktPmhpZ2ggPSAwOyAgICAgICAgICAgICAgICAgIFwKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA0YzQ5Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL2V2ZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgKioqIFRPRE86IEFERCBZT1VSIE9TIEVOVklST05NRU5UIE5BTUUgSEVSRSAqKioKLSoKLSogRGVzY3JpcHRpb246ICAqKioqIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaCBjcm9zcyBwbGF0Zm9ybQotKiAgICAgICAgICAgICAgIGV2ZW50IGxpYnJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdXNob3J0ICAgICAgIGtleVVwTXNnWzI1Nl0gPSB7MH07LyogVGFibGUgb2Yga2V5IHVwIG1lc3NhZ2VzICAgICAqLwotc3RhdGljIGludCAgICAgICAgICByYW5nZVgscmFuZ2VZOyAgICAgIC8qIFJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzICAgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVGhlc2UgYXJlIG5vdCB1c2VkIHVuZGVyIG5vbi1ET1Mgc3lzdGVtcyAqLwotI2RlZmluZSBfRVZUX2Rpc2FibGVJbnQoKSAgICAgICAxCi0jZGVmaW5lIF9FVlRfcmVzdG9yZUludChmbGFncykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIFNjYW4gY29kZSB0byB0ZXN0Ci0KLVJFTUFSS1M6Ci1UaGlzIG1hY3JvIGRldGVybWluZXMgaWYgYSBzcGVjaWZpZWQga2V5IGlzIGN1cnJlbnRseSBkb3duIGF0IHRoZQotdGltZSB0aGF0IHRoZSBjYWxsIGlzIG1hZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX2lzS2V5RG93bihzY2FuQ29kZSkgICAgKGtleVVwTXNnW3NjYW5Db2RlXSAhPSAwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB0aWNrcyBzaW5jZSBzeXN0ZW0KLXN0YXJ0dXAgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHBsYWNlZCBpbnRvCi10aGUgdGltZSBzdGFtcCBmaWVsZHMgb2YgZXZlbnRzLCBhbmQgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXV0byBtb3VzZSBkb3duCi1ldmVudHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX0VWVF9nZXRUaWNrcyh2b2lkKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciB5b3VyIE9TISAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVB1bXBzIGFsbCBtZXNzYWdlcyBpbiB0aGUgYXBwbGljYXRpb24gbWVzc2FnZSBxdWV1ZSBpbnRvIG91ciBldmVudCBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQotewotICAgIC8qIFRPRE86IFRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gcmVhZCBhbGwga2V5Ym9hcmQgYW5kIG1vdXNlICovCi0gICAgLyogICAgICAgZXZlbnRzIGZyb20gdGhlIE9TIHNwZWNpZmljIGV2ZW50IHF1ZXVlLCB0cmFuc2xhdGUgdGhlbSBhbmQgcG9zdCAqLwotICAgIC8qICAgICAgIHRoZW0gaW50byB0aGUgU2NpVGVjaCBldmVudCBxdWV1ZS4gKi8KLSAgICAvKiAqLwotICAgIC8qIE5PVEU6IFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBpbXBvcnRhbnQgdGhpbmdzIHRoYXQgdGhpcyBmdW5jdGlvbiBtdXN0ICovCi0gICAgLyogICAgICAgdGFrZSBjYXJlIG9mOiAqLwotICAgIC8qICovCi0gICAgLyogIDEuIFN1cHBvcnQgZm9yIEtFWURPV04sIEtFWVJFUEVBVCBhbmQgS0VZVVAgaXMgcmVxdWlyZWQuICovCi0gICAgLyogKi8KLSAgICAvKiAgMi4gU3VwcG9ydCBmb3IgcmVhZGluZyBoYXJkd2FyZSBzY2FuIGNvZGUgYXMgd2VsbCBhcyBBU0NJSSAqLwotICAgIC8qICAgICB0cmFuc2xhdGVkIHZhbHVlcyBpcyByZXF1aXJlZC4gR2FtZXMgdXNlIHRoZSBzY2FuIGNvZGVzIHJhdGhlciAqLwotICAgIC8qICAgICB0aGFuIEFTQ0lJIHZhbHVlcy4gU2NhbiBjb2RlcyBnbyBpbnRvIHRoZSBoaWdoIG9yZGVyIGJ5dGUgb2YgdGhlICovCi0gICAgLyogICAgIGtleWJvYXJkIG1lc3NhZ2UgZmllbGQuICovCi0gICAgLyogKi8KLSAgICAvKiAgMy4gU3VwcG9ydCBmb3IgYXQgbGVhc3QgcmVhZGluZyBtb3VzZSBtb3Rpb24gZGF0YSAobWlja2V5cykgZnJvbSB0aGUgKi8KLSAgICAvKiAgICAgbW91c2UgaXMgcmVxdWlyZWQuIFVzaW5nIHRoZSBtaWNrZXkgdmFsdWVzLCB3ZSBjYW4gdGhlbiB0cmFuc2xhdGUgKi8KLSAgICAvKiAgICAgdG8gbW91c2UgY3Vyc29yIGNvb3JkaW5hdGVzIHNjYWxlZCB0byB0aGUgcmFuZ2Ugb2YgdGhlIGN1cnJlbnQgKi8KLSAgICAvKiAgICAgZ3JhcGhpY3MgZGlzcGxheSBtb2RlLiBNb3VzZSB2YWx1ZXMgYXJlIHNjYWxlZCBiYXNlZCBvbiB0aGUgKi8KLSAgICAvKiAgICAgZ2xvYmFsICdyYW5nZVgnIGFuZCAncmFuZ2VZJy4gKi8KLSAgICAvKiAqLwotICAgIC8qICA0LiBTdXBwb3J0IGZvciBhIHRpbWVzdGFtcCBmb3IgdGhlIGV2ZW50cyBpcyByZXF1aXJlZCwgd2hpY2ggaXMgKi8KLSAgICAvKiAgICAgZGVmaW5lZCBhcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBzb21lIGV2ZW50ICh1c3VhbGx5ICovCi0gICAgLyogICAgIHN5c3RlbSBzdGFydHVwKS4gVGhpcyBpcyB0aGUgdGltZXN0YW1wIHdoZW4gdGhlIGV2ZW50IG9jY3VycmVkICovCi0gICAgLyogICAgIChpZTogYXQgaW50ZXJydXB0IHRpbWUpIG5vdCB3aGVuIGl0IHdhcyBzdHVmZiBpbnRvIHRoZSBTY2lUZWNoICovCi0gICAgLyogICAgIGV2ZW50IHF1ZXVlLiAqLwotICAgIC8qICovCi0gICAgLyogIDUuIFN1cHBvcnQgZm9yIG1vdXNlIGRvdWJsZSBjbGljayBldmVudHMuIElmIHRoZSBPUyBoYXMgYSBuYXRpdmUgKi8KLSAgICAvKiAgICAgbWVjaGFuaXNtIHRvIGRldGVybWluZSB0aGlzLCBpdCBzaG91bGQgYmUgdXNlZC4gT3RoZXJ3aXNlIHRoZSAqLwotICAgIC8qICAgICB0aW1lIHN0YW1wIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBieSB0aGUgZ2VuZXJpYyBldmVudCBjb2RlICovCi0gICAgLyogICAgIHRvIGdlbmVyYXRlIGRvdWJsZSBjbGljayBldmVudHMuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBtYWNyby9mdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnRzIHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZQota2V5Ym9hcmQgdG8gb3VyIGV2ZW50IGxpYnJhcmllcyBub3JtYWxpc2VkIGZvcm1hdC4gV2Ugb25seSBoYXZlIG9uZSBzY2FuCi1jb2RlIGZvciB0aGUgJ0EnIGtleSwgYW5kIHVzZSBzaGlmdCBtb2RpZmllcnMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEKLUN0cmwtRjEsIEFsdC1GMSBldGMuIFRoZSByYXcgc2NhbiBjb2RlcyBmcm9tIHRoZSBrZXlib2FyZCB3b3JrIHRoaXMgd2F5LAotYnV0IHRoZSBPUyBnaXZlcyB1cyAnY29va2VkJyBzY2FuIGNvZGVzLCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSB0aGVtIGJhY2sKLXRvIHRoZSByYXcgZm9ybWF0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9tYXNrS2V5Q29kZShldnQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2FmZWx5IGFib3J0IHRoZSBldmVudCBtb2R1bGUgdXBvbiBjYXRjaGluZyBhIGZhdGFsIGVycm9yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9hYm9ydCgpCi17Ci0gICAgRVZUX2V4aXQoKTsKLSAgICBQTV9mYXRhbEVycm9yKCJVbmhhbmRsZWQgZXhjZXB0aW9uISIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1vdXNlTW92ZSAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuZXZlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZAotCi1SRU1BUktTOgotSW5pdGlsaWFzZSB0aGUgZXZlbnQgaGFuZGxpbmcgbW9kdWxlLiBIZXJlIHdlIGluc3RhbGwgb3VyIG1vdXNlIGhhbmRsaW5nIElTUgotdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGFueSBidXR0b24ncyBhcmUgcHJlc3NlZCBvciByZWxlYXNlZC4gV2UgYWxzbyBidWlsZAotdGhlIGZyZWUgbGlzdCBvZiBldmVudHMgaW4gdGhlIGV2ZW50IHF1ZXVlLgotCi1XZSB1c2UgaGFuZGxlciBudW1iZXIgMiBvZiB0aGUgbW91c2UgbGlicmFyaWVzIGludGVycnVwdCBoYW5kbGVycyBmb3Igb3VyCi1ldmVudCBoYW5kbGluZyByb3V0aW5lcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfaW5pdCgKLSAgICBfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKQotewotICAgIC8qIEluaXRpYWxpc2UgdGhlIGV2ZW50IHF1ZXVlICovCi0gICAgX21vdXNlTW92ZSA9IG1vdXNlTW92ZTsKLSAgICBpbml0RXZlbnRRdWV1ZSgpOwotICAgIG1lbXNldChrZXlVcE1zZywwLHNpemVvZihrZXlVcE1zZykpOwotCi0gICAgLyogVE9ETzogRG8gYW55IE9TIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uIGhlcmUgKi8KLQotICAgIC8qIENhdGNoIHByb2dyYW0gdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KLSAgICBzaWduYWwoU0lHQUJSVCwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0ZQRSwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0lOVCwgX0VWVF9hYm9ydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1DaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQotc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcwotbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMpCi17Ci0gICAgcmFuZ2VYID0geFJlczsKLSAgICByYW5nZVkgPSB5UmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWlsaXNlcyB0aGUgaW50ZXJuYWwgZXZlbnQgaGFuZGxpbmcgbW9kdWxlcy4gVGhlIEVWVF9zdXNwZW5kIGZ1bmN0aW9uCi1jYW4gYmUgY2FsbGVkIHRvIHN1c3BlbmQgZXZlbnQgaGFuZGxpbmcgKHN1Y2ggYXMgd2hlbiBzaGVsbGluZyBvdXQgdG8gRE9TKSwKLWFuZCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3VtZSBpdCBhZ2FpbiBsYXRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9yZXN1bWUodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBub24gRE9TIHN5c3RlbXMgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLVN1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KLWRlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfc3VzcGVuZCh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIG5vbiBET1Mgc3lzdGVtcyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX2V4aXQodm9pZCkKLXsKLSAgICAvKiBSZXN0b3JlIHNpZ25hbCBoYW5kbGVycyAqLwotICAgIHNpZ25hbChTSUdBQlJULCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHRlBFLCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKLQotICAgIC8qIFRPRE86IERvIGFueSBPUyBzcGVjaWZpYyBjbGVhbnVwIGluIGhlcmUgKi8KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5NWNiYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBCZU9TCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRPRE86IFRoaXMgaXMgd2hlcmUgeW91IGluY2x1ZGUgT1Mgc3BlY2lmaWMgaGVhZGVycyBmb3IgdGhlIGV2ZW50IGhhbmRsaW5nICovCi0vKiAgICAgICBsaWJyYXJ5LiBZb3UgbWF5IGxlYXZlIHRoaXMgZW1wdHkgaWYgeW91IGhhdmUgbm8gT1Mgc3BlY2lmaWMgaGVhZGVycyAqLwotLyogICAgICAgdG8gaW5jbHVkZS4gKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvcG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyNzhjMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL3BtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgKioqIFRPRE86IEFERCBZT1VSIE9TIEVOVklST05NRU5UIE5BTUUgSEVSRSAqKioKLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKLSogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKLSogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5Ci0qICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKLSogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qIFRPRE86IEluY2x1ZGUgYW55IE9TIHNwZWNpZmljIGhlYWRlcnMgaGVyZSEgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVE9ETzogSWYgeW91IHN1cHBvcnQgYWNjZXNzIHRvIHRoZSBCSU9TLCB0aGUgZm9sbG93aW5nIFZFU0FCdWYgZ2xvYmFscyAqLwotLyogICAgICAga2VlcCB0cmFjayBvZiBhIHNpbmdsZSBWRVNBIHRyYW5zZmVyIGJ1ZmZlci4gSWYgeW91IGRvbid0IHN1cHBvcnQgKi8KLS8qICAgICAgIGFjY2VzcyB0byB0aGUgQklPUywgcmVtb3ZlIHRoZXNlIHZhcmlhYmxlcy4gKi8KLQotc3RhdGljIHVpbnQgVkVTQUJ1Zl9sZW4gPSAxMDI0OyAgICAgLyogTGVuZ3RoIG9mIHRoZSBWRVNBQnVmIGJ1ZmZlciAgICAgKi8KLXN0YXRpYyB2b2lkICpWRVNBQnVmX3B0ciA9IE5VTEw7ICAgIC8qIE5lYXIgcG9pbnRlciB0byBWRVNBQnVmICAgICAgICAgICovCi1zdGF0aWMgdWludCBWRVNBQnVmX3JzZWc7ICAgICAgICAgICAvKiBSZWFsIG1vZGUgc2VnbWVudCBvZiBWRVNBQnVmICAgICAqLwotc3RhdGljIHVpbnQgVkVTQUJ1Zl9yb2ZmOyAgICAgICAgICAgLyogUmVhbCBtb2RlIG9mZnNldCBvZiBWRVNBQnVmICAgICAgKi8KLQotc3RhdGljIHZvaWQgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFBNIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9pbml0KHZvaWQpCi17Ci0gICAgLyogVE9ETzogRG8gYW55IGluaXRpYWxpc2F0aW9uIGluIGhlcmUuIFRoaXMgaW5jbHVkZXMgZ2V0dGluZyBJT1BMICovCi0gICAgLyogICAgICAgYWNjZXNzIGZvciB0aGUgcHJvY2VzcyBjYWxsaW5nIFBNX2luaXQuIFRoaXMgd2lsbCBnZXQgY2FsbGVkICovCi0gICAgLyogICAgICAgbW9yZSB0aGFuIG9uY2UuICovCi0KLSAgICAvKiBUT0RPOiBJZiB5b3Ugc3VwcG9ydCB0aGUgc3VwcGxpZWQgTVRSUiByZWdpc3RlciBzdHVmZiAoeW91IG5lZWQgdG8gKi8KLSAgICAvKiAgICAgICBiZSBhdCByaW5nIDAgZm9yIHRoaXMhKSwgeW91IHNob3VsZCBpbml0aWFsaXNlIGl0IGluIGhlcmUuICovCi0KLS8qIE1UUlJfaW5pdCgpOyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0eXBlIGlkZW50aWZpZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBDaGFuZ2UgdGhpcyB0byByZXR1cm4gdGhlIGRlZmluZSBmb3IgeW91ciBPUyBmcm9tIGRydmxpYi9vcy5oICovCi0gICAgcmV0dXJuIF9PU19NWU9TOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcnVudGltZSB0eXBlIGlkZW50aWZpZXIgKGFsd2F5cyBQTV8zODYgZm9yIHByb3RlY3RlZCBtb2RlKQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQoteyByZXR1cm4gUE1fMzg2OyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWRkIGEgZmlsZSBkaXJlY3Rvcnkgc2VwYXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGVuYW1lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKAotICAgIGNoYXIgKnMpCi17Ci0gICAgdWludCBwb3MgPSBzdHJsZW4ocyk7Ci0gICAgaWYgKHNbcG9zLTFdICE9ICcvJykgewotCXNbcG9zXSA9ICcvJzsKLQlzW3BvcysxXSA9ICdcMCc7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFkZCBhIHVzZXIgZGVmaW5lZCBQTV9mYXRhbEVycm9yIGNsZWFudXAgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGYXRhbEVycm9yQ2xlYW51cCgKLSAgICB2b2lkIChQTUFQSVAgY2xlYW51cCkodm9pZCkpCi17Ci0gICAgZmF0YWxFcnJvckNsZWFudXAgPSBjbGVhbnVwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlcG9ydCBhIGZhdGFsIGVycm9yIGNvbmRpdGlvbiBhbmQgaGFsdCB0aGUgcHJvZ3JhbS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZhdGFsRXJyb3IoCi0gICAgY29uc3QgY2hhciAqbXNnKQotewotICAgIC8qIFRPRE86IElmIHlvdSBhcmUgcnVubmluZyBpbiBhIEdVSSBlbnZpcm9ubWVudCB3aXRob3V0IGEgY29uc29sZSwgKi8KLSAgICAvKiAgICAgICB0aGlzIG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gYnJpbmcgdXAgYSBmYXRhbCBlcnJvciBtZXNzYWdlICovCi0gICAgLyogICAgICAgYm94IGFuZCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0uICovCi0gICAgaWYgKGZhdGFsRXJyb3JDbGVhbnVwKQotCWZhdGFsRXJyb3JDbGVhbnVwKCk7Ci0gICAgZnByaW50ZihzdGRlcnIsIiVzXG4iLCBtc2cpOwotICAgIGV4aXQoMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRXhpdCBoYW5kbGVyIHRvIGtpbGwgdGhlIFZFU0EgdHJhbnNmZXIgYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEV4aXRWQkVCdWYodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBJZiB5b3UgZG8gbm90IGhhdmUgQklPUyBhY2Nlc3MsIHJlbW92ZSB0aGlzIGZ1bmN0aW9uLiAqLwotICAgIGlmIChWRVNBQnVmX3B0cikKLQlQTV9mcmVlUmVhbFNlZyhWRVNBQnVmX3B0cik7Ci0gICAgVkVTQUJ1Zl9wdHIgPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIHRoZSByZWFsIG1vZGUgVkVTQSB0cmFuc2ZlciBidWZmZXIgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgQklPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0VkVTQUJ1ZigKLSAgICB1aW50ICpsZW4sCi0gICAgdWludCAqcnNlZywKLSAgICB1aW50ICpyb2ZmKQotewotICAgIC8qIFRPRE86IElmIHlvdSBkbyBub3QgaGF2ZSBCSU9TIGFjY2Vzcywgc2ltcGx5IGRlbGV0ZSB0aGUgZ3V0cyBvZiAqLwotICAgIC8qICAgICAgIHRoaXMgZnVuY3Rpb24gYW5kIHJldHVybiBOVUxMLiAqLwotICAgIGlmICghVkVTQUJ1Zl9wdHIpIHsKLQkvKiBBbGxvY2F0ZSBhIGdsb2JhbCBidWZmZXIgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgVkVTQSBWQkUgKi8KLQlpZiAoKFZFU0FCdWZfcHRyID0gUE1fYWxsb2NSZWFsU2VnKFZFU0FCdWZfbGVuLCAmVkVTQUJ1Zl9yc2VnLCAmVkVTQUJ1Zl9yb2ZmKSkgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JYXRleGl0KEV4aXRWQkVCdWYpOwotCX0KLSAgICAqbGVuID0gVkVTQUJ1Zl9sZW47Ci0gICAgKnJzZWcgPSBWRVNBQnVmX3JzZWc7Ci0gICAgKnJvZmYgPSBWRVNBQnVmX3JvZmY7Ci0gICAgcmV0dXJuIFZFU0FCdWZfcHRyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNoZWNrIGlmIGEga2V5IGhhcyBiZWVuIHByZXNzZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2tiaGl0KHZvaWQpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgYSBrZXkgaXMgYXZhaWxhYmxlIHRvIGJlIHJlYWQuIFRoaXMgKi8KLSAgICAvKiAgICAgICBzaG91bGQgYmUgaW1wbGVtZW50ZWQsIGJ1dCBpcyBtb3N0bHkgdXNlZCBieSB0aGUgdGVzdCBwcm9ncmFtcyAqLwotICAgIC8qICAgICAgIHRoZXNlIGRheXMuICovCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV2FpdCBmb3IgYW5kIHJldHVybiB0aGUgbmV4dCBrZXlwcmVzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIHJldHVybnMgdGhlIEFTQ0lJIGNvZGUgb2YgdGhlIGtleSBwcmVzc2VkLiBUaGlzICovCi0gICAgLyogICAgICAgc2hvdWxkIGJlIGltcGxlbWVudGVkLCBidXQgaXMgbW9zdGx5IHVzZWQgYnkgdGhlIHRlc3QgcHJvZ3JhbXMgKi8KLSAgICAvKiAgICAgICB0aGVzZSBkYXlzLiAqLwotICAgIHJldHVybiAweEQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT3BlbiBhIGZ1bGxzY3JlZW4gY29uc29sZSBtb2RlIGZvciBvdXRwdXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX29wZW5Db25zb2xlKHZvaWQpCi17Ci0gICAgLyogVE9ETzogT3BlbnMgdXAgYSBmdWxsc2NyZWVuIGNvbnNvbGUgZm9yIGdyYXBoaWNzIG91dHB1dC4gSWYgeW91ciAqLwotICAgIC8qICAgICAgIGNvbnNvbGUgZG9lcyBub3QgaGF2ZSBncmFwaGljcy90ZXh0IG1vZGVzLCB0aGlzIGNhbiBiZSBsZWZ0ICovCi0gICAgLyogICAgICAgZW1wdHkuIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBkaXNhYmxlIGNvbnNvbGUgc3dpdGNoaW5nICovCi0gICAgLyogICAgICAgd2hlbiBpbiBncmFwaGljcyBtb2RlcyBpZiB5b3UgY2FuIHN3aXRjaCBhd2F5IGZyb20gZnVsbHNjcmVlbiAqLwotICAgIC8qICAgICAgIGNvbnNvbGVzIChpZiB5b3Ugd2FudCB0byBhbGxvdyBzd2l0Y2hpbmcsIHRoaXMgY2FuIGJlIGRvbmUgKi8KLSAgICAvKiAgICAgICBlbHNld2hlcmUgd2l0aCBhIGZ1bGwgc2F2ZS9yZXN0b3JlIHN0YXRlIG9mIHRoZSBncmFwaGljcyBtb2RlKS4gKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHNpemUgb2YgdGhlIHN0YXRlIGJ1ZmZlciB1c2VkIHRvIHNhdmUgdGhlIGNvbnNvbGUgc3RhdGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBjb25zb2xlIHN0YXRlIGJ1ZmZlciB1c2VkIHRvIHNhdmUgdGhlICovCi0gICAgLyogICAgICAgc3RhdGUgb2YgdGhlIGNvbnNvbGUgYmVmb3JlIGdvaW5nIGludG8gZ3JhcGhpY3MgbW9kZS4gVGhpcyBpcyAqLwotICAgIC8qICAgICAgIHVzZWQgdG8gcmVzdG9yZSB0aGUgY29uc29sZSBiYWNrIHRvIG5vcm1hbCB3aGVuIHdlIGFyZSBkb25lLiAqLwotICAgIHJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhdmUgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlIGludG8gdGhlIHN0YXRlIGJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NhdmVDb25zb2xlU3RhdGUoCi0gICAgdm9pZCAqc3RhdGVCdWYsCi0gICAgaW50IGNvbnNvbGVfaWQpCi17Ci0gICAgLyogVE9ETzogU2F2ZXMgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlIGludG8gdGhlIHN0YXRlIGJ1ZmZlci4gVGhpcyBpcyAqLwotICAgIC8qICAgICAgIHVzZWQgdG8gcmVzdG9yZSB0aGUgY29uc29sZSBiYWNrIHRvIG5vcm1hbCB3aGVuIHdlIGFyZSBkb25lLiAqLwotICAgIC8qICAgICAgIFdlIHdpbGwgYWx3YXlzIHJlc3RvcmUgODB4MjUgdGV4dCBtb2RlIGFmdGVyIGJlaW5nIGluIGdyYXBoaWNzICovCi0gICAgLyogICAgICAgbW9kZSwgc28gaWYgcmVzdG9yaW5nIHRleHQgbW9kZSBpcyBhbGwgeW91IG5lZWQgdG8gZG8gdGhpcyBjYW4gKi8KLSAgICAvKiAgICAgICBiZSBsZWZ0IGVtcHR5LiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlIGZyb20gdGhlIHN0YXRlIGJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoCi0gICAgY29uc3Qgdm9pZCAqc3RhdGVCdWYsCi0gICAgaW50IGNvbnNvbGVfaWQpCi17Ci0gICAgLyogVE9ETzogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIGNvbnNvbGUgZnJvbSB0aGUgc3RhdGUgYnVmZmVyLiBUaGlzIGlzICovCi0gICAgLyogICAgICAgdXNlZCB0byByZXN0b3JlIHRoZSBjb25zb2xlIGJhY2sgdG8gbm9ybWFsIHdoZW4gd2UgYXJlIGRvbmUuICovCi0gICAgLyogICAgICAgV2Ugd2lsbCBhbHdheXMgcmVzdG9yZSA4MHgyNSB0ZXh0IG1vZGUgYWZ0ZXIgYmVpbmcgaW4gZ3JhcGhpY3MgKi8KLSAgICAvKiAgICAgICBtb2RlLCBzbyBpZiByZXN0b3JpbmcgdGV4dCBtb2RlIGlzIGFsbCB5b3UgbmVlZCB0byBkbyB0aGlzIGNhbiAqLwotICAgIC8qICAgICAgIGJlIGxlZnQgZW1wdHkuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2xvc2UgdGhlIGNvbnNvbGUgYW5kIHJldHVybiB0byBub24tZnVsbHNjcmVlbiBjb25zb2xlIG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoCi0gICAgaW50IGNvbnNvbGVfaWQpCi17Ci0gICAgLyogVE9ETzogQ2xvc2UgdGhlIGNvbnNvbGUgd2hlbiB3ZSBhcmUgZG9uZSwgZ29pbmcgYmFjayB0byB0ZXh0IG1vZGUuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgT1MgY29uc29sZSBjdXJzb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKAotICAgIGludCB4LAotICAgIGludCB5KQotewotICAgIC8qIFRPRE86IFNldCB0aGUgT1MgY29uc29sZSBjdXJzb3IgbG9jYXRpb24gdG8gdGhlIG5ldyB2YWx1ZS4gVGhpcyBpcyAqLwotICAgIC8qICAgICAgIGdlbmVyYWxseSB1c2VkIGZvciBuZXcgT1MgcG9ydHMgKHVzZWQgbW9zdGx5IGZvciBET1MpLiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgd2lkdGggb2YgdGhlIE9TIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTV9zZXRPU1NjcmVlbldpZHRoKAotICAgIGludCB3aWR0aCwKLSAgICBpbnQgaGVpZ2h0KQotewotICAgIC8qIFRPRE86IFNldCB0aGUgT1MgY29uc29sZSBzY3JlZW4gd2lkdGguIFRoaXMgaXMgZ2VuZXJhbGx5IHVudXNlZCBmb3IgKi8KLSAgICAvKiAgICAgICBuZXcgT1MgcG9ydHMuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaGFuZGxlciAodXNlZCBmb3Igc29mdHdhcmUgc3RlcmVvIG1vZGVzKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcigKLSAgICBQTV9pbnRIYW5kbGVyIGloLAotICAgIGludCBmcmVxdWVuY3kpCi17Ci0gICAgLyogVE9ETzogSW5zdGFsbCBhIHJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgaGFuZGxlci4gTm9ybWFsbHkgdGhpcyAqLwotICAgIC8qICAgICAgIHdpbGwgbm90IGJlIHN1cHBvcnRlZCBmcm9tIG1vc3QgT1MnZXMgaW4gdXNlciBsYW5kLCBzbyBhbiAqLwotICAgIC8qICAgICAgIGFsdGVybmF0aXZlIG1lY2hhbmlzbSBpcyBuZWVkZWQgdG8gZW5hYmxlIHNvZnR3YXJlIHN0ZXJlby4gKi8KLSAgICAvKiAgICAgICBIZW5jZSBsZWF2ZSB0aGlzIHVuaW1wbGVtZW50ZWQgdW5sZXNzIHlvdSBoYXZlIGEgaGlnaCBwcmlvcml0eSAqLwotICAgIC8qICAgICAgIG1lY2hhbmlzbSB0byBjYWxsIHRoZSAzMi1iaXQgY2FsbGJhY2sgd2hlbiB0aGUgcmVhbCB0aW1lIGNsb2NrICovCi0gICAgLyogICAgICAgaW50ZXJydXB0IGZpcmVzLiAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHJlYWwgdGltZSBjbG9jayBmcmVxdWVuY3kgKGZvciBzdGVyZW8gbW9kZXMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeSgKLSAgICBpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFRPRE86IFNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBmcmVxdWVuY3kuIFVzZWQgZm9yIHN0ZXJlbyAqLwotICAgIC8qICAgICAgIExDIHNodXR0ZXIgZ2xhc3NlcyB3aGVuIGRvaW5nIHNvZnR3YXJlIHN0ZXJlby4gVXN1YWxseSBzZXRzICovCi0gICAgLyogICAgICAgdGhlIGZyZXF1ZW5jeSB0byBhcm91bmQgMjA0OCBIei4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSBvcmlnaW5hbCByZWFsIHRpbWUgY2xvY2sgaGFuZGxlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQotewotICAgIC8qIFRPRE86IFJlc3RvcmVzIHRoZSByZWFsIHRpbWUgY2xvY2sgaGFuZGxlci4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBwYXRoIG9yIHdvcmtpbmcgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKLSAgICBjaGFyICpwYXRoLAotICAgIGludCBtYXhMZW4pCi17Ci0gICAgcmV0dXJuIGdldGN3ZChwYXRoLG1heExlbik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBkcml2ZSBsZXR0ZXIgZm9yIHRoZSBib290IGRyaXZlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCi17Ci0gICAgLyogVE9ETzogUmV0dXJuIHRoZSBib290IGRyaXZlIGxldHRlciBmb3IgdGhlIE9TLiBOb3JtYWxseSB0aGlzIGlzICdjJyAqLwotICAgIC8qICAgICAgIGZvciBET1MgYmFzZWQgT1MnZXMgYW5kICcvJyBmb3IgVW5pY2VzLiAqLwotICAgIHJldHVybiAnLyc7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBWQkUvQUYgZHJpdmVyIGZpbGVzIChsZWdhY3kgYW5kIG5vdCB1c2VkKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNX2dldE51Y2xldXNDb25maWdQYXRoKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBDaGFuZ2UgdGhpcyB0byB0aGUgZGVmYXVsdCBwYXRoIHRvIE51Y2xldXMgZHJpdmVyIGZpbGVzLiBUaGUgKi8KLSAgICAvKiAgICAgICBmb2xsb3dpbmcgaXMgdGhlIGRlZmF1bHQgZm9yIFVuaWNlcy4gKi8KLSAgICBjaGFyICplbnYgPSBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpOwotICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL3Vzci9saWIvbnVjbGV1cyI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBOdWNsZXVzIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOwotICAgIHN0cmNweShwYXRoLFBNX2dldE51Y2xldXNQYXRoKCkpOwotICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKLSAgICBzdHJjYXQocGF0aCwiY29uZmlnIik7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBtYWNoaW5lIGlmIHBvc3NpYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKQotewotICAgIC8qIFRPRE86IFJldHVybiBhIHVuaXF1ZSBJRCBmb3IgdGhlIG1hY2hpbmUuIElmIGEgdW5pcXVlIElEIGlzIG5vdCAqLwotICAgIC8qICAgICAgIGF2YWlsYWJsZSwgcmV0dXJuIHRoZSBtYWNoaW5lIG5hbWUuICovCi0gICAgc3RhdGljIGNoYXIgYnVmWzEyOF07Ci0gICAgZ2V0aG9zdG5hbWUoYnVmLCAxMjgpOwotICAgIHJldHVybiBidWY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotR2V0IHRoZSBuYW1lIG9mIHRoZSBtYWNoaW5lIG9uIHRoZSBuZXR3b3JrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKQotewotICAgIC8qIFRPRE86IFJldHVybiB0aGUgbmV0d29yayBtYWNoaW5lIG5hbWUgZm9yIHRoZSBtYWNoaW5lLiAqLwotICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMjhdOwotICAgIGdldGhvc3RuYW1lKGJ1ZiwgMTI4KTsKLSAgICByZXR1cm4gYnVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlYWwgbW9kZSBCSU9TIGRhdGEgYXJlYS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSByZWFsIG1vZGUgQklPUyBkYXRhIGFyZWEuIElmIHlvdSAqLwotICAgIC8qICAgICAgIGRvIG5vdCBzdXBwb3J0IEJJT1MgYWNjZXNzLCB5b3UgY2FuIHNpbXBseSByZXR1cm4gTlVMTCBoZXJlLiAqLwotICAgIGlmICghemVyb1B0cikKLQl6ZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRix0cnVlKTsKLSAgICByZXR1cm4gKHZvaWQqKSh6ZXJvUHRyICsgMHg0MDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiBhIHBvaW50ZXIgdG8gMHhBMDAwMCBwaHlzaWNhbCBWR0EgZ3JhcGhpY3MgZnJhbWVidWZmZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQotewotICAgIHN0YXRpYyB2b2lkICpiYW5rUHRyOwotICAgIGlmICghYmFua1B0cikKLQliYW5rUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsMHhGRkZGLHRydWUpOwotICAgIHJldHVybiBiYW5rUHRyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1hcCBhIHBoeXNpY2FsIGFkZHJlc3MgdG8gYSBsaW5lYXIgYWRkcmVzcyBpbiB0aGUgY2FsbGVycyBwcm9jZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBsaW1pdCwKLSAgICBpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIG1hcHMgYSBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcyB0byBhIGxpbmVhciAqLwotICAgIC8qICAgICAgIGFkZHJlc3MgaW4gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIGNhbGxpbmcgcHJvY2Vzcy4gKi8KLQotICAgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gKm11c3QqIGJlIGFibGUgdG8gaGFuZGxlIGFueSBwaHN5aWNhbCBiYXNlICovCi0gICAgLyogICAgICAgYWRkcmVzcywgYW5kIGhlbmNlIHlvdSB3aWxsIGhhdmUgdG8gaGFuZGxlIHJvdW5kaW5nIG9mICovCi0gICAgLyogICAgICAgdGhlIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyB0byBhIHBhZ2UgYm91bmRhcnkgKGllOiA0S2Igb24gKi8KLSAgICAvKiAgICAgICB4ODYgQ1BVJ3MpIHRvIGJlIGFibGUgdG8gcHJvcGVybHkgbWFwIGluIHRoZSBtZW1vcnkgKi8KLSAgICAvKiAgICAgICByZWdpb24uICovCi0KLSAgICAvKiBOT1RFOiBJZiBwb3NzaWJsZSB0aGUgaXNDYWNoZWQgYml0IHNob3VsZCBiZSB1c2VkIHRvIGVuc3VyZSB0aGF0ICovCi0gICAgLyogICAgICAgdGhlIFBDRCAoUGFnZSBDYWNoZSBEaXNhYmxlKSBhbmQgUFdUIChQYWdlIFdyaXRlIFRocm91Z2gpICovCi0gICAgLyogICAgICAgYml0cyBhcmUgc2V0IHRvIGRpc2FibGUgY2FjaGluZyBmb3IgYSBtZW1vcnkgbWFwcGluZyB1c2VkICovCi0gICAgLyogICAgICAgZm9yIE1NSU8gcmVnaXN0ZXIgYWNjZXNzLiBXZSBhbHNvIGRpc2FibGUgY2FjaGluZyB1c2luZyAqLwotICAgIC8qICAgICAgIHRoZSBNVFJSIHJlZ2lzdGVycyBmb3IgUGVudGl1bSBQcm8gYW5kIGxhdGVyIGNoaXBzZXRzIHNvIGlmICovCi0gICAgLyogICAgICAgTVRSUiBzdXBwb3J0IGlzIGVuYWJsZWQgZm9yIHlvdXIgT1MgdGhlbiB5b3UgY2FuIHNhZmVseSBpZ25vcmUgKi8KLSAgICAvKiAgICAgICB0aGUgaXNDYWNoZWQgZmxhZyBhbmQgYWx3YXlzIGVuYWJsZSBjYWNoaW5nIGluIHRoZSBwYWdlICovCi0gICAgLyogICAgICAgdGFibGVzLiAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBwaHlzaWNhbCBhZGRyZXNzIG1hcHBpbmcgYWxsb2NhdGVkIGJ5IFBNX21hcFBoeXNpY2FsQWRkci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIoCi0gICAgdm9pZCAqcHRyLAotICAgIHVsb25nIGxpbWl0KQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIGEgcGh5c2ljYWwgbWVtb3J5IG1hcHBpbmcgcHJldmlvdXNseSAqLwotICAgIC8qICAgICAgIGFsbG9jYXRlZCB3aXRoIFBNX21hcFBoeXNpY2FsQWRkcigpIGlmIGF0IGFsbCBwb3NzaWJsZS4gSWYgKi8KLSAgICAvKiAgICAgICB5b3UgY2FuJ3QgZnJlZSBwaHlzaWNhbCBtZW1vcnkgbWFwcGluZ3MsIHNpbXBseSBkbyBub3RoaW5nLiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgbWVtb3J5IGFkZHJlc3MgaW4gY3VycmVudCBwcm9jZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcih2b2lkICpwKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgKi8KLSAgICAvKiAgICAgICBhZGRyZXNzLiAqLwotICAgIHJldHVybiAweEZGRkZGRkZGVUw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2xlZXAodWxvbmcgbWlsbGlzZWNvbmRzKQotewotICAgIC8qIFRPRE86IFB1dCB0aGUgcHJvY2VzcyB0byBzbGVlcCBmb3IgbWlsbGlzZWNvbmRzICovCi19Ci0KLWludCBQTUFQSSBQTV9nZXRDT01Qb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzRjg7Ci0JY2FzZSAxOiByZXR1cm4gMHgyRjg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0TFBUUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0JDOwotCWNhc2UgMTogcmV0dXJuIDB4Mzc4OwotCWNhc2UgMjogcmV0dXJuIDB4Mjc4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mICh1bm5hbWVkKSBzaGFyZWQgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYWxsb2NTaGFyZWQoCi0gICAgbG9uZyBzaXplKQotewotICAgIC8qIFRPRE86IFRoaXMgaXMgdXNlZCB0byBhbGxvY2F0ZSBtZW1vcnkgdGhhdCBpcyBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzICovCi0gICAgLyogICAgICAgdGhhdCBhbGwgYWNjZXNzIHRoZSBjb21tb24gTnVjbGV1cyBkcml2ZXJzIHZpYSBhIGNvbW1vbiBkaXNwbGF5ICovCi0gICAgLyogICAgICAgZHJpdmVyIERMTC4gSWYgeW91ciBPUyBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBtZW1vcnkgKG9yIGlmICovCi0gICAgLyogICAgICAgdGhlIGRpc3BsYXkgZHJpdmVyIGRvZXMgbm90IG5lZWQgdG8gYWxsb2NhdGUgc2hhcmVkIG1lbW9yeSAqLwotICAgIC8qICAgICAgIGZvciBlYWNoIHByb2Nlc3MgYWRkcmVzcyBzcGFjZSksIHRoaXMgc2hvdWxkIGp1c3QgY2FsbCBQTV9tYWxsb2MuICovCi0gICAgcmV0dXJuIFBNX21hbGxvYyhzaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQoCi0gICAgdm9pZCAqcHRyKQotewotICAgIC8qIFRPRE86IEZyZWUgdGhlIHNoYXJlZCBtZW1vcnkgYmxvY2suIFRoaXMgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIGNvbnRleHQgKi8KLSAgICAvKiAgICAgICBvZiB0aGUgb3JpZ2luYWwgY2FsbGluZyBwcm9jZXNzIHRoYXQgYWxsb2NhdGVkIHRoZSBzaGFyZWQgKi8KLSAgICAvKiAgICAgICBtZW1vcnkgd2l0aCBQTV9tYWxsb2NTaGFyZWQuIFNpbXBseSBjYWxsIFBNX2ZyZWUgaWYgeW91IGRvIG5vdCAqLwotICAgIC8qICAgICAgIG5lZWQgdGhpcy4gKi8KLSAgICBQTV9mcmVlKHB0cik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEgbGluZWFyIG1lbW9yeSBhZGRyZXNzIHRvIHRoZSBjYWxsaW5nIHByb2Nlc3MgYWRkcmVzcyBzcGFjZS4gVGhlCi1hZGRyZXNzIHdpbGwgaGF2ZSBiZWVuIGFsbG9jYXRlZCBpbiBhbm90aGVyIHByb2Nlc3MgdXNpbmcgdGhlCi1QTV9tYXBQaHlzaWNhbEFkZHIgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2VzcygKLSAgICB2b2lkICpiYXNlLAotICAgIHVsb25nIGxpbWl0KQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBtYXAgYSBwaHlzaWNhbCBtZW1vcnkgbWFwcGluZyAqLwotICAgIC8qICAgICAgIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggUE1fbWFwUGh5c2ljYWxBZGRyIGludG8gdGhlICovCi0gICAgLyogICAgICAgYWRkcmVzcyBzcGFjZSBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiBJZiB0aGUgbWVtb3J5IG1hcHBpbmcgKi8KLSAgICAvKiAgICAgICBhbGxvY2F0ZWQgYnkgUE1fbWFwUGh5c2ljYWxBZGRyIGlzIGdsb2JhbCB0byBhbGwgcHJvY2Vzc2VzLCAqLwotICAgIC8qICAgICAgIHNpbXBseSByZXR1cm4gdGhlIHBvaW50ZXIuICovCi0KLSAgICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIG11c3QgYWxzbyBoYW5kbGUgcm91bmRpbmcgdG8gcGFnZSBib3VuZGFyaWVzLCAqLwotICAgIC8qICAgICAgIHNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBtYXAgaW4gc2hhcmVkIG1lbW9yeSBidWZmZXJzICovCi0gICAgLyogICAgICAgYWxsb2NhdGVkIHdpdGggUE1fbWFwUGh5c2ljYWxBZGRyKCkuIEhlbmNlIGlmIHlvdSBhbGlnbmVkICovCi0gICAgLyogICAgICAgdGhlIHBoeXNpY2FsIGFkZHJlc3MgYWJvdmUsIHRoZW4geW91IGFsc28gbmVlZCB0byBkbyBpdCBoZXJlLiAqLwotICAgIHJldHVybiBiYXNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1hcCBhIHJlYWwgbW9kZSBwb2ludGVyIHRvIGEgcHJvdGVjdGVkIG1vZGUgcG9pbnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIoCi0gICAgdWludCByX3NlZywKLSAgICB1aW50IHJfb2ZmKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gbWFwcyBhIHJlYWwgbW9kZSBtZW1vcnkgcG9pbnRlciBpbnRvIHRoZSAqLwotICAgIC8qICAgICAgIGNhbGxpbmcgcHJvY2Vzc2VzIGFkZHJlc3Mgc3BhY2UgYXMgYSAzMi1iaXQgbmVhciBwb2ludGVyLiBJZiAqLwotICAgIC8qICAgICAgIHlvdSBkbyBub3Qgc3VwcG9ydCBCSU9TIGFjY2Vzcywgc2ltcGx5IHJldHVybiBOVUxMIGhlcmUuICovCi0gICAgaWYgKCF6ZXJvUHRyKQotCXplcm9QdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMCwweEZGRkZGKTsKLSAgICByZXR1cm4gKHZvaWQqKSh6ZXJvUHRyICsgTUtfUEhZUyhyX3NlZyxyX29mZikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2YgcmVhbCBtb2RlIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcoCi0gICAgdWludCBzaXplLAotICAgIHVpbnQgKnJfc2VnLAotICAgIHVpbnQgKnJfb2ZmKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgYmxvY2sgb2YgcmVhbCBtb2RlIG1lbW9yeSBmb3IgdGhlICovCi0gICAgLyogICAgICAgY2FsbGluZyBwcm9jZXNzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCByZWFsIG1vZGUgQklPUyAqLwotICAgIC8qICAgICAgIGZ1bmN0aW9ucy4gSWYgeW91IGRvIG5vdCBzdXBwb3J0IEJJT1MgYWNjZXNzLCBzaW1wbHkgcmV0dXJuICovCi0gICAgLyogICAgICAgTlVMTCBoZXJlLiAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcoCi0gICAgdm9pZCAqbWVtKQotewotICAgIC8qIFRPRE86IEZyZWVzIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgcmVhbCBtb2RlIG1lbW9yeSBibG9jay4gSWYgeW91ICovCi0gICAgLyogICAgICAgZG8gbm90IHN1cHBvcnQgQklPUyBhY2Nlc3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGVtcHR5LiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdCAocGFyYW1ldGVycyBpbiBEUE1JIGNvbXBhdGlibGUgc3RydWN0dXJlKQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgRFBNSV9pbnQ4NigKLSAgICBpbnQgaW50bm8sCi0gICAgRFBNSV9yZWdzICpyZWdzKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIHJlYWwgbW9kZSBCSU9TIHVzaW5nIHRoZSBwYXNzZWQgaW4gKi8KLSAgICAvKiAgICAgICByZWdpc3RlciBzdHJ1Y3R1cmUuIElmIHlvdSBkbyBub3Qgc3VwcG9ydCByZWFsIG1vZGUgQklPUyAqLwotICAgIC8qICAgICAgIGFjY2VzcywgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgZW1wdHkuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSByZWFsIG1vZGUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQ4NigKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSByZWFsIG1vZGUgQklPUyB1c2luZyB0aGUgcGFzc2VkIGluICovCi0gICAgLyogICAgICAgcmVnaXN0ZXIgc3RydWN0dXJlLiBJZiB5b3UgZG8gbm90IHN1cHBvcnQgcmVhbCBtb2RlIEJJT1MgKi8KLSAgICAvKiAgICAgICBhY2Nlc3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiAwLiAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODZ4KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIHJlYWwgbW9kZSBCSU9TIHVzaW5nIHRoZSBwYXNzZWQgaW4gKi8KLSAgICAvKiAgICAgICByZWdpc3RlciBzdHJ1Y3R1cmUuIElmIHlvdSBkbyBub3Qgc3VwcG9ydCByZWFsIG1vZGUgQklPUyAqLwotICAgIC8qICAgICAgIGFjY2VzcywgdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIDAuICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCBhIHJlYWwgbW9kZSBmYXIgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9jYWxsUmVhbE1vZGUoCi0gICAgdWludCBzZWcsCi0gICAgdWludCBvZmYsCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGEgcmVhbCBtb2RlIGZhciBmdW5jdGlvbiB3aXRoIGEgZmFyIGNhbGwuICovCi0gICAgLyogICAgICAgSWYgeW91IGRvIG5vdCBzdXBwb3J0IEJJT1MgYWNjZXNzLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSAqLwotICAgIC8qICAgICAgIGVtcHR5LiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkoCi0gICAgdWxvbmcgKnBoeXNpY2FsLAotICAgIHVsb25nICp0b3RhbCkKLXsKLSAgICAvKiBUT0RPOiBSZXBvcnQgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgbWVtb3J5LCBib3RoIHRoZSBhbW91bnQgb2YgKi8KLSAgICAvKiAgICAgICBwaHlzaWNhbCBtZW1vcnkgbGVmdCBhbmQgdGhlIGFtb3VudCBvZiB2aXJ0dWFsIG1lbW9yeSBsZWZ0LiAqLwotICAgIC8qICAgICAgIElmIHRoZSBPUyBkb2VzIG5vdCBwcm92aWRlIHRoZXNlIHNlcnZpY2VzLCByZXBvcnQgMCdzLiAqLwotICAgICpwaHlzaWNhbCA9ICp0b3RhbCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgYSBibG9jayBvZiBsb2NrZWQsIHBoeXNpY2FsIG1lbW9yeSBmb3IgRE1BIG9wZXJhdGlvbnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jTG9ja2VkTWVtKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1bG9uZyAqcGh5c0FkZHIsCi0gICAgaWJvb2wgY29udGlndW91cywKLSAgICBpYm9vbCBiZWxvdzE2TSkKLXsKLSAgICAvKiBUT0RPOiBBbGxvY2F0ZSBhIGJsb2NrIG9mIGxvY2tlZCwgcGh5c2ljYWwgbWVtb3J5IG9mIHRoZSBzcGVjaWZpZWQgKi8KLSAgICAvKiAgICAgICBzaXplLiBUaGlzIGlzIHVzZWQgZm9yIGJ1cyBtYXN0ZXIgb3BlcmF0aW9ucy4gSWYgdGhpcyBpcyBub3QgKi8KLSAgICAvKiAgICAgICBzdXBwb3J0ZWQgYnkgdGhlIE9TLCByZXR1cm4gTlVMTCBhbmQgYnVzIG1hc3RlcmluZyB3aWxsIG5vdCAqLwotICAgIC8qICAgICAgIGJlIHVzZWQuICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIGxvY2tlZCBwaHlzaWNhbCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKAotICAgIHZvaWQgKnAsCi0gICAgdWludCBzaXplLAotICAgIGlib29sIGNvbnRpZ3VvdXMpCi17Ci0gICAgLyogVE9ETzogRnJlZSBhIG1lbW9yeSBibG9jayBhbGxvY2F0ZWQgd2l0aCBQTV9hbGxvY0xvY2tlZE1lbS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBWQkUvQ29yZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gY2hhbmdlIGRpc3BsYXkgYmFua3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRCYW5rQSgKLSAgICBpbnQgYmFuaykKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICAvKiBUT0RPOiBUaGlzIGRvZXMgYSBiYW5rIHN3aXRjaCBmdW5jdGlvbiBieSBjYWxsaW5nIHRoZSByZWFsIG1vZGUgKi8KLSAgICAvKiAgICAgICBWRVNBIEJJT1MuIElmIHlvdSBkbyBub3Qgc3VwcG9ydCBCSU9TIGFjY2VzcywgdGhpcyBmdW5jdGlvbiBzaG91bGQgKi8KLSAgICAvKiAgICAgICBiZSBlbXB0eS4gKi8KLSAgICByZWdzLnguYXggPSAweDRGMDU7Ci0gICAgcmVncy54LmJ4ID0gMHgwMDAwOwotICAgIHJlZ3MueC5keCA9IGJhbms7Ci0gICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0FCKAotICAgIGludCBiYW5rKQotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIC8qIFRPRE86IFRoaXMgZG9lcyBhIGJhbmsgc3dpdGNoIGZ1bmN0aW9uIGJ5IGNhbGxpbmcgdGhlIHJlYWwgbW9kZSAqLwotICAgIC8qICAgICAgIFZFU0EgQklPUy4gSWYgeW91IGRvIG5vdCBzdXBwb3J0IEJJT1MgYWNjZXNzLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCAqLwotICAgIC8qICAgICAgIGJlIGVtcHR5LiAqLwotICAgIHJlZ3MueC5heCA9IDB4NEYwNTsKLSAgICByZWdzLnguYnggPSAweDAwMDA7Ci0gICAgcmVncy54LmR4ID0gYmFuazsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICByZWdzLnguYXggPSAweDRGMDU7Ci0gICAgcmVncy54LmJ4ID0gMHgwMDAxOwotICAgIHJlZ3MueC5keCA9IGJhbms7Ci0gICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IHN0YXJ0IGFkZHJlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRDUlRTdGFydCgKLSAgICBpbnQgeCwKLSAgICBpbnQgeSwKLSAgICBpbnQgd2FpdFZSVCkKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICAvKiBUT0RPOiBUaGlzIGNoYW5nZXMgdGhlIGRpc3BsYXkgc3RhcnQgYWRkcmVzcyBieSBjYWxsaW5nIHRoZSByZWFsIG1vZGUgKi8KLSAgICAvKiAgICAgICBWRVNBIEJJT1MuIElmIHlvdSBkbyBub3Qgc3VwcG9ydCBCSU9TIGFjY2VzcywgdGhpcyBmdW5jdGlvbiAqLwotICAgIC8qICAgICAgIHNob3VsZCBiZSBlbXB0eS4gKi8KLSAgICByZWdzLnguYXggPSAweDRGMDc7Ci0gICAgcmVncy54LmJ4ID0gd2FpdFZSVDsKLSAgICByZWdzLnguY3ggPSB4OwotICAgIHJlZ3MueC5keCA9IHk7Ci0gICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRW5hYmxlIHdyaXRlIGNvbWJpbmluZyBmb3IgdGhlIG1lbW9yeSByZWdpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZW5hYmxlV3JpdGVDb21iaW5lKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgbGVuZ3RoLAotICAgIHVpbnQgdHlwZSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBlbmFibGUgUGVudGl1bSBQcm8gYW5kIFBlbnRpdW0gSUkgTVRSUiAqLwotICAgIC8qICAgICAgIHdyaXRlIGNvbWJpbmluZyBmb3IgdGhlIHBhc3NlZCBpbiBwaHlzaWNhbCBtZW1vcnkgYmFzZSBhZGRyZXNzICovCi0gICAgLyogICAgICAgYW5kIGxlbmd0aC4gTm9ybWFsbHkgdGhpcyBpcyBkb25lIHZpYSBjYWxscyB0byBhbiBPUyBzcGVjaWZpYyAqLwotICAgIC8qICAgICAgIGRldmljZSBkcml2ZXIgYXMgdGhpcyBjYW4gb25seSBiZSBkb25lIGF0IHJpbmcgMC4gKi8KLSAgICAvKiAqLwotICAgIC8qIE5PVEU6IFRoaXMgaXMgYSAqdmVyeSogaW1wb3J0YW50IGZ1bmN0aW9uIHRvIGltcGxlbWVudCEgSWYgeW91IGRvICovCi0gICAgLyogICAgICAgbm90IGltcGxlbWVudCwgZ3JhcGhpY3MgcGVyZm9ybWFuY2Ugb24gdGhlIGxhdGVzdCBJbnRlbCBjaGlwcyAqLwotICAgIC8qICAgICAgIHdpbGwgYmUgc2V2ZXJseSBpbXBhaXJlZC4gRm9yIHNhbXBsZSBjb2RlIHRoYXQgY2FuIGJlIHVzZWQgKi8KLSAgICAvKiAgICAgICBkaXJlY3RseSBpbiBhIHJpbmcgMCBkZXZpY2UgZHJpdmVyLCBzZWUgdGhlIE1TRE9TIGltcGxlbWVudGF0aW9uICovCi0gICAgLyogICAgICAgd2hpY2ggaW5jbHVkZXMgYXNzZW1ibGVyIGNvZGUgdG8gZG8gdGhpcyBkaXJlY3RseSAoaWYgdGhlICovCi0gICAgLyogICAgICAgcHJvZ3JhbSBpcyBydW5uaW5nIGF0IHJpbmcgMCkuICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUV4ZWN1dGUgdGhlIFBPU1Qgb24gdGhlIHNlY29uZGFyeSBCSU9TIGZvciBhIGNvbnRyb2xsZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZG9CSU9TUE9TVCgKLSAgICB1c2hvcnQgYXhWYWwsCi0gICAgdWxvbmcgQklPU1BoeXNBZGRyLAotICAgIHZvaWQgKm1hcHBlZEJJT1MpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJ1biB0aGUgQklPUyBQT1NUIGNvZGUgb24gYSBzZWNvbmRhcnkgKi8KLSAgICAvKiAgICAgICBjb250cm9sbGVyIHRvIGluaXRpYWxpc2UgaXQgZm9yIHVzZS4gVGhpcyBpcyBub3QgbmVjZXNzYXJ5ICovCi0gICAgLyogICAgICAgZm9yIG11bHRpLWNvbnRyb2xsZXIgb3BlcmF0aW9uLCBidXQgaXQgd2lsbCBtYWtlIGl0IGEgbG90ICovCi0gICAgLyogICAgICAgbW9yZSBjb252ZW5pY2VudCBmb3IgZW5kIHVzZXJzIChvdGhlcndpc2UgdGhleSBoYXZlIHRvIGJvb3QgKi8KLSAgICAvKiAgICAgICB0aGUgc3lzdGVtIG9uY2Ugd2l0aCB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXIgYXMgcHJpbWFyeSwgYW5kICovCi0gICAgLyogICAgICAgdGhlbiBib290IHdpdGggYm90aCBjb250cm9sbGVycyBpbnN0YWxsZWQpLiAqLwotICAgIC8qICovCi0gICAgLyogICAgICAgRXZlbiBpZiB5b3UgZG9uJ3Qgc3VwcG9ydCBmdWxsIEJJT1MgYWNjZXNzLCBpdCB3b3VsZCBiZSAqLwotICAgIC8qICAgICAgIGFkdmlzZWFibGUgdG8gYmUgYWJsZSB0byBQT1NUIHRoZSBzZWNvbmRhcnkgY29udHJvbGxlcnMgaW4gdGhlICovCi0gICAgLyogICAgICAgc3lzdGVtIHVzaW5nIHRoaXMgZnVuY3Rpb24gYXMgYSBtaW5pbXVtIHJlcXVpcmVtZW50LiBTb21lICovCi0gICAgLyogICAgICAgZ3JhcGhpY3MgaGFyZHdhcmUgaGFzIHJlZ2lzdGVycyB0aGF0IGNvbnRhaW4gdmFsdWVzIHRoYXQgb25seSAqLwotICAgIC8qICAgICAgIHRoZSBCSU9TIGtub3dzIGFib3V0LCB3aGljaCBtYWtlcyBicmluZyB1cCBhIGNhcmQgZnJvbSBjb2xkICovCi0gICAgLyogICAgICAgcmVzZXQgZGlmZmljdWx0IGlmIHRoZSBCSU9TIGhhcyBub3QgUE9TVCdlZCBpdC4gKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTG9hZCBhbiBPUyBzcGVjaWZpYyBzaGFyZWQgbGlicmFyeSBvciBETEwuIElmIHRoZSBPUyBkb2VzIG5vdCBzdXBwb3J0Ci1zaGFyZWQgbGlicmFyaWVzLCBzaW1wbHkgcmV0dXJuIE5VTEwuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1fTU9EVUxFIFBNQVBJIFBNX2xvYWRMaWJyYXJ5KAotICAgIGNvbnN0IGNoYXIgKnN6RExMTmFtZSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBsb2FkIGEgbmF0aXZlIHNoYXJlZCBsaWJyYXJ5IGZyb20gZGlzayAqLwotICAgIC8qICAgICAgIGdpdmVuIHRoZSBwYXRoIHRvIHRoZSBsaWJyYXJ5LiAqLwotICAgICh2b2lkKXN6RExMTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1HZXQgdGhlIGFkZHJlc3Mgb2YgYSBuYW1lZCBwcm9jZWR1cmUgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSwKLSAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgYWRkcmVzcyBvZiBhIG5hbWVkIHByb2NlZHVyZSAqLwotICAgIC8qICAgICAgIGZyb20gYSBuYXRpdmUgc2hhcmVkIGxpYnJhcnkuICovCi0gICAgKHZvaWQpaE1vZHVsZTsKLSAgICAodm9pZClzelByb2NOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVVubG9hZCBhIHNoYXJlZCBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZUxpYnJhcnkoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBmcmVlIGEgcHJldmlvdXNseSBsb2FkZWQgbmF0aXZlIHNoYXJlZCBsaWJyYXJ5LiAqLwotICAgICh2b2lkKWhNb2R1bGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRW5hYmxlIHJlcXVlc3RlZCBJL08gcHJpdmxlZGdlIGxldmVsICh1c3VhbGx5IG9ubHkgdG8gc2V0IHRvIGEgdmFsdWUgb2YKLTMsIGFuZCB0aGVuIHJlc3RvcmUgaXQgYmFjayBhZ2FpbikuIElmIHRoZSBPUyBpcyBwcm90ZWN0ZWQgdGhpcyBmdW5jdGlvbgotbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBvcmRlciB0byBlbmFibGUgSS9PIHBvcnQgYWNjZXNzIGZvciByaW5nIDMKLWFwcGxpY2F0aW9ucy4gVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIElPUEwgbGV2ZWwgYWN0aXZlIGJlZm9yZQotdGhlIHN3aXRjaCBvY2N1cnJlZCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgcmVzdG9yZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX3NldElPUEwoCi0gICAgaW50IGxldmVsKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGVuYWJsZSBJT1BMIGZvciB0aGUgdGFzayAoaWYgSU9QTCBpcyAqLwotICAgIC8qICAgICAgIG5vdCBhbHdheXMgZW5hYmxlZCBmb3IgdGhlIGFwcCB0aHJvdWdoIHNvbWUgb3RoZXIgbWVhbnMpLiAqLwotICAgIHJldHVybiBsZXZlbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBmaXJzdCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKlBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIHN0YXJ0IGEgZGlyZWN0b3J5IGVudW1lcmF0aW9uIHNlYXJjaCAqLwotICAgIC8qICAgICAgIGdpdmVuIHRoZSBmaWxlbmFtZSAod2l0aCB3aWxkY2FyZHMpLiBUaGUgZGF0YSBzaG91bGQgYmUgKi8KLSAgICAvKiAgICAgICBjb252ZXJ0ZWQgYW5kIHJldHVybmVkIGluIHRoZSBmaW5kRGF0YSBzdGFuZGFyZCBmb3JtLiAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWZpbmREYXRhOwotICAgIHJldHVybiBQTV9GSUxFX0lOVkFMSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgbmV4dCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2ZpbmROZXh0RmlsZSgKLSAgICB2b2lkICpoYW5kbGUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIG5leHQgZmlsZSBpbiBkaXJlY3RvcnkgZW51bWVyYXRpb24gKi8KLSAgICAvKiAgICAgICBzZWFyY2ggZ2l2ZW4gdGhlIHNlYXJjaCBjcml0ZXJpYSBkZWZpbmVkIGluIHRoZSBjYWxsIHRvICovCi0gICAgLyogICAgICAgUE1fZmluZEZpcnN0RmlsZS4gVGhlIGRhdGEgc2hvdWxkIGJlIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQgKi8KLSAgICAvKiAgICAgICBpbiB0aGUgZmluZERhdGEgc3RhbmRhcmQgZm9ybS4gKi8KLSAgICAodm9pZCloYW5kbGU7Ci0gICAgKHZvaWQpZmluZERhdGE7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZpbmRDbG9zZSgKLSAgICB2b2lkICpoYW5kbGUpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgY2xvc2UgdGhlIGZpbmQgcHJvY2Vzcy4gVGhpcyBtYXkgZG8gKi8KLSAgICAvKiAgICAgICBub3RoaW5nIGZvciBzb21lIE9TJ2VzLiAqLwotICAgICh2b2lkKWhhbmRsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZSBpcyBhIHZhbGlkIGRyaXZlIG9yIG5vdC4gVW5kZXIgVW5peCB0aGlzCi1mdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZXhjZXB0IGEgdmFsdWUgb2YgMyAoY29uc2lkZXJlZAotdGhlIHJvb3QgZHJpdmUsIGFuZCBlcXVpdmFsZW50IHRvIEM6IGZvciBub24tVW5peCBzeXN0ZW1zKS4gVGhlIGRyaXZlCi1udW1iZXJpbmcgaXM6Ci0KLSAgICAxICAgLSBEcml2ZSBBOgotICAgIDIgICAtIERyaXZlIEI6Ci0gICAgMyAgIC0gRHJpdmUgQzoKLSAgICBldGMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCi0gICAgY2hhciBkcml2ZSkKLXsKLSAgICBpZiAoZHJpdmUgPT0gMykKLQlyZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWZlZCBkcml2ZS4KLVVuZGVyIFVuaXggdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcmVnYXJkbGVzcwotb2Ygd2hhdCB0aGUgdmFsdWUgb2YgJ2RyaXZlJyBpcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2dldGRjd2QoCi0gICAgaW50IGRyaXZlLAotICAgIGNoYXIgKmRpciwKLSAgICBpbnQgbGVuKQotewotICAgICh2b2lkKWRyaXZlOwotICAgIGdldGN3ZChkaXIsbGVuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgdWludCBhdHRyaWIpCi17Ci0gICAgLyogVE9ETzogU2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgZmlsZSAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWF0dHJpYjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fbWtkaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgcmV0dXJuIG1rZGlyKGZpbGVuYW1lKSA9PSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ybWRpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICByZXR1cm4gcm1kaXIoZmlsZW5hbWUpID09IDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL3ZmbGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OWVmMmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi92ZmxhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgRHVtbXkgbW9kdWxlOyBubyB2aXJ0dWFsIGZyYW1lYnVmZmVyIGZvciB0aGlzIE9TCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLQotaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkICogUE1BUEkgVkZfaW5pdCh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCi17Ci0gICAgYmFzZUFkZHIgPSBiYXNlQWRkcjsKLSAgICBiYW5rU2l6ZSA9IGJhbmtTaXplOwotICAgIGNvZGVMZW4gPSBjb2RlTGVuOwotICAgIGJhbmtGdW5jID0gYmFua0Z1bmM7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgVkZfZXhpdCh2b2lkKQotewotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi96dGltZXIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvenRpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMGUyOTIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi96dGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAqKiogVE9ETzogQUREIFlPVVIgT1MgRU5WSVJPTk1FTlQgTkFNRSBIRVJFICoqKgotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfX1pUaW1lckluaXQodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBEbyBhbnkgc3BlY2lmaWMgaW50ZXJuYWwgaW5pdGlhbGlzYXRpb24gaW4gaGVyZSAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVN0YXJ0IHRoZSBaZW4gVGltZXIgY291bnRpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX19MWlRpbWVyT24oCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgLyogVE9ETzogU3RhcnQgdGhlIFplbiBUaW1lciBjb3VudGluZy4gVGhpcyBzaG91bGQgYmUgYSBtYWNybyBpZiAqLwotICAgIC8qICAgICAgIHBvc3NpYmxlLiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGxhcCB0aW1lIHNpbmNlIHRoZSB0aW1lciB3YXMgc3RhcnRlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19MWlRpbWVyTGFwKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIC8qIFRPRE86IENvbXB1dGUgdGhlIGxhcCB0aW1lIGJldHdlZW4gdGhlIGN1cnJlbnQgdGltZSBhbmQgd2hlbiB0aGUgKi8KLSAgICAvKiAgICAgICB0aW1lciB3YXMgc3RhcnRlZC4gKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdG9wIHRoZSBaZW4gVGltZXIgY291bnRpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX19MWlRpbWVyT2ZmKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIC8qIFRPRE86IFN0b3AgdGhlIHRpbWVyIGNvdW50aW5nLiBTaG91bGQgYmUgYSBtYWNybyBpZiBwb3NzaWJsZS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgaW4gbWljcm9zZWNvbmRzIGJldHdlZW4gc3RhcnQgYW5kIGVuZCB0aW1pbmdzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJDb3VudCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICAvKiBUT0RPOiBDb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgYW5kIHJldHVybiBpdC4gQWx3YXlzIG1pY3Jvc2Vjb25kcy4gKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGFzIG1pY3Jvc2Vjb25kcyBwZXIgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFVMWlRJTUVSX1JFU09MVVRJT04gICAgIDEKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBMb25nIFBlcmlvZCB0aW1lciBmcm9tIHRoZSBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX1VMWlJlYWRUaW1lKHZvaWQpCi17Ci0gICAgLyogVE9ETzogUmVhZCB0aGUgbG9uZyBwZXJpb2QgdGltZXIgZnJvbSB0aGUgT1MuIFRoZSByZXNvbHV0aW9uIG9mIHRoaXMgKi8KLSAgICAvKiAgICAgICB0aW1lciBzaG91bGQgYmUgYXJvdW5kIDEvMjAgb2YgYSBzZWNvbmQgZm9yIHRpbWluZyBsb25nICovCi0gICAgLyogICAgICAgcGVyaW9kcyBpZiBwb3NzaWJsZS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCi13aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KLWFjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKLXBhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoteyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2FsdGJyay5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYWx0YnJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhOTAyNjIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYWx0YnJrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbCBhIEMgYmFzZWQKLSogICAgICAgICAgICAgICBjb250cm9sIEMvYnJlYWsgaW50ZXJydXB0IGhhbmRsZXIuIE5vdGUgdGhhdCB0aGlzCi0qICAgICAgICAgICAgICAgYWx0ZXJuYXRlIHZlcnNpb24gZG9lcyBub3Qgd29yayB3aXRoIGFsbCBleHRlbmRlcnMuCi0qCi0qICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9pbnN0YWxsQWx0QnJlYWtIYW5kbGVyKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIoKQotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotdm9sYXRpbGUgaW50IGJyZWFrSGl0ID0gZmFsc2U7Ci12b2xhdGlsZSBpbnQgY3RybENIaXQgPSBmYWxzZTsKLQotI3ByYWdtYSBvZmYgKGNoZWNrX3N0YWNrKSAgICAgICAgICAgLyogTm8gc3RhY2sgY2hlY2tpbmcgdW5kZXIgV2F0Y29tICAgKi8KLQotdm9pZCBQTUFQSSBicmVha0hhbmRsZXIodWludCBiSGl0KQotewotICAgIGlmIChiSGl0KQotCWJyZWFrSGl0ID0gdHJ1ZTsKLSAgICBlbHNlCi0JY3RybENIaXQgPSB0cnVlOwotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOwotICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgewotCWNhc2UgUE1fcmVhbE1vZGU6Ci0JICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8yODY6Ci0JICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8zODY6Ci0JICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihicmVha0hhbmRsZXIpOwotICAgIHByaW50ZigiQ29udHJvbCBDL0JyZWFrIGludGVycnVwdCBoYW5kbGVyIGluc3RhbGxlZFxuIik7Ci0gICAgd2hpbGUgKDEpIHsKLQlpZiAoY3RybENIaXQpIHsKLQkgICAgcHJpbnRmKCJDb2RlIHRlcm1pbWF0ZWQgd2l0aCBDdHJsLUMuXG4iKTsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQlpZiAoYnJlYWtIaXQpIHsKLQkgICAgcHJpbnRmKCJDb2RlIHRlcm1pbWF0ZWQgd2l0aCBDdHJsLUJyZWFrLlxuIik7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JaWYgKFBNX2tiaGl0KCkgJiYgUE1fZ2V0Y2goKSA9PSAweDFCKSB7Ci0JICAgIHByaW50ZigiTm8gYnJlYWsgY29kZSBkZXRlY3RlZCFcbiIpOwotCSAgICBicmVhazsKLQkgICAgfQotCXByaW50ZigiSGl0IEN0cmwtQyBvciBDdHJsLUJyZWFrIHRvIGV4aXQhXG4iKTsKLQl9Ci0KLSAgICBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9hbHRjcml0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9hbHRjcml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMzczMDcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYWx0Y3JpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwgYSBDIGJhc2VkCi0qICAgICAgICAgICAgICAgY3JpdGljYWwgZXJyb3IgaGFuZGxlci4KLSoKLSogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX2luc3RhbGxDcml0aWNhbEhhbmRsZXIoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fY3JpdGljYWxFcnJvcigpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9yZXN0b3JlQ3JpdGljYWxIYW5kbGVyKCkKLSoKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLXZvbGF0aWxlIHVpbnQgY3JpdGljYWxFcnJvciA9IGZhbHNlOwotdm9sYXRpbGUgdWludCBheFZhbHVlOwotdm9sYXRpbGUgdWludCBkaVZhbHVlOwotCi0jcHJhZ21hIG9mZiAoY2hlY2tfc3RhY2spICAgICAgICAgICAvKiBObyBzdGFjayBjaGVja2luZyB1bmRlciBXYXRjb20gICAqLwotCi11aW50IFBNQVBJIGNyaXRpY2FsSGFuZGxlcih1aW50IGF4VmFsLHVpbnQgZGlWYWwpCi17Ci0gICAgY3JpdGljYWxFcnJvciA9IHRydWU7Ci0gICAgYXhWYWx1ZSA9IGF4VmFsOwotICAgIGRpVmFsdWUgPSBkaVZhbDsKLSAgICByZXR1cm4gMzsgICAgICAgLyogVGVsbCBNUy1ET1MgdG8gZmFpbCB0aGUgb3BlcmF0aW9uICovCi19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgRklMRSAgICAqZjsKLQotICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOwotICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgewotCWNhc2UgUE1fcmVhbE1vZGU6Ci0JICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8yODY6Ci0JICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8zODY6Ci0JICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgUE1faW5zdGFsbEFsdENyaXRpY2FsSGFuZGxlcihjcml0aWNhbEhhbmRsZXIpOwotICAgIHByaW50ZigiQ3JpdGljYWwgRXJyb3IgaGFuZGxlciBpbnN0YWxsZWQgLSB0cnlpbmcgdG8gcmVhZCBmcm9tIEE6IGRyaXZlLi4uXG4iKTsKLSAgICBmID0gZm9wZW4oImE6XGJvZy5ib2ciLCJyYiIpOwotICAgIGlmIChmKSBmY2xvc2UoZik7Ci0gICAgaWYgKGNyaXRpY2FsRXJyb3IpIHsKLQlwcmludGYoIkNyaXRpY2FsIGVycm9yIG9jY3VyZWQgb24gSU5UIDIxaCBmdW5jdGlvbiAlMDJYIVxuIiwKLQkgICAgYXhWYWx1ZSA+PiA4KTsKLQl9Ci0gICAgZWxzZQotCXByaW50ZigiQ3JpdGljYWwgZXJyb3Igd2FzIG5vdCBjYXVnaHQhXG4iKTsKLSAgICBQTV9yZXN0b3JlQ3JpdGljYWxIYW5kbGVyKCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9iaW9zcHRyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9iaW9zcHRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYTMzODIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYmlvc3B0ci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIG1hbmlwdWxhdGUgdGhlCi0qICAgICAgICAgICAgICAgQklPUyBkYXRhIGFyZWEgZnJvbSBwcm90ZWN0ZWQgbW9kZSB1c2luZyB0aGUgUE0KLSogICAgICAgICAgICAgICBsaWJyYXJ5LiBDb21waWxlIGFuZCBsaW5rIHdpdGggdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmQKLSogICAgICAgICAgICAgICBsaW5lIGZvciB5b3VyIERPUyBleHRlbmRlci4KLSoKLSogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX2dldEJJT1NTZWxlY3RvcigpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9nZXRMb25nKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2dldEJ5dGUoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fZ2V0V29yZCgpCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi0vKiBNYWNyb3MgdG8gb2J0YWluIHZhbHVlcyBmcm9tIHRoZSBCSU9TIGRhdGEgYXJlYSAqLwotCi0jZGVmaW5lIFRJQ0tTKCkgICAgIFBNX2dldExvbmcoYmlvcysweDZDKQotI2RlZmluZSBLQl9TVEFUICAgICBQTV9nZXRCeXRlKGJpb3MrMHgxNykKLSNkZWZpbmUgS0JfSEVBRCAgICAgUE1fZ2V0V29yZChiaW9zKzB4MUEpCi0jZGVmaW5lIEtCX1RBSUwgICAgIFBNX2dldFdvcmQoYmlvcysweDFDKQotCi0vKiBNYWNyb3MgZm9yIHdvcmtpbmcgd2l0aCB0aGUga2V5Ym9hcmQgYnVmZmVyICovCi0KLSNkZWZpbmUgS0JfSElUKCkgICAgKEtCX0hFQUQgIT0gS0JfVEFJTCkKLSNkZWZpbmUgQ1RSTCgpICAgICAgKEtCX1NUQVQgJiA0KQotI2RlZmluZSBTSElGVCgpICAgICAoS0JfU1RBVCAmIDIpCi0jZGVmaW5lIEVTQyAgICAgICAgIDB4MUIKLQotLyogU2VsZWN0b3IgZm9yIEJJT1MgZGF0YSBhcmVhICovCi0KLXVjaGFyICpiaW9zOwotCi1pbnQgbWFpbih2b2lkKQotewotICAgIGludCBjLGRvbmUgPSAwOwotCi0gICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7Ci0gICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7Ci0JY2FzZSBQTV9yZWFsTW9kZToKLQkgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzI4NjoKLQkgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzM4NjoKLQkgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICBiaW9zID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKLSAgICBwcmludGYoIkhpdCBhbnkga2V5IHRvIHRlc3QsIEN0cmwtU2hpZnQtRXNjIHRvIHF1aXRcbiIpOwotICAgIHdoaWxlICghZG9uZSkgewotCWlmIChLQl9ISVQoKSkgewotCSAgICBjID0gUE1fZ2V0Y2goKTsKLQkgICAgaWYgKGMgPT0gMCkgUE1fZ2V0Y2goKTsKLQkgICAgcHJpbnRmKCJUSU1FPSUtOGxYIFNUPSUwMlggQ0hBUj0lMDJYICIsIFRJQ0tTKCksIEtCX1NUQVQsIGMpOwotCSAgICBwcmludGYoIlxuIik7Ci0JICAgIGlmICgoYyA9PSBFU0MpICYmIFNISUZUKCkgJiYgQ1RSTCgpKS8qIEN0cmwtU2hpZnQtRXNjICovCi0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9ibG9jay5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYmxvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkNTAzYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9ibG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIGZvciB0aGUgUE1fYmxvY2tVbnRpbFRpbWVvdXQgZnVuY3Rpb24uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi0jZGVmaW5lIERFTEFZX01TRUNTIDExMDAKLSNkZWZpbmUgTE9PUFMgICAgICAgNQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGUgZm9sbG93aW5nIHJvdXRpbmUgdGFrZXMgYSBsb25nIGNvdW50IGluIG1pY3Jvc2Vjb25kcyBhbmQgb3V0cHV0cwotICogYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb3VudCBpbiBzZWNvbmRzLiBJdCBjb3VsZCBiZSBtb2RpZmllZCB0bwotICogcmV0dXJuIGEgcG9pbnRlciB0byBhIHN0YXRpYyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb3VudCByYXRoZXIKLSAqIHRoYW4gcHJpbnRpbmcgaXQgb3V0LgotICovCi0KLXZvaWQgUmVwb3J0VGltZSh1bG9uZyBjb3VudCkKLXsKLSAgICB1bG9uZyAgIHNlY3M7Ci0KLSAgICBzZWNzID0gY291bnQgLyAxMDAwMDAwTDsKLSAgICBjb3VudCA9IGNvdW50IC0gc2VjcyAqIDEwMDAwMDBMOwotICAgIHByaW50ZigiVGltZSB0YWtlbjogJWx1LiUwNmx1IHNlY29uZHNcbiIsc2Vjcyxjb3VudCk7Ci19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBwcmludGYoIkRldGVjdGluZyBwcm9jZXNzb3IgaW5mb3JtYXRpb24gLi4uIik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgcHJpbnRmKCJcblxuJXNcbiIsIENQVV9nZXRQcm9jZXNzb3JOYW1lKCkpOwotICAgIFpUaW1lckluaXQoKTsKLSAgICBMWlRpbWVyT24oKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUFM7IGkrKykgewotCVBNX2Jsb2NrVW50aWxUaW1lb3V0KERFTEFZX01TRUNTKTsKLQlSZXBvcnRUaW1lKExaVGltZXJMYXAoKSk7Ci0JfQotICAgIExaVGltZXJPZmYoKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2Jyay5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYnJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYjY0NDYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYnJrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbCBhIEMgYmFzZWQKLSogICAgICAgICAgICAgICBjb250cm9sIEMvYnJlYWsgaW50ZXJydXB0IGhhbmRsZXIuCi0qCi0qICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9pbnN0YWxsQnJlYWtIYW5kbGVyKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2N0cmxDSGl0KCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2N0cmxCcmVha0hpdCgpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKCkKLSoKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7Ci0gICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7Ci0JY2FzZSBQTV9yZWFsTW9kZToKLQkgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzI4NjoKLQkgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzM4NjoKLQkgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICBQTV9pbnN0YWxsQnJlYWtIYW5kbGVyKCk7Ci0gICAgcHJpbnRmKCJDb250cm9sIEMvQnJlYWsgaW50ZXJydXB0IGhhbmRsZXIgaW5zdGFsbGVkXG4iKTsKLSAgICB3aGlsZSAoMSkgewotCWlmIChQTV9jdHJsQ0hpdCgxKSkgewotCSAgICBwcmludGYoIkNvZGUgdGVybWltYXRlZCB3aXRoIEN0cmwtQy5cbiIpOwotCSAgICBicmVhazsKLQkgICAgfQotCWlmIChQTV9jdHJsQnJlYWtIaXQoMSkpIHsKLQkgICAgcHJpbnRmKCJDb2RlIHRlcm1pbWF0ZWQgd2l0aCBDdHJsLUJyZWFrLlxuIik7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JaWYgKFBNX2tiaGl0KCkgJiYgUE1fZ2V0Y2goKSA9PSAweDFCKSB7Ci0JICAgIHByaW50ZigiTm8gYnJlYWsgY29kZSBkZXRlY3RlZCFcbiIpOwotCSAgICBicmVhazsKLQkgICAgfQotCXByaW50ZigiSGl0IEN0cmwtQyBvciBDdHJsLUJyZWFrIHRvIGV4aXQhXG4iKTsKLQl9Ci0KLSAgICBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jYWxscmVhbC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY2FsbHJlYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQzN2NhYi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jYWxscmVhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBjYWxsIGEgcmVhbCBtb2RlCi0qICAgICAgICAgICAgICAgcHJvY2VkdXJlLiBXZSBzaW1wbHkgY29weSBhIHRlcnJpYmx5IHNpbXBsZSBhc3NlbWJseQotKiAgICAgICAgICAgICAgIGxhbmd1YWdlIHJvdXRpbmUgaW50byBhIHJlYWwgbW9kZSBibG9jayB0aGF0IHdlIGFsbG9jYXRlLAotKiAgICAgICAgICAgICAgIGFuZCB0aGVuIGF0dGVtcHQgdG8gY2FsbCB0aGUgcm91dGluZSBhbmQgdmVyaWZ5IHRoYXQgaXQKLSogICAgICAgICAgICAgICB3YXMgc3VjY2Vzc2Z1bC4KLSoKLSogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX2FsbG9jUmVhbFNlZygpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9mcmVlUmVhbFNlZygpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9jYWxsUmVhbE1vZGUoKQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotLyogQmxvY2sgb2YgcmVhbCBtb2RlIGNvZGUgd2Ugd2lsbCBldmVudHVhbGx5IGNhbGwgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVhbE1vZGVDb2RlW10gPSB7Ci0gICAgMHg5MywgICAgICAgICAgIC8qICB4Y2hnICAgIGF4LGJ4ICAgKi8KLSAgICAweDg3LCAweENBLCAgICAgLyogIHhjaGcgICAgY3gsZHggICAqLwotICAgIDB4Q0IgICAgICAgICAgICAvKiAgcmV0ZiAgICAgICAgICAgICovCi0gICAgfTsKLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBSTVJFR1MgICAgICAgICAgcmVnczsKLSAgICBSTVNSRUdTICAgICAgICAgc3JlZ3M7Ci0gICAgdWNoYXIgICAgICAgICAgICpwOwotICAgIHVuc2lnbmVkICAgICAgICByX3NlZyxyX29mZjsKLQotICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOwotICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgewotCWNhc2UgUE1fcmVhbE1vZGU6Ci0JICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8yODY6Ci0JICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8zODY6Ci0JICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgLyogQWxsb2NhdGUgYSB0aGUgYmxvY2sgb2YgcmVhbCBtb2RlIG1lbW9yeSAqLwotICAgIGlmICgocCA9IFBNX2FsbG9jUmVhbFNlZyhzaXplb2YocmVhbE1vZGVDb2RlKSwgJnJfc2VnLCAmcl9vZmYpKSA9PSBOVUxMKSB7Ci0JcHJpbnRmKCJVbmFibGUgdG8gYWxsb2NhdGUgcmVhbCBtb2RlIG1lbW9yeSFcbiIpOwotCWV4aXQoMSk7Ci0JfQotCi0gICAgLyogQ29weSB0aGUgcmVhbCBtb2RlIGNvZGUgKi8KLSAgICBtZW1jcHkocCxyZWFsTW9kZUNvZGUsc2l6ZW9mKHJlYWxNb2RlQ29kZSkpOwotCi0gICAgLyogTm93IGNhbGwgdGhlIHJlYWwgbW9kZSBjb2RlICovCi0gICAgcmVncy54LmF4ID0gMTsKLSAgICByZWdzLnguYnggPSAyOwotICAgIHJlZ3MueC5jeCA9IDM7Ci0gICAgcmVncy54LmR4ID0gNDsKLSAgICByZWdzLnguc2kgPSA1OwotICAgIHJlZ3MueC5kaSA9IDY7Ci0gICAgc3JlZ3MuZXMgPSA3OwotICAgIHNyZWdzLmRzID0gODsKLSAgICBQTV9jYWxsUmVhbE1vZGUocl9zZWcscl9vZmYsJnJlZ3MsJnNyZWdzKTsKLSAgICBpZiAocmVncy54LmF4ICE9IDIgfHwgcmVncy54LmJ4ICE9IDEgfHwgcmVncy54LmN4ICE9IDQgfHwgcmVncy54LmR4ICE9IDMKLQkgICAgfHwgcmVncy54LnNpICE9IDUgfHwgcmVncy54LmRpICE9IDYgfHwgc3JlZ3MuZXMgIT0gNwotCSAgICB8fCBzcmVncy5kcyAhPSA4KSB7Ci0JcHJpbnRmKCJSZWFsIG1vZGUgY2FsbCBmYWlsZWQhXG4iKTsKLQlwcmludGYoIlxuIik7Ci0JcHJpbnRmKCJheCA9ICUwNFgsIGJ4ID0gJTA0WCwgY3ggPSAlMDRYLCBkeCA9ICUwNFhcbiIsCi0JICAgIHJlZ3MueC5heCxyZWdzLnguYngscmVncy54LmN4LHJlZ3MueC5keCk7Ci0JcHJpbnRmKCJzaSA9ICUwNFgsIGRpID0gJTA0WCwgZXMgPSAlMDRYLCBkcyA9ICUwNFhcbiIsCi0JICAgIHJlZ3MueC5zaSxyZWdzLnguZGksc3JlZ3MuZXMsc3JlZ3MuZHMpOwotCX0KLSAgICBlbHNlCi0JcHJpbnRmKCJSZWFsIG1vZGUgY2FsbCBzdWNjZWVkZWQhXG4iKTsKLQotICAgIC8qIEZyZWUgdGhlIG1lbW9yeSB3ZSBhbGxvY2F0ZWQgKi8KLSAgICBQTV9mcmVlUmVhbFNlZyhwKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2NoZWNrcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY2hlY2tzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MzNhYzkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY2hlY2tzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgTWFpbiBtb2R1bGUgZm9yIGJ1aWxkaW5nIGNoZWNrZWQgYnVpbGRzIG9mIHByb2R1Y3RzIHdpdGgKLSogICAgICAgICAgICAgICBhc3NlcnRpb25zIGFuZCB0cmFjZSBjb2RlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInNjaXRlY2guaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2lmZGVmICBfX1dJTkRPV1NfXwotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jZGVmaW5lIFNUUklDVAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotCi0jaWZkZWYgIENIRUNLRUQKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBMT0dGSUxFICJcXHNjaXRlY2gubG9nIgotCi12b2lkICgqX0NIS19mYWlsKShpbnQgZmF0YWwsY29uc3QgY2hhciAqbXNnLGNvbnN0IGNoYXIgKmNvbmQsY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSkgPSBfQ0hLX2RlZmF1bHRGYWlsOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1IYW5kbGVzIGZhdGFsIGVycm9yIGFuZCB3YXJuaW5nIGNvbmRpdGlvbnMgZm9yIGNoZWNrZWQgYnVpbGRzLgotCi1IRUFERVI6Ci1zY2l0ZWNoLmgKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGFuIGlubGluZSBjaGVjayBvciB3YXJuaW5nIGZhaWxzIGluIGFueQotb2YgdGhlIFNjaVRlY2ggcnVudGltZSBsaWJyYXJpZXMuIFdhcm5pbmcgY29uZGl0aW9ucyBzaW1wbHkgY2F1c2UgdGhlCi1jb25kaXRpb24gdG8gYmUgbG9nZ2VkIHRvIHRoZSBsb2cgZmlsZSBhbmQgc2VuZCB0byB0aGUgc3lzdGVtIGRlYnVnZ2VyCi11bmRlciBXaW5kb3cuIEZhdGFsIGVycm9yIGNvbmRpdGlvbnMgZG8gYWxsIG9mIHRoZSBhYm92ZSwgYW5kIHRoZW4KLXRlcm1pbmF0ZSB0aGUgcHJvZ3JhbSB3aXRoIGEgZmF0YWwgZXJyb3IgY29uZGl0aW9ucy4KLQotVGhpcyBoYW5kbGVyIG1heSBiZSBvdmVycmlkZW4gYnkgdGhlIHVzZXIgY29kZSBpZiBuZWNlc3NhcnkgdG8gcmVwbGFjZSBpdAotd2l0aCBhIGRpZmZlcmVudCBoYW5kbGVyICh0aGUgTUdMIGZvciBpbnN0YW5jZSBvdmVycmlkZXMgdGhpcyBhbmQgcmVwbGFjZXMKLWl0IHdpdGggYSBoYW5kbGVyIHRoYXQgZG9lcyBhbiBNR0xfZXhpdCgpIGJlZm9yZSB0ZXJtaW5hdGluZyB0aGUgYXBwbGljYXRpb24KLXNvIHRoYXQgaXQgd2lsbCBjbGVhbiB1cCBjb3JyZWN0bHkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfQ0hLX2RlZmF1bHRGYWlsKAotICAgIGludCBmYXRhbCwKLSAgICBjb25zdCBjaGFyICptc2csCi0gICAgY29uc3QgY2hhciAqY29uZCwKLSAgICBjb25zdCBjaGFyICpmaWxlLAotICAgIGludCBsaW5lKQotewotICAgIGNoYXIgICAgYnVmWzI1Nl07Ci0gICAgRklMRSAgICAqbG9nID0gZm9wZW4oTE9HRklMRSwgImF0KyIpOwotCi0gICAgc3ByaW50ZihidWYsbXNnLGNvbmQsZmlsZSxsaW5lKTsKLSAgICBpZiAobG9nKSB7Ci0JZnB1dHMoYnVmLGxvZyk7Ci0JZmZsdXNoKGxvZyk7Ci0JZmNsb3NlKGxvZyk7Ci0jaWZkZWYgIF9fV0lORE9XU19fCi0JT3V0cHV0RGVidWdTdHIoYnVmKTsKLSNlbmRpZgotCX0KLSAgICBpZiAoZmF0YWwpIHsKLSNpZmRlZiAgX19XSU5ET1dTX18KLQlNZXNzYWdlQm94KE5VTEwsIGJ1ZiwiRmF0YWwgRXJyb3IhIixNQl9JQ09ORVhDTEFNQVRJT04pOwotI2Vsc2UKLQlmcHV0cyhidWYsc3RkZXJyKTsKLSNlbmRpZgotCWV4aXQoLTEpOwotCX0KLX0KLQotI2VuZGlmICAvKiBDSEVDS0VEICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jcHUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2NwdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGU1ZGQzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2NwdS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIGZvciB0aGUgQ1BVIGRldGVjdGlvbiBjb2RlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInp0aW1lci5oIgotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBwcmludGYoIkRldGVjdGluZyBwcm9jZXNzb3IgaW5mb3JtYXRpb24gLi4uIik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgcHJpbnRmKCJcblxuJXNcbiIsIENQVV9nZXRQcm9jZXNzb3JOYW1lKCkpOwotICAgIGlmIChDUFVfaGF2ZVJEVFNDKCkpCi0JcHJpbnRmKCJcblByb2Nlc3NvciBzdXBwb3J0cyBSZWFkIFRpbWUgU3RhbXAgQ291bnRlciBwZXJmb3JtYW5jZSB0aW1lci5cbiIpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY3JpdGljYWwuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2NyaXRpY2FsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZjEyNTEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY3JpdGljYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBpbnN0YWxsIGEgQyBiYXNlZAotKiAgICAgICAgICAgICAgIGNyaXRpY2FsIGVycm9yIGhhbmRsZXIuCi0qCi0qICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX3Jlc3RvcmVDcml0aWNhbEhhbmRsZXIoKQotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBGSUxFICAgICpmOwotICAgIGludCAgICAgYXhjb2RlLGRpY29kZTsKLQotICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOwotICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgewotCWNhc2UgUE1fcmVhbE1vZGU6Ci0JICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8yODY6Ci0JICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8zODY6Ci0JICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgUE1faW5zdGFsbENyaXRpY2FsSGFuZGxlcigpOwotICAgIHByaW50ZigiQ3JpdGljYWwgRXJyb3IgaGFuZGxlciBpbnN0YWxsZWQgLSB0cnlpbmcgdG8gcmVhZCBmcm9tIEE6IGRyaXZlLi4uXG4iKTsKLSAgICBmID0gZm9wZW4oImE6XGJvZy5ib2ciLCJyYiIpOwotICAgIGlmIChmKSBmY2xvc2UoZik7Ci0gICAgaWYgKFBNX2NyaXRpY2FsRXJyb3IoJmF4Y29kZSwmZGljb2RlLDEpKSB7Ci0JcHJpbnRmKCJDcml0aWNhbCBlcnJvciBvY2N1cmVkIG9uIElOVCAyMWggZnVuY3Rpb24gJTAyWCFcbiIsCi0JICAgIGF4Y29kZSA+PiA4KTsKLQl9Ci0gICAgZWxzZSBwcmludGYoIkNyaXRpY2FsIGVycm9yIHdhcyBub3QgY2F1Z2h0IVxuIik7Ci0gICAgUE1fcmVzdG9yZUNyaXRpY2FsSGFuZGxlcigpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvZ2V0Y2guYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2dldGNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YzIxODAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvZ2V0Y2guYworKysgL2Rldi9udWxsCkBAIC0xLDUwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gdGVzdCBvdXQgdGhlIGNyb3NzIHBsYXRmb3JtIGV2ZW50IGhhbmRsaW5nCi0qICAgICAgICAgICAgICAgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJldmVudC5oIgotCi0vKiBUcmFuc2xhdGlvbiB0YWJsZSBmb3Iga2V5IGNvZGVzICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgICAgIGNvZGU7Ci0gICAgY2hhciAgICAqbmFtZTsKLSAgICB9IEtleUVudHJ5OwotCi1LZXlFbnRyeSBBU0NJSUNvZGVzW10gPSB7Ci0gICAge0FTQ0lJX2N0cmxBICAgICAgICAgICAgLCJBU0NJSV9jdHJsQSJ9LAotICAgIHtBU0NJSV9jdHJsQiAgICAgICAgICAgICwiQVNDSUlfY3RybEIifSwKLSAgICB7QVNDSUlfY3RybEMgICAgICAgICAgICAsIkFTQ0lJX2N0cmxDIn0sCi0gICAge0FTQ0lJX2N0cmxEICAgICAgICAgICAgLCJBU0NJSV9jdHJsRCJ9LAotICAgIHtBU0NJSV9jdHJsRSAgICAgICAgICAgICwiQVNDSUlfY3RybEUifSwKLSAgICB7QVNDSUlfY3RybEYgICAgICAgICAgICAsIkFTQ0lJX2N0cmxGIn0sCi0gICAge0FTQ0lJX2N0cmxHICAgICAgICAgICAgLCJBU0NJSV9jdHJsRyJ9LAotICAgIHtBU0NJSV9iYWNrc3BhY2UgICAgICAgICwiQVNDSUlfYmFja3NwYWNlIn0sCi0gICAge0FTQ0lJX2N0cmxIICAgICAgICAgICAgLCJBU0NJSV9jdHJsSCJ9LAotICAgIHtBU0NJSV90YWIgICAgICAgICAgICAgICwiQVNDSUlfdGFiIn0sCi0gICAge0FTQ0lJX2N0cmxJICAgICAgICAgICAgLCJBU0NJSV9jdHJsSSJ9LAotICAgIHtBU0NJSV9jdHJsSiAgICAgICAgICAgICwiQVNDSUlfY3RybEoifSwKLSAgICB7QVNDSUlfY3RybEsgICAgICAgICAgICAsIkFTQ0lJX2N0cmxLIn0sCi0gICAge0FTQ0lJX2N0cmxMICAgICAgICAgICAgLCJBU0NJSV9jdHJsTCJ9LAotICAgIHtBU0NJSV9lbnRlciAgICAgICAgICAgICwiQVNDSUlfZW50ZXIifSwKLSAgICB7QVNDSUlfY3RybE0gICAgICAgICAgICAsIkFTQ0lJX2N0cmxNIn0sCi0gICAge0FTQ0lJX2N0cmxOICAgICAgICAgICAgLCJBU0NJSV9jdHJsTiJ9LAotICAgIHtBU0NJSV9jdHJsTyAgICAgICAgICAgICwiQVNDSUlfY3RybE8ifSwKLSAgICB7QVNDSUlfY3RybFAgICAgICAgICAgICAsIkFTQ0lJX2N0cmxQIn0sCi0gICAge0FTQ0lJX2N0cmxRICAgICAgICAgICAgLCJBU0NJSV9jdHJsUSJ9LAotICAgIHtBU0NJSV9jdHJsUiAgICAgICAgICAgICwiQVNDSUlfY3RybFIifSwKLSAgICB7QVNDSUlfY3RybFMgICAgICAgICAgICAsIkFTQ0lJX2N0cmxTIn0sCi0gICAge0FTQ0lJX2N0cmxUICAgICAgICAgICAgLCJBU0NJSV9jdHJsVCJ9LAotICAgIHtBU0NJSV9jdHJsVSAgICAgICAgICAgICwiQVNDSUlfY3RybFUifSwKLSAgICB7QVNDSUlfY3RybFYgICAgICAgICAgICAsIkFTQ0lJX2N0cmxWIn0sCi0gICAge0FTQ0lJX2N0cmxXICAgICAgICAgICAgLCJBU0NJSV9jdHJsVyJ9LAotICAgIHtBU0NJSV9jdHJsWCAgICAgICAgICAgICwiQVNDSUlfY3RybFgifSwKLSAgICB7QVNDSUlfY3RybFkgICAgICAgICAgICAsIkFTQ0lJX2N0cmxZIn0sCi0gICAge0FTQ0lJX2N0cmxaICAgICAgICAgICAgLCJBU0NJSV9jdHJsWiJ9LAotICAgIHtBU0NJSV9lc2MgICAgICAgICAgICAgICwiQVNDSUlfZXNjIn0sCi0gICAge0FTQ0lJX3NwYWNlICAgICAgICAgICAgLCJBU0NJSV9zcGFjZSJ9LAotICAgIHtBU0NJSV9leGNsYW1hdGlvbiAgICAgICwiQVNDSUlfZXhjbGFtYXRpb24ifSwKLSAgICB7QVNDSUlfcXVvdGUgICAgICAgICAgICAsIkFTQ0lJX3F1b3RlIn0sCi0gICAge0FTQ0lJX3BvdW5kICAgICAgICAgICAgLCJBU0NJSV9wb3VuZCJ9LAotICAgIHtBU0NJSV9kb2xsYXIgICAgICAgICAgICwiQVNDSUlfZG9sbGFyIn0sCi0gICAge0FTQ0lJX3BlcmNlbnQgICAgICAgICAgLCJBU0NJSV9wZXJjZW50In0sCi0gICAge0FTQ0lJX2FtcGVyc2FuZCAgICAgICAgLCJBU0NJSV9hbXBlcnNhbmQifSwKLSAgICB7QVNDSUlfYXBvc3Ryb3BoZSAgICAgICAsIkFTQ0lJX2Fwb3N0cm9waGUifSwKLSAgICB7QVNDSUlfbGVmdEJyYWNlICAgICAgICAsIkFTQ0lJX2xlZnRCcmFjZSJ9LAotICAgIHtBU0NJSV9yaWdodEJyYWNlICAgICAgICwiQVNDSUlfcmlnaHRCcmFjZSJ9LAotICAgIHtBU0NJSV90aW1lcyAgICAgICAgICAgICwiQVNDSUlfdGltZXMifSwKLSAgICB7QVNDSUlfcGx1cyAgICAgICAgICAgICAsIkFTQ0lJX3BsdXMifSwKLSAgICB7QVNDSUlfY29tbWEgICAgICAgICAgICAsIkFTQ0lJX2NvbW1hIn0sCi0gICAge0FTQ0lJX21pbnVzICAgICAgICAgICAgLCJBU0NJSV9taW51cyJ9LAotICAgIHtBU0NJSV9wZXJpb2QgICAgICAgICAgICwiQVNDSUlfcGVyaW9kIn0sCi0gICAge0FTQ0lJX2RpdmlkZSAgICAgICAgICAgLCJBU0NJSV9kaXZpZGUifSwKLSAgICB7QVNDSUlfMCAgICAgICAgICAgICAgICAsIkFTQ0lJXzAifSwKLSAgICB7QVNDSUlfMSAgICAgICAgICAgICAgICAsIkFTQ0lJXzEifSwKLSAgICB7QVNDSUlfMiAgICAgICAgICAgICAgICAsIkFTQ0lJXzIifSwKLSAgICB7QVNDSUlfMyAgICAgICAgICAgICAgICAsIkFTQ0lJXzMifSwKLSAgICB7QVNDSUlfNCAgICAgICAgICAgICAgICAsIkFTQ0lJXzQifSwKLSAgICB7QVNDSUlfNSAgICAgICAgICAgICAgICAsIkFTQ0lJXzUifSwKLSAgICB7QVNDSUlfNiAgICAgICAgICAgICAgICAsIkFTQ0lJXzYifSwKLSAgICB7QVNDSUlfNyAgICAgICAgICAgICAgICAsIkFTQ0lJXzcifSwKLSAgICB7QVNDSUlfOCAgICAgICAgICAgICAgICAsIkFTQ0lJXzgifSwKLSAgICB7QVNDSUlfOSAgICAgICAgICAgICAgICAsIkFTQ0lJXzkifSwKLSAgICB7QVNDSUlfY29sb24gICAgICAgICAgICAsIkFTQ0lJX2NvbG9uIn0sCi0gICAge0FTQ0lJX3NlbWljb2xvbiAgICAgICAgLCJBU0NJSV9zZW1pY29sb24ifSwKLSAgICB7QVNDSUlfbGVzc1RoYW4gICAgICAgICAsIkFTQ0lJX2xlc3NUaGFuIn0sCi0gICAge0FTQ0lJX2VxdWFscyAgICAgICAgICAgLCJBU0NJSV9lcXVhbHMifSwKLSAgICB7QVNDSUlfZ3JlYXRlclRoYW4gICAgICAsIkFTQ0lJX2dyZWF0ZXJUaGFuIn0sCi0gICAge0FTQ0lJX3F1ZXN0aW9uICAgICAgICAgLCJBU0NJSV9xdWVzdGlvbiJ9LAotICAgIHtBU0NJSV9hdCAgICAgICAgICAgICAgICwiQVNDSUlfYXQifSwKLSAgICB7QVNDSUlfQSAgICAgICAgICAgICAgICAsIkFTQ0lJX0EifSwKLSAgICB7QVNDSUlfQiAgICAgICAgICAgICAgICAsIkFTQ0lJX0IifSwKLSAgICB7QVNDSUlfQyAgICAgICAgICAgICAgICAsIkFTQ0lJX0MifSwKLSAgICB7QVNDSUlfRCAgICAgICAgICAgICAgICAsIkFTQ0lJX0QifSwKLSAgICB7QVNDSUlfRSAgICAgICAgICAgICAgICAsIkFTQ0lJX0UifSwKLSAgICB7QVNDSUlfRiAgICAgICAgICAgICAgICAsIkFTQ0lJX0YifSwKLSAgICB7QVNDSUlfRyAgICAgICAgICAgICAgICAsIkFTQ0lJX0cifSwKLSAgICB7QVNDSUlfSCAgICAgICAgICAgICAgICAsIkFTQ0lJX0gifSwKLSAgICB7QVNDSUlfSSAgICAgICAgICAgICAgICAsIkFTQ0lJX0kifSwKLSAgICB7QVNDSUlfSiAgICAgICAgICAgICAgICAsIkFTQ0lJX0oifSwKLSAgICB7QVNDSUlfSyAgICAgICAgICAgICAgICAsIkFTQ0lJX0sifSwKLSAgICB7QVNDSUlfTCAgICAgICAgICAgICAgICAsIkFTQ0lJX0wifSwKLSAgICB7QVNDSUlfTSAgICAgICAgICAgICAgICAsIkFTQ0lJX00ifSwKLSAgICB7QVNDSUlfTiAgICAgICAgICAgICAgICAsIkFTQ0lJX04ifSwKLSAgICB7QVNDSUlfTyAgICAgICAgICAgICAgICAsIkFTQ0lJX08ifSwKLSAgICB7QVNDSUlfUCAgICAgICAgICAgICAgICAsIkFTQ0lJX1AifSwKLSAgICB7QVNDSUlfUSAgICAgICAgICAgICAgICAsIkFTQ0lJX1EifSwKLSAgICB7QVNDSUlfUiAgICAgICAgICAgICAgICAsIkFTQ0lJX1IifSwKLSAgICB7QVNDSUlfUyAgICAgICAgICAgICAgICAsIkFTQ0lJX1MifSwKLSAgICB7QVNDSUlfVCAgICAgICAgICAgICAgICAsIkFTQ0lJX1QifSwKLSAgICB7QVNDSUlfVSAgICAgICAgICAgICAgICAsIkFTQ0lJX1UifSwKLSAgICB7QVNDSUlfViAgICAgICAgICAgICAgICAsIkFTQ0lJX1YifSwKLSAgICB7QVNDSUlfVyAgICAgICAgICAgICAgICAsIkFTQ0lJX1cifSwKLSAgICB7QVNDSUlfWCAgICAgICAgICAgICAgICAsIkFTQ0lJX1gifSwKLSAgICB7QVNDSUlfWSAgICAgICAgICAgICAgICAsIkFTQ0lJX1kifSwKLSAgICB7QVNDSUlfWiAgICAgICAgICAgICAgICAsIkFTQ0lJX1oifSwKLSAgICB7QVNDSUlfbGVmdFNxdWFyZUJyYWNlICAsIkFTQ0lJX2xlZnRTcXVhcmVCcmFjZSJ9LAotICAgIHtBU0NJSV9iYWNrU2xhc2ggICAgICAgICwiQVNDSUlfYmFja1NsYXNoIn0sCi0gICAge0FTQ0lJX3JpZ2h0U3F1YXJlQnJhY2UgLCJBU0NJSV9yaWdodFNxdWFyZUJyYWNlIn0sCi0gICAge0FTQ0lJX2NhcmV0ICAgICAgICAgICAgLCJBU0NJSV9jYXJldCJ9LAotICAgIHtBU0NJSV91bmRlcnNjb3JlICAgICAgICwiQVNDSUlfdW5kZXJzY29yZSJ9LAotICAgIHtBU0NJSV9sZWZ0QXBvc3Ryb3BoZSAgICwiQVNDSUlfbGVmdEFwb3N0cm9waGUifSwKLSAgICB7QVNDSUlfYSAgICAgICAgICAgICAgICAsIkFTQ0lJX2EifSwKLSAgICB7QVNDSUlfYiAgICAgICAgICAgICAgICAsIkFTQ0lJX2IifSwKLSAgICB7QVNDSUlfYyAgICAgICAgICAgICAgICAsIkFTQ0lJX2MifSwKLSAgICB7QVNDSUlfZCAgICAgICAgICAgICAgICAsIkFTQ0lJX2QifSwKLSAgICB7QVNDSUlfZSAgICAgICAgICAgICAgICAsIkFTQ0lJX2UifSwKLSAgICB7QVNDSUlfZiAgICAgICAgICAgICAgICAsIkFTQ0lJX2YifSwKLSAgICB7QVNDSUlfZyAgICAgICAgICAgICAgICAsIkFTQ0lJX2cifSwKLSAgICB7QVNDSUlfaCAgICAgICAgICAgICAgICAsIkFTQ0lJX2gifSwKLSAgICB7QVNDSUlfaSAgICAgICAgICAgICAgICAsIkFTQ0lJX2kifSwKLSAgICB7QVNDSUlfaiAgICAgICAgICAgICAgICAsIkFTQ0lJX2oifSwKLSAgICB7QVNDSUlfayAgICAgICAgICAgICAgICAsIkFTQ0lJX2sifSwKLSAgICB7QVNDSUlfbCAgICAgICAgICAgICAgICAsIkFTQ0lJX2wifSwKLSAgICB7QVNDSUlfbSAgICAgICAgICAgICAgICAsIkFTQ0lJX20ifSwKLSAgICB7QVNDSUlfbiAgICAgICAgICAgICAgICAsIkFTQ0lJX24ifSwKLSAgICB7QVNDSUlfbyAgICAgICAgICAgICAgICAsIkFTQ0lJX28ifSwKLSAgICB7QVNDSUlfcCAgICAgICAgICAgICAgICAsIkFTQ0lJX3AifSwKLSAgICB7QVNDSUlfcSAgICAgICAgICAgICAgICAsIkFTQ0lJX3EifSwKLSAgICB7QVNDSUlfciAgICAgICAgICAgICAgICAsIkFTQ0lJX3IifSwKLSAgICB7QVNDSUlfcyAgICAgICAgICAgICAgICAsIkFTQ0lJX3MifSwKLSAgICB7QVNDSUlfdCAgICAgICAgICAgICAgICAsIkFTQ0lJX3QifSwKLSAgICB7QVNDSUlfdSAgICAgICAgICAgICAgICAsIkFTQ0lJX3UifSwKLSAgICB7QVNDSUlfdiAgICAgICAgICAgICAgICAsIkFTQ0lJX3YifSwKLSAgICB7QVNDSUlfdyAgICAgICAgICAgICAgICAsIkFTQ0lJX3cifSwKLSAgICB7QVNDSUlfeCAgICAgICAgICAgICAgICAsIkFTQ0lJX3gifSwKLSAgICB7QVNDSUlfeSAgICAgICAgICAgICAgICAsIkFTQ0lJX3kifSwKLSAgICB7QVNDSUlfeiAgICAgICAgICAgICAgICAsIkFTQ0lJX3oifSwKLSAgICB7QVNDSUlfbGVmdEN1cmx5QnJhY2UgICAsIkFTQ0lJX2xlZnRDdXJseUJyYWNlIn0sCi0gICAge0FTQ0lJX3ZlcnRpY2FsQmFyICAgICAgLCJBU0NJSV92ZXJ0aWNhbEJhciJ9LAotICAgIHtBU0NJSV9yaWdodEN1cmx5QnJhY2UgICwiQVNDSUlfcmlnaHRDdXJseUJyYWNlIn0sCi0gICAge0FTQ0lJX3RpbGRlICAgICAgICAgICAgLCJBU0NJSV90aWxkZSJ9LAotICAgIHswICAgICAgICAgICAgICAgICAgICAgICwiQVNDSUlfdW5rbm93biJ9LAotICAgIH07Ci0KLUtleUVudHJ5IFNjYW5Db2Rlc1tdID0gewotICAgIHtLQl9wYWRFbnRlciAgICAgICAgICAgICwiS0JfcGFkRW50ZXIifSwKLSAgICB7S0JfcGFkTWludXMgICAgICAgICAgICAsIktCX3BhZE1pbnVzIn0sCi0gICAge0tCX3BhZFBsdXMgICAgICAgICAgICAgLCJLQl9wYWRQbHVzIn0sCi0gICAge0tCX3BhZFRpbWVzICAgICAgICAgICAgLCJLQl9wYWRUaW1lcyJ9LAotICAgIHtLQl9wYWREaXZpZGUgICAgICAgICAgICwiS0JfcGFkRGl2aWRlIn0sCi0gICAge0tCX3BhZExlZnQgICAgICAgICAgICAgLCJLQl9wYWRMZWZ0In0sCi0gICAge0tCX3BhZFJpZ2h0ICAgICAgICAgICAgLCJLQl9wYWRSaWdodCJ9LAotICAgIHtLQl9wYWRVcCAgICAgICAgICAgICAgICwiS0JfcGFkVXAifSwKLSAgICB7S0JfcGFkRG93biAgICAgICAgICAgICAsIktCX3BhZERvd24ifSwKLSAgICB7S0JfcGFkSW5zZXJ0ICAgICAgICAgICAsIktCX3BhZEluc2VydCJ9LAotICAgIHtLQl9wYWREZWxldGUgICAgICAgICAgICwiS0JfcGFkRGVsZXRlIn0sCi0gICAge0tCX3BhZEhvbWUgICAgICAgICAgICAgLCJLQl9wYWRIb21lIn0sCi0gICAge0tCX3BhZEVuZCAgICAgICAgICAgICAgLCJLQl9wYWRFbmQifSwKLSAgICB7S0JfcGFkUGFnZVVwICAgICAgICAgICAsIktCX3BhZFBhZ2VVcCJ9LAotICAgIHtLQl9wYWRQYWdlRG93biAgICAgICAgICwiS0JfcGFkUGFnZURvd24ifSwKLSAgICB7S0JfcGFkQ2VudGVyICAgICAgICAgICAsIktCX3BhZENlbnRlciJ9LAotICAgIHtLQl9GMSAgICAgICAgICAgICAgICAgICwiS0JfRjEifSwKLSAgICB7S0JfRjIgICAgICAgICAgICAgICAgICAsIktCX0YyIn0sCi0gICAge0tCX0YzICAgICAgICAgICAgICAgICAgLCJLQl9GMyJ9LAotICAgIHtLQl9GNCAgICAgICAgICAgICAgICAgICwiS0JfRjQifSwKLSAgICB7S0JfRjUgICAgICAgICAgICAgICAgICAsIktCX0Y1In0sCi0gICAge0tCX0Y2ICAgICAgICAgICAgICAgICAgLCJLQl9GNiJ9LAotICAgIHtLQl9GNyAgICAgICAgICAgICAgICAgICwiS0JfRjcifSwKLSAgICB7S0JfRjggICAgICAgICAgICAgICAgICAsIktCX0Y4In0sCi0gICAge0tCX0Y5ICAgICAgICAgICAgICAgICAgLCJLQl9GOSJ9LAotICAgIHtLQl9GMTAgICAgICAgICAgICAgICAgICwiS0JfRjEwIn0sCi0gICAge0tCX0YxMSAgICAgICAgICAgICAgICAgLCJLQl9GMTEifSwKLSAgICB7S0JfRjEyICAgICAgICAgICAgICAgICAsIktCX0YxMiJ9LAotICAgIHtLQl9sZWZ0ICAgICAgICAgICAgICAgICwiS0JfbGVmdCJ9LAotICAgIHtLQl9yaWdodCAgICAgICAgICAgICAgICwiS0JfcmlnaHQifSwKLSAgICB7S0JfdXAgICAgICAgICAgICAgICAgICAsIktCX3VwIn0sCi0gICAge0tCX2Rvd24gICAgICAgICAgICAgICAgLCJLQl9kb3duIn0sCi0gICAge0tCX2luc2VydCAgICAgICAgICAgICAgLCJLQl9pbnNlcnQifSwKLSAgICB7S0JfZGVsZXRlICAgICAgICAgICAgICAsIktCX2RlbGV0ZSJ9LAotICAgIHtLQl9ob21lICAgICAgICAgICAgICAgICwiS0JfaG9tZSJ9LAotICAgIHtLQl9lbmQgICAgICAgICAgICAgICAgICwiS0JfZW5kIn0sCi0gICAge0tCX3BhZ2VVcCAgICAgICAgICAgICAgLCJLQl9wYWdlVXAifSwKLSAgICB7S0JfcGFnZURvd24gICAgICAgICAgICAsIktCX3BhZ2VEb3duIn0sCi0gICAge0tCX2NhcHNMb2NrICAgICAgICAgICAgLCJLQl9jYXBzTG9jayJ9LAotICAgIHtLQl9udW1Mb2NrICAgICAgICAgICAgICwiS0JfbnVtTG9jayJ9LAotICAgIHtLQl9zY3JvbGxMb2NrICAgICAgICAgICwiS0Jfc2Nyb2xsTG9jayJ9LAotICAgIHtLQl9sZWZ0U2hpZnQgICAgICAgICAgICwiS0JfbGVmdFNoaWZ0In0sCi0gICAge0tCX3JpZ2h0U2hpZnQgICAgICAgICAgLCJLQl9yaWdodFNoaWZ0In0sCi0gICAge0tCX2xlZnRDdHJsICAgICAgICAgICAgLCJLQl9sZWZ0Q3RybCJ9LAotICAgIHtLQl9yaWdodEN0cmwgICAgICAgICAgICwiS0JfcmlnaHRDdHJsIn0sCi0gICAge0tCX2xlZnRBbHQgICAgICAgICAgICAgLCJLQl9sZWZ0QWx0In0sCi0gICAge0tCX3JpZ2h0QWx0ICAgICAgICAgICAgLCJLQl9yaWdodEFsdCJ9LAotICAgIHtLQl9sZWZ0V2luZG93cyAgICAgICAgICwiS0JfbGVmdFdpbmRvd3MifSwKLSAgICB7S0JfcmlnaHRXaW5kb3dzICAgICAgICAsIktCX3JpZ2h0V2luZG93cyJ9LAotICAgIHtLQl9tZW51ICAgICAgICAgICAgICAgICwiS0JfbWVudSJ9LAotICAgIHtLQl9zeXNSZXEgICAgICAgICAgICAgICwiS0Jfc3lzUmVxIn0sCi0gICAge0tCX2VzYyAgICAgICAgICAgICAgICAgLCJLQl9lc2MifSwKLSAgICB7S0JfMSAgICAgICAgICAgICAgICAgICAsIktCXzEifSwKLSAgICB7S0JfMiAgICAgICAgICAgICAgICAgICAsIktCXzIifSwKLSAgICB7S0JfMyAgICAgICAgICAgICAgICAgICAsIktCXzMifSwKLSAgICB7S0JfNCAgICAgICAgICAgICAgICAgICAsIktCXzQifSwKLSAgICB7S0JfNSAgICAgICAgICAgICAgICAgICAsIktCXzUifSwKLSAgICB7S0JfNiAgICAgICAgICAgICAgICAgICAsIktCXzYifSwKLSAgICB7S0JfNyAgICAgICAgICAgICAgICAgICAsIktCXzcifSwKLSAgICB7S0JfOCAgICAgICAgICAgICAgICAgICAsIktCXzgifSwKLSAgICB7S0JfOSAgICAgICAgICAgICAgICAgICAsIktCXzkifSwKLSAgICB7S0JfMCAgICAgICAgICAgICAgICAgICAsIktCXzAifSwKLSAgICB7S0JfbWludXMgICAgICAgICAgICAgICAsIktCX21pbnVzIn0sCi0gICAge0tCX2VxdWFscyAgICAgICAgICAgICAgLCJLQl9lcXVhbHMifSwKLSAgICB7S0JfYmFja1NsYXNoICAgICAgICAgICAsIktCX2JhY2tTbGFzaCJ9LAotICAgIHtLQl9iYWNrc3BhY2UgICAgICAgICAgICwiS0JfYmFja3NwYWNlIn0sCi0gICAge0tCX3RhYiAgICAgICAgICAgICAgICAgLCJLQl90YWIifSwKLSAgICB7S0JfUSAgICAgICAgICAgICAgICAgICAsIktCX1EifSwKLSAgICB7S0JfVyAgICAgICAgICAgICAgICAgICAsIktCX1cifSwKLSAgICB7S0JfRSAgICAgICAgICAgICAgICAgICAsIktCX0UifSwKLSAgICB7S0JfUiAgICAgICAgICAgICAgICAgICAsIktCX1IifSwKLSAgICB7S0JfVCAgICAgICAgICAgICAgICAgICAsIktCX1QifSwKLSAgICB7S0JfWSAgICAgICAgICAgICAgICAgICAsIktCX1kifSwKLSAgICB7S0JfVSAgICAgICAgICAgICAgICAgICAsIktCX1UifSwKLSAgICB7S0JfSSAgICAgICAgICAgICAgICAgICAsIktCX0kifSwKLSAgICB7S0JfTyAgICAgICAgICAgICAgICAgICAsIktCX08ifSwKLSAgICB7S0JfUCAgICAgICAgICAgICAgICAgICAsIktCX1AifSwKLSAgICB7S0JfbGVmdFNxdWFyZUJyYWNlICAgICAsIktCX2xlZnRTcXVhcmVCcmFjZSJ9LAotICAgIHtLQl9yaWdodFNxdWFyZUJyYWNlICAgICwiS0JfcmlnaHRTcXVhcmVCcmFjZSJ9LAotICAgIHtLQl9lbnRlciAgICAgICAgICAgICAgICwiS0JfZW50ZXIifSwKLSAgICB7S0JfQSAgICAgICAgICAgICAgICAgICAsIktCX0EifSwKLSAgICB7S0JfUyAgICAgICAgICAgICAgICAgICAsIktCX1MifSwKLSAgICB7S0JfRCAgICAgICAgICAgICAgICAgICAsIktCX0QifSwKLSAgICB7S0JfRiAgICAgICAgICAgICAgICAgICAsIktCX0YifSwKLSAgICB7S0JfRyAgICAgICAgICAgICAgICAgICAsIktCX0cifSwKLSAgICB7S0JfSCAgICAgICAgICAgICAgICAgICAsIktCX0gifSwKLSAgICB7S0JfSiAgICAgICAgICAgICAgICAgICAsIktCX0oifSwKLSAgICB7S0JfSyAgICAgICAgICAgICAgICAgICAsIktCX0sifSwKLSAgICB7S0JfTCAgICAgICAgICAgICAgICAgICAsIktCX0wifSwKLSAgICB7S0Jfc2VtaWNvbG9uICAgICAgICAgICAsIktCX3NlbWljb2xvbiJ9LAotICAgIHtLQl9hcG9zdHJvcGhlICAgICAgICAgICwiS0JfYXBvc3Ryb3BoZSJ9LAotICAgIHtLQl9aICAgICAgICAgICAgICAgICAgICwiS0JfWiJ9LAotICAgIHtLQl9YICAgICAgICAgICAgICAgICAgICwiS0JfWCJ9LAotICAgIHtLQl9DICAgICAgICAgICAgICAgICAgICwiS0JfQyJ9LAotICAgIHtLQl9WICAgICAgICAgICAgICAgICAgICwiS0JfViJ9LAotICAgIHtLQl9CICAgICAgICAgICAgICAgICAgICwiS0JfQiJ9LAotICAgIHtLQl9OICAgICAgICAgICAgICAgICAgICwiS0JfTiJ9LAotICAgIHtLQl9NICAgICAgICAgICAgICAgICAgICwiS0JfTSJ9LAotICAgIHtLQl9jb21tYSAgICAgICAgICAgICAgICwiS0JfY29tbWEifSwKLSAgICB7S0JfcGVyaW9kICAgICAgICAgICAgICAsIktCX3BlcmlvZCJ9LAotICAgIHtLQl9kaXZpZGUgICAgICAgICAgICAgICwiS0JfZGl2aWRlIn0sCi0gICAge0tCX3NwYWNlICAgICAgICAgICAgICAgLCJLQl9zcGFjZSJ9LAotICAgIHtLQl90aWxkZSAgICAgICAgICAgICAgICwiS0JfdGlsZGUifSwKLSAgICB7MCAgICAgICAgICAgICAgICAgICAgICAsIktCX3Vua25vd24ifSwKLSAgICB9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXggICAtIFggY29vcmRpbmF0ZSBvZiB0aGUgbW91c2UgY3Vyc29yIHBvc2l0aW9uIChzY3JlZW4gY29vcmRpbmF0ZXMpCi15ICAgLSBZIGNvb3JkaW5hdGUgb2YgdGhlIG1vdXNlIGN1cnNvciBwb3NpdGlvbiAoc2NyZWVuIGNvb3JkaW5hdGVzKQotCi1SRU1BUktTOgotVGhpcyBnZXRzIGNhbGxlZCBwZXJpb2RpY2FsbHkgdG8gbW92ZSB0aGUgbW91c2UuIEl0IHdpbGwgZ2V0IGNhbGxlZCB3aGVuCi10aGUgbW91c2UgbWF5IG5vdCBoYXZlIGFjdHVhbGx5IG1vdmVkLCBzbyBjaGVjayBpZiBpdCBoYXMgYmVmb3JlIHJlZHJhd2luZwotaXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgbW92ZU1vdXNlKAotICAgIGludCB4LAotICAgIGludCB5KQotewotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWNvZGUgICAgLSBDb2RlIHRvIHRyYW5zbGF0ZQota2V5cyAgICAtIFRhYmxlIG9mIHRyYW5zbGF0aW9uIGtleSB2YWx1ZXMgdG8gbG9vayB1cAotCi1SRU1BUktTOgotU2ltcGxlIGZ1bmN0aW9uIHRvIGxvb2sgdXAgdGhlIHByaW50YWJsZSBuYW1lIGZvciB0aGUga2V5Ym9hcmQgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1LZXlFbnRyeSAqRmluZEtleSgKLSAgICBpbnQgY29kZSwKLSAgICBLZXlFbnRyeSAqa2V5cykKLXsKLSAgICBLZXlFbnRyeSAgICAqa2V5OwotCi0gICAgZm9yIChrZXkgPSBrZXlzOyBrZXktPmNvZGUgIT0gMDsga2V5KyspIHsKLQlpZiAoa2V5LT5jb2RlID09IGNvZGUpCi0JICAgIGJyZWFrOwotCX0KLSAgICByZXR1cm4ga2V5OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWV2dCAtIEV2ZW50IHRvIGRpc3BsYXkgbW9kaWZpZXJzIGZvcgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZGlzcGxheSBzaGlmdCBtb2RpZmllcnMgZmxhZ3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIERpc3BsYXlNb2RpZmllcnMoCi0gICAgZXZlbnRfdCAqZXZ0KQotewotICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9MRUZUQlVUKQotCXByaW50ZigiLCBMQlVUIik7Ci0gICAgaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX1JJR0hUQlVUKQotCXByaW50ZigiLCBSQlVUIik7Ci0gICAgaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX01JRERMRUJVVCkKLQlwcmludGYoIiwgTUJVVCIpOwotICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9TSElGVEtFWSkgewotCWlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9MRUZUU0hJRlQpCi0JICAgIHByaW50ZigiLCBMU0hJRlQiKTsKLQlpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfUklHSFRTSElGVCkKLQkgICAgcHJpbnRmKCIsIFJTSElGVCIpOwotCX0KLSAgICBpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfQ1RSTFNUQVRFKSB7Ci0JaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX0xFRlRDVFJMKQotCSAgICBwcmludGYoIiwgTENUUkwiKTsKLQlpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfUklHSFRDVFJMKQotCSAgICBwcmludGYoIiwgUkNUUkwiKTsKLQl9Ci0gICAgaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX0FMVFNUQVRFKSB7Ci0JaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX0xFRlRBTFQpCi0JICAgIHByaW50ZigiLCBMQUxUIik7Ci0JaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX1JJR0hUQUxUKQotCSAgICBwcmludGYoIiwgUkFMVCIpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tc2cgLSBNZXNzYWdlIHRvIGRpc3BsYXkgZm9yIHR5cGUgb2YgZXZlbnQKLWV2dCAtIEV2ZW50IHRvIGRpc3BsYXkKLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIHN0YXR1cyBvZiB0aGUga2V5Ym9hcmQgZXZlbnQgdG8gdGhlIHNjcmVlbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIERpc3BsYXlLZXkoCi0gICAgY2hhciAqbXNnLAotICAgIGV2ZW50X3QgKmV2dCkKLXsKLSAgICBLZXlFbnRyeSAgICAqYXNjaWksKnNjYW47Ci0gICAgY2hhciAgICAgICAgY2ggPSBFVlRfYXNjaWlDb2RlKGV2dC0+bWVzc2FnZSk7Ci0KLSAgICBhc2NpaSA9IEZpbmRLZXkoY2gsQVNDSUlDb2Rlcyk7Ci0gICAgc2NhbiA9IEZpbmRLZXkoRVZUX3NjYW5Db2RlKGV2dC0+bWVzc2FnZSksU2NhbkNvZGVzKTsKLSAgICBwcmludGYoIiVzOiAweCUwNFggLT4gJXMsICVzLCAnJWMnIiwKLQltc2csIChpbnQpZXZ0LT5tZXNzYWdlICYgMHhGRkZGLCBzY2FuLT5uYW1lLCBhc2NpaS0+bmFtZSwgaXNwcmludChjaCkgPyBjaCA6ICcgJyk7Ci0gICAgRGlzcGxheU1vZGlmaWVycyhldnQpOwotICAgIHByaW50ZigiXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tc2cgLSBNZXNzYWdlIHRvIGRpc3BsYXkgZm9yIHR5cGUgb2YgZXZlbnQKLWV2dCAtIEV2ZW50IHRvIGRpc3BsYXkKLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIHN0YXR1cyBvZiB0aGUgbW91c2UgZXZlbnQgdG8gdGhlIHNjcmVlbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIERpc3BsYXlNb3VzZSgKLSAgICBjaGFyICptc2csCi0gICAgZXZlbnRfdCAqZXZ0KQotewotICAgIHByaW50ZigiJXM6ICIsIG1zZyk7Ci0gICAgaWYgKGV2dC0+bWVzc2FnZSAmIEVWVF9MRUZUQk1BU0spCi0JcHJpbnRmKCJMRUZUICIpOwotICAgIGlmIChldnQtPm1lc3NhZ2UgJiBFVlRfUklHSFRCTUFTSykKLQlwcmludGYoIlJJR0hUICIpOwotICAgIGlmIChldnQtPm1lc3NhZ2UgJiBFVlRfTUlERExFQk1BU0spCi0JcHJpbnRmKCJNSURETEUgIik7Ci0gICAgcHJpbnRmKCJhYnMoJWQsJWQpLCByZWwoJWQsJWQpIiwgZXZ0LT53aGVyZV94LCBldnQtPndoZXJlX3ksIGV2dC0+cmVsYXRpdmVfeCwgZXZ0LT5yZWxhdGl2ZV95KTsKLSAgICBEaXNwbGF5TW9kaWZpZXJzKGV2dCk7Ci0gICAgaWYgKGV2dC0+bWVzc2FnZSAmIEVWVF9EQkxDTElDSykKLQlwcmludGYoIiwgREJMQ0xJQ0siKTsKLSAgICBwcmludGYoIlxuIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbXNnIC0gTWVzc2FnZSB0byBkaXNwbGF5IGZvciB0eXBlIG9mIGV2ZW50Ci1ldnQgLSBFdmVudCB0byBkaXNwbGF5Ci0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBkaXNwbGF5IHRoZSBzdGF0dXMgb2YgdGhlIGpveXN0aWNrIGV2ZW50IHRvIHRoZSBzY3JlZW4uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBEaXNwbGF5Sm95KAotICAgIGNoYXIgKm1zZywKLSAgICBldmVudF90ICpldnQpCi17Ci0gICAgcHJpbnRmKCIlczogSm95MSglNGQsJTRkLCVjJWMpLCBKb3kyKCU0ZCwlNGQsJWMlYylcbiIsIG1zZywKLQlldnQtPndoZXJlX3gsZXZ0LT53aGVyZV95LAotCShldnQtPm1lc3NhZ2UgJiBFVlRfSk9ZMV9CVVRUT05BKSA/ICdBJyA6ICdhJywKLQkoZXZ0LT5tZXNzYWdlICYgRVZUX0pPWTFfQlVUVE9OQikgPyAnQicgOiAnYicsCi0JZXZ0LT5yZWxhdGl2ZV94LGV2dC0+cmVsYXRpdmVfeSwKLQkoZXZ0LT5tZXNzYWdlICYgRVZUX0pPWTJfQlVUVE9OQSkgPyAnQScgOiAnYScsCi0JKGV2dC0+bWVzc2FnZSAmIEVWVF9KT1kyX0JVVFRPTkIpID8gJ0InIDogJ2InKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Kb3lzdGljayBjYWxpYnJhdGlvbiByb3V0aW5lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBDYWxpYnJhdGVKb3kodm9pZCkKLXsKLSAgZXZlbnRfdCBldnQ7Ci0gIGlmKEVWVF9qb3lJc1ByZXNlbnQoKSl7Ci0gICAgcHJpbnRmKCJKb3lzdGljayBDYWxpYnJhdGlvblxuTW92ZSB0aGUgam95c3RpY2sgdG8gdGhlIHVwcGVyIGxlZnQgY29ybmVyIGFuZCBwcmVzcyBhbnkgYnV0dG9uLlxuIik7Ci0gICAgRVZUX2hhbHQoJmV2dCwgRVZUX0pPWUNMSUNLKTsKLSAgICBFVlRfaGFsdCgmZXZ0LCBFVlRfSk9ZQ0xJQ0spOwotICAgIEVWVF9qb3lTZXRVcHBlckxlZnQoKTsKLSAgICBwcmludGYoIk1vdmUgdGhlIGpveXN0aWNrIHRvIHRoZSBsb3dlciByaWdodCBjb3JuZXIgYW5kIHByZXNzIGFueSBidXR0b24uXG4iKTsKLSAgICBFVlRfaGFsdCgmZXZ0LCBFVlRfSk9ZQ0xJQ0spOwotICAgIEVWVF9oYWx0KCZldnQsIEVWVF9KT1lDTElDSyk7Ci0gICAgRVZUX2pveVNldExvd2VyUmlnaHQoKTsKLSAgICBwcmludGYoIk1vdmUgdGhlIGpveXN0aWNrIHRvIGNlbnRlciBwb3NpdGlvbiBhbmQgcHJlc3MgYW55IGJ1dHRvbi5cbiIpOwotICAgIEVWVF9oYWx0KCZldnQsIEVWVF9KT1lDTElDSyk7Ci0gICAgRVZUX2hhbHQoJmV2dCwgRVZUX0pPWUNMSUNLKTsKLSAgICBFVlRfam95U2V0Q2VudGVyKCk7Ci0gICAgcHJpbnRmKCJKb3lzdGljayBjYWxpYnJhdGVkXG4iKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1haW4gcHJvZ3JhbSBlbnRyeSBwb2ludAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtYWluKHZvaWQpCi17Ci0gICAgZXZlbnRfdCAgICAgZXZ0OwotICAgIGlib29sICAgICAgIGRvbmUgPSBmYWxzZTsKLSAgICBQTV9IV05EICAgICBod25kQ29uc29sZTsKLQotICAgIGh3bmRDb25zb2xlID0gUE1fb3BlbkNvbnNvbGUoMCwwLDAsMCwwLHRydWUpOwotICAgIEVWVF9pbml0KCZtb3ZlTW91c2UpOwotICAgIEVWVF9zZXRNb3VzZVJhbmdlKDEwMjQsNzY4KTsKLSAgICBDYWxpYnJhdGVKb3koKTsKLSAgICBkbyB7Ci0JRVZUX3BvbGxKb3lzdGljaygpOwotCWlmIChFVlRfZ2V0TmV4dCgmZXZ0LEVWVF9FVkVSWUVWVCkpIHsKLQkgICAgc3dpdGNoIChldnQud2hhdCkgewotCQljYXNlIEVWVF9LRVlET1dOOgotCQkgICAgRGlzcGxheUtleSgiRVZUX0tFWURPV04gICIsICZldnQpOwotCQkgICAgaWYgKEVWVF9zY2FuQ29kZShldnQubWVzc2FnZSkgPT0gS0JfZXNjKQotCQkJZG9uZSA9IHRydWU7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBFVlRfS0VZUkVQRUFUOgotCQkgICAgRGlzcGxheUtleSgiRVZUX0tFWVJFUEVBVCIsICZldnQpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgRVZUX0tFWVVQOgotCQkgICAgRGlzcGxheUtleSgiRVZUX0tFWVVQICAgICIsICZldnQpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgRVZUX01PVVNFRE9XTjoKLQkJICAgIERpc3BsYXlNb3VzZSgiRVZUX01PVVNFRE9XTiIsICZldnQpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgRVZUX01PVVNFQVVUTzoKLQkJICAgIERpc3BsYXlNb3VzZSgiRVZUX01PVVNFQVVUTyIsICZldnQpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgRVZUX01PVVNFVVA6Ci0JCSAgICBEaXNwbGF5TW91c2UoIkVWVF9NT1VTRVVQICAiLCAmZXZ0KTsKLQkJICAgIGJyZWFrOwotCQljYXNlIEVWVF9NT1VTRU1PVkU6Ci0JCSAgICBEaXNwbGF5TW91c2UoIkVWVF9NT1VTRU1PVkUiLCAmZXZ0KTsKLQkJICAgIGJyZWFrOwotCQljYXNlIEVWVF9KT1lDTElDSzoKLQkJICAgIERpc3BsYXlKb3koIkVWVF9KT1lDTElDSyAiLCAmZXZ0KTsKLQkJICAgIGJyZWFrOwotCQljYXNlIEVWVF9KT1lNT1ZFOgotCQkgICAgRGlzcGxheUpveSgiRVZUX0pPWU1PVkUgICIsICZldnQpOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0gd2hpbGUgKCFkb25lKTsKLSAgICBFVlRfZXhpdCgpOwotICAgIFBNX2Nsb3NlQ29uc29sZShod25kQ29uc29sZSk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9pc3Zlc2EuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2lzdmVzYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2FkMjQ1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2lzdmVzYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBhbGxvY2F0ZSByZWFsIG1vZGUKLSogICAgICAgICAgICAgICBtZW1vcnkgYW5kIHRvIGNhbGwgcmVhbCBtb2RlIGludGVycnVwdCBoYW5kbGVycyBzdWNoIGFzCi0qICAgICAgICAgICAgICAgdGhlIFZFU0EgVkJFIEJJT1MgZnJvbSBwcm90ZWN0ZWQgbW9kZS4gQ29tcGlsZSBhbmQgbGluawotKiAgICAgICAgICAgICAgIHdpdGggdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmQgbGluZSBmb3IgeW91ciBET1MgZXh0ZW5kZXIuCi0qCi0qICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9nZXRWRVNBQnVmKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX21hcFJlYWxQb2ludGVyKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2ludDg2eCgpCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi0vKiBTdXBlclZHQSBpbmZvcm1hdGlvbiBibG9jayAqLwotCi0jcHJhZ21hIHBhY2soMSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgICAgVkVTQVNpZ25hdHVyZVs0XTsgICAgICAgLyogJ1ZFU0EnIDQgYnl0ZSBzaWduYXR1cmUgICAgICAgICAgKi8KLSAgICBzaG9ydCAgIFZFU0FWZXJzaW9uOyAgICAgICAgICAgIC8qIFZCRSB2ZXJzaW9uIG51bWJlciAgICAgICAgICAgICAgICovCi0gICAgdWxvbmcgICBPRU1TdHJpbmdQdHI7ICAgICAgICAgICAvKiBGYXIgcG9pbnRlciB0byBPRU0gc3RyaW5nICAgICAgICAqLwotICAgIHVsb25nICAgQ2FwYWJpbGl0aWVzOyAgICAgICAgICAgLyogQ2FwYWJpbGl0aWVzIG9mIHZpZGVvIGNhcmQgICAgICAgKi8KLSAgICB1bG9uZyAgIFZpZGVvTW9kZVB0cjsgICAgICAgICAgIC8qIEZhciBwb2ludGVyIHRvIHN1cHBvcnRlZCBtb2RlcyAgICovCi0gICAgc2hvcnQgICBUb3RhbE1lbW9yeTsgICAgICAgICAgICAvKiBOdW1iZXIgb2YgNjRrYiBtZW1vcnkgYmxvY2tzICAgICAqLwotICAgIGNoYXIgICAgcmVzZXJ2ZWRbMjM2XTsgICAgICAgICAgLyogUGFkIHRvIDI1NiBieXRlIGJsb2NrIHNpemUgICAgICAgKi8KLSAgICB9IFZnYUluZm9CbG9jazsKLQotI3ByYWdtYSBwYWNrKCkKLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBSTVJFR1MgICAgICAgICAgcmVnczsKLSAgICBSTVNSRUdTICAgICAgICAgc3JlZ3M7Ci0gICAgVmdhSW5mb0Jsb2NrICAgIHZnYUluZm87Ci0gICAgdXNob3J0ICAgICAgICAgICptb2RlOwotICAgIHVpbnQgICAgICAgICAgICB2Z0xlbjsKLSAgICB1Y2hhciAgICAgICAgICAgKnZnUHRyOwotICAgIHVuc2lnbmVkICAgICAgICByX3Znc2VnLHJfdmdvZmY7Ci0KLSAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKLSAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKLQljYXNlIFBNX3JlYWxNb2RlOgotCSAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMjg2OgotCSAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMzg2OgotCSAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIC8qIEFsbG9jYXRlIGEgMjU2IGJ5dGUgYmxvY2sgb2YgcmVhbCBtZW1vcnkgZm9yIGNvbW11bmljYXRpbmcgd2l0aAotICAgICAqIHRoZSBWRVNBIEJJT1MuCi0gICAgICovCi0gICAgaWYgKCh2Z1B0ciA9IFBNX2dldFZFU0FCdWYoJnZnTGVuLCZyX3Znc2VnLCZyX3Znb2ZmKSkgPT0gTlVMTCkgewotCXByaW50ZigiVW5hYmxlIHRvIGFsbG9jYXRlIFZFU0EgbWVtb3J5IGJ1ZmZlciFcbiIpOwotCWV4aXQoMSk7Ci0JfQotCi0gICAgLyogQ2FsbCB0aGUgVkVTQSBWQkUgdG8gc2VlIGlmIGl0IGlzIG91dCB0aGVyZSAqLwotICAgIHJlZ3MueC5heCA9IDB4NEYwMDsKLSAgICByZWdzLnguZGkgPSByX3Znb2ZmOwotICAgIHNyZWdzLmVzID0gcl92Z3NlZzsKLSAgICBtZW1jcHkodmdQdHIsIlZCRTIiLDQpOwotICAgIFBNX2ludDg2eCgweDEwLCAmcmVncywgJnJlZ3MsICZzcmVncyk7Ci0gICAgbWVtY3B5KCZ2Z2FJbmZvLHZnUHRyLHNpemVvZihWZ2FJbmZvQmxvY2spKTsKLSAgICBpZiAocmVncy54LmF4ID09IDB4NEYgJiYgc3RybmNtcCh2Z2FJbmZvLlZFU0FTaWduYXR1cmUsIlZFU0EiLDQpID09IDApIHsKLQlwcmludGYoIlZFU0EgVkJFIHZlcnNpb24gJWQuJWQgQklPUyBkZXRlY3RlZFxuXG4iLAotCSAgICB2Z2FJbmZvLlZFU0FWZXJzaW9uID4+IDgsIHZnYUluZm8uVkVTQVZlcnNpb24gJiAweEYpOwotCXByaW50ZigiQXZhaWxhYmxlIHZpZGVvIG1vZGVzOlxuIik7Ci0JbW9kZSA9IFBNX21hcFJlYWxQb2ludGVyKHZnYUluZm8uVmlkZW9Nb2RlUHRyID4+IDE2LCB2Z2FJbmZvLlZpZGVvTW9kZVB0ciAmIDB4RkZGRik7Ci0Jd2hpbGUgKCptb2RlICE9IDB4RkZGRikgewotCSAgICBwcmludGYoIiAgICAlMDRoWGggKCUwOFgpXG4iLCAqbW9kZSwgKGludCltb2RlKTsKLQkgICAgbW9kZSsrOwotCSAgICB9Ci0JfQotICAgIGVsc2UKLQlwcmludGYoIlZFU0EgVkJFIG5vdCBmb3VuZFxuIik7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9rZXkuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2tleS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmE4ODg1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2tleS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwgYSBDIGJhc2VkCi0qICAgICAgICAgICAgICAga2V5Ym9hcmQgaW50ZXJydXB0IGhhbmRsZXIuCi0qCi0qICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9zZXRLZXlIYW5kbGVyKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2NoYWluUHJldktleSgpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9yZXN0b3JlS2V5SGFuZGxlcigpCi0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi12b2xhdGlsZSBsb25nIGNvdW50ID0gMDsKLQotI3ByYWdtYSBvZmYgKGNoZWNrX3N0YWNrKSAgICAgICAgICAgLyogTm8gc3RhY2sgY2hlY2tpbmcgdW5kZXIgV2F0Y29tICAgKi8KLQotdm9pZCBQTUFQSSBrZXlIYW5kbGVyKHZvaWQpCi17Ci0gICAgY291bnQrKzsKLSAgICBQTV9jaGFpblByZXZLZXkoKTsgIC8qIENoYWluIHRvIHByZXZpb3VzIGhhbmRsZXIgICAgKi8KLX0KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBpbnQgICAgICAgICAgICAgY2g7Ci0gICAgUE1fbG9ja0hhbmRsZSAgIGxoOwotCi0gICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7Ci0gICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7Ci0JY2FzZSBQTV9yZWFsTW9kZToKLQkgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzI4NjoKLQkgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzM4NjoKLQkgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICAvKiBJbnN0YWxsIG91ciB0aW1lciBoYW5kbGVyIGFuZCBsb2NrIGhhbmRsZXIgcGFnZXMgaW4gbWVtb3J5LiBJdCBpcwotICAgICAqIGRpZmZpY3VsdCB0byBnZXQgdGhlIHNpemUgb2YgYSBmdW5jdGlvbiBpbiBDLCBidXQgd2Uga25vdyBvdXIKLSAgICAgKiBmdW5jdGlvbiBpcyB3ZWxsIGxlc3MgdGhhbiAxMDAgYnl0ZXMgKGFuZCBhbiBlbnRpcmUgNGsgcGFnZSB3aWxsCi0gICAgICogbmVlZCB0byBiZSBsb2NrZWQgYnkgdGhlIHNlcnZlciBhbnl3YXkpLgotICAgICAqLwotICAgIFBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilrZXlIYW5kbGVyLDEwMCwmbGgpOwotICAgIFBNX2xvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7Ci0gICAgUE1faW5zdGFsbEJyZWFrSGFuZGxlcigpOyAgICAgICAgICAgLyogV2UgKkRPTlQqIHdhbnQgQ3RybC1CcmVha3MhICovCi0gICAgUE1fc2V0S2V5SGFuZGxlcihrZXlIYW5kbGVyKTsKLSAgICBwcmludGYoIktleWJvYXJkIGludGVycnVwdCBoYW5kbGVyIGluc3RhbGxlZCAtIFR5cGUgc29tZSBjaGFyYWN0ZXJzIGFuZFxuIik7Ci0gICAgcHJpbnRmKCJoaXQgRVNDIHRvIGV4aXRcbiIpOwotICAgIHdoaWxlICgoY2ggPSBQTV9nZXRjaCgpKSAhPSAweDFCKSB7Ci0JcHJpbnRmKCIlYyIsIGNoKTsKLQlmZmx1c2goc3Rkb3V0KTsKLQl9Ci0KLSAgICBQTV9yZXN0b3JlS2V5SGFuZGxlcigpOwotICAgIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIoKTsKLSAgICBQTV91bmxvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7Ci0gICAgUE1fdW5sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpa2V5SGFuZGxlciwxMDAsJmxoKTsKLSAgICBwcmludGYoIlxuXG5LZXlib2FyZCBoYW5kbGVyIHdhcyBjYWxsZWQgJWxkIHRpbWVzXG4iLCBjb3VudCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9rZXkxNS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMva2V5MTUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiOTRiZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9rZXkxNS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwgYSBDIGJhc2VkCi0qICAgICAgICAgICAgICAga2V5Ym9hcmQgSW50IDE1aCBpbnRlcnJ1cHQgaGFuZGxlci4gVGhpcyBpcyBhbiBhbHRlcm5hdGUKLSogICAgICAgICAgICAgICB3YXkgdG8gaW50ZXJjZXB0IHNjYW5jb2RlcyBmcm9tIHRoZSBrZXlib2FyZCBieSBob29raW5nCi0qICAgICAgICAgICAgICAgdGhlIEludCAxNWgga2V5Ym9hcmQgaW50ZXJjZXB0IGNhbGxvdXQuCi0qCi0qICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9zZXRLZXkxNUhhbmRsZXIoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fcmVzdG9yZUtleTE1SGFuZGxlcigpCi0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi12b2xhdGlsZSBsb25nIGNvdW50ID0gMDsKLXZvbGF0aWxlIHNob3J0IGxhc3RTY2FuQ29kZSA9IDA7Ci0KLSNwcmFnbWEgb2ZmIChjaGVja19zdGFjaykgICAgICAgICAgIC8qIE5vIHN0YWNrIGNoZWNraW5nIHVuZGVyIFdhdGNvbSAgICovCi0KLXNob3J0IFBNQVBJIGtleUhhbmRsZXIoc2hvcnQgc2NhbkNvZGUpCi17Ci0gICAgY291bnQrKzsKLSAgICBsYXN0U2NhbkNvZGUgPSBzY2FuQ29kZTsKLSAgICByZXR1cm4gc2NhbkNvZGU7ICAgICAgICAgICAgLyogTGV0IEJJT1MgcHJvY2VzcyBhcyBub3JtYWwgKi8KLX0KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBpbnQgICAgICAgICAgICAgY2g7Ci0gICAgUE1fbG9ja0hhbmRsZSAgIGxoOwotCi0gICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7Ci0gICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7Ci0JY2FzZSBQTV9yZWFsTW9kZToKLQkgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzI4NjoKLQkgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzM4NjoKLQkgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICAvKiBJbnN0YWxsIG91ciB0aW1lciBoYW5kbGVyIGFuZCBsb2NrIGhhbmRsZXIgcGFnZXMgaW4gbWVtb3J5LiBJdCBpcwotICAgICAqIGRpZmZpY3VsdCB0byBnZXQgdGhlIHNpemUgb2YgYSBmdW5jdGlvbiBpbiBDLCBidXQgd2Uga25vdyBvdXIKLSAgICAgKiBmdW5jdGlvbiBpcyB3ZWxsIGxlc3MgdGhhbiAxMDAgYnl0ZXMgKGFuZCBhbiBlbnRpcmUgNGsgcGFnZSB3aWxsCi0gICAgICogbmVlZCB0byBiZSBsb2NrZWQgYnkgdGhlIHNlcnZlciBhbnl3YXkpLgotICAgICAqLwotICAgIFBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilrZXlIYW5kbGVyLDEwMCwmbGgpOwotICAgIFBNX2xvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7Ci0gICAgUE1faW5zdGFsbEJyZWFrSGFuZGxlcigpOyAgICAgICAvKiBXZSAqRE9OVCogd2FudCBDdHJsLUJyZWFrJ3MhICovCi0gICAgUE1fc2V0S2V5MTVIYW5kbGVyKGtleUhhbmRsZXIpOwotICAgIHByaW50ZigiS2V5Ym9hcmQgaW50ZXJydXB0IGhhbmRsZXIgaW5zdGFsbGVkIC0gVHlwZSBzb21lIGNoYXJhY3RlcnMgYW5kXG4iKTsKLSAgICBwcmludGYoImhpdCBFU0MgdG8gZXhpdFxuIik7Ci0gICAgd2hpbGUgKChjaCA9IFBNX2dldGNoKCkpICE9IDB4MUIpIHsKLQlwcmludGYoIiVjIiwgY2gpOwotCWZmbHVzaChzdGRvdXQpOwotCX0KLQotICAgIFBNX3Jlc3RvcmVLZXkxNUhhbmRsZXIoKTsKLSAgICBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKCk7Ci0gICAgUE1fdW5sb2NrRGF0YVBhZ2VzKCh2b2lkKikmY291bnQsc2l6ZW9mKGNvdW50KSwmbGgpOwotICAgIFBNX3VubG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKWtleUhhbmRsZXIsMTAwLCZsaCk7Ci0gICAgcHJpbnRmKCJcblxuS2V5Ym9hcmQgaGFuZGxlciB3YXMgY2FsbGVkICVsZCB0aW1lc1xuIiwgY291bnQpOwotICAgIHByaW50ZigiTGFzdCBzY2FuIGNvZGUgJTA0WFxuIiwgbGFzdFNjYW5Db2RlKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL21lbXRlc3QuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL21lbXRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjNjU1Yi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9tZW10ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGRldGVybWluZSBqdXN0IGhvdyBtdWNoIG1lbW9yeSBjYW4gYmUKLSogICAgICAgICAgICAgICBhbGxvY2F0ZWQgd2l0aCB0aGUgY29tcGlsZXIgaW4gdXNlLiBDb21waWxlIGFuZCBsaW5rCi0qICAgICAgICAgICAgICAgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29tbWFuZCBsaW5lIGZvciB5b3VyIERPUyBleHRlbmRlci4KLSoKLSogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFBNX21hbGxvYygpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9hdmFpbGFibGVNZW1vcnkoKQotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLSNpZmRlZiAgX18xNkJJVF9fCi0jZGVmaW5lIE1BWEFMTE9DICAgIDY0Ci0jZWxzZQotI2RlZmluZSBNQVhBTExPQyAgICAyMDAwCi0jZW5kaWYKLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBpbnQgICAgIGk7Ci0gICAgdWxvbmcgICBhbGxvY3M7Ci0gICAgdWxvbmcgICBwaHlzaWNhbCx0b3RhbDsKLSAgICBjaGFyICAgICpwLCpwYVtNQVhBTExPQ107Ci0KLSAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKLSAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKLQljYXNlIFBNX3JlYWxNb2RlOgotCSAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMjg2OgotCSAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMzg2OgotCSAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIHByaW50ZigiTWVtb3J5IGF2YWlsYWJsZSBhdCBzdGFydDpcbiIpOwotICAgIFBNX2F2YWlsYWJsZU1lbW9yeSgmcGh5c2ljYWwsJnRvdGFsKTsKLSAgICBwcmludGYoIiAgIFBoeXNpY2FsIG1lbW9yeTogICAgICAgICAgICVsZCBLYlxuIiwgcGh5c2ljYWwgLyAxMDI0KTsKLSAgICBwcmludGYoIiAgIFRvdGFsIChpbmNsdWRpbmcgdmlydHVhbCk6ICVsZCBLYlxuIiwgdG90YWwgLyAxMDI0KTsKLSAgICBwcmludGYoIlxuIik7Ci0gICAgZm9yIChhbGxvY3MgPSBpID0gMDsgaSA8IE1BWEFMTE9DOyBpKyspIHsKLQlpZiAoKHBhW2ldID0gUE1fbWFsbG9jKDEwKjEwMjQpKSAhPSAwKSB7ICAgIC8qIGluIDEwayBibG9ja3MgICAgKi8KLQkgICAgcCA9IHBhW2FsbG9jc107Ci0JICAgIG1lbXNldChwLCAwLCAxMCoxMDI0KTsgLyogdG91Y2ggZXZlcnkgYnl0ZSAgICAgICAgICAgICAgKi8KLQkgICAgKnAgPSAneCc7ICAgICAgICAgICAvKiBkbyBzb21ldGhpbmcsIGFueXRoaW5nIHdpdGggICAgICAqLwotCSAgICBwWzEwMjNdID0gJ3knOyAgICAgIC8qIHRoZSBhbGxvY2F0ZWQgbWVtb3J5ICAgICAgICAgICAgICovCi0JICAgIGFsbG9jcysrOwotCSAgICBwcmludGYoIkFsbG9jYXRlZCAlbHUgYnl0ZXNcciIsIDEwKihhbGxvY3MgPDwgMTApKTsKLQkgICAgfQotCWVsc2UgYnJlYWs7Ci0JaWYgKFBNX2tiaGl0KCkgJiYgKFBNX2dldGNoKCkgPT0gMHgxQikpCi0JICAgIGJyZWFrOwotCX0KLQotICAgIHByaW50ZigiXG5cbkFsbG9jYXRlZCB0b3RhbCBvZiAlbHUgYnl0ZXNcbiIsIDEwICogKGFsbG9jcyA8PCAxMCkpOwotCi0gICAgcHJpbnRmKCJcbk1lbW9yeSBhdmFpbGFibGUgYXQgZW5kOlxuIik7Ci0gICAgUE1fYXZhaWxhYmxlTWVtb3J5KCZwaHlzaWNhbCwmdG90YWwpOwotICAgIHByaW50ZigiICAgUGh5c2ljYWwgbWVtb3J5OiAgICAgICAgICAgJWxkIEtiXG4iLCBwaHlzaWNhbCAvIDEwMjQpOwotICAgIHByaW50ZigiICAgVG90YWwgKGluY2x1ZGluZyB2aXJ0dWFsKTogJWxkIEtiXG4iLCB0b3RhbCAvIDEwMjQpOwotCi0gICAgZm9yIChpID0gYWxsb2NzLTE7IGkgPj0gMDsgaS0tKQotCVBNX2ZyZWUocGFbaV0pOwotCi0gICAgcHJpbnRmKCJcbk1lbW9yeSBhdmFpbGFibGUgYWZ0ZXIgZnJlZWluZyBhbGwgYmxvY2tzIChub3RlIHRoYXQgdW5kZXIgcHJvdGVjdGVkIG1vZGVcbiIpOwotICAgIHByaW50ZigidGhpcyB3aWxsIG1vc3QgbGlrZWx5IG5vdCBiZSBjb3JyZWN0IGFmdGVyIGZyZWVpbmcgYmxvY2tzKTpcblxuIik7Ci0gICAgUE1fYXZhaWxhYmxlTWVtb3J5KCZwaHlzaWNhbCwmdG90YWwpOwotICAgIHByaW50ZigiICAgUGh5c2ljYWwgbWVtb3J5OiAgICAgICAgICAgJWxkIEtiXG4iLCBwaHlzaWNhbCAvIDEwMjQpOwotICAgIHByaW50ZigiICAgVG90YWwgKGluY2x1ZGluZyB2aXJ0dWFsKTogJWxkIEtiXG4iLCB0b3RhbCAvIDEwMjQpOwotCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9tb3VzZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvbW91c2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc2NWEwZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9tb3VzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBpbnN0YWxsIGFuIGFzc2VtYmx5Ci0qICAgICAgICAgICAgICAgbGFuZ3VhZ2UgbW91c2UgaW50ZXJydXB0IGhhbmRsZXIuIFdlIHVzZSBhc3NlbWJseSBsYW5ndWFnZQotKiAgICAgICAgICAgICAgIGFzIGl0IG11c3QgYmUgYSBmYXIgZnVuY3Rpb24gYW5kIHNob3VsZCBzd2FwIHRvIGEgbG9jYWwKLSogICAgICAgICAgICAgICAzMiBiaXQgc3RhY2sgaWYgaXQgaXMgZ29pbmcgdG8gY2FsbCBhbnkgQyBiYXNlZCBjb2RlICh3aGljaAotKiAgICAgICAgICAgICAgIHdlIGRvIGluIHRoaXMgZXhhbXBsZSkuCi0qCi0qICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9pbnN0YWxsTW91c2VIYW5kbGVyKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2ludDg2KCkKLSoKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLXZvbGF0aWxlIGxvbmcgY291bnQgPSAwOwotCi0jcHJhZ21hIG9mZiAoY2hlY2tfc3RhY2spICAgICAgICAgICAvKiBObyBzdGFjayBjaGVja2luZyB1bmRlciBXYXRjb20gICAqLwotCi12b2lkIFBNQVBJIG1vdXNlSGFuZGxlcigKLSAgICB1aW50IG1hc2ssCi0gICAgdWludCBidXRzdGF0ZSwKLSAgICBpbnQgeCwKLSAgICBpbnQgeSwKLSAgICBpbnQgbWlja2V5WCwKLSAgICBpbnQgbWlja2V5WSkKLXsKLSAgICBtYXNrID0gbWFzazsgICAgICAgICAgICAgICAgLyogV2UgZG9udCB1c2UgYW55IG9mIHRoZSBwYXJhbWV0ZXJzICAgICovCi0gICAgYnV0c3RhdGUgPSBidXRzdGF0ZTsKLSAgICB4ID0geDsKLSAgICB5ID0geTsKLSAgICBtaWNrZXlYID0gbWlja2V5WDsKLSAgICBtaWNrZXlZID0gbWlja2V5WTsKLSAgICBjb3VudCsrOwotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIFJNUkVHUyAgICAgICAgICByZWdzOwotICAgIFBNX2xvY2tIYW5kbGUgICBsaDsKLQotICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOwotICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgewotCWNhc2UgUE1fcmVhbE1vZGU6Ci0JICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8yODY6Ci0JICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8zODY6Ci0JICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgcmVncy54LmF4ID0gMzM7ICAgICAvKiBNb3VzZSBmdW5jdGlvbiAzMyAtIFNvZnR3YXJlIHJlc2V0ICAgICAgICovCi0gICAgUE1faW50ODYoMHgzMywmcmVncywmcmVncyk7Ci0gICAgaWYgKHJlZ3MueC5ieCA9PSAwKSB7Ci0JcHJpbnRmKCJObyBtb3VzZSBpbnN0YWxsZWQuXG4iKTsKLQlleGl0KDEpOwotCX0KLQotICAgIC8qIEluc3RhbGwgb3VyIG1vdXNlIGhhbmRsZXIgYW5kIGxvY2sgaGFuZGxlciBwYWdlcyBpbiBtZW1vcnkuIEl0IGlzCi0gICAgICogZGlmZmljdWx0IHRvIGdldCB0aGUgc2l6ZSBvZiBhIGZ1bmN0aW9uIGluIEMsIGJ1dCB3ZSBrbm93IG91cgotICAgICAqIGZ1bmN0aW9uIGlzIHdlbGwgbGVzcyB0aGFuIDEwMCBieXRlcyAoYW5kIGFuIGVudGlyZSA0ayBwYWdlIHdpbGwKLSAgICAgKiBuZWVkIHRvIGJlIGxvY2tlZCBieSB0aGUgc2VydmVyIGFueXdheSkuCi0gICAgICovCi0gICAgUE1fbG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKW1vdXNlSGFuZGxlciwxMDAsJmxoKTsKLSAgICBQTV9sb2NrRGF0YVBhZ2VzKCh2b2lkKikmY291bnQsc2l6ZW9mKGNvdW50KSwmbGgpOwotICAgIGlmICghUE1fc2V0TW91c2VIYW5kbGVyKDB4RkZGRiwgbW91c2VIYW5kbGVyKSkgewotCXByaW50ZigiVW5hYmxlIHRvIGluc3RhbGwgbW91c2UgaGFuZGxlciFcbiIpOwotCWV4aXQoMSk7Ci0JfQotICAgIHByaW50ZigiTW91c2UgaGFuZGxlciBpbnN0YWxsZWQgLSBIaXQgYW55IGtleSB0byBleGl0XG4iKTsKLSAgICBQTV9nZXRjaCgpOwotCi0gICAgUE1fcmVzdG9yZU1vdXNlSGFuZGxlcigpOwotICAgIFBNX3VubG9ja0RhdGFQYWdlcygodm9pZCopJmNvdW50LHNpemVvZihjb3VudCksJmxoKTsKLSAgICBQTV91bmxvY2tDb2RlUGFnZXMoKF9fY29kZVB0ciltb3VzZUhhbmRsZXIsMTAwLCZsaCk7Ci0gICAgcHJpbnRmKCJNb3VzZSBoYW5kbGVyIHdhcyBjYWxsZWQgJWxkIHRpbWVzXG4iLCBjb3VudCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9yZXN0b3JlLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9yZXN0b3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMGJlNzUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvcmVzdG9yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgTGludXgvUU5YCi0qCi0qIERlc2NyaXB0aW9uOiAgUHJvZ3JhbSB0byByZXN0b3JlIHRoZSBjb25zb2xlIHN0YXRlIHN0YXRlIGZyb20gYSBwcmV2aW91c2x5Ci0qICAgICAgICAgICAgICAgc2F2ZWQgc3RhdGUgaWYgdGhlIHByb2dyYW0gY3Jhc2hlZCB3aGlsZSB0aGUgY29uc29sZQotKiAgICAgICAgICAgICAgIHdhcyBpbiBncmFwaGljcyBtb2RlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotdm9pZCBzZXRWaWRlb01vZGUoaW50IG1vZGUpCi17Ci0gICAgUk1SRUdTIHI7Ci0KLSAgICByLnguYXggPSBtb2RlOwotICAgIFBNX2ludDg2KDB4MTAsICZyLCAmcik7Ci19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgUE1fSFdORCBod25kQ29uc29sZTsKLSAgICB1bG9uZyAgIHN0YXRlU2l6ZTsKLSAgICB2b2lkICAgICpzdGF0ZUJ1ZjsKLSAgICBGSUxFICAgICpmOwotCi0gICAgLyogV3JpdGUgdGhlIHNhdmVkIGNvbnNvbGUgc3RhdGUgYnVmZmVyIHRvIGRpc2sgKi8KLSAgICBpZiAoKGYgPSBmb3BlbigiL2V0Yy9wbXNhdmUuZGF0IiwicmIiKSkgPT0gTlVMTCkgewotCXByaW50ZigiVW5hYmxlIHRvIG9wZW4gL2V0Yy9wbXNhdmUuZGF0IGZvciByZWFkaW5nIVxuIik7Ci0JcmV0dXJuIC0xOwotCX0KLSAgICBmcmVhZCgmc3RhdGVTaXplLDEsc2l6ZW9mKHN0YXRlU2l6ZSksZik7Ci0gICAgaWYgKHN0YXRlU2l6ZSAhPSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKCkpIHsKLQlwcmludGYoIlNpemUgbWlzbWF0Y2ggaW4gL2V0Yy9wbXNhdmUuZGF0IVxuIik7Ci0JcmV0dXJuIC0xOwotCX0KLSAgICBpZiAoKHN0YXRlQnVmID0gUE1fbWFsbG9jKHN0YXRlU2l6ZSkpID09IE5VTEwpIHsKLQlwcmludGYoIlVuYWJsZSB0byBhbGxvY2F0ZSBjb25zb2xlIHN0YXRlIGJ1ZmZlciFcbiIpOwotCXJldHVybiAtMTsKLQl9Ci0gICAgZnJlYWQoc3RhdGVCdWYsMSxzdGF0ZVNpemUsZik7Ci0gICAgZmNsb3NlKGYpOwotCi0gICAgLyogT3BlbiB0aGUgY29uc29sZSAqLwotICAgIGh3bmRDb25zb2xlID0gUE1fb3BlbkNvbnNvbGUoMCwwLDAsMCwwLHRydWUpOwotCi0gICAgLyogRm9yY2libHkgc2V0IDgweDI1IHRleHQgbW9kZSB1c2luZyB0aGUgQklPUyAqLwotICAgIHNldFZpZGVvTW9kZSgweDMpOwotCi0gICAgLyogUmVzdG9yZSB0aGUgcHJldmlvdXMgY29uc29sZSBzdGF0ZSAqLwotICAgIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoc3RhdGVCdWYsMCk7Ci0gICAgUE1fY2xvc2VDb25zb2xlKGh3bmRDb25zb2xlKTsKLSAgICBQTV9mcmVlKHN0YXRlQnVmKTsKLSAgICBwcmludGYoIkNvbnNvbGUgc3RhdGUgc3VjY2Vzc2Z1bGx5IHJlc3RvcmVkIGZyb20gL2V0Yy9wbXNhdmUuZGF0XG4iKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3J0Yy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvcnRjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZWY5MjIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvcnRjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbCBhIEMgYmFzZWQKLSogICAgICAgICAgICAgICBSZWFsIFRpbWUgQ2xvY2sgaW50ZXJydXB0IGhhbmRsZXIuCi0qCi0qICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcigpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIoKQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotdm9sYXRpbGUgbG9uZyBjb3VudCA9IDA7Ci0KLSNwcmFnbWEgb2ZmIChjaGVja19zdGFjaykgICAgICAgICAgIC8qIE5vIHN0YWNrIGNoZWNraW5nIHVuZGVyIFdhdGNvbSAgICovCi0KLXZvaWQgUE1BUEkgUlRDSGFuZGxlcih2b2lkKQotewotICAgIGNvdW50Kys7Ci19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgbG9uZyAgICAgICAgICAgIG9sZENvdW50OwotICAgIFBNX2xvY2tIYW5kbGUgICBsaDsKLQotICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOwotICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgewotCWNhc2UgUE1fcmVhbE1vZGU6Ci0JICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8yODY6Ci0JICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8zODY6Ci0JICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgLyogSW5zdGFsbCBvdXIgdGltZXIgaGFuZGxlciBhbmQgbG9jayBoYW5kbGVyIHBhZ2VzIGluIG1lbW9yeS4gSXQgaXMKLSAgICAgKiBkaWZmaWN1bHQgdG8gZ2V0IHRoZSBzaXplIG9mIGEgZnVuY3Rpb24gaW4gQywgYnV0IHdlIGtub3cgb3VyCi0gICAgICogZnVuY3Rpb24gaXMgd2VsbCBsZXNzIHRoYW4gMTAwIGJ5dGVzIChhbmQgYW4gZW50aXJlIDRrIHBhZ2Ugd2lsbAotICAgICAqIG5lZWQgdG8gYmUgbG9ja2VkIGJ5IHRoZSBzZXJ2ZXIgYW55d2F5KS4KLSAgICAgKi8KLSAgICBQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpUlRDSGFuZGxlciwxMDAsJmxoKTsKLSAgICBQTV9sb2NrRGF0YVBhZ2VzKCh2b2lkKikmY291bnQsc2l6ZW9mKGNvdW50KSwmbGgpOwotICAgIFBNX2luc3RhbGxCcmVha0hhbmRsZXIoKTsgICAgICAgICAgIC8qIFdlICpET05UKiB3YW50IEN0cmwtQnJlYWtzISAqLwotICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKFJUQ0hhbmRsZXIsMTI4KTsKLSAgICBwcmludGYoIlJlYWxUaW1lQ2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgaW5zdGFsbGVkIC0gSGl0IEVTQyB0byBleGl0XG4iKTsKLSAgICBvbGRDb3VudCA9IGNvdW50OwotICAgIHdoaWxlICgxKSB7Ci0JaWYgKFBNX2tiaGl0KCkgJiYgKFBNX2dldGNoKCkgPT0gMHgxQikpCi0JICAgIGJyZWFrOwotCWlmIChjb3VudCAhPSBvbGRDb3VudCkgewotCSAgICBwcmludGYoIlRpY2ssIFRvY2s6ICVsZFxuIiwgY291bnQpOwotCSAgICBvbGRDb3VudCA9IGNvdW50OwotCSAgICB9Ci0JfQotCi0gICAgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKCk7Ci0gICAgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcigpOwotICAgIFBNX3VubG9ja0RhdGFQYWdlcygodm9pZCopJmNvdW50LHNpemVvZihjb3VudCksJmxoKTsKLSAgICBQTV91bmxvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilSVENIYW5kbGVyLDEwMCwmbGgpOwotICAgIHByaW50ZigiUmVhbFRpbWVDbG9jayBoYW5kbGVyIHdhcyBjYWxsZWQgJWxkIHRpbWVzXG4iLCBjb3VudCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9zYXZlLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9zYXZlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MzI0NTYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvc2F2ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgTGludXgvUU5YCi0qCi0qIERlc2NyaXB0aW9uOiAgUHJvZ3JhbSB0byBzYXZlIHRoZSBjb25zb2xlIHN0YXRlIHN0YXRlIHNvIHRoYXQgaXQgY2FuCi0qICAgICAgICAgICAgICAgYmUgbGF0ZXIgcmVzdG9yZWQgaWYgdGhlIHByb2dyYW0gY3Jhc2hlZCB3aGlsZSB0aGUgY29uc29sZQotKiAgICAgICAgICAgICAgIHdhcyBpbiBncmFwaGljcyBtb2RlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBQTV9IV05EIGh3bmRDb25zb2xlOwotICAgIHVsb25nICAgc3RhdGVTaXplOwotICAgIHZvaWQgICAgKnN0YXRlQnVmOwotICAgIEZJTEUgICAgKmY7Ci0KLSAgICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBzYXZlIGNvbnNvbGUgc3RhdGUgYW5kIHNhdmUgdGhlIHN0YXRlICovCi0gICAgaHduZENvbnNvbGUgPSBQTV9vcGVuQ29uc29sZSgwLDAsMCwwLDAsdHJ1ZSk7Ci0gICAgc3RhdGVTaXplID0gUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSgpOwotICAgIGlmICgoc3RhdGVCdWYgPSBQTV9tYWxsb2Moc3RhdGVTaXplKSkgPT0gTlVMTCkgewotCVBNX2Nsb3NlQ29uc29sZShod25kQ29uc29sZSk7Ci0JcHJpbnRmKCJVbmFibGUgdG8gYWxsb2NhdGUgY29uc29sZSBzdGF0ZSBidWZmZXIhXG4iKTsKLQlyZXR1cm4gLTE7Ci0JfQotICAgIFBNX3NhdmVDb25zb2xlU3RhdGUoc3RhdGVCdWYsMCk7Ci0KLSAgICAvKiBSZXN0b3JlIHRoZSBjb25zb2xlIHN0YXRlIG9uIGV4aXQgKi8KLSAgICBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKHN0YXRlQnVmLDApOwotICAgIFBNX2Nsb3NlQ29uc29sZShod25kQ29uc29sZSk7Ci0KLSAgICAvKiBXcml0ZSB0aGUgc2F2ZWQgY29uc29sZSBzdGF0ZSBidWZmZXIgdG8gZGlzayAqLwotICAgIGlmICgoZiA9IGZvcGVuKCIvZXRjL3Btc2F2ZS5kYXQiLCJ3YiIpKSA9PSBOVUxMKQotCXByaW50ZigiVW5hYmxlIHRvIG9wZW4gL2V0Yy9wbXNhdmUvZGF0IGZvciB3cml0aW5nIVxuIik7Ci0gICAgZWxzZSB7Ci0JZndyaXRlKCZzdGF0ZVNpemUsMSxzaXplb2Yoc3RhdGVTaXplKSxmKTsKLQlmd3JpdGUoc3RhdGVCdWYsMSxzdGF0ZVNpemUsZik7Ci0JZmNsb3NlKGYpOwotCXByaW50ZigiQ29uc29sZSBzdGF0ZSBzdWNjZXNzZnVsbHkgc2F2ZWQgdG8gL2V0Yy9wbXNhdmUuZGF0XG4iKTsKLQl9Ci0gICAgUE1fZnJlZShzdGF0ZUJ1Zik7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9zaG93cGNpLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9zaG93cGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjc1ZTEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvc2hvd3BjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byB0ZXN0IHRoZSBQQ0kgbGlicmFyeSBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJwY2lsaWIuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50ICAgICAgICAgICAgICBOdW1QQ0kgPSAtMTsKLXN0YXRpYyBQQ0lEZXZpY2VJbmZvICAgICpQQ0k7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAqQnJpZGdlSW5kZXg7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAqRGV2aWNlSW5kZXg7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICBOdW1CcmlkZ2VzOwotc3RhdGljIFBDSURldmljZUluZm8gICAgKkFHUEJyaWRnZSA9IE5VTEw7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICBOdW1EZXZpY2VzOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUVudW1lcmF0ZXMgdGhlIFBDSSBidXMgYW5kIGR1bXBzIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0byB0aGUKLWxvZyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEVudW1lcmF0ZVBDSSh2b2lkKQotewotICAgIGludCAgICAgICAgICAgICBpLGluZGV4OwotICAgIFBDSURldmljZUluZm8gICAqaW5mbzsKLQotICAgIHByaW50ZigiRGlzcGxheWluZyBlbnVtZXJhdGlvbiBvZiBQQ0kgYnVzICglZCBkZXZpY2VzLCAlZCBkaXNwbGF5IGRldmljZXMpXG4iLAotCU51bVBDSSwgTnVtRGV2aWNlcyk7Ci0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykKLQlwcmludGYoIiAgRGlzcGxheSBkZXZpY2UgJWQgaXMgUENJIGRldmljZSAlZFxuIixpbmRleCxEZXZpY2VJbmRleFtpbmRleF0pOwotICAgIHByaW50ZigiXG4iKTsKLSAgICBwcmludGYoIkJ1cyBTbG90IEZuYyBEZXZpY2VJRCAgU3ViU3lzdGVtIFJldiBDbGFzcyBJUlEgSW50IENtZFxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IE51bVBDSTsgaSsrKSB7Ci0JcHJpbnRmKCIlMmQgICAlMmQgICUyZCAgJTA0WDolMDRYICUwNFg6JTA0WCAlMDJYICAlMDJYOiUwMlggJTAyWCAgJTAyWCAgJTA0WCAgICIsCi0JICAgIFBDSVtpXS5zbG90LnAuQnVzLAotCSAgICBQQ0lbaV0uc2xvdC5wLkRldmljZSwKLQkgICAgUENJW2ldLnNsb3QucC5GdW5jdGlvbiwKLQkgICAgUENJW2ldLlZlbmRvcklELAotCSAgICBQQ0lbaV0uRGV2aWNlSUQsCi0JICAgIFBDSVtpXS51LnR5cGUwLlN1YlN5c3RlbVZlbmRvcklELAotCSAgICBQQ0lbaV0udS50eXBlMC5TdWJTeXN0ZW1JRCwKLQkgICAgUENJW2ldLlJldklELAotCSAgICBQQ0lbaV0uQmFzZUNsYXNzLAotCSAgICBQQ0lbaV0uU3ViQ2xhc3MsCi0JICAgIFBDSVtpXS51LnR5cGUwLkludGVycnVwdExpbmUsCi0JICAgIFBDSVtpXS51LnR5cGUwLkludGVycnVwdFBpbiwKLQkgICAgUENJW2ldLkNvbW1hbmQpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKLQkgICAgaWYgKERldmljZUluZGV4W2luZGV4XSA9PSBpKQotCQlicmVhazsKLQkgICAgfQotCWlmIChpbmRleCA8IE51bURldmljZXMpCi0JICAgIHByaW50ZigiPC0gJWRcbiIsIGluZGV4KTsKLQllbHNlCi0JICAgIHByaW50ZigiXG4iKTsKLQl9Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHByaW50ZigiRGV2aWNlSUQgIFN0YXQgSWZjIENjaCBMYXQgSGRyIEJJU1RcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1QQ0k7IGkrKykgewotCXByaW50ZigiJTA0WDolMDRYICUwNFggICUwMlggICUwMlggICUwMlggICUwMlggICUwMlggICAiLAotCSAgICBQQ0lbaV0uVmVuZG9ySUQsCi0JICAgIFBDSVtpXS5EZXZpY2VJRCwKLQkgICAgUENJW2ldLlN0YXR1cywKLQkgICAgUENJW2ldLkludGVyZmFjZSwKLQkgICAgUENJW2ldLkNhY2hlTGluZVNpemUsCi0JICAgIFBDSVtpXS5MYXRlbmN5VGltZXIsCi0JICAgIFBDSVtpXS5IZWFkZXJUeXBlLAotCSAgICBQQ0lbaV0uQklTVCk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgewotCSAgICBpZiAoRGV2aWNlSW5kZXhbaW5kZXhdID09IGkpCi0JCWJyZWFrOwotCSAgICB9Ci0JaWYgKGluZGV4IDwgTnVtRGV2aWNlcykKLQkgICAgcHJpbnRmKCI8LSAlZFxuIiwgaW5kZXgpOwotCWVsc2UKLQkgICAgcHJpbnRmKCJcbiIpOwotCX0KLSAgICBwcmludGYoIlxuIik7Ci0gICAgcHJpbnRmKCJEZXZpY2VJRCAgQmFzZTEwaCAgQmFzZTE0aCAgQmFzZTE4aCAgQmFzZTFDaCAgQmFzZTIwaCAgQmFzZTI0aCAgUk9NQmFzZVxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IE51bVBDSTsgaSsrKSB7Ci0JcHJpbnRmKCIlMDRYOiUwNFggJTA4bFggJTA4bFggJTA4bFggJTA4bFggJTA4bFggJTA4bFggJTA4bFggIiwKLQkgICAgUENJW2ldLlZlbmRvcklELAotCSAgICBQQ0lbaV0uRGV2aWNlSUQsCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTAsCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTQsCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTgsCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMUMsCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMjAsCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMjQsCi0JICAgIFBDSVtpXS51LnR5cGUwLlJPTUJhc2VBZGRyZXNzKTsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKSB7Ci0JICAgIGlmIChEZXZpY2VJbmRleFtpbmRleF0gPT0gaSkKLQkJYnJlYWs7Ci0JICAgIH0KLQlpZiAoaW5kZXggPCBOdW1EZXZpY2VzKQotCSAgICBwcmludGYoIjwtICVkXG4iLCBpbmRleCk7Ci0JZWxzZQotCSAgICBwcmludGYoIlxuIik7Ci0JfQotICAgIHByaW50ZigiXG4iKTsKLSAgICBwcmludGYoIkRldmljZUlEICBCQVIxMExlbiBCQVIxNExlbiBCQVIxOExlbiBCQVIxQ0xlbiBCQVIyMExlbiBCQVIyNExlbiBST01MZW5cbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1QQ0k7IGkrKykgewotCXByaW50ZigiJTA0WDolMDRYICUwOGxYICUwOGxYICUwOGxYICUwOGxYICUwOGxYICUwOGxYICUwOGxYICIsCi0JICAgIFBDSVtpXS5WZW5kb3JJRCwKLQkgICAgUENJW2ldLkRldmljZUlELAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczEwTGVuLAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczE0TGVuLAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczE4TGVuLAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczFDTGVuLAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczIwTGVuLAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczI0TGVuLAotCSAgICBQQ0lbaV0udS50eXBlMC5ST01CYXNlQWRkcmVzc0xlbik7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgewotCSAgICBpZiAoRGV2aWNlSW5kZXhbaW5kZXhdID09IGkpCi0JCWJyZWFrOwotCSAgICB9Ci0JaWYgKGluZGV4IDwgTnVtRGV2aWNlcykKLQkgICAgcHJpbnRmKCI8LSAlZFxuIiwgaW5kZXgpOwotCWVsc2UKLQkgICAgcHJpbnRmKCJcbiIpOwotCX0KLSAgICBwcmludGYoIlxuIik7Ci0gICAgcHJpbnRmKCJEaXNwbGF5aW5nIGVudW1lcmF0aW9uIG9mICVkIGJyaWRnZSBkZXZpY2VzXG4iLE51bUJyaWRnZXMpOwotICAgIHByaW50ZigiXG4iKTsKLSAgICBwcmludGYoIkRldmljZUlEICBQIyBTIyBCIyBJT0IgIElPTCAgTWVtQmFzZSAgTWVtTGltaXQgUHJlQmFzZSAgUHJlTGltaXQgQ3RybFxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IE51bUJyaWRnZXM7IGkrKykgewotCWluZm8gPSAoUENJRGV2aWNlSW5mbyopJlBDSVtCcmlkZ2VJbmRleFtpXV07Ci0JcHJpbnRmKCIlMDRYOiUwNFggJTAyWCAlMDJYICUwMlggJTA0WCAlMDRYICUwOFggJTA4WCAlMDhYICUwOFggJTA0WFxuIiwKLQkgICAgaW5mby0+VmVuZG9ySUQsCi0JICAgIGluZm8tPkRldmljZUlELAotCSAgICBpbmZvLT51LnR5cGUxLlByaW1hcnlCdXNOdW1iZXIsCi0JICAgIGluZm8tPnUudHlwZTEuU2Vjb25kYXlCdXNOdW1iZXIsCi0JICAgIGluZm8tPnUudHlwZTEuU3Vib3JkaW5hdGVCdXNOdW1iZXIsCi0JICAgICgodTE2KWluZm8tPnUudHlwZTEuSU9CYXNlIDw8IDgpICYgMHhGMDAwLAotCSAgICBpbmZvLT51LnR5cGUxLklPTGltaXQgPwotCQkoKHUxNilpbmZvLT51LnR5cGUxLklPTGltaXQgPDwgOCkgfCAweEZGRiA6IDAsCi0JICAgICgodTMyKWluZm8tPnUudHlwZTEuTWVtb3J5QmFzZSA8PCAxNikgJiAweEZGRjAwMDAwLAotCSAgICBpbmZvLT51LnR5cGUxLk1lbW9yeUxpbWl0ID8KLQkJKCh1MzIpaW5mby0+dS50eXBlMS5NZW1vcnlMaW1pdCA8PCAxNikgfCAweEZGRkZGIDogMCwKLQkgICAgKCh1MzIpaW5mby0+dS50eXBlMS5QcmVmZXRjaGFibGVNZW1vcnlCYXNlIDw8IDE2KSAmIDB4RkZGMDAwMDAsCi0JICAgIGluZm8tPnUudHlwZTEuUHJlZmV0Y2hhYmxlTWVtb3J5TGltaXQgPwotCQkoKHUzMilpbmZvLT51LnR5cGUxLlByZWZldGNoYWJsZU1lbW9yeUxpbWl0IDw8IDE2KSB8IDB4RkZGRkYgOiAwLAotCSAgICBpbmZvLT51LnR5cGUxLkJyaWRnZUNvbnRyb2wpOwotCX0KLSAgICBwcmludGYoIlxuIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotTnVtYmVyIG9mIGRpc3BsYXkgZGV2aWNlcyBmb3VuZC4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZW51bWVyYXRlcyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBkaXNwbGF5IGRldmljZXMgb24gdGhlCi1QQ0kgYnVzLCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIGZvdW5kLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgUENJX2VudW1lcmF0ZURldmljZXModm9pZCkKLXsKLSAgICBpbnQgICAgICAgICAgICAgaSxqOwotICAgIFBDSURldmljZUluZm8gICAqaW5mbzsKLQotICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCwgZW51bWVyYXRlIGFsbCAqLwotICAgIC8qIGRldmljZXMgb24gdGhlIFBDSSBidXMuICovCi0gICAgaWYgKE51bVBDSSA9PSAtMSkgewotCWlmICgoTnVtUENJID0gUENJX2dldE51bURldmljZXMoKSkgPT0gMCkKLQkgICAgcmV0dXJuIC0xOwotCVBDSSA9IG1hbGxvYyhOdW1QQ0kgKiBzaXplb2YoUENJWzBdKSk7Ci0JQnJpZGdlSW5kZXggPSBtYWxsb2MoTnVtUENJICogc2l6ZW9mKEJyaWRnZUluZGV4WzBdKSk7Ci0JRGV2aWNlSW5kZXggPSBtYWxsb2MoTnVtUENJICogc2l6ZW9mKERldmljZUluZGV4WzBdKSk7Ci0JaWYgKCFQQ0kgfHwgIUJyaWRnZUluZGV4IHx8ICFEZXZpY2VJbmRleCkKLQkgICAgcmV0dXJuIC0xOwotCWZvciAoaSA9IDA7IGkgPCBOdW1QQ0k7IGkrKykKLQkgICAgUENJW2ldLmR3U2l6ZSA9IHNpemVvZihQQ0lbaV0pOwotCWlmIChQQ0lfZW51bWVyYXRlKFBDSSkgPT0gMCkKLQkgICAgcmV0dXJuIC0xOwotCi0JLyogQnVpbGQgYSBsaXN0IG9mIGFsbCBQQ0kgYnJpZGdlIGRldmljZXMgKi8KLQlmb3IgKGkgPSAwLE51bUJyaWRnZXMgPSAwLEJyaWRnZUluZGV4WzBdID0gLTE7IGkgPCBOdW1QQ0k7IGkrKykgewotCSAgICBpZiAoUENJW2ldLkJhc2VDbGFzcyA9PSBQQ0lfQlJJREdFX0NMQVNTKQotCQlCcmlkZ2VJbmRleFtOdW1CcmlkZ2VzKytdID0gaTsKLQkgICAgfQotCi0JLyogTm93IGJ1aWxkIGEgbGlzdCBvZiBhbGwgZGlzcGxheSBjbGFzcyBkZXZpY2VzICovCi0JZm9yIChpID0gMCxOdW1EZXZpY2VzID0gMSxEZXZpY2VJbmRleFswXSA9IC0xOyBpIDwgTnVtUENJOyBpKyspIHsKLQkgICAgaWYgKFBDSV9JU19ESVNQTEFZX0NMQVNTKCZQQ0lbaV0pKSB7Ci0JCWlmICgoUENJW2ldLkNvbW1hbmQgJiAweDMpID09IDB4MykKLQkJICAgIERldmljZUluZGV4WzBdID0gaTsKLQkJZWxzZQotCQkgICAgRGV2aWNlSW5kZXhbTnVtRGV2aWNlcysrXSA9IGk7Ci0JCWlmIChQQ0lbaV0uc2xvdC5wLkJ1cyAhPSAwKSB7Ci0JCSAgICAvKiBUaGlzIGRldmljZSBpcyBvbiBhIGRpZmZlcmVudCBidXMgdGhhbiB0aGUgcHJpbWFyeSAqLwotCQkgICAgLyogUENJIGJ1cywgc28gaXQgaXMgcHJvYmFibHkgYW4gQUdQIGRldmljZS4gRmluZCB0aGUgKi8KLQkJICAgIC8qIEFHUCBidXMgZGV2aWNlIHRoYXQgY29udHJvbHMgdGhhdCBidXMgc28gd2UgY2FuICovCi0JCSAgICAvKiBjb250cm9sIGl0LiAqLwotCQkgICAgZm9yIChqID0gMDsgaiA8IE51bUJyaWRnZXM7IGorKykgewotCQkJaW5mbyA9IChQQ0lEZXZpY2VJbmZvKikmUENJW0JyaWRnZUluZGV4W2pdXTsKLQkJCWlmIChpbmZvLT51LnR5cGUxLlNlY29uZGF5QnVzTnVtYmVyID09IFBDSVtpXS5zbG90LnAuQnVzKSB7Ci0JCQkgICAgQUdQQnJpZGdlID0gaW5mbzsKLQkJCSAgICBicmVhazsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JLyogRW51bWVyYXRlIGFsbCBQQ0kgYW5kIGJyaWRnZSBkZXZpY2VzIHRvIHN0YW5kYXJkIG91dHB1dCAqLwotCUVudW1lcmF0ZVBDSSgpOwotCX0KLSAgICByZXR1cm4gTnVtRGV2aWNlczsKLX0KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICAvKiBFbnVtZXJhdGUgYWxsIFBDSSBkZXZpY2VzICovCi0gICAgUE1faW5pdCgpOwotICAgIGlmIChQQ0lfZW51bWVyYXRlRGV2aWNlcygpIDwgMSkgewotCXByaW50ZigiTm8gUENJIGRpc3BsYXkgZGV2aWNlcyBmb3VuZCFcbiIpOwotCXJldHVybiAtMTsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy90aWNrLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy90aWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ODcyNWUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdGljay5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwgYSBDIGJhc2VkCi0qICAgICAgICAgICAgICAgdGltZXIgaW50ZXJydXB0IGhhbmRsZXIuCi0qCi0qICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9zZXRUaW1lckhhbmRsZXIoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fY2hhaW5QcmV2VGltZXIoKTsKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX3Jlc3RvcmVUaW1lckhhbmRsZXIoKQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotdm9sYXRpbGUgbG9uZyBjb3VudCA9IDA7Ci0KLSNwcmFnbWEgb2ZmIChjaGVja19zdGFjaykgICAgICAgICAgIC8qIE5vIHN0YWNrIGNoZWNraW5nIHVuZGVyIFdhdGNvbSAgICovCi0KLXZvaWQgUE1BUEkgdGltZXJIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1fY2hhaW5QcmV2VGltZXIoKTsgICAgICAgIC8qIENoYWluIHRvIHByZXZpb3VzIGhhbmRsZXIgKi8KLSAgICBjb3VudCsrOwotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIGxvbmcgICAgICAgICAgICBvbGRDb3VudDsKLSAgICBQTV9sb2NrSGFuZGxlICAgbGg7Ci0KLSAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKLSAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKLQljYXNlIFBNX3JlYWxNb2RlOgotCSAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMjg2OgotCSAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMzg2OgotCSAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIC8qIEluc3RhbGwgb3VyIHRpbWVyIGhhbmRsZXIgYW5kIGxvY2sgaGFuZGxlciBwYWdlcyBpbiBtZW1vcnkuIEl0IGlzCi0gICAgICogZGlmZmljdWx0IHRvIGdldCB0aGUgc2l6ZSBvZiBhIGZ1bmN0aW9uIGluIEMsIGJ1dCB3ZSBrbm93IG91cgotICAgICAqIGZ1bmN0aW9uIGlzIHdlbGwgbGVzcyB0aGFuIDEwMCBieXRlcyAoYW5kIGFuIGVudGlyZSA0ayBwYWdlIHdpbGwKLSAgICAgKiBuZWVkIHRvIGJlIGxvY2tlZCBieSB0aGUgc2VydmVyIGFueXdheSkuCi0gICAgICovCi0gICAgUE1fbG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKXRpbWVySGFuZGxlciwxMDAsJmxoKTsKLSAgICBQTV9sb2NrRGF0YVBhZ2VzKCh2b2lkKikmY291bnQsc2l6ZW9mKGNvdW50KSwmbGgpOwotICAgIFBNX2luc3RhbGxCcmVha0hhbmRsZXIoKTsgICAgICAgICAgIC8qIFdlICpET05UKiB3YW50IEN0cmwtQnJlYWtzISAqLwotICAgIFBNX3NldFRpbWVySGFuZGxlcih0aW1lckhhbmRsZXIpOwotICAgIHByaW50ZigiVGltZXIgaW50ZXJydXB0IGhhbmRsZXIgaW5zdGFsbGVkIC0gSGl0IEVTQyB0byBleGl0XG4iKTsKLSAgICBvbGRDb3VudCA9IGNvdW50OwotICAgIHdoaWxlICgxKSB7Ci0JaWYgKFBNX2tiaGl0KCkgJiYgKFBNX2dldGNoKCkgPT0gMHgxQikpCi0JICAgIGJyZWFrOwotCWlmIChjb3VudCAhPSBvbGRDb3VudCkgewotCSAgICBwcmludGYoIlRpY2ssIFRvY2s6ICVsZFxuIiwgY291bnQpOwotCSAgICBvbGRDb3VudCA9IGNvdW50OwotCSAgICB9Ci0JfQotCi0gICAgUE1fcmVzdG9yZVRpbWVySGFuZGxlcigpOwotICAgIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIoKTsKLSAgICBQTV91bmxvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7Ci0gICAgUE1fdW5sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpdGltZXJIYW5kbGVyLDEwMCwmbGgpOwotICAgIHByaW50ZigiVGltZXIgaGFuZGxlciB3YXMgY2FsbGVkICVsZCB0aW1lc1xuIiwgY291bnQpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdGltZXJjLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy90aW1lcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhNzdiNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy90aW1lcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSBmb3IgdGhlIFplbiBUaW1lciBMaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJ6dGltZXIuaCIKLQotI2RlZmluZSBERUxBWV9TRUNTICAxMAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGUgZm9sbG93aW5nIHJvdXRpbmUgdGFrZXMgYSBsb25nIGNvdW50IGluIG1pY3Jvc2Vjb25kcyBhbmQgb3V0cHV0cwotICogYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb3VudCBpbiBzZWNvbmRzLiBJdCBjb3VsZCBiZSBtb2RpZmllZCB0bwotICogcmV0dXJuIGEgcG9pbnRlciB0byBhIHN0YXRpYyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb3VudCByYXRoZXIKLSAqIHRoYW4gcHJpbnRpbmcgaXQgb3V0LgotICovCi0KLXZvaWQgUmVwb3J0VGltZSh1bG9uZyBjb3VudCkKLXsKLSAgICB1bG9uZyAgIHNlY3M7Ci0KLSAgICBzZWNzID0gY291bnQgLyAxMDAwMDAwTDsKLSAgICBjb3VudCA9IGNvdW50IC0gc2VjcyAqIDEwMDAwMDBMOwotICAgIHByaW50ZigiVGltZSB0YWtlbjogJWx1LiUwNmx1IHNlY29uZHNcbiIsc2Vjcyxjb3VudCk7Ci19Ci0KLWludCAgICAgaSxqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTk9OIHJlZ2lzdGVyIHZhcmlhYmxlcyEgKi8KLQotaW50IG1haW4odm9pZCkKLXsKLSNpZmRlZiAgTE9OR19URVNUCi0gICAgdWxvbmcgICBzdGFydCxmaW5pc2g7Ci0jZW5kaWYKLQotICAgIHByaW50ZigiUHJvY2Vzc29yIHR5cGU6ICVkICVsZCBNSHpcbiIsIENQVV9nZXRQcm9jZXNzb3JUeXBlKCksIENQVV9nZXRQcm9jZXNzb3JTcGVlZCh0cnVlKSk7Ci0KLSAgICBaVGltZXJJbml0KCk7Ci0KLSAgICAvKiBUZXN0IHRoZSBsb25nIHBlcmlvZCBaZW4gVGltZXIgKHdlIGRvbid0IGNoZWNrIGZvciBvdmVyZmxvdyBjb3oKLSAgICAgKiBpdCB3b3VsZCB0YWtlIHRvb29vbyBsb25nISkKLSAgICAgKi8KLQotICAgIExaVGltZXJPbigpOwotICAgIGZvciAoaiA9IDA7IGogPCAxMDsgaisrKQotCWZvciAoaSA9IDA7IGkgPCAyMDAwMDsgaSsrKQotCSAgICBpID0gaTsKLSAgICBMWlRpbWVyT2ZmKCk7Ci0gICAgUmVwb3J0VGltZShMWlRpbWVyQ291bnQoKSk7Ci0KLSAgICAvKiBUZXN0IHRoZSB1bHRyYSBsb25nIHBlcmlvZCBaZW4gVGltZXIgKi8KLSNpZmRlZiBMT05HX1RFU1QKLSAgICBzdGFydCA9IFVMWlJlYWRUaW1lKCk7Ci0gICAgZGVsYXkoREVMQVlfU0VDUyAqIDEwMDApOwotICAgIGZpbmlzaCA9IFVMWlJlYWRUaW1lKCk7Ci0gICAgcHJpbnRmKCJEZWxheSBvZiAlZCBzZWNzIHRvb2sgJWQgMS8xMHRocyBvZiBhIHNlY29uZFxuIiwKLQlERUxBWV9TRUNTLFVMWkVsYXBzZWRUaW1lKHN0YXJ0LGZpbmlzaCkpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3RpbWVyY3BwLmNwcCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3RpbWVyY3BwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1OGE0Yi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy90aW1lcmNwcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQysrIDMuMAotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSBmb3IgdGhlIFplbiBUaW1lciBMaWJyYXJ5IEMrKyBpbnRlcmZhY2UuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgInp0aW1lci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pbnQgICAgIGksaixrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PTiByZWdpc3RlciB2YXJpYWJsZXMhICovCi0KLXZvaWQgZHVtbXkoKSB7fQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIExaVGltZXIgICAgIGx0aW1lcjsKLSAgICBVTFpUaW1lciAgICB1bHRpbWVyOwotCi0gICAgWlRpbWVySW5pdCgpOwotCi0gICAgLyogVGVzdCB0aGUgbG9uZyBwZXJpb2QgWmVuIFRpbWVyICh3ZSBkb24ndCBjaGVjayBmb3Igb3ZlcmZsb3cgY296Ci0gICAgICogaXQgd291bGQgdGFrZSB0b29vb28gbG9uZyEpCi0gICAgICovCi0KLSAgICBjb3V0IDw8IGVuZGw7Ci0gICAgdWx0aW1lci5yZXN0YXJ0KCk7Ci0gICAgbHRpbWVyLnN0YXJ0KCk7Ci0gICAgZm9yIChqID0gMDsgaiA8IDEwOyBqKyspCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMDAwMDsgaSsrKQotICAgICAgICAgICAgZHVtbXkoKTsKLSAgICBsdGltZXIuc3RvcCgpOwotICAgIHVsdGltZXIuc3RvcCgpOwotICAgIGNvdXQgPDwgIkxDb3VudDogICIgPDwgbHRpbWVyLmNvdW50KCkgPDwgZW5kbDsKLSAgICBjb3V0IDw8ICJUaW1lOiAgICAiIDw8IGx0aW1lciA8PCAiIHNlY3NcbiI7Ci0gICAgY291dCA8PCAiVUxDb3VudDogIiA8PCB1bHRpbWVyLmNvdW50KCkgPDwgZW5kbDsKLSAgICBjb3V0IDw8ICJVTFRpbWU6ICAiIDw8IHVsdGltZXIgPDwgIiBzZWNzXG4iOwotCi0gICAgY291dCA8PCBlbmRsIDw8ICJUaW1pbmcgLi4uIFxuIjsKLSAgICB1bHRpbWVyLnJlc3RhcnQoKTsKLSAgICBsdGltZXIucmVzdGFydCgpOwotICAgIGZvciAoaiA9IDA7IGogPCAyMDA7IGorKykKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDIwMDAwOyBpKyspCi0gICAgICAgICAgICBkdW1teSgpOwotICAgIGx0aW1lci5zdG9wKCk7Ci0gICAgdWx0aW1lci5zdG9wKCk7Ci0gICAgY291dCA8PCAiTENvdW50OiAgIiA8PCBsdGltZXIuY291bnQoKSA8PCBlbmRsOwotICAgIGNvdXQgPDwgIlRpbWU6ICAgICIgPDwgbHRpbWVyIDw8ICIgc2Vjc1xuIjsKLSAgICBjb3V0IDw8ICJVTENvdW50OiAiIDw8IHVsdGltZXIuY291bnQoKSA8PCBlbmRsOwotICAgIGNvdXQgPDwgIlVMVGltZTogICIgPDwgdWx0aW1lciA8PCAiIHNlY3NcbiI7Ci0KLSAgICAvKiBUZXN0IHRoZSBsYXAgZnVuY3Rpb24gb2YgdGhlIGxvbmcgcGVyaW9kIFplbiBUaW1lciAqLwotCi0gICAgY291dCA8PCBlbmRsIDw8ICJUaW1pbmcgLi4uIFxuIjsKLSAgICB1bHRpbWVyLnJlc3RhcnQoKTsKLSAgICBsdGltZXIucmVzdGFydCgpOwotICAgIGZvciAoaiA9IDA7IGogPCAyMDsgaisrKSB7Ci0gICAgICAgIGZvciAoayA9IDA7IGsgPCAxMDsgaysrKQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIwMDAwOyBpKyspCi0gICAgICAgICAgICAgICAgZHVtbXkoKTsKLSAgICAgICAgY291dCA8PCAibGFwOiAiIDw8IGx0aW1lci5sYXAoKSA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgbHRpbWVyLnN0b3AoKTsKLSAgICB1bHRpbWVyLnN0b3AoKTsKLSAgICBjb3V0IDw8ICJMQ291bnQ6ICAiIDw8IGx0aW1lci5jb3VudCgpIDw8IGVuZGw7Ci0gICAgY291dCA8PCAiVGltZTogICAgIiA8PCBsdGltZXIgPDwgIiBzZWNzXG4iOwotICAgIGNvdXQgPDwgIlVMQ291bnQ6ICIgPDwgdWx0aW1lci5jb3VudCgpIDw8IGVuZGw7Ci0gICAgY291dCA8PCAiVUxUaW1lOiAgIiA8PCB1bHRpbWVyIDw8ICIgc2Vjc1xuIjsKLQotI2lmZGVmICBMT05HX1RFU1QKLSAgICAvKiBUZXN0IHRoZSB1bHRyYSBsb25nIHBlcmlvZCBaZW4gVGltZXIgKi8KLQotICAgIHVsdGltZXIuc3RhcnQoKTsKLSAgICBkZWxheShERUxBWV9TRUNTICogMTAwMCk7Ci0gICAgdWx0aW1lci5zdG9wKCk7Ci0gICAgY291dCA8PCAiRGVsYXkgb2YgIiA8PCBERUxBWV9TRUNTIDw8ICIgc2VjcyB0b29rICIgPDwgdWx0aW1lci5jb3VudCgpCi0gICAgICAgICA8PCAiIDEvMTB0aHMgb2YgYSBzZWNvbmRcbiI7Ci0gICAgY291dCA8PCAiVGltZTogIiA8PCB1bHRpbWVyIDw8ICIgc2Vjc1xuIjsKLSNlbmRpZgotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdXN3Yy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdXN3Yy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGM3YmQ2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3Vzd2MuYworKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBTaW1wbGUgdGVzdCBwcm9ncmFtIHRvIHRlc3QgdGhlIHdyaXRlIGNvbWJpbmUgZnVuY3Rpb25zLgotKgotKiAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHByb2dyYW0gc2hvdWxkIG5ldmVyIGJlIHVzZWQgaW4gYSBwcm9kdWN0aW9uCi0qICAgICAgICAgICAgICAgZW52aXJvbm1lbnQsIGJlY2F1c2Ugd3JpdGUgY29tYmluaW5nIG5lZWRzIHRvIGJlIGhhbmRsZWQKLSogICAgICAgICAgICAgICB3aXRoIG1vcmUgaW50aW1hdGUga25vd2xlZGdlIG9mIHRoZSBkaXNwbGF5IGhhcmR3YXJlIHRoYW4KLSogICAgICAgICAgICAgICB5b3UgY2FuIG9idGFpbiBieSBzaW1wbHkgZXhhbWluaW5nIHRoZSBQQ0kgY29uZmlndXJhdGlvbgotKiAgICAgICAgICAgICAgIHNwYWNlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAicGNpbGliLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCAgICAgICAgICAgICAgTnVtUENJID0gLTE7Ci1zdGF0aWMgUENJRGV2aWNlSW5mbyAgICAqUENJOwotc3RhdGljIGludCAgICAgICAgICAgICAgKkJyaWRnZUluZGV4Owotc3RhdGljIGludCAgICAgICAgICAgICAgKkRldmljZUluZGV4Owotc3RhdGljIGludCAgICAgICAgICAgICAgTnVtQnJpZGdlczsKLXN0YXRpYyBQQ0lEZXZpY2VJbmZvICAgICpBR1BCcmlkZ2UgPSBOVUxMOwotc3RhdGljIGludCAgICAgICAgICAgICAgTnVtRGV2aWNlczsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1OdW1iZXIgb2YgZGlzcGxheSBkZXZpY2VzIGZvdW5kLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBlbnVtZXJhdGVzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGRpc3BsYXkgZGV2aWNlcyBvbiB0aGUKLVBDSSBidXMsIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgZm91bmQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBQQ0lfZW51bWVyYXRlRGV2aWNlcyh2b2lkKQotewotICAgIGludCAgICAgICAgICAgICBpLGo7Ci0gICAgUENJRGV2aWNlSW5mbyAgICppbmZvOwotCi0gICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkLCBlbnVtZXJhdGUgYWxsICovCi0gICAgLyogZGV2aWNlcyBvbiB0aGUgUENJIGJ1cy4gKi8KLSAgICBpZiAoTnVtUENJID09IC0xKSB7Ci0JaWYgKChOdW1QQ0kgPSBQQ0lfZ2V0TnVtRGV2aWNlcygpKSA9PSAwKQotCSAgICByZXR1cm4gLTE7Ci0JUENJID0gbWFsbG9jKE51bVBDSSAqIHNpemVvZihQQ0lbMF0pKTsKLQlCcmlkZ2VJbmRleCA9IG1hbGxvYyhOdW1QQ0kgKiBzaXplb2YoQnJpZGdlSW5kZXhbMF0pKTsKLQlEZXZpY2VJbmRleCA9IG1hbGxvYyhOdW1QQ0kgKiBzaXplb2YoRGV2aWNlSW5kZXhbMF0pKTsKLQlpZiAoIVBDSSB8fCAhQnJpZGdlSW5kZXggfHwgIURldmljZUluZGV4KQotCSAgICByZXR1cm4gLTE7Ci0JZm9yIChpID0gMDsgaSA8IE51bVBDSTsgaSsrKQotCSAgICBQQ0lbaV0uZHdTaXplID0gc2l6ZW9mKFBDSVtpXSk7Ci0JaWYgKFBDSV9lbnVtZXJhdGUoUENJKSA9PSAwKQotCSAgICByZXR1cm4gLTE7Ci0KLQkvKiBCdWlsZCBhIGxpc3Qgb2YgYWxsIFBDSSBicmlkZ2UgZGV2aWNlcyAqLwotCWZvciAoaSA9IDAsTnVtQnJpZGdlcyA9IDAsQnJpZGdlSW5kZXhbMF0gPSAtMTsgaSA8IE51bVBDSTsgaSsrKSB7Ci0JICAgIGlmIChQQ0lbaV0uQmFzZUNsYXNzID09IFBDSV9CUklER0VfQ0xBU1MpCi0JCUJyaWRnZUluZGV4W051bUJyaWRnZXMrK10gPSBpOwotCSAgICB9Ci0KLQkvKiBOb3cgYnVpbGQgYSBsaXN0IG9mIGFsbCBkaXNwbGF5IGNsYXNzIGRldmljZXMgKi8KLQlmb3IgKGkgPSAwLE51bURldmljZXMgPSAxLERldmljZUluZGV4WzBdID0gLTE7IGkgPCBOdW1QQ0k7IGkrKykgewotCSAgICBpZiAoUENJX0lTX0RJU1BMQVlfQ0xBU1MoJlBDSVtpXSkpIHsKLQkJaWYgKChQQ0lbaV0uQ29tbWFuZCAmIDB4MykgPT0gMHgzKQotCQkgICAgRGV2aWNlSW5kZXhbMF0gPSBpOwotCQllbHNlCi0JCSAgICBEZXZpY2VJbmRleFtOdW1EZXZpY2VzKytdID0gaTsKLQkJaWYgKFBDSVtpXS5zbG90LnAuQnVzICE9IDApIHsKLQkJICAgIC8qIFRoaXMgZGV2aWNlIGlzIG9uIGEgZGlmZmVyZW50IGJ1cyB0aGFuIHRoZSBwcmltYXJ5ICovCi0JCSAgICAvKiBQQ0kgYnVzLCBzbyBpdCBpcyBwcm9iYWJseSBhbiBBR1AgZGV2aWNlLiBGaW5kIHRoZSAqLwotCQkgICAgLyogQUdQIGJ1cyBkZXZpY2UgdGhhdCBjb250cm9scyB0aGF0IGJ1cyBzbyB3ZSBjYW4gKi8KLQkJICAgIC8qIGNvbnRyb2wgaXQuICovCi0JCSAgICBmb3IgKGogPSAwOyBqIDwgTnVtQnJpZGdlczsgaisrKSB7Ci0JCQlpbmZvID0gKFBDSURldmljZUluZm8qKSZQQ0lbQnJpZGdlSW5kZXhbal1dOwotCQkJaWYgKGluZm8tPnUudHlwZTEuU2Vjb25kYXlCdXNOdW1iZXIgPT0gUENJW2ldLnNsb3QucC5CdXMpIHsKLQkJCSAgICBBR1BCcmlkZ2UgPSBpbmZvOwotCQkJICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIHJldHVybiBOdW1EZXZpY2VzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUVudW1lcmF0ZXMgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IGF0dGFjaGVkIGRpc3BsYXkgZGV2aWNlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBTaG93RGlzcGxheURldmljZXModm9pZCkKLXsKLSAgICBpbnQgaSxpbmRleDsKLQotICAgIHByaW50ZigiRGlzcGxheWluZyBlbnVtZXJhdGlvbiBvZiAlZCBQQ0kgZGlzcGxheSBkZXZpY2VzXG4iLCBOdW1EZXZpY2VzKTsKLSAgICBwcmludGYoIlxuIik7Ci0gICAgcHJpbnRmKCJEZXZpY2VJRCAgU3ViU3lzdGVtICBCYXNlMTBoICAobGVuZ3RoICApICBCYXNlMTRoICAobGVuZ3RoICApXG4iKTsKLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKSB7Ci0JaSA9IERldmljZUluZGV4W2luZGV4XTsKLQlwcmludGYoIiUwNFg6JTA0WCAlMDRYOiUwNFggICUwOGxYICglNmxkIEtCKSAlMDhsWCAoJTZsZCBLQilcbiIsCi0JICAgIFBDSVtpXS5WZW5kb3JJRCwKLQkgICAgUENJW2ldLkRldmljZUlELAotCSAgICBQQ0lbaV0udS50eXBlMC5TdWJTeXN0ZW1WZW5kb3JJRCwKLQkgICAgUENJW2ldLnUudHlwZTAuU3ViU3lzdGVtSUQsCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTAsCi0JICAgIFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTBMZW4gLyAxMDI0LAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczE0LAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczE0TGVuIC8gMTAyNCk7Ci0JfQotICAgIHByaW50ZigiXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EdW1wcyB0aGUgdmFsdWUgZm9yIGEgd3JpdGUgY29tYmluZSByZWdpb24gdG8gdGhlIGRpc3BsYXkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNoYXIgKkRlY29kZVdDVHlwZSgKLSAgICB1aW50IHR5cGUpCi17Ci0gICAgc3RhdGljIGNoYXIgKm5hbWVzW10gPSB7Ci0JIlVOQ0FDSEFCTEUiLAotCSJXUkNPTUIiLAotCSJVTktOT1dOIiwKLQkiVU5LTk9XTiIsCi0JIldSVEhST1VHSCIsCi0JIldSUFJPVCIsCi0JIldSQkFDSyIsCi0JfTsKLSAgICBpZiAodHlwZSA8PSBQTV9NVFJSX01BWCkKLQlyZXR1cm4gbmFtZXNbdHlwZV07Ci0gICAgcmV0dXJuICJVTktOT1dOIjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EdW1wcyB0aGUgdmFsdWUgZm9yIGEgd3JpdGUgY29tYmluZSByZWdpb24gdG8gdGhlIGRpc3BsYXkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUE1BUEkgRW51bVdyaXRlQ29tYmluZSgKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIGxlbmd0aCwKLSAgICB1aW50IHR5cGUpCi17Ci0gICAgcHJpbnRmKCIlMDhsWCAlLTEwbGQgJXNcbiIsIGJhc2UsIGxlbmd0aCAvIDEwMjQsIERlY29kZVdDVHlwZSh0eXBlKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZXJyIC0gRXJyb3IgdG8gbG9nCi0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBsb2cgYW4gZXJyb3IgbWVzc2FnZSBpZiB0aGUgTVRSUiB3cml0ZSBjb21iaW5pbmcgYXR0ZW1wdCBmYWlsZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgTG9nTVRSUkVycm9yKAotICAgIGludCBlcnIpCi17Ci0gICAgaWYgKGVyciA9PSBQTV9NVFJSX0VSUl9PSykKLQlyZXR1cm47Ci0gICAgc3dpdGNoIChlcnIpIHsKLQljYXNlIFBNX01UUlJfTk9UX1NVUFBPUlRFRDoKLQkgICAgcHJpbnRmKCJGYWlsZWQ6IE1UUlIgaXMgbm90IHN1cHBvcnRlZCBieSBob3N0IENQVVxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fTVRSUl9FUlJfUEFSQU1TOgotCSAgICBwcmludGYoIkZhaWxlZDogSW52YWxpZCBwYXJhbWV0ZXJzIHBhc3NlZCB0byBQTV9lbmFibGVXcml0ZUNvbWJpbmVkIVxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fTVRSUl9FUlJfTk9UXzRLQl9BTElHTkVEOgotCSAgICBwcmludGYoIkZhaWxlZDogQWRkcmVzcyBpcyBub3QgNEtiIGFsaWduZWQhXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV9NVFJSX0VSUl9CRUxPV18xTUI6Ci0JICAgIHByaW50ZigiRmFpbGVkOiBBZGRyZXNzZXMgYmVsb3cgMU1iIGNhbm5vdCBiZSB3cml0ZSBjb21iaW5lZCFcbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNX01UUlJfRVJSX05PVF9BTElHTkVEOgotCSAgICBwcmludGYoIkZhaWxlZDogQWRkcmVzcyBpcyBub3QgY29ycmVjdGx5IGFsaWduZWQgZm9yIHByb2Nlc3NvciFcbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNX01UUlJfRVJSX09WRVJMQVA6Ci0JICAgIHByaW50ZigiRmFpbGVkOiBBZGRyZXNzIG92ZXJsYXBzIGFuIGV4aXN0aW5nIHJlZ2lvbiFcbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNX01UUlJfRVJSX1RZUEVfTUlTTUFUQ0g6Ci0JICAgIHByaW50ZigiRmFpbGVkOiBBZHJlc3MgaXMgY29udGFpbmVkIHdpdGggZXhpc3RpbmcgcmVnaW9uLCBidXQgdHlwZSBpcyBkaWZmZXJlbnQhXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV9NVFJSX0VSUl9OT05FX0ZSRUU6Ci0JICAgIHByaW50ZigiRmFpbGVkOiBPdXQgb2YgTVRSUiByZWdpc3RlcnMhXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV9NVFJSX0VSUl9OT1dSQ09NQjoKLQkgICAgcHJpbnRmKCJGYWlsZWQ6IFRoaXMgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgd3JpdGUgY29tYmluaW5nIVxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fTVRSUl9FUlJfTk9fT1NfU1VQUE9SVDoKLQkgICAgcHJpbnRmKCJGYWlsZWQ6IE1UUlIgaXMgbm90IHN1cHBvcnRlZCBieSBob3N0IE9TXG4iKTsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgcHJpbnRmKCJGYWlsZWQ6IFVOS05PV04gRVJST1IhXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIGV4aXQoLTEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNob3dzIGFsbCB3cml0ZSBjb21iaW5lIHJlZ2lvbnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgU2hvd1dyaXRlQ29tYmluZSh2b2lkKQotewotICAgIHByaW50ZigiQmFzZSAgICAgTGVuZ3RoKEtCKSBUeXBlXG4iKTsKLSAgICBMb2dNVFJSRXJyb3IoUE1fZW51bVdyaXRlQ29tYmluZShFbnVtV3JpdGVDb21iaW5lKSk7Ci0gICAgcHJpbnRmKCJcbiIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUR1bXBzIHRoZSB2YWx1ZSBmb3IgYSB3cml0ZSBjb21iaW5lIHJlZ2lvbiB0byB0aGUgZGlzcGxheS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBFbmFibGVXcml0ZUNvbWJpbmUodm9pZCkKLXsKLSAgICBpbnQgaSxpbmRleDsKLQotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKLQlpID0gRGV2aWNlSW5kZXhbaW5kZXhdOwotCWlmIChQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczEwICYgMHg4KSB7Ci0JICAgIExvZ01UUlJFcnJvcihQTV9lbmFibGVXcml0ZUNvbWJpbmUoCi0JCVBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTAgJiAweEZGRkZGRkYwLAotCQlQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczEwTGVuLAotCQlQTV9NVFJSX1dSQ09NQikpOwotCSAgICB9Ci0JaWYgKFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTQgJiAweDgpIHsKLQkgICAgTG9nTVRSUkVycm9yKFBNX2VuYWJsZVdyaXRlQ29tYmluZSgKLQkJUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxNCAmIDB4RkZGRkZGRjAsCi0JCVBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTRMZW4sCi0JCVBNX01UUlJfV1JDT01CKSk7Ci0JICAgIH0KLQl9Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIFNob3dEaXNwbGF5RGV2aWNlcygpOwotICAgIFNob3dXcml0ZUNvbWJpbmUoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EdW1wcyB0aGUgdmFsdWUgZm9yIGEgd3JpdGUgY29tYmluZSByZWdpb24gdG8gdGhlIGRpc3BsYXkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRGlzYWJsZVdyaXRlQ29tYmluZSh2b2lkKQotewotICAgIGludCBpLGluZGV4OwotCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgewotCWkgPSBEZXZpY2VJbmRleFtpbmRleF07Ci0JaWYgKFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTAgJiAweDgpIHsKLQkgICAgTG9nTVRSUkVycm9yKFBNX2VuYWJsZVdyaXRlQ29tYmluZSgKLQkJUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMCAmIDB4RkZGRkZGRjAsCi0JCVBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTBMZW4sCi0JCVBNX01UUlJfVU5DQUNIQUJMRSkpOwotCSAgICB9Ci0JaWYgKFBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTQgJiAweDgpIHsKLQkgICAgTG9nTVRSUkVycm9yKFBNX2VuYWJsZVdyaXRlQ29tYmluZSgKLQkJUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxNCAmIDB4RkZGRkZGRjAsCi0JCVBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTRMZW4sCi0JCVBNX01UUlJfVU5DQUNIQUJMRSkpOwotCSAgICB9Ci0JfQotICAgIHByaW50ZigiXG4iKTsKLSAgICBTaG93RGlzcGxheURldmljZXMoKTsKLSAgICBTaG93V3JpdGVDb21iaW5lKCk7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBQTV9pbml0KCk7Ci0gICAgaWYgKFBDSV9lbnVtZXJhdGVEZXZpY2VzKCkgPCAxKSB7Ci0JcHJpbnRmKCJObyBQQ0kgZGlzcGxheSBkZXZpY2VzIGZvdW5kIVxuIik7Ci0JcmV0dXJuIC0xOwotCX0KLSAgICBpZiAoYXJnYyA8IDIpIHsKLQlwcmludGYoInVzYWdlOiB1c3djIFstc2hvdyAtb24gLW9mZl1cblxuIik7Ci0JU2hvd0Rpc3BsYXlEZXZpY2VzKCk7Ci0JcmV0dXJuIC0xOwotCX0KLSAgICBpZiAoc3RyaWNtcChhcmd2WzFdLCItc2hvdyIpID09IDApCi0JU2hvd1dyaXRlQ29tYmluZSgpOwotICAgIGVsc2UgaWYgKHN0cmljbXAoYXJndlsxXSwiLW9uIikgPT0gMCkKLQlFbmFibGVXcml0ZUNvbWJpbmUoKTsKLSAgICBlbHNlIGlmIChzdHJpY21wKGFyZ3ZbMV0sIi1vZmYiKSA9PSAwKQotCURpc2FibGVXcml0ZUNvbWJpbmUoKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3ZmdGVzdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdmZ0ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZTNiYjcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdmZ0ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogRmlsZW5hbWU6ICAgICAkV29ya2ZpbGUkCi0qIFZlcnNpb246ICAgICAgJFJldmlzaW9uOiAxLjEgJAotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byB0ZXN0IHRoZSBWRmxhdCB2aXJ0dWFsIGZyYW1lYnVmZmVyIGZ1bmN0aW9ucy4KLSoKLSogICAgICAgICAgICAgICBGdW5jdGlvbnMgdGVzdGVkOiAgIFZGX2F2YWlsYWJsZSgpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRl9pbml0KCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZGX2V4aXQoKQotKgotKiAkRGF0ZTogMjAwMi8xMC8wMiAxNTozNToyMSAkICRBdXRob3I6IGhmcmllZGVuICQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLXVjaGFyIGNvZGVbXSA9IHsKLSAgICAweEMzLCAgICAgICAgICAgICAgICAgICAvKiByZXQgICAgICAgICAgKi8KLSAgICB9OwotCi1pbnQgbWFpbih2b2lkKQotewotICAgIHZvaWQgICAgKnZmQnVmZmVyOwotCi0gICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7Ci0gICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7Ci0JY2FzZSBQTV9yZWFsTW9kZToKLQkgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzI4NjoKLQkgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzM4NjoKLQkgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICBpZiAoIVZGX2F2YWlsYWJsZSgpKSB7Ci0JcHJpbnRmKCJWaXJ0dWFsIExpbmVhciBGcmFtZWJ1ZmZlciBub3QgYXZhaWxhYmxlLlxuIik7Ci0JZXhpdCgxKTsKLQl9Ci0KLSAgICB2ZkJ1ZmZlciA9IFZGX2luaXQoMHhBMDAwMCw2NCxzaXplb2YoY29kZSksY29kZSk7Ci0gICAgaWYgKCF2ZkJ1ZmZlcikgewotCXByaW50ZigiRmFpbHVyZSB0byBpbml0aWFsaXNlIFZpcnR1YWwgTGluZWFyIEZyYW1lYnVmZmVyIVxuIik7Ci0JZXhpdCgxKTsKLQl9Ci0gICAgVkZfZXhpdCgpOwotICAgIHByaW50ZigiVmlydHVhbCBMaW5lYXIgRnJhbWVidWZmZXIgc2V0IHVwIHN1Y2Nlc3NmdWxseSFcbiIpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdmlkZW8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3ZpZGVvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYWRjZGQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gZ2VuZXJhdGUgcmVhbCBtb2RlCi0qICAgICAgICAgICAgICAgaW50ZXJydXB0cyBhbmQgdG8gYmUgYWJsZSB0byBvYnRhaW4gZGlyZWN0IGFjY2VzcyB0byB0aGUKLSogICAgICAgICAgICAgICB2aWRlbyBtZW1vcnkgZnJvbSBwcm90ZWN0ZWQgbW9kZS4gQ29tcGlsZSBhbmQgbGluayB3aXRoCi0qICAgICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmQgbGluZSBmb3IgeW91ciBET1MgZXh0ZW5kZXIuCi0qCi0qICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9nZXRCSU9TU2VsZWN0b3IoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fbWFwUGh5c2ljYWxBZGRyKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2ludDg2KCkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLXVjaGFyICAgKmJpb3M7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gQklPUyBkYXRhIGFyZWEgICAgICAgICovCi11Y2hhciAgICp2aWRlb1B0cjsgICAgICAvKiBQb2ludGVyIHRvIFZHQSBmcmFtZWJ1ZmZlciAgICAgICAqLwotdm9pZCAgICAqc3RhdGVCdWY7ICAgICAgLyogQ29uc29sZSBzdGF0ZSBzYXZlIGJ1ZmZlciAgICAgICAgKi8KLQotLyogUm91dGluZSB0byByZXR1cm4gdGhlIGN1cnJlbnQgdmlkZW8gbW9kZSBudW1iZXIgKi8KLQotaW50IGdldFZpZGVvTW9kZSh2b2lkKQotewotICAgIHJldHVybiBQTV9nZXRCeXRlKGJpb3MrMHg0OSk7Ci19Ci0KLS8qIFJvdXRpbmUgdG8gc2V0IGEgc3BlY2lmaWVkIHZpZGVvIG1vZGUgKi8KLQotdm9pZCBzZXRWaWRlb01vZGUoaW50IG1vZGUpCi17Ci0gICAgUk1SRUdTIHI7Ci0KLSAgICByLnguYXggPSBtb2RlOwotICAgIFBNX2ludDg2KDB4MTAsICZyLCAmcik7Ci19Ci0KLS8qIFJvdXRpbmUgdG8gY2xlYXIgYSByZWN0YW5ndWxhciByZWdpb24gb24gdGhlIGRpc3BsYXkgYnkgY2FsbGluZyB0aGUKLSAqIHZpZGVvIEJJT1MuCi0gKi8KLQotdm9pZCBjbGVhclNjcmVlbihpbnQgc3RhcnR4LCBpbnQgc3RhcnR5LCBpbnQgZW5keCwgaW50IGVuZHksIHVuc2lnbmVkIGNoYXIgYXR0cikKLXsKLSAgICBSTVJFR1MgcjsKLQotICAgIHIueC5heCA9IDB4MDYwMDsKLSAgICByLmguYmggPSBhdHRyOwotICAgIHIuaC5jbCA9IHN0YXJ0eDsKLSAgICByLmguY2ggPSBzdGFydHk7Ci0gICAgci5oLmRsID0gZW5keDsKLSAgICByLmguZGggPSBlbmR5OwotICAgIFBNX2ludDg2KDB4MTAsICZyLCAmcik7Ci19Ci0KLS8qIFJvdXRpbmUgdG8gZmlsbCBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvbiB0aGUgZGlzcGxheSB1c2luZyBkaXJlY3QKLSAqIHZpZGVvIHdyaXRlcy4KLSAqLwotCi0jZGVmaW5lIFNDUkVFTih4LHkpICh2aWRlb1B0ciArICgoeSkgKiAxNjApICsgKCh4KSA8PCAxKSkKLQotdm9pZCBmaWxsKGludCBzdGFydHgsIGludCBzdGFydHksIGludCBlbmR4LCBpbnQgZW5keSwgdW5zaWduZWQgY2hhciBjLAotICAgIHVuc2lnbmVkIGNoYXIgYXR0cikKLXsKLSAgICB1bnNpZ25lZCBjaGFyICAgKnY7Ci0gICAgaW50ICAgICAgICAgICAgIHgseTsKLQotICAgIGZvciAoeSA9IHN0YXJ0eTsgeSA8PSBlbmR5OyB5KyspIHsKLQl2ID0gU0NSRUVOKHN0YXJ0eCx5KTsKLQlmb3IgKHggPSBzdGFydHg7IHggPD0gZW5keDsgeCsrKSB7Ci0JICAgICp2KysgPSBjOwotCSAgICAqdisrID0gYXR0cjsKLQkgICAgfQotCX0KLX0KLQotLyogUm91dGluZSB0byBkaXNwbGF5IGEgc2luZ2xlIGNoYXJhY3RlciB1c2luZyBkaXJlY3QgdmlkZW8gd3JpdGVzICovCi0KLXZvaWQgd3JpdGVDaGFyKGludCB4LCBpbnQgeSwgdW5zaWduZWQgY2hhciBjLCB1bnNpZ25lZCBjaGFyIGF0dHIpCi17Ci0gICAgdW5zaWduZWQgY2hhciAqdiA9IFNDUkVFTih4LHkpOwotICAgICp2KysgPSBjOwotICAgICp2ID0gYXR0cjsKLX0KLQotLyogUm91dGluZSB0byBkcmF3IGEgYm9yZGVyIGFyb3VuZCBhIHJlY3Rhbmd1bGFyIGFyZWEgdXNpbmcgZGlyZWN0IHZpZGVvCi0gKiB3cml0ZXMuCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgYm9yZGVyX2NoYXJzW10gPSB7Ci0gICAgMTg2LCAyMDUsIDIwMSwgMTg3LCAyMDAsIDE4OCAgICAgICAgLyogZG91YmxlIGJveCBjaGFycyAqLwotICAgIH07Ci0KLXZvaWQgYm9yZGVyKGludCBzdGFydHgsIGludCBzdGFydHksIGludCBlbmR4LCBpbnQgZW5keSwgdW5zaWduZWQgY2hhciBhdHRyKQotewotICAgIHVuc2lnbmVkIGNoYXIgICAqdjsKLSAgICB1bnNpZ25lZCBjaGFyICAgKmI7Ci0gICAgaW50ICAgICAgICAgICAgIGk7Ci0KLSAgICBiID0gYm9yZGVyX2NoYXJzOwotCi0gICAgZm9yIChpID0gc3RhcnR5KzE7IGkgPCBlbmR5OyBpKyspIHsKLQl3cml0ZUNoYXIoc3RhcnR4LCBpLCAqYiwgYXR0cik7Ci0Jd3JpdGVDaGFyKGVuZHgsIGksICpiLCBhdHRyKTsKLQl9Ci0gICAgYisrOwotICAgIGZvciAoaSA9IHN0YXJ0eCsxLCB2ID0gU0NSRUVOKHN0YXJ0eCsxLCBzdGFydHkpOyBpIDwgZW5keDsgaSsrKSB7Ci0JKnYrKyA9ICpiOwotCSp2KysgPSBhdHRyOwotCX0KLSAgICBmb3IgKGkgPSBzdGFydHgrMSwgdiA9IFNDUkVFTihzdGFydHgrMSwgZW5keSk7IGkgPCBlbmR4OyBpKyspIHsKLQkqdisrID0gKmI7Ci0JKnYrKyA9IGF0dHI7Ci0JfQotICAgIGIrKzsKLSAgICB3cml0ZUNoYXIoc3RhcnR4LCBzdGFydHksICpiKyssIGF0dHIpOwotICAgIHdyaXRlQ2hhcihlbmR4LCBzdGFydHksICpiKyssIGF0dHIpOwotICAgIHdyaXRlQ2hhcihzdGFydHgsIGVuZHksICpiKyssIGF0dHIpOwotICAgIHdyaXRlQ2hhcihlbmR4LCBlbmR5LCAqYisrLCBhdHRyKTsKLX0KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBpbnQgICAgIG9yZ01vZGU7Ci0gICAgUE1fSFdORCBod25kQ29uc29sZTsKLQotICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOwotICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgewotCWNhc2UgUE1fcmVhbE1vZGU6Ci0JICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8yODY6Ci0JICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8zODY6Ci0JICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgaHduZENvbnNvbGUgPSBQTV9vcGVuQ29uc29sZSgwLDAsMCwwLDAsdHJ1ZSk7Ci0gICAgcHJpbnRmKCJIaXQgYW55IGtleSB0byBzdGFydCA4MHgyNSB0ZXh0IG1vZGUgYW5kIHBlcmZvcm0gc29tZSBkaXJlY3QgdmlkZW8gb3V0cHV0LlxuIik7Ci0gICAgUE1fZ2V0Y2goKTsKLQotICAgIC8qIEFsbG9jYXRlIGEgYnVmZmVyIHRvIHNhdmUgY29uc29sZSBzdGF0ZSBhbmQgc2F2ZSB0aGUgc3RhdGUgKi8KLSAgICBpZiAoKHN0YXRlQnVmID0gUE1fbWFsbG9jKFBNX2dldENvbnNvbGVTdGF0ZVNpemUoKSkpID09IE5VTEwpIHsKLQlwcmludGYoIlVuYWJsZSB0byBhbGxvY2F0ZSBjb25zb2xlIHN0YXRlIGJ1ZmZlciFcbiIpOwotCWV4aXQoMSk7Ci0JfQotICAgIFBNX3NhdmVDb25zb2xlU3RhdGUoc3RhdGVCdWYsMCk7Ci0gICAgYmlvcyA9IFBNX2dldEJJT1NQb2ludGVyKCk7Ci0gICAgb3JnTW9kZSA9IGdldFZpZGVvTW9kZSgpOwotICAgIHNldFZpZGVvTW9kZSgweDMpOwotICAgIGlmICgodmlkZW9QdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMHhCODAwMCwweEZGRkYsdHJ1ZSkpID09IE5VTEwpIHsKLQlwcmludGYoIlVuYWJsZSB0byBvYnRhaW4gcG9pbnRlciB0byBmcmFtZWJ1ZmZlciFcbiIpOwotCWV4aXQoMSk7Ci0JfQotCi0gICAgLyogRHJhdyBzb21lIHRleHQgb24gdGhlIHNjcmVlbiAqLwotICAgIGZpbGwoMCwgMCwgNzksIDI0LCAxNzYsIDB4MUUpOwotICAgIGJvcmRlcigwLCAwLCA3OSwgMjQsIDB4MUYpOwotICAgIFBNX2dldGNoKCk7Ci0gICAgY2xlYXJTY3JlZW4oMCwgMCwgNzksIDI0LCAweDcpOwotCi0gICAgLyogUmVzdG9yZSB0aGUgY29uc29sZSBzdGF0ZSBvbiBleGl0ICovCi0gICAgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShzdGF0ZUJ1ZiwwKTsKLSAgICBQTV9mcmVlKHN0YXRlQnVmKTsKLSAgICBQTV9jbG9zZUNvbnNvbGUoaHduZENvbnNvbGUpOwotCi0gICAgLyogRGlzcGxheSB1c2VmdWwgc3RhdHVzIGluZm9ybWF0aW9uICovCi0gICAgcHJpbnRmKCJcbiIpOwotICAgIHByaW50ZigiT3JpZ2luYWwgVmlkZW8gTW9kZSA9ICUwMlhcbiIsIG9yZ01vZGUpOwotICAgIHByaW50ZigiQklPUyBQb2ludGVyID0gJTA4WFxuIiwgKGludCliaW9zKTsKLSAgICBwcmludGYoIlZpZGVvIE1lbW9yeSA9ICUwOFhcbiIsIChpbnQpdmlkZW9QdHIpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC9jcHVpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NjBiNzIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBPUy8yIFZERAotKgotKiBEZXNjcmlwdGlvbjogIFZERCBzcGVjaWZpYyBjb2RlIGZvciB0aGUgQ1BVIGRldGVjdGlvbiBtb2R1bGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURvIG5vdGhpbmcgZm9yIFZERCdzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTZXRNYXhUaHJlYWRQcmlvcml0eSgpICAgICAgMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURvIG5vdGhpbmcgZm9yIFZERCdzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoaSkgICAgKHZvaWQpKGkpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgR2V0Q291bnRlckZyZXF1ZW5jeSgKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICpmcmVxKQotewotICAgIGZyZXEtPmxvdyAgPSAxMDAwMDA7Ci0gICAgZnJlcS0+aGlnaCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgR2V0Q291bnRlcih0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVTE9ORyAgIGNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb3VudCA9IFZESFF1ZXJ5U3lzVmFsdWUoMCwgVkRIR1NWX01TRUNTQk9PVCk7IFwKLSAgICAodCktPmxvdyAgPSBjb3VudCAqIDEwMDsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodCktPmhpZ2ggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC9maWxlaW8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC9maWxlaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3NDJkZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvZmlsZWlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IE9TLzIgVkRECi0qCi0qIERlc2NyaXB0aW9uOiAgQyBsaWJyYXJ5IGNvbXBhdGlibGUgSS9PIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGhpbiBhIFZERC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgInZkZGZpbGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFpbiBDb2RlIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBFT0YgLTEKLQotLyogTkI6IG5vbmUgb2YgdGhlIGZpbGUgVkRIcyBhcmUgYXZhaWxhYmxlIGR1cmluZyB0aGUgRE9TIHNlc3Npb24gICAgICAgICAgKi8KLS8qIGluaXRpYWx6YXRpb24gY29udGV4dCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qIE1hY3JvcyBmb3IgT3Blbi9DbG9zZSBBUElzIHRvIGFsbG93IHVzaW5nIHRoaXMgbW9kdWxlIGluIGJvdGggVkREcyBhbmQgICovCi0vKiBub3JtYWwgT1MvMiBhcHBsaWNhdGlvbnMuIFVuZm9ydHVuYXRlbHkgVkRIUmVhZC9Xcml0ZS9TZWVrIGRvbid0IG1hcCB0byAqLwotLyogdGhlaXIgRG9zKiBjb3VudGVycGFydHMgc28gY2xlYW5seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBfX09TMl9WRERfXwotI2RlZmluZSBfT1MyT3BlbiAgICBWREhPcGVuCi0jZGVmaW5lIF9PUzJDbG9zZSAgIFZESENsb3NlCi0jZWxzZQotI2RlZmluZSBfT1MyT3BlbiAgICBEb3NPcGVuCi0jZGVmaW5lIF9PUzJDbG9zZSAgIERvc0Nsb3NlCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WREQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmb3BlbiBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1GSUxFICogZm9wZW4oCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgY29uc3QgY2hhciAqbW9kZSkKLXsKLSAgICBGSUxFICAgICpmID0gUE1fbWFsbG9jKHNpemVvZihGSUxFKSk7Ci0gICAgbG9uZyAgICBvbGRwb3M7Ci0gICAgVUxPTkcgICByYywgdWxBY3Rpb247Ci0gICAgVUxPTkcgICBvbW9kZSwgb2ZsYWdzOwotCi0gICAgaWYgKGYgIT0gTlVMTCkgewotCWYtPm9mZnNldCA9IDA7Ci0JZi0+dGV4dCA9IChtb2RlWzFdID09ICd0JyB8fCBtb2RlWzJdID09ICd0Jyk7Ci0JZi0+d3JpdGVtb2RlID0gKG1vZGVbMF0gPT0gJ3cnKSB8fCAobW9kZVswXSA9PSAnYScpOwotCWYtPnVucHV0YyA9IEVPRjsKLQlmLT5lbmRwID0gZi0+YnVmICsgc2l6ZW9mKGYtPmJ1Zik7Ci0JZi0+Y3VycCA9IGYtPnN0YXJ0cCA9IGYtPmJ1ZjsKLQotCWlmIChtb2RlWzBdID09ICdyJykgewotCSAgICAjaWZkZWYgX19PUzJfVkREX18KLQkgICAgb21vZGUgID0gVkRIT1BFTl9BQ0NFU1NfUkVBRE9OTFkgfCBWREhPUEVOX1NIQVJFX0RFTllOT05FOwotCSAgICBvZmxhZ3MgPSBWREhPUEVOX0FDVElPTl9PUEVOX0lGX0VYSVNUUyB8IFZESE9QRU5fQUNUSU9OX0ZBSUxfSUZfTkVXOwotCSAgICAjZWxzZQotCSAgICBvbW9kZSAgPSBPUEVOX0FDQ0VTU19SRUFET05MWSB8IE9QRU5fU0hBUkVfREVOWU5PTkU7Ci0JICAgIG9mbGFncyA9IE9QRU5fQUNUSU9OX09QRU5fSUZfRVhJU1RTIHwgT1BFTl9BQ1RJT05fRkFJTF9JRl9ORVc7Ci0JICAgICNlbmRpZgotCSAgICB9Ci0JZWxzZSBpZiAobW9kZVswXSA9PSAndycpIHsKLQkgICAgI2lmZGVmIF9fT1MyX1ZERF9fCi0JICAgIG9tb2RlICA9IFZESE9QRU5fQUNDRVNTX1dSSVRFT05MWSB8IFZESE9QRU5fU0hBUkVfREVOWVdSSVRFOwotCSAgICBvZmxhZ3MgPSBWREhPUEVOX0FDVElPTl9SRVBMQUNFX0lGX0VYSVNUUyB8IFZESE9QRU5fQUNUSU9OX0NSRUFURV9JRl9ORVc7Ci0JICAgICNlbHNlCi0JICAgIG9tb2RlICA9IE9QRU5fQUNDRVNTX1dSSVRFT05MWSB8IE9QRU5fU0hBUkVfREVOWVdSSVRFOwotCSAgICBvZmxhZ3MgPSBPUEVOX0FDVElPTl9SRVBMQUNFX0lGX0VYSVNUUyB8IE9QRU5fQUNUSU9OX0NSRUFURV9JRl9ORVc7Ci0JICAgICNlbmRpZgotCSAgICB9Ci0JZWxzZSB7Ci0JICAgICNpZmRlZiBfX09TMl9WRERfXwotCSAgICBvbW9kZSAgPSBWREhPUEVOX0FDQ0VTU19SRUFEV1JJVEUgfCBWREhPUEVOX1NIQVJFX0RFTllXUklURTsKLQkgICAgb2ZsYWdzID0gVkRIT1BFTl9BQ1RJT05fT1BFTl9JRl9FWElTVFMgfCBWREhPUEVOX0FDVElPTl9DUkVBVEVfSUZfTkVXOwotCSAgICAjZWxzZQotCSAgICBvbW9kZSAgPSBPUEVOX0FDQ0VTU19SRUFEV1JJVEUgfCBPUEVOX1NIQVJFX0RFTllXUklURTsKLQkgICAgb2ZsYWdzID0gT1BFTl9BQ1RJT05fT1BFTl9JRl9FWElTVFMgfCBPUEVOX0FDVElPTl9DUkVBVEVfSUZfTkVXOwotCSAgICAjZW5kaWYKLQkgICAgfQotCXJjID0gX09TMk9wZW4oKFBTWilmaWxlbmFtZSwgKFBIRklMRSkmZi0+aGFuZGxlLCAmdWxBY3Rpb24sIDAsIFZESE9QRU5fRklMRV9OT1JNQUwsIG9mbGFncywgb21vZGUsIE5VTEwpOwotCWlmIChyYyAhPSAwKSB7Ci0JICAgIFBNX2ZyZWUoZik7Ci0JICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0KLQkjaWZkZWYgX19PUzJfVkREX18KLQlmLT5maWxlc2l6ZSA9IFZESFNlZWsoKEhGSUxFKWYtPmhhbmRsZSwgMCwgVkRIU0tfRU5EX09GX0ZJTEUpOwotCSNlbHNlCi0JcmMgPSBEb3NTZXRGaWxlUHRyKChIRklMRSlmLT5oYW5kbGUsIDAsIEZJTEVfRU5ELCAmZi0+ZmlsZXNpemUpOwotCSNlbmRpZgotCi0JaWYgKG1vZGVbMF0gPT0gJ2EnKQotCSAgICBmc2VlayhmLDAsMik7Ci0gICAgfQotICAgIHJldHVybiBmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZERCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZyZWFkIGZ1bmN0aW9uLiBOb3RlIHRoYXQgdW5saWtlIFdpbmRvd3MgVnhEcywKLU9TLzIgVkREcyBhcmUgbm90IGxpbWl0ZWQgdG8gNjRLIHJlYWRzIG9yIHdyaXRlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zaXplX3QgZnJlYWQoCi0gICAgdm9pZCAqcHRyLAotICAgIHNpemVfdCBzaXplLAotICAgIHNpemVfdCBuLAotICAgIEZJTEUgKmYpCi17Ci0gICAgY2hhciAgICAqYnVmID0gcHRyOwotICAgIGludCAgICAgYnl0ZXMscmVhZGJ5dGVzLHRvdGFsYnl0ZXMgPSAwOwotCi0gICAgLyogRmlyc3QgY29weSBhbnkgZGF0YSBhbHJlYWR5IHJlYWQgaW50byBvdXIgYnVmZmVyICovCi0gICAgaWYgKChieXRlcyA9IChmLT5jdXJwIC0gZi0+c3RhcnRwKSkgPiAwKSB7Ci0JbWVtY3B5KGJ1ZixmLT5jdXJwLGJ5dGVzKTsKLQlmLT5zdGFydHAgPSBmLT5jdXJwID0gZi0+YnVmOwotCWJ1ZiArPSBieXRlczsKLQl0b3RhbGJ5dGVzICs9IGJ5dGVzOwotCWJ5dGVzID0gKHNpemUgKiBuKSAtIGJ5dGVzOwotCX0KLSAgICBlbHNlCi0JYnl0ZXMgPSBzaXplICogbjsKLSAgICBpZiAoYnl0ZXMpIHsKLQkjaWZkZWYgX19PUzJfVkREX18KLQlyZWFkYnl0ZXMgPSBWREhSZWFkKChIRklMRSlmLT5oYW5kbGUsIGJ1ZiwgYnl0ZXMpOwotCSNlbHNlCi0JRG9zUmVhZCgoSEZJTEUpZi0+aGFuZGxlLCBidWYsIGJ5dGVzLCAmcmVhZGJ5dGVzKTsKLQkjZW5kaWYKLQl0b3RhbGJ5dGVzICs9IHJlYWRieXRlczsKLQlmLT5vZmZzZXQgKz0gcmVhZGJ5dGVzOwotCX0KLSAgICByZXR1cm4gdG90YWxieXRlcyAvIHNpemU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVkREIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZndyaXRlIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXNpemVfdCBmd3JpdGUoCi0gICAgdm9pZCAqcHRyLAotICAgIHNpemVfdCBzaXplLAotICAgIHNpemVfdCBuLAotICAgIEZJTEUgKmYpCi17Ci0gICAgY2hhciAgICAgICAgKmJ1ZiA9IHB0cjsKLSAgICBpbnQgICAgICAgICBieXRlcyx3cml0dGVuYnl0ZXMsdG90YWxieXRlcyA9IDA7Ci0KLSAgICAvKiBGbHVzaCBhbnl0aGluZyBhbHJlYWR5IGluIHRoZSBidWZmZXIgKi8KLSAgICBpZiAoIWYtPndyaXRlbW9kZSkKLQlyZXR1cm4gMDsKLSAgICBmZmx1c2goZik7Ci0gICAgYnl0ZXMgPSBzaXplICogbjsKLSAgICAjaWZkZWYgX19PUzJfVkREX18KLSAgICB3cml0dGVuYnl0ZXMgPSBWREhXcml0ZSgoSEZJTEUpZi0+aGFuZGxlLCBidWYsIGJ5dGVzKTsKLSAgICAjZWxzZQotICAgIERvc1dyaXRlKChIRklMRSlmLT5oYW5kbGUsIGJ1ZiwgYnl0ZXMsICZ3cml0dGVuYnl0ZXMpOwotICAgICNlbmRpZgotICAgIHRvdGFsYnl0ZXMgKz0gd3JpdHRlbmJ5dGVzOwotICAgIGYtPm9mZnNldCArPSB3cml0dGVuYnl0ZXM7Ci0gICAgaWYgKGYtPm9mZnNldCA+IGYtPmZpbGVzaXplKQotCWYtPmZpbGVzaXplID0gZi0+b2Zmc2V0OwotICAgIHJldHVybiB0b3RhbGJ5dGVzIC8gc2l6ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmZmx1c2ggZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZmbHVzaCgKLSAgICBGSUxFICpmKQotewotICAgIFVMT05HICAgICBieXRlczsKLQotICAgIC8qIEZpcnN0IGNvcHkgYW55IGRhdGEgYWxyZWFkeSB3cml0dGVuIGludG8gb3VyIGJ1ZmZlciAqLwotICAgIGlmIChmLT53cml0ZW1vZGUgJiYgKGJ5dGVzID0gKGYtPmN1cnAgLSBmLT5zdGFydHApKSA+IDApIHsKLQkjaWZkZWYgX19PUzJfVkREX18KLQlieXRlcyA9IFZESFdyaXRlKChIRklMRSlmLT5oYW5kbGUsIGYtPnN0YXJ0cCwgYnl0ZXMpOwotCSNlbHNlCi0JRG9zV3JpdGUoKEhGSUxFKWYtPmhhbmRsZSwgZi0+c3RhcnRwLCBieXRlcywgJmJ5dGVzKTsKLQkjZW5kaWYKLQlmLT5vZmZzZXQgKz0gYnl0ZXM7Ci0JaWYgKGYtPm9mZnNldCA+IGYtPmZpbGVzaXplKQotCSAgICBmLT5maWxlc2l6ZSA9IGYtPm9mZnNldDsKLQlmLT5zdGFydHAgPSBmLT5jdXJwID0gZi0+YnVmOwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WREQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmc2VlayBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZnNlZWsoCi0gICAgRklMRSAqZiwKLSAgICBsb25nIGludCBvZmZzZXQsCi0gICAgaW50IHdoZW5jZSkKLXsKLSAgICBmZmx1c2goZik7Ci0KLSAgICBpZiAod2hlbmNlID09IDApCi0JZi0+b2Zmc2V0ID0gb2Zmc2V0OwotICAgIGVsc2UgaWYgKHdoZW5jZSA9PSAxKQotCWYtPm9mZnNldCArPSBvZmZzZXQ7Ci0gICAgZWxzZSBpZiAod2hlbmNlID09IDIpCi0JZi0+b2Zmc2V0ID0gZi0+ZmlsZXNpemUgKyBvZmZzZXQ7Ci0KLSAgICAjaWZkZWYgX19PUzJfVkREX18KLSAgICBWREhTZWVrKChIRklMRSlmLT5oYW5kbGUsIGYtPm9mZnNldCwgVkRIU0tfQUJTT0xVVEUpOwotICAgICNlbHNlCi0gICAgRG9zU2V0RmlsZVB0cigoSEZJTEUpZi0+aGFuZGxlLCBmLT5vZmZzZXQsIEZJTEVfQkVHSU4sIE5VTEwpOwotICAgICNlbmRpZgotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVkREIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZnRlbGwgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotbG9uZyBmdGVsbCgKLSAgICBGSUxFICpmKQotewotICAgIGxvbmcgICAgb2Zmc2V0OwotCi0gICAgb2Zmc2V0ID0gKGYtPmN1cnAgLSBmLT5zdGFydHApOwotICAgIG9mZnNldCArPSBmLT5vZmZzZXQ7Ci0gICAgcmV0dXJuIG9mZnNldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WREQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmZW9mIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmZW9mKAotICAgIEZJTEUgKmYpCi17Ci0gICAgcmV0dXJuIChmLT5vZmZzZXQgPT0gZi0+ZmlsZXNpemUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gdGhlIGlucHV0IGZpbGUgYnVmZmVyLCBpbmNsdWRpbmcgdHJhbnNsYXRpb24KLW9mIHRoZSBjaGFyYWN0ZXIgaW4gdGV4dCB0cmFuc2F0aW9uIG1vZGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgX19nZXRjKAotICAgIEZJTEUgKmYpCi17Ci0gICAgaW50IGM7Ci0KLSAgICBpZiAoZi0+dW5wdXRjICE9IEVPRikgewotCWMgPSBmLT51bnB1dGM7Ci0JZi0+dW5wdXRjID0gRU9GOwotCX0KLSAgICBlbHNlIHsKLQlpZiAoZi0+c3RhcnRwID09IGYtPmN1cnApIHsKLQkgICAgaW50IGJ5dGVzID0gZnJlYWQoZi0+YnVmLDEsc2l6ZW9mKGYtPmJ1ZiksZik7Ci0JICAgIGlmIChieXRlcyA9PSAwKQotCQlyZXR1cm4gRU9GOwotCSAgICBmLT5jdXJwID0gZi0+c3RhcnRwICsgYnl0ZXM7Ci0JICAgIH0KLQljID0gKmYtPnN0YXJ0cCsrOwotCWlmIChmLT50ZXh0ICYmIGMgPT0gJ1xyJykgewotCSAgICBpbnQgbmMgPSBfX2dldGMoZik7Ci0JICAgIGlmIChuYyAhPSAnXG4nKQotCQlmLT51bnB1dGMgPSBuYzsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gYzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Xcml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0byBpbnB1dCBidWZmZXIsIGluY2x1ZGluZyB0cmFuc2xhdGlvbiBvZiB0aGUKLWNoYXJhY3RlciBpbiB0ZXh0IHRyYW5zYXRpb24gbW9kZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBfX3B1dGMoaW50IGMsRklMRSAqZikKLXsKLSAgICBpbnQgY291bnQgPSAxOwotICAgIGlmIChmLT50ZXh0ICYmIGMgPT0gJ1xuJykgewotCV9fcHV0YygnXHInLGYpOwotCWNvdW50ID0gMjsKLQl9Ci0gICAgaWYgKGYtPmN1cnAgPT0gZi0+ZW5kcCkKLQlmZmx1c2goZik7Ci0gICAgKmYtPmN1cnArKyA9IGM7Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZ4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZnZXRzIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIgKmZnZXRzKAotICAgIGNoYXIgKnMsCi0gICAgaW50IG4sCi0gICAgRklMRSAqZikKLXsKLSAgICBpbnQgYyA9IDA7Ci0gICAgY2hhciAqY3M7Ci0KLSAgICBjcyA9IHM7Ci0gICAgd2hpbGUgKC0tbiA+IDAgJiYgKGMgPSBfX2dldGMoZikpICE9IEVPRikgewotCSpjcysrID0gYzsKLQlpZiAoYyA9PSAnXG4nKQotCSAgICBicmVhazsKLQl9Ci0gICAgaWYgKGMgPT0gRU9GICYmIGNzID09IHMpCi0JcmV0dXJuIE5VTEw7Ci0gICAgKmNzID0gJ1wwJzsKLSAgICByZXR1cm4gczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmcHV0cyBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZnB1dHMoCi0gICAgY29uc3QgY2hhciAqcywKLSAgICBGSUxFICpmKQotewotICAgIGludCByID0gMDsKLSAgICBpbnQgYzsKLQotICAgIHdoaWxlICgoYyA9ICpzKyspICE9IDApCi0JciA9IF9fcHV0YyhjLCBmKTsKLSAgICByZXR1cm4gcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmY2xvc2UgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZjbG9zZSgKLSAgICBGSUxFICpmKQotewotICAgIGZmbHVzaChmKTsKLSAgICBfT1MyQ2xvc2UoKEhGSUxFKWYtPmhhbmRsZSk7Ci0gICAgUE1fZnJlZShmKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL29zaGRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjg2YmQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgT1MvMiBWREQKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODhiYWIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL3BtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBPUy8yIFZERAotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAotKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQotKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKLSogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAotKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCi0jaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKLSNpbmNsdWRlICJtdHJyLmgiCi0KLSNkZWZpbmUgVFJBQ0UoYSkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBNQVhfTUVNT1JZX1NIQVJFRCAgICAgICAgICAgMTAwCi0jZGVmaW5lIE1BWF9NRU1PUllfTUFQUElOR1MgICAgICAgICAxMDAKLQotLyogVE9ETzogSSB0aGluayB0aGUgZ2xvYmFsIGFuZCBsaW5lYXIgbWVtYmVycyB3aWxsIGJlIHRoZSBzYW1lLCBidXQgbm90IHN1cmUgeWV0LiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHZvaWQgICAgKmxpbmVhcjsKLSAgICB1bG9uZyAgIGdsb2JhbDsKLSAgICB1bG9uZyAgIGxlbmd0aDsKLSAgICBpbnQgICAgIG5wYWdlczsKLSAgICB9IG1lbXNoYXJlZDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgcGh5c2ljYWw7Ci0gICAgdWxvbmcgICBsaW5lYXI7Ci0gICAgdWxvbmcgICBsZW5ndGg7Ci0gICAgaW50ICAgICBucGFnZXM7Ci0gICAgaWJvb2wgICBpc0NhY2hlZDsKLSAgICB9IG1tYXBwaW5nOwotCi1zdGF0aWMgaW50ICAgICAgICAgIG51bU1hcHBpbmdzID0gMDsKLXN0YXRpYyBtZW1zaGFyZWQgICAgc2hhcmVkW01BWF9NRU1PUllfTUFQUElOR1NdID0gezB9Owotc3RhdGljIG1tYXBwaW5nICAgICBtYXBzW01BWF9NRU1PUllfTUFQUElOR1NdOwotaWJvb2wgICAgICAgICAgICAgICBfUE1faGF2ZUJJT1MgPSBUUlVFOwotY2hhciAgICAgICAgICAgICAgICBfUE1fY250UGF0aFtQTV9NQVhfUEFUSF0gPSAiIjsgICAgIC8qIHRoZXJlIGp1c3QgaXNuJ3QgYW55ICovCi11Y2hhciAgICAgICAgICAgICAgICpfUE1fcm1CdWZBZGRyID0gTlVMTDsKLXVzaG9ydCBfVkFSQVBJICAgICAgUE1fc2F2ZWREUyA9IDA7ICAgLyogd2h5IGNhbid0IEkgdXNlIHRoZSB1bmRlcnNjb3JlIHByZWZpeD8gKi8KLQotSFZESFNFTSAgICAgICAgICAgICBoZXZGYXJDYWxsUmV0ID0gTlVMTDsKLUhWREhTRU0gICAgICAgICAgICAgaGV2SVJldCAgICAgICA9IE5VTEw7Ci1ISE9PSyAgICAgICAgICAgICAgIGhob29rVXNlclJldHVybkhvb2sgPSBOVUxMOwotSEhPT0sgICAgICAgICAgICAgICBoaG9va1VzZXJJUmV0SG9vayAgID0gTlVMTDsKLQotc3RhdGljIHZvaWQgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBGdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgQ01PUyByZWdpc3RlcnMgKi8KLQotdWxvbmcgICBQTUFQSSBfUE1fZ2V0UERCKHZvaWQpOwotdWNoYXIgICBQTUFQSSBfUE1fcmVhZENNT1MoaW50IGluZGV4KTsKLXZvaWQgICAgUE1BUEkgX1BNX3dyaXRlQ01PUyhpbnQgaW5kZXgsdWNoYXIgdmFsdWUpOwotCi1WT0lEIEhPT0tFTlRSWSBVc2VyUmV0dXJuSG9vayhQVk9JRCBwUmVmRGF0YSwgUENSRiBwY3JmKTsKLVZPSUQgSE9PS0VOVFJZIFVzZXJJUmV0SG9vayhQVk9JRCBwUmVmRGF0YSwgUENSRiBwY3JmKTsKLQotdm9pZCBQTUFQSSBQTV9pbml0KHZvaWQpCi17Ci0gICAgTVRSUl9pbml0KCk7Ci0KLSAgICAvKiBJbml0aWFsaXplIFZERC1zcGVjaWZpYyBkYXRhICovCi0gICAgLyogTm90ZTogUE1faW5pdCBtdXN0IGJlIChvYnZpb3VzbHkpIGNhbGxlZCBpbiBWRE0gdGFzayBjb250ZXh0ISAqLwotICAgIFZESENyZWF0ZVNlbSgmaGV2RmFyQ2FsbFJldCwgVkRIX0VWRU5UU0VNKTsKLSAgICBWREhDcmVhdGVTZW0oJmhldklSZXQsIFZESF9FVkVOVFNFTSk7Ci0gICAgaGhvb2tVc2VyUmV0dXJuSG9vayA9IFZESEFsbG9jSG9vayhWREhfUkVUVVJOX0hPT0ssIChQRk5BUk0pVXNlclJldHVybkhvb2ssIDApOwotICAgIGhob29rVXNlcklSZXRIb29rICAgPSBWREhBbGxvY0hvb2soVkRIX1JFVFVSTl9IT09LLCAoUEZOQVJNKVVzZXJJUmV0SG9vaywgMCk7Ci0KLSAgICBpZiAoKGhldklSZXQgPT0gTlVMTCkgfHwgKGhldkZhckNhbGxSZXQgPT0gTlVMTCkgfHwKLQkoaGhvb2tVc2VyUmV0dXJuSG9vayA9PSBOVUxMKSB8fCAoaGhvb2tVc2VySVJldEhvb2sgPT0gTlVMTCkpIHsKLQkvKiBzb21ldGhpbmcgZmFpbGVkLCB3ZSBjYW4ndCBnbyBvbiAqLwotCS8qIFRPRE86IHRha2Ugc29tZSBhY3Rpb24gaGVyZSEgKi8KLQl9Ci19Ci0KLS8qIERvIHNvbWUgY2xlYW5pbmcgdXAgKi8KLXZvaWQgUE1BUEkgUE1fZXhpdCh2b2lkKQotewotICAgIC8qIE5vdGU6IEhvb2tzIGFsbG9jYXRlZCBkdXJpbmcgb3IgYWZ0ZXIgVkRNIGNyZWF0aW9uIGFyZSBkZWFsbG9jYXRlZCBhdXRvbWF0aWNhbGx5ICovCi0gICAgaWYgKGhldklSZXQgIT0gTlVMTCkKLQlWREhEZXN0cm95U2VtKGhldklSZXQpOwotCi0gICAgaWYgKGhldkZhckNhbGxSZXQgIT0gTlVMTCkKLQlWREhEZXN0cm95U2VtKGhldkZhckNhbGxSZXQpOwotfQotCi1pYm9vbCBQTUFQSSBQTV9oYXZlQklPU0FjY2Vzcyh2b2lkKQoteyByZXR1cm4gX1BNX2hhdmVCSU9TOyB9Ci0KLWxvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCi17IHJldHVybiAvKl9PU19PUzJWREQqLyBfT1NfT1MyOyB9ICAvKkZJWCEhICovCi0KLWludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQoteyByZXR1cm4gUE1fMzg2OyB9Ci0KLXZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKGNoYXIgKnMpCi17Ci0gICAgdWludCBwb3MgPSBzdHJsZW4ocyk7Ci0gICAgaWYgKHNbcG9zLTFdICE9ICdcXCcpIHsKLQlzW3Bvc10gPSAnXFwnOwotCXNbcG9zKzFdID0gJ1wwJzsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCi0gICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQotewotICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCi0JZmF0YWxFcnJvckNsZWFudXAoKTsKLS8qICAgIEZhdGFsX0Vycm9yX0hhbmRsZXIobXNnLDApOyAgVE9ETzogaW1wbGVtZW50IHNvbWVob3chICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbGVuICAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlcgotcnNlZyAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSByZWFsIG1vZGUgc2VnbWVudCBvZiB0aGUgYnVmZmVyCi1yb2ZmICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHJlYWwgbW9kZSBvZmZzZXQgb2YgdGhlIGJ1ZmZlcgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIGdsb2JhbCBWRVNBIHRyYW5zZmVyCi1idWZmZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYoCi0gICAgdWludCAqbGVuLAotICAgIHVpbnQgKnJzZWcsCi0gICAgdWludCAqcm9mZikKLXsKLSAgICBpZiAoX1BNX3JtQnVmQWRkcikgewotCSpsZW4gPSAwOyAvKlZFU0FfQlVGX1NJWkU7ICovCi0JKnJzZWcgPSAodWxvbmcpKF9QTV9ybUJ1ZkFkZHIpID4+IDQ7Ci0JKnJvZmYgPSAodWxvbmcpKF9QTV9ybUJ1ZkFkZHIpICYgMHhGOwotCXJldHVybiBfUE1fcm1CdWZBZGRyOwotCX0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotaW50IFBNQVBJIFBNX2ludDM4NihpbnQgaW50bm8sIFBNUkVHUyAqaW4sIFBNUkVHUyAqb3V0KQotewotICAgIC8qIFVudXNlZCBpbiBWRERzICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aChjaGFyICpwYXRoLGludCBtYXhMZW4pCi17Ci0gICAgc3RybmNweShwYXRoLCBfUE1fY250UGF0aCwgbWF4TGVuKTsKLSAgICBwYXRoW21heExlbiAtIDFdID0gMDsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKLXsKLSAgICB1bG9uZyAgIGJvb3QgPSAzOwotICAgIGJvb3QgPSBWREhRdWVyeVN5c1ZhbHVlKDAsIFZESEdTVl9CT09URFJWKTsKLSAgICByZXR1cm4gKGNoYXIpKCdhJyArIGJvb3QgLSAxKTsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbQ0NITUFYUEFUSF07Ci0gICAgc3RyY3B5KHBhdGgsIng6XFwiKTsKLSAgICBwYXRoWzBdID0gUE1fZ2V0Qm9vdERyaXZlKCk7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQotewotCXN0YXRpYyBjaGFyIHBhdGhbQ0NITUFYUEFUSF07Ci0Jc3RyY3B5KHBhdGgsIng6XFxvczJcXGRyaXZlcnMiKTsKLQlwYXRoWzBdID0gUE1fZ2V0Qm9vdERyaXZlKCk7Ci0JUE1fYmFja3NsYXNoKHBhdGgpOwotCXN0cmNhdChwYXRoLCJudWNsZXVzIik7Ci0JcmV0dXJuIHBhdGg7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLSAgICBzdHJjcHkocGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKLXsgcmV0dXJuIFBNX2dldE1hY2hpbmVOYW1lKCk7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCi17Ci0gICAgcmV0dXJuICJVbmtub3duIjsKLX0KLQotaW50IFBNQVBJIFBNX2tiaGl0KHZvaWQpCi17IHJldHVybiAxOyB9Ci0KLWludCBQTUFQSSBQTV9nZXRjaCh2b2lkKQoteyByZXR1cm4gMDsgfQotCi1QTV9IV05EIFBNQVBJIFBNX29wZW5Db25zb2xlKFBNX0hXTkQgaHduZFVzZXIsaW50IGRldmljZSxpbnQgeFJlcyxpbnQgeVJlcyxpbnQgYnBwLGlib29sIGZ1bGxTY3JlZW4pCi17Ci0gICAgLyogVW51c2VkIGluIFZERHMgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKLXsKLSAgICAvKiBVbnVzZWQgaW4gVkREcyAqLwotICAgIHJldHVybiAxOwotfQotCi12b2lkIFBNQVBJIFBNX3NhdmVDb25zb2xlU3RhdGUodm9pZCAqc3RhdGVCdWYsUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBVbnVzZWQgaW4gVkREcyAqLwotfQotCi12b2lkIFBNQVBJIFBNX3NldFN1c3BlbmRBcHBDYWxsYmFjayhpbnQgKF9BU01BUElQIHNhdmVTdGF0ZSkoaW50IGZsYWdzKSkKLXsKLSAgICAvKiBVbnVzZWQgaW4gVkREcyAqLwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoY29uc3Qgdm9pZCAqc3RhdGVCdWYsUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBVbnVzZWQgaW4gVkREcyAqLwotfQotCi12b2lkIFBNQVBJIFBNX2Nsb3NlQ29uc29sZShQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIC8qIFVudXNlZCBpbiBWRERzICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbihpbnQgeCxpbnQgeSkKLXsKLSAgICB1Y2hhciAqX2Jpb3NQdHIgPSBQTV9nZXRCSU9TUG9pbnRlcigpOwotICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg1MCx4KTsKLSAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4NTEseSk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0T1NTY3JlZW5XaWR0aChpbnQgd2lkdGgsaW50IGhlaWdodCkKLXsKLSAgICB1Y2hhciAqX2Jpb3NQdHIgPSBQTV9nZXRCSU9TUG9pbnRlcigpOwotICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg0QSx3aWR0aCk7Ci0gICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDg0LGhlaWdodC0xKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkuIEZvciBPUy8yIFZERCB3ZSBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5Ci1hcyBsb2NrZWQsIGdsb2JhbCBtZW1vcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGZyb20gYW55IG1lbW9yeSBjb250ZXh0Ci0oaW5jbHVkaW5nIGludGVycnVwdCB0aW1lIGNvbnRleHQpLCB3aGljaCBhbGxvd3MgdXMgdG8gbG9hZCBvdXIgaW1wb3J0YW50Ci1kYXRhIHN0cnVjdHVyZSBhbmQgY29kZSBzdWNoIHRoYXQgd2UgY2FuIGFjY2VzcyBpdCBkaXJlY3RseSBmcm9tIGEgcmluZwotMCBpbnRlcnJ1cHQgY29udGV4dC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKGxvbmcgc2l6ZSkKLXsKLSAgICBVTE9ORyAgICAgICBuUGFnZXMgPSAoc2l6ZSArIDB4RkZGKSA+PiAxMjsKLSAgICBpbnQgICAgICAgICBpOwotCi0gICAgLyogRmlyc3QgZmluZCBhIGZyZWUgc2xvdCBpbiBvdXIgc2hhcmVkIG1lbW9yeSB0YWJsZSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUVNT1JZX1NIQVJFRDsgaSsrKSB7Ci0JaWYgKHNoYXJlZFtpXS5saW5lYXIgPT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIGlmIChpIDwgTUFYX01FTU9SWV9TSEFSRUQpIHsKLQlzaGFyZWRbaV0ubGluZWFyID0gVkRIQWxsb2NQYWdlcyhOVUxMLCBuUGFnZXMsIFZESEFQX1NZU1RFTSB8IFZESEFQX0ZJWEVEKTsKLQlzaGFyZWRbaV0ubnBhZ2VzID0gblBhZ2VzOwotCXNoYXJlZFtpXS5nbG9iYWwgPSAoVUxPTkcpc2hhcmVkW2ldLmxpbmVhcjsKLQlyZXR1cm4gKHZvaWQqKXNoYXJlZFtpXS5nbG9iYWw7Ci0JfQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlU2hhcmVkKHZvaWQgKnApCi17Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBGaW5kIGEgc2hhcmVkIG1lbW9yeSBibG9jayBpbiBvdXIgdGFibGUgYW5kIGZyZWUgaXQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01FTU9SWV9TSEFSRUQ7IGkrKykgewotCWlmIChzaGFyZWRbaV0uZ2xvYmFsID09ICh1bG9uZylwKSB7Ci0JICAgIFZESEZyZWVQYWdlcyhzaGFyZWRbaV0ubGluZWFyKTsKLQkgICAgc2hhcmVkW2ldLmxpbmVhciA9IDA7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JfQotfQotCi12b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKHZvaWQgKmJhc2UsdWxvbmcgbGltaXQpCi17IHJldHVybiAodm9pZCopYmFzZTsgfQotCi1pYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAotICAgIHVzaG9ydCBheFZhbCwKLSAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCi0gICAgdm9pZCAqbWFwcGVkQklPUywKLSAgICB1bG9uZyBCSU9TTGVuKQotewotICAgIC8qIFRPRE86IEZpZ3VyZSBvdXQgaG93IHRvIGRvIHRoaXMgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQoteyByZXR1cm4gKHZvaWQqKTB4NDAwOyB9Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKLXsgcmV0dXJuIFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLDB4RkZGRix0cnVlKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJhc2UgICAgICAgIC0gUGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgdG8gbWFwcyBpbgotbGltaXQgICAgICAgLSBMaW1pdCBvZiBwaHlzaWNhbCBtZW1vcnkgdG8gcmVnaW9uIHRvIG1hcHMgaW4KLQotUkVUVVJOUzoKLUxpbmVhciBhZGRyZXNzIG9mIHRoZSBuZXdseSBtYXBwZWQgbWVtb3J5LgotCi1SRU1BUktTOgotTWFwcyBhIHBoeXNpY2FsIG1lbW9yeSByYW5nZSB0byBhIGxpbmVhciBtZW1vcnkgcmFuZ2UuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgTWFwUGh5c2ljYWxUb0xpbmVhcigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIGxpbWl0LAotICAgIGludCAqbnBhZ2VzKQotewotICAgIHVsb25nICAgbGluZWFyLGxlbmd0aCA9IGxpbWl0KzE7Ci0gICAgaW50ICAgICBpLHBwYWdlLGZsYWdzOwotI2lmIDAKLSAgICBwcGFnZSA9IGJhc2UgPj4gMTI7Ci0gICAgKm5wYWdlcyA9IChsZW5ndGggKyAoYmFzZSAmIDB4RkZGKSArIDQwOTUpID4+IDEyOwotICAgIGZsYWdzID0gUFJfRklYRUQgfCBQUl9TVEFUSUM7Ci0gICAgaWYgKGJhc2UgPT0gMHhBMDAwMCkgewotCS8qIFdlIHJlcXVpcmUgdGhlIGxpbmVhciBhZGRyZXNzIHRvIGJlIGFsaWduZWQgdG8gYSA2NEtiIGJvdW5kYXJ5Ci0JICogZm9yIG1hcHBpbmcgdGhlIGJhbmtlZCBmcmFtZWJ1ZmZlciAoc28gd2UgY2FuIGRvIGVmZmljaWVudAotCSAqIGNhcnJ5IGNoZWNraW5nIGZvciBiYW5rIGNoYW5nZXMgaW4gdGhlIGFzc2VtYmxlciBjb2RlKS4gVGhlIG9ubHkKLQkgKiB3YXkgdG8gZW5zdXJlIHRoaXMgaXMgdG8gZm9yY2UgdGhlIGxpbmVhciBhZGRyZXNzIHRvIGJlIGFsaWduZWQKLQkgKiB0byBhIDRNYiBib3VuZGFyeS4KLQkgKi8KLQlmbGFncyB8PSBQUl80TUVHOwotCX0KLSAgICBpZiAoKGxpbmVhciA9ICh1bG9uZylQYWdlUmVzZXJ2ZShQUl9TWVNURU0sKm5wYWdlcyxmbGFncykpID09ICh1bG9uZyktMSkKLQlyZXR1cm4gMDsKLSAgICBpZiAoIVBhZ2VDb21taXRQaHlzKGxpbmVhciA+PiAxMiwqbnBhZ2VzLHBwYWdlLFBDX0lOQ1IgfCBQQ19VU0VSIHwgUENfV1JJVEVBQkxFKSkKLQlyZXR1cm4gMDsKLSNlbmRpZgotICAgIHJldHVybiBsaW5lYXIgKyAoYmFzZSAmIDB4RkZGKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgICAgICAtIFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IHRvIG1hcCBpbgotbGltaXQgICAgICAgLSBMaW1pdCBvZiBwaHlzaWNhbCBtZW1vcnkgdG8gcmVnaW9uIHRvIG1hcCBpbgotaXNDYWNoZWQgICAgLSBUcnVlIGlmIHRoZSBtZW1vcnkgc2hvdWxkIGJlIGNhY2hlZCwgZmFsc2UgaWYgbm90Ci0KLVJFVFVSTlM6Ci1MaW5lYXIgYWRkcmVzcyBvZiB0aGUgbmV3bHkgbWFwcGVkIG1lbW9yeS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gbWFwcyBwaHlzaWNhbCBtZW1vcnkgdG8gbGluZWFyIG1lbW9yeSwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZAotdG8gY3JlYXRlIGEgc2VsZWN0b3Igb3IgdXNlZCBkaXJlY3RseSBmcm9tIDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSBwcm9ncmFtcy4KLVRoaXMgaXMgYmV0dGVyIHRoYW4gRFBNSSAweDgwMCwgc2luY2UgaXQgYWxsb3dzIHlvdSB0byBtYXBzIHBoeXNpY2FsCi1tZW1vcnkgYmVsb3cgMU1iLCB3aGljaCBnZXRzIHRoaXMgbWVtb3J5IG91dCBvZiB0aGUgd2F5IG9mIHRoZSBXaW5kb3dzIFZ4RCdzCi1zdGlja3kgcGF3cy4KLQotTk9URTogICBJZiB0aGUgbWVtb3J5IGlzIG5vdCBleHBlY3RlZCB0byBiZSBjYWNoZWQsIHRoaXMgZnVuY3Rpb24gd2lsbAotCWRpcmVjdGx5IHJlLXByb2dyYW0gdGhlIFBDRCAoUGFnZSBDYWNoZSBEaXNhYmxlKSBiaXQgaW4gdGhlCi0JcGFnZSB0YWJsZXMuIFRoZXJlIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIG1lY2hhbmlzbSBpbiB0aGUgVk1NCi0JdG8gY29udHJvbCB0aGlzIGJpdCB2aWEgdGhlIHJlZ3VsYXIgaW50ZXJmYWNlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBsaW1pdCwKLSAgICBpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICB1bG9uZyAgIGxpbmVhcixsZW5ndGggPSBsaW1pdCsxOwotICAgIGludCAgICAgaSxucGFnZXM7Ci0gICAgdWxvbmcgICBQREIsKnBQREI7Ci0KLSAgICAvKiBTZWFyY2ggdGFibGUgb2YgZXhpc3RpbmcgbWFwcGluZ3MgdG8gc2VlIGlmIHdlIGhhdmUgYWxyZWFkeSBtYXBwZWQKLSAgICAgKiBhIHJlZ2lvbiBvZiBtZW1vcnkgdGhhdCB3aWxsIHNlcnZlIHRoaXMgcHVycG9zZS4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWFwcGluZ3M7IGkrKykgewotCWlmIChtYXBzW2ldLnBoeXNpY2FsID09IGJhc2UgJiYgbWFwc1tpXS5sZW5ndGggPT0gbGVuZ3RoICYmIG1hcHNbaV0uaXNDYWNoZWQgPT0gaXNDYWNoZWQpCi0JICAgIHJldHVybiAodm9pZCopbWFwc1tpXS5saW5lYXI7Ci0JfQotICAgIGlmIChudW1NYXBwaW5ncyA9PSBNQVhfTUVNT1JZX01BUFBJTkdTKQotCXJldHVybiBOVUxMOwotCi0gICAgLyogV2UgZGlkIG5vdCBmaW5kIGFueSBwcmV2aW91c2x5IG1hcHBlZCBtZW1vcnkgcmVnaW9uLCBzbyBtYXAgaXQgaW4uCi0gICAgICogTm90ZSB0aGF0IHdlIGRvIG5vdCB1c2UgTWFwUGh5c1RvTGluZWFyLCBzaW5jZSB0aGlzIGZ1bmN0aW9uIGFwcGVhcnMKLSAgICAgKiB0byBoYXZlIHByb2JsZW1zIG1hcHBpbmcgbWVtb3J5IGluIHRoZSAxTWIgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZS4KLSAgICAgKiBIZW5jZSB3ZSB1c2UgUGFnZVJlc2VydmUgYW5kIFBhZ2VDb21taXRQaHlzLgotICAgICAqLwotICAgIGlmICgobGluZWFyID0gTWFwUGh5c2ljYWxUb0xpbmVhcihiYXNlLGxpbWl0LCZucGFnZXMpKSA9PSAwKQotCXJldHVybiBOVUxMOwotICAgIG1hcHNbbnVtTWFwcGluZ3NdLnBoeXNpY2FsID0gYmFzZTsKLSAgICBtYXBzW251bU1hcHBpbmdzXS5sZW5ndGggPSBsZW5ndGg7Ci0gICAgbWFwc1tudW1NYXBwaW5nc10ubGluZWFyID0gbGluZWFyOwotICAgIG1hcHNbbnVtTWFwcGluZ3NdLm5wYWdlcyA9IG5wYWdlczsKLSAgICBtYXBzW251bU1hcHBpbmdzXS5pc0NhY2hlZCA9IGlzQ2FjaGVkOwotICAgIG51bU1hcHBpbmdzKys7Ci0KLSNpZiAwCi0gICAgLyogRmluYWxseSBkaXNhYmxlIGNhY2hpbmcgd2hlcmUgbmVjZXNzYXJ5ICovCi0gICAgaWYgKCFpc0NhY2hlZCAmJiAoUERCID0gX1BNX2dldFBEQigpKSAhPSAwKSB7Ci0JaW50ICAgICBzdGFydFBEQixlbmRQREIsaVBEQixzdGFydFBhZ2UsZW5kUGFnZSxzdGFydCxlbmQsaVBhZ2U7Ci0JdWxvbmcgICBwYWdlVGFibGUsKnBQYWdlVGFibGU7Ci0KLQlpZiAoUERCID49IDB4MTAwMDAwKQotCSAgICBwUERCID0gKHVsb25nKilNYXBQaHlzaWNhbFRvTGluZWFyKFBEQiwweEZGRiwmbnBhZ2VzKTsKLQllbHNlCi0JICAgIHBQREIgPSAodWxvbmcqKVBEQjsKLQlpZiAocFBEQikgewotCSAgICBzdGFydFBEQiA9IChsaW5lYXIgPj4gMjIpICYgMHgzRkY7Ci0JICAgIHN0YXJ0UGFnZSA9IChsaW5lYXIgPj4gMTIpICYgMHgzRkY7Ci0JICAgIGVuZFBEQiA9ICgobGluZWFyK2xpbWl0KSA+PiAyMikgJiAweDNGRjsKLQkgICAgZW5kUGFnZSA9ICgobGluZWFyK2xpbWl0KSA+PiAxMikgJiAweDNGRjsKLQkgICAgZm9yIChpUERCID0gc3RhcnRQREI7IGlQREIgPD0gZW5kUERCOyBpUERCKyspIHsKLQkJcGFnZVRhYmxlID0gcFBEQltpUERCXSAmIH4weEZGRjsKLQkJaWYgKHBhZ2VUYWJsZSA+PSAweDEwMDAwMCkKLQkJICAgIHBQYWdlVGFibGUgPSAodWxvbmcqKU1hcFBoeXNpY2FsVG9MaW5lYXIocGFnZVRhYmxlLDB4RkZGLCZucGFnZXMpOwotCQllbHNlCi0JCSAgICBwUGFnZVRhYmxlID0gKHVsb25nKilwYWdlVGFibGU7Ci0JCXN0YXJ0ID0gKGlQREIgPT0gc3RhcnRQREIpID8gc3RhcnRQYWdlIDogMDsKLQkJZW5kID0gKGlQREIgPT0gZW5kUERCKSA/IGVuZFBhZ2UgOiAweDNGRjsKLQkJZm9yIChpUGFnZSA9IHN0YXJ0OyBpUGFnZSA8PSBlbmQ7IGlQYWdlKyspCi0JCSAgICBwUGFnZVRhYmxlW2lQYWdlXSB8PSAweDEwOwotCQlQYWdlRnJlZSgodWxvbmcpcFBhZ2VUYWJsZSxQUl9TVEFUSUMpOwotCQl9Ci0JICAgIFBhZ2VGcmVlKCh1bG9uZylwUERCLFBSX1NUQVRJQyk7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLSAgICByZXR1cm4gKHZvaWQqKWxpbmVhcjsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBXZSBuZXZlciBmcmVlIHRoZSBtYXBwaW5ncyAqLwotfQotCi12b2lkIFBNQVBJIFBNX3NsZWVwKHVsb25nIG1pbGxpc2Vjb25kcykKLXsKLSAgICAvKiBXZSBuZXZlciBzbGVlcCBpbiBhIFZERCAqLwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0Y4OwotCWNhc2UgMTogcmV0dXJuIDB4MkY4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNCQzsKLQljYXNlIDE6IHJldHVybiAweDM3ODsKLQljYXNlIDI6IHJldHVybiAweDI3ODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcih2b2lkICpwKQotewotCS8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgKi8KLQkvKiAgICAgICAgICAgICAgIGFkZHJlc3MuICovCi0JcmV0dXJuIDB4RkZGRkZGRkZVTDsKLX0KLQotdm9pZCBQTUFQSSBfUE1fZnJlZU1lbW9yeU1hcHBpbmdzKHZvaWQpCi17Ci0gICAgaW50IGk7Ci0vKiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWFwcGluZ3M7IGkrKykgKi8KLS8qICAgICAgICBQYWdlRnJlZShtYXBzW2ldLmxpbmVhcixQUl9TVEFUSUMpOyAqLwotfQotCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIodWludCByX3NlZyx1aW50IHJfb2ZmKQoteyByZXR1cm4gKHZvaWQqKU1LX1BIWVMocl9zZWcscl9vZmYpOyB9Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKQoteyByZXR1cm4gTlVMTDsgfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKHZvaWQgKm1lbSkKLXsgfQotCi12b2lkIFBNQVBJIERQTUlfaW50ODYoaW50IGludG5vLCBEUE1JX3JlZ3MgKnJlZ3MpCi17Ci0gICAgLyogVW5zZWQgaW4gVkREcyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvYWQgdGhlIFY4NiByZWdpc3RlcnMgaW4gdGhlIGNsaWVudCBzdGF0ZSwgYW5kIHNhdmUgdGhlIG9yaWdpbmFsIHN0YXRlCi1iZWZvcmUgbG9hZGluZyB0aGUgcmVnaXN0ZXJzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIExvYWRWODZSZWdpc3RlcnMoCi0gICAgUENSRiBzYXZlUmVncywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIFBDUkYgICAgICAgICAgICBwY3JmOyAgICAgLyogY3VycmVudCBjbGllbnQgcmVnaXN0ZXIgZnJhbWUgKi8KLQotICAgIC8qIGdldCBwb2ludGVyIHRvIHJlZ2lzdGVycyAqLwotICAgIHBjcmYgPSAoUENSRilWREhRdWVyeVN5c1ZhbHVlKENVUlJFTlRfVkRNLCBWREhMU1ZfUENSRik7Ci0KLSAgICAvKiBOb3RlOiBXZSBjb3VsZCBkbyBWREhQdXNoUmVncyBpbnN0ZWFkIGJ1dCB0aGlzIHNob3VsZCBiZSBzYWZlciBhcyBpdCAqLwotICAgIC8qIGRvZXNuJ3QgcmVseSBvbiB0aGUgVkRNIHNlc3Npb24gaGF2aW5nIGVub3VnaCBmcmVlIHN0YWNrIHNwYWNlLiAqLwotICAgICpzYXZlUmVncyA9ICpwY3JmOyAgICAgICAgLyogc2F2ZSBhbGwgcmVnaXN0ZXJzICovCi0KLSAgICBwY3JmLT5jcmZfZWF4ID0gaW4tPmUuZWF4OyAgICAvKiBsb2FkIG5ldyB2YWx1ZXMgKi8KLSAgICBwY3JmLT5jcmZfZWJ4ID0gaW4tPmUuZWJ4OwotICAgIHBjcmYtPmNyZl9lY3ggPSBpbi0+ZS5lY3g7Ci0gICAgcGNyZi0+Y3JmX2VkeCA9IGluLT5lLmVkeDsKLSAgICBwY3JmLT5jcmZfZXNpID0gaW4tPmUuZXNpOwotICAgIHBjcmYtPmNyZl9lZGkgPSBpbi0+ZS5lZGk7Ci0gICAgcGNyZi0+Y3JmX2VzICA9IHNyZWdzLT5lczsKLSAgICBwY3JmLT5jcmZfZHMgID0gc3JlZ3MtPmRzOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgVjg2IHJlZ2lzdGVycyBmcm9tIHRoZSBjbGllbnQgc3RhdGUgYW5kIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHN0YXRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFJlYWRWODZSZWdpc3RlcnMoCi0gICAgUENSRiBzYXZlUmVncywKLSAgICBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBQQ1JGICAgICAgICAgICAgcGNyZjsgICAgIC8qIGN1cnJlbnQgY2xpZW50IHJlZ2lzdGVyIGZyYW1lICovCi0KLSAgICAvKiBnZXQgcG9pbnRlciB0byByZWdpc3RlcnMgKi8KLSAgICBwY3JmID0gKFBDUkYpVkRIUXVlcnlTeXNWYWx1ZShDVVJSRU5UX1ZETSwgVkRITFNWX1BDUkYpOwotCi0gICAgLyogcmVhZCBuZXcgcmVnaXN0ZXIgdmFsdWVzICovCi0gICAgb3V0LT5lLmVheCA9IHBjcmYtPmNyZl9lYXg7Ci0gICAgb3V0LT5lLmVieCA9IHBjcmYtPmNyZl9lYng7Ci0gICAgb3V0LT5lLmVjeCA9IHBjcmYtPmNyZl9lY3g7Ci0gICAgb3V0LT5lLmVkeCA9IHBjcmYtPmNyZl9lZHg7Ci0gICAgb3V0LT5lLmVzaSA9IHBjcmYtPmNyZl9lc2k7Ci0gICAgb3V0LT5lLmVkaSA9IHBjcmYtPmNyZl9lZGk7Ci0gICAgc3JlZ3MtPmVzICA9IHBjcmYtPmNyZl9lczsKLSAgICBzcmVncy0+ZHMgID0gcGNyZi0+Y3JmX2RzOwotCi0gICAgLyogcmVzdG9yZSBvcmlnaW5hbCBjbGllbnQgcmVnaXN0ZXJzICovCi0gICAgKnBjcmYgPSAqc2F2ZVJlZ3M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOiBVc2VkIGZvciBmYXIgY2FsbHMgaW50byBWODYgY29kZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVZPSUQgSE9PS0VOVFJZIFVzZXJSZXR1cm5Ib29rKAotICBQVk9JRCBwUmVmRGF0YSwKLSAgUENSRiBwY3JmICkKLXsKLSAgICBWREhQb3N0RXZlbnRTZW0oaGV2RmFyQ2FsbFJldCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOiBVc2VkIGZvciBjYWxsaW5nIEJJT1MgaW50ZXJydXB0cwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVZPSUQgSE9PS0VOVFJZIFVzZXJJUmV0SG9vaygKLSAgUFZPSUQgcFJlZkRhdGEsCi0gIFBDUkYgcGNyZiApCi17Ci0gICAgVkRIUG9zdEV2ZW50U2VtKGhldklSZXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgYSBWODYgcmVhbCBtb2RlIGZ1bmN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCByZWdpc3RlciB2YWx1ZXMKLWxvYWRlZCBiZWZvcmUgdGhlIGNhbGwuIFRoZSBjYWxsIHJldHVybnMgd2l0aCBhIGZhciByZXQuCi1NdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIERPUyBzZXNzaW9uIGNvbnRleHQhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9jYWxsUmVhbE1vZGUoCi0gICAgdWludCBzZWcsCi0gICAgdWludCBvZmYsCi0gICAgUk1SRUdTICpyZWdzLAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIENSRiAgIHNhdmVSZWdzOwotICAgIEZQRk4gIGZuQWRkcmVzczsKLSAgICBVTE9ORyByYzsKLQotICAgIFRSQUNFKCJTRERIRUxQOiBFbnRlcmluZyBQTV9jYWxsUmVhbE1vZGUoKVxuIik7Ci0gICAgTG9hZFY4NlJlZ2lzdGVycyhTU1RvRFMoJnNhdmVSZWdzKSxyZWdzLHNyZWdzKTsKLQotICAgIC8qIHNldCB1cCByZXR1cm4gaG9vayBmb3IgY2FsbCAqLwotICAgIHJjID0gVkRIQXJtUmV0dXJuSG9vayhoaG9va1VzZXJSZXR1cm5Ib29rLCBWREhBUkhfQ1NFSVBfSE9PSyk7Ci0KLSAgICBWREhSZXNldEV2ZW50U2VtKGhldkZhckNhbGxSZXQpOwotCi0gICAgLyogdGhlIGFkZHJlc3MgaXMgYSAxNjozMiBwb2ludGVyICovCi0gICAgT0ZGU0VUT0YzMihmbkFkZHJlc3MpICA9IG9mZjsKLSAgICBTRUdNRU5UT0YzMihmbkFkZHJlc3MpID0gc2VnOwotICAgIHJjID0gVkRIUHVzaEZhckNhbGwoZm5BZGRyZXNzKTsKLSAgICBWREhZaWVsZCgwKTsKLQotICAgIC8qIHdhaXQgdW50aWwgdGhlIFY4NiBjYWxsIHJldHVybnMgLSBvdXIgcmV0dXJuIGhvb2sgcG9zdHMgdGhlIHNlbWFwaG9yZSAqLwotICAgIHJjID0gVkRIV2FpdEV2ZW50U2VtKGhldkZhckNhbGxSZXQsIFNFTV9JTkRFRklOSVRFX1dBSVQpOwotCi0gICAgUmVhZFY4NlJlZ2lzdGVycyhTU1RvRFMoJnNhdmVSZWdzKSxyZWdzLHNyZWdzKTsKLSAgICBUUkFDRSgiU0RESEVMUDogRXhpdGluZyBQTV9jYWxsUmVhbE1vZGUoKVxuIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSBWODYgcmVhbCBtb2RlIGludGVycnVwdCB3aXRoIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgdmFsdWVzCi1sb2FkZWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQuCi1NdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIERPUyBzZXNzaW9uIGNvbnRleHQhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2ludDg2KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0KQotewotICAgIFJNU1JFR1MgICAgc3JlZ3MgPSB7MH07Ci0gICAgQ1JGICAgICAgICBzYXZlUmVnczsKLSAgICB1c2hvcnQgICAgIG9sZERpc2FibGU7Ci0gICAgVUxPTkcgICAgICByYzsKLQotICAgIG1lbXNldChTU1RvRFMoJnNyZWdzKSwgMCwgc2l6ZW9mKHNyZWdzKSk7Ci0KLSNpZiAwICAgLyogZG8gd2UgbmVlZCB0aGlzPz8gKi8KLSAgICAvKiBEaXNhYmxlIHBhc3MtdXAgdG8gb3VyIFZERCBoYW5kbGVyIHNvIHdlIGRpcmVjdGx5IGNhbGwgQklPUyAqLwotICAgIFRSQUNFKCJTRERIRUxQOiBFbnRlcmluZyBQTV9pbnQ4NigpXG4iKTsKLSAgICBpZiAoZGlzYWJsZVRTUkZsYWcpIHsKLQlvbGREaXNhYmxlID0gKmRpc2FibGVUU1JGbGFnOwotCSpkaXNhYmxlVFNSRmxhZyA9IDA7Ci0JfQotI2VuZGlmCi0KLSAgICBMb2FkVjg2UmVnaXN0ZXJzKFNTVG9EUygmc2F2ZVJlZ3MpLCBpbiwgU1NUb0RTKCZzcmVncykpOwotCi0gICAgVkRIUmVzZXRFdmVudFNlbShoZXZJUmV0KTsKLSAgICByYyA9IFZESFB1c2hJbnQoaW50bm8pOwotCi0gICAgLyogc2V0IHVwIHJldHVybiBob29rIGZvciBpbnRlcnJ1cHQgKi8KLSAgICByYyA9IFZESEFybVJldHVybkhvb2soaGhvb2tVc2VySVJldEhvb2ssIFZESEFSSF9OT1JNQUxfSVJFVCk7Ci0KLSAgICBWREhZaWVsZCgwKTsKLQotICAgIC8qIHdhaXQgdW50aWwgdGhlIFY4NiBJUkVUcyAtIG91ciByZXR1cm4gaG9vayBwb3N0cyB0aGUgc2VtYXBob3JlICovCi0gICAgcmMgPSBWREhXYWl0RXZlbnRTZW0oaGV2SVJldCwgNTAwMCk7IC8qU0VNX0lOREVGSU5JVEVfV0FJVCk7ICovCi0KLSAgICBSZWFkVjg2UmVnaXN0ZXJzKFNTVG9EUygmc2F2ZVJlZ3MpLCBvdXQsIFNTVG9EUygmc3JlZ3MpKTsKLQotI2lmIDAKLSAgICAvKiBSZS1lbmFibGUgcGFzcy11cCB0byBvdXIgVkREIGhhbmRsZXIgaWYgcHJldmlvdXNseSBlbmFibGVkICovCi0gICAgaWYgKGRpc2FibGVUU1JGbGFnKQotCSpkaXNhYmxlVFNSRmxhZyA9IG9sZERpc2FibGU7Ci0jZW5kaWYKLQotICAgIFRSQUNFKCJTRERIRUxQOiBFeGl0aW5nIFBNX2ludDg2KClcbiIpOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIFY4NiByZWFsIG1vZGUgaW50ZXJydXB0IHdpdGggdGhlIHNwZWNpZmllZCByZWdpc3RlciB2YWx1ZXMKLWxvYWRlZCBiZWZvcmUgdGhlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODZ4KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIENSRiAgICAgICAgICAgICBzYXZlUmVnczsKLSAgICB1c2hvcnQgICAgICAgICAgb2xkRGlzYWJsZTsKLSAgICBVTE9ORyAgICAgICByYzsKLQotI2lmIDAKLSAgICAvKiBEaXNhYmxlIHBhc3MtdXAgdG8gb3VyIFZ4RCBoYW5kbGVyIHNvIHdlIGRpcmVjdGx5IGNhbGwgQklPUyAqLwotICAgIFRSQUNFKCJTRERIRUxQOiBFbnRlcmluZyBQTV9pbnQ4NngoKVxuIik7Ci0gICAgaWYgKGRpc2FibGVUU1JGbGFnKSB7Ci0Jb2xkRGlzYWJsZSA9ICpkaXNhYmxlVFNSRmxhZzsKLQkqZGlzYWJsZVRTUkZsYWcgPSAwOwotCX0KLSNlbmRpZgotICAgIExvYWRWODZSZWdpc3RlcnMoU1NUb0RTKCZzYXZlUmVncyksIGluLCBzcmVncyk7Ci0KLSAgICBWREhSZXNldEV2ZW50U2VtKGhldklSZXQpOwotICAgIHJjID0gVkRIUHVzaEludChpbnRubyk7Ci0KLSAgICAvKiBzZXQgdXAgcmV0dXJuIGhvb2sgZm9yIGludGVycnVwdCAqLwotICAgIHJjID0gVkRIQXJtUmV0dXJuSG9vayhoaG9va1VzZXJJUmV0SG9vaywgVkRIQVJIX05PUk1BTF9JUkVUKTsKLQotICAgIFZESFlpZWxkKDApOwotCi0gICAgLyogd2FpdCB1bnRpbCB0aGUgVjg2IElSRVRzIC0gb3VyIHJldHVybiBob29rIHBvc3RzIHRoZSBzZW1hcGhvcmUgKi8KLSAgICByYyA9IFZESFdhaXRFdmVudFNlbShoZXZJUmV0LCA1MDAwKTsgLypTRU1fSU5ERUZJTklURV9XQUlUKTsgKi8KLQotICAgIFJlYWRWODZSZWdpc3RlcnMoU1NUb0RTKCZzYXZlUmVncyksIG91dCwgc3JlZ3MpOwotCi0jaWYgMAotICAgIC8qIFJlLWVuYWJsZSBwYXNzLXVwIHRvIG91ciBWeEQgaGFuZGxlciBpZiBwcmV2aW91c2x5IGVuYWJsZWQgKi8KLSAgICBpZiAoZGlzYWJsZVRTUkZsYWcpCi0JKmRpc2FibGVUU1JGbGFnID0gb2xkRGlzYWJsZTsKLSNlbmRpZgotCi0gICAgVFJBQ0UoIlNEREhFTFA6IEV4aXRpbmcgUE1faW50ODZ4KClcbiIpOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KHVsb25nICpwaHlzaWNhbCx1bG9uZyAqdG90YWwpCi17ICpwaHlzaWNhbCA9ICp0b3RhbCA9IDA7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZXMgYSBibG9jayBvZiBsb2NrZWQgcGh5c2ljYWwgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKLSAgICB1aW50IHNpemUsCi0gICAgdWxvbmcgKnBoeXNBZGRyLAotICAgIGlib29sIGNvbnRpZ3VvdXMsCi0gICAgaWJvb2wgYmVsb3cxNk0pCi17Ci0gICAgVUxPTkcgICAgICAgZmxhZ3MgPSBWREhBUF9TWVNURU07Ci0gICAgVUxPTkcgICAgICAgblBhZ2VzID0gKHNpemUgKyAweEZGRikgPj4gMTI7Ci0KLSAgICBmbGFncyB8PSAocGh5c0FkZHIgIT0gTlVMTCkgPyBWREhBUF9QSFlTSUNBTCA6IFZESEFQX0ZJWEVEOwotCi0gICAgcmV0dXJuIFZESEFsbG9jUGFnZXMocGh5c0FkZHIsIG5QYWdlcywgVkRIQVBfU1lTVEVNIHwgVkRIQVBfUEhZU0lDQUwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWVzIGEgYmxvY2sgb2YgbG9ja2VkIHBoeXNpY2FsIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0oCi0gICAgdm9pZCAqcCwKLSAgICB1aW50IHNpemUsCi0gICAgaWJvb2wgY29udGlndW91cykKLXsKLSAgICBpZiAocCkKLQlWREhGcmVlUGFnZXMoKFBWT0lEKXApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIFVMT05HICBsb2NrSGFuZGxlOwotCi0gICAgLyogVE9ETzogdGhlIGxvY2sgaGFuZGxlIGlzIGVzc2VudGlhbCBmb3IgdGhlIHVubG9jayBvcGVyYXRpb24hISAqLwotICAgIGxvY2tIYW5kbGUgPSBWREhMb2NrTWVtKHAsIGxlbiwgMCwgKFBWT0lEKVZESExNX05PX0FERFIsIE5VTEwpOwotCi0gICAgaWYgKGxvY2tIYW5kbGUgIT0gTlVMTCkKLSAgICAgICByZXR1cm4gMDsKLSAgICBlbHNlCi0gICAgICAgcmV0dXJuIDE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVW5sb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIC8qIFRPRE86IGltcGxlbWVudCAtIHVzZSBhIHRhYmxlIG9mIGxvY2sgaGFuZGxlcz8gKi8KLSAgICAvKiBWREhVbmxvY2tQYWdlcyhsb2NrSGFuZGxlKTsgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcmV0dXJuIFBNX2xvY2tEYXRhUGFnZXMoKHZvaWQqKXAsbGVuLGxoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1VbmxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHJldHVybiBQTV91bmxvY2tEYXRhUGFnZXMoKHZvaWQqKXAsbGVuLGxoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PUyBzcGVjaWZpYyBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGEgVkRECi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1fTU9EVUxFIFBNQVBJIFBNX2xvYWRMaWJyYXJ5KAotICAgIGNvbnN0IGNoYXIgKnN6RExMTmFtZSkKLXsKLSAgICAodm9pZClzekRMTE5hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhIFZERAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSwKLSAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQotewotICAgICh2b2lkKWhNb2R1bGU7Ci0gICAgKHZvaWQpc3pQcm9jTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PUyBzcGVjaWZpYyBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGEgVkRECi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSkKLXsKLSAgICAodm9pZCloTW9kdWxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqUE1BUEkgUE1fZmluZEZpcnN0RmlsZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgc3RhcnQgYSBkaXJlY3RvcnkgZW51bWVyYXRpb24gc2VhcmNoICovCi0gICAgLyogICAgICAgZ2l2ZW4gdGhlIGZpbGVuYW1lICh3aXRoIHdpbGRjYXJkcykuIFRoZSBkYXRhIHNob3VsZCBiZSAqLwotICAgIC8qICAgICAgIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQgaW4gdGhlIGZpbmREYXRhIHN0YW5kYXJkIGZvcm0uICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpZmluZERhdGE7Ci0gICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBuZXh0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZmluZE5leHRGaWxlKAotICAgIHZvaWQgKmhhbmRsZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgbmV4dCBmaWxlIGluIGRpcmVjdG9yeSBlbnVtZXJhdGlvbiAqLwotICAgIC8qICAgICAgIHNlYXJjaCBnaXZlbiB0aGUgc2VhcmNoIGNyaXRlcmlhIGRlZmluZWQgaW4gdGhlIGNhbGwgdG8gKi8KLSAgICAvKiAgICAgICBQTV9maW5kRmlyc3RGaWxlLiBUaGUgZGF0YSBzaG91bGQgYmUgY29udmVydGVkIGFuZCByZXR1cm5lZCAqLwotICAgIC8qICAgICAgIGluIHRoZSBmaW5kRGF0YSBzdGFuZGFyZCBmb3JtLiAqLwotICAgICh2b2lkKWhhbmRsZTsKLSAgICAodm9pZClmaW5kRGF0YTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2xvc2UgdGhlIGZpbmQgcHJvY2VzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmluZENsb3NlKAotICAgIHZvaWQgKmhhbmRsZSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBjbG9zZSB0aGUgZmluZCBwcm9jZXNzLiBUaGlzIG1heSBkbyAqLwotICAgIC8qICAgICAgIG5vdGhpbmcgZm9yIHNvbWUgT1MnZXMuICovCi0gICAgKHZvaWQpaGFuZGxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGRyaXZlIGlzIGEgdmFsaWQgZHJpdmUgb3Igbm90LiBVbmRlciBVbml4IHRoaXMKLWZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbnl0aGluZyBleGNlcHQgYSB2YWx1ZSBvZiAzIChjb25zaWRlcmVkCi10aGUgcm9vdCBkcml2ZSwgYW5kIGVxdWl2YWxlbnQgdG8gQzogZm9yIG5vbi1Vbml4IHN5c3RlbXMpLiBUaGUgZHJpdmUKLW51bWJlcmluZyBpczoKLQotICAgIDEgICAtIERyaXZlIEE6Ci0gICAgMiAgIC0gRHJpdmUgQjoKLSAgICAzICAgLSBEcml2ZSBDOgotICAgIGV0YwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZHJpdmVWYWxpZCgKLSAgICBjaGFyIGRyaXZlKQotewotICAgIC8qIE5vdCBhcHBsaWNhYmxlIGluIGEgVkREICovCi0gICAgKHZvaWQpZHJpdmU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmlmZWQgZHJpdmUuCi1VbmRlciBVbml4IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHJlZ2FyZGxlc3MKLW9mIHdoYXQgdGhlIHZhbHVlIG9mICdkcml2ZScgaXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9nZXRkY3dkKAotICAgIGludCBkcml2ZSwKLSAgICBjaGFyICpkaXIsCi0gICAgaW50IGxlbikKLXsKLSAgICAvKiBOb3QgYXBwbGljYWJsZSBpbiBhIFZERCAqLwotICAgICh2b2lkKWRyaXZlOwotICAgICh2b2lkKWRpcjsKLSAgICAodm9pZClsZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLXR5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKLQotUkVUVVJOUzoKLUVycm9yIGNvZGUgZGVzY3JpYmluZyB0aGUgcmVzdWx0LgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW5hYmxlIHdyaXRlIGNvbWJpbmluZyBmb3IgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplLAotICAgIHVpbnQgdHlwZSkKLXsKLSAgICByZXR1cm4gTVRSUl9lbmFibGVXcml0ZUNvbWJpbmUoYmFzZSxzaXplLHR5cGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICB1aW50IGF0dHJpYikKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyA/ICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpYXR0cmliOwotICAgIFBNX2ZhdGFsRXJyb3IoIlBNX3NldEZpbGVBdHRyIG5vdCBpbXBsZW1lbnRlZCEiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQgUE1BUEkgUE1fZ2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgPyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgIFBNX2ZhdGFsRXJyb3IoIlBNX2dldEZpbGVBdHRyIG5vdCBpbXBsZW1lbnRlZCEiKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fbWtkaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgPyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgIFBNX2ZhdGFsRXJyb3IoIlBNX21rZGlyIG5vdCBpbXBsZW1lbnRlZCEiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3JtZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzID8gKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICBQTV9mYXRhbEVycm9yKCJQTV9ybWRpciBub3QgaW1wbGVtZW50ZWQhIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZ2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgPyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWdtVGltZTsKLSAgICAodm9pZCl0aW1lOwotICAgIFBNX2ZhdGFsRXJyb3IoIlBNX2dldEZpbGVUaW1lIG5vdCBpbXBsZW1lbnRlZCEiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gc2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9zZXRGaWxlVGltZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBpYm9vbCBnbVRpbWUsCi0gICAgUE1fdGltZSAqdGltZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyA/ICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpZ21UaW1lOwotICAgICh2b2lkKXRpbWU7Ci0gICAgUE1fZmF0YWxFcnJvcigiUE1fc2V0RmlsZVRpbWUgbm90IGltcGxlbWVudGVkISIpOwotICAgIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC92ZmxhdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL3ZmbGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNjM5MjguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL3ZmbGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgICAgICAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgRHVtbXkgbW9kdWxlOyBubyB2aXJ0dWFsIGZyYW1lYnVmZmVyIGZvciB0aGlzIE9TCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLQotaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotCi12b2lkICogUE1BUEkgVkZfaW5pdCh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgVkZfZXhpdCh2b2lkKQotewotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL3p0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzFmNjU1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC96dGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgT1MvMiBWREQKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFplbiBUaW1lciBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdWxvbmcgICAgZnJlcXVlbmN5ID0gMTE5MzE4MDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBaZW4gVGltZXIgbW9kdWxlIGludGVybmFscy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fWlRpbWVySW5pdCgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lck9uKHRtKSAgICAgVlREX0dldF9SZWFsX1RpbWUoJnRtLT5zdGFydC5oaWdoLCZ0bS0+c3RhcnQubG93KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fTFpUaW1lckxhcCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIGxhcCxjb3VudDsKLSAgICBWVERfR2V0X1JlYWxfVGltZSgmbGFwLmhpZ2gsJmxhcC5sb3cpOwotICAgIF9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LCZsYXAsJmNvdW50KTsKLSAgICByZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJmNvdW50LGZyZXF1ZW5jeSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lck9mZih0bSkgICAgVlREX0dldF9SZWFsX1RpbWUoJnRtLT5lbmQuaGlnaCwmdG0tPmVuZC5sb3cpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19MWlRpbWVyQ291bnQoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciB0bUNvdW50OwotICAgIF9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LCZ0bS0+ZW5kLCZ0bUNvdW50KTsKLSAgICByZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsZnJlcXVlbmN5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGFzIG1pY3Jvc2Vjb25kcyBwZXIgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFVMWlRJTUVSX1JFU09MVVRJT04gICAgIDEwMDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBMb25nIFBlcmlvZCB0aW1lciB2YWx1ZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKLXsKLSAgICByZXR1cm4gVkRIUXVlcnlTeXNWYWx1ZSgwLCBWREhHU1ZfTVNFQ1NCT09UKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCi13aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KLWFjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKLXBhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoteyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9fcG0uYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL19wbS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YTdjZWMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL19wbS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogMzItYml0IFdpbmRvd3MgVnhECi07KgotOyogRGVzY3JpcHRpb246IExvdyBsZXZlbCBhc3NlbWJseSBzdXBwb3J0IGZvciB0aGUgUE0gbGlicmFyeSBzcGVjaWZpYyB0bwotOyogICAgICAgICAgICAgIFdpbmRvd3MgVnhEcy4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1oZWFkZXIgICAgICBfcG0gICAgICAgICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKLQotYmVnZGF0YXNlZyAgX3BtCi0KLSAgICBjZXh0ZXJuIF9QTV9zYXZlZERTLFVTSE9SVAotCi1lbmRkYXRhc2VnICBfcG0KLQotUDU4NgotCi1iZWdjb2Rlc2VnICBfcG0gICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fc2VncmVhZChQTVNSRUdTICpzcmVncykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYWxsIHNlZ21lbnQgcmVnaXN0ZXJzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fc2VncmVhZAotCi0gICAgICAgIEFSRyAgICAgc3JlZ3M6RFBUUgotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIGF4LGVzCi0gICAgICAgIF9sZXMgICAgX3NpLFtzcmVnc10KLSAgICAgICAgbW92ICAgICBbX0VTIF9zaV0sYXgKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSsyXSxjcwotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzRdLHNzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krNl0sZHMKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSs4XSxmcwotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzEwXSxncwotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBQTV9pbnQzODZ4KGludCBpbnRubywgUE1SRUdTICppbiwgUE1SRUdTICpvdXQsUE1TUkVHUyAqc3JlZ3MpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJc3N1ZXMgYSBzb2Z0d2FyZSBpbnRlcnJ1cHQgaW4gcHJvdGVjdGVkIG1vZGUuIFRoaXMgcm91dGluZSBoYXMgYmVlbgotOyB3cml0dGVuIHRvIGFsbG93IHVzZXIgcHJvZ3JhbXMgdG8gbG9hZCBDUyBhbmQgRFMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzCi07IG90aGVyIHRoYW4gdGhlIGRlZmF1bHQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1faW50Mzg2eAotCi07IE5vdCB1c2VkIGZvciBWeERzCi0KLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fc2F2ZURTKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBTYXZlIHRoZSB2YWx1ZSBvZiBEUyBpbnRvIGEgc2VjdGlvbiBvZiB0aGUgY29kZSBzZWdtZW50LCBzbyB0aGF0IHdlIGNhbgotOyBxdWlja2x5IGxvYWQgdGhpcyB2YWx1ZSBhdCBhIGxhdGVyIGRhdGUgaW4gdGhlIFBNX2xvYWREUygpIHJvdXRpbmUgZnJvbQotOyBpbnNpZGUgaW50ZXJydXB0IGhhbmRsZXJzIGV0Yy4gVGhlIG1ldGhvZCB0byBkbyB0aGlzIGlzIGRpZmZlcmVudAotOyBkZXBlbmRpbmcgb24gdGhlIERPUyBleHRlbmRlciBiZWluZyB1c2VkLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX3NhdmVEUwotCi0gICAgICAgIG1vdiAgICAgW19QTV9zYXZlZERTXSxkcyAgICA7IFN0b3JlIGF3YXkgaW4gZGF0YSBzZWdtZW50Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX2xvYWREUyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUm91dGluZSB0byBsb2FkIHRoZSBEUyByZWdpc3RlciB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgY3VycmVudAotOyBET1MgZXh0ZW5kZXIuIE9ubHkgdGhlIERTIHJlZ2lzdGVyIGlzIGxvYWRlZCwgbm90IHRoZSBFUyByZWdpc3Rlciwgc28KLTsgaWYgeW91IHdpc2ggdG8gY2FsbCBDIGNvZGUsIHlvdSB3aWxsIG5lZWQgdG8gYWxzbyBsb2FkIHRoZSBFUyByZWdpc3RlcgotOyBpbiAzMiBiaXQgcHJvdGVjdGVkIG1vZGUuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fbG9hZERTCi0KLSAgICAgICAgbW92ICAgICBkcyxbY3M6X1BNX3NhdmVkRFNdIDsgV2UgY2FuIGFjY2VzcyB0aGUgcHJvcGVyIERTIHRocm91Z2ggQ1MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fc2V0QmFua0EoaW50IGJhbmspCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgICAgIFBNX3NldEJhbmtBCi0KLTsgTm90IHVzZWQgZm9yIFZ4RHMKLQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZXRCYW5rQUIoaW50IGJhbmspCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgICAgIFBNX3NldEJhbmtBQgotCi07IE5vdCB1c2VkIGZvciBWeERzCi0KLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fc2V0Q1JUU3RhcnQoaW50IHgsaW50IHksaW50IHdhaXRWUlQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgICAgIFBNX3NldENSVFN0YXJ0Ci0KLTsgTm90IHVzZWQgZm9yIFZ4RHMKLQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOyBNYWNybyB0byBkZWxheSBicmllZmx5IHRvIGVuc3VyZSB0aGF0IGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIGJldHdlZW4KLTsgc3VjY2Vzc2l2ZSBJL08gYWNjZXNzZXMgc28gdGhhdCB0aGUgZGV2aWNlIGJlaW5nIGFjY2Vzc2VkIGNhbiByZXNwb25kCi07IHRvIGJvdGggYWNjZXNzZXMgZXZlbiBvbiBhIHZlcnkgZmFzdCBQQy4KLQotaWZkZWYgICBVU0VfTkFTTQotJW1hY3JvICBERUxBWSAwCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0lZW5kbWFjcm8KLSVtYWNybyAgSU9ERUxBWU4gMQotJXJlcCAgICAlMQotICAgICAgICBERUxBWQotJWVuZHJlcAotJWVuZG1hY3JvCi1lbHNlCi1tYWNybyAgIERFTEFZCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi1lbmRtCi1tYWNybyAgIElPREVMQVlOICAgIE4KLSAgICByZXB0ICAgIE4KLSAgICAgICAgREVMQVkKLSAgICBlbmRtCi1lbmRtCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1Y2hhciBfUE1fcmVhZENNT1MoaW50IGluZGV4KQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBDTU9TIHJlZ2lzdGVyLiBXZSBkbyB0aGlzIHdpdGggYm90aAotOyBub3JtYWwgaW50ZXJydXB0cyBhbmQgTk1JIGRpc2FibGVkLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9yZWFkQ01PUwotCi0gICAgICAgIEFSRyAgICAgaW5kZXg6VUlOVAotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBwdXNoZmQKLSAgICAgICAgbW92ICAgICBhbCxbQllURSBpbmRleF0KLSAgICAgICAgb3IgICAgICBhbCw4MGggICAgICAgICAgICAgIDsgQWRkIGRpc2FibGUgTk1JIGZsYWcKLSAgICAgICAgY2xpCi0gICAgICAgIG91dCAgICAgNzBoLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgaW4gICAgICBhbCw3MWgKLSAgICAgICAgbW92ICAgICBhaCxhbAotICAgICAgICB4b3IgICAgIGFsLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmUtZW5hYmxlIE5NSQotICAgICAgICBtb3YgICAgIGFsLGFoICAgICAgICAgICAgICAgOyBSZXR1cm4gdmFsdWUgaW4gQUwKLSAgICAgICAgcG9wZmQKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX1BNX3dyaXRlQ01PUyhpbnQgaW5kZXgsdWNoYXIgdmFsdWUpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIENNT1MgcmVnaXN0ZXIuIFdlIGRvIHRoaXMgd2l0aCBib3RoCi07IG5vcm1hbCBpbnRlcnJ1cHRzIGFuZCBOTUkgZGlzYWJsZWQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3dyaXRlQ01PUwotCi0gICAgICAgIEFSRyAgICAgaW5kZXg6VUlOVCwgdmFsdWU6VUNIQVIKLQotICAgICAgICBwdXNoICAgIF9icAotICAgICAgICBtb3YgICAgIF9icCxfc3AKLSAgICAgICAgcHVzaGZkCi0gICAgICAgIG1vdiAgICAgYWwsW0JZVEUgaW5kZXhdCi0gICAgICAgIG9yICAgICAgYWwsODBoICAgICAgICAgICAgICA7IEFkZCBkaXNhYmxlIE5NSSBmbGFnCi0gICAgICAgIGNsaQotICAgICAgICBvdXQgICAgIDcwaCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIG1vdiAgICAgYWwsW3ZhbHVlXQotICAgICAgICBvdXQgICAgIDcxaCxhbAotICAgICAgICB4b3IgICAgIGFsLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmUtZW5hYmxlIE5NSQotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgZG91YmxlIF9mdG9sKGRvdWJsZSBmKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2FsbHMgdG8gX19mdG9sIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIEJvcmxhbmQgQysrIGNvbXBpbGVyIGZvciBjb2RlCi07IHRoYXQgbmVlZHMgdG8gY29udmVydCBhIGZsb2F0aW5nIHBvaW50IHR5cGUgdG8gYW4gaW50ZWdyYWwgdHlwZS4KLTsKLTsgSW5wdXQ6IGZsb2F0aW5nIHBvaW50IG51bWJlciBvbiB0aGUgdG9wIG9mIHRoZSAnODcuCi07Ci07IE91dHB1dDogYSAoc2lnbmVkIG9yIHVuc2lnbmVkKSBsb25nIGluIEVBWAotOyBBbGwgb3RoZXIgcmVnaXN0ZXJzIHByZXNlcnZlZC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX2Z0b2wKLQotICAgICAgICBMT0NBTCAgIHRlbXAxOldPUkQsIHRlbXAyOlFXT1JEID0gTG9jYWxTaXplCi0KLSAgICAgICAgcHVzaCAgICBlYnAKLSAgICAgICAgbW92ICAgICBlYnAsZXNwCi0gICAgICAgIHN1YiAgICAgZXNwLExvY2FsU2l6ZQotCi0gICAgICAgIGZzdGN3ICAgW3RlbXAxXSAgICAgICAgICAgICAgICAgOyBzYXZlIHRoZSBjb250cm9sIHdvcmQKLSAgICAgICAgZndhaXQKLSAgICAgICAgbW92ICAgICBhbCxbQllURSB0ZW1wMSsxXQotICAgICAgICBvciAgICAgIFtCWVRFIHRlbXAxKzFdLDBDaCAgICAgIDsgc2V0IHJvdW5kaW5nIGNvbnRyb2wgdG8gY2hvcAotICAgICAgICBmbGRjdyAgIFt0ZW1wMV0KLSAgICAgICAgZmlzdHAgICBbdGVtcDJdICAgICAgICAgICAgICAgICA7IGNvbnZlcnQgdG8gNjQtYml0IGludGVnZXIKLSAgICAgICAgbW92ICAgICBbQllURSB0ZW1wMSsxXSxhbAotICAgICAgICBmbGRjdyAgIFt0ZW1wMV0gICAgICAgICAgICAgICAgIDsgcmVzdG9yZSB0aGUgY29udHJvbCB3b3JkCi0gICAgICAgIG1vdiAgICAgZWF4LFtEV09SRCB0ZW1wMl0gICAgICAgOyByZXR1cm4gTFMgMzIgYml0cwotICAgICAgICBtb3YgICAgIGVkeCxbRFdPUkQgdGVtcDIrNF0gICAgIDsgICAgICAgIE1TIDMyIGJpdHMKLQotICAgICAgICBtb3YgICAgIGVzcCxlYnAKLSAgICAgICAgcG9wICAgICBlYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IF9QTV9nZXRQREIgLSBSZXR1cm4gdGhlIFBhZ2UgVGFibGUgRGlyZWN0b3J5IEJhc2UgYWRkcmVzcwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9nZXRQREIKLQotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgYW5kICAgICBlYXgsMEZGRkZGMDAwaAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRmx1c2ggdGhlIFRyYW5zbGF0aW9uIExvb2thc2lkZSBidWZmZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9mbHVzaFRMQgotCi0gICAgICAgIHdiaW52ZCAgICAgICAgICAgICAgICAgIDsgRmx1c2ggdGhlIENQVSBjYWNoZQotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgOyBGbHVzaCB0aGUgVExCCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfcG0KLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9jcHVpbmZvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvY3B1aW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzdlYWFlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9jcHVpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBWeEQKLSoKLSogRGVzY3JpcHRpb246ICBWeEQgc3BlY2lmaWMgY29kZSBmb3IgdGhlIENQVSBkZXRlY3Rpb24gbW9kdWxlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EbyBub3RoaW5nIGZvciBWeEQncwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU2V0TWF4VGhyZWFkUHJpb3JpdHkoKSAgICAgIDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EbyBub3RoaW5nIGZvciBWeEQncwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgUmVzdG9yZVRocmVhZFByaW9yaXR5KGkpICAgICh2b2lkKShpKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKLXsKLSAgICBmcmVxLT5sb3cgPSAxMTkzMTgwOwotICAgIGZyZXEtPmhpZ2ggPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1BVX2xhcmdlSW50ZWdlciBjb3VudDsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVlREX0dldF9SZWFsX1RpbWUoJmNvdW50LmhpZ2gsJmNvdW50Lmxvdyk7ICBcCi0gICAgKHQpLT5sb3cgPSBjb3VudC5sb3c7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHQpLT5oaWdoID0gY291bnQuaGlnaDsgICAgICAgICAgICAgICAgICAgICBcCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvZmlsZWlvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvZmlsZWlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNmNlOTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL2ZpbGVpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIFZ4RAotKgotKiBEZXNjcmlwdGlvbjogIEMgbGlicmFyeSBjb21wYXRpYmxlIEkvTyBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoaW4gYSBWeEQuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJ2eGRmaWxlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1haW4gQ29kZSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgRU9GIC0xCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVnhEIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZm9wZW4gZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotRklMRSAqIGZvcGVuKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGNvbnN0IGNoYXIgKm1vZGUpCi17Ci0gICAgRklMRSAgICAqZiA9IFBNX21hbGxvYyhzaXplb2YoRklMRSkpOwotICAgIGxvbmcgICAgb2xkcG9zOwotCi0gICAgaWYgKGYpIHsKLQlmLT5vZmZzZXQgPSAwOwotCWYtPnRleHQgPSAobW9kZVsxXSA9PSAndCcgfHwgbW9kZVsyXSA9PSAndCcpOwotCWYtPndyaXRlbW9kZSA9IChtb2RlWzBdID09ICd3JykgfHwgKG1vZGVbMF0gPT0gJ2EnKTsKLQlpZiAoaW5pdENvbXBsZXRlKSB7Ci0JICAgIFdPUkQgICAgb21vZGUsZXJyb3I7Ci0JICAgIEJZVEUgICAgYWN0aW9uOwotCi0JICAgIGlmIChtb2RlWzBdID09ICdyJykgewotCQlvbW9kZSA9IE9QRU5fQUNDRVNTX1JFQURPTkxZIHwgT1BFTl9TSEFSRV9DT01QQVRJQkxFOwotCQlhY3Rpb24gPSBBQ1RJT05fSUZFWElTVFNfT1BFTiB8IEFDVElPTl9JRk5PVEVYSVNUU19GQUlMOwotCQl9Ci0JICAgIGVsc2UgaWYgKG1vZGVbMF0gPT0gJ3cnKSB7Ci0JCW9tb2RlID0gT1BFTl9BQ0NFU1NfV1JJVEVPTkxZIHwgT1BFTl9TSEFSRV9DT01QQVRJQkxFOwotCQlhY3Rpb24gPSBBQ1RJT05fSUZFWElTVFNfVFJVTkNBVEUgfCBBQ1RJT05fSUZOT1RFWElTVFNfQ1JFQVRFOwotCQl9Ci0JICAgIGVsc2UgewotCQlvbW9kZSA9IE9QRU5fQUNDRVNTX1JFQURXUklURSB8IE9QRU5fU0hBUkVfQ09NUEFUSUJMRTsKLQkJYWN0aW9uID0gQUNUSU9OX0lGRVhJU1RTX09QRU4gfCBBQ1RJT05fSUZOT1RFWElTVFNfQ1JFQVRFOwotCQl9Ci0JICAgIGYtPmhhbmRsZSA9IChpbnQpUjBfT3BlbkNyZWF0ZUZpbGUoZmFsc2UsKGNoYXIqKWZpbGVuYW1lLG9tb2RlLEFUVFJfTk9STUFMLGFjdGlvbiwwLCZlcnJvciwmYWN0aW9uKTsKLQkgICAgaWYgKGYtPmhhbmRsZSA9PSAwKSB7Ci0JCVBNX2ZyZWUoZik7Ci0JCXJldHVybiBOVUxMOwotCQl9Ci0JICAgIGYtPmZpbGVzaXplID0gUjBfR2V0RmlsZVNpemUoKEhBTkRMRSlmLT5oYW5kbGUsJmVycm9yKTsKLQkgICAgaWYgKG1vZGVbMF0gPT0gJ2EnKQotCQlmc2VlayhmLDAsMik7Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgaW50IG9mbGFnLHBtb2RlOwotCi0JICAgIGlmIChtb2RlWzBdID09ICdyJykgewotCQlwbW9kZSA9IF9TX0lSRUFEOwotCQlvZmxhZyA9IF9PX1JET05MWTsKLQkJfQotCSAgICBlbHNlIGlmIChtb2RlWzBdID09ICd3JykgewotCQlwbW9kZSA9IF9TX0lXUklURTsKLQkJb2ZsYWcgPSBfT19XUk9OTFkgfCBfT19DUkVBVCB8IF9PX1RSVU5DOwotCQl9Ci0JICAgIGVsc2UgewotCQlwbW9kZSA9IF9TX0lXUklURTsKLQkJb2ZsYWcgPSBfT19SRFdSIHwgX09fQ1JFQVQgfCBfT19BUFBFTkQ7Ci0JCX0KLQkgICAgaWYgKGYtPnRleHQpCi0JCW9mbGFnIHw9IF9PX1RFWFQ7Ci0JICAgIGVsc2UKLQkJb2ZsYWcgfD0gX09fQklOQVJZOwotCSAgICBpZiAoKGYtPmhhbmRsZSA9IGlfb3BlbihmaWxlbmFtZSxvZmxhZyxwbW9kZSkpID09IC0xKSB7Ci0JCVBNX2ZyZWUoZik7Ci0JCXJldHVybiBOVUxMOwotCQl9Ci0JICAgIG9sZHBvcyA9IGlfbHNlZWsoZi0+aGFuZGxlLDAsMSk7Ci0JICAgIGYtPmZpbGVzaXplID0gaV9sc2VlayhmLT5oYW5kbGUsMCwyKTsKLQkgICAgaV9sc2VlayhmLT5oYW5kbGUsb2xkcG9zLDApOwotCSAgICB9Ci0JfQotICAgIHJldHVybiBmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZ4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZyZWFkIGZ1bmN0aW9uLiBOb3RlIHRoYXQgdGhlIFZ4RCBmaWxlIEkvTwotZnVuY3Rpb25zIGFyZSBsYXllcmVkIG9uIERPUywgc28gY2FuIG9ubHkgcmVhZCB1cCB0byA2NEsgYXQgYSB0aW1lLiBTaW5jZQotd2UgYXJlIGV4cGVjdGVkIHRvIGhhbmRsZSBtdWNoIGxhcmdlciBjaHVua3MgdGhhbiB0aGlzLCB3ZSBoYW5kbGUgbGFyZ2VyCi1ibG9ja3MgYXV0b21hdGljYWxseSBpbiBoZXJlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXNpemVfdCBmcmVhZCgKLSAgICB2b2lkICpwdHIsCi0gICAgc2l6ZV90IHNpemUsCi0gICAgc2l6ZV90IG4sCi0gICAgRklMRSAqZikKLXsKLSAgICBjaGFyICAgICpidWYgPSBwdHI7Ci0gICAgV09SRCAgICBlcnJvcjsKLSAgICBpbnQgICAgIGJ5dGVzID0gc2l6ZSAqIG47Ci0gICAgaW50ICAgICByZWFkYnl0ZXMsdG90YWxieXRlcyA9IDA7Ci0KLSAgICB3aGlsZSAoYnl0ZXMgPiAweDEwMDAwKSB7Ci0JaWYgKGluaXRDb21wbGV0ZSkgewotCSAgICByZWFkYnl0ZXMgID0gUjBfUmVhZEZpbGUoZmFsc2UsKEhBTkRMRSlmLT5oYW5kbGUsYnVmLDB4ODAwMCxmLT5vZmZzZXQsJmVycm9yKTsKLQkgICAgcmVhZGJ5dGVzICs9IFIwX1JlYWRGaWxlKGZhbHNlLChIQU5ETEUpZi0+aGFuZGxlLGJ1ZisweDgwMDAsMHg4MDAwLGYtPm9mZnNldCsweDgwMDAsJmVycm9yKTsKLQkgICAgfQotCWVsc2UgewotCSAgICByZWFkYnl0ZXMgID0gaV9yZWFkKGYtPmhhbmRsZSxidWYsMHg4MDAwKTsKLQkgICAgcmVhZGJ5dGVzICs9IGlfcmVhZChmLT5oYW5kbGUsYnVmKzB4ODAwMCwweDgwMDApOwotCSAgICB9Ci0JdG90YWxieXRlcyArPSByZWFkYnl0ZXM7Ci0JZi0+b2Zmc2V0ICs9IHJlYWRieXRlczsKLQlidWYgKz0gMHgxMDAwMDsKLQlieXRlcyAtPSAweDEwMDAwOwotCX0KLSAgICBpZiAoYnl0ZXMpIHsKLQlpZiAoaW5pdENvbXBsZXRlKQotCSAgICByZWFkYnl0ZXMgPSBSMF9SZWFkRmlsZShmYWxzZSwoSEFORExFKWYtPmhhbmRsZSxidWYsYnl0ZXMsZi0+b2Zmc2V0LCZlcnJvcik7Ci0JZWxzZQotCSAgICByZWFkYnl0ZXMgPSBpX3JlYWQoZi0+aGFuZGxlLGJ1ZixieXRlcyk7Ci0JdG90YWxieXRlcyArPSByZWFkYnl0ZXM7Ci0JZi0+b2Zmc2V0ICs9IHJlYWRieXRlczsKLQl9Ci0gICAgcmV0dXJuIHRvdGFsYnl0ZXMgLyBzaXplOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZ4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZ3cml0ZSBmdW5jdGlvbi4gTm90ZSB0aGF0IHRoZSBWeEQgZmlsZSBJL08KLWZ1bmN0aW9ucyBhcmUgbGF5ZXJlZCBvbiBET1MsIHNvIGNhbiBvbmx5IHJlYWQgdXAgdG8gNjRLIGF0IGEgdGltZS4gU2luY2UKLXdlIGFyZSBleHBlY3RlZCB0byBoYW5kbGUgbXVjaCBsYXJnZXIgY2h1bmtzIHRoYW4gdGhpcywgd2UgaGFuZGxlIGxhcmdlcgotYmxvY2tzIGF1dG9tYXRpY2FsbHkgaW4gaGVyZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zaXplX3QgZndyaXRlKAotICAgIGNvbnN0IHZvaWQgKnB0ciwKLSAgICBzaXplX3Qgc2l6ZSwKLSAgICBzaXplX3QgbiwKLSAgICBGSUxFICpmKQotewotICAgIGNvbnN0IGNoYXIgICpidWYgPSBwdHI7Ci0gICAgV09SRCAgICAgICAgZXJyb3I7Ci0gICAgaW50ICAgICAgICAgYnl0ZXMgPSBzaXplICogbjsKLSAgICBpbnQgICAgICAgICB3cml0dGVuYnl0ZXMsdG90YWxieXRlcyA9IDA7Ci0KLSAgICBpZiAoIWYtPndyaXRlbW9kZSkKLQlyZXR1cm4gMDsKLSAgICB3aGlsZSAoYnl0ZXMgPiAweDEwMDAwKSB7Ci0JaWYgKGluaXRDb21wbGV0ZSkgewotCSAgICB3cml0dGVuYnl0ZXMgID0gUjBfV3JpdGVGaWxlKGZhbHNlLChIQU5ETEUpZi0+aGFuZGxlLGJ1ZiwweDgwMDAsZi0+b2Zmc2V0LCZlcnJvcik7Ci0JICAgIHdyaXR0ZW5ieXRlcyArPSBSMF9Xcml0ZUZpbGUoZmFsc2UsKEhBTkRMRSlmLT5oYW5kbGUsYnVmKzB4ODAwMCwweDgwMDAsZi0+b2Zmc2V0KzB4ODAwMCwmZXJyb3IpOwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIHdyaXR0ZW5ieXRlcyAgPSBpX3dyaXRlKGYtPmhhbmRsZSxidWYsMHg4MDAwKTsKLQkgICAgd3JpdHRlbmJ5dGVzICs9IGlfd3JpdGUoZi0+aGFuZGxlLGJ1ZisweDgwMDAsMHg4MDAwKTsKLQkgICAgfQotCXRvdGFsYnl0ZXMgKz0gd3JpdHRlbmJ5dGVzOwotCWYtPm9mZnNldCArPSB3cml0dGVuYnl0ZXM7Ci0JYnVmICs9IDB4MTAwMDA7Ci0JYnl0ZXMgLT0gMHgxMDAwMDsKLQl9Ci0gICAgaWYgKGluaXRDb21wbGV0ZSkKLQl3cml0dGVuYnl0ZXMgPSBSMF9Xcml0ZUZpbGUoZmFsc2UsKEhBTkRMRSlmLT5oYW5kbGUsYnVmLGJ5dGVzLGYtPm9mZnNldCwmZXJyb3IpOwotICAgIGVsc2UKLQl3cml0dGVuYnl0ZXMgPSBpX3dyaXRlKGYtPmhhbmRsZSxidWYsYnl0ZXMpOwotICAgIHRvdGFsYnl0ZXMgKz0gd3JpdHRlbmJ5dGVzOwotICAgIGYtPm9mZnNldCArPSB3cml0dGVuYnl0ZXM7Ci0gICAgaWYgKGYtPm9mZnNldCA+IGYtPmZpbGVzaXplKQotCWYtPmZpbGVzaXplID0gZi0+b2Zmc2V0OwotICAgIHJldHVybiB0b3RhbGJ5dGVzIC8gc2l6ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmZmx1c2ggZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZmbHVzaCgKLSAgICBGSUxFICpmKQotewotICAgIC8qIE5vdGhpbmcgdG8gZG8gc2luY2Ugd2UgYXJlIG5vdCBkb2luZyBidWZmZXJlZCBmaWxlIEkvTyAqLwotICAgICh2b2lkKWY7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVnhEIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZnNlZWsgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZzZWVrKAotICAgIEZJTEUgKmYsCi0gICAgbG9uZyBpbnQgb2Zmc2V0LAotICAgIGludCB3aGVuY2UpCi17Ci0gICAgaWYgKHdoZW5jZSA9PSAwKQotCWYtPm9mZnNldCA9IG9mZnNldDsKLSAgICBlbHNlIGlmICh3aGVuY2UgPT0gMSkKLQlmLT5vZmZzZXQgKz0gb2Zmc2V0OwotICAgIGVsc2UgaWYgKHdoZW5jZSA9PSAyKQotCWYtPm9mZnNldCA9IGYtPmZpbGVzaXplICsgb2Zmc2V0OwotICAgIGlmICghaW5pdENvbXBsZXRlKQotCWlfbHNlZWsoZi0+aGFuZGxlLGYtPm9mZnNldCwwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmdGVsbCBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1sb25nIGZ0ZWxsKAotICAgIEZJTEUgKmYpCi17Ci0gICAgcmV0dXJuIGYtPm9mZnNldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmZW9mIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmZW9mKAotICAgIEZJTEUgKmYpCi17Ci0gICAgcmV0dXJuIChmLT5vZmZzZXQgPT0gZi0+ZmlsZXNpemUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZnZXRzIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIgKmZnZXRzKAotICAgIGNoYXIgKnMsCi0gICAgaW50IG4sCi0gICAgRklMRSAqZikKLXsKLSAgICBpbnQgICAgIGxlbjsKLSAgICBjaGFyICAgICpjczsKLQotICAgIC8qIFJlYWQgdGhlIGVudGlyZSBidWZmZXIgaW50byBtZW1vcnkgKG91ciBmdW5jdGlvbnMgYXJlIHVuYnVmZmVyZWQhKSAqLwotICAgIGlmICgobGVuID0gZnJlYWQocywxLG4sZikpID09IDApCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBTZWFyY2ggZm9yICdcbicgb3IgZW5kIG9mIHN0cmluZyAqLwotICAgIGlmIChuID4gbGVuKQotCW4gPSBsZW47Ci0gICAgY3MgPSBzOwotICAgIHdoaWxlICgtLW4gPiAwKSB7Ci0JaWYgKCpjcyA9PSAnXG4nKQotCSAgICBicmVhazsKLQljcysrOwotCX0KLSAgICAqY3MgPSAnXDAnOwotICAgIHJldHVybiBzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZwdXRzIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmcHV0cygKLSAgICBjb25zdCBjaGFyICpzLAotICAgIEZJTEUgKmYpCi17Ci0gICAgcmV0dXJuIGZ3cml0ZShzLDEsc3RybGVuKHMpLGYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZ4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZjbG9zZSBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZmNsb3NlKAotICAgIEZJTEUgKmYpCi17Ci0gICAgV09SRCBlcnJvcjsKLQotICAgIGlmIChpbml0Q29tcGxldGUpCi0JUjBfQ2xvc2VGaWxlKChIQU5ETEUpZi0+aGFuZGxlLCZlcnJvcik7Ci0gICAgZWxzZQotCWlfY2xvc2UoZi0+aGFuZGxlKTsKLSAgICBQTV9mcmVlKGYpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmYzBmOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIFZ4RAotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL3BtLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvcG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNiN2YxOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDEzNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgVnhECi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotI2luY2x1ZGUgIm10cnIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBNQVhfTUVNT1JZX1NIQVJFRCAgICAgICAgICAgMTAwCi0jZGVmaW5lIE1BWF9NRU1PUllfTUFQUElOR1MgICAgICAgICAxMDAKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHZvaWQgICAgKmxpbmVhcjsKLSAgICB1bG9uZyAgIGdsb2JhbDsKLSAgICB1bG9uZyAgIGxlbmd0aDsKLSAgICBpbnQgICAgIG5wYWdlczsKLSAgICB9IG1lbXNoYXJlZDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgcGh5c2ljYWw7Ci0gICAgdWxvbmcgICBsaW5lYXI7Ci0gICAgdWxvbmcgICBsZW5ndGg7Ci0gICAgaW50ICAgICBucGFnZXM7Ci0gICAgaWJvb2wgICBpc0NhY2hlZDsKLSAgICB9IG1tYXBwaW5nOwotCi1zdGF0aWMgaW50ICAgICAgICAgIG51bU1hcHBpbmdzID0gMDsKLXN0YXRpYyBtZW1zaGFyZWQgICAgc2hhcmVkW01BWF9NRU1PUllfTUFQUElOR1NdID0gezB9Owotc3RhdGljIG1tYXBwaW5nICAgICBtYXBzW01BWF9NRU1PUllfTUFQUElOR1NdOwotZXh0ZXJuIGlib29sICAgICAgICBfUE1faGF2ZUJJT1M7Ci1jaGFyICAgICAgICAgICAgICAgIF9QTV9jbnRQYXRoW1BNX01BWF9QQVRIXSA9ICIiOwotY2hhciAgICAgICAgICAgICAgICBfUE1fbnVjbGV1c1BhdGhbUE1fTUFYX1BBVEhdID0gIiI7Ci11Y2hhciAgICAgICAgICAgICAgICpfUE1fcm1CdWZBZGRyID0gTlVMTDsKLXVzaG9ydCBfVkFSQVBJICAgICAgX1BNX3NhdmVkRFMgPSAwOwotc3RhdGljIHVjaGFyICAgICAgICBfUE1fb2xkQ01PU1JlZ0E7Ci1zdGF0aWMgdWNoYXIgICAgICAgIF9QTV9vbGRDTU9TUmVnQjsKLVBNX2ludEhhbmRsZXIgICAgICAgX1BNX3J0Y0hhbmRsZXIgPSBOVUxMOwotSVJRSEFORExFICAgICAgICAgICBSVENJUlFIYW5kbGUgPSAwOwotVlBJQ0RfSFdJbnRfVEhVTksgICBSVENJbnRfVGh1bms7Ci0KLXN0YXRpYyBjaGFyICpzeldpbmRvd3NLZXkgICAgICAgPSAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb24iOwotc3RhdGljIGNoYXIgKnN6U3lzdGVtUm9vdCAgICAgICA9ICJTeXN0ZW1Sb290IjsKLXN0YXRpYyBjaGFyICpzek1hY2hpbmVOYW1lS2V5ICAgPSAiU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcQ29tcHV0ZXJOYW1lXFxDb21wdXRlck5hbWUiOwotc3RhdGljIGNoYXIgKnN6TWFjaGluZU5hbWUgICAgICA9ICJDb21wdXRlck5hbWUiOwotc3RhdGljIHZvaWQgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBGdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgQ01PUyByZWdpc3RlcnMgKi8KLQotdWxvbmcgICBQTUFQSSBfUE1fZ2V0UERCKHZvaWQpOwotdWNoYXIgICBQTUFQSSBfUE1fcmVhZENNT1MoaW50IGluZGV4KTsKLXZvaWQgICAgUE1BUEkgX1BNX3dyaXRlQ01PUyhpbnQgaW5kZXgsdWNoYXIgdmFsdWUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVBNX21hbGxvYyBvdmVycmlkZSBmdW5jdGlvbiBmb3IgTnVjbGV1cyBkcml2ZXJzIGxvYWRlZCBpbiBWeEQncy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogVlhEX21hbGxvYygKLSAgICBzaXplX3Qgc2l6ZSkKLXsKLSAgICByZXR1cm4gUE1fbWFsbG9jU2hhcmVkKHNpemUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVBNX2NhbGxvYyBvdmVycmlkZSBmdW5jdGlvbiBmb3IgTnVjbGV1cyBkcml2ZXJzIGxvYWRlZCBpbiBWeEQncy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogVlhEX2NhbGxvYygKLSAgICBzaXplX3QgbmVsZW0sCi0gICAgc2l6ZV90IHNpemUpCi17Ci0gICAgdm9pZCAqcCA9IFBNX21hbGxvY1NoYXJlZChuZWxlbSAqIHNpemUpOwotICAgIGlmIChwKQotCW1lbXNldChwLDAsbmVsZW0gKiBzaXplKTsKLSAgICByZXR1cm4gcDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QTV9yZWFsbG9jIG92ZXJyaWRlIGZ1bmN0aW9uIGZvciBOdWNsZXVzIGRyaXZlcnMgbG9hZGVkIGluIFZ4RCdzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBWWERfcmVhbGxvYygKLSAgICB2b2lkICpwdHIsCi0gICAgc2l6ZV90IHNpemUpCi17Ci0gICAgdm9pZCAqcCA9IFBNX21hbGxvY1NoYXJlZChzaXplKTsKLSAgICBpZiAocCkgewotCW1lbWNweShwLHB0cixzaXplKTsKLQlQTV9mcmVlU2hhcmVkKHB0cik7Ci0JfQotICAgIHJldHVybiBwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVBNX2ZyZWUgb3ZlcnJpZGUgZnVuY3Rpb24gZm9yIE51Y2xldXMgZHJpdmVycyBsb2FkZWQgaW4gVnhEJ3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBWWERfZnJlZSgKLSAgICB2b2lkICpwKQotewotICAgIFBNX2ZyZWVTaGFyZWQocCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgUE0gbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKLXsKLSAgICAvKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBtZW1vcnkgYWxsb2NhdG9ycyBmb3IgYWxsIE51Y2xldXMgZHJpdmVycwotICAgICAqIGxvYWRlZCBpbiBTRERIRUxQL1BNSEVMUC4gV2UgZG8gdGhpcyBzbyB0aGF0IHdlIGNhbiBlbnN1cmUgYWxsIG1lbW9yeQotICAgICAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBieSBOdWNsZXVzIGRyaXZlcnMgYW5kIGludGVybmFsIEMgcnVudGltZQotICAgICAqIGxpYnJhcnkgZnVuY3Rpb25zIGFyZSBzaGFyZWQgbWVtb3J5IGJsb2NrcyB0aGF0IGFsbCBwcm9jZXNzZXMKLSAgICAgKiBjb25uZWN0aW5nIHRvIFNEREhFTFAgY2FuIHNlZS4KLSAgICAgKi8KLSAgICBQTV91c2VMb2NhbE1hbGxvYyhWWERfbWFsbG9jLFZYRF9jYWxsb2MsVlhEX3JlYWxsb2MsVlhEX2ZyZWUpOwotCi0gICAgLyogSW5pdGlhbGlhc2UgdGhlIE1UUlIgbW9kdWxlICovCi0gICAgTVRSUl9pbml0KCk7Ci19Ci0KLWlib29sIFBNQVBJIFBNX2hhdmVCSU9TQWNjZXNzKHZvaWQpCi17IHJldHVybiBfUE1faGF2ZUJJT1M7IH0KLQotbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKLXsgcmV0dXJuIF9PU19XSU4zMlZYRDsgfQotCi1pbnQgUE1BUEkgUE1fZ2V0TW9kZVR5cGUodm9pZCkKLXsgcmV0dXJuIFBNXzM4NjsgfQotCi12b2lkIFBNQVBJIFBNX2JhY2tzbGFzaChjaGFyICpzKQotewotICAgIHVpbnQgcG9zID0gc3RybGVuKHMpOwotICAgIGlmIChzW3Bvcy0xXSAhPSAnXFwnKSB7Ci0Jc1twb3NdID0gJ1xcJzsKLQlzW3BvcysxXSA9ICdcMCc7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAotICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKLXsKLSAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcihjb25zdCBjaGFyICptc2cpCi17Ci0gICAgaWYgKGZhdGFsRXJyb3JDbGVhbnVwKQotCWZhdGFsRXJyb3JDbGVhbnVwKCk7Ci0gICAgRmF0YWxfRXJyb3JfSGFuZGxlcihtc2csMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbGVuICAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlcgotcnNlZyAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSByZWFsIG1vZGUgc2VnbWVudCBvZiB0aGUgYnVmZmVyCi1yb2ZmICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHJlYWwgbW9kZSBvZmZzZXQgb2YgdGhlIGJ1ZmZlcgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIGdsb2JhbCBWRVNBIHRyYW5zZmVyCi1idWZmZXIgdGhhdCBpcyB1c2VkIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIFZFU0EgQklPUyBmdW5jdGlvbnMgZnJvbQotV2luMTYgYW5kIFdpbjMyIHByb2dyYW1zIHVuZGVyIFdpbmRvd3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYoCi0gICAgdWludCAqbGVuLAotICAgIHVpbnQgKnJzZWcsCi0gICAgdWludCAqcm9mZikKLXsKLSAgICAvKiBJZiB0aGUgVnhEIGlzIGR5bmFtaWNhbGx5IGxvYWRlZCB3ZSB3aWxsIG5vdCBoYXZlIGEgcmVhbCBtb2RlCi0gICAgICogdHJhbnNmZXIgYnVmZmVyIHRvIHJldHVybiwgc28gd2UgZmFpbCB0aGUgY2FsbC4KLSAgICAgKi8KLSAgICBpZiAoX1BNX3JtQnVmQWRkcikgewotCSpsZW4gPSBWRVNBX0JVRl9TSVpFOwotCSpyc2VnID0gKHVsb25nKShfUE1fcm1CdWZBZGRyKSA+PiA0OwotCSpyb2ZmID0gKHVsb25nKShfUE1fcm1CdWZBZGRyKSAmIDB4RjsKLQlyZXR1cm4gX1BNX3JtQnVmQWRkcjsKLQl9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQzODYoCi0gICAgaW50IGludG5vLAotICAgIFBNUkVHUyAqaW4sCi0gICAgUE1SRUdTICpvdXQpCi17Ci0gICAgLyogVW51c2VkIGluIFZ4RHMgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBQTUFQSSBfUE1fZ2V0Uk12ZWN0KAotICAgIGludCBpbnRubywKLSAgICBsb25nICpyZWFsaXNyKQotewotICAgIFdPUkQgICAgc2VnOwotICAgIERXT1JEICAgb2ZmOwotCi0gICAgR2V0X1Y4Nl9JbnRfVmVjdG9yKGludG5vLCZzZWcsJm9mZik7Ci0gICAgKnJlYWxpc3IgPSAoKGxvbmcpc2VnIDw8IDE2KSB8IChvZmYgJiAweEZGRkYpOwotfQotCi12b2lkIFBNQVBJIF9QTV9zZXRSTXZlY3QoCi0gICAgaW50IGludG5vLAotICAgIGxvbmcgcmVhbGlzcikKLXsKLSAgICBTZXRfVjg2X0ludF9WZWN0b3IoaW50bm8scmVhbGlzciA+PiAxNixyZWFsaXNyICYgMHhGRkZGKTsKLX0KLQotY2hhciAqIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKAotICAgIGNoYXIgKnBhdGgsCi0gICAgaW50IG1heExlbikKLXsKLSAgICBzdHJuY3B5KHBhdGgsX1BNX2NudFBhdGgsbWF4TGVuKTsKLSAgICBwYXRoW21heExlbi0xXSA9IDA7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLWNoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCi17IHJldHVybiAnYyc7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQoteyByZXR1cm4gImM6XFwiOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc3pLZXkgICAgICAgLSBLZXkgdG8gcXVlcnkgKGNhbiBjb250YWluIHZlcnNpb24gbnVtYmVyIGZvcm1hdHRpbmcpCi1zelZhbHVlICAgICAtIFZhbHVlIHRvIGdldCBpbmZvcm1hdGlvbiBmb3IKLXZhbHVlICAgICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHJlZ2lzdHJ5IGtleSBkYXRhIHJlYWQKLXNpemUgICAgICAgIC0gU2l6ZSBvZiB0aGUgc3RyaW5nIGJ1ZmZlciB0byByZWFkIGludG8KLQotUkVUVVJOUzoKLXRydWUgaWYgdGhlIGtleSB3YXMgZm91bmQsIGZhbHNlIGlmIG5vdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgUkVHX3F1ZXJ5U3RyaW5nKAotICAgIGNoYXIgKnN6S2V5LAotICAgIGNoYXIgKnN6VmFsdWUsCi0gICAgY2hhciAqdmFsdWUsCi0gICAgdWxvbmcgc2l6ZSkKLXsKLSAgICBIS0VZICAgIGhLZXk7Ci0gICAgdWxvbmcgICB0eXBlOwotICAgIGlib29sICAgc3RhdHVzID0gZmFsc2U7Ci0KLSAgICBtZW1zZXQodmFsdWUsMCxzaXplb2YodmFsdWUpKTsKLSAgICBpZiAoUmVnT3BlbktleShIS0VZX0xPQ0FMX01BQ0hJTkUsc3pLZXksJmhLZXkpID09IEVSUk9SX1NVQ0NFU1MpIHsKLQlpZiAoUmVnUXVlcnlWYWx1ZUV4KGhLZXksKFBDSEFSKXN6VmFsdWUsKHVsb25nKilOVUxMLCh1bG9uZyopJnR5cGUsdmFsdWUsKHVsb25nKikmc2l6ZSkgPT0gRVJST1JfU1VDQ0VTUykKLQkgICAgc3RhdHVzID0gdHJ1ZTsKLQlSZWdDbG9zZUtleShoS2V5KTsKLQl9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOwotCi0gICAgaWYgKHN0cmxlbihfUE1fbnVjbGV1c1BhdGgpID4gMCkgewotCXN0cmNweShwYXRoLF9QTV9udWNsZXVzUGF0aCk7Ci0JUE1fYmFja3NsYXNoKHBhdGgpOwotCXJldHVybiBwYXRoOwotCX0KLSAgICBpZiAoIVJFR19xdWVyeVN0cmluZyhzeldpbmRvd3NLZXksc3pTeXN0ZW1Sb290LHBhdGgsc2l6ZW9mKHBhdGgpKSkKLQlzdHJjcHkocGF0aCwiYzpcXHdpbmRvd3MiKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsInN5c3RlbVxcbnVjbGV1cyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07Ci0gICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCi17IHJldHVybiBQTV9nZXRNYWNoaW5lTmFtZSgpOyB9Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIG5hbWVbMjU2XTsKLSAgICBpZiAoUkVHX3F1ZXJ5U3RyaW5nKHN6TWFjaGluZU5hbWVLZXksc3pNYWNoaW5lTmFtZSxuYW1lLHNpemVvZihuYW1lKSkpCi0JcmV0dXJuIG5hbWU7Ci0gICAgcmV0dXJuICJVbmtub3duIjsKLX0KLQotaW50IFBNQVBJIFBNX2tiaGl0KHZvaWQpCi17IHJldHVybiAxOyB9Ci0KLWludCBQTUFQSSBQTV9nZXRjaCh2b2lkKQoteyByZXR1cm4gMDsgfQotCi1QTV9IV05EIFBNQVBJIFBNX29wZW5Db25zb2xlKAotICAgIFBNX0hXTkQgaHduZFVzZXIsCi0gICAgaW50IGRldmljZSwKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcywKLSAgICBpbnQgYnBwLAotICAgIGlib29sIGZ1bGxTY3JlZW4pCi17Ci0gICAgLyogVW51c2VkIGluIFZ4RHMgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKLXsKLSAgICAvKiBVbnVzZWQgaW4gVnhEcyAqLwotICAgIHJldHVybiAxOwotfQotCi12b2lkIFBNQVBJIFBNX3NhdmVDb25zb2xlU3RhdGUoCi0gICAgdm9pZCAqc3RhdGVCdWYsCi0gICAgUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBVbnVzZWQgaW4gVnhEcyAqLwotfQotCi12b2lkIFBNQVBJIFBNX3NldFN1c3BlbmRBcHBDYWxsYmFjaygKLSAgICBpbnQgKF9BU01BUElQIHNhdmVTdGF0ZSkoCi0JaW50IGZsYWdzKSkKLXsKLSAgICAvKiBVbnVzZWQgaW4gVnhEcyAqLwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoCi0gICAgY29uc3Qgdm9pZCAqc3RhdGVCdWYsCi0gICAgUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBVbnVzZWQgaW4gVnhEcyAqLwotfQotCi12b2lkIFBNQVBJIFBNX2Nsb3NlQ29uc29sZSgKLSAgICBQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIC8qIFVudXNlZCBpbiBWeERzICovCi19Ci0KLXZvaWQgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbigKLSAgICBpbnQgeCwKLSAgICBpbnQgeSkKLXsKLSAgICB1Y2hhciAqX2Jpb3NQdHIgPSBQTV9nZXRCSU9TUG9pbnRlcigpOwotICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg1MCx4KTsKLSAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4NTEseSk7Ci19Ci0KLXZvaWQgUE1fc2V0T1NTY3JlZW5XaWR0aCgKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCkKLXsKLSAgICB1Y2hhciAqX2Jpb3NQdHIgPSBQTV9nZXRCSU9TUG9pbnRlcigpOwotICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg0QSx3aWR0aCk7Ci0gICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDg0LGhlaWdodC0xKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkuIEZvciBXaW45eCB3ZSBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5Ci1hcyBsb2NrZWQsIGdsb2JhbCBtZW1vcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGZyb20gYW55IG1lbW9yeSBjb250ZXh0Ci0oaW5jbHVkaW5nIGludGVycnVwdCB0aW1lIGNvbnRleHQpLCB3aGljaCBhbGxvd3MgdXMgdG8gbG9hZCBvdXIgaW1wb3J0YW50Ci1kYXRhIHN0cnVjdHVyZSBhbmQgY29kZSBzdWNoIHRoYXQgd2UgY2FuIGFjY2VzcyBpdCBkaXJlY3RseSBmcm9tIGEgcmluZwotMCBpbnRlcnJ1cHQgY29udGV4dC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKAotICAgIGxvbmcgc2l6ZSkKLXsKLSAgICBNRU1IQU5ETEUgICBoTWVtOwotICAgIERXT1JEICAgICAgIHBnTnVtLG5QYWdlcyA9IChzaXplICsgMHhGRkYpID4+IDEyOwotICAgIGludCAgICAgICAgIGk7Ci0KLSAgICAvKiBGaXJzdCBmaW5kIGEgZnJlZSBzbG90IGluIG91ciBzaGFyZWQgbWVtb3J5IHRhYmxlICovCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9NRU1PUllfU0hBUkVEOyBpKyspIHsKLQlpZiAoc2hhcmVkW2ldLmxpbmVhciA9PSAwKQotCSAgICBicmVhazsKLQl9Ci0gICAgaWYgKGkgPCBNQVhfTUVNT1JZX1NIQVJFRCkgewotCVBhZ2VBbGxvY2F0ZShuUGFnZXMsUEdfU1lTLDAsMCwwLDAsTlVMTCwwLCZoTWVtLCZzaGFyZWRbaV0ubGluZWFyKTsKLQlzaGFyZWRbaV0ubnBhZ2VzID0gblBhZ2VzOwotCXBnTnVtID0gKHVsb25nKXNoYXJlZFtpXS5saW5lYXIgPj4gMTI7Ci0Jc2hhcmVkW2ldLmdsb2JhbCA9IExpblBhZ2VMb2NrKHBnTnVtLG5QYWdlcyxQQUdFTUFQR0xPQkFMKTsKLQlyZXR1cm4gKHZvaWQqKXNoYXJlZFtpXS5nbG9iYWw7Ci0JfQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlU2hhcmVkKHZvaWQgKnApCi17Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBGaW5kIGEgc2hhcmVkIG1lbW9yeSBibG9jayBpbiBvdXIgdGFibGUgYW5kIGZyZWUgaXQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01FTU9SWV9TSEFSRUQ7IGkrKykgewotCWlmIChzaGFyZWRbaV0uZ2xvYmFsID09ICh1bG9uZylwKSB7Ci0JICAgIExpblBhZ2VVbkxvY2soc2hhcmVkW2ldLmdsb2JhbCA+PiAxMixzaGFyZWRbaV0ubnBhZ2VzLFBBR0VNQVBHTE9CQUwpOwotCSAgICBQYWdlRnJlZSgodWxvbmcpc2hhcmVkW2ldLmxpbmVhciwwKTsKLQkgICAgc2hhcmVkW2ldLmxpbmVhciA9IDA7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1hcHMgYSBzaGFyZWQgbWVtb3J5IGJsb2NrIGludG8gcHJvY2VzcyBhZGRyZXNzIHNwYWNlLiBEb2VzIG5vdGhpbmcgc2luY2UKLXRoZSBtZW1vcnkgYmxvY2tzIGFyZSBhbHJlYWR5IGdsb2JhbGx5NyBtYXBwZWQgaW50byBhbGwgcHJvY2Vzc2VzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3MoCi0gICAgdm9pZCAqYmFzZSwKLSAgICB1bG9uZyBsaW1pdCkKLXsKLSAgICByZXR1cm4gKHZvaWQqKWJhc2U7Ci19Ci0KLWlib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCi0gICAgdXNob3J0IGF4VmFsLAotICAgIHVsb25nIEJJT1NQaHlzQWRkciwKLSAgICB2b2lkICptYXBwZWRCSU9TLAotICAgIHVsb25nIEJJT1NMZW4pCi17Ci0gICAgLyogVE9ETzogRmlndXJlIG91dCBob3cgdG8gZG8gdGhpcyAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCi17IHJldHVybiAodm9pZCopMHg0MDA7IH0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQoteyByZXR1cm4gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsMHhGRkZGLHRydWUpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAgICAgLSBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSB0byBtYXBzIGluCi1saW1pdCAgICAgICAtIExpbWl0IG9mIHBoeXNpY2FsIG1lbW9yeSB0byByZWdpb24gdG8gbWFwcyBpbgotCi1SRVRVUk5TOgotTGluZWFyIGFkZHJlc3Mgb2YgdGhlIG5ld2x5IG1hcHBlZCBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1NYXBzIGEgcGh5c2ljYWwgbWVtb3J5IHJhbmdlIHRvIGEgbGluZWFyIG1lbW9yeSByYW5nZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfUE1fbWFwUGh5c2ljYWxUb0xpbmVhcigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIGxpbWl0LAotICAgIGludCAqbnBhZ2VzKQotewotICAgIHVsb25nICAgbGluZWFyLGxlbmd0aCA9IGxpbWl0KzE7Ci0gICAgaW50ICAgICBpLHBwYWdlLGZsYWdzOwotCi0gICAgaWYgKGJhc2UgPCAweDEwMDAwMCkgewotCS8qIFdpbmRvd3MgOXggaXMgemVybyBiYXNlZCBmb3IgdGhlIGZpcnN0IG1lZyBvZiBtZW1vcnkgKi8KLQlyZXR1cm4gYmFzZTsKLQl9Ci0gICAgcHBhZ2UgPSBiYXNlID4+IDEyOwotICAgICpucGFnZXMgPSAobGVuZ3RoICsgKGJhc2UgJiAweEZGRikgKyA0MDk1KSA+PiAxMjsKLSAgICBmbGFncyA9IFBSX0ZJWEVEIHwgUFJfU1RBVElDOwotICAgIGlmIChiYXNlID09IDB4QTAwMDApIHsKLQkvKiBXZSByZXF1aXJlIHRoZSBsaW5lYXIgYWRkcmVzcyB0byBiZSBhbGlnbmVkIHRvIGEgNjRLYiBib3VuZGFyeQotCSAqIGZvciBtYXBwaW5nIHRoZSBiYW5rZWQgZnJhbWVidWZmZXIgKHNvIHdlIGNhbiBkbyBlZmZpY2llbnQKLQkgKiBjYXJyeSBjaGVja2luZyBmb3IgYmFuayBjaGFuZ2VzIGluIHRoZSBhc3NlbWJsZXIgY29kZSkuIFRoZSBvbmx5Ci0JICogd2F5IHRvIGVuc3VyZSB0aGlzIGlzIHRvIGZvcmNlIHRoZSBsaW5lYXIgYWRkcmVzcyB0byBiZSBhbGlnbmVkCi0JICogdG8gYSA0TWIgYm91bmRhcnkuCi0JICovCi0JZmxhZ3MgfD0gUFJfNE1FRzsKLQl9Ci0gICAgaWYgKChsaW5lYXIgPSAodWxvbmcpUGFnZVJlc2VydmUoUFJfU1lTVEVNLCpucGFnZXMsZmxhZ3MpKSA9PSAodWxvbmcpLTEpCi0JcmV0dXJuIDB4RkZGRkZGRkY7Ci0gICAgaWYgKCFQYWdlQ29tbWl0UGh5cyhsaW5lYXIgPj4gMTIsKm5wYWdlcyxwcGFnZSxQQ19JTkNSIHwgUENfVVNFUiB8IFBDX1dSSVRFQUJMRSkpCi0JcmV0dXJuIDB4RkZGRkZGRkY7Ci0gICAgcmV0dXJuIGxpbmVhciArIChiYXNlICYgMHhGRkYpOwotfQotCi0vKiBQYWdlIHRhYmxlIGZsYWdzICovCi0KLSNkZWZpbmUgUEFHRV9GTEFHU19QUkVTRU5UCQkJMHgwMDAwMDAwMQotI2RlZmluZSBQQUdFX0ZMQUdTX1dSSVRFQUJMRQkJMHgwMDAwMDAwMgotI2RlZmluZSBQQUdFX0ZMQUdTX1VTRVIJCQkJMHgwMDAwMDAwNAotI2RlZmluZSBQQUdFX0ZMQUdTX1dSSVRFX1RIUk9VR0gJMHgwMDAwMDAwOAotI2RlZmluZSBQQUdFX0ZMQUdTX0NBQ0hFX0RJU0FCTEUJMHgwMDAwMDAxMAotI2RlZmluZSBQQUdFX0ZMQUdTX0FDQ0VTU0VECQkJMHgwMDAwMDAyMAotI2RlZmluZSBQQUdFX0ZMQUdTX0RJUlRZCQkJMHgwMDAwMDA0MAotI2RlZmluZSBQQUdFX0ZMQUdTXzRNQgkgICAgICAgICAgICAweDAwMDAwMDgwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAgICAgLSBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSB0byBtYXBzIGluCi1saW1pdCAgICAgICAtIExpbWl0IG9mIHBoeXNpY2FsIG1lbW9yeSB0byByZWdpb24gdG8gbWFwcyBpbgotaXNDYWNoZWQgICAgLSBUcnVlIGlmIHRoZSBtZW1vcnkgc2hvdWxkIGJlIGNhY2hlZCwgZmFsc2UgaWYgbm90Ci0KLVJFVFVSTlM6Ci1MaW5lYXIgYWRkcmVzcyBvZiB0aGUgbmV3bHkgbWFwcGVkIG1lbW9yeS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gbWFwcyBwaHlzaWNhbCBtZW1vcnkgdG8gbGluZWFyIG1lbW9yeSwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZAotdG8gY3JlYXRlIGEgc2VsZWN0b3Igb3IgdXNlZCBkaXJlY3RseSBmcm9tIDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSBwcm9ncmFtcy4KLVRoaXMgaXMgYmV0dGVyIHRoYW4gRFBNSSAweDgwMCwgc2luY2UgaXQgYWxsb3dzIHlvdSB0byBtYXBzIHBoeXNpY2FsCi1tZW1vcnkgYmVsb3cgMU1iLCB3aGljaCBnZXRzIHRoaXMgbWVtb3J5IG91dCBvZiB0aGUgd2F5IG9mIHRoZSBXaW5kb3dzIFZERCdzCi1zdGlja3kgcGF3cy4KLQotTk9URTogICBJZiB0aGUgbWVtb3J5IGlzIG5vdCBleHBlY3RlZCB0byBiZSBjYWNoZWQsIHRoaXMgZnVuY3Rpb24gd2lsbAotCWRpcmVjdGx5IHJlLXByb2dyYW0gdGhlIFBDRCAoUGFnZSBDYWNoZSBEaXNhYmxlKSBiaXQgaW4gdGhlCi0JcGFnZSB0YWJsZXMuIFRoZXJlIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIG1lY2hhbmlzbSBpbiB0aGUgVk1NCi0JdG8gY29udHJvbCB0aGlzIGJpdCB2aWEgdGhlIHJlZ3VsYXIgaW50ZXJmYWNlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBsaW1pdCwKLSAgICBpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICB1bG9uZyAgIGxpbmVhcixsZW5ndGggPSBsaW1pdCsxOwotICAgIGludCAgICAgaSxucGFnZXM7Ci0gICAgdWxvbmcgICBQREIsKnBQREI7Ci0KLSAgICAvKiBTZWFyY2ggdGFibGUgb2YgZXhpc3RpbmcgbWFwcGluZ3MgdG8gc2VlIGlmIHdlIGhhdmUgYWxyZWFkeSBtYXBwZWQKLSAgICAgKiBhIHJlZ2lvbiBvZiBtZW1vcnkgdGhhdCB3aWxsIHNlcnZlIHRoaXMgcHVycG9zZS4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWFwcGluZ3M7IGkrKykgewotCWlmIChtYXBzW2ldLnBoeXNpY2FsID09IGJhc2UgJiYgbWFwc1tpXS5sZW5ndGggPT0gbGVuZ3RoICYmIG1hcHNbaV0uaXNDYWNoZWQgPT0gaXNDYWNoZWQpCi0JICAgIHJldHVybiAodm9pZCopbWFwc1tpXS5saW5lYXI7Ci0JfQotICAgIGlmIChudW1NYXBwaW5ncyA9PSBNQVhfTUVNT1JZX01BUFBJTkdTKQotCXJldHVybiBOVUxMOwotCi0gICAgLyogV2UgZGlkIG5vdCBmaW5kIGFueSBwcmV2aW91c2x5IG1hcHBlZCBtZW1vcnkgcmVnaW9uLCBzbyBtYXBzIGl0IGluLgotICAgICAqIE5vdGUgdGhhdCB3ZSBkbyBub3QgdXNlIE1hcFBoeXNUb0xpbmVhciwgc2luY2UgdGhpcyBmdW5jdGlvbiBhcHBlYXJzCi0gICAgICogdG8gaGF2ZSBwcm9ibGVtcyBtYXBwaW5nIG1lbW9yeSBpbiB0aGUgMU1iIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UuCi0gICAgICogSGVuY2Ugd2UgdXNlIFBhZ2VSZXNlcnZlIGFuZCBQYWdlQ29tbWl0UGh5cy4KLSAgICAgKi8KLSAgICBpZiAoKGxpbmVhciA9IF9QTV9tYXBQaHlzaWNhbFRvTGluZWFyKGJhc2UsbGltaXQsJm5wYWdlcykpID09IDB4RkZGRkZGRkYpCi0JcmV0dXJuIE5VTEw7Ci0gICAgbWFwc1tudW1NYXBwaW5nc10ucGh5c2ljYWwgPSBiYXNlOwotICAgIG1hcHNbbnVtTWFwcGluZ3NdLmxlbmd0aCA9IGxlbmd0aDsKLSAgICBtYXBzW251bU1hcHBpbmdzXS5saW5lYXIgPSBsaW5lYXI7Ci0gICAgbWFwc1tudW1NYXBwaW5nc10ubnBhZ2VzID0gbnBhZ2VzOwotICAgIG1hcHNbbnVtTWFwcGluZ3NdLmlzQ2FjaGVkID0gaXNDYWNoZWQ7Ci0gICAgbnVtTWFwcGluZ3MrKzsKLQotICAgIC8qIEZpbmFsbHkgZGlzYWJsZSBjYWNoaW5nIHdoZXJlIG5lY2Vzc2FyeSAqLwotICAgIGlmICghaXNDYWNoZWQgJiYgKFBEQiA9IF9QTV9nZXRQREIoKSkgIT0gMCkgewotCWludCAgICAgc3RhcnRQREIsZW5kUERCLGlQREIsc3RhcnRQYWdlLGVuZFBhZ2Usc3RhcnQsZW5kLGlQYWdlOwotCXVsb25nICAgcGFnZVRhYmxlLCpwUGFnZVRhYmxlOwotCXBQREIgPSAodWxvbmcqKV9QTV9tYXBQaHlzaWNhbFRvTGluZWFyKFBEQiwweEZGRiwmbnBhZ2VzKTsKLQlpZiAocFBEQikgewotCSAgICBzdGFydFBEQiA9IChsaW5lYXIgPj4gMjIpICYgMHgzRkY7Ci0JICAgIHN0YXJ0UGFnZSA9IChsaW5lYXIgPj4gMTIpICYgMHgzRkY7Ci0JICAgIGVuZFBEQiA9ICgobGluZWFyK2xpbWl0KSA+PiAyMikgJiAweDNGRjsKLQkgICAgZW5kUGFnZSA9ICgobGluZWFyK2xpbWl0KSA+PiAxMikgJiAweDNGRjsKLQkgICAgZm9yIChpUERCID0gc3RhcnRQREI7IGlQREIgPD0gZW5kUERCOyBpUERCKyspIHsKLQkJLyogU2V0IHRoZSBiaXRzIGluIHRoZSBwYWdlIGRpcmVjdG9yeSBlbnRyeSAtIHJlcXVpcmVkIGFzIHBlciAqLwotCQkvKiBQZW50aXVtIDQgbWFudWFsLiBUaGlzIGFsc28gdGFrZXMgY2FyZSBvZiB0aGUgNE1CIHBhZ2UgZW50cmllcyAqLwotCQlwUERCW2lQREJdID0gcFBEQltpUERCXSB8PSAoUEFHRV9GTEFHU19XUklURV9USFJPVUdIIHwgUEFHRV9GTEFHU19DQUNIRV9ESVNBQkxFKTsKLQkJaWYgKCEocFBEQltpUERCXSAmIFBBR0VfRkxBR1NfNE1CKSkgewotCQkgICAgLyogSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCA0S0IgcGFnZXMgdGhlbiB3ZSBuZWVkIHRvIGl0ZXJhdGUgKi8KLQkJICAgIC8qIHRocm91Z2ggZWFjaCBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzICovCi0JCSAgICBwYWdlVGFibGUgPSBwUERCW2lQREJdICYgfjB4RkZGOwotCQkgICAgcFBhZ2VUYWJsZSA9ICh1bG9uZyopX1BNX21hcFBoeXNpY2FsVG9MaW5lYXIocGFnZVRhYmxlLDB4RkZGLCZucGFnZXMpOwotCQkgICAgc3RhcnQgPSAoaVBEQiA9PSBzdGFydFBEQikgPyBzdGFydFBhZ2UgOiAwOwotCQkgICAgZW5kID0gKGlQREIgPT0gZW5kUERCKSA/IGVuZFBhZ2UgOiAweDNGRjsKLQkJICAgIGZvciAoaVBhZ2UgPSBzdGFydDsgaVBhZ2UgPD0gZW5kOyBpUGFnZSsrKQotCQkJcFBhZ2VUYWJsZVtpUGFnZV0gfD0gKFBBR0VfRkxBR1NfV1JJVEVfVEhST1VHSCB8IFBBR0VfRkxBR1NfQ0FDSEVfRElTQUJMRSk7Ci0JCSAgICBQYWdlRnJlZSgodWxvbmcpcFBhZ2VUYWJsZSxQUl9TVEFUSUMpOwotCQkgICAgfQotCQl9Ci0JICAgIFBhZ2VGcmVlKCh1bG9uZylwUERCLFBSX1NUQVRJQyk7Ci0JICAgIFBNX2ZsdXNoVExCKCk7Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuICh2b2lkKilsaW5lYXI7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcigKLSAgICB2b2lkICpwdHIsCi0gICAgdWxvbmcgbGltaXQpCi17Ci0gICAgLyogV2UgbmV2ZXIgZnJlZSB0aGUgbWFwcGluZ3MgKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9zbGVlcCh1bG9uZyBtaWxsaXNlY29uZHMpCi17Ci0gICAgLyogV2UgbmV2ZXIgc2xlZXAgaW4gYSBWeEQgKi8KLX0KLQotaW50IFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNGODsKLQljYXNlIDE6IHJldHVybiAweDJGODsKLQljYXNlIDI6IHJldHVybiAweDNFODsKLQljYXNlIDM6IHJldHVybiAweDJFODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzQkM7Ci0JY2FzZSAxOiByZXR1cm4gMHgzNzg7Ci0JY2FzZSAyOiByZXR1cm4gMHgyNzg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi11bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIoCi0gICAgdm9pZCAqcCkKLXsKLSAgICBEV09SRCAgIHB0ZTsKLQotICAgIC8qIFRvdWNoIHRoZSBtZW1vcnkgYmVmb3JlIGNhbGxpbmcgQ29weVBhZ2VUYWJsZS4gRm9yIHNvbWUgcmVhc29uICovCi0gICAgLyogd2UgbmVlZCB0byBkbyB0aGlzIG9uIFdpbmRvd3MgOXgsIG90aGVyd2lzZSB0aGUgbWVtb3J5IG1heSBub3QgKi8KLSAgICAvKiBiZSBwYWdlZCBpbiBjb3JyZWN0bHkuIE9mIGNvdXJzZSBpZiB0aGUgcGFzc2VkIGluIHBvaW50ZXIgaXMgKi8KLSAgICAvKiBpbnZhbGlkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgZmF1bHQsIGJ1dCB3ZSBzaG91bGRuJ3QgYmUgcGFzc2VkIGJvZ3VzICovCi0gICAgLyogcG9pbnRlcnMgYW55d2F5IDstKSAqLwotICAgIHB0ZSA9ICooKHVsb25nKilwKTsKLQotICAgIC8qIFJldHVybiBhc3NlbWJsZWQgYWRkcmVzcyB2YWx1ZSBvbmx5IGlmIFZNTSBzZXJ2aWNlIHN1Y2NlZWRzICovCi0gICAgaWYgKENvcHlQYWdlVGFibGUoKChEV09SRClwKSA+PiAxMiwgMSwgKFBWT0lEKikmcHRlLCAwKSkKLQlyZXR1cm4gKHB0ZSAmIH4weEZGRikgfCAoKChEV09SRClwKSAmIDB4RkZGKTsKLQotICAgIC8qIFJldHVybiBmYWlsdXJlIHRvIHRoZSBjYWxsZXIhICovCi0gICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKLX0KLQotaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2UoCi0gICAgdm9pZCAqcCwKLSAgICB1bG9uZyBsZW5ndGgsCi0gICAgdWxvbmcgKnBoeXNBZGRyZXNzKQotewotICAgIGludCAgICAgaTsKLSAgICB1bG9uZyAgIGxpbmVhciA9ICh1bG9uZylwICYgfjB4RkZGOwotCi0gICAgZm9yIChpID0gKGxlbmd0aCArIDB4RkZGKSA+PiAxMjsgaSA+IDA7IGktLSkgewotCWlmICgoKnBoeXNBZGRyZXNzKysgPSBQTV9nZXRQaHlzaWNhbEFkZHIoKHZvaWQqKWxpbmVhcikpID09IDB4RkZGRkZGRkYpCi0JICAgIHJldHVybiBmYWxzZTsKLQlsaW5lYXIgKz0gNDA5NjsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUE1BUEkgX1BNX2ZyZWVNZW1vcnlNYXBwaW5ncyh2b2lkKQotewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1NYXBwaW5nczsgaSsrKQotCVBhZ2VGcmVlKG1hcHNbaV0ubGluZWFyLFBSX1NUQVRJQyk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcigKLSAgICB1aW50IHJfc2VnLAotICAgIHVpbnQgcl9vZmYpCi17Ci0gICAgcmV0dXJuICh2b2lkKilNS19QSFlTKHJfc2VnLHJfb2ZmKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZygKLSAgICB1aW50IHNpemUsCi0gICAgdWludCAqcl9zZWcsCi0gICAgdWludCAqcl9vZmYpCi17Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcoCi0gICAgdm9pZCAqbWVtKQotewotfQotCi12b2lkIFBNQVBJIERQTUlfaW50ODYoCi0gICAgaW50IGludG5vLAotICAgIERQTUlfcmVncyAqcmVncykKLXsKLSAgICAvKiBVbnNlZCBpbiBWeEQncyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvYWQgdGhlIFY4NiByZWdpc3RlcnMgaW4gdGhlIGNsaWVudCBzdGF0ZSwgYW5kIHNhdmUgdGhlIG9yaWdpbmFsIHN0YXRlCi1iZWZvcmUgbG9hZGluZyB0aGUgcmVnaXN0ZXJzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIExvYWRWODZSZWdpc3RlcnMoCi0gICAgQ0xJRU5UX1NUUlVDVCAqc2F2ZVJlZ3MsCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBDTElFTlRfU1RSVUNUICAgbmV3UmVnczsKLQotICAgIFNhdmVfQ2xpZW50X1N0YXRlKHNhdmVSZWdzKTsKLSAgICBuZXdSZWdzID0gKnNhdmVSZWdzOwotICAgIG5ld1JlZ3MuQ1JTLkNsaWVudF9FQVggPSBpbi0+ZS5lYXg7Ci0gICAgbmV3UmVncy5DUlMuQ2xpZW50X0VCWCA9IGluLT5lLmVieDsKLSAgICBuZXdSZWdzLkNSUy5DbGllbnRfRUNYID0gaW4tPmUuZWN4OwotICAgIG5ld1JlZ3MuQ1JTLkNsaWVudF9FRFggPSBpbi0+ZS5lZHg7Ci0gICAgbmV3UmVncy5DUlMuQ2xpZW50X0VTSSA9IGluLT5lLmVzaTsKLSAgICBuZXdSZWdzLkNSUy5DbGllbnRfRURJID0gaW4tPmUuZWRpOwotICAgIG5ld1JlZ3MuQ1JTLkNsaWVudF9FUyA9IHNyZWdzLT5lczsKLSAgICBuZXdSZWdzLkNSUy5DbGllbnRfRFMgPSBzcmVncy0+ZHM7Ci0gICAgUmVzdG9yZV9DbGllbnRfU3RhdGUoJm5ld1JlZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIFY4NiByZWdpc3RlcnMgZnJvbSB0aGUgY2xpZW50IHN0YXRlIGFuZCByZXN0b3JlIHRoZSBvcmlnaW5hbCBzdGF0ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBSZWFkVjg2UmVnaXN0ZXJzKAotICAgIENMSUVOVF9TVFJVQ1QgKnNhdmVSZWdzLAotICAgIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIENMSUVOVF9TVFJVQ1QgICBuZXdSZWdzOwotCi0gICAgU2F2ZV9DbGllbnRfU3RhdGUoJm5ld1JlZ3MpOwotICAgIG91dC0+ZS5lYXggPSBuZXdSZWdzLkNSUy5DbGllbnRfRUFYOwotICAgIG91dC0+ZS5lYnggPSBuZXdSZWdzLkNSUy5DbGllbnRfRUJYOwotICAgIG91dC0+ZS5lY3ggPSBuZXdSZWdzLkNSUy5DbGllbnRfRUNYOwotICAgIG91dC0+ZS5lZHggPSBuZXdSZWdzLkNSUy5DbGllbnRfRURYOwotICAgIG91dC0+ZS5lc2kgPSBuZXdSZWdzLkNSUy5DbGllbnRfRVNJOwotICAgIG91dC0+ZS5lZGkgPSBuZXdSZWdzLkNSUy5DbGllbnRfRURJOwotICAgIHNyZWdzLT5lcyA9IG5ld1JlZ3MuQ1JTLkNsaWVudF9FUzsKLSAgICBzcmVncy0+ZHMgPSBuZXdSZWdzLkNSUy5DbGllbnRfRFM7Ci0gICAgUmVzdG9yZV9DbGllbnRfU3RhdGUoc2F2ZVJlZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgYSBWODYgcmVhbCBtb2RlIGZ1bmN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCByZWdpc3RlciB2YWx1ZXMKLWxvYWRlZCBiZWZvcmUgdGhlIGNhbGwuIFRoZSBjYWxsIHJldHVybnMgd2l0aCBhIGZhciByZXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9jYWxsUmVhbE1vZGUoCi0gICAgdWludCBzZWcsCi0gICAgdWludCBvZmYsCi0gICAgUk1SRUdTICpyZWdzLAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIENMSUVOVF9TVFJVQ1Qgc2F2ZVJlZ3M7Ci0KLSAgICAvKiBCYWlsIGlmIHdlIGRvIG5vdCBoYXZlIEJJT1MgYWNjZXNzIChpZTogdGhlIFZ4RCB3YXMgZHluYW1pY2FsbHkKLSAgICAgKiBsb2FkZWQsIGFuZCBub3Qgc3RhdGljYWxseSBsb2FkZWQuCi0gICAgICovCi0gICAgaWYgKCFfUE1faGF2ZUJJT1MpCi0JcmV0dXJuOwotCi0gICAgX1RSQUNFKCJTRERIRUxQOiBFbnRlcmluZyBQTV9jYWxsUmVhbE1vZGUoKVxuIik7Ci0gICAgQmVnaW5fTmVzdF9WODZfRXhlYygpOwotICAgIExvYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLHJlZ3Msc3JlZ3MpOwotICAgIFNpbXVsYXRlX0Zhcl9DYWxsKHNlZywgb2ZmKTsKLSAgICBSZXN1bWVfRXhlYygpOwotICAgIFJlYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLHJlZ3Msc3JlZ3MpOwotICAgIEVuZF9OZXN0X0V4ZWMoKTsKLSAgICBfVFJBQ0UoIlNEREhFTFA6IEV4aXRpbmcgUE1fY2FsbFJlYWxNb2RlKClcbiIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgVjg2IHJlYWwgbW9kZSBpbnRlcnJ1cHQgd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHZhbHVlcwotbG9hZGVkIGJlZm9yZSB0aGUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQ4NigKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCkKLXsKLSAgICBSTVNSRUdTICAgICAgICAgc3JlZ3MgPSB7MH07Ci0gICAgQ0xJRU5UX1NUUlVDVCAgIHNhdmVSZWdzOwotICAgIHVzaG9ydCAgICAgICAgICBvbGREaXNhYmxlOwotCi0gICAgLyogQmFpbCBpZiB3ZSBkbyBub3QgaGF2ZSBCSU9TIGFjY2VzcyAoaWU6IHRoZSBWeEQgd2FzIGR5bmFtaWNhbGx5Ci0gICAgICogbG9hZGVkLCBhbmQgbm90IHN0YXRpY2FsbHkgbG9hZGVkLgotICAgICAqLwotICAgIGlmICghX1BNX2hhdmVCSU9TKSB7Ci0JKm91dCA9ICppbjsKLQlyZXR1cm4gb3V0LT54LmF4OwotCX0KLQotICAgIC8qIERpc2FibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgc28gd2UgZGlyZWN0bHkgY2FsbCBCSU9TICovCi0gICAgX1RSQUNFKCJTRERIRUxQOiBFbnRlcmluZyBQTV9pbnQ4NigpXG4iKTsKLSAgICBpZiAoZGlzYWJsZVRTUkZsYWcpIHsKLQlvbGREaXNhYmxlID0gKmRpc2FibGVUU1JGbGFnOwotCSpkaXNhYmxlVFNSRmxhZyA9IDA7Ci0JfQotICAgIEJlZ2luX05lc3RfVjg2X0V4ZWMoKTsKLSAgICBMb2FkVjg2UmVnaXN0ZXJzKCZzYXZlUmVncyxpbiwmc3JlZ3MpOwotICAgIEV4ZWNfSW50KGludG5vKTsKLSAgICBSZWFkVjg2UmVnaXN0ZXJzKCZzYXZlUmVncyxvdXQsJnNyZWdzKTsKLSAgICBFbmRfTmVzdF9FeGVjKCk7Ci0KLSAgICAvKiBSZS1lbmFibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgaWYgcHJldmlvdXNseSBlbmFibGVkICovCi0gICAgaWYgKGRpc2FibGVUU1JGbGFnKQotCSpkaXNhYmxlVFNSRmxhZyA9IG9sZERpc2FibGU7Ci0KLSAgICBfVFJBQ0UoIlNEREhFTFA6IEV4aXRpbmcgUE1faW50ODYoKVxuIik7Ci0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIFY4NiByZWFsIG1vZGUgaW50ZXJydXB0IHdpdGggdGhlIHNwZWNpZmllZCByZWdpc3RlciB2YWx1ZXMKLWxvYWRlZCBiZWZvcmUgdGhlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODZ4KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIENMSUVOVF9TVFJVQ1QgICBzYXZlUmVnczsKLSAgICB1c2hvcnQgICAgICAgICAgb2xkRGlzYWJsZTsKLQotICAgIC8qIEJhaWwgaWYgd2UgZG8gbm90IGhhdmUgQklPUyBhY2Nlc3MgKGllOiB0aGUgVnhEIHdhcyBkeW5hbWljYWxseQotICAgICAqIGxvYWRlZCwgYW5kIG5vdCBzdGF0aWNhbGx5IGxvYWRlZC4KLSAgICAgKi8KLSAgICBpZiAoIV9QTV9oYXZlQklPUykgewotCSpvdXQgPSAqaW47Ci0JcmV0dXJuIG91dC0+eC5heDsKLQl9Ci0KLSAgICAvKiBEaXNhYmxlIHBhc3MtdXAgdG8gb3VyIFZ4RCBoYW5kbGVyIHNvIHdlIGRpcmVjdGx5IGNhbGwgQklPUyAqLwotICAgIF9UUkFDRSgiU0RESEVMUDogRW50ZXJpbmcgUE1faW50ODZ4KClcbiIpOwotICAgIGlmIChkaXNhYmxlVFNSRmxhZykgewotCW9sZERpc2FibGUgPSAqZGlzYWJsZVRTUkZsYWc7Ci0JKmRpc2FibGVUU1JGbGFnID0gMDsKLQl9Ci0gICAgQmVnaW5fTmVzdF9WODZfRXhlYygpOwotICAgIExvYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLGluLHNyZWdzKTsKLSAgICBFeGVjX0ludChpbnRubyk7Ci0gICAgUmVhZFY4NlJlZ2lzdGVycygmc2F2ZVJlZ3Msb3V0LHNyZWdzKTsKLSAgICBFbmRfTmVzdF9FeGVjKCk7Ci0KLSAgICAvKiBSZS1lbmFibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgaWYgcHJldmlvdXNseSBlbmFibGVkICovCi0gICAgaWYgKGRpc2FibGVUU1JGbGFnKQotCSpkaXNhYmxlVFNSRmxhZyA9IG9sZERpc2FibGU7Ci0KLSAgICBfVFJBQ0UoIlNEREhFTFA6IEV4aXRpbmcgUE1faW50ODZ4KClcbiIpOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJucyBhdmFpbGFibGUgbWVtb3J5LiBOb3QgcG9zc2libGUgdW5kZXIgV2luZG93cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSgKLSAgICB1bG9uZyAqcGh5c2ljYWwsCi0gICAgdWxvbmcgKnRvdGFsKQotewotICAgICpwaHlzaWNhbCA9ICp0b3RhbCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGVzIGEgYmxvY2sgb2YgbG9ja2VkIHBoeXNpY2FsIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NMb2NrZWRNZW0oCi0gICAgdWludCBzaXplLAotICAgIHVsb25nICpwaHlzQWRkciwKLSAgICBpYm9vbCBjb250aWd1b3VzLAotICAgIGlib29sIGJlbG93MTZNKQotewotICAgIE1FTUhBTkRMRSAgIGhNZW07Ci0gICAgRFdPUkQgICAgICAgblBhZ2VzID0gKHNpemUgKyAweEZGRikgPj4gMTI7Ci0gICAgRFdPUkQgICAgICAgZmxhZ3MgPSBQQUdFRklYRUQgfCBQQUdFVVNFQUxJR04gfCAoY29udGlndW91cyA/IFBBR0VDT05USUcgOiAwKTsKLSAgICBEV09SRCAgICAgICBtYXhQaHlzID0gYmVsb3cxNk0gPyAweDAwRkZGRkZGIDogMHhGRkZGRkZGRjsKLSAgICB2b2lkICAgICAgICAqcDsKLQotICAgIC8qIFRPRE86IFRoaXMgbWF5IG5lZWQgdG8gYmUgbW9kaWZpZWQgaWYgdGhlIG1lbW9yeSBuZWVkcyB0byBiZSBnbG9iYWxseSAqLwotICAgIC8qICAgICAgIGFjY2Vzc2libGUuIENoZWNrIGhvdyB3ZSBpbXBsZW1lbnRlZCBQTV9tYWxsb2NTaGFyZWQoKSBhcyB3ZSAqLwotICAgIC8qICAgICAgIG1heSBuZWVkIHRvIGRvIHNvbWV0aGluZyBzaW1pbGFyIGluIGhlcmUuICovCi0gICAgUGFnZUFsbG9jYXRlKG5QYWdlcyxQR19TWVMsMCwwLDAsbWF4UGh5cyxwaHlzQWRkcixmbGFncywmaE1lbSwmcCk7Ci0KLSAgICAvKiBUT0RPOiBXZSBtYXkgbmVlZCB0byBtb2RpZnkgdGhlIG1lbW9yeSBibG9ja3MgdG8gZGlzYWJsZSBjYWNoaW5nIHZpYSAqLwotICAgIC8qICAgICAgIHRoZSBwYWdlIHRhYmxlcyAoUENEfFBXVCkgc2luY2UgRE1BIG1lbW9yeSBibG9ja3MgKmNhbm5vdCogYmUgKi8KLSAgICAvKiAgICAgICBjYWNoZWQhICovCi0gICAgcmV0dXJuIHA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZXMgYSBibG9jayBvZiBsb2NrZWQgcGh5c2ljYWwgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSgKLSAgICB2b2lkICpwLAotICAgIHVpbnQgc2l6ZSwKLSAgICBpYm9vbCBjb250aWd1b3VzKQotewotICAgIGlmIChwKQotCVBhZ2VGcmVlKCh1bG9uZylwLDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlcyBhIHBhZ2UgYWxpZ25lZCBhbmQgcGFnZSBzaXplZCBibG9jayBvZiBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NQYWdlKAotICAgIGlib29sIGxvY2tlZCkKLXsKLSAgICBNRU1IQU5ETEUgICBoTWVtOwotICAgIHZvaWQgICAgICAgICpwOwotCi0gICAgLyogVE9ETzogVGhpcyB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQgaWYgdGhlIG1lbW9yeSBuZWVkcyB0byBiZSBnbG9iYWxseSAqLwotICAgIC8qICAgICAgIGFjY2Vzc2libGUuIENoZWNrIGhvdyB3ZSBpbXBsZW1lbnRlZCBQTV9tYWxsb2NTaGFyZWQoKSBhcyB3ZSAqLwotICAgIC8qICAgICAgIG1heSBuZWVkIHRvIGRvIHNvbWV0aGluZyBzaW1pbGFyIGluIGhlcmUuICovCi0gICAgUGFnZUFsbG9jYXRlKDEsUEdfU1lTLDAsMCwwLDAsMCxQQUdFRklYRUQsJmhNZW0sJnApOwotICAgIHJldHVybiBwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBwYWdlIGFsaWduZWQgYW5kIHBhZ2Ugc2l6ZWQgYmxvY2sgb2YgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUGFnZSgKLSAgICB2b2lkICpwKQotewotICAgIGlmIChwKQotCVBhZ2VGcmVlKCh1bG9uZylwLDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcygKLSAgICB2b2lkICpwLAotICAgIHVpbnQgbGVuLAotICAgIFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIERXT1JEIHBnTnVtID0gKHVsb25nKXAgPj4gMTI7Ci0gICAgRFdPUkQgblBhZ2VzID0gKGxlbiArICh1bG9uZylwIC0gKHBnTnVtIDw8IDEyKSArIDB4RkZGKSA+PiAxMjsKLSAgICByZXR1cm4gTGluUGFnZUxvY2socGdOdW0sblBhZ2VzLDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVVubG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXMoCi0gICAgdm9pZCAqcCwKLSAgICB1aW50IGxlbiwKLSAgICBQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBEV09SRCBwZ051bSA9ICh1bG9uZylwID4+IDEyOwotICAgIERXT1JEIG5QYWdlcyA9IChsZW4gKyAodWxvbmcpcCAtIChwZ051bSA8PCAxMikgKyAweEZGRikgPj4gMTI7Ci0gICAgcmV0dXJuIExpblBhZ2VVbkxvY2socGdOdW0sblBhZ2VzLDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcygKLSAgICB2b2lkICgqcCkoKSwKLSAgICB1aW50IGxlbiwKLSAgICBQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICByZXR1cm4gUE1fbG9ja0RhdGFQYWdlcygodm9pZCopcCxsZW4sbGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVVubG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV91bmxvY2tDb2RlUGFnZXMoCi0gICAgdm9pZCAoKnApKCksCi0gICAgdWludCBsZW4sCi0gICAgUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcmV0dXJuIFBNX3VubG9ja0RhdGFQYWdlcygodm9pZCopcCxsZW4sbGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGZyZXF1ZW5jeSAoZm9yIHN0ZXJlbyBtb2RlcykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KAotICAgIGludCBmcmVxdWVuY3kpCi17Ci0gICAgc3RhdGljIHNob3J0IGNvbnZlcnRbXSA9IHsKLQk4MTkyLAotCTQwOTYsCi0JMjA0OCwKLQkxMDI0LAotCTUxMiwKLQkyNTYsCi0JMTI4LAotCTY0LAotCTMyLAotCTE2LAotCTgsCi0JNCwKLQkyLAotCS0xLAotCX07Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBGaXJzdCBjbGVhciBhbnkgcGVuZGluZyBSVEMgdGltZW91dCBpZiBub3QgY2xlYXJlZCAqLwotICAgIF9QTV9yZWFkQ01PUygweDBDKTsKLSAgICBpZiAoZnJlcXVlbmN5ID09IDApIHsKLQkvKiBEaXNhYmxlIFJUQyB0aW1vdXQgKi8KLQlfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKLQlfUE1fd3JpdGVDTU9TKDB4MEIsX1BNX29sZENNT1NSZWdCICYgMHgwRik7Ci0JfQotICAgIGVsc2UgewotCS8qIENvbnZlcnQgZnJlcXVlbmN5IHZhbHVlIHRvIFJUQyBjbG9jayBpbmRleGVzICovCi0JZm9yIChpID0gMDsgY29udmVydFtpXSAhPSAtMTsgaSsrKSB7Ci0JICAgIGlmIChjb252ZXJ0W2ldID09IGZyZXF1ZW5jeSkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCS8qIFNldCBSVEMgdGltb3V0IHZhbHVlIGFuZCBlbmFibGUgdGltZW91dCAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSwweDIwIHwgKGkrMykpOwotCV9QTV93cml0ZUNNT1MoMHgwQiwoX1BNX29sZENNT1NSZWdCICYgMHgwRikgfCAweDQwKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBoYW5kbGVyLCB3aGljaCBjYWxscyB0aGUgdXNlciByZWdpc3RlcmVkIEMgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQk9PTCBfX3N0ZGNhbGwgUlRDSW50X0hhbmRsZXIoCi0gICAgVk1IQU5ETEUgaFZNLAotICAgIElSUUhBTkRMRSBoSVJRKQotewotICAgIHN0YXRpYyBjaGFyIGluc2lkZSA9IDA7Ci0KLSAgICAvKiBDbGVhciBwcmlvcml0eSBpbnRlcnJ1cHQgY29udHJvbGxlciBhbmQgcmUtZW5hYmxlIGludGVycnVwdHMgc28gd2UKLSAgICAgKiBkb250IGxvY2sgdGhpbmdzIHVwIGZvciBsb25nLgotICAgICAqLwotICAgIFZQSUNEX1BoeXNfRU9JKGhJUlEpOwotCi0gICAgLyogQ2xlYXIgcmVhbC10aW1lIGNsb2NrIHRpbWVvdXQgKi8KLSAgICBfUE1fcmVhZENNT1MoMHgwQyk7Ci0KLSAgICAvKiBOb3cgY2FsbCB0aGUgQyBiYXNlZCBpbnRlcnJ1cHQgaGFuZGxlciAoYnV0IGNoZWNrIGZvciBtdXR1YWwKLSAgICAgKiBleGNsdXNpb24gc2luY2Ugd2UgbWF5IHN0aWxsIGJlIHNlcnZpY2luZyBhbiBvbGQgaW50ZXJydXB0IHdoZW4gYQotICAgICAqIG5ldyBvbmUgY29tZXMgYWxvbmc7IGlmIHRoYXQgaGFwcGVucyB3ZSBpZ25vcmUgdGhlIG9sZCBvbmUpLgotICAgICAqLwotICAgIGlmICghaW5zaWRlKSB7Ci0JaW5zaWRlID0gMTsKLQllbmFibGUoKTsKLQlfUE1fcnRjSGFuZGxlcigpOwotCWluc2lkZSA9IDA7Ci0JfQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGhhbmRsZXIgKHVzZWQgZm9yIHNvZnR3YXJlIHN0ZXJlbyBtb2RlcykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoCi0gICAgUE1faW50SGFuZGxlciBpaCwKLSAgICBpbnQgZnJlcXVlbmN5KQotewotICAgIHN0cnVjdCBWUElDRF9JUlFfRGVzY3JpcHRvciBJUlFkZXNjOwotCi0gICAgLyogU2F2ZSB0aGUgb2xkIENNT1MgcmVhbCB0aW1lIGNsb2NrIHZhbHVlcyAqLwotICAgIF9QTV9vbGRDTU9TUmVnQSA9IF9QTV9yZWFkQ01PUygweDBBKTsKLSAgICBfUE1fb2xkQ01PU1JlZ0IgPSBfUE1fcmVhZENNT1MoMHgwQik7Ci0KLSAgICAvKiBTZXQgdGhlIHJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgaGFuZGxlciAqLwotICAgIENIRUNLKGloICE9IE5VTEwpOwotICAgIF9QTV9ydGNIYW5kbGVyID0gaWg7Ci0gICAgSVJRZGVzYy5WSURfSVJRX051bWJlciAgICAgID0gMHg4OwotICAgIElSUWRlc2MuVklEX09wdGlvbnMgICAgICAgICA9IDA7Ci0gICAgSVJRZGVzYy5WSURfSHdfSW50X1Byb2MgICAgID0gKERXT1JEKVZQSUNEX1RodW5rX0hXSW50KFJUQ0ludF9IYW5kbGVyLCAmUlRDSW50X1RodW5rKTsKLSAgICBJUlFkZXNjLlZJRF9FT0lfUHJvYyAgICAgICAgPSAwOwotICAgIElSUWRlc2MuVklEX1ZpcnRfSW50X1Byb2MgICA9IDA7Ci0gICAgSVJRZGVzYy5WSURfTWFza19DaGFuZ2VfUHJvYz0gMDsKLSAgICBJUlFkZXNjLlZJRF9JUkVUX1Byb2MgICAgICAgPSAwOwotICAgIElSUWRlc2MuVklEX0lSRVRfVGltZV9PdXQgICA9IDUwMDsKLSAgICBpZiAoKFJUQ0lSUUhhbmRsZSA9IFZQSUNEX1ZpcnR1YWxpemVfSVJRKCZJUlFkZXNjKSkgPT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAvKiBQcm9ncmFtIHRoZSByZWFsIHRpbWUgY2xvY2sgZGVmYXVsdCBmcmVxdWVuY3kgKi8KLSAgICBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGZyZXF1ZW5jeSk7Ci0KLSAgICAvKiBVbm1hc2sgSVJROCBpbiB0aGUgUElDICovCi0gICAgVlBJQ0RfUGh5c2ljYWxseV9Vbm1hc2soUlRDSVJRSGFuZGxlKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSBvcmlnaW5hbCByZWFsIHRpbWUgY2xvY2sgaGFuZGxlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQotewotICAgIGlmIChSVENJUlFIYW5kbGUpIHsKLQkvKiBSZXN0b3JlIENNT1MgcmVnaXN0ZXJzIGFuZCBtYXNrIFJUQyBjbG9jayAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSxfUE1fb2xkQ01PU1JlZ0EpOwotCV9QTV93cml0ZUNNT1MoMHgwQixfUE1fb2xkQ01PU1JlZ0IpOwotCi0JLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IHZlY3RvciAqLwotCVZQSUNEX1NldF9BdXRvX01hc2tpbmcoUlRDSVJRSGFuZGxlKTsKLQlWUElDRF9Gb3JjZV9EZWZhdWx0X0JlaGF2aW9yKFJUQ0lSUUhhbmRsZSk7Ci0JUlRDSVJRSGFuZGxlID0gMDsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhIFZ4RAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX01PRFVMRSBQTUFQSSBQTV9sb2FkTGlicmFyeSgKLSAgICBjb25zdCBjaGFyICpzekRMTE5hbWUpCi17Ci0gICAgKHZvaWQpc3pETExOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9TIHNwZWNpZmljIHNoYXJlZCBsaWJyYXJpZXMgbm90IHN1cHBvcnRlZCBpbnNpZGUgYSBWeEQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0UHJvY0FkZHJlc3MoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUsCi0gICAgY29uc3QgY2hhciAqc3pQcm9jTmFtZSkKLXsKLSAgICAodm9pZCloTW9kdWxlOwotICAgICh2b2lkKXN6UHJvY05hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhIFZ4RAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZUxpYnJhcnkoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUpCi17Ci0gICAgKHZvaWQpaE1vZHVsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBmaXJzdCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKlBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIHN0YXJ0IGEgZGlyZWN0b3J5IGVudW1lcmF0aW9uIHNlYXJjaCAqLwotICAgIC8qICAgICAgIGdpdmVuIHRoZSBmaWxlbmFtZSAod2l0aCB3aWxkY2FyZHMpLiBUaGUgZGF0YSBzaG91bGQgYmUgKi8KLSAgICAvKiAgICAgICBjb252ZXJ0ZWQgYW5kIHJldHVybmVkIGluIHRoZSBmaW5kRGF0YSBzdGFuZGFyZCBmb3JtLiAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWZpbmREYXRhOwotICAgIHJldHVybiBQTV9GSUxFX0lOVkFMSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgbmV4dCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2ZpbmROZXh0RmlsZSgKLSAgICB2b2lkICpoYW5kbGUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIG5leHQgZmlsZSBpbiBkaXJlY3RvcnkgZW51bWVyYXRpb24gKi8KLSAgICAvKiAgICAgICBzZWFyY2ggZ2l2ZW4gdGhlIHNlYXJjaCBjcml0ZXJpYSBkZWZpbmVkIGluIHRoZSBjYWxsIHRvICovCi0gICAgLyogICAgICAgUE1fZmluZEZpcnN0RmlsZS4gVGhlIGRhdGEgc2hvdWxkIGJlIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQgKi8KLSAgICAvKiAgICAgICBpbiB0aGUgZmluZERhdGEgc3RhbmRhcmQgZm9ybS4gKi8KLSAgICAodm9pZCloYW5kbGU7Ci0gICAgKHZvaWQpZmluZERhdGE7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZpbmRDbG9zZSgKLSAgICB2b2lkICpoYW5kbGUpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgY2xvc2UgdGhlIGZpbmQgcHJvY2Vzcy4gVGhpcyBtYXkgZG8gKi8KLSAgICAvKiAgICAgICBub3RoaW5nIGZvciBzb21lIE9TJ2VzLiAqLwotICAgICh2b2lkKWhhbmRsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZSBpcyBhIHZhbGlkIGRyaXZlIG9yIG5vdC4gVW5kZXIgVW5peCB0aGlzCi1mdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZXhjZXB0IGEgdmFsdWUgb2YgMyAoY29uc2lkZXJlZAotdGhlIHJvb3QgZHJpdmUsIGFuZCBlcXVpdmFsZW50IHRvIEM6IGZvciBub24tVW5peCBzeXN0ZW1zKS4gVGhlIGRyaXZlCi1udW1iZXJpbmcgaXM6Ci0KLSAgICAxICAgLSBEcml2ZSBBOgotICAgIDIgICAtIERyaXZlIEI6Ci0gICAgMyAgIC0gRHJpdmUgQzoKLSAgICBldGMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCi0gICAgY2hhciBkcml2ZSkKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIGluIGEgVnhEICovCi0gICAgKHZvaWQpZHJpdmU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmlmZWQgZHJpdmUuCi1VbmRlciBVbml4IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHJlZ2FyZGxlc3MKLW9mIHdoYXQgdGhlIHZhbHVlIG9mICdkcml2ZScgaXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9nZXRkY3dkKAotICAgIGludCBkcml2ZSwKLSAgICBjaGFyICpkaXIsCi0gICAgaW50IGxlbikKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIGluIGEgVnhEICovCi0gICAgKHZvaWQpZHJpdmU7Ci0gICAgKHZvaWQpZGlyOwotICAgICh2b2lkKWxlbjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCi1zaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgotdHlwZSAgICAtIFR5cGUgdG8gcGxhY2UgaW50byB0aGUgTVRSUiByZWdpc3RlcgotCi1SRVRVUk5TOgotRXJyb3IgY29kZSBkZXNjcmliaW5nIHRoZSByZXN1bHQuCi0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBlbmFibGUgd3JpdGUgY29tYmluaW5nIGZvciB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBvZiBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2VuYWJsZVdyaXRlQ29tYmluZSgKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIHNpemUsCi0gICAgdWludCB0eXBlKQotewotICAgIHJldHVybiBNVFJSX2VuYWJsZVdyaXRlQ29tYmluZShiYXNlLHNpemUsdHlwZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIHVpbnQgYXR0cmliKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpYXR0cmliOwotICAgIFBNX2ZhdGFsRXJyb3IoIlBNX3NldEZpbGVBdHRyIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50IFBNQVBJIFBNX2dldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgUE1fZmF0YWxFcnJvcigiUE1fZ2V0RmlsZUF0dHIgbm90IGltcGxlbWVudGVkIHlldCEiKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fbWtkaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICBQTV9mYXRhbEVycm9yKCJQTV9ta2RpciBub3QgaW1wbGVtZW50ZWQgeWV0ISIpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byByZW1vdmUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fcm1kaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICBQTV9mYXRhbEVycm9yKCJQTV9ybWRpciBub3QgaW1wbGVtZW50ZWQgeWV0ISIpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2dldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWdtVGltZTsKLSAgICAodm9pZCl0aW1lOwotICAgIFBNX2ZhdGFsRXJyb3IoIlBNX2dldEZpbGVUaW1lIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHNldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fc2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpZ21UaW1lOwotICAgICh2b2lkKXRpbWU7Ci0gICAgUE1fZmF0YWxFcnJvcigiUE1fc2V0RmlsZVRpbWUgbm90IGltcGxlbWVudGVkIHlldCEiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC92ZmxhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDFjZTFjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC92ZmxhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgRHVtbXkgbW9kdWxlOyBubyB2aXJ0dWFsIGZyYW1lYnVmZmVyIGZvciB0aGlzIE9TCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLQotaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkICogUE1BUEkgVkZfaW5pdCh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCi17Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgVkZfZXhpdCh2b2lkKQotewotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL3p0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmRmNDhjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC96dGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBWeEQKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFplbiBUaW1lciBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdWxvbmcgICAgZnJlcXVlbmN5ID0gMTE5MzE4MDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBaZW4gVGltZXIgbW9kdWxlIGludGVybmFscy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fWlRpbWVySW5pdCgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lck9uKHRtKSAgICAgVlREX0dldF9SZWFsX1RpbWUoJnRtLT5zdGFydC5oaWdoLCZ0bS0+c3RhcnQubG93KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fTFpUaW1lckxhcCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIGxhcCxjb3VudDsKLSAgICBWVERfR2V0X1JlYWxfVGltZSgmbGFwLmhpZ2gsJmxhcC5sb3cpOwotICAgIF9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LCZsYXAsJmNvdW50KTsKLSAgICByZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJmNvdW50LGZyZXF1ZW5jeSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lck9mZih0bSkgICAgVlREX0dldF9SZWFsX1RpbWUoJnRtLT5lbmQuaGlnaCwmdG0tPmVuZC5sb3cpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19MWlRpbWVyQ291bnQoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciB0bUNvdW50OwotICAgIF9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LCZ0bS0+ZW5kLCZ0bUNvdW50KTsKLSAgICByZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsZnJlcXVlbmN5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGFzIG1pY3Jvc2Vjb25kcyBwZXIgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFVMWlRJTUVSX1JFU09MVVRJT04gICAgIDEwMDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBMb25nIFBlcmlvZCB0aW1lciB2YWx1ZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyIGNvdW50OwotICAgIFZURF9HZXRfUmVhbF9UaW1lKCZjb3VudC5oaWdoLCZjb3VudC5sb3cpOwotICAgIHJldHVybiAoY291bnQubG93ICogMTAwMC4wIC8gZnJlcXVlbmN5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCi13aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KLWFjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKLXBhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoteyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL19wbXdpbjMyLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL19wbXdpbjMyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyNDJiNS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9fcG13aW4zMi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KLTsqIEVudmlyb25tZW50OiBXaW4zMgotOyoKLTsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgYXNzZW1ibHkgc3VwcG9ydCBmb3IgdGhlIFBNIGxpYnJhcnkgc3BlY2lmaWMKLTsqICAgICAgICAgICAgICB0byBXaW5kb3dzLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgICAgIF9wbXdpbjMyICAgICAgICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKLQotYmVnZGF0YXNlZyAgX3Btd2luMzIKLQotICAgICAgICBjZ2xvYmFsIF9QTV9pb2VudHJ5Ci0gICAgICAgIGNnbG9iYWwgX1BNX2dkdAotX1BNX2lvZW50cnkgICAgIGRkICAwICAgICAgICAgICAgICAgOyBPZmZzZXQgdG8gY2FsbCBnYXRlCi1fUE1fZ2R0ICAgICAgICAgZHcgIDAgICAgICAgICAgICAgICA7IFNlbGVjdG9yIHRvIGNhbGwgZ2F0ZQotCi1lbmRkYXRhc2VnICBfcG13aW4zMgotCi1iZWdjb2Rlc2VnICBfcG13aW4zMiAgICAgICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX3NldElPUEwoaW50IGlvcGwpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDaGFuZ2UgdGhlIElPUEwgbGV2ZWwgZm9yIHRoZSAzMi1iaXQgdGFzay4gUmV0dXJucyB0aGUgcHJldmlvdXMgbGV2ZWwKLTsgc28gaXQgY2FuIGJlIHJlc3RvcmVkIGZvciB0aGUgdGFzayBjb3JyZWN0bHkuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3NldElPUExWaWFDYWxsR2F0ZQotCi0gICAgICAgIEFSRyAgICAgaW9wbDpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIHRoZSBvbGQgRUZMQUdTIGZvciBsYXRlcgotICAgICAgICBtb3YgICAgIGVjeCxbaW9wbF0gICAgICAgICAgOyBFQ1ggOj0gSU9QTCBsZXZlbAotICAgICAgICB4b3IgICAgIGVieCxlYnggICAgICAgICAgICAgOyBDaGFuZ2UgSU9QTCBsZXZlbCBmdW5jdGlvbiBjb2RlCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgZmFyIGR3b3JkIFtfUE1faW9lbnRyeV0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbRldPUkQgX1BNX2lvZW50cnldCi1lbmRpZgotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICBhbmQgICAgIGVheCwwMDExMDAwMDAwMDAwMDAwYgotICAgICAgICBzaHIgICAgIGVheCwxMgotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfcG13aW4zMgotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL2NwdWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhOTc1Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9jcHVpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW4zMgotKgotKiBEZXNjcmlwdGlvbjogIE1vZHVsZSB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgdG8gbWVhc3VyZSB0aGUKLSogICAgICAgICAgICAgICBDUFUgZnJlcXVlbmN5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGlib29sIGhhdmVQZXJmb3JtYW5jZUNvdW50ZXI7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5jcmVhc2UgdGhlIHRocmVhZCBwcmlvcml0eSB0byBtYXhpbXVtLCBpZiBwb3NzaWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IFNldE1heFRocmVhZFByaW9yaXR5KHZvaWQpCi17Ci0gICAgaW50ICAgICBvbGRQcmlvcml0eTsKLSAgICBIQU5ETEUgIGhUaHJlYWQgPSBHZXRDdXJyZW50VGhyZWFkKCk7Ci0KLSAgICBvbGRQcmlvcml0eSA9IEdldFRocmVhZFByaW9yaXR5KGhUaHJlYWQpOwotICAgIGlmIChvbGRQcmlvcml0eSAhPSBUSFJFQURfUFJJT1JJVFlfRVJST1JfUkVUVVJOKQotCVNldFRocmVhZFByaW9yaXR5KGhUaHJlYWQsIFRIUkVBRF9QUklPUklUWV9USU1FX0NSSVRJQ0FMKTsKLSAgICByZXR1cm4gb2xkUHJpb3JpdHk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgb3JpZ2luYWwgdGhyZWFkIHByaW9yaXR5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFJlc3RvcmVUaHJlYWRQcmlvcml0eSgKLSAgICBpbnQgb2xkUHJpb3JpdHkpCi17Ci0gICAgSEFORExFICBoVGhyZWFkID0gR2V0Q3VycmVudFRocmVhZCgpOwotCi0gICAgaWYgKG9sZFByaW9yaXR5ICE9IFRIUkVBRF9QUklPUklUWV9FUlJPUl9SRVRVUk4pCi0JU2V0VGhyZWFkUHJpb3JpdHkoaFRocmVhZCwgb2xkUHJpb3JpdHkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKLXsKLSAgICBpZiAoIVF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koKExBUkdFX0lOVEVHRVIqKWZyZXEpKSB7Ci0JaGF2ZVBlcmZvcm1hbmNlQ291bnRlciA9IGZhbHNlOwotCWZyZXEtPmxvdyA9IDEwMDAwMDsKLQlmcmVxLT5oaWdoID0gMDsKLQl9Ci0gICAgZWxzZQotCWhhdmVQZXJmb3JtYW5jZUNvdW50ZXIgPSB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIqKXQpOyAgICAgICAgIFwKLSAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkodCktPmxvdyA9IHRpbWVHZXRUaW1lKCkgKiAxMDA7ICAgICAgICAgICAgICAgICAgICAgXAotCSh0KS0+aGlnaCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL2RkcmF3LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9kZHJhdy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMzZjYwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL2RkcmF3LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFdpbjMyCi0qCi0qIERlc2NyaXB0aW9uOiAgV2luMzIgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtCi0qICAgICAgICAgICAgICAgZXZlbnQgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJldmVudC5oIgotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAid2luMzIvb3NoZHIuaCIKLSNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFB1YmxpY2x5IGFjY2Vzc2libGUgdmFyaWFibGVzICovCi0KLWludCAgICAgICAgICAgICAgICAgX1BNX2Rlc2tYLF9QTV9kZXNrWTsvKiBEZXNrdG9wIGRpbWVudGlvbnMgICAgICAgICAgICovCi1IV05EICAgICAgICAgICAgICAgIF9QTV9od25kQ29uc29sZTsgICAgLyogV2luZG93IGhhbmRsZSBmb3IgY29uc29sZSAgICAqLwotI2lmZGVmICBfX0lOVEVMX18KLXVpbnQgICAgICAgICAgICAgICAgX1BNX2N3X2RlZmF1bHQ7ICAgICAvKiBEZWZhdWx0IEZQVSBjb250cm9sIHdvcmQgICAgICovCi0jZW5kaWYKLQotLyogUHJpdmF0ZSBpbnRlcm5hbCB2YXJpYWJsZXMgKi8KLQotc3RhdGljIEhJTlNUQU5DRSAgICBoSW5zdEFwcCA9IE5VTEw7LyogQXBwbGljYXRpb24gaW5zdGFuY2UgaGFuZGxlICAgICAgKi8KLXN0YXRpYyBIV05EICAgICAgICAgaHduZFVzZXIgPSBOVUxMOy8qIFVzZXIgd2luZG93IGhhbmRsZSAgICAgICAgICAgICAgICovCi1zdGF0aWMgSElOU1RBTkNFICAgIGhJbnN0REQgPSBOVUxMOyAvKiBIYW5kbGUgdG8gRGlyZWN0RHJhdyBETEwgICAgICAgICAqLwotc3RhdGljIExQRElSRUNURFJBVyBscEREID0gTlVMTDsgICAgLyogRGlyZWN0RHJhdyBvYmplY3QgICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBMT05HICAgICAgICAgb2xkV25kU3R5bGU7ICAgIC8qIEluZm8gYWJvdXQgb2xkIHVzZXIgd2luZG93ICAgICAgICovCi1zdGF0aWMgTE9ORyAgICAgICAgIG9sZEV4V25kU3R5bGU7ICAvKiBJbmZvIGFib3V0IG9sZCB1c2VyIHdpbmRvdyAgICAgICAqLwotc3RhdGljIGludCAgICAgICAgICBvbGRXaW5Qb3NYOyAgICAgLyogT2xkIHdpbmRvdyBwb3NpdGlvbiBYIGNvb3JkaW5hdGUgKi8KLXN0YXRpYyBpbnQgICAgICAgICAgb2xkV2luUG9zWTsgICAgIC8qIE9sZCB3aW5kb3cgcGlzaXRpb24gWSBjb29yZGluYXRlICovCi1zdGF0aWMgaW50ICAgICAgICAgIG9sZFdpblNpemVYOyAgICAvKiBPbGQgd2luZG93IHNpemUgWCAgICAgICAgICAgICAgICAqLwotc3RhdGljIGludCAgICAgICAgICBvbGRXaW5TaXplWTsgICAgLyogT2xkIHdpbmRvdyBzaXplIFkgICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBXTkRQUk9DICAgICAgb2xkV2luUHJvYyA9IE5VTEw7Ci1zdGF0aWMgUE1fc2F2ZVN0YXRlX2NiIHN1c3BlbmRBcHAgPSBOVUxMOwotc3RhdGljIGlib29sICAgICAgICB3YWl0QWN0aXZlID0gZmFsc2U7Ci1zdGF0aWMgaWJvb2wgICAgICAgIGlzRnVsbFNjcmVlbiA9IGZhbHNlOwotc3RhdGljIGlib29sICAgICAgICBiYWNrSW5HREkgPSBmYWxzZTsKLQotLyogSW50ZXJuYWwgc3RyaW5ncyAqLwotCi1zdGF0aWMgY2hhciAqc3pXaW5DbGFzc05hbWUgICAgID0gIlNjaVRlY2hEaXJlY3REcmF3V2luZG93IjsKLXN0YXRpYyBjaGFyICpzekF1dG9QbGF5S2V5ICAgICAgPSAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFBvbGljaWVzXFxFeHBsb3JlciI7Ci1zdGF0aWMgY2hhciAqc3pBdXRvUGxheVZhbHVlICAgID0gIk5vRHJpdmVUeXBlQXV0b1J1biI7Ci0KLS8qIER5bmFsaW5rcyB0byBEaXJlY3REcmF3IGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpwRGlyZWN0RHJhd0NyZWF0ZSkoR1VJRCBGQVIgKmxwR1VJRCwgTFBESVJFQ1REUkFXIEZBUiAqbHBscERELCBJVW5rbm93biBGQVIgKnBVbmtPdXRlcik7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGVtcG9yYXJpbHkgZGlzYWJsZXMgQXV0b1BsYXkgb3BlcmF0aW9uIHdoaWxlIHdlIGFyZSBydW5uaW5nIGluIGZ1bGxzY3JlZW4KLWdyYXBoaWNzIG1vZGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIERpc2FibGVBdXRvUGxheSh2b2lkKQotewotICAgIERXT1JEICAgZHdBdXRvUGxheSxkd1NpemUgPSBzaXplb2YoZHdBdXRvUGxheSk7Ci0gICAgSEtFWSAgICBoS2V5OwotCi0gICAgaWYgKFJlZ09wZW5LZXlFeChIS0VZX0NVUlJFTlRfVVNFUixzekF1dG9QbGF5S2V5LDAsS0VZX0VYRUNVVEUgfCBLRVlfV1JJVEUsJmhLZXkpID09IEVSUk9SX1NVQ0NFU1MpIHsKLQlSZWdRdWVyeVZhbHVlRXgoaEtleSxzekF1dG9QbGF5VmFsdWUsTlVMTCxOVUxMLCh2b2lkKikmZHdBdXRvUGxheSwmZHdTaXplKTsKLQlkd0F1dG9QbGF5IHw9IEFVVE9QTEFZX0RSSVZFX0NEUk9NOwotCVJlZ1NldFZhbHVlRXgoaEtleSxzekF1dG9QbGF5VmFsdWUsMCxSRUdfRFdPUkQsKHZvaWQqKSZkd0F1dG9QbGF5LGR3U2l6ZSk7Ci0JUmVnQ2xvc2VLZXkoaEtleSk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlLWVuYWJsZXMgQXV0b1BsYXkgb3BlcmF0aW9uIHdoZW4gd2UgcmV0dXJuIHRvIHJlZ3VsYXIgR0RJIG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUmVzdG9yZUF1dG9QbGF5KHZvaWQpCi17Ci0gICAgRFdPUkQgICBkd0F1dG9QbGF5LGR3U2l6ZSA9IHNpemVvZihkd0F1dG9QbGF5KTsKLSAgICBIS0VZICAgIGhLZXk7Ci0KLSAgICBpZiAoUmVnT3BlbktleUV4KEhLRVlfQ1VSUkVOVF9VU0VSLHN6QXV0b1BsYXlLZXksMCxLRVlfRVhFQ1VURSB8IEtFWV9XUklURSwmaEtleSkgPT0gRVJST1JfU1VDQ0VTUykgewotCVJlZ1F1ZXJ5VmFsdWVFeChoS2V5LHN6QXV0b1BsYXlWYWx1ZSxOVUxMLE5VTEwsKHZvaWQqKSZkd0F1dG9QbGF5LCZkd1NpemUpOwotCWR3QXV0b1BsYXkgJj0gfkFVVE9QTEFZX0RSSVZFX0NEUk9NOwotCVJlZ1NldFZhbHVlRXgoaEtleSxzekF1dG9QbGF5VmFsdWUsMCxSRUdfRFdPUkQsKHZvaWQqKSZkd0F1dG9QbGF5LGR3U2l6ZSk7Ci0JUmVnQ2xvc2VLZXkoaEtleSk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVN1c3BlbmRzIHRoZSBhcHBsaWNhdGlvbiBieSBzd2l0Y2hpbmcgYmFjayB0byB0aGUgR0RJIGRlc2t0b3AsIGFsbG93aW5nCi1ub3JtYWwgYXBwbGljYXRpb24gY29kZSB0byBiZSBwcm9jZXNzZWQsIGFuZCB0aGVuIHdhaXRpbmcgZm9yIHRoZQotYXBwbGljYXRpb24gYWN0aXZhdGUgY29tbWFuZCB0byBicmluZyB1cyBiYWNrIHRvIGZ1bGxzY3JlZW4gbW9kZSB3aXRoIG91cgotd2luZG93IG1pbmltaXNlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBMZWF2ZUZ1bGxTY3JlZW4odm9pZCkKLXsKLSAgICBpbnQgcmV0Q29kZSA9IFBNX1NVU1BFTkRfQVBQOwotCi0gICAgaWYgKGJhY2tJbkdESSkKLQlyZXR1cm47Ci0gICAgaWYgKHN1c3BlbmRBcHApCi0JcmV0Q29kZSA9IHN1c3BlbmRBcHAoUE1fREVBQ1RJVkFURSk7Ci0gICAgUmVzdG9yZUF1dG9QbGF5KCk7Ci0gICAgYmFja0luR0RJID0gdHJ1ZTsKLQotICAgIC8qIE5vdyBwcm9jZXNzIG1lc3NhZ2VzIG5vcm1hbGx5IHVudGlsIHdlIGFyZSByZS1hY3RpdmF0ZWQgKi8KLSAgICB3YWl0QWN0aXZlID0gdHJ1ZTsKLSAgICBpZiAocmV0Q29kZSAhPSBQTV9OT19TVVNQRU5EX0FQUCkgewotCXdoaWxlICh3YWl0QWN0aXZlKSB7Ci0JICAgIF9FVlRfcHVtcE1lc3NhZ2VzKCk7Ci0JICAgIFNsZWVwKDIwMCk7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhY3RpdmF0ZSBhbGwgdGhlIHN1cmZhY2VzIGZvciBEaXJlY3REcmF3IGFuZCBzZXQgdGhlIHN5c3RlbSBiYWNrIHVwIGZvcgotZnVsbHNjcmVlbiByZW5kZXJpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUmVzdG9yZUZ1bGxTY3JlZW4odm9pZCkKLXsKLSAgICBzdGF0aWMgaWJvb2wgICAgZmlyc3RUaW1lID0gdHJ1ZTsKLQotICAgIGlmIChmaXJzdFRpbWUpIHsKLQkvKiBDbGVhciB0aGUgbWVzc2FnZSBxdWV1ZSB3aGlsZSB3YWl0aW5nIGZvciB0aGUgc3VyZmFjZXMgdG8gYmUKLQkgKiByZXN0b3JlZC4KLQkgKi8KLQlmaXJzdFRpbWUgPSBmYWxzZTsKLQl3aGlsZSAoMSkgewotCSAgICAvKiBDb250aW51ZSBsb29waW5nIHVudGlsIG91dCBhcHBsaWNhdGlvbiBoYXMgYmVlbiByZXN0b3JlZAotCSAgICAgKiBhbmQgd2UgaGF2ZSByZXNldCB0aGUgZGlzcGxheSBtb2RlLgotCSAgICAgKi8KLQkgICAgX0VWVF9wdW1wTWVzc2FnZXMoKTsKLQkgICAgaWYgKEdldEFjdGl2ZVdpbmRvdygpID09IF9QTV9od25kQ29uc29sZSkgewotCQlpZiAoc3VzcGVuZEFwcCkKLQkJICAgIHN1c3BlbmRBcHAoUE1fUkVBQ1RJVkFURSk7Ci0JCURpc2FibGVBdXRvUGxheSgpOwotCQliYWNrSW5HREkgPSBmYWxzZTsKLQkJd2FpdEFjdGl2ZSA9IGZhbHNlOwotCQlmaXJzdFRpbWUgPSB0cnVlOwotCQlyZXR1cm47Ci0JCX0KLQkgICAgU2xlZXAoMjAwKTsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHN1c3BlbmRzIHRoZSBhcHBsaWNhdGlvbiBieSBzd2l0Y2hpbmcgYmFjayB0byB0aGUgR0RJIGRlc2t0b3AsCi1hbGxvd2luZyBub3JtYWwgYXBwbGljYXRpb24gY29kZSB0byBiZSBwcm9jZXNzZWQgYW5kIHRoZW4gd2FpdGluZyBmb3IgdGhlCi1hcHBsaWNhdGlvbiBhY3RpdmF0ZSBjb21tYW5kIHRvIGJyaW5nIHVzIGJhY2sgdG8gZnVsbHNjcmVlbiBtb2RlIHdpdGggb3VyCi13aW5kb3cgbWluaW1pc2VkLgotCi1UaGlzIHZlcnNpb24gb25seSBnZXRzIGNhbGxlZCBpZiB3ZSBoYXZlIG5vdCBjYXB0dXJlZCB0aGUgc2NyZWVuIHN3aXRjaCBpbgotb3VyIGFjdGl2YXRlIG1lc3NhZ2UgbG9vcHMgYW5kIHdpbGwgb2NjdXIgaWYgdGhlIERpcmVjdERyYXcgZHJpdmVycyBsb3NlIGEKLXN1cmZhY2UgZm9yIHNvbWUgcmVhc29uIHdoaWxlIHJlbmRlcmluZy4gVGhpcyBzaG91bGQgbm90IG5vcm1hbGx5IGhhcHBlbiwKLWJ1dCBpdCBpcyBpbmNsdWRlZCBqdXN0IHRvIGJlIHN1cmUgKGl0IGNhbiBoYXBwZW4gb24gV2luTlQvMjAwMCBpZiB0aGUgdXNlcgotaGl0cyB0aGUgQ3RybC1BbHQtRGVsIGtleSBjb21iaW5hdGlvbikuIE5vdGUgdGhhdCB0aGlzIGNvZGUgd2lsbCBhbHdheXMKLXNwaW4gbG9vcCwgYW5kIHdlIGNhbm5vdCBkaXNhYmxlIHRoZSBzcGluIGxvb3BpbmcgZnJvbSB0aGlzIHZlcnNpb24gKGllOgotaWYgdGhlIHVzZXIgaGl0cyBDdHJsLUFsdC1EZWwgdW5kZXIgV2luTlQvMjAwMCB0aGUgYXBwbGljYXRpb24gbWFpbiBsb29wCi13aWxsIGNlYXNlIHRvIGJlIGV4ZWN1dGVkIHVudGlsIHRoZSB1c2VyIHN3aXRjaGVzIGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2RvU3VzcGVuZEFwcCh2b2lkKQotewotICAgIHN0YXRpYyAgaWJvb2wgZmlyc3RUaW1lID0gdHJ1ZTsKLQotICAgIC8qIENhbGwgc3lzdGVtIERMTCB2ZXJzaW9uIGlmIGZvdW5kICovCi0gICAgaWYgKF9QTV9pbXBvcnRzLlBNX2RvU3VzcGVuZEFwcCAhPSBQTV9kb1N1c3BlbmRBcHApIHsKLQlfUE1faW1wb3J0cy5QTV9kb1N1c3BlbmRBcHAoKTsKLQlyZXR1cm47Ci0JfQotCi0gICAgaWYgKGZpcnN0VGltZSkgewotCWlmIChzdXNwZW5kQXBwKQotCSAgICBzdXNwZW5kQXBwKFBNX0RFQUNUSVZBVEUpOwotCVJlc3RvcmVBdXRvUGxheSgpOwotCWZpcnN0VGltZSA9IGZhbHNlOwotCWJhY2tJbkdESSA9IHRydWU7Ci0JfQotICAgIFJlc3RvcmVGdWxsU2NyZWVuKCk7Ci0gICAgZmlyc3RUaW1lID0gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYWluIFdpbmRvdyBwcm9jIGZvciB0aGUgZnVsbCBzY3JlZW4gRGlyZWN0RHJhdyBXaW5kb3cgdGhhdCB3ZSBjcmVhdGUgd2hpbGUKLXJ1bm5pbmcgaW4gZnVsbCBzY3JlZW4gbW9kZS4gSGVyZSB3ZSBjYXB0dXJlIGFsbCBtb3VzZSBhbmQga2V5Ym9hcmQgZXZlbnRzCi1mb3IgdGhlIHdpbmRvdyBhbmQgcGx1ZyB0aGVtIGludG8gb3VyIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBMT05HIENBTExCQUNLIFBNX3dpblByb2MoCi0gICAgSFdORCBod25kLAotICAgIFVJTlQgbXNnLAotICAgIFdQQVJBTSB3UGFyYW0sCi0gICAgTE9ORyBsUGFyYW0pCi17Ci0gICAgc3dpdGNoIChtc2cpIHsKLQljYXNlIFdNX1NZU0NIQVI6Ci0JICAgIC8qIFN0b3AgQWx0LVNwYWNlIGZyb20gcGF1c2luZyBvdXIgYXBwbGljYXRpb24gKi8KLQkgICAgcmV0dXJuIDA7Ci0JY2FzZSBXTV9LRVlET1dOOgotCWNhc2UgV01fU1lTS0VZRE9XTjoKLQkgICAgaWYgKEhJV09SRChsUGFyYW0pICYgS0ZfUkVQRUFUKSB7Ci0JCWlmIChtc2cgPT0gV01fU1lTS0VZRE9XTikKLQkJICAgIHJldHVybiAwOwotCQlicmVhazsKLQkJfQotCSAgICAvKiBGYWxsIHRocm91Z2ggZm9yIGtleWRvd24gZXZlbnRzICovCi0JY2FzZSBXTV9LRVlVUDoKLQljYXNlIFdNX1NZU0tFWVVQOgotCSAgICBpZiAobXNnID09IFdNX1NZU0tFWURPV04gfHwgbXNnID09IFdNX1NZU0tFWVVQKSB7Ci0JCWlmICgoSElXT1JEKGxQYXJhbSkgJiBLRl9BTFRET1dOKSAmJiB3UGFyYW0gPT0gVktfUkVUVVJOKQotCQkgICAgYnJlYWs7Ci0JCS8qIFdlIGlnbm9yZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBzeXN0ZW0ga2V5cyB0byBzdG9wIHRoZQotCQkgKiBzeXN0ZW0gbWVudSBmcm9tIGJlaW5nIGFjdGl2YXRlZCBmcm9tIHRoZSBrZXlib2FyZCBhbmQgcGF1c2luZwotCQkgKiBvdXIgYXBwIHdoaWxlIGZ1bGxzY3JlZW4gKGllOiBwcmVzc2luZyB0aGUgQWx0IGtleSkuCi0JCSAqLwotCQlyZXR1cm4gMDsKLQkJfQotCSAgICBicmVhazsKLQljYXNlIFdNX1NZU0NPTU1BTkQ6Ci0JICAgIHN3aXRjaCAod1BhcmFtICYgfjB4MEYpIHsKLQkJY2FzZSBTQ19TQ1JFRU5TQVZFOgotCQljYXNlIFNDX01PTklUT1JQT1dFUjoKLQkJICAgIC8qIElnbm9yZSBzY3JlZW5zYXZlciByZXF1ZXN0cyBpbiBmdWxsc2NyZWVuIG1vZGVzICovCi0JCSAgICByZXR1cm4gMDsKLQkJfQotCSAgICBicmVhazsKLQljYXNlIFdNX1NJWkU6Ci0JICAgIGlmICh3YWl0QWN0aXZlICYmIGJhY2tJbkdESSAmJiAod1BhcmFtICE9IFNJWkVfTUlOSU1JWkVEKSkgewotCQkvKiBTdGFydCB0aGUgcmUtYWN0aXZhdGlvbiBwcm9jZXNzICovCi0JCVBvc3RNZXNzYWdlKGh3bmQsV01fRE9fU1VTUEVORF9BUFAsV01fUE1fUkVTVE9SRV9GVUxMU0NSRUVOLDApOwotCQl9Ci0JICAgIGVsc2UgaWYgKCF3YWl0QWN0aXZlICYmIGlzRnVsbFNjcmVlbiAmJiAhYmFja0luR0RJICYmICh3UGFyYW0gPT0gU0laRV9NSU5JTUlaRUQpKSB7Ci0JCS8qIFN0YXJ0IHRoZSBkZS1hY3RpdmF0aW9uIHByb2Nlc3MgKi8KLQkJUG9zdE1lc3NhZ2UoaHduZCxXTV9ET19TVVNQRU5EX0FQUCxXTV9QTV9MRUFWRV9GVUxMU0NSRUVOLDApOwotCQl9Ci0JICAgIGJyZWFrOwotCWNhc2UgV01fRE9fU1VTUEVORF9BUFA6Ci0JICAgIHN3aXRjaCAod1BhcmFtKSB7Ci0JCQkJY2FzZSBXTV9QTV9SRVNUT1JFX0ZVTExTQ1JFRU46Ci0JCQkJCVJlc3RvcmVGdWxsU2NyZWVuKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgV01fUE1fTEVBVkVfRlVMTFNDUkVFTjoKLQkJCQkJTGVhdmVGdWxsU2NyZWVuKCk7Ci0JCQkJCWJyZWFrOwotCQl9Ci0JICAgIHJldHVybiAwOwotCX0KLSAgICBpZiAob2xkV2luUHJvYykKLQlyZXR1cm4gb2xkV2luUHJvYyhod25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKLSAgICByZXR1cm4gRGVmV2luZG93UHJvYyhod25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1od25kICAgIC0gVXNlciB3aW5kb3cgdG8gY29udmVydAotd2lkdGggICAtIFdpbmRvdyBvZiB0aGUgZnVsbHNjcmVlbiB3aW5kb3cKLWhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGZ1bGxzY3JlZW4gd2luZG93Ci0KLVJFVFVSTlM6Ci1IYW5kbGUgdG8gY29udmVydGVkIGZ1bGxzY3JlZW4gV2luZG93LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgb3JpZ2luYWwgdXNlciB3aW5kb3cgaGFuZGxlIGFuZCBtb2RpZmllcyB0aGUgc2l6ZSwKLXBvc2l0aW9uIGFuZCBhdHRyaWJ1dGVzIGZvciB0aGUgd2luZG93IHRvIGNvbnZlcnQgaXQgaW50byBhIGZ1bGxzY3JlZW4KLXdpbmRvdyB0aGF0IHdlIGNhbiB1c2UuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFBNX0hXTkQgX1BNX2NvbnZlcnRVc2VyV2luZG93KAotICAgIEhXTkQgaHduZCwKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCkKLXsKLSAgICBSRUNUICAgIHdpbmRvdzsKLQotICAgIEdldFdpbmRvd1JlY3QoaHduZCwmd2luZG93KTsKLSAgICBvbGRXaW5Qb3NYID0gd2luZG93LmxlZnQ7Ci0gICAgb2xkV2luUG9zWSA9IHdpbmRvdy50b3A7Ci0gICAgb2xkV2luU2l6ZVggPSB3aW5kb3cucmlnaHQgLSB3aW5kb3cubGVmdDsKLSAgICBvbGRXaW5TaXplWSA9IHdpbmRvdy5ib3R0b20gLSB3aW5kb3cudG9wOwotICAgIG9sZFduZFN0eWxlID0gU2V0V2luZG93TG9uZyhod25kLEdXTF9TVFlMRSxXU19QT1BVUCB8IFdTX1NZU01FTlUpOwotICAgIG9sZEV4V25kU3R5bGUgPSBTZXRXaW5kb3dMb25nKGh3bmQsR1dMX0VYU1RZTEUsV1NfRVhfQVBQV0lORE9XKTsKLSAgICBTaG93V2luZG93KGh3bmQsU1dfU0hPVyk7Ci0gICAgTW92ZVdpbmRvdyhod25kLDAsMCx3aWR0aCxoZWlnaHQsVFJVRSk7Ci0gICAgU2V0V2luZG93UG9zKGh3bmQsSFdORF9UT1BNT1NULDAsMCwwLDAsU1dQX05PTU9WRSB8IFNXUF9OT1NJWkUpOwotICAgIG9sZFdpblByb2MgPSAoV05EUFJPQylTZXRXaW5kb3dMb25nKGh3bmQsR1dMX1dORFBST0MsIChMUEFSQU0pUE1fd2luUHJvYyk7Ci0gICAgcmV0dXJuIGh3bmQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaHduZCAgICAtIFVzZXIgd2luZG93IHRvIHJlc3RvcmUKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVzdG9yZXMgdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZXMgb2YgdGhlIHVzZXIgd2luZG93IGFuZCBwdXQncwotaXQgYmFjayBpbnRvIGl0J3Mgb3JpZ2luYWwgc3RhdGUgYmVmb3JlIGl0IHdhcyBjb252ZXJ0ZWQgdG8gYSBmdWxsc2NyZWVuCi13aW5kb3cuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX1BNX3Jlc3RvcmVVc2VyV2luZG93KAotICAgIEhXTkQgaHduZCkKLXsKLSAgICBTZXRXaW5kb3dMb25nKGh3bmQsR1dMX1dORFBST0MsIChMUEFSQU0pb2xkV2luUHJvYyk7Ci0gICAgU2V0V2luZG93TG9uZyhod25kLEdXTF9FWFNUWUxFLG9sZEV4V25kU3R5bGUpOwotICAgIFNldFdpbmRvd0xvbmcoaHduZCxHV0xfU1RZTEUsb2xkV25kU3R5bGUpOwotICAgIFNldFdpbmRvd1Bvcyhod25kLEhXTkRfTk9UT1BNT1NULDAsMCwwLDAsU1dQX05PTU9WRSB8IFNXUF9OT1NJWkUpOwotICAgIFNob3dXaW5kb3coaHduZCxTV19TSE9XKTsKLSAgICBNb3ZlV2luZG93KGh3bmQsb2xkV2luUG9zWCxvbGRXaW5Qb3NZLG9sZFdpblNpemVYLG9sZFdpblNpemVZLFRSVUUpOwotICAgIG9sZFdpblByb2MgPSBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWRldmljZSAgLSBJbmRleCBvZiB0aGUgZGV2aWNlIHRvIGxvYWQgRGlyZWN0RHJhdyBmb3IgKDAgZm9yIHByaW1hcnkpCi0KLVJFTUFSS1M6Ci1BdHRlbXB0cyB0byBkeW5hbWljYWxseSBsb2FkIHRoZSBEaXJlY3REcmF3IERMTCdzIGFuZCBjcmVhdGUgdGhlIERpcmVjdERyYXcKLW9iamVjdHMgdGhhdCB3ZSBuZWVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9sb2FkRGlyZWN0RHJhdygKLSAgICBpbnQgZGV2aWNlKQotewotICAgIEhEQyAgICAgICAgIGhkYzsKLSAgICBpbnQgICAgICAgICBiaXRzOwotCi0gICAgLyogQ2FsbCBzeXN0ZW0gRExMIHZlcnNpb24gaWYgZm91bmQgKi8KLSAgICBpZiAoX1BNX2ltcG9ydHMuUE1fbG9hZERpcmVjdERyYXcgIT0gUE1fbG9hZERpcmVjdERyYXcpCi0JcmV0dXJuIF9QTV9pbXBvcnRzLlBNX2xvYWREaXJlY3REcmF3KGRldmljZSk7Ci0KLSAgICAvKiBUT0RPOiBIYW5kbGUgbXVsdGktbW9uaXRvciEhICovCi0gICAgaWYgKGRldmljZSAhPSAwKQotCXJldHVybiBOVUxMOwotCi0gICAgLyogTG9hZCB0aGUgRGlyZWN0RHJhdyBETEwgaWYgbm90IHByZXNlbnRseSBsb2FkZWQgKi8KLSAgICBHRVRfREVGQVVMVF9DVygpOwotICAgIGlmICghaEluc3RERCkgewotCWhkYyA9IEdldERDKE5VTEwpOwotCWJpdHMgPSBHZXREZXZpY2VDYXBzKGhkYyxCSVRTUElYRUwpOwotCVJlbGVhc2VEQyhOVUxMLGhkYyk7Ci0JaWYgKGJpdHMgPCA4KQotCSAgICByZXR1cm4gTlVMTDsKLQlpZiAoKGhJbnN0REQgPSBMb2FkTGlicmFyeSgiZGRyYXcuZGxsIikpID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCXBEaXJlY3REcmF3Q3JlYXRlID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhJbnN0REQsIkRpcmVjdERyYXdDcmVhdGUiKTsKLQlpZiAoIXBEaXJlY3REcmF3Q3JlYXRlKQotCSAgICByZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICAvKiBDcmVhdGUgdGhlIERpcmVjdERyYXcgb2JqZWN0ICovCi0gICAgaWYgKCFscEREICYmIHBEaXJlY3REcmF3Q3JlYXRlKE5VTEwsICZscERELCBOVUxMKSAhPSBERF9PSykgewotCWxwREQgPSBOVUxMOwotCXJldHVybiBOVUxMOwotCX0KLSAgICBSRVNFVF9ERUZBVUxUX0NXKCk7Ci0gICAgcmV0dXJuIGxwREQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZGV2aWNlICAtIEluZGV4IG9mIHRoZSBkZXZpY2UgdG8gdW5sb2FkIERpcmVjdERyYXcgZm9yICgwIGZvciBwcmltYXJ5KQotCi1SRU1BUktTOgotRnJlZXMgYW55IERpcmVjdERyYXcgb2JqZWN0cyBmb3IgdGhlIGRldmljZS4gV2UgbmV2ZXIgYWN0dWFsbHkgZXhwbGljaXRseQotdW5sb2FkIHRoZSBkZHJhdy5kbGwgbGlicmFyeSwgc2luY2UgdW5sb2FkaW5nIGFuZCByZWxvYWRpbmcgaXQgaXMKLXVubmVjZXNzYXJ5IHNpbmNlIHdlIG9ubHkgd2FudCB0byB1bmxvYWQgaXQgd2hlbiB0aGUgYXBwbGljYXRpb24gZXhpdHMgYW5kCi10aGF0IGhhcHBlbnMgYXV0b21hdGljYWxseS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3VubG9hZERpcmVjdERyYXcoCi0gICAgaW50IGRldmljZSkKLXsKLSAgICAvKiBDYWxsIHN5c3RlbSBETEwgdmVyc2lvbiBpZiBmb3VuZCAqLwotICAgIGlmIChfUE1faW1wb3J0cy5QTV91bmxvYWREaXJlY3REcmF3ICE9IFBNX3VubG9hZERpcmVjdERyYXcpIHsKLQlfUE1faW1wb3J0cy5QTV91bmxvYWREaXJlY3REcmF3KGRldmljZSk7Ci0JcmV0dXJuOwotCX0KLSAgICBpZiAobHBERCkgewotCUlEaXJlY3REcmF3X1JlbGVhc2UobHBERCk7Ci0JbHBERCA9IE5VTEw7Ci0JfQotICAgICh2b2lkKWRldmljZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PcGVuIGEgY29uc29sZSBmb3Igb3V0cHV0IHRvIHRoZSBzY3JlZW4sIGNyZWF0aW5nIHRoZSBtYWluIGV2ZW50IGhhbmRsaW5nCi13aW5kb3cgaWYgbmVjZXNzYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX0hXTkQgUE1BUEkgUE1fb3BlbkNvbnNvbGUoCi0gICAgUE1fSFdORCBoV25kVXNlciwKLSAgICBpbnQgZGV2aWNlLAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzLAotICAgIGludCBicHAsCi0gICAgaWJvb2wgZnVsbFNjcmVlbikKLXsKLSAgICBXTkRDTEFTUyAgICAgICAgY2xzOwotICAgIHN0YXRpYyBpYm9vbCAgICBjbGFzc1JlZ2lzdGVyZWQgPSBmYWxzZTsKLQotICAgIC8qIENhbGwgc3lzdGVtIERMTCB2ZXJzaW9uIGlmIGZvdW5kICovCi0gICAgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKCk7Ci0gICAgaWYgKF9QTV9pbXBvcnRzLlBNX29wZW5Db25zb2xlICE9IFBNX29wZW5Db25zb2xlKSB7Ci0JaWYgKGZ1bGxTY3JlZW4pIHsKLQkgICAgX1BNX2Rlc2tYID0geFJlczsKLQkgICAgX1BNX2Rlc2tZID0geVJlczsKLQkgICAgfQotCXJldHVybiBfUE1faW1wb3J0cy5QTV9vcGVuQ29uc29sZShoV25kVXNlcixkZXZpY2UseFJlcyx5UmVzLGJwcCxmdWxsU2NyZWVuKTsKLQl9Ci0KLSAgICAvKiBDcmVhdGUgdGhlIGZ1bGxzY3JlZW4gd2luZG93IGlmIG5lY2Vzc2FyeSAqLwotICAgIGh3bmRVc2VyID0gaFduZFVzZXI7Ci0gICAgaWYgKGZ1bGxTY3JlZW4pIHsKLQlpZiAoIWNsYXNzUmVnaXN0ZXJlZCkgewotCSAgICAvKiBDcmVhdGUgYSBXaW5kb3cgY2xhc3MgZm9yIHRoZSBmdWxsc2NyZWVuIHdpbmRvdyBpbiBoZXJlLCBzaW5jZQotCSAgICAgKiB3ZSBuZWVkIHRvIHJlZ2lzdGVyIG9uZSB0aGF0IHdpbGwgZG8gYWxsIG91ciBldmVudCBoYW5kbGluZyBmb3IKLQkgICAgICogdXMuCi0JICAgICAqLwotCSAgICBoSW5zdEFwcCAgICAgICAgICAgID0gR2V0TW9kdWxlSGFuZGxlKE5VTEwpOwotCSAgICBjbHMuaEN1cnNvciAgICAgICAgID0gTG9hZEN1cnNvcihOVUxMLElEQ19BUlJPVyk7Ci0JICAgIGNscy5oSWNvbiAgICAgICAgICAgPSBMb2FkSWNvbihoSW5zdEFwcCxNQUtFSU5UUkVTT1VSQ0UoMSkpOwotCSAgICBjbHMubHBzek1lbnVOYW1lICAgID0gTlVMTDsKLQkgICAgY2xzLmxwc3pDbGFzc05hbWUgICA9IHN6V2luQ2xhc3NOYW1lOwotCSAgICBjbHMuaGJyQmFja2dyb3VuZCAgID0gR2V0U3RvY2tPYmplY3QoQkxBQ0tfQlJVU0gpOwotCSAgICBjbHMuaEluc3RhbmNlICAgICAgID0gaEluc3RBcHA7Ci0JICAgIGNscy5zdHlsZSAgICAgICAgICAgPSBDU19EQkxDTEtTOwotCSAgICBjbHMubHBmblduZFByb2MgICAgID0gUE1fd2luUHJvYzsKLQkgICAgY2xzLmNiV25kRXh0cmEgICAgICA9IDA7Ci0JICAgIGNscy5jYkNsc0V4dHJhICAgICAgPSAwOwotCSAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MoJmNscykpCi0JCXJldHVybiBOVUxMOwotCSAgICBjbGFzc1JlZ2lzdGVyZWQgPSB0cnVlOwotCSAgICB9Ci0JX1BNX2Rlc2tYID0geFJlczsKLQlfUE1fZGVza1kgPSB5UmVzOwotCWlmICghaHduZFVzZXIpIHsKLQkgICAgY2hhciB3aW5kb3dUaXRsZVs4MF07Ci0JICAgIGlmIChMb2FkU3RyaW5nKGhJbnN0QXBwLDEsd2luZG93VGl0bGUsc2l6ZW9mKHdpbmRvd1RpdGxlKSkgPT0gMCkKLQkJc3RyY3B5KHdpbmRvd1RpdGxlLCJNR0wgRnVsbHNjcmVlbiBBcHBsaWNhdGlvbiIpOwotCSAgICBfUE1faHduZENvbnNvbGUgPSBDcmVhdGVXaW5kb3dFeChXU19FWF9BUFBXSU5ET1csc3pXaW5DbGFzc05hbWUsCi0JCXdpbmRvd1RpdGxlLFdTX1BPUFVQIHwgV1NfU1lTTUVOVSwwLDAseFJlcyx5UmVzLAotCQlOVUxMLE5VTEwsaEluc3RBcHAsTlVMTCk7Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgX1BNX2h3bmRDb25zb2xlID0gX1BNX2NvbnZlcnRVc2VyV2luZG93KGh3bmRVc2VyLHhSZXMseVJlcyk7Ci0JICAgIH0KLQlTaG93Q3Vyc29yKGZhbHNlKTsKLQlpc0Z1bGxTY3JlZW4gPSB0cnVlOwotCX0KLSAgICBlbHNlIHsKLQlfUE1faHduZENvbnNvbGUgPSBod25kVXNlcjsKLQlpc0Z1bGxTY3JlZW4gPSBmYWxzZTsKLQl9Ci0gICAgU2V0Rm9jdXMoX1BNX2h3bmRDb25zb2xlKTsKLSAgICBTZXRGb3JlZ3JvdW5kV2luZG93KF9QTV9od25kQ29uc29sZSk7Ci0gICAgRGlzYWJsZUF1dG9QbGF5KCk7Ci0gICAgKHZvaWQpYnBwOwotICAgIHJldHVybiBfUE1faHduZENvbnNvbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmluZCB0aGUgc2l6ZSBvZiB0aGUgY29uc29sZSBzdGF0ZSBidWZmZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKLXsKLSAgICAvKiBDYWxsIHN5c3RlbSBETEwgdmVyc2lvbiBpZiBmb3VuZCAqLwotICAgIGlmIChfUE1faW1wb3J0cy5QTV9nZXRDb25zb2xlU3RhdGVTaXplICE9IFBNX2dldENvbnNvbGVTdGF0ZVNpemUpCi0JcmV0dXJuIF9QTV9pbXBvcnRzLlBNX2dldENvbnNvbGVTdGF0ZVNpemUoKTsKLQotICAgIC8qIE5vdCB1c2VkIGluIFdpbmRvd3MgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYXZlIHRoZSBzdGF0ZSBvZiB0aGUgY29uc29sZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NhdmVDb25zb2xlU3RhdGUoCi0gICAgdm9pZCAqc3RhdGVCdWYsCi0gICAgUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBDYWxsIHN5c3RlbSBETEwgdmVyc2lvbiBpZiBmb3VuZCAqLwotICAgIGlmIChfUE1faW1wb3J0cy5QTV9zYXZlQ29uc29sZVN0YXRlICE9IFBNX3NhdmVDb25zb2xlU3RhdGUpIHsKLQlfUE1faW1wb3J0cy5QTV9zYXZlQ29uc29sZVN0YXRlKHN0YXRlQnVmLGh3bmRDb25zb2xlKTsKLQlyZXR1cm47Ci0JfQotCi0gICAgLyogTm90IHVzZWQgaW4gV2luZG93cyAqLwotICAgICh2b2lkKXN0YXRlQnVmOwotICAgICh2b2lkKWh3bmRDb25zb2xlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgc3VzcGVuZCBhcHBsaWNhdGlvbiBjYWxsYmFjayBmb3IgdGhlIGZ1bGxzY3JlZW4gY29uc29sZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldFN1c3BlbmRBcHBDYWxsYmFjaygKLSAgICBQTV9zYXZlU3RhdGVfY2Igc2F2ZVN0YXRlKQotewotICAgIC8qIENhbGwgc3lzdGVtIERMTCB2ZXJzaW9uIGlmIGZvdW5kICovCi0gICAgaWYgKF9QTV9pbXBvcnRzLlBNX3NldFN1c3BlbmRBcHBDYWxsYmFjayAhPSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2spIHsKLQlfUE1faW1wb3J0cy5QTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soc2F2ZVN0YXRlKTsKLQlyZXR1cm47Ci0JfQotICAgIHN1c3BlbmRBcHAgPSBzYXZlU3RhdGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgY29uc29sZSBzdGF0ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoCi0gICAgY29uc3Qgdm9pZCAqc3RhdGVCdWYsCi0gICAgUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBDYWxsIHN5c3RlbSBETEwgdmVyc2lvbiBpZiBmb3VuZCAqLwotICAgIGlmIChfUE1faW1wb3J0cy5QTV9yZXN0b3JlQ29uc29sZVN0YXRlICE9IFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUpIHsKLQlfUE1faW1wb3J0cy5QTV9yZXN0b3JlQ29uc29sZVN0YXRlKHN0YXRlQnVmLGh3bmRDb25zb2xlKTsKLQlyZXR1cm47Ci0JfQotCi0gICAgLyogTm90IHVzZWQgaW4gV2luZG93cyAqLwotICAgICh2b2lkKXN0YXRlQnVmOwotICAgICh2b2lkKWh3bmRDb25zb2xlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNsb3NlIHRoZSBmdWxsc2NyZWVuIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoCi0gICAgUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBDYWxsIHN5c3RlbSBETEwgdmVyc2lvbiBpZiBmb3VuZCAqLwotICAgIGlmIChfUE1faW1wb3J0cy5QTV9jbG9zZUNvbnNvbGUgIT0gUE1fY2xvc2VDb25zb2xlKSB7Ci0JX1BNX2ltcG9ydHMuUE1fY2xvc2VDb25zb2xlKGh3bmRDb25zb2xlKTsKLQlyZXR1cm47Ci0JfQotICAgIFNob3dDdXJzb3IodHJ1ZSk7Ci0gICAgUmVzdG9yZUF1dG9QbGF5KCk7Ci0gICAgaWYgKGh3bmRVc2VyKQotCV9QTV9yZXN0b3JlVXNlcldpbmRvdyhod25kQ29uc29sZSk7Ci0gICAgZWxzZQotCURlc3Ryb3lXaW5kb3coaHduZENvbnNvbGUpOwotICAgIGh3bmRVc2VyID0gTlVMTDsKLSAgICBfUE1faHduZENvbnNvbGUgPSBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgRGlyZWN0RHJhdyB3aW5kb3cgaGFuZGxlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX0hXTkQgUE1BUEkgUE1fZ2V0RGlyZWN0RHJhd1dpbmRvdyh2b2lkKQotewotICAgIC8qIENhbGwgc3lzdGVtIERMTCB2ZXJzaW9uIGlmIGZvdW5kICovCi0gICAgaWYgKF9QTV9pbXBvcnRzLlBNX2dldERpcmVjdERyYXdXaW5kb3cgIT0gUE1fZ2V0RGlyZWN0RHJhd1dpbmRvdykKLQlyZXR1cm4gX1BNX2ltcG9ydHMuUE1fZ2V0RGlyZWN0RHJhd1dpbmRvdygpOwotICAgIHJldHVybiBfUE1faHduZENvbnNvbGU7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4ODA1Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW4zMgotKgotKiBEZXNjcmlwdGlvbjogIFdpbjMyIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaCBjcm9zcyBwbGF0Zm9ybQotKiAgICAgICAgICAgICAgIGV2ZW50IGxpYnJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdXNob3J0ICAga2V5VXBNc2dbMjU2XSA9IHswfTsgICAgLyogVGFibGUgb2Yga2V5IHVwIG1lc3NhZ2VzICAgICAqLwotc3RhdGljIGludCAgICAgIHJhbmdlWCxyYW5nZVk7ICAgICAgICAgIC8qIFJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzICAgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVGhlc2UgYXJlIG5vdCB1c2VkIHVuZGVyIFdpbjMyICovCi0jZGVmaW5lIF9FVlRfZGlzYWJsZUludCgpICAgICAgIDEKLSNkZWZpbmUgX0VWVF9yZXN0b3JlSW50KGZsYWdzKSAgKHZvaWQpKGZsYWdzKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNjYW5Db2RlICAgIC0gU2NhbiBjb2RlIHRvIHRlc3QKLQotUkVNQVJLUzoKLVRoaXMgbWFjcm8gZGV0ZXJtaW5lcyBpZiBhIHNwZWNpZmllZCBrZXkgaXMgY3VycmVudGx5IGRvd24gYXQgdGhlCi10aW1lIHRoYXQgdGhlIGNhbGwgaXMgbWFkZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfaXNLZXlEb3duKHNjYW5Db2RlKSAgICAoa2V5VXBNc2dbc2NhbkNvZGVdICE9IDApCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNpbmNlIHN5c3RlbQotc3RhcnR1cCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIHZhbHVlIHRoYXQgaXMgcGxhY2VkIGludG8KLXRoZSB0aW1lIHN0YW1wIGZpZWxkcyBvZiBldmVudHMsIGFuZCBpcyB1c2VkIHRvIGltcGxlbWVudCBhdXRvIG1vdXNlIGRvd24KLWV2ZW50cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfRVZUX2dldFRpY2tzKHZvaWQpCi17IHJldHVybiB0aW1lR2V0VGltZSgpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUHVtcHMgYWxsIG1lc3NhZ2VzIGluIHRoZSBtZXNzYWdlIHF1ZXVlIGZyb20gV2luMzIgaW50byBvdXIgZXZlbnQgcXVldWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQotewotICAgIE1TRyAgICAgbXNnOwotICAgIE1TRyAgICAgY2hhck1zZzsKLSAgICBldmVudF90IGV2dDsKLQotICAgIC8qIFRPRE86IEFkZCBzdXBwb3J0IGZvciBEaXJlY3RJbnB1dCEgV2UgY2FuJ3Qgc3VwcG9ydCByZWxhdGl2ZSBtb3VzZSAqLwotICAgIC8qICAgICAgIG1vdmVtZW50IG1vdGlvbiBjb3VudGVycyB3aXRob3V0IERpcmVjdElucHV0IDstKC4gKi8KLSAgICB3aGlsZSAoUGVla01lc3NhZ2UoJm1zZyxOVUxMLDAsMCxQTV9SRU1PVkUpKSB7Ci0JbWVtc2V0KCZldnQsMCxzaXplb2YoZXZ0KSk7Ci0Jc3dpdGNoIChtc2cubWVzc2FnZSkgewotCSAgICBjYXNlIFdNX01PVVNFTU9WRToKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VNT1ZFOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9MQlVUVE9OREJMQ0xLOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV047Ci0JCWV2dC5tZXNzYWdlID0gRVZUX0xFRlRCTUFTSyB8IEVWVF9EQkxDTElDSzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fTEJVVFRPTkRPV046Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9MQlVUVE9OVVA6Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFVVA7Ci0JCWV2dC5tZXNzYWdlID0gRVZUX0xFRlRCTUFTSzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fUkJVVFRPTkRCTENMSzoKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOIHwgRVZUX0RCTENMSUNLOwotCQlldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9SQlVUVE9ORE9XTjoKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOwotCQlldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9SQlVUVE9OVVA6Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFVVA7Ci0JCWV2dC5tZXNzYWdlID0gRVZUX1JJR0hUQk1BU0s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX01CVVRUT05EQkxDTEs6Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTiB8IEVWVF9EQkxDTElDSzsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlRfTUlERExFQk1BU0s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX01CVVRUT05ET1dOOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV047Ci0JCWV2dC5tZXNzYWdlID0gRVZUX01JRERMRUJNQVNLOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9NQlVUVE9OVVA6Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFVVA7Ci0JCWV2dC5tZXNzYWdlID0gRVZUX01JRERMRUJNQVNLOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9LRVlET1dOOgotCSAgICBjYXNlIFdNX1NZU0tFWURPV046Ci0JCWlmIChISVdPUkQobXNnLmxQYXJhbSkgJiBLRl9SRVBFQVQpIHsKLQkJICAgIGV2dC53aGF0ID0gRVZUX0tFWVJFUEVBVDsKLQkJICAgIH0KLQkJZWxzZSB7Ci0JCSAgICBldnQud2hhdCA9IEVWVF9LRVlET1dOOwotCQkgICAgfQotCQlicmVhazsKLQkgICAgY2FzZSBXTV9LRVlVUDoKLQkgICAgY2FzZSBXTV9TWVNLRVlVUDoKLQkJZXZ0LndoYXQgPSBFVlRfS0VZVVA7Ci0JCWJyZWFrOwotCSAgICB9Ci0KLQkvKiBDb252ZXJ0IG1vdXNlIGV2ZW50IG1vZGlmaWVyIGZsYWdzICovCi0JaWYgKGV2dC53aGF0ICYgRVZUX01PVVNFRVZUKSB7Ci0JICAgIGlmIChfUE1fZGVza1gpIHsKLQkJZXZ0LndoZXJlX3ggPSAoKGxvbmcpbXNnLnB0LnggKiByYW5nZVgpIC8gX1BNX2Rlc2tYOwotCQlldnQud2hlcmVfeSA9ICgobG9uZyltc2cucHQueSAqIHJhbmdlWSkgLyBfUE1fZGVza1k7Ci0JCX0KLQkgICAgZWxzZSB7Ci0JCVNjcmVlblRvQ2xpZW50KF9QTV9od25kQ29uc29sZSwgJm1zZy5wdCk7Ci0JCWV2dC53aGVyZV94ID0gbXNnLnB0Lng7Ci0JCWV2dC53aGVyZV95ID0gbXNnLnB0Lnk7Ci0JCX0KLQkgICAgaWYgKGV2dC53aGF0ID09IEVWVF9NT1VTRU1PVkUpIHsKLQkJLyogU2F2ZSB0aGUgY3VycmVudCBtb3VzZSBwb3NpdGlvbiAqLwotCQlFVlQubXggPSBldnQud2hlcmVfeDsKLQkJRVZULm15ID0gZXZ0LndoZXJlX3k7Ci0JCWlmIChFVlQub2xkTW92ZSAhPSAtMSkgewotCQkgICAgRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3ggPSBldnQud2hlcmVfeDsvKiBNb2RpZnkgZXhpc3Rpbmcgb25lICAqLwotCQkgICAgRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3kgPSBldnQud2hlcmVfeTsKLS8qICAgICAgICAgICAgICAgICAgRVZULmV2dHFbRVZULm9sZE1vdmVdLnJlbGF0aXZlX3ggKz0gbWlja2V5WDsgICAgLyAvIFRPRE8hICovCi0vKiAgICAgICAgICAgICAgICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS5yZWxhdGl2ZV95ICs9IG1pY2tleVk7ICAgIC8gLyBUT0RPISAqLwotCQkgICAgZXZ0LndoYXQgPSAwOwotCQkgICAgfQotCQllbHNlIHsKLQkJICAgIEVWVC5vbGRNb3ZlID0gRVZULmZyZWVIZWFkOyAvKiBTYXZlIGlkIG9mIHRoaXMgbW92ZSBldmVudCAgICovCi0vKiAgICAgICAgICAgICAgICAgIGV2dC5yZWxhdGl2ZV94ID0gbWlja2V5WDsgICAgLyAvIFRPRE8hICovCi0vKiAgICAgICAgICAgICAgICAgIGV2dC5yZWxhdGl2ZV95ID0gbWlja2V5WTsgICAgLyAvIFRPRE8hICovCi0JCSAgICB9Ci0JCX0KLQkgICAgZWxzZQotCQlFVlQub2xkTW92ZSA9IC0xOwotCSAgICBpZiAobXNnLndQYXJhbSAmIE1LX0xCVVRUT04pCi0JCWV2dC5tb2RpZmllcnMgfD0gRVZUX0xFRlRCVVQ7Ci0JICAgIGlmIChtc2cud1BhcmFtICYgTUtfUkJVVFRPTikKLQkJZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRCVVQ7Ci0JICAgIGlmIChtc2cud1BhcmFtICYgTUtfTUJVVFRPTikKLQkJZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTUlERExFQlVUOwotCSAgICBpZiAobXNnLndQYXJhbSAmIE1LX1NISUZUKQotCQlldnQubW9kaWZpZXJzIHw9IEVWVF9TSElGVEtFWTsKLQkgICAgaWYgKG1zZy53UGFyYW0gJiBNS19DT05UUk9MKQotCQlldnQubW9kaWZpZXJzIHw9IEVWVF9DVFJMU1RBVEU7Ci0JICAgIH0KLQotCS8qIENvbnZlcnQga2V5Ym9hcmQgY29kZXMgKi8KLQlUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOwotCWlmIChldnQud2hhdCAmIEVWVF9LRVlFVlQpIHsKLQkgICAgaW50IHNjYW5Db2RlID0gKG1zZy5sUGFyYW0gPj4gMTYpICYgMHhGRjsKLQkgICAgaWYgKGV2dC53aGF0ID09IEVWVF9LRVlVUCkgewotCQkvKiBHZXQgbWVzc2FnZSBmb3Iga2V5dXAgY29kZSBmcm9tIHRhYmxlIG9mIGNhY2hlZCBkb3duIHZhbHVlcyAqLwotCQlldnQubWVzc2FnZSA9IGtleVVwTXNnW3NjYW5Db2RlXTsKLQkJa2V5VXBNc2dbc2NhbkNvZGVdID0gMDsKLQkJfQotCSAgICBlbHNlIHsKLQkJaWYgKFBlZWtNZXNzYWdlKCZjaGFyTXNnLE5VTEwsV01fQ0hBUixXTV9DSEFSLFBNX1JFTU9WRSkpCi0JCSAgICBldnQubWVzc2FnZSA9IGNoYXJNc2cud1BhcmFtOwotCQlpZiAoUGVla01lc3NhZ2UoJmNoYXJNc2csTlVMTCxXTV9TWVNDSEFSLFdNX1NZU0NIQVIsUE1fUkVNT1ZFKSkKLQkJICAgIGV2dC5tZXNzYWdlID0gY2hhck1zZy53UGFyYW07Ci0JCWV2dC5tZXNzYWdlIHw9ICgobXNnLmxQYXJhbSA+PiA4KSAmIDB4RkYwMCk7Ci0JCWtleVVwTXNnW3NjYW5Db2RlXSA9ICh1c2hvcnQpZXZ0Lm1lc3NhZ2U7Ci0JCX0KLQkgICAgaWYgKGV2dC53aGF0ID09IEVWVF9LRVlSRVBFQVQpCi0JCWV2dC5tZXNzYWdlIHw9IChtc2cubFBhcmFtIDw8IDE2KTsKLQkgICAgaWYgKEhJV09SRChtc2cubFBhcmFtKSAmIEtGX0FMVERPV04pCi0JCWV2dC5tb2RpZmllcnMgfD0gRVZUX0FMVFNUQVRFOwotCSAgICBpZiAoR2V0S2V5U3RhdGUoVktfU0hJRlQpICYgMHg4MDAwVSkKLQkJZXZ0Lm1vZGlmaWVycyB8PSBFVlRfU0hJRlRLRVk7Ci0JICAgIGlmIChHZXRLZXlTdGF0ZShWS19DT05UUk9MKSAmIDB4ODAwMFUpCi0JCWV2dC5tb2RpZmllcnMgfD0gRVZUX0NUUkxTVEFURTsKLQkgICAgRVZULm9sZE1vdmUgPSAtMTsKLQkgICAgfQotCi0JaWYgKGV2dC53aGF0ICE9IDApIHsKLQkgICAgLyogQWRkIHRpbWUgc3RhbXAgYW5kIGFkZCB0aGUgZXZlbnQgdG8gdGhlIHF1ZXVlICovCi0JICAgIGV2dC53aGVuID0gbXNnLnRpbWU7Ci0JICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQlhZGRFdmVudCgmZXZ0KTsKLQkgICAgfQotCURpc3BhdGNoTWVzc2FnZSgmbXNnKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBtYWNyby9mdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnRzIHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZQota2V5Ym9hcmQgdG8gb3VyIGV2ZW50IGxpYnJhcmllcyBub3JtYWxpc2VkIGZvcm1hdC4gV2Ugb25seSBoYXZlIG9uZSBzY2FuCi1jb2RlIGZvciB0aGUgJ0EnIGtleSwgYW5kIHVzZSBzaGlmdCBtb2RpZmllcnMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEKLUN0cmwtRjEsIEFsdC1GMSBldGMuIFRoZSByYXcgc2NhbiBjb2RlcyBmcm9tIHRoZSBrZXlib2FyZCB3b3JrIHRoaXMgd2F5LAotYnV0IHRoZSBPUyBnaXZlcyB1cyAnY29va2VkJyBzY2FuIGNvZGVzLCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSB0aGVtIGJhY2sKLXRvIHRoZSByYXcgZm9ybWF0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9tYXNrS2V5Q29kZShldnQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2FmZWx5IGFib3J0IHRoZSBldmVudCBtb2R1bGUgdXBvbiBjYXRjaGluZyBhIGZhdGFsIGVycm9yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9hYm9ydCgKLSAgICBpbnQgc2lnbmFsKQotewotICAgICh2b2lkKXNpZ25hbDsKLSAgICBFVlRfZXhpdCgpOwotICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCi0KLVJFTUFSS1M6Ci1Jbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCi10byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCi10aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCi0KLVdlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKLWV2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9pbml0KAotICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCi17Ci0gICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KLSAgICBFVlQubW91c2VNb3ZlID0gbW91c2VNb3ZlOwotICAgIGluaXRFdmVudFF1ZXVlKCk7Ci0gICAgbWVtc2V0KGtleVVwTXNnLDAsc2l6ZW9mKGtleVVwTXNnKSk7Ci0KLSAgICAvKiBDYXRjaCBwcm9ncmFtIHRlcm1pbmF0aW9uIHNpZ25hbHMgc28gd2UgY2FuIGNsZWFuIHVwIHByb3Blcmx5ICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIF9FVlRfYWJvcnQpOwotICAgIHNpZ25hbChTSUdGUEUsIF9FVlRfYWJvcnQpOwotICAgIHNpZ25hbChTSUdJTlQsIF9FVlRfYWJvcnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotQ2hhbmdlcyB0aGUgcmFuZ2Ugb2YgY29vcmRpbmF0ZXMgcmV0dXJuZWQgYnkgdGhlIG1vdXNlIGZ1bmN0aW9ucyB0byB0aGUKLXNwZWNpZmllZCByYW5nZSBvZiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB3aGVuIGNoYW5naW5nIGJldHdlZW4gZ3JhcGhpY3MKLW1vZGVzIHNldCB0aGUgcmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgZm9yIHRoZSBuZXcgZGlzcGxheSBtb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVJhbmdlKAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzKQotewotICAgIHJhbmdlWCA9IHhSZXM7Ci0gICAgcmFuZ2VZID0geVJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLU1vZGlmZXMgdGhlIG1vdXNlIGNvb3JkaW5hdGVzIGFzIG5lY2Vzc2FyeSBpZiBzY2FsaW5nIHRvIE9TIGNvb3JkaW5hdGVzLAotYW5kIHNldHMgdGhlIE9TIG1vdXNlIGN1cnNvciBwb3NpdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfc2V0TW91c2VQb3MoCi0gICAgaW50ICp4LAotICAgIGludCAqeSkKLXsKLSAgICAvKiBTY2FsZSBjb29yZGluYXRlcyB1cCB0byBkZXNrdG9wIGNvb3JkaW5hdGVzIGZpcnN0ICovCi0gICAgaW50IHNjYWxlZFggPSAoKnggKiBfUE1fZGVza1gpIC8gcmFuZ2VYOwotICAgIGludCBzY2FsZWRZID0gKCp5ICogX1BNX2Rlc2tZKSAvIHJhbmdlWTsKLQotICAgIC8qIFNjYWxlIGNvb3JkaW5hdGVzIGJhY2sgdG8gc2NyZWVuIGNvb3JkaW5hdGVzIGFnYWluICovCi0gICAgKnggPSAoc2NhbGVkWCAqIHJhbmdlWCkgLyBfUE1fZGVza1g7Ci0gICAgKnkgPSAoc2NhbGVkWSAqIHJhbmdlWSkgLyBfUE1fZGVza1k7Ci0gICAgU2V0Q3Vyc29yUG9zKHNjYWxlZFgsc2NhbGVkWSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KLWNhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAotYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3Jlc3VtZSh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIFdpbjMyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1TdXNwZW5kcyBhbGwgb2Ygb3VyIGV2ZW50IGhhbmRsaW5nIG9wZXJhdGlvbnMuIFRoaXMgaXMgYWxzbyB1c2VkIHRvCi1kZS1pbnN0YWxsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3N1c3BlbmQodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBXaW4zMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX2V4aXQodm9pZCkKLXsKLSAgICAvKiBSZXN0b3JlIHNpZ25hbCBoYW5kbGVycyAqLwotICAgIHNpZ25hbChTSUdBQlJULCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHRlBFLCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyB0aGUgbWFzayBpbmRpY2F0aW5nIHdoYXQgam95c3RpY2sgYXhlcyBhcmUgYXR0YWNoZWQuCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkZXRlY3QgdGhlIGF0dGFjaGVkIGpveXN0aWNrcywgYW5kIGRldGVybWluZQotd2hhdCBheGVzIGFyZSBwcmVzZW50IGFuZCBmdW5jdGlvbmluZy4gVGhpcyBmdW5jdGlvbiB3aWxsIHJlLWRldGVjdCBhbnkKLWF0dGFjaGVkIGpveXN0aWNrcyB3aGVuIGl0IGlzIGNhbGxlZCwgc28gaWYgdGhlIHVzZXIgZm9yZ290IHRvIGF0dGFjaAotdGhlIGpveXN0aWNrIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHN0YXJ0ZWQsIHlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvCi1yZS1kZXRlY3QgYW55IG5ld2x5IGF0dGFjaGVkIGpveXN0aWNrcy4KLQotU0VFIEFMU086Ci1FVlRfam95U2V0TG93ZXJSaWdodCwgRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBFVlRBUEkgRVZUX2pveUlzUHJlc2VudCh2b2lkKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCBqb3lzdGljayBjb2RlIGJhc2VkIG9uIERpcmVjdFghICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVBvbGxzIHRoZSBqb3lzdGljayBmb3IgcG9zaXRpb24gYW5kIGJ1dHRvbiBpbmZvcm1hdGlvbi4KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gcG9sbCBhbmFsb2d1ZSBqb3lzdGlja3MgZm9yIGJ1dHRvbiBhbmQgcG9zaXRpb24KLWluZm9ybWF0aW9uLiBJdCBzaG91bGQgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggbWFpbiBsb29wIG9mIHRoZSB1c2VyCi1hcHBsaWNhdGlvbiwganVzdCBiZWZvcmUgcHJvY2Vzc2luZyBhbGwgcGVuZGluZyBldmVudHMgdmlhIEVWVF9nZXROZXh0LgotQWxsIGluZm9ybWF0aW9uIHBvbGxlZCBmcm9tIHRoZSBqb3lzdGljayB3aWxsIGJlIHBvc3RlZCB0byB0aGUgZXZlbnQKLXF1ZXVlIGZvciBsYXRlciByZXRyaWV2YWwuCi0KLU5vdGU6ICAgTW9zdCBhbmFsb2d1ZSBqb3lzdGlja3Mgd2lsbCBwcm92aWRlIHJlYWRpbmdzIHRoYXQgY2hhbmdlIGV2ZW4KLQl0aG91Z2ggdGhlIGpveXN0aWNrIGhhcyBub3QgbW92ZWQuIEhlbmNlIGlmIHlvdSBjYWxsIHRoaXMgcm91dGluZQotCXlvdSB3aWxsIGxpa2VseSBnZXQgYW4gRVZUX0pPWU1PVkUgZXZlbnQgZXZlcnkgdGltZSB0aHJvdWdoIHlvdXIKLQlldmVudCBsb29wLgotCi1TRUUgQUxTTzoKLUVWVF9nZXROZXh0LCBFVlRfcGVla05leHQsIEVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LAotRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9wb2xsSm95c3RpY2sodm9pZCkKLXsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgdXBwZXIgbGVmdCBwb3NpdGlvbgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHplcm8gaW4gb24gYmV0dGVyIGpveXN0aWNrIGNhbGlicmF0aW9uIGZhY3RvcnMsCi13aGljaCBtYXkgd29yayBiZXR0ZXIgdGhhbiB0aGUgZGVmYXVsdCBzaW1wbGlzdGljIGNhbGlicmF0aW9uICh3aGljaCBhc3N1bWVzCi10aGUgam95c3RpY2sgaXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSBpcyBpbml0aWFsaXNlZCkuCi1UbyB1c2UgdGhpcyBmdW5jdGlvbiwgYXNrIHRoZSB1c2VyIHRvIGhvbGQgdGhlIHN0aWNrIGluIHRoZSB1cHBlciBsZWZ0Ci1wb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKLWZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQotY2FsaWJyYXRpb24gZmFjdG9ycy4KLQotVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCi1pbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKLXVwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKLXNhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgotCi1TRUUgQUxTTzoKLUVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95SXNQcmVzZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2pveVNldFVwcGVyTGVmdCh2b2lkKQotewotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1DYWxpYnJhdGVzIHRoZSBqb3lzdGljayBsb3dlciByaWdodCBwb3NpdGlvbgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHplcm8gaW4gb24gYmV0dGVyIGpveXN0aWNrIGNhbGlicmF0aW9uIGZhY3RvcnMsCi13aGljaCBtYXkgd29yayBiZXR0ZXIgdGhhbiB0aGUgZGVmYXVsdCBzaW1wbGlzdGljIGNhbGlicmF0aW9uICh3aGljaCBhc3N1bWVzCi10aGUgam95c3RpY2sgaXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSBpcyBpbml0aWFsaXNlZCkuCi1UbyB1c2UgdGhpcyBmdW5jdGlvbiwgYXNrIHRoZSB1c2VyIHRvIGhvbGQgdGhlIHN0aWNrIGluIHRoZSBsb3dlciByaWdodAotcG9zaXRpb24gYW5kIHRoZW4gaGF2ZSB0aGVtIHByZXNzIGEga2V5IG9yIGJ1dHRvbi4gYW5kIHRoZW4gY2FsbCB0aGlzCi1mdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB3aWxsIHRoZW4gcmVhZCB0aGUgam95c3RpY2sgYW5kIHVwZGF0ZSB0aGUKLWNhbGlicmF0aW9uIGZhY3RvcnMuCi0KLVVzdWFsbHksIGFzc3VtaW5nIHRoYXQgdGhlIHN0aWNrIHdhcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IHdhcwotaW5pdGlhbGl6ZWQsIHlvdSByZWFsbHkgb25seSBuZWVkIHRvIGNhbGwgRVZUX2pveVNldExvd2VyUmlnaHQgc2luY2UgdGhlCi11cHBlciBsZWZ0IHBvc2l0aW9uIGlzIHVzdWFsbHkgYWx3YXlzIDAsMCBvbiBtb3N0IGpveXN0aWNrcy4gSG93ZXZlciwgdGhlCi1zYWZlc3QgcHJvY2VkdXJlIGlzIHRvIGNhbGwgYWxsIHRocmVlIGNhbGlicmF0aW9uIGZ1bmN0aW9ucy4KLQotU0VFIEFMU086Ci1FVlRfam95U2V0VXBwZXJMZWZ0LCBFVlRfam95U2V0Q2VudGVyLCBFVlRfam95SXNQcmVzZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2pveVNldExvd2VyUmlnaHQodm9pZCkKLXsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgY2VudGVyIHBvc2l0aW9uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gemVybyBpbiBvbiBiZXR0ZXIgam95c3RpY2sgY2FsaWJyYXRpb24gZmFjdG9ycywKLXdoaWNoIG1heSB3b3JrIGJldHRlciB0aGFuIHRoZSBkZWZhdWx0IHNpbXBsaXN0aWMgY2FsaWJyYXRpb24gKHdoaWNoIGFzc3VtZXMKLXRoZSBqb3lzdGljayBpcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IGlzIGluaXRpYWxpc2VkKS4KLVRvIHVzZSB0aGlzIGZ1bmN0aW9uLCBhc2sgdGhlIHVzZXIgdG8gaG9sZCB0aGUgc3RpY2sgaW4gdGhlIGNlbnRlcgotcG9zaXRpb24gYW5kIHRoZW4gaGF2ZSB0aGVtIHByZXNzIGEga2V5IG9yIGJ1dHRvbi4gYW5kIHRoZW4gY2FsbCB0aGlzCi1mdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB3aWxsIHRoZW4gcmVhZCB0aGUgam95c3RpY2sgYW5kIHVwZGF0ZSB0aGUKLWNhbGlicmF0aW9uIGZhY3RvcnMuCi0KLVVzdWFsbHksIGFzc3VtaW5nIHRoYXQgdGhlIHN0aWNrIHdhcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IHdhcwotaW5pdGlhbGl6ZWQsIHlvdSByZWFsbHkgb25seSBuZWVkIHRvIGNhbGwgRVZUX2pveVNldExvd2VyUmlnaHQgc2luY2UgdGhlCi11cHBlciBsZWZ0IHBvc2l0aW9uIGlzIHVzdWFsbHkgYWx3YXlzIDAsMCBvbiBtb3N0IGpveXN0aWNrcy4gSG93ZXZlciwgdGhlCi1zYWZlc3QgcHJvY2VkdXJlIGlzIHRvIGNhbGwgYWxsIHRocmVlIGNhbGlicmF0aW9uIGZ1bmN0aW9ucy4KLQotU0VFIEFMU086Ci1FVlRfam95U2V0VXBwZXJMZWZ0LCBFVlRfam95U2V0TG93ZXJSaWdodCwgRVZUX2pveVNldENlbnRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9qb3lTZXRDZW50ZXIodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL250c2VydmMuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL250c2VydmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkOWFhMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9udHNlcnZjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgU2NpVGVjaCBEaXNwbGF5IERvY3RvcgotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0yMDAxIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgaXMgYSBwcm9wcmlldGFyeSB0cmFkZSBzZWNyZXQgb2YgICAgIHwKLSogIHxTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgQ2hpY28sIENBIDk1OTI4IHwKLSogIHxVU0EgKHd3dy5zY2l0ZWNoc29mdC5jb20pLiAgQU5ZIFVOQVVUSE9SSVpFRCBQT1NTRVNTSU9OLCBVU0UsICAgICAgIHwKLSogIHxWSUVXSU5HLCBDT1BZSU5HLCBNT0RJRklDQVRJT04gT1IgRElTU0VNSU5BVElPTiBPRiBUSElTIENPREUgSVMgICAgIHwKLSogIHxTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBVy4gIFVubGVzcyB5b3UgaGF2ZSBjdXJyZW50LCBleHByZXNzICAgICAgIHwKLSogIHx3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBTY2lUZWNoIHRvIHBvc3Nlc3Mgb3IgdXNlIHRoaXMgY29kZSwgeW91IHwKLSogIHxtYXkgYmUgc3ViamVjdCB0byBjaXZpbCBhbmQvb3IgY3JpbWluYWwgcGVuYWx0aWVzLiAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxJZiB5b3UgcmVjZWl2ZWQgdGhpcyBjb2RlIGluIGVycm9yIG9yIHlvdSB3b3VsZCBsaWtlIHRvIHJlcG9ydCAgICAgIHwKLSogIHxpbXByb3BlciB1c2UsIHBsZWFzZSBpbW1lZGlhdGVseSBjb250YWN0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4gYXQgIHwKLSogIHw1MzAtODk0LTg0MDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW5kb3dzIE5ULCBXaW5kb3dzIDJLIG9yIFdpbmRvd3MgWFAuCi0qCi0qIERlc2NyaXB0aW9uOiAgTWFpbiBtb2R1bGUgdG8gZG8gdGhlIGluc3RhbGxhdGlvbiBvZiB0aGUgU0REIGFuZCBHTERpcmVjdAotKiAgICAgICAgICAgICAgIGRldmljZSBkcml2ZXIgY29tcG9uZW50cyB1bmRlciBXaW5kb3dzIE5ULzJLL1hQLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAid2luMzIvb3NoZHIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zekRyaXZlck5hbWUgICAgLSBBY3R1YWwgbmFtZSBvZiB0aGUgZHJpdmVyIHRvIGluc3RhbGwgaW4gdGhlIHN5c3RlbQotc3pTZXJ2aWNlTmFtZSAgIC0gTmFtZSBvZiB0aGUgc2VydmljZSB0byBjcmVhdGUKLXN6TG9hZEdyb3VwICAgICAtIExvYWQgZ3JvdXAgZm9yIHRoZSBkcml2ZXIgKE5VTEwgZm9yIG5vcm1hbCBkcml2ZXJzKQotZHdTZXJ2aWNlVHlwZSAgIC0gU2VydmljZSB0eXBlIHRvIGNyZWF0ZQotCi1SRVRVUk5TOgotVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBkb2VzIGFsbCB0aGUgd29yayB0byBpbnN0YWxsIHRoZSBkcml2ZXIgaW50byB0aGUgc3lzdGVtLgotVGhlIGRyaXZlciBpcyBub3QgaG93ZXZlciBhY3RpdmF0ZWQ7IGZvciB0aGF0IHlvdSBtdXN0IHVzZSB0aGUgU3RhcnRfU2RkRmlsdAotZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgUE1BUEkgUE1faW5zdGFsbFNlcnZpY2UoCi0gICAgY29uc3QgY2hhciAqc3pEcml2ZXJOYW1lLAotICAgIGNvbnN0IGNoYXIgKnN6U2VydmljZU5hbWUsCi0gICAgY29uc3QgY2hhciAqc3pMb2FkR3JvdXAsCi0gICAgdWxvbmcgZHdTZXJ2aWNlVHlwZSkKLXsKLSAgICBTQ19IQU5ETEUgICBzY21IYW5kbGU7Ci0gICAgU0NfSEFORExFICAgZHJpdmVySGFuZGxlOwotICAgIGNoYXIgICAgICAgIHN6RHJpdmVyUGF0aFtNQVhfUEFUSF07Ci0gICAgSEtFWSAgICAgICAga2V5OwotICAgIGNoYXIgICAgICAgIGtleVBhdGhbTUFYX1BBVEhdOwotICAgIHVsb25nICAgICAgIHN0YXR1czsKLQotICAgIC8qIE9idGFpbiBhIGhhbmRsZSB0byB0aGUgc2VydmljZSBjb250cm9sIG1hbmFnZXIgcmVxdWVzdGluZyBhbGwgYWNjZXNzICovCi0gICAgaWYgKChzY21IYW5kbGUgPSBPcGVuU0NNYW5hZ2VyKE5VTEwsIE5VTEwsIFNDX01BTkFHRVJfQUxMX0FDQ0VTUykpID09IE5VTEwpCi0JcmV0dXJuIEdldExhc3RFcnJvcigpOwotCi0gICAgLyogRmluZCB0aGUgcGF0aCB0byB0aGUgZHJpdmVyIGluIHN5c3RlbSBkaXJlY3RvcnkgKi8KLSAgICBHZXRTeXN0ZW1EaXJlY3Rvcnkoc3pEcml2ZXJQYXRoLCBzaXplb2Yoc3pEcml2ZXJQYXRoKSk7Ci0gICAgc3RyY2F0KHN6RHJpdmVyUGF0aCwgIlxcZHJpdmVyc1xcIik7Ci0gICAgc3RyY2F0KHN6RHJpdmVyUGF0aCwgc3pEcml2ZXJOYW1lKTsKLQotICAgIC8qIENyZWF0ZSB0aGUgc2VydmljZSB3aXRoIHRoZSBTZXJ2aWNlIENvbnRyb2wgTWFuYWdlci4gKi8KLSAgICBkcml2ZXJIYW5kbGUgPSBDcmVhdGVTZXJ2aWNlKHNjbUhhbmRsZSwKLQkJCQkgc3pTZXJ2aWNlTmFtZSwKLQkJCQkgc3pTZXJ2aWNlTmFtZSwKLQkJCQkgU0VSVklDRV9BTExfQUNDRVNTLAotCQkJCSBkd1NlcnZpY2VUeXBlLAotCQkJCSBTRVJWSUNFX0JPT1RfU1RBUlQsCi0JCQkJIFNFUlZJQ0VfRVJST1JfTk9STUFMLAotCQkJCSBzekRyaXZlclBhdGgsCi0JCQkJIHN6TG9hZEdyb3VwLAotCQkJCSBOVUxMLAotCQkJCSBOVUxMLAotCQkJCSBOVUxMLAotCQkJCSBOVUxMKTsKLQotICAgIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgZHJpdmVyIGNvdWxkIGFjdHVhbGx5IGJlIGluc3RhbGxlZC4gKi8KLSAgICBpZiAoIWRyaXZlckhhbmRsZSkgewotCXN0YXR1cyA9IEdldExhc3RFcnJvcigpOwotCUNsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOwotCXJldHVybiBzdGF0dXM7Ci0JfQotCi0gICAgLyogR2V0IGEgaGFuZGxlIHRvIHRoZSBrZXkgZm9yIGRyaXZlciBzbyB0aGF0IGl0IGNhbiBiZSBhbHRlcmVkIGluIHRoZSAqLwotICAgIC8qIG5leHQgc3RlcC4gKi8KLSAgICBzdHJjcHkoa2V5UGF0aCwgIlNZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFwiKTsKLSAgICBzdHJjYXQoa2V5UGF0aCwgc3pTZXJ2aWNlTmFtZSk7Ci0gICAgaWYgKChzdGF0dXMgPSBSZWdPcGVuS2V5RXgoSEtFWV9MT0NBTF9NQUNISU5FLGtleVBhdGgsMCxLRVlfQUxMX0FDQ0VTUywma2V5KSkgIT0gRVJST1JfU1VDQ0VTUykgewotCS8qIEEgcHJvYmxlbSBoYXMgb2NjdXJlZC4gRGVsZXRlIHRoZSBzZXJ2aWNlIHNvIHRoYXQgaXQgaXMgbm90IGluc3RhbGxlZC4gKi8KLQlzdGF0dXMgPSBHZXRMYXN0RXJyb3IoKTsKLQlEZWxldGVTZXJ2aWNlKGRyaXZlckhhbmRsZSk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7Ci0JcmV0dXJuIHN0YXR1czsKLQl9Ci0KLSAgICAvKiBEZWxldGUgdGhlIEltYWdlUGF0aCB2YWx1ZSBpbiB0aGUgbmV3bHkgY3JlYXRlZCBrZXkgc28gdGhhdCB0aGUgKi8KLSAgICAvKiBzeXN0ZW0gbG9va3MgZm9yIHRoZSBkcml2ZXIgaW4gdGhlIG5vcm1hbCBsb2NhdGlvbi4gKi8KLSAgICBpZiAoKHN0YXR1cyA9IFJlZ0RlbGV0ZVZhbHVlKGtleSwgIkltYWdlUGF0aCIpKSAhPSBFUlJPUl9TVUNDRVNTKSB7Ci0JLyogQSBwcm9ibGVtIGhhcyBvY2N1cnJlZC4gRGVsZXRlIHRoZSBzZXJ2aWNlIHNvIHRoYXQgaXQgaXMgbm90ICovCi0JLyogaW5zdGFsbGVkIGFuZCB3aWxsIG5vdCB0cnkgdG8gc3RhcnQuICovCi0JUmVnQ2xvc2VLZXkoa2V5KTsKLQlEZWxldGVTZXJ2aWNlKGRyaXZlckhhbmRsZSk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7Ci0JcmV0dXJuIHN0YXR1czsKLQl9Ci0KLSAgICAvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLwotICAgIFJlZ0Nsb3NlS2V5KGtleSk7Ci0gICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7Ci0gICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7Ci0gICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc3pTZXJ2aWNlTmFtZSAgIC0gTmFtZSBvZiB0aGUgc2VydmljZSB0byBzdGFydAotCi1SRVRVUk5TOgotVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IHRoZSBzcGVjaWZpZWQgc2VydmljZSBhbmQgbWFrZSBpdCBhY3RpdmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgUE1BUEkgUE1fc3RhcnRTZXJ2aWNlKAotICAgIGNvbnN0IGNoYXIgKnN6U2VydmljZU5hbWUpCi17Ci0gICAgU0NfSEFORExFICAgICAgIHNjbUhhbmRsZTsKLSAgICBTQ19IQU5ETEUgICAgICAgZHJpdmVySGFuZGxlOwotICAgIFNFUlZJQ0VfU1RBVFVTCXNlcnZpY2VTdGF0dXM7Ci0gICAgdWxvbmcgICAgICAgICAgIHN0YXR1czsKLQotICAgIC8qIE9idGFpbiBhIGhhbmRsZSB0byB0aGUgc2VydmljZSBjb250cm9sIG1hbmFnZXIgcmVxdWVzdGluZyBhbGwgYWNjZXNzICovCi0gICAgaWYgKChzY21IYW5kbGUgPSBPcGVuU0NNYW5hZ2VyKE5VTEwsIE5VTEwsIFNDX01BTkFHRVJfQUxMX0FDQ0VTUykpID09IE5VTEwpCi0JcmV0dXJuIEdldExhc3RFcnJvcigpOwotCi0gICAgLyogT3BlbiB0aGUgc2VydmljZSB3aXRoIHRoZSBTZXJ2aWNlIENvbnRyb2wgTWFuYWdlci4gKi8KLSAgICBpZiAoKGRyaXZlckhhbmRsZSA9IE9wZW5TZXJ2aWNlKHNjbUhhbmRsZSxzelNlcnZpY2VOYW1lLFNFUlZJQ0VfQUxMX0FDQ0VTUykpID09IE5VTEwpIHsKLQlzdGF0dXMgPSBHZXRMYXN0RXJyb3IoKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKLQlyZXR1cm4gc3RhdHVzOwotCX0KLQotICAgIC8qIFN0YXJ0IHRoZSBzZXJ2aWNlICovCi0gICAgaWYgKCFTdGFydFNlcnZpY2UoZHJpdmVySGFuZGxlLDAsTlVMTCkpIHsKLQlzdGF0dXMgPSBHZXRMYXN0RXJyb3IoKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoZHJpdmVySGFuZGxlKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKLQlyZXR1cm4gc3RhdHVzOwotCX0KLQotICAgIC8qIFF1ZXJ5IHRoZSBzZXJ2aWNlIHRvIG1ha2Ugc3VyZSBpdCBpcyB0aGVyZSAqLwotICAgIGlmICghUXVlcnlTZXJ2aWNlU3RhdHVzKGRyaXZlckhhbmRsZSwmc2VydmljZVN0YXR1cykpIHsKLQlzdGF0dXMgPSBHZXRMYXN0RXJyb3IoKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoZHJpdmVySGFuZGxlKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKLQlyZXR1cm4gc3RhdHVzOwotCX0KLSAgICBDbG9zZVNlcnZpY2VIYW5kbGUoZHJpdmVySGFuZGxlKTsKLSAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKLSAgICByZXR1cm4gRVJST1JfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zelNlcnZpY2VOYW1lICAgLSBOYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIHN0b3AKLQotUkVUVVJOUzoKLVRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdG9wIHRoZSBzcGVjaWZpZWQgc2VydmljZSBhbmQgZGlzYWJsZSBpdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBQTUFQSSBQTV9zdG9wU2VydmljZSgKLSAgICBjb25zdCBjaGFyICpzelNlcnZpY2VOYW1lKQotewotICAgIFNDX0hBTkRMRSAgICAgICBzY21IYW5kbGU7Ci0gICAgU0NfSEFORExFICAgICAgIGRyaXZlckhhbmRsZTsKLSAgICBTRVJWSUNFX1NUQVRVUwlzZXJ2aWNlU3RhdHVzOwotICAgIHVsb25nICAgICAgICAgICBzdGF0dXM7Ci0KLSAgICAvKiBPYnRhaW4gYSBoYW5kbGUgdG8gdGhlIHNlcnZpY2UgY29udHJvbCBtYW5hZ2VyIHJlcXVlc3RpbmcgYWxsIGFjY2VzcyAqLwotICAgIGlmICgoc2NtSGFuZGxlID0gT3BlblNDTWFuYWdlcihOVUxMLCBOVUxMLCBTQ19NQU5BR0VSX0FMTF9BQ0NFU1MpKSA9PSBOVUxMKQotCXJldHVybiBHZXRMYXN0RXJyb3IoKTsKLQotICAgIC8qIE9wZW4gdGhlIHNlcnZpY2Ugd2l0aCB0aGUgU2VydmljZSBDb250cm9sIE1hbmFnZXIuICovCi0gICAgaWYgKChkcml2ZXJIYW5kbGUgPSBPcGVuU2VydmljZShzY21IYW5kbGUsc3pTZXJ2aWNlTmFtZSxTRVJWSUNFX0FMTF9BQ0NFU1MpKSA9PSBOVUxMKSB7Ci0Jc3RhdHVzID0gR2V0TGFzdEVycm9yKCk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7Ci0JcmV0dXJuIHN0YXR1czsKLQl9Ci0KLSAgICAvKiBTdG9wIHRoZSBzZXJ2aWNlIGZyb20gcnVubmluZyAqLwotICAgIGlmICghQ29udHJvbFNlcnZpY2UoZHJpdmVySGFuZGxlLCBTRVJWSUNFX0NPTlRST0xfU1RPUCwgJnNlcnZpY2VTdGF0dXMpKSB7Ci0Jc3RhdHVzID0gR2V0TGFzdEVycm9yKCk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7Ci0JcmV0dXJuIHN0YXR1czsKLQl9Ci0gICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7Ci0gICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7Ci0gICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc3pTZXJ2aWNlTmFtZSAgIC0gTmFtZSBvZiB0aGUgc2VydmljZSB0byByZW1vdmUKLQotUkVUVVJOUzoKLVRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZW1vdmUgYSBzZXJ2aWNlIGNvbXBsZXRlbHkgZnJvbSB0aGUgc3lzdGVtLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFBNQVBJIFBNX3JlbW92ZVNlcnZpY2UoCi0gICAgY29uc3QgY2hhciAqc3pTZXJ2aWNlTmFtZSkKLXsKLSAgICBTQ19IQU5ETEUgICBzY21IYW5kbGU7Ci0gICAgU0NfSEFORExFICAgZHJpdmVySGFuZGxlOwotICAgIHVsb25nICAgICAgIHN0YXR1czsKLQotICAgIC8qIE9idGFpbiBhIGhhbmRsZSB0byB0aGUgc2VydmljZSBjb250cm9sIG1hbmFnZXIgcmVxdWVzdGluZyBhbGwgYWNjZXNzICovCi0gICAgaWYgKChzY21IYW5kbGUgPSBPcGVuU0NNYW5hZ2VyKE5VTEwsIE5VTEwsIFNDX01BTkFHRVJfQUxMX0FDQ0VTUykpID09IE5VTEwpCi0JcmV0dXJuIEdldExhc3RFcnJvcigpOwotCi0gICAgLyogT3BlbiB0aGUgc2VydmljZSB3aXRoIHRoZSBTZXJ2aWNlIENvbnRyb2wgTWFuYWdlci4gKi8KLSAgICBpZiAoKGRyaXZlckhhbmRsZSA9IE9wZW5TZXJ2aWNlKHNjbUhhbmRsZSxzelNlcnZpY2VOYW1lLFNFUlZJQ0VfQUxMX0FDQ0VTUykpID09IE5VTEwpIHsKLQlzdGF0dXMgPSBHZXRMYXN0RXJyb3IoKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKLQlyZXR1cm4gc3RhdHVzOwotCX0KLQotICAgIC8qIFJlbW92ZSB0aGUgc2VydmljZSAqLwotICAgIGlmICghRGVsZXRlU2VydmljZShkcml2ZXJIYW5kbGUpKSB7Ci0Jc3RhdHVzID0gR2V0TGFzdEVycm9yKCk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7Ci0JcmV0dXJuIHN0YXR1czsKLQl9Ci0gICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7Ci0gICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7Ci0gICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM1OWU5MC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9vc2hkci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgV2luMzIKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jZGVmaW5lIFNUUklDVAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxtbXN5c3RlbS5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci0jZGVmaW5lIE5PTkFNRUxFU1NVTklPTgotI2luY2x1ZGUgInBtL2RkcmF3LmgiCi0KLS8qIE1hY3JvcyB0byBzYXZlIGFuZCByZXN0b3JlIHRoZSBkZWZhdWx0IGNvbnRyb2wgd29yZC4gV2luZG93cyA5eCBoYXMKLSAqIHNvbWUgYnVncyBpbiBpdCBzdWNoIHRoYXQgY2FsbHMgdG8gbG9hZCBhbnkgRExMJ3Mgd2hpY2ggbG9hZCAxNi1iaXQKLSAqIERMTCdzIGNhdXNlIHRoZSBmbG9hdGluZyBwb2ludCBjb250cm9sIHdvcmQgdG8gZ2V0IHRyYXNoZWQuIFdlIGZpeAotICogdGhpcyBieSBzYXZpbmcgYW5kIHJlc3RvcmluZyB0aGUgY29udHJvbCB3b3JkIGFjcm9zcyBwcm9ibGVtYXRpYwotICogY2FsbHMuCi0gKi8KLQotI2lmIGRlZmluZWQoX19JTlRFTF9fKQotI2RlZmluZSBHRVRfREVGQVVMVF9DVygpICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoX1BNX2N3X2RlZmF1bHQgPT0gMCkgICAgICAgICAgICAgICAgXAotCV9QTV9jd19kZWZhdWx0ID0gX2NvbnRyb2w4NygwLDApOyAgIFwKLX0KLSNkZWZpbmUgUkVTRVRfREVGQVVMVF9DVygpICAgICAgICAgICAgICAgICAgXAotICAgIF9jb250cm9sODcoX1BNX2N3X2RlZmF1bHQsMHhGRkZGRkZGRikKLSNlbHNlCi0jZGVmaW5lIEdFVF9ERUZBVUxUX0NXKCkKLSNkZWZpbmUgUkVTRVRfREVGQVVMVF9DVygpCi0jZW5kaWYKLQotLyogQ3VzdG9tIHdpbmRvdyBtZXNzYWdlcyAqLwotCi0jZGVmaW5lCVdNX0RPX1NVU1BFTkRfQVBQCQkJV01fVVNFUgotI2RlZmluZQlXTV9QTV9MRUFWRV9GVUxMU0NSRUVOCSAgICAwCi0jZGVmaW5lCVdNX1BNX1JFU1RPUkVfRlVMTFNDUkVFTgkxCi0KLS8qIE1hY3JvIGZvciBkaXNhYmxpbmcgQXV0b1BsYXkgb24gYSB1c2Ugc3lzdGVtICovCi0KLSNkZWZpbmUgQVVUT1BMQVlfRFJJVkVfQ0RST00gICAgMHgyMAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fSU5URUxfXwotZXh0ZXJuIHVpbnQgICAgIF9QTV9jd19kZWZhdWx0OyAgICAgICAgIC8qIERlZmF1bHQgRlBVIGNvbnRyb2wgd29yZCAgICAgKi8KLSNlbmRpZgotZXh0ZXJuIGludCAgICAgIF9QTV9kZXNrWCxfUE1fZGVza1k7ICAgIC8qIERlc2t0b3AgZGltZW5zaW9ucyAgICAgICAgICAgKi8KLWV4dGVybiBIV05EICAgICBfUE1faHduZENvbnNvbGU7ICAgICAgICAvKiBXaW5kb3cgaGFuZGxlIGZvciBjb25zb2xlICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW50ZXJuYWwgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgX0VWVF9wdW1wTWVzc2FnZXModm9pZCk7CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvcG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmZGJjYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9wbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW4zMgotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAotKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQotKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKLSogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAotKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jZGVmaW5lIFNUUklDVAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxtbXN5c3RlbS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZGlyZWN0Lmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlICJwbV9oZWxwLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWlib29sICAgICAgICAgICBfUE1faGF2ZVdpbk5UOyAgICAgIC8qIFRydWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24gTlQgICAgICovCi1zdGF0aWMgdWludCAgICAgVkVTQUJ1Zl9sZW4gPSAxMDI0OyAvKiBMZW5ndGggb2YgdGhlIFZFU0FCdWYgYnVmZmVyICAgICAqLwotc3RhdGljIHZvaWQgICAgICpWRVNBQnVmX3B0ciA9IE5VTEw7LyogTmVhciBwb2ludGVyIHRvIFZFU0FCdWYgICAgICAgICAgKi8KLXN0YXRpYyB1aW50ICAgICBWRVNBQnVmX3JzZWc7ICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IG9mIFZFU0FCdWYgICAgICovCi1zdGF0aWMgdWludCAgICAgVkVTQUJ1Zl9yb2ZmOyAgICAgICAvKiBSZWFsIG1vZGUgb2Zmc2V0IG9mIFZFU0FCdWYgICAgICAqLwotSEFORExFICAgICAgICAgIF9QTV9oRGV2aWNlID0gTlVMTDsgLyogSGFuZGxlIHRvIFdpbjMyIFZ4RCAgICAgICAgICAgICAgKi8KLXN0YXRpYyBpYm9vbCAgICBpbml0ZWQgPSBmYWxzZTsgICAgIC8qIEZsYWdzIGlmIHdlIGFyZSBpbml0aWFsaXNlZCAgICAgICovCi1zdGF0aWMgdm9pZCAgICAgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOwotCi1zdGF0aWMgY2hhciAqc3pNYWNoaW5lTmFtZUtleSAgID0gIlN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXENvbXB1dGVyTmFtZVxcQ29tcHV0ZXJOYW1lIjsKLXN0YXRpYyBjaGFyICpzek1hY2hpbmVOYW1lS2V5TlQgPSAiU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcQ29tcHV0ZXJOYW1lXFxBY3RpdmVDb21wdXRlck5hbWUiOwotc3RhdGljIGNoYXIgKnN6TWFjaGluZU5hbWUgICAgICA9ICJDb21wdXRlck5hbWUiOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBNYWNybyB0byBjaGVjayBmb3IgYSB2YWxpZCwgbG9hZGVkIHZlcnNpb24gb2YgUE1IRUxQLiBXZSBjaGVjayB0aGlzCi0gKiBvbiBkZW1hbmQgd2hlbiB3ZSBuZWVkIHRoZXNlIHNlcnZpY2VzIHJhdGhlciB0aGFuIHdoZW4gUE1faW5pdCgpIGlzCi0gKiBjYWxsZWQgYmVjYXVzZSBpZiB3ZSBhcmUgcnVubmluZyBvbiBEaXJlY3REcmF3IHdlIGRvbid0IG5lZWQgUE1IRUxQLlZYRC4KLSAqLwotCi0jZGVmaW5lIENIRUNLX0ZPUl9QTUhFTFAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoX1BNX2hEZXZpY2UgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKF9QTV9oYXZlV2luTlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIFBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBjb25uZWN0IHRvIFBNSEVMUC5TWVMgb3IgU0RESEVMUC5TWVMhIik7IFwKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gY29ubmVjdCB0byBQTUhFTFAuVlhEIG9yIFNEREhFTFAuVlhEISIpOyBcCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgUE0gbGlicmFyeSBhbmQgY29ubmVjdCB0byBvdXIgaGVscGVyIGRldmljZSBkcml2ZXIuIElmIHdlCi1jYW5ub3QgY29ubmVjdCB0byBvdXIgaGVscGVyIGRldmljZSBkcml2ZXIsIHdlIGJhaWwgb3V0IHdpdGggYW4gZXJyb3IKLW1lc3NhZ2UuIE91ciBXaW5kb3dzIDl4IFZ4RCBpcyBkeW5hbWljYWxseSBsb2FkYWJsZSwgc28gaXQgY2FuIGJlIGxvYWRlZAotYWZ0ZXIgdGhlIHN5c3RlbSBoYXMgc3RhcnRlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKLXsKLSAgICBEV09SRCAgIGluQnVmWzFdOyAgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLSAgICBjaGFyICAgIGNudFBhdGhbUE1fTUFYX1BBVEhdOwotICAgIGNoYXIgICAgKmVudjsKLQotICAgIC8qIENyZWF0ZSBhIGZpbGUgaGFuZGxlIGZvciB0aGUgc3RhdGljIFZ4RCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlCi0gICAgICogZHluYW1pY2FsbHkgbG9hZCB0aGUgUE1IRUxQIGhlbHBlciBWeEQuIE5vdGUgdGhhdCBpZiBhbiBvbGQgdmVyc2lvbgotICAgICAqIG9mIFNERCBpcyBsb2FkZWQsIHdlIHVzZSB0aGUgUE1IRUxQIFZ4RCBpbnN0ZWFkLgotICAgICAqLwotICAgIGlmICghaW5pdGVkKSB7Ci0JLyogRGV0ZXJtaW5lIGlmIHdlIGFyZSBydW5uaW5nIHVuZGVyIFdpbmRvd3MgTlQgb3Igbm90IGFuZAotCSAqIHNldCB0aGUgZ2xvYmFsIE9TIHR5cGUgdmFyaWFibGUuCi0JICovCi0JX1BNX2hhdmVXaW5OVCA9IGZhbHNlOwotCWlmICgoR2V0VmVyc2lvbigpICYgMHg4MDAwMDAwMFVMKSA9PSAwKQotCSAgICBfUE1faGF2ZVdpbk5UID0gdHJ1ZTsKLQlfX19kcnZfb3NfdHlwZSA9IChfUE1faGF2ZVdpbk5UKSA/IF9PU19XSU5OVCA6IF9PU19XSU45NTsKLQotCS8qIE5vdyB0cnkgdG8gY29ubmVjdCB0byBTRERIRUxQLlZYRCBvciBTRERIRUxQLlNZUyAqLwotCV9QTV9oRGV2aWNlID0gQ3JlYXRlRmlsZShTRERIRUxQX01PRFVMRV9QQVRILCAwLDAsMCwgQ1JFQVRFX05FVywgRklMRV9GTEFHX0RFTEVURV9PTl9DTE9TRSwgMCk7Ci0JaWYgKF9QTV9oRGV2aWNlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JICAgIGlmICghRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0VUVkVSMzIsIE5VTEwsIDAsCi0JCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpIHx8IG91dEJ1ZlswXSA8IFBNSEVMUF9WRVJTSU9OKSB7Ci0JCS8qIE9sZCB2ZXJzaW9uIG9mIFNEREhFTFAgbG9hZGVkLCBzbyB1c2UgUE1IRUxQIGluc3RlYWQgKi8KLQkJQ2xvc2VIYW5kbGUoX1BNX2hEZXZpY2UpOwotCQlfUE1faERldmljZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotCQl9Ci0JICAgIH0KLQlpZiAoX1BNX2hEZXZpY2UgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkgICAgLyogRmlyc3QgdHJ5IHRvIHNlZSBpZiB0aGVyZSBpcyBhIGN1cnJlbnRseSBsb2FkZWQgUE1IRUxQIGRyaXZlci4KLQkgICAgICogVGhpcyBpcyB1c3VhbGx5IHRoZSBjYXNlIHdoZW4gd2UgYXJlIHJ1bm5pbmcgdW5kZXIgV2luZG93cyBOVC8ySy4KLQkgICAgICovCi0JICAgIF9QTV9oRGV2aWNlID0gQ3JlYXRlRmlsZShQTUhFTFBfTU9EVUxFX1BBVEgsIDAsMCwwLCBDUkVBVEVfTkVXLCBGSUxFX0ZMQUdfREVMRVRFX09OX0NMT1NFLCAwKTsKLQkgICAgaWYgKF9QTV9oRGV2aWNlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JCS8qIFRoZSBkcml2ZXIgd2FzIG5vdCBzdGF0aWNseSBsb2FkZWQsIHNvIHRyeSBjcmVhdGluZyBhIGZpbGUgaGFuZGxlCi0JCSAqIHRvIGEgZHluYW1pYyB2ZXJzaW9uIG9mIHRoZSBWeEQgaWYgcG9zc2libGUuIE5vdGUgdGhhdCBvbiBXaW5OVC8ySyB3ZQotCQkgKiBjYW5ub3Qgc3VwcG9ydCBkeW5hbWljYWxseSBsb2FkaW5nIHRoZSBkcml2ZXJzLgotCQkgKi8KLQkJX1BNX2hEZXZpY2UgPSBDcmVhdGVGaWxlKFBNSEVMUF9WWERfUEFUSCwgMCwwLDAsIENSRUFURV9ORVcsIEZJTEVfRkxBR19ERUxFVEVfT05fQ0xPU0UsIDApOwotCQl9Ci0JICAgIH0KLQlpZiAoX1BNX2hEZXZpY2UgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkgICAgLyogQ2FsbCB0aGUgZHJpdmVyIHRvIGRldGVybWluZSB0aGUgdmVyc2lvbiBudW1iZXIgKi8KLQkgICAgaWYgKCFEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HRVRWRVIzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpIHx8IG91dEJ1ZlswXSA8IFBNSEVMUF9WRVJTSU9OKSB7Ci0JCWlmIChfUE1faGF2ZVdpbk5UKQotCQkgICAgUE1fZmF0YWxFcnJvcigiT2xkZXIgdmVyc2lvbiBvZiBQTUhFTFAuU1lTIGZvdW5kISIpOwotCQllbHNlCi0JCSAgICBQTV9mYXRhbEVycm9yKCJPbGRlciB2ZXJzaW9uIG9mIFBNSEVMUC5WWEQgZm91bmQhIik7Ci0JCX0KLQotCSAgICAvKiBOb3cgc2V0IHRoZSBjdXJyZW50IHBhdGggaW5zaWRlIHRoZSBWeEQgc28gaXQga25vd3Mgd2hhdCB0aGUKLQkgICAgICogY3VycmVudCBkaXJlY3RvcnkgaXMgZm9yIGxvYWRpbmcgTnVjbGV1cyBkcml2ZXJzLgotCSAgICAgKi8KLQkgICAgaW5CdWZbMF0gPSAodWxvbmcpUE1fZ2V0Q3VycmVudFBhdGgoY250UGF0aCxzaXplb2YoY250UGF0aCkpOwotCSAgICBpZiAoIURldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX1NFVENOVFBBVEgzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JCVBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBzZXQgVnhEIGN1cnJlbnQgcGF0aCEiKTsKLQotCSAgICAvKiBOb3cgcGFzcyBkb3duIHRoZSBOVUNMRVVTX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGRldmljZQotCSAgICAgKiBkcml2ZXIgc28gaXQgY2FuIHVzZSB0aGlzIHZhbHVlIGlmIGl0IGlzIGZvdW5kLgotCSAgICAgKi8KLQkgICAgaWYgKChlbnYgPSBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpKSAhPSBOVUxMKSB7Ci0JCWluQnVmWzBdID0gKHVsb25nKWVudjsKLQkJaWYgKCFEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9TRVROVUNMRVVTUEFUSDMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQkJICAgIFBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBzZXQgVnhEIE51Y2xldXMgcGF0aCEiKTsKLQkJfQotCi0JICAgIC8qIEVuYWJsZSBJT1BMIGZvciByaW5nLTMgY29kZSBieSBkZWZhdWx0IGlmIGRyaXZlciBpcyBwcmVzZW50ICovCi0JICAgIGlmIChfUE1faGF2ZVdpbk5UKQotCQlQTV9zZXRJT1BMKDMpOwotCSAgICB9Ci0KLQkvKiBJbmRpY2F0ZSB0aGF0IHdlIGhhdmUgYmVlbiBpbml0aWFsaXNlZCAqLwotCWluaXRlZCA9IHRydWU7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVdlIGRvIGhhdmUgQklPUyBhY2Nlc3MgdW5kZXIgV2luZG93cyA5eCwgYnV0IG5vdCB1bmRlciBXaW5kb3dzIE5ULgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9zZXRJT1BMKAotICAgIGludCBpb3BsKQotewotICAgIERXT1JEICAgICAgIGluQnVmWzFdOyAgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICAgICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgICAgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotICAgIHN0YXRpYyBpbnQgIGNudElPUEwgPSAwOwotICAgIGludCAgICAgICAgIG9sZElPUEwgPSBjbnRJT1BMOwotCi0gICAgLyogRW5hYmxlIEkvTyBieSBhZGp1c3RpbmcgdGhlIEkvTyBwZXJtaXNzaW9ucyBtYXAgb24gV2luZG93cyBOVCAqLwotICAgIGlmIChfUE1faGF2ZVdpbk5UKSB7Ci0JQ0hFQ0tfRk9SX1BNSEVMUCgpOwotCWlmIChpb3BsID09IDMpCi0JICAgIERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0VOQUJMRVJJTkczSU9QTCwgaW5CdWYsIHNpemVvZihpbkJ1Ziksb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKTsKLQllbHNlCi0JICAgIERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0RJU0FCTEVSSU5HM0lPUEwsIGluQnVmLCBzaXplb2YoaW5CdWYpLG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCk7Ci0JY250SU9QTCA9IGlvcGw7Ci0JcmV0dXJuIG9sZElPUEw7Ci0JfQotCi0gICAgLyogV2UgYWx3YXlzIGhhdmUgSU9QTCBvbiBXaW5kb3dzIDl4ICovCi0gICAgcmV0dXJuIDM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV2UgZG8gaGF2ZSBCSU9TIGFjY2VzcyB1bmRlciBXaW5kb3dzIDl4LCBidXQgbm90IHVuZGVyIFdpbmRvd3MgTlQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCkKLXsKLSAgICBpZiAoUE1fZ2V0T1NUeXBlKCkgPT0gX09TX1dJTk5UKQotCXJldHVybiBmYWxzZTsKLSAgICBlbHNlCi0JcmV0dXJuIF9QTV9oRGV2aWNlICE9IElOVkFMSURfSEFORExFX1ZBTFVFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0eXBlIGlkZW50aWZpZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKLXsKLSAgICBpZiAoKEdldFZlcnNpb24oKSAmIDB4ODAwMDAwMDBVTCkgPT0gMCkKLQlyZXR1cm4gX19fZHJ2X29zX3R5cGUgPSBfT1NfV0lOTlQ7Ci0gICAgZWxzZQotCXJldHVybiBfX19kcnZfb3NfdHlwZSA9IF9PU19XSU45NTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHJ1bnRpbWUgdHlwZSBpZGVudGlmaWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQotewotICAgIHJldHVybiBQTV8zODY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWRkIGEgZmlsZSBkaXJlY3Rvcnkgc2VwYXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGVuYW1lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKAotICAgIGNoYXIgKnMpCi17Ci0gICAgdWludCBwb3MgPSBzdHJsZW4ocyk7Ci0gICAgaWYgKHNbcG9zLTFdICE9ICdcXCcpIHsKLQlzW3Bvc10gPSAnXFwnOwotCXNbcG9zKzFdID0gJ1wwJzsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWRkIGEgdXNlciBkZWZpbmVkIFBNX2ZhdGFsRXJyb3IgY2xlYW51cCBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAotICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKLXsKLSAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVwb3J0IGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uIGFuZCBoYWx0IHRoZSBwcm9ncmFtLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcigKLSAgICBjb25zdCBjaGFyICptc2cpCi17Ci0gICAgaWYgKGZhdGFsRXJyb3JDbGVhbnVwKQotCWZhdGFsRXJyb3JDbGVhbnVwKCk7Ci0gICAgTWVzc2FnZUJveChOVUxMLG1zZywiRmF0YWwgRXJyb3IhIiwgTUJfSUNPTkVYQ0xBTUFUSU9OKTsKLSAgICBleGl0KDEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIHRoZSByZWFsIG1vZGUgVkVTQSB0cmFuc2ZlciBidWZmZXIgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgQklPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0VkVTQUJ1ZigKLSAgICB1aW50ICpsZW4sCi0gICAgdWludCAqcnNlZywKLSAgICB1aW50ICpyb2ZmKQotewotICAgIERXT1JEICAgb3V0QnVmWzRdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICAvKiBXZSByZXF1aXJlIHRoZSBoZWxwZXIgVnhEIHRvIGJlIGxvYWRlZCBzdGF0aWNseSBpbiBvcmRlciB0byBzdXBwb3J0Ci0gICAgICogdGhlIFZFU0EgdHJhbnNmZXIgYnVmZmVyLiBXZSBkbyBub3Qgc3VwcG9ydCBkeW5hbWljYWxseSBhbGxvY2F0aW5nCi0gICAgICogcmVhbCBtb2RlIG1lbW9yeSBidWZmZXJzIGZyb20gV2luMzIgcHJvZ3JhbXMgKHdlIG5lZWQgYSAxNi1iaXQgRExMCi0gICAgICogZm9yIHRoaXMsIGFuZCBXaW5kb3dzIDl4IGJlY29tZXMgdmVyeSB1bnN0YWJsZSBpZiB5b3UgZnJlZSB0aGUKLSAgICAgKiBtZW1vcnkgYmxvY2tzIG91dCBvZiBvcmRlcikuCi0gICAgICovCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGlmICghVkVTQUJ1Zl9wdHIpIHsKLQlDSEVDS19GT1JfUE1IRUxQKCk7Ci0JaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dFVFZFU0FCVUYzMiwgTlVMTCwgMCwKLQkJb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkgewotCSAgICBpZiAoIW91dEJ1ZlswXSkKLQkJcmV0dXJuIE5VTEw7Ci0JICAgIFZFU0FCdWZfcHRyID0gKHZvaWQqKW91dEJ1ZlswXTsKLQkgICAgVkVTQUJ1Zl9sZW4gPSBvdXRCdWZbMV07Ci0JICAgIFZFU0FCdWZfcnNlZyA9IG91dEJ1ZlsyXTsKLQkgICAgVkVTQUJ1Zl9yb2ZmID0gb3V0QnVmWzNdOwotCSAgICB9Ci0JfQotICAgICpsZW4gPSBWRVNBQnVmX2xlbjsKLSAgICAqcnNlZyA9IFZFU0FCdWZfcnNlZzsKLSAgICAqcm9mZiA9IFZFU0FCdWZfcm9mZjsKLSAgICByZXR1cm4gVkVTQUJ1Zl9wdHI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2hlY2sgaWYgYSBrZXkgaGFzIGJlZW4gcHJlc3NlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKLXsKLSAgICAvKiBOb3QgdXNlZCBpbiBXaW5kb3dzICovCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV2FpdCBmb3IgYW5kIHJldHVybiB0aGUgbmV4dCBrZXlwcmVzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKLXsKLSAgICAvKiBOb3QgdXNlZCBpbiBXaW5kb3dzICovCi0gICAgcmV0dXJuIDB4RDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBPUyBjb25zb2xlIGN1cnNvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24oCi0gICAgaW50IHgsCi0gICAgaW50IHkpCi17Ci0gICAgLyogTm90aGluZyB0byBkbyBmb3IgV2luZG93cyAqLwotICAgICh2b2lkKXg7Ci0gICAgKHZvaWQpeTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHdpZHRoIG9mIHRoZSBPUyBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1fc2V0T1NTY3JlZW5XaWR0aCgKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCkKLXsKLSAgICAvKiBOb3RoaW5nIHRvIGRvIGZvciBXaW5kb3dzICovCi0gICAgKHZvaWQpd2lkdGg7Ci0gICAgKHZvaWQpaGVpZ2h0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGhhbmRsZXIgKHVzZWQgZm9yIHNvZnR3YXJlIHN0ZXJlbyBtb2RlcykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoCi0gICAgUE1faW50SGFuZGxlciBpaCwKLSAgICBpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFdlIGRvIG5vdCBzdXBwb3J0IHRoaXMgZnJvbSBXaW4zMiBwcm9ncmFtcy4gUmF0aGVyIHRoZSBWeEQgaGFuZGxlcwotICAgICAqIHRoaXMgc3R1ZmYgaXQgd2lsbCB0YWtlIGNhcmUgb2YgaG9va2luZyB0aGUgc3RlcmVvIGZsaXAgZnVuY3Rpb25zIGF0Ci0gICAgICogdGhlIFZ4RCBsZXZlbC4KLSAgICAgKi8KLSAgICAodm9pZClpaDsKLSAgICAodm9pZClmcmVxdWVuY3k7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGZyZXF1ZW5jeSAoZm9yIHN0ZXJlbyBtb2RlcykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KAotICAgIGludCBmcmVxdWVuY3kpCi17Ci0gICAgLyogTm90IHN1cHBvcnRlZCB1bmRlciBXaW4zMiAqLwotICAgICh2b2lkKWZyZXF1ZW5jeTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSBvcmlnaW5hbCByZWFsIHRpbWUgY2xvY2sgaGFuZGxlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgdW5kZXIgV2luMzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBwYXRoIG9yIHdvcmtpbmcgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKLSAgICBjaGFyICpwYXRoLAotICAgIGludCBtYXhMZW4pCi17Ci0gICAgcmV0dXJuIGdldGN3ZChwYXRoLG1heExlbik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUXVlcnkgYSBzdHJpbmcgZnJvbSB0aGUgcmVnaXN0cnkgKGV4dGVuZGVkIHZlcnNpb24pLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBSRUdfcXVlcnlTdHJpbmdFeCgKLSAgICBIS0VZIGhLZXksCi0gICAgY29uc3QgY2hhciAqc3pWYWx1ZSwKLSAgICBjaGFyICp2YWx1ZSwKLSAgICB1bG9uZyBzaXplKQotewotICAgIERXT1JEICAgdHlwZTsKLQotICAgIGlmIChSZWdRdWVyeVZhbHVlRXgoaEtleSwoUENIQVIpc3pWYWx1ZSwoUERXT1JEKU5VTEwsKFBEV09SRCkmdHlwZSwoTFBCWVRFKXZhbHVlLChQRFdPUkQpJnNpemUpID09IEVSUk9SX1NVQ0NFU1MpCi0JcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVF1ZXJ5IGEgc3RyaW5nIGZyb20gdGhlIHJlZ2lzdHJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBSRUdfcXVlcnlTdHJpbmcoCi0gICAgY29uc3QgY2hhciAqc3pLZXksCi0gICAgY29uc3QgY2hhciAqc3pWYWx1ZSwKLSAgICBjaGFyICp2YWx1ZSwKLSAgICBEV09SRCBzaXplKQotewotICAgIEhLRVkgICAgaEtleTsKLSAgICBpYm9vbCAgIHN0YXR1cyA9IGZhbHNlOwotCi0gICAgbWVtc2V0KHZhbHVlLDAsc2l6ZW9mKHZhbHVlKSk7Ci0gICAgaWYgKFJlZ09wZW5LZXkoSEtFWV9MT0NBTF9NQUNISU5FLHN6S2V5LCZoS2V5KSA9PSBFUlJPUl9TVUNDRVNTKSB7Ci0Jc3RhdHVzID0gUkVHX3F1ZXJ5U3RyaW5nRXgoaEtleSxzelZhbHVlLHZhbHVlLHNpemUpOwotCVJlZ0Nsb3NlS2V5KGhLZXkpOwotCX0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgZHJpdmUgbGV0dGVyIGZvciB0aGUgYm9vdCBkcml2ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLSAgICBHZXRTeXN0ZW1EaXJlY3RvcnkocGF0aCxzaXplb2YocGF0aCkpOwotICAgIHJldHVybiBwYXRoWzBdOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgVkJFL0FGIGRyaXZlciBmaWxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCi17Ci0gICAgcmV0dXJuICJjOlxcIjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLSAgICBjaGFyICAgICAgICAqZW52OwotCi0gICAgaWYgKChlbnYgPSBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpKSAhPSBOVUxMKQotCXJldHVybiBlbnY7Ci0gICAgR2V0U3lzdGVtRGlyZWN0b3J5KHBhdGgsc2l6ZW9mKHBhdGgpKTsKLSAgICBzdHJjYXQocGF0aCwiXFxudWNsZXVzIik7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBOdWNsZXVzIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOwotICAgIHN0cmNweShwYXRoLFBNX2dldE51Y2xldXNQYXRoKCkpOwotICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKLSAgICBzdHJjYXQocGF0aCwiY29uZmlnIik7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBtYWNoaW5lIGlmIHBvc3NpYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKQotewotICAgIHJldHVybiBQTV9nZXRNYWNoaW5lTmFtZSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUdldCB0aGUgbmFtZSBvZiB0aGUgbWFjaGluZSBvbiB0aGUgbmV0d29yay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBuYW1lWzI1Nl07Ci0KLSAgICBpZiAoUkVHX3F1ZXJ5U3RyaW5nKHN6TWFjaGluZU5hbWVLZXksc3pNYWNoaW5lTmFtZSxuYW1lLHNpemVvZihuYW1lKSkpCi0JcmV0dXJuIG5hbWU7Ci0gICAgaWYgKFJFR19xdWVyeVN0cmluZyhzek1hY2hpbmVOYW1lS2V5TlQsc3pNYWNoaW5lTmFtZSxuYW1lLHNpemVvZihuYW1lKSkpCi0JcmV0dXJuIG5hbWU7Ci0gICAgcmV0dXJuICJVbmtub3duIjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWFsIG1vZGUgQklPUyBkYXRhIGFyZWEuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9oYXZlV2luTlQpIHsKLQkvKiBPbiBXaW5kb3dzIE5UIHdlIGhhdmUgdG8gbWFwIGl0IHBoeXNpY2FsbHkgZGlyZWN0bHkgKi8KLQkgICAgcmV0dXJuIFBNX21hcFBoeXNpY2FsQWRkcigweDQwMCwgMHgxMDAwLCB0cnVlKTsKLQl9Ci0gICAgZWxzZSB7Ci0JLyogRm9yIFdpbmRvd3MgOXggd2UgY2FuIGFjY2VzcyB0aGlzIG1lbW9yeSBkaXJlY3RseSAqLwotCXJldHVybiAodm9pZCopMHg0MDA7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiBhIHBvaW50ZXIgdG8gMHhBMDAwMCBwaHlzaWNhbCBWR0EgZ3JhcGhpY3MgZnJhbWVidWZmZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQotewotICAgIGlmIChfUE1faGF2ZVdpbk5UKSB7Ci0JLyogT24gV2luZG93cyBOVCB3ZSBoYXZlIHRvIG1hcCBpdCBwaHlzaWNhbGx5IGRpcmVjdGx5ICovCi0JICAgIHJldHVybiBQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwgMHgwRkZGRiwgZmFsc2UpOwotCX0KLSAgICBlbHNlIHsKLQkvKiBBbHdheXMgdXNlIHRoZSAweEEwMDAwIGxpbmVhciBhZGRyZXNzIHNvIHRoYXQgd2Ugd2lsbCB1c2UKLQkgKiB3aGF0ZXZlciBwYWdlIHRhYmxlIG1hcHBpbmdzIGFyZSBzZXQgdXAgZm9yIHVzIChpZTogZm9yIHZpcnR1YWwKLQkgKiBiYW5rIHN3aXRjaGluZy4KLQkgKi8KLQlyZXR1cm4gKHZvaWQqKTB4QTAwMDA7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1hcCBhIHBoeXNpY2FsIGFkZHJlc3MgdG8gYSBsaW5lYXIgYWRkcmVzcyBpbiB0aGUgY2FsbGVycyBwcm9jZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBsaW1pdCwKLSAgICBpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICBEV09SRCAgIGluQnVmWzNdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpbkJ1ZlswXSA9IGJhc2U7Ci0gICAgaW5CdWZbMV0gPSBsaW1pdDsKLSAgICBpbkJ1ZlsyXSA9IGlzQ2FjaGVkOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfTUFQUEhZUzMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQlyZXR1cm4gKHZvaWQqKW91dEJ1ZlswXTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgcGh5c2ljYWwgYWRkcmVzcyBtYXBwaW5nIGFsbG9jYXRlZCBieSBQTV9tYXBQaHlzaWNhbEFkZHIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKAotICAgIHZvaWQgKnB0ciwKLSAgICB1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBXZSBuZXZlciBmcmVlIHRoZSBtYXBwaW5ncyB1bmRlciBXaW4zMiAodGhlIFZ4RCB0cmFja3MgdGhlbSBhbmQKLSAgICAgKiByZWlzc3VlcyB0aGUgc2FtZSBtYXBwaW5ncyB1bnRpbCB0aGUgc3lzdGVtIGlzIHJlYm9vdGVkKS4KLSAgICAgKi8KLSAgICAodm9pZClwdHI7Ci0gICAgKHZvaWQpbGltaXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciBtZW1vcnkgYWRkcmVzcyBpbiBjdXJyZW50IHByb2Nlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKAotICAgIHZvaWQgKnApCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlsxXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgaW5CdWZbMF0gPSAodWxvbmcpcDsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dFVFBIWVNJQ0FMQUREUjMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQlyZXR1cm4gb3V0QnVmWzBdOwotICAgIHJldHVybiAweEZGRkZGRkZGVUw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciBtZW1vcnkgYWRkcmVzcyBpbiBjdXJyZW50IHByb2Nlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2UoCi0gICAgdm9pZCAqcCwKLSAgICB1bG9uZyBsZW5ndGgsCi0gICAgdWxvbmcgKnBoeXNBZGRyZXNzKQotewotICAgIERXT1JEICAgaW5CdWZbM107ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGluQnVmWzBdID0gKHVsb25nKXA7Ci0gICAgaW5CdWZbMV0gPSAodWxvbmcpbGVuZ3RoOwotICAgIGluQnVmWzJdID0gKHVsb25nKXBoeXNBZGRyZXNzOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0VUUEhZU0lDQUxBRERSUkFOR0UzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JcmV0dXJuIG91dEJ1ZlswXTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NsZWVwKAotICAgIHVsb25nIG1pbGxpc2Vjb25kcykKLXsKLSAgICBTbGVlcChtaWxsaXNlY29uZHMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgYmFzZSBJL08gcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBDT00gcG9ydC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0Y4OwotCWNhc2UgMTogcmV0dXJuIDB4MkY4OwotCWNhc2UgMjogcmV0dXJuIDB4M0U4OwotCWNhc2UgMzogcmV0dXJuIDB4MkU4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGJhc2UgSS9PIHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgTFBUIHBvcnQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNCQzsKLQljYXNlIDE6IHJldHVybiAweDM3ODsKLQljYXNlIDI6IHJldHVybiAweDI3ODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5LiBGb3IgV2luOXggd2UgYWxsb2NhdGUgc2hhcmVkIG1lbW9yeQotYXMgbG9ja2VkLCBnbG9iYWwgbWVtb3J5IHRoYXQgaXMgYWNjZXNzaWJsZSBmcm9tIGFueSBtZW1vcnkgY29udGV4dAotKGluY2x1ZGluZyBpbnRlcnJ1cHQgdGltZSBjb250ZXh0KSwgd2hpY2ggYWxsb3dzIHVzIHRvIGxvYWQgb3VyIGltcG9ydGFudAotZGF0YSBzdHJ1Y3R1cmUgYW5kIGNvZGUgc3VjaCB0aGF0IHdlIGNhbiBhY2Nlc3MgaXQgZGlyZWN0bHkgZnJvbSBhIHJpbmcKLTAgaW50ZXJydXB0IGNvbnRleHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hbGxvY1NoYXJlZCgKLSAgICBsb25nIHNpemUpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlsxXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpbkJ1ZlswXSA9IHNpemU7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9NQUxMT0NTSEFSRUQzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JcmV0dXJuICh2b2lkKilvdXRCdWZbMF07Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlU2hhcmVkKAotICAgIHZvaWQgKnB0cikKLXsKLSAgICBEV09SRCAgIGluQnVmWzFdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0KLSAgICBpbkJ1ZlswXSA9ICh1bG9uZylwdHI7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0ZSRUVTSEFSRUQzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksIE5VTEwsIDAsIE5VTEwsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1hcCBhIGxpbmVhciBtZW1vcnkgYWRkcmVzcyB0byB0aGUgY2FsbGluZyBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UuIFRoZQotYWRkcmVzcyB3aWxsIGhhdmUgYmVlbiBhbGxvY2F0ZWQgaW4gYW5vdGhlciBwcm9jZXNzIHVzaW5nIHRoZQotUE1fbWFwUGh5c2ljYWxBZGRyIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3MoCi0gICAgdm9pZCAqYmFzZSwKLSAgICB1bG9uZyBsaW1pdCkKLXsKLSAgICAodm9pZCliYXNlOwotICAgICh2b2lkKWxpbWl0OwotICAgIHJldHVybiBiYXNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1hcCBhIHJlYWwgbW9kZSBwb2ludGVyIHRvIGEgcHJvdGVjdGVkIG1vZGUgcG9pbnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIoCi0gICAgdWludCByX3NlZywKLSAgICB1aW50IHJfb2ZmKQotewotICAgIHJldHVybiAodm9pZCopKE1LX1BIWVMocl9zZWcscl9vZmYpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1aW50ICpyX3NlZywKLSAgICB1aW50ICpyX29mZikKLXsKLSAgICAvKiBXZSBkbyBub3Qgc3VwcG9ydCBkeW5hbWljYWxseSBhbGxvY2F0aW5nIHJlYWwgbW9kZSBtZW1vcnkgYnVmZmVycwotICAgICAqIGZyb20gV2luMzIgcHJvZ3JhbXMgKHdlIG5lZWQgYSAxNi1iaXQgRExMIGZvciB0aGlzLCBhbmQgV2luZG93cwotICAgICAqIDl4IGJlY29tZXMgdmVyeSB1bnN0YWJsZSBpZiB5b3UgZnJlZSB0aGUgbWVtb3J5IGJsb2NrcyBvdXQgb2Ygb3JkZXIpLgotICAgICAqLwotICAgICh2b2lkKXNpemU7Ci0gICAgKHZvaWQpcl9zZWc7Ci0gICAgKHZvaWQpcl9vZmY7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZygKLSAgICB2b2lkICptZW0pCi17Ci0gICAgLyogTm90IHN1cHBvcnRlZCBpbiBXaW5kb3dzICovCi0gICAgKHZvaWQpbWVtOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdCAocGFyYW1ldGVycyBpbiBEUE1JIGNvbXBhdGlibGUgc3RydWN0dXJlKQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgRFBNSV9pbnQ4NigKLSAgICBpbnQgaW50bm8sCi0gICAgRFBNSV9yZWdzICpyZWdzKQotewotICAgIERXT1JEICAgaW5CdWZbMl07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgaW5CdWZbMF0gPSBpbnRubzsKLSAgICBpbkJ1ZlsxXSA9ICh1bG9uZylyZWdzOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9EUE1JSU5UODYzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JTlVMTCwgMCwgJmNvdW50LCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2ludDg2KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0KQotewotICAgIERXT1JEICAgaW5CdWZbM107ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGluQnVmWzBdID0gaW50bm87Ci0gICAgaW5CdWZbMV0gPSAodWxvbmcpaW47Ci0gICAgaW5CdWZbMl0gPSAodWxvbmcpb3V0OwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfSU5UODYzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JcmV0dXJuIG91dEJ1ZlswXTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2ludDg2eCgKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBEV09SRCAgIGluQnVmWzRdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpbkJ1ZlswXSA9IGludG5vOwotICAgIGluQnVmWzFdID0gKHVsb25nKWluOwotICAgIGluQnVmWzJdID0gKHVsb25nKW91dDsKLSAgICBpbkJ1ZlszXSA9ICh1bG9uZylzcmVnczsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0lOVDg2WDMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQlyZXR1cm4gb3V0QnVmWzBdOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgYSByZWFsIG1vZGUgZmFyIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKAotICAgIHVpbnQgc2VnLAotICAgIHVpbnQgb2ZmLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgRFdPUkQgICBpbkJ1Zls0XTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpbkJ1ZlswXSA9IHNlZzsKLSAgICBpbkJ1ZlsxXSA9IG9mZjsKLSAgICBpbkJ1ZlsyXSA9ICh1bG9uZylpbjsKLSAgICBpbkJ1ZlszXSA9ICh1bG9uZylzcmVnczsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfQ0FMTFJFQUxNT0RFMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCU5VTEwsIDAsICZjb3VudCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBhbW91bnQgb2YgYXZhaWxhYmxlIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSgKLSAgICB1bG9uZyAqcGh5c2ljYWwsCi0gICAgdWxvbmcgKnRvdGFsKQotewotICAgIC8qIFdlIGRvbid0IHN1cHBvcnQgdGhpcyB1bmRlciBXaW4zMiBhdCB0aGUgbW9tZW50ICovCi0gICAgKnBoeXNpY2FsID0gKnRvdGFsID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIGxvY2tlZCwgcGh5c2ljYWwgbWVtb3J5IGZvciBETUEgb3BlcmF0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NMb2NrZWRNZW0oCi0gICAgdWludCBzaXplLAotICAgIHVsb25nICpwaHlzQWRkciwKLSAgICBpYm9vbCBjb250aWd1b3VzLAotICAgIGlib29sIGJlbG93MTZNKQotewotICAgIERXT1JEICAgaW5CdWZbNF07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGluQnVmWzBdID0gc2l6ZTsKLSAgICBpbkJ1ZlsxXSA9ICh1bG9uZylwaHlzQWRkcjsKLSAgICBpbkJ1ZlsyXSA9ICh1bG9uZyljb250aWd1b3VzOwotICAgIGluQnVmWzNdID0gKHVsb25nKWJlbG93MTZNOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfQUxMT0NMT0NLRUQzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JcmV0dXJuICh2b2lkKilvdXRCdWZbMF07Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIGxvY2tlZCBwaHlzaWNhbCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKAotICAgIHZvaWQgKnAsCi0gICAgdWludCBzaXplLAotICAgIGlib29sIGNvbnRpZ3VvdXMpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlszXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpbkJ1ZlswXSA9ICh1bG9uZylwOwotICAgIGluQnVmWzFdID0gc2l6ZTsKLSAgICBpbkJ1ZlsyXSA9IGNvbnRpZ3VvdXM7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0ZSRUVMT0NLRUQzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JTlVMTCwgMCwgJmNvdW50LCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZXMgYSBwYWdlIGFsaWduZWQgYW5kIHBhZ2Ugc2l6ZWQgYmxvY2sgb2YgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUGFnZSgKLSAgICBpYm9vbCBsb2NrZWQpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlsyXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgaW5CdWZbMF0gPSBsb2NrZWQ7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9BTExPQ1BBR0UzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JcmV0dXJuICh2b2lkKilvdXRCdWZbMF07Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIHBhZ2UgYWxpZ25lZCBhbmQgcGFnZSBzaXplZCBibG9jayBvZiBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVQYWdlKAotICAgIHZvaWQgKnApCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlsxXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpbkJ1ZlswXSA9ICh1bG9uZylwOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9GUkVFUEFHRTMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQlOVUxMLCAwLCAmY291bnQsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIERXT1JEICAgaW5CdWZbMl07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaW5CdWZbMF0gPSAodWxvbmcpcDsKLSAgICBpbkJ1ZlsxXSA9IGxlbjsKLSAgICBpbkJ1ZlsyXSA9ICh1bG9uZylsaDsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0xPQ0tEQVRBUEFHRVMzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JcmV0dXJuIG91dEJ1ZlswXTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1VbmxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fdW5sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlsyXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpbkJ1ZlswXSA9ICh1bG9uZylwOwotICAgIGluQnVmWzFdID0gbGVuOwotICAgIGluQnVmWzJdID0gKHVsb25nKWxoOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfVU5MT0NLREFUQVBBR0VTMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCXJldHVybiBvdXRCdWZbMF07Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIERXT1JEICAgaW5CdWZbMl07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaW5CdWZbMF0gPSAodWxvbmcpcDsKLSAgICBpbkJ1ZlsxXSA9IGxlbjsKLSAgICBpbkJ1ZlsyXSA9ICh1bG9uZylsaDsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0xPQ0tDT0RFUEFHRVMzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JcmV0dXJuIG91dEJ1ZlswXTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1VbmxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIERXT1JEICAgaW5CdWZbMl07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaW5CdWZbMF0gPSAodWxvbmcpcDsKLSAgICBpbkJ1ZlsxXSA9IGxlbjsKLSAgICBpbkJ1ZlsyXSA9ICh1bG9uZylsaDsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX1VOTE9DS0NPREVQQUdFUzMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQlyZXR1cm4gb3V0QnVmWzBdOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBiYW5rcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBKAotICAgIGludCBiYW5rKQotewotICAgIFJNUkVHUyAgcmVnczsKLSAgICByZWdzLnguYXggPSAweDRGMDU7Ci0gICAgcmVncy54LmJ4ID0gMHgwMDAwOwotICAgIHJlZ3MueC5keCA9IGJhbms7Ci0gICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0FCKAotICAgIGludCBiYW5rKQotewotICAgIFJNUkVHUyAgcmVnczsKLSAgICByZWdzLnguYXggPSAweDRGMDU7Ci0gICAgcmVncy54LmJ4ID0gMHgwMDAwOwotICAgIHJlZ3MueC5keCA9IGJhbms7Ci0gICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0gICAgcmVncy54LmF4ID0gMHg0RjA1OwotICAgIHJlZ3MueC5ieCA9IDB4MDAwMTsKLSAgICByZWdzLnguZHggPSBiYW5rOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBzdGFydCBhZGRyZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0Q1JUU3RhcnQoCi0gICAgaW50IHgsCi0gICAgaW50IHksCi0gICAgaW50IHdhaXRWUlQpCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIHJlZ3MueC5heCA9IDB4NEYwNzsKLSAgICByZWdzLnguYnggPSB3YWl0VlJUOwotICAgIHJlZ3MueC5jeCA9IHg7Ci0gICAgcmVncy54LmR4ID0geTsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FbmFibGUgd3JpdGUgY29tYmluaW5nIGZvciB0aGUgbWVtb3J5IHJlZ2lvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBsZW5ndGgsCi0gICAgdWludCB0eXBlKQotewotICAgIERXT1JEICAgaW5CdWZbM107ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGluQnVmWzBdID0gYmFzZTsKLSAgICBpbkJ1ZlsxXSA9IGxlbmd0aDsKLSAgICBpbkJ1ZlsyXSA9IHR5cGU7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9FTkFCTEVMRkJDT01CMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCXJldHVybiBvdXRCdWZbMF07Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUdldCB0aGUgcGFnZSBkaXJlY3RvcnkgYmFzZSByZWdpc3RlciB2YWx1ZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFBNQVBJIF9QTV9nZXRQREIodm9pZCkKLXsKLSAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HRVRQREIzMiwgTlVMTCwgMCwKLQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQlyZXR1cm4gb3V0QnVmWzBdOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZsdXNoIHRoZSB0cmFuc2xhdGlvbiBsb29rYXNpZGUgYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmx1c2hUTEIodm9pZCkKLXsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfRkxVU0hUTEIzMiwgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRXhlY3V0ZSB0aGUgUE9TVCBvbiB0aGUgc2Vjb25kYXJ5IEJJT1MgZm9yIGEgY29udHJvbGxlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAotICAgIHVzaG9ydCBheFZhbCwKLSAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCi0gICAgdm9pZCAqbWFwcGVkQklPUywKLSAgICB1bG9uZyBCSU9TTGVuKQotewotICAgIC8qIFRoaXMgaXMgbmV2ZXIgZG9uZSBieSBXaW4zMiBwcm9ncmFtcywgYnV0IHJhdGhlciBkb25lIGJ5IHRoZSBWeEQKLSAgICAgKiB3aGVuIHRoZSBzeXN0ZW0gYm9vdHMuCi0gICAgICovCi0gICAgKHZvaWQpYXhWYWw7Ci0gICAgKHZvaWQpQklPU1BoeXNBZGRyOwotICAgICh2b2lkKW1hcHBlZEJJT1M7Ci0gICAgKHZvaWQpQklPU0xlbjsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTG9hZCBhbiBPUyBzcGVjaWZpYyBzaGFyZWQgbGlicmFyeSBvciBETEwuIElmIHRoZSBPUyBkb2VzIG5vdCBzdXBwb3J0Ci1zaGFyZWQgbGlicmFyaWVzLCBzaW1wbHkgcmV0dXJuIE5VTEwuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1fTU9EVUxFIFBNQVBJIFBNX2xvYWRMaWJyYXJ5KAotICAgIGNvbnN0IGNoYXIgKnN6RExMTmFtZSkKLXsKLSAgICByZXR1cm4gKFBNX01PRFVMRSlMb2FkTGlicmFyeShzekRMTE5hbWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUdldCB0aGUgYWRkcmVzcyBvZiBhIG5hbWVkIHByb2NlZHVyZSBmcm9tIGEgc2hhcmVkIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldFByb2NBZGRyZXNzKAotICAgIFBNX01PRFVMRSBoTW9kdWxlLAotICAgIGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpCi17Ci0gICAgcmV0dXJuICh2b2lkKilHZXRQcm9jQWRkcmVzcygoSElOU1RBTkNFKWhNb2R1bGUsc3pQcm9jTmFtZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVW5sb2FkIGEgc2hhcmVkIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSkKLXsKLSAgICBGcmVlTGlicmFyeSgoSElOU1RBTkNFKWhNb2R1bGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUludGVybmFsIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIGZpbmQgZGF0YSB0byB0aGUgZ2VuZXJpYyBpbnRlcmZhY2UuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY29udmVydEZpbmREYXRhKAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSwKLSAgICBXSU4zMl9GSU5EX0RBVEEgKmJsaykKLXsKLSAgICB1bG9uZyAgIGR3U2l6ZSA9IGZpbmREYXRhLT5kd1NpemU7Ci0KLSAgICBtZW1zZXQoZmluZERhdGEsMCxmaW5kRGF0YS0+ZHdTaXplKTsKLSAgICBmaW5kRGF0YS0+ZHdTaXplID0gZHdTaXplOwotICAgIGlmIChibGstPmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfUkVBRE9OTFk7Ci0gICAgaWYgKGJsay0+ZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfRElSRUNUT1JZOwotICAgIGlmIChibGstPmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9BUkNISVZFKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9BUkNISVZFOwotICAgIGlmIChibGstPmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ISURERU4pCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX0hJRERFTjsKLSAgICBpZiAoYmxrLT5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfU1lTVEVNKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9TWVNURU07Ci0gICAgZmluZERhdGEtPnNpemVMbyA9IGJsay0+bkZpbGVTaXplTG93OwotICAgIGZpbmREYXRhLT5zaXplSGkgPSBibGstPm5GaWxlU2l6ZUhpZ2g7Ci0gICAgc3RybmNweShmaW5kRGF0YS0+bmFtZSxibGstPmNGaWxlTmFtZSxQTV9NQVhfUEFUSCk7Ci0gICAgZmluZERhdGEtPm5hbWVbUE1fTUFYX1BBVEgtMV0gPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqUE1BUEkgUE1fZmluZEZpcnN0RmlsZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgV0lOMzJfRklORF9EQVRBIGJsazsKLSAgICBIQU5ETEUgICAgICAgICAgaGZpbGU7Ci0KLSAgICBpZiAoKGhmaWxlID0gRmluZEZpcnN0RmlsZShmaWxlbmFtZSwmYmxrKSkgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQljb252ZXJ0RmluZERhdGEoZmluZERhdGEsJmJsayk7Ci0JcmV0dXJuICh2b2lkKiloZmlsZTsKLQl9Ci0gICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBuZXh0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZmluZE5leHRGaWxlKAotICAgIHZvaWQgKmhhbmRsZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgV0lOMzJfRklORF9EQVRBIGJsazsKLQotICAgIGlmIChGaW5kTmV4dEZpbGUoKEhBTkRMRSloYW5kbGUsJmJsaykpIHsKLQljb252ZXJ0RmluZERhdGEoZmluZERhdGEsJmJsayk7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCi0gICAgdm9pZCAqaGFuZGxlKQotewotICAgIEZpbmRDbG9zZSgoSEFORExFKWhhbmRsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZHJpdmUgaXMgYSB2YWxpZCBkcml2ZSBvciBub3QuIFVuZGVyIFVuaXggdGhpcwotZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueXRoaW5nIGV4Y2VwdCBhIHZhbHVlIG9mIDMgKGNvbnNpZGVyZWQKLXRoZSByb290IGRyaXZlLCBhbmQgZXF1aXZhbGVudCB0byBDOiBmb3Igbm9uLVVuaXggc3lzdGVtcykuIFRoZSBkcml2ZQotbnVtYmVyaW5nIGlzOgotCi0gICAgMSAgIC0gRHJpdmUgQToKLSAgICAyICAgLSBEcml2ZSBCOgotICAgIDMgICAtIERyaXZlIEM6Ci0gICAgZXRjCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9kcml2ZVZhbGlkKAotICAgIGNoYXIgZHJpdmUpCi17Ci0gICAgY2hhciAgICBidWZbNV07Ci0gICAgaW50ICAgICB0eXBlOwotCi0gICAgc3ByaW50ZihidWYsIiVjOlxcIiwgZHJpdmUpOwotICAgIHJldHVybiAoKHR5cGUgPSBHZXREcml2ZVR5cGUoYnVmKSkgIT0gMCAmJiB0eXBlICE9IDEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmlmZWQgZHJpdmUuCi1VbmRlciBVbml4IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHJlZ2FyZGxlc3MKLW9mIHdoYXQgdGhlIHZhbHVlIG9mICdkcml2ZScgaXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9nZXRkY3dkKAotICAgIGludCBkcml2ZSwKLSAgICBjaGFyICpkaXIsCi0gICAgaW50IGxlbikKLXsKLSAgICAvKiBOVCBzdG9yZXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGZvciBkcml2ZSBOIGluIHRoZSBtYWdpYyBlbnZpcm9ubWVudCAqLwotICAgIC8qIHZhcmlhYmxlID1OOiBzbyB3ZSBzaW1wbHkgbG9vayBmb3IgdGhhdCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gKi8KLSAgICBjaGFyIGVudm5hbWVbNF07Ci0KLSAgICBlbnZuYW1lWzBdID0gJz0nOwotICAgIGVudm5hbWVbMV0gPSBkcml2ZSAtIDEgKyAnQSc7Ci0gICAgZW52bmFtZVsyXSA9ICc6JzsKLSAgICBlbnZuYW1lWzNdID0gJ1wwJzsKLSAgICBpZiAoR2V0RW52aXJvbm1lbnRWYXJpYWJsZShlbnZuYW1lLGRpcixsZW4pID09IDApIHsKLQkvKiBUaGUgY3VycmVudCBkaXJlY3Rvcnkgb3IgdGhlIGRyaXZlIGhhcyBub3QgYmVlbiBzZXQgeWV0LCBzbyAqLwotCS8qIHNpbXBseSBzZXQgaXQgdG8gdGhlIHJvb3QuICovCi0JZGlyWzBdID0gZW52bmFtZVsxXTsKLQlkaXJbMV0gPSAnOic7Ci0JZGlyWzJdID0gJ1xcJzsKLQlkaXJbM10gPSAnXDAnOwotCVNldEVudmlyb25tZW50VmFyaWFibGUoZW52bmFtZSxkaXIpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgdWludCBhdHRyaWIpCi17Ci0gICAgRFdPUkQgYXR0ciA9IDA7Ci0KLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9SRUFET05MWSkKLQlhdHRyIHw9IEZJTEVfQVRUUklCVVRFX1JFQURPTkxZOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0FSQ0hJVkUpCi0JYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9BUkNISVZFOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0hJRERFTikKLQlhdHRyIHw9IEZJTEVfQVRUUklCVVRFX0hJRERFTjsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9TWVNURU0pCi0JYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9TWVNURU07Ci0gICAgU2V0RmlsZUF0dHJpYnV0ZXMoKExQU1RSKWZpbGVuYW1lLCBhdHRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQgUE1BUEkgUE1fZ2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgRFdPUkQgICBhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXMoZmlsZW5hbWUpOwotICAgIHVpbnQgICAgYXR0cmliID0gMDsKLQotICAgIGlmIChhdHRyICYgRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkpCi0JYXR0cmliIHw9IFBNX0ZJTEVfUkVBRE9OTFk7Ci0gICAgaWYgKGF0dHIgJiBGSUxFX0FUVFJJQlVURV9BUkNISVZFKQotCWF0dHJpYiB8PSBQTV9GSUxFX0FSQ0hJVkU7Ci0gICAgaWYgKGF0dHIgJiBGSUxFX0FUVFJJQlVURV9ISURERU4pCi0JYXR0cmliIHw9IFBNX0ZJTEVfSElEREVOOwotICAgIGlmIChhdHRyICYgRklMRV9BVFRSSUJVVEVfU1lTVEVNKQotCWF0dHJpYiB8PSBQTV9GSUxFX1NZU1RFTTsKLSAgICByZXR1cm4gYXR0cmliOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ta2RpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICByZXR1cm4gQ3JlYXRlRGlyZWN0b3J5KGZpbGVuYW1lLE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ybWRpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICByZXR1cm4gUmVtb3ZlRGlyZWN0b3J5KGZpbGVuYW1lKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2dldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIEhGSUxFICAgICAgIGY7Ci0gICAgT0ZTVFJVQ1QgICAgb2Y7Ci0gICAgRklMRVRJTUUgICAgdXRjVGltZSxsb2NhbFRpbWU7Ci0gICAgU1lTVEVNVElNRSAgc3lzVGltZTsKLSAgICBpYm9vbCAgICAgICBzdGF0dXMgPSBmYWxzZTsKLQotICAgIG9mLmNCeXRlcyA9IHNpemVvZihvZik7Ci0gICAgaWYgKChmID0gT3BlbkZpbGUoZmlsZW5hbWUsJm9mLE9GX1JFQUQpKSA9PSBIRklMRV9FUlJPUikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFHZXRGaWxlVGltZSgoSEFORExFKWYsTlVMTCxOVUxMLCZ1dGNUaW1lKSkKLQlnb3RvIEV4aXQ7Ci0gICAgaWYgKCFnbVRpbWUpIHsKLQlpZiAoIUZpbGVUaW1lVG9Mb2NhbEZpbGVUaW1lKCZ1dGNUaW1lLCZsb2NhbFRpbWUpKQotCSAgICBnb3RvIEV4aXQ7Ci0JfQotICAgIGVsc2UKLQlsb2NhbFRpbWUgPSB1dGNUaW1lOwotICAgIGlmICghRmlsZVRpbWVUb1N5c3RlbVRpbWUoJmxvY2FsVGltZSwmc3lzVGltZSkpCi0JZ290byBFeGl0OwotICAgIHRpbWUtPnllYXIgPSBzeXNUaW1lLndZZWFyOwotICAgIHRpbWUtPm1vbiA9IHN5c1RpbWUud01vbnRoLTE7Ci0gICAgdGltZS0+ZGF5ID0gc3lzVGltZS53WWVhcjsKLSAgICB0aW1lLT5ob3VyID0gc3lzVGltZS53SG91cjsKLSAgICB0aW1lLT5taW4gPSBzeXNUaW1lLndNaW51dGU7Ci0gICAgdGltZS0+c2VjID0gc3lzVGltZS53U2Vjb25kOwotICAgIHN0YXR1cyA9IHRydWU7Ci0KLUV4aXQ6Ci0gICAgQ2xvc2VIYW5kbGUoKEhBTkRMRSlmKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHNldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fc2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgSEZJTEUgICAgICAgZjsKLSAgICBPRlNUUlVDVCAgICBvZjsKLSAgICBGSUxFVElNRSAgICB1dGNUaW1lLGxvY2FsVGltZTsKLSAgICBTWVNURU1USU1FICBzeXNUaW1lOwotICAgIGlib29sICAgICAgIHN0YXR1cyA9IGZhbHNlOwotCi0gICAgb2YuY0J5dGVzID0gc2l6ZW9mKG9mKTsKLSAgICBpZiAoKGYgPSBPcGVuRmlsZShmaWxlbmFtZSwmb2YsT0ZfV1JJVEUpKSA9PSBIRklMRV9FUlJPUikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgc3lzVGltZS53WWVhciA9IHRpbWUtPnllYXI7Ci0gICAgc3lzVGltZS53TW9udGggPSB0aW1lLT5tb24rMTsKLSAgICBzeXNUaW1lLndZZWFyID0gdGltZS0+ZGF5OwotICAgIHN5c1RpbWUud0hvdXIgPSB0aW1lLT5ob3VyOwotICAgIHN5c1RpbWUud01pbnV0ZSA9IHRpbWUtPm1pbjsKLSAgICBzeXNUaW1lLndTZWNvbmQgPSB0aW1lLT5zZWM7Ci0gICAgaWYgKCFTeXN0ZW1UaW1lVG9GaWxlVGltZSgmc3lzVGltZSwmbG9jYWxUaW1lKSkKLQlnb3RvIEV4aXQ7Ci0gICAgaWYgKCFnbVRpbWUpIHsKLQlpZiAoIUxvY2FsRmlsZVRpbWVUb0ZpbGVUaW1lKCZsb2NhbFRpbWUsJnV0Y1RpbWUpKQotCSAgICBnb3RvIEV4aXQ7Ci0JfQotICAgIGVsc2UKLQl1dGNUaW1lID0gbG9jYWxUaW1lOwotICAgIGlmICghU2V0RmlsZVRpbWUoKEhBTkRMRSlmLE5VTEwsTlVMTCwmdXRjVGltZSkpCi0JZ290byBFeGl0OwotICAgIHN0YXR1cyA9IHRydWU7Ci0KLUV4aXQ6Ci0gICAgQ2xvc2VIYW5kbGUoKEhBTkRMRSlmKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL3ZmbGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNDkxY2QuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvdmZsYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWlib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQoCi0gICAgdWxvbmcgYmFzZUFkZHIsCi0gICAgaW50IGJhbmtTaXplLAotICAgIGludCBjb2RlTGVuLAotICAgIHZvaWQgKmJhbmtGdW5jKQotewotICAgICh2b2lkKWJhc2VBZGRyOwotICAgICh2b2lkKWJhbmtTaXplOwotICAgICh2b2lkKWNvZGVMZW47Ci0gICAgKHZvaWQpYmFua0Z1bmM7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgVkZfZXhpdCh2b2lkKQotewotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi96dGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5MDFhNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi96dGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW4zMgotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBDUFVfbGFyZ2VJbnRlZ2VyIGNvdW50RnJlcTsKLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVQZXJmb3JtYW5jZUNvdW50ZXI7Ci1zdGF0aWMgdWxvbmcgICAgICAgICAgICBzdGFydCxmaW5pc2g7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfX1pUaW1lckluaXQodm9pZCkKLXsKLSNpZmRlZiAgTk9fQVNTRU1CTEVSCi0gICAgaGF2ZVBlcmZvcm1hbmNlQ291bnRlciA9IGZhbHNlOwotI2Vsc2UKLSAgICBoYXZlUGVyZm9ybWFuY2VDb3VudGVyID0gUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgoTEFSR0VfSU5URUdFUiopJmNvdW50RnJlcSk7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdGFydCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9fTFpUaW1lck9uKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIGlmIChoYXZlUGVyZm9ybWFuY2VDb3VudGVyKQotCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKikmdG0tPnN0YXJ0KTsKLSAgICBlbHNlCi0JdG0tPnN0YXJ0LmxvdyA9IHRpbWVHZXRUaW1lKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgbGFwIHRpbWUgc2luY2UgdGhlIHRpbWVyIHdhcyBzdGFydGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJMYXAoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciAgICB0bUxhcCx0bUNvdW50OwotCi0gICAgaWYgKGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIpIHsKLQlRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopJnRtTGFwKTsKLQlfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmdG1MYXAsJnRtQ291bnQpOwotCXJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmdG1Db3VudCxjb3VudEZyZXEubG93KTsKLQl9Ci0gICAgZWxzZSB7Ci0JdG1MYXAubG93ID0gdGltZUdldFRpbWUoKTsKLQlyZXR1cm4gKHRtTGFwLmxvdyAtIHRtLT5zdGFydC5sb3cpICogMTAwMEw7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVN0b3AgdGhlIFplbiBUaW1lciBjb3VudGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfX0xaVGltZXJPZmYoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgaWYgKGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIpCi0JUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIqKSZ0bS0+ZW5kKTsKLSAgICBlbHNlCi0JdG0tPmVuZC5sb3cgPSB0aW1lR2V0VGltZSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBpbiBtaWNyb3NlY29uZHMgYmV0d2VlbiBzdGFydCBhbmQgZW5kIHRpbWluZ3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fTFpUaW1lckNvdW50KAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIENQVV9sYXJnZUludGVnZXIgICAgdG1Db3VudDsKLQotICAgIGlmIChoYXZlUGVyZm9ybWFuY2VDb3VudGVyKSB7Ci0JX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtLT5lbmQsJnRtQ291bnQpOwotCXJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmdG1Db3VudCxjb3VudEZyZXEubG93KTsKLQl9Ci0gICAgZWxzZQotCXJldHVybiAodG0tPmVuZC5sb3cgLSB0bS0+c3RhcnQubG93KSAqIDEwMDBMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAgICAgMTAwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIExvbmcgUGVyaW9kIHRpbWVyIGZyb20gdGhlIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKLXsgcmV0dXJuIHRpbWVHZXRUaW1lKCk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCi13aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KLWFjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKLXBhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoteyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3gxMS9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0veDExL2V2ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNGJmYWMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0veDExL2V2ZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgVW5peCAvIFgxMQotKgotKiBEZXNjcmlwdGlvbjogIFgxMSBldmVudCBxdWV1ZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE1HTC4KLSogICAgICAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIGJvdGggZm9yIHdpbmRvd2VkIGFuZCBmdWxsc2NyZWVuIChER0EpIG1vZGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHVzaG9ydCAgICAgICBrZXlVcE1zZ1syNTZdID0gezB9Oy8qIFRhYmxlIG9mIGtleSB1cCBtZXNzYWdlcyAgICAgKi8KLXN0YXRpYyBpbnQgICAgICAgICAgcmFuZ2VYLHJhbmdlWTsgICAgICAvKiBSYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyAgICovCi0KLXN0YXRpYyBEaXNwbGF5ICAqX0VWVF9kcHk7Ci1zdGF0aWMgV2luZG93ICAgIF9FVlRfd2luOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBrZXljb2RlOwotICBpbnQgc2NhbmNvZGU7Ci19IHhrZXltYXA7Ci0KLXhrZXltYXAgeGtleW1hcHNbXSA9IHsKLSAgeyA5LCBLQl9lc2N9LAotICB7MjQsIEtCX1F9LAotICB7MjUsIEtCX1d9LAotICB7MjYsIEtCX0V9LAotICB7MjcsIEtCX1J9LAotICB7MjgsIEtCX1R9LAotICB7MjksIEtCX1l9LAotICB7MzAsIEtCX1V9LAotICB7MzEsIEtCX0l9LAotICB7MzIsIEtCX099LAotICB7MzMsIEtCX1B9LAotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVGhlc2UgYXJlIG5vdCB1c2VkIHVuZGVyIG5vbi1ET1Mgc3lzdGVtcyAqLwotI2RlZmluZSBfRVZUX2Rpc2FibGVJbnQoKSAgICAgICAxCi0jZGVmaW5lIF9FVlRfcmVzdG9yZUludChmbGFncykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIFNjYW4gY29kZSB0byB0ZXN0Ci0KLVJFTUFSS1M6Ci1UaGlzIG1hY3JvIGRldGVybWluZXMgaWYgYSBzcGVjaWZpZWQga2V5IGlzIGN1cnJlbnRseSBkb3duIGF0IHRoZQotdGltZSB0aGF0IHRoZSBjYWxsIGlzIG1hZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX2lzS2V5RG93bihzY2FuQ29kZSkgICAgKGtleVVwTXNnW3NjYW5Db2RlXSAhPSAwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB0aWNrcyBzaW5jZSBzeXN0ZW0KLXN0YXJ0dXAgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHBsYWNlZCBpbnRvCi10aGUgdGltZSBzdGFtcCBmaWVsZHMgb2YgZXZlbnRzLCBhbmQgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXV0byBtb3VzZSBkb3duCi1ldmVudHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX0VWVF9nZXRUaWNrcyh2b2lkKQotewotICBzdGF0aWMgdW5zaWduZWQgc3RhcnR0aW1lID0gMDsKLSAgc3RydWN0IHRpbWV2YWwgdDsKLQotICBnZXR0aW1lb2ZkYXkoJnQsIE5VTEwpOwotICBpZiAoc3RhcnR0aW1lID09IDApCi0gICAgc3RhcnR0aW1lID0gdC50dl9zZWMgKiAxMDAwICsgKHQudHZfdXNlYy8xMDAwKTsKLSAgcmV0dXJuICgodC50dl9zZWMgKiAxMDAwICsgKHQudHZfdXNlYy8xMDAwKSkgLSBzdGFydHRpbWUpOwotfQotCi1zdGF0aWMgaW50IGdldFNjYW5jb2RlKGludCBrZXljb2RlKQotewotICByZXR1cm4ga2V5Y29kZS04OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVB1bXBzIGFsbCBtZXNzYWdlcyBpbiB0aGUgYXBwbGljYXRpb24gbWVzc2FnZSBxdWV1ZSBpbnRvIG91ciBldmVudCBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgWDExX0NPUkUKLXN0YXRpYyB2b2lkIF9FVlRfcHVtcFgxMU1lc3NhZ2VzKHZvaWQpCi0jZWxzZQotc3RhdGljIHZvaWQgX0VWVF9wdW1wTWVzc2FnZXModm9pZCkKLSNlbmRpZgotewotICAvKiBUT0RPOiBUaGUgcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIHJlYWQgYWxsIGtleWJvYXJkIGFuZCBtb3VzZSAqLwotICAvKiAgICAgICAgIGV2ZW50cyBmcm9tIHRoZSBPUyBzcGVjaWZpYyBldmVudCBxdWV1ZSwgdHJhbnNsYXRlIHRoZW0gYW5kIHBvc3QgKi8KLSAgLyogICAgICAgICB0aGVtIGludG8gdGhlIFNjaVRlY2ggZXZlbnQgcXVldWUuICovCi0gIGV2ZW50X3QgZXZ0OwotICBYRXZlbnQgIGV2OwotICBzdGF0aWMgaW50IG9sZF9teCA9IDAsIG9sZF9teSA9IDAsIGJ1dHMgPSAwLCBjOwotICBjaGFyIGJ1ZlsyXTsKLQotICB3aGlsZSAoWFBlbmRpbmcoX0VWVF9kcHkpICYmIFhOZXh0RXZlbnQoX0VWVF9kcHksJmV2KSkgewotICAgIGV2dC53aGVuID0gX01HTF9nZXRUaWNrcygpOwotCi0gICAgc3dpdGNoKGV2LnR5cGUpewotICAgIGNhc2UgS2V5UHJlc3M6Ci0gICAgICBjID0gZ2V0U2NhbmNvZGUoZXYueGtleS5rZXljb2RlKTsKLSAgICAgIGV2dC53aGF0ID0gRVZUX0tFWURPV047Ci0gICAgICBldnQubWVzc2FnZSA9IGMgPDwgODsKLSAgICAgIFhMb29rdXBTdHJpbmcoJmV2LnhrZXksIGJ1ZiwgMiwgTlVMTCwgTlVMTCk7Ci0gICAgICBldnQubWVzc2FnZSB8PSBidWZbMF07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEtleVJlbGVhc2U6Ci0gICAgICBjID0gZ2V0U2NhbmNvZGUoZXYueGtleS5rZXljb2RlKTsKLSAgICAgIGV2dC53aGF0ID0gRVZUX0tFWVVQOwotICAgICAgZXZ0Lm1lc3NhZ2UgPSBrZXlVcE1zZ1tjXTsKLSAgICAgIGlmKGNvdW50IDwgRVZFTlRRU0laRSkKLQlhZGRFdmVudCgmZXZ0KTsKLSAgICAgIGtleVVwTXNnW2NdID0gMDsKLSAgICAgIHJlcGVhdEtleVtjXSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJ1dHRvblByZXNzOgotICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOwotICAgICAgaWYoZXYueGJ1dHRvbi5idXR0b24gPT0gMSl7Ci0JYnV0cyB8PSBFVlRfTEVGVEJVVDsKLQlldnQubWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7Ci0gICAgICB9ZWxzZSBpZihldi54YnV0dG9uLmJ1dHRvbiA9PSAyKXsKLQlidXRzIHw9IEVWVF9NSURETEVCVVQ7Ci0JZXZ0Lm1lc3NhZ2UgPSBFVlRfTUlERExFQk1BU0s7Ci0gICAgICB9ZWxzZSBpZihldi54YnV0dG9uLmJ1dHRvbiA9PSAzKXsKLQlidXRzIHw9IEVWVF9SSUdIVEJVVDsKLQlldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOwotICAgICAgfQotICAgICAgZXZ0Lm1vZGlmaWVycyA9IG1vZGlmaWVycyB8IGJ1dHM7Ci0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQnV0dG9uUmVsZWFzZToKLSAgICAgIGV2dC53aGF0ID0gRVZUX01PVVNFVVA7Ci0gICAgICBpZihldi54YnV0dG9uLmJ1dHRvbiA9PSAxKXsKLQlidXRzICY9IH5FVlRfTEVGVEJVVDsKLQlldnQubWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7Ci0gICAgICB9ZWxzZSBpZihldi54YnV0dG9uLmJ1dHRvbiA9PSAyKXsKLQlidXRzICY9IH5FVlRfTUlERExFQlVUOwotCWV2dC5tZXNzYWdlID0gRVZUX01JRERMRUJNQVNLOwotICAgICAgfWVsc2UgaWYoZXYueGJ1dHRvbi5idXR0b24gPT0gMyl7Ci0JYnV0cyAmPSB+RVZUX1JJR0hUQlVUOwotCWV2dC5tZXNzYWdlID0gRVZUX1JJR0hUQk1BU0s7Ci0gICAgICB9Ci0gICAgICBldnQubW9kaWZpZXJzID0gbW9kaWZpZXJzIHwgYnV0czsKLQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNb3Rpb25Ob3RpZnk6Ci0gICAgICBldnQud2hhdCA9IEVWVF9NT1VTRU1PVkU7Ci0gICAgICBldnQud2hlcmVfeCA9IGV2Lnhtb3Rpb24ueDsKLSAgICAgIGV2dC53aGVyZV95ID0gZXYueG1vdGlvbi55OwotICAgICAgZXZ0LnJlbGF0aXZlX3ggPSBldnQud2hlcmVfeCAtIG9sZF9teDsKLSAgICAgIGV2dC5yZWxhdGl2ZV95ID0gZXZ0LndoZXJlX3kgLSBvbGRfbXk7Ci0gICAgICBvbGRfbXggPSBldnQud2hlcmVfeDsKLSAgICAgIG9sZF9teSA9IGV2dC53aGVyZV95OwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChjb3VudCA8IEVWRU5UUVNJWkUpCi0gICAgICBhZGRFdmVudCgmZXZ0KTsKLSAgfQotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBtYWNyby9mdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnRzIHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZQota2V5Ym9hcmQgdG8gb3VyIGV2ZW50IGxpYnJhcmllcyBub3JtYWxpc2VkIGZvcm1hdC4gV2Ugb25seSBoYXZlIG9uZSBzY2FuCi1jb2RlIGZvciB0aGUgJ0EnIGtleSwgYW5kIHVzZSBzaGlmdCBtb2RpZmllcnMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEKLUN0cmwtRjEsIEFsdC1GMSBldGMuIFRoZSByYXcgc2NhbiBjb2RlcyBmcm9tIHRoZSBrZXlib2FyZCB3b3JrIHRoaXMgd2F5LAotYnV0IHRoZSBPUyBnaXZlcyB1cyAnY29va2VkJyBzY2FuIGNvZGVzLCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSB0aGVtIGJhY2sKLXRvIHRoZSByYXcgZm9ybWF0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9tYXNrS2V5Q29kZShldnQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2FmZWx5IGFib3J0IHRoZSBldmVudCBtb2R1bGUgdXBvbiBjYXRjaGluZyBhIGZhdGFsIGVycm9yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9hYm9ydCgpCi17Ci0gICAgRVZUX2V4aXQoKTsKLSAgICBQTV9mYXRhbEVycm9yKCJVbmhhbmRsZWQgZXhjZXB0aW9uISIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1vdXNlTW92ZSAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuZXZlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZAotCi1SRU1BUktTOgotSW5pdGlsaWFzZSB0aGUgZXZlbnQgaGFuZGxpbmcgbW9kdWxlLiBIZXJlIHdlIGluc3RhbGwgb3VyIG1vdXNlIGhhbmRsaW5nIElTUgotdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGFueSBidXR0b24ncyBhcmUgcHJlc3NlZCBvciByZWxlYXNlZC4gV2UgYWxzbyBidWlsZAotdGhlIGZyZWUgbGlzdCBvZiBldmVudHMgaW4gdGhlIGV2ZW50IHF1ZXVlLgotCi1XZSB1c2UgaGFuZGxlciBudW1iZXIgMiBvZiB0aGUgbW91c2UgbGlicmFyaWVzIGludGVycnVwdCBoYW5kbGVycyBmb3Igb3VyCi1ldmVudCBoYW5kbGluZyByb3V0aW5lcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgWDExX0NPUkUKLXZvaWQgRVZUQVBJIEVWVF9pbml0WDExKAotI2Vsc2UKLXZvaWQgRVZUQVBJIEVWVF9pbml0KAotI2VuZGlmCi0gICAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyIG1vdXNlTW92ZSkKLXsKLSAgaW50IHJlc3VsdCwgaSxqLGs7Ci0gIFhEZXZpY2VJbmZvUHRyICAgIGxpc3Qsc2xpc3Q7Ci0KLSAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KLSAgX21vdXNlTW92ZSA9IG1vdXNlTW92ZTsKLSAgaW5pdEV2ZW50UXVldWUoKTsKLSAgbWVtc2V0KGtleVVwTXNnLDAsc2l6ZW9mKGtleVVwTXNnKSk7Ci0KLQotICAvKiBxdWVyeSBzZXJ2ZXIgZm9yIGlucHV0IGV4dGVuc2lvbnMgKi8KLSAgcmVzdWx0ID1YUXVlcnlFeHRlbnNpb24oX0VWVF9kcHksIlhJbnB1dEV4dGVuc2lvbiIsJmksJmosJmspOwotICBpZighcmVzdWx0KSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIllvdXIgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCBYSW5wdXQgRXh0ZW5zaW9uc1xuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsIlgxMSBKb3lzdGljayBkaXNhYmxlZFxuIik7Ci0gIH0KLSAgbGlzdCA9IFhMaXN0SW5wdXREZXZpY2VzKF9FVlRfZHB5LCZyZXN1bHQpOwotICBpZiAoIWxpc3QpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwiTm8gZXh0ZW5kZWQgaW5wdXQgZGV2aWNlcyBmb3VuZCAhIVxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsIlgxMSBKb3lzdGljayBkaXNhYmxlZFxuIik7Ci0gIH0KLQotCi0gIC8qIENhdGNoIHByb2dyYW0gdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KLSAgc2lnbmFsKFNJR0FCUlQsIF9FVlRfYWJvcnQpOwotICBzaWduYWwoU0lHRlBFLCBfRVZUX2Fib3J0KTsKLSAgc2lnbmFsKFNJR0lOVCwgX0VWVF9hYm9ydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1DaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQotc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcwotbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMpCi17Ci0gICAgcmFuZ2VYID0geFJlczsKLSAgICByYW5nZVkgPSB5UmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWlsaXNlcyB0aGUgaW50ZXJuYWwgZXZlbnQgaGFuZGxpbmcgbW9kdWxlcy4gVGhlIEVWVF9zdXNwZW5kIGZ1bmN0aW9uCi1jYW4gYmUgY2FsbGVkIHRvIHN1c3BlbmQgZXZlbnQgaGFuZGxpbmcgKHN1Y2ggYXMgd2hlbiBzaGVsbGluZyBvdXQgdG8gRE9TKSwKLWFuZCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3VtZSBpdCBhZ2FpbiBsYXRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9yZXN1bWUodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBub24gRE9TIHN5c3RlbXMgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLVN1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KLWRlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfc3VzcGVuZCh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIG5vbiBET1Mgc3lzdGVtcyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX2V4aXQodm9pZCkKLXsKLSAgICAvKiBSZXN0b3JlIHNpZ25hbCBoYW5kbGVycyAqLwotICAgIHNpZ25hbChTSUdBQlJULCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHRlBFLCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKLQotICAgIC8qIFRPRE86IERvIGFueSBPUyBzcGVjaWZpYyBjbGVhbnVwIGluIGhlcmUgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLVNldHMgdGhlIGN1cnJlbnQgWDExIGRpc3BsYXkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9zZXRYMTFEaXNwbGF5KERpc3BsYXkgKmRweSwgV2luZG93IHdpbikKLXsKLSAgX0VWVF9kcHkgPSBkcHk7Ci0gIF9FVlRfd2luID0gd2luOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0veDExL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS94MTEvb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkNzQ1MS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS94MTEvb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEJlT1MKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPFgxMS9YbGliLmg+Ci0jaW5jbHVkZSA8WDExL2tleXN5bS5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZmRlZiBVU0VfT1NfSk9ZU1RJQ0sKLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YSS5oPgotI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hJbnB1dC5oPgotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS96X3NhbXBsZXMudnBqIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vel9zYW1wbGVzLnZwagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM2YzgwZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS96X3NhbXBsZXMudnBqCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotW1NjaVRlY2hdDQotY29tcGlsZXI9d2MxMC0gDQotdGFyZ2V0b3M9ZDMyIA0KLVtDT01QSUxFUl0NCi12ZXJzaW9uPTUuMGINCi1NQUNSTz1lbmFibGVfY3VycmVudF9jb21waWxlclxuDQotYWN0aXZlY29uZmlnPSxnZXRjaC5leGUNCi1GSUxURVJOQU1FPVNvdXJjZSBGaWxlc1xuDQotRklMVEVSUEFUVEVSTj0qLmM7Ki5jcHA7Ki5jeHg7Ki5wcmc7Ki5wYXM7Ki5kcHI7Ki5iYXM7Ki5qYXZhOyouc2M7Ki5lOyouY29iOyouaHRtbDsqLnJjXG4NCi1GSUxURVJBU1NPQ0lBVEVGSUxFVFlQRVM9MCANCi1GSUxURVJBUFBDT01NQU5EPVxuDQotdmNzcHJvamVjdD1TQ0M6UGVyZm9yY2UgU0NNOi8vZGVwb3QNCi12Y3Nsb2NhbHBhdGg9U0NDOlBlcmZvcmNlIFNDTTpjOlwNCi1jb21waWxlPWNvbmN1cnxjYXB0dXJlfDpDb21waWxlOiZDb21waWxlLGRtYWtlICVuLm9iag0KLW1ha2U9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZWFsbHw6QnVpbGQ6JkJ1aWxkLGRtYWtlICViDQotcmVidWlsZD1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpSZWJ1aWxkOiZSZWJ1aWxkLGRtYWtlIC11ICViDQotZGVidWc9Y29uY3VyfGNhcHR1cmV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkRlYnVnOiZEZWJ1Zyx3ZG4gJWINCi1leGVjdXRlPWhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkV4ZWN1dGU6RSZ4ZWN1dGUsDQotdXNlcjE9aGlkZXxub2NoYW5nZWRpcnw6VXNlciAxOlVzZXIgMSwNCi11c2VyMj1oaWRlfG5vY2hhbmdlZGlyfDpVc2VyIDI6VXNlciAyLA0KLXVzZXJ0b29sX2J1aWxkX2FsbD1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlbm9uZXw6QnVpbGQgQWxsOkJ1aWxkIEFsbCxkbWFrZSBhbGwNCi11c2VydG9vbF9yZWJ1aWxkX2FsbD1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlbm9uZXw6UmVidWlsZCBBbGw6UmVidWlsZCBBbGwsZG1ha2UgLXUgYWxsDQotdXNlcnRvb2xfY2xlYW5fZGlyZWN0b3J5PWNvbmN1cnxjYXB0dXJlfHNhdmVub25lfDpDbGVhbiBEaXJlY3Rvcnk6JkNsZWFuIERpcmVjdG9yeSxkbWFrZSBjbGVhbmV4ZQ0KLXdvcmtpbmdkaXI9Lg0KLWluY2x1ZGVkaXJzPSUoU0NJVEVDSClcaW5jbHVkZTslKFBSSVZBVEUpXGluY2x1ZGUNCi1yZWZmaWxlPQ0KLVtGSUxFU10NCi10ZXN0c1xhbHRicmsuYw0KLXRlc3RzXGFsdGNyaXQuYw0KLXRlc3RzXGJpb3NwdHIuYw0KLXRlc3RzXGJsb2NrLmMNCi10ZXN0c1xicmsuYw0KLXRlc3RzXGNhbGxyZWFsLmMNCi10ZXN0c1xjaGVja3MuYw0KLXRlc3RzXGNwdS5jDQotdGVzdHNcY3JpdGljYWwuYw0KLXRlc3RzXGdldGNoLmMNCi10ZXN0c1xpc3Zlc2EuYw0KLXRlc3RzXGtleS5jDQotdGVzdHNca2V5MTUuYw0KLXRlc3RzXG1lbXRlc3QuYw0KLXRlc3RzXG1vdXNlLmMNCi10ZXN0c1xydGMuYw0KLXRlc3RzXHNob3dwY2kuYw0KLXRlc3RzXHRpY2suYw0KLXRlc3RzXHRpbWVyYy5jDQotdGVzdHNcdGltZXJjcHAuY3BwDQotdGVzdHNcdXN3Yy5jDQotdGVzdHNcdmZ0ZXN0LmMNCi10ZXN0c1x2aWRlby5jDQotW0FTU09DSUFUSU9OXQ0KLVtDT05GSUdVUkFUSU9OU10NCi1jb25maWc9LGFsdGJyay5leGUNCi1jb25maWc9LGFsdGNyaXQuZXhlDQotY29uZmlnPSxiaW9zcHRyLmV4ZQ0KLWNvbmZpZz0sYmxvY2suZXhlDQotY29uZmlnPSxicmsuZXhlDQotY29uZmlnPSxjYWxscmVhbC5leGUNCi1jb25maWc9LGNwdS5leGUNCi1jb25maWc9LGNyaXRpY2FsLmV4ZQ0KLWNvbmZpZz0sZ2V0Y2guZXhlDQotY29uZmlnPSxpc3Zlc2EuZXhlDQotY29uZmlnPSxrZXkuZXhlDQotY29uZmlnPSxrZXkxNS5leGUNCi1jb25maWc9LG1lbXRlc3QuZXhlDQotY29uZmlnPSxtb3VzZS5leGUNCi1jb25maWc9LHJ0Yy5leGUNCi1jb25maWc9LHNob3dwY2kuZXhlDQotY29uZmlnPSx0aWNrLmV4ZQ0KLWNvbmZpZz0sdGltZXJjLmV4ZQ0KLWNvbmZpZz0sdGltZXJjcHAuZXhlDQotY29uZmlnPSx1c3djLmV4ZQ0KLWNvbmZpZz0sdmZ0ZXN0LmV4ZQ0KLWNvbmZpZz0sdmlkZW8uZXhlDQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0venRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS96dGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjZjdiMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS96dGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDUxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBNb2R1bGUgdG8gaW1wbGVtZW50IGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBvbiBlYWNoIE9TLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInp0aW1lci5oIgotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAib3NoZHIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIExaVGltZXJPYmplY3QgICAgTFpUaW1lcjsKLXN0YXRpYyB1bG9uZyAgICAgICAgICAgIHN0YXJ0LGZpbmlzaDsKLSNpZmRlZiAgX19JTlRFTF9fCi1zdGF0aWMgbG9uZyAgICAgICAgICAgICBjcHVTcGVlZCA9IC0xOwotc3RhdGljIGlib29sICAgICAgICAgICAgaGF2ZVJEVFNDID0gZmFsc2U7Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRXh0ZXJuYWwgSW50ZWwgYXNzZW1ibGVyIGZ1bmN0aW9ucyAqLwotI2lmZGVmICBfX0lOVEVMX18KLS8qIHtzZWNyZXR9ICovCi12b2lkICBfQVNNQVBJIF9DUFVfcmVhZFRpbWVTdGFtcChDUFVfbGFyZ2VJbnRlZ2VyICp0aW1lKTsKLS8qIHtzZWNyZXR9ICovCi11bG9uZyBfQVNNQVBJIF9DUFVfZGlmZlRpbWU2NChDUFVfbGFyZ2VJbnRlZ2VyICp0MSxDUFVfbGFyZ2VJbnRlZ2VyICp0MixDUFVfbGFyZ2VJbnRlZ2VyICp0KTsKLS8qIHtzZWNyZXR9ICovCi11bG9uZyBfQVNNQVBJIF9DUFVfY2FsY01pY3JvU2VjKENQVV9sYXJnZUludGVnZXIgKmNvdW50LHVsb25nIGZyZXEpOwotI2VuZGlmCi0KLSNpZiAgICAgZGVmaW5lZChfX1NNWDMyX18pCi0jaW5jbHVkZSAic214L3p0aW1lci5jIgotI2VsaWYgICBkZWZpbmVkKF9fUlRUQVJHRVRfXykKLSNpbmNsdWRlICJydHRhcmdldC96dGltZXIuYyIKLSNlbGlmICAgZGVmaW5lZChfX1JFQUxET1NfXykKLSNpbmNsdWRlICJkb3MvenRpbWVyLmMiCi0jZWxpZiAgIGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlICJudGRydi96dGltZXIuYyIKLSNlbGlmICAgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKQotI2luY2x1ZGUgInZ4ZC96dGltZXIuYyIKLSNlbGlmICAgZGVmaW5lZChfX1dJTkRPV1MzMl9fKQotI2luY2x1ZGUgIndpbjMyL3p0aW1lci5jIgotI2VsaWYgICBkZWZpbmVkKF9fT1MyX1ZERF9fKQotI2luY2x1ZGUgInZkZC96dGltZXIuYyIKLSNlbGlmICAgZGVmaW5lZChfX09TMl9fKQotI2luY2x1ZGUgIm9zMi96dGltZXIuYyIKLSNlbGlmICAgZGVmaW5lZChfX0xJTlVYX18pCi0jaW5jbHVkZSAibGludXgvenRpbWVyLmMiCi0jZWxpZiAgIGRlZmluZWQoX19RTlhfXykKLSNpbmNsdWRlICJxbngvenRpbWVyLmMiCi0jZWxpZiAgIGRlZmluZWQoX19CRU9TX18pCi0jaW5jbHVkZSAiYmVvcy96dGltZXIuYyIKLSNlbHNlCi0jZXJyb3IgIFRpbWVyIGxpYnJhcnkgbm90IHBvcnRlZCB0byB0aGlzIHBsYXRmb3JtIHlldCEKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgaW50ZXJmYWNlIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1Jbml0aWFsaXplcyB0aGUgWmVuIFRpbWVyIGxpYnJhcnkgKGV4dGVuZGVkKQotCi1QQVJBTUVURVJTOgotYWNjdXJhdGUgICAgLSBUcnVlIG9mIHRoZSBzcGVlZCBzaG91bGQgYmUgbWVhc3VyZWQgYWNjdXJhdGVseQotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgWmVuIFRpbWVyIGxpYnJhcnksIGFuZCAvbXVzdC8gYmUgY2FsbGVkIGJlZm9yZQotYW55IG9mIHRoZSByZW1haW5pbmcgWmVuIFRpbWVyIGxpYnJhcnkgZnVuY3Rpb25zIGFyZSBjYWxsZWQuIFRoZSBhY2N1cmF0ZQotcGFyYW1ldGVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaGlnaGx5IGFjY3VyYXRlIHRpbWluZyBzaG91bGQgYmUKLXVzZWQgb3Igbm90LiBJZiBoaWdoIGFjY3VyYWN5IGlzIG5lZWRlZCwgbW9yZSB0aW1lIGlzIHNwZW50IHByb2ZpbGluZyB0aGUKLWFjdHVhbCBzcGVlZCBvZiB0aGUgQ1BVIHNvIHRoYXQgd2UgY2FuIG9idGFpbiBoaWdobHkgYWNjdXJhdGUgdGltaW5nCi1yZXN1bHRzLCBidXQgdGhlIHRpbWUgc3BlbnQgaW4gdGhlIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUgd2lsbCBiZQotc2lnbmlmaWNhbnRseSBsb25nZXIgKG9uIHRoZSBvcmRlciBvZiA1IHNlY29uZHMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWkFQSSBaVGltZXJJbml0RXh0KAotICAgIGlib29sIGFjY3VyYXRlKQotewotICAgIGlmIChjcHVTcGVlZCA9PSAtMSkgewotCV9fWlRpbWVySW5pdCgpOwotI2lmZGVmICBfX0lOVEVMX18KLQljcHVTcGVlZCA9IENQVV9nZXRQcm9jZXNzb3JTcGVlZEluSFooYWNjdXJhdGUpOwotCWhhdmVSRFRTQyA9IENQVV9oYXZlUkRUU0MoKSAmJiAoY3B1U3BlZWQgPiAwKTsKLSNlbmRpZgotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotSW5pdGlhbGl6ZXMgdGhlIFplbiBUaW1lciBsaWJyYXJ5LgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgWmVuIFRpbWVyIGxpYnJhcnksIGFuZCAvbXVzdC8gYmUgY2FsbGVkIGJlZm9yZQotYW55IG9mIHRoZSByZW1haW5pbmcgWmVuIFRpbWVyIGxpYnJhcnkgZnVuY3Rpb25zIGFyZSBjYWxsZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBaQVBJIFpUaW1lckluaXQodm9pZCkKLXsKLSAgICBaVGltZXJJbml0RXh0KGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotU3RhcnRzIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIgY291bnRpbmcuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVBBUkFNRVRFUlM6Ci10bSAgLSBUaW1lciBvYmplY3QgdG8gc3RhcnQgdGltaW5nIHdpdGgKLQotUkVNQVJLUzoKLVN0YXJ0cyB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGNvdW50aW5nLiBPbmNlIHlvdSBoYXZlIHN0YXJ0ZWQgdGhlIHRpbWVyLAoteW91IGNhbiBzdG9wIGl0IHdpdGggTFpUaW1lck9mZiBvciB5b3UgY2FuIGxhdGNoIHRoZSBjdXJyZW50IGNvdW50IHdpdGgKLUxaVGltZXJMYXAuCi0KLVRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIgdXNlcyBhIG51bWJlciBvZiBkaWZmZXJlbnQgaGlnaCBwcmVjaXNpb24gdGltaW5nCi1tZWNoYW5pc21zIHRvIG9idGFpbiBtaWNyb3NlY29uZCBhY2N1cmF0ZSB0aW1pbmdzIHJlc3VsdHMgd2hlbmV2ZXIgcG9zc2libGUuCi1UaGUgZm9sbG93aW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIGFyZSB1c2VkIGRlcGVuZGluZyBvbiB0aGUgb3BlcmF0aW5nCi1zeXN0ZW0sIHJ1bnRpbWUgZW52aXJvbm1lbnQgYW5kIENQVSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuIElmIHRoZSB0YXJnZXQKLXN5c3RlbSBoYXMgYSBQZW50aXVtIENQVSBpbnN0YWxsZWQgd2hpY2ggc3VwcG9ydHMgdGhlIFJlYWQgVGltZSBTdGFtcAotQ291bnRlciBpbnN0cnVjdGlvbiAoUkRUU0MpLCB0aGUgWmVuIFRpbWVyIGxpYnJhcnkgd2lsbCB1c2UgdGhpcyB0bwotb2J0YWluIHRoZSBtYXhpbXVtIHRpbWluZyBwcmVjaXNpb24gYXZhaWxhYmxlLgotCi1VbmRlciAzMi1iaXQgV2luZG93cywgaWYgdGhlIFBlbnRpdW0gUkRUU0MgaW5zdHJ1Y3Rpb24gaXMgbm90IGF2YWlsYWJsZSwgd2UKLWZpcnN0IHRyeSB0byB1c2UgdGhlIFdpbjMyIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyIEFQSSwgYW5kIGlmIHRoYXQgaXMgbm90Ci1hdmFpbGFibGUgd2UgZmFsbCBiYWNrIG9uIHRoZSB0aW1lR2V0VGltZSBBUEkgd2hpY2ggaXMgYWx3YXlzIHN1cHBvcnRlZC4KLQotVW5kZXIgMzItYml0IERPUywgaWYgdGhlIFBlbnRpdW0gUkRUU0MgaW5zdHJ1Y3Rpb24gaXMgbm90IGF2YWlsYWJsZSwgd2UKLXRoZW4gZG8gYWxsIHRpbWluZyB1c2luZyB0aGUgb2xkIHN0eWxlIDgyNTMgdGltZXIgY2hpcC4gVGhlIDgyNTMgdGltZXIKLXJvdXRpbmVzIHByb3ZpZGUgaGlnaGx5IGFjY3VyYXRlIHRpbWluZ3MgcmVzdWx0cyBpbiBwdXJlIERPUyBtb2RlLCBob3dldmVyCi1pbiBhIERPUyBib3ggdW5kZXIgV2luZG93cyBvciBvdGhlciBPcGVyYXRpbmcgU3lzdGVtcyB0aGUgdmlydHVhbGl6YXRpb24KLW9mIHRoZSB0aW1lciBjYW4gcHJvZHVjZSBpbmFjY3VyYXRlIHJlc3VsdHMuCi0KLU5vdGU6IEJlY2F1c2UgdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lciBzdG9yZXMgdGhlIHJlc3VsdHMgaW4gYSAzMi1iaXQKLSAgICAgIHVuc2lnbmVkIGludGVnZXIsIHlvdSBjYW4gb25seSB0aW1lIHBlcmlvZHMgb2YgdXAgdG8gMl4zMiBtaWNyb3NlY29uZHMsCi0gICAgICBvciBhYm91dCAxaHIgMjBtaW5zLiBGb3IgdGltaW5nIGxvbmdlciBwZXJpb2RzIHVzZSB0aGUgVWx0cmEgTG9uZwotICAgICAgUGVyaW9kIFplbiBUaW1lci4KLQotU0VFIEFMU086Ci1MWlRpbWVyT2ZmLCBMWlRpbWVyTGFwLCBMWlRpbWVyQ291bnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFpBUEkgTFpUaW1lck9uRXh0KAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotI2lmZGVmICBfX0lOVEVMX18KLSAgICBpZiAoaGF2ZVJEVFNDKSB7Ci0JX0NQVV9yZWFkVGltZVN0YW1wKCZ0bS0+c3RhcnQpOwotCX0KLSAgICBlbHNlCi0jZW5kaWYKLQlfX0xaVGltZXJPbih0bSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgZm9yIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIgYW5kIGtlZXBzIGl0Ci1ydW5uaW5nLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1QQVJBTUVURVJTOgotdG0gIC0gVGltZXIgb2JqZWN0IHRvIGRvIGxhcCB0aW1pbmcgd2l0aAotCi1SRVRVUk5TOgotQ291bnQgdGhhdCBoYXMgZWxhcHNlZCBpbiBtaWNyb3NlY29uZHMuCi0KLVJFTUFSS1M6Ci1SZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IHRoYXQgaGFzIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0bwotTFpUaW1lck9uIGluIG1pY3Jvc2Vjb25kcy4gVGhlIHRpbWUgY29udGludWVzIHRvIHJ1biBhZnRlciB0aGlzIGZ1bmN0aW9uIGlzCi1jYWxsZWQgc28geW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gcmVwZWF0ZWRseS4KLQotU0VFIEFMU086Ci1MWlRpbWVyT24sIExaVGltZXJPZmYsIExaVGltZXJDb3VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFpBUEkgTFpUaW1lckxhcEV4dCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSNpZmRlZiAgX19JTlRFTF9fCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAgICB0bUxhcCx0bUNvdW50OwotCi0gICAgaWYgKGhhdmVSRFRTQykgewotCV9DUFVfcmVhZFRpbWVTdGFtcCgmdG1MYXApOwotCV9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LCZ0bUxhcCwmdG1Db3VudCk7Ci0JcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGNwdVNwZWVkKTsKLQl9Ci0gICAgZWxzZQotI2VuZGlmCi0JcmV0dXJuIF9fTFpUaW1lckxhcCh0bSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVN0b3BzIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIgY291bnRpbmcuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVBBUkFNRVRFUlM6Ci10bSAgLSBUaW1lciBvYmplY3QgdG8gc3RvcCB0aW1pbmcgd2l0aAotCi1SRU1BUktTOgotU3RvcHMgdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lciBjb3VudGluZyBhbmQgbGF0Y2hlcyB0aGUgY291bnQuIE9uY2UgeW91Ci1oYXZlIHN0b3BwZWQgdGhlIHRpbWVyIHlvdSBjYW4gcmVhZCB0aGUgY291bnQgd2l0aCBMWlRpbWVyQ291bnQuIElmIHlvdSBuZWVkCi1oaWdobHkgYWNjdXJhdGUgdGltaW5nLCB5b3Ugc2hvdWxkIHVzZSB0aGUgb24gYW5kIG9mZiBmdW5jdGlvbnMgcmF0aGVyIHRoYW4KLXRoZSBsYXAgZnVuY3Rpb24gc2luY2UgdGhlIGxhcCBmdW5jdGlvbiBkb2VzIG5vdCBzdWJ0cmFjdCB0aGUgb3ZlcmhlYWQgb2YKLXRoZSBmdW5jdGlvbiBjYWxscyBmcm9tIHRoZSB0aW1lZCBjb3VudC4KLQotU0VFIEFMU086Ci1MWlRpbWVyT24sIExaVGltZXJMYXAsIExaVGltZXJDb3VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWkFQSSBMWlRpbWVyT2ZmRXh0KAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotI2lmZGVmICBfX0lOVEVMX18KLSAgICBpZiAoaGF2ZVJEVFNDKSB7Ci0JX0NQVV9yZWFkVGltZVN0YW1wKCZ0bS0+ZW5kKTsKLQl9Ci0gICAgZWxzZQotI2VuZGlmCi0JX19MWlRpbWVyT2ZmKHRtKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBmb3IgdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lci4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUEFSQU1FVEVSUzoKLXRtICAtIFRpbWVyIG9iamVjdCB0byBjb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgd2l0aC4KLQotUkVUVVJOUzoKLUNvdW50IHRoYXQgaGFzIGVsYXBzZWQgaW4gbWljcm9zZWNvbmRzLgotCi1SRU1BUktTOgotUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCB0aGF0IGhhcyBlbGFwc2VkIGJldHdlZW4gY2FsbHMgdG8KLUxaVGltZXJPbiBhbmQgTFpUaW1lck9mZiBpbiBtaWNyb3NlY29uZHMuCi0KLVNFRSBBTFNPOgotTFpUaW1lck9uLCBMWlRpbWVyT2ZmLCBMWlRpbWVyTGFwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgWkFQSSBMWlRpbWVyQ291bnRFeHQoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0jaWZkZWYgIF9fSU5URUxfXwotICAgIENQVV9sYXJnZUludGVnZXIgICAgdG1Db3VudDsKLQotICAgIGlmIChoYXZlUkRUU0MpIHsKLQlfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmdG0tPmVuZCwmdG1Db3VudCk7Ci0JcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGNwdVNwZWVkKTsKLQl9Ci0gICAgZWxzZQotI2VuZGlmCi0JcmV0dXJuIF9fTFpUaW1lckNvdW50KHRtKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotU3RhcnRzIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIgY291bnRpbmcuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVJFTUFSS1M6Ci1PYnNvbGV0ZSBmdW5jdGlvbi4gWW91IHNob3VsZCB1c2UgdGhlIExaVGltZXJPbkV4dCBmdW5jdGlvbiBpbnN0ZWFkCi13aGljaCBhbGxvd3MgZm9yIG11bHRpcGxlIHRpbWVycyBydW5uaW5nIGF0IHRoZSBzYW1lIHRpbWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBaQVBJIExaVGltZXJPbih2b2lkKQoteyBMWlRpbWVyT25FeHQoJkxaVGltZXIpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgZm9yIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIgYW5kIGtlZXBzIGl0Ci1ydW5uaW5nLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRVRVUk5TOgotQ291bnQgdGhhdCBoYXMgZWxhcHNlZCBpbiBtaWNyb3NlY29uZHMuCi0KLVJFTUFSS1M6Ci1PYnNvbGV0ZSBmdW5jdGlvbi4gWW91IHNob3VsZCB1c2UgdGhlIExaVGltZXJMYXBFeHQgZnVuY3Rpb24gaW5zdGVhZAotd2hpY2ggYWxsb3dzIGZvciBtdWx0aXBsZSB0aW1lcnMgcnVubmluZyBhdCB0aGUgc2FtZSB0aW1lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFpBUEkgTFpUaW1lckxhcCh2b2lkKQoteyByZXR1cm4gTFpUaW1lckxhcEV4dCgmTFpUaW1lcik7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotU3RvcHMgdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lciBjb3VudGluZy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVNQVJLUzoKLU9ic29sZXRlIGZ1bmN0aW9uLiBZb3Ugc2hvdWxkIHVzZSB0aGUgTFpUaW1lck9mZkV4dCBmdW5jdGlvbiBpbnN0ZWFkCi13aGljaCBhbGxvd3MgZm9yIG11bHRpcGxlIHRpbWVycyBydW5uaW5nIGF0IHRoZSBzYW1lIHRpbWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBaQVBJIExaVGltZXJPZmYodm9pZCkKLXsgTFpUaW1lck9mZkV4dCgmTFpUaW1lcik7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBmb3IgdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lci4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLUNvdW50IHRoYXQgaGFzIGVsYXBzZWQgaW4gbWljcm9zZWNvbmRzLgotCi1SRU1BUktTOgotT2Jzb2xldGUgZnVuY3Rpb24uIFlvdSBzaG91bGQgdXNlIHRoZSBMWlRpbWVyQ291bnRFeHQgZnVuY3Rpb24gaW5zdGVhZAotd2hpY2ggYWxsb3dzIGZvciBtdWx0aXBsZSB0aW1lcnMgcnVubmluZyBhdCB0aGUgc2FtZSB0aW1lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFpBUEkgTFpUaW1lckNvdW50KHZvaWQpCi17IHJldHVybiBMWlRpbWVyQ291bnRFeHQoJkxaVGltZXIpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVN0YXJ0cyB0aGUgVWx0cmEgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGNvdW50aW5nLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRU1BUktTOgotU3RhcnRzIHRoZSBVbHRyYSBMb25nIFBlcmlvZCBaZW4gVGltZXIgY291bnRpbmcuIE9uY2UgeW91IGhhdmUgc3RhcnRlZCB0aGUKLXRpbWVyLCB5b3UgY2FuIHN0b3AgaXQgd2l0aCBVTFpUaW1lck9mZiBvciB5b3UgY2FuIGxhdGNoIHRoZSBjdXJyZW50IGNvdW50Ci13aXRoIFVMWlRpbWVyTGFwLgotCi1UaGUgVWx0cmEgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIHVzZXMgdGhlIGF2YWlsYWJsZSBvcGVyYXRpbmcgc3lzdGVtIHNlcnZpY2VzCi10byBvYnRhaW4gYWNjdXJhdGUgdGltaW5ncyByZXN1bHRzIHdpdGggYXMgbXVjaCBwcmVjaXNpb24gYXMgdGhlIG9wZXJhdGluZwotc3lzdGVtIHByb3ZpZGVzLCBidXQgd2l0aCBlbm91Z2ggZ3JhbnVsYXJpdHkgdG8gdGltZSBsb25nZXIgcGVyaW9kcyBvZgotdGltZSB0aGFuIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIuIE5vdGUgdGhhdCB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgdGltZXIKLXRpY2tzIGlzIG5vdCBjb25zdGFudCBiZXR3ZWVuIGRpZmZlcmVudCBwbGF0Zm9ybXMsIGFuZCB5b3Ugc2hvdWxkIHVzZSB0aGUKLVVMWlRpbWVyUmVzb2x1dGlvbiBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzZWNvbmRzIGluIGEgc2luZ2xlCi10aWNrIG9mIHRoZSB0aW1lciwgYW5kIHVzZSB0aGlzIHRvIGNvbnZlcnQgdGhlIHRpbWVyIGNvdW50cyB0byBzZWNvbmRzLgotCi1VbmRlciAzMi1iaXQgV2luZG93cywgd2UgdXNlIHRoZSB0aW1lR2V0VGltZSBmdW5jdGlvbiB3aGljaCBwcm92aWRlcyBhCi1yZXNvbHV0aW9uIG9mIDEgbWlsbGlzZWNvbmQgKDAuMDAxIG9mIGEgc2Vjb25kKS4gR2l2ZW4gdGhhdCB0aGUgdGltZXIKLWNvdW50IGlzIHJldHVybmVkIGFzIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLCB0aGlzIHdlIGNhbiB0aW1lIGludGVydmFscwotdGhhdCBhcmUgYSBtYXhpbXVtIG9mIDJeMzIgbWlsbGlzZWNvbmRzIGluIGxlbmd0aCAob3IgYWJvdXQgMSwyMDAgaG91cnMgb3IKLTUwIGRheXMhKS4KLQotVW5kZXIgMzItYml0IERPUywgd2UgdXNlIHRoZSBzeXN0ZW0gdGltZXIgdGljayB3aGljaCBydW5zIGF0IDE4LjIgdGltZXMgcGVyCi1zZWNvbmQuIEdpdmVuIHRoYXQgdGhlIHRpbWVyIGNvdW50IGlzIHJldHVybmVkIGFzIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLAotdGhpcyB3ZSBjYW4gdGltZSBpbnRlcnZhbHMgdGhhdCBhcmUgYSBtYXhpbXVtIG9mIDJeMzIgKiAoMS8xOC4yKSBpbiBsZW5ndGgKLShvciBhYm91dCA2NSw1NTAgaG91cnMgb3IgMjczMSBkYXlzISkuCi0KLVNFRSBBTFNPOgotVUxaVGltZXJPZmYsIFVMWlRpbWVyTGFwLCBVTFpUaW1lckNvdW50LCBVTFpFbGFwc2VkVGltZSwgVUxaUmVhZFRpbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFpBUEkgVUxaVGltZXJPbih2b2lkKQoteyBzdGFydCA9IF9fVUxaUmVhZFRpbWUoKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IGZvciB0aGUgVWx0cmEgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGFuZCBrZWVwcyBpdAotcnVubmluZy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLUNvdW50IHRoYXQgaGFzIGVsYXBzZWQgaW4gcmVzb2x1dGlvbiBjb3VudHMuCi0KLVJFTUFSS1M6Ci1SZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IHRoYXQgaGFzIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0bwotVUxaVGltZXJPbiBpbiBtaWNyb3NlY29uZHMuIFRoZSB0aW1lIGNvbnRpbnVlcyB0byBydW4gYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcwotY2FsbGVkIHNvIHlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHJlcGVhdGVkbHkuCi0KLVNFRSBBTFNPOgotVUxaVGltZXJPbiwgVUxaVGltZXJPZmYsIFVMWlRpbWVyQ291bnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBaQVBJIFVMWlRpbWVyTGFwKHZvaWQpCi17IHJldHVybiAoX19VTFpSZWFkVGltZSgpIC0gc3RhcnQpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVN0b3BzIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIgY291bnRpbmcuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVJFTUFSS1M6Ci1TdG9wcyB0aGUgVWx0cmEgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGNvdW50aW5nIGFuZCBsYXRjaGVzIHRoZSBjb3VudC4gT25jZQoteW91IGhhdmUgc3RvcHBlZCB0aGUgdGltZXIgeW91IGNhbiByZWFkIHRoZSBjb3VudCB3aXRoIFVMWlRpbWVyQ291bnQuCi0KLVNFRSBBTFNPOgotVUxaVGltZXJPbiwgVUxaVGltZXJMYXAsIFVMWlRpbWVyQ291bnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFpBUEkgVUxaVGltZXJPZmYodm9pZCkKLXsgZmluaXNoID0gX19VTFpSZWFkVGltZSgpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgZm9yIHRoZSBVbHRyYSBMb25nIFBlcmlvZCBaZW4gVGltZXIuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVJFVFVSTlM6Ci1Db3VudCB0aGF0IGhhcyBlbGFwc2VkIGluIHJlc29sdXRpb24gY291bnRzLgotCi1SRU1BUktTOgotUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCB0aGF0IGhhcyBlbGFwc2VkIGJldHdlZW4gY2FsbHMgdG8KLVVMWlRpbWVyT24gYW5kIFVMWlRpbWVyT2ZmIGluIHJlc29sdXRpb24gY291bnRzLgotCi1TRUUgQUxTTzoKLVVMWlRpbWVyT24sIFVMWlRpbWVyT2ZmLCBVTFpUaW1lckxhcCwgVUxaVGltZXJSZXNvbHV0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgWkFQSSBVTFpUaW1lckNvdW50KHZvaWQpCi17IHJldHVybiAoZmluaXNoIC0gc3RhcnQpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJlYWRzIHRoZSBjdXJyZW50IHRpbWUgZnJvbSB0aGUgVWx0cmEgTG9uZyBQZXJpb2QgWmVuIFRpbWVyLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRVRVUk5TOgotQ3VycmVudCB0aW1lciB2YWx1ZSBpbiByZXNvbHV0aW9uIGNvdW50cy4KLQotUkVNQVJLUzoKLVJlYWRzIHRoZSBjdXJyZW50IFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lciBhbmQgcmV0dXJucyBpdJJzIGN1cnJlbnQKLWNvdW50LiBZb3UgY2FuIHVzZSB0aGUgVUxaRWxhcHNlZFRpbWUgZnVuY3Rpb24gdG8gZmluZCB0aGUgZWxhcHNlZCB0aW1lCi1iZXR3ZWVuIHR3byB0aW1lciBjb3VudCByZWFkaW5ncy4KLQotU0VFIEFMU086Ci1VTFpFbGFwc2VkVGltZSwgVUxaVGltZXJSZXNvbHV0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgWkFQSSBVTFpSZWFkVGltZSh2b2lkKQoteyByZXR1cm4gX19VTFpSZWFkVGltZSgpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUNvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBiZXR3ZWVuIHR3byB0aW1lciBjb3VudHMuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVBBUkFNRVRFUlM6Ci1zdGFydCAgIC0gU3RhcnRpbmcgdGltZSBmb3IgZWxhcHNlZCBjb3VudAotZmluaXNoICAtIEVuZGluZyB0aW1lIGZvciBlbGFwc2VkIGNvdW50Ci0KLVJFVFVSTlM6Ci1FbGFwc2VkIHRpbWVyIGluIHJlc29sdXRpb24gY291bnRzLgotCi1SRU1BUktTOgotUmV0dXJucyB0aGUgZWxhcHNlZCB0aW1lIGZvciB0aGUgVWx0cmEgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGluIHVuaXRzIG9mIHRoZQotdGltZXJzIHJlc29sdXRpb24gKDEvMTh0aCBvZiBhIHNlY29uZCB1bmRlciBET1MpLiBUaGlzIGZ1bmN0aW9uIGNvcnJlY3RseQotY29tcHV0ZXMgdGhlIGRpZmZlcmVuY2UgZXZlbiBpZiBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBiZWVuIGNyb3NzZWQKLWR1cmluZyB0aGUgdGltaW5nIHBlcmlvZC4KLQotU0VFIEFMU086Ci1VTFpSZWFkVGltZSwgVUxaVGltZXJSZXNvbHV0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgWkFQSSBVTFpFbGFwc2VkVGltZSgKLSAgICB1bG9uZyBzdGFydCwKLSAgICB1bG9uZyBmaW5pc2gpCi17IHJldHVybiBfX1VMWkVsYXBzZWRUaW1lKHN0YXJ0LGZpbmlzaCk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgVWx0cmEgTG9uZyBQZXJpb2QgWmVuIFRpbWVyLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1QQVJBTUVURVJTOgotcmVzb2x1dGlvbiAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHRpbWVyIGluIG1pY3Jvc2Vjb25kcyBwZXIgdGltZXIgY291bnQuCi0KLVJFTUFSS1M6Ci1SZXR1cm5zIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBVbHRyYSBMb25nIFBlcmlvZCBaZW4gVGltZXIgYXMgYSAzMi1iaXQKLWludGVnZXIgdmFsdWUgbWVhc3VyZWQgaW4gbWljcm9zZWNvbmRzIHBlciB0aW1lciBjb3VudC4KLQotU0VFIEFMU086Ci1VTFpSZWFkVGltZSwgVUxaRWxhcHNlZFRpbWUsIFVMWlRpbWVyQ291bnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFpBUEkgVUxaVGltZXJSZXNvbHV0aW9uKAotCXVsb25nICpyZXNvbHV0aW9uKQoteyAqcmVzb2x1dGlvbiA9IFVMWlRJTUVSX1JFU09MVVRJT047IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvQXNtTWFjcm9zLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL0FzbU1hY3Jvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2M1NDVhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvQXNtTWFjcm9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotLyogJFhDb25zb3J0aXVtOiBBc21NYWNyb3MuaCAvbWFpbi8xMyAxOTk2LzEwLzI1IDExOjMzOjEyIGthbGViICQgKi8KLS8qCi0gKiAoYykgQ29weXJpZ2h0IDE5OTMsMTk5NCBieSBEYXZpZCBXZXhlbGJsYXQgPGR3ZXhAeGZyZWU4Ni5vcmc+Ci0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBEQVZJRCBXRVhFTEJMQVQgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQotICogU09GVFdBUkUuCi0gKgotICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgRGF2aWQgV2V4ZWxibGF0IHNoYWxsIG5vdCBiZQotICogdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCi0gKiBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gRGF2aWQgV2V4ZWxibGF0LgotICoKLSAqLwotLyoKLSAqIENvcHlyaWdodCAxOTk3Ci0gKiBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgc29mdHdhcmUgaXMgZnVybmlzaGVkIHVuZGVyIGxpY2Vuc2UgYW5kIG1heSBiZSB1c2VkIGFuZCBjb3BpZWQgb25seSBpbgotICogYWNjb3JkYW5jZSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBTdWJqZWN0IHRvIHRoZXNlCi0gKiBjb25kaXRpb25zLCB5b3UgbWF5IGRvd25sb2FkLCBjb3B5LCBpbnN0YWxsLCB1c2UsIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZQotICogdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeSBmb3JtLiBObyB0aXRsZSBvciBvd25lcnNoaXAgaXMKLSAqIHRyYW5zZmVycmVkIGhlcmVieS4KLSAqCi0gKiAxKSBBbnkgc291cmNlIGNvZGUgdXNlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgbXVzdCByZXByb2R1Y2UgYW5kIHJldGFpbgotICogICAgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFuZCBsaXN0IG9mIGNvbmRpdGlvbnMgYXMgdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZQotICogICAgZmlsZS4KLSAqCi0gKiAyKSBObyByaWdodCBpcyBncmFudGVkIHRvIHVzZSBhbnkgdHJhZGUgbmFtZSwgdHJhZGVtYXJrLCBvciBsb2dvIG9mIERpZ2l0YWwKLSAqICAgIEVxdWlwbWVudCBDb3Jwb3JhdGlvbi4gTmVpdGhlciB0aGUgIkRpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIiBuYW1lCi0gKiAgICBub3IgYW55IHRyYWRlbWFyayBvciBsb2dvIG9mIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIG1heSBiZSB1c2VkCi0gKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCB0aGUKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbi4KLSAqCi0gKiAzKSBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJBUy1JUyIgYW5kIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywKLSAqICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5LAotICogICAgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UsIG9yIG5vbi1pbmZyaW5nZW1lbnQgYXJlIGRpc2NsYWltZWQuIEluCi0gKiAgICBubyBldmVudCBzaGFsbCBESUdJVEFMIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgd2hhdHNvZXZlciwgYW5kIGluCi0gKiAgICBwYXJ0aWN1bGFyLCBESUdJVEFMIHNoYWxsIG5vdCBiZSBsaWFibGUgZm9yIHNwZWNpYWwsIGluZGlyZWN0LAotICogICAgY29uc2VxdWVudGlhbCwgb3IgaW5jaWRlbnRhbCBkYW1hZ2VzIG9yIGRhbWFnZXMgZm9yCi0gKiAgICBsb3N0IHByb2ZpdHMsIGxvc3Mgb2YgcmV2ZW51ZSBvciBsb3NzIG9mIHVzZSwgd2hldGhlciBzdWNoIGRhbWFnZXMgYXJpc2UKLSAqICAgIGluIGNvbnRyYWN0LAotICogICAgbmVnbGlnZW5jZSwgdG9ydCwgdW5kZXIgc3RhdHV0ZSwgaW4gZXF1aXR5LCBhdCBsYXcgb3Igb3RoZXJ3aXNlLCBldmVuIGlmCi0gKiAgICBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLSAqCi0gKi8KLQotLyogJFhGcmVlODY6IHhjL3Byb2dyYW1zL1hzZXJ2ZXIvaHcveGZyZWU4Ni9TdXBlclByb2JlL0FzbU1hY3Jvcy5oLHYgMy4xNCAxOTk5LzA5LzI1IDE0OjM2OjU4IGRhd2VzIEV4cCAkICovCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKQotI2lmIGRlZmluZWQobGludXgpICYmIChkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX2lhNjRfXykpCi0jdW5kZWYgaW5iCi0jZGVmaW5lIGluYiBfaW5iCi0jdW5kZWYgaW53Ci0jZGVmaW5lIGludyBfaW53Ci0jdW5kZWYgaW5sCi0jZGVmaW5lIGlubCBfaW5sCi0jdW5kZWYgb3V0YgotI2RlZmluZSBvdXRiKHAsdikgX291dGIoKHYpLChwKSkKLSN1bmRlZiBvdXR3Ci0jZGVmaW5lIG91dHcocCx2KSBfb3V0dygodiksKHApKQotI3VuZGVmIG91dGwKLSNkZWZpbmUgb3V0bChwLHYpIF9vdXRsKCh2KSwocCkpCi0jZWxzZQotI2lmIGRlZmluZWQoX19zcGFyY19fKQotI2lmbmRlZiBBU0lfUEwKLSNkZWZpbmUgQVNJX1BMIDB4ODgKLSNlbmRpZgotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1vdXRiKHBvcnQsIHZhbCkKLXVuc2lnbmVkIGxvbmcgcG9ydDsKLWNoYXIgdmFsOwotewotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RiYSAlMCwgWyUxXSAlMiIgOiA6ICJyIiAodmFsKSwgInIiIChwb3J0KSwgImkiIChBU0lfUEwpKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotb3V0dyhwb3J0LCB2YWwpCi11bnNpZ25lZCBsb25nIHBvcnQ7Ci1jaGFyIHZhbDsKLXsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oInN0aGEgJTAsIFslMV0gJTIiIDogOiAiciIgKHZhbCksICJyIiAocG9ydCksICJpIiAoQVNJX1BMKSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLW91dGwocG9ydCwgdmFsKQotdW5zaWduZWQgbG9uZyBwb3J0OwotY2hhciB2YWw7Ci17Ci0gIF9fYXNtX18gX192b2xhdGlsZV9fKCJzdGEgJTAsIFslMV0gJTIiIDogOiAiciIgKHZhbCksICJyIiAocG9ydCksICJpIiAoQVNJX1BMKSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAotaW5iKHBvcnQpCi11bnNpZ25lZCBsb25nIHBvcnQ7Ci17Ci0gICB1bnNpZ25lZCBjaGFyIHJldDsKLSAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsZHViYSBbJTFdICUyLCAlMCIgOiAiPXIiIChyZXQpIDogInIiIChwb3J0KSwgImkiIChBU0lfUEwpKTsKLSAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAotaW53KHBvcnQpCi11bnNpZ25lZCBsb25nIHBvcnQ7Ci17Ci0gICB1bnNpZ25lZCBjaGFyIHJldDsKLSAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsZHVoYSBbJTFdICUyLCAlMCIgOiAiPXIiIChyZXQpIDogInIiIChwb3J0KSwgImkiIChBU0lfUEwpKTsKLSAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAotaW5sKHBvcnQpCi11bnNpZ25lZCBsb25nIHBvcnQ7Ci17Ci0gICB1bnNpZ25lZCBjaGFyIHJldDsKLSAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsZGEgWyUxXSAlMiwgJTAiIDogIj1yIiAocmV0KSA6ICJyIiAocG9ydCksICJpIiAoQVNJX1BMKSk7Ci0gICByZXR1cm4gcmV0OwotfQotI2Vsc2UKLSNpZmRlZiBfX2FybTMyX18KLXVuc2lnbmVkIGludCBJT1BvcnRCYXNlOyAgLyogTWVtb3J5IG1hcHBlZCBJL08gcG9ydCBhcmVhICovCi0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLW91dGIocG9ydCwgdmFsKQotICAgICBzaG9ydCBwb3J0OwotICAgICBjaGFyIHZhbDsKLXsKLSAgICAgaWYgKCh1bnNpZ25lZCBzaG9ydClwb3J0ID49IDB4NDAwKSByZXR1cm47Ci0KLSAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKSgoKHVuc2lnbmVkIHNob3J0KShwb3J0KSkrSU9Qb3J0QmFzZSkgPSB2YWw7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLW91dHcocG9ydCwgdmFsKQotICAgICBzaG9ydCBwb3J0OwotICAgICBzaG9ydCB2YWw7Ci17Ci0gICAgIGlmICgodW5zaWduZWQgc2hvcnQpcG9ydCA+PSAweDQwMCkgcmV0dXJuOwotCi0gICAgKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopKCgodW5zaWduZWQgc2hvcnQpKHBvcnQpKStJT1BvcnRCYXNlKSA9IHZhbDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotb3V0bChwb3J0LCB2YWwpCi0gICAgIHNob3J0IHBvcnQ7Ci0gICAgIGludCB2YWw7Ci17Ci0gICAgIGlmICgodW5zaWduZWQgc2hvcnQpcG9ydCA+PSAweDQwMCkgcmV0dXJuOwotCi0gICAgKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nKikoKCh1bnNpZ25lZCBzaG9ydCkocG9ydCkpK0lPUG9ydEJhc2UpID0gdmFsOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKLWluYihwb3J0KQotICAgICBzaG9ydCBwb3J0OwotewotICAgICBpZiAoKHVuc2lnbmVkIHNob3J0KXBvcnQgPj0gMHg0MDApIHJldHVybigodW5zaWduZWQgaW50KS0xKTsKLQotICAgIHJldHVybigqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKSgoKHVuc2lnbmVkIHNob3J0KShwb3J0KSkrSU9Qb3J0QmFzZSkpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKLWludyhwb3J0KQotICAgICBzaG9ydCBwb3J0OwotewotICAgICBpZiAoKHVuc2lnbmVkIHNob3J0KXBvcnQgPj0gMHg0MDApIHJldHVybigodW5zaWduZWQgaW50KS0xKTsKLQotICAgIHJldHVybigqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0KikoKCh1bnNpZ25lZCBzaG9ydCkocG9ydCkpK0lPUG9ydEJhc2UpKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50Ci1pbmwocG9ydCkKLSAgICAgc2hvcnQgcG9ydDsKLXsKLSAgICAgaWYgKCh1bnNpZ25lZCBzaG9ydClwb3J0ID49IDB4NDAwKSByZXR1cm4oKHVuc2lnbmVkIGludCktMSk7Ci0KLSAgICByZXR1cm4oKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nKikoKCh1bnNpZ25lZCBzaG9ydCkocG9ydCkpK0lPUG9ydEJhc2UpKTsKLX0KLSNlbHNlIC8qIF9fYXJtMzJfXyAqLwotI2lmIGRlZmluZWQoTHlueCkgJiYgZGVmaW5lZChfX3Bvd2VycGNfXykKLWV4dGVybiB1bnNpZ25lZCBjaGFyICppb0Jhc2U7Ci0KLXN0YXRpYyB2b2xhdGlsZSB2b2lkCi1laWVpbygpCi17Ci0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIpOwotfQotCi1zdGF0aWMgdm9pZAotb3V0Yihwb3J0LCB2YWx1ZSkKLXNob3J0IHBvcnQ7Ci11bnNpZ25lZCBjaGFyIHZhbHVlOwotewotICAgICoodWNoYXIgKikoaW9CYXNlICsgcG9ydCkgPSB2YWx1ZTsgZWllaW8oKTsKLX0KLQotc3RhdGljIHZvaWQKLW91dHcocG9ydCwgdmFsdWUpCi1zaG9ydCBwb3J0OwotdW5zaWduZWQgc2hvcnQgdmFsdWU7Ci17Ci0gICAgKih1bnNpZ25lZCBzaG9ydCAqKShpb0Jhc2UgKyBwb3J0KSA9IHZhbHVlOyBlaWVpbygpOwotfQotCi1zdGF0aWMgdm9pZAotb3V0bChwb3J0LCB2YWx1ZSkKLXNob3J0IHBvcnQ7Ci11bnNpZ25lZCBsb25nIHZhbHVlOwotewotICAgICoodW5zaWduZWQgbG9uZyAqKShpb0Jhc2UgKyBwb3J0KSA9IHZhbHVlOyBlaWVpbygpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhcgotaW5iKHBvcnQpCi1zaG9ydCBwb3J0OwotewotICAgIHVuc2lnbmVkIGNoYXIgdmFsOwotCi0gICAgdmFsID0gKigodW5zaWduZWQgY2hhciAqKShpb0Jhc2UgKyBwb3J0KSk7IGVpZWlvKCk7Ci0gICAgcmV0dXJuKHZhbCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAotaW53KHBvcnQpCi1zaG9ydCBwb3J0OwotewotICAgIHVuc2lnbmVkIHNob3J0IHZhbDsKLQotICAgIHZhbCA9ICooKHVuc2lnbmVkIHNob3J0ICopKGlvQmFzZSArIHBvcnQpKTsgZWllaW8oKTsKLSAgICByZXR1cm4odmFsKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWlubChwb3J0KQotc2hvcnQgcG9ydDsKLXsKLSAgICB1bnNpZ25lZCBsb25nIHZhbDsKLQotICAgIHZhbCA9ICooKHVuc2lnbmVkIGxvbmcgKikoaW9CYXNlICsgcG9ydCkpOyBlaWVpbygpOwotICAgIHJldHVybih2YWwpOwotfQotCi0jZWxzZQotI2lmIGRlZmluZWQoX19GcmVlQlNEX18pICYmIGRlZmluZWQoX19hbHBoYV9fKQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLWV4dGVybiB2b2lkIG91dGIodV9pbnQzMl90IHBvcnQsIHVfaW50OF90IHZhbCk7Ci1leHRlcm4gdm9pZCBvdXR3KHVfaW50MzJfdCBwb3J0LCB1X2ludDE2X3QgdmFsKTsKLWV4dGVybiB2b2lkIG91dGwodV9pbnQzMl90IHBvcnQsIHVfaW50MzJfdCB2YWwpOwotZXh0ZXJuIHVfaW50OF90IGluYih1X2ludDMyX3QgcG9ydCk7Ci1leHRlcm4gdV9pbnQxNl90IGludyh1X2ludDMyX3QgcG9ydCk7Ci1leHRlcm4gdV9pbnQzMl90IGlubCh1X2ludDMyX3QgcG9ydCk7Ci0KLSNlbHNlCi0jaWZkZWYgR0NDVVNFU0dBUwotc3RhdGljIF9faW5saW5lX18gdm9pZAotb3V0Yihwb3J0LCB2YWwpCi1zaG9ydCBwb3J0OwotY2hhciB2YWw7Ci17Ci0gICBfX2FzbV9fIF9fdm9sYXRpbGVfXygib3V0YiAlMCwlMSIgOiA6ImEiICh2YWwpLCAiZCIgKHBvcnQpKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotb3V0dyhwb3J0LCB2YWwpCi1zaG9ydCBwb3J0Owotc2hvcnQgdmFsOwotewotICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm91dHcgJTAsJTEiIDogOiJhIiAodmFsKSwgImQiIChwb3J0KSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLW91dGwocG9ydCwgdmFsKQotc2hvcnQgcG9ydDsKLXVuc2lnbmVkIGludCB2YWw7Ci17Ci0gICBfX2FzbV9fIF9fdm9sYXRpbGVfXygib3V0bCAlMCwlMSIgOiA6ImEiICh2YWwpLCAiZCIgKHBvcnQpKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50Ci1pbmIocG9ydCkKLXNob3J0IHBvcnQ7Ci17Ci0gICB1bnNpZ25lZCBjaGFyIHJldDsKLSAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJpbmIgJTEsJTAiIDoKLSAgICAgICAiPWEiIChyZXQpIDoKLSAgICAgICAiZCIgKHBvcnQpKTsKLSAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAotaW53KHBvcnQpCi1zaG9ydCBwb3J0OwotewotICAgdW5zaWduZWQgc2hvcnQgcmV0OwotICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImludyAlMSwlMCIgOgotICAgICAgICI9YSIgKHJldCkgOgotICAgICAgICJkIiAocG9ydCkpOwotICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50Ci1pbmwocG9ydCkKLXNob3J0IHBvcnQ7Ci17Ci0gICB1bnNpZ25lZCBpbnQgcmV0OwotICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImlubCAlMSwlMCIgOgotICAgICAgICI9YSIgKHJldCkgOgotICAgICAgICJkIiAocG9ydCkpOwotICAgcmV0dXJuIHJldDsKLX0KLQotI2Vsc2UgLyogR0NDVVNFU0dBUyAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1vdXRiKHBvcnQsIHZhbCkKLSAgICAgc2hvcnQgcG9ydDsKLSAgICAgY2hhciB2YWw7Ci17Ci0gIF9fYXNtX18gX192b2xhdGlsZV9fKCJvdXQlQjAgKCUxKSIgOiA6ImEiICh2YWwpLCAiZCIgKHBvcnQpKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotb3V0dyhwb3J0LCB2YWwpCi0gICAgIHNob3J0IHBvcnQ7Ci0gICAgIHNob3J0IHZhbDsKLXsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm91dCVXMCAoJTEpIiA6IDoiYSIgKHZhbCksICJkIiAocG9ydCkpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1vdXRsKHBvcnQsIHZhbCkKLSAgICAgc2hvcnQgcG9ydDsKLSAgICAgdW5zaWduZWQgaW50IHZhbDsKLXsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm91dCVMMCAoJTEpIiA6IDoiYSIgKHZhbCksICJkIiAocG9ydCkpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKLWluYihwb3J0KQotICAgICBzaG9ydCBwb3J0OwotewotICB1bnNpZ25lZCBpbnQgcmV0OwotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW4lQjAgKCUxKSIgOgotCQkgICAiPWEiIChyZXQpIDoKLQkJICAgImQiIChwb3J0KSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAotaW53KHBvcnQpCi0gICAgIHNob3J0IHBvcnQ7Ci17Ci0gIHVuc2lnbmVkIGludCByZXQ7Ci0gIF9fYXNtX18gX192b2xhdGlsZV9fKCJpbiVXMCAoJTEpIiA6Ci0JCSAgICI9YSIgKHJldCkgOgotCQkgICAiZCIgKHBvcnQpKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50Ci1pbmwocG9ydCkKLSAgICAgc2hvcnQgcG9ydDsKLXsKLSAgdW5zaWduZWQgaW50IHJldDsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oImluJUwwICglMSkiIDoKLQkJICAgIj1hIiAocmV0KSA6Ci0JCSAgICJkIiAocG9ydCkpOwotICByZXR1cm4gcmV0OwotfQotCi0jZW5kaWYgLyogR0NDVVNFU0dBUyAqLwotI2VuZGlmIC8qIEx5bnggJiYgX19wb3dlcnBjX18gKi8KLSNlbmRpZiAvKiBhcm0zMiAqLwotI2VuZGlmIC8qIGxpbnV4ICYmIF9fc3BhcmNfXyAqLwotI2VuZGlmIC8qIGxpbnV4ICYmIF9fYWxwaGFfXyAqLwotI2VuZGlmIC8qIF9fRnJlZUJTRF9fICYmIF9fYWxwaGFfXyAqLwotCi0jaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX2FybTMyX18pIHx8IChkZWZpbmVkKEx5bngpICYmIGRlZmluZWQoX19wb3dlcnBjX18pKQotCi0jZGVmaW5lIGludHJfZGlzYWJsZSgpCi0jZGVmaW5lIGludHJfZW5hYmxlKCkKLQotI2Vsc2UKLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotaW50cl9kaXNhYmxlKCkKLXsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oImNsaSIpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1pbnRyX2VuYWJsZSgpCi17Ci0gIF9fYXNtX18gX192b2xhdGlsZV9fKCJzdGkiKTsKLX0KLQotI2VuZGlmIC8qIGVsc2UgIWxpbnV4ICYmICFfX2FybTMyX18gKi8KLQotI2Vsc2UgLyogX19HTlVDX18gKi8KLQotI2lmIGRlZmluZWQoX01JTklYKSAmJiBkZWZpbmVkKF9BQ0spCi0KLS8qIGluYiwgb3V0YiwgaW53IGFuZCBvdXR3IGFyZSBkZWZpbmVkIGluIHRoZSBsaWJyYXJ5ICovCi0vKiAuLi4gYnV0IEkndmUgbm8gaWRlYSBpZiB0aGUgc2FtZSBpcyB0cnVlIGZvciBpbmwgJiBvdXRsICovCi0KLXU4X3QgaW5iKFUxNl90KTsKLXZvaWQgb3V0YihVMTZfdCwgVThfdCk7Ci11MTZfdCBpbncoVTE2X3QpOwotdm9pZCBvdXR3KFUxNl90LCBVMTZfdCk7Ci11MzJfdCBpbmwoVTE2X3QpOwotdm9pZCBvdXRsKFUxNl90LCBVMzJfdCk7Ci0KLSNlbHNlIC8qIG5vdCBfTUlOSVggYW5kIF9BQ0sgKi8KLQotIyBpZiBkZWZpbmVkKF9fU1REQ19fKSAmJiAoX19TVERDX18gPT0gMSkKLSMgIGlmbmRlZiBOQ1IKLSMgIGRlZmluZSBhc20gX19hc20KLSMgIGVuZGlmCi0jIGVuZGlmCi0jIGlmZGVmIFNWUjQKLSMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyAgaWZuZGVmIF9fVVNMQ19fCi0jICAgZGVmaW5lIF9fVVNMQ19fCi0jICBlbmRpZgotIyBlbmRpZgotI2lmbmRlZiBTQ08zMjUKLSMgaW5jbHVkZSA8c3lzL2lubGluZS5oPgotI2Vsc2UKLSMgaW5jbHVkZSAiLi4vY29tbW9uL3Njb2FzbS5oIgotI2VuZGlmCi0jZGVmaW5lIGludHJfZGlzYWJsZSgpIGFzbSgiY2xpIikKLSNkZWZpbmUgaW50cl9lbmFibGUoKSAgYXNtKCJzdGkiKQotCi0jZW5kaWYgLyogX01JTklYIGFuZCBfQUNLICovCi0jZW5kaWYgLyogX19HTlVDX18gKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvUkVBRE1FIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNjU2NzQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0KLVRoaXMgaXMgYSBwcmVsaW1pbmFyeSB2ZXJzaW9uIG9mIGEgVkdBIHNvZnRib290ZXIgZm9yIExJTlVYLgotCi1JdCBtYWtlcyB1c2Ugb2YgdGhlIG9mIHRoZSB2bTg2KCkgY2FsbCBhbmQgaXMgdGhlcmVmb3JlIG9ubHkKLXVzYWJsZSBvbiBpeDg2IHN5c3RlbXMuCi1UaGVyZSBhcmUgcGxhbnMgdG8gcG9ydCB0aGlzIHByb2dyYW0gdG8gdXNlIGEgeDg2IGVtdWxhdG9yCi1saWtlIHg4NmVtdS4gQWxzbyBpdCBtYXkgYmUgcG9ydGVkIHRvIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLgotCi1TbyBmYXIgaXQgaGFzIGJlZW4gdGVzdGVkIG9uIGEgc21hbGwgbnVtYmVyIG9mIGNhcmRzLiBJdCBtaWdodAotd2VsbCBiZSB0aGF0IGl0IHdpbGwgZmFpbCBvbiB5b3VyIGNhcmQuCi0KLUlmIHlvdSBuZWVkIHRvIG1ha2UgbW9kaWZpY2F0aW9ucyB0byB0aGUgcHJvZ3JhbXMgdG8gYmUgYWJsZQotdG8gYm9vdCB5b3VyIGNhcmQgcGxlYXNlIGxldCB0aGUgYXV0aG9yIGtub3cuCi0KLVNvIGZhciB0aGVyZSBpcyBubyBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLiBBbGwgb3B0aW9ucyBuZWVkCi10byBiZSBoYXJkY29kZWQuIFlvdSBjYW4gZG8gdGhpcyBieSBlZGl0aW5nIGRlYnVnLmguIFlvdSBjYW4KLXR1cm4gb24gYSBidW5jaCBvZiBkZWJ1ZyBvdXRwdXQuIE90aGVyIG9wdGlvbnMgYWxsb3cgeW91IHRvCi1ib290IHRoZSBwcmltYXJ5IGNhcmQgKENPTkZJR19BQ1RJVkVfREVWSUNFKSwgc2F2ZSB0aGUgYmlvcwotdG8gYSBmaWxlIChTQVZFX0JJT1MpLCBhbmQgbWFwIHRoZSBvcmlnaW5hbCBzeXN0ZW0gYmlvcwotKE1BUF9TWVNfQklPUykuCi0KLVRoZSBhdXRob3Igd2FudHMgdG8gdGhhbmsKLSBIYW5zIExlcm1lbiAgIChkb3NlbXUpCi0gYW5kCi0gS2VuZGFsbCBCZW5uZXR0ICh4ODZlbXUpCi1mb3IgdGhlaXIgc3VwcG9ydC4KLQotUGFydHMgb2YgdGhlIGNvZGUgLSBlc3BlY2lhbGx5IGluIHY4Ni5jIGFuZCBpby5jIC0gYXJlIGJhc2VkIG9uIGNvZGUKLXRha2VuIGZyb20gZG9zZW11LiBQYXJ0cyBvZiB0aGUgY29kZSBpbiBpbnQuYyBhcmUgYmFzZWQgb24gY29kZSB0YWtlbgotZnJvbSB4ODZlbXUKLQotRWdiZXJ0IEVpY2guICA8RWdiZXJ0LkVpY2hAUGh5c2lrLlRVLURhcm1zdGFkdC5ERT4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvYXdrLnNjciBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvYXdrLnNjcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyYTgwZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2F3ay5zY3IKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vLipcKDB4M2RhLiovfHwvLipcKDB4M2JhLiovIHsgCi0gICAgICAgIGlmICh2XzNkYSAhPSAxKSBwcmludCAiX3ZfcmV0cmFjZV8iOwotICAgICAgICB2XzNkYSA9IDE7Ci0gICAgICAgIG5leHQ7ICAgICAgICAKLSAgICAgICAgfQotLy4qXCgweDQyLiovfHwvLipcKDB4NDMuKi8gewotICAgICAgICBpZiAodl80eCAhPSAxKSBwcmludCAiX3RpbWVyXyI7Ci0gICAgICAgIHZfNHggPSAxOwotICAgICAgICBuZXh0OwotfQotewotICAgIHByaW50OwotICAgIHZfM2RhID0gMDsKLSAgICB2XzR4ID0gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvY2Jpb3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvY2Jpb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIxMmRmZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2NiaW9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQgKF9faWE2NF9fKQotI2luY2x1ZGUgPHN5cy9pby5oPgotI2VsaWYgZGVmaW5lZChIQVZFX1NZU19QRVJNKQotI2luY2x1ZGUgPHN5cy9wZXJtLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgInY4NmJpb3MuaCIKLSNpbmNsdWRlICJwY2kuaCIKLSNpbmNsdWRlICJBc21NYWNyb3MuaCIKLQotI2RlZmluZSBTSVpFIDB4MTAwMDAwCi0jZGVmaW5lIFZSQU1fU1RBUlQgMHhBMDAwMAotI2RlZmluZSBWUkFNX1NJWkUgMHgxRkZGRgotI2RlZmluZSBWX0JJT1NfU0laRSAweDFGRkZGCi0jZGVmaW5lIEJJT1NfU1RBUlQgMHg3QzAwICAgICAgICAgICAgLyogZGVmYXVsdCBCSU9TIGVudHJ5ICovCi0jZGVmaW5lIEJJT1NfTUVNIDB4NjAwCi0KLUNBUkQ4IGNvZGVbXSA9IHsgMHhjZCwgMHgxMCwgMHhmNCB9Owotc3RydWN0IGNvbmZpZyBDb25maWc7Ci0KLXN0YXRpYyBpbnQgbWFwKHZvaWQpOwotc3RhdGljIHZvaWQgdW5tYXAodm9pZCk7Ci1zdGF0aWMgdm9pZCBydW5CSU9TKGludCBhcmdjLCBjaGFyICoqYXJndik7Ci1zdGF0aWMgaW50IG1hcF92cmFtKHZvaWQpOwotc3RhdGljIHZvaWQgdW5tYXBfdnJhbSh2b2lkKTsKLXN0YXRpYyBpbnQgY29weV92YmlvcyhtZW1UeXBlIGJhc2UpOwotc3RhdGljIGludCBjb3B5X3N5c19iaW9zKHZvaWQpOwotc3RhdGljIENBUkQzMiBzZXR1cF9pbnRfdmVjdCh2b2lkKTsKLXN0YXRpYyB2b2lkIHVwZGF0ZV9iaW9zX3ZhcnModm9pZCk7Ci1zdGF0aWMgaW50IGNoa3N1bShDQVJEOCAqc3RhcnQpOwotc3RhdGljIHZvaWQgc2V0dXBfYmlvc19yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MsIGludCBhcmdjLCBjaGFyICoqYXJndik7Ci1zdGF0aWMgdm9pZCBwcmludF9yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MpOwotdm9pZCBkcHJpbnQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKLQotdm9pZCBsb2FkQ29kZVRvTWVtKHVuc2lnbmVkIGNoYXIgKnB0ciwgQ0FSRDggKmNvZGUpOwotCi1zdGF0aWMgaW50IHZyYW1fbWFwcGVkID0gMDsKLXN0YXRpYyBjaGFyKiBiaW9zX3ZhcjsKLQotCi1pbnQKLW1haW4oaW50IGFyZ2MsY2hhciAqKmFyZ3YpCi17Ci0gICAgQ0FSRDMyIHZiaW9zX2Jhc2U7Ci0KLSAgICBDb25maWcuUHJpbnRQb3J0ID0gUFJJTlRfUE9SVDsKLSAgICBDb25maWcuSW9TdGF0aXN0aWNzID0gSU9fU1RBVElTVElDUzsKLSAgICBDb25maWcuUHJpbnRJcnEgPSBQUklOVF9JUlE7Ci0gICAgQ29uZmlnLlByaW50UGNpID0gUFJJTlRfUENJOwotICAgIENvbmZpZy5TaG93QWxsRGV2ID0gU0hPV19BTExfREVWOwotICAgIENvbmZpZy5QcmludElwID0gUFJJTlRfSVA7Ci0gICAgQ29uZmlnLlNhdmVCaW9zID0gU0FWRV9CSU9TOwotICAgIENvbmZpZy5UcmFjZSA9IFRSQUNFOwotICAgIENvbmZpZy5Db25maWdBY3RpdmVPbmx5ID0gQ09ORklHX0FDVElWRV9PTkxZOwotICAgIENvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UgPSBDT05GSUdfQUNUSVZFX0RFVklDRTsKLSAgICBDb25maWcuTWFwU3lzQmlvcyA9IE1BUF9TWVNfQklPUzsKLSAgICBDb25maWcuUmVzb3J0ID0gUkVTT1JUOwotICAgIENvbmZpZy5GaXhSb20gPSBGSVhfUk9NOwotICAgIENvbmZpZy5Ob0NvbnNvbGUgPSBOT19DT05TT0xFOwotICAgIENvbmZpZy5WZXJib3NlID0gVkVSQk9TRTsKLQotICAgIGlmICghbWFwKCkpCi0gICAgZXhpdCgxKTsKLSAgICBpZiAoIWNvcHlfc3lzX2Jpb3MoKSkKLSAgICBleGl0KDEpOwotICAgIGlmICghKHZiaW9zX2Jhc2UgPSBzZXR1cF9pbnRfdmVjdCgpKSkKLSAgICBleGl0KDEpOwotICAgIGlmICghbWFwX3ZyYW0oKSkKLSAgICBleGl0KDEpOwotICAgIGlmICghY29weV92Ymlvcyh2Ymlvc19iYXNlKSkKLSAgICBleGl0KDEpOwotCi0gICAgaW9wbCgzKTsKLSAgICBzZXR1cF9pbygpOwotICAgIHJ1bkJJT1MoYXJnYyxhcmd2KTsKLSAgICB1cGRhdGVfYmlvc192YXJzKCk7Ci0gICAgdW5tYXBfdnJhbSgpOwotICAgIGlvcGwoMCk7Ci0gICAgdW5tYXAoKTsKLSAgICBwcmludGYoImRvbmUgIVxuIik7Ci0gICAgZXhpdCAoMSk7Ci19Ci0KLWludAotbWFwKHZvaWQpCi17Ci0gICAgdm9pZCogbWVtOwotCi0gICAgbWVtID0gbW1hcCgwLCAoc2l6ZV90KVNJWkUsCi0JICAgICAgIFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgICAgIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFIHwgTUFQX0FOT04sCi0JICAgICAgIC0xLCAwICk7Ci0gICAgaWYgKG1lbSAhPSAwKSB7Ci0JcGVycm9yKCJhbm9ueW1vdXMgbWFwIik7Ci0JcmV0dXJuICgwKTsKLSAgICB9Ci0gICAgbWVtc2V0KG1lbSwwLFNJWkUpOwotCi0gICAgbG9hZENvZGVUb01lbSgodW5zaWduZWQgY2hhciAqKSBCSU9TX1NUQVJULCBjb2RlKTsKLSAgICByZXR1cm4gKDEpOwotfQotCi1zdGF0aWMgaW50Ci1jb3B5X3N5c19iaW9zKHZvaWQpCi17Ci0jZGVmaW5lIFNZU19CSU9TIDB4RjAwMDAKLSAgICBpbnQgbWVtX2ZkOwotCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRPTkxZKSk8MCkgewotCXBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKLQlyZXR1cm4gKDApOwotICAgIH0KLQotICAgIGlmIChsc2VlayhtZW1fZmQsKG9mZl90KSBTWVNfQklPUyxTRUVLX1NFVCkgIT0gKG9mZl90KSBTWVNfQklPUykKLQlnb3RvIEVycm9yOwotICAgIGlmIChyZWFkKG1lbV9mZCwgKGNoYXIgKilTWVNfQklPUywgKHNpemVfdCkgMHhGRkZGKSAhPSAoc2l6ZV90KSAweEZGRkYpCi0JZ290byBFcnJvcjsKLQotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuICgxKTsKLQotRXJyb3I6Ci0gICAgcGVycm9yKCJzeXNfYmlvcyIpOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludAotbWFwX3ZyYW0odm9pZCkKLXsKLSAgICBpbnQgbWVtX2ZkOwotCi0jaWZkZWYgX19pYTY0X18KLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRFdSIHwgT19TWU5DKSk8MCkKLSNlbHNlCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRXUikpPDApCi0jZW5kaWYKLSAgICAgIHsKLQlwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZuZGVmIF9fYWxwaGFfXwotICAgIGlmIChtbWFwKCh2b2lkICopIFZSQU1fU1RBUlQsIChzaXplX3QpIFZSQU1fU0laRSwKLQkJICAgICBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVEIHwgTUFQX0ZJWEVELAotCQkgICAgIG1lbV9mZCwgVlJBTV9TVEFSVCkgPT0gKHZvaWQgKikgLTEpCi0jZWxzZQotCSBpZiAoIV9idXNfYmFzZSgpKSBzcGFyc2Vfc2hpZnQgPSA3OyAvKiBVaCwgb2gsIEpFTlNFTi4uLiAqLwotCSBpZiAoIV9idXNfYmFzZV9zcGFyc2UoKSkgc3BhcnNlX3NoaWZ0ID0gMDsKLQkgaWYgKCh2cmFtX21hcCA9IG1tYXAoMCwoc2l6ZV90KSAoVlJBTV9TSVpFIDw8IHNwYXJzZV9zaGlmdCksCi0JCQkJCQkgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkJCQkJCSBNQVBfU0hBUkVELAotCQkJCQkJIG1lbV9mZCwgKFZSQU1fU1RBUlQgPDwgc3BhcnNlX3NoaWZ0KQotCQkJCQkJIHwgX2J1c19iYXNlX3NwYXJzZSgpKSkgPT0gKHZvaWQgKikgLTEpCi0jZW5kaWYKLSAgICAgIHsKLQlwZXJyb3IoIm1tYXAgZXJyb3IgaW4gbWFwX2hhcmR3YXJlX3JhbSIpOwotCSAgICBjbG9zZShtZW1fZmQpOwotCSAgICByZXR1cm4gKDApOwotCX0KLSAgICB2cmFtX21hcHBlZCA9IDE7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm4gKDEpOwotfQotCi1zdGF0aWMgaW50Ci1jb3B5X3ZiaW9zKG1lbVR5cGUgdl9iYXNlKQotewotICAgIGludCBtZW1fZmQ7Ci0gICAgdW5zaWduZWQgY2hhciAqdG1wOwotICAgIGludCBzaXplOwotCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRPTkxZKSk8MCkgewotCXBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKLQlyZXR1cm4gKDApOwotICAgIH0KLQotICAgIGlmIChsc2VlayhtZW1fZmQsKG9mZl90KSB2X2Jhc2UsIFNFRUtfU0VUKSAhPSAob2ZmX3QpIHZfYmFzZSkgewotCSAgZnByaW50ZihzdGRlcnIsIkNhbm5vdCBsc2Vla1xuIik7Ci0JICBnb3RvIEVycm9yOwotICAgICAgfQotICAgIHRtcCA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKDMpOwotICAgIGlmIChyZWFkKG1lbV9mZCwgKGNoYXIgKil0bXAsIChzaXplX3QpIDMpICE9IChzaXplX3QpIDMpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIkNhbm5vdCByZWFkXG4iKTsKLQlnb3RvIEVycm9yOwotICAgIH0KLSAgICBpZiAobHNlZWsobWVtX2ZkLChvZmZfdCkgdl9iYXNlLFNFRUtfU0VUKSAhPSAob2ZmX3QpIHZfYmFzZSkKLQlnb3RvIEVycm9yOwotCi0gICAgaWYgKCp0bXAgIT0gMHg1NSB8fCAqKHRtcCsxKSAhPSAweEFBICkgewotCWZwcmludGYoc3RkZXJyLCJObyBiaW9zIGZvdW5kIGF0OiAweCVseFxuIix2X2Jhc2UpOwotCWdvdG8gRXJyb3I7Ci0gICAgfQotI2lmZGVmIERFQlVHCi0JZHByaW50KCh1bnNpZ25lZCBsb25nKXRtcCwweDEwMCk7Ci0jZW5kaWYKLSAgICBzaXplID0gKih0bXArMikgKiA1MTI7Ci0KLSAgICBpZiAocmVhZChtZW1fZmQsIChjaGFyICopdl9iYXNlLCAoc2l6ZV90KSBzaXplKSAhPSAoc2l6ZV90KSBzaXplKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCJDYW5ub3QgcmVhZFxuIik7Ci0JZ290byBFcnJvcjsKLSAgICB9Ci0gICAgZnJlZSh0bXApOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgaWYgKCFjaGtzdW0oKENBUkQ4Kil2X2Jhc2UpKQotCXJldHVybiAoMCk7Ci0KLSAgICByZXR1cm4gKDEpOwotCi1FcnJvcjoKLSAgICBwZXJyb3IoInZfYmlvcyIpOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLXVubWFwKHZvaWQpCi17Ci0gICAgbXVubWFwKDAsU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi11bm1hcF92cmFtKHZvaWQpCi17Ci0gICAgaWYgKCF2cmFtX21hcHBlZCkgcmV0dXJuOwotCi0gICAgbXVubWFwKCh2b2lkKilWUkFNX1NUQVJULFZSQU1fU0laRSk7Ci0gICAgdnJhbV9tYXBwZWQgPSAwOwotfQotCi1zdGF0aWMgdm9pZAotcnVuQklPUyhpbnQgYXJnYywgY2hhciAqKiBhcmd2KQotewotICAgIGk4NmJpb3NSZWdzIGJSZWdzOwotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBwcmludGYoInN0YXJ0aW5nIEJJT1NcbiIpOwotI2VuZGlmCi0gICAgc2V0dXBfYmlvc19yZWdzKCZiUmVncywgYXJnYywgYXJndik7Ci0gICAgZG9feDg2KEJJT1NfU1RBUlQsJmJSZWdzKTsKLSAgICBwcmludF9yZWdzKCZiUmVncyk7Ci0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIHByaW50ZigiZG9uZVxuIik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIENBUkQzMgotc2V0dXBfaW50X3ZlY3Qodm9pZCkKLXsKLSAgICBpbnQgbWVtX2ZkOwotICAgIENBUkQzMiB2YmFzZTsKLSAgICB2b2lkICptYXA7Ci0KLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRE9OTFkpKTwwKSB7Ci0gICAgcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOwotICAgIHJldHVybiAoMCk7Ci0gICAgfQotCi0gICAgaWYgKChtYXAgPSBtbWFwKCh2b2lkICopIDAsIChzaXplX3QpIDB4MjAwMCwKLQkgUFJPVF9FWEVDIHwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKLQkgbWVtX2ZkLCAwKSkgPT0gKHZvaWQgKiktMSkgICB7Ci0gICAgcGVycm9yKCJtbWFwIGVycm9yIGluIG1hcF9oYXJkd2FyZV9yYW0iKTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybiAoMCk7Ci0gICAgfQotCi0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICBtZW1jcHkoMCxtYXAsQklPU19NRU0pOwotICAgIG11bm1hcChtYXAsMHgyMDAwKTsKLSAgICAvKgotICAgICAqIGNyZWF0ZSBhIGJhY2t1cCBjb3B5IG9mIHRoZSBiaW9zIHZhcmlhYmxlcyB0byB3cml0ZSBiYWNrIHRoZQotICAgICAqIG1vZGlmaWVkIHZhbHVlcwotICAgICAqLwotICAgIGJpb3NfdmFyID0gKGNoYXIgKiltYWxsb2MoQklPU19NRU0pOwotICAgIG1lbWNweShiaW9zX3ZhciwwLEJJT1NfTUVNKTsKLQotICAgIHZiYXNlID0gKCooKENBUkQxNiopKDB4MTAgPDwgMikgKyAxKSkgPDwgNDsKLSAgICBmcHJpbnRmKHN0ZGVyciwidmJhc2U6IDB4JXhcbiIsdmJhc2UpOwotICAgIHJldHVybiB2YmFzZTsKLX0KLQotc3RhdGljIHZvaWQKLXVwZGF0ZV9iaW9zX3ZhcnModm9pZCkKLXsKLSAgICBpbnQgbWVtX2ZkOwotICAgIHZvaWQgKm1hcDsKLSAgICBtZW1UeXBlIGk7Ci0KLSNpZmRlZiBfX2lhNjRfXwotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JEV1IgfCBPX1NZTkMpKTwwKQotI2Vsc2UKLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRFdSKSk8MCkKLSNlbmRpZgotICAgICAgewotCXBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgICBpZiAoKG1hcCA9IG1tYXAoKHZvaWQgKikgMCwgKHNpemVfdCkgMHgyMDAwLAotCSBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAotCSBtZW1fZmQsIDApKSA9PSAodm9pZCAqKS0xKSAgIHsKLSAgICBwZXJyb3IoIm1tYXAgZXJyb3IgaW4gbWFwX2hhcmR3YXJlX3JhbSIpOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBCSU9TX01FTTsgaSsrKSB7Ci0gICAgaWYgKGJpb3NfdmFyW2ldICE9ICooQ0FSRDgqKWkpCi0JKigoQ0FSRDgqKW1hcCArIGkpID0gKihDQVJEOCopaTsKLSAgICB9Ci0KLSAgICBtdW5tYXAobWFwLDB4MjAwMCk7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotc2V0dXBfYmlvc19yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MsIGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgYzsKLQotICAgIHJlZ3MtPmF4ID0gMDsKLSAgICByZWdzLT5ieCA9IDA7Ci0gICAgcmVncy0+Y3ggPSAwOwotICAgIHJlZ3MtPmR4ID0gMDsKLSAgICByZWdzLT5lcyA9IDA7Ci0gICAgcmVncy0+ZGkgPSAwOwotICAgIG9wdGVyciA9IDA7Ci0gICAgd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsYXJndiwiYTpiOmM6ZDplOmk6IikpICE9IEVPRikgewotICAgIHN3aXRjaCAoYykgewotICAgIGNhc2UgJ2EnOgotCXJlZ3MtPmF4ID0gc3RydG9sKG9wdGFyZyxOVUxMLDApOwotCWJyZWFrOwotICAgIGNhc2UgJ2InOgotCXJlZ3MtPmJ4ID0gc3RydG9sKG9wdGFyZyxOVUxMLDApOwotCWJyZWFrOwotICAgIGNhc2UgJ2MnOgotCXJlZ3MtPmN4ID0gc3RydG9sKG9wdGFyZyxOVUxMLDApOwotCWJyZWFrOwotICAgIGNhc2UgJ2QnOgotCXJlZ3MtPmR4ID0gc3RydG9sKG9wdGFyZyxOVUxMLDApOwotCWJyZWFrOwotICAgIGNhc2UgJ2UnOgotCXJlZ3MtPmVzID0gc3RydG9sKG9wdGFyZyxOVUxMLDApOwotCWJyZWFrOwotICAgIGNhc2UgJ2knOgotCXJlZ3MtPmRpID0gc3RydG9sKG9wdGFyZyxOVUxMLDApOwotCWJyZWFrOwotICAgIH0KLSAgICB9Ci19Ci0KLQotc3RhdGljIGludAotY2hrc3VtKENBUkQ4ICpzdGFydCkKLXsKLSAgQ0FSRDE2IHNpemU7Ci0gIENBUkQ4IHZhbCA9IDA7Ci0gIGludCBpOwotCi0gIHNpemUgPSAqKHN0YXJ0KzIpICogNTEyOwotICBmb3IgKGkgPSAwOyBpPHNpemU7IGkrKykKLSAgICB2YWwgKz0gKihzdGFydCArIGkpOwotCi0gIGlmICghdmFsKQotICAgIHJldHVybiAxOwotCi0gICAgZnByaW50ZihzdGRlcnIsIkJJT1MgY2tzdW0gd3JvbmchXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MpCi17Ci0gICAgcHJpbnRmKCJheD0leCBieD0leCBjeD0leCBkeD0leCBlcz0leCBkaT0leFxuIiwoQ0FSRDE2KXJlZ3MtPmF4LAotICAgICAgIChDQVJEMTYpcmVncy0+YngsKENBUkQxNilyZWdzLT5jeCwoQ0FSRDE2KXJlZ3MtPmR4LAotICAgICAgIChDQVJEMTYpcmVncy0+ZXMsKENBUkQxNilyZWdzLT5kaSk7Ci19Ci0KLXZvaWQKLWxvYWRDb2RlVG9NZW0odW5zaWduZWQgY2hhciAqcHRyLCBDQVJEOCBjb2RlW10pCi17Ci0gICAgaW50IGk7Ci0gICAgQ0FSRDggdmFsOwotCi0gICAgZm9yICggaT0wOztpKyspIHsKLQl2YWwgPSBjb2RlW2ldOwotCSpwdHIrKyA9IHZhbDsKLQlpZiAodmFsID09IDB4ZjQpIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXZvaWQKLWRwcmludCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0gICAgaW50IGksajsKLSAgICBjaGFyICpjID0gKGNoYXIgKilzdGFydDsKLQotICAgIGZvciAoaiA9IDA7IGogPCAoc2l6ZSA+PiA0KTsgaisrKSB7Ci0JcHJpbnRmICgiXG4weCVseDogICIsKHVuc2lnbmVkIGxvbmcpYyk7Ci0JZm9yIChpID0gMDsgaTwxNjsgaSsrKQotCSAgICBwcmludGYoIiV4ICIsKHVuc2lnbmVkIGNoYXIpICgqKGMrKykpKTsKLSAgICB9Ci0gICAgcHJpbnRmKCJcbiIpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9jb21tYW5kLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2NvbW1hbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiY2U2ZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2NvbW1hbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHJlYWRsaW5lL3JlYWRsaW5lLmg+Ci0jaW5jbHVkZSA8cmVhZGxpbmUvaGlzdG9yeS5oPgotI2luY2x1ZGUgPG1hbGxvYy5oPgotCi0jZGVmaW5lIFBST01QVCAiPiIKLQotCi12b2lkCi1nZXRsaW5lKGNoYXIgKmJ1ZixpbnQgKm51bSxpbnQgbWF4X251bSkKLXsKLSAgICBzdGF0aWMgaW50IGxpbmVfbGVuID0gMDsKLSAgICBzdGF0aWMgY2hhciAqbGluZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKmxpbmVfcG9pbnRlciA9IE5VTEw7Ci0gICAgc3RhdGljIGludCBsZW4gPSAwOwotICAgIGludCB0bXBfbGVuOwotICAgIGNoYXIgKmJ1ZmY7Ci0KLSAgICBpZiAobGVuIDw9IDApIHsKLSAgICBidWZmID0gcmVhZGxpbmUoUFJPTVBUKTsKLSAgICBhZGRfaGlzdG9yeShidWZmKTsKLQotICAgIGlmICgodG1wX2xlbiA9IHN0cmxlbihidWZmKSkgPiBsaW5lX2xlbikgewotCWZyZWUobGluZSk7Ci0JbGluZSA9IG1hbGxvYyh0bXBfbGVuKTsKLQlsaW5lX2xlbiA9IHRtcF9sZW47Ci0gICAgfQotICAgIHNwcmludGYobGluZSwiJXNcbiIsYnVmZik7Ci0gICAgZnJlZShidWZmKTsKLSAgICBsaW5lX3BvaW50ZXIgPSBsaW5lOwotICAgIGxlbiA9IHN0cmxlbihsaW5lKTsKLSAgICB9Ci0KLSAgICAqbnVtID0gbWF4X251bSA+IGxlbj8gbGVuIDogbWF4X251bTsKLSAgICBzdHJuY3B5KGJ1ZixsaW5lX3BvaW50ZXIsKm51bSk7Ci0gICAgbGluZV9wb2ludGVyID0gbGluZV9wb2ludGVyICsgKm51bTsKLSAgICBsZW4gPSBsZW4gLSAqbnVtOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9jb25zb2xlLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2NvbnNvbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU5YzkyNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2NvbnNvbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5OSBFZ2JlcnQgRWljaAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQgaW4KLSAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAotICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucwotICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKLSAqICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKgotICogVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0gKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCi0gKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCi0gKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0gKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3Z0Lmg+Ci0jaW5jbHVkZSA8c3lzL2tkLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAidjg2Ymlvcy5oIgotCi1jb25zb2xlCi1vcGVuX2NvbnNvbGUodm9pZCkKLXsKLSAgICBpbnQgZmQ7Ci0gICAgaW50IFZUbm87Ci0gICAgY2hhciBWVG5hbWVbMTFdOwotICAgIGNvbnNvbGUgQ29uID0gey0xLC0xfTsKLSAgICBzdHJ1Y3QgdnRfc3RhdCB2dHM7Ci0KLSAgICBpZiAoTk9fQ09OU09MRSkKLQkgICAgcmV0dXJuIENvbjsKLQotICAgIGlmICgoZmQgPSBvcGVuKCIvZGV2L3R0eTAiLE9fV1JPTkxZLDApKSA8IDApCi0JcmV0dXJuIENvbjsKLQotICAgIGlmICgoaW9jdGwoZmQsIFZUX09QRU5RUlksICZWVG5vKSA8IDApIHx8IChWVG5vID09IC0xKSkgewotCWZwcmludGYoc3RkZXJyLCJjYW5ub3QgZ2V0IGEgdnRcbiIpOwotCXJldHVybiBDb247Ci0gICAgfQotCi0gICAgY2xvc2UoZmQpOwotICAgIHNwcmludGYoVlRuYW1lLCIvZGV2L3R0eSVpIixWVG5vKTsKLQotICAgIGlmICgoZmQgPSBvcGVuKFZUbmFtZSwgT19SRFdSfE9fTkRFTEFZLCAwKSkgPCAwKSB7Ci0JZnByaW50ZihzdGRlcnIsImNhbm5vdCBvcGVuIGNvbnNvbGVcbiIpOwotCXJldHVybiBDb247Ci0gICAgfQotCi0gICAgaWYgKGlvY3RsKGZkLCBWVF9HRVRTVEFURSwgJnZ0cykgPT0gMCkKLQlDb24udnQgPSB2dHMudl9hY3RpdmU7Ci0KLSAgICBpZiAoaW9jdGwoZmQsIFZUX0FDVElWQVRFLCBWVG5vKSAhPSAwKSB7Ci0JZnByaW50ZihzdGRlcnIsImNhbm5vdCBhY3RpdmF0ZSBjb25zb2xlXG4iKTsKLQljbG9zZShmZCk7Ci0JcmV0dXJuIENvbjsKLSAgICB9Ci0gICAgaWYgKGlvY3RsKGZkLCBWVF9XQUlUQUNUSVZFLCBWVG5vKSAhPSAwKSB7Ci0JZnByaW50ZihzdGRlcnIsIndhaXQgZm9yIGFjdGl2ZSBjb25zb2xlIGZhaWxlZFxuIik7Ci0JY2xvc2UoZmQpOwotCXJldHVybiBDb247Ci0gICAgfQotI2lmIDAKLSAgICBpZiAoaW9jdGwoZmQsIEtEU0VUTU9ERSwgS0RfR1JBUEhJQ1MpIDwgMCkgewotCWNsb3NlKGZkKTsKLQlyZXR1cm4gQ29uOwotICAgIH0KLSNlbmRpZgotICAgIENvbi5mZCA9IGZkOwotICAgIHJldHVybiBDb247Ci19Ci0KLXZvaWQKLWNsb3NlX2NvbnNvbGUoY29uc29sZSBDb24pCi17Ci0gICAgaWYgKENvbi5mZCA9PSAtMSkKLQlyZXR1cm47Ci0KLSNpZiAwCi0gICAgaW9jdGwoQ29uLmZkLCBLRFNFVE1PREUsIEtEX1RFWFQpOwotI2VuZGlmCi0gICAgaWYgKENvbi52dCA+PTApCi0JaW9jdGwoQ29uLmZkLCBWVF9BQ1RJVkFURSwgQ29uLnZ0KTsKLQotICAgIGNsb3NlKENvbi5mZCk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2RlYnVnLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2RlYnVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YzkwNmIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9kZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgotICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci0gKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCi0gKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAotICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLSAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLSAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLS8qI2RlZmluZSBWODZCSU9TX0RFQlVHICovCi0KLS8qCi0gKiB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBpZiBuZWVkZWQKLSAqIHNob3VsZCBiZSBjb21tYW5kIGxpbmUgb3B0aW9ucwotICovCi0KLSNkZWZpbmUgUFJJTlRfUE9SVCAwCi0jZGVmaW5lIElPX1NUQVRJU1RJQ1MgMAotI2RlZmluZSBQUklOVF9JUlEgMAotI2RlZmluZSBQUklOVF9QQ0kgMQotI2RlZmluZSBQUklOVF9JUCAwICAgIC8qIHByaW50IElQIGFkZHJlc3Mgd2l0aCBQSU8gaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgVFJBQ0UgMCAgICAgICAvKiB0dXJuIG9uIGRlYnVnZ2VyIGluIHg4NmVtdSAgICAgICAgICAgICovCi0JCSAgICAgIC8qIHJlcXVpcmVzIHg4NmVtdSBjb21waWxlZCB3aXRoIC1EREVCVUcgKi8KLQotLyoKLSAqIHRoZXNlIHNob3VsZCBub3QgYmUgaGVyZS4KLSAqIFNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0gKi8KLSNkZWZpbmUgQ09ORklHX0FDVElWRV9PTkxZIDAKLSNkZWZpbmUgQ09ORklHX0FDVElWRV9ERVZJQ0UgMQotI2RlZmluZSBTQVZFX0JJT1MgMAotI2RlZmluZSBNQVBfU1lTX0JJT1MgMQotI2RlZmluZSBSRVNPUlQgMQotI2RlZmluZSBGSVhfUk9NIDAKLSNkZWZpbmUgTk9fQ09OU09MRSAwCi0jZGVmaW5lIFNIT1dfQUxMX0RFViAwCi0jZGVmaW5lIFZFUkJPU0UgMAotCi0vKiNkZWZpbmUgVl9CSU9TIDB4ZTAwMDAgKi8KLS8qI2RlZmluZSBWX0JJT1MgMHhlNDAwMCAqLwotCi0KLSNpZiAoUFJJTlRfSU8gPT0gMSkgJiYgKFBSSU5UX1BPUlQgPT0gMCkKLSMgZGVmaW5lIFBSSU5UX0lPIDAKLSNlbmRpZgotI2lmIChJT19TVEFUSVNUSUNTID09IDEpICYmIChQUklOVF9QT1JUID09IDApCi0jIGRlZmluZSBJT19TVEFUSVNUSUNTIDAKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9oYXBweV9jYXJkcyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaGFwcHlfY2FyZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0M2Q0NGUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9oYXBweV9jYXJkcworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLVdoYXQgSSBoYWQgdG8gZG8gdG8gbWFrZSBjYXJkcyBoYXBweToKLQotMS4gVHNlbmcgRVQ0MDAwIFczMlAKLVRoaXMgY2FyZCB3YW50cyB0byBjYWxsIHRoZSBvcmlnaW5hbCBzeXN0ZW0gQklPUyB2aWRlbyByb3V0aW5lcy4KLUl0IHNldHMgdGhlIGludCAweDQyIHZlY3RvciB0byBGMDAwOkYwNjUsIHRoZSBlbnRyeSBwb2ludCB0byB0aGUKLXN5c3RlbSBiaW9zIHZpZGVvIHJvdXRpbmVzLiAKLUNBVkU6IGRvbid0IGNhdGNoIGludCAweDQyIGFuZCB1c2UgdGhlIHZiaW9zIGludCAweDEwIHJvdXRpbmVzLiAKLUF0IGVhcmx5IHN0YWdlIGR1cmluZyBpbml0aWFsaXphdGlvbiB0aGV5IGNhbGwgaW50IDB4NDIuIFRoaXMgCi1jYXVzZXMgYW4gaW5maW5pdGUgbG9vcC4KLQotMi4gQVRpIE1hY2g2NCBSYWdlIElJYyBBR1AKLVRoaXMgY2FyZCBkb2VzIHNpbWlsYXIgdGhpbmdzIGxpa2UgdGhlIFRzZW5nIEVUNDAwMCBXMzJQLgotSG93ZXZlciBpdCBkb2Vzbid0IGhhdmUgdGhlIHByb2JsZW0gd2l0aCB0aGUgaW5pbml0ZSBsb29wLgotCi0zLiBFbHNhIFZpY3RvcnkgSUktQTE2IEFHUCBCYW5zaGVlCi1UaGlzIGNhcmQgaXMgdmVyeSBjbGV2ZXI6IEl0IGtub3dzIGl0IGlzIGFuIEFHUCBjYXJkLiBUaGVyZWZvcmUKLWl0IGtub3dzIGl0IGlzIGJlaGluZCBhIFBDSS1QQ0kgYnJpZGdlLiBJdCBhbHNvIGtub3dzIHRoYXQgbm9vbmUKLWVsc2UgaXMgYmVoaW5kIHRoaXMgYnJpZGdlLiBUaGVyZWZvcmUgaXQgc3RhcnQgcmVwcm9ncmFtbWluZyB0aGUKLWJyaWRnZSEgRm9yIHRoaXMgaXQgYXNzdW1lcyB0aGUgQUdQIGJyaWRnZSBpcyBvbiBidXMgMS4KLQotNC4gRWxzYSBHbG9yaWEgU3luZXJneSA4IFZpVm8gQUdQIFBNMgotVGhpcyBjYXJkIGxpa2VzIHRvIHNlZSBhIGNvbXBsZXRlIGludGVycnVwdCB2ZWN0b3IgdGFibGUuIElmCi13ZSBmaWxsIHRoaXMgdGFibGUgd2l0aCAwIHRoZSBWQklPUyBkZXRlY3RzIHRoaXMgYW5kIHF1aXRzIAotaW5pdGlhbGl6YXRpb24uCi0KLTUuIERpbW9uZCBWaXBlciAzMzAgQUdQIE5WSURJQSBSaXZhIDEyOC4KLVRoaXMgY2FyZCBoYXMgYSBzaW1pbGFyIHByb2JsZW0gbGlrZSB0aGUgRWxzYSBHbG9yaWEuIEl0IHdhbnRzCi10byByZWFkIHRoZSBzeXN0ZW0gQklPUyBkYXRlIGF0IDB4ZmZmZmQuCi0KLTYuIE1hdHJveCBNeXN0aXF1ZSBQQ0kgCi1UaGlzIGNhcmQgcmVhZHMgdGhlIElPIHBvcnQgMHg2Mi4gSWYgaXQgZG9lc24ndCBsaWtlIHdoYXQgaXQgc2VlcwotaXQgbG9vcHMgZm9yZXZlci4gVG8ga2VlcCB0aGUgY2FyZCBoYXBweSBwdXQgMHhmYyBpbnRvIDB4ZmZmZmUuCi1UaGlzIGxvY2F0aW9uIGhvbGRzIHRoZSBzeXN0ZW0gbW9kZWwgaWQuIDB4ZmMgbWVhbnMgSUJNLUFULgotIE9uZSBjYW4gbWFrZSBhbiBpbnRlcmVzdGluZyBvYnNlcnZhdGlvbjogdGhpcyBjYXJkIGxpa2VzIHRvIGtub3cgCi13aXRoIHdob20gaXQgaGFzIHRvIHNoYXJlIHRoZSBzeXN0ZW0uIFRoZXJlZm9yZSBpdCBhY2Nlc3NlcyBQQ0kgCi1jb25maWcgc3BhY2Ugb2YgYWxsIHRoZSBvdGhlciBjYXJkcy4gSXQgZG9lcyB0aGlzIGJ5cGFzc2luZyB0aGUgCi1QQ0kgQklPUyBieSByZWFkaW5nIHRoZSBQQ0kgYWNjZXNzIHBvcnRzIGRpcmVjdGx5LgotCi03LiBNYXRyb3ggRzEwMCBBR1AKLVRoaXMgY2FyZCBoYXMgdGhlIHNhbWUgcHJvYmxlbSBhcyB0aGUgTXlzdGlxdWUuIAotCi1BcHBlcmFudGx5IHRoaXMgd29ya3Mgbm93LiBIb3dldmVyIG5vdCBhbGwgY29tYmluYXRpb25zIG9mIGNhcmRzIGFyZQotY2hlY2tlZCwgeWV0LgotCi1GdXJ0aGVyIG5vdGVzOgotdGhlIElPIHJlZ2lzdGVyIDB4NDItMHg0MyBhcyB3ZWxsIGFzIDB4NjEtMHg2MyBhcmUgb2Ygc3BlY2lhbCBpbnRlcmVzdAotZm9yIG1hbnkgZ3JhcGhpYyBjYXJkcy4gVGhleSBzaG91bGQgYmUgZW11bGF0ZWQuCi1UaGUgc28gY2FsbGVkICJJbmR1c3RyeSBTdGFuZGFyZCBCSU9TIEVudHJ5IFBvaW50cyIgdG8gaW50IDB4NDIgKDB4RkYwNjUpCi1hbmQgdG8gaW50IDB4MWEgKDB4RkZFNkUpIHNob3VsZCBiZSBmaWxsZWQgd2l0aCB1c2VmdWwgY29kZS4gVGhpcyBjb2RlCi1uZWVkcyB0byByZXR1cm4gYXMgaWYgaXQgd2FzIGNhbGxlZCBhcyBpbnQuCi1UaGUgc3VidmVuZG9yIElEIFBDSSByZWdpc3RlcnMgbWlnaHQgY2F1c2UgcHJvYmxlbXMuIE9uIHNvbWUgY2hpcHNldHMKLXRoZXkgYXJlIHByb2dyYW1tZWQgaW4gYSBub24tb2Jpdm91cyBub24tUENJIGNvbmZvcm1hbnQgd2F5LgotVl9CaW9zZXMgYXJlIHNlZW4gdG8gbW9kaWZ5IHRoZSBmb2xsb3dpbmcgaW50OgotMHgxMCAoZGVmYXVsdCB2aWRlbyksIDB4MWYoZm9udCB0YWJsZSksIDB4NDIoY29weSBvZiBkZWZhdWx0IHZpZGVvKSwgCi0weDQzICg/PyksIDB4NmQgKGNvcHkgb2YgZGVmYXVsdCB2aWRlbyAtIHNhbWUgYXMgMHgxMD8pCi0KLVRPRE86Ci1JbnQgMHg2ZCBuZWVkcyB0byBiZSBkb25lLgotQWxsIGludGVycnVwdHMgd2hlcmUgdGhlcmUgaXMgbm8gZGVmYXVsdCBpbmR1c3RyeSBzdGFuZGFyZCBlbnRyeSBwb2ludAotc2hvdWxkIHBvaW50IHRvIGFuIHVudXNlZCBsb2NhdGlvbiBpbiB0aGUgMHhGMDAwIHNlZ21hbnQgKHBvc3NpYmx5IAotMHhGMDAwMCkuIFRoaXMgd2F5IHRoZXkgY291bGQgYmUgdHJhcHBlZC4gQSB0cmFwIGhhbmRsZXIgZm9yCi1hLiBpbnQgMHg0MiBhbmQgaW50IDB4MWEgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQuCi1UaGUgZGVmYXVsdCAiaW5kdXN0cnkgZW50cnkgcG9pbnQiIGZvciB2aWRlbyBhbmQgUENJICgweEZGRTZFKSBzaG91bGQKLWFsc28gYmUgaW1wbGVtZW50ZWQuIChhbnkgb3RoZXJzPykgVGhleSBzaG91bGQgZWl0aGVyIGJlIHJvdXRlZCB0bwotaW50IDB4NDIoMHg2ZD8pICh2aWRlbykgYW5kIDB4MUEgKFBDSSkgb3Igc29tZSBvdGhlciBpbnRlcnJ1cHRzIHRvCi10cmFwIHRoZW0uIE1hcHBpbmcgb2Ygc3lzdGVtIGJpb3MgbWlnaHQgbm90IGJlIGEgZ29vZCBpZGVhLiBNYXliZQotdGhlIHN5c3RlbSBiaW9zIGFyZWEgc2hvdWxkIGp1c3QgYmUgZmlsbGVkIHdpdGggImhsdCIgdG8gdHJhcCBhbnkKLWFjY2VzcyB0aGVyZS4KLUhhbmRsaW5nIG9mIHRpbWVyIElPIHJlZ2lzdGVycyAweDQyLCAweDQzIGFuZCBJTyByZWdpc3RlcnMgMHg2MSwgMHg2Mi4KLQotRmluZCBkb2N1bWVudGF0aW9uOgotLSBvbiBpbnRlcnJ1cHQgdmVjdG9yIHRhYmxlCi0tIG9uIGluZHVzdHJ5IHN0YW5kYXJkIGVudHJ5IHBvaW50cyB0byB0aGUgc3lzdGVtIGJpb3MKLS0gb24gSU8gcmVnaXN0ZXJzIDB4NjEgYW5kIDB4NjIKLQotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2hleGR1bXAgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2hleGR1bXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzU5ZTUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9oZXhkdW1wCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0iJTA2LjZfYXggICIgIDE2LzEgIiUwMnggIiAKLSIgICIgMTYvMSAiJV9wIiAKLSJcbiIKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaW50LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2ludC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTA0YzZjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgotICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci0gKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCi0gKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAotICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLSAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLSAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkIChfX2lhNjRfXykKLSNpbmNsdWRlIDxzeXMvaW8uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAidjg2Ymlvcy5oIgotI2luY2x1ZGUgIkFzbU1hY3Jvcy5oIgotI2luY2x1ZGUgInBjaS5oIgotCi1zdGF0aWMgaW50IGludDFBX2hhbmRsZXIoc3RydWN0IHJlZ3M4NiAqcmVncyk7Ci1zdGF0aWMgaW50IGludDQyX2hhbmRsZXIoaW50IG51bSwgc3RydWN0IHJlZ3M4NiAqcmVncyk7Ci0KLWludAotaW50X2hhbmRsZXIoaW50IG51bSwgc3RydWN0IHJlZ3M4NiAqcmVncykKLXsKLSAgICBzd2l0Y2ggKG51bSkgewotICAgIGNhc2UgMHgxMDoKLSAgICBjYXNlIDB4NDI6Ci0JcmV0dXJuIChpbnQ0Ml9oYW5kbGVyKG51bSxyZWdzKSk7Ci0gICAgY2FzZSAweDFBOgotCXJldHVybiAoaW50MUFfaGFuZGxlcihyZWdzKSk7Ci0gICAgZGVmYXVsdDoKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWludDQyX2hhbmRsZXIoaW50IG51bSxzdHJ1Y3QgcmVnczg2ICpyZWdzKQotewotICAgIHVuc2lnbmVkIGNoYXIgYzsKLSAgICBDQVJEMzIgdmFsOwotCi0gICAgaV9wcmludGYoImludCAweCV4OiBheDoweCVseCBieDoweCVseCBjeDoweCVseCBkeDoweCVseFxuIixudW0sCi0JICAgcmVncy0+ZWF4LHJlZ3MtPmVieCwgcmVncy0+ZWN4LCByZWdzLT5lZHgpOwotCi0gICAgLyoKLSAgICAgKiB2aWRlbyBiaW9zIGhhcyBtb2RpZmllZCB0aGVzZSAtCi0gICAgICogbGVhdmUgaXQgdG8gdGhlIHZpZGVvIGJpb3MgdG8gZG8gdGhpcwotICAgICAqLwotCi0gICAgdmFsID0gZ2V0SW50VmVjdChudW0pOwotICAgIGlmICh2YWwgIT0gMHhGMDAwRjA2NSkKLSAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKChyZWdzLT5lYnggJiAweGZmKSA9PSAweDMyKSB7Ci0Jc3dpdGNoIChyZWdzLT5lYXggJiAweEZGRkYpIHsKLQljYXNlIDB4MTIwMDoKLQkgICAgaV9wcmludGYoImVuYWJsaW5nIHZpZGVvXG4iKTsKLQkgICAgYyA9IGluYigweDNjYyk7Ci0JICAgIGMgfD0gMHgwMjsKLQkgICAgb3V0YigweDNjMixjKTsKLQkgICAgcmV0dXJuIDE7Ci0JY2FzZSAweDEyMDE6Ci0JICAgIGlfcHJpbnRmKCJkaXNhYmxpbmcgdmlkZW9cbiIpOwotCSAgICBjID0gaW5iKDB4M2NjKTsKLQkgICAgYyAmPSB+MHgwMjsKLQkgICAgb3V0YigweDNjMixjKTsKLQkgICAgcmV0dXJuIDE7Ci0JZGVmYXVsdDoKLQl9Ci0gICAgfQotICAgIGlmIChudW0gPT0gMHg0MikKLQlyZXR1cm4gMTsKLSAgICBlbHNlCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgU1VDQ0VTU0ZVTCAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBERVZJQ0VfTk9UX0ZPVU5EICAgICAgICAweDg2Ci0jZGVmaW5lIEJBRF9SRUdJU1RFUl9OVU1CRVIgICAgIDB4ODcKLQotc3RhdGljIGludAotaW50MUFfaGFuZGxlcihzdHJ1Y3QgcmVnczg2ICpyZWdzKQotewotICAgIENBUkQzMiBTbG90OwotICAgIFBjaVN0cnVjdFB0ciBwUGNpOwotCi0gICAgaWYgKCEgQ3VycmVudFBjaSkgcmV0dXJuIDA7IC8qIG9vcHMgKi8KLQotICAgIGlfcHJpbnRmKCJpbnQgMHgxYTogYXg9MHglbHggYng9MHglbHggY3g9MHglbHggZHg9MHglbHggZGk9MHglbHgiCi0JICIgc2k9MHglbHhcbiIsIHJlZ3MtPmVheCxyZWdzLT5lYngscmVncy0+ZWN4LHJlZ3MtPmVkeCwKLQkgcmVncy0+ZWRpLHJlZ3MtPmVzaSk7Ci0gICAgc3dpdGNoIChyZWdzLT5lYXggJiAweEZGRkYpIHsKLSAgICBjYXNlIDB4YjEwMToKLQlyZWdzLT5lYXggICY9IDB4RkYwMDsgICAvKiBubyBjb25maWcgc3BhY2Uvc3BlY2lhbCBjeWNsZSBzdXBwb3J0ICovCi0JcmVncy0+ZWR4ID0gMHgyMDQ5NDM1MDsgLyogIiBJQ1AiICovCi0JcmVncy0+ZWJ4ICA9IDB4MDIxMDsgICAgLyogVmVyc2lvbiAyLjEwICovCi0JcmVncy0+ZWN4ICAmPSAweEZGMDA7Ci0JcmVncy0+ZWN4IHw9IChwY2lNYXhCdXMgJiAweEZGKTsgICAvKiBNYXggYnVzIG51bWJlciBpbiBzeXN0ZW0gKi8KLQlyZWdzLT5lZmxhZ3MgJj0gfigodW5zaWduZWQgbG9uZykweDAxKTsgLyogY2xlYXIgY2FycnkgZmxhZyAqLwotCWlfcHJpbnRmKCJheD0weCVseCBkeD0weCVseCBieD0weCVseCBjeD0weCVseCBmbGFncz0weCVseFxuIiwKLQkJIHJlZ3MtPmVheCxyZWdzLT5lZHgscmVncy0+ZWJ4LHJlZ3MtPmVjeCxyZWdzLT5lZmxhZ3MpOwotCXJldHVybiAxOwotICAgIGNhc2UgMHhiMTAyOgotCWlmICgoKHJlZ3MtPmVkeCAmIDB4RkZGRikgPT0gQ3VycmVudFBjaS0+VmVuZG9ySUQpICYmCi0JICAgICgocmVncy0+ZWN4ICYgMHhGRkZGKSA9PSBDdXJyZW50UGNpLT5EZXZpY2VJRCkgJiYKLQkgICAgKHJlZ3MtPmVzaSA9PSAwKSkgewotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChTVUNDRVNTRlVMIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgJj0gfigodW5zaWduZWQgbG9uZykweDAxKTsgLyogY2xlYXIgY2FycnkgZmxhZyAqLwotCSAgICByZWdzLT5lYnggPSBwY2lTbG90QlgoQ3VycmVudFBjaSk7Ci0JfQotCWVsc2UgaWYgKENvbmZpZy5TaG93QWxsRGV2ICYmCi0JICAgICAocFBjaSA9IGZpbmRQY2lEZXZpY2UocmVncy0+ZWR4LHJlZ3MtPmVjeCxyZWdzLT5lc2kpKSAhPSBOVUxMKSB7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKFNVQ0NFU1NGVUwgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyAmPSB+KCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBjbGVhciBjYXJyeSBmbGFnICovCi0JICAgIHJlZ3MtPmVieCA9IHBjaVNsb3RCWChwUGNpKTsKLQl9IGVsc2UgIHsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoREVWSUNFX05PVF9GT1VORCA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzIHw9ICgodW5zaWduZWQgbG9uZykweDAxKTsgLyogc2V0IGNhcnJ5IGZsYWcgKi8KLQl9Ci0JaV9wcmludGYoImF4PTB4JWx4IGJ4PTB4JWx4IGZsYWdzPTB4JWx4XG4iLAotCQkgcmVncy0+ZWF4LHJlZ3MtPmVieCxyZWdzLT5lZmxhZ3MpOwotCXJldHVybiAxOwotICAgIGNhc2UgMHhiMTAzOgotCWlmICgoKHJlZ3MtPmVjeCAmIDB4RkYpID09IEN1cnJlbnRQY2ktPkludGVyZmFjZSkgJiYKLQkgICAgKCgocmVncy0+ZWN4ICYgMHhGRjAwKSA+PiA4KSA9PSBDdXJyZW50UGNpLT5TdWJDbGFzcykgJiYKLQkgICAgKCgocmVncy0+ZWN4ICYgMHhGRkZGMDAwMCkgPj4gMTYpID09IEN1cnJlbnRQY2ktPkJhc2VDbGFzcykgJiYKLQkgICAgKChyZWdzLT5lc2kgJiAweGZmKSA9PSAwKSkgewotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChTVUNDRVNTRlVMIDw8IDgpOwotCSAgICByZWdzLT5lYnggPSBwY2lTbG90QlgoQ3VycmVudFBjaSk7Ci0JICAgIHJlZ3MtPmVmbGFncyAmPSB+KCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBjbGVhciBjYXJyeSBmbGFnICovCi0JfQotCWVsc2UgaWYgKENvbmZpZy5TaG93QWxsRGV2Ci0JICAgICAmJiAocFBjaSA9IGZpbmRQY2lDbGFzcyhyZWdzLT5lY3ggJiAweEZGLCAocmVncy0+ZWN4ICYgMHhmZjAwKSA+PiA4LAotCQkJIChyZWdzLT5lY3ggJiAweGZmZmYwMDAwKSA+PiAxNiwgcmVncy0+ZXNpKSkgIT0gTlVMTCkgewotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChTVUNDRVNTRlVMIDw8IDgpOwotCSAgICByZWdzLT5lYnggPSBwY2lTbG90QlgocFBjaSk7Ci0JICAgIHJlZ3MtPmVmbGFncyAmPSB+KCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBjbGVhciBjYXJyeSBmbGFnICovCi0JfSBlbHNlIHsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoREVWSUNFX05PVF9GT1VORCA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzIHw9ICgodW5zaWduZWQgbG9uZykweDAxKTsgLyogc2V0IGNhcnJ5IGZsYWcgKi8KLQl9Ci0JaV9wcmludGYoImF4PTB4JWx4IGZsYWdzPTB4JWx4XG4iLHJlZ3MtPmVheCxyZWdzLT5lZmxhZ3MpOwotCXJldHVybiAxOwotICAgIGNhc2UgMHhiMTA4OgotCWlfcHJpbnRmKCJTbG90PTB4JXhcbiIsQ3VycmVudFBjaS0+U2xvdC5sKTsKLQlpZiAoKFNsb3QgPSBmaW5kUGNpKHJlZ3MtPmVieCkpKSB7Ci0JICAgIHJlZ3MtPmVjeCAmPSAweEZGRkZGRjAwOwotCSAgICByZWdzLT5lY3ggfD0gUGNpUmVhZDgocmVncy0+ZWRpLFNsb3QpOwotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChTVUNDRVNTRlVMIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgJj0gfigodW5zaWduZWQgbG9uZykweDAxKTsgLyogY2xlYXIgY2FycnkgZmxhZyAqLwotCX0gZWxzZSB7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKEJBRF9SRUdJU1RFUl9OVU1CRVIgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyB8PSAoKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIHNldCBjYXJyeSBmbGFnICovCi0JfQotCWlfcHJpbnRmKCJheD0weCVseCBjeD0weCVseCBmbGFncz0weCVseFxuIiwKLQkJIHJlZ3MtPmVheCxyZWdzLT5lY3gscmVncy0+ZWZsYWdzKTsKLQlyZXR1cm4gMTsKLSAgICBjYXNlIDB4YjEwOToKLQlpX3ByaW50ZigiU2xvdD0weCV4XG4iLEN1cnJlbnRQY2ktPlNsb3QubCk7Ci0JaWYgKChTbG90ID0gZmluZFBjaShyZWdzLT5lYngpKSkgewotCSAgICByZWdzLT5lY3ggJj0gMHhGRkZGMDAwMDsKLQkgICAgcmVncy0+ZWN4IHw9IFBjaVJlYWQxNihyZWdzLT5lZGksU2xvdCk7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKFNVQ0NFU1NGVUwgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyAmPSB+KCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBjbGVhciBjYXJyeSBmbGFnICovCi0JfSBlbHNlIHsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoQkFEX1JFR0lTVEVSX05VTUJFUiA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzIHw9ICgodW5zaWduZWQgbG9uZykweDAxKTsgLyogc2V0IGNhcnJ5IGZsYWcgKi8KLQl9Ci0JaV9wcmludGYoImF4PTB4JWx4IGN4PTB4JWx4IGZsYWdzPTB4JWx4XG4iLAotCQkgcmVncy0+ZWF4LHJlZ3MtPmVjeCxyZWdzLT5lZmxhZ3MpOwotCXJldHVybiAxOwotICAgIGNhc2UgMHhiMTBhOgotCWlfcHJpbnRmKCJTbG90PTB4JXhcbiIsQ3VycmVudFBjaS0+U2xvdC5sKTsKLQlpZiAoKFNsb3QgPSBmaW5kUGNpKHJlZ3MtPmVieCkpKSB7Ci0JICAgIHJlZ3MtPmVjeCAmPSAwOwotCSAgICByZWdzLT5lY3ggfD0gUGNpUmVhZDMyKHJlZ3MtPmVkaSxTbG90KTsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoU1VDQ0VTU0ZVTCA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzICY9IH4oKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIGNsZWFyIGNhcnJ5IGZsYWcgKi8KLQl9IGVsc2UgewotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChCQURfUkVHSVNURVJfTlVNQkVSIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgfD0gKCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBzZXQgY2FycnkgZmxhZyAqLwotCX0KLQlpX3ByaW50ZigiYXg9MHglbHggY3g9MHglbHggZmxhZ3M9MHglbHhcbiIsCi0JCSByZWdzLT5lYXgscmVncy0+ZWN4LHJlZ3MtPmVmbGFncyk7Ci0JcmV0dXJuIDE7Ci0gICAgY2FzZSAweGIxMGI6Ci0JaV9wcmludGYoIlNsb3Q9MHgleFxuIixDdXJyZW50UGNpLT5TbG90LmwpOwotCWlmICgoU2xvdCA9IGZpbmRQY2kocmVncy0+ZWJ4KSkpIHsKLQkgICAgUGNpV3JpdGU4KHJlZ3MtPmVkaSwoQ0FSRDgpcmVncy0+ZWN4LFNsb3QpOwotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChTVUNDRVNTRlVMIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgJj0gfigodW5zaWduZWQgbG9uZykweDAxKTsgLyogY2xlYXIgY2FycnkgZmxhZyAqLwotCX0gZWxzZSB7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKEJBRF9SRUdJU1RFUl9OVU1CRVIgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyB8PSAoKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIHNldCBjYXJyeSBmbGFnICovCi0JfQotCWlfcHJpbnRmKCJheD0weCVseCBmbGFncz0weCVseFxuIiwgcmVncy0+ZWF4LHJlZ3MtPmVmbGFncyk7Ci0JcmV0dXJuIDE7Ci0gICAgY2FzZSAweGIxMGM6Ci0JaV9wcmludGYoIlNsb3Q9MHgleFxuIixDdXJyZW50UGNpLT5TbG90LmwpOwotCWlmICgoU2xvdCA9IGZpbmRQY2kocmVncy0+ZWJ4KSkpIHsKLQkgICAgUGNpV3JpdGUxNihyZWdzLT5lZGksKENBUkQxNilyZWdzLT5lY3gsU2xvdCk7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKFNVQ0NFU1NGVUwgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyAmPSB+KCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBjbGVhciBjYXJyeSBmbGFnICovCi0JfSBlbHNlIHsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoQkFEX1JFR0lTVEVSX05VTUJFUiA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzIHw9ICgodW5zaWduZWQgbG9uZykweDAxKTsgLyogc2V0IGNhcnJ5IGZsYWcgKi8KLQl9Ci0JaV9wcmludGYoImF4PTB4JWx4IGZsYWdzPTB4JWx4XG4iLCByZWdzLT5lYXgscmVncy0+ZWZsYWdzKTsKLQlyZXR1cm4gMTsKLSAgICBjYXNlIDB4YjEwZDoKLQlpX3ByaW50ZigiU2xvdD0weCV4XG4iLEN1cnJlbnRQY2ktPlNsb3QubCk7Ci0JaWYgKChTbG90ID0gZmluZFBjaShyZWdzLT5lYngpKSkgewotCSAgICBQY2lXcml0ZTMyKHJlZ3MtPmVkaSwoQ0FSRDMyKXJlZ3MtPmVjeCxTbG90KTsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoU1VDQ0VTU0ZVTCA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzICY9IH4oKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIGNsZWFyIGNhcnJ5IGZsYWcgKi8KLQl9IGVsc2UgewotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChCQURfUkVHSVNURVJfTlVNQkVSIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgfD0gKCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBzZXQgY2FycnkgZmxhZyAqLwotCX0KLQlpX3ByaW50ZigiYXg9MHglbHggZmxhZ3M9MHglbHhcbiIsIHJlZ3MtPmVheCxyZWdzLT5lZmxhZ3MpOwotCXJldHVybiAxOwotICAgIGRlZmF1bHQ6Ci0JcmV0dXJuIDA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9pby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9pby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzViNDNlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDE5OTkgRWdiZXJ0IEVpY2gKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkIGluCi0gKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKLSAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMKLSAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCi0gKiAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotICogRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAotICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgotICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotI2luY2x1ZGUgImRlYnVnLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkIChfX2lhNjRfXykKLSNpbmNsdWRlIDxzeXMvaW8uaD4KLSNlbmRpZgotI2luY2x1ZGUgIkFzbU1hY3Jvcy5oIgotI2luY2x1ZGUgInY4NmJpb3MuaCIKLSNpbmNsdWRlICJwY2kuaCIKLQotaW50IHJfaW5iID0gMCwgcl9pbncgPSAwLCByX2lubCA9IDAsIHJfb3V0YiA9IDAsIHJfb3V0dyA9IDAsIHJfb3V0bCA9IDA7Ci1pbnQgaW5fYiA9IDAsIGluX3cgPSAwLCBpbl9sID0gMCwgb3V0X2IgPSAwLCBvdXRfdyA9IDAsIG91dF9sID0gMDsKLQotCi1pbnQKLXBvcnRfcmVwX2luYihDQVJEMTYgcG9ydCwgQ0FSRDggKmJhc2UsIGludCBkX2YsIENBUkQzMiBjb3VudCkKLXsKLSAgICByZWdpc3RlciBpbnQgaW5jID0gZF9mID8gLTEgOiAxOwotICAgIENBUkQ4ICpkc3QgPSBiYXNlOwotCi0gICAgcF9wcmludGYoIiByZXBfaW5zYiglI3gpICVkIGJ5dGVzIGF0ICVwICVzIiwKLQkgICAgIHBvcnQsIGNvdW50LCBiYXNlLCBkX2Y/InVwIjoiZG93biIpOwotICAgIGlmIChDb25maWcuUHJpbnRJcCkKLQlwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOwotICAgIGVsc2UgcF9wcmludGYoIlxuIik7Ci0KLSAgICByX2luYisrOwotICAgIHdoaWxlIChjb3VudC0tKSB7Ci0JKmRzdCA9IGluYihwb3J0KTsKLQlkc3QgKz0gaW5jOwotICAgIH0KLSAgICByZXR1cm4gKGRzdC1iYXNlKTsKLX0KLQotaW50Ci1wb3J0X3JlcF9pbncoQ0FSRDE2IHBvcnQsIENBUkQxNiAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KQotewotICAgIHJlZ2lzdGVyIGludCBpbmMgPSBkX2YgPyAtMSA6IDE7Ci0gICAgQ0FSRDE2ICpkc3QgPSBiYXNlOwotCi0gICAgcF9wcmludGYoIiByZXBfaW5zdyglI3gpICVkIGJ5dGVzIGF0ICVwICVzIiwKLQkgICAgIHBvcnQsIGNvdW50LCBiYXNlLCBkX2Y/InVwIjoiZG93biIpOwotICAgIGlmIChDb25maWcuUHJpbnRJcCkKLQlwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOwotICAgIGVsc2UgcF9wcmludGYoIlxuIik7Ci0KLSAgICByX2ludysrOwotICAgIHdoaWxlIChjb3VudC0tKSB7Ci0JKmRzdCA9IGludyhwb3J0KTsKLQlkc3QgKz0gaW5jOwotICAgIH0KLSAgICByZXR1cm4gKGRzdC1iYXNlKTsKLX0KLQotaW50Ci1wb3J0X3JlcF9pbmwoQ0FSRDE2IHBvcnQsIENBUkQzMiAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KQotewotICAgIHJlZ2lzdGVyIGludCBpbmMgPSBkX2YgPyAtMSA6IDE7Ci0gICAgQ0FSRDMyICpkc3QgPSBiYXNlOwotCi0gICAgcF9wcmludGYoIiByZXBfaW5zbCglI3gpICVkIGJ5dGVzIGF0ICVwICVzIiwKLQkgICAgIHBvcnQsIGNvdW50LCBiYXNlLCBkX2Y/InVwIjoiZG93biIpOwotICAgIGlmIChDb25maWcuUHJpbnRJcCkKLQlwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOwotICAgIGVsc2UgcF9wcmludGYoIlxuIik7Ci0KLSAgICByX2lubCsrOwotICAgIHdoaWxlIChjb3VudC0tKSB7Ci0JKmRzdCA9IGlubChwb3J0KTsKLQlkc3QgKz0gaW5jOwotICAgIH0KLSAgICByZXR1cm4gKGRzdC1iYXNlKTsKLX0KLQotaW50Ci1wb3J0X3JlcF9vdXRiKENBUkQxNiBwb3J0LCBDQVJEOCAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KQotewotICAgIHJlZ2lzdGVyIGludCBpbmMgPSBkX2YgPyAtMSA6IDE7Ci0gICAgQ0FSRDggKmRzdCA9IGJhc2U7Ci0KLSAgICBwX3ByaW50ZigiIHJlcF9vdXRiKCUjeCkgJWQgYnl0ZXMgYXQgJXAgJXMiLAotCSAgICAgcG9ydCwgY291bnQsIGJhc2UsIGRfZj8idXAiOiJkb3duIik7Ci0gICAgaWYgKENvbmZpZy5QcmludElwKQotCXBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7Ci0gICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKLQotICAgIHJfb3V0YisrOwotICAgIHdoaWxlIChjb3VudC0tKSB7Ci0Jb3V0Yihwb3J0LCpkc3QpOwotCWRzdCArPSBpbmM7Ci0gICAgfQotICAgIHJldHVybiAoZHN0LWJhc2UpOwotfQotCi1pbnQKLXBvcnRfcmVwX291dHcoQ0FSRDE2IHBvcnQsIENBUkQxNiAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KQotewotICAgIHJlZ2lzdGVyIGludCBpbmMgPSBkX2YgPyAtMSA6IDE7Ci0gICAgQ0FSRDE2ICpkc3QgPSBiYXNlOwotCi0gICAgcF9wcmludGYoIiByZXBfb3V0dyglI3gpICVkIGJ5dGVzIGF0ICVwICVzIiwKLQkgICAgIHBvcnQsIGNvdW50LCBiYXNlLCBkX2Y/InVwIjoiZG93biIpOwotICAgIGlmIChDb25maWcuUHJpbnRJcCkKLQlwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOwotICAgIGVsc2UgcF9wcmludGYoIlxuIik7Ci0KLSAgICByX291dHcrKzsKLSAgICB3aGlsZSAoY291bnQtLSkgewotCW91dHcocG9ydCwqZHN0KTsKLQlkc3QgKz0gaW5jOwotICAgIH0KLSAgICByZXR1cm4gKGRzdC1iYXNlKTsKLX0KLQotaW50Ci1wb3J0X3JlcF9vdXRsKENBUkQxNiBwb3J0LCBDQVJEMzIgKmJhc2UsIGludCBkX2YsIENBUkQzMiBjb3VudCkKLXsKLSAgICByZWdpc3RlciBpbnQgaW5jID0gZF9mID8gLTEgOiAxOwotICAgIENBUkQzMiAqZHN0ID0gYmFzZTsKLQotICAgIHBfcHJpbnRmKCIgcmVwX291dGwoJSN4KSAlZCBieXRlcyBhdCAlcCAlcyIsCi0JICAgICBwb3J0LCBjb3VudCwgYmFzZSwgZF9mPyJ1cCI6ImRvd24iKTsKLSAgICBpZiAoQ29uZmlnLlByaW50SXApCi0JcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKLSAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOwotCi0gICAgcl9vdXRsKys7Ci0gICAgd2hpbGUgKGNvdW50LS0pIHsKLQlvdXRsKHBvcnQsKmRzdCk7Ci0JZHN0ICs9IGluYzsKLSAgICB9Ci0gICAgcmV0dXJuIChkc3QtYmFzZSk7Ci19Ci0KLUNBUkQ4Ci1wX2luYihDQVJEMTYgcG9ydCkKLXsKLSAgICBDQVJEOCB2YWwgPSAwOwotICAgIGluX2IrKzsKLSAgICB2YWwgPSBpbmIocG9ydCk7Ci0gICAgcF9wcmludGYoIiBpbmIoJSN4KSA9ICUyLjJ4Iixwb3J0LHZhbCk7Ci0gICAgaWYgKENvbmZpZy5QcmludElwKQotCXBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7Ci0gICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKLQotICAgIHJldHVybiB2YWw7Ci19Ci0KLUNBUkQxNgotcF9pbncoQ0FSRDE2IHBvcnQpCi17Ci0gICAgQ0FSRDE2IHZhbCA9IDA7Ci0gICAgaW5fdysrOwotICAgIHZhbCA9IGludyhwb3J0KTsKLSAgICBwX3ByaW50ZigiIGludyglI3gpID0gJTQuNHgiLHBvcnQsdmFsKTsKLSAgICBpZiAoQ29uZmlnLlByaW50SXApCi0JcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKLSAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOwotCi0gICAgcmV0dXJuIHZhbDsKLX0KLQotQ0FSRDMyCi1wX2lubChDQVJEMTYgcG9ydCkKLXsKLSAgICBDQVJEMzIgdmFsID0gMDsKLSAgICBpbl9sKys7Ci0jaWZkZWYgTkVFRF9QQ0lfSU8KLSAgICBpZiAoY2ZnMWluKHBvcnQsJnZhbCkpCi0JcmV0dXJuIHZhbDsKLSAgICBlbHNlCi0jZW5kaWYKLSAgICB2YWwgPSBpbmwocG9ydCk7Ci0gICAgcF9wcmludGYoIiBpbmwoJSN4KSA9ICU4Ljh4Iixwb3J0LHZhbCk7Ci0gICAgaWYgKENvbmZpZy5QcmludElwKQotCXBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7Ci0gICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKLQotICAgIHJldHVybiB2YWw7Ci19Ci0KLXZvaWQKLXBfb3V0YihDQVJEMTYgcG9ydCwgQ0FSRDggdmFsKQotewotICAgIG91dF9iKys7Ci0gICAgcF9wcmludGYoIiBvdXRiKCUjeCwgJTIuMngpIixwb3J0LHZhbCk7Ci0gICAgaWYgKENvbmZpZy5QcmludElwKQotCXBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7Ci0gICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKLQotICAgIG91dGIocG9ydCx2YWwpOwotfQotCi12b2lkCi1wX291dHcoQ0FSRDE2IHBvcnQsIENBUkQxNiB2YWwpCi17Ci0gICAgb3V0X3crKzsKLSAgICBwX3ByaW50ZigiIG91dHcoJSN4LCAlNC40eCkiLHBvcnQsdmFsKTsKLSAgICBpZiAoQ29uZmlnLlByaW50SXApCi0JcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKLSAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOwotCi0gICAgb3V0dyhwb3J0LHZhbCk7Ci19Ci0KLXZvaWQKLXBfb3V0bChDQVJEMTYgcG9ydCwgQ0FSRDMyIHZhbCkKLXsKLSAgICBvdXRfbCsrOwotICAgIHBfcHJpbnRmKCIgb3V0bCglI3gsICU4Ljh4KSIscG9ydCx2YWwpOwotICAgIGlmIChDb25maWcuUHJpbnRJcCkKLQlwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOwotICAgIGVsc2UgcF9wcmludGYoIlxuIik7Ci0KLSNpZmRlZiBORUVEX1BDSV9JTwotICAgIGlmIChjZmcxb3V0KHBvcnQsdmFsKSkKLQlyZXR1cm47Ci0jZW5kaWYKLSAgICBvdXRsKHBvcnQsdmFsKTsKLX0KLQotdm9pZAotaW9fc3RhdGlzdGljcyh2b2lkKQotewotICAgIHBfcHJpbnRmKCJyZXA6IGluYjogJWksIGludzogJWksIGlubDogJWksIG91dGI6ICVpLCBvdXR3OiAlaSwgb3V0bDogJWlcbiIsCi0JIHJfaW5iLHJfaW53LHJfaW5sLHJfb3V0YixyX291dHcscl9vdXRsKTsKLSAgICBwX3ByaW50ZigiaW5iOiAlaSwgaW53OiAlaSwgaW5sOiAlaSwgb3V0YjogJWksIG91dHc6ICVpLCBvdXRsOiAlaVxuIiwKLQkgaW5fYixpbl93LGluX2wsb3V0X2Isb3V0X3csb3V0X2wpOwotfQotCi12b2lkCi1jbGVhcl9zdGF0KHZvaWQpCi17Ci0gICAgcl9pbmIgPSByX2ludyA9IHJfaW5sID0gcl9vdXRiID0gcl9vdXR3ID0gcl9vdXRsID0gMDsKLSAgICBpbl9iID0gaW5fdyA9IGluX2wgPSBvdXRfYiA9IG91dF93ID0gb3V0X2wgPSAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9sZXgubCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvbGV4LmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzM5MWMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9sZXgubAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSV7Ci0jaW5jbHVkZSAicGFyc2VyLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0gdm9pZCBnZXRsaW5lKGNoYXIgKmJ1ZixpbnQgKm51bSxpbnQgbWF4X251bSk7Ci0gICAgCi0jZGVmaW5lIFlZX0lOUFVUKGJ1ZixyZXN1bHQsbWF4X3NpemUpIHtcCi0gICAgICBnZXRsaW5lKGJ1ZiwmcmVzdWx0LG1heF9zaXplKTtcCi0gICAgICB9Ci0KLSB2b2lkCi0geXllcnJvciAoY2hhciAqcykgIAotIHsKLSAgICAgcHJpbnRmICgiJXNcbiIsIHMpOwotIH0KLQotJX0KLQotRElHSVQgWzAtOWEtZkEtRl0KLQotJSUKLQotIjB4Ij97RElHSVR9KyB7IHl5bHZhbCA9IHN0cnRvbCh5eXRleHQsTlVMTCwwKTsgcmV0dXJuIFRPS19OVU07IH0KLSJheCIgICAgICAgICAgeyByZXR1cm4gVE9LX1JFR19BWDsgfQotImJ4IiAgICAgICAgICB7IHJldHVybiBUT0tfUkVHX0JYOyB9Ci0iY3giICAgICAgICAgIHsgcmV0dXJuIFRPS19SRUdfQ1g7IH0KLSJkeCIgICAgICAgICAgeyByZXR1cm4gVE9LX1JFR19EWDsgfQotImRpIiAgICAgICAgICB7IHJldHVybiBUT0tfUkVHX1NJOyB9Ci0ic2kiICAgICAgICAgIHsgcmV0dXJuIFRPS19SRUdfREk7IH0KLSJkcyIgICAgICAgICAgeyByZXR1cm4gVE9LX1NFR19EUzsgfQotImVzIiAgICAgICAgICB7IHJldHVybiBUT0tfU0VHX0VTOyB9Ci0iOiIgICAgICAgICAgIHsgcmV0dXJuIFRPS19TRVA7fQotIiQie0RJR0lUfXsxLDJ9IHsgeXlsdmFsID0gc3RydG9sKHl5dGV4dCsxLE5VTEwsMCk7IHJldHVybiBUT0tfVkFSOyB9Ci0iJG1lbSIgICAgICAgIHsgcmV0dXJuIFRPS19WQVJfTUVNOyB9Ci1bIFx0XSsKLSIjIi4qW1xuXSAgIHsgcmV0dXJuIFRPS19FTkQ7IH0KLSJib290IiAgICAgICAgeyByZXR1cm4gVE9LX0NPTU1BTkRfQk9PVDsgfQotImRvIiAgICAgICAgICB7IHJldHVybiBUT0tfQ09NTUFORF9FWEVDOyB9Ci0iXCIiLioiXCIiICAgIHsgeXlsdmFsID0gKHVuc2lnbmVkIGxvbmcpIHl5dGV4dDsgcmV0dXJuIFRPS19TVFJJTkc7IH0KLSJieXRlIiAgICAgICAgeyByZXR1cm4gVE9LX0JZVEU7IH0KLSJ3b3JkIiAgICAgICAgeyByZXR1cm4gVE9LX1dPUkQ7IH0KLSJsb25nIiAgICAgICAgeyByZXR1cm4gVE9LX0xPTkc7IH0KLSJzZXRtZW0iICAgICAgeyByZXR1cm4gVE9LX0NPTU1BTkRfTUVNU0VUOyB9Ci0iZHVtcG1lbSIgICAgIHsgcmV0dXJuIFRPS19DT01NQU5EX01FTURVTVA7IH0KLSJxdWl0IiAgICAgICAgeyByZXR1cm4gVE9LX0NPTU1BTkRfUVVJVDsgfQotIlxuIiAgICAgICAgICB7IHJldHVybiBUT0tfRU5EOyB9Ci0ic2VsZWN0IiAgICAgIHsgcmV0dXJuIFRPS19TRUxFQ1Q7IH0KLSJpc2EiICAgICAgICAgeyByZXR1cm4gVE9LX0lTQTsgfQotInBjaSIgICAgICAgICB7IHJldHVybiBUT0tfUENJOyB9Ci0icHBvcnQiICAgICAgIHsgcmV0dXJuIFRPS19QUklOVF9QT1JUOyB9Ci0iaW9zdGF0IiAgICAgIHsgcmV0dXJuIFRPS19JT1NUQVQ7IH0KLSJwaXJxIiAgICAgICAgeyByZXR1cm4gVE9LX1BSSU5UX0lSUTsgfQotInBwY2kiICAgICAgICB7IHJldHVybiBUT0tfUFBDSTsgfQotInBpcCIgICAgICAgICB7IHJldHVybiBUT0tfUElQOyB9Ci0idHJhY2UiICAgICAgIHsgcmV0dXJuIFRPS19UUkFDRTsgfQotIm9uIiAgICAgICAgICB7IHJldHVybiBUT0tfT047IH0KLSJvZmYiICAgICAgICAgeyByZXR1cm4gVE9LX09GRjsgfQotInZlcmJvc2UiICAgICB7IHJldHVybiBUT0tfVkVSQk9TRTsgfQotImxvZyIgICAgICAgICB7IHJldHVybiBUT0tfTE9HOyB9Ci0icHJpbnQiICAgICAgIHsgcmV0dXJuIFRPS19TVERPVVQ7IH0KLSJjbHN0YXQiICAgICAgeyByZXR1cm4gVE9LX0NMU1RBVDsgfQotImhsdCIgICAgICAgICB7IHJldHVybiBUT0tfSExUOyB9Ci0iZGVsIiAgICAgICAgIHsgcmV0dXJuIFRPS19ERUw7IH0KLSJpb3Blcm0iICAgICAgeyByZXR1cm4gVE9LX0lPUEVSTTsgfQotImxwY2kiICAgICAgICB7IHJldHVybiBUT0tfRFVNUF9QQ0k7IH0KLSJib290YmlvcyIgICAgeyByZXR1cm4gVE9LX0JPT1RfQklPUzsgfQotIj8iICAgICAgICAgICB7IHJldHVybiAnPyc7IH0KLS4gICAgICAgICAgICAgeyByZXR1cm4gVE9LX0VSUk9SOyB9Ci0gICAgCi0lJQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL21haW4uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWY5MTE1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5OSBFZ2JlcnQgRWljaAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQgaW4KLSAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAotICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucwotICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKLSAqICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKgotICogVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0gKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCi0gKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCi0gKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0gKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0jZGVmaW5lIERFTEVURQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQgKF9faWE2NF9fKQotI2luY2x1ZGUgPHN5cy9pby5oPgotI2VsaWYgZGVmaW5lZChIQVZFX1NZU19QRVJNKQotI2luY2x1ZGUgPHN5cy9wZXJtLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgInY4NmJpb3MuaCIKLSNpbmNsdWRlICJwY2kuaCIKLSNpbmNsdWRlICJBc21NYWNyb3MuaCIKLQotI2RlZmluZSBTSVpFIDB4MTAwMDAwCi0jZGVmaW5lIFZSQU1fU1RBUlQgMHhBMDAwMAotI2RlZmluZSBWUkFNX1NJWkUgMHgxRkZGRgotI2RlZmluZSBWX0JJT1NfU0laRSAweDFGRkZGCi0jZGVmaW5lIEJJT1NfU1RBUlQgMHg3QzAwICAgICAgICAgICAgLyogZGVmYXVsdCBCSU9TIGVudHJ5ICovCi0KLS8qQ0FSRDggY29kZVtdID0geyAweGI4ICwgMHhmMCAsIDB4ZjAsIDB4ZjQgfTsgKi8KLSNkZWZpbmUgVkJfWCh4KSAoVl9CSU9TID4+IHgpICYgMHhGRgotQ0FSRDggY29kZVtdID0geyAweDlhLCAweDAzLCAweDAwLCAweDAwLCBWQl9YKDEyKSwgMHhmNCB9OwotLypDQVJEOCBjb2RlW10gPSB7IDB4OWEsIDB4MDMsIDB4MDAsIDB4MDAsIFZCX1goMTIpLCAweGI4LCAweDAzLCAweDAwLCAqLwotLyoweGNkLCAweDEwLCAweGY0IH07ICovCi0vKkNBUkQ4IGNvZGVbXSA9IHsgIDB4YjggLCAweGYwICwgMHhmMCAsMHhmNCB9OyAqLwotCi1zdGF0aWMgdm9pZCBzaWdfaGFuZGxlcihpbnQpOwotc3RhdGljIGludCBtYXAodm9pZCk7Ci1zdGF0aWMgdm9pZCB1bm1hcCh2b2lkKTsKLXN0YXRpYyB2b2lkIGJvb3RCSU9TKENBUkQxNiBheCk7Ci1zdGF0aWMgaW50IG1hcF92cmFtKHZvaWQpOwotc3RhdGljIHZvaWQgdW5tYXBfdnJhbSh2b2lkKTsKLXN0YXRpYyBpbnQgY29weV92Ymlvcyh2b2lkKTsKLXN0YXRpYyBpbnQgY29weV9zeXNfYmlvcyh2b2lkKTsKLXN0YXRpYyB2b2lkIHNhdmVfYmlvc190b19maWxlKHZvaWQpOwotc3RhdGljIGludCBzZXR1cF9zeXN0ZW1fYmlvcyh2b2lkKTsKLXN0YXRpYyB2b2lkIHNldHVwX2ludF92ZWN0KHZvaWQpOwotc3RhdGljIGludCBjaGtzdW0oQ0FSRDggKnN0YXJ0KTsKLXN0YXRpYyB2b2lkIHNldHVwX2Jpb3NfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzLCBDQVJEMzIgYXgpOwotCi12b2lkIGxvYWRDb2RlVG9NZW0odW5zaWduZWQgY2hhciAqcHRyLCBDQVJEOCAqY29kZSk7Ci12b2lkIGRwcmludCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOwotCi1zdGF0aWMgaW50IHZyYW1fbWFwcGVkID0gMDsKLXN0YXRpYyBDQVJEOCBzYXZlX21zcjsKLXN0YXRpYyBDQVJEOCBzYXZlX3BvczEwMjsKLXN0YXRpYyBDQVJEOCBzYXZlX3ZzZTsKLXN0YXRpYyBDQVJEOCBzYXZlXzQ2ZTg7Ci1jb25zb2xlIENvbnNvbGU7Ci1zdHJ1Y3QgY29uZmlnIENvbmZpZzsKLQotCi1pbnQKLW1haW4odm9pZCkKLXsKLSAgICBpbnQgQWN0aXZlX2lzX1BjaSA9IDA7Ci0jaWZkZWYgREVMRVRFCi0gICAgQ29uZmlnLlByaW50UG9ydCA9IFBSSU5UX1BPUlQ7Ci0gICAgQ29uZmlnLklvU3RhdGlzdGljcyA9IElPX1NUQVRJU1RJQ1M7Ci0gICAgQ29uZmlnLlByaW50SXJxID0gUFJJTlRfSVJROwotICAgIENvbmZpZy5QcmludFBjaSA9IFBSSU5UX1BDSTsKLSAgICBDb25maWcuU2hvd0FsbERldiA9IFNIT1dfQUxMX0RFVjsKLSAgICBDb25maWcuUHJpbnRJcCA9IFBSSU5UX0lQOwotICAgIENvbmZpZy5TYXZlQmlvcyA9IFNBVkVfQklPUzsKLSAgICBDb25maWcuVHJhY2UgPSBUUkFDRTsKLSAgICBDb25maWcuQ29uZmlnQWN0aXZlT25seSA9IENPTkZJR19BQ1RJVkVfT05MWTsKLSAgICBDb25maWcuQ29uZmlnQWN0aXZlRGV2aWNlID0gQ09ORklHX0FDVElWRV9ERVZJQ0U7Ci0gICAgQ29uZmlnLk1hcFN5c0Jpb3MgPSBNQVBfU1lTX0JJT1M7Ci0gICAgQ29uZmlnLlJlc29ydCA9IFJFU09SVDsKLSAgICBDb25maWcuRml4Um9tID0gRklYX1JPTTsKLSAgICBDb25maWcuTm9Db25zb2xlID0gTk9fQ09OU09MRTsKLSAgICBDb25maWcuVmVyYm9zZSA9IFZFUkJPU0U7Ci0KLSAgICBpZiAoIW1hcCgpKQotCWV4aXQoMSk7Ci0KLSAgICBpZiAoIXNldHVwX3N5c3RlbV9iaW9zKCkpCi0JZXhpdCgxKTsKLQotICAgIGlvcGwoMyk7Ci0gICAgc2V0dXBfaW8oKTsKLQotICAgIHNjYW5fcGNpKCk7Ci0gICAgaWYgKCFDdXJyZW50UGNpICYmICFDb25maWcuQ29uZmlnQWN0aXZlRGV2aWNlICYmICFDb25maWcuQ29uZmlnQWN0aXZlT25seSkKLQlleGl0ICgxKTsKLSNlbmRpZgotICAgIENvbnNvbGUgPSBvcGVuX2NvbnNvbGUoKTsKLQotICAgIGlmIChDb25maWcuQ29uZmlnQWN0aXZlT25seSkgewotCUNBUkQxNiBheDsKLQlpbnQgYWN0aXZlUGNpID0gMDsKLQlpbnQgZXJyb3IgPSAwOwotCi0Jd2hpbGUgKEN1cnJlbnRQY2kpIHsKLQkgICAgaWYgKEN1cnJlbnRQY2ktPmFjdGl2ZSkgewotCQlhY3RpdmVQY2kgPSAxOwotCQkJICAgIGlmICghKG1hcFBjaVJvbShOVUxMKSAmJiBjaGtzdW0oKENBUkQ4KilWX0JJT1MpKSkKLQkJCQllcnJvciA9IDE7Ci0JCQkgICAgYnJlYWs7Ci0JICAgIH0KLQkgICAgQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7Ci0JfQotCWF4ID0gKChDQVJEMTYpKEN1cnJlbnRQY2ktPmJ1cykgPDwgOCkKLQkgICAgfCAoQ3VycmVudFBjaS0+ZGV2IDw8IDMpIHwgKEN1cnJlbnRQY2ktPmZ1bmMgJiAweDcpOwotCVBfcHJpbnRmKCJheDogMHgleFxuIixheCk7Ci0Jc2V0dXBfaW50X3ZlY3QoKTsKLQlpZiAoIWVycm9yICYmIChhY3RpdmVQY2kgfHwgY29weV92YmlvcygpKSkgewotCi0JICAgIGlmIChDb25maWcuU2F2ZUJpb3MpIHNhdmVfYmlvc190b19maWxlKCk7Ci0JICAgIGlmICAobWFwX3ZyYW0oKSkgewotCQlwcmludGYoImluaXRpYWxpemluZyBJU0FcbiIpOwotCQkJICAgIGJvb3RCSU9TKDApOwotCSAgICB9Ci0JfQotCXVubWFwX3ZyYW0oKTsKLQlzbGVlcCgxKTsKLSAgICB9IGVsc2UgewotCS8qIGRpc2FibGUgcHJpbWFyeSBjYXJkICovCi0Jc2F2ZV9tc3IgPSBpbmIoMHgzQ0MpOwotCXNhdmVfdnNlID0gaW5iKDB4M0MzKTsKLQlzYXZlXzQ2ZTggPSBpbmIoMHg0NmU4KTsKLQlzYXZlX3BvczEwMiA9IGluYigweDEwMik7Ci0KLQlzaWduYWwoMixzaWdfaGFuZGxlcik7Ci0Jc2lnbmFsKDExLHNpZ19oYW5kbGVyKTsKLQotCW91dGIoMHgzQzIsfihDQVJEOCkweDAzICYgc2F2ZV9tc3IpOwotCW91dGIoMHgzQzMsfihDQVJEOCkweDAxICYgc2F2ZV92c2UpOwotCW91dGIoMHg0NmU4LCB+KENBUkQ4KTB4MDggJiBzYXZlXzQ2ZTgpOwotCW91dGIoMHgxMDIsIH4oQ0FSRDgpMHgwMSAmIHNhdmVfcG9zMTAyKTsKLQotCXBjaVZpZGVvRGlzYWJsZSgpOwotCi0Jd2hpbGUgKEN1cnJlbnRQY2kpIHsKLQkgICAgQ0FSRDE2IGF4OwotCi0JICAgIGlmIChDdXJyZW50UGNpLT5hY3RpdmUpIHsKLQkJQWN0aXZlX2lzX1BjaSA9IDE7Ci0JCWlmICghQ29uZmlnLkNvbmZpZ0FjdGl2ZURldmljZSkgewotCQkgICAgQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7Ci0JCSAgICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0KLQkgICAgRW5hYmxlQ3VycmVudCgpOwotCi0JICAgIGlmIChDdXJyZW50UGNpLT5hY3RpdmUpIHsKLQkJb3V0YigweDEwMiwgc2F2ZV9wb3MxMDIpOwotCQlvdXRiKDB4NDZlOCwgc2F2ZV80NmU4KTsKLQkJb3V0YigweDNDMywgc2F2ZV92c2UpOwotCQlvdXRiKDB4M0MyLCBzYXZlX21zcik7Ci0JICAgIH0KLQotCSAgICAvKiBjbGVhciBpbnRlcnJ1cHQgdmVjdG9ycyAqLwotCSAgICBzZXR1cF9pbnRfdmVjdCgpOwotCi0JICAgIGF4ID0gKChDQVJEMTYpKEN1cnJlbnRQY2ktPmJ1cykgPDwgOCkKLQkJfCAoQ3VycmVudFBjaS0+ZGV2IDw8IDMpIHwgKEN1cnJlbnRQY2ktPmZ1bmMgJiAweDcpOwotCSAgICBQX3ByaW50ZigiYXg6IDB4JXhcbiIsYXgpOwotCi0JICAgIGlmICghKChtYXBQY2lSb20oTlVMTCkgJiYgY2hrc3VtKChDQVJEOCopVl9CSU9TKSkKLQkJICB8fCAoQ3VycmVudFBjaS0+YWN0aXZlICYmIGNvcHlfdmJpb3MoKSkpKSB7Ci0JCUN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OwotCQljb250aW51ZTsKLQkgICAgfQotCSAgICBpZiAoIW1hcF92cmFtKCkpIHsKLQkJQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICAgIGlmIChDb25maWcuU2F2ZUJpb3MpIHNhdmVfYmlvc190b19maWxlKCk7Ci0JICAgIHByaW50ZigiaW5pdGlhbGl6aW5nIFBDSSBidXM6ICVpIGRldjogJWkgZnVuYzogJWlcbiIsQ3VycmVudFBjaS0+YnVzLAotCQkgICBDdXJyZW50UGNpLT5kZXYsQ3VycmVudFBjaS0+ZnVuYyk7Ci0JICAgIGJvb3RCSU9TKGF4KTsKLQkgICAgdW5tYXBfdnJhbSgpOwotCi0JICAgIEN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OwotCX0KLQotCS8qIFdlIGhhdmUgYW4gSVNBIGRldmljZSAtIGNvbmZpZ3VyZSBpZiByZXF1ZXN0ZWQgKi8KLQlpZiAoIUFjdGl2ZV9pc19QY2kgJiYgQ29uZmlnLkNvbmZpZ0FjdGl2ZURldmljZSkgewotCSAgICBwY2lWaWRlb0Rpc2FibGUoKTsKLQotCSAgICBvdXRiKDB4MTAyLCBzYXZlX3BvczEwMik7Ci0JICAgIG91dGIoMHg0NmU4LCBzYXZlXzQ2ZTgpOwotCSAgICBvdXRiKDB4M0MzLCBzYXZlX3ZzZSk7Ci0JICAgIG91dGIoMHgzQzIsIHNhdmVfbXNyKTsKLQotCSAgICBzZXR1cF9pbnRfdmVjdCgpOwotCSAgICBpZiAoY29weV92YmlvcygpKSB7Ci0KLQkJaWYgKENvbmZpZy5TYXZlQmlvcykgc2F2ZV9iaW9zX3RvX2ZpbGUoKTsKLQkJaWYgIChtYXBfdnJhbSgpKSB7Ci0JCSAgICBwcmludGYoImluaXRpYWxpemluZyBJU0FcbiIpOwotCQkgICAgYm9vdEJJT1MoMCk7Ci0JCX0KLQkgICAgfQotCi0JICAgIHVubWFwX3ZyYW0oKTsKLQkgICAgc2xlZXAoMSk7Ci0JfQotCi0JcGNpVmlkZW9SZXN0b3JlKCk7Ci0KLQlvdXRiKDB4MTAyLCBzYXZlX3BvczEwMik7Ci0Jb3V0YigweDQ2ZTgsIHNhdmVfNDZlOCk7Ci0Jb3V0YigweDNDMywgc2F2ZV92c2UpOwotCW91dGIoMHgzQzIsIHNhdmVfbXNyKTsKLSAgICB9Ci0KLSAgICBjbG9zZV9jb25zb2xlKENvbnNvbGUpOwotI2lmZGVmIERFTEVURQotICAgIGlvcGwoMCk7Ci0gICAgdW5tYXAoKTsKLQotICAgIHByaW50ZigiZG9uZSAhXG4iKTsKLSNlbmRpZgotICAgIGlmIChDb25maWcuSW9TdGF0aXN0aWNzKQotCWlvX3N0YXRpc3RpY3MoKTsKLSNpZmRlZiBERUxFVEUKLSAgICBleGl0KDApOwotI2VuZGlmCi19Ci0KLWludAotbWFwKHZvaWQpCi17Ci0gICAgdm9pZCogbWVtOwotCi0gICAgbWVtID0gbW1hcCgwLCAoc2l6ZV90KVNJWkUsCi0JICAgICAgIFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgICAgIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFIHwgTUFQX0FOT04sCi0JICAgICAgIC0xLCAwICk7Ci0gICAgaWYgKG1lbSAhPSAwKSB7Ci0JcGVycm9yKCJhbm9ueW1vdXMgbWFwIik7Ci0JcmV0dXJuICgwKTsKLSAgICB9Ci0gICAgbWVtc2V0KG1lbSwwLFNJWkUpOwotCi0gICAgbG9hZENvZGVUb01lbSgodW5zaWduZWQgY2hhciAqKSBCSU9TX1NUQVJULCBjb2RlKTsKLSAgICByZXR1cm4gKDEpOwotfQotCi1zdGF0aWMgdm9pZAotdW5tYXAodm9pZCkKLXsKLSAgICBtdW5tYXAoMCxTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQKLWJvb3RCSU9TKENBUkQxNiBheCkKLXsKLSAgICBpODZiaW9zUmVncyBiUmVnczsKLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgcHJpbnRmKCJzdGFydGluZyBCSU9TXG4iKTsKLSNlbmRpZgotICAgIHNldHVwX2Jpb3NfcmVncygmYlJlZ3MsIGF4KTsKLSAgICBkb194ODYoQklPU19TVEFSVCwmYlJlZ3MpOwotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBwcmludGYoImRvbmVcbiIpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQKLW1hcF92cmFtKHZvaWQpCi17Ci0gICAgaW50IG1lbV9mZDsKLQotI2lmZGVmIF9faWE2NF9fCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRXUiB8IE9fU1lOQykpPDApCi0jZWxzZQotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JEV1IpKTwwKQotI2VuZGlmCi0gICAgICB7Ci0JcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOwotCXJldHVybiAwOwotICAgIH0KLQotI2lmbmRlZiBfX2FscGhhX18KLSAgICBpZiAobW1hcCgodm9pZCAqKSBWUkFNX1NUQVJULCAoc2l6ZV90KSBWUkFNX1NJWkUsCi0JCSAgICAgUFJPVF9FWEVDIHwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwKLQkJICAgICBtZW1fZmQsIFZSQU1fU1RBUlQpID09ICh2b2lkICopIC0xKQotI2Vsc2UKLQkgaWYgKCFfYnVzX2Jhc2UoKSkgc3BhcnNlX3NoaWZ0ID0gNzsgLyogVWgsIG9oLCBKRU5TRU4uLi4gKi8KLQkgaWYgKCFfYnVzX2Jhc2Vfc3BhcnNlKCkpIHNwYXJzZV9zaGlmdCA9IDA7Ci0JIGlmICgodnJhbV9tYXAgPSBtbWFwKDAsKHNpemVfdCkgKFZSQU1fU0laRSA8PCBzcGFyc2Vfc2hpZnQpLAotCQkJCQkJIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JCQkJCQkgTUFQX1NIQVJFRCwKLQkJCQkJCSBtZW1fZmQsIChWUkFNX1NUQVJUIDw8IHNwYXJzZV9zaGlmdCkKLQkJCQkJCSB8IF9idXNfYmFzZV9zcGFyc2UoKSkpID09ICh2b2lkICopIC0xKQotI2VuZGlmCi0gICAgICB7Ci0JcGVycm9yKCJtbWFwIGVycm9yIGluIG1hcF9oYXJkd2FyZV9yYW0iKTsKLQkgICAgY2xvc2UobWVtX2ZkKTsKLQkgICAgcmV0dXJuICgwKTsKLQl9Ci0gICAgdnJhbV9tYXBwZWQgPSAxOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLXVubWFwX3ZyYW0odm9pZCkKLXsKLSAgICBpZiAoIXZyYW1fbWFwcGVkKSByZXR1cm47Ci0KLSAgICBtdW5tYXAoKHZvaWQqKVZSQU1fU1RBUlQsVlJBTV9TSVpFKTsKLSAgICB2cmFtX21hcHBlZCA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvcHlfdmJpb3Modm9pZCkKLXsKLSAgICBpbnQgbWVtX2ZkOwotICAgIHVuc2lnbmVkIGNoYXIgKnRtcDsKLSAgICBpbnQgc2l6ZTsKLQotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JET05MWSkpPDApIHsKLQlwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7Ci0JcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgICBpZiAobHNlZWsobWVtX2ZkLChvZmZfdCkgVl9CSU9TLCBTRUVLX1NFVCkgIT0gKG9mZl90KSBWX0JJT1MpIHsKLQkgIGZwcmludGYoc3RkZXJyLCJDYW5ub3QgbHNlZWtcbiIpOwotCSAgZ290byBFcnJvcjsKLSAgICAgIH0KLSAgICB0bXAgPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYygzKTsKLSAgICBpZiAocmVhZChtZW1fZmQsIChjaGFyICopdG1wLCAoc2l6ZV90KSAzKSAhPSAoc2l6ZV90KSAzKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCJDYW5ub3QgcmVhZFxuIik7Ci0JZ290byBFcnJvcjsKLSAgICB9Ci0gICAgaWYgKGxzZWVrKG1lbV9mZCwob2ZmX3QpIFZfQklPUyxTRUVLX1NFVCkgIT0gKG9mZl90KSBWX0JJT1MpCi0JZ290byBFcnJvcjsKLQotICAgIGlmICgqdG1wICE9IDB4NTUgfHwgKih0bXArMSkgIT0gMHhBQSApIHsKLSNpZmRlZiBERUJVRwotCWRwcmludCgodW5zaWduZWQgbG9uZyl0bXAsMHgxMDApOwotI2VuZGlmCi0JZnByaW50ZihzdGRlcnIsIk5vIGJpb3MgZm91bmQgYXQ6IDB4JXhcbiIsVl9CSU9TKTsKLQlnb3RvIEVycm9yOwotICAgIH0KLSAgICBzaXplID0gKih0bXArMikgKiA1MTI7Ci0KLSAgICBpZiAocmVhZChtZW1fZmQsIChjaGFyICopVl9CSU9TLCAoc2l6ZV90KSBzaXplKSAhPSAoc2l6ZV90KSBzaXplKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCJDYW5ub3QgcmVhZFxuIik7Ci0JZ290byBFcnJvcjsKLSAgICB9Ci0gICAgZnJlZSh0bXApOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgaWYgKCFjaGtzdW0oKENBUkQ4KVZfQklPUykpCi0JcmV0dXJuICgwKTsKLQotICAgIHJldHVybiAoMSk7Ci0KLUVycm9yOgotICAgIHBlcnJvcigidl9iaW9zIik7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50Ci1jb3B5X3N5c19iaW9zKHZvaWQpCi17Ci0jZGVmaW5lIFNZU19CSU9TIDB4RjAwMDAKLSAgICBpbnQgbWVtX2ZkOwotCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRPTkxZKSk8MCkgewotCXBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKLQlyZXR1cm4gKDApOwotICAgIH0KLQotICAgIGlmIChsc2VlayhtZW1fZmQsKG9mZl90KSBTWVNfQklPUyxTRUVLX1NFVCkgIT0gKG9mZl90KSBTWVNfQklPUykKLQlnb3RvIEVycm9yOwotICAgIGlmIChyZWFkKG1lbV9mZCwgKGNoYXIgKilTWVNfQklPUywgKHNpemVfdCkgMHhGRkZGKSAhPSAoc2l6ZV90KSAweEZGRkYpCi0JZ290byBFcnJvcjsKLQotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuICgxKTsKLQotRXJyb3I6Ci0gICAgcGVycm9yKCJzeXNfYmlvcyIpOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuICgwKTsKLX0KLQotdm9pZAotbG9hZENvZGVUb01lbSh1bnNpZ25lZCBjaGFyICpwdHIsIENBUkQ4IGNvZGVbXSkKLXsKLSAgICBpbnQgaTsKLSAgICBDQVJEOCB2YWw7Ci0KLSAgICBmb3IgKCBpPTA7O2krKykgewotCXZhbCA9IGNvZGVbaV07Ci0JKnB0cisrID0gdmFsOwotCWlmICh2YWwgPT0gMHhmNCkgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotdm9pZAotZHByaW50KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLSAgICBpbnQgaSxqOwotICAgIGNoYXIgKmMgPSAoY2hhciAqKXN0YXJ0OwotCi0gICAgZm9yIChqID0gMDsgaiA8IChzaXplID4+IDQpOyBqKyspIHsKLSAgICBjaGFyICpkID0gYzsKLSAgICBwcmludGYoIlxuMHglbHg6ICAiLCh1bnNpZ25lZCBsb25nKWMpOwotICAgIGZvciAoaSA9IDA7IGk8MTY7IGkrKykKLQlwcmludGYoIiUyLjJ4ICIsKHVuc2lnbmVkIGNoYXIpICgqKGMrKykpKTsKLSAgICBjID0gZDsKLSAgICBmb3IgKGkgPSAwOyBpPDE2OyBpKyspIHsKLQlwcmludGYoIiVjIiwoKCgoQ0FSRDgpKCpjKSkgPiAzMikgJiYgKCgoQ0FSRDgpKCpjKSkgPCAxMjgpKSA/Ci0JICAgKHVuc2lnbmVkIGNoYXIpICgqKGMpKTogJy4nKTsKLQljKys7Ci0gICAgfQotICAgIH0KLSAgICBwcmludGYoIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zYXZlX2Jpb3NfdG9fZmlsZSh2b2lkKQotewotICAgIHN0YXRpYyBpbnQgbnVtID0gMDsKLSAgICBpbnQgc2l6ZSwgY291bnQ7Ci0gICAgY2hhciBmaWxlX25hbWVbMjU2XTsKLSAgICBpbnQgZmQ7Ci0KLSAgICBzcHJpbnRmKGZpbGVfbmFtZSwiYmlvc18laS5maWwiLG51bSk7Ci0gICAgaWYgKChmZCA9ICBvcGVuKGZpbGVfbmFtZSxPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLDAwNjQ0KSkgPT0gLTEpCi0JcmV0dXJuOwotICAgIHNpemUgPSAoKih1bnNpZ25lZCBjaGFyKikoVl9CSU9TICsgMikpICogNTEyOwotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBkcHJpbnQoVl9CSU9TLDIwKTsKLSNlbmRpZgotICAgIGlmICgoY291bnQgPSB3cml0ZShmZCwodm9pZCAqKShWX0JJT1MpLHNpemUpKSAhPSBzaXplKQotCWZwcmludGYoc3RkZXJyLCJvbmx5IHNhdmVkICVpIG9mICVpIGJ5dGVzXG4iLHNpemUsY291bnQpOwotICAgIG51bSsrOwotfQotCi1zdGF0aWMgdm9pZAotc2lnX2hhbmRsZXIoaW50IHVudXNlZCkKLXsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLQotICAgIC8qIHB1dCBzeXN0ZW0gYmFjayBpbiBhIHNhdmUgc3RhdGUgKi8KLSAgICB1bm1hcF92cmFtKCk7Ci0gICAgcGNpVmlkZW9SZXN0b3JlKCk7Ci0gICAgb3V0YigweDEwMiwgc2F2ZV9wb3MxMDIpOwotICAgIG91dGIoMHg0NmU4LCBzYXZlXzQ2ZTgpOwotICAgIG91dGIoMHgzQzMsIHNhdmVfdnNlKTsKLSAgICBvdXRiKDB4M0MyLCBzYXZlX21zcik7Ci0KLSAgICBjbG9zZV9jb25zb2xlKENvbnNvbGUpOwotICAgIGlvcGwoMCk7Ci0gICAgdW5tYXAoKTsKLQotICAgIGV4aXQoMSk7Ci19Ci0KLS8qCi0gKiBGb3IgaW5pdGlhbGl6YXRpb24gd2UganVzdCBwYXNzIGF4IHRvIHRoZSBCSU9TLgotICogUENJIEJJT1NlcyBuZWVkIHRoaXMuIEFsbCBvdGhlciByZWdpc3RlciBhcmUgc2V0IDAuCi0gKi8KLXN0YXRpYyB2b2lkIHNldHVwX2Jpb3NfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzLCBDQVJEMzIgYXgpCi17Ci0gICAgcmVncy0+YXggPSBheDsKLSAgICByZWdzLT5ieCA9IDA7Ci0gICAgcmVncy0+Y3ggPSAwOwotICAgIHJlZ3MtPmR4ID0gMDsKLSAgICByZWdzLT5lcyA9IDA7Ci0gICAgcmVncy0+ZGkgPSAwOwotfQotCi0vKgotICogaGVyZSB3ZSBhcmUgcmVhbGx5IHBhcmFub2lkIGFib3V0IGZha2luZyBhICJyZWFsIgotICogQklPUy4gTW9zdCBvZiB0aGlzIGluZm9ybWF0aW9uIHdhcyBwdWxsZWQgZnJvbQotICogZG9zZW0uCi0gKi8KLXN0YXRpYyB2b2lkCi1zZXR1cF9pbnRfdmVjdCh2b2lkKQotewotICAgIGNvbnN0IENBUkQxNiBjcyA9IDB4MDAwMDsKLSAgICBjb25zdCBDQVJEMTYgaXAgPSAweDA7Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBsZXQgdGhlIGludCB2ZWN0cyBwb2ludCB0byB0aGUgU1lTX0JJT1Mgc2VnICovCi0gICAgZm9yIChpPTA7IGk8MHg4MDsgaSsrKSB7Ci0JKChDQVJEMTYqKTApW2k8PDFdID0gaXA7Ci0JKChDQVJEMTYqKTApWyhpPDwxKSsxXSA9IGNzOwotICAgIH0KLSAgICAvKiB2aWRlbyBpbnRlcnJ1cHRzIGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4NDI8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDQyPDwxXSA9IDB4ZjA2NTsKLSAgICAoKENBUkQxNiopMClbKDB4MTA8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDEwPDwxXSA9IDB4ZjA2NTsKLSAgICAvKiB2aWRlbyBwYXJhbSB0YWJsZSBkZWZhdWx0IGxvY2F0aW9uIChpbnQgMWQpICovCi0gICAgKChDQVJEMTYqKTApWygweDFkPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxZDw8MV0gPSAweGYwQTQ7Ci0gICAgLyogZm9udCB0YWJsZXMgZGVmYXVsdCBsb2NhdGlvbiAoaW50IDFGKSAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxZjw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MWY8PDFdID0gMHhmYTZlOwotCi0gICAgLyogaW50IDExIGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4MTE8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MTE8PDFdID0gMHhmODRkOwotICAgIC8qIGludCAxMiBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDEyPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxMjw8MV0gPSAweGY4NDE7Ci0gICAgLyogaW50IDE1IGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4MTU8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDE1PDwxXSA9IDB4Zjg1OTsKLSAgICAvKiBpbnQgMUEgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxYTw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MWE8PDFdID0gMHhmZjZlOwotICAgIC8qIGludCAwNSBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDA1PDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgwNTw8MV0gPSAweGZmNTQ7Ci0gICAgLyogaW50IDA4IGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4ODw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4ODw8MV0gPSAweGZlYTU7Ci0gICAgLyogaW50IDEzIGRlZmF1bHQgbG9jYXRpb24gKGZkZCkgKi8KLSAgICAoKENBUkQxNiopMClbKDB4MTM8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDEzPDwxXSA9IDB4ZWM1OTsKLSAgICAvKiBpbnQgMEUgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHhlPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHhlPDwxXSA9IDB4ZWY1NzsKLSAgICAvKiBpbnQgMTcgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxNzw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MTc8PDFdID0gMHhlZmQyOwotICAgIC8qIGZkZCB0YWJsZSBkZWZhdWx0IGxvY2F0aW9uIChpbnQgMWUpICovCi0gICAgKChDQVJEMTYqKTApWygweDFlPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxZTw8MV0gPSAweGVmYzc7Ci19Ci0KLXN0YXRpYyBpbnQKLXNldHVwX3N5c3RlbV9iaW9zKHZvaWQpCi17Ci0gICAgY2hhciAqZGF0ZSA9ICIwNi8wMS85OSI7Ci0gICAgY2hhciAqZWlzYV9pZGVudCA9ICJQQ0kvSVNBIjsKLQotI2lmIE1BUF9TWVNfQklPUwotICAgIGlmICghY29weV9zeXNfYmlvcygpKSByZXR1cm4gMDsKLSAgICByZXR1cm4gMTsKLSNlbmRpZgotLyogICAgbWVtc2V0KCh2b2lkICopMHhGMDAwMCwweGY0LDB4ZmZmNyk7ICovCi0KLSAgICAvKgotICAgICAqIHdlIHRyYXAgdGhlICJpbmR1c3RyeSBzdGFuZGFyZCBlbnRyeSBwb2ludHMiIHRvIHRoZSBCSU9TCi0gICAgICogYW5kIGFsbCBvdGhlciBsb2NhdGlvbnMgYnkgZmlsbGluZyB0aGVtIHdpdGggImhsdCIKLSAgICAgKiBUT0RPOiBpbXBsZW1lbnQgaGx0LWhhbmRsZXIgZm9yIHRoZXNlCi0gICAgICovCi0gICAgbWVtc2V0KCh2b2lkICopMHhGMDAwMCwweGY0LDB4MTAwMDApOwotCi0gICAgLyoKLSAgICAgKiBUT0RPOiB3ZSBzaG91bGQgY29weSB0aGUgZmRkIHRhYmxlICgweGZlYzU5LTB4ZmVjNWIpCi0gICAgICogdGhlIHZpZGVvIHBhcmFtZXRlciB0YWJsZSAoMHhmMGFjLTB4ZjBmYikKLSAgICAgKiBhbmQgdGhlIGZvbnQgdGFibGVzICgweGZhNmUtMHhmZTZkKQotICAgICAqIGZyb20gdGhlIG9yaWdpbmFsIGJpb3MgaGVyZQotICAgICAqLwotCi0gICAgLyogc2V0IGJpb3MgZGF0ZSAqLwotICAgIHN0cmNweSgoY2hhciAqKTB4RkZGRjUsZGF0ZSk7Ci0gICAgLyogc2V0IHVwIGVpc2EgaWRlbnQgc3RyaW5nICovCi0gICAgc3RyY3B5KChjaGFyICopMHhGRkZEOSxlaXNhX2lkZW50KTsKLSAgICAvKiB3cml0ZSBzeXN0ZW0gbW9kZWwgaWQgZm9yIElCTS1BVCAqLwotICAgICgoY2hhciAqKTApWzB4RkZGRkVdID0gMHhmYzsKLQotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1jaGtzdW0oQ0FSRDggKnN0YXJ0KQotewotICBDQVJEMTYgc2l6ZTsKLSAgQ0FSRDggdmFsID0gMDsKLSAgaW50IGk7Ci0KLSAgc2l6ZSA9ICooc3RhcnQrMikgKiA1MTI7Ci0gIGZvciAoaSA9IDA7IGk8c2l6ZTsgaSsrKQotICAgIHZhbCArPSAqKHN0YXJ0ICsgaSk7Ci0KLSAgaWYgKCF2YWwpCi0gICAgcmV0dXJuIDE7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwiQklPUyBja3N1bSB3cm9uZyFcbiIpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvbWFrZWZpbGUubGludXggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL21ha2VmaWxlLmxpbnV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGZlMzA2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvbWFrZWZpbGUubGludXgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi1DRkxBR1M9LWcgLUkvdXNyL2luY2x1ZGUgLUkuLi8uLi9pbmNsdWRlLyAtTzAgLVdhbGwKLUNDPWdjYwotCi0ueS5jOgotICAgIGJpc29uIC1kIC1vICRAICQ8Ci0ubC5jOgotICAgIGZsZXggLW8kQCAkPCAKLQotU1JDUyA9IG1haW4uYyBpby5jIHg4NmVtdS5jIGludC5jIHBjaS5jCi1PQkpTID0gbWFpbi5vIGlvLm8geDg2ZW11Lm8gaW50Lm8gcGNpLm8KLQotYWxsIDogdmJpb3Mudm04NiB2ODZiaW9zLnZtODYgY2Jpb3Mudm04NiBjYmlvcy54ODZlbXUgdmJpb3MueDg2ZW11IHY4NmJpb3MueDg2ZW11IAotI2FsbCA6ICBjYmlvcy54ODZlbXUgdmJpb3MueDg2ZW11IHY4NmJpb3MueDg2ZW11IAotCi1wYXJzZXIuYyA6IHBhcnNlci55Ci1sZXguYyA6IGxleC5sCi1jYmlvcy5vIDogY2Jpb3MuYyB2ODZiaW9zLmggZGVidWcuaAotbWFpbi5vIDogbWFpbi5jIHY4NmJpb3MuaCBwY2kuaCBkZWJ1Zy5oCi1pby5vIDogdjg2Ymlvcy5oIEFzbU1hY3Jvcy5oIGRlYnVnLmgKLW1lbS5vIDogbWVtLmMgZGVidWcuaCB2ODZiaW9zLmgKLWludC5vIDogaW50LmMgdjg2Ymlvcy5oIGRlYnVnLmgKLXBjaS5vIDogcGNpLmMgcGNpLmggZGVidWcuaAotY29uc29sZS5vIDogY29uc29sZS5jIHY4NmJpb3MuaCBkZWJ1Zy5oCi12ODYubyA6IHY4Ni5jIGRlYnVnLmgKLXBhcnNlci5vIDogcGFyc2VyLmMKLWxleC5vIDogbGV4LmMKLXY4NmJpb3Mubzogdjg2Ymlvcy5jIHY4NmJpb3MuaCBwY2kuaCBkZWJ1Zy5oCi1sb2dnaW5nLm86IGxvZ2dpbmcuYyB2ODZiaW9zLmgKLXg4NmVtdS5vIDogeDg2ZW11LmMgdjg2Ymlvcy5oIGRlYnVnLmgKLSAgICAkKENDKSAtYyAtRFg4NkVNVSAkKENGTEFHUykgJCouYwotCi12Ymlvcy54ODZlbXUgOiBtYWluLm8geDg2ZW11Lm8gaW8ubyBpbnQubyBwY2kubyBjb25zb2xlLm8gbWVtLm8gbG9nZ2luZy5vCi0gICAgZ2NjIC1XbCwtZGVmc3ltIC1XbCxwcmludGs9bHByaW50ZiAtbyB2Ymlvcy54ODZlbXUgbWFpbi5vIFwKLSAgICB4ODZlbXUubyBpby5vIGludC5vIHBjaS5vIGNvbnNvbGUubyBtZW0ubyBsb2dnaW5nLm8gXAotICAgIC1MLi4veDg2ZW11IC1seDg2ZW11ZCAtbGMgCi12Ymlvcy52bTg2IDogbWFpbi5vIHY4Ni5vIGlvLm8gaW50Lm8gcGNpLm8gY29uc29sZS5vIGxvZ2dpbmcubwotICAgIGdjYyAtbyB2Ymlvcy52bTg2IG1haW4ubyB2ODYubyBpby5vIGludC5vIHBjaS5vIGNvbnNvbGUubyBcCi0gICAgbG9nZ2luZy5vIC1sYyAKLWNiaW9zLng4NmVtdSA6IGNiaW9zLm8geDg2ZW11Lm8gaW8ubyBpbnQubyBwY2kubyBjb25zb2xlLm8gbWVtLm8gbG9nZ2luZy5vCi0gICAgZ2NjIC1XbCwtZGVmc3ltIC1XbCxwcmludGs9bHByaW50ZiAtbyBjYmlvcy54ODZlbXUgY2Jpb3MubyBcCi0gICAgeDg2ZW11Lm8gaW8ubyBpbnQubyBwY2kubyBjb25zb2xlLm8gbWVtLm8gbG9nZ2luZy5vIFwKLSAgICAtTC4uL3g4NmVtdSAtbHg4NmVtdWQgLWxjIAotY2Jpb3Mudm04NiA6IGNiaW9zLm8gdjg2Lm8gaW8ubyBpbnQubyBwY2kubyBjb25zb2xlLm8gbG9nZ2luZy5vCi0gICAgZ2NjIC1vIGNiaW9zLnZtODYgY2Jpb3MubyB2ODYubyBpby5vIGludC5vIHBjaS5vIGNvbnNvbGUubyBcCi0gICAgbG9nZ2luZy5vIC1sYyAKLXY4NmJpb3Mudm04NjogY29tbWFuZC5vIHBhcnNlci5vIGxleC5vIHY4NmJpb3MubyB2ODYubyBpby5vIGludC5vIHBjaS5vIGNvbnNvbGUubyBsb2dnaW5nLm8KLSAgICAgZ2NjIC1vIHY4NmJpb3Mudm04NiBjb21tYW5kLm8gcGFyc2VyLm8gbGV4Lm8gdjg2Ymlvcy5vIHY4Ni5vIGlvLm8gXAotICAgICBpbnQubyBwY2kubyBjb25zb2xlLm8gbG9nZ2luZy5vIC1ML3Vzci9saWIvY3Vyc2VzIC1sZmwgXAotICAgICAtbHJlYWRsaW5lIC1sYyAtbG5jdXJzZXMgL3Vzci9saWIvbGliYy5hCi12ODZiaW9zLng4NmVtdTogY29tbWFuZC5vIHBhcnNlci5vIGxleC5vIHY4NmJpb3MubyB4ODZlbXUubyBpby5vIGludC5vIHBjaS5vIGNvbnNvbGUubyBsb2dnaW5nLm8KLSAgICBnY2MgLVdsLC1kZWZzeW0gLVdsLHByaW50az1scHJpbnRmIC1vIHY4NmJpb3MueDg2ZW11IFwKLSAgICBjb21tYW5kLm8gcGFyc2VyLm8gbGV4Lm8gdjg2Ymlvcy5vIHg4NmVtdS5vIGlvLm8gXAotICAgIGludC5vIHBjaS5vIGNvbnNvbGUubyBsb2dnaW5nLm8gLUwvdXNyL2xpYi9jdXJzZXMgLWxmbCBcCi0gICAgLWxyZWFkbGluZSAtbGMgLWxuY3Vyc2VzICAvdXNyL2xpYi9saWJjLmEgLUwuLi94ODZlbXUgLWx4ODZlbXVkCi0KLWNsZWFuOgotICAgIHJtIC1mICoubyB2Ymlvcy54ODZlbXUgdmJpb3Mudm04NiBjYmlvcy54ODZlbXUgY2Jpb3Mudm04NiBwYXJzZXIuYyBcCi0gICAgbGV4LmMgcGFyc2VyLmggdjg2Ymlvcy54ODZlbXUgdjg2Ymlvcy52bTg2Ci0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvbWVtLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL21lbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGMxYWVmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvbWVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgotICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci0gKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCi0gKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAotICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLSAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLSAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgInY4NmJpb3MuaCIKLSNpbmNsdWRlICJ4ODZlbXUuaCIKLQotI2lmZGVmIF9fYWxwaGFfXwotCi12b2lkKiB2cmFtX21hcCA9IDA7Ci1pbnQgc3BhcnNlX3NoaWZ0ID0gNTsKLQotI2RlZmluZSBtZW1fYmFycmllcigpICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibWIiICA6IDogOiAibWVtb3J5IikKLQotI2RlZmluZSB2dWlwICAgIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqCi0KLUNBUkQ4Ci1tZW1fcmIoQ0FSRDMyIGFkZHIpCi17Ci0gIHVuc2lnbmVkIGxvbmcgcmVzdWx0LCBzaGlmdDsKLSNpZiAxCi0gIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEJGRkZGKSB7Ci0gICAgYWRkciAtPSAweEEwMDAwOwotICAgIHNoaWZ0ID0gKGFkZHIgJiAweDMpICogODsKLSAgICByZXN1bHQgPSAqKHZ1aXApICgodW5zaWduZWQgbG9uZyl2cmFtX21hcCArIChhZGRyIDw8IHNwYXJzZV9zaGlmdCkpOwotICAgIHJlc3VsdCA+Pj0gc2hpZnQ7Ci0gICAgcmV0dXJuIDB4ZmZVTCAmIHJlc3VsdDsKLSAgfSBlbHNlCi0jZW5kaWYKLSAgICByZXR1cm4gcmRiKGFkZHIpOwotfQotCi1DQVJEMTYKLW1lbV9ydyhDQVJEMzIgYWRkcikKLXsKLSAgdW5zaWduZWQgbG9uZyByZXN1bHQsIHNoaWZ0OwotI2lmIDEKLSAgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4QkZGRkYpIHsKLSAgICBhZGRyIC09IDB4QTAwMDA7Ci0gICAgc2hpZnQgPSAoYWRkciAmIDB4MikgKiA4OwotICAgIHJlc3VsdCA9ICoodnVpcCkoKHVuc2lnbmVkIGxvbmcpdnJhbV9tYXArKGFkZHI8PHNwYXJzZV9zaGlmdCkKLQkgICAgICsoMTw8KHNwYXJzZV9zaGlmdC0yKSkpOwotICAgIHJlc3VsdCA+Pj0gc2hpZnQ7Ci0gICAgcmV0dXJuIDB4ZmZmZlVMICYgcmVzdWx0OwotICB9IGVsc2UKLSNlbmRpZgotICAgIHJldHVybiByZHcoYWRkcik7Ci19Ci0KLUNBUkQzMgotbWVtX3JsKENBUkQzMiBhZGRyKQotewotICB1bnNpZ25lZCBsb25nIHJlc3VsdDsKLSNpZiAxCi0gIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEJGRkZGKSB7Ci0gICAgYWRkciAtPSAweEEwMDAwOwotICAgIHJlc3VsdCA9ICoodnVpcCkoKHVuc2lnbmVkIGxvbmcpdnJhbV9tYXArKGFkZHI8PHNwYXJzZV9zaGlmdCkrKDM8PChzcGFyc2Vfc2hpZnQtMikpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9IGVsc2UKLSNlbmRpZgotICAgIHJldHVybiByZGwoYWRkcik7Ci19Ci0KLXZvaWQKLW1lbV93YihDQVJEMzIgYWRkciwgQ0FSRDggdmFsKQotewotICAgIHVuc2lnbmVkIGludCBiID0gdmFsICYgMHhmZlU7Ci0jaWYgMQotICBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhCRkZGRikgewotICAgIGFkZHIgLT0gMHhBMDAwMDsKLSAgICAqKHZ1aXApICgodW5zaWduZWQgbG9uZyl2cmFtX21hcCArIChhZGRyIDw8IHNwYXJzZV9zaGlmdCkpID0gYiAqIDB4MDEwMTAxMDE7Ci0gICAgbWVtX2JhcnJpZXIoKTsKLSAgfSBlbHNlCi0jZW5kaWYKLSAgICB3cmIoYWRkcix2YWwpOwotfQotCi12b2lkCi1tZW1fd3coQ0FSRDMyIGFkZHIsIENBUkQxNiB2YWwpCi17Ci0gIHVuc2lnbmVkIGludCB3ID0gdmFsICYgMHhmZmZmVTsKLSNpZiAxCi0gIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEJGRkZGKSB7Ci0gICAgYWRkciAtPSAweEEwMDAwOwotICAgICoodnVpcCkoKHVuc2lnbmVkIGxvbmcpdnJhbV9tYXArKGFkZHI8PHNwYXJzZV9zaGlmdCkKLQkrKDE8PChzcGFyc2Vfc2hpZnQtMikpKSA9IHcgKiAweDAwMDEwMDAxOwotICAgIG1lbV9iYXJyaWVyKCk7Ci0gIH0gZWxzZQotI2VuZGlmCi0gICAgd3J3KGFkZHIsdmFsKTsKLX0KLQotdm9pZAotbWVtX3dsKENBUkQzMiBhZGRyLCBDQVJEMzIgdmFsKQotewotI2lmIDEKLSAgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4QkZGRkYpIHsKLSAgICBhZGRyIC09IDB4QTAwMDA7Ci0gICAgKih2dWlwKSgodW5zaWduZWQgbG9uZyl2cmFtX21hcCsoYWRkcjw8c3BhcnNlX3NoaWZ0KQotCSsoMzw8KHNwYXJzZV9zaGlmdC0yKSkpID0gdmFsOwotICAgIG1lbV9iYXJyaWVyKCk7Ci0gIH0gZWxzZQotI2VuZGlmCi0gICAgd3JsKGFkZHIsdmFsKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9wYXJzZXIueSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvcGFyc2VyLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYzQwMjMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9wYXJzZXIueQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OCArMCwwIEBACi0lewotI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInY4NmJpb3MuaCIKLSNpbmNsdWRlICJwY2kuaCIKLSAgICAKLSNkZWZpbmUgWVlTVFlQRSB1bnNpZ25lZCBsb25nCi0gICAgCi0jZGVmaW5lIE1BWF9WQVIgMHgyMAotCi0gICAgQ0FSRDMyIHZhcltNQVhfVkFSXTsKLSAgICBDQVJEMzIgdmFyX21lbTsKLQotCi1pODZiaW9zUmVncyByZWdzID0geyAwMCB9OwotCi1lbnVtIG1lbV90eXBlIHsgQllURSwgV09SRCwgTE9ORywgU1RSSU5HIH07Ci11bmlvbiBtZW1fdmFsIHsKLSAgIENBUkQzMiBpbnRlZ2VyOwotICAgY2hhciAqcHRyOwotfSByZWM7Ci0KLXN0cnVjdCBtZW0gewotICAgIGVudW0gbWVtX3R5cGUgdHlwZTsKLSAgICAgICAgdW5pb24gbWVtX3ZhbCB2YWw7Ci0gICAgc3RydWN0IG1lbSAqbmV4dDsKLX07IAotCi0gCi1zdHJ1Y3QgZGV2aWNlIERldmljZSA9IHtGQUxTRSxOT05FLHswfX07Ci0KLWV4dGVybiB2b2lkIHl5ZXJyb3IoY2hhciAqcyk7Ci1leHRlcm4gaW50IHl5bGV4KCB2b2lkICApOwotIAotc3RhdGljIHZvaWQgYm9vdCh2b2lkKTsKLXN0YXRpYyB2b2lkIGR1bXBfbWVtKENBUkQzMiBhZGRyLCBpbnQgbGVuKTsKLXN0YXRpYyB2b2lkIGV4ZWNfaW50KGludCBudW0pOwotc3RhdGljIHZvaWQgKmFkZF90b19saXN0KGVudW0gbWVtX3R5cGUgdHlwZSwgdW5pb24gbWVtX3ZhbCAqcmVjLCB2b2lkICpuZXh0KTsKLXN0YXRpYyB2b2lkIGRvX2xpc3Qoc3RydWN0IG1lbSAqbGlzdCwgbWVtVHlwZSBhZGRyKTsKLXN0YXRpYyBjaGFyICogbm9ybWFsaXplX3N0cmluZyhjaGFyICpwdHIpOwotJX0KLQotJXRva2VuIFRPS19OVU0KLSV0b2tlbiBUT0tfUkVHX0FYCi0ldG9rZW4gVE9LX1JFR19CWAotJXRva2VuIFRPS19SRUdfQ1gKLSV0b2tlbiBUT0tfUkVHX0RYCi0ldG9rZW4gVE9LX1JFR19ESQotJXRva2VuIFRPS19SRUdfU0kKLSV0b2tlbiBUT0tfU0VHX0RTCi0ldG9rZW4gVE9LX1NFR19FUwotJXRva2VuIFRPS19TRVAKLSV0b2tlbiBUT0tfVkFSCi0ldG9rZW4gVE9LX1ZBUl9NRU0KLSV0b2tlbiBUT0tfQ09NTUFORF9CT09UCi0ldG9rZW4gVE9LX0NPTU1BTkRfRVhFQwotJXRva2VuIFRPS19TRUxFQ1QKLSV0b2tlbiBUT0tfU1RSSU5HCi0ldG9rZW4gVE9LX01PRElGSUVSX0JZVEUKLSV0b2tlbiBUT0tfTU9ESUZJRVJfV09SRAotJXRva2VuIFRPS19NT0RJRklFUl9MT05HCi0ldG9rZW4gVE9LX01PRElGSUVSX01FTVNFVAotJXRva2VuIFRPS19DT01NQU5EX01FTVNFVAotJXRva2VuIFRPS19DT01NQU5EX01FTURVTVAKLSV0b2tlbiBUT0tfQ09NTUFORF9RVUlUCi0ldG9rZW4gVE9LX0VSUk9SCi0ldG9rZW4gVE9LX0VORAotJXRva2VuIFRPS19JU0EKLSV0b2tlbiBUT0tfUENJCi0ldG9rZW4gVE9LX0JZVEUKLSV0b2tlbiBUT0tfV09SRAotJXRva2VuIFRPS19MT05HCi0ldG9rZW4gVE9LX1BSSU5UX1BPUlQKLSV0b2tlbiBUT0tfSU9TVEFUCi0ldG9rZW4gVE9LX1BSSU5UX0lSUQotJXRva2VuIFRPS19QUENJCi0ldG9rZW4gVE9LX1BJUAotJXRva2VuIFRPS19UUkFDRQotJXRva2VuIFRPS19PTgotJXRva2VuIFRPS19PRkYKLSV0b2tlbiBUT0tfVkVSQk9TRQotJXRva2VuIFRPS19MT0cKLSV0b2tlbiBUT0tfTE9HT0ZGCi0ldG9rZW4gVE9LX0NMU1RBVAotJXRva2VuIFRPS19TVERPVVQKLSV0b2tlbiBUT0tfSExUCi0ldG9rZW4gVE9LX0RFTAotJXRva2VuIFRPS19JT1BFUk0KLSV0b2tlbiBUT0tfRFVNUF9QQ0kKLSV0b2tlbiBUT0tfQk9PVF9CSU9TCi0lJQotaW5wdXQ6ICAgICAgICB8IGlucHV0IGxpbmUgIAotbGluZTogICAgICAgICAgZW5kIHwgIGNvbV9yZWcgfCBjb21fdmFyIHwgY29tX3NlbGVjdAotICAgICAgICAgICAgICB8IGNvbV9ib290IHwgY29tX21lbXNldCB8IGNvbV9tZW1kdW1wICB8IGNvbV9xdWl0IAotICAgICAgICAgICAgICB8IGNvbV9leGVjIHwgaGxwIHwgY29uZmlnIHwgdmVyYm9zZSB8IGxvZ2dpbmcgfCBwcmludCB8IGNsc3RhdCAKLSAgICAgICAgICAgICAgfCBjb21faGx0IHwgaW9wZXJtIHwgbGlzdF9wY2kgfCBib290X2Jpb3MgCi0gICAgICAgICAgICAgIHwgZXJyb3IgZW5kICB7IHByaW50ZigidW5rbm93biBjb21tYW5kXG4iKTsgfQotOwotZW5kOiAgICAgICAgICAgVE9LX0VORAotOwotY29tX3JlZzogICAgICAgIHJlZ19vZmYgdmFsIGVuZCB7ICooQ0FSRDE2KikkMSA9ICQyICYgMHhmZmZmOyB9Ci0gICAgICAgICAgICAgIHwgcmVnX3NlZyBUT0tfU0VQIHJlZ19vZmYgdmFsIGVuZCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihDQVJEMTYqKSQxID0gKCQ0ICYgMHhmMDAwMCkgPj4gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooQ0FSRDE2KikkMyA9ICgkNCAmIDB4MGZmZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfCAgcmVnX29mZiAnPycgZW5kIHsgcHJpbnRmKCIweCV4XG4iLCooQ0FSRDE2KikkMSk7fQotICAgICAgICAgICAgICB8ICByZWdfc2VnIFRPS19TRVAgcmVnX29mZiAnPycgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIjB4JXg6MHgleFxuIiwqKENBUkQxNiopJDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICooQ0FSRDE2KikkMyk7IH0KLTsKLXJlZ2lzdGVyX3JlYWQ6ICByZWdfc2VnIFRPS19TRVAgcmVnX29mZiB7ICQkID0gKCgoKihDQVJEMTYqKSQxKSA8PCA0KSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCgqKENBUkQxNiopJDMpICYgMHhmZmZmKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB8IHJlZ19vZmYgICAgICAgICAgeyAkJCA9ICgoKihDQVJEMTYqKSQxKSAmIDB4ZmZmZik7IH0KLTsKLXJlZ19vZmY6ICAgICAgICBUT0tfUkVHX0FYICB7ICQkID0gKHVuc2lnbmVkIGxvbmcpJihyZWdzLmF4KTsgfQotICAgICAgICAgICAgICB8IFRPS19SRUdfQlggIHsgJCQgPSAodW5zaWduZWQgbG9uZykmKHJlZ3MuYngpOyB9Ci0gICAgICAgICAgICAgIHwgVE9LX1JFR19DWCAgeyAkJCA9ICh1bnNpZ25lZCBsb25nKSYocmVncy5jeCk7IH0KLSAgICAgICAgICAgICAgfCBUT0tfUkVHX0RYICB7ICQkID0gKHVuc2lnbmVkIGxvbmcpJihyZWdzLmR4KTsgfQotICAgICAgICAgICAgICB8IFRPS19SRUdfREkgIHsgJCQgPSAodW5zaWduZWQgbG9uZykmKHJlZ3MuZGkpOyB9Ci0gICAgICAgICAgICAgIHwgVE9LX1JFR19TSSAgeyAkJCA9ICh1bnNpZ25lZCBsb25nKSYocmVncy5zaSk7IH0KLTsKLXJlZ19zZWc6ICAgICAgICBUT0tfU0VHX0RTICB7ICQkID0gKHVuc2lnbmVkIGxvbmcpJihyZWdzLmRzKTsgfQotICAgICAgICAgICAgICB8IFRPS19TRUdfRVMgIHsgJCQgPSAodW5zaWduZWQgbG9uZykmKHJlZ3MuZXMpOyB9Ci07Ci1jb21fdmFyOiAgICAgICAgVE9LX1ZBUl9NRU0gJz8nIGVuZCB7IHByaW50ZigidmFyIG1lbTogMHgleFxuIix2YXJfbWVtKTsgfQotICAgICAgICAgIHwgVE9LX1ZBUiAnPycgZW5kIHsgaWYgKCQxIDwgTUFYX1ZBUikKLSAgICAgICAgICBwcmludGYoInZhclslaV06IDB4JXhcbiIsKGludCkkMSx2YXJbJDFdKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgcHJpbnRmKCJ2YXIgaW5kZXggJWkgb3V0IG9mIHJhbmdlXG4iLChpbnQpJDEpOyB9Ci0gICAgICAgICAgfCBUT0tfVkFSX01FTSB2YWwgZW5kIHsgdmFyX21lbSA9ICQyOyB9ICAgIAotICAgICAgICAgICAgICB8IFRPS19WQVIgdmFsIGVuZCAgICB7IGlmICgkMSA8PSBNQVhfVkFSKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyWyQxXSA9ICQyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoInZhciBpbmRleCAlaSBvdXQgb2YgcmFuZ2VcbiIsKGludCkkMSk7IH0KLSAgICAgICAgICAgICAgfCBUT0tfVkFSIGVycm9yICBlbmQgeyBwcmludGYoIiRpIHZhbFxuIik7IH0KLSAgICAgICAgICAgICAgfCBUT0tfVkFSX01FTSBlcnJvciAgZW5kIHsgcHJpbnRmKCIkaSB2YWxcbiIpOyB9Ci07Ci1jb21fYm9vdDogICAgICAgVE9LX0NPTU1BTkRfQk9PVCAgZW5kIHsgYm9vdCgpOyB9Ci0gICAgICAgICAgICAgICAgVE9LX0NPTU1BTkRfQk9PVCBlcnJvciBlbmQgeyBib290KCk7IH0KLTsKLWNvbV9zZWxlY3Q6ICAgICBUT0tfU0VMRUNUIFRPS19JU0EgZW5kIHsgRGV2aWNlLmJvb3RlZCA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UudHlwZSA9IElTQTsKLSAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRQY2kgPSBOVUxMOyB9ICAgCi0gICAgICAgICAgICAgIHwgVE9LX1NFTEVDVCBUT0tfUENJIHZhbCBUT0tfU0VQIHZhbCBUT0tfU0VQIHZhbCBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgRGV2aWNlLmJvb3RlZCA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgIERldmljZS50eXBlID0gUENJOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlLmxvYy5wY2kuYnVzID0gJDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZS5sb2MucGNpLmRldiA9ICQ1OyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlLmxvYy5wY2kuZnVuYyA9ICQ3OyB9Ci0gICAgICAgICAgICAgIHwgVE9LX1NFTEVDVCAnPycgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgc3dpdGNoIChEZXZpY2UudHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNBOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpc2FcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQ0k6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigicGNpOiAleDoleDoleFxuIixEZXZpY2UubG9jLnBjaS5idXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlLmxvYy5wY2kuZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UubG9jLnBjaS5mdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIm5vIGRldmljZSBzZWxlY3RlZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfCBUT0tfU0VMRUNUIGVycm9yIGVuZCB7IHByaW50Zigic2VsZWN0ID8gfCBpc2EgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifCBwY2k6YnVzOmRldjpmdW5jXG4iKTsgfQotOwotY29tX3F1aXQ6ICAgICAgIFRPS19DT01NQU5EX1FVSVQgZW5kIHsgcmV0dXJuIDA7IH0KLSAgICAgICAgICAgICAgfCBUT0tfQ09NTUFORF9RVUlUIGVycm9yIGVuZCB7IGxvZ29mZigpOyByZXR1cm4gMDsgfQotOwotY29tX2V4ZWM6ICAgICAgIFRPS19DT01NQU5EX0VYRUMgZW5kIHsgZXhlY19pbnQoMHgxMCk7IH0KLSAgICAgICAgICB8IFRPS19DT01NQU5EX0VYRUMgdmFsIGVuZCB7IGV4ZWNfaW50KCQyKTsgfQotICAgICAgICAgIHwgVE9LX0NPTU1BTkRfRVhFQyBlcnJvciBlbmQgeyBleGVjX2ludCgweDEwKTsgfQotOwotY29tX21lbWR1bXA6ICAgIFRPS19DT01NQU5EX01FTURVTVAgdmFsIHZhbCBlbmQgeyBkdW1wX21lbSgkMiwkMyk7IH0KLSAgICAgICAgICAgICAgfCBUT0tfQ09NTUFORF9NRU1EVU1QICBlcnJvciAgZW5kIHsgcHJpbnRmKCJtZW1kdW1wIHN0YXJ0IGxlblxuIik7IH0KLQotICAgIAotOwotY29tX21lbXNldDogICAgIFRPS19DT01NQU5EX01FTVNFVCB2YWwgbGlzdCBlbmQgeyBkb19saXN0KChzdHJ1Y3QgbWVtKikkMywkMik7fQotICAgICAgICAgICAgICB8IFRPS19DT01NQU5EX01FTVNFVCBlcnJvciBlbmQgeyBwcmludGYoInNldG1lbSBhZGRyIFtieXRlIHZhbF0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlt3b3JkIHZhbF0gW2xvbmcgdmFsXSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW1wic3RyaW5nXCJdXG4iKTsgfQotOwotbGlzdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICQkID0gMDsgfSAKLSAgICAgICAgICAgICAgfCBUT0tfQllURSB2YWwgbGlzdCB7IHJlYy5pbnRlZ2VyID0gJDI7Ci0gICAgICAgICAgJCQgPSAodW5zaWduZWQgbG9uZylhZGRfdG9fbGlzdChCWVRFLCZyZWMsKHZvaWQqKSQzKTsgfQotICAgICAgICAgICAgICB8IFRPS19XT1JEIHZhbCBsaXN0IHsgcmVjLmludGVnZXIgPSAkMjsgCi0gICAgICAgICAgJCQgPSAodW5zaWduZWQgbG9uZykgYWRkX3RvX2xpc3QoV09SRCwmcmVjLCh2b2lkKikkMyk7IH0KLSAgICAgICAgICAgICAgfCBUT0tfTE9ORyB2YWwgbGlzdCB7IHJlYy5pbnRlZ2VyID0gJDI7IAotICAgICAgICAgICQkID0gKHVuc2lnbmVkIGxvbmcpIGFkZF90b19saXN0KExPTkcsJnJlYywodm9pZCopJDMpOyB9Ci0gICAgICAgICAgICAgIHwgVE9LX1NUUklORyBsaXN0IHsgcmVjLnB0ciA9ICh2b2lkKikkMTsgCi0gICAgICAgICAgJCQgPSAodW5zaWduZWQgbG9uZykgYWRkX3RvX2xpc3QoU1RSSU5HLCZyZWMsKHZvaWQqKSQyKTsgfQotOwotdmFsOiAgICAgICAgICAgIFRPS19WQVIgIHsgIGlmICgkMSA+IE1BWF9WQVIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ2YXJpYWJsZSBpbmRleCBvdXQgb2YgcmFuZ2VcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJD0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCQgPSB2YXJbJDFdOyB9IAotICAgICAgICAgICAgICB8IFRPS19OVU0gIHsgICQkID0gJDE7IH0KLSAgICAgICAgICAgICAgfCByZWdpc3Rlcl9yZWFkCi07IAotYm9vbDogICAgICAgICAgIFRPS19PTiAgIHsgICQkID0gMTsgfQotICAgICAgICAgICAgICB8IFRPS19PRkYgIHsgICQkID0gMDsgfQotOwotY29uZmlnOiAgICAgICAgIFRPS19QUklOVF9QT1JUIGJvb2wgZW5kIHsgQ29uZmlnLlByaW50UG9ydCA9ICQyOyB9IAotICAgICAgICAgICAgICB8IFRPS19QUklOVF9QT1JUICc/JyBlbmQgIHsgcHJpbnRmKCJwcmludCBwb3J0ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuUHJpbnRQb3J0PyJvbiI6Im9mZiIpOyB9Ci0gICAgICAgICAgfCBUT0tfUFJJTlRfUE9SVCBlcnJvciBlbmQgeyBwcmludGYoInBwb3J0IG9uIHwgb2ZmIHwgP1xuIikgfSAKLSAgICAgICAgICAgICAgfCBUT0tfUFJJTlRfSVJRIGJvb2wgZW5kICB7IENvbmZpZy5QcmludElycSA9ICQyOyB9IAotICAgICAgICAgICAgICB8IFRPS19QUklOVF9JUlEgJz8nIGVuZCAgIHsgcHJpbnRmKCJwcmludCBpcnEgJXNcbiIsICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5QcmludElycT8ib24iOiJvZmYiKTsgfSAKLSAgICAgICAgICB8IFRPS19QUklOVF9JUlEgZXJyb3IgZW5kIHsgcHJpbnRmKCJwaXJxIG9uIHwgb2ZmIHwgP1xuIikgfSAKLSAgICAgICAgICAgICAgfCBUT0tfUFBDSSBib29sIGVuZCAgICAgICB7IENvbmZpZy5QcmludFBjaSA9ICQyOyB9IAotICAgICAgICAgICAgICB8IFRPS19QUENJICc/JyBlbmQgICAgICAgIHsgcHJpbnRmKCJwcmludCBQQ0kgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuUHJpbnRQY2k/Im9uIjoib2ZmIik7IH0gCi0gICAgICAgICAgfCBUT0tfUFBDSSBlcnJvciBlbmQgICAgICB7IHByaW50ZigicHBjaSBvbiB8IG9mZiB8ID9cbiIpIH0gCi0gICAgICAgICAgICAgIHwgVE9LX1BJUCBib29sIGVuZCAgICAgICAgeyBDb25maWcuUHJpbnRJcCA9ICQyOyB9IAotICAgICAgICAgICAgICB8IFRPS19QSVAgJz8nIGVuZCAgICAgICAgIHsgcHJpbnRmKCJwcmludGlwICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuUHJpbnRJcD8ib24iOiJvZmYiKTsgfSAKLSAgICAgICAgICB8IFRPS19QSVAgZXJyb3IgZW5kICAgICAgIHsgcHJpbnRmKCJwaXAgb24gfCBvZmYgfCA/XG4iKSB9IAotICAgICAgICAgICAgICB8IFRPS19JT1NUQVQgYm9vbCBlbmQgICAgIHsgQ29uZmlnLklvU3RhdGlzdGljcyA9ICQyOyB9IAotICAgICAgICAgICAgICB8IFRPS19JT1NUQVQgJz8nIGVuZCAgICAgIHsgcHJpbnRmKCJpbyBzdGF0aXN0aWNzICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuSW9TdGF0aXN0aWNzPyJvbiI6Im9mZiIpOyB9IAotICAgICAgICAgIHwgVE9LX0lPU1RBVCBlcnJvciBlbmQgICAgeyBwcmludGYoImlvc3RhdCBvbiB8IG9mZiB8ID9cbiIpIH0gCi0gICAgICAgICAgICAgIHwgVE9LX1RSQUNFIGJvb2wgZW5kICAgICAgeyBDb25maWcuVHJhY2UgPSAkMjsgfSAKLSAgICAgICAgICAgICAgfCBUT0tfVFJBQ0UgJz8nIGVuZCAgICAgICB7IHByaW50ZigidHJhY2UgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5UcmFjZSA/Im9uIjoib2ZmIik7IH0gCi0gICAgICAgICAgfCBUT0tfVFJBQ0UgZXJyb3IgZW5kIHsgcHJpbnRmKCJ0cmFjZSBvbiB8IG9mZiB8ID9cbiIpIH0gCi07Ci12ZXJib3NlOiAgICAgICAgVE9LX1ZFUkJPU0UgdmFsIGVuZCAgICAgeyBDb25maWcuVmVyYm9zZSA9ICQyOyB9Ci0gICAgICAgICAgfCBUT0tfVkVSQk9TRSAnPycgZW5kICAgICB7IHByaW50ZigidmVyYm9zZTogJWlcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLlZlcmJvc2UpOyB9Ci0gICAgICAgICAgfCBUT0tfVkVSQk9TRSBlcnJvciBlbmQgICB7IHByaW50ZigidmVyYm9zZSB2YWwgfCA/XG4iKTsgfQotOwotbG9nZ2luZzogICAgICAgIFRPS19MT0cgVE9LX1NUUklORyBlbmQgIHsgbG9nb24obm9ybWFsaXplX3N0cmluZygoY2hhciopJDIpKTsgfQotICAgICAgICAgIHwgVE9LX0xPRyAnPycgZW5kICAgICAgICAgeyBpZiAobG9nZ2luZykgcHJpbnRmKCJsb2dmaWxlOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICBlbHNlIHByaW50Zigibm8gbG9nZ2luZ1xuPyIpOyB9Ci0gICAgICAgICAgfCBUT0tfTE9HIFRPS19PRkYgZW5kICAgICAgICAgIHsgbG9nb2ZmKCk7IH0KLSAgICAgICAgICB8IFRPS19MT0cgZXJyb3IgZW5kICAgICAgIHsgcHJpbnRmKCJsb2cgXCI8ZmlsZW5hbWU+XCIgfCA/IHwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiBvZmZcbiIpOyB9Ci07Ci1jbHN0YXQ6ICAgICAgICAgVE9LX0NMU1RBVCBlbmQgICAgICAgICAgeyBjbGVhcl9zdGF0KCk7IH0KLSAgICAgICAgICB8IFRPS19DTFNUQVQgZXJyb3IgZW5kICAgIHsgcHJpbnRmKCJjbHN0YXRcbiIpOyB9IAotOwotcHJpbnQ6ICAgICAgICAgIFRPS19TVERPVVQgYm9vbCBlbmQgICAgIHsgbm9zdGRvdXQgPSAhJDI7IH0KLSAgICAgICAgICAgICAgICAgIHwgVE9LX1NURE9VVCAnPycgZW5kICAgICAgeyBwcmludGYoInByaW50ICVzXG4iLG5vc3Rkb3V0ID8KLSAgICAgICAgICAgICAgICAgICAgICAgICJubyI6InllcyIpOyB9Ci0gICAgICAgICAgfCBUT0tfU1RET1VUIGVycm9yIGVuZCAgICB7IHByaW50ZigicHJpbnQgb24gfCBvZmZcbiIpOyB9Ci07Ci1jb21faGx0OiAgICAgICAgICAgIFRPS19ITFQgdmFsIGVuZCAgICAgICAgIHsgYWRkX2hsdCgkMik7IH0gICAgCi0gICAgICAgICAgfCBUT0tfSExUIFRPS19ERUwgdmFsIGVuZCB7IGRlbF9obHQoJDMpOyB9Ci0gICAgICAgICAgfCBUT0tfSExUIFRPS19ERUwgZW5kICAgICB7IGRlbF9obHQoMjEpOyB9Ci0gICAgICAgICAgICAgIHwgVE9LX0hMVCAnPycgZW5kICAgICAgICAgeyBsaXN0X2hsdCgpOyB9Ci0gICAgICAgICAgfCBUT0tfSExUIGVycm9yIGVuZCAgICAgICB7IHByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhsdCB2YWwgfCBkZWwgW3ZhbF0gfCA/XG4iKTsgfQotOwotaW9wZXJtOiAgICAgICAgIFRPS19JT1BFUk0gdmFsIHZhbCB2YWwgZW5kIHsgaW50IGksbWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQyID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9ICQyICsgJDMgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4ID4gSU9QRVJNX0JJVFMpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSBJT1BFUk1fQklUUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9ICQyO2kgPD0gbWF4OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvcGVybV9saXN0W2ldIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJDQ+MCA/IDEgOiAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgIHwgVE9LX0lPUEVSTSAnPycgZW5kIHsgaW50IGksc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8PSBJT1BFUk1fQklUUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpb3Blcm1fbGlzdFtpXSkgewotICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBpIDw9IElPUEVSTV9CSVRTOyBpKyspIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpb3Blcm1fbGlzdFtpXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW9wZXJtIG9uIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiMHgleCsweCV4XG4iLCBzdGFydCxpLXN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgIHwgVE9LX0lPUEVSTSBlcnJvciBlbmQgeyBwcmludGYoImlvcGVybSBzdGFydCBsZW4gdmFsXG4iKTsgfQotOwotbGlzdF9wY2k6ICAgICAgVE9LX0RVTVBfUENJIGVuZCAgICAgICB7IGxpc3RfcGNpKCk7IH0KLSAgICAgICAgICAgICB8IFRPS19EVU1QX1BDSSBlcnJvciBlbmQgeyBsaXN0X3BjaSgpOyB9Ci07Ci1ib290X2Jpb3M6ICAgICBUT0tfQk9PVF9CSU9TICc/JyBlbmQgeyBpZiAoIUJvb3RCaW9zKSBwcmludGYoIk5vIEJvb3QgQklPU1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgcHJpbnRmKCJCb290QklPUyBmcm9tOiAlaTolaTolaVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3RCaW9zLT5idXMsIEJvb3RCaW9zLT5kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCb290Qmlvcy0+ZnVuYyk7IH0KLSAgICAgICAgICAgICB8IFRPS19CT09UX0JJT1MgZXJyb3IgZW5kIHsgcHJpbnRmICgiYm9vdGJpb3MgYnVzOmRldjpudW1cbiIpOyB9Ci07Ci1obHA6ICAgICAgICAgJz8nICB7IHByaW50ZigiQ29tbWFuZCBsaXN0OlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiIHNlbGVjdCBpc2EgfCBwY2kgYnVzOmRldjpmdW5jXG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIGJvb3RcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgc2VnOnJlZyB2YWwgfCByZWcgdmFsIFxuIik7Ci0gICAgICAgICAgICBwcmludGYoIiAkeCB2YWwgfCAkbWVtIHZhbFxuIik7Ci0gICAgICAgICAgICBwcmludGYoIiBzZXRtZW0gYWRkciBsaXN0OyBhZGRyIDo9IHZhbFxuIik7Ci0gICAgICAgICAgICBwcmludGYoIiBkdW1wbWVtIGFkZHIgbGVuOyBhZGRyLGxlbiA6PSB2YWxcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgZG8gW3ZhbF1cbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgcXVpdFxuIik7Ci0gICAgICAgICAgICBwcmludGYoIiA/XG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIHNlZyA6PSBkcyB8IGVzOyIKLSAgICAgICAgICAgICAgICIgcmVnIDo9IGF4IHwgYnggfCBjeCB8IGR4IHwgc2kgXG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIHZhbCA6PSB2YXIgfCA8aGV4LW51bWJlcj4gfCBzZWc6cmVnIHwgc2VnXG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIHZhciA6PSAkeCB8ICRtZW07IHggOj0gMC4uMjBcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgbGlzdCA6PSBieXRlIHZhbCB8IHdvcmQgdmFsIHwgbG9uZyB2YWwgIgotICAgICAgICAgICAgICAgInwgXCJzdHJpbmdcIlxuIik7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIgcHBvcnQgb24gfCBvZmYgfCA/XG4iKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiBwcGNpIG9uIHwgb2ZmIHwgP1xuIik7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIgcGlycSBvbiB8IG9mZiB8ID9cbiIpOwotICAgICAgICAgICAgICAgIHByaW50ZigiIHBpcCBvbiB8IG9mZiB8ID9cbiIpOwotICAgICAgICAgICAgICAgIHByaW50ZigiIHRyYWNlIG9uIHwgb2ZmIHwgP1xuIik7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIgaW9zdGF0IG9uIHwgb2ZmIHwgP1xuIik7Ci0gICAgICAgICAgICBwcmludGYoIiB2ZXJib3NlIHZhbFxuIik7Ci0gICAgICAgICAgICBwcmludGYoIiBsb2cgXCI8ZmlsZW5hbWU+XCIgfCBvZmYgfCA/XG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIHByaW50IG9uIHwgb2ZmXG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIGhsdCB2YWwgfCBkZWwgW3ZhbF0gfCA/XG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIGNsc3RhdFxuIik7Ci0gICAgICAgICAgICBwcmludGYoIiBscGNpXG4iKTsKLSAgICAgICAgICAgIHByaW50ZiAoImJvb3RiaW9zID9cbiIpOwotfQotOwotCi0lJQotCi1zdGF0aWMgdm9pZAotZHVtcF9tZW0oQ0FSRDMyIGFkZHIsIGludCBsZW4pCi17Ci0gICAgZHByaW50KGFkZHIsbGVuKTsKLX0KLQotc3RhdGljIHZvaWQKLWV4ZWNfaW50KGludCBudW0pCi17Ci0gICAgaWYgKG51bSA9PSAweDEwKSB7ICAvKiB2aWRlbyBpbnRlcnJ1cHQgKi8KLSAgICBpZiAoRGV2aWNlLnR5cGUgPT0gTk9ORSkgewotICAgICAgICBDdXJyZW50UGNpID0gUGNpTGlzdDsKLSAgICAgICAgd2hpbGUgKEN1cnJlbnRQY2kpIHsKLSAgICAgICAgaWYgKEN1cnJlbnRQY2ktPmFjdGl2ZSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBDdXJyZW50UGNpID0gQ3VycmVudFBjaS0+bmV4dDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUN1cnJlbnRQY2kpCi0gICAgICAgIERldmljZS50eXBlID0gSVNBOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgRGV2aWNlLnR5cGUgPSBQQ0k7Ci0gICAgICAgIERldmljZS5sb2MucGNpLmRldiA9IEN1cnJlbnRQY2ktPmRldjsKLSAgICAgICAgRGV2aWNlLmxvYy5wY2kuYnVzID0gQ3VycmVudFBjaS0+YnVzOwotICAgICAgICBEZXZpY2UubG9jLnBjaS5mdW5jID0gQ3VycmVudFBjaS0+ZnVuYzsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgaWYgKERldmljZS50eXBlICE9IElTQSkgewotICAgICAgIGlmICghRGV2aWNlLmJvb3RlZCkgewotICAgICAgICAgICAgICBpZiAoIUN1cnJlbnRQY2kgfHwgKERldmljZS50eXBlID09IFBDSQotICAgICAgICAgICAgICAgJiYgKCFDdXJyZW50UGNpLT5hY3RpdmUKLSAgICAgICAgICAgICAgICAgICAmJiAoRGV2aWNlLmxvYy5wY2kuZGV2ICE9IEN1cnJlbnRQY2ktPmRldgotICAgICAgICAgICAgICAgICB8fCBEZXZpY2UubG9jLnBjaS5idXMgIT0gQ3VycmVudFBjaS0+YnVzCi0gICAgICAgICAgICAgICAgIHx8IERldmljZS5sb2MucGNpLmZ1bmMgIT0gQ3VycmVudFBjaS0+ZnVuYykpKSkgewotICAgICAgICAgICAgICAgIHByaW50ZigiYm9vdCB0aGUgZGV2aWNlIGZpc3RcbiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgIH0gZWxzZQotICAgICAgIEN1cnJlbnRQY2kgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgRGV2aWNlLmJvb3RlZCA9IEZBTFNFOyAvKiB3ZSBuZWVkIHRoaXMgZm9yIHNhbml0eSEgKi8KLSAgICB9Ci0gICAgCi0gICAgcnVuSU5UKG51bSwmcmVncyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ib290KHZvaWQpCi17Ci0gICAgaWYgKERldmljZS50eXBlID09IE5PTkUpIHsKLSAgICBwcmludGYoInNlbGVjdCBhIGRldmljZSBmaXN0XG4iKTsKLSAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGNhbGxfYm9vdCgmRGV2aWNlKTsKLX0KLQotc3RhdGljIHZvaWQgKgotYWRkX3RvX2xpc3QoZW51bSBtZW1fdHlwZSB0eXBlLCB1bmlvbiBtZW1fdmFsICpyZWMsIHZvaWQgKm5leHQpCi17Ci0gICAgc3RydWN0IG1lbSAqbWVtX3JlYyA9IChzdHJ1Y3QgbWVtICopIG1hbGxvYyhzaXplb2YobWVtX3JlYykpOwotCi0gICAgbWVtX3JlYy0+dHlwZSA9IHR5cGU7Ci0gICAgbWVtX3JlYy0+bmV4dCA9IG5leHQ7Ci0gICAgCi0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBCWVRFOgotICAgIGNhc2UgV09SRDoKLSAgICBjYXNlIExPTkc6Ci0gICAgbWVtX3JlYy0+dmFsLmludGVnZXIgPSByZWMtPmludGVnZXI7Ci0gICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVFJJTkc6Ci0gICAgbWVtX3JlYy0+dmFsLnB0ciA9IG5vcm1hbGl6ZV9zdHJpbmcocmVjLT5wdHIpOwotICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gbWVtX3JlYzsKLX0KLQotc3RhdGljIGludAotdmFsaWRSYW5nZShpbnQgYWRkcixpbnQgbGVuKQotewotICAgIGludCBlbmQgPSBhZGRyICsgbGVuOwotCi0gICAgaWYgKGFkZHIgPCAweDEwMDAgfHwgZW5kID4gMHhjMDAwMCkKLSAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2xpc3Qoc3RydWN0IG1lbSAqbGlzdCwgbWVtVHlwZSBhZGRyKQotewotICAgc3RydWN0IG1lbSAqcHJldjsKLSAgIGludCBsZW47Ci0gICAKLSAgIHdoaWxlIChsaXN0KSB7Ci0gICAgc3dpdGNoIChsaXN0LT50eXBlKSB7Ci0gICAgICAgICBjYXNlIEJZVEU6Ci0gICAgICAgICBpZiAoIXZhbGlkUmFuZ2UoYWRkciwxKSkgZ290byBlcnJvcjsKLSAgICAgICAgICooQ0FSRDgqKWFkZHIgPSBsaXN0LT52YWwuaW50ZWdlcjsKLSAgICAgICAgIGFkZHIgPSsgMTsKLSAgICAgICAgICAgICBicmVhazsgICAgIAotICAgICAgICAgY2FzZSBXT1JEOgotICAgICAgICAgaWYgKCF2YWxpZFJhbmdlKGFkZHIsMikpIGdvdG8gZXJyb3I7Ci0gICAgICAgICAqKENBUkQxNiopYWRkciA9IGxpc3QtPnZhbC5pbnRlZ2VyOwotICAgICAgICAgYWRkciA9KyAyOwotICAgICAgICAgICAgIGJyZWFrOyAgICAgCi0gICAgICAgICBjYXNlIExPTkc6Ci0gICAgICAgICBpZiAoIXZhbGlkUmFuZ2UoYWRkciw0KSkgZ290byBlcnJvcjsKLSAgICAgICAgICooQ0FSRDMyKilhZGRyID0gbGlzdC0+dmFsLmludGVnZXI7Ci0gICAgICAgICBhZGRyID0rIDQ7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgIGxlbiA9IHN0cmxlbigoY2hhciopbGlzdC0+dmFsLnB0cik7Ci0gICAgICAgICBpZiAoIXZhbGlkUmFuZ2UoYWRkcixsZW4pKSBnb3RvIGVycm9yOwotICAgICAgICAgbWVtY3B5KChDQVJEOCopYWRkciwodm9pZCopbGlzdC0+dmFsLnB0cixsZW4pOwotICAgICAgICAgYWRkciA9KyBsZW47Ci0gICAgICAgICAgICAgZnJlZShsaXN0LT52YWwucHRyKTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICB9ICAgICAKLSAgICAgICBwcmV2ID0gbGlzdDsKLSAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgICAgICBmcmVlKHByZXYpOwotICAgICAgIGNvbnRpbnVlOwotICAgZXJyb3I6Ci0gICAgICAgcHJpbnRmKCJhZGRyZXNzIG91dCBvZiByYW5nZVxuIik7Ci0gICAgICAgd2hpbGUgKGxpc3QpIHsKLSAgICAgICBwcmV2ID0gbGlzdDsKLSAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgICAgICBmcmVlKHByZXYpOwotICAgICAgIH0KLSAgICAgICBicmVhazsKLSAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotbm9ybWFsaXplX3N0cmluZyhjaGFyICpwdHIpCi17Ci0gICAgaW50IGkgPSAwLCBqID0gMCwgYyA9IDAsIGVzYz0gMDsKLSAgICBpbnQgc2l6ZTsKLSAgICBjaGFyICptZW1fcHRyOwotICAgIAotICAgIHNpemUgPSBzdHJsZW4ocHRyKTsKLSAgICBtZW1fcHRyID0gbWFsbG9jKHNpemUpOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHN3aXRjaCAoKihwdHIgKyBpKSkgewotICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICBpZiAoZXNjKSB7Ci0gICAgICAgICAgICAgICAgKihtZW1fcHRyICsgaisrKSA9ICoocHRyICsgaSk7Ci0gICAgICAgICAgICAgICAgZXNjID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSAKLSAgICAgICAgICAgICAgICBlc2MgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1wiJzoKLSAgICAgICAgICAgIGlmIChlc2MpIHsKLSAgICAgICAgICAgICAgICAqKG1lbV9wdHIgKyBqKyspID0gKihwdHIgKyBpKTsKLSAgICAgICAgICAgICAgICBlc2MgPSAwOwotICAgICAgICAgICAgfSBlbHNlIAotICAgICAgICAgICAgICAgIGMrKzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgKihtZW1fcHRyICsgaisrKSA9ICoocHRyICsgaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoYyA+IDEpIHsKLSAgICAgICAgICAgICoobWVtX3B0ciArIGopID0gJ1wwJzsgICAgIAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaSsrOwotICAgIH0KLSAgICByZXR1cm4gbWVtX3B0cjsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvcGNpLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNThhNTcxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvcGNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgotICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci0gKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCi0gKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAotICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLSAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLSAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWYgZGVmaW5lZCAoX19hbHBoYV9fKSB8fCBkZWZpbmVkIChfX2lhNjRfXykKLSNpbmNsdWRlIDxzeXMvaW8uaD4KLSNlbmRpZgotI2luY2x1ZGUgIkFzbU1hY3Jvcy5oIgotCi0jaW5jbHVkZSAicGNpLmgiCi0KLS8qCi0gKiBJJ20gcmF0aGVyIHNpbXBsZSBtaW5kZW5kIC0gdGhlcmVmb3JlIEkgZG8gYSBwb29yIG1hbidzCi0gKiBwY2kgc2NhbiB3aXRob3V0IGFsbCB0aGUgZmFuY3kgc3R1ZmYgdGhhdCBpcyBkb25lIGluCi0gKiBzY2FucGNpLiBIb3dldmVyIHRoYXQncyBhbGwgd2UgbmVlZC4KLSAqLwotCi1QY2lTdHJ1Y3RQdHIgUGNpU3RydWN0ID0gTlVMTDsKLVBjaUJ1c1B0ciBQY2lCdXNlcyA9IE5VTEw7Ci1QY2lTdHJ1Y3RQdHIgQ3VycmVudFBjaSA9IE5VTEw7Ci1QY2lTdHJ1Y3RQdHIgUGNpTGlzdCA9IE5VTEw7Ci1QY2lTdHJ1Y3RQdHIgQm9vdEJpb3MgPSBOVUxMOwotaW50IHBjaU1heEJ1cyA9IDA7Ci0KLXN0YXRpYyBDQVJEMzIgUGNpQ2ZnMUFkZHI7Ci0KLXN0YXRpYyB2b2lkIHJlYWRDb25maWdTcGFjZUNmZzEoQ0FSRDMyIGJ1cywgQ0FSRDMyIGRldiwgQ0FSRDMyIGZ1bmMsCi0JCUNBUkQzMiAqcmVnKTsKLXN0YXRpYyBpbnQgY2hlY2tTbG90Q2ZnMShDQVJEMzIgYnVzLCBDQVJEMzIgZGV2LCBDQVJEMzIgZnVuYyk7Ci1zdGF0aWMgaW50IGNoZWNrU2xvdENmZzIoQ0FSRDMyIGJ1cywgaW50IGRldik7Ci1zdGF0aWMgdm9pZCByZWFkQ29uZmlnU3BhY2VDZmcyKENBUkQzMiBidXMsIGludCBkZXYsIENBUkQzMiAqcmVnKTsKLXN0YXRpYyBDQVJEOCBpbnRlcnByZXRDb25maWdTcGFjZShDQVJEMzIgKnJlZywgaW50IGJ1c2lkeCwKLQkJICBDQVJEOCBkZXYsIENBUkQ4IGZ1bmMpOwotc3RhdGljIENBUkQzMiBmaW5kQklPU01hcChQY2lTdHJ1Y3RQdHIgcGNpUCwgQ0FSRDMyICpiaW9zU2l6ZSk7Ci1zdGF0aWMgdm9pZCByZXN0b3JlTWVtKFBjaVN0cnVjdFB0ciBwY2lQKTsKLQotCi0jaWZkZWYgX19hbHBoYV9fCi0jZGVmaW5lIFBDSV9CVVNfRlJPTV9UQUcodGFnKSAgKCgodGFnKSAmIDB4MDBmZjAwMDApID4+IDE2KQotI2RlZmluZSBQQ0lfREZOX0ZST01fVEFHKHRhZykgKCgodGFnKSAmIDB4MDAwMGZmMDApID4+IDgpCi0KLSNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0KLUNBUkQzMgotYXhwUGNpQ2ZnUmVhZChDQVJEMzIgdGFnKQotewotICAgIGludCBidXMsIGRmbjsKLSAgICBDQVJEMzIgdmFsID0gMHhmZmZmZmZmZjsKLQotICAgIGJ1cyA9IFBDSV9CVVNfRlJPTV9UQUcodGFnKTsKLSAgICBkZm4gPSBQQ0lfREZOX0ZST01fVEFHKHRhZyk7Ci0KLSAgICBzeXNjYWxsKF9fTlJfcGNpY29uZmlnX3JlYWQsIGJ1cywgZGZuLCB0YWcgJiAweGZmLCA0LCAmdmFsKTsKLSAgICByZXR1cm4odmFsKTsKLX0KLQotdm9pZAotYXhwUGNpQ2ZnV3JpdGUoQ0FSRDMyIHRhZywgQ0FSRDMyIHZhbCkKLXsKLSAgICBpbnQgYnVzLCBkZm47Ci0KLSAgICBidXMgPSBQQ0lfQlVTX0ZST01fVEFHKHRhZyk7Ci0gICAgZGZuID0gUENJX0RGTl9GUk9NX1RBRyh0YWcpOwotCi0gICAgc3lzY2FsbChfX05SX3BjaWNvbmZpZ193cml0ZSwgYnVzLCBkZm4sIHRhZyAmIDB4ZmYsIDQsICZ2YWwpOwotfQotCi1zdGF0aWMgQ0FSRDMyICgqcmVhZFBjaSkoQ0FSRDMyIHJlZykgPSBheHBQY2lDZmdSZWFkOwotc3RhdGljIHZvaWQgKCp3cml0ZVBjaSkoQ0FSRDMyIHJlZywgQ0FSRDMyIHZhbCkgPSBheHBQY2lDZmdXcml0ZTsKLSNlbHNlCi1zdGF0aWMgQ0FSRDMyIHJlYWRQY2lDZmcxKENBUkQzMiByZWcpOwotc3RhdGljIHZvaWQgd3JpdGVQY2lDZmcxKENBUkQzMiByZWcsIENBUkQzMiB2YWwpOwotc3RhdGljIENBUkQzMiByZWFkUGNpQ2ZnMihDQVJEMzIgcmVnKTsKLXN0YXRpYyB2b2lkIHdyaXRlUGNpQ2ZnMihDQVJEMzIgcmVnLCBDQVJEMzIgdmFsKTsKLQotc3RhdGljIENBUkQzMiAoKnJlYWRQY2kpKENBUkQzMiByZWcpID0gcmVhZFBjaUNmZzE7Ci1zdGF0aWMgdm9pZCAoKndyaXRlUGNpKShDQVJEMzIgcmVnLCBDQVJEMzIgdmFsKSA9IHdyaXRlUGNpQ2ZnMTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19zcGFyY19fKQotI2RlZmluZSBQQ0lfRU4gMHgwMDAwMDAwMAotI2Vsc2UKLSNkZWZpbmUgUENJX0VOIDB4ODAwMDAwMDAKLSNlbmRpZgotCi0KLXN0YXRpYyBpbnQgbnVtYnVzOwotc3RhdGljIGludCBob3N0YnJpZGdlcyA9IDE7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBwY2lNaW5NZW1SZWcgPSB+MDsKLQotCi12b2lkCi1zY2FuX3BjaSh2b2lkKQotewotICAgIHVuc2lnbmVkIHNob3J0IGNvbmZpZ3R5cGU7Ci0KLSAgICBDQVJEMzIgcmVnWzY0XTsKLSAgICBpbnQgYnVzaWR4OwotICAgIENBUkQ4IGNhcmRudW07Ci0gICAgQ0FSRDggZnVuYzsKLSAgICBpbnQgaWR4OwotCi0gICAgaW50IGk7Ci0gICAgUGNpU3RydWN0UHRyIHBjaTE7Ci0gICAgUGNpQnVzUHRyIHBjaV9iMSxwY2lfYjI7Ci0KLSNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19pYTY0X18pCi0gICAgY29uZmlndHlwZSA9IDE7Ci0jZWxzZQotICAgIENBUkQ4IHRtcDEsIHRtcDI7Ci0gICAgQ0FSRDMyIHRtcDMyXzEsIHRtcDMyXzI7Ci0gICAgb3V0YihQQ0lfTU9ERTJfRU5BQkxFX1JFRywgMHgwMCk7Ci0gICAgb3V0YihQQ0lfTU9ERTJfRk9SV0FSRF9SRUcsIDB4MDApOwotICAgIHRtcDEgPSBpbmIoUENJX01PREUyX0VOQUJMRV9SRUcpOwotICAgIHRtcDIgPSBpbmIoUENJX01PREUyX0ZPUldBUkRfUkVHKTsKLSAgICBpZiAoKHRtcDEgPT0gMHgwMCkgJiYgKHRtcDIgPT0gMHgwMCkpIHsKLQljb25maWd0eXBlID0gMjsKLQlyZWFkUGNpID0gcmVhZFBjaUNmZzI7Ci0Jd3JpdGVQY2kgPSB3cml0ZVBjaUNmZzI7Ci0JUF9wcmludGYoIlBDSSBzYXlzIGNvbmZpZ3VyYXRpb24gdHlwZSAyXG4iKTsKLSAgICB9IGVsc2UgewotCXRtcDMyXzEgPSBpbmwoUENJX01PREUxX0FERFJFU1NfUkVHKTsKLQlvdXRsKFBDSV9NT0RFMV9BRERSRVNTX1JFRywgUENJX0VOKTsKLQl0bXAzMl8yID0gaW5sKFBDSV9NT0RFMV9BRERSRVNTX1JFRyk7Ci0Jb3V0bChQQ0lfTU9ERTFfQUREUkVTU19SRUcsIHRtcDMyXzEpOwotCWlmICh0bXAzMl8yID09IFBDSV9FTikgewotCSAgICBjb25maWd0eXBlID0gMTsKLQkgICAgUF9wcmludGYoIlBDSSBzYXlzIGNvbmZpZ3VyYXRpb24gdHlwZSAxXG4iKTsKLQl9IGVsc2UgewotCSAgICBQX3ByaW50ZigiTm8gUENJICFcbiIpOwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKGNvbmZpZ3R5cGUgPT0gMSkgewotCVBfcHJpbnRmKCJQQ0kgcHJvYmluZyBjb25maWd1cmF0aW9uIHR5cGUgMVxuIik7Ci0JYnVzaWR4ID0gMDsKLQludW1idXMgPSAxOwotCWlkeCA9IDA7Ci0JZG8gewotCSAgICBQX3ByaW50ZigiXG5Qcm9iaW5nIGZvciBkZXZpY2VzIG9uIFBDSSBidXMgJWQ6XG4iLCBidXNpZHgpOwotCSAgICBmb3IgKGNhcmRudW0gPSAwOyBjYXJkbnVtIDwgTUFYX0RFVl9QRVJfVkVORE9SX0NGRzE7IGNhcmRudW0rKykgewotCQlmdW5jID0gMDsKLQkJZG8gewotCQkgICAgLyogbG9vcCBvdmVyIHRoZSBkaWZmZXJlbnQgZnVuY3Rpb25zLCBpZiBwcmVzZW50ICovCi0JCSAgICBpZiAoIWNoZWNrU2xvdENmZzEoYnVzaWR4LGNhcmRudW0sZnVuYykpCi0JCQlicmVhazsKLQkJICAgIHJlYWRDb25maWdTcGFjZUNmZzEoYnVzaWR4LGNhcmRudW0sZnVuYyxyZWcpOwotCi0JCSAgICBmdW5jID0gaW50ZXJwcmV0Q29uZmlnU3BhY2UocmVnLGJ1c2lkeCwKLQkJCQkJCWNhcmRudW0sZnVuYyk7Ci0KLQkJICAgIGlmIChpZHgrKyA+IE1BWF9QQ0lfREVWSUNFUykKLQkJCWNvbnRpbnVlOwotCQl9IHdoaWxlIChmdW5jIDwgOCk7Ci0JICAgIH0KLQl9IHdoaWxlICgrK2J1c2lkeCA8IFBDSV9NQVhCVVMpOwotI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChfX2lhNjRfXykKLQkvKiBkb24ndCB1c2Ugb3V0bCgpICA7LSkgKi8KLSNlbHNlCi0Jb3V0bChQQ0lfTU9ERTFfQUREUkVTU19SRUcsIDApOwotI2VuZGlmCi0gICAgfSBlbHNlIHsKLQlpbnQgc2xvdDsKLQotCVBfcHJpbnRmKCJQQ0kgcHJvYmluZyBjb25maWd1cmF0aW9uIHR5cGUgMlxuIik7Ci0JYnVzaWR4ID0gMDsKLQludW1idXMgPSAxOwotCWlkeCA9IDA7Ci0JZG8gewotCSAgICBmb3IgKHNsb3Q9MHhjMDsgc2xvdDwweGQwOyBpKyspIHsKLQkJaWYgKCFjaGVja1Nsb3RDZmcyKGJ1c2lkeCxzbG90KSkKLQkJICAgIGJyZWFrOwotCQlyZWFkQ29uZmlnU3BhY2VDZmcyKGJ1c2lkeCxzbG90LHJlZyk7Ci0KLQkJaW50ZXJwcmV0Q29uZmlnU3BhY2UocmVnLGJ1c2lkeCwKLQkJCQkgICAgIHNsb3QsMCk7Ci0JCWlmIChpZHgrKyA+IE1BWF9QQ0lfREVWSUNFUykKLQkJICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfSAgd2hpbGUgKCsrYnVzaWR4IDwgUENJX01BWEJVUyk7Ci0gICAgfQotCi0KLSAgICBwY2lNYXhCdXMgPSBudW1idXMgLSAxOwotICAgIFBfcHJpbnRmKCJOdW1iZXIgb2YgYnVzZXMgaW4gc3lzdGVtOiAlaVxuIixwY2lNYXhCdXMgKyAxKTsKLSAgICBQX3ByaW50ZigiTWluIFBDSSBtZW0gYWRkcmVzczogMHglbHhcbiIscGNpTWluTWVtUmVnKTsKLQotICAgIC8qIGxpbmsgYnVzZXMgKi8KLSAgICBwY2lfYjEgPSBQY2lCdXNlczsKLSAgICB3aGlsZSAocGNpX2IxKSB7Ci0JcGNpX2IyID0gUGNpQnVzZXM7Ci0JcGNpX2IxLT5wQnVzID0gTlVMTDsKLQl3aGlsZSAocGNpX2IyKSB7Ci0JICAgIGlmIChwY2lfYjEtPnByaW1hcnkgPT0gcGNpX2IyLT5zZWNvbmRhcnkpCi0JCXBjaV9iMS0+cEJ1cyA9IHBjaV9iMjsKLQkgICAgcGNpX2IyID0gcGNpX2IyLT5uZXh0OwotCX0KLQlwY2lfYjEgPSBwY2lfYjEtPm5leHQ7Ci0gICAgfQotICAgIHBjaTEgPSBQY2lTdHJ1Y3Q7Ci0gICAgd2hpbGUgKHBjaTEpIHsKLQlwY2lfYjIgPSBQY2lCdXNlczsKLQlwY2kxLT5wQnVzID0gTlVMTDsKLQl3aGlsZSAocGNpX2IyKSB7Ci0JICAgIGlmIChwY2kxLT5idXMgPT0gcGNpX2IyLT5zZWNvbmRhcnkpCi0JCXBjaTEtPnBCdXMgPSBwY2lfYjI7Ci0JICAgIHBjaV9iMiA9IHBjaV9iMi0+bmV4dDsKLQl9Ci0JcGNpMSA9IHBjaTEtPm5leHQ7Ci0gICAgfQotICAgIGlmIChSRVNPUlQpIHsKLQlQY2lTdHJ1Y3RQdHIgdG1wID0gUGNpU3RydWN0LCB0bXAxOwotCVBjaVN0cnVjdCA9IE5VTEw7Ci0Jd2hpbGUgKHRtcCkgewotCSAgICB0bXAxID0gdG1wLT5uZXh0OwotCSAgICB0bXAtPm5leHQgPSBQY2lTdHJ1Y3Q7Ci0JICAgIFBjaVN0cnVjdCA9IHRtcDsKLQkgICAgdG1wID0gdG1wMTsKLQl9Ci0gICAgfQotICAgIFBjaUxpc3QgPSBDdXJyZW50UGNpID0gUGNpU3RydWN0OwotfQotCi0jaWZuZGVmIF9fYWxwaGFfXwotc3RhdGljIENBUkQzMgotcmVhZFBjaUNmZzEoQ0FSRDMyIHJlZykKLXsKLSAgICBDQVJEMzIgdmFsOwotCi0gICAgb3V0bChQQ0lfTU9ERTFfQUREUkVTU19SRUcsIHJlZyk7Ci0gICAgdmFsID0gaW5sKFBDSV9NT0RFMV9EQVRBX1JFRyk7Ci0gICAgb3V0bChQQ0lfTU9ERTFfQUREUkVTU19SRUcsIDApOwotICAgIFBfcHJpbnRmKCJyZWFkaW5nOiAweCV4IGZyb20gMHgleFxuIix2YWwscmVnKTsKLSAgICByZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVQY2lDZmcxKENBUkQzMiByZWcsIENBUkQzMiB2YWwpCi17Ci0gICAgUF9wcmludGYoIndyaXRpbmc6IDB4JXggdG8gMHgleFxuIix2YWwscmVnKTsKLSAgICBvdXRsKFBDSV9NT0RFMV9BRERSRVNTX1JFRywgcmVnKTsKLSAgICBvdXRsKFBDSV9NT0RFMV9EQVRBX1JFRyx2YWwpOwotICAgIG91dGwoUENJX01PREUxX0FERFJFU1NfUkVHLCAwKTsKLX0KLQotc3RhdGljIENBUkQzMgotcmVhZFBjaUNmZzIoQ0FSRDMyIHJlZykKLXsKLSAgICBDQVJEMzIgdmFsOwotICAgIENBUkQ4IGJ1cyA9IChyZWcgPj4gMTYpICYgMHhmZjsKLSAgICBDQVJEOCBkZXYgPSAocmVnID4+IDExKSAmIDB4MWY7Ci0gICAgQ0FSRDggbnVtID0gcmVnICYgMHhmZjsKLQotICAgIG91dGIoUENJX01PREUyX0VOQUJMRV9SRUcsIDB4RjEpOwotICAgIG91dGIoUENJX01PREUyX0ZPUldBUkRfUkVHLCBidXMpOwotICAgIHZhbCA9IGlubCgoZGV2IDw8IDgpICsgbnVtKTsKLSAgICBvdXRiKFBDSV9NT0RFMl9FTkFCTEVfUkVHLCAweDAwKTsKLSAgICBQX3ByaW50ZigicmVhZGluZzogMHgleCBmcm9tIDB4JXhcbiIsdmFsLHJlZyk7Ci0gICAgcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIHZvaWQKLXdyaXRlUGNpQ2ZnMihDQVJEMzIgcmVnLCBDQVJEMzIgdmFsKQotewotICAgIENBUkQ4IGJ1cyA9IChyZWcgPj4gMTYpICYgMHhmZjsKLSAgICBDQVJEOCBkZXYgPSAocmVnID4+IDExKSAmIDB4MWY7Ci0gICAgQ0FSRDggbnVtID0gcmVnICYgMHhmZjsKLQotICAgIFBfcHJpbnRmKCJ3cml0aW5nOiAweCV4IHRvIDB4JXhcbiIsdmFsLHJlZyk7Ci0gICAgb3V0YihQQ0lfTU9ERTJfRU5BQkxFX1JFRywgMHhGMSk7Ci0gICAgb3V0YihQQ0lfTU9ERTJfRk9SV0FSRF9SRUcsIGJ1cyk7Ci0gICAgb3V0bCgoZGV2IDw8IDgpICsgbnVtLHZhbCk7Ci0gICAgb3V0YihQQ0lfTU9ERTJfRU5BQkxFX1JFRywgMHgwMCk7Ci19Ci0jZW5kaWYKLQotdm9pZAotcGNpVmlkZW9EaXNhYmxlKHZvaWQpCi17Ci0gICAgLyogZGlzYWJsZSBWR0Egcm91dGluZyBvbiBicmlkZ2VzICovCi0gICAgUGNpQnVzUHRyIHBicCA9IFBjaUJ1c2VzOwotICAgIFBjaVN0cnVjdFB0ciBwY3AgPSBQY2lTdHJ1Y3Q7Ci0KLSAgICB3aGlsZSAocGJwKSB7Ci0Jd3JpdGVQY2kocGJwLT5TbG90LmwgfCAweDNjLCBwYnAtPmJjdGwgJiB+KENBUkQzMikoODw8MTYpKTsKLQlwYnAgPSBwYnAtPm5leHQ7Ci0gICAgfQotICAgIC8qIGRpc2FibGUgZGlzcGxheSBkZXZpY2VzICovCi0gICAgd2hpbGUgKHBjcCkgewotCXdyaXRlUGNpKHBjcC0+U2xvdC5sIHwgMHgwNCwgcGNwLT5jbWRfc3QgJiB+KENBUkQzMikzKTsKLQl3cml0ZVBjaShwY3AtPlNsb3QubCB8IDB4MzAsIHBjcC0+Um9tQmFzZSAmIH4oQ0FSRDMyKTEpOwotCXBjcCA9IHBjcC0+bmV4dDsKLSAgICB9Ci19Ci0KLXZvaWQKLXBjaVZpZGVvUmVzdG9yZSh2b2lkKQotewotICAgIC8qIGRpc2FibGUgVkdBIHJvdXRpbmcgb24gYnJpZGdlcyAqLwotICAgIFBjaUJ1c1B0ciBwYnAgPSBQY2lCdXNlczsKLSAgICBQY2lTdHJ1Y3RQdHIgcGNwID0gUGNpU3RydWN0OwotCi0gICAgd2hpbGUgKHBicCkgewotCXdyaXRlUGNpKHBicC0+U2xvdC5sIHwgMHgzYywgcGJwLT5iY3RsKTsKLQlwYnAgPSBwYnAtPm5leHQ7Ci0gICAgfQotICAgIC8qIGRpc2FibGUgZGlzcGxheSBkZXZpY2VzICovCi0gICAgd2hpbGUgKHBjcCkgewotCXdyaXRlUGNpKHBjcC0+U2xvdC5sIHwgMHgwNCwgcGNwLT5jbWRfc3QpOwotCXdyaXRlUGNpKHBjcC0+U2xvdC5sIHwgMHgzMCwgcGNwLT5Sb21CYXNlKTsKLQlwY3AgPSBwY3AtPm5leHQ7Ci0gICAgfQotfQotCi12b2lkCi1FbmFibGVDdXJyZW50KCkKLXsKLSAgICBQY2lCdXNQdHIgcGJwOwotICAgIFBjaVN0cnVjdFB0ciBwY3AgPSBDdXJyZW50UGNpOwotCi0gICAgcGNpVmlkZW9EaXNhYmxlKCk7Ci0KLSAgICBwYnAgPSBwY3AtPnBCdXM7Ci0gICAgd2hpbGUgKHBicCkgeyAvKiBlbmFibGUgYnJpZGdlcyAqLwotCXdyaXRlUGNpKHBicC0+U2xvdC5sIHwgMHgzYywgcGJwLT5iY3RsIHwgKENBUkQzMikoODw8MTYpKTsKLQlwYnAgPSBwYnAtPnBCdXM7Ci0gICAgfQotICAgIHdyaXRlUGNpKHBjcC0+U2xvdC5sIHwgMHgwNCwgcGNwLT5jbWRfc3QgfCAoQ0FSRDMyKTMpOwotICAgIHdyaXRlUGNpKHBjcC0+U2xvdC5sIHwgMHgzMCwgcGNwLT5Sb21CYXNlIHwgKENBUkQzMikxKTsKLX0KLQotQ0FSRDgKLVBjaVJlYWQ4KGludCBvZmZzZXQsIENBUkQzMiBTbG90KQotewotICAgIGludCBzaGlmdCA9IG9mZnNldCAmIDB4MzsKLSAgICBvZmZzZXQgPSBvZmZzZXQgJiAweEZDOwotICAgIHJldHVybiAoKHJlYWRQY2koU2xvdCB8IG9mZnNldCkgPj4gKHNoaWZ0IDw8IDMpKSAmIDB4ZmYpOwotfQotCi1DQVJEMTYKLVBjaVJlYWQxNihpbnQgb2Zmc2V0LCBDQVJEMzIgU2xvdCkKLXsKLSAgICBpbnQgc2hpZnQgPSBvZmZzZXQgJiAweDI7Ci0gICAgb2Zmc2V0ID0gb2Zmc2V0ICYgMHhGQzsKLSAgICByZXR1cm4gKChyZWFkUGNpKFNsb3QgfCBvZmZzZXQpID4+IChzaGlmdCA8PCAzKSkgJiAweGZmZmYpOwotfQotCi1DQVJEMzIKLVBjaVJlYWQzMihpbnQgb2Zmc2V0LCBDQVJEMzIgU2xvdCkKLXsKLSAgICBvZmZzZXQgPSBvZmZzZXQgJiAweEZDOwotICAgIHJldHVybiAocmVhZFBjaShTbG90IHwgb2Zmc2V0KSk7Ci19Ci0KLXZvaWQKLVBjaVdyaXRlOChpbnQgb2Zmc2V0LCBDQVJEOCBieXRlLCBDQVJEMzIgU2xvdCkKLXsKLSAgICBDQVJEMzIgdmFsOwotICAgIGludCBzaGlmdCA9IG9mZnNldCAmIDB4MzsKLSAgICBvZmZzZXQgPSBvZmZzZXQgJiAweEZDOwotICAgIHZhbCA9IHJlYWRQY2koU2xvdCB8IG9mZnNldCk7Ci0gICAgdmFsICY9IH4oQ0FSRDMyKSgweGZmIDw8IChzaGlmdCA8PCAzKSk7Ci0gICAgdmFsIHw9IGJ5dGUgPDwgKHNoaWZ0IDw8IDMpOwotICAgIHdyaXRlUGNpKFNsb3QgfCBvZmZzZXQsIHZhbCk7Ci19Ci0KLXZvaWQKLVBjaVdyaXRlMTYoaW50IG9mZnNldCwgQ0FSRDE2IHdvcmQsIENBUkQzMiBTbG90KQotewotICAgIENBUkQzMiB2YWw7Ci0gICAgaW50IHNoaWZ0ID0gb2Zmc2V0ICYgMHgyOwotICAgIG9mZnNldCA9IG9mZnNldCAmIDB4RkM7Ci0gICAgdmFsID0gcmVhZFBjaShTbG90IHwgb2Zmc2V0KTsKLSAgICB2YWwgJj0gfihDQVJEMzIpKDB4ZmZmZiA8PCAoc2hpZnQgPDwgMykpOwotICAgIHZhbCB8PSB3b3JkIDw8IChzaGlmdCA8PCAzKTsKLSAgICB3cml0ZVBjaShTbG90IHwgb2Zmc2V0LCB2YWwpOwotfQotCi12b2lkCi1QY2lXcml0ZTMyKGludCBvZmZzZXQsIENBUkQzMiBsZywgQ0FSRDMyIFNsb3QpCi17Ci0gICAgb2Zmc2V0ID0gb2Zmc2V0ICYgMHhGQzsKLSAgICB3cml0ZVBjaShTbG90IHwgb2Zmc2V0LCBsZyk7Ci19Ci0KLWludAotbWFwUGNpUm9tKFBjaVN0cnVjdFB0ciBwY2lQKQotewotICAgIHVuc2lnbmVkIGxvbmcgUm9tQmFzZSA9IDA7Ci0gICAgaW50IG1lbV9mZDsKLSAgICB1bnNpZ25lZCBjaGFyICptZW0sICpwdHI7Ci0gICAgdW5zaWduZWQgY2hhciAqc2NyYXRjaCA9IE5VTEw7Ci0gICAgaW50IGxlbmd0aCA9IDA7Ci0gICAgQ0FSRDMyIGJpb3NTaXplID0gMHgxMDAwMDAwOwotICAgIENBUkQzMiBlbmFibGVQY2k7Ci0KLSAgICBpZiAoIXBjaVApCi0gICAgICBwY2lQID0gQ3VycmVudFBjaTsKLQotICAgIGlmIChGSVhfUk9NKSB7Ci0JUm9tQmFzZSA9IGZpbmRCSU9TTWFwKHBjaVAsICZiaW9zU2l6ZSk7Ci0JaWYgKCFSb21CYXNlKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCJDYW5ub3QgcmVtYXAgQklPUyBvZiAlaTolaTolaSAiCi0JCSAgICAiLSB0cnlpbmcgcHJlc2V0IGFkZHJlc3NcbiIscGNpUC0+YnVzLHBjaVAtPmRldiwKLQkJICAgIHBjaVAtPmZ1bmMpOwotCSAgICBSb21CYXNlID0gcGNpUC0+Um9tQmFzZSAmIH4oQ0FSRDMyKTB4RkY7Ci0JfQotICAgIH0gIGVsc2UgewotCVJvbUJhc2UgPSBwY2lQLT5Sb21CYXNlICYgfihDQVJEMzIpMHhGRjsKLQlpZiAoflJvbUJhc2UgKyAxIDwgYmlvc1NpemUgfHwgIVJvbUJhc2UpCi0JICAgIFJvbUJhc2UgPSBmaW5kQklPU01hcChwY2lQLCAmYmlvc1NpemUpOwotICAgIH0KLQotICAgIFBfcHJpbnRmKCJSb21CYXNlOiAweCVseFxuIixSb21CYXNlKTsKLQotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JET05MWSkpPDApIHsKLQlwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7Ci0JcmVzdG9yZU1lbShwY2lQKTsKLQlyZXR1cm4gKDApOwotICAgIH0KLQotICAgIFBjaVdyaXRlMzIoMHgzMCxSb21CYXNlIHwgMSxwY2lQLT5TbG90LmwpOwotCi0jaWZkZWYgX19hbHBoYV9fCi0gICAgbWVtID0gcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKDAsIGJpb3NTaXplLCBQUk9UX1JFQUQsCi0JCQkJICAgICAgTUFQX1NIQVJFRCwgbWVtX2ZkLCBSb21CYXNlIHwgX2J1c19iYXNlKCkpOwotI2Vsc2UKLSAgICBtZW0gPSBwdHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoMCwgYmlvc1NpemUsIFBST1RfUkVBRCwKLQkJCQkgICAgICBNQVBfU0hBUkVELCBtZW1fZmQsIFJvbUJhc2UpOwotI2VuZGlmCi0gICAgaWYgKHBjaVAgIT0gQ3VycmVudFBjaSkgewotICAgICAgZW5hYmxlUGNpID0gUGNpUmVhZDMyKDB4NCxwY2lQLT5TbG90LmwpOwotICAgICAgUGNpV3JpdGUzMigweDQsZW5hYmxlUGNpIHwgMHgyLHBjaVAtPlNsb3QubCk7Ci0gICAgfQotCi0jaWZkZWYgUFJJTlRfUENJCi0gICAgZHByaW50KCh1bnNpZ25lZCBsb25nKXB0ciwweDMwKTsKLSNlbmRpZgotICAgIHdoaWxlICggKnB0ciA9PSAweDU1ICYmICoocHRyKzEpID09IDB4QUEpIHsKLQl1bnNpZ25lZCBzaG9ydCBkYXRhX29mZiA9ICoocHRyKzB4MTgpIHwgKCoocHRyKzB4MTkpPDwgOCk7Ci0JdW5zaWduZWQgY2hhciAqZGF0YSA9IHB0ciArIGRhdGFfb2ZmOwotCXVuc2lnbmVkIGNoYXIgdHlwZTsKLQlpbnQgaTsKLQotCWlmICgqZGF0YSE9J1AnIHx8ICooZGF0YSsxKSE9J0MnIHx8ICooZGF0YSsyKSE9J0knIHx8ICooZGF0YSszKSE9J1InKSB7Ci0JICAgIGJyZWFrOwotCX0KLQl0eXBlID0gKihkYXRhICsgMHgxNCk7Ci0JUF9wcmludGYoImRhdGEgc2VnbWVudCBpbiBCSU9TOiAweCV4LCB0eXBlOiAweCV4ICIsZGF0YV9vZmYsdHlwZSk7Ci0KLQlpZiAodHlwZSAhPSAwKSAgeyAvKiBub3QgUEMtQVQgaW1hZ2U6IGZpbmQgbmV4dCBvbmUgKi8KLQkgICAgdW5zaWduZWQgaW50IGltYWdlX2xlbmd0aDsKLQkgICAgdW5zaWduZWQgY2hhciBpbmRpY2F0b3IgPSAqKGRhdGEgKyAweDE1KTsKLQkgICAgaWYgKGluZGljYXRvciAmIDB4ODApIC8qIGxhc3QgaW1hZ2UgKi8KLQkJYnJlYWs7Ci0JICAgIGltYWdlX2xlbmd0aCA9ICgqKGRhdGEgKyAweDEwKQotCQkJICAgIHwgKCooZGF0YSArIDB4MTEpIDw8IDgpKSA8PCA5OwotCSAgICBQX3ByaW50ZigiZGF0YSBpbWFnZSBsZW5ndGg6IDB4JXgsIGluZDogMHgleFxuIiwKLQkJICAgICBpbWFnZV9sZW5ndGgsaW5kaWNhdG9yKTsKLQkgICAgcHRyID0gcHRyICsgaW1hZ2VfbGVuZ3RoOwotCSAgICBjb250aW51ZTsKLQl9Ci0JLyogT0ssIHdlIGhhdmUgYSBQQyBJbWFnZSAqLwotCWxlbmd0aCA9ICgqKHB0ciArIDIpIDw8IDkpOwotCVBfcHJpbnRmKCJCSU9TIGxlbmd0aDogMHgleFxuIixsZW5ndGgpOwotCXNjcmF0Y2ggPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYyhsZW5ndGgpOwotCS8qIGRvbid0IHVzZSBtZW1jcHkoKSBoZXJlOiBSZWFkaW5nIGZyb20gYnVzISAqLwotCWZvciAoaT0wO2k8bGVuZ3RoO2krKykKLQkgICAgKihzY3JhdGNoICsgaSk9KihwdHIgKyBpKTsKLQlicmVhazsKLSAgICB9Ci0KLSAgICBpZiAocGNpUCAhPSBDdXJyZW50UGNpKQotICAgICAgUGNpV3JpdGUzMigweDQsZW5hYmxlUGNpLHBjaVAtPlNsb3QubCk7Ci0KLSAgICAvKiB1bm1hcC9jbG9zZS9kaXNhYmxlIFBDSSBiaW9zIG1lbSAqLwotICAgIG11bm1hcChtZW0sIGJpb3NTaXplKTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIC8qIGRpc2FibGUgYW5kIHJlc3RvcmUgbWFwcGluZyAqLwotICAgIHdyaXRlUGNpKHBjaVAtPlNsb3QubCB8IDB4MzAsIHBjaVAtPlJvbUJhc2UgJiB+KENBUkQzMikxKTsKLQotICAgIGlmIChzY3JhdGNoICYmIGxlbmd0aCkgewotCW1lbWNweSgodW5zaWduZWQgY2hhciAqKVZfQklPUywgc2NyYXRjaCwgbGVuZ3RoKTsKLQlmcmVlKHNjcmF0Y2gpOwotICAgIH0KLQotICAgIHJlc3RvcmVNZW0ocGNpUCk7Ci0gICAgcmV0dXJuIGxlbmd0aDsKLX0KLQotQ0FSRDMyCi1maW5kUGNpKENBUkQxNiBzbG90QlgpCi17Ci0gICAgQ0FSRDMyIHNsb3QgPSBzbG90QlggPDwgODsKLQotICAgIGlmIChzbG90ID09IChDdXJyZW50UGNpLT5TbG90LmwgJiB+UENJX0VOKSkKLQlyZXR1cm4gKEN1cnJlbnRQY2ktPlNsb3QubCB8IFBDSV9FTik7Ci0gICAgZWxzZSB7Ci0jaWYgIVNIT1dfQUxMX0RFVgotCVBjaUJ1c1B0ciBwQnVzID0gQ3VycmVudFBjaS0+cEJ1czsKLQl3aGlsZSAocEJ1cykgewotCSAgLyogICAgICBmcHJpbnRmKHN0ZGVyciwic2xvdDogMHgleCAgYnJpZGdlOiAweCV4XG4iLHNsb3QsIHBCdXMtPlNsb3QubCk7ICovCi0JICAgIGlmIChzbG90ID09IChwQnVzLT5TbG90LmwgJiB+UENJX0VOKSkKLQkJcmV0dXJuIHBCdXMtPlNsb3QubCB8IFBDSV9FTjsKLQkgICAgcEJ1cyA9IHBCdXMtPm5leHQ7Ci0JfQotI2Vsc2UKLQlQY2lTdHJ1Y3RQdHIgcFBjaSA9IFBjaVN0cnVjdDsKLQl3aGlsZSAocFBjaSkgewotCSAgLypmcHJpbnRmKHN0ZGVyciwic2xvdDogMHgleCAgYnJpZGdlOiAweCV4XG4iLHNsb3QsIHBQY2ktPlNsb3QubCk7ICovCi0JICAgIGlmIChzbG90ID09IChwUGNpLT5TbG90LmwgJiB+UENJX0VOKSkKLQkJcmV0dXJuIHBQY2ktPlNsb3QubCB8IFBDSV9FTjsKLQkgICAgcFBjaSA9IHBQY2ktPm5leHQ7Ci0JfQotI2VuZGlmCi0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1DQVJEMTYKLXBjaVNsb3RCWChQY2lTdHJ1Y3RQdHIgcFBjaSkKLXsKLSAgICByZXR1cm4gKENBUkQxNikoKHBQY2ktPlNsb3QubCA+PiA4KSAmIDB4RkZGRik7Ci19Ci0KLVBjaVN0cnVjdFB0cgotZmluZFBjaURldmljZShDQVJEMTYgdmVuZG9ySUQsIENBUkQxNiBkZXZpY2VJRCwgY2hhciBuKQotewotICAgIFBjaVN0cnVjdFB0ciBwUGNpID0gQ3VycmVudFBjaTsKLSAgICBuKys7Ci0KLSAgICB3aGlsZSAocFBjaSkgIHsKLQlpZiAoKHBQY2ktPlZlbmRvcklEID09IHZlbmRvcklEKSAmJiAocFBjaS0+RGV2aWNlSUQgPT0gZGV2aWNlSUQpKSB7Ci0JaWYgKCEoLS1uKSkgYnJlYWs7Ci0JfQotICAgIHBQY2kgPSBwUGNpLT5uZXh0OwotICAgIH0KLSAgICByZXR1cm4gcFBjaTsKLX0KLQotUGNpU3RydWN0UHRyCi1maW5kUGNpQ2xhc3MoQ0FSRDggaW50ZiwgQ0FSRDggc3ViQ2xhc3MsIENBUkQxNiBjbGFzcywgY2hhciBuKQotewotICAgIFBjaVN0cnVjdFB0ciBwUGNpID0gQ3VycmVudFBjaTsKLSAgICBuKys7Ci0KLSAgICB3aGlsZSAocFBjaSkgIHsKLQlpZiAoKHBQY2ktPkludGVyZmFjZSA9PSBpbnRmKSAmJiAocFBjaS0+U3ViQ2xhc3MgPT0gc3ViQ2xhc3MpCi0JICYmIChwUGNpLT5CYXNlQ2xhc3MgPT0gY2xhc3MpKSB7Ci0JaWYgKCEoLS1uKSkgYnJlYWs7Ci0JfQotICAgIHBQY2kgPSBwUGNpLT5uZXh0OwotICAgIH0KLSAgICByZXR1cm4gcFBjaTsKLX0KLQotc3RhdGljIHZvaWQKLXJlYWRDb25maWdTcGFjZUNmZzEoQ0FSRDMyIGJ1cywgQ0FSRDMyIGRldiwgQ0FSRDMyIGZ1bmMsIENBUkQzMiAqcmVnKQotewotICAgIENBUkQzMiAgIGNvbmZpZ19jbWQgPSBQQ0lfRU4gfCAoYnVzPDwxNikgfAotICAgICAgKGRldjw8MTEpIHwgKGZ1bmM8PDgpOwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaTw2NDtpKz00KSB7Ci0jaWZkZWYgX19hbHBoYV9fCi0JcmVnW2ldID0gYXhwUGNpQ2ZnUmVhZChjb25maWdfY21kIHwgaSk7Ci0jZWxzZQotCW91dGwoUENJX01PREUxX0FERFJFU1NfUkVHLCBjb25maWdfY21kIHwgaSk7Ci0JcmVnW2ldID0gaW5sKFBDSV9NT0RFMV9EQVRBX1JFRyk7Ci0jZW5kaWYKLQotI2lmZGVmIFY4NkJJT1NfREVCVUcKLQlQX3ByaW50ZigiMHglbHhcbiIscmVnW2ldKTsKLSNlbmRpZgotICAgIH0KLX0KLQotc3RhdGljIGludAotY2hlY2tTbG90Q2ZnMShDQVJEMzIgYnVzLCBDQVJEMzIgZGV2LCBDQVJEMzIgZnVuYykKLXsKLSAgICBDQVJEMzIgICAgY29uZmlnX2NtZCA9IFBDSV9FTiB8IChidXM8PDE2KSB8Ci0gICAgICAoZGV2PDwxMSkgfCAoZnVuYzw8OCk7Ci0gICAgQ0FSRDMyIHJlZzsKLSNpZmRlZiBfX2FscGhhX18KLQlyZWcgPSBheHBQY2lDZmdSZWFkKGNvbmZpZ19jbWQpOwotI2Vsc2UKLQlvdXRsKFBDSV9NT0RFMV9BRERSRVNTX1JFRywgY29uZmlnX2NtZCk7Ci0JcmVnID0gaW5sKFBDSV9NT0RFMV9EQVRBX1JFRyk7Ci0jZW5kaWYKLSAgICBpZiAocmVnICE9IDB4RkZGRkZGRkYpCi0JcmV0dXJuIDE7Ci0gICAgZWxzZQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1jaGVja1Nsb3RDZmcyKENBUkQzMiBidXMsIGludCBkZXYpCi17Ci0gICAgQ0FSRDMyIHZhbDsKLQotICAgIG91dGIoUENJX01PREUyX0VOQUJMRV9SRUcsIDB4RjEpOwotICAgIG91dGIoUENJX01PREUyX0ZPUldBUkRfUkVHLCBidXMpOwotICAgIHZhbCA9IGlubChkZXYgPDwgOCk7Ci0gICAgb3V0YihQQ0lfTU9ERTJfRk9SV0FSRF9SRUcsIDB4MDApOwotICAgIG91dGIoUENJX01PREUyX0VOQUJMRV9SRUcsIDB4MDApOwotICAgIGlmICh2YWwgPT0gMHhGRkZGRkZGRikKLQlyZXR1cm4gMDsKLSAgICBpZiAodmFsID09IDB4RjBGMEYwRjApCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWFkQ29uZmlnU3BhY2VDZmcyKENBUkQzMiBidXMsIGludCBkZXYsIENBUkQzMiAqcmVnKQotewotICAgIGludCBpOwotCi0gICAgb3V0YihQQ0lfTU9ERTJfRU5BQkxFX1JFRywgMHhGMSk7Ci0gICAgb3V0YihQQ0lfTU9ERTJfRk9SV0FSRF9SRUcsIGJ1cyk7Ci0gICAgZm9yIChpID0gMDsgaTw2NDtpKz00KSB7Ci0JcmVnW2ldID0gaW5sKChkZXYgPDwgOCkgKyBpKTsKLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0JUF9wcmludGYoIjB4JWx4XG4iLHJlZ1tpXSk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgb3V0YihQQ0lfTU9ERTJfRU5BQkxFX1JFRywgMHgwMCk7Ci19Ci0KLXN0YXRpYyBDQVJEOAotaW50ZXJwcmV0Q29uZmlnU3BhY2UoQ0FSRDMyICpyZWcsIGludCBidXNpZHgsIENBUkQ4IGRldiwgQ0FSRDggZnVuYykKLXsKLSAgICBDQVJEMzIgY29uZmlnX2NtZDsKLSAgICBDQVJEMTYgdmVuZG9yLCBkZXZpY2U7Ci0gICAgQ0FSRDggYmFzZWNsYXNzLCBzdWJjbGFzczsKLSAgICBDQVJEOCBwcmltYXJ5LCBzZWNvbmRhcnk7Ci0gICAgQ0FSRDggaGVhZGVyLCBpbnRlcmZhY2U7Ci0gICAgaW50IGk7Ci0KLSAgICBjb25maWdfY21kID0gUENJX0VOIHwgYnVzaWR4PDwxNiB8Ci0JKGRldjw8MTEpIHwgKGZ1bmM8PDgpOwotCi0gICAgZm9yIChpID0gMHgxMDsgaSA8IDB4Mjg7IGkrPTQpIHsKLQlpZiAoSVNfTUVNMzIocmVnW2ldKSkKLQkgICAgaWYgKChyZWdbaV0gJiAweEZGRkZGRkYwKSA8IHBjaU1pbk1lbVJlZykKLQkJcGNpTWluTWVtUmVnID0gKHJlZ1tpXSAmIDB4RkZGRkZGRjApOwotI2lmZGVmIF9fYWxwaGFfXwotCWlmIChJU19NRU02NChyZWdbaV0pKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYWRkciA9IHJlZ1tpXSB8Ci0JICAgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ1tpKzRdKSA8PCAzMjsKLQkgICAgaWYgKChhZGRyICYgfjB4ZkwpIDwgcGNpTWluTWVtUmVnKQotCQlwY2lNaW5NZW1SZWcgPSAoYWRkciAmIH4weGZMKTsKLQkgICAgaSs9NDsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0gICAgdmVuZG9yID0gcmVnWzBdICYgMHhGRkZGOwotICAgIGRldmljZSA9IHJlZ1swXSA+PiAxNjsKLSAgICBQX3ByaW50ZigiYnVzOiAlaSBjYXJkOiAlaSBmdW5jICVpIHJlZzA6IDB4JXggIiwgYnVzaWR4LGRldixmdW5jLHJlZ1swXSk7Ci0gICAgYmFzZWNsYXNzID0gcmVnWzhdID4+IDI0OwotICAgIHN1YmNsYXNzID0gKHJlZ1s4XSA+PiAxNikgJiAweEZGOwotICAgIGludGVyZmFjZSA9IChyZWdbOF0gPj4gOCkgJiAweEZGOwotCi0gICAgaGVhZGVyID0gKHJlZ1sweDBjXSA+PiAxNikgJiAweGZmOwotICAgIFBfcHJpbnRmKCJiYyAweCV4LCBzdWIgMHgleCwgaWYgMHgleCwgaGRyIDB4JXhcbiIsCi0JICAgICBiYXNlY2xhc3Msc3ViY2xhc3MsaW50ZXJmYWNlLGhlYWRlcik7Ci0gICAgaWYgKEJSSURHRV9DTEFTUyhiYXNlY2xhc3MpKSB7Ci0JaWYgKEJSSURHRV9QQ0lfQ0xBU1Moc3ViY2xhc3MpKSB7Ci0JICAgIFBjaUJ1c1B0ciBwYnAgPSBtYWxsb2Moc2l6ZW9mKFBjaUJ1c1JlYykpOwotCSAgICBQX3ByaW50ZigiUGNpLVBjaSBCcmlkZ2UgZm91bmQ7ICIpOwotCSAgICBwcmltYXJ5ID0gcmVnWzB4MThdICYgMHhGRjsKLQkgICAgc2Vjb25kYXJ5ID0gKHJlZ1sweDE4XSA+PiA4KSAmIDB4RkY7Ci0JICAgIFBfcHJpbnRmKCJwcmltYXJ5OiAweCV4IHNlY29uZGFyeTogMHgleFxuIiwKLQkJICAgICBwcmltYXJ5LHNlY29uZGFyeSk7Ci0JICAgIHBicC0+YmN0bCA9IHJlZ1sweDNjXTsKLQkgICAgcGJwLT5wcmltYXJ5ID0gcHJpbWFyeTsKLQkgICAgcGJwLT5zZWNvbmRhcnkgPSBzZWNvbmRhcnk7Ci0JICAgIHBicC0+U2xvdC5sID0gY29uZmlnX2NtZDsKLQkgICAgcGJwLT5uZXh0ID0gUGNpQnVzZXM7Ci0JICAgIFBjaUJ1c2VzID0gcGJwOwotCSAgICBudW1idXMrKzsKLQl9IGVsc2UgaWYgKEJSSURHRV9IT1NUX0NMQVNTKHN1YmNsYXNzKQotCQkgICAmJiAoaG9zdGJyaWRnZXMrKyA+IDEpKSB7Ci0JICAgIG51bWJ1cysrOwotCX0KLSAgICB9IGVsc2UgaWYgKFZJREVPX0NMQVNTKGJhc2VjbGFzcyxzdWJjbGFzcykpIHsKLQlQY2lTdHJ1Y3RQdHIgcGNwID0gbWFsbG9jKHNpemVvZihQY2lTdHJ1Y3RSZWMpKTsKLQlQX3ByaW50ZigiRGlzcGxheSBhZGFwdGVyIGZvdW5kXG4iKTsKLQlwY3AtPlJvbUJhc2UgPSByZWdbMHgzMF07Ci0JcGNwLT5jbWRfc3QgPSByZWdbNF07Ci0JcGNwLT5hY3RpdmUgPSAocmVnWzRdICYgMHgwMykgPT0gMyA/IDEgOiAwOwotCXBjcC0+VmVuZG9ySUQgPSB2ZW5kb3I7Ci0JcGNwLT5EZXZpY2VJRCA9IGRldmljZTsKLQlwY3AtPkludGVyZmFjZSA9IGludGVyZmFjZTsKLQlwY3AtPkJhc2VDbGFzcyA9IGJhc2VjbGFzczsKLQlwY3AtPlN1YkNsYXNzID0gc3ViY2xhc3M7Ci0JcGNwLT5TbG90LmwgPSBjb25maWdfY21kOwotCXBjcC0+YnVzID0gYnVzaWR4OwotCXBjcC0+ZGV2ID0gZGV2OwotCXBjcC0+ZnVuYyA9IGZ1bmM7Ci0JcGNwLT5uZXh0ID0gUGNpU3RydWN0OwotCVBjaVN0cnVjdCA9IHBjcDsKLSAgICB9Ci0gICAgaWYgKChmdW5jID09IDApCi0JJiYgKChoZWFkZXIgJiBQQ0lfTVVMVElGVU5DX0RFVikgPT0gMCkpCi0JZnVuYyA9IDg7Ci0gICAgZWxzZQotCWZ1bmMrKzsKLSAgICByZXR1cm4gZnVuYzsKLX0KLQotc3RhdGljIENBUkQzMiByZW1hcE1FTV92YWw7Ci1zdGF0aWMgaW50IHJlbWFwTUVNX251bTsKLQotc3RhdGljIGludCAvKiBtYXAgaXQgb24gc29tZSBvdGhlciB2aWRlbyBkZXZpY2UgKi8KLXJlbWFwTWVtKFBjaVN0cnVjdFB0ciBwY2lQLCBpbnQgbnVtLCBDQVJEMzIgc2l6ZSkKLXsKLSAgICBQY2lTdHJ1Y3RQdHIgcGNpUHRyID0gUGNpU3RydWN0OwotICAgIGludCBpOwotICAgIENBUkQzMiBvcmc7Ci0gICAgQ0FSRDMyIHZhbDsKLSAgICBDQVJEMzIgc2l6ZV9uOwotCi0gICAgb3JnID0gUGNpUmVhZDMyKG51bSArIDB4MTAscGNpUC0+U2xvdC5sKTsKLQotICAgIHdoaWxlIChwY2lQdHIpIHsKLQlmb3IgKGkgPSAwOyBpIDwgMjA7IGk9aSs0KSB7Ci0KLQkgICAgdmFsID0gUGNpUmVhZDMyKGkgKyAweDEwLHBjaVB0ci0+U2xvdC5sKTsKLQkgICAgLyogZG9uJ3QgbWFwIGl0IG9uIGl0c2VsZiAqLwotCSAgICBpZiAoKG9yZyAmIDB4ZmZmZmZmZjApID09ICh2YWwgJiAweGZmZmZmZmYwKSkKLQkJY29udGludWU7Ci0JICAgIGlmICh2YWwgJiYgISh2YWwgJiAxKSkKLQkJUGNpV3JpdGUzMihpICsgMHgxMCwweGZmZmZmZmZmLHBjaVB0ci0+U2xvdC5sKTsKLQkgICAgZWxzZQotCQljb250aW51ZTsKLQkgICAgc2l6ZV9uID0gUGNpUmVhZDMyKGkgKyAweDEwLHBjaVB0ci0+U2xvdC5sKTsKLQkgICAgUGNpV3JpdGUzMihpICsgMHgxMCx2YWwscGNpUHRyLT5TbG90LmwpOwotCSAgICBzaXplX24gPSB+KENBUkQzMikoc2l6ZV9uICAmIDB4ZmZmZmZmZjApICsgMTsKLQotCSAgICBpZiAoc2l6ZV9uID49IHNpemUpIHsKLQkJUGNpV3JpdGUzMihudW0gKyAweDEwLHZhbCxwY2lQLT5TbG90LmwpOwotCQlyZXR1cm4gMTsKLQkgICAgfQotCX0KLQlwY2lQdHIgPSBwY2lQdHItPm5leHQ7Ci0gICAgfQotICAgIC8qIGxhc3QgcmVzb3J0OiB0cnkgdG8gZ28gYmVsb3cgbG93ZXN0IFBDSSBtZW0gYWRkcmVzcyAqLwotICAgIHZhbCA9ICgocGNpTWluTWVtUmVnICYgfihDQVJEMzIpKHNpemUgLSAxKSkgLSBzaXplKTsKLSAgICBpZiAodmFsID4gMHg3ZmZmZmZmZikgewotCVBjaVdyaXRlMzIobnVtICsgMHgxMCx2YWwsIHBjaVAtPlNsb3QubCk7Ci0JcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZXN0b3JlTWVtKFBjaVN0cnVjdFB0ciBwY2lQKQotewotICAgIGlmIChyZW1hcE1FTV92YWwgPT0gMCkgcmV0dXJuOwotICAgIFBjaVdyaXRlMzIocmVtYXBNRU1fbnVtICsgMHgxMCxyZW1hcE1FTV92YWwscGNpUC0+U2xvdC5sKTsKLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyBDQVJEMzIKLWZpbmRCSU9TTWFwKFBjaVN0cnVjdFB0ciBwY2lQLCBDQVJEMzIgKmJpb3NTaXplKQotewotICAgIFBjaVN0cnVjdFB0ciBwY2lQdHIgPSBQY2lTdHJ1Y3Q7Ci0gICAgaW50IGk7Ci0gICAgQ0FSRDMyIHZhbDsKLSAgICBDQVJEMzIgc2l6ZTsKLQotICAgIFBjaVdyaXRlMzIoMHgzMCwweGZmZmZmZmZmLHBjaVAtPlNsb3QubCk7Ci0gICAgKmJpb3NTaXplID0gUGNpUmVhZDMyKDB4MzAscGNpUC0+U2xvdC5sKTsKLSAgICBQX3ByaW50ZigiYmlvcyBzaXplOiAweCV4XG4iLCpiaW9zU2l6ZSk7Ci0gICAgUGNpV3JpdGUzMigweDMwLHBjaVAtPlJvbUJhc2UscGNpUC0+U2xvdC5sKTsKLSAgICAqYmlvc1NpemUgPSB+KCpiaW9zU2l6ZSAmIDB4RkZGRkZGMDApICsgMTsKLSAgICBQX3ByaW50ZigiYmlvcyBzaXplIG1hc2tlZDogMHgleFxuIiwqYmlvc1NpemUpOwotICAgIGlmICgqYmlvc1NpemUgPiAoMTAyNCAqIDEwMjQgKiAxNikpIHsKLSAgICAgICpiaW9zU2l6ZSA9IDEwMjQgKiAxMDI0ICogMTY7Ci0gICAgICBQX3ByaW50ZigiZml4aW5nIGJyb2tlbiBCSU9TIHNpemU6IDB4JXhcbiIsKmJpb3NTaXplKTsKLSAgICB9Ci0gICAgd2hpbGUgKHBjaVB0cikgewotCWlmIChwY2lQdHItPmJ1cyAhPSBwY2lQLT5idXMpIHsKLQkgICAgcGNpUHRyID0gcGNpUHRyLT5uZXh0OwotCSAgICBjb250aW51ZTsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IDIwOyBpPWkrNCkgewotCi0JICAgIHZhbCA9IFBjaVJlYWQzMihpICsgMHgxMCxwY2lQdHItPlNsb3QubCk7Ci0JICAgIGlmICghKHZhbCAmIDEpKQotCi0JICAgIFBjaVdyaXRlMzIoaSArIDB4MTAsMHhmZmZmZmZmZixwY2lQdHItPlNsb3QubCk7Ci0JICAgIGVsc2UKLQkJY29udGludWU7Ci0JICAgIHNpemUgPSBQY2lSZWFkMzIoaSArIDB4MTAscGNpUHRyLT5TbG90LmwpOwotCSAgICBQY2lXcml0ZTMyKGkgKyAweDEwLHZhbCxwY2lQdHItPlNsb3QubCk7Ci0JICAgIHNpemUgPSB+KENBUkQzMikoc2l6ZSAmIDB4RkZGRkZGRjApICsgMTsKLSNpZmRlZiBWODZfQklPU19ERUJVRwotCSAgICBQX3ByaW50Zigic2l6ZTogMHgleFxuIixzaXplKTsKLSNlbmRpZgotCSAgICBpZiAoc2l6ZSA+PSAqYmlvc1NpemUpIHsKLQkJaWYgKHBjaVAgPT0gcGNpUHRyKSB7IC8qIGlmIHNhbWUgZGV2aWNlIHJlbWFwIHJhbSovCi0JCSAgICBpZiAoIShyZW1hcE1lbShwY2lQLGksc2l6ZSkpKQotCQkJY29udGludWU7Ci0JCSAgICByZW1hcE1FTV92YWwgPSB2YWw7Ci0JCSAgICByZW1hcE1FTV9udW0gPSBpOwotCQl9IGVsc2UgewotCQkgICAgcmVtYXBNRU1fdmFsID0gMDsKLQkJfQotCQlyZXR1cm4gdmFsICYgMHhGRkZGRkYwMDsKLQkgICAgfQotCX0KLQlwY2lQdHIgPSBwY2lQdHItPm5leHQ7Ci0gICAgfQotICAgIHJlbWFwTUVNX3ZhbCA9IDA7Ci0gICAgLyogdmVyeSBsYXN0IHJlc29ydCAqLwotICAgIGlmIChwY2lQLT5idXMgPT0gMCAmJiAocGNpTWluTWVtUmVnID4gKmJpb3NTaXplKSkKLSAgICAgIHJldHVybiAocGNpTWluTWVtUmVnIC0gc2l6ZSkgJiB+KHNpemUgLSAxKTsKLQotICAgIHJldHVybiAwOwotfQotCi1pbnQKLWNmZzFvdXQoQ0FSRDE2IGFkZHIsIENBUkQzMiB2YWwpCi17Ci0gIGlmIChhZGRyID09IDB4Q0Y4KSB7Ci0gICAgUGNpQ2ZnMUFkZHIgPSB2YWw7Ci0gICAgcmV0dXJuIDE7Ci0gIH0gZWxzZSBpZiAoYWRkciA9PSAweENGQykgewotICAgIHdyaXRlUGNpKFBjaUNmZzFBZGRyLCB2YWwpOwotICAgIHJldHVybiAxOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLWNmZzFpbihDQVJEMTYgYWRkciwgQ0FSRDMyICp2YWwpCi17Ci0gIGlmIChhZGRyID09IDB4Q0Y4KSB7Ci0gICAgKnZhbCA9IFBjaUNmZzFBZGRyOwotICAgIHJldHVybiAxOwotICB9IGVsc2UgaWYgKGFkZHIgPT0gMHhDRkMpIHsKLSAgICAqdmFsID0gcmVhZFBjaShQY2lDZmcxQWRkcik7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLWxpc3RfcGNpKHZvaWQpCi17Ci0gICAgUGNpU3RydWN0UHRyIHBjaSA9IFBjaUxpc3Q7Ci0KLSAgICB3aGlsZSAocGNpKSB7Ci0gICAgcHJpbnRmKCJbMHgleDoweCV4OjB4JXhdIHZlbmRvcjogMHglNC40eCBkZXY6IDB4JTQuNHggY2xhc3M6IDB4JTQuNHgiCi0JICAgIiBzdWJjbGFzczogMHglNC40eFxuIixwY2ktPmJ1cyxwY2ktPmRldixwY2ktPmZ1bmMsCi0JICAgcGNpLT5WZW5kb3JJRCxwY2ktPkRldmljZUlELHBjaS0+QmFzZUNsYXNzLHBjaS0+U3ViQ2xhc3MpOwotICAgIHBjaSA9IHBjaS0+bmV4dDsKLSAgICB9Ci19Ci0KLVBjaVN0cnVjdFB0cgotZmluZFBjaUJ5SURzKGludCBidXMsIGludCBkZXYsIGludCBmdW5jKQotewotICBQY2lTdHJ1Y3RQdHIgcGNpUCA9IFBjaUxpc3Q7Ci0KLSAgd2hpbGUgKHBjaVApIHsKLSAgICBpZiAocGNpUC0+YnVzID09IGJ1cyAmJiBwY2lQLT5kZXYgPT0gZGV2ICYmIHBjaVAtPmZ1bmMgPT0gZnVuYykKLSAgICAgIHJldHVybiBwY2lQOwotICAgIHBjaVAgPSBwY2lQLT5uZXh0OwotICB9Ci0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9wY2kuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvcGNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YWQ1MjIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9wY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDE5OTkgRWdiZXJ0IEVpY2gKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkIGluCi0gKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKLSAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMKLSAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCi0gKiAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotICogRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAotICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgotICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotI2luY2x1ZGUgInY4NmJpb3MuaCIKLQotI2lmbmRlZiBWODZfUENJX0gKLSNkZWZpbmUgVjg2X1BDSV9ICi0KLXR5cGVkZWYgdW5pb24gewotICAgIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50ICAgIHplcm86MjsKLQl1bnNpZ25lZCBpbnQgICAgcmVnOjY7Ci0JdW5zaWduZWQgaW50ICAgIGZ1bmM6MzsKLQl1bnNpZ25lZCBpbnQgICAgZGV2OjU7Ci0JdW5zaWduZWQgaW50ICAgIGJ1czo4OwotCXVuc2lnbmVkIGludCAgICByZXNlcnZlZDo3OwotCXVuc2lnbmVkIGludCAgICBlbmFibGU6MTsKLSAgICB9IHBjaTsKLSAgICBDQVJEMzIgbDsKLX0gUGNpU2xvdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcGNpQnVzUmVjIHsKLSAgICBDQVJEOCBwcmltYXJ5OwotICAgIENBUkQ4IHNlY29uZGFyeTsKLSAgICBDQVJEMzIgYmN0bDsKLSAgICBQY2lTbG90IFNsb3Q7Ci0gICAgc3RydWN0IHBjaUJ1c1JlYyAqbmV4dDsKLSAgICBzdHJ1Y3QgcGNpQnVzUmVjICpwQnVzOwotfSBQY2lCdXNSZWMsICpQY2lCdXNQdHI7Ci0KLXR5cGVkZWYgc3RydWN0IHBjaVN0cnVjdFJlYyB7Ci0gICAgQ0FSRDE2IFZlbmRvcklEOwotICAgIENBUkQxNiBEZXZpY2VJRDsKLSAgICBDQVJEOCBJbnRlcmZhY2U7Ci0gICAgQ0FSRDggQmFzZUNsYXNzOwotICAgIENBUkQ4IFN1YkNsYXNzOwotICAgIENBUkQzMiBSb21CYXNlOwotICAgIENBUkQzMiBidXM7Ci0gICAgQ0FSRDggZGV2OwotICAgIENBUkQ4IGZ1bmM7Ci0gICAgQ0FSRDMyIGNtZF9zdDsKLSAgICBpbnQgYWN0aXZlOwotICAgIFBjaVNsb3QgU2xvdDsKLSAgICBzdHJ1Y3QgcGNpU3RydWN0UmVjICpuZXh0OwotICAgIFBjaUJ1c1B0ciBwQnVzOwotfSBQY2lTdHJ1Y3RSZWMgLCAqUGNpU3RydWN0UHRyOwotCi0KLWV4dGVybiBQY2lTdHJ1Y3RQdHIgQ3VycmVudFBjaTsKLWV4dGVybiBQY2lTdHJ1Y3RQdHIgUGNpTGlzdDsKLWV4dGVybiBQY2lTdHJ1Y3RQdHIgQm9vdEJpb3M7Ci1leHRlcm4gaW50IHBjaU1heEJ1czsKLQotZXh0ZXJuIENBUkQzMiBmaW5kUGNpKENBUkQxNiBzbG90QlgpOwotZXh0ZXJuIENBUkQxNiBwY2lTbG90QlgoUGNpU3RydWN0UHRyKTsKLVBjaVN0cnVjdFB0ciBmaW5kUGNpRGV2aWNlKENBUkQxNiB2ZW5kb3JJRCwgQ0FSRDE2IGRldmljZUlELCBjaGFyIG4pOwotUGNpU3RydWN0UHRyIGZpbmRQY2lDbGFzcyhDQVJEOCBpbnRmLCBDQVJEOCBzdWJDbGFzcywgQ0FSRDE2IGNsYXNzLCBjaGFyIG4pOwotCi1leHRlcm4gQ0FSRDggUGNpUmVhZDgoaW50IG9mZnNldCwgQ0FSRDMyIHNsb3QpOwotZXh0ZXJuIENBUkQxNiBQY2lSZWFkMTYoaW50IG9mZnNldCwgQ0FSRDMyIHNsb3QpOwotZXh0ZXJuIENBUkQzMiBQY2lSZWFkMzIoaW50IG9mZnNldCwgQ0FSRDMyIHNsb3QpOwotCi1leHRlcm4gdm9pZCBQY2lXcml0ZTgoaW50IG9mZnNldCxDQVJEOCBieXRlLCBDQVJEMzIgc2xvdCk7Ci1leHRlcm4gdm9pZCBQY2lXcml0ZTE2KGludCBvZmZzZXQsQ0FSRDE2IHdvcmQsIENBUkQzMiBzbG90KTsKLWV4dGVybiB2b2lkIFBjaVdyaXRlMzIoaW50IG9mZnNldCxDQVJEMzIgbGcsIENBUkQzMiBzbG90KTsKLQotZXh0ZXJuIHZvaWQgc2Nhbl9wY2kodm9pZCk7Ci1leHRlcm4gdm9pZCBwY2lWaWRlb0Rpc2FibGUodm9pZCk7Ci1leHRlcm4gdm9pZCBwY2lWaWRlb1Jlc3RvcmUodm9pZCk7Ci1leHRlcm4gdm9pZCBFbmFibGVDdXJyZW50KHZvaWQpOwotZXh0ZXJuIGludCBtYXBQY2lSb20oUGNpU3RydWN0UHRyIHBjaVApOwotZXh0ZXJuIGludCBjZmcxb3V0KENBUkQxNiBhZGRyLCBDQVJEMzIgdmFsKTsKLWV4dGVybiBpbnQgY2ZnMWluKENBUkQxNiBhZGRyLCBDQVJEMzIgKnZhbCk7Ci1leHRlcm4gdm9pZCBsaXN0X3BjaSh2b2lkKTsKLWV4dGVybiBQY2lTdHJ1Y3RQdHIgZmluZFBjaUJ5SURzKGludCBidXMsIGludCBkZXYsIGludCBmdW5jKTsKLQotI2RlZmluZSBQQ0lfTU9ERTJfRU5BQkxFX1JFRyAgMHhDRjgKLSNkZWZpbmUgUENJX01PREUyX0ZPUldBUkRfUkVHICAweENGQQotI2RlZmluZSBQQ0lfTU9ERTFfQUREUkVTU19SRUcgIDB4Q0Y4Ci0jZGVmaW5lIFBDSV9NT0RFMV9EQVRBX1JFRyAgMHhDRkMKLSNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3NwYXJjX18pCi0jZGVmaW5lIFBDSV9FTiAweDAwMDAwMDAwCi0jZWxzZQotI2RlZmluZSBQQ0lfRU4gMHg4MDAwMDAwMAotI2VuZGlmCi0jZGVmaW5lIE1BWF9ERVZfUEVSX1ZFTkRPUl9DRkcxICAzMgotI2RlZmluZSBCUklER0VfQ0xBU1MoeCkgKHggPT0gMHgwNikKLSNkZWZpbmUgQlJJREdFX1BDSV9DTEFTUyh4KSAoeCA9PSAweDA0KQotI2RlZmluZSBCUklER0VfSE9TVF9DTEFTUyh4KSAoeCA9PSAweDAwKQotI2RlZmluZSBQQ0lfQ0xBU1NfUFJFSElTVE9SSUMgMHgwMAotI2RlZmluZSBQQ0lfU1VCQ0xBU1NfUFJFSElTVE9SSUNfVkdBIDB4MDEKLSNkZWZpbmUgUENJX0NMQVNTX0RJU1BMQVkgMHgwMwotI2RlZmluZSBQQ0lfU1VCQ0xBU1NfRElTUExBWV9WR0EgMHgwMAotI2RlZmluZSBQQ0lfU1VCQ0xBU1NfRElTUExBWV9YR0EgMHgwMQotI2RlZmluZSBQQ0lfU1VCQ0xBU1NfRElTUExBWV9NSVNDIDB4ODAKLSNkZWZpbmUgVklERU9fQ0xBU1MoYixzKSBcCi0gICAgKCgoYikgPT0gUENJX0NMQVNTX1BSRUhJU1RPUklDICYmIChzKSA9PSBQQ0lfU1VCQ0xBU1NfUFJFSElTVE9SSUNfVkdBKSB8fCBcCi0gICAgICgoYikgPT0gUENJX0NMQVNTX0RJU1BMQVkgJiYgKHMpID09IFBDSV9TVUJDTEFTU19ESVNQTEFZX1ZHQSkgfHxcCi0gICAgICgoYikgPT0gUENJX0NMQVNTX0RJU1BMQVkgJiYgKHMpID09IFBDSV9TVUJDTEFTU19ESVNQTEFZX1hHQSkgfHxcCi0gICAgICgoYikgPT0gUENJX0NMQVNTX0RJU1BMQVkgJiYgKHMpID09IFBDSV9TVUJDTEFTU19ESVNQTEFZX01JU0MpKQotI2RlZmluZSBQQ0lfTVVMVElGVU5DX0RFViAgMHg4MAotI2RlZmluZSBNQVhfUENJX0RFVklDRVMgICA2NAotI2RlZmluZSBQQ0lfTUFYQlVTIDE2Ci0jZGVmaW5lIFBDSV9JU19NRU0gMHgwMDAwMDAwMQotI2RlZmluZSBNQVhfUENJX1JPTV9TSVpFICgxMDI0ICogMTAyNCAqIDE2KQotCi0jZGVmaW5lIElTX01FTTMyKHgpICgoeCAmIDB4NykgPT0gMCAmJiB4ICE9IDApCi0jZGVmaW5lIElTX01FTTY0KHgpICgoeCAmIDB4NykgPT0gMHg0KQotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3Y4Ni5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy92ODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRlZWQwNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3Y4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5OSBFZ2JlcnQgRWljaAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQgaW4KLSAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAotICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucwotICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKLSAqICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKgotICogVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0gKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCi0gKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCi0gKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0gKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgPHN5cy92bTg2Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLSNpbmNsdWRlICJ2ODZiaW9zLmgiCi0jaW5jbHVkZSAiQXNtTWFjcm9zLmgiCi0KLXN0cnVjdCB2bTg2X3N0cnVjdCB2bTg2czsKLQotc3RhdGljIGludCB2bTg2X0dQX2ZhdWx0KHZvaWQpOwotc3RhdGljIGludCB2bTg2X2RvX2ludChpbnQgbnVtKTsKLXN0YXRpYyB2b2lkIGR1bXBfY29kZSh2b2lkKTsKLXN0YXRpYyB2b2lkIGR1bXBfcmVnaXN0ZXJzKHZvaWQpOwotc3RhdGljIHZvaWQgc3RhY2tfdHJhY2Uodm9pZCk7Ci1zdGF0aWMgaW50IHZtODZfcmVwKHN0cnVjdCB2bTg2X3N0cnVjdCAqcHRyKTsKLQotI2RlZmluZSBDUFVfUkVHKHgpICh2bTg2cy5yZWdzLiMjeCkKLSNkZWZpbmUgQ1BVX1JFR19MVyhyZWcpICAgICAgKCooKENBUkQxNiAqKSZDUFVfUkVHKHJlZykpKQotI2RlZmluZSBDUFVfUkVHX0hXKHJlZykgICAgICAoKigoQ0FSRDE2ICopJkNQVV9SRUcocmVnKSArIDEpKQotI2RlZmluZSBDUFVfUkVHX0xCKHJlZykgICAgICAoKihDQVJEOCAqKSZDUFVfUkVHKGUjI3JlZykpCi0jZGVmaW5lIFNFR19BRFIodHlwZSwgc2VnLCByZWcpICB0eXBlKChDUFVfUkVHX0xXKHNlZykgPDwgNCkgXAotCQkJCSAgICAgICsgQ1BVX1JFR19MVyhlIyNyZWcpKQotI2RlZmluZSBERiAoMSA8PCAxMCkKLQotc3RydWN0IHBpbyBQOwotCi0KLXZvaWQKLXNldHVwX2lvKHZvaWQpCi17Ci0gICAgaWYgKCFDb25maWcuUHJpbnRQb3J0ICYmICFDb25maWcuSW9TdGF0aXN0aWNzKSB7Ci0gICAgUC5pbmIgPSAoQ0FSRDgoKikoQ0FSRDE2KSlpbmI7Ci0gICAgUC5pbncgPSAoQ0FSRDE2KCopKENBUkQxNikpaW53OwotICAgIFAuaW5sID0gKENBUkQzMigqKShDQVJEMTYpKWlubDsKLSAgICBQLm91dGIgPSAodm9pZCgqKShDQVJEMTYsQ0FSRDgpKW91dGI7Ci0gICAgUC5vdXR3ID0gKHZvaWQoKikoQ0FSRDE2LENBUkQxNikpb3V0dzsKLSAgICBQLm91dGwgPSAodm9pZCgqKShDQVJEMTYsQ0FSRDMyKSlvdXRsOwotICAgIH0gZWxzZSB7Ci0gICAgUC5pbmIgPSBwX2luYjsKLSAgICBQLmludyA9IHBfaW53OwotICAgIFAuaW5sID0gcF9pbmw7Ci0gICAgUC5vdXRiID0gcF9vdXRiOwotICAgIFAub3V0dyA9IHBfb3V0dzsKLSAgICBQLm91dGwgPSBwX291dGw7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1zZXR1cF92bTg2KHVuc2lnbmVkIGxvbmcgYmlvc19zdGFydCwgaTg2Ymlvc1JlZ3NQdHIgcmVncykKLXsKLSAgICBDQVJEMzIgZWlwOwotICAgIENBUkQxNiBjczsKLQotICAgIHZtODZzLmZsYWdzID0gVk04Nl9TQ1JFRU5fQklUTUFQOwotICAgIHZtODZzLmZsYWdzID0gMDsKLSAgICB2bTg2cy5zY3JlZW5fYml0bWFwID0gMDsKLSAgICB2bTg2cy5jcHVfdHlwZSA9IENQVV81ODY7Ci0gICAgbWVtc2V0KCZ2bTg2cy5pbnRfcmV2ZWN0b3JlZCwgMHhmZixzaXplb2Yodm04NnMuaW50X3JldmVjdG9yZWQpKSA7Ci0gICAgbWVtc2V0KCZ2bTg2cy5pbnQyMV9yZXZlY3RvcmVkLCAweGZmLHNpemVvZih2bTg2cy5pbnQyMV9yZXZlY3RvcmVkKSkgOwotCi0gICAgZWlwID0gYmlvc19zdGFydCAmIDB4RkZGRjsKLSAgICBjcyA9IChiaW9zX3N0YXJ0ICYgMHhGRjAwMDApID4+IDQ7Ci0KLSAgICBDUFVfUkVHKGVheCkgPSByZWdzLT5heDsKLSAgICBDUFVfUkVHKGVieCkgPSByZWdzLT5ieDsKLSAgICBDUFVfUkVHKGVjeCkgPSByZWdzLT5jeDsKLSAgICBDUFVfUkVHKGVkeCkgPSByZWdzLT5keDsKLSAgICBDUFVfUkVHKGVzaSkgPSAwOwotICAgIENQVV9SRUcoZWRpKSA9IHJlZ3MtPmRpOwotICAgIENQVV9SRUcoZWJwKSA9IDA7Ci0gICAgQ1BVX1JFRyhlaXApID0gZWlwOwotICAgIENQVV9SRUcoY3MpID0gY3M7Ci0gICAgQ1BVX1JFRyhlc3ApID0gMHgxMDA7Ci0gICAgQ1BVX1JFRyhzcykgPSAweDMwOyAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHBjIGJpb3Mgc3RhY2sgKi8KLSAgICBDUFVfUkVHKGVzKSA9IHJlZ3MtPmVzOwotICAgIENQVV9SRUcoZHMpID0gMHg0MDsgICAgICAgICAgICAgICAvKiBzdGFuZGFyZCBwYyBkcyAqLwotICAgIENQVV9SRUcoZnMpID0gMDsKLSAgICBDUFVfUkVHKGdzKSA9IDA7Ci0gICAgQ1BVX1JFRyhlZmxhZ3MpIHw9IChWSUZfTUFTSyB8IFZJUF9NQVNLKTsKLX0KLQotdm9pZAotY29sbGVjdF9iaW9zX3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncykKLXsKLSAgICByZWdzLT5heCA9IENQVV9SRUcoZWF4KTsKLSAgICByZWdzLT5ieCA9IENQVV9SRUcoZWJ4KTsKLSAgICByZWdzLT5jeCA9IENQVV9SRUcoZWN4KTsKLSAgICByZWdzLT5keCA9IENQVV9SRUcoZWR4KTsKLSAgICByZWdzLT5lcyA9IENQVV9SRUcoZXMpOwotICAgIHJlZ3MtPmRzID0gQ1BVX1JFRyhkcyk7Ci0gICAgcmVncy0+ZGkgPSBDUFVfUkVHKGVkaSk7Ci0gICAgcmVncy0+c2kgPSBDUFVfUkVHKGVzaSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWRvX3ZtODYodm9pZCkKLXsKLSAgICBpbnQgcmV0dmFsOwotCi0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIGR1bXBfcmVnaXN0ZXJzKCk7Ci0jZW5kaWYKLS8qICAgIHJldHZhbCA9IFNZU192bTg2b2xkKCZ2bTg2cyk7ICovCi0vKiAgICByZXR2YWwgPSBzeXNjYWxsKFNZU192bTg2b2xkLCZ2bTg2cyk7ICovCi0KLSAgICByZXR2YWwgPSB2bTg2X3JlcCgmdm04NnMpOwotCi0gICAgc3dpdGNoIChWTTg2X1RZUEUocmV0dmFsKSkgewotICAgIGNhc2UgVk04Nl9VTktOT1dOOgotCWlmICghdm04Nl9HUF9mYXVsdCgpKSByZXR1cm4gMDsKLQlicmVhazsKLSAgICBjYXNlIFZNODZfU1RJOgotCWZwcmludGYoc3RkZXJyLCJ2bTg2X3N0aSA6LSgoXG4iKTsKLQlzdGFja190cmFjZSgpOwotCWR1bXBfY29kZSgpOwotCXJldHVybiAwOwotICAgIGNhc2UgVk04Nl9JTlR4OgotCWlmICghdm04Nl9kb19pbnQoVk04Nl9BUkcocmV0dmFsKSkpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIlxuVW5rbm93biB2bTg2X2ludDogJVhcblxuIixWTTg2X0FSRyhyZXR2YWwpKTsKLQkgICAgZHVtcF9yZWdpc3RlcnMoKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCS8qIEknbSBub3Qgc3VyZSB5ZXQgd2hhdCB0byBkbyBpZiB3ZSBjYW4gaGFuZGxlIGludHMgKi8KLQlicmVhazsKLSAgICBjYXNlIFZNODZfU0lHTkFMOgotCWZwcmludGYoc3RkZXJyLCJyZWNlaXZlZCBzaWduYWxcbiIpOwotCXJldHVybiAwOwotICAgIGRlZmF1bHQ6Ci0JZnByaW50ZihzdGRlcnIsInVua25vd24gdHlwZSgweCV4KT0weCV4XG4iLAotCQlWTTg2X0FSRyhyZXR2YWwpLFZNODZfVFlQRShyZXR2YWwpKTsKLQlkdW1wX3JlZ2lzdGVycygpOwotCWR1bXBfY29kZSgpOwotCXN0YWNrX3RyYWNlKCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBqbXBfYnVmIHg4Nl9lc2M7Ci1zdGF0aWMgdm9pZAotdm1leGl0KGludCB1bnVzZWQpCi17Ci0gICAgbG9uZ2ptcCh4ODZfZXNjLDEpOwotfQotCi12b2lkCi1kb194ODYodW5zaWduZWQgbG9uZyBiaW9zX3N0YXJ0LCBpODZiaW9zUmVnc1B0ciByZWdzKQotewotICAgIHN0YXRpYyB2b2lkICgqb3JnX2hhbmRsZXIpKGludCk7Ci0KLSAgICBzZXR1cF92bTg2KGJpb3Nfc3RhcnQsIHJlZ3MpOwotICAgIGlmIChzZXRqbXAoeDg2X2VzYykgPT0gMCkgewotCW9yZ19oYW5kbGVyID0gc2lnbmFsKDIsdm1leGl0KTsKLQl3aGlsZShkb192bTg2KCkpIHt9OwotCXNpZ25hbCgyLG9yZ19oYW5kbGVyKTsKLQljb2xsZWN0X2Jpb3NfcmVncyhyZWdzKTsKLSAgICB9IGVsc2UgewotCXNpZ25hbCgyLG9yZ19oYW5kbGVyKTsKLQlwcmludGYoImludGVycnVwdGVkIGF0IDB4JXhcbiIsKChDQVJEMTYpQ1BVX1JFRyhjcykpIDw8IDQKLQkgICB8IChDQVJEMTYpQ1BVX1JFRyhlaXApKTsKLSAgICB9Ci19Ci0KLS8qIGdldCB0aGUgbGluZWFyIGFkZHJlc3MgKi8KLSNkZWZpbmUgTElOX1BSRUZfU0kgICgocHJlZl9zZWcgPDwgNCkgKyBDUFVfUkVHX0xXKGVzaSkpCi0KLSNkZWZpbmUgTFdFQ1ggICAgICAgKHByZWZpeDY2IF4gcHJlZml4NjcgPyBDUFVfUkVHKGVjeCkgOiBDUFVfUkVHX0xXKGVjeCkpCi0KLXN0YXRpYyBpbnQKLXZtODZfR1BfZmF1bHQodm9pZCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyICpjc3AsICpsaW5hOwotICAgIENBUkQzMiBvcmdfZWlwOwotICAgIGludCBwcmVmX3NlZzsKLSAgICBpbnQgZG9uZSxpc19yZXAscHJlZml4NjYscHJlZml4Njc7Ci0KLQotICAgIGNzcCA9IGxpbmEgPSBTRUdfQURSKCh1bnNpZ25lZCBjaGFyICopLCBjcywgaXApOwotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBwcmludGYoImV4Y2VwdGlvbjogXG4iKTsKLSAgICBkdW1wX2NvZGUoKTsKLSNlbmRpZgotCi0gICAgaXNfcmVwID0gMDsKLSAgICBwcmVmaXg2NiA9IHByZWZpeDY3ID0gMDsKLSAgICBwcmVmX3NlZyA9IC0xOwotCi0gICAgLyogZWF0IHVwIHByZWZpeGVzICovCi0gICAgZG9uZSA9IDA7Ci0gICAgZG8gewotCXN3aXRjaCAoKihjc3ArKykpIHsKLQljYXNlIDB4NjY6ICAgICAgLyogb3BlcmFuZCBwcmVmaXggKi8gIHByZWZpeDY2PTE7IGJyZWFrOwotCWNhc2UgMHg2NzogICAgICAvKiBhZGRyZXNzIHByZWZpeCAqLyAgcHJlZml4Njc9MTsgYnJlYWs7Ci0JY2FzZSAweDJlOiAgICAgIC8qIENTICovICAgICAgICAgICAgICBwcmVmX3NlZz1DUFVfUkVHKGNzKTsgYnJlYWs7Ci0JY2FzZSAweDNlOiAgICAgIC8qIERTICovICAgICAgICAgICAgICBwcmVmX3NlZz1DUFVfUkVHKGRzKTsgYnJlYWs7Ci0JY2FzZSAweDI2OiAgICAgIC8qIEVTICovICAgICAgICAgICAgICBwcmVmX3NlZz1DUFVfUkVHKGVzKTsgYnJlYWs7Ci0JY2FzZSAweDM2OiAgICAgIC8qIFNTICovICAgICAgICAgICAgICBwcmVmX3NlZz1DUFVfUkVHKHNzKTsgYnJlYWs7Ci0JY2FzZSAweDY1OiAgICAgIC8qIEdTICovICAgICAgICAgICAgICBwcmVmX3NlZz1DUFVfUkVHKGdzKTsgYnJlYWs7Ci0JY2FzZSAweDY0OiAgICAgIC8qIEZTICovICAgICAgICAgICAgICBwcmVmX3NlZz1DUFVfUkVHKGZzKTsgYnJlYWs7Ci0JY2FzZSAweGYyOiAgICAgIC8qIHJlcG56ICovCi0JY2FzZSAweGYzOiAgICAgIC8qIHJlcCAqLyAgICAgICAgICAgICBpc19yZXA9MTsgYnJlYWs7Ci0JZGVmYXVsdDogZG9uZT0xOwotCX0KLSAgICB9IHdoaWxlICghZG9uZSk7Ci0gICAgY3NwLS07ICAgLyogb29wcyBvbmUgdG9vIG1hbnkgKi8KLSAgICBvcmdfZWlwID0gQ1BVX1JFRyhlaXApOwotICAgIENQVV9SRUdfTFcoZWlwKSArPSAoY3NwIC0gbGluYSk7Ci0KLSAgICBzd2l0Y2ggKCpjc3ApIHsKLQotICAgIGNhc2UgMHg2YzogICAgICAgICAgICAgICAgICAgIC8qIGluc2IgKi8KLQkvKiBOT1RFOiBFUyBjYW4ndCBiZSBvdmVyd3JpdHRlbjsgcHJlZml4ZXMgNjYsNjcgc2hvdWxkIHVzZSBlc2ksZWRpLGVjeAotCSAqIGJ1dCBpcyBhbnlvbmUgdXNpbmcgZXh0ZW5kZWQgcmVncyBpbiByZWFsIG1vZGU/ICovCi0JLyogV0FSTklORzogbm8gdGVzdCBmb3IgREkgd3JhcHBpbmchICovCi0JQ1BVX1JFR19MVyhlZGkpICs9IHBvcnRfcmVwX2luYihDUFVfUkVHX0xXKGVkeCksCi0JCQkJCVNFR19BRFIoKENBUkQ4ICopLGVzLGRpKSwKLQkJCQkJQ1BVX1JFR19MVyhlZmxhZ3MpJkRGLAotCQkJCQkoaXNfcmVwPyBMV0VDWDoxKSk7Ci0JaWYgKGlzX3JlcCkgTFdFQ1ggPSAwOwotCUNQVV9SRUdfTFcoZWlwKSsrOwotCWJyZWFrOwotCi0gICAgY2FzZSAweDZkOiAgICAgICAgICAgICAgICAgIC8qIChyZXApIGluc3cgLyBpbnNkICovCi0JLyogTk9URTogRVMgY2FuJ3QgYmUgb3ZlcndyaXR0ZW4gKi8KLQkvKiBXQVJOSU5HOiBubyB0ZXN0IGZvciBfREkgd3JhcHBpbmchICovCi0JaWYgKHByZWZpeDY2KSB7Ci0JICAgIENQVV9SRUdfTFcoZWRpKSArPSBwb3J0X3JlcF9pbmwoQ1BVX1JFR19MVyhlZHgpLAotCQkJCQkgICAgU0VHX0FEUigoQ0FSRDMyICopLGVzLGRpKSwKLQkJCQkJICAgIENQVV9SRUdfTFcoZWZsYWdzKSZERiwKLQkJCQkJICAgIChpc19yZXA/IExXRUNYOjEpKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIENQVV9SRUdfTFcoZWRpKSArPSBwb3J0X3JlcF9pbncoQ1BVX1JFR19MVyhlZHgpLAotCQkJCQkgICAgU0VHX0FEUigoQ0FSRDE2ICopLGVzLGRpKSwKLQkJCQkJICAgIENQVV9SRUdfTFcoZWZsYWdzKSZERiwKLQkJCQkJICAgIChpc19yZXA/IExXRUNYOjEpKTsKLQl9Ci0JaWYgKGlzX3JlcCkgTFdFQ1ggPSAwOwotCUNQVV9SRUdfTFcoZWlwKSsrOwotCWJyZWFrOwotCi0gICAgY2FzZSAweDZlOiAgICAgICAgICAgICAgICAgIC8qIChyZXApIG91dHNiICovCi0JaWYgKHByZWZfc2VnIDwgMCkgcHJlZl9zZWcgPSBDUFVfUkVHX0xXKGRzKTsKLQkvKiBXQVJOSU5HOiBubyB0ZXN0IGZvciBfU0kgd3JhcHBpbmchICovCi0JQ1BVX1JFR19MVyhlc2kpICs9IHBvcnRfcmVwX291dGIoQ1BVX1JFR19MVyhlZHgpLChDQVJEOCopTElOX1BSRUZfU0ksCi0JCQkJCSBDUFVfUkVHX0xXKGVmbGFncykmREYsCi0JCQkJCSAoaXNfcmVwPyBMV0VDWDoxKSk7Ci0JaWYgKGlzX3JlcCkgTFdFQ1ggPSAwOwotCUNQVV9SRUdfTFcoZWlwKSsrOwotCWJyZWFrOwotCi0gICAgY2FzZSAweDZmOiAgICAgICAgICAgICAgICAgIC8qIChyZXApIG91dHN3IC8gb3V0c2QgKi8KLQlpZiAocHJlZl9zZWcgPCAwKSBwcmVmX3NlZyA9IENQVV9SRUdfTFcoZHMpOwotCS8qIFdBUk5JTkc6IG5vIHRlc3QgZm9yIF9TSSB3cmFwcGluZyEgKi8KLQlpZiAocHJlZml4NjYpIHsKLQkgICAgQ1BVX1JFR19MVyhlc2kpICs9IHBvcnRfcmVwX291dGwoQ1BVX1JFR19MVyhlZHgpLAotCQkJCQkgICAgIChDQVJEMzIgKilMSU5fUFJFRl9TSSwKLQkJCQkJICAgICBDUFVfUkVHX0xXKGVmbGFncykmREYsCi0JCQkJCSAgICAgKGlzX3JlcD8gTFdFQ1g6MSkpOwotCX0KLQllbHNlIHsKLQkgICAgQ1BVX1JFR19MVyhlc2kpICs9IHBvcnRfcmVwX291dHcoQ1BVX1JFR19MVyhlZHgpLAotCQkJCQkgICAgIChDQVJEMTYgKilMSU5fUFJFRl9TSSwKLQkJCQkJICAgICBDUFVfUkVHX0xXKGVmbGFncykmREYsCi0JCQkJCSAgICAgKGlzX3JlcD8gTFdFQ1g6MSkpOwotCX0KLQlpZiAoaXNfcmVwKSBMV0VDWCA9IDA7Ci0JQ1BVX1JFR19MVyhlaXApKys7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIDB4ZTU6ICAgICAgICAgICAgICAgICAgLyogaW53IHh4LCBpbmwgeHggKi8KLQlpZiAocHJlZml4NjYpIENQVV9SRUcoZWF4KSA9IFAuaW5sKChpbnQpIGNzcFsxXSk7Ci0JZWxzZSBDUFVfUkVHX0xXKGVheCkgPSBQLmludygoaW50KSBjc3BbMV0pOwotCUNQVV9SRUdfTFcoZWlwKSArPSAyOwotCWJyZWFrOwotICAgIGNhc2UgMHhlNDogICAgICAgICAgICAgICAgICAvKiBpbmIgeHggKi8KLQlDUFVfUkVHX0xXKGVheCkgJj0gfihDQVJEMzIpMHhmZjsKLQlDUFVfUkVHX0xCKGF4KSB8PSBQLmluYigoaW50KSBjc3BbMV0pOwotCUNQVV9SRUdfTFcoZWlwKSArPSAyOwotCWJyZWFrOwotICAgIGNhc2UgMHhlZDogICAgICAgICAgICAgICAgICAvKiBpbncgZHgsIGlubCBkeCAqLwotCWlmIChwcmVmaXg2NikgQ1BVX1JFRyhlYXgpID0gUC5pbmwoQ1BVX1JFR19MVyhlZHgpKTsKLQllbHNlIENQVV9SRUdfTFcoZWF4KSA9IFAuaW53KENQVV9SRUdfTFcoZWR4KSk7Ci0JQ1BVX1JFR19MVyhlaXApICs9IDE7Ci0JYnJlYWs7Ci0gICAgY2FzZSAweGVjOiAgICAgICAgICAgICAgICAgIC8qIGluYiBkeCAqLwotCUNQVV9SRUdfTFcoZWF4KSAmPSB+KENBUkQzMikweGZmOwotCUNQVV9SRUdfTEIoYXgpIHw9IFAuaW5iKENQVV9SRUdfTFcoZWR4KSk7Ci0JQ1BVX1JFR19MVyhlaXApICs9IDE7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIDB4ZTc6ICAgICAgICAgICAgICAgICAgLyogb3V0dyB4eCAqLwotCWlmIChwcmVmaXg2NikgUC5vdXRsKChpbnQpY3NwWzFdLCBDUFVfUkVHKGVheCkpOwotCWVsc2UgUC5vdXR3KChpbnQpY3NwWzFdLCBDUFVfUkVHX0xXKGVheCkpOwotCUNQVV9SRUdfTFcoZWlwKSArPSAyOwotCWJyZWFrOwotICAgIGNhc2UgMHhlNjogICAgICAgICAgICAgICAgICAvKiBvdXRiIHh4ICovCi0JUC5vdXRiKChpbnQpIGNzcFsxXSwgQ1BVX1JFR19MQihheCkpOwotCUNQVV9SRUdfTFcoZWlwKSArPSAyOwotCWJyZWFrOwotICAgIGNhc2UgMHhlZjogICAgICAgICAgICAgICAgICAvKiBvdXR3IGR4ICovCi0JaWYgKHByZWZpeDY2KSBQLm91dGwoQ1BVX1JFR19MVyhlZHgpLCBDUFVfUkVHKGVheCkpOwotCWVsc2UgUC5vdXR3KENQVV9SRUdfTFcoZWR4KSwgQ1BVX1JFR19MVyhlYXgpKTsKLQlDUFVfUkVHX0xXKGVpcCkgKz0gMTsKLQlicmVhazsKLSAgICBjYXNlIDB4ZWU6ICAgICAgICAgICAgICAgICAgLyogb3V0YiBkeCAqLwotCVAub3V0YihDUFVfUkVHX0xXKGVkeCksIENQVV9SRUdfTEIoYXgpKTsKLQlDUFVfUkVHX0xXKGVpcCkgKz0gMTsKLQlicmVhazsKLQotICAgIGNhc2UgMHhmNDoKLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0JcHJpbnRmKCJobHQgYXQgJXBcbiIsIGxpbmEpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci0KLSAgICBjYXNlIDB4MGY6Ci0JZnByaW50ZihzdGRlcnIsIkNQVSAweDBmIFRyYXAgYXQgZWlwPTB4JWx4XG4iLENQVV9SRUcoZWlwKSk7Ci0JZ290byBvcDBmZXJyOwotCWJyZWFrOwotCi0gICAgY2FzZSAweGYwOiAgICAgICAgICAgICAgICAgIC8qIGxvY2sgKi8KLSAgICBkZWZhdWx0OgotCWZwcmludGYoc3RkZXJyLCJ1bmtub3duIHJlYXNvbiBmb3IgZXhjZXB0aW9uXG4iKTsKLQlkdW1wX3JlZ2lzdGVycygpOwotCXN0YWNrX3RyYWNlKCk7Ci0gICAgb3AwZmVycjoKLQlkdW1wX2NvZGUoKTsKLQlmcHJpbnRmKHN0ZGVyciwiY2Fubm90IGNvbnRpbnVlXG4iKTsKLQlyZXR1cm4gMDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIHN3aXRjaCgpICovCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXZtODZfZG9faW50KGludCBudW0pCi17Ci0gICAgaW50IHZhbDsKLSAgICBzdHJ1Y3QgcmVnczg2IHJlZ3M7Ci0KLSAgICBpX3ByaW50ZigiaW50IDB4JXggcmVjZWl2ZWQ6IGF4OjB4JWx4IixudW0sQ1BVX1JFRyhlYXgpKTsKLSAgICBpZiAoQ29uZmlnLlByaW50SXApCi0JaV9wcmludGYoIiBhdDogMHgleFxuIixnZXRJUCgpKTsKLSAgICBlbHNlCi0JaV9wcmludGYoIlxuIik7Ci0KLSAgICAvKiB0cnkgdG8gcnVuIGJpb3MgaW50ZXJydXB0ICovCi0KLSAgICAvKiBpZiBub3QgaW5zdGFsbGVkIGZhbGwgYmFjayAqLwotI2RlZmluZSBDT1BZKHgpIHJlZ3MuIyN4ID0gQ1BVX1JFRyh4KQotI2RlZmluZSBDT1BZX1IoeCkgQ1BVX1JFRyh4KSA9IHJlZ3MuIyN4Ci0KLSAgICBDT1BZKGVheCk7Ci0gICAgQ09QWShlYngpOwotICAgIENPUFkoZWN4KTsKLSAgICBDT1BZKGVkeCk7Ci0gICAgQ09QWShlc2kpOwotICAgIENPUFkoZWRpKTsKLSAgICBDT1BZKGVicCk7Ci0gICAgQ09QWShlaXApOwotICAgIENPUFkoZXNwKTsKLSAgICBDT1BZKGNzKTsKLSAgICBDT1BZKHNzKTsKLSAgICBDT1BZKGRzKTsKLSAgICBDT1BZKGVzKTsKLSAgICBDT1BZKGZzKTsKLSAgICBDT1BZKGdzKTsKLSAgICBDT1BZKGVmbGFncyk7Ci0KLSAgICBpZiAoISh2YWwgPSBpbnRfaGFuZGxlcihudW0sJnJlZ3MpKSkKLQlpZiAoISh2YWwgPSBydW5fYmlvc19pbnQobnVtLCZyZWdzKSkpCi0JICAgIHJldHVybiB2YWw7Ci0KLSAgICBDT1BZX1IoZWF4KTsKLSAgICBDT1BZX1IoZWJ4KTsKLSAgICBDT1BZX1IoZWN4KTsKLSAgICBDT1BZX1IoZWR4KTsKLSAgICBDT1BZX1IoZXNpKTsKLSAgICBDT1BZX1IoZWRpKTsKLSAgICBDT1BZX1IoZWJwKTsKLSAgICBDT1BZX1IoZWlwKTsKLSAgICBDT1BZX1IoZXNwKTsKLSAgICBDT1BZX1IoY3MpOwotICAgIENPUFlfUihzcyk7Ci0gICAgQ09QWV9SKGRzKTsKLSAgICBDT1BZX1IoZXMpOwotICAgIENPUFlfUihmcyk7Ci0gICAgQ09QWV9SKGdzKTsKLSAgICBDT1BZX1IoZWZsYWdzKTsKLQotICAgIHJldHVybiB2YWw7Ci0jdW5kZWYgQ09QWQotI3VuZGVmIENPUFlfUgotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jb2RlKHZvaWQpCi17Ci0gICAgaW50IGk7Ci0gICAgdW5zaWduZWQgY2hhciAqbGluYSA9IFNFR19BRFIoKHVuc2lnbmVkIGNoYXIgKiksIGNzLCBpcCk7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwiY29kZSBhdCAweCU4Ljh4OiAiLChDQVJEMzIpbGluYSk7Ci0gICAgZm9yIChpPTA7IGk8MHgxMDsgaSsrKQotCWZwcmludGYoc3RkZXJyLCIlMi4yeCAiLCoobGluYSArIGkpKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiXG4gICAgICAgICAgICAgICAgICAgICIpOwotICAgIGZvciAoOyBpPDB4MjA7IGkrKykKLQlmcHJpbnRmKHN0ZGVyciwiJTIuMnggIiwqKGxpbmEgKyBpKSk7Ci0gICAgZnByaW50ZihzdGRlcnIsIlxuIik7Ci19Ci0KLSNkZWZpbmUgUFJJTlQoeCkgZnByaW50ZihzdGRlcnIsI3giOiU0LjR4ICIsQ1BVX1JFR19MVyh4KSkKLSNkZWZpbmUgUFJJTlRfRkxBR1MoeCkgZnByaW50ZihzdGRlcnIsI3giOiU4Ljh4ICIsQ1BVX1JFR19MVyh4KSkKLXN0YXRpYyB2b2lkCi1kdW1wX3JlZ2lzdGVycyh2b2lkKQotewotICAgIFBSSU5UKGVpcCk7Ci0gICAgUFJJTlQoZWF4KTsKLSAgICBQUklOVChlYngpOwotICAgIFBSSU5UKGVjeCk7Ci0gICAgUFJJTlQoZWR4KTsKLSAgICBQUklOVChlc2kpOwotICAgIFBSSU5UKGVkaSk7Ci0gICAgUFJJTlQoZWJwKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKLSAgICBQUklOVChlc3ApOwotICAgIFBSSU5UKGNzKTsKLSAgICBQUklOVChzcyk7Ci0gICAgUFJJTlQoZXMpOwotICAgIFBSSU5UKGRzKTsKLSAgICBQUklOVChmcyk7Ci0gICAgUFJJTlQoZ3MpOwotICAgIFBSSU5UX0ZMQUdTKGVmbGFncyk7Ci0gICAgZnByaW50ZihzdGRlcnIsIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdGFja190cmFjZSh2b2lkKQotewotICAgIGludCBpOwotICAgIHVuc2lnbmVkIGNoYXIgKnN0YWNrID0gU0VHX0FEUigodW5zaWduZWQgY2hhciAqKSwgc3MsIHNwKTsKLQotICAgIGZwcmludGYoc3RkZXJyLCJzdGFjayBhdCAweCU4LjhseDpcbiIsKHVuc2lnbmVkIGxvbmcpc3RhY2spOwotICAgIGZvciAoaT0wOyBpIDwgMHgxMDsgaSsrKQotCWZwcmludGYoc3RkZXJyLCIlMi4yeCAiLCooc3RhY2sgKyBpKSk7Ci0gICAgZnByaW50ZihzdGRlcnIsIlxuIik7Ci0KLX0KLQotc3RhdGljIGludAotdm04Nl9yZXAoc3RydWN0IHZtODZfc3RydWN0ICpwdHIpCi17Ci0KLSAgICBpbnQgX19yZXM7Ci0KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW50ICQweDgwXG4iCi0JCQkgOiI9YSIgKF9fcmVzKToiYSIgKChpbnQpMTEzKSwKLQkJCSAiYiIgKChzdHJ1Y3Qgdm04Nl9zdHJ1Y3QgKilwdHIpKTsKLQotCSAgICBpZiAoKF9fcmVzKSA8IDApIHsKLQkJZXJybm8gPSAtX19yZXM7Ci0JCV9fcmVzPS0xOwotCSAgICB9Ci0JICAgIGVsc2UgZXJybm8gPSAwOwotCSAgICByZXR1cm4gX19yZXM7Ci19Ci0KLSNkZWZpbmUgcHVzaHcoYmFzZSwgcHRyLCB2YWwpIFwKLV9fYXNtX18gX192b2xhdGlsZV9fKCBcCi0JImRlY3cgJXcwXG5cdCIgXAotCSJtb3ZiICVoMiwoJTEsJTApXG5cdCIgXAotCSJkZWN3ICV3MFxuXHQiIFwKLQkibW92YiAlYjIsKCUxLCUwKSIgXAotCTogIj1yIiAocHRyKSBcCi0JOiAiciIgKGJhc2UpLCAicSIgKHZhbCksICIwIiAocHRyKSkKLQotaW50Ci1ydW5fYmlvc19pbnQoaW50IG51bSwgc3RydWN0IHJlZ3M4NiAqcmVncykKLXsKLSAgICBDQVJEMTYgKnNzcDsKLSAgICBDQVJEMzIgc3A7Ci0gICAgQ0FSRDMyIGVmbGFnczsKLQotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBzdGF0aWMgaW50IGZpcnN0dGltZSA9IDE7Ci0jZW5kaWYKLSAgICAvKiBjaGVjayBpZiBiaW9zIHZlY3RvciBpcyBpbml0aWFsaXplZCAqLwotICAgIGlmICgoKENBUkQxNiopMClbKG51bTw8MSkrMV0gPT0gMHgwMDAwKSB7IC8qIFNZU19CSU9TX1NFRyA/Ki8KLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0JaV9wcmludGYoImNhcmQgQklPUyBub3QgbG9hZGVkXG4iKTsKLSNlbmRpZgotCXJldHVybiAwOwotICAgIH0KLQotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBpZiAoZmlyc3R0aW1lKSB7Ci0JZHByaW50KDAsMHgzRDApOwotCWZpcnN0dGltZSA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpX3ByaW50ZigiY2FsbGluZyBjYXJkIEJJT1MgYXQ6ICIpOwotICAgIHNzcCA9IChDQVJEMTYqKShDUFVfUkVHKHNzKTw8NCk7Ci0gICAgc3AgPSAoQ0FSRDMyKSBDUFVfUkVHX0xXKGVzcCk7Ci0KLSAgICBlZmxhZ3MgPSByZWdzLT5lZmxhZ3M7Ci0gICAgZWZsYWdzID0gKChlZmxhZ3MgJiBWSUZfTUFTSykgIT0gMCkKLQk/IChlZmxhZ3MgfCBJRl9NQVNLKSA6IChlZmxhZ3MgJiB+KENBUkQzMikgSUZfTUFTSyk7Ci0gICAgcHVzaHcoc3NwLCBzcCwgZWZsYWdzKTsKLSAgICBwdXNodyhzc3AsIHNwLCByZWdzLT5jcyk7Ci0gICAgcHVzaHcoc3NwLCBzcCwgKENBUkQxNilyZWdzLT5laXApOwotICAgIHJlZ3MtPmVzcCAtPSA2OwotICAgIHJlZ3MtPmNzID0gKChDQVJEMTYgKikgMClbKG51bSA8PCAxKSArIDFdOwotICAgIHJlZ3MtPmVpcCA9IChyZWdzLT5laXAgJiAweEZGRkYwMDAwKSB8ICgoQ0FSRDE2ICopIDApW251bSA8PCAxXTsKLSAgICBpX3ByaW50ZigiMHgleDolbHhcbiIscmVncy0+Y3MscmVncy0+ZWlwKTsKLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgZHVtcF9jb2RlKCk7Ci0jZW5kaWYKLSAgICByZWdzLT5lZmxhZ3MgPSByZWdzLT5lZmxhZ3MKLQkJICAgICAgICYgfihWSUZfTUFTSyB8IFRGX01BU0sgfCBJRl9NQVNLIHwgTlRfTUFTSyk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLUNBUkQzMgotZ2V0SW50VmVjdChpbnQgbnVtKQotewotICAgIHJldHVybiAoKENBUkQzMiopMClbbnVtXTsKLX0KLQotQ0FSRDMyCi1nZXRJUCh2b2lkKQotewotICAgIHJldHVybiAoQ1BVX1JFRyhjcykgPDwgNCkgKyBDUFVfUkVHKGVpcCk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3Y4NmJpb3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvdjg2Ymlvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDFjMWYyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvdjg2Ymlvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5OSBFZ2JlcnQgRWljaAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQgaW4KLSAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAotICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucwotICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKLSAqICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKgotICogVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0gKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCi0gKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCi0gKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0gKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0jZGVmaW5lIERFTEVURQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8cmVhZGxpbmUvcmVhZGxpbmUuaD4KLSNpbmNsdWRlIDxyZWFkbGluZS9oaXN0b3J5Lmg+Ci0jaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQgKF9faWE2NF9fKQotI2luY2x1ZGUgPHN5cy9pby5oPgotI2VsaWYgZGVmaW5lZChIQVZFX1NZU19QRVJNKQotI2luY2x1ZGUgPHN5cy9wZXJtLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgInY4NmJpb3MuaCIKLSNpbmNsdWRlICJwY2kuaCIKLSNpbmNsdWRlICJBc21NYWNyb3MuaCIKLQotI2RlZmluZSBTSVpFIDB4MTAwMDAwCi0jZGVmaW5lIFZSQU1fU1RBUlQgMHhBMDAwMAotI2RlZmluZSBWUkFNX1NJWkUgMHgxRkZGRgotI2RlZmluZSBWX0JJT1NfU0laRSAweDFGRkZGCi0jZGVmaW5lIEJJT1NfU1RBUlQgMHg3QzAwICAgICAgICAgICAgLyogZGVmYXVsdCBCSU9TIGVudHJ5ICovCi0jZGVmaW5lIEJJT1NfTUVNIDB4NjAwCi0KLS8qQ0FSRDggY29kZVtdID0geyAweGI4ICwgMHhmMCAsIDB4ZjAsIDB4ZjQgfTsgKi8KLSNkZWZpbmUgVkJfWCh4KSAoVl9CSU9TID4+IHgpICYgMHhGRgotQ0FSRDggY29kZVtdID0geyA2LCAweDlhLCAweDAzLCAweDAwLCAweDAwLCBWQl9YKDEyKSwgMHhmNCB9OwotLypDQVJEOCBjb2RlW10gPSB7IDB4OWEsIDB4MDMsIDB4MDAsIDB4MDAsIFZCX1goMTIpLCAweGI4LCAweDAzLCAweDAwLCAqLwotLyoweGNkLCAweDEwLCAweGY0IH07ICovCi0vKkNBUkQ4IGNvZGVbXSA9IHsgIDB4YjggLCAweGYwICwgMHhmMCAsMHhmNCB9OyAqLwotCi1pbnQgaW9wZXJtX2xpc3RbSU9QRVJNX0JJVFNdID0gezAsfTsKLQotc3RhdGljIHZvaWQgc2lnX2hhbmRsZXIoaW50KTsKLXN0YXRpYyBpbnQgbWFwKHZvaWQpOwotc3RhdGljIHZvaWQgdW5tYXAodm9pZCk7Ci1zdGF0aWMgdm9pZCBib290QklPUyhDQVJEMTYgYXgpOwotc3RhdGljIGludCBtYXBfdnJhbSh2b2lkKTsKLXN0YXRpYyB2b2lkIHVubWFwX3ZyYW0odm9pZCk7Ci1zdGF0aWMgaW50IGNvcHlfdmJpb3MobWVtVHlwZSB2X2Jhc2UpOwotc3RhdGljIGludCBjb3B5X3N5c19iaW9zKHZvaWQpOwotc3RhdGljIHZvaWQgc2F2ZV9iaW9zX3RvX2ZpbGUodm9pZCk7Ci1zdGF0aWMgaW50IHNldHVwX3N5c3RlbV9iaW9zKHZvaWQpOwotc3RhdGljIENBUkQzMiBzZXR1cF9pbnRfdmVjdCh2b2lkKTsKLSNpZmRlZiBfX2lhMzJfXwotc3RhdGljIENBUkQzMiBzZXR1cF9wcmltYXJ5X2ludF92ZWN0KHZvaWQpOwotI2VuZGlmCi1zdGF0aWMgaW50IGNoa3N1bShDQVJEOCAqc3RhcnQpOwotc3RhdGljIHZvaWQgc2V0dXBfYmlvc19yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MsIENBUkQzMiBheCk7Ci1zdGF0aWMgdm9pZCBwcmludF9yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MpOwotc3RhdGljIHZvaWQgcHJpbnRfdXNhZ2Uodm9pZCk7Ci1zdGF0aWMgdm9pZCBzZXRfaGx0KEJvb2wgc2V0KTsKLXN0YXRpYyB2b2lkIHNldF9pb3Blcm0odm9pZCk7Ci0KLWV4dGVybiB2b2lkIHl5cGFyc2UoKTsKLQotdm9pZCBsb2FkQ29kZVRvTWVtKHVuc2lnbmVkIGNoYXIgKnB0ciwgQ0FSRDggKmNvZGUpOwotdm9pZCBkcHJpbnQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKLQotc3RhdGljIGludCB2cmFtX21hcHBlZCA9IDA7Ci1zdGF0aWMgY2hhciogYmlvc192YXIgPSBOVUxMOwotc3RhdGljIENBUkQ4IHNhdmVfbXNyOwotc3RhdGljIENBUkQ4IHNhdmVfcG9zMTAyOwotc3RhdGljIENBUkQ4IHNhdmVfdnNlOwotc3RhdGljIENBUkQ4IHNhdmVfNDZlODsKLXN0YXRpYyBoYWx0cG9pbnRzIGhsdHBbMjBdID0geyB7MCwgMH0sIH07Ci0KLWNvbnNvbGUgQ29uc29sZSA9IHstMSwtMX07Ci1zdHJ1Y3QgY29uZmlnIENvbmZpZzsKLQotaW50IG1haW4oaW50IGFyZ2MsY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IGM7Ci0KLSAgICBDb25maWcuUHJpbnRQb3J0ID0gUFJJTlRfUE9SVDsKLSAgICBDb25maWcuSW9TdGF0aXN0aWNzID0gSU9fU1RBVElTVElDUzsKLSAgICBDb25maWcuUHJpbnRJcnEgPSBQUklOVF9JUlE7Ci0gICAgQ29uZmlnLlByaW50UGNpID0gUFJJTlRfUENJOwotICAgIENvbmZpZy5TaG93QWxsRGV2ID0gU0hPV19BTExfREVWOwotICAgIENvbmZpZy5QcmludElwID0gUFJJTlRfSVA7Ci0gICAgQ29uZmlnLlNhdmVCaW9zID0gU0FWRV9CSU9TOwotICAgIENvbmZpZy5UcmFjZSA9IFRSQUNFOwotICAgIENvbmZpZy5Db25maWdBY3RpdmVPbmx5ID0gQ09ORklHX0FDVElWRV9PTkxZOyAgLyogYm9vdCAqLwotICAgIENvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UgPSBDT05GSUdfQUNUSVZFX0RFVklDRTsgLyogYm9vdCAqLwotICAgIENvbmZpZy5NYXBTeXNCaW9zID0gTUFQX1NZU19CSU9TOwotICAgIENvbmZpZy5SZXNvcnQgPSBSRVNPUlQ7ICAvKiBib290ICovCi0gICAgQ29uZmlnLkZpeFJvbSA9IEZJWF9ST007Ci0gICAgQ29uZmlnLk5vQ29uc29sZSA9IE5PX0NPTlNPTEU7Ci0gICAgQ29uZmlnLkJvb3RPbmx5ID0gRkFMU0U7Ci0gICAgQ29uZmlnLlZlcmJvc2UgPSBWRVJCT1NFOwotCi0gICAgb3B0ZXJyID0gMDsKLSAgICB3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYyxhcmd2LCJwc2ljYVBTdEFkYnJmbnY6PyIpKSAhPSBFT0YpIHsKLSAgICBzd2l0Y2goYykgewotICAgIGNhc2UgJ3AnOgotCUNvbmZpZy5QcmludFBvcnQgPSBUUlVFOwotCWJyZWFrOwotICAgIGNhc2UgJ3MnOgotCUNvbmZpZy5Jb1N0YXRpc3RpY3MgPSBUUlVFOwotCWJyZWFrOwotICAgIGNhc2UgJ2knOgotCUNvbmZpZy5QcmludElycSA9IFRSVUU7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnYyc6Ci0JQ29uZmlnLlByaW50UGNpID0gVFJVRTsKLQlicmVhazsKLSAgICBjYXNlICdhJzoKLQlDb25maWcuU2hvd0FsbERldiA9IFRSVUU7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnUCc6Ci0JQ29uZmlnLlByaW50SXAgPSBUUlVFOwotCWJyZWFrOwotICAgIGNhc2UgJ1MnOgotCUNvbmZpZy5TYXZlQmlvcyA9IFRSVUU7Ci0JYnJlYWs7Ci0gICAgY2FzZSAndCc6Ci0JQ29uZmlnLlRyYWNlID0gVFJVRTsKLQlicmVhazsKLSAgICBjYXNlICdBJzoKLQlDb25maWcuQ29uZmlnQWN0aXZlT25seSA9IFRSVUU7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0JQ29uZmlnLkNvbmZpZ0FjdGl2ZURldmljZSA9IFRSVUU7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0JQ29uZmlnLk1hcFN5c0Jpb3MgPSBUUlVFOwotCWJyZWFrOwotICAgIGNhc2UgJ3InOgotCUNvbmZpZy5SZXNvcnQgPSBUUlVFOwotCWJyZWFrOwotICAgIGNhc2UgJ2YnOgotCUNvbmZpZy5GaXhSb20gPSBUUlVFOwotCWJyZWFrOwotICAgIGNhc2UgJ24nOgotCUNvbmZpZy5Ob0NvbnNvbGUgPSBUUlVFOwotCWJyZWFrOwotICAgIGNhc2UgJ3YnOgotCUNvbmZpZy5WZXJib3NlID0gc3RydG9sKG9wdGFyZyxOVUxMLDApOwotCWJyZWFrOwotICAgIGNhc2UgJz8nOgotCXByaW50X3VzYWdlKCk7Ci0JYnJlYWs7Ci0gICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICB9Ci0gICAgfQotCi0KLSAgICBpZiAoIW1hcCgpKQotICAgIGV4aXQoMSk7Ci0KLSAgICBpZiAoIXNldHVwX3N5c3RlbV9iaW9zKCkpCi0gICAgZXhpdCgxKTsKLQotICAgIGlvcGwoMyk7Ci0KLSAgICBzY2FuX3BjaSgpOwotCi0gICAgc2F2ZV9tc3IgPSBpbmIoMHgzQ0MpOwotICAgIHNhdmVfdnNlID0gaW5iKDB4M0MzKTsKLSAgICBzYXZlXzQ2ZTggPSBpbmIoMHg0NmU4KTsKLSAgICBzYXZlX3BvczEwMiA9IGluYigweDEwMik7Ci0KLSAgICBpZiAoQ29uZmlnLkJvb3RPbmx5KSB7Ci0KLSAgICBpZiAoIUN1cnJlbnRQY2kgJiYgIUNvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UKLQkmJiAhQ29uZmlnLkNvbmZpZ0FjdGl2ZU9ubHkpIHsKLQlpb3BsKDApOwotCXVubWFwKCk7Ci0JZXhpdCAoMSk7Ci0gICAgfQotICAgIGNhbGxfYm9vdChOVUxMKTsKLSAgICB9IGVsc2UgewotICAgIHVzaW5nX2hpc3RvcnkoKTsKLSAgICB5eXBhcnNlKCk7Ci0gICAgfQotCi0gICAgdW5tYXAoKTsKLQotICAgIHBjaVZpZGVvUmVzdG9yZSgpOwotCi0gICAgb3V0YigweDEwMiwgc2F2ZV9wb3MxMDIpOwotICAgIG91dGIoMHg0NmU4LCBzYXZlXzQ2ZTgpOwotICAgIG91dGIoMHgzQzMsIHNhdmVfdnNlKTsKLSAgICBvdXRiKDB4M0MyLCBzYXZlX21zcik7Ci0KLSAgICBpb3BsKDApOwotCi0gICAgY2xvc2VfY29uc29sZShDb25zb2xlKTsKLQotICAgIGV4aXQoMCk7Ci19Ci0KLQotdm9pZAotY2FsbF9ib290KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLSAgICBpbnQgQWN0aXZlX2lzX1BjaSA9IDA7Ci0gICAgQ0FSRDMyIHZiaW9zX2Jhc2U7Ci0KLSAgICBDdXJyZW50UGNpID0gUGNpTGlzdDsKLSAgICBDb25zb2xlID0gb3Blbl9jb25zb2xlKCk7Ci0KLSAgICBzZXRfaW9wZXJtKCk7Ci0KLQotICAgIHNpZ25hbCgyLHNpZ19oYW5kbGVyKTsKLSAgICBzaWduYWwoMTEsc2lnX2hhbmRsZXIpOwotCi0gICAgLyogZGlzYWJsZSBwcmltYXJ5IGNhcmQgKi8KLSAgICBwY2lWaWRlb1Jlc3RvcmUoKTsgLyogcmVzZXQgUENJIHN0YXRlIHRvIHNlZSBwcmltYXJ5IGNhcmQgKi8KLSAgICBvdXRiKDB4M0MyLH4oQ0FSRDgpMHgwMyAmIHNhdmVfbXNyKTsKLSAgICBvdXRiKDB4M0MzLH4oQ0FSRDgpMHgwMSAmIHNhdmVfdnNlKTsKLSAgICBvdXRiKDB4NDZlOCwgfihDQVJEOCkweDA4ICYgc2F2ZV80NmU4KTsKLSAgICBvdXRiKDB4MTAyLCB+KENBUkQ4KTB4MDEgJiBzYXZlX3BvczEwMik7Ci0KLSAgICBwY2lWaWRlb0Rpc2FibGUoKTsKLQotICAgIHdoaWxlIChDdXJyZW50UGNpKSB7Ci0gICAgQ0FSRDE2IGF4OwotCi0gICAgaWYgKEN1cnJlbnRQY2ktPmFjdGl2ZSkgewotCUFjdGl2ZV9pc19QY2kgPSAxOwotCWlmICghQ29uZmlnLkNvbmZpZ0FjdGl2ZURldmljZSAmJiAhZGV2KSB7Ci0JQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7Ci0JY29udGludWU7Ci0JfQotICAgIH0gZWxzZSBpZiAoQ29uZmlnLkNvbmZpZ0FjdGl2ZU9ubHkgJiYgIWRldikgewotCUN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OwotCWNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoZGV2ICYmICgoZGV2LT50eXBlICE9IFBDSSkKLQkgICAgfHwgKGRldi0+dHlwZSA9PSBQQ0kKLQkgICAgJiYgKGRldi0+bG9jLnBjaS5kZXYgIT0gQ3VycmVudFBjaS0+ZGV2Ci0JCXx8IGRldi0+bG9jLnBjaS5idXMgIT0gQ3VycmVudFBjaS0+YnVzCi0JCXx8IGRldi0+bG9jLnBjaS5mdW5jICE9IEN1cnJlbnRQY2ktPmZ1bmMpKSkpIHsKLQlDdXJyZW50UGNpID0gQ3VycmVudFBjaS0+bmV4dDsKLQljb250aW51ZTsKLSAgICB9Ci0KLSAgICBFbmFibGVDdXJyZW50KCk7Ci0KLSAgICBpZiAoQ3VycmVudFBjaS0+YWN0aXZlKSB7Ci0Jb3V0YigweDEwMiwgc2F2ZV9wb3MxMDIpOwotCW91dGIoMHg0NmU4LCBzYXZlXzQ2ZTgpOwotCW91dGIoMHgzQzMsIHNhdmVfdnNlKTsKLQlvdXRiKDB4M0MyLCBzYXZlX21zcik7Ci0gICAgfQotCi0gICAgLyogY2xlYXIgaW50ZXJydXB0IHZlY3RvcnMgKi8KLSNpZmRlZiBfX2lhMzJfXwotICAgIHZiaW9zX2Jhc2UgPSBDdXJyZW50UGNpLT5hY3RpdmUgPyBzZXR1cF9wcmltYXJ5X2ludF92ZWN0KCkKLQk6IHNldHVwX2ludF92ZWN0KCk7Ci0jZWxzZQotICAgIHZiaW9zX2Jhc2UgPSBzZXR1cF9pbnRfdmVjdCgpOwotI2VuZGlmCi0gICAgYXggPSAoKENBUkQxNikoQ3VycmVudFBjaS0+YnVzKSA8PCA4KQotCXwgKEN1cnJlbnRQY2ktPmRldiA8PCAzKSB8IChDdXJyZW50UGNpLT5mdW5jICYgMHg3KTsKLSAgICBpZiAoQ29uZmlnLlZlcmJvc2UgPiAxKSBQX3ByaW50ZigiYXg6IDB4JXhcbiIsYXgpOwotCi0gICAgQm9vdEJpb3MgPSBmaW5kUGNpQnlJRHMoQ3VycmVudFBjaS0+YnVzLEN1cnJlbnRQY2ktPmRldiwKLQkJICAgQ3VycmVudFBjaS0+ZnVuYyk7Ci0gICAgaWYgKCEoKG1hcFBjaVJvbShCb290QmlvcykgJiYgY2hrc3VtKChDQVJEOCopVl9CSU9TKSkKLQkgIHx8IChDdXJyZW50UGNpLT5hY3RpdmUgJiYgY29weV92Ymlvcyh2Ymlvc19iYXNlKSkpKSB7Ci0JQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7Ci0JY29udGludWU7Ci0gICAgfQotICAgIGlmICghbWFwX3ZyYW0oKSkgewotCUN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OwotCWNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoQ29uZmlnLlNhdmVCaW9zKSBzYXZlX2Jpb3NfdG9fZmlsZSgpOwotICAgIHByaW50ZigiaW5pdGlhbGl6aW5nIFBDSSBidXM6ICVpIGRldjogJWkgZnVuYzogJWlcbiIsQ3VycmVudFBjaS0+YnVzLAotCSAgIEN1cnJlbnRQY2ktPmRldixDdXJyZW50UGNpLT5mdW5jKTsKLSAgICBib290QklPUyhheCk7Ci0gICAgdW5tYXBfdnJhbSgpOwotCi0gICAgaWYgKEN1cnJlbnRQY2ktPmFjdGl2ZSkKLQljbG9zZV9jb25zb2xlKENvbnNvbGUpOwotCi0gICAgaWYgKGRldikgcmV0dXJuOwotCi0gICAgQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7Ci0gICAgfQotCi0gICAgLyogV2UgaGF2ZSBhbiBJU0EgZGV2aWNlIC0gY29uZmlndXJlIGlmIHJlcXVlc3RlZCAqLwotICAgIGlmICghQWN0aXZlX2lzX1BjaSAvKiBubyBpc2EgY2FyZCBpbiBzeXN0ZW0hICovCi0gICAgJiYgKCghZGV2ICYmIChDb25maWcuQ29uZmlnQWN0aXZlRGV2aWNlIHx8IENvbmZpZy5Db25maWdBY3RpdmVPbmx5KSkKLQl8fCAoZGV2ICYmIGRldi0+dHlwZSA9PSBJU0EpKSkgewotCi0gICAgcGNpVmlkZW9EaXNhYmxlKCk7Ci0KLSAgICBpZiAoIWRldiB8fCBkZXYtPnR5cGUgPT0gSVNBKSB7Ci0Jb3V0YigweDEwMiwgc2F2ZV9wb3MxMDIpOwotCW91dGIoMHg0NmU4LCBzYXZlXzQ2ZTgpOwotCW91dGIoMHgzQzMsIHNhdmVfdnNlKTsKLQlvdXRiKDB4M0MyLCBzYXZlX21zcik7Ci0KLSNpZmRlZiBfX2lhMzJfXwotCXZiaW9zX2Jhc2UgPSBzZXR1cF9wcmltYXJ5X2ludF92ZWN0KCk7Ci0jZWxzZQotCXZiaW9zX2Jhc2UgPSBzZXR1cF9pbnRfdmVjdCgpOwotI2VuZGlmCi0JaWYgKGNvcHlfdmJpb3ModmJpb3NfYmFzZSkpIHsKLQotCWlmIChDb25maWcuU2F2ZUJpb3MpIHNhdmVfYmlvc190b19maWxlKCk7Ci0JaWYgIChtYXBfdnJhbSgpKSB7Ci0JICAgIHByaW50ZigiaW5pdGlhbGl6aW5nIElTQSBidXNcbiIpOwotCSAgICBib290QklPUygwKTsKLQl9Ci0JfQotCi0JdW5tYXBfdnJhbSgpOwotCXNsZWVwKDEpOwotCWNsb3NlX2NvbnNvbGUoQ29uc29sZSk7Ci0gICAgfQotICAgIH0KLQotCi19Ci0KLWludAotbWFwKHZvaWQpCi17Ci0gICAgdm9pZCogbWVtOwotICAgIG1lbSA9IG1tYXAoMCwgKHNpemVfdClTSVpFLAotCSAgICAgICBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICAgICBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OLAotCSAgICAgICAtMSwgMCApOwotICAgIGlmIChtZW0gIT0gMCkgewotCXBlcnJvcigiYW5vbnltb3VzIG1hcCIpOwotCXJldHVybiAoMCk7Ci0gICAgfQotICAgIG1lbXNldChtZW0sMCxTSVpFKTsKLQotICAgIHJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi11bm1hcCh2b2lkKQotewotICAgIG11bm1hcCgwLFNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYm9vdEJJT1MoQ0FSRDE2IGF4KQotewotICAgIGk4NmJpb3NSZWdzIGJSZWdzOwotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBwcmludGYoInN0YXJ0aW5nIEJJT1NcbiIpOwotI2VuZGlmCi0gICAgc2V0dXBfaW8oKTsKLSAgICBzZXR1cF9iaW9zX3JlZ3MoJmJSZWdzLCBheCk7Ci0gICAgbG9hZENvZGVUb01lbSgodW5zaWduZWQgY2hhciAqKSBCSU9TX1NUQVJULCBjb2RlKTsKLSAgICBkb194ODYoQklPU19TVEFSVCwmYlJlZ3MpOwotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBwcmludGYoImRvbmVcbiIpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQKLW1hcF92cmFtKHZvaWQpCi17Ci0gICAgaW50IG1lbV9mZDsKLQotI2lmZGVmIF9faWE2NF9fCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRXUiB8IE9fU1lOQykpPDApCi0jZWxzZQotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JEV1IpKTwwKQotI2VuZGlmCi0JewotCXBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSNpZmRlZiBfX2FscGhhX18KLSAgICAgICBpZiAoIV9idXNfYmFzZSgpKSBzcGFyc2Vfc2hpZnQgPSA3OyAvKiBVaCwgb2gsIEpFTlNFTi4uLiAqLwotCSBpZiAoIV9idXNfYmFzZV9zcGFyc2UoKSkgc3BhcnNlX3NoaWZ0ID0gMDsKLQkgaWYgKCh2cmFtX21hcCA9IG1tYXAoMCwoc2l6ZV90KSAoVlJBTV9TSVpFIDw8IHNwYXJzZV9zaGlmdCksCi0JCQkJCQkgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkJCQkJCSBNQVBfU0hBUkVELAotCQkJCQkJIG1lbV9mZCwgKFZSQU1fU1RBUlQgPDwgc3BhcnNlX3NoaWZ0KQotCQkJCQkJIHwgX2J1c19iYXNlX3NwYXJzZSgpKSkgPT0gKHZvaWQgKikgLTEpCi0jZWxzZQotICAgICAgaWYgKG1tYXAoKHZvaWQgKikgVlJBTV9TVEFSVCwgKHNpemVfdCkgVlJBTV9TSVpFLAotCQkJIFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQgfCBNQVBfRklYRUQsCi0JCQkgbWVtX2ZkLCBWUkFNX1NUQVJUKSA9PSAodm9pZCAqKSAtMSkKLSNlbmRpZgotICAgICAgewotCXBlcnJvcigibW1hcCBlcnJvciBpbiBtYXBfaGFyZHdhcmVfcmFtICgxKSIpOwotCSAgICBjbG9zZShtZW1fZmQpOwotCSAgICByZXR1cm4gKDApOwotCX0KLSAgICB2cmFtX21hcHBlZCA9IDE7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm4gKDEpOwotfQotCi1zdGF0aWMgdm9pZAotdW5tYXBfdnJhbSh2b2lkKQotewotICAgIGlmICghdnJhbV9tYXBwZWQpIHJldHVybjsKLQotICAgIG11bm1hcCgodm9pZCopVlJBTV9TVEFSVCxWUkFNX1NJWkUpOwotICAgIHZyYW1fbWFwcGVkID0gMDsKLX0KLQotc3RhdGljIGludAotY29weV92YmlvcyhtZW1UeXBlIHZfYmFzZSkKLXsKLSAgICBpbnQgbWVtX2ZkOwotICAgIHVuc2lnbmVkIGNoYXIgKnRtcDsKLSAgICBpbnQgc2l6ZTsKLQotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JET05MWSkpPDApIHsKLQlwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7Ci0JcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgICBpZiAobHNlZWsobWVtX2ZkLChvZmZfdCkgdl9iYXNlLCBTRUVLX1NFVCkgIT0gKG9mZl90KSB2X2Jhc2UpIHsKLQkgIGZwcmludGYoc3RkZXJyLCJDYW5ub3QgbHNlZWtcbiIpOwotCSAgZ290byBFcnJvcjsKLSAgICAgIH0KLSAgICB0bXAgPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYygzKTsKLSAgICBpZiAocmVhZChtZW1fZmQsIChjaGFyICopdG1wLCAoc2l6ZV90KSAzKSAhPSAoc2l6ZV90KSAzKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCJDYW5ub3QgcmVhZFxuIik7Ci0JZ290byBFcnJvcjsKLSAgICB9Ci0gICAgaWYgKGxzZWVrKG1lbV9mZCwob2ZmX3QpIHZfYmFzZSxTRUVLX1NFVCkgIT0gKG9mZl90KSB2X2Jhc2UpCi0JZ290byBFcnJvcjsKLQotICAgIGlmICgqdG1wICE9IDB4NTUgfHwgKih0bXArMSkgIT0gMHhBQSApIHsKLQlmcHJpbnRmKHN0ZGVyciwiTm8gYmlvcyBmb3VuZCBhdDogMHglbHhcbiIsdl9iYXNlKTsKLQlnb3RvIEVycm9yOwotICAgIH0KLSNpZmRlZiBERUJVRwotCWRwcmludCgodW5zaWduZWQgbG9uZyl0bXAsMHgxMDApOwotI2VuZGlmCi0gICAgc2l6ZSA9ICoodG1wKzIpICogNTEyOwotCi0gICAgaWYgKHJlYWQobWVtX2ZkLCAoY2hhciAqKXZfYmFzZSwgKHNpemVfdCkgc2l6ZSkgIT0gKHNpemVfdCkgc2l6ZSkgewotCSAgICBmcHJpbnRmKHN0ZGVyciwiQ2Fubm90IHJlYWRcbiIpOwotCWdvdG8gRXJyb3I7Ci0gICAgfQotICAgIGZyZWUodG1wKTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIGlmICghY2hrc3VtKChDQVJEOCopdl9iYXNlKSkKLQlyZXR1cm4gKDApOwotCi0gICAgcmV0dXJuICgxKTsKLQotRXJyb3I6Ci0gICAgcGVycm9yKCJ2X2Jpb3MiKTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvcHlfc3lzX2Jpb3Modm9pZCkKLXsKLSNkZWZpbmUgU1lTX0JJT1MgMHhGMDAwMAotICAgIGludCBtZW1fZmQ7Ci0KLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRE9OTFkpKTwwKSB7Ci0JcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOwotCXJldHVybiAoMCk7Ci0gICAgfQotCi0gICAgaWYgKGxzZWVrKG1lbV9mZCwob2ZmX3QpIFNZU19CSU9TLFNFRUtfU0VUKSAhPSAob2ZmX3QpIFNZU19CSU9TKQotCWdvdG8gRXJyb3I7Ci0gICAgaWYgKHJlYWQobWVtX2ZkLCAoY2hhciAqKVNZU19CSU9TLCAoc2l6ZV90KSAweEZGRkYpICE9IChzaXplX3QpIDB4RkZGRikKLQlnb3RvIEVycm9yOwotCi0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm4gKDEpOwotCi1FcnJvcjoKLSAgICBwZXJyb3IoInN5c19iaW9zIik7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm4gKDApOwotfQotCi12b2lkCi1sb2FkQ29kZVRvTWVtKHVuc2lnbmVkIGNoYXIgKnB0ciwgQ0FSRDggY29kZVtdKQotewotICAgIGludCBpOwotICAgIENBUkQ4IHZhbDsKLSAgICBpbnQgc2l6ZSA9IGNvZGVbMF07Ci0KLSAgICBmb3IgKCBpPTE7aTw9c2l6ZTtpKyspIHsKLQl2YWwgPSBjb2RlW2ldOwotCSpwdHIrKyA9IHZhbDsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi12b2lkCi1kcHJpbnQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQotewotICAgIGludCBpLGo7Ci0gICAgY2hhciAqYyA9IChjaGFyICopc3RhcnQ7Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgKHNpemUgPj4gNCk7IGorKykgewotICAgIGNoYXIgKmQgPSBjOwotICAgIHByaW50ZigiXG4weCVseDogICIsKHVuc2lnbmVkIGxvbmcpYyk7Ci0gICAgZm9yIChpID0gMDsgaTwxNjsgaSsrKQotCXByaW50ZigiJTIuMnggIiwodW5zaWduZWQgY2hhcikgKCooYysrKSkpOwotICAgIGMgPSBkOwotICAgIGZvciAoaSA9IDA7IGk8MTY7IGkrKykgewotCXByaW50ZigiJWMiLCgoKChDQVJEOCkoKmMpKSA+IDMyKSAmJiAoKChDQVJEOCkoKmMpKSA8IDEyOCkpID8KLQkgICAodW5zaWduZWQgY2hhcikgKCooYykpOiAnLicpOwotCWMrKzsKLSAgICB9Ci0gICAgfQotICAgIHByaW50ZigiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXNhdmVfYmlvc190b19maWxlKHZvaWQpCi17Ci0gICAgc3RhdGljIGludCBudW0gPSAwOwotICAgIGludCBzaXplLCBjb3VudDsKLSAgICBjaGFyIGZpbGVfbmFtZVsyNTZdOwotICAgIGludCBmZDsKLQotICAgIHNwcmludGYoZmlsZV9uYW1lLCJiaW9zXyVpLmZpbCIsbnVtKTsKLSAgICBpZiAoKGZkID0gIG9wZW4oZmlsZV9uYW1lLE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsMDA2NDQpKSA9PSAtMSkKLQlyZXR1cm47Ci0gICAgc2l6ZSA9ICgqKHVuc2lnbmVkIGNoYXIqKShWX0JJT1MgKyAyKSkgKiA1MTI7Ci0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIGRwcmludChWX0JJT1MsMjApOwotI2VuZGlmCi0gICAgaWYgKChjb3VudCA9IHdyaXRlKGZkLCh2b2lkICopKFZfQklPUyksc2l6ZSkpICE9IHNpemUpCi0JZnByaW50ZihzdGRlcnIsIm9ubHkgc2F2ZWQgJWkgb2YgJWkgYnl0ZXNcbiIsc2l6ZSxjb3VudCk7Ci0gICAgbnVtKys7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zaWdfaGFuZGxlcihpbnQgdW51c2VkKQotewotICAgIGZmbHVzaChzdGRvdXQpOwotICAgIGZmbHVzaChzdGRlcnIpOwotCi0gICAgLyogcHV0IHN5c3RlbSBiYWNrIGluIGEgc2F2ZSBzdGF0ZSAqLwotICAgIHVubWFwX3ZyYW0oKTsKLSAgICBwY2lWaWRlb1Jlc3RvcmUoKTsKLSAgICBvdXRiKDB4MTAyLCBzYXZlX3BvczEwMik7Ci0gICAgb3V0YigweDQ2ZTgsIHNhdmVfNDZlOCk7Ci0gICAgb3V0YigweDNDMywgc2F2ZV92c2UpOwotICAgIG91dGIoMHgzQzIsIHNhdmVfbXNyKTsKLQotICAgIGNsb3NlX2NvbnNvbGUoQ29uc29sZSk7Ci0gICAgaW9wbCgwKTsKLSAgICB1bm1hcCgpOwotCi0gICAgZXhpdCgxKTsKLX0KLQotLyoKLSAqIEZvciBpbml0aWFsaXphdGlvbiB3ZSBqdXN0IHBhc3MgYXggdG8gdGhlIEJJT1MuCi0gKiBQQ0kgQklPU2VzIG5lZWQgdGhpcy4gQWxsIG90aGVyIHJlZ2lzdGVyIGFyZSBzZXQgMC4KLSAqLwotc3RhdGljIHZvaWQgc2V0dXBfYmlvc19yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MsIENBUkQzMiBheCkKLXsKLSAgICByZWdzLT5heCA9IGF4OwotICAgIHJlZ3MtPmJ4ID0gMDsKLSAgICByZWdzLT5jeCA9IDA7Ci0gICAgcmVncy0+ZHggPSAwOwotICAgIHJlZ3MtPmVzID0gMDsKLSAgICByZWdzLT5kcyA9IDB4NDA7ICAgICAgICAgICAgICAgLyogc3RhbmRhcmQgcGMgZHMgKi8KLSAgICByZWdzLT5zaSA9IDA7Ci0gICAgcmVncy0+ZGkgPSAwOwotfQotCi0vKgotICogaGVyZSB3ZSBhcmUgcmVhbGx5IHBhcmFub2lkIGFib3V0IGZha2luZyBhICJyZWFsIgotICogQklPUy4gTW9zdCBvZiB0aGlzIGluZm9ybWF0aW9uIHdhcyBwdWxsZWQgZnJvbQotICogZG9zZW0uCi0gKi8KLQotI2lmZGVmIF9faWEzMl9fCi1zdGF0aWMgQ0FSRDMyCi1zZXR1cF9wcmltYXJ5X2ludF92ZWN0KHZvaWQpCi17Ci0gICAgaW50IG1lbV9mZDsKLSAgICBDQVJEMzIgdmJhc2U7Ci0gICAgdm9pZCAqbWFwOwotCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRXUikpPDApCi0JICAgIHsKLSAgICBwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7Ci0gICAgcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgICBpZiAoKG1hcCA9IG1tYXAoKHZvaWQgKikgMCwgKHNpemVfdCkgMHgyMDAwLAotCSBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAotCSBtZW1fZmQsIDApKSA9PSAodm9pZCAqKS0xKSAgIHsKLSAgICBwZXJyb3IoIm1tYXAgZXJyb3IgaW4gbWFwX2hhcmR3YXJlX3JhbSAoMikiKTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybiAoMCk7Ci0gICAgfQotCi0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICBtZW1jcHkoMCxtYXAsQklPU19NRU0pOwotICAgIG11bm1hcChtYXAsMHgyMDAwKTsKLSAgICAvKgotICAgICAqIGNyZWF0ZSBhIGJhY2t1cCBjb3B5IG9mIHRoZSBiaW9zIHZhcmlhYmxlcyB0byB3cml0ZSBiYWNrIHRoZQotICAgICAqIG1vZGlmaWVkIHZhbHVlcwotICAgICAqLwotICAgIGlmICghYmlvc192YXIpCi0gICAgYmlvc192YXIgPSAoY2hhciAqKW1hbGxvYyhCSU9TX01FTSk7Ci0gICAgbWVtY3B5KGJpb3NfdmFyLDAsQklPU19NRU0pOwotCi0gICAgdmJhc2UgPSAoKigoQ0FSRDE2KikoMHgxMCA8PCAyKSArIDEpKSA8PCA0OwotICAgIGlmIChDb25maWcuVmVyYm9zZSA+IDApIHByaW50ZigidmJhc2U6IDB4JXhcbiIsdmJhc2UpOwotICAgIHJldHVybiB2YmFzZTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgQ0FSRDMyCi1zZXR1cF9pbnRfdmVjdCh2b2lkKQotewotICAgIGNvbnN0IENBUkQxNiBjcyA9IDB4MDsKLSAgICBjb25zdCBDQVJEMTYgaXAgPSAweDA7Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBsZXQgdGhlIGludCB2ZWN0cyBwb2ludCB0byB0aGUgU1lTX0JJT1Mgc2VnICovCi0gICAgZm9yIChpPTA7IGk8MHg4MDsgaSsrKSB7Ci0JKChDQVJEMTYqKTApW2k8PDFdID0gaXA7Ci0JKChDQVJEMTYqKTApWyhpPDwxKSsxXSA9IGNzOwotICAgIH0KLSAgICAvKiB2aWRlbyBpbnRlcnJ1cHRzIGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4NDI8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDQyPDwxXSA9IDB4ZjA2NTsKLSAgICAoKENBUkQxNiopMClbKDB4MTA8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDEwPDwxXSA9IDB4ZjA2NTsKLSAgICAvKiB2aWRlbyBwYXJhbSB0YWJsZSBkZWZhdWx0IGxvY2F0aW9uIChpbnQgMWQpICovCi0gICAgKChDQVJEMTYqKTApWygweDFkPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxZDw8MV0gPSAweGYwQTQ7Ci0gICAgLyogZm9udCB0YWJsZXMgZGVmYXVsdCBsb2NhdGlvbiAoaW50IDFGKSAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxZjw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MWY8PDFdID0gMHhmYTZlOwotCi0gICAgLyogaW50IDExIGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4MTE8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDExPDwxXSA9IDB4Zjg0ZDsKLSAgICAvKiBpbnQgMTIgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxMjw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MTI8PDFdID0gMHhmODQxOwotICAgIC8qIGludCAxNSBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDE1PDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxNTw8MV0gPSAweGY4NTk7Ci0gICAgLyogaW50IDFBIGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4MWE8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDFhPDwxXSA9IDB4ZmY2ZTsKLSAgICAvKiBpbnQgMDUgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgwNTw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MDU8PDFdID0gMHhmZjU0OwotICAgIC8qIGludCAwOCBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDg8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDg8PDFdID0gMHhmZWE1OwotICAgIC8qIGludCAxMyBkZWZhdWx0IGxvY2F0aW9uIChmZGQpICovCi0gICAgKChDQVJEMTYqKTApWygweDEzPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxMzw8MV0gPSAweGVjNTk7Ci0gICAgLyogaW50IDBFIGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4ZTw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4ZTw8MV0gPSAweGVmNTc7Ci0gICAgLyogaW50IDE3IGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4MTc8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDE3PDwxXSA9IDB4ZWZkMjsKLSAgICAvKiBmZGQgdGFibGUgZGVmYXVsdCBsb2NhdGlvbiAoaW50IDFlKSAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxZTw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MWU8PDFdID0gMHhlZmM3OwotICAgIHJldHVybiBWX0JJT1M7Ci19Ci0KLXN0YXRpYyBpbnQKLXNldHVwX3N5c3RlbV9iaW9zKHZvaWQpCi17Ci0gICAgY2hhciAqZGF0ZSA9ICIwNi8wMS85OSI7Ci0gICAgY2hhciAqZWlzYV9pZGVudCA9ICJQQ0kvSVNBIjsKLQotICAgIGlmIChDb25maWcuTWFwU3lzQmlvcykgewotCi0JaWYgKCFjb3B5X3N5c19iaW9zKCkpIHJldHVybiAwOwotCXJldHVybiAxOwotCi0gICAgfSBlbHNlIHsKLQotLyogICAgbWVtc2V0KCh2b2lkICopMHhGMDAwMCwweGY0LDB4ZmZmNyk7ICovCi0KLQkvKgotCSAqIHdlIHRyYXAgdGhlICJpbmR1c3RyeSBzdGFuZGFyZCBlbnRyeSBwb2ludHMiIHRvIHRoZSBCSU9TCi0JICogYW5kIGFsbCBvdGhlciBsb2NhdGlvbnMgYnkgZmlsbGluZyB0aGVtIHdpdGggImhsdCIKLQkgKiBUT0RPOiBpbXBsZW1lbnQgaGx0LWhhbmRsZXIgZm9yIHRoZXNlCi0JICovCi0JbWVtc2V0KCh2b2lkICopMHhGMDAwMCwweGY0LDB4MTAwMDApOwotCi0JLyoKLQkgKiBUT0RPOiB3ZSBzaG91bGQgY29weSB0aGUgZmRkIHRhYmxlICgweGZlYzU5LTB4ZmVjNWIpCi0JICogdGhlIHZpZGVvIHBhcmFtZXRlciB0YWJsZSAoMHhmMGFjLTB4ZjBmYikKLQkgKiBhbmQgdGhlIGZvbnQgdGFibGVzICgweGZhNmUtMHhmZTZkKQotCSAqIGZyb20gdGhlIG9yaWdpbmFsIGJpb3MgaGVyZQotCSAqLwotCi0JLyogc2V0IGJpb3MgZGF0ZSAqLwotCXN0cmNweSgoY2hhciAqKTB4RkZGRjUsZGF0ZSk7Ci0JLyogc2V0IHVwIGVpc2EgaWRlbnQgc3RyaW5nICovCi0Jc3RyY3B5KChjaGFyICopMHhGRkZEOSxlaXNhX2lkZW50KTsKLQkvKiB3cml0ZSBzeXN0ZW0gbW9kZWwgaWQgZm9yIElCTS1BVCAqLwotCSgoY2hhciAqKTApWzB4RkZGRkVdID0gMHhmYzsKLQotCXJldHVybiAxOwotICAgIH0KLQotfQotCi1zdGF0aWMgdm9pZAotdXBkYXRlX2Jpb3NfdmFycyh2b2lkKQotewotICAgIGludCBtZW1fZmQ7Ci0gICAgdm9pZCAqbWFwOwotICAgIG1lbVR5cGUgaTsKLQotI2lmZGVmIF9faWE2NF9fCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRXUiB8IE9fU1lOQykpPDApCi0jZWxzZQotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JEV1IpKTwwKQotI2VuZGlmCi0JICAgIHsKLSAgICBwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7Ci0gICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICgobWFwID0gbW1hcCgodm9pZCAqKSAwLCAoc2l6ZV90KSAweDIwMDAsCi0JIFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsCi0JIG1lbV9mZCwgMCkpID09ICh2b2lkICopLTEpICAgewotICAgIHBlcnJvcigibW1hcCBlcnJvciBpbiBtYXBfaGFyZHdhcmVfcmFtICgzKSIpOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBCSU9TX01FTTsgaSsrKSB7Ci0gICAgaWYgKGJpb3NfdmFyW2ldICE9ICooQ0FSRDgqKWkpCi0JKigoQ0FSRDgqKW1hcCArIGkpID0gKihDQVJEOCopaTsKLSAgICB9Ci0KLSAgICBtdW5tYXAobWFwLDB4MjAwMCk7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLX0KLQotc3RhdGljIGludAotY2hrc3VtKENBUkQ4ICpzdGFydCkKLXsKLSAgQ0FSRDE2IHNpemU7Ci0gIENBUkQ4IHZhbCA9IDA7Ci0gIGludCBpOwotCi0gIHNpemUgPSAqKHN0YXJ0KzIpICogNTEyOwotICBmb3IgKGkgPSAwOyBpPHNpemU7IGkrKykKLSAgICB2YWwgKz0gKihzdGFydCArIGkpOwotCi0gIGlmICghdmFsKQotICAgIHJldHVybiAxOwotCi0gICAgZnByaW50ZihzdGRlcnIsIkJJT1MgY2tzdW0gd3JvbmchXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLXJ1bklOVChpbnQgbnVtLCBpODZiaW9zUmVnc1B0ciBSZWdzKQotewotICAgIEJvb2wgaXNWaWRlbyA9IEZBTFNFOwotICAgIENBUkQ4IGNvZGVfaW50W10gPSB7IDMsIDB4Y2QsIDB4MDAsIDB4ZjQgfTsKLQotICAgIGNvZGVfaW50WzJdID0gKENBUkQ4KSBudW07Ci0KLSAgICBpZiAobnVtID09IDB4MTApCi0gICAgaXNWaWRlbyA9IFRSVUU7Ci0KLSAgICBpZiAoIXNldHVwX3N5c3RlbV9iaW9zKCkpCi0gICAgcmV0dXJuOwotCi0gICAgaWYgKChpc1ZpZGVvICYmICghQ3VycmVudFBjaSB8fCBDdXJyZW50UGNpLT5hY3RpdmUpKSB8fCAhaXNWaWRlbykgewotICAgIENBUkQzMiB2Ymlvc19iYXNlOwotCi0jaWZkZWYgX19pYTMyX18KLSAgICBpZiAoISh2Ymlvc19iYXNlID0gc2V0dXBfcHJpbWFyeV9pbnRfdmVjdCgpKSkKLSNlbHNlCi0gICAgaWYgKCEodmJpb3NfYmFzZSA9IHNldHVwX2ludF92ZWN0KCkpKQotI2VuZGlmCi0JcmV0dXJuOwotICAgIGlmICghY29weV92Ymlvcyh2Ymlvc19iYXNlKSkKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFtYXBfdnJhbSgpKQotICAgIHJldHVybjsKLQotI2lmZGVmIFY4NkJJT1NfREVCVUcKLQlwcmludGYoInN0YXJ0aW5nIEJJT1NcbiIpOwotI2VuZGlmCi0gICAgbG9hZENvZGVUb01lbSgodW5zaWduZWQgY2hhciAqKSBCSU9TX1NUQVJULCBjb2RlX2ludCk7Ci0gICAgc2V0dXBfaW8oKTsKLSAgICBwcmludF9yZWdzKFJlZ3MpOwotICAgIHNldF9pb3Blcm0oKTsKLSAgICBzZXRfaGx0KFRSVUUpOwotICAgIGRvX3g4NihCSU9TX1NUQVJULFJlZ3MpOwotICAgIHNldF9obHQoRkFMU0UpOwotICAgIHByaW50X3JlZ3MoUmVncyk7Ci0KLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgcHJpbnRmKCJkb25lXG4iKTsKLSNlbmRpZgotCi0gICAgaWYgKChpc1ZpZGVvICYmICghQ3VycmVudFBjaSB8fCBDdXJyZW50UGNpLT5hY3RpdmUpKSB8fCAhaXNWaWRlbykKLSAgICB1cGRhdGVfYmlvc192YXJzKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MpCi17Ci0gICAgcHJpbnRmKCJheD0leCBieD0leCBjeD0leCBkeD0leCBkcz0leCBlcz0leCBkaT0leCBzaT0leFxuIiwKLSAgICAgICAoQ0FSRDE2KXJlZ3MtPmF4LChDQVJEMTYpcmVncy0+YngsKENBUkQxNilyZWdzLT5jeCwoQ0FSRDE2KXJlZ3MtPmR4LAotICAgICAgIChDQVJEMTYpcmVncy0+ZHMsKENBUkQxNilyZWdzLT5lcywoQ0FSRDE2KXJlZ3MtPmRpLAotICAgICAgIChDQVJEMTYpcmVncy0+c2kpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfdXNhZ2Uodm9pZCkKLXsKLX0KLQotdm9pZAotYWRkX2hsdCh1bnNpZ25lZCBsb25nIHZhbCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmICh2YWwgPCBCSU9TX01FTSB8fCAodmFsID4gVlJBTV9TVEFSVCAmJiB2YWwgPCAoVlJBTV9TVEFSVCArIFZSQU1fU0laRSkpCi0gICAgfHwgdmFsID49IFNJWkUpIHsKLSAgICBwcmludGYoImFkZHJlc3Mgb3V0IG9mIHJhbmdlXG4iKTsKLSAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChpPTA7IGk8MjA7IGkrKykgewotICAgIGlmIChobHRwW2ldLmFkZHJlc3MgPT0gMCkgewotCWhsdHBbaV0uYWRkcmVzcyA9ICh2b2lkKil2YWw7Ci0JYnJlYWs7Ci0gICAgfQotICAgIH0KLSAgICBpZiAoaSA9PSAyMCkgcHJpbnRmKCJubyBtb3JlIGhsdHBvaW50cyBhdmFpbGFibGVcbiIpOwotfQotCi12b2lkCi1kZWxfaGx0KGludCB2YWwpCi17Ci0gICAgaWYgKHZhbCA9PSAyMSkgeyAvKiBkZWxldGUgYWxsICovCi0gICAgaW50IGk7Ci0gICAgcHJpbnRmKCJjbGVhcmluZyBhbGwgaGx0cG9pbnRzXG4iKTsKLSAgICBmb3IgKGk9MDsgaSA8MjA7IGkrKykKLQlobHRwW2ldLmFkZHJlc3MgPSBOVUxMOwotICAgIH0gZWxzZSBpZiAodmFsID49IDAgJiYgIHZhbCA8MjApCi0gICAgaGx0cFt2YWxdLmFkZHJlc3MgPSBOVUxMOwotICAgIGVsc2UgcHJpbnRmKCJobHRwb2ludCAlaSBvdXQgb2YgcmFuZ2U6IHZhbGlkIHJhbmdlIDAtMTlcbiIsdmFsKTsKLX0KLQotdm9pZAotbGlzdF9obHQoKQotewotICAgIGludCBpOwotICAgIGZvciAoaT0wOyBpPDIwOyBpKyspCi0gICAgaWYgKGhsdHBbaV0uYWRkcmVzcykKLQlwcmludGYoImhsdHBvaW50WyVpXTogMHglbHhcbiIsaSwodW5zaWduZWQgbG9uZylobHRwW2ldLmFkZHJlc3MpOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X2hsdChCb29sIHNldCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGk9MDsgaTwyMDsgaSsrKQotICAgIGlmIChobHRwW2ldLmFkZHJlc3MpIHsKLQlpZiAoc2V0KSB7Ci0JaGx0cFtpXS5vcmd2YWwgPSAqKENBUkQ4KilobHRwW2ldLmFkZHJlc3M7Ci0JKihDQVJEOCopaGx0cFtpXS5hZGRyZXNzID0gMHhmNDsKLQl9IGVsc2UKLQkqKENBUkQ4KilobHRwW2ldLmFkZHJlc3MgPSBobHRwW2ldLm9yZ3ZhbDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfaW9wZXJtKHZvaWQpCi17Ci0gICAgaW50IGksIHN0YXJ0OwotCi0gICAgaW9wZXJtKDAsSU9QRVJNX0JJVFMsMCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgSU9QRVJNX0JJVFM7aSsrKQotICAgIGlmIChpb3Blcm1fbGlzdFtpXSkgewotCXN0YXJ0ID0gaTsKLQlmb3IgKDtpIDwgSU9QRVJNX0JJVFM7IGkrKykgewotCWlmICghaW9wZXJtX2xpc3RbaV0pIHsKLQkgICAgaW9wZXJtKHN0YXJ0LGkgLSBzdGFydCwgMSk7Ci0JICAgIGJyZWFrOwotCX0KLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy92ODZiaW9zLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3Y4NmJpb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmM2Y4ZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3Y4NmJpb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDE5OTkgRWdiZXJ0IEVpY2gKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkIGluCi0gKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKLSAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMKLSAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCi0gKiAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotICogRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAotICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgotICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotI2lmbmRlZiBWODZfQklPU19ICi0jZGVmaW5lIFY4Nl9CSU9TX0gKLQotI2lmIGRlZmluZWQgKF9faTM4Nl9fKSB8fCBkZWZpbmVkIChfX2k0ODZfXykgfHwgZGVmaW5lZCAoX19pNTg2X18pIHx8IGRlZmluZWQgKF9faTY4Nl9fKSB8fCBkZWZpbmVkIChfX2s2X18pCi0jIGlmbmRlZiBfX2lhMzJfXwotIyAgZGVmaW5lIF9faWEzMl9fCi0jIGVuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgcF9wcmludGYoZixhLi4uKSBkbyB7aWYgKENvbmZpZy5QcmludFBvcnQpIGxwcmludGYoZiwjI2EpO30gXAotCQkJIHdoaWxlKDApCi0jZGVmaW5lIGlfcHJpbnRmKGYsYS4uLikgZG8gIHtpZiAoQ29uZmlnLlByaW50SXJxKSBscHJpbnRmKGYsIyNhKTt9IFwKLQkJCSAgd2hpbGUoMCkKLSNkZWZpbmUgUF9wcmludGYoZixhLi4uKSBkbyB7aWYgKENvbmZpZy5QcmludFBjaSkgbHByaW50ZihmLCMjYSk7fSBcCi0JCQkgIHdoaWxlKDApCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBDQVJEODsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgQ0FSRDE2OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgQ0FSRDMyOwotI2lmIGRlZmluZWQgKF9fYWxwaGFfXykgfHwgZGVmaW5lZCAoX19pYTY0X18pCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbWVtVHlwZTsKLSNlbHNlCi10eXBlZGVmIHVuc2lnbmVkIGludCBtZW1UeXBlOwotI2VuZGlmCi0KLXR5cGVkZWYgaW50IEJvb2w7Ci0KLSNkZWZpbmUgRkFMU0UgMAotI2RlZmluZSBUUlVFIDEKLQotc3RydWN0IGNvbmZpZyB7Ci0gICAgQm9vbCBQcmludFBvcnQ7Ci0gICAgQm9vbCBJb1N0YXRpc3RpY3M7Ci0gICAgQm9vbCBQcmludElycTsKLSAgICBCb29sIFByaW50UGNpOwotICAgIEJvb2wgU2hvd0FsbERldjsKLSAgICBCb29sIFByaW50SXA7Ci0gICAgQm9vbCBTYXZlQmlvczsKLSAgICBCb29sIFRyYWNlOwotICAgIEJvb2wgQ29uZmlnQWN0aXZlT25seTsKLSAgICBCb29sIENvbmZpZ0FjdGl2ZURldmljZTsKLSAgICBCb29sIE1hcFN5c0Jpb3M7Ci0gICAgQm9vbCBSZXNvcnQ7Ci0gICAgQm9vbCBGaXhSb207Ci0gICAgQm9vbCBOb0NvbnNvbGU7Ci0gICAgQm9vbCBCb290T25seTsKLSAgICBpbnQgIFZlcmJvc2U7Ci19OwotCi1zdHJ1Y3QgcGlvIHsKLSAgICBDQVJEOCAoKmluYikoQ0FSRDE2KTsKLSAgICBDQVJEMTYgKCppbncpKENBUkQxNik7Ci0gICAgQ0FSRDMyICgqaW5sKShDQVJEMTYpOwotICAgIHZvaWQgKCpvdXRiKShDQVJEMTYsQ0FSRDgpOwotICAgIHZvaWQgKCpvdXR3KShDQVJEMTYsQ0FSRDE2KTsKLSAgICB2b2lkICgqb3V0bCkoQ0FSRDE2LENBUkQzMik7Ci19OwotCi1zdHJ1Y3QgcmVnczg2IHsKLQlsb25nIGVieDsKLQlsb25nIGVjeDsKLQlsb25nIGVkeDsKLQlsb25nIGVzaTsKLQlsb25nIGVkaTsKLQlsb25nIGVicDsKLQlsb25nIGVheDsKLQlsb25nIGVpcDsKLQlsb25nIGVzcDsKLQl1bnNpZ25lZCBzaG9ydCBjczsKLQl1bnNpZ25lZCBzaG9ydCBzczsKLQl1bnNpZ25lZCBzaG9ydCBlczsKLQl1bnNpZ25lZCBzaG9ydCBkczsKLQl1bnNpZ25lZCBzaG9ydCBmczsKLQl1bnNpZ25lZCBzaG9ydCBnczsKLSAgICBsb25nIGVmbGFnczsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBDQVJEMzIgYXg7Ci0gICAgQ0FSRDMyIGJ4OwotICAgIENBUkQzMiBjeDsKLSAgICBDQVJEMzIgZHg7Ci0gICAgQ0FSRDMyIGNzOwotICAgIENBUkQzMiBlczsKLSAgICBDQVJEMzIgZHM7Ci0gICAgQ0FSRDMyIHNpOwotICAgIENBUkQzMiBkaTsKLX0gaTg2Ymlvc1JlZ3MsICppODZiaW9zUmVnc1B0cjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBmZDsKLSAgICBpbnQgdnQ7Ci19IGNvbnNvbGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB2b2lkKiBhZGRyZXNzOwotICAgIENBUkQ4IG9yZ3ZhbDsKLX0gaGFsdHBvaW50czsKLQotZW51bSBkZXZfdHlwZSB7ICBOT05FLCBJU0EsIFBDSSB9Owotc3RydWN0IGRldmljZSB7Ci0gICAgQm9vbCBib290ZWQ7Ci0gICAgZW51bSBkZXZfdHlwZSB0eXBlOwotICAgIHVuaW9uIHsKLSAgICAgIGludCBub25lOwotICAgICAgc3RydWN0IHBjaSB7Ci0JaW50IGJ1czsKLQlpbnQgZGV2OwotCWludCBmdW5jOwotICAgICAgfSBwY2k7Ci0gICAgfSBsb2M7Ci19OwotCi1leHRlcm4gc3RydWN0IGRldmljZSBEZXZpY2U7Ci0KLSNpZmRlZiBfX2FscGhhX18KLXVuc2lnbmVkIGxvbmcgX2J1c19iYXNlKHZvaWQpOwotZXh0ZXJuIHZvaWQqIHZyYW1fbWFwOwotZXh0ZXJuIGludCBzcGFyc2Vfc2hpZnQ7Ci0jZW5kaWYKLQotZXh0ZXJuIHN0cnVjdCBwaW8gUDsKLWV4dGVybiBzdHJ1Y3QgY29uZmlnIENvbmZpZzsKLSNkZWZpbmUgSU9QRVJNX0JJVFMgMTAyNAotZXh0ZXJuIGludCBpb3Blcm1fbGlzdFtJT1BFUk1fQklUU107Ci0KLWV4dGVybiB2b2lkIHNldHVwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgZG9feDg2KHVuc2lnbmVkIGxvbmcgYmlvc19zdGFydCxpODZiaW9zUmVnc1B0ciByZWdzKTsKLWV4dGVybiBpbnQgcnVuX2Jpb3NfaW50KGludCBudW0sIHN0cnVjdCByZWdzODYgKnJlZ3MpOwotZXh0ZXJuIENBUkQzMiBnZXRJbnRWZWN0KGludCBudW0pOwotQ0FSRDMyIGdldElQKHZvaWQpOwotCi1leHRlcm4gdm9pZCBjYWxsX2Jvb3Qoc3RydWN0IGRldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIHJ1bklOVChpbnQgbnVtLGk4NmJpb3NSZWdzUHRyIFJlZ3MpOwotZXh0ZXJuIHZvaWQgYWRkX2hsdCh1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHZvaWQgZGVsX2hsdChpbnQgYWRkcik7Ci1leHRlcm4gdm9pZCBsaXN0X2hsdCgpOwotCi1leHRlcm4gaW50IHBvcnRfcmVwX2luYihDQVJEMTYgcG9ydCwgQ0FSRDggKmJhc2UsIGludCBkX2YsIENBUkQzMiBjb3VudCk7Ci1leHRlcm4gaW50IHBvcnRfcmVwX2ludyhDQVJEMTYgcG9ydCwgQ0FSRDE2ICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpOwotZXh0ZXJuIGludCBwb3J0X3JlcF9pbmwoQ0FSRDE2IHBvcnQsIENBUkQzMiAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KTsKLWV4dGVybiBpbnQgcG9ydF9yZXBfb3V0YihDQVJEMTYgcG9ydCwgQ0FSRDggKmJhc2UsIGludCBkX2YsIENBUkQzMiBjb3VudCk7Ci1leHRlcm4gaW50IHBvcnRfcmVwX291dHcoQ0FSRDE2IHBvcnQsIENBUkQxNiAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KTsKLWV4dGVybiBpbnQgcG9ydF9yZXBfb3V0bChDQVJEMTYgcG9ydCwgQ0FSRDMyICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpOwotZXh0ZXJuIENBUkQ4IHBfaW5iKENBUkQxNiBwb3J0KTsKLWV4dGVybiBDQVJEMTYgcF9pbncoQ0FSRDE2IHBvcnQpOwotZXh0ZXJuIENBUkQzMiBwX2lubChDQVJEMTYgcG9ydCk7Ci1leHRlcm4gdm9pZCBwX291dGIoQ0FSRDE2IHBvcnQsIENBUkQ4IHZhbCk7Ci1leHRlcm4gdm9pZCBwX291dHcoQ0FSRDE2IHBvcnQsIENBUkQxNiB2YWwpOwotZXh0ZXJuIHZvaWQgcF9vdXRsKENBUkQxNiBwb3J0LCBDQVJEMzIgdmFsKTsKLSNpZmRlZiBfX2FscGhhX18KLWV4dGVybiBDQVJEOCBhX2luYihDQVJEMTYgcG9ydCk7Ci1leHRlcm4gQ0FSRDE2IGFfaW53KENBUkQxNiBwb3J0KTsKLWV4dGVybiB2b2lkIGFfb3V0YihDQVJEMTYgcG9ydCwgQ0FSRDggdmFsKTsKLWV4dGVybiB2b2lkIGFfb3V0dyhDQVJEMTYgcG9ydCwgQ0FSRDE2IHZhbCk7Ci0jZW5kaWYKLSNpZmRlZiBfX2FscGhhX18KLUNBUkQ4IG1lbV9yYihDQVJEMzIgYWRkcik7Ci1DQVJEMTYgbWVtX3J3KENBUkQzMiBhZGRyKTsKLUNBUkQzMiBtZW1fcmwoQ0FSRDMyIGFkZHIpOwotdm9pZCBtZW1fd2IoQ0FSRDMyIGFkZHIsIENBUkQ4IHZhbCk7Ci12b2lkIG1lbV93dyhDQVJEMzIgYWRkciwgQ0FSRDE2IHZhbCk7Ci12b2lkIG1lbV93bChDQVJEMzIgYWRkciwgQ0FSRDMyIHZhbCk7Ci0jZW5kaWYKLWV4dGVybiB2b2lkIGlvX3N0YXRpc3RpY3Modm9pZCk7Ci1leHRlcm4gdm9pZCBjbGVhcl9zdGF0KHZvaWQpOwotZXh0ZXJuIGludCBpbnRfaGFuZGxlcihpbnQgbnVtLCBzdHJ1Y3QgcmVnczg2ICpyZWdzKTsKLQotZXh0ZXJuIGNvbnNvbGUgb3Blbl9jb25zb2xlKHZvaWQpOwotZXh0ZXJuIHZvaWQgY2xvc2VfY29uc29sZShjb25zb2xlKTsKLQotZXh0ZXJuIHZvaWQgZHByaW50KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0KLWV4dGVybiBCb29sIGxvZ2dpbmc7Ci1leHRlcm4gQm9vbCBub3N0ZG91dDsKLWV4dGVybiBjaGFyKiBsb2dmaWxlOwotZXh0ZXJuIHZvaWQgbG9nb24odm9pZCogcHRyKTsKLWV4dGVybiB2b2lkIGxvZ29mZigpOwotZXh0ZXJuIHZvaWQgbHByaW50Zihjb25zdCBjaGFyICpmLCAuLi4pOwotCi0jZGVmaW5lIE1FTV9GSUxFICIvZGV2L21lbSIKLSNkZWZpbmUgREVGQVVMVF9WX0JJT1MgMHhjMDAwMAotI2lmbmRlZiBWX0JJT1MKLSNkZWZpbmUgVl9CSU9TIERFRkFVTFRfVl9CSU9TCi0jZW5kaWYKLQotI2lmZGVmIF9fYWxwaGFfXwotI2RlZmluZSBORUVEX1BDSV9JTwotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy93b3JraW5nX2NhcmRzIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy93b3JraW5nX2NhcmRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzUzZjI0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvd29ya2luZ19jYXJkcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotRGF2aWQgTW9ucm86ICAgICAgICAgICAgICAgICAgICBUcmlkZW50IFRHVUkgOTQ0MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXJnZS9WWCAoRGlhbW9uZCBTdGVhbHRoIDNEIDM0MDApICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpdmEgVE5UIChEaWFtb25kIFZpcGVyIFY1NTApICAgbm8gdmJpb3M/Ci1KYXJubyBQYWFuYW5lbiA8anBhYW5hQHMyLm9yZz46IEd1aWxsZW1vdCBNYXhpZ2FtZXIgWGVudG9yIDMyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlZJRElBIFROVDIgVWx0cmEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0aXZlIEdyYXBoaWNzIEJsYXN0ZXIgRXh4dHJlbWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQZXJtZWRpYSAyKSAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MveDg2ZW11LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3g4NmVtdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWM5OWQ3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MveDg2ZW11LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgotICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci0gKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCi0gKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAotICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLSAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLSAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLSNpbmNsdWRlICJkZWJ1Zy5oIgotCi0jZGVmaW5lIElGX01BU0sgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgVklGX01BU0sgICAgMHgwMDA4MDAwMCAgLyogdmlydHVhbCBpbnRlcnJ1cHQgZmxhZyAqLwotI2RlZmluZSBWSVBfTUFTSyAgICAweDAwMTAwMDAwICAvKiB2aXJ0dWFsIGludGVycnVwdCBwZW5kaW5nICovCi0KLSNpbmNsdWRlIDwvdXNyL2luY2x1ZGUvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0vKiNpbmNsdWRlIDxzeXNjYWxsLWxpc3QuaD4gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2lmZGVmIF9fYWxwaGFfXwotI2luY2x1ZGUgPHN5cy9pby5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c2V0am1wLmg+Ci0jaW5jbHVkZSAiQXNtTWFjcm9zLmgiCi0jaW5jbHVkZSAidjg2Ymlvcy5oIgotIyBkZWZpbmUgREVCVUcKLSNpbmNsdWRlICJ4ODZlbXUuaCIKLSN1bmRlZiBERUJVRwotCi0jZGVmaW5lIE0gICAgICAgICAgICBfWDg2RU1VX2VudgotI2RlZmluZSBDUFVfUkVHKHJlZykgTS54ODYuUl8jI3JlZwotCi1zdHJ1Y3QgcGlvIFA7Ci0KLXZvaWQKLXNldHVwX2lvKHZvaWQpCi17Ci0gICAgaWYgKCFDb25maWcuUHJpbnRQb3J0ICYmICFDb25maWcuSW9TdGF0aXN0aWNzKSB7Ci0KLSNpZiBkZWZpbmVkIChfX2kzODZfXykKLSAgICBQLmluYiA9ICh1OCgqKSh1MTYpKWluYjsKLSAgICBQLmludyA9ICh1MTYoKikodTE2KSlpbnc7Ci0gICAgUC5vdXRiID0gKHZvaWQoKikodTE2LHU4KSlvdXRiOwotICAgIFAub3V0dyA9ICh2b2lkKCopKHUxNix1MTYpKW91dHc7Ci0jZWxzZQotICAgIFAuaW5iID0gcF9pbmI7Ci0gICAgUC5pbncgPSBwX2ludzsKLSAgICBQLm91dGIgPSBwX291dGI7Ci0gICAgUC5vdXR3ID0gcF9vdXR3OwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoX19pMzg2X18pICYmICEgZGVmaW5lZChORUVEX1BDSV9JTykKLSAgICBQLmlubCA9ICh1MzIoKikodTE2KSlpbmw7Ci0gICAgUC5vdXRsID0gKHZvaWQoKikodTE2LHUzMikpb3V0bDsKLSNlbHNlCi0gICAgUC5pbmwgPSBwX2lubDsKLSAgICBQLm91dGwgPSBwX291dGw7Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotICAgIFAuaW5iID0gcF9pbmI7Ci0gICAgUC5pbncgPSBwX2ludzsKLSAgICBQLmlubCA9IHBfaW5sOwotICAgIFAub3V0YiA9IHBfb3V0YjsKLSAgICBQLm91dHcgPSBwX291dHc7Ci0gICAgUC5vdXRsID0gcF9vdXRsOwotICAgIH0KLX0KLQotdm9pZAoteDg2ZW11X2RvX2ludChpbnQgbnVtKQotewotICAgIHN0cnVjdCByZWdzODYgcmVnczsKLQotICAgIGlfcHJpbnRmKCJpbnQgMHgleCByZWNlaXZlZDogYXg6MHgleCIsbnVtLENQVV9SRUcoQVgpKTsKLSAgICBpZiAoQ29uZmlnLlByaW50SXApCi0JaV9wcmludGYoIiBhdDogMHgleFxuIixnZXRJUCgpKTsKLSAgICBlbHNlCi0JaV9wcmludGYoIlxuIik7Ci0KLSAgICAvKiB0cnkgdG8gcnVuIGJpb3MgaW50ZXJydXB0ICovCi0KLSAgICAvKiBpZiBub3QgaW5zdGFsbGVkIGZhbGwgYmFjayAqLwotI2RlZmluZSBDT1BZKHgseSkgcmVncy55ID0gTS54ODYueAotI2RlZmluZSBDT1BZX1IoeCx5KSBNLng4Ni54ID0gcmVncy55Ci0KLSAgICBDT1BZKFJfRUFYLGVheCk7Ci0gICAgQ09QWShSX0VCWCxlYngpOwotICAgIENPUFkoUl9FQ1gsZWN4KTsKLSAgICBDT1BZKFJfRURYLGVkeCk7Ci0gICAgQ09QWShSX0VTSSxlc2kpOwotICAgIENPUFkoUl9FREksZWRpKTsKLSAgICBDT1BZKFJfRUJQLGVicCk7Ci0gICAgQ09QWShSX0VJUCxlaXApOwotICAgIENPUFkoUl9FU1AsZXNwKTsKLSAgICBDT1BZKFJfQ1MsY3MpOwotICAgIENPUFkoUl9TUyxzcyk7Ci0gICAgQ09QWShSX0RTLGRzKTsKLSAgICBDT1BZKFJfRVMsZXMpOwotICAgIENPUFkoUl9GUyxmcyk7Ci0gICAgQ09QWShSX0dTLGdzKTsKLSAgICBDT1BZKFJfRUZMRyxlZmxhZ3MpOwotCi0gICAgaWYgKCEoaW50X2hhbmRsZXIobnVtLCZyZWdzKSkpIHsKLQlpZiAoIXJ1bl9iaW9zX2ludChudW0sJnJlZ3MpKQotCSAgICBnb3RvIHVua25vd25faW50OwotCWVsc2UKLQkgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENPUFlfUihSX0VBWCxlYXgpOwotICAgIENPUFlfUihSX0VCWCxlYngpOwotICAgIENPUFlfUihSX0VDWCxlY3gpOwotICAgIENPUFlfUihSX0VEWCxlZHgpOwotICAgIENPUFlfUihSX0VTSSxlc2kpOwotICAgIENPUFlfUihSX0VESSxlZGkpOwotICAgIENPUFlfUihSX0VCUCxlYnApOwotICAgIENPUFlfUihSX0VJUCxlaXApOwotICAgIENPUFlfUihSX0VTUCxlc3ApOwotICAgIENPUFlfUihSX0NTLGNzKTsKLSAgICBDT1BZX1IoUl9TUyxzcyk7Ci0gICAgQ09QWV9SKFJfRFMsZHMpOwotICAgIENPUFlfUihSX0VTLGVzKTsKLSAgICBDT1BZX1IoUl9GUyxmcyk7Ci0gICAgQ09QWV9SKFJfR1MsZ3MpOwotICAgIENPUFlfUihSX0VGTEcsZWZsYWdzKTsKLSAgICByZXR1cm47Ci0KLSB1bmtub3duX2ludDoKLSAgICBmcHJpbnRmKHN0ZGVyciwiXG5Vbmtub3duIHZtODZfaW50OiAlWFxuXG4iLG51bSk7Ci0gICAgWDg2RU1VX2hhbHRfc3lzKCk7Ci0gICAgcmV0dXJuOwotCi0jdW5kZWYgQ09QWQotI3VuZGVmIENPUFlfUgotfQotCi12b2lkCi1zZXR1cF94ODZlbXUodW5zaWduZWQgbG9uZyBiaW9zX3N0YXJ0LCBpODZiaW9zUmVnc1B0ciByZWdzKQotewotICAgIGludCBpOwotICAgIENBUkQzMiBlaXA7Ci0gICAgQ0FSRDE2IGNzOwotICAgIFg4NkVNVV9pbnRyRnVuY3MgaW50RnVuY3NbMjU2XTsKLQotICAgIFg4NkVNVV9waW9GdW5jcyBwaW9GdW5jcyA9IHsKLQkodTgoKikodTE2KSlQLmluYiwKLQkodTE2KCopKHUxNikpUC5pbncsCi0JKHUzMigqKSh1MTYpKVAuaW5sLAotCSh2b2lkKCopKHUxNix1OCkpUC5vdXRiLAotCSh2b2lkKCopKHUxNix1MTYpKVAub3V0dywKLQkodm9pZCgqKSh1MTYsdTMyKSlQLm91dGwKLSAgICB9OwotI2lmZGVmIF9fYWxwaGFfXwotICAgIFg4NkVNVV9tZW1GdW5jcyBtZW1GdW5jcyA9IHsKLSAgICAgICh1OCgqKSh1MzIpKW1lbV9yYiwKLSAgICAgICh1MTYoKikodTMyKSltZW1fcncsCi0gICAgICAodTMyKCopKHUzMikpbWVtX3JsLAotICAgICAgKHZvaWQoKikodTMyLHU4KSltZW1fd2IsCi0gICAgICAodm9pZCgqKSh1MzIsdTE2KSltZW1fd3csCi0gICAgICAodm9pZCgqKSh1MzIsdTMyKSltZW1fd2wKLSAgICB9OwotI2VuZGlmCi0gICAgTS5tZW1fYmFzZSA9IDA7Ci0gICAgTS5tZW1fc2l6ZSA9IDEwMjQqMTAyNCArIDEwMjQ7Ci0gICAgLyogIE0ueDg2LmRlYnVnID0gREVCVUdfRElTQVNTRU1CTEVfRiB8IERFQlVHX1RSQUNFX0YgfCBERUJVR19ERUNPREVfRjsgKi8KLSAgICAvKiAgTS54ODYuZGVidWcgfD0gREVCVUdfREVDT0RFX0YgfCAgREVCVUdfVFJBQ0VfRjsgKi8KLS8qCi0gKiBGb3Igc2luZ2xlIHN0ZXAgdHJhY2luZyBjb21waWxlIHg4NmVtdSB3aXRoIG9wdGlvbiAtRERFQlVHCi0gKi8KLSAgICBNLng4Ni5kZWJ1ZyA9IDA7Ci0gICAgaWYgKENvbmZpZy5QcmludElwKQotCU0ueDg2LmRlYnVnID0gREVCVUdfU0FWRV9DU19JUDsKLQotICAgIGlmIChDb25maWcuVHJhY2UpCi0JWDg2RU1VX3RyYWNlX29uKCk7Ci0KLSAgICBYODZFTVVfc2V0dXBQaW9GdW5jcygmcGlvRnVuY3MpOwotI2lmZGVmIF9fYWxwaGFfXwotICAgIFg4NkVNVV9zZXR1cE1lbUZ1bmNzKCZtZW1GdW5jcyk7Ci0jZW5kaWYKLSAgICBmb3IgKGk9MDtpPDI1NjtpKyspCi0JaW50RnVuY3NbaV0gPSB4ODZlbXVfZG9faW50OwotICAgIFg4NkVNVV9zZXR1cEludHJGdW5jcyhpbnRGdW5jcyk7Ci0KLSAgICBlaXAgPSBiaW9zX3N0YXJ0ICYgMHhGRkZGOwotICAgIGNzID0gKGJpb3Nfc3RhcnQgJiAweEZGMDAwMCkgPj4gNDsKLQotICAgIENQVV9SRUcoRUFYKSA9IHJlZ3MtPmF4OwotICAgIENQVV9SRUcoRUJYKSA9IHJlZ3MtPmJ4OwotICAgIENQVV9SRUcoRUNYKSA9IHJlZ3MtPmN4OwotICAgIENQVV9SRUcoRURYKSA9IHJlZ3MtPmR4OwotICAgIENQVV9SRUcoRVNJKSA9IHJlZ3MtPnNpOwotICAgIENQVV9SRUcoRURJKSA9IHJlZ3MtPmRpOwotICAgIENQVV9SRUcoRUJQKSA9IDA7Ci0gICAgQ1BVX1JFRyhFSVApID0gZWlwOwotICAgIENQVV9SRUcoQ1MpID0gY3M7Ci0gICAgQ1BVX1JFRyhTUCkgPSAweDEwMDsKLSAgICBDUFVfUkVHKFNTKSA9IDB4MzA7ICAgICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgc3RhbmRhcmQgcGMgYmlvcyBzdGFjayAqLwotICAgIENQVV9SRUcoRVMpID0gcmVncy0+ZXM7Ci0gICAgQ1BVX1JFRyhEUykgPSByZWdzLT5kczsKLSAgICBDUFVfUkVHKEZTKSA9IDA7Ci0gICAgQ1BVX1JFRyhHUykgPSAwOwotICAgIENQVV9SRUcoRUZMRykgfD0gKFZJRl9NQVNLIHwgVklQX01BU0sgfCBJRl9NQVNLIHwgMHgyKTsKLX0KLQotdm9pZAotY29sbGVjdF9iaW9zX3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncykKLXsKLSAgICByZWdzLT5heCA9IENQVV9SRUcoRUFYKTsKLSAgICByZWdzLT5ieCA9IENQVV9SRUcoRUJYKTsKLSAgICByZWdzLT5jeCA9IENQVV9SRUcoRUNYKTsKLSAgICByZWdzLT5keCA9IENQVV9SRUcoRURYKTsKLSAgICByZWdzLT5lcyA9IENQVV9SRUcoRVMpOwotICAgIHJlZ3MtPmRzID0gQ1BVX1JFRyhEUyk7Ci0gICAgcmVncy0+ZGkgPSBDUFVfUkVHKEVESSk7Ci0gICAgcmVncy0+c2kgPSBDUFVfUkVHKEVTSSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb194ODZlbXUodm9pZCkKLXsKLSAgICBYODZFTVVfZXhlYygpOwotfQotCi1zdGF0aWMgam1wX2J1ZiB4ODZfZXNjOwotc3RhdGljIHZvaWQKLXZtZXhpdChpbnQgdW51c2VkKQotewotICAgIGxvbmdqbXAoeDg2X2VzYywxKTsKLX0KLQotdm9pZAotZG9feDg2KHVuc2lnbmVkIGxvbmcgYmlvc19zdGFydCwgaTg2Ymlvc1JlZ3NQdHIgcmVncykKLXsKLSAgICBzdGF0aWMgdm9pZCAoKm9yZ19oYW5kbGVyKShpbnQpOwotCi0gICAgc2V0dXBfeDg2ZW11KGJpb3Nfc3RhcnQscmVncyk7Ci0gICAgaWYgKHNldGptcCh4ODZfZXNjKSA9PSAwKSB7Ci0Jb3JnX2hhbmRsZXIgPSBzaWduYWwoMix2bWV4aXQpOwotCWRvX3g4NmVtdSgpOwotCXNpZ25hbCgyLG9yZ19oYW5kbGVyKTsKLQljb2xsZWN0X2Jpb3NfcmVncyhyZWdzKTsKLSAgICB9IGVsc2UgewotCXNpZ25hbCgyLG9yZ19oYW5kbGVyKTsKLQlwcmludGYoImludGVycnVwdGVkIGF0IDB4JXhcbiIsKChDQVJEMTYpQ1BVX1JFRyhDUykpIDw8IDQKLQkgICAgICAgfCAoQ0FSRDE2KUNQVV9SRUcoRUlQKSk7Ci0gICAgfQotfQotCi1pbnQKLXJ1bl9iaW9zX2ludChpbnQgbnVtLCBzdHJ1Y3QgcmVnczg2ICpyZWdzKQotewotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBzdGF0aWMgaW50IGZpcnN0dGltZSA9IDE7Ci0jZW5kaWYKLSAgICAvKiBjaGVjayBpZiBiaW9zIHZlY3RvciBpcyBpbml0aWFsaXplZCAqLwotICAgIGlmICgoKENBUkQxNiopMClbKG51bTw8MSkrMV0gPT0gMHgwMDAwKSB7IC8qIFNZU19CSU9TX1NFRyA/Ki8KLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0JaV9wcmludGYoImNhcmQgQklPUyBub3QgbG9hZGVkXG4iKTsKLSNlbmRpZgotCXJldHVybiAwOwotICAgIH0KLQotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBpZiAoZmlyc3R0aW1lKSB7Ci0JZHByaW50KDAsMHgzRDApOwotCWZpcnN0dGltZSA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpX3ByaW50ZigiY2FsbGluZyBjYXJkIEJJT1MgYXQ6ICIpOwotICAgIGlfcHJpbnRmKCIweCV4OiV4XG4iLCgoQ0FSRDE2ICopIDApWyhudW0gPDwgMSkgKyAxXSwKLQkgICAgIChDQVJEMzIpKChDQVJEMTYgKikgMClbbnVtIDw8IDFdKTsKLSAgICBYODZFTVVfcHJlcGFyZUZvckludChudW0pOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLUNBUkQzMgotZ2V0SW50VmVjdChpbnQgbnVtKQotewotICByZXR1cm4gKChDQVJEMzIqKTApW251bV07Ci19Ci0jaWYgMAotdm9pZAotcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIHZhX2xpc3QgYXJncHRyOwotICAgIHZhX3N0YXJ0KGFyZ3B0ciwgZm10KTsKLSAgICB2ZnByaW50ZihzdGRvdXQsIGZtdCwgYXJncHRyKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICB2YV9lbmQoYXJncHRyKTsKLX0KLSNlbmRpZgotCi1DQVJEMzIKLWdldElQKHZvaWQpCi17Ci0gICAgcmV0dXJuIChNLng4Ni5zYXZlZF9jcyA8PCA0KSArIE0ueDg2LnNhdmVkX2lwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L0xJQ0VOU0UgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlZGU0YS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICBMaWNlbnNlIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgeDg2ZW11IGxpYnJhcnkgaXMgdW5kZXIgYSBCU0Qgc3R5bGUgbGljZW5zZSwgY29tYXB0aWJsZQotd2l0aCB0aGUgWEZyZWU4NiBhbmQgWCBsaWNlbnNlcyB1c2VkIGJ5IFhGcmVlODYuIFRoZQotb3JpZ2luYWwgeDg2ZW11IGxpYnJhcmllcyB3ZXJlIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UuIER1ZSB0byBsaWNlbnNlIGluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4gdGhlIEdQTAotYW5kIHRoZSBYRnJlZTg2IGxpY2Vuc2UsIHRoZSBvcmlnaW5hbCBhdXRob3JzIG9mIHRoZSBjb2RlCi1kZWNpZGVkIHRvIGFsbG93IGEgbGljZW5zZSBjaGFuZ2UuIElmIHlvdSBoYXZlIHN1Ym1pdHRlZAotY29kZSB0byB0aGUgb3JpZ2luYWwgeDg2ZW11IHByb2plY3QsIGFuZCB5b3UgZG9uJ3QgYWdyZWUKLXdpdGggdGhlIGxpY2Vuc2UgY2hhbmdlLCBwbGVhc2UgY29udGFjdCB1cyBhbmQgbGV0IHlvdQota25vdy4gWW91ciBjb2RlIHdpbGwgYmUgcmVtb3ZlZCB0byBjb21wbHkgd2l0aCB5b3VyIHdpc2hlcy4KLQotSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBhYm91dCB0aGlzLCBwbGVhc2Ugc2VuZCBlbWFpbCB0bwoteDg2ZW11QGxpbnV4bGFicy5jb20gb3IgS2VuZGFsbEJAc2NpdGVjaHNvZnQuY29tIGZvcgotY2xhcmlmaWNhdGlvbi4KLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L2RlYnVnLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1ZTZhYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvZGVidWcuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6CQlBTlNJIEMKLSogRW52aXJvbm1lbnQ6CUFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0byBoYW5kbGUgZGVidWdnaW5nIG9mIHRoZQotKgkJCQllbXVsYXRvci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgREVCVUcKLQotc3RhdGljIHZvaWQgICAgIHByaW50X2VuY29kZWRfYnl0ZXMgKHUxNiBzLCB1MTYgbyk7Ci1zdGF0aWMgdm9pZCAgICAgcHJpbnRfZGVjb2RlZF9pbnN0cnVjdGlvbiAodm9pZCk7Ci1zdGF0aWMgaW50ICAgICAgcGFyc2VfbGluZSAoY2hhciAqcywgaW50ICpwcywgaW50ICpuKTsKLQotLyogc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgZGVidWcncyBvdXRwdXQuICovCi12b2lkIFg4NkVNVV90cmFjZV9yZWdzICh2b2lkKQotewotCWlmIChERUJVR19UUkFDRSgpKSB7Ci0JCXg4NmVtdV9kdW1wX3JlZ3MoKTsKLSAgICB9Ci0JaWYgKERFQlVHX0RFQ09ERSgpICYmICEgREVCVUdfREVDT0RFX05PUFJJTlQoKSkgewotCQlwcmludGsoIiUwNHg6JTA0eCAiLE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCk7Ci0JCXByaW50X2VuY29kZWRfYnl0ZXMoIE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCk7Ci0JCXByaW50X2RlY29kZWRfaW5zdHJ1Y3Rpb24oKTsKLSAgICB9Ci19Ci0KLXZvaWQgWDg2RU1VX3RyYWNlX3hyZWdzICh2b2lkKQotewotCWlmIChERUJVR19UUkFDRSgpKSB7Ci0JCXg4NmVtdV9kdW1wX3hyZWdzKCk7Ci0gICAgfQotfQotCi12b2lkIHg4NmVtdV9qdXN0X2Rpc2Fzc2VtYmxlICh2b2lkKQotewotICAgIC8qCi0gICAgICogVGhpcyByb3V0aW5lIGNhbGxlZCBpZiB0aGUgZmxhZyBERUJVR19ESVNBU1NFTUJMRSBpcyBzZXQga2luZAotICAgICAqIG9mIGEgaGFjayEKLSAgICAgKi8KLQlwcmludGsoIiUwNHg6JTA0eCAiLE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCk7Ci0JcHJpbnRfZW5jb2RlZF9ieXRlcyggTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwKTsKLQlwcmludF9kZWNvZGVkX2luc3RydWN0aW9uKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpc2Fzc2VtYmxlX2ZvcndhcmQgKHUxNiBzZWcsIHUxNiBvZmYsIGludCBuKQotewotCVg4NkVNVV9zeXNFbnYgdHJlZ3M7Ci0JaW50IGk7Ci0JdTggb3AxOwotICAgIC8qCi0gICAgICogaGFjaywgaGFjaywgaGFjay4gIFdoYXQgd2UgZG8gaXMgdXNlIHRoZSBleGFjdCBtYWNoaW5lcnkgc2V0IHVwCi0gICAgICogZm9yIGV4ZWN1dGlvbiwgZXhjZXB0IHRoYXQgbm93IHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgc3RhdGUKLSAgICAgKiBmbGFnIGFzc29jaWF0ZWQgd2l0aCB0aGUgImV4ZWN1dGlvbiIsIGFuZCB3ZSBhcmUgdXNpbmcgYSBjb3B5Ci0gICAgICogb2YgdGhlIHJlZ2lzdGVyIHN0cnVjdC4gIEFsbCB0aGUgbWFqb3Igb3Bjb2Rlcywgb25jZSBmdWxseQotICAgICAqIGRlY29kZWQsIGhhdmUgdGhlIGZvbGxvd2luZyB0d28gc3RlcHM6IFRSQUNFX1JFR1MocixtKTsKLSAgICAgKiBTSU5HTEVfU1RFUChyLG0pOyB3aGljaCBkaXNhcHBlYXIgaWYgREVCVUcgaXMgbm90IGRlZmluZWQgdG8KLSAgICAgKiB0aGUgcHJlcHJvY2Vzc29yLiAgVGhlIFRSQUNFX1JFR1MgbWFjcm8gZXhwYW5kcyB0bzoKLSAgICAgKgotICAgICAqIGlmIChkZWJ1ZyZERUJVR19ESVNBU1NFTUJMRSkKLSAgICAgKiAgICAge2p1c3RfZGlzYXNzZW1ibGUoKTsgZ290byBFbmRPZkluc3RydWN0aW9uO30KLSAgICAgKiAgICAgaWYgKGRlYnVnJkRFQlVHX1RSQUNFKSB0cmFjZV9yZWdzKHIsbSk7Ci0gICAgICoKLSAgICAgKiAuLi4uLi4gIGFuZCBhdCB0aGUgbGFzdCBsaW5lIG9mIHRoZSByb3V0aW5lLgotICAgICAqCi0gICAgICogRW5kT2ZJbnN0cnVjdGlvbjogZW5kX2luc3RyKCk7Ci0gICAgICoKLSAgICAgKiBVcCB0byB0aGUgcG9pbnQgd2hlcmUgVFJBQ0VfUkVHIGlzIGV4cGFuZGVkLCBOTyBtb2RpZmljYXRpb25zCi0gICAgICogYXJlIGRvbmUgdG8gYW55IHJlZ2lzdGVyIEVYQ0VQVCB0aGUgSVAgcmVnaXN0ZXIsIGZvciBmZXRjaCBhbmQKLSAgICAgKiBkZWNvZGluZyBwdXJwb3Nlcy4KLSAgICAgKgotICAgICAqIFRoaXMgd2FzIGRvbmUgZm9yIGFuIGVudGlyZWx5IGRpZmZlcmVudCByZWFzb24sIGJ1dCBtYWtlcyBhCi0gICAgICogbmljZSB3YXkgdG8gZ2V0IHRoZSBzeXN0ZW0gdG8gaGVscCBkZWJ1ZyBjb2Rlcy4KLSAgICAgKi8KLQl0cmVncyA9IE07Ci0gICAgdHJlZ3MueDg2LlJfSVAgPSBvZmY7Ci0gICAgdHJlZ3MueDg2LlJfQ1MgPSBzZWc7Ci0KLSAgICAvKiByZXNldCB0aGUgZGVjb2RpbmcgYnVmZmVycyAqLwotICAgIHRyZWdzLng4Ni5lbmNfc3RyX3BvcyA9IDA7Ci0gICAgdHJlZ3MueDg2LmVuY19wb3MgPSAwOwotCi0gICAgLyogdHVybiBvbiB0aGUgImRpc2Fzc2VtYmxlIG9ubHksIG5vIGV4ZWN1dGUiIGZsYWcgKi8KLSAgICB0cmVncy54ODYuZGVidWcgfD0gREVCVUdfRElTQVNTRU1CTEVfRjsKLQotICAgIC8qIERVTVAgTkVYVCBuIGluc3RydWN0aW9ucyB0byBzY3JlZW4gaW4gc3RyYWlnaHRfbGluZSBmYXNoaW9uICovCi0gICAgLyoKLSAgICAgKiBUaGlzIGxvb2tzIGxpa2UgdGhlIHJlZ3VsYXIgaW5zdHJ1Y3Rpb24gZmV0Y2ggc3RyZWFtLCBleGNlcHQKLSAgICAgKiB0aGF0IHdoZW4gdGhpcyBvY2N1cnMsIGVhY2ggZmV0Y2hlZCBvcGNvZGUsIHVwb24gc2VlaW5nIHRoZQotICAgICAqIERFQlVHX0RJU0FTU0VNQkxFIGZsYWcgc2V0LCBleGl0cyBpbW1lZGlhdGVseSBhZnRlciBkZWNvZGluZwotICAgICAqIHRoZSBpbnN0cnVjdGlvbi4gIFhYWCAtLS0gQ0hFQ0sgVEhBVCBNRU0gSVMgTk9UIEFGRkVDVEVEISEhCi0gICAgICogTm90ZSB0aGUgdXNlIG9mIGEgY29weSBvZiB0aGUgcmVnaXN0ZXIgc3RydWN0dXJlLi4uCi0gICAgICovCi0gICAgZm9yIChpPTA7IGk8bjsgaSsrKSB7Ci0JCW9wMSA9ICgqc3lzX3JkYikoKCh1MzIpTS54ODYuUl9DUzw8NCkgKyAoTS54ODYuUl9JUCsrKSk7Ci0JCSh4ODZlbXVfb3B0YWJbb3AxXSkob3AxKTsKLSAgICB9Ci0gICAgLyogZW5kIG1ham9yIGhhY2sgbW9kZS4gKi8KLX0KLQotdm9pZCB4ODZlbXVfY2hlY2tfaXBfYWNjZXNzICh2b2lkKQotewotICAgIC8qIE5VTEwgYXMgb2Ygbm93ICovCi19Ci0KLXZvaWQgeDg2ZW11X2NoZWNrX3NwX2FjY2VzcyAodm9pZCkKLXsKLX0KLQotdm9pZCB4ODZlbXVfY2hlY2tfbWVtX2FjY2VzcyAodTMyIGR1bW15KQotewotCS8qICBjaGVjayBib3VuZHMsIGV0YyAqLwotfQotCi12b2lkIHg4NmVtdV9jaGVja19kYXRhX2FjY2VzcyAodWludCBkdW1teTEsIHVpbnQgZHVtbXkyKQotewotCS8qICBjaGVjayBib3VuZHMsIGV0YyAqLwotfQotCi12b2lkIHg4NmVtdV9pbmNfZGVjb2RlZF9pbnN0X2xlbiAoaW50IHgpCi17Ci0JTS54ODYuZW5jX3BvcyArPSB4OwotfQotCi12b2lkIHg4NmVtdV9kZWNvZGVfcHJpbnRmIChjaGFyICp4KQotewotCXNwcmludGYoTS54ODYuZGVjb2RlZF9idWYrTS54ODYuZW5jX3N0cl9wb3MsIiVzIix4KTsKLQlNLng4Ni5lbmNfc3RyX3BvcyArPSBzdHJsZW4oeCk7Ci19Ci0KLXZvaWQgeDg2ZW11X2RlY29kZV9wcmludGYyIChjaGFyICp4LCBpbnQgeSkKLXsKLQljaGFyIHRlbXBbMTAwXTsKLQlzcHJpbnRmKHRlbXAseCx5KTsKLQlzcHJpbnRmKE0ueDg2LmRlY29kZWRfYnVmK00ueDg2LmVuY19zdHJfcG9zLCIlcyIsdGVtcCk7Ci0JTS54ODYuZW5jX3N0cl9wb3MgKz0gc3RybGVuKHRlbXApOwotfQotCi12b2lkIHg4NmVtdV9lbmRfaW5zdHIgKHZvaWQpCi17Ci0JTS54ODYuZW5jX3N0cl9wb3MgPSAwOwotCU0ueDg2LmVuY19wb3MgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBwcmludF9lbmNvZGVkX2J5dGVzICh1MTYgcywgdTE2IG8pCi17Ci0gICAgaW50IGk7Ci0gICAgY2hhciBidWYxWzY0XTsKLQlmb3IgKGk9MDsgaTwgTS54ODYuZW5jX3BvczsgaSsrKSB7Ci0JCXNwcmludGYoYnVmMSsyKmksIiUwMngiLCBmZXRjaF9kYXRhX2J5dGVfYWJzKHMsbytpKSk7Ci0gICAgfQotCXByaW50aygiJS0yMHMiLGJ1ZjEpOwotfQotCi1zdGF0aWMgdm9pZCBwcmludF9kZWNvZGVkX2luc3RydWN0aW9uICh2b2lkKQotewotCXByaW50aygiJXMiLCBNLng4Ni5kZWNvZGVkX2J1Zik7Ci19Ci0KLXZvaWQgeDg2ZW11X3ByaW50X2ludF92ZWN0ICh1MTYgaXYpCi17Ci0JdTE2IHNlZyxvZmY7Ci0KLQlpZiAoaXYgPiAyNTYpIHJldHVybjsKLQlzZWcgICA9IGZldGNoX2RhdGFfd29yZF9hYnMoMCxpdio0KTsKLQlvZmYgICA9IGZldGNoX2RhdGFfd29yZF9hYnMoMCxpdio0KzIpOwotCXByaW50aygiJTA0eDolMDR4ICIsIHNlZywgb2ZmKTsKLX0KLQotdm9pZCBYODZFTVVfZHVtcF9tZW1vcnkgKHUxNiBzZWcsIHUxNiBvZmYsIHUzMiBhbXQpCi17Ci0gICAgdTMyIHN0YXJ0ID0gb2ZmICYgMHhmZmZmZmZmMDsKLSAgICB1MzIgZW5kICA9IChvZmYrMTYpICYgMHhmZmZmZmZmMDsKLSAgICB1MzIgaTsKLSAgICB1MzIgY3VycmVudDsKLQotICAgIGN1cnJlbnQgPSBzdGFydDsKLSAgICB3aGlsZSAoZW5kIDw9IG9mZiArIGFtdCkgewotCXByaW50aygiJTA0eDolMDR4ICIsIHNlZywgc3RhcnQpOwotCWZvciAoaT1zdGFydDsgaTwgb2ZmOyBpKyspCi0JICAgIHByaW50aygiICAgIik7Ci0JZm9yICggICAgICAgOyBpPCBlbmQ7IGkrKykKLQkgICAgcHJpbnRrKCIlMDJ4ICIsIGZldGNoX2RhdGFfYnl0ZV9hYnMoc2VnLGkpKTsKLQlwcmludGsoIlxuIik7Ci0Jc3RhcnQgPSBlbmQ7Ci0JZW5kID0gc3RhcnQgKyAxNjsKLSAgICB9Ci19Ci0KLXZvaWQgeDg2ZW11X3NpbmdsZV9zdGVwICh2b2lkKQotewotICAgIGNoYXIgc1sxMDI0XTsKLSAgICBpbnQgcHNbMTBdOwotICAgIGludCBudG9rOwotICAgIGludCBjbWQ7Ci0gICAgaW50IGRvbmU7Ci0JCWludCBzZWdtZW50OwotICAgIGludCBvZmZzZXQ7Ci0gICAgc3RhdGljIGludCBicmVha3BvaW50OwotICAgIHN0YXRpYyBpbnQgbm9EZWNvZGUgPSAxOwotCi0gICAgY2hhciAqcDsKLQotICAgIGlmIChERUJVR19CUkVBSygpKSB7Ci0JaWYgKE0ueDg2LnNhdmVkX2lwICE9IGJyZWFrcG9pbnQpIHsKLQkgICAgcmV0dXJuOwotCX0gZWxzZSB7Ci0JICAgIE0ueDg2LmRlYnVnICY9IH5ERUJVR19ERUNPREVfTk9QUklOVF9GOwotCSAgICBNLng4Ni5kZWJ1ZyB8PSBERUJVR19UUkFDRV9GOwotCSAgICBNLng4Ni5kZWJ1ZyAmPSB+REVCVUdfQlJFQUtfRjsKLQkgICAgcHJpbnRfZGVjb2RlZF9pbnN0cnVjdGlvbiAoKTsKLQkgICAgWDg2RU1VX3RyYWNlX3JlZ3MoKTsKLQl9Ci0gICAgfQotCi0gICAgZG9uZT0wOwotICAgIG9mZnNldCA9IE0ueDg2LnNhdmVkX2lwOwotICAgIHdoaWxlICghZG9uZSkgewotCXByaW50aygiLSIpOwotCS8qcCA9IGZnZXRzKHMsIDEwMjMsIHN0ZGluKTsgKi8KLQljb25zX2dldHMocyk7Ci0JY21kID0gcGFyc2VfbGluZShzLCBwcywgJm50b2spOwotCXN3aXRjaChjbWQpIHsKLQljYXNlICd1JzoKLQkgICAgZGlzYXNzZW1ibGVfZm9yd2FyZChNLng4Ni5zYXZlZF9jcywodTE2KW9mZnNldCwxMCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgICBpZiAobnRvayA9PSAyKSB7Ci0JCXNlZ21lbnQgPSBNLng4Ni5zYXZlZF9jczsKLQkJb2Zmc2V0ID0gcHNbMV07Ci0JCVg4NkVNVV9kdW1wX21lbW9yeShzZWdtZW50LCh1MTYpb2Zmc2V0LDE2KTsKLQkJb2Zmc2V0ICs9IDE2OwotCSAgICB9IGVsc2UgaWYgKG50b2sgPT0gMykgewotCQlzZWdtZW50ID0gcHNbMV07Ci0JCW9mZnNldCA9IHBzWzJdOwotCQlYODZFTVVfZHVtcF9tZW1vcnkoc2VnbWVudCwodTE2KW9mZnNldCwxNik7Ci0JCW9mZnNldCArPSAxNjsKLQkgICAgfSBlbHNlIHsKLQkJc2VnbWVudCA9IE0ueDg2LnNhdmVkX2NzOwotCQlYODZFTVVfZHVtcF9tZW1vcnkoc2VnbWVudCwodTE2KW9mZnNldCwxNik7Ci0JCW9mZnNldCArPSAxNjsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlICdjJzoKLQkgICAgTS54ODYuZGVidWcgXj0gREVCVUdfVFJBQ0VDQUxMX0Y7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgICBNLng4Ni5kZWJ1ZyBePSBERUJVR19TVkNfRiB8IERFQlVHX1NZU19GIHwgREVCVUdfU1lTSU5UX0Y7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgICBYODZFTVVfdHJhY2VfcmVncygpOwotCSAgICBicmVhazsKLQljYXNlICd4JzoKLQkgICAgWDg2RU1VX3RyYWNlX3hyZWdzKCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ2cnOgotCSAgICBpZiAobnRvayA9PSAyKSB7Ci0JCWJyZWFrcG9pbnQgPSBwc1sxXTsKLQkJcHJpbnRrKCJicmVha3BvaW50IHNldCB0byAweCVYXG4iLCBicmVha3BvaW50KTsKLQkJaWYgKG5vRGVjb2RlKSB7Ci0JCSAgICBNLng4Ni5kZWJ1ZyB8PSBERUJVR19ERUNPREVfTk9QUklOVF9GOwotCQl9IGVsc2UgewotCQkgICAgTS54ODYuZGVidWcgJj0gfkRFQlVHX0RFQ09ERV9OT1BSSU5UX0Y7Ci0JCX0KLQkJTS54ODYuZGVidWcgJj0gfkRFQlVHX1RSQUNFX0Y7Ci0JCU0ueDg2LmRlYnVnIHw9IERFQlVHX0JSRUFLX0Y7Ci0JCWRvbmUgPSAxOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgJ3EnOgotCSAgICBNLng4Ni5kZWJ1ZyB8PSBERUJVR19FWElUOwotCSAgICByZXR1cm47Ci0JY2FzZSAnUCc6Ci0JICAgIG5vRGVjb2RlID0gKG5vRGVjb2RlKT8wOjE7Ci0JICAgIHByaW50aygiVG9nZ2xlZCBkZWNvZGluZyB0byAlc1xuIiwobm9EZWNvZGUpPyJGQUxTRSI6IlRSVUUiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JY2FzZSAwOgotCSAgICBkb25lID0gMTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotaW50IFg4NkVNVV90cmFjZV9vbih2b2lkKQotewotCXJldHVybiBNLng4Ni5kZWJ1ZyB8PSBERUJVR19TVEVQX0YgfCBERUJVR19ERUNPREVfRiB8IERFQlVHX1RSQUNFX0Y7Ci19Ci0KLWludCBYODZFTVVfdHJhY2Vfb2ZmKHZvaWQpCi17Ci0JcmV0dXJuIE0ueDg2LmRlYnVnICY9IH4oREVCVUdfU1RFUF9GIHwgREVCVUdfREVDT0RFX0YgfCBERUJVR19UUkFDRV9GKTsKLX0KLQotc3RhdGljIGludCBwYXJzZV9saW5lIChjaGFyICpzLCBpbnQgKnBzLCBpbnQgKm4pCi17Ci0gICAgaW50IGNtZDsKLQotICAgICpuID0gMDsKLSAgICB3aGlsZSgqcyA9PSAnICcgfHwgKnMgPT0gJ1x0JykgcysrOwotICAgIHBzWypuXSA9ICpzOwotICAgIHN3aXRjaCAoKnMpIHsKLSAgICAgIGNhc2UgJ1xuJzoKLQkqbiArPSAxOwotCXJldHVybiAwOwotICAgICAgZGVmYXVsdDoKLQljbWQgPSAqczsKLQkqbiArPSAxOwotICAgIH0KLQotCXdoaWxlICgxKSB7Ci0JCXdoaWxlICgqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JyAmJiAqcyAhPSAnXG4nKSAgcysrOwotCi0JCWlmICgqcyA9PSAnXG4nKQotCQkJcmV0dXJuIGNtZDsKLQotCQl3aGlsZSgqcyA9PSAnICcgfHwgKnMgPT0gJ1x0JykgcysrOwotCi0JCXBzWypuXT1hdG9pKHMpOwotCQkvKnNzY2FuZihzLCIleCIsJnBzWypuXSk7ICovCi0JCSpuICs9IDE7Ci0JfQotfQotCi0jZW5kaWYgLyogREVCVUcgKi8KLQotdm9pZCB4ODZlbXVfZHVtcF9zdGFjayh2b2lkKQotewotICAgIGludCBpOwotICAgIHByaW50aygiU3RhY2s6ICIpOwotICAgIGZvciAoaSA9IDA7IGk8MTY7IGkrKykKLSAgICB7Ci0JdTggeCA9IGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9TUywgTS54ODYuUl9TUCArIGkpOwotCXByaW50aygiJTAyeCAiLCAoaW50KXgpOwotICAgIH0KLSAgICBwcmludGsoIlxuIik7Ci19Ci0KLXZvaWQgeDg2ZW11X2R1bXBfcmVncyAodm9pZCkKLXsKLQlwcmludGsoIlx0QVg9JTA0eCAgIiwgTS54ODYuUl9BWCApOwotCXByaW50aygiQlg9JTA0eCAgIiwgTS54ODYuUl9CWCApOwotCXByaW50aygiQ1g9JTA0eCAgIiwgTS54ODYuUl9DWCApOwotCXByaW50aygiRFg9JTA0eCAgIiwgTS54ODYuUl9EWCApOwotCXByaW50aygiU1A9JTA0eCAgIiwgTS54ODYuUl9TUCApOwotCXByaW50aygiQlA9JTA0eCAgIiwgTS54ODYuUl9CUCApOwotCXByaW50aygiU0k9JTA0eCAgIiwgTS54ODYuUl9TSSApOwotCXByaW50aygiREk9JTA0eFxuIiwgTS54ODYuUl9ESSApOwotCXByaW50aygiXHREUz0lMDR4ICAiLCBNLng4Ni5SX0RTICk7Ci0JcHJpbnRrKCJFUz0lMDR4ICAiLCBNLng4Ni5SX0VTICk7Ci0JcHJpbnRrKCJTUz0lMDR4ICAiLCBNLng4Ni5SX1NTICk7Ci0JcHJpbnRrKCJDUz0lMDR4ICAiLCBNLng4Ni5SX0NTICk7Ci0JcHJpbnRrKCJJUD0lMDR4ICAgIiwgTS54ODYuUl9JUCApOwotCWlmIChBQ0NFU1NfRkxBRyhGX09GKSkgICAgcHJpbnRrKCJPViAiKTsgICAgIC8qIENIRUNLRUQuLi4gKi8KLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJOViAiKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgIHByaW50aygiRE4gIik7Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiVVAgIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfSUYpKSAgICBwcmludGsoIkVJICIpOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkRJICIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX1NGKSkgICAgcHJpbnRrKCJORyAiKTsKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJQTCAiKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9aRikpICAgIHByaW50aygiWlIgIik7Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiTlogIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfQUYpKSAgICBwcmludGsoIkFDICIpOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIk5BICIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX1BGKSkgICAgcHJpbnRrKCJQRSAiKTsKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJQTyAiKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpICAgIHByaW50aygiQ1kgIik7Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiTkMgIik7Ci0JcHJpbnRrKCJcbiIpOwotCS8qeDg2ZW11X2R1bXBfc3RhY2soKTsgKi8KLX0KLQotdm9pZCB4ODZlbXVfZHVtcF94cmVncyAodm9pZCkKLXsKLQlwcmludGsoIlx0RUFYPSUwOHggICIsIE0ueDg2LlJfRUFYICk7Ci0JcHJpbnRrKCJFQlg9JTA4eCAgIiwgTS54ODYuUl9FQlggKTsKLQlwcmludGsoIkVDWD0lMDh4ICAiLCBNLng4Ni5SX0VDWCApOwotCXByaW50aygiRURYPSUwOHggIFxuIiwgTS54ODYuUl9FRFggKTsKLQlwcmludGsoIlx0RVNQPSUwOHggICIsIE0ueDg2LlJfRVNQICk7Ci0JcHJpbnRrKCJFQlA9JTA4eCAgIiwgTS54ODYuUl9FQlAgKTsKLQlwcmludGsoIkVTST0lMDh4ICAiLCBNLng4Ni5SX0VTSSApOwotCXByaW50aygiRURJPSUwOHhcbiIsIE0ueDg2LlJfRURJICk7Ci0JcHJpbnRrKCJcdERTPSUwNHggICIsIE0ueDg2LlJfRFMgKTsKLQlwcmludGsoIkVTPSUwNHggICIsIE0ueDg2LlJfRVMgKTsKLQlwcmludGsoIlNTPSUwNHggICIsIE0ueDg2LlJfU1MgKTsKLQlwcmludGsoIkNTPSUwNHggICIsIE0ueDg2LlJfQ1MgKTsKLQlwcmludGsoIkVJUD0lMDh4XG5cdCIsIE0ueDg2LlJfRUlQICk7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfT0YpKSAgICBwcmludGsoIk9WICIpOyAgICAgLyogQ0hFQ0tFRC4uLiAqLwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIk5WICIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAgcHJpbnRrKCJETiAiKTsKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJVUCAiKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9JRikpICAgIHByaW50aygiRUkgIik7Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiREkgIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfU0YpKSAgICBwcmludGsoIk5HICIpOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIlBMICIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX1pGKSkgICAgcHJpbnRrKCJaUiAiKTsKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJOWiAiKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9BRikpICAgIHByaW50aygiQUMgIik7Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiTkEgIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfUEYpKSAgICBwcmludGsoIlBFICIpOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIlBPICIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgICAgcHJpbnRrKCJDWSAiKTsKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJOQyAiKTsKLQlwcmludGsoIlxuIik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvZGVjb2RlLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvZGVjb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMmIxZjUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L2RlY29kZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZToJCUFOU0kgQwotKiBFbnZpcm9ubWVudDoJQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGluY2x1ZGVzIHN1YnJvdXRpbmVzIHdoaWNoIGFyZSByZWxhdGVkIHRvCi0qCQkJCWluc3RydWN0aW9uIGRlY29kaW5nIGFuZCBhY2Nlc3Nlc3Mgb2YgaW1tZWRpYXRlIGRhdGEgdmlhIElQLiAgZXRjLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIng4NmVtdS94ODZlbXVpLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBhbnkgcGVuZGluZyBhc3ljaHJvbm91cyBpbnRlcnJ1cHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHg4NmVtdV9pbnRyX2hhbmRsZSh2b2lkKQotewotCXU4CWludG5vOwotCi0JaWYgKE0ueDg2LmludHIgJiBJTlRSX1NZTkNIKSB7Ci0JCWludG5vID0gTS54ODYuaW50bm87Ci0JCWlmIChfWDg2RU1VX2ludHJUYWJbaW50bm9dKSB7Ci0JCQkoKl9YODZFTVVfaW50clRhYltpbnRub10pKGludG5vKTsKLQkJfSBlbHNlIHsKLQkJCXB1c2hfd29yZCgodTE2KU0ueDg2LlJfRkxHKTsKLQkJCUNMRUFSX0ZMQUcoRl9JRik7Ci0JCQlDTEVBUl9GTEFHKEZfVEYpOwotCQkJcHVzaF93b3JkKE0ueDg2LlJfQ1MpOwotCQkJTS54ODYuUl9DUyA9IG1lbV9hY2Nlc3Nfd29yZChpbnRubyAqIDQgKyAyKTsKLQkJCXB1c2hfd29yZChNLng4Ni5SX0lQKTsKLQkJCU0ueDg2LlJfSVAgPSBtZW1fYWNjZXNzX3dvcmQoaW50bm8gKiA0KTsKLQkJCU0ueDg2LmludHIgPSAwOwotCQl9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWludHJudW0gLSBJbnRlcnJ1cHQgbnVtYmVyIHRvIHJhaXNlCi0KLVJFTUFSS1M6Ci1SYWlzZSB0aGUgc3BlY2lmaWVkIGludGVycnVwdCB0byBiZSBoYW5kbGVkIGJlZm9yZSB0aGUgZXhlY3V0aW9uIG9mIHRoZQotbmV4dCBpbnN0cnVjdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdV9pbnRyX3JhaXNlKAotCXU4IGludHJudW0pCi17Ci0JTS54ODYuaW50bm8gPSBpbnRybnVtOwotCU0ueDg2LmludHIgfD0gSU5UUl9TWU5DSDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYWluIGV4ZWN1dGlvbiBsb29wIGZvciB0aGUgZW11bGF0b3IuIFdlIHJldHVybiBmcm9tIGhlcmUgd2hlbiB0aGUgc3lzdGVtCi1oYWx0cywgd2hpY2ggaXMgbm9ybWFsbHkgY2F1c2VkIGJ5IGEgc3RhY2sgZmF1bHQgd2hlbiB3ZSByZXR1cm4gZnJvbSB0aGUKLW9yaWdpbmFsIHJlYWwgbW9kZSBjYWxsLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWDg2RU1VX2V4ZWModm9pZCkKLXsKLSAgICB1OCBvcDE7Ci0KLSAgICBNLng4Ni5pbnRyID0gMDsKLSAgICBEQih4ODZlbXVfZW5kX2luc3RyKCk7KQotCi0gICAgZm9yICg7OykgewotCURCKGlmIChDSEVDS19JUF9GRVRDSCgpKSB4ODZlbXVfY2hlY2tfaXBfYWNjZXNzKCk7KQotCS8qIElmIGRlYnVnZ2luZywgc2F2ZSB0aGUgSVAgYW5kIENTIHZhbHVlcy4gKi8KLQlTQVZFX0lQX0NTKE0ueDg2LlJfQ1MsIE0ueDg2LlJfSVApOwotCUlOQ19ERUNPREVEX0lOU1RfTEVOKDEpOwotCWlmIChNLng4Ni5pbnRyKSB7Ci0JICAgIGlmIChNLng4Ni5pbnRyICYgSU5UUl9IQUxURUQpIHsKLQkJREIoCXByaW50aygiaGFsdGVkXG4iKTsgWDg2RU1VX3RyYWNlX3JlZ3MoKTspCi0JCSAgICByZXR1cm47Ci0JICAgIH0KLQkgICAgaWYgKCgoTS54ODYuaW50ciAmIElOVFJfU1lOQ0gpICYmIChNLng4Ni5pbnRubyA9PSAwIHx8IE0ueDg2LmludG5vID09IDIpKSB8fAotCQkhQUNDRVNTX0ZMQUcoRl9JRikpIHsKLQkJeDg2ZW11X2ludHJfaGFuZGxlKCk7Ci0JICAgIH0KLQl9Ci0Jb3AxID0gKCpzeXNfcmRiKSgoKHUzMilNLng4Ni5SX0NTIDw8IDQpICsgKE0ueDg2LlJfSVArKykpOwotCSgqeDg2ZW11X29wdGFiW29wMV0pKG9wMSk7Ci0JaWYgKE0ueDg2LmRlYnVnICYgREVCVUdfRVhJVCkgewotCSAgICBNLng4Ni5kZWJ1ZyAmPSB+REVCVUdfRVhJVDsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFsdHMgdGhlIHN5c3RlbSBieSBzZXR0aW5nIHRoZSBoYWx0ZWQgc3lzdGVtIGZsYWcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBYODZFTVVfaGFsdF9zeXModm9pZCkKLXsKLQlNLng4Ni5pbnRyIHw9IElOVFJfSEFMVEVEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1vZAkJLSBNb2QgdmFsdWUgZnJvbSBkZWNvZGVkIGJ5dGUKLXJlZ2gJLSBSZWcgaCB2YWx1ZSBmcm9tIGRlY29kZWQgYnl0ZQotcmVnbAktIFJlZyBsIHZhbHVlIGZyb20gZGVjb2RlZCBieXRlCi0KLVJFTUFSS1M6Ci1SYWlzZSB0aGUgc3BlY2lmaWVkIGludGVycnVwdCB0byBiZSBoYW5kbGVkIGJlZm9yZSB0aGUgZXhlY3V0aW9uIG9mIHRoZQotbmV4dCBpbnN0cnVjdGlvbi4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uLCBhcyAoKnN5c19yZGIpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZmV0Y2hfZGVjb2RlX21vZHJtKAotCWludCAqbW9kLAotCWludCAqcmVnaCwKLQlpbnQgKnJlZ2wpCi17Ci0JaW50IGZldGNoZWQ7Ci0KLURCKAlpZiAoQ0hFQ0tfSVBfRkVUQ0goKSkKLQkgIHg4NmVtdV9jaGVja19pcF9hY2Nlc3MoKTspCi0JZmV0Y2hlZCA9ICgqc3lzX3JkYikoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKyspKTsKLQlJTkNfREVDT0RFRF9JTlNUX0xFTigxKTsKLQkqbW9kICA9IChmZXRjaGVkID4+IDYpICYgMHgwMzsKLQkqcmVnaCA9IChmZXRjaGVkID4+IDMpICYgMHgwNzsKLSAgICAqcmVnbCA9IChmZXRjaGVkID4+IDApICYgMHgwNzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1JbW1lZGlhdGUgYnl0ZSB2YWx1ZSByZWFkIGZyb20gaW5zdHJ1Y3Rpb24gcXVldWUKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW1tZWRpYXRlIGJ5dGUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gcXVldWUsIGFuZAotbW92ZXMgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgdG8gdGhlIG5leHQgdmFsdWUuCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiwgYXMgKCpzeXNfcmRiKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBmZXRjaF9ieXRlX2ltbSh2b2lkKQotewotCXU4IGZldGNoZWQ7Ci0KLURCKAlpZiAoQ0hFQ0tfSVBfRkVUQ0goKSkKLQkJeDg2ZW11X2NoZWNrX2lwX2FjY2VzcygpOykKLQlmZXRjaGVkID0gKCpzeXNfcmRiKSgoKHUzMilNLng4Ni5SX0NTIDw8IDQpICsgKE0ueDg2LlJfSVArKykpOwotCUlOQ19ERUNPREVEX0lOU1RfTEVOKDEpOwotCXJldHVybiBmZXRjaGVkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLUltbWVkaWF0ZSB3b3JkIHZhbHVlIHJlYWQgZnJvbSBpbnN0cnVjdGlvbiBxdWV1ZQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbW1lZGlhdGUgYnl0ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbiBxdWV1ZSwgYW5kCi1tb3ZlcyB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciB0byB0aGUgbmV4dCB2YWx1ZS4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uLCBhcyAoKnN5c19yZHcpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBmZXRjaF93b3JkX2ltbSh2b2lkKQotewotCXUxNglmZXRjaGVkOwotCi1EQigJaWYgKENIRUNLX0lQX0ZFVENIKCkpCi0JCXg4NmVtdV9jaGVja19pcF9hY2Nlc3MoKTspCi0JZmV0Y2hlZCA9ICgqc3lzX3JkdykoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKSk7Ci0JTS54ODYuUl9JUCArPSAyOwotCUlOQ19ERUNPREVEX0lOU1RfTEVOKDIpOwotCXJldHVybiBmZXRjaGVkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLUltbWVkaWF0ZSBsb25lIHZhbHVlIHJlYWQgZnJvbSBpbnN0cnVjdGlvbiBxdWV1ZQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbW1lZGlhdGUgYnl0ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbiBxdWV1ZSwgYW5kCi1tb3ZlcyB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciB0byB0aGUgbmV4dCB2YWx1ZS4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uLCBhcyAoKnN5c19yZHcpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBmZXRjaF9sb25nX2ltbSh2b2lkKQotewotCXUzMiBmZXRjaGVkOwotCi1EQigJaWYgKENIRUNLX0lQX0ZFVENIKCkpCi0JICB4ODZlbXVfY2hlY2tfaXBfYWNjZXNzKCk7KQotCWZldGNoZWQgPSAoKnN5c19yZGwpKCgodTMyKU0ueDg2LlJfQ1MgPDwgNCkgKyAoTS54ODYuUl9JUCkpOwotCU0ueDg2LlJfSVAgKz0gNDsKLQlJTkNfREVDT0RFRF9JTlNUX0xFTig0KTsKLQlyZXR1cm4gZmV0Y2hlZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1WYWx1ZSBvZiB0aGUgZGVmYXVsdCBkYXRhIHNlZ21lbnQKLQotUkVNQVJLUzoKLUlubGluZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGRlZmF1bHQgZGF0YSBzZWdtZW50IGZvciB0aGUgY3VycmVudAotaW5zdHJ1Y3Rpb24uCi0KLU9uIHRoZSB4ODYgcHJvY2Vzc29yLCB0aGUgZGVmYXVsdCBzZWdtZW50IGlzIG5vdCBhbHdheXMgRFMgaWYgdGhlcmUgaXMKLW5vIHNlZ21lbnQgb3ZlcnJpZGUuIEFkZHJlc3MgbW9kZXMgc3VjaCBhcyAtM1tCUF0gb3IgMTBbQlArU0ldIGFsbCByZWZlciB0bwotYWRkcmVzc2VzIHJlbGF0aXZlIHRvIFNTIChpZTogb24gdGhlIHN0YWNrKS4gU28sIGF0IHRoZSBtaW5pbXVtLCBhbGwKLWRlY29kaW5ncyBvZiBhZGRyZXNzaW5nIG1vZGVzIHdvdWxkIGhhdmUgdG8gc2V0L2NsZWFyIGEgYml0IGRlc2NyaWJpbmcKLXdoZXRoZXIgdGhlIGFjY2VzcyBpcyByZWxhdGl2ZSB0byBEUyBvciBTUy4gIFRoYXQgaXMgdGhlIGZ1bmN0aW9uIG9mIHRoZQotY3B1LXN0YXRlLXZhcmlibGUgTS54ODYubW9kZS4gVGhlcmUgYXJlIHNldmVyYWwgcG90ZW50aWFsIHN0YXRlczoKLQotCXJlcGUgcHJlZml4IHNlZW4gIChoYW5kbGVkIGVsc2V3aGVyZSkKLQlyZXBuZSBwcmVmaXggc2VlbiAgKGRpdHRvKQotCi0JY3Mgc2VnbWVudCBvdmVycmlkZQotCWRzIHNlZ21lbnQgb3ZlcnJpZGUKLQllcyBzZWdtZW50IG92ZXJyaWRlCi0JZnMgc2VnbWVudCBvdmVycmlkZQotCWdzIHNlZ21lbnQgb3ZlcnJpZGUKLQlzcyBzZWdtZW50IG92ZXJyaWRlCi0KLQlkcy9zcyBzZWxlY3QgKGluIGFic2Vuc2Ugb2Ygb3ZlcnJpZGUpCi0KLUVhY2ggb2YgdGhlIGFib3ZlIDcgaXRlbXMgYXJlIGhhbmRsZWQgd2l0aCBhIGJpdCBpbiB0aGUgbW9kZSBmaWVsZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1fSU5MSU5FIHUzMiBnZXRfZGF0YV9zZWdtZW50KHZvaWQpCi17Ci0jZGVmaW5lCUdFVF9TRUdNRU5UKHNlZ21lbnQpCi0Jc3dpdGNoIChNLng4Ni5tb2RlICYgU1lTTU9ERV9TRUdNQVNLKSB7Ci0JICBjYXNlIDA6CQkJCQkvKiBkZWZhdWx0IGNhc2U6IHVzZSBkcyByZWdpc3RlciAqLwotCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9EUzoKLQkgIGNhc2UgU1lTTU9ERV9TRUdPVlJfRFMgfCBTWVNNT0RFX1NFR19EU19TUzoKLQkJcmV0dXJuICBNLng4Ni5SX0RTOwotCSAgY2FzZSBTWVNNT0RFX1NFR19EU19TUzoJLyogbm9uLW92ZXJyaWRkZW4sIHVzZSBzcyByZWdpc3RlciAqLwotCQlyZXR1cm4gIE0ueDg2LlJfU1M7Ci0JICBjYXNlIFNZU01PREVfU0VHT1ZSX0NTOgotCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9DUyB8IFNZU01PREVfU0VHX0RTX1NTOgotCQlyZXR1cm4gIE0ueDg2LlJfQ1M7Ci0JICBjYXNlIFNZU01PREVfU0VHT1ZSX0VTOgotCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9FUyB8IFNZU01PREVfU0VHX0RTX1NTOgotCQlyZXR1cm4gIE0ueDg2LlJfRVM7Ci0JICBjYXNlIFNZU01PREVfU0VHT1ZSX0ZTOgotCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9GUyB8IFNZU01PREVfU0VHX0RTX1NTOgotCQlyZXR1cm4gIE0ueDg2LlJfRlM7Ci0JICBjYXNlIFNZU01PREVfU0VHT1ZSX0dTOgotCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9HUyB8IFNZU01PREVfU0VHX0RTX1NTOgotCQlyZXR1cm4gIE0ueDg2LlJfR1M7Ci0JICBjYXNlIFNZU01PREVfU0VHT1ZSX1NTOgotCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9TUyB8IFNZU01PREVfU0VHX0RTX1NTOgotCQlyZXR1cm4gIE0ueDg2LlJfU1M7Ci0JICBkZWZhdWx0OgotI2lmZGVmCURFQlVHCi0JCXByaW50aygiZXJyb3I6IHNob3VsZCBub3QgaGFwcGVuOiAgbXVsdGlwbGUgb3ZlcnJpZGVzLlxuIik7Ci0jZW5kaWYKLQkJSEFMVF9TWVMoKTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW9mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQotCi1SRVRVUk5TOgotQnl0ZSB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggZmV0Y2hfZGF0YV9ieXRlKAotCXVpbnQgb2Zmc2V0KQotewotI2lmZGVmIERFQlVHCi0JaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCi0JCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcygodTE2KWdldF9kYXRhX3NlZ21lbnQoKSwgb2Zmc2V0KTsKLSNlbmRpZgotCXJldHVybiAoKnN5c19yZGIpKChnZXRfZGF0YV9zZWdtZW50KCkgPDwgNCkgKyBvZmZzZXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW9mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQotCi1SRVRVUk5TOgotV29yZCB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IGZldGNoX2RhdGFfd29yZCgKLQl1aW50IG9mZnNldCkKLXsKLSNpZmRlZiBERUJVRwotCWlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQotCQl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MoKHUxNilnZXRfZGF0YV9zZWdtZW50KCksIG9mZnNldCk7Ci0jZW5kaWYKLQlyZXR1cm4gKCpzeXNfcmR3KSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1vZmZzZXQJLSBPZmZzZXQgdG8gbG9hZCBkYXRhIGZyb20KLQotUkVUVVJOUzoKLUxvbmcgdmFsdWUgcmVhZCBmcm9tIHRoZSBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBmZXRjaF9kYXRhX2xvbmcoCi0JdWludCBvZmZzZXQpCi17Ci0jaWZkZWYgREVCVUcKLQlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKLQkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOwotI2VuZGlmCi0JcmV0dXJuICgqc3lzX3JkbCkoKGdldF9kYXRhX3NlZ21lbnQoKSA8PCA0KSArIG9mZnNldCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2VnbWVudAktIFNlZ21lbnQgdG8gbG9hZCBkYXRhIGZyb20KLW9mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQotCi1SRVRVUk5TOgotQnl0ZSB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggZmV0Y2hfZGF0YV9ieXRlX2FicygKLQl1aW50IHNlZ21lbnQsCi0JdWludCBvZmZzZXQpCi17Ci0jaWZkZWYgREVCVUcKLQlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKLQkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7Ci0jZW5kaWYKLQlyZXR1cm4gKCpzeXNfcmRiKSgoKHUzMilzZWdtZW50IDw8IDQpICsgb2Zmc2V0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zZWdtZW50CS0gU2VnbWVudCB0byBsb2FkIGRhdGEgZnJvbQotb2Zmc2V0CS0gT2Zmc2V0IHRvIGxvYWQgZGF0YSBmcm9tCi0KLVJFVFVSTlM6Ci1Xb3JkIHZhbHVlIHJlYWQgZnJvbSB0aGUgYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgZmV0Y2hfZGF0YV93b3JkX2FicygKLQl1aW50IHNlZ21lbnQsCi0JdWludCBvZmZzZXQpCi17Ci0jaWZkZWYgREVCVUcKLQlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKLQkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7Ci0jZW5kaWYKLQlyZXR1cm4gKCpzeXNfcmR3KSgoKHUzMilzZWdtZW50IDw8IDQpICsgb2Zmc2V0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zZWdtZW50CS0gU2VnbWVudCB0byBsb2FkIGRhdGEgZnJvbQotb2Zmc2V0CS0gT2Zmc2V0IHRvIGxvYWQgZGF0YSBmcm9tCi0KLVJFVFVSTlM6Ci1Mb25nIHZhbHVlIHJlYWQgZnJvbSB0aGUgYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgZmV0Y2hfZGF0YV9sb25nX2FicygKLQl1aW50IHNlZ21lbnQsCi0JdWludCBvZmZzZXQpCi17Ci0jaWZkZWYgREVCVUcKLQlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKLQkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7Ci0jZW5kaWYKLQlyZXR1cm4gKCpzeXNfcmRsKSgoKHUzMilzZWdtZW50IDw8IDQpICsgb2Zmc2V0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1vZmZzZXQJLSBPZmZzZXQgdG8gc3RvcmUgZGF0YSBhdAotdmFsCQktIFZhbHVlIHRvIHN0b3JlCi0KLVJFTUFSS1M6Ci1Xcml0ZXMgYSB3b3JkIHZhbHVlIHRvIGFuIHNlZ21lbnRlZCBtZW1vcnkgbG9jYXRpb24uIFRoZSBzZWdtZW50IHVzZWQgaXMKLXRoZSBjdXJyZW50ICdkZWZhdWx0JyBzZWdtZW50LCB3aGljaCBtYXkgaGF2ZSBiZWVuIG92ZXJyaWRkZW4uCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc3RvcmVfZGF0YV9ieXRlKAotCXVpbnQgb2Zmc2V0LAotCXU4IHZhbCkKLXsKLSNpZmRlZiBERUJVRwotCWlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQotCQl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MoKHUxNilnZXRfZGF0YV9zZWdtZW50KCksIG9mZnNldCk7Ci0jZW5kaWYKLQkoKnN5c193cmIpKChnZXRfZGF0YV9zZWdtZW50KCkgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotb2Zmc2V0CS0gT2Zmc2V0IHRvIHN0b3JlIGRhdGEgYXQKLXZhbAkJLSBWYWx1ZSB0byBzdG9yZQotCi1SRU1BUktTOgotV3JpdGVzIGEgd29yZCB2YWx1ZSB0byBhbiBzZWdtZW50ZWQgbWVtb3J5IGxvY2F0aW9uLiBUaGUgc2VnbWVudCB1c2VkIGlzCi10aGUgY3VycmVudCAnZGVmYXVsdCcgc2VnbWVudCwgd2hpY2ggbWF5IGhhdmUgYmVlbiBvdmVycmlkZGVuLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHN0b3JlX2RhdGFfd29yZCgKLQl1aW50IG9mZnNldCwKLQl1MTYgdmFsKQotewotI2lmZGVmIERFQlVHCi0JaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCi0JCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcygodTE2KWdldF9kYXRhX3NlZ21lbnQoKSwgb2Zmc2V0KTsKLSNlbmRpZgotCSgqc3lzX3dydykoKGdldF9kYXRhX3NlZ21lbnQoKSA8PCA0KSArIG9mZnNldCwgdmFsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1vZmZzZXQJLSBPZmZzZXQgdG8gc3RvcmUgZGF0YSBhdAotdmFsCQktIFZhbHVlIHRvIHN0b3JlCi0KLVJFTUFSS1M6Ci1Xcml0ZXMgYSBsb25nIHZhbHVlIHRvIGFuIHNlZ21lbnRlZCBtZW1vcnkgbG9jYXRpb24uIFRoZSBzZWdtZW50IHVzZWQgaXMKLXRoZSBjdXJyZW50ICdkZWZhdWx0JyBzZWdtZW50LCB3aGljaCBtYXkgaGF2ZSBiZWVuIG92ZXJyaWRkZW4uCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc3RvcmVfZGF0YV9sb25nKAotCXVpbnQgb2Zmc2V0LAotCXUzMiB2YWwpCi17Ci0jaWZkZWYgREVCVUcKLQlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKLQkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOwotI2VuZGlmCi0JKCpzeXNfd3JsKSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0LCB2YWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNlZ21lbnQJLSBTZWdtZW50IHRvIHN0b3JlIGRhdGEgYXQKLW9mZnNldAktIE9mZnNldCB0byBzdG9yZSBkYXRhIGF0Ci12YWwJCS0gVmFsdWUgdG8gc3RvcmUKLQotUkVNQVJLUzoKLVdyaXRlcyBhIGJ5dGUgdmFsdWUgdG8gYW4gYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHN0b3JlX2RhdGFfYnl0ZV9hYnMoCi0JdWludCBzZWdtZW50LAotCXVpbnQgb2Zmc2V0LAotCXU4IHZhbCkKLXsKLSNpZmRlZiBERUJVRwotCWlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQotCQl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3Moc2VnbWVudCwgb2Zmc2V0KTsKLSNlbmRpZgotCSgqc3lzX3dyYikoKCh1MzIpc2VnbWVudCA8PCA0KSArIG9mZnNldCwgdmFsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zZWdtZW50CS0gU2VnbWVudCB0byBzdG9yZSBkYXRhIGF0Ci1vZmZzZXQJLSBPZmZzZXQgdG8gc3RvcmUgZGF0YSBhdAotdmFsCQktIFZhbHVlIHRvIHN0b3JlCi0KLVJFTUFSS1M6Ci1Xcml0ZXMgYSB3b3JkIHZhbHVlIHRvIGFuIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzdG9yZV9kYXRhX3dvcmRfYWJzKAotCXVpbnQgc2VnbWVudCwKLQl1aW50IG9mZnNldCwKLQl1MTYgdmFsKQotewotI2lmZGVmIERFQlVHCi0JaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCi0JCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcyhzZWdtZW50LCBvZmZzZXQpOwotI2VuZGlmCi0JKCpzeXNfd3J3KSgoKHUzMilzZWdtZW50IDw8IDQpICsgb2Zmc2V0LCB2YWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNlZ21lbnQJLSBTZWdtZW50IHRvIHN0b3JlIGRhdGEgYXQKLW9mZnNldAktIE9mZnNldCB0byBzdG9yZSBkYXRhIGF0Ci12YWwJCS0gVmFsdWUgdG8gc3RvcmUKLQotUkVNQVJLUzoKLVdyaXRlcyBhIGxvbmcgdmFsdWUgdG8gYW4gYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHN0b3JlX2RhdGFfbG9uZ19hYnMoCi0JdWludCBzZWdtZW50LAotCXVpbnQgb2Zmc2V0LAotCXUzMiB2YWwpCi17Ci0jaWZkZWYgREVCVUcKLQlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKLQkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7Ci0jZW5kaWYKLQkoKnN5c193cmwpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcmVnCS0gUmVnaXN0ZXIgdG8gZGVjb2RlCi0KLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcgotCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVnaXN0ZXIgZ2l2ZW4gYnkgdGhlIFIvUk0gZmllbGQgb2YgdGhlCi1tb2RybSBieXRlLCBmb3IgYnl0ZSBvcGVyYW5kcy4gQWxzbyBlbmFibGVzIHRoZSBkZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTgqIGRlY29kZV9ybV9ieXRlX3JlZ2lzdGVyKAotCWludCByZWcpCi17Ci0Jc3dpdGNoIChyZWcpIHsKLSAgICAgIGNhc2UgMDoKLQkJREVDT0RFX1BSSU5URigiQUwiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0FMOwotCSAgY2FzZSAxOgotCQlERUNPREVfUFJJTlRGKCJDTCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfQ0w7Ci0JICBjYXNlIDI6Ci0JCURFQ09ERV9QUklOVEYoIkRMIik7Ci0JCXJldHVybiAmTS54ODYuUl9ETDsKLQkgIGNhc2UgMzoKLQkJREVDT0RFX1BSSU5URigiQkwiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0JMOwotCSAgY2FzZSA0OgotCQlERUNPREVfUFJJTlRGKCJBSCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfQUg7Ci0JICBjYXNlIDU6Ci0JCURFQ09ERV9QUklOVEYoIkNIIik7Ci0JCXJldHVybiAmTS54ODYuUl9DSDsKLQkgIGNhc2UgNjoKLQkJREVDT0RFX1BSSU5URigiREgiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0RIOwotCSAgY2FzZSA3OgotCQlERUNPREVfUFJJTlRGKCJCSCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfQkg7Ci0JfQotCUhBTFRfU1lTKCk7Ci0JcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIE5PVCBSRUFDSEVEIE9SIFJFQUNIRUQgT04gRVJST1IgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1yZWcJLSBSZWdpc3RlciB0byBkZWNvZGUKLQotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyCi0KLVJFTUFSS1M6Ci1SZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWdpc3RlciBnaXZlbiBieSB0aGUgUi9STSBmaWVsZCBvZiB0aGUKLW1vZHJtIGJ5dGUsIGZvciB3b3JkIG9wZXJhbmRzLiAgQWxzbyBlbmFibGVzIHRoZSBkZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2KiBkZWNvZGVfcm1fd29yZF9yZWdpc3RlcigKLQlpbnQgcmVnKQotewotCXN3aXRjaCAocmVnKSB7Ci0JICBjYXNlIDA6Ci0JCURFQ09ERV9QUklOVEYoIkFYIik7Ci0JCXJldHVybiAmTS54ODYuUl9BWDsKLQkgIGNhc2UgMToKLQkJREVDT0RFX1BSSU5URigiQ1giKTsKLQkJcmV0dXJuICZNLng4Ni5SX0NYOwotCSAgY2FzZSAyOgotCQlERUNPREVfUFJJTlRGKCJEWCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfRFg7Ci0JICBjYXNlIDM6Ci0JCURFQ09ERV9QUklOVEYoIkJYIik7Ci0JCXJldHVybiAmTS54ODYuUl9CWDsKLQkgIGNhc2UgNDoKLQkJREVDT0RFX1BSSU5URigiU1AiKTsKLQkJcmV0dXJuICZNLng4Ni5SX1NQOwotCSAgY2FzZSA1OgotCQlERUNPREVfUFJJTlRGKCJCUCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfQlA7Ci0JICBjYXNlIDY6Ci0JCURFQ09ERV9QUklOVEYoIlNJIik7Ci0JCXJldHVybiAmTS54ODYuUl9TSTsKLQkgIGNhc2UgNzoKLQkJREVDT0RFX1BSSU5URigiREkiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0RJOwotCX0KLQlIQUxUX1NZUygpOwotICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBOT1RSRUFDSEVEIE9SIFJFQUNIRUQgT04gRVJST1IgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1yZWcJLSBSZWdpc3RlciB0byBkZWNvZGUKLQotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyCi0KLVJFTUFSS1M6Ci1SZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWdpc3RlciBnaXZlbiBieSB0aGUgUi9STSBmaWVsZCBvZiB0aGUKLW1vZHJtIGJ5dGUsIGZvciBkd29yZCBvcGVyYW5kcy4gIEFsc28gZW5hYmxlcyB0aGUgZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiogZGVjb2RlX3JtX2xvbmdfcmVnaXN0ZXIoCi0JaW50IHJlZykKLXsKLSAgICBzd2l0Y2ggKHJlZykgewotICAgICAgY2FzZSAwOgotCQlERUNPREVfUFJJTlRGKCJFQVgiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0VBWDsKLQkgIGNhc2UgMToKLQkJREVDT0RFX1BSSU5URigiRUNYIik7Ci0JCXJldHVybiAmTS54ODYuUl9FQ1g7Ci0JICBjYXNlIDI6Ci0JCURFQ09ERV9QUklOVEYoIkVEWCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfRURYOwotCSAgY2FzZSAzOgotCQlERUNPREVfUFJJTlRGKCJFQlgiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0VCWDsKLQkgIGNhc2UgNDoKLQkJREVDT0RFX1BSSU5URigiRVNQIik7Ci0JCXJldHVybiAmTS54ODYuUl9FU1A7Ci0JICBjYXNlIDU6Ci0JCURFQ09ERV9QUklOVEYoIkVCUCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfRUJQOwotCSAgY2FzZSA2OgotCQlERUNPREVfUFJJTlRGKCJFU0kiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0VTSTsKLQkgIGNhc2UgNzoKLQkJREVDT0RFX1BSSU5URigiRURJIik7Ci0JCXJldHVybiAmTS54ODYuUl9FREk7Ci0JfQotCUhBTFRfU1lTKCk7Ci0gICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIE5PVFJFQUNIRUQgT1IgUkVBQ0hFRCBPTiBFUlJPUiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXJlZwktIFJlZ2lzdGVyIHRvIGRlY29kZQotCi1SRVRVUk5TOgotUG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIKLQotUkVNQVJLUzoKLVJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVyIGdpdmVuIGJ5IHRoZSBSL1JNIGZpZWxkIG9mIHRoZQotbW9kcm0gYnl0ZSwgZm9yIHdvcmQgb3BlcmFuZHMsIG1vZGlmaWVkIGZyb20gYWJvdmUgZm9yIHRoZSB3ZWlyZG8KLXNwZWNpYWwgY2FzZSBvZiBzZWdyZWcgb3BlcmFuZHMuICBBbHNvIGVuYWJsZXMgdGhlIGRlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYqIGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIoCi0JaW50IHJlZykKLXsKLQlzd2l0Y2ggKHJlZykgewotCSAgY2FzZSAwOgotCQlERUNPREVfUFJJTlRGKCJFUyIpOwotCQlyZXR1cm4gJk0ueDg2LlJfRVM7Ci0JICBjYXNlIDE6Ci0JCURFQ09ERV9QUklOVEYoIkNTIik7Ci0JCXJldHVybiAmTS54ODYuUl9DUzsKLQkgIGNhc2UgMjoKLQkJREVDT0RFX1BSSU5URigiU1MiKTsKLQkJcmV0dXJuICZNLng4Ni5SX1NTOwotCSAgY2FzZSAzOgotCQlERUNPREVfUFJJTlRGKCJEUyIpOwotCQlyZXR1cm4gJk0ueDg2LlJfRFM7Ci0JICBjYXNlIDQ6Ci0JICBjYXNlIDU6Ci0JICBjYXNlIDY6Ci0JICBjYXNlIDc6Ci0JCURFQ09ERV9QUklOVEYoIklMTEVHQUwgU0VHUkVHIik7Ci0JCWJyZWFrOwotCX0KLQlIQUxUX1NZUygpOwotCXJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBOT1QgUkVBQ0hFRCBPUiBSRUFDSEVEIE9OIEVSUk9SICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcm0JLSBSTSB2YWx1ZSB0byBkZWNvZGUKLQotUkVUVVJOUzoKLU9mZnNldCBpbiBtZW1vcnkgZm9yIHRoZSBhZGRyZXNzIGRlY29kaW5nCi0KLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIG9mZnNldCBnaXZlbiBieSBtb2Q9MDAgYWRkcmVzc2luZy4gIEFsc28gZW5hYmxlcyB0aGUKLWRlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KLQotTk9URTogCVRoZSBjb2RlIHdoaWNoIHNwZWNpZmllcyB0aGUgY29ycmVzcG9uZGluZyBzZWdtZW50IChkcyB2cyBzcykKLQkJYmVsb3cgaW4gdGhlIGNhc2Ugb2YgW0JQKy4uXS4gIFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCBhdCB0aGUKLQkJcG9pbnQgdGhhdCB0aGlzIHN1YnJvdXRpbmUgaXMgY2FsbGVkLCB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG8KLQkJU1lTTU9ERV9TRUdfRFNfU1Mgd2lsbCBiZSB6ZXJvLiAgQWZ0ZXIgZXZlcnkgaW5zdHJ1Y3Rpb24KLQkJZXhjZXB0IHRoZSBzZWdtZW50IG92ZXJyaWRlIGluc3RydWN0aW9ucywgdGhpcyBiaXQgKGFzIHdlbGwKLQkJYXMgYW55IGJpdHMgaW5kaWNhdGluZyBzZWdtZW50IG92ZXJyaWRlcykgd2lsbCBiZSBjbGVhci4gIFNvCi0JCWlmIGEgU1MgYWNjZXNzIGlzIG5lZWRlZCwgc2V0IHRoaXMgYml0LiAgT3RoZXJ3aXNlLCBEUyBhY2Nlc3MKLQkJb2NjdXJzICh1bmxlc3MgYW55IG9mIHRoZSBzZWdtZW50IG92ZXJyaWRlIGJpdHMgYXJlIHNldCkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdW5zaWduZWQgZGVjb2RlX3JtMDBfYWRkcmVzcygKLQlpbnQgcm0pCi17Ci0JdW5zaWduZWQgb2Zmc2V0OwotCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9BRERSKQotCXsKLQkgICAgc3dpdGNoIChybSkgewotCSAgICBjYXNlIDA6Ci0JCURFQ09ERV9QUklOVEYoIltFQVhdIik7Ci0JCXJldHVybiBNLng4Ni5SX0VBWDsKLQkgICAgY2FzZSAxOgotCQlERUNPREVfUFJJTlRGKCJbRUNYXSIpOwotCQlyZXR1cm4gTS54ODYuUl9FQ1g7Ci0JICAgIGNhc2UgMjoKLQkJREVDT0RFX1BSSU5URigiW0VEWF0iKTsKLS8qCQlNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOyAqLwotCQlyZXR1cm4gTS54ODYuUl9FRFg7Ci0JICAgIGNhc2UgMzoKLQkJREVDT0RFX1BSSU5URigiW0VCWF0iKTsKLS8qCQlNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOyAqLwotCQlyZXR1cm4gTS54ODYuUl9FQlg7Ci0JICAgIGNhc2UgNDoKLQkJcHJpbnRrKCJVbnN1cHBvcnRlZCBTSUIgZW5jb2RpbmdcbiIpOwotCQlIQUxUX1NZUygpOwotCQlyZXR1cm4gMDsKLQkgICAgY2FzZSA1OgotCQlvZmZzZXQgPSBmZXRjaF9sb25nX2ltbSgpOwotCQlERUNPREVfUFJJTlRGMigiWyUwOHhdIiwgb2Zmc2V0KTsKLQkJcmV0dXJuIG9mZnNldDsKLQkgICAgY2FzZSA2OgotCQlERUNPREVfUFJJTlRGKCJbRVNJXSIpOwotCQlyZXR1cm4gTS54ODYuUl9FU0k7Ci0JICAgIGNhc2UgNzoKLQkJREVDT0RFX1BSSU5URigiW0VESV0iKTsKLQkJcmV0dXJuIE0ueDg2LlJfRURJOwotCSAgICB9Ci0JfQotCWVsc2UKLQl7Ci0JICAgIHN3aXRjaCAocm0pIHsKLQkgICAgY2FzZSAwOgotCQlERUNPREVfUFJJTlRGKCJbQlgrU0ldIik7Ci0JCXJldHVybiBNLng4Ni5SX0JYICsgTS54ODYuUl9TSTsKLQkgICAgY2FzZSAxOgotCQlERUNPREVfUFJJTlRGKCJbQlgrREldIik7Ci0JCXJldHVybiBNLng4Ni5SX0JYICsgTS54ODYuUl9ESTsKLQkgICAgY2FzZSAyOgotCQlERUNPREVfUFJJTlRGKCJbQlArU0ldIik7Ci0JCU0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7Ci0JCXJldHVybiBNLng4Ni5SX0JQICsgTS54ODYuUl9TSTsKLQkgICAgY2FzZSAzOgotCQlERUNPREVfUFJJTlRGKCJbQlArREldIik7Ci0JCU0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7Ci0JCXJldHVybiBNLng4Ni5SX0JQICsgTS54ODYuUl9ESTsKLQkgICAgY2FzZSA0OgotCQlERUNPREVfUFJJTlRGKCJbU0ldIik7Ci0JCXJldHVybiBNLng4Ni5SX1NJOwotCSAgICBjYXNlIDU6Ci0JCURFQ09ERV9QUklOVEYoIltESV0iKTsKLQkJcmV0dXJuIE0ueDg2LlJfREk7Ci0JICAgIGNhc2UgNjoKLQkJb2Zmc2V0ID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkJREVDT0RFX1BSSU5URjIoIlslMDR4XSIsIG9mZnNldCk7Ci0JCXJldHVybiBvZmZzZXQ7Ci0JICAgIGNhc2UgNzoKLQkJREVDT0RFX1BSSU5URigiW0JYXSIpOwotCQlyZXR1cm4gTS54ODYuUl9CWDsKLQkgICAgfQotCX0KLQlIQUxUX1NZUygpOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXJtCS0gUk0gdmFsdWUgdG8gZGVjb2RlCi0KLVJFVFVSTlM6Ci1PZmZzZXQgaW4gbWVtb3J5IGZvciB0aGUgYWRkcmVzcyBkZWNvZGluZwotCi1SRU1BUktTOgotUmV0dXJuIHRoZSBvZmZzZXQgZ2l2ZW4gYnkgbW9kPTAxIGFkZHJlc3NpbmcuICBBbHNvIGVuYWJsZXMgdGhlCi1kZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdW5zaWduZWQgZGVjb2RlX3JtMDFfYWRkcmVzcygKLQlpbnQgcm0pCi17Ci0gICAgaW50IGRpc3BsYWNlbWVudCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfQUREUikKLSAgICB7Ci0Jc3dpdGNoIChybSkKLQl7Ci0JY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUFYfSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0VBWCArIGRpc3BsYWNlbWVudDsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQ1hdIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfRUNYICsgZGlzcGxhY2VtZW50OwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VEWF0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9FRFggKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUJYXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0VCWCArIGRpc3BsYWNlbWVudDsKLQljYXNlIDQ6Ci0JICAgIHByaW50aygiVW5zdXBwb3J0ZWQgU0lCIGFkZHJlc3NpbmcgbW9kZVxuIik7Ci0JICAgIEhBTFRfU1lTKCk7Ci0JICAgIHJldHVybiAwOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VCUF0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9FQlAgKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbRVNJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0VTSSArIGRpc3BsYWNlbWVudDsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtFREldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfRURJICsgZGlzcGxhY2VtZW50OwotCX0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlzd2l0Y2ggKHJtKSB7Ci0JY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlgrU0ldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfQlggKyBNLng4Ni5SX1NJICsgZGlzcGxhY2VtZW50OwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JYK0RJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0JYICsgTS54ODYuUl9ESSArIGRpc3BsYWNlbWVudDsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtCUCtTSV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOwotCSAgICByZXR1cm4gTS54ODYuUl9CUCArIE0ueDg2LlJfU0kgKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlArREldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKLQkgICAgcmV0dXJuIE0ueDg2LlJfQlAgKyBNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50OwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW1NJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX1NJICsgZGlzcGxhY2VtZW50OwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0RJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50OwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JQXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7Ci0JICAgIHJldHVybiBNLng4Ni5SX0JQICsgZGlzcGxhY2VtZW50OwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JYXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0JYICsgZGlzcGxhY2VtZW50OwotCX0KLQlIQUxUX1NZUygpOwotICAgIH0KLSAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgLyogU0hPVUxEIE5PVCBIQVBQRU4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1ybQktIFJNIHZhbHVlIHRvIGRlY29kZQotCi1SRVRVUk5TOgotT2Zmc2V0IGluIG1lbW9yeSBmb3IgdGhlIGFkZHJlc3MgZGVjb2RpbmcKLQotUkVNQVJLUzoKLVJldHVybiB0aGUgb2Zmc2V0IGdpdmVuIGJ5IG1vZD0xMCBhZGRyZXNzaW5nLiAgQWxzbyBlbmFibGVzIHRoZQotZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVuc2lnbmVkIGRlY29kZV9ybTEwX2FkZHJlc3MoCi0JaW50IHJtKQotewotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfQUREUikKLSAgICB7Ci0JaW50IGRpc3BsYWNlbWVudCA9IChzMzIpZmV0Y2hfbG9uZ19pbW0oKTsKLQlzd2l0Y2ggKHJtKQotCXsKLQljYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQVh9IiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfRUFYICsgZGlzcGxhY2VtZW50OwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VDWF0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9FQ1ggKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbRURYXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0VEWCArIGRpc3BsYWNlbWVudDsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQlhdIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfRUJYICsgZGlzcGxhY2VtZW50OwotCWNhc2UgNDoKLQkgICAgcHJpbnRrKCJVbnN1cHBvcnRlZCBTSUIgYWRkcmVzc2luZyBtb2RlXG4iKTsKLQkgICAgSEFMVF9TWVMoKTsKLQkgICAgcmV0dXJuIDA7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUJQXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0VCUCArIGRpc3BsYWNlbWVudDsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtFU0ldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfRVNJICsgZGlzcGxhY2VtZW50OwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VESV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9FREkgKyBkaXNwbGFjZW1lbnQ7Ci0JfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotCWludCBkaXNwbGFjZW1lbnQgPSAoczE2KWZldGNoX3dvcmRfaW1tKCk7Ci0Jc3dpdGNoIChybSkgewotCWNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JYK1NJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiAoTS54ODYuUl9CWCArIE0ueDg2LlJfU0kgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JYK0RJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiAoTS54ODYuUl9CWCArIE0ueDg2LlJfREkgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JQK1NJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7Ci0JICAgIHJldHVybiAoTS54ODYuUl9CUCArIE0ueDg2LlJfU0kgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JQK0RJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7Ci0JICAgIHJldHVybiAoTS54ODYuUl9CUCArIE0ueDg2LlJfREkgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW1NJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiAoTS54ODYuUl9TSSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbREldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIChNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtCUF0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOwotCSAgICByZXR1cm4gKE0ueDg2LlJfQlAgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JYXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiAoTS54ODYuUl9CWCArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7Ci0JfQotICAgIH0KLSAgICBIQUxUX1NZUygpOwotICAgIHJldHVybiAwOwotICAgIC8qTk9UUkVBQ0hFRCAqLwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L2ZwdS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L2ZwdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdjMzQ1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9mcHUuYworKysgL2Rldi9udWxsCkBAIC0xLDk0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6CQlBTlNJIEMKLSogRW52aXJvbm1lbnQ6CUFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0byBpbXBsZW1lbnQgdGhlIGRlY29kaW5nIGFuZAotKiAgICAgICAgICAgICAgIGVtdWxhdGlvbiBvZiB0aGUgRlBVIGluc3RydWN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBvcGNvZGU9MHhkOCAqLwotdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2Q4KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkVTQyBEOFxuIik7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpOwotfQotCi0jaWZkZWYgREVCVUcKLQotc3RhdGljIGNoYXIgKng4NmVtdV9mcHVfb3BfZDlfdGFiW10gPSB7Ci0gICAgIkZMRFx0RFdPUkQgUFRSICIsICJFU0NfRDlcdCIsICJGU1RcdERXT1JEIFBUUiAiLCAiRlNUUFx0RFdPUkQgUFRSICIsCi0gICAgIkZMREVOVlx0IiwgIkZMRENXXHQiLCAiRlNURU5WXHQiLCAiRlNUQ1dcdCIsCi0KLSAgICAiRkxEXHREV09SRCBQVFIgIiwgIkVTQ19EOVx0IiwgIkZTVFx0RFdPUkQgUFRSICIsICJGU1RQXHREV09SRCBQVFIgIiwKLSAgICAiRkxERU5WXHQiLCAiRkxEQ1dcdCIsICJGU1RFTlZcdCIsICJGU1RDV1x0IiwKLQotICAgICJGTERcdERXT1JEIFBUUiAiLCAiRVNDX0Q5XHQiLCAiRlNUXHREV09SRCBQVFIgIiwgIkZTVFBcdERXT1JEIFBUUiAiLAotICAgICJGTERFTlZcdCIsICJGTERDV1x0IiwgIkZTVEVOVlx0IiwgIkZTVENXXHQiLAotfTsKLQotc3RhdGljIGNoYXIgKng4NmVtdV9mcHVfb3BfZDlfdGFiMVtdID0gewotICAgICJGTERcdCIsICJGTERcdCIsICJGTERcdCIsICJGTERcdCIsCi0gICAgIkZMRFx0IiwgIkZMRFx0IiwgIkZMRFx0IiwgIkZMRFx0IiwKLQotICAgICJGWENIXHQiLCAiRlhDSFx0IiwgIkZYQ0hcdCIsICJGWENIXHQiLAotICAgICJGWENIXHQiLCAiRlhDSFx0IiwgIkZYQ0hcdCIsICJGWENIXHQiLAotCi0gICAgIkZOT1AiLCAiRVNDX0Q5IiwgIkVTQ19EOSIsICJFU0NfRDkiLAotICAgICJFU0NfRDkiLCAiRVNDX0Q5IiwgIkVTQ19EOSIsICJFU0NfRDkiLAotCi0gICAgIkZTVFBcdCIsICJGU1RQXHQiLCAiRlNUUFx0IiwgIkZTVFBcdCIsCi0gICAgIkZTVFBcdCIsICJGU1RQXHQiLCAiRlNUUFx0IiwgIkZTVFBcdCIsCi0KLSAgICAiRkNIUyIsICJGQUJTIiwgIkVTQ19EOSIsICJFU0NfRDkiLAotICAgICJGVFNUIiwgIkZYQU0iLCAiRVNDX0Q5IiwgIkVTQ19EOSIsCi0KLSAgICAiRkxEMSIsICJGTERMMlQiLCAiRkxETDJFIiwgIkZMRFBJIiwKLSAgICAiRkxETEcyIiwgIkZMRExOMiIsICJGTERaIiwgIkVTQ19EOSIsCi0KLSAgICAiRjJYTTEiLCAiRllMMlgiLCAiRlBUQU4iLCAiRlBBVEFOIiwKLSAgICAiRlhUUkFDVCIsICJFU0NfRDkiLCAiRkRFQ1NUUCIsICJGSU5DU1RQIiwKLQotICAgICJGUFJFTSIsICJGWUwyWFAxIiwgIkZTUVJUIiwgIkVTQ19EOSIsCi0gICAgIkZSTkRJTlQiLCAiRlNDQUxFIiwgIkVTQ19EOSIsICJFU0NfRDkiLAotfTsKLQotI2VuZGlmIC8qIERFQlVHICovCi0KLS8qIG9wY29kZT0weGQ5ICovCi12b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZDkodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLQl1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggc3RrZWxlbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSNpZmRlZiBERUJVRwotICAgIGlmIChtb2QgIT0gMykgewotCURFQ09ERV9QUklOVElOU1RSMzIoeDg2ZW11X2ZwdV9vcF9kOV90YWIsIG1vZCwgcmgsIHJsKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoeDg2ZW11X2ZwdV9vcF9kOV90YWIxWyhyaCA8PCAzKSArIHJsXSk7Ci0gICAgfQotI2VuZGlmCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQkJc3RrZWxlbSA9ICh1OClybDsKLQkJaWYgKHJoIDwgNCkgewotCQkJCURFQ09ERV9QUklOVEYyKCJTVCglZClcbiIsIHN0a2VsZW0pOwotCQl9IGVsc2UgewotCQkJCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCX0KLQlicmVhazsKLSAgICB9Ci0jaWZkZWYgWDg2RU1VX0ZQVV9QUkVTRU5UCi0gICAgLyogZXhlY3V0ZSAqLwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgICBjYXNlIDM6Ci0Jc3dpdGNoIChyaCkgewotCSAgY2FzZSAwOgotCSAgICB4ODZlbXVfZnB1X1JfZmxkKFg4NkVNVV9GUFVfU1RLVE9QLCBzdGtlbGVtKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDE6Ci0JICAgIHg4NmVtdV9mcHVfUl9meGNoKFg4NkVNVV9GUFVfU1RLVE9QLCBzdGtlbGVtKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICAgIHN3aXRjaCAocmwpIHsKLQkgICAgICBjYXNlIDA6Ci0JCXg4NmVtdV9mcHVfUl9ub3AoKTsKLQkJYnJlYWs7Ci0JICAgICAgZGVmYXVsdDoKLQkJeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICBjYXNlIDM6Ci0JICAgIHg4NmVtdV9mcHVfUl9mc3RwKFg4NkVNVV9GUFVfU1RLVE9QLCBzdGtlbGVtKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JICAgIHN3aXRjaCAocmwpIHsKLQkgICAgY2FzZSAwOgotCQl4ODZlbXVfZnB1X1JfZmNocyhYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDE6Ci0JCXg4NmVtdV9mcHVfUl9mYWJzKFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNDoKLQkJeDg2ZW11X2ZwdV9SX2Z0c3QoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgY2FzZSA1OgotCQl4ODZlbXVfZnB1X1JfZnhhbShYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQkvKiAyLDMsNiw3ICovCi0JCXg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCQlicmVhazsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSA1OgotCSAgICBzd2l0Y2ggKHJsKSB7Ci0JICAgICAgY2FzZSAwOgotCQl4ODZlbXVfZnB1X1JfZmxkMShYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMToKLQkJeDg2ZW11X2ZwdV9SX2ZsZGwydChYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMjoKLQkJeDg2ZW11X2ZwdV9SX2ZsZGwyZShYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMzoKLQkJeDg2ZW11X2ZwdV9SX2ZsZHBpKFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSA0OgotCQl4ODZlbXVfZnB1X1JfZmxkbGcyKFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSA1OgotCQl4ODZlbXVfZnB1X1JfZmxkbG4yKFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSA2OgotCQl4ODZlbXVfZnB1X1JfZmxkeihYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCS8qIDcgKi8KLQkJeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDY6Ci0JICAgIHN3aXRjaCAocmwpIHsKLQkgICAgICBjYXNlIDA6Ci0JCXg4NmVtdV9mcHVfUl9mMnhtMShYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMToKLQkJeDg2ZW11X2ZwdV9SX2Z5bDJ4KFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAyOgotCQl4ODZlbXVfZnB1X1JfZnB0YW4oWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDM6Ci0JCXg4NmVtdV9mcHVfUl9mcGF0YW4oWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDQ6Ci0JCXg4NmVtdV9mcHVfUl9meHRyYWN0KFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSA1OgotCQl4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSA2OgotCQl4ODZlbXVfZnB1X1JfZGVjc3RwKCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgNzoKLQkJeDg2ZW11X2ZwdV9SX2luY3N0cCgpOwotCQlicmVhazsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSA3OgotCSAgICBzd2l0Y2ggKHJsKSB7Ci0JICAgICAgY2FzZSAwOgotCQl4ODZlbXVfZnB1X1JfZnByZW0oWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDE6Ci0JCXg4NmVtdV9mcHVfUl9meWwyeHAxKFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAyOgotCQl4ODZlbXVfZnB1X1JfZnNxcnQoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDM6Ci0JCXg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDQ6Ci0JCXg4NmVtdV9mcHVfUl9mcm5kaW50KFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSA1OgotCQl4ODZlbXVfZnB1X1JfZnNjYWxlKFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSA2OgotCSAgICAgIGNhc2UgNzoKLQkgICAgICBkZWZhdWx0OgotCQl4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIHN3aXRjaCAocmgpIHsKLQkgICAgICBjYXNlIDA6Ci0JCXg4NmVtdV9mcHVfTV9mbGQoWDg2RU1VX0ZQVV9GTE9BVCwgZGVzdG9mZnNldCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMToKLQkJeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMjoKLQkJeDg2ZW11X2ZwdV9NX2ZzdChYODZFTVVfRlBVX0ZMT0FULCBkZXN0b2Zmc2V0KTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAzOgotCQl4ODZlbXVfZnB1X01fZnN0cChYODZFTVVfRlBVX0ZMT0FULCBkZXN0b2Zmc2V0KTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSA0OgotCQl4ODZlbXVfZnB1X01fZmxkZW52KFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgNToKLQkJeDg2ZW11X2ZwdV9NX2ZsZGN3KFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgNjoKLQkJeDg2ZW11X2ZwdV9NX2ZzdGVudihYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDc6Ci0JCXg4NmVtdV9mcHVfTV9mc3RjdyhYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCQlicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0jZW5kaWYgLyogWDg2RU1VX0ZQVV9QUkVTRU5UICovCi0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpOwotfQotCi0jaWZkZWYgREVCVUcKLQotY2hhciAqeDg2ZW11X2ZwdV9vcF9kYV90YWJbXSA9IHsKLSAgICAiRklBRERcdERXT1JEIFBUUiAiLCAiRklNVUxcdERXT1JEIFBUUiAiLCAiRklDT01cdERXT1JEIFBUUiAiLAotICAgICJGSUNPTVBcdERXT1JEIFBUUiAiLAotICAgICJGSVNVQlx0RFdPUkQgUFRSICIsICJGSVNVQlJcdERXT1JEIFBUUiAiLCAiRklESVZcdERXT1JEIFBUUiAiLAotICAgICJGSURJVlJcdERXT1JEIFBUUiAiLAotCi0gICAgIkZJQUREXHREV09SRCBQVFIgIiwgIkZJTVVMXHREV09SRCBQVFIgIiwgIkZJQ09NXHREV09SRCBQVFIgIiwKLSAgICAiRklDT01QXHREV09SRCBQVFIgIiwKLSAgICAiRklTVUJcdERXT1JEIFBUUiAiLCAiRklTVUJSXHREV09SRCBQVFIgIiwgIkZJRElWXHREV09SRCBQVFIgIiwKLSAgICAiRklESVZSXHREV09SRCBQVFIgIiwKLQotICAgICJGSUFERFx0RFdPUkQgUFRSICIsICJGSU1VTFx0RFdPUkQgUFRSICIsICJGSUNPTVx0RFdPUkQgUFRSICIsCi0gICAgIkZJQ09NUFx0RFdPUkQgUFRSICIsCi0gICAgIkZJU1VCXHREV09SRCBQVFIgIiwgIkZJU1VCUlx0RFdPUkQgUFRSICIsICJGSURJVlx0RFdPUkQgUFRSICIsCi0gICAgIkZJRElWUlx0RFdPUkQgUFRSICIsCi0KLSAgICAiRVNDX0RBICIsICJFU0NfREEgIiwgIkVTQ19EQSAiLCAiRVNDX0RBICIsCi0gICAgIkVTQ19EQSAgICAgIiwgIkVTQ19EQSAiLCAiRVNDX0RBICAgIiwgIkVTQ19EQSAiLAotfTsKLQotI2VuZGlmIC8qIERFQlVHICovCi0KLS8qIG9wY29kZT0weGRhICovCi12b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGEodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLQl1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggc3RrZWxlbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBERUNPREVfUFJJTlRJTlNUUjMyKHg4NmVtdV9mcHVfb3BfZGFfdGFiLCBtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMzogICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JCXN0a2VsZW0gPSAodTgpcmw7Ci0JREVDT0RFX1BSSU5URjIoIlx0U1QoJWQpLFNUXG4iLCBzdGtlbGVtKTsKLQlicmVhazsKLSAgICB9Ci0jaWZkZWYgWDg2RU1VX0ZQVV9QUkVTRU5UCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICAgIGNhc2UgMzoKLQl4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0Jc3dpdGNoIChyaCkgewotCSAgY2FzZSAwOgotCSAgICB4ODZlbXVfZnB1X01faWFkZChYODZFTVVfRlBVX1NIT1JULCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDE6Ci0JICAgIHg4NmVtdV9mcHVfTV9pbXVsKFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgICAgeDg2ZW11X2ZwdV9NX2ljb20oWDg2RU1VX0ZQVV9TSE9SVCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAzOgotCSAgICB4ODZlbXVfZnB1X01faWNvbXAoWDg2RU1VX0ZQVV9TSE9SVCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCSAgICB4ODZlbXVfZnB1X01faXN1YihYODZFTVVfRlBVX1NIT1JULCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDU6Ci0JICAgIHg4NmVtdV9mcHVfTV9pc3VicihYODZFTVVfRlBVX1NIT1JULCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDY6Ci0JICAgIHg4NmVtdV9mcHVfTV9pZGl2KFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNzoKLQkgICAgeDg2ZW11X2ZwdV9NX2lkaXZyKFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpOwotfQotCi0jaWZkZWYgREVCVUcKLQotY2hhciAqeDg2ZW11X2ZwdV9vcF9kYl90YWJbXSA9IHsKLSAgICAiRklMRFx0RFdPUkQgUFRSICIsICJFU0NfREJcdDE5IiwgIkZJU1RcdERXT1JEIFBUUiAiLCAiRklTVFBcdERXT1JEIFBUUiAiLAotICAgICJFU0NfREJcdDFDIiwgIkZMRFx0VEJZVEUgUFRSICIsICJFU0NfREJcdDFFIiwgIkZTVFBcdFRCWVRFIFBUUiAiLAotCi0gICAgIkZJTERcdERXT1JEIFBUUiAiLCAiRVNDX0RCXHQxOSIsICJGSVNUXHREV09SRCBQVFIgIiwgIkZJU1RQXHREV09SRCBQVFIgIiwKLSAgICAiRVNDX0RCXHQxQyIsICJGTERcdFRCWVRFIFBUUiAiLCAiRVNDX0RCXHQxRSIsICJGU1RQXHRUQllURSBQVFIgIiwKLQotICAgICJGSUxEXHREV09SRCBQVFIgIiwgIkVTQ19EQlx0MTkiLCAiRklTVFx0RFdPUkQgUFRSICIsICJGSVNUUFx0RFdPUkQgUFRSICIsCi0gICAgIkVTQ19EQlx0MUMiLCAiRkxEXHRUQllURSBQVFIgIiwgIkVTQ19EQlx0MUUiLCAiRlNUUFx0VEJZVEUgUFRSICIsCi19OwotCi0jZW5kaWYgLyogREVCVUcgKi8KLQotLyogb3Bjb2RlPTB4ZGIgKi8KLXZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kYih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotCXVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSNpZmRlZiBERUJVRwotICAgIGlmIChtb2QgIT0gMykgewotCURFQ09ERV9QUklOVElOU1RSMzIoeDg2ZW11X2ZwdV9vcF9kYl90YWIsIG1vZCwgcmgsIHJsKTsKLSAgICB9IGVsc2UgaWYgKHJoID09IDQpIHsgICAgICAgLyogPT09IDExIDEwIDAgbm5uICovCi0Jc3dpdGNoIChybCkgewotCSAgY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGKCJGRU5JXG4iKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIkZESVNJXG4iKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIkZDTEVYXG4iKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIkZJTklUXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URjIoIkVTQ19EQiAlMHhcbiIsIChtb2QgPDwgNikgKyAocmggPDwgMykgKyAocmwpKTsKLSAgICB9Ci0jZW5kaWYgLyogREVCVUcgKi8KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCWJyZWFrOwotICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWJyZWFrOwotICAgIH0KLSNpZmRlZiBYODZFTVVfRlBVX1BSRVNFTlQKLSAgICAvKiBleGVjdXRlICovCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICAgIGNhc2UgMzoKLQlzd2l0Y2ggKHJoKSB7Ci0JICBjYXNlIDQ6Ci0JICAgIHN3aXRjaCAocmwpIHsKLQkgICAgICBjYXNlIDA6Ci0JCXg4NmVtdV9mcHVfUl9mZW5pKCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMToKLQkJeDg2ZW11X2ZwdV9SX2ZkaXNpKCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMjoKLQkJeDg2ZW11X2ZwdV9SX2ZjbGV4KCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMzoKLQkJeDg2ZW11X2ZwdV9SX2Zpbml0KCk7Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCXg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCQlicmVhazsKLQkgICAgfQotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIHg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXN3aXRjaCAocmgpIHsKLQkgIGNhc2UgMDoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZpbGQoWDg2RU1VX0ZQVV9TSE9SVCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxOgotCSAgICB4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICAgIHg4NmVtdV9mcHVfTV9maXN0KFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMzoKLQkgICAgeDg2ZW11X2ZwdV9NX2Zpc3RwKFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA1OgotCSAgICB4ODZlbXVfZnB1X01fZmxkKFg4NkVNVV9GUFVfTERCTCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCQkgICAgICBjYXNlIDY6Ci0JICAgIHg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNzoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZzdHAoWDg2RU1VX0ZQVV9MREJMLCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKTsKLX0KLQotI2lmZGVmIERFQlVHCi1jaGFyICp4ODZlbXVfZnB1X29wX2RjX3RhYltdID0gewotICAgICJGQUREXHRRV09SRCBQVFIgIiwgIkZNVUxcdFFXT1JEIFBUUiAiLCAiRkNPTVx0UVdPUkQgUFRSICIsCi0gICAgIkZDT01QXHRRV09SRCBQVFIgIiwKLSAgICAiRlNVQlx0UVdPUkQgUFRSICIsICJGU1VCUlx0UVdPUkQgUFRSICIsICJGRElWXHRRV09SRCBQVFIgIiwKLSAgICAiRkRJVlJcdFFXT1JEIFBUUiAiLAotCi0gICAgIkZBRERcdFFXT1JEIFBUUiAiLCAiRk1VTFx0UVdPUkQgUFRSICIsICJGQ09NXHRRV09SRCBQVFIgIiwKLSAgICAiRkNPTVBcdFFXT1JEIFBUUiAiLAotICAgICJGU1VCXHRRV09SRCBQVFIgIiwgIkZTVUJSXHRRV09SRCBQVFIgIiwgIkZESVZcdFFXT1JEIFBUUiAiLAotICAgICJGRElWUlx0UVdPUkQgUFRSICIsCi0KLSAgICAiRkFERFx0UVdPUkQgUFRSICIsICJGTVVMXHRRV09SRCBQVFIgIiwgIkZDT01cdFFXT1JEIFBUUiAiLAotICAgICJGQ09NUFx0UVdPUkQgUFRSICIsCi0gICAgIkZTVUJcdFFXT1JEIFBUUiAiLCAiRlNVQlJcdFFXT1JEIFBUUiAiLCAiRkRJVlx0UVdPUkQgUFRSICIsCi0gICAgIkZESVZSXHRRV09SRCBQVFIgIiwKLQotICAgICJGQUREXHQiLCAiRk1VTFx0IiwgIkZDT01cdCIsICJGQ09NUFx0IiwKLSAgICAiRlNVQlJcdCIsICJGU1VCXHQiLCAiRkRJVlJcdCIsICJGRElWXHQiLAotfTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0vKiBvcGNvZGU9MHhkYyAqLwotdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RjKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0JdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IHN0a2VsZW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgREVDT0RFX1BSSU5USU5TVFIzMih4ODZlbXVfZnB1X29wX2RjX3RhYiwgbW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JCXN0a2VsZW0gPSAodTgpcmw7Ci0JREVDT0RFX1BSSU5URjIoIlx0U1QoJWQpLFNUXG4iLCBzdGtlbGVtKTsKLQlicmVhazsKLSAgICB9Ci0jaWZkZWYgWDg2RU1VX0ZQVV9QUkVTRU5UCi0gICAgLyogZXhlY3V0ZSAqLwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgICBjYXNlIDM6Ci0Jc3dpdGNoIChyaCkgewotCSAgY2FzZSAwOgotCSAgICB4ODZlbXVfZnB1X1JfZmFkZChzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxOgotCSAgICB4ODZlbXVfZnB1X1JfZm11bChzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgICB4ODZlbXVfZnB1X1JfZmNvbShzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAzOgotCSAgICB4ODZlbXVfZnB1X1JfZmNvbXAoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZzdWJyKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDU6Ci0JICAgIHg4NmVtdV9mcHVfUl9mc3ViKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDY6Ci0JICAgIHg4NmVtdV9mcHVfUl9mZGl2cihzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA3OgotCSAgICB4ODZlbXVfZnB1X1JfZmRpdihzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0Jc3dpdGNoIChyaCkgewotCSAgY2FzZSAwOgotCSAgICB4ODZlbXVfZnB1X01fZmFkZChYODZFTVVfRlBVX0RPVUJMRSwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxOgotCSAgICB4ODZlbXVfZnB1X01fZm11bChYODZFTVVfRlBVX0RPVUJMRSwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgICB4ODZlbXVfZnB1X01fZmNvbShYODZFTVVfRlBVX0RPVUJMRSwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAzOgotCSAgICB4ODZlbXVfZnB1X01fZmNvbXAoWDg2RU1VX0ZQVV9ET1VCTEUsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZzdWIoWDg2RU1VX0ZQVV9ET1VCTEUsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNToKLQkgICAgeDg2ZW11X2ZwdV9NX2ZzdWJyKFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDY6Ci0JICAgIHg4NmVtdV9mcHVfTV9mZGl2KFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDc6Ci0JICAgIHg4NmVtdV9mcHVfTV9mZGl2cihYODZFTVVfRlBVX0RPVUJMRSwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSX05PX1RSQUNFKCk7Ci19Ci0KLSNpZmRlZiBERUJVRwotCi1zdGF0aWMgY2hhciAqeDg2ZW11X2ZwdV9vcF9kZF90YWJbXSA9IHsKLSAgICAiRkxEXHRRV09SRCBQVFIgIiwgIkVTQ19ERFx0MjksIiwgIkZTVFx0UVdPUkQgUFRSICIsICJGU1RQXHRRV09SRCBQVFIgIiwKLSAgICAiRlJTVE9SXHQiLCAiRVNDX0REXHQyRCwiLCAiRlNBVkVcdCIsICJGU1RTV1x0IiwKLQotICAgICJGTERcdFFXT1JEIFBUUiAiLCAiRVNDX0REXHQyOSwiLCAiRlNUXHRRV09SRCBQVFIgIiwgIkZTVFBcdFFXT1JEIFBUUiAiLAotICAgICJGUlNUT1JcdCIsICJFU0NfRERcdDJELCIsICJGU0FWRVx0IiwgIkZTVFNXXHQiLAotCi0gICAgIkZMRFx0UVdPUkQgUFRSICIsICJFU0NfRERcdDI5LCIsICJGU1RcdFFXT1JEIFBUUiAiLCAiRlNUUFx0UVdPUkQgUFRSICIsCi0gICAgIkZSU1RPUlx0IiwgIkVTQ19ERFx0MkQsIiwgIkZTQVZFXHQiLCAiRlNUU1dcdCIsCi0KLSAgICAiRkZSRUVcdCIsICJGWENIXHQiLCAiRlNUXHQiLCAiRlNUUFx0IiwKLSAgICAiRVNDX0REXHQyQywiLCAiRVNDX0REXHQyRCwiLCAiRVNDX0REXHQyRSwiLCAiRVNDX0REXHQyRiwiLAotfTsKLQotI2VuZGlmIC8qIERFQlVHICovCi0KLS8qIG9wY29kZT0weGRkICovCi12b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLQl1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggc3RrZWxlbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBERUNPREVfUFJJTlRJTlNUUjMyKHg4NmVtdV9mcHVfb3BfZGRfdGFiLCBtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQkJc3RrZWxlbSA9ICh1OClybDsKLQlERUNPREVfUFJJTlRGMigiXHRTVCglZCksU1RcbiIsIHN0a2VsZW0pOwotCWJyZWFrOwotICAgIH0KLSNpZmRlZiBYODZFTVVfRlBVX1BSRVNFTlQKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgICAgY2FzZSAzOgotCXN3aXRjaCAocmgpIHsKLQkgIGNhc2UgMDoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZmcmVlKHN0a2VsZW0pOwotCSAgICBicmVhazsKLQkgIGNhc2UgMToKLQkgICAgeDg2ZW11X2ZwdV9SX2Z4Y2goc3RrZWxlbSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgICB4ODZlbXVfZnB1X1JfZnN0KHN0a2VsZW0pOyAgLyogcmVnaXN0ZXIgdmVyc2lvbiAqLwotCSAgICBicmVhazsKLQkgIGNhc2UgMzoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZzdHAoc3RrZWxlbSk7IC8qIHJlZ2lzdGVyIHZlcnNpb24gKi8KLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICB4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlzd2l0Y2ggKHJoKSB7Ci0JICBjYXNlIDA6Ci0JICAgIHg4NmVtdV9mcHVfTV9mbGQoWDg2RU1VX0ZQVV9ET1VCTEUsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMToKLQkgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgICB4ODZlbXVfZnB1X01fZnN0KFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDM6Ci0JICAgIHg4NmVtdV9mcHVfTV9mc3RwKFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JICAgIHg4NmVtdV9mcHVfTV9mcnN0b3IoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDU6Ci0JICAgIHg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNjoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZzYXZlKFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA3OgotCSAgICB4ODZlbXVfZnB1X01fZnN0c3coWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKTsKLX0KLQotI2lmZGVmIERFQlVHCi0KLXN0YXRpYyBjaGFyICp4ODZlbXVfZnB1X29wX2RlX3RhYltdID0KLXsKLSAgICAiRklBRERcdFdPUkQgUFRSICIsICJGSU1VTFx0V09SRCBQVFIgIiwgIkZJQ09NXHRXT1JEIFBUUiAiLAotICAgICJGSUNPTVBcdFdPUkQgUFRSICIsCi0gICAgIkZJU1VCXHRXT1JEIFBUUiAiLCAiRklTVUJSXHRXT1JEIFBUUiAiLCAiRklESVZcdFdPUkQgUFRSICIsCi0gICAgIkZJRElWUlx0V09SRCBQVFIgIiwKLQotICAgICJGSUFERFx0V09SRCBQVFIgIiwgIkZJTVVMXHRXT1JEIFBUUiAiLCAiRklDT01cdFdPUkQgUFRSICIsCi0gICAgIkZJQ09NUFx0V09SRCBQVFIgIiwKLSAgICAiRklTVUJcdFdPUkQgUFRSICIsICJGSVNVQlJcdFdPUkQgUFRSICIsICJGSURJVlx0V09SRCBQVFIgIiwKLSAgICAiRklESVZSXHRXT1JEIFBUUiAiLAotCi0gICAgIkZJQUREXHRXT1JEIFBUUiAiLCAiRklNVUxcdFdPUkQgUFRSICIsICJGSUNPTVx0V09SRCBQVFIgIiwKLSAgICAiRklDT01QXHRXT1JEIFBUUiAiLAotICAgICJGSVNVQlx0V09SRCBQVFIgIiwgIkZJU1VCUlx0V09SRCBQVFIgIiwgIkZJRElWXHRXT1JEIFBUUiAiLAotICAgICJGSURJVlJcdFdPUkQgUFRSICIsCi0KLSAgICAiRkFERFBcdCIsICJGTVVMUFx0IiwgIkZDT01QXHQiLCAiRkNPTVBQXHQiLAotICAgICJGU1VCUlBcdCIsICJGU1VCUFx0IiwgIkZESVZSUFx0IiwgIkZESVZQXHQiLAotfTsKLQotI2VuZGlmIC8qIERFQlVHICovCi0KLS8qIG9wY29kZT0weGRlICovCi12b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLQl1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggc3RrZWxlbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBERUNPREVfUFJJTlRJTlNUUjMyKHg4NmVtdV9mcHVfb3BfZGVfdGFiLCBtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQkJc3RrZWxlbSA9ICh1OClybDsKLQlERUNPREVfUFJJTlRGMigiXHRTVCglZCksU1RcbiIsIHN0a2VsZW0pOwotCWJyZWFrOwotICAgIH0KLSNpZmRlZiBYODZFTVVfRlBVX1BSRVNFTlQKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgICAgY2FzZSAzOgotCXN3aXRjaCAocmgpIHsKLQkgIGNhc2UgMDoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZhZGRwKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDE6Ci0JICAgIHg4NmVtdV9mcHVfUl9mbXVscChzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgICB4ODZlbXVfZnB1X1JfZmNvbXAoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBicmVhazsKLQkgIGNhc2UgMzoKLQkgICAgaWYgKHN0a2VsZW0gPT0gMSkKLQkgICAgICB4ODZlbXVfZnB1X1JfZmNvbXBwKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgZWxzZQotCSAgICAgIHg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZzdWJycChzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA1OgotCSAgICB4ODZlbXVfZnB1X1JfZnN1YnAoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBicmVhazsKLQkgIGNhc2UgNjoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZkaXZycChzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA3OgotCSAgICB4ODZlbXVfZnB1X1JfZmRpdnAoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXN3aXRjaCAocmgpIHsKLQkgIGNhc2UgMDoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZpYWRkKFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxOgotCSAgICB4ODZlbXVfZnB1X01fZmltdWwoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICAgIHg4NmVtdV9mcHVfTV9maWNvbShYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMzoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZpY29tcChYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgeDg2ZW11X2ZwdV9NX2Zpc3ViKFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA1OgotCSAgICB4ODZlbXVfZnB1X01fZmlzdWJyKFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA2OgotCSAgICB4ODZlbXVfZnB1X01fZmlkaXYoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDc6Ci0JICAgIHg4NmVtdV9mcHVfTV9maWRpdnIoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKTsKLX0KLQotI2lmZGVmIERFQlVHCi0KLXN0YXRpYyBjaGFyICp4ODZlbXVfZnB1X29wX2RmX3RhYltdID0gewotICAgIC8qIG1vZCA9PSAwMCAqLwotICAgICJGSUxEXHRXT1JEIFBUUiAiLCAiRVNDX0RGXHQzOVxuIiwgIkZJU1RcdFdPUkQgUFRSICIsICJGSVNUUFx0V09SRCBQVFIgIiwKLSAgICAiRkJMRFx0VEJZVEUgUFRSICIsICJGSUxEXHRRV09SRCBQVFIgIiwgIkZCU1RQXHRUQllURSBQVFIgIiwKLSAgICAiRklTVFBcdFFXT1JEIFBUUiAiLAotCi0gICAgLyogbW9kID09IDAxICovCi0gICAgIkZJTERcdFdPUkQgUFRSICIsICJFU0NfREZcdDM5ICIsICJGSVNUXHRXT1JEIFBUUiAiLCAiRklTVFBcdFdPUkQgUFRSICIsCi0gICAgIkZCTERcdFRCWVRFIFBUUiAiLCAiRklMRFx0UVdPUkQgUFRSICIsICJGQlNUUFx0VEJZVEUgUFRSICIsCi0gICAgIkZJU1RQXHRRV09SRCBQVFIgIiwKLQotICAgIC8qIG1vZCA9PSAxMCAqLwotICAgICJGSUxEXHRXT1JEIFBUUiAiLCAiRVNDX0RGXHQzOSAiLCAiRklTVFx0V09SRCBQVFIgIiwgIkZJU1RQXHRXT1JEIFBUUiAiLAotICAgICJGQkxEXHRUQllURSBQVFIgIiwgIkZJTERcdFFXT1JEIFBUUiAiLCAiRkJTVFBcdFRCWVRFIFBUUiAiLAotICAgICJGSVNUUFx0UVdPUkQgUFRSICIsCi0KLSAgICAvKiBtb2QgPT0gMTEgKi8KLSAgICAiRkZSRUVcdCIsICJGWENIXHQiLCAiRlNUXHQiLCAiRlNUUFx0IiwKLSAgICAiRVNDX0RGXHQzQywiLCAiRVNDX0RGXHQzRCwiLCAiRVNDX0RGXHQzRSwiLCAiRVNDX0RGXHQzRiwiCi19OwotCi0jZW5kaWYgLyogREVCVUcgKi8KLQotLyogb3Bjb2RlPTB4ZGYgKi8KLXZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotCXVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBzdGtlbGVtOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIERFQ09ERV9QUklOVElOU1RSMzIoeDg2ZW11X2ZwdV9vcF9kZl90YWIsIG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCQlzdGtlbGVtID0gKHU4KXJsOwotCURFQ09ERV9QUklOVEYyKCJcdFNUKCVkKVxuIiwgc3RrZWxlbSk7Ci0JYnJlYWs7Ci0gICAgfQotI2lmZGVmIFg4NkVNVV9GUFVfUFJFU0VOVAotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgICBjYXNlIDM6Ci0Jc3dpdGNoIChyaCkgewotCSAgY2FzZSAwOgotCSAgICB4ODZlbXVfZnB1X1JfZmZyZWUoc3RrZWxlbSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxOgotCSAgICB4ODZlbXVfZnB1X1JfZnhjaChzdGtlbGVtKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICAgIHg4NmVtdV9mcHVfUl9mc3Qoc3RrZWxlbSk7ICAvKiByZWdpc3RlciB2ZXJzaW9uICovCi0JICAgIGJyZWFrOwotCSAgY2FzZSAzOgotCSAgICB4ODZlbXVfZnB1X1JfZnN0cChzdGtlbGVtKTsgLyogcmVnaXN0ZXIgdmVyc2lvbiAqLwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIHg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXN3aXRjaCAocmgpIHsKLQkgIGNhc2UgMDoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZpbGQoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDE6Ci0JICAgIHg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgICAgeDg2ZW11X2ZwdV9NX2Zpc3QoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDM6Ci0JICAgIHg4NmVtdV9mcHVfTV9maXN0cChYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZibGQoWDg2RU1VX0ZQVV9CU0QsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNToKLQkgICAgeDg2ZW11X2ZwdV9NX2ZpbGQoWDg2RU1VX0ZQVV9MT05HLCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDY6Ci0JICAgIHg4NmVtdV9mcHVfTV9mYnN0cChYODZFTVVfRlBVX0JTRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA3OgotCSAgICB4ODZlbXVfZnB1X01fZmlzdHAoWDg2RU1VX0ZQVV9MT05HLCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9tYWtlZmlsZSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9tYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlMmU5ZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0jCi0jICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSMgIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSMgIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSMgIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotIyAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotIyAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotIyAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSMgIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0jICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotIwotIyAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0jICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0jICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotIyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotIyAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0jICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0jICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBtYWtlZmlsZSBmb3IgdGhlIHg4NmVtdSBsaWJyYXJ5LiBSZXF1aXJlcwotIyAgICAgICAgICAgICAgIHRoZSBTY2lUZWNoIFNvZnR3YXJlIG1ha2VmaWxlIGRlZmluaXRpb25zIHBhY2thZ2UgdG8gYmUKLSMgICAgICAgICAgICAgICBpbnN0YWxsZWQsIHdoaWNoIHVzZXMgdGhlIERNQUtFIG1ha2UgcHJvZ3JhbS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLS5JTVBPUlQgLklHTk9SRTogREVCVUcKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIHRoZSBsaXN0cyBvZiBvYmplY3QgZmlsZXMKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU9CSkVDVFMJCQk9IHN5cyRPIGRlY29kZSRPIG9wcyRPIG9wczIkTyBwcmltX29wcyRPIGZwdSRPIGRlYnVnJE8KLUNGTEFHUyAgICAgIAkrPSAtRFNDSVRFQ0gKLS5JRiAkKERFQlVHKQotQ0ZMQUdTCQkJKz0gLURERUJVRwotLkVORElGCi1MSUJDTEVBTiAgCQk9ICouZGxsICoubGliICouYQotTElCRklMRSAJCT0gJChMUCl4ODZlbXUkTAotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTYW1wbGUgdGVzdCBwcm9ncmFtcwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYWxsOiAkKExJQkZJTEUpCi0KLXZhbGlkYXRlJEU6IHZhbGlkYXRlJE8gJChMSUJGSUxFKQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgdGhlIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIHRvIGNyZWF0ZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGZvcgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotREVQRU5EX09CSiAgICAgID0gIHZhbGlkYXRlJE8gJChPQkpFQ1RTKQotCi0uSU5DTFVERTogIiQoU0NJVEVDSCkvbWFrZWRlZnMvY29tbW9uLm1rIgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L21ha2VmaWxlLmNyb3NzIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L21ha2VmaWxlLmNyb3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmNlOWE5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9tYWtlZmlsZS5jcm9zcworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSMKLSMgICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotIyAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotIyAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotIyAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0jICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0jICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0jICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotIyAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSMgIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0jCi0jICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSMgIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSMgIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0jICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0jICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSMgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSMgIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBMaW51eCBzcGVjaWZpYyBtYWtlZmlsZSBmb3IgdGhlIHg4NmVtdSBsaWJyYXJ5LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQ0MgPSAkKENST1NTX0NPTVBJTEUpZ2NjCi1BUiA9ICQoQ1JPU1NfQ09NUElMRSlhcgotCi1UQVJHRVRMSUIgPSBsaWJ4ODZlbXUuYQotVEFSR0VUREVCVUdMSUIgPWxpYng4NmVtdWQuYQotCi1PQkpTPVwKLWRlY29kZS5vIFwKLWZwdS5vIFwKLW9wcy5vIFwKLW9wczIubyBcCi1wcmltX29wcy5vIFwKLXN5cy5vCi0KLURFQlVHT0JKUz1kZWJ1Zy5kIFwKLSAgICAgICAgICBkZWNvZGUuZCBcCi0JICBmcHUuZCBcCi0JICBvcHMuZCBcCi0JICBvcHMyLmQgXAotCSAgcHJpbV9vcHMuZCBcCi0JICBzeXMuZAotCi0uU1VGRklYRVM6IC5kCi0KLWFsbDogJChUQVJHRVRMSUIpICQoVEFSR0VUREVCVUdMSUIpCi0KLSQoVEFSR0VUTElCKTogJChPQkpTKQotCSQoQVIpIHJ2ICQoVEFSR0VUTElCKSAkKE9CSlMpCi0KLSQoVEFSR0VUREVCVUdMSUIpOiAkKERFQlVHT0JKUykKLQkkKEFSKSBydiAkKFRBUkdFVERFQlVHTElCKSAkKERFQlVHT0JKUykKLQotSU5DUyAgID0gLUkuIC1JeDg2ZW11IC1JLi4vLi4vaW5jbHVkZQotQ0ZMQUdTID0gLURfX0RSSVZFUl9fIC1ERk9SQ0VfUE9TVCAtRF9DRVhQT1JUPSAtRE5PX0xPTkdfTE9ORyAtRHByaW50az1wcmludGYgLWZzaWduZWQtY2hhciAgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpCi1DREVCVUdGTEFHUyA9IC1EREVCVUcKLQotLmMubzoKLQkkKENDKSAtZyAtTzIgLVdhbGwgLWMgJChDRkxBR1MpICQoSU5DUykgJCouYwotCi0uYy5kOgotCSQoQ0MpIC1nIC1PMiAtV2FsbCAtYyAtbyQqLmQgJChDRkxBR1MpICQoQ0RFQlVHRkxBR1MpICQoSU5DUykgJCouYwotCi0uY3BwLm86Ci0JJChDQykgLWMgJChDRkxBR1MpICQoSU5DUykgJCouY3BwCi0KLWNsZWFuOgotCXJtIC1mICouYSAqLm8gKi5kCi0KLXZhbGlkYXRlOgl2YWxpZGF0ZS5vIGxpYng4NmVtdS5hCi0JJChDQykgLW8gdmFsaWRhdGUgdmFsaWRhdGUubyAtbHg4NmVtdSAtTC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9tYWtlZmlsZS5saW51eCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9tYWtlZmlsZS5saW51eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc0Yjg4ZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvbWFrZWZpbGUubGludXgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0jCi0jICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSMgIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSMgIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSMgIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotIyAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotIyAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotIyAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSMgIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0jICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotIwotIyAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0jICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0jICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotIyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotIyAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0jICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0jICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgTGludXggc3BlY2lmaWMgbWFrZWZpbGUgZm9yIHRoZSB4ODZlbXUgbGlicmFyeS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVRBUkdFVExJQiA9IGxpYng4NmVtdS5hCi1UQVJHRVRERUJVR0xJQiA9bGlieDg2ZW11ZC5hCi0KLU9CSlM9XAotZGVjb2RlLm8gXAotZnB1Lm8gXAotb3BzLm8gXAotb3BzMi5vIFwKLXByaW1fb3BzLm8gXAotcHJlZ3MubyBcCi1zeXMubwotCi1ERUJVR09CSlM9ZGVidWcuZCBcCi0gICAgICAgICAgZGVjb2RlLmQgXAotCSAgZnB1LmQgXAotCSAgb3BzLmQgXAotCSAgb3BzMi5kIFwKLQkgIHByaW1fb3BzLmQgXAotCSAgcHJlZ3MuZCBcCi0JICBzeXMuZAotCi0uU1VGRklYRVM6IC5kCi0KLWFsbDogJChUQVJHRVRMSUIpICQoVEFSR0VUREVCVUdMSUIpCi0KLSQoVEFSR0VUTElCKTogJChPQkpTKQotCWFyIHJ2ICQoVEFSR0VUTElCKSAkKE9CSlMpCi0KLSQoVEFSR0VUREVCVUdMSUIpOiAkKERFQlVHT0JKUykKLQlhciBydiAkKFRBUkdFVERFQlVHTElCKSAkKERFQlVHT0JKUykKLQotSU5DUyAgID0gLUkuIC1JeDg2ZW11IC1JLi4vLi4vaW5jbHVkZQotQ0ZMQUdTID0gLURfX0RSSVZFUl9fIC1ERk9SQ0VfUE9TVCAtRF9DRVhQT1JUPSAtRE5PX0xPTkdfTE9ORwotQ0RFQlVHRkxBR1MgPSAtRERFQlVHCi0KLS5jLm86Ci0JZ2NjIC1nIC1PIC1XYWxsIC1jICQoQ0ZMQUdTKSAkKElOQ1MpICQqLmMKLQotLmMuZDoKLQlnY2MgLWcgLU8gLVdhbGwgLWMgLW8kKi5kICQoQ0ZMQUdTKSAkKENERUJVR0ZMQUdTKSAkKElOQ1MpICQqLmMKLQotLmNwcC5vOgotCWdjYyAtYyAkKENGTEFHUykgJChJTkNTKSAkKi5jcHAKLQotY2xlYW46Ci0Jcm0gLWYgKi5hICoubyAqLmQKLQotdmFsaWRhdGU6CXZhbGlkYXRlLm8gbGlieDg2ZW11LmEKLQlnY2MgLW8gdmFsaWRhdGUgdmFsaWRhdGUubyAtbHg4NmVtdSAtTC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9tYWtlZmlsZS51Ym9vdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9tYWtlZmlsZS51Ym9vdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5YWUxZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvbWFrZWZpbGUudWJvb3QKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0jCi0jICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSMgIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSMgIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSMgIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotIyAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotIyAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotIyAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSMgIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0jICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotIwotIyAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0jICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0jICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotIyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotIyAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0jICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0jICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgTGludXggc3BlY2lmaWMgbWFrZWZpbGUgZm9yIHRoZSB4ODZlbXUgbGlicmFyeS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1DQyA9ICQoQ1JPU1NfQ09NUElMRSlnY2MKLUFSID0gJChDUk9TU19DT01QSUxFKWFyCi1UQVJHRVRMSUIgPSBsaWJ4ODZlbXUuYQotVEFSR0VUREVCVUdMSUIgPWxpYng4NmVtdWQuYQotCi1PQkpTPVwKLWRlY29kZS5vIFwKLWZwdS5vIFwKLW9wcy5vIFwKLW9wczIubyBcCi1wcmltX29wcy5vIFwKLXN5cy5vCi0KLURFQlVHT0JKUz1kZWJ1Zy5kIFwKLSAgICAgICAgICBkZWNvZGUuZCBcCi0JICBmcHUuZCBcCi0JICBvcHMuZCBcCi0JICBvcHMyLmQgXAotCSAgcHJpbV9vcHMuZCBcCi0JICBzeXMuZAotCi0uU1VGRklYRVM6IC5kCi0KLWFsbDogJChUQVJHRVRMSUIpICQoVEFSR0VUREVCVUdMSUIpCi0KLSQoVEFSR0VUTElCKTogJChPQkpTKQotCSQoQVIpIHJ2ICQoVEFSR0VUTElCKSAkKE9CSlMpCi0KLSQoVEFSR0VUREVCVUdMSUIpOiAkKERFQlVHT0JKUykKLQkkKEFSKSBydiAkKFRBUkdFVERFQlVHTElCKSAkKERFQlVHT0JKUykKLQotSU5DUyAgID0gLUkuIC1JeDg2ZW11IC1JLi4vLi4vaW5jbHVkZQotQ0ZMQUdTID0gLURfX0RSSVZFUl9fIC1ERk9SQ0VfUE9TVCAtRF9DRVhQT1JUPSAtRE5PX0xPTkdfTE9ORyAtRHByaW50az1wcmludGYgLWZzaWduZWQtY2hhciAgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpCi1DREVCVUdGTEFHUyA9IC1EREVCVUcKLQotLmMubzoKLQkkKENDKSAtZyAtTzIgLVdhbGwgLWMgJChDRkxBR1MpICQoSU5DUykgJCouYwotCi0uYy5kOgotCSQoQ0MpIC1nIC1PMiAtV2FsbCAtYyAtbyQqLmQgJChDRkxBR1MpICQoQ0RFQlVHRkxBR1MpICQoSU5DUykgJCouYwotCi0uY3BwLm86Ci0JJChDQykgLWMgJChDRkxBR1MpICQoSU5DUykgJCouY3BwCi0KLWNsZWFuOgotCXJtIC1mICouYSAqLm8gKi5kCi0KLXZhbGlkYXRlOgl2YWxpZGF0ZS5vIGxpYng4NmVtdS5hCi0JJChDQykgLW8gdmFsaWRhdGUgdmFsaWRhdGUubyAtbHg4NmVtdSAtTC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9vcHMuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9vcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0ZjkzZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvb3BzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6CQlBTlNJIEMKLSogRW52aXJvbm1lbnQ6CUFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBpbmNsdWRlcyBzdWJyb3V0aW5lcyB0byBpbXBsZW1lbnQgdGhlIGRlY29kaW5nCi0qICAgICAgICAgICAgICAgYW5kIGVtdWxhdGlvbiBvZiBhbGwgdGhlIHg4NiBwcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zLgotKgotKiBUaGVyZSBhcmUgYXBwcm94aW1hdGVseSAyNTAgc3Vicm91dGluZXMgaW4gaGVyZSwgd2hpY2ggY29ycmVzcG9uZAotKiB0byB0aGUgMjU2IGJ5dGUtIm9wY29kZXMiIGZvdW5kIG9uIHRoZSA4MDg2LiAgVGhlIHRhYmxlIHdoaWNoCi0qIGRpc3BhdGNoZXMgdGhpcyBpcyBmb3VuZCBpbiB0aGUgZmlsZXMgb3B0YWIuW2NoXS4KLSoKLSogRWFjaCBvcGNvZGUgcHJvYyBoYXMgYSBjb21tZW50IHByZWNlZWRpbmcgaXQgd2hpY2ggZ2l2ZXMgaXQncyB0YWJsZQotKiBhZGRyZXNzLiAgU2V2ZXJhbCBvcGNvZGVzIGFyZSBtaXNzaW5nICh1bmRlZmluZWQpIGluIHRoZSB0YWJsZS4KLSoKLSogRWFjaCBwcm9jIGluY2x1ZGVzIGluZm9ybWF0aW9uIGZvciBkZWNvZGluZyAoREVDT0RFX1BSSU5URiBhbmQKLSogREVDT0RFX1BSSU5URjIpLCBkZWJ1Z2dpbmcgKFRSQUNFX1JFR1MsIFNJTkdMRV9TVEVQKSwgYW5kIG1pc2MKLSogZnVuY3Rpb25zIChTVEFSVF9PRl9JTlNUUiwgRU5EX09GX0lOU1RSKS4KLSoKLSogTWFueSBvZiB0aGUgcHJvY2VkdXJlcyBhcmUgKlZFUlkqIHNpbWlsYXIgaW4gY29kaW5nLiAgVGhpcyBoYXMKLSogYWxsb3dlZCBmb3IgYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBjb2RlIHRvIGJlIGdlbmVyYXRlZCBpbiBhIGZhaXJseQotKiBzaG9ydCBhbW91bnQgb2YgdGltZSAoaS5lLiBjdXQsIHBhc3RlLCBhbmQgbW9kaWZ5KS4gIFRoZSByZXN1bHQgaXMKLSogdGhhdCBtdWNoIG9mIHRoZSBjb2RlIGJlbG93IGNvdWxkIGhhdmUgYmVlbiBmb2xkZWQgaW50byBzdWJyb3V0aW5lcwotKiBmb3IgYSBsYXJnZSByZWR1Y3Rpb24gaW4gc2l6ZSBvZiB0aGlzIGZpbGUuICBUaGUgZG93bnNpZGUgd291bGQgYmUKLSogdGhhdCB0aGVyZSB3b3VsZCBiZSBhIHBlbmFsdHkgaW4gZXhlY3V0aW9uIHNwZWVkLiAgVGhlIGZpbGUgY291bGQKLSogYWxzbyBoYXZlIGJlZW4gKk1VQ0gqIGxhcmdlciBieSBpbmxpbmluZyBjZXJ0YWluIGZ1bmN0aW9ucyB3aGljaAotKiB3ZXJlIGNhbGxlZC4gIFRoaXMgY291bGQgaGF2ZSByZXN1bHRlZCBldmVuIGZhc3RlciBleGVjdXRpb24uICBUaGUKLSogcHJpbWUgZGlyZWN0aXZlIEkgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0byBpbmxpbmUgdGhlIGNvZGUgb3IgdG8KLSogbW9kdWxhcml6ZSBpdCwgd2FzIGJhc2ljYWxseTogMSkgbm8gdW5uZWNlc3Nhcnkgc3Vicm91dGluZSBjYWxscywKLSogMikgbm8gcm91dGluZXMgbW9yZSB0aGFuIGFib3V0IDIwMCBsaW5lcyBpbiBzaXplLCBhbmQgMykgbW9kdWxhcml6ZQotKiBhbnkgY29kZSB0aGF0IEkgbWlnaHQgbm90IGdldCByaWdodCB0aGUgZmlyc3QgdGltZS4gIFRoZSBmZXRjaF8qCi0qIHN1YnJvdXRpbmVzIGZhbGwgaW50byB0aGUgbGF0dGVyIGNhdGVnb3J5LiAgVGhlIFRoZSBkZWNvZGVfKiBmYWxsCi0qIGludG8gdGhlIHNlY29uZCBjYXRlZ29yeS4gIFRoZSBjb2Rpbmcgb2YgdGhlICJzd2l0Y2gobW9kKXsgLi4uLiB9IgotKiBpbiBtYW55IG9mIHRoZSBzdWJyb3V0aW5lcyBiZWxvdyBmYWxscyBpbnRvIHRoZSBmaXJzdCBjYXRlZ29yeS4KLSogRXNwZWNpYWxseSwgdGhlIGNvZGluZyBvZiB7YWRkLGFuZCxvcixzdWIsLi4ufV97Ynl0ZSx3b3JkfQotKiBzdWJyb3V0aW5lcyBhcmUgYW4gZXNwZWNpYWxseSBnbGFyaW5nIGNhc2Ugb2YgdGhlIHRoaXJkIGd1aWRlbGluZS4KLSogU2luY2Ugc28gbXVjaCBvZiB0aGUgY29kZSBpcyBjbG9uZWQgZnJvbSBvdGhlciBtb2R1bGVzIChjb21wYXJlCi0qIG9wY29kZSAjMDAgdG8gb3Bjb2RlICMwMSksIG1ha2luZyB0aGUgYmFzaWMgb3BlcmF0aW9ucyBzdWJyb3V0aW5lCi0qIGNhbGxzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50OyBvdGhlcndpc2UgbWlzdGFrZXMgaW4gY29kaW5nIGFuCi0qICJhZGQiIHdvdWxkIHJlcHJlc2VudCBhIG5pZ2h0bWFyZSBpbiBtYWludGVuYW5jZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW9wMSAtIEluc3RydWN0aW9uIG9wIGNvZGUKLQotUkVNQVJLUzoKLUhhbmRsZXMgaWxsZWdhbCBvcGNvZGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaWxsZWdhbF9vcCgKLSAgICB1OCBvcDEpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIFg4NiBPUENPREVcbiIpOwotICAgIFRSQUNFX1JFR1MoKTsKLSAgICBwcmludGsoIiUwNHg6JTA0eDogJTAyWCBJTExFR0FMIFg4NiBPUENPREUhXG4iLAotCU0ueDg2LlJfQ1MsIE0ueDg2LlJfSVAtMSxvcDEpOwotICAgIEhBTFRfU1lTKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWRkX2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1OCBkZXN0dmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBRERcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IGFkZF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IGFkZF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IGFkZF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gYWRkX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwMQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWRkX3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFkZF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhZGRfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYWRkX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFkZF93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhZGRfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYWRkX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkZF9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGRfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWRkX2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGFkZF9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBhZGRfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gYWRkX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGFkZF9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MDMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FkZF93b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRkX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkZF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGRfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRkX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkZF9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGRfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkZF9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGRfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwNAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWRkX2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFERFx0QUwsIik7Ci0gICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FMID0gYWRkX2J5dGUoTS54ODYuUl9BTCwgc3JjdmFsKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwNQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWRkX3dvcmRfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJBRERcdEVBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiQUREXHRBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VBWCA9IGFkZF9sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9BWCA9IGFkZF93b3JkKE0ueDg2LlJfQVgsICh1MTYpc3JjdmFsKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MDYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hfRVModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUFVTSFx0RVNcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgcHVzaF93b3JkKE0ueDg2LlJfRVMpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDA3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wb3BfRVModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUE9QXHRFU1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0VTID0gcG9wX3dvcmQoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwOAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3JfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGRlc3R2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBvcl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IG9yX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gb3JfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IG9yX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwOQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3Jfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJPUlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBvcl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBvcl93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBvcl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBvcl93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBvcl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBvcl93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBvcl9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBvcl93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcl9ieXRlX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IG9yX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IG9yX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IG9yX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IG9yX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwYgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3Jfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gb3JfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gb3Jfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gb3JfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gb3Jfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gb3JfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gb3Jfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IG9yX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IG9yX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29yX2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk9SXHRBTCwiKTsKLSAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQUwgPSBvcl9ieXRlKE0ueDg2LlJfQUwsIHNyY3ZhbCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29yX3dvcmRfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJPUlx0RUFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJPUlx0QVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQVggPSBvcl9sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9BWCA9IG9yX3dvcmQoTS54ODYuUl9BWCwgKHUxNilzcmN2YWwpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaF9DUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRDU1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYuIEVzY2FwZSBmb3IgdHdvLWJ5dGUgb3Bjb2RlICgyODYgb3IgYmV0dGVyKQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfdHdvX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IG9wMiA9ICgqc3lzX3JkYikoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKyspKTsKLSAgICBJTkNfREVDT0RFRF9JTlNUX0xFTigxKTsKLSAgICAoKng4NmVtdV9vcHRhYjJbb3AyXSkob3AyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDEwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hZGNfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGRlc3R2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gYWRjX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gYWRjX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gYWRjX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBhZGNfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDExCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hZGNfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBRENcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYWRjX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFkY193b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhZGNfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYWRjX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFkY19sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhZGNfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRjX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkY193b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDEyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hZGNfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBRENcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gYWRjX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGFkY19ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBhZGNfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gYWRjX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxMwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWRjX3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBRENcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGNfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRjX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkY19sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGNfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRjX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkY193b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRjX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkY193b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDE0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hZGNfYnl0ZV9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQURDXHRBTCwiKTsKLSAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQUwgPSBhZGNfYnl0ZShNLng4Ni5SX0FMLCBzcmN2YWwpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDE1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hZGNfd29yZF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkFEQ1x0RUFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJBRENcdEFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUFYID0gYWRjX2xvbmcoTS54ODYuUl9FQVgsIHNyY3ZhbCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0FYID0gYWRjX3dvcmQoTS54ODYuUl9BWCwgKHUxNilzcmN2YWwpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaF9TUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRTU1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBwdXNoX3dvcmQoTS54ODYuUl9TUyk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MTcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3BvcF9TUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJQT1BcdFNTXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfU1MgPSBwb3Bfd29yZCgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDE4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zYmJfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGRlc3R2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNCQlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gc2JiX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gc2JiX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gc2JiX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzYmJfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDE5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zYmJfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gc2JiX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHNiYl93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBzYmJfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gc2JiX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHNiYl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBzYmJfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2JiX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNiYl93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDFhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zYmJfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc2JiX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNiYl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzYmJfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc2JiX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxYgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc2JiX3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzYmJfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2JiX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNiYl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzYmJfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2JiX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNiYl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2JiX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNiYl93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDFjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zYmJfYnl0ZV9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU0JCXHRBTCwiKTsKLSAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQUwgPSBzYmJfYnl0ZShNLng4Ni5SX0FMLCBzcmN2YWwpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDFkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zYmJfd29yZF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlNCQlx0RUFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJTQkJcdEFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUFYID0gc2JiX2xvbmcoTS54ODYuUl9FQVgsIHNyY3ZhbCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0FYID0gc2JiX3dvcmQoTS54ODYuUl9BWCwgKHUxNilzcmN2YWwpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaF9EUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJQVVNIXHREU1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBwdXNoX3dvcmQoTS54ODYuUl9EUyk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MWYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3BvcF9EUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJQT1BcdERTXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfRFMgPSBwb3Bfd29yZCgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDIwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hbmRfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGRlc3R2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFORFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLQotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBhbmRfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IGFuZF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLQotICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gYW5kX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotCi0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGFuZF9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MjEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FuZF93b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFORFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhbmRfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYW5kX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFuZF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhbmRfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYW5kX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFuZF93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhbmRfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYW5kX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MjIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FuZF9ieXRlX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFORFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBhbmRfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gYW5kX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGFuZF9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBhbmRfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDIzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hbmRfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFORFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFuZF9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhbmRfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYW5kX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JICAgIGJyZWFrOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhbmRfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFuZF9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhbmRfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFuZF9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhbmRfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyNAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYW5kX2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFORFx0QUwsIik7Ci0gICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FMID0gYW5kX2J5dGUoTS54ODYuUl9BTCwgc3JjdmFsKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyNQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYW5kX3dvcmRfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJBTkRcdEVBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiQU5EXHRBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VBWCA9IGFuZF9sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9BWCA9IGFuZF93b3JkKE0ueDg2LlJfQVgsICh1MTYpc3JjdmFsKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MjYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3NlZ292cl9FUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJFUzpcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR09WUl9FUzsKLSAgICAvKgotICAgICAqIG5vdGUgdGhlIGxhY2sgb2YgREVDT0RFX0NMRUFSX1NFR09WUihyKSBzaW5jZSwgaGVyZSBpcyBvbmUgb2YgNAotICAgICAqIG9wY29kZSBzdWJyb3V0aW5lcyB3ZSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLgotICAgICAqLwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MjcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2RhYSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJEQUFcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BTCA9IGRhYV9ieXRlKE0ueDg2LlJfQUwpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDI4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zdWJfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGRlc3R2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNVQlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gc3ViX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gc3ViX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gc3ViX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzdWJfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDI5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zdWJfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gc3ViX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHN1Yl93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBzdWJfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gc3ViX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHN1Yl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBzdWJfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3ViX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHN1Yl93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDJhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zdWJfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3ViX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHN1Yl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzdWJfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3ViX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyYgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc3ViX3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzdWJfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3ViX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHN1Yl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzdWJfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3ViX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHN1Yl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3ViX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHN1Yl93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDJjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zdWJfYnl0ZV9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU1VCXHRBTCwiKTsKLSAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQUwgPSBzdWJfYnl0ZShNLng4Ni5SX0FMLCBzcmN2YWwpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDJkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zdWJfd29yZF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlNVQlx0RUFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJTVUJcdEFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUFYID0gc3ViX2xvbmcoTS54ODYuUl9FQVgsIHNyY3ZhbCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0FYID0gc3ViX3dvcmQoTS54ODYuUl9BWCwgKHUxNilzcmN2YWwpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc2Vnb3ZyX0NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkNTOlxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHT1ZSX0NTOwotICAgIC8qIG5vdGUgbm8gREVDT0RFX0NMRUFSX1NFR09WUiBoZXJlLiAqLwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MmYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2Rhcyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJEQVNcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BTCA9IGRhc19ieXRlKE0ueDg2LlJfQUwpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDMwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94b3JfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGRlc3R2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0geG9yX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0geG9yX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0geG9yX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSB4b3JfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDMxCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94b3Jfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJYT1JcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0geG9yX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHhvcl93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSB4b3JfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0geG9yX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHhvcl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSB4b3Jfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0geG9yX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHhvcl93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDMyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94b3JfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJYT1JcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0geG9yX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHhvcl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSB4b3JfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0geG9yX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzMwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeG9yX3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJYT1JcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSB4b3JfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0geG9yX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHhvcl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSB4b3Jfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0geG9yX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHhvcl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0geG9yX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHhvcl93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDM0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94b3JfYnl0ZV9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiWE9SXHRBTCwiKTsKLSAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQUwgPSB4b3JfYnl0ZShNLng4Ni5SX0FMLCBzcmN2YWwpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDM1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94b3Jfd29yZF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlhPUlx0RUFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJYT1JcdEFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUFYID0geG9yX2xvbmcoTS54ODYuUl9FQVgsIHNyY3ZhbCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0FYID0geG9yX3dvcmQoTS54ODYuUl9BWCwgKHUxNilzcmN2YWwpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc2Vnb3ZyX1NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNTOlxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHT1ZSX1NTOwotICAgIC8qIG5vIERFQ09ERV9DTEVBUl9TRUdPVlIgISAqLwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MzcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FhYSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBQUFcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BWCA9IGFhYV93b3JkKE0ueDg2LlJfQVgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDM4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jbXBfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHU4IGRlc3R2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkNNUFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQljbXBfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JY21wX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWNtcF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JY21wX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzOQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY21wX3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDNhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jbXBfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJDTVBcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWNtcF9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JY21wX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQljbXBfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWNtcF9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4M2IKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2NtcF93b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDNjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jbXBfYnl0ZV9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQ01QXHRBTCwiKTsKLSAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGNtcF9ieXRlKE0ueDg2LlJfQUwsIHNyY3ZhbCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4M2QKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2NtcF93b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiQ01QXHRFQVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkNNUFx0QVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JY21wX2xvbmcoTS54ODYuUl9FQVgsIHNyY3ZhbCk7Ci0gICAgfSBlbHNlIHsKLQljbXBfd29yZChNLng4Ni5SX0FYLCAodTE2KXNyY3ZhbCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDNlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zZWdvdnJfRFModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiRFM6XG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfRFM7Ci0gICAgLyogTk8gREVDT0RFX0NMRUFSX1NFR09WUiEgKi8KLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDNmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hYXModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQUFTXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQVggPSBhYXNfd29yZChNLng4Ni5SX0FYKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0MAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW5jX0FYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIklOQ1x0RUFYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIklOQ1x0QVhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUFYID0gaW5jX2xvbmcoTS54ODYuUl9FQVgpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9BWCA9IGluY193b3JkKE0ueDg2LlJfQVgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0MQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW5jX0NYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIklOQ1x0RUNYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIklOQ1x0Q1hcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUNYID0gaW5jX2xvbmcoTS54ODYuUl9FQ1gpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9DWCA9IGluY193b3JkKE0ueDg2LlJfQ1gpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0MgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW5jX0RYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIklOQ1x0RURYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIklOQ1x0RFhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRURYID0gaW5jX2xvbmcoTS54ODYuUl9FRFgpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9EWCA9IGluY193b3JkKE0ueDg2LlJfRFgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0MwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW5jX0JYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIklOQ1x0RUJYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIklOQ1x0QlhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUJYID0gaW5jX2xvbmcoTS54ODYuUl9FQlgpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9CWCA9IGluY193b3JkKE0ueDg2LlJfQlgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0NAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW5jX1NQKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIklOQ1x0RVNQXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIklOQ1x0U1BcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRVNQID0gaW5jX2xvbmcoTS54ODYuUl9FU1ApOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9TUCA9IGluY193b3JkKE0ueDg2LlJfU1ApOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0NQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW5jX0JQKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIklOQ1x0RUJQXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIklOQ1x0QlBcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUJQID0gaW5jX2xvbmcoTS54ODYuUl9FQlApOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9CUCA9IGluY193b3JkKE0ueDg2LlJfQlApOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0NgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW5jX1NJKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIklOQ1x0RVNJXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIklOQ1x0U0lcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRVNJID0gaW5jX2xvbmcoTS54ODYuUl9FU0kpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9TSSA9IGluY193b3JkKE0ueDg2LlJfU0kpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0NwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW5jX0RJKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIklOQ1x0RURJXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIklOQ1x0RElcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRURJID0gaW5jX2xvbmcoTS54ODYuUl9FREkpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9ESSA9IGluY193b3JkKE0ueDg2LlJfREkpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0OAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfZGVjX0FYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0RUFYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0QVhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUFYID0gZGVjX2xvbmcoTS54ODYuUl9FQVgpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9BWCA9IGRlY193b3JkKE0ueDg2LlJfQVgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0OQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfZGVjX0NYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0RUNYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0Q1hcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUNYID0gZGVjX2xvbmcoTS54ODYuUl9FQ1gpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9DWCA9IGRlY193b3JkKE0ueDg2LlJfQ1gpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0YQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfZGVjX0RYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0RURYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0RFhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRURYID0gZGVjX2xvbmcoTS54ODYuUl9FRFgpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9EWCA9IGRlY193b3JkKE0ueDg2LlJfRFgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0YgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfZGVjX0JYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0RUJYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0QlhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUJYID0gZGVjX2xvbmcoTS54ODYuUl9FQlgpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9CWCA9IGRlY193b3JkKE0ueDg2LlJfQlgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0YwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfZGVjX1NQKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0RVNQXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0U1BcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRVNQID0gZGVjX2xvbmcoTS54ODYuUl9FU1ApOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9TUCA9IGRlY193b3JkKE0ueDg2LlJfU1ApOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0ZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfZGVjX0JQKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0RUJQXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0QlBcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUJQID0gZGVjX2xvbmcoTS54ODYuUl9FQlApOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9CUCA9IGRlY193b3JkKE0ueDg2LlJfQlApOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0ZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfZGVjX1NJKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0RVNJXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0U0lcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRVNJID0gZGVjX2xvbmcoTS54ODYuUl9FU0kpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9TSSA9IGRlY193b3JkKE0ueDg2LlJfU0kpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg0ZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfZGVjX0RJKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0RURJXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkRFQ1x0RElcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRURJID0gZGVjX2xvbmcoTS54ODYuUl9FREkpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9ESSA9IGRlY193b3JkKE0ueDg2LlJfREkpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1MAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaF9BWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHRFQVhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0QVhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXB1c2hfbG9uZyhNLng4Ni5SX0VBWCk7Ci0gICAgfSBlbHNlIHsKLQlwdXNoX3dvcmQoTS54ODYuUl9BWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDUxCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoX0NYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdEVDWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHRDWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JcHVzaF9sb25nKE0ueDg2LlJfRUNYKTsKLSAgICB9IGVsc2UgewotCXB1c2hfd29yZChNLng4Ni5SX0NYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NTIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hfRFgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0RURYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdERYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlwdXNoX2xvbmcoTS54ODYuUl9FRFgpOwotICAgIH0gZWxzZSB7Ci0JcHVzaF93b3JkKE0ueDg2LlJfRFgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1MwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaF9CWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHRFQlhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0QlhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXB1c2hfbG9uZyhNLng4Ni5SX0VCWCk7Ci0gICAgfSBlbHNlIHsKLQlwdXNoX3dvcmQoTS54ODYuUl9CWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDU0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoX1NQKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdEVTUFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHRTUFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JLyogQWx3YXlzIHB1c2ggKEUpU1AsIHNpbmNlIHdlIGFyZSBlbXVsYXRpbmcgYW4gaTM4NiBhbmQgYWJvdmUKLQkgKiBwcm9jZXNzb3IuIFRoaXMgaXMgbmVjZXNzYXJ5IGFzIHNvbWUgQklPUydlcyB1c2UgdGhpcyB0byBjaGVjawotCSAqIHdoYXQgdHlwZSBvZiBwcm9jZXNzb3IgaXMgaW4gdGhlIHN5c3RlbS4KLQkgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJcHVzaF9sb25nKE0ueDg2LlJfRVNQKTsKLQl9IGVsc2UgewotCQlwdXNoX3dvcmQoKHUxNikoTS54ODYuUl9TUCkpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1NQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaF9CUCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHRFQlBcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0QlBcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXB1c2hfbG9uZyhNLng4Ni5SX0VCUCk7Ci0gICAgfSBlbHNlIHsKLQlwdXNoX3dvcmQoTS54ODYuUl9CUCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDU2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoX1NJKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdEVTSVxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHRTSVxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JcHVzaF9sb25nKE0ueDg2LlJfRVNJKTsKLSAgICB9IGVsc2UgewotCXB1c2hfd29yZChNLng4Ni5SX1NJKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NTcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hfREkodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0RURJXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdERJXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlwdXNoX2xvbmcoTS54ODYuUl9FREkpOwotICAgIH0gZWxzZSB7Ci0JcHVzaF93b3JkKE0ueDg2LlJfREkpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1OAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcG9wX0FYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBPUFx0RUFYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBPUFx0QVhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUFYID0gcG9wX2xvbmcoKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQVggPSBwb3Bfd29yZCgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1OQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcG9wX0NYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBPUFx0RUNYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBPUFx0Q1hcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUNYID0gcG9wX2xvbmcoKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQ1ggPSBwb3Bfd29yZCgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1YQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcG9wX0RYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBPUFx0RURYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBPUFx0RFhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRURYID0gcG9wX2xvbmcoKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfRFggPSBwb3Bfd29yZCgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1YgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcG9wX0JYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBPUFx0RUJYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBPUFx0QlhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUJYID0gcG9wX2xvbmcoKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQlggPSBwb3Bfd29yZCgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1YwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcG9wX1NQKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBPUFx0RVNQXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBPUFx0U1BcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRVNQID0gcG9wX2xvbmcoKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfU1AgPSBwb3Bfd29yZCgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1ZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcG9wX0JQKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBPUFx0RUJQXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBPUFx0QlBcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUJQID0gcG9wX2xvbmcoKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQlAgPSBwb3Bfd29yZCgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1ZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcG9wX1NJKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBPUFx0RVNJXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBPUFx0U0lcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRVNJID0gcG9wX2xvbmcoKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfU0kgPSBwb3Bfd29yZCgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1ZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcG9wX0RJKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBPUFx0RURJXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBPUFx0RElcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRURJID0gcG9wX2xvbmcoKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfREkgPSBwb3Bfd29yZCgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg2MAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaF9hbGwodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSEFEXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBVU0hBXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQl1MzIgb2xkX3NwID0gTS54ODYuUl9FU1A7Ci0KLQlwdXNoX2xvbmcoTS54ODYuUl9FQVgpOwotCXB1c2hfbG9uZyhNLng4Ni5SX0VDWCk7Ci0JcHVzaF9sb25nKE0ueDg2LlJfRURYKTsKLQlwdXNoX2xvbmcoTS54ODYuUl9FQlgpOwotCXB1c2hfbG9uZyhvbGRfc3ApOwotCXB1c2hfbG9uZyhNLng4Ni5SX0VCUCk7Ci0JcHVzaF9sb25nKE0ueDg2LlJfRVNJKTsKLQlwdXNoX2xvbmcoTS54ODYuUl9FREkpOwotICAgIH0gZWxzZSB7Ci0JdTE2IG9sZF9zcCA9IE0ueDg2LlJfU1A7Ci0KLQlwdXNoX3dvcmQoTS54ODYuUl9BWCk7Ci0JcHVzaF93b3JkKE0ueDg2LlJfQ1gpOwotCXB1c2hfd29yZChNLng4Ni5SX0RYKTsKLQlwdXNoX3dvcmQoTS54ODYuUl9CWCk7Ci0JcHVzaF93b3JkKG9sZF9zcCk7Ci0JcHVzaF93b3JkKE0ueDg2LlJfQlApOwotCXB1c2hfd29yZChNLng4Ni5SX1NJKTsKLQlwdXNoX3dvcmQoTS54ODYuUl9ESSk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDYxCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wb3BfYWxsKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBPUEFEXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBPUEFcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRURJID0gcG9wX2xvbmcoKTsKLQlNLng4Ni5SX0VTSSA9IHBvcF9sb25nKCk7Ci0JTS54ODYuUl9FQlAgPSBwb3BfbG9uZygpOwotCU0ueDg2LlJfRVNQICs9IDQ7ICAgICAgICAgICAgICAvKiBza2lwIEVTUCAqLwotCU0ueDg2LlJfRUJYID0gcG9wX2xvbmcoKTsKLQlNLng4Ni5SX0VEWCA9IHBvcF9sb25nKCk7Ci0JTS54ODYuUl9FQ1ggPSBwb3BfbG9uZygpOwotCU0ueDg2LlJfRUFYID0gcG9wX2xvbmcoKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfREkgPSBwb3Bfd29yZCgpOwotCU0ueDg2LlJfU0kgPSBwb3Bfd29yZCgpOwotCU0ueDg2LlJfQlAgPSBwb3Bfd29yZCgpOwotCU0ueDg2LlJfU1AgKz0gMjsgICAgICAgICAgICAgICAvKiBza2lwIFNQICovCi0JTS54ODYuUl9CWCA9IHBvcF93b3JkKCk7Ci0JTS54ODYuUl9EWCA9IHBvcF93b3JkKCk7Ci0JTS54ODYuUl9DWCA9IHBvcF93b3JkKCk7Ci0JTS54ODYuUl9BWCA9IHBvcF93b3JkKCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLypvcGNvZGUgMHg2MiAgIElMTEVHQUwgT1AsIGNhbGxzIHg4NmVtdU9wX2lsbGVnYWxfb3AoKSAqLwotLypvcGNvZGUgMHg2MyAgIElMTEVHQUwgT1AsIGNhbGxzIHg4NmVtdU9wX2lsbGVnYWxfb3AoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NjQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3NlZ292cl9GUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJGUzpcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR09WUl9GUzsKLSAgICAvKgotICAgICAqIG5vdGUgdGhlIGxhY2sgb2YgREVDT0RFX0NMRUFSX1NFR09WUihyKSBzaW5jZSwgaGVyZSBpcyBvbmUgb2YgNAotICAgICAqIG9wY29kZSBzdWJyb3V0aW5lcyB3ZSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLgotICAgICAqLwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NjUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3NlZ292cl9HUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJHUzpcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR09WUl9HUzsKLSAgICAvKgotICAgICAqIG5vdGUgdGhlIGxhY2sgb2YgREVDT0RFX0NMRUFSX1NFR09WUihyKSBzaW5jZSwgaGVyZSBpcyBvbmUgb2YgNAotICAgICAqIG9wY29kZSBzdWJyb3V0aW5lcyB3ZSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLgotICAgICAqLwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NjYgLSBwcmVmaXggZm9yIDMyLWJpdCByZWdpc3RlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHJlZml4X2RhdGEodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiREFUQTpcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1BSRUZJWF9EQVRBOwotICAgIC8qIG5vdGUgbm8gREVDT0RFX0NMRUFSX1NFR09WUiBoZXJlLiAqLwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NjcgLSBwcmVmaXggZm9yIDMyLWJpdCBhZGRyZXNzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wcmVmaXhfYWRkcih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBRERSOlxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfUFJFRklYX0FERFI7Ci0gICAgLyogbm90ZSBubyBERUNPREVfQ0xFQVJfU0VHT1ZSIGhlcmUuICovCi0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg2OAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaF93b3JkX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIGltbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCWltbSA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCJQVVNIXHQleFxuIiwgaW1tKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXB1c2hfbG9uZyhpbW0pOwotICAgIH0gZWxzZSB7Ci0JcHVzaF93b3JkKCh1MTYpaW1tKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NjkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2ltdWxfd29yZF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSU1VTFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCSAgICB1MzIgcmVzX2xvLHJlc19oaTsKLQkgICAgczMyIGltbTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKXNyY3ZhbCwoczMyKWltbSk7Ci0JICAgIGlmIChyZXNfaGkgIT0gMCkgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0JICAgIHUzMiByZXM7Ci0JICAgIHMxNiBpbW07Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcmVzID0gKHMxNilzcmN2YWwgKiAoczE2KWltbTsKLQkgICAgaWYgKHJlcyA+IDB4RkZGRikgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0JICAgIHUzMiByZXNfbG8scmVzX2hpOwotCSAgICBzMzIgaW1tOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpc3JjdmFsLChzMzIpaW1tKTsKLQkgICAgaWYgKHJlc19oaSAhPSAwKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQkgICAgdTMyIHJlczsKLQkgICAgczE2IGltbTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICByZXMgPSAoczE2KXNyY3ZhbCAqIChzMTYpaW1tOwotCSAgICBpZiAocmVzID4gMHhGRkZGKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQkgICAgdTMyIHJlc19sbyxyZXNfaGk7Ci0JICAgIHMzMiBpbW07Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMilzcmN2YWwsKHMzMilpbW0pOwotCSAgICBpZiAocmVzX2hpICE9IDApIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCSAgICB1MzIgcmVzOwotCSAgICBzMTYgaW1tOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHJlcyA9IChzMTYpc3JjdmFsICogKHMxNilpbW07Ci0JICAgIGlmIChyZXMgPiAweEZGRkYpIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUxNilyZXM7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQkgICAgdTMyIHJlc19sbyxyZXNfaGk7Ci0JICAgIHMzMiBpbW07Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMikqc3JjcmVnLChzMzIpaW1tKTsKLQkgICAgaWYgKHJlc19oaSAhPSAwKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCSAgICB1MzIgcmVzOwotCSAgICBzMTYgaW1tOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIHJlcyA9IChzMTYpKnNyY3JlZyAqIChzMTYpaW1tOwotCSAgICBpZiAocmVzID4gMHhGRkZGKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NmEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hfYnl0ZV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHMxNiBpbW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGltbSA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCJQVVNIXHQlZFxuIiwgaW1tKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIHB1c2hfd29yZChpbW0pOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDZiCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbXVsX2J5dGVfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgczggIGltbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSU1VTFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCSAgICB1MzIgcmVzX2xvLHJlc19oaTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKXNyY3ZhbCwoczMyKWltbSk7Ci0JICAgIGlmIChyZXNfaGkgIT0gMCkgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0JICAgIHUzMiByZXM7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcmVzID0gKHMxNilzcmN2YWwgKiAoczE2KWltbTsKLQkgICAgaWYgKHJlcyA+IDB4RkZGRikgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0JICAgIHUzMiByZXNfbG8scmVzX2hpOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpc3JjdmFsLChzMzIpaW1tKTsKLQkgICAgaWYgKHJlc19oaSAhPSAwKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQkgICAgdTMyIHJlczsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICByZXMgPSAoczE2KXNyY3ZhbCAqIChzMTYpaW1tOwotCSAgICBpZiAocmVzID4gMHhGRkZGKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQkgICAgdTMyIHJlc19sbyxyZXNfaGk7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMilzcmN2YWwsKHMzMilpbW0pOwotCSAgICBpZiAocmVzX2hpICE9IDApIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCSAgICB1MzIgcmVzOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHJlcyA9IChzMTYpc3JjdmFsICogKHMxNilpbW07Ci0JICAgIGlmIChyZXMgPiAweEZGRkYpIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUxNilyZXM7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQkgICAgdTMyIHJlc19sbyxyZXNfaGk7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMikqc3JjcmVnLChzMzIpaW1tKTsKLQkgICAgaWYgKHJlc19oaSAhPSAwKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCSAgICB1MzIgcmVzOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIHJlcyA9IChzMTYpKnNyY3JlZyAqIChzMTYpaW1tOwotCSAgICBpZiAocmVzID4gMHhGRkZGKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NmMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2luc19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIklOU0JcbiIpOwotICAgIGlucygxKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDZkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbnNfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJJTlNEXG4iKTsKLQlpbnMoNCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJJTlNXXG4iKTsKLQlpbnMoMik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX291dHNfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJPVVRTQlxuIik7Ci0gICAgb3V0cygxKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDZmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vdXRzX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiT1VUU0RcbiIpOwotCW91dHMoNCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJPVVRTV1xuIik7Ci0Jb3V0cygyKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3MAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX08odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBvdmVyZmxvdyBmbGFnIGlzIHNldCAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSk9cdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKEFDQ0VTU19GTEFHKEZfT0YpKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NzEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9OTyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIG92ZXJmbG93IGlzIG5vdCBzZXQgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpOT1x0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoIUFDQ0VTU19GTEFHKEZfT0YpKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NzIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9CKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgY2FycnkgZmxhZyBpcyBzZXQuICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKQlx0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3MwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX05CKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgY2FycnkgZmxhZyBpcyBjbGVhci4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpOQlx0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoIUFDQ0VTU19GTEFHKEZfQ0YpKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NzQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9aKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgemVybyBmbGFnIGlzIHNldC4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpaXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSkKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDc1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfTloodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiB6ZXJvIGZsYWcgaXMgY2xlYXIuICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKTlpcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKCFBQ0NFU1NfRkxBRyhGX1pGKSkKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDc2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfQkUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBjYXJyeSBmbGFnIGlzIHNldCBvciBpZiB0aGUgemVybwotICAgICAgIGZsYWcgaXMgc2V0LiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSkJFXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChBQ0NFU1NfRkxBRyhGX0NGKSB8fCBBQ0NFU1NfRkxBRyhGX1pGKSkKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDc3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfTkJFKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgY2FycnkgZmxhZyBpcyBjbGVhciBhbmQgaWYgdGhlIHplcm8KLSAgICAgICBmbGFnIGlzIGNsZWFyICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKTkJFXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmICghKEFDQ0VTU19GTEFHKEZfQ0YpIHx8IEFDQ0VTU19GTEFHKEZfWkYpKSkKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDc4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIHNpZ24gZmxhZyBpcyBzZXQgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpTXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChBQ0NFU1NfRkxBRyhGX1NGKSkKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDc5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfTlModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBzaWduIGZsYWcgaXMgY2xlYXIgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpOU1x0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoIUFDQ0VTU19GTEFHKEZfU0YpKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4N2EKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9QKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgcGFyaXR5IGZsYWcgaXMgc2V0IChldmVuIHBhcml0eSkgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpQXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChBQ0NFU1NfRkxBRyhGX1BGKSkKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDdiCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfTlAodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBwYXJpdHkgZmxhZyBpcyBjbGVhciAob2RkIHBhcml0eSkgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpOUFx0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoIUFDQ0VTU19GTEFHKEZfUEYpKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4N2MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9MKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLSAgICBpbnQgc2YsIG9mOwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBzaWduIGZsYWcgbm90IGVxdWFsIHRvIG92ZXJmbG93IGZsYWcuICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKTFx0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBzZiA9IEFDQ0VTU19GTEFHKEZfU0YpICE9IDA7Ci0gICAgb2YgPSBBQ0NFU1NfRkxBRyhGX09GKSAhPSAwOwotICAgIGlmIChzZiBeIG9mKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4N2QKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9OTCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0gICAgaW50IHNmLCBvZjsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgc2lnbiBmbGFnIG5vdCBlcXVhbCB0byBvdmVyZmxvdyBmbGFnLiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSk5MXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIHNmID0gQUNDRVNTX0ZMQUcoRl9TRikgIT0gMDsKLSAgICBvZiA9IEFDQ0VTU19GTEFHKEZfT0YpICE9IDA7Ci0gICAgLyogbm90ZTogaW52ZXJzZSBvZiBhYm92ZSwgYnV0IHVzaW5nID09IGluc3RlYWQgb2YgeG9yLiAqLwotICAgIGlmIChzZiA9PSBvZikKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDdlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfTEUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotICAgIGludCBzZiwgb2Y7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIHNpZ24gZmxhZyBub3QgZXF1YWwgdG8gb3ZlcmZsb3cgZmxhZwotICAgICAgIG9yIHRoZSB6ZXJvIGZsYWcgaXMgc2V0ICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKTEVcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgc2YgPSBBQ0NFU1NfRkxBRyhGX1NGKSAhPSAwOwotICAgIG9mID0gQUNDRVNTX0ZMQUcoRl9PRikgIT0gMDsKLSAgICBpZiAoKHNmIF4gb2YpIHx8IEFDQ0VTU19GTEFHKEZfWkYpKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4N2YKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9OTEUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotICAgIGludCBzZiwgb2Y7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIHNpZ24gZmxhZyBlcXVhbCB0byBvdmVyZmxvdyBmbGFnLgotICAgICAgIGFuZCB0aGUgemVybyBmbGFnIGlzIGNsZWFyICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKTkxFXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIHNmID0gQUNDRVNTX0ZMQUcoRl9TRikgIT0gMDsKLSAgICBvZiA9IEFDQ0VTU19GTEFHKEZfT0YpICE9IDA7Ci0gICAgaWYgKChzZiA9PSBvZikgJiYgIUFDQ0VTU19GTEFHKEZfWkYpKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi1zdGF0aWMgdTggKCpvcGM4MF9ieXRlX29wZXJhdGlvbltdKSh1OCBkLCB1OCBzKSA9Ci17Ci0gICAgYWRkX2J5dGUsICAgICAgICAgICAvKiAwMCAqLwotICAgIG9yX2J5dGUsICAgICAgICAgICAgLyogMDEgKi8KLSAgICBhZGNfYnl0ZSwgICAgICAgICAgIC8qIDAyICovCi0gICAgc2JiX2J5dGUsICAgICAgICAgICAvKiAwMyAqLwotICAgIGFuZF9ieXRlLCAgICAgICAgICAgLyogMDQgKi8KLSAgICBzdWJfYnl0ZSwgICAgICAgICAgIC8qIDA1ICovCi0gICAgeG9yX2J5dGUsICAgICAgICAgICAvKiAwNiAqLwotICAgIGNtcF9ieXRlLCAgICAgICAgICAgLyogMDcgKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4MAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3BjODBfYnl0ZV9STV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggaW1tOwotICAgIHU4IGRlc3R2YWw7Ci0KLSAgICAvKgotICAgICAqIFdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZiB0aGUgb3Bjb2RlCi0gICAgICogaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkIHJlc3VsdCwgZXhjZXB0Ci0gICAgICogdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgotICAgICAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSNpZmRlZiBERUJVRwotICAgIGlmIChERUJVR19ERUNPREUoKSkgewotCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCi0JICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKLQkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKLQkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCi0KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGKCJBRERcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJBRENcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNCQlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKLSAgICAgICBtb2RlLiAqLwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wYzgwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JaWYgKHJoICE9IDcpCi0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjODBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQlpZiAocmggIT0gNykKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGM4MF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCWlmIChyaCAhPSA3KQotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGM4MF9ieXRlX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgaW1tKTsKLQlpZiAocmggIT0gNykKLQkgICAgKmRlc3RyZWcgPSBkZXN0dmFsOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLXN0YXRpYyB1MTYgKCpvcGM4MV93b3JkX29wZXJhdGlvbltdKSh1MTYgZCwgdTE2IHMpID0KLXsKLSAgICBhZGRfd29yZCwgICAgICAgICAgIC8qMDAgKi8KLSAgICBvcl93b3JkLCAgICAgICAgICAgIC8qMDEgKi8KLSAgICBhZGNfd29yZCwgICAgICAgICAgIC8qMDIgKi8KLSAgICBzYmJfd29yZCwgICAgICAgICAgIC8qMDMgKi8KLSAgICBhbmRfd29yZCwgICAgICAgICAgIC8qMDQgKi8KLSAgICBzdWJfd29yZCwgICAgICAgICAgIC8qMDUgKi8KLSAgICB4b3Jfd29yZCwgICAgICAgICAgIC8qMDYgKi8KLSAgICBjbXBfd29yZCwgICAgICAgICAgIC8qMDcgKi8KLX07Ci0KLXN0YXRpYyB1MzIgKCpvcGM4MV9sb25nX29wZXJhdGlvbltdKSh1MzIgZCwgdTMyIHMpID0KLXsKLSAgICBhZGRfbG9uZywgICAgICAgICAgIC8qMDAgKi8KLSAgICBvcl9sb25nLCAgICAgICAgICAgIC8qMDEgKi8KLSAgICBhZGNfbG9uZywgICAgICAgICAgIC8qMDIgKi8KLSAgICBzYmJfbG9uZywgICAgICAgICAgIC8qMDMgKi8KLSAgICBhbmRfbG9uZywgICAgICAgICAgIC8qMDQgKi8KLSAgICBzdWJfbG9uZywgICAgICAgICAgIC8qMDUgKi8KLSAgICB4b3JfbG9uZywgICAgICAgICAgIC8qMDYgKi8KLSAgICBjbXBfbG9uZywgICAgICAgICAgIC8qMDcgKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4MQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3BjODFfd29yZF9STV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICAvKgotICAgICAqIFdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZiB0aGUgb3Bjb2RlCi0gICAgICogaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkIHJlc3VsdCwgZXhjZXB0Ci0gICAgICogdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgotICAgICAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSNpZmRlZiBERUJVRwotICAgIGlmIChERUJVR19ERUNPREUoKSkgewotCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCi0JICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKLQkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKLQkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCi0KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGKCJBRERcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJBRENcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNCQlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIC8qCi0gICAgICogS25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZwotICAgICAqIG1vZGUuCi0gICAgICovCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsLGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWwsaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4MV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsLGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWwsaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4MV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsLGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWwsaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4MV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgZGVzdHZhbCxpbW07Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJKmRlc3RyZWcgPSBkZXN0dmFsOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IGRlc3R2YWwsaW1tOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4MV93b3JkX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCSpkZXN0cmVnID0gZGVzdHZhbDsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotc3RhdGljIHU4ICgqb3BjODJfYnl0ZV9vcGVyYXRpb25bXSkodTggcywgdTggZCkgPQotewotICAgIGFkZF9ieXRlLCAgICAgICAgICAgLyowMCAqLwotICAgIG9yX2J5dGUsICAgICAgICAgICAgLyowMSAqLyAvKllZWSBVTlVTRUQgPz8/PyAqLwotICAgIGFkY19ieXRlLCAgICAgICAgICAgLyowMiAqLwotICAgIHNiYl9ieXRlLCAgICAgICAgICAgLyowMyAqLwotICAgIGFuZF9ieXRlLCAgICAgICAgICAgLyowNCAqLyAvKllZWSBVTlVTRUQgPz8/PyAqLwotICAgIHN1Yl9ieXRlLCAgICAgICAgICAgLyowNSAqLwotICAgIHhvcl9ieXRlLCAgICAgICAgICAgLyowNiAqLyAvKllZWSBVTlVTRUQgPz8/PyAqLwotICAgIGNtcF9ieXRlLCAgICAgICAgICAgLyowNyAqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDgyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcGM4Ml9ieXRlX1JNX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBpbW07Ci0gICAgdTggZGVzdHZhbDsKLQotICAgIC8qCi0gICAgICogV2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mIHRoZSBvcGNvZGUKLSAgICAgKiBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQgcmVzdWx0LCBleGNlcHQKLSAgICAgKiB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uIFNpbWlsYXIgdG8gb3Bjb2RlIDgxLCBleGNlcHQgdGhhdAotICAgICAqIHRoZSBpbW1lZGlhdGUgYnl0ZSBpcyBzaWduIGV4dGVuZGVkIHRvIGEgd29yZCBsZW5ndGguCi0gICAgICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotI2lmZGVmIERFQlVHCi0gICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7Ci0JLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKLQkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncwotCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQotCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGKCJBRERcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJBRENcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNCQlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKLSAgICAgICBtb2RlLiAqLwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wYzgyX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JaWYgKHJoICE9IDcpCi0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjODJfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQlpZiAocmggIT0gNykKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGM4Ml9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCWlmIChyaCAhPSA3KQotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGM4Ml9ieXRlX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgaW1tKTsKLQlpZiAocmggIT0gNykKLQkgICAgKmRlc3RyZWcgPSBkZXN0dmFsOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLXN0YXRpYyB1MTYgKCpvcGM4M193b3JkX29wZXJhdGlvbltdKSh1MTYgcywgdTE2IGQpID0KLXsKLSAgICBhZGRfd29yZCwgICAgICAgICAgIC8qMDAgKi8KLSAgICBvcl93b3JkLCAgICAgICAgICAgIC8qMDEgKi8gLypZWVkgVU5VU0VEID8/Pz8gKi8KLSAgICBhZGNfd29yZCwgICAgICAgICAgIC8qMDIgKi8KLSAgICBzYmJfd29yZCwgICAgICAgICAgIC8qMDMgKi8KLSAgICBhbmRfd29yZCwgICAgICAgICAgIC8qMDQgKi8gLypZWVkgVU5VU0VEID8/Pz8gKi8KLSAgICBzdWJfd29yZCwgICAgICAgICAgIC8qMDUgKi8KLSAgICB4b3Jfd29yZCwgICAgICAgICAgIC8qMDYgKi8gLypZWVkgVU5VU0VEID8/Pz8gKi8KLSAgICBjbXBfd29yZCwgICAgICAgICAgIC8qMDcgKi8KLX07Ci0KLXN0YXRpYyB1MzIgKCpvcGM4M19sb25nX29wZXJhdGlvbltdKSh1MzIgcywgdTMyIGQpID0KLXsKLSAgICBhZGRfbG9uZywgICAgICAgICAgIC8qMDAgKi8KLSAgICBvcl9sb25nLCAgICAgICAgICAgIC8qMDEgKi8gLypZWVkgVU5VU0VEID8/Pz8gKi8KLSAgICBhZGNfbG9uZywgICAgICAgICAgIC8qMDIgKi8KLSAgICBzYmJfbG9uZywgICAgICAgICAgIC8qMDMgKi8KLSAgICBhbmRfbG9uZywgICAgICAgICAgIC8qMDQgKi8gLypZWVkgVU5VU0VEID8/Pz8gKi8KLSAgICBzdWJfbG9uZywgICAgICAgICAgIC8qMDUgKi8KLSAgICB4b3JfbG9uZywgICAgICAgICAgIC8qMDYgKi8gLypZWVkgVU5VU0VEID8/Pz8gKi8KLSAgICBjbXBfbG9uZywgICAgICAgICAgIC8qMDcgKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4MwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3BjODNfd29yZF9STV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICAvKgotICAgICAqIFdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZiB0aGUgb3Bjb2RlCi0gICAgICogaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkIHJlc3VsdCwgZXhjZXB0Ci0gICAgICogdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbiBTaW1pbGFyIHRvIG9wY29kZSA4MSwgZXhjZXB0IHRoYXQKLSAgICAgKiB0aGUgaW1tZWRpYXRlIGJ5dGUgaXMgc2lnbiBleHRlbmRlZCB0byBhIHdvcmQgbGVuZ3RoLgotICAgICAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSNpZmRlZiBERUJVRwotICAgIGlmIChERUJVR19ERUNPREUoKSkgewotCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCi0JICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKLQkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKLQkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCi0gICAgICAgc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJPUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYoIkFORFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URigiU1VCXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGKCJYT1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYoIkNNUFx0Iik7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCi0gICAgICAgbW9kZS4gKi8KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWwsaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBpbW0gPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgzX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWwsaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODNfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbCxpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODNfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbCxpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgaW1tID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4M193b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsLGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgaW1tID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4M19sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsLGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBpbW0gPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgzX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBkZXN0dmFsLGltbTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBpbW0gPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgzX2xvbmdfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJKmRlc3RyZWcgPSBkZXN0dmFsOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IGRlc3R2YWwsaW1tOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODNfd29yZF9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQkqZGVzdHJlZyA9IGRlc3R2YWw7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4NAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfdGVzdF9ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggZGVzdHZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiVEVTVFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQl0ZXN0X2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXRlc3RfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JdGVzdF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JdGVzdF9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ODUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3Rlc3Rfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJURVNUXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdGVzdF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0ZXN0X3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRlc3RfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdGVzdF93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0ZXN0X2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRlc3Rfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0ZXN0X2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0ZXN0X3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ODYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hjaGdfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGRlc3R2YWw7Ci0gICAgdTggdG1wOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJYQ0hHXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXRtcCA9ICpzcmNyZWc7Ci0JKnNyY3JlZyA9IGRlc3R2YWw7Ci0JZGVzdHZhbCA9IHRtcDsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXRtcCA9ICpzcmNyZWc7Ci0JKnNyY3JlZyA9IGRlc3R2YWw7Ci0JZGVzdHZhbCA9IHRtcDsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXRtcCA9ICpzcmNyZWc7Ci0JKnNyY3JlZyA9IGRlc3R2YWw7Ci0JZGVzdHZhbCA9IHRtcDsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQl0bXAgPSAqc3JjcmVnOwotCSpzcmNyZWcgPSAqZGVzdHJlZzsKLQkqZGVzdHJlZyA9IHRtcDsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ODcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hjaGdfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJYQ0hHXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKnNyY3JlZzsKLQkgICAgdTMyIGRlc3R2YWwsdG1wOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRtcCA9ICpzcmNyZWc7Ci0JICAgICpzcmNyZWcgPSBkZXN0dmFsOwotCSAgICBkZXN0dmFsID0gdG1wOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpzcmNyZWc7Ci0JICAgIHUxNiBkZXN0dmFsLHRtcDsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0bXAgPSAqc3JjcmVnOwotCSAgICAqc3JjcmVnID0gZGVzdHZhbDsKLQkgICAgZGVzdHZhbCA9IHRtcDsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqc3JjcmVnOwotCSAgICB1MzIgZGVzdHZhbCx0bXA7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdG1wID0gKnNyY3JlZzsKLQkgICAgKnNyY3JlZyA9IGRlc3R2YWw7Ci0JICAgIGRlc3R2YWwgPSB0bXA7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKnNyY3JlZzsKLQkgICAgdTE2IGRlc3R2YWwsdG1wOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRtcCA9ICpzcmNyZWc7Ci0JICAgICpzcmNyZWcgPSBkZXN0dmFsOwotCSAgICBkZXN0dmFsID0gdG1wOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpzcmNyZWc7Ci0JICAgIHUzMiBkZXN0dmFsLHRtcDsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0bXAgPSAqc3JjcmVnOwotCSAgICAqc3JjcmVnID0gZGVzdHZhbDsKLQkgICAgZGVzdHZhbCA9IHRtcDsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqc3JjcmVnOwotCSAgICB1MTYgZGVzdHZhbCx0bXA7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdG1wID0gKnNyY3JlZzsKLQkgICAgKnNyY3JlZyA9IGRlc3R2YWw7Ci0JICAgIGRlc3R2YWwgPSB0bXA7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCSAgICB1MzIgdG1wOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0bXAgPSAqc3JjcmVnOwotCSAgICAqc3JjcmVnID0gKmRlc3RyZWc7Ci0JICAgICpkZXN0cmVnID0gdG1wOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCSAgICB1MTYgdG1wOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0bXAgPSAqc3JjcmVnOwotCSAgICAqc3JjcmVnID0gKmRlc3RyZWc7Ci0JICAgICpkZXN0cmVnID0gdG1wOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ODgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl9ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSAqc3JjcmVnOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4OQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9ICpzcmNyZWc7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gKnNyY3JlZzsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDhhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3JjdmFsOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzcmN2YWw7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNyY3ZhbDsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gKnNyY3JlZzsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OGIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl93b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywgKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSAqc3JjcmVnOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywgKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSAqc3JjcmVnOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OGMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl93b3JkX1JNX1NSKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTE2ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1MTYgZGVzdHZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAqc3JjcmVnOwotCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICpzcmNyZWc7Ci0Jc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKnNyY3JlZzsKLQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gKnNyY3JlZzsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OGQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2xlYV93b3JkX1JfTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHUxNiAqc3JjcmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotLyoKLSAqIFRPRE86IE5lZWQgdG8gaGFuZGxlIGFkZHJlc3Mgc2l6ZSBwcmVmaXghCi0gKgotICogbGVhICBlYXgsW2VheCtlYngqMl0gPz8KLSAqLwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJMRUFcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0Jc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpzcmNyZWcgPSAodTE2KWRlc3RvZmZzZXQ7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCXNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqc3JjcmVnID0gKHUxNilkZXN0b2Zmc2V0OwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKnNyY3JlZyA9ICh1MTYpZGVzdG9mZnNldDsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQkvKiB1bmRlZmluZWQuICBEbyBub3RoaW5nLiAqLwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4ZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X3dvcmRfU1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1MTYgKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgdTE2IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RyZWcgPSBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3JjdmFsOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0cmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNyY3ZhbDsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdHJlZyA9IGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzcmN2YWw7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gKnNyY3JlZzsKLQlicmVhazsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBDbGVhbiB1cCwgYW5kIHJlc2V0IGFsbCB0aGUgUl94U1AgcG9pbnRlcnMgdG8gdGhlIGNvcnJlY3QKLSAgICAgKiBsb2NhdGlvbnMuICBUaGlzIGlzIGFib3V0IDN4IHRvbyBtdWNoIG92ZXJoZWFkIChkb2luZyBhbGwgdGhlCi0gICAgICogc2VncmVnIHB0cnMgd2hlbiBvbmx5IG9uZSBpcyBuZWVkZWQsIGJ1dCB0aGlzIGluc3RydWN0aW9uCi0gICAgICogKmNhbm5vdCogYmUgdGhhdCBjb21tb24sIGFuZCB0aGlzIGlzbid0IHRvbyBtdWNoIHdvcmsgYW55d2F5LgotICAgICAqLwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDhmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wb3BfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlBPUFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBpZiAocmggIT0gMCkgewotCURFQ09ERV9QUklOVEYoIklMTEVHQUwgREVDT0RFIE9GIE9QQ09ERSA4RlxuIik7Ci0JSEFMVF9TWVMoKTsKLSAgICB9Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHBvcF9sb25nKCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBwb3Bfd29yZCgpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gcG9wX2xvbmcoKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHBvcF93b3JkKCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBwb3BfbG9uZygpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gcG9wX3dvcmQoKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gcG9wX2xvbmcoKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBwb3Bfd29yZCgpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OTAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX25vcCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJOT1BcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OTEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9DWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHRtcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiWENIR1x0RUFYLEVDWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJYQ0hHXHRBWCxDWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JdG1wID0gTS54ODYuUl9FQVg7Ci0JTS54ODYuUl9FQVggPSBNLng4Ni5SX0VDWDsKLQlNLng4Ni5SX0VDWCA9IHRtcDsKLSAgICB9IGVsc2UgewotCXRtcCA9IE0ueDg2LlJfQVg7Ci0JTS54ODYuUl9BWCA9IE0ueDg2LlJfQ1g7Ci0JTS54ODYuUl9DWCA9ICh1MTYpdG1wOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5MgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeGNoZ193b3JkX0FYX0RYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgdG1wOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJYQ0hHXHRFQVgsRURYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlhDSEdcdEFYLERYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQl0bXAgPSBNLng4Ni5SX0VBWDsKLQlNLng4Ni5SX0VBWCA9IE0ueDg2LlJfRURYOwotCU0ueDg2LlJfRURYID0gdG1wOwotICAgIH0gZWxzZSB7Ci0JdG1wID0gTS54ODYuUl9BWDsKLQlNLng4Ni5SX0FYID0gTS54ODYuUl9EWDsKLQlNLng4Ni5SX0RYID0gKHUxNil0bXA7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDkzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfQlgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiB0bXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlhDSEdcdEVBWCxFQlhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiWENIR1x0QVgsQlhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXRtcCA9IE0ueDg2LlJfRUFYOwotCU0ueDg2LlJfRUFYID0gTS54ODYuUl9FQlg7Ci0JTS54ODYuUl9FQlggPSB0bXA7Ci0gICAgfSBlbHNlIHsKLQl0bXAgPSBNLng4Ni5SX0FYOwotCU0ueDg2LlJfQVggPSBNLng4Ni5SX0JYOwotCU0ueDg2LlJfQlggPSAodTE2KXRtcDsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OTQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9TUCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHRtcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiWENIR1x0RUFYLEVTUFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJYQ0hHXHRBWCxTUFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JdG1wID0gTS54ODYuUl9FQVg7Ci0JTS54ODYuUl9FQVggPSBNLng4Ni5SX0VTUDsKLQlNLng4Ni5SX0VTUCA9IHRtcDsKLSAgICB9IGVsc2UgewotCXRtcCA9IE0ueDg2LlJfQVg7Ci0JTS54ODYuUl9BWCA9IE0ueDg2LlJfU1A7Ci0JTS54ODYuUl9TUCA9ICh1MTYpdG1wOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5NQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeGNoZ193b3JkX0FYX0JQKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgdG1wOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJYQ0hHXHRFQVgsRUJQXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlhDSEdcdEFYLEJQXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQl0bXAgPSBNLng4Ni5SX0VBWDsKLQlNLng4Ni5SX0VBWCA9IE0ueDg2LlJfRUJQOwotCU0ueDg2LlJfRUJQID0gdG1wOwotICAgIH0gZWxzZSB7Ci0JdG1wID0gTS54ODYuUl9BWDsKLQlNLng4Ni5SX0FYID0gTS54ODYuUl9CUDsKLQlNLng4Ni5SX0JQID0gKHUxNil0bXA7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDk2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfU0kodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiB0bXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlhDSEdcdEVBWCxFU0lcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiWENIR1x0QVgsU0lcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXRtcCA9IE0ueDg2LlJfRUFYOwotCU0ueDg2LlJfRUFYID0gTS54ODYuUl9FU0k7Ci0JTS54ODYuUl9FU0kgPSB0bXA7Ci0gICAgfSBlbHNlIHsKLQl0bXAgPSBNLng4Ni5SX0FYOwotCU0ueDg2LlJfQVggPSBNLng4Ni5SX1NJOwotCU0ueDg2LlJfU0kgPSAodTE2KXRtcDsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OTcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9ESSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHRtcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiWENIR1x0RUFYLEVESVxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJYQ0hHXHRBWCxESVxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JdG1wID0gTS54ODYuUl9FQVg7Ci0JTS54ODYuUl9FQVggPSBNLng4Ni5SX0VESTsKLQlNLng4Ni5SX0VESSA9IHRtcDsKLSAgICB9IGVsc2UgewotCXRtcCA9IE0ueDg2LlJfQVg7Ci0JTS54ODYuUl9BWCA9IE0ueDg2LlJfREk7Ci0JTS54ODYuUl9ESSA9ICh1MTYpdG1wOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5OAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY2J3KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkNXREVcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiQ0JXXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlpZiAoTS54ODYuUl9BWCAmIDB4ODAwMCkgewotCSAgICBNLng4Ni5SX0VBWCB8PSAweGZmZmYwMDAwOwotCX0gZWxzZSB7Ci0JICAgIE0ueDg2LlJfRUFYICY9IDB4MDAwMGZmZmY7Ci0JfQotICAgIH0gZWxzZSB7Ci0JaWYgKE0ueDg2LlJfQUwgJiAweDgwKSB7Ci0JICAgIE0ueDg2LlJfQUggPSAweGZmOwotCX0gZWxzZSB7Ci0JICAgIE0ueDg2LlJfQUggPSAweDA7Ci0JfQotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5OQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY3dkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkNEUVxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJDV0RcbiIpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGKCJDV0RcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JaWYgKE0ueDg2LlJfRUFYICYgMHg4MDAwMDAwMCkgewotCSAgICBNLng4Ni5SX0VEWCA9IDB4ZmZmZmZmZmY7Ci0JfSBlbHNlIHsKLQkgICAgTS54ODYuUl9FRFggPSAweDA7Ci0JfQotICAgIH0gZWxzZSB7Ci0JaWYgKE0ueDg2LlJfQVggJiAweDgwMDApIHsKLQkgICAgTS54ODYuUl9EWCA9IDB4ZmZmZjsKLQl9IGVsc2UgewotCSAgICBNLng4Ni5SX0RYID0gMHgwOwotCX0KLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OWEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2NhbGxfZmFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTE2IGZhcnNlZywgZmFyb2ZmOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLQlERUNPREVfUFJJTlRGKCJDQUxMXHQiKTsKLQlmYXJvZmYgPSBmZXRjaF93b3JkX2ltbSgpOwotCWZhcnNlZyA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiUwNHg6IiwgZmFyc2VnKTsKLQlERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgZmFyb2ZmKTsKLQlDQUxMX1RSQUNFKE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCwgZmFyc2VnLCBmYXJvZmYsICJGQVIgIik7Ci0KLSAgICAvKiBYWFgKLSAgICAgKgotICAgICAqIEhvb2tlZCBpbnRlcnJ1cHQgdmVjdG9ycyBjYWxsaW5nIGludG8gb3VyICJCSU9TIiB3aWxsIGNhdXNlCi0gICAgICogcHJvYmxlbXMgdW5sZXNzIGFsbCBpbnRlcnNlZ21lbnQgc3R1ZmYgaXMgY2hlY2tlZCBmb3IgQklPUwotICAgICAqIGFjY2Vzcy4gIENoZWNrIG5lZWRlZCBoZXJlLiAgRm9yIG1vbWVudCwgbGV0IGl0IGFsb25lLgotICAgICAqLwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgcHVzaF93b3JkKE0ueDg2LlJfQ1MpOwotICAgIE0ueDg2LlJfQ1MgPSBmYXJzZWc7Ci0gICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOwotICAgIE0ueDg2LlJfSVAgPSBmYXJvZmY7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OWIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3dhaXQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiV0FJVCIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgLyogTkFEQS4gICovCi0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OWMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hmX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBmbGFnczsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSEZEXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBVU0hGXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLQotICAgIC8qIGNsZWFyIG91dCAqYWxsKiBiaXRzIG5vdCByZXByZXNlbnRpbmcgZmxhZ3MsIGFuZCB0dXJuIG9uIHJlYWwgYml0cyAqLwotICAgIGZsYWdzID0gKE0ueDg2LlJfRUZMRyAmIEZfTVNLKSB8IEZfQUxXQVlTX09OOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXB1c2hfbG9uZyhmbGFncyk7Ci0gICAgfSBlbHNlIHsKLQlwdXNoX3dvcmQoKHUxNilmbGFncyk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDlkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wb3BmX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUE9QRkRcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUE9QRlxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FRkxHID0gcG9wX2xvbmcoKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfRkxHID0gcG9wX3dvcmQoKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3NhaGYodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU0FIRlxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICAvKiBjbGVhciB0aGUgbG93ZXIgYml0cyBvZiB0aGUgZmxhZyByZWdpc3RlciAqLwotICAgIE0ueDg2LlJfRkxHICY9IDB4ZmZmZmZmMDA7Ci0gICAgLyogb3IgaW4gdGhlIEFIIHJlZ2lzdGVyIGludG8gdGhlIGZsYWdzIHJlZ2lzdGVyICovCi0gICAgTS54ODYuUl9GTEcgfD0gTS54ODYuUl9BSDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5ZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbGFoZih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJMQUhGXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCU0ueDg2LlJfQUggPSAodTgpKE0ueDg2LlJfRkxHICYgMHhmZik7Ci0gICAgLyp1bmRvY3VtZW50ZWQgVEMrKyBiZWhhdmlvcj8/PyBOb3BlLiAgSXQncyBkb2N1bWVudGVkLCBidXQKLSAgICAgICB5b3UgaGF2ZSB0b28gbG9vayByZWFsIGhhcmQgdG8gbm90aWNlIGl0LiAqLwotICAgIE0ueDg2LlJfQUggfD0gMHgyOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGEwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZfQUxfTV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUxNiBvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0QUwsIik7Ci0gICAgb2Zmc2V0ID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiWyUwNHhdXG4iLCBvZmZzZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BTCA9IGZldGNoX2RhdGFfYnl0ZShvZmZzZXQpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGExCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZfQVhfTV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUxNiBvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIG9mZnNldCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URjIoIk1PVlx0RUFYLFslMDR4XVxuIiwgb2Zmc2V0KTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYyKCJNT1ZcdEFYLFslMDR4XVxuIiwgb2Zmc2V0KTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VBWCA9IGZldGNoX2RhdGFfbG9uZyhvZmZzZXQpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9BWCA9IGZldGNoX2RhdGFfd29yZChvZmZzZXQpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X01fQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MTYgb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOwotICAgIG9mZnNldCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIlslMDR4XSxBTFxuIiwgb2Zmc2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIHN0b3JlX2RhdGFfYnl0ZShvZmZzZXQsIE0ueDg2LlJfQUwpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGEzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZfTV9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUxNiBvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIG9mZnNldCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URjIoIk1PVlx0WyUwNHhdLEVBWFxuIiwgb2Zmc2V0KTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYyKCJNT1ZcdFslMDR4XSxBWFxuIiwgb2Zmc2V0KTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlzdG9yZV9kYXRhX2xvbmcob2Zmc2V0LCBNLng4Ni5SX0VBWCk7Ci0gICAgfSBlbHNlIHsKLQlzdG9yZV9kYXRhX3dvcmQob2Zmc2V0LCBNLng4Ni5SX0FYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YTQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdnNfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggIHZhbDsKLSAgICB1MzIgY291bnQ7Ci0gICAgaW50IGluYzsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WU1x0QllURVxuIik7Ci0gICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KLQlpbmMgPSAtMTsKLSAgICBlbHNlCi0JaW5jID0gMTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGNvdW50ID0gMTsKLSAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7Ci0JLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLwotCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCWNvdW50ID0gTS54ODYuUl9DWDsKLQlNLng4Ni5SX0NYID0gMDsKLQlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKLSAgICB9Ci0gICAgd2hpbGUgKGNvdW50LS0pIHsKLQl2YWwgPSBmZXRjaF9kYXRhX2J5dGUoTS54ODYuUl9TSSk7Ci0Jc3RvcmVfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCB2YWwpOwotCU0ueDg2LlJfU0kgKz0gaW5jOwotCU0ueDg2LlJfREkgKz0gaW5jOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhNQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92c193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgdmFsOwotICAgIGludCBpbmM7Ci0gICAgdTMyIGNvdW50OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZTXHREV09SRFxuIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgICAgIC8qIGRvd24gKi8KLQkgICAgaW5jID0gLTQ7Ci0JZWxzZQotCSAgICBpbmMgPSA0OwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiTU9WU1x0V09SRFxuIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgICAgIC8qIGRvd24gKi8KLQkgICAgaW5jID0gLTI7Ci0JZWxzZQotCSAgICBpbmMgPSAyOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGNvdW50ID0gMTsKLSAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7Ci0JLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLwotCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCWNvdW50ID0gTS54ODYuUl9DWDsKLQlNLng4Ni5SX0NYID0gMDsKLQlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKLSAgICB9Ci0gICAgd2hpbGUgKGNvdW50LS0pIHsKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdmFsID0gZmV0Y2hfZGF0YV9sb25nKE0ueDg2LlJfU0kpOwotCSAgICBzdG9yZV9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksIHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdmFsID0gZmV0Y2hfZGF0YV93b3JkKE0ueDg2LlJfU0kpOwotCSAgICBzdG9yZV9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksICh1MTYpdmFsKTsKLQl9Ci0JTS54ODYuUl9TSSArPSBpbmM7Ci0JTS54ODYuUl9ESSArPSBpbmM7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGE2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jbXBzX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IHZhbDEsIHZhbDI7Ci0gICAgaW50IGluYzsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQ01QU1x0QllURVxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLwotCWluYyA9IC0xOwotICAgIGVsc2UKLQlpbmMgPSAxOwotCi0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBFKSB7Ci0JLyogUkVQRSAgKi8KLQkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7Ci0JICAgIHZhbDEgPSBmZXRjaF9kYXRhX2J5dGUoTS54ODYuUl9TSSk7Ci0JICAgIHZhbDIgPSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCQkgICAgIGNtcF9ieXRlKHZhbDEsIHZhbDIpOwotCSAgICBNLng4Ni5SX0NYIC09IDE7Ci0JICAgIE0ueDg2LlJfU0kgKz0gaW5jOwotCSAgICBNLng4Ni5SX0RJICs9IGluYzsKLQkgICAgaWYgKEFDQ0VTU19GTEFHKEZfWkYpID09IDApCi0JCWJyZWFrOwotCX0KLQlNLng4Ni5tb2RlICY9IH5TWVNNT0RFX1BSRUZJWF9SRVBFOwotICAgIH0gZWxzZSBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUE5FKSB7Ci0JLyogUkVQTkUgICovCi0JLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCi0Jd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgewotCSAgICB2YWwxID0gZmV0Y2hfZGF0YV9ieXRlKE0ueDg2LlJfU0kpOwotCSAgICB2YWwyID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkgICAgY21wX2J5dGUodmFsMSwgdmFsMik7Ci0JICAgIE0ueDg2LlJfQ1ggLT0gMTsKLQkgICAgTS54ODYuUl9TSSArPSBpbmM7Ci0JICAgIE0ueDg2LlJfREkgKz0gaW5jOwotCSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9aRikpCi0JCWJyZWFrOyAgICAgICAgICAvKiB6ZXJvIGZsYWcgc2V0IG1lYW5zIGVxdWFsICovCi0JfQotCU0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUE5FOwotICAgIH0gZWxzZSB7Ci0JdmFsMSA9IGZldGNoX2RhdGFfYnl0ZShNLng4Ni5SX1NJKTsKLQl2YWwyID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQljbXBfYnl0ZSh2YWwxLCB2YWwyKTsKLQlNLng4Ni5SX1NJICs9IGluYzsKLQlNLng4Ni5SX0RJICs9IGluYzsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YTcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2NtcHNfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHZhbDEsdmFsMjsKLSAgICBpbnQgaW5jOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJDTVBTXHREV09SRFxuIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KLQkgICAgaW5jID0gLTQ7Ci0JZWxzZQotCSAgICBpbmMgPSA0OwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiQ01QU1x0V09SRFxuIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KLQkgICAgaW5jID0gLTI7Ci0JZWxzZQotCSAgICBpbmMgPSAyOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQRSkgewotCS8qIFJFUEUgICovCi0JLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCi0Jd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgewotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdmFsMSA9IGZldGNoX2RhdGFfbG9uZyhNLng4Ni5SX1NJKTsKLQkJdmFsMiA9IGZldGNoX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JCWNtcF9sb25nKHZhbDEsIHZhbDIpOwotCSAgICB9IGVsc2UgewotCQl2YWwxID0gZmV0Y2hfZGF0YV93b3JkKE0ueDg2LlJfU0kpOwotCQl2YWwyID0gZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkJY21wX3dvcmQoKHUxNil2YWwxLCAodTE2KXZhbDIpOwotCSAgICB9Ci0JICAgIE0ueDg2LlJfQ1ggLT0gMTsKLQkgICAgTS54ODYuUl9TSSArPSBpbmM7Ci0JICAgIE0ueDg2LlJfREkgKz0gaW5jOwotCSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9aRikgPT0gMCkKLQkJYnJlYWs7Ci0JfQotCU0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUEU7Ci0gICAgfSBlbHNlIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQTkUpIHsKLQkvKiBSRVBORSAgKi8KLQkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl2YWwxID0gZmV0Y2hfZGF0YV9sb25nKE0ueDg2LlJfU0kpOwotCQl2YWwyID0gZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkJY21wX2xvbmcodmFsMSwgdmFsMik7Ci0JICAgIH0gZWxzZSB7Ci0JCXZhbDEgPSBmZXRjaF9kYXRhX3dvcmQoTS54ODYuUl9TSSk7Ci0JCXZhbDIgPSBmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCQljbXBfd29yZCgodTE2KXZhbDEsICh1MTYpdmFsMik7Ci0JICAgIH0KLQkgICAgTS54ODYuUl9DWCAtPSAxOwotCSAgICBNLng4Ni5SX1NJICs9IGluYzsKLQkgICAgTS54ODYuUl9ESSArPSBpbmM7Ci0JICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSkKLQkJYnJlYWs7ICAgICAgICAgIC8qIHplcm8gZmxhZyBzZXQgbWVhbnMgZXF1YWwgKi8KLQl9Ci0JTS54ODYubW9kZSAmPSB+U1lTTU9ERV9QUkVGSVhfUkVQTkU7Ci0gICAgfSBlbHNlIHsKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdmFsMSA9IGZldGNoX2RhdGFfbG9uZyhNLng4Ni5SX1NJKTsKLQkgICAgdmFsMiA9IGZldGNoX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JICAgIGNtcF9sb25nKHZhbDEsIHZhbDIpOwotCX0gZWxzZSB7Ci0JICAgIHZhbDEgPSBmZXRjaF9kYXRhX3dvcmQoTS54ODYuUl9TSSk7Ci0JICAgIHZhbDIgPSBmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCSAgICBjbXBfd29yZCgodTE2KXZhbDEsICh1MTYpdmFsMik7Ci0JfQotCU0ueDg2LlJfU0kgKz0gaW5jOwotCU0ueDg2LlJfREkgKz0gaW5jOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhOAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfdGVzdF9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBpbW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlRFU1RcdEFMLCIpOwotICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGltbSk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLQl0ZXN0X2J5dGUoTS54ODYuUl9BTCwgKHU4KWltbSk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YTkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3Rlc3RfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJURVNUXHRFQVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlRFU1RcdEFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXRlc3RfbG9uZyhNLng4Ni5SX0VBWCwgc3JjdmFsKTsKLSAgICB9IGVsc2UgewotCXRlc3Rfd29yZChNLng4Ni5SX0FYLCAodTE2KXNyY3ZhbCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGFhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zdG9zX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBpbmM7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNUT1NcdEJZVEVcbiIpOwotICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCi0JaW5jID0gLTE7Ci0gICAgZWxzZQotCWluYyA9IDE7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7Ci0JLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLwotCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKLQkgICAgc3RvcmVfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCBNLng4Ni5SX0FMKTsKLQkgICAgTS54ODYuUl9DWCAtPSAxOwotCSAgICBNLng4Ni5SX0RJICs9IGluYzsKLQl9Ci0JTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7Ci0gICAgfSBlbHNlIHsKLQlzdG9yZV9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksIE0ueDg2LlJfQUwpOwotCU0ueDg2LlJfREkgKz0gaW5jOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhYgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc3Rvc193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgaW5jOwotICAgIHUzMiBjb3VudDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiU1RPU1x0RFdPUkRcbiIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCi0JICAgIGluYyA9IC00OwotCWVsc2UKLQkgICAgaW5jID0gNDsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlNUT1NcdFdPUkRcbiIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCi0JICAgIGluYyA9IC0yOwotCWVsc2UKLQkgICAgaW5jID0gMjsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBjb3VudCA9IDE7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgewotCS8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KLQkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQljb3VudCA9IE0ueDg2LlJfQ1g7Ci0JTS54ODYuUl9DWCA9IDA7Ci0JTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7Ci0gICAgfQotICAgIHdoaWxlIChjb3VudC0tKSB7Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgTS54ODYuUl9FQVgpOwotCX0gZWxzZSB7Ci0JICAgIHN0b3JlX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgTS54ODYuUl9BWCk7Ci0JfQotCU0ueDg2LlJfREkgKz0gaW5jOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbG9kc19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgaW5jOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJMT0RTXHRCWVRFXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCi0JaW5jID0gLTE7Ci0gICAgZWxzZQotCWluYyA9IDE7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgewotCS8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KLQkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7Ci0JICAgIE0ueDg2LlJfQUwgPSBmZXRjaF9kYXRhX2J5dGUoTS54ODYuUl9TSSk7Ci0JICAgIE0ueDg2LlJfQ1ggLT0gMTsKLQkgICAgTS54ODYuUl9TSSArPSBpbmM7Ci0JfQotCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9BTCA9IGZldGNoX2RhdGFfYnl0ZShNLng4Ni5SX1NJKTsKLQlNLng4Ni5SX1NJICs9IGluYzsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2xvZHNfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IGluYzsKLSAgICB1MzIgY291bnQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkxPRFNcdERXT1JEXG4iKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLwotCSAgICBpbmMgPSAtNDsKLQllbHNlCi0JICAgIGluYyA9IDQ7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJMT0RTXHRXT1JEXG4iKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLwotCSAgICBpbmMgPSAtMjsKLQllbHNlCi0JICAgIGluYyA9IDI7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgY291bnQgPSAxOwotICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKLQkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCi0JLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCi0JY291bnQgPSBNLng4Ni5SX0NYOwotCU0ueDg2LlJfQ1ggPSAwOwotCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOwotICAgIH0KLSAgICB3aGlsZSAoY291bnQtLSkgewotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICBNLng4Ni5SX0VBWCA9IGZldGNoX2RhdGFfbG9uZyhNLng4Ni5SX1NJKTsKLQl9IGVsc2UgewotCSAgICBNLng4Ni5SX0FYID0gZmV0Y2hfZGF0YV93b3JkKE0ueDg2LlJfU0kpOwotCX0KLQlNLng4Ni5SX1NJICs9IGluYzsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3NjYXNfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggdmFsMjsKLSAgICBpbnQgaW5jOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTQ0FTXHRCWVRFXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCi0JaW5jID0gLTE7Ci0gICAgZWxzZQotCWluYyA9IDE7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBFKSB7Ci0JLyogUkVQRSAgKi8KLQkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7Ci0JICAgIHZhbDIgPSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCSAgICBjbXBfYnl0ZShNLng4Ni5SX0FMLCB2YWwyKTsKLQkgICAgTS54ODYuUl9DWCAtPSAxOwotCSAgICBNLng4Ni5SX0RJICs9IGluYzsKLQkgICAgaWYgKEFDQ0VTU19GTEFHKEZfWkYpID09IDApCi0JCWJyZWFrOwotCX0KLQlNLng4Ni5tb2RlICY9IH5TWVNNT0RFX1BSRUZJWF9SRVBFOwotICAgIH0gZWxzZSBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUE5FKSB7Ci0JLyogUkVQTkUgICovCi0JLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCi0Jd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgewotCSAgICB2YWwyID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkgICAgY21wX2J5dGUoTS54ODYuUl9BTCwgdmFsMik7Ci0JICAgIE0ueDg2LlJfQ1ggLT0gMTsKLQkgICAgTS54ODYuUl9ESSArPSBpbmM7Ci0JICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSkKLQkJYnJlYWs7ICAgICAgICAgIC8qIHplcm8gZmxhZyBzZXQgbWVhbnMgZXF1YWwgKi8KLQl9Ci0JTS54ODYubW9kZSAmPSB+U1lTTU9ERV9QUkVGSVhfUkVQTkU7Ci0gICAgfSBlbHNlIHsKLQl2YWwyID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQljbXBfYnl0ZShNLng4Ni5SX0FMLCB2YWwyKTsKLQlNLng4Ni5SX0RJICs9IGluYzsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YWYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3NjYXNfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IGluYzsKLSAgICB1MzIgdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJTQ0FTXHREV09SRFxuIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KLQkgICAgaW5jID0gLTQ7Ci0JZWxzZQotCSAgICBpbmMgPSA0OwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiU0NBU1x0V09SRFxuIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KLQkgICAgaW5jID0gLTI7Ci0JZWxzZQotCSAgICBpbmMgPSAyOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQRSkgewotCS8qIFJFUEUgICovCi0JLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCi0Jd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgewotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdmFsID0gZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkJY21wX2xvbmcoTS54ODYuUl9FQVgsIHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXZhbCA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JCWNtcF93b3JkKE0ueDg2LlJfQVgsICh1MTYpdmFsKTsKLQkgICAgfQotCSAgICBNLng4Ni5SX0NYIC09IDE7Ci0JICAgIE0ueDg2LlJfREkgKz0gaW5jOwotCSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9aRikgPT0gMCkKLQkJYnJlYWs7Ci0JfQotCU0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUEU7Ci0gICAgfSBlbHNlIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQTkUpIHsKLQkvKiBSRVBORSAgKi8KLQkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl2YWwgPSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCQljbXBfbG9uZyhNLng4Ni5SX0VBWCwgdmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdmFsID0gZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkJY21wX3dvcmQoTS54ODYuUl9BWCwgKHUxNil2YWwpOwotCSAgICB9Ci0JICAgIE0ueDg2LlJfQ1ggLT0gMTsKLQkgICAgTS54ODYuUl9ESSArPSBpbmM7Ci0JICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSkKLQkJYnJlYWs7ICAgICAgICAgIC8qIHplcm8gZmxhZyBzZXQgbWVhbnMgZXF1YWwgKi8KLQl9Ci0JTS54ODYubW9kZSAmPSB+U1lTTU9ERV9QUkVGSVhfUkVQTkU7Ci0gICAgfSBlbHNlIHsKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdmFsID0gZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkgICAgY21wX2xvbmcoTS54ODYuUl9FQVgsIHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdmFsID0gZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkgICAgY21wX3dvcmQoTS54ODYuUl9BWCwgKHUxNil2YWwpOwotCX0KLQlNLng4Ni5SX0RJICs9IGluYzsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YjAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl9ieXRlX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggaW1tOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdEFMLCIpOwotICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BTCA9IGltbTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiMQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X2J5dGVfQ0xfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBpbW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Q0wsIik7Ci0gICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0NMID0gaW1tOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGIyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9ETF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IGltbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHRETCwiKTsKLSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfREwgPSBpbW07Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YjMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl9ieXRlX0JMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggaW1tOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdEJMLCIpOwotICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9CTCA9IGltbTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiNAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X2J5dGVfQUhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBpbW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0QUgsIik7Ci0gICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FIID0gaW1tOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGI1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9DSF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IGltbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHRDSCwiKTsKLSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQ0ggPSBpbW07Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YjYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl9ieXRlX0RIX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggaW1tOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdERILCIpOwotICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9ESCA9IGltbTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiNwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X2J5dGVfQkhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBpbW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0QkgsIik7Ci0gICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0JIID0gaW1tOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGI4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIk1PVlx0RUFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdEFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUFYID0gc3JjdmFsOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9BWCA9ICh1MTYpc3JjdmFsOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiOQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X3dvcmRfQ1hfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdEVDWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHRDWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VDWCA9IHNyY3ZhbDsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQ1ggPSAodTE2KXNyY3ZhbDsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YmEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl93b3JkX0RYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHRFRFgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIk1PVlx0RFgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FRFggPSBzcmN2YWw7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0RYID0gKHUxNilzcmN2YWw7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGJiCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9CWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIk1PVlx0RUJYLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdEJYLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUJYID0gc3JjdmFsOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9CWCA9ICh1MTYpc3JjdmFsOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X3dvcmRfU1BfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdEVTUCwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHRTUCwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VTUCA9IHNyY3ZhbDsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfU1AgPSAodTE2KXNyY3ZhbDsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YmQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl93b3JkX0JQX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHRFQlAsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIk1PVlx0QlAsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQlAgPSBzcmN2YWw7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0JQID0gKHUxNilzcmN2YWw7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGJlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9TSV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIk1PVlx0RVNJLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdFNJLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRVNJID0gc3JjdmFsOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9TSSA9ICh1MTYpc3JjdmFsOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X3dvcmRfRElfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdEVESSwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHRESSwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VESSA9IHNyY3ZhbDsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfREkgPSAodTE2KXNyY3ZhbDsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKiB1c2VkIGJ5IG9wY29kZXMgYzAsIGQwLCBhbmQgZDIuICovCi1zdGF0aWMgdTgoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW10pKHU4IGQsIHU4IHMpID0KLXsKLSAgICByb2xfYnl0ZSwKLSAgICByb3JfYnl0ZSwKLSAgICByY2xfYnl0ZSwKLSAgICByY3JfYnl0ZSwKLSAgICBzaGxfYnl0ZSwKLSAgICBzaHJfYnl0ZSwKLSAgICBzaGxfYnl0ZSwgICAgICAgICAgIC8qIHNhbF9ieXRlID09PSBzaGxfYnl0ZSAgYnkgZGVmaW5pdGlvbiAqLwotICAgIHNhcl9ieXRlLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGMwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcGNDMF9ieXRlX1JNX01FTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBkZXN0dmFsOwotICAgIHU4IGFtdDsKLQotICAgIC8qCi0gICAgICogWWV0IGFub3RoZXIgd2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mCi0gICAgICogdGhlIG9wY29kZSBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQKLSAgICAgKiByZXN1bHQsIGV4Y2VwdCB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCi0gICAgICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotI2lmZGVmIERFQlVHCi0gICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7Ci0JLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKLQkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncwotCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQotCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KLQotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJPTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiUk9SXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJSQ0xcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJDUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URigiU0hMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGKCJTSFJcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNBTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URigiU0FSXHQiKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKLSAgICAgICBtb2RlLiAqLwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCWFtdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKLQkqZGVzdHJlZyA9IGRlc3R2YWw7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyogdXNlZCBieSBvcGNvZGVzIGMxLCBkMSwgYW5kIGQzLiAqLwotc3RhdGljIHUxNigqb3BjRDFfd29yZF9vcGVyYXRpb25bXSkodTE2IHMsIHU4IGQpID0KLXsKLSAgICByb2xfd29yZCwKLSAgICByb3Jfd29yZCwKLSAgICByY2xfd29yZCwKLSAgICByY3Jfd29yZCwKLSAgICBzaGxfd29yZCwKLSAgICBzaHJfd29yZCwKLSAgICBzaGxfd29yZCwgICAgICAgICAgIC8qIHNhbF9ieXRlID09PSBzaGxfYnl0ZSAgYnkgZGVmaW5pdGlvbiAqLwotICAgIHNhcl93b3JkLAotfTsKLQotLyogdXNlZCBieSBvcGNvZGVzIGMxLCBkMSwgYW5kIGQzLiAqLwotc3RhdGljIHUzMiAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW10pKHUzMiBzLCB1OCBkKSA9Ci17Ci0gICAgcm9sX2xvbmcsCi0gICAgcm9yX2xvbmcsCi0gICAgcmNsX2xvbmcsCi0gICAgcmNyX2xvbmcsCi0gICAgc2hsX2xvbmcsCi0gICAgc2hyX2xvbmcsCi0gICAgc2hsX2xvbmcsICAgICAgICAgICAvKiBzYWxfYnl0ZSA9PT0gc2hsX2J5dGUgIGJ5IGRlZmluaXRpb24gKi8KLSAgICBzYXJfbG9uZywKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjMQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3BjQzFfd29yZF9STV9NRU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggYW10OwotCi0gICAgLyoKLSAgICAgKiBZZXQgYW5vdGhlciB3ZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YKLSAgICAgKiB0aGUgb3Bjb2RlIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZAotICAgICAqIHJlc3VsdCwgZXhjZXB0IHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0jaWZkZWYgREVCVUcKLSAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKLQkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQotCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCi0JICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCi0JICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLwotCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZwotICAgICAgIG1vZGUuICovCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBhbXQpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YzIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3JldF9uZWFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTE2IGltbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUkVUXHQiKTsKLSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLQlSRVRVUk5fVFJBQ0UoIlJFVCIsTS54ODYuc2F2ZWRfY3MsTS54ODYuc2F2ZWRfaXApOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9JUCA9IHBvcF93b3JkKCk7Ci0gICAgTS54ODYuUl9TUCArPSBpbW07Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YzMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3JldF9uZWFyKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlJFVFxuIik7Ci0JUkVUVVJOX1RSQUNFKCJSRVQiLE0ueDg2LnNhdmVkX2NzLE0ueDg2LnNhdmVkX2lwKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfSVAgPSBwb3Bfd29yZCgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGM0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9sZXNfUl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJoLCBybDsKLSAgICB1MTYgKmRzdHJlZzsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTEVTXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlNLng4Ni5SX0VTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JTS54ODYuUl9FUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCU0ueDg2LlJfRVMgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JLyogVU5ERUZJTkVEISAqLwotCVRSQUNFX0FORF9TVEVQKCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGM1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9sZHNfUl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJoLCBybDsKLSAgICB1MTYgKmRzdHJlZzsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTERTXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlNLng4Ni5SX0RTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JTS54ODYuUl9EUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCU0ueDg2LlJfRFMgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JLyogVU5ERUZJTkVEISAqLwotCVRSQUNFX0FORF9TVEVQKCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGM2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9STV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggaW1tOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgaWYgKHJoICE9IDApIHsKLQlERUNPREVfUFJJTlRGKCJJTExFR0FMIERFQ09ERSBPRiBPUENPREUgYzZcbiIpOwotCUhBTFRfU1lTKCk7Ci0gICAgfQotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIsJTJ4XG4iLCBpbW0pOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGltbSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIsJTJ4XG4iLCBpbW0pOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGltbSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIsJTJ4XG4iLCBpbW0pOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGltbSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIsJTJ4XG4iLCBpbW0pOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBpbW07Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGM3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9STV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBpZiAocmggIT0gMCkgewotCURFQ09ERV9QUklOVEYoIklMTEVHQUwgREVDT0RFIE9GIE9QQ09ERSA4RlxuIik7Ci0JSEFMVF9TWVMoKTsKLSAgICB9Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBpbW0pOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGltbSk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGltbSk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgaW1tKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgaW1tKTsKLQl9IGVsc2UgewotCSAgICB1MTYgaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBpbW0pOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJCXUzMiAqZGVzdHJlZzsKLQkJCXUzMiBpbW07Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBpbW07Ci0JfSBlbHNlIHsKLQkJCXUxNiAqZGVzdHJlZzsKLQkJCXUxNiBpbW07Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBpbW07Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjOAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfZW50ZXIodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUxNiBsb2NhbCxmcmFtZV9wb2ludGVyOwotICAgIHU4ICBuZXN0aW5nOwotICAgIGludCBpOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBsb2NhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgbmVzdGluZyA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIkVOVEVSICV4XG4iLCBsb2NhbCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgbmVzdGluZyk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBwdXNoX3dvcmQoTS54ODYuUl9CUCk7Ci0gICAgZnJhbWVfcG9pbnRlciA9IE0ueDg2LlJfU1A7Ci0gICAgaWYgKG5lc3RpbmcgPiAwKSB7Ci0JZm9yIChpID0gMTsgaSA8IG5lc3Rpbmc7IGkrKykgewotCSAgICBNLng4Ni5SX0JQIC09IDI7Ci0JICAgIHB1c2hfd29yZChmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfU1MsIE0ueDg2LlJfQlApKTsKLQkgICAgfQotCXB1c2hfd29yZChmcmFtZV9wb2ludGVyKTsKLQl9Ci0gICAgTS54ODYuUl9CUCA9IGZyYW1lX3BvaW50ZXI7Ci0gICAgTS54ODYuUl9TUCA9ICh1MTYpKE0ueDg2LlJfU1AgLSBsb2NhbCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YzkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2xlYXZlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkxFQVZFXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfU1AgPSBNLng4Ni5SX0JQOwotICAgIE0ueDg2LlJfQlAgPSBwb3Bfd29yZCgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGNhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9yZXRfZmFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTE2IGltbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUkVURlx0Iik7Ci0gICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0JUkVUVVJOX1RSQUNFKCJSRVRGIixNLng4Ni5zYXZlZF9jcyxNLng4Ni5zYXZlZF9pcCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0lQID0gcG9wX3dvcmQoKTsKLSAgICBNLng4Ni5SX0NTID0gcG9wX3dvcmQoKTsKLSAgICBNLng4Ni5SX1NQICs9IGltbTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjYgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcmV0X2Zhcih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJSRVRGXG4iKTsKLQlSRVRVUk5fVFJBQ0UoIlJFVEYiLE0ueDg2LnNhdmVkX2NzLE0ueDg2LnNhdmVkX2lwKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfSVAgPSBwb3Bfd29yZCgpOwotICAgIE0ueDg2LlJfQ1MgPSBwb3Bfd29yZCgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGNjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbnQzKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MTYgdG1wOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJJTlQgM1xuIik7Ci0gICAgdG1wID0gKHUxNikgbWVtX2FjY2Vzc193b3JkKDMgKiA0ICsgMik7Ci0gICAgLyogYWNjZXNzIHRoZSBzZWdtZW50IHJlZ2lzdGVyICovCi0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLQlpZiAoX1g4NkVNVV9pbnRyVGFiWzNdKSB7Ci0JCSgqX1g4NkVNVV9pbnRyVGFiWzNdKSgzKTsKLSAgICB9IGVsc2UgewotCXB1c2hfd29yZCgodTE2KU0ueDg2LlJfRkxHKTsKLQlDTEVBUl9GTEFHKEZfSUYpOwotCUNMRUFSX0ZMQUcoRl9URik7Ci0JcHVzaF93b3JkKE0ueDg2LlJfQ1MpOwotCU0ueDg2LlJfQ1MgPSBtZW1fYWNjZXNzX3dvcmQoMyAqIDQgKyAyKTsKLQlwdXNoX3dvcmQoTS54ODYuUl9JUCk7Ci0JTS54ODYuUl9JUCA9IG1lbV9hY2Nlc3Nfd29yZCgzICogNCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGNkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbnRfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MTYgdG1wOwotICAgIHU4IGludG51bTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSU5UXHQiKTsKLSAgICBpbnRudW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW50bnVtKTsKLSAgICB0bXAgPSBtZW1fYWNjZXNzX3dvcmQoaW50bnVtICogNCArIDIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JaWYgKF9YODZFTVVfaW50clRhYltpbnRudW1dKSB7Ci0JCSgqX1g4NkVNVV9pbnRyVGFiW2ludG51bV0pKGludG51bSk7Ci0gICAgfSBlbHNlIHsKLQlwdXNoX3dvcmQoKHUxNilNLng4Ni5SX0ZMRyk7Ci0JQ0xFQVJfRkxBRyhGX0lGKTsKLQlDTEVBUl9GTEFHKEZfVEYpOwotCXB1c2hfd29yZChNLng4Ni5SX0NTKTsKLQlNLng4Ni5SX0NTID0gbWVtX2FjY2Vzc193b3JkKGludG51bSAqIDQgKyAyKTsKLQlwdXNoX3dvcmQoTS54ODYuUl9JUCk7Ci0JTS54ODYuUl9JUCA9IG1lbV9hY2Nlc3Nfd29yZChpbnRudW0gKiA0KTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4Y2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2ludG8odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUxNiB0bXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIklOVE9cbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKEFDQ0VTU19GTEFHKEZfT0YpKSB7Ci0JdG1wID0gbWVtX2FjY2Vzc193b3JkKDQgKiA0ICsgMik7Ci0JCWlmIChfWDg2RU1VX2ludHJUYWJbNF0pIHsKLQkJCSgqX1g4NkVNVV9pbnRyVGFiWzRdKSg0KTsKLQl9IGVsc2UgewotCSAgICBwdXNoX3dvcmQoKHUxNilNLng4Ni5SX0ZMRyk7Ci0JICAgIENMRUFSX0ZMQUcoRl9JRik7Ci0JICAgIENMRUFSX0ZMQUcoRl9URik7Ci0JICAgIHB1c2hfd29yZChNLng4Ni5SX0NTKTsKLQkgICAgTS54ODYuUl9DUyA9IG1lbV9hY2Nlc3Nfd29yZCg0ICogNCArIDIpOwotCSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7Ci0JICAgIE0ueDg2LlJfSVAgPSBtZW1fYWNjZXNzX3dvcmQoNCAqIDQpOwotCX0KLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4Y2YKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2lyZXQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSVJFVFxuIik7Ci0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCi0gICAgTS54ODYuUl9JUCA9IHBvcF93b3JkKCk7Ci0gICAgTS54ODYuUl9DUyA9IHBvcF93b3JkKCk7Ci0gICAgTS54ODYuUl9GTEcgPSBwb3Bfd29yZCgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGQwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcGNEMF9ieXRlX1JNXzEodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggZGVzdHZhbDsKLQotICAgIC8qCi0gICAgICogWWV0IGFub3RoZXIgd2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mCi0gICAgICogdGhlIG9wY29kZSBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQKLSAgICAgKiByZXN1bHQsIGV4Y2VwdCB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCi0gICAgICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotI2lmZGVmIERFQlVHCi0gICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7Ci0JLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKLQkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncwotCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQotCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCi0gICAgICAgbW9kZS4gKi8KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLDFcbiIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCAxKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsMVxuIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwxXG4iKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgMSk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiLDFcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIDEpOwotCSpkZXN0cmVnID0gZGVzdHZhbDsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZDEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29wY0QxX3dvcmRfUk1fMSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIC8qCi0gICAgICogWWV0IGFub3RoZXIgd2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mCi0gICAgICogdGhlIG9wY29kZSBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQKLSAgICAgKiByZXN1bHQsIGV4Y2VwdCB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCi0gICAgICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotI2lmZGVmIERFQlVHCi0gICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7Ci0JLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKLQkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncwotCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQotCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCi0gICAgICAgbW9kZS4gKi8KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgMSk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgMSk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgMSk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQkJdTMyIGRlc3R2YWw7Ci0JCQl1MzIgKmRlc3RyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLDFcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgMSk7Ci0JICAgICpkZXN0cmVnID0gZGVzdHZhbDsKLQl9IGVsc2UgewotCQkJdTE2IGRlc3R2YWw7Ci0JCQl1MTYgKmRlc3RyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLDFcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgMSk7Ci0JICAgICpkZXN0cmVnID0gZGVzdHZhbDsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGQyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcGNEMl9ieXRlX1JNX0NMKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGRlc3R2YWw7Ci0gICAgdTggYW10OwotCi0gICAgLyoKLSAgICAgKiBZZXQgYW5vdGhlciB3ZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YKLSAgICAgKiB0aGUgb3Bjb2RlIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZAotICAgICAqIHJlc3VsdCwgZXhjZXB0IHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0jaWZkZWYgREVCVUcKLSAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKLQkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQotCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCi0JICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCi0JICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJPTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiUk9SXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJSQ0xcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJDUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URigiU0hMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGKCJTSFJcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNBTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URigiU0FSXHQiKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKLSAgICAgICBtb2RlLiAqLwotICAgIGFtdCA9IE0ueDg2LlJfQ0w7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKLQkqZGVzdHJlZyA9IGRlc3R2YWw7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGQzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcGNEM193b3JkX1JNX0NMKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGFtdDsKLQotICAgIC8qCi0gICAgICogWWV0IGFub3RoZXIgd2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mCi0gICAgICogdGhlIG9wY29kZSBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQKLSAgICAgKiByZXN1bHQsIGV4Y2VwdCB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCi0gICAgICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotI2lmZGVmIERFQlVHCi0gICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7Ci0JLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKLQkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncwotCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQotCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCi0gICAgICAgbW9kZS4gKi8KLSAgICBhbXQgPSBNLng4Ni5SX0NMOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGFtdCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGQ0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hYW0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IGE7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFBTVxuIik7Ci0gICAgYSA9IGZldGNoX2J5dGVfaW1tKCk7ICAgICAgLyogdGhpcyBpcyBhIHN0dXBpZCBlbmNvZGluZy4gKi8KLSAgICBpZiAoYSAhPSAxMCkgewotCURFQ09ERV9QUklOVEYoIkVSUk9SIERFQ09ESU5HIEFBTVxuIik7Ci0JVFJBQ0VfUkVHUygpOwotCUhBTFRfU1lTKCk7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgLyogbm90ZSB0aGUgdHlwZSBjaGFuZ2UgaGVyZSAtLS0gcmV0dXJuaW5nIEFMIGFuZCBBSCBpbiBBWC4gKi8KLSAgICBNLng4Ni5SX0FYID0gYWFtX3dvcmQoTS54ODYuUl9BTCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZDUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FhZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggYTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQUFEXG4iKTsKLSAgICBhID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQVggPSBhYWRfd29yZChNLng4Ni5SX0FYKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qIG9wY29kZSAweGQ2IElMTEVHQUwgT1BDT0RFICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhkNwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeGxhdCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTE2IGFkZHI7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlhMQVRcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JYWRkciA9ICh1MTYpKE0ueDg2LlJfQlggKyAodTgpTS54ODYuUl9BTCk7Ci0gICAgTS54ODYuUl9BTCA9IGZldGNoX2RhdGFfYnl0ZShhZGRyKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qIGluc3R1Y3Rpb25zICBEOCAuLiBERiBhcmUgaW4gaTg3X29wcy5jICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbG9vcG5lKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzMTYgaXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkxPT1BORVx0Iik7Ci0gICAgaXAgPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgaXAgKz0gKHMxNikgTS54ODYuUl9JUDsKLSAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaXApOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9DWCAtPSAxOwotICAgIGlmIChNLng4Ni5SX0NYICE9IDAgJiYgIUFDQ0VTU19GTEFHKEZfWkYpKSAgICAgIC8qIENYICE9IDAgYW5kICFaRiAqLwotCU0ueDg2LlJfSVAgPSBpcDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlMQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbG9vcGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHMxNiBpcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTE9PUEVcdCIpOwotICAgIGlwID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIGlwICs9IChzMTYpIE0ueDg2LlJfSVA7Ci0gICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGlwKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQ1ggLT0gMTsKLSAgICBpZiAoTS54ODYuUl9DWCAhPSAwICYmIEFDQ0VTU19GTEFHKEZfWkYpKSAgICAgICAvKiBDWCAhPSAwIGFuZCBaRiAqLwotCU0ueDg2LlJfSVAgPSBpcDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbG9vcCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczE2IGlwOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJMT09QXHQiKTsKLSAgICBpcCA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBpcCArPSAoczE2KSBNLng4Ni5SX0lQOwotICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBpcCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0NYIC09IDE7Ci0gICAgaWYgKE0ueDg2LlJfQ1ggIT0gMCkKLQlNLng4Ni5SX0lQID0gaXA7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZTMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2pjeHoodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUxNiB0YXJnZXQ7Ci0gICAgczggIG9mZnNldDsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgb3ZlcmZsb3cgZmxhZyBpcyBzZXQgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpDWFpcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyBvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5SX0NYID09IDApCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlNAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW5fYnl0ZV9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IHBvcnQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIklOXHQiKTsKLQlwb3J0ID0gKHU4KSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleCxBTFxuIiwgcG9ydCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FMID0gKCpzeXNfaW5iKShwb3J0KTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlNQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW5fd29yZF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IHBvcnQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIklOXHQiKTsKLQlwb3J0ID0gKHU4KSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYyKCJFQVgsJXhcbiIsIHBvcnQpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URjIoIkFYLCV4XG4iLCBwb3J0KTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VBWCA9ICgqc3lzX2lubCkocG9ydCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0FYID0gKCpzeXNfaW53KShwb3J0KTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZTYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX291dF9ieXRlX0lNTV9BTCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggcG9ydDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiT1VUXHQiKTsKLQlwb3J0ID0gKHU4KSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleCxBTFxuIiwgcG9ydCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICAoKnN5c19vdXRiKShwb3J0LCBNLng4Ni5SX0FMKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlNwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3V0X3dvcmRfSU1NX0FYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBwb3J0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJPVVRcdCIpOwotCXBvcnQgPSAodTgpIGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URjIoIiV4LEVBWFxuIiwgcG9ydCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGMigiJXgsQVhcbiIsIHBvcnQpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSgqc3lzX291dGwpKHBvcnQsIE0ueDg2LlJfRUFYKTsKLSAgICB9IGVsc2UgewotCSgqc3lzX291dHcpKHBvcnQsIE0ueDg2LlJfQVgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlOAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY2FsbF9uZWFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczE2IGlwOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLQlERUNPREVfUFJJTlRGKCJDQUxMXHQiKTsKLQlpcCA9IChzMTYpIGZldGNoX3dvcmRfaW1tKCk7Ci0JaXAgKz0gKHMxNikgTS54ODYuUl9JUDsgICAgLyogQ0hFQ0sgU0lHTiAqLwotCURFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBpcCk7Ci0JQ0FMTF9UUkFDRShNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXAsIE0ueDg2LlJfQ1MsIGlwLCAiIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7Ci0gICAgTS54ODYuUl9JUCA9IGlwOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGU5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgaXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpNUFx0Iik7Ci0gICAgaXAgPSAoczE2KWZldGNoX3dvcmRfaW1tKCk7Ci0gICAgaXAgKz0gKHMxNilNLng4Ni5SX0lQOwotICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBpcCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0lQID0gKHUxNilpcDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlYQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9mYXJfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MTYgY3MsIGlwOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKTVBcdEZBUiAiKTsKLSAgICBpcCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgY3MgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIlMDR4OiIsIGNzKTsKLSAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaXApOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9JUCA9IGlwOwotICAgIE0ueDg2LlJfQ1MgPSBjczsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlYgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9ieXRlX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTE2IHRhcmdldDsKLSAgICBzOCBvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpNUFx0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIG9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW5fYnl0ZV9BTF9EWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJJTlx0QUwsRFhcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BTCA9ICgqc3lzX2luYikoTS54ODYuUl9EWCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2luX3dvcmRfQVhfRFgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiSU5cdEVBWCxEWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJJTlx0QVgsRFhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUFYID0gKCpzeXNfaW5sKShNLng4Ni5SX0RYKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQVggPSAoKnN5c19pbncpKE0ueDg2LlJfRFgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3V0X2J5dGVfRFhfQUwodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiT1VUXHREWCxBTFxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICAoKnN5c19vdXRiKShNLng4Ni5SX0RYLCBNLng4Ni5SX0FMKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3V0X3dvcmRfRFhfQVgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiT1VUXHREWCxFQVhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiT1VUXHREWCxBWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JKCpzeXNfb3V0bCkoTS54ODYuUl9EWCwgTS54ODYuUl9FQVgpOwotICAgIH0gZWxzZSB7Ci0JKCpzeXNfb3V0dykoTS54ODYuUl9EWCwgTS54ODYuUl9BWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGYwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9sb2NrKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkxPQ0s6XG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLypvcGNvZGUgMHhmMSBJTExFR0FMIE9QRVJBVElPTiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZjIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3JlcG5lKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlJFUE5FXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9QUkVGSVhfUkVQTkU7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZjMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3JlcGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUkVQRVxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfUFJFRklYX1JFUEU7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZjQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2hhbHQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSEFMVFxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBIQUxUX1NZUygpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGY1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jbWModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIC8qIGNvbXBsZW1lbnQgdGhlIGNhcnJ5IGZsYWcuICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJDTUNcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgVE9HR0xFX0ZMQUcoRl9DRik7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZjYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29wY0Y2X2J5dGVfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggZGVzdHZhbCwgc3JjdmFsOwotCi0gICAgLyogbG9uZywgZHJhd24gb3V0IGNvZGUgZm9sbG93cy4gIERvdWJsZSBzd2l0Y2ggZm9yIGEgdG90YWwKLSAgICAgICBvZiAzMiBjYXNlcy4gICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgIC8qIG1vZD0wMCAqLwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6ICAgICAgICAgLyogdGVzdCBieXRlIGltbSAqLwotCSAgICBERUNPREVfUFJJTlRGKCJURVNUXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlMDJ4XG4iLCBzcmN2YWwpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0ZXN0X2J5dGUoZGVzdHZhbCwgc3JjdmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0wMCBSSD0wMSBPUD1GNlxuIik7Ci0JICAgIEhBTFRfU1lTKCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiTk9UXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gbm90X2J5dGUoZGVzdHZhbCk7Ci0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJORUdcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBuZWdfYnl0ZShkZXN0dmFsKTsKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYoIk1VTFx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgbXVsX2J5dGUoZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URigiSU1VTFx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9ieXRlKGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYoIkRJVlx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGl2X2J5dGUoZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URigiSURJVlx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaWRpdl9ieXRlKGRlc3R2YWwpOwotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogZW5kIG1vZD09MDAgKi8KLSAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgLyogbW9kPTAxICovCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDogICAgICAgICAvKiB0ZXN0IGJ5dGUgaW1tICovCi0JICAgIERFQ09ERV9QUklOVEYoIlRFU1RcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiUwMnhcbiIsIHNyY3ZhbCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRlc3RfYnl0ZShkZXN0dmFsLCBzcmN2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAxIFJIPTAxIE9QPUY2XG4iKTsKLQkgICAgSEFMVF9TWVMoKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJOT1RcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBub3RfYnl0ZShkZXN0dmFsKTsKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIk5FR1x0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IG5lZ19ieXRlKGRlc3R2YWwpOwotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URigiTVVMXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBtdWxfYnl0ZShkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGKCJJTVVMXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2J5dGUoZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URigiRElWXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkaXZfYnl0ZShkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGKCJJRElWXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpZGl2X2J5dGUoZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsgICAgICAgICAgICAgICAgICAvKiBlbmQgbW9kPT0wMSAqLwotICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAvKiBtb2Q9MTAgKi8KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOiAgICAgICAgIC8qIHRlc3QgYnl0ZSBpbW0gKi8KLQkgICAgREVDT0RFX1BSSU5URigiVEVTVFx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJTAyeFxuIiwgc3JjdmFsKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdGVzdF9ieXRlKGRlc3R2YWwsIHNyY3ZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBPUCBNT0Q9MTAgUkg9MDEgT1A9RjZcbiIpOwotCSAgICBIQUxUX1NZUygpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIk5PVFx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IG5vdF9ieXRlKGRlc3R2YWwpOwotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiTkVHXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gbmVnX2J5dGUoZGVzdHZhbCk7Ci0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGKCJNVUxcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIG11bF9ieXRlKGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYoIklNVUxcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfYnl0ZShkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGKCJESVZcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRpdl9ieXRlKGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYoIklESVZcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGlkaXZfYnl0ZShkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGVuZCBtb2Q9PTEwICovCi0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIG1vZD0xMSAqLwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6ICAgICAgICAgLyogdGVzdCBieXRlIGltbSAqLwotCSAgICBERUNPREVfUFJJTlRGKCJURVNUXHQiKTsKLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJTAyeFxuIiwgc3JjdmFsKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdGVzdF9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAwIFJIPTAxIE9QPUY2XG4iKTsKLQkgICAgSEFMVF9TWVMoKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJOT1RcdCIpOwotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IG5vdF9ieXRlKCpkZXN0cmVnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJORUdcdCIpOwotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IG5lZ19ieXRlKCpkZXN0cmVnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGKCJNVUxcdCIpOwotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBtdWxfYnl0ZSgqZGVzdHJlZyk7ICAgICAgLyohISEgICovCi0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URigiSU1VTFx0Iik7Ci0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfYnl0ZSgqZGVzdHJlZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URigiRElWXHQiKTsKLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGl2X2J5dGUoKmRlc3RyZWcpOwotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYoIklESVZcdCIpOwotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpZGl2X2J5dGUoKmRlc3RyZWcpOwotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogZW5kIG1vZD09MTEgKi8KLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZjcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29wY0Y3X3dvcmRfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICAvKiBsb25nLCBkcmF3biBvdXQgY29kZSBmb2xsb3dzLiAgRG91YmxlIHN3aXRjaCBmb3IgYSB0b3RhbAotICAgICAgIG9mIDMyIGNhc2VzLiAgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgLyogbW9kPTAwICovCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDogICAgICAgICAvKiB0ZXN0IHdvcmQgaW1tICovCi0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbCxzcmN2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiVEVTVFx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkJREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQl0ZXN0X2xvbmcoZGVzdHZhbCwgc3JjdmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWwsc3JjdmFsOwotCi0JCURFQ09ERV9QUklOVEYoIlRFU1RcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkJREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQl0ZXN0X3dvcmQoZGVzdHZhbCwgc3JjdmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAwIFJIPTAxIE9QPUY3XG4iKTsKLQkgICAgSEFMVF9TWVMoKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTk9UXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IG5vdF9sb25nKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk5PVFx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IG5vdF93b3JkKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTkVHXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IG5lZ19sb25nKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk5FR1x0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IG5lZ193b3JkKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTVVMXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJbXVsX2xvbmcoZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk1VTFx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJbXVsX3dvcmQoZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiSU1VTFx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWltdWxfbG9uZyhkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiSU1VTFx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaW11bF93b3JkKGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIkRJVlx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRpdl9sb25nKGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJESVZcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRpdl93b3JkKGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIklESVZcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpZGl2X2xvbmcoZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIklESVZcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWlkaXZfd29yZChkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogZW5kIG1vZD09MDAgKi8KLSAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgLyogbW9kPTAxICovCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDogICAgICAgICAvKiB0ZXN0IHdvcmQgaW1tICovCi0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbCxzcmN2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiVEVTVFx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkJREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQl0ZXN0X2xvbmcoZGVzdHZhbCwgc3JjdmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWwsc3JjdmFsOwotCi0JCURFQ09ERV9QUklOVEYoIlRFU1RcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkJREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQl0ZXN0X3dvcmQoZGVzdHZhbCwgc3JjdmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAxIFJIPTAxIE9QPUY2XG4iKTsKLQkgICAgSEFMVF9TWVMoKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTk9UXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IG5vdF9sb25nKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk5PVFx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IG5vdF93b3JkKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTkVHXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IG5lZ19sb25nKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk5FR1x0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IG5lZ193b3JkKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTVVMXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJbXVsX2xvbmcoZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk1VTFx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJbXVsX3dvcmQoZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiSU1VTFx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWltdWxfbG9uZyhkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiSU1VTFx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaW11bF93b3JkKGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIkRJVlx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRpdl9sb25nKGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJESVZcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRpdl93b3JkKGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIklESVZcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpZGl2X2xvbmcoZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIklESVZcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWlkaXZfd29yZChkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogZW5kIG1vZD09MDEgKi8KLSAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgLyogbW9kPTEwICovCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDogICAgICAgICAvKiB0ZXN0IHdvcmQgaW1tICovCi0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbCxzcmN2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiVEVTVFx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkJREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQl0ZXN0X2xvbmcoZGVzdHZhbCwgc3JjdmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWwsc3JjdmFsOwotCi0JCURFQ09ERV9QUklOVEYoIlRFU1RcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkJREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQl0ZXN0X3dvcmQoZGVzdHZhbCwgc3JjdmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTEwIFJIPTAxIE9QPUY2XG4iKTsKLQkgICAgSEFMVF9TWVMoKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTk9UXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IG5vdF9sb25nKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk5PVFx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IG5vdF93b3JkKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTkVHXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IG5lZ19sb25nKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk5FR1x0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IG5lZ193b3JkKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiTVVMXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJbXVsX2xvbmcoZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk1VTFx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJbXVsX3dvcmQoZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiSU1VTFx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWltdWxfbG9uZyhkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiSU1VTFx0V09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaW11bF93b3JkKGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIkRJVlx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRpdl9sb25nKGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJESVZcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRpdl93b3JkKGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIklESVZcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpZGl2X2xvbmcoZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIklESVZcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWlkaXZfd29yZChkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogZW5kIG1vZD09MTAgKi8KLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogbW9kPTExICovCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDogICAgICAgICAvKiB0ZXN0IHdvcmQgaW1tICovCi0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgKmRlc3RyZWc7Ci0JCXUzMiBzcmN2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiVEVTVFx0Iik7Ci0JCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkJREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQl0ZXN0X2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiAqZGVzdHJlZzsKLQkJdTE2IHNyY3ZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJURVNUXHQiKTsKLQkJZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiLCIpOwotCQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotCQlERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXRlc3Rfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAwIFJIPTAxIE9QPUY2XG4iKTsKLQkgICAgSEFMVF9TWVMoKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyICpkZXN0cmVnOwotCi0JCURFQ09ERV9QUklOVEYoIk5PVFx0Iik7Ci0JCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCSpkZXN0cmVnID0gbm90X2xvbmcoKmRlc3RyZWcpOwotCSAgICB9IGVsc2UgewotCQl1MTYgKmRlc3RyZWc7Ci0KLQkJREVDT0RFX1BSSU5URigiTk9UXHQiKTsKLQkJZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJKmRlc3RyZWcgPSBub3Rfd29yZCgqZGVzdHJlZyk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyICpkZXN0cmVnOwotCi0JCURFQ09ERV9QUklOVEYoIk5FR1x0Iik7Ci0JCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCSpkZXN0cmVnID0gbmVnX2xvbmcoKmRlc3RyZWcpOwotCSAgICB9IGVsc2UgewotCQl1MTYgKmRlc3RyZWc7Ci0KLQkJREVDT0RFX1BSSU5URigiTkVHXHQiKTsKLQkJZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJKmRlc3RyZWcgPSBuZWdfd29yZCgqZGVzdHJlZyk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyICpkZXN0cmVnOwotCi0JCURFQ09ERV9QUklOVEYoIk1VTFx0Iik7Ci0JCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCW11bF9sb25nKCpkZXN0cmVnKTsgICAgICAvKiEhISAgKi8KLQkgICAgfSBlbHNlIHsKLQkJdTE2ICpkZXN0cmVnOwotCi0JCURFQ09ERV9QUklOVEYoIk1VTFx0Iik7Ci0JCWRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCW11bF93b3JkKCpkZXN0cmVnKTsgICAgICAvKiEhISAgKi8KLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgKmRlc3RyZWc7Ci0KLQkJREVDT0RFX1BSSU5URigiSU1VTFx0Iik7Ci0JCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWltdWxfbG9uZygqZGVzdHJlZyk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiAqZGVzdHJlZzsKLQotCQlERUNPREVfUFJJTlRGKCJJTVVMXHQiKTsKLQkJZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaW11bF93b3JkKCpkZXN0cmVnKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgKmRlc3RyZWc7Ci0KLQkJREVDT0RFX1BSSU5URigiRElWXHQiKTsKLQkJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGl2X2xvbmcoKmRlc3RyZWcpOwotCSAgICB9IGVsc2UgewotCQl1MTYgKmRlc3RyZWc7Ci0KLQkJREVDT0RFX1BSSU5URigiRElWXHQiKTsKLQkJZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGl2X3dvcmQoKmRlc3RyZWcpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiAqZGVzdHJlZzsKLQotCQlERUNPREVfUFJJTlRGKCJJRElWXHQiKTsKLQkJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaWRpdl9sb25nKCpkZXN0cmVnKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2ICpkZXN0cmVnOwotCi0JCURFQ09ERV9QUklOVEYoIklESVZcdCIpOwotCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpZGl2X3dvcmQoKmRlc3RyZWcpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsgICAgICAgICAgICAgICAgICAvKiBlbmQgbW9kPT0xMSAqLwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhmOAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY2xjKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICAvKiBjbGVhciB0aGUgY2FycnkgZmxhZy4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkNMQ1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBDTEVBUl9GTEFHKEZfQ0YpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGY5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zdGModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIC8qIHNldCB0aGUgY2FycnkgZmxhZy4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNUQ1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBTRVRfRkxBRyhGX0NGKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhmYQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY2xpKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICAvKiBjbGVhciBpbnRlcnJ1cHRzLiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQ0xJXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIENMRUFSX0ZMQUcoRl9JRik7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZmIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3N0aSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgLyogZW5hYmxlICBpbnRlcnJ1cHRzLiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU1RJXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIFNFVF9GTEFHKEZfSUYpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGZjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jbGQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIC8qIGNsZWFyIGludGVycnVwdHMuICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJDTERcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgQ0xFQVJfRkxBRyhGX0RGKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhmZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc3RkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICAvKiBjbGVhciBpbnRlcnJ1cHRzLiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU1REXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIFNFVF9GTEFHKEZfREYpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGZlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcGNGRV9ieXRlX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCByaCwgcmw7Ci0gICAgdTggZGVzdHZhbDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggKmRlc3RyZWc7Ci0KLSAgICAvKiBZZXQgYW5vdGhlciBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24uICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotI2lmZGVmIERFQlVHCi0gICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7Ci0JLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKLQkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncwotCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQotCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KLQotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYoIklOQ1x0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiREVDXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCWNhc2UgMzoKLQljYXNlIDQ6Ci0JY2FzZSA1OgotCWNhc2UgNjoKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYyKCJJTExFR0FMIE9QIE1BSk9SIE9QIDB4RkUgTUlOT1IgT1AgJXggXG4iLCBtb2QpOwotCSAgICBIQUxUX1NZUygpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDogICAgICAgICAvKiBpbmMgd29yZCBwdHIgLi4uICovCi0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBpbmNfYnl0ZShkZXN0dmFsKTsKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDE6ICAgICAgICAgLyogZGVjIHdvcmQgcHRyIC4uLiAqLwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZGVjX2J5dGUoZGVzdHZhbCk7Ci0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gaW5jX2J5dGUoZGVzdHZhbCk7Ci0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZGVjX2J5dGUoZGVzdHZhbCk7Ci0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gaW5jX2J5dGUoZGVzdHZhbCk7Ci0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZGVjX2J5dGUoZGVzdHZhbCk7Ci0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBpbmNfYnl0ZSgqZGVzdHJlZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBkZWNfYnl0ZSgqZGVzdHJlZyk7Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZmYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29wY0ZGX3dvcmRfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJoLCBybDsKLSAgICB1aW50IGRlc3RvZmZzZXQgPSAwOwotCXUxNiAqZGVzdHJlZzsKLQl1MTYgZGVzdHZhbCxkZXN0dmFsMjsKLQotICAgIC8qIFlldCBhbm90aGVyIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbi4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0jaWZkZWYgREVCVUcKLSAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKLQkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQotCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCi0JICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCi0JICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLwotCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCURFQ09ERV9QUklOVEYoIklOQ1x0RFdPUkQgUFRSICIpOwotCSAgICB9IGVsc2UgewotCQlERUNPREVfUFJJTlRGKCJJTkNcdFdPUkQgUFRSICIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCURFQ09ERV9QUklOVEYoIkRFQ1x0RFdPUkQgUFRSICIpOwotCSAgICB9IGVsc2UgewotCQlERUNPREVfUFJJTlRGKCJERUNcdFdPUkQgUFRSICIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiQ0FMTFx0ICIpOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIkNBTExcdEZBUiAiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGKCJKTVBcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYoIkpNUFx0RkFSICIpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgREVDT0RJTkcgT0YgT1BDT0RFIEZGXHQiKTsKLQkgICAgSEFMVF9TWVMoKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6ICAgICAgICAgLyogaW5jIHdvcmQgcHRyIC4uLiAqLwotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IGluY19sb25nKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBpbmNfd29yZChkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMTogICAgICAgICAvKiBkZWMgd29yZCBwdHIgLi4uICovCi0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gZGVjX2xvbmcoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IGRlY193b3JkKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAyOiAgICAgICAgIC8qIGNhbGwgd29yZCBwdHIgLi4uICovCi0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKLQkgICAgTS54ODYuUl9JUCA9IGRlc3R2YWw7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzogICAgICAgICAvKiBjYWxsIGZhciBwdHIgLi4uICovCi0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwyID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQgKyAyKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcHVzaF93b3JkKE0ueDg2LlJfQ1MpOwotCSAgICBNLng4Ni5SX0NTID0gZGVzdHZhbDI7Ci0JICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKLQkgICAgTS54ODYuUl9JUCA9IGRlc3R2YWw7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDogICAgICAgICAvKiBqbXAgd29yZCBwdHIgLi4uICovCi0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOwotCSAgICBicmVhazsKLQljYXNlIDU6ICAgICAgICAgLyogam1wIGZhciBwdHIgLi4uICovCi0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwyID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQgKyAyKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgTS54ODYuUl9JUCA9IGRlc3R2YWw7Ci0JICAgIE0ueDg2LlJfQ1MgPSBkZXN0dmFsMjsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OiAgICAgICAgIC8qICBwdXNoIHdvcmQgcHRyIC4uLiAqLwotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJcHVzaF9sb25nKGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlwdXNoX3dvcmQoZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IGluY19sb25nKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBpbmNfd29yZChkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBkZWNfbG9uZyhkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gZGVjX3dvcmQoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDI6ICAgICAgICAgLyogY2FsbCB3b3JkIHB0ciAuLi4gKi8KLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOwotCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOiAgICAgICAgIC8qIGNhbGwgZmFyIHB0ciAuLi4gKi8KLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbDIgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCArIDIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7Ci0JICAgIE0ueDg2LlJfQ1MgPSBkZXN0dmFsMjsKLQkgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOwotCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OiAgICAgICAgIC8qIGptcCB3b3JkIHB0ciAuLi4gKi8KLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgTS54ODYuUl9JUCA9IGRlc3R2YWw7Ci0JICAgIGJyZWFrOwotCWNhc2UgNTogICAgICAgICAvKiBqbXAgZmFyIHB0ciAuLi4gKi8KLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbDIgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCArIDIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKLQkgICAgTS54ODYuUl9DUyA9IGRlc3R2YWwyOwotCSAgICBicmVhazsKLQljYXNlIDY6ICAgICAgICAgLyogIHB1c2ggd29yZCBwdHIgLi4uICovCi0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlwdXNoX2xvbmcoZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXB1c2hfd29yZChkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gaW5jX2xvbmcoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IGluY193b3JkKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IGRlY19sb25nKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBkZWNfd29yZChkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMjogICAgICAgICAvKiBjYWxsIHdvcmQgcHRyIC4uLiAqLwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7Ci0JICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOwotCSAgICBicmVhazsKLQljYXNlIDM6ICAgICAgICAgLyogY2FsbCBmYXIgcHRyIC4uLiAqLwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsMiA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0ICsgMik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHB1c2hfd29yZChNLng4Ni5SX0NTKTsKLQkgICAgTS54ODYuUl9DUyA9IGRlc3R2YWwyOwotCSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7Ci0JICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOwotCSAgICBicmVhazsKLQljYXNlIDQ6ICAgICAgICAgLyogam1wIHdvcmQgcHRyIC4uLiAqLwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OiAgICAgICAgIC8qIGptcCBmYXIgcHRyIC4uLiAqLwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsMiA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0ICsgMik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOwotCSAgICBNLng4Ni5SX0NTID0gZGVzdHZhbDI7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjogICAgICAgICAvKiAgcHVzaCB3b3JkIHB0ciAuLi4gKi8KLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXB1c2hfbG9uZyhkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJcHVzaF93b3JkKGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6Ci0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiAqZGVzdHJlZzsKLQotCQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkqZGVzdHJlZyA9IGluY19sb25nKCpkZXN0cmVnKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2ICpkZXN0cmVnOwotCi0JCWRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCSpkZXN0cmVnID0gaW5jX3dvcmQoKmRlc3RyZWcpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiAqZGVzdHJlZzsKLQotCQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkqZGVzdHJlZyA9IGRlY19sb25nKCpkZXN0cmVnKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2ICpkZXN0cmVnOwotCi0JCWRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCSpkZXN0cmVnID0gZGVjX3dvcmQoKmRlc3RyZWcpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMjogICAgICAgICAvKiBjYWxsIHdvcmQgcHRyIC4uLiAqLwotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7Ci0JICAgIE0ueDg2LlJfSVAgPSAqZGVzdHJlZzsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOiAgICAgICAgIC8qIGptcCBmYXIgcHRyIC4uLiAqLwotCSAgICBERUNPREVfUFJJTlRGKCJPUEVSQVRJT04gVU5ERUZJTkVEIDBYRkYgXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgSEFMVF9TWVMoKTsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIDQ6ICAgICAgICAgLyogam1wICAuLi4gKi8KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgTS54ODYuUl9JUCA9ICh1MTYpICgqZGVzdHJlZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNTogICAgICAgICAvKiBqbXAgZmFyIHB0ciAuLi4gKi8KLQkgICAgREVDT0RFX1BSSU5URigiT1BFUkFUSU9OIFVOREVGSU5FRCAwWEZGIFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIEhBTFRfU1lTKCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiAqZGVzdHJlZzsKLQotCQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlwdXNoX2xvbmcoKmRlc3RyZWcpOwotCSAgICB9IGVsc2UgewotCQl1MTYgKmRlc3RyZWc7Ci0KLQkJZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJcHVzaF93b3JkKCpkZXN0cmVnKTsKLQkgICAgfQotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU2luZ2xlIGJ5dGUgb3BlcmF0aW9uIGNvZGUgdGFibGU6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICgqeDg2ZW11X29wdGFiWzI1Nl0pKHU4KSA9Ci17Ci0vKiAgMHgwMCAqLyB4ODZlbXVPcF9hZGRfYnl0ZV9STV9SLAotLyogIDB4MDEgKi8geDg2ZW11T3BfYWRkX3dvcmRfUk1fUiwKLS8qICAweDAyICovIHg4NmVtdU9wX2FkZF9ieXRlX1JfUk0sCi0vKiAgMHgwMyAqLyB4ODZlbXVPcF9hZGRfd29yZF9SX1JNLAotLyogIDB4MDQgKi8geDg2ZW11T3BfYWRkX2J5dGVfQUxfSU1NLAotLyogIDB4MDUgKi8geDg2ZW11T3BfYWRkX3dvcmRfQVhfSU1NLAotLyogIDB4MDYgKi8geDg2ZW11T3BfcHVzaF9FUywKLS8qICAweDA3ICovIHg4NmVtdU9wX3BvcF9FUywKLQotLyogIDB4MDggKi8geDg2ZW11T3Bfb3JfYnl0ZV9STV9SLAotLyogIDB4MDkgKi8geDg2ZW11T3Bfb3Jfd29yZF9STV9SLAotLyogIDB4MGEgKi8geDg2ZW11T3Bfb3JfYnl0ZV9SX1JNLAotLyogIDB4MGIgKi8geDg2ZW11T3Bfb3Jfd29yZF9SX1JNLAotLyogIDB4MGMgKi8geDg2ZW11T3Bfb3JfYnl0ZV9BTF9JTU0sCi0vKiAgMHgwZCAqLyB4ODZlbXVPcF9vcl93b3JkX0FYX0lNTSwKLS8qICAweDBlICovIHg4NmVtdU9wX3B1c2hfQ1MsCi0vKiAgMHgwZiAqLyB4ODZlbXVPcF90d29fYnl0ZSwKLQotLyogIDB4MTAgKi8geDg2ZW11T3BfYWRjX2J5dGVfUk1fUiwKLS8qICAweDExICovIHg4NmVtdU9wX2FkY193b3JkX1JNX1IsCi0vKiAgMHgxMiAqLyB4ODZlbXVPcF9hZGNfYnl0ZV9SX1JNLAotLyogIDB4MTMgKi8geDg2ZW11T3BfYWRjX3dvcmRfUl9STSwKLS8qICAweDE0ICovIHg4NmVtdU9wX2FkY19ieXRlX0FMX0lNTSwKLS8qICAweDE1ICovIHg4NmVtdU9wX2FkY193b3JkX0FYX0lNTSwKLS8qICAweDE2ICovIHg4NmVtdU9wX3B1c2hfU1MsCi0vKiAgMHgxNyAqLyB4ODZlbXVPcF9wb3BfU1MsCi0KLS8qICAweDE4ICovIHg4NmVtdU9wX3NiYl9ieXRlX1JNX1IsCi0vKiAgMHgxOSAqLyB4ODZlbXVPcF9zYmJfd29yZF9STV9SLAotLyogIDB4MWEgKi8geDg2ZW11T3Bfc2JiX2J5dGVfUl9STSwKLS8qICAweDFiICovIHg4NmVtdU9wX3NiYl93b3JkX1JfUk0sCi0vKiAgMHgxYyAqLyB4ODZlbXVPcF9zYmJfYnl0ZV9BTF9JTU0sCi0vKiAgMHgxZCAqLyB4ODZlbXVPcF9zYmJfd29yZF9BWF9JTU0sCi0vKiAgMHgxZSAqLyB4ODZlbXVPcF9wdXNoX0RTLAotLyogIDB4MWYgKi8geDg2ZW11T3BfcG9wX0RTLAotCi0vKiAgMHgyMCAqLyB4ODZlbXVPcF9hbmRfYnl0ZV9STV9SLAotLyogIDB4MjEgKi8geDg2ZW11T3BfYW5kX3dvcmRfUk1fUiwKLS8qICAweDIyICovIHg4NmVtdU9wX2FuZF9ieXRlX1JfUk0sCi0vKiAgMHgyMyAqLyB4ODZlbXVPcF9hbmRfd29yZF9SX1JNLAotLyogIDB4MjQgKi8geDg2ZW11T3BfYW5kX2J5dGVfQUxfSU1NLAotLyogIDB4MjUgKi8geDg2ZW11T3BfYW5kX3dvcmRfQVhfSU1NLAotLyogIDB4MjYgKi8geDg2ZW11T3Bfc2Vnb3ZyX0VTLAotLyogIDB4MjcgKi8geDg2ZW11T3BfZGFhLAotCi0vKiAgMHgyOCAqLyB4ODZlbXVPcF9zdWJfYnl0ZV9STV9SLAotLyogIDB4MjkgKi8geDg2ZW11T3Bfc3ViX3dvcmRfUk1fUiwKLS8qICAweDJhICovIHg4NmVtdU9wX3N1Yl9ieXRlX1JfUk0sCi0vKiAgMHgyYiAqLyB4ODZlbXVPcF9zdWJfd29yZF9SX1JNLAotLyogIDB4MmMgKi8geDg2ZW11T3Bfc3ViX2J5dGVfQUxfSU1NLAotLyogIDB4MmQgKi8geDg2ZW11T3Bfc3ViX3dvcmRfQVhfSU1NLAotLyogIDB4MmUgKi8geDg2ZW11T3Bfc2Vnb3ZyX0NTLAotLyogIDB4MmYgKi8geDg2ZW11T3BfZGFzLAotCi0vKiAgMHgzMCAqLyB4ODZlbXVPcF94b3JfYnl0ZV9STV9SLAotLyogIDB4MzEgKi8geDg2ZW11T3BfeG9yX3dvcmRfUk1fUiwKLS8qICAweDMyICovIHg4NmVtdU9wX3hvcl9ieXRlX1JfUk0sCi0vKiAgMHgzMyAqLyB4ODZlbXVPcF94b3Jfd29yZF9SX1JNLAotLyogIDB4MzQgKi8geDg2ZW11T3BfeG9yX2J5dGVfQUxfSU1NLAotLyogIDB4MzUgKi8geDg2ZW11T3BfeG9yX3dvcmRfQVhfSU1NLAotLyogIDB4MzYgKi8geDg2ZW11T3Bfc2Vnb3ZyX1NTLAotLyogIDB4MzcgKi8geDg2ZW11T3BfYWFhLAotCi0vKiAgMHgzOCAqLyB4ODZlbXVPcF9jbXBfYnl0ZV9STV9SLAotLyogIDB4MzkgKi8geDg2ZW11T3BfY21wX3dvcmRfUk1fUiwKLS8qICAweDNhICovIHg4NmVtdU9wX2NtcF9ieXRlX1JfUk0sCi0vKiAgMHgzYiAqLyB4ODZlbXVPcF9jbXBfd29yZF9SX1JNLAotLyogIDB4M2MgKi8geDg2ZW11T3BfY21wX2J5dGVfQUxfSU1NLAotLyogIDB4M2QgKi8geDg2ZW11T3BfY21wX3dvcmRfQVhfSU1NLAotLyogIDB4M2UgKi8geDg2ZW11T3Bfc2Vnb3ZyX0RTLAotLyogIDB4M2YgKi8geDg2ZW11T3BfYWFzLAotCi0vKiAgMHg0MCAqLyB4ODZlbXVPcF9pbmNfQVgsCi0vKiAgMHg0MSAqLyB4ODZlbXVPcF9pbmNfQ1gsCi0vKiAgMHg0MiAqLyB4ODZlbXVPcF9pbmNfRFgsCi0vKiAgMHg0MyAqLyB4ODZlbXVPcF9pbmNfQlgsCi0vKiAgMHg0NCAqLyB4ODZlbXVPcF9pbmNfU1AsCi0vKiAgMHg0NSAqLyB4ODZlbXVPcF9pbmNfQlAsCi0vKiAgMHg0NiAqLyB4ODZlbXVPcF9pbmNfU0ksCi0vKiAgMHg0NyAqLyB4ODZlbXVPcF9pbmNfREksCi0KLS8qICAweDQ4ICovIHg4NmVtdU9wX2RlY19BWCwKLS8qICAweDQ5ICovIHg4NmVtdU9wX2RlY19DWCwKLS8qICAweDRhICovIHg4NmVtdU9wX2RlY19EWCwKLS8qICAweDRiICovIHg4NmVtdU9wX2RlY19CWCwKLS8qICAweDRjICovIHg4NmVtdU9wX2RlY19TUCwKLS8qICAweDRkICovIHg4NmVtdU9wX2RlY19CUCwKLS8qICAweDRlICovIHg4NmVtdU9wX2RlY19TSSwKLS8qICAweDRmICovIHg4NmVtdU9wX2RlY19ESSwKLQotLyogIDB4NTAgKi8geDg2ZW11T3BfcHVzaF9BWCwKLS8qICAweDUxICovIHg4NmVtdU9wX3B1c2hfQ1gsCi0vKiAgMHg1MiAqLyB4ODZlbXVPcF9wdXNoX0RYLAotLyogIDB4NTMgKi8geDg2ZW11T3BfcHVzaF9CWCwKLS8qICAweDU0ICovIHg4NmVtdU9wX3B1c2hfU1AsCi0vKiAgMHg1NSAqLyB4ODZlbXVPcF9wdXNoX0JQLAotLyogIDB4NTYgKi8geDg2ZW11T3BfcHVzaF9TSSwKLS8qICAweDU3ICovIHg4NmVtdU9wX3B1c2hfREksCi0KLS8qICAweDU4ICovIHg4NmVtdU9wX3BvcF9BWCwKLS8qICAweDU5ICovIHg4NmVtdU9wX3BvcF9DWCwKLS8qICAweDVhICovIHg4NmVtdU9wX3BvcF9EWCwKLS8qICAweDViICovIHg4NmVtdU9wX3BvcF9CWCwKLS8qICAweDVjICovIHg4NmVtdU9wX3BvcF9TUCwKLS8qICAweDVkICovIHg4NmVtdU9wX3BvcF9CUCwKLS8qICAweDVlICovIHg4NmVtdU9wX3BvcF9TSSwKLS8qICAweDVmICovIHg4NmVtdU9wX3BvcF9ESSwKLQotLyogIDB4NjAgKi8geDg2ZW11T3BfcHVzaF9hbGwsCi0vKiAgMHg2MSAqLyB4ODZlbXVPcF9wb3BfYWxsLAotLyogIDB4NjIgKi8geDg2ZW11T3BfaWxsZWdhbF9vcCwgICAvKiBib3VuZCAqLwotLyogIDB4NjMgKi8geDg2ZW11T3BfaWxsZWdhbF9vcCwgICAvKiBhcnBsICovCi0vKiAgMHg2NCAqLyB4ODZlbXVPcF9zZWdvdnJfRlMsCi0vKiAgMHg2NSAqLyB4ODZlbXVPcF9zZWdvdnJfR1MsCi0vKiAgMHg2NiAqLyB4ODZlbXVPcF9wcmVmaXhfZGF0YSwKLS8qICAweDY3ICovIHg4NmVtdU9wX3ByZWZpeF9hZGRyLAotCi0vKiAgMHg2OCAqLyB4ODZlbXVPcF9wdXNoX3dvcmRfSU1NLAotLyogIDB4NjkgKi8geDg2ZW11T3BfaW11bF93b3JkX0lNTSwKLS8qICAweDZhICovIHg4NmVtdU9wX3B1c2hfYnl0ZV9JTU0sCi0vKiAgMHg2YiAqLyB4ODZlbXVPcF9pbXVsX2J5dGVfSU1NLAotLyogIDB4NmMgKi8geDg2ZW11T3BfaW5zX2J5dGUsCi0vKiAgMHg2ZCAqLyB4ODZlbXVPcF9pbnNfd29yZCwKLS8qICAweDZlICovIHg4NmVtdU9wX291dHNfYnl0ZSwKLS8qICAweDZmICovIHg4NmVtdU9wX291dHNfd29yZCwKLQotLyogIDB4NzAgKi8geDg2ZW11T3BfanVtcF9uZWFyX08sCi0vKiAgMHg3MSAqLyB4ODZlbXVPcF9qdW1wX25lYXJfTk8sCi0vKiAgMHg3MiAqLyB4ODZlbXVPcF9qdW1wX25lYXJfQiwKLS8qICAweDczICovIHg4NmVtdU9wX2p1bXBfbmVhcl9OQiwKLS8qICAweDc0ICovIHg4NmVtdU9wX2p1bXBfbmVhcl9aLAotLyogIDB4NzUgKi8geDg2ZW11T3BfanVtcF9uZWFyX05aLAotLyogIDB4NzYgKi8geDg2ZW11T3BfanVtcF9uZWFyX0JFLAotLyogIDB4NzcgKi8geDg2ZW11T3BfanVtcF9uZWFyX05CRSwKLQotLyogIDB4NzggKi8geDg2ZW11T3BfanVtcF9uZWFyX1MsCi0vKiAgMHg3OSAqLyB4ODZlbXVPcF9qdW1wX25lYXJfTlMsCi0vKiAgMHg3YSAqLyB4ODZlbXVPcF9qdW1wX25lYXJfUCwKLS8qICAweDdiICovIHg4NmVtdU9wX2p1bXBfbmVhcl9OUCwKLS8qICAweDdjICovIHg4NmVtdU9wX2p1bXBfbmVhcl9MLAotLyogIDB4N2QgKi8geDg2ZW11T3BfanVtcF9uZWFyX05MLAotLyogIDB4N2UgKi8geDg2ZW11T3BfanVtcF9uZWFyX0xFLAotLyogIDB4N2YgKi8geDg2ZW11T3BfanVtcF9uZWFyX05MRSwKLQotLyogIDB4ODAgKi8geDg2ZW11T3Bfb3BjODBfYnl0ZV9STV9JTU0sCi0vKiAgMHg4MSAqLyB4ODZlbXVPcF9vcGM4MV93b3JkX1JNX0lNTSwKLS8qICAweDgyICovIHg4NmVtdU9wX29wYzgyX2J5dGVfUk1fSU1NLAotLyogIDB4ODMgKi8geDg2ZW11T3Bfb3BjODNfd29yZF9STV9JTU0sCi0vKiAgMHg4NCAqLyB4ODZlbXVPcF90ZXN0X2J5dGVfUk1fUiwKLS8qICAweDg1ICovIHg4NmVtdU9wX3Rlc3Rfd29yZF9STV9SLAotLyogIDB4ODYgKi8geDg2ZW11T3BfeGNoZ19ieXRlX1JNX1IsCi0vKiAgMHg4NyAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfUk1fUiwKLQotLyogIDB4ODggKi8geDg2ZW11T3BfbW92X2J5dGVfUk1fUiwKLS8qICAweDg5ICovIHg4NmVtdU9wX21vdl93b3JkX1JNX1IsCi0vKiAgMHg4YSAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9SX1JNLAotLyogIDB4OGIgKi8geDg2ZW11T3BfbW92X3dvcmRfUl9STSwKLS8qICAweDhjICovIHg4NmVtdU9wX21vdl93b3JkX1JNX1NSLAotLyogIDB4OGQgKi8geDg2ZW11T3BfbGVhX3dvcmRfUl9NLAotLyogIDB4OGUgKi8geDg2ZW11T3BfbW92X3dvcmRfU1JfUk0sCi0vKiAgMHg4ZiAqLyB4ODZlbXVPcF9wb3BfUk0sCi0KLS8qICAweDkwICovIHg4NmVtdU9wX25vcCwKLS8qICAweDkxICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9DWCwKLS8qICAweDkyICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9EWCwKLS8qICAweDkzICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9CWCwKLS8qICAweDk0ICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9TUCwKLS8qICAweDk1ICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9CUCwKLS8qICAweDk2ICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9TSSwKLS8qICAweDk3ICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9ESSwKLQotLyogIDB4OTggKi8geDg2ZW11T3BfY2J3LAotLyogIDB4OTkgKi8geDg2ZW11T3BfY3dkLAotLyogIDB4OWEgKi8geDg2ZW11T3BfY2FsbF9mYXJfSU1NLAotLyogIDB4OWIgKi8geDg2ZW11T3Bfd2FpdCwKLS8qICAweDljICovIHg4NmVtdU9wX3B1c2hmX3dvcmQsCi0vKiAgMHg5ZCAqLyB4ODZlbXVPcF9wb3BmX3dvcmQsCi0vKiAgMHg5ZSAqLyB4ODZlbXVPcF9zYWhmLAotLyogIDB4OWYgKi8geDg2ZW11T3BfbGFoZiwKLQotLyogIDB4YTAgKi8geDg2ZW11T3BfbW92X0FMX01fSU1NLAotLyogIDB4YTEgKi8geDg2ZW11T3BfbW92X0FYX01fSU1NLAotLyogIDB4YTIgKi8geDg2ZW11T3BfbW92X01fQUxfSU1NLAotLyogIDB4YTMgKi8geDg2ZW11T3BfbW92X01fQVhfSU1NLAotLyogIDB4YTQgKi8geDg2ZW11T3BfbW92c19ieXRlLAotLyogIDB4YTUgKi8geDg2ZW11T3BfbW92c193b3JkLAotLyogIDB4YTYgKi8geDg2ZW11T3BfY21wc19ieXRlLAotLyogIDB4YTcgKi8geDg2ZW11T3BfY21wc193b3JkLAotLyogIDB4YTggKi8geDg2ZW11T3BfdGVzdF9BTF9JTU0sCi0vKiAgMHhhOSAqLyB4ODZlbXVPcF90ZXN0X0FYX0lNTSwKLS8qICAweGFhICovIHg4NmVtdU9wX3N0b3NfYnl0ZSwKLS8qICAweGFiICovIHg4NmVtdU9wX3N0b3Nfd29yZCwKLS8qICAweGFjICovIHg4NmVtdU9wX2xvZHNfYnl0ZSwKLS8qICAweGFkICovIHg4NmVtdU9wX2xvZHNfd29yZCwKLS8qICAweGFjICovIHg4NmVtdU9wX3NjYXNfYnl0ZSwKLS8qICAweGFkICovIHg4NmVtdU9wX3NjYXNfd29yZCwKLQotCi0vKiAgMHhiMCAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9BTF9JTU0sCi0vKiAgMHhiMSAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9DTF9JTU0sCi0vKiAgMHhiMiAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9ETF9JTU0sCi0vKiAgMHhiMyAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9CTF9JTU0sCi0vKiAgMHhiNCAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9BSF9JTU0sCi0vKiAgMHhiNSAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9DSF9JTU0sCi0vKiAgMHhiNiAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9ESF9JTU0sCi0vKiAgMHhiNyAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9CSF9JTU0sCi0KLS8qICAweGI4ICovIHg4NmVtdU9wX21vdl93b3JkX0FYX0lNTSwKLS8qICAweGI5ICovIHg4NmVtdU9wX21vdl93b3JkX0NYX0lNTSwKLS8qICAweGJhICovIHg4NmVtdU9wX21vdl93b3JkX0RYX0lNTSwKLS8qICAweGJiICovIHg4NmVtdU9wX21vdl93b3JkX0JYX0lNTSwKLS8qICAweGJjICovIHg4NmVtdU9wX21vdl93b3JkX1NQX0lNTSwKLS8qICAweGJkICovIHg4NmVtdU9wX21vdl93b3JkX0JQX0lNTSwKLS8qICAweGJlICovIHg4NmVtdU9wX21vdl93b3JkX1NJX0lNTSwKLS8qICAweGJmICovIHg4NmVtdU9wX21vdl93b3JkX0RJX0lNTSwKLQotLyogIDB4YzAgKi8geDg2ZW11T3Bfb3BjQzBfYnl0ZV9STV9NRU0sCi0vKiAgMHhjMSAqLyB4ODZlbXVPcF9vcGNDMV93b3JkX1JNX01FTSwKLS8qICAweGMyICovIHg4NmVtdU9wX3JldF9uZWFyX0lNTSwKLS8qICAweGMzICovIHg4NmVtdU9wX3JldF9uZWFyLAotLyogIDB4YzQgKi8geDg2ZW11T3BfbGVzX1JfSU1NLAotLyogIDB4YzUgKi8geDg2ZW11T3BfbGRzX1JfSU1NLAotLyogIDB4YzYgKi8geDg2ZW11T3BfbW92X2J5dGVfUk1fSU1NLAotLyogIDB4YzcgKi8geDg2ZW11T3BfbW92X3dvcmRfUk1fSU1NLAotLyogIDB4YzggKi8geDg2ZW11T3BfZW50ZXIsCi0vKiAgMHhjOSAqLyB4ODZlbXVPcF9sZWF2ZSwKLS8qICAweGNhICovIHg4NmVtdU9wX3JldF9mYXJfSU1NLAotLyogIDB4Y2IgKi8geDg2ZW11T3BfcmV0X2ZhciwKLS8qICAweGNjICovIHg4NmVtdU9wX2ludDMsCi0vKiAgMHhjZCAqLyB4ODZlbXVPcF9pbnRfSU1NLAotLyogIDB4Y2UgKi8geDg2ZW11T3BfaW50bywKLS8qICAweGNmICovIHg4NmVtdU9wX2lyZXQsCi0KLS8qICAweGQwICovIHg4NmVtdU9wX29wY0QwX2J5dGVfUk1fMSwKLS8qICAweGQxICovIHg4NmVtdU9wX29wY0QxX3dvcmRfUk1fMSwKLS8qICAweGQyICovIHg4NmVtdU9wX29wY0QyX2J5dGVfUk1fQ0wsCi0vKiAgMHhkMyAqLyB4ODZlbXVPcF9vcGNEM193b3JkX1JNX0NMLAotLyogIDB4ZDQgKi8geDg2ZW11T3BfYWFtLAotLyogIDB4ZDUgKi8geDg2ZW11T3BfYWFkLAotLyogIDB4ZDYgKi8geDg2ZW11T3BfaWxsZWdhbF9vcCwgICAvKiBVbmRvY3VtZW50ZWQgU0VUQUxDIGluc3RydWN0aW9uICovCi0vKiAgMHhkNyAqLyB4ODZlbXVPcF94bGF0LAotLyogIDB4ZDggKi8geDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kOCwKLS8qICAweGQ5ICovIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZDksCi0vKiAgMHhkYSAqLyB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RhLAotLyogIDB4ZGIgKi8geDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kYiwKLS8qICAweGRjICovIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGMsCi0vKiAgMHhkZCAqLyB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RkLAotLyogIDB4ZGUgKi8geDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZSwKLS8qICAweGRmICovIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGYsCi0KLS8qICAweGUwICovIHg4NmVtdU9wX2xvb3BuZSwKLS8qICAweGUxICovIHg4NmVtdU9wX2xvb3BlLAotLyogIDB4ZTIgKi8geDg2ZW11T3BfbG9vcCwKLS8qICAweGUzICovIHg4NmVtdU9wX2pjeHosCi0vKiAgMHhlNCAqLyB4ODZlbXVPcF9pbl9ieXRlX0FMX0lNTSwKLS8qICAweGU1ICovIHg4NmVtdU9wX2luX3dvcmRfQVhfSU1NLAotLyogIDB4ZTYgKi8geDg2ZW11T3Bfb3V0X2J5dGVfSU1NX0FMLAotLyogIDB4ZTcgKi8geDg2ZW11T3Bfb3V0X3dvcmRfSU1NX0FYLAotCi0vKiAgMHhlOCAqLyB4ODZlbXVPcF9jYWxsX25lYXJfSU1NLAotLyogIDB4ZTkgKi8geDg2ZW11T3BfanVtcF9uZWFyX0lNTSwKLS8qICAweGVhICovIHg4NmVtdU9wX2p1bXBfZmFyX0lNTSwKLS8qICAweGViICovIHg4NmVtdU9wX2p1bXBfYnl0ZV9JTU0sCi0vKiAgMHhlYyAqLyB4ODZlbXVPcF9pbl9ieXRlX0FMX0RYLAotLyogIDB4ZWQgKi8geDg2ZW11T3BfaW5fd29yZF9BWF9EWCwKLS8qICAweGVlICovIHg4NmVtdU9wX291dF9ieXRlX0RYX0FMLAotLyogIDB4ZWYgKi8geDg2ZW11T3Bfb3V0X3dvcmRfRFhfQVgsCi0KLS8qICAweGYwICovIHg4NmVtdU9wX2xvY2ssCi0vKiAgMHhmMSAqLyB4ODZlbXVPcF9pbGxlZ2FsX29wLAotLyogIDB4ZjIgKi8geDg2ZW11T3BfcmVwbmUsCi0vKiAgMHhmMyAqLyB4ODZlbXVPcF9yZXBlLAotLyogIDB4ZjQgKi8geDg2ZW11T3BfaGFsdCwKLS8qICAweGY1ICovIHg4NmVtdU9wX2NtYywKLS8qICAweGY2ICovIHg4NmVtdU9wX29wY0Y2X2J5dGVfUk0sCi0vKiAgMHhmNyAqLyB4ODZlbXVPcF9vcGNGN193b3JkX1JNLAotCi0vKiAgMHhmOCAqLyB4ODZlbXVPcF9jbGMsCi0vKiAgMHhmOSAqLyB4ODZlbXVPcF9zdGMsCi0vKiAgMHhmYSAqLyB4ODZlbXVPcF9jbGksCi0vKiAgMHhmYiAqLyB4ODZlbXVPcF9zdGksCi0vKiAgMHhmYyAqLyB4ODZlbXVPcF9jbGQsCi0vKiAgMHhmZCAqLyB4ODZlbXVPcF9zdGQsCi0vKiAgMHhmZSAqLyB4ODZlbXVPcF9vcGNGRV9ieXRlX1JNLAotLyogIDB4ZmYgKi8geDg2ZW11T3Bfb3BjRkZfd29yZF9STSwKLX07Ci0KLXZvaWQgdGFibGVzX3JlbG9jYXRlKHVuc2lnbmVkIGludCBvZmZzZXQpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpPTA7IGk8ODsgaSsrKQotICAgIHsKLQlvcGM4MF9ieXRlX29wZXJhdGlvbltpXSAtPSBvZmZzZXQ7Ci0Jb3BjODFfd29yZF9vcGVyYXRpb25baV0gLT0gb2Zmc2V0OwotCW9wYzgxX2xvbmdfb3BlcmF0aW9uW2ldIC09IG9mZnNldDsKLQotCW9wYzgyX2J5dGVfb3BlcmF0aW9uW2ldIC09IG9mZnNldDsKLQlvcGM4M193b3JkX29wZXJhdGlvbltpXSAtPSBvZmZzZXQ7Ci0Jb3BjODNfbG9uZ19vcGVyYXRpb25baV0gLT0gb2Zmc2V0OwotCi0Jb3BjRDBfYnl0ZV9vcGVyYXRpb25baV0gLT0gb2Zmc2V0OwotCW9wY0QxX3dvcmRfb3BlcmF0aW9uW2ldIC09IG9mZnNldDsKLQlvcGNEMV9sb25nX29wZXJhdGlvbltpXSAtPSBvZmZzZXQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L29wczIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9vcHMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODEzMDcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L29wczIuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOgkJQU5TSSBDCi0qIEVudmlyb25tZW50OglBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgaW5jbHVkZXMgc3Vicm91dGluZXMgdG8gaW1wbGVtZW50IHRoZSBkZWNvZGluZwotKiAgICAgICAgICAgICAgIGFuZCBlbXVsYXRpb24gb2YgYWxsIHRoZSB4ODYgZXh0ZW5kZWQgdHdvLWJ5dGUgcHJvY2Vzc29yCi0qICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIng4NmVtdS94ODZlbXVpLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotb3AxIC0gSW5zdHJ1Y3Rpb24gb3AgY29kZQotCi1SRU1BUktTOgotSGFuZGxlcyBpbGxlZ2FsIG9wY29kZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfaWxsZWdhbF9vcCgKLQl1OCBvcDIpCi17Ci0JU1RBUlRfT0ZfSU5TVFIoKTsKLQlERUNPREVfUFJJTlRGKCJJTExFR0FMIEVYVEVOREVEIFg4NiBPUENPREVcbiIpOwotCVRSQUNFX1JFR1MoKTsKLQlwcmludGsoIiUwNHg6JTA0eDogJTAyWCBJTExFR0FMIEVYVEVOREVEIFg4NiBPUENPREUhXG4iLAotCQlNLng4Ni5SX0NTLCBNLng4Ni5SX0lQLTIsb3AyKTsKLSAgICBIQUxUX1NZUygpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0jZGVmaW5lIHhvcmwoYSxiKSAgICgoYSkgJiYgIShiKSkgfHwgKCEoYSkgJiYgKGIpKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHg4MC0weDhGCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfbG9uZ19qdW1wKHU4IG9wMikKLXsKLSAgICBzMzIgdGFyZ2V0OwotICAgIGNoYXIgKm5hbWUgPSAwOwotICAgIGludCBjb25kID0gMDsKLQotICAgIC8qIGNvbmRpdGlvbmFsIGp1bXAgdG8gd29yZCBvZmZzZXQuICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBzd2l0Y2ggKG9wMikgewotICAgICAgY2FzZSAweDgwOgotCW5hbWUgPSAiSk9cdCI7Ci0JY29uZCA9ICBBQ0NFU1NfRkxBRyhGX09GKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg4MToKLQluYW1lID0gIkpOT1x0IjsKLQljb25kID0gIUFDQ0VTU19GTEFHKEZfT0YpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDgyOgotCW5hbWUgPSAiSkJcdCI7Ci0JY29uZCA9IEFDQ0VTU19GTEFHKEZfQ0YpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDgzOgotCW5hbWUgPSAiSk5CXHQiOwotCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9DRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4ODQ6Ci0JbmFtZSA9ICJKWlx0IjsKLQljb25kID0gQUNDRVNTX0ZMQUcoRl9aRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4ODU6Ci0JbmFtZSA9ICJKTlpcdCI7Ci0JY29uZCA9ICFBQ0NFU1NfRkxBRyhGX1pGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg4NjoKLQluYW1lID0gIkpCRVx0IjsKLQljb25kID0gQUNDRVNTX0ZMQUcoRl9DRikgfHwgQUNDRVNTX0ZMQUcoRl9aRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4ODc6Ci0JbmFtZSA9ICJKTkJFXHQiOwotCWNvbmQgPSAhKEFDQ0VTU19GTEFHKEZfQ0YpIHx8IEFDQ0VTU19GTEFHKEZfWkYpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg4ODoKLQluYW1lID0gIkpTXHQiOwotCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX1NGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg4OToKLQluYW1lID0gIkpOU1x0IjsKLQljb25kID0gIUFDQ0VTU19GTEFHKEZfU0YpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDhhOgotCW5hbWUgPSAiSlBcdCI7Ci0JY29uZCA9IEFDQ0VTU19GTEFHKEZfUEYpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDhiOgotCW5hbWUgPSAiSk5QXHQiOwotCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9QRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OGM6Ci0JbmFtZSA9ICJKTFx0IjsKLQljb25kID0geG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDhkOgotCW5hbWUgPSAiSk5MXHQiOwotCWNvbmQgPSB4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OGU6Ci0JbmFtZSA9ICJKTEVcdCI7Ci0JY29uZCA9ICh4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSkgfHwKLQkJQUNDRVNTX0ZMQUcoRl9aRikpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDhmOgotCW5hbWUgPSAiSk5MRVx0IjsKLQljb25kID0gISh4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSkgfHwKLQkJIEFDQ0VTU19GTEFHKEZfWkYpKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URihuYW1lKTsKLSAgICB0YXJnZXQgPSAoczE2KSBmZXRjaF93b3JkX2ltbSgpOwotICAgIHRhcmdldCArPSAoczE2KSBNLng4Ni5SX0lQOwotICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKGNvbmQpCi0JTS54ODYuUl9JUCA9ICh1MTYpdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4OTAtMHg5RgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX3NldF9ieXRlKHU4IG9wMikKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4ICAqZGVzdHJlZzsKLSAgICBjaGFyICpuYW1lID0gMDsKLSAgICBpbnQgY29uZCA9IDA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIHN3aXRjaCAob3AyKSB7Ci0gICAgICBjYXNlIDB4OTA6Ci0JbmFtZSA9ICJTRVRPXHQiOwotCWNvbmQgPSAgQUNDRVNTX0ZMQUcoRl9PRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OTE6Ci0JbmFtZSA9ICJTRVROT1x0IjsKLQljb25kID0gIUFDQ0VTU19GTEFHKEZfT0YpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDkyOgotCW5hbWUgPSAiU0VUQlx0IjsKLQljb25kID0gQUNDRVNTX0ZMQUcoRl9DRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OTM6Ci0JbmFtZSA9ICJTRVROQlx0IjsKLQljb25kID0gIUFDQ0VTU19GTEFHKEZfQ0YpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDk0OgotCW5hbWUgPSAiU0VUWlx0IjsKLQljb25kID0gQUNDRVNTX0ZMQUcoRl9aRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OTU6Ci0JbmFtZSA9ICJTRVROWlx0IjsKLQljb25kID0gIUFDQ0VTU19GTEFHKEZfWkYpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDk2OgotCW5hbWUgPSAiU0VUQkVcdCI7Ci0JY29uZCA9IEFDQ0VTU19GTEFHKEZfQ0YpIHx8IEFDQ0VTU19GTEFHKEZfWkYpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDk3OgotCW5hbWUgPSAiU0VUTkJFXHQiOwotCWNvbmQgPSAhKEFDQ0VTU19GTEFHKEZfQ0YpIHx8IEFDQ0VTU19GTEFHKEZfWkYpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5ODoKLQluYW1lID0gIlNFVFNcdCI7Ci0JY29uZCA9IEFDQ0VTU19GTEFHKEZfU0YpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDk5OgotCW5hbWUgPSAiU0VUTlNcdCI7Ci0JY29uZCA9ICFBQ0NFU1NfRkxBRyhGX1NGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5YToKLQluYW1lID0gIlNFVFBcdCI7Ci0JY29uZCA9IEFDQ0VTU19GTEFHKEZfUEYpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDliOgotCW5hbWUgPSAiU0VUTlBcdCI7Ci0JY29uZCA9ICFBQ0NFU1NfRkxBRyhGX1BGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5YzoKLQluYW1lID0gIlNFVExcdCI7Ci0JY29uZCA9IHhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5ZDoKLQluYW1lID0gIlNFVE5MXHQiOwotCWNvbmQgPSB4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OWU6Ci0JbmFtZSA9ICJTRVRMRVx0IjsKLQljb25kID0gKHhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKSB8fAotCQlBQ0NFU1NfRkxBRyhGX1pGKSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OWY6Ci0JbmFtZSA9ICJTRVROTEVcdCI7Ci0JY29uZCA9ICEoeG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpIHx8Ci0JCSBBQ0NFU1NfRkxBRyhGX1pGKSk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYobmFtZSk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgY29uZCA/IDB4MDEgOiAweDAwKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGNvbmQgPyAweDAxIDogMHgwMCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBjb25kID8gMHgwMSA6IDB4MDApOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGNvbmQgPyAweDAxIDogMHgwMDsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX3B1c2hfRlModTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUFVTSFx0RlNcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgcHVzaF93b3JkKE0ueDg2LlJfRlMpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YTEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9wb3BfRlModTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUE9QXHRGU1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0ZTID0gcG9wX3dvcmQoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGEzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfYnRfUih1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIGludCBiaXQsZGlzcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQlRcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWw7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiAoMHgxIDw8IGJpdCksRl9DRik7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbDsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgKDB4MSA8PCBiaXQpLEZfQ0YpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWw7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiAoMHgxIDw8IGJpdCksRl9DRik7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbDsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgKDB4MSA8PCBiaXQpLEZfQ0YpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWw7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiAoMHgxIDw8IGJpdCksRl9DRik7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbDsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgKDB4MSA8PCBiaXQpLEZfQ0YpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpzcmNyZWcsKnNoaWZ0cmVnOwotCi0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmICgweDEgPDwgYml0KSxGX0NGKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKnNyY3JlZywqc2hpZnRyZWc7Ci0KLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiAoMHgxIDw8IGJpdCksRl9DRik7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGE0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfc2hsZF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0JdTggc2hpZnQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNITERcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hsZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hsZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hsZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hsZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hsZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hsZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzaGlmdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2hsZF9sb25nKCpkZXN0cmVnLCpzaGlmdHJlZyxzaGlmdCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzaGlmdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2hsZF93b3JkKCpkZXN0cmVnLCpzaGlmdHJlZyxzaGlmdCk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGE1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfc2hsZF9DTCh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU0hMRFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hsZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hsZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hsZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hsZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hsZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hsZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2hsZF9sb25nKCpkZXN0cmVnLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2hsZF93b3JkKCpkZXN0cmVnLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YTgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9wdXNoX0dTKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdEdTXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIHB1c2hfd29yZChNLng4Ni5SX0dTKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGE5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfcG9wX0dTKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlBPUFx0R1NcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9HUyA9IHBvcF93b3JkKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhYQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX2J0c19SKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgaW50IGJpdCxkaXNwOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJCVFNcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWwsbWFzazsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDU7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCk7Ci0JICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCwgc3JjdmFsIHwgbWFzayk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbCxtYXNrOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOwotCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCB8IG1hc2spOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWwsbWFzazsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDU7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCk7Ci0JICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCwgc3JjdmFsIHwgbWFzayk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbCxtYXNrOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOwotCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCB8IG1hc2spOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWwsbWFzazsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDU7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCk7Ci0JICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCwgc3JjdmFsIHwgbWFzayk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbCxtYXNrOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JCQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkJCWRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OwotCQkJc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKLQkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCB8IG1hc2spOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJCXUzMiAqc3JjcmVnLCpzaGlmdHJlZzsKLQkJCXUzMiBtYXNrOwotCi0JCQlzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCQlzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkJCVRSQUNFX0FORF9TVEVQKCk7Ci0JCQliaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCQkJbWFzayA9ICgweDEgPDwgYml0KTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOwotCQkJKnNyY3JlZyB8PSBtYXNrOwotCQl9IGVsc2UgewotCQkJdTE2ICpzcmNyZWcsKnNoaWZ0cmVnOwotCQkJdTE2IG1hc2s7Ci0KLQkJCXNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkJCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7Ci0JICAgICpzcmNyZWcgfD0gbWFzazsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YWMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9zaHJkX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQl1OCBzaGlmdDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU0hMRFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaHJkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaHJkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaHJkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaHJkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaHJkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaHJkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzaHJkX2xvbmcoKmRlc3RyZWcsKnNoaWZ0cmVnLHNoaWZ0KTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzaHJkX3dvcmQoKmRlc3RyZWcsKnNoaWZ0cmVnLHNoaWZ0KTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9zaHJkX0NMKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTSExEXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaHJkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaHJkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaHJkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaHJkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaHJkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwgPSBzaHJkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzaHJkX2xvbmcoKmRlc3RyZWcsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzaHJkX3dvcmQoKmRlc3RyZWcsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX2ltdWxfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJJTVVMXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0JICAgIHUzMiByZXNfbG8scmVzX2hpOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKSpkZXN0cmVnLChzMzIpc3JjdmFsKTsKLQkgICAgaWYgKHJlc19oaSAhPSAwKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQkgICAgdTMyIHJlczsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcmVzID0gKHMxNikqZGVzdHJlZyAqIChzMTYpc3JjdmFsOwotCSAgICBpZiAocmVzID4gMHhGRkZGKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQkgICAgdTMyIHJlc19sbyxyZXNfaGk7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpKmRlc3RyZWcsKHMzMilzcmN2YWwpOwotCSAgICBpZiAocmVzX2hpICE9IDApIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCSAgICB1MzIgcmVzOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICByZXMgPSAoczE2KSpkZXN0cmVnICogKHMxNilzcmN2YWw7Ci0JICAgIGlmIChyZXMgPiAweEZGRkYpIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUxNilyZXM7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCSAgICB1MzIgcmVzX2xvLHJlc19oaTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMikqZGVzdHJlZywoczMyKXNyY3ZhbCk7Ci0JICAgIGlmIChyZXNfaGkgIT0gMCkgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0JICAgIHUzMiByZXM7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHJlcyA9IChzMTYpKmRlc3RyZWcgKiAoczE2KXNyY3ZhbDsKLQkgICAgaWYgKHJlcyA+IDB4RkZGRikgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCSAgICB1MzIgcmVzX2xvLHJlc19oaTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMikqZGVzdHJlZywoczMyKSpzcmNyZWcpOwotCSAgICBpZiAocmVzX2hpICE9IDApIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0JICAgIHUzMiByZXM7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIHJlcyA9IChzMTYpKmRlc3RyZWcgKiAoczE2KSpzcmNyZWc7Ci0JICAgIGlmIChyZXMgPiAweEZGRkYpIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUxNilyZXM7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGIyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfbHNzX1JfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLQlpbnQgbW9kLCByaCwgcmw7Ci0gICAgdTE2ICpkc3RyZWc7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkxTU1x0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JTS54ODYuUl9TUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCU0ueDg2LlJfU1MgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlNLng4Ni5SX1NTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCS8qIFVOREVGSU5FRCEgKi8KLQlUUkFDRV9BTkRfU1RFUCgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGIzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfYnRyX1IodTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotCWludCBtb2QsIHJsLCByaDsKLQl1aW50IHNyY29mZnNldDsKLQlpbnQgYml0LGRpc3A7Ci0KLQlTVEFSVF9PRl9JTlNUUigpOwotCURFQ09ERV9QUklOVEYoIkJUUlx0Iik7Ci0JRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLQlzd2l0Y2ggKG1vZCkgewotCWNhc2UgMDoKLQkJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCQl1MzIgc3JjdmFsLG1hc2s7Ci0JCQl1MzIgKnNoaWZ0cmVnOwotCi0JCQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JCQlkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKLQkJCXNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCk7Ci0JCQltYXNrID0gKDB4MSA8PCBiaXQpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkJCXN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCwgc3JjdmFsICYgfm1hc2spOwotCQl9IGVsc2UgewotCQkJdTE2IHNyY3ZhbCxtYXNrOwotCQkJdTE2ICpzaGlmdHJlZzsKLQotCQkJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCQlzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkJCVRSQUNFX0FORF9TVEVQKCk7Ci0JCQliaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JCQlkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKLQkJCXNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7Ci0JCQltYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwLCAodTE2KShzcmN2YWwgJiB+bWFzaykpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCQl1MzIgc3JjdmFsLG1hc2s7Ci0JCQl1MzIgKnNoaWZ0cmVnOwotCi0JCQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JCQlkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKLQkJCXNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCk7Ci0JCQltYXNrID0gKDB4MSA8PCBiaXQpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkJCXN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCwgc3JjdmFsICYgfm1hc2spOwotCQl9IGVsc2UgewotCQkJdTE2IHNyY3ZhbCxtYXNrOwotCQkJdTE2ICpzaGlmdHJlZzsKLQotCQkJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCQlzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkJCVRSQUNFX0FORF9TVEVQKCk7Ci0JCQliaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JCQlkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKLQkJCXNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7Ci0JCQltYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwLCAodTE2KShzcmN2YWwgJiB+bWFzaykpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCQl1MzIgc3JjdmFsLG1hc2s7Ci0JCQl1MzIgKnNoaWZ0cmVnOwotCi0JCQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJCXNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJCWJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JCQlkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKLQkJCXNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCk7Ci0JCQltYXNrID0gKDB4MSA8PCBiaXQpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkJCXN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCwgc3JjdmFsICYgfm1hc2spOwotCQl9IGVsc2UgewotCQkJdTE2IHNyY3ZhbCxtYXNrOwotCQkJdTE2ICpzaGlmdHJlZzsKLQotCQkJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCQlzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkJCVRSQUNFX0FORF9TVEVQKCk7Ci0JCQliaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JCQlkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKLQkJCXNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7Ci0JCQltYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwLCAodTE2KShzcmN2YWwgJiB+bWFzaykpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJCXUzMiAqc3JjcmVnLCpzaGlmdHJlZzsKLQkJCXUzMiBtYXNrOwotCi0JCQlzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCQlzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkJCVRSQUNFX0FORF9TVEVQKCk7Ci0JCQliaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCQkJbWFzayA9ICgweDEgPDwgYml0KTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOwotCQkJKnNyY3JlZyAmPSB+bWFzazsKLQkJfSBlbHNlIHsKLQkJCXUxNiAqc3JjcmVnLCpzaGlmdHJlZzsKLQkJCXUxNiBtYXNrOwotCi0JCQlzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCQlzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkJCVRSQUNFX0FORF9TVEVQKCk7Ci0JCQliaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JCQltYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKLQkJCSpzcmNyZWcgJj0gfm1hc2s7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCURFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLQlFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YjQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9sZnNfUl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotCWludCBtb2QsIHJoLCBybDsKLSAgICB1MTYgKmRzdHJlZzsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTEZTXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlNLng4Ni5SX0ZTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JTS54ODYuUl9GUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCU0ueDg2LlJfRlMgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JLyogVU5ERUZJTkVEISAqLwotCVRSQUNFX0FORF9TVEVQKCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YjUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9sZ3NfUl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotCWludCBtb2QsIHJoLCBybDsKLSAgICB1MTYgKmRzdHJlZzsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTEdTXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlNLng4Ni5SX0dTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JTS54ODYuUl9HUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCU0ueDg2LlJfR1MgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JLyogVU5ERUZJTkVEISAqLwotCVRSQUNFX0FORF9TVEVQKCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YjYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9tb3Z6eF9ieXRlX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WWlhcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1OCAgKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSAqc3JjcmVnOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTggICpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gKnNyY3JlZzsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YjcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9tb3Z6eF93b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICB1MzIgKmRlc3RyZWc7Ci0gICAgdTMyIHNyY3ZhbDsKLSAgICB1MTYgKnNyY3JlZzsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WWlhcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3JjdmFsOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzcmN2YWw7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNyY3ZhbDsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gKnNyY3JlZzsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiYQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX2J0WF9JKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgaW50IGJpdDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKHJoKSB7Ci0gICAgY2FzZSAzOgotCURFQ09ERV9QUklOVEYoIkJUXHQiKTsKLQlicmVhazsKLSAgICBjYXNlIDQ6Ci0JREVDT0RFX1BSSU5URigiQlRTXHQiKTsKLQlicmVhazsKLSAgICBjYXNlIDU6Ci0JREVDT0RFX1BSSU5URigiQlRSXHQiKTsKLQlicmVhazsKLSAgICBjYXNlIDY6Ci0JREVDT0RFX1BSSU5URigiQlRDXHQiKTsKLQlicmVhazsKLSAgICBkZWZhdWx0OgotCURFQ09ERV9QUklOVEYoIklMTEVHQUwgRVhURU5ERUQgWDg2IE9QQ09ERVxuIik7Ci0JVFJBQ0VfUkVHUygpOwotCXByaW50aygiJTA0eDolMDR4OiAlMDJYJTAyWCBJTExFR0FMIEVYVEVOREVEIFg4NiBPUENPREUgRVhURU5TSU9OIVxuIiwKLQkJTS54ODYuUl9DUywgTS54ODYuUl9JUC0zLG9wMiwgKG1vZDw8Nil8KHJoPDwzKXxybCk7Ci0JSEFMVF9TWVMoKTsKLSAgICB9Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWwsIG1hc2s7Ci0JICAgIHU4IHNoaWZ0OwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gc2hpZnQgJiAweDFGOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkgICAgc3dpdGNoIChyaCkgewotCSAgICBjYXNlIDQ6Ci0JCXN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQsIHNyY3ZhbCB8IG1hc2spOwotCQlicmVhazsKLQkgICAgY2FzZSA1OgotCQlzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0LCBzcmN2YWwgJiB+bWFzayk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDY6Ci0JCXN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQsIHNyY3ZhbCBeIG1hc2spOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJYnJlYWs7Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsLCBtYXNrOwotCSAgICB1OCBzaGlmdDsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9IHNoaWZ0ICYgMHhGOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkgICAgc3dpdGNoIChyaCkgewotCSAgICBjYXNlIDQ6Ci0JCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQsIHNyY3ZhbCB8IG1hc2spOwotCQlicmVhazsKLQkgICAgY2FzZSA1OgotCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0LCBzcmN2YWwgJiB+bWFzayk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDY6Ci0JCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQsIHNyY3ZhbCBeIG1hc2spOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsLCBtYXNrOwotCSAgICB1OCBzaGlmdDsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9IHNoaWZ0ICYgMHgxRjsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JICAgIHN3aXRjaCAocmgpIHsKLQkgICAgY2FzZSA0OgotCQlzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0LCBzcmN2YWwgfCBtYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNToKLQkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsICYgfm1hc2spOwotCQlicmVhazsKLQkgICAgY2FzZSA2OgotCQlzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0LCBzcmN2YWwgXiBtYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCWJyZWFrOwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbCwgbWFzazsKLQkgICAgdTggc2hpZnQ7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSBzaGlmdCAmIDB4RjsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JICAgIHN3aXRjaCAocmgpIHsKLQkgICAgY2FzZSA0OgotCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0LCBzcmN2YWwgfCBtYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNToKLQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsICYgfm1hc2spOwotCQlicmVhazsKLQkgICAgY2FzZSA2OgotCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0LCBzcmN2YWwgXiBtYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbCwgbWFzazsKLQkgICAgdTggc2hpZnQ7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSBzaGlmdCAmIDB4MUY7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCSAgICBzd2l0Y2ggKHJoKSB7Ci0JICAgIGNhc2UgNDoKLQkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsIHwgbWFzayk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDU6Ci0JCXN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQsIHNyY3ZhbCAmIH5tYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNjoKLQkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsIF4gbWFzayk7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlicmVhazsKLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWwsIG1hc2s7Ci0JICAgIHU4IHNoaWZ0OwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gc2hpZnQgJiAweEY7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCSAgICBzd2l0Y2ggKHJoKSB7Ci0JICAgIGNhc2UgNDoKLQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsIHwgbWFzayk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDU6Ci0JCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQsIHNyY3ZhbCAmIH5tYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNjoKLQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsIF4gbWFzayk7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlicmVhazsKLQkgICAgfQotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpzcmNyZWc7Ci0JICAgIHUzMiBtYXNrOwotCSAgICB1OCBzaGlmdDsKLQotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSBzaGlmdCAmIDB4MUY7Ci0JICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOwotCSAgICBzd2l0Y2ggKHJoKSB7Ci0JICAgIGNhc2UgNDoKLQkJKnNyY3JlZyB8PSBtYXNrOwotCQlicmVhazsKLQkgICAgY2FzZSA1OgotCQkqc3JjcmVnICY9IH5tYXNrOwotCQlicmVhazsKLQkgICAgY2FzZSA2OgotCQkqc3JjcmVnIF49IG1hc2s7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlicmVhazsKLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgIHUxNiAqc3JjcmVnOwotCSAgICB1MTYgbWFzazsKLQkgICAgdTggc2hpZnQ7Ci0KLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gc2hpZnQgJiAweEY7Ci0JICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOwotCSAgICBzd2l0Y2ggKHJoKSB7Ci0JICAgIGNhc2UgNDoKLQkJKnNyY3JlZyB8PSBtYXNrOwotCQlicmVhazsKLQkgICAgY2FzZSA1OgotCQkqc3JjcmVnICY9IH5tYXNrOwotCQlicmVhazsKLQkgICAgY2FzZSA2OgotCQkqc3JjcmVnIF49IG1hc2s7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlicmVhazsKLQkgICAgfQotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiYgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX2J0Y19SKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgaW50IGJpdCxkaXNwOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJCVENcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWwsbWFzazsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDU7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCk7Ci0JICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCwgc3JjdmFsIF4gbWFzayk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbCxtYXNrOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOwotCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwLCAodTE2KShzcmN2YWwgXiBtYXNrKSk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbCxtYXNrOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKLQkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgXiBtYXNrKTsKLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsLG1hc2s7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7Ci0JCQltYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwLCAodTE2KShzcmN2YWwgXiBtYXNrKSk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbCxtYXNrOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKLQkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgXiBtYXNrKTsKLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsLG1hc2s7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7Ci0JCQltYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwLCAodTE2KShzcmN2YWwgXiBtYXNrKSk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQkJdTMyICpzcmNyZWcsKnNoaWZ0cmVnOwotCSAgICB1MzIgbWFzazsKLQotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKLQkJCSpzcmNyZWcgXj0gbWFzazsKLQkJfSBlbHNlIHsKLQkJCXUxNiAqc3JjcmVnLCpzaGlmdHJlZzsKLQkJCXUxNiBtYXNrOwotCi0JCQlzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCQlzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkJCVRSQUNFX0FORF9TVEVQKCk7Ci0JCQliaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JCQltYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOwotCSAgICAqc3JjcmVnIF49IG1hc2s7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGJjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfYnNmKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkJTRlxuIik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2gobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsLCAqZHN0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAwOyAqZHN0cmVnIDwgMzI7ICgqZHN0cmVnKSsrKQotCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWwsICpkc3RyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDA7ICpkc3RyZWcgPCAxNjsgKCpkc3RyZWcpKyspCi0JCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbCwgKmRzdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDMyOyAoKmRzdHJlZykrKykKLQkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsLCAqZHN0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAwOyAqZHN0cmVnIDwgMTY7ICgqZHN0cmVnKSsrKQotCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWwsICpkc3RyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDA7ICpkc3RyZWcgPCAzMjsgKCpkc3RyZWcpKyspCi0JCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbCwgKmRzdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDE2OyAoKmRzdHJlZykrKykKLQkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOgkJCQkvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKnNyY3JlZywgKmRzdHJlZzsKLQotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDA7ICpkc3RyZWcgPCAzMjsgKCpkc3RyZWcpKyspCi0JCWlmICgoKnNyY3JlZyA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqc3JjcmVnLCAqZHN0cmVnOwotCi0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDE2OyAoKmRzdHJlZykrKykKLQkJaWYgKCgqc3JjcmVnID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGJkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfYnNyKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkJTRlxuIik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2gobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsLCAqZHN0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAzMTsgKmRzdHJlZyA+IDA7ICgqZHN0cmVnKS0tKQotCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWwsICpkc3RyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDE1OyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCi0JCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbCwgKmRzdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMzE7ICpkc3RyZWcgPiAwOyAoKmRzdHJlZyktLSkKLQkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsLCAqZHN0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAxNTsgKmRzdHJlZyA+IDA7ICgqZHN0cmVnKS0tKQotCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWwsICpkc3RyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDMxOyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCi0JCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbCwgKmRzdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMTU7ICpkc3RyZWcgPiAwOyAoKmRzdHJlZyktLSkKLQkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOgkJCQkvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKnNyY3JlZywgKmRzdHJlZzsKLQotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDMxOyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCi0JCWlmICgoKnNyY3JlZyA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqc3JjcmVnLCAqZHN0cmVnOwotCi0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMTU7ICpkc3RyZWcgPiAwOyAoKmRzdHJlZyktLSkKLQkJaWYgKCgqc3JjcmVnID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGJlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfbW92c3hfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlNYXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gKHMzMikoKHM4KWZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IChzMTYpKChzOClmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KSk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSAoczMyKSgoczgpZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCkpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gKHMxNikoKHM4KWZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IChzMzIpKChzOClmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KSk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSAoczE2KSgoczgpZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCkpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTggICpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gKHMzMikoKHM4KSpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTggICpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gKHMxNikoKHM4KSpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX21vdnN4X3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIHUzMiAqZGVzdHJlZzsKLSAgICB1MzIgc3JjdmFsOwotICAgIHUxNiAqc3JjcmVnOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZTWFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSAoczMyKSgoczE2KWZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzcmN2YWw7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IChzMzIpKChzMTYpZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCkpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNyY3ZhbDsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gKHMzMikoKHMxNilmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KSk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3JjdmFsOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSAoczMyKSgoczE2KSpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIERvdWJsZSBieXRlIG9wZXJhdGlvbiBjb2RlIHRhYmxlOgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAoKng4NmVtdV9vcHRhYjJbMjU2XSkodTgpID0KLXsKLS8qICAweDAwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogR3JvdXAgRiAocmluZyAwIFBNKSAgICAgICovCi0vKiAgMHgwMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIEdyb3VwIEcgKHJpbmcgMCBQTSkgICAgICAqLwotLyogIDB4MDIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBsYXIgKHJpbmcgMCBQTSkgICAgICAgICAgKi8KLS8qICAweDAzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbHNsIChyaW5nIDAgUE0pICAgICAgICAgICovCi0vKiAgMHgwNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDA1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbG9hZGFsbCAodW5kb2N1bWVudGVkKSAgICovCi0vKiAgMHgwNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIGNsdHMgKHJpbmcgMCBQTSkgICAgICAgICAqLwotLyogIDB4MDcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBsb2FkYWxsICh1bmRvY3VtZW50ZWQpICAgKi8KLS8qICAweDA4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogaW52ZCAocmluZyAwIFBNKSAgICAgICAgICovCi0vKiAgMHgwOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIHdiaW52ZCAocmluZyAwIFBNKSAgICAgICAqLwotLyogIDB4MGEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgwYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDBjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MGQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgwZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDBmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotCi0vKiAgMHgxMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDExICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MTIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgxMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDE0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MTUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgxNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDE3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MTggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgxOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDFhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MWIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgxYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDFkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MWUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgxZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLQotLyogIDB4MjAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgcmVnMzIsY3JlZyAocmluZyAwIFBNKSAqLwotLyogIDB4MjEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgcmVnMzIsZHJlZyAocmluZyAwIFBNKSAqLwotLyogIDB4MjIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgY3JlZyxyZWczMiAocmluZyAwIFBNKSAqLwotLyogIDB4MjMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgZHJlZyxyZWczMiAocmluZyAwIFBNKSAqLwotLyogIDB4MjQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgcmVnMzIsdHJlZyAocmluZyAwIFBNKSAqLwotLyogIDB4MjUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgyNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIG1vdiB0cmVnLHJlZzMyIChyaW5nIDAgUE0pICovCi0vKiAgMHgyNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDI4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MjkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgyYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDJiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MmMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgyZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDJlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MmYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0KLS8qICAweDMwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MzEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgzMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDMzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MzQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgzNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDM2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MzcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgzOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDM5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4M2EgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgzYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDNjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4M2QgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgzZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDNmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotCi0vKiAgMHg0MCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDQxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NDIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg0MyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDQ0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NDUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg0NiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDQ3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NDggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg0OSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDRhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NGIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg0YyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDRkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NGUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg0ZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLQotLyogIDB4NTAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg1MSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDUyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NTMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg1NCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDU1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NTYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg1NyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDU4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NTkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg1YSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDViICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NWMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg1ZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDVlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NWYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0KLS8qICAweDYwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NjEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg2MiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDYzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NjQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg2NSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDY2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NjcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg2OCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDY5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NmEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg2YiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDZjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NmQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg2ZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDZmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotCi0vKiAgMHg3MCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDcxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NzIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg3MyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDc0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NzUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg3NiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDc3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NzggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg3OSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDdhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4N2IgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg3YyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDdkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4N2UgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg3ZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLQotLyogIDB4ODAgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLS8qICAweDgxICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0vKiAgMHg4MiAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotLyogIDB4ODMgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLS8qICAweDg0ICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0vKiAgMHg4NSAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotLyogIDB4ODYgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLS8qICAweDg3ICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0vKiAgMHg4OCAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotLyogIDB4ODkgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLS8qICAweDhhICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0vKiAgMHg4YiAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotLyogIDB4OGMgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLS8qICAweDhkICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0vKiAgMHg4ZSAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotLyogIDB4OGYgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLQotLyogIDB4OTAgKi8geDg2ZW11T3AyX3NldF9ieXRlLAotLyogIDB4OTEgKi8geDg2ZW11T3AyX3NldF9ieXRlLAotLyogIDB4OTIgKi8geDg2ZW11T3AyX3NldF9ieXRlLAotLyogIDB4OTMgKi8geDg2ZW11T3AyX3NldF9ieXRlLAotLyogIDB4OTQgKi8geDg2ZW11T3AyX3NldF9ieXRlLAotLyogIDB4OTUgKi8geDg2ZW11T3AyX3NldF9ieXRlLAotLyogIDB4OTYgKi8geDg2ZW11T3AyX3NldF9ieXRlLAotLyogIDB4OTcgKi8geDg2ZW11T3AyX3NldF9ieXRlLAotLyogIDB4OTggKi8geDg2ZW11T3AyX3NldF9ieXRlLAotLyogIDB4OTkgKi8geDg2ZW11T3AyX3NldF9ieXRlLAotLyogIDB4OWEgKi8geDg2ZW11T3AyX3NldF9ieXRlLAotLyogIDB4OWIgKi8geDg2ZW11T3AyX3NldF9ieXRlLAotLyogIDB4OWMgKi8geDg2ZW11T3AyX3NldF9ieXRlLAotLyogIDB4OWQgKi8geDg2ZW11T3AyX3NldF9ieXRlLAotLyogIDB4OWUgKi8geDg2ZW11T3AyX3NldF9ieXRlLAotLyogIDB4OWYgKi8geDg2ZW11T3AyX3NldF9ieXRlLAotCi0vKiAgMHhhMCAqLyB4ODZlbXVPcDJfcHVzaF9GUywKLS8qICAweGExICovIHg4NmVtdU9wMl9wb3BfRlMsCi0vKiAgMHhhMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGEzICovIHg4NmVtdU9wMl9idF9SLAotLyogIDB4YTQgKi8geDg2ZW11T3AyX3NobGRfSU1NLAotLyogIDB4YTUgKi8geDg2ZW11T3AyX3NobGRfQ0wsCi0vKiAgMHhhNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGE3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4YTggKi8geDg2ZW11T3AyX3B1c2hfR1MsCi0vKiAgMHhhOSAqLyB4ODZlbXVPcDJfcG9wX0dTLAotLyogIDB4YWEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhhYiAqLyB4ODZlbXVPcDJfYnRfUiwKLS8qICAweGFjICovIHg4NmVtdU9wMl9zaHJkX0lNTSwKLS8qICAweGFkICovIHg4NmVtdU9wMl9zaHJkX0NMLAotLyogIDB4YWUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhhZiAqLyB4ODZlbXVPcDJfaW11bF9SX1JNLAotCi0vKiAgMHhiMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGNtcHhjaGcgKi8KLS8qICAweGIxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogY21weGNoZyAqLwotLyogIDB4YjIgKi8geDg2ZW11T3AyX2xzc19SX0lNTSwKLS8qICAweGIzICovIHg4NmVtdU9wMl9idHJfUiwKLS8qICAweGI0ICovIHg4NmVtdU9wMl9sZnNfUl9JTU0sCi0vKiAgMHhiNSAqLyB4ODZlbXVPcDJfbGdzX1JfSU1NLAotLyogIDB4YjYgKi8geDg2ZW11T3AyX21vdnp4X2J5dGVfUl9STSwKLS8qICAweGI3ICovIHg4NmVtdU9wMl9tb3Z6eF93b3JkX1JfUk0sCi0vKiAgMHhiOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGI5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4YmEgKi8geDg2ZW11T3AyX2J0WF9JLAotLyogIDB4YmIgKi8geDg2ZW11T3AyX2J0Y19SLAotLyogIDB4YmMgKi8geDg2ZW11T3AyX2JzZiwKLS8qICAweGJkICovIHg4NmVtdU9wMl9ic3IsCi0vKiAgMHhiZSAqLyB4ODZlbXVPcDJfbW92c3hfYnl0ZV9SX1JNLAotLyogIDB4YmYgKi8geDg2ZW11T3AyX21vdnN4X3dvcmRfUl9STSwKLQotLyogIDB4YzAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiB4YWRkICovCi0vKiAgMHhjMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IHhhZGQgKi8KLS8qICAweGMyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4YzMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhjNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGM1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4YzYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhjNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGM4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KLS8qICAweGM5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KLS8qICAweGNhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KLS8qICAweGNiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KLS8qICAweGNjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KLS8qICAweGNkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KLS8qICAweGNlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KLS8qICAweGNmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KLQotLyogIDB4ZDAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhkMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGQyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZDMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhkNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGQ1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZDYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhkNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGQ4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZDkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhkYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGRiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZGMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhkZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGRlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZGYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0KLS8qICAweGUwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZTEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhlMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGUzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZTQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhlNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGU2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZTcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhlOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGU5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZWEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhlYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGVjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZWQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhlZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGVmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotCi0vKiAgMHhmMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGYxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZjIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhmMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGY0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZjUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhmNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGY3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZjggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhmOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGZhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZmIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhmYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGZkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZmUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhmZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLX07CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvcHJpbV9vcHMuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9wcmltX29wcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmIxYmYyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9wcmltX29wcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6CQlBTlNJIEMKLSogRW52aXJvbm1lbnQ6CUFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0byBpbXBsZW1lbnQgdGhlIHByaW1pdGl2ZQotKgkJCQltYWNoaW5lIG9wZXJhdGlvbnMgdXNlZCBieSB0aGUgZW11bGF0aW9uIGNvZGUgaW4gb3BzLmMKLSoKLSogQ2FycnkgQ2hhaW4gQ2FsY3VsYXRpb24KLSoKLSogVGhpcyByZXByZXNlbnRzIGEgc29tZXdoYXQgZXhwZW5zaXZlIGNhbGN1bGF0aW9uIHdoaWNoIGlzCi0qIGFwcGFyZW50bHkgcmVxdWlyZWQgdG8gZW11bGF0ZSB0aGUgc2V0dGluZyBvZiB0aGUgT0YgYW5kIEFGIGZsYWcuCi0qIFRoZSBsYXR0ZXIgaXMgbm90IHNvIGltcG9ydGFudCwgYnV0IHRoZSBmb3JtZXIgaXMuICBUaGUgb3ZlcmZsb3cKLSogZmxhZyBpcyB0aGUgWE9SIG9mIHRoZSB0b3AgdHdvIGJpdHMgb2YgdGhlIGNhcnJ5IGNoYWluIGZvciBhbgotKiBhZGRpdGlvbiAoc2ltaWxhciBmb3Igc3VidHJhY3Rpb24pLiAgU2luY2Ugd2UgZG8gbm90IHdhbnQgdG8KLSogc2ltdWxhdGUgdGhlIGFkZGl0aW9uIGluIGEgYml0d2lzZSBtYW5uZXIsIHdlIHRyeSB0byBjYWxjdWxhdGUgdGhlCi0qIGNhcnJ5IGNoYWluIGdpdmVuIHRoZSB0d28gb3BlcmFuZHMgYW5kIHRoZSByZXN1bHQuCi0qCi0qIFNvLCBnaXZlbiB0aGUgZm9sbG93aW5nIHRhYmxlLCB3aGljaCByZXByZXNlbnRzIHRoZSBhZGRpdGlvbiBvZiB0d28KLSogYml0cywgd2UgY2FuIGRlcml2ZSBhIGZvcm11bGEgZm9yIHRoZSBjYXJyeSBjaGFpbi4KLSoKLSogYSAgIGIgICBjaW4gICByICAgICBjb3V0Ci0qIDAgICAwICAgMCAgICAgMCAgICAgMAotKiAwICAgMCAgIDEgICAgIDEgICAgIDAKLSogMCAgIDEgICAwICAgICAxICAgICAwCi0qIDAgICAxICAgMSAgICAgMCAgICAgMQotKiAxICAgMCAgIDAgICAgIDEgICAgIDAKLSogMSAgIDAgICAxICAgICAwICAgICAxCi0qIDEgICAxICAgMCAgICAgMCAgICAgMQotKiAxICAgMSAgIDEgICAgIDEgICAgIDEKLSoKLSogQ29uc3RydWN0aW9uIG9mIHRhYmxlIGZvciBjb3V0OgotKgotKiBhYgotKiByICBcICAwMCAgIDAxICAgMTEgIDEwCi0qIHwtLS0tLS0tLS0tLS0tLS0tLS0KLSogMCAgfCAgIDAgICAgMSAgICAxICAgMQotKiAxICB8ICAgMCAgICAwICAgIDEgICAwCi0qCi0qIEJ5IGluc3BlY3Rpb24sIG9uZSBnZXRzOiAgY2MgPSBhYiArICByJyhhICsgYikKLSoKLSogVGhhdCByZXByZXNlbnRzIGFsb3Qgb2Ygb3BlcmF0aW9ucywgYnV0IE5PIENIT0lDRS4uLi4KLSoKLSogQm9ycm93IENoYWluIENhbGN1bGF0aW9uLgotKgotKiBUaGUgZm9sbG93aW5nIHRhYmxlIHJlcHJlc2VudHMgdGhlIHN1YnRyYWN0aW9uIG9mIHR3byBiaXRzLCBmcm9tCi0qIHdoaWNoIHdlIGNhbiBkZXJpdmUgYSBmb3JtdWxhIGZvciB0aGUgYm9ycm93IGNoYWluLgotKgotKiBhICAgYiAgIGJpbiAgIHIgICAgIGJvdXQKLSogMCAgIDAgICAwICAgICAwICAgICAwCi0qIDAgICAwICAgMSAgICAgMSAgICAgMQotKiAwICAgMSAgIDAgICAgIDEgICAgIDEKLSogMCAgIDEgICAxICAgICAwICAgICAxCi0qIDEgICAwICAgMCAgICAgMSAgICAgMAotKiAxICAgMCAgIDEgICAgIDAgICAgIDAKLSogMSAgIDEgICAwICAgICAwICAgICAwCi0qIDEgICAxICAgMSAgICAgMSAgICAgMQotKgotKiBDb25zdHJ1Y3Rpb24gb2YgdGFibGUgZm9yIGNvdXQ6Ci0qCi0qIGFiCi0qIHIgIFwgIDAwICAgMDEgICAxMSAgMTAKLSogfC0tLS0tLS0tLS0tLS0tLS0tLQotKiAwICB8ICAgMCAgICAxICAgIDAgICAwCi0qIDEgIHwgICAxICAgIDEgICAgMSAgIDAKLSoKLSogQnkgaW5zcGVjdGlvbiwgb25lIGdldHM6ICBiYyA9IGEnYiArICByKGEnICsgYikKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUJUFJJTV9PUFNfTk9fUkVERUZJTkVfQVNNCi0jaW5jbHVkZSAieDg2ZW11L3g4NmVtdWkuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZglfX0hBVkVfSU5MSU5FX0FTU0VNQkxFUl9fCi0KLXN0YXRpYyB1MzIgeDg2ZW11X3Bhcml0eV90YWJbOF0gPQotewotCTB4OTY2OTY5OTYsCi0JMHg2OTk2OTY2OSwKLQkweDY5OTY5NjY5LAotCTB4OTY2OTY5OTYsCi0JMHg2OTk2OTY2OSwKLQkweDk2Njk2OTk2LAotCTB4OTY2OTY5OTYsCi0JMHg2OTk2OTY2OSwKLX07Ci0KLSNlbmRpZgotCi0jZGVmaW5lIFBBUklUWSh4KSAgICgoKHg4NmVtdV9wYXJpdHlfdGFiWyh4KSAvIDMyXSA+PiAoKHgpICUgMzIpKSAmIDEpID09IDApCi0jZGVmaW5lIFhPUjIoeCkgCSgoKHgpIF4gKCh4KT4+MSkpICYgMHgxKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmCV9fSEFWRV9JTkxJTkVfQVNTRU1CTEVSX18KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBBQUEgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgYWFhX3dvcmQodTE2IGQpCi17Ci0JdTE2CXJlczsKLQlpZiAoKGQgJiAweGYpID4gMHg5IHx8IEFDQ0VTU19GTEFHKEZfQUYpKSB7Ci0JCWQgKz0gMHg2OwotCQlkICs9IDB4MTAwOwotCQlTRVRfRkxBRyhGX0FGKTsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX0FGKTsKLQl9Ci0JcmVzID0gKHUxNikoZCAmIDB4RkYwRik7Ci0JQ0xFQVJfRkxBRyhGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIEFBQSBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBhYXNfd29yZCh1MTYgZCkKLXsKLQl1MTYJcmVzOwotCWlmICgoZCAmIDB4ZikgPiAweDkgfHwgQUNDRVNTX0ZMQUcoRl9BRikpIHsKLQkJZCAtPSAweDY7Ci0JCWQgLT0gMHgxMDA7Ci0JCVNFVF9GTEFHKEZfQUYpOwotCQlTRVRfRkxBRyhGX0NGKTsKLQl9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfQUYpOwotCX0KLQlyZXMgPSAodTE2KShkICYgMHhGRjBGKTsKLQlDTEVBUl9GTEFHKEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQUFEIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IGFhZF93b3JkKHUxNiBkKQotewotCXUxNiBsOwotCXU4IGhiLCBsYjsKLQotCWhiID0gKHU4KSgoZCA+PiA4KSAmIDB4ZmYpOwotCWxiID0gKHU4KSgoZCAmIDB4ZmYpKTsKLQlsID0gKHUxNikoKGxiICsgMTAgKiBoYikgJiAweEZGKTsKLQotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ0xFQVJfRkxBRyhGX0FGKTsKLQlDTEVBUl9GTEFHKEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGwgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhsID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShsICYgMHhmZiksIEZfUEYpOwotCXJldHVybiBsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIEFBTSBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBhYW1fd29yZCh1OCBkKQotewotICAgIHUxNiBoLCBsOwotCi0JaCA9ICh1MTYpKGQgLyAxMCk7Ci0JbCA9ICh1MTYpKGQgJSAxMCk7Ci0JbCB8PSAodTE2KShoIDw8IDgpOwotCi0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDTEVBUl9GTEFHKEZfQUYpOwotCUNMRUFSX0ZMQUcoRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcobCAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGwgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKGwgJiAweGZmKSwgRl9QRik7Ci0gICAgcmV0dXJuIGw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQURDIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggYWRjX2J5dGUodTggZCwgdTggcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCXJlZ2lzdGVyIHUzMiBjYzsKLQotCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkKLQkJcmVzID0gMSArIGQgKyBzOwotCWVsc2UKLQkJcmVzID0gZCArIHM7Ci0KLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEwMCwgRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGNhcnJ5IGNoYWluICBTRUUgTk9URSBBVCBUT1AuICovCi0JY2MgPSAocyAmIGQpIHwgKCh+cmVzKSAmIChzIHwgZCkpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoY2MgPj4gNiksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gKHU4KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBBREMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgYWRjX3dvcmQodTE2IGQsIHUxNiBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0JcmVnaXN0ZXIgdTMyIGNjOwotCi0JaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQotCQlyZXMgPSAxICsgZCArIHM7Ci0JZWxzZQotCQlyZXMgPSBkICsgczsKLQotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MTAwMDAsIEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgY2FycnkgY2hhaW4gIFNFRSBOT1RFIEFUIFRPUC4gKi8KLQljYyA9IChzICYgZCkgfCAoKH5yZXMpICYgKHMgfCBkKSk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihjYyA+PiAxNCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gKHUxNilyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQURDIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIGFkY19sb25nKHUzMiBkLCB1MzIgcykKLXsKLQlyZWdpc3RlciB1MzIgbG87CS8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCXJlZ2lzdGVyIHUzMiBoaTsKLQlyZWdpc3RlciB1MzIgcmVzOwotCXJlZ2lzdGVyIHUzMiBjYzsKLQotCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgewotCQlsbyA9IDEgKyAoZCAmIDB4RkZGRikgKyAocyAmIDB4RkZGRik7Ci0JCXJlcyA9IDEgKyBkICsgczsKLQkJfQotCWVsc2UgewotCQlsbyA9IChkICYgMHhGRkZGKSArIChzICYgMHhGRkZGKTsKLQkJcmVzID0gZCArIHM7Ci0JCX0KLQloaSA9IChsbyA+PiAxNikgKyAoZCA+PiAxNikgKyAocyA+PiAxNik7Ci0KLQlDT05ESVRJT05BTF9TRVRfRkxBRyhoaSAmIDB4MTAwMDAsIEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBjYXJyeSBjaGFpbiAgU0VFIE5PVEUgQVQgVE9QLiAqLwotCWNjID0gKHMgJiBkKSB8ICgofnJlcykgJiAocyB8IGQpKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGNjID4+IDMwKSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2MgJiAweDgsIEZfQUYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQUREIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggYWRkX2J5dGUodTggZCwgdTggcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCXJlZ2lzdGVyIHUzMiBjYzsKLQotCXJlcyA9IGQgKyBzOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MTAwLCBGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgY2FycnkgY2hhaW4gIFNFRSBOT1RFIEFUIFRPUC4gKi8KLQljYyA9IChzICYgZCkgfCAoKH5yZXMpICYgKHMgfCBkKSk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihjYyA+PiA2KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2MgJiAweDgsIEZfQUYpOwotCXJldHVybiAodTgpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIEFERCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBhZGRfd29yZCh1MTYgZCwgdTE2IHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQlyZWdpc3RlciB1MzIgY2M7Ci0KLQlyZXMgPSBkICsgczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEwMDAwLCBGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGNhcnJ5IGNoYWluICBTRUUgTk9URSBBVCBUT1AuICovCi0JY2MgPSAocyAmIGQpIHwgKCh+cmVzKSAmIChzIHwgZCkpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoY2MgPj4gMTQpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhjYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuICh1MTYpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIEFERCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBhZGRfbG9uZyh1MzIgZCwgdTMyIHMpCi17Ci0JcmVnaXN0ZXIgdTMyIGxvOwkvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQlyZWdpc3RlciB1MzIgaGk7Ci0JcmVnaXN0ZXIgdTMyIHJlczsKLQlyZWdpc3RlciB1MzIgY2M7Ci0KLQlsbyA9IChkICYgMHhGRkZGKSArIChzICYgMHhGRkZGKTsKLQlyZXMgPSBkICsgczsKLQloaSA9IChsbyA+PiAxNikgKyAoZCA+PiAxNikgKyAocyA+PiAxNik7Ci0KLQlDT05ESVRJT05BTF9TRVRfRkxBRyhoaSAmIDB4MTAwMDAsIEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0gICAgLyogY2FsY3VsYXRlIHRoZSBjYXJyeSBjaGFpbiAgU0VFIE5PVEUgQVQgVE9QLiAqLwotICAgIGNjID0gKHMgJiBkKSB8ICgofnJlcykgJiAocyB8IGQpKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGNjID4+IDMwKSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2MgJiAweDgsIEZfQUYpOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBBTkQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBhbmRfYnl0ZSh1OCBkLCB1OCBzKQotewotCXJlZ2lzdGVyIHU4IHJlczsgICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0KLQlyZXMgPSBkICYgczsKLQotCS8qIHNldCB0aGUgZmxhZ3MgICovCi0JQ0xFQVJfRkxBRyhGX09GKTsKLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNMRUFSX0ZMQUcoRl9BRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMpLCBGX1BGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIEFORCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBhbmRfd29yZCh1MTYgZCwgdTE2IHMpCi17Ci0gICAgcmVnaXN0ZXIgdTE2IHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQotICAgIHJlcyA9IGQgJiBzOwotCi0gICAgLyogc2V0IHRoZSBmbGFncyAgKi8KLQlDTEVBUl9GTEFHKEZfT0YpOwotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ0xFQVJfRkxBRyhGX0FGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotICAgIHJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQU5EIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIGFuZF9sb25nKHUzMiBkLCB1MzIgcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCi0JcmVzID0gZCAmIHM7Ci0KLQkvKiBzZXQgdGhlIGZsYWdzICAqLwotCUNMRUFSX0ZMQUcoRl9PRik7Ci0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDTEVBUl9GTEFHKEZfQUYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQ01QIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggY21wX2J5dGUodTggZCwgdTggcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCXJlZ2lzdGVyIHUzMiBiYzsKLQotCXJlcyA9IGQgLSBzOwotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLwotCWJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MCwgRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiA2KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOwotCXJldHVybiBkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIENNUCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBjbXBfd29yZCh1MTYgZCwgdTE2IHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQlyZWdpc3RlciB1MzIgYmM7Ci0KLQlyZXMgPSBkIC0gczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLwotICAgIGJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MDAwLCBGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDE0KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOwotCXJldHVybiBkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIENNUCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBjbXBfbG9uZyh1MzIgZCwgdTMyIHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQlyZWdpc3RlciB1MzIgYmM7Ci0KLQlyZXMgPSBkIC0gczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCi0JYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwMDAwMDAwLCBGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDMwKSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOwotCXJldHVybiBkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIERBQSBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IGRhYV9ieXRlKHU4IGQpCi17Ci0JdTMyIHJlcyA9IGQ7Ci0JaWYgKChkICYgMHhmKSA+IDkgfHwgQUNDRVNTX0ZMQUcoRl9BRikpIHsKLQkJcmVzICs9IDY7Ci0JCVNFVF9GTEFHKEZfQUYpOwotCX0KLQlpZiAocmVzID4gMHg5RiB8fCBBQ0NFU1NfRkxBRyhGX0NGKSkgewotCQlyZXMgKz0gMHg2MDsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JfQotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweEZGKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCXJldHVybiAodTgpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIERBUyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IGRhc19ieXRlKHU4IGQpCi17Ci0JaWYgKChkICYgMHhmKSA+IDkgfHwgQUNDRVNTX0ZMQUcoRl9BRikpIHsKLQkJZCAtPSA2OwotCQlTRVRfRkxBRyhGX0FGKTsKLQl9Ci0JaWYgKGQgPiAweDlGIHx8IEFDQ0VTU19GTEFHKEZfQ0YpKSB7Ci0JCWQgLT0gMHg2MDsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JfQotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGQgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhkID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShkICYgMHhmZiksIEZfUEYpOwotCXJldHVybiBkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIERFQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IGRlY19ieXRlKHU4IGQpCi17Ci0gICAgcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLSAgICByZWdpc3RlciB1MzIgYmM7Ci0KLSAgICByZXMgPSBkIC0gMTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCi0JLyogYmFzZWQgb24gc3ViX2J5dGUsIHVzZXMgcz09MS4gICovCi0JYmMgPSAocmVzICYgKH5kIHwgMSkpIHwgKH5kICYgMSk7Ci0JLyogY2FycnkgZmxhZyB1bmNoYW5nZWQgKi8KLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDYpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuICh1OClyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgREVDIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IGRlY193b3JkKHUxNiBkKQotewotICAgIHJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0gICAgcmVnaXN0ZXIgdTMyIGJjOwotCi0gICAgcmVzID0gZCAtIDE7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0gICAgLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KLSAgICAvKiBiYXNlZCBvbiB0aGUgc3ViX2J5dGUgcm91dGluZSwgd2l0aCBzPT0xICovCi0gICAgYmMgPSAocmVzICYgKH5kIHwgMSkpIHwgKH5kICYgMSk7Ci0gICAgLyogY2FycnkgZmxhZyB1bmNoYW5nZWQgKi8KLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDE0KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOwotCXJldHVybiAodTE2KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBERUMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgZGVjX2xvbmcodTMyIGQpCi17Ci0gICAgcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLSAgICByZWdpc3RlciB1MzIgYmM7Ci0KLSAgICByZXMgPSBkIC0gMTsKLQotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0gICAgLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KLQliYyA9IChyZXMgJiAofmQgfCAxKSkgfCAofmQgJiAxKTsKLQkvKiBjYXJyeSBmbGFnIHVuY2hhbmdlZCAqLwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gMzApLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBJTkMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBpbmNfYnl0ZSh1OCBkKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0JcmVnaXN0ZXIgdTMyIGNjOwotCi0JcmVzID0gZCArIDE7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGNhcnJ5IGNoYWluICBTRUUgTk9URSBBVCBUT1AuICovCi0JY2MgPSAoKDEgJiBkKSB8ICh+cmVzKSkgJiAoMSB8IGQpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoY2MgPj4gNiksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gKHU4KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBJTkMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgaW5jX3dvcmQodTE2IGQpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQlyZWdpc3RlciB1MzIgY2M7Ci0KLQlyZXMgPSBkICsgMTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGNhcnJ5IGNoYWluICBTRUUgTk9URSBBVCBUT1AuICovCi0JY2MgPSAoMSAmIGQpIHwgKCh+cmVzKSAmICgxIHwgZCkpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoY2MgPj4gMTQpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhjYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuICh1MTYpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIElOQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBpbmNfbG9uZyh1MzIgZCkKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCXJlZ2lzdGVyIHUzMiBjYzsKLQotCXJlcyA9IGQgKyAxOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBjYXJyeSBjaGFpbiAgU0VFIE5PVEUgQVQgVE9QLiAqLwotCWNjID0gKDEgJiBkKSB8ICgofnJlcykgJiAoMSB8IGQpKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGNjID4+IDMwKSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2MgJiAweDgsIEZfQUYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBvcl9ieXRlKHU4IGQsIHU4IHMpCi17Ci0JcmVnaXN0ZXIgdTggcmVzOyAgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQotCXJlcyA9IGQgfCBzOwotCUNMRUFSX0ZMQUcoRl9PRik7Ci0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDTEVBUl9GTEFHKEZfQUYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzKSwgRl9QRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBvcl93b3JkKHUxNiBkLCB1MTYgcykKLXsKLQlyZWdpc3RlciB1MTYgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCi0JcmVzID0gZCB8IHM7Ci0JLyogc2V0IHRoZSBjYXJyeSBmbGFnIHRvIGJlIGJpdCA4ICovCi0JQ0xFQVJfRkxBRyhGX09GKTsKLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNMRUFSX0ZMQUcoRl9BRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIG9yX2xvbmcodTMyIGQsIHUzMiBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0KLQlyZXMgPSBkIHwgczsKLQotCS8qIHNldCB0aGUgY2FycnkgZmxhZyB0byBiZSBiaXQgOCAqLwotCUNMRUFSX0ZMQUcoRl9PRik7Ci0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDTEVBUl9GTEFHKEZfQUYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBuZWdfYnl0ZSh1OCBzKQotewotICAgIHJlZ2lzdGVyIHU4IHJlczsKLSAgICByZWdpc3RlciB1OCBiYzsKLQotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgIT0gMCwgRl9DRik7Ci0JcmVzID0gKHU4KS1zOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzKSwgRl9QRik7Ci0JLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4gLS0tIG1vZGlmaWVkIHN1Y2ggdGhhdCBkPTAuCi0JICAgc3Vic3RpdHV0aWluZyBkPTAgaW50byAgICAgYmM9IHJlcyYofmR8cyl8KH5kJnMpOwotCSAgICh0aGUgb25lIHVzZWQgZm9yIHN1YikgYW5kIHNpbXBsaWZ5aW5nLCBzaW5jZSB+ZD0weGZmLi4uLAotCSAgIH5kfHMgPT0gMHhmZmZmLi4uLCBhbmQgcmVzJjB4ZmZmLi4uID09IHJlcy4gIFNpbWlsYXJseQotCSAgIH5kJnMgPT0gcy4gIFNvIHRoZSBzaW1wbGlmaWVkIHJlc3VsdCBpczogKi8KLQliYyA9IHJlcyB8IHM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiA2KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgbmVnX3dvcmQodTE2IHMpCi17Ci0JcmVnaXN0ZXIgdTE2IHJlczsKLQlyZWdpc3RlciB1MTYgYmM7Ci0KLQlDT05ESVRJT05BTF9TRVRfRkxBRyhzICE9IDAsIEZfQ0YpOwotCXJlcyA9ICh1MTYpLXM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4gLS0tIG1vZGlmaWVkIHN1Y2ggdGhhdCBkPTAuCi0JICAgc3Vic3RpdHV0aWluZyBkPTAgaW50byAgICAgYmM9IHJlcyYofmR8cyl8KH5kJnMpOwotCSAgICh0aGUgb25lIHVzZWQgZm9yIHN1YikgYW5kIHNpbXBsaWZ5aW5nLCBzaW5jZSB+ZD0weGZmLi4uLAotCSAgIH5kfHMgPT0gMHhmZmZmLi4uLCBhbmQgcmVzJjB4ZmZmLi4uID09IHJlcy4gIFNpbWlsYXJseQotCSAgIH5kJnMgPT0gcy4gIFNvIHRoZSBzaW1wbGlmaWVkIHJlc3VsdCBpczogKi8KLQliYyA9IHJlcyB8IHM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAxNCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIG5lZ19sb25nKHUzMiBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7Ci0JcmVnaXN0ZXIgdTMyIGJjOwotCi0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocyAhPSAwLCBGX0NGKTsKLQlyZXMgPSAodTMyKS1zOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4gLS0tIG1vZGlmaWVkIHN1Y2ggdGhhdCBkPTAuCi0JICAgc3Vic3RpdHV0aWluZyBkPTAgaW50byAgICAgYmM9IHJlcyYofmR8cyl8KH5kJnMpOwotCSAgICh0aGUgb25lIHVzZWQgZm9yIHN1YikgYW5kIHNpbXBsaWZ5aW5nLCBzaW5jZSB+ZD0weGZmLi4uLAotCSAgIH5kfHMgPT0gMHhmZmZmLi4uLCBhbmQgcmVzJjB4ZmZmLi4uID09IHJlcy4gIFNpbWlsYXJseQotCSAgIH5kJnMgPT0gcy4gIFNvIHRoZSBzaW1wbGlmaWVkIHJlc3VsdCBpczogKi8KLQliYyA9IHJlcyB8IHM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAzMCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIE5PVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IG5vdF9ieXRlKHU4IHMpCi17Ci0JcmV0dXJuIH5zOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIE5PVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBub3Rfd29yZCh1MTYgcykKLXsKLQlyZXR1cm4gfnM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgTk9UIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIG5vdF9sb25nKHUzMiBzKQotewotCXJldHVybiB+czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBSQ0wgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCByY2xfYnl0ZSh1OCBkLCB1OCBzKQotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZXMsIGNudCwgbWFzaywgY2Y7Ci0KLSAgICAvKiBzIGlzIHRoZSByb3RhdGUgZGlzdGFuY2UuICBJdCB2YXJpZXMgZnJvbSAwIC0gOC4gKi8KLQkvKiBoYXZlCi0KLSAgICAgICBDRiAgQl83IEJfNiBCXzUgQl80IEJfMyBCXzIgQl8xIEJfMAotCi0gICAgICAgd2FudCB0byByb3RhdGUgdGhyb3VnaCB0aGUgY2FycnkgYnkgInMiIGJpdHMuICBXZSBjb3VsZAotICAgICAgIGxvb3AsIGJ1dCB0aGF0J3MgaW5lZmZpY2llbnQuICBTbyB0aGUgd2lkdGggaXMgOSwKLSAgICAgICBhbmQgd2Ugc3BsaXQgaW50byB0aHJlZSBwYXJ0czoKLQotICAgICAgIFRoZSBuZXcgY2FycnkgZmxhZyAgICh3YXMgQl9uKQotICAgICAgIHRoZSBzdHVmZiBpbiBCX24tMSAuLiBCXzAKLSAgICAgICB0aGUgc3R1ZmYgaW4gQl83IC4uIEJfbisxCi0KLSAgICAgICBUaGUgbmV3IHJvdGF0ZSBpcyBkb25lIG1vZCA5LCBhbmQgZ2l2ZW4gdGhpcywKLSAgICAgICBmb3IgYSByb3RhdGlvbiBvZiBuIGJpdHMgKG1vZCA5KSB0aGUgbmV3IGNhcnJ5IGZsYWcgaXMKLSAgICAgICB0aGVuIGxvY2F0ZWQgbiBiaXRzIGZyb20gdGhlIE1TQi4gIFRoZSBsb3cgcGFydCBpcwotICAgICAgIHRoZW4gc2hpZnRlZCB1cCBjbnQgYml0cywgYW5kIHRoZSBoaWdoIHBhcnQgaXMgb3InZAotICAgICAgIGluLiAgVXNpbmcgQ0FQUyBmb3IgbmV3IHZhbHVlcywgYW5kIGxvd2VyY2FzZSBmb3IgdGhlCi0gICAgICAgb3JpZ2luYWwgdmFsdWVzLCB0aGlzIGNhbiBiZSBleHByZXNzZWQgYXM6Ci0KLSAgICAgICBJRiBuID4gMAotICAgICAgIDEpIENGIDwtICBiXyg4LW4pCi0gICAgICAgMikgQl8oNykgLi4gQl8obikgIDwtICBiXyg4LShuKzEpKSAuLiBiXzAKLSAgICAgICAzKSBCXyhuLTEpIDwtIGNmCi0gICAgICAgNCkgQl8obi0yKSAuLiBCXzAgPC0gIGJfNyAuLiBiXyg4LShuLTEpKQotCSAqLwotCXJlcyA9IGQ7Ci0JaWYgKChjbnQgPSBzICUgOSkgIT0gMCkgewotCS8qIGV4dHJhY3QgdGhlIG5ldyBDQVJSWSBGTEFHLiAqLwotCS8qIENGIDwtICBiXyg4LW4pICAgICAgICAgICAgICovCi0JY2YgPSAoZCA+PiAoOCAtIGNudCkpICYgMHgxOwotCi0JLyogZ2V0IHRoZSBsb3cgc3R1ZmYgd2hpY2ggcm90YXRlZAotCSAgIGludG8gdGhlIHJhbmdlIEJfNyAuLiBCX2NudCAqLwotCS8qIEJfKDcpIC4uIEJfKG4pICA8LSAgYl8oOC0obisxKSkgLi4gYl8wICAqLwotCS8qIG5vdGUgdGhhdCB0aGUgcmlnaHQgaGFuZCBzaWRlIGRvbmUgYnkgdGhlIG1hc2sgKi8KLQkJcmVzID0gKGQgPDwgY250KSAmIDB4ZmY7Ci0KLQkvKiBub3cgdGhlIGhpZ2ggc3R1ZmYgd2hpY2ggcm90YXRlZCBhcm91bmQKLQkgICBpbnRvIHRoZSBwb3NpdGlvbnMgQl9jbnQtMiAuLiBCXzAgKi8KLQkvKiBCXyhuLTIpIC4uIEJfMCA8LSAgYl83IC4uIGJfKDgtKG4tMSkpICovCi0JLyogc2hpZnQgaXQgZG93bndhcmQsIDctKG4tMikgPSA5LW4gcG9zaXRpb25zLgotCSAgIGFuZCBtYXNrIG9mZiB0aGUgcmVzdWx0IGJlZm9yZSBvcidpbmcgaW4uCi0JICovCi0JbWFzayA9ICgxIDw8IChjbnQgLSAxKSkgLSAxOwotCXJlcyB8PSAoZCA+PiAoOSAtIGNudCkpICYgbWFzazsKLQotCS8qIGlmIHRoZSBjYXJyeSBmbGFnIHdhcyBzZXQsIG9yIGl0IGluLiAgKi8KLQkJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7ICAgICAvKiBjYXJyeSBmbGFnIGlzIHNldCAqLwotCSAgICAvKiAgQl8obi0xKSA8LSBjZiAqLwotCSAgICByZXMgfD0gMSA8PCAoY250IC0gMSk7Ci0JfQotCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIGJhc2VkIG9uIHRoZSB2YXJpYWJsZSAiY2YiICovCi0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkvKiBPVkVSRkxPVyBpcyBzZXQgKklGRiogY250PT0xLCB0aGVuIGl0IGlzIHRoZQotCSAgIHhvciBvZiBDRiBhbmQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAgQmxlY2NrLiAqLwotCS8qIHBhcmVudGhlc2l6ZWQgdGhpcyBleHByZXNzaW9uIHNpbmNlIGl0IGFwcGVhcnMgdG8KLQkgICBiZSBjYXVzaW5nIE9GIHRvIGJlIG1pc3NldCAqLwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNudCA9PSAxICYmIFhPUjIoY2YgKyAoKHJlcyA+PiA2KSAmIDB4MikpLAotCQkJCQkJCSBGX09GKTsKLQotICAgIH0KLQlyZXR1cm4gKHU4KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBSQ0wgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgcmNsX3dvcmQodTE2IGQsIHU4IHMpCi17Ci0JcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJlcywgY250LCBtYXNrLCBjZjsKLQotCXJlcyA9IGQ7Ci0JaWYgKChjbnQgPSBzICUgMTcpICE9IDApIHsKLQkJY2YgPSAoZCA+PiAoMTYgLSBjbnQpKSAmIDB4MTsKLQkJcmVzID0gKGQgPDwgY250KSAmIDB4ZmZmZjsKLQkJbWFzayA9ICgxIDw8IChjbnQgLSAxKSkgLSAxOwotCQlyZXMgfD0gKGQgPj4gKDE3IC0gY250KSkgJiBtYXNrOwotCQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsKLQkJCXJlcyB8PSAxIDw8IChjbnQgLSAxKTsKLQkJfQotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNudCA9PSAxICYmIFhPUjIoY2YgKyAoKHJlcyA+PiAxNCkgJiAweDIpKSwKLQkJCQkJCQkgRl9PRik7Ci0JfQotCXJldHVybiAodTE2KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBSQ0wgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgcmNsX2xvbmcodTMyIGQsIHU4IHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlcywgY250LCBtYXNrLCBjZjsKLQotCXJlcyA9IGQ7Ci0JaWYgKChjbnQgPSBzICUgMzMpICE9IDApIHsKLQkJY2YgPSAoZCA+PiAoMzIgLSBjbnQpKSAmIDB4MTsKLQkJcmVzID0gKGQgPDwgY250KSAmIDB4ZmZmZmZmZmY7Ci0JCW1hc2sgPSAoMSA8PCAoY250IC0gMSkpIC0gMTsKLQkJcmVzIHw9IChkID4+ICgzMyAtIGNudCkpICYgbWFzazsKLQkJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7ICAgICAvKiBjYXJyeSBmbGFnIGlzIHNldCAqLwotCQkJcmVzIHw9IDEgPDwgKGNudCAtIDEpOwotCQl9Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY250ID09IDEgJiYgWE9SMihjZiArICgocmVzID4+IDMwKSAmIDB4MikpLAotCQkJCQkJCSBGX09GKTsKLQl9Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBSQ1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCByY3JfYnl0ZSh1OCBkLCB1OCBzKQotewotCXUzMglyZXMsIGNudDsKLQl1MzIJbWFzaywgY2YsIG9jZiA9IDA7Ci0KLQkvKiByb3RhdGUgcmlnaHQgdGhyb3VnaCBjYXJyeSAqLwotICAgIC8qCi0gICAgICAgcyBpcyB0aGUgcm90YXRlIGRpc3RhbmNlLiAgSXQgdmFyaWVzIGZyb20gMCAtIDguCi0gICAgICAgZCBpcyB0aGUgYnl0ZSBvYmplY3Qgcm90YXRlZC4KLQotICAgICAgIGhhdmUKLQotICAgICAgIENGICBCXzcgQl82IEJfNSBCXzQgQl8zIEJfMiBCXzEgQl8wCi0KLSAgICAgICBUaGUgbmV3IHJvdGF0ZSBpcyBkb25lIG1vZCA5LCBhbmQgZ2l2ZW4gdGhpcywKLSAgICAgICBmb3IgYSByb3RhdGlvbiBvZiBuIGJpdHMgKG1vZCA5KSB0aGUgbmV3IGNhcnJ5IGZsYWcgaXMKLSAgICAgICB0aGVuIGxvY2F0ZWQgbiBiaXRzIGZyb20gdGhlIExTQi4gIFRoZSBsb3cgcGFydCBpcwotICAgICAgIHRoZW4gc2hpZnRlZCB1cCBjbnQgYml0cywgYW5kIHRoZSBoaWdoIHBhcnQgaXMgb3InZAotICAgICAgIGluLiAgVXNpbmcgQ0FQUyBmb3IgbmV3IHZhbHVlcywgYW5kIGxvd2VyY2FzZSBmb3IgdGhlCi0gICAgICAgb3JpZ2luYWwgdmFsdWVzLCB0aGlzIGNhbiBiZSBleHByZXNzZWQgYXM6Ci0KLSAgICAgICBJRiBuID4gMAotICAgICAgIDEpIENGIDwtICBiXyhuLTEpCi0gICAgICAgMikgQl8oOC0obisxKSkgLi4gQl8oMCkgIDwtICBiXyg3KSAuLiBiXyhuKQotICAgICAgIDMpIEJfKDgtbikgPC0gY2YKLSAgICAgICA0KSBCXyg3KSAuLiBCXyg4LShuLTEpKSA8LSAgYl8obi0yKSAuLiBiXygwKQotCSAqLwotCXJlcyA9IGQ7Ci0JaWYgKChjbnQgPSBzICUgOSkgIT0gMCkgewotCS8qIGV4dHJhY3QgdGhlIG5ldyBDQVJSWSBGTEFHLiAqLwotCS8qIENGIDwtICBiXyhuLTEpICAgICAgICAgICAgICAqLwotCWlmIChjbnQgPT0gMSkgewotCSAgICBjZiA9IGQgJiAweDE7Ci0JICAgIC8qIG5vdGUgaGFja2VyeSBoZXJlLiAgQWNjZXNzX2ZsYWcoLi4pIGV2YWx1YXRlcyB0byBlaXRoZXIKLQkgICAgICAgMCBpZiBmbGFnIG5vdCBzZXQKLQkgICAgICAgbm9uLXplcm8gaWYgZmxhZyBpcyBzZXQuCi0JICAgICAgIGRvaW5nIGFjY2Vzc19mbGFnKC4uKSAhPSAwIGNhc3RzIHRoYXQgaW50byBlaXRoZXIKLQkJCSAgIDAuLjEgaW4gYW55IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmbGFncyByZWdpc3RlcgotCSAgICAgICAoaS5lLiBwYWNrZWQgYml0IGFycmF5IG9yIHVucGFja2VkLikKLQkgICAgICovCi0JCQlvY2YgPSBBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwOwotCX0gZWxzZQotCSAgICBjZiA9IChkID4+IChjbnQgLSAxKSkgJiAweDE7Ci0KLQkvKiBCXyg4LShuKzEpKSAuLiBCXygwKSAgPC0gIGJfKDcpIC4uIGJfbiAgKi8KLQkvKiBub3RlIHRoYXQgdGhlIHJpZ2h0IGhhbmQgc2lkZSBkb25lIGJ5IHRoZSBtYXNrCi0JICAgVGhpcyBpcyBlZmZlY3RpdmVseSBkb25lIGJ5IHNoaWZ0aW5nIHRoZQotCSAgIG9iamVjdCB0byB0aGUgcmlnaHQuICBUaGUgcmVzdWx0IG11c3QgYmUgbWFza2VkLAotCSAgIGluIGNhc2UgdGhlIG9iamVjdCBjYW1lIGluIGFuZCB3YXMgdHJlYXRlZAotCSAgIGFzIGEgbmVnYXRpdmUgbnVtYmVyLiAgTmVlZGVkPz8/ICovCi0KLQltYXNrID0gKDEgPDwgKDggLSBjbnQpKSAtIDE7Ci0JcmVzID0gKGQgPj4gY250KSAmIG1hc2s7Ci0KLQkvKiBub3cgdGhlIGhpZ2ggc3R1ZmYgd2hpY2ggcm90YXRlZCBhcm91bmQKLQkgICBpbnRvIHRoZSBwb3NpdGlvbnMgQl9jbnQtMiAuLiBCXzAgKi8KLQkvKiBCXyg3KSAuLiBCXyg4LShuLTEpKSA8LSAgYl8obi0yKSAuLiBiXygwKSAqLwotCS8qIHNoaWZ0IGl0IGRvd253YXJkLCA3LShuLTIpID0gOS1uIHBvc2l0aW9ucy4KLQkgICBhbmQgbWFzayBvZmYgdGhlIHJlc3VsdCBiZWZvcmUgb3InaW5nIGluLgotCSAqLwotCXJlcyB8PSAoZCA8PCAoOSAtIGNudCkpOwotCi0JLyogaWYgdGhlIGNhcnJ5IGZsYWcgd2FzIHNldCwgb3IgaXQgaW4uICAqLwotCQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsgICAgIC8qIGNhcnJ5IGZsYWcgaXMgc2V0ICovCi0JICAgIC8qICBCXyg4LW4pIDwtIGNmICovCi0JICAgIHJlcyB8PSAxIDw8ICg4IC0gY250KTsKLQl9Ci0JLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgYmFzZWQgb24gdGhlIHZhcmlhYmxlICJjZiIgKi8KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCS8qIE9WRVJGTE9XIGlzIHNldCAqSUZGKiBjbnQ9PTEsIHRoZW4gaXQgaXMgdGhlCi0JICAgeG9yIG9mIENGIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuICBCbGVjY2suICovCi0JLyogcGFyZW50aGVzaXplZC4uLiAqLwotCQlpZiAoY250ID09IDEpIHsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIob2NmICsgKChkID4+IDYpICYgMHgyKSksCi0JCQkJCQkJCSBGX09GKTsKLQkJfQotCX0KLQlyZXR1cm4gKHU4KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBSQ1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgcmNyX3dvcmQodTE2IGQsIHU4IHMpCi17Ci0JdTMyIHJlcywgY250OwotCXUzMgltYXNrLCBjZiwgb2NmID0gMDsKLQotCS8qIHJvdGF0ZSByaWdodCB0aHJvdWdoIGNhcnJ5ICovCi0JcmVzID0gZDsKLQlpZiAoKGNudCA9IHMgJSAxNykgIT0gMCkgewotCQlpZiAoY250ID09IDEpIHsKLQkJCWNmID0gZCAmIDB4MTsKLQkJCW9jZiA9IEFDQ0VTU19GTEFHKEZfQ0YpICE9IDA7Ci0JCX0gZWxzZQotCQkJY2YgPSAoZCA+PiAoY250IC0gMSkpICYgMHgxOwotCQltYXNrID0gKDEgPDwgKDE2IC0gY250KSkgLSAxOwotCQlyZXMgPSAoZCA+PiBjbnQpICYgbWFzazsKLQkJcmVzIHw9IChkIDw8ICgxNyAtIGNudCkpOwotCQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsKLQkJCXJlcyB8PSAxIDw8ICgxNiAtIGNudCk7Ci0JCX0KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCQlpZiAoY250ID09IDEpIHsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIob2NmICsgKChkID4+IDE0KSAmIDB4MikpLAotCQkJCQkJCQkgRl9PRik7Ci0JCX0KLQl9Ci0JcmV0dXJuICh1MTYpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFJDUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiByY3JfbG9uZyh1MzIgZCwgdTggcykKLXsKLQl1MzIgcmVzLCBjbnQ7Ci0JdTMyIG1hc2ssIGNmLCBvY2YgPSAwOwotCi0JLyogcm90YXRlIHJpZ2h0IHRocm91Z2ggY2FycnkgKi8KLQlyZXMgPSBkOwotCWlmICgoY250ID0gcyAlIDMzKSAhPSAwKSB7Ci0JCWlmIChjbnQgPT0gMSkgewotCQkJY2YgPSBkICYgMHgxOwotCQkJb2NmID0gQUNDRVNTX0ZMQUcoRl9DRikgIT0gMDsKLQkJfSBlbHNlCi0JCQljZiA9IChkID4+IChjbnQgLSAxKSkgJiAweDE7Ci0JCW1hc2sgPSAoMSA8PCAoMzIgLSBjbnQpKSAtIDE7Ci0JCXJlcyA9IChkID4+IGNudCkgJiBtYXNrOwotCQlpZiAoY250ICE9IDEpCi0JCQlyZXMgfD0gKGQgPDwgKDMzIC0gY250KSk7Ci0JCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgeyAgICAgLyogY2FycnkgZmxhZyBpcyBzZXQgKi8KLQkJCXJlcyB8PSAxIDw8ICgzMiAtIGNudCk7Ci0JCX0KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCQlpZiAoY250ID09IDEpIHsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIob2NmICsgKChkID4+IDMwKSAmIDB4MikpLAotCQkJCQkJCQkgRl9PRik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBST0wgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCByb2xfYnl0ZSh1OCBkLCB1OCBzKQotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZXMsIGNudCwgbWFzazsKLQotICAgIC8qIHJvdGF0ZSBsZWZ0ICovCi0gICAgLyoKLSAgICAgICBzIGlzIHRoZSByb3RhdGUgZGlzdGFuY2UuICBJdCB2YXJpZXMgZnJvbSAwIC0gOC4KLSAgICAgICBkIGlzIHRoZSBieXRlIG9iamVjdCByb3RhdGVkLgotCi0gICAgICAgaGF2ZQotCi0gICAgICAgQ0YgIEJfNyAuLi4gQl8wCi0KLSAgICAgICBUaGUgbmV3IHJvdGF0ZSBpcyBkb25lIG1vZCA4LgotICAgICAgIE11Y2ggc2ltcGxlciB0aGFuIHRoZSAicmNsIiBvciAicmNyIiBvcGVyYXRpb25zLgotCi0gICAgICAgSUYgbiA+IDAKLSAgICAgICAxKSBCXyg3KSAuLiBCXyhuKSAgPC0gIGJfKDgtKG4rMSkpIC4uIGJfKDApCi0gICAgICAgMikgQl8obi0xKSAuLiBCXygwKSA8LSAgYl8oNykgLi4gYl8oOC1uKQotCSAqLwotICAgIHJlcyA9IGQ7Ci0JaWYgKChjbnQgPSBzICUgOCkgIT0gMCkgewotCQkvKiBCXyg3KSAuLiBCXyhuKSAgPC0gIGJfKDgtKG4rMSkpIC4uIGJfKDApICovCi0JCXJlcyA9IChkIDw8IGNudCk7Ci0KLQkJLyogQl8obi0xKSAuLiBCXygwKSA8LSAgYl8oNykgLi4gYl8oOC1uKSAqLwotCQltYXNrID0gKDEgPDwgY250KSAtIDE7Ci0JCXJlcyB8PSAoZCA+PiAoOCAtIGNudCkpICYgbWFzazsKLQotCQkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgotCQkgICBiaXQgb2YgdGhlIHJlc3VsdCEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOwotCQkvKiBPVkVSRkxPVyBpcyBzZXQgKklGRiogcz09MSwgdGhlbiBpdCBpcyB0aGUKLQkJICAgeG9yIG9mIENGIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuICBCbGVjY2suICovCi0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgPT0gMSAmJgotCQkJCQkJCSBYT1IyKChyZXMgJiAweDEpICsgKChyZXMgPj4gNikgJiAweDIpKSwKLQkJCQkJCQkgRl9PRik7Ci0JfSBpZiAocyAhPSAwKSB7Ci0JCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCi0JCSAgIGJpdCBvZiB0aGUgcmVzdWx0ISEhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MSwgRl9DRik7Ci0JfQotCXJldHVybiAodTgpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFJPTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiByb2xfd29yZCh1MTYgZCwgdTggcykKLXsKLSAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVzLCBjbnQsIG1hc2s7Ci0KLQlyZXMgPSBkOwotCWlmICgoY250ID0gcyAlIDE2KSAhPSAwKSB7Ci0JCXJlcyA9IChkIDw8IGNudCk7Ci0JCW1hc2sgPSAoMSA8PCBjbnQpIC0gMTsKLQkJcmVzIHw9IChkID4+ICgxNiAtIGNudCkpICYgbWFzazsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxLCBGX0NGKTsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocyA9PSAxICYmCi0JCQkJCQkJIFhPUjIoKHJlcyAmIDB4MSkgKyAoKHJlcyA+PiAxNCkgJiAweDIpKSwKLQkJCQkJCQkgRl9PRik7Ci0JfSBpZiAocyAhPSAwKSB7Ci0JCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCi0JCSAgIGJpdCBvZiB0aGUgcmVzdWx0ISEhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MSwgRl9DRik7Ci0JfQotCXJldHVybiAodTE2KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBST0wgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgcm9sX2xvbmcodTMyIGQsIHU4IHMpCi17Ci0gICAgcmVnaXN0ZXIgdTMyIHJlcywgY250LCBtYXNrOwotCi0JcmVzID0gZDsKLQlpZiAoKGNudCA9IHMgJSAzMikgIT0gMCkgewotCQlyZXMgPSAoZCA8PCBjbnQpOwotCQltYXNrID0gKDEgPDwgY250KSAtIDE7Ci0JCXJlcyB8PSAoZCA+PiAoMzIgLSBjbnQpKSAmIG1hc2s7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MSwgRl9DRik7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgPT0gMSAmJgotCQkJCQkJCSBYT1IyKChyZXMgJiAweDEpICsgKChyZXMgPj4gMzApICYgMHgyKSksCi0JCQkJCQkJIEZfT0YpOwotCX0gaWYgKHMgIT0gMCkgewotCQkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgotCQkgICBiaXQgb2YgdGhlIHJlc3VsdCEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOwotCX0KLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFJPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IHJvcl9ieXRlKHU4IGQsIHU4IHMpCi17Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJlcywgY250LCBtYXNrOwotCi0gICAgLyogcm90YXRlIHJpZ2h0ICovCi0gICAgLyoKLSAgICAgICBzIGlzIHRoZSByb3RhdGUgZGlzdGFuY2UuICBJdCB2YXJpZXMgZnJvbSAwIC0gOC4KLSAgICAgICBkIGlzIHRoZSBieXRlIG9iamVjdCByb3RhdGVkLgotCi0gICAgICAgaGF2ZQotCi0gICAgICAgQl83IC4uLiBCXzAKLQotICAgICAgIFRoZSByb3RhdGUgaXMgZG9uZSBtb2QgOC4KLQotICAgICAgIElGIG4gPiAwCi0gICAgICAgMSkgQl8oOC0obisxKSkgLi4gQl8oMCkgIDwtICBiXyg3KSAuLiBiXyhuKQotICAgICAgIDIpIEJfKDcpIC4uIEJfKDgtbikgPC0gIGJfKG4tMSkgLi4gYl8oMCkKLQkgKi8KLQlyZXMgPSBkOwotCWlmICgoY250ID0gcyAlIDgpICE9IDApIHsgICAgICAgICAgIC8qIG5vdCBhIHR5cG8sIGRvIG5hZGEgaWYgY250PT0wICovCi0JLyogQl8oNykgLi4gQl8oOC1uKSA8LSAgYl8obi0xKSAuLiBiXygwKSAqLwotCXJlcyA9IChkIDw8ICg4IC0gY250KSk7Ci0KLQkvKiBCXyg4LShuKzEpKSAuLiBCXygwKSAgPC0gIGJfKDcpIC4uIGJfKG4pICovCi0JbWFzayA9ICgxIDw8ICg4IC0gY250KSkgLSAxOwotCXJlcyB8PSAoZCA+PiAoY250KSkgJiBtYXNrOwotCi0JLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKLQkgICBiaXQgb2YgdGhlIHJlc3VsdCEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX0NGKTsKLQkJLyogT1ZFUkZMT1cgaXMgc2V0ICpJRkYqIHM9PTEsIHRoZW4gaXQgaXMgdGhlCi0JICAgeG9yIG9mIHRoZSB0d28gbW9zdCBzaWduaWZpY2FudCBiaXRzLiAgQmxlY2NrLiAqLwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYgWE9SMihyZXMgPj4gNiksIEZfT0YpOwotCX0gZWxzZSBpZiAocyAhPSAwKSB7Ci0JCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCi0JCSAgIGJpdCBvZiB0aGUgcmVzdWx0ISEhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfQ0YpOwotCX0KLQlyZXR1cm4gKHU4KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBST1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgcm9yX3dvcmQodTE2IGQsIHU4IHMpCi17Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJlcywgY250LCBtYXNrOwotCi0JcmVzID0gZDsKLQlpZiAoKGNudCA9IHMgJSAxNikgIT0gMCkgewotCQlyZXMgPSAoZCA8PCAoMTYgLSBjbnQpKTsKLQkJbWFzayA9ICgxIDw8ICgxNiAtIGNudCkpIC0gMTsKLQkJcmVzIHw9IChkID4+IChjbnQpKSAmIG1hc2s7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9DRik7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgPT0gMSAmJiBYT1IyKHJlcyA+PiAxNCksIEZfT0YpOwotCX0gZWxzZSBpZiAocyAhPSAwKSB7Ci0JCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCi0JCSAgIGJpdCBvZiB0aGUgcmVzdWx0ISEhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9DRik7Ci0JfQotCXJldHVybiAodTE2KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBST1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgcm9yX2xvbmcodTMyIGQsIHU4IHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlcywgY250LCBtYXNrOwotCi0JcmVzID0gZDsKLQlpZiAoKGNudCA9IHMgJSAzMikgIT0gMCkgewotCQlyZXMgPSAoZCA8PCAoMzIgLSBjbnQpKTsKLQkJbWFzayA9ICgxIDw8ICgzMiAtIGNudCkpIC0gMTsKLQkJcmVzIHw9IChkID4+IChjbnQpKSAmIG1hc2s7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfQ0YpOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYgWE9SMihyZXMgPj4gMzApLCBGX09GKTsKLQl9IGVsc2UgaWYgKHMgIT0gMCkgewotCQkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgotCQkgICBiaXQgb2YgdGhlIHJlc3VsdCEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX0NGKTsKLQl9Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTSEwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBzaGxfYnl0ZSh1OCBkLCB1OCBzKQotewotCXVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7Ci0KLQlpZiAocyA8IDgpIHsKLQkJY250ID0gcyAlIDg7Ci0KLQkJLyogbGFzdCBiaXQgc2hpZnRlZCBvdXQgZ29lcyBpbnRvIGNhcnJ5IGZsYWcgKi8KLQkJaWYgKGNudCA+IDApIHsKLQkJCXJlcyA9IGQgPDwgY250OwotCQkJY2YgPSBkICYgKDEgPDwgKDggLSBjbnQpKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmKSA9PSAwLCBGX1pGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9ICh1OCkgZDsKLQkJfQotCi0JCWlmIChjbnQgPT0gMSkgewotCQkJLyogTmVlZHMgc2ltcGxpZmljYXRpb24uICovCi0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygKLQkJCQkJCQkJCSgoKHJlcyAmIDB4ODApID09IDB4ODApIF4KLQkJCQkJCQkJCSAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLAotCQkJLyogd2FzIChNLng4Ni5SX0ZMRyZGX0NGKT09Rl9DRikpLCAqLwotCQkJCQkJCQkJRl9PRik7Ci0JCX0gZWxzZSB7Ci0JCQlDTEVBUl9GTEFHKEZfT0YpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmVzID0gMDsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPDwgKHMtMSkpICYgMHg4MCwgRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JCUNMRUFSX0ZMQUcoRl9TRik7Ci0JCVNFVF9GTEFHKEZfUEYpOwotCQlTRVRfRkxBRyhGX1pGKTsKLSAgICB9Ci0JcmV0dXJuICh1OClyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0hMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IHNobF93b3JkKHUxNiBkLCB1OCBzKQotewotICAgIHVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7Ci0KLQlpZiAocyA8IDE2KSB7Ci0JCWNudCA9IHMgJSAxNjsKLQkJaWYgKGNudCA+IDApIHsKLQkJCXJlcyA9IGQgPDwgY250OwotCQkJY2YgPSBkICYgKDEgPDwgKDE2IC0gY250KSk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCQl9IGVsc2UgewotCQkJcmVzID0gKHUxNikgZDsKLQkJfQotCi0JCWlmIChjbnQgPT0gMSkgewotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoCi0JCQkJCQkJCQkoKChyZXMgJiAweDgwMDApID09IDB4ODAwMCkgXgotCQkJCQkJCQkJIChBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwKSksCi0JCQkJCQkJCQlGX09GKTsKLQl9IGVsc2UgewotCQkJQ0xFQVJfRkxBRyhGX09GKTsKLQl9Ci0gICAgfSBlbHNlIHsKLQkJcmVzID0gMDsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPDwgKHMtMSkpICYgMHg4MDAwLCBGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkJQ0xFQVJfRkxBRyhGX1NGKTsKLQkJU0VUX0ZMQUcoRl9QRik7Ci0JCVNFVF9GTEFHKEZfWkYpOwotCX0KLQlyZXR1cm4gKHUxNilyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0hMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHNobF9sb25nKHUzMiBkLCB1OCBzKQotewotCXVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7Ci0KLQlpZiAocyA8IDMyKSB7Ci0JCWNudCA9IHMgJSAzMjsKLQkJaWYgKGNudCA+IDApIHsKLQkJCXJlcyA9IGQgPDwgY250OwotCQkJY2YgPSBkICYgKDEgPDwgKDMyIC0gY250KSk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSBkOwotCQl9Ci0JCWlmIChjbnQgPT0gMSkgewotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKCgocmVzICYgMHg4MDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkgXgotCQkJCQkJCQkgIChBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwKSksIEZfT0YpOwotCQl9IGVsc2UgewotCQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJlcyA9IDA7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKChkIDw8IChzLTEpKSAmIDB4ODAwMDAwMDAsIEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCQlDTEVBUl9GTEFHKEZfU0YpOwotCQlTRVRfRkxBRyhGX1BGKTsKLQkJU0VUX0ZMQUcoRl9aRik7Ci0JfQotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0hSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggc2hyX2J5dGUodTggZCwgdTggcykKLXsKLQl1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOwotCi0JaWYgKHMgPCA4KSB7Ci0JCWNudCA9IHMgJSA4OwotCQlpZiAoY250ID4gMCkgewotCQkJY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKLQkJCXJlcyA9IGQgPj4gY250OwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCQl9IGVsc2UgewotCQkJcmVzID0gKHU4KSBkOwotCQl9Ci0KLQkJaWYgKGNudCA9PSAxKSB7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKHJlcyA+PiA2KSwgRl9PRik7Ci0JCX0gZWxzZSB7Ci0JCQlDTEVBUl9GTEFHKEZfT0YpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmVzID0gMDsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPj4gKHMtMSkpICYgMHgxLCBGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkJQ0xFQVJfRkxBRyhGX1NGKTsKLQkJU0VUX0ZMQUcoRl9QRik7Ci0JCVNFVF9GTEFHKEZfWkYpOwotCX0KLQlyZXR1cm4gKHU4KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTSFIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgc2hyX3dvcmQodTE2IGQsIHU4IHMpCi17Ci0JdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKLQotCWlmIChzIDwgMTYpIHsKLQkJY250ID0gcyAlIDE2OwotCQlpZiAoY250ID4gMCkgewotCQkJY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKLQkJCXJlcyA9IGQgPj4gY250OwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9IGQ7Ci0JCX0KLQotCQlpZiAoY250ID09IDEpIHsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIocmVzID4+IDE0KSwgRl9PRik7Ci0JfSBlbHNlIHsKLQkJCUNMRUFSX0ZMQUcoRl9PRik7Ci0JfQotCX0gZWxzZSB7Ci0JCXJlcyA9IDA7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JCVNFVF9GTEFHKEZfWkYpOwotCQlDTEVBUl9GTEFHKEZfU0YpOwotCQlDTEVBUl9GTEFHKEZfUEYpOwotICAgIH0KLQlyZXR1cm4gKHUxNilyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0hSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHNocl9sb25nKHUzMiBkLCB1OCBzKQotewotCXVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7Ci0KLQlpZiAocyA8IDMyKSB7Ci0JCWNudCA9IHMgJSAzMjsKLQkJaWYgKGNudCA+IDApIHsKLQkJCWNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7Ci0JCQlyZXMgPSBkID4+IGNudDsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQl9IGVsc2UgewotCSAgICByZXMgPSBkOwotCX0KLQlpZiAoY250ID09IDEpIHsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIocmVzID4+IDMwKSwgRl9PRik7Ci0JfSBlbHNlIHsKLQkJCUNMRUFSX0ZMQUcoRl9PRik7Ci0JfQotICAgIH0gZWxzZSB7Ci0JcmVzID0gMDsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkJU0VUX0ZMQUcoRl9aRik7Ci0JCUNMRUFSX0ZMQUcoRl9TRik7Ci0JCUNMRUFSX0ZMQUcoRl9QRik7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0FSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggc2FyX2J5dGUodTggZCwgdTggcykKLXsKLQl1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmLCBtYXNrLCBzZjsKLQotCXJlcyA9IGQ7Ci0Jc2YgPSBkICYgMHg4MDsKLSAgICBjbnQgPSBzICUgODsKLQlpZiAoY250ID4gMCAmJiBjbnQgPCA4KSB7Ci0JCW1hc2sgPSAoMSA8PCAoOCAtIGNudCkpIC0gMTsKLQkJY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKLQkJcmVzID0gKGQgPj4gY250KSAmIG1hc2s7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkJaWYgKHNmKSB7Ci0JCQlyZXMgfD0gfm1hc2s7Ci0JCX0KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLSAgICB9IGVsc2UgaWYgKGNudCA+PSA4KSB7Ci0JaWYgKHNmKSB7Ci0JICAgIHJlcyA9IDB4ZmY7Ci0JCQlTRVRfRkxBRyhGX0NGKTsKLQkJCUNMRUFSX0ZMQUcoRl9aRik7Ci0JCQlTRVRfRkxBRyhGX1NGKTsKLQkJCVNFVF9GTEFHKEZfUEYpOwotCQl9IGVsc2UgewotCQkJcmVzID0gMDsKLQkJCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCQlTRVRfRkxBRyhGX1pGKTsKLQkJCUNMRUFSX0ZMQUcoRl9TRik7Ci0JCQlDTEVBUl9GTEFHKEZfUEYpOwotCQl9Ci0JfQotCXJldHVybiAodTgpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNBUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBzYXJfd29yZCh1MTYgZCwgdTggcykKLXsKLSAgICB1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmLCBtYXNrLCBzZjsKLQotICAgIHNmID0gZCAmIDB4ODAwMDsKLSAgICBjbnQgPSBzICUgMTY7Ci0JcmVzID0gZDsKLQlpZiAoY250ID4gMCAmJiBjbnQgPCAxNikgewotCW1hc2sgPSAoMSA8PCAoMTYgLSBjbnQpKSAtIDE7Ci0JY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKLQlyZXMgPSAoZCA+PiBjbnQpICYgbWFzazsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCWlmIChzZikgewotCSAgICByZXMgfD0gfm1hc2s7Ci0JfQotCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLSAgICB9IGVsc2UgaWYgKGNudCA+PSAxNikgewotCWlmIChzZikgewotCSAgICByZXMgPSAweGZmZmY7Ci0JCQlTRVRfRkxBRyhGX0NGKTsKLQkJCUNMRUFSX0ZMQUcoRl9aRik7Ci0JCQlTRVRfRkxBRyhGX1NGKTsKLQkJCVNFVF9GTEFHKEZfUEYpOwotCX0gZWxzZSB7Ci0JICAgIHJlcyA9IDA7Ci0JCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQkJU0VUX0ZMQUcoRl9aRik7Ci0JCQlDTEVBUl9GTEFHKEZfU0YpOwotCQkJQ0xFQVJfRkxBRyhGX1BGKTsKLQl9Ci0gICAgfQotCXJldHVybiAodTE2KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTQVIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgc2FyX2xvbmcodTMyIGQsIHU4IHMpCi17Ci0gICAgdTMyIGNudCwgcmVzLCBjZiwgbWFzaywgc2Y7Ci0KLSAgICBzZiA9IGQgJiAweDgwMDAwMDAwOwotICAgIGNudCA9IHMgJSAzMjsKLQlyZXMgPSBkOwotCWlmIChjbnQgPiAwICYmIGNudCA8IDMyKSB7Ci0JbWFzayA9ICgxIDw8ICgzMiAtIGNudCkpIC0gMTsKLQkJY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKLQlyZXMgPSAoZCA+PiBjbnQpICYgbWFzazsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCWlmIChzZikgewotCSAgICByZXMgfD0gfm1hc2s7Ci0JfQotCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotICAgIH0gZWxzZSBpZiAoY250ID49IDMyKSB7Ci0JaWYgKHNmKSB7Ci0JICAgIHJlcyA9IDB4ZmZmZmZmZmY7Ci0JCQlTRVRfRkxBRyhGX0NGKTsKLQkJCUNMRUFSX0ZMQUcoRl9aRik7Ci0JCQlTRVRfRkxBRyhGX1NGKTsKLQkJCVNFVF9GTEFHKEZfUEYpOwotCQl9IGVsc2UgewotCQkJcmVzID0gMDsKLQkJCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCQlTRVRfRkxBRyhGX1pGKTsKLQkJCUNMRUFSX0ZMQUcoRl9TRik7Ci0JCQlDTEVBUl9GTEFHKEZfUEYpOwotCQl9Ci0JfQotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0hMRCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBzaGxkX3dvcmQgKHUxNiBkLCB1MTYgZmlsbCwgdTggcykKLXsKLQl1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOwotCi0JaWYgKHMgPCAxNikgewotCQljbnQgPSBzICUgMTY7Ci0JCWlmIChjbnQgPiAwKSB7Ci0JCQlyZXMgPSAoZCA8PCBjbnQpIHwgKGZpbGwgPj4gKDE2LWNudCkpOwotCQkJY2YgPSBkICYgKDEgPDwgKDE2IC0gY250KSk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCQl9IGVsc2UgewotCQkJcmVzID0gZDsKLQkJfQotCQlpZiAoY250ID09IDEpIHsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKCgoKHJlcyAmIDB4ODAwMCkgPT0gMHg4MDAwKSBeCi0JCQkJCQkJCSAgKEFDQ0VTU19GTEFHKEZfQ0YpICE9IDApKSwgRl9PRik7Ci0JCX0gZWxzZSB7Ci0JCQlDTEVBUl9GTEFHKEZfT0YpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmVzID0gMDsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPDwgKHMtMSkpICYgMHg4MDAwLCBGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkJQ0xFQVJfRkxBRyhGX1NGKTsKLQkJU0VUX0ZMQUcoRl9QRik7Ci0JCVNFVF9GTEFHKEZfWkYpOwotCX0KLQlyZXR1cm4gKHUxNilyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0hMRCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBzaGxkX2xvbmcgKHUzMiBkLCB1MzIgZmlsbCwgdTggcykKLXsKLQl1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOwotCi0JaWYgKHMgPCAzMikgewotCQljbnQgPSBzICUgMzI7Ci0JCWlmIChjbnQgPiAwKSB7Ci0JCQlyZXMgPSAoZCA8PCBjbnQpIHwgKGZpbGwgPj4gKDMyLWNudCkpOwotCQkJY2YgPSBkICYgKDEgPDwgKDMyIC0gY250KSk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSBkOwotCQl9Ci0JCWlmIChjbnQgPT0gMSkgewotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKCgocmVzICYgMHg4MDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkgXgotCQkJCQkJCQkgIChBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwKSksIEZfT0YpOwotCQl9IGVsc2UgewotCQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJlcyA9IDA7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKChkIDw8IChzLTEpKSAmIDB4ODAwMDAwMDAsIEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCQlDTEVBUl9GTEFHKEZfU0YpOwotCQlTRVRfRkxBRyhGX1BGKTsKLQkJU0VUX0ZMQUcoRl9aRik7Ci0JfQotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0hSRCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBzaHJkX3dvcmQgKHUxNiBkLCB1MTYgZmlsbCwgdTggcykKLXsKLQl1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOwotCi0JaWYgKHMgPCAxNikgewotCQljbnQgPSBzICUgMTY7Ci0JCWlmIChjbnQgPiAwKSB7Ci0JCQljZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOwotCQkJcmVzID0gKGQgPj4gY250KSB8IChmaWxsIDw8ICgxNiAtIGNudCkpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9IGQ7Ci0JCX0KLQotCQlpZiAoY250ID09IDEpIHsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIocmVzID4+IDE0KSwgRl9PRik7Ci0JfSBlbHNlIHsKLQkJCUNMRUFSX0ZMQUcoRl9PRik7Ci0JfQotCX0gZWxzZSB7Ci0JCXJlcyA9IDA7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JCVNFVF9GTEFHKEZfWkYpOwotCQlDTEVBUl9GTEFHKEZfU0YpOwotCQlDTEVBUl9GTEFHKEZfUEYpOwotICAgIH0KLQlyZXR1cm4gKHUxNilyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0hSRCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBzaHJkX2xvbmcgKHUzMiBkLCB1MzIgZmlsbCwgdTggcykKLXsKLQl1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOwotCi0JaWYgKHMgPCAzMikgewotCQljbnQgPSBzICUgMzI7Ci0JCWlmIChjbnQgPiAwKSB7Ci0JCQljZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOwotCQkJcmVzID0gKGQgPj4gY250KSB8IChmaWxsIDw8ICgzMiAtIGNudCkpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZmZmZmYpID09IDAsIEZfWkYpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCQl9IGVsc2UgewotCQkJcmVzID0gZDsKLQkJfQotCQlpZiAoY250ID09IDEpIHsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIocmVzID4+IDMwKSwgRl9PRik7Ci0JfSBlbHNlIHsKLQkJCUNMRUFSX0ZMQUcoRl9PRik7Ci0JfQotCX0gZWxzZSB7Ci0JCXJlcyA9IDA7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JCVNFVF9GTEFHKEZfWkYpOwotCQlDTEVBUl9GTEFHKEZfU0YpOwotCQlDTEVBUl9GTEFHKEZfUEYpOwotICAgIH0KLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNCQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IHNiYl9ieXRlKHU4IGQsIHU4IHMpCi17Ci0gICAgcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLSAgICByZWdpc3RlciB1MzIgYmM7Ci0KLQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCi0JCXJlcyA9IGQgLSBzIC0gMTsKLQllbHNlCi0JCXJlcyA9IGQgLSBzOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KLQliYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAsIEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gNiksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gKHU4KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTQkIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgc2JiX3dvcmQodTE2IGQsIHUxNiBzKQotewotICAgIHJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0gICAgcmVnaXN0ZXIgdTMyIGJjOwotCi0JaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQotCXJlcyA9IGQgLSBzIC0gMTsKLSAgICBlbHNlCi0JcmVzID0gZCAtIHM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KLQliYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAwMCwgRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAxNCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gKHUxNilyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0JCIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHNiYl9sb25nKHUzMiBkLCB1MzIgcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCXJlZ2lzdGVyIHUzMiBiYzsKLQotCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkKLQlyZXMgPSBkIC0gcyAtIDE7Ci0gICAgZWxzZQotCXJlcyA9IGQgLSBzOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KLQliYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAwMDAwMDAsIEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gMzApLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTVUIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBzdWJfYnl0ZSh1OCBkLCB1OCBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0JcmVnaXN0ZXIgdTMyIGJjOwotCi0JcmVzID0gZCAtIHM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLwotCWJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MCwgRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiA2KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOwotCXJldHVybiAodTgpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNVQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBzdWJfd29yZCh1MTYgZCwgdTE2IHMpCi17Ci0gICAgcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLSAgICByZWdpc3RlciB1MzIgYmM7Ci0KLSAgICByZXMgPSBkIC0gczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLwotCWJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MDAwLCBGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDE0KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOwotCXJldHVybiAodTE2KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTVUIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgc3ViX2xvbmcodTMyIGQsIHUzMiBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0JcmVnaXN0ZXIgdTMyIGJjOwotCi0JcmVzID0gZCAtIHM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZmZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLwotCWJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MDAwMDAwMCwgRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAzMCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFRFU1QgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHRlc3RfYnl0ZSh1OCBkLCB1OCBzKQotewotICAgIHJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0KLSAgICByZXMgPSBkICYgczsKLQotCUNMRUFSX0ZMQUcoRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0gICAgLyogQUYgPT0gZG9udCBjYXJlICovCi0JQ0xFQVJfRkxBRyhGX0NGKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBURVNUIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB0ZXN0X3dvcmQodTE2IGQsIHUxNiBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0KLQlyZXMgPSBkICYgczsKLQotCUNMRUFSX0ZMQUcoRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQkvKiBBRiA9PSBkb250IGNhcmUgKi8KLQlDTEVBUl9GTEFHKEZfQ0YpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFRFU1QgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHRlc3RfbG9uZyh1MzIgZCwgdTMyIHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQotCXJlcyA9IGQgJiBzOwotCi0JQ0xFQVJfRkxBRyhGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQkvKiBBRiA9PSBkb250IGNhcmUgKi8KLQlDTEVBUl9GTEFHKEZfQ0YpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFhPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IHhvcl9ieXRlKHU4IGQsIHU4IHMpCi17Ci0JcmVnaXN0ZXIgdTggcmVzOyAgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQotCXJlcyA9IGQgXiBzOwotCUNMRUFSX0ZMQUcoRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMpLCBGX1BGKTsKLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNMRUFSX0ZMQUcoRl9BRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBYT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgeG9yX3dvcmQodTE2IGQsIHUxNiBzKQotewotCXJlZ2lzdGVyIHUxNiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0KLQlyZXMgPSBkIF4gczsKLQlDTEVBUl9GTEFHKEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDTEVBUl9GTEFHKEZfQUYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgWE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHhvcl9sb25nKHUzMiBkLCB1MzIgcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCi0JcmVzID0gZCBeIHM7Ci0JQ0xFQVJfRkxBRyhGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNMRUFSX0ZMQUcoRl9BRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBJTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBpbXVsX2J5dGUodTggcykKLXsKLQlzMTYgcmVzID0gKHMxNikoKHM4KU0ueDg2LlJfQUwgKiAoczgpcyk7Ci0KLQlNLng4Ni5SX0FYID0gcmVzOwotCWlmICgoKE0ueDg2LlJfQUwgJiAweDgwKSA9PSAwICYmIE0ueDg2LlJfQUggPT0gMHgwMCkgfHwKLQkJKChNLng4Ni5SX0FMICYgMHg4MCkgIT0gMCAmJiBNLng4Ni5SX0FIID09IDB4RkYpKSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JfSBlbHNlIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBJTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBpbXVsX3dvcmQodTE2IHMpCi17Ci0JczMyIHJlcyA9IChzMTYpTS54ODYuUl9BWCAqIChzMTYpczsKLQotCU0ueDg2LlJfQVggPSAodTE2KXJlczsKLQlNLng4Ni5SX0RYID0gKHUxNikocmVzID4+IDE2KTsKLQlpZiAoKChNLng4Ni5SX0FYICYgMHg4MDAwKSA9PSAwICYmIE0ueDg2LlJfRFggPT0gMHgwMCkgfHwKLQkJKChNLng4Ni5SX0FYICYgMHg4MDAwKSAhPSAwICYmIE0ueDg2LlJfRFggPT0gMHhGRikpIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQl9IGVsc2UgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIElNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGltdWxfbG9uZ19kaXJlY3QodTMyICpyZXNfbG8sIHUzMiogcmVzX2hpLHUzMiBkLCB1MzIgcykKLXsKLSNpZmRlZglfX0hBU19MT05HX0xPTkdfXwotCXM2NCByZXMgPSAoczMyKWQgKiAoczMyKXM7Ci0KLQkqcmVzX2xvID0gKHUzMilyZXM7Ci0JKnJlc19oaSA9ICh1MzIpKHJlcyA+PiAzMik7Ci0jZWxzZQotCXUzMglkX2xvLGRfaGksZF9zaWduOwotCXUzMglzX2xvLHNfaGksc19zaWduOwotCXUzMglybG9fbG8scmxvX2hpLHJoaV9sbzsKLQotCWlmICgoZF9zaWduID0gZCAmIDB4ODAwMDAwMDApICE9IDApCi0JCWQgPSAtZDsKLQlkX2xvID0gZCAmIDB4RkZGRjsKLQlkX2hpID0gZCA+PiAxNjsKLQlpZiAoKHNfc2lnbiA9IHMgJiAweDgwMDAwMDAwKSAhPSAwKQotCQlzID0gLXM7Ci0Jc19sbyA9IHMgJiAweEZGRkY7Ci0Jc19oaSA9IHMgPj4gMTY7Ci0JcmxvX2xvID0gZF9sbyAqIHNfbG87Ci0JcmxvX2hpID0gKGRfaGkgKiBzX2xvICsgZF9sbyAqIHNfaGkpICsgKHJsb19sbyA+PiAxNik7Ci0JcmhpX2xvID0gZF9oaSAqIHNfaGkgKyAocmxvX2hpID4+IDE2KTsKLQkqcmVzX2xvID0gKHJsb19oaSA8PCAxNikgfCAocmxvX2xvICYgMHhGRkZGKTsKLQkqcmVzX2hpID0gcmhpX2xvOwotCWlmIChkX3NpZ24gIT0gc19zaWduKSB7Ci0JCWQgPSB+KnJlc19sbzsKLQkJcyA9ICgoKGQgJiAweEZGRkYpICsgMSkgPj4gMTYpICsgKGQgPj4gMTYpOwotCQkqcmVzX2xvID0gfipyZXNfbG8rMTsKLQkJKnJlc19oaSA9IH4qcmVzX2hpKyhzID4+IDE2KTsKLQkJfQotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgSU1VTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaW11bF9sb25nKHUzMiBzKQotewotCWltdWxfbG9uZ19kaXJlY3QoJk0ueDg2LlJfRUFYLCZNLng4Ni5SX0VEWCxNLng4Ni5SX0VBWCxzKTsKLQlpZiAoKChNLng4Ni5SX0VBWCAmIDB4ODAwMDAwMDApID09IDAgJiYgTS54ODYuUl9FRFggPT0gMHgwMCkgfHwKLQkJKChNLng4Ni5SX0VBWCAmIDB4ODAwMDAwMDApICE9IDAgJiYgTS54ODYuUl9FRFggPT0gMHhGRikpIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQl9IGVsc2UgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIE1VTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbXVsX2J5dGUodTggcykKLXsKLQl1MTYgcmVzID0gKHUxNikoTS54ODYuUl9BTCAqIHMpOwotCi0JTS54ODYuUl9BWCA9IHJlczsKLQlpZiAoTS54ODYuUl9BSCA9PSAwKSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JfSBlbHNlIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIG11bF93b3JkKHUxNiBzKQotewotCXUzMiByZXMgPSBNLng4Ni5SX0FYICogczsKLQotCU0ueDg2LlJfQVggPSAodTE2KXJlczsKLQlNLng4Ni5SX0RYID0gKHUxNikocmVzID4+IDE2KTsKLQlpZiAoTS54ODYuUl9EWCA9PSAwKSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0gICAgfSBlbHNlIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIG11bF9sb25nKHUzMiBzKQotewotI2lmZGVmCV9fSEFTX0xPTkdfTE9OR19fCi0JdTY0IHJlcyA9ICh1MzIpTS54ODYuUl9FQVggKiAodTMyKXM7Ci0KLQlNLng4Ni5SX0VBWCA9ICh1MzIpcmVzOwotCU0ueDg2LlJfRURYID0gKHUzMikocmVzID4+IDMyKTsKLSNlbHNlCi0JdTMyCWEsYV9sbyxhX2hpOwotCXUzMglzX2xvLHNfaGk7Ci0JdTMyCXJsb19sbyxybG9faGkscmhpX2xvOwotCi0JYSA9IE0ueDg2LlJfRUFYOwotCWFfbG8gPSBhICYgMHhGRkZGOwotCWFfaGkgPSBhID4+IDE2OwotCXNfbG8gPSBzICYgMHhGRkZGOwotCXNfaGkgPSBzID4+IDE2OwotCXJsb19sbyA9IGFfbG8gKiBzX2xvOwotCXJsb19oaSA9IChhX2hpICogc19sbyArIGFfbG8gKiBzX2hpKSArIChybG9fbG8gPj4gMTYpOwotCXJoaV9sbyA9IGFfaGkgKiBzX2hpICsgKHJsb19oaSA+PiAxNik7Ci0JTS54ODYuUl9FQVggPSAocmxvX2hpIDw8IDE2KSB8IChybG9fbG8gJiAweEZGRkYpOwotCU0ueDg2LlJfRURYID0gcmhpX2xvOwotI2VuZGlmCi0KLQlpZiAoTS54ODYuUl9FRFggPT0gMCkgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCX0gZWxzZSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgSURJViBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaWRpdl9ieXRlKHU4IHMpCi17Ci0gICAgczMyIGR2ZCwgZGl2LCBtb2Q7Ci0KLQlkdmQgPSAoczE2KU0ueDg2LlJfQVg7Ci0JaWYgKHMgPT0gMCkgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQlyZXR1cm47Ci0JfQotCWRpdiA9IGR2ZCAvIChzOClzOwotCW1vZCA9IGR2ZCAlIChzOClzOwotCWlmIChhYnMoZGl2KSA+IDB4N2YpIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JCXJldHVybjsKLQl9Ci0JTS54ODYuUl9BTCA9IChzOCkgZGl2OwotCU0ueDg2LlJfQUggPSAoczgpIG1vZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBJRElWIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBpZGl2X3dvcmQodTE2IHMpCi17Ci0JczMyIGR2ZCwgZGl2LCBtb2Q7Ci0KLQlkdmQgPSAoKChzMzIpTS54ODYuUl9EWCkgPDwgMTYpIHwgTS54ODYuUl9BWDsKLQlpZiAocyA9PSAwKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCQlyZXR1cm47Ci0JfQotCWRpdiA9IGR2ZCAvIChzMTYpczsKLQltb2QgPSBkdmQgJSAoczE2KXM7Ci0JaWYgKGFicyhkaXYpID4gMHg3ZmZmKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCQlyZXR1cm47Ci0JfQotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ0xFQVJfRkxBRyhGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhkaXYgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKG1vZCAmIDB4ZmYpLCBGX1BGKTsKLQotCU0ueDg2LlJfQVggPSAodTE2KWRpdjsKLQlNLng4Ni5SX0RYID0gKHUxNiltb2Q7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgSURJViBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaWRpdl9sb25nKHUzMiBzKQotewotI2lmZGVmCV9fSEFTX0xPTkdfTE9OR19fCi0JczY0IGR2ZCwgZGl2LCBtb2Q7Ci0KLQlkdmQgPSAoKChzNjQpTS54ODYuUl9FRFgpIDw8IDMyKSB8IE0ueDg2LlJfRUFYOwotCWlmIChzID09IDApIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JCXJldHVybjsKLQl9Ci0JZGl2ID0gZHZkIC8gKHMzMilzOwotCW1vZCA9IGR2ZCAlIChzMzIpczsKLQlpZiAoYWJzKGRpdikgPiAweDdmZmZmZmZmKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCQlyZXR1cm47Ci0JfQotI2Vsc2UKLQlzMzIgZGl2ID0gMCwgbW9kOwotCXMzMiBoX2R2ZCA9IE0ueDg2LlJfRURYOwotCXUzMiBsX2R2ZCA9IE0ueDg2LlJfRUFYOwotCXUzMiBhYnNfcyA9IHMgJiAweDdGRkZGRkZGOwotCXUzMiBhYnNfaF9kdmQgPSBoX2R2ZCAmIDB4N0ZGRkZGRkY7Ci0JdTMyIGhfcyA9IGFic19zID4+IDE7Ci0JdTMyIGxfcyA9IGFic19zIDw8IDMxOwotCWludCBjb3VudGVyID0gMzE7Ci0JaW50IGNhcnJ5OwotCi0JaWYgKHMgPT0gMCkgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQkJcmV0dXJuOwotCX0KLQlkbyB7Ci0JCWRpdiA8PD0gMTsKLQkJY2FycnkgPSAobF9kdmQgPj0gbF9zKSA/IDAgOiAxOwotCi0JCWlmIChhYnNfaF9kdmQgPCAoaF9zICsgY2FycnkpKSB7Ci0JCQloX3MgPj49IDE7Ci0JCQlsX3MgPSBhYnNfcyA8PCAoLS1jb3VudGVyKTsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgewotCQkJYWJzX2hfZHZkIC09IChoX3MgKyBjYXJyeSk7Ci0JCQlsX2R2ZCA9IGNhcnJ5ID8gKCgweEZGRkZGRkZGIC0gbF9zKSArIGxfZHZkICsgMSkKLQkJCQk6IChsX2R2ZCAtIGxfcyk7Ci0JCQloX3MgPj49IDE7Ci0JCQlsX3MgPSBhYnNfcyA8PCAoLS1jb3VudGVyKTsKLQkJCWRpdiB8PSAxOwotCQkJY29udGludWU7Ci0JCX0KLQotCX0gd2hpbGUgKGNvdW50ZXIgPiAtMSk7Ci0JLyogb3ZlcmZsb3cgKi8KLQlpZiAoYWJzX2hfZHZkIHx8IChsX2R2ZCA+IGFic19zKSkgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQkJcmV0dXJuOwotCX0KLQkvKiBzaWduICovCi0JZGl2IHw9ICgoaF9kdmQgJiAweDEwMDAwMDAwKSBeIChzICYgMHgxMDAwMDAwMCkpOwotCW1vZCA9IGxfZHZkOwotCi0jZW5kaWYKLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNMRUFSX0ZMQUcoRl9BRik7Ci0JQ0xFQVJfRkxBRyhGX1NGKTsKLQlTRVRfRkxBRyhGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkobW9kICYgMHhmZiksIEZfUEYpOwotCi0JTS54ODYuUl9FQVggPSAodTMyKWRpdjsKLQlNLng4Ni5SX0VEWCA9ICh1MzIpbW9kOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIERJViBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZGl2X2J5dGUodTggcykKLXsKLQl1MzIgZHZkLCBkaXYsIG1vZDsKLQotCWR2ZCA9IE0ueDg2LlJfQVg7Ci0gICAgaWYgKHMgPT0gMCkgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQlyZXR1cm47Ci0gICAgfQotCWRpdiA9IGR2ZCAvICh1OClzOwotCW1vZCA9IGR2ZCAlICh1OClzOwotCWlmIChhYnMoZGl2KSA+IDB4ZmYpIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JcmV0dXJuOwotCX0KLQlNLng4Ni5SX0FMID0gKHU4KWRpdjsKLQlNLng4Ni5SX0FIID0gKHU4KW1vZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBESVYgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGRpdl93b3JkKHUxNiBzKQotewotCXUzMiBkdmQsIGRpdiwgbW9kOwotCi0JZHZkID0gKCgodTMyKU0ueDg2LlJfRFgpIDw8IDE2KSB8IE0ueDg2LlJfQVg7Ci0JaWYgKHMgPT0gMCkgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQlyZXR1cm47Ci0gICAgfQotCWRpdiA9IGR2ZCAvICh1MTYpczsKLQltb2QgPSBkdmQgJSAodTE2KXM7Ci0JaWYgKGFicyhkaXYpID4gMHhmZmZmKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCQlyZXR1cm47Ci0JfQotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ0xFQVJfRkxBRyhGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhkaXYgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKG1vZCAmIDB4ZmYpLCBGX1BGKTsKLQotCU0ueDg2LlJfQVggPSAodTE2KWRpdjsKLQlNLng4Ni5SX0RYID0gKHUxNiltb2Q7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgRElWIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBkaXZfbG9uZyh1MzIgcykKLXsKLSNpZmRlZglfX0hBU19MT05HX0xPTkdfXwotCXU2NCBkdmQsIGRpdiwgbW9kOwotCi0JZHZkID0gKCgodTY0KU0ueDg2LlJfRURYKSA8PCAzMikgfCBNLng4Ni5SX0VBWDsKLQlpZiAocyA9PSAwKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCQlyZXR1cm47Ci0JfQotCWRpdiA9IGR2ZCAvICh1MzIpczsKLQltb2QgPSBkdmQgJSAodTMyKXM7Ci0JaWYgKGFicyhkaXYpID4gMHhmZmZmZmZmZikgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQkJcmV0dXJuOwotCX0KLSNlbHNlCi0JczMyIGRpdiA9IDAsIG1vZDsKLQlzMzIgaF9kdmQgPSBNLng4Ni5SX0VEWDsKLQl1MzIgbF9kdmQgPSBNLng4Ni5SX0VBWDsKLQotCXUzMiBoX3MgPSBzOwotCXUzMiBsX3MgPSAwOwotCWludCBjb3VudGVyID0gMzI7Ci0JaW50IGNhcnJ5OwotCi0JaWYgKHMgPT0gMCkgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQkJcmV0dXJuOwotCX0KLQlkbyB7Ci0JCWRpdiA8PD0gMTsKLQkJY2FycnkgPSAobF9kdmQgPj0gbF9zKSA/IDAgOiAxOwotCi0JCWlmIChoX2R2ZCA8IChoX3MgKyBjYXJyeSkpIHsKLQkJCWhfcyA+Pj0gMTsKLQkJCWxfcyA9IHMgPDwgKC0tY291bnRlcik7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCWhfZHZkIC09IChoX3MgKyBjYXJyeSk7Ci0JCQlsX2R2ZCA9IGNhcnJ5ID8gKCgweEZGRkZGRkZGIC0gbF9zKSArIGxfZHZkICsgMSkKLQkJCQk6IChsX2R2ZCAtIGxfcyk7Ci0JCQloX3MgPj49IDE7Ci0JCQlsX3MgPSBzIDw8ICgtLWNvdW50ZXIpOwotCQkJZGl2IHw9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JfSB3aGlsZSAoY291bnRlciA+IC0xKTsKLQkvKiBvdmVyZmxvdyAqLwotCWlmIChoX2R2ZCB8fCAobF9kdmQgPiBzKSkgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQkJcmV0dXJuOwotCX0KLQltb2QgPSBsX2R2ZDsKLSNlbmRpZgotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ0xFQVJfRkxBRyhGX0FGKTsKLQlDTEVBUl9GTEFHKEZfU0YpOwotCVNFVF9GTEFHKEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShtb2QgJiAweGZmKSwgRl9QRik7Ci0KLQlNLng4Ni5SX0VBWCA9ICh1MzIpZGl2OwotCU0ueDg2LlJfRURYID0gKHUzMiltb2Q7Ci19Ci0KLSNlbmRpZgkvKiBfX0hBVkVfSU5MSU5FX0FTU0VNQkxFUl9fICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgSU4gc3RyaW5nIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBpbnMoaW50IHNpemUpCi17Ci0JaW50IGluYyA9IHNpemU7Ci0KLQlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpIHsKLQkJaW5jID0gLXNpemU7Ci0JfQotCWlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKLQkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCi0JLyogaW4gdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQkJdTMyIGNvdW50ID0gKChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgPwotCQkJCQkgTS54ODYuUl9FQ1ggOiBNLng4Ni5SX0NYKTsKLQlzd2l0Y2ggKHNpemUpIHsKLQkgIGNhc2UgMToKLQkgICAgd2hpbGUgKGNvdW50LS0pIHsKLQkJCQlzdG9yZV9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksCi0JCQkJCQkJCQkoKnN5c19pbmIpKE0ueDg2LlJfRFgpKTsKLQkJCQlNLng4Ni5SX0RJICs9IGluYzsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAyOgotCSAgICB3aGlsZSAoY291bnQtLSkgewotCQkJCXN0b3JlX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwKLQkJCQkJCQkJCSgqc3lzX2ludykoTS54ODYuUl9EWCkpOwotCQkJCU0ueDg2LlJfREkgKz0gaW5jOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCSAgICB3aGlsZSAoY291bnQtLSkgewotCQkJCXN0b3JlX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwKLQkJCQkJCQkJCSgqc3lzX2lubCkoTS54ODYuUl9EWCkpOwotCQkJCU0ueDg2LlJfREkgKz0gaW5jOwotCQlicmVhazsKLQkgICAgfQotCX0KLQkJTS54ODYuUl9DWCA9IDA7Ci0JCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQkJTS54ODYuUl9FQ1ggPSAwOwotCX0KLQkJTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7Ci0gICAgfSBlbHNlIHsKLQlzd2l0Y2ggKHNpemUpIHsKLQkgIGNhc2UgMToKLQkJCXN0b3JlX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwKLQkJCQkJCQkJKCpzeXNfaW5iKShNLng4Ni5SX0RYKSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCQkJc3RvcmVfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLAotCQkJCQkJCQkoKnN5c19pbncpKE0ueDg2LlJfRFgpKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JCQlzdG9yZV9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksCi0JCQkJCQkJCSgqc3lzX2lubCkoTS54ODYuUl9EWCkpOwotCSAgICBicmVhazsKLQl9Ci0JCU0ueDg2LlJfREkgKz0gaW5jOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBPVVQgc3RyaW5nIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBvdXRzKGludCBzaXplKQotewotICAgIGludCBpbmMgPSBzaXplOwotCi0JaWYgKEFDQ0VTU19GTEFHKEZfREYpKSB7Ci0JaW5jID0gLXNpemU7Ci0gICAgfQotCWlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKLQkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCi0JLyogb3V0IHVudGlsIENYIGlzIFpFUk8uICovCi0JCXUzMiBjb3VudCA9ICgoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpID8KLQkJCQkJIE0ueDg2LlJfRUNYIDogTS54ODYuUl9DWCk7Ci0Jc3dpdGNoIChzaXplKSB7Ci0JICBjYXNlIDE6Ci0JICAgIHdoaWxlIChjb3VudC0tKSB7Ci0JCQkJKCpzeXNfb3V0YikoTS54ODYuUl9EWCwKLQkJCQkJCSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfU0kpKTsKLQkJCQlNLng4Ni5SX1NJICs9IGluYzsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAyOgotCSAgICB3aGlsZSAoY291bnQtLSkgewotCQkJCSgqc3lzX291dHcpKE0ueDg2LlJfRFgsCi0JCQkJCQkgZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX1NJKSk7Ci0JCQkJTS54ODYuUl9TSSArPSBpbmM7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JICAgIHdoaWxlIChjb3VudC0tKSB7Ci0JCQkJKCpzeXNfb3V0bCkoTS54ODYuUl9EWCwKLQkJCQkJCSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfU0kpKTsKLQkJCQlNLng4Ni5SX1NJICs9IGluYzsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0JCU0ueDg2LlJfQ1ggPSAwOwotCQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJCU0ueDg2LlJfRUNYID0gMDsKLQl9Ci0JCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOwotICAgIH0gZWxzZSB7Ci0Jc3dpdGNoIChzaXplKSB7Ci0JICBjYXNlIDE6Ci0JCQkoKnN5c19vdXRiKShNLng4Ni5SX0RYLAotCQkJCQkgZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX1NJKSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCQkJKCpzeXNfb3V0dykoTS54ODYuUl9EWCwKLQkJCQkJIGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9TSSkpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkJCSgqc3lzX291dGwpKE0ueDg2LlJfRFgsCi0JCQkJCSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfU0kpKTsKLQkgICAgYnJlYWs7Ci0JfQotCQlNLng4Ni5SX1NJICs9IGluYzsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkcgktIEFkZHJlc3MgdG8gZmV0Y2ggd29yZCBmcm9tCi0KLVJFTUFSS1M6Ci1GZXRjaGVzIGEgd29yZCBmcm9tIGVtdWxhdG9yIG1lbW9yeSB1c2luZyBhbiBhYnNvbHV0ZSBhZGRyZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBtZW1fYWNjZXNzX3dvcmQoaW50IGFkZHIpCi17Ci1EQigJaWYgKENIRUNLX01FTV9BQ0NFU1MoKSkKLQkgIHg4NmVtdV9jaGVja19tZW1fYWNjZXNzKGFkZHIpOykKLQlyZXR1cm4gKCpzeXNfcmR3KShhZGRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QdXNoZXMgYSB3b3JkIG9udG8gdGhlIHN0YWNrLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMsIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwdXNoX3dvcmQodTE2IHcpCi17Ci1EQigJaWYgKENIRUNLX1NQX0FDQ0VTUygpKQotCSAgeDg2ZW11X2NoZWNrX3NwX2FjY2VzcygpOykKLQlNLng4Ni5SX1NQIC09IDI7Ci0JKCpzeXNfd3J3KSgoKHUzMilNLng4Ni5SX1NTIDw8IDQpICArIE0ueDg2LlJfU1AsIHcpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVB1c2hlcyBhIGxvbmcgb250byB0aGUgc3RhY2suCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcywgYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHB1c2hfbG9uZyh1MzIgdykKLXsKLURCKAlpZiAoQ0hFQ0tfU1BfQUNDRVNTKCkpCi0JICB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzKCk7KQotCU0ueDg2LlJfU1AgLT0gNDsKLQkoKnN5c193cmwpKCgodTMyKU0ueDg2LlJfU1MgPDwgNCkgICsgTS54ODYuUl9TUCwgdyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUG9wcyBhIHdvcmQgZnJvbSB0aGUgc3RhY2suCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcywgYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgcG9wX3dvcmQodm9pZCkKLXsKLQlyZWdpc3RlciB1MTYgcmVzOwotCi1EQigJaWYgKENIRUNLX1NQX0FDQ0VTUygpKQotCSAgeDg2ZW11X2NoZWNrX3NwX2FjY2VzcygpOykKLQlyZXMgPSAoKnN5c19yZHcpKCgodTMyKU0ueDg2LlJfU1MgPDwgNCkgICsgTS54ODYuUl9TUCk7Ci0JTS54ODYuUl9TUCArPSAyOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUG9wcyBhIGxvbmcgZnJvbSB0aGUgc3RhY2suCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcywgYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgcG9wX2xvbmcodm9pZCkKLXsKLSAgICByZWdpc3RlciB1MzIgcmVzOwotCi1EQigJaWYgKENIRUNLX1NQX0FDQ0VTUygpKQotCSAgeDg2ZW11X2NoZWNrX3NwX2FjY2VzcygpOykKLQlyZXMgPSAoKnN5c19yZGwpKCgodTMyKU0ueDg2LlJfU1MgPDwgNCkgICsgTS54ODYuUl9TUCk7Ci0JTS54ODYuUl9TUCArPSA0OwotICAgIHJldHVybiByZXM7Ci19Ci0KLSNpZmRlZglfX0hBVkVfSU5MSU5FX0FTU0VNQkxFUl9fCi0KLXUxNiBhYWFfd29yZCAodTE2IGQpCi17IHJldHVybiBhYWFfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQotCi11MTYgYWFzX3dvcmQgKHUxNiBkKQoteyByZXR1cm4gYWFzX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KLQotdTE2IGFhZF93b3JkICh1MTYgZCkKLXsgcmV0dXJuIGFhZF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9Ci0KLXUxNiBhYW1fd29yZCAodTggZCkKLXsgcmV0dXJuIGFhbV93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9Ci0KLXU4IGFkY19ieXRlICh1OCBkLCB1OCBzKQoteyByZXR1cm4gYWRjX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgYWRjX3dvcmQgKHUxNiBkLCB1MTYgcykKLXsgcmV0dXJuIGFkY193b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTMyIGFkY19sb25nICh1MzIgZCwgdTMyIHMpCi17IHJldHVybiBhZGNfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXU4IGFkZF9ieXRlICh1OCBkLCB1OCBzKQoteyByZXR1cm4gYWRkX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgYWRkX3dvcmQgKHUxNiBkLCB1MTYgcykKLXsgcmV0dXJuIGFkZF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTMyIGFkZF9sb25nICh1MzIgZCwgdTMyIHMpCi17IHJldHVybiBhZGRfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXU4IGFuZF9ieXRlICh1OCBkLCB1OCBzKQoteyByZXR1cm4gYW5kX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgYW5kX3dvcmQgKHUxNiBkLCB1MTYgcykKLXsgcmV0dXJuIGFuZF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTMyIGFuZF9sb25nICh1MzIgZCwgdTMyIHMpCi17IHJldHVybiBhbmRfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXU4IGNtcF9ieXRlICh1OCBkLCB1OCBzKQoteyByZXR1cm4gY21wX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgY21wX3dvcmQgKHUxNiBkLCB1MTYgcykKLXsgcmV0dXJuIGNtcF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTMyIGNtcF9sb25nICh1MzIgZCwgdTMyIHMpCi17IHJldHVybiBjbXBfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXU4IGRhYV9ieXRlICh1OCBkKQoteyByZXR1cm4gZGFhX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KLQotdTggZGFzX2J5dGUgKHU4IGQpCi17IHJldHVybiBkYXNfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQotCi11OCBkZWNfYnl0ZSAodTggZCkKLXsgcmV0dXJuIGRlY19ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9Ci0KLXUxNiBkZWNfd29yZCAodTE2IGQpCi17IHJldHVybiBkZWNfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQotCi11MzIgZGVjX2xvbmcgKHUzMiBkKQoteyByZXR1cm4gZGVjX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KLQotdTggaW5jX2J5dGUgKHU4IGQpCi17IHJldHVybiBpbmNfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQotCi11MTYgaW5jX3dvcmQgKHUxNiBkKQoteyByZXR1cm4gaW5jX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KLQotdTMyIGluY19sb25nICh1MzIgZCkKLXsgcmV0dXJuIGluY19sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9Ci0KLXU4IG9yX2J5dGUgKHU4IGQsIHU4IHMpCi17IHJldHVybiBvcl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IG9yX3dvcmQgKHUxNiBkLCB1MTYgcykKLXsgcmV0dXJuIG9yX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MzIgb3JfbG9uZyAodTMyIGQsIHUzMiBzKQoteyByZXR1cm4gb3JfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXU4IG5lZ19ieXRlICh1OCBzKQoteyByZXR1cm4gbmVnX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcscyk7IH0KLQotdTE2IG5lZ193b3JkICh1MTYgcykKLXsgcmV0dXJuIG5lZ193b3JkX2FzbSgmTS54ODYuUl9FRkxHLHMpOyB9Ci0KLXUzMiBuZWdfbG9uZyAodTMyIHMpCi17IHJldHVybiBuZWdfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxzKTsgfQotCi11OCBub3RfYnl0ZSAodTggcykKLXsgcmV0dXJuIG5vdF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLHMpOyB9Ci0KLXUxNiBub3Rfd29yZCAodTE2IHMpCi17IHJldHVybiBub3Rfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxzKTsgfQotCi11MzIgbm90X2xvbmcgKHUzMiBzKQoteyByZXR1cm4gbm90X2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcscyk7IH0KLQotdTggcmNsX2J5dGUgKHU4IGQsIHU4IHMpCi17IHJldHVybiByY2xfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiByY2xfd29yZCAodTE2IGQsIHU4IHMpCi17IHJldHVybiByY2xfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUzMiByY2xfbG9uZyAodTMyIGQsIHU4IHMpCi17IHJldHVybiByY2xfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXU4IHJjcl9ieXRlICh1OCBkLCB1OCBzKQoteyByZXR1cm4gcmNyX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgcmNyX3dvcmQgKHUxNiBkLCB1OCBzKQoteyByZXR1cm4gcmNyX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MzIgcmNyX2xvbmcgKHUzMiBkLCB1OCBzKQoteyByZXR1cm4gcmNyX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11OCByb2xfYnl0ZSAodTggZCwgdTggcykKLXsgcmV0dXJuIHJvbF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IHJvbF93b3JkICh1MTYgZCwgdTggcykKLXsgcmV0dXJuIHJvbF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTMyIHJvbF9sb25nICh1MzIgZCwgdTggcykKLXsgcmV0dXJuIHJvbF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTggcm9yX2J5dGUgKHU4IGQsIHU4IHMpCi17IHJldHVybiByb3JfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiByb3Jfd29yZCAodTE2IGQsIHU4IHMpCi17IHJldHVybiByb3Jfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUzMiByb3JfbG9uZyAodTMyIGQsIHU4IHMpCi17IHJldHVybiByb3JfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXU4IHNobF9ieXRlICh1OCBkLCB1OCBzKQoteyByZXR1cm4gc2hsX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgc2hsX3dvcmQgKHUxNiBkLCB1OCBzKQoteyByZXR1cm4gc2hsX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MzIgc2hsX2xvbmcgKHUzMiBkLCB1OCBzKQoteyByZXR1cm4gc2hsX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11OCBzaHJfYnl0ZSAodTggZCwgdTggcykKLXsgcmV0dXJuIHNocl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IHNocl93b3JkICh1MTYgZCwgdTggcykKLXsgcmV0dXJuIHNocl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTMyIHNocl9sb25nICh1MzIgZCwgdTggcykKLXsgcmV0dXJuIHNocl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTggc2FyX2J5dGUgKHU4IGQsIHU4IHMpCi17IHJldHVybiBzYXJfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiBzYXJfd29yZCAodTE2IGQsIHU4IHMpCi17IHJldHVybiBzYXJfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUzMiBzYXJfbG9uZyAodTMyIGQsIHU4IHMpCi17IHJldHVybiBzYXJfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiBzaGxkX3dvcmQgKHUxNiBkLCB1MTYgZmlsbCwgdTggcykKLXsgcmV0dXJuIHNobGRfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLGZpbGwscyk7IH0KLQotdTMyIHNobGRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKQoteyByZXR1cm4gc2hsZF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQsZmlsbCxzKTsgfQotCi11MTYgc2hyZF93b3JkICh1MTYgZCwgdTE2IGZpbGwsIHU4IHMpCi17IHJldHVybiBzaHJkX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxmaWxsLHMpOyB9Ci0KLXUzMiBzaHJkX2xvbmcgKHUzMiBkLCB1MzIgZmlsbCwgdTggcykKLXsgcmV0dXJuIHNocmRfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLGZpbGwscyk7IH0KLQotdTggc2JiX2J5dGUgKHU4IGQsIHU4IHMpCi17IHJldHVybiBzYmJfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiBzYmJfd29yZCAodTE2IGQsIHUxNiBzKQoteyByZXR1cm4gc2JiX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MzIgc2JiX2xvbmcgKHUzMiBkLCB1MzIgcykKLXsgcmV0dXJuIHNiYl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTggc3ViX2J5dGUgKHU4IGQsIHU4IHMpCi17IHJldHVybiBzdWJfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiBzdWJfd29yZCAodTE2IGQsIHUxNiBzKQoteyByZXR1cm4gc3ViX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MzIgc3ViX2xvbmcgKHUzMiBkLCB1MzIgcykKLXsgcmV0dXJuIHN1Yl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdm9pZCB0ZXN0X2J5dGUgKHU4IGQsIHU4IHMpCi17IHRlc3RfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXZvaWQgdGVzdF93b3JkICh1MTYgZCwgdTE2IHMpCi17IHRlc3Rfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXZvaWQgdGVzdF9sb25nICh1MzIgZCwgdTMyIHMpCi17IHRlc3RfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXU4IHhvcl9ieXRlICh1OCBkLCB1OCBzKQoteyByZXR1cm4geG9yX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgeG9yX3dvcmQgKHUxNiBkLCB1MTYgcykKLXsgcmV0dXJuIHhvcl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTMyIHhvcl9sb25nICh1MzIgZCwgdTMyIHMpCi17IHJldHVybiB4b3JfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXZvaWQgaW11bF9ieXRlICh1OCBzKQoteyBpbXVsX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQVgsTS54ODYuUl9BTCxzKTsgfQotCi12b2lkIGltdWxfd29yZCAodTE2IHMpCi17IGltdWxfd29yZF9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCwmTS54ODYuUl9EWCxNLng4Ni5SX0FYLHMpOyB9Ci0KLXZvaWQgaW11bF9sb25nICh1MzIgcykKLXsgaW11bF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0VBWCwmTS54ODYuUl9FRFgsTS54ODYuUl9FQVgscyk7IH0KLQotdm9pZCBpbXVsX2xvbmdfZGlyZWN0KHUzMiAqcmVzX2xvLCB1MzIqIHJlc19oaSx1MzIgZCwgdTMyIHMpCi17IGltdWxfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxyZXNfbG8scmVzX2hpLGQscyk7IH0KLQotdm9pZCBtdWxfYnl0ZSAodTggcykKLXsgbXVsX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQVgsTS54ODYuUl9BTCxzKTsgfQotCi12b2lkIG11bF93b3JkICh1MTYgcykKLXsgbXVsX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQVgsJk0ueDg2LlJfRFgsTS54ODYuUl9BWCxzKTsgfQotCi12b2lkIG11bF9sb25nICh1MzIgcykKLXsgbXVsX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfRUFYLCZNLng4Ni5SX0VEWCxNLng4Ni5SX0VBWCxzKTsgfQotCi12b2lkIGlkaXZfYnl0ZSAodTggcykKLXsgaWRpdl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FMLCZNLng4Ni5SX0FILE0ueDg2LlJfQVgscyk7IH0KLQotdm9pZCBpZGl2X3dvcmQgKHUxNiBzKQoteyBpZGl2X3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQVgsJk0ueDg2LlJfRFgsTS54ODYuUl9BWCxNLng4Ni5SX0RYLHMpOyB9Ci0KLXZvaWQgaWRpdl9sb25nICh1MzIgcykKLXsgaWRpdl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0VBWCwmTS54ODYuUl9FRFgsTS54ODYuUl9FQVgsTS54ODYuUl9FRFgscyk7IH0KLQotdm9pZCBkaXZfYnl0ZSAodTggcykKLXsgZGl2X2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQUwsJk0ueDg2LlJfQUgsTS54ODYuUl9BWCxzKTsgfQotCi12b2lkIGRpdl93b3JkICh1MTYgcykKLXsgZGl2X3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQVgsJk0ueDg2LlJfRFgsTS54ODYuUl9BWCxNLng4Ni5SX0RYLHMpOyB9Ci0KLXZvaWQgZGl2X2xvbmcgKHUzMiBzKQoteyBkaXZfbG9uZ19hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9FQVgsJk0ueDg2LlJfRURYLE0ueDg2LlJfRUFYLE0ueDg2LlJfRURYLHMpOyB9Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3N5cy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3N5cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmU1OGY4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9zeXMuYworKysgL2Rldi9udWxsCkBAIC0xLDY1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6CQlBTlNJIEMKLSogRW52aXJvbm1lbnQ6CUFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBpbmNsdWRlcyBzdWJyb3V0aW5lcyB3aGljaCBhcmUgcmVsYXRlZCB0bwotKgkJCQlwcm9ncmFtbWVkIEkvTyBhbmQgbWVtb3J5IGFjY2Vzcy4gSW5jbHVkZWQgaW4gdGhpcyBtb2R1bGUKLSoJCQkJYXJlIGRlZmF1bHQgZnVuY3Rpb25zIHdpdGggbGltaXRlZCB1c2VmdWxuZXNzLiBGb3IgcmVhbAotKgkJCQl1c2VzIHRoZXNlIGZ1bmN0aW9ucyB3aWxsIG1vc3QgbGlrZWx5IGJlIG92ZXJyaWRlbiBieSB0aGUKLSoJCQkJdXNlciBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIng4NmVtdS5oIgotI2luY2x1ZGUgIng4NmVtdS9yZWdzLmgiCi0jaW5jbHVkZSAieDg2ZW11L2RlYnVnLmgiCi0jaW5jbHVkZSAieDg2ZW11L3ByaW1fb3BzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLVg4NkVNVV9zeXNFbnYJCV9YODZFTVVfZW52OwkJLyogR2xvYmFsIGVtdWxhdG9yIG1hY2hpbmUgc3RhdGUgKi8KLVg4NkVNVV9pbnRyRnVuY3MJX1g4NkVNVV9pbnRyVGFiWzI1Nl07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgX19hbHBoYV9fCi0vKiB0byBjb3BlIHdpdGggYnJva2VuIGVnY3MtMS4xLjIgOi0oKCgoICovCi0KLS8qCi0gKiBpbmxpbmUgZnVuY3Rpb25zIHRvIGRvIHVuYWxpZ25lZCBhY2Nlc3NlcwotICogZnJvbSBsaW51eC9pbmNsdWRlL2FzbS1hbHBoYS91bmFsaWduZWQuaAotICovCi0KLS8qCi0gKiBFR0NTIDEuMSBrbm93cyBhYm91dCBhcmJpdHJhcnkgdW5hbGlnbmVkIGxvYWRzLiAgRGVmaW5lIHNvbWUKLSAqIHBhY2tlZCBzdHJ1Y3R1cmVzIHRvIHRhbGsgYWJvdXQgc3VjaCB0aGluZ3Mgd2l0aC4KLSAqLwotCi0jaWYgX19HTlVDX18gPiAyIHx8IF9fR05VQ19NSU5PUl9fID49IDkxCi1zdHJ1Y3QgX191bmFfdTY0IHsgdW5zaWduZWQgbG9uZyAgeCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgfTsKLXN0cnVjdCBfX3VuYV91MzIgeyB1bnNpZ25lZCBpbnQgICB4IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyB9Owotc3RydWN0IF9fdW5hX3UxNiB7IHVuc2lnbmVkIHNob3J0IHggX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IH07Ci0jZW5kaWYKLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsZHFfdSh1bnNpZ25lZCBsb25nICogcjExKQotewotI2lmIF9fR05VQ19fID4gMiB8fCBfX0dOVUNfTUlOT1JfXyA+PSA5MQotCWNvbnN0IHN0cnVjdCBfX3VuYV91NjQgKnB0ciA9IChjb25zdCBzdHJ1Y3QgX191bmFfdTY0ICopIHIxMTsKLQlyZXR1cm4gcHRyLT54OwotI2Vsc2UKLQl1bnNpZ25lZCBsb25nIHIxLHIyOwotCV9fYXNtX18oImxkcV91ICUwLCUzXG5cdCIKLQkJImxkcV91ICUxLCU0XG5cdCIKLQkJImV4dHFsICUwLCUyLCUwXG5cdCIKLQkJImV4dHFoICUxLCUyLCUxIgotCQk6Ij0mciIgKHIxKSwgIj0mciIgKHIyKQotCQk6InIiIChyMTEpLAotCQkgIm0iICgqcjExKSwKLQkJICJtIiAoKihjb25zdCB1bnNpZ25lZCBsb25nICopKDcrKGNoYXIgKikgcjExKSkpOwotCXJldHVybiByMSB8IHIyOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbGRsX3UodW5zaWduZWQgaW50ICogcjExKQotewotI2lmIF9fR05VQ19fID4gMiB8fCBfX0dOVUNfTUlOT1JfXyA+PSA5MQotCWNvbnN0IHN0cnVjdCBfX3VuYV91MzIgKnB0ciA9IChjb25zdCBzdHJ1Y3QgX191bmFfdTMyICopIHIxMTsKLQlyZXR1cm4gcHRyLT54OwotI2Vsc2UKLQl1bnNpZ25lZCBsb25nIHIxLHIyOwotCV9fYXNtX18oImxkcV91ICUwLCUzXG5cdCIKLQkJImxkcV91ICUxLCU0XG5cdCIKLQkJImV4dGxsICUwLCUyLCUwXG5cdCIKLQkJImV4dGxoICUxLCUyLCUxIgotCQk6Ij0mciIgKHIxKSwgIj0mciIgKHIyKQotCQk6InIiIChyMTEpLAotCQkgIm0iICgqcjExKSwKLQkJICJtIiAoKihjb25zdCB1bnNpZ25lZCBsb25nICopKDMrKGNoYXIgKikgcjExKSkpOwotCXJldHVybiByMSB8IHIyOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbGR3X3UodW5zaWduZWQgc2hvcnQgKiByMTEpCi17Ci0jaWYgX19HTlVDX18gPiAyIHx8IF9fR05VQ19NSU5PUl9fID49IDkxCi0JY29uc3Qgc3RydWN0IF9fdW5hX3UxNiAqcHRyID0gKGNvbnN0IHN0cnVjdCBfX3VuYV91MTYgKikgcjExOwotCXJldHVybiBwdHItPng7Ci0jZWxzZQotCXVuc2lnbmVkIGxvbmcgcjEscjI7Ci0JX19hc21fXygibGRxX3UgJTAsJTNcblx0IgotCQkibGRxX3UgJTEsJTRcblx0IgotCQkiZXh0d2wgJTAsJTIsJTBcblx0IgotCQkiZXh0d2ggJTEsJTIsJTEiCi0JCToiPSZyIiAocjEpLCAiPSZyIiAocjIpCi0JCToiciIgKHIxMSksCi0JCSAibSIgKCpyMTEpLAotCQkgIm0iICgqKGNvbnN0IHVuc2lnbmVkIGxvbmcgKikoMSsoY2hhciAqKSByMTEpKSk7Ci0JcmV0dXJuIHIxIHwgcjI7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIEVsZW1lbnRhbCB1bmFsaWduZWQgc3RvcmVzCi0gKi8KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBzdHFfdSh1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBsb25nICogcjExKQotewotI2lmIF9fR05VQ19fID4gMiB8fCBfX0dOVUNfTUlOT1JfXyA+PSA5MQotCXN0cnVjdCBfX3VuYV91NjQgKnB0ciA9IChzdHJ1Y3QgX191bmFfdTY0ICopIHIxMTsKLQlwdHItPnggPSByNTsKLSNlbHNlCi0JdW5zaWduZWQgbG9uZyByMSxyMixyMyxyNDsKLQotCV9fYXNtX18oImxkcV91ICUzLCUxXG5cdCIKLQkJImxkcV91ICUyLCUwXG5cdCIKLQkJImluc3FoICU2LCU3LCU1XG5cdCIKLQkJImluc3FsICU2LCU3LCU0XG5cdCIKLQkJIm1za3FoICUzLCU3LCUzXG5cdCIKLQkJIm1za3FsICUyLCU3LCUyXG5cdCIKLQkJImJpcyAlMywlNSwlM1xuXHQiCi0JCSJiaXMgJTIsJTQsJTJcblx0IgotCQkic3RxX3UgJTMsJTFcblx0IgotCQkic3RxX3UgJTIsJTAiCi0JCToiPW0iICgqcjExKSwKLQkJICI9bSIgKCoodW5zaWduZWQgbG9uZyAqKSg3KyhjaGFyICopIHIxMSkpLAotCQkgIj0mciIgKHIxKSwgIj0mciIgKHIyKSwgIj0mciIgKHIzKSwgIj0mciIgKHI0KQotCQk6InIiIChyNSksICJyIiAocjExKSk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBzdGxfdSh1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBpbnQgKiByMTEpCi17Ci0jaWYgX19HTlVDX18gPiAyIHx8IF9fR05VQ19NSU5PUl9fID49IDkxCi0Jc3RydWN0IF9fdW5hX3UzMiAqcHRyID0gKHN0cnVjdCBfX3VuYV91MzIgKikgcjExOwotCXB0ci0+eCA9IHI1OwotI2Vsc2UKLQl1bnNpZ25lZCBsb25nIHIxLHIyLHIzLHI0OwotCi0JX19hc21fXygibGRxX3UgJTMsJTFcblx0IgotCQkibGRxX3UgJTIsJTBcblx0IgotCQkiaW5zbGggJTYsJTcsJTVcblx0IgotCQkiaW5zbGwgJTYsJTcsJTRcblx0IgotCQkibXNrbGggJTMsJTcsJTNcblx0IgotCQkibXNrbGwgJTIsJTcsJTJcblx0IgotCQkiYmlzICUzLCU1LCUzXG5cdCIKLQkJImJpcyAlMiwlNCwlMlxuXHQiCi0JCSJzdHFfdSAlMywlMVxuXHQiCi0JCSJzdHFfdSAlMiwlMCIKLQkJOiI9bSIgKCpyMTEpLAotCQkgIj1tIiAoKih1bnNpZ25lZCBsb25nICopKDMrKGNoYXIgKikgcjExKSksCi0JCSAiPSZyIiAocjEpLCAiPSZyIiAocjIpLCAiPSZyIiAocjMpLCAiPSZyIiAocjQpCi0JCToiciIgKHI1KSwgInIiIChyMTEpKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHN0d191KHVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIHNob3J0ICogcjExKQotewotI2lmIF9fR05VQ19fID4gMiB8fCBfX0dOVUNfTUlOT1JfXyA+PSA5MQotCXN0cnVjdCBfX3VuYV91MTYgKnB0ciA9IChzdHJ1Y3QgX191bmFfdTE2ICopIHIxMTsKLQlwdHItPnggPSByNTsKLSNlbHNlCi0JdW5zaWduZWQgbG9uZyByMSxyMixyMyxyNDsKLQotCV9fYXNtX18oImxkcV91ICUzLCUxXG5cdCIKLQkJImxkcV91ICUyLCUwXG5cdCIKLQkJImluc3doICU2LCU3LCU1XG5cdCIKLQkJImluc3dsICU2LCU3LCU0XG5cdCIKLQkJIm1za3doICUzLCU3LCUzXG5cdCIKLQkJIm1za3dsICUyLCU3LCUyXG5cdCIKLQkJImJpcyAlMywlNSwlM1xuXHQiCi0JCSJiaXMgJTIsJTQsJTJcblx0IgotCQkic3RxX3UgJTMsJTFcblx0IgotCQkic3RxX3UgJTIsJTAiCi0JCToiPW0iICgqcjExKSwKLQkJICI9bSIgKCoodW5zaWduZWQgbG9uZyAqKSgxKyhjaGFyICopIHIxMSkpLAotCQkgIj0mciIgKHIxKSwgIj0mciIgKHIyKSwgIj0mciIgKHIzKSwgIj0mciIgKHI0KQotCQk6InIiIChyNSksICJyIiAocjExKSk7Ci0jZW5kaWYKLX0KLQotI2VsaWYgZGVmaW5lZCAoX19pYTY0X18pCi0vKgotICogRUdDUyAxLjEga25vd3MgYWJvdXQgYXJiaXRyYXJ5IHVuYWxpZ25lZCBsb2Fkcy4gIERlZmluZSBzb21lCi0gKiBwYWNrZWQgc3RydWN0dXJlcyB0byB0YWxrIGFib3V0IHN1Y2ggdGhpbmdzIHdpdGguCi0gKi8KLXN0cnVjdCBfX3VuYV91NjQgeyB1bnNpZ25lZCBsb25nICB4IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyB9Owotc3RydWN0IF9fdW5hX3UzMiB7IHVuc2lnbmVkIGludCAgIHggX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IH07Ci1zdHJ1Y3QgX191bmFfdTE2IHsgdW5zaWduZWQgc2hvcnQgeCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgfTsKLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZwotX191bGRxIChjb25zdCB1bnNpZ25lZCBsb25nICogcjExKQotewotCWNvbnN0IHN0cnVjdCBfX3VuYV91NjQgKnB0ciA9IChjb25zdCBzdHJ1Y3QgX191bmFfdTY0ICopIHIxMTsKLQlyZXR1cm4gcHRyLT54OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nCi11bGRsIChjb25zdCB1bnNpZ25lZCBpbnQgKiByMTEpCi17Ci0JY29uc3Qgc3RydWN0IF9fdW5hX3UzMiAqcHRyID0gKGNvbnN0IHN0cnVjdCBfX3VuYV91MzIgKikgcjExOwotCXJldHVybiBwdHItPng7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcKLXVsZHcgKGNvbnN0IHVuc2lnbmVkIHNob3J0ICogcjExKQotewotCWNvbnN0IHN0cnVjdCBfX3VuYV91MTYgKnB0ciA9IChjb25zdCBzdHJ1Y3QgX191bmFfdTE2ICopIHIxMTsKLQlyZXR1cm4gcHRyLT54OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi11c3RxICh1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBsb25nICogcjExKQotewotCXN0cnVjdCBfX3VuYV91NjQgKnB0ciA9IChzdHJ1Y3QgX191bmFfdTY0ICopIHIxMTsKLQlwdHItPnggPSByNTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotdXN0bCAodW5zaWduZWQgbG9uZyByNSwgdW5zaWduZWQgaW50ICogcjExKQotewotCXN0cnVjdCBfX3VuYV91MzIgKnB0ciA9IChzdHJ1Y3QgX191bmFfdTMyICopIHIxMTsKLQlwdHItPnggPSByNTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotdXN0dyAodW5zaWduZWQgbG9uZyByNSwgdW5zaWduZWQgc2hvcnQgKiByMTEpCi17Ci0Jc3RydWN0IF9fdW5hX3UxNiAqcHRyID0gKHN0cnVjdCBfX3VuYV91MTYgKikgcjExOwotCXB0ci0+eCA9IHI1OwotfQotCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyCS0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAotCi1SRVRVUk5TOgotQnl0ZSB2YWx1ZSByZWFkIGZyb20gZW11bGF0b3IgbWVtb3J5LgotCi1SRU1BUktTOgotUmVhZHMgYSBieXRlIHZhbHVlIGZyb20gdGhlIGVtdWxhdG9yIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBYODZBUEkgcmRiKAotICAgIHUzMiBhZGRyKQotewotCXU4IHZhbDsKLQotCWlmIChhZGRyID4gTS5tZW1fc2l6ZSAtIDEpIHsKLQkJREIocHJpbnRrKCJtZW1fcmVhZDogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQkJSEFMVF9TWVMoKTsKLQkJfQotCXZhbCA9ICoodTgqKShNLm1lbV9iYXNlICsgYWRkcik7Ci1EQigJaWYgKERFQlVHX01FTV9UUkFDRSgpKQotCQlwcmludGsoIiUjMDh4IDEgLT4gJSN4XG4iLCBhZGRyLCB2YWwpOykKLQlyZXR1cm4gdmFsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIJLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCi0KLVJFVFVSTlM6Ci1Xb3JkIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1SZWFkcyBhIHdvcmQgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBYODZBUEkgcmR3KAotCXUzMiBhZGRyKQotewotCXUxNiB2YWwgPSAwOwotCi0JaWYgKGFkZHIgPiBNLm1lbV9zaXplIC0gMikgewotCQlEQihwcmludGsoIm1lbV9yZWFkOiBhZGRyZXNzICUjbHggb3V0IG9mIHJhbmdlIVxuIiwgYWRkcik7KQotCQlIQUxUX1NZUygpOwotCQl9Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MSkgewotCQl2YWwgPSAoKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyKSB8Ci0JCQkgICgqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAxKSA8PCA4KSk7Ci0JCX0KLQllbHNlCi0jZW5kaWYKLSNpZmRlZiBfX2FscGhhX18KLQkJdmFsID0gbGR3X3UoKHUxNiopKE0ubWVtX2Jhc2UgKyBhZGRyKSk7Ci0jZWxpZiBkZWZpbmVkIChfX2lhNjRfXykKLQkgIHZhbCA9IHVsZHcoKHUxNiopKE0ubWVtX2Jhc2UgKyBhZGRyKSk7Ci0jZWxzZQotCQl2YWwgPSAqKHUxNiopKE0ubWVtX2Jhc2UgKyBhZGRyKTsKLSNlbmRpZgotCQlEQigJaWYgKERFQlVHX01FTV9UUkFDRSgpKQotCQlwcmludGsoIiUjMDh4IDIgLT4gJSN4XG4iLCBhZGRyLCB2YWwpOykKLSAgICByZXR1cm4gdmFsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIJLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCi0KLVJFVFVSTlM6Ci1Mb25nIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCi1SRU1BUktTOgotUmVhZHMgYSBsb25nIHZhbHVlIGZyb20gdGhlIGVtdWxhdG9yIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgWDg2QVBJIHJkbCgKLQl1MzIgYWRkcikKLXsKLQl1MzIgdmFsID0gMDsKLQotCWlmIChhZGRyID4gTS5tZW1fc2l6ZSAtIDQpIHsKLQkJREIocHJpbnRrKCJtZW1fcmVhZDogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQkJSEFMVF9TWVMoKTsKLQkJfQotI2lmZGVmIF9fQklHX0VORElBTl9fCi0JaWYgKGFkZHIgJiAweDMpIHsKLQkJdmFsID0gKCoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDApIHwKLQkJCSAgKCoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDEpIDw8IDgpIHwKLQkJCSAgKCoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDIpIDw8IDE2KSB8Ci0JCQkgICgqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAzKSA8PCAyNCkpOwotCQl9Ci0JZWxzZQotI2VuZGlmCi0jaWZkZWYgX19hbHBoYV9fCi0JCXZhbCA9IGxkbF91KCh1MzIqKShNLm1lbV9iYXNlICsgYWRkcikpOwotI2VsaWYgZGVmaW5lZCAoX19pYTY0X18pCi0JCXZhbCA9IHVsZGwoKHUzMiopKE0ubWVtX2Jhc2UgKyBhZGRyKSk7Ci0jZWxzZQotCQl2YWwgPSAqKHUzMiopKE0ubWVtX2Jhc2UgKyBhZGRyKTsKLSNlbmRpZgotREIoCWlmIChERUJVR19NRU1fVFJBQ0UoKSkKLQkJcHJpbnRrKCIlIzA4eCA0IC0+ICUjeFxuIiwgYWRkciwgdmFsKTspCi0JcmV0dXJuIHZhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyCS0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAotdmFsCQktIFZhbHVlIHRvIHN0b3JlCi0KLVJFTUFSS1M6Ci1Xcml0ZXMgYSBieXRlIHZhbHVlIHRvIGVtdWxhdG9yIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFg4NkFQSSB3cmIoCi0JdTMyIGFkZHIsCi0JdTggdmFsKQotewotREIoCWlmIChERUJVR19NRU1fVFJBQ0UoKSkKLQkJcHJpbnRrKCIlIzA4eCAxIDwtICUjeFxuIiwgYWRkciwgdmFsKTspCi0gICAgaWYgKGFkZHIgPiBNLm1lbV9zaXplIC0gMSkgewotCQlEQihwcmludGsoIm1lbV93cml0ZTogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQkJSEFMVF9TWVMoKTsKLQkJfQotCSoodTgqKShNLm1lbV9iYXNlICsgYWRkcikgPSB2YWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkcgktIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKLXZhbAkJLSBWYWx1ZSB0byBzdG9yZQotCi1SRU1BUktTOgotV3JpdGVzIGEgd29yZCB2YWx1ZSB0byBlbXVsYXRvciBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBYODZBUEkgd3J3KAotCXUzMiBhZGRyLAotCXUxNiB2YWwpCi17Ci1EQigJaWYgKERFQlVHX01FTV9UUkFDRSgpKQotCQlwcmludGsoIiUjMDh4IDIgPC0gJSN4XG4iLCBhZGRyLCB2YWwpOykKLQlpZiAoYWRkciA+IE0ubWVtX3NpemUgLSAyKSB7Ci0JCURCKHByaW50aygibWVtX3dyaXRlOiBhZGRyZXNzICUjbHggb3V0IG9mIHJhbmdlIVxuIiwgYWRkcik7KQotCQlIQUxUX1NZUygpOwotCQl9Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MSkgewotCQkqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAwKSA9ICh2YWwgPj4gMCkgJiAweGZmOwotCQkqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAxKSA9ICh2YWwgPj4gOCkgJiAweGZmOwotCQl9Ci0JZWxzZQotI2VuZGlmCi0jaWZkZWYgX19hbHBoYV9fCi0JIHN0d191KHZhbCwodTE2KikoTS5tZW1fYmFzZSArIGFkZHIpKTsKLSNlbGlmIGRlZmluZWQgKF9faWE2NF9fKQotCSB1c3R3KHZhbCwodTE2KikoTS5tZW1fYmFzZSArIGFkZHIpKTsKLSNlbHNlCi0JICoodTE2KikoTS5tZW1fYmFzZSArIGFkZHIpID0gdmFsOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkcgktIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKLXZhbAkJLSBWYWx1ZSB0byBzdG9yZQotCi1SRU1BUktTOgotV3JpdGVzIGEgbG9uZyB2YWx1ZSB0byBlbXVsYXRvciBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBYODZBUEkgd3JsKAotCXUzMiBhZGRyLAotCXUzMiB2YWwpCi17Ci1EQigJaWYgKERFQlVHX01FTV9UUkFDRSgpKQotCQlwcmludGsoIiUjMDh4IDQgPC0gJSN4XG4iLCBhZGRyLCB2YWwpOykKLQlpZiAoYWRkciA+IE0ubWVtX3NpemUgLSA0KSB7Ci0JCURCKHByaW50aygibWVtX3dyaXRlOiBhZGRyZXNzICUjbHggb3V0IG9mIHJhbmdlIVxuIiwgYWRkcik7KQotCQlIQUxUX1NZUygpOwotCQl9Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MSkgewotCQkqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAwKSA9ICh2YWwgPj4gIDApICYgMHhmZjsKLQkJKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMSkgPSAodmFsID4+ICA4KSAmIDB4ZmY7Ci0JCSoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDIpID0gKHZhbCA+PiAxNikgJiAweGZmOwotCQkqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAzKSA9ICh2YWwgPj4gMjQpICYgMHhmZjsKLQkJfQotCWVsc2UKLSNlbmRpZgotI2lmZGVmIF9fYWxwaGFfXwotCSBzdGxfdSh2YWwsKHUzMiopKE0ubWVtX2Jhc2UgKyBhZGRyKSk7Ci0jZWxpZiBkZWZpbmVkIChfX2lhNjRfXykKLQkgdXN0bCh2YWwsKHUzMiopKE0ubWVtX2Jhc2UgKyBhZGRyKSk7Ci0jZWxzZQotCSAqKHUzMiopKE0ubWVtX2Jhc2UgKyBhZGRyKSA9IHZhbDsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIJLSBQSU8gYWRkcmVzcyB0byByZWFkCi1SRVRVUk46Ci0wCi1SRU1BUktTOgotRGVmYXVsdCBQSU8gYnl0ZSByZWFkIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBpbmIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHU4IFg4NkFQSSBwX2luYigKLQlYODZFTVVfcGlvQWRkciBhZGRyKQotewotREIoCWlmIChERUJVR19JT19UUkFDRSgpKQotCQlwcmludGsoImluYiAlIzA0eCBcbiIsIGFkZHIpOykKLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyCS0gUElPIGFkZHJlc3MgdG8gcmVhZAotUkVUVVJOOgotMAotUkVNQVJLUzoKLURlZmF1bHQgUElPIHdvcmQgcmVhZCBmdW5jdGlvbi4gRG9lc24ndCBwZXJmb3JtIHJlYWwgaW53LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1MTYgWDg2QVBJIHBfaW53KAotCVg4NkVNVV9waW9BZGRyIGFkZHIpCi17Ci1EQigJaWYgKERFQlVHX0lPX1RSQUNFKCkpCi0JCXByaW50aygiaW53ICUjMDR4IFxuIiwgYWRkcik7KQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIJLSBQSU8gYWRkcmVzcyB0byByZWFkCi1SRVRVUk46Ci0wCi1SRU1BUktTOgotRGVmYXVsdCBQSU8gbG9uZyByZWFkIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBpbmwuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHUzMiBYODZBUEkgcF9pbmwoCi0JWDg2RU1VX3Bpb0FkZHIgYWRkcikKLXsKLURCKAlpZiAoREVCVUdfSU9fVFJBQ0UoKSkKLQkJcHJpbnRrKCJpbmwgJSMwNHggXG4iLCBhZGRyKTspCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkcgktIFBJTyBhZGRyZXNzIHRvIHdyaXRlCi12YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKLVJFTUFSS1M6Ci1EZWZhdWx0IFBJTyBieXRlIHdyaXRlIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBvdXRiLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFg4NkFQSSBwX291dGIoCi0JWDg2RU1VX3Bpb0FkZHIgYWRkciwKLQl1OCB2YWwpCi17Ci1EQigJaWYgKERFQlVHX0lPX1RSQUNFKCkpCi0JCXByaW50aygib3V0YiAlIzAyeCAtPiAlIzA0eCBcbiIsIHZhbCwgYWRkcik7KQotICAgIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyCS0gUElPIGFkZHJlc3MgdG8gd3JpdGUKLXZhbCAgICAgLSBWYWx1ZSB0byBzdG9yZQotUkVNQVJLUzoKLURlZmF1bHQgUElPIHdvcmQgd3JpdGUgZnVuY3Rpb24uIERvZXNuJ3QgcGVyZm9ybSByZWFsIG91dHcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgWDg2QVBJIHBfb3V0dygKLQlYODZFTVVfcGlvQWRkciBhZGRyLAotCXUxNiB2YWwpCi17Ci1EQigJaWYgKERFQlVHX0lPX1RSQUNFKCkpCi0JCXByaW50aygib3V0dyAlIzA0eCAtPiAlIzA0eCBcbiIsIHZhbCwgYWRkcik7KQotCXJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyCS0gUElPIGFkZHJlc3MgdG8gd3JpdGUKLXZhbCAgICAgLSBWYWx1ZSB0byBzdG9yZQotUkVNQVJLUzoKLURlZmF1bHQgUElPIDtvbmcgd3JpdGUgZnVuY3Rpb24uIERvZXNuJ3QgcGVyZm9ybSByZWFsIG91dGwuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgWDg2QVBJIHBfb3V0bCgKLQlYODZFTVVfcGlvQWRkciBhZGRyLAotCXUzMiB2YWwpCi17Ci1EQigJaWYgKERFQlVHX0lPX1RSQUNFKCkpCi0JCXByaW50aygib3V0bCAlIzA4eCAtPiAlIzA0eCBcbiIsIHZhbCwgYWRkcik7KQotICAgIHJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTggIAkoWDg2QVBJUCBzeXNfcmRiKSh1MzIgYWRkcikgCQkJICAgICAgICAgICAgPSByZGI7Ci11MTYgCShYODZBUElQIHN5c19yZHcpKHUzMiBhZGRyKSAJCQkgICAgICAgICAgICA9IHJkdzsKLXUzMiAJKFg4NkFQSVAgc3lzX3JkbCkodTMyIGFkZHIpIAkJCSAgICAgICAgICAgID0gcmRsOwotdm9pZCAJKFg4NkFQSVAgc3lzX3dyYikodTMyIGFkZHIsdTggdmFsKSAJCSAgICAgICAgICAgID0gd3JiOwotdm9pZCAJKFg4NkFQSVAgc3lzX3dydykodTMyIGFkZHIsdTE2IHZhbCkgCSAgICAgICAgICAgID0gd3J3Owotdm9pZCAJKFg4NkFQSVAgc3lzX3dybCkodTMyIGFkZHIsdTMyIHZhbCkgCSAgICAgICAgICAgID0gd3JsOwotdTggIAkoWDg2QVBJUCBzeXNfaW5iKShYODZFTVVfcGlvQWRkciBhZGRyKQkgICAgICAgICAgICA9IHBfaW5iOwotdTE2IAkoWDg2QVBJUCBzeXNfaW53KShYODZFTVVfcGlvQWRkciBhZGRyKQkgICAgICAgICAgICA9IHBfaW53OwotdTMyIAkoWDg2QVBJUCBzeXNfaW5sKShYODZFTVVfcGlvQWRkciBhZGRyKSAgICAgICAgICAgICAgPSBwX2lubDsKLXZvaWQgCShYODZBUElQIHN5c19vdXRiKShYODZFTVVfcGlvQWRkciBhZGRyLCB1OCB2YWwpIAk9IHBfb3V0YjsKLXZvaWQgCShYODZBUElQIHN5c19vdXR3KShYODZFTVVfcGlvQWRkciBhZGRyLCB1MTYgdmFsKQk9IHBfb3V0dzsKLXZvaWQgCShYODZBUElQIHN5c19vdXRsKShYODZFTVVfcGlvQWRkciBhZGRyLCB1MzIgdmFsKQk9IHBfb3V0bDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1mdW5jcwktIE5ldyBtZW1vcnkgZnVuY3Rpb24gcG9pbnRlcnMgdG8gbWFrZSBhY3RpdmUKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB3aGljaCBhY2Nlc3MKLW1lbW9yeSBzcGFjZSwgYWxsb3dpbmcgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8gb3ZlcnJpZGUgdGhlc2UgZnVuY3Rpb25zCi1hbmQgaG9vayB0aGVtIG91dCBhcyBuZWNlc3NhcnkgZm9yIHRoZWlyIGFwcGxpY2F0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWDg2RU1VX3NldHVwTWVtRnVuY3MoCi0JWDg2RU1VX21lbUZ1bmNzICpmdW5jcykKLXsKLQlzeXNfcmRiID0gZnVuY3MtPnJkYjsKLSAgICBzeXNfcmR3ID0gZnVuY3MtPnJkdzsKLSAgICBzeXNfcmRsID0gZnVuY3MtPnJkbDsKLSAgICBzeXNfd3JiID0gZnVuY3MtPndyYjsKLSAgICBzeXNfd3J3ID0gZnVuY3MtPndydzsKLSAgICBzeXNfd3JsID0gZnVuY3MtPndybDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1mdW5jcwktIE5ldyBwcm9ncmFtbWVkIEkvTyBmdW5jdGlvbiBwb2ludGVycyB0byBtYWtlIGFjdGl2ZQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHdoaWNoIGFjY2VzcwotSS9PIHNwYWNlLCBhbGxvd2luZyB0aGUgdXNlciBhcHBsaWNhdGlvbiB0byBvdmVycmlkZSB0aGVzZSBmdW5jdGlvbnMKLWFuZCBob29rIHRoZW0gb3V0IGFzIG5lY2Vzc2FyeSBmb3IgdGhlaXIgYXBwbGljYXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBYODZFTVVfc2V0dXBQaW9GdW5jcygKLQlYODZFTVVfcGlvRnVuY3MgKmZ1bmNzKQotewotICAgIHN5c19pbmIgPSBmdW5jcy0+aW5iOwotICAgIHN5c19pbncgPSBmdW5jcy0+aW53OwotICAgIHN5c19pbmwgPSBmdW5jcy0+aW5sOwotICAgIHN5c19vdXRiID0gZnVuY3MtPm91dGI7Ci0gICAgc3lzX291dHcgPSBmdW5jcy0+b3V0dzsKLSAgICBzeXNfb3V0bCA9IGZ1bmNzLT5vdXRsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWZ1bmNzCS0gTmV3IGludGVycnVwdCB2ZWN0b3IgdGFibGUgdG8gbWFrZSBhY3RpdmUKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB3aGljaCBoYW5kbGUKLWludGVycnVwdCBwcm9jZXNzaW5nIGluIHRoZSBlbXVsYXRvciwgYWxsb3dpbmcgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8KLWhvb2sgaW50ZXJydXB0cyBhcyBuZWNlc3NhcnkgZm9yIHRoZWlyIGFwcGxpY2F0aW9uLiBBbnkgaW50ZXJydXB0cyB0aGF0Ci1hcmUgbm90IGhvb2tlZCBieSB0aGUgdXNlciBhcHBsaWNhdGlvbiwgYW5kIHJlZmxlY3RlZCBhbmQgaGFuZGxlZCBpbnRlcm5hbGx5Ci1pbiB0aGUgZW11bGF0b3IgdmlhIHRoZSBpbnRlcnJ1cHQgdmVjdG9yIHRhYmxlLiBUaGlzIGFsbG93cyB0aGUgYXBwbGljYXRpb24KLXRvIGdldCBjb250cm9sIHdoZW4gdGhlIGNvZGUgYmVpbmcgZW11bGF0ZWQgZXhlY3V0ZXMgc3BlY2lmaWMgc29mdHdhcmUKLWludGVycnVwdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBYODZFTVVfc2V0dXBJbnRyRnVuY3MoCi0JWDg2RU1VX2ludHJGdW5jcyBmdW5jc1tdKQotewotICAgIGludCBpOwotCi0JZm9yIChpPTA7IGkgPCAyNTY7IGkrKykKLQkJX1g4NkVNVV9pbnRyVGFiW2ldID0gTlVMTDsKLQlpZiAoZnVuY3MpIHsKLQkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotCQkJX1g4NkVNVV9pbnRyVGFiW2ldID0gZnVuY3NbaV07Ci0JCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbnQJLSBOZXcgc29mdHdhcmUgaW50ZXJydXB0IHRvIHByZXBhcmUgZm9yCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHVwIHRoZSBlbXVsYXRvciBzdGF0ZSB0byBleGNldXRlIGEgc29mdHdhcmUKLWludGVycnVwdC4gVGhpcyBjYW4gYmUgdXNlZCBieSB0aGUgdXNlciBhcHBsaWNhdGlvbiBjb2RlIHRvIGFsbG93IGFuCi1pbnRlcnJ1cHQgdG8gYmUgaG9va2VkLCBleGFtaW5lZCBhbmQgdGhlbiByZWZsZWN0ZWQgYmFjayB0byB0aGUgZW11bGF0b3IKLXNvIHRoYXQgdGhlIGNvZGUgaW4gdGhlIGVtdWxhdG9yIHdpbGwgY29udGludWUgcHJvY2Vzc2luZyB0aGUgc29mdHdhcmUKLWludGVycnVwdCBhcyBwZXIgbm9ybWFsLiBUaGlzIGVzc2VudGlhbGx5IGFsbG93cyBzeXN0ZW0gY29kZSB0byBhY3RpdmVseQotaG9vayBhbmQgaGFuZGxlIGNlcnRhaW4gc29mdHdhcmUgaW50ZXJydXB0cyBhcyBuZWNlc3NhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBYODZFTVVfcHJlcGFyZUZvckludCgKLQlpbnQgbnVtKQotewotICAgIHB1c2hfd29yZCgodTE2KU0ueDg2LlJfRkxHKTsKLSAgICBDTEVBUl9GTEFHKEZfSUYpOwotICAgIENMRUFSX0ZMQUcoRl9URik7Ci0gICAgcHVzaF93b3JkKE0ueDg2LlJfQ1MpOwotICAgIE0ueDg2LlJfQ1MgPSBtZW1fYWNjZXNzX3dvcmQobnVtICogNCArIDIpOwotICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKLSAgICBNLng4Ni5SX0lQID0gbWVtX2FjY2Vzc193b3JkKG51bSAqIDQpOwotCU0ueDg2LmludHIgPSAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3ZhbGlkYXRlLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvdmFsaWRhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1MTMwMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvdmFsaWRhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDc2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBXYXRjb20gQyAxMC42IG9yIGxhdGVyCi0qIEVudmlyb25tZW50OiAgMzItYml0IERPUwotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIFByb2dyYW0gdG8gdmFsaWRhdGUgdGhlIHg4NiBlbXVsYXRvciBsaWJyYXJ5IGZvcgotKiAgICAgICAgICAgICAgIGNvcnJlY3RuZXNzLiBXZSBydW4gdGhlIGVtdWxhdG9yIHByaW1pdGl2ZSBvcGVyYXRpb25zCi0qICAgICAgICAgICAgICAgZnVuY3Rpb25zIGFnYWluc3QgdGhlIHJlYWwgeDg2IENQVSwgYW5kIGNvbXBhcmUgdGhlIHJlc3VsdAotKiAgICAgICAgICAgICAgIGFuZCBmbGFncyB0byBlbnN1cmUgY29ycmVjdG5lc3MuCi0qCi0qICAgICAgICAgICAgICAgV2UgdXNlIGlubGluZSBhc3NlbWJsZXIgdG8gY29tcGlsZSBhbmQgYnVpbGQgdGhpcyBwcm9ncmFtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSAieDg2ZW11LmgiCi0jaW5jbHVkZSAieDg2ZW11L3ByaW1fYXNtLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgdHJ1ZSAxCi0jZGVmaW5lIGZhbHNlIDAKLQotI2RlZmluZSBBTExfRkxBR1MgICAoRl9DRiB8IEZfUEYgfCBGX0FGIHwgRl9aRiB8IEZfU0YgfCBGX09GKQotCi0jZGVmaW5lIFZBTF9TVEFSVF9CSU5BUlkocGFybV90eXBlLHJlc190eXBlLGRtYXgsc21heCxkaW5jcixzaW5jcikgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHBhcm1fdHlwZSAgIGQsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmVzX3R5cGUgICAgcixyX2FzbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl1bG9uZyAgICAgCWZsYWdzLGluZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaW50ICAgICAgICAgZixmYWlsZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyICAgICAgICBidWYxWzgwXSxidWYyWzgwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoZCA9IDA7IGQgPCBkbWF4OyBkICs9IGRpbmNyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JZm9yIChzID0gMDsgcyA8IHNtYXg7IHMgKz0gc2luY3IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3M7ICAgICAgICAgICAgIFwKLQkgICAgZm9yIChmID0gMDsgZiA8IDI7IGYrKykgewotCi0jZGVmaW5lIFZBTF9URVNUX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXJfYXNtID0gbmFtZSMjX2FzbSgmZmxhZ3MsZCxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlyID0gbmFtZShkLHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChyICE9IHJfYXNtIHx8IE0ueDg2LlJfRUZMRyAhPSBmbGFncykgICAgICAgICAgICAgICAgXAotCQkgICAgZmFpbGVkID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKGZhaWxlZCB8fCB0cmFjZSkgewotCi0jZGVmaW5lIFZBTF9URVNUX0JJTkFSWV9WT0lEKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCW5hbWUjI19hc20oJmZsYWdzLGQscyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQluYW1lKGQscyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXIgPSByX2FzbSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoTS54ODYuUl9FRkxHICE9IGZsYWdzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGZhaWxlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChmYWlsZWQgfHwgdHJhY2UpIHsKLQotI2RlZmluZSBWQUxfRkFJTF9CWVRFX0JZVEVfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHByaW50aygiMHglMDJYID0gJS0xNXMoMHglMDJYLDB4JTAyWCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXIsICNuYW1lLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgICAgXAotCQkgICAgcHJpbnRrKCIweCUwMlggPSAlLTE1cygweCUwMlgsMHglMDJYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcl9hc20sICNuYW1lIl9hc20iLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7Ci0KLSNkZWZpbmUgVkFMX0ZBSUxfV09SRF9XT1JEX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBwcmludGsoIjB4JTA0WCA9ICUtMTVzKDB4JTA0WCwweCUwNFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyLCAjbmFtZSwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICBcCi0JCSAgICBwcmludGsoIjB4JTA0WCA9ICUtMTVzKDB4JTA0WCwweCUwNFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyX2FzbSwgI25hbWUiX2FzbSIsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsKLQotI2RlZmluZSBWQUxfRkFJTF9MT05HX0xPTkdfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHByaW50aygiMHglMDhYID0gJS0xNXMoMHglMDhYLDB4JTA4WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXIsICNuYW1lLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyBcCi0JCSAgICBwcmludGsoIjB4JTA4WCA9ICUtMTVzKDB4JTA4WCwweCUwOFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyX2FzbSwgI25hbWUiX2FzbSIsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsKLQotI2RlZmluZSBWQUxfRU5EX0JJTkFSWSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3MgfCAoQUxMX0ZMQUdTICYgfkZfT0YpOyAgIFwKLQkJaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlwcmludGsoInBhc3NlZFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBWQUxfQllURV9CWVRFX0JJTkFSWShuYW1lKSAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgIFwKLSAgICBWQUxfU1RBUlRfQklOQVJZKHU4LHU4LDB4RkYsMHhGRiwxLDEpICAgXAotICAgIFZBTF9URVNUX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0ZBSUxfQllURV9CWVRFX0JJTkFSWShuYW1lKSAgICAgICAgIFwKLSAgICBWQUxfRU5EX0JJTkFSWSgpCi0KLSNkZWZpbmUgVkFMX1dPUkRfV09SRF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICBcCi0gICAgVkFMX1NUQVJUX0JJTkFSWSh1MTYsdTE2LDB4RkYwMCwweEZGMDAsMHgxMDAsMHgxMDApIFwKLSAgICBWQUxfVEVTVF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9GQUlMX1dPUkRfV09SRF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0VORF9CSU5BUlkoKQotCi0jZGVmaW5lIFZBTF9MT05HX0xPTkdfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX1NUQVJUX0JJTkFSWSh1MzIsdTMyLDB4RkYwMDAwMDAsMHhGRjAwMDAwMCwweDEwMDAwMDAsMHgxMDAwMDAwKSBcCi0gICAgVkFMX1RFU1RfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0ZBSUxfTE9OR19MT05HX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0VORF9CSU5BUlkoKQotCi0jZGVmaW5lIFZBTF9WT0lEX0JZVEVfQklOQVJZKG5hbWUpICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgXAotICAgIFZBTF9TVEFSVF9CSU5BUlkodTgsdTgsMHhGRiwweEZGLDEsMSkgICBcCi0gICAgVkFMX1RFU1RfQklOQVJZX1ZPSUQobmFtZSkgICAgICAgICAgICAgIFwKLSAgICBWQUxfRkFJTF9CWVRFX0JZVEVfQklOQVJZKG5hbWUpICAgICAgICAgXAotICAgIFZBTF9FTkRfQklOQVJZKCkKLQotI2RlZmluZSBWQUxfVk9JRF9XT1JEX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfU1RBUlRfQklOQVJZKHUxNix1MTYsMHhGRjAwLDB4RkYwMCwweDEwMCwweDEwMCkgXAotICAgIFZBTF9URVNUX0JJTkFSWV9WT0lEKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0ZBSUxfV09SRF9XT1JEX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRU5EX0JJTkFSWSgpCi0KLSNkZWZpbmUgVkFMX1ZPSURfTE9OR19CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfU1RBUlRfQklOQVJZKHUzMix1MzIsMHhGRjAwMDAwMCwweEZGMDAwMDAwLDB4MTAwMDAwMCwweDEwMDAwMDApIFwKLSAgICBWQUxfVEVTVF9CSU5BUllfVk9JRChuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRkFJTF9MT05HX0xPTkdfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRU5EX0JJTkFSWSgpCi0KLSNkZWZpbmUgVkFMX0JZVEVfUk9UQVRFKG5hbWUpICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICBcCi0gICAgVkFMX1NUQVJUX0JJTkFSWSh1OCx1OCwweEZGLDgsMSwxKSAgICAgIFwKLSAgICBWQUxfVEVTVF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9GQUlMX0JZVEVfQllURV9CSU5BUlkobmFtZSkgICAgICAgICBcCi0gICAgVkFMX0VORF9CSU5BUlkoKQotCi0jZGVmaW5lIFZBTF9XT1JEX1JPVEFURShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgXAotICAgIFZBTF9TVEFSVF9CSU5BUlkodTE2LHUxNiwweEZGMDAsMTYsMHgxMDAsMSkgICAgICAgICBcCi0gICAgVkFMX1RFU1RfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRkFJTF9XT1JEX1dPUkRfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9FTkRfQklOQVJZKCkKLQotI2RlZmluZSBWQUxfTE9OR19ST1RBVEUobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9TVEFSVF9CSU5BUlkodTMyLHUzMiwweEZGMDAwMDAwLDMyLDB4MTAwMDAwMCwxKSAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9URVNUX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9GQUlMX0xPTkdfTE9OR19CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9FTkRfQklOQVJZKCkKLQotI2RlZmluZSBWQUxfU1RBUlRfVEVSTkFSWShwYXJtX3R5cGUscmVzX3R5cGUsZG1heCxzbWF4LGRpbmNyLHNpbmNyLG1heHNoaWZ0KVwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHBhcm1fdHlwZSAgIGQsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmVzX3R5cGUgICAgcixyX2FzbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1OCAgICAgICAgICBzaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXUzMiAgICAgICAgIGZsYWdzLGluZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ICAgICAgICAgZixmYWlsZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyICAgICAgICBidWYxWzgwXSxidWYyWzgwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoZCA9IDA7IGQgPCBkbWF4OyBkICs9IGRpbmNyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JZm9yIChzID0gMDsgcyA8IHNtYXg7IHMgKz0gc2luY3IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBmb3IgKHNoaWZ0ID0gMDsgc2hpZnQgPCBtYXhzaGlmdDsgc2hpZnQgKz0gMSkgeyAgICAgICAgXAotCQlNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3M7ICAgICAgICAgXAotCQlmb3IgKGYgPSAwOyBmIDwgMjsgZisrKSB7Ci0KLSNkZWZpbmUgVkFMX1RFU1RfVEVSTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHJfYXNtID0gbmFtZSMjX2FzbSgmZmxhZ3MsZCxzLHNoaWZ0KTsgICAgICAgICAgICAgICBcCi0JCSAgICByID0gbmFtZShkLHMsc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGlmIChyICE9IHJfYXNtIHx8IE0ueDg2LlJfRUZMRyAhPSBmbGFncykgICAgICAgICAgICBcCi0JCQlmYWlsZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBpZiAoZmFpbGVkIHx8IHRyYWNlKSB7Ci0KLSNkZWZpbmUgVkFMX0ZBSUxfV09SRF9XT1JEX1RFUk5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJICAgIHByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcHJpbnRrKCIweCUwNFggPSAlLTE1cygweCUwNFgsMHglMDRYLCVkKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgXAotCQkJICAgIHIsICNuYW1lLCBkLCBzLCBzaGlmdCwgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICBcCi0JCQlwcmludGsoIjB4JTA0WCA9ICUtMTVzKDB4JTA0WCwweCUwNFgsJWQpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkgICAgcl9hc20sICNuYW1lIl9hc20iLCBkLCBzLCBzaGlmdCwgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixmbGFncykpOwotCi0jZGVmaW5lIFZBTF9GQUlMX0xPTkdfTE9OR19URVJOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSAgICBwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXByaW50aygiMHglMDhYID0gJS0xNXMoMHglMDhYLDB4JTA4WCwlZCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSAgICByLCAjbmFtZSwgZCwgcywgc2hpZnQsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7ICBcCi0JCQlwcmludGsoIjB4JTA4WCA9ICUtMTVzKDB4JTA4WCwweCUwOFgsJWQpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkgICAgcl9hc20sICNuYW1lIl9hc20iLCBkLCBzLCBzaGlmdCwgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixmbGFncykpOwotCi0jZGVmaW5lIFZBTF9FTkRfVEVSTkFSWSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3MgfCAoQUxMX0ZMQUdTICYgfkZfT0YpOyAgIFwKLQkJICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXByaW50aygicGFzc2VkXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFZBTF9XT1JEX1JPVEFURV9EQkwobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX1NUQVJUX1RFUk5BUlkodTE2LHUxNiwweEZGMDAsMHhGRjAwLDB4MTAwLDB4MTAwLDE2KSBcCi0gICAgVkFMX1RFU1RfVEVSTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0ZBSUxfV09SRF9XT1JEX1RFUk5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0VORF9URVJOQVJZKCkKLQotI2RlZmluZSBWQUxfTE9OR19ST1RBVEVfREJMKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX1NUQVJUX1RFUk5BUlkodTMyLHUzMiwweEZGMDAwMDAwLDB4RkYwMDAwMDAsMHgxMDAwMDAwLDB4MTAwMDAwMCwzMikgXAotICAgIFZBTF9URVNUX1RFUk5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRkFJTF9MT05HX0xPTkdfVEVSTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0VORF9URVJOQVJZKCkKLQotI2RlZmluZSBWQUxfU1RBUlRfVU5BUlkocGFybV90eXBlLG1heCxpbmNyKSAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHBhcm1fdHlwZSAgIGQscixyX2FzbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXUzMiAgICAgICAgIGZsYWdzLGluZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgICAgIGYsZmFpbGVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgICAgICAgIGJ1ZjFbODBdLGJ1ZjJbODBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoZCA9IDA7IGQgPCBtYXg7IGQgKz0gaW5jcikgeyAgICAgICAgICAgICAgICAgICAgICAgXAotCU0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFnczsgICAgICAgICBcCi0JZm9yIChmID0gMDsgZiA8IDI7IGYrKykgewotCi0jZGVmaW5lIFZBTF9URVNUX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIHJfYXNtID0gbmFtZSMjX2FzbSgmZmxhZ3MsZCk7ICAgICAgICAgICAgICAgICAgIFwKLQkgICAgciA9IG5hbWUoZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGlmIChyICE9IHJfYXNtIHx8IE0ueDg2LlJfRUZMRyAhPSBmbGFncykgeyAgICAgIFwKLQkJZmFpbGVkID0gdHJ1ZTsKLQotI2RlZmluZSBWQUxfRkFJTF9CWVRFX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcHJpbnRrKCIweCUwMlggPSAlLTE1cygweCUwMlgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICByLCAjbmFtZSwgZCwgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICAgXAotCQlwcmludGsoIjB4JTAyWCA9ICUtMTVzKDB4JTAyWCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHJfYXNtLCAjbmFtZSJfYXNtIiwgZCwgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixmbGFncykpOwotCi0jZGVmaW5lIFZBTF9GQUlMX1dPUkRfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlwcmludGsoIjB4JTA0WCA9ICUtMTVzKDB4JTA0WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHIsICNuYW1lLCBkLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgXAotCQlwcmludGsoIjB4JTA0WCA9ICUtMTVzKDB4JTA0WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHJfYXNtLCAjbmFtZSJfYXNtIiwgZCwgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixmbGFncykpOwotCi0jZGVmaW5lIFZBTF9GQUlMX0xPTkdfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlwcmludGsoIjB4JTA4WCA9ICUtMTVzKDB4JTA4WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHIsICNuYW1lLCBkLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgICBcCi0JCXByaW50aygiMHglMDhYID0gJS0xNXMoMHglMDhYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgcl9hc20sICNuYW1lIl9hc20iLCBkLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7Ci0KLSNkZWZpbmUgVkFMX0VORF9VTkFSWSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFncyB8IEFMTF9GTEFHUzsgICAgIFwKLQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXByaW50aygicGFzc2VkXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgVkFMX0JZVEVfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICBcCi0gICAgVkFMX1NUQVJUX1VOQVJZKHU4LDB4RkYsMHgxKSAgICAgICAgICAgIFwKLSAgICBWQUxfVEVTVF9VTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9GQUlMX0JZVEVfVU5BUlkobmFtZSkgICAgICAgICAgICAgICBcCi0gICAgVkFMX0VORF9VTkFSWSgpCi0KLSNkZWZpbmUgVkFMX1dPUkRfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICBcCi0gICAgVkFMX1NUQVJUX1VOQVJZKHUxNiwweEZGMDAsMHgxMDApICAgICAgIFwKLSAgICBWQUxfVEVTVF9VTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9GQUlMX1dPUkRfVU5BUlkobmFtZSkgICAgICAgICAgICAgICBcCi0gICAgVkFMX0VORF9VTkFSWSgpCi0KLSNkZWZpbmUgVkFMX1dPUkRfQllURV9VTkFSWShuYW1lKSAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICBcCi0gICAgVkFMX1NUQVJUX1VOQVJZKHUxNiwweEZGLDB4MSkgICAgICAgICAgIFwKLSAgICBWQUxfVEVTVF9VTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9GQUlMX1dPUkRfVU5BUlkobmFtZSkgICAgICAgICAgICAgICBcCi0gICAgVkFMX0VORF9VTkFSWSgpCi0KLSNkZWZpbmUgVkFMX0xPTkdfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICBcCi0gICAgVkFMX1NUQVJUX1VOQVJZKHUzMiwweEZGMDAwMDAwLDB4MTAwMDAwMCkgXAotICAgIFZBTF9URVNUX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0ZBSUxfTE9OR19VTkFSWShuYW1lKSAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRU5EX1VOQVJZKCkKLQotI2RlZmluZSBWQUxfQllURV9NVUwobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHU4ICAgICAgICAgIGQsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHUxNiAgICAgICAgIHIscl9hc207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXUzMiAgICAgICAgIGZsYWdzLGluZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgICAgIGYsZmFpbGVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgICAgICAgIGJ1ZjFbODBdLGJ1ZjJbODBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoZCA9IDA7IGQgPCAweEZGOyBkICs9IDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWZvciAocyA9IDA7IHMgPCAweEZGOyBzICs9IDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFnczsgICAgICAgICAgICAgICAgIFwKLQkgICAgZm9yIChmID0gMDsgZiA8IDI7IGYrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQluYW1lIyNfYXNtKCZmbGFncywmcl9hc20sZCxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuUl9BTCA9IGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCW5hbWUocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXIgPSBNLng4Ni5SX0FYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAociAhPSByX2FzbSB8fCBNLng4Ni5SX0VGTEcgIT0gZmxhZ3MpICAgICAgICAgICAgICAgIFwKLQkJICAgIGZhaWxlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChmYWlsZWQgfHwgdHJhY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHByaW50aygiMHglMDRYID0gJS0xNXMoMHglMDJYLDB4JTAyWCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXIsICNuYW1lLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgICAgXAotCQkgICAgcHJpbnRrKCIweCUwNFggPSAlLTE1cygweCUwMlgsMHglMDJYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcl9hc20sICNuYW1lIl9hc20iLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7ICBcCi0JCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzIHwgKEFMTF9GTEFHUyAmIH5GX09GKTsgICBcCi0JCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIWZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcHJpbnRrKCJwYXNzZWRcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgVkFMX1dPUkRfTVVMKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1MTYgICAgICAgICBkLHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1MTYgICAgICAgICByX2xvLHJfYXNtX2xvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1MTYgICAgICAgICByX2hpLHJfYXNtX2hpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl1MzIgICAgICAgICBmbGFncyxpbmZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICAgICBmLGZhaWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyICAgICAgICBidWYxWzgwXSxidWYyWzgwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGQgPSAwOyBkIDwgMHhGRjAwOyBkICs9IDB4MTAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlmb3IgKHMgPSAwOyBzIDwgMHhGRjAwOyBzICs9IDB4MTAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3M7ICAgICAgICAgICAgICAgICBcCi0JICAgIGZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJbmFtZSMjX2FzbSgmZmxhZ3MsJnJfYXNtX2xvLCZyX2FzbV9oaSxkLHMpOyAgICAgICAgICAgICBcCi0JCU0ueDg2LlJfQVggPSBkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQluYW1lKHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlyX2xvID0gTS54ODYuUl9BWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcl9oaSA9IE0ueDg2LlJfRFg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChyX2xvICE9IHJfYXNtX2xvIHx8IHJfaGkgIT0gcl9hc21faGkgfHwgTS54ODYuUl9FRkxHICE9IGZsYWdzKVwKLQkJICAgIGZhaWxlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChmYWlsZWQgfHwgdHJhY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHByaW50aygiMHglMDRYOjB4JTA0WCA9ICUtMTVzKDB4JTA0WCwweCUwNFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXJfaGkscl9sbywgI25hbWUsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7ICAgICAgIFwKLQkJICAgIHByaW50aygiMHglMDRYOjB4JTA0WCA9ICUtMTVzKDB4JTA0WCwweCUwNFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXJfYXNtX2hpLHJfYXNtX2xvLCAjbmFtZSJfYXNtIiwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixmbGFncykpOyAgXAotCQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3MgfCAoQUxMX0ZMQUdTICYgfkZfT0YpOyAgIFwKLQkJaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlwcmludGsoInBhc3NlZFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBWQUxfTE9OR19NVUwobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHUzMiAgICAgICAgIGQsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHUzMiAgICAgICAgIHJfbG8scl9hc21fbG87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHUzMiAgICAgICAgIHJfaGkscl9hc21faGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXUzMiAgICAgICAgIGZsYWdzLGluZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgICAgIGYsZmFpbGVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgICAgICAgIGJ1ZjFbODBdLGJ1ZjJbODBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoZCA9IDA7IGQgPCAweEZGMDAwMDAwOyBkICs9IDB4MTAwMDAwMCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAotCWZvciAocyA9IDA7IHMgPCAweEZGMDAwMDAwOyBzICs9IDB4MTAwMDAwMCkgeyAgICAgICAgICAgICAgICAgICBcCi0JICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFnczsgICAgICAgICAgICAgICAgIFwKLQkgICAgZm9yIChmID0gMDsgZiA8IDI7IGYrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQluYW1lIyNfYXNtKCZmbGFncywmcl9hc21fbG8sJnJfYXNtX2hpLGQscyk7ICAgICAgICAgICAgIFwKLQkJTS54ODYuUl9FQVggPSBkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCW5hbWUocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXJfbG8gPSBNLng4Ni5SX0VBWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlyX2hpID0gTS54ODYuUl9FRFg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKHJfbG8gIT0gcl9hc21fbG8gfHwgcl9oaSAhPSByX2FzbV9oaSB8fCBNLng4Ni5SX0VGTEcgIT0gZmxhZ3MpXAotCQkgICAgZmFpbGVkID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKGZhaWxlZCB8fCB0cmFjZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgcHJpbnRrKCIweCUwOFg6MHglMDhYID0gJS0xNXMoMHglMDhYLDB4JTA4WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcl9oaSxyX2xvLCAjbmFtZSwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICAgICAgXAotCQkgICAgcHJpbnRrKCIweCUwOFg6MHglMDhYID0gJS0xNXMoMHglMDhYLDB4JTA4WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcl9hc21faGkscl9hc21fbG8sICNuYW1lIl9hc20iLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7ICBcCi0JCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFncyB8IChBTExfRkxBR1MgJiB+Rl9PRik7ICAgXAotCQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXByaW50aygicGFzc2VkXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFZBTF9CWVRFX0RJVihuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdTE2ICAgICAgICAgZCxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdTggICAgICAgICAgcl9xdW90LHJfcmVtLHJfYXNtX3F1b3Qscl9hc21fcmVtOyAgICAgICAgICAgICAgICAgICAgICBcCi0JdTMyICAgICAgICAgZmxhZ3MsaW5mbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ICAgICAgICAgZixmYWlsZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciAgICAgICAgYnVmMVs4MF0sYnVmMls4MF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChkID0gMDsgZCA8IDB4RkYwMDsgZCArPSAweDEwMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JZm9yIChzID0gMTsgcyA8IDB4RkY7IHMgKz0gMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzOyAgICAgICAgICAgICAgICAgXAotCSAgICBmb3IgKGYgPSAwOyBmIDwgMjsgZisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LmludHIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5SX0FYID0gZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJbmFtZShzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcl9xdW90ID0gTS54ODYuUl9BTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXJfcmVtID0gTS54ODYuUl9BSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoTS54ODYuaW50ciAmIElOVFJfU1lOQ0gpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCW5hbWUjI19hc20oJmZsYWdzLCZyX2FzbV9xdW90LCZyX2FzbV9yZW0sZCxzKTsgICAgICAgICAgXAotCQlpZiAocl9xdW90ICE9IHJfYXNtX3F1b3QgfHwgcl9yZW0gIT0gcl9hc21fcmVtIHx8IE0ueDg2LlJfRUZMRyAhPSBmbGFncykgXAotCQkgICAgZmFpbGVkID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKGZhaWxlZCB8fCB0cmFjZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgcHJpbnRrKCIweCUwMlg6MHglMDJYID0gJS0xNXMoMHglMDRYLDB4JTAyWCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXJfcXVvdCwgcl9yZW0sICNuYW1lLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgICAgXAotCQkgICAgcHJpbnRrKCIweCUwMlg6MHglMDJYID0gJS0xNXMoMHglMDRYLDB4JTAyWCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXJfYXNtX3F1b3QsIHJfYXNtX3JlbSwgI25hbWUiX2FzbSIsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsgIFwKLQkJICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3MgfCAoQUxMX0ZMQUdTICYgfkZfT0YpOyAgIFwKLQkJaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlwcmludGsoInBhc3NlZFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBWQUxfV09SRF9ESVYobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHUzMiAgICAgICAgIGQsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHUxNiAgICAgICAgIHJfcXVvdCxyX3JlbSxyX2FzbV9xdW90LHJfYXNtX3JlbTsgICAgICAgICAgICAgICAgICAgICAgXAotCXUzMiAgICAgICAgIGZsYWdzLGluZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgICAgIGYsZmFpbGVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgICAgICAgIGJ1ZjFbODBdLGJ1ZjJbODBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoZCA9IDA7IGQgPCAweEZGMDAwMDAwOyBkICs9IDB4MTAwMDAwMCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAotCWZvciAocyA9IDB4MTAwOyBzIDwgMHhGRjAwOyBzICs9IDB4MTAwKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFnczsgICAgICAgICAgICAgICAgIFwKLQkgICAgZm9yIChmID0gMDsgZiA8IDI7IGYrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5pbnRyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuUl9BWCA9IGQgJiAweEZGRkY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LlJfRFggPSBkID4+IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQluYW1lKHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlyX3F1b3QgPSBNLng4Ni5SX0FYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcl9yZW0gPSBNLng4Ni5SX0RYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChNLng4Ni5pbnRyICYgSU5UUl9TWU5DSCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJbmFtZSMjX2FzbSgmZmxhZ3MsJnJfYXNtX3F1b3QsJnJfYXNtX3JlbSxkICYgMHhGRkZGLGQgPj4gMTYscyk7XAotCQlpZiAocl9xdW90ICE9IHJfYXNtX3F1b3QgfHwgcl9yZW0gIT0gcl9hc21fcmVtIHx8IE0ueDg2LlJfRUZMRyAhPSBmbGFncykgXAotCQkgICAgZmFpbGVkID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKGZhaWxlZCB8fCB0cmFjZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgcHJpbnRrKCIweCUwNFg6MHglMDRYID0gJS0xNXMoMHglMDhYLDB4JTA0WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXJfcXVvdCwgcl9yZW0sICNuYW1lLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgICAgXAotCQkgICAgcHJpbnRrKCIweCUwNFg6MHglMDRYID0gJS0xNXMoMHglMDhYLDB4JTA0WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXJfYXNtX3F1b3QsIHJfYXNtX3JlbSwgI25hbWUiX2FzbSIsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsgIFwKLQkJICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3MgfCAoQUxMX0ZMQUdTICYgfkZfT0YpOyAgIFwKLQkJaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlwcmludGsoInBhc3NlZFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBWQUxfTE9OR19ESVYobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHUzMiAgICAgICAgIGQsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHUzMiAgICAgICAgIHJfcXVvdCxyX3JlbSxyX2FzbV9xdW90LHJfYXNtX3JlbTsgICAgICAgICAgICAgICAgICAgICAgXAotCXUzMiAgICAgICAgIGZsYWdzLGluZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgICAgIGYsZmFpbGVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgICAgICAgIGJ1ZjFbODBdLGJ1ZjJbODBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoZCA9IDA7IGQgPCAweEZGMDAwMDAwOyBkICs9IDB4MTAwMDAwMCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAotCWZvciAocyA9IDB4MTAwOyBzIDwgMHhGRjAwOyBzICs9IDB4MTAwKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFnczsgICAgICAgICAgICAgICAgIFwKLQkgICAgZm9yIChmID0gMDsgZiA8IDI7IGYrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5pbnRyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuUl9FQVggPSBkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LlJfRURYID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQluYW1lKHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlyX3F1b3QgPSBNLng4Ni5SX0VBWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcl9yZW0gPSBNLng4Ni5SX0VEWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChNLng4Ni5pbnRyICYgSU5UUl9TWU5DSCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJbmFtZSMjX2FzbSgmZmxhZ3MsJnJfYXNtX3F1b3QsJnJfYXNtX3JlbSxkLDAscyk7ICAgICAgICBcCi0JCWlmIChyX3F1b3QgIT0gcl9hc21fcXVvdCB8fCByX3JlbSAhPSByX2FzbV9yZW0gfHwgTS54ODYuUl9FRkxHICE9IGZsYWdzKSBcCi0JCSAgICBmYWlsZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoZmFpbGVkIHx8IHRyYWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBwcmludGsoIjB4JTA4WDoweCUwOFggPSAlLTE1cygweCUwOFg6MHglMDhYLDB4JTA4WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyX3F1b3QsIHJfcmVtLCAjbmFtZSwgMCwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgIFwKLQkJICAgIHByaW50aygiMHglMDhYOjB4JTA4WCA9ICUtMTVzKDB4JTA4WDoweCUwOFgsMHglMDhYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXJfYXNtX3F1b3QsIHJfYXNtX3JlbSwgI25hbWUiX2FzbSIsIDAsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsgICBcCi0JCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzIHwgKEFMTF9GTEFHUyAmIH5GX09GKTsgICBcCi0JCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIWZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcHJpbnRrKCJwYXNzZWRcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLXZvaWQgcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIHZhX2xpc3QgYXJncHRyOwotICAgIHZhX3N0YXJ0KGFyZ3B0ciwgZm10KTsKLSAgICB2ZnByaW50ZihzdGRvdXQsIGZtdCwgYXJncHRyKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICB2YV9lbmQoYXJncHRyKTsKLX0KLQotY2hhciAqIHByaW50X2ZsYWdzKGNoYXIgKmJ1Zix1bG9uZyBmbGFncykKLXsKLSAgICBjaGFyICpzZXBhcmF0b3IgPSAiIjsKLQotICAgIGJ1ZlswXSA9IDA7Ci0gICAgaWYgKGZsYWdzICYgRl9DRikgewotCXN0cmNhdChidWYsc2VwYXJhdG9yKTsKLQlzdHJjYXQoYnVmLCJDRiIpOwotCXNlcGFyYXRvciA9ICIsIjsKLQl9Ci0gICAgaWYgKGZsYWdzICYgRl9QRikgewotCXN0cmNhdChidWYsc2VwYXJhdG9yKTsKLQlzdHJjYXQoYnVmLCJQRiIpOwotCXNlcGFyYXRvciA9ICIsIjsKLQl9Ci0gICAgaWYgKGZsYWdzICYgRl9BRikgewotCXN0cmNhdChidWYsc2VwYXJhdG9yKTsKLQlzdHJjYXQoYnVmLCJBRiIpOwotCXNlcGFyYXRvciA9ICIsIjsKLQl9Ci0gICAgaWYgKGZsYWdzICYgRl9aRikgewotCXN0cmNhdChidWYsc2VwYXJhdG9yKTsKLQlzdHJjYXQoYnVmLCJaRiIpOwotCXNlcGFyYXRvciA9ICIsIjsKLQl9Ci0gICAgaWYgKGZsYWdzICYgRl9TRikgewotCXN0cmNhdChidWYsc2VwYXJhdG9yKTsKLQlzdHJjYXQoYnVmLCJTRiIpOwotCXNlcGFyYXRvciA9ICIsIjsKLQl9Ci0gICAgaWYgKGZsYWdzICYgRl9PRikgewotCXN0cmNhdChidWYsc2VwYXJhdG9yKTsKLQlzdHJjYXQoYnVmLCJPRiIpOwotCXNlcGFyYXRvciA9ICIsIjsKLQl9Ci0gICAgaWYgKHNlcGFyYXRvclswXSA9PSAwKQotCXN0cmNweShidWYsIk5vbmUiKTsKLSAgICByZXR1cm4gYnVmOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYykKLXsKLSAgICB1bG9uZyAgIGRlZl9mbGFnczsKLSAgICBpbnQgdHJhY2UgPSBmYWxzZTsKLQotICAgIGlmIChhcmdjID4gMSkKLQl0cmFjZSA9IHRydWU7Ci0gICAgbWVtc2V0KCZNLCAwLCBzaXplb2YoTSkpOwotICAgIGRlZl9mbGFncyA9IGdldF9mbGFnc19hc20oKSAmIH5BTExfRkxBR1M7Ci0KLSAgICBWQUxfV09SRF9VTkFSWShhYWFfd29yZCk7Ci0gICAgVkFMX1dPUkRfVU5BUlkoYWFzX3dvcmQpOwotCi0gICAgVkFMX1dPUkRfVU5BUlkoYWFkX3dvcmQpOwotICAgIFZBTF9XT1JEX1VOQVJZKGFhbV93b3JkKTsKLQotICAgIFZBTF9CWVRFX0JZVEVfQklOQVJZKGFkY19ieXRlKTsKLSAgICBWQUxfV09SRF9XT1JEX0JJTkFSWShhZGNfd29yZCk7Ci0gICAgVkFMX0xPTkdfTE9OR19CSU5BUlkoYWRjX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfQllURV9CSU5BUlkoYWRkX2J5dGUpOwotICAgIFZBTF9XT1JEX1dPUkRfQklOQVJZKGFkZF93b3JkKTsKLSAgICBWQUxfTE9OR19MT05HX0JJTkFSWShhZGRfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9CWVRFX0JJTkFSWShhbmRfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfV09SRF9CSU5BUlkoYW5kX3dvcmQpOwotICAgIFZBTF9MT05HX0xPTkdfQklOQVJZKGFuZF9sb25nKTsKLQotICAgIFZBTF9CWVRFX0JZVEVfQklOQVJZKGNtcF9ieXRlKTsKLSAgICBWQUxfV09SRF9XT1JEX0JJTkFSWShjbXBfd29yZCk7Ci0gICAgVkFMX0xPTkdfTE9OR19CSU5BUlkoY21wX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfVU5BUlkoZGFhX2J5dGUpOwotICAgIFZBTF9CWVRFX1VOQVJZKGRhc19ieXRlKTsgICAvKiBGYWlscyBmb3IgMHg5QSAob3V0IG9mIHJhbmdlIGFueXdheSkgKi8KLQotICAgIFZBTF9CWVRFX1VOQVJZKGRlY19ieXRlKTsKLSAgICBWQUxfV09SRF9VTkFSWShkZWNfd29yZCk7Ci0gICAgVkFMX0xPTkdfVU5BUlkoZGVjX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfVU5BUlkoaW5jX2J5dGUpOwotICAgIFZBTF9XT1JEX1VOQVJZKGluY193b3JkKTsKLSAgICBWQUxfTE9OR19VTkFSWShpbmNfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9CWVRFX0JJTkFSWShvcl9ieXRlKTsKLSAgICBWQUxfV09SRF9XT1JEX0JJTkFSWShvcl93b3JkKTsKLSAgICBWQUxfTE9OR19MT05HX0JJTkFSWShvcl9sb25nKTsKLQotICAgIFZBTF9CWVRFX1VOQVJZKG5lZ19ieXRlKTsKLSAgICBWQUxfV09SRF9VTkFSWShuZWdfd29yZCk7Ci0gICAgVkFMX0xPTkdfVU5BUlkobmVnX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfVU5BUlkobm90X2J5dGUpOwotICAgIFZBTF9XT1JEX1VOQVJZKG5vdF93b3JkKTsKLSAgICBWQUxfTE9OR19VTkFSWShub3RfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9ST1RBVEUocmNsX2J5dGUpOwotICAgIFZBTF9XT1JEX1JPVEFURShyY2xfd29yZCk7Ci0gICAgVkFMX0xPTkdfUk9UQVRFKHJjbF9sb25nKTsKLQotICAgIFZBTF9CWVRFX1JPVEFURShyY3JfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfUk9UQVRFKHJjcl93b3JkKTsKLSAgICBWQUxfTE9OR19ST1RBVEUocmNyX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfUk9UQVRFKHJvbF9ieXRlKTsKLSAgICBWQUxfV09SRF9ST1RBVEUocm9sX3dvcmQpOwotICAgIFZBTF9MT05HX1JPVEFURShyb2xfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9ST1RBVEUocm9yX2J5dGUpOwotICAgIFZBTF9XT1JEX1JPVEFURShyb3Jfd29yZCk7Ci0gICAgVkFMX0xPTkdfUk9UQVRFKHJvcl9sb25nKTsKLQotICAgIFZBTF9CWVRFX1JPVEFURShzaGxfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfUk9UQVRFKHNobF93b3JkKTsKLSAgICBWQUxfTE9OR19ST1RBVEUoc2hsX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfUk9UQVRFKHNocl9ieXRlKTsKLSAgICBWQUxfV09SRF9ST1RBVEUoc2hyX3dvcmQpOwotICAgIFZBTF9MT05HX1JPVEFURShzaHJfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9ST1RBVEUoc2FyX2J5dGUpOwotICAgIFZBTF9XT1JEX1JPVEFURShzYXJfd29yZCk7Ci0gICAgVkFMX0xPTkdfUk9UQVRFKHNhcl9sb25nKTsKLQotICAgIFZBTF9XT1JEX1JPVEFURV9EQkwoc2hsZF93b3JkKTsKLSAgICBWQUxfTE9OR19ST1RBVEVfREJMKHNobGRfbG9uZyk7Ci0KLSAgICBWQUxfV09SRF9ST1RBVEVfREJMKHNocmRfd29yZCk7Ci0gICAgVkFMX0xPTkdfUk9UQVRFX0RCTChzaHJkX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfQllURV9CSU5BUlkoc2JiX2J5dGUpOwotICAgIFZBTF9XT1JEX1dPUkRfQklOQVJZKHNiYl93b3JkKTsKLSAgICBWQUxfTE9OR19MT05HX0JJTkFSWShzYmJfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9CWVRFX0JJTkFSWShzdWJfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfV09SRF9CSU5BUlkoc3ViX3dvcmQpOwotICAgIFZBTF9MT05HX0xPTkdfQklOQVJZKHN1Yl9sb25nKTsKLQotICAgIFZBTF9CWVRFX0JZVEVfQklOQVJZKHhvcl9ieXRlKTsKLSAgICBWQUxfV09SRF9XT1JEX0JJTkFSWSh4b3Jfd29yZCk7Ci0gICAgVkFMX0xPTkdfTE9OR19CSU5BUlkoeG9yX2xvbmcpOwotCi0gICAgVkFMX1ZPSURfQllURV9CSU5BUlkodGVzdF9ieXRlKTsKLSAgICBWQUxfVk9JRF9XT1JEX0JJTkFSWSh0ZXN0X3dvcmQpOwotICAgIFZBTF9WT0lEX0xPTkdfQklOQVJZKHRlc3RfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9NVUwoaW11bF9ieXRlKTsKLSAgICBWQUxfV09SRF9NVUwoaW11bF93b3JkKTsKLSAgICBWQUxfTE9OR19NVUwoaW11bF9sb25nKTsKLQotICAgIFZBTF9CWVRFX01VTChtdWxfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfTVVMKG11bF93b3JkKTsKLSAgICBWQUxfTE9OR19NVUwobXVsX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfRElWKGlkaXZfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfRElWKGlkaXZfd29yZCk7Ci0gICAgVkFMX0xPTkdfRElWKGlkaXZfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9ESVYoZGl2X2J5dGUpOwotICAgIFZBTF9XT1JEX0RJVihkaXZfd29yZCk7Ci0gICAgVkFMX0xPTkdfRElWKGRpdl9sb25nKTsKLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9kZWJ1Zy5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9kZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTRhMDk2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6CQlBTlNJIEMKLSogRW52aXJvbm1lbnQ6CUFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBkZWJ1ZyBkZWZpbml0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19YODZFTVVfREVCVUdfSAotI2RlZmluZSBfX1g4NkVNVV9ERUJVR19ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGNoZWNrcyB0byBiZSBlbmFibGVkIGZvciAicnVudGltZSIgKi8KLQotI2RlZmluZSBDSEVDS19JUF9GRVRDSF9GICAgICAgICAgICAgICAgIDB4MQotI2RlZmluZSBDSEVDS19TUF9BQ0NFU1NfRiAgICAgICAgICAgICAgIDB4MgotI2RlZmluZSBDSEVDS19NRU1fQUNDRVNTX0YgICAgICAgICAgICAgIDB4NCAvKnVzaW5nIHJlZ3VsYXIgbGluZWFyIHBvaW50ZXIgKi8KLSNkZWZpbmUgQ0hFQ0tfREFUQV9BQ0NFU1NfRiAgICAgICAgICAgICAweDggLyp1c2luZyBzZWdtZW50Om9mZnNldCovCi0KLSNpZmRlZiBERUJVRwotIyBkZWZpbmUgQ0hFQ0tfSVBfRkVUQ0goKSAgICAgICAgICAgICAgCShNLng4Ni5jaGVjayAmIENIRUNLX0lQX0ZFVENIX0YpCi0jIGRlZmluZSBDSEVDS19TUF9BQ0NFU1MoKSAgICAgICAgICAgICAJKE0ueDg2LmNoZWNrICYgQ0hFQ0tfU1BfQUNDRVNTX0YpCi0jIGRlZmluZSBDSEVDS19NRU1fQUNDRVNTKCkgICAgICAgICAgICAJKE0ueDg2LmNoZWNrICYgQ0hFQ0tfTUVNX0FDQ0VTU19GKQotIyBkZWZpbmUgQ0hFQ0tfREFUQV9BQ0NFU1MoKSAgICAgICAgICAgCShNLng4Ni5jaGVjayAmIENIRUNLX0RBVEFfQUNDRVNTX0YpCi0jZWxzZQotIyBkZWZpbmUgQ0hFQ0tfSVBfRkVUQ0goKQotIyBkZWZpbmUgQ0hFQ0tfU1BfQUNDRVNTKCkKLSMgZGVmaW5lIENIRUNLX01FTV9BQ0NFU1MoKQotIyBkZWZpbmUgQ0hFQ0tfREFUQV9BQ0NFU1MoKQotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotIyBkZWZpbmUgREVCVUdfSU5TVFJVTUVOVCgpICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19JTlNUUlVNRU5UX0YpCi0jIGRlZmluZSBERUJVR19ERUNPREUoKSAgICAgICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX0RFQ09ERV9GKQotIyBkZWZpbmUgREVCVUdfVFJBQ0UoKSAgICAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19UUkFDRV9GKQotIyBkZWZpbmUgREVCVUdfU1RFUCgpICAgICAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19TVEVQX0YpCi0jIGRlZmluZSBERUJVR19ESVNBU1NFTUJMRSgpICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX0RJU0FTU0VNQkxFX0YpCi0jIGRlZmluZSBERUJVR19CUkVBSygpICAgICAgICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX0JSRUFLX0YpCi0jIGRlZmluZSBERUJVR19TVkMoKSAgICAgICAgICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1NWQ19GKQotIyBkZWZpbmUgREVCVUdfU0FWRV9JUF9DUygpICAgICAoTS54ODYuZGVidWcgJiBERUJVR19TQVZFX0NTX0lQKQotCi0jIGRlZmluZSBERUJVR19GUygpICAgICAgICAgICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX0ZTX0YpCi0jIGRlZmluZSBERUJVR19QUk9DKCkgICAgICAgICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1BST0NfRikKLSMgZGVmaW5lIERFQlVHX1NZU0lOVCgpICAgICAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfU1lTSU5UX0YpCi0jIGRlZmluZSBERUJVR19UUkFDRUNBTEwoKSAgICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1RSQUNFQ0FMTF9GKQotIyBkZWZpbmUgREVCVUdfVFJBQ0VDQUxMUkVHUygpIAkoTS54ODYuZGVidWcgJiBERUJVR19UUkFDRUNBTExfUkVHU19GKQotIyBkZWZpbmUgREVCVUdfU1lTKCkgICAgICAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19TWVNfRikKLSMgZGVmaW5lIERFQlVHX01FTV9UUkFDRSgpICAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfTUVNX1RSQUNFX0YpCi0jIGRlZmluZSBERUJVR19JT19UUkFDRSgpICAgICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX0lPX1RSQUNFX0YpCi0jIGRlZmluZSBERUJVR19ERUNPREVfTk9QUklOVCgpIChNLng4Ni5kZWJ1ZyAmIERFQlVHX0RFQ09ERV9OT1BSSU5UX0YpCi0jZWxzZQotIyBkZWZpbmUgREVCVUdfSU5TVFJVTUVOVCgpICAgIAkwCi0jIGRlZmluZSBERUJVR19ERUNPREUoKSAgICAgICAgCTAKLSMgZGVmaW5lIERFQlVHX1RSQUNFKCkgICAgICAgICAJMAotIyBkZWZpbmUgREVCVUdfU1RFUCgpICAgICAgICAgIAkwCi0jIGRlZmluZSBERUJVR19ESVNBU1NFTUJMRSgpICAgCTAKLSMgZGVmaW5lIERFQlVHX0JSRUFLKCkgICAgICAgICAJMAotIyBkZWZpbmUgREVCVUdfU1ZDKCkgICAgICAgICAgIAkwCi0jIGRlZmluZSBERUJVR19TQVZFX0lQX0NTKCkgICAgIDAKLSMgZGVmaW5lIERFQlVHX0ZTKCkgICAgICAgICAgICAJMAotIyBkZWZpbmUgREVCVUdfUFJPQygpICAgICAgICAgIAkwCi0jIGRlZmluZSBERUJVR19TWVNJTlQoKSAgICAgICAgCTAKLSMgZGVmaW5lIERFQlVHX1RSQUNFQ0FMTCgpICAgICAJMAotIyBkZWZpbmUgREVCVUdfVFJBQ0VDQUxMUkVHUygpIAkwCi0jIGRlZmluZSBERUJVR19TWVMoKSAgICAgICAgICAgCTAKLSMgZGVmaW5lIERFQlVHX01FTV9UUkFDRSgpICAgICAJMAotIyBkZWZpbmUgREVCVUdfSU9fVFJBQ0UoKSAgICAgIAkwCi0jIGRlZmluZSBERUJVR19ERUNPREVfTk9QUklOVCgpIDAKLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLQotIyBkZWZpbmUgREVDT0RFX1BSSU5URih4KSAgICAgCWlmIChERUJVR19ERUNPREUoKSkgXAotCQkJCQkJCQkJeDg2ZW11X2RlY29kZV9wcmludGYoeCkKLSMgZGVmaW5lIERFQ09ERV9QUklOVEYyKHgseSkgIAlpZiAoREVCVUdfREVDT0RFKCkpIFwKLQkJCQkJCQkJCXg4NmVtdV9kZWNvZGVfcHJpbnRmMih4LHkpCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGFsbG93IHVzIHRvIGxvb2sgYXQgdGhlIGJ5dGVzIG9mIGFuIGluc3RydWN0aW9uLiAgVGhlCi0gKiBmaXJzdCBJTkNSX0lOU1RSTl9MRU4sIGlzIGNhbGxlZCBldmVyeXRpbWUgYnl0ZXMgYXJlIGNvbnN1bWVkIGluCi0gKiB0aGUgZGVjb2RpbmcgcHJvY2Vzcy4gIFRoZSBTQVZFX0lQX0NTIGlzIGNhbGxlZCBpbml0aWFsbHkgd2hlbiB0aGUKLSAqIG1ham9yIG9wY29kZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYWNjZXNzZWQuCi0gKi8KLSNkZWZpbmUgSU5DX0RFQ09ERURfSU5TVF9MRU4oeCkgICAgICAgICAgICAgICAgICAgIAlcCi0JaWYgKERFQlVHX0RFQ09ERSgpKSAgCSAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkJeDg2ZW11X2luY19kZWNvZGVkX2luc3RfbGVuKHgpCi0KLSNkZWZpbmUgU0FWRV9JUF9DUyh4LHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCVwKLQlpZiAoREVCVUdfREVDT0RFKCkgfCBERUJVR19UUkFDRUNBTEwoKSB8IERFQlVHX0JSRUFLKCkgXAotCSAgICAgIHwgREVCVUdfSU9fVFJBQ0UoKSB8IERFQlVHX1NBVkVfSVBfQ1MoKSkgeyBcCi0JCU0ueDg2LnNhdmVkX2NzID0geDsgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCVwKLQkJTS54ODYuc2F2ZWRfaXAgPSB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJXAotCX0KLSNlbHNlCi0jIGRlZmluZSBJTkNfREVDT0RFRF9JTlNUX0xFTih4KQotIyBkZWZpbmUgREVDT0RFX1BSSU5URih4KQotIyBkZWZpbmUgREVDT0RFX1BSSU5URjIoeCx5KQotIyBkZWZpbmUgU0FWRV9JUF9DUyh4LHkpCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIFRSQUNFX1JFR1MoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlcCi0JaWYgKERFQlVHX0RJU0FTU0VNQkxFKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgCQlcCi0JCXg4NmVtdV9qdXN0X2Rpc2Fzc2VtYmxlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkJZ290byBFbmRPZlRoZUluc3RydWN0aW9uUHJvY2VkdXJlOyAgICAgICAgICAgICAJCVwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQlpZiAoREVCVUdfVFJBQ0UoKSB8fCBERUJVR19ERUNPREUoKSkgWDg2RU1VX3RyYWNlX3JlZ3MoKQotI2Vsc2UKLSMgZGVmaW5lIFRSQUNFX1JFR1MoKQotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotIyBkZWZpbmUgU0lOR0xFX1NURVAoKQkJaWYgKERFQlVHX1NURVAoKSkgeDg2ZW11X3NpbmdsZV9zdGVwKCkKLSNlbHNlCi0jIGRlZmluZSBTSU5HTEVfU1RFUCgpCi0jZW5kaWYKLQotI2RlZmluZSBUUkFDRV9BTkRfU1RFUCgpCVwKLQlUUkFDRV9SRUdTKCk7CQkJXAotCVNJTkdMRV9TVEVQKCkKLQotI2lmZGVmIERFQlVHCi0jIGRlZmluZSBTVEFSVF9PRl9JTlNUUigpCi0jIGRlZmluZSBFTkRfT0ZfSU5TVFIoKQkJRW5kT2ZUaGVJbnN0cnVjdGlvblByb2NlZHVyZTogeDg2ZW11X2VuZF9pbnN0cigpOwotIyBkZWZpbmUgRU5EX09GX0lOU1RSX05PX1RSQUNFKCkJeDg2ZW11X2VuZF9pbnN0cigpOwotI2Vsc2UKLSMgZGVmaW5lIFNUQVJUX09GX0lOU1RSKCkKLSMgZGVmaW5lIEVORF9PRl9JTlNUUigpCi0jIGRlZmluZSBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKQotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotIyBkZWZpbmUgIENBTExfVFJBQ0UodSx2LHcseCxzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoREVCVUdfVFJBQ0VDQUxMUkVHUygpKQkJCQkJCQkJCVwKLQkJeDg2ZW11X2R1bXBfcmVncygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKERFQlVHX1RSQUNFQ0FMTCgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCQlwcmludGsoIiUwNHg6JTA0eDogQ0FMTCAlcyUwNHg6JTA0eFxuIiwgdSAsIHYsIHMsIHcsIHgpOwotIyBkZWZpbmUgUkVUVVJOX1RSQUNFKG4sdSx2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoREVCVUdfVFJBQ0VDQUxMUkVHUygpKQkJCQkJCQkJCVwKLQkJeDg2ZW11X2R1bXBfcmVncygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKERFQlVHX1RSQUNFQ0FMTCgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCQlwcmludGsoIiUwNHg6JTA0eDogJXNcbiIsdSx2LG4pOwotI2Vsc2UKLSMgZGVmaW5lIENBTExfVFJBQ0UodSx2LHcseCxzKQotIyBkZWZpbmUgUkVUVVJOX1RSQUNFKG4sdSx2KQotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZQlEQih4KQl4Ci0jZWxzZQotI2RlZmluZQlEQih4KQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyAgICAgICAgICAgIAkJCS8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCi0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgeDg2ZW11X2luY19kZWNvZGVkX2luc3RfbGVuIChpbnQgeCk7Ci1leHRlcm4gdm9pZCB4ODZlbXVfZGVjb2RlX3ByaW50ZiAoY2hhciAqeCk7Ci1leHRlcm4gdm9pZCB4ODZlbXVfZGVjb2RlX3ByaW50ZjIgKGNoYXIgKngsIGludCB5KTsKLWV4dGVybiB2b2lkIHg4NmVtdV9qdXN0X2Rpc2Fzc2VtYmxlICh2b2lkKTsKLWV4dGVybiB2b2lkIHg4NmVtdV9zaW5nbGVfc3RlcCAodm9pZCk7Ci1leHRlcm4gdm9pZCB4ODZlbXVfZW5kX2luc3RyICh2b2lkKTsKLWV4dGVybiB2b2lkIHg4NmVtdV9kdW1wX3JlZ3MgKHZvaWQpOwotZXh0ZXJuIHZvaWQgeDg2ZW11X2R1bXBfeHJlZ3MgKHZvaWQpOwotZXh0ZXJuIHZvaWQgeDg2ZW11X3ByaW50X2ludF92ZWN0ICh1MTYgaXYpOwotZXh0ZXJuIHZvaWQgeDg2ZW11X2luc3RydW1lbnRfaW5zdHJ1Y3Rpb24gKHZvaWQpOwotZXh0ZXJuIHZvaWQgeDg2ZW11X2NoZWNrX2lwX2FjY2VzcyAodm9pZCk7Ci1leHRlcm4gdm9pZCB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzICh2b2lkKTsKLWV4dGVybiB2b2lkIHg4NmVtdV9jaGVja19tZW1fYWNjZXNzICh1MzIgcCk7Ci1leHRlcm4gdm9pZCB4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MgKHVpbnQgcywgdWludCBvKTsKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgCQkJLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAJKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogX19YODZFTVVfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9kZWNvZGUuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvZGVjb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMWEzNDUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9kZWNvZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZToJCUFOU0kgQwotKiBFbnZpcm9ubWVudDoJQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIGluc3RydWN0aW9uIGRlY29kaW5nIGxvZ2ljLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1g4NkVNVV9ERUNPREVfSAotI2RlZmluZSBfX1g4NkVNVV9ERUNPREVfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBJbnN0cnVjdGlvbiBEZWNvZGluZyBTdHVmZiAqLwotCi0jZGVmaW5lIEZFVENIX0RFQ09ERV9NT0RSTShtb2QscmgscmwpIAlmZXRjaF9kZWNvZGVfbW9kcm0oJm1vZCwmcmgsJnJsKQotI2RlZmluZSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyKSAgICAJZGVjb2RlX3JtX2J5dGVfcmVnaXN0ZXIocikKLSNkZWZpbmUgREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocikgICAgCWRlY29kZV9ybV93b3JkX3JlZ2lzdGVyKHIpCi0jZGVmaW5lIERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHIpICAgIAlkZWNvZGVfcm1fbG9uZ19yZWdpc3RlcihyKQotI2RlZmluZSBERUNPREVfQ0xFQVJfU0VHT1ZSKCkgICAgICAgICAJTS54ODYubW9kZSAmPSB+U1lTTU9ERV9DTFJNQVNLCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyAgICAgICAgICAgIAkJCS8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCi0jZW5kaWYKLQotdm9pZCAJeDg2ZW11X2ludHJfcmFpc2UgKHU4IHR5cGUpOwotdm9pZCAgICBmZXRjaF9kZWNvZGVfbW9kcm0gKGludCAqbW9kLGludCAqcmVnaCxpbnQgKnJlZ2wpOwotdTggICAgICBmZXRjaF9ieXRlX2ltbSAodm9pZCk7Ci11MTYgICAgIGZldGNoX3dvcmRfaW1tICh2b2lkKTsKLXUzMiAgICAgZmV0Y2hfbG9uZ19pbW0gKHZvaWQpOwotdTggICAgICBmZXRjaF9kYXRhX2J5dGUgKHVpbnQgb2Zmc2V0KTsKLXU4ICAgICAgZmV0Y2hfZGF0YV9ieXRlX2FicyAodWludCBzZWdtZW50LCB1aW50IG9mZnNldCk7Ci11MTYgICAgIGZldGNoX2RhdGFfd29yZCAodWludCBvZmZzZXQpOwotdTE2ICAgICBmZXRjaF9kYXRhX3dvcmRfYWJzICh1aW50IHNlZ21lbnQsIHVpbnQgb2Zmc2V0KTsKLXUzMiAgICAgZmV0Y2hfZGF0YV9sb25nICh1aW50IG9mZnNldCk7Ci11MzIgICAgIGZldGNoX2RhdGFfbG9uZ19hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQpOwotdm9pZCAgICBzdG9yZV9kYXRhX2J5dGUgKHVpbnQgb2Zmc2V0LCB1OCB2YWwpOwotdm9pZCAgICBzdG9yZV9kYXRhX2J5dGVfYWJzICh1aW50IHNlZ21lbnQsIHVpbnQgb2Zmc2V0LCB1OCB2YWwpOwotdm9pZCAgICBzdG9yZV9kYXRhX3dvcmQgKHVpbnQgb2Zmc2V0LCB1MTYgdmFsKTsKLXZvaWQgICAgc3RvcmVfZGF0YV93b3JkX2FicyAodWludCBzZWdtZW50LCB1aW50IG9mZnNldCwgdTE2IHZhbCk7Ci12b2lkICAgIHN0b3JlX2RhdGFfbG9uZyAodWludCBvZmZzZXQsIHUzMiB2YWwpOwotdm9pZCAgICBzdG9yZV9kYXRhX2xvbmdfYWJzICh1aW50IHNlZ21lbnQsIHVpbnQgb2Zmc2V0LCB1MzIgdmFsKTsKLXU4KiAJZGVjb2RlX3JtX2J5dGVfcmVnaXN0ZXIoaW50IHJlZyk7Ci11MTYqIAlkZWNvZGVfcm1fd29yZF9yZWdpc3RlcihpbnQgcmVnKTsKLXUzMiogCWRlY29kZV9ybV9sb25nX3JlZ2lzdGVyKGludCByZWcpOwotdTE2KiAJZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihpbnQgcmVnKTsKLXVuc2lnbmVkIGRlY29kZV9ybTAwX2FkZHJlc3MoaW50IHJtKTsKLXVuc2lnbmVkIGRlY29kZV9ybTAxX2FkZHJlc3MoaW50IHJtKTsKLXVuc2lnbmVkIGRlY29kZV9ybTEwX2FkZHJlc3MoaW50IHJtKTsKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgCQkJLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAJKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogX19YODZFTVVfREVDT0RFX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvZnB1LmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L2ZwdS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmIyNzE0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvZnB1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6CQlBTlNJIEMKLSogRW52aXJvbm1lbnQ6CUFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBGUFUgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fWDg2RU1VX0ZQVV9ICi0jZGVmaW5lIF9fWDg2RU1VX0ZQVV9ICi0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyAgICAgICAgICAgIAkJCS8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCi0jZW5kaWYKLQotLyogdGhlc2UgaGF2ZSB0byBiZSBkZWZpbmVkLCB3aGV0aGVyIDgwODcgc3VwcG9ydCBjb21waWxlZCBpbiBvciBub3QuICovCi0KLWV4dGVybiB2b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZDggKHU4IG9wMSk7Ci1leHRlcm4gdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2Q5ICh1OCBvcDEpOwotZXh0ZXJuIHZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kYSAodTggb3AxKTsKLWV4dGVybiB2b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGIgKHU4IG9wMSk7Ci1leHRlcm4gdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RjICh1OCBvcDEpOwotZXh0ZXJuIHZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZCAodTggb3AxKTsKLWV4dGVybiB2b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGUgKHU4IG9wMSk7Ci1leHRlcm4gdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RmICh1OCBvcDEpOwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi19ICAgICAgICAgICAgICAgICAgICAgICAJCQkvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgIAkqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX1g4NkVNVV9GUFVfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9vcHMuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvb3BzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZWE2NzYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9vcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZToJCUFOU0kgQwotKiBFbnZpcm9ubWVudDoJQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIG9wZXJhbmQgZGVjb2RpbmcgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1g4NkVNVV9PUFNfSAotI2RlZmluZSBfX1g4NkVNVV9PUFNfSAotCi1leHRlcm4gdm9pZCAoKng4NmVtdV9vcHRhYlsweDEwMF0pKHU4IG9wMSk7Ci1leHRlcm4gdm9pZCAoKng4NmVtdV9vcHRhYjJbMHgxMDBdKSh1OCBvcDIpOwotCi0jZW5kaWYgLyogX19YODZFTVVfT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvcHJpbV9hc20uaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvcHJpbV9hc20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyM2NmOC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L3ByaW1fYXNtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOgkJV2F0Y29tIEMrKyAxMC42IG9yIGxhdGVyCi0qIEVudmlyb25tZW50OglBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBJbmxpbmUgYXNzZW1ibGVyIHZlcnNpb25zIG9mIHRoZSBwcmltaXRpdmUgb3BlcmFuZAotKgkJCQlmdW5jdGlvbnMgZm9yIGZhc3RlciBwZXJmb3JtYW5jZS4gQXQgdGhlIG1vbWVudCB0aGlzIGlzCi0qCQkJCXg4NiBpbmxpbmUgYXNzZW1ibGVyLCBidXQgdGhlc2UgZnVuY3Rpb25zIGNvdWxkIGJlIHJlcGxhY2VkCi0qCQkJCXdpdGggbmF0aXZlIGlubGluZSBhc3NlbWJsZXIgZm9yIGVhY2ggc3VwcG9ydGVkIHByb2Nlc3NvcgotKgkJCQlwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYJX19YODZFTVVfUFJJTV9BU01fSAotI2RlZmluZQlfX1g4NkVNVV9QUklNX0FTTV9ICi0KLSNpZmRlZglfX1dBVENPTUNfXwotCi0jaWZuZGVmCVZBTElEQVRFCi0jZGVmaW5lCV9fSEFWRV9JTkxJTkVfQVNTRU1CTEVSX18KLSNlbmRpZgotCi11MzIJCWdldF9mbGFnc19hc20odm9pZCk7Ci0jcHJhZ21hIGF1eCBnZXRfZmxhZ3NfYXNtID0JCQlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAllYXgiICAgICAgICAgICAgICAgICAgCVwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheF07Ci0KLXUxNiAgICAgYWFhX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQpOwotI3ByYWdtYSBhdXggYWFhX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImFhYSIgICAgICAgICAgICAgICAgICAJCQlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gCQkJCVwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4XTsKLQotdTE2ICAgICBhYXNfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCk7Ci0jcHJhZ21hIGF1eCBhYXNfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiYWFzIiAgICAgICAgICAgICAgICAgIAkJCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSAJCQkJXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXhdOwotCi11MTYgICAgIGFhZF93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkKTsKLSNwcmFnbWEgYXV4IGFhZF93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJhYWQiICAgICAgICAgICAgICAgICAgCQkJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIAkJCQlcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheF07Ci0KLXUxNiAgICAgYWFtX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTggZCk7Ci0jcHJhZ21hIGF1eCBhYW1fd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiYWFtIiAgICAgICAgICAgICAgICAgIAkJCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSAJCQkJXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXhdOwotCi11OCAgICAgIGFkY19ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggYWRjX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImFkYwlhbCxibCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGJsXTsKLQotdTE2ICAgICBhZGNfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTE2IHMpOwotI3ByYWdtYSBhdXggYWRjX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImFkYwlheCxieCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGJ4XTsKLQotdTMyICAgICBhZGNfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTMyIHMpOwotI3ByYWdtYSBhdXggYWRjX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImFkYwllYXgsZWJ4IiAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtlYnhdICAgICAgICAgIFwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBlYnhdOwotCi11OCAgICAgIGFkZF9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggYWRkX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImFkZAlhbCxibCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGJsXTsKLQotdTE2ICAgICBhZGRfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTE2IHMpOwotI3ByYWdtYSBhdXggYWRkX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImFkZAlheCxieCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGJ4XTsKLQotdTMyICAgICBhZGRfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTMyIHMpOwotI3ByYWdtYSBhdXggYWRkX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImFkZAllYXgsZWJ4IiAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtlYnhdICAgICAgICAgIFwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBlYnhdOwotCi11OCAgICAgIGFuZF9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggYW5kX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImFuZAlhbCxibCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGJsXTsKLQotdTE2ICAgICBhbmRfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTE2IHMpOwotI3ByYWdtYSBhdXggYW5kX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImFuZAlheCxieCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGJ4XTsKLQotdTMyICAgICBhbmRfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTMyIHMpOwotI3ByYWdtYSBhdXggYW5kX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImFuZAllYXgsZWJ4IiAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtlYnhdICAgICAgICAgIFwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBlYnhdOwotCi11OCAgICAgIGNtcF9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggY21wX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImNtcAlhbCxibCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGJsXTsKLQotdTE2ICAgICBjbXBfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTE2IHMpOwotI3ByYWdtYSBhdXggY21wX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImNtcAlheCxieCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGJ4XTsKLQotdTMyICAgICBjbXBfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTMyIHMpOwotI3ByYWdtYSBhdXggY21wX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImNtcAllYXgsZWJ4IiAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtlYnhdICAgICAgICAgIFwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBlYnhdOwotCi11OCAgICAgIGRhYV9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQpOwotI3ByYWdtYSBhdXggZGFhX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImRhYSIgICAgICAgICAgICAgICAgICAJCQlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gICAgICAgICAgICAJCVwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsXTsKLQotdTggICAgICBkYXNfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkKTsKLSNwcmFnbWEgYXV4IGRhc19ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJkYXMiICAgICAgICAgICAgICAgICAgCQkJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgCQlcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbF07Ci0KLXU4ICAgICAgZGVjX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCk7Ci0jcHJhZ21hIGF1eCBkZWNfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiZGVjCWFsIiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gICAgICAgICAgICAJCVwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsXTsKLQotdTE2ICAgICBkZWNfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCk7Ci0jcHJhZ21hIGF1eCBkZWNfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiZGVjCWF4IiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gICAgICAgICAgICAJCVwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4XTsKLQotdTMyICAgICBkZWNfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCk7Ci0jcHJhZ21hIGF1eCBkZWNfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiZGVjCWVheCIgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gICAgICAgICAgCQlcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXhdOwotCi11OCAgICAgIGluY19ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQpOwotI3ByYWdtYSBhdXggaW5jX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImluYwlhbCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgCQlcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbF07Ci0KLXUxNiAgICAgaW5jX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQpOwotI3ByYWdtYSBhdXggaW5jX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImluYwlheCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdICAgICAgICAgICAgCQlcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheF07Ci0KLXUzMiAgICAgaW5jX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQpOwotI3ByYWdtYSBhdXggaW5jX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImluYwllYXgiICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdICAgICAgICAgIAkJXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4XTsKLQotdTggICAgICBvcl9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggb3JfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkib3IJYWwsYmwiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgYmxdOwotCi11MTYgICAgIG9yX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBzKTsKLSNwcmFnbWEgYXV4IG9yX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JIm9yCWF4LGJ4IiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGJ4XTsKLQotdTMyICAgICBvcl9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1MzIgcyk7Ci0jcHJhZ21hIGF1eCBvcl9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJvcgllYXgsZWJ4IiAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKLQotdTggICAgICBuZWdfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkKTsKLSNwcmFnbWEgYXV4IG5lZ19ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJuZWcJYWwiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSAgICAgICAgICAgIAkJXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWxdOwotCi11MTYgICAgIG5lZ193b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkKTsKLSNwcmFnbWEgYXV4IG5lZ193b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJuZWcJYXgiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSAgICAgICAgICAgIAkJXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXhdOwotCi11MzIgICAgIG5lZ19sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkKTsKLSNwcmFnbWEgYXV4IG5lZ19sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJuZWcJZWF4IiAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSAgICAgICAgICAJCVwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheF07Ci0KLXU4ICAgICAgbm90X2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCk7Ci0jcHJhZ21hIGF1eCBub3RfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkibm90CWFsIiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gICAgICAgICAgICAJCVwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsXTsKLQotdTE2ICAgICBub3Rfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCk7Ci0jcHJhZ21hIGF1eCBub3Rfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkibm90CWF4IiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gICAgICAgICAgICAJCVwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4XTsKLQotdTMyICAgICBub3RfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCk7Ci0jcHJhZ21hIGF1eCBub3RfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkibm90CWVheCIgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gICAgICAgICAgCQlcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXhdOwotCi11OCAgICAgIHJjbF9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggcmNsX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInJjbAlhbCxjbCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2NsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGNsXTsKLQotdTE2ICAgICByY2xfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCByY2xfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkicmNsCWF4LGNsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbY2xdICAgICAgICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggY2xdOwotCi11MzIgICAgIHJjbF9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHJjbF9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJyY2wJZWF4LGNsIiAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbY2xdICAgICAgICAgIAlcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggY2xdOwotCi11OCAgICAgIHJjcl9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggcmNyX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInJjcglhbCxjbCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2NsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGNsXTsKLQotdTE2ICAgICByY3Jfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCByY3Jfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkicmNyCWF4LGNsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbY2xdICAgICAgICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggY2xdOwotCi11MzIgICAgIHJjcl9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHJjcl9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJyY3IJZWF4LGNsIiAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbY2xdICAgICAgICAgIAlcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggY2xdOwotCi11OCAgICAgIHJvbF9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggcm9sX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInJvbAlhbCxjbCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2NsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGNsXTsKLQotdTE2ICAgICByb2xfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCByb2xfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkicm9sCWF4LGNsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbY2xdICAgICAgICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggY2xdOwotCi11MzIgICAgIHJvbF9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHJvbF9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJyb2wJZWF4LGNsIiAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbY2xdICAgICAgICAgIAlcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggY2xdOwotCi11OCAgICAgIHJvcl9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggcm9yX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInJvcglhbCxjbCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2NsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGNsXTsKLQotdTE2ICAgICByb3Jfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCByb3Jfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkicm9yCWF4LGNsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbY2xdICAgICAgICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggY2xdOwotCi11MzIgICAgIHJvcl9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHJvcl9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJyb3IJZWF4LGNsIiAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbY2xdICAgICAgICAgIAlcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggY2xdOwotCi11OCAgICAgIHNobF9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggc2hsX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNobAlhbCxjbCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2NsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGNsXTsKLQotdTE2ICAgICBzaGxfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBzaGxfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2hsCWF4LGNsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbY2xdICAgICAgICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggY2xdOwotCi11MzIgICAgIHNobF9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHNobF9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzaGwJZWF4LGNsIiAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbY2xdICAgICAgICAgIAlcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggY2xdOwotCi11OCAgICAgIHNocl9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggc2hyX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNocglhbCxjbCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2NsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGNsXTsKLQotdTE2ICAgICBzaHJfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBzaHJfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2hyCWF4LGNsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbY2xdICAgICAgICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggY2xdOwotCi11MzIgICAgIHNocl9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHNocl9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzaHIJZWF4LGNsIiAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbY2xdICAgICAgICAgIAlcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggY2xdOwotCi11OCAgICAgIHNhcl9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggc2FyX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNhcglhbCxjbCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2NsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGNsXTsKLQotdTE2ICAgICBzYXJfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBzYXJfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2FyCWF4LGNsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbY2xdICAgICAgICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggY2xdOwotCi11MzIgICAgIHNhcl9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHNhcl9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzYXIJZWF4LGNsIiAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbY2xdICAgICAgICAgIAlcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggY2xdOwotCi11MTYJCXNobGRfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTE2IGZpbGwsIHU4IHMpOwotI3ByYWdtYSBhdXggc2hsZF93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzaGxkCWF4LGR4LGNsIiAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbZHhdIFtjbF0gICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggZHggY2xdOwotCi11MzIgICAgIHNobGRfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTMyIGZpbGwsIHU4IHMpOwotI3ByYWdtYSBhdXggc2hsZF9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzaGxkCWVheCxlZHgsY2wiICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2VkeF0gW2NsXSAgICAgXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGVkeCBjbF07Ci0KLXUxNgkJc2hyZF93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1MTYgZmlsbCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBzaHJkX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNocmQJYXgsZHgsY2wiICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtkeF0gW2NsXSAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBkeCBjbF07Ci0KLXUzMiAgICAgc2hyZF9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1MzIgZmlsbCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBzaHJkX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNocmQJZWF4LGVkeCxjbCIgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbZWR4XSBbY2xdICAgICBcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggZWR4IGNsXTsKLQotdTggICAgICBzYmJfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHNiYl9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzYmIJYWwsYmwiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBibF07Ci0KLXUxNiAgICAgc2JiX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBzKTsKLSNwcmFnbWEgYXV4IHNiYl93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzYmIJYXgsYngiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBieF07Ci0KLXUzMiAgICAgc2JiX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBzKTsKLSNwcmFnbWEgYXV4IHNiYl9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzYmIJZWF4LGVieCIgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKLQotdTggICAgICBzdWJfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHN1Yl9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzdWIJYWwsYmwiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBibF07Ci0KLXUxNiAgICAgc3ViX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBzKTsKLSNwcmFnbWEgYXV4IHN1Yl93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzdWIJYXgsYngiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBieF07Ci0KLXUzMiAgICAgc3ViX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBzKTsKLSNwcmFnbWEgYXV4IHN1Yl9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzdWIJZWF4LGVieCIgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKLQotdm9pZAl0ZXN0X2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCB0ZXN0X2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInRlc3QJYWwsYmwiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBibF07Ci0KLXZvaWQJdGVzdF93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1MTYgcyk7Ci0jcHJhZ21hIGF1eCB0ZXN0X3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInRlc3QJYXgsYngiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBieF07Ci0KLXZvaWQJdGVzdF9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1MzIgcyk7Ci0jcHJhZ21hIGF1eCB0ZXN0X2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInRlc3QJZWF4LGVieCIgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKLQotdTggICAgICB4b3JfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHhvcl9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJ4b3IJYWwsYmwiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBibF07Ci0KLXUxNiAgICAgeG9yX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBzKTsKLSNwcmFnbWEgYXV4IHhvcl93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJ4b3IJYXgsYngiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBieF07Ci0KLXUzMiAgICAgeG9yX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBzKTsKLSNwcmFnbWEgYXV4IHhvcl9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJ4b3IJZWF4LGVieCIgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKLQotdm9pZCAgICBpbXVsX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTE2ICpheCx1OCBkLHU4IHMpOwotI3ByYWdtYSBhdXggaW11bF9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJpbXVsCWJsIiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkibW92CVtlc2ldLGF4IgkJCQlcCi0JcGFybSBbZWRpXSBbZXNpXSBbYWxdIFtibF0gICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlc2kgYXggYmxdOwotCi12b2lkICAgIGltdWxfd29yZF9hc20odTMyICpmbGFncyx1MTYgKmF4LHUxNiAqZHgsdTE2IGQsdTE2IHMpOwotI3ByYWdtYSBhdXggaW11bF93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJpbXVsCWJ4IiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkibW92CVtlc2ldLGF4IgkJCQlcCi0JIm1vdglbZWN4XSxkeCIJCQkJXAotCXBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbYnhdXAotCW1vZGlmeSBleGFjdCBbZXNpIGVkaSBheCBieCBkeF07Ci0KLXZvaWQgICAgaW11bF9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiAqZWF4LHUzMiAqZWR4LHUzMiBkLHUzMiBzKTsKLSNwcmFnbWEgYXV4IGltdWxfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiaW11bAllYngiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJtb3YJW2VzaV0sZWF4IgkJCQlcCi0JIm1vdglbZWN4XSxlZHgiCQkJCVwKLQlwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtlYXhdIFtlYnhdIFwKLQltb2RpZnkgZXhhY3QgW2VzaSBlZGkgZWF4IGVieCBlZHhdOwotCi12b2lkICAgIG11bF9ieXRlX2FzbSh1MzIgKmZsYWdzLHUxNiAqYXgsdTggZCx1OCBzKTsKLSNwcmFnbWEgYXV4IG11bF9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJtdWwJYmwiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJtb3YJW2VzaV0sYXgiCQkJCVwKLQlwYXJtIFtlZGldIFtlc2ldIFthbF0gW2JsXSAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VzaSBheCBibF07Ci0KLXZvaWQgICAgbXVsX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2ICpheCx1MTYgKmR4LHUxNiBkLHUxNiBzKTsKLSNwcmFnbWEgYXV4IG11bF93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJtdWwJYngiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJtb3YJW2VzaV0sYXgiCQkJCVwKLQkibW92CVtlY3hdLGR4IgkJCQlcCi0JcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbYXhdIFtieF1cCi0JbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGF4IGJ4IGR4XTsKLQotdm9pZCAgICBtdWxfbG9uZ19hc20odTMyICpmbGFncyx1MzIgKmVheCx1MzIgKmVkeCx1MzIgZCx1MzIgcyk7Ci0jcHJhZ21hIGF1eCBtdWxfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkibXVsCWVieCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JIm1vdglbZXNpXSxlYXgiCQkJCVwKLQkibW92CVtlY3hdLGVkeCIJCQkJXAotCXBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2VheF0gW2VieF0gXAotCW1vZGlmeSBleGFjdCBbZXNpIGVkaSBlYXggZWJ4IGVkeF07Ci0KLXZvaWQJaWRpdl9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4ICphbCx1OCAqYWgsdTE2IGQsdTggcyk7Ci0jcHJhZ21hIGF1eCBpZGl2X2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImlkaXYJYmwiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJtb3YJW2VzaV0sYWwiCQkJCVwKLQkibW92CVtlY3hdLGFoIgkJCQlcCi0JcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbYXhdIFtibF1cCi0JbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGF4IGJsXTsKLQotdm9pZAlpZGl2X3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2ICpheCx1MTYgKmR4LHUxNiBkbG8sdTE2IGRoaSx1MTYgcyk7Ci0jcHJhZ21hIGF1eCBpZGl2X3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImlkaXYJYngiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJtb3YJW2VzaV0sYXgiCQkJCVwKLQkibW92CVtlY3hdLGR4IgkJCQlcCi0JcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbYXhdIFtkeF0gW2J4XVwKLQltb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggZHggYnhdOwotCi12b2lkCWlkaXZfbG9uZ19hc20odTMyICpmbGFncyx1MzIgKmVheCx1MzIgKmVkeCx1MzIgZGxvLHUzMiBkaGksdTMyIHMpOwotI3ByYWdtYSBhdXggaWRpdl9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJpZGl2CWVieCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JIm1vdglbZXNpXSxlYXgiCQkJCVwKLQkibW92CVtlY3hdLGVkeCIJCQkJXAotCXBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2VheF0gW2VkeF0gW2VieF1cCi0JbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGVheCBlZHggZWJ4XTsKLQotdm9pZAlkaXZfYnl0ZV9hc20odTMyICpmbGFncyx1OCAqYWwsdTggKmFoLHUxNiBkLHU4IHMpOwotI3ByYWdtYSBhdXggZGl2X2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImRpdglibCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JIm1vdglbZXNpXSxhbCIJCQkJXAotCSJtb3YJW2VjeF0sYWgiCQkJCVwKLQlwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtheF0gW2JsXVwKLQltb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggYmxdOwotCi12b2lkCWRpdl93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiAqYXgsdTE2ICpkeCx1MTYgZGxvLHUxNiBkaGksdTE2IHMpOwotI3ByYWdtYSBhdXggZGl2X3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImRpdglieCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JIm1vdglbZXNpXSxheCIJCQkJXAotCSJtb3YJW2VjeF0sZHgiCQkJCVwKLQlwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtheF0gW2R4XSBbYnhdXAotCW1vZGlmeSBleGFjdCBbZXNpIGVkaSBheCBkeCBieF07Ci0KLXZvaWQJZGl2X2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyICplYXgsdTMyICplZHgsdTMyIGRsbyx1MzIgZGhpLHUzMiBzKTsKLSNwcmFnbWEgYXV4IGRpdl9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJkaXYJZWJ4IiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkibW92CVtlc2ldLGVheCIJCQkJXAotCSJtb3YJW2VjeF0sZWR4IgkJCQlcCi0JcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbZWF4XSBbZWR4XSBbZWJ4XVwKLQltb2RpZnkgZXhhY3QgW2VzaSBlZGkgZWF4IGVkeCBlYnhdOwotCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fWDg2RU1VX1BSSU1fQVNNX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvcHJpbV9vcHMuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvcHJpbV9vcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYzM2ZlMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L3ByaW1fb3BzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOgkJQU5TSSBDCi0qIEVudmlyb25tZW50OglBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgcHJpbWl0aXZlIG9wZXJhdGlvbiBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fWDg2RU1VX1BSSU1fT1BTX0gKLSNkZWZpbmUgX19YODZFTVVfUFJJTV9PUFNfSAotCi0jaW5jbHVkZSAieDg2ZW11L3ByaW1fYXNtLmgiCi0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyAgICAgICAgICAgIAkJCS8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCi0jZW5kaWYKLQotdTE2ICAgICBhYWFfd29yZCAodTE2IGQpOwotdTE2ICAgICBhYXNfd29yZCAodTE2IGQpOwotdTE2ICAgICBhYWRfd29yZCAodTE2IGQpOwotdTE2ICAgICBhYW1fd29yZCAodTggZCk7Ci11OCAgICAgIGFkY19ieXRlICh1OCBkLCB1OCBzKTsKLXUxNiAgICAgYWRjX3dvcmQgKHUxNiBkLCB1MTYgcyk7Ci11MzIgICAgIGFkY19sb25nICh1MzIgZCwgdTMyIHMpOwotdTggICAgICBhZGRfYnl0ZSAodTggZCwgdTggcyk7Ci11MTYgICAgIGFkZF93b3JkICh1MTYgZCwgdTE2IHMpOwotdTMyICAgICBhZGRfbG9uZyAodTMyIGQsIHUzMiBzKTsKLXU4ICAgICAgYW5kX2J5dGUgKHU4IGQsIHU4IHMpOwotdTE2ICAgICBhbmRfd29yZCAodTE2IGQsIHUxNiBzKTsKLXUzMiAgICAgYW5kX2xvbmcgKHUzMiBkLCB1MzIgcyk7Ci11OCAgICAgIGNtcF9ieXRlICh1OCBkLCB1OCBzKTsKLXUxNiAgICAgY21wX3dvcmQgKHUxNiBkLCB1MTYgcyk7Ci11MzIgICAgIGNtcF9sb25nICh1MzIgZCwgdTMyIHMpOwotdTggICAgICBkYWFfYnl0ZSAodTggZCk7Ci11OCAgICAgIGRhc19ieXRlICh1OCBkKTsKLXU4ICAgICAgZGVjX2J5dGUgKHU4IGQpOwotdTE2ICAgICBkZWNfd29yZCAodTE2IGQpOwotdTMyICAgICBkZWNfbG9uZyAodTMyIGQpOwotdTggICAgICBpbmNfYnl0ZSAodTggZCk7Ci11MTYgICAgIGluY193b3JkICh1MTYgZCk7Ci11MzIgICAgIGluY19sb25nICh1MzIgZCk7Ci11OCAgICAgIG9yX2J5dGUgKHU4IGQsIHU4IHMpOwotdTE2ICAgICBvcl93b3JkICh1MTYgZCwgdTE2IHMpOwotdTMyICAgICBvcl9sb25nICh1MzIgZCwgdTMyIHMpOwotdTggICAgICBuZWdfYnl0ZSAodTggcyk7Ci11MTYgICAgIG5lZ193b3JkICh1MTYgcyk7Ci11MzIgICAgIG5lZ19sb25nICh1MzIgcyk7Ci11OCAgICAgIG5vdF9ieXRlICh1OCBzKTsKLXUxNiAgICAgbm90X3dvcmQgKHUxNiBzKTsKLXUzMiAgICAgbm90X2xvbmcgKHUzMiBzKTsKLXU4ICAgICAgcmNsX2J5dGUgKHU4IGQsIHU4IHMpOwotdTE2ICAgICByY2xfd29yZCAodTE2IGQsIHU4IHMpOwotdTMyICAgICByY2xfbG9uZyAodTMyIGQsIHU4IHMpOwotdTggICAgICByY3JfYnl0ZSAodTggZCwgdTggcyk7Ci11MTYgICAgIHJjcl93b3JkICh1MTYgZCwgdTggcyk7Ci11MzIgICAgIHJjcl9sb25nICh1MzIgZCwgdTggcyk7Ci11OCAgICAgIHJvbF9ieXRlICh1OCBkLCB1OCBzKTsKLXUxNiAgICAgcm9sX3dvcmQgKHUxNiBkLCB1OCBzKTsKLXUzMiAgICAgcm9sX2xvbmcgKHUzMiBkLCB1OCBzKTsKLXU4ICAgICAgcm9yX2J5dGUgKHU4IGQsIHU4IHMpOwotdTE2ICAgICByb3Jfd29yZCAodTE2IGQsIHU4IHMpOwotdTMyICAgICByb3JfbG9uZyAodTMyIGQsIHU4IHMpOwotdTggICAgICBzaGxfYnl0ZSAodTggZCwgdTggcyk7Ci11MTYgICAgIHNobF93b3JkICh1MTYgZCwgdTggcyk7Ci11MzIgICAgIHNobF9sb25nICh1MzIgZCwgdTggcyk7Ci11OCAgICAgIHNocl9ieXRlICh1OCBkLCB1OCBzKTsKLXUxNiAgICAgc2hyX3dvcmQgKHUxNiBkLCB1OCBzKTsKLXUzMiAgICAgc2hyX2xvbmcgKHUzMiBkLCB1OCBzKTsKLXU4ICAgICAgc2FyX2J5dGUgKHU4IGQsIHU4IHMpOwotdTE2ICAgICBzYXJfd29yZCAodTE2IGQsIHU4IHMpOwotdTMyICAgICBzYXJfbG9uZyAodTMyIGQsIHU4IHMpOwotdTE2ICAgICBzaGxkX3dvcmQgKHUxNiBkLCB1MTYgZmlsbCwgdTggcyk7Ci11MzIgICAgIHNobGRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKTsKLXUxNiAgICAgc2hyZF93b3JkICh1MTYgZCwgdTE2IGZpbGwsIHU4IHMpOwotdTMyICAgICBzaHJkX2xvbmcgKHUzMiBkLCB1MzIgZmlsbCwgdTggcyk7Ci11OCAgICAgIHNiYl9ieXRlICh1OCBkLCB1OCBzKTsKLXUxNiAgICAgc2JiX3dvcmQgKHUxNiBkLCB1MTYgcyk7Ci11MzIgICAgIHNiYl9sb25nICh1MzIgZCwgdTMyIHMpOwotdTggICAgICBzdWJfYnl0ZSAodTggZCwgdTggcyk7Ci11MTYgICAgIHN1Yl93b3JkICh1MTYgZCwgdTE2IHMpOwotdTMyICAgICBzdWJfbG9uZyAodTMyIGQsIHUzMiBzKTsKLXZvaWQgICAgdGVzdF9ieXRlICh1OCBkLCB1OCBzKTsKLXZvaWQgICAgdGVzdF93b3JkICh1MTYgZCwgdTE2IHMpOwotdm9pZCAgICB0ZXN0X2xvbmcgKHUzMiBkLCB1MzIgcyk7Ci11OCAgICAgIHhvcl9ieXRlICh1OCBkLCB1OCBzKTsKLXUxNiAgICAgeG9yX3dvcmQgKHUxNiBkLCB1MTYgcyk7Ci11MzIgICAgIHhvcl9sb25nICh1MzIgZCwgdTMyIHMpOwotdm9pZCAgICBpbXVsX2J5dGUgKHU4IHMpOwotdm9pZCAgICBpbXVsX3dvcmQgKHUxNiBzKTsKLXZvaWQgICAgaW11bF9sb25nICh1MzIgcyk7Ci12b2lkIAlpbXVsX2xvbmdfZGlyZWN0KHUzMiAqcmVzX2xvLCB1MzIqIHJlc19oaSx1MzIgZCwgdTMyIHMpOwotdm9pZCAgICBtdWxfYnl0ZSAodTggcyk7Ci12b2lkICAgIG11bF93b3JkICh1MTYgcyk7Ci12b2lkICAgIG11bF9sb25nICh1MzIgcyk7Ci12b2lkICAgIGlkaXZfYnl0ZSAodTggcyk7Ci12b2lkICAgIGlkaXZfd29yZCAodTE2IHMpOwotdm9pZCAgICBpZGl2X2xvbmcgKHUzMiBzKTsKLXZvaWQgICAgZGl2X2J5dGUgKHU4IHMpOwotdm9pZCAgICBkaXZfd29yZCAodTE2IHMpOwotdm9pZCAgICBkaXZfbG9uZyAodTMyIHMpOwotdm9pZCAgICBpbnMgKGludCBzaXplKTsKLXZvaWQgICAgb3V0cyAoaW50IHNpemUpOwotdTE2ICAgICBtZW1fYWNjZXNzX3dvcmQgKGludCBhZGRyKTsKLXZvaWQgICAgcHVzaF93b3JkICh1MTYgdyk7Ci12b2lkICAgIHB1c2hfbG9uZyAodTMyIHcpOwotdTE2ICAgICBwb3Bfd29yZCAodm9pZCk7Ci11MzIJCXBvcF9sb25nICh2b2lkKTsKLQotI2lmICBkZWZpbmVkKF9fSEFWRV9JTkxJTkVfQVNTRU1CTEVSX18pICYmICFkZWZpbmVkKFBSSU1fT1BTX05PX1JFREVGSU5FX0FTTSkKLQotI2RlZmluZQlhYWFfd29yZChkKQkJYWFhX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCkKLSNkZWZpbmUgYWFzX3dvcmQoZCkJCWFhc193b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQpCi0jZGVmaW5lIGFhZF93b3JkKGQpCQlhYWRfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKQotI2RlZmluZSBhYW1fd29yZChkKQkJYWFtX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCkKLSNkZWZpbmUgYWRjX2J5dGUoZCxzKQlhZGNfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIGFkY193b3JkKGQscykJYWRjX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBhZGNfbG9uZyhkLHMpCWFkY19sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgYWRkX2J5dGUoZCxzKSAJYWRkX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBhZGRfd29yZChkLHMpCWFkZF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgYWRkX2xvbmcoZCxzKQlhZGRfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIGFuZF9ieXRlKGQscykJYW5kX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBhbmRfd29yZChkLHMpCWFuZF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgYW5kX2xvbmcoZCxzKQlhbmRfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIGNtcF9ieXRlKGQscykJY21wX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBjbXBfd29yZChkLHMpCWNtcF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgY21wX2xvbmcoZCxzKQljbXBfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIGRhYV9ieXRlKGQpCQlkYWFfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkKQotI2RlZmluZSBkYXNfYnl0ZShkKQkJZGFzX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCkKLSNkZWZpbmUgZGVjX2J5dGUoZCkJCWRlY19ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQpCi0jZGVmaW5lIGRlY193b3JkKGQpCQlkZWNfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKQotI2RlZmluZSBkZWNfbG9uZyhkKQkJZGVjX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCkKLSNkZWZpbmUgaW5jX2J5dGUoZCkJCWluY19ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQpCi0jZGVmaW5lIGluY193b3JkKGQpCQlpbmNfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKQotI2RlZmluZSBpbmNfbG9uZyhkKQkJaW5jX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCkKLSNkZWZpbmUgb3JfYnl0ZShkLHMpCW9yX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBvcl93b3JkKGQscykJb3Jfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIG9yX2xvbmcoZCxzKQlvcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgbmVnX2J5dGUocykJCW5lZ19ieXRlX2FzbSgmTS54ODYuUl9FRkxHLHMpCi0jZGVmaW5lIG5lZ193b3JkKHMpCQluZWdfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxzKQotI2RlZmluZSBuZWdfbG9uZyhzKQkJbmVnX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcscykKLSNkZWZpbmUgbm90X2J5dGUocykJCW5vdF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLHMpCi0jZGVmaW5lIG5vdF93b3JkKHMpCQlub3Rfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxzKQotI2RlZmluZSBub3RfbG9uZyhzKQkJbm90X2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcscykKLSNkZWZpbmUgcmNsX2J5dGUoZCxzKQlyY2xfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHJjbF93b3JkKGQscykJcmNsX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSByY2xfbG9uZyhkLHMpCXJjbF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgcmNyX2J5dGUoZCxzKQlyY3JfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHJjcl93b3JkKGQscykJcmNyX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSByY3JfbG9uZyhkLHMpCXJjcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgcm9sX2J5dGUoZCxzKQlyb2xfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHJvbF93b3JkKGQscykJcm9sX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSByb2xfbG9uZyhkLHMpCXJvbF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgcm9yX2J5dGUoZCxzKQlyb3JfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHJvcl93b3JkKGQscykJcm9yX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSByb3JfbG9uZyhkLHMpCXJvcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgc2hsX2J5dGUoZCxzKQlzaGxfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHNobF93b3JkKGQscykJc2hsX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBzaGxfbG9uZyhkLHMpCXNobF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgc2hyX2J5dGUoZCxzKQlzaHJfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHNocl93b3JkKGQscykJc2hyX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBzaHJfbG9uZyhkLHMpCXNocl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgc2FyX2J5dGUoZCxzKQlzYXJfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHNhcl93b3JkKGQscykJc2FyX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBzYXJfbG9uZyhkLHMpCXNhcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgc2hsZF93b3JkKGQsZmlsbCxzKQlzaGxkX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxmaWxsLHMpCi0jZGVmaW5lIHNobGRfbG9uZyhkLGZpbGwscykJc2hsZF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQsZmlsbCxzKQotI2RlZmluZSBzaHJkX3dvcmQoZCxmaWxsLHMpCXNocmRfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLGZpbGwscykKLSNkZWZpbmUgc2hyZF9sb25nKGQsZmlsbCxzKQlzaHJkX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxmaWxsLHMpCi0jZGVmaW5lIHNiYl9ieXRlKGQscykJc2JiX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBzYmJfd29yZChkLHMpCXNiYl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgc2JiX2xvbmcoZCxzKQlzYmJfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHN1Yl9ieXRlKGQscykJc3ViX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBzdWJfd29yZChkLHMpCXN1Yl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgc3ViX2xvbmcoZCxzKQlzdWJfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHRlc3RfYnl0ZShkLHMpCXRlc3RfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHRlc3Rfd29yZChkLHMpCXRlc3Rfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHRlc3RfbG9uZyhkLHMpCXRlc3RfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHhvcl9ieXRlKGQscykJeG9yX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSB4b3Jfd29yZChkLHMpCXhvcl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgeG9yX2xvbmcoZCxzKQl4b3JfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIGltdWxfYnl0ZShzKQlpbXVsX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQVgsTS54ODYuUl9BTCxzKQotI2RlZmluZSBpbXVsX3dvcmQocykJaW11bF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLCZNLng4Ni5SX0RYLE0ueDg2LlJfQVgscykKLSNkZWZpbmUgaW11bF9sb25nKHMpCWltdWxfbG9uZ19hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9FQVgsJk0ueDg2LlJfRURYLE0ueDg2LlJfRUFYLHMpCi0jZGVmaW5lIGltdWxfbG9uZ19kaXJlY3QocmVzX2xvLHJlc19oaSxkLHMpCWltdWxfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxyZXNfbG8scmVzX2hpLGQscykKLSNkZWZpbmUgbXVsX2J5dGUocykJCW11bF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLE0ueDg2LlJfQUwscykKLSNkZWZpbmUgbXVsX3dvcmQocykJCW11bF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLCZNLng4Ni5SX0RYLE0ueDg2LlJfQVgscykKLSNkZWZpbmUgbXVsX2xvbmcocykJCW11bF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0VBWCwmTS54ODYuUl9FRFgsTS54ODYuUl9FQVgscykKLSNkZWZpbmUgaWRpdl9ieXRlKHMpCWlkaXZfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BTCwmTS54ODYuUl9BSCxNLng4Ni5SX0FYLHMpCi0jZGVmaW5lIGlkaXZfd29yZChzKQlpZGl2X3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQVgsJk0ueDg2LlJfRFgsTS54ODYuUl9BWCxNLng4Ni5SX0RYLHMpCi0jZGVmaW5lIGlkaXZfbG9uZyhzKQlpZGl2X2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfRUFYLCZNLng4Ni5SX0VEWCxNLng4Ni5SX0VBWCxNLng4Ni5SX0VEWCxzKQotI2RlZmluZSBkaXZfYnl0ZShzKQkJZGl2X2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQUwsJk0ueDg2LlJfQUgsTS54ODYuUl9BWCxzKQotI2RlZmluZSBkaXZfd29yZChzKQkJZGl2X3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQVgsJk0ueDg2LlJfRFgsTS54ODYuUl9BWCxNLng4Ni5SX0RYLHMpCi0jZGVmaW5lIGRpdl9sb25nKHMpCQlkaXZfbG9uZ19hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9FQVgsJk0ueDg2LlJfRURYLE0ueDg2LlJfRUFYLE0ueDg2LlJfRURYLHMpCi0KLSNlbmRpZgotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi19ICAgICAgICAgICAgICAgICAgICAgICAJCQkvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgIAkqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX1g4NkVNVV9QUklNX09QU19IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L3g4NmVtdWkuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUveDg2ZW11aS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmY0OTAzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUveDg2ZW11aS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOgkJQU5TSSBDCi0qIEVudmlyb25tZW50OglBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3Igc3lzdGVtIHNwZWNpZmljIGZ1bmN0aW9ucy4gVGhlc2UgZnVuY3Rpb25zCi0qCQkJCWFyZSBhbHdheXMgY29tcGlsZWQgYW5kIGxpbmtlZCBpbiB0aGUgT1MgZGVwZWRlbnQgbGlicmFyaWVzLAotKgkJCQlhbmQgbmV2ZXIgaW4gYSBiaW5hcnkgcG9ydGFibGUgZHJpdmVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1g4NkVNVV9YODZFTVVJX0gKLSNkZWZpbmUgX19YODZFTVVfWDg2RU1VSV9ICi0KLS8qIElmIHdlIGFyZSBjb21waWxpbmcgaW4gQysrIG1vZGUsIHdlIGNhbiBjb21waWxlIHNvbWUgZnVuY3Rpb25zIGFzCi0gKiBpbmxpbmUgdG8gaW5jcmVhc2UgcGVyZm9ybWFuY2UgKGhvd2V2ZXIgdGhlIGNvZGUgc2l6ZSBpbmNyZWFzZXMgcXVpdGUKLSAqIGRyYW1hdGljYWxseSBpbiB0aGlzIGNhc2UpLgotICovCi0KLSNpZglkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChfTk9fSU5MSU5FKQotI2RlZmluZQlfSU5MSU5FCWlubGluZQotI2Vsc2UKLSNkZWZpbmUJX0lOTElORSBzdGF0aWMKLSNlbmRpZgotCi0vKiBHZXQgcmlkIG9mIHVudXNlZCBwYXJhbWV0ZXJzIGluIEMrKyBjb21waWxhdGlvbiBtb2RlICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZQlYODZFTVVfVU5VU0VEKHYpCi0jZWxzZQotI2RlZmluZQlYODZFTVVfVU5VU0VEKHYpCXYKLSNlbmRpZgotCi0jaW5jbHVkZSAieDg2ZW11LmgiCi0jaW5jbHVkZSAieDg2ZW11L3JlZ3MuaCIKLSNpbmNsdWRlICJ4ODZlbXUvZGVidWcuaCIKLSNpbmNsdWRlICJ4ODZlbXUvZGVjb2RlLmgiCi0jaW5jbHVkZSAieDg2ZW11L29wcy5oIgotI2luY2x1ZGUgIng4NmVtdS9wcmltX29wcy5oIgotI2luY2x1ZGUgIng4NmVtdS9mcHUuaCIKLSNpbmNsdWRlICJ4ODZlbXUvZnB1X3JlZ3MuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbmxpbmUgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAJCQkvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLWV4dGVybiB1OCAgCShYODZBUElQIHN5c19yZGIpKHUzMiBhZGRyKTsKLWV4dGVybiB1MTYgCShYODZBUElQIHN5c19yZHcpKHUzMiBhZGRyKTsKLWV4dGVybiB1MzIgCShYODZBUElQIHN5c19yZGwpKHUzMiBhZGRyKTsKLWV4dGVybiB2b2lkIChYODZBUElQIHN5c193cmIpKHUzMiBhZGRyLHU4IHZhbCk7Ci1leHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfd3J3KSh1MzIgYWRkcix1MTYgdmFsKTsKLWV4dGVybiB2b2lkIChYODZBUElQIHN5c193cmwpKHUzMiBhZGRyLHUzMiB2YWwpOwotCi1leHRlcm4gdTggIAkoWDg2QVBJUCBzeXNfaW5iKShYODZFTVVfcGlvQWRkciBhZGRyKTsKLWV4dGVybiB1MTYgCShYODZBUElQIHN5c19pbncpKFg4NkVNVV9waW9BZGRyIGFkZHIpOwotZXh0ZXJuIHUzMiAJKFg4NkFQSVAgc3lzX2lubCkoWDg2RU1VX3Bpb0FkZHIgYWRkcik7Ci1leHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfb3V0YikoWDg2RU1VX3Bpb0FkZHIgYWRkcix1OCB2YWwpOwotZXh0ZXJuIHZvaWQgKFg4NkFQSVAgc3lzX291dHcpKFg4NkVNVV9waW9BZGRyIGFkZHIsdTE2IHZhbCk7Ci1leHRlcm4gdm9pZAkoWDg2QVBJUCBzeXNfb3V0bCkoWDg2RU1VX3Bpb0FkZHIgYWRkcix1MzIgdmFsKTsKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgCQkJLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAJKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogX19YODZFTVVfWDg2RU1VSV9IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci94ODZpbnRlcmZhY2UuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3g4NmludGVyZmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDljYjNjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3g4NmludGVyZmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODE0ICswLDAgQEAKLSNpbmNsdWRlICJ4ODZlbXUuaCIKLSNpbmNsdWRlICJnbHVlLmgiCi0KLQotLyoKLSAqIFRoaXMgaXNuJ3QgbmljZSwgYnV0IHRoZXJlIGFyZSBhIGxvdCBvZiBpbmNvbXBhdGliaWxpdGllcyBpbiB0aGUgVS1Cb290IGFuZCBzY2l0ZWNoIGluY2x1ZGUKLSAqIGZpbGVzIHRoYXQgdGhpcyBpcyB0aGUgb25seSByZWFsbHkgd29ya2FibGUgc29sdXRpb24uCi0gKiBNaWdodCBiZSBjbGVhbmVkIG91dCBsYXRlci4KLSAqLwotCi0jaWZkZWYgREVCVUcKLSN1bmRlZiBERUJVRwotI2VuZGlmCi0KLSN1bmRlZiBJT19MT0dHSU5HCi0jdW5kZWYgTUVNX0xPR0dJTkcKLQotI2lmZGVmIElPX0xPR0dJTkcKLSNkZWZpbmUgTE9HSU8ocG9ydCwgZm9ybWF0LCBhcmdzLi4uKSBpZiAoZG9sb2cocG9ydCkpIF9wcmludGYoZm9ybWF0ICwgIyMgYXJncykKLSNlbHNlCi0jZGVmaW5lIExPR0lPKHBvcnQsIGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi0jaWZkZWYgTUVNX0xPR0dJTgotI2RlZmluZSBMT0dNRU0oZm9ybWF0LCBhcmdzLi4uKSBfcHJpbnRmKGZvcm1hdCAsICMjIGFyZ3MpCi0jZWxzZQotI2RlZmluZSBMT0dNRU0oZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBQUklOVEYoZm9ybWF0LCBhcmdzLi4uKSBfcHJpbnRmKGZvcm1hdCAsICMjIGFyZ3MpCi0jZWxzZQotI2RlZmluZSBQUklOVEYoZm9ybWF0LCBhcmdjLi4uKQotI2VuZGlmCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVQllURTsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVVdPUkQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUxPTkc7Ci0KLXR5cGVkZWYgY2hhciBCWVRFOwotdHlwZWRlZiBzaG9ydCBXT1JUOwotdHlwZWRlZiBsb25nIExPTkc7Ci0KLSNkZWZpbmUgRU1VTEFUT1JfTUVNX1NJWkUgICAgICAgKDEwMjQqMTAyNCkKLSNkZWZpbmUgRU1VTEFUT1JfQklPU19PRkZTRVQgICAgMHhDMDAwMAotI2RlZmluZSBFTVVMQVRPUl9TVFJBUF9PRkZTRVQgICAweDMwMDAwCi0jZGVmaW5lIEVNVUxBVE9SX1NUQUNLX09GRlNFVCAgIDB4MjAwMDAKLSNkZWZpbmUgRU1VTEFUT1JfTE9HT19PRkZTRVQgICAgMHg0MDAwMCAvKiBJZiB5b3UgY2hhbmdlIHRoaXMsIGNoYW5nZSB0aGUgc3RyYXAgY29kZSwgdG9vICovCi0jZGVmaW5lIFZJREVPX0JBU0UgKHZvaWQgKikweEZEMEI4MDAwCi0KLWV4dGVybiBjaGFyICpnZXRlbnYoY2hhciAqKTsKLWV4dGVybiBpbnQgdHN0Yyh2b2lkKTsKLWV4dGVybiBpbnQgZ2V0Yyh2b2lkKTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIHZpZGVvX2dldF9hdHRyKHZvaWQpOwotCi1pbnQgYXRvaShjaGFyICpzdHJpbmcpCi17Ci0gICAgaW50IHJlcyA9IDA7Ci0gICAgd2hpbGUgKCpzdHJpbmc+PScwJyAmJiAqc3RyaW5nIDw9JzknKQotICAgIHsKLQlyZXMgKj0gMTA7Ci0JcmVzICs9ICpzdHJpbmctJzAnOwotCXN0cmluZysrOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KLXZvaWQgY29uc19nZXRzKGNoYXIgKmJ1ZmZlcikKLXsKLSAgICBpbnQgaSA9IDA7Ci0gICAgY2hhciBjID0gMDsKLQotICAgIGJ1ZmZlclswXSA9IDA7Ci0gICAgaWYgKGdldGVudigieDg2X3J1bnRocnUiKSkgcmV0dXJuOyAvKkZJWE1FOiAqLwotICAgIHdoaWxlIChjICE9IDB4MEQgJiYgYyAhPSAweDBBKQotICAgIHsKLQl3aGlsZSAoIXRzdGMoKSk7Ci0JYyA9IGdldGMoKTsKLQlpZiAoYz49MzIgJiYgYyA8IDEyNykKLQl7Ci0JICAgIGJ1ZmZlcltpXSA9IGM7Ci0JICAgIGkrKzsKLQkgICAgYnVmZmVyW2ldID0gMDsKLQkgICAgcHV0YyhjKTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgaWYgKGMgPT0gMHgwOCkKLQkgICAgewotCQlpZiAoaT4wKSBpLS07Ci0JCWJ1ZmZlcltpXSA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIGJ1ZmZlcltpXSA9ICdcbic7Ci0gICAgYnVmZmVyW2krMV0gPSAwOwotfQotCi1jaGFyICpiaW9zX2RhdGUgPSAiMDgvMTQvMDIiOwotVUJZVEUgbW9kZWwgPSAweEZDOwotVUJZVEUgc3VibW9kZWwgPSAweDAwOwotCi1zdGF0aWMgaW5saW5lIFVCWVRFIHJlYWRfYnl0ZSh2b2xhdGlsZSBVQllURSogZnJvbSkKLXsKLSAgICBpbnQgeDsKLSAgICBhc20gdm9sYXRpbGUgKCJsYnogJTAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJtIiAoKmZyb20pKTsKLSAgICByZXR1cm4gKFVCWVRFKXg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9ieXRlKHZvbGF0aWxlIFVCWVRFICp0bywgaW50IHgpCi17Ci0gICAgYXNtIHZvbGF0aWxlICgic3RiICUxLCUwXG4gZWllaW8iIDogIj1tIiAoKnRvKSA6ICJyIiAoeCkpOwotfQotCi1zdGF0aWMgaW5saW5lIFVXT1JEIHJlYWRfd29yZF9saXR0bGUodm9sYXRpbGUgVVdPUkQgKmZyb20pCi17Ci0gICAgaW50IHg7Ci0gICAgYXNtIHZvbGF0aWxlICgibGhicnggJTAsMCwlMVxuIGVpZWlvIiA6ICI9ciIgKHgpIDogInIiIChmcm9tKSwgIm0iICgqZnJvbSkpOwotICAgIHJldHVybiAoVVdPUkQpeDsKLX0KLQotc3RhdGljIGlubGluZSBVV09SRCByZWFkX3dvcmRfYmlnKHZvbGF0aWxlIFVXT1JEICpmcm9tKQotewotICAgIGludCB4OwotICAgIGFzbSB2b2xhdGlsZSAoImxoeiAlMCwlMVxuIGVpZWlvIiA6ICI9ciIgKHgpIDogIm0iICgqZnJvbSkpOwotICAgIHJldHVybiAoVVdPUkQpeDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3dvcmRfbGl0dGxlKHZvbGF0aWxlIFVXT1JEICp0bywgaW50IHgpCi17Ci0gICAgYXNtIHZvbGF0aWxlICgic3RoYnJ4ICUxLDAsJTJcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSwgInIiICh0bykpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfd29yZF9iaWcodm9sYXRpbGUgVVdPUkQgKnRvLCBpbnQgeCkKLXsKLSAgICBhc20gdm9sYXRpbGUgKCJzdGggJTEsJTBcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgVUxPTkcgcmVhZF9sb25nX2xpdHRsZSh2b2xhdGlsZSBVTE9ORyAqZnJvbSkKLXsKLSAgICB1bnNpZ25lZCBsb25nIHg7Ci0gICAgYXNtIHZvbGF0aWxlICgibHdicnggJTAsMCwlMVxuIGVpZWlvIiA6ICI9ciIgKHgpIDogInIiIChmcm9tKSwgIm0iKCpmcm9tKSk7Ci0gICAgcmV0dXJuIChVTE9ORyl4OwotfQotCi1zdGF0aWMgaW5saW5lIFVMT05HIHJlYWRfbG9uZ19iaWcodm9sYXRpbGUgVUxPTkcgKmZyb20pCi17Ci0gICAgdW5zaWduZWQgbG9uZyB4OwotICAgIGFzbSB2b2xhdGlsZSAoImx3eiAlMCwlMVxuIGVpZWlvIiA6ICI9ciIgKHgpIDogIm0iICgqZnJvbSkpOwotICAgIHJldHVybiAoVUxPTkcpeDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2xvbmdfbGl0dGxlKHZvbGF0aWxlIFVMT05HICp0bywgVUxPTkcgeCkKLXsKLSAgICBhc20gdm9sYXRpbGUgKCJzdHdicnggJTEsMCwlMlxuIGVpZWlvIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpLCAiciIgKHRvKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9sb25nX2JpZyh2b2xhdGlsZSBVTE9ORyAqdG8sIFVMT05HIHgpCi17Ci0gICAgYXNtIHZvbGF0aWxlICgic3R3ICUxLCUwXG4gZWllaW8iIDogIj1tIiAoKnRvKSA6ICJyIiAoeCkpOwotfQotCi1zdGF0aWMgaW50IGxvZ19pbml0ID0gMDsKLXN0YXRpYyBpbnQgbG9nX2RvID0gMDsKLXN0YXRpYyBpbnQgbG9nX2xvdyA9IDA7Ci0KLWludCBkb2xvZyhpbnQgcG9ydCkKLXsKLSAgICBpZiAobG9nX2luaXQgJiYgbG9nX2RvKQotICAgIHsKLQlpZiAobG9nX2xvdyAmJiBwb3J0ID4gMHg0MDApIHJldHVybiAwOwotCXJldHVybiAxOwotICAgIH0KLQotICAgIGlmICghbG9nX2luaXQpCi0gICAgewotCWxvZ19pbml0ID0gMTsKLQlsb2dfZG8gPSAoZ2V0ZW52KCJ4ODZfbG9naW8iKSAhPSAoY2hhciAqKTApOwotCWxvZ19sb3cgPSAoZ2V0ZW52KCJ4ODZfbG9nbG93IikgIT0gKGNoYXIgKikwKTsKLQlpZiAobG9nX2RvKQotCXsKLQkgICAgaWYgKGxvZ19sb3cgJiYgcG9ydCA+IDB4NDAwKSByZXR1cm4gMDsKLQkgICAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogQ29udmVydHMgYW4gZW11bGF0b3IgYWRkcmVzcyB0byBhIHBoeXNpY2FsIGFkZHJlc3MuICovCi0vKiBIYW5kbGVzIGFsbCBzcGVjaWFsIGNhc2VzIChiaW9zIGRhdGUsIG1vZGVsIGV0YyksIGFuZCBtaWdodCBuZWVkIHdvcmsgKi8KLXUzMiBtZW1hZGRyKHUzMiBhZGRyKQotewotLyogICAgaWYgKGFkZHIgPj0gMHhGMDAwMCAmJiBhZGRyIDwgMHhGRkZGRikgcHJpbnRmKCJXQVJOSU5HOiBTZWdtZW50IEYgYWNjZXNzICgweCV4KVxuIiwgYWRkcik7ICovCi0vKiAgICBwcmludGYoIk1lbUFkZHI9JXBcbiIsIGFkZHIpOyAqLwotICAgIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8IDB4QzAwMDApCi0JcmV0dXJuIDB4RkQwMDAwMDAgKyBhZGRyOwotICAgIGVsc2UgaWYgKGFkZHIgPj0gMHhGRkZGNSAmJiBhZGRyIDwgMHhGRkZGRSkKLSAgICB7Ci0JcmV0dXJuICh1MzIpYmlvc19kYXRlK2FkZHItMHhGRkZGNTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYWRkciA9PSAweEZGRkZFKQotCXJldHVybiAodTMyKSZtb2RlbDsKLSAgICBlbHNlIGlmIChhZGRyID09IDB4RkZGRkYpCi0JcmV0dXJuICh1MzIpJnN1Ym1vZGVsOwotICAgIGVsc2UgaWYgKGFkZHIgPj0gMHg4MDAwMDAwMCkKLSAgICB7Ci0JLypwcmludGYoIldhcm5pbmc6IEhpZ2ggbWVtb3J5IGFjY2VzcyBhdCAweCV4XG4iLCBhZGRyKTsgKi8KLQlyZXR1cm4gYWRkcjsKLSAgICB9Ci0gICAgZWxzZQotCXJldHVybiAodTMyKU0ubWVtX2Jhc2UrYWRkcjsKLX0KLQotdTggQTFfcmRiKHUzMiBhZGRyKQotewotICAgIHU4IGEgPSByZWFkX2J5dGUoKFVCWVRFICopbWVtYWRkcihhZGRyKSk7Ci0gICAgTE9HTUVNKCJyZGI6ICV4IC0+ICV4XG4iLCBhZGRyLCBhKTsKLSAgICByZXR1cm4gYTsKLX0KLQotdTE2IEExX3Jkdyh1MzIgYWRkcikKLXsKLSAgICB1MTYgYSA9IHJlYWRfd29yZF9saXR0bGUoKFVXT1JEICopbWVtYWRkcihhZGRyKSk7Ci0gICAgTE9HTUVNKCJyZHc6ICV4IC0+ICV4XG4iLCBhZGRyLCBhKTsKLSAgICByZXR1cm4gYTsKLX0KLQotdTMyIEExX3JkbCh1MzIgYWRkcikKLXsKLSAgICB1MzIgYSA9IHJlYWRfbG9uZ19saXR0bGUoKFVMT05HICopbWVtYWRkcihhZGRyKSk7Ci0gICAgTE9HTUVNKCJyZGw6ICV4IC0+ICV4XG4iLCBhZGRyLCBhKTsKLSAgICByZXR1cm4gYTsKLX0KLQotdm9pZCBBMV93cmIodTMyIGFkZHIsIHU4IHZhbCkKLXsKLSAgICBMT0dNRU0oIndyYjogJXggPC0gJXhcbiIsIGFkZHIsIHZhbCk7Ci0gICAgd3JpdGVfYnl0ZSgoVUJZVEUgKiltZW1hZGRyKGFkZHIpLCB2YWwpOwotfQotCi12b2lkIEExX3dydyh1MzIgYWRkciwgdTE2IHZhbCkKLXsKLSAgICBMT0dNRU0oIndydzogJXggPC0gJXhcbiIsIGFkZHIsIHZhbCk7Ci0gICAgd3JpdGVfd29yZF9saXR0bGUoKFVXT1JEICopbWVtYWRkcihhZGRyKSwgdmFsKTsKLX0KLQotdm9pZCBBMV93cmwodTMyIGFkZHIsIHUzMiB2YWwpCi17Ci0gICAgTE9HTUVNKCJ3cmw6ICV4IDwtICV4XG4iLCBhZGRyLCB2YWwpOwotICAgIHdyaXRlX2xvbmdfbGl0dGxlKChVTE9ORyAqKW1lbWFkZHIoYWRkciksIHZhbCk7Ci19Ci0KLVg4NkVNVV9tZW1GdW5jcyBfQTFfbWVtID0KLXsKLSAgICBBMV9yZGIsCi0gICAgQTFfcmR3LAotICAgIEExX3JkbCwKLSAgICBBMV93cmIsCi0gICAgQTFfd3J3LAotICAgIEExX3dybCwKLX07Ci0KLSNkZWZpbmUgQVJUSUNJQVNfUENJX0NGR0FERFIgIDB4ZmVjMDBjZjgKLSNkZWZpbmUgQVJUSUNJQVNfUENJX0NGR0RBVEEgIDB4ZmVlMDBjZmMKLSNkZWZpbmUgSU9CQVNFICAgICAgICAgICAgICAgIDB4RkUwMDAwMDAKLQotI2RlZmluZSBpbl9ieXRlKGZyb20pIHJlYWRfYnl0ZSggKFVCWVRFICopcG9ydF90b19tZW0oZnJvbSkpCi0jZGVmaW5lIGluX3dvcmQoZnJvbSkgcmVhZF93b3JkX2xpdHRsZSgoVVdPUkQgKilwb3J0X3RvX21lbShmcm9tKSkKLSNkZWZpbmUgaW5fbG9uZyhmcm9tKSByZWFkX2xvbmdfbGl0dGxlKChVTE9ORyAqKXBvcnRfdG9fbWVtKGZyb20pKQotI2RlZmluZSBvdXRfYnl0ZSh0bywgdmFsKSB3cml0ZV9ieXRlKChVQllURSAqKXBvcnRfdG9fbWVtKHRvKSwgdmFsKQotI2RlZmluZSBvdXRfd29yZCh0bywgdmFsKSB3cml0ZV93b3JkX2xpdHRsZSgoVVdPUkQgKilwb3J0X3RvX21lbSh0byksIHZhbCkKLSNkZWZpbmUgb3V0X2xvbmcodG8sIHZhbCkgd3JpdGVfbG9uZ19saXR0bGUoKFVMT05HICopcG9ydF90b19tZW0odG8pLCB2YWwpCi0KLXUzMiBwb3J0X3RvX21lbShpbnQgcG9ydCkKLXsKLSAgICBpZiAocG9ydCA+PSAweENGQyAmJiBwb3J0IDw9IDB4Q0ZGKSByZXR1cm4gMHhGRUUwMDAwMCtwb3J0OwotICAgIGVsc2UgaWYgKHBvcnQgPj0gMHhDRjggJiYgcG9ydCA8PSAweENGQikgcmV0dXJuIDB4RkVDMDAwMDArcG9ydDsKLSAgICBlbHNlIHJldHVybiBJT0JBU0UgKyBwb3J0OwotfQotCi11OCBBMV9pbmIoaW50IHBvcnQpCi17Ci0gICAgdTggYTsKLSAgICAvKmlmIChwb3J0ID09IDB4M0JBKSByZXR1cm4gMDsgKi8KLSAgICBhID0gaW5fYnl0ZShwb3J0KTsKLSAgICBMT0dJTyhwb3J0LCAiaW5iOiAlWGggLT4gJWQgKCVYaClcbiIsIHBvcnQsIGEsIGEpOwotICAgIHJldHVybiBhOwotfQotCi11MTYgQTFfaW53KGludCBwb3J0KQotewotICAgIHUxNiBhID0gaW5fd29yZChwb3J0KTsKLSAgICBMT0dJTyhwb3J0LCAiaW53OiAlWGggLT4gJWQgKCVYaClcbiIsIHBvcnQsIGEsIGEpOwotICAgIHJldHVybiBhOwotfQotCi11MzIgQTFfaW5sKGludCBwb3J0KQotewotICAgIHUzMiBhID0gaW5fbG9uZyhwb3J0KTsKLSAgICBMT0dJTyhwb3J0LCAiaW5sOiAlWGggLT4gJWQgKCVYaClcbiIsIHBvcnQsIGEsIGEpOwotICAgIHJldHVybiBhOwotfQotCi12b2lkIEExX291dGIoaW50IHBvcnQsIHU4IHZhbCkKLXsKLSAgICBMT0dJTyhwb3J0LCAib3V0YjogJVhoIDwtICVkICglWGgpXG4iLCBwb3J0LCB2YWwsIHZhbCk7Ci0vKiAgICBpZiAocG9ydCA9PSAweENGOCkgcG9ydCA9IDB4Q0ZCOwotICAgIGVsc2UgaWYgKHBvcnQgPT0gMHhDRjkpIHBvcnQgPSAweENGQTsKLSAgICBlbHNlIGlmIChwb3J0ID09IDB4Q0ZBKSBwb3J0ID0gMHhDRjk7Ci0gICAgZWxzZSBpZiAocG9ydCA9PSAweENGQikgcG9ydCA9IDB4Q0Y4OyovCi0gICAgb3V0X2J5dGUocG9ydCwgdmFsKTsKLX0KLQotdm9pZCBBMV9vdXR3KGludCBwb3J0LCB1MTYgdmFsKQotewotICAgIExPR0lPKHBvcnQsICJvdXR3OiAlWGggPC0gJWQgKCVYaClcbiIsIHBvcnQsIHZhbCwgdmFsKTsKLSAgICBvdXRfd29yZChwb3J0LCB2YWwpOwotfQotCi12b2lkIEExX291dGwoaW50IHBvcnQsIHUzMiB2YWwpCi17Ci0gICAgTE9HSU8ocG9ydCwgIm91dGw6ICVYaCA8LSAlZCAoJVhoKVxuIiwgcG9ydCwgdmFsLCB2YWwpOwotICAgIG91dF9sb25nKHBvcnQsIHZhbCk7Ci19Ci0KLVg4NkVNVV9waW9GdW5jcyBfQTFfcGlvID0KLXsKLSAgICBBMV9pbmIsCi0gICAgQTFfaW53LAotICAgIEExX2lubCwKLSAgICBBMV9vdXRiLAotICAgIEExX291dHcsCi0gICAgQTFfb3V0bCwKLX07Ci0KLXN0YXRpYyBpbnQgcmVsb2NlZF9vcHMgPSAwOwotCi12b2lkIHJlbG9jX29wcyh2b2lkICpyZWxvY19hZGRyKQotewotICAgIGV4dGVybiB2b2lkICgqeDg2ZW11X29wdGFiWzI1Nl0pKHU4KTsKLSAgICBleHRlcm4gdm9pZCAoKng4NmVtdV9vcHRhYjJbMjU2XSkodTgpOwotICAgIGV4dGVybiB2b2lkIHRhYmxlc19yZWxvY2F0ZSh1bnNpZ25lZCBpbnQgb2Zmc2V0KTsKLSAgICBpbnQgaTsKLSAgICB1bnNpZ25lZCBsb25nIGRlbHRhOwotICAgIGlmIChyZWxvY2VkX29wcyA9PSAxKSByZXR1cm47Ci0gICAgcmVsb2NlZF9vcHMgPSAxOwotCi0gICAgZGVsdGEgPSBURVhUX0JBU0UgLSAodW5zaWduZWQgbG9uZylyZWxvY19hZGRyOwotCi0gICAgZm9yIChpPTA7IGk8MjU2OyBpKyspCi0gICAgewotCXg4NmVtdV9vcHRhYltpXSAtPSBkZWx0YTsKLQl4ODZlbXVfb3B0YWIyW2ldIC09IGRlbHRhOwotICAgIH0KLQotICAgIF9BMV9tZW0ucmRiID0gQTFfcmRiOwotICAgIF9BMV9tZW0ucmR3ID0gQTFfcmR3OwotICAgIF9BMV9tZW0ucmRsID0gQTFfcmRsOwotICAgIF9BMV9tZW0ud3JiID0gQTFfd3JiOwotICAgIF9BMV9tZW0ud3J3ID0gQTFfd3J3OwotICAgIF9BMV9tZW0ud3JsID0gQTFfd3JsOwotCi0gICAgX0ExX3Bpby5pbmIgPSBBMV9pbmI7Ci0gICAgX0ExX3Bpby5pbncgPSBBMV9pbnc7Ci0gICAgX0ExX3Bpby5pbmwgPSBBMV9pbmw7Ci0gICAgX0ExX3Bpby5vdXRiID0gQTFfb3V0YjsKLSAgICBfQTFfcGlvLm91dHcgPSBBMV9vdXR3OwotICAgIF9BMV9waW8ub3V0bCA9IEExX291dGw7Ci0KLSAgICB0YWJsZXNfcmVsb2NhdGUoZGVsdGEpOwotCi19Ci0KLQotI2RlZmluZSBBTllfS0VZKHRleHQpCQkJCVwKLSAgICBwcmludGYodGV4dCk7CQkJCVwKLSAgICB3aGlsZSAoIXRzdGMoKSk7Ci0KLQotdW5zaWduZWQgY2hhciBtb3JlX3N0cmFwW10gPSB7Ci0JMHhiNCwgMHgwLCAweGIwLCAweDIsIDB4Y2QsIDB4MTAsCi19OwotI2RlZmluZSBNT1JFX1NUUkFQX0JZVEVTIDYgLyogQWRkaXRpb25hbCBieXRlcyBvZiBzdHJhcCBjb2RlICovCi0KLQotdW5zaWduZWQgY2hhciAqZG9uZV9tc2c9IlZHQSBJbml0aWFsaXplZFwwIjsKLQotaW50IGV4ZWN1dGVfYmlvcyhwY2lfZGV2X3QgZ3JfZGV2LCB2b2lkICpyZWxvY19hZGRyKQotewotICAgIGV4dGVybiB2b2lkIGJpb3NfaW5pdCh2b2lkKTsKLSAgICBleHRlcm4gdm9pZCByZW1vdmVfaW5pdF9kYXRhKHZvaWQpOwotICAgIGV4dGVybiBpbnQgdmlkZW9fcm93cyh2b2lkKTsKLSAgICBleHRlcm4gaW50IHZpZGVvX2NvbHModm9pZCk7Ci0gICAgZXh0ZXJuIGludCB2aWRlb19zaXplKGludCwgaW50KTsKLSAgICB1OCAqc3RyYXA7Ci0gICAgdW5zaWduZWQgY2hhciAqbG9nbzsKLSAgICB1OCBjZmc7Ci0gICAgaW50IGk7Ci0gICAgY2hhciBjOwotICAgIGNoYXIgKnM7Ci0jaWZkZWYgRUFTVEVSRUdHCi0gICAgaW50IGVhc3RlcmVnZ19hY3RpdmUgPSAwOwotI2VuZGlmCi0gICAgY2hhciAqcGFsX3Jlc2V0OwotICAgIHU4ICpmYjsKLSAgICB1bnNpZ25lZCBjaGFyICptc2c7Ci0gICAgdW5zaWduZWQgY2hhciBjdXJyZW50X2F0dHI7Ci0KLSAgICBQUklOVEYoIlRyeWluZyB0byByZW1vdmUgaW5pdCBkYXRhXG4iKTsKLSAgICByZW1vdmVfaW5pdF9kYXRhKCk7Ci0gICAgUFJJTlRGKCJSZW1vdmVkIGluaXQgZGF0YSBmcm9tIGNhY2hlLCBub3cgaW4gUkFNXG4iKTsKLQotICAgIHJlbG9jX29wcyhyZWxvY19hZGRyKTsKLSAgICBQUklOVEYoIkF0dGVtcHRpbmcgdG8gcnVuIGVtdWxhdG9yIG9uICUwMng6JTAyeDolMDJ4XG4iLAotCSAgIFBDSV9CVVMoZ3JfZGV2KSwgUENJX0RFVihncl9kZXYpLCBQQ0lfRlVOQyhncl9kZXYpKTsKLQotICAgIC8qIEVuYWJsZSBjb21wYXRpYmlsaXR5IGhvbGUgZm9yIGVtdWxhdG9yIGFjY2VzcyB0byBmcmFtZSBidWZmZXIgKi8KLSAgICBQUklOVEYoIkVuYWJsaW5nIGNvbXBhdGliaWxpdHkgaG9sZVxuIik7Ci0gICAgZW5hYmxlX2NvbXBhdGliaWxpdHlfaG9sZSgpOwotCi0gICAgLyogQWxsb2NhdGUgbWVtb3J5ICovCi0gICAgLyogRklYTUU6IFdlIHNob3VsZG4ndCB1c2UgdGhpcyBtdWNoIG1lbW9yeSByZWFsbHkuICovCi0gICAgbWVtc2V0KCZNLCAwLCBzaXplb2YoWDg2RU1VX3N5c0VudikpOwotICAgIE0ubWVtX2Jhc2UgPSBtYWxsb2MoRU1VTEFUT1JfTUVNX1NJWkUpOwotICAgIE0ubWVtX3NpemUgPSBFTVVMQVRPUl9NRU1fU0laRTsKLQotICAgIGlmICghTS5tZW1fYmFzZSkKLSAgICB7Ci0JUFJJTlRGKCJVbmFibGUgdG8gYWxsb2NhdGUgb25lIG1lZ2FieXRlIGZvciBlbXVsYXRvclxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKGF0dGVtcHRfbWFwX3JvbShncl9kZXYsIE0ubWVtX2Jhc2UgKyBFTVVMQVRPUl9CSU9TX09GRlNFVCkgPT0gMCkKLSAgICB7Ci0JUFJJTlRGKCJFcnJvciBtYXBwaW5nIHJvbS4gRW11bGF0aW9uIHRlcm1pbmF0ZWRcbiIpOwotCXJldHVybiAwOwotICAgIH0KLQotI2lmIDEgLypkZWYgREVCVUcqLwotICAgIHMgPSBnZXRlbnYoIng4Nl9hc2tfc3RhcnQiKTsKLSAgICBpZiAocykKLSAgICB7Ci0JcHJpbnRmKCJQcmVzcyAncScgdG8gc2tpcCBpbml0aWFsaXphdGlvbiwgJ2QnIGZvciBkcnkgaW5pdFxuJ2knIGZvciBpL28gc2Vzc2lvbiIpOwotCXdoaWxlICghdHN0YygpKTsKLQljID0gZ2V0YygpOwotCWlmIChjID09ICdxJykgcmV0dXJuIDA7Ci0JaWYgKGMgPT0gJ2QnKQotCXsKLQkgICAgZXh0ZXJuIHZvaWQgYmlvc19zZXRfbW9kZShpbnQgbW9kZSk7Ci0JICAgIGJpb3Nfc2V0X21vZGUoMHgwMyk7Ci0JICAgIHJldHVybiAwOwotCX0KLQlpZiAoYyA9PSAnaScpIGRvX2lub3V0KCk7Ci0gICAgfQotCi0KLSNlbmRpZgotCi0jaWZkZWYgRUFTVEVSRUdHCi0vKiAgICBpZiAodHN0YygpKQotICAgIHsKLQlpZiAoZ2V0YygpID09ICdjJykKLQl7Ci0JICAgIGVhc3RlcmVnZ19hY3RpdmUgPSAxOwotCX0KLSAgICB9Ci0qLwotICAgIGlmIChnZXRlbnYoImVhc3RlcmVnZyIpKQotICAgIHsKLQllYXN0ZXJlZ2dfYWN0aXZlID0gMTsKLSAgICB9Ci0KLSAgICBpZiAoZWFzdGVyZWdnX2FjdGl2ZSkKLSAgICB7Ci0JLyogWWF5ISAqLwotCXNldGVudigieDg2X21vZGUiLCAiMSIpOwotCXNldGVudigidmdhX2ZnX2NvbG9yIiwgIjExIik7Ci0Jc2V0ZW52KCJ2Z2FfYmdfY29sb3IiLCAiMSIpOwotCWVhc3RlcmVnZ19hY3RpdmUgPSAxOwotICAgIH0KLSNlbmRpZgotCi0gICAgc3RyYXAgPSAodTgqKU0ubWVtX2Jhc2UgKyBFTVVMQVRPUl9TVFJBUF9PRkZTRVQ7Ci0KLSAgICB7Ci0JY2hhciAqbSA9IGdldGVudigieDg2X21vZGUiKTsKLQlpZiAobSkKLQl7Ci0JICAgIG1vcmVfc3RyYXBbM10gPSBhdG9pKG0pOwotCSAgICBpZiAobW9yZV9zdHJhcFszXSA9PSAxKSB2aWRlb19zaXplKDQwLCAyNSk7Ci0JICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIHZpZGVvX3NpemUoODAsIDI1KTsKLQl9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBQb2tlIHRoZSBzdHJhcCByb3V0aW5lLiBUaGlzIG1pZ2h0IG5lZWQgYSBiaXQgb2YgZXh0ZW5kaW5nCi0gICAgICogaWYgdGhlcmUgaXMgYSBtb2RlIHN3aXRjaCBpbnZvbHZlZCwgaS5lLiB3ZSB3YW50IHRvIGludDEwCi0gICAgICogYWZ0ZXJ3YXJkcyB0byBzZXQgYSBkaWZmZXJlbnQgZ3JhcGhpY3MgbW9kZSwgb3IgYWx0ZXJuYXRpdmVseQotICAgICAqIHRoZXJlIG1pZ2h0IGJlIGEgZGlmZmVyZW50IHN0YXJ0IGFkZHJlc3MgcmVxdWlyZW1lbnQgaWYgdGhlCi0gICAgICogUk9NIGRvZXNuJ3QgaGF2ZSBhbiB4ODYgaW1hZ2UgaW4gaXRzIGZpcnN0IGltYWdlLgotICAgICAqLwotCi0gICAgUFJJTlRGKCJQb2tpbmcgc3RyYXAuLi5cbiIpOwotCi0gICAgLyogRkFSIENBTEwgYzAwMDowMDAzICovCi0gICAgKnN0cmFwKysgPSAweDlBOyAqc3RyYXArKyA9IDB4MDM7ICpzdHJhcCsrID0gMHgwMDsKLSAgICAqc3RyYXArKyA9IDB4MDA7ICpzdHJhcCsrID0gMHhDMDsKLQotI2lmIDEKLSAgICAvKiBpbnNlcnQgYWRkaXRpb25hbCBzdHJhcCBjb2RlICovCi0gICAgZm9yIChpPTA7IGkgPCBNT1JFX1NUUkFQX0JZVEVTOyBpKyspCi0gICAgewotCSpzdHJhcCsrID0gbW9yZV9zdHJhcFtpXTsKLSAgICB9Ci0jZW5kaWYKLSAgICAvKiBIQUxUICovCi0gICAgKnN0cmFwKysgPSAweEY0OwotCi0gICAgUFJJTlRGKCJTZXR0aW5nIHVwIGxvZ28gZGF0YVxuIik7Ci0gICAgbG9nbyA9ICh1bnNpZ25lZCBjaGFyICopTS5tZW1fYmFzZSArIEVNVUxBVE9SX0xPR09fT0ZGU0VUOwotICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCi0gICAgewotCSpsb2dvKysgPSAweEZGOwotICAgIH0KLQotICAgIC8qCi0gICAgICogU2V0dXAgdGhlIGluaXQgcGFyYW1ldGVycy4KLSAgICAgKiBQZXIgUENJIHNwZWNzLCBBSCBtdXN0IGNvbnRhaW4gdGhlIGJ1cyBhbmQgQUwKLSAgICAgKiBtdXN0IGNvbnRhaW4gdGhlIGRldmZuLCBlbmNvZGVkIGFzIChkZXY8PDMpfGZuCi0gICAgICovCi0KLSAgICAvKiBFeGVjdXRpb24gc3RhcnRzIGhlcmUgKi8KLSAgICBNLng4Ni5SX0NTID0gU0VHKEVNVUxBVE9SX1NUUkFQX09GRlNFVCk7Ci0gICAgTS54ODYuUl9JUCA9IE9GRihFTVVMQVRPUl9TVFJBUF9PRkZTRVQpOwotCi0gICAgLyogU3RhY2sgYXQgdG9wIG9mIHJhbSAqLwotICAgIE0ueDg2LlJfU1MgPSBTRUcoRU1VTEFUT1JfU1RBQ0tfT0ZGU0VUKTsKLSAgICBNLng4Ni5SX1NQID0gT0ZGKEVNVUxBVE9SX1NUQUNLX09GRlNFVCk7Ci0KLSAgICAvKiBJbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTS54ODYuUl9BSCA9IFBDSV9CVVMoZ3JfZGV2KTsKLSAgICBNLng4Ni5SX0FMID0gKFBDSV9ERVYoZ3JfZGV2KTw8MykgfCBQQ0lfRlVOQyhncl9kZXYpOwotCi0gICAgLyogU2V0IHRoZSBJL08gYW5kIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zICovCi0gICAgWDg2RU1VX3NldHVwTWVtRnVuY3MoJl9BMV9tZW0pOwotICAgIFg4NkVNVV9zZXR1cFBpb0Z1bmNzKCZfQTFfcGlvKTsKLQotICAgIC8qIEVuYWJsZSB0aW1lciAyICovCi0gICAgY2ZnID0gaW5fYnl0ZSgweDYxKTsgLyogR2V0IE1pc2MgY29udHJvbCAqLwotICAgIGNmZyB8PSAweDAxOyAgICAgICAgIC8qIEVuYWJsZSB0aW1lciAyICovCi0gICAgb3V0X2J5dGUoMHg2MSwgY2ZnKTsgLyogb3V0cHV0IGFnYWluICovCi0KLSAgICAvKiBTZXQgdXAgdGhlIHRpbWVycyAqLwotICAgIG91dF9ieXRlKDB4NDMsIDB4NTQpOwotICAgIG91dF9ieXRlKDB4NDEsIDB4MTgpOwotCi0gICAgb3V0X2J5dGUoMHg0MywgMHgzNik7Ci0gICAgb3V0X2J5dGUoMHg0MCwgMHgwMCk7Ci0gICAgb3V0X2J5dGUoMHg0MCwgMHgwMCk7Ci0KLSAgICBvdXRfYnl0ZSgweDQzLCAweGI2KTsKLSAgICBvdXRfYnl0ZSgweDQyLCAweDMxKTsKLSAgICBvdXRfYnl0ZSgweDQyLCAweDEzKTsKLQotICAgIC8qIEluaXQgdGhlICJCSU9TIi4gKi8KLSAgICBiaW9zX2luaXQoKTsKLQotICAgIC8qIFZpZGVvIENhcmQgUmVzZXQgKi8KLSAgICBvdXRfYnl0ZSgweDNEOCwgMCk7Ci0gICAgb3V0X2J5dGUoMHgzQjgsIDEpOwotICAgICh2b2lkKWluX2J5dGUoMHgzQkEpOwotICAgICh2b2lkKWluX2J5dGUoMHgzREEpOwotICAgIG91dF9ieXRlKDB4M0MwLCAwKTsKLSAgICBvdXRfYnl0ZSgweDYxLCAweEZDKTsKLQotI2lmZGVmIERFQlVHCi0gICAgcyA9IF9nZXRlbnYoIng4Nl9zaW5nbGVzdGVwIik7Ci0gICAgaWYgKHMgJiYgc3RyY21wKHMsICJvbiIpPT0wKQotICAgIHsKLQlQUklOVEYoIkVuYWJsaW5nIHNpbmdsZSBzdGVwcGluZyBmb3IgZGVidWdcbiIpOwotCVg4NkVNVV90cmFjZV9vbigpOwotICAgIH0KLSNlbmRpZgotCi0gICAgLyogUmVhZHkgc2V0IGdvLi4uICovCi0gICAgUFJJTlRGKCJSdW5uaW5nIGVtdWxhdG9yXG4iKTsKLSAgICBYODZFTVVfZXhlYygpOwotICAgIFBSSU5URigiRG9uZSBydW5uaW5nIGVtdWxhdG9yXG4iKTsKLQotLyogRklYTUU6IFJlbW92ZSBtZSAqLwotICAgIHBhbF9yZXNldCA9IGdldGVudigieDg2X3BhbGV0dGVfcmVzZXQiKTsKLSAgICBpZiAocGFsX3Jlc2V0ICYmIHN0cmNtcChwYWxfcmVzZXQsICJvbiIpID09IDApCi0gICAgewotCVBSSU5URigiUGFsZXR0ZSByZXNldFxuIik7Ci0JLyoodm9pZClpbl9ieXRlKDB4M2RhKTsgKi8KLQkvKm91dF9ieXRlKDB4M2MwLCAwKTsgKi8KLQotCW91dF9ieXRlKDB4M0M4LCAwKTsKLQlvdXRfYnl0ZSgweDNDOSwgMCk7Ci0Jb3V0X2J5dGUoMHgzQzksIDApOwotCW91dF9ieXRlKDB4M0M5LCAwKTsKLQlmb3IgKGk9MDsgaTwyNTQ7IGkrKykKLQl7Ci0JICAgIG91dF9ieXRlKDB4M0M5LCA2Myk7Ci0JICAgIG91dF9ieXRlKDB4M0M5LCA2Myk7Ci0JICAgIG91dF9ieXRlKDB4M0M5LCA2Myk7Ci0JfQotCi0Jb3V0X2J5dGUoMHgzYzAsIDB4MjApOwotICAgIH0KLS8qIEZJWE1FOiByZW1vdmUgbWUgKi8KLSNpZmRlZiBFQVNURVJFR0cKLSAgICBpZiAoZWFzdGVyZWdnX2FjdGl2ZSkKLSAgICB7Ci0JZXh0ZXJuIHZvaWQgdmlkZW9fZWFzdGVyZWdnKHZvaWQpOwotCXZpZGVvX2Vhc3RlcmVnZygpOwotICAgIH0KLSNlbmRpZgotLyoKLSAgICBjdXJyZW50X2F0dHIgPSB2aWRlb19nZXRfYXR0cigpOwotICAgIGZiID0gKHU4ICopVklERU9fQkFTRTsKLSAgICBmb3IgKGk9MDsgaTx2aWRlb19yb3dzKCkqdmlkZW9fY29scygpKjI7IGkrPTIpCi0gICAgewotCSooZmIraSkgPSAnICc7Ci0JKihmYitpKzEpID0gY3VycmVudF9hdHRyOwotICAgIH0KLQotICAgIGZiID0gKHU4ICopVklERU9fQkFTRSArICh2aWRlb19yb3dzKCkpLTEqKHZpZGVvX2NvbHMoKSoyKTsKLSAgICBmb3IgKGk9MDsgaTx2aWRlb19jb2xzKCk7IGkrKykKLSAgICB7Ci0JKihmYiArIDIqaSkgICAgID0gMzI7Ci0JKihmYiArIDIqaSArIDEpID0gMHgxNzsKLSAgICB9Ci0KLSAgICBtc2cgPSBkb25lX21zZzsKLSAgICB3aGlsZSAoKm1zZykKLSAgICB7Ci0JKmZiID0gKm1zZzsKLQlmYiAgKz0gMjsKLQltc2cgKys7Ci0gICAgfQotKi8KLSNpZmRlZiBERUJVRwotICAgIGlmIChnZXRlbnYoIng4Nl9kb19pbm91dCIpKSBkb19pbm91dCgpOwotI2VuZGlmCi0KLS8qRklYTUU6ICAgIGRjYWNoZV9kaXNhYmxlKCk7ICovCi0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qIENsZWFuIHVwIHRoZSB4ODYgbWVzcyAqLwotdm9pZCBzaHV0ZG93bl9iaW9zKHZvaWQpCi17Ci0vKiAgICBkaXNhYmxlX2NvbXBhdGliaWxpdHlfaG9sZSgpOyAqLwotICAgIC8qIEZyZWUgdGhlIG1lbW9yeSBhc3NvY2lhdGVkICovCi0gICAgZnJlZShNLm1lbV9iYXNlKTsKLQotfQotCi1pbnQgdG9faW50KGNoYXIgKmJ1ZmZlcikKLXsKLSAgICBpbnQgYmFzZSA9IDA7Ci0gICAgaW50IHJlcyAgPSAwOwotCi0gICAgaWYgKCpidWZmZXIgPT0gJyQnKQotICAgIHsKLQliYXNlID0gMTY7Ci0JYnVmZmVyKys7Ci0gICAgfQotICAgIGVsc2UgYmFzZSA9IDEwOwotCi0gICAgZm9yICg7OykKLSAgICB7Ci0Jc3dpdGNoKCpidWZmZXIpCi0JewotCWNhc2UgJzAnIC4uLiAnOSc6Ci0JICAgIHJlcyAqPSBiYXNlOwotCSAgICByZXMgKz0gKmJ1ZmZlciAtICcwJzsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnQSc6Ci0JY2FzZSAnYSc6Ci0JICAgIHJlcyAqPSBiYXNlOwotCSAgICByZXMgKz0gMTA7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ0InOgotCWNhc2UgJ2InOgotCSAgICByZXMgKj0gYmFzZTsKLQkgICAgcmVzICs9IDExOwotCSAgICBicmVhazsKLQljYXNlICdDJzoKLQljYXNlICdjJzoKLQkgICAgcmVzICo9IGJhc2U7Ci0JICAgIHJlcyArPSAxMjsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnRCc6Ci0JY2FzZSAnZCc6Ci0JICAgIHJlcyAqPSBiYXNlOwotCSAgICByZXMgKz0gMTM7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ0UnOgotCWNhc2UgJ2UnOgotCSAgICByZXMgKj0gYmFzZTsKLQkgICAgcmVzICs9IDE0OwotCSAgICBicmVhazsKLQljYXNlICdGJzoKLQljYXNlICdmJzoKLQkgICAgcmVzICo9IGJhc2U7Ci0JICAgIHJlcyArPSAxNTsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgcmV0dXJuIHJlczsKLQl9Ci0JYnVmZmVyKys7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLXZvaWQgb25lX2FyZyhjaGFyICpidWZmZXIsIGludCAqYSkKLXsKLSAgICB3aGlsZSAoKmJ1ZmZlciAmJiAqYnVmZmVyICE9ICdcbicpCi0gICAgewotCWlmICgqYnVmZmVyID09ICcgJykgYnVmZmVyKys7Ci0JZWxzZSBicmVhazsKLSAgICB9Ci0KLSAgICAqYSA9IHRvX2ludChidWZmZXIpOwotfQotCi12b2lkIHR3b19hcmdzKGNoYXIgKmJ1ZmZlciwgaW50ICphLCBpbnQgKmIpCi17Ci0gICAgd2hpbGUgKCpidWZmZXIgJiYgKmJ1ZmZlciAhPSAnXG4nKQotICAgIHsKLQlpZiAoKmJ1ZmZlciA9PSAnICcpIGJ1ZmZlcisrOwotCWVsc2UgYnJlYWs7Ci0gICAgfQotCi0gICAgKmEgPSB0b19pbnQoYnVmZmVyKTsKLQotICAgIHdoaWxlICgqYnVmZmVyICYmICpidWZmZXIgIT0gJ1xuJykKLSAgICB7Ci0JaWYgKCpidWZmZXIgIT0gJyAnKSBidWZmZXIrKzsKLQllbHNlIGJyZWFrOwotICAgIH0KLQotICAgIHdoaWxlICgqYnVmZmVyICYmICpidWZmZXIgIT0gJ1xuJykKLSAgICB7Ci0JaWYgKCpidWZmZXIgPT0gJyAnKSBidWZmZXIrKzsKLQllbHNlIGJyZWFrOwotICAgIH0KLQotICAgICpiID0gdG9faW50KGJ1ZmZlcik7Ci19Ci0KLXZvaWQgZG9faW5vdXQodm9pZCkKLXsKLSAgICBjaGFyIGJ1ZmZlclsyNTZdOwotICAgIGNoYXIgKmFyZzEsICphcmcyOwotICAgIGludCBhLGI7Ci0KLSAgICBwcmludGYoIkluL091dCBTZXNzaW9uXG5Vc2UgJ2lbYndsXScgZm9yIGluLCAnb1tid2xdJyBmb3Igb3V0IGFuZCAncScgdG8gcXVpdFxuIik7Ci0KLSAgICBkbwotICAgIHsKLQljb25zX2dldHMoYnVmZmVyKTsKLQlwcmludGYoIlxuIik7Ci0KLQkqYXJnMSA9IGJ1ZmZlcjsKLQl3aGlsZSAoKmFyZzEgIT0gJyAnICkgYXJnMSsrOwotCXdoaWxlICgqYXJnMSA9PSAnICcpIGFyZzErKzsKLQotCWlmIChidWZmZXJbMF0gPT0gJ2knKQotCXsKLQkgICAgb25lX2FyZyhidWZmZXIrMiwgJmEpOwotCSAgICBzd2l0Y2ggKGJ1ZmZlclsxXSkKLQkgICAgewotCSAgICBjYXNlICdiJzoKLQkJcHJpbnRmKCJpbl9ieXRlKCV4aCkgPSAleGhcbiIsIGEsIEExX2luYihhKSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlICd3JzoKLQkJcHJpbnRmKCJpbl93b3JkKCV4aCkgPSAleGhcbiIsIGEsIEExX2ludyhhKSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdsJzoKLQkJcHJpbnRmKCJpbl9kd29yZCgleGgpID0gJXhoXG4iLCBhLCBBMV9pbmwoYSkpOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJcHJpbnRmKCJJbnZhbGlkIGxlbmd0aCAnJWMnXG4iLCBidWZmZXJbMV0pOwotCQlicmVhazsKLQkgICAgfQotCX0KLQllbHNlIGlmIChidWZmZXJbMF0gPT0gJ28nKQotCXsKLQkgICAgdHdvX2FyZ3MoYnVmZmVyKzIsICZhLCAmYik7Ci0JICAgIHN3aXRjaCAoYnVmZmVyWzFdKQotCSAgICB7Ci0JICAgIGNhc2UgJ2InOgotCQlwcmludGYoIm91dF9ieXRlKCVkLCAlZClcbiIsIGEsIGIpOwotCQlBMV9vdXRiKGEsYik7Ci0JCWJyZWFrOwotCSAgICBjYXNlICd3JzoKLQkJcHJpbnRmKCJvdXRfd29yZCglZCwgJWQpXG4iLCBhLCBiKTsKLQkJQTFfb3V0dyhhLCBiKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ2wnOgotCQlwcmludGYoIm91dF9sb25nKCVkLCAlZClcbiIsIGEsIGIpOwotCQlBMV9vdXRsKGEsIGIpOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJcHJpbnRmKCJJbnZhbGlkIGxlbmd0aCAnJWMnXG4iLCBidWZmZXJbMV0pOwotCQlicmVhazsKLQkgICAgfQotCX0gZWxzZSBpZiAoYnVmZmVyWzBdID09ICdxJykgcmV0dXJuOwotICAgIH0gd2hpbGUgKDEpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL21lbnUvY21kX21lbnUuYyBiL2JvYXJkL01BSS9tZW51L2NtZF9tZW51LmMKaW5kZXggYTUxNWJkOC4uMDc5ZjFmZiAxMDA2NDQKLS0tIGEvYm9hcmQvTUFJL21lbnUvY21kX21lbnUuYworKysgYi9ib2FyZC9NQUkvbWVudS9jbWRfbWVudS5jCkBAIC03LDcgKzcsNyBAQAogCXJldHVybiAwOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfQU1JR0FPTkVHM1NFKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQU1JR0FPTkVHM1NFKSAmJiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogVV9CT09UX0NNRCgKIAltZW51LCAgIDEsICAgICAgMSwgICAgICBkb19tZW51LAogCSJtZW51ICAgIC0gZGlzcGxheSBCSU9TIHNldHVwIG1lbnVcbiIsCmRpZmYgLS1naXQgYS9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9zZXJpYWwuYyBiL2JvYXJkL01hcnZlbGwvY29tbW9uL3NlcmlhbC5jCmluZGV4IDZhMWQ0ZDcuLjAxZWZiZWEgMTAwNjQ0Ci0tLSBhL2JvYXJkL01hcnZlbGwvY29tbW9uL3NlcmlhbC5jCisrKyBiL2JvYXJkL01hcnZlbGwvY29tbW9uL3NlcmlhbC5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKIAl9CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogdm9pZCBrZ2RiX3NlcmlhbF9pbml0ICh2b2lkKQogewogfQpAQCAtMTY5LDQgKzE2OSw0IEBACiB7CiAJcmV0dXJuOwogfQotI2VuZGlmIC8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9hMzAwMC91LWJvb3QubGRzIGIvYm9hcmQvYTMwMDAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiOWZmZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9hMzAwMC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI0eC9zdGFydC5vCQkoLnRleHQpCi0gICAgbGliX3BwYy9ib2FyZC5vCQkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3ZzcHJpbnRmLm8JKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL2NyYzMyLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy96bGliLm8JCSgudGV4dCkKLQotCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JKigudGV4dCkKLQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9hZHM1MTIxL01ha2VmaWxlIGIvYm9hcmQvYWRzNTEyMS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDgxNDhjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYWRzNTEyMS9NYWtlZmlsZQpAQCAtMCwwICsxLDUwIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNworIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitDT0JKUwk6PSAkKEJPQVJEKS5vCisKK1NSQ1MJOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpKQorCiskKExJQik6CSQob2JqKS5kZXBlbmQgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9hZHM1MTIxL2FkczUxMjEuYyBiL2JvYXJkL2FkczUxMjEvYWRzNTEyMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNzVjZTcKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hZHM1MTIxL2FkczUxMjEuYwpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNyBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM1MTJ4Lmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKworLyogQ2xvY2tzIGluIHVzZSAqLworI2RlZmluZSBTQ0NSMV9DTE9DS1NfRU4JKENMT0NLX1NDQ1IxX0NGR19FTiB8CQkJCVwKKwkJCSBDTE9DS19TQ0NSMV9MUENfRU4gfAkJCQlcCisJCQkgQ0xPQ0tfU0NDUjFfUFNDX0VOKENPTkZJR19QU0NfQ09OU09MRSkgfAlcCisJCQkgQ0xPQ0tfU0NDUjFfUFNDRklGT19FTiB8CQkJXAorCQkJIENMT0NLX1NDQ1IxX0REUl9FTiB8CQkJCVwKKwkJCSBDTE9DS19TQ0NSMV9GRUNfRU4pCisKKyNkZWZpbmUgU0NDUjJfQ0xPQ0tTX0VOCShDTE9DS19TQ0NSMl9NRU1fRU4gfAkJXAorCQkJIENMT0NLX1NDQ1IyX1NQRElGX0VOIHwJCVwKKwkJCSBDTE9DS19TQ0NSMl9JMkNfRU4pCisKKyNkZWZpbmUgQ1NBV19TVEFSVChzdGFydCkJKChzdGFydCkgJiAweEZGRkYwMDAwKQorI2RlZmluZSBDU0FXX1NUT1Aoc3RhcnQsIHNpemUpCSgoKHN0YXJ0KSArIChzaXplKSAtIDEpID4+IDE2KQorCitsb25nIGludCBmaXhlZF9zZHJhbSh2b2lkKTsKKworaW50IGJvYXJkX2Vhcmx5X2luaXRfZiAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENGR19JTU1SOworCXUzMiBscGNhdzsKKworCS8qCisJICogSW5pdGlhbGl6ZSBMb2NhbCBXaW5kb3cgZm9yIHRoZSBDUExEIHJlZ2lzdGVycyBhY2Nlc3MgKENTMiBzZWxlY3RzCisJICogdGhlIENQTEQgY2hpcCkKKwkgKi8KKwlpbS0+c3lzY29uZi5scGNzMmF3ID0gQ1NBV19TVEFSVChDRkdfQ1BMRF9CQVNFKSB8CisJCQkgICAgICBDU0FXX1NUT1AoQ0ZHX0NQTERfQkFTRSwgQ0ZHX0NQTERfU0laRSk7CisJaW0tPmxwYy5jc19jZmdbMl0gPSBDRkdfQ1MyX0NGRzsKKworCS8qCisJICogQWNjb3JkaW5nIHRvIE1QQzUxMjFlIFJNLCBjb25maWd1cmluZyBsb2NhbCBhY2Nlc3Mgd2luZG93cyBzaG91bGQKKwkgKiBiZSBmb2xsb3dlZCBieSBhIGR1bW15IHJlYWQgb2YgdGhlIGNvbmZpZyByZWdpc3RlciB0aGF0IHdhcworCSAqIG1vZGlmaWVkIGxhc3QgYW5kIGFuIGlzeW5jCisJICovCisJbHBjYXcgPSBpbS0+c3lzY29uZi5scGNzMmF3OworCV9fYXNtX18gX192b2xhdGlsZV9fICgiaXN5bmMiKTsKKworCS8qCisJICogRGlzYWJsZSBCb290IE5PUiBGTEFTSCB3cml0ZSBwcm90ZWN0IC0gQ1BMRCBSZWcgOCBOT1IgRkxBU0ggQ29udHJvbAorCSAqCisJICogV2l0aG91dCB0aGlzIHRoZSBmbGFzaCBpZGVudGlmaWNhdGlvbiByb3V0aW5lIGZhaWxzLCBhcyBpdCBuZWVkcyB0byBpc3N1ZQorCSAqIHdyaXRlIGNvbW1hbmRzIGluIG9yZGVyIHRvIGVzdGFibGlzaCB0aGUgZGV2aWNlIElELgorCSAqLworCSooKHZvbGF0aWxlIHU4ICopKENGR19DUExEX0JBU0UgKyAweDA4KSkgPSAweEMxOworCisJLyoKKwkgKiBFbmFibGUgY2xvY2tzCisJICovCisJaW0tPmNsay5zY2NyWzBdID0gU0NDUjFfQ0xPQ0tTX0VOOworCWltLT5jbGsuc2NjclsxXSA9IFNDQ1IyX0NMT0NLU19FTjsKKworCXJldHVybiAwOworfQorCitsb25nIGludCBpbml0ZHJhbSAoaW50IGJvYXJkX3R5cGUpCit7CisJdTMyIG1zaXplID0gMDsKKworCW1zaXplID0gZml4ZWRfc2RyYW0gKCk7CisKKwlyZXR1cm4gbXNpemU7Cit9CisKKy8qCisgKiBmaXhlZCBzZHJhbSBpbml0IC0tIHRoZSBib2FyZCBkb2Vzbid0IHVzZSBtZW1vcnkgbW9kdWxlcyB0aGF0IGhhdmUgc2VyaWFsIHByZXNlbmNlCisgKiBkZXRlY3Qgb3Igc2ltaWxhciBtZWNoYW5pc20gZm9yIGRpc2NvdmVyeSBvZiB0aGUgRFJBTSBzZXR0aW5ncworICovCitsb25nIGludCBmaXhlZF9zZHJhbSAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENGR19JTU1SOworCXUzMiBtc2l6ZSA9IENGR19ERFJfU0laRSAqIDEwMjQgKiAxMDI0OworCXUzMiBtc2l6ZV9sb2cyID0gX19pbG9nMiAobXNpemUpOworCXUzMiBpOworCisJLyogSW5pdGlhbGl6ZSBJTyBDb250cm9sICovCisJaW0tPmlvX2N0cmwucmVnc1tNRU1fSURYXSA9IElPQ1RSTF9NVVhfRERSOworCisJLyogSW5pdGlhbGl6ZSBERFIgTG9jYWwgV2luZG93ICovCisJaW0tPnN5c2NvbmYuZGRybGF3LmJhciA9IENGR19ERFJfQkFTRSAmIDB4RkZGRkYwMDA7CisJaW0tPnN5c2NvbmYuZGRybGF3LmFyID0gbXNpemVfbG9nMiAtIDE7CisKKwkvKgorCSAqIEFjY29yZGluZyB0byBNUEM1MTIxZSBSTSwgY29uZmlndXJpbmcgbG9jYWwgYWNjZXNzIHdpbmRvd3Mgc2hvdWxkCisJICogYmUgZm9sbG93ZWQgYnkgYSBkdW1teSByZWFkIG9mIHRoZSBjb25maWcgcmVnaXN0ZXIgdGhhdCB3YXMKKwkgKiBtb2RpZmllZCBsYXN0IGFuZCBhbiBpc3luYworCSAqLworCWkgPSBpbS0+c3lzY29uZi5kZHJsYXcuYXI7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpc3luYyIpOworCisJLyogRW5hYmxlIEREUiAqLworCWltLT5tZGRyYy5kZHJfc3lzX2NvbmZpZyA9IENGR19NRERSQ19TWVNfQ0ZHX0VOOworCisJLyogSW5pdGlhbGl6ZSBERFIgUHJpb3JpdHkgTWFuYWdlciAqLworCWltLT5tZGRyYy5wcmlvbWFuX2NvbmZpZzEgPSBDRkdfTUREUkNHUlBfUE1fQ0ZHMTsKKwlpbS0+bWRkcmMucHJpb21hbl9jb25maWcyID0gQ0ZHX01ERFJDR1JQX1BNX0NGRzI7CisJaW0tPm1kZHJjLmhpcHJpb19jb25maWcgPSBDRkdfTUREUkNHUlBfSElQUklPX0NGRzsKKwlpbS0+bWRkcmMubHV0X3RhYmxlMF9tYWluX3VwcGVyID0gQ0ZHX01ERFJDR1JQX0xVVDBfTVU7CisJaW0tPm1kZHJjLmx1dF90YWJsZTFfbWFpbl91cHBlciA9IENGR19NRERSQ0dSUF9MVVQxX01VOworCWltLT5tZGRyYy5sdXRfdGFibGUyX21haW5fdXBwZXIgPSBDRkdfTUREUkNHUlBfTFVUMl9NVTsKKwlpbS0+bWRkcmMubHV0X3RhYmxlM19tYWluX3VwcGVyID0gQ0ZHX01ERFJDR1JQX0xVVDNfTVU7CisJaW0tPm1kZHJjLmx1dF90YWJsZTRfbWFpbl91cHBlciA9IENGR19NRERSQ0dSUF9MVVQ0X01VOworCWltLT5tZGRyYy5sdXRfdGFibGUwX21haW5fbG93ZXIgPSBDRkdfTUREUkNHUlBfTFVUMF9NTDsKKwlpbS0+bWRkcmMubHV0X3RhYmxlMV9tYWluX2xvd2VyID0gQ0ZHX01ERFJDR1JQX0xVVDFfTUw7CisJaW0tPm1kZHJjLmx1dF90YWJsZTJfbWFpbl9sb3dlciA9IENGR19NRERSQ0dSUF9MVVQyX01MOworCWltLT5tZGRyYy5sdXRfdGFibGUzX21haW5fbG93ZXIgPSBDRkdfTUREUkNHUlBfTFVUM19NTDsKKwlpbS0+bWRkcmMubHV0X3RhYmxlNF9tYWluX2xvd2VyID0gQ0ZHX01ERFJDR1JQX0xVVDRfTUw7CisJaW0tPm1kZHJjLmx1dF90YWJsZTBfYWx0ZXJuYXRlX3VwcGVyID0gQ0ZHX01ERFJDR1JQX0xVVDBfQVU7CisJaW0tPm1kZHJjLmx1dF90YWJsZTFfYWx0ZXJuYXRlX3VwcGVyID0gQ0ZHX01ERFJDR1JQX0xVVDFfQVU7CisJaW0tPm1kZHJjLmx1dF90YWJsZTJfYWx0ZXJuYXRlX3VwcGVyID0gQ0ZHX01ERFJDR1JQX0xVVDJfQVU7CisJaW0tPm1kZHJjLmx1dF90YWJsZTNfYWx0ZXJuYXRlX3VwcGVyID0gQ0ZHX01ERFJDR1JQX0xVVDNfQVU7CisJaW0tPm1kZHJjLmx1dF90YWJsZTRfYWx0ZXJuYXRlX3VwcGVyID0gQ0ZHX01ERFJDR1JQX0xVVDRfQVU7CisJaW0tPm1kZHJjLmx1dF90YWJsZTBfYWx0ZXJuYXRlX2xvd2VyID0gQ0ZHX01ERFJDR1JQX0xVVDBfQVU7CisJaW0tPm1kZHJjLmx1dF90YWJsZTFfYWx0ZXJuYXRlX2xvd2VyID0gQ0ZHX01ERFJDR1JQX0xVVDFfQUw7CisJaW0tPm1kZHJjLmx1dF90YWJsZTJfYWx0ZXJuYXRlX2xvd2VyID0gQ0ZHX01ERFJDR1JQX0xVVDJfQUw7CisJaW0tPm1kZHJjLmx1dF90YWJsZTNfYWx0ZXJuYXRlX2xvd2VyID0gQ0ZHX01ERFJDR1JQX0xVVDNfQUw7CisJaW0tPm1kZHJjLmx1dF90YWJsZTRfYWx0ZXJuYXRlX2xvd2VyID0gQ0ZHX01ERFJDR1JQX0xVVDRfQUw7CisKKwkvKiBJbml0aWFsaXplIE1ERFJDICovCisJaW0tPm1kZHJjLmRkcl9zeXNfY29uZmlnID0gQ0ZHX01ERFJDX1NZU19DRkc7CisJaW0tPm1kZHJjLmRkcl90aW1lX2NvbmZpZzAgPSBDRkdfTUREUkNfVElNRV9DRkcwOworCWltLT5tZGRyYy5kZHJfdGltZV9jb25maWcxID0gQ0ZHX01ERFJDX1RJTUVfQ0ZHMTsKKwlpbS0+bWRkcmMuZGRyX3RpbWVfY29uZmlnMiA9IENGR19NRERSQ19USU1FX0NGRzI7CisKKwkvKiBJbml0aWFsaXplIEREUiAqLworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCQlpbS0+bWRkcmMuZGRyX2NvbW1hbmQgPSBDRkdfTUlDUk9OX05PUDsKKworCWltLT5tZGRyYy5kZHJfY29tbWFuZCA9IENGR19NSUNST05fUENIR19BTEw7CisJaW0tPm1kZHJjLmRkcl9jb21tYW5kID0gQ0ZHX01JQ1JPTl9FTTI7CisJaW0tPm1kZHJjLmRkcl9jb21tYW5kID0gQ0ZHX01JQ1JPTl9FTTM7CisJaW0tPm1kZHJjLmRkcl9jb21tYW5kID0gQ0ZHX01JQ1JPTl9FTl9ETEw7CisJaW0tPm1kZHJjLmRkcl9jb21tYW5kID0gQ0ZHX01JQ1JPTl9SU1RfRExMOworCWltLT5tZGRyYy5kZHJfY29tbWFuZCA9IENGR19NSUNST05fUENIR19BTEw7CisJaW0tPm1kZHJjLmRkcl9jb21tYW5kID0gQ0ZHX01JQ1JPTl9SRlNIOworCWltLT5tZGRyYy5kZHJfY29tbWFuZCA9IENGR19NSUNST05fSU5JVF9ERVZfT1A7CisJaW0tPm1kZHJjLmRkcl9jb21tYW5kID0gQ0ZHX01JQ1JPTl9PQ0RfREVGQVVMVDsKKwlpbS0+bWRkcmMuZGRyX2NvbW1hbmQgPSBDRkdfTUlDUk9OX09DRF9FWElUOworCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisJCWltLT5tZGRyYy5kZHJfY29tbWFuZCA9IENGR19NSUNST05fTk9QOworCisJLyogU3RhcnQgTUREUkMgKi8KKwlpbS0+bWRkcmMuZGRyX3RpbWVfY29uZmlnMCA9IENGR19NRERSQ19USU1FX0NGRzBfUlVOOworCWltLT5tZGRyYy5kZHJfc3lzX2NvbmZpZyA9IENGR19NRERSQ19TWVNfQ0ZHX1JVTjsKKworCXJldHVybiBtc2l6ZTsKK30KKworaW50IGNoZWNrYm9hcmQgKHZvaWQpCit7CisJdXNob3J0IGJyZF9yZXYgPSAqKHZ1X3Nob3J0ICopIChDRkdfQ1BMRF9CQVNFICsgMHgwMCk7CisJdWNoYXIgY3BsZF9yZXYgPSAqKHZ1X2NoYXIgKikgKENGR19DUExEX0JBU0UgKyAweDAyKTsKKworCXByaW50ZiAoIkJvYXJkOiBBRFM1MTIxIHJldi4gMHglMDR4IChDUExEIHJldi4gMHglMDJ4KVxuIiwKKwkJYnJkX3JldiwgY3BsZF9yZXYpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYWRzNTEyMS9jb25maWcubWsgYi9ib2FyZC9hZHM1MTIxL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDk5OGY0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYWRzNTEyMS9jb25maWcubWsKQEAgLTAsMCArMSwyMyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDcgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZworIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitURVhUX0JBU0UgID0gICAweEZGRjAwMDAwCmRpZmYgLS1naXQgYS9ib2FyZC9hZHM1MTIxL3UtYm9vdC5sZHMgYi9ib2FyZC9hZHM1MTIxL3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4ZDg0OQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FkczUxMjEvdS1ib290LmxkcwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNyBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQorICAucGx0IDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICA6CisgIHsKKyAgICBjcHUvbXBjNTEyeC9zdGFydC5vCSgudGV4dCkKKyAgICAqKC50ZXh0KQorICAgICooLmZpeHVwKQorICAgICooLmdvdDEpCisgICAgLiA9IEFMSUdOKDE2KTsKKyAgICAqKC5yb2RhdGEpCisgICAgKigucm9kYXRhMSkKKyAgICAqKC5yb2RhdGEuc3RyMS40KQorICAgICooLmVoX2ZyYW1lKQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOworICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgLiA9IC47CisgIF9fdV9ib290X2NtZF9zdGFydCA9IC47CisgIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisgIF9fdV9ib290X2NtZF9lbmQgPSAuOworCisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2VuZCA9IC47CisKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgIDoKKyAgeworICAgKiguc2JzcykgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICB9CisgIF9lbmQgPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7Cit9CitFTlRSWShfc3RhcnQpCmRpZmYgLS1naXQgYS9ib2FyZC9hbGFza2EvYWxhc2thLmMgYi9ib2FyZC9hbGFza2EvYWxhc2thLmMKaW5kZXggOTM4NzRiMi4uOTUzMTcwMyAxMDA2NDQKLS0tIGEvYm9hcmQvYWxhc2thL2FsYXNrYS5jCisrKyBiL2JvYXJkL2FsYXNrYS9hbGFza2EuYwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJc2l6ZSA9IGRyYW1TZXR1cCAoKTsKIAogLyogaWYgaUNhY2hlIGFkIGRDYWNoZSBpcyBkZWZpbmVkICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQ0FDSEUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NBQ0hFKQogLyogICAgc2V0dXBCYXQoc2l6ZSk7Ki8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9ib2FyZC9hbGFza2EvdS1ib290LmxkcyBiL2JvYXJkL2FsYXNrYS91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODliYzc3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL2FsYXNrYS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNAotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjIwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2FsdGVyYS9kazFjMjAvZGsxYzIwLmMgYi9ib2FyZC9hbHRlcmEvZGsxYzIwL2RrMWMyMC5jCmluZGV4IDk4ZWU3YTcuLmQwZWI5ZWEgMTAwNjQ0Ci0tLSBhL2JvYXJkL2FsdGVyYS9kazFjMjAvZGsxYzIwLmMKKysrIGIvYm9hcmQvYWx0ZXJhL2RrMWMyMC9kazFjMjAuYwpAQCAtNTUsNyArNTUsNyBAQAogCXJldHVybiAoMCk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKIGludCBpZGVfcHJlaW5pdCAodm9pZCkKIHsKIAluaW9zX3Bpb190ICpwcmVzZW50ID0gKG5pb3NfcGlvX3QgKikgQ0ZHX0NGX1BSRVNFTlQ7CkBAIC03OCw0ICs3OCw0IEBACiAKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9hbWlyaXgvYXAxMDAwL3NlcmlhbC5jIGIvYm9hcmQvYW1pcml4L2FwMTAwMC9zZXJpYWwuYwppbmRleCBjNmVlNzcyLi41ZTllM2EzIDEwMDY0NAotLS0gYS9ib2FyZC9hbWlyaXgvYXAxMDAwL3NlcmlhbC5jCisrKyBiL2JvYXJkL2FtaXJpeC9hcDEwMDAvc2VyaWFsLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAl9CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogdm9pZCBrZ2RiX3NlcmlhbF9pbml0ICh2b2lkKQogewogfQpAQCAtMTA4LDQgKzEwOCw0IEBACiB7CiAJcmV0dXJuOwogfQotI2VuZGlmIC8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9hdDkxcm05MjAwZGsvYXQ5MXJtOTIwMGRrLmMgYi9ib2FyZC9hdDkxcm05MjAwZGsvYXQ5MXJtOTIwMGRrLmMKaW5kZXggMDAyOTgxYS4uYzU2NGY3MyAxMDA2NDQKLS0tIGEvYm9hcmQvYXQ5MXJtOTIwMGRrL2F0OTFybTkyMDBkay5jCisrKyBiL2JvYXJkL2F0OTFybTkyMDBkay9hdDkxcm05MjAwZGsuYwpAQCAtNjIsNyArNjIsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9FVEhFUgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAvKgogICogTmFtZToKQEAgLTgyLDE0ICs4MiwxNCBAQAogCXBfcGh5b3BzLT5BdXRvTmVnb3RpYXRlID0gZG05MTYxX0F1dG9OZWdvdGlhdGU7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAjZW5kaWYJLyogQ09ORklHX0RSSVZFUl9FVEhFUiAqLwogCiAvKgogICogRGlzayBPbiBDaGlwIChOQU5EKSBNaWxsZW5pdW0gaW5pdGlhbGl6YXRpb24uCiAgKiBUaGUgTkFORCBsaXZlcyBpbiB0aGUgQ1MyKiBzcGFjZQogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIGV4dGVybiB1bG9uZyBuYW5kX3Byb2JlICh1bG9uZyBwaHlzYWRyKTsKIAogI2RlZmluZSBBVDkxX1NNQVJUTUVESUFfQkFTRSAweDQwMDAwMDAwCS8qIHBoeXNpY2FsIGFkZHJlc3MgdG8gYWNjZXNzIG1lbW9yeSBvbiBOQ1MzICovCmRpZmYgLS1naXQgYS9ib2FyZC9hdGMvYXRjLmMgYi9ib2FyZC9hdGMvYXRjLmMKaW5kZXggZDJjNmIzYi4uZmUzMjE1NSAxMDA2NDQKLS0tIGEvYm9hcmQvYXRjL2F0Yy5jCisrKyBiL2JvYXJkL2F0Yy9hdGMuYwpAQCAtMzc5LDcgKzM3OSw3IEBACiAJcmV0dXJuIChwc2l6ZSk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIGV4dGVybiB2b2lkIGRvY19wcm9iZSAodWxvbmcgcGh5c2Fkcik7CiB2b2lkIGRvY19pbml0ICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYm9hcmQvYXRjL3RpMTEzeC5jIGIvYm9hcmQvYXRjL3RpMTEzeC5jCmluZGV4IGQ1ZTkzNWMuLmUxMTJlY2EgMTAwNjQ0Ci0tLSBhL2JvYXJkL2F0Yy90aTExM3guYworKysgYi9ib2FyZC9hdGMvdGkxMTN4LmMKQEAgLTU5MSw3ICs1OTEsNyBAQAogCXJldHVybiByYzsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogaW50IHBjbWNpYV9vZmYgKHZvaWQpCiB7CiAJcHJpbnRmICgiRGlzYWJsZSBQQ01DSUEgIiBQQ01DSUFfU0xPVF9NU0cgIlxuIik7CmRpZmYgLS1naXQgYS9ib2FyZC9hdGMvdS1ib290LmxkcyBiL2JvYXJkL2F0Yy91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWU4M2QwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2F0Yy91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYXRtZWwvYXRzdGsxMDAwL2V0aC5jIGIvYm9hcmQvYXRtZWwvYXRzdGsxMDAwL2V0aC5jCmluZGV4IDNhNzkxNmUuLmIyYjFhMTIgMTAwNjQ0Ci0tLSBhL2JvYXJkL2F0bWVsL2F0c3RrMTAwMC9ldGguYworKysgYi9ib2FyZC9hdG1lbC9hdHN0azEwMDAvZXRoLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAogZXh0ZXJuIGludCBtYWNiX2V0aF9pbml0aWFsaXplKGludCBpZCwgdm9pZCAqcmVncywgdW5zaWduZWQgaW50IHBoeV9hZGRyKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX01BQ0IpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19NQUNCKSAmJiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogdm9pZCBhdHN0azEwMDBfZXRoX2luaXRpYWxpemUoYmRfdCAqYmkpCiB7CiAJaW50IGlkID0gMDsKZGlmZiAtLWdpdCBhL2JvYXJkL2JhcmNvL3UtYm9vdC5sZHMgYi9ib2FyZC9iYXJjby91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY4NTMxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2JhcmNvL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkoLnRleHQpCi0gICAgbGliX3BwYy9ib2FyZC5vCSgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCSgudGV4dCkKLQotCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JKigudGV4dCkKLQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9iYzM0NTAvYmMzNDUwLmMgYi9ib2FyZC9iYzM0NTAvYmMzNDUwLmMKaW5kZXggMDViYjcyMy4uNTZhNzNmZSAxMDA2NDQKLS0tIGEvYm9hcmQvYmMzNDUwL2JjMzQ1MC5jCisrKyBiL2JvYXJkL2JjMzQ1MC9iYzM0NTAuYwpAQCAtMjk0LDcgKzI5NCw3IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV9SRVNFVCkKIAogdm9pZCBpbml0X2lkZV9yZXNldCAodm9pZCkKIHsKQEAgLTMxNSw3ICszMTUsNyBAQAogCQkqKHZ1X2xvbmcgKikgTVBDNVhYWF9XVV9HUElPX0RBVEFfTyB8PSAgR1BJT19QU0MxXzQ7CiAJfQogfQotI2VuZGlmIC8qIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKSAqLworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUE9TVAogLyoKZGlmZiAtLWdpdCBhL2JvYXJkL2JjMzQ1MC9jbWRfYmMzNDUwLmMgYi9ib2FyZC9iYzM0NTAvY21kX2JjMzQ1MC5jCmluZGV4IDZiYmU0ZTYuLjE0NTU5NTMgMTAwNjQ0Ci0tLSBhL2JvYXJkL2JjMzQ1MC9jbWRfYmMzNDUwLmMKKysrIGIvYm9hcmQvYmMzNDUwL2NtZF9iYzM0NTAuYwpAQCAtMzAsNyArMzAsNyBAQAogLyoKICAqIEJDMzQ1MCBzcGVjaWZpYyBjb21tYW5kcwogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CU1ApCiAKICN1bmRlZiBERUJVRwogI2lmZGVmIERFQlVHCkBAIC04MjQsNCArODI0LDQgQEAKIAkgICAgInRlc3QgdW5pdC1vZmZcbiIKIAkgICAgIiAgICAgLSB0dXJucyBvZmYgdGhlIEJDMzQ1MCB1bml0XG4iCiAJICAgICIgICAgICAgV0FSTklORzogVW5zYXZlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2lsbCBiZSBsb3N0IVxuIik7Ci0jZW5kaWYgLyogQ0ZHX0NNRF9CU1AgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvYmMzNDUwL3UtYm9vdC5sZHMgYi9ib2FyZC9iYzM0NTAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiOThhOC4uMDAwMDAwMAotLS0gYS9ib2FyZC9iYzM0NTAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDQKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9iZjUzNy1zdGFtcC9iZjUzNy1zdGFtcC5jIGIvYm9hcmQvYmY1Mzctc3RhbXAvYmY1Mzctc3RhbXAuYwppbmRleCA0N2Y3YzllLi45MTljZWY2IDEwMDY0NAotLS0gYS9ib2FyZC9iZjUzNy1zdGFtcC9iZjUzNy1zdGFtcC5jCisrKyBiL2JvYXJkL2JmNTM3LXN0YW1wL2JmNTM3LXN0YW1wLmMKQEAgLTE1OSw3ICsxNTksNyBAQAogCXVuc2lnbmVkIGNoYXIgKnBNQUNhZGRyID0gKHVuc2lnbmVkIGNoYXIgKikweDIwM0YwMDAwOwogCXU4IFNyY0FkZHJbNl0gPSB7IDB4MDIsIDB4ODAsIDB4QUQsIDB4MjAsIDB4MzEsIDB4QjggfTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCS8qIFRoZSAweEZGIGNoZWNrIGhlcmUgaXMgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHVzZSB0aGUgYWRkcmVzcwogCSAqIGluIGZsYXNoIGlmIGl0J3Mgc2ltcGx5IGJlZW4gZXJhc2VkIChha2EgYWxsIDB4RkYgdmFsdWVzKSAqLwogCWlmIChnZXRlbnYoImV0aGFkZHIiKSA9PSBOVUxMICYmIGlzX3ZhbGlkX2V0aGVyX2FkZHIocE1BQ2FkZHIpKSB7CkBAIC0xNzEsNyArMTcxLDcgQEAKIAlpZiAoZ2V0ZW52KCJldGhhZGRyIikpIHsKIAkJU2V0dXBNYWNBZGRyKFNyY0FkZHIpOwogCX0KLSNlbmRpZgkJCQkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAjZW5kaWYJCQkJLyogQkZJTl9CT09UX01PREUgPT0gQkY1MzdfQllQQVNTX0JPT1QgKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fSURFKQpkaWZmIC0tZ2l0IGEvYm9hcmQvYmY1Mzctc3RhbXAvZXRoZXJfYmY1MzcuYyBiL2JvYXJkL2JmNTM3LXN0YW1wL2V0aGVyX2JmNTM3LmMKaW5kZXggODA3YjllOC4uMzZjMTUzNiAxMDA2NDQKLS0tIGEvYm9hcmQvYmY1Mzctc3RhbXAvZXRoZXJfYmY1MzcuYworKysgYi9ib2FyZC9iZjUzNy1zdGFtcC9ldGhlcl9iZjUzNy5jCkBAIC00Miw3ICs0Miw3IEBACiAjZGVmaW5lIERFQlVHRihmbXQsYXJncy4uLikKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKICNkZWZpbmUgUlhCVUZfQkFTRV9BRERSCQkweEZGOTAwMDAwCiAjZGVmaW5lIFRYQlVGX0JBU0VfQUREUgkJMHhGRjgwMDAwMApAQCAtNTQyLDQgKzU0Miw0IEBACiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKLSNlbmRpZgkJCQkvKiBDRkdfQ01EX05FVCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9iZjUzNy1zdGFtcC9uYW5kLmMgYi9ib2FyZC9iZjUzNy1zdGFtcC9uYW5kLmMKaW5kZXggNGQ2ZTc3Ni4uZjk1YjU4NCAxMDA2NDQKLS0tIGEvYm9hcmQvYmY1Mzctc3RhbXAvbmFuZC5jCisrKyBiL2JvYXJkL2JmNTM3LXN0YW1wL25hbmQuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2luY2x1ZGUgPG5hbmQuaD4KIApAQCAtMTAzLDQgKzEwMyw0IEBACiAJbmFuZC0+ZGV2X3JlYWR5ID0gYmZpbl9kZXZpY2VfcmVhZHk7CiAJbmFuZC0+Y2hpcF9kZWxheSA9IDMwOwogfQotI2VuZGlmCQkJCS8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2Jtdy91LWJvb3QubGRzIGIvYm9hcmQvYm13L3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZWUzZmQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvYm13L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvcHBjc3RyaW5nLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy92c3ByaW50Zi5vCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvemxpYi5vCQkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9jMm1vbi9wY21jaWEuYyBiL2JvYXJkL2MybW9uL3BjbWNpYS5jCmluZGV4IDVlNTBjNGQuLmMzODljNjcgMTAwNjQ0Ci0tLSBhL2JvYXJkL2MybW9uL3BjbWNpYS5jCisrKyBiL2JvYXJkL2MybW9uL3BjbWNpYS5jCkBAIC00LDExICs0LDExIEBACiAKICN1bmRlZglDT05GSUdfUENNQ0lBCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYJZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIApAQCAtMTY1LDcgKzE2NSw3IEBACiB9CiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogaW50IHBjbWNpYV9oYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQogewogCXZvbGF0aWxlIGltbWFwX3QJKmltbWFwOwpAQCAtMTkzLDcgKzE5Myw3IEBACiAKIAlyZXR1cm4gKDApOwogfQotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogCiBpbnQgcGNtY2lhX3ZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQpkaWZmIC0tZ2l0IGEvYm9hcmQvY2FubWIvdS1ib290LmxkcyBiL2JvYXJkL2Nhbm1iL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZGMxMTguLjAwMDAwMDAKLS0tIGEvYm9hcmQvY2FubWIvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDA1Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzV4eHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvY2RzL2NvbW1vbi92aWEuYyBiL2JvYXJkL2Nkcy9jb21tb24vdmlhLmMKaW5kZXggZTc5YmQwMi4uNGE2M2Q3NyAxMDA2NDQKLS0tIGEvYm9hcmQvY2RzL2NvbW1vbi92aWEuYworKysgYi9ib2FyZC9jZHMvY29tbW9uL3ZpYS5jCkBAIC0yOCwxMSArMjgsMTYgQEAKIAkJCXBjaV9kZXZfdCBkZXYsIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICp0YWIpCiB7CiAJcGNpX2Rldl90IGJyaWRnZTsKKwl1bnNpZ25lZCBpbnQgY21kc3RhdDsKIAogCS8qIEVuYWJsZSBVU0IgYW5kIElERSBmdW5jdGlvbnMgKi8KIAlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIDB4NDgsIDB4MDgpOwogCi0JcGNpYXV0b19jb25maWdfZGV2aWNlKGhvc2UsIGRldik7CisJcGNpX2hvc2VfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBQQ0lfQ09NTUFORCwgJmNtZHN0YXQpOworCWNtZHN0YXQgfD0gUENJX0NPTU1BTkRfSU8gfCBQQ0lfQ09NTUFORF9NRU1PUll8IFBDSV9DT01NQU5EX01BU1RFUjsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBQQ0lfQ09NTUFORCwgY21kc3RhdCk7CisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCAweDA4KTsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDgwKTsKIAogCS8qCiAJICogRm9yY2UgdGhlIGJhY2twbGFuZSBQMlAgYnJpZGdlIHRvIGhhdmUgYSB3aW5kb3cKQEAgLTQwLDcgKzQ1LDcgQEAKIAkgKiBUaGlzIGFsbG93cyBsZWdhY3kgSS9PIChpODI1OSwgZXRjKSBvbiB0aGUgVklBCiAJICogc291dGhicmlkZ2UgdG8gYmUgYWNjZXNzZWQuCiAJICovCi0JYnJpZGdlID0gUENJX0JERigwLDE3LDApOworCWJyaWRnZSA9IFBDSV9CREYoMCxCUklER0VfSUQsMCk7CiAJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgYnJpZGdlLCBQQ0lfSU9fQkFTRSwgMCk7CiAJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgYnJpZGdlLCBQQ0lfSU9fQkFTRV9VUFBFUjE2LCAwKTsKIAlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBicmlkZ2UsIFBDSV9JT19MSU1JVCwgMHgxMCk7CmRpZmYgLS1naXQgYS9ib2FyZC9jZHMvbXBjODU0MWNkcy9tcGM4NTQxY2RzLmMgYi9ib2FyZC9jZHMvbXBjODU0MWNkcy9tcGM4NTQxY2RzLmMKaW5kZXggNDE5MjMyNC4uNTU4YmE5OSAxMDA2NDQKLS0tIGEvYm9hcmQvY2RzL21wYzg1NDFjZHMvbXBjODU0MWNkcy5jCisrKyBiL2JvYXJkL2Nkcy9tcGM4NTQxY2RzL21wYzg1NDFjZHMuYwpAQCAtNDc2LDE0ICs0NzYsMTcgQEAKIAogc3RhdGljIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlIHBjaV9tcGM4NXh4Y2RzX2NvbmZpZ190YWJsZVtdID0gewogCXsweDEwZTMsIDB4MDUxMywgUENJX0FOWV9JRCwgMSwgMywgUENJX0FOWV9JRCwgZHVtbXlfZnVuYywgezAsMCwwfX0sCi0JezB4MTEwNiwgMHgwNjg2LCBQQ0lfQU5ZX0lELCAxLCAyLCAwLCBtcGM4NXh4X2NvbmZpZ192aWEsIHswLDAsMH19LAotCXsweDExMDYsIDB4MDU3MSwgUENJX0FOWV9JRCwgMSwgMiwgMSwKKwl7MHgxMTA2LCAweDA2ODYsIFBDSV9BTllfSUQsIDEsIFZJQV9JRCwgMCwgbXBjODV4eF9jb25maWdfdmlhLCB7MCwwLDB9fSwKKwl7MHgxMTA2LCAweDA1NzEsIFBDSV9BTllfSUQsIDEsIFZJQV9JRCwgMSwKIAkJbXBjODV4eF9jb25maWdfdmlhX3VzYmlkZSwgezAsMCwwfX0sCi0JezB4MTEwNSwgMHgzMDM4LCBQQ0lfQU5ZX0lELCAxLCAyLCAyLCBtcGM4NXh4X2NvbmZpZ192aWFfdXNiLCB7MCwwLDB9fSwKLQl7MHgxMTA2LCAweDMwMzgsIFBDSV9BTllfSUQsIDEsIDIsIDMsIG1wYzg1eHhfY29uZmlnX3ZpYV91c2IyLCB7MCwwLDB9fSwKLQl7MHgxMTA2LCAweDMwNTgsIFBDSV9BTllfSUQsIDEsIDIsIDUsCisJezB4MTEwNSwgMHgzMDM4LCBQQ0lfQU5ZX0lELCAxLCBWSUFfSUQsIDIsCisJCW1wYzg1eHhfY29uZmlnX3ZpYV91c2IsIHswLDAsMH19LAorCXsweDExMDYsIDB4MzAzOCwgUENJX0FOWV9JRCwgMSwgVklBX0lELCAzLAorCQltcGM4NXh4X2NvbmZpZ192aWFfdXNiMiwgezAsMCwwfX0sCisJezB4MTEwNiwgMHgzMDU4LCBQQ0lfQU5ZX0lELCAxLCBWSUFfSUQsIDUsCiAJCW1wYzg1eHhfY29uZmlnX3ZpYV9wb3dlciwgezAsMCwwfX0sCi0JezB4MTEwNiwgMHgzMDY4LCBQQ0lfQU5ZX0lELCAxLCAyLCA2LCBtcGM4NXh4X2NvbmZpZ192aWFfYWM5NywgezAsMCwwfX0sCisJezB4MTEwNiwgMHgzMDY4LCBQQ0lfQU5ZX0lELCAxLCBWSUFfSUQsIDYsCisJCW1wYzg1eHhfY29uZmlnX3ZpYV9hYzk3LCB7MCwwLDB9fSwKIAl7fSwKIH07CiAKZGlmZiAtLWdpdCBhL2JvYXJkL2Nkcy9tcGM4NTQ4Y2RzL2NvbmZpZy5tayBiL2JvYXJkL2Nkcy9tcGM4NTQ4Y2RzL2NvbmZpZy5tawppbmRleCAyNDJhNjc2Li5iMjNiYzg3IDEwMDY0NAotLS0gYS9ib2FyZC9jZHMvbXBjODU0OGNkcy9jb25maWcubWsKKysrIGIvYm9hcmQvY2RzL21wYzg1NDhjZHMvY29uZmlnLm1rCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyMgQ29weXJpZ2h0IDIwMDQsIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCiAjCiAjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAjIHByb2plY3QuCkBAIC0yMyw3ICsyMyw5IEBACiAjCiAjIG1wYzg1NDhjZHMgYm9hcmQKICMKK2lmbmRlZiBURVhUX0JBU0UKIFRFWFRfQkFTRSA9IDB4ZmZmODAwMDAKK2VuZGlmCiAKIFBMQVRGT1JNX0NQUEZMQUdTICs9IC1EQ09ORklHX0U1MDA9MQogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDODV4eD0xCmRpZmYgLS1naXQgYS9ib2FyZC9jZHMvbXBjODU0OGNkcy9pbml0LlMgYi9ib2FyZC9jZHMvbXBjODU0OGNkcy9pbml0LlMKaW5kZXggZDQ2OGY1Yi4uNzI5NDBiMCAxMDA2NDQKLS0tIGEvYm9hcmQvY2RzL21wYzg1NDhjZHMvaW5pdC5TCisrKyBiL2JvYXJkL2Nkcy9tcGM4NTQ4Y2RzL2luaXQuUwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqIENvcHlyaWdodCAyMDA0LCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgogICogQ29weXJpZ2h0IDIwMDIsMjAwMywgTW90b3JvbGEgSW5jLgogICoKICAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCkBAIC0yOCw2ICsyOCwxMiBAQAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPG1wYzg1eHguaD4KIAorI2RlZmluZSBMQVdBUl9UUkdUX1BDSTEJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTEFXQVJfVFJHVF9QQ0kyCQkweDAwMTAwMDAwCisjZGVmaW5lIExBV0FSX1RSR1RfUENJRQkJMHgwMDIwMDAwMAorI2RlZmluZSBMQVdBUl9UUkdUX1JJTwkJMHgwMGMwMDAwMAorI2RlZmluZSBMQVdBUl9UUkdUX0xCQwkJMHgwMDQwMDAwMAorI2RlZmluZSBMQVdBUl9UUkdUX0REUgkJMHgwMGYwMDAwMAogCiAvKgogICogVExCMCBhbmQgVExCMSBFbnRyaWVzCkBAIC00Nyw4ICs1Myw4IEBACiAgKi8KIAogI2RlZmluZQllbnRyeV9zdGFydCBcCi0JbWZscglyMSAJOwlcCi0JYmwJMGYgCTsKKwltZmxyCXIxCTsJXAorCWJsCTBmCTsKIAogI2RlZmluZQllbnRyeV9lbmQgXAogMDoJbWZscglyMAk7CVwKQEAgLTg0LDggKzkwLDggQEAKICNlbmRpZgogCiAJLyoKLQkgKiBUTEIwCQkxNksJQ2FjaGVhYmxlLCBub24tZ3VhcmRlZAotCSAqIDB4ZDAwMV8wMDAwCTE2SwlUZW1wb3JhcnkgR2xvYmFsIGRhdGEgZm9yIGluaXRpYWxpemF0aW9uCisJICogVExCMAkJMTZLCUNhY2hlYWJsZSwgZ3VhcmRlZAorCSAqIFRlbXBvcmFyeSBHbG9iYWwgZGF0YSBmb3IgaW5pdGlhbGl6YXRpb24KIAkgKgogCSAqIFVzZSBmb3VyIDRLIFRMQjAgZW50cmllcy4gIFRoZXNlIGVudHJpZXMgbXVzdCBiZSBjYWNoZWFibGUKIAkgKiBhcyB0aGV5IHByb3ZpZGUgdGhlIGJvb3RzdHJhcCBtZW1vcnkgYmVmb3JlIHRoZSBtZW1vcnkKQEAgLTk3LDI4ICsxMDMsMjggQEAKIAkubG9uZyBUTEIxX01BUzAoMCwgMCwgMCkKIAkubG9uZyBUTEIxX01BUzEoMSwgMCwgMCwgMCwgMCkKIAkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19JTklUX1JBTV9BRERSKSwKLQkJCTAsMCwwLDAsMCwwLDAsMCkKKwkJCTAsMCwwLDAsMCwwLDEsMCkKIAkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19JTklUX1JBTV9BRERSKSwKIAkJCTAsMCwwLDAsMCwxLDAsMSwwLDEpCiAKIAkubG9uZyBUTEIxX01BUzAoMCwgMCwgMCkKIAkubG9uZyBUTEIxX01BUzEoMSwgMCwgMCwgMCwgMCkKIAkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19JTklUX1JBTV9BRERSICsgNCAqIDEwMjQpLAotCQkJMCwwLDAsMCwwLDAsMCwwKQorCQkJMCwwLDAsMCwwLDAsMSwwKQogCS5sb25nIFRMQjFfTUFTMyhFNTAwX1RMQl9SUE4oQ0ZHX0lOSVRfUkFNX0FERFIgKyA0ICogMTAyNCksCiAJCQkwLDAsMCwwLDAsMSwwLDEsMCwxKQogCiAJLmxvbmcgVExCMV9NQVMwKDAsIDAsIDApCiAJLmxvbmcgVExCMV9NQVMxKDEsIDAsIDAsIDAsIDApCiAJLmxvbmcgVExCMV9NQVMyKEU1MDBfVExCX0VQTihDRkdfSU5JVF9SQU1fQUREUiArIDggKiAxMDI0KSwKLQkJCTAsMCwwLDAsMCwwLDAsMCkKKwkJCTAsMCwwLDAsMCwwLDEsMCkKIAkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19JTklUX1JBTV9BRERSICsgOCAqIDEwMjQpLAogCQkJMCwwLDAsMCwwLDEsMCwxLDAsMSkKIAogCS5sb25nIFRMQjFfTUFTMCgwLCAwLCAwKQogCS5sb25nIFRMQjFfTUFTMSgxLCAwLCAwLCAwLCAwKQogCS5sb25nIFRMQjFfTUFTMihFNTAwX1RMQl9FUE4oQ0ZHX0lOSVRfUkFNX0FERFIgKyAxMiAqIDEwMjQpLAotCQkJMCwwLDAsMCwwLDAsMCwwKQorCQkJMCwwLDAsMCwwLDAsMSwwKQogCS5sb25nIFRMQjFfTUFTMyhFNTAwX1RMQl9SUE4oQ0ZHX0lOSVRfUkFNX0FERFIgKyAxMiAqIDEwMjQpLAogCQkJMCwwLDAsMCwwLDEsMCwxLDAsMSkKIApAQCAtMTMwLDUxICsxMzYsNDQgQEAKIAkgKi8KIAkubG9uZyBUTEIxX01BUzAoMSwgMCwgMCkKIAkubG9uZyBUTEIxX01BUzEoMSwgMSwgMCwgMCwgQk9PS0VfUEFHRVNaXzE2TSkKLQkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19GTEFTSF9CQVNFKSwgMCwwLDAsMCwxLDAsMSwwKQotCS5sb25nIFRMQjFfTUFTMyhFNTAwX1RMQl9SUE4oQ0ZHX0ZMQVNIX0JBU0UpLCAwLDAsMCwwLDAsMSwwLDEsMCwxKQorCS5sb25nIFRMQjFfTUFTMihFNTAwX1RMQl9FUE4oQ0ZHX0JPT1RfQkxPQ0spLCAwLDAsMCwwLDEsMCwxLDApCisJLmxvbmcgVExCMV9NQVMzKEU1MDBfVExCX1JQTihDRkdfQk9PVF9CTE9DSyksIDAsMCwwLDAsMCwxLDAsMSwwLDEpCiAKIAkvKgotCSAqIFRMQiAxOgkyNTZNCU5vbi1jYWNoZWFibGUsIGd1YXJkZWQKLQkgKiAweDgwMDAwMDAwCTI1Nk0JUENJMSBNRU0KKwkgKiBUTEIgMToJMUcJTm9uLWNhY2hlYWJsZSwgZ3VhcmRlZAorCSAqIDB4ODAwMDAwMDAJMUcJUENJMS9QQ0lFICA4LDksYSxiCiAJICovCiAJLmxvbmcgVExCMV9NQVMwKDEsIDEsIDApCi0JLmxvbmcgVExCMV9NQVMxKDEsIDEsIDAsIDAsIEJPT0tFX1BBR0VTWl8yNTZNKQotCS5sb25nIFRMQjFfTUFTMihFNTAwX1RMQl9FUE4oQ0ZHX1BDSTFfTUVNX0JBU0UpLCAwLDAsMCwwLDEsMCwxLDApCi0JLmxvbmcgVExCMV9NQVMzKEU1MDBfVExCX1JQTihDRkdfUENJMV9NRU1fQkFTRSksIDAsMCwwLDAsMCwxLDAsMSwwLDEpCisJLmxvbmcgVExCMV9NQVMxKDEsIDEsIDAsIDAsIEJPT0tFX1BBR0VTWl8xRykKKwkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19QQ0lfUEhZUyksIDAsMCwwLDAsMSwwLDEsMCkKKwkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19QQ0lfUEhZUyksIDAsMCwwLDAsMCwxLDAsMSwwLDEpCiAKKyNpZmRlZiBDRkdfUklPX01FTV9QSFlTCiAJLyoKIAkgKiBUTEIgMjoJMjU2TQlOb24tY2FjaGVhYmxlLCBndWFyZGVkCi0JICogMHg5MDAwMDAwMAkyNTZNCVBDSTIgTUVNCiAJICovCiAJLmxvbmcgVExCMV9NQVMwKDEsIDIsIDApCiAJLmxvbmcgVExCMV9NQVMxKDEsIDEsIDAsIDAsIEJPT0tFX1BBR0VTWl8yNTZNKQotCS5sb25nIFRMQjFfTUFTMihFNTAwX1RMQl9FUE4oQ0ZHX1BDSTJfTUVNX0JBU0UpLAorCS5sb25nIFRMQjFfTUFTMihFNTAwX1RMQl9FUE4oQ0ZHX1JJT19NRU1fUEhZUyksCiAJCQkwLDAsMCwwLDEsMCwxLDApCi0JLmxvbmcgVExCMV9NQVMzKEU1MDBfVExCX1JQTihDRkdfUENJMl9NRU1fQkFTRSksCi0JCQkwLDAsMCwwLDAsMSwwLDEsMCwxKQorCS5sb25nIFRMQjFfTUFTMyhFNTAwX1RMQl9SUE4oQ0ZHX1JJT19NRU1fUEhZUyksCTAsMCwwLDAsMCwxLDAsMSwwLDEpCiAKIAkvKgotCSAqIFRMQiAzOgkxR0IJTm9uLWNhY2hlYWJsZSwgZ3VhcmRlZAotCSAqIDB4YTAwMDAwMDAJMjU2TQlQRVggTUVNIEZpcnN0IGhhbGYKLQkgKiAweGIwMDAwMDAwCTI1Nk0JUEVYIE1FTSBTZWNvbmQgaGFsZgotCSAqIDB4YzAwMDAwMDAJMjU2TQlSYXBpZCBJTyBNRU0gRmlyc3QgaGFsZgotCSAqIDB4ZDAwMDAwMDAJMjU2TQlSYXBpZCBJTyBNRU0gU2Vjb25kIGhhbGYKKwkgKiBUTEIgMzoJMjU2TQlOb24tY2FjaGVhYmxlLCBndWFyZGVkCiAJICovCiAJLmxvbmcgVExCMV9NQVMwKDEsIDMsIDApCi0JLmxvbmcgVExCMV9NQVMxKDEsIDEsIDAsIDAsIEJPT0tFX1BBR0VTWl8xRykKLQkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19QRVhfTUVNX0JBU0UpLCAwLDAsMCwwLDEsMCwxLDApCi0JLmxvbmcgVExCMV9NQVMzKEU1MDBfVExCX1JQTihDRkdfUEVYX01FTV9CQVNFKSwgMCwwLDAsMCwwLDEsMCwxLDAsMSkKLQotCS8qCi0JICogVExCIDQ6CVJlc2VydmVkIGZvciBmdXR1cmUgdXNhZ2UKLQkgKi8KLQorCS5sb25nIFRMQjFfTUFTMSgxLCAxLCAwLCAwLCBCT09LRV9QQUdFU1pfMjU2TSkKKwkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19SSU9fTUVNX1BIWVMgKyAweDEwMDAwMDAwKSwKKwkJCTAsMCwwLDAsMSwwLDEsMCkKKwkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19SSU9fTUVNX1BIWVMgKyAweDEwMDAwMDAwKSwKKwkJCTAsMCwwLDAsMCwxLDAsMSwwLDEpCisjZW5kaWYKIAkvKgogCSAqIFRMQiA1Ogk2NE0JTm9uLWNhY2hlYWJsZSwgZ3VhcmRlZAogCSAqIDB4ZTAwMF8wMDAwCTFNCUNDU1JCQVIKLQkgKiAweGUyMDBfMDAwMAk4TQlQQ0kxIElPCi0JICogMHhlMjgwXzAwMDAJOE0JUENJMiBJTwotCSAqIDB4ZTMwMF8wMDAwCTE2TQlQRVggSU8KKwkgKiAweGUyMDBfMDAwMAkxTQlQQ0kxIElPCisJICogMHhlMjEwXzAwMDAJMU0JUENJMiBJTworCSAqIDB4ZTMwMF8wMDAwCTFNCVBDSWUgSU8KIAkgKi8KIAkubG9uZyBUTEIxX01BUzAoMSwgNSwgMCkKIAkubG9uZyBUTEIxX01BUzEoMSwgMSwgMCwgMCwgQk9PS0VfUEFHRVNaXzY0TSkKQEAgLTE4NywxNyArMTg2LDE4IEBACiAJICovCiAJLmxvbmcgVExCMV9NQVMwKDEsIDYsIDApCiAJLmxvbmcgVExCMV9NQVMxKDEsIDEsIDAsIDAsIEJPT0tFX1BBR0VTWl82NE0pCi0JLmxvbmcgVExCMV9NQVMyKEU1MDBfVExCX0VQTihDRkdfTEJDX1NEUkFNX0JBU0UpLCAwLDAsMCwwLDAsMCwwLDApCi0JLmxvbmcgVExCMV9NQVMzKEU1MDBfVExCX1JQTihDRkdfTEJDX1NEUkFNX0JBU0UpLCAwLDAsMCwwLDAsMSwwLDEsMCwxKQorCS5sb25nIFRMQjFfTUFTMihFNTAwX1RMQl9FUE4oQ0ZHX0xCQ19DQUNIRV9CQVNFKSwgMCwwLDAsMCwwLDAsMCwwKQorCS5sb25nIFRMQjFfTUFTMyhFNTAwX1RMQl9SUE4oQ0ZHX0xCQ19DQUNIRV9CQVNFKSwgMCwwLDAsMCwwLDEsMCwxLDAsMSkKIAogCS8qCi0JICogVExCIDc6CTFNCU5vbi1jYWNoZWFibGUsIGd1YXJkZWQKLQkgKiAweGY4MDAwMDAwCTFNCUNBRE1VUyByZWdpc3RlcnMKKwkgKiBUTEIgNzoJNjRNCU5vbi1jYWNoZWFibGUsIGd1YXJkZWQKKwkgKiAweGY4MDAwMDAwCTY0TQlDQURNVVMgcmVnaXN0ZXJzLCByZWxvY2F0ZWQgTDJTUkFNCiAJICovCiAJLmxvbmcgVExCMV9NQVMwKDEsIDcsIDApCi0JLmxvbmcgVExCMV9NQVMxKDEsIDEsIDAsIDAsIEJPT0tFX1BBR0VTWl8xTSkKLQkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENBRE1VU19CQVNFX0FERFIpLCAwLDAsMCwwLDEsMCwxLDApCi0JLmxvbmcgVExCMV9NQVMzKEU1MDBfVExCX1JQTihDQURNVVNfQkFTRV9BRERSKSwgMCwwLDAsMCwwLDEsMCwxLDAsMSkKKwkubG9uZyBUTEIxX01BUzEoMSwgMSwgMCwgMCwgQk9PS0VfUEFHRVNaXzY0TSkKKwkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19MQkNfTk9OQ0FDSEVfQkFTRSksIDAsMCwwLDAsMSwwLDEsMCkKKwkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19MQkNfTk9OQ0FDSEVfQkFTRSksIDAsMCwwLDAsMCwxLDAsMSwwLDEpCisKIDI6CiAJZW50cnlfZW5kCiAKQEAgLTIwNSwxNCArMjA1LDEzIEBACiAgKiBMQVcoTG9jYWwgQWNjZXNzIFdpbmRvdykgY29uZmlndXJhdGlvbjoKICAqCiAgKiAweDAwMDBfMDAwMCAgICAgMHg3ZmZmX2ZmZmYgICAgIEREUiAgICAgICAgICAgICAgICAgICAgIDJHCi0gKiAweDgwMDBfMDAwMCAgICAgMHg4ZmZmX2ZmZmYgICAgIFBDSTEgTUVNICAgICAgICAgICAgICAgIDI1Nk0KLSAqIDB4OTAwMF8wMDAwICAgICAweDlmZmZfZmZmZiAgICAgUENJMiBNRU0gICAgICAgICAgICAgICAgMjU2TQotICogMHhhMDAwXzAwMDAgICAgIDB4YmZmZl9mZmZmICAgICBQRVggTUVNICAgICAgICAgICAgICAgICA1MTJNCisgKiAweDgwMDBfMDAwMCAgICAgMHg5ZmZmX2ZmZmYgICAgIFBDSTEgTUVNICAgICAgICAgICAgICAgIDUxMk0KKyAqIDB4YTAwMF8wMDAwICAgICAweGJmZmZfZmZmZiAgICAgUENJZSBNRU0gICAgICAgICAgICAgICAgNTEyTQogICogMHhjMDAwXzAwMDAgICAgIDB4ZGZmZl9mZmZmICAgICBSYXBpZElPICAgICAgICAgICAgICAgICA1MTJNCiAgKiAweGUwMDBfMDAwMCAgICAgMHhlMDAwX2ZmZmYgICAgIENDU1IgICAgICAgICAgICAgICAgICAgIDFNCi0gKiAweGUyMDBfMDAwMCAgICAgMHhlMjdmX2ZmZmYgICAgIFBDSTEgSU8gICAgICAgICAgICAgICAgIDhNCi0gKiAweGUyODBfMDAwMCAgICAgMHhlMmZmX2ZmZmYgICAgIFBDSTIgSU8gICAgICAgICAgICAgICAgIDhNCi0gKiAweGUzMDBfMDAwMCAgICAgMHhlM2ZmX2ZmZmYgICAgIFBFWCBJTyAgICAgICAgICAgICAgICAgIDE2TQorICogMHhlMjAwXzAwMDAgICAgIDB4ZTEwZl9mZmZmICAgICBQQ0kxIElPICAgICAgICAgICAgICAgICAxTQorICogMHhlMjgwXzAwMDAgICAgIDB4ZTIwZl9mZmZmICAgICBQQ0kyIElPICAgICAgICAgICAgICAgICAxTQorICogMHhlMzAwXzAwMDAgICAgIDB4ZTMwZl9mZmZmICAgICBQQ0llIElPICAgICAgICAgICAgICAgICAxTQogICogMHhmMDAwXzAwMDAgICAgIDB4ZjNmZl9mZmZmICAgICBTRFJBTSAgICAgICAgICAgICAgICAgICA2NE0KICAqIDB4ZjgwMF8wMDAwICAgICAweGY4MGZfZmZmZiAgICAgTlZSQU0vQ0FETVVTICgqKSAgICAgICAgMU0KICAqIDB4ZmYwMF8wMDAwICAgICAweGZmN2ZfZmZmZiAgICAgRkxBU0ggKDJuZCBiYW5rKSAgICAgICAgOE0KQEAgLTIyMiw0NyArMjIxLDUwIEBACiAgKiAgICBDQ1NSQkFSIGFuZCBMMi1hcy1TUkFNIGRvbid0IG5lZWQgYSBjb25maWd1cmVkIExvY2FsIEFjY2VzcyBXaW5kb3cuCiAgKiAgICBJZiBmbGFzaCBpcyA4TSBhdCBkZWZhdWx0IHBvc2l0aW9uIChsYXN0IDhNKSwgbm8gTEFXIG5lZWRlZC4KICAqCi0gKiBUaGUgZGVmaW5lcyBiZWxvdyBhcmUgMS1vZmYgb2YgdGhlIGFjdHVhbCBMQVdBUjAgdXNhZ2UuCi0gKiBTbyBMQVdBUjMgZGVmaW5lIHVzZXMgdGhlIExBV0FSNCByZWdpc3RlciBpbiB0aGUgRUNNLgorICogTEFXIDAgaXMgcmVzZXJ2ZWQgZm9yIGJvb3QgbWFwcGluZwogICovCiAKLSNkZWZpbmUgTEFXQkFSMCAwCi0jZGVmaW5lIExBV0FSMCAgKChMQVdBUl9UUkdUX0lGX0REUiB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8xMjhNKSkgJiB+TEFXQVJfRU4pCi0KLSNkZWZpbmUgTEFXQkFSMSAoKENGR19QQ0kxX01FTV9CQVNFPj4xMikgJiAweGZmZmZmKQotI2RlZmluZSBMQVdBUjEgCShMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfUENJMSB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8yNTZNKSkKLQotI2RlZmluZSBMQVdCQVIyICgoQ0ZHX1BDSTJfTUVNX0JBU0U+PjEyKSAmIDB4ZmZmZmYpCi0jZGVmaW5lIExBV0FSMiAJKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9QQ0kyIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzI1Nk0pKQotCi0jZGVmaW5lIExBV0JBUjMgKChDRkdfUENJMV9JT19QSFlTPj4xMikgJiAweGZmZmZmKQotI2RlZmluZSBMQVdBUjMgCShMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfUENJMSB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV84TSkpCi0KLSNkZWZpbmUgTEFXQkFSNCAoKENGR19QQ0kyX0lPX1BIWVM+PjEyKSAmIDB4ZmZmZmYpCi0jZGVmaW5lIExBV0FSNCAJKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9QQ0kyIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzhNKSkKLQotLyogTEJDIHdpbmRvdyAtIG1hcHMgMjU2TSAweGYwMDAwMDAwIC0+IDB4ZmZmZmZmZmYgKi8KLSNkZWZpbmUgTEFXQkFSNSAoKENGR19MQkNfU0RSQU1fQkFTRT4+MTIpICYgMHhmZmZmZikKLSNkZWZpbmUgTEFXQVI1IAkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX0xCQyB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8yNTZNKSkKLQotI2RlZmluZSBMQVdCQVI2ICgoQ0ZHX1BFWF9NRU1fQkFTRT4+MTIpICYgMHhmZmZmZikKLSNkZWZpbmUgTEFXQVI2IAkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX1BFWCB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV81MTJNKSkKLQotI2RlZmluZSBMQVdCQVI3ICgoQ0ZHX1BFWF9JT19QSFlTPj4xMikgJiAweGZmZmZmKQotI2RlZmluZSBMQVdBUjcgCShMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfUEVYIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzE2TSkpCi0KLSNkZWZpbmUgTEFXQkFSOCAoKENGR19SSU9fTUVNX0JBU0U+PjEyKSAmIDB4ZmZmZmYpCi0jZGVmaW5lIExBV0FSOCAgKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9SSU8gfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfNTEyTSkpCi0KIAkuc2VjdGlvbiAuYm9vdHBnLCAiYXgiCiAJLmdsb2JsCWxhd19lbnRyeQotCiBsYXdfZW50cnk6CiAJZW50cnlfc3RhcnQKKwogCS5sb25nICg0Zi0zZikvOAogMzoKLQkubG9uZyBMQVdCQVIwLExBV0FSMCxMQVdCQVIxLExBV0FSMSxMQVdCQVIyLExBV0FSMixMQVdCQVIzLExBV0FSMwotCS5sb25nIExBV0JBUjQsTEFXQVI0LExBV0JBUjUsTEFXQVI1LExBV0JBUjYsTEFXQVI2LExBV0JBUjcsTEFXQVI3Ci0JLmxvbmcgTEFXQkFSOCxMQVdBUjgKKwkubG9uZyAgMAorCS5sb25nICAoTEFXQVJfVFJHVF9ERFIgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMTI4TSkpICYgfkxBV0FSX0VOCisKKyNpZmRlZiBDRkdfUENJMV9NRU1fUEhZUworCS5sb25nCShDRkdfUENJMV9NRU1fUEhZUz4+MTIpICYgMHhmZmZmZgorCS5sb25nCUxBV0FSX0VOIHwgTEFXQVJfVFJHVF9QQ0kxIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzUxMk0pCisKKwkubG9uZwkoQ0ZHX1BDSTFfSU9fUEhZUz4+MTIpICYgMHhmZmZmZgorCS5sb25nCUxBV0FSX0VOIHwgTEFXQVJfVFJHVF9QQ0kxIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzFNKQorI2VuZGlmCisKKyNpZmRlZiBDRkdfUENJMl9NRU1fUEhZUworCS5sb25nCShDRkdfUENJMl9NRU1fUEhZUz4+MTIpICYgMHhmZmZmZgorCS5sb25nCUxBV0FSX0VOIHwgTEFXQVJfVFJHVF9QQ0kyIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzUxMk0pCisKKwkubG9uZwkoQ0ZHX1BDSTJfSU9fUEhZUz4+MTIpICYgMHhmZmZmZgorCS5sb25nCUxBV0FSX0VOIHwgTEFXQVJfVFJHVF9QQ0kyIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzFNKQorI2VuZGlmCisKKyNpZmRlZiBDRkdfUENJRTFfTUVNX1BIWVMKKwkubG9uZwkoQ0ZHX1BDSUUxX01FTV9QSFlTPj4xMikgJiAweGZmZmZmCisJLmxvbmcJTEFXQVJfRU4gfCBMQVdBUl9UUkdUX1BDSUUgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfNTEyTSkKKworCS5sb25nCShDRkdfUENJRTFfSU9fUEhZUz4+MTIpICYgMHhmZmZmZgorCS5sb25nCUxBV0FSX0VOIHwgTEFXQVJfVFJHVF9QQ0lFIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzFNKQorI2VuZGlmCisKKwkvKiBMQkMgd2luZG93IC0gbWFwcyAyNTZNIDB4ZjAwMDAwMDAgLT4gMHhmZmZmZmZmZiAqLworCS5sb25nCShDRkdfTEJDX0NBQ0hFX0JBU0U+PjEyKSAmIDB4ZmZmZmYKKwkubG9uZwlMQVdBUl9FTiB8IExBV0FSX1RSR1RfTEJDIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzI1Nk0pCisKKyNpZmRlZiBDRkdfUklPX01FTV9QSFlTCisJLmxvbmcJKENGR19SSU9fTUVNX1BIWVM+PjEyKSAmIDB4ZmZmZmYKKwkubG9uZwlMQVdBUl9FTiB8IExBV0FSX1RSR1RfUklPIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzUxMk0pCisjZW5kaWYKIDQ6CiAJZW50cnlfZW5kCmRpZmYgLS1naXQgYS9ib2FyZC9jZHMvbXBjODU0OGNkcy9tcGM4NTQ4Y2RzLmMgYi9ib2FyZC9jZHMvbXBjODU0OGNkcy9tcGM4NTQ4Y2RzLmMKaW5kZXggYjcyMzY0MS4uNDg3NTNkNyAxMDA2NDQKLS0tIGEvYm9hcmQvY2RzL21wYzg1NDhjZHMvbXBjODU0OGNkcy5jCisrKyBiL2JvYXJkL2Nkcy9tcGM4NTQ4Y2RzL21wYzg1NDhjZHMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqIENvcHlyaWdodCAyMDA0LCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgogICoKICAqIChDKSBDb3B5cmlnaHQgMjAwMiBTY290dCBNY051dHQgPHNtY251dHRAYXJ0ZXN5bmNwLmNvbT4KICAqCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8cGNpLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF84NXh4Lmg+CisjaW5jbHVkZSA8YXNtL2ltbWFwX2ZzbF9wY2kuaD4KICNpbmNsdWRlIDxzcGQuaD4KICNpbmNsdWRlIDxtaWlwaHkuaD4KIApAQCAtMzMsMTAgKzM0LDE1IEBACiAjaW5jbHVkZSAiLi4vY29tbW9uL2VlcHJvbS5oIgogI2luY2x1ZGUgIi4uL2NvbW1vbi92aWEuaCIKIAorI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkKKyNpbmNsdWRlIDxmdF9idWlsZC5oPgorI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfRERSX0VDQykgJiYgIWRlZmluZWQoQ09ORklHX0VDQ19JTklUX1ZJQV9ERFJDT05UUk9MTEVSKQogZXh0ZXJuIHZvaWQgZGRyX2VuYWJsZV9lY2ModW5zaWduZWQgaW50IGRyYW1fc2l6ZSk7CiAjZW5kaWYKIAorREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKIGV4dGVybiBsb25nIGludCBzcGRfc2RyYW0odm9pZCk7CiAKIHZvaWQgbG9jYWxfYnVzX2luaXQodm9pZCk7CkBAIC01NiwxMyArNjIsNiBAQAogCS8qIFBDSSBzbG90IGluIFVTRVIgYml0cyBDU1JbNjo3XSBieSBjb252ZW50aW9uLiAqLwogCXVpbnQgcGNpX3Nsb3QgPSBnZXRfcGNpX3Nsb3QgKCk7CiAKLQl1aW50IHBjaV9kdWFsID0gZ2V0X3BjaV9kdWFsICgpOwkvKiBQQ0kgRFVBTCBpbiBDTV9QQ0lbM10gKi8KLQl1aW50IHBjaTFfMzIgPSBndXItPnBvcmRldnNyICYgMHgxMDAwMDsJLyogUE9SREVWU1JbMTVdICovCi0JdWludCBwY2kxX2Nsa19zZWwgPSBndXItPnBvcnBsbHNyICYgMHg4MDAwOwkvKiBQT1JQTExTUlsxNl0gKi8KLQl1aW50IHBjaTJfY2xrX3NlbCA9IGd1ci0+cG9ycGxsc3IgJiAweDQwMDA7CS8qIFBPUlBMTFNSWzE3XSAqLwotCi0JdWludCBwY2kxX3NwZWVkID0gZ2V0X2Nsb2NrX2ZyZXEgKCk7CS8qIFBDSSBQU1BFRUQgaW4gWzQ6NV0gKi8KLQogCXVpbnQgY3B1X2JvYXJkX3JldiA9IGdldF9jcHVfYm9hcmRfcmV2aXNpb24gKCk7CiAKIAlwcmludGYgKCJCb2FyZDogQ0RTIFZlcnNpb24gMHglMDJ4LCBQQ0kgU2xvdCAlZFxuIiwKQEAgLTcxLDIwICs3MCw2IEBACiAJcHJpbnRmICgiQ1BVIEJvYXJkIFJldmlzaW9uICVkLiVkICgweCUwNHgpXG4iLAogCQlNUEM4NVhYX0NQVV9CT0FSRF9NQUpPUiAoY3B1X2JvYXJkX3JldiksCiAJCU1QQzg1WFhfQ1BVX0JPQVJEX01JTk9SIChjcHVfYm9hcmRfcmV2KSwgY3B1X2JvYXJkX3Jldik7Ci0KLQlwcmludGYgKCIgICAgUENJMTogJWQgYml0LCAlcyBNSHosICVzXG4iLAotCQkocGNpMV8zMikgPyAzMiA6IDY0LAotCQkocGNpMV9zcGVlZCA9PSAzMzAwMDAwMCkgPyAiMzMiIDoKLQkJKHBjaTFfc3BlZWQgPT0gNjYwMDAwMDApID8gIjY2IiA6ICJ1bmtub3duIiwKLQkJcGNpMV9jbGtfc2VsID8gInN5bmMiIDogImFzeW5jIik7Ci0KLQlpZiAocGNpX2R1YWwpIHsKLQkJcHJpbnRmICgiICAgIFBDSTI6IDMyIGJpdCwgNjYgTUh6LCAlc1xuIiwKLQkJCXBjaTJfY2xrX3NlbCA/ICJzeW5jIiA6ICJhc3luYyIpOwotCX0gZWxzZSB7Ci0JCXByaW50ZiAoIiAgICBQQ0kyOiBkaXNhYmxlZFxuIik7Ci0JfQotCiAJLyoKIAkgKiBJbml0aWFsaXplIGxvY2FsIGJ1cy4KIAkgKi8KQEAgLTEwMiw2ICs4Nyw4IEBACiAJICovCiAJZ3VyLT50c2VjMzRpb292Y3IgPSAweGU3ZTA7CS8qICAxMTEwIDAxMTEgMTExMCAweHh4ICovCiAKKwllY20tPmVlZHIgPSAweGZmZmZmZmZmOwkJLyogY2xlYXIgZWNtIGVycm9ycyAqLworCWVjbS0+ZWVlciA9IDB4ZmZmZmZmZmY7CQkvKiBlbmFibGUgZWNtIGVycm9ycyAqLwogCXJldHVybiAwOwogfQogCkBAIC0xNzYsNiArMTYzLDkgQEAKIAlsYmMtPmxjcnIgfD0gMHgwMDAzMDAwMDsKIAogCWFzbSgic3luYztpc3luYzttc3luYyIpOworCisJbGJjLT5sdGVzciA9IDB4ZmZmZmZmZmY7CS8qIENsZWFyIExCQyBlcnJvciBpbnRlcnJ1cHRzICovCisJbGJjLT5sdGVpciA9IDB4ZmZmZmZmZmY7CS8qIEVuYWJsZSBMQkMgZXJyb3IgaW50ZXJydXB0cyAqLwogfQogCiAvKgpAQCAtMzAxLDcgKzI5MSw3IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpIHx8IGRlZmluZWQoQ09ORklHX1BDSTEpCiAvKiBGb3Igc29tZSByZWFzb24gdGhlIFR1bmRyYSBQQ0kgYnJpZGdlIHNob3dzIHVwIG9uIGl0c2VsZiBhcyBhCiAgKiBkaWZmZXJlbnQgZGV2aWNlLiAgV29yayBhcm91bmQgdGhhdCBieSByZWZ1c2luZyB0byBjb25maWd1cmUgaXQuCiAgKi8KQEAgLTMwOSwzMiArMjk5LDE4OSBAQAogCiBzdGF0aWMgc3RydWN0IHBjaV9jb25maWdfdGFibGUgcGNpX21wYzg1eHhjZHNfY29uZmlnX3RhYmxlW10gPSB7CiAJezB4MTBlMywgMHgwNTEzLCBQQ0lfQU5ZX0lELCAxLCAzLCBQQ0lfQU5ZX0lELCBkdW1teV9mdW5jLCB7MCwwLDB9fSwKLQl7MHgxMTA2LCAweDA2ODYsIFBDSV9BTllfSUQsIDEsIDIsIDAsIG1wYzg1eHhfY29uZmlnX3ZpYSwgezAsMCwwfX0sCi0JezB4MTEwNiwgMHgwNTcxLCBQQ0lfQU5ZX0lELCAxLCAyLCAxLAorCXsweDExMDYsIDB4MDY4NiwgUENJX0FOWV9JRCwgMSwgVklBX0lELCAwLCBtcGM4NXh4X2NvbmZpZ192aWEsIHswLDAsMH19LAorCXsweDExMDYsIDB4MDU3MSwgUENJX0FOWV9JRCwgMSwgVklBX0lELCAxLAogCQltcGM4NXh4X2NvbmZpZ192aWFfdXNiaWRlLCB7MCwwLDB9fSwKLQl7MHgxMTA1LCAweDMwMzgsIFBDSV9BTllfSUQsIDEsIDIsIDIsIG1wYzg1eHhfY29uZmlnX3ZpYV91c2IsIHswLDAsMH19LAotCXsweDExMDYsIDB4MzAzOCwgUENJX0FOWV9JRCwgMSwgMiwgMywgbXBjODV4eF9jb25maWdfdmlhX3VzYjIsIHswLDAsMH19LAotCXsweDExMDYsIDB4MzA1OCwgUENJX0FOWV9JRCwgMSwgMiwgNSwKKwl7MHgxMTA1LCAweDMwMzgsIFBDSV9BTllfSUQsIDEsIFZJQV9JRCwgMiwKKwkJbXBjODV4eF9jb25maWdfdmlhX3VzYiwgezAsMCwwfX0sCisJezB4MTEwNiwgMHgzMDM4LCBQQ0lfQU5ZX0lELCAxLCBWSUFfSUQsIDMsCisJCW1wYzg1eHhfY29uZmlnX3ZpYV91c2IyLCB7MCwwLDB9fSwKKwl7MHgxMTA2LCAweDMwNTgsIFBDSV9BTllfSUQsIDEsIFZJQV9JRCwgNSwKIAkJbXBjODV4eF9jb25maWdfdmlhX3Bvd2VyLCB7MCwwLDB9fSwKLQl7MHgxMTA2LCAweDMwNjgsIFBDSV9BTllfSUQsIDEsIDIsIDYsIG1wYzg1eHhfY29uZmlnX3ZpYV9hYzk3LCB7MCwwLDB9fSwKKwl7MHgxMTA2LCAweDMwNjgsIFBDSV9BTllfSUQsIDEsIFZJQV9JRCwgNiwKKwkJbXBjODV4eF9jb25maWdfdmlhX2FjOTcsIHswLDAsMH19LAogCXt9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBob3NlW10gPSB7Ci0JeyBjb25maWdfdGFibGU6IHBjaV9tcGM4NXh4Y2RzX2NvbmZpZ190YWJsZSx9LAotI2lmZGVmIENPTkZJR19NUEM4NVhYX1BDSTIKLQl7fSwKLSNlbmRpZgotfTsKLQorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwY2kxX2hvc2UgPSB7CisJY29uZmlnX3RhYmxlOiBwY2lfbXBjODV4eGNkc19jb25maWdfdGFibGV9OwogI2VuZGlmCS8qIENPTkZJR19QQ0kgKi8KIAorI2lmZGVmIENPTkZJR19QQ0kyCitzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIHBjaTJfaG9zZTsKKyNlbmRpZgkvKiBDT05GSUdfUENJMiAqLworCisjaWZkZWYgQ09ORklHX1BDSUUxCitzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIHBjaWUxX2hvc2U7CisjZW5kaWYJLyogQ09ORklHX1BDSUUxICovCisKK2ludCBmaXJzdF9mcmVlX2J1c25vPTA7CisKIHZvaWQKIHBjaV9pbml0X2JvYXJkKHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX1BDSQotCXBjaV9tcGM4NXh4X2luaXQoJmhvc2UpOworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKwl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAmaW1tYXAtPmltX2d1cjsKKwl1aW50IGlvX3NlbCA9IChndXItPnBvcmRldnNyICYgTVBDODV4eF9QT1JERVZTUl9JT19TRUwpID4+IDE5OworCXVpbnQgaG9zdF9hZ2VudCA9IChndXItPnBvcmJtc3IgJiBNUEM4NXh4X1BPUkJNU1JfSEEpID4+IDE2OworCisKKyNpZmRlZiBDT05GSUdfUENJMQoreworCXZvbGF0aWxlIGNjc3JfZnNsX3BjaV90ICpwY2kgPSAoY2Nzcl9mc2xfcGNpX3QgKikgQ0ZHX1BDSTFfQUREUjsKKwlleHRlcm4gdm9pZCBmc2xfcGNpX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKTsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSAmcGNpMV9ob3NlOworCXN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICp0YWJsZTsKKworCXVpbnQgcGNpXzMyID0gZ3VyLT5wb3JkZXZzciAmIE1QQzg1eHhfUE9SREVWU1JfUENJMV9QQ0kzMjsJLyogUE9SREVWU1JbMTVdICovCisJdWludCBwY2lfYXJiID0gZ3VyLT5wb3JkZXZzciAmIE1QQzg1eHhfUE9SREVWU1JfUENJMV9BUkI7CS8qIFBPUkRFVlNSWzE0XSAqLworCXVpbnQgcGNpX2Nsa19zZWwgPSBndXItPnBvcnBsbHNyICYgTVBDODV4eF9QT1JERVZTUl9QQ0kxX1NQRDsJLyogUE9SUExMU1JbMTZdICovCisKKwl1aW50IHBjaV9hZ2VudCA9IChob3N0X2FnZW50ID09IDMpIHx8IChob3N0X2FnZW50ID09IDQgKSB8fCAoaG9zdF9hZ2VudCA9PSA2KTsKKworCXVpbnQgcGNpX3NwZWVkID0gZ2V0X2Nsb2NrX2ZyZXEgKCk7CS8qIFBDSSBQU1BFRUQgaW4gWzQ6NV0gKi8KKworCWlmICghKGd1ci0+ZGV2ZGlzciAmIE1QQzg1eHhfREVWRElTUl9QQ0kxKSkgeworCQlwcmludGYgKCIgICAgUENJOiAlZCBiaXQsICVzIE1IeiwgJXMsICVzLCAlc1xuIiwKKwkJCShwY2lfMzIpID8gMzIgOiA2NCwKKwkJCShwY2lfc3BlZWQgPT0gMzMzMzMwMDApID8gIjMzIiA6CisJCQkocGNpX3NwZWVkID09IDY2NjY2MDAwKSA/ICI2NiIgOiAidW5rbm93biIsCisJCQlwY2lfY2xrX3NlbCA/ICJzeW5jIiA6ICJhc3luYyIsCisJCQlwY2lfYWdlbnQgPyAiYWdlbnQiIDogImhvc3QiLAorCQkJcGNpX2FyYiA/ICJhcmJpdGVyIiA6ICJleHRlcm5hbC1hcmJpdGVyIgorCQkJKTsKKworCisJCS8qIG91dGJvdW5kIG1lbW9yeSAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJCSAgICAgICBDRkdfUENJMV9NRU1fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJMV9NRU1fUEhZUywKKwkJCSAgICAgICBDRkdfUENJMV9NRU1fU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisKKwkJLyogb3V0Ym91bmQgaW8gKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCisJCQkgICAgICAgQ0ZHX1BDSTFfSU9fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJMV9JT19QSFlTLAorCQkJICAgICAgIENGR19QQ0kxX0lPX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisJCWhvc2UtPnJlZ2lvbl9jb3VudCA9IDI7CisKKwkJLyogcmVsb2NhdGUgY29uZmlnIHRhYmxlIHBvaW50ZXJzICovCisJCWhvc2UtPmNvbmZpZ190YWJsZSA9IFwKKwkJCShzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSAqKSgodWludClob3NlLT5jb25maWdfdGFibGUgKyBnZC0+cmVsb2Nfb2ZmKTsKKwkJZm9yICh0YWJsZSA9IGhvc2UtPmNvbmZpZ190YWJsZTsgdGFibGUgJiYgdGFibGUtPnZlbmRvcjsgdGFibGUrKykKKwkJCXRhYmxlLT5jb25maWdfZGV2aWNlICs9IGdkLT5yZWxvY19vZmY7CisKKwkJaG9zZS0+Zmlyc3RfYnVzbm89Zmlyc3RfZnJlZV9idXNubzsKKwkJcGNpX3NldHVwX2luZGlyZWN0KGhvc2UsIChpbnQpICZwY2ktPmNmZ19hZGRyLCAoaW50KSAmcGNpLT5jZmdfZGF0YSk7CisKKwkJZnNsX3BjaV9pbml0KGhvc2UpOworCQlmaXJzdF9mcmVlX2J1c25vPWhvc2UtPmxhc3RfYnVzbm8rMTsKKwkJcHJpbnRmICgiUENJIG9uIGJ1cyAlMDJ4IC0gJTAyeFxuIixob3NlLT5maXJzdF9idXNubyxob3NlLT5sYXN0X2J1c25vKTsKKyNpZmRlZiBDT05GSUdfUENJWF9DSEVDSworCQlpZiAoIShndXItPnBvcmRldnNyICYgUE9SREVWU1JfUENJKSkgeworCQkJLyogUENJLVggaW5pdCAqLworCQkJaWYgKENPTkZJR19TWVNfQ0xLX0ZSRVEgPCA2NjAwMDAwMCkKKwkJCQlwcmludGYoIlBDSS1YIHdpbGwgb25seSB3b3JrIGF0IDY2IE1IelxuIik7CisKKwkJCXJlZzE2ID0gUENJX1hfQ01EX01BWF9TUExJVCB8IFBDSV9YX0NNRF9NQVhfUkVBRAorCQkJCXwgUENJX1hfQ01EX0VSTyB8IFBDSV9YX0NNRF9EUEVSUl9FOworCQkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgYnVzLCBQQ0lYX0NPTU1BTkQsIHJlZzE2KTsKKwkJfQogI2VuZGlmCisJfSBlbHNlIHsKKwkJcHJpbnRmICgiICAgIFBDSTogZGlzYWJsZWRcbiIpOworCX0KK30KKyNlbHNlCisJZ3VyLT5kZXZkaXNyIHw9IE1QQzg1eHhfREVWRElTUl9QQ0kxOyAvKiBkaXNhYmxlICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0kyCit7CisJdWludCBwY2kyX2Nsa19zZWwgPSBndXItPnBvcnBsbHNyICYgMHg0MDAwOwkvKiBQT1JQTExTUlsxN10gKi8KKwl1aW50IHBjaV9kdWFsID0gZ2V0X3BjaV9kdWFsICgpOwkvKiBQQ0kgRFVBTCBpbiBDTV9QQ0lbM10gKi8KKwlpZiAocGNpX2R1YWwpIHsKKwkJcHJpbnRmICgiICAgIFBDSTI6IDMyIGJpdCwgNjYgTUh6LCAlc1xuIiwKKwkJCXBjaTJfY2xrX3NlbCA/ICJzeW5jIiA6ICJhc3luYyIpOworCX0gZWxzZSB7CisJCXByaW50ZiAoIiAgICBQQ0kyOiBkaXNhYmxlZFxuIik7CisJfQorfQorI2Vsc2UKKwlndXItPmRldmRpc3IgfD0gTVBDODV4eF9ERVZESVNSX1BDSTI7IC8qIGRpc2FibGUgKi8KKyNlbmRpZiAvKiBDT05GSUdfUENJMiAqLworCisjaWZkZWYgQ09ORklHX1BDSUUxCit7CisJdm9sYXRpbGUgY2Nzcl9mc2xfcGNpX3QgKnBjaSA9IChjY3NyX2ZzbF9wY2lfdCAqKSBDRkdfUENJRTFfQUREUjsKKwlleHRlcm4gdm9pZCBmc2xfcGNpX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKTsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSAmcGNpZTFfaG9zZTsKKwlpbnQgcGNpZV9lcCA9ICAoaG9zdF9hZ2VudCA9PSAwKSB8fCAoaG9zdF9hZ2VudCA9PSAyICkgfHwgKGhvc3RfYWdlbnQgPT0gMyk7CisKKwlpbnQgcGNpZV9jb25maWd1cmVkICA9IGlvX3NlbCA+PSAxOworCisJaWYgKHBjaWVfY29uZmlndXJlZCAmJiAhKGd1ci0+ZGV2ZGlzciAmIE1QQzg1eHhfREVWRElTUl9QQ0lFKSl7CisJCXByaW50ZiAoIlxuICAgIFBDSUUgY29ubmVjdGVkIHRvIHNsb3QgYXMgJXMgKGJhc2UgYWRkcmVzcyAleCkiLAorCQkJcGNpZV9lcCA/ICJFbmQgUG9pbnQiIDogIlJvb3QgQ29tcGxleCIsCisJCQkodWludClwY2kpOworCisJCWlmIChwY2ktPnBtZV9tc2dfZGV0KSB7CisJCQlwY2ktPnBtZV9tc2dfZGV0ID0gMHhmZmZmZmZmZjsKKwkJCWRlYnVnICgiIHdpdGggZXJyb3JzLiAgQ2xlYXJpbmcuICBOb3cgMHglMDh4IixwY2ktPnBtZV9tc2dfZGV0KTsKKwkJfQorCQlwcmludGYgKCJcbiIpOworCisJCS8qIGluYm91bmQgKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDAsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfQlVTLAorCQkJICAgICAgIENGR19QQ0lfTUVNT1JZX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSB8IFBDSV9SRUdJT05fTUVNT1JZKTsKKworCQkvKiBvdXRib3VuZCBtZW1vcnkgKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCisJCQkgICAgICAgQ0ZHX1BDSUUxX01FTV9CQVNFLAorCQkJICAgICAgIENGR19QQ0lFMV9NRU1fUEhZUywKKwkJCSAgICAgICBDRkdfUENJRTFfTUVNX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9NRU0pOworCisJCS8qIG91dGJvdW5kIGlvICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAyLAorCQkJICAgICAgIENGR19QQ0lFMV9JT19CQVNFLAorCQkJICAgICAgIENGR19QQ0lFMV9JT19QSFlTLAorCQkJICAgICAgIENGR19QQ0lFMV9JT19TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCisJCWhvc2UtPnJlZ2lvbl9jb3VudCA9IDM7CisKKwkJaG9zZS0+Zmlyc3RfYnVzbm89Zmlyc3RfZnJlZV9idXNubzsKKwkJcGNpX3NldHVwX2luZGlyZWN0KGhvc2UsIChpbnQpICZwY2ktPmNmZ19hZGRyLCAoaW50KSAmcGNpLT5jZmdfZGF0YSk7CisKKwkJZnNsX3BjaV9pbml0KGhvc2UpOworCQlwcmludGYgKCJQQ0lFIG9uIGJ1cyAlZCAtICVkXG4iLGhvc2UtPmZpcnN0X2J1c25vLGhvc2UtPmxhc3RfYnVzbm8pOworCisJCWZpcnN0X2ZyZWVfYnVzbm89aG9zZS0+bGFzdF9idXNubysxOworCisJfSBlbHNlIHsKKwkJcHJpbnRmICgiICAgIFBDSUU6IGRpc2FibGVkXG4iKTsKKwl9CisgfQorI2Vsc2UKKwlndXItPmRldmRpc3IgfD0gTVBDODV4eF9ERVZESVNSX1BDSUU7IC8qIGRpc2FibGUgKi8KKyNlbmRpZgorCiB9CiAKIGludCBsYXN0X3N0YWdlX2luaXQodm9pZCkKQEAgLTM2NywzICs1MTQsMzIgQEAKIAogCXJldHVybiAwOwogfQorCisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpICYmIGRlZmluZWQoQ09ORklHX09GX0JPQVJEX1NFVFVQKQordm9pZAorZnRfcGNpX3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKQoreworCXUzMiAqcDsKKwlpbnQgbGVuOworCisKKyNpZmRlZiBDT05GSUdfUENJMQorCXAgPSAodTMyICopZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL3BjaUA4MDAwL2J1cy1yYW5nZSIsICZsZW4pOworCWlmIChwICE9IE5VTEwpIHsKKwkJcFswXSA9IDA7CisJCXBbMV0gPSBwY2kxX2hvc2UubGFzdF9idXNubyAtIHBjaTFfaG9zZS5maXJzdF9idXNubzsKKwkJZGVidWcoIlBDSUA4MDAwIGZpcnN0X2J1c25vPSVkIGxhc3RfYnVzbm89JWRcbiIscFswXSxwWzFdKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0lFMQorCXAgPSAodTMyICopZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL3BjaUBhMDAwL2J1cy1yYW5nZSIsICZsZW4pOworCWlmIChwICE9IE5VTEwpIHsKKwkJcFswXSA9IDA7CisJCXBbMV0gPSBwY2llMV9ob3NlLmxhc3RfYnVzbm8gLSBwY2llMV9ob3NlLmZpcnN0X2J1c25vOworCQlkZWJ1ZygiUENJQGEwMDAgZmlyc3RfYnVzbm89JWQgbGFzdF9idXNubz0lZFxuIixwWzBdLHBbMV0pOworCX0KKyNlbmRpZgorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9jZHMvbXBjODU0OGNkcy91LWJvb3QubGRzIGIvYm9hcmQvY2RzL21wYzg1NDhjZHMvdS1ib290LmxkcwppbmRleCBjMWYzNDk1Li41MzBiYTVhIDEwMDY0NAotLS0gYS9ib2FyZC9jZHMvbXBjODU0OGNkcy91LWJvb3QubGRzCisrKyBiL2JvYXJkL2Nkcy9tcGM4NTQ4Y2RzL3UtYm9vdC5sZHMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisgKiBDb3B5cmlnaHQgMjAwNCwgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KICAqCiAgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogICogcHJvamVjdC4KQEAgLTcxLDcgKzcxLDYgQEAKICAgICBjcHUvbXBjODV4eC9jcHUubyAoLnRleHQpCiAgICAgZHJpdmVycy90c2VjLm8gKC50ZXh0KQogICAgIGNwdS9tcGM4NXh4L3NwZWVkLm8gKC50ZXh0KQotICAgIGNwdS9tcGM4NXh4L3BjaS5vICgudGV4dCkKICAgICBjb21tb24vZGxtYWxsb2MubyAoLnRleHQpCiAgICAgbGliX2dlbmVyaWMvY3JjMzIubyAoLnRleHQpCiAgICAgbGliX3BwYy9leHRhYmxlLm8gKC50ZXh0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvY2RzL21wYzg1NTVjZHMvbXBjODU1NWNkcy5jIGIvYm9hcmQvY2RzL21wYzg1NTVjZHMvbXBjODU1NWNkcy5jCmluZGV4IDcwNGJmMDMuLjhmMTY0MjEgMTAwNjQ0Ci0tLSBhL2JvYXJkL2Nkcy9tcGM4NTU1Y2RzL21wYzg1NTVjZHMuYworKysgYi9ib2FyZC9jZHMvbXBjODU1NWNkcy9tcGM4NTU1Y2RzLmMKQEAgLTQ3MywxNCArNDczLDE3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSBwY2lfbXBjODV4eGNkc19jb25maWdfdGFibGVbXSA9IHsKIAl7MHgxMGUzLCAweDA1MTMsIFBDSV9BTllfSUQsIDEsIDMsIFBDSV9BTllfSUQsIGR1bW15X2Z1bmMsIHswLDAsMH19LAotCXsweDExMDYsIDB4MDY4NiwgUENJX0FOWV9JRCwgMSwgMiwgMCwgbXBjODV4eF9jb25maWdfdmlhLCB7MCwwLDB9fSwKLQl7MHgxMTA2LCAweDA1NzEsIFBDSV9BTllfSUQsIDEsIDIsIDEsCisJezB4MTEwNiwgMHgwNjg2LCBQQ0lfQU5ZX0lELCAxLCBWSUFfSUQsIDAsIG1wYzg1eHhfY29uZmlnX3ZpYSwgezAsMCwwfX0sCisJezB4MTEwNiwgMHgwNTcxLCBQQ0lfQU5ZX0lELCAxLCBWSUFfSUQsIDEsCiAJCW1wYzg1eHhfY29uZmlnX3ZpYV91c2JpZGUsIHswLDAsMH19LAotCXsweDExMDUsIDB4MzAzOCwgUENJX0FOWV9JRCwgMSwgMiwgMiwgbXBjODV4eF9jb25maWdfdmlhX3VzYiwgezAsMCwwfX0sCi0JezB4MTEwNiwgMHgzMDM4LCBQQ0lfQU5ZX0lELCAxLCAyLCAzLCBtcGM4NXh4X2NvbmZpZ192aWFfdXNiMiwgezAsMCwwfX0sCi0JezB4MTEwNiwgMHgzMDU4LCBQQ0lfQU5ZX0lELCAxLCAyLCA1LAorCXsweDExMDUsIDB4MzAzOCwgUENJX0FOWV9JRCwgMSwgVklBX0lELCAyLAorCQltcGM4NXh4X2NvbmZpZ192aWFfdXNiLCB7MCwwLDB9fSwKKwl7MHgxMTA2LCAweDMwMzgsIFBDSV9BTllfSUQsIDEsIFZJQV9JRCwgMywKKwkJbXBjODV4eF9jb25maWdfdmlhX3VzYjIsIHswLDAsMH19LAorCXsweDExMDYsIDB4MzA1OCwgUENJX0FOWV9JRCwgMSwgVklBX0lELCA1LAogCQltcGM4NXh4X2NvbmZpZ192aWFfcG93ZXIsIHswLDAsMH19LAotCXsweDExMDYsIDB4MzA2OCwgUENJX0FOWV9JRCwgMSwgMiwgNiwgbXBjODV4eF9jb25maWdfdmlhX2FjOTcsIHswLDAsMH19LAorCXsweDExMDYsIDB4MzA2OCwgUENJX0FOWV9JRCwgMSwgVklBX0lELCA2LAorCQltcGM4NXh4X2NvbmZpZ192aWFfYWM5NywgezAsMCwwfX0sCiAJe30sCiB9OwogCmRpZmYgLS1naXQgYS9ib2FyZC9jbTFfcXAxL01ha2VmaWxlIGIvYm9hcmQvY20xX3FwMS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTczOTMyNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9jbTFfcXAxL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotIwotIyAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNwotIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotIwotIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotIyBwcm9qZWN0LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0jIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0jIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0jIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotIyBNQSAwMjExMS0xMzA3IFVTQQotIwotCi1pbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKLQotTElCCT0gJChvYmopbGliJChCT0FSRCkuYQotCi1DT0JKUwk6PSAkKEJPQVJEKS5vIGNtZF9jbTFfcXAxLm8gZnd1cGRhdGUubwotCi1TUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCi1PQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKLVNPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKLQotJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKLQkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKLQotY2xlYW46Ci0Jcm0gLWYgJChTT0JKUykgJChPQkpTKQotCi1kaXN0Y2xlYW46CWNsZWFuCi0Jcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgLmRlcGVuZAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAotaW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCi0KLXNpbmNsdWRlICQob2JqKS5kZXBlbmQKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYm9hcmQvY20xX3FwMS9jbTFfcXAxLmMgYi9ib2FyZC9jbTFfcXAxL2NtMV9xcDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5Mjk4Zi4uMDAwMDAwMAotLS0gYS9ib2FyZC9jbTFfcXAxL2NtMV9xcDEuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDcKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogKEMpIENvcHlyaWdodCAyMDA0Ci0gKiBNYXJrIEpvbmFzLCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgbWFyay5qb25hc0Btb3Rvcm9sYS5jb20uCi0gKgotICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDUKLSAqIE1hcnRpbiBLcmF1c2UsIFRRLVN5c3RlbXMgR21iSCwgbWFydGluLmtyYXVzZUB0cXMuZGUKLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi0jaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaW5jbHVkZSA8bXBjNXh4eC5oPgotI2luY2x1ZGUgPHBjaS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxpMmMuaD4KLSNpZmRlZiBDT05GSUdfT0ZfRkxBVF9UUkVFCi0jaW5jbHVkZSA8ZnRfYnVpbGQuaD4KLSNlbmRpZiAvKiBDT05GSUdfT0ZfRkxBVF9UUkVFICovCi0KLSNpbmNsdWRlICJmd3VwZGF0ZS5oIgotCi0jaWZuZGVmIENGR19SQU1CT09UCi0vKgotICogSGVscGVyIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgU0RSQU0gY29udHJvbGxlci4KLSAqLwotc3RhdGljIHZvaWQgc2RyYW1fc3RhcnQoaW50IGhpX2FkZHIpCi17Ci0JbG9uZyBoaV9hZGRyX2JpdCA9IGhpX2FkZHIgPyAweDAxMDAwMDAwIDogMDsKLQotCS8qIHVubG9jayBtb2RlIHJlZ2lzdGVyICovCi0JKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DVFJMID0gU0RSQU1fQ09OVFJPTCB8IDB4ODAwMDAwMDAgfAotCQkJCQkJaGlfYWRkcl9iaXQ7Ci0KLQkvKiBwcmVjaGFyZ2UgYWxsIGJhbmtzICovCi0JKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DVFJMID0gU0RSQU1fQ09OVFJPTCB8IDB4ODAwMDAwMDIgfAotCQkJCQkJaGlfYWRkcl9iaXQ7Ci0KLQkvKiBhdXRvIHJlZnJlc2ggKi8KLQkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NUUkwgPSBTRFJBTV9DT05UUk9MIHwgMHg4MDAwMDAwNCB8Ci0JCQkJCQloaV9hZGRyX2JpdDsKLQotCS8qIGF1dG8gcmVmcmVzaCwgc2Vjb25kIHRpbWUgKi8KLQkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NUUkwgPSBTRFJBTV9DT05UUk9MIHwgMHg4MDAwMDAwNCB8Ci0JCQkJCQloaV9hZGRyX2JpdDsKLQotCS8qIHNldCBtb2RlIHJlZ2lzdGVyICovCi0JKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9NT0RFID0gU0RSQU1fTU9ERTsKLQotCS8qIG5vcm1hbCBvcGVyYXRpb24gKi8KLQkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NUUkwgPSBTRFJBTV9DT05UUk9MIHwgaGlfYWRkcl9iaXQ7Ci19Ci0jZW5kaWYgLyogQ0ZHX1JBTUJPT1QgKi8KLQotLyoKLSAqIEluaXRhbGl6ZSBTRFJBTSAtIGNvbmZpZ3VyZSBTRFJBTSBjb250cm9sbGVyLCBkZXRlY3QgbWVtb3J5IHNpemUuCi0gKi8KLWxvbmcgaW50IGluaXRkcmFtKGludCBib2FyZF90eXBlKQotewotCXVsb25nIGRyYW1zaXplID0gMDsKLSNpZm5kZWYgQ0ZHX1JBTUJPT1QKLQl1bG9uZyB0ZXN0MSwgdGVzdDI7Ci0KLQkvKiBjb25maWd1cmUgU0RSQU0gc3RhcnQvZW5kIGZvciBkZXRlY3Rpb24gKi8KLQkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NTMENGRyA9IDB4MDAwMDAwMWU7IC8qIDJHIGF0IDB4MCAqLwotCi0JLyogc2V0dXAgY29uZmlnIHJlZ2lzdGVycyAqLwotCSoodnVfbG9uZyAqKU1QQzVYWFhfU0RSQU1fQ09ORklHMSA9IFNEUkFNX0NPTkZJRzE7Ci0JKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DT05GSUcyID0gU0RSQU1fQ09ORklHMjsKLQotCXNkcmFtX3N0YXJ0KDApOwotCXRlc3QxID0gZ2V0X3JhbV9zaXplKChsb25nICopQ0ZHX1NEUkFNX0JBU0UsIDB4ODAwMDAwMDApOwotCXNkcmFtX3N0YXJ0KDEpOwotCXRlc3QyID0gZ2V0X3JhbV9zaXplKChsb25nICopQ0ZHX1NEUkFNX0JBU0UsIDB4ODAwMDAwMDApOwotCWlmICh0ZXN0MSA+IHRlc3QyKSB7Ci0JCXNkcmFtX3N0YXJ0KDApOwotCQlkcmFtc2l6ZSA9IHRlc3QxOwotCX0gZWxzZQotCQlkcmFtc2l6ZSA9IHRlc3QyOwotCi0JLyogbWVtb3J5IHNtYWxsZXIgdGhhbiAxTUIgaXMgaW1wb3NzaWJsZSAqLwotCWlmIChkcmFtc2l6ZSA8ICgxIDw8IDIwKSkKLQkJZHJhbXNpemUgPSAwOwotCi0JLyogc2V0IFNEUkFNIENTMCBzaXplIGFjY29yZGluZyB0byB0aGUgYW1vdW50IG9mIFJBTSBmb3VuZCAqLwotCWlmIChkcmFtc2l6ZSA+IDApIHsKLQkJKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DUzBDRkcgPSAweDEzICsKLQkJCV9fYnVpbHRpbl9mZnMoZHJhbXNpemUgPj4gMjApIC0gMTsKLQl9IGVsc2UKLQkJKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DUzBDRkcgPSAwOyAvKiBkaXNhYmxlZCAqLwotI2Vsc2UgLyogQ0ZHX1JBTUJPT1QgKi8KLQkvKiByZXRyaWV2ZSBzaXplIG9mIG1lbW9yeSBjb25uZWN0ZWQgdG8gU0RSQU0gQ1MwICovCi0JZHJhbXNpemUgPSAqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NTMENGRyAmIDB4RkY7Ci0JaWYgKGRyYW1zaXplID49IDB4MTMpCi0JCWRyYW1zaXplID0gKDEgPDwgKGRyYW1zaXplIC0gMHgxMykpIDw8IDIwOwotCWVsc2UKLQkJZHJhbXNpemUgPSAwOwotI2VuZGlmIC8qIENGR19SQU1CT09UICovCi0KLQkvKgotCSAqIE9uIE1QQzUyMDBCIHdlIG5lZWQgdG8gc2V0IHRoZSBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gZGVsYXkgaW4gdGhlCi0JICogRERSIGNvbnRyb2xsZXIuICBSZWZlciB0byBjaGFwdGVyIDguNy41IFNEZWxheS0tTUJBUiArIDB4MDE5MCBvZgotCSAqIHRoZSBNUEM1MjAwQiBVc2VyJ3MgTWFudWFsLgotCSAqLwotCSoodnVfbG9uZyAqKU1QQzVYWFhfU0RSQU1fU0RFTEFZID0gMHgwNDsKLQlfX2FzbV9fIHZvbGF0aWxlICgic3luYyIpOwotCi0JcmV0dXJuIGRyYW1zaXplOwotfQotCi0KLWludCBjaGVja2JvYXJkKHZvaWQpCi17Ci0JcHV0cygiQm9hcmQ6IENNMS5RUDFcbiIpOwotCXJldHVybiAwOwotfQotCi0KLWludCBib2FyZF9lYXJseV9pbml0X3Iodm9pZCkKLXsKLQkvKgotCSAqIE5vdywgd2hlbiB3ZSBhcmUgaW4gUkFNLCBlbmFibGUgZmxhc2ggd3JpdGUgYWNjZXNzIGZvciBkZXRlY3Rpb24KLQkgKiBwcm9jZXNzLiBOb3RlIHRoYXQgQ1NfQk9PVCBjYW5ub3QgYmUgY2xlYXJlZCB3aGVuIGV4ZWN1dGluZyBpbgotCSAqIGZsYXNoLgotCSAqLwotCSoodnVfbG9uZyAqKU1QQzVYWFhfQk9PVENTX0NGRyAmPSB+MHgxOyAvKiBjbGVhciBSTyAqLwotCXJldHVybiAwOwotfQotCi0KLSNpZmRlZiBDT05GSUdfUE9TVAotaW50IHBvc3RfaG90a2V5c19wcmVzc2VkKHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BPU1QgKi8KLQotCi0jaWYgZGVmaW5lZChDT05GSUdfUE9TVCkgfHwgZGVmaW5lZChDT05GSUdfTE9HQlVGRkVSKQotdm9pZCBwb3N0X3dvcmRfc3RvcmUodWxvbmcgYSkKLXsKLQl2dV9sb25nICpzYXZlX2FkZHIgPSAodnVfbG9uZyAqKShNUEM1WFhYX1NSQU0gKyBNUEM1WFhYX1NSQU1fUE9TVF9TSVpFKTsKLQkqc2F2ZV9hZGRyID0gYTsKLX0KLQotCi11bG9uZyBwb3N0X3dvcmRfbG9hZCh2b2lkKQotewotCXZ1X2xvbmcgKnNhdmVfYWRkciA9ICh2dV9sb25nICopKE1QQzVYWFhfU1JBTSArIE1QQzVYWFhfU1JBTV9QT1NUX1NJWkUpOwotCXJldHVybiAqc2F2ZV9hZGRyOwotfQotI2VuZGlmIC8qIENPTkZJR19QT1NUIHx8IENPTkZJR19MT0dCVUZGRVIgKi8KLQotCi0jaWZkZWYgQ09ORklHX01JU0NfSU5JVF9SCi1pbnQgbWlzY19pbml0X3Iodm9pZCkKLXsKLSNpZiBkZWZpbmVkKENPTkZJR19IQVJEX0kyQykgfHwgZGVmaW5lZChDT05GSUdfU09GVF9JMkMpCi0JdWNoYXIgYnVmWzZdOwotCWNoYXIgc3RyWzE4XTsKLQotCS8qIFJlYWQgZXRoYWRkciBmcm9tIEVFUFJPTSAqLwotCWlmIChpMmNfcmVhZChDRkdfSTJDX0VFUFJPTSwgQ09ORklHX01BQ19PRkZTRVQsIDIsIGJ1ZiwgNikgPT0gMCkgewotCQlzcHJpbnRmKHN0ciwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKLQkJCWJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSwgYnVmWzRdLCBidWZbNV0pOwotCQkvKiBDaGVjayBpZiBNQUMgYWRkciBpcyBvd25lZCBieSBTY2hpbmRsZXIgKi8KLQkJaWYgKHN0cnN0cihzdHIsICIwMDowNjpDMyIpICE9IHN0cikgewotCQkJcHJpbnRmKExPR19QUkVGSVggIldhcm5pbmcgLSBJbGxlZ2FsIE1BQyBhZGRyZXNzICglcykiCi0JCQkJIiBpbiBFRVBST00uXG4iLCBzdHIpOwotCQkJcHJpbnRmKExPR19QUkVGSVggIlVzaW5nIE1BQyBmcm9tIGVudmlyb25tZW50XG4iKTsKLQkJfSBlbHNlIHsKLQkJCXByaW50ZihMT0dfUFJFRklYICJVc2luZyBNQUMgKCVzKSBmcm9tIEkyQyBFRVBST01cbiIsCi0JCQkJc3RyKTsKLQkJCXNldGVudigiZXRoYWRkciIsIHN0cik7Ci0JCX0KLQl9IGVsc2UgewotCQlwcmludGYoTE9HX1BSRUZJWCAiV2FybmluZyAtIFVuYWJsZSB0byByZWFkIE1BQyBmcm9tIEkyQyIKLQkJCSIgZGV2aWNlIGF0IGFkZHJlc3MgJTAyWDolMDRYXG4iLCBDRkdfSTJDX0VFUFJPTSwKLQkJCUNPTkZJR19NQUNfT0ZGU0VUKTsKLQkJcHJpbnRmKExPR19QUkVGSVggIlVzaW5nIE1BQyBmcm9tIGVudmlyb25tZW50XG4iKTsKLQl9Ci0JcmV0dXJuIDA7Ci0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfSEFSRF9JMkMpIHx8IGRlZmluZWQoQ09ORklHX1NPRlRfSTJDKSAqLwotfQotI2VuZGlmIC8qIENPTkZJR19NSVNDX0lOSVRfUiAqLwotCi0KLSNpZmRlZiBDT05GSUdfTEFTVF9TVEFHRV9JTklUCi1pbnQgbGFzdF9zdGFnZV9pbml0KHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFCi0JY20xX2Z3dXBkYXRlKCk7Ci0jZW5kaWYgLyogQ09ORklHX1VTQl9TVE9SQUdFICovCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX0xBU1RfU1RBR0VfSU5JVCAqLwotCi0KLSNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpICYmIGRlZmluZWQoQ09ORklHX09GX0JPQVJEX1NFVFVQKQotdm9pZCBmdF9ib2FyZF9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCkKLXsKLQlmdF9jcHVfc2V0dXAoYmxvYiwgYmQpOwotfQotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkgJiYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApICovCmRpZmYgLS1naXQgYS9ib2FyZC9jbTFfcXAxL2NtZF9jbTFfcXAxLmMgYi9ib2FyZC9jbTFfcXAxL2NtZF9jbTFfcXAxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMDFkMmEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvY20xX3FwMS9jbWRfY20xX3FwMS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLS8qCi0gKiAgKEMpIENvcHlyaWdodCAyMDA3IE1hcmt1cyBLYXBwZWxlciA8bWFya3VzLmthcHBlbGVyQG9iamVjdHhwLmNvbT4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi0jaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaW5jbHVkZSA8Y29tbWFuZC5oPgotI2luY2x1ZGUgPGkyYy5oPgotI2luY2x1ZGUgPHVzYi5oPgotCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQotCi1pbnQgZG9faTJjKGNoYXIgKmFyZ3ZbXSkKLXsKLQl1bnNpZ25lZCBjaGFyIHRlbXAsIHRlbXAxOwotCi0JcHJpbnRmKCJTdGFydGluZyBJMkMgVGVzdFxuIgotCQkiUGxlYXNlIHNldCBKdW1wZXI6XG5JMkMgU0RBIDItM1xuSTJDIFNDTCAyLTNcblxuIgotCQkiUGxlYXNlIHByZXNzIGFueSBrZXkgdG8gc3RhcnRcblxuIik7Ci0JZ2V0YygpOwotCi0JdGVtcCA9IDB4ZjA7IC8qIHNldCBpbyAwLTQgYXMgb3V0cHV0ICovCi0JaTJjX3dyaXRlKENGR19JMkNfSU8sIDMsIDEsICh1Y2hhciAqKSZ0ZW1wLCAxKTsKLQotCXByaW50ZigiUHJlc3MgSTJDNC03LiBMRUQgSTJDMC0zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHN0YXRlXG5cbiIKLQkJIlByZXNzIGFueSBrZXkgdG8gc3RvcFxuXG4iKTsKLQotCXdoaWxlICghdHN0YygpKSB7Ci0JCWkyY19yZWFkKENGR19JMkNfSU8sIDAsIDEsICh1Y2hhciAqKSZ0ZW1wLCAxKTsKLQkJdGVtcDEgPSAodGVtcCA+PiA0KSAmIDB4MDM7Ci0JCXRlbXAxIHw9ICh0ZW1wID4+IDMpICYgMHgwODsgLyogUzMwMiAtPiBMRUQzMDMgKi8KLQkJdGVtcDEgfD0gKHRlbXAgPj4gNSkgJiAweDA0OyAvKiBTMzAzIC0+IExFRDMwMiAqLwotCQl0ZW1wID0gdGVtcDE7Ci0JCWkyY193cml0ZShDRkdfSTJDX0lPLCAxLCAxLCAodWNoYXIgKikmdGVtcCwgMSk7Ci0JfQotCWdldGMoKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgZG9fdXNidGVzdChjaGFyICphcmd2W10pCi17Ci0JaW50IGk7Ci0Jc3RhdGljIGludCB1c2Jfc3Rvcl9jdXJyX2RldiA9IC0xOyAvKiBjdXJyZW50IGRldmljZSAqLwotCi0JcHJpbnRmKCJTdGFydGluZyBVU0IgVGVzdFxuIgotCQkiUGxlYXNlIGluc2VydCBVU0IgTWVtbW9yeSBTdGlja1xuXG4iCi0JCSJQbGVhc2UgcHJlc3MgYW55IGtleSB0byBzdGFydFxuXG4iKTsKLQlnZXRjKCk7Ci0KLQl1c2Jfc3RvcCgpOwotCXByaW50ZigiKFJlKXN0YXJ0IFVTQi4uLlxuIik7Ci0JaSA9IHVzYl9pbml0KCk7Ci0jaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFCi0JCS8qIHRyeSB0byByZWNvZ25pemUgc3RvcmFnZSBkZXZpY2VzIGltbWVkaWF0ZWx5ICovCi0JCWlmIChpID49IDApCi0JCQl1c2Jfc3Rvcl9jdXJyX2RldiA9IHVzYl9zdG9yX3NjYW4oMSk7Ci0jZW5kaWYgLyogQ09ORklHX1VTQl9TVE9SQUdFICovCi0JaWYgKHVzYl9zdG9yX2N1cnJfZGV2ID49IDApCi0JCXByaW50ZigiRm91bmQgVVNCIFN0b3JhZ2UgRGV2IGNvbnRpbnVlIHdpdGggVGVzdC4uLlxuIik7Ci0JZWxzZSB7Ci0JCXByaW50ZigiTm8gVVNCIFN0b3JhZ2UgRGV2aWNlIGRldGVjdGVkLi4gU3RvcCBUZXN0XG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JdXNiX3N0b3JfaW5mbygpOwotCi0JcHJpbnRmKCJzdG9wcGluZyBVU0IuLlxuIik7Ci0JdXNiX3N0b3AoKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgZG9fbGVkKGNoYXIgKmFyZ3ZbXSkKLXsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IG1wYzV4eHhfZ3B0XzBfNyAqZ3B0ID0gKHN0cnVjdCBtcGM1eHh4X2dwdF8wXzcgKilNUEM1WFhYX0dQVDsKLQotCXByaW50ZigiU3RhcnRpbmcgTEVEIFRlc3RcbiIKLQkJIlBsZWFzZSBzZXQgU3dpdGNoIFM1MDAgYWxsIG9mZlxuXG4iCi0JCSJQbGVhc2UgcHJlc3MgYW55IGtleSB0byBzdGFydFxuXG4iKTsKLQlnZXRjKCk7Ci0KLQkvKiBjb25maWd1cmUgdGltZXIgMi0zIGZvciBzaW1wbGUgR1BJTyBvdXRwdXQgSGlnaCAqLwotCWdwdC0+Z3B0Mi5lbXNyIHw9IDB4MDAwMDAwMzQ7Ci0JZ3B0LT5ncHQzLmVtc3IgfD0gMHgwMDAwMDAzNDsKLQotCSgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fRU5BQkxFKSB8PSAweDgwMDAwMDAwOwotCSgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fRElSKSB8PSAweDgwMDAwMDAwOwotCXByaW50ZigiUGxlYXNlIHByZXNzIGFueSBrZXkgdG8gc3RvcFxuXG4iKTsKLQl3aGlsZSAoIXRzdGMoKSkgewotCQlpZiAoaSA9PSAxKSB7Ci0JCQkoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfTykgfD0gMHg4MDAwMDAwMDsKLQkJCWdwdC0+Z3B0Mi5lbXNyICY9IH4weDAwMDAwMDEwOwotCQkJZ3B0LT5ncHQzLmVtc3IgJj0gfjB4MDAwMDAwMTA7Ci0JCX0gZWxzZSBpZiAoaSA9PSAyKSB7Ci0JCQkoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfTykgJj0gfjB4ODAwMDAwMDA7Ci0JCQlncHQtPmdwdDIuZW1zciAmPSB+MHgwMDAwMDAxMDsKLQkJCWdwdC0+Z3B0My5lbXNyIHw9IDB4MDAwMDAwMTA7Ci0JCX0gZWxzZSBpZiAoaSA+PSAzKSB7Ci0JCQkoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfTykgJj0gfjB4ODAwMDAwMDA7Ci0JCQlncHQtPmdwdDMuZW1zciAmPSB+MHgwMDAwMDAxMDsKLQkJCWdwdC0+Z3B0Mi5lbXNyIHw9IDB4MDAwMDAwMTA7Ci0JCQlpID0gMDsKLQkJfQotCQlpKys7Ci0JCXVkZWxheSgyMDAwMDApOwotCX0KLQlnZXRjKCk7Ci0KLQkoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfTykgfD0gMHg4MDAwMDAwMDsKLQlncHQtPmdwdDIuZW1zciB8PSAweDAwMDAwMDEwOwotCWdwdC0+Z3B0My5lbXNyIHw9IDB4MDAwMDAwMTA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGRvX3JzMjMyKGNoYXIgKmFyZ3ZbXSkKLXsKLQlpbnQgZXJyb3Jfc3RhdHVzID0gMDsKLQlzdHJ1Y3QgbXBjNXh4eF9ncGlvICpncGlvID0gKHN0cnVjdCBtcGM1eHh4X2dwaW8gKilNUEM1WFhYX0dQSU87Ci0Jc3RydWN0IG1wYzV4eHhfcHNjICpwc2MxID0gKHN0cnVjdCBtcGM1eHh4X3BzYyAqKU1QQzVYWFhfUFNDMTsKLQotCS8qIENvbmZpZ3VyZSBQU0MgMi0zLTYgYXMgR1BJTyAqLwotCWdwaW8tPnBvcnRfY29uZmlnICY9IDB4RkYwRkY4MEY7Ci0KLQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDEwKSkgewotCWNhc2UgMToKLQkJLyogY2hlY2sgUlRTIDwtPiBDVFMgbG9vcCAqLwotCQkvKiBzZXQgcnRzIHRvIDAgKi8KLQkJcHJpbnRmKCJVYXJ0IDEgdGVzdDogUlggVFggdGVzdGVkIGJ5IHVzaW5nIFUtQm9vdFxuIgotCQkJIlBsZWFzZSBjb25uZWN0IFJUUyB3aXRoIENUUyBvbiBVYXJ0MSBwbHVnXG5cbiIKLQkJCSJQcmVzcyBhbnkga2V5IHRvIHN0YXJ0XG5cbiIpOwotCQlnZXRjKCk7Ci0KLQkJcHNjMS0+b3AxIHw9IDB4MDE7Ci0KLQkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCi0JCXVkZWxheSgxMCk7Ci0KLQkJLyogY2hlY2sgc3RhdHVzIGF0IGN0cyAqLwotCQlpZiAoKHBzYzEtPmlwICYgMHgwMSkgIT0gMCkgewotCQkJZXJyb3Jfc3RhdHVzID0gMzsKLQkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfMSwgY3RzIHN0YXR1cyBpcyAlZCAiCi0JCQkJIihzaG91bGQgYmUgMClcbiIsCi0JCQkJX19GVU5DVElPTl9fLCAocHNjMS0+aXAgJiAweDAxKSk7Ci0JCX0KLQotCQkvKiBzZXQgcnRzIHRvIDEgKi8KLQkJcHNjMS0+b3AwIHw9IDB4MDE7Ci0KLQkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCi0JCXVkZWxheSgxMCk7Ci0KLQkJLyogY2hlY2sgc3RhdHVzIGF0IGN0cyAqLwotCQlpZiAoKHBzYzEtPmlwICYgMHgwMSkgIT0gMSkgewotCQkJZXJyb3Jfc3RhdHVzID0gMzsKLQkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfMSwgY3RzIHN0YXR1cyBpcyAlZCAiCi0JCQkJIihzaG91bGQgYmUgMSlcbiIsCi0JCQkJX19GVU5DVElPTl9fLCAocHNjMS0+aXAgJiAweDAxKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkvKiBzZXQgUFNDMl8wLCBQU0MyXzIgYXMgb3V0cHV0IGFuZCBQU0MyXzEsIFBTQzJfMyBhcyBpbnB1dCAqLwotCQlwcmludGYoIlVhcnQgMiB0ZXN0OiBQbGVhc2UgdXNlIFJTMjMyIExvb3BiYWNrIHBsdWcgb24gVUFSVDJcbiIKLQkJCSJcblByZXNzIGFueSBrZXkgdG8gc3RhcnRcblxuIik7Ci0JCWdldGMoKTsKLQotCQlncGlvLT5zaW1wbGVfZ3Bpb2UgJj0gfigweDAwMDAwMEYwKTsKLQkJZ3Bpby0+c2ltcGxlX2dwaW9lIHw9IDB4MDAwMDAwRjA7Ci0JCWdwaW8tPnNpbXBsZV9kZHIgJj0gfigweDAwMDAwMEYwKTsKLQkJZ3Bpby0+c2ltcGxlX2RkciB8PSAweDAwMDAwMDUwOwotCi0JCS8qIGNoZWNrIFRYRCA8LT4gUlhEIGxvb3AgKi8KLQkJLyogc2V0IFRYRCB0byAxICovCi0JCWdwaW8tPnNpbXBsZV9kdm8gfD0gKDEgPDwgNCk7Ci0KLQkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCi0JCXVkZWxheSgxMCk7Ci0KLQkJaWYgKChncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAwMjApICE9IDB4MDAwMDAwMjApIHsKLQkJCWVycm9yX3N0YXR1cyA9IDI7Ci0JCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzIsIHJ4ZCBzdGF0dXMgaXMgJWQgIgotCQkJCSIoc2hvdWxkIGJlIDEpXG4iLCBfX0ZVTkNUSU9OX18sCi0JCQkJKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDAyMCkgPj4gNSk7Ci0JCX0KLQotCQkvKiBzZXQgVFhEIHRvIDAgKi8KLQkJZ3Bpby0+c2ltcGxlX2R2byAmPSB+KDEgPDwgNCk7Ci0KLQkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCi0JCXVkZWxheSgxMCk7Ci0KLQkJaWYgKChncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAwMjApICE9IDB4MDAwMDAwMDApIHsKLQkJCWVycm9yX3N0YXR1cyA9IDI7Ci0JCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzIsIHJ4ZCBzdGF0dXMgaXMgJWQgIgotCQkJCSIoc2hvdWxkIGJlIDApXG4iLCBfX0ZVTkNUSU9OX18sCi0JCQkJKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDAyMCkgPj4gNSk7Ci0JCX0KLQotCQkvKiBjaGVjayBSVFMgPC0+IENUUyBsb29wICovCi0JCS8qIHNldCBSVFMgdG8gMSAqLwotCQlncGlvLT5zaW1wbGVfZHZvIHw9ICgxIDw8IDYpOwotCi0JCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLwotCQl1ZGVsYXkoMTApOwotCi0JCWlmICgoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwMDgwKSAhPSAweDAwMDAwMDgwKSB7Ci0JCQllcnJvcl9zdGF0dXMgPSAzOwotCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl8yLCBjdHMgc3RhdHVzIGlzICVkICIKLQkJCQkiKHNob3VsZCBiZSAxKVxuIiwgX19GVU5DVElPTl9fLAotCQkJCShncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAwODApID4+IDcpOwotCQl9Ci0KLQkJLyogc2V0IFJUUyB0byAwICovCi0JCWdwaW8tPnNpbXBsZV9kdm8gJj0gfigxIDw8IDYpOwotCi0JCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLwotCQl1ZGVsYXkoMTApOwotCi0JCWlmICgoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwMDgwKSAhPSAweDAwMDAwMDAwKSB7Ci0JCQllcnJvcl9zdGF0dXMgPSAzOwotCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl8yLCBjdHMgc3RhdHVzIGlzICVkICIKLQkJCQkiKHNob3VsZCBiZSAwKVxuIiwgX19GVU5DVElPTl9fLAotCQkJCShncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAwODApID4+IDcpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJLyogc2V0IFBTQzNfMCwgUFNDM18yIGFzIG91dHB1dCBhbmQgUFNDM18xLCBQU0MzXzMgYXMgaW5wdXQgKi8KLQkJcHJpbnRmKCJVYXJ0IDMgdGVzdDogUGxlYXNlIHVzZSBSUzIzMiBMb29wYmFjayBwbHVnIG9uIFVBUlQyXG4iCi0JCQkiXG5QcmVzcyBhbnkga2V5IHRvIHN0YXJ0XG5cbiIpOwotCQlnZXRjKCk7Ci0KLQkJZ3Bpby0+c2ltcGxlX2dwaW9lICY9IH4oMHgwMDAwMEYwMCk7Ci0JCWdwaW8tPnNpbXBsZV9ncGlvZSB8PSAweDAwMDAwRjAwOwotCi0JCWdwaW8tPnNpbXBsZV9kZHIgJj0gfigweDAwMDAwRjAwKTsKLQkJZ3Bpby0+c2ltcGxlX2RkciB8PSAweDAwMDAwNTAwOwotCi0JCS8qIGNoZWNrIFRYRCA8LT4gUlhEIGxvb3AgKi8KLQkJLyogc2V0IFRYRCB0byAxICovCi0JCWdwaW8tPnNpbXBsZV9kdm8gfD0gKDEgPDwgOCk7Ci0KLQkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCi0JCXVkZWxheSgxMCk7Ci0KLQkJaWYgKChncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAyMDApICE9IDB4MDAwMDAyMDApIHsKLQkJCWVycm9yX3N0YXR1cyA9IDI7Ci0JCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzMsIHJ4ZCBzdGF0dXMgaXMgJWQgIgotCQkJCSIoc2hvdWxkIGJlIDEpXG4iLCBfX0ZVTkNUSU9OX18sCi0JCQkJKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDIwMCkgPj4gOSk7Ci0JCX0KLQotCQkvKiBzZXQgVFhEIHRvIDAgKi8KLQkJZ3Bpby0+c2ltcGxlX2R2byAmPSB+KDEgPDwgOCk7Ci0KLQkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCi0JCXVkZWxheSgxMCk7Ci0KLQkJaWYgKChncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAyMDApICE9IDB4MDAwMDAwMDApIHsKLQkJCWVycm9yX3N0YXR1cyA9IDI7Ci0JCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzMsIHJ4ZCBzdGF0dXMgaXMgJWQgIgotCQkJCSIoc2hvdWxkIGJlIDApXG4iLCBfX0ZVTkNUSU9OX18sCi0JCQkJKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDIwMCkgPj4gOSk7Ci0JCX0KLQotCQkvKiBjaGVjayBSVFMgPC0+IENUUyBsb29wICovCi0JCS8qIHNldCBSVFMgdG8gMSAqLwotCQlncGlvLT5zaW1wbGVfZHZvIHw9ICgxIDw8IDEwKTsKLQotCQkvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVxdWVzdGluZyBzdGF0dXMgKi8KLQkJdWRlbGF5KDEwKTsKLQotCQlpZiAoKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDgwMCkgIT0gMHgwMDAwMDgwMCkgewotCQkJZXJyb3Jfc3RhdHVzID0gMzsKLQkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfMywgY3RzIHN0YXR1cyBpcyAlZCAiCi0JCQkJIihzaG91bGQgYmUgMSlcbiIsIF9fRlVOQ1RJT05fXywKLQkJCQkoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwODAwKSA+PiAxMSk7Ci0JCX0KLQotCQkvKiBzZXQgUlRTIHRvIDAgKi8KLQkJZ3Bpby0+c2ltcGxlX2R2byAmPSB+KDEgPDwgMTApOwotCi0JCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLwotCQl1ZGVsYXkoMTApOwotCi0JCWlmICgoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwODAwKSAhPSAweDAwMDAwMDAwKSB7Ci0JCQllcnJvcl9zdGF0dXMgPSAzOwotCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl8zLCBjdHMgc3RhdHVzIGlzICVkICIKLQkJCQkiKHNob3VsZCBiZSAwKVxuIiwgX19GVU5DVElPTl9fLAotCQkJCShncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDA4MDApID4+IDExKTsKLQkJfQotCQlicmVhazsKLQljYXNlIDQ6Ci0JCS8qIHNldCBQU0M2XzIsIFBTQzZfMyBhcyBvdXRwdXQgYW5kIFBTQzZfMCwgUFNDNl8xIGFzIGlucHV0ICovCi0JCXByaW50ZigiVWFydCA0IHRlc3Q6IFBsZWFzZSB1c2UgUlMyMzIgTG9vcGJhY2sgcGx1ZyBvbiBVQVJUMlxuIgotCQkJIlxuUHJlc3MgYW55IGtleSB0byBzdGFydFxuXG4iKTsKLQkJZ2V0YygpOwotCi0JCWdwaW8tPnNpbXBsZV9ncGlvZSAmPSB+KDB4RjAwMDAwMDApOwotCQlncGlvLT5zaW1wbGVfZ3Bpb2UgfD0gMHgzMDAwMDAwMDsKLQotCQlncGlvLT5zaW1wbGVfZGRyICY9IH4oMHhmMDAwMDAwMCk7Ci0JCWdwaW8tPnNpbXBsZV9kZHIgfD0gMHgzMDAwMDAwMDsKLQotCQkoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0VOQUJMRSkgfD0gMHgzMDAwMDAwMDsKLQkJKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19ESVIpICY9IH4oMHgzMDAwMDAwMCk7Ci0KLQkJLyogY2hlY2sgVFhEIDwtPiBSWEQgbG9vcCAqLwotCQkvKiBzZXQgVFhEIHRvIDEgKi8KLQkJZ3Bpby0+c2ltcGxlX2R2byB8PSAoMSA8PCAyOCk7Ci0KLQkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCi0JCXVkZWxheSgxMCk7Ci0KLQkJaWYgKCgoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfSSkgJiAweDEwMDAwMDAwKSAhPQotCQkJCTB4MTAwMDAwMDApIHsKLQkJCWVycm9yX3N0YXR1cyA9IDI7Ci0JCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzQsIHJ4ZCBzdGF0dXMgaXMgJWQgIgotCQkJCSIoc2hvdWxkIGJlIDEpXG4iLCBfX0ZVTkNUSU9OX18sCi0JCQkJKCgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fREFUQV9JKSAmCi0JCQkJCTB4MTAwMDAwMDApID4+IDI4KTsKLQkJfQotCi0JCS8qIHNldCBUWEQgdG8gMCAqLwotCQlncGlvLT5zaW1wbGVfZHZvICY9IH4oMSA8PCAyOCk7Ci0KLQkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCi0JCXVkZWxheSgxMCk7Ci0KLQkJaWYgKCgoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfSSkgJiAweDEwMDAwMDAwKSAhPQotCQkJCTB4MDAwMDAwMDApIHsKLQkJCWVycm9yX3N0YXR1cyA9IDI7Ci0JCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzQsIHJ4ZCBzdGF0dXMgaXMgJWQgIgotCQkJCSIoc2hvdWxkIGJlIDApXG4iLCBfX0ZVTkNUSU9OX18sCi0JCQkJKCgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fREFUQV9JKSAmCi0JCQkJCTB4MTAwMDAwMDApID4+IDI4KTsKLQkJfQotCi0JCS8qIGNoZWNrIFJUUyA8LT4gQ1RTIGxvb3AgKi8KLQkJLyogc2V0IFJUUyB0byAxICovCi0JCWdwaW8tPnNpbXBsZV9kdm8gfD0gKDEgPDwgMjkpOwotCi0JCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLwotCQl1ZGVsYXkoMTApOwotCi0JCWlmICgoKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19EQVRBX0kpICYgMHgyMDAwMDAwMCkgIT0KLQkJCQkweDIwMDAwMDAwKSB7Ci0JCQllcnJvcl9zdGF0dXMgPSAzOwotCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl80LCBjdHMgc3RhdHVzIGlzICVkICIKLQkJCQkiKHNob3VsZCBiZSAxKVxuIiwgX19GVU5DVElPTl9fLAotCQkJCSgoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfSSkgJgotCQkJCQkweDIwMDAwMDAwKSA+PiAyOSk7Ci0JCX0KLQotCQkvKiBzZXQgUlRTIHRvIDAgKi8KLQkJZ3Bpby0+c2ltcGxlX2R2byAmPSB+KDEgPDwgMjkpOwotCi0JCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLwotCQl1ZGVsYXkoMTApOwotCi0JCWlmICgoKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19EQVRBX0kpICYgMHgyMDAwMDAwMCkgIT0KLQkJCQkweDAwMDAwMDAwKSB7Ci0JCQllcnJvcl9zdGF0dXMgPSAzOwotCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl80LCBjdHMgc3RhdHVzIGlzICVkICIKLQkJCQkiKHNob3VsZCBiZSAwKVxuIiwgX19GVU5DVElPTl9fLAotCQkJCSgoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfSSkgJgotCQkJCQkweDIwMDAwMDAwKSA+PiAyOSk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRmKCIlczogaW52YWxpZCByczIzMiBudW1iZXIgJXNcbiIsIF9fRlVOQ1RJT05fXywgYXJndlsyXSk7Ci0JCWVycm9yX3N0YXR1cyA9IDE7Ci0JCWJyZWFrOwotCX0KLQlncGlvLT5wb3J0X2NvbmZpZyB8PSAoQ0ZHX0dQU19QT1JUX0NPTkZJRyAmIDB4RkYwRkY4MEYpOwotCi0JcmV0dXJuIGVycm9yX3N0YXR1czsKLX0KLQotaW50IGNtZF9ma3QoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0JaW50IHJjb2RlID0gLTE7Ci0KLQlzd2l0Y2ggKGFyZ2MpIHsKLQljYXNlIDI6Ci0JCWlmIChzdHJuY21wKGFyZ3ZbMV0sICJpMmMiLCAzKSA9PSAwKQotCQkJcmNvZGUgPSBkb19pMmMoYXJndik7Ci0JCWVsc2UgaWYgKHN0cm5jbXAoYXJndlsxXSwgImxlZCIsIDMpID09IDApCi0JCQlyY29kZSA9IGRvX2xlZChhcmd2KTsKLQkJZWxzZSBpZiAoc3RybmNtcChhcmd2WzFdLCAidXNiIiwgMykgPT0gMCkKLQkJCXJjb2RlID0gZG9fdXNidGVzdChhcmd2KTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlpZiAoc3RybmNtcChhcmd2WzFdLCAicnMyMzIiLCAzKSA9PSAwKQotCQkJcmNvZGUgPSBkb19yczIzMihhcmd2KTsKLQkJYnJlYWs7Ci0JfQotCi0Jc3dpdGNoIChyY29kZSkgewotCWNhc2UgLTE6Ci0JCXByaW50ZigiVXNhZ2U6XG4iCi0JCQkiZmt0IHsgaTJjIHwgbGVkIHwgdXNiIH1cbiIKLQkJCSJma3QgcnMyMzIgbnVtYmVyXG4iKTsKLQkJcmNvZGUgPSAxOwotCQlicmVhazsKLQljYXNlIDA6Ci0JCXByaW50ZigiVGVzdCBwYXNzZWRcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGYoIlRlc3QgZmFpbGVkIHdpdGggY29kZTogJWRcbiIsIHJjb2RlKTsKLQl9Ci0KLQlyZXR1cm4gcmNvZGU7Ci19Ci0KLVVfQk9PVF9DTUQoCi0JZmt0LAk0LAkxLAljbWRfZmt0LAotCSJma3QgICAgIC0gRnVuY3Rpb24gdGVzdCByb3V0aW5lc1xuIiwKLQkiaTJjXG4iCi0JIiAgICAgLSBUZXN0IEkyQyBjb21tdW5pY2F0aW9uXG4iCi0JImZrdCBsZWRcbiIKLQkiICAgICAtIFRlc3QgTEVEc1xuIgotCSJma3QgcnMyMzIgbnVtYmVyXG4iCi0JIiAgICAgLSBUZXN0IFJTMjMyIChsb29wYmFjayBwbHVnKHMpIGZvciBSUzIzMiByZXF1aXJlZClcbiIKLQkiZmt0IHVzYlxuIgotCSIgICAgIC0gVGVzdCBVU0IgY29tbXVuaWNhdGlvblxuIgotKTsKLSNlbmRpZiAvKiBDRkdfQ01EX0JTUCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvY20xX3FwMS9md3VwZGF0ZS5jIGIvYm9hcmQvY20xX3FwMS9md3VwZGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzczNzVlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2NtMV9xcDEvZnd1cGRhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDA3IFNjaGluZGxlciBMaWZ0IEluYy4KLSAqIChDKSBDb3B5cmlnaHQgMjAwNyBTZW1paGFsZgotICoKLSAqIEF1dGhvcjogTWljaGVsIE1hcnRpIDxtbWFAb2JqZWN0eHAuY29tPgotICogQWRhcHRlZCBmb3IgVS1Cb290IDEuMiBieSBQaW90ciBLcnVzenluc2tpIDxwcGtAc2VtaWhhbGYuY29tPjoKLSAqIC0gY29kZSBjbGVhbi11cAotICogLSBidWdmaXggZm9yIG92ZXJ3cml0aW5nIGJvb3RhcmdzIGJ5IHVzZXIKLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi0jaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaW5jbHVkZSA8Y29tbWFuZC5oPgotI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPGltYWdlLmg+Ci0jaW5jbHVkZSA8dXNiLmg+Ci0jaW5jbHVkZSA8ZmF0Lmg+Ci0KLSNpbmNsdWRlICJmd3VwZGF0ZS5oIgotCi1leHRlcm4gaW50IGRvX2Jvb3RtKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pOwotZXh0ZXJuIGxvbmcgZG9fZmF0X3JlYWQoY29uc3QgY2hhciAqLCB2b2lkICosIHVuc2lnbmVkIGxvbmcsIGludCk7Ci1leHRlcm4gaW50IGRvX2ZhdF9mc2xvYWQoY21kX3RibF90ICosIGludCwgaW50LCBjaGFyICpbXSk7Ci0KLXN0YXRpYyBpbnQgbG9hZF9yZXNjdWVfaW1hZ2UodWxvbmcpOwotCi12b2lkIGNtMV9md3VwZGF0ZSh2b2lkKQotewotCWNtZF90YmxfdCAqYmNtZDsKLQljaGFyICpyc2FyZ3M7Ci0JY2hhciAqdG1wID0gTlVMTDsKLQljaGFyIGthWzE2XTsKLQljaGFyICphcmd2WzNdID0geyAiYm9vdG0iLCBrYSwgTlVMTCB9OwotCi0JLyogQ2hlY2sgaWYgcmVzY3VlIHN5c3RlbSBpcyBkaXNhYmxlZC4uLiAqLwotCWlmIChnZXRlbnYoIm5vcmVzY3VlIikpIHsKLQkJcHJpbnRmKExPR19QUkVGSVggIlJlc2N1ZSBTeXN0ZW0gZGlzYWJsZWQuXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIENoZWNrIGlmIHdlIGhhdmUgYSBVU0Igc3RvcmFnZSBkZXZpY2UgYW5kIGxvYWQgaW1hZ2UgKi8KLQlpZiAobG9hZF9yZXNjdWVfaW1hZ2UoTE9BRF9BRERSKSkKLQkJcmV0dXJuOwotCi0JYmNtZCA9IGZpbmRfY21kKCJib290bSIpOwotCWlmICghYmNtZCkKLQkJcmV0dXJuOwotCi0Jc3ByaW50ZihrYSwgIiVseCIsIExPQURfQUREUik7Ci0KLQkvKiBwcmVwYXJlIG91ciBib290YXJncyAqLwotCXJzYXJncyA9IGdldGVudigicnMtYXJncyIpOwotCWlmICghcnNhcmdzKQotCQlyc2FyZ3MgPSBSU19CT09UQVJHUzsKLQllbHNlIHsKLQkJdG1wID0gbWFsbG9jKHN0cmxlbihyc2FyZ3MrMSkpOwotCQlpZiAoIXRtcCkgewotCQkJcHJpbnRmKExPR19QUkVGSVggIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3RyY3B5KHRtcCwgcnNhcmdzKTsKLQkJcnNhcmdzID0gdG1wOwotCX0KLQotCXNldGVudigiYm9vdGFyZ3MiLCByc2FyZ3MpOwotCi0JaWYgKHJzYXJncyA9PSB0bXApCi0JCWZyZWUocnNhcmdzKTsKLQotCXByaW50ZihMT0dfUFJFRklYICJTdGFydGluZyB1cGRhdGUgc3lzdGVtIChib290YXJncz0lcykuLi5cbiIsIHJzYXJncyk7Ci0JZG9fYm9vdG0oYmNtZCwgMCwgMiwgYXJndik7Ci19Ci0KLXN0YXRpYyBpbnQgbG9hZF9yZXNjdWVfaW1hZ2UodWxvbmcgYWRkcikKLXsKLQlkaXNrX3BhcnRpdGlvbl90IGluZm87Ci0JaW50IGRldm5vOwotCWludCBwYXJ0bm87Ci0JaW50IGk7Ci0JY2hhciBmd2Rpcls2NF07Ci0JY2hhciBueHJpWzEyOF07Ci0JY2hhciAqdG1wOwotCWNoYXIgZGV2WzddOwotCWNoYXIgYWRkcl9zdHJbMTZdOwotCWNoYXIgKmFyZ3ZbNl0gPSB7ICJmYXRsb2FkIiwgInVzYiIsIGRldiwgYWRkcl9zdHIsIG54cmksIE5VTEwgfTsKLQlibG9ja19kZXZfZGVzY190ICpzdG9yX2RldiA9IE5VTEw7Ci0JY21kX3RibF90ICpiY21kOwotCi0JLyogR2V0IG5hbWUgb2YgZmlybXdhcmUgZGlyZWN0b3J5ICovCi0JdG1wID0gZ2V0ZW52KCJmdy1kaXIiKTsKLQotCS8qIENvcHkgaXQgaW50byBmd2RpciAqLwotCXN0cm5jcHkoZndkaXIsIHRtcCA/IHRtcCA6IEZXX0RJUiwgc2l6ZW9mKGZ3ZGlyKSk7Ci0JZndkaXJbc2l6ZW9mKGZ3ZGlyKSAtIDFdID0gMDsgLyogVGVybWluYXRlIHN0cmluZyAqLwotCi0JcHJpbnRmKExPR19QUkVGSVggIkNoZWNraW5nIGZvciBmaXJtd2FyZSBpbWFnZSBkaXJlY3RvcnkgJyVzJyBvbiBVU0IiCi0JCSIgc3RvcmFnZS4uLlxuIiwgZndkaXIpOwotCXVzYl9zdG9wKCk7Ci0JaWYgKHVzYl9pbml0KCkgIT0gMCkKLQkJcmV0dXJuIDE7Ci0KLQkvKiBDaGVjayBmb3Igc3RvcmFnZSBkZXZpY2UgKi8KLQlpZiAodXNiX3N0b3Jfc2NhbigxKSAhPSAwKSB7Ci0JCXVzYl9zdG9wKCk7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qIERldGVjdCBzdG9yYWdlIGRldmljZSAqLwotCWZvciAoZGV2bm8gPSAwOyBkZXZubyA8IFVTQl9NQVhfU1RPUl9ERVY7IGRldm5vKyspIHsKLQkJc3Rvcl9kZXYgPSB1c2Jfc3Rvcl9nZXRfZGV2KGRldm5vKTsKLQkJaWYgKHN0b3JfZGV2LT50eXBlICE9IERFVl9UWVBFX1VOS05PV04pCi0JCQlicmVhazsKLQl9Ci0JaWYgKCFzdG9yX2RldiB8fCBzdG9yX2Rldi0+dHlwZSA9PSBERVZfVFlQRV9VTktOT1dOKSB7Ci0JCXByaW50ZihMT0dfUFJFRklYICJObyB2YWxpZCBzdG9yYWdlIGRldmljZSBmb3VuZC4uLlxuIik7Ci0JCXVzYl9zdG9wKCk7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qIERldGVjdCBwYXJ0aXRpb24gKi8KLQlmb3IgKHBhcnRubyA9IC0xLCBpID0gMDsgaSA8IDY7IGkrKykgewotCQlpZiAoZ2V0X3BhcnRpdGlvbl9pbmZvKHN0b3JfZGV2LCBpLCAmaW5mbykgPT0gMCkgewotCQkJaWYgKGZhdF9yZWdpc3Rlcl9kZXZpY2Uoc3Rvcl9kZXYsIGkpID09IDApIHsKLQkJCQkvKiBDaGVjayBpZiByZXNjdWUgaW1hZ2UgaXMgcHJlc2VudCAqLwotCQkJCUZXX0RFQlVHKCJMb29raW5nIGZvciBmaXJtd2FyZSBkaXJlY3RvcnkgJyVzJyIKLQkJCQkJIiBvbiBwYXJ0aXRpb24gJWRcbiIsIGZ3ZGlyLCBpKTsKLQkJCQlpZiAoZG9fZmF0X3JlYWQoZndkaXIsIE5VTEwsIDAsIExTX05PKSA9PSAtMSkgewotCQkJCQlGV19ERUJVRygiTm8gTlggcmVzY3VlIGltYWdlIG9uICIKLQkJCQkJCSJwYXJ0aXRpb24gJWQuXG4iLCBpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwYXJ0bm8gPSBpOwotCQkJCQlGV19ERUJVRygiUGFydGl0aW9uICVkIGNvbnRhaW5zICIKLQkJCQkJCSJmaXJtd2FyZSBkaXJlY3RvcnlcbiIsIHBhcnRubyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCWlmIChwYXJ0bm8gPT0gLTEpIHsKLQkJcHJpbnRmKExPR19QUkVGSVggIkVycm9yOiBObyB2YWxpZCAoRkFUKSBwYXJ0aXRpb24gZGV0ZWN0ZWRcbiIpOwotCQl1c2Jfc3RvcCgpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKiBMb2FkIHRoZSByZXNjdWUgaW1hZ2UgKi8KLQliY21kID0gZmluZF9jbWQoImZhdGxvYWQiKTsKLQlpZiAoIWJjbWQpIHsKLQkJcHJpbnRmKExPR19QUkVGSVggIkVycm9yIC0gJ2ZhdGxvYWQnIGNvbW1hbmQgbm90IHByZXNlbnQuXG4iKTsKLQkJdXNiX3N0b3AoKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JdG1wID0gZ2V0ZW52KCJueC1yZXNjdWUtaW1hZ2UiKTsKLQlzcHJpbnRmKG54cmksICIlcy8lcyIsIGZ3ZGlyLCB0bXAgPyB0bXAgOiBSRVNDVUVfSU1BR0UpOwotCXNwcmludGYoZGV2LCAiJWQ6JWQiLCBkZXZubywgcGFydG5vKTsKLQlzcHJpbnRmKGFkZHJfc3RyLCAiJWx4IiwgYWRkcik7Ci0KLQlGV19ERUJVRygiZmF0X2ZzbG9hZCBkZXZpY2U9JyVzJywgYWRkcj0nJXMnLCBmaWxlOiAlc1xuIiwKLQkJZGV2LCBhZGRyX3N0ciwgbnhyaSk7Ci0KLQlpZiAoZG9fZmF0X2ZzbG9hZChiY21kLCAwLCA1LCBhcmd2KSAhPSAwKSB7Ci0JCXVzYl9zdG9wKCk7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qIFN0b3AgVVNCICovCi0JdXNiX3N0b3AoKTsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2NtMV9xcDEvZnd1cGRhdGUuaCBiL2JvYXJkL2NtMV9xcDEvZnd1cGRhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5YzJkNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9jbTFfcXAxL2Z3dXBkYXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDA3IFNjaGluZGxlciBMaWZ0IEluYy4KLSAqCi0gKiBBdXRob3I6IE1pY2hlbCBNYXJ0aSA8bW1hQG9iamVjdHhwLmNvbT4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi0jaWZuZGVmIF9fRldfVVBEQVRFX0gKLSNkZWZpbmUgX19GV19VUERBVEVfSAotCi0vKiBEZWZhdWx0IHByZWZpeCBmb3Igb3V0cHV0IG1lc3NhZ2VzICovCi0jZGVmaW5lIExPR19QUkVGSVgJIkNNMTogICAiCi0KLS8qIEV4dHJhIGRlYnVnIG1hY3JvICovCi0jaWZkZWYgQ09ORklHX0ZXVVBEQVRFX0RFQlVHCi0jZGVmaW5lIEZXX0RFQlVHKGZtdC4uLikgcHJpbnRmKExPR19QUkVGSVggZm10KQotI2Vsc2UKLSNkZWZpbmUgRldfREVCVUcoZm10Li4uKQotI2VuZGlmCi0KLS8qIE5hbWUgb2YgdGhlIGRpcmVjdG9yeSBob2xkaW5nIGZpcm13YXJlIGltYWdlcyAqLwotI2RlZmluZSBGV19ESVIJCSJueC1mdyIKLSNkZWZpbmUgUkVTQ1VFX0lNQUdFCSJueHJzLmltZyIKLSNkZWZpbmUgTE9BRF9BRERSCTB4NDAwMDAwCi0jZGVmaW5lIFJTX0JPT1RBUkdTCSJyYW1kaXNrPTgxOTJLIgotCi0vKiBNYWluIGZ1bmN0aW9uIGZvciBmd3VwZGF0ZSAqLwotdm9pZCBjbTFfZnd1cGRhdGUodm9pZCk7Ci0KLSNlbmRpZiAvKiBfX0ZXX1VQREFURV9IICovCmRpZmYgLS1naXQgYS9ib2FyZC9jbTUyMDAvTWFrZWZpbGUgYi9ib2FyZC9jbTUyMDAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViZGIxYQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2NtNTIwMC9NYWtlZmlsZQpAQCAtMCwwICsxLDUwIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA3CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK0NPQkpTCTo9ICQoQk9BUkQpLm8gY21kX2NtNTIwMC5vIGZ3dXBkYXRlLm8KKworU1JDUwk6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCitTT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL2NtNTIwMC9jbTUyMDAuYyBiL2JvYXJkL2NtNTIwMC9jbTUyMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzRhYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvY201MjAwL2NtNTIwMC5jCkBAIC0wLDAgKzEsNDI1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBNYXJrIEpvbmFzLCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgbWFyay5qb25hc0Btb3Rvcm9sYS5jb20uCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDUKKyAqIE1hcnRpbiBLcmF1c2UsIFRRLVN5c3RlbXMgR21iSCwgbWFydGluLmtyYXVzZUB0cXMuZGUKKyAqCisgKiBBZGFwdGVkIHRvIFUtQm9vdCAxLjIgYnk6CisgKiAgIEJhcnRsb21pZWogU2lla2EgPHR1ckBzZW1paGFsZi5jb20+OgorICogICAgICAtIEhXIElEIHJlYWRvdXQgZnJvbSBFRVBST00KKyAqICAgICAgLSBtb2R1bGUgZGV0ZWN0aW9uCisgKiAgIEdyemVnb3J6IEJlcm5hY2tpIDxnamJAc2VtaWhhbGYuY29tPjoKKyAqICAgICAgLSBydW4tdGltZSBTRFJBTSBjb250cm9sbGVyIGNvbmZpZ3VyYXRpb24KKyAqICAgICAgLSBMSUJGRFQgc3VwcG9ydAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM1eHh4Lmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGkyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisKKyNpZmRlZiBDT05GSUdfT0ZfTElCRkRUCisjaW5jbHVkZSA8bGliZmR0Lmg+CisjaW5jbHVkZSA8bGliZmR0X2Vudi5oPgorI2luY2x1ZGUgPGZkdF9zdXBwb3J0Lmg+CisjZW5kaWYgLyogQ09ORklHX09GX0xJQkZEVCAqLworCisKKyNpbmNsdWRlICJjbTUyMDAuaCIKKyNpbmNsdWRlICJmd3VwZGF0ZS5oIgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworc3RhdGljIGh3X2lkX3QgaHdfaWQ7CisKKworI2lmbmRlZiBDRkdfUkFNQk9PVAorLyoKKyAqIEhlbHBlciBmdW5jdGlvbiB0byBpbml0aWFsaXplIFNEUkFNIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyB2b2lkIHNkcmFtX3N0YXJ0KGludCBoaV9hZGRyLCBtZW1fY29uZl90ICptZW1fY29uZikKK3sKKwlsb25nIGhpX2FkZHJfYml0ID0gaGlfYWRkciA/IDB4MDEwMDAwMDAgOiAwOworCisJLyogdW5sb2NrIG1vZGUgcmVnaXN0ZXIgKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NUUkwgPSBtZW1fY29uZi0+Y29udHJvbCB8IDB4ODAwMDAwMDAgfAorCQkJCQkJaGlfYWRkcl9iaXQ7CisKKwkvKiBwcmVjaGFyZ2UgYWxsIGJhbmtzICovCisJKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DVFJMID0gbWVtX2NvbmYtPmNvbnRyb2wgfCAweDgwMDAwMDAyIHwKKwkJCQkJCWhpX2FkZHJfYml0OworCisJLyogYXV0byByZWZyZXNoICovCisJKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DVFJMID0gbWVtX2NvbmYtPmNvbnRyb2wgfCAweDgwMDAwMDA0IHwKKwkJCQkJCWhpX2FkZHJfYml0OworCisJLyogYXV0byByZWZyZXNoLCBzZWNvbmQgdGltZSAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfU0RSQU1fQ1RSTCA9IG1lbV9jb25mLT5jb250cm9sIHwgMHg4MDAwMDAwNCB8CisJCQkJCQloaV9hZGRyX2JpdDsKKworCS8qIHNldCBtb2RlIHJlZ2lzdGVyICovCisJKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9NT0RFID0gbWVtX2NvbmYtPm1vZGU7CisKKwkvKiBub3JtYWwgb3BlcmF0aW9uICovCisJKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DVFJMID0gbWVtX2NvbmYtPmNvbnRyb2wgfCBoaV9hZGRyX2JpdDsKK30KKyNlbmRpZiAvKiBDRkdfUkFNQk9PVCAqLworCisKKy8qCisgKiBSZXRyaWV2ZSBtZW1vcnkgY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBtb2R1bGUuIGJvYXJkX3R5cGUgaXMgdGhlIGluZGV4CisgKiBpbiBod19pZF9saXN0W10gY29ycmVzcG9uZGluZyB0byB0aGUgbW9kdWxlIHdlIGFyZSBleGVjdXRpbmcgb247IHdlIHJldHVybgorICogU0RSQU0gY29udHJvbGxlciBzZXR0aW5ncyBhcHByb3ByYXRlIGZvciB0aGlzIG1vZHVsZS4KKyAqLworc3RhdGljIG1lbV9jb25mX3QqIGdldF9tZW1fY29uZmlnKGludCBib2FyZF90eXBlKQoreworCXN3aXRjaChib2FyZF90eXBlKXsKKwkJY2FzZSBDTTFfUUE6CisJCQlyZXR1cm4gbWVtb3J5X2NvbmZpZ1swXTsKKwkJY2FzZSBDTTExX1FBOgorCQljYXNlIENNVTFfUUE6CisJCQlyZXR1cm4gbWVtb3J5X2NvbmZpZ1sxXTsKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigiRVJST1I6IFVua25vd24gbW9kdWxlLCB1c2luZyBhIGRlZmF1bHQgU0RSQU0gIgorCQkJCSJjb25maWd1cmF0aW9uIC0gdGhpbmdzIG1heSBub3Qgd29yayEhIS5cbiIpOworCQkJcmV0dXJuIG1lbW9yeV9jb25maWdbMF07CisJfQorfQorCisKKy8qCisgKiBJbml0YWxpemUgU0RSQU0gLSBjb25maWd1cmUgU0RSQU0gY29udHJvbGxlciwgZGV0ZWN0IG1lbW9yeSBzaXplLgorICovCitsb25nIGludCBpbml0ZHJhbShpbnQgYm9hcmRfdHlwZSkKK3sKKwl1bG9uZyBkcmFtc2l6ZSA9IDA7CisjaWZuZGVmIENGR19SQU1CT09UCisJdWxvbmcgdGVzdDEsIHRlc3QyOworCW1lbV9jb25mX3QgKm1lbV9jb25mOworCisJbWVtX2NvbmYgPSBnZXRfbWVtX2NvbmZpZyhib2FyZF90eXBlKTsKKworCS8qIGNvbmZpZ3VyZSBTRFJBTSBzdGFydC9lbmQgZm9yIGRldGVjdGlvbiAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfU0RSQU1fQ1MwQ0ZHID0gMHgwMDAwMDAxZTsgLyogMkcgYXQgMHgwICovCisKKwkvKiBzZXR1cCBjb25maWcgcmVnaXN0ZXJzICovCisJKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DT05GSUcxID0gbWVtX2NvbmYtPmNvbmZpZzE7CisJKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DT05GSUcyID0gbWVtX2NvbmYtPmNvbmZpZzI7CisKKwlzZHJhbV9zdGFydCgwLCBtZW1fY29uZik7CisJdGVzdDEgPSBnZXRfcmFtX3NpemUoKGxvbmcgKilDRkdfU0RSQU1fQkFTRSwgMHg4MDAwMDAwMCk7CisJc2RyYW1fc3RhcnQoMSwgbWVtX2NvbmYpOworCXRlc3QyID0gZ2V0X3JhbV9zaXplKChsb25nICopQ0ZHX1NEUkFNX0JBU0UsIDB4ODAwMDAwMDApOworCWlmICh0ZXN0MSA+IHRlc3QyKSB7CisJCXNkcmFtX3N0YXJ0KDAsIG1lbV9jb25mKTsKKwkJZHJhbXNpemUgPSB0ZXN0MTsKKwl9IGVsc2UKKwkJZHJhbXNpemUgPSB0ZXN0MjsKKworCS8qIG1lbW9yeSBzbWFsbGVyIHRoYW4gMU1CIGlzIGltcG9zc2libGUgKi8KKwlpZiAoZHJhbXNpemUgPCAoMSA8PCAyMCkpCisJCWRyYW1zaXplID0gMDsKKworCS8qIHNldCBTRFJBTSBDUzAgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIGFtb3VudCBvZiBSQU0gZm91bmQgKi8KKwlpZiAoZHJhbXNpemUgPiAwKSB7CisJCSoodnVfbG9uZyAqKU1QQzVYWFhfU0RSQU1fQ1MwQ0ZHID0gMHgxMyArCisJCQlfX2J1aWx0aW5fZmZzKGRyYW1zaXplID4+IDIwKSAtIDE7CisJfSBlbHNlCisJCSoodnVfbG9uZyAqKU1QQzVYWFhfU0RSQU1fQ1MwQ0ZHID0gMDsgLyogZGlzYWJsZWQgKi8KKyNlbHNlIC8qIENGR19SQU1CT09UICovCisJLyogcmV0cmlldmUgc2l6ZSBvZiBtZW1vcnkgY29ubmVjdGVkIHRvIFNEUkFNIENTMCAqLworCWRyYW1zaXplID0gKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DUzBDRkcgJiAweEZGOworCWlmIChkcmFtc2l6ZSA+PSAweDEzKQorCQlkcmFtc2l6ZSA9ICgxIDw8IChkcmFtc2l6ZSAtIDB4MTMpKSA8PCAyMDsKKwllbHNlCisJCWRyYW1zaXplID0gMDsKKyNlbmRpZiAvKiAhQ0ZHX1JBTUJPT1QgKi8KKworCS8qCisJICogT24gTVBDNTIwMEIgd2UgbmVlZCB0byBzZXQgdGhlIHNwZWNpYWwgY29uZmlndXJhdGlvbiBkZWxheSBpbiB0aGUKKwkgKiBERFIgY29udHJvbGxlci4gIFJlZmVyIHRvIGNoYXB0ZXIgOC43LjUgU0RlbGF5LS1NQkFSICsgMHgwMTkwIG9mCisJICogdGhlIE1QQzUyMDBCIFVzZXIncyBNYW51YWwuCisJICovCisJKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9TREVMQVkgPSAweDA0OworCV9fYXNtX18gdm9sYXRpbGUgKCJzeW5jIik7CisKKwlyZXR1cm4gZHJhbXNpemU7Cit9CisKKworLyoKKyAqIFJlYWQgbW9kdWxlIGhhcmR3YXJlIGlkZW50aWZpY2F0aW9uIGRhdGEgZnJvbSB0aGUgSTJDIEVFUFJPTS4KKyAqLworc3RhdGljIHZvaWQgcmVhZF9od19pZChod19pZF90IGh3X2lkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBIV19JRF9FTEVNX0NPVU5UOyArK2kpCisJCWlmIChpMmNfcmVhZChDRkdfSTJDX0VFUFJPTSwKKwkJCQlod19pZF9mb3JtYXRbaV0ub2Zmc2V0LAorCQkJCTIsCisJCQkJKHVjaGFyICopJmh3X2lkW2ldWzBdLAorCQkJCWh3X2lkX2Zvcm1hdFtpXS5sZW5ndGgpICE9IDApCisJCQlwcmludGYoIkVSUk9SOiBjYW4ndCByZWFkIEhXIElEIGZyb20gRUVQUk9NXG4iKTsKK30KKworCisvKgorICogSWRlbnRpZnkgbW9kdWxlIHdlIGFyZSBydW5uaW5nIG9uLCBzZXQgZ2QtPmJvYXJkX3R5cGUgdG8gdGhlIGluZGV4IGluCisgKiBod19pZF9saXN0W10gY29ycmVzcG9uZGluZyB0byB0aGUgbW9kdWxlIGlkZW50aWZlZCwgb3IgdG8KKyAqIENNNTIwMF9VTktOT1dOX01PRFVMRSBpZiB3ZSBjYW4ndCBpZGVudGlmeSB0aGUgbW9kdWxlLgorICovCitzdGF0aWMgdm9pZCBpZGVudGlmeV9tb2R1bGUoaHdfaWRfdCBod19pZCkKK3sKKwlpbnQgaSwgaiwgZWxlbWVudDsKKwljaGFyIG1hdGNoOworCWdkLT5ib2FyZF90eXBlID0gQ001MjAwX1VOS05PV05fTU9EVUxFOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGh3X2lkX2xpc3QpIC8gc2l6ZW9mIChjaGFyICoqKTsgKytpKSB7CisJCW1hdGNoID0gMTsKKwkJZm9yIChqID0gMDsgaiA8IHNpemVvZiAoaHdfaWRfaWRlbnRpZnkpIC8gc2l6ZW9mIChpbnQpOyArK2opIHsKKwkJCWVsZW1lbnQgPSBod19pZF9pZGVudGlmeVtqXTsKKwkJCWlmIChzdHJuY21wKGh3X2lkX2xpc3RbaV1bZWxlbWVudF0sCisJCQkJCSZod19pZFtlbGVtZW50XVswXSwKKwkJCQkJaHdfaWRfZm9ybWF0W2VsZW1lbnRdLmxlbmd0aCkgIT0gMCkgeworCQkJCW1hdGNoID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAobWF0Y2gpIHsKKwkJCWdkLT5ib2FyZF90eXBlID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKKy8qCisgKiBDb21wb3NlIHN0cmluZyB3aXRoIG1vZHVsZSBuYW1lLgorICogYnVmIGlzIGFzc3VtZWQgdG8gaGF2ZSBlbm91Z2ggc3BhY2UsIGFuZCBiZSBudWxsLXRlcm1pbmF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGNvbXBvc2VfbW9kdWxlX25hbWUoaHdfaWRfdCBod19pZCwgY2hhciAqYnVmKQoreworCWNoYXIgdG1wW01PRFVMRV9OQU1FX01BWExFTl07CisJc3RybmNhdChidWYsICZod19pZFtQQ0JfTkFNRV1bMF0sIGh3X2lkX2Zvcm1hdFtQQ0JfTkFNRV0ubGVuZ3RoKTsKKwlzdHJuY2F0KGJ1ZiwgIi4iLCAxKTsKKwlzdHJuY2F0KGJ1ZiwgJmh3X2lkW0ZPUk1dWzBdLCBod19pZF9mb3JtYXRbRk9STV0ubGVuZ3RoKTsKKwlzdHJuY2F0KGJ1ZiwgJmh3X2lkW1ZFUlNJT05dWzBdLCBod19pZF9mb3JtYXRbVkVSU0lPTl0ubGVuZ3RoKTsKKwlzdHJuY2F0KGJ1ZiwgIiAoIiwgMik7CisJc3RybmNhdChidWYsICZod19pZFtJREVOVElGSUNBVElPTl9OVU1CRVJdWzBdLAorCQlod19pZF9mb3JtYXRbSURFTlRJRklDQVRJT05fTlVNQkVSXS5sZW5ndGgpOworCXNwcmludGYodG1wLCAiIC8gJXUuJXUpIiwKKwkJaHdfaWRbTUFKT1JfU1dfVkVSU0lPTl1bMF0sCisJCWh3X2lkW01JTk9SX1NXX1ZFUlNJT05dWzBdKTsKKwlzdHJjYXQoYnVmLCB0bXApOworfQorCisKKy8qCisgKiBDb21wb3NlIHN0cmluZyB3aXRoIGhvc3RuYW1lLgorICogYnVmIGlzIGFzc3VtZWQgdG8gaGF2ZSBlbm91Z2ggc3BhY2UsIGFuZCBiZSBudWxsLXRlcm1pbmF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGNvbXBvc2VfaG9zdG5hbWUoaHdfaWRfdCBod19pZCwgY2hhciAqYnVmKQoreworCWNoYXIgKnA7CisJc3RybmNhdChidWYsICZod19pZFtQQ0JfTkFNRV1bMF0sIGh3X2lkX2Zvcm1hdFtQQ0JfTkFNRV0ubGVuZ3RoKTsKKwlzdHJuY2F0KGJ1ZiwgIl8iLCAxKTsKKwlzdHJuY2F0KGJ1ZiwgJmh3X2lkW0ZPUk1dWzBdLCBod19pZF9mb3JtYXRbRk9STV0ubGVuZ3RoKTsKKwlzdHJuY2F0KGJ1ZiwgJmh3X2lkW1ZFUlNJT05dWzBdLCBod19pZF9mb3JtYXRbVkVSU0lPTl0ubGVuZ3RoKTsKKwlmb3IgKHAgPSBidWY7ICpwOyArK3ApCisJCSpwID0gdG9sb3dlcigqcCk7CisKK30KKworCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApICYmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKKy8qCisgKiBVcGRhdGUgJ21vZGVsJyBhbmQgJ21lbW9yeScgcHJvcGVydGllcyBpbiB0aGUgYmxvYiBhY2NvcmRpbmcgdG8gdGhlIG1vZHVsZQorICogdGhhdCB3ZSBhcmUgcnVubmluZyBvbi4KKyAqLworc3RhdGljIHZvaWQgZnRfYmxvYl91cGRhdGUodm9pZCAqYmxvYiwgYmRfdCAqYmQpCit7CisJaW50IGxlbiwgcmV0LCBub2Rlb2Zmc2V0ID0gMDsKKwljaGFyIG1vZHVsZV9uYW1lW01PRFVMRV9OQU1FX01BWExFTl0gPSB7MH07CisJdWxvbmcgbWVtb3J5X2RhdGFbMl0gPSB7MH07CisKKwljb21wb3NlX21vZHVsZV9uYW1lKGh3X2lkLCBtb2R1bGVfbmFtZSk7CisJbGVuID0gc3RybGVuKG1vZHVsZV9uYW1lKSArIDE7CisKKwlyZXQgPSBmZHRfc2V0cHJvcChibG9iLCBub2Rlb2Zmc2V0LCAibW9kZWwiLCBtb2R1bGVfbmFtZSwgbGVuKTsKKwlpZiAocmV0IDwgMCkKKwlwcmludGYoImZ0X2Jsb2JfdXBkYXRlKCk6IGNhbm5vdCBzZXQgL21vZGVsIHByb3BlcnR5IGVycjolc1xuIiwKKwkJZmR0X3N0cmVycm9yKHJldCkpOworCisJbWVtb3J5X2RhdGFbMF0gPSBjcHVfdG9fYmUzMihiZC0+YmlfbWVtc3RhcnQpOworCW1lbW9yeV9kYXRhWzFdID0gY3B1X3RvX2JlMzIoYmQtPmJpX21lbXNpemUpOworCisJbm9kZW9mZnNldCA9IGZkdF9maW5kX25vZGVfYnlfcGF0aCAoYmxvYiwgIi9tZW1vcnkiKTsKKwlpZiAobm9kZW9mZnNldCA+PSAwKSB7CisJCXJldCA9IGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsICJyZWciLCBtZW1vcnlfZGF0YSwKKwkJCQkJc2l6ZW9mKG1lbW9yeV9kYXRhKSk7CisJaWYgKHJldCA8IDApCisJCXByaW50ZigiZnRfYmxvYl91cGRhdGUpOiBjYW5ub3Qgc2V0IC9tZW1vcnkvcmVnICIKKwkJCSJwcm9wZXJ0eSBlcnI6JXNcbiIsIGZkdF9zdHJlcnJvcihyZXQpKTsKKwl9CisJZWxzZSB7CisJCS8qIG1lbW9yeSBub2RlIGlzIHJlcXVpcmVkIGluIGR0cyAqLworCQlwcmludGYoImZ0X2Jsb2JfdXBkYXRlKCk6IGNhbm5vdCBmaW5kIC9tZW1vcnkgbm9kZSAiCisJCSJlcnI6JXNcbiIsIGZkdF9zdHJlcnJvcihub2Rlb2Zmc2V0KSk7CisJfQorfQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX09GX0JPQVJEX1NFVFVQKSAmJiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpICovCisKKworLyoKKyAqIFJlYWQgSFcgSUQgZnJvbSBJMkMgRUVQUk9NIGFuZCBkZXRlY3QgdGhlIG1vZHVlIHdlIGFyZSBydW5uaW5nIG9uLiBOb3RlCisgKiB0aGF0IHdlIG5lZWQgdG8gdXNlIGxvY2FsIHZhcmlhYmxlIGZvciByZWFkb3V0LCBiZWNhdXNlIGdsb2JhbCBkYXRhIGlzIG5vdAorICogd3JpdGFibGUgeWV0IChhbmQgd2UnbGwgaGF2ZSB0byByZWRvIHRoZSByZWFkb3V0IGxhdGVyIG9uKS4KKyAqLworaW50IGNoZWNrYm9hcmQodm9pZCkKK3sKKwlod19pZF90IGh3X2lkX3RtcDsKKwljaGFyIG1vZHVsZV9uYW1lX3RtcFtNT0RVTEVfTkFNRV9NQVhMRU5dID0gIiI7CisKKwkvKgorCSAqIFdlIG5lZWQgSTJDIHRvIGFjY2VzcyBIVyBJRCBkYXRhIGZyb20gRUVQUk9NLCBzbyB3ZSBjYWxsIGkyY19pbml0KCkKKwkgKiBoZXJlIGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBpdCB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBsYXRlciBvbi4gV2UKKwkgKiBhbHNvIHVzZSBhIGxpdHRsZSB0cmljayB0byBzaWxlbmNlIEkyQy1yZWxhdGVkIG91dHB1dC4KKwkgKi8KKwlnZC0+ZmxhZ3MgfD0gR0RfRkxHX1NJTEVOVDsKKwlpMmNfaW5pdCAoQ0ZHX0kyQ19TUEVFRCwgQ0ZHX0kyQ19TTEFWRSk7CisJZ2QtPmZsYWdzICY9IH5HRF9GTEdfU0lMRU5UOworCisJcmVhZF9od19pZChod19pZF90bXApOworCWlkZW50aWZ5X21vZHVsZShod19pZF90bXApOwkvKiB0aGlzIHNldHMgZ2QtPmJvYXJkX3R5cGUgKi8KKwljb21wb3NlX21vZHVsZV9uYW1lKGh3X2lkX3RtcCwgbW9kdWxlX25hbWVfdG1wKTsKKworCWlmIChnZC0+Ym9hcmRfdHlwZSAhPSBDTTUyMDBfVU5LTk9XTl9NT0RVTEUpCisJCXByaW50ZigiQm9hcmQ6ICVzXG4iLCBtb2R1bGVfbmFtZV90bXApOworCWVsc2UKKwkJcHJpbnRmKCJCb2FyZDogdW5yZWNvZ25pemVkIGNtNTIwMCBtb2R1bGUgKCVzKVxuIiwKKwkJCW1vZHVsZV9uYW1lX3RtcCk7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgYm9hcmRfZWFybHlfaW5pdF9yKHZvaWQpCit7CisJLyoKKwkgKiBOb3csIHdoZW4gd2UgYXJlIGluIFJBTSwgZW5hYmxlIGZsYXNoIHdyaXRlIGFjY2VzcyBmb3IgZGV0ZWN0aW9uCisJICogcHJvY2Vzcy4gTm90ZSB0aGF0IENTX0JPT1QgY2Fubm90IGJlIGNsZWFyZWQgd2hlbiBleGVjdXRpbmcgaW4KKwkgKiBmbGFzaC4KKwkgKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX0JPT1RDU19DRkcgJj0gfjB4MTsgLyogY2xlYXIgUk8gKi8KKworCS8qIE5vdyB0aGF0IHdlIGNhbiB3cml0ZSB0byBnbG9iYWwgZGF0YSwgcmVhZCBIVyBJRCBhZ2Fpbi4gKi8KKwlyZWFkX2h3X2lkKGh3X2lkKTsKKwlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgQ09ORklHX1BPU1QKK2ludCBwb3N0X2hvdGtleXNfcHJlc3NlZCh2b2lkKQoreworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QT1NUICovCisKKworI2lmIGRlZmluZWQoQ09ORklHX1BPU1QpIHx8IGRlZmluZWQoQ09ORklHX0xPR0JVRkZFUikKK3ZvaWQgcG9zdF93b3JkX3N0b3JlKHVsb25nIGEpCit7CisJdnVfbG9uZyAqc2F2ZV9hZGRyID0gKHZ1X2xvbmcgKikoTVBDNVhYWF9TUkFNICsgTVBDNVhYWF9TUkFNX1BPU1RfU0laRSk7CisJKnNhdmVfYWRkciA9IGE7Cit9CisKKwordWxvbmcgcG9zdF93b3JkX2xvYWQodm9pZCkKK3sKKwl2dV9sb25nICpzYXZlX2FkZHIgPSAodnVfbG9uZyAqKShNUEM1WFhYX1NSQU0gKyBNUEM1WFhYX1NSQU1fUE9TVF9TSVpFKTsKKwlyZXR1cm4gKnNhdmVfYWRkcjsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE9TVCB8fCBDT05GSUdfTE9HQlVGRkVSICovCisKKworI2lmZGVmIENPTkZJR19NSVNDX0lOSVRfUgoraW50IG1pc2NfaW5pdF9yKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfSEFSRF9JMkMpIHx8IGRlZmluZWQoQ09ORklHX1NPRlRfSTJDKQorCXVjaGFyIGJ1Zls2XTsKKwljaGFyIHN0clsxOF07CisJY2hhciBob3N0bmFtZVtNT0RVTEVfTkFNRV9NQVhMRU5dOworCisJLyogUmVhZCBldGhhZGRyIGZyb20gRUVQUk9NICovCisJaWYgKGkyY19yZWFkKENGR19JMkNfRUVQUk9NLCBDT05GSUdfTUFDX09GRlNFVCwgMiwgYnVmLCA2KSA9PSAwKSB7CisJCXNwcmludGYoc3RyLCAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgiLAorCQkJYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLCBidWZbNF0sIGJ1Zls1XSk7CisJCS8qIENoZWNrIGlmIE1BQyBhZGRyIGlzIG93bmVkIGJ5IFNjaGluZGxlciAqLworCQlpZiAoc3Ryc3RyKHN0ciwgIjAwOjA2OkMzIikgIT0gc3RyKQorCQkJcHJpbnRmKExPR19QUkVGSVggIldhcm5pbmcgLSBJbGxlZ2FsIE1BQyBhZGRyZXNzICglcykiCisJCQkJIiBpbiBFRVBST00uXG4iLCBzdHIpOworCQllbHNlIHsKKwkJCXByaW50ZihMT0dfUFJFRklYICJVc2luZyBNQUMgKCVzKSBmcm9tIEkyQyBFRVBST01cbiIsCisJCQkJc3RyKTsKKwkJCXNldGVudigiZXRoYWRkciIsIHN0cik7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGYoTE9HX1BSRUZJWCAiV2FybmluZyAtIFVuYWJsZSB0byByZWFkIE1BQyBmcm9tIEkyQyIKKwkJCSIgZGV2aWNlIGF0IGFkZHJlc3MgJTAyWDolMDRYXG4iLCBDRkdfSTJDX0VFUFJPTSwKKwkJCUNPTkZJR19NQUNfT0ZGU0VUKTsKKwl9CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfSEFSRF9JMkMpIHx8IGRlZmluZWQoQ09ORklHX1NPRlRfSTJDKSAqLworCWlmICghZ2V0ZW52KCJldGhhZGRyIikpCisJCXByaW50ZihMT0dfUFJFRklYICJNQUMgYWRkcmVzcyBub3Qgc2V0LCBuZXR3b3JraW5nIGlzIG5vdCAiCisJCQkJCSJvcGVyYXRpb25hbFxuIik7CisKKwkvKiBzZXQgdGhlIGhvc3RuYW1lIGFwcHJvcHJpYXRlIHRvIHRoZSBtb2R1bGUgd2UncmUgcnVubmluZyBvbiAqLworCWNvbXBvc2VfaG9zdG5hbWUoaHdfaWQsIGhvc3RuYW1lKTsKKwlzZXRlbnYoImhvc3RuYW1lIiwgaG9zdG5hbWUpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX01JU0NfSU5JVF9SICovCisKKworI2lmZGVmIENPTkZJR19MQVNUX1NUQUdFX0lOSVQKK2ludCBsYXN0X3N0YWdlX2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0UKKwljbTUyMDBfZnd1cGRhdGUoKTsKKyNlbmRpZiAvKiBDT05GSUdfVVNCX1NUT1JBR0UgKi8KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfTEFTVF9TVEFHRV9JTklUICovCisKKworI2lmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkgJiYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApCit2b2lkIGZ0X2JvYXJkX3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKQoreworCWZ0X2NwdV9zZXR1cChibG9iLCBiZCk7CisJZnRfYmxvYl91cGRhdGUoYmxvYiwgYmQpOworfQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkgJiYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApICovCmRpZmYgLS1naXQgYS9ib2FyZC9jbTUyMDAvY201MjAwLmggYi9ib2FyZC9jbTUyMDAvY201MjAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlYTVjZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2NtNTIwMC9jbTUyMDAuaApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNyBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisgKgorICogQXV0aG9yOiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorICogQXV0aG9yOiBHcnplZ29yeiBCZXJuYWNraSA8Z2piQHNlbWloYWxmLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9DTTUyMDBfSAorI2RlZmluZSBfQ001MjAwX0gKKworCisvKgorICogRGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmb3IgdGhlIG1vZHVsZXMgb2YgdGhlIGNtNTIwMCBwbGF0Zm9ybS4gTW9zdGx5CisgKiByZWxhdGVkIHRvIHJlYWRpbmcgdGhlIGhhcmR3YXJlIGlkZW50aWZpY2F0aW9uIGRhdGEgKEhXIElEKSBmcm9tIHRoZSBJMkMKKyAqIEVFUFJPTSwgZGV0ZWN0aW9uIG9mIHRoZSBwYXJ0aWN1bGFyIG1vZHVsZSB3ZSBhcmUgZXhlY3V0aW5nIG9uLCBhbmQKKyAqIGFwcHJvcHJpYXRlIFNEUkFNIGNvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb24uCisgKi8KKworCisjZGVmaW5lIENNNTIwMF9VTktOT1dOX01PRFVMRQkweGZmZmZmZmZmCisKK2VudW0geworCURFVklDRV9OQU1FLAkJLyogMCAqLworCUdFTkVSQVRJT04sCQkvKiAxICovCisJUENCX05BTUUsCQkvKiAyICovCisJRk9STSwJCQkvKiAzICovCisJVkVSU0lPTiwJCS8qIDQgKi8KKwlJREVOVElGSUNBVElPTl9OVU1CRVIsCS8qIDUgKi8KKwlNQUpPUl9TV19WRVJTSU9OLAkvKiA2ICovCisJTUlOT1JfU1dfVkVSU0lPTiwJLyogNyAqLworCS8qIGFkZCBuZXcgYWxlbWVudHMgYWJvdmUgdGhpcyBsaW5lICovCisJSFdfSURfRUxFTV9DT1VOVAkvKiBjb3VudCAqLworfTsKKworLyoKKyAqIFNlY3QuIDQuMSAiQ00xLlEvQ01VMS5RIFN1cGVydmlzb3J5IE1pY3JvY29udHJvbGxlciBJbnRlcmZhY2UgRGVmaW5pdGlvbiIKKyAqLworCisjZGVmaW5lIERFVklDRV9OQU1FX09GRlNFVAkJMHgwMgorI2RlZmluZSBHRU5FUkFUSU9OX09GRlNFVAkJMHgwYgorI2RlZmluZSBQQ0JfTkFNRV9PRkZTRVQJCQkweDBjCisjZGVmaW5lIEZPUk1fT0ZGU0VUCQkJMHgxNQorI2RlZmluZSBWRVJTSU9OX09GRlNFVAkJCTB4MTYKKyNkZWZpbmUgSURFTlRJRklDQVRJT05fTlVNQkVSX09GRlNFVAkweDE5CisjZGVmaW5lIE1BSk9SX1NXX1ZFUlNJT05fT0ZGU0VUCQkweDA0ODAKKyNkZWZpbmUgTUlOT1JfU1dfVkVSU0lPTl9PRkZTRVQJCTB4MDQ4MQorCisKKyNkZWZpbmUgREVWSUNFX05BTUVfTEVOCQkJMHgwOQorI2RlZmluZSBHRU5FUkFUSU9OX0xFTgkJCTB4MDEKKyNkZWZpbmUgUENCX05BTUVfTEVOCQkJMHgwOQorI2RlZmluZSBGT1JNX0xFTgkJCTB4MDEKKyNkZWZpbmUgVkVSU0lPTl9MRU4JCQkweDAzCisjZGVmaW5lIElERU5USUZJQ0FUSU9OX05VTUJFUl9MRU4JMHgwOQorI2RlZmluZSBNQUpPUl9TV19WRVJTSU9OX0xFTgkJMHgwMQorI2RlZmluZSBNSU5PUl9TV19WRVJTSU9OX0xFTgkJMHgwMQorCisjZGVmaW5lIEhXX0lEX0VMRU1fTUFYTEVOCQkweDA5CS8qIE1BWChYWFhfTEVOKSAqLworCisvKiBlbnRpcmUgSFcgSUQgaW4gRUVQUk9NIGlzIDY0IGJ5dGVzLCBzbyBsb25nZXIgbW9kdWxlIG5hbWUgaXMgdW5saWtlbHkgKi8KKyNkZWZpbmUgTU9EVUxFX05BTUVfTUFYTEVOCQk2NAorCisKKy8qIHN0b3JhZ2UgZm9yIEhXIElEIHJlYWQgZnJvbSBFRVBST00gKi8KK3R5cGVkZWYgY2hhciBod19pZF90W0hXX0lEX0VMRU1fQ09VTlRdW0hXX0lEX0VMRU1fTUFYTEVOXTsKKworCisvKiBIVyBJRCBsYXlvdXQgaW4gRUVQUk9NICovCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGludCBsZW5ndGg7Cit9IGh3X2lkX2Zvcm1hdFtIV19JRF9FTEVNX0NPVU5UXSA9IHsKKwl7REVWSUNFX05BTUVfT0ZGU0VULAkJREVWSUNFX05BTUVfTEVOfSwKKwl7R0VORVJBVElPTl9PRkZTRVQsCQlHRU5FUkFUSU9OX0xFTn0sCisJe1BDQl9OQU1FX09GRlNFVCwJCVBDQl9OQU1FX0xFTn0sCisJe0ZPUk1fT0ZGU0VULAkJCUZPUk1fTEVOfSwKKwl7VkVSU0lPTl9PRkZTRVQsCQlWRVJTSU9OX0xFTn0sCisJe0lERU5USUZJQ0FUSU9OX05VTUJFUl9PRkZTRVQsCUlERU5USUZJQ0FUSU9OX05VTUJFUl9MRU59LAorCXtNQUpPUl9TV19WRVJTSU9OX09GRlNFVCwJTUFKT1JfU1dfVkVSU0lPTl9MRU59LAorCXtNSU5PUl9TV19WRVJTSU9OX09GRlNFVCwJTUlOT1JfU1dfVkVSU0lPTl9MRU59LAorfTsKKworCisvKiBIVyBJRCBkYXRhIGZvdW5kIGluIEVFUFJPTSBvbiBzdXBwb3J0ZWQgbW9kdWxlcyAqLworc3RhdGljIGNoYXIgKmNtMV9xYV9od19pZFtIV19JRF9FTEVNX0NPVU5UXSA9IHsKKwkiQ00iLAkJLyogREVWSUNFX05BTUUgKi8KKwkiMSIsCQkvKiBHRU5FUkFUSU9OICovCisJIkNNMSIsCQkvKiBQQ0JfTkFNRSAqLworCSJRIiwJCS8qIEZPUk0gKi8KKwkiQSIsCQkvKiBWRVJTSU9OICovCisJIjU5MTg4MSIsCS8qIElERU5USUZJQ0FUSU9OX05VTUJFUiAqLworCSIiLAkJLyogTUFKT1JfU1dfVkVSU0lPTiAqLworCSIiLAkJLyogTUlOT1JfU1dfVkVSU0lPTiAqLworfTsKKworc3RhdGljIGNoYXIgKmNtMTFfcWFfaHdfaWRbSFdfSURfRUxFTV9DT1VOVF0gPSB7CisJIkNNIiwJCS8qIERFVklDRV9OQU1FICovCisJIjEiLAkJLyogR0VORVJBVElPTiAqLworCSJDTTExIiwJCS8qIFBDQl9OQU1FICovCisJIlEiLAkJLyogRk9STSAqLworCSJBIiwJCS8qIFZFUlNJT04gKi8KKwkiNTk0MjAwIiwJLyogSURFTlRJRklDQVRJT05fTlVNQkVSICovCisJIiIsCQkvKiBNQUpPUl9TV19WRVJTSU9OICovCisJIiIsCQkvKiBNSU5PUl9TV19WRVJTSU9OICovCit9OworCitzdGF0aWMgY2hhciAqY211MV9xYV9od19pZFtIV19JRF9FTEVNX0NPVU5UXSA9IHsKKwkiQ01VIiwJCS8qIERFVklDRV9OQU1FICovCisJIjEiLAkJLyogR0VORVJBVElPTiAqLworCSJDTVUxIiwJCS8qIFBDQl9OQU1FICovCisJIlEiLAkJLyogRk9STSAqLworCSJBIiwJCS8qIFZFUlNJT04gKi8KKwkiNTk0MTI4IiwJLyogSURFTlRJRklDQVRJT05fTlVNQkVSICovCisJIiIsCQkvKiBNQUpPUl9TV19WRVJTSU9OICovCisJIiIsCQkvKiBNSU5PUl9TV19WRVJTSU9OICovCit9OworCisKKy8qIGxpc3Qgb2Yga25vd24gbW9kdWxlcyAqLworc3RhdGljIGNoYXIgKipod19pZF9saXN0W10gPSB7CisJY20xX3FhX2h3X2lkLAorCWNtMTFfcWFfaHdfaWQsCisJY211MV9xYV9od19pZCwKK307CisKKy8qIGluZGljZXMgdG8gdGhlIGFib3ZlIGxpc3QgLSBrZWVwIGluIHN5bmMgKi8KK2VudW0geworCUNNMV9RQSwKKwlDTTExX1FBLAorCUNNVTFfUUEsCit9OworCisKKy8qIGlkZW50aWZ5IG1vZHVsZXMgYmFzZWQgb24gdGhlc2UgaHcgaWQgZWxlbWVudHMgKi8KK3N0YXRpYyBpbnQgaHdfaWRfaWRlbnRpZnlbXSA9IHsKKwlQQ0JfTkFNRSwKKwlGT1JNLAorCVZFUlNJT04sCit9OworCisKKy8qIFJlZ2lzdGVycycgc2V0dGluZ3MgZm9yIFNEUkFNIGNvbnRyb2xsZXIgaW50aWFsaXphdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVsb25nIG1vZGU7CisJdWxvbmcgY29udHJvbDsKKwl1bG9uZyBjb25maWcxOworCXVsb25nIGNvbmZpZzI7Cit9IG1lbV9jb25mX3Q7CisKK3N0YXRpYyBtZW1fY29uZl90IGs0czU2MTYzMkUgPSB7CisJMHgwMENEMDAwMCwgICAgICAvKiBDQVNMIDMsIGJ1cnN0IGxlbmd0aCA4ICovCisJMHg1MTRGMDAwMCwKKwkweEUyMzMzOTAwLAorCTB4OEVFNzAwMDAKK307CisKK3N0YXRpYyBtZW1fY29uZl90IG10NDhsYzMybTE2YTIgPSB7CisJMHgwMENEMDAwMCwgICAgICAvKiBDQVNMIDMsIGJ1cnN0IGxlbmd0aCA4ICovCisJMHg1MTRGMDAwMCwKKwkweEQyMzIyODAwLAorCTB4OEFENzAwMDAKK307CisKK3N0YXRpYyBtZW1fY29uZl90KiBtZW1vcnlfY29uZmlnW10gPSB7CisJJms0czU2MTYzMkUsCisJJm10NDhsYzMybTE2YTIKK307CisKKyNlbmRpZiAvKiBfQ001MjAwX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2NtNTIwMC9jbWRfY201MjAwLmMgYi9ib2FyZC9jbTUyMDAvY21kX2NtNTIwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxM2MzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9jbTUyMDAvY21kX2NtNTIwMC5jCkBAIC0wLDAgKzEsNDQ4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3IE1hcmt1cyBLYXBwZWxlciA8bWFya3VzLmthcHBlbGVyQG9iamVjdHhwLmNvbT4KKyAqCisgKiBBZGFwdGVkIGZvciBVLUJvb3QgMS4yIGJ5IFBpb3RyIEtydXN6eW5za2kgPHBwa0BzZW1paGFsZi5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxpMmMuaD4KKyNpbmNsdWRlIDx1c2IuaD4KKworI2lmZGVmIENPTkZJR19DTURfQlNCCisKK2ludCBkb19pMmMoY2hhciAqYXJndltdKQoreworCXVuc2lnbmVkIGNoYXIgdGVtcCwgdGVtcDE7CisKKwlwcmludGYoIlN0YXJ0aW5nIEkyQyBUZXN0XG4iCisJCSJQbGVhc2Ugc2V0IEp1bXBlcjpcbkkyQyBTREEgMi0zXG5JMkMgU0NMIDItM1xuXG4iCisJCSJQbGVhc2UgcHJlc3MgYW55IGtleSB0byBzdGFydFxuXG4iKTsKKwlnZXRjKCk7CisKKwl0ZW1wID0gMHhmMDsgLyogc2V0IGlvIDAtNCBhcyBvdXRwdXQgKi8KKwlpMmNfd3JpdGUoQ0ZHX0kyQ19JTywgMywgMSwgKHVjaGFyICopJnRlbXAsIDEpOworCisJcHJpbnRmKCJQcmVzcyBJMkM0LTcuIExFRCBJMkMwLTMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgc3RhdGVcblxuIgorCQkiUHJlc3MgYW55IGtleSB0byBzdG9wXG5cbiIpOworCisJd2hpbGUgKCF0c3RjKCkpIHsKKwkJaTJjX3JlYWQoQ0ZHX0kyQ19JTywgMCwgMSwgKHVjaGFyICopJnRlbXAsIDEpOworCQl0ZW1wMSA9ICh0ZW1wID4+IDQpICYgMHgwMzsKKwkJdGVtcDEgfD0gKHRlbXAgPj4gMykgJiAweDA4OyAvKiBTMzAyIC0+IExFRDMwMyAqLworCQl0ZW1wMSB8PSAodGVtcCA+PiA1KSAmIDB4MDQ7IC8qIFMzMDMgLT4gTEVEMzAyICovCisJCXRlbXAgPSB0ZW1wMTsKKwkJaTJjX3dyaXRlKENGR19JMkNfSU8sIDEsIDEsICh1Y2hhciAqKSZ0ZW1wLCAxKTsKKwl9CisJZ2V0YygpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkb191c2J0ZXN0KGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaTsKKwlzdGF0aWMgaW50IHVzYl9zdG9yX2N1cnJfZGV2ID0gLTE7IC8qIGN1cnJlbnQgZGV2aWNlICovCisKKwlwcmludGYoIlN0YXJ0aW5nIFVTQiBUZXN0XG4iCisJCSJQbGVhc2UgaW5zZXJ0IFVTQiBNZW1tb3J5IFN0aWNrXG5cbiIKKwkJIlBsZWFzZSBwcmVzcyBhbnkga2V5IHRvIHN0YXJ0XG5cbiIpOworCWdldGMoKTsKKworCXVzYl9zdG9wKCk7CisJcHJpbnRmKCIoUmUpc3RhcnQgVVNCLi4uXG4iKTsKKwlpID0gdXNiX2luaXQoKTsKKyNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0UKKwkJLyogdHJ5IHRvIHJlY29nbml6ZSBzdG9yYWdlIGRldmljZXMgaW1tZWRpYXRlbHkgKi8KKwkJaWYgKGkgPj0gMCkKKwkJCXVzYl9zdG9yX2N1cnJfZGV2ID0gdXNiX3N0b3Jfc2NhbigxKTsKKyNlbmRpZiAvKiBDT05GSUdfVVNCX1NUT1JBR0UgKi8KKwlpZiAodXNiX3N0b3JfY3Vycl9kZXYgPj0gMCkKKwkJcHJpbnRmKCJGb3VuZCBVU0IgU3RvcmFnZSBEZXYgY29udGludWUgd2l0aCBUZXN0Li4uXG4iKTsKKwllbHNlIHsKKwkJcHJpbnRmKCJObyBVU0IgU3RvcmFnZSBEZXZpY2UgZGV0ZWN0ZWQuLiBTdG9wIFRlc3RcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwl1c2Jfc3Rvcl9pbmZvKCk7CisKKwlwcmludGYoInN0b3BwaW5nIFVTQi4uXG4iKTsKKwl1c2Jfc3RvcCgpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkb19sZWQoY2hhciAqYXJndltdKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgbXBjNXh4eF9ncHRfMF83ICpncHQgPSAoc3RydWN0IG1wYzV4eHhfZ3B0XzBfNyAqKU1QQzVYWFhfR1BUOworCisJcHJpbnRmKCJTdGFydGluZyBMRUQgVGVzdFxuIgorCQkiUGxlYXNlIHNldCBTd2l0Y2ggUzUwMCBhbGwgb2ZmXG5cbiIKKwkJIlBsZWFzZSBwcmVzcyBhbnkga2V5IHRvIHN0YXJ0XG5cbiIpOworCWdldGMoKTsKKworCS8qIGNvbmZpZ3VyZSB0aW1lciAyLTMgZm9yIHNpbXBsZSBHUElPIG91dHB1dCBIaWdoICovCisJZ3B0LT5ncHQyLmVtc3IgfD0gMHgwMDAwMDAzNDsKKwlncHQtPmdwdDMuZW1zciB8PSAweDAwMDAwMDM0OworCisJKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19FTkFCTEUpIHw9IDB4ODAwMDAwMDA7CisJKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19ESVIpIHw9IDB4ODAwMDAwMDA7CisJcHJpbnRmKCJQbGVhc2UgcHJlc3MgYW55IGtleSB0byBzdG9wXG5cbiIpOworCXdoaWxlICghdHN0YygpKSB7CisJCWlmIChpID09IDEpIHsKKwkJCSgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fREFUQV9PKSB8PSAweDgwMDAwMDAwOworCQkJZ3B0LT5ncHQyLmVtc3IgJj0gfjB4MDAwMDAwMTA7CisJCQlncHQtPmdwdDMuZW1zciAmPSB+MHgwMDAwMDAxMDsKKwkJfSBlbHNlIGlmIChpID09IDIpIHsKKwkJCSgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fREFUQV9PKSAmPSB+MHg4MDAwMDAwMDsKKwkJCWdwdC0+Z3B0Mi5lbXNyICY9IH4weDAwMDAwMDEwOworCQkJZ3B0LT5ncHQzLmVtc3IgfD0gMHgwMDAwMDAxMDsKKwkJfSBlbHNlIGlmIChpID49IDMpIHsKKwkJCSgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fREFUQV9PKSAmPSB+MHg4MDAwMDAwMDsKKwkJCWdwdC0+Z3B0My5lbXNyICY9IH4weDAwMDAwMDEwOworCQkJZ3B0LT5ncHQyLmVtc3IgfD0gMHgwMDAwMDAxMDsKKwkJCWkgPSAwOworCQl9CisJCWkrKzsKKwkJdWRlbGF5KDIwMDAwMCk7CisJfQorCWdldGMoKTsKKworCSgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fREFUQV9PKSB8PSAweDgwMDAwMDAwOworCWdwdC0+Z3B0Mi5lbXNyIHw9IDB4MDAwMDAwMTA7CisJZ3B0LT5ncHQzLmVtc3IgfD0gMHgwMDAwMDAxMDsKKworCXJldHVybiAwOworfQorCitpbnQgZG9fcnMyMzIoY2hhciAqYXJndltdKQoreworCWludCBlcnJvcl9zdGF0dXMgPSAwOworCXN0cnVjdCBtcGM1eHh4X2dwaW8gKmdwaW8gPSAoc3RydWN0IG1wYzV4eHhfZ3BpbyAqKU1QQzVYWFhfR1BJTzsKKwlzdHJ1Y3QgbXBjNXh4eF9wc2MgKnBzYzEgPSAoc3RydWN0IG1wYzV4eHhfcHNjICopTVBDNVhYWF9QU0MxOworCisJLyogQ29uZmlndXJlIFBTQyAyLTMtNiBhcyBHUElPICovCisJZ3Bpby0+cG9ydF9jb25maWcgJj0gMHhGRjBGRjgwRjsKKworCXN3aXRjaCAoc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTApKSB7CisJY2FzZSAxOgorCQkvKiBjaGVjayBSVFMgPC0+IENUUyBsb29wICovCisJCS8qIHNldCBydHMgdG8gMCAqLworCQlwcmludGYoIlVhcnQgMSB0ZXN0OiBSWCBUWCB0ZXN0ZWQgYnkgdXNpbmcgVS1Cb290XG4iCisJCQkiUGxlYXNlIGNvbm5lY3QgUlRTIHdpdGggQ1RTIG9uIFVhcnQxIHBsdWdcblxuIgorCQkJIlByZXNzIGFueSBrZXkgdG8gc3RhcnRcblxuIik7CisJCWdldGMoKTsKKworCQlwc2MxLT5vcDEgfD0gMHgwMTsKKworCQkvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVxdWVzdGluZyBzdGF0dXMgKi8KKwkJdWRlbGF5KDEwKTsKKworCQkvKiBjaGVjayBzdGF0dXMgYXQgY3RzICovCisJCWlmICgocHNjMS0+aXAgJiAweDAxKSAhPSAwKSB7CisJCQllcnJvcl9zdGF0dXMgPSAzOworCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl8xLCBjdHMgc3RhdHVzIGlzICVkICIKKwkJCQkiKHNob3VsZCBiZSAwKVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIChwc2MxLT5pcCAmIDB4MDEpKTsKKwkJfQorCisJCS8qIHNldCBydHMgdG8gMSAqLworCQlwc2MxLT5vcDAgfD0gMHgwMTsKKworCQkvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVxdWVzdGluZyBzdGF0dXMgKi8KKwkJdWRlbGF5KDEwKTsKKworCQkvKiBjaGVjayBzdGF0dXMgYXQgY3RzICovCisJCWlmICgocHNjMS0+aXAgJiAweDAxKSAhPSAxKSB7CisJCQllcnJvcl9zdGF0dXMgPSAzOworCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl8xLCBjdHMgc3RhdHVzIGlzICVkICIKKwkJCQkiKHNob3VsZCBiZSAxKVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIChwc2MxLT5pcCAmIDB4MDEpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDI6CisJCS8qIHNldCBQU0MyXzAsIFBTQzJfMiBhcyBvdXRwdXQgYW5kIFBTQzJfMSwgUFNDMl8zIGFzIGlucHV0ICovCisJCXByaW50ZigiVWFydCAyIHRlc3Q6IFBsZWFzZSB1c2UgUlMyMzIgTG9vcGJhY2sgcGx1ZyBvbiBVQVJUMlxuIgorCQkJIlxuUHJlc3MgYW55IGtleSB0byBzdGFydFxuXG4iKTsKKwkJZ2V0YygpOworCisJCWdwaW8tPnNpbXBsZV9ncGlvZSAmPSB+KDB4MDAwMDAwRjApOworCQlncGlvLT5zaW1wbGVfZ3Bpb2UgfD0gMHgwMDAwMDBGMDsKKwkJZ3Bpby0+c2ltcGxlX2RkciAmPSB+KDB4MDAwMDAwRjApOworCQlncGlvLT5zaW1wbGVfZGRyIHw9IDB4MDAwMDAwNTA7CisKKwkJLyogY2hlY2sgVFhEIDwtPiBSWEQgbG9vcCAqLworCQkvKiBzZXQgVFhEIHRvIDEgKi8KKwkJZ3Bpby0+c2ltcGxlX2R2byB8PSAoMSA8PCA0KTsKKworCQkvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVxdWVzdGluZyBzdGF0dXMgKi8KKwkJdWRlbGF5KDEwKTsKKworCQlpZiAoKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDAyMCkgIT0gMHgwMDAwMDAyMCkgeworCQkJZXJyb3Jfc3RhdHVzID0gMjsKKwkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfMiwgcnhkIHN0YXR1cyBpcyAlZCAiCisJCQkJIihzaG91bGQgYmUgMSlcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwMDIwKSA+PiA1KTsKKwkJfQorCisJCS8qIHNldCBUWEQgdG8gMCAqLworCQlncGlvLT5zaW1wbGVfZHZvICY9IH4oMSA8PCA0KTsKKworCQkvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVxdWVzdGluZyBzdGF0dXMgKi8KKwkJdWRlbGF5KDEwKTsKKworCQlpZiAoKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDAyMCkgIT0gMHgwMDAwMDAwMCkgeworCQkJZXJyb3Jfc3RhdHVzID0gMjsKKwkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfMiwgcnhkIHN0YXR1cyBpcyAlZCAiCisJCQkJIihzaG91bGQgYmUgMClcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwMDIwKSA+PiA1KTsKKwkJfQorCisJCS8qIGNoZWNrIFJUUyA8LT4gQ1RTIGxvb3AgKi8KKwkJLyogc2V0IFJUUyB0byAxICovCisJCWdwaW8tPnNpbXBsZV9kdm8gfD0gKDEgPDwgNik7CisKKwkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCisJCXVkZWxheSgxMCk7CisKKwkJaWYgKChncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAwODApICE9IDB4MDAwMDAwODApIHsKKwkJCWVycm9yX3N0YXR1cyA9IDM7CisJCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzIsIGN0cyBzdGF0dXMgaXMgJWQgIgorCQkJCSIoc2hvdWxkIGJlIDEpXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDA4MCkgPj4gNyk7CisJCX0KKworCQkvKiBzZXQgUlRTIHRvIDAgKi8KKwkJZ3Bpby0+c2ltcGxlX2R2byAmPSB+KDEgPDwgNik7CisKKwkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCisJCXVkZWxheSgxMCk7CisKKwkJaWYgKChncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAwODApICE9IDB4MDAwMDAwMDApIHsKKwkJCWVycm9yX3N0YXR1cyA9IDM7CisJCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzIsIGN0cyBzdGF0dXMgaXMgJWQgIgorCQkJCSIoc2hvdWxkIGJlIDApXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDA4MCkgPj4gNyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAzOgorCQkvKiBzZXQgUFNDM18wLCBQU0MzXzIgYXMgb3V0cHV0IGFuZCBQU0MzXzEsIFBTQzNfMyBhcyBpbnB1dCAqLworCQlwcmludGYoIlVhcnQgMyB0ZXN0OiBQbGVhc2UgdXNlIFJTMjMyIExvb3BiYWNrIHBsdWcgb24gVUFSVDJcbiIKKwkJCSJcblByZXNzIGFueSBrZXkgdG8gc3RhcnRcblxuIik7CisJCWdldGMoKTsKKworCQlncGlvLT5zaW1wbGVfZ3Bpb2UgJj0gfigweDAwMDAwRjAwKTsKKwkJZ3Bpby0+c2ltcGxlX2dwaW9lIHw9IDB4MDAwMDBGMDA7CisKKwkJZ3Bpby0+c2ltcGxlX2RkciAmPSB+KDB4MDAwMDBGMDApOworCQlncGlvLT5zaW1wbGVfZGRyIHw9IDB4MDAwMDA1MDA7CisKKwkJLyogY2hlY2sgVFhEIDwtPiBSWEQgbG9vcCAqLworCQkvKiBzZXQgVFhEIHRvIDEgKi8KKwkJZ3Bpby0+c2ltcGxlX2R2byB8PSAoMSA8PCA4KTsKKworCQkvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVxdWVzdGluZyBzdGF0dXMgKi8KKwkJdWRlbGF5KDEwKTsKKworCQlpZiAoKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDIwMCkgIT0gMHgwMDAwMDIwMCkgeworCQkJZXJyb3Jfc3RhdHVzID0gMjsKKwkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfMywgcnhkIHN0YXR1cyBpcyAlZCAiCisJCQkJIihzaG91bGQgYmUgMSlcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwMjAwKSA+PiA5KTsKKwkJfQorCisJCS8qIHNldCBUWEQgdG8gMCAqLworCQlncGlvLT5zaW1wbGVfZHZvICY9IH4oMSA8PCA4KTsKKworCQkvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVxdWVzdGluZyBzdGF0dXMgKi8KKwkJdWRlbGF5KDEwKTsKKworCQlpZiAoKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDIwMCkgIT0gMHgwMDAwMDAwMCkgeworCQkJZXJyb3Jfc3RhdHVzID0gMjsKKwkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfMywgcnhkIHN0YXR1cyBpcyAlZCAiCisJCQkJIihzaG91bGQgYmUgMClcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwMjAwKSA+PiA5KTsKKwkJfQorCisJCS8qIGNoZWNrIFJUUyA8LT4gQ1RTIGxvb3AgKi8KKwkJLyogc2V0IFJUUyB0byAxICovCisJCWdwaW8tPnNpbXBsZV9kdm8gfD0gKDEgPDwgMTApOworCisJCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLworCQl1ZGVsYXkoMTApOworCisJCWlmICgoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwODAwKSAhPSAweDAwMDAwODAwKSB7CisJCQllcnJvcl9zdGF0dXMgPSAzOworCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl8zLCBjdHMgc3RhdHVzIGlzICVkICIKKwkJCQkiKHNob3VsZCBiZSAxKVxuIiwgX19GVU5DVElPTl9fLAorCQkJCShncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDA4MDApID4+IDExKTsKKwkJfQorCisJCS8qIHNldCBSVFMgdG8gMCAqLworCQlncGlvLT5zaW1wbGVfZHZvICY9IH4oMSA8PCAxMCk7CisKKwkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCisJCXVkZWxheSgxMCk7CisKKwkJaWYgKChncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDA4MDApICE9IDB4MDAwMDAwMDApIHsKKwkJCWVycm9yX3N0YXR1cyA9IDM7CisJCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzMsIGN0cyBzdGF0dXMgaXMgJWQgIgorCQkJCSIoc2hvdWxkIGJlIDApXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDgwMCkgPj4gMTEpOworCQl9CisJCWJyZWFrOworCWNhc2UgNDoKKwkJLyogc2V0IFBTQzZfMiwgUFNDNl8zIGFzIG91dHB1dCBhbmQgUFNDNl8wLCBQU0M2XzEgYXMgaW5wdXQgKi8KKwkJcHJpbnRmKCJVYXJ0IDQgdGVzdDogUGxlYXNlIHVzZSBSUzIzMiBMb29wYmFjayBwbHVnIG9uIFVBUlQyXG4iCisJCQkiXG5QcmVzcyBhbnkga2V5IHRvIHN0YXJ0XG5cbiIpOworCQlnZXRjKCk7CisKKwkJZ3Bpby0+c2ltcGxlX2dwaW9lICY9IH4oMHhGMDAwMDAwMCk7CisJCWdwaW8tPnNpbXBsZV9ncGlvZSB8PSAweDMwMDAwMDAwOworCisJCWdwaW8tPnNpbXBsZV9kZHIgJj0gfigweGYwMDAwMDAwKTsKKwkJZ3Bpby0+c2ltcGxlX2RkciB8PSAweDMwMDAwMDAwOworCisJCSgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fRU5BQkxFKSB8PSAweDMwMDAwMDAwOworCQkoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RJUikgJj0gfigweDMwMDAwMDAwKTsKKworCQkvKiBjaGVjayBUWEQgPC0+IFJYRCBsb29wICovCisJCS8qIHNldCBUWEQgdG8gMSAqLworCQlncGlvLT5zaW1wbGVfZHZvIHw9ICgxIDw8IDI4KTsKKworCQkvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVxdWVzdGluZyBzdGF0dXMgKi8KKwkJdWRlbGF5KDEwKTsKKworCQlpZiAoKCgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fREFUQV9JKSAmIDB4MTAwMDAwMDApICE9CisJCQkJMHgxMDAwMDAwMCkgeworCQkJZXJyb3Jfc3RhdHVzID0gMjsKKwkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfNCwgcnhkIHN0YXR1cyBpcyAlZCAiCisJCQkJIihzaG91bGQgYmUgMSlcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkoKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19EQVRBX0kpICYKKwkJCQkJMHgxMDAwMDAwMCkgPj4gMjgpOworCQl9CisKKwkJLyogc2V0IFRYRCB0byAwICovCisJCWdwaW8tPnNpbXBsZV9kdm8gJj0gfigxIDw8IDI4KTsKKworCQkvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVxdWVzdGluZyBzdGF0dXMgKi8KKwkJdWRlbGF5KDEwKTsKKworCQlpZiAoKCgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fREFUQV9JKSAmIDB4MTAwMDAwMDApICE9CisJCQkJMHgwMDAwMDAwMCkgeworCQkJZXJyb3Jfc3RhdHVzID0gMjsKKwkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfNCwgcnhkIHN0YXR1cyBpcyAlZCAiCisJCQkJIihzaG91bGQgYmUgMClcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkoKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19EQVRBX0kpICYKKwkJCQkJMHgxMDAwMDAwMCkgPj4gMjgpOworCQl9CisKKwkJLyogY2hlY2sgUlRTIDwtPiBDVFMgbG9vcCAqLworCQkvKiBzZXQgUlRTIHRvIDEgKi8KKwkJZ3Bpby0+c2ltcGxlX2R2byB8PSAoMSA8PCAyOSk7CisKKwkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCisJCXVkZWxheSgxMCk7CisKKwkJaWYgKCgoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfSSkgJiAweDIwMDAwMDAwKSAhPQorCQkJCTB4MjAwMDAwMDApIHsKKwkJCWVycm9yX3N0YXR1cyA9IDM7CisJCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzQsIGN0cyBzdGF0dXMgaXMgJWQgIgorCQkJCSIoc2hvdWxkIGJlIDEpXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJKCgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fREFUQV9JKSAmCisJCQkJCTB4MjAwMDAwMDApID4+IDI5KTsKKwkJfQorCisJCS8qIHNldCBSVFMgdG8gMCAqLworCQlncGlvLT5zaW1wbGVfZHZvICY9IH4oMSA8PCAyOSk7CisKKwkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCisJCXVkZWxheSgxMCk7CisKKwkJaWYgKCgoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfSSkgJiAweDIwMDAwMDAwKSAhPQorCQkJCTB4MDAwMDAwMDApIHsKKwkJCWVycm9yX3N0YXR1cyA9IDM7CisJCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzQsIGN0cyBzdGF0dXMgaXMgJWQgIgorCQkJCSIoc2hvdWxkIGJlIDApXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJKCgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fREFUQV9JKSAmCisJCQkJCTB4MjAwMDAwMDApID4+IDI5KTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIiVzOiBpbnZhbGlkIHJzMjMyIG51bWJlciAlc1xuIiwgX19GVU5DVElPTl9fLCBhcmd2WzJdKTsKKwkJZXJyb3Jfc3RhdHVzID0gMTsKKwkJYnJlYWs7CisJfQorCWdwaW8tPnBvcnRfY29uZmlnIHw9IChDRkdfR1BTX1BPUlRfQ09ORklHICYgMHhGRjBGRjgwRik7CisKKwlyZXR1cm4gZXJyb3Jfc3RhdHVzOworfQorCitpbnQgY21kX2ZrdChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgcmNvZGUgPSAtMTsKKworCXN3aXRjaCAoYXJnYykgeworCWNhc2UgMjoKKwkJaWYgKHN0cm5jbXAoYXJndlsxXSwgImkyYyIsIDMpID09IDApCisJCQlyY29kZSA9IGRvX2kyYyhhcmd2KTsKKwkJZWxzZSBpZiAoc3RybmNtcChhcmd2WzFdLCAibGVkIiwgMykgPT0gMCkKKwkJCXJjb2RlID0gZG9fbGVkKGFyZ3YpOworCQllbHNlIGlmIChzdHJuY21wKGFyZ3ZbMV0sICJ1c2IiLCAzKSA9PSAwKQorCQkJcmNvZGUgPSBkb191c2J0ZXN0KGFyZ3YpOworCQlicmVhazsKKwljYXNlIDM6CisJCWlmIChzdHJuY21wKGFyZ3ZbMV0sICJyczIzMiIsIDMpID09IDApCisJCQlyY29kZSA9IGRvX3JzMjMyKGFyZ3YpOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHJjb2RlKSB7CisJY2FzZSAtMToKKwkJcHJpbnRmKCJVc2FnZTpcbiIKKwkJCSJma3QgeyBpMmMgfCBsZWQgfCB1c2IgfVxuIgorCQkJImZrdCByczIzMiBudW1iZXJcbiIpOworCQlyY29kZSA9IDE7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJcHJpbnRmKCJUZXN0IHBhc3NlZFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiVGVzdCBmYWlsZWQgd2l0aCBjb2RlOiAlZFxuIiwgcmNvZGUpOworCX0KKworCXJldHVybiByY29kZTsKK30KKworVV9CT09UX0NNRCgKKwlma3QsCTQsCTEsCWNtZF9ma3QsCisJImZrdCAgICAgLSBGdW5jdGlvbiB0ZXN0IHJvdXRpbmVzXG4iLAorCSJpMmNcbiIKKwkiICAgICAtIFRlc3QgSTJDIGNvbW11bmljYXRpb25cbiIKKwkiZmt0IGxlZFxuIgorCSIgICAgIC0gVGVzdCBMRURzXG4iCisJImZrdCByczIzMiBudW1iZXJcbiIKKwkiICAgICAtIFRlc3QgUlMyMzIgKGxvb3BiYWNrIHBsdWcocykgZm9yIFJTMjMyIHJlcXVpcmVkKVxuIgorCSJma3QgdXNiXG4iCisJIiAgICAgLSBUZXN0IFVTQiBjb21tdW5pY2F0aW9uXG4iCispOworI2VuZGlmIC8qIENPTkZJR19DTURfQlNQICovCmRpZmYgLS1naXQgYS9ib2FyZC9jbTFfcXAxL2NvbmZpZy5tayBiL2JvYXJkL2NtNTIwMC9jb25maWcubWsKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJvYXJkL2NtMV9xcDEvY29uZmlnLm1rCnJlbmFtZSB0byBib2FyZC9jbTUyMDAvY29uZmlnLm1rCmRpZmYgLS1naXQgYS9ib2FyZC9jbTUyMDAvZnd1cGRhdGUuYyBiL2JvYXJkL2NtNTIwMC9md3VwZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YWE5NGEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9jbTUyMDAvZnd1cGRhdGUuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNyBTY2hpbmRsZXIgTGlmdCBJbmMuCisgKiAoQykgQ29weXJpZ2h0IDIwMDcgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZworICoKKyAqIEF1dGhvcjogTWljaGVsIE1hcnRpIDxtbWFAb2JqZWN0eHAuY29tPgorICogQWRhcHRlZCBmb3IgVS1Cb290IDEuMiBieSBQaW90ciBLcnVzenluc2tpIDxwcGtAc2VtaWhhbGYuY29tPjoKKyAqICAgLSBjb2RlIGNsZWFuLXVwCisgKiAgIC0gYnVnZml4IGZvciBvdmVyd3JpdGluZyBib290YXJncyBieSB1c2VyCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxpbWFnZS5oPgorI2luY2x1ZGUgPHVzYi5oPgorI2luY2x1ZGUgPGZhdC5oPgorCisjaW5jbHVkZSAiZnd1cGRhdGUuaCIKKworZXh0ZXJuIGludCBkb19ib290bShjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKK2V4dGVybiBsb25nIGRvX2ZhdF9yZWFkKGNvbnN0IGNoYXIgKiwgdm9pZCAqLCB1bnNpZ25lZCBsb25nLCBpbnQpOworZXh0ZXJuIGludCBkb19mYXRfZnNsb2FkKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pOworCitzdGF0aWMgaW50IGxvYWRfcmVzY3VlX2ltYWdlKHVsb25nKTsKKwordm9pZCBjbTUyMDBfZnd1cGRhdGUodm9pZCkKK3sKKwljbWRfdGJsX3QgKmJjbWQ7CisJY2hhciAqcnNhcmdzOworCWNoYXIgKnRtcCA9IE5VTEw7CisJY2hhciBrYVsxNl07CisJY2hhciAqYXJndlszXSA9IHsgImJvb3RtIiwga2EsIE5VTEwgfTsKKworCS8qIENoZWNrIGlmIHJlc2N1ZSBzeXN0ZW0gaXMgZGlzYWJsZWQuLi4gKi8KKwlpZiAoZ2V0ZW52KCJub3Jlc2N1ZSIpKSB7CisJCXByaW50ZihMT0dfUFJFRklYICJSZXNjdWUgU3lzdGVtIGRpc2FibGVkLlxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgVVNCIHN0b3JhZ2UgZGV2aWNlIGFuZCBsb2FkIGltYWdlICovCisJaWYgKGxvYWRfcmVzY3VlX2ltYWdlKExPQURfQUREUikpCisJCXJldHVybjsKKworCWJjbWQgPSBmaW5kX2NtZCgiYm9vdG0iKTsKKwlpZiAoIWJjbWQpCisJCXJldHVybjsKKworCXNwcmludGYoa2EsICIlbHgiLCBMT0FEX0FERFIpOworCisJLyogcHJlcGFyZSBvdXIgYm9vdGFyZ3MgKi8KKwlyc2FyZ3MgPSBnZXRlbnYoInJzLWFyZ3MiKTsKKwlpZiAoIXJzYXJncykKKwkJcnNhcmdzID0gUlNfQk9PVEFSR1M7CisJZWxzZSB7CisJCXRtcCA9IG1hbGxvYyhzdHJsZW4ocnNhcmdzKzEpKTsKKwkJaWYgKCF0bXApIHsKKwkJCXByaW50ZihMT0dfUFJFRklYICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJcmV0dXJuOworCQl9CisJCXN0cmNweSh0bXAsIHJzYXJncyk7CisJCXJzYXJncyA9IHRtcDsKKwl9CisKKwlzZXRlbnYoImJvb3RhcmdzIiwgcnNhcmdzKTsKKworCWlmIChyc2FyZ3MgPT0gdG1wKQorCQlmcmVlKHJzYXJncyk7CisKKwlwcmludGYoTE9HX1BSRUZJWCAiU3RhcnRpbmcgdXBkYXRlIHN5c3RlbSAoYm9vdGFyZ3M9JXMpLi4uXG4iLCByc2FyZ3MpOworCWRvX2Jvb3RtKGJjbWQsIDAsIDIsIGFyZ3YpOworfQorCitzdGF0aWMgaW50IGxvYWRfcmVzY3VlX2ltYWdlKHVsb25nIGFkZHIpCit7CisJZGlza19wYXJ0aXRpb25fdCBpbmZvOworCWludCBkZXZubzsKKwlpbnQgcGFydG5vOworCWludCBpOworCWNoYXIgZndkaXJbNjRdOworCWNoYXIgbnhyaVsxMjhdOworCWNoYXIgKnRtcDsKKwljaGFyIGRldls3XTsKKwljaGFyIGFkZHJfc3RyWzE2XTsKKwljaGFyICphcmd2WzZdID0geyAiZmF0bG9hZCIsICJ1c2IiLCBkZXYsIGFkZHJfc3RyLCBueHJpLCBOVUxMIH07CisJYmxvY2tfZGV2X2Rlc2NfdCAqc3Rvcl9kZXYgPSBOVUxMOworCWNtZF90YmxfdCAqYmNtZDsKKworCS8qIEdldCBuYW1lIG9mIGZpcm13YXJlIGRpcmVjdG9yeSAqLworCXRtcCA9IGdldGVudigiZnctZGlyIik7CisKKwkvKiBDb3B5IGl0IGludG8gZndkaXIgKi8KKwlzdHJuY3B5KGZ3ZGlyLCB0bXAgPyB0bXAgOiBGV19ESVIsIHNpemVvZihmd2RpcikpOworCWZ3ZGlyW3NpemVvZihmd2RpcikgLSAxXSA9IDA7IC8qIFRlcm1pbmF0ZSBzdHJpbmcgKi8KKworCXByaW50ZihMT0dfUFJFRklYICJDaGVja2luZyBmb3IgZmlybXdhcmUgaW1hZ2UgZGlyZWN0b3J5ICclcycgb24gVVNCIgorCQkiIHN0b3JhZ2UuLi5cbiIsIGZ3ZGlyKTsKKwl1c2Jfc3RvcCgpOworCWlmICh1c2JfaW5pdCgpICE9IDApCisJCXJldHVybiAxOworCisJLyogQ2hlY2sgZm9yIHN0b3JhZ2UgZGV2aWNlICovCisJaWYgKHVzYl9zdG9yX3NjYW4oMSkgIT0gMCkgeworCQl1c2Jfc3RvcCgpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBEZXRlY3Qgc3RvcmFnZSBkZXZpY2UgKi8KKwlmb3IgKGRldm5vID0gMDsgZGV2bm8gPCBVU0JfTUFYX1NUT1JfREVWOyBkZXZubysrKSB7CisJCXN0b3JfZGV2ID0gdXNiX3N0b3JfZ2V0X2RldihkZXZubyk7CisJCWlmIChzdG9yX2Rldi0+dHlwZSAhPSBERVZfVFlQRV9VTktOT1dOKQorCQkJYnJlYWs7CisJfQorCWlmICghc3Rvcl9kZXYgfHwgc3Rvcl9kZXYtPnR5cGUgPT0gREVWX1RZUEVfVU5LTk9XTikgeworCQlwcmludGYoTE9HX1BSRUZJWCAiTm8gdmFsaWQgc3RvcmFnZSBkZXZpY2UgZm91bmQuLi5cbiIpOworCQl1c2Jfc3RvcCgpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBEZXRlY3QgcGFydGl0aW9uICovCisJZm9yIChwYXJ0bm8gPSAtMSwgaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJaWYgKGdldF9wYXJ0aXRpb25faW5mbyhzdG9yX2RldiwgaSwgJmluZm8pID09IDApIHsKKwkJCWlmIChmYXRfcmVnaXN0ZXJfZGV2aWNlKHN0b3JfZGV2LCBpKSA9PSAwKSB7CisJCQkJLyogQ2hlY2sgaWYgcmVzY3VlIGltYWdlIGlzIHByZXNlbnQgKi8KKwkJCQlGV19ERUJVRygiTG9va2luZyBmb3IgZmlybXdhcmUgZGlyZWN0b3J5ICclcyciCisJCQkJCSIgb24gcGFydGl0aW9uICVkXG4iLCBmd2RpciwgaSk7CisJCQkJaWYgKGRvX2ZhdF9yZWFkKGZ3ZGlyLCBOVUxMLCAwLCBMU19OTykgPT0gLTEpIHsKKwkJCQkJRldfREVCVUcoIk5vIE5YIHJlc2N1ZSBpbWFnZSBvbiAiCisJCQkJCQkicGFydGl0aW9uICVkLlxuIiwgaSk7CisJCQkJCXBhcnRubyA9IC0yOworCQkJCX0gZWxzZSB7CisJCQkJCXBhcnRubyA9IGk7CisJCQkJCUZXX0RFQlVHKCJQYXJ0aXRpb24gJWQgY29udGFpbnMgIgorCQkJCQkJImZpcm13YXJlIGRpcmVjdG9yeVxuIiwgcGFydG5vKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKHBhcnRubyA8IDApIHsKKwkJc3dpdGNoIChwYXJ0bm8pIHsKKwkJY2FzZSAtMToKKwkJCXByaW50ZihMT0dfUFJFRklYICJFcnJvcjogTm8gdmFsaWQgKEZBVCkgcGFydGl0aW9uICIKKwkJCQkiZGV0ZWN0ZWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgLTI6CisJCQlwcmludGYoTE9HX1BSRUZJWCAiRXJyb3I6IE5vIE5YIHJlc2N1ZSBpbWFnZSBvbiBGQVQgIgorCQkJCSJwYXJ0aXRpb25cbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoTE9HX1BSRUZJWCAiRXJyb3I6IEZhaWxlZCB3aXRoIGNvZGUgJWRcbiIsCisJCQkJcGFydG5vKTsKKwkJfQorCQl1c2Jfc3RvcCgpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBMb2FkIHRoZSByZXNjdWUgaW1hZ2UgKi8KKwliY21kID0gZmluZF9jbWQoImZhdGxvYWQiKTsKKwlpZiAoIWJjbWQpIHsKKwkJcHJpbnRmKExPR19QUkVGSVggIkVycm9yIC0gJ2ZhdGxvYWQnIGNvbW1hbmQgbm90IHByZXNlbnQuXG4iKTsKKwkJdXNiX3N0b3AoKTsKKwkJcmV0dXJuIDE7CisJfQorCisJdG1wID0gZ2V0ZW52KCJueC1yZXNjdWUtaW1hZ2UiKTsKKwlzcHJpbnRmKG54cmksICIlcy8lcyIsIGZ3ZGlyLCB0bXAgPyB0bXAgOiBSRVNDVUVfSU1BR0UpOworCXNwcmludGYoZGV2LCAiJWQ6JWQiLCBkZXZubywgcGFydG5vKTsKKwlzcHJpbnRmKGFkZHJfc3RyLCAiJWx4IiwgYWRkcik7CisKKwlGV19ERUJVRygiZmF0X2ZzbG9hZCBkZXZpY2U9JyVzJywgYWRkcj0nJXMnLCBmaWxlOiAlc1xuIiwKKwkJZGV2LCBhZGRyX3N0ciwgbnhyaSk7CisKKwlpZiAoZG9fZmF0X2ZzbG9hZChiY21kLCAwLCA1LCBhcmd2KSAhPSAwKSB7CisJCXVzYl9zdG9wKCk7CisJCXJldHVybiAxOworCX0KKworCS8qIFN0b3AgVVNCICovCisJdXNiX3N0b3AoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2NtNTIwMC9md3VwZGF0ZS5oIGIvYm9hcmQvY201MjAwL2Z3dXBkYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzZjFlMQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2NtNTIwMC9md3VwZGF0ZS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcgU2NoaW5kbGVyIExpZnQgSW5jLgorICoKKyAqIEF1dGhvcjogTWljaGVsIE1hcnRpIDxtbWFAb2JqZWN0eHAuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19GV19VUERBVEVfSAorI2RlZmluZSBfX0ZXX1VQREFURV9ICisKKy8qIERlZmF1bHQgcHJlZml4IGZvciBvdXRwdXQgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTE9HX1BSRUZJWAkiQ001MjAwOiIKKworLyogRXh0cmEgZGVidWcgbWFjcm8gKi8KKyNpZmRlZiBDT05GSUdfRldVUERBVEVfREVCVUcKKyNkZWZpbmUgRldfREVCVUcoZm10Li4uKSBwcmludGYoTE9HX1BSRUZJWCBmbXQpCisjZWxzZQorI2RlZmluZSBGV19ERUJVRyhmbXQuLi4pCisjZW5kaWYKKworLyogTmFtZSBvZiB0aGUgZGlyZWN0b3J5IGhvbGRpbmcgZmlybXdhcmUgaW1hZ2VzICovCisjZGVmaW5lIEZXX0RJUgkJIm54LWZ3IgorI2RlZmluZSBSRVNDVUVfSU1BR0UJIm54cnMuaW1nIgorI2RlZmluZSBMT0FEX0FERFIJMHg0MDAwMDAKKyNkZWZpbmUgUlNfQk9PVEFSR1MJInJhbWRpc2s9ODE5MksiCisKKy8qIE1haW4gZnVuY3Rpb24gZm9yIGZ3dXBkYXRlICovCit2b2lkIGNtNTIwMF9md3VwZGF0ZSh2b2lkKTsKKworI2VuZGlmIC8qIF9fRldfVVBEQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2NtMV9xcDEvdS1ib290LmxkcyBiL2JvYXJkL2NtNTIwMC91LWJvb3QubGRzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBib2FyZC9jbTFfcXAxL3UtYm9vdC5sZHMKcmVuYW1lIHRvIGJvYXJkL2NtNTIwMC91LWJvb3QubGRzCmRpZmYgLS1naXQgYS9ib2FyZC9jbWNfcHUyL2NtY19wdTIuYyBiL2JvYXJkL2NtY19wdTIvY21jX3B1Mi5jCmluZGV4IDlhZTNjNDIuLjM3NGNkMDcgMTAwNjQ0Ci0tLSBhL2JvYXJkL2NtY19wdTIvY21jX3B1Mi5jCisrKyBiL2JvYXJkL2NtY19wdTIvY21jX3B1Mi5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19EUklWRVJfRVRIRVIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogLyoKICAqIE5hbWU6CkBAIC0xNzUsNSArMTc1LDUgQEAKIAlwX3BoeW9wcy0+QXV0b05lZ290aWF0ZSA9IGRtOTE2MV9BdXRvTmVnb3RpYXRlOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogI2VuZGlmCS8qIENPTkZJR19EUklWRVJfRVRIRVIgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2NtaS91LWJvb3QubGRzIGIvYm9hcmQvY21pL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMDNmZWYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvY21pL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQlXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMJTWFydGluIFdpbmlzdG9lcmZlciwgbWFydGlud2luaXN0b2VyZmVyQGdteC5jaAotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgLyogV0FSTklORyAtIHRoZSBmb2xsb3dpbmcgaXMgaGFuZC1vcHRpbWl6ZWQgdG8gZml0IHdpdGhpbgkqLwotICAgIC8qIHRoZSBzZWN0b3IgbGF5b3V0IG9mIG91ciBmbGFzaCBjaGlwcyEJWFhYIEZJWE1FIFhYWAkqLwotCi0gICAgY3B1L21wYzV4eC9zdGFydC5vCSgudGV4dCkKLQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgfQotICBfZXRleHQgPSAuOwotICBQUk9WSURFIChldGV4dCA9IC4pOwotICAucm9kYXRhICAgIDoKLSAgewotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwMEZGKSAmIDB4RkZGRkZGMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+MjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKT4+MjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oMjU2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oMjU2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLS8qICAgLiA9IGVudl9zdGFydDsKLQkucHBjZW52CToKLQl7Ci0JCWNvbW1vbi9lbnZpcm9ubWVudC5vICgucHBjZW52KQotCX0KLSovCi19CmRpZmYgLS1naXQgYS9ib2FyZC9jb2dlbnQvY29uZmlnLm1rIGIvYm9hcmQvY29nZW50L2NvbmZpZy5tawppbmRleCBlZTc3OTM5Li4zNWE1ZWQzIDEwMDY0NAotLS0gYS9ib2FyZC9jb2dlbnQvY29uZmlnLm1rCisrKyBiL2JvYXJkL2NvZ2VudC9jb25maWcubWsKQEAgLTI5LDMgKzI5LDUgQEAKIFRFWFRfQkFTRSA9IDB4ZmZmMDAwMDAKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURURVhUX0JBU0U9JChURVhUX0JBU0UpIC1JJChUT1BESVIpCisKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvYm9hcmQvY29nZW50L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2JvYXJkL2NvZ2VudC9zZXJpYWwuYyBiL2JvYXJkL2NvZ2VudC9zZXJpYWwuYwppbmRleCAyYjU5NWE4Li5kOWMyN2JlIDEwMDY0NAotLS0gYS9ib2FyZC9jb2dlbnQvc2VyaWFsLmMKKysrIGIvYm9hcmQvY29nZW50L3NlcmlhbC5jCkBAIC05MCw3ICs5MCw3IEBACiAKICNlbmRpZiAvKiBDT05TX05PTkUgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpICYmIFwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikgJiYgXAogICAgIGRlZmluZWQoQ09ORklHX0tHREJfTk9ORSkKIAogI2lmIENPTkZJR19LR0RCX0lOREVYID09IENPTkZJR19DT05TX0lOREVYCmRpZmYgLS1naXQgYS9ib2FyZC9jb2dlbnQvdS1ib290LmxkcyBiL2JvYXJkL2NvZ2VudC91LWJvb3QubGRzCmluZGV4IDVjZTI2OTQuLmQ4N2EzOWIgMTAwNjQ0Ci0tLSBhL2JvYXJkL2NvZ2VudC91LWJvb3QubGRzCisrKyBiL2JvYXJkL2NvZ2VudC91LWJvb3QubGRzCkBAIC01NSw3ICs1NSw2IEBACiAgIHsKICAgICAqKC50ZXh0KQogICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KQotICAgICooLmZpeHVwKQogICAgICooLmdvdDEpCiAgIH0KICAgX2V0ZXh0ID0gLjsKZGlmZiAtLWdpdCBhL2JvYXJkL2NwYzQ1L2NwYzQ1LmMgYi9ib2FyZC9jcGM0NS9jcGM0NS5jCmluZGV4IDUxYjAwODUuLjc5ZWI0NzMgMTAwNjQ0Ci0tLSBhL2JvYXJkL2NwYzQ1L2NwYzQ1LmMKKysrIGIvYm9hcmQvY3BjNDUvY3BjNDUuYwpAQCAtMjQwLDcgKzI0MCw3IEBACiAJcmV0dXJuICgwKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogCiAjaWZkZWYgQ0ZHX1BDTUNJQV9NRU1fQUREUgogdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqcGNtY2lhX21lbSA9ICh1bnNpZ25lZCBjaGFyKilDRkdfUENNQ0lBX01FTV9BRERSOwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAJcmV0dXJuIHJjOwogfQogCi0jZW5kaWYJLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgogCiAjIGlmZGVmIENPTkZJR19JREVfTEVECiB2b2lkIGlkZV9sZWQgKHVjaGFyIGxlZCwgdWNoYXIgc3RhdHVzKQpkaWZmIC0tZ2l0IGEvYm9hcmQvY3BjNDUvcGQ2NzI5MC5jIGIvYm9hcmQvY3BjNDUvcGQ2NzI5MC5jCmluZGV4IDZjYTNlN2IuLmQ4ZjRiZTUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2NwYzQ1L3BkNjcyOTAuYworKysgYi9ib2FyZC9jcGM0NS9wZDY3MjkwLmMKQEAgLTc3Miw3ICs3NzIsNyBAQAogCXJldHVybiByYzsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogaW50IHBjbWNpYV9vZmYgKHZvaWQpCiB7CiAJcHJpbnRmICgiRGlzYWJsZSBQQ01DSUEgIiBQQ01DSUFfU0xPVF9NU0cgIlxuIik7CmRpZmYgLS1naXQgYS9ib2FyZC9jcGM0NS91LWJvb3QubGRzIGIvYm9hcmQvY3BjNDUvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhMjZhYS4uMDAwMDAwMAotLS0gYS9ib2FyZC9jcGM0NS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEtMjAwMwotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubyAoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvdnNwcmludGYubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3psaWIubwkJKC50ZXh0KQotCi0JCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9jcHU4Ni9jcHU4Ni5jIGIvYm9hcmQvY3B1ODYvY3B1ODYuYwppbmRleCAzZWI1YjM1Li4wZWI5NGVmIDEwMDY0NAotLS0gYS9ib2FyZC9jcHU4Ni9jcHU4Ni5jCisrKyBiL2JvYXJkL2NwdTg2L2NwdTg2LmMKQEAgLTMxMiw3ICszMTIsNyBAQAogCXJldHVybiAocHNpemUpOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiBleHRlcm4gdm9pZCBkb2NfcHJvYmUgKHVsb25nIHBoeXNhZHIpOwogdm9pZCBkb2NfaW5pdCAodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2JvYXJkL2NwdTg2L3UtYm9vdC5sZHMgYi9ib2FyZC9jcHU4Ni91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWYyOWM2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL2NwdTg2L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8oLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2NwdTg3L2NwdTg3LmMgYi9ib2FyZC9jcHU4Ny9jcHU4Ny5jCmluZGV4IDlmZWNkZDAuLmEyZmQxOTMgMTAwNjQ0Ci0tLSBhL2JvYXJkL2NwdTg3L2NwdTg3LmMKKysrIGIvYm9hcmQvY3B1ODcvY3B1ODcuYwpAQCAtMzIxLDcgKzMyMSw3IEBACiAJcmV0dXJuIChwc2l6ZSk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIGV4dGVybiB2b2lkIGRvY19wcm9iZSAodWxvbmcgcGh5c2Fkcik7CiB2b2lkIGRvY19pbml0ICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYm9hcmQvY3B1ODcvdS1ib290LmxkcyBiL2JvYXJkL2NwdTg3L3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiN2U2NjUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvY3B1ODcvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxLTIwMDUKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9jc2I2MzcvY3NiNjM3LmMgYi9ib2FyZC9jc2I2MzcvY3NiNjM3LmMKaW5kZXggYWViMWExMy4uZmJjM2M4NyAxMDA2NDQKLS0tIGEvYm9hcmQvY3NiNjM3L2NzYjYzNy5jCisrKyBiL2JvYXJkL2NzYjYzNy9jc2I2MzcuYwpAQCAtNTcsNyArNTcsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9FVEhFUgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAvKgogICogTmFtZToKQEAgLTc3LDUgKzc3LDUgQEAKIAlwX3BoeW9wcy0+QXV0b05lZ290aWF0ZQkgPSBiY201MjIxX0F1dG9OZWdvdGlhdGU7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAjZW5kaWYJLyogQ09ORklHX0RSSVZFUl9FVEhFUiAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvY3U4MjQvdS1ib290LmxkcyBiL2JvYXJkL2N1ODI0L3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZTg1ZTQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvY3U4MjQvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkoLnRleHQpCi0gICAgbGliX3BwYy9ib2FyZC5vICgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy92c3ByaW50Zi5vCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvemxpYi5vCQkoLnRleHQpCi0KLQkJLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAoLnRleHQpCi0KLQkJKigudGV4dCkKLQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2RhdmUvUFBDaGFtZWxlb25FVkIvbmFuZC5jIGIvYm9hcmQvZGF2ZS9QUENoYW1lbGVvbkVWQi9uYW5kLmMKaW5kZXggZjVjM2RkOS4uMDljMGIwNCAxMDA2NDQKLS0tIGEvYm9hcmQvZGF2ZS9QUENoYW1lbGVvbkVWQi9uYW5kLmMKKysrIGIvYm9hcmQvZGF2ZS9QUENoYW1lbGVvbkVWQi9uYW5kLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2luY2x1ZGUgPG5hbmQuaD4KIApAQCAtMTE1LDQgKzExNSw0IEBACiAJbmFuZC0+b3B0aW9ucyA9IE5BTkRfU0FNU1VOR19MUF9PUFRJT05TOwogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2RhdmluY2kvZHYtZXZtL01ha2VmaWxlIGIvYm9hcmQvZGF2aW5jaS9kdi1ldm0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMDEzOAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvZHYtZXZtL01ha2VmaWxlCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworQ09CSlMJOj0gZHZfYm9hcmQubworU09CSlMJOj0gYm9hcmRfaW5pdC5vCisKK1NSQ1MJOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpKQorCiskKExJQik6CSQob2JqKS5kZXBlbmQgJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKSAkKFNPQkpTKQorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAqfiAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhpcyBpcyBmb3IgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL2RhdmluY2kvZHYtZXZtL2JvYXJkX2luaXQuUyBiL2JvYXJkL2RhdmluY2kvZHYtZXZtL2JvYXJkX2luaXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmQ4YWRjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZGF2aW5jaS9kdi1ldm0vYm9hcmRfaW5pdC5TCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogQm9hcmQtc3BlY2lmaWMgbG93IGxldmVsIGluaXRpYWxpemF0aW9uIGNvZGUuIENhbGxlZCBhdCB0aGUgdmVyeSBlbmQKKyAqIG9mIGNwdS9hcm05MjZlanMvZGF2aW5jaS9sb3dsZXZlbF9pbml0LlMuIEp1c3QgcmV0dXJucyBpZiB0aGVyZSBpcyBubworICogaW5pdGlhbGl6YXRpb24gcmVxdWlyZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisuZ2xvYmwJZHZfYm9hcmRfaW5pdAorZHZfYm9hcmRfaW5pdDoKKworCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL2JvYXJkL2RhdmluY2kvZHYtZXZtL2NvbmZpZy5tayBiL2JvYXJkL2RhdmluY2kvZHYtZXZtL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTg5ZDBlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZGF2aW5jaS9kdi1ldm0vY29uZmlnLm1rCkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyCisjIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyMgRGF2aWQgTXVlbGxlciwgRUxTT0ZUIEFHLCA8ZC5tdWVsbGVyQGVsc29mdC5jaD4KKyMKKyMgKEMpIENvcHlyaWdodCAyMDAzCisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMgU3dhbWluYXRoYW4gPHN3YW1pLml5ZXJAdGkuY29tPgorIworIyBEYXZpbmNpIEVWTSBib2FyZCAoQVJNOTI1RUpTKSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cworIworIyBEYXZpbmNpIEVWTSBoYXMgMSBiYW5rIG9mIDI1NiBNQiBERFIgUkFNCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCB0byA5MDAwJzAwMDAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorIworIyBWaXNpb25lZXJpbmcgQ29ycC4gU29uYXRhIGJvYXJkIChBUk05MjZFSlMpIGNwdQorIworIyBTb25hdGEgYm9hcmQgaGFzIDEgYmFuayBvZiAxMjggTUIgRERSIFJBTQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgdG8gODgwMCcwMDAwCisjCisjIFJhem9yc3RyZWFtLCBMTEMuIFNDSE1PT0dJRSBib2FyZCAoQVJNOTI2RUpTKSBjcHUKKyMKKyMgU2NobW9vZ2llIGJvYXJkIGhhcyAxIGJhbmsgb2YgMTI4IE1CIEREUiBSQU0KKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIHRvIDg4MDAnMDAwMAorIworIyBMaW51eC1LZXJuZWwgaXMgZXhwZWN0ZWQgdG8gYmUgYXQgODAwMCc4MDAwLCBlbnRyeSA4MDAwJzgwMDAKKyMgKG1lbSBiYXNlICsgcmVzZXJ2ZWQpCisjCisjIHdlIGxvYWQgb3Vyc2VsZiB0byA4MTA4ICcwMDAwCisjCisjCisKKyNQcm92aWRlIGF0IGxlYXN0IDE2TUIgc3BhY2luZyBiZXR3ZWVuIHVzIGFuZCB0aGUgTGludXggS2VybmVsIGltYWdlCitURVhUX0JBU0UgPSAweDgxMDgwMDAwCmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL2R2LWV2bS9kdl9ib2FyZC5jIGIvYm9hcmQvZGF2aW5jaS9kdi1ldm0vZHZfYm9hcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDkyNWVjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZGF2aW5jaS9kdi1ldm0vZHZfYm9hcmQuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBQYXJ0cyBhcmUgc2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gdmFyaW91cyBUSSBzb3VyY2VzLCBvcmlnaW5hbCBjb3B5cmlnaHQKKyAqIGZvbGxvd3M6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cy4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8aTJjLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9lbWFjX2RlZnMuaD4KKworI2RlZmluZSBNQUNIX1RZUEVfREFWSU5DSV9FVk0JCTkwMQorCitleHRlcm4gdm9pZAlpMmNfaW5pdChpbnQgc3BlZWQsIGludCBzbGF2ZWFkZHIpOworZXh0ZXJuIHZvaWQJdGltZXJfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQJZXRoX2h3X2luaXQodm9pZCk7CitleHRlcm4gcGh5X3QJcGh5OworCisKKy8qIFdvcmtzIG9uIEFsd2F5cyBPbiBwb3dlciBkb21haW4gb25seSAobm8gUEQgYXJndW1lbnQpICovCit2b2lkIGxwc2Nfb24odW5zaWduZWQgaW50IGlkKQoreworCWR2X3JlZ19wCW1kc3RhdCwgbWRjdGw7CisKKwlpZiAoaWQgPj0gREFWSU5DSV9MUFNDX0dFTSkKKwkJcmV0dXJuOwkJCS8qIERvbid0IHdvcmsgb24gRFNQIFBvd2VyIERvbWFpbiAqLworCisJbWRzdGF0ID0gUkVHX1AoUFNDX01EU1RBVF9CQVNFICsgKGlkICogNCkpOworCW1kY3RsID0gUkVHX1AoUFNDX01EQ1RMX0JBU0UgKyAoaWQgKiA0KSk7CisKKwl3aGlsZSAoUkVHKFBTQ19QVFNUQVQpICYgMHgwMSkgezt9CisKKwlpZiAoKCptZHN0YXQgJiAweDFmKSA9PSAweDAzKQorCQlyZXR1cm47CQkJLyogQWxyZWFkeSBvbiBhbmQgZW5hYmxlZCAqLworCisJKm1kY3RsIHw9IDB4MDM7CisKKwkvKiBTcGVjaWFsIHRyZWF0bWVudCBmb3Igc29tZSBtb2R1bGVzIGFzIGZvciBzcHJ1ZTE0IHAuNy40LjIgKi8KKwlpZiAoCShpZCA9PSBEQVZJTkNJX0xQU0NfVlBTU1NMVikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19FTUFDKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX0VNQUNfV1JBUFBFUikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19NRElPKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX1VTQikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19BVEEpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfVkxZTlEpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfVUhQSSkgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19ERFJfRU1JRikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19BRU1JRikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19NTUNfU0QpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTUVNU1RJQ0spIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTWNCU1ApIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfR1BJTykKKwkgICApCisJICAgCSptZGN0bCB8PSAweDIwMDsKKworCVJFRyhQU0NfUFRDTUQpID0gMHgwMTsKKworCXdoaWxlIChSRUcoUFNDX1BUU1RBVCkgJiAweDAzKSB7O30KKwl3aGlsZSAoKCptZHN0YXQgJiAweDFmKSAhPSAweDAzKSB7O30JLyogUHJvYmFibHkgYW4gb3ZlcmtpbGwuLi4gKi8KK30KKwordm9pZCBkc3Bfb24odm9pZCkKK3sKKwlpbnQJaTsKKworCWlmIChSRUcoUFNDX1BEU1RBVDEpICYgMHgxZikKKwkJcmV0dXJuOwkJCS8qIEFscmVhZHkgb24gKi8KKworCVJFRyhQU0NfR0JMQ1RMKSB8PSAweDAxOworCVJFRyhQU0NfUERDVEwxKSB8PSAweDAxOworCVJFRyhQU0NfUERDVEwxKSAmPSB+MHgxMDA7CisJUkVHKFBTQ19NRENUTF9CQVNFICsgKERBVklOQ0lfTFBTQ19HRU0gKiA0KSkgfD0gMHgwMzsKKwlSRUcoUFNDX01EQ1RMX0JBU0UgKyAoREFWSU5DSV9MUFNDX0dFTSAqIDQpKSAmPSAweGZmZmZmZWZmOworCVJFRyhQU0NfTURDVExfQkFTRSArIChEQVZJTkNJX0xQU0NfSU1DT1AgKiA0KSkgfD0gMHgwMzsKKwlSRUcoUFNDX01EQ1RMX0JBU0UgKyAoREFWSU5DSV9MUFNDX0lNQ09QICogNCkpICY9IDB4ZmZmZmZlZmY7CisJUkVHKFBTQ19QVENNRCkgPSAweDAyOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmIChSRUcoUFNDX0VQQ1BSKSAmIDB4MDIpCisJCQlicmVhazsKKwl9CisKKwlSRUcoUFNDX0NIUF9TSFJUU1cpID0gMHgwMTsKKwlSRUcoUFNDX1BEQ1RMMSkgfD0gMHgxMDA7CisJUkVHKFBTQ19FUENDUikgPSAweDAyOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmICghKFJFRyhQU0NfUFRTVEFUKSAmIDB4MDIpKQorCQkJYnJlYWs7CisJfQorCisJUkVHKFBTQ19HQkxDVEwpICY9IH4weDFmOworfQorCisKK2ludCBib2FyZF9pbml0KHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwkvKiBhcmNoIG51bWJlciBvZiB0aGUgYm9hcmQgKi8KKwlnZC0+YmQtPmJpX2FyY2hfbnVtYmVyID0gTUFDSF9UWVBFX0RBVklOQ0lfRVZNOworCisJLyogYWRkcmVzcyBvZiBib290IHBhcmFtZXRlcnMgKi8KKwlnZC0+YmQtPmJpX2Jvb3RfcGFyYW1zID0gTElOVVhfQk9PVF9QQVJBTV9BRERSOworCisJLyogV29ya2Fyb3VuZCBmb3IgVE1TMzIwRE02NDQ2IGVycmF0YSAxLjMuMjIgKi8KKwlSRUcoUFNDX1NJTFZFUl9CVUxMRVQpID0gMDsKKworCS8qIFBvd2VyIG9uIHJlcXVpcmVkIHBlcmlwaGVyYWxzICovCisJbHBzY19vbihEQVZJTkNJX0xQU0NfRU1BQyk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfRU1BQ19XUkFQUEVSKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19NRElPKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19JMkMpOworCWxwc2Nfb24oREFWSU5DSV9MUFNDX1VBUlQwKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19USU1FUjEpOworCWxwc2Nfb24oREFWSU5DSV9MUFNDX0dQSU8pOworCisJLyogUG93ZXJ1cCB0aGUgRFNQICovCisJZHNwX29uKCk7CisKKwkvKiBCcmluZ3VwIFVBUlQwIG91dCBvZiByZXNldCAqLworCVJFRyhVQVJUMF9QV1JFTVVfTUdNVCkgPSAweDAwMDBlMDAzOworCisJLyogRW5hYmxlIEdJTzMuM1YgY2VsbHMgdXNlZCBmb3IgRU1BQyAqLworCVJFRyhWREQzUDNWX1BXRE4pID0gMDsKKworCS8qIEVuYWJsZSBVQVJUMCBNVVggbGluZXMgKi8KKwlSRUcoUElOTVVYMSkgfD0gMTsKKworCS8qIEVuYWJsZSBFTUFDIGFuZCBBRU1JRiBwaW5zICovCisJUkVHKFBJTk1VWDApID0gMHg4MDAwMGMxZjsKKworCS8qIEVuYWJsZSBJMkMgcGluIE11eCAqLworCVJFRyhQSU5NVVgxKSB8PSAoMSA8PCA3KTsKKworCS8qIFNldCB0aGUgQnVzIFByaW9yaXR5IFJlZ2lzdGVyIHRvIGFwcHJvcHJpYXRlIHZhbHVlICovCisJUkVHKFZCUFIpID0gMHgyMDsKKworCXRpbWVyX2luaXQoKTsKKworCXJldHVybigwKTsKK30KKworaW50IG1pc2NfaW5pdF9yICh2b2lkKQoreworCXVfaW50OF90CXRtcFsyMF0sIGJ1ZlsxMF07CisJaW50CQlpID0gMDsKKwlpbnQJCWNsayA9IDA7CisKKwljbGsgPSAoKFJFRyhQTEwyX1BMTE0pICsgMSkgKiAyNykgLyAoKFJFRyhQTEwyX0RJVjIpICYgMHgxZikgKyAxKTsKKworCXByaW50ZiAoIkFSTSBDbG9jayA6ICVkTUh6XG4iLCAoKFJFRyhQTEwxX1BMTE0pICsgMSkgKiAyNyApIC8gMik7CisJcHJpbnRmICgiRERSIENsb2NrIDogJWRNSHpcbiIsIChjbGsgLyAyKSk7CisKKwkvKiBTZXQgRXRoZXJuZXQgTUFDIGFkZHJlc3MgZnJvbSBFRVBST00gKi8KKwlpZiAoaTJjX3JlYWQoQ0ZHX0kyQ19FRVBST01fQUREUiwgMHg3ZjAwLCBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTiwgYnVmLCA2KSkgeworCQlwcmludGYoIlxuRUVQUk9NIEAgMHglMDJ4IHJlYWQgRkFJTEVEISEhXG4iLCBDRkdfSTJDX0VFUFJPTV9BRERSKTsKKwl9IGVsc2UgeworCQl0bXBbMF0gPSAweGZmOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJdG1wWzBdICY9IGJ1ZltpXTsKKworCQlpZiAoKHRtcFswXSAhPSAweGZmKSAmJiAoZ2V0ZW52KCJldGhhZGRyIikgPT0gTlVMTCkpIHsKKwkJCXNwcmludGYoKGNoYXIgKikmdG1wWzBdLCAiJTAyaGh4OiUwMmhoeDolMDJoaHg6JTAyaGh4OiUwMmhoeDolMDJoaHgiLAorCQkJCWJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSwgYnVmWzRdLCBidWZbNV0pOworCQkJc2V0ZW52KCJldGhhZGRyIiwgKGNoYXIgKikmdG1wWzBdKTsKKwkJfQorCX0KKworCWlmICghZXRoX2h3X2luaXQoKSkgeworCQlwcmludGYoImV0aGVybmV0IGluaXQgZmFpbGVkIVxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJFVEggUEhZICAgOiAlc1xuIiwgcGh5Lm5hbWUpOworCX0KKworCWkyY19yZWFkICgweDM5LCAweDAwLCAxLCAodV9pbnQ4X3QgKikmaSwgMSk7CisKKwlzZXRlbnYgKCJ2aWRlb3N0ZCIsICgoaSAgJiAweDgwKSA/ICJwYWwiIDogIm50c2MiKSk7CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBkcmFtX2luaXQodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWdkLT5iZC0+YmlfZHJhbVswXS5zdGFydCA9IFBIWVNfU0RSQU1fMTsKKwlnZC0+YmQtPmJpX2RyYW1bMF0uc2l6ZSA9IFBIWVNfU0RSQU1fMV9TSVpFOworCisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9kdi1ldm0vdS1ib290LmxkcyBiL2JvYXJkL2RhdmluY2kvZHYtZXZtL3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwYjJhMgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvZHYtZXZtL3UtYm9vdC5sZHMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisJLiA9IEFMSUdOKDQpOworCS50ZXh0CToKKwl7CisJICBjcHUvYXJtOTI2ZWpzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSAuOworCV9fdV9ib290X2NtZF9zdGFydCA9IC47CisJLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKwlfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9NYWtlZmlsZSBiL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDAxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9NYWtlZmlsZQpAQCAtMCwwICsxLDUyIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK0NPQkpTCTo9IGR2X2JvYXJkLm8KK1NPQkpTCTo9IGJvYXJkX2luaXQubworCitTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykgJChTT0JKUykKKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgKn4gLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoaXMgaXMgZm9yICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9ib2FyZF9pbml0LlMgYi9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9ib2FyZF9pbml0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkOGFkYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL2JvYXJkX2luaXQuUwpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIEJvYXJkLXNwZWNpZmljIGxvdyBsZXZlbCBpbml0aWFsaXphdGlvbiBjb2RlLiBDYWxsZWQgYXQgdGhlIHZlcnkgZW5kCisgKiBvZiBjcHUvYXJtOTI2ZWpzL2RhdmluY2kvbG93bGV2ZWxfaW5pdC5TLiBKdXN0IHJldHVybnMgaWYgdGhlcmUgaXMgbm8KKyAqIGluaXRpYWxpemF0aW9uIHJlcXVpcmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworLmdsb2JsCWR2X2JvYXJkX2luaXQKK2R2X2JvYXJkX2luaXQ6CisKKwltb3YJcGMsIGxyCmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9jb25maWcubWsgYi9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4OWQwZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL2NvbmZpZy5tawpAQCAtMCwwICsxLDM5IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMgorIyBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisjIERhdmlkIE11ZWxsZXIsIEVMU09GVCBBRywgPGQubXVlbGxlckBlbHNvZnQuY2g+CisjCisjIChDKSBDb3B5cmlnaHQgMjAwMworIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjIFN3YW1pbmF0aGFuIDxzd2FtaS5peWVyQHRpLmNvbT4KKyMKKyMgRGF2aW5jaSBFVk0gYm9hcmQgKEFSTTkyNUVKUykgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgRGF2aW5jaSBFVk0gaGFzIDEgYmFuayBvZiAyNTYgTUIgRERSIFJBTQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgdG8gOTAwMCcwMDAwCisjCisjIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyMKKyMgVmlzaW9uZWVyaW5nIENvcnAuIFNvbmF0YSBib2FyZCAoQVJNOTI2RUpTKSBjcHUKKyMKKyMgU29uYXRhIGJvYXJkIGhhcyAxIGJhbmsgb2YgMTI4IE1CIEREUiBSQU0KKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIHRvIDg4MDAnMDAwMAorIworIyBSYXpvcnN0cmVhbSwgTExDLiBTQ0hNT09HSUUgYm9hcmQgKEFSTTkyNkVKUykgY3B1CisjCisjIFNjaG1vb2dpZSBib2FyZCBoYXMgMSBiYW5rIG9mIDEyOCBNQiBERFIgUkFNCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCB0byA4ODAwJzAwMDAKKyMKKyMgTGludXgtS2VybmVsIGlzIGV4cGVjdGVkIHRvIGJlIGF0IDgwMDAnODAwMCwgZW50cnkgODAwMCc4MDAwCisjIChtZW0gYmFzZSArIHJlc2VydmVkKQorIworIyB3ZSBsb2FkIG91cnNlbGYgdG8gODEwOCAnMDAwMAorIworIworCisjUHJvdmlkZSBhdCBsZWFzdCAxNk1CIHNwYWNpbmcgYmV0d2VlbiB1cyBhbmQgdGhlIExpbnV4IEtlcm5lbCBpbWFnZQorVEVYVF9CQVNFID0gMHg4MTA4MDAwMApkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9zY2htb29naWUvZHZfYm9hcmQuYyBiL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL2R2X2JvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1YzVmNwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL2R2X2JvYXJkLmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogUGFydHMgYXJlIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIHZhcmlvdXMgVEkgc291cmNlcywgb3JpZ2luYWwgY29weXJpZ2h0CisgKiBmb2xsb3dzOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGkyYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZW1hY19kZWZzLmg+CisKKyNkZWZpbmUgTUFDSF9UWVBFX1NDSE1PT0dJRQkJMTI1NQorCitleHRlcm4gdm9pZAlpMmNfaW5pdChpbnQgc3BlZWQsIGludCBzbGF2ZWFkZHIpOworZXh0ZXJuIHZvaWQJdGltZXJfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQJZXRoX2h3X2luaXQodm9pZCk7CitleHRlcm4gcGh5X3QJcGh5OworCisKKy8qIFdvcmtzIG9uIEFsd2F5cyBPbiBwb3dlciBkb21haW4gb25seSAobm8gUEQgYXJndW1lbnQpICovCit2b2lkIGxwc2Nfb24odW5zaWduZWQgaW50IGlkKQoreworCWR2X3JlZ19wCW1kc3RhdCwgbWRjdGw7CisKKwlpZiAoaWQgPj0gREFWSU5DSV9MUFNDX0dFTSkKKwkJcmV0dXJuOwkJCS8qIERvbid0IHdvcmsgb24gRFNQIFBvd2VyIERvbWFpbiAqLworCisJbWRzdGF0ID0gUkVHX1AoUFNDX01EU1RBVF9CQVNFICsgKGlkICogNCkpOworCW1kY3RsID0gUkVHX1AoUFNDX01EQ1RMX0JBU0UgKyAoaWQgKiA0KSk7CisKKwl3aGlsZSAoUkVHKFBTQ19QVFNUQVQpICYgMHgwMSkgezt9CisKKwlpZiAoKCptZHN0YXQgJiAweDFmKSA9PSAweDAzKQorCQlyZXR1cm47CQkJLyogQWxyZWFkeSBvbiBhbmQgZW5hYmxlZCAqLworCisJKm1kY3RsIHw9IDB4MDM7CisKKwkvKiBTcGVjaWFsIHRyZWF0bWVudCBmb3Igc29tZSBtb2R1bGVzIGFzIGZvciBzcHJ1ZTE0IHAuNy40LjIgKi8KKwlpZiAoCShpZCA9PSBEQVZJTkNJX0xQU0NfVlBTU1NMVikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19FTUFDKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX0VNQUNfV1JBUFBFUikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19NRElPKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX1VTQikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19BVEEpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfVkxZTlEpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfVUhQSSkgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19ERFJfRU1JRikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19BRU1JRikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19NTUNfU0QpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTUVNU1RJQ0spIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTWNCU1ApIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfR1BJTykKKwkgICApCisJICAgCSptZGN0bCB8PSAweDIwMDsKKworCVJFRyhQU0NfUFRDTUQpID0gMHgwMTsKKworCXdoaWxlIChSRUcoUFNDX1BUU1RBVCkgJiAweDAzKSB7O30KKwl3aGlsZSAoKCptZHN0YXQgJiAweDFmKSAhPSAweDAzKSB7O30JLyogUHJvYmFibHkgYW4gb3ZlcmtpbGwuLi4gKi8KK30KKwordm9pZCBkc3Bfb24odm9pZCkKK3sKKwlpbnQJaTsKKworCWlmIChSRUcoUFNDX1BEU1RBVDEpICYgMHgxZikKKwkJcmV0dXJuOwkJCS8qIEFscmVhZHkgb24gKi8KKworCVJFRyhQU0NfR0JMQ1RMKSB8PSAweDAxOworCVJFRyhQU0NfUERDVEwxKSB8PSAweDAxOworCVJFRyhQU0NfUERDVEwxKSAmPSB+MHgxMDA7CisJUkVHKFBTQ19NRENUTF9CQVNFICsgKERBVklOQ0lfTFBTQ19HRU0gKiA0KSkgfD0gMHgwMzsKKwlSRUcoUFNDX01EQ1RMX0JBU0UgKyAoREFWSU5DSV9MUFNDX0dFTSAqIDQpKSAmPSAweGZmZmZmZWZmOworCVJFRyhQU0NfTURDVExfQkFTRSArIChEQVZJTkNJX0xQU0NfSU1DT1AgKiA0KSkgfD0gMHgwMzsKKwlSRUcoUFNDX01EQ1RMX0JBU0UgKyAoREFWSU5DSV9MUFNDX0lNQ09QICogNCkpICY9IDB4ZmZmZmZlZmY7CisJUkVHKFBTQ19QVENNRCkgPSAweDAyOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmIChSRUcoUFNDX0VQQ1BSKSAmIDB4MDIpCisJCQlicmVhazsKKwl9CisKKwlSRUcoUFNDX0NIUF9TSFJUU1cpID0gMHgwMTsKKwlSRUcoUFNDX1BEQ1RMMSkgfD0gMHgxMDA7CisJUkVHKFBTQ19FUENDUikgPSAweDAyOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmICghKFJFRyhQU0NfUFRTVEFUKSAmIDB4MDIpKQorCQkJYnJlYWs7CisJfQorCisJUkVHKFBTQ19HQkxDVEwpICY9IH4weDFmOworfQorCisKK2ludCBib2FyZF9pbml0KHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwkvKiBhcmNoIG51bWJlciBvZiB0aGUgYm9hcmQgKi8KKwlnZC0+YmQtPmJpX2FyY2hfbnVtYmVyID0gTUFDSF9UWVBFX1NDSE1PT0dJRTsKKworCS8qIGFkZHJlc3Mgb2YgYm9vdCBwYXJhbWV0ZXJzICovCisJZ2QtPmJkLT5iaV9ib290X3BhcmFtcyA9IExJTlVYX0JPT1RfUEFSQU1fQUREUjsKKworCS8qIFdvcmthcm91bmQgZm9yIFRNUzMyMERNNjQ0NiBlcnJhdGEgMS4zLjIyICovCisJUkVHKFBTQ19TSUxWRVJfQlVMTEVUKSA9IDA7CisKKwkvKiBQb3dlciBvbiByZXF1aXJlZCBwZXJpcGhlcmFscyAqLworCWxwc2Nfb24oREFWSU5DSV9MUFNDX0VNQUMpOworCWxwc2Nfb24oREFWSU5DSV9MUFNDX0VNQUNfV1JBUFBFUik7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfTURJTyk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfSTJDKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19VQVJUMCk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfVElNRVIxKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19HUElPKTsKKworCS8qIFBvd2VydXAgdGhlIERTUCAqLworCWRzcF9vbigpOworCisJLyogQnJpbmd1cCBVQVJUMCBvdXQgb2YgcmVzZXQgKi8KKwlSRUcoVUFSVDBfUFdSRU1VX01HTVQpID0gMHgwMDAwZTAwMzsKKworCS8qIEVuYWJsZSBHSU8zLjNWIGNlbGxzIHVzZWQgZm9yIEVNQUMgKi8KKwlSRUcoVkREM1AzVl9QV0ROKSA9IDA7CisKKwkvKiBFbmFibGUgVUFSVDAgTVVYIGxpbmVzICovCisJUkVHKFBJTk1VWDEpIHw9IDE7CisKKwkvKiBFbmFibGUgRU1BQyBhbmQgQUVNSUYgcGlucyAqLworCVJFRyhQSU5NVVgwKSA9IDB4ODAwMDBjMWY7CisKKwkvKiBFbmFibGUgSTJDIHBpbiBNdXggKi8KKwlSRUcoUElOTVVYMSkgfD0gKDEgPDwgNyk7CisKKwkvKiBTZXQgdGhlIEJ1cyBQcmlvcml0eSBSZWdpc3RlciB0byBhcHByb3ByaWF0ZSB2YWx1ZSAqLworCVJFRyhWQlBSKSA9IDB4MjA7CisKKwl0aW1lcl9pbml0KCk7CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwl1X2ludDhfdAl0bXBbMjBdLCBidWZbMTBdOworCWludAkJaSA9IDA7CisJaW50CQljbGsgPSAwOworCisJLyogU2V0IHNlcmlhbCBudW1iZXIgZnJvbSBVSUQgY2hpcCAqLworCXVfaW50OF90CWNyY190YmxbMjU2XSA9IHsKKwkJCTB4MDAsIDB4NWUsIDB4YmMsIDB4ZTIsIDB4NjEsIDB4M2YsIDB4ZGQsIDB4ODMsCisJCQkweGMyLCAweDljLCAweDdlLCAweDIwLCAweGEzLCAweGZkLCAweDFmLCAweDQxLAorCQkJMHg5ZCwgMHhjMywgMHgyMSwgMHg3ZiwgMHhmYywgMHhhMiwgMHg0MCwgMHgxZSwKKwkJCTB4NWYsIDB4MDEsIDB4ZTMsIDB4YmQsIDB4M2UsIDB4NjAsIDB4ODIsIDB4ZGMsCisJCQkweDIzLCAweDdkLCAweDlmLCAweGMxLCAweDQyLCAweDFjLCAweGZlLCAweGEwLAorCQkJMHhlMSwgMHhiZiwgMHg1ZCwgMHgwMywgMHg4MCwgMHhkZSwgMHgzYywgMHg2MiwKKwkJCTB4YmUsIDB4ZTAsIDB4MDIsIDB4NWMsIDB4ZGYsIDB4ODEsIDB4NjMsIDB4M2QsCisJCQkweDdjLCAweDIyLCAweGMwLCAweDllLCAweDFkLCAweDQzLCAweGExLCAweGZmLAorCQkJMHg0NiwgMHgxOCwgMHhmYSwgMHhhNCwgMHgyNywgMHg3OSwgMHg5YiwgMHhjNSwKKwkJCTB4ODQsIDB4ZGEsIDB4MzgsIDB4NjYsIDB4ZTUsIDB4YmIsIDB4NTksIDB4MDcsCisJCQkweGRiLCAweDg1LCAweDY3LCAweDM5LCAweGJhLCAweGU0LCAweDA2LCAweDU4LAorCQkJMHgxOSwgMHg0NywgMHhhNSwgMHhmYiwgMHg3OCwgMHgyNiwgMHhjNCwgMHg5YSwKKwkJCTB4NjUsIDB4M2IsIDB4ZDksIDB4ODcsIDB4MDQsIDB4NWEsIDB4YjgsIDB4ZTYsCisJCQkweGE3LCAweGY5LCAweDFiLCAweDQ1LCAweGM2LCAweDk4LCAweDdhLCAweDI0LAorCQkJMHhmOCwgMHhhNiwgMHg0NCwgMHgxYSwgMHg5OSwgMHhjNywgMHgyNSwgMHg3YiwKKwkJCTB4M2EsIDB4NjQsIDB4ODYsIDB4ZDgsIDB4NWIsIDB4MDUsIDB4ZTcsIDB4YjksCisJCQkweDhjLCAweGQyLCAweDMwLCAweDZlLCAweGVkLCAweGIzLCAweDUxLCAweDBmLAorCQkJMHg0ZSwgMHgxMCwgMHhmMiwgMHhhYywgMHgyZiwgMHg3MSwgMHg5MywgMHhjZCwKKwkJCTB4MTEsIDB4NGYsIDB4YWQsIDB4ZjMsIDB4NzAsIDB4MmUsIDB4Y2MsIDB4OTIsCisJCQkweGQzLCAweDhkLCAweDZmLCAweDMxLCAweGIyLCAweGVjLCAweDBlLCAweDUwLAorCQkJMHhhZiwgMHhmMSwgMHgxMywgMHg0ZCwgMHhjZSwgMHg5MCwgMHg3MiwgMHgyYywKKwkJCTB4NmQsIDB4MzMsIDB4ZDEsIDB4OGYsIDB4MGMsIDB4NTIsIDB4YjAsIDB4ZWUsCisJCQkweDMyLCAweDZjLCAweDhlLCAweGQwLCAweDUzLCAweDBkLCAweGVmLCAweGIxLAorCQkJMHhmMCwgMHhhZSwgMHg0YywgMHgxMiwgMHg5MSwgMHhjZiwgMHgyZCwgMHg3MywKKwkJCTB4Y2EsIDB4OTQsIDB4NzYsIDB4MjgsIDB4YWIsIDB4ZjUsIDB4MTcsIDB4NDksCisJCQkweDA4LCAweDU2LCAweGI0LCAweGVhLCAweDY5LCAweDM3LCAweGQ1LCAweDhiLAorCQkJMHg1NywgMHgwOSwgMHhlYiwgMHhiNSwgMHgzNiwgMHg2OCwgMHg4YSwgMHhkNCwKKwkJCTB4OTUsIDB4Y2IsIDB4MjksIDB4NzcsIDB4ZjQsIDB4YWEsIDB4NDgsIDB4MTYsCisJCQkweGU5LCAweGI3LCAweDU1LCAweDBiLCAweDg4LCAweGQ2LCAweDM0LCAweDZhLAorCQkJMHgyYiwgMHg3NSwgMHg5NywgMHhjOSwgMHg0YSwgMHgxNCwgMHhmNiwgMHhhOCwKKwkJCTB4NzQsIDB4MmEsIDB4YzgsIDB4OTYsIDB4MTUsIDB4NGIsIDB4YTksIDB4ZjcsCisJCQkweGI2LCAweGU4LCAweDBhLCAweDU0LCAweGQ3LCAweDg5LCAweDZiLCAweDM1CisJCX07CisKKwljbGsgPSAoKFJFRyhQTEwyX1BMTE0pICsgMSkgKiAyNykgLyAoKFJFRyhQTEwyX0RJVjIpICYgMHgxZikgKyAxKTsKKworCXByaW50ZiAoIkFSTSBDbG9jayA6ICVkTUh6XG4iLCAoKFJFRyhQTEwxX1BMTE0pICsgMSkgKiAyNyApIC8gMik7CisJcHJpbnRmICgiRERSIENsb2NrIDogJWRNSHpcbiIsIChjbGsgLyAyKSk7CisKKwkvKiBTZXQgc2VyaWFsIG51bWJlciBmcm9tIFVJRCBjaGlwICovCisJaWYgKGkyY19yZWFkKENGR19VSURfQUREUiwgMCwgMSwgYnVmLCA4KSkgeworCQlwcmludGYoIlxuVUlEIEAgMHglMDJ4IHJlYWQgRkFJTEVEISEhXG4iLCBDRkdfVUlEX0FERFIpOworCQlmb3JjZWVudigic2VyaWFsIyIsICJGQUlMRUQiKTsKKwl9IGVsc2UgeworCQlpZiAoYnVmWzBdICE9IDB4NzApIHsJLyogRGV2aWNlIEZhbWlseSBDb2RlICovCisJCQlwcmludGYoIlxuVUlEIEAgMHglMDJ4IHJlYWQgRkFJTEVEISEhXG4iLCBDRkdfVUlEX0FERFIpOworCQkJZm9yY2VlbnYoInNlcmlhbCMiLCAiRkFJTEVEIik7CisJCX0KKwl9CisJLyogTm93IGNoZWNrIENSQyAqLworCXRtcFswXSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJdG1wWzBdID0gY3JjX3RibFt0bXBbMF0gXiBidWZbaV1dOworCisJaWYgKHRtcFswXSAhPSAwKSB7CisJCXByaW50ZigiXG5VSUQgQCAweCUwMnggLSBCQUQgQ1JDISEhXG4iLCBDRkdfVUlEX0FERFIpOworCQlmb3JjZWVudigic2VyaWFsIyIsICJGQUlMRUQiKTsKKwl9IGVsc2UgeworCQkvKiBDUkMgT0ssIHNldCAic2VyaWFsIiBlbnYgdmFyaWFibGUgKi8KKwkJc3ByaW50ZigoY2hhciAqKSZ0bXBbMF0sICIlMDJoaHglMDJoaHglMDJoaHglMDJoaHglMDJoaHglMDJoaHgiLAorCQkJYnVmWzZdLCBidWZbNV0sIGJ1Zls0XSwgYnVmWzNdLCBidWZbMl0sIGJ1ZlsxXSk7CisJCWZvcmNlZW52KCJzZXJpYWwjIiwgKGNoYXIgKikmdG1wWzBdKTsKKwl9CisKKwlpZiAoIWV0aF9od19pbml0KCkpIHsKKwkJcHJpbnRmKCJldGhlcm5ldCBpbml0IGZhaWxlZCFcbiIpOworCX0gZWxzZSB7CisJCXByaW50ZigiRVRIIFBIWSAgIDogJXNcbiIsIHBoeS5uYW1lKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBkcmFtX2luaXQodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWdkLT5iZC0+YmlfZHJhbVswXS5zdGFydCA9IFBIWVNfU0RSQU1fMTsKKwlnZC0+YmQtPmJpX2RyYW1bMF0uc2l6ZSA9IFBIWVNfU0RSQU1fMV9TSVpFOworCisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9zY2htb29naWUvdS1ib290LmxkcyBiL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwYjJhMgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL3UtYm9vdC5sZHMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisJLiA9IEFMSUdOKDQpOworCS50ZXh0CToKKwl7CisJICBjcHUvYXJtOTI2ZWpzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSAuOworCV9fdV9ib290X2NtZF9zdGFydCA9IC47CisJLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKwlfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL3NvbmF0YS9NYWtlZmlsZSBiL2JvYXJkL2RhdmluY2kvc29uYXRhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDAxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9kYXZpbmNpL3NvbmF0YS9NYWtlZmlsZQpAQCAtMCwwICsxLDUyIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK0NPQkpTCTo9IGR2X2JvYXJkLm8KK1NPQkpTCTo9IGJvYXJkX2luaXQubworCitTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykgJChTT0JKUykKKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgKn4gLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoaXMgaXMgZm9yICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL3NvbmF0YS9ib2FyZF9pbml0LlMgYi9ib2FyZC9kYXZpbmNpL3NvbmF0YS9ib2FyZF9pbml0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiOWVhNwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvc29uYXRhL2JvYXJkX2luaXQuUwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBCb2FyZC1zcGVjaWZpYyBsb3cgbGV2ZWwgaW5pdGlhbGl6YXRpb24gY29kZS4gQ2FsbGVkIGF0IHRoZSB2ZXJ5IGVuZAorICogb2YgY3B1L2FybTkyNmVqcy9kYXZpbmNpL2xvd2xldmVsX2luaXQuUy4gSnVzdCByZXR1cm5zIGlmIHRoZXJlIGlzIG5vCisgKiBpbml0aWFsaXphdGlvbiByZXF1aXJlZC4KKyAqCisgKiBGb3IgX09MREVSXyBTb25hdGEgYm9hcmRzIHNldHMgdXAgR1BJTzQgdG8gY29udHJvbCBOQU5EIFdQIGxpbmUuIE5ld2VyCisgKiBTb25hdGEgYm9hcmRzLCBBRkFJSywgZG9uJ3QgdXNlIHRoaXMgc28gaXQncyBqdXN0IHJldHVybiBieSBkZWZhdWx0LiBBc2sKKyAqIFZpc2lvbmVlcmluZyBpZiB0aGV5IHJlaW52ZW50ZWQgdGhlIHdoZWVsIG9uY2UgYWdhaW4gdG8gbWFrZSBzdXJlIDopCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisuZ2xvYmwJZHZfYm9hcmRfaW5pdAorZHZfYm9hcmRfaW5pdDoKKyNpZmRlZiBTT05BVEFfQk9BUkRfR1BJT1dQCisJLyogU2V0IFBJTk1VWDAgdG8gZW5hYmxlIEdQSU80ICovCisJbGRyCXIwLCBfUElOTVVYMAorCWxkcglyMSwgR1BJTzRfRU5fTUFTSworCWxkcglyMiwgW3IwXQorCWFuZAlyMiwgcjIsIHIxCisJc3RyCXIyLCBbcjBdCisKKwkvKiBFbmFibGUgR1BJTyBMUFNDIG1vZHVsZSAqLworCWxkcglyMCwgUFRTVEFUCisKK2dwaW9fcHRzdGF0X2xvb3AxOgorCWxkcglyMiwgW3IwXQorCXRzdAlyMiwgJDB4MDAwMDAwMDEKKwlibmUJZ3Bpb19wdHN0YXRfbG9vcDEKKworCWxkcglyMSwgTURDVExfR1BJTworCWxkcglyMiwgW3IxXQorCWFuZAlyMiwgcjIsICQweGZmZmZmZmY4CisJb3JyCXIyLCByMiwgJDB4MDAwMDAwMDMKKwlzdHIJcjIsIFtyMV0KKworCW9ycglyMiwgcjIsICQweDAwMDAwMjAwCisJc3RyCXIyLCBbcjFdCisKKwlsZHIJcjEsIFBUQ01ECisJbW92CXIyLCAkMHgwMDAwMDAwMQorCXN0cglyMiwgW3IxXQorCitncGlvX3B0c3RhdF9sb29wMjoKKwlsZHIJcjIsIFtyMF0KKwl0c3QJcjIsICQweDAwMDAwMDAxCisJYm5lCWdwaW9fcHRzdGF0X2xvb3AyCisKKwlsZHIJcjAsIE1EU1RBVF9HUElPCitncGlvX21kc3RhdF9sb29wOgorCWxkcglyMiwgW3IwXQorCWFuZAlyMiwgcjIsICQweDAwMDAwMDFmCisJdGVxCXIyLCAkMHgwMDAwMDAwMworCWJuZQlncGlvX21kc3RhdF9sb29wCisKKwkvKiBHUElPNCAtPiBvdXRwdXQgKi8KKwlsZHIJcjAsIEdQSU9fRElSMDEKKwltb3YJcjEsICQweDEwCisJbGRyCXIyLCBbcjBdCisJYmljCXIyLCByMiwgcjAKKwlzdHIJcjIsIFtyMF0KKworCS8qIFNldCBpdCB0byAwIChXcml0ZSBQcm90ZWN0KSAqLworCWxkcglyMCwgR1BJT19DTFJfREFUQTAxCisJc3RyCXIxLCBbcjBdCisjZW5kaWYKKworCW1vdglwYywgbHIKKworI2lmZGVmIFNPTkFUQV9CT0FSRF9HUElPV1AKKy5sdG9yZworCitHUElPNF9FTl9NQVNLOgorCS53b3JkCTB4Zjc3ZmZmZmYKK01EQ1RMX0dQSU86CisJLndvcmQJMHgwMWM0MWE2OAorTURTVEFUX0dQSU86CisJLndvcmQJMHgwMWM0MTg2OAorR1BJT19ESVIwMToKKwkud29yZAkweDAxYzY3MDEwCitHUElPX0NMUl9EQVRBMDE6CisJLndvcmQJMHgwMWM2NzAxYworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL3NvbmF0YS9jb25maWcubWsgYi9ib2FyZC9kYXZpbmNpL3NvbmF0YS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4OWQwZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvc29uYXRhL2NvbmZpZy5tawpAQCAtMCwwICsxLDM5IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMgorIyBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisjIERhdmlkIE11ZWxsZXIsIEVMU09GVCBBRywgPGQubXVlbGxlckBlbHNvZnQuY2g+CisjCisjIChDKSBDb3B5cmlnaHQgMjAwMworIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjIFN3YW1pbmF0aGFuIDxzd2FtaS5peWVyQHRpLmNvbT4KKyMKKyMgRGF2aW5jaSBFVk0gYm9hcmQgKEFSTTkyNUVKUykgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgRGF2aW5jaSBFVk0gaGFzIDEgYmFuayBvZiAyNTYgTUIgRERSIFJBTQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgdG8gOTAwMCcwMDAwCisjCisjIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyMKKyMgVmlzaW9uZWVyaW5nIENvcnAuIFNvbmF0YSBib2FyZCAoQVJNOTI2RUpTKSBjcHUKKyMKKyMgU29uYXRhIGJvYXJkIGhhcyAxIGJhbmsgb2YgMTI4IE1CIEREUiBSQU0KKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIHRvIDg4MDAnMDAwMAorIworIyBSYXpvcnN0cmVhbSwgTExDLiBTQ0hNT09HSUUgYm9hcmQgKEFSTTkyNkVKUykgY3B1CisjCisjIFNjaG1vb2dpZSBib2FyZCBoYXMgMSBiYW5rIG9mIDEyOCBNQiBERFIgUkFNCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCB0byA4ODAwJzAwMDAKKyMKKyMgTGludXgtS2VybmVsIGlzIGV4cGVjdGVkIHRvIGJlIGF0IDgwMDAnODAwMCwgZW50cnkgODAwMCc4MDAwCisjIChtZW0gYmFzZSArIHJlc2VydmVkKQorIworIyB3ZSBsb2FkIG91cnNlbGYgdG8gODEwOCAnMDAwMAorIworIworCisjUHJvdmlkZSBhdCBsZWFzdCAxNk1CIHNwYWNpbmcgYmV0d2VlbiB1cyBhbmQgdGhlIExpbnV4IEtlcm5lbCBpbWFnZQorVEVYVF9CQVNFID0gMHg4MTA4MDAwMApkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9zb25hdGEvZHZfYm9hcmQuYyBiL2JvYXJkL2RhdmluY2kvc29uYXRhL2R2X2JvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwYTQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvc29uYXRhL2R2X2JvYXJkLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogUGFydHMgYXJlIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIHZhcmlvdXMgVEkgc291cmNlcywgb3JpZ2luYWwgY29weXJpZ2h0CisgKiBmb2xsb3dzOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGkyYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZW1hY19kZWZzLmg+CisKKyNkZWZpbmUgTUFDSF9UWVBFX1NPTkFUQQkJMTI1NAorCitleHRlcm4gdm9pZAlpMmNfaW5pdChpbnQgc3BlZWQsIGludCBzbGF2ZWFkZHIpOworZXh0ZXJuIHZvaWQJdGltZXJfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQJZXRoX2h3X2luaXQodm9pZCk7CitleHRlcm4gcGh5X3QJcGh5OworCisKKy8qIFdvcmtzIG9uIEFsd2F5cyBPbiBwb3dlciBkb21haW4gb25seSAobm8gUEQgYXJndW1lbnQpICovCit2b2lkIGxwc2Nfb24odW5zaWduZWQgaW50IGlkKQoreworCWR2X3JlZ19wCW1kc3RhdCwgbWRjdGw7CisKKwlpZiAoaWQgPj0gREFWSU5DSV9MUFNDX0dFTSkKKwkJcmV0dXJuOwkJCS8qIERvbid0IHdvcmsgb24gRFNQIFBvd2VyIERvbWFpbiAqLworCisJbWRzdGF0ID0gUkVHX1AoUFNDX01EU1RBVF9CQVNFICsgKGlkICogNCkpOworCW1kY3RsID0gUkVHX1AoUFNDX01EQ1RMX0JBU0UgKyAoaWQgKiA0KSk7CisKKwl3aGlsZSAoUkVHKFBTQ19QVFNUQVQpICYgMHgwMSkgezt9CisKKwlpZiAoKCptZHN0YXQgJiAweDFmKSA9PSAweDAzKQorCQlyZXR1cm47CQkJLyogQWxyZWFkeSBvbiBhbmQgZW5hYmxlZCAqLworCisJKm1kY3RsIHw9IDB4MDM7CisKKwkvKiBTcGVjaWFsIHRyZWF0bWVudCBmb3Igc29tZSBtb2R1bGVzIGFzIGZvciBzcHJ1ZTE0IHAuNy40LjIgKi8KKwlpZiAoCShpZCA9PSBEQVZJTkNJX0xQU0NfVlBTU1NMVikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19FTUFDKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX0VNQUNfV1JBUFBFUikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19NRElPKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX1VTQikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19BVEEpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfVkxZTlEpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfVUhQSSkgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19ERFJfRU1JRikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19BRU1JRikgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19NTUNfU0QpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTUVNU1RJQ0spIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTWNCU1ApIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfR1BJTykKKwkgICApCisJICAgCSptZGN0bCB8PSAweDIwMDsKKworCVJFRyhQU0NfUFRDTUQpID0gMHgwMTsKKworCXdoaWxlIChSRUcoUFNDX1BUU1RBVCkgJiAweDAzKSB7O30KKwl3aGlsZSAoKCptZHN0YXQgJiAweDFmKSAhPSAweDAzKSB7O30JLyogUHJvYmFibHkgYW4gb3ZlcmtpbGwuLi4gKi8KK30KKwordm9pZCBkc3Bfb24odm9pZCkKK3sKKwlpbnQJaTsKKworCWlmIChSRUcoUFNDX1BEU1RBVDEpICYgMHgxZikKKwkJcmV0dXJuOwkJCS8qIEFscmVhZHkgb24gKi8KKworCVJFRyhQU0NfR0JMQ1RMKSB8PSAweDAxOworCVJFRyhQU0NfUERDVEwxKSB8PSAweDAxOworCVJFRyhQU0NfUERDVEwxKSAmPSB+MHgxMDA7CisJUkVHKFBTQ19NRENUTF9CQVNFICsgKERBVklOQ0lfTFBTQ19HRU0gKiA0KSkgfD0gMHgwMzsKKwlSRUcoUFNDX01EQ1RMX0JBU0UgKyAoREFWSU5DSV9MUFNDX0dFTSAqIDQpKSAmPSAweGZmZmZmZWZmOworCVJFRyhQU0NfTURDVExfQkFTRSArIChEQVZJTkNJX0xQU0NfSU1DT1AgKiA0KSkgfD0gMHgwMzsKKwlSRUcoUFNDX01EQ1RMX0JBU0UgKyAoREFWSU5DSV9MUFNDX0lNQ09QICogNCkpICY9IDB4ZmZmZmZlZmY7CisJUkVHKFBTQ19QVENNRCkgPSAweDAyOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmIChSRUcoUFNDX0VQQ1BSKSAmIDB4MDIpCisJCQlicmVhazsKKwl9CisKKwlSRUcoUFNDX0NIUF9TSFJUU1cpID0gMHgwMTsKKwlSRUcoUFNDX1BEQ1RMMSkgfD0gMHgxMDA7CisJUkVHKFBTQ19FUENDUikgPSAweDAyOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWlmICghKFJFRyhQU0NfUFRTVEFUKSAmIDB4MDIpKQorCQkJYnJlYWs7CisJfQorCisJUkVHKFBTQ19HQkxDVEwpICY9IH4weDFmOworfQorCisKK2ludCBib2FyZF9pbml0KHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwkvKiBhcmNoIG51bWJlciBvZiB0aGUgYm9hcmQgKi8KKwlnZC0+YmQtPmJpX2FyY2hfbnVtYmVyID0gTUFDSF9UWVBFX1NPTkFUQTsKKworCS8qIGFkZHJlc3Mgb2YgYm9vdCBwYXJhbWV0ZXJzICovCisJZ2QtPmJkLT5iaV9ib290X3BhcmFtcyA9IExJTlVYX0JPT1RfUEFSQU1fQUREUjsKKworCS8qIFdvcmthcm91bmQgZm9yIFRNUzMyMERNNjQ0NiBlcnJhdGEgMS4zLjIyICovCisJUkVHKFBTQ19TSUxWRVJfQlVMTEVUKSA9IDA7CisKKwkvKiBQb3dlciBvbiByZXF1aXJlZCBwZXJpcGhlcmFscyAqLworCWxwc2Nfb24oREFWSU5DSV9MUFNDX0VNQUMpOworCWxwc2Nfb24oREFWSU5DSV9MUFNDX0VNQUNfV1JBUFBFUik7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfTURJTyk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfSTJDKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19VQVJUMCk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfVElNRVIxKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19HUElPKTsKKworCS8qIFBvd2VydXAgdGhlIERTUCAqLworCWRzcF9vbigpOworCisJLyogQnJpbmd1cCBVQVJUMCBvdXQgb2YgcmVzZXQgKi8KKwlSRUcoVUFSVDBfUFdSRU1VX01HTVQpID0gMHgwMDAwZTAwMzsKKworCS8qIEVuYWJsZSBHSU8zLjNWIGNlbGxzIHVzZWQgZm9yIEVNQUMgKi8KKwlSRUcoVkREM1AzVl9QV0ROKSA9IDA7CisKKwkvKiBFbmFibGUgVUFSVDAgTVVYIGxpbmVzICovCisJUkVHKFBJTk1VWDEpIHw9IDE7CisKKwkvKiBFbmFibGUgRU1BQyBhbmQgQUVNSUYgcGlucyAqLworCVJFRyhQSU5NVVgwKSA9IDB4ODAwMDBjMWY7CisKKwkvKiBFbmFibGUgSTJDIHBpbiBNdXggKi8KKwlSRUcoUElOTVVYMSkgfD0gKDEgPDwgNyk7CisKKwkvKiBTZXQgdGhlIEJ1cyBQcmlvcml0eSBSZWdpc3RlciB0byBhcHByb3ByaWF0ZSB2YWx1ZSAqLworCVJFRyhWQlBSKSA9IDB4MjA7CisKKwl0aW1lcl9pbml0KCk7CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwl1X2ludDhfdAl0bXBbMjBdLCBidWZbMTBdOworCWludAkJaSA9IDA7CisJaW50CQljbGsgPSAwOworCisKKwljbGsgPSAoKFJFRyhQTEwyX1BMTE0pICsgMSkgKiAyNykgLyAoKFJFRyhQTEwyX0RJVjIpICYgMHgxZikgKyAxKTsKKworCXByaW50ZiAoIkFSTSBDbG9jayA6ICVkTUh6XG4iLCAoKFJFRyhQTEwxX1BMTE0pICsgMSkgKiAyNyApIC8gMik7CisJcHJpbnRmICgiRERSIENsb2NrIDogJWRNSHpcbiIsIChjbGsgLyAyKSk7CisKKwkvKiBTZXQgRXRoZXJuZXQgTUFDIGFkZHJlc3MgZnJvbSBFRVBST00gKi8KKwlpZiAoaTJjX3JlYWQoQ0ZHX0kyQ19FRVBST01fQUREUiwgMHg3ZjAwLCBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTiwgYnVmLCA2KSkgeworCQlwcmludGYoIlxuRUVQUk9NIEAgMHglMDJ4IHJlYWQgRkFJTEVEISEhXG4iLCBDRkdfSTJDX0VFUFJPTV9BRERSKTsKKwl9IGVsc2UgeworCQl0bXBbMF0gPSAweGZmOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJdG1wWzBdICY9IGJ1ZltpXTsKKworCQlpZiAoKHRtcFswXSAhPSAweGZmKSAmJiAoZ2V0ZW52KCJldGhhZGRyIikgPT0gTlVMTCkpIHsKKwkJCXNwcmludGYoKGNoYXIgKikmdG1wWzBdLCAiJTAyaGh4OiUwMmhoeDolMDJoaHg6JTAyaGh4OiUwMmhoeDolMDJoaHgiLAorCQkJCWJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSwgYnVmWzRdLCBidWZbNV0pOworCQkJc2V0ZW52KCJldGhhZGRyIiwgKGNoYXIgKikmdG1wWzBdKTsKKwkJfQorCX0KKworCWlmICghZXRoX2h3X2luaXQoKSkgeworCQlwcmludGYoImV0aGVybmV0IGluaXQgZmFpbGVkIVxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJFVEggUEhZICAgOiAlc1xuIiwgcGh5Lm5hbWUpOworCX0KKworCXJldHVybigwKTsKK30KKworaW50IGRyYW1faW5pdCh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJZ2QtPmJkLT5iaV9kcmFtWzBdLnN0YXJ0ID0gUEhZU19TRFJBTV8xOworCWdkLT5iZC0+YmlfZHJhbVswXS5zaXplID0gUEhZU19TRFJBTV8xX1NJWkU7CisKKwlyZXR1cm4oMCk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL3NvbmF0YS91LWJvb3QubGRzIGIvYm9hcmQvZGF2aW5jaS9zb25hdGEvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBiMmEyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZGF2aW5jaS9zb25hdGEvdS1ib290LmxkcwpAQCAtMCwwICsxLDUyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKwkuID0gQUxJR04oNCk7CisJLnRleHQJOgorCXsKKwkgIGNwdS9hcm05MjZlanMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IC47CisJX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKwkudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorCV9fdV9ib290X2NtZF9lbmQgPSAuOworCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2RlbHRhL2RlbHRhLmMgYi9ib2FyZC9kZWx0YS9kZWx0YS5jCmluZGV4IGIxMjdhYzguLjZlMjI3NzQgMTAwNjQ0Ci0tLSBhL2JvYXJkL2RlbHRhL2RlbHRhLmMKKysrIGIvYm9hcmQvZGVsdGEvZGVsdGEuYwpAQCAtMSwxMCArMSw2IEBACiAvKgotICogKEMpIENvcHlyaWdodCAyMDAyCi0gKiBLeWxlIEhhcnJpcywgTmV4dXMgVGVjaG5vbG9naWVzLCBJbmMuIGtoYXJyaXNAbmV4dXMtdGVjaC5uZXQKLSAqCi0gKiAoQykgQ29weXJpZ2h0IDIwMDIKLSAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgotICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCiAgKgogICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICAqIHByb2plY3QuCkBAIC05OCw3ICs5NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogLyoKICAqIE1hZ2ljIEtleSBIYW5kbGluZywgbWFpbmx5IGNvcGllZCBmcm9tIGJvYXJkL2x3bW9uL2x3bW9uLmMKICAqLwpAQCAtMzI0LDYgKzMxOSwxMiBAQAogCQlyZXR1cm47CiAJfQogCisJdmFsID0gMHg4MDsKKwlpZihpMmNfd3JpdGUoYWRkciwgSVJRX01BU0tfQiwgMSwgJnZhbCwgMSkpIHsKKwkJcHJpbnRmKCJFcnJvciBhY2Nlc3NpbmcgREE5MDMwIHZpYSBpMmMuXG4iKTsKKwkJcmV0dXJuOworCX0KKwogCWkyY19yZWdfd3JpdGUoYWRkciwgUkVHX0NPTlRST0xfMV85NywgMHhmZCk7IC8qIGRpc2FibGUgTERPMSwgZW5hYmxlIExETzYgKi8KIAlpMmNfcmVnX3dyaXRlKGFkZHIsIExETzJfMywgMHhkMSk7CS8qIExETzIgPTEsOVYsIExETzM9MywxViAqLwogCWkyY19yZWdfd3JpdGUoYWRkciwgTERPNF81LCAweGNjKTsJLyogTERPMiA9MSw5ViwgTERPMz0zLDFWICovCmRpZmYgLS1naXQgYS9ib2FyZC9kZWx0YS9uYW5kLmMgYi9ib2FyZC9kZWx0YS9uYW5kLmMKaW5kZXggZDE3MDkzOC4uYTYzNWE2NSAxMDA2NDQKLS0tIGEvYm9hcmQvZGVsdGEvbmFuZC5jCisrKyBiL2JvYXJkL2RlbHRhL25hbmQuYwpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogI2lmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKIAogI2luY2x1ZGUgPG5hbmQuaD4KZGlmZiAtLWdpdCBhL2JvYXJkL2VYYWxpb24vdS1ib290LmxkcyBiL2JvYXJkL2VYYWxpb24vdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlZTNmZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9lWGFsaW9uL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvcHBjc3RyaW5nLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy92c3ByaW50Zi5vCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvemxpYi5vCQkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9lbWsvdG9wNTIwMC90b3A1MjAwLmMgYi9ib2FyZC9lbWsvdG9wNTIwMC90b3A1MjAwLmMKaW5kZXggZDc0MWU2Yi4uY2NiZDcyYSAxMDA2NDQKLS0tIGEvYm9hcmQvZW1rL3RvcDUyMDAvdG9wNTIwMC5jCisrKyBiL2JvYXJkL2Vtay90b3A1MjAwL3RvcDUyMDAuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIHByb3ZpZGUgdGhlIElERSBSZXNldCBGdW5jdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV9SRVNFVCkKIAogdm9pZCBpbml0X2lkZV9yZXNldCAodm9pZCkKIHsKQEAgLTIwNSw0ICsyMDUsNCBAQAogCQkqKHZ1X2xvbmcgKikgTVBDNVhYWF9XVV9HUElPX0RBVEFfTyB8PSAgR1BJT19QU0MxXzQ7CiAJfQogfQotI2VuZGlmIC8qIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9lbWsvdG9wNTIwMC91LWJvb3QubGRzIGIvYm9hcmQvZW1rL3RvcDUyMDAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzNDMyZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9lbWsvdG9wNTIwMC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9lcDgyNDgvdS1ib290LmxkcyBiL2JvYXJkL2VwODI0OC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGM0YjQ2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL2VwODI0OC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogTW9kaWZpZWQgYnkgWXVsaSBCYXJjb2hlbiA8eXVsaUBhcmFiZWxsYXN3LmNvbT4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQotRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXA4MjYwL3UtYm9vdC5sZHMgYi9ib2FyZC9lcDgyNjAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1MGU4My4uMDAwMDAwMAotLS0gYS9ib2FyZC9lcDgyNjAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDAyCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9vcHQvY3Jvc3MvbGliKTsgU0VBUkNIX0RJUigvb3B0L2Nyb3NzL3Bvd2VycGMtbGludXgvbGliKTsKLS8qIFNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOyAqLwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLS8qICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KSAqLwotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9lcDgyeHhtL3UtYm9vdC5sZHMgYi9ib2FyZC9lcDgyeHhtL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YzRiNDYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvZXA4Mnh4bS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogTW9kaWZpZWQgYnkgWXVsaSBCYXJjb2hlbiA8eXVsaUBhcmFiZWxsYXN3LmNvbT4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQotRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL2FzaDQwNS9hc2g0MDUuYyBiL2JvYXJkL2VzZC9hc2g0MDUvYXNoNDA1LmMKaW5kZXggODRmYzNhMC4uZjQxZWI3YiAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL2FzaDQwNS9hc2g0MDUuYworKysgYi9ib2FyZC9lc2QvYXNoNDA1L2FzaDQwNS5jCkBAIC0yMzgsNyArMjM4LDcgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIGV4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CiAKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9jbXM3MDAvY21zNzAwLmMgYi9ib2FyZC9lc2QvY21zNzAwL2NtczcwMC5jCmluZGV4IGNiMDQ3MTAuLjYzNWJhMmYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9jbXM3MDAvY21zNzAwLmMKKysrIGIvYm9hcmQvZXNkL2NtczcwMC9jbXM3MDAuYwpAQCAtMjM1LDcgKzIzNSw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiBleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOwogCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvY29tbW9uL2F1dG9fdXBkYXRlLmMgYi9ib2FyZC9lc2QvY29tbW9uL2F1dG9fdXBkYXRlLmMKaW5kZXggMDAxZmQ2OC4uNjJmNmMyMCAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL2NvbW1vbi9hdXRvX3VwZGF0ZS5jCisrKyBiL2JvYXJkL2VzZC9jb21tb24vYXV0b191cGRhdGUuYwpAQCAtMjQsNyArMjQsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKICN3YXJuaW5nIENGR19OQU5EX0xFR0FDWSBub3QgZGVmaW5lZCBpbiBhIGZpbGUgdXNpbmcgdGhlIGxlZ2FjeSBOQU5EIHN1cHBvcnQhCiAjZW5kaWYKIApAQCAtMzksOCArMzksOCBAQAogCiAjaWZkZWYgQ09ORklHX0FVVE9fVVBEQVRFCiAKLSNpZiAhKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkFUKQotI2Vycm9yICJtdXN0IGRlZmluZSBDRkdfQ01EX0ZBVCIKKyNpZiAhZGVmaW5lZChDT05GSUdfQ01EX0ZBVCkKKyNlcnJvciAibXVzdCBkZWZpbmUgQ09ORklHX0NNRF9GQVQiCiAjZW5kaWYKIAogZXh0ZXJuIGF1X2ltYWdlX3QgYXVfaW1hZ2VbXTsKQEAgLTczLDcgKzczLDcgQEAKIGV4dGVybiBpbnQgZmxhc2hfc2VjdF9wcm90ZWN0IChpbnQsIHVsb25nLCB1bG9uZyk7CiBleHRlcm4gaW50IGZsYXNoX3dyaXRlIChjaGFyICosIHVsb25nLCB1bG9uZyk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAvKiByZWZlcmVuY2VzIHRvIG5hbWVzIGluIGNtZF9uYW5kLmMgKi8KICNkZWZpbmUgTkFORFJXX1JFQUQJMHgwMQogI2RlZmluZSBOQU5EUldfV1JJVEUJMHgwMApAQCAtODMsNyArODMsNyBAQAogZXh0ZXJuIGludCBuYW5kX2xlZ2FjeV9ydyhzdHJ1Y3QgbmFuZF9jaGlwKiBuYW5kLCBpbnQgY21kLCBzaXplX3Qgc3RhcnQsIHNpemVfdCBsZW4sCiAJCSAgIHNpemVfdCAqIHJldGxlbiwgdV9jaGFyICogYnVmKTsKIGV4dGVybiBpbnQgbmFuZF9sZWdhY3lfZXJhc2Uoc3RydWN0IG5hbmRfY2hpcCogbmFuZCwgc2l6ZV90IG9mcywgc2l6ZV90IGxlbiwgaW50IGNsZWFuKTsKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkgKi8KKyNlbmRpZgogCiBleHRlcm4gYmxvY2tfZGV2X2Rlc2NfdCBpZGVfZGV2X2Rlc2NbQ0ZHX0lERV9NQVhERVZJQ0VdOwogCkBAIC0xODcsNyArMTg3LDcgQEAKIAlpbnQgb2ZmLCByYzsKIAl1aW50IG5ieXRlczsKIAlpbnQgazsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAJaW50IHRvdGFsOwogI2VuZGlmCiAKQEAgLTI2MSw3ICsyNjEsNyBAQAogCQkJZGVidWcgKCJmbGFzaF9zZWN0X2VyYXNlKCVseCwgJWx4KTtcbiIsIHN0YXJ0LCBlbmQpOwogCQkJZmxhc2hfc2VjdF9lcmFzZShzdGFydCwgZW5kKTsKIAkJfSBlbHNlIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAJCQlwcmludGYoIlVwZGF0aW5nIE5BTkQgRkxBU0ggd2l0aCBpbWFnZSAlc1xuIiwgYXVfaW1hZ2VbaV0ubmFtZSk7CiAJCQlkZWJ1ZyAoIm5hbmRfbGVnYWN5X2VyYXNlKCVseCwgJWx4KTtcbiIsIHN0YXJ0LCBlbmQpOwogCQkJcmMgPSBuYW5kX2xlZ2FjeV9lcmFzZSAobmFuZF9kZXZfZGVzYywgc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSwgMCk7CkBAIC0yODksNyArMjg5LDcgQEAKIAkJCWRlYnVnICgiZmxhc2hfd3JpdGUoJXAsICVseCAleClcbiIsIGFkZHIsIHN0YXJ0LCBuYnl0ZXMpOwogCQkJcmMgPSBmbGFzaF93cml0ZSgoY2hhciAqKWFkZHIsIHN0YXJ0LCBuYnl0ZXMpOwogCQl9IGVsc2UgewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICYmIGRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKIAkJCWRlYnVnICgibmFuZF9sZWdhY3lfcncoJXAsICVseCAleClcbiIsIGFkZHIsIHN0YXJ0LCBuYnl0ZXMpOwogCQkJcmMgPSBuYW5kX2xlZ2FjeV9ydyhuYW5kX2Rldl9kZXNjLCBOQU5EUldfV1JJVEUgfCBOQU5EUldfSkZGUzIsCiAJCQkJICAgICBzdGFydCwgbmJ5dGVzLCAoc2l6ZV90ICopJnRvdGFsLCAodWNoYXIgKilhZGRyKTsKQEAgLTMwNyw3ICszMDcsNyBAQAogCQlpZiAoYXVfaW1hZ2VbaV0udHlwZSAhPSBBVV9OQU5EKSB7CiAJCQlyYyA9IGNyYzMyICgwLCAodWNoYXIgKikoc3RhcnQgKyBvZmYpLCBudG9obChoZHItPmloX3NpemUpKTsKIAkJfSBlbHNlIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAJCQlyYyA9IG5hbmRfbGVnYWN5X3J3KG5hbmRfZGV2X2Rlc2MsIE5BTkRSV19SRUFEIHwgTkFORFJXX0pGRlMyIHwgTkFORFJXX0pGRlMyX1NLSVAsCiAJCQkJICAgICBzdGFydCwgbmJ5dGVzLCAoc2l6ZV90ICopJnRvdGFsLCAodWNoYXIgKilhZGRyKTsKIAkJCXJjID0gY3JjMzIgKDAsICh1Y2hhciAqKShhZGRyICsgb2ZmKSwgbnRvaGwoaGRyLT5paF9zaXplKSk7CmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvY29tbW9uL2NtZF9sb2FkcGNpLmMgYi9ib2FyZC9lc2QvY29tbW9uL2NtZF9sb2FkcGNpLmMKaW5kZXggYmY3OTZmZi4uZDg4YjM4NyAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL2NvbW1vbi9jbWRfbG9hZHBjaS5jCisrKyBiL2JvYXJkL2VzZC9jb21tb24vY21kX2xvYWRwY2kuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiBleHRlcm4gaW50IGRvX2Jvb3RtIChjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKIGV4dGVybiBpbnQgZG9fYXV0b3NjcmlwdCAoY21kX3RibF90ICosIGludCwgaW50LCBjaGFyICpbXSk7CmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvY3BjaTUyMDAvY3BjaTUyMDAuYyBiL2JvYXJkL2VzZC9jcGNpNTIwMC9jcGNpNTIwMC5jCmluZGV4IGE5MjViODQuLmFkYjg1OTcgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9jcGNpNTIwMC9jcGNpNTIwMC5jCisrKyBiL2JvYXJkL2VzZC9jcGNpNTIwMC9jcGNpNTIwMC5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkKIAogdm9pZCBpbml0X2lkZV9yZXNldCh2b2lkKQogewpAQCAtMjE3LDcgKzIxNyw3IEBACiAJCSoodnVfbG9uZyAqKSBNUEM1WFhYX1dVX0dQSU9fREFUQV9PIHw9IEdQSU9fUFNDMV80OwogCX0KIH0KLSNlbmRpZgkJCQkvKiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KKyNlbmRpZgogCiAjZGVmaW5lIE1QQzVYWFhfU0lNUExFSU9fR1BJT19FTkFCTEUgICAgICAgKE1QQzVYWFhfR1BJTyArIDB4MDAwNCkKICNkZWZpbmUgTVBDNVhYWF9TSU1QTEVJT19HUElPX0RJUiAgICAgICAgICAoTVBDNVhYWF9HUElPICsgMHgwMDBDKQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL2NwY2k1MjAwL3UtYm9vdC5sZHMgYi9ib2FyZC9lc2QvY3BjaTUyMDAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzNDMyZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9lc2QvY3BjaTUyMDAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzV4eHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL2NwY2k3NTAvaWRlLmMgYi9ib2FyZC9lc2QvY3BjaTc1MC9pZGUuYwppbmRleCBiZWE5OWNlLi4wMWI5MGM2IDEwMDY0NAotLS0gYS9ib2FyZC9lc2QvY3BjaTc1MC9pZGUuYworKysgYi9ib2FyZC9lc2QvY3BjaTc1MC9pZGUuYwpAQCAtMjUsNyArMjUsNyBAQAogCiAKICNpbmNsdWRlIDxjb21tb24uaD4KLSNpZmRlZiBDRkdfQ01EX0lERQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpCiAjaW5jbHVkZSA8YXRhLmg+CiAjaW5jbHVkZSA8aWRlLmg+CiAjaW5jbHVkZSA8cGNpLmg+CmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvY3BjaTc1MC9zZHJhbV9pbml0LmMgYi9ib2FyZC9lc2QvY3BjaTc1MC9zZHJhbV9pbml0LmMKaW5kZXggYzA5NDc1NS4uNzhkMTg4MCAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL2NwY2k3NTAvc2RyYW1faW5pdC5jCisrKyBiL2JvYXJkL2VzZC9jcGNpNzUwL3NkcmFtX2luaXQuYwpAQCAtMTI1Miw3ICsxMjUyLDcgQEAKIC8qIHNldHMgdXAgdGhlIEdUIHByb3Blcmx5IHdpdGggaW5mb3JtYXRpb24gcGFzc2VkIGluICovCiBpbnQgc2V0dXBfc2RyYW0gKEFVWF9NRU1fRElNTV9JTkZPICogaW5mbykKIHsKLQl1bG9uZyB0bXAsIGNoZWNrOworCXVsb25nIHRtcDsKIAl1bG9uZyB0bXBfc2RyYW1fbW9kZSA9IDA7CS8qIDB4MTQxYyAqLwogCXVsb25nIHRtcF9kdW5pdF9jb250cm9sX2xvdyA9IDA7CS8qIDB4MTQwNCAqLwogCWludCBpOwpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL2NwY2k3NTAvc2VyaWFsLmMgYi9ib2FyZC9lc2QvY3BjaTc1MC9zZXJpYWwuYwppbmRleCBiYTMyYWMxLi5lMWFmMzdlIDEwMDY0NAotLS0gYS9ib2FyZC9lc2QvY3BjaTc1MC9zZXJpYWwuYworKysgYi9ib2FyZC9lc2QvY3BjaTc1MC9zZXJpYWwuYwpAQCAtODAsNyArODAsNyBAQAogCX0KIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiB2b2lkIGtnZGJfc2VyaWFsX2luaXQgKHZvaWQpCiB7CiB9CkBAIC0xMDQsNCArMTA0LDQgQEAKIHsKIAlyZXR1cm47CiB9Ci0jZW5kaWYgLyogQ0ZHX0NNRF9LR0RCICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9oaDQwNS9oaDQwNS5jIGIvYm9hcmQvZXNkL2hoNDA1L2hoNDA1LmMKaW5kZXggZWEzNDRjMC4uOWVmNTkwNyAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL2hoNDA1L2hoNDA1LmMKKysrIGIvYm9hcmQvZXNkL2hoNDA1L2hoNDA1LmMKQEAgLTY5MCw3ICs2OTAsNyBAQAogI2VuZGlmIC8qIENPTkZJR19JREVfUkVTRVQgKi8KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIGV4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CiAKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9odWI0MDUvaHViNDA1LmMgYi9ib2FyZC9lc2QvaHViNDA1L2h1YjQwNS5jCmluZGV4IDFlMGFjY2IuLmRkMzcwNmUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9odWI0MDUvaHViNDA1LmMKKysrIGIvYm9hcmQvZXNkL2h1YjQwNS9odWI0MDUuYwpAQCAtMjYwLDcgKzI2MCw3IEBACiB9CiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiBleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOwogCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvbWVjcDUyMDAvbWVjcDUyMDAuYyBiL2JvYXJkL2VzZC9tZWNwNTIwMC9tZWNwNTIwMC5jCmluZGV4IGM0YjkxZTkuLmVhNDlmMjYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9tZWNwNTIwMC9tZWNwNTIwMC5jCisrKyBiL2JvYXJkL2VzZC9tZWNwNTIwMC9tZWNwNTIwMC5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFX1JFU0VUKQogCiAjZGVmaW5lIEdQSU9fUFNDMV80CTB4MDEwMDAwMDBVTAogCkBAIC0yMTgsNyArMjE4LDcgQEAKIAllbHNlCiAJCSoodnVfbG9uZyAqKSBNUEM1WFhYX1dVX0dQSU9fREFUQV9PIHw9IEdQSU9fUFNDMV80OwogfQotI2VuZGlmCQkJCS8qIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKSAqLworI2VuZGlmCiAKICNkZWZpbmUgTVBDNVhYWF9TSU1QTEVJT19HUElPX0VOQUJMRSAgICAgICAoTVBDNVhYWF9HUElPICsgMHgwMDA0KQogI2RlZmluZSBNUEM1WFhYX1NJTVBMRUlPX0dQSU9fRElSICAgICAgICAgIChNUEM1WFhYX0dQSU8gKyAweDAwMEMpCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvbWVjcDUyMDAvdS1ib290LmxkcyBiL2JvYXJkL2VzZC9tZWNwNTIwMC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTk5ZGQxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2VzZC9tZWNwNTIwMC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL29jcnRjL2NtZF9vY3J0Yy5jIGIvYm9hcmQvZXNkL29jcnRjL2NtZF9vY3J0Yy5jCmluZGV4IGZmYmI0YWQuLjQxNzdmNjggMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9vY3J0Yy9jbWRfb2NydGMuYworKysgYi9ib2FyZC9lc2Qvb2NydGMvY21kX29jcnRjLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDw0MDVncF9wY2kuaD4KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CU1ApCiAKIC8qCiAgKiBTZXQgZGV2aWNlIG51bWJlciBvbiBwY2kgYm9hcmQKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9wY2k0MDUvY21kX3BjaTQwNS5jIGIvYm9hcmQvZXNkL3BjaTQwNS9jbWRfcGNpNDA1LmMKaW5kZXggMDMxNWMzZC4uNWI1YWQ4YyAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL3BjaTQwNS9jbWRfcGNpNDA1LmMKKysrIGIvYm9hcmQvZXNkL3BjaTQwNS9jbWRfcGNpNDA1LmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlICJwY2k0MDUuaCIKIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CU1ApCiAKIGV4dGVybiBpbnQgZG9fYm9vdG0gKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pOwogZXh0ZXJuIGludCBkb19ib290dnggKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pOwpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL3BmNTIwMC9wZjUyMDAuYyBiL2JvYXJkL2VzZC9wZjUyMDAvcGY1MjAwLmMKaW5kZXggNzdlMTY0Yi4uNDhiODBiZiAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL3BmNTIwMC9wZjUyMDAuYworKysgYi9ib2FyZC9lc2QvcGY1MjAwL3BmNTIwMC5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFX1JFU0VUKQogCiB2b2lkIGluaXRfaWRlX3Jlc2V0KHZvaWQpCiB7CkBAIC0yMTcsNyArMjE3LDcgQEAKIAkJKih2dV9sb25nICopIE1QQzVYWFhfV1VfR1BJT19EQVRBX08gfD0gR1BJT19QU0MxXzQ7CiAJfQogfQotI2VuZGlmCQkJCS8qIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKSAqLworI2VuZGlmCiAKICNkZWZpbmUgTVBDNVhYWF9TSU1QTEVJT19HUElPX0VOQUJMRSAgICAgICAoTVBDNVhYWF9HUElPICsgMHgwMDA0KQogI2RlZmluZSBNUEM1WFhYX1NJTVBMRUlPX0dQSU9fRElSICAgICAgICAgIChNUEM1WFhYX0dQSU8gKyAweDAwMEMpCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvcGY1MjAwL3UtYm9vdC5sZHMgYi9ib2FyZC9lc2QvcGY1MjAwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMzQzMmUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvZXNkL3BmNTIwMC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvcGx1NDA1L3BsdTQwNS5jIGIvYm9hcmQvZXNkL3BsdTQwNS9wbHU0MDUuYwppbmRleCA1OTE3MWY4Li45MjBmNzE3IDEwMDY0NAotLS0gYS9ib2FyZC9lc2QvcGx1NDA1L3BsdTQwNS5jCisrKyBiL2JvYXJkL2VzZC9wbHU0MDUvcGx1NDA1LmMKQEAgLTI2Miw3ICsyNjIsNyBAQAogI2VuZGlmIC8qIENPTkZJR19JREVfUkVTRVQgKi8KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIGV4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CiAKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC92b2g0MDUvdm9oNDA1LmMgYi9ib2FyZC9lc2Qvdm9oNDA1L3ZvaDQwNS5jCmluZGV4IDIyOTk1YjUuLjNlMTE4ZTcgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC92b2g0MDUvdm9oNDA1LmMKKysrIGIvYm9hcmQvZXNkL3ZvaDQwNS92b2g0MDUuYwpAQCAtMzQyLDcgKzM0Miw3IEBACiAjZW5kaWYgLyogQ09ORklHX0lERV9SRVNFVCAqLwogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogZXh0ZXJuIHN0cnVjdCBuYW5kX2NoaXAgbmFuZF9kZXZfZGVzY1tDRkdfTUFYX05BTkRfREVWSUNFXTsKIApkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL3d1aDQwNS93dWg0MDUuYyBiL2JvYXJkL2VzZC93dWg0MDUvd3VoNDA1LmMKaW5kZXggNWExYTNmMy4uNjFkMWQ2YyAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL3d1aDQwNS93dWg0MDUuYworKysgYi9ib2FyZC9lc2Qvd3VoNDA1L3d1aDQwNS5jCkBAIC0yMzgsNyArMjM4LDcgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIGV4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CiAKZGlmZiAtLWdpdCBhL2JvYXJkL2V0aW4vZGVicmlzL3BoYW50b20uYyBiL2JvYXJkL2V0aW4vZGVicmlzL3BoYW50b20uYwppbmRleCAwYjgxZmMwLi4xOGFiNTAwIDEwMDY0NAotLS0gYS9ib2FyZC9ldGluL2RlYnJpcy9waGFudG9tLmMKKysrIGIvYm9hcmQvZXRpbi9kZWJyaXMvcGhhbnRvbS5jCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPHJ0Yy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogI2RlZmluZSBSVENfQkFTRSAoQ0ZHX05WUkFNX0JBU0VfQUREUiArIDB4N2ZmZjgpCiAKZGlmZiAtLWdpdCBhL2JvYXJkL2V0aW4vZGVicmlzL3UtYm9vdC5sZHMgYi9ib2FyZC9ldGluL2RlYnJpcy91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQyYmNkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2V0aW4vZGVicmlzL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkoLnRleHQpCi0gICAgbGliX3BwYy9ib2FyZC5vCSgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCSgudGV4dCkKLQotCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JKigudGV4dCkKLQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9ldGluL2t2bWUwODAvdS1ib290LmxkcyBiL2JvYXJkL2V0aW4va3ZtZTA4MC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGEzNjg3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL2V0aW4va3ZtZTA4MC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEtMjAwNgotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkoLnRleHQpCi0gICAgbGliX3BwYy9ib2FyZC5vCSgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCSgudGV4dCkKLQotCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JKigudGV4dCkKLQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2V2YjY0MjYwL2V0aC5jIGIvYm9hcmQvZXZiNjQyNjAvZXRoLmMKaW5kZXggZWFmYTQ4Yi4uYWRkMmIzZCAxMDA2NDQKLS0tIGEvYm9hcmQvZXZiNjQyNjAvZXRoLmMKKysrIGIvYm9hcmQvZXZiNjQyNjAvZXRoLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlICJldGguaCIKICNpbmNsdWRlICJldGhfYWRkcnRibC5oIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQogCiAjZGVmaW5lIEdUNjQyNnhfRVRIX0JVRl9TSVpFCTE1MzYKIApAQCAtNzk3LDExICs3OTcsMTEgQEAKIAogCiAJCWV0aF9yZWdpc3RlcihkZXYpOwotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKIAkJbWlpcGh5X3JlZ2lzdGVyKGRldi0+bmFtZSwKIAkJCQlndDY0MjZ4X21paXBoeV9yZWFkLCBndDY0MjZ4X21paXBoeV93cml0ZSk7CiAjZW5kaWYKIAl9CiAKIH0KLSNlbmRpZiAvKiBDRkdfQ01EX05FVCAmJiBDT05GSUdfTkVUX01VTFRJICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2V2YjY0MjYwL3NlcmlhbC5jIGIvYm9hcmQvZXZiNjQyNjAvc2VyaWFsLmMKaW5kZXggMTkxNDQ1Yy4uZjFiY2FiMyAxMDA2NDQKLS0tIGEvYm9hcmQvZXZiNjQyNjAvc2VyaWFsLmMKKysrIGIvYm9hcmQvZXZiNjQyNjAvc2VyaWFsLmMKQEAgLTE1Myw3ICsxNTMsNyBAQAogCX0KIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiB2b2lkCiBrZ2RiX3NlcmlhbF9pbml0KHZvaWQpCiB7CkBAIC0xODIsNCArMTgyLDQgQEAKIHsKIAlyZXR1cm47CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9LR0RCCSovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2V2YjY0MjYwL3p1bWFfcGJiLmMgYi9ib2FyZC9ldmI2NDI2MC96dW1hX3BiYi5jCmluZGV4IGQ2NDAyNWEuLjI5NmU0NjEgMTAwNjQ0Ci0tLSBhL2JvYXJkL2V2YjY0MjYwL3p1bWFfcGJiLmMKKysrIGIvYm9hcmQvZXZiNjQyNjAvenVtYV9wYmIuYwpAQCAtMSw3ICsxLDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNlbmRpZgogCkBAIC0xNjYsNyArMTY2LDcgQEAKIAogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CU1ApCiAKIHN0YXRpYyBpbnQgbGFzdF9jbWQgPSA0OwkJLyogd3JpdGUgaW5jcmVtZW50ICovCiBzdGF0aWMgaW50IGxhc3Rfc2l6ZSA9IDY0OwpAQCAtMjE3LDQgKzIxNyw0IEBACiAJIiAgICAtIGluaXQgenVtYSBtYm94XG4iCiApOwogCi0jZW5kaWYgLyogQ0ZHX0NNRF9CU1AgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvZmFkcy9mYWRzLmMgYi9ib2FyZC9mYWRzL2ZhZHMuYwppbmRleCA3YjA0YWY1Li44ZjU3MzZiIDEwMDY0NAotLS0gYS9ib2FyZC9mYWRzL2ZhZHMuYworKysgYi9ib2FyZC9mYWRzL2ZhZHMuYwpAQCAtNzc4LDcgKzc3OCw3IEBACiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogCiAjaWZkZWYgQ0ZHX1BDTUNJQV9NRU1fQUREUgogdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqcGNtY2lhX21lbSA9ICh1bnNpZ25lZCBjaGFyKilDRkdfUENNQ0lBX01FTV9BRERSOwpAQCAtOTIxLDcgKzkyMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIApkaWZmIC0tZ2l0IGEvYm9hcmQvZmFkcy9mYWRzLmggYi9ib2FyZC9mYWRzL2ZhZHMuaAppbmRleCA0MWYxOGI1Li5jNmY3Y2NkIDEwMDY0NAotLS0gYS9ib2FyZC9mYWRzL2ZhZHMuaAorKysgYi9ib2FyZC9mYWRzL2ZhZHMuaApAQCAtOTUsMjEgKzk1LDMzIEBACiAjZGVmaW5lIENGR19ESVNDT1ZFUl9QSFkKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19DT01NQU5EUwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMICAgXAotCQkJIHwgQ0ZHX0NNRF9BU0tFTlYgXAotCQkJIHwgQ0ZHX0NNRF9ESENQICAgXAotCQkJIHwgQ0ZHX0NNRF9FQ0hPICAgXAotCQkJIHwgQ0ZHX0NNRF9JTU1BUCAgXAotCQkJIHwgQ0ZHX0NNRF9KRkZTMiAgXAotCQkJIHwgQ0ZHX0NNRF9NSUkgICAgXAotCQkJIHwgQ0ZHX0NNRF9QQ01DSUEgXAotCQkJIHwgQ0ZHX0NNRF9QSU5HICAgXAotCQkJKQotI2VuZGlmIC8qICFDT05GSUdfQ09NTUFORFMgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisjaWYgIWRlZmluZWQoRkFEU19DT01NQU5EU19BTFJFQURZX0RFRklORUQpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BDTUNJQQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKworI2VuZGlmCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTExOCw3ICsxMzAsNyBAQAogI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCQkvKiAjdW5kZWYgdG8gc2F2ZSBtZW1vcnkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjE3LDcgKzIyOSw3IEBACiAKICNkZWZpbmUJQ0ZHX0RJUkVDVF9GTEFTSF9URlRQCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAKIC8qCiAgKiBKRkZTMiBwYXJ0aXRpb25zCkBAIC0yMzgsNyArMjUwLDcgQEAKICovCiAKICNkZWZpbmUgQ0ZHX0pGRlMyX1NPUlRfRlJBR01FTlRTCi0jZW5kaWYgLyogQ0ZHX0NNRF9KRkZTMiAqLworI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIENhY2hlIENvbmZpZ3VyYXRpb24KQEAgLTI0OSw3ICsyNjEsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogSTJDIGNvbmZpZ3VyYXRpb24KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogI2RlZmluZSBDT05GSUdfSEFSRF9JMkMJCTEJLyogSTJDIHdpdGggaGFyZHdhcmUgc3VwcG9ydCAqLwogI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMDAJLyogSTJDIHNwZWVkIGFuZCBzbGF2ZSBhZGRyZXNzIGRlZmF1bHRzICovCiAjZGVmaW5lIENGR19JMkNfU0xBVkUJCTB4N0YKQEAgLTQ2Nyw3ICs0NzksNyBAQAogI2RlZmluZSBDT05GSUdfSVNPX1BBUlRJVElPTgkxCiAKICN1bmRlZglDT05GSUdfQVRBUEkKLSNpZiAwCS8qIGRvZXMgbm90IG1ha2Ugc2Vuc2Ugd2hlbiBDRkdfQ01EX0lERSBpcyBub3QgZW5hYmxlZCwgdG9vICovCisjaWYgMAkvKiBkb2VzIG5vdCBtYWtlIHNlbnNlIHdoZW4gQ09ORklHX0NNRF9JREUgaXMgbm90IGVuYWJsZWQsIHRvbyAqLwogI2RlZmluZSBDT05GSUdfSURFXzh4eF9QQ0NBUkQJMQkvKiBVc2UgSURFIHdpdGggUEMgQ2FyZCBBZGFwdGVyICovCiAjZW5kaWYKICN1bmRlZglDT05GSUdfSURFXzh4eF9ESVJFQ1QJCS8qIERpcmVjdCBJREUJIG5vdCBzdXBwb3J0ZWQJKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2ZhZHMvcGNtY2lhLmMgYi9ib2FyZC9mYWRzL3BjbWNpYS5jCmluZGV4IDk3OGMxNmIuLjU3YTI0NTQgMTAwNjQ0Ci0tLSBhL2JvYXJkL2ZhZHMvcGNtY2lhLmMKKysrIGIvYm9hcmQvZmFkcy9wY21jaWEuYwpAQCAtNCwxMSArNCwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTczLDEyICs3MywxMiBAQAogCXJldHVybiAwOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBpbnQgcGNtY2lhX2hhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCiB7CiAJKigodWludCAqKUJDU1IxKSAmPSB+QkNTUjFfUENDRU47CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgogCiAjZW5kaWYJLyogQ09ORklHX1BDTUNJQSAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvZnJlZXNjYWxlL2NvbW1vbi9waXhpcy5jIGIvYm9hcmQvZnJlZXNjYWxlL2NvbW1vbi9waXhpcy5jCmluZGV4IGFmOTgxNTcuLjk5Y2MyZWUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2ZyZWVzY2FsZS9jb21tb24vcGl4aXMuYworKysgYi9ib2FyZC9mcmVlc2NhbGUvY29tbW9uL3BpeGlzLmMKQEAgLTMyMSwxMCArMzIxLDEwIEBACiAJCW11bGNvbnN0ID0gMTsKIAkJZm9yIChpID0gMDsgaSA8IGRlY2Fycl9sZW47IGkrKykKIAkJCW11bGNvbnN0ICo9IDEwOwotCQlkZWN2YWwgPSBzaW1wbGVfc3RydG91bChkZWNhcnIsIE5VTEwsIDEwKTsKKwkJZGVjdmFsID0gc2ltcGxlX3N0cnRvdWwoKGNoYXIgKilkZWNhcnIsIE5VTEwsIDEwKTsKIAl9CiAKLQlpbnR2YWwgPSBzaW1wbGVfc3RydG91bChpbnRhcnIsIE5VTEwsIDEwKTsKKwlpbnR2YWwgPSBzaW1wbGVfc3RydG91bCgoY2hhciAqKWludGFyciwgTlVMTCwgMTApOwogCWludHZhbCA9IGludHZhbCAqIG11bGNvbnN0OwogCiAJcmV0dmFsID0gaW50dmFsICsgZGVjdmFsOwpAQCAtMzYyLDcgKzM2Miw3IEBACiAKIAkJdmFsID0gc2V0X3B4X3N5c2NsayhzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxMCkpOwogCi0JCWNvcmVwbGwgPSBzdHJmcmFjdG9pbnQoYXJndlszXSk7CisJCWNvcmVwbGwgPSBzdHJmcmFjdG9pbnQoKHVjaGFyICopYXJndlszXSk7CiAJCXZhbCA9IHZhbCArIHNldF9weF9jb3JlcGxsKGNvcmVwbGwpOwogCQl2YWwgPSB2YWwgKyBzZXRfcHhfbXB4cGxsKHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNF0sIE5VTEwsIDEwKSk7CiAJCWlmICh2YWwgPT0gMykgewpAQCAtNDEwLDcgKzQxMCw3IEBACiAJCQlyZWFkX2Zyb21fcHhfcmVncygwKTsKIAkJCXJlYWRfZnJvbV9weF9yZWdzX2FsdGJhbmsoMCk7CiAJCQl2YWwgPSBzZXRfcHhfc3lzY2xrKHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDEwKSk7Ci0JCQljb3JlcGxsID0gc3RyZnJhY3RvaW50KGFyZ3ZbNF0pOworCQkJY29yZXBsbCA9IHN0cmZyYWN0b2ludCgodWNoYXIgKilhcmd2WzRdKTsKIAkJCXZhbCA9IHZhbCArIHNldF9weF9jb3JlcGxsKGNvcmVwbGwpOwogCQkJdmFsID0gdmFsICsgc2V0X3B4X21weHBsbChzaW1wbGVfc3RydG91bChhcmd2WzVdLAogCQkJCQkJCQkgTlVMTCwgMTApKTsKZGlmZiAtLWdpdCBhL2JvYXJkL2ZyZWVzY2FsZS9tcGM4MzIzZXJkYi9NYWtlZmlsZSBiL2JvYXJkL2ZyZWVzY2FsZS9tcGM4MzIzZXJkYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2M5NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZnJlZXNjYWxlL21wYzgzMjNlcmRiL01ha2VmaWxlCkBAIC0wLDAgKzEsNTAgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK0NPQkpTCTo9ICQoQk9BUkQpLm8KKworU1JDUwk6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCitTT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL2ZyZWVzY2FsZS9tcGM4MzIzZXJkYi9jb25maWcubWsgYi9ib2FyZC9mcmVlc2NhbGUvbXBjODMyM2VyZGIvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMGQzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9mcmVlc2NhbGUvbXBjODMyM2VyZGIvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKKyMKKyMgTVBDODMyM0VSREIKKyMKKworVEVYVF9CQVNFID0gMHhGRTAwMDAwMApkaWZmIC0tZ2l0IGEvYm9hcmQvZnJlZXNjYWxlL21wYzgzMjNlcmRiL21wYzgzMjNlcmRiLmMgYi9ib2FyZC9mcmVlc2NhbGUvbXBjODMyM2VyZGIvbXBjODMyM2VyZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODg2ZjE5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZnJlZXNjYWxlL21wYzgzMjNlcmRiL21wYzgzMjNlcmRiLmMKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBNaWNoYWVsIEJhcmtvd3NraSA8bWljaGFlbC5iYXJrb3dza2lAZnJlZXNjYWxlLmNvbT4KKyAqIEJhc2VkIG9uIG1wYzgzMnhtZHMgZmlsZSBieSBEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGlvcG9ydHMuaD4KKyNpbmNsdWRlIDxtcGM4M3h4Lmg+CisjaW5jbHVkZSA8aTJjLmg+CisjaW5jbHVkZSA8c3BkLmg+CisjaW5jbHVkZSA8bWlpcGh5Lmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGxpYmZkdC5oPgorI2luY2x1ZGUgPGxpYmZkdF9lbnYuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisjaW5jbHVkZSA8cGNpLmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKQorI2luY2x1ZGUgPHNwZF9zZHJhbS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxhc20vbW11Lmg+CisjZW5kaWYKKworY29uc3QgcWVfaW9wX2NvbmZfdCBxZV9pb3BfY29uZl90YWJbXSA9IHsKKwkvKiBVQ0MzICovCisJezEsICAwLCAxLCAwLCAxfSwgLyogVHhEMCAqLworCXsxLCAgMSwgMSwgMCwgMX0sIC8qIFR4RDEgKi8KKwl7MSwgIDIsIDEsIDAsIDF9LCAvKiBUeEQyICovCisJezEsICAzLCAxLCAwLCAxfSwgLyogVHhEMyAqLworCXsxLCAgOSwgMSwgMCwgMX0sIC8qIFR4RVIgKi8KKwl7MSwgMTIsIDEsIDAsIDF9LCAvKiBUeEVOICovCisJezMsIDI0LCAyLCAwLCAxfSwgLyogVHhDTEstPkNMSzEwICovCisKKwl7MSwgIDQsIDIsIDAsIDF9LCAvKiBSeEQwICovCisJezEsICA1LCAyLCAwLCAxfSwgLyogUnhEMSAqLworCXsxLCAgNiwgMiwgMCwgMX0sIC8qIFJ4RDIgKi8KKwl7MSwgIDcsIDIsIDAsIDF9LCAvKiBSeEQzICovCisJezEsICA4LCAyLCAwLCAxfSwgLyogUnhFUiAqLworCXsxLCAxMCwgMiwgMCwgMX0sIC8qIFJ4RFYgKi8KKwl7MCwgMTMsIDIsIDAsIDF9LCAvKiBSeENMSy0+Q0xLOSAqLworCXsxLCAxMSwgMiwgMCwgMX0sIC8qIENPTCAqLworCXsxLCAxMywgMiwgMCwgMX0sIC8qIENSUyAqLworCisJLyogVUNDMiAqLworCXswLCAxOCwgMSwgMCwgMX0sIC8qIFR4RDAgKi8KKwl7MCwgMTksIDEsIDAsIDF9LCAvKiBUeEQxICovCisJezAsIDIwLCAxLCAwLCAxfSwgLyogVHhEMiAqLworCXswLCAyMSwgMSwgMCwgMX0sIC8qIFR4RDMgKi8KKwl7MCwgMjcsIDEsIDAsIDF9LCAvKiBUeEVSICovCisJezAsIDMwLCAxLCAwLCAxfSwgLyogVHhFTiAqLworCXszLCAyMywgMiwgMCwgMX0sIC8qIFR4Q0xLLT5DTEszICovCisKKwl7MCwgMjIsIDIsIDAsIDF9LCAvKiBSeEQwICovCisJezAsIDIzLCAyLCAwLCAxfSwgLyogUnhEMSAqLworCXswLCAyNCwgMiwgMCwgMX0sIC8qIFJ4RDIgKi8KKwl7MCwgMjUsIDIsIDAsIDF9LCAvKiBSeEQzICovCisJezAsIDI2LCAxLCAwLCAxfSwgLyogUnhFUiAqLworCXswLCAyOCwgMiwgMCwgMX0sIC8qIFJ4X0RWICovCisJezMsIDIxLCAyLCAwLCAxfSwgLyogUnhDTEstPkNMSzE2ICovCisJezAsIDI5LCAyLCAwLCAxfSwgLyogQ09MICovCisJezAsIDMxLCAyLCAwLCAxfSwgLyogQ1JTICovCisKKwl7MywgIDQsIDMsIDAsIDJ9LCAvKiBNRElPICovCisJezMsICA1LCAxLCAwLCAyfSwgLyogTURDICovCisKKwl7MCwgIDAsIDAsIDAsIFFFX0lPUF9UQUJfRU5EfSwgLyogRU5EIG9mIHRhYmxlICovCit9OworCitpbnQgYm9hcmRfZWFybHlfaW5pdF9mKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBmaXhlZF9zZHJhbSh2b2lkKTsKKworbG9uZyBpbnQgaW5pdGRyYW0oaW50IGJvYXJkX3R5cGUpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl1MzIgbXNpemUgPSAwOworCisJaWYgKChpbS0+c3lzY29uZi5pbW1yYmFyICYgSU1NUkJBUl9CQVNFX0FERFIpICE9ICh1MzIpIGltKQorCQlyZXR1cm4gLTE7CisKKwkvKiBERFIgU0RSQU0gLSBNYWluIFNPRElNTSAqLworCWltLT5zeXNjb25mLmRkcmxhd1swXS5iYXIgPSBDRkdfRERSX0JBU0UgJiBMQVdCQVJfQkFSOworCisJbXNpemUgPSBmaXhlZF9zZHJhbSgpOworCisJcHV0cygiXG4gICBERFIgUkFNOiAiKTsKKworCS8qIHJldHVybiB0b3RhbCBidXMgU0RSQU0gc2l6ZShieXRlcykgIC0tIEREUiAqLworCXJldHVybiAobXNpemUgKiAxMDI0ICogMTAyNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZml4ZWQgc2RyYW0gaW5pdCAtLSBkb2Vzbid0IHVzZSBzZXJpYWwgcHJlc2VuY2UgZGV0ZWN0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBmaXhlZF9zZHJhbSh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdTMyIG1zaXplID0gMDsKKwl1MzIgZGRyX3NpemU7CisJdTMyIGRkcl9zaXplX2xvZzI7CisKKwltc2l6ZSA9IENGR19ERFJfU0laRTsKKwlmb3IgKGRkcl9zaXplID0gbXNpemUgPDwgMjAsIGRkcl9zaXplX2xvZzIgPSAwOworCSAgICAgKGRkcl9zaXplID4gMSk7IGRkcl9zaXplID0gZGRyX3NpemUgPj4gMSwgZGRyX3NpemVfbG9nMisrKSB7CisJCWlmIChkZHJfc2l6ZSAmIDEpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlpbS0+c3lzY29uZi5kZHJsYXdbMF0uYXIgPQorCSAgICBMQVdBUl9FTiB8ICgoZGRyX3NpemVfbG9nMiAtIDEpICYgTEFXQVJfU0laRSk7CisJaW0tPmRkci5zZHJhbV9jbGtfY250bCA9IENGR19ERFJfQ0xLX0NOVEw7CisJaW0tPmRkci5jc2JuZHNbMF0uY3NibmRzID0gQ0ZHX0REUl9DUzBfQk5EUzsKKwlpbS0+ZGRyLmNzX2NvbmZpZ1swXSA9IENGR19ERFJfQ1MwX0NPTkZJRzsKKwlpbS0+ZGRyLnRpbWluZ19jZmdfMCA9IENGR19ERFJfVElNSU5HXzA7CisJaW0tPmRkci50aW1pbmdfY2ZnXzEgPSBDRkdfRERSX1RJTUlOR18xOworCWltLT5kZHIudGltaW5nX2NmZ18yID0gQ0ZHX0REUl9USU1JTkdfMjsKKwlpbS0+ZGRyLnRpbWluZ19jZmdfMyA9IENGR19ERFJfVElNSU5HXzM7CisJaW0tPmRkci5zZHJhbV9jZmcgPSBDRkdfRERSX1NEUkFNX0NGRzsKKwlpbS0+ZGRyLnNkcmFtX2NmZzIgPSBDRkdfRERSX1NEUkFNX0NGRzI7CisJaW0tPmRkci5zZHJhbV9tb2RlID0gQ0ZHX0REUl9NT0RFOworCWltLT5kZHIuc2RyYW1fbW9kZTIgPSBDRkdfRERSX01PREUyOworCWltLT5kZHIuc2RyYW1faW50ZXJ2YWwgPSBDRkdfRERSX0lOVEVSVkFMOworCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIpOworCXVkZWxheSgyMDApOworCisJaW0tPmRkci5zZHJhbV9jZmcgfD0gU0RSQU1fQ0ZHX01FTV9FTjsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKKwlyZXR1cm4gbXNpemU7Cit9CisKK2ludCBjaGVja2JvYXJkKHZvaWQpCit7CisJcHV0cygiQm9hcmQ6IEZyZWVzY2FsZSBNUEM4MzIzRVJEQlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX3JlZ2lvbiBwY2lfcmVnaW9uc1tdID0geworCXsKKwkJYnVzX3N0YXJ0OiBDRkdfUENJMV9NRU1fQkFTRSwKKwkJcGh5c19zdGFydDogQ0ZHX1BDSTFfTUVNX1BIWVMsCisJCXNpemU6IENGR19QQ0kxX01FTV9TSVpFLAorCQlmbGFnczogUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX1BSRUZFVENICisJfSwKKwl7CisJCWJ1c19zdGFydDogQ0ZHX1BDSTFfTU1JT19CQVNFLAorCQlwaHlzX3N0YXJ0OiBDRkdfUENJMV9NTUlPX1BIWVMsCisJCXNpemU6IENGR19QQ0kxX01NSU9fU0laRSwKKwkJZmxhZ3M6IFBDSV9SRUdJT05fTUVNCisJfSwKKwl7CisJCWJ1c19zdGFydDogQ0ZHX1BDSTFfSU9fQkFTRSwKKwkJcGh5c19zdGFydDogQ0ZHX1BDSTFfSU9fUEhZUywKKwkJc2l6ZTogQ0ZHX1BDSTFfSU9fU0laRSwKKwkJZmxhZ3M6IFBDSV9SRUdJT05fSU8KKwl9Cit9OworCit2b2lkIHBjaV9pbml0X2JvYXJkKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9ICh2b2xhdGlsZSBpbW1hcF90ICopQ0ZHX0lNTVI7CisJdm9sYXRpbGUgY2xrODN4eF90ICpjbGsgPSAodm9sYXRpbGUgY2xrODN4eF90ICopJmltbXItPmNsazsKKwl2b2xhdGlsZSBsYXc4M3h4X3QgKnBjaV9sYXcgPSBpbW1yLT5zeXNjb25mLnBjaWxhdzsKKwlzdHJ1Y3QgcGNpX3JlZ2lvbiAqcmVnW10gPSB7IHBjaV9yZWdpb25zIH07CisKKwkvKiBFbmFibGUgYWxsIDMgUENJX0NMS19PVVRQVVRzLiAqLworCWNsay0+b2NjciB8PSAweGUwMDAwMDAwOworCisJLyogQ29uZmlndXJlIFBDSSBMb2NhbCBBY2Nlc3MgV2luZG93cyAqLworCXBjaV9sYXdbMF0uYmFyID0gQ0ZHX1BDSTFfTUVNX1BIWVMgJiBMQVdCQVJfQkFSOworCXBjaV9sYXdbMF0uYXIgPSBMQkxBV0FSX0VOIHwgTEJMQVdBUl81MTJNQjsKKworCXBjaV9sYXdbMV0uYmFyID0gQ0ZHX1BDSTFfSU9fUEhZUyAmIExBV0JBUl9CQVI7CisJcGNpX2xhd1sxXS5hciA9IExCTEFXQVJfRU4gfCBMQkxBV0FSXzFNQjsKKworCW1wYzgzeHhfcGNpX2luaXQoMSwgcmVnLCAwKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX09GX0JPQVJEX1NFVFVQKQorCisvKgorICogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UuCisgKi8KK3ZvaWQgZnRfY3B1X3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKTsKKworI2lmZGVmIENPTkZJR19QQ0kKK3ZvaWQgZnRfcGNpX3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKTsKKyNlbmRpZgorCit2b2lkCitmdF9ib2FyZF9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCkKK3sKKwlpbnQgbm9kZW9mZnNldDsKKwlpbnQgdG1wWzJdOworCisJbm9kZW9mZnNldCA9IGZkdF9maW5kX25vZGVfYnlfcGF0aChibG9iLCAiL21lbW9yeSIpOworCWlmIChub2Rlb2Zmc2V0ID49IDApIHsKKwkJdG1wWzBdID0gY3B1X3RvX2JlMzIoYmQtPmJpX21lbXN0YXJ0KTsKKwkJdG1wWzFdID0gY3B1X3RvX2JlMzIoYmQtPmJpX21lbXNpemUpOworCQlmZHRfc2V0cHJvcChibG9iLCBub2Rlb2Zmc2V0LCAicmVnIiwgdG1wLCBzaXplb2YodG1wKSk7CisJfQorCisJZnRfY3B1X3NldHVwKGJsb2IsIGJkKTsKKworI2lmZGVmIENPTkZJR19QQ0kKKwlmdF9wY2lfc2V0dXAoYmxvYiwgYmQpOworI2VuZGlmCit9CisjZW5kaWYgLyogQ09ORklHX09GX0JPQVJEX1NFVFVQICovCmRpZmYgLS1naXQgYS9ib2FyZC9mcmVlc2NhbGUvbXBjODU0NGRzL01ha2VmaWxlIGIvYm9hcmQvZnJlZXNjYWxlL21wYzg1NDRkcy9NYWtlZmlsZQppbmRleCBiZWMyMTY4Li4zMDhmNzA3IDEwMDY0NAotLS0gYS9ib2FyZC9mcmVlc2NhbGUvbXBjODU0NGRzL01ha2VmaWxlCisrKyBiL2JvYXJkL2ZyZWVzY2FsZS9tcGM4NTQ0ZHMvTWFrZWZpbGUKQEAgLTI0LDkgKzI0LDkgQEAKIAogaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCiAKLSMgaWZuZXEgKCQoT0JKVFJFRSksJChTUkNUUkVFKSkKLSMgJChzaGVsbCBta2RpciAtcCAkKG9iaikuL2NvbW1vbikKLSMgZW5kaWYKK2lmbmVxICgkKE9CSlRSRUUpLCQoU1JDVFJFRSkpCiskKHNoZWxsIG1rZGlyIC1wICQob2JqKS4uL2NvbW1vbikKK2VuZGlmCiAKIExJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKIApkaWZmIC0tZ2l0IGEvYm9hcmQvZnJlZXNjYWxlL21wYzg1NDRkcy9pbml0LlMgYi9ib2FyZC9mcmVlc2NhbGUvbXBjODU0NGRzL2luaXQuUwppbmRleCAyOTZmZWU1Li5lYTdkNTRkIDEwMDY0NAotLS0gYS9ib2FyZC9mcmVlc2NhbGUvbXBjODU0NGRzL2luaXQuUworKysgYi9ib2FyZC9mcmVlc2NhbGUvbXBjODU0NGRzL2luaXQuUwpAQCAtNTIsOCArNTIsOCBAQAogICovCiAKICNkZWZpbmUJZW50cnlfc3RhcnQgXAotCW1mbHIJcjEgCTsJXAotCWJsCTBmIAk7CisJbWZscglyMQk7CVwKKwlibAkwZgk7CiAKICNkZWZpbmUJZW50cnlfZW5kIFwKIDA6CW1mbHIJcjAJOwlcCkBAIC0yMTQsNyArMjE0LDcgQEAKIAkubG9uZwkwCiAJLmxvbmcJKExBV0FSX1RSR1RfRERSIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzEyOE0pKSAmIH5MQVdBUl9FTgogCi0JLmxvbmcJKENGR19QQ0kxX01FTV9CQVNFPj4xMikgJiAweGZmZmZmCisJLmxvbmcJKENGR19QQ0kxX01FTV9QSFlTPj4xMikgJiAweGZmZmZmCiAJLmxvbmcJTEFXQVJfRU4gfCBMQVdBUl9UUkdUX1BDSTEgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfNTEyTSkKIAogCS5sb25nCShDRkdfUENJMV9JT19QSFlTPj4xMikgJiAweGZmZmZmCmRpZmYgLS1naXQgYS9ib2FyZC9mcmVlc2NhbGUvbXBjODU0NGRzL21wYzg1NDRkcy5jIGIvYm9hcmQvZnJlZXNjYWxlL21wYzg1NDRkcy9tcGM4NTQ0ZHMuYwppbmRleCA0ZmYxZGE5Li44ZGRiYjAxIDEwMDY0NAotLS0gYS9ib2FyZC9mcmVlc2NhbGUvbXBjODU0NGRzL21wYzg1NDRkcy5jCisrKyBiL2JvYXJkL2ZyZWVzY2FsZS9tcGM4NTQ0ZHMvbXBjODU0NGRzLmMKQEAgLTIyLDggKzIyLDEwIEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cGNpLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF84NXh4Lmg+CisjaW5jbHVkZSA8YXNtL2ltbWFwX2ZzbF9wY2kuaD4KICNpbmNsdWRlIDxzcGQuaD4KICNpbmNsdWRlIDxtaWlwaHkuaD4KIApAQCAtNTEsMTIgKzUzLDE5IEBACiB7CiAJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfQ0NTUkJBUjsKIAl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAmaW1tYXAtPmltX2d1cjsKKwl2b2xhdGlsZSBjY3NyX2xiY190ICpsYmMgPSAmaW1tYXAtPmltX2xiYzsKKwl2b2xhdGlsZSBjY3NyX2xvY2FsX2VjbV90ICplY20gPSAmaW1tYXAtPmltX2xvY2FsX2VjbTsKIAogCWlmICgodWludCkmZ3VyLT5wb3JwbGxzciAhPSAweGUwMGUwMDAwKSB7CiAJCXByaW50ZigiaW1tYXAgc2l6ZSBlcnJvciAleFxuIiwmZ3VyLT5wb3JwbGxzcik7CiAJfQogCXByaW50ZiAoIkJvYXJkOiBNUEM4NTQ0RFNcbiIpOwogCisJbGJjLT5sdGVzciA9IDB4ZmZmZmZmZmY7CS8qIENsZWFyIExCQyBlcnJvciBpbnRlcnJ1cHRzICovCisJbGJjLT5sdGVpciA9IDB4ZmZmZmZmZmY7CS8qIEVuYWJsZSBMQkMgZXJyb3IgaW50ZXJydXB0cyAqLworCWVjbS0+ZWVkciA9IDB4ZmZmZmZmZmY7CQkvKiBDbGVhciBlY20gZXJyb3JzICovCisJZWNtLT5lZWVyID0gMHhmZmZmZmZmZjsJCS8qIEVuYWJsZSBlY20gZXJyb3JzICovCisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE4LDYgKzEyNywzMTYgQEAKIH0KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BDSTEKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgcGNpMV9ob3NlOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJRTEKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgcGNpZTFfaG9zZTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSUUyCitzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIHBjaWUyX2hvc2U7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0lFMworc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwY2llM19ob3NlOworI2VuZGlmCisKK2ludCBmaXJzdF9mcmVlX2J1c25vPTA7CisKK3ZvaWQKK3BjaV9pbml0X2JvYXJkKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworCXZvbGF0aWxlIGNjc3JfZ3VyX3QgKmd1ciA9ICZpbW1hcC0+aW1fZ3VyOworCXVpbnQgZGV2ZGlzciA9IGd1ci0+ZGV2ZGlzcjsKKwl1aW50IGlvX3NlbCA9IChndXItPnBvcmRldnNyICYgTVBDODV4eF9QT1JERVZTUl9JT19TRUwpID4+IDE5OworCXVpbnQgaG9zdF9hZ2VudCA9IChndXItPnBvcmJtc3IgJiBNUEM4NXh4X1BPUkJNU1JfSEEpID4+IDE2OworCisJZGVidWcgKCIgICBwY2lfaW5pdF9ib2FyZDogZGV2ZGlzcj0leCwgaW9fc2VsPSV4LCBob3N0X2FnZW50PSV4XG4iLAorCQlkZXZkaXNyLCBpb19zZWwsIGhvc3RfYWdlbnQpOworCisJaWYgKGlvX3NlbCAmIDEpIHsKKwkJaWYgKCEoZ3VyLT5wb3JkZXZzciAmIE1QQzg1eHhfUE9SREVWU1JfU0dNSUkxX0RJUykpCisJCQlwcmludGYgKCIgICAgZVRTRUMxIGlzIGluIHNnbWlpIG1vZGUuXG4iKTsKKwkJaWYgKCEoZ3VyLT5wb3JkZXZzciAmIE1QQzg1eHhfUE9SREVWU1JfU0dNSUkzX0RJUykpCisJCQlwcmludGYgKCIgICAgZVRTRUMzIGlzIGluIHNnbWlpIG1vZGUuXG4iKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfUENJRTMKK3sKKwl2b2xhdGlsZSBjY3NyX2ZzbF9wY2lfdCAqcGNpID0gKGNjc3JfZnNsX3BjaV90ICopIENGR19QQ0lFM19BRERSOworCWV4dGVybiB2b2lkIGZzbF9wY2lfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9ICZwY2llM19ob3NlOworCWludCBwY2llX2VwID0gKGhvc3RfYWdlbnQgPT0gMyk7CisJaW50IHBjaWVfY29uZmlndXJlZCAgPSBpb19zZWwgPj0gMTsKKworCWlmIChwY2llX2NvbmZpZ3VyZWQgJiYgIShkZXZkaXNyICYgTVBDODV4eF9ERVZESVNSX1BDSUUpKXsKKwkJcHJpbnRmICgiXG4gICAgUENJRTMgY29ubmVjdGVkIHRvIFVMSSBhcyAlcyAoYmFzZSBhZGRyZXNzICV4KSIsCisJCQlwY2llX2VwID8gIkVuZCBQb2ludCIgOiAiUm9vdCBDb21wbGV4IiwKKwkJCSh1aW50KXBjaSk7CisJCWlmIChwY2ktPnBtZV9tc2dfZGV0KSB7CisJCQlwY2ktPnBtZV9tc2dfZGV0ID0gMHhmZmZmZmZmZjsKKwkJCWRlYnVnICgiIHdpdGggZXJyb3JzLiAgQ2xlYXJpbmcuICBOb3cgMHglMDh4IixwY2ktPnBtZV9tc2dfZGV0KTsKKwkJfQorCQlwcmludGYgKCJcbiIpOworCisJCS8qIGluYm91bmQgKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDAsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfQlVTLAorCQkJICAgICAgIENGR19QQ0lfTUVNT1JZX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSB8IFBDSV9SRUdJT05fTUVNT1JZKTsKKworCQkvKiBvdXRib3VuZCBtZW1vcnkgKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCisJCQkgICAgICAgQ0ZHX1BDSUUzX01FTV9CQVNFLAorCQkJICAgICAgIENGR19QQ0lFM19NRU1fUEhZUywKKwkJCSAgICAgICBDRkdfUENJRTNfTUVNX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9NRU0pOworCisJCS8qIG91dGJvdW5kIGlvICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAyLAorCQkJICAgICAgIENGR19QQ0lFM19JT19CQVNFLAorCQkJICAgICAgIENGR19QQ0lFM19JT19QSFlTLAorCQkJICAgICAgIENGR19QQ0lFM19JT19TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCisJCWhvc2UtPnJlZ2lvbl9jb3VudCA9IDM7CisjaWZkZWYgQ0ZHX1BDSUUzX01FTV9CQVNFMgorCQkvKiBvdXRib3VuZCBtZW1vcnkgKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDMsCisJCQkgICAgICAgQ0ZHX1BDSUUzX01FTV9CQVNFMiwKKwkJCSAgICAgICBDRkdfUENJRTNfTUVNX1BIWVMyLAorCQkJICAgICAgIENGR19QQ0lFM19NRU1fU0laRTIsCisJCQkgICAgICAgUENJX1JFR0lPTl9NRU0pOworCQlob3NlLT5yZWdpb25fY291bnQrKzsKKyNlbmRpZgorCQlob3NlLT5maXJzdF9idXNubz1maXJzdF9mcmVlX2J1c25vOworCQlwY2lfc2V0dXBfaW5kaXJlY3QoaG9zZSwgKGludCkgJnBjaS0+Y2ZnX2FkZHIsIChpbnQpICZwY2ktPmNmZ19kYXRhKTsKKworCQlmc2xfcGNpX2luaXQoaG9zZSk7CisKKwkJZmlyc3RfZnJlZV9idXNubz1ob3NlLT5sYXN0X2J1c25vKzE7CisJCXByaW50ZiAoIiAgICBQQ0lFMyBvbiBidXMgJTAyeCAtICUwMnhcbiIsCisJCQlob3NlLT5maXJzdF9idXNubyxob3NlLT5sYXN0X2J1c25vKTsKKworCX0gZWxzZSB7CisJCXByaW50ZiAoIiAgICBQQ0lFMzogZGlzYWJsZWRcbiIpOworCX0KKworIH0KKyNlbHNlCisJZ3VyLT5kZXZkaXNyIHw9IE1QQzg1eHhfREVWRElTUl9QQ0lFMzsgLyogZGlzYWJsZSAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJRTEKKyB7CisJdm9sYXRpbGUgY2Nzcl9mc2xfcGNpX3QgKnBjaSA9IChjY3NyX2ZzbF9wY2lfdCAqKSBDRkdfUENJRTFfQUREUjsKKwlleHRlcm4gdm9pZCBmc2xfcGNpX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKTsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSAmcGNpZTFfaG9zZTsKKwlpbnQgcGNpZV9lcCA9IChob3N0X2FnZW50ID09IDUpOworCWludCBwY2llX2NvbmZpZ3VyZWQgID0gaW9fc2VsICYgNjsKKworCWlmIChwY2llX2NvbmZpZ3VyZWQgJiYgIShkZXZkaXNyICYgTVBDODV4eF9ERVZESVNSX1BDSUUpKXsKKwkJcHJpbnRmICgiXG4gICAgUENJRTEgY29ubmVjdGVkIHRvIFNsb3QyIGFzICVzIChiYXNlIGFkZHJlc3MgJXgpIiwKKwkJCXBjaWVfZXAgPyAiRW5kIFBvaW50IiA6ICJSb290IENvbXBsZXgiLAorCQkJKHVpbnQpcGNpKTsKKwkJaWYgKHBjaS0+cG1lX21zZ19kZXQpIHsKKwkJCXBjaS0+cG1lX21zZ19kZXQgPSAweGZmZmZmZmZmOworCQkJZGVidWcgKCIgd2l0aCBlcnJvcnMuICBDbGVhcmluZy4gIE5vdyAweCUwOHgiLHBjaS0+cG1lX21zZ19kZXQpOworCQl9CisJCXByaW50ZiAoIlxuIik7CisKKwkJLyogaW5ib3VuZCAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9CVVMsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfUEhZUywKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOworCisJCS8qIG91dGJvdW5kIG1lbW9yeSAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKKwkJCSAgICAgICBDRkdfUENJRTFfTUVNX0JBU0UsCisJCQkgICAgICAgQ0ZHX1BDSUUxX01FTV9QSFlTLAorCQkJICAgICAgIENGR19QQ0lFMV9NRU1fU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisKKwkJLyogb3V0Ym91bmQgaW8gKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsCisJCQkgICAgICAgQ0ZHX1BDSUUxX0lPX0JBU0UsCisJCQkgICAgICAgQ0ZHX1BDSUUxX0lPX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSUUxX0lPX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwkJaG9zZS0+cmVnaW9uX2NvdW50ID0gMzsKKyNpZmRlZiBDRkdfUENJRTFfTUVNX0JBU0UyCisJCS8qIG91dGJvdW5kIG1lbW9yeSAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMywKKwkJCSAgICAgICBDRkdfUENJRTFfTUVNX0JBU0UyLAorCQkJICAgICAgIENGR19QQ0lFMV9NRU1fUEhZUzIsCisJCQkgICAgICAgQ0ZHX1BDSUUxX01FTV9TSVpFMiwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisJCWhvc2UtPnJlZ2lvbl9jb3VudCsrOworI2VuZGlmCisJCWhvc2UtPmZpcnN0X2J1c25vPWZpcnN0X2ZyZWVfYnVzbm87CisKKwkJcGNpX3NldHVwX2luZGlyZWN0KGhvc2UsIChpbnQpICZwY2ktPmNmZ19hZGRyLCAoaW50KSAmcGNpLT5jZmdfZGF0YSk7CisKKwkJZnNsX3BjaV9pbml0KGhvc2UpOworCisJCWZpcnN0X2ZyZWVfYnVzbm89aG9zZS0+bGFzdF9idXNubysxOworCQlwcmludGYoIiAgICBQQ0lFMSBvbiBidXMgJTAyeCAtICUwMnhcbiIsCisJCSAgICAgICBob3NlLT5maXJzdF9idXNubyxob3NlLT5sYXN0X2J1c25vKTsKKworCX0gZWxzZSB7CisJCXByaW50ZiAoIiAgICBQQ0lFMTogZGlzYWJsZWRcbiIpOworCX0KKworIH0KKyNlbHNlCisJZ3VyLT5kZXZkaXNyIHw9IE1QQzg1eHhfREVWRElTUl9QQ0lFOyAvKiBkaXNhYmxlICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0lFMgorIHsKKwl2b2xhdGlsZSBjY3NyX2ZzbF9wY2lfdCAqcGNpID0gKGNjc3JfZnNsX3BjaV90ICopIENGR19QQ0lFMl9BRERSOworCWV4dGVybiB2b2lkIGZzbF9wY2lfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9ICZwY2llMl9ob3NlOworCWludCBwY2llX2VwID0gKGhvc3RfYWdlbnQgPT0gMyk7CisJaW50IHBjaWVfY29uZmlndXJlZCAgPSBpb19zZWwgJiA0OworCisJaWYgKHBjaWVfY29uZmlndXJlZCAmJiAhKGRldmRpc3IgJiBNUEM4NXh4X0RFVkRJU1JfUENJRSkpeworCQlwcmludGYgKCJcbiAgICBQQ0lFMiBjb25uZWN0ZWQgdG8gU2xvdCAxIGFzICVzIChiYXNlIGFkZHJlc3MgJXgpIiwKKwkJCXBjaWVfZXAgPyAiRW5kIFBvaW50IiA6ICJSb290IENvbXBsZXgiLAorCQkJKHVpbnQpcGNpKTsKKwkJaWYgKHBjaS0+cG1lX21zZ19kZXQpIHsKKwkJCXBjaS0+cG1lX21zZ19kZXQgPSAweGZmZmZmZmZmOworCQkJZGVidWcgKCIgd2l0aCBlcnJvcnMuICBDbGVhcmluZy4gIE5vdyAweCUwOHgiLHBjaS0+cG1lX21zZ19kZXQpOworCQl9CisJCXByaW50ZiAoIlxuIik7CisKKwkJLyogaW5ib3VuZCAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9CVVMsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfUEhZUywKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOworCisJCS8qIG91dGJvdW5kIG1lbW9yeSAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKKwkJCSAgICAgICBDRkdfUENJRTJfTUVNX0JBU0UsCisJCQkgICAgICAgQ0ZHX1BDSUUyX01FTV9QSFlTLAorCQkJICAgICAgIENGR19QQ0lFMl9NRU1fU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisKKwkJLyogb3V0Ym91bmQgaW8gKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsCisJCQkgICAgICAgQ0ZHX1BDSUUyX0lPX0JBU0UsCisJCQkgICAgICAgQ0ZHX1BDSUUyX0lPX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSUUyX0lPX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwkJaG9zZS0+cmVnaW9uX2NvdW50ID0gMzsKKyNpZmRlZiBDRkdfUENJRTJfTUVNX0JBU0UyCisJCS8qIG91dGJvdW5kIG1lbW9yeSAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMywKKwkJCSAgICAgICBDRkdfUENJRTJfTUVNX0JBU0UyLAorCQkJICAgICAgIENGR19QQ0lFMl9NRU1fUEhZUzIsCisJCQkgICAgICAgQ0ZHX1BDSUUyX01FTV9TSVpFMiwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisJCWhvc2UtPnJlZ2lvbl9jb3VudCsrOworI2VuZGlmCisJCWhvc2UtPmZpcnN0X2J1c25vPWZpcnN0X2ZyZWVfYnVzbm87CisJCXBjaV9zZXR1cF9pbmRpcmVjdChob3NlLCAoaW50KSAmcGNpLT5jZmdfYWRkciwgKGludCkgJnBjaS0+Y2ZnX2RhdGEpOworCisJCWZzbF9wY2lfaW5pdChob3NlKTsKKwkJZmlyc3RfZnJlZV9idXNubz1ob3NlLT5sYXN0X2J1c25vKzE7CisJCXByaW50ZiAoIiAgICBQQ0lFMiBvbiBidXMgJTAyeCAtICUwMnhcbiIsCisJCQlob3NlLT5maXJzdF9idXNubyxob3NlLT5sYXN0X2J1c25vKTsKKworCX0gZWxzZSB7CisJCXByaW50ZiAoIiAgICBQQ0lFMjogZGlzYWJsZWRcbiIpOworCX0KKworIH0KKyNlbHNlCisJZ3VyLT5kZXZkaXNyIHw9IE1QQzg1eHhfREVWRElTUl9QQ0lFMjsgLyogZGlzYWJsZSAqLworI2VuZGlmCisKKworI2lmZGVmIENPTkZJR19QQ0kxCit7CisJdm9sYXRpbGUgY2Nzcl9mc2xfcGNpX3QgKnBjaSA9IChjY3NyX2ZzbF9wY2lfdCAqKSBDRkdfUENJMV9BRERSOworCWV4dGVybiB2b2lkIGZzbF9wY2lfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9ICZwY2kxX2hvc2U7CisKKwl1aW50IHBjaV9hZ2VudCA9IChob3N0X2FnZW50ID09IDYpOworCXVpbnQgcGNpX3NwZWVkID0gNjY2NjYwMDA7IC8qZ2V0X2Nsb2NrX2ZyZXEgKCk7IFBDSSBQU1BFRUQgaW4gWzQ6NV0gKi8KKwl1aW50IHBjaV8zMiA9IDE7CisJdWludCBwY2lfYXJiID0gZ3VyLT5wb3JkZXZzciAmIE1QQzg1eHhfUE9SREVWU1JfUENJMV9BUkI7CS8qIFBPUkRFVlNSWzE0XSAqLworCXVpbnQgcGNpX2Nsa19zZWwgPSBndXItPnBvcnBsbHNyICYgTVBDODV4eF9QT1JERVZTUl9QQ0kxX1NQRDsJLyogUE9SUExMU1JbMTZdICovCisKKworCWlmICghKGRldmRpc3IgJiBNUEM4NXh4X0RFVkRJU1JfUENJMSkpIHsKKwkJcHJpbnRmICgiXG4gICAgUENJOiAlZCBiaXQsICVzIE1IeiwgJXMsICVzLCAlcyAoYmFzZSBhZGRyZXNzICV4KVxuIiwKKwkJCShwY2lfMzIpID8gMzIgOiA2NCwKKwkJCShwY2lfc3BlZWQgPT0gMzMzMzMwMDApID8gIjMzIiA6CisJCQkocGNpX3NwZWVkID09IDY2NjY2MDAwKSA/ICI2NiIgOiAidW5rbm93biIsCisJCQlwY2lfY2xrX3NlbCA/ICJzeW5jIiA6ICJhc3luYyIsCisJCQlwY2lfYWdlbnQgPyAiYWdlbnQiIDogImhvc3QiLAorCQkJcGNpX2FyYiA/ICJhcmJpdGVyIiA6ICJleHRlcm5hbC1hcmJpdGVyIiwKKwkJCSh1aW50KXBjaQorCQkJKTsKKworCQkvKiBpbmJvdW5kICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAwLAorCQkJICAgICAgIENGR19QQ0lfTUVNT1JZX0JVUywKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9QSFlTLAorCQkJICAgICAgIENGR19QQ0lfTUVNT1JZX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX01FTU9SWSk7CisKKwkJLyogb3V0Ym91bmQgbWVtb3J5ICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAxLAorCQkJICAgICAgIENGR19QQ0kxX01FTV9CQVNFLAorCQkJICAgICAgIENGR19QQ0kxX01FTV9QSFlTLAorCQkJICAgICAgIENGR19QQ0kxX01FTV9TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCQkvKiBvdXRib3VuZCBpbyAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMiwKKwkJCSAgICAgICBDRkdfUENJMV9JT19CQVNFLAorCQkJICAgICAgIENGR19QQ0kxX0lPX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSTFfSU9fU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKKwkJaG9zZS0+cmVnaW9uX2NvdW50ID0gMzsKKyNpZmRlZiBDRkdfUENJRTNfTUVNX0JBU0UyCisJCS8qIG91dGJvdW5kIG1lbW9yeSAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMywKKwkJCSAgICAgICBDRkdfUENJRTNfTUVNX0JBU0UyLAorCQkJICAgICAgIENGR19QQ0lFM19NRU1fUEhZUzIsCisJCQkgICAgICAgQ0ZHX1BDSUUzX01FTV9TSVpFMiwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisJCWhvc2UtPnJlZ2lvbl9jb3VudCsrOworI2VuZGlmCisJCWhvc2UtPmZpcnN0X2J1c25vPWZpcnN0X2ZyZWVfYnVzbm87CisJCXBjaV9zZXR1cF9pbmRpcmVjdChob3NlLCAoaW50KSAmcGNpLT5jZmdfYWRkciwgKGludCkgJnBjaS0+Y2ZnX2RhdGEpOworCisJCWZzbF9wY2lfaW5pdChob3NlKTsKKwkJZmlyc3RfZnJlZV9idXNubz1ob3NlLT5sYXN0X2J1c25vKzE7CisJCXByaW50ZiAoIlBDSSBvbiBidXMgJTAyeCAtICUwMnhcbiIsCisJCQlob3NlLT5maXJzdF9idXNubyxob3NlLT5sYXN0X2J1c25vKTsKKwl9IGVsc2UgeworCQlwcmludGYgKCIgICAgUENJOiBkaXNhYmxlZFxuIik7CisJfQorfQorI2Vsc2UKKwlndXItPmRldmRpc3IgfD0gTVBDODV4eF9ERVZESVNSX1BDSTE7IC8qIGRpc2FibGUgKi8KKyNlbmRpZgorfQorCisKIGludCBsYXN0X3N0YWdlX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gMDsKQEAgLTE5Nyw1ICs1MTYsMzYgQEAKIAkJKnArKyA9IGNwdV90b19iZTMyKGJkLT5iaV9tZW1zdGFydCk7CiAJCSpwID0gY3B1X3RvX2JlMzIoYmQtPmJpX21lbXNpemUpOwogCX0KKyNpZmRlZiBDT05GSUdfUENJRTEKKwlwID0gKHUzMiAqKWZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9TT0MgIi9wY2lAYTAwMC9idXMtcmFuZ2UiLCAmbGVuKTsKKwlpZiAocCAhPSBOVUxMKSB7CisJCXBbMF0gPSAwOworCQlwWzFdID0gcGNpZTFfaG9zZS5sYXN0X2J1c25vIC0gcGNpZTFfaG9zZS5maXJzdF9idXNubzsKKwkJZGVidWcoIlBDSUBhMDAwIGZpcnN0X2J1c25vPSVkIGxhc3RfYnVzbm89JWRcbiIscFswXSxwWzFdKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUENJRTIKKwlwID0gKHUzMiAqKWZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9TT0MgIi9wY2lAOTAwMC9idXMtcmFuZ2UiLCAmbGVuKTsKKwlpZiAocCAhPSBOVUxMKSB7CisJCXBbMF0gPSAwOworCQlwWzFdID0gcGNpZTJfaG9zZS5sYXN0X2J1c25vIC0gcGNpZTJfaG9zZS5maXJzdF9idXNubzsKKwkJZGVidWcoIlBDSUA5MDAwIGZpcnN0X2J1c25vPSVkIGxhc3RfYnVzbm89JWRcbiIscFswXSxwWzFdKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUENJRTMKKwlwID0gKHUzMiAqKWZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9TT0MgIi9wY2lAYjAwMC9idXMtcmFuZ2UiLCAmbGVuKTsKKwlpZiAocCAhPSBOVUxMKSB7CisJCXBbMF0gPSAwOworCQlwWzFdID0gcGNpZTNfaG9zZS5sYXN0X2J1c25vIC0gcGNpZTNfaG9zZS5maXJzdF9idXNubzs7CisJCWRlYnVnKCJQQ0lAYjAwMCBmaXJzdF9idXNubz0lZCBsYXN0X2J1c25vPSVkXG4iLHBbMF0scFsxXSk7CisJfQorI2VuZGlmCisJZnRfY3B1X3NldHVwKGJsb2IsIGJkKTsKKworCXAgPSBmdF9nZXRfcHJvcChibG9iLCAiL21lbW9yeS9yZWciLCAmbGVuKTsKKwlpZiAocCAhPSBOVUxMKSB7CisJCSpwKysgPSBjcHVfdG9fYmUzMihiZC0+YmlfbWVtc3RhcnQpOworCQkqcCA9IGNwdV90b19iZTMyKGJkLT5iaV9tZW1zaXplKTsKKwl9CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2Z1bmt3ZXJrL3ZvdnBuLWd3L204OGU2MDYwLmMgYi9ib2FyZC9mdW5rd2Vyay92b3Zwbi1ndy9tODhlNjA2MC5jCmluZGV4IDAzYTAzZDAuLjU4YjViNmUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2Z1bmt3ZXJrL3ZvdnBuLWd3L204OGU2MDYwLmMKKysrIGIvYm9hcmQvZnVua3dlcmsvdm92cG4tZ3cvbTg4ZTYwNjAuYwpAQCAtMzEsNyArMzEsNyBAQAogCiAjaW5jbHVkZSAibTg4ZTYwNjAuaCIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogc3RhdGljIGludAkJcHJ0VGFiW004OFhfUFJUX0NOVF0gPSB7IDgsIDksIDEwLCAxMSwgMTIsIDEzIH07CiBzdGF0aWMgaW50CQlwaHlUYWJbTTg4WF9QSFlfQ05UXSA9IHsgMCwgMSwgMiwgMywgNCB9OwogCmRpZmYgLS1naXQgYS9ib2FyZC9mdW5rd2Vyay92b3Zwbi1ndy91LWJvb3QubGRzIGIvYm9hcmQvZnVua3dlcmsvdm92cG4tZ3cvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4MDQ4ZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9mdW5rd2Vyay92b3Zwbi1ndy91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEtMjAwMwotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBNb2RpZmllZCBieSBZdWxpIEJhcmNvaGVuIDx5dWxpQGFyYWJlbGxhc3cuY29tPgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19Ci1FTlRSWShfc3RhcnQpCmRpZmYgLS1naXQgYS9ib2FyZC9mdW5rd2Vyay92b3Zwbi1ndy92b3Zwbi1ndy5jIGIvYm9hcmQvZnVua3dlcmsvdm92cG4tZ3cvdm92cG4tZ3cuYwppbmRleCA5N2Y4MWVlLi45YjU0MjlhIDEwMDY0NAotLS0gYS9ib2FyZC9mdW5rd2Vyay92b3Zwbi1ndy92b3Zwbi1ndy5jCisrKyBiL2JvYXJkL2Z1bmt3ZXJrL3ZvdnBuLWd3L3ZvdnBuLWd3LmMKQEAgLTE4NCw3ICsxODQsNyBAQAogdm9pZCByZXNldF9waHkgKHZvaWQpCiB7CiAJdm9sYXRpbGUgaW9wb3J0X3QgKmlvcDsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAlpbnQgaTsKIAl1bnNpZ25lZCBzaG9ydCB2YWw7CiAjZW5kaWYKQEAgLTE5Myw3ICsxOTMsNyBAQAogCiAJLyogUmVzZXQgdGhlIFBIWSAqLwogCWlvcC0+cGRhdCAmPSAweGZmZjdmZmZmOwkvKiBQQTEyID0gfFNXSVRDSF9SRVNFVCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCXVkZWxheSgyMDAwMCk7CiAJaW9wLT5wZGF0IHw9IDB4MDAwODAwMDA7CiAJZm9yIChpPTA7IGk8MTAwOyBpKyspIHsKZGlmZiAtLWdpdCBhL2JvYXJkL2cyMDAwL2cyMDAwLmMgYi9ib2FyZC9nMjAwMC9nMjAwMC5jCmluZGV4IDM5YjVjNzAxLi4yZGZkODdjIDEwMDY0NAotLS0gYS9ib2FyZC9nMjAwMC9nMjAwMC5jCisrKyBiL2JvYXJkL2cyMDAwL2cyMDAwLmMKQEAgLTczLDcgKzczLDcgQEAKIAogaW50IG1pc2NfaW5pdF9yICh2b2lkKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAJLyoKIAkgKiBTZXQgTkFORC1GTEFTSCBHUElPIHNpZ25hbHMgdG8gZGVmYXVsdAogCSAqLwpAQCAtMTg0LDcgKzE4NCw3IEBACiB9CiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiBleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOwogCmRpZmYgLS1naXQgYS9ib2FyZC9nZW44NjB0L2dlbjg2MHQuYyBiL2JvYXJkL2dlbjg2MHQvZ2VuODYwdC5jCmluZGV4IGViNzMyMjEuLmQ0NDhmOWYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2dlbjg2MHQvZ2VuODYwdC5jCisrKyBiL2JvYXJkL2dlbjg2MHQvZ2VuODYwdC5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENGR19DTURfTUlJKSAmJiBkZWZpbmVkKENPTkZJR19NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01JSSkgJiYgZGVmaW5lZChDT05GSUdfTUlJKQogI2luY2x1ZGUgPG5ldC5oPgogI2VuZGlmCiAKQEAgLTIyMiw3ICsyMjIsNyBAQAogICogRGlzayBPbiBDaGlwIChET0MpIE1pbGxlbml1bSBpbml0aWFsaXphdGlvbi4KICAqIFRoZSBET0MgbGl2ZXMgaW4gdGhlIENTMiogc3BhY2UKICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogZXh0ZXJuIHZvaWQgZG9jX3Byb2JlICh1bG9uZyBwaHlzYWRyKTsKIAogdm9pZCBkb2NfaW5pdCAodm9pZCkKQEAgLTI1MCw3ICsyNTAsNyBAQAogCiAJY29uZmlnX21wYzh4eF9pb3BvcnRzIChpbW1yKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCW1paV9pbml0ICgpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2JvYXJkL2dlbmlldHYvZ2VuaWV0di5jIGIvYm9hcmQvZ2VuaWV0di9nZW5pZXR2LmMKaW5kZXggNWY4Yzg5OS4uYzc1NTA3ZiAxMDA2NDQKLS0tIGEvYm9hcmQvZ2VuaWV0di9nZW5pZXR2LmMKKysrIGIvYm9hcmQvZ2VuaWV0di9nZW5pZXR2LmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCXJldHVybiAoc2l6ZSk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIAogI2lmZGVmCUNGR19QQ01DSUFfTUVNX0FERFIKIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnBjbWNpYV9tZW0gPSAodW5zaWduZWQgY2hhciAqKSBDRkdfUENNQ0lBX01FTV9BRERSOwpAQCAtMzU3LDQgKzM1Nyw0IEBACiAKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9ndGgvcGNtY2lhLmMgYi9ib2FyZC9ndGgvcGNtY2lhLmMKaW5kZXggZmNlNTQ5Mi4uY2ZmY2JkZSAxMDA2NDQKLS0tIGEvYm9hcmQvZ3RoL3BjbWNpYS5jCisrKyBiL2JvYXJkL2d0aC9wY21jaWEuYwpAQCAtNCwxMSArNCwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTgzLDcgKzgzLDcgQEAKIAogCXJldHVybiAwOwogfQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogaW50IHBjbWNpYV9oYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQogewogCXJldHVybiAwOwkvKiBObyBoYXJkd2FyZSB0byBkaXNhYmxlICovCmRpZmYgLS1naXQgYS9ib2FyZC9ndzgyNjAvdS1ib290LmxkcyBiL2JvYXJkL2d3ODI2MC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjY1Y2IxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2d3ODI2MC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9oaWRkZW5fZHJhZ29uL3UtYm9vdC5sZHMgYi9ib2FyZC9oaWRkZW5fZHJhZ29uL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNWNkMmUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvaGlkZGVuX2RyYWdvbi91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9obWkxMDAxL2NvbmZpZy5tayBiL2JvYXJkL2htaTEwMDEvY29uZmlnLm1rCmluZGV4IDUxZThlODRjLi40ZmUxODMxIDEwMDY0NAotLS0gYS9ib2FyZC9obWkxMDAxL2NvbmZpZy5taworKysgYi9ib2FyZC9obWkxMDAxL2NvbmZpZy5tawpAQCAtMzksMyArMzksNCBAQAogZW5kaWYKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURURVhUX0JBU0U9JChURVhUX0JBU0UpIC1JJChUT1BESVIpL2JvYXJkCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM1eHh4L3UtYm9vdC1jdXN0b21sYXlvdXQubGRzCmRpZmYgLS1naXQgYS9ib2FyZC9obWkxMDAxL3UtYm9vdC5sZHMgYi9ib2FyZC9obWkxMDAxL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyM2ExNGMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvaG1pMTAwMS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNAotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIC8qIFdBUk5JTkcgLSB0aGUgZm9sbG93aW5nIGlzIGhhbmQtb3B0aW1pemVkIHRvIGZpdCB3aXRoaW4gICovCi0gICAgLyogdGhlIHNlY3RvciBsYXlvdXQgb2Ygb3VyIGZsYXNoIGNoaXBzISAgICBYWFggRklYTUUgWFhYICAgKi8KLQotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8gICAgICAgICAgKC50ZXh0KQotICAgIGNwdS9tcGM1eHh4L3RyYXBzLm8gICAgICAgICAgKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL2NyYzMyLm8gICAgICAgICAoLnRleHQpCi0gICAgbGliX3BwYy9jYWNoZS5vICAgICAgICAgICAgICgudGV4dCkKLSAgICBsaWJfcHBjL3RpbWUubyAgICAgICAgICAgICAgKC50ZXh0KQotCi0gICAgLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAgICAgICAgKC5wcGNlbnYpCi0KLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9oeW1vZC9ic3AuYyBiL2JvYXJkL2h5bW9kL2JzcC5jCmluZGV4IDY4NjhmMjYuLjEyZjE0MDIgMTAwNjQ0Ci0tLSBhL2JvYXJkL2h5bW9kL2JzcC5jCisrKyBiL2JvYXJkL2h5bW9kL2JzcC5jCkBAIC0zNCw3ICszNCw3IEBACiAgKiBCb2FyZCBTcGVjaWFsIENvbW1hbmRzOiBGUEdBIGxvYWQvc3RvcmUsIEVFUFJPTSBlcmFzZQogICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIAogI2RlZmluZSBMT0FEX1NVQ0NFU1MJCTAKICNkZWZpbmUgTE9BRF9GQUlMX05PQ09ORgkxCkBAIC00MDIsNiArNDAyLDQgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmCS8qIENGR19DTURfQlNQICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvaHltb2QvY29uZmlnLm1rIGIvYm9hcmQvaHltb2QvY29uZmlnLm1rCmluZGV4IDBhOTk4NWYuLjJkZjMyMWYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2h5bW9kL2NvbmZpZy5taworKysgYi9ib2FyZC9oeW1vZC9jb25maWcubWsKQEAgLTMwLDMgKzMwLDUgQEAKIFBMQVRGT1JNX0NQUEZMQUdTICs9IC1JJChUT1BESVIpCiAKIE9CSkNGTEFHUyA9IC0tcmVtb3ZlLXNlY3Rpb249LnBwY2VudgorCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2JvYXJkL2h5bW9kL3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2JvYXJkL2h5bW9kL3UtYm9vdC5sZHMgYi9ib2FyZC9oeW1vZC91LWJvb3QubGRzCmluZGV4IDMzN2EzOTUuLjliZjBmMDkgMTAwNjQ0Ci0tLSBhL2JvYXJkL2h5bW9kL3UtYm9vdC5sZHMKKysrIGIvYm9hcmQvaHltb2QvdS1ib290LmxkcwpAQCAtNjksNyArNjksNiBAQAogICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KQogCiAgICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKICAgICAqKC5nb3QxKQogICB9CiAgIF9ldGV4dCA9IC47CmRpZmYgLS1naXQgYS9ib2FyZC9pY2VjdWJlL2ljZWN1YmUuYyBiL2JvYXJkL2ljZWN1YmUvaWNlY3ViZS5jCmluZGV4IDI5NjA5OTguLmMwMjdmNmYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2ljZWN1YmUvaWNlY3ViZS5jCisrKyBiL2JvYXJkL2ljZWN1YmUvaWNlY3ViZS5jCkBAIC0zNTksNyArMzU5LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFX1JFU0VUKQogCiB2b2lkIGluaXRfaWRlX3Jlc2V0ICh2b2lkKQogewpAQCAtMzg0LDcgKzM4NCw3IEBACiAJCSoodnVfbG9uZyAqKSBNUEM1WFhYX1dVX0dQSU9fREFUQV9PIHw9ICBHUElPX1BTQzFfNDsKIAl9CiB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkgJiYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApCiB2b2lkCmRpZmYgLS1naXQgYS9ib2FyZC9pY2VjdWJlL3UtYm9vdC5sZHMgYi9ib2FyZC9pY2VjdWJlL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMzQzMmUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvaWNlY3ViZS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9pY3U4NjIvcGNtY2lhLmMgYi9ib2FyZC9pY3U4NjIvcGNtY2lhLmMKaW5kZXggMjBmNjUzYi4uMTFkZTE4MyAxMDA2NDQKLS0tIGEvYm9hcmQvaWN1ODYyL3BjbWNpYS5jCisrKyBiL2JvYXJkL2ljdTg2Mi9wY21jaWEuYwpAQCAtNCwxMSArNCwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTE1NSw3ICsxNTUsNyBAQAogfQogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKIHsKIAl2b2xhdGlsZSBpbW1hcF90CSppbW1hcDsKQEAgLTE4Myw3ICsxODMsNyBAQAogCiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKIAogaW50IHBjbWNpYV92b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKZGlmZiAtLWdpdCBhL2JvYXJkL2lkczgyNDcvaWRzODI0Ny5jIGIvYm9hcmQvaWRzODI0Ny9pZHM4MjQ3LmMKaW5kZXggN2I5YTgzZC4uMTk4MjNhNCAxMDA2NDQKLS0tIGEvYm9hcmQvaWRzODI0Ny9pZHM4MjQ3LmMKKysrIGIvYm9hcmQvaWRzODI0Ny9pZHM4MjQ3LmMKQEAgLTMwMCw3ICszMDAsNyBAQAogCWdkLT5iZC0+YmlfZmxhc2hzdGFydCA9IDB4ZmY4MDAwMDA7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogZXh0ZXJuIHVsb25nCiBuYW5kX3Byb2JlICh1bG9uZyBwaHlzYWRyKTsKIApAQCAtMzE1LDQgKzMxNSw0IEBACiAJcHJpbnRmICgiJTRsdSBNQlxuIiwgdG90bGVuID4+MjApOwogfQogCi0jZW5kaWYJLyogQ0ZHX0NNRF9OQU5EICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2lkczgyNDcvdS1ib290LmxkcyBiL2JvYXJkL2lkczgyNDcvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg4YWVkMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9pZHM4MjQ3L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogSGVpa28gU2Nob2NoZXIsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxoc0BkZW54LmRlPgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICBjb21tb24vZW52aXJvbm1lbnQubygudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvaW5rYTR4MC9jb25maWcubWsgYi9ib2FyZC9pbmthNHgwL2NvbmZpZy5tawppbmRleCBjYjE5YTdkLi5mYzcwZWZlIDEwMDY0NAotLS0gYS9ib2FyZC9pbmthNHgwL2NvbmZpZy5taworKysgYi9ib2FyZC9pbmthNHgwL2NvbmZpZy5tawpAQCAtMzksMyArMzksNCBAQAogZW5kaWYKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURURVhUX0JBU0U9JChURVhUX0JBU0UpIC1JJChUT1BESVIpL2JvYXJkCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM1eHh4L3UtYm9vdC1jdXN0b21sYXlvdXQubGRzCmRpZmYgLS1naXQgYS9ib2FyZC9pbmthNHgwL2lua2E0eDAuYyBiL2JvYXJkL2lua2E0eDAvaW5rYTR4MC5jCmluZGV4IGQ2NzBjYzMuLjQ3OGEzMzEgMTAwNjQ0Ci0tLSBhL2JvYXJkL2lua2E0eDAvaW5rYTR4MC5jCisrKyBiL2JvYXJkL2lua2E0eDAvaW5rYTR4MC5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFX1JFU0VUKQogCiB2b2lkIGluaXRfaWRlX3Jlc2V0ICh2b2lkKQogewpAQCAtMjYxLDQgKzI2MSw0IEBACiAJCSoodnVfbG9uZyAqKSBNUEM1WFhYX1dVX0dQSU9fREFUQV9PIHw9ICBHUElPX1BTQzFfNDsKIAl9CiB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2lua2E0eDAvdS1ib290LmxkcyBiL2JvYXJkL2lua2E0eDAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzYTE0Yy4uMDAwMDAwMAotLS0gYS9ib2FyZC9pbmthNHgwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA0Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgLyogV0FSTklORyAtIHRoZSBmb2xsb3dpbmcgaXMgaGFuZC1vcHRpbWl6ZWQgdG8gZml0IHdpdGhpbiAgKi8KLSAgICAvKiB0aGUgc2VjdG9yIGxheW91dCBvZiBvdXIgZmxhc2ggY2hpcHMhICAgIFhYWCBGSVhNRSBYWFggICAqLwotCi0gICAgY3B1L21wYzV4eHgvc3RhcnQubyAgICAgICAgICAoLnRleHQpCi0gICAgY3B1L21wYzV4eHgvdHJhcHMubyAgICAgICAgICAoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubyAgICAgICAgICgudGV4dCkKLSAgICBsaWJfcHBjL2NhY2hlLm8gICAgICAgICAgICAgKC50ZXh0KQotICAgIGxpYl9wcGMvdGltZS5vICAgICAgICAgICAgICAoLnRleHQpCi0KLSAgICAuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICAgICAgICAoLnBwY2VudikKLQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2lwaGFzZTQ1MzkvdS1ib290LmxkcyBiL2JvYXJkL2lwaGFzZTQ1MzkvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhMDFlYS4uMDAwMDAwMAotLS0gYS9ib2FyZC9pcGhhc2U0NTM5L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2lzcGFuL3UtYm9vdC5sZHMgYi9ib2FyZC9pc3Bhbi91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjgwNDhkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2lzcGFuL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMS0yMDAzCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIE1vZGlmaWVkIGJ5IFl1bGkgQmFyY29oZW4gPHl1bGlAYXJhYmVsbGFzdy5jb20+Ci0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL2l4ZHA0MjUvaXhkcDQyNS5jIGIvYm9hcmQvaXhkcDQyNS9peGRwNDI1LmMKaW5kZXggZWFmN2NkZS4uMmEzM2Q2ZCAxMDA2NDQKLS0tIGEvYm9hcmQvaXhkcDQyNS9peGRwNDI1LmMKKysrIGIvYm9hcmQvaXhkcDQyNS9peGRwNDI1LmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCXJldHVybiAoMCk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ0kpIHx8IGRlZmluZWQoQ09ORklHX1BDSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENJKSB8fCBkZWZpbmVkKENPTkZJR19QQ0kpCiBleHRlcm4gc3RydWN0IHBjaV9jb250cm9sbGVyIGhvc2U7CiBleHRlcm4gdm9pZCBwY2lfaXhwX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICogaG9zZSk7CiAKZGlmZiAtLWdpdCBhL2JvYXJkL2p1cGl0ZXIvanVwaXRlci5jIGIvYm9hcmQvanVwaXRlci9qdXBpdGVyLmMKaW5kZXggMDRmZGE0YS4uYjIyNzQ4NyAxMDA2NDQKLS0tIGEvYm9hcmQvanVwaXRlci9qdXBpdGVyLmMKKysrIGIvYm9hcmQvanVwaXRlci9qdXBpdGVyLmMKQEAgLTI4MSw3ICsyODEsNyBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfUkVTRVQpCiAKIHZvaWQgaW5pdF9pZGVfcmVzZXQgKHZvaWQpCiB7CkBAIC0zMDYsNyArMzA2LDcgQEAKIAkJKih2dV9sb25nICopIE1QQzVYWFhfV1VfR1BJT19EQVRBX08gfD0gIEdQSU9fUFNDMV80OwogCX0KIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKSAmJiBkZWZpbmVkKENPTkZJR19PRl9CT0FSRF9TRVRVUCkKIHZvaWQKZGlmZiAtLWdpdCBhL2JvYXJkL2p1cGl0ZXIvdS1ib290LmxkcyBiL2JvYXJkL2p1cGl0ZXIvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzNDMyZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9qdXBpdGVyL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMwotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2tiOTIwMi9rYjkyMDIuYyBiL2JvYXJkL2tiOTIwMi9rYjkyMDIuYwppbmRleCBlYzUxZGNhLi41OWVkOGZmIDEwMDY0NAotLS0gYS9ib2FyZC9rYjkyMDIva2I5MjAyLmMKKysrIGIvYm9hcmQva2I5MjAyL2tiOTIwMi5jCkBAIC02NSw3ICs2NSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfRFJJVkVSX0VUSEVSCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKIHVuc2lnbmVkIGludCBseHQ5NzJfSXNQaHlDb25uZWN0ZWQgKEFUOTFQU19FTUFDIHBfbWFjKTsKIFVDSEFSIGx4dDk3Ml9HZXRMaW5rU3BlZWQgKEFUOTFQU19FTUFDIHBfbWFjKTsKQEAgLTkwLDUgKzkwLDUgQEAKIAlwX3BoeW9wcy0+QXV0b05lZ290aWF0ZSA9IGx4dDk3Ml9BdXRvTmVnb3RpYXRlOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogI2VuZGlmCS8qIENPTkZJR19EUklWRVJfRVRIRVIgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2t1cC9jb21tb24vcGNtY2lhLmMgYi9ib2FyZC9rdXAvY29tbW9uL3BjbWNpYS5jCmluZGV4IDFmNjFhMGUuLmRlZjM4ZjEgMTAwNjQ0Ci0tLSBhL2JvYXJkL2t1cC9jb21tb24vcGNtY2lhLmMKKysrIGIvYm9hcmQva3VwL2NvbW1vbi9wY21jaWEuYwpAQCAtNCwxMSArNCwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTExNSw3ICsxMTUsNyBAQAogfQogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKIHsKIAl2b2xhdGlsZSBpbW1hcF90CSppbW1hcDsKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKIAogaW50IHBjbWNpYV92b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKZGlmZiAtLWdpdCBhL2JvYXJkL2x3bW9uL2x3bW9uLmMgYi9ib2FyZC9sd21vbi9sd21vbi5jCmluZGV4IDllOGVhMmQuLmM2ODk3OGEgMTAwNjQ0Ci0tLSBhL2JvYXJkL2x3bW9uL2x3bW9uLmMKKysrIGIvYm9hcmQvbHdtb24vbHdtb24uYwpAQCAtNzYxLDcgKzc2MSw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tQm9hcmQgU3BlY2lhbCBDb21tYW5kczogUElDIHJlYWQvd3JpdGUgLS0tLS0tLS0tLS0tLS0tKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGKiBGdW5jdGlvbjogICAgIGludCBkb19waWMgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLAogRiogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgY2hhciAqYXJndltdKSBQKkEqWioKQEAgLTk2MCw3ICs5NjAsNyBAQAogCSJsc2IgICAgIC0gcHJpbnQgY3VycmVudCBzZXR0aW5nXG4iCiApOwogCi0jZW5kaWYgLyogQ0ZHX0NNRF9CU1AgKi8KKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFV0aWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2JvYXJkL2x3bW9uL3BjbWNpYS5jIGIvYm9hcmQvbHdtb24vcGNtY2lhLmMKaW5kZXggMjM0OTI4Ni4uZWJjYTdhMiAxMDA2NDQKLS0tIGEvYm9hcmQvbHdtb24vcGNtY2lhLmMKKysrIGIvYm9hcmQvbHdtb24vcGNtY2lhLmMKQEAgLTUsMTEgKzUsMTEgQEAKIAogI3VuZGVmCUNPTkZJR19QQ01DSUEKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCkBAIC0xMjcsNyArMTI3LDcgQEAKIH0KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBpbnQgcGNtY2lhX2hhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCiB7CiAJdm9sYXRpbGUgaW1tYXBfdAkqaW1tYXA7CkBAIC0xNjYsNyArMTY2LDcgQEAKIAogCXJldHVybiAoMCk7CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgogCiAKIGludCBwY21jaWFfdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApCmRpZmYgLS1naXQgYS9ib2FyZC9tYng4eHgvcGNtY2lhLmMgYi9ib2FyZC9tYng4eHgvcGNtY2lhLmMKaW5kZXggMTMyYTY4OC4uYTAyYzg0OCAxMDA2NDQKLS0tIGEvYm9hcmQvbWJ4OHh4L3BjbWNpYS5jCisrKyBiL2JvYXJkL21ieDh4eC9wY21jaWEuYwpAQCAtNiwxMSArNiwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTE1NiwxMSArMTU2LDExIEBACiAJcmV0dXJuICgwKTsKIAl9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfaGFyZHdhcmVfZGlzYWJsZSAoaW50IHNsb3QpCiB7CiAJcmV0dXJuIDA7CS8qIE5vIGhhcmR3YXJlIHRvIGRpc2FibGUgKi8KIH0KLSNlbmRpZiAvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKICNlbmRpZgkvKiBDT05GSUdfUENNQ0lBICovCmRpZmYgLS1naXQgYS9ib2FyZC9tY2MyMDAvYXV0b191cGRhdGUuYyBiL2JvYXJkL21jYzIwMC9hdXRvX3VwZGF0ZS5jCmluZGV4IDkwZDAzZWMuLjI4ZTRjODcgMTAwNjQ0Ci0tLSBhL2JvYXJkL21jYzIwMC9hdXRvX3VwZGF0ZS5jCisrKyBiL2JvYXJkL21jYzIwMC9hdXRvX3VwZGF0ZS5jCkBAIC00NCw4ICs0NCw4IEBACiAjZXJyb3IgIm11c3QgZGVmaW5lIENGR19IVVNIX1BBUlNFUiIKICNlbmRpZgogCi0jaWYgIShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZBVCkKLSNlcnJvciAibXVzdCBkZWZpbmUgQ0ZHX0NNRF9GQVQiCisjaWYgIWRlZmluZWQoQ09ORklHX0NNRF9GQVQpCisjZXJyb3IgIm11c3QgZGVmaW5lIENPTkZJR19DTURfRkFUIgogI2VuZGlmCiAKICN1bmRlZiBBVV9ERUJVRwpAQCAtMzMwLDYgKzMzMCw4IEBACiAJaW50IGksIHJlcyA9IDAsIGJpdG1hcF9maXJzdCwgY250LCBvbGRfY3RybGMsIGdvdF9jdHJsYzsKIAljaGFyICplbnY7CiAJbG9uZyBzdGFydCwgZW5kOworCisjaWYgMCAvKiBkaXNhYmxlIGtleS1wcmVzcyBkZXRlY3Rpb24gdG8gc3BlZWQgdXAgYm9vdC11cCB0aW1lICovCiAJdWNoYXIga2V5cGFkX3N0YXR1czFbMl0gPSB7MCwwfSwga2V5cGFkX3N0YXR1czJbMl0gPSB7MCwwfTsKIAogCS8qCkBAIC0zNDcsNiArMzQ5LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisjZW5kaWYKIAlhdV91c2Jfc3Rvcl9jdXJyX2RldiA9IC0xOwogCS8qIHN0YXJ0IFVTQiAqLwogCWlmICh1c2Jfc3RvcCgpIDwgMCkgewpAQCAtMzY0LDE4ICszNjcsMjEgQEAKIAlhdV91c2Jfc3Rvcl9jdXJyX2RldiA9IHVzYl9zdG9yX3NjYW4oMCk7CiAJaWYgKGF1X3VzYl9zdG9yX2N1cnJfZGV2ID09IC0xKSB7CiAJCWRlYnVnICgiTm8gZGV2aWNlIGZvdW5kLiBOb3QgaW5pdGlhbGl6ZWQ/XG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXMgPSAtMTsKKwkJZ290byB4aXQ7CiAJfQogCS8qIGNoZWNrIHdoZXRoZXIgaXQgaGFzIGEgcGFydGl0aW9uIHRhYmxlICovCiAJc3Rvcl9kZXYgPSBnZXRfZGV2KCJ1c2IiLCAwKTsKIAlpZiAoc3Rvcl9kZXYgPT0gTlVMTCkgewogCQlkZWJ1ZyAoInVrbm93biBkZXZpY2UgdHlwZVxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmVzID0gLTE7CisJCWdvdG8geGl0OwogCX0KIAlpZiAoZmF0X3JlZ2lzdGVyX2RldmljZShzdG9yX2RldiwgMSkgIT0gMCkgewogCQlkZWJ1ZyAoIlVuYWJsZSB0byB1c2UgVVNCICVkOiVkIGZvciBmYXRsc1xuIiwKIAkJCWF1X3VzYl9zdG9yX2N1cnJfZGV2LCAxKTsKLQkJcmV0dXJuIC0xOworCQlyZXMgPSAtMTsKKwkJZ290byB4aXQ7CiAJfQogCWlmIChmaWxlX2ZhdF9kZXRlY3RmcygpICE9IDApIHsKIAkJZGVidWcgKCJmaWxlX2ZhdF9kZXRlY3RmcyBmYWlsZWRcbiIpOwpAQCAtNTA0LDcgKzUxMCw3IEBACiAJCX0gd2hpbGUgKHJlcyA8IDApOwogI2VuZGlmCiAJfQotCXVzYl9zdG9wKCk7CisKIAkvKiByZXN0b3JlIHRoZSBvbGQgc3RhdGUgKi8KIAlkaXNhYmxlX2N0cmxjKG9sZF9jdHJsYyk7CiAjaWZkZWYgQ09ORklHX1BST0dSRVNTQkFSCkBAIC01MTcsNiArNTIzLDggQEAKIAkJbGNkX2VuYWJsZSgpOwogCX0KICNlbmRpZgotCXJldHVybiAwOworIHhpdDoKKwl1c2Jfc3RvcCgpOworCXJldHVybiByZXM7CiB9CiAjZW5kaWYgLyogQ09ORklHX0FVVE9fVVBEQVRFICovCmRpZmYgLS1naXQgYS9ib2FyZC9tY2MyMDAvbWNjMjAwLmMgYi9ib2FyZC9tY2MyMDAvbWNjMjAwLmMKaW5kZXggYWYwNDdlMi4uYTRjNDY0NCAxMDA2NDQKLS0tIGEvYm9hcmQvbWNjMjAwL21jYzIwMC5jCisrKyBiL2JvYXJkL21jYzIwMC9tY2MyMDAuYwpAQCAtMzA3LDcgKzMwNyw3IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV9SRVNFVCkKIAogdm9pZCBpbml0X2lkZV9yZXNldCAodm9pZCkKIHsKQEAgLTMyMCw5ICszMjAsOSBAQAogCWRlYnVnICgiaWRlX3Jlc2V0KCVkKVxuIiwgaWRlcmVzZXQpOwogCiB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCisjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogZXh0ZXJuIHZvaWQgZG9jX3Byb2JlICh1bG9uZyBwaHlzYWRyKTsKIHZvaWQgZG9jX2luaXQgKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9ib2FyZC9tY2MyMDAvdS1ib290LmxkcyBiL2JvYXJkL21jYzIwMC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmRlYTZiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL21jYzIwMC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNgotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL21sMi9zZXJpYWwuYyBiL2JvYXJkL21sMi9zZXJpYWwuYwppbmRleCA3NDY4N2YxLi42NTkzMTQ1IDEwMDY0NAotLS0gYS9ib2FyZC9tbDIvc2VyaWFsLmMKKysrIGIvYm9hcmQvbWwyL3NlcmlhbC5jCkBAIC04OCw3ICs4OCw3IEBACiAJfQogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIHZvaWQga2dkYl9zZXJpYWxfaW5pdCAodm9pZCkKIHsKIH0KQEAgLTExMiw0ICsxMTIsNCBAQAogewogCXJldHVybjsKIH0KLSNlbmRpZiAvKiBDRkdfQ01EX0tHREIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvbW90aW9ucHJvL3UtYm9vdC5sZHMgYi9ib2FyZC9tb3Rpb25wcm8vdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhOWMwZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9tb3Rpb25wcm8vdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDcKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzV4eHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbW91c3NlL2NvbmZpZy5tayBiL2JvYXJkL21vdXNzZS9jb25maWcubWsKaW5kZXggNjRjZmZhNC4uOTMzZTZiMyAxMDA2NDQKLS0tIGEvYm9hcmQvbW91c3NlL2NvbmZpZy5taworKysgYi9ib2FyZC9tb3Vzc2UvY29uZmlnLm1rCkBAIC0yNiwzICsyNiw1IEBACiAjCiBURVhUX0JBU0UgPSAweEZGRjAwMDAwCiBQTEFURk9STV9DUFBGTEFHUyArPSAtRFRFWFRfQkFTRT0kKFRFWFRfQkFTRSkKKworTERTQ1JJUFQgOj0gJChTUkNUUkVFKS9ib2FyZC9tb3Vzc2UvdS1ib290LmxkcwpkaWZmIC0tZ2l0IGEvYm9hcmQvbW91c3NlL3UtYm9vdC5sZHMgYi9ib2FyZC9tb3Vzc2UvdS1ib290LmxkcwppbmRleCA1NzM1OGI4Li5lYjRkOGU0IDEwMDY0NAotLS0gYS9ib2FyZC9tb3Vzc2UvdS1ib290LmxkcworKysgYi9ib2FyZC9tb3Vzc2UvdS1ib290LmxkcwpAQCAtNjAsNyArNjAsNiBAQAogICAgIGxpYl9nZW5lcmljL2NyYzMyLm8JCSgudGV4dCkKICAgICBsaWJfZ2VuZXJpYy96bGliLm8JCSgudGV4dCkKIAotICAgICooLmZpeHVwKQogICAgICooLmdvdDEpCiAgICAgLiA9IEFMSUdOKDE2KTsKICAgICAqKC5yb2RhdGEpCmRpZmYgLS1naXQgYS9ib2FyZC9tcDJ1c2IvbXAydXNiLmMgYi9ib2FyZC9tcDJ1c2IvbXAydXNiLmMKaW5kZXggNDg2ZDQ0Yy4uZGNkYTY5OSAxMDA2NDQKLS0tIGEvYm9hcmQvbXAydXNiL21wMnVzYi5jCisrKyBiL2JvYXJkL21wMnVzYi9tcDJ1c2IuYwpAQCAtNjEsNyArNjEsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9FVEhFUgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAvKgogICogTmFtZToKQEAgLTgxLDUgKzgxLDUgQEAKIAlwX3BoeW9wcy0+QXV0b05lZ290aWF0ZSA9IGRtOTE2MV9BdXRvTmVnb3RpYXRlOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogI2VuZGlmCS8qIENPTkZJR19EUklWRVJfRVRIRVIgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL21wYzgyNjBhZHMvdS1ib290LmxkcyBiL2JvYXJkL21wYzgyNjBhZHMvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4MDQ4ZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9tcGM4MjYwYWRzL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMS0yMDAzCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIE1vZGlmaWVkIGJ5IFl1bGkgQmFyY29oZW4gPHl1bGlAYXJhYmVsbGFzdy5jb20+Ci0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL21wYzgyNjZhZHMvdS1ib290LmxkcyBiL2JvYXJkL21wYzgyNjZhZHMvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIyMDc1OC4uMDAwMDAwMAotLS0gYS9ib2FyZC9tcGM4MjY2YWRzL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4MzEzZXJkYi91LWJvb3QubGRzIGIvYm9hcmQvbXBjODMxM2VyZGIvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3Yzg3YS4uMDAwMDAwMAotLS0gYS9ib2FyZC9tcGM4MzEzZXJkYi91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDYKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4M3h4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL21wYzgzMnhlbWRzL3UtYm9vdC5sZHMgYi9ib2FyZC9tcGM4MzJ4ZW1kcy91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdjODdhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL21wYzgzMnhlbWRzL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwNgotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgzeHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQotRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODM0OWVtZHMvbXBjODM0OWVtZHMuYyBiL2JvYXJkL21wYzgzNDllbWRzL21wYzgzNDllbWRzLmMKaW5kZXggMDcxNTkxZS4uNTIxZDFiYiAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODM0OWVtZHMvbXBjODM0OWVtZHMuYworKysgYi9ib2FyZC9tcGM4MzQ5ZW1kcy9tcGM4MzQ5ZW1kcy5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8aTJjLmg+CiAjaW5jbHVkZSA8c3BkLmg+CiAjaW5jbHVkZSA8bWlpcGh5Lmg+Ci0jaW5jbHVkZSA8Y29tbWFuZC5oPgogI2lmIGRlZmluZWQoQ09ORklHX1NQRF9FRVBST00pCiAjaW5jbHVkZSA8c3BkX3NkcmFtLmg+CiAjZW5kaWYKQEAgLTI1OCwzMzIgKzI1Nyw2IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0REUl9FQ0MpICYmIGRlZmluZWQoQ09ORklHX0REUl9FQ0NfQ01EKQotLyoKLSAqIEVDQyB1c2VyIGNvbW1hbmRzCi0gKi8KLXZvaWQgZWNjX3ByaW50X3N0YXR1cyh2b2lkKQotewotCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUjsKLQl2b2xhdGlsZSBkZHI4M3h4X3QgKmRkciA9ICZpbW1hcC0+ZGRyOwotCi0JcHJpbnRmKCJcbkVDQyBtb2RlOiAlc1xuXG4iLCAoZGRyLT5zZHJhbV9jZmcgJiBTRFJBTV9DRkdfRUNDX0VOKSA/ICJPTiIgOiAiT0ZGIik7Ci0KLQkvKiBJbnRlcnJ1cHRzICovCi0JcHJpbnRmKCJNZW1vcnkgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTpcbiIpOwotCXByaW50ZigiICBNdWx0aXBsZS1CaXQgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTogJWRcbiIsCi0JCQkoZGRyLT5lcnJfaW50X2VuICYgRUNDX0VSUl9JTlRfRU5fTUJFRSkgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIFNpbmdsZS1CaXQgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTogJWRcbiIsCi0JCQkoZGRyLT5lcnJfaW50X2VuICYgRUNDX0VSUl9JTlRfRU5fU0JFRSkgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIE1lbW9yeSBTZWxlY3QgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTogJWRcblxuIiwKLQkJCShkZHItPmVycl9pbnRfZW4gJiBFQ0NfRVJSX0lOVF9FTl9NU0VFKSA/IDEgOiAwKTsKLQotCS8qIEVycm9yIGRpc2FibGUgKi8KLQlwcmludGYoIk1lbW9yeSBFcnJvciBEaXNhYmxlOlxuIik7Ci0JcHJpbnRmKCIgIE11bHRpcGxlLUJpdCBFcnJvciBEaXNhYmxlOiAlZFxuIiwKLQkJCShkZHItPmVycl9kaXNhYmxlICYgRUNDX0VSUk9SX0RJU0FCTEVfTUJFRCkgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIFNpbmxlLUJpdCBFcnJvciBEaXNhYmxlOiAlZFxuIiwKLQkJCShkZHItPmVycl9kaXNhYmxlICYgRUNDX0VSUk9SX0RJU0FCTEVfU0JFRCkgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIE1lbW9yeSBTZWxlY3QgRXJyb3IgRGlzYWJsZTogJWRcblxuIiwKLQkJCShkZHItPmVycl9kaXNhYmxlICYgRUNDX0VSUk9SX0RJU0FCTEVfTVNFRCkgPyAxIDogMCk7Ci0KLQkvKiBFcnJvciBpbmplY3Rpb24gKi8KLQlwcmludGYoIk1lbW9yeSBEYXRhIFBhdGggRXJyb3IgSW5qZWN0aW9uIE1hc2sgSGlnaC9Mb3c6ICUwOGx4ICUwOGx4XG4iLAotCQkJZGRyLT5kYXRhX2Vycl9pbmplY3RfaGksIGRkci0+ZGF0YV9lcnJfaW5qZWN0X2xvKTsKLQotCXByaW50ZigiTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBFQ0M6XG4iKTsKLQlwcmludGYoIiAgRUNDIE1pcnJvciBCeXRlOiAlZFxuIiwKLQkJCShkZHItPmVjY19lcnJfaW5qZWN0ICYgRUNDX0VSUl9JTkpFQ1RfRU1CKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgRUNDIEluamVjdGlvbiBFbmFibGU6ICVkXG4iLAotCQkJKGRkci0+ZWNjX2Vycl9pbmplY3QgJiBFQ0NfRVJSX0lOSkVDVF9FSUVOKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgRUNDIEVycm9yIEluamVjdGlvbiBNYXNrOiAweCUwMnhcblxuIiwKLQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgJiBFQ0NfRVJSX0lOSkVDVF9FRUlNKTsKLQotCS8qIFNCRSBjb3VudGVyL3RocmVzaG9sZCAqLwotCXByaW50ZigiTWVtb3J5IFNpbmdsZS1CaXQgRXJyb3IgTWFuYWdlbWVudCAoMC4uMjU1KTpcbiIpOwotCXByaW50ZigiICBTaW5nbGUtQml0IEVycm9yIFRocmVzaG9sZDogJWRcbiIsCi0JCQkoZGRyLT5lcnJfc2JlICYgRUNDX0VSUk9SX01BTl9TQkVUKSA+PiBFQ0NfRVJST1JfTUFOX1NCRVRfU0hJRlQpOwotCXByaW50ZigiICBTaW5nbGUtQml0IEVycm9yIENvdW50ZXI6ICVkXG5cbiIsCi0JCQkoZGRyLT5lcnJfc2JlICYgRUNDX0VSUk9SX01BTl9TQkVDKSA+PiBFQ0NfRVJST1JfTUFOX1NCRUNfU0hJRlQpOwotCi0JLyogRXJyb3IgZGV0ZWN0ICovCi0JcHJpbnRmKCJNZW1vcnkgRXJyb3IgRGV0ZWN0OlxuIik7Ci0JcHJpbnRmKCIgIE11bHRpcGxlIE1lbW9yeSBFcnJvcnM6ICVkXG4iLAotCQkJKGRkci0+ZXJyX2RldGVjdCAmIEVDQ19FUlJPUl9ERVRFQ1RfTU1FKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgTXVsdGlwbGUtQml0IEVycm9yOiAlZFxuIiwKLQkJCShkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX01CRSkgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIFNpbmdsZS1CaXQgRXJyb3I6ICVkXG4iLAotCQkJKGRkci0+ZXJyX2RldGVjdCAmIEVDQ19FUlJPUl9ERVRFQ1RfU0JFKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgTWVtb3J5IFNlbGVjdCBFcnJvcjogJWRcblxuIiwKLQkJCShkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX01TRSkgPyAxIDogMCk7Ci0KLQkvKiBDYXB0dXJlIGRhdGEgKi8KLQlwcmludGYoIk1lbW9yeSBFcnJvciBBZGRyZXNzIENhcHR1cmU6IDB4JTA4bHhcbiIsIGRkci0+Y2FwdHVyZV9hZGRyZXNzKTsKLQlwcmludGYoIk1lbW9yeSBEYXRhIFBhdGggUmVhZCBDYXB0dXJlIEhpZ2gvTG93OiAlMDhseCAlMDhseFxuIiwKLQkJCWRkci0+Y2FwdHVyZV9kYXRhX2hpLCBkZHItPmNhcHR1cmVfZGF0YV9sbyk7Ci0JcHJpbnRmKCJNZW1vcnkgRGF0YSBQYXRoIFJlYWQgQ2FwdHVyZSBFQ0M6IDB4JTAyeFxuXG4iLAotCQlkZHItPmNhcHR1cmVfZWNjICYgQ0FQVFVSRV9FQ0NfRUNFKTsKLQotCXByaW50ZigiTWVtb3J5IEVycm9yIEF0dHJpYnV0ZXMgQ2FwdHVyZTpcbiIpOwotCXByaW50ZigiICBEYXRhIEJlYXQgTnVtYmVyOiAlZFxuIiwKLQkJCShkZHItPmNhcHR1cmVfYXR0cmlidXRlcyAmIEVDQ19DQVBUX0FUVFJfQk5VTSkgPj4gRUNDX0NBUFRfQVRUUl9CTlVNX1NISUZUKTsKLQlwcmludGYoIiAgVHJhbnNhY3Rpb24gU2l6ZTogJWRcbiIsCi0JCQkoZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX1RTSVopID4+IEVDQ19DQVBUX0FUVFJfVFNJWl9TSElGVCk7Ci0JcHJpbnRmKCIgIFRyYW5zYWN0aW9uIFNvdXJjZTogJWRcbiIsCi0JCQkoZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX1RTUkMpID4+IEVDQ19DQVBUX0FUVFJfVFNSQ19TSElGVCk7Ci0JcHJpbnRmKCIgIFRyYW5zYWN0aW9uIFR5cGU6ICVkXG4iLAotCQkJKGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9UVFlQKSA+PiBFQ0NfQ0FQVF9BVFRSX1RUWVBfU0hJRlQpOwotCXByaW50ZigiICBFcnJvciBJbmZvcm1hdGlvbiBWYWxpZDogJWRcblxuIiwKLQkJCWRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9WTEQpOwotfQotCi1pbnQgZG9fZWNjICggY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0Jdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKUNGR19JTU1SOwotCXZvbGF0aWxlIGRkcjgzeHhfdCAqZGRyID0gJmltbWFwLT5kZHI7Ci0Jdm9sYXRpbGUgdTMyIHZhbDsKLQl1NjQgKmFkZHIsIGNvdW50LCB2YWw2NDsKLQlyZWdpc3RlciB1NjQgKmk7Ci0KLQlpZiAoYXJnYyA+IDQpIHsKLQkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JaWYgKGFyZ2MgPT0gMikgewotCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJzdGF0dXMiKSA9PSAwKSB7Ci0JCQllY2NfcHJpbnRfc3RhdHVzKCk7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImNhcHR1cmVjbGVhciIpID09IDApIHsKLQkJCWRkci0+Y2FwdHVyZV9hZGRyZXNzID0gMDsKLQkJCWRkci0+Y2FwdHVyZV9kYXRhX2hpID0gMDsKLQkJCWRkci0+Y2FwdHVyZV9kYXRhX2xvID0gMDsKLQkJCWRkci0+Y2FwdHVyZV9lY2MgPSAwOwotCQkJZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgPSAwOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlpZiAoYXJnYyA9PSAzKSB7Ci0JCWlmIChzdHJjbXAoYXJndlsxXSwgInNiZWNudCIpID09IDApIHsKLQkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDEwKTsKLQkJCWlmICh2YWwgPiAyNTUpIHsKLQkJCQlwcmludGYoIkluY29ycmVjdCBDb3VudGVyIHZhbHVlLCBzaG91bGQgYmUgMC4uMjU1XG4iKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQotCQkJdmFsID0gKHZhbCA8PCBFQ0NfRVJST1JfTUFOX1NCRUNfU0hJRlQpOwotCQkJdmFsIHw9IChkZHItPmVycl9zYmUgJiBFQ0NfRVJST1JfTUFOX1NCRVQpOwotCi0JCQlkZHItPmVycl9zYmUgPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgInNiZXRociIpID09IDApIHsKLQkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDEwKTsKLQkJCWlmICh2YWwgPiAyNTUpIHsKLQkJCQlwcmludGYoIkluY29ycmVjdCBDb3VudGVyIHZhbHVlLCBzaG91bGQgYmUgMC4uMjU1XG4iKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQotCQkJdmFsID0gKHZhbCA8PCBFQ0NfRVJST1JfTUFOX1NCRVRfU0hJRlQpOwotCQkJdmFsIHw9IChkZHItPmVycl9zYmUgJiBFQ0NfRVJST1JfTUFOX1NCRUMpOwotCi0JCQlkZHItPmVycl9zYmUgPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImVycmRpc2FibGUiKSA9PSAwKSB7Ci0JCQl2YWwgPSBkZHItPmVycl9kaXNhYmxlOwotCi0JCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICIrc2JlIikgPT0gMCkgewotCQkJCXZhbCB8PSBFQ0NfRVJST1JfRElTQUJMRV9TQkVEOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIittYmUiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IEVDQ19FUlJPUl9ESVNBQkxFX01CRUQ7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiK21zZSIpID09IDApIHsKLQkJCQl2YWwgfD0gRUNDX0VSUk9SX0RJU0FCTEVfTVNFRDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICIrYWxsIikgPT0gMCkgewotCQkJCXZhbCB8PSAoRUNDX0VSUk9SX0RJU0FCTEVfU0JFRCB8Ci0JCQkJCUVDQ19FUlJPUl9ESVNBQkxFX01CRUQgfAotCQkJCQlFQ0NfRVJST1JfRElTQUJMRV9NU0VEKTsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICItc2JlIikgPT0gMCkgewotCQkJCXZhbCAmPSB+RUNDX0VSUk9SX0RJU0FCTEVfU0JFRDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICItbWJlIikgPT0gMCkgewotCQkJCXZhbCAmPSB+RUNDX0VSUk9SX0RJU0FCTEVfTUJFRDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICItbXNlIikgPT0gMCkgewotCQkJCXZhbCAmPSB+RUNDX0VSUk9SX0RJU0FCTEVfTVNFRDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICItYWxsIikgPT0gMCkgewotCQkJCXZhbCAmPSB+KEVDQ19FUlJPUl9ESVNBQkxFX1NCRUQgfAotCQkJCQlFQ0NfRVJST1JfRElTQUJMRV9NQkVEIHwKLQkJCQkJRUNDX0VSUk9SX0RJU0FCTEVfTVNFRCk7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50ZigiSW5jb3JyZWN0IGVycl9kaXNhYmxlIGZpZWxkXG4iKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQotCQkJZGRyLT5lcnJfZGlzYWJsZSA9IHZhbDsKLQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIpOwotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpc3luYyIpOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJlcnJkZXRlY3RjbHIiKSA9PSAwKSB7Ci0JCQl2YWwgPSBkZHItPmVycl9kZXRlY3Q7Ci0KLQkJCWlmIChzdHJjbXAoYXJndlsyXSwgIm1tZSIpID09IDApIHsKLQkJCQl2YWwgfD0gRUNDX0VSUk9SX0RFVEVDVF9NTUU7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAic2JlIikgPT0gMCkgewotCQkJCXZhbCB8PSBFQ0NfRVJST1JfREVURUNUX1NCRTsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJtYmUiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IEVDQ19FUlJPUl9ERVRFQ1RfTUJFOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIm1zZSIpID09IDApIHsKLQkJCQl2YWwgfD0gRUNDX0VSUk9SX0RFVEVDVF9NU0U7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiYWxsIikgPT0gMCkgewotCQkJCXZhbCB8PSAoRUNDX0VSUk9SX0RFVEVDVF9NTUUgfAotCQkJCQlFQ0NfRVJST1JfREVURUNUX01CRSB8Ci0JCQkJCUVDQ19FUlJPUl9ERVRFQ1RfU0JFIHwKLQkJCQkJRUNDX0VSUk9SX0RFVEVDVF9NU0UpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGYoIkluY29ycmVjdCBlcnJfZGV0ZWN0IGZpZWxkXG4iKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQotCQkJZGRyLT5lcnJfZGV0ZWN0ID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJpbmplY3RkYXRhaGkiKSA9PSAwKSB7Ci0JCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7Ci0KLQkJCWRkci0+ZGF0YV9lcnJfaW5qZWN0X2hpID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJpbmplY3RkYXRhbG8iKSA9PSAwKSB7Ci0JCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7Ci0KLQkJCWRkci0+ZGF0YV9lcnJfaW5qZWN0X2xvID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJpbmplY3RlY2MiKSA9PSAwKSB7Ci0JCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7Ci0JCQlpZiAodmFsID4gMHhmZikgewotCQkJCXByaW50ZigiSW5jb3JyZWN0IEVDQyBpbmplY3QgbWFzaywgc2hvdWxkIGJlIDB4MDAuLjB4ZmZcbiIpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQkJdmFsIHw9IChkZHItPmVjY19lcnJfaW5qZWN0ICYgfkVDQ19FUlJfSU5KRUNUX0VFSU0pOwotCi0JCQlkZHItPmVjY19lcnJfaW5qZWN0ID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJpbmplY3QiKSA9PSAwKSB7Ci0JCQl2YWwgPSBkZHItPmVjY19lcnJfaW5qZWN0OwotCi0JCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJlbiIpID09IDApCi0JCQkJdmFsIHw9IEVDQ19FUlJfSU5KRUNUX0VJRU47Ci0JCQllbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgImRpcyIpID09IDApCi0JCQkJdmFsICY9IH5FQ0NfRVJSX0lOSkVDVF9FSUVOOwotCQkJZWxzZQotCQkJCXByaW50ZigiSW5jb3JyZWN0IGNvbW1hbmRcbiIpOwotCi0JCQlkZHItPmVjY19lcnJfaW5qZWN0ID0gdmFsOwotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIik7Ci0JCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlzeW5jIik7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIm1pcnJvciIpID09IDApIHsKLQkJCXZhbCA9IGRkci0+ZWNjX2Vycl9pbmplY3Q7Ci0KLQkJCWlmIChzdHJjbXAoYXJndlsyXSwgImVuIikgPT0gMCkKLQkJCQl2YWwgfD0gRUNDX0VSUl9JTkpFQ1RfRU1COwotCQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJkaXMiKSA9PSAwKQotCQkJCXZhbCAmPSB+RUNDX0VSUl9JTkpFQ1RfRU1COwotCQkJZWxzZQotCQkJCXByaW50ZigiSW5jb3JyZWN0IGNvbW1hbmRcbiIpOwotCi0JCQlkZHItPmVjY19lcnJfaW5qZWN0ID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlpZiAoYXJnYyA9PSA0KSB7Ci0JCWlmIChzdHJjbXAoYXJndlsxXSwgInRlc3QiKSA9PSAwKSB7Ci0JCQlhZGRyID0gKHU2NCAqKXNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKLQkJCWNvdW50ID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOwotCi0JCQlpZiAoKHUzMilhZGRyICUgOCkgewotCQkJCXByaW50ZigiQWRkcmVzcyBub3QgYWxsaWduZWQgb24gZG91YmxlIHdvcmQgYm91bmRhcnlcbiIpOwotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQlkaXNhYmxlX2ludGVycnVwdHMoKTsKLQkJCWljYWNoZV9kaXNhYmxlKCk7Ci0KLQkJCWZvciAoaSA9IGFkZHI7IGkgPCBhZGRyICsgY291bnQ7IGkrKykgewotCQkJCS8qIGVuYWJsZSBpbmplY3RzICovCi0JCQkJZGRyLT5lY2NfZXJyX2luamVjdCB8PSBFQ0NfRVJSX0lOSkVDVF9FSUVOOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIpOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgiaXN5bmMiKTsKLQotCQkJCS8qIHdyaXRlIG1lbW9yeSBsb2NhdGlvbiBpbmplY3RpbmcgZXJyb3JzICovCi0JCQkJKmkgPSAweDExMjIzMzQ0NTU2Njc3ODhVTEw7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIik7Ci0KLQkJCQkvKiBkaXNhYmxlIGluamVjdHMgKi8KLQkJCQlkZHItPmVjY19lcnJfaW5qZWN0ICY9IH5FQ0NfRVJSX0lOSkVDVF9FSUVOOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIpOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgiaXN5bmMiKTsKLQotCQkJCS8qIHJlYWQgZGF0YSwgdGhpcyBnZW5lcmF0ZXMgRUNDIGVycm9yICovCi0JCQkJdmFsNjQgPSAqaTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKLQotCQkJCS8qIGRpc2FibGUgZXJyb3JzIGZvciBFQ0MgKi8KLQkJCQlkZHItPmVycl9kaXNhYmxlIHw9IH5FQ0NfRVJST1JfRU5BQkxFOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIpOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgiaXN5bmMiKTsKLQotCQkJCS8qIHJlLWluaXRpYWxpemUgbWVtb3J5LCB3cml0ZSB0aGUgbG9jYXRpb24gYWdhaW4KLQkJCQkgKiBOT1QgaW5qZWN0aW5nIGVycm9ycyB0aGlzIHRpbWUgKi8KLQkJCQkqaSA9IDB4Y2FmZWNhZmVjYWZlY2FmZVVMTDsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKLQotCQkJCS8qIGVuYWJsZSBlcnJvcnMgZm9yIEVDQyAqLwotCQkJCWRkci0+ZXJyX2Rpc2FibGUgJj0gRUNDX0VSUk9SX0VOQUJMRTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlzeW5jIik7Ci0JCQl9Ci0KLQkJCWljYWNoZV9lbmFibGUoKTsKLQkJCWVuYWJsZV9pbnRlcnJ1cHRzKCk7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKLQlyZXR1cm4gMTsKLX0KLQotVV9CT09UX0NNRCgKLQllY2MsICAgICA0LCAgICAgMCwgICAgICBkb19lY2MsCi0JImVjYyAgICAgLSBzdXBwb3J0IGZvciBERFIgRUNDIGZlYXR1cmVzXG4iLAotCSJzdGF0dXMgICAgICAgICAgICAgIC0gcHJpbnQgb3V0IHN0YXR1cyBpbmZvXG4iCi0JImVjYyBjYXB0dXJlY2xlYXIgICAgICAgIC0gY2xlYXIgY2FwdHVyZSByZWdzIGRhdGFcbiIKLQkiZWNjIHNiZWNudCA8dmFsPiAgICAgICAgLSBzZXQgU2luZ2xlLUJpdCBFcnJvciBjb3VudGVyXG4iCi0JImVjYyBzYmV0aHIgPHZhbD4gICAgICAgIC0gc2V0IFNpbmdsZS1CaXQgVGhyZXNob2xkXG4iCi0JImVjYyBlcnJkaXNhYmxlIDxmbGFnPiAgIC0gY2xlYXIvc2V0IGRpc2FibGUgTWVtb3J5IEVycm9yIERpc2FibGUsIGZsYWc6XG4iCi0JIiAgWy18K11zYmUgLSBTaW5nbGUtQml0IEVycm9yXG4iCi0JIiAgWy18K11tYmUgLSBNdWx0aXBsZS1CaXQgRXJyb3JcbiIKLQkiICBbLXwrXW1zZSAtIE1lbW9yeSBTZWxlY3QgRXJyb3JcbiIKLQkiICBbLXwrXWFsbCAtIGFsbCBlcnJvcnNcbiIKLQkiZWNjIGVycmRldGVjdGNsciA8ZmxhZz4gLSBjbGVhciBNZW1vcnkgRXJyb3IgRGV0ZWN0LCBmbGFnOlxuIgotCSIgIG1tZSAtIE11bHRpcGxlIE1lbW9yeSBFcnJvcnNcbiIKLQkiICBzYmUgLSBTaW5nbGUtQml0IEVycm9yXG4iCi0JIiAgbWJlIC0gTXVsdGlwbGUtQml0IEVycm9yXG4iCi0JIiAgbXNlIC0gTWVtb3J5IFNlbGVjdCBFcnJvclxuIgotCSIgIGFsbCAtIGFsbCBlcnJvcnNcbiIKLQkiZWNjIGluamVjdGRhdGFoaSA8aGk+ICAtIHNldCBNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIEhpZ2hcbiIKLQkiZWNjIGluamVjdGRhdGFsbyA8bG8+ICAtIHNldCBNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIExvd1xuIgotCSJlY2MgaW5qZWN0ZWNjIDxlY2M+ICAgIC0gc2V0IEVDQyBFcnJvciBJbmplY3Rpb24gTWFza1xuIgotCSJlY2MgaW5qZWN0IDxlbnxkaXM+ICAgIC0gZW5hYmxlL2Rpc2FibGUgZXJyb3IgaW5qZWN0aW9uXG4iCi0JImVjYyBtaXJyb3IgPGVufGRpcz4gICAgLSBlbmFibGUvZGlzYWJsZSBtaXJyb3IgYnl0ZVxuIgotCSJlY2MgdGVzdCA8YWRkcj4gPGNudD4gIC0gdGVzdCBtZW0gcmVnaW9uOlxuIgotCSIgIC0gZW5hYmxlcyBpbmplY3RzXG4iCi0JIiAgLSB3cml0ZXMgcGF0dGVybiBpbmplY3RpbmcgZXJyb3JzXG4iCi0JIiAgLSBkaXNhYmxlcyBpbmplY3RzXG4iCi0JIiAgLSByZWFkcyBwYXR0ZXJuIGJhY2ssIGdlbmVyYXRlcyBlcnJvclxuIgotCSIgIC0gcmUtaW5pdHMgbWVtb3J5IgotKTsKLSNlbmRpZiAvKiBpZiBkZWZpbmVkKENPTkZJR19ERFJfRUNDKSAmJiBkZWZpbmVkKENPTkZJR19ERFJfRUNDX0NNRCkgKi8KLQogI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkgJiYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApCiB2b2lkCiBmdF9ib2FyZF9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCkKZGlmZiAtLWdpdCBhL2JvYXJkL21wYzgzNDllbWRzL3UtYm9vdC5sZHMgYi9ib2FyZC9tcGM4MzQ5ZW1kcy91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdjODdhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL21wYzgzNDllbWRzL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwNgotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgzeHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQotRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODM0OWl0eC9jb25maWcubWsgYi9ib2FyZC9tcGM4MzQ5aXR4L2NvbmZpZy5tawppbmRleCAxOTAxZmRjLi43OWYxNzY1IDEwMDY0NAotLS0gYS9ib2FyZC9tcGM4MzQ5aXR4L2NvbmZpZy5taworKysgYi9ib2FyZC9tcGM4MzQ5aXR4L2NvbmZpZy5tawpAQCAtMjksOSArMjksMyBAQAogaWZuZGVmIFRFWFRfQkFTRQogVEVYVF9CQVNFICA9ICAgMHhGRUYwMDAwMAogZW5kaWYKLQotaWZuZXEgKCQoT0JKVFJFRSksJChTUkNUUkVFKSkKLSMgV2UgYXJlIGJ1aWxkaW5nIHUtYm9vdCBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeSwgdXNlIGdlbmVyYXRlZAotIyAubGRzIHNjcmlwdCBmcm9tIE9CSlRSRUUgZGlyZWN0b3J5LgotTERTQ1JJUFQgOj0gJChPQkpUUkVFKS9ib2FyZC8kKEJPQVJERElSKS91LWJvb3QubGRzCi1lbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODM0OWl0eC91LWJvb3QubGRzIGIvYm9hcmQvbXBjODM0OWl0eC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDQ0YzBmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL21wYzgzNDlpdHgvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiAyMDA2LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODN4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQotRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODM2MGVtZHMvbXBjODM2MGVtZHMuYyBiL2JvYXJkL21wYzgzNjBlbWRzL21wYzgzNjBlbWRzLmMKaW5kZXggNTYyZWI4Yi4uM2ZhMDkzZCAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODM2MGVtZHMvbXBjODM2MGVtZHMuYworKysgYi9ib2FyZC9tcGM4MzYwZW1kcy9tcGM4MzYwZW1kcy5jCkBAIC0xLDggKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgotICoKICAqIERhdmUgTGl1IDxkYXZlbGl1QGZyZWVzY2FsZS5jb20+Ci0gKiBiYXNlZCBvbiBib2FyZC9tcGM4MzQ5ZW1kcy9tcGM4MzQ5ZW1kcy5jCiAgKgogICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICAqIHByb2plY3QuCkBAIC0xOSw3ICsxNyw2IEBACiAjaW5jbHVkZSA8aTJjLmg+CiAjaW5jbHVkZSA8c3BkLmg+CiAjaW5jbHVkZSA8bWlpcGh5Lmg+Ci0jaW5jbHVkZSA8Y29tbWFuZC5oPgogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKICNpbmNsdWRlIDxwY2kuaD4KICNlbmRpZgpAQCAtMzAsOCArMjcsNyBAQAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQogI2luY2x1ZGUgPGZ0X2J1aWxkLmg+Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisjZWxpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCiAjaW5jbHVkZSA8bGliZmR0Lmg+CiAjaW5jbHVkZSA8bGliZmR0X2Vudi5oPgogI2VuZGlmCkBAIC0xMDMsNyArOTksOSBAQAogCiAJLyogRGlzYWJsZSBHMVRYQ0xLLCBHMlRYQ0xLIGgvdyBidWZmZXJzIChyZXYuMiBoL3cgYnVnIHdvcmthcm91bmQpICovCiAJaWYgKGltbXItPnN5c2NvbmYuc3ByaWRyID09IFNQUl84MzYwX1JFVjIwIHx8Ci0JICAgIGltbXItPnN5c2NvbmYuc3ByaWRyID09IFNQUl84MzYwRV9SRVYyMCkKKwkgICAgaW1tci0+c3lzY29uZi5zcHJpZHIgPT0gU1BSXzgzNjBFX1JFVjIwIHx8CisJICAgIGltbXItPnN5c2NvbmYuc3ByaWRyID09IFNQUl84MzYwX1JFVjIxIHx8CisJICAgIGltbXItPnN5c2NvbmYuc3ByaWRyID09IFNQUl84MzYwRV9SRVYyMSkKIAkJYmNzclsweGVdID0gMHgzMDsKIAogCXJldHVybiAwOwpAQCAtMjg3LDM4MSArMjg1LDYgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfRERSX0VDQykgJiYgZGVmaW5lZChDT05GSUdfRERSX0VDQ19DTUQpCi0vKgotICogRUNDIHVzZXIgY29tbWFuZHMKLSAqLwotdm9pZCBlY2NfcHJpbnRfc3RhdHVzKHZvaWQpCi17Ci0Jdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKLQl2b2xhdGlsZSBkZHI4M3h4X3QgKmRkciA9ICZpbW1hcC0+ZGRyOwotCi0JcHJpbnRmKCJcbkVDQyBtb2RlOiAlc1xuXG4iLAotCSAgICAgICAoZGRyLT5zZHJhbV9jZmcgJiBTRFJBTV9DRkdfRUNDX0VOKSA/ICJPTiIgOiAiT0ZGIik7Ci0KLQkvKiBJbnRlcnJ1cHRzICovCi0JcHJpbnRmKCJNZW1vcnkgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTpcbiIpOwotCXByaW50ZigiICBNdWx0aXBsZS1CaXQgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTogJWRcbiIsCi0JICAgICAgIChkZHItPmVycl9pbnRfZW4gJiBFQ0NfRVJSX0lOVF9FTl9NQkVFKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgU2luZ2xlLUJpdCBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlOiAlZFxuIiwKLQkgICAgICAgKGRkci0+ZXJyX2ludF9lbiAmIEVDQ19FUlJfSU5UX0VOX1NCRUUpID8gMSA6IDApOwotCXByaW50ZigiICBNZW1vcnkgU2VsZWN0IEVycm9yIEludGVycnVwdCBFbmFibGU6ICVkXG5cbiIsCi0JICAgICAgIChkZHItPmVycl9pbnRfZW4gJiBFQ0NfRVJSX0lOVF9FTl9NU0VFKSA/IDEgOiAwKTsKLQotCS8qIEVycm9yIGRpc2FibGUgKi8KLQlwcmludGYoIk1lbW9yeSBFcnJvciBEaXNhYmxlOlxuIik7Ci0JcHJpbnRmKCIgIE11bHRpcGxlLUJpdCBFcnJvciBEaXNhYmxlOiAlZFxuIiwKLQkgICAgICAgKGRkci0+ZXJyX2Rpc2FibGUgJiBFQ0NfRVJST1JfRElTQUJMRV9NQkVEKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgU2lubGUtQml0IEVycm9yIERpc2FibGU6ICVkXG4iLAotCSAgICAgICAoZGRyLT5lcnJfZGlzYWJsZSAmIEVDQ19FUlJPUl9ESVNBQkxFX1NCRUQpID8gMSA6IDApOwotCXByaW50ZigiICBNZW1vcnkgU2VsZWN0IEVycm9yIERpc2FibGU6ICVkXG5cbiIsCi0JICAgICAgIChkZHItPmVycl9kaXNhYmxlICYgRUNDX0VSUk9SX0RJU0FCTEVfTVNFRCkgPyAxIDogMCk7Ci0KLQkvKiBFcnJvciBpbmplY3Rpb24gKi8KLQlwcmludGYoIk1lbW9yeSBEYXRhIFBhdGggRXJyb3IgSW5qZWN0aW9uIE1hc2sgSGlnaC9Mb3c6ICUwOGx4ICUwOGx4XG4iLAotCSAgICAgICBkZHItPmRhdGFfZXJyX2luamVjdF9oaSwgZGRyLT5kYXRhX2Vycl9pbmplY3RfbG8pOwotCi0JcHJpbnRmKCJNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIEVDQzpcbiIpOwotCXByaW50ZigiICBFQ0MgTWlycm9yIEJ5dGU6ICVkXG4iLAotCSAgICAgICAoZGRyLT5lY2NfZXJyX2luamVjdCAmIEVDQ19FUlJfSU5KRUNUX0VNQikgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIEVDQyBJbmplY3Rpb24gRW5hYmxlOiAlZFxuIiwKLQkgICAgICAgKGRkci0+ZWNjX2Vycl9pbmplY3QgJiBFQ0NfRVJSX0lOSkVDVF9FSUVOKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgRUNDIEVycm9yIEluamVjdGlvbiBNYXNrOiAweCUwMnhcblxuIiwKLQkgICAgICAgZGRyLT5lY2NfZXJyX2luamVjdCAmIEVDQ19FUlJfSU5KRUNUX0VFSU0pOwotCi0JLyogU0JFIGNvdW50ZXIvdGhyZXNob2xkICovCi0JcHJpbnRmKCJNZW1vcnkgU2luZ2xlLUJpdCBFcnJvciBNYW5hZ2VtZW50ICgwLi4yNTUpOlxuIik7Ci0JcHJpbnRmKCIgIFNpbmdsZS1CaXQgRXJyb3IgVGhyZXNob2xkOiAlZFxuIiwKLQkgICAgICAgKGRkci0+ZXJyX3NiZSAmIEVDQ19FUlJPUl9NQU5fU0JFVCkgPj4gRUNDX0VSUk9SX01BTl9TQkVUX1NISUZUKTsKLQlwcmludGYoIiAgU2luZ2xlLUJpdCBFcnJvciBDb3VudGVyOiAlZFxuXG4iLAotCSAgICAgICAoZGRyLT5lcnJfc2JlICYgRUNDX0VSUk9SX01BTl9TQkVDKSA+PiBFQ0NfRVJST1JfTUFOX1NCRUNfU0hJRlQpOwotCi0JLyogRXJyb3IgZGV0ZWN0ICovCi0JcHJpbnRmKCJNZW1vcnkgRXJyb3IgRGV0ZWN0OlxuIik7Ci0JcHJpbnRmKCIgIE11bHRpcGxlIE1lbW9yeSBFcnJvcnM6ICVkXG4iLAotCSAgICAgICAoZGRyLT5lcnJfZGV0ZWN0ICYgRUNDX0VSUk9SX0RFVEVDVF9NTUUpID8gMSA6IDApOwotCXByaW50ZigiICBNdWx0aXBsZS1CaXQgRXJyb3I6ICVkXG4iLAotCSAgICAgICAoZGRyLT5lcnJfZGV0ZWN0ICYgRUNDX0VSUk9SX0RFVEVDVF9NQkUpID8gMSA6IDApOwotCXByaW50ZigiICBTaW5nbGUtQml0IEVycm9yOiAlZFxuIiwKLQkgICAgICAgKGRkci0+ZXJyX2RldGVjdCAmIEVDQ19FUlJPUl9ERVRFQ1RfU0JFKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgTWVtb3J5IFNlbGVjdCBFcnJvcjogJWRcblxuIiwKLQkgICAgICAgKGRkci0+ZXJyX2RldGVjdCAmIEVDQ19FUlJPUl9ERVRFQ1RfTVNFKSA/IDEgOiAwKTsKLQotCS8qIENhcHR1cmUgZGF0YSAqLwotCXByaW50ZigiTWVtb3J5IEVycm9yIEFkZHJlc3MgQ2FwdHVyZTogMHglMDhseFxuIiwgZGRyLT5jYXB0dXJlX2FkZHJlc3MpOwotCXByaW50ZigiTWVtb3J5IERhdGEgUGF0aCBSZWFkIENhcHR1cmUgSGlnaC9Mb3c6ICUwOGx4ICUwOGx4XG4iLAotCSAgICAgICBkZHItPmNhcHR1cmVfZGF0YV9oaSwgZGRyLT5jYXB0dXJlX2RhdGFfbG8pOwotCXByaW50ZigiTWVtb3J5IERhdGEgUGF0aCBSZWFkIENhcHR1cmUgRUNDOiAweCUwMnhcblxuIiwKLQkgICAgICAgZGRyLT5jYXB0dXJlX2VjYyAmIENBUFRVUkVfRUNDX0VDRSk7Ci0KLQlwcmludGYoIk1lbW9yeSBFcnJvciBBdHRyaWJ1dGVzIENhcHR1cmU6XG4iKTsKLQlwcmludGYoIiBEYXRhIEJlYXQgTnVtYmVyOiAlZFxuIiwKLQkgICAgICAgKGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9CTlVNKSA+PgotCSAgICAgICBFQ0NfQ0FQVF9BVFRSX0JOVU1fU0hJRlQpOwotCXByaW50ZigiICBUcmFuc2FjdGlvbiBTaXplOiAlZFxuIiwKLQkgICAgICAgKGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9UU0laKSA+PgotCSAgICAgICBFQ0NfQ0FQVF9BVFRSX1RTSVpfU0hJRlQpOwotCXByaW50ZigiICBUcmFuc2FjdGlvbiBTb3VyY2U6ICVkXG4iLAotCSAgICAgICAoZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX1RTUkMpID4+Ci0JICAgICAgIEVDQ19DQVBUX0FUVFJfVFNSQ19TSElGVCk7Ci0JcHJpbnRmKCIgIFRyYW5zYWN0aW9uIFR5cGU6ICVkXG4iLAotCSAgICAgICAoZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX1RUWVApID4+Ci0JICAgICAgIEVDQ19DQVBUX0FUVFJfVFRZUF9TSElGVCk7Ci0JcHJpbnRmKCIgIEVycm9yIEluZm9ybWF0aW9uIFZhbGlkOiAlZFxuXG4iLAotCSAgICAgICBkZHItPmNhcHR1cmVfYXR0cmlidXRlcyAmIEVDQ19DQVBUX0FUVFJfVkxEKTsKLX0KLQotaW50IGRvX2VjYyhjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0Jdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKLQl2b2xhdGlsZSBkZHI4M3h4X3QgKmRkciA9ICZpbW1hcC0+ZGRyOwotCXZvbGF0aWxlIHUzMiB2YWw7Ci0JdTY0ICphZGRyOwotCXUzMiBjb3VudDsKLQlyZWdpc3RlciB1NjQgKmk7Ci0JdTMyIHJldFsyXTsKLQl1MzIgcGF0dGVyblsyXTsKLQl1MzIgd3JpdGViYWNrWzJdOwotCi0JLyogVGhlIHBhdHRlcm4gaXMgd3JpdHRlbiBpbnRvIG1lbW9yeSB0byBnZW5lcmF0ZSBlcnJvciAqLwotCXBhdHRlcm5bMF0gPSAweGZlZGNiYTk4VUw7Ci0JcGF0dGVyblsxXSA9IDB4NzY1NDMyMTBVTDsKLQotCS8qIEFmdGVyIGluamVjdGluZyBlcnJvciwgcmUtaW5pdGlhbGl6ZSB0aGUgbWVtb3J5IHdpdGggdGhlIHZhbHVlICovCi0Jd3JpdGViYWNrWzBdID0gMHgwMTIzNDU2N1VMOwotCXdyaXRlYmFja1sxXSA9IDB4ODlhYmNkZWZVTDsKLQotCWlmIChhcmdjID4gNCkgewotCQlwcmludGYoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmIChhcmdjID09IDIpIHsKLQkJaWYgKHN0cmNtcChhcmd2WzFdLCAic3RhdHVzIikgPT0gMCkgewotCQkJZWNjX3ByaW50X3N0YXR1cygpOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJjYXB0dXJlY2xlYXIiKSA9PSAwKSB7Ci0JCQlkZHItPmNhcHR1cmVfYWRkcmVzcyA9IDA7Ci0JCQlkZHItPmNhcHR1cmVfZGF0YV9oaSA9IDA7Ci0JCQlkZHItPmNhcHR1cmVfZGF0YV9sbyA9IDA7Ci0JCQlkZHItPmNhcHR1cmVfZWNjID0gMDsKLQkJCWRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzID0gMDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCWlmIChhcmdjID09IDMpIHsKLQkJaWYgKHN0cmNtcChhcmd2WzFdLCAic2JlY250IikgPT0gMCkgewotCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTApOwotCQkJaWYgKHZhbCA+IDI1NSkgewotCQkJCXByaW50ZigiSW5jb3JyZWN0IENvdW50ZXIgdmFsdWUsICIKLQkJCQkgICAgICAgInNob3VsZCBiZSAwLi4yNTVcbiIpOwotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQl2YWwgPSAodmFsIDw8IEVDQ19FUlJPUl9NQU5fU0JFQ19TSElGVCk7Ci0JCQl2YWwgfD0gKGRkci0+ZXJyX3NiZSAmIEVDQ19FUlJPUl9NQU5fU0JFVCk7Ci0KLQkJCWRkci0+ZXJyX3NiZSA9IHZhbDsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAic2JldGhyIikgPT0gMCkgewotCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTApOwotCQkJaWYgKHZhbCA+IDI1NSkgewotCQkJCXByaW50ZigiSW5jb3JyZWN0IENvdW50ZXIgdmFsdWUsICIKLQkJCQkgICAgICAgInNob3VsZCBiZSAwLi4yNTVcbiIpOwotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQl2YWwgPSAodmFsIDw8IEVDQ19FUlJPUl9NQU5fU0JFVF9TSElGVCk7Ci0JCQl2YWwgfD0gKGRkci0+ZXJyX3NiZSAmIEVDQ19FUlJPUl9NQU5fU0JFQyk7Ci0KLQkJCWRkci0+ZXJyX3NiZSA9IHZhbDsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiZXJyZGlzYWJsZSIpID09IDApIHsKLQkJCXZhbCA9IGRkci0+ZXJyX2Rpc2FibGU7Ci0KLQkJCWlmIChzdHJjbXAoYXJndlsyXSwgIitzYmUiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IEVDQ19FUlJPUl9ESVNBQkxFX1NCRUQ7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiK21iZSIpID09IDApIHsKLQkJCQl2YWwgfD0gRUNDX0VSUk9SX0RJU0FCTEVfTUJFRDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICIrbXNlIikgPT0gMCkgewotCQkJCXZhbCB8PSBFQ0NfRVJST1JfRElTQUJMRV9NU0VEOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIithbGwiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IChFQ0NfRVJST1JfRElTQUJMRV9TQkVEIHwKLQkJCQkJRUNDX0VSUk9SX0RJU0FCTEVfTUJFRCB8Ci0JCQkJCUVDQ19FUlJPUl9ESVNBQkxFX01TRUQpOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1zYmUiKSA9PSAwKSB7Ci0JCQkJdmFsICY9IH5FQ0NfRVJST1JfRElTQUJMRV9TQkVEOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1tYmUiKSA9PSAwKSB7Ci0JCQkJdmFsICY9IH5FQ0NfRVJST1JfRElTQUJMRV9NQkVEOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1tc2UiKSA9PSAwKSB7Ci0JCQkJdmFsICY9IH5FQ0NfRVJST1JfRElTQUJMRV9NU0VEOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1hbGwiKSA9PSAwKSB7Ci0JCQkJdmFsICY9IH4oRUNDX0VSUk9SX0RJU0FCTEVfU0JFRCB8Ci0JCQkJCSBFQ0NfRVJST1JfRElTQUJMRV9NQkVEIHwKLQkJCQkJIEVDQ19FUlJPUl9ESVNBQkxFX01TRUQpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGYoIkluY29ycmVjdCBlcnJfZGlzYWJsZSBmaWVsZFxuIik7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0KLQkJCWRkci0+ZXJyX2Rpc2FibGUgPSB2YWw7Ci0JCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOwotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImlzeW5jIik7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImVycmRldGVjdGNsciIpID09IDApIHsKLQkJCXZhbCA9IGRkci0+ZXJyX2RldGVjdDsKLQotCQkJaWYgKHN0cmNtcChhcmd2WzJdLCAibW1lIikgPT0gMCkgewotCQkJCXZhbCB8PSBFQ0NfRVJST1JfREVURUNUX01NRTsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJzYmUiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IEVDQ19FUlJPUl9ERVRFQ1RfU0JFOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIm1iZSIpID09IDApIHsKLQkJCQl2YWwgfD0gRUNDX0VSUk9SX0RFVEVDVF9NQkU7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAibXNlIikgPT0gMCkgewotCQkJCXZhbCB8PSBFQ0NfRVJST1JfREVURUNUX01TRTsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJhbGwiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IChFQ0NfRVJST1JfREVURUNUX01NRSB8Ci0JCQkJCUVDQ19FUlJPUl9ERVRFQ1RfTUJFIHwKLQkJCQkJRUNDX0VSUk9SX0RFVEVDVF9TQkUgfAotCQkJCQlFQ0NfRVJST1JfREVURUNUX01TRSk7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50ZigiSW5jb3JyZWN0IGVycl9kZXRlY3QgZmllbGRcbiIpOwotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQlkZHItPmVycl9kZXRlY3QgPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdGRhdGFoaSIpID09IDApIHsKLQkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKLQotCQkJZGRyLT5kYXRhX2Vycl9pbmplY3RfaGkgPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdGRhdGFsbyIpID09IDApIHsKLQkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKLQotCQkJZGRyLT5kYXRhX2Vycl9pbmplY3RfbG8gPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdGVjYyIpID09IDApIHsKLQkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKLQkJCWlmICh2YWwgPiAweGZmKSB7Ci0JCQkJcHJpbnRmKCJJbmNvcnJlY3QgRUNDIGluamVjdCBtYXNrLCAiCi0JCQkJICAgICAgICJzaG91bGQgYmUgMHgwMC4uMHhmZlxuIik7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQl2YWwgfD0gKGRkci0+ZWNjX2Vycl9pbmplY3QgJiB+RUNDX0VSUl9JTkpFQ1RfRUVJTSk7Ci0KLQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdCIpID09IDApIHsKLQkJCXZhbCA9IGRkci0+ZWNjX2Vycl9pbmplY3Q7Ci0KLQkJCWlmIChzdHJjbXAoYXJndlsyXSwgImVuIikgPT0gMCkKLQkJCQl2YWwgfD0gRUNDX0VSUl9JTkpFQ1RfRUlFTjsKLQkJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiZGlzIikgPT0gMCkKLQkJCQl2YWwgJj0gfkVDQ19FUlJfSU5KRUNUX0VJRU47Ci0JCQllbHNlCi0JCQkJcHJpbnRmKCJJbmNvcnJlY3QgY29tbWFuZFxuIik7Ci0KLQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgPSB2YWw7Ci0JCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOwotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImlzeW5jIik7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIm1pcnJvciIpID09IDApIHsKLQkJCXZhbCA9IGRkci0+ZWNjX2Vycl9pbmplY3Q7Ci0KLQkJCWlmIChzdHJjbXAoYXJndlsyXSwgImVuIikgPT0gMCkKLQkJCQl2YWwgfD0gRUNDX0VSUl9JTkpFQ1RfRU1COwotCQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJkaXMiKSA9PSAwKQotCQkJCXZhbCAmPSB+RUNDX0VSUl9JTkpFQ1RfRU1COwotCQkJZWxzZQotCQkJCXByaW50ZigiSW5jb3JyZWN0IGNvbW1hbmRcbiIpOwotCi0JCQlkZHItPmVjY19lcnJfaW5qZWN0ID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JaWYgKGFyZ2MgPT0gNCkgewotCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJ0ZXN0ZHciKSA9PSAwKSB7Ci0JCQlhZGRyID0gKHU2NCAqKSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7Ci0JCQljb3VudCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKLQotCQkJaWYgKCh1MzIpIGFkZHIgJSA4KSB7Ci0JCQkJcHJpbnRmKCJBZGRyZXNzIG5vdCBhbGxpZ25lZCBvbiAiCi0JCQkJICAgICAgICJkb3VibGUgd29yZCBib3VuZGFyeVxuIik7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQlkaXNhYmxlX2ludGVycnVwdHMoKTsKLQotCQkJZm9yIChpID0gYWRkcjsgaSA8IGFkZHIgKyBjb3VudDsgaSsrKSB7Ci0KLQkJCQkvKiBlbmFibGUgaW5qZWN0cyAqLwotCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgfD0gRUNDX0VSUl9JTkpFQ1RfRUlFTjsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpc3luYyIpOwotCi0JCQkJLyogd3JpdGUgbWVtb3J5IGxvY2F0aW9uIGluamVjdGluZyBlcnJvcnMgKi8KLQkJCQlwcGNEV3N0b3JlKCh1MzIgKikgaSwgcGF0dGVybik7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKLQotCQkJCS8qIGRpc2FibGUgaW5qZWN0cyAqLwotCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgJj0gfkVDQ19FUlJfSU5KRUNUX0VJRU47Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaXN5bmMiKTsKLQotCQkJCS8qIHJlYWQgZGF0YSwgdGhpcyBnZW5lcmF0ZXMgRUNDIGVycm9yICovCi0JCQkJcHBjRFdsb2FkKCh1MzIgKikgaSwgcmV0KTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOwotCi0JCQkJLyogcmUtaW5pdGlhbGl6ZSBtZW1vcnksIGRvdWJsZSB3b3JkIHdyaXRlIHRoZSBsb2NhdGlvbiBhZ2FpbiwKLQkJCQkgKiBnZW5lcmF0ZXMgbmV3IEVDQyBjb2RlIHRoaXMgdGltZSAqLwotCQkJCXBwY0RXc3RvcmUoKHUzMiAqKSBpLCB3cml0ZWJhY2spOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7Ci0JCQl9Ci0JCQllbmFibGVfaW50ZXJydXB0cygpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKHN0cmNtcChhcmd2WzFdLCAidGVzdHdvcmQiKSA9PSAwKSB7Ci0JCQlhZGRyID0gKHU2NCAqKSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7Ci0JCQljb3VudCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKLQotCQkJaWYgKCh1MzIpIGFkZHIgJSA4KSB7Ci0JCQkJcHJpbnRmKCJBZGRyZXNzIG5vdCBhbGxpZ25lZCBvbiAiCi0JCQkJICAgICAgICJkb3VibGUgd29yZCBib3VuZGFyeVxuIik7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQlkaXNhYmxlX2ludGVycnVwdHMoKTsKLQotCQkJZm9yIChpID0gYWRkcjsgaSA8IGFkZHIgKyBjb3VudDsgaSsrKSB7Ci0KLQkJCQkvKiBlbmFibGUgaW5qZWN0cyAqLwotCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgfD0gRUNDX0VSUl9JTkpFQ1RfRUlFTjsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpc3luYyIpOwotCi0JCQkJLyogd3JpdGUgbWVtb3J5IGxvY2F0aW9uIGluamVjdGluZyBlcnJvcnMgKi8KLQkJCQkqKHUzMiAqKSBpID0gMHhmZWRjYmE5OFVMOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7Ci0KLQkJCQkvKiBzdWIgZG91YmxlIHdvcmQgd3JpdGUsCi0JCQkJICogYnVzIHdpbGwgcmVhZC1tb2RpZnktd3JpdGUsCi0JCQkJICogZ2VuZXJhdGVzIEVDQyBlcnJvciAqLwotCQkJCSooKHUzMiAqKSBpICsgMSkgPSAweDc2NTQzMjEwVUw7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKLQotCQkJCS8qIGRpc2FibGUgaW5qZWN0cyAqLwotCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgJj0gfkVDQ19FUlJfSU5KRUNUX0VJRU47Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaXN5bmMiKTsKLQotCQkJCS8qIHJlLWluaXRpYWxpemUgbWVtb3J5LAotCQkJCSAqIGRvdWJsZSB3b3JkIHdyaXRlIHRoZSBsb2NhdGlvbiBhZ2FpbiwKLQkJCQkgKiBnZW5lcmF0ZXMgbmV3IEVDQyBjb2RlIHRoaXMgdGltZSAqLwotCQkJCXBwY0RXc3RvcmUoKHUzMiAqKSBpLCB3cml0ZWJhY2spOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7Ci0JCQl9Ci0JCQllbmFibGVfaW50ZXJydXB0cygpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcHJpbnRmKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwotCXJldHVybiAxOwotfQotCi1VX0JPT1RfQ01EKGVjYywgNCwgMCwgZG9fZWNjLAotCSAgICJlY2MgICAgIC0gc3VwcG9ydCBmb3IgRERSIEVDQyBmZWF0dXJlc1xuIiwKLQkgICAic3RhdHVzICAgICAgICAgICAgICAtIHByaW50IG91dCBzdGF0dXMgaW5mb1xuIgotCSAgICJlY2MgY2FwdHVyZWNsZWFyICAgICAgICAtIGNsZWFyIGNhcHR1cmUgcmVncyBkYXRhXG4iCi0JICAgImVjYyBzYmVjbnQgPHZhbD4gICAgICAgIC0gc2V0IFNpbmdsZS1CaXQgRXJyb3IgY291bnRlclxuIgotCSAgICJlY2Mgc2JldGhyIDx2YWw+ICAgICAgICAtIHNldCBTaW5nbGUtQml0IFRocmVzaG9sZFxuIgotCSAgICJlY2MgZXJyZGlzYWJsZSA8ZmxhZz4gICAtIGNsZWFyL3NldCBkaXNhYmxlIE1lbW9yeSBFcnJvciBEaXNhYmxlLCBmbGFnOlxuIgotCSAgICIgIFstfCtdc2JlIC0gU2luZ2xlLUJpdCBFcnJvclxuIgotCSAgICIgIFstfCtdbWJlIC0gTXVsdGlwbGUtQml0IEVycm9yXG4iCi0JICAgIiAgWy18K11tc2UgLSBNZW1vcnkgU2VsZWN0IEVycm9yXG4iCi0JICAgIiAgWy18K11hbGwgLSBhbGwgZXJyb3JzXG4iCi0JICAgImVjYyBlcnJkZXRlY3RjbHIgPGZsYWc+IC0gY2xlYXIgTWVtb3J5IEVycm9yIERldGVjdCwgZmxhZzpcbiIKLQkgICAiICBtbWUgLSBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzXG4iCi0JICAgIiAgc2JlIC0gU2luZ2xlLUJpdCBFcnJvclxuIgotCSAgICIgIG1iZSAtIE11bHRpcGxlLUJpdCBFcnJvclxuIgotCSAgICIgIG1zZSAtIE1lbW9yeSBTZWxlY3QgRXJyb3JcbiIKLQkgICAiICBhbGwgLSBhbGwgZXJyb3JzXG4iCi0JICAgImVjYyBpbmplY3RkYXRhaGkgPGhpPiAgLSBzZXQgTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBIaWdoXG4iCi0JICAgImVjYyBpbmplY3RkYXRhbG8gPGxvPiAgLSBzZXQgTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBMb3dcbiIKLQkgICAiZWNjIGluamVjdGVjYyA8ZWNjPiAgICAtIHNldCBFQ0MgRXJyb3IgSW5qZWN0aW9uIE1hc2tcbiIKLQkgICAiZWNjIGluamVjdCA8ZW58ZGlzPiAgICAtIGVuYWJsZS9kaXNhYmxlIGVycm9yIGluamVjdGlvblxuIgotCSAgICJlY2MgbWlycm9yIDxlbnxkaXM+ICAgIC0gZW5hYmxlL2Rpc2FibGUgbWlycm9yIGJ5dGVcbiIKLQkgICAiZWNjIHRlc3RkdyA8YWRkcj4gPGNudD4gIC0gdGVzdCBtZW0gcmVnaW9uIHdpdGggZG91YmxlIHdvcmQgYWNjZXNzOlxuIgotCSAgICIgIC0gZW5hYmxlcyBpbmplY3RzXG4iCi0JICAgIiAgLSB3cml0ZXMgcGF0dGVybiBpbmplY3RpbmcgZXJyb3JzIHdpdGggZG91YmxlIHdvcmQgYWNjZXNzXG4iCi0JICAgIiAgLSBkaXNhYmxlcyBpbmplY3RzXG4iCi0JICAgIiAgLSByZWFkcyBwYXR0ZXJuIGJhY2sgd2l0aCBkb3VibGUgd29yZCBhY2Nlc3MsIGdlbmVyYXRlcyBlcnJvclxuIgotCSAgICIgIC0gcmUtaW5pdHMgbWVtb3J5XG4iCi0JICAgImVjYyB0ZXN0d29yZCA8YWRkcj4gPGNudD4gIC0gdGVzdCBtZW0gcmVnaW9uIHdpdGggd29yZCBhY2Nlc3M6XG4iCi0JICAgIiAgLSBlbmFibGVzIGluamVjdHNcbiIKLQkgICAiICAtIHdyaXRlcyBwYXR0ZXJuIGluamVjdGluZyBlcnJvcnMgd2l0aCB3b3JkIGFjY2Vzc1xuIgotCSAgICIgIC0gd3JpdGVzIHBhdHRlcm4gd2l0aCB3b3JkIGFjY2VzcywgZ2VuZXJhdGVzIGVycm9yXG4iCi0JICAgIiAgLSBkaXNhYmxlcyBpbmplY3RzXG4iICIgIC0gcmUtaW5pdHMgbWVtb3J5Iik7Ci0jZW5kaWYJCQkJLyogaWYgZGVmaW5lZChDT05GSUdfRERSX0VDQykgJiYgZGVmaW5lZChDT05GSUdfRERSX0VDQ19DTUQpICovCi0KICNpZiAoZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKSB8fCBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpKSBcCiAgICAgICYmIGRlZmluZWQoQ09ORklHX09GX0JPQVJEX1NFVFVQKQogCkBAIC02ODEsMTEgKzMwNCwxMSBAQAogCWludCBub2Rlb2Zmc2V0OwogCWludCB0bXBbMl07CiAKLQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmZHQsICIvbWVtb3J5Iik7CisJbm9kZW9mZnNldCA9IGZkdF9maW5kX25vZGVfYnlfcGF0aChibG9iLCAiL21lbW9yeSIpOwogCWlmIChub2Rlb2Zmc2V0ID49IDApIHsKIAkJdG1wWzBdID0gY3B1X3RvX2JlMzIoYmQtPmJpX21lbXN0YXJ0KTsKIAkJdG1wWzFdID0gY3B1X3RvX2JlMzIoYmQtPmJpX21lbXNpemUpOwotCQlmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsICJyZWciLCB0bXAsIHNpemVvZih0bXApKTsKKwkJZmR0X3NldHByb3AoYmxvYiwgbm9kZW9mZnNldCwgInJlZyIsIHRtcCwgc2l6ZW9mKHRtcCkpOwogCX0KICNlbHNlCiAJdTMyICpwOwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODM2MGVtZHMvcGNpLmMgYi9ib2FyZC9tcGM4MzYwZW1kcy9wY2kuYwppbmRleCAxNThlZmZlLi44ZjkwNDcxIDEwMDY0NAotLS0gYS9ib2FyZC9tcGM4MzYwZW1kcy9wY2kuYworKysgYi9ib2FyZC9tcGM4MzYwZW1kcy9wY2kuYwpAQCAtMjAsOCArMjAsNyBAQAogI2luY2x1ZGUgPGkyYy5oPgogI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkKICNpbmNsdWRlIDxmdF9idWlsZC5oPgotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQorI2VsaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQogI2luY2x1ZGUgPGxpYmZkdC5oPgogI2luY2x1ZGUgPGxpYmZkdF9lbnYuaD4KICNlbmRpZgpAQCAtMjA3LDcgKzIwNiw3IEBACiAKIAkvKiBTd2l0Y2ggdGVtcG9yYXJpbHkgdG8gSTJDIGJ1cyAjMiAqLwogCW9yaWdfaTJjX2J1cyA9IGkyY19nZXRfYnVzX251bSgpOwotIAlpMmNfc2V0X2J1c19udW0oMSk7CisJaTJjX3NldF9idXNfbnVtKDEpOwogCiAJdmFsOCA9IDA7CiAJaTJjX3dyaXRlKDB4MjMsIDB4NiwgMSwgJnZhbDgsIDEpOwpAQCAtMzExLDI2ICszMTAsMjUgQEAKIAlpbnQgZXJyOwogCWludCB0bXBbMl07CiAKLQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmZHQsICIvIiBPRl9TT0MgIi9wY2lAODUwMCIpOworCW5vZGVvZmZzZXQgPSBmZHRfZmluZF9ub2RlX2J5X3BhdGgoYmxvYiwgIi8iIE9GX1NPQyAiL3BjaUA4NTAwIik7CiAJaWYgKG5vZGVvZmZzZXQgPj0gMCkgewogCQl0bXBbMF0gPSBjcHVfdG9fYmUzMihob3NlWzBdLmZpcnN0X2J1c25vKTsKIAkJdG1wWzFdID0gY3B1X3RvX2JlMzIoaG9zZVswXS5sYXN0X2J1c25vKTsKLQkJZXJyID0gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCAiYnVzLXJhbmdlIiwgdG1wLCBzaXplb2YodG1wKSk7CisJCWVyciA9IGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsICJidXMtcmFuZ2UiLCB0bXAsIHNpemVvZih0bXApKTsKIAl9CiB9Ci0jZW5kaWYJCQkJLyogQ09ORklHX09GX0xJQkZEVCAqLwotI2lmZGVmIENPTkZJR19PRl9GTEFUX1RSRUUKKyNlbGlmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkKIHZvaWQKIGZ0X3BjaV9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCkKIHsKLSAgICAgICAJdTMyICpwOwotICAgICAgIAlpbnQgbGVuOworCXUzMiAqcDsKKwlpbnQgbGVuOwogCi0gICAgICAgCXAgPSAodTMyICopZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL3BjaUA4NTAwL2J1cy1yYW5nZSIsICZsZW4pOwotICAgICAgIAlpZiAocCAhPSBOVUxMKSB7CisJcCA9ICh1MzIgKilmdF9nZXRfcHJvcChibG9iLCAiLyIgT0ZfU09DICIvcGNpQDg1MDAvYnVzLXJhbmdlIiwgJmxlbik7CisJaWYgKHAgIT0gTlVMTCkgewogCQlwWzBdID0gaG9zZVswXS5maXJzdF9idXNubzsKIAkJcFsxXSA9IGhvc2VbMF0ubGFzdF9idXNubzsKLSAgICAgICAJfQorCX0KIH0KICNlbmRpZgkJCQkvKiBDT05GSUdfT0ZfRkxBVF9UUkVFICovCiAjZW5kaWYJCQkJLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODM2MGVtZHMvdS1ib290LmxkcyBiL2JvYXJkL21wYzgzNjBlbWRzL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzN2M4N2EuLjAwMDAwMDAKLS0tIGEvYm9hcmQvbXBjODM2MGVtZHMvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDA2Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODN4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19Ci1FTlRSWShfc3RhcnQpCmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4NTYwYWRzL21wYzg1NjBhZHMuYyBiL2JvYXJkL21wYzg1NjBhZHMvbXBjODU2MGFkcy5jCmluZGV4IGQxOWJhZDYuLmVlZjUyNGIgMTAwNjQ0Ci0tLSBhL2JvYXJkL21wYzg1NjBhZHMvbXBjODU2MGFkcy5jCisrKyBiL2JvYXJkL21wYzg1NjBhZHMvbXBjODU2MGFkcy5jCkBAIC01NTAsOCArNTUwLDMzIEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpICYmIGRlZmluZWQoQ09ORklHX09GX0JPQVJEX1NFVFVQKQogdm9pZAorZnRfc29jX3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKQoreworCXUzMiAqcDsKKwlpbnQgbGVuOworCisJcCA9IGZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9TT0MgIi9jcG1AZTAwMDAwMDAvYnJnLWZyZXF1ZW5jeSIsICZsZW4pOworCisJaWYgKHAgIT0gTlVMTCkKKwkJKnAgPSBjcHVfdG9fYmUzMihiZC0+YmlfYnJnZnJlcSk7CisKKwlwID0gZnRfZ2V0X3Byb3AoYmxvYiwKKwkJCSIvIiBPRl9TT0MgIi9jcG1AZTAwMDAwMDAvc2NjQDkxYTAwL2N1cnJlbnQtc3BlZWQiLAorCQkJJmxlbik7CisJaWYgKHAgIT0gTlVMTCkKKwkJKnAgPSBjcHVfdG9fYmUzMihiZC0+YmlfYmF1ZHJhdGUpOworCisJcCA9IGZ0X2dldF9wcm9wKGJsb2IsCisJCQkiLyIgT0ZfU09DICIvY3BtQGUwMDAwMDAwL3NjY0A5MWEyMC9jdXJyZW50LXNwZWVkIiwKKwkJCSZsZW4pOworCWlmIChwICE9IE5VTEwpCisJCSpwID0gY3B1X3RvX2JlMzIoYmQtPmJpX2JhdWRyYXRlKTsKK30KKwordm9pZAogZnRfYm9hcmRfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCiB7CiAJZnRfY3B1X3NldHVwKGJsb2IsIGJkKTsKKwlmdF9zb2Nfc2V0dXAoYmxvYiwgYmQpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4NTY4bWRzL2Jjc3IuYyBiL2JvYXJkL21wYzg1NjhtZHMvYmNzci5jCmluZGV4IDJlMmU4Y2QuLmFhZTBmOTggMTAwNjQ0Ci0tLSBhL2JvYXJkL21wYzg1NjhtZHMvYmNzci5jCisrKyBiL2JvYXJkL21wYzg1NjhtZHMvYmNzci5jCkBAIC00NywzICs0NywxMCBAQAogCiAJYmNzcls5XSAmPSB+KDB4MDEpOwogfQorCit2b2lkIGVuYWJsZV84NTY4bWRzX3FlX21kaW8oKQoreworCXU4ICpiY3NyID0gKHU4ICopKENGR19CQ1NSKTsKKworCWJjc3JbN10gfD0gMHgwMTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL21wYzg1NjhtZHMvYmNzci5oIGIvYm9hcmQvbXBjODU2OG1kcy9iY3NyLmgKaW5kZXggOGQ0Y2IyZi4uYWVmZDliZiAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODU2OG1kcy9iY3NyLmgKKysrIGIvYm9hcmQvbXBjODU2OG1kcy9iY3NyLmgKQEAgLTk1LDUgKzk1LDYgQEAKIHZvaWQgZW5hYmxlXzg1NjhtZHNfZHVhcnQodm9pZCk7CiB2b2lkIGVuYWJsZV84NTY4bWRzX2ZsYXNoX3dyaXRlKHZvaWQpOwogdm9pZCBkaXNhYmxlXzg1NjhtZHNfZmxhc2hfd3JpdGUodm9pZCk7Cit2b2lkIGVuYWJsZV84NTY4bWRzX3FlX21kaW8odm9pZCk7CiAKICNlbmRpZgkvKiBfX0JDU1JfSF8gKi8KZGlmZiAtLWdpdCBhL2JvYXJkL21wYzg1NjhtZHMvaW5pdC5TIGIvYm9hcmQvbXBjODU2OG1kcy9pbml0LlMKaW5kZXggMGQ4Nzk4Mi4uOTcyYTdkNCAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODU2OG1kcy9pbml0LlMKKysrIGIvYm9hcmQvbXBjODU2OG1kcy9pbml0LlMKQEAgLTE0Myw1NCArMTQzLDQyIEBACiAJLmxvbmcgVExCMV9NQVMzKEU1MDBfVExCX1JQTihDRkdfRkxBU0hfQkFTRSksIDAsMCwwLDAsMCwxLDAsMSwwLDEpCiAKIAkvKgotCSAqIFRMQmUgMjoJMjU2TQlOb24tY2FjaGVhYmxlLCBndWFyZGVkCi0JICogMHg4MDAwMDAwMAkyNTZNCVBDSTEgTUVNCisJICogVExCZSAyOgkxRwlOb24tY2FjaGVhYmxlLCBndWFyZGVkCisJICogMHg4MDAwMDAwMAk1MTJNCVBDSTEgTUVNCisJICogMHhhMDAwMDAwMCAJNTEyTQlQQ0llIE1FTQogCSAqLwogCS5sb25nIFRMQjFfTUFTMCgxLCAyLCAwKQotCS5sb25nIFRMQjFfTUFTMSgxLCAxLCAwLCAwLCBCT09LRV9QQUdFU1pfMjU2TSkKKwkubG9uZyBUTEIxX01BUzEoMSwgMSwgMCwgMCwgQk9PS0VfUEFHRVNaXzFHKQogCS5sb25nIFRMQjFfTUFTMihFNTAwX1RMQl9FUE4oQ0ZHX1BDSTFfTUVNX0JBU0UpLCAwLDAsMCwwLDEsMCwxLDApCiAJLmxvbmcgVExCMV9NQVMzKEU1MDBfVExCX1JQTihDRkdfUENJMV9NRU1fQkFTRSksIDAsMCwwLDAsMCwxLDAsMSwwLDEpCiAKIAkvKgotCSAqIFRMQmUgMzoJMjU2TQlOb24tY2FjaGVhYmxlLCBndWFyZGVkCi0JICogMHhhMDAwMDAwMAkyNTZNCVBDSWUgTWVtCi0JICovCi0JLmxvbmcgVExCMV9NQVMwKDEsIDMsIDApCi0JLmxvbmcgVExCMV9NQVMxKDEsIDEsIDAsIDAsIEJPT0tFX1BBR0VTWl8yNTZNKQotCS5sb25nIFRMQjFfTUFTMihFNTAwX1RMQl9FUE4oQ0ZHX1BFWF9NRU1fQkFTRSksIDAsMCwwLDAsMSwwLDEsMCkKLQkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19QRVhfTUVNX0JBU0UpLCAwLDAsMCwwLDAsMSwwLDEsMCwxKQotCi0JLyoKLQkgKiBUTEJlIDQ6CVJlc2VydmVkIGZvciBmdXR1cmUgdXNhZ2UKLQkgKi8KLQotCS8qCi0JICogVExCZSA1Ogk2NE0JTm9uLWNhY2hlYWJsZSwgZ3VhcmRlZAorCSAqIFRMQmUgMzoJNjRNCU5vbi1jYWNoZWFibGUsIGd1YXJkZWQKIAkgKiAweGUwMDBfMDAwMAkxTQlDQ1NSQkFSCiAJICogMHhlMjAwXzAwMDAJOE0JUENJMSBJTwogCSAqIDB4ZTI4MF8wMDAwCThNCVBDSWUgSU8KIAkgKi8KLQkubG9uZyBUTEIxX01BUzAoMSwgNSwgMCkKKwkubG9uZyBUTEIxX01BUzAoMSwgMywgMCkKIAkubG9uZyBUTEIxX01BUzEoMSwgMSwgMCwgMCwgQk9PS0VfUEFHRVNaXzY0TSkKIAkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19DQ1NSQkFSKSwgMCwwLDAsMCwxLDAsMSwwKQogCS5sb25nIFRMQjFfTUFTMyhFNTAwX1RMQl9SUE4oQ0ZHX0NDU1JCQVIpLCAwLDAsMCwwLDAsMSwwLDEsMCwxKQogCiAJLyoKLQkgKiBUTEJlIDY6CTY0TQlDYWNoZWFibGUsIG5vbi1ndWFyZGVkCisJICogVExCZSA0Ogk2NE0JQ2FjaGVhYmxlLCBub24tZ3VhcmRlZAogCSAqIDB4ZjAwMF8wMDAwCTY0TQlMQkMgU0RSQU0KIAkgKi8KLQkubG9uZyBUTEIxX01BUzAoMSwgNiwgMCkKKwkubG9uZyBUTEIxX01BUzAoMSwgNCwgMCkKIAkubG9uZyBUTEIxX01BUzEoMSwgMSwgMCwgMCwgQk9PS0VfUEFHRVNaXzY0TSkKIAkubG9uZyBUTEIxX01BUzIoRTUwMF9UTEJfRVBOKENGR19MQkNfU0RSQU1fQkFTRSksIDAsMCwwLDAsMCwwLDAsMCkKIAkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19MQkNfU0RSQU1fQkFTRSksIDAsMCwwLDAsMCwxLDAsMSwwLDEpCiAKIAkvKgotCSAqIFRMQmUgNzoJMjU2SwlOb24tY2FjaGVhYmxlLCBndWFyZGVkCisJICogVExCZSA1OgkyNTZLCU5vbi1jYWNoZWFibGUsIGd1YXJkZWQKIAkgKiAweGY4MDAwMDAwCTMySyBCQ1NSCiAJICogMHhmODAwODAwMAkzMksgUElCIChDUzQpCiAJICogMHhmODAxMDAwMAkzMksgUElCIChDUzUpCiAJICovCi0JLmxvbmcgVExCMV9NQVMwKDEsIDcsIDApCisJLmxvbmcgVExCMV9NQVMwKDEsIDUsIDApCiAJLmxvbmcgVExCMV9NQVMxKDEsIDEsIDAsIDAsIEJPT0tFX1BBR0VTWl8yNTZLKQogCS5sb25nIFRMQjFfTUFTMihFNTAwX1RMQl9FUE4oQ0ZHX0JDU1JfQkFTRSksIDAsMCwwLDAsMSwwLDEsMCkKIAkubG9uZyBUTEIxX01BUzMoRTUwMF9UTEJfUlBOKENGR19CQ1NSX0JBU0UpLCAwLDAsMCwwLDAsMSwwLDEsMCwxKQpAQCAtMjAyLDEyICsxOTAsMTIgQEAKICAqIExBVyhMb2NhbCBBY2Nlc3MgV2luZG93KSBjb25maWd1cmF0aW9uOgogICoKICAqMCkgICAweDAwMDBfMDAwMCAgIDB4N2ZmZl9mZmZmICAgICBERFIgICAgICAgICAgICAgICAgICAgICAyRwotICoxKSAgIDB4ODAwMF8wMDAwICAgMHg5ZmZmX2ZmZmYgICAgIFBDSTEgTUVNICAgICAgICAgICAgICAgIDI1Nk1CCi0gKjIpICAgMHhhMDAwXzAwMDAgICAweGJmZmZfZmZmZiAgICAgUENJZSBNRU0gICAgICAgICAgICAgICAgMjU2TUIKLSAqNSkgICAweGMwMDBfMDAwMCAgIDB4ZGZmZl9mZmZmICAgICBTUklPICAgICAgICAgICAgICAgICAgICAyNTZNQgorICoxKSAgIDB4ODAwMF8wMDAwICAgMHg5ZmZmX2ZmZmYgICAgIFBDSTEgTUVNICAgICAgICAgICAgICAgIDUxMk1CCisgKjIpICAgMHhhMDAwXzAwMDAgICAweGJmZmZfZmZmZiAgICAgUENJZSBNRU0gICAgICAgICAgICAgICAgNTEyTUIKICAqLSkgICAweGUwMDBfMDAwMCAgIDB4ZTAwZl9mZmZmICAgICBDQ1NSICAgICAgICAgICAgICAgICAgICAxTQogICozKSAgIDB4ZTIwMF8wMDAwICAgMHhlMjdmX2ZmZmYgICAgIFBDSTEgSS9PICAgICAgICAgICAgICAgIDhNCi0gKjQpICAgMHhlMjgwXzAwMDAgICAweGUyZmZfZmZmZiAgICAgUENJZSBJLzAgICAgICAgICAgICAgICAgOE0KKyAqNCkgICAweGUyODBfMDAwMCAgIDB4ZTJmZl9mZmZmICAgICBQQ0llIEkvTyAgICAgICAgICAgICAgICA4TQorICo1KSAgIDB4YzAwMF8wMDAwICAgMHhkZmZmX2ZmZmYgICAgIFNSSU8gICAgICAgICAgICAgICAgICAgIDUxMk1CCiAgKjYuYSkgMHhmMDAwXzAwMDAgICAweGYzZmZfZmZmZiAgICAgU0RSQU0gICAgICAgICAgICAgICAgICAgNjRNQgogICo2LmIpIDB4ZjgwMF8wMDAwICAgMHhmODAwXzdmZmYgICAgIEJDU1IgICAgICAgICAgICAgICAgICAgIDMyS0IKICAqNi5jKSAweGY4MDBfODAwMCAgIDB4ZjgwMF9mZmZmICAgICBQSUIgKENTNCkJCSAgICAgMzJLQgpAQCAtMjI2LDIwICsyMTQsMjAgQEAKICNkZWZpbmUgTEFXQVIwICAoKExBV0FSX1RSR1RfSUZfRERSIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzEyOE0pKSAmIH5MQVdBUl9FTikKIAogI2RlZmluZSBMQVdCQVIxICgoQ0ZHX1BDSTFfTUVNX0JBU0U+PjEyKSAmIDB4ZmZmZmYpCi0jZGVmaW5lIExBV0FSMQkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX1BDSTEgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMjU2TSkpCisjZGVmaW5lIExBV0FSMQkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX1BDSTEgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfNTEyTSkpCiAKICNkZWZpbmUgTEFXQkFSMiAoKENGR19QRVhfTUVNX0JBU0U+PjEyKSAmIDB4ZmZmZmYpCi0jZGVmaW5lIExBV0FSMgkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX1BFWCB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8yNTZNKSkKKyNkZWZpbmUgTEFXQVIyCShMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfUEVYIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzUxMk0pKQogCiAjZGVmaW5lIExBV0JBUjMgKChDRkdfUENJMV9JT19QSFlTPj4xMikgJiAweGZmZmZmKQogI2RlZmluZSBMQVdBUjMJKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9QQ0kxIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzhNKSkKIAogI2RlZmluZSBMQVdCQVI0ICgoQ0ZHX1BFWF9JT19QSFlTPj4xMikgJiAweGZmZmZmKQotI2RlZmluZSBMQVdBUjQgIChMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfUEVYIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzE2TSkpCisjZGVmaW5lIExBV0FSNCAgKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9QRVggfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfOE0pKQogCiAKICNkZWZpbmUgTEFXQkFSNSAoKENGR19TUklPX01FTV9CQVNFPj4xMikgJiAweGZmZmZmKQotI2RlZmluZSBMQVdBUjUJKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9SSU8gfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMjU2TSkpCisjZGVmaW5lIExBV0FSNQkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX1JJTyB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV81MTJNKSkKIAogLyogTEJDIHdpbmRvdyAtIG1hcHMgMjU2TS4gIFRoYXQncyBTRFJBTSwgQkNTUiwgUElCcywgYW5kIEZsYXNoICovCiAjZGVmaW5lIExBV0JBUjYgKChDRkdfTEJDX1NEUkFNX0JBU0U+PjEyKSAmIDB4ZmZmZmYpCmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4NTY4bWRzL21wYzg1NjhtZHMuYyBiL2JvYXJkL21wYzg1NjhtZHMvbXBjODU2OG1kcy5jCmluZGV4IDljNzk2MGQuLjgxOGZmMTMgMTAwNjQ0Ci0tLSBhL2JvYXJkL21wYzg1NjhtZHMvbXBjODU2OG1kcy5jCisrKyBiL2JvYXJkL21wYzg1NjhtZHMvbXBjODU2OG1kcy5jCkBAIC0yNyw5ICsyNyw2NiBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vaW1tYXBfODV4eC5oPgogI2luY2x1ZGUgPHNwZC5oPgorI2luY2x1ZGUgPGkyYy5oPgorI2luY2x1ZGUgPGlvcG9ydHMuaD4KIAogI2luY2x1ZGUgImJjc3IuaCIKIAorY29uc3QgcWVfaW9wX2NvbmZfdCBxZV9pb3BfY29uZl90YWJbXSA9IHsKKwkvKiBHRVRIMSAqLworCXs0LCAxMCwgMSwgMCwgMn0sIC8qIFR4RDAgKi8KKwl7NCwgIDksIDEsIDAsIDJ9LCAvKiBUeEQxICovCisJezQsICA4LCAxLCAwLCAyfSwgLyogVHhEMiAqLworCXs0LCAgNywgMSwgMCwgMn0sIC8qIFR4RDMgKi8KKwl7NCwgMjMsIDEsIDAsIDJ9LCAvKiBUeEQ0ICovCisJezQsIDIyLCAxLCAwLCAyfSwgLyogVHhENSAqLworCXs0LCAyMSwgMSwgMCwgMn0sIC8qIFR4RDYgKi8KKwl7NCwgMjAsIDEsIDAsIDJ9LCAvKiBUeEQ3ICovCisJezQsIDE1LCAyLCAwLCAyfSwgLyogUnhEMCAqLworCXs0LCAxNCwgMiwgMCwgMn0sIC8qIFJ4RDEgKi8KKwl7NCwgMTMsIDIsIDAsIDJ9LCAvKiBSeEQyICovCisJezQsIDEyLCAyLCAwLCAyfSwgLyogUnhEMyAqLworCXs0LCAyOSwgMiwgMCwgMn0sIC8qIFJ4RDQgKi8KKwl7NCwgMjgsIDIsIDAsIDJ9LCAvKiBSeEQ1ICovCisJezQsIDI3LCAyLCAwLCAyfSwgLyogUnhENiAqLworCXs0LCAyNiwgMiwgMCwgMn0sIC8qIFJ4RDcgKi8KKwl7NCwgMTEsIDEsIDAsIDJ9LCAvKiBUWF9FTiAqLworCXs0LCAyNCwgMSwgMCwgMn0sIC8qIFRYX0VSICovCisJezQsIDE2LCAyLCAwLCAyfSwgLyogUlhfRFYgKi8KKwl7NCwgMzAsIDIsIDAsIDJ9LCAvKiBSWF9FUiAqLworCXs0LCAxNywgMiwgMCwgMn0sIC8qIFJYX0NMSyAqLworCXs0LCAxOSwgMSwgMCwgMn0sIC8qIEdUWF9DTEsgKi8KKwl7MSwgMzEsIDIsIDAsIDN9LCAvKiBHVFgxMjUgKi8KKworCS8qIEdFVEgyICovCisJezUsIDEwLCAxLCAwLCAyfSwgLyogVHhEMCAqLworCXs1LCAgOSwgMSwgMCwgMn0sIC8qIFR4RDEgKi8KKwl7NSwgIDgsIDEsIDAsIDJ9LCAvKiBUeEQyICovCisJezUsICA3LCAxLCAwLCAyfSwgLyogVHhEMyAqLworCXs1LCAyMywgMSwgMCwgMn0sIC8qIFR4RDQgKi8KKwl7NSwgMjIsIDEsIDAsIDJ9LCAvKiBUeEQ1ICovCisJezUsIDIxLCAxLCAwLCAyfSwgLyogVHhENiAqLworCXs1LCAyMCwgMSwgMCwgMn0sIC8qIFR4RDcgKi8KKwl7NSwgMTUsIDIsIDAsIDJ9LCAvKiBSeEQwICovCisJezUsIDE0LCAyLCAwLCAyfSwgLyogUnhEMSAqLworCXs1LCAxMywgMiwgMCwgMn0sIC8qIFJ4RDIgKi8KKwl7NSwgMTIsIDIsIDAsIDJ9LCAvKiBSeEQzICovCisJezUsIDI5LCAyLCAwLCAyfSwgLyogUnhENCAqLworCXs1LCAyOCwgMiwgMCwgMn0sIC8qIFJ4RDUgKi8KKwl7NSwgMjcsIDIsIDAsIDN9LCAvKiBSeEQ2ICovCisJezUsIDI2LCAyLCAwLCAyfSwgLyogUnhENyAqLworCXs1LCAxMSwgMSwgMCwgMn0sIC8qIFRYX0VOICovCisJezUsIDI0LCAxLCAwLCAyfSwgLyogVFhfRVIgKi8KKwl7NSwgMTYsIDIsIDAsIDJ9LCAvKiBSWF9EViAqLworCXs1LCAzMCwgMiwgMCwgMn0sIC8qIFJYX0VSICovCisJezUsIDE3LCAyLCAwLCAyfSwgLyogUlhfQ0xLICovCisJezUsIDE5LCAxLCAwLCAyfSwgLyogR1RYX0NMSyAqLworCXsxLCAzMSwgMiwgMCwgM30sIC8qIEdUWDEyNSAqLworCXs0LCAgNiwgMywgMCwgMn0sIC8qIE1ESU8gKi8KKwl7NCwgIDUsIDEsIDAsIDJ9LCAvKiBNREMgKi8KKwl7MCwgIDAsIDAsIDAsIFFFX0lPUF9UQUJfRU5EfSwgLyogRU5EIG9mIHRhYmxlICovCit9OworCiAKICNpZiBkZWZpbmVkKENPTkZJR19ERFJfRUNDKSAmJiAhZGVmaW5lZChDT05GSUdfRUNDX0lOSVRfVklBX0REUkNPTlRST0xMRVIpCiBleHRlcm4gdm9pZCBkZHJfZW5hYmxlX2VjYyh1bnNpZ25lZCBpbnQgZHJhbV9zaXplKTsKQEAgLTQ5LDYgKzEwNiwxOCBAQAogCiAJZW5hYmxlXzg1NjhtZHNfZHVhcnQoKTsKIAllbmFibGVfODU2OG1kc19mbGFzaF93cml0ZSgpOworI2lmIGRlZmluZWQoQ09ORklHX1FFKSAmJiAhZGVmaW5lZChDT05GSUdfZVRTRUNfTURJT19CVVMpCisJZW5hYmxlXzg1NjhtZHNfcWVfbWRpbygpOworI2VuZGlmCisKKyNpZmRlZiBDRkdfSTJDMl9PRkZTRVQKKwkvKiBFbmFibGUgSTJDMl9TQ0wgYW5kIEkyQzJfU0RBICovCisJdm9sYXRpbGUgc3RydWN0IHBhcl9pbyAqcG9ydF9jOworCXBvcnRfYyA9IChzdHJ1Y3QgcGFyX2lvKikoQ0ZHX0lNTVIgKyAweGUwMTQwKTsKKwlwb3J0X2MtPmNwZGlyMiB8PSAweDBmMDAwMDAwOworCXBvcnRfYy0+Y3BwYXIyICY9IH4weDBmMDAwMDAwOworCXBvcnRfYy0+Y3BwYXIyIHw9IDB4MGEwMDAwMDA7CisjZW5kaWYKIAogCXJldHVybiAwOwogfQpAQCAtMjY5LDIwICszMzgsNjIgQEAKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIGhvc2VbXSA9IHsKKwl7CiAjaWZuZGVmIENPTkZJR19QQ0lfUE5QCi0JeyBjb25maWdfdGFibGU6IHBjaV9tcGM4NTY4bWRzX2NvbmZpZ190YWJsZSx9LAorCWNvbmZpZ190YWJsZTogcGNpX21wYzg1NjhtZHNfY29uZmlnX3RhYmxlLAogI2VuZGlmCi0jaWZkZWYgQ09ORklHX01QQzg1WFhfUENJMgotCXt9LAotI2VuZGlmCisJfQogfTsKIAogI2VuZGlmCS8qIENPTkZJR19QQ0kgKi8KIAorLyoKKyAqIHBpYl9pbml0KCkgLS0gSW5pdGlhbGl6ZSB0aGUgUENBOTU1NSBJTyBleHBhbmRlciBvbiB0aGUgUElCIGJvYXJkCisgKi8KK3ZvaWQKK3BpYl9pbml0KHZvaWQpCit7CisJdTggdmFsOCwgb3JpZ19pMmNfYnVzOworCS8qCisJICogQXNzaWduIFBJQiBQTUMyLzMgdG8gUENJIGJ1cworCSAqLworCisJLypzd2l0Y2ggdGVtcG9yYXJpbHkgdG8gSTJDIGJ1cyAjMiAqLworCW9yaWdfaTJjX2J1cyA9IGkyY19nZXRfYnVzX251bSgpOworCWkyY19zZXRfYnVzX251bSgxKTsKKworCXZhbDggPSAweDAwOworCWkyY193cml0ZSgweDIzLCAweDYsIDEsICZ2YWw4LCAxKTsKKwlpMmNfd3JpdGUoMHgyMywgMHg3LCAxLCAmdmFsOCwgMSk7CisJdmFsOCA9IDB4ZmY7CisJaTJjX3dyaXRlKDB4MjMsIDB4MiwgMSwgJnZhbDgsIDEpOworCWkyY193cml0ZSgweDIzLCAweDMsIDEsICZ2YWw4LCAxKTsKKworCXZhbDggPSAweDAwOworCWkyY193cml0ZSgweDI2LCAweDYsIDEsICZ2YWw4LCAxKTsKKwl2YWw4ID0gMHgzNDsKKwlpMmNfd3JpdGUoMHgyNiwgMHg3LCAxLCAmdmFsOCwgMSk7CisJdmFsOCA9IDB4Zjk7CisJaTJjX3dyaXRlKDB4MjYsIDB4MiwgMSwgJnZhbDgsIDEpOworCXZhbDggPSAweGZmOworCWkyY193cml0ZSgweDI2LCAweDMsIDEsICZ2YWw4LCAxKTsKKworCXZhbDggPSAweDAwOworCWkyY193cml0ZSgweDI3LCAweDYsIDEsICZ2YWw4LCAxKTsKKwlpMmNfd3JpdGUoMHgyNywgMHg3LCAxLCAmdmFsOCwgMSk7CisJdmFsOCA9IDB4ZmY7CisJaTJjX3dyaXRlKDB4MjcsIDB4MiwgMSwgJnZhbDgsIDEpOworCXZhbDggPSAweGVmOworCWkyY193cml0ZSgweDI3LCAweDMsIDEsICZ2YWw4LCAxKTsKKworCWFzbSgiZWllaW8iKTsKK30KKwogdm9pZAogcGNpX2luaXRfYm9hcmQodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfUENJCi0JcGNpX21wYzg1eHhfaW5pdCgmaG9zZSk7CisJcGliX2luaXQoKTsKKwlwY2lfbXBjODV4eF9pbml0KGhvc2UpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4NjQxaHBjbi9tcGM4NjQxaHBjbi5jIGIvYm9hcmQvbXBjODY0MWhwY24vbXBjODY0MWhwY24uYwppbmRleCA3ZDdlMmFmLi4xYmZiZTg4IDEwMDY0NAotLS0gYS9ib2FyZC9tcGM4NjQxaHBjbi9tcGM4NjQxaHBjbi5jCisrKyBiL2JvYXJkL21wYzg2NDFocGNuL21wYzg2NDFocGNuLmMKQEAgLTExLDcgKzExLDcgQEAKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8cGNpLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF84Nnh4Lmg+CisjaW5jbHVkZSA8YXNtL2ltbWFwX2ZzbF9wY2kuaD4KICNpbmNsdWRlIDxzcGQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIApAQCAtNTUsMzYgKzU2LDYgQEAKIHsKIAlwdXRzKCJCb2FyZDogTVBDODY0MUhQQ05cbiIpOwogCi0jaWZkZWYgQ09ORklHX1BDSQotCi0Jdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfQ0NTUkJBUjsKLQl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAmaW1tYXAtPmltX2d1cjsKLQl2b2xhdGlsZSBjY3NyX3BleF90ICpwZXgxID0gJmltbWFwLT5pbV9wZXgxOwotCi0JdWludCBkZXZkaXNyID0gZ3VyLT5kZXZkaXNyOwotCXVpbnQgaW9fc2VsID0gKGd1ci0+cG9yZGV2c3IgJiBNUEM4Nnh4X1BPUkRFVlNSX0lPX1NFTCkgPj4gMTY7Ci0JdWludCBob3N0MV9hZ2VudCA9IChndXItPnBvcmJtc3IgJiBNUEM4Nnh4X1BPUkJNU1JfSEEpID4+IDE3OwotCXVpbnQgcGV4MV9hZ2VudCA9IChob3N0MV9hZ2VudCA9PSAwKSB8fCAoaG9zdDFfYWdlbnQgPT0gMSk7Ci0KLQlpZiAoKGlvX3NlbCA9PSAyIHx8IGlvX3NlbCA9PSAzIHx8IGlvX3NlbCA9PSA1Ci0JICAgICB8fCBpb19zZWwgPT0gNiB8fCBpb19zZWwgPT0gNyB8fCBpb19zZWwgPT0gMHhGKQotCSAgICAmJiAhKGRldmRpc3IgJiBNUEM4Nnh4X0RFVkRJU1JfUENJRVgxKSkgewotCQlkZWJ1ZygiUENJLUVYUFJFU1MgMTogJXMgXG4iLCBwZXgxX2FnZW50ID8gIkFnZW50IiA6ICJIb3N0Iik7Ci0JCWRlYnVnKCIweCUwOHg9MHglMDh4ICIsICZwZXgxLT5wbWVfbXNnX2RldCwgcGV4MS0+cG1lX21zZ19kZXQpOwotCQlpZiAocGV4MS0+cG1lX21zZ19kZXQpIHsKLQkJCXBleDEtPnBtZV9tc2dfZGV0ID0gMHhmZmZmZmZmZjsKLQkJCWRlYnVnKCIgd2l0aCBlcnJvcnMuICBDbGVhcmluZy4gIE5vdyAweCUwOHgiLAotCQkJICAgICAgcGV4MS0+cG1lX21zZ19kZXQpOwotCQl9Ci0JCWRlYnVnKCJcbiIpOwotCX0gZWxzZSB7Ci0JCXB1dHMoIlBDSS1FWFBSRVNTIDE6IERpc2FibGVkXG4iKTsKLQl9Ci0KLSNlbHNlCi0JcHV0cygiUENJLUVYUFJFU1MxOiBEaXNhYmxlZFxuIik7Ci0jZW5kaWYKLQogCXJldHVybiAwOwogfQogCkBAIC0yMTksMjEgKzE5MCwxMzggQEAKICNlbmRpZgogCiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgaG9zZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgcGNpMV9ob3NlID0gewogI2lmbmRlZiBDT05GSUdfUENJX1BOUAotICAgICAgY29uZmlnX3RhYmxlOnBjaV9tcGM4Nnh4Y3RzX2NvbmZpZ190YWJsZSwKKwljb25maWdfdGFibGU6cGNpX21wYzg2eHhjdHNfY29uZmlnX3RhYmxlCiAjZW5kaWYKIH07Ci0KICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKKyNpZmRlZiBDT05GSUdfUENJMgorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwY2kyX2hvc2U7CisjZW5kaWYJLyogQ09ORklHX1BDSTIgKi8KKworaW50IGZpcnN0X2ZyZWVfYnVzbm8gPSAwOworCisKIHZvaWQgcGNpX2luaXRfYm9hcmQodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfUENJCi0JZXh0ZXJuIHZvaWQgcGNpX21wYzg2eHhfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ0ZHX0NDU1JCQVI7CisJdm9sYXRpbGUgY2Nzcl9ndXJfdCAqZ3VyID0gJmltbWFwLT5pbV9ndXI7CisJdWludCBkZXZkaXNyID0gZ3VyLT5kZXZkaXNyOworCXVpbnQgaW9fc2VsID0gKGd1ci0+cG9yZGV2c3IgJiBNUEM4Nnh4X1BPUkRFVlNSX0lPX1NFTCkgPj4gMTY7CiAKLQlwY2lfbXBjODZ4eF9pbml0KCZob3NlKTsKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCisjaWZkZWYgQ09ORklHX1BDSTEKK3sKKwl2b2xhdGlsZSBjY3NyX2ZzbF9wY2lfdCAqcGNpID0gKGNjc3JfZnNsX3BjaV90ICopIENGR19QQ0kxX0FERFI7CisJZXh0ZXJuIHZvaWQgZnNsX3BjaV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gJnBjaTFfaG9zZTsKKyNpZmRlZiBERUJVRworCXVpbnQgaG9zdDFfYWdlbnQgPSAoZ3VyLT5wb3JibXNyICYgTVBDODZ4eF9QT1JCTVNSX0hBKSA+PiAxNzsKKwl1aW50IHBleDFfYWdlbnQgPSAoaG9zdDFfYWdlbnQgPT0gMCkgfHwgKGhvc3QxX2FnZW50ID09IDEpOworI2VuZGlmCisJaWYgKChpb19zZWwgPT0gMiB8fCBpb19zZWwgPT0gMyB8fCBpb19zZWwgPT0gNQorCSAgICAgfHwgaW9fc2VsID09IDYgfHwgaW9fc2VsID09IDcgfHwgaW9fc2VsID09IDB4RikKKwkgICAgJiYgIShkZXZkaXNyICYgTVBDODZ4eF9ERVZESVNSX1BDSUVYMSkpIHsKKwkJZGVidWcoIlBDSS1FWFBSRVNTIDE6ICVzIFxuIiwgcGV4MV9hZ2VudCA/ICJBZ2VudCIgOiAiSG9zdCIpOworCQlkZWJ1ZygiMHglMDh4PTB4JTA4eCAiLCAmcGNpLT5wbWVfbXNnX2RldCwgcGNpLT5wbWVfbXNnX2RldCk7CisJCWlmIChwY2ktPnBtZV9tc2dfZGV0KSB7CisJCQlwY2ktPnBtZV9tc2dfZGV0ID0gMHhmZmZmZmZmZjsKKwkJCWRlYnVnKCIgd2l0aCBlcnJvcnMuICBDbGVhcmluZy4gIE5vdyAweCUwOHgiLAorCQkJICAgICAgcGNpLT5wbWVfbXNnX2RldCk7CisJCX0KKwkJZGVidWcoIlxuIik7CisKKwkJLyogaW5ib3VuZCAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9CVVMsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfUEhZUywKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOworCisJCS8qIG91dGJvdW5kIG1lbW9yeSAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKKwkJCSAgICAgICBDRkdfUENJMV9NRU1fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJMV9NRU1fUEhZUywKKwkJCSAgICAgICBDRkdfUENJMV9NRU1fU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisKKwkJLyogb3V0Ym91bmQgaW8gKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsCisJCQkgICAgICAgQ0ZHX1BDSTFfSU9fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJMV9JT19QSFlTLAorCQkJICAgICAgIENGR19QQ0kxX0lPX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwkJaG9zZS0+cmVnaW9uX2NvdW50ID0gMzsKKworCQlob3NlLT5maXJzdF9idXNubz1maXJzdF9mcmVlX2J1c25vOworCQlwY2lfc2V0dXBfaW5kaXJlY3QoaG9zZSwgKGludCkgJnBjaS0+Y2ZnX2FkZHIsIChpbnQpICZwY2ktPmNmZ19kYXRhKTsKKworCQlmc2xfcGNpX2luaXQoaG9zZSk7CisKKwkJZmlyc3RfZnJlZV9idXNubz1ob3NlLT5sYXN0X2J1c25vKzE7CisJCXByaW50ZiAoIiAgICBQQ0ktRVhQUkVTUyAxIG9uIGJ1cyAlMDJ4IC0gJTAyeFxuIiwKKwkJCWhvc2UtPmZpcnN0X2J1c25vLGhvc2UtPmxhc3RfYnVzbm8pOworCisJCS8qCisJCSAqIEFjdGl2YXRlIFVMSTE1NzUgbGVnYWN5IGNoaXAgYnkgcGVyZm9ybWluZyBhIGZha2UKKwkJICogbWVtb3J5IGFjY2Vzcy4gIE5lZWRlZCB0byBtYWtlIFVMSSBSVEMgd29yay4KKwkJICovCisJCWluX2JlMzIoKHVuc2lnbmVkICopICgoY2hhciAqKShDRkdfUENJMV9NRU1fQkFTRQorCQkJCSAgICAgICArIENGR19QQ0kxX01FTV9TSVpFIC0gMHgxMDAwMDAwKSkpOworCisJfSBlbHNlIHsKKwkJcHV0cygiUENJLUVYUFJFU1MgMTogRGlzYWJsZWRcbiIpOworCX0KK30KKyNlbHNlCisJcHV0cygiUENJLUVYUFJFU1MxOiBEaXNhYmxlZFxuIik7CisjZW5kaWYgLyogQ09ORklHX1BDSTEgKi8KKworI2lmZGVmIENPTkZJR19QQ0kyCit7CisJdm9sYXRpbGUgY2Nzcl9mc2xfcGNpX3QgKnBjaSA9IChjY3NyX2ZzbF9wY2lfdCAqKSBDRkdfUENJMl9BRERSOworCWV4dGVybiB2b2lkIGZzbF9wY2lfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9ICZwY2kyX2hvc2U7CisKKworCS8qIGluYm91bmQgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJICAgICAgIENGR19QQ0lfTUVNT1JZX0JVUywKKwkJICAgICAgIENGR19QQ0lfTUVNT1JZX1BIWVMsCisJCSAgICAgICBDRkdfUENJX01FTU9SWV9TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX01FTU9SWSk7CisKKwkvKiBvdXRib3VuZCBtZW1vcnkgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKKwkJICAgICAgIENGR19QQ0kyX01FTV9CQVNFLAorCQkgICAgICAgQ0ZHX1BDSTJfTUVNX1BIWVMsCisJCSAgICAgICBDRkdfUENJMl9NRU1fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCS8qIG91dGJvdW5kIGlvICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsCisJCSAgICAgICBDRkdfUENJMl9JT19CQVNFLAorCQkgICAgICAgQ0ZHX1BDSTJfSU9fUEhZUywKKwkJICAgICAgIENGR19QQ0kyX0lPX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKKworCWhvc2UtPnJlZ2lvbl9jb3VudCA9IDM7CisKKwlob3NlLT5maXJzdF9idXNubz1maXJzdF9mcmVlX2J1c25vOworCXBjaV9zZXR1cF9pbmRpcmVjdChob3NlLCAoaW50KSAmcGNpLT5jZmdfYWRkciwgKGludCkgJnBjaS0+Y2ZnX2RhdGEpOworCisJZnNsX3BjaV9pbml0KGhvc2UpOworCisJZmlyc3RfZnJlZV9idXNubz1ob3NlLT5sYXN0X2J1c25vKzE7CisJcHJpbnRmICgiICAgIFBDSS1FWFBSRVNTIDIgb24gYnVzICUwMnggLSAlMDJ4XG4iLAorCQlob3NlLT5maXJzdF9idXNubyxob3NlLT5sYXN0X2J1c25vKTsKK30KKyNlbHNlCisJcHV0cygiUENJLUVYUFJFU1MgMjogRGlzYWJsZWRcbiIpOworI2VuZGlmIC8qIENPTkZJR19QQ0kyICovCisKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkgJiYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApCmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4NjQxaHBjbi9zeXNfZWVwcm9tLmMgYi9ib2FyZC9tcGM4NjQxaHBjbi9zeXNfZWVwcm9tLmMKaW5kZXggNzRlMmEzZC4uN2JjNjYzYiAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODY0MWhwY24vc3lzX2VlcHJvbS5jCisrKyBiL2JvYXJkL21wYzg2NDFocGNuL3N5c19lZXByb20uYwpAQCAtNjgsNyArNjgsNyBAQAogCSAgICAgICBtYWNfZGF0YS5kYXRlWzVdLAogCSAgICAgICBtYWNfZGF0YS5kYXRlWzZdKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXNwcmludGYoZXRoYWRkcltpXSwKKwkJc3ByaW50ZigoY2hhciAqKWV0aGFkZHJbaV0sCiAJCQkiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAogCQkJbWFjX2RhdGEubWFjW2ldWzBdLAogCQkJbWFjX2RhdGEubWFjW2ldWzFdLApAQCAtNzksMTAgKzc5LDEwIEBACiAJCXByaW50ZigiTUFDICVkICVzXG4iLCBpLCBldGhhZGRyW2ldKTsKIAl9CiAKLQlzZXRlbnYoImV0aGFkZHIiLCBldGhhZGRyWzBdKTsKLQlzZXRlbnYoImV0aDFhZGRyIiwgZXRoYWRkclsxXSk7Ci0Jc2V0ZW52KCJldGgyYWRkciIsIGV0aGFkZHJbMl0pOwotCXNldGVudigiZXRoM2FkZHIiLCBldGhhZGRyWzNdKTsKKwlzZXRlbnYoImV0aGFkZHIiLCAgKGNoYXIgKilldGhhZGRyWzBdKTsKKwlzZXRlbnYoImV0aDFhZGRyIiwgKGNoYXIgKilldGhhZGRyWzFdKTsKKwlzZXRlbnYoImV0aDJhZGRyIiwgKGNoYXIgKilldGhhZGRyWzJdKTsKKwlzZXRlbnYoImV0aDNhZGRyIiwgKGNoYXIgKilldGhhZGRyWzNdKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjM2LDcgKzIzNiw3IEBACiAJfSBlbHNlIHsKIAkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQkJaWYgKG1lbWNtcCgmbWFjX2RhdGEubWFjW2ldLCAiXDBcMFwwXDBcMFwwIiwgNikpIHsKLQkJCQlzcHJpbnRmKGV0aGFkZHJbaV0sCisJCQkJc3ByaW50ZigoY2hhciAqKWV0aGFkZHJbaV0sCiAJCQkJCSIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCiAJCQkJCW1hY19kYXRhLm1hY1tpXVswXSwKIAkJCQkJbWFjX2RhdGEubWFjW2ldWzFdLApAQCAtMjQ0LDEwICsyNDQsMTAgQEAKIAkJCQkJbWFjX2RhdGEubWFjW2ldWzNdLAogCQkJCQltYWNfZGF0YS5tYWNbaV1bNF0sCiAJCQkJCW1hY19kYXRhLm1hY1tpXVs1XSk7Ci0JCQkJc3ByaW50ZihlbmV0dmFyLAorCQkJCXNwcmludGYoKGNoYXIgKillbmV0dmFyLAogCQkJCQlpID8gImV0aCVkYWRkciIgOiAiZXRoYWRkciIsCiAJCQkJCWkpOwotCQkJCXNldGVudihlbmV0dmFyLCBldGhhZGRyW2ldKTsKKwkJCQlzZXRlbnYoKGNoYXIgKillbmV0dmFyLCAoY2hhciAqKWV0aGFkZHJbaV0pOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODY0MWhwY24vdS1ib290LmxkcyBiL2JvYXJkL21wYzg2NDFocGNuL3UtYm9vdC5sZHMKaW5kZXggMzRiNTBlNC4uNTg2NDQ2NCAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODY0MWhwY24vdS1ib290LmxkcworKysgYi9ib2FyZC9tcGM4NjQxaHBjbi91LWJvb3QubGRzCkBAIC01NywxMSArNTcsMTEgQEAKICAgICBjcHUvbXBjODZ4eC9jcHVfaW5pdC5vICgudGV4dCkKICAgICBjcHUvbXBjODZ4eC9jcHUubyAoLnRleHQpCiAgICAgY3B1L21wYzg2eHgvc3BlZWQubyAoLnRleHQpCi0gICAgY3B1L21wYzg2eHgvcGNpLm8gKC50ZXh0KQogICAgIGNvbW1vbi9kbG1hbGxvYy5vICgudGV4dCkKICAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vICgudGV4dCkKICAgICBsaWJfcHBjL2V4dGFibGUubyAoLnRleHQpCiAgICAgbGliX2dlbmVyaWMvemxpYi5vICgudGV4dCkKKyAgICBkcml2ZXJzL2Jpb3NfZW11bGF0b3IvYXRpYmlvcy5vICgudGV4dCkKICAgICAqKC50ZXh0KQogICAgICooLmZpeHVwKQogICAgICooLmdvdDEpCmRpZmYgLS1naXQgYS9ib2FyZC9tcGwvY29tbW9uL2NvbW1vbl91dGlsLmMgYi9ib2FyZC9tcGwvY29tbW9uL2NvbW1vbl91dGlsLmMKaW5kZXggMDZkMDIxYS4uMjc4YWQ1YyAxMDA2NDQKLS0tIGEvYm9hcmQvbXBsL2NvbW1vbi9jb21tb25fdXRpbC5jCisrKyBiL2JvYXJkL21wbC9jb21tb24vY29tbW9uX3V0aWwuYwpAQCAtNDcxLDcgKzQ3MSw3IEBACiAKIAlpZiAoc3RyY21wKGFyZ3ZbMV0sICJmbGFzaCIpID09IDApCiAJewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZEQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkRDKQogCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJmbG9wcHkiKSA9PSAwKSB7CiAgCQkJY2hhciAqbG9jYWxfYXJnc1szXTsKIAkJCWV4dGVybiBpbnQgZG9fZmRjYm9vdCAoY21kX3RibF90ICosIGludCwgaW50LCBjaGFyICpbXSk7CkBAIC00OTEsNyArNDkxLDcgQEAKIAkJCXJlc3VsdD1tcGxfcHJnX2ltYWdlKCh1Y2hhciAqKWxkX2FkZHIpOwogCQkJcmV0dXJuIHJlc3VsdDsKIAkJfQotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZEQykgKi8KKyNlbmRpZgogCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJtZW0iKSA9PSAwKSB7CiAJICAgIAkJaWYoYXJnYz09NCkgewogCQkJCWxkX2FkZHI9c2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOwpAQCAtNTY0LDcgKzU2NCw3IEBACiB9CiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogZXh0ZXJuIHZvaWQgZG9jX3Byb2JlKHVsb25nIHBoeXNhZHIpOwogdm9pZCBkb2NfaW5pdCAodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2JvYXJkL21wbC9jb21tb24vY29tbW9uX3V0aWwuaCBiL2JvYXJkL21wbC9jb21tb24vY29tbW9uX3V0aWwuaAppbmRleCA4ZjJlYzAzLi5kNGIxZjY4IDEwMDY0NAotLS0gYS9ib2FyZC9tcGwvY29tbW9uL2NvbW1vbl91dGlsLmgKKysrIGIvYm9hcmQvbXBsL2NvbW1vbi9jb21tb25fdXRpbC5oCkBAIC0zOSw3ICszOSw3IEBACiAKIHZvaWQgc2hvd19zdGRpb19kZXYodm9pZCk7CiB2b2lkIGNoZWNrX2Vudih2b2lkKTsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIHZvaWQgZG9jX2luaXQgKHZvaWQpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2JvYXJkL21wbC9wYXRpL3UtYm9vdC5sZHMgYi9ib2FyZC9tcGwvcGF0aS91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjAzZmVmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL21wbC9wYXRpL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQlXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMJTWFydGluIFdpbmlzdG9lcmZlciwgbWFydGlud2luaXN0b2VyZmVyQGdteC5jaAotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgLyogV0FSTklORyAtIHRoZSBmb2xsb3dpbmcgaXMgaGFuZC1vcHRpbWl6ZWQgdG8gZml0IHdpdGhpbgkqLwotICAgIC8qIHRoZSBzZWN0b3IgbGF5b3V0IG9mIG91ciBmbGFzaCBjaGlwcyEJWFhYIEZJWE1FIFhYWAkqLwotCi0gICAgY3B1L21wYzV4eC9zdGFydC5vCSgudGV4dCkKLQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgfQotICBfZXRleHQgPSAuOwotICBQUk9WSURFIChldGV4dCA9IC4pOwotICAucm9kYXRhICAgIDoKLSAgewotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwMEZGKSAmIDB4RkZGRkZGMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+MjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKT4+MjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oMjU2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oMjU2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLS8qICAgLiA9IGVudl9zdGFydDsKLQkucHBjZW52CToKLQl7Ci0JCWNvbW1vbi9lbnZpcm9ubWVudC5vICgucHBjZW52KQotCX0KLSovCi19CmRpZmYgLS1naXQgYS9ib2FyZC9tcGwvdmNtYTkvdmNtYTkuYyBiL2JvYXJkL21wbC92Y21hOS92Y21hOS5jCmluZGV4IDBkMjAwM2QuLjQ1YWI2NTQgMTAwNjQ0Ci0tLSBhL2JvYXJkL21wbC92Y21hOS92Y21hOS5jCisrKyBiL2JvYXJkL21wbC92Y21hOS92Y21hOS5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIC8qCiAgKiBOQU5EIGZsYXNoIGluaXRpYWxpemF0aW9uLgogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIGV4dGVybiB1bG9uZwogbmFuZF9wcm9iZSh1bG9uZyBwaHlzYWRyKTsKIApkaWZmIC0tZ2l0IGEvYm9hcmQvbXBsL3ZjbWE5L3ZjbWE5LmggYi9ib2FyZC9tcGwvdmNtYTkvdmNtYTkuaAppbmRleCBjMDE2N2Q1Li43YTMyMzQzIDEwMDY0NAotLS0gYS9ib2FyZC9tcGwvdmNtYTkvdmNtYTkuaAorKysgYi9ib2FyZC9tcGwvdmNtYTkvdmNtYTkuaApAQCAtMzEsNyArMzEsNyBAQAogCiB2b2lkIHByaW50X3ZjbWE5X2luZm8odm9pZCk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogdHlwZWRlZiBlbnVtIHsKIAlORkNFX0xPVywKIAlORkNFX0hJR0gKZGlmZiAtLWdpdCBhL2JvYXJkL211c2Vua2kvdS1ib290LmxkcyBiL2JvYXJkL211c2Vua2kvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwNTEwOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9tdXNlbmtpL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL2JvYXJkLm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvdnNwcmludGYubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3psaWIubwkJKC50ZXh0KQotCi0JLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAoLnRleHQpCi0KLQkqKC50ZXh0KQotCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZibHVlL3UtYm9vdC5sZHMgYi9ib2FyZC9tdmJsdWUvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwNTEwOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9tdmJsdWUvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvcHBjc3RyaW5nLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy92c3ByaW50Zi5vCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvemxpYi5vCQkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9uYzY1MC9uYW5kLmMgYi9ib2FyZC9uYzY1MC9uYW5kLmMKaW5kZXggNmJiN2MzMS4uODYxN2Y3NCAxMDA2NDQKLS0tIGEvYm9hcmQvbmM2NTAvbmFuZC5jCisrKyBiL2JvYXJkL25jNjUwL25hbmQuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8bmFuZC5oPgogCkBAIC0xMTUsNCArMTE1LDQgQEAKIC8qCW5hbmQtPm9wdGlvbnMgPSBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUzsqLwogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHBob25lL25ldHBob25lLmMgYi9ib2FyZC9uZXRwaG9uZS9uZXRwaG9uZS5jCmluZGV4IDI5N2RlOTcuLmNjYzhiM2UgMTAwNjQ0Ci0tLSBhL2JvYXJkL25ldHBob25lL25ldHBob25lLmMKKysrIGIvYm9hcmQvbmV0cGhvbmUvbmV0cGhvbmUuYwpAQCAtNTk3LDcgKzU5Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiAKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YWwvY29tbW9uL25tX2JzcC5jIGIvYm9hcmQvbmV0c3RhbC9jb21tb24vbm1fYnNwLmMKaW5kZXggMWUwNjc4MC4uYTlkZTQ1ZSAxMDA2NDQKLS0tIGEvYm9hcmQvbmV0c3RhbC9jb21tb24vbm1fYnNwLmMKKysrIGIvYm9hcmQvbmV0c3RhbC9jb21tb24vbm1fYnNwLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWZkZWYgQ09ORklHX0NNRF9CU1AKIC8qCiAgKiBDb21tYW5kIG5tX2JzcDogTmV0c3RhbCBNYXNjaGluZW4gQlNQIHNwZWNpZmljIGNvbW1hbmQKICAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0c3RhbC9oY3U0L2hjdTQuYyBiL2JvYXJkL25ldHN0YWwvaGN1NC9oY3U0LmMKaW5kZXggMjUyYWFhNy4uMmI5NTYwNCAxMDA2NDQKLS0tIGEvYm9hcmQvbmV0c3RhbC9oY3U0L2hjdTQuYworKysgYi9ib2FyZC9uZXRzdGFsL2hjdTQvaGN1NC5jCkBAIC0yOSw5ICsyOSw2IEBACiAKICNkZWZpbmUgSENVX01BQ0hfVkVSU0lPTlNfUkVHSVNURVIJKDB4N0MwMDAwMDAgKyAweEYwMDAwMCkKIAotI2RlZmluZSBtdHNkcmFtKHJlZywgZGF0YSkgIHsgbXRkY3IobWVtY2ZnYSxyZWcpO210ZGNyKG1lbWNmZ2QsZGF0YSk7IH0KLSNkZWZpbmUgbWZzZHJhbSh2YWx1ZSwgcmVnKSB7IG10ZGNyKG1lbWNmZ2EscmVnKTsgdmFsdWUgPSBtZmRjcihtZW1jZmdkKTsgfQotCiAjZGVmaW5lIFNEUkFNX0xFTiAzMioxMDI0KjEwMjQgLyogMzIgTUIgLVJBTSAqLwogCiAjZGVmaW5lIERPX1VHTFlfU0RSQU1fV09SS0FST1VORApAQCAtMTY0LDE3ICsxNjEsMTcgQEAKIAl1MzIgdmFsdWU7CiAKIAlwcmludGYgKCJTRFJBTSBDb250cm9sbGVyIFJlZ2lzdGVycyAtLVxuIik7Ci0JbWZzZHJhbSh2YWx1ZSwgbWVtX21jb3B0MSk7CisJbWZzZHJhbShtZW1fbWNvcHQxLCB2YWx1ZSk7CiAJcHJpbnRmICgiICAgIFNEUkFNMF9DRkcgICA6IDB4JTA4eFxuIiwgdmFsdWUpOwotCW1mc2RyYW0odmFsdWUsIG1lbV9zdGF0dXMpOworCW1mc2RyYW0obWVtX3N0YXR1cywgdmFsdWUpOwogCXByaW50ZiAoIiAgICBTRFJBTTBfU1RBVFVTOiAweCUwOHhcbiIsIHZhbHVlKTsKLQltZnNkcmFtKHZhbHVlLCBtZW1fbWIwY2YpOworCW1mc2RyYW0obWVtX21iMGNmLCB2YWx1ZSk7CiAJcHJpbnRmICgiICAgIFNEUkFNMF9CMENSICA6IDB4JTA4eFxuIiwgdmFsdWUpOwotCW1mc2RyYW0odmFsdWUsIG1lbV9tYjFjZik7CisJbWZzZHJhbShtZW1fbWIxY2YsIHZhbHVlKTsKIAlwcmludGYgKCIgICAgU0RSQU0wX0IxQ1IgIDogMHglMDh4XG4iLCB2YWx1ZSk7Ci0JbWZzZHJhbSh2YWx1ZSwgbWVtX3NkdHIxKTsKKwltZnNkcmFtKG1lbV9zZHRyMSwgdmFsdWUpOwogCXByaW50ZiAoIiAgICBTRFJBTTBfVFIgICAgOiAweCUwOHhcbiIsIHZhbHVlKTsKLQltZnNkcmFtKHZhbHVlLCBtZW1fcnRyKTsKKwltZnNkcmFtKG1lbV9ydHIsIHZhbHVlKTsKIAlwcmludGYgKCIgICAgU0RSQU0wX1JUUiAgIDogMHglMDh4XG4iLCB2YWx1ZSk7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YXIvbmFuZC5jIGIvYm9hcmQvbmV0c3Rhci9uYW5kLmMKaW5kZXggNzg1MjM2NS4uZDQ3ZTFkOCAxMDA2NDQKLS0tIGEvYm9hcmQvbmV0c3Rhci9uYW5kLmMKKysrIGIvYm9hcmQvbmV0c3Rhci9uYW5kLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2luY2x1ZGUgPG5hbmQuaD4KIApkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0dGEvbmV0dGEuYyBiL2JvYXJkL25ldHRhL25ldHRhLmMKaW5kZXggNDkyM2UzYS4uNWE3NWU1MyAxMDA2NDQKLS0tIGEvYm9hcmQvbmV0dGEvbmV0dGEuYworKysgYi9ib2FyZC9uZXR0YS9uZXR0YS5jCkBAIC01NTUsNyArNTU1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICYmIGRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKIAogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogCkBAIC01NzAsNyArNTcwLDcgQEAKIH0KICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAKIGludCBwY21jaWFfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0dGEvcGNtY2lhLmMgYi9ib2FyZC9uZXR0YS9wY21jaWEuYwppbmRleCBhMzcwOWY3Li44NmIzY2ZiIDEwMDY0NAotLS0gYS9ib2FyZC9uZXR0YS9wY21jaWEuYworKysgYi9ib2FyZC9uZXR0YS9wY21jaWEuYwpAQCAtNCwxMSArNCwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTI2NCw3ICsyNjQsNyBAQAogfQogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKIHsKIAl2b2xhdGlsZSBpbW1hcF90CSppbW1hcDsKQEAgLTI5MSw3ICsyOTEsNyBAQAogCiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKIAogaW50IHBjbWNpYV92b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHRhMi9uZXR0YTIuYyBiL2JvYXJkL25ldHRhMi9uZXR0YTIuYwppbmRleCAzY2E3YmQzLi5iMjE2YzVhIDEwMDY0NAotLS0gYS9ib2FyZC9uZXR0YTIvbmV0dGEyLmMKKysrIGIvYm9hcmQvbmV0dGEyL25ldHRhMi5jCkBAIC01OTUsNyArNTk1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIApkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0dmlhL25ldHZpYS5jIGIvYm9hcmQvbmV0dmlhL25ldHZpYS5jCmluZGV4IDNlNmM2MTYuLjg1NmI3NzYgMTAwNjQ0Ci0tLSBhL2JvYXJkL25ldHZpYS9uZXR2aWEuYworKysgYi9ib2FyZC9uZXR2aWEvbmV0dmlhLmMKQEAgLTQxNiw3ICs0MTYsNyBAQAogCXJldHVybiAwOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogCmRpZmYgLS1naXQgYS9ib2FyZC9vMmRudC91LWJvb3QubGRzIGIvYm9hcmQvbzJkbnQvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhkYzExOC4uMDAwMDAwMAotLS0gYS9ib2FyZC9vMmRudC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDUKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9vbWFwMjQyMGg0L29tYXAyNDIwaDQuYyBiL2JvYXJkL29tYXAyNDIwaDQvb21hcDI0MjBoNC5jCmluZGV4IGY3Zjc1ZTAuLjFiOTE3YjMgMTAwNjQ0Ci0tLSBhL2JvYXJkL29tYXAyNDIwaDQvb21hcDI0MjBoNC5jCisrKyBiL2JvYXJkL29tYXAyNDIwaDQvb21hcDI0MjBoNC5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CiAjaW5jbHVkZSA8aTJjLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogZXh0ZXJuIHN0cnVjdCBuYW5kX2NoaXAgbmFuZF9kZXZfZGVzY1tDRkdfTUFYX05BTkRfREVWSUNFXTsKICNlbmRpZgpAQCAtODQ3LDcgKzg0Nyw3IEBACiAJfQogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIHZvaWQgbmFuZF9pbml0KHZvaWQpCiB7CiAgICAgZXh0ZXJuIGZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW107CmRpZmYgLS1naXQgYS9ib2FyZC9veGMvdS1ib290LmxkcyBiL2JvYXJkL294Yy91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTVjZDJlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL294Yy91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9wY2lwcGMyL3BjaXBwYzIuYyBiL2JvYXJkL3BjaXBwYzIvcGNpcHBjMi5jCmluZGV4IGEyMTZjNTUuLjExNDhjNmEgMTAwNjQ0Ci0tLSBhL2JvYXJkL3BjaXBwYzIvcGNpcHBjMi5jCisrKyBiL2JvYXJkL3BjaXBwYzIvcGNpcHBjMi5jCkBAIC0yMDIsNyArMjAyLDcgQEAKIAkJZW5hYmxlX2ludGVycnVwdHMgKCk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIGludCBkb193ZCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJc3dpdGNoIChhcmdjKSB7CkBAIC0yNDEsNSArMjQxLDUgQEAKIAkid2QgICAgICAtIHByaW50IGN1cnJlbnQgc3RhdHVzXG4iCiApOwogCi0jZW5kaWYJLyogQ0ZHX0NNRF9CU1AgKi8KKyNlbmRpZgogI2VuZGlmCS8qIENPTkZJR19XQVRDSERPRyAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvcGNzNDQwZXAvcGNzNDQwZXAuYyBiL2JvYXJkL3BjczQ0MGVwL3BjczQ0MGVwLmMKaW5kZXggNjk2NDIzZS4uZTI0N2ZlZSAxMDA2NDQKLS0tIGEvYm9hcmQvcGNzNDQwZXAvcGNzNDQwZXAuYworKysgYi9ib2FyZC9wY3M0NDBlcC9wY3M0NDBlcC5jCkBAIC04NzksNyArODc5LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpCisjaWYgZGVmaW5lZCAoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpCiB2b2lkIGlkZV9zZXRfcmVzZXQgKGludCBpZGVyZXNldCkKIHsKIAlkZWJ1ZyAoImlkZV9yZXNldCglZClcbiIsIGlkZXJlc2V0KTsKQEAgLTg5MCw0ICs4OTAsNCBAQAogCX0KIAl1ZGVsYXkgKDEwMDAwKTsKIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KKyNlbmRpZiAvKiBkZWZpbmVkIChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL3BtNTIwL3BtNTIwLmMgYi9ib2FyZC9wbTUyMC9wbTUyMC5jCmluZGV4IDY1YzUyOTEuLjE0YzNmMWQgMTAwNjQ0Ci0tLSBhL2JvYXJkL3BtNTIwL3BtNTIwLmMKKysrIGIvYm9hcmQvcG01MjAvcG01MjAuYwpAQCAtMjk5LDcgKzI5OSw3IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV9SRVNFVCkKIAogdm9pZCBpbml0X2lkZV9yZXNldCAodm9pZCkKIHsKQEAgLTMxMiw5ICszMTIsOSBAQAogCWRlYnVnICgiaWRlX3Jlc2V0KCVkKVxuIiwgaWRlcmVzZXQpOwogCiB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCisjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogZXh0ZXJuIHZvaWQgZG9jX3Byb2JlICh1bG9uZyBwaHlzYWRyKTsKIHZvaWQgZG9jX2luaXQgKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9ib2FyZC9wbTUyMC91LWJvb3QubGRzIGIvYm9hcmQvcG01MjAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjMjk2OC4uMDAwMDAwMAotLS0gYS9ib2FyZC9wbTUyMC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNAotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3BtODI2L3BtODI2LmMgYi9ib2FyZC9wbTgyNi9wbTgyNi5jCmluZGV4IDc1MTRjZDcuLjE0MjBlNjQgMTAwNjQ0Ci0tLSBhL2JvYXJkL3BtODI2L3BtODI2LmMKKysrIGIvYm9hcmQvcG04MjYvcG04MjYuYwpAQCAtMzEwLDcgKzMxMCw3IEBACiAJcmV0dXJuIChwc2l6ZSk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIGV4dGVybiB2b2lkIGRvY19wcm9iZSAodWxvbmcgcGh5c2Fkcik7CiB2b2lkIGRvY19pbml0ICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYm9hcmQvcG04MjYvdS1ib290LmxkcyBiL2JvYXJkL3BtODI2L3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjI5YzYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvcG04MjYvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICBjb21tb24vZW52aXJvbm1lbnQubygudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvcG04MjgvcG04MjguYyBiL2JvYXJkL3BtODI4L3BtODI4LmMKaW5kZXggMzE5MzI3NC4uOThjZDgwYiAxMDA2NDQKLS0tIGEvYm9hcmQvcG04MjgvcG04MjguYworKysgYi9ib2FyZC9wbTgyOC9wbTgyOC5jCkBAIC0zNDMsNyArMzQzLDcgQEAKIAlyZXR1cm4gKHBzaXplKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogZXh0ZXJuIHZvaWQgZG9jX3Byb2JlICh1bG9uZyBwaHlzYWRyKTsKIHZvaWQgZG9jX2luaXQgKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9ib2FyZC9wbTgyOC91LWJvb3QubGRzIGIvYm9hcmQvcG04MjgvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4YzFjZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9wbTgyOC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEtMjAwNAotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8oLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3BuNjIvY21kX3BuNjIuYyBiL2JvYXJkL3BuNjIvY21kX3BuNjIuYwppbmRleCAzZWEwNjhkLi5mZmEyMGNkIDEwMDY0NAotLS0gYS9ib2FyZC9wbjYyL2NtZF9wbjYyLmMKKysrIGIvYm9hcmQvcG42Mi9jbWRfcG42Mi5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgInBuNjIuaCIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiBleHRlcm4gaW50IGRvX2Jvb3RtIChjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKIApkaWZmIC0tZ2l0IGEvYm9hcmQvcG42Mi91LWJvb3QubGRzIGIvYm9hcmQvcG42Mi91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWVlM2ZkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL3BuNjIvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI0eC9zdGFydC5vCQkoLnRleHQpCi0gICAgbGliX3BwYy9ib2FyZC5vCQkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3ZzcHJpbnRmLm8JKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL2NyYzMyLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy96bGliLm8JCSgudGV4dCkKLQotCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JKigudGV4dCkKLQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3BwbWM4MjYwL3UtYm9vdC5sZHMgYi9ib2FyZC9wcG1jODI2MC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQ0Yjc4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL3BwbWM4MjYwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMAotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8oLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3Byb2RyaXZlL2FscHIvbmFuZC5jIGIvYm9hcmQvcHJvZHJpdmUvYWxwci9uYW5kLmMKaW5kZXggZDY2YjA4OC4uMDk3ZTE4MyAxMDA2NDQKLS0tIGEvYm9hcmQvcHJvZHJpdmUvYWxwci9uYW5kLmMKKysrIGIvYm9hcmQvcHJvZHJpdmUvYWxwci9uYW5kLmMKQEAgLTI2LDcgKzI2LDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxuYW5kLmg+CmRpZmYgLS1naXQgYS9ib2FyZC9wcm9kcml2ZS9wM214L3NlcmlhbC5jIGIvYm9hcmQvcHJvZHJpdmUvcDNteC9zZXJpYWwuYwppbmRleCBiYTMyYWMxLi5lMWFmMzdlIDEwMDY0NAotLS0gYS9ib2FyZC9wcm9kcml2ZS9wM214L3NlcmlhbC5jCisrKyBiL2JvYXJkL3Byb2RyaXZlL3AzbXgvc2VyaWFsLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAl9CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogdm9pZCBrZ2RiX3NlcmlhbF9pbml0ICh2b2lkKQogewogfQpAQCAtMTA0LDQgKzEwNCw0IEBACiB7CiAJcmV0dXJuOwogfQotI2VuZGlmIC8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9wcm9kcml2ZS9wZG5iMy9uYW5kLmMgYi9ib2FyZC9wcm9kcml2ZS9wZG5iMy9uYW5kLmMKaW5kZXggOTJmOWMwMS4uYjFlNzA0MSAxMDA2NDQKLS0tIGEvYm9hcmQvcHJvZHJpdmUvcGRuYjMvbmFuZC5jCisrKyBiL2JvYXJkL3Byb2RyaXZlL3BkbmIzL25hbmQuYwpAQCAtMjMsNyArMjMsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8bmFuZC5oPgogCmRpZmYgLS1naXQgYS9ib2FyZC9wcm9kcml2ZS9wZG5iMy9wZG5iMy5jIGIvYm9hcmQvcHJvZHJpdmUvcGRuYjMvcGRuYjMuYwppbmRleCBlMmZlZDVkLi5hMWEzMTBhIDEwMDY0NAotLS0gYS9ib2FyZC9wcm9kcml2ZS9wZG5iMy9wZG5iMy5jCisrKyBiL2JvYXJkL3Byb2RyaXZlL3BkbmIzL3BkbmIzLmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogCSJhZGRyZXNzIHNpemVcbiAgICAtIGJvb3QgRlBHQSB3aXRoIGd6aXBwZWQgaW1hZ2UgYXQgPGFkZHJlc3M+XG4iCiApOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENJKSB8fCBkZWZpbmVkKENPTkZJR19QQ0kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDSSkgfHwgZGVmaW5lZChDT05GSUdfUENJKQogZXh0ZXJuIHN0cnVjdCBwY2lfY29udHJvbGxlciBob3NlOwogZXh0ZXJuIHZvaWQgcGNpX2l4cF9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqIGhvc2UpOwogCmRpZmYgLS1naXQgYS9ib2FyZC9yMzYwbXBpL3BjbWNpYS5jIGIvYm9hcmQvcjM2MG1waS9wY21jaWEuYwppbmRleCA3ZDM0YWM4Li5hODNjYThkIDEwMDY0NAotLS0gYS9ib2FyZC9yMzYwbXBpL3BjbWNpYS5jCisrKyBiL2JvYXJkL3IzNjBtcGkvcGNtY2lhLmMKQEAgLTQsMTEgKzQsMTEgQEAKIAogI3VuZGVmCUNPTkZJR19QQ01DSUEKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCkBAIC0xMjMsNyArMTIzLDcgQEAKIH0KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBpbnQgcGNtY2lhX2hhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCiB7CiAJdm9sYXRpbGUgaW1tYXBfdAkqaW1tYXA7CkBAIC0xNTAsNyArMTUwLDcgQEAKIAogCXJldHVybiAoMCk7CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgogCiAKIGludCBwY21jaWFfdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApCmRpZmYgLS1naXQgYS9ib2FyZC9yYXR0bGVyL3UtYm9vdC5sZHMgYi9ib2FyZC9yYXR0bGVyL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMmU2ZGEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvcmF0dGxlci91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEtMjAwNQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBNb2RpZmllZCBieSBZdWxpIEJhcmNvaGVuIDx5dWxpQGFyYWJlbGxhc3cuY29tPgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19Ci1FTlRSWShfc3RhcnQpCmRpZmYgLS1naXQgYS9ib2FyZC9ycHhzdXBlci91LWJvb3QubGRzIGIvYm9hcmQvcnB4c3VwZXIvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU2MjNkMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9ycHhzdXBlci91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDAKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9yc2Rwcm90by9jb25maWcubWsgYi9ib2FyZC9yc2Rwcm90by9jb25maWcubWsKaW5kZXggNTg0NGVjMS4uMzVjM2Q4YyAxMDA2NDQKLS0tIGEvYm9hcmQvcnNkcHJvdG8vY29uZmlnLm1rCisrKyBiL2JvYXJkL3JzZHByb3RvL2NvbmZpZy5tawpAQCAtMzEsMyArMzEsNSBAQAogCiBURVhUX0JBU0UgPSAweGZmMDAwMDAwCiAvKlRFWFRfQkFTRSAgPSAweDAwMjAwMDAwICovCisKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvYm9hcmQvcnNkcHJvdG8vdS1ib290LmxkcwpkaWZmIC0tZ2l0IGEvYm9hcmQvcnNkcHJvdG8vdS1ib290LmxkcyBiL2JvYXJkL3JzZHByb3RvL3UtYm9vdC5sZHMKaW5kZXggNzBmYzNhNS4uOWJkNjI0OCAxMDA2NDQKLS0tIGEvYm9hcmQvcnNkcHJvdG8vdS1ib290LmxkcworKysgYi9ib2FyZC9yc2Rwcm90by91LWJvb3QubGRzCkBAIC01NSw3ICs1NSw2IEBACiAgIHsKICAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKICAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQogICAgICooLmdvdDEpCiAgICAgLyouID0gZW52X29mZnNldDsgKi8KICAgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvc2Fjc25nL3NhY3NuZy5jIGIvYm9hcmQvc2Fjc25nL3NhY3NuZy5jCmluZGV4IGU1MGI3NDcuLjI1MjA5ZTAgMTAwNjQ0Ci0tLSBhL2JvYXJkL3NhY3NuZy9zYWNzbmcuYworKysgYi9ib2FyZC9zYWNzbmcvc2Fjc25nLmMKQEAgLTgzNyw3ICs4MzcsNyBAQAogLyoKICAqIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgdG8gY29udHJvbCB0aGUgU1BJIGNoaXAgc2VsZWN0cyBmb3IgdGhlIFNQSSBjb21tYW5kLgogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU1BJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TUEkpCiAKICNkZWZpbmUgU1BJX0FEQ19DU19NQVNLCTB4MDAwMDA4MDAKICNkZWZpbmUgU1BJX0RBQ19DU19NQVNLCTB4MDAwMDEwMDAKQEAgLTg3Myw3ICs4NzMsNyBAQAogfTsKIGludCBzcGlfY2hpcHNlbF9jbnQgPSBzaXplb2Yoc3BpX2NoaXBzZWwpIC8gc2l6ZW9mKHNwaV9jaGlwc2VsWzBdKTsKIAotI2VuZGlmIC8qIENGR19DTURfU1BJICovCisjZW5kaWYKIAogI2VuZGlmIC8qIENPTkZJR19NSVNDX0lOSVRfUiAqLwogCmRpZmYgLS1naXQgYS9ib2FyZC9zYWNzbmcvdS1ib290LmxkcyBiL2JvYXJkL3NhY3NuZy91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTYyM2QwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL3NhY3NuZy91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDAKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9zYW5kcG9pbnQvdS1ib290LmxkcyBiL2JvYXJkL3NhbmRwb2ludC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTVjZDJlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL3NhbmRwb2ludC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9zYmMyNDEweC9zYmMyNDEweC5jIGIvYm9hcmQvc2JjMjQxMHgvc2JjMjQxMHguYwppbmRleCA3MDMwOTg1Li5iNDg2NWUxIDEwMDY0NAotLS0gYS9ib2FyZC9zYmMyNDEweC9zYmMyNDEweC5jCisrKyBiL2JvYXJkL3NiYzI0MTB4L3NiYzI0MTB4LmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxzM2MyNDEwLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjZW5kaWYKIApAQCAtMTM2LDcgKzEzNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogZXh0ZXJuIHVsb25nIG5hbmRfcHJvYmUodWxvbmcgcGh5c2Fkcik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBORl9SZXNldCh2b2lkKQpAQCAtMTgwLDQgKzE4MCw0IEBACiAjZW5kaWYKIAlwcmludGYgKCIlNGx1IE1CXG4iLCBuYW5kX3Byb2JlKCh1bG9uZyluYW5kKSA+PiAyMCk7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL3NiYzgyNDAvdS1ib290LmxkcyBiL2JvYXJkL3NiYzgyNDAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JlODVlNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9zYmM4MjQwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubyAoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvdnNwcmludGYubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3psaWIubwkJKC50ZXh0KQotCi0JCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9zYmM4MjYwL3UtYm9vdC5sZHMgYi9ib2FyZC9zYmM4MjYwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNjIzZDAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvc2JjODI2MC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDAKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9zYmM4MzQ5L3UtYm9vdC5sZHMgYi9ib2FyZC9zYmM4MzQ5L3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMmMwNzUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvc2JjODM0OS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgV2luZCBSaXZlciBTeXN0ZW1zLCBJbmMuCi0gKiB1LWJvb3QubGRzIGZvciBXaW5kUml2ZXIgU0JDODM0OS4KLSAqCi0gKiBCYXNlZCBvbiB0aGUgTVBDODM0OSB1LWJvb3QubGRzCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4M3h4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL3NiYzg2NDFkL01ha2VmaWxlIGIvYm9hcmQvc2JjODY0MWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwYjcyNQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3NiYzg2NDFkL01ha2VmaWxlCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAxCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK0NPQkpTCTo9ICQoQk9BUkQpLm8KK1NPQkpTCTo9IGluaXQubworCitTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworY2xlYW46CisJcm0gLWYgJChPQkpTKSAkKFNPQkpTKQorCisuUEhPTlk6IGRpc3RjbGVhbgorZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAoJG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL3NiYzg2NDFkL2NvbmZpZy5tayBiL2JvYXJkL3NiYzg2NDFkL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDE3NTRkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvc2JjODY0MWQvY29uZmlnLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyMgQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisjIE1vZGlmaWVkIGJ5IEplZmYgQnJvd24KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworIworIyBzYmM4NjQxIGJvYXJkCisjIGRlZmF1bHQgQ0NTUkJBUiBpcyBhdCAweGZmNzAwMDAwCisjCitURVhUX0JBU0UgPSAweGZmZjAwMDAwCisKK1BMQVRGT1JNX0NQUEZMQUdTICs9IC1EQ09ORklHX01QQzg2eHg9MQorUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDODY0MT0xIC1tYWx0aXZlYyAtbWFiaT1hbHRpdmVjIC1tc29mdC1mbG9hdApkaWZmIC0tZ2l0IGEvYm9hcmQvc2JjODY0MWQvaW5pdC5TIGIvYm9hcmQvc2JjODY0MWQvaW5pdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNTFkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9zYmM4NjQxZC9pbml0LlMKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBXaW5kIFJpdmVyIFN5c3RlbWVzLCBJbmMuIDx3d3cud2luZHJpdmVyLmNvbT4KKyAqIENvcHlyaWdodCAyMDA3IEVtYmVkZGVkIFNwZWNpYWx0aWVzLCBJbmMuCisgKiBKb2UgSGFtbWFuIGpvZS5oYW1tYW5AZW1iZWRkZWRzcGVjaWFsdGllcy5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqIEplZmYgQnJvd24KKyAqIFNyaWthbnRoIFNyaW5pdmFzYW4gKHNyaWthbnRoLnNyaW5pdmFzYW5AZnJlZXNjYWxlLmNvbSkKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPHBwY19kZWZzLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1wYzg2eHguaD4KKworLyoKKyAqIExBVyhMb2NhbCBBY2Nlc3MgV2luZG93KSBjb25maWd1cmF0aW9uOgorICoKKyAqIDB4MDAwMF8wMDAwCTB4MGZmZl9mZmZmCUREUjEJMjU2TQorICogMHgxMDAwXzAwMDAJMHgxZmZmX2ZmZmYJRERSMgkyNTZNCisgKiAweGUwMDBfMDAwMAkweGZmZmZfZmZmZglMQkMJNTEyTQorICoKKyAqIE5vdGVzOgorICogICBDQ1NSQkFSIGRvZXNuJ3QgbmVlZCBhIGNvbmZpZ3VyZWQgTG9jYWwgQWNjZXNzIFdpbmRvdy4KKyAqICAgSWYgZmxhc2ggaXMgOE0gYXQgZGVmYXVsdCBwb3NpdGlvbiAobGFzdCA4TSksIG5vIExBVyBuZWVkZWQuCisgKi8KKworIyBERFIgQmFuayAxCisjICNkZWZpbmUgTEFXQkFSMSAoKENGR19ERFJfU0RSQU1fQkFTRT4+MTIpICYgMHhmZmZmZmYpCisjICNkZWZpbmUgTEFXQVIxIChMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfRERSMSB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8yNTZNKSkKKworIyBERFIgQmFuayAyCisjICNkZWZpbmUgTEFXQkFSMiAoKENGR19ERFJfU0RSQU1fQkFTRTI+PjEyKSAmIDB4ZmZmZmZmKQorIyAjZGVmaW5lIExBV0FSMiAoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX0REUjIgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMjU2TSkpCisKKyMgTEJDCisjICNkZWZpbmUgTEFXQkFSMyAoKDB4ZTAwMDAwMDA+PjEyKSAmIDB4ZmZmZmZmKQorIyAjZGVmaW5lIExBV0FSMyAoTEFXQVJfRU4gJiAoTEFXQVJfVFJHVF9JRl9MQkMgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfNTEyTSkpKQorCisvKgorICogTEFXIChMb2NhbCBBY2Nlc3MgV2luZG93KSBjb25maWd1cmF0aW9uOgorICoKKyAqIDB4MDAwMF8wMDAwCUREUgkJCTI1Nk0KKyAqIDB4MTAwMF8wMDAwCUREUjIJCQkyNTZNCisgKiAweDgwMDBfMDAwMAlQQ0kxIE1FTQkJNTEyTQorICogMHhhMDAwXzAwMDAJUENJMiBNRU0JCTUxMk0KKyAqIDB4YzAwMF8wMDAwCVJhcGlkSU8JCQk1MTJNCisgKiAweGUyMDBfMDAwMAlQQ0kxIElPCQkJMTZNCisgKiAweGUzMDBfMDAwMAlQQ0kyIElPCQkJMTZNCisgKiAweGY4MDBfMDAwMAlDQ1NSQkFSCQkJMk0KKyAqIDB4ZmUwMF8wMDAwCUZMQVNIIChib290IGJhbmspCTMyTQorICoKKyAqLworCisjZGVmaW5lIExBV0JBUjEgKChDRkdfRERSX1NEUkFNX0JBU0U+PjEyKSAmIDB4ZmZmZmZmKQorI2RlZmluZSBMQVdBUjEJKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9ERFIxIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzI1Nk0pKQorCisjZGVmaW5lIExBV0JBUjIgKChDRkdfUENJMV9NRU1fQkFTRT4+MTIpICYgMHhmZmZmZmYpCisjZGVmaW5lIExBV0FSMgkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX1BDSTEgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfNTEyTSkpCisKKyNkZWZpbmUgTEFXQkFSMyAoKENGR19QQ0kyX01FTV9CQVNFPj4xMikgJiAweGZmZmZmZikKKyNkZWZpbmUgTEFXQVIzCSh+TEFXQVJfRU4gJiAoTEFXQVJfVFJHVF9JRl9QQ0kyIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzUxMk0pKSkKKworI2RlZmluZSBMQVdCQVI0ICgoMHhmODAwMDAwMD4+MTIpICYgMHhmZmZmZmYpCisjZGVmaW5lIExBV0FSNAkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX0xCQyB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8yTSkpCisKKyNkZWZpbmUgTEFXQkFSNSAoKENGR19QQ0kxX0lPX0JBU0U+PjEyKSAmIDB4ZmZmZmZmKQorI2RlZmluZSBMQVdBUjUJKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9QQ0kxIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzE2TSkpCisKKyNkZWZpbmUgTEFXQkFSNiAoKENGR19QQ0kyX0lPX0JBU0U+PjEyKSAmIDB4ZmZmZmZmKQorI2RlZmluZSBMQVdBUjYJKH5MQVdBUl9FTiAmKCBMQVdBUl9UUkdUX0lGX1BDSTIgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMTZNKSkpCisKKyNkZWZpbmUgTEFXQkFSNyAoKDB4ZmUwMDAwMDAgPj4xMikgJiAweGZmZmZmZikKKyNkZWZpbmUgTEFXQVI3CShMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfTEJDIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzMyTSkpCisKKyNkZWZpbmUgTEFXQkFSOCAoKENGR19ERFJfU0RSQU1fQkFTRTI+PjEyKSAmIDB4ZmZmZmZmKQorI2RlZmluZSBMQVdBUjggKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9ERFIyIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzI1Nk0pKQorCisjZGVmaW5lIExBV0JBUjkgKChDRkdfUklPX01FTV9CQVNFPj4xMikgJiAweGZmZmZmKQorI2RlZmluZSBMQVdBUjkgIChMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfUklPIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzUxMk0pKQorCisJLnNlY3Rpb24gLmJvb3RwZywgImF4IgorCS5nbG9ibAlsYXdfZW50cnkKK2xhd19lbnRyeToKKwlsaXMJcjcsQ0ZHX0NDU1JCQVJAaAorCW9yaQlyNyxyNyxDRkdfQ0NTUkJBUkBsCisKKwlhZGRpICAgIHI0LHI3LDAKKwlhZGRpICAgIHI1LHI3LDAKKworCS8qIFNraXAgTEFXQVIwLCBzdGFydCBhdCBMQVdBUjEgKi8KKwlsaXMgICAgIHI2LExBV0JBUjFAaAorCW9yaSAgICAgcjYscjYsTEFXQkFSMUBsCisJc3R3dSAgICByNiwgMHhjMjgocjQpCisKKwlsaXMgICAgIHI2LExBV0FSMUBoCisJb3JpICAgICByNixyNixMQVdBUjFAbAorCXN0d3UgICAgcjYsIDB4YzMwKHI1KQorCisJLyogTEFXQkFSMiwgTEFXQVIyICovCisJbGlzICAgICByNixMQVdCQVIyQGgKKwlvcmkgICAgIHI2LHI2LExBV0JBUjJAbAorCXN0d3UgICAgcjYsIDB4MjAocjQpCisKKwlsaXMgICAgIHI2LExBV0FSMkBoCisJb3JpICAgICByNixyNixMQVdBUjJAbAorCXN0d3UgICAgcjYsIDB4MjAocjUpCisKKwkvKiBMQVdCQVIzLCBMQVdBUjMgKi8KKwlsaXMgICAgIHI2LExBV0JBUjNAaAorCW9yaSAgICAgcjYscjYsTEFXQkFSM0BsCisJc3R3dSAgICByNiwgMHgyMChyNCkKKworCWxpcyAgICAgcjYsTEFXQVIzQGgKKwlvcmkgICAgIHI2LHI2LExBV0FSM0BsCisJc3R3dSAgICByNiwgMHgyMChyNSkKKworCS8qIExBV0JBUjQsIExBV0FSNCAqLworCWxpcyAgICAgcjYsTEFXQkFSNEBoCisJb3JpICAgICByNixyNixMQVdCQVI0QGwKKwlzdHd1ICAgIHI2LCAweDIwKHI0KQorCisJbGlzICAgICByNixMQVdBUjRAaAorCW9yaSAgICAgcjYscjYsTEFXQVI0QGwKKwlzdHd1ICAgIHI2LCAweDIwKHI1KQorCisJLyogTEFXQkFSNSwgTEFXQVI1ICovCisJbGlzICAgICByNixMQVdCQVI1QGgKKwlvcmkgICAgIHI2LHI2LExBV0JBUjVAbAorCXN0d3UgICAgcjYsIDB4MjAocjQpCisKKwlsaXMgICAgIHI2LExBV0FSNUBoCisJb3JpICAgICByNixyNixMQVdBUjVAbAorCXN0d3UgICAgcjYsIDB4MjAocjUpCisKKwkvKiBMQVdCQVI2LCBMQVdBUjYgKi8KKwlsaXMgICAgIHI2LExBV0JBUjZAaAorCW9yaSAgICAgcjYscjYsTEFXQkFSNkBsCisJc3R3dSAgICByNiwgMHgyMChyNCkKKworCWxpcyAgICAgcjYsTEFXQVI2QGgKKwlvcmkgICAgIHI2LHI2LExBV0FSNkBsCisJc3R3dSAgICByNiwgMHgyMChyNSkKKworCS8qIExBV0JBUjcsIExBV0FSNyAqLworCWxpcyAgICAgcjYsTEFXQkFSN0BoCisJb3JpICAgICByNixyNixMQVdCQVI3QGwKKwlzdHd1ICAgIHI2LCAweDIwKHI0KQorCisJbGlzICAgICByNixMQVdBUjdAaAorCW9yaSAgICAgcjYscjYsTEFXQVI3QGwKKwlzdHd1ICAgIHI2LCAweDIwKHI1KQorCisJLyogTEFXQkFSOCwgTEFXQVI4ICovCisJbGlzICAgICByNixMQVdCQVI4QGgKKwlvcmkgICAgIHI2LHI2LExBV0JBUjhAbAorCXN0d3UgICAgcjYsIDB4MjAocjQpCisKKwlsaXMgICAgIHI2LExBV0FSOEBoCisJb3JpICAgICByNixyNixMQVdBUjhAbAorCXN0d3UgICAgcjYsIDB4MjAocjUpCisKKwkvKiBMQVdCQVI5LCBMQVdBUjkgKi8KKwlsaXMgICAgIHI2LExBV0JBUjlAaAorCW9yaSAgICAgcjYscjYsTEFXQkFSOUBsCisJc3R3dSAgICByNiwgMHgyMChyNCkKKworCWxpcyAgICAgcjYsTEFXQVI5QGgKKwlvcmkgICAgIHI2LHI2LExBV0FSOUBsCisJc3R3dSAgICByNiwgMHgyMChyNSkKKworCWJscgpkaWZmIC0tZ2l0IGEvYm9hcmQvc2JjODY0MWQvc2JjODY0MWQuYyBiL2JvYXJkL3NiYzg2NDFkL3NiYzg2NDFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkYzQyZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3NiYzg2NDFkL3NiYzg2NDFkLmMKQEAgLTAsMCArMSw0MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBXaW5kIFJpdmVyIFN5c3RlbWVzLCBJbmMuIDx3d3cud2luZHJpdmVyLmNvbT4KKyAqIENvcHlyaWdodCAyMDA3IEVtYmVkZGVkIFNwZWNpYWx0aWVzLCBJbmMuCisgKiBKb2UgSGFtbWFuIGpvZS5oYW1tYW5AZW1iZWRkZWRzcGVjaWFsdGllcy5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqIEplZmYgQnJvd24KKyAqIFNyaWthbnRoIFNyaW5pdmFzYW4gKHNyaWthbnRoLnNyaW5pdmFzYW5AZnJlZXNjYWxlLmNvbSkKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIgU2NvdHQgTWNOdXR0IDxzbWNudXR0QGFydGVzeW5jcC5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2ltbWFwXzg2eHguaD4KKyNpbmNsdWRlIDxhc20vaW1tYXBfZnNsX3BjaS5oPgorI2luY2x1ZGUgPHNwZC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQorI2luY2x1ZGUgPGZ0X2J1aWxkLmg+CitleHRlcm4gdm9pZCBmdF9jcHVfc2V0dXAgKHZvaWQgKmJsb2IsIGJkX3QgKiBiZCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0REUl9FQ0MpICYmICFkZWZpbmVkKENPTkZJR19FQ0NfSU5JVF9WSUFfRERSQ09OVFJPTExFUikKK2V4dGVybiB2b2lkIGRkcl9lbmFibGVfZWNjICh1bnNpZ25lZCBpbnQgZHJhbV9zaXplKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BEX0VFUFJPTSkKKyNpbmNsdWRlICJzcGRfc2RyYW0uaCIKKyNlbmRpZgorCit2b2lkIHNkcmFtX2luaXQgKHZvaWQpOworbG9uZyBpbnQgZml4ZWRfc2RyYW0gKHZvaWQpOworCitpbnQgYm9hcmRfZWFybHlfaW5pdF9mICh2b2lkKQoreworCXJldHVybiAwOworfQorCitpbnQgY2hlY2tib2FyZCAodm9pZCkKK3sKKwlwdXRzICgiQm9hcmQ6IFdpbmQgUml2ZXIgU0JDODY0MURcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK2xvbmcgaW50IGluaXRkcmFtIChpbnQgYm9hcmRfdHlwZSkKK3sKKwlsb25nIGRyYW1fc2l6ZSA9IDA7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKQorCWRyYW1fc2l6ZSA9IHNwZF9zZHJhbSAoKTsKKyNlbHNlCisJZHJhbV9zaXplID0gZml4ZWRfc2RyYW0gKCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisJcHV0cyAoIiAgICBERFI6ICIpOworCXJldHVybiBkcmFtX3NpemU7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0REUl9FQ0MpICYmICFkZWZpbmVkKENPTkZJR19FQ0NfSU5JVF9WSUFfRERSQ09OVFJPTExFUikKKwkvKgorCSAqIEluaXRpYWxpemUgYW5kIGVuYWJsZSBERFIgRUNDLgorCSAqLworCWRkcl9lbmFibGVfZWNjIChkcmFtX3NpemUpOworI2VuZGlmCisKKwlwdXRzICgiICAgIEREUjogIik7CisJcmV0dXJuIGRyYW1fc2l6ZTsKK30KKworI2lmIGRlZmluZWQoQ0ZHX0RSQU1fVEVTVCkKK2ludCB0ZXN0ZHJhbSAodm9pZCkKK3sKKwl1aW50ICpwc3RhcnQgPSAodWludCAqKSBDRkdfTUVNVEVTVF9TVEFSVDsKKwl1aW50ICpwZW5kID0gKHVpbnQgKikgQ0ZHX01FTVRFU1RfRU5EOworCXVpbnQgKnA7CisKKwlwdXRzICgiU0RSQU0gdGVzdCBwaGFzZSAxOlxuIik7CisJZm9yIChwID0gcHN0YXJ0OyBwIDwgcGVuZDsgcCsrKQorCQkqcCA9IDB4YWFhYWFhYWE7CisKKwlmb3IgKHAgPSBwc3RhcnQ7IHAgPCBwZW5kOyBwKyspIHsKKwkJaWYgKCpwICE9IDB4YWFhYWFhYWEpIHsKKwkJCXByaW50ZiAoIlNEUkFNIHRlc3QgZmFpbHMgYXQ6ICUwOHhcbiIsICh1aW50KSBwKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcHV0cyAoIlNEUkFNIHRlc3QgcGhhc2UgMjpcbiIpOworCWZvciAocCA9IHBzdGFydDsgcCA8IHBlbmQ7IHArKykKKwkJKnAgPSAweDU1NTU1NTU1OworCisJZm9yIChwID0gcHN0YXJ0OyBwIDwgcGVuZDsgcCsrKSB7CisJCWlmICgqcCAhPSAweDU1NTU1NTU1KSB7CisJCQlwcmludGYgKCJTRFJBTSB0ZXN0IGZhaWxzIGF0OiAlMDh4XG4iLCAodWludCkgcCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXB1dHMgKCJTRFJBTSB0ZXN0IHBhc3NlZC5cbiIpOworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDT05GSUdfU1BEX0VFUFJPTSkKKy8qCisgKiBGaXhlZCBzZHJhbSBpbml0IC0tIGRvZXNuJ3QgdXNlIHNlcmlhbCBwcmVzZW5jZSBkZXRlY3QuCisgKi8KK2xvbmcgaW50IGZpeGVkX3NkcmFtICh2b2lkKQoreworI2lmICFkZWZpbmVkKENGR19SQU1CT09UKQorCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdm9sYXRpbGUgY2Nzcl9kZHJfdCAqZGRyID0gJmltbWFwLT5pbV9kZHIxOworCisJZGRyLT5jczBfYm5kcyA9IENGR19ERFJfQ1MwX0JORFM7CisJZGRyLT5jczFfYm5kcyA9IENGR19ERFJfQ1MxX0JORFM7CisJZGRyLT5jczJfYm5kcyA9IENGR19ERFJfQ1MyX0JORFM7CisJZGRyLT5jczNfYm5kcyA9IENGR19ERFJfQ1MzX0JORFM7CisJZGRyLT5jczBfY29uZmlnID0gQ0ZHX0REUl9DUzBfQ09ORklHOworCWRkci0+Y3MxX2NvbmZpZyA9IENGR19ERFJfQ1MxX0NPTkZJRzsKKwlkZHItPmNzMl9jb25maWcgPSBDRkdfRERSX0NTMl9DT05GSUc7CisJZGRyLT5jczNfY29uZmlnID0gQ0ZHX0REUl9DUzNfQ09ORklHOworCWRkci0+ZXh0X3JlZnJlYyA9IENGR19ERFJfRVhUX1JFRlJFU0g7CisJZGRyLT50aW1pbmdfY2ZnXzAgPSBDRkdfRERSX1RJTUlOR18wOworCWRkci0+dGltaW5nX2NmZ18xID0gQ0ZHX0REUl9USU1JTkdfMTsKKwlkZHItPnRpbWluZ19jZmdfMiA9IENGR19ERFJfVElNSU5HXzI7CisJZGRyLT5zZHJhbV9jZmdfMSA9IENGR19ERFJfQ0ZHXzFBOworCWRkci0+c2RyYW1fY2ZnXzIgPSBDRkdfRERSX0NGR18yOworCWRkci0+c2RyYW1fbW9kZV8xID0gQ0ZHX0REUl9NT0RFXzE7CisJZGRyLT5zZHJhbV9tb2RlXzIgPSBDRkdfRERSX01PREVfMjsKKwlkZHItPnNkcmFtX21vZGVfY250bCA9IENGR19ERFJfTU9ERV9DVEw7CisJZGRyLT5zZHJhbV9pbnRlcnZhbCA9IENGR19ERFJfSU5URVJWQUw7CisJZGRyLT5zZHJhbV9kYXRhX2luaXQgPSBDRkdfRERSX0RBVEFfSU5JVDsKKwlkZHItPnNkcmFtX2Nsa19jbnRsID0gQ0ZHX0REUl9DTEtfQ1RSTDsKKworCWFzbSAoInN5bmM7aXN5bmMiKTsKKworCXVkZWxheSAoNTAwKTsKKworCWRkci0+c2RyYW1fY2ZnXzEgPSBDRkdfRERSX0NGR18xQjsKKwlhc20gKCJzeW5jOyBpc3luYyIpOworCisJdWRlbGF5ICg1MDApOworCWRkciA9ICZpbW1hcC0+aW1fZGRyMjsKKworCWRkci0+Y3MwX2JuZHMgPSBDRkdfRERSMl9DUzBfQk5EUzsKKwlkZHItPmNzMV9ibmRzID0gQ0ZHX0REUjJfQ1MxX0JORFM7CisJZGRyLT5jczJfYm5kcyA9IENGR19ERFIyX0NTMl9CTkRTOworCWRkci0+Y3MzX2JuZHMgPSBDRkdfRERSMl9DUzNfQk5EUzsKKwlkZHItPmNzMF9jb25maWcgPSBDRkdfRERSMl9DUzBfQ09ORklHOworCWRkci0+Y3MxX2NvbmZpZyA9IENGR19ERFIyX0NTMV9DT05GSUc7CisJZGRyLT5jczJfY29uZmlnID0gQ0ZHX0REUjJfQ1MyX0NPTkZJRzsKKwlkZHItPmNzM19jb25maWcgPSBDRkdfRERSMl9DUzNfQ09ORklHOworCWRkci0+ZXh0X3JlZnJlYyA9IENGR19ERFIyX0VYVF9SRUZSRVNIOworCWRkci0+dGltaW5nX2NmZ18wID0gQ0ZHX0REUjJfVElNSU5HXzA7CisJZGRyLT50aW1pbmdfY2ZnXzEgPSBDRkdfRERSMl9USU1JTkdfMTsKKwlkZHItPnRpbWluZ19jZmdfMiA9IENGR19ERFIyX1RJTUlOR18yOworCWRkci0+c2RyYW1fY2ZnXzEgPSBDRkdfRERSMl9DRkdfMUE7CisJZGRyLT5zZHJhbV9jZmdfMiA9IENGR19ERFIyX0NGR18yOworCWRkci0+c2RyYW1fbW9kZV8xID0gQ0ZHX0REUjJfTU9ERV8xOworCWRkci0+c2RyYW1fbW9kZV8yID0gQ0ZHX0REUjJfTU9ERV8yOworCWRkci0+c2RyYW1fbW9kZV9jbnRsID0gQ0ZHX0REUjJfTU9ERV9DVEw7CisJZGRyLT5zZHJhbV9pbnRlcnZhbCA9IENGR19ERFIyX0lOVEVSVkFMOworCWRkci0+c2RyYW1fZGF0YV9pbml0ID0gQ0ZHX0REUjJfREFUQV9JTklUOworCWRkci0+c2RyYW1fY2xrX2NudGwgPSBDRkdfRERSMl9DTEtfQ1RSTDsKKworCWFzbSAoInN5bmM7aXN5bmMiKTsKKworCXVkZWxheSAoNTAwKTsKKworCWRkci0+c2RyYW1fY2ZnXzEgPSBDRkdfRERSMl9DRkdfMUI7CisJYXNtICgic3luYzsgaXN5bmMiKTsKKworCXVkZWxheSAoNTAwKTsKKyNlbmRpZgorCXJldHVybiBDRkdfU0RSQU1fU0laRSAqIDEwMjQgKiAxMDI0OworfQorI2VuZGlmCQkJCS8qICFkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorLyoKKyAqIEluaXRpYWxpemUgUENJIERldmljZXMsIHJlcG9ydCBkZXZpY2VzIGZvdW5kLgorICovCisKKyNpZm5kZWYgQ09ORklHX1BDSV9QTlAKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSBwY2lfZnNsODZ4eGFkc19jb25maWdfdGFibGVbXSA9IHsKKwl7UENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkgUENJX0lEU0VMX05VTUJFUiwgUENJX0FOWV9JRCwKKwkgcGNpX2NmZ2Z1bmNfY29uZmlnX2RldmljZSwge1BDSV9FTkVUMF9JT0FERFIsCisJCQkJICAgICBQQ0lfRU5FVDBfTUVNQUREUiwKKwkJCQkgICAgIFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUn19LAorCXt9Cit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgcGNpMV9ob3NlID0geworI2lmbmRlZiBDT05GSUdfUENJX1BOUAorCWNvbmZpZ190YWJsZTpwY2lfbXBjODZ4eGN0c19jb25maWdfdGFibGUKKyNlbmRpZgorfTsKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKyNpZmRlZiBDT05GSUdfUENJMgorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwY2kyX2hvc2U7CisjZW5kaWYJLyogQ09ORklHX1BDSTIgKi8KKworaW50IGZpcnN0X2ZyZWVfYnVzbm8gPSAwOworCit2b2lkIHBjaV9pbml0X2JvYXJkKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfQ0NTUkJBUjsKKwl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAmaW1tYXAtPmltX2d1cjsKKwl1aW50IGRldmRpc3IgPSBndXItPmRldmRpc3I7CisJdWludCBpb19zZWwgPSAoZ3VyLT5wb3JkZXZzciAmIE1QQzg2eHhfUE9SREVWU1JfSU9fU0VMKSA+PiAxNjsKKworI2lmZGVmIENPTkZJR19QQ0kxCit7CisJdm9sYXRpbGUgY2Nzcl9mc2xfcGNpX3QgKnBjaSA9IChjY3NyX2ZzbF9wY2lfdCAqKSBDRkdfUENJMV9BRERSOworCWV4dGVybiB2b2lkIGZzbF9wY2lfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9ICZwY2kxX2hvc2U7CisjaWZkZWYgREVCVUcKKwl1aW50IGhvc3QxX2FnZW50ID0gKGd1ci0+cG9yYm1zciAmIE1QQzg2eHhfUE9SQk1TUl9IQSkgPj4gMTc7CisJdWludCBwZXgxX2FnZW50ID0gKGhvc3QxX2FnZW50ID09IDApIHx8IChob3N0MV9hZ2VudCA9PSAxKTsKKyNlbmRpZgorCWlmICgoaW9fc2VsID09IDIgfHwgaW9fc2VsID09IDMgfHwgaW9fc2VsID09IDUKKwkgICAgIHx8IGlvX3NlbCA9PSA2IHx8IGlvX3NlbCA9PSA3IHx8IGlvX3NlbCA9PSAweEYpCisJICAgICYmICEoZGV2ZGlzciAmIE1QQzg2eHhfREVWRElTUl9QQ0lFWDEpKSB7CisJCWRlYnVnKCJQQ0ktRVhQUkVTUyAxOiAlcyBcbiIsIHBleDFfYWdlbnQgPyAiQWdlbnQiIDogIkhvc3QiKTsKKwkJZGVidWcoIjB4JTA4eD0weCUwOHggIiwgJnBjaS0+cG1lX21zZ19kZXQsIHBjaS0+cG1lX21zZ19kZXQpOworCQlpZiAocGNpLT5wbWVfbXNnX2RldCkgeworCQkJcGNpLT5wbWVfbXNnX2RldCA9IDB4ZmZmZmZmZmY7CisJCQlkZWJ1ZygiIHdpdGggZXJyb3JzLiAgQ2xlYXJpbmcuICBOb3cgMHglMDh4IiwKKwkJCSAgICAgIHBjaS0+cG1lX21zZ19kZXQpOworCQl9CisJCWRlYnVnKCJcbiIpOworCisJCS8qIGluYm91bmQgKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDAsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfQlVTLAorCQkJICAgICAgIENGR19QQ0lfTUVNT1JZX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSB8IFBDSV9SRUdJT05fTUVNT1JZKTsKKworCQkvKiBvdXRib3VuZCBtZW1vcnkgKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCisJCQkgICAgICAgQ0ZHX1BDSTFfTUVNX0JBU0UsCisJCQkgICAgICAgQ0ZHX1BDSTFfTUVNX1BIWVMsCisJCQkgICAgICAgQ0ZHX1BDSTFfTUVNX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9NRU0pOworCisJCS8qIG91dGJvdW5kIGlvICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAyLAorCQkJICAgICAgIENGR19QQ0kxX0lPX0JBU0UsCisJCQkgICAgICAgQ0ZHX1BDSTFfSU9fUEhZUywKKwkJCSAgICAgICBDRkdfUENJMV9JT19TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCisJCWhvc2UtPnJlZ2lvbl9jb3VudCA9IDM7CisKKwkJaG9zZS0+Zmlyc3RfYnVzbm89Zmlyc3RfZnJlZV9idXNubzsKKwkJcGNpX3NldHVwX2luZGlyZWN0KGhvc2UsIChpbnQpICZwY2ktPmNmZ19hZGRyLCAoaW50KSAmcGNpLT5jZmdfZGF0YSk7CisKKwkJZnNsX3BjaV9pbml0KGhvc2UpOworCisJCWZpcnN0X2ZyZWVfYnVzbm89aG9zZS0+bGFzdF9idXNubysxOworCQlwcmludGYgKCIgICAgUENJLUVYUFJFU1MgMSBvbiBidXMgJTAyeCAtICUwMnhcbiIsCisJCQlob3NlLT5maXJzdF9idXNubyxob3NlLT5sYXN0X2J1c25vKTsKKworCX0gZWxzZSB7CisJCXB1dHMoIlBDSS1FWFBSRVNTIDE6IERpc2FibGVkXG4iKTsKKwl9Cit9CisjZWxzZQorCXB1dHMoIlBDSS1FWFBSRVNTMTogRGlzYWJsZWRcbiIpOworI2VuZGlmIC8qIENPTkZJR19QQ0kxICovCisKKyNpZmRlZiBDT05GSUdfUENJMgoreworCXZvbGF0aWxlIGNjc3JfZnNsX3BjaV90ICpwY2kgPSAoY2Nzcl9mc2xfcGNpX3QgKikgQ0ZHX1BDSTJfQUREUjsKKwlleHRlcm4gdm9pZCBmc2xfcGNpX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKTsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSAmcGNpMl9ob3NlOworCisKKwkvKiBpbmJvdW5kICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDAsCisJCSAgICAgICBDRkdfUENJX01FTU9SWV9CVVMsCisJCSAgICAgICBDRkdfUENJX01FTU9SWV9QSFlTLAorCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOworCisJLyogb3V0Ym91bmQgbWVtb3J5ICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCisJCSAgICAgICBDRkdfUENJMl9NRU1fQkFTRSwKKwkJICAgICAgIENGR19QQ0kyX01FTV9QSFlTLAorCQkgICAgICAgQ0ZHX1BDSTJfTUVNX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisKKwkvKiBvdXRib3VuZCBpbyAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAyLAorCQkgICAgICAgQ0ZHX1BDSTJfSU9fQkFTRSwKKwkJICAgICAgIENGR19QQ0kyX0lPX1BIWVMsCisJCSAgICAgICBDRkdfUENJMl9JT19TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwlob3NlLT5yZWdpb25fY291bnQgPSAzOworCisJaG9zZS0+Zmlyc3RfYnVzbm89Zmlyc3RfZnJlZV9idXNubzsKKwlwY2lfc2V0dXBfaW5kaXJlY3QoaG9zZSwgKGludCkgJnBjaS0+Y2ZnX2FkZHIsIChpbnQpICZwY2ktPmNmZ19kYXRhKTsKKworCWZzbF9wY2lfaW5pdChob3NlKTsKKworCWZpcnN0X2ZyZWVfYnVzbm89aG9zZS0+bGFzdF9idXNubysxOworCXByaW50ZiAoIiAgICBQQ0ktRVhQUkVTUyAyIG9uIGJ1cyAlMDJ4IC0gJTAyeFxuIiwKKwkJaG9zZS0+Zmlyc3RfYnVzbm8saG9zZS0+bGFzdF9idXNubyk7Cit9CisjZWxzZQorCXB1dHMoIlBDSS1FWFBSRVNTIDI6IERpc2FibGVkXG4iKTsKKyNlbmRpZiAvKiBDT05GSUdfUENJMiAqLworCit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpICYmIGRlZmluZWQoQ09ORklHX09GX0JPQVJEX1NFVFVQKQordm9pZCBmdF9ib2FyZF9zZXR1cCAodm9pZCAqYmxvYiwgYmRfdCAqIGJkKQoreworCXUzMiAqcDsKKwlpbnQgbGVuOworCisJZnRfY3B1X3NldHVwIChibG9iLCBiZCk7CisKKwlwID0gZnRfZ2V0X3Byb3AgKGJsb2IsICIvbWVtb3J5L3JlZyIsICZsZW4pOworCWlmIChwICE9IE5VTEwpIHsKKwkJKnArKyA9IGNwdV90b19iZTMyIChiZC0+YmlfbWVtc3RhcnQpOworCQkqcCA9IGNwdV90b19iZTMyIChiZC0+YmlfbWVtc2l6ZSk7CisJfQorfQorI2VuZGlmCisKK3ZvaWQgc2JjODY0MWRfcmVzZXRfYm9hcmQgKHZvaWQpCit7CisJcHV0cyAoIlJlc2V0dGluZyBib2FyZC4uLi5cbiIpOworfQorCisvKgorICogZ2V0X2JvYXJkX3N5c19jbGsKKyAqICAgICAgQ2xvY2sgaXMgZml4ZWQgYXQgMUdIeiBvbiB0aGlzIGJvYXJkLiBVc2VkIGZvciBDT05GSUdfU1lTX0NMS19GUkVRCisgKi8KKwordW5zaWduZWQgbG9uZyBnZXRfYm9hcmRfc3lzX2NsayAodWxvbmcgZHVtbXkpCit7CisJaW50IGk7CisJdWxvbmcgdmFsID0gMDsKKworCWkgPSA1OworCWkgJj0gMHgwNzsKKworCXN3aXRjaCAoaSkgeworCWNhc2UgMDoKKwkJdmFsID0gMzMwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdmFsID0gNDAwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdmFsID0gNTAwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJdmFsID0gNjYwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJdmFsID0gODMwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgNToKKwkJdmFsID0gMTAwMDAwMDAwOworCQlicmVhazsKKwljYXNlIDY6CisJCXZhbCA9IDEzNDAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQl2YWwgPSAxNjYwMDAwMDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiB2YWw7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9zYmM4NjQxZC91LWJvb3QubGRzIGIvYm9hcmQvc2JjODY0MWQvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDBmMzUwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvc2JjODY0MWQvdS1ib290LmxkcwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA2LCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0FSQ0gocG93ZXJwYykKKworU0VDVElPTlMKK3sKKworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIGNwdS9tcGM4Nnh4L3N0YXJ0Lm8JKC50ZXh0KQorICAgIGJvYXJkL3NiYzg2NDFkL2luaXQubyAoLmJvb3RwZykKKyAgICBjcHUvbXBjODZ4eC90cmFwcy5vICgudGV4dCkKKyAgICBjcHUvbXBjODZ4eC9pbnRlcnJ1cHRzLm8gKC50ZXh0KQorICAgIGNwdS9tcGM4Nnh4L2NwdV9pbml0Lm8gKC50ZXh0KQorICAgIGNwdS9tcGM4Nnh4L2NwdS5vICgudGV4dCkKKyAgICBjcHUvbXBjODZ4eC9zcGVlZC5vICgudGV4dCkKKyAgICBjb21tb24vZGxtYWxsb2MubyAoLnRleHQpCisgICAgbGliX2dlbmVyaWMvY3JjMzIubyAoLnRleHQpCisgICAgbGliX3BwYy9leHRhYmxlLm8gKC50ZXh0KQorICAgIGxpYl9nZW5lcmljL3psaWIubyAoLnRleHQpCisgICAgKigudGV4dCkKKyAgICAqKC5maXh1cCkKKyAgICAqKC5nb3QxKQorICAgfQorICAgIF9ldGV4dCA9IC47CisgICAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgICAucm9kYXRhICAgIDoKKyAgIHsKKyAgICAqKC5yb2RhdGEpCisgICAgKigucm9kYXRhMSkKKyAgICAqKC5yb2RhdGEuc3RyMS40KQorICAgICooLmVoX2ZyYW1lKQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MDBGRikgJiAweEZGRkZGRjAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOworICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgLiA9IC47CisgIF9fdV9ib290X2NtZF9zdGFydCA9IC47CisgIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisgIF9fdV9ib290X2NtZF9lbmQgPSAuOworCisgIC4gPSAuOworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL3NjMy9zYzNuYW5kLmMgYi9ib2FyZC9zYzMvc2MzbmFuZC5jCmluZGV4IDdkYWE4NzcuLjAwOTU2N2IgMTAwNjQ0Ci0tLSBhL2JvYXJkL3NjMy9zYzNuYW5kLmMKKysrIGIvYm9hcmQvc2MzL3NjM25hbmQuYwpAQCAtMjMsNyArMjMsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8bmFuZC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KZGlmZiAtLWdpdCBhL2JvYXJkL3NpZW1lbnMvU0NNL3UtYm9vdC5sZHMgYi9ib2FyZC9zaWVtZW5zL1NDTS91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWYyOWM2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL3NpZW1lbnMvU0NNL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8oLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3NpZW1lbnMvU01ONDIvZmxhc2guYyBiL2JvYXJkL3NpZW1lbnMvU01ONDIvZmxhc2guYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9ib2FyZC9zaWVtZW5zL2NvbW1vbi9mcGdhLmMgYi9ib2FyZC9zaWVtZW5zL2NvbW1vbi9mcGdhLmMKaW5kZXggZTk5NDFjZC4uZjAyMmVkNiAxMDA2NDQKLS0tIGEvYm9hcmQvc2llbWVucy9jb21tb24vZnBnYS5jCisrKyBiL2JvYXJkL3NpZW1lbnMvY29tbW9uL2ZwZ2EuYwpAQCAtMjE5LDcgKzIxOSw3IEBACiAgICAgcmV0dXJuIDE7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIAogLyogLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAqLwogCkBAIC0yOTksNyArMjk5LDcgQEAKIAkiZnBnYSBsb2FkIFtuYW1lXSBhZGRyIC0gbG9hZCBGUEdBIGNvbmZpZ3VyYXRpb24gZGF0YVxuIgogKTsKIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQICovCisjZW5kaWYKIAogLyogLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAqLwogCmRpZmYgLS1naXQgYS9ib2FyZC9zaWVtZW5zL3BjdV9lL3BjdV9lLmMgYi9ib2FyZC9zaWVtZW5zL3BjdV9lL3BjdV9lLmMKaW5kZXggM2YwNWU0YS4uMjMwOTA2OSAxMDA2NDQKLS0tIGEvYm9hcmQvc2llbWVucy9wY3VfZS9wY3VfZS5jCisrKyBiL2JvYXJkL3NpZW1lbnMvcGN1X2UvcGN1X2UuYwpAQCAtMzY4LDcgKzM2OCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBCb2FyZCBTcGVjaWFsIENvbW1hbmRzOiBhY2Nlc3MgZnVuY3Rpb25zIGZvciAiUFVNQSIgRlBHQQogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CU1ApCiAKICNkZWZpbmUJUFVNQV9SRUFEX01PREUJMAogI2RlZmluZSBQVU1BX0xPQURfTU9ERQkxCkBAIC00MDgsNyArNDA4LDcgQEAKIAkgICAgInN0YXR1cyAtIHByaW50IFBVTUEgc3RhdHVzXG4iCiAJICAgICJwdW1hIGxvYWQgYWRkciBsZW4gLSBsb2FkIFBVTUEgY29uZmlndXJhdGlvbiBkYXRhXG4iKTsKIAotI2VuZGlmIC8qIENGR19DTURfQlNQICovCisjZW5kaWYKIAogLyogLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAqLwogCmRpZmYgLS1naXQgYS9ib2FyZC9zaXhuZXQvc2l4bmV0LmMgYi9ib2FyZC9zaXhuZXQvc2l4bmV0LmMKaW5kZXggYTRjYjRkYy4uNzk4ZTE4NSAxMDA2NDQKLS0tIGEvYm9hcmQvc2l4bmV0L3NpeG5ldC5jCisrKyBiL2JvYXJkL3NpeG5ldC9zaXhuZXQuYwpAQCAtMzMsNyArMzMsNyBAQAogIyBpbmNsdWRlIDxzdGF0dXNfbGVkLmg+CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiBleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOwogI2VuZGlmCkBAIC03NSw5ICs3NSw5IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogI2Vycm9yICJTWE5JODU1VCBoYXMgbm8gUENNQ0lBIHBvcnQiCi0jZW5kaWYJLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTMyNyw3ICszMjcsNyBAQAogCXJldHVybiAoMCk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogdm9pZCBuYW5kX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHRvdGxlbiA9IG5hbmRfcHJvYmUoQ0ZHX0RGTEFTSF9CQVNFKTsKZGlmZiAtLWdpdCBhL2JvYXJkL3NsODI0NS91LWJvb3QubGRzIGIvYm9hcmQvc2w4MjQ1L3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYjlmZmQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvc2w4MjQ1L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL2JvYXJkLm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvdnNwcmludGYubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3psaWIubwkJKC50ZXh0KQotCi0JLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAoLnRleHQpCi0KLQkqKC50ZXh0KQotCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3NvcmNlcnkvdS1ib290LmxkcyBiL2JvYXJkL3NvcmNlcnkvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5YmM3Ny4uMDAwMDAwMAotLS0gYS9ib2FyZC9zb3JjZXJ5L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA0Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyMjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvc3BjMTkyMC9ocGkuYyBiL2JvYXJkL3NwYzE5MjAvaHBpLmMKaW5kZXggM2MzNmY3OS4uY2Q3Nzk5YiAxMDA2NDQKLS0tIGEvYm9hcmQvc3BjMTkyMC9ocGkuYworKysgYi9ib2FyZC9zcGMxOTIwL2hwaS5jCkBAIC0xMjIsNyArMTIyLDkgQEAKICNkZWZpbmUgVElOWV9BVVRPSU5DX0JBU0VfQUREUiAweDAKIAogc3RhdGljIGludCBocGlfYWN0aXZhdGUodm9pZCk7CisjaWYgMAogc3RhdGljIHZvaWQgaHBpX2luYWN0aXZhdGUodm9pZCk7CisjZW5kaWYKIHN0YXRpYyB2b2lkIGRzcF9yZXNldCh2b2lkKTsKIAogc3RhdGljIGludCBocGlfd3JpdGVfaW5jKHUzMiBhZGRyLCB1MzIgKmRhdGEsIHUzMiBjb3VudCk7CkBAIC0xMzMsNyArMTM1LDkgQEAKIGludCBocGlfdGVzdCh2b2lkKTsKIHN0YXRpYyBpbnQgaHBpX3dyaXRlX2FkZHJfdGVzdCh1MzIgYWRkcik7CiBzdGF0aWMgaW50IGhwaV9yZWFkX3dyaXRlX3Rlc3QodTMyIGFkZHIsIHUzMiBkYXRhKTsKKyNpZmRlZiBET19USU5ZX1RFU1QKIHN0YXRpYyBpbnQgaHBpX3RpbnlfYXV0b2luY190ZXN0KHZvaWQpOworI2VuZGlmIC8qIERPX1RJTllfVEVTVCAqLwogI2VuZGlmIC8qIENPTkZJR19TUEMxOTIwX0hQSV9URVNUICovCiAKIApAQCAtMTg1LDYgKzE4OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZiAwCiAvKiB0dXJuIG9mZiB0aGUgaG9zdCBwb3J0IGludGVyZmFjZSAqLwogc3RhdGljIHZvaWQgaHBpX2luYWN0aXZhdGUodm9pZCkKIHsKQEAgLTIwMCw2ICsyMDUsNyBAQAogCS8qIGN1cnJlbnRseSBhbHdheXMgb24gVEJEICovCiAKIH0KKyNlbmRpZgogCiAvKiByZXNldCB0aGUgRFNQICovCiBzdGF0aWMgdm9pZCBkc3BfcmVzZXQodm9pZCkKQEAgLTU3MCw2ICs1NzYsNyBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgRE9fVElOWV9URVNUCiBzdGF0aWMgaW50IGhwaV90aW55X2F1dG9pbmNfdGVzdCh2b2lkKQogewogCWludCBpOwpAQCAtNTk5LDUgKzYwNiw2IEBACiAJfQogCXJldHVybiAwOwogfQorI2VuZGlmIC8qIERPX1RJTllfVEVTVCAqLwogCiAjZW5kaWYgLyogQ09ORklHX1NQQzE5MjBfSFBJX1RFU1QgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL3Nzdi9hZG5wZXNjMS9hZG5wZXNjMS5jIGIvYm9hcmQvc3N2L2FkbnBlc2MxL2FkbnBlc2MxLmMKaW5kZXggMmY3MDRhMC4uMmVjM2E3MiAxMDA2NDQKLS0tIGEvYm9hcmQvc3N2L2FkbnBlc2MxL2FkbnBlc2MxLmMKKysrIGIvYm9hcmQvc3N2L2FkbnBlc2MxL2FkbnBlc2MxLmMKQEAgLTY1LDcgKzY1LDcgQEAKIC8qCiAgKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIHRvIGNvbnRyb2wgdGhlIFNQSSBjaGlwIHNlbGVjdHMgZm9yIHRoZSBTUEkgY29tbWFuZC4KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NQSSkgJiYgQ09ORklHX05JT1NfU1BJCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NQSSkgJiYgQ09ORklHX05JT1NfU1BJCiAKICNkZWZpbmUJU1BJX1JUQ19DU19NQVNLCTB4MDAwMDAwMDEKIApAQCAtODksNyArODksNyBAQAogfTsKIGludCBzcGlfY2hpcHNlbF9jbnQgPSBzaXplb2Yoc3BpX2NoaXBzZWwpIC8gc2l6ZW9mKHNwaV9jaGlwc2VsWzBdKTsKIAotI2VuZGlmIC8qIENGR19DTURfU1BJICovCisjZW5kaWYKIAogI2lmCWRlZmluZWQoQ09ORklHX1BPU1QpCiAvKgpkaWZmIC0tZ2l0IGEvYm9hcmQvc3N2L2NvbW1vbi9jbWRfc2xlZC5jIGIvYm9hcmQvc3N2L2NvbW1vbi9jbWRfc2xlZC5jCmluZGV4IGQ2MWZhM2UuLjcxM2VkNjUgMTAwNjQ0Ci0tLSBhL2JvYXJkL3Nzdi9jb21tb24vY21kX3NsZWQuYworKysgYi9ib2FyZC9zc3YvY29tbW9uL2NtZF9zbGVkLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogZXh0ZXJuIGxlZF9kZXZfdCBsZWRfZGV2W107CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIGludCBkb19zbGVkIChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJaW50IGxlZF9pZCA9IDA7CkBAIC0xNTgsNSArMTU4LDUgQEAKIFVfQk9PVF9DTUQgKHNsZWQsIDMsIDAsIGRvX3NsZWQsCiAJICAgICJzbGVkICAgIC0gY2hlY2sgYW5kIHNldCBzdGF0dXMgbGVkXG4iLAogCSAgICAic2xlZCBbbmFtZSBbc3RhdGVdXVxuIiBfX05BTUVfU1RSICIgICAgLSBzdGF0ZTogb258b2ZmfGJsaW5rXG4iKTsKLSNlbmRpZiAvKiBDRkdfQ01EX0JTUCAqLworI2VuZGlmCiAjZW5kaWYJLyogQ09ORklHX1NUQVRVU19MRUQgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL3Nzdi9jb21tb24vd2RfcGlvLmMgYi9ib2FyZC9zc3YvY29tbW9uL3dkX3Bpby5jCmluZGV4IDMyMTVhYzkuLjk5NDVjNTkgMTAwNjQ0Ci0tLSBhL2JvYXJkL3Nzdi9jb21tb24vd2RfcGlvLmMKKysrIGIvYm9hcmQvc3N2L2NvbW1vbi93ZF9waW8uYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJCWVuYWJsZV9pbnRlcnJ1cHRzICgpOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CU1ApCiBpbnQgZG9fd2QgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCW5pb3NfcGlvX3QgKmVuYV9waW9wCSA9IChuaW9zX3Bpb190KilDT05GSUdfSFdfV0RFTkFfQkFTRTsKQEAgLTE1Niw1ICsxNTYsNSBAQAogCSJ3ZCBvZmYgIC0gc3dpdGNoIHdhdGNoZG9nIG9mZlxuIgogCSJ3ZCAgICAgIC0gcHJpbnQgY3VycmVudCBzdGF0dXNcbiIKICk7Ci0jZW5kaWYJLyogQ0ZHX0NNRF9CU1AgKi8KKyNlbmRpZgogI2VuZGlmCS8qIENPTkZJR19IV19XQVRDSERPRyAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvc3R4eHRjL3N0eHh0Yy5jIGIvYm9hcmQvc3R4eHRjL3N0eHh0Yy5jCmluZGV4IDdjYWYwNmEuLjg3YTIwMjIgMTAwNjQ0Ci0tLSBhL2JvYXJkL3N0eHh0Yy9zdHh4dGMuYworKysgYi9ib2FyZC9zdHh4dGMvc3R4eHRjLmMKQEAgLTU3NCw3ICs1NzQsNyBAQAogCXJldHVybiAwOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogCmRpZmYgLS1naXQgYS9ib2FyZC9zdm1fc2M4eHgvc3ZtX3NjOHh4LmMgYi9ib2FyZC9zdm1fc2M4eHgvc3ZtX3NjOHh4LmMKaW5kZXggOWJiOWZkMC4uYjkwMGU2YiAxMDA2NDQKLS0tIGEvYm9hcmQvc3ZtX3NjOHh4L3N2bV9zYzh4eC5jCisrKyBiL2JvYXJkL3N2bV9zYzh4eC9zdm1fc2M4eHguYwpAQCAtMTUzLDcgKzE1Myw3IEBACiAJcmV0dXJuIChzaXplX2IwICk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIGV4dGVybiB2b2lkIGRvY19wcm9iZSAodWxvbmcgcGh5c2Fkcik7CiB2b2lkIGRvY19pbml0ICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYm9hcmQvdG90YWw1MjAwL3RvdGFsNTIwMC5jIGIvYm9hcmQvdG90YWw1MjAwL3RvdGFsNTIwMC5jCmluZGV4IDFhMzUxODcuLmYzMmRhZGYgMTAwNjQ0Ci0tLSBhL2JvYXJkL3RvdGFsNTIwMC90b3RhbDUyMDAuYworKysgYi9ib2FyZC90b3RhbDUyMDAvdG90YWw1MjAwLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfUkVTRVQpCiAKIC8qIElSREFfMSBha2EgUFNDNl8zIChwaW4gQzEzKSAqLwogI2RlZmluZSBHUElPX0lSREFfMQkweDIwMDAwMDAwVUwKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQkqKHZ1X2xvbmcgKikgTVBDNVhYWF9HUElPX0RBVEFfTyB8PSAgR1BJT19JUkRBXzE7CiAJfQogfQotI2VuZGlmIC8qIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKSAqLworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfVklERU9fU0VEMTM4MDYKICNpbmNsdWRlIDxzZWQxMzgwNi5oPgpkaWZmIC0tZ2l0IGEvYm9hcmQvdG90YWw1MjAwL3UtYm9vdC5sZHMgYi9ib2FyZC90b3RhbDUyMDAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjMjk2OC4uMDAwMDAwMAotLS0gYS9ib2FyZC90b3RhbDUyMDAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDQKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC90cW01MjAwL2NtZF9zdGs1Mnh4LmMgYi9ib2FyZC90cW01MjAwL2NtZF9zdGs1Mnh4LmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3YWY2OWYyLi5iNzQ2Njc5Ci0tLSBhL2JvYXJkL3RxbTUyMDAvY21kX3N0azUyeHguYworKysgYi9ib2FyZC90cW01MjAwL2NtZF9zdGs1Mnh4LmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIAogI2lmIGRlZmluZWQoQ09ORklHX1NUSzUyWFgpIHx8IGRlZmluZWQoQ09ORklHX0ZPMzAwKQogI2RlZmluZSBERUZBVUxUX1ZPTAk0NQpAQCAtMTI0MSw0ICsxMjQxLDQgQEAKIAkiICAgICAtIGxvb3BiYWNrIHBsdWcocykgZm9yIFgyMS9YMjIgcmVxdWlyZWRcbiIKICk7CiAjZW5kaWYKLSNlbmRpZiAvKiBDRkdfQ01EX0JTUCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC90cW01MjAwL2NtZF90YjUyMDAuYyBiL2JvYXJkL3RxbTUyMDAvY21kX3RiNTIwMC5jCmluZGV4IDg3ODRiMWYuLjIxNGRjYTYgMTAwNjQ0Ci0tLSBhL2JvYXJkL3RxbTUyMDAvY21kX3RiNTIwMC5jCisrKyBiL2JvYXJkL3RxbTUyMDAvY21kX3RiNTIwMC5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CU1ApCiAjaWYgZGVmaW5lZCAoQ09ORklHX1RCNTIwMCkKIAogI2RlZmluZSBTTTUwMV9QQU5FTF9ESVNQTEFZX0NPTlRST0wJMHgwMDA4MDAwMFVMCkBAIC0xMDEsNCArMTAxLDQgQEAKIAkpOwogCiAjZW5kaWYgLyogQ09ORklHX1NUSzUyWFggKi8KLSNlbmRpZiAvKiBDRkdfQ01EX0JTUCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC90cW01MjAwL3RxbTUyMDAuYyBiL2JvYXJkL3RxbTUyMDAvdHFtNTIwMC5jCmluZGV4IGNmOTc2MDMuLjUxZjRhZWIgMTAwNjQ0Ci0tLSBhL2JvYXJkL3RxbTUyMDAvdHFtNTIwMC5jCisrKyBiL2JvYXJkL3RxbTUyMDAvdHFtNTIwMC5jCkBAIC0zMzYsNyArMzM2LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFX1JFU0VUKQogCiAjaWYgZGVmaW5lZCAoQ09ORklHX01JTklGQVApCiAjZGVmaW5lIFNNNTAxX1BPV0VSX01PREUwX0dBVEUJCTB4MDAwMDAwNDBVTApAQCAtMzg5LDcgKzM4OSw3IEBACiAJfQogI2VuZGlmCiB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QT1NUCiAvKgpkaWZmIC0tZ2l0IGEvYm9hcmQvdHFtNTIwMC91LWJvb3QubGRzIGIvYm9hcmQvdHFtNTIwMC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2MyOTY4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL3RxbTUyMDAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDQKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC90cW04MjYwL3UtYm9vdC5sZHMgYi9ib2FyZC90cW04MjYwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjI5YzYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvdHFtODI2MC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC90cW04MjcyL3RxbTgyNzIuYyBiL2JvYXJkL3RxbTgyNzIvdHFtODI3Mi5jCmluZGV4IDcwZDFiYjguLjdiZDY0MDEgMTAwNjQ0Ci0tLSBhL2JvYXJkL3RxbTgyNzIvdHFtODI3Mi5jCisrKyBiL2JvYXJkL3RxbTgyNzIvdHFtODI3Mi5jCkBAIC0xMDY1LDcgKzEwNjUsNyBAQAogfQogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8bmFuZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KQEAgLTEyMTIsNyArMTIxMiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZgkvKiBDRkdfQ01EX05BTkQgKi8KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSQogc3RydWN0IHBjaV9jb250cm9sbGVyIGhvc2U7CmRpZmYgLS1naXQgYS9ib2FyZC90cW04MjcyL3UtYm9vdC5sZHMgYi9ib2FyZC90cW04MjcyL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjI5YzYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvdHFtODI3Mi91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC90cW04MzR4L3UtYm9vdC5sZHMgYi9ib2FyZC90cW04MzR4L3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMGNmYTYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvdHFtODM0eC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODN4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19Ci1FTlRSWShfc3RhcnQpCmRpZmYgLS1naXQgYS9ib2FyZC90cmFiL01ha2VmaWxlIGIvYm9hcmQvdHJhYi9NYWtlZmlsZQppbmRleCA4NjhjYTQyLi5mYmUxYzM2IDEwMDY0NAotLS0gYS9ib2FyZC90cmFiL01ha2VmaWxlCisrKyBiL2JvYXJkL3RyYWIvTWFrZWZpbGUKQEAgLTUwLDcgKzUwLDYgQEAKICQob2JqKXRyYWJfZmt0LnNyZWM6CSQoT0JKU19GS1QpICQoTElCKQogCSQoTEQpIC1nIC1UdGV4dCAkKExPQURfQUREUikgLW8gJCg8Oi5vPSkgLWUgdHJhYl9ma3QgJF4gJChMSUIpIFwKIAkJLUwkKG9iaikuLi8uLi9leGFtcGxlcyAtbHN0dWJzIFwKLQkJLUwkKG9iaikuLi8uLi9saWJfZ2VuZXJpYyAtbGdlbmVyaWMgXAogCQktTCQoZ2NjbGliZGlyKSAtbGdjYwogCSQoT0JKQ09QWSkgLU8gc3JlYyAkKDw6Lm89KSAkQAogCmRpZmYgLS1naXQgYS9ib2FyZC90cmFiL2F1dG9fdXBkYXRlLmMgYi9ib2FyZC90cmFiL2F1dG9fdXBkYXRlLmMKaW5kZXggZjQwNzRhZS4uNTRkMzY0NSAxMDA2NDQKLS0tIGEvYm9hcmQvdHJhYi9hdXRvX3VwZGF0ZS5jCisrKyBiL2JvYXJkL3RyYWIvYXV0b191cGRhdGUuYwpAQCAtMzQsNyArMzQsNyBAQAogCiAjaWZkZWYgQ09ORklHX0FVVE9fVVBEQVRFCiAKLSNpZm5kZWYgQ09ORklHX1VTQl9PSENJCisjaWZuZGVmIENPTkZJR19VU0JfT0hDSV9ORVcKICNlcnJvciAibXVzdCBkZWZpbmUgQ09ORklHX1VTQl9PSENJIgogI2VuZGlmCiAKQEAgLTQ2LDggKzQ2LDggQEAKICNlcnJvciAibXVzdCBkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSIgogI2VuZGlmCiAKLSNpZiAhKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkFUKQotI2Vycm9yICJtdXN0IGRlZmluZSBDRkdfQ01EX0ZBVCIKKyNpZiAhZGVmaW5lZChDT05GSUdfQ01EX0ZBVCkKKyNlcnJvciAibXVzdCBkZWZpbmUgQ09ORklHX0NNRF9GQVQiCiAjZW5kaWYKIAogLyoKQEAgLTQ1MCw3ICs0NTAsNyBAQAogewogCWJsb2NrX2Rldl9kZXNjX3QgKnN0b3JfZGV2OwogCWxvbmcgc3o7Ci0JaW50IGksIHJlcywgYml0bWFwX2ZpcnN0LCBjbnQsIG9sZF9jdHJsYywgZ290X2N0cmxjOworCWludCBpLCByZXMgPSAwLCBiaXRtYXBfZmlyc3QsIGNudCwgb2xkX2N0cmxjLCBnb3RfY3RybGM7CiAJY2hhciAqZW52OwogCWxvbmcgc3RhcnQsIGVuZDsKIApAQCAtNDc3LDE4ICs0NzcsMjEgQEAKIAlhdV91c2Jfc3Rvcl9jdXJyX2RldiA9IHVzYl9zdG9yX3NjYW4oMCk7CiAJaWYgKGF1X3VzYl9zdG9yX2N1cnJfZGV2ID09IC0xKSB7CiAJCWRlYnVnICgiTm8gZGV2aWNlIGZvdW5kLiBOb3QgaW5pdGlhbGl6ZWQ/XG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXMgPSAtMTsKKwkJZ290byB4aXQ7CiAJfQogCS8qIGNoZWNrIHdoZXRoZXIgaXQgaGFzIGEgcGFydGl0aW9uIHRhYmxlICovCiAJc3Rvcl9kZXYgPSBnZXRfZGV2KCJ1c2IiLCAwKTsKIAlpZiAoc3Rvcl9kZXYgPT0gTlVMTCkgewogCQlkZWJ1ZyAoInVrbm93biBkZXZpY2UgdHlwZVxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmVzID0gLTE7CisJCWdvdG8geGl0OwogCX0KIAlpZiAoZmF0X3JlZ2lzdGVyX2RldmljZShzdG9yX2RldiwgMSkgIT0gMCkgewogCQlkZWJ1ZyAoIlVuYWJsZSB0byB1c2UgVVNCICVkOiVkIGZvciBmYXRsc1xuIiwKIAkJCWF1X3VzYl9zdG9yX2N1cnJfZGV2LCAxKTsKLQkJcmV0dXJuIC0xOworCQlyZXMgPSAtMTsKKwkJZ290byB4aXQ7CiAJfQogCWlmIChmaWxlX2ZhdF9kZXRlY3RmcygpICE9IDApIHsKIAkJZGVidWcgKCJmaWxlX2ZhdF9kZXRlY3RmcyBmYWlsZWRcbiIpOwpAQCAtNjQ4LDkgKzY1MSwxMCBAQAogCQkJLyogZW5hYmxlIHRoZSBwb3dlciBzd2l0Y2ggKi8KIAkJCSpDUExEX1ZGRF9CSyAmPSB+UE9XRVJfT0ZGOwogCX0KLQl1c2Jfc3RvcCgpOwogCS8qIHJlc3RvcmUgdGhlIG9sZCBzdGF0ZSAqLwogCWRpc2FibGVfY3RybGMob2xkX2N0cmxjKTsKLQlyZXR1cm4gMDsKK3hpdDoKKwl1c2Jfc3RvcCgpOworCXJldHVybiByZXM7CiB9CiAjZW5kaWYgLyogQ09ORklHX0FVVE9fVVBEQVRFICovCmRpZmYgLS1naXQgYS9ib2FyZC90cmFiL2NtZF90cmFiLmMgYi9ib2FyZC90cmFiL2NtZF90cmFiLmMKaW5kZXggYjgyYzhlZC4uZGFhNmFlZSAxMDA2NDQKLS0tIGEvYm9hcmQvdHJhYi9jbWRfdHJhYi5jCisrKyBiL2JvYXJkL3RyYWIvY21kX3RyYWIuYwpAQCAtMzIsNyArMzIsNyBAQAogICogVFJBQiBib2FyZCBzcGVjaWZpYyBjb21tYW5kcy4gRXNwZWNpYWxseSBjb21tYW5kcyBmb3IgYnVybi1pbiBhbmQgZnVuY3Rpb24KICAqIHRlc3QuCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIAogLyogbGltaXRzIGZvciB2YWxpZCByYW5nZSBvZiBWQ0M1ViBpbiBtViAgKi8KICNkZWZpbmUgVkNDNVZfTUlOICAgICAgIDQ1MDAKQEAgLTg0Niw3ICs4NDYsNyBAQAogewogCWludCBjb250YWN0X3RlbXA7CiAJaW50IGRlbGF5ID0gMDsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCXN0cnVjdCBydGNfdGltZSB0bTsKICNlbmRpZgogCkBAIC04NjIsNyArODYyLDcgQEAKIAlzcGlfaW5pdCAoKTsKIAl3aGlsZSAoMSkgewogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAkJcnRjX2dldCAoJnRtKTsKIAkJcHJpbnRmICgiJTRkLSUwMmQtJTAyZCAlMmQ6JTAyZDolMDJkIC0gIiwKIAkJCXRtLnRtX3llYXIsIHRtLnRtX21vbiwgdG0udG1fbWRheSwKQEAgLTg5Myw0ICs4OTMsNCBAQAogCSIgICAgICBGb3IgZWFjaCBtZWFzdXJtZW50IGEgdGltZXN0YW1wIGlzIHByaW50ZXRlZFxuIgogKTsKIAotI2VuZGlmCS8qIENGR19DTURfQlNQICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL3RyYWIvdHJhYl9ma3QuYyBiL2JvYXJkL3RyYWIvdHJhYl9ma3QuYwppbmRleCA3MWJlNmUwLi43MjczZWY5IDEwMDY0NAotLS0gYS9ib2FyZC90cmFiL3RyYWJfZmt0LmMKKysrIGIvYm9hcmQvdHJhYi90cmFiX2ZrdC5jCkBAIC0xNDgsMTQgKzE0OCwxNCBAQAogc3RhdGljIHVuc2lnbmVkIHNob3J0IHVwZGNyYyh1bnNpZ25lZCBzaG9ydCBpY3JjLCB1bnNpZ25lZCBjaGFyICppY3AsCiAJCQkgICAgIHVuc2lnbmVkIGludCBpY250KTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogc3RhdGljIGludCB0cmFiX2VlcHJvbV9yZWFkIChjaGFyICoqYXJndik7CiBzdGF0aWMgaW50IHRyYWJfZWVwcm9tX3dyaXRlIChjaGFyICoqYXJndik7CiBpbnQgaTJjX3dyaXRlX211bHRpcGxlICh1Y2hhciBjaGlwLCB1aW50IGFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmZmVyLAogCQkJaW50IGxlbik7CiBpbnQgaTJjX3JlYWRfbXVsdGlwbGUgKCB1Y2hhciBjaGlwLCB1aW50IGFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmZmVyLAogCQkJaW50IGxlbik7Ci0jZW5kaWYgLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgogCiAvKgogICogVFJBQiBib2FyZCBzcGVjaWZpYyBjb21tYW5kcy4gRXNwZWNpYWxseSBjb21tYW5kcyBmb3IgYnVybi1pbiBhbmQgZnVuY3Rpb24KQEAgLTk1OSw3ICs5NTksNyBAQAogCiBzdGF0aWMgaW50IHRvdWNoX3dyaXRlX2NsaWJyYXRpb25fdmFsdWVzIChpbnQgY2FsaWJfcG9pbnQsIGludCB4LCBpbnQgeSkKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JMkMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0kyQykKIAlpbnQgeF92ZXJpZnkgPSAwOwogCWludCB5X3ZlcmlmeSA9IDA7CiAKQEAgLTEwMTksMTAgKzEwMTksMTAgQEAKIAl9CiAJcmV0dXJuIDE7CiAjZWxzZQotCXByaW50ZiAoIk5vIEkyQyBzdXBwb3J0IGVuYWJsZWQgKENGR19DTURfSTJDKSwgY291bGQgbm90IHdyaXRlICIKKwlwcmludGYgKCJObyBJMkMgc3VwcG9ydCBlbmFibGVkIChDT05GSUdfQ01EX0kyQyksIGNvdWxkIG5vdCB3cml0ZSAiCiAJCSJ0byBFRVBST01cbiIpOwogCXJldHVybiAoMSk7Ci0jZW5kaWYgLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgogfQogCiAKQEAgLTExMDUsNyArMTEwNSw3IEBACiAKIGludCBkb19zZXJpYWxfbnVtYmVyIChjaGFyICoqYXJndikKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JMkMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0kyQykKIAl1bnNpZ25lZCBpbnQgc2VyaWFsX251bWJlcjsKIAogCWlmIChzdHJjbXAgKGFyZ3ZbMl0sICJyZWFkIikgPT0gMCkgewpAQCAtMTEzMCwxNiArMTEzMCwxNiBAQAogCXByaW50ZiAoIiVzOiB1bmtub3duIGNvbW1hbmQgJXNcbiIsIF9fRlVOQ1RJT05fXywgYXJndlsyXSk7CiAJcmV0dXJuICgxKTsgICAgICAgICAgICAgLyogdW5rbm93biBjb21tYW5kLCByZXR1cm4gZXJyb3IgKi8KICNlbHNlCi0JcHJpbnRmICgiTm8gSTJDIHN1cHBvcnQgZW5hYmxlZCAoQ0ZHX0NNRF9JMkMpLCBjb3VsZCBub3Qgd3JpdGUgIgorCXByaW50ZiAoIk5vIEkyQyBzdXBwb3J0IGVuYWJsZWQgKENPTkZJR19DTURfSTJDKSwgY291bGQgbm90IHdyaXRlICIKIAkJInRvIEVFUFJPTVxuIik7CiAJcmV0dXJuICgxKTsKLSNlbmRpZiAvKiBDRkdfQ01EX0kyQyAqLworI2VuZGlmCiB9CiAKIAogaW50IGRvX2NyYzE2ICh2b2lkKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogCWludCBjcmM7CiAJdW5zaWduZWQgY2hhciBidWZbRUVQUk9NX01BWF9DUkNfQlVGXTsKIApAQCAtMTE2MCwxMCArMTE2MCwxMCBAQAogCX0KIAlyZXR1cm4gKDApOwogI2Vsc2UKLQlwcmludGYgKCJObyBJMkMgc3VwcG9ydCBlbmFibGVkIChDRkdfQ01EX0kyQyksIGNvdWxkIG5vdCB3cml0ZSAiCisJcHJpbnRmICgiTm8gSTJDIHN1cHBvcnQgZW5hYmxlZCAoQ09ORklHX0NNRF9JMkMpLCBjb3VsZCBub3Qgd3JpdGUgIgogCQkidG8gRUVQUk9NXG4iKTsKIAlyZXR1cm4gKDEpOwotI2VuZGlmIC8qIENGR19DTURfSTJDICovCisjZW5kaWYKIH0KIAogCkBAIC0xMjYwLDcgKzEyNjAsNyBAQAogCiBpbnQgZG9fZWVwcm9tIChjaGFyICoqYXJndikKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JMkMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0kyQykKIAlpZiAoc3RyY21wIChhcmd2WzJdLCAicmVhZCIpID09IDApIHsKIAkJcmV0dXJuICh0cmFiX2VlcHJvbV9yZWFkIChhcmd2KSk7CiAJfQpAQCAtMTI3MiwxMyArMTI3MiwxMyBAQAogCXByaW50ZiAoIiVzOiBpbnZhbGlkIHBhcmFtZXRlciAlc1xuIiwgX19GVU5DVElPTl9fLCBhcmd2WzJdKTsKIAlyZXR1cm4gKDEpOwogI2Vsc2UKLQlwcmludGYgKCJObyBJMkMgc3VwcG9ydCBlbmFibGVkIChDRkdfQ01EX0kyQyksIGNvdWxkIG5vdCB3cml0ZSAiCisJcHJpbnRmICgiTm8gSTJDIHN1cHBvcnQgZW5hYmxlZCAoQ09ORklHX0NNRF9JMkMpLCBjb3VsZCBub3Qgd3JpdGUgIgogCQkidG8gRUVQUk9NXG4iKTsKIAlyZXR1cm4gKDEpOwotI2VuZGlmIC8qIENGR19DTURfSTJDICovCisjZW5kaWYKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogc3RhdGljIGludCB0cmFiX2VlcHJvbV9yZWFkIChjaGFyICoqYXJndikKIHsKIAlpbnQgaTsKQEAgLTE0MDgsNCArMTQwOCw0IEBACiAJfQogCXJldHVybiAoMCk7CiB9Ci0jZW5kaWYgLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvdWMxMDAvcGNtY2lhLmMgYi9ib2FyZC91YzEwMC9wY21jaWEuYwppbmRleCA2ZTRiNmQ2Li40MDdiZGI3IDEwMDY0NAotLS0gYS9ib2FyZC91YzEwMC9wY21jaWEuYworKysgYi9ib2FyZC91YzEwMC9wY21jaWEuYwpAQCAtNCwxMSArNCwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiAoZGVmaW5lZChDT05GSUdfQ01EX0lERSkpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIApAQCAtMTIzLDcgKzEyMyw3IEBACiB9CiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogaW50IHBjbWNpYV9oYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQogewogCXZvbGF0aWxlIGltbWFwX3QJKmltbWFwOwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAKIAlyZXR1cm4gKDApOwogfQotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogCiBpbnQgcGNtY2lhX3ZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQpkaWZmIC0tZ2l0IGEvYm9hcmQvdWMxMDEvY29uZmlnLm1rIGIvYm9hcmQvdWMxMDEvY29uZmlnLm1rCmluZGV4IDUxZThlODRjLi40ZmUxODMxIDEwMDY0NAotLS0gYS9ib2FyZC91YzEwMS9jb25maWcubWsKKysrIGIvYm9hcmQvdWMxMDEvY29uZmlnLm1rCkBAIC0zOSwzICszOSw0IEBACiBlbmRpZgogCiBQTEFURk9STV9DUFBGTEFHUyArPSAtRFRFWFRfQkFTRT0kKFRFWFRfQkFTRSkgLUkkKFRPUERJUikvYm9hcmQKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvY3B1L21wYzV4eHgvdS1ib290LWN1c3RvbWxheW91dC5sZHMKZGlmZiAtLWdpdCBhL2JvYXJkL3VjMTAxL3UtYm9vdC5sZHMgYi9ib2FyZC91YzEwMS91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjNhMTRjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL3VjMTAxL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA0Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgLyogV0FSTklORyAtIHRoZSBmb2xsb3dpbmcgaXMgaGFuZC1vcHRpbWl6ZWQgdG8gZml0IHdpdGhpbiAgKi8KLSAgICAvKiB0aGUgc2VjdG9yIGxheW91dCBvZiBvdXIgZmxhc2ggY2hpcHMhICAgIFhYWCBGSVhNRSBYWFggICAqLwotCi0gICAgY3B1L21wYzV4eHgvc3RhcnQubyAgICAgICAgICAoLnRleHQpCi0gICAgY3B1L21wYzV4eHgvdHJhcHMubyAgICAgICAgICAoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubyAgICAgICAgICgudGV4dCkKLSAgICBsaWJfcHBjL2NhY2hlLm8gICAgICAgICAgICAgKC50ZXh0KQotICAgIGxpYl9wcGMvdGltZS5vICAgICAgICAgICAgICAoLnRleHQpCi0KLSAgICAuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICAgICAgICAoLnBwY2VudikKLQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3V0eDgyNDUvdS1ib290LmxkcyBiL2JvYXJkL3V0eDgyNDUvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmMzAxOC4uMDAwMDAwMAotLS0gYS9ib2FyZC91dHg4MjQ1L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiAoQykgQ29weXJpZ2h0IDIwMDIKLSAqIEdyZWdvcnkgRS4gQWxsZW4sIGdhbGxlbkBhcmx1dC51dGV4YXMuZWR1Ci0gKiBNYXR0aGV3IEUuIEthcmdlciwga2FyZ2VyQGFybHV0LnV0ZXhhcy5lZHUKLSAqIEFwcGxpZWQgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBUaGUgVW5pdmVyc2l0eSBvZiBUZXhhcyBhdCBBdXN0aW4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvcHBjc3RyaW5nLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy92c3ByaW50Zi5vCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvemxpYi5vCQkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC92MzhiL3UtYm9vdC5sZHMgYi9ib2FyZC92MzhiL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZGVhNmIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvdjM4Yi91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNgotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3YzOGIvdjM4Yi5jIGIvYm9hcmQvdjM4Yi92MzhiLmMKaW5kZXggYWNlNGFhMi4uZWMwMzJlZSAxMDA2NDQKLS0tIGEvYm9hcmQvdjM4Yi92MzhiLmMKKysrIGIvYm9hcmQvdjM4Yi92MzhiLmMKQEAgLTIyNCw3ICsyMjQsNyBAQAogfQogCiAKLSNpZiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfUkVTRVQpCiB2b2lkIGluaXRfaWRlX3Jlc2V0KHZvaWQpCiB7CiAJZGVidWcoImluaXRfaWRlX3Jlc2V0XG4iKTsKQEAgLTI0OCw3ICsyNDgsNyBAQAogCX0gZWxzZQogCQkqKHZ1X2xvbmcgKikgTVBDNVhYWF9XVV9HUElPX0RBVEFfTyB8PSAgR1BJT19QU0MxXzQ7CiB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCisjZW5kaWYKIAogCiAjaWZkZWYgQ09ORklHX0hXX1dBVENIRE9HCmRpZmYgLS1naXQgYS9ib2FyZC93N28vY21kX3ZwZC5jIGIvYm9hcmQvdzdvL2NtZF92cGQuYwppbmRleCA0NDkwODllLi5mZGQ2Y2ViIDEwMDY0NAotLS0gYS9ib2FyZC93N28vY21kX3ZwZC5jCisrKyBiL2JvYXJkL3c3by9jbWRfdnBkLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIAogI2luY2x1ZGUgInZwZC5oIgogCkBAIC02Myw0ICs2Myw0IEBACiAJICAiICAgICAgICAtIFJlYWQgVlBEIERhdGEgZnJvbSBkZWZhdWx0IGFkZHJlc3MsIG9yIGRldmljZSBhZGRyZXNzICdkZXZfYWRkcicuXG4iCiApOwogCi0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC94aWxpbngvbWwzMDAvc2VyaWFsLmMgYi9ib2FyZC94aWxpbngvbWwzMDAvc2VyaWFsLmMKaW5kZXggOWIwM2Y4OS4uYmE0MWY4NSAxMDA2NDQKLS0tIGEvYm9hcmQveGlsaW54L21sMzAwL3NlcmlhbC5jCisrKyBiL2JvYXJkL3hpbGlueC9tbDMwMC9zZXJpYWwuYwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJfQogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIHZvaWQKIGtnZGJfc2VyaWFsX2luaXQodm9pZCkKIHsKQEAgLTE1MSw0ICsxNTEsNCBAQAogewogCXJldHVybjsKIH0KLSNlbmRpZgkJCQkvKiBDRkdfQ01EX0tHREIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQveGlsaW54L21sNDAxL3hwYXJhbWV0ZXJzLmggYi9ib2FyZC94aWxpbngvbWw0MDEveHBhcmFtZXRlcnMuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9ib2FyZC96cGMxOTAwL3UtYm9vdC5sZHMgYi9ib2FyZC96cGMxOTAwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YzRiNDYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvenBjMTkwMC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogTW9kaWZpZWQgYnkgWXVsaSBCYXJjb2hlbiA8eXVsaUBhcmFiZWxsYXN3LmNvbT4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQotRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvenlsb25pdGUvbmFuZC5jIGIvYm9hcmQvenlsb25pdGUvbmFuZC5jCmluZGV4IGE0MTcxNDMuLmFhMzkzMmEgMTAwNjQ0Ci0tLSBhL2JvYXJkL3p5bG9uaXRlL25hbmQuYworKysgYi9ib2FyZC96eWxvbml0ZS9uYW5kLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKICNpZmRlZiBDT05GSUdfTkVXX05BTkRfQ09ERQogCiAjaW5jbHVkZSA8bmFuZC5oPgpkaWZmIC0tZ2l0IGEvY29tbW9uL2JlZGJ1Zy5jIGIvY29tbW9uL2JlZGJ1Zy5jCmluZGV4IDY5NjZkZTcuLjNiZjFmYzMgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9iZWRidWcuYworKysgYi9jb21tb24vYmVkYnVnLmMKQEAgLTIsNyArMiw3IEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogCiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxiZWRidWcvYmVkYnVnLmg+CkBAIC0xMjUzLDQgKzEyNTMsNCBAQAogICogcHVycG9zZS4KICAqLwogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9hdXRvc2NyaXB0LmMgYi9jb21tb24vY21kX2F1dG9zY3JpcHQuYwppbmRleCBlMzI1MzAyLi5hNjAzOGE2IDEwMDY0NAotLS0gYS9jb21tb24vY21kX2F1dG9zY3JpcHQuYworKysgYi9jb21tb24vY21kX2F1dG9zY3JpcHQuYwpAQCAtNDcsOCArNDcsNyBAQAogI2luY2x1ZGUgPGh1c2guaD4KICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfQVVUT1NDUklQVCkgfHwgXAotCSAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUICkKKyNpZiBkZWZpbmVkKENPTkZJR19BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKIAogZXh0ZXJuIGltYWdlX2hlYWRlcl90IGhlYWRlcjsJCS8qIGZyb20gY21kX2Jvb3RtLmMgKi8KIGludApAQCAtMTUwLDkgKzE0OSwxMCBAQAogCXJldHVybiByY29kZTsKIH0KIAotI2VuZGlmCS8qIENPTkZJR19BVVRPU0NSSVBUIHx8IENGR19DTURfQVVUT1NDUklQVCAqLworI2VuZGlmCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9BVVRPU0NSSVBUKQogaW50CiBkb19hdXRvc2NyaXB0IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKQEAgLTE3MCwxMyArMTcwLDEzIEBACiAJcmV0dXJuIHJjb2RlOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKIFVfQk9PVF9DTUQoCiAJYXV0b3NjciwgMiwgMCwJZG9fYXV0b3NjcmlwdCwKIAkiYXV0b3NjciAtIHJ1biBzY3JpcHQgZnJvbSBtZW1vcnlcbiIsCiAJIlthZGRyXSAtIHJ1biBzY3JpcHQgc3RhcnRpbmcgYXQgYWRkciIKIAkiIC0gQSB2YWxpZCBhdXRvc2NyIGhlYWRlciBtdXN0IGJlIHByZXNlbnRcbiIKICk7Ci0jZW5kaWYgLyogQ0ZHX0NNRF9BVVRPU0NSSVBUICovCisjZW5kaWYKIAotI2VuZGlmIC8qIENPTkZJR19BVVRPU0NSSVBUIHx8IENGR19DTURfQVVUT1NDUklQVCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2JkaW5mby5jIGIvY29tbW9uL2NtZF9iZGluZm8uYwppbmRleCBkOTdjMDllLi5jY2I4MjZiIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2JkaW5mby5jCisrKyBiL2NvbW1vbi9jbWRfYmRpbmZvLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CREkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JESSkKIHN0YXRpYyB2b2lkIHByaW50X251bShjb25zdCBjaGFyICosIHVsb25nKTsKIAogI2lmbmRlZiBDT05GSUdfQVJNCS8qIFBvd2VyUEMgYW5kIG90aGVyICovCkBAIC0xNjcsNyArMTY3LDcgQEAKIAlwcmludF9udW0gKCJzcmFtIHNpemUiLAkJKHVsb25nKWJkLT5iaV9zcmFtc2l6ZSk7CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAlwdXRzICgiZXRoYWRkciAgICAgPSIpOwogCWZvciAoaT0wOyBpPDY7ICsraSkgewogCQlwcmludGYgKCIlYyUwMlgiLCBpID8gJzonIDogJyAnLCBiZC0+YmlfZW5ldGFkZHJbaV0pOwpAQCAtMTk1LDcgKzE5NSw3IEBACiAJcHJpbnRfbnVtICgic3JhbSBzdGFydCAgICAgIiwJKHVsb25nKWJkLT5iaV9zcmFtc3RhcnQpOwogCXByaW50X251bSAoInNyYW0gc2l6ZSAgICAgICIsCSh1bG9uZyliZC0+Ymlfc3JhbXNpemUpOwogI2VuZGlmCi0jaWYgZGVmaW5lZChDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCXB1dHMgKCJldGhhZGRyICAgICA9Iik7CiAJZm9yIChpPTA7IGk8NjsgKytpKSB7CiAJCXByaW50ZiAoIiVjJTAyWCIsIGkgPyAnOicgOiAnICcsIGJkLT5iaV9lbmV0YWRkcltpXSk7CkBAIC0yODUsNCArMjg1LDQgQEAKIAkiYmRpbmZvICAtIHByaW50IEJvYXJkIEluZm8gc3RydWN0dXJlXG4iLAogCU5VTEwKICk7Ci0jZW5kaWYJLyogQ0ZHX0NNRF9CREkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9iZWRidWcuYyBiL2NvbW1vbi9jbWRfYmVkYnVnLmMKaW5kZXggNDgwODZhNi4uMWMzNTQ3YSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9iZWRidWcuYworKysgYi9jb21tb24vY21kX2JlZGJ1Zy5jCkBAIC0xMyw3ICsxMyw3IEBACiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiAKICNpZm5kZWYgTUFYCiAjZGVmaW5lIE1BWChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCkBAIC00MTMsNyArNDEzLDcgQEAKIFVfQk9PVF9DTUQgKHJkdW1wLCAxLCAxLCBkb19iZWRidWdfcmR1bXAsCiAJICAgICJyZHVtcCAgIC0gU2hvdyByZWdpc3RlcnMuXG4iLCAiIC0gU2hvdyByZWdpc3RlcnMuXG4iKTsKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNlbmRpZiAvKiBDRkdfQ01EX0JFREJVRyAqLworI2VuZGlmCiAKIAogLyoKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfYm1wLmMgYi9jb21tb24vY21kX2JtcC5jCmluZGV4IGFkNDEyYzguLjI0MWFhODMgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfYm1wLmMKKysrIGIvY29tbW9uL2NtZF9ibXAuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JNUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQk1QKQogCiBzdGF0aWMgaW50IGJtcF9pbmZvICh1bG9uZyBhZGRyKTsKIHN0YXRpYyBpbnQgYm1wX2Rpc3BsYXkgKHVsb25nIGFkZHIsIGludCB4LCBpbnQgeSk7CkBAIC0xODgsNCArMTg4LDQgQEAKICNlbmRpZgogfQogCi0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk1QKSAqLworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0NNRF9CTVApICovCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2Jvb3RtLmMgYi9jb21tb24vY21kX2Jvb3RtLmMKaW5kZXggYmEyODZmMS4uZTE5ZjgzZSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9ib290bS5jCisrKyBiL2NvbW1vbi9jbWRfYm9vdG0uYwpAQCAtNDUsMTAgKzQ1LDEwIEBACiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCi0gLypjbWRfYm9vdC5jKi8KLSBleHRlcm4gaW50IGRvX3Jlc2V0IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CisvKmNtZF9ib290LmMqLworZXh0ZXJuIGludCBkb19yZXNldCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkgfHwgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKQorI2lmIGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAjaW5jbHVkZSA8cnRjLmg+CiAjZW5kaWYKIApAQCAtODIsMTEgKzgyLDExIEBACiBzdGF0aWMgdm9pZCAqemFsbG9jKHZvaWQgKiwgdW5zaWduZWQsIHVuc2lnbmVkKTsKIHN0YXRpYyB2b2lkIHpmcmVlKHZvaWQgKiwgdm9pZCAqLCB1bnNpZ25lZCk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JTUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lNSSkKIHN0YXRpYyBpbnQgaW1hZ2VfaW5mbyAodW5zaWduZWQgbG9uZyBhZGRyKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSU1MUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSU1MUykKICNpbmNsdWRlIDxmbGFzaC5oPgogZXh0ZXJuIGZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW107IC8qIGluZm8gZm9yIEZMQVNIIGNoaXBzICovCiBzdGF0aWMgaW50IGRvX2ltbHMgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKQEAgLTEyNiwxMiArMTI2LDEyIEBACiAjZW5kaWYKIHN0YXRpYyBib290X29zX0ZjbiBkb19ib290bV9uZXRic2Q7CiBzdGF0aWMgYm9vdF9vc19GY24gZG9fYm9vdG1fcnRlbXM7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRUxGKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9FTEYpCiBzdGF0aWMgYm9vdF9vc19GY24gZG9fYm9vdG1fdnh3b3JrczsKIHN0YXRpYyBib290X29zX0ZjbiBkb19ib290bV9xbnhlbGY7CiBpbnQgZG9fYm9vdHZ4ICggY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10gKTsKIGludCBkb19ib290ZWxmIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSApOwotI2VuZGlmIC8qIENGR19DTURfRUxGICovCisjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19BUlRPUykgJiYgZGVmaW5lZChDT05GSUdfUFBDKQogc3RhdGljIGJvb3Rfb3NfRmNuIGRvX2Jvb3RtX2FydG9zOwogI2VuZGlmCkBAIC0zNjIsNyArMzYyLDYgQEAKIAkJaWYgKGkgIT0gQlpfT0spIHsKIAkJCXByaW50ZiAoIkJVTlpJUDIgRVJST1IgJWQgLSBtdXN0IFJFU0VUIGJvYXJkIHRvIHJlY292ZXJcbiIsIGkpOwogCQkJc2hvd19ib290X3Byb2dyZXNzICgtNik7Ci0JCQl1ZGVsYXkoMTAwMDAwKTsKIAkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCX0KIAkJYnJlYWs7CkBAIC00MzMsNyArNDMyLDcgQEAKIAkJCSAgICAgYWRkciwgbGVuX3B0ciwgdmVyaWZ5KTsKIAkgICAgYnJlYWs7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FTEYpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0VMRikKIAljYXNlIElIX09TX1ZYV09SS1M6CiAJICAgIGRvX2Jvb3RtX3Z4d29ya3MgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2LAogCQkJICAgICAgYWRkciwgbGVuX3B0ciwgdmVyaWZ5KTsKQEAgLTQ0Miw3ICs0NDEsNyBAQAogCSAgICBkb19ib290bV9xbnhlbGYgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2LAogCQkJICAgICAgYWRkciwgbGVuX3B0ciwgdmVyaWZ5KTsKIAkgICAgYnJlYWs7Ci0jZW5kaWYgLyogQ0ZHX0NNRF9FTEYgKi8KKyNlbmRpZgogI2lmZGVmIENPTkZJR19BUlRPUwogCWNhc2UgSUhfT1NfQVJUT1M6CiAJICAgIGRvX2Jvb3RtX2FydG9zICAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YsCkBAIC03NDEsNTkgKzc0MCw2NSBAQAogCWlmKGFyZ2MgPiAzKSB7CiAJCW9mX2ZsYXRfdHJlZSA9IChjaGFyICopIHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKIAkJaGRyID0gKGltYWdlX2hlYWRlcl90ICopb2ZfZmxhdF90cmVlOwotI2lmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKLQkJaWYgKGZkdF9jaGVja19oZWFkZXIob2ZfZmxhdF90cmVlKSA9PSAwKSB7CisjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQorCQlpZiAoKigodWxvbmcgKikob2ZfZmxhdF90cmVlICsgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSkpICE9IE9GX0RUX0hFQURFUikgewogI2Vsc2UKLQkJaWYgKCoodWxvbmcgKilvZl9mbGF0X3RyZWUgPT0gT0ZfRFRfSEVBREVSKSB7CisJCWlmIChmZHRfY2hlY2tfaGVhZGVyKG9mX2ZsYXRfdHJlZSArIHNpemVvZihpbWFnZV9oZWFkZXJfdCkpICE9IDApIHsKICNlbmRpZgogI2lmbmRlZiBDRkdfTk9fRkxBU0gKIAkJCWlmIChhZGRyMmluZm8oKHVsb25nKW9mX2ZsYXRfdHJlZSkgIT0gTlVMTCkKIAkJCQlvZl9kYXRhID0gKHVsb25nKW9mX2ZsYXRfdHJlZTsKICNlbmRpZgogCQl9IGVsc2UgaWYgKG50b2hsKGhkci0+aWhfbWFnaWMpID09IElIX01BR0lDKSB7Ci0JCQlwcmludGYoIiMjIEZsYXQgRGV2aWNlIFRyZWUgSW1hZ2UgYXQgJTA4bFhcbiIsIGhkcik7CisJCQlwcmludGYoIiMjIEZsYXQgRGV2aWNlIFRyZWUgYXQgJTA4bFhcbiIsIGhkcik7CiAJCQlwcmludF9pbWFnZV9oZHIoaGRyKTsKIAogCQkJaWYgKChudG9obChoZHItPmloX2xvYWQpIDwgICgodW5zaWduZWQgbG9uZyloZHIgKyBudG9obChoZHItPmloX3NpemUpICsgc2l6ZW9mKGhkcikpKSAmJgogCQkJICAgKChudG9obChoZHItPmloX2xvYWQpICsgbnRvaGwoaGRyLT5paF9zaXplKSkgPiAodW5zaWduZWQgbG9uZyloZHIpKSB7Ci0JCQkJcHJpbnRmICgiRVJST1I6IExvYWQgYWRkcmVzcyBvdmVyd3JpdGVzIEZsYXQgRGV2aWNlIFRyZWUgdUltYWdlXG4iKTsKLQkJCQlyZXR1cm47CisJCQkJcHV0cyAoIkVSUk9SOiBmZHQgb3ZlcndyaXR0ZW4gLSAiCisJCQkJCSJtdXN0IFJFU0VUIHRoZSBib2FyZCB0byByZWNvdmVyLlxuIik7CisJCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJCX0KIAotCQkJcHJpbnRmKCIgICBWZXJpZnlpbmcgQ2hlY2tzdW0gLi4uICIpOworCQkJcHV0cyAoIiAgIFZlcmlmeWluZyBDaGVja3N1bSAuLi4gIik7CiAJCQltZW1tb3ZlICgmaGVhZGVyLCAoY2hhciAqKWhkciwgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSk7CiAJCQljaGVja3N1bSA9IG50b2hsKGhlYWRlci5paF9oY3JjKTsKIAkJCWhlYWRlci5paF9oY3JjID0gMDsKIAogCQkJaWYoY2hlY2tzdW0gIT0gY3JjMzIoMCwgKHVjaGFyICopJmhlYWRlciwgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSkpIHsKLQkJCQlwcmludGYoIkVSUk9SOiBGbGF0IERldmljZSBUcmVlIGhlYWRlciBjaGVja3N1bSBpcyBpbnZhbGlkXG4iKTsKLQkJCQlyZXR1cm47CisJCQkJcHV0cyAoIkVSUk9SOiBmZHQgaGVhZGVyIGNoZWNrc3VtIGludmFsaWQgLSAiCisJCQkJCSJtdXN0IFJFU0VUIHRoZSBib2FyZCB0byByZWNvdmVyLlxuIik7CisJCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJCX0KIAogCQkJY2hlY2tzdW0gPSBudG9obChoZHItPmloX2RjcmMpOwogCQkJYWRkciA9ICh1bG9uZykoKHVjaGFyICopKGhkcikgKyBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpKTsKIAogCQkJaWYoY2hlY2tzdW0gIT0gY3JjMzIoMCwgKHVjaGFyICopYWRkciwgbnRvaGwoaGRyLT5paF9zaXplKSkpIHsKLQkJCQlwcmludGYoIkVSUk9SOiBGbGF0IERldmljZSBUcmVlIGNoZWNrc3VtIGlzIGludmFsaWRcbiIpOwotCQkJCXJldHVybjsKKwkJCQlwdXRzICgiRVJST1I6IGZkdCBjaGVja3N1bSBpbnZhbGlkIC0gIgorCQkJCQkibXVzdCBSRVNFVCB0aGUgYm9hcmQgdG8gcmVjb3Zlci5cbiIpOworCQkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCQl9Ci0JCQlwcmludGYoIk9LXG4iKTsKKwkJCXB1dHMgKCJPS1xuIik7CiAKIAkJCWlmIChudG9obChoZHItPmloX3R5cGUpICE9IElIX1RZUEVfRkxBVERUKSB7Ci0JCQkJcHJpbnRmICgiRVJST1I6IHVJbWFnZSBub3QgRmxhdCBEZXZpY2UgVHJlZSB0eXBlXG4iKTsKLQkJCQlyZXR1cm47CisJCQkJcHV0cyAoIkVSUk9SOiB1SW1hZ2UgaXMgbm90IGEgZmR0IC0gIgorCQkJCQkibXVzdCBSRVNFVCB0aGUgYm9hcmQgdG8gcmVjb3Zlci5cbiIpOworCQkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCQl9CiAJCQlpZiAobnRvaGwoaGRyLT5paF9jb21wKSAhPSBJSF9DT01QX05PTkUpIHsKLQkJCQlwcmludGYoIkVSUk9SOiB1SW1hZ2UgaXMgbm90IHVuY29tcHJlc3NlZFxuIik7Ci0JCQkJcmV0dXJuOworCQkJCXB1dHMgKCJFUlJPUjogdUltYWdlIGlzIGNvbXByZXNzZWQgLSAiCisJCQkJCSJtdXN0IFJFU0VUIHRoZSBib2FyZCB0byByZWNvdmVyLlxuIik7CisJCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJCX0KLSNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCi0JCQlpZiAoZmR0X2NoZWNrX2hlYWRlcihvZl9mbGF0X3RyZWUgKyBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpKSA9PSAwKSB7Ci0jZWxzZQorI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkKIAkJCWlmICgqKCh1bG9uZyAqKShvZl9mbGF0X3RyZWUgKyBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpKSkgIT0gT0ZfRFRfSEVBREVSKSB7CisjZWxzZQorCQkJaWYgKGZkdF9jaGVja19oZWFkZXIob2ZfZmxhdF90cmVlICsgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSkgIT0gMCkgewogI2VuZGlmCi0JCQkJcHJpbnRmICgiRVJST1I6IHVJbWFnZSBkYXRhIGlzIG5vdCBhIGZsYXQgZGV2aWNlIHRyZWVcbiIpOwotCQkJCXJldHVybjsKKwkJCQlwdXRzICgiRVJST1I6IHVJbWFnZSBkYXRhIGlzIG5vdCBhIGZkdCAtICIKKwkJCQkJIm11c3QgUkVTRVQgdGhlIGJvYXJkIHRvIHJlY292ZXIuXG4iKTsKKwkJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQkJfQogCiAJCQltZW1tb3ZlKCh2b2lkICopbnRvaGwoaGRyLT5paF9sb2FkKSwKQEAgLTgwMSwxMCArODA2LDExIEBACiAJCQkJbnRvaGwoaGRyLT5paF9zaXplKSk7CiAJCQlvZl9mbGF0X3RyZWUgPSAoY2hhciAqKW50b2hsKGhkci0+aWhfbG9hZCk7CiAJCX0gZWxzZSB7Ci0JCQlwcmludGYgKCJEaWQgbm90IGZpbmQgYSBmbGF0IGZsYXQgZGV2aWNlIHRyZWUgYXQgYWRkcmVzcyAlMDhsWFxuIiwgb2ZfZmxhdF90cmVlKTsKLQkJCXJldHVybjsKKwkJCXB1dHMgKCJEaWQgbm90IGZpbmQgYSBmbGF0IEZsYXQgRGV2aWNlIFRyZWUuXG4iCisJCQkJIk11c3QgUkVTRVQgdGhlIGJvYXJkIHRvIHJlY292ZXIuXG4iKTsKKwkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCX0KLQkJcHJpbnRmICgiICAgQm9vdGluZyB1c2luZyBmbGF0IGRldmljZSB0cmVlIGF0IDB4JXhcbiIsCisJCXByaW50ZiAoIiAgIEJvb3RpbmcgdXNpbmcgdGhlIGZkdCBhdCAweCV4XG4iLAogCQkJCW9mX2ZsYXRfdHJlZSk7CiAJfSBlbHNlIGlmICgoaGRyLT5paF90eXBlPT1JSF9UWVBFX01VTFRJKSAmJiAobGVuX3B0clsxXSkgJiYgKGxlbl9wdHJbMl0pKSB7CiAJCXVfbG9uZyB0YWlsICAgID0gbnRvaGwobGVuX3B0clswXSkgJSA0OwpAQCAtODI4LDIyICs4MzQsMjQgQEAKIAkJCW9mX2RhdGEgKz0gNCAtIHRhaWw7CiAJCX0KIAotI2lmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKLQkJaWYgKGZkdF9jaGVja19oZWFkZXIoKHZvaWQgKilvZl9kYXRhKSAhPSAwKSB7CisjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQorCQlpZiAoKigodWxvbmcgKikob2ZfZmxhdF90cmVlICsgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSkpICE9IE9GX0RUX0hFQURFUikgewogI2Vsc2UKLQkJaWYgKCgoc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICopb2ZfZGF0YSktPm1hZ2ljICE9IE9GX0RUX0hFQURFUikgeworCQlpZiAoZmR0X2NoZWNrX2hlYWRlcihvZl9mbGF0X3RyZWUgKyBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpKSAhPSAwKSB7CiAjZW5kaWYKLQkJCXByaW50ZiAoIkVSUk9SOiBpbWFnZSBpcyBub3QgYSBmbGF0IGRldmljZSB0cmVlXG4iKTsKLQkJCXJldHVybjsKKwkJCXB1dHMgKCJFUlJPUjogaW1hZ2UgaXMgbm90IGEgZmR0IC0gIgorCQkJCSJtdXN0IFJFU0VUIHRoZSBib2FyZCB0byByZWNvdmVyLlxuIik7CisJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCi0JCWlmIChiZTMyX3RvX2NwdShmZHRfdG90YWxzaXplKG9mX2RhdGEpKSAhPSAgbnRvaGwobGVuX3B0clsyXSkpIHsKLSNlbHNlCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQogCQlpZiAoKChzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKilvZl9kYXRhKS0+dG90YWxzaXplICE9IG50b2hsKGxlbl9wdHJbMl0pKSB7CisjZWxzZQorCQlpZiAoYmUzMl90b19jcHUoZmR0X3RvdGFsc2l6ZShvZl9kYXRhKSkgIT0gIG50b2hsKGxlbl9wdHJbMl0pKSB7CiAjZW5kaWYKLQkJCXByaW50ZiAoIkVSUk9SOiBmbGF0IGRldmljZSB0cmVlIHNpemUgZG9lcyBub3QgYWdyZWUgd2l0aCBpbWFnZVxuIik7Ci0JCQlyZXR1cm47CisJCQlwdXRzICgiRVJST1I6IGZkdCBzaXplICE9IGltYWdlIHNpemUgLSAiCisJCQkJIm11c3QgUkVTRVQgdGhlIGJvYXJkIHRvIHJlY292ZXIuXG4iKTsKKwkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCX0KIAl9CiAjZW5kaWYKQEAgLTkxNiwxNSArOTI0LDYgQEAKIAkJaW5pdHJkX2VuZCA9IDA7CiAJfQogCi0JZGVidWcgKCIjIyBUcmFuc2ZlcnJpbmcgY29udHJvbCB0byBMaW51eCAoYXQgYWRkcmVzcyAlMDhseCkgLi4uXG4iLAotCQkodWxvbmcpa2VybmVsKTsKLQotCXNob3dfYm9vdF9wcm9ncmVzcyAoMTUpOwotCi0jaWYgZGVmaW5lZChDRkdfSU5JVF9SQU1fTE9DSykgJiYgIWRlZmluZWQoQ09ORklHX0U1MDApCi0JdW5sb2NrX3JhbV9pbl9jYWNoZSgpOwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCiAJLyogbW92ZSBvZl9mbGF0X3RyZWUgaWYgbmVlZGVkICovCiAJaWYgKG9mX2RhdGEpIHsKQEAgLTk0NCwzMiArOTQzLDQxIEBACiAJCW9mX2ZsYXRfdHJlZSA9IChjaGFyICopb2Zfc3RhcnQ7CiAJCXByaW50ZiAoIiAgIExvYWRpbmcgRGV2aWNlIFRyZWUgdG8gJTA4bHgsIGVuZCAlMDhseCAuLi4gIiwKIAkJCW9mX3N0YXJ0LCBvZl9zdGFydCArIG9mX2xlbiAtIDEpOwotCQllcnIgPSBmZHRfb3Blbl9pbnRvKCh2b2lkICopb2Zfc3RhcnQsICh2b2lkICopb2ZfZGF0YSwgb2ZfbGVuKTsKKwkJZXJyID0gZmR0X29wZW5faW50bygodm9pZCAqKW9mX2RhdGEsICh2b2lkICopb2Zfc3RhcnQsIG9mX2xlbik7CiAJCWlmIChlcnIgIT0gMCkgewotCQkJcHJpbnRmICgibGliZmR0OiAlcyAiIF9fRklMRV9fICIgJWRcbiIsIGZkdF9zdHJlcnJvcihlcnIpLCBfX0xJTkVfXyk7CisJCQlwdXRzICgiRVJST1I6IGZkdCBtb3ZlIGZhaWxlZCAtICIKKwkJCQkibXVzdCBSRVNFVCB0aGUgYm9hcmQgdG8gcmVjb3Zlci5cbiIpOworCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJfQotCQkvKgotCQkgKiBBZGQgdGhlIGNob3NlbiBub2RlIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGFkZCB0aGUgZW52IGFuZCBiZF90Ci0JCSAqIGlmIHRoZSB1c2VyIHdhbnRzIGl0ICh0aGUgbG9naWMgaXMgaW4gdGhlIHN1YnJvdXRpbmVzKS4KLQkJICovCi0JCWlmIChmZHRfY2hvc2VuKG9mX2ZsYXRfdHJlZSwgaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kLCAwKSA8IDApIHsKLQkJCQlwcmludGYoIkZhaWxlZCBjcmVhdGluZyB0aGUgL2Nob3NlbiBub2RlICgweCUwOFgpLCBhYm9ydGluZy5cbiIsIG9mX2ZsYXRfdHJlZSk7Ci0JCQkJcmV0dXJuOwotCQl9CisJfQorCS8qCisJICogQWRkIHRoZSBjaG9zZW4gbm9kZSBpZiBpdCBkb2Vzbid0IGV4aXN0LCBhZGQgdGhlIGVudiBhbmQgYmRfdAorCSAqIGlmIHRoZSB1c2VyIHdhbnRzIGl0ICh0aGUgbG9naWMgaXMgaW4gdGhlIHN1YnJvdXRpbmVzKS4KKwkgKi8KKwlpZiAoZmR0X2Nob3NlbihvZl9mbGF0X3RyZWUsIGluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCwgMCkgPCAwKSB7CisJCXB1dHMgKCJFUlJPUjogL2Nob3NlbiBub2RlIGNyZWF0ZSBmYWlsZWQgLSAiCisJCQkibXVzdCBSRVNFVCB0aGUgYm9hcmQgdG8gcmVjb3Zlci5cbiIpOworCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOworCX0KICNpZmRlZiBDT05GSUdfT0ZfSEFTX1VCT09UX0VOVgotCQlpZiAoZmR0X2VudihvZl9mbGF0X3RyZWUpIDwgMCkgewotCQkJCXByaW50ZigiRmFpbGVkIGNyZWF0aW5nIHRoZSAvdS1ib290LWVudiBub2RlLCBhYm9ydGluZy5cbiIpOwotCQkJCXJldHVybjsKLQkJfQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX09GX0hBU19CRF9UCi0JCWlmIChmZHRfYmRfdChvZl9mbGF0X3RyZWUpIDwgMCkgewotCQkJCXByaW50ZigiRmFpbGVkIGNyZWF0aW5nIHRoZSAvYmRfdCBub2RlLCBhYm9ydGluZy5cbiIpOwotCQkJCXJldHVybjsKLQkJfQotI2VuZGlmCisJaWYgKGZkdF9lbnYob2ZfZmxhdF90cmVlKSA8IDApIHsKKwkJcHV0cyAoIkVSUk9SOiAvdS1ib290LWVudiBub2RlIGNyZWF0ZSBmYWlsZWQgLSAiCisJCQkibXVzdCBSRVNFVCB0aGUgYm9hcmQgdG8gcmVjb3Zlci5cbiIpOworCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCX0KICNlbmRpZgorI2lmZGVmIENPTkZJR19PRl9IQVNfQkRfVAorCWlmIChmZHRfYmRfdChvZl9mbGF0X3RyZWUpIDwgMCkgeworCQlwdXRzICgiRVJST1I6IC9iZF90IG5vZGUgY3JlYXRlIGZhaWxlZCAtICIKKwkJCSJtdXN0IFJFU0VUIHRoZSBib2FyZCB0byByZWNvdmVyLlxuIik7CisJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX09GX0JPQVJEX1NFVFVQCisJLyogQ2FsbCB0aGUgYm9hcmQtc3BlY2lmaWMgZml4dXAgcm91dGluZSAqLworCWZ0X2JvYXJkX3NldHVwKG9mX2ZsYXRfdHJlZSwgZ2QtPmJkKTsKKyNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19PRl9MSUJGRFQgKi8KICNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpCiAJLyogbW92ZSBvZl9mbGF0X3RyZWUgaWYgbmVlZGVkICovCiAJaWYgKG9mX2RhdGEpIHsKQEAgLTk4OSw4ICs5OTcsMzYgQEAKIAkJCW9mX3N0YXJ0LCBvZl9zdGFydCArIG9mX2xlbiAtIDEpOwogCQltZW1tb3ZlICgodm9pZCAqKW9mX3N0YXJ0LCAodm9pZCAqKW9mX2RhdGEsIG9mX2xlbik7CiAJfQorCS8qCisJICogQ3JlYXRlIHRoZSAvY2hvc2VuIG5vZGUgYW5kIG1vZGlmeSB0aGUgYmxvYiB3aXRoIGJvYXJkIHNwZWNpZmljCisJICogdmFsdWVzIGFzIG5lZWRlZC4KKwkgKi8KKwlmdF9zZXR1cChvZl9mbGF0X3RyZWUsIGtiZCwgaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kKTsKKwkvKiBmdF9kdW1wX2Jsb2Iob2ZfZmxhdF90cmVlKTsgKi8KKyNlbmRpZgorCWRlYnVnICgiIyMgVHJhbnNmZXJyaW5nIGNvbnRyb2wgdG8gTGludXggKGF0IGFkZHJlc3MgJTA4bHgpIC4uLlxuIiwKKwkJKHVsb25nKWtlcm5lbCk7CisKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDE1KTsKKworI2lmIGRlZmluZWQoQ0ZHX0lOSVRfUkFNX0xPQ0spICYmICFkZWZpbmVkKENPTkZJR19FNTAwKQorCXVubG9ja19yYW1faW5fY2FjaGUoKTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKSB8fCBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisJaWYgKG9mX2ZsYXRfdHJlZSkgewkvKiBkZXZpY2UgdHJlZTsgYm9vdCBuZXcgc3R5bGUgKi8KKwkJLyoKKwkJICogTGludXggS2VybmVsIFBhcmFtZXRlcnMgKHBhc3NpbmcgZGV2aWNlIHRyZWUpOgorCQkgKiAgIHIzOiBwb2ludGVyIHRvIHRoZSBmZHQsIGZvbGxvd2VkIGJ5IHRoZSBib2FyZCBpbmZvIGRhdGEKKwkJICogICByNDogcGh5c2ljYWwgcG9pbnRlciB0byB0aGUga2VybmVsIGl0c2VsZgorCQkgKiAgIHI1OiBOVUxMCisJCSAqICAgcjY6IE5VTEwKKwkJICogICByNzogTlVMTAorCQkgKi8KKwkJKCprZXJuZWwpICgoYmRfdCAqKW9mX2ZsYXRfdHJlZSwgKHVsb25nKWtlcm5lbCwgMCwgMCwgMCk7CisJCS8qIGRvZXMgbm90IHJldHVybiAqLworCX0KKyNlbmRpZgogCS8qCiAJICogTGludXggS2VybmVsIFBhcmFtZXRlcnMgKHBhc3NpbmcgYm9hcmQgaW5mbyBkYXRhKToKIAkgKiAgIHIzOiBwdHIgdG8gYm9hcmQgaW5mbyBkYXRhCkBAIC05OTksNDYgKzEwMzUsOCBAQAogCSAqICAgcjY6IFN0YXJ0IG9mIGNvbW1hbmQgbGluZSBzdHJpbmcKIAkgKiAgIHI3OiBFbmQgICBvZiBjb21tYW5kIGxpbmUgc3RyaW5nCiAJICovCi0jaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKSB8fCBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCi0JaWYgKCFvZl9mbGF0X3RyZWUpCS8qIG5vIGRldmljZSB0cmVlOyBib290IG9sZCBzdHlsZSAqLwotI2VuZGlmCi0JCSgqa2VybmVsKSAoa2JkLCBpbml0cmRfc3RhcnQsIGluaXRyZF9lbmQsIGNtZF9zdGFydCwgY21kX2VuZCk7Ci0JCS8qIGRvZXMgbm90IHJldHVybiAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKSB8fCBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCi0JLyoKLQkgKiBMaW51eCBLZXJuZWwgUGFyYW1ldGVycyAocGFzc2luZyBkZXZpY2UgdHJlZSk6Ci0JICogICByMzogcHRyIHRvIE9GIGZsYXQgdHJlZSwgZm9sbG93ZWQgYnkgdGhlIGJvYXJkIGluZm8gZGF0YQotCSAqICAgcjQ6IHBoeXNpY2FsIHBvaW50ZXIgdG8gdGhlIGtlcm5lbCBpdHNlbGYKLQkgKiAgIHI1OiBOVUxMCi0JICogICByNjogTlVMTAotCSAqICAgcjc6IE5VTEwKLQkgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpCi0JZnRfc2V0dXAob2ZfZmxhdF90cmVlLCBrYmQsIGluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCk7Ci0JLyogZnRfZHVtcF9ibG9iKG9mX2ZsYXRfdHJlZSk7ICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCi0JaWYgKGZkdF9jaG9zZW4ob2ZfZmxhdF90cmVlLCBpbml0cmRfc3RhcnQsIGluaXRyZF9lbmQsIDApIDwgMCkgewotCQlwcmludGYoIkZhaWxlZCBjcmVhdGluZyB0aGUgL2Nob3NlbiBub2RlICgweCUwOFgpLCBhYm9ydGluZy5cbiIsIG9mX2ZsYXRfdHJlZSk7Ci0JCXJldHVybjsKLQl9Ci0jaWZkZWYgQ09ORklHX09GX0hBU19VQk9PVF9FTlYKLQlpZiAoZmR0X2VudihvZl9mbGF0X3RyZWUpIDwgMCkgewotCQlwcmludGYoIkZhaWxlZCBjcmVhdGluZyB0aGUgL3UtYm9vdC1lbnYgbm9kZSwgYWJvcnRpbmcuXG4iKTsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotI2lmZGVmIENPTkZJR19PRl9IQVNfQkRfVAotCWlmIChmZHRfYmRfdChvZl9mbGF0X3RyZWUpIDwgMCkgewotCQlwcmludGYoIkZhaWxlZCBjcmVhdGluZyB0aGUgL2JkX3Qgbm9kZSwgYWJvcnRpbmcuXG4iKTsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotI2VuZGlmIC8qIGlmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkgKi8KLQotCSgqa2VybmVsKSAoKGJkX3QgKilvZl9mbGF0X3RyZWUsICh1bG9uZylrZXJuZWwsIDAsIDAsIDApOwotI2VuZGlmCisJKCprZXJuZWwpIChrYmQsIGluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCwgY21kX3N0YXJ0LCBjbWRfZW5kKTsKKwkvKiBkb2VzIG5vdCByZXR1cm4gKi8KIH0KICNlbmRpZiAvKiBDT05GSUdfUFBDICovCiAKQEAgLTEyMTIsNyArMTIxMCw3IEBACiAjZW5kaWYKIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk9PVEQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JPT1REKQogaW50IGRvX2Jvb3RkIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlpbnQgcmNvZGUgPSAwOwpAQCAtMTI0MCw3ICsxMjM4LDcgQEAKIAogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JTUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lNSSkKIGludCBkb19pbWluZm8gKCBjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlpbnQJYXJnOwpAQCAtMTMwOCw5ICsxMzA2LDkgQEAKIAkiICAgICAgaW1hZ2UgY29udGVudHMgKG1hZ2ljIG51bWJlciwgaGVhZGVyIGFuZCBwYXlsb2FkIGNoZWNrc3VtcylcbiIKICk7CiAKLSNlbmRpZgkvKiBDRkdfQ01EX0lNSSAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JTUxTKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JTUxTKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogTGlzdCBhbGwgaW1hZ2VzIGZvdW5kIGluIGZsYXNoLgogICovCkBAIC0xMzY2LDIzICsxMzY0LDIzIEBACiAJIiAgICAtIFByaW50cyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW1hZ2VzIGZvdW5kIGF0IHNlY3RvclxuIgogCSIgICAgICBib3VuZGFyaWVzIGluIGZsYXNoLlxuIgogKTsKLSNlbmRpZgkvKiBDRkdfQ01EX0lNTFMgKi8KKyNlbmRpZgogCiB2b2lkCiBwcmludF9pbWFnZV9oZHIgKGltYWdlX2hlYWRlcl90ICpoZHIpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkgfHwgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKQorI2lmIGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAJdGltZV90IHRpbWVzdGFtcCA9ICh0aW1lX3QpbnRvaGwoaGRyLT5paF90aW1lKTsKIAlzdHJ1Y3QgcnRjX3RpbWUgdG07CiAjZW5kaWYKIAogCXByaW50ZiAoIiAgIEltYWdlIE5hbWU6ICAgJS4qc1xuIiwgSUhfTk1MRU4sIGhkci0+aWhfbmFtZSk7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkgfHwgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKQorI2lmIGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAJdG9fdG0gKHRpbWVzdGFtcCwgJnRtKTsKIAlwcmludGYgKCIgICBDcmVhdGVkOiAgICAgICU0ZC0lMDJkLSUwMmQgICUyZDolMDJkOiUwMmQgVVRDXG4iLAogCQl0bS50bV95ZWFyLCB0bS50bV9tb24sIHRtLnRtX21kYXksCiAJCXRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjKTsKLSNlbmRpZgkvKiBDRkdfQ01EX0RBVEUsIENPTkZJR19USU1FU1RBTVAgKi8KKyNlbmRpZgogCXB1dHMgKCIgICBJbWFnZSBUeXBlOiAgICIpOyBwcmludF90eXBlKGhkcik7CiAJcHJpbnRmICgiXG4gICBEYXRhIFNpemU6ICAgICVkIEJ5dGVzID0gIiwgbnRvaGwoaGRyLT5paF9zaXplKSk7CiAJcHJpbnRfc2l6ZSAobnRvaGwoaGRyLT5paF9zaXplKSwgIlxuIik7CkBAIC0xNTgxLDcgKzE1NzksNyBAQAogCSgqZW50cnlfcG9pbnQgKSAoIGdkLT5iZCApOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRUxGKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9FTEYpCiBzdGF0aWMgdm9pZAogZG9fYm9vdG1fdnh3b3JrcyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10sCiAJCSAgdWxvbmcgYWRkciwgdWxvbmcgKmxlbl9wdHIsIGludCB2ZXJpZnkpCkBAIC0xNjA3LDcgKzE2MDUsNyBAQAogCWxvY2FsX2FyZ3NbMV0gPSBzdHI7CS8qIGFuZCBwcm92aWRlIGl0IHZpYSB0aGUgYXJndW1lbnRzICovCiAJZG9fYm9vdGVsZihjbWR0cCwgMCwgMiwgbG9jYWxfYXJncyk7CiB9Ci0jZW5kaWYgLyogQ0ZHX0NNRF9FTEYgKi8KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0xZTlhLREkKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2NhY2hlLmMgYi9jb21tb24vY21kX2NhY2hlLmMKaW5kZXggNmMyNTBiYy4uNjc1ZDQzZiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9jYWNoZS5jCisrKyBiL2NvbW1vbi9jbWRfY2FjaGUuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NBQ0hFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9DQUNIRSkKIAogc3RhdGljIGludCBvbl9vZmYgKGNvbnN0IGNoYXIgKik7CiAKQEAgLTEwOSw0ICsxMDksNCBAQAogCSIgICAgLSBlbmFibGUgb3IgZGlzYWJsZSBkYXRhICh3cml0ZXRocm91Z2gpIGNhY2hlXG4iCiApOwogCi0jZW5kaWYJLyogQ0ZHX0NNRF9DQUNIRSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2NvbnNvbGUuYyBiL2NvbW1vbi9jbWRfY29uc29sZS5jCmluZGV4IDFiZDM3MDkuLjVlMGY5OTAgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfY29uc29sZS5jCisrKyBiL2NvbW1vbi9jbWRfY29uc29sZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGRldmljZXMuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NPTlNPTEUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NPTlNPTEUpCiAKIGV4dGVybiB2b2lkIF9kb19jb25pbmZvICh2b2lkKTsKIGludCBkb19jb25pbmZvIChjbWRfdGJsX3QgKiBjbWQsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQpAQCAtNjgsNCArNjgsNCBAQAogCSIiCiApOwogCi0jZW5kaWYgLyogQ0ZHX0NNRF9DT05TT0xFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZGF0ZS5jIGIvY29tbW9uL2NtZF9kYXRlLmMKaW5kZXggMzNkMmU1Ni4uNGE0MjUzNCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9kYXRlLmMKKysrIGIvY29tbW9uL2NtZF9kYXRlLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiBjb25zdCBjaGFyICp3ZWVrZGF5c1tdID0gewogCSJTdW4iLCAiTW9uIiwgIlR1ZXMiLCAiV2VkbmVzIiwgIlRodXJzIiwgIkZyaSIsICJTYXR1ciIsCkBAIC0yMTEsNCArMjExLDQgQEAKIAkiICAtIHdpdGggJ3Jlc2V0JyBhcmd1bWVudDogcmVzZXQgdGhlIFJUQ1xuIgogKTsKIAotI2VuZGlmCS8qIENGR19DTURfREFURSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2Rjci5jIGIvY29tbW9uL2NtZF9kY3IuYwppbmRleCA3MjIxYTg2Li4xMmZhOWRiIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2Rjci5jCisrKyBiL2NvbW1vbi9jbWRfZGNyLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxjb25maWcuaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR180eHgpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NFVEdFVERDUikKKyNpZiBkZWZpbmVkKENPTkZJR180eHgpICYmIGRlZmluZWQoQ09ORklHX0NNRF9TRVRHRVREQ1IpCiAKIHVuc2lnbmVkIGxvbmcgZ2V0X2RjciAodW5zaWduZWQgc2hvcnQpOwogdW5zaWduZWQgbG9uZyBzZXRfZGNyICh1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgbG9uZyk7CkBAIC0yNDYsNCArMjQ2LDQgQEAKIAkiYWRyX2Rjcm5bLmRhdF9kY3JuXSBvZmZzZXQgdmFsdWUgLSB3cml0ZSBvZmZzZXQgdG8gYWRyX2Rjcm4sIHdyaXRlIHZhbHVlIHRvIGRhdF9kY3JuLlxuIgogKTsKIAotI2VuZGlmIC8qIENPTkZJR180eHggJiBDRkdfQ01EX1NFVEdFVERDUiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2RpYWcuYyBiL2NvbW1vbi9jbWRfZGlhZy5jCmluZGV4IDQ1YzRiMzEuLmNiOTliNzcgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZGlhZy5jCisrKyBiL2NvbW1vbi9jbWRfZGlhZy5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPHBvc3QuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RJQUcpICYmIGRlZmluZWQoQ09ORklHX1BPU1QpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RJQUcpICYmIGRlZmluZWQoQ09ORklHX1BPU1QpCiAKIGludCBkb19kaWFnIChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CkBAIC03Nyw0ICs3Nyw0IEBACiAJIiAgICAgICAgIC0gcnVuIHNwZWNpZmllZCB0ZXN0c1xuIgogKTsKIAotI2VuZGlmIC8qIENGR19DTURfRElBRyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2Rpc3BsYXkuYyBiL2NvbW1vbi9jbWRfZGlzcGxheS5jCmluZGV4IGFiZWU4NDQuLmQxOWY0MTIgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZGlzcGxheS5jCisrKyBiL2NvbW1vbi9jbWRfZGlzcGxheS5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRElTUExBWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRElTUExBWSkKIAogI3VuZGVmIERFQlVHX0RJU1AKIApAQCAtNzksNCArNzksNCBAQAogCSIgICAgLSB3aXRob3V0IGFyZ3VtZW50czogY2xlYXIgZG90IG1hdHJpeCBkaXNwbGF5XG4iCiApOwogCi0jZW5kaWYJLyogQ0ZHX0NNRF9ESVNQTEFZICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZG9jLmMgYi9jb21tb24vY21kX2RvYy5jCmluZGV4IDk4MTRkNzUuLmQ2ZDNhZmYgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZG9jLmMKKysrIGIvY29tbW9uL2NtZF9kb2MuYwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmZ0bC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9kb2MyMDAwLmg+CkBAIC0xNjA4LDQgKzE2MDgsNCBAQAogCX0KIH0KIAotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9kdHQuYyBiL2NvbW1vbi9jbWRfZHR0LmMKaW5kZXggNGY3YjA0OS4uOGRhOTViZiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9kdHQuYworKysgYi9jb21tb24vY21kX2R0dC5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRFRUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EVFQpCiAKICNpbmNsdWRlIDxkdHQuaD4KICNpbmNsdWRlIDxpMmMuaD4KQEAgLTYxLDQgKzYxLDQgQEAKIAkgICIgICAgICAgIC0gUmVhZCB0ZW1wZXJhdHVyZSBmcm9tIGRpZ2l0YWwgdGhlcm1vbWV0ZXIgYW5kIHRoZXJtb3N0YXQuXG4iCiApOwogCi0jZW5kaWYgLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EVFQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9lZXByb20uYyBiL2NvbW1vbi9jbWRfZWVwcm9tLmMKaW5kZXggZDE1YTQxMi4uZTUwMDBlOSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9lZXByb20uYworKysgYi9jb21tb24vY21kX2VlcHJvbS5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGkyYy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRUVQUk9NKSB8fCBkZWZpbmVkKENGR19FTlZfSVNfSU5fRUVQUk9NKQorI2lmIGRlZmluZWQoQ0ZHX0VOVl9JU19JTl9FRVBST00pIHx8IGRlZmluZWQoQ09ORklHX0NNRF9FRVBST00pCiAKIGV4dGVybiB2b2lkIGVlcHJvbV9pbml0ICAodm9pZCk7CiBleHRlcm4gaW50ICBlZXByb21fcmVhZCAgKHVuc2lnbmVkIGRldl9hZGRyLCB1bnNpZ25lZCBvZmZzZXQsCkBAIC02Miw3ICs2Miw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0VFUFJPTSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRUVQUk9NKQogaW50IGRvX2VlcHJvbSAoIGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAljb25zdCBjaGFyICpjb25zdCBmbXQgPQpAQCAtMTEwLDcgKzExMCw3IEBACiAJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKIAlyZXR1cm4gMTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX0VFUFJPTSAqLworI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCkBAIC0xMjEsNyArMTIxLDcgQEAKICAqICAgMHgwMDAwMG54eCBmb3IgRUVQUk9NIGFkZHJlc3Mgc2VsZWN0b3JzIGFuZCBwYWdlIG51bWJlciBhdCBuLgogICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FRVBST00pIHx8IGRlZmluZWQoQ0ZHX0VOVl9JU19JTl9FRVBST00pCisjaWYgZGVmaW5lZChDRkdfRU5WX0lTX0lOX0VFUFJPTSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0VFUFJPTSkKIAogI2lmbmRlZiBDT05GSUdfU1BJCiAjaWYgIWRlZmluZWQoQ0ZHX0kyQ19FRVBST01fQUREUl9MRU4pIHx8IENGR19JMkNfRUVQUk9NX0FERFJfTEVOIDwgMSB8fCBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTiA+IDIKQEAgLTQyMiwxMCArNDIyLDExIEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLSNlbmRpZgkvKiBDRkdfQ01EX0VFUFJPTSAqLworI2VuZGlmCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FRVBST00pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0VFUFJPTSkKIAogI2lmZGVmIENGR19JMkNfTVVMVElfRUVQUk9NUwogVV9CT09UX0NNRCgKQEAgLTQ0NSw0ICs0NDYsNCBAQAogKTsKICNlbmRpZiAvKiBDRkdfSTJDX01VTFRJX0VFUFJPTVMgKi8KIAotI2VuZGlmCS8qIENGR19DTURfRUVQUk9NICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZWxmLmMgYi9jb21tb24vY21kX2VsZi5jCmluZGV4IDBlM2Q1NmYuLjYzYTU1OTMgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZWxmLmMKKysrIGIvY29tbW9uL2NtZF9lbGYuYwpAQCAtMjMsNyArMjMsNyBAQAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0VMRikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRUxGKQogCiAjaWZuZGVmIE1BWAogI2RlZmluZSBNQVgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQpAQCAtMTAxLDcgKzEwMSw3IEBACiAJZWxzZQogCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwgKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHRmdHAgdGhlIGltYWdlIG91cnNlbHZlcyBiZWZvcmUgc3RhcnRpbmcgKi8KIAogCWlmICgoYXJnYyA9PSAyKSAmJiAoc3RyY21wIChhcmd2WzFdLCAidGZ0cCIpID09IDApKSB7CkBAIC0zMjQsNCArMzI0LDQgQEAKIAkiIFthZGRyZXNzXSAtIGxvYWQgYWRkcmVzcyBvZiB2eFdvcmtzIEVMRiBpbWFnZS5cbiIKICk7CiAKLSNlbmRpZgkvKiBDRkdfQ01EX0VMRiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2V4dDIuYyBiL2NvbW1vbi9jbWRfZXh0Mi5jCmluZGV4IDk0YmQ5YjYuLjhiZDJiNDcgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZXh0Mi5jCisrKyBiL2NvbW1vbi9jbWRfZXh0Mi5jCkBAIC0zNSwxNCArMzUsMTQgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxwYXJ0Lmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FWFQyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9FWFQyKQogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxpbWFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGV4dDJmcy5oPgotI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpICYmIGRlZmluZWQoQ09ORklHX1VTQl9TVE9SQUdFKSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfVVNCKSAmJiBkZWZpbmVkKENPTkZJR19VU0JfU1RPUkFHRSkKICNpbmNsdWRlIDx1c2IuaD4KICNlbmRpZgogCkBAIC0yNjAsNCArMjYwLDQgQEAKIAkiICAgICAgdG8gYWRkcmVzcyAnYWRkcicgZnJvbSBleHQyIGZpbGVzeXN0ZW1cbiIKICk7CiAKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0VYVDIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9mYXQuYyBiL2NvbW1vbi9jbWRfZmF0LmMKaW5kZXggYWZhZjI5OS4uNTRmMGY5ZiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9mYXQuYworKysgYi9jb21tb24vY21kX2ZhdC5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXRhLmg+CiAjaW5jbHVkZSA8cGFydC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkFUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GQVQpCiAKICN1bmRlZglERUJVRwogCkBAIC0zMjQsNCArMzI0LDQgQEAKIH0KICNlbmRpZgkvKiBOT1RfSU1QTEVNRU5URURfWUVUICovCiAKLSNlbmRpZgkvKiBDRkdfQ01EX0ZBVCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2ZkYy5jIGIvY29tbW9uL2NtZF9mZGMuYwppbmRleCAwM2Y0Y2U2Li43MzQ5NDEyIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2ZkYy5jCisrKyBiL2NvbW1vbi9jbWRfZmRjLmMKQEAgLTQ3LDExICs0NywxMSBAQAogI2VuZGlmCiAKIAotLyojaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkgKi8KKy8qI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSAqLwogLyojaW5jbHVkZSA8cnRjLmg+ICovCiAvKiNlbmRpZiAqLwogCi0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZEQykgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZEQykgfHwgZGVmaW5lZChDT05GSUdfQ01EX0ZET1MpCiAKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtNzA3LDkgKzcwNyw5IEBACiAKIAlyZXR1cm4gVFJVRTsKIH0KLSNlbmRpZiAvKiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRDKXx8KENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykpKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkRPUykKIAogLyogTG93IGxldmVsIGZ1bmN0aW9ucyBmb3IgdGhlIEZsb3BweS1ET1MgbGF5ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCkBAIC03NzIsOSArNzcyLDkgQEAKIAogCXJldHVybiAoZmRjX3JlYWRfZGF0YSAoYnVmZmVyLCBsZW4sIHBDTUQsIHBGRykpOwogfQotI2VuZGlmICAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GREMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZEQykKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBtYWluIHJvdXRpbmUgZG9fZmRjYm9vdAogICovCkBAIC04ODAsMTMgKzg4MCwxMyBAQAogfQogCiAKLSNlbmRpZiAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZEQyAqLworI2VuZGlmCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GREMpCiAKIFVfQk9PVF9DTUQoCiAJZmRjYm9vdCwJMywJMSwJZG9fZmRjYm9vdCwKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZmRvcy5jIGIvY29tbW9uL2NtZF9mZG9zLmMKaW5kZXggZGMwMmIzNS4uZjlkYTk4ZCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9mZG9zLmMKKysrIGIvY29tbW9uL2NtZF9mZG9zLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8ZmRjLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GRE9TKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBkb19mZG9zYm9vdCAtLQpAQCAtMTU0LDQgKzE1NCw0IEBACiAJIltkaXJlY3RvcnldXG4iCiApOwogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZmR0LmMgYi9jb21tb24vY21kX2ZkdC5jCmluZGV4IDA4ZmUzNTEuLjU3MWI4ZjEgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZmR0LmMKKysrIGIvY29tbW9uL2NtZF9mZHQuYwpAQCAtMzcsNDYgKzM3LDMyIEBACiAjaW5jbHVkZSA8ZmR0X3N1cHBvcnQuaD4KIAogI2RlZmluZSBNQVhfTEVWRUwJMzIJCS8qIGhvdyBkZWVwbHkgbmVzdGVkIHdlIHdpbGwgZ28gKi8KLSNkZWZpbmUgU0NSQVRDSFBBRAkxMDI0CS8qIGJ5dGVzIG9mIHNjcmF0Y2hwYWQgbWVtb3J5ICovCisjZGVmaW5lIFNDUkFUQ0hQQUQJMTAyNAkJLyogYnl0ZXMgb2Ygc2NyYXRjaHBhZCBtZW1vcnkgKi8KIAogLyoKICAqIEdsb2JhbCBkYXRhIChmb3IgdGhlIGdkLT5iZCkKICAqLwogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKLS8qCi0gKiBTY3JhdGNocGFkIG1lbW9yeS4KLSAqLwotc3RhdGljIGNoYXIgZGF0YVtTQ1JBVENIUEFEXTsKLQotCi0vKgotICogRnVuY3Rpb24gcHJvdG90eXBlcy9kZWNsYXJhdGlvbnMuCi0gKi8KIHN0YXRpYyBpbnQgZmR0X3ZhbGlkKHZvaWQpOwotc3RhdGljIHZvaWQgcHJpbnRfZGF0YShjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKLQorc3RhdGljIGludCBmZHRfcGFyc2VfcHJvcChjaGFyICpwYXRocCwgY2hhciAqcHJvcCwgY2hhciAqbmV3dmFsLAorCWNoYXIgKmRhdGEsIGludCAqbGVuKTsKK3N0YXRpYyBpbnQgZmR0X3ByaW50KGNoYXIgKnBhdGhwLCBjaGFyICpwcm9wLCBpbnQgZGVwdGgpOwogCiAvKgogICogRmxhdHRlbmVkIERldmljZSBUcmVlIGNvbW1hbmQsIHNlZSB0aGUgaGVscCBmb3IgcGFyYW1ldGVyIGRlZmluaXRpb25zLgogICovCiBpbnQgZG9fZmR0IChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7Ci0JY2hhcgkJb3A7Ci0KIAlpZiAoYXJnYyA8IDIpIHsKIAkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKIAkJcmV0dXJuIDE7CiAJfQogCi0JLyoKLQkgKiBGaWd1cmUgb3V0IHdoaWNoIHN1YmNvbW1hbmQgd2FzIGdpdmVuCi0JICovCi0Jb3AgPSBhcmd2WzFdWzBdOwogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCSAqIFNldCB0aGUgYWRkcmVzcyBvZiB0aGUgZmR0CiAJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCWlmIChvcCA9PSAnYScpIHsKKwlpZiAoYXJndlsxXVswXSA9PSAnYScpIHsKIAkJLyoKIAkJICogU2V0IHRoZSBhZGRyZXNzIFthbmQgbGVuZ3RoXSBvZiB0aGUgZmR0LgogCQkgKi8KQEAgLTk0LDcgKzgwLDggQEAKIAkJCSAqLwogCQkJbGVuID0gIHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKIAkJCWlmIChsZW4gPCBmZHRfdG90YWxzaXplKGZkdCkpIHsKLQkJCQlwcmludGYgKCJOZXcgbGVuZ3RoICVkIDwgZXhpc3RpbmcgbGVuZ3RoICVkLCBpZ25vcmluZy5cbiIsCisJCQkJcHJpbnRmICgiTmV3IGxlbmd0aCAlZCA8IGV4aXN0aW5nIGxlbmd0aCAlZCwgIgorCQkJCQkiaWdub3JpbmcuXG4iLAogCQkJCQlsZW4sIGZkdF90b3RhbHNpemUoZmR0KSk7CiAJCQl9IGVsc2UgewogCQkJCS8qCkBAIC0xMDIsNyArODksOCBAQAogCQkJCSAqLwogCQkJCWVyciA9IGZkdF9vcGVuX2ludG8oZmR0LCBmZHQsIGxlbik7CiAJCQkJaWYgKGVyciAhPSAwKSB7Ci0JCQkJCXByaW50ZiAoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCQkJcHJpbnRmICgibGliZmR0IGZkdF9vcGVuX2ludG8oKTogJXNcbiIsCisJCQkJCQlmZHRfc3RyZXJyb3IoZXJyKSk7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0xMTAsMTIgKzk4LDEyIEBACiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJICogTW92ZSB0aGUgZmR0CiAJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCX0gZWxzZSBpZiAob3AgPT0gJ20nKSB7CisJfSBlbHNlIGlmICgoYXJndlsxXVswXSA9PSAnbScpICYmIChhcmd2WzFdWzFdID09ICdvJykpIHsKIAkJc3RydWN0IGZkdF9oZWFkZXIgKm5ld2FkZHI7CiAJCWludCAgbGVuOwogCQlpbnQgIGVycjsKIAotCQlpZiAoYXJnYyAhPSA1KSB7CisJCWlmIChhcmdjIDwgNCkgewogCQkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKIAkJCXJldHVybiAxOwogCQl9CkBAIC0xMjgsMTIgKzExNiwyMiBAQAogCQkJcmV0dXJuIDE7CiAJCX0KIAotCQluZXdhZGRyID0gKHN0cnVjdCBmZHRfaGVhZGVyICopc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOwotCQlsZW4gICAgID0gIHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNF0sIE5VTEwsIDE2KTsKLQkJaWYgKGxlbiA8IGZkdF90b3RhbHNpemUoZmR0KSkgewotCQkJcHJpbnRmICgiTmV3IGxlbmd0aCAlZCA8IGV4aXN0aW5nIGxlbmd0aCAlZCwgYWJvcnRpbmcuXG4iLAotCQkJCWxlbiwgZmR0X3RvdGFsc2l6ZShmZHQpKTsKLQkJCXJldHVybiAxOworCQluZXdhZGRyID0gKHN0cnVjdCBmZHRfaGVhZGVyICopc2ltcGxlX3N0cnRvdWwoYXJndlszXSxOVUxMLDE2KTsKKworCQkvKgorCQkgKiBJZiB0aGUgdXNlciBzcGVjaWZpZXMgYSBsZW5ndGgsIHVzZSB0aGF0LiAgT3RoZXJ3aXNlIHVzZSB0aGUKKwkJICogY3VycmVudCBsZW5ndGguCisJCSAqLworCQlpZiAoYXJnYyA8PSA0KSB7CisJCQlsZW4gPSBmZHRfdG90YWxzaXplKGZkdCk7CisJCX0gZWxzZSB7CisJCQlsZW4gPSBzaW1wbGVfc3RydG91bChhcmd2WzRdLCBOVUxMLCAxNik7CisJCQlpZiAobGVuIDwgZmR0X3RvdGFsc2l6ZShmZHQpKSB7CisJCQkJcHJpbnRmICgiTmV3IGxlbmd0aCAweCVYIDwgZXhpc3RpbmcgbGVuZ3RoICIKKwkJCQkJIjB4JVgsIGFib3J0aW5nLlxuIiwKKwkJCQkJbGVuLCBmZHRfdG90YWxzaXplKGZkdCkpOworCQkJCXJldHVybiAxOworCQkJfQogCQl9CiAKIAkJLyoKQEAgLTE0MSwyNiArMTM5LDU5IEBACiAJCSAqLwogCQllcnIgPSBmZHRfb3Blbl9pbnRvKGZkdCwgbmV3YWRkciwgbGVuKTsKIAkJaWYgKGVyciAhPSAwKSB7Ci0JCQlwcmludGYgKCJsaWJmZHQ6ICVzXG4iLCBmZHRfc3RyZXJyb3IoZXJyKSk7CisJCQlwcmludGYgKCJsaWJmZHQgZmR0X29wZW5faW50bygpOiAlc1xuIiwKKwkJCQlmZHRfc3RyZXJyb3IoZXJyKSk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCQlmZHQgPSBuZXdhZGRyOwogCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBhIG5vZGUgaW4gdGhlIGZkdC4KKwkgKiBNYWtlIGEgbmV3IG5vZGUKIAkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JfSBlbHNlIGlmIChvcCA9PSAncycpIHsKKwl9IGVsc2UgaWYgKChhcmd2WzFdWzBdID09ICdtJykgJiYgKGFyZ3ZbMV1bMV0gPT0gJ2snKSkgewogCQljaGFyICpwYXRocDsJCS8qIHBhdGggKi8KLQkJY2hhciAqcHJvcDsJCQkvKiBwcm9wZXJ0eSAqLwotCQlzdHJ1Y3QgZmR0X3Byb3BlcnR5ICpub2RlcDsJLyogbm9kZSBzdHJ1Y3QgcG9pbnRlciAqLwotCQljaGFyICpuZXd2YWw7CQkvKiB2YWx1ZSBmcm9tIHRoZSB1c2VyIChhcyBhIHN0cmluZykgKi8KLQkJY2hhciAqdnA7CQkJLyogdGVtcG9yYXJ5IHZhbHVlIHBvaW50ZXIgKi8KLQkJY2hhciAqY3A7CQkJLyogdGVtcG9yYXJ5IGNoYXIgcG9pbnRlciAqLworCQljaGFyICpub2RlcDsJCS8qIG5ldyBub2RlIHRvIGFkZCAqLwogCQlpbnQgIG5vZGVvZmZzZXQ7CS8qIG5vZGUgb2Zmc2V0IGZyb20gbGliZmR0ICovCi0JCWludCAgbGVuOwkJCS8qIG5ldyBsZW5ndGggb2YgdGhlIHByb3BlcnR5ICovCi0JCWludCAgb2xkbGVuOwkJLyogb3JpZ2luYWwgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSAqLwotCQl1bnNpZ25lZCBsb25nIHRtcDsJLyogaG9sZHMgY29udmVydGVkIHZhbHVlcyAqLwotCQlpbnQgIHJldDsJCQkvKiByZXR1cm4gdmFsdWUgKi8KKwkJaW50ICBlcnI7CisKKwkJLyoKKwkJICogUGFyYW1ldGVyczogTm9kZSBwYXRoLCBuZXcgbm9kZSB0byBiZSBhcHBlbmRlZCB0byB0aGUgcGF0aC4KKwkJICovCisJCWlmIChhcmdjIDwgNCkgeworCQkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJcGF0aHAgPSBhcmd2WzJdOworCQlub2RlcCA9IGFyZ3ZbM107CisKKwkJbm9kZW9mZnNldCA9IGZkdF9maW5kX25vZGVfYnlfcGF0aCAoZmR0LCBwYXRocCk7CisJCWlmIChub2Rlb2Zmc2V0IDwgMCkgeworCQkJLyoKKwkJCSAqIE5vdCBmb3VuZCBvciBzb21ldGhpbmcgZWxzZSBiYWQgaGFwcGVuZWQuCisJCQkgKi8KKwkJCXByaW50ZiAoImxpYmZkdCBmZHRfZmluZF9ub2RlX2J5X3BhdGgoKSByZXR1cm5lZCAlc1xuIiwKKwkJCQlmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZXJyID0gZmR0X2FkZF9zdWJub2RlKGZkdCwgbm9kZW9mZnNldCwgbm9kZXApOworCQlpZiAoZXJyIDwgMCkgeworCQkJcHJpbnRmICgibGliZmR0IGZkdF9hZGRfc3Vibm9kZSgpOiAlc1xuIiwKKwkJCQlmZHRfc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU2V0IHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IGluIHRoZSBmZHQuCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCX0gZWxzZSBpZiAoYXJndlsxXVswXSA9PSAncycpIHsKKwkJY2hhciAqcGF0aHA7CQkvKiBwYXRoICovCisJCWNoYXIgKnByb3A7CQkvKiBwcm9wZXJ0eSAqLworCQljaGFyICpuZXd2YWw7CQkvKiB2YWx1ZSBmcm9tIHRoZSB1c2VyIChhcyBhIHN0cmluZykgKi8KKwkJaW50ICBub2Rlb2Zmc2V0OwkvKiBub2RlIG9mZnNldCBmcm9tIGxpYmZkdCAqLworCQlzdGF0aWMgY2hhciBkYXRhW1NDUkFUQ0hQQURdOwkvKiBzdG9yYWdlIGZvciB0aGUgcHJvcGVydHkgKi8KKwkJaW50ICBsZW47CQkvKiBuZXcgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSAqLworCQlpbnQgIHJldDsJCS8qIHJldHVybiB2YWx1ZSAqLwogCiAJCS8qCiAJCSAqIFBhcmFtZXRlcnM6IE5vZGUgcGF0aCwgcHJvcGVydHksIHZhbHVlLgpAQCAtMTc0LDEyMSArMjA1LDM4IEBACiAJCXByb3AgICA9IGFyZ3ZbM107CiAJCW5ld3ZhbCA9IGFyZ3ZbNF07CiAKLQkJaWYgKHN0cmNtcChwYXRocCwgIi8iKSA9PSAwKSB7Ci0JCQlub2Rlb2Zmc2V0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCW5vZGVvZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZkdCwgcGF0aHApOwotCQkJaWYgKG5vZGVvZmZzZXQgPCAwKSB7Ci0JCQkJLyoKLQkJCSAJICogTm90IGZvdW5kIG9yIHNvbWV0aGluZyBlbHNlIGJhZCBoYXBwZW5lZC4KLQkJCSAJICovCi0JCQkJcHJpbnRmICgibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KKwkJbm9kZW9mZnNldCA9IGZkdF9maW5kX25vZGVfYnlfcGF0aCAoZmR0LCBwYXRocCk7CisJCWlmIChub2Rlb2Zmc2V0IDwgMCkgeworCQkJLyoKKwkJCSAqIE5vdCBmb3VuZCBvciBzb21ldGhpbmcgZWxzZSBiYWQgaGFwcGVuZWQuCisJCQkgKi8KKwkJCXByaW50ZiAoImxpYmZkdCBmZHRfZmluZF9ub2RlX2J5X3BhdGgoKSByZXR1cm5lZCAlc1xuIiwKKwkJCQlmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOworCQkJcmV0dXJuIDE7CiAJCX0KLQkJbm9kZXAgPSBmZHRfZ2V0cHJvcCAoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLCAmb2xkbGVuKTsKLQkJaWYgKG9sZGxlbiA8IDApIHsKLQkJCXByaW50ZiAoImxpYmZkdCAlc1xuIiwgZmR0X3N0cmVycm9yKG9sZGxlbikpOwotCQkJcmV0dXJuIDE7Ci0JCX0gZWxzZSBpZiAob2xkbGVuID09IDApIHsKLQkJCS8qCi0JCQkgKiBUaGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcyBubyB2YWx1ZQotCQkJICovCi0JCQlwcmludGYoIiVzIGhhcyBubyB2YWx1ZSwgY2Fubm90IHNldCBvbmUgKHlldCkuXG4iLCBwcm9wKTsKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIENvbnZlcnQgdGhlIG5ldyBwcm9wZXJ0eQotCQkJICovCi0JCQl2cCA9IGRhdGE7Ci0JCQlpZiAoKm5ld3ZhbCA9PSAnPCcpIHsKLQkJCQkvKgotCQkJCSAqIEJpZ2dlciB2YWx1ZXMgdGhhbiBieXRlcy4KLQkJCQkgKi8KLQkJCQlsZW4gPSAwOwotCQkJCW5ld3ZhbCsrOwotCQkJCXdoaWxlICgoKm5ld3ZhbCAhPSAnPicpICYmICgqbmV3dmFsICE9ICdcMCcpKSB7Ci0JCQkJCWNwID0gbmV3dmFsOwotCQkJCQl0bXAgPSBzaW1wbGVfc3RydG91bChjcCwgJm5ld3ZhbCwgMTYpOwotCQkJCQlpZiAoKG5ld3ZhbCAtIGNwKSA8PSAyKSB7Ci0JCQkJCQkqdnAgPSB0bXAgJiAweEZGOwotCQkJCQkJdnAgICs9IDE7Ci0JCQkJCQlsZW4gKz0gMTsKLQkJCQkJfSBlbHNlIGlmICgobmV3dmFsIC0gY3ApIDw9IDQpIHsKLQkJCQkJCSoodWludDE2X3QgKil2cCA9IF9fY3B1X3RvX2JlMTYodG1wKTsKLQkJCQkJCXZwICArPSAyOwotCQkJCQkJbGVuICs9IDI7Ci0JCQkJCX0gZWxzZSBpZiAoKG5ld3ZhbCAtIGNwKSA8PSA4KSB7Ci0JCQkJCQkqKHVpbnQzMl90ICopdnAgPSBfX2NwdV90b19iZTMyKHRtcCk7Ci0JCQkJCQl2cCAgKz0gNDsKLQkJCQkJCWxlbiArPSA0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJpbnRmKCJTb3JyeSwgSSBjb3VsZCBub3QgY29udmVydCBcIiVzXCJcbiIsIGNwKTsKLQkJCQkJCXJldHVybiAxOwotCQkJCQl9Ci0JCQkJCXdoaWxlICgqbmV3dmFsID09ICcgJykKLQkJCQkJCW5ld3ZhbCsrOwotCQkJCX0KLQkJCQlpZiAoKm5ld3ZhbCAhPSAnPicpIHsKLQkJCQkJcHJpbnRmKCJVbmV4cGVjdGVkIGNoYXJhY3RlciAnJWMnXG4iLCAqbmV3dmFsKTsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICgqbmV3dmFsID09ICdbJykgewotCQkJCS8qCi0JCQkJICogQnl0ZSBzdHJlYW0uICBDb252ZXJ0IHRoZSB2YWx1ZXMuCi0JCQkJICovCi0JCQkJbGVuID0gMDsKLQkJCQluZXd2YWwrKzsKLQkJCQl3aGlsZSAoKCpuZXd2YWwgIT0gJ10nKSAmJiAoKm5ld3ZhbCAhPSAnXDAnKSkgewotCQkJCQl0bXAgPSBzaW1wbGVfc3RydG91bChuZXd2YWwsICZuZXd2YWwsIDE2KTsKLQkJCQkJKnZwKysgPSB0bXAgJiAweEZGOwotCQkJCQlsZW4rKzsKLQkJCQkJd2hpbGUgKCpuZXd2YWwgPT0gJyAnKQotCQkJCQkJbmV3dmFsKys7Ci0JCQkJfQotCQkJCWlmICgqbmV3dmFsICE9ICddJykgewotCQkJCQlwcmludGYoIlVuZXhwZWN0ZWQgY2hhcmFjdGVyICclYydcbiIsICpuZXd2YWwpOwotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogQXNzdW1lIGl0IGlzIGEgc3RyaW5nLiAgQ29weSBpdCBpbnRvIG91ciBkYXRhIGFyZWEgZm9yCi0JCQkJICogY29udmVuaWVuY2UgKGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgJ1wwJykuCi0JCQkJICovCi0JCQkJbGVuID0gc3RybGVuKG5ld3ZhbCkgKyAxOwotCQkJCXN0cmNweShkYXRhLCBuZXd2YWwpOwotCQkJfQorCQlyZXQgPSBmZHRfcGFyc2VfcHJvcChwYXRocCwgcHJvcCwgbmV3dmFsLCBkYXRhLCAmbGVuKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldDsKIAotCQkJcmV0ID0gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLCBkYXRhLCBsZW4pOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlwcmludGYgKCJsaWJmZHQgJXNcbiIsIGZkdF9zdHJlcnJvcihyZXQpKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KKwkJcmV0ID0gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLCBkYXRhLCBsZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRmICgibGliZmR0IGZkdF9zZXRwcm9wKCk6ICVzXG4iLCBmZHRfc3RyZXJyb3IocmV0KSk7CisJCQlyZXR1cm4gMTsKIAkJfQogCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJICogUHJpbnQgKHJlY3Vyc2l2ZSkgLyBMaXN0IChzaW5nbGUgbGV2ZWwpCiAJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCX0gZWxzZSBpZiAoKG9wID09ICdwJykgfHwgKG9wID09ICdsJykpIHsKLQkJLyoKLQkJICogUmVjdXJzaXZlbHkgcHJpbnQgKGEgcG9ydGlvbiBvZikgdGhlIGZkdC4KLQkJICovCi0JCXN0YXRpYyBpbnQgb2Zmc3RhY2tbTUFYX0xFVkVMXTsKLQkJc3RhdGljIGNoYXIgdGFic1tNQVhfTEVWRUwrMV0gPSAiXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCI7CisJfSBlbHNlIGlmICgoYXJndlsxXVswXSA9PSAncCcpIHx8IChhcmd2WzFdWzBdID09ICdsJykpIHsKIAkJaW50IGRlcHRoID0gTUFYX0xFVkVMOwkvKiBob3cgZGVlcCB0byBwcmludCAqLwogCQljaGFyICpwYXRocDsJCS8qIHBhdGggKi8KLQkJY2hhciAqcHJvcDsJCQkvKiBwcm9wZXJ0eSAqLwotCQl2b2lkICpub2RlcDsJCS8qIHByb3BlcnR5IG5vZGUgcG9pbnRlciAqLwotCQlpbnQgIG5vZGVvZmZzZXQ7CS8qIG5vZGUgb2Zmc2V0IGZyb20gbGliZmR0ICovCi0JCWludCAgbmV4dG9mZnNldDsJLyogbmV4dCBub2RlIG9mZnNldCBmcm9tIGxpYmZkdCAqLwotCQl1aW50MzJfdCB0YWc7CQkvKiB0YWcgKi8KLQkJaW50ICBsZW47CQkJLyogbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSAqLwotCQlpbnQgIGxldmVsID0gMDsJCS8qIGtlZXAgdHJhY2sgb2YgbmVzdGluZyBsZXZlbCAqLworCQljaGFyICpwcm9wOwkJLyogcHJvcGVydHkgKi8KKwkJaW50ICByZXQ7CQkvKiByZXR1cm4gdmFsdWUgKi8KIAogCQkvKgogCQkgKiBsaXN0IGlzIGFuIGFsaWFzIGZvciBwcmludCwgYnV0IGxpbWl0ZWQgdG8gMSBsZXZlbAogCQkgKi8KLQkJaWYgKG9wID09ICdsJykgeworCQlpZiAoYXJndlsxXVswXSA9PSAnbCcpIHsKIAkJCWRlcHRoID0gMTsKIAkJfQogCkBAIC0zMDIsOTkgKzI1MCwxNCBAQAogCQllbHNlCiAJCQlwcm9wID0gTlVMTDsKIAotCQlpZiAoc3RyY21wKHBhdGhwLCAiLyIpID09IDApIHsKLQkJCW5vZGVvZmZzZXQgPSAwOwotCQkJcHJpbnRmKCIvIik7Ci0JCX0gZWxzZSB7Ci0JCQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmZHQsIHBhdGhwKTsKLQkJCWlmIChub2Rlb2Zmc2V0IDwgMCkgewotCQkJCS8qCi0JCQkJICogTm90IGZvdW5kIG9yIHNvbWV0aGluZyBlbHNlIGJhZCBoYXBwZW5lZC4KLQkJCQkgKi8KLQkJCQlwcmludGYgKCJsaWJmZHQgJXNcbiIsIGZkdF9zdHJlcnJvcihub2Rlb2Zmc2V0KSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJICogVGhlIHVzZXIgcGFzc2VkIGluIGEgcHJvcGVydHkgYXMgd2VsbCBhcyBub2RlIHBhdGguICBQcmludCBvbmx5Ci0JCSAqIHRoZSBnaXZlbiBwcm9wZXJ0eSBhbmQgdGhlbiByZXR1cm4uCi0JCSAqLwotCQlpZiAocHJvcCkgewotCQkJbm9kZXAgPSBmZHRfZ2V0cHJvcCAoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLCAmbGVuKTsKLQkJCWlmIChsZW4gPT0gMCkgewotCQkJCXByaW50ZigiJXMgJXNcbiIsIHBhdGhwLCBwcm9wKTsJLyogbm8gcHJvcGVydHkgdmFsdWUgKi8KLQkJCQlyZXR1cm4gMDsKLQkJCX0gZWxzZSBpZiAobGVuID4gMCkgewotCQkJCXByaW50ZigiJXM9IiwgcHJvcCk7Ci0JCQkJcHJpbnRfZGF0YSAobm9kZXAsIGxlbik7Ci0JCQkJcHJpbnRmKCJcbiIpOwotCQkJCXJldHVybiAwOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGYgKCJsaWJmZHQgJXNcbiIsIGZkdF9zdHJlcnJvcihsZW4pKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFRoZSB1c2VyIHBhc3NlZCBpbiBhIG5vZGUgcGF0aCBhbmQgbm8gcHJvcGVydHksIHByaW50IHRoZSBub2RlCi0JCSAqIGFuZCBhbGwgc3Vibm9kZXMuCi0JCSAqLwotCQlvZmZzdGFja1swXSA9IG5vZGVvZmZzZXQ7Ci0KLQkJd2hpbGUobGV2ZWwgPj0gMCkgewotCQkJdGFnID0gZmR0X25leHRfdGFnKGZkdCwgbm9kZW9mZnNldCwgJm5leHRvZmZzZXQsICZwYXRocCk7Ci0JCQlzd2l0Y2godGFnKSB7Ci0JCQljYXNlIEZEVF9CRUdJTl9OT0RFOgotCQkJCWlmKGxldmVsIDw9IGRlcHRoKQotCQkJCQlwcmludGYoIiVzJXMge1xuIiwgJnRhYnNbTUFYX0xFVkVMIC0gbGV2ZWxdLCBwYXRocCk7Ci0JCQkJbGV2ZWwrKzsKLQkJCQlvZmZzdGFja1tsZXZlbF0gPSBub2Rlb2Zmc2V0OwotCQkJCWlmIChsZXZlbCA+PSBNQVhfTEVWRUwpIHsKLQkJCQkJcHJpbnRmKCJBYWFpaWkgPHNwbGF0PiBuZXN0ZWQgdG9vIGRlZXAuXG4iKTsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBGRFRfRU5EX05PREU6Ci0JCQkJbGV2ZWwtLTsKLQkJCQlpZihsZXZlbCA8PSBkZXB0aCkKLQkJCQkJcHJpbnRmKCIlc307XG4iLCAmdGFic1tNQVhfTEVWRUwgLSBsZXZlbF0pOwotCQkJCWlmIChsZXZlbCA9PSAwKSB7Ci0JCQkJCWxldmVsID0gLTE7CQkvKiBleGl0IHRoZSBsb29wICovCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBGRFRfUFJPUDoKLQkJCQlub2RlcCA9IGZkdF9nZXRwcm9wIChmZHQsIG9mZnN0YWNrW2xldmVsXSwgcGF0aHAsICZsZW4pOwotCQkJCWlmIChsZW4gPCAwKSB7Ci0JCQkJCXByaW50ZiAoImxpYmZkdCAlc1xuIiwgZmR0X3N0cmVycm9yKGxlbikpOwotCQkJCQlyZXR1cm4gMTsKLQkJCQl9IGVsc2UgaWYgKGxlbiA9PSAwKSB7Ci0JCQkJCS8qIHRoZSBwcm9wZXJ0eSBoYXMgbm8gdmFsdWUgKi8KLQkJCQkJaWYobGV2ZWwgPD0gZGVwdGgpCi0JCQkJCQlwcmludGYoIiVzJXM7XG4iLCAmdGFic1tNQVhfTEVWRUwgLSBsZXZlbF0sIHBhdGhwKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZihsZXZlbCA8PSBkZXB0aCkgewotCQkJCQkJcHJpbnRmKCIlcyVzPSIsICZ0YWJzW01BWF9MRVZFTCAtIGxldmVsXSwgcGF0aHApOwotCQkJCQkJcHJpbnRfZGF0YSAobm9kZXAsIGxlbik7Ci0JCQkJCQlwcmludGYoIjtcbiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBGRFRfTk9QOgotCQkJCWJyZWFrOwotCQkJY2FzZSBGRFRfRU5EOgotCQkJCXJldHVybiAxOwotCQkJZGVmYXVsdDoKLQkJCQlpZihsZXZlbCA8PSBkZXB0aCkKLQkJCQkJcHJpbnRmKCJVbmtub3duIHRhZyAweCUwOFhcbiIsIHRhZyk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQlub2Rlb2Zmc2V0ID0gbmV4dG9mZnNldDsKLQkJfQorCQlyZXQgPSBmZHRfcHJpbnQocGF0aHAsIHByb3AsIGRlcHRoKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldDsKIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCSAqIFJlbW92ZSBhIHByb3BlcnR5L25vZGUKIAkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JfSBlbHNlIGlmIChvcCA9PSAncicpIHsKKwl9IGVsc2UgaWYgKGFyZ3ZbMV1bMF0gPT0gJ3InKSB7CiAJCWludCAgbm9kZW9mZnNldDsJLyogbm9kZSBvZmZzZXQgZnJvbSBsaWJmZHQgKi8KIAkJaW50ICBlcnI7CiAKQEAgLTQwMiwxNyArMjY1LDE0IEBACiAJCSAqIEdldCB0aGUgcGF0aC4gIFRoZSByb290IG5vZGUgaXMgYW4gb2RkYmFsbCwgdGhlIG9mZnNldAogCQkgKiBpcyB6ZXJvIGFuZCBoYXMgbm8gbmFtZS4KIAkJICovCi0JCWlmIChzdHJjbXAoYXJndlsyXSwgIi8iKSA9PSAwKSB7Ci0JCQlub2Rlb2Zmc2V0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCW5vZGVvZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZkdCwgYXJndlsyXSk7Ci0JCQlpZiAobm9kZW9mZnNldCA8IDApIHsKLQkJCQkvKgotCQkJCSAqIE5vdCBmb3VuZCBvciBzb21ldGhpbmcgZWxzZSBiYWQgaGFwcGVuZWQuCi0JCQkJICovCi0JCQkJcHJpbnRmICgibGliZmR0ICVzXG4iLCBmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOwotCQkJCXJldHVybiAxOwotCQkJfQorCQlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoIChmZHQsIGFyZ3ZbMl0pOworCQlpZiAobm9kZW9mZnNldCA8IDApIHsKKwkJCS8qCisJCQkgKiBOb3QgZm91bmQgb3Igc29tZXRoaW5nIGVsc2UgYmFkIGhhcHBlbmVkLgorCQkJICovCisJCQlwcmludGYgKCJsaWJmZHQgZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKCkgcmV0dXJuZWQgJXNcbiIsCisJCQkJZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKKwkJCXJldHVybiAxOwogCQl9CiAJCS8qCiAJCSAqIERvIHRoZSBkZWxldGUuICBBIGZvdXJ0aCBwYXJhbWV0ZXIgbWVhbnMgZGVsZXRlIGEgcHJvcGVydHksCkBAIC00MjEsMzkgKzI4MSw0MCBAQAogCQlpZiAoYXJnYyA+IDMpIHsKIAkJCWVyciA9IGZkdF9kZWxwcm9wKGZkdCwgbm9kZW9mZnNldCwgYXJndlszXSk7CiAJCQlpZiAoZXJyIDwgMCkgewotCQkJCXByaW50ZigiZmR0X2RlbHByb3AgbGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJCXByaW50ZigibGliZmR0IGZkdF9kZWxwcm9wKCk6ICAlc1xuIiwKKwkJCQkJZmR0X3N0cmVycm9yKGVycikpOwogCQkJCXJldHVybiBlcnI7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQllcnIgPSBmZHRfZGVsX25vZGUoZmR0LCBub2Rlb2Zmc2V0KTsKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJcHJpbnRmKCJmZHRfZGVsX25vZGUgbGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJCXByaW50ZigibGliZmR0IGZkdF9kZWxfbm9kZSgpOiAgJXNcbiIsCisJCQkJCWZkdF9zdHJlcnJvcihlcnIpKTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQogCQl9Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBDcmVhdGUgYSBjaG9zZW4gbm9kZQotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl9IGVsc2UgaWYgKG9wID09ICdjJykgeworCX0KKyNpZmRlZiBDT05GSUdfT0ZfQk9BUkRfU0VUVVAKKwkvKiBDYWxsIHRoZSBib2FyZC1zcGVjaWZpYyBmaXh1cCByb3V0aW5lICovCisJZWxzZSBpZiAoYXJndlsxXVswXSA9PSAnYicpCisJCWZ0X2JvYXJkX3NldHVwKGZkdCwgZ2QtPmJkKTsKKyNlbmRpZgorCS8qIENyZWF0ZSBhIGNob3NlbiBub2RlICovCisJZWxzZSBpZiAoYXJndlsxXVswXSA9PSAnYycpCiAJCWZkdF9jaG9zZW4oZmR0LCAwLCAwLCAxKTsKIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIENyZWF0ZSBhIHUtYm9vdC1lbnYgbm9kZQotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl9IGVsc2UgaWYgKG9wID09ICdlJykgeworI2lmZGVmIENPTkZJR19PRl9IQVNfVUJPT1RfRU5WCisJLyogQ3JlYXRlIGEgdS1ib290LWVudiBub2RlICovCisJZWxzZSBpZiAoYXJndlsxXVswXSA9PSAnZScpCiAJCWZkdF9lbnYoZmR0KTsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIENyZWF0ZSBhIGJkX3Qgbm9kZQotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl9IGVsc2UgaWYgKG9wID09ICdiJykgeworI2VuZGlmCisjaWZkZWYgQ09ORklHX09GX0hBU19CRF9UCisJLyogQ3JlYXRlIGEgYmRfdCBub2RlICovCisJZWxzZSBpZiAoYXJndlsxXVswXSA9PSAnYicpCiAJCWZkdF9iZF90KGZkdCk7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBVbnJlY29nbml6ZWQgY29tbWFuZAotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl9IGVsc2UgeworI2VuZGlmCisJZWxzZSB7CisJCS8qIFVucmVjb2duaXplZCBjb21tYW5kICovCiAJCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CiAJCXJldHVybiAxOwogCX0KQEAgLTQ2MSw3ICszMjIsNyBAQAogCXJldHVybiAwOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGludCBmZHRfdmFsaWQodm9pZCkKIHsKQEAgLTQ3NywxOSArMzM4LDIxIEBACiAJCXJldHVybiAxOwkvKiB2YWxpZCAqLwogCiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRmKCJsaWJmZHQ6ICVzIiwgZmR0X3N0cmVycm9yKGVycikpOworCQlwcmludGYoImxpYmZkdCBmZHRfY2hlY2tfaGVhZGVyKCk6ICVzIiwgZmR0X3N0cmVycm9yKGVycikpOwogCQkvKgogCQkgKiBCZSBtb3JlIGluZm9ybWF0aXZlIG9uIGJhZCB2ZXJzaW9uLgogCQkgKi8KIAkJaWYgKGVyciA9PSAtRkRUX0VSUl9CQURWRVJTSU9OKSB7CiAJCQlpZiAoZmR0X3ZlcnNpb24oZmR0KSA8IEZEVF9GSVJTVF9TVVBQT1JURURfVkVSU0lPTikgewogCQkJCXByaW50ZiAoIiAtIHRvbyBvbGQsIGZkdCAkZCA8ICVkIiwKLQkJCQkJZmR0X3ZlcnNpb24oZmR0KSwgRkRUX0ZJUlNUX1NVUFBPUlRFRF9WRVJTSU9OKTsKKwkJCQkJZmR0X3ZlcnNpb24oZmR0KSwKKwkJCQkJRkRUX0ZJUlNUX1NVUFBPUlRFRF9WRVJTSU9OKTsKIAkJCQlmZHQgPSBOVUxMOwogCQkJfQogCQkJaWYgKGZkdF9sYXN0X2NvbXBfdmVyc2lvbihmZHQpID4gRkRUX0xBU1RfU1VQUE9SVEVEX1ZFUlNJT04pIHsKIAkJCQlwcmludGYgKCIgLSB0b28gbmV3LCBmZHQgJGQgPiAlZCIsCi0JCQkJCWZkdF92ZXJzaW9uKGZkdCksIEZEVF9MQVNUX1NVUFBPUlRFRF9WRVJTSU9OKTsKKwkJCQkJZmR0X3ZlcnNpb24oZmR0KSwKKwkJCQkJRkRUX0xBU1RfU1VQUE9SVEVEX1ZFUlNJT04pOwogCQkJCWZkdCA9IE5VTEw7CiAJCQl9CiAJCQlyZXR1cm4gMDsKQEAgLTUwMCwxMyArMzYzLDkxIEBACiAJcmV0dXJuIDE7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogT0YgZmxhdCB0cmVlIGhhbmRsaW5nCi0gKiBXcml0dGVuIGJ5OiBQYW50ZWxpcyBBbnRvbmlvdSA8cGFudGVsaXMuYW50b25pb3VAZ21haWwuY29tPgotICogVXBkYXRlZCBieTogTWF0dGhldyBNY0NsaW50b2NrIDxtc21AZnJlZXNjYWxlLmNvbT4KLSAqIENvbnZlcnRlZCB0byBsaWJmZHQgYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisgKiBQYXJzZSB0aGUgdXNlcidzIGlucHV0LCBwYXJ0aWFsbHkgaGV1cmlzdGljLiAgVmFsaWQgZm9ybWF0czoKKyAqIDwwMD4JCS0gaGV4IGJ5dGUKKyAqIDwwMDExPgktIGhleCBoYWxmIHdvcmQgKDE2IGJpdHMpCisgKiA8MDAxMTIyMzM+CS0gaGV4IHdvcmQgKDMyIGJpdHMpCisgKgkJLSBoZXggZG91YmxlIHdvcmRzICg2NCBiaXRzKSBhcmUgbm90IHN1cHBvcnRlZCwgbXVzdCB1c2UKKyAqCQkJYSBieXRlIHN0cmVhbSBpbnN0ZWFkLgorICogWzAwIDExIDIyIC4uIG5uXSAtIGJ5dGUgc3RyZWFtCisgKiAic3RyaW5nIgktIElmIHRoZSB0aGUgdmFsdWUgZG9lc24ndCBzdGFydCB3aXRoICI8IiBvciAiWyIsIGl0IGlzCisgKgkJCXRyZWF0ZWQgYXMgYSBzdHJpbmcuICBOb3RlIHRoYXQgdGhlIHF1b3RlcyBhcmUKKyAqCQkJc3RyaXBwZWQgYnkgdGhlIHBhcnNlciBiZWZvcmUgd2UgZ2V0IHRoZSBzdHJpbmcuCisgKi8KK3N0YXRpYyBpbnQgZmR0X3BhcnNlX3Byb3AoY2hhciAqcGF0aHAsIGNoYXIgKnByb3AsIGNoYXIgKm5ld3ZhbCwKKwljaGFyICpkYXRhLCBpbnQgKmxlbikKK3sKKwljaGFyICpjcDsJCS8qIHRlbXBvcmFyeSBjaGFyIHBvaW50ZXIgKi8KKwl1bnNpZ25lZCBsb25nIHRtcDsJLyogaG9sZHMgY29udmVydGVkIHZhbHVlcyAqLworCisJaWYgKCpuZXd2YWwgPT0gJzwnKSB7CisJCS8qCisJCSAqIEJpZ2dlciB2YWx1ZXMgdGhhbiBieXRlcy4KKwkJICovCisJCSpsZW4gPSAwOworCQluZXd2YWwrKzsKKwkJd2hpbGUgKCgqbmV3dmFsICE9ICc+JykgJiYgKCpuZXd2YWwgIT0gJ1wwJykpIHsKKwkJCWNwID0gbmV3dmFsOworCQkJdG1wID0gc2ltcGxlX3N0cnRvdWwoY3AsICZuZXd2YWwsIDE2KTsKKwkJCWlmICgobmV3dmFsIC0gY3ApIDw9IDIpIHsKKwkJCQkqZGF0YSA9IHRtcCAmIDB4RkY7CisJCQkJZGF0YSAgKz0gMTsKKwkJCQkqbGVuICs9IDE7CisJCQl9IGVsc2UgaWYgKChuZXd2YWwgLSBjcCkgPD0gNCkgeworCQkJCSoodWludDE2X3QgKilkYXRhID0gX19jcHVfdG9fYmUxNih0bXApOworCQkJCWRhdGEgICs9IDI7CisJCQkJKmxlbiArPSAyOworCQkJfSBlbHNlIGlmICgobmV3dmFsIC0gY3ApIDw9IDgpIHsKKwkJCQkqKHVpbnQzMl90ICopZGF0YSA9IF9fY3B1X3RvX2JlMzIodG1wKTsKKwkJCQlkYXRhICArPSA0OworCQkJCSpsZW4gKz0gNDsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKCJTb3JyeSwgSSBjb3VsZCBub3QgY29udmVydCBcIiVzXCJcbiIsCisJCQkJCWNwKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCXdoaWxlICgqbmV3dmFsID09ICcgJykKKwkJCQluZXd2YWwrKzsKKwkJfQorCQlpZiAoKm5ld3ZhbCAhPSAnPicpIHsKKwkJCXByaW50ZigiVW5leHBlY3RlZCBjaGFyYWN0ZXIgJyVjJ1xuIiwgKm5ld3ZhbCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSBpZiAoKm5ld3ZhbCA9PSAnWycpIHsKKwkJLyoKKwkJICogQnl0ZSBzdHJlYW0uICBDb252ZXJ0IHRoZSB2YWx1ZXMuCisJCSAqLworCQkqbGVuID0gMDsKKwkJbmV3dmFsKys7CisJCXdoaWxlICgoKm5ld3ZhbCAhPSAnXScpICYmICgqbmV3dmFsICE9ICdcMCcpKSB7CisJCQl0bXAgPSBzaW1wbGVfc3RydG91bChuZXd2YWwsICZuZXd2YWwsIDE2KTsKKwkJCSpkYXRhKysgPSB0bXAgJiAweEZGOworCQkJKmxlbiAgICA9ICpsZW4gKyAxOworCQkJd2hpbGUgKCpuZXd2YWwgPT0gJyAnKQorCQkJCW5ld3ZhbCsrOworCQl9CisJCWlmICgqbmV3dmFsICE9ICddJykgeworCQkJcHJpbnRmKCJVbmV4cGVjdGVkIGNoYXJhY3RlciAnJWMnXG4iLCAqbmV3dmFsKTsKKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQXNzdW1lIGl0IGlzIGEgc3RyaW5nLiAgQ29weSBpdCBpbnRvIG91ciBkYXRhIGFyZWEgZm9yCisJCSAqIGNvbnZlbmllbmNlIChpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nICdcMCcpLgorCQkgKi8KKwkJKmxlbiA9IHN0cmxlbihuZXd2YWwpICsgMTsKKwkJc3RyY3B5KGRhdGEsIG5ld3ZhbCk7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEhldXJpc3RpYyB0byBndWVzcyBpZiB0aGlzIGlzIGEgc3RyaW5nIG9yIGNvbmNhdGVuYXRlZCBzdHJpbmdzLgogICovCiAKIHN0YXRpYyBpbnQgaXNfcHJpbnRhYmxlX3N0cmluZyhjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKQpAQCAtNTQ2LDYgKzQ4NywxMiBAQAogCXJldHVybiAxOwogfQogCisKKy8qCisgKiBQcmludCB0aGUgcHJvcGVydHkgaW4gdGhlIGJlc3QgZm9ybWF0LCBhIGhldXJpc3RpYyBndWVzcy4gIFByaW50IGFzCisgKiBhIHN0cmluZywgY29uY2F0ZW5hdGVkIHN0cmluZ3MsIGEgYnl0ZSwgd29yZCwgZG91YmxlIHdvcmQsIG9yIChpZiBhbGwKKyAqIGVsc2UgZmFpbHMpIGl0IGlzIHByaW50ZWQgYXMgYSBzdHJlYW0gb2YgYnl0ZXMuCisgKi8KIHN0YXRpYyB2b2lkIHByaW50X2RhdGEoY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbikKIHsKIAlpbnQgajsKQEAgLTYwMSwzMiArNTQ4LDE0NiBAQAogCX0KIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBSZWN1cnNpdmVseSBwcmludCAoYSBwb3J0aW9uIG9mKSB0aGUgZmR0LiAgVGhlIGRlcHRoIHBhcmFtZXRlcgorICogZGV0ZXJtaW5lcyBob3cgZGVlcGx5IG5lc3RlZCB0aGUgZmR0IGlzIHByaW50ZWQuCisgKi8KK3N0YXRpYyBpbnQgZmR0X3ByaW50KGNoYXIgKnBhdGhwLCBjaGFyICpwcm9wLCBpbnQgZGVwdGgpCit7CisJc3RhdGljIGludCBvZmZzdGFja1tNQVhfTEVWRUxdOworCXN0YXRpYyBjaGFyIHRhYnNbTUFYX0xFVkVMKzFdID0KKwkJIlx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IgorCQkiXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQiOworCXZvaWQgKm5vZGVwOwkJLyogcHJvcGVydHkgbm9kZSBwb2ludGVyICovCisJaW50ICBub2Rlb2Zmc2V0OwkvKiBub2RlIG9mZnNldCBmcm9tIGxpYmZkdCAqLworCWludCAgbmV4dG9mZnNldDsJLyogbmV4dCBub2RlIG9mZnNldCBmcm9tIGxpYmZkdCAqLworCXVpbnQzMl90IHRhZzsJCS8qIHRhZyAqLworCWludCAgbGVuOwkJLyogbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSAqLworCWludCAgbGV2ZWwgPSAwOwkJLyoga2VlcCB0cmFjayBvZiBuZXN0aW5nIGxldmVsICovCisKKwlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoIChmZHQsIHBhdGhwKTsKKwlpZiAobm9kZW9mZnNldCA8IDApIHsKKwkJLyoKKwkJICogTm90IGZvdW5kIG9yIHNvbWV0aGluZyBlbHNlIGJhZCBoYXBwZW5lZC4KKwkJICovCisJCXByaW50ZiAoImxpYmZkdCBmZHRfZmluZF9ub2RlX2J5X3BhdGgoKSByZXR1cm5lZCAlc1xuIiwKKwkJCWZkdF9zdHJlcnJvcihub2Rlb2Zmc2V0KSk7CisJCXJldHVybiAxOworCX0KKwkvKgorCSAqIFRoZSB1c2VyIHBhc3NlZCBpbiBhIHByb3BlcnR5IGFzIHdlbGwgYXMgbm9kZSBwYXRoLgorCSAqIFByaW50IG9ubHkgdGhlIGdpdmVuIHByb3BlcnR5IGFuZCB0aGVuIHJldHVybi4KKwkgKi8KKwlpZiAocHJvcCkgeworCQlub2RlcCA9IGZkdF9nZXRwcm9wIChmZHQsIG5vZGVvZmZzZXQsIHByb3AsICZsZW4pOworCQlpZiAobGVuID09IDApIHsKKwkJCS8qIG5vIHByb3BlcnR5IHZhbHVlICovCisJCQlwcmludGYoIiVzICVzXG4iLCBwYXRocCwgcHJvcCk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChsZW4gPiAwKSB7CisJCQlwcmludGYoIiVzPSIsIHByb3ApOworCQkJcHJpbnRfZGF0YSAobm9kZXAsIGxlbik7CisJCQlwcmludGYoIlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZiAoImxpYmZkdCBmZHRfZ2V0cHJvcCgpOiAlc1xuIiwKKwkJCQlmZHRfc3RyZXJyb3IobGVuKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qCisJICogVGhlIHVzZXIgcGFzc2VkIGluIGEgbm9kZSBwYXRoIGFuZCBubyBwcm9wZXJ0eSwKKwkgKiBwcmludCB0aGUgbm9kZSBhbmQgYWxsIHN1Ym5vZGVzLgorCSAqLworCW9mZnN0YWNrWzBdID0gbm9kZW9mZnNldDsKKworCXdoaWxlKGxldmVsID49IDApIHsKKwkJdGFnID0gZmR0X25leHRfdGFnKGZkdCwgbm9kZW9mZnNldCwgJm5leHRvZmZzZXQsICZwYXRocCk7CisJCXN3aXRjaCh0YWcpIHsKKwkJY2FzZSBGRFRfQkVHSU5fTk9ERToKKwkJCWlmKGxldmVsIDw9IGRlcHRoKQorCQkJCXByaW50ZigiJXMlcyB7XG4iLAorCQkJCQkmdGFic1tNQVhfTEVWRUwgLSBsZXZlbF0sIHBhdGhwKTsKKwkJCWxldmVsKys7CisJCQlvZmZzdGFja1tsZXZlbF0gPSBub2Rlb2Zmc2V0OworCQkJaWYgKGxldmVsID49IE1BWF9MRVZFTCkgeworCQkJCXByaW50ZigiQWFhaWlpIDxzcGxhdD4gbmVzdGVkIHRvbyBkZWVwLiAiCisJCQkJCSJBYm9ydGluZy5cbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRkRUX0VORF9OT0RFOgorCQkJbGV2ZWwtLTsKKwkJCWlmKGxldmVsIDw9IGRlcHRoKQorCQkJCXByaW50ZigiJXN9O1xuIiwgJnRhYnNbTUFYX0xFVkVMIC0gbGV2ZWxdKTsKKwkJCWlmIChsZXZlbCA9PSAwKSB7CisJCQkJbGV2ZWwgPSAtMTsJCS8qIGV4aXQgdGhlIGxvb3AgKi8KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZEVF9QUk9QOgorCQkJbm9kZXAgPSBmZHRfZ2V0cHJvcCAoZmR0LCBvZmZzdGFja1tsZXZlbF0sIHBhdGhwLCAmbGVuKTsKKwkJCWlmIChsZW4gPCAwKSB7CisJCQkJcHJpbnRmICgibGliZmR0IGZkdF9nZXRwcm9wKCk6ICVzXG4iLAorCQkJCQlmZHRfc3RyZXJyb3IobGVuKSk7CisJCQkJcmV0dXJuIDE7CisJCQl9IGVsc2UgaWYgKGxlbiA9PSAwKSB7CisJCQkJLyogdGhlIHByb3BlcnR5IGhhcyBubyB2YWx1ZSAqLworCQkJCWlmKGxldmVsIDw9IGRlcHRoKQorCQkJCQlwcmludGYoIiVzJXM7XG4iLAorCQkJCQkJJnRhYnNbTUFYX0xFVkVMIC0gbGV2ZWxdLAorCQkJCQkJcGF0aHApOworCQkJfSBlbHNlIHsKKwkJCQlpZihsZXZlbCA8PSBkZXB0aCkgeworCQkJCQlwcmludGYoIiVzJXM9IiwKKwkJCQkJCSZ0YWJzW01BWF9MRVZFTCAtIGxldmVsXSwKKwkJCQkJCXBhdGhwKTsKKwkJCQkJcHJpbnRfZGF0YSAobm9kZXAsIGxlbik7CisJCQkJCXByaW50ZigiO1xuIik7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRkRUX05PUDoKKwkJCWJyZWFrOworCQljYXNlIEZEVF9FTkQ6CisJCQlyZXR1cm4gMTsKKwkJZGVmYXVsdDoKKwkJCWlmKGxldmVsIDw9IGRlcHRoKQorCQkJCXByaW50ZigiVW5rbm93biB0YWcgMHglMDhYXG4iLCB0YWcpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJbm9kZW9mZnNldCA9IG5leHRvZmZzZXQ7CisJfQorCXJldHVybiAwOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIFVfQk9PVF9DTUQoCiAJZmR0LAk1LAkwLAlkb19mZHQsCiAJImZkdCAgICAgLSBmbGF0dGVuZWQgZGV2aWNlIHRyZWUgdXRpbGl0eSBjb21tYW5kc1xuIiwKIAkgICAgImFkZHIgICA8YWRkcj4gWzxsZW5ndGg+XSAgICAgICAgLSBTZXQgdGhlIGZkdCBsb2NhdGlvbiB0byA8YWRkcj5cbiIKKyNpZmRlZiBDT05GSUdfT0ZfQk9BUkRfU0VUVVAKKwkiZmR0IGJvYXJkc2V0dXAgICAgICAgICAgICAgICAgICAgICAgLSBEbyBib2FyZC1zcGVjaWZpYyBzZXQgdXBcbiIKKyNlbmRpZgogCSJmZHQgbW92ZSAgIDxmZHQ+IDxuZXdhZGRyPiA8bGVuZ3RoPiAtIENvcHkgdGhlIGZkdCB0byA8YWRkcj5cbiIKIAkiZmR0IHByaW50ICA8cGF0aD4gWzxwcm9wPl0gICAgICAgICAgLSBSZWN1cnNpdmUgcHJpbnQgc3RhcnRpbmcgYXQgPHBhdGg+XG4iCiAJImZkdCBsaXN0ICAgPHBhdGg+IFs8cHJvcD5dICAgICAgICAgIC0gUHJpbnQgb25lIGxldmVsIHN0YXJ0aW5nIGF0IDxwYXRoPlxuIgogCSJmZHQgc2V0ICAgIDxwYXRoPiA8cHJvcD4gWzx2YWw+XSAgICAtIFNldCA8cHJvcGVydHk+IFt0byA8dmFsPl1cbiIKIAkiZmR0IG1rbm9kZSA8cGF0aD4gPG5vZGU+ICAgICAgICAgICAgLSBDcmVhdGUgYSBuZXcgbm9kZSBhZnRlciA8cGF0aD5cbiIKIAkiZmR0IHJtICAgICA8cGF0aD4gWzxwcm9wPl0gICAgICAgICAgLSBEZWxldGUgdGhlIG5vZGUgb3IgPHByb3BlcnR5PlxuIgotCSJmZHQgY2hvc2VuIC0gQWRkL3VwZGF0ZSB0aGUgXCIvY2hvc2VuXCIgYnJhbmNoIGluIHRoZSB0cmVlXG4iCisJImZkdCBjaG9zZW4gLSBBZGQvdXBkYXRlIHRoZSAvY2hvc2VuIGJyYW5jaCBpbiB0aGUgdHJlZVxuIgogI2lmZGVmIENPTkZJR19PRl9IQVNfVUJPT1RfRU5WCi0JImZkdCBlbnYgICAgLSBBZGQvcmVwbGFjZSB0aGUgXCIvdS1ib290LWVudlwiIGJyYW5jaCBpbiB0aGUgdHJlZVxuIgorCSJmZHQgZW52ICAgIC0gQWRkL3JlcGxhY2UgdGhlIC91LWJvb3QtZW52IGJyYW5jaCBpbiB0aGUgdHJlZVxuIgogI2VuZGlmCiAjaWZkZWYgQ09ORklHX09GX0hBU19CRF9UCi0JImZkdCBiZF90ICAgLSBBZGQvcmVwbGFjZSB0aGUgXCIvYmRfdFwiIGJyYW5jaCBpbiB0aGUgdHJlZVxuIgorCSJmZHQgYmRfdCAgIC0gQWRkL3JlcGxhY2UgdGhlIC9iZF90IGJyYW5jaCBpbiB0aGUgdHJlZVxuIgogI2VuZGlmCiAJIkhpbnRzOlxuIgotCSIgKiBTZXQgYSBsYXJnZXIgbGVuZ3RoIHdpdGggdGhlIGZkdCBhZGRyIGNvbW1hbmQgdG8gYWRkIHRvIHRoZSBibG9iLlxuIgotCSIgKiBJZiB0aGUgcHJvcGVydHkgeW91IGFyZSBzZXR0aW5nL3ByaW50aW5nIGhhcyBhICcjJyBjaGFyYWN0ZXIsXG4iCi0JIiAgICAgeW91IE1VU1QgZXNjYXBlIGl0IHdpdGggYSBcXCBjaGFyYWN0ZXIgb3IgcXVvdGUgaXQgd2l0aCBcIiBvclxuIgotCSIgICAgIGl0IHdpbGwgYmUgaWdub3JlZCBhcyBhIGNvbW1lbnQuXG4iCi0JIiAqIElmIHRoZSB2YWx1ZSBoYXMgc3BhY2VzIGluIGl0LCB5b3UgTVVTVCBlc2NhcGUgdGhlIHNwYWNlcyB3aXRoXG4iCi0JIiAgICAgXFwgY2hhcmFjdGVycyBvciBxdW90ZSBpdCB3aXRoIFwiXCJcbiIKKwkiIElmIHRoZSBwcm9wZXJ0eSB5b3UgYXJlIHNldHRpbmcvcHJpbnRpbmcgaGFzIGEgJyMnIGNoYXJhY3RlciBvciBzcGFjZXMsXG4iCisJIiAgICAgeW91IE1VU1QgZXNjYXBlIGl0IHdpdGggYSBcXCBjaGFyYWN0ZXIgb3IgcXVvdGUgaXQgd2l0aCBcIi5cbiIKIAkiRXhhbXBsZXM6IGZkdCBwcmludCAvICAgICAgICAgICAgICAgIyBwcmludCB0aGUgd2hvbGUgdHJlZVxuIgogCSIgICAgICAgICAgZmR0IHByaW50IC9jcHVzIFwiI2FkZHJlc3MtY2VsbHNcIlxuIgogCSIgICAgICAgICAgZmR0IHNldCAgIC9jcHVzIFwiI2FkZHJlc3MtY2VsbHNcIiBcIlswMCAwMCAwMCAwMV1cIlxuIgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9mbGFzaC5jIGIvY29tbW9uL2NtZF9mbGFzaC5jCmluZGV4IGEzNGFiNzkuLjExYzg4NTcgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZmxhc2guYworKysgYi9jb21tb24vY21kX2ZsYXNoLmMKQEAgLTMxLDkgKzMxLDkgQEAKICNpbmNsdWRlIDxkYXRhZmxhc2guaD4KICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkxBU0gpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZMQVNIKQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQogI2luY2x1ZGUgPGpmZnMyL2pmZnMyLmg+CiAKIC8qIHBhcml0aW9uIGhhbmRsaW5nIHJvdXRpbmVzICovCkBAIC0zMTEsNyArMzExLDcgQEAKIAlmbGFzaF9pbmZvX3QgKmluZm87CiAJdWxvbmcgYmFuaywgYWRkcl9maXJzdCwgYWRkcl9sYXN0OwogCWludCBuLCBzZWN0X2ZpcnN0LCBzZWN0X2xhc3Q7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQogCXN0cnVjdCBtdGRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHBhcnRfaW5mbyAqcGFydDsKIAl1OCBkZXZfdHlwZSwgZGV2X251bSwgcG51bTsKQEAgLTM0Myw3ICszNDMsNyBAQAogCQlyZXR1cm4gcmNvZGU7CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQogCS8qIGVyYXNlIDxwYXJ0LWlkPiAtIGVyYXNlIHBhcnRpdGlvbiAqLwogCWlmICgoYXJnYyA9PSAyKSAmJiAoaWRfcGFyc2UoYXJndlsxXSwgTlVMTCwgJmRldl90eXBlLCAmZGV2X251bSkgPT0gMCkpIHsKIAkJbXRkcGFydHNfaW5pdCgpOwpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAJZmxhc2hfaW5mb190ICppbmZvOwogCXVsb25nIGJhbmssIGFkZHJfZmlyc3QsIGFkZHJfbGFzdDsKIAlpbnQgaSwgcCwgbiwgc2VjdF9maXJzdCwgc2VjdF9sYXN0OwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKIAlzdHJ1Y3QgbXRkX2RldmljZSAqZGV2OwogCXN0cnVjdCBwYXJ0X2luZm8gKnBhcnQ7CiAJdTggZGV2X3R5cGUsIGRldl9udW0sIHBudW07CkBAIC01MzksNyArNTM5LDcgQEAKIAkJcmV0dXJuIHJjb2RlOwogCX0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKIAkvKiBwcm90ZWN0IG9uL29mZiA8cGFydC1pZD4gKi8KIAlpZiAoKGFyZ2MgPT0gMykgJiYgKGlkX3BhcnNlKGFyZ3ZbMl0sIE5VTEwsICZkZXZfdHlwZSwgJmRldl9udW0pID09IDApKSB7CiAJCW10ZHBhcnRzX2luaXQoKTsKQEAgLTY3Miw3ICs2NzIsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCiAjIGRlZmluZSBUTVBfRVJBU0UJImVyYXNlIDxwYXJ0LWlkPlxuICAgIC0gZXJhc2UgcGFydGl0aW9uXG4iCiAjIGRlZmluZSBUTVBfUFJPVF9PTgkicHJvdGVjdCBvbiA8cGFydC1pZD5cbiAgICAtIHByb3RlY3QgcGFydGl0aW9uXG4iCiAjIGRlZmluZSBUTVBfUFJPVF9PRkYJInByb3RlY3Qgb2ZmIDxwYXJ0LWlkPlxuICAgIC0gbWFrZSBwYXJ0aXRpb24gd3JpdGFibGVcbiIKQEAgLTczMiw0ICs3MzIsNCBAQAogI3VuZGVmCVRNUF9QUk9UX09OCiAjdW5kZWYJVE1QX1BST1RfT0ZGCiAKLSNlbmRpZgkvKiBDRkdfQ01EX0ZMQVNIICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZnBnYS5jIGIvY29tbW9uL2NtZF9mcGdhLmMKaW5kZXggMzQ0NDA5MS4uM2ZjNGZjYSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9mcGdhLmMKKysrIGIvY29tbW9uL2NtZF9mcGdhLmMKQEAgLTI3LDcgKzI3LDcgQEAKICAqLwogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKICNpbmNsdWRlIDxuZXQuaD4KICNlbmRpZgogI2luY2x1ZGUgPGZwZ2EuaD4KQEAgLTQzLDcgKzQzLDcgQEAKICNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkIChDT05GSUdfRlBHQSkgJiYgKCBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZQR0EgKQorI2lmIGRlZmluZWQgKENPTkZJR19GUEdBKSAmJiBkZWZpbmVkKENPTkZJR19DTURfRlBHQSkKIAogLyogTG9jYWwgZnVuY3Rpb25zICovCiBzdGF0aWMgdm9pZCBmcGdhX3VzYWdlIChjbWRfdGJsX3QgKiBjbWR0cCk7CkBAIC0zMjEsNCArMzIxLDQgQEAKIAkgICAgIlx0bG9hZGJcdExvYWQgZGV2aWNlIGZyb20gYml0c3RyZWFtIGJ1ZmZlciAoWGlsaW54IGRldmljZXMgb25seSlcbiIKIAkgICAgIlx0bG9hZG1rXHRMb2FkIGRldmljZSBnZW5lcmF0ZWQgd2l0aCBta2ltYWdlXG4iCiAJICAgICJcdGR1bXBcdExvYWQgZGV2aWNlIHRvIG1lbW9yeSBidWZmZXJcbiIpOwotI2VuZGlmIC8qIENPTkZJR19GUEdBICYmIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRlBHQSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2kyYy5jIGIvY29tbW9uL2NtZF9pMmMuYwppbmRleCA3NTU4MTBkLi5hNjg0YTU4IDEwMDY0NAotLS0gYS9jb21tb24vY21kX2kyYy5jCisrKyBiL2NvbW1vbi9jbWRfaTJjLmMKQEAgLTg2LDcgKzg2LDcgQEAKICNpbmNsdWRlIDxpMmMuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JMkMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0kyQykKIAogCiAvKiBEaXNwbGF5IHZhbHVlcyBmcm9tIGxhc3QgY29tbWFuZC4KQEAgLTY1Nyw3ICs2NTcsNyBAQAogICogVGhlIFNEUkFNIGNvbW1hbmQgaXMgc2VwYXJhdGVseSBjb25maWd1cmVkIGJlY2F1c2UgbWFueQogICogKG1vc3Q/KSBlbWJlZGRlZCBib2FyZHMgZG9uJ3QgdXNlIFNEUkFNIERJTU1zLgogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0RSQU0pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NEUkFNKQogCiAvKgogICogU3ludGF4OgpAQCAtODc3LDcgKzg3Nyw3IEBACiAKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1NEUkFNICovCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19DTURfVFJFRSkKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfTVVMVElfQlVTKQpAQCAtOTM4LDEwICs5MzgsMTAgQEAKIAkJcmV0dXJuIGRvX2kyY19wcm9iZShjbWR0cCwgZmxhZywgLS1hcmdjLCArK2FyZ3YpOwogCWlmICghc3RybmNtcChhcmd2WzFdLCAibG8iLCAyKSkKIAkJcmV0dXJuIGRvX2kyY19sb29wKGNtZHRwLCBmbGFnLCAtLWFyZ2MsICsrYXJndik7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0RSQU0pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NEUkFNKQogCWlmICghc3RybmNtcChhcmd2WzFdLCAic2QiLCAyKSkKIAkJcmV0dXJuIGRvX3NkcmFtKGNtZHRwLCBmbGFnLCAtLWFyZ2MsICsrYXJndik7Ci0jZW5kaWYJLyogQ0ZHX0NNRF9TRFJBTSAqLworI2VuZGlmCiAJZWxzZQogCQlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwogCXJldHVybiAwOwpAQCAtOTY1LDkgKzk2NSw5IEBACiAJImkyYyBjcmMzMiBjaGlwIGFkZHJlc3NbLjAsIC4xLCAuMl0gY291bnQgLSBjb21wdXRlIENSQzMyIGNoZWNrc3VtXG4iCiAJImkyYyBwcm9iZSAtIHNob3cgZGV2aWNlcyBvbiB0aGUgSTJDIGJ1c1xuIgogCSJpMmMgbG9vcCBjaGlwIGFkZHJlc3NbLjAsIC4xLCAuMl0gWyMgb2Ygb2JqZWN0c10gLSBsb29waW5nIHJlYWQgb2YgZGV2aWNlXG4iCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0RSQU0pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NEUkFNKQogCSJpMmMgc2RyYW0gY2hpcCAtIHByaW50IFNEUkFNIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb25cbiIKLSNlbmRpZiAgLyogQ0ZHX0NNRF9TRFJBTSAqLworI2VuZGlmCiApOwogI2VuZGlmIC8qIENPTkZJR19JMkNfQ01EX1RSRUUgKi8KIFVfQk9PVF9DTUQoCkBAIC0xMDE2LDcgKzEwMTYsNyBAQAogCSIgICAgLSBsb29wLCByZWFkaW5nIGEgc2V0IG9mIGFkZHJlc3Nlc1xuIgogKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NEUkFNKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TRFJBTSkKIFVfQk9PVF9DTUQoCiAJaXNkcmFtLAkyLAkxLAlkb19zZHJhbSwKIAkiaXNkcmFtICAtIHByaW50IFNEUkFNIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb25cbiIsCkBAIC0xMDI1LDQgKzEwMjUsNCBAQAogKTsKICNlbmRpZgogCi0jZW5kaWYJLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9pZGUuYyBiL2NvbW1vbi9jbWRfaWRlLmMKaW5kZXggODc3OTE1Ni4uODlmZWZlZCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9pZGUuYworKysgYi9jb21tb24vY21kX2lkZS5jCkBAIC03MSw3ICs3MSw3IEBACiAjIGRlZmluZSBTWU5DCQkvKiBub3RoaW5nICovCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogCiAjaWZkZWYgQ09ORklHX0lERV84eHhfRElSRUNUCiAvKiBUaW1pbmdzIGZvciBJREUgSW50ZXJmYWNlCkBAIC0yMTA1LDQgKzIxMDUsNCBAQAogCSJsb2FkQWRkciBkZXY6cGFydFxuIgogKTsKIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfaW1tYXAuYyBiL2NvbW1vbi9jbWRfaW1tYXAuYwppbmRleCBmYTc5YjQ1Li5hZTk1NzU4IDEwMDY0NAotLS0gYS9jb21tb24vY21kX2ltbWFwLmMKKysrIGIvY29tbW9uL2NtZF9pbW1hcC5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSU1NQVApICYmIFwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSU1NQVApICYmIFwKICAgICAoZGVmaW5lZChDT05GSUdfOHh4KSB8fCBkZWZpbmVkKENPTkZJR184MjYwKSkKIAogI2lmIGRlZmluZWQoQ09ORklHXzh4eCkKQEAgLTcyMCw0ICs3MjAsNCBAQAogKTsKIAogCi0jZW5kaWYJLyogQ0ZHX0NNRF9JTU1BUCAmJiAoQ09ORklHXzh4eCB8fCBDT05GSUdfODI2MCkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9pdGVzdC5jIGIvY29tbW9uL2NtZF9pdGVzdC5jCmluZGV4IDhhZDEzNGYuLjhlMjA1MTcgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfaXRlc3QuYworKysgYi9jb21tb24vY21kX2l0ZXN0LmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxjb25maWcuaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JVEVTVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVRFU1QpCiAKICNkZWZpbmUgRVEJMAogI2RlZmluZSBORQkxCkBAIC0xOTcsNCArMTk3LDQgQEAKIAkiaXRlc3RcdC0gcmV0dXJuIHRydWUvZmFsc2Ugb24gaW50ZWdlciBjb21wYXJlXG4iLAogCSJbLmIsIC53LCAubCwgLnNdIFsqXXZhbHVlMSA8b3A+IFsqXXZhbHVlMlxuIgogKTsKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lURVNUICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfamZmczIuYyBiL2NvbW1vbi9jbWRfamZmczIuYwppbmRleCA3ZmQxZmEzLi41MTNhMjI2IDEwMDY0NAotLS0gYS9jb21tb24vY21kX2pmZnMyLmMKKysrIGIvY29tbW9uL2NtZF9qZmZzMi5jCkBAIC05NCwxOCArOTQsMTggQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikKIAogI2luY2x1ZGUgPGNyYW1mcy9jcmFtZnNfZnMuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjaWZkZWYgQ0ZHX05BTkRfTEVHQUNZCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiAjZWxzZSAvKiAhQ0ZHX05BTkRfTEVHQUNZICovCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KICNpbmNsdWRlIDxuYW5kLmg+CiAjZW5kaWYgLyogIUNGR19OQU5EX0xFR0FDWSAqLwotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICovCisjZW5kaWYKIC8qIGVuYWJsZS9kaXNhYmxlIGRlYnVnZ2luZyBtZXNzYWdlcyAqLwogI2RlZmluZQlERUJVR19KRkZTCiAjdW5kZWYJREVCVUdfSkZGUwpAQCAtMzIxLDcgKzMyMSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcGFydF92YWxpZGF0ZV9ub3Ioc3RydWN0IG10ZGlkcyAqaWQsIHN0cnVjdCBwYXJ0X2luZm8gKnBhcnQpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkxBU0gpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZMQVNIKQogCS8qIGluZm8gZm9yIEZMQVNIIGNoaXBzICovCiAJZXh0ZXJuIGZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW107CiAJZmxhc2hfaW5mb190ICpmbGFzaDsKQEAgLTM3MCw3ICszNzAsNyBAQAogICovCiBzdGF0aWMgaW50IHBhcnRfdmFsaWRhdGVfbmFuZChzdHJ1Y3QgbXRkaWRzICppZCwgc3RydWN0IHBhcnRfaW5mbyAqcGFydCkKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0pGRlMyX05BTkQpICYmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCS8qIGluZm8gZm9yIE5BTkQgY2hpcHMgKi8KIAluYW5kX2luZm9fdCAqbmFuZDsKIApAQCAtNzE5LDcgKzcxOSw3IEBACiBzdGF0aWMgaW50IGRldmljZV92YWxpZGF0ZSh1OCB0eXBlLCB1OCBudW0sIHUzMiAqc2l6ZSkKIHsKIAlpZiAodHlwZSA9PSBNVERfREVWX1RZUEVfTk9SKSB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkxBU0gpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZMQVNIKQogCQlpZiAobnVtIDwgQ0ZHX01BWF9GTEFTSF9CQU5LUykgewogCQkJZXh0ZXJuIGZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW107CiAJCQkqc2l6ZSA9IGZsYXNoX2luZm9bbnVtXS5zaXplOwpAQCAtNzMzLDcgKzczMyw3IEBACiAJCXByaW50Zigic3VwcG9ydCBmb3IgRkxBU0ggZGV2aWNlcyBub3QgcHJlc2VudFxuIik7CiAjZW5kaWYKIAl9IGVsc2UgaWYgKHR5cGUgPT0gTVREX0RFVl9UWVBFX05BTkQpIHsKLSNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0pGRlMyX05BTkQpICYmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCQlpZiAobnVtIDwgQ0ZHX01BWF9OQU5EX0RFVklDRSkgewogI2lmbmRlZiBDRkdfTkFORF9MRUdBQ1kKIAkJCSpzaXplID0gbmFuZF9pbmZvW251bV0uc2l6ZTsKQEAgLTIxOTIsNCArMjE5Miw0IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNlbmRpZiAvKiBDRkdfQ01EX0pGRlMyICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfbG9hZC5jIGIvY29tbW9uL2NtZF9sb2FkLmMKaW5kZXggZjYzYjhlOC4uMjA0YzNlYiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9sb2FkLmMKKysrIGIvY29tbW9uL2NtZF9sb2FkLmMKQEAgLTMzLDI0ICszMywyNCBAQAogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0xPQURCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9MT0FEQikKIHN0YXRpYyB1bG9uZyBsb2FkX3NlcmlhbF95bW9kZW0gKHVsb25nIG9mZnNldCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0xPQURTKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9MT0FEUykKIHN0YXRpYyB1bG9uZyBsb2FkX3NlcmlhbCAodWxvbmcgb2Zmc2V0KTsKIHN0YXRpYyBpbnQgcmVhZF9yZWNvcmQgKGNoYXIgKmJ1ZiwgdWxvbmcgbGVuKTsKLSMgaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0FWRVMpCisjIGlmIGRlZmluZWQoQ09ORklHX0NNRF9TQVZFUykKIHN0YXRpYyBpbnQgc2F2ZV9zZXJpYWwgKHVsb25nIG9mZnNldCwgdWxvbmcgc2l6ZSk7CiBzdGF0aWMgaW50IHdyaXRlX3JlY29yZCAoY2hhciAqYnVmKTsKLSMgZW5kaWYgLyogQ0ZHX0NNRF9TQVZFUyAqLworI2VuZGlmCiAKIHN0YXRpYyBpbnQgZG9fZWNobyA9IDE7Ci0jZW5kaWYgLyogQ0ZHX0NNRF9MT0FEUyAqLworI2VuZGlmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9MT0FEUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTE9BRFMpCiBpbnQgZG9fbG9hZF9zZXJpYWwgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCXVsb25nIG9mZnNldCA9IDA7CkBAIC0yNTMsNyArMjUzLDcgQEAKIAlyZXR1cm4gKHAgLSBidWYpOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0FWRVMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NBVkVTKQogCiBpbnQgZG9fc2F2ZV9zZXJpYWwgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewpAQCAtMzk5LDEzICszOTksMTUgQEAKIAl9CiAJcmV0dXJuICgwKTsKIH0KLSMgZW5kaWYgLyogQ0ZHX0NNRF9TQVZFUyAqLworIyBlbmRpZgogCi0jZW5kaWYJLyogQ0ZHX0NNRF9MT0FEUyAqLworI2VuZGlmCiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0xPQURCKSAgLyogbG9hZGIgY29tbWFuZCAobG9hZCBiaW5hcnkpIGluY2x1ZGVkICovCi0KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTE9BREIpCisvKgorICogbG9hZGIgY29tbWFuZCAobG9hZCBiaW5hcnkpIGluY2x1ZGVkCisgKi8KICNkZWZpbmUgWE9OX0NIQVIgICAgICAgIDE3CiAjZGVmaW5lIFhPRkZfQ0hBUiAgICAgICAxOQogI2RlZmluZSBTVEFSVF9DSEFSICAgICAgMHgwMQpAQCAtMTAzNiwxMSArMTAzOCwxMSBAQAogCXJldHVybiBvZmZzZXQ7CiB9CiAKLSNlbmRpZgkvKiBDRkdfQ01EX0xPQURCICovCisjZW5kaWYKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0xPQURTKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9MT0FEUykKIAogI2lmZGVmCUNGR19MT0FEU19CQVVEX0NIQU5HRQogVV9CT09UX0NNRCgKQEAgLTEwNjUsNyArMTA2Nyw3IEBACiAgKi8KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0FWRVMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NBVkVTKQogI2lmZGVmCUNGR19MT0FEU19CQVVEX0NIQU5HRQogVV9CT09UX0NNRCgKIAlzYXZlcywgNCwgMCwJZG9fc2F2ZV9zZXJpYWwsCkBAIC0xMDgyLDExICsxMDg0LDExIEBACiAJIiAgICAtIHNhdmUgUy1SZWNvcmQgZmlsZSBvdmVyIHNlcmlhbCBsaW5lIHdpdGggb2Zmc2V0ICdvZmYnIGFuZCBzaXplICdzaXplJ1xuIgogKTsKICNlbmRpZgkvKiBDRkdfTE9BRFNfQkFVRF9DSEFOR0UgKi8KLSNlbmRpZgkvKiBDRkdfQ01EX1NBVkVTICovCi0jZW5kaWYJLyogQ0ZHX0NNRF9MT0FEUyAqLworI2VuZGlmCisjZW5kaWYKIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTE9BREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0xPQURCKQogVV9CT09UX0NNRCgKIAlsb2FkYiwgMywgMCwJZG9fbG9hZF9zZXJpYWxfYmluLAogCSJsb2FkYiAgIC0gbG9hZCBiaW5hcnkgZmlsZSBvdmVyIHNlcmlhbCBsaW5lIChrZXJtaXQgbW9kZSlcbiIsCkBAIC0xMTAzLDExICsxMTA1LDExIEBACiAJIiB3aXRoIG9mZnNldCAnb2ZmJyBhbmQgYmF1ZHJhdGUgJ2JhdWQnXG4iCiApOwogCi0jZW5kaWYJLyogQ0ZHX0NNRF9MT0FEQiAqLworI2VuZGlmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9IV0ZMT1cpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0hXRkxPVykKIGludCBkb19od2Zsb3cgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCWV4dGVybiBpbnQgaHdmbG93X29ub2ZmKGludCk7CkBAIC0xMTMzLDQgKzExMzUsNCBAQAogCSJbb258b2ZmXVxuIC0gY2hhbmdlIFJUUy9DVFMgaGFyZHdhcmUgZmxvdyBjb250cm9sIG92ZXIgc2VyaWFsIGxpbmVcbiIKICk7CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0hXRkxPVyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX21lbS5jIGIvY29tbW9uL2NtZF9tZW0uYwppbmRleCBmY2JiMDIzLi5hOTk0MjExIDEwMDY0NAotLS0gYS9jb21tb24vY21kX21lbS5jCisrKyBiL2NvbW1vbi9jbWRfbWVtLmMKQEAgLTI5LDE4ICsyOSwxOSBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01NQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTU1DKQogI2luY2x1ZGUgPG1tYy5oPgogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0hBU19EQVRBRkxBU0gKICNpbmNsdWRlIDxkYXRhZmxhc2guaD4KICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIChDRkdfQ01EX01FTU9SWQl8IFwKLQkJCUNGR19DTURfSTJDCXwgXAotCQkJQ0ZHX0NNRF9JVEVTVAl8IFwKLQkJCUNGR19DTURfUENJCXwgXAotCQkJQ01EX0NNRF9QT1JUSU8JKSApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01FTU9SWSkJCVwKKyAgICB8fCBkZWZpbmVkKENPTkZJR19DTURfSTJDKQkJXAorICAgIHx8IGRlZmluZWQoQ09ORklHX0NNRF9JVEVTVCkJXAorICAgIHx8IGRlZmluZWQoQ09ORklHX0NNRF9QQ0kpCQlcCisgICAgfHwgZGVmaW5lZChDT05GSUdfQ01EX1BPUlRJTykKKwogaW50IGNtZF9nZXRfZGF0YV9zaXplKGNoYXIqIGFyZywgaW50IGRlZmF1bHRfc2l6ZSkKIHsKIAkvKiBDaGVjayBmb3IgYSBzaXplIHNwZWNpZmljYXRpb24gLmIsIC53IG9yIC5sLgpAQCAtNjQsNyArNjUsNyBAQAogfQogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NRU1PUlkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01FTU9SWSkKIAogI2lmZGVmCUNNRF9NRU1fREVCVUcKICNkZWZpbmUJUFJJTlRGKGZtdCxhcmdzLi4uKQlwcmludGYgKGZtdCAsIyNhcmdzKQpAQCAtNDAzLDcgKzQwNCw3IEBACiAJfQogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NTUMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01NQykKIAlpZiAobW1jMmluZm8oZGVzdCkpIHsKIAkJaW50IHJjOwogCkBAIC0xMTQ5LDcgKzExNTAsNyBAQAogI2VuZGlmCS8qIENPTkZJR19DUkMzMl9WRVJJRlkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01FTU9SWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTUVNT1JZKQogVV9CT09UX0NNRCgKIAltZCwgICAgIDMsICAgICAxLCAgICAgIGRvX21lbV9tZCwKIAkibWQgICAgICAtIG1lbW9yeSBkaXNwbGF5XG4iLApAQCAtMTI1Miw0ICsxMjUzLDQgQEAKICNlbmRpZiAvKiBDT05GSUdfTVhfQ1lDTElDICovCiAKICNlbmRpZgotI2VuZGlmCS8qIENGR19DTURfTUVNT1JZICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfbWZzbC5jIGIvY29tbW9uL2NtZF9tZnNsLmMKaW5kZXggZmZhMjY2Ni4uOGQ0YzFhMyAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9tZnNsLmMKKysrIGIvY29tbW9uL2NtZF9tZnNsLmMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxjb25maWcuaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NRlNMKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NRlNMKQogI2luY2x1ZGUgPGFzbS9hc20uaD4KIAogaW50IGRvX2ZyZCAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQpAQCAtNDE0LDQgKzQxNCw0IEBACiAJCSIgMSAtIEVBUiAtIEV4Y2VwdGlvbiBhZGRyZXNzIHJlZ2lzdGVyXG4iCiAJCSIgMiAtIEVTUiAtIEV4Y2VwdGlvbiBzdGF0dXMgcmVnaXN0ZXJcbiIpOwogCi0jZW5kaWYJCQkJLyogQ09ORklHX01JQ1JPQkxBWkUgJiBDRkdfQ01EX01GU0wgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9taWkuYyBiL2NvbW1vbi9jbWRfbWlpLmMKaW5kZXggZTY1OTUzNi4uZjZiOThkMSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9taWkuYworKysgYi9jb21tb24vY21kX21paS5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAjaW5jbHVkZSA8bWlpcGh5Lmg+CiAKICNpZmRlZiBDT05GSUdfVEVSU0VfTUlJCkBAIC01OTUsNCArNTk1LDQgQEAKIAogI2VuZGlmIC8qIENPTkZJR19URVJTRV9NSUkgKi8KIAotI2VuZGlmIC8qIENGR19DTURfTUlJICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfbWlzYy5jIGIvY29tbW9uL2NtZF9taXNjLmMKaW5kZXggYTk5MjIyZC4uYzBjNmI4ZiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9taXNjLmMKKysrIGIvY29tbW9uL2NtZF9taXNjLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSVNDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NSVNDKQogCiBpbnQgZG9fc2xlZXAgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewpAQCAtNTIsNyArNTIsNyBAQAogfQogCiAvKiBJbXBsZW1lbnRlZCBpbiAkKENQVSkvaW50ZXJydXB0cy5jICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JUlEpCiBpbnQgZG9faXJxaW5mbyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOwogCiBVX0JPT1RfQ01EKApAQCAtNjAsNyArNjAsNyBAQAogCSJpcnFpbmZvIC0gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgSVJRc1xuIiwKIAlOVUxMCiApOwotI2VuZGlmICAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSAqLworI2VuZGlmCiAKIFVfQk9PVF9DTUQoCiAJc2xlZXAgLCAgICAyLCAgICAxLCAgICAgZG9fc2xlZXAsCkBAIC02OSw0ICs2OSw0IEBACiAJIiAgICAtIGRlbGF5IGV4ZWN1dGlvbiBmb3IgTiBzZWNvbmRzIChOIGlzIF9kZWNpbWFsXyAhISEpXG4iCiApOwogCi0jZW5kaWYJLyogQ0ZHX0NNRF9NSVNDICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfbW1jLmMgYi9jb21tb24vY21kX21tYy5jCmluZGV4IDU3M2ViOTcuLjA2OWM2ZDAgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfbW1jLmMKKysrIGIvY29tbW9uL2NtZF9tbWMuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01NQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTU1DKQogCiAjaW5jbHVkZSA8bW1jLmg+CiAKQEAgLTQzLDQgKzQzLDQgQEAKIAlOVUxMCiApOwogCi0jZW5kaWYJLyogQ0ZHX0NNRF9NTUMgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9uYW5kLmMgYi9jb21tb24vY21kX25hbmQuYwppbmRleCBjYjYyNjYxLi5jNzI2MTJkIDEwMDY0NAotLS0gYS9jb21tb24vY21kX25hbmQuYworKysgYi9jb21tb24vY21kX25hbmQuYwpAQCAtMTksNyArMTksNyBAQAogICovCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPHdhdGNoZG9nLmg+CkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8amZmczIvamZmczIuaD4KICNpbmNsdWRlIDxuYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCiAKIC8qIHBhcml0aW9uIGhhbmRsaW5nIHJvdXRpbmVzICovCiBpbnQgbXRkcGFydHNfaW5pdCh2b2lkKTsKQEAgLTk2LDcgKzk2LDcgQEAKIGFyZ19vZmZfc2l6ZShpbnQgYXJnYywgY2hhciAqYXJndltdLCBuYW5kX2luZm9fdCAqbmFuZCwgdWxvbmcgKm9mZiwgdWxvbmcgKnNpemUpCiB7CiAJaW50IGlkeCA9IG5hbmRfY3Vycl9kZXZpY2U7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQogCXN0cnVjdCBtdGRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHBhcnRfaW5mbyAqcGFydDsKIAl1OCBwbnVtOwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJCSpzaXplID0gbmFuZC0+c2l6ZSAtICpvZmY7CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCisjaWYgIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKIG91dDoKICNlbmRpZgogCXByaW50ZigiZGV2aWNlICVkICIsIGlkeCk7CkBAIC01MjksNyArNTI5LDcgQEAKIAljaGFyICpib290X2RldmljZSA9IE5VTEw7CiAJaW50IGlkeDsKIAl1bG9uZyBhZGRyLCBvZmZzZXQgPSAwOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKIAlzdHJ1Y3QgbXRkX2RldmljZSAqZGV2OwogCXN0cnVjdCBwYXJ0X2luZm8gKnBhcnQ7CiAJdTggcG51bTsKQEAgLTU3NCw3ICs1NzQsNyBAQAogCQlvZmZzZXQgPSBzaW1wbGVfc3RydG91bChhcmd2WzNdLCBOVUxMLCAxNik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQogdXNhZ2U6CiAjZW5kaWYKIAkJcHJpbnRmKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwpAQCAtNjA2LDcgKzYwNiw3IEBACiAJIm5ib290ICAgLSBib290IGZyb20gTkFORCBkZXZpY2VcbiIsCiAJIltwYXJ0aXRpb25dIHwgW1tbbG9hZEFkZHJdIGRldl0gb2Zmc2V0XVxuIik7CiAKLSNlbmRpZgkJCQkvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAqLworI2VuZGlmCiAKICNlbHNlIC8qIENGR19OQU5EX0xFR0FDWSAqLwogLyoKQEAgLTYyNiw3ICs2MjYsNyBAQAogIyBkZWZpbmUgc2hvd19ib290X3Byb2dyZXNzKGFyZykKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KICNpZiAwCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfaWRzLmg+CkBAIC05OTEsNiArOTkxLDYgQEAKIAkibG9hZEFkZHIgZGV2XG4iCiApOwogCi0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgKi8KKyNlbmRpZgogCiAjZW5kaWYgLyogQ0ZHX05BTkRfTEVHQUNZICovCmRpZmYgLS1naXQgYS9jb21tb24vY21kX25ldC5jIGIvY29tbW9uL2NtZF9uZXQuYwppbmRleCBmMTA5N2E5Li4wNzE1ZmJjIDEwMDY0NAotLS0gYS9jb21tb24vY21kX25ldC5jCisrKyBiL2NvbW1vbi9jbWRfbmV0LmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8bmV0Lmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogZXh0ZXJuIGludCBkb19ib290bSAoY21kX3RibF90ICosIGludCwgaW50LCBjaGFyICpbXSk7CiAKQEAgLTY3LDcgKzY3LDcgQEAKIAkiW2xvYWRBZGRyZXNzXSBbYm9vdGZpbGVuYW1lXVxuIgogKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RIQ1ApCiBpbnQgZG9fZGhjcCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJcmV0dXJuIG5ldGJvb3RfY29tbW9uKERIQ1AsIGNtZHRwLCBhcmdjLCBhcmd2KTsKQEAgLTc4LDkgKzc4LDkgQEAKIAkiZGhjcFx0LSBpbnZva2UgREhDUCBjbGllbnQgdG8gb2J0YWluIElQL2Jvb3QgcGFyYW1zXG4iLAogCSJcbiIKICk7Ci0jZW5kaWYJLyogQ0ZHX0NNRF9ESENQICovCisjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05GUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkZTKQogaW50IGRvX25mcyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJcmV0dXJuIG5ldGJvb3RfY29tbW9uKE5GUywgY21kdHAsIGFyZ2MsIGFyZ3YpOwpAQCAtOTEsNyArOTEsNyBAQAogCSJuZnNcdC0gYm9vdCBpbWFnZSB2aWEgbmV0d29yayB1c2luZyBORlMgcHJvdG9jb2xcbiIsCiAJIltsb2FkQWRkcmVzc10gW2hvc3QgaXAgYWRkcjpib290ZmlsZW5hbWVdXG4iCiApOwotI2VuZGlmCS8qIENGR19DTURfTkZTICovCisjZW5kaWYKIAogc3RhdGljIHZvaWQgbmV0Ym9vdF91cGRhdGVfZW52ICh2b2lkKQogewpAQCAtMTI3LDcgKzEyNyw3IEBACiAJCWlwX3RvX3N0cmluZyAoTmV0T3VyRE5TSVAsIHRtcCk7CiAJCXNldGVudiAoImRuc2lwIiwgdG1wKTsKIAl9Ci0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX0ROUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfRE5TMikKIAlpZiAoTmV0T3VyRE5TMklQKSB7CiAJCWlwX3RvX3N0cmluZyAoTmV0T3VyRE5TMklQLCB0bXApOwogCQlzZXRlbnYgKCJkbnNpcDIiLCB0bXApOwpAQCAtMTM2LDEzICsxMzYsMTUgQEAKIAlpZiAoTmV0T3VyTklTRG9tYWluWzBdKQogCQlzZXRlbnYgKCJkb21haW4iLCBOZXRPdXJOSVNEb21haW4pOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkgJiYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1RJTUVPRkZTRVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NOVFApIFwKKyAgICAmJiBkZWZpbmVkKENPTkZJR19CT09UUF9USU1FT0ZGU0VUKQogCWlmIChOZXRUaW1lT2Zmc2V0KSB7CiAJCXNwcmludGYgKHRtcCwgIiVkIiwgTmV0VGltZU9mZnNldCk7CiAJCXNldGVudiAoInRpbWVvZmZzZXQiLCB0bXApOwogCX0KICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NOVFApICYmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9OVFBTRVJWRVIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NOVFApIFwKKyAgICAmJiBkZWZpbmVkKENPTkZJR19CT09UUF9OVFBTRVJWRVIpCiAJaWYgKE5ldE50cFNlcnZlcklQKSB7CiAJCWlwX3RvX3N0cmluZyAoTmV0TnRwU2VydmVySVAsIHRtcCk7CiAJCXNldGVudiAoIm50cHNlcnZlcmlwIiwgdG1wKTsKQEAgLTIzMiw3ICsyMzQsNyBAQAogCXJldHVybiByY29kZTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BJTkcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BJTkcpCiBpbnQgZG9fcGluZyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJaWYgKGFyZ2MgPCAyKQpAQCAtMjU5LDkgKzI2MSw5IEBACiAJInBpbmdcdC0gc2VuZCBJQ01QIEVDSE9fUkVRVUVTVCB0byBuZXR3b3JrIGhvc3RcbiIsCiAJInBpbmdBZGRyZXNzXG4iCiApOwotI2VuZGlmCS8qIENGR19DTURfUElORyAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9DRFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NEUCkKIAogc3RhdGljIHZvaWQgY2RwX3VwZGF0ZV9lbnYodm9pZCkKIHsKQEAgLTMwMiw5ICszMDQsOSBAQAogCWNkcCwJMSwJMSwJZG9fY2RwLAogCSJjZHBcdC0gUGVyZm9ybSBDRFAgbmV0d29yayBjb25maWd1cmF0aW9uXG4iLAogKTsKLSNlbmRpZgkvKiBDRkdfQ01EX0NEUCAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TTlRQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TTlRQKQogaW50IGRvX3NudHAgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCWNoYXIgKnRvZmY7CkBAIC0zNDAsNiArMzQyLDYgQEAKIAkic250cFx0LSBzeW5jaHJvbml6ZSBSVEMgdmlhIG5ldHdvcmtcbiIsCiAJIltOVFAgc2VydmVyIElQXVxuIgogKTsKLSNlbmRpZgkvKiBDRkdfQ01EX1NOVFAgKi8KKyNlbmRpZgogCi0jZW5kaWYJLyogQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9udmVkaXQuYyBiL2NvbW1vbi9jbWRfbnZlZGl0LmMKaW5kZXggOTc3ZWM1Yi4uMWRiMGZjMyAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9udmVkaXQuYworKysgYi9jb21tb24vY21kX252ZWRpdC5jCkBAIC00Niw3ICs0Niw3IEBACiAjaW5jbHVkZSA8c2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogI2luY2x1ZGUgPG5ldC5oPgogI2VuZGlmCiAKQEAgLTE5Myw3ICsxOTMsMTIgQEAKIAkJICogRXRoZXJuZXQgQWRkcmVzcyBhbmQgc2VyaWFsIyBjYW4gYmUgc2V0IG9ubHkgb25jZSwKIAkJICogdmVyIGlzIHJlYWRvbmx5LgogCQkgKi8KKyNpZmRlZiBDT05GSUdfSEFTX1VJRAorCQkvKiBBbGxvdyBzZXJpYWwjIGZvcmNlZCBvdmVyd3JpdGUgd2l0aCAweGRlYWY0YWRkIGZsYWcgKi8KKwkJaWYgKCAoKHN0cmNtcCAobmFtZSwgInNlcmlhbCMiKSA9PSAwKSAmJiAoZmxhZyAhPSAweGRlYWY0YWRkKSkgfHwKKyNlbHNlCiAJCWlmICggKHN0cmNtcCAobmFtZSwgInNlcmlhbCMiKSA9PSAwKSB8fAorI2VuZGlmCiAJCSAgICAoKHN0cmNtcCAobmFtZSwgImV0aGFkZHIiKSA9PSAwKQogI2lmIGRlZmluZWQoQ09ORklHX09WRVJXUklURV9FVEhBRERSX09OQ0UpICYmIGRlZmluZWQoQ09ORklHX0VUSEFERFIpCiAJCSAgICAgJiYgKHN0cmNtcCAoKGNoYXIgKillbnZfZ2V0X2FkZHIob2xkdmFsKSxNS19TVFIoQ09ORklHX0VUSEFERFIpKSAhPSAwKQpAQCAtMzY3LDEyICszNzIsMTIgQEAKIAkJbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOwogCQlyZXR1cm4gMDsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJaWYgKHN0cmNtcChhcmd2WzFdLCJib290ZmlsZSIpID09IDApIHsKIAkJY29weV9maWxlbmFtZSAoQm9vdEZpbGUsIGFyZ3ZbMl0sIHNpemVvZihCb290RmlsZSkpOwogCQlyZXR1cm4gMDsKIAl9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FNSUdBT05FRzNTRQogCWlmIChzdHJjbXAoYXJndlsxXSwgInZnYV9mZ19jb2xvciIpID09IDAgfHwKQEAgLTM5Nyw3ICs0MDIsMTUgQEAKIAkJX2RvX3NldGVudiAoMCwgMywgYXJndik7CiB9CiAKLWludCBkb19zZXRlbnYgKCBjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKyNpZmRlZiBDT05GSUdfSEFTX1VJRAordm9pZCBmb3JjZWVudiAoY2hhciAqdmFybmFtZSwgY2hhciAqdmFydmFsdWUpCit7CisJY2hhciAqYXJndls0XSA9IHsgImZvcmNlZW52IiwgdmFybmFtZSwgdmFydmFsdWUsIE5VTEwgfTsKKwlfZG9fc2V0ZW52ICgweGRlYWY0YWRkLCAzLCBhcmd2KTsKK30KKyNlbmRpZgorCitpbnQgZG9fc2V0ZW52IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlpZiAoYXJnYyA8IDIpIHsKIAkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKQEAgLTQxMSw3ICs0MjQsNyBAQAogICogUHJvbXB0IGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZQogICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BU0tFTlYpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0FTS0VOVikKIGludCBkb19hc2tlbnYgKCBjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlleHRlcm4gY2hhciBjb25zb2xlX2J1ZmZlcltDRkdfQ0JTSVpFXTsKQEAgLTQ4Myw3ICs0OTYsNyBAQAogCS8qIENvbnRpbnVlIGNhbGxpbmcgc2V0ZW52IGNvZGUgKi8KIAlyZXR1cm4gX2RvX3NldGVudiAoZmxhZywgbGVuLCBsb2NhbF9hcmdzKTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX0FTS0VOViAqLworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIExvb2sgdXAgdmFyaWFibGUgZnJvbSBlbnZpcm9ubWVudCwKQEAgLTUzOCwxMSArNTUxLDkgQEAKIAlyZXR1cm4gKC0xKTsKIH0KIAotI2lmIGRlZmluZWQoQ0ZHX0VOVl9JU19JTl9OVlJBTSkgfHwgZGVmaW5lZChDRkdfRU5WX0lTX0lOX0VFUFJPTSkgfHwgXAotICAgICgoQ09ORklHX0NPTU1BTkRTICYgKENGR19DTURfRU5WfENGR19DTURfRkxBU0gpKSA9PSBcCi0gICAgICAoQ0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9GTEFTSCkpIHx8IFwKLSAgICAoKENPTkZJR19DT01NQU5EUyAmIChDRkdfQ01EX0VOVnxDRkdfQ01EX05BTkQpKSA9PSBcCi0gICAgICAoQ0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9OQU5EKSkKKyNpZiBkZWZpbmVkKENGR19FTlZfSVNfSU5fTlZSQU0pIHx8IGRlZmluZWQoQ0ZHX0VOVl9JU19JTl9FRVBST00pIFwKKyAgICB8fCAoZGVmaW5lZChDT05GSUdfQ01EX0VOVikgJiYgZGVmaW5lZChDT05GSUdfQ01EX0ZMQVNIKSkgXAorICAgIHx8IChkZWZpbmVkKENPTkZJR19DTURfRU5WKSAmJiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkpCiBpbnQgZG9fc2F2ZWVudiAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJZXh0ZXJuIGNoYXIgKiBlbnZfbmFtZV9zcGVjOwpAQCAtNTUyLDcgKzU2Myw2IEBACiAJcmV0dXJuIChzYXZlZW52KCkgPyAxIDogMCk7CiB9CiAKLQogI2VuZGlmCiAKIApAQCAtNTk2LDIwICs2MDYsMTggQEAKIAkiICAgIC0gZGVsZXRlIGVudmlyb25tZW50IHZhcmlhYmxlICduYW1lJ1xuIgogKTsKIAotI2lmIGRlZmluZWQoQ0ZHX0VOVl9JU19JTl9OVlJBTSkgfHwgZGVmaW5lZChDRkdfRU5WX0lTX0lOX0VFUFJPTSkgfHwgXAotICAgICgoQ09ORklHX0NPTU1BTkRTICYgKENGR19DTURfRU5WfENGR19DTURfRkxBU0gpKSA9PSBcCi0gICAgICAoQ0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9GTEFTSCkpIHx8IFwKLSAgICAoKENPTkZJR19DT01NQU5EUyAmIChDRkdfQ01EX0VOVnxDRkdfQ01EX05BTkQpKSA9PSBcCi0gICAgICAoQ0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9OQU5EKSkKKyNpZiBkZWZpbmVkKENGR19FTlZfSVNfSU5fTlZSQU0pIHx8IGRlZmluZWQoQ0ZHX0VOVl9JU19JTl9FRVBST00pIFwKKyAgICB8fCAoZGVmaW5lZChDT05GSUdfQ01EX0VOVikgJiYgZGVmaW5lZChDT05GSUdfQ01EX0ZMQVNIKSkgXAorICAgIHx8IChkZWZpbmVkKENPTkZJR19DTURfRU5WKSAmJiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkpCiBVX0JPT1RfQ01EKAogCXNhdmVlbnYsIDEsIDAsCWRvX3NhdmVlbnYsCiAJInNhdmVlbnYgLSBzYXZlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwZXJzaXN0ZW50IHN0b3JhZ2VcbiIsCiAJTlVMTAogKTsKIAotI2VuZGlmCS8qIENGR19DTURfRU5WICovCisjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FTS0VOVikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQVNLRU5WKQogCiBVX0JPT1RfQ01EKAogCWFza2VudiwJQ0ZHX01BWEFSR1MsCTEsCWRvX2Fza2VudiwKQEAgLTYyNCw5ICs2MzIsOSBAQAogCSIgICAgLSBkaXNwbGF5ICdtZXNzYWdlJyBzdHJpbmcgYW5kIGdldCBlbnZpcm9ubWVudCB2YXJpYWJsZSAnbmFtZSciCiAJImZyb20gc3RkaW4gKG1heCAnc2l6ZScgY2hhcnMpXG4iCiApOwotI2VuZGlmCS8qIENGR19DTURfQVNLRU5WICovCisjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1JVTikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUlVOKQogaW50IGRvX3J1biAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOwogVV9CT09UX0NNRCgKIAlydW4sCUNGR19NQVhBUkdTLAkxLAlkb19ydW4sCkBAIC02MzQsNCArNjQyLDQgQEAKIAkidmFyIFsuLi5dXG4iCiAJIiAgICAtIHJ1biB0aGUgY29tbWFuZHMgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlKHMpICd2YXInXG4iCiApOwotI2VuZGlmICAvKiBDRkdfQ01EX1JVTiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX3BjaS5jIGIvY29tbW9uL2NtZF9wY2kuYwppbmRleCA0NTA4NTQ2Li44YmU2ZGE5IDEwMDY0NAotLS0gYS9jb21tb24vY21kX3BjaS5jCisrKyBiL2NvbW1vbi9jbWRfcGNpLmMKQEAgLTM4LDcgKzM4LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxwY2kuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENJKQogCiBleHRlcm4gaW50IGNtZF9nZXRfZGF0YV9zaXplKGNoYXIqIGFyZywgaW50IGRlZmF1bHRfc2l6ZSk7CiAKQEAgLTU2NSw2ICs1NjUsNiBAQAogCSIgICAgLSB3cml0ZSB0byBDRkcgYWRkcmVzc1xuIgogKTsKIAotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDSSkgKi8KKyNlbmRpZgogCiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9wY21jaWEuYyBiL2NvbW1vbi9jbWRfcGNtY2lhLmMKaW5kZXggYjFhNTk0Zi4uZGNkMDdjMCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9wY21jaWEuYworKysgYi9jb21tb24vY21kX3BjbWNpYS5jCkBAIC02MSw3ICs2MSw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIAogZXh0ZXJuIGludCBwY21jaWFfb24gKHZvaWQpOwogZXh0ZXJuIGludCBwY21jaWFfb2ZmICh2b2lkKTsKQEAgLTkzLDEzICs5MywxMyBAQAogCQkJInBpbml0IG9mZiAtIHBvd2VyIG9mZiBQQ01DSUEgc29ja2V0XG4iCiAJICApOwogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjdW5kZWYJQ0hFQ0tfSURFX0RFVklDRQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ0hFQ0tfSURFX0RFVklDRQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfcG9ydGlvLmMgYi9jb21tb24vY21kX3BvcnRpby5jCmluZGV4IGQyZTRjNGIuLmJmZTMzZTMgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfcG9ydGlvLmMKKysrIGIvY29tbW9uL2NtZF9wb3J0aW8uYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BPUlRJTykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUE9SVElPKQogCiBleHRlcm4gaW50IGNtZF9nZXRfZGF0YV9zaXplIChjaGFyICphcmcsIGludCBkZWZhdWx0X3NpemUpOwogCkBAIC0xNjYsNCArMTY2LDQgQEAKIAkiICAgIC0gcmVhZCBkYXR1bSBmcm9tIElPIHBvcnRcbiIKICk7CiAKLSNlbmRpZgkvKiBDRkdfQ01EX1BPUlRJTyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX3JlZ2luZm8uYyBiL2NvbW1vbi9jbWRfcmVnaW5mby5jCmluZGV4IGY0MjhmN2UuLjE3ZTljZDkgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfcmVnaW5mby5jCisrKyBiL2NvbW1vbi9jbWRfcmVnaW5mby5jCkBAIC0zMiw3ICszMiw4IEBACiAjZWxpZiBkZWZpbmVkIChDT05GSUdfTVBDNTIwMCkKICNpbmNsdWRlIDxtcGM1eHh4Lmg+CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9SRUdJTkZPKQorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1JFR0lORk8pCiAKIGludCBkb19yZWdpbmZvIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKQEAgLTMzNCwxNCArMzM1LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1JFR0lORk8gKi8KKyNlbmRpZgogCiAKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZiAoIGRlZmluZWQoQ09ORklHXzh4eCkgICB8fCBkZWZpbmVkKENPTkZJR180MDVHUCkgfHwgXAogICAgICAgZGVmaW5lZChDT05GSUdfNDA1RVApIHx8IGRlZmluZWQoQ09ORklHX01QQzUyMDApICApICYmIFwKLSAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9SRUdJTkZPKQorICAgIGRlZmluZWQoQ09ORklHX0NNRF9SRUdJTkZPKQogCiBVX0JPT1RfQ01EKAogIAlyZWdpbmZvLAkyLAkxLAlkb19yZWdpbmZvLApkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9yZWlzZXIuYyBiL2NvbW1vbi9jbWRfcmVpc2VyLmMKaW5kZXggZDgzYzMxYS4uMWJhMzkyOSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9yZWlzZXIuYworKysgYi9jb21tb24vY21kX3JlaXNlci5jCkBAIC0yOCw3ICsyOCw3IEBACiAgKi8KICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1JFSVNFUikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUkVJU0VSKQogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxpbWFnZS5oPgpAQCAtMjQwLDQgKzI0MCw0IEBACiAJIiAgICAgIHRvIGFkZHJlc3MgJ2FkZHInIGZyb20gZG9zIGZpbGVzeXN0ZW1cbiIKICk7CiAKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1JFSVNFUiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX3Njc2kuYyBiL2NvbW1vbi9jbWRfc2NzaS5jCmluZGV4IDAwYjg0ZmEuLmY1NjM5MzEgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfc2NzaS5jCisrKyBiL2NvbW1vbi9jbWRfc2NzaS5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8aW1hZ2UuaD4KICNpbmNsdWRlIDxwY2kuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpCiAKICNpZmRlZiBDT05GSUdfU0NTSV9TWU01M0M4WFgKICNkZWZpbmUgU0NTSV9WRU5EX0lECTB4MTAwMApAQCAtNjA5LDQgKzYwOSw0IEBACiAJImxvYWRBZGRyIGRldjpwYXJ0XG4iCiApOwogCi0jZW5kaWYgLyogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfc3BpLmMgYi9jb21tb24vY21kX3NwaS5jCmluZGV4IGE2ZmRmN2YuLjMxMThkMjcgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfc3BpLmMKKysrIGIvY29tbW9uL2NtZF9zcGkuYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxzcGkuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NQSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU1BJKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBEZWZpbml0aW9ucwpAQCAtMTQwLDQgKzE0MCw0IEBACiAJIjxkb3V0PiAgICAtIEhleGFkZWNpbWFsIHN0cmluZyB0aGF0IGdldHMgc2VudFxuIgogKTsKIAotI2VuZGlmCS8qIENGR19DTURfU1BJICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfdW5pdmVyc2UuYyBiL2NvbW1vbi9jbWRfdW5pdmVyc2UuYwppbmRleCA4ZDdiNmZlLi44YmYwYjFmIDEwMDY0NAotLS0gYS9jb21tb24vY21kX3VuaXZlcnNlLmMKKysrIGIvY29tbW9uL2NtZF91bml2ZXJzZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAKICNpbmNsdWRlIDx1bml2ZXJzZS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVU5JVkVSU0UpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1VOSVZFUlNFKQogCiAjZGVmaW5lIFBDSV9WRU5ET1IgUENJX1ZFTkRPUl9JRF9UVU5EUkEKICNkZWZpbmUgUENJX0RFVklDRSBQQ0lfREVWSUNFX0lEX1RVTkRSQV9DQTkxQzA0MgpAQCAtMzg3LDQgKzM4Nyw0IEBACiAJIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDMgLT4gRDMyIERhdGEgV2lkdGhcbiIKICk7CiAKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VTklWRVJTRSkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF91c2IuYyBiL2NvbW1vbi9jbWRfdXNiLmMKaW5kZXggOTA0ZGY3MS4uNDVlMDdmMSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF91c2IuYworKysgYi9jb21tb24vY21kX3VzYi5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPHBhcnQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfVVNCKQogCiAjaW5jbHVkZSA8dXNiLmg+CiAKQEAgLTYwOSwxMCArNjA5LDEwIEBACiB9CiAKIAotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikgKi8KKyNlbmRpZgogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1VTQikKIAogI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRQogVV9CT09UX0NNRCgKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfdmZkLmMgYi9jb21tb24vY21kX3ZmZC5jCmluZGV4IDVlNjIzYTIuLjI5YzM0OWQgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfdmZkLmMKKysrIGIvY29tbW9uL2NtZF92ZmQuYwpAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1ZGRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfVkZEKQogCiAjaW5jbHVkZSA8dmZkX2xvZ28uaD4KICNkZWZpbmUgVkZEX1RFU1RfTE9HT19CTVBOUiAwCkBAIC03Myw3ICs3Myw3IEBACiAJInZmZCBBRERSXG4iCiAJIiAgICAtIGxvYWQgYml0bWFwIGF0IGFkZHJlc3MgQUREUlxuIgogKTsKLSNlbmRpZgkvKiBDRkdfQ01EX1ZGRCAqLworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfVkZECiBpbnQgdHJhYl92ZmQgKHVsb25nIGJpdG1hcCkKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfeGltZy5jIGIvY29tbW9uL2NtZF94aW1nLmMKaW5kZXggODM1OTE1My4uNTJlMDYxNCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF94aW1nLmMKKysrIGIvY29tbW9uL2NtZF94aW1nLmMKQEAgLTI0LDcgKzI0LDcgQEAKICAqIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1hJTUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1hJTUcpCiAKIC8qCiAgKiBNdWx0aSBJbWFnZSBleHRyYWN0CkBAIC0xNDEsNCArMTQxLDQgQEAKIAkgICAiYWRkciBwYXJ0IFtkZXN0XVxuIgogCSAgICIgICAgLSBleHRyYWN0IDxwYXJ0PiBmcm9tIGltYWdlIGF0IDxhZGRyPiBhbmQgY29weSB0byA8ZGVzdD5cbiIpOwogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9YSU1HICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jb21tYW5kLmMgYi9jb21tb24vY29tbWFuZC5jCmluZGV4IGU5MTc5NzUuLmFmMmY4Y2IgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jb21tYW5kLmMKKysrIGIvY29tbW9uL2NvbW1hbmQuYwpAQCAtNDIsNyArNDIsNyBAQAogCU5VTEwKICk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FQ0hPKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9FQ0hPKQogCiBpbnQKIGRvX2VjaG8gKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQpAQCAtNzYsNyArNzYsNyBAQAogCSIgICAgLSBlY2hvIGFyZ3MgdG8gY29uc29sZTsgXFxjIHN1cHByZXNzZXMgbmV3bGluZVxuIgogKTsKIAotI2VuZGlmCS8qICBDRkdfQ01EX0VDSE8gKi8KKyNlbmRpZgogCiAjaWZkZWYgQ0ZHX0hVU0hfUEFSU0VSCiAKQEAgLTQwOSw3ICs0MDksNyBAQAogewogCWluc3RhbGxfYXV0b19jb21wbGV0ZV9oYW5kbGVyKCJwcmludGVudiIsIHZhcl9jb21wbGV0ZSk7CiAJaW5zdGFsbF9hdXRvX2NvbXBsZXRlX2hhbmRsZXIoInNldGVudiIsIHZhcl9jb21wbGV0ZSk7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUlVOKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9SVU4pCiAJaW5zdGFsbF9hdXRvX2NvbXBsZXRlX2hhbmRsZXIoInJ1biIsIHZhcl9jb21wbGV0ZSk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2NvbW1vbi9kb2NlY2MuYyBiL2NvbW1vbi9kb2NlY2MuYwppbmRleCA3OWFkYjQ4Li41ZGFhNmZjIDEwMDY0NAotLS0gYS9jb21tb24vZG9jZWNjLmMKKysrIGIvY29tbW9uL2RvY2VjYy5jCkBAIC0zMSw3ICszMSw3IEBACiAjdW5kZWYgRUNDX0RFQlVHCiAjdW5kZWYgUFNZQ0hPX0RFQlVHCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIAogI2luY2x1ZGUgPGxpbnV4L210ZC9kb2MyMDAwLmg+CiAKQEAgLTUxNCw0ICs1MTQsNCBAQAogICAgIHJldHVybiBuYl9lcnJvcnM7CiB9CiAKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9lbnZfZmxhc2guYyBiL2NvbW1vbi9lbnZfZmxhc2guYwppbmRleCAxNjc0YjMwLi43YTM3ZTU1IDEwMDY0NAotLS0gYS9jb21tb24vZW52X2ZsYXNoLmMKKysrIGIvY29tbW9uL2Vudl9mbGFzaC5jCkBAIC0zNywxMCArMzcsMTAgQEAKIAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyYoQ0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9GTEFTSCkpID09IChDRkdfQ01EX0VOVnxDRkdfQ01EX0ZMQVNIKSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRU5WKSAmJiBkZWZpbmVkKENPTkZJR19DTURfRkxBU0gpCiAjZGVmaW5lIENNRF9TQVZFRU5WCiAjZWxpZiBkZWZpbmVkKENGR19FTlZfQUREUl9SRURVTkQpCi0jZXJyb3IgQ2Fubm90IHVzZSBDRkdfRU5WX0FERFJfUkVEVU5EIHdpdGhvdXQgQ0ZHX0NNRF9FTlYgJiBDRkdfQ01EX0ZMQVNICisjZXJyb3IgQ2Fubm90IHVzZSBDRkdfRU5WX0FERFJfUkVEVU5EIHdpdGhvdXQgQ09ORklHX0NNRF9FTlYgJiBDT05GSUdfQ01EX0ZMQVNICiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ0ZHX0VOVl9TSVpFX1JFRFVORCkgJiYgKENGR19FTlZfU0laRV9SRURVTkQgPCBDRkdfRU5WX1NJWkUpCmRpZmYgLS1naXQgYS9jb21tb24vZW52X25hbmQuYyBiL2NvbW1vbi9lbnZfbmFuZC5jCmluZGV4IDY3YzRhNGUuLjM4YTA3ZjggMTAwNjQ0Ci0tLSBhL2NvbW1vbi9lbnZfbmFuZC5jCisrKyBiL2NvbW1vbi9lbnZfbmFuZC5jCkBAIC0zOSwxMCArMzksMTAgQEAKICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxuYW5kLmg+CiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyYoQ0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9OQU5EKSkgPT0gKENGR19DTURfRU5WfENGR19DTURfTkFORCkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0VOVikgJiYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjZGVmaW5lIENNRF9TQVZFRU5WCiAjZWxpZiBkZWZpbmVkKENGR19FTlZfT0ZGU0VUX1JFRFVORCkKLSNlcnJvciBDYW5ub3QgdXNlIENGR19FTlZfT0ZGU0VUX1JFRFVORCB3aXRob3V0IENGR19DTURfRU5WICYgQ0ZHX0NNRF9OQU5ECisjZXJyb3IgQ2Fubm90IHVzZSBDRkdfRU5WX09GRlNFVF9SRURVTkQgd2l0aG91dCBDT05GSUdfQ01EX0VOViAmIENPTkZJR19DTURfTkFORAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENGR19FTlZfU0laRV9SRURVTkQpICYmIChDRkdfRU5WX1NJWkVfUkVEVU5EICE9IENGR19FTlZfU0laRSkKZGlmZiAtLWdpdCBhL2NvbW1vbi9leHBvcnRzLmMgYi9jb21tb24vZXhwb3J0cy5jCmluZGV4IDBjYjQzOTYuLmVjNDY1NmIgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9leHBvcnRzLmMKKysrIGIvY29tbW9uL2V4cG9ydHMuYwpAQCAtMjgsMTIgKzI4LDE0IEBACiAJZ2QtPmp0W1hGX2dldF90aW1lcl0gPSAodm9pZCAqKSBnZXRfdGltZXI7CiAJZ2QtPmp0W1hGX3NpbXBsZV9zdHJ0b3VsXSA9ICh2b2lkICopIHNpbXBsZV9zdHJ0b3VsOwogCWdkLT5qdFtYRl91ZGVsYXldID0gKHZvaWQgKikgdWRlbGF5OworCWdkLT5qdFtYRl9zaW1wbGVfc3RydG9sXSA9ICh2b2lkICopIHNpbXBsZV9zdHJ0b2w7CisJZ2QtPmp0W1hGX3N0cmNtcF0gPSAodm9pZCAqKSBzdHJjbXA7CiAjaWYgZGVmaW5lZChDT05GSUdfSTM4NikgfHwgZGVmaW5lZChDT05GSUdfUFBDKQogCWdkLT5qdFtYRl9pbnN0YWxsX2hkbHJdID0gKHZvaWQgKikgaXJxX2luc3RhbGxfaGFuZGxlcjsKIAlnZC0+anRbWEZfZnJlZV9oZGxyXSA9ICh2b2lkICopIGlycV9mcmVlX2hhbmRsZXI7CiAjZW5kaWYJLyogSTM4NiB8fCBQUEMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JMkMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0kyQykKIAlnZC0+anRbWEZfaTJjX3dyaXRlXSA9ICh2b2lkICopIGkyY193cml0ZTsKIAlnZC0+anRbWEZfaTJjX3JlYWRdID0gKHZvaWQgKikgaTJjX3JlYWQ7Ci0jZW5kaWYJLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZkdF9zdXBwb3J0LmMgYi9jb21tb24vZmR0X3N1cHBvcnQuYwppbmRleCA2OTA5OWM0Li5jYWFhNjgyIDEwMDY0NAotLS0gYS9jb21tb24vZmR0X3N1cHBvcnQuYworKysgYi9jb21tb24vZmR0X3N1cHBvcnQuYwpAQCAtMzcsNiArMzcsMTAgQEAKICAqLwogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKKy8qCisgKiBmZHQgcG9pbnRzIHRvIG91ciB3b3JraW5nIGRldmljZSB0cmVlLgorICovCitzdHJ1Y3QgZmR0X2hlYWRlciAqZmR0OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTQ1LDEzICs0OSwxMiBAQAogCWJkX3QgKmJkID0gZ2QtPmJkOwogCWludCAgIG5vZGVvZmZzZXQ7CiAJaW50ICAgZXJyOwotCXUzMiAgIHRtcDsJCQkvKiB1c2VkIHRvIHNldCAzMiBiaXQgaW50ZWdlciBwcm9wZXJ0aWVzICovCi0JY2hhciAgKnN0cjsJCQkvKiB1c2VkIHRvIHNldCBzdHJpbmcgcHJvcGVydGllcyAqLwotCXVsb25nIGNsb2NrOworCXUzMiAgIHRtcDsJCS8qIHVzZWQgdG8gc2V0IDMyIGJpdCBpbnRlZ2VyIHByb3BlcnRpZXMgKi8KKwljaGFyICAqc3RyOwkJLyogdXNlZCB0byBzZXQgc3RyaW5nIHByb3BlcnRpZXMgKi8KIAogCWVyciA9IGZkdF9jaGVja19oZWFkZXIoZmR0KTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJcHJpbnRmKCJmZHRfY2hvc2VuOiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNjMsMTEgKzY2LDEyIEBACiAKIAkJZXJyID0gZmR0X251bV9yZXNlcnZlbWFwKGZkdCwgJnVzZWQsICZ0b3RhbCk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCXByaW50ZigiZmR0X2Nob3NlbjogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJaWYgKHVzZWQgPj0gdG90YWwpIHsKLQkJCXByaW50ZigiZmR0X2Nob3Nlbjogbm8gcm9vbSBpbiB0aGUgcmVzZXJ2ZWQgbWFwICglZCBvZiAlZClcbiIsCisJCQlwcmludGYoIldBUk5JTkc6ICIKKwkJCQkibm8gcm9vbSBpbiB0aGUgcmVzZXJ2ZWQgbWFwICglZCBvZiAlZClcbiIsCiAJCQkJdXNlZCwgdG90YWwpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC04NCw3ICs4OCw3IEBACiAJCWVyciA9IGZkdF9yZXBsYWNlX3Jlc2VydmVtYXBfZW50cnkoZmR0LCBqLAogCQkJaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kIC0gaW5pdHJkX3N0YXJ0ICsgMSk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCXByaW50ZigiZmR0X2Nob3NlbjogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC05Miw3ICs5Niw3IEBACiAJLyoKIAkgKiBGaW5kIHRoZSAiY2hvc2VuIiBub2RlLgogCSAqLwotCW5vZGVvZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZkdCwgIi9jaG9zZW4iKTsKKwlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoIChmZHQsICIvY2hvc2VuIik7CiAKIAkvKgogCSAqIElmIHdlIGhhdmUgYSAiY2hvc2VuIiBub2RlIGFscmVhZHkgdGhlICJmb3JjZSB0aGUgd3JpdGluZyIKQEAgLTExMCw3ICsxMTQsOCBAQAogCQkgKi8KIAkJbm9kZW9mZnNldCA9IGZkdF9hZGRfc3Vibm9kZShmZHQsIDAsICJjaG9zZW4iKTsKIAkJaWYgKG5vZGVvZmZzZXQgPCAwKSB7Ci0JCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihub2Rlb2Zmc2V0KSk7CisJCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBjcmVhdGUgL2Nob3NlbiAlcy5cbiIsCisJCQkJZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKIAkJCXJldHVybiBub2Rlb2Zmc2V0OwogCQl9CiAJfQpAQCAtMTIwLDQyICsxMjUsMzUgQEAKIAkgKi8KIAlzdHIgPSBnZXRlbnYoImJvb3RhcmdzIik7CiAJaWYgKHN0ciAhPSBOVUxMKSB7Ci0JCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImJvb3RhcmdzIiwgc3RyLCBzdHJsZW4oc3RyKSsxKTsKKwkJZXJyID0gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LAorCQkJImJvb3RhcmdzIiwgc3RyLCBzdHJsZW4oc3RyKSsxKTsKIAkJaWYgKGVyciA8IDApCi0JCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCXByaW50ZigiV0FSTklORzogY291bGQgbm90IHNldCBib290YXJncyAlcy5cbiIsCisJCQkJZmR0X3N0cmVycm9yKGVycikpOwogCX0KIAlpZiAoaW5pdHJkX3N0YXJ0ICYmIGluaXRyZF9lbmQpIHsKIAkJdG1wID0gX19jcHVfdG9fYmUzMihpbml0cmRfc3RhcnQpOwotCQllcnIgPSBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsICJsaW51eCxpbml0cmQtc3RhcnQiLCAmdG1wLCBzaXplb2YodG1wKSk7CisJCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwKKwkJCSAibGludXgsaW5pdHJkLXN0YXJ0IiwgJnRtcCwgc2l6ZW9mKHRtcCkpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJcHJpbnRmKCJXQVJOSU5HOiAiCisJCQkJImNvdWxkIG5vdCBzZXQgbGludXgsaW5pdHJkLXN0YXJ0ICVzLlxuIiwKKwkJCQlmZHRfc3RyZXJyb3IoZXJyKSk7CiAJCXRtcCA9IF9fY3B1X3RvX2JlMzIoaW5pdHJkX2VuZCk7Ci0JCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImxpbnV4LGluaXRyZC1lbmQiLCAmdG1wLCBzaXplb2YodG1wKSk7CisJCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwKKwkJCSJsaW51eCxpbml0cmQtZW5kIiwgJnRtcCwgc2l6ZW9mKHRtcCkpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJcHJpbnRmKCJXQVJOSU5HOiBjb3VsZCBub3Qgc2V0IGxpbnV4LGluaXRyZC1lbmQgJXMuXG4iLAorCQkJCWZkdF9zdHJlcnJvcihlcnIpKTsKIAl9CiAjaWZkZWYgT0ZfU1RET1VUX1BBVEgKLQllcnIgPSBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsICJsaW51eCxzdGRvdXQtcGF0aCIsIE9GX1NURE9VVF9QQVRILCBzdHJsZW4oT0ZfU1RET1VUX1BBVEgpKzEpOworCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwKKwkJImxpbnV4LHN0ZG91dC1wYXRoIiwgT0ZfU1RET1VUX1BBVEgsIHN0cmxlbihPRl9TVERPVVRfUEFUSCkrMSk7CiAJaWYgKGVyciA8IDApCi0JCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBzZXQgbGludXgsc3Rkb3V0LXBhdGggJXMuXG4iLAorCQkJZmR0X3N0cmVycm9yKGVycikpOwogI2VuZGlmCiAKLQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmZHQsICIvY3B1cyIpOwotCWlmIChub2Rlb2Zmc2V0ID49IDApIHsKLQkJY2xvY2sgPSBjcHVfdG9fYmUzMihiZC0+YmlfaW50ZnJlcSk7Ci0JCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImNsb2NrLWZyZXF1ZW5jeSIsICZjbG9jaywgNCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcHJpbnRmKCJsaWJmZHQ6ICVzXG4iLCBmZHRfc3RyZXJyb3IoZXJyKSk7Ci0JfQotI2lmZGVmIE9GX1RCQ0xLCi0Jbm9kZW9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZmR0LCAiL2NwdXMvIiBPRl9DUFUgIi90aW1lYmFzZS1mcmVxdWVuY3kiKTsKLQlpZiAobm9kZW9mZnNldCA+PSAwKSB7Ci0JCWNsb2NrID0gY3B1X3RvX2JlMzIoT0ZfVEJDTEspOwotCQllcnIgPSBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsICJjbG9jay1mcmVxdWVuY3kiLCAmY2xvY2ssIDQpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOwotCX0KLSNlbmRpZgogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE3Nyw3ICsxNzUsNyBAQAogCiAJZXJyID0gZmR0X2NoZWNrX2hlYWRlcihmZHQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQlwcmludGYoImZkdF9lbnY6ICVzXG4iLCBmZHRfc3RyZXJyb3IoZXJyKSk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xODUsMTEgKzE4MywxMSBAQAogCSAqIFNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSAidS1ib290LWVudiIgbm9kZSwgZGVsZXRlIGl0IGlmIHNvLgogCSAqIFRoZW4gY3JlYXRlIGEgbmV3IGVtcHR5IG5vZGUuCiAJICovCi0Jbm9kZW9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZmR0LCAiL3UtYm9vdC1lbnYiKTsKKwlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoIChmZHQsICIvdS1ib290LWVudiIpOwogCWlmIChub2Rlb2Zmc2V0ID49IDApIHsKIAkJZXJyID0gZmR0X2RlbF9ub2RlKGZkdCwgbm9kZW9mZnNldCk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCXByaW50ZigiZmR0X2VudjogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC0xOTgsNyArMTk2LDggQEAKIAkgKi8KIAlub2Rlb2Zmc2V0ID0gZmR0X2FkZF9zdWJub2RlKGZkdCwgMCwgInUtYm9vdC1lbnYiKTsKIAlpZiAobm9kZW9mZnNldCA8IDApIHsKLQkJcHJpbnRmKCJsaWJmZHQ6ICVzXG4iLCBmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOworCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBjcmVhdGUgL3UtYm9vdC1lbnYgJXMuXG4iLAorCQkJZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKIAkJcmV0dXJuIG5vZGVvZmZzZXQ7CiAJfQogCkBAIC0yMjYsNyArMjI1LDggQEAKIAkJCWNvbnRpbnVlOwogCQllcnIgPSBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIGx2YWwsIHJ2YWwsIHN0cmxlbihydmFsKSsxKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJcHJpbnRmKCJXQVJOSU5HOiBjb3VsZCBub3Qgc2V0ICVzICVzLlxuIiwKKwkJCQlsdmFsLCBmZHRfc3RyZXJyb3IoZXJyKSk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQpAQCAtMjkyLDEyICsyOTIsMTIgQEAKIAliZF90ICpiZCA9IGdkLT5iZDsKIAlpbnQgICBub2Rlb2Zmc2V0OwogCWludCAgIGVycjsKLQl1MzIgICB0bXA7CQkJLyogdXNlZCB0byBzZXQgMzIgYml0IGludGVnZXIgcHJvcGVydGllcyAqLworCXUzMiAgIHRtcDsJCS8qIHVzZWQgdG8gc2V0IDMyIGJpdCBpbnRlZ2VyIHByb3BlcnRpZXMgKi8KIAlpbnQgaTsKIAogCWVyciA9IGZkdF9jaGVja19oZWFkZXIoZmR0KTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJcHJpbnRmKCJmZHRfYmRfdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTMwNSwxMSArMzA1LDExIEBACiAJICogU2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhICJiZF90IiBub2RlLCBkZWxldGUgaXQgaWYgc28uCiAJICogVGhlbiBjcmVhdGUgYSBuZXcgZW1wdHkgbm9kZS4KIAkgKi8KLQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmZHQsICIvYmRfdCIpOworCW5vZGVvZmZzZXQgPSBmZHRfZmluZF9ub2RlX2J5X3BhdGggKGZkdCwgIi9iZF90Iik7CiAJaWYgKG5vZGVvZmZzZXQgPj0gMCkgewogCQllcnIgPSBmZHRfZGVsX25vZGUoZmR0LCBub2Rlb2Zmc2V0KTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJcHJpbnRmKCJmZHRfYmRfdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC0zMTgsNyArMzE4LDkgQEAKIAkgKi8KIAlub2Rlb2Zmc2V0ID0gZmR0X2FkZF9zdWJub2RlKGZkdCwgMCwgImJkX3QiKTsKIAlpZiAobm9kZW9mZnNldCA8IDApIHsKLQkJcHJpbnRmKCJsaWJmZHQ6ICVzXG4iLCBmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOworCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBjcmVhdGUgL2JkX3QgJXMuXG4iLAorCQkJZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKKwkJcHJpbnRmKCJmZHRfYmRfdDogJXNcbiIsIGZkdF9zdHJlcnJvcihub2Rlb2Zmc2V0KSk7CiAJCXJldHVybiBub2Rlb2Zmc2V0OwogCX0KIAkvKgpAQCAtMzI2LDIwICszMjgsMjMgQEAKIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJkX21hcCkvc2l6ZW9mKGJkX21hcFswXSk7IGkrKykgewogCQl0bXAgPSBjcHVfdG9fYmUzMihnZXRlbnYoImJvb3RhcmdzIikpOwotCQllcnIgPSBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIGJkX21hcFtpXS5uYW1lLCAmdG1wLCBzaXplb2YodG1wKSk7CisJCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwKKwkJCWJkX21hcFtpXS5uYW1lLCAmdG1wLCBzaXplb2YodG1wKSk7CiAJCWlmIChlcnIgPCAwKQotCQkJcHJpbnRmKCJsaWJmZHQ6ICVzXG4iLCBmZHRfc3RyZXJyb3IoZXJyKSk7CisJCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBzZXQgJXMgJXMuXG4iLAorCQkJCWJkX21hcFtpXS5uYW1lLCBmZHRfc3RyZXJyb3IoZXJyKSk7CiAJfQogCS8qCiAJICogQWRkIGEgY291cGxlIG9mIG9kZGJhbGwgZW50cmllcy4uLgogCSAqLwogCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImVuZXRhZGRyIiwgJmJkLT5iaV9lbmV0YWRkciwgNik7CiAJaWYgKGVyciA8IDApCi0JCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBzZXQgZW5ldGFkZHIgJXMuXG4iLAorCQkJZmR0X3N0cmVycm9yKGVycikpOwogCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImV0aHNwZWVkIiwgJmJkLT5iaV9ldGhzcGVlZCwgNCk7CiAJaWYgKGVyciA8IDApCi0JCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOwotCisJCXByaW50ZigiV0FSTklORzogY291bGQgbm90IHNldCBldGhzcGVlZCAlcy5cbiIsCisJCQlmZHRfc3RyZXJyb3IoZXJyKSk7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogaWZkZWYgQ09ORklHX09GX0hBU19CRF9UICovCmRpZmYgLS1naXQgYS9jb21tb24vaHVzaC5jIGIvY29tbW9uL2h1c2guYwppbmRleCBmZWI1NjI3Li41ODI2MzVjIDEwMDY0NAotLS0gYS9jb21tb24vaHVzaC5jCisrKyBiL2NvbW1vbi9odXNoLmMKQEAgLTE2ODIsNyArMTY4Miw3IEBACiAJCQkJcmV0dXJuIC0xOwkvKiBnaXZlIHVwIGFmdGVyIGJhZCBjb21tYW5kICovCiAJCQl9IGVsc2UgewogCQkJCWludCByY29kZTsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CT09URCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQk9PVEQpCiAJICAgIGV4dGVybiBpbnQgZG9fYm9vdGQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKIAogCQkJCS8qIGF2b2lkICJib290ZCIgcmVjdXJzaW9uICovCkBAIC0xNjk0LDcgKzE2OTQsNyBAQAogCQkJCWVsc2UKIAkJCQkJZmxhZyB8PSBDTURfRkxBR19CT09URDsKIAkJCQl9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9CT09URCAqLworI2VuZGlmCiAJCQkJLyogZm91bmQgLSBjaGVjayBtYXggYXJncyAqLwogCQkJCWlmICgoY2hpbGQtPmFyZ2MgLSBpKSA+IGNtZHRwLT5tYXhhcmdzKSB7CiAJCQkJCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CmRpZmYgLS1naXQgYS9jb21tb24va2dkYi5jIGIvY29tbW9uL2tnZGIuYwppbmRleCA2ZGU2ZWM5Li4xZDM0NjY5IDEwMDY0NAotLS0gYS9jb21tb24va2dkYi5jCisrKyBiL2NvbW1vbi9rZ2RiLmMKQEAgLTkyLDcgKzkyLDcgQEAKICNpbmNsdWRlIDxrZ2RiLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAogI3VuZGVmIEtHREJfREVCVUcKIApAQCAtNTkxLDQgKzU5MSw0IEBACiAKIGludCBrZ2RiX25vdF9jb25maWd1cmVkID0gMTsKIAotI2VuZGlmIC8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vbGNkLmMgYi9jb21tb24vbGNkLmMKaW5kZXggZWFlZDJhYi4uOTE0ZGMyZSAxMDA2NDQKLS0tIGEvY29tbW9uL2xjZC5jCisrKyBiL2NvbW1vbi9sY2QuYwpAQCAtNTcxLDcgKzU3MSw3IEBACiAjZW5kaWYgLyogQ09ORklHX0xDRF9MT0dPICovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk1QKSB8fCBkZWZpbmVkKENPTkZJR19TUExBU0hfU0NSRUVOKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CTVApIHx8IGRlZmluZWQoQ09ORklHX1NQTEFTSF9TQ1JFRU4pCiAvKgogICogRGlzcGxheSB0aGUgQk1QIGZpbGUgbG9jYXRlZCBhdCBhZGRyZXNzIGJtcF9pbWFnZS4KICAqIE9ubHkgdW5jb21wcmVzc2VkLgpAQCAtNzAwLDcgKzcwMCw3IEBACiAKIAlyZXR1cm4gKDApOwogfQotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JNUCkgfHwgQ09ORklHX1NQTEFTSF9TQ1JFRU4gKi8KKyNlbmRpZgogCiAKIHN0YXRpYyB2b2lkICpsY2RfbG9nbyAodm9pZCkKZGlmZiAtLWdpdCBhL2NvbW1vbi9tYWluLmMgYi9jb21tb24vbWFpbi5jCmluZGV4IDAwMDY4NmQuLjM3OTY5NWMgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9tYWluLmMKKysrIGIvY29tbW9uL21haW4uYwpAQCAtMTMxNyw3ICsxMzE3LDcgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CT09URCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQk9PVEQpCiAJCS8qIGF2b2lkICJib290ZCIgcmVjdXJzaW9uICovCiAJCWlmIChjbWR0cC0+Y21kID09IGRvX2Jvb3RkKSB7CiAjaWZkZWYgREVCVUdfUEFSU0VSCkBAIC0xMzMxLDcgKzEzMzEsNyBAQAogCQkJCWZsYWcgfD0gQ01EX0ZMQUdfQk9PVEQ7CiAJCQl9CiAJCX0KLSNlbmRpZgkvKiBDRkdfQ01EX0JPT1REICovCisjZW5kaWYKIAogCQkvKiBPSyAtIGNhbGwgZnVuY3Rpb24gdG8gZG8gdGhlIGNvbW1hbmQgKi8KIAkJaWYgKChjbWR0cC0+Y21kKSAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpICE9IDApIHsKQEAgLTEzNTAsNyArMTM1MCw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUlVOKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9SVU4pCiBpbnQgZG9fcnVuIChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJaW50IGk7CkBAIC0xMzc4LDQgKzEzNzgsNCBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1JVTiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vbWlpcGh5dXRpbC5jIGIvY29tbW9uL21paXBoeXV0aWwuYwppbmRleCBlNDExZTU3Li5jNjk1MDFmIDEwMDY0NAotLS0gYS9jb21tb24vbWlpcGh5dXRpbC5jCisrKyBiL2NvbW1vbi9taWlwaHl1dGlsLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxtaWlwaHkuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bWFsbG9jLmg+CkBAIC00NzAsNCArNDcwLDQgQEAKIH0KICNlbmRpZgogCi0jZW5kaWYgLyogQ09ORklHX01JSSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICovCisjZW5kaWYgLyogQ09ORklHX01JSSAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL3VzYi5jIGIvY29tbW9uL3VzYi5jCmluZGV4IDA4NTc0OTQuLjkzM2FmYTkgMTAwNjQ0Ci0tLSBhL2NvbW1vbi91c2IuYworKysgYi9jb21tb24vdXNiLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfVVNCKQogCiAjaW5jbHVkZSA8dXNiLmg+CiAjaWZkZWYgQ09ORklHXzR4eApAQCAtMTI0Nyw2ICsxMjQ3LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKSAqLworI2VuZGlmCiAKIC8qIEVPRiAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL3VzYl9rYmQuYyBiL2NvbW1vbi91c2Jfa2JkLmMKaW5kZXggNTZjMjE2Ni4uYWVjNTU4YSAxMDA2NDQKLS0tIGEvY29tbW9uL3VzYl9rYmQuYworKysgYi9jb21tb24vdXNiX2tiZC5jCkBAIC0xMjksNyArMTI5LDExIEBACiBzdGF0aWMgaW50IHVzYl9rYmRfZ2V0Yyh2b2lkKQogewogCWNoYXIgYzsKLQl3aGlsZSh1c2JfaW5fcG9pbnRlcj09dXNiX291dF9wb2ludGVyKTsKKwl3aGlsZSh1c2JfaW5fcG9pbnRlcj09dXNiX291dF9wb2ludGVyKSB7CisjaWZkZWYgQ0ZHX1VTQl9FVkVOVF9QT0xMCisJCXVzYl9ldmVudF9wb2xsKCk7CisjZW5kaWYKKwl9CiAJaWYoKHVzYl9vdXRfcG9pbnRlcisxKT09VVNCX0tCRF9CVUZGRVJfTEVOKQogCQl1c2Jfb3V0X3BvaW50ZXI9MDsKIAllbHNlCmRpZmYgLS1naXQgYS9jb21tb24vdXNiX3N0b3JhZ2UuYyBiL2NvbW1vbi91c2Jfc3RvcmFnZS5jCmluZGV4IDE5NmNlYjcuLjBmNzlmMzYgMTAwNjQ0Ci0tLSBhL2NvbW1vbi91c2Jfc3RvcmFnZS5jCisrKyBiL2NvbW1vbi91c2Jfc3RvcmFnZS5jCkBAIC01NSw3ICs1NSw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1VTQikKICNpbmNsdWRlIDxwYXJ0Lmg+CiAjaW5jbHVkZSA8dXNiLmg+CiAKQEAgLTEyNDksNCArMTI0OSw0IEBACiB9CiAKICNlbmRpZiAvKiBDT05GSUdfVVNCX1NUT1JBR0UgKi8KLSNlbmRpZiAvKiBDRkdfQ01EX1VTQiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvNzR4eF83eHgva2dkYi5TIGIvY3B1Lzc0eHhfN3h4L2tnZGIuUwppbmRleCBlODM4NTEzLi40ZjIzMTIyIDEwMDY0NAotLS0gYS9jcHUvNzR4eF83eHgva2dkYi5TCisrKyBiL2NwdS83NHh4Xzd4eC9rZ2RiLlMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vbW11Lmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCiAgLyoKICAqIGNhY2hlIGZsdXNoaW5nIHJvdXRpbmVzIGZvciBrZ2RiCkBAIC03NCw0ICs3NCw0IEBACiAJU1lOQwogCWJscgogCi0jZW5kaWYgLyogQ0ZHX0NNRF9LR0RCICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS83NHh4Xzd4eC90cmFwcy5jIGIvY3B1Lzc0eHhfN3h4L3RyYXBzLmMKaW5kZXggNTBjNWVlYi4uYjA2NjIyNyAxMDA2NDQKLS0tIGEvY3B1Lzc0eHhfN3h4L3RyYXBzLmMKKysrIGIvY3B1Lzc0eHhfN3h4L3RyYXBzLmMKQEAgLTQwLDcgKzQwLDcgQEAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogaW50ICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHN0cnVjdCBwdF9yZWdzICopID0gMDsKICNlbmRpZgogCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE2Niw3ICsxNjYsNyBAQAogdm9pZAogQWxpZ25tZW50RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE4MSw3ICsxODEsNyBAQAogCXVuc2lnbmVkIGNoYXIgKnAgPSByZWdzID8gKHVuc2lnbmVkIGNoYXIgKikocmVncy0+bmlwKSA6IE5VTEw7CiAJaW50IGksIGo7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yMDQsNyArMjA0LDcgQEAKIHZvaWQKIFNvZnRFbXVFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjE3LDcgKzIxNyw3IEBACiB2b2lkCiBVbmtub3duRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvTWFrZWZpbGUgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL01ha2VmaWxlCmluZGV4IDhkNGU0NzguLmVhYWJhZDIgMTAwNjQ0Ci0tLSBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvTWFrZWZpbGUKKysrIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9NYWtlZmlsZQpAQCAtMjYsNyArMjYsNyBAQAogTElCCT0gJChvYmopbGliJChTT0MpLmEKIAogQ09CSlMJPSBiY201MjIxLm8gZG05MTYxLm8gZXRoZXIubyBpMmMubyBpbnRlcnJ1cHRzLm8gXAotCSAgbHh0OTcyLm8gc2VyaWFsLm8gdXNiX29oY2kubworCSAgbHh0OTcyLm8gc2VyaWFsLm8gdXNiLm8KIFNPQkpTCT0gbG93bGV2ZWxfaW5pdC5vCiAKIFNSQ1MJOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKZGlmZiAtLWdpdCBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvYmNtNTIyMS5jIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9iY201MjIxLmMKaW5kZXggNmRiMTQzNS4uYjUyYzYxNSAxMDA2NDQKLS0tIGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9iY201MjIxLmMKKysrIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9iY201MjIxLmMKQEAgLTMyLDcgKzMyLDcgQEAKIAogI2lmZGVmIENPTkZJR19EUklWRVJfRVRIRVIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAvKgogICogTmFtZToKQEAgLTIyNyw2ICsyMjcsNiBAQAogCXJldHVybiBGQUxTRTsKIH0KIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUICovCisjZW5kaWYKIAogI2VuZGlmCS8qIENPTkZJR19EUklWRVJfRVRIRVIgKi8KZGlmZiAtLWdpdCBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvZG05MTYxLmMgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL2RtOTE2MS5jCmluZGV4IDRiMTNjMjMuLjk2OGY2NTMgMTAwNjQ0Ci0tLSBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvZG05MTYxLmMKKysrIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9kbTkxNjEuYwpAQCAtMjcsNyArMjcsNyBAQAogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9FVEhFUgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKIC8qCiAgKiBOYW1lOgpAQCAtMjIwLDYgKzIyMCw2IEBACiAJcmV0dXJuIEZBTFNFOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogCiAjZW5kaWYJLyogQ09ORklHX0RSSVZFUl9FVEhFUiAqLwpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9ldGhlci5jIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9ldGhlci5jCmluZGV4IDY3MDA4ZDAuLmM4ZjU2YWEgMTAwNjQ0Ci0tLSBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvZXRoZXIuYworKysgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL2V0aGVyLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAogI2lmZGVmIENPTkZJR19EUklWRVJfRVRIRVIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAvKiBhbGlnbm1lbnQgYXMgcGVyIEVycmF0YSAjMTEgKDY0IGJ5dGVzKSBpcyBpbnN1ZmZpY2llbnQhICovCiByYmZfdCByYmZkdFtSQkZfRlJBTUVNQVhdIF9fYXR0cmlidXRlKChhbGlnbmVkKDUxMikpKTsKQEAgLTI2NSw3ICsyNjUsNyBAQAogewogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKIGludCAgYXQ5MXJtOTIwMF9taWlwaHlfcmVhZChjaGFyICpkZXZuYW1lLCB1bnNpZ25lZCBjaGFyIGFkZHIsCiAJCXVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBzaG9ydCAqIHZhbHVlKQogewpAQCAtMjg0LDE2ICsyODQsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmCS8qIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSAqLworI2VuZGlmCiAKIGludCBhdDkxcm05MjAwX21paXBoeV9pbml0aWFsaXplKGJkX3QgKmJpcykKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAJbWlpcGh5X3JlZ2lzdGVyKCJhdDkxcm05MjAwcGh5IiwgYXQ5MXJtOTIwMF9taWlwaHlfcmVhZCwgYXQ5MXJtOTIwMF9taWlwaHlfd3JpdGUpOwogI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAKICNlbmRpZgkvKiBDT05GSUdfRFJJVkVSX0VUSEVSICovCmRpZmYgLS1naXQgYS9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL2x4dDk3Mi5jIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9seHQ5NzIuYwppbmRleCBmMTJjNTljLi40ZWRjYzlhIDEwMDY0NAotLS0gYS9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL2x4dDk3Mi5jCisrKyBiL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvbHh0OTcyLmMKQEAgLTMzLDcgKzMzLDcgQEAKIAogI2lmZGVmIENPTkZJR19EUklWRVJfRVRIRVIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAvKgogICogTmFtZToKQEAgLTE4Niw2ICsxODYsNiBAQAogCXJldHVybiAobHh0OTcyX0dldExpbmtTcGVlZCAocF9tYWMpKTsKIH0KIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUICovCisjZW5kaWYKIAogI2VuZGlmCS8qIENPTkZJR19EUklWRVJfRVRIRVIgKi8KZGlmZiAtLWdpdCBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvdXNiLmMgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NjI2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL3VzYi5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgPG1rQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfTkVXKSAmJiBkZWZpbmVkKENGR19VU0JfT0hDSV9DUFVfSU5JVCkKKyMgaWZkZWYgQ09ORklHX0FUOTFSTTkyMDAKKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisKK2ludCB1c2JfY3B1X2luaXQoKQoreworCS8qIEVuYWJsZSBVU0IgaG9zdCBjbG9jay4gKi8KKwkqQVQ5MUNfUE1DX1NDRVIgPSBBVDkxQ19QTUNfVUhQOwkvKiA0OE1IeiBjbG9jayBlbmFibGVkIGZvciBVSFAgKi8KKwkqQVQ5MUNfUE1DX1BDRVIgPSAxIDw8IEFUOTFDX0lEX1VIUDsJLyogUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgUmVnaXN0ZXIgKi8KKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9jcHVfc3RvcCgpCit7CisJLyogSW5pdGlhbGl6YXRpb24gZmFpbGVkICovCisJKkFUOTFDX1BNQ19QQ0RSID0gMSA8PCBBVDkxQ19JRF9VSFA7CS8qIFBlcmlwaGVyYWwgQ2xvY2sgRGlzYWJsZSBSZWdpc3RlciAqLworCSpBVDkxQ19QTUNfU0NEUiA9IEFUOTFDX1BNQ19VSFA7CS8qIDQ4TUh6IGNsb2NrIGRpc2FibGVkIGZvciBVSFAgKi8KKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9jcHVfaW5pdF9mYWlsKCkKK3sKKwl1c2JfY3B1X3N0b3AoKTsKK30KKworIyBlbmRpZiAvKiBDT05GSUdfQVQ5MVJNOTIwMCAqLworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1VTQl9PSENJKSAmJiBkZWZpbmVkKENGR19VU0JfT0hDSV9DUFVfSU5JVCkgKi8KZGlmZiAtLWdpdCBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvdXNiX29oY2kuYyBiL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvdXNiX29oY2kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyYzU2Yy4uMDAwMDAwMAotLS0gYS9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL3VzYl9vaGNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjM1ICswLDAgQEAKLS8qCi0gKiBVUkIgT0hDSSBIQ0QgKEhvc3QgQ29udHJvbGxlciBEcml2ZXIpIGZvciBVU0Igb24gdGhlIEFUOTFSTTkyMDAuCi0gKgotICogKEMpIENvcHlyaWdodCAyMDAzCi0gKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZyA8Z2pAZGVueC5kZT4KLSAqCi0gKiBOb3RlOiBNdWNoIG9mIHRoaXMgY29kZSBoYXMgYmVlbiBkZXJpdmVkIGZyb20gTGludXggMi40Ci0gKiAoQykgQ29weXJpZ2h0IDE5OTkgUm9tYW4gV2Vpc3NnYWVyYmVyIDx3ZWlzc2dAdmllbm5hLmF0PgotICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIgRGF2aWQgQnJvd25lbGwKLSAqCi0gKiBNb2RpZmllZCBmb3IgdGhlIE1QMlVTQiBieSAoQykgQ29weXJpZ2h0IDIwMDUgRXJpYyBCZW5hcmQKLSAqIGViZW5hcmRAZXVrcmVhLmNvbSAtIGJhc2VkIG9uIHMzYzI0eDAncyBkcml2ZXIKLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqCi0gKi8KLS8qCi0gKiBJTVBPUlRBTlQgTk9URVMKLSAqIDEgLSB5b3UgTVVTVCBkZWZpbmUgTElUVExFRU5ESUFOIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZQotICogICAgIGJvYXJkIG9yIHRoaXMgZHJpdmVyIHdpbGwgTk9UIHdvcmshCi0gKiAyIC0gdGhpcyBkcml2ZXIgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIFVTQiBNYXNzIFN0b3JhZ2UgRGV2aWNlcwotICogICAgIChCQkIpIE9OTFkuIFRoZXJlIGlzIE5PIHN1cHBvcnQgZm9yIEludGVycnVwdCBvciBJc29jaHJvbm91cyBwaXBlcyEKLSAqIDMgLSB3aGVuIHJ1bm5pbmcgb24gYSBQUUZQMjA4IEFUOTFSTTkyMDAsIGRlZmluZSBDT05GSUdfQVQ5MUNfUFFGUF9VSFBCVUcKLSAqICAgICB0byBhY3RpdmF0ZSB3b3JrYXJvdW5kIGZvciBidWcgIzQxIG9yIHRoaXMgZHJpdmVyIHdpbGwgTk9UIHdvcmshCi0gKi8KLQotI2luY2x1ZGUgPGNvbW1vbi5oPgotLyogI2luY2x1ZGUgPHBjaS5oPiBubyBQQ0kgb24gdGhlIFMzQzI0WDAgKi8KLQotI2lmZGVmIENPTkZJR19VU0JfT0hDSQotCi0jaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KLQotI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPHVzYi5oPgotI2luY2x1ZGUgInVzYl9vaGNpLmgiCi0KLSNkZWZpbmUgT0hDSV9VU0VfTlBTCQkvKiBmb3JjZSBOb1Bvd2VyU3dpdGNoaW5nIG1vZGUgKi8KLSN1bmRlZiBPSENJX1ZFUkJPU0VfREVCVUcJLyogbm90IGFsd2F5cyBoZWxwZnVsICovCi0KLS8qIEZvciBpbml0aWFsaXppbmcgY29udHJvbGxlciAobWFzayBpbiBhbiBIQ0ZTIG1vZGUgdG9vKSAqLwotI2RlZmluZSBPSENJX0NPTlRST0xfSU5JVCBcCi0JKE9IQ0lfQ1RSTF9DQlNSICYgMHgzKSB8IE9IQ0lfQ1RSTF9JRSB8IE9IQ0lfQ1RSTF9QTEUKLQotI2RlZmluZSByZWFkbChhKSAoKigodnVfbG9uZyAqKShhKSkpCi0jZGVmaW5lIHdyaXRlbChhLCBiKSAoKigodnVfbG9uZyAqKShiKSkgPSAoKHZ1X2xvbmcpYSkpCi0KLSNkZWZpbmUgbWluX3QodHlwZSx4LHkpICh7IHR5cGUgX194ID0gKHgpOyB0eXBlIF9feSA9ICh5KTsgX194IDwgX195ID8gX194OiBfX3k7IH0pCi0KLSN1bmRlZiBERUJVRwotI2lmZGVmIERFQlVHCi0jZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRmKCJERUJVRzogIiBmb3JtYXQgIlxuIiwgIyMgYXJnKQotI2Vsc2UKLSNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSgwKQotI2VuZGlmIC8qIERFQlVHICovCi0jZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgcHJpbnRmKCJFUlJPUjogIiBmb3JtYXQgIlxuIiwgIyMgYXJnKQotI3VuZGVmIFNIT1dfSU5GTwotI2lmZGVmIFNIT1dfSU5GTwotI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBwcmludGYoIklORk86ICIgZm9ybWF0ICJcbiIsICMjIGFyZykKLSNlbHNlCi0jZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlKDApCi0jZW5kaWYKLQotI2RlZmluZSBtMTZfc3dhcCh4KSBzd2FwXzE2KHgpCi0jZGVmaW5lIG0zMl9zd2FwKHgpIHN3YXBfMzIoeCkKLQotLyogZ2xvYmFsIG9oY2lfdCAqLwotc3RhdGljIG9oY2lfdCBnb2hjaTsKLS8qIHRoaXMgbXVzdCBiZSBhbGlnbmVkIHRvIGEgMjU2IGJ5dGUgYm91bmRhcnkgKi8KLXN0cnVjdCBvaGNpX2hjY2EgZ2hjY2FbMV07Ci0vKiBhIHBvaW50ZXIgdG8gdGhlIGFsaWduZWQgc3RvcmFnZSAqLwotc3RydWN0IG9oY2lfaGNjYSAqcGhjY2E7Ci0vKiB0aGlzIGFsbG9jYXRlcyBFRHMgZm9yIGFsbCBwb3NzaWJsZSBlbmRwb2ludHMgKi8KLXN0cnVjdCBvaGNpX2RldmljZSBvaGNpX2RldjsKLS8qIHVyYl9wcml2ICovCi11cmJfcHJpdl90IHVyYl9wcml2OwotLyogUkhTQyBmbGFnICovCi1pbnQgZ290X3Joc2M7Ci0vKiBkZXZpY2Ugd2hpY2ggd2FzIGRpc2Nvbm5lY3RlZCAqLwotc3RydWN0IHVzYl9kZXZpY2UgKmRldmdvbmU7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEFNRC03NTYgKEQyIHJldikgcmVwb3J0cyBjb3JydXB0IHJlZ2lzdGVyIGNvbnRlbnRzIGluIHNvbWUgY2FzZXMuCi0gKiBUaGUgZXJyYXR1bSAoIzQpIGRlc2NyaXB0aW9uIGlzIGluY29ycmVjdC4gIEFNRCdzIHdvcmthcm91bmQgd2FpdHMKLSAqIHRpbGwgc29tZSBiaXRzIChtb3N0bHkgcmVzZXJ2ZWQpIGFyZSBjbGVhcjsgb2sgZm9yIGFsbCByZXZzLgotICovCi0jZGVmaW5lIE9IQ0lfUVVJUktfQU1ENzU2IDB4YWJjZAotI2RlZmluZSByZWFkX3Jvb3RodWIoaGMsIHJlZ2lzdGVyLCBtYXNrKSAoeyBcCi0JdTMyIHRlbXAgPSByZWFkbCAoJmhjLT5yZWdzLT5yb290aHViLnJlZ2lzdGVyKTsgXAotCWlmIChoYy0+ZmxhZ3MgJiBPSENJX1FVSVJLX0FNRDc1NikgXAotCQl3aGlsZSAodGVtcCAmIG1hc2spIFwKLQkJCXRlbXAgPSByZWFkbCAoJmhjLT5yZWdzLT5yb290aHViLnJlZ2lzdGVyKTsgXAotCXRlbXA7IH0pCi0KLXN0YXRpYyB1MzIgcm9vdGh1Yl9hIChzdHJ1Y3Qgb2hjaSAqaGMpCi0JeyByZXR1cm4gcmVhZF9yb290aHViIChoYywgYSwgMHhmYzBmZTAwMCk7IH0KLXN0YXRpYyBpbmxpbmUgdTMyIHJvb3RodWJfYiAoc3RydWN0IG9oY2kgKmhjKQotCXsgcmV0dXJuIHJlYWRsICgmaGMtPnJlZ3MtPnJvb3RodWIuYik7IH0KLXN0YXRpYyBpbmxpbmUgdTMyIHJvb3RodWJfc3RhdHVzIChzdHJ1Y3Qgb2hjaSAqaGMpCi0JeyByZXR1cm4gcmVhZGwgKCZoYy0+cmVncy0+cm9vdGh1Yi5zdGF0dXMpOyB9Ci1zdGF0aWMgdTMyIHJvb3RodWJfcG9ydHN0YXR1cyAoc3RydWN0IG9oY2kgKmhjLCBpbnQgaSkKLQl7IHJldHVybiByZWFkX3Jvb3RodWIgKGhjLCBwb3J0c3RhdHVzIFtpXSwgMHhmZmUwZmNlMCk7IH0KLQotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi1zdGF0aWMgaW50IGhjX2ludGVycnVwdCAodm9pZCk7Ci1zdGF0aWMgdm9pZAotdGRfc3VibWl0X2pvYiAoc3RydWN0IHVzYl9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqIGJ1ZmZlciwKLQlpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqIHNldHVwLCB1cmJfcHJpdl90ICogdXJiLCBpbnQgaW50ZXJ2YWwpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBVUkIgc3VwcG9ydCBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGZyZWUgSENELXByaXZhdGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBVUkIgKi8KLQotc3RhdGljIHZvaWQgdXJiX2ZyZWVfcHJpdiAodXJiX3ByaXZfdCAqIHVyYikKLXsKLQlpbnQJCWk7Ci0JaW50CQlsYXN0OwotCXN0cnVjdCB0ZAkqIHRkOwotCi0JbGFzdCA9IHVyYi0+bGVuZ3RoIC0gMTsKLQlpZiAobGFzdCA+PSAwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPD0gbGFzdDsgaSsrKSB7Ci0JCQl0ZCA9IHVyYi0+dGRbaV07Ci0JCQlpZiAodGQpIHsKLQkJCQl0ZC0+dXNiX2RldiA9IE5VTEw7Ci0JCQkJdXJiLT50ZFtpXSA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBERUJVRwotc3RhdGljIGludCBzb2hjaV9nZXRfY3VycmVudF9mcmFtZV9udW1iZXIgKHN0cnVjdCB1c2JfZGV2aWNlICogZGV2KTsKLQotLyogZGVidWd8IHByaW50IHRoZSBtYWluIGNvbXBvbmVudHMgb2YgYW4gVVJCCi0gKiBzbWFsbDogMCkgaGVhZGVyICsgZGF0YSBwYWNrZXRzIDEpIGp1c3QgaGVhZGVyICovCi0KLXN0YXRpYyB2b2lkIHBrdF9wcmludCAoc3RydWN0IHVzYl9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqIGJ1ZmZlciwKLQlpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqIHNldHVwLCBjaGFyICogc3RyLCBpbnQgc21hbGwpCi17Ci0JdXJiX3ByaXZfdCAqIHB1cmIgPSAmdXJiX3ByaXY7Ci0KLQlkYmcoIiVzIFVSQjpbJTR4XSBkZXY6JTJkLGVwOiUyZC0lYyx0eXBlOiVzLGxlbjolZC8lZCBzdGF0OiUjbHgiLAotCQkJc3RyLAotCQkJc29oY2lfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyIChkZXYpLAotCQkJdXNiX3BpcGVkZXZpY2UgKHBpcGUpLAotCQkJdXNiX3BpcGVlbmRwb2ludCAocGlwZSksCi0JCQl1c2JfcGlwZW91dCAocGlwZSk/ICdPJzogJ0knLAotCQkJdXNiX3BpcGV0eXBlIChwaXBlKSA8IDI/ICh1c2JfcGlwZWludCAocGlwZSk/ICJJTlRSIjogIklTT0MiKToKLQkJCQkodXNiX3BpcGVjb250cm9sIChwaXBlKT8gIkNUUkwiOiAiQlVMSyIpLAotCQkJcHVyYi0+YWN0dWFsX2xlbmd0aCwKLQkJCXRyYW5zZmVyX2xlbiwgZGV2LT5zdGF0dXMpOwotI2lmZGVmCU9IQ0lfVkVSQk9TRV9ERUJVRwotCWlmICghc21hbGwpIHsKLQkJaW50IGksIGxlbjsKLQotCQlpZiAodXNiX3BpcGVjb250cm9sIChwaXBlKSkgewotCQkJcHJpbnRmIChfX0ZJTEVfXyAiOiBjbWQoOCk6Iik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgOCA7IGkrKykKLQkJCQlwcmludGYgKCIgJTAyeCIsICgoX191OCAqKSBzZXR1cCkgW2ldKTsKLQkJCXByaW50ZiAoIlxuIik7Ci0JCX0KLQkJaWYgKHRyYW5zZmVyX2xlbiA+IDAgJiYgYnVmZmVyKSB7Ci0JCQlwcmludGYgKF9fRklMRV9fICI6IGRhdGEoJWQvJWQpOiIsCi0JCQkJcHVyYi0+YWN0dWFsX2xlbmd0aCwKLQkJCQl0cmFuc2Zlcl9sZW4pOwotCQkJbGVuID0gdXNiX3BpcGVvdXQgKHBpcGUpPwotCQkJCQl0cmFuc2Zlcl9sZW46IHB1cmItPmFjdHVhbF9sZW5ndGg7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgMTYgJiYgaSA8IGxlbjsgaSsrKQotCQkJCXByaW50ZiAoIiAlMDJ4IiwgKChfX3U4ICopIGJ1ZmZlcikgW2ldKTsKLQkJCXByaW50ZiAoIiVzXG4iLCBpIDwgbGVuPyAiLi4uIjogIiIpOwotCQl9Ci0JfQotI2VuZGlmCi19Ci0KLS8qIGp1c3QgZm9yIGRlYnVnZ2luZzsgcHJpbnRzIG5vbi1lbXB0eSBicmFuY2hlcyBvZiB0aGUgaW50IGVkIHRyZWUgaW5jbHVzaXZlIGlzbyBlZHMqLwotdm9pZCBlcF9wcmludF9pbnRfZWRzIChvaGNpX3QgKm9oY2ksIGNoYXIgKiBzdHIpIHsKLQlpbnQgaSwgajsKLQkgX191MzIgKiBlZF9wOwotCWZvciAoaT0gMDsgaSA8IDMyOyBpKyspIHsKLQkJaiA9IDU7Ci0JCWVkX3AgPSAmKG9oY2ktPmhjY2EtPmludF90YWJsZSBbaV0pOwotCQlpZiAoKmVkX3AgPT0gMCkKLQkJICAgIGNvbnRpbnVlOwotCQlwcmludGYgKF9fRklMRV9fICI6ICVzIGJyYW5jaCBpbnQgJTJkKCUyeCk6Iiwgc3RyLCBpLCBpKTsKLQkJd2hpbGUgKCplZF9wICE9IDAgJiYgai0tKSB7Ci0JCQllZF90ICplZCA9IChlZF90ICopbTMyX3N3YXAoZWRfcCk7Ci0JCQlwcmludGYgKCIgZWQ6ICU0eDsiLCBlZC0+aHdJTkZPKTsKLQkJCWVkX3AgPSAmZWQtPmh3TmV4dEVEOwotCQl9Ci0JCXByaW50ZiAoIlxuIik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBvaGNpX2R1bXBfaW50cl9tYXNrIChjaGFyICpsYWJlbCwgX191MzIgbWFzaykKLXsKLQlkYmcgKCIlczogMHglMDh4JXMlcyVzJXMlcyVzJXMlcyVzIiwKLQkJbGFiZWwsCi0JCW1hc2ssCi0JCShtYXNrICYgT0hDSV9JTlRSX01JRSkgPyAiIE1JRSIgOiAiIiwKLQkJKG1hc2sgJiBPSENJX0lOVFJfT0MpID8gIiBPQyIgOiAiIiwKLQkJKG1hc2sgJiBPSENJX0lOVFJfUkhTQykgPyAiIFJIU0MiIDogIiIsCi0JCShtYXNrICYgT0hDSV9JTlRSX0ZOTykgPyAiIEZOTyIgOiAiIiwKLQkJKG1hc2sgJiBPSENJX0lOVFJfVUUpID8gIiBVRSIgOiAiIiwKLQkJKG1hc2sgJiBPSENJX0lOVFJfUkQpID8gIiBSRCIgOiAiIiwKLQkJKG1hc2sgJiBPSENJX0lOVFJfU0YpID8gIiBTRiIgOiAiIiwKLQkJKG1hc2sgJiBPSENJX0lOVFJfV0RIKSA/ICIgV0RIIiA6ICIiLAotCQkobWFzayAmIE9IQ0lfSU5UUl9TTykgPyAiIFNPIiA6ICIiCi0JCSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1heWJlX3ByaW50X2VkcyAoY2hhciAqbGFiZWwsIF9fdTMyIHZhbHVlKQotewotCWVkX3QgKmVkcCA9IChlZF90ICopdmFsdWU7Ci0KLQlpZiAodmFsdWUpIHsKLQkJZGJnICgiJXMgJTA4eCIsIGxhYmVsLCB2YWx1ZSk7Ci0JCWRiZyAoIiUwOHgiLCBlZHAtPmh3SU5GTyk7Ci0JCWRiZyAoIiUwOHgiLCBlZHAtPmh3VGFpbFApOwotCQlkYmcgKCIlMDh4IiwgZWRwLT5od0hlYWRQKTsKLQkJZGJnICgiJTA4eCIsIGVkcC0+aHdOZXh0RUQpOwotCX0KLX0KLQotc3RhdGljIGNoYXIgKiBoY2ZzMnN0cmluZyAoaW50IHN0YXRlKQotewotCXN3aXRjaCAoc3RhdGUpIHsKLQkJY2FzZSBPSENJX1VTQl9SRVNFVDoJcmV0dXJuICJyZXNldCI7Ci0JCWNhc2UgT0hDSV9VU0JfUkVTVU1FOglyZXR1cm4gInJlc3VtZSI7Ci0JCWNhc2UgT0hDSV9VU0JfT1BFUjoJcmV0dXJuICJvcGVyYXRpb25hbCI7Ci0JCWNhc2UgT0hDSV9VU0JfU1VTUEVORDoJcmV0dXJuICJzdXNwZW5kIjsKLQl9Ci0JcmV0dXJuICI/IjsKLX0KLQotLyogZHVtcCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXJzICovCi1zdGF0aWMgdm9pZCBvaGNpX2R1bXBfc3RhdHVzIChvaGNpX3QgKmNvbnRyb2xsZXIpCi17Ci0Jc3RydWN0IG9oY2lfcmVncwkqcmVncyA9IGNvbnRyb2xsZXItPnJlZ3M7Ci0JX191MzIJCQl0ZW1wOwotCi0JdGVtcCA9IHJlYWRsICgmcmVncy0+cmV2aXNpb24pICYgMHhmZjsKLQlpZiAodGVtcCAhPSAweDEwKQotCQlkYmcgKCJzcGVjICVkLiVkIiwgKHRlbXAgPj4gNCksICh0ZW1wICYgMHgwZikpOwotCi0JdGVtcCA9IHJlYWRsICgmcmVncy0+Y29udHJvbCk7Ci0JZGJnICgiY29udHJvbDogMHglMDh4JXMlcyVzIEhDRlM9JXMlcyVzJXMlcyBDQlNSPSVkIiwgdGVtcCwKLQkJKHRlbXAgJiBPSENJX0NUUkxfUldFKSA/ICIgUldFIiA6ICIiLAotCQkodGVtcCAmIE9IQ0lfQ1RSTF9SV0MpID8gIiBSV0MiIDogIiIsCi0JCSh0ZW1wICYgT0hDSV9DVFJMX0lSKSA/ICIgSVIiIDogIiIsCi0JCWhjZnMyc3RyaW5nICh0ZW1wICYgT0hDSV9DVFJMX0hDRlMpLAotCQkodGVtcCAmIE9IQ0lfQ1RSTF9CTEUpID8gIiBCTEUiIDogIiIsCi0JCSh0ZW1wICYgT0hDSV9DVFJMX0NMRSkgPyAiIENMRSIgOiAiIiwKLQkJKHRlbXAgJiBPSENJX0NUUkxfSUUpID8gIiBJRSIgOiAiIiwKLQkJKHRlbXAgJiBPSENJX0NUUkxfUExFKSA/ICIgUExFIiA6ICIiLAotCQl0ZW1wICYgT0hDSV9DVFJMX0NCU1IKLQkJKTsKLQotCXRlbXAgPSByZWFkbCAoJnJlZ3MtPmNtZHN0YXR1cyk7Ci0JZGJnICgiY21kc3RhdHVzOiAweCUwOHggU09DPSVkJXMlcyVzJXMiLCB0ZW1wLAotCQkodGVtcCAmIE9IQ0lfU09DKSA+PiAxNiwKLQkJKHRlbXAgJiBPSENJX09DUikgPyAiIE9DUiIgOiAiIiwKLQkJKHRlbXAgJiBPSENJX0JMRikgPyAiIEJMRiIgOiAiIiwKLQkJKHRlbXAgJiBPSENJX0NMRikgPyAiIENMRiIgOiAiIiwKLQkJKHRlbXAgJiBPSENJX0hDUikgPyAiIEhDUiIgOiAiIgotCQkpOwotCi0Jb2hjaV9kdW1wX2ludHJfbWFzayAoImludHJzdGF0dXMiLCByZWFkbCAoJnJlZ3MtPmludHJzdGF0dXMpKTsKLQlvaGNpX2R1bXBfaW50cl9tYXNrICgiaW50cmVuYWJsZSIsIHJlYWRsICgmcmVncy0+aW50cmVuYWJsZSkpOwotCi0JbWF5YmVfcHJpbnRfZWRzICgiZWRfcGVyaW9kY3VycmVudCIsIHJlYWRsICgmcmVncy0+ZWRfcGVyaW9kY3VycmVudCkpOwotCi0JbWF5YmVfcHJpbnRfZWRzICgiZWRfY29udHJvbGhlYWQiLCByZWFkbCAoJnJlZ3MtPmVkX2NvbnRyb2xoZWFkKSk7Ci0JbWF5YmVfcHJpbnRfZWRzICgiZWRfY29udHJvbGN1cnJlbnQiLCByZWFkbCAoJnJlZ3MtPmVkX2NvbnRyb2xjdXJyZW50KSk7Ci0KLQltYXliZV9wcmludF9lZHMgKCJlZF9idWxraGVhZCIsIHJlYWRsICgmcmVncy0+ZWRfYnVsa2hlYWQpKTsKLQltYXliZV9wcmludF9lZHMgKCJlZF9idWxrY3VycmVudCIsIHJlYWRsICgmcmVncy0+ZWRfYnVsa2N1cnJlbnQpKTsKLQotCW1heWJlX3ByaW50X2VkcyAoImRvbmVoZWFkIiwgcmVhZGwgKCZyZWdzLT5kb25laGVhZCkpOwotfQotCi1zdGF0aWMgdm9pZCBvaGNpX2R1bXBfcm9vdGh1YiAob2hjaV90ICpjb250cm9sbGVyLCBpbnQgdmVyYm9zZSkKLXsKLQlfX3UzMgkJCXRlbXAsIG5kcCwgaTsKLQotCXRlbXAgPSByb290aHViX2EgKGNvbnRyb2xsZXIpOwotCW5kcCA9ICh0ZW1wICYgUkhfQV9ORFApOwotI2lmZGVmIENPTkZJR19BVDkxQ19QUUZQX1VIUEJVRwotCW5kcCA9IChuZHAgPT0gMikgPyAxOjA7Ci0jZW5kaWYKLQlpZiAodmVyYm9zZSkgewotCQlkYmcgKCJyb290aHViLmE6ICUwOHggUE9UUEdUPSVkJXMlcyVzJXMlcyBORFA9JWQiLCB0ZW1wLAotCQkJKCh0ZW1wICYgUkhfQV9QT1RQR1QpID4+IDI0KSAmIDB4ZmYsCi0JCQkodGVtcCAmIFJIX0FfTk9DUCkgPyAiIE5PQ1AiIDogIiIsCi0JCQkodGVtcCAmIFJIX0FfT0NQTSkgPyAiIE9DUE0iIDogIiIsCi0JCQkodGVtcCAmIFJIX0FfRFQpID8gIiBEVCIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfQV9OUFMpID8gIiBOUFMiIDogIiIsCi0JCQkodGVtcCAmIFJIX0FfUFNNKSA/ICIgUFNNIiA6ICIiLAotCQkJbmRwCi0JCQkpOwotCQl0ZW1wID0gcm9vdGh1Yl9iIChjb250cm9sbGVyKTsKLQkJZGJnICgicm9vdGh1Yi5iOiAlMDh4IFBQQ009JTA0eCBEUj0lMDR4IiwKLQkJCXRlbXAsCi0JCQkodGVtcCAmIFJIX0JfUFBDTSkgPj4gMTYsCi0JCQkodGVtcCAmIFJIX0JfRFIpCi0JCQkpOwotCQl0ZW1wID0gcm9vdGh1Yl9zdGF0dXMgKGNvbnRyb2xsZXIpOwotCQlkYmcgKCJyb290aHViLnN0YXR1czogJTA4eCVzJXMlcyVzJXMlcyIsCi0JCQl0ZW1wLAotCQkJKHRlbXAgJiBSSF9IU19DUldFKSA/ICIgQ1JXRSIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfSFNfT0NJQykgPyAiIE9DSUMiIDogIiIsCi0JCQkodGVtcCAmIFJIX0hTX0xQU0MpID8gIiBMUFNDIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9IU19EUldFKSA/ICIgRFJXRSIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfSFNfT0NJKSA/ICIgT0NJIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9IU19MUFMpID8gIiBMUFMiIDogIiIKLQkJCSk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IG5kcDsgaSsrKSB7Ci0JCXRlbXAgPSByb290aHViX3BvcnRzdGF0dXMgKGNvbnRyb2xsZXIsIGkpOwotCQlkYmcgKCJyb290aHViLnBvcnRzdGF0dXMgWyVkXSA9IDB4JTA4eCVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyIsCi0JCQlpLAotCQkJdGVtcCwKLQkJCSh0ZW1wICYgUkhfUFNfUFJTQykgPyAiIFBSU0MiIDogIiIsCi0JCQkodGVtcCAmIFJIX1BTX09DSUMpID8gIiBPQ0lDIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9QU19QU1NDKSA/ICIgUFNTQyIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfUFNfUEVTQykgPyAiIFBFU0MiIDogIiIsCi0JCQkodGVtcCAmIFJIX1BTX0NTQykgPyAiIENTQyIgOiAiIiwKLQotCQkJKHRlbXAgJiBSSF9QU19MU0RBKSA/ICIgTFNEQSIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfUFNfUFBTKSA/ICIgUFBTIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9QU19QUlMpID8gIiBQUlMiIDogIiIsCi0JCQkodGVtcCAmIFJIX1BTX1BPQ0kpID8gIiBQT0NJIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9QU19QU1MpID8gIiBQU1MiIDogIiIsCi0KLQkJCSh0ZW1wICYgUkhfUFNfUEVTKSA/ICIgUEVTIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9QU19DQ1MpID8gIiBDQ1MiIDogIiIKLQkJCSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBvaGNpX2R1bXAgKG9oY2lfdCAqY29udHJvbGxlciwgaW50IHZlcmJvc2UpCi17Ci0JZGJnICgiT0hDSSBjb250cm9sbGVyIHVzYi0lcyBzdGF0ZSIsIGNvbnRyb2xsZXItPnNsb3RfbmFtZSk7Ci0KLQkvKiBkdW1wcyBzb21lIG9mIHRoZSBzdGF0ZSB3ZSBrbm93IGFib3V0ICovCi0Jb2hjaV9kdW1wX3N0YXR1cyAoY29udHJvbGxlcik7Ci0JaWYgKHZlcmJvc2UpCi0JCWVwX3ByaW50X2ludF9lZHMgKGNvbnRyb2xsZXIsICJoY2NhIik7Ci0JZGJnICgiaGNjYSBmcmFtZSAjJTA0eCIsIGNvbnRyb2xsZXItPmhjY2EtPmZyYW1lX25vKTsKLQlvaGNpX2R1bXBfcm9vdGh1YiAoY29udHJvbGxlciwgMSk7Ci19Ci0KLQotI2VuZGlmIC8qIERFQlVHICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEludGVyZmFjZSBmdW5jdGlvbnMgKFVSQikKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGdldCBhIHRyYW5zZmVyIHJlcXVlc3QgKi8KLQotaW50IHNvaGNpX3N1Ym1pdF9qb2Ioc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCi0JCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICpzZXR1cCwgaW50IGludGVydmFsKQotewotCW9oY2lfdCAqb2hjaTsKLQllZF90ICogZWQ7Ci0JdXJiX3ByaXZfdCAqcHVyYl9wcml2OwotCWludCBpLCBzaXplID0gMDsKLQotCW9oY2kgPSAmZ29oY2k7Ci0KLQkvKiB3aGVuIGNvbnRyb2xsZXIncyBodW5nLCBwZXJtaXQgb25seSByb290aHViIGNsZWFudXAgYXR0ZW1wdHMKLQkgKiBzdWNoIGFzIHBvd2VyaW5nIGRvd24gcG9ydHMgKi8KLQlpZiAob2hjaS0+ZGlzYWJsZWQpIHsKLQkJZXJyKCJzb2hjaV9zdWJtaXRfam9iOiBFUElQRSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogZXZlcnkgZW5kcG9pbnQgaGFzIGEgZWQsIGxvY2F0ZSBhbmQgZmlsbCBpdCAqLwotCWlmICghKGVkID0gZXBfYWRkX2VkIChkZXYsIHBpcGUpKSkgewotCQllcnIoInNvaGNpX3N1Ym1pdF9qb2I6IEVOT01FTSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogZm9yIHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIFVSQiB3ZSBuZWVkIHRoZSBudW1iZXIgb2YgVERzIChzaXplKSAqLwotCXN3aXRjaCAodXNiX3BpcGV0eXBlIChwaXBlKSkgewotCQljYXNlIFBJUEVfQlVMSzogLyogb25lIFREIGZvciBldmVyeSA0MDk2IEJ5dGUgKi8KLQkJCXNpemUgPSAodHJhbnNmZXJfbGVuIC0gMSkgLyA0MDk2ICsgMTsKLQkJCWJyZWFrOwotCQljYXNlIFBJUEVfQ09OVFJPTDogLyogMSBURCBmb3Igc2V0dXAsIDEgZm9yIEFDSyBhbmQgMSBmb3IgZXZlcnkgNDA5NiBCICovCi0JCQlzaXplID0gKHRyYW5zZmVyX2xlbiA9PSAwKT8gMjoKLQkJCQkJCSh0cmFuc2Zlcl9sZW4gLSAxKSAvIDQwOTYgKyAzOwotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHNpemUgPj0gKE5fVVJCX1REIC0gMSkpIHsKLQkJZXJyKCJuZWVkICVkIFREcywgb25seSBoYXZlICVkIiwgc2l6ZSwgTl9VUkJfVEQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXB1cmJfcHJpdiA9ICZ1cmJfcHJpdjsKLQlwdXJiX3ByaXYtPnBpcGUgPSBwaXBlOwotCi0JLyogZmlsbCB0aGUgcHJpdmF0ZSBwYXJ0IG9mIHRoZSBVUkIgKi8KLQlwdXJiX3ByaXYtPmxlbmd0aCA9IHNpemU7Ci0JcHVyYl9wcml2LT5lZCA9IGVkOwotCXB1cmJfcHJpdi0+YWN0dWFsX2xlbmd0aCA9IDA7Ci0KLQkvKiBhbGxvY2F0ZSB0aGUgVERzICovCi0JLyogbm90ZSB0aGF0IHRkWzBdIHdhcyBhbGxvY2F0ZWQgaW4gZXBfYWRkX2VkICovCi0JZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQlwdXJiX3ByaXYtPnRkW2ldID0gdGRfYWxsb2MgKGRldik7Ci0JCWlmICghcHVyYl9wcml2LT50ZFtpXSkgewotCQkJcHVyYl9wcml2LT5sZW5ndGggPSBpOwotCQkJdXJiX2ZyZWVfcHJpdiAocHVyYl9wcml2KTsKLQkJCWVycigic29oY2lfc3VibWl0X2pvYjogRU5PTUVNIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlpZiAoZWQtPnN0YXRlID09IEVEX05FVyB8fCAoZWQtPnN0YXRlICYgRURfREVMKSkgewotCQl1cmJfZnJlZV9wcml2IChwdXJiX3ByaXYpOwotCQllcnIoInNvaGNpX3N1Ym1pdF9qb2I6IEVJTlZBTCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogbGluayB0aGUgZWQgaW50byBhIGNoYWluIGlmIGlzIG5vdCBhbHJlYWR5ICovCi0JaWYgKGVkLT5zdGF0ZSAhPSBFRF9PUEVSKQotCQllcF9saW5rIChvaGNpLCBlZCk7Ci0KLQkvKiBmaWxsIHRoZSBURHMgYW5kIGxpbmsgaXQgdG8gdGhlIGVkICovCi0JdGRfc3VibWl0X2pvYihkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBzZXR1cCwgcHVyYl9wcml2LCBpbnRlcnZhbCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIERFQlVHCi0vKiB0ZWxsIHVzIHRoZSBjdXJyZW50IFVTQiBmcmFtZSBudW1iZXIgKi8KLQotc3RhdGljIGludCBzb2hjaV9nZXRfY3VycmVudF9mcmFtZV9udW1iZXIgKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2KQotewotCW9oY2lfdCAqb2hjaSA9ICZnb2hjaTsKLQotCXJldHVybiBtMTZfc3dhcCAob2hjaS0+aGNjYS0+ZnJhbWVfbm8pOwotfQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEVEIGhhbmRsaW5nIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogbGluayBhbiBlZCBpbnRvIG9uZSBvZiB0aGUgSEMgY2hhaW5zICovCi0KLXN0YXRpYyBpbnQgZXBfbGluayAob2hjaV90ICpvaGNpLCBlZF90ICplZGkpCi17Ci0Jdm9sYXRpbGUgZWRfdCAqZWQgPSBlZGk7Ci0KLQllZC0+c3RhdGUgPSBFRF9PUEVSOwotCi0Jc3dpdGNoIChlZC0+dHlwZSkgewotCWNhc2UgUElQRV9DT05UUk9MOgotCQllZC0+aHdOZXh0RUQgPSAwOwotCQlpZiAob2hjaS0+ZWRfY29udHJvbHRhaWwgPT0gTlVMTCkgewotCQkJd3JpdGVsIChlZCwgJm9oY2ktPnJlZ3MtPmVkX2NvbnRyb2xoZWFkKTsKLQkJfSBlbHNlIHsKLQkJCW9oY2ktPmVkX2NvbnRyb2x0YWlsLT5od05leHRFRCA9IG0zMl9zd2FwIChlZCk7Ci0JCX0KLQkJZWQtPmVkX3ByZXYgPSBvaGNpLT5lZF9jb250cm9sdGFpbDsKLQkJaWYgKCFvaGNpLT5lZF9jb250cm9sdGFpbCAmJiAhb2hjaS0+ZWRfcm1fbGlzdFswXSAmJgotCQkJIW9oY2ktPmVkX3JtX2xpc3RbMV0gJiYgIW9oY2ktPnNsZWVwaW5nKSB7Ci0JCQlvaGNpLT5oY19jb250cm9sIHw9IE9IQ0lfQ1RSTF9DTEU7Ci0JCQl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKLQkJfQotCQlvaGNpLT5lZF9jb250cm9sdGFpbCA9IGVkaTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBJUEVfQlVMSzoKLQkJZWQtPmh3TmV4dEVEID0gMDsKLQkJaWYgKG9oY2ktPmVkX2J1bGt0YWlsID09IE5VTEwpIHsKLQkJCXdyaXRlbCAoZWQsICZvaGNpLT5yZWdzLT5lZF9idWxraGVhZCk7Ci0JCX0gZWxzZSB7Ci0JCQlvaGNpLT5lZF9idWxrdGFpbC0+aHdOZXh0RUQgPSBtMzJfc3dhcCAoZWQpOwotCQl9Ci0JCWVkLT5lZF9wcmV2ID0gb2hjaS0+ZWRfYnVsa3RhaWw7Ci0JCWlmICghb2hjaS0+ZWRfYnVsa3RhaWwgJiYgIW9oY2ktPmVkX3JtX2xpc3RbMF0gJiYKLQkJCSFvaGNpLT5lZF9ybV9saXN0WzFdICYmICFvaGNpLT5zbGVlcGluZykgewotCQkJb2hjaS0+aGNfY29udHJvbCB8PSBPSENJX0NUUkxfQkxFOwotCQkJd3JpdGVsIChvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7Ci0JCX0KLQkJb2hjaS0+ZWRfYnVsa3RhaWwgPSBlZGk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogdW5saW5rIGFuIGVkIGZyb20gb25lIG9mIHRoZSBIQyBjaGFpbnMuCi0gKiBqdXN0IHRoZSBsaW5rIHRvIHRoZSBlZCBpcyB1bmxpbmtlZC4KLSAqIHRoZSBsaW5rIGZyb20gdGhlIGVkIHN0aWxsIHBvaW50cyB0byBhbm90aGVyIG9wZXJhdGlvbmFsIGVkIG9yIDAKLSAqIHNvIHRoZSBIQyBjYW4gZXZlbnR1YWxseSBmaW5pc2ggdGhlIHByb2Nlc3Npbmcgb2YgdGhlIHVubGlua2VkIGVkICovCi0KLXN0YXRpYyBpbnQgZXBfdW5saW5rIChvaGNpX3QgKm9oY2ksIGVkX3QgKmVkKQotewotCWVkLT5od0lORk8gfD0gbTMyX3N3YXAgKE9IQ0lfRURfU0tJUCk7Ci0KLQlzd2l0Y2ggKGVkLT50eXBlKSB7Ci0JY2FzZSBQSVBFX0NPTlRST0w6Ci0JCWlmIChlZC0+ZWRfcHJldiA9PSBOVUxMKSB7Ci0JCQlpZiAoIWVkLT5od05leHRFRCkgewotCQkJCW9oY2ktPmhjX2NvbnRyb2wgJj0gfk9IQ0lfQ1RSTF9DTEU7Ci0JCQkJd3JpdGVsIChvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7Ci0JCQl9Ci0JCQl3cml0ZWwgKG0zMl9zd2FwICgqKChfX3UzMiAqKSZlZC0+aHdOZXh0RUQpKSwgJm9oY2ktPnJlZ3MtPmVkX2NvbnRyb2xoZWFkKTsKLQkJfSBlbHNlIHsKLQkJCWVkLT5lZF9wcmV2LT5od05leHRFRCA9IGVkLT5od05leHRFRDsKLQkJfQotCQlpZiAob2hjaS0+ZWRfY29udHJvbHRhaWwgPT0gZWQpIHsKLQkJCW9oY2ktPmVkX2NvbnRyb2x0YWlsID0gZWQtPmVkX3ByZXY7Ci0JCX0gZWxzZSB7Ci0JCQkoKGVkX3QgKiltMzJfc3dhcCAoKigoX191MzIgKikmZWQtPmh3TmV4dEVEKSkpLT5lZF9wcmV2ID0gZWQtPmVkX3ByZXY7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFBJUEVfQlVMSzoKLQkJaWYgKGVkLT5lZF9wcmV2ID09IE5VTEwpIHsKLQkJCWlmICghZWQtPmh3TmV4dEVEKSB7Ci0JCQkJb2hjaS0+aGNfY29udHJvbCAmPSB+T0hDSV9DVFJMX0JMRTsKLQkJCQl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKLQkJCX0KLQkJCXdyaXRlbCAobTMyX3N3YXAgKCooKF9fdTMyICopJmVkLT5od05leHRFRCkpLCAmb2hjaS0+cmVncy0+ZWRfYnVsa2hlYWQpOwotCQl9IGVsc2UgewotCQkJZWQtPmVkX3ByZXYtPmh3TmV4dEVEID0gZWQtPmh3TmV4dEVEOwotCQl9Ci0JCWlmIChvaGNpLT5lZF9idWxrdGFpbCA9PSBlZCkgewotCQkJb2hjaS0+ZWRfYnVsa3RhaWwgPSBlZC0+ZWRfcHJldjsKLQkJfSBlbHNlIHsKLQkJCSgoZWRfdCAqKW0zMl9zd2FwICgqKChfX3UzMiAqKSZlZC0+aHdOZXh0RUQpKSktPmVkX3ByZXYgPSBlZC0+ZWRfcHJldjsKLQkJfQotCQlicmVhazsKLQl9Ci0JZWQtPnN0YXRlID0gRURfVU5MSU5LOwotCXJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGFkZC9yZWluaXQgYW4gZW5kcG9pbnQ7IHRoaXMgc2hvdWxkIGJlIGRvbmUgb25jZSBhdCB0aGUgdXNiX3NldF9jb25maWd1cmF0aW9uIGNvbW1hbmQsCi0gKiBidXQgdGhlIFVTQiBzdGFjayBpcyBhIGxpdHRsZSBiaXQgc3RhdGVsZXNzCXNvIHdlIGRvIGl0IGF0IGV2ZXJ5IHRyYW5zYWN0aW9uCi0gKiBpZiB0aGUgc3RhdGUgb2YgdGhlIGVkIGlzIEVEX05FVyB0aGVuIGEgZHVtbXkgdGQgaXMgYWRkZWQgYW5kIHRoZSBzdGF0ZSBpcyBjaGFuZ2VkIHRvIEVEX1VOTElOSwotICogaW4gYWxsIG90aGVyIGNhc2VzIHRoZSBzdGF0ZSBpcyBsZWZ0IHVuY2hhbmdlZAotICogdGhlIGVkIGluZm8gZmllbGRzIGFyZSBzZXR0ZWQgYW55d2F5IGV2ZW4gdGhvdWdoIG1vc3Qgb2YgdGhlbSBzaG91bGQgbm90IGNoYW5nZSAqLwotCi1zdGF0aWMgZWRfdCAqIGVwX2FkZF9lZCAoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSkKLXsKLQl0ZF90ICp0ZDsKLQllZF90ICplZF9yZXQ7Ci0Jdm9sYXRpbGUgZWRfdCAqZWQ7Ci0KLQllZCA9IGVkX3JldCA9ICZvaGNpX2Rldi5lZFsodXNiX3BpcGVlbmRwb2ludCAocGlwZSkgPDwgMSkgfAotCQkJKHVzYl9waXBlY29udHJvbCAocGlwZSk/IDA6IHVzYl9waXBlb3V0IChwaXBlKSldOwotCi0JaWYgKChlZC0+c3RhdGUgJiBFRF9ERUwpIHx8IChlZC0+c3RhdGUgJiBFRF9VUkJfREVMKSkgewotCQllcnIoImVwX2FkZF9lZDogcGVuZGluZyBkZWxldGUiKTsKLQkJLyogcGVuZGluZyBkZWxldGUgcmVxdWVzdCAqLwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAoZWQtPnN0YXRlID09IEVEX05FVykgewotCQllZC0+aHdJTkZPID0gbTMyX3N3YXAgKE9IQ0lfRURfU0tJUCk7IC8qIHNraXAgZWQgKi8KLQkJLyogZHVtbXkgdGQ7IGVuZCBvZiB0ZCBsaXN0IGZvciBlZCAqLwotCQl0ZCA9IHRkX2FsbG9jICh1c2JfZGV2KTsKLQkJZWQtPmh3VGFpbFAgPSBtMzJfc3dhcCAodGQpOwotCQllZC0+aHdIZWFkUCA9IGVkLT5od1RhaWxQOwotCQllZC0+c3RhdGUgPSBFRF9VTkxJTks7Ci0JCWVkLT50eXBlID0gdXNiX3BpcGV0eXBlIChwaXBlKTsKLQkJb2hjaV9kZXYuZWRfY250Kys7Ci0JfQotCi0JZWQtPmh3SU5GTyA9IG0zMl9zd2FwICh1c2JfcGlwZWRldmljZSAocGlwZSkKLQkJCXwgdXNiX3BpcGVlbmRwb2ludCAocGlwZSkgPDwgNwotCQkJfCAodXNiX3BpcGVpc29jIChwaXBlKT8gMHg4MDAwOiAwKQotCQkJfCAodXNiX3BpcGVjb250cm9sIChwaXBlKT8gMDogKHVzYl9waXBlb3V0IChwaXBlKT8gMHg4MDA6IDB4MTAwMCkpCi0JCQl8IHVzYl9waXBlc2xvdyAocGlwZSkgPDwgMTMKLQkJCXwgdXNiX21heHBhY2tldCAodXNiX2RldiwgcGlwZSkgPDwgMTYpOwotCi0JcmV0dXJuIGVkX3JldDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogVEQgaGFuZGxpbmcgZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBlbnF1ZXVlIG5leHQgVEQgZm9yIHRoaXMgVVJCIChPSENJIHNwZWMgNS4yLjguMikgKi8KLQotc3RhdGljIHZvaWQgdGRfZmlsbCAob2hjaV90ICpvaGNpLCB1bnNpZ25lZCBpbnQgaW5mbywKLQl2b2lkICpkYXRhLCBpbnQgbGVuLAotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBpbmRleCwgdXJiX3ByaXZfdCAqdXJiX3ByaXYpCi17Ci0Jdm9sYXRpbGUgdGRfdCAgKnRkLCAqdGRfcHQ7Ci0jaWZkZWYgT0hDSV9GSUxMX1RSQUNFCi0JaW50IGk7Ci0jZW5kaWYKLQotCWlmIChpbmRleCA+IHVyYl9wcml2LT5sZW5ndGgpIHsKLQkJZXJyKCJpbmRleCA+IGxlbmd0aCIpOwotCQlyZXR1cm47Ci0JfQotCS8qIHVzZSB0aGlzIHRkIGFzIHRoZSBuZXh0IGR1bW15ICovCi0JdGRfcHQgPSB1cmJfcHJpdi0+dGQgW2luZGV4XTsKLQl0ZF9wdC0+aHdOZXh0VEQgPSAwOwotCi0JLyogZmlsbCB0aGUgb2xkIGR1bW15IFREICovCi0JdGQgPSB1cmJfcHJpdi0+dGQgW2luZGV4XSA9ICh0ZF90ICopKG0zMl9zd2FwICh1cmJfcHJpdi0+ZWQtPmh3VGFpbFApICYgfjB4Zik7Ci0KLQl0ZC0+ZWQgPSB1cmJfcHJpdi0+ZWQ7Ci0JdGQtPm5leHRfZGxfdGQgPSBOVUxMOwotCXRkLT5pbmRleCA9IGluZGV4OwotCXRkLT5kYXRhID0gKF9fdTMyKWRhdGE7Ci0jaWZkZWYgT0hDSV9GSUxMX1RSQUNFCi0JaWYgKCh1c2JfcGlwZXR5cGUodXJiX3ByaXYtPnBpcGUpID09IFBJUEVfQlVMSykgJiYgdXNiX3BpcGVvdXQodXJiX3ByaXYtPnBpcGUpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJcHJpbnRmKCJ0ZC0+ZGF0YVslZF0gJSMyeCAiLGksICgodW5zaWduZWQgY2hhciAqKXRkLT5kYXRhKVtpXSk7Ci0JCXByaW50ZigiXG4iKTsKLQl9Ci0jZW5kaWYKLQlpZiAoIWxlbikKLQkJZGF0YSA9IDA7Ci0KLQl0ZC0+aHdJTkZPID0gbTMyX3N3YXAgKGluZm8pOwotCXRkLT5od0NCUCA9IG0zMl9zd2FwIChkYXRhKTsKLQlpZiAoZGF0YSkKLQkJdGQtPmh3QkUgPSBtMzJfc3dhcCAoZGF0YSArIGxlbiAtIDEpOwotCWVsc2UKLQkJdGQtPmh3QkUgPSAwOwotCXRkLT5od05leHRURCA9IG0zMl9zd2FwICh0ZF9wdCk7Ci0JdGQtPmh3UFNXIFswXSA9IG0xNl9zd2FwICgoKF9fdTMyKWRhdGEgJiAweDBGRkYpIHwgMHhFMDAwKTsKLQotCS8qIGFwcGVuZCB0byBxdWV1ZSAqLwotCXRkLT5lZC0+aHdUYWlsUCA9IHRkLT5od05leHRURDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogcHJlcGFyZSBhbGwgVERzIG9mIGEgdHJhbnNmZXIgKi8KLQotc3RhdGljIHZvaWQgdGRfc3VibWl0X2pvYiAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCi0JaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKnNldHVwLCB1cmJfcHJpdl90ICp1cmIsIGludCBpbnRlcnZhbCkKLXsKLQlvaGNpX3QgKm9oY2kgPSAmZ29oY2k7Ci0JaW50IGRhdGFfbGVuID0gdHJhbnNmZXJfbGVuOwotCXZvaWQgKmRhdGE7Ci0JaW50IGNudCA9IDA7Ci0JX191MzIgaW5mbyA9IDA7Ci0JdW5zaWduZWQgaW50IHRvZ2dsZSA9IDA7Ci0KLQkvKiBPSENJIGhhbmRsZXMgdGhlIERBVEEtdG9nZ2xlcyBpdHNlbGYsIHdlIGp1c3QgdXNlIHRoZSBVU0ItdG9nZ2xlIGJpdHMgZm9yIHJlc2V0aW5nICovCi0JaWYodXNiX2dldHRvZ2dsZShkZXYsIHVzYl9waXBlZW5kcG9pbnQocGlwZSksIHVzYl9waXBlb3V0KHBpcGUpKSkgewotCQl0b2dnbGUgPSBURF9UX1RPR0dMRTsKLQl9IGVsc2UgewotCQl0b2dnbGUgPSBURF9UX0RBVEEwOwotCQl1c2Jfc2V0dG9nZ2xlKGRldiwgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwgdXNiX3BpcGVvdXQocGlwZSksIDEpOwotCX0KLQl1cmItPnRkX2NudCA9IDA7Ci0JaWYgKGRhdGFfbGVuKQotCQlkYXRhID0gYnVmZmVyOwotCWVsc2UKLQkJZGF0YSA9IDA7Ci0KLQlzd2l0Y2ggKHVzYl9waXBldHlwZSAocGlwZSkpIHsKLQljYXNlIFBJUEVfQlVMSzoKLQkJaW5mbyA9IHVzYl9waXBlb3V0IChwaXBlKT8KLQkJCVREX0NDIHwgVERfRFBfT1VUIDogVERfQ0MgfCBURF9EUF9JTiA7Ci0JCXdoaWxlKGRhdGFfbGVuID4gNDA5NikgewotCQkJdGRfZmlsbCAob2hjaSwgaW5mbyB8IChjbnQ/IFREX1RfVE9HR0xFOnRvZ2dsZSksIGRhdGEsIDQwOTYsIGRldiwgY250LCB1cmIpOwotCQkJZGF0YSArPSA0MDk2OyBkYXRhX2xlbiAtPSA0MDk2OyBjbnQrKzsKLQkJfQotCQlpbmZvID0gdXNiX3BpcGVvdXQgKHBpcGUpPwotCQkJVERfQ0MgfCBURF9EUF9PVVQgOiBURF9DQyB8IFREX1IgfCBURF9EUF9JTiA7Ci0JCXRkX2ZpbGwgKG9oY2ksIGluZm8gfCAoY250PyBURF9UX1RPR0dMRTp0b2dnbGUpLCBkYXRhLCBkYXRhX2xlbiwgZGV2LCBjbnQsIHVyYik7Ci0JCWNudCsrOwotCi0JCWlmICghb2hjaS0+c2xlZXBpbmcpCi0JCQl3cml0ZWwgKE9IQ0lfQkxGLCAmb2hjaS0+cmVncy0+Y21kc3RhdHVzKTsgLyogc3RhcnQgYnVsayBsaXN0ICovCi0JCWJyZWFrOwotCi0JY2FzZSBQSVBFX0NPTlRST0w6Ci0JCWluZm8gPSBURF9DQyB8IFREX0RQX1NFVFVQIHwgVERfVF9EQVRBMDsKLQkJdGRfZmlsbCAob2hjaSwgaW5mbywgc2V0dXAsIDgsIGRldiwgY250KyssIHVyYik7Ci0JCWlmIChkYXRhX2xlbiA+IDApIHsKLQkJCWluZm8gPSB1c2JfcGlwZW91dCAocGlwZSk/Ci0JCQkJVERfQ0MgfCBURF9SIHwgVERfRFBfT1VUIHwgVERfVF9EQVRBMSA6IFREX0NDIHwgVERfUiB8IFREX0RQX0lOIHwgVERfVF9EQVRBMTsKLQkJCS8qIE5PVEU6ICBtaXNoYW5kbGVzIHRyYW5zZmVycyA+OEssIHNvbWUgPjRLICovCi0JCQl0ZF9maWxsIChvaGNpLCBpbmZvLCBkYXRhLCBkYXRhX2xlbiwgZGV2LCBjbnQrKywgdXJiKTsKLQkJfQotCQlpbmZvID0gdXNiX3BpcGVvdXQgKHBpcGUpPwotCQkJVERfQ0MgfCBURF9EUF9JTiB8IFREX1RfREFUQTE6IFREX0NDIHwgVERfRFBfT1VUIHwgVERfVF9EQVRBMTsKLQkJdGRfZmlsbCAob2hjaSwgaW5mbywgZGF0YSwgMCwgZGV2LCBjbnQrKywgdXJiKTsKLQkJaWYgKCFvaGNpLT5zbGVlcGluZykKLQkJCXdyaXRlbCAoT0hDSV9DTEYsICZvaGNpLT5yZWdzLT5jbWRzdGF0dXMpOyAvKiBzdGFydCBDb250cm9sIGxpc3QgKi8KLQkJYnJlYWs7Ci0JfQotCWlmICh1cmItPmxlbmd0aCAhPSBjbnQpCi0JCWRiZygiVEQgTEVOR1RIICVkICE9IENOVCAlZCIsIHVyYi0+bGVuZ3RoLCBjbnQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBEb25lIExpc3QgaGFuZGxpbmcgZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qIGNhbGN1bGF0ZSB0aGUgdHJhbnNmZXIgbGVuZ3RoIGFuZCB1cGRhdGUgdGhlIHVyYiAqLwotCi1zdGF0aWMgdm9pZCBkbF90cmFuc2Zlcl9sZW5ndGgodGRfdCAqIHRkKQotewotCV9fdTMyIHRkSU5GTywgdGRCRSwgdGRDQlA7Ci0JdXJiX3ByaXZfdCAqbHVyYl9wcml2ID0gJnVyYl9wcml2OwotCi0JdGRJTkZPID0gbTMyX3N3YXAgKHRkLT5od0lORk8pOwotCXRkQkUgICA9IG0zMl9zd2FwICh0ZC0+aHdCRSk7Ci0JdGRDQlAgID0gbTMyX3N3YXAgKHRkLT5od0NCUCk7Ci0KLQotCWlmICghKHVzYl9waXBldHlwZSAobHVyYl9wcml2LT5waXBlKSA9PSBQSVBFX0NPTlRST0wgJiYKLQkgICAgKCh0ZC0+aW5kZXggPT0gMCkgfHwgKHRkLT5pbmRleCA9PSBsdXJiX3ByaXYtPmxlbmd0aCAtIDEpKSkpIHsKLQkJaWYgKHRkQkUgIT0gMCkgewotCQkJaWYgKHRkLT5od0NCUCA9PSAwKQotCQkJCWx1cmJfcHJpdi0+YWN0dWFsX2xlbmd0aCArPSB0ZEJFIC0gdGQtPmRhdGEgKyAxOwotCQkJZWxzZQotCQkJCWx1cmJfcHJpdi0+YWN0dWFsX2xlbmd0aCArPSB0ZENCUCAtIHRkLT5kYXRhOwotCQl9Ci0JfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiByZXBsaWVzIHRvIHRoZSByZXF1ZXN0IGhhdmUgdG8gYmUgb24gYSBGSUZPIGJhc2lzIHNvCi0gKiB3ZSByZXZlcnNlIHRoZSByZXZlcnNlZCBkb25lLWxpc3QgKi8KLQotc3RhdGljIHRkX3QgKiBkbF9yZXZlcnNlX2RvbmVfbGlzdCAob2hjaV90ICpvaGNpKQotewotCV9fdTMyIHRkX2xpc3RfaGM7Ci0JdGRfdCAqdGRfcmV2ID0gTlVMTDsKLQl0ZF90ICp0ZF9saXN0ID0gTlVMTDsKLQl1cmJfcHJpdl90ICpsdXJiX3ByaXYgPSBOVUxMOwotCi0JdGRfbGlzdF9oYyA9IG0zMl9zd2FwIChvaGNpLT5oY2NhLT5kb25lX2hlYWQpICYgMHhmZmZmZmZmMDsKLQlvaGNpLT5oY2NhLT5kb25lX2hlYWQgPSAwOwotCi0Jd2hpbGUgKHRkX2xpc3RfaGMpIHsKLQkJdGRfbGlzdCA9ICh0ZF90ICopdGRfbGlzdF9oYzsKLQotCQlpZiAoVERfQ0NfR0VUIChtMzJfc3dhcCAodGRfbGlzdC0+aHdJTkZPKSkpIHsKLQkJCWx1cmJfcHJpdiA9ICZ1cmJfcHJpdjsKLQkJCWRiZygiIFVTQi1lcnJvci9zdGF0dXM6ICV4IDogJXAiLAotCQkJCQlURF9DQ19HRVQgKG0zMl9zd2FwICh0ZF9saXN0LT5od0lORk8pKSwgdGRfbGlzdCk7Ci0JCQlpZiAodGRfbGlzdC0+ZWQtPmh3SGVhZFAgJiBtMzJfc3dhcCAoMHgxKSkgewotCQkJCWlmIChsdXJiX3ByaXYgJiYgKCh0ZF9saXN0LT5pbmRleCArIDEpIDwgbHVyYl9wcml2LT5sZW5ndGgpKSB7Ci0JCQkJCXRkX2xpc3QtPmVkLT5od0hlYWRQID0KLQkJCQkJCShsdXJiX3ByaXYtPnRkW2x1cmJfcHJpdi0+bGVuZ3RoIC0gMV0tPmh3TmV4dFREICYgbTMyX3N3YXAgKDB4ZmZmZmZmZjApKSB8Ci0JCQkJCQkJCQkodGRfbGlzdC0+ZWQtPmh3SGVhZFAgJiBtMzJfc3dhcCAoMHgyKSk7Ci0JCQkJCWx1cmJfcHJpdi0+dGRfY250ICs9IGx1cmJfcHJpdi0+bGVuZ3RoIC0gdGRfbGlzdC0+aW5kZXggLSAxOwotCQkJCX0gZWxzZQotCQkJCQl0ZF9saXN0LT5lZC0+aHdIZWFkUCAmPSBtMzJfc3dhcCAoMHhmZmZmZmZmMik7Ci0JCQl9Ci0JCX0KLQotCQl0ZF9saXN0LT5uZXh0X2RsX3RkID0gdGRfcmV2OwotCQl0ZF9yZXYgPSB0ZF9saXN0OwotCQl0ZF9saXN0X2hjID0gbTMyX3N3YXAgKHRkX2xpc3QtPmh3TmV4dFREKSAmIDB4ZmZmZmZmZjA7Ci0JfQotCXJldHVybiB0ZF9saXN0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiB0ZCBkb25lIGxpc3QgKi8KLXN0YXRpYyBpbnQgZGxfZG9uZV9saXN0IChvaGNpX3QgKm9oY2ksIHRkX3QgKnRkX2xpc3QpCi17Ci0JdGRfdCAqdGRfbGlzdF9uZXh0ID0gTlVMTDsKLQllZF90ICplZDsKLQlpbnQgY2MgPSAwOwotCWludCBzdGF0ID0gMDsKLQkvKiB1cmJfdCAqdXJiOyAqLwotCXVyYl9wcml2X3QgKmx1cmJfcHJpdjsKLQlfX3UzMiB0ZElORk8sIGVkSGVhZFAsIGVkVGFpbFA7Ci0KLQl3aGlsZSAodGRfbGlzdCkgewotCQl0ZF9saXN0X25leHQgPSB0ZF9saXN0LT5uZXh0X2RsX3RkOwotCi0JCWx1cmJfcHJpdiA9ICZ1cmJfcHJpdjsKLQkJdGRJTkZPID0gbTMyX3N3YXAgKHRkX2xpc3QtPmh3SU5GTyk7Ci0KLQkJZWQgPSB0ZF9saXN0LT5lZDsKLQotCQlkbF90cmFuc2Zlcl9sZW5ndGgodGRfbGlzdCk7Ci0KLQkJLyogZXJyb3IgY29kZSBvZiB0cmFuc2ZlciAqLwotCQljYyA9IFREX0NDX0dFVCAodGRJTkZPKTsKLQkJaWYgKGNjICE9IDApIHsKLQkJCWRiZygiQ29uZGl0aW9uQ29kZSAlI3giLCBjYyk7Ci0JCQlzdGF0ID0gY2NfdG9fZXJyb3JbY2NdOwotCQl9Ci0KLQkJaWYgKGVkLT5zdGF0ZSAhPSBFRF9ORVcpIHsKLQkJCWVkSGVhZFAgPSBtMzJfc3dhcCAoZWQtPmh3SGVhZFApICYgMHhmZmZmZmZmMDsKLQkJCWVkVGFpbFAgPSBtMzJfc3dhcCAoZWQtPmh3VGFpbFApOwotCi0JCQkvKiB1bmxpbmsgZWRzIGlmIHRoZXkgYXJlIG5vdCBidXN5ICovCi0JCQlpZiAoKGVkSGVhZFAgPT0gZWRUYWlsUCkgJiYgKGVkLT5zdGF0ZSA9PSBFRF9PUEVSKSkKLQkJCQllcF91bmxpbmsgKG9oY2ksIGVkKTsKLQkJfQotCi0JCXRkX2xpc3QgPSB0ZF9saXN0X25leHQ7Ci0JfQotCXJldHVybiBzdGF0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBWaXJ0dWFsIFJvb3QgSHViCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBEZXZpY2UgZGVzY3JpcHRvciAqLwotc3RhdGljIF9fdTggcm9vdF9odWJfZGV2X2Rlc1tdID0KLXsKLQkweDEyLAkgICAgLyoJX191OCAgYkxlbmd0aDsgKi8KLQkweDAxLAkgICAgLyoJX191OCAgYkRlc2NyaXB0b3JUeXBlOyBEZXZpY2UgKi8KLQkweDEwLAkgICAgLyoJX191MTYgYmNkVVNCOyB2MS4xICovCi0JMHgwMSwKLQkweDA5LAkgICAgLyoJX191OCAgYkRldmljZUNsYXNzOyBIVUJfQ0xBU1NDT0RFICovCi0JMHgwMCwJICAgIC8qCV9fdTggIGJEZXZpY2VTdWJDbGFzczsgKi8KLQkweDAwLAkgICAgLyoJX191OCAgYkRldmljZVByb3RvY29sOyAqLwotCTB4MDgsCSAgICAvKglfX3U4ICBiTWF4UGFja2V0U2l6ZTA7IDggQnl0ZXMgKi8KLQkweDAwLAkgICAgLyoJX191MTYgaWRWZW5kb3I7ICovCi0JMHgwMCwKLQkweDAwLAkgICAgLyoJX191MTYgaWRQcm9kdWN0OyAqLwotCTB4MDAsCi0JMHgwMCwJICAgIC8qCV9fdTE2IGJjZERldmljZTsgKi8KLQkweDAwLAotCTB4MDAsCSAgICAvKglfX3U4ICBpTWFudWZhY3R1cmVyOyAqLwotCTB4MDEsCSAgICAvKglfX3U4ICBpUHJvZHVjdDsgKi8KLQkweDAwLAkgICAgLyoJX191OCAgaVNlcmlhbE51bWJlcjsgKi8KLQkweDAxCSAgICAvKglfX3U4ICBiTnVtQ29uZmlndXJhdGlvbnM7ICovCi19OwotCi0KLS8qIENvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciAqLwotc3RhdGljIF9fdTggcm9vdF9odWJfY29uZmlnX2Rlc1tdID0KLXsKLQkweDA5LAkgICAgLyoJX191OCAgYkxlbmd0aDsgKi8KLQkweDAyLAkgICAgLyoJX191OCAgYkRlc2NyaXB0b3JUeXBlOyBDb25maWd1cmF0aW9uICovCi0JMHgxOSwJICAgIC8qCV9fdTE2IHdUb3RhbExlbmd0aDsgKi8KLQkweDAwLAotCTB4MDEsCSAgICAvKglfX3U4ICBiTnVtSW50ZXJmYWNlczsgKi8KLQkweDAxLAkgICAgLyoJX191OCAgYkNvbmZpZ3VyYXRpb25WYWx1ZTsgKi8KLQkweDAwLAkgICAgLyoJX191OCAgaUNvbmZpZ3VyYXRpb247ICovCi0JMHg0MCwJICAgIC8qCV9fdTggIGJtQXR0cmlidXRlczsKLQkJIEJpdCA3OiBCdXMtcG93ZXJlZCwgNjogU2VsZi1wb3dlcmVkLCA1IFJlbW90ZS13YWt3dXAsIDQuLjA6IHJlc3ZkICovCi0JMHgwMCwJICAgIC8qCV9fdTggIE1heFBvd2VyOyAqLwotCi0JLyogaW50ZXJmYWNlICovCi0JMHgwOSwJICAgIC8qCV9fdTggIGlmX2JMZW5ndGg7ICovCi0JMHgwNCwJICAgIC8qCV9fdTggIGlmX2JEZXNjcmlwdG9yVHlwZTsgSW50ZXJmYWNlICovCi0JMHgwMCwJICAgIC8qCV9fdTggIGlmX2JJbnRlcmZhY2VOdW1iZXI7ICovCi0JMHgwMCwJICAgIC8qCV9fdTggIGlmX2JBbHRlcm5hdGVTZXR0aW5nOyAqLwotCTB4MDEsCSAgICAvKglfX3U4ICBpZl9iTnVtRW5kcG9pbnRzOyAqLwotCTB4MDksCSAgICAvKglfX3U4ICBpZl9iSW50ZXJmYWNlQ2xhc3M7IEhVQl9DTEFTU0NPREUgKi8KLQkweDAwLAkgICAgLyoJX191OCAgaWZfYkludGVyZmFjZVN1YkNsYXNzOyAqLwotCTB4MDAsCSAgICAvKglfX3U4ICBpZl9iSW50ZXJmYWNlUHJvdG9jb2w7ICovCi0JMHgwMCwJICAgIC8qCV9fdTggIGlmX2lJbnRlcmZhY2U7ICovCi0KLQkvKiBlbmRwb2ludCAqLwotCTB4MDcsCSAgICAvKglfX3U4ICBlcF9iTGVuZ3RoOyAqLwotCTB4MDUsCSAgICAvKglfX3U4ICBlcF9iRGVzY3JpcHRvclR5cGU7IEVuZHBvaW50ICovCi0JMHg4MSwJICAgIC8qCV9fdTggIGVwX2JFbmRwb2ludEFkZHJlc3M7IElOIEVuZHBvaW50IDEgKi8KLQkweDAzLAkgICAgLyoJX191OCAgZXBfYm1BdHRyaWJ1dGVzOyBJbnRlcnJ1cHQgKi8KLQkweDAyLAkgICAgLyoJX191MTYgZXBfd01heFBhY2tldFNpemU7ICgoTUFYX1JPT1RfUE9SVFMgKyAxKSAvIDggKi8KLQkweDAwLAotCTB4ZmYJICAgIC8qCV9fdTggIGVwX2JJbnRlcnZhbDsgMjU1IG1zICovCi19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciByb290X2h1Yl9zdHJfaW5kZXgwW10gPQotewotCTB4MDQsCQkJLyogIF9fdTggIGJMZW5ndGg7ICovCi0JMHgwMywJCQkvKiAgX191OCAgYkRlc2NyaXB0b3JUeXBlOyBTdHJpbmctZGVzY3JpcHRvciAqLwotCTB4MDksCQkJLyogIF9fdTggIGxhbmcgSUQgKi8KLQkweDA0LAkJCS8qICBfX3U4ICBsYW5nIElEICovCi19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciByb290X2h1Yl9zdHJfaW5kZXgxW10gPQotewotCTI4LAkJCS8qICBfX3U4ICBiTGVuZ3RoOyAqLwotCTB4MDMsCQkJLyogIF9fdTggIGJEZXNjcmlwdG9yVHlwZTsgU3RyaW5nLWRlc2NyaXB0b3IgKi8KLQknTycsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCSdIJywJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JJ0MnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQknSScsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCScgJywJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JJ1InLAkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQknbycsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCSdvJywJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JJ3QnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQknICcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCSdIJywJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JJ3UnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQknYicsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLwotfTsKLQotLyogSHViIGNsYXNzLXNwZWNpZmljIGRlc2NyaXB0b3IgaXMgY29uc3RydWN0ZWQgZHluYW1pY2FsbHkgKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIE9LKHgpCQkJbGVuID0gKHgpOyBicmVhawotI2lmZGVmIERFQlVHCi0jZGVmaW5lIFdSX1JIX1NUQVQoeCkJCXtpbmZvKCJXUjpzdGF0dXMgJSM4eCIsICh4KSk7d3JpdGVsKCh4KSwgJmdvaGNpLnJlZ3MtPnJvb3RodWIuc3RhdHVzKTt9Ci0jZGVmaW5lIFdSX1JIX1BPUlRTVEFUKHgpCXtpbmZvKCJXUjpwb3J0c3RhdHVzWyVkXSAlIzh4Iiwgd0luZGV4LTEsICh4KSk7d3JpdGVsKCh4KSwgJmdvaGNpLnJlZ3MtPnJvb3RodWIucG9ydHN0YXR1c1t3SW5kZXgtMV0pO30KLSNlbHNlCi0jZGVmaW5lIFdSX1JIX1NUQVQoeCkJCXdyaXRlbCgoeCksICZnb2hjaS5yZWdzLT5yb290aHViLnN0YXR1cykKLSNkZWZpbmUgV1JfUkhfUE9SVFNUQVQoeCkJd3JpdGVsKCh4KSwgJmdvaGNpLnJlZ3MtPnJvb3RodWIucG9ydHN0YXR1c1t3SW5kZXgtMV0pCi0jZW5kaWYKLSNkZWZpbmUgUkRfUkhfU1RBVAkJcm9vdGh1Yl9zdGF0dXMoJmdvaGNpKQotI2RlZmluZSBSRF9SSF9QT1JUU1RBVAkJcm9vdGh1Yl9wb3J0c3RhdHVzKCZnb2hjaSx3SW5kZXgtMSkKLQotLyogcmVxdWVzdCB0byB2aXJ0dWFsIHJvb3QgaHViICovCi0KLWludCByaF9jaGVja19wb3J0X3N0YXR1cyhvaGNpX3QgKmNvbnRyb2xsZXIpCi17Ci0JX191MzIgdGVtcCwgbmRwLCBpOwotCWludCByZXM7Ci0KLQlyZXMgPSAtMTsKLQl0ZW1wID0gcm9vdGh1Yl9hIChjb250cm9sbGVyKTsKLQluZHAgPSAodGVtcCAmIFJIX0FfTkRQKTsKLSNpZmRlZiBDT05GSUdfQVQ5MUNfUFFGUF9VSFBCVUcKLQluZHAgPSAobmRwID09IDIpID8gMTowOwotI2VuZGlmCi0KLQlmb3IgKGkgPSAwOyBpIDwgbmRwOyBpKyspIHsKLQkJdGVtcCA9IHJvb3RodWJfcG9ydHN0YXR1cyAoY29udHJvbGxlciwgaSk7Ci0JCS8qIGNoZWNrIGZvciBhIGRldmljZSBkaXNjb25uZWN0ICovCi0JCWlmICgoKHRlbXAgJiAoUkhfUFNfUEVTQyB8IFJIX1BTX0NTQykpID09Ci0JCQkoUkhfUFNfUEVTQyB8IFJIX1BTX0NTQykpICYmCi0JCQkoKHRlbXAgJiBSSF9QU19DQ1MpID09IDApKSB7Ci0JCQlyZXMgPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBvaGNpX3N1Ym1pdF9yaF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLAotCQl2b2lkICpidWZmZXIsIGludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICpjbWQpCi17Ci0Jdm9pZCAqIGRhdGEgPSBidWZmZXI7Ci0JaW50IGxlbmkgPSB0cmFuc2Zlcl9sZW47Ci0JaW50IGxlbiA9IDA7Ci0JaW50IHN0YXQgPSAwOwotCV9fdTMyIGRhdGFiWzRdOwotCV9fdTggKmRhdGFfYnVmID0gKF9fdTggKilkYXRhYjsKLQlfX3UxNiBibVJUeXBlX2JSZXE7Ci0JX191MTYgd1ZhbHVlOwotCV9fdTE2IHdJbmRleDsKLQlfX3UxNiB3TGVuZ3RoOwotCi0jaWZkZWYgREVCVUcKLXVyYl9wcml2LmFjdHVhbF9sZW5ndGggPSAwOwotcGt0X3ByaW50KGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIGNtZCwgIlNVQihyaCkiLCB1c2JfcGlwZWluKHBpcGUpKTsKLSNlbHNlCi0Jd2FpdF9tcygxKTsKLSNlbmRpZgotCWlmICgocGlwZSAmIFBJUEVfSU5URVJSVVBUKSA9PSBQSVBFX0lOVEVSUlVQVCkgewotCQlpbmZvKCJSb290LUh1YiBzdWJtaXQgSVJROiBOT1QgaW1wbGVtZW50ZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYm1SVHlwZV9iUmVxICA9IGNtZC0+cmVxdWVzdHR5cGUgfCAoY21kLT5yZXF1ZXN0IDw8IDgpOwotCXdWYWx1ZQkgICAgICA9IG0xNl9zd2FwIChjbWQtPnZhbHVlKTsKLQl3SW5kZXgJICAgICAgPSBtMTZfc3dhcCAoY21kLT5pbmRleCk7Ci0Jd0xlbmd0aAkgICAgICA9IG0xNl9zd2FwIChjbWQtPmxlbmd0aCk7Ci0KLQlpbmZvKCJSb290LUh1YjogYWRyOiAlMnggY21kKCUxeCk6ICUwOHggJTA0eCAlMDR4ICUwNHgiLAotCQlkZXYtPmRldm51bSwgOCwgYm1SVHlwZV9iUmVxLCB3VmFsdWUsIHdJbmRleCwgd0xlbmd0aCk7Ci0KLQlzd2l0Y2ggKGJtUlR5cGVfYlJlcSkgewotCS8qIFJlcXVlc3QgRGVzdGluYXRpb246Ci0JICAgd2l0aG91dCBmbGFnczogRGV2aWNlLAotCSAgIFJIX0lOVEVSRkFDRTogaW50ZXJmYWNlLAotCSAgIFJIX0VORFBPSU5UOiBlbmRwb2ludCwKLQkgICBSSF9DTEFTUyBtZWFucyBIVUIgaGVyZSwKLQkgICBSSF9PVEhFUiB8IFJIX0NMQVNTCWFsbW9zdCBldmVyIG1lYW5zIEhVQl9QT1JUIGhlcmUKLQkqLwotCi0JY2FzZSBSSF9HRVRfU1RBVFVTOgotCQkJKihfX3UxNiAqKSBkYXRhX2J1ZiA9IG0xNl9zd2FwICgxKTsgT0sgKDIpOwotCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX0lOVEVSRkFDRToKLQkJCSooX191MTYgKikgZGF0YV9idWYgPSBtMTZfc3dhcCAoMCk7IE9LICgyKTsKLQljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9FTkRQT0lOVDoKLQkJCSooX191MTYgKikgZGF0YV9idWYgPSBtMTZfc3dhcCAoMCk7IE9LICgyKTsKLQljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9DTEFTUzoKLQkJCSooX191MzIgKikgZGF0YV9idWYgPSBtMzJfc3dhcCAoCi0JCQkJUkRfUkhfU1RBVCAmIH4oUkhfSFNfQ1JXRSB8IFJIX0hTX0RSV0UpKTsKLQkJCU9LICg0KTsKLQljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9PVEhFUiB8IFJIX0NMQVNTOgotCQkJKihfX3UzMiAqKSBkYXRhX2J1ZiA9IG0zMl9zd2FwIChSRF9SSF9QT1JUU1RBVCk7IE9LICg0KTsKLQotCWNhc2UgUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX0VORFBPSU5UOgotCQlzd2l0Y2ggKHdWYWx1ZSkgewotCQkJY2FzZSAoUkhfRU5EUE9JTlRfU1RBTEwpOiBPSyAoMCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFJIX0NMRUFSX0ZFQVRVUkUgfCBSSF9DTEFTUzoKLQkJc3dpdGNoICh3VmFsdWUpIHsKLQkJCWNhc2UgUkhfQ19IVUJfTE9DQUxfUE9XRVI6Ci0JCQkJT0soMCk7Ci0JCQljYXNlIChSSF9DX0hVQl9PVkVSX0NVUlJFTlQpOgotCQkJCQlXUl9SSF9TVEFUKFJIX0hTX09DSUMpOyBPSyAoMCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFJIX0NMRUFSX0ZFQVRVUkUgfCBSSF9PVEhFUiB8IFJIX0NMQVNTOgotCQlzd2l0Y2ggKHdWYWx1ZSkgewotCQkJY2FzZSAoUkhfUE9SVF9FTkFCTEUpOgotCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfQ0NTICk7IE9LICgwKTsKLQkJCWNhc2UgKFJIX1BPUlRfU1VTUEVORCk6Ci0JCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QT0NJKTsgT0sgKDApOwotCQkJY2FzZSAoUkhfUE9SVF9QT1dFUik6Ci0JCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19MU0RBKTsgT0sgKDApOwotCQkJY2FzZSAoUkhfQ19QT1JUX0NPTk5FQ1RJT04pOgotCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfQ1NDICk7IE9LICgwKTsKLQkJCWNhc2UgKFJIX0NfUE9SVF9FTkFCTEUpOgotCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfUEVTQyk7IE9LICgwKTsKLQkJCWNhc2UgKFJIX0NfUE9SVF9TVVNQRU5EKToKLQkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BTU0MpOyBPSyAoMCk7Ci0JCQljYXNlIChSSF9DX1BPUlRfT1ZFUl9DVVJSRU5UKToKLQkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX09DSUMpOyBPSyAoMCk7Ci0JCQljYXNlIChSSF9DX1BPUlRfUkVTRVQpOgotCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfUFJTQyk7IE9LICgwKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgUkhfU0VUX0ZFQVRVUkUgfCBSSF9PVEhFUiB8IFJIX0NMQVNTOgotCQlzd2l0Y2ggKHdWYWx1ZSkgewotCQkJY2FzZSAoUkhfUE9SVF9TVVNQRU5EKToKLQkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BTUyApOyBPSyAoMCk7Ci0JCQljYXNlIChSSF9QT1JUX1JFU0VUKTogLyogQlVHIElOIEhVUCBDT0RFICoqKioqKioqKi8KLQkJCQkJaWYgKFJEX1JIX1BPUlRTVEFUICYgUkhfUFNfQ0NTKQotCQkJCQkgICAgV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BSUyk7Ci0JCQkJCU9LICgwKTsKLQkJCWNhc2UgKFJIX1BPUlRfUE9XRVIpOgotCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfUFBTICk7IE9LICgwKTsKLQkJCWNhc2UgKFJIX1BPUlRfRU5BQkxFKTogLyogQlVHIElOIEhVUCBDT0RFICoqKioqKioqKi8KLQkJCQkJaWYgKFJEX1JIX1BPUlRTVEFUICYgUkhfUFNfQ0NTKQotCQkJCQkgICAgV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BFUyApOwotCQkJCQlPSyAoMCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFJIX1NFVF9BRERSRVNTOiBnb2hjaS5yaC5kZXZudW0gPSB3VmFsdWU7IE9LKDApOwotCi0JY2FzZSBSSF9HRVRfREVTQ1JJUFRPUjoKLQkJc3dpdGNoICgod1ZhbHVlICYgMHhmZjAwKSA+PiA4KSB7Ci0JCQljYXNlICgweDAxKTogLyogZGV2aWNlIGRlc2NyaXB0b3IgKi8KLQkJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCi0JCQkJCSAgbGVuaSwKLQkJCQkJICBtaW5fdCh1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICAgIHNpemVvZiAocm9vdF9odWJfZGV2X2RlcyksCi0JCQkJCSAgICAgIHdMZW5ndGgpKTsKLQkJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX2Rldl9kZXM7IE9LKGxlbik7Ci0JCQljYXNlICgweDAyKTogLyogY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yICovCi0JCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAotCQkJCQkgIGxlbmksCi0JCQkJCSAgbWluX3QodW5zaWduZWQgaW50LAotCQkJCQkgICAgICBzaXplb2YgKHJvb3RfaHViX2NvbmZpZ19kZXMpLAotCQkJCQkgICAgICB3TGVuZ3RoKSk7Ci0JCQkJZGF0YV9idWYgPSByb290X2h1Yl9jb25maWdfZGVzOyBPSyhsZW4pOwotCQkJY2FzZSAoMHgwMyk6IC8qIHN0cmluZyBkZXNjcmlwdG9ycyAqLwotCQkJCWlmKHdWYWx1ZT09MHgwMzAwKSB7Ci0JCQkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKLQkJCQkJCSAgbGVuaSwKLQkJCQkJCSAgbWluX3QodW5zaWduZWQgaW50LAotCQkJCQkJICAgICAgc2l6ZW9mIChyb290X2h1Yl9zdHJfaW5kZXgwKSwKLQkJCQkJCSAgICAgIHdMZW5ndGgpKTsKLQkJCQkJZGF0YV9idWYgPSByb290X2h1Yl9zdHJfaW5kZXgwOwotCQkJCQlPSyhsZW4pOwotCQkJCX0KLQkJCQlpZih3VmFsdWU9PTB4MDMwMSkgewotCQkJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCi0JCQkJCQkgIGxlbmksCi0JCQkJCQkgIG1pbl90KHVuc2lnbmVkIGludCwKLQkJCQkJCSAgICAgIHNpemVvZiAocm9vdF9odWJfc3RyX2luZGV4MSksCi0JCQkJCQkgICAgICB3TGVuZ3RoKSk7Ci0JCQkJCWRhdGFfYnVmID0gcm9vdF9odWJfc3RyX2luZGV4MTsKLQkJCQkJT0sobGVuKTsKLQkJCX0KLQkJCWRlZmF1bHQ6Ci0JCQkJc3RhdCA9IFVTQl9TVF9TVEFMTEVEOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBSSF9HRVRfREVTQ1JJUFRPUiB8IFJIX0NMQVNTOgotCXsKLQkJX191MzIgdGVtcCA9IHJvb3RodWJfYSAoJmdvaGNpKTsKLQotCQlkYXRhX2J1ZiBbMF0gPSA5OwkJLyogbWluIGxlbmd0aDsgKi8KLQkJZGF0YV9idWYgWzFdID0gMHgyOTsKLQkJZGF0YV9idWYgWzJdID0gdGVtcCAmIFJIX0FfTkRQOwotI2lmZGVmIENPTkZJR19BVDkxQ19QUUZQX1VIUEJVRwotCQlkYXRhX2J1ZiBbMl0gPSAoZGF0YV9idWYgWzJdID09IDIpID8gMTowOwotI2VuZGlmCi0JCWRhdGFfYnVmIFszXSA9IDA7Ci0JCWlmICh0ZW1wICYgUkhfQV9QU00pCS8qIHBlci1wb3J0IHBvd2VyIHN3aXRjaGluZz8gKi8KLQkJCWRhdGFfYnVmIFszXSB8PSAweDE7Ci0JCWlmICh0ZW1wICYgUkhfQV9OT0NQKQkvKiBubyBvdmVyY3VycmVudCByZXBvcnRpbmc/ICovCi0JCQlkYXRhX2J1ZiBbM10gfD0gMHgxMDsKLQkJZWxzZSBpZiAodGVtcCAmIFJIX0FfT0NQTSkJLyogcGVyLXBvcnQgb3ZlcmN1cnJlbnQgcmVwb3J0aW5nPyAqLwotCQkJZGF0YV9idWYgWzNdIHw9IDB4ODsKLQotCQkvKiBjb3JyZXNwb25kcyB0byBkYXRhX2J1Zls0LTddICovCi0JCWRhdGFiIFsxXSA9IDA7Ci0JCWRhdGFfYnVmIFs1XSA9ICh0ZW1wICYgUkhfQV9QT1RQR1QpID4+IDI0OwotCQl0ZW1wID0gcm9vdGh1Yl9iICgmZ29oY2kpOwotCQlkYXRhX2J1ZiBbN10gPSB0ZW1wICYgUkhfQl9EUjsKLQkJaWYgKGRhdGFfYnVmIFsyXSA8IDcpIHsKLQkJCWRhdGFfYnVmIFs4XSA9IDB4ZmY7Ci0JCX0gZWxzZSB7Ci0JCQlkYXRhX2J1ZiBbMF0gKz0gMjsKLQkJCWRhdGFfYnVmIFs4XSA9ICh0ZW1wICYgUkhfQl9EUikgPj4gODsKLQkJCWRhdGFfYnVmIFsxMF0gPSBkYXRhX2J1ZiBbOV0gPSAweGZmOwotCQl9Ci0KLQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW5pLAotCQltaW5fdCh1bnNpZ25lZCBpbnQsIGRhdGFfYnVmIFswXSwgd0xlbmd0aCkpOwotCQlPSyAobGVuKTsKLQl9Ci0KLQljYXNlIFJIX0dFVF9DT05GSUdVUkFUSU9OOgkqKF9fdTggKikgZGF0YV9idWYgPSAweDAxOyBPSyAoMSk7Ci0KLQljYXNlIFJIX1NFVF9DT05GSUdVUkFUSU9OOglXUl9SSF9TVEFUICgweDEwMDAwKTsgT0sgKDApOwotCi0JZGVmYXVsdDoKLQkJZGJnICgidW5zdXBwb3J0ZWQgcm9vdCBodWIgY29tbWFuZCIpOwotCQlzdGF0ID0gVVNCX1NUX1NUQUxMRUQ7Ci0JfQotCi0jaWZkZWYJREVCVUcKLQlvaGNpX2R1bXBfcm9vdGh1YiAoJmdvaGNpLCAxKTsKLSNlbHNlCi0Jd2FpdF9tcygxKTsKLSNlbmRpZgotCi0JbGVuID0gbWluX3QoaW50LCBsZW4sIGxlbmkpOwotCWlmIChkYXRhICE9IGRhdGFfYnVmKQotCSAgICBtZW1jcHkgKGRhdGEsIGRhdGFfYnVmLCBsZW4pOwotCWRldi0+YWN0X2xlbiA9IGxlbjsKLQlkZXYtPnN0YXR1cyA9IHN0YXQ7Ci0KLSNpZmRlZiBERUJVRwotCWlmICh0cmFuc2Zlcl9sZW4pCi0JCXVyYl9wcml2LmFjdHVhbF9sZW5ndGggPSB0cmFuc2Zlcl9sZW47Ci0JcGt0X3ByaW50KGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIGNtZCwgIlJFVChyaCkiLCAwLyp1c2JfcGlwZWluKHBpcGUpKi8pOwotI2Vsc2UKLQl3YWl0X21zKDEpOwotI2VuZGlmCi0KLQlyZXR1cm4gc3RhdDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogY29tbW9uIGNvZGUgZm9yIGhhbmRsaW5nIHN1Ym1pdCBtZXNzYWdlcyAtIHVzZWQgZm9yIGFsbCBidXQgcm9vdCBodWIgKi8KLS8qIGFjY2Vzc2VzLiAqLwotaW50IHN1Ym1pdF9jb21tb25fbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAotCQlpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqc2V0dXAsIGludCBpbnRlcnZhbCkKLXsKLQlpbnQgc3RhdCA9IDA7Ci0JaW50IG1heHNpemUgPSB1c2JfbWF4cGFja2V0KGRldiwgcGlwZSk7Ci0JaW50IHRpbWVvdXQ7Ci0KLQkvKiBkZXZpY2UgcHVsbGVkPyBTaG9ydGN1dCB0aGUgYWN0aW9uLiAqLwotCWlmIChkZXZnb25lID09IGRldikgewotCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9DUkNfRVJSOwotCQlyZXR1cm4gMDsKLQl9Ci0KLSNpZmRlZiBERUJVRwotCXVyYl9wcml2LmFjdHVhbF9sZW5ndGggPSAwOwotCXBrdF9wcmludChkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBzZXR1cCwgIlNVQiIsIHVzYl9waXBlaW4ocGlwZSkpOwotI2Vsc2UKLQl3YWl0X21zKDEpOwotI2VuZGlmCi0JaWYgKCFtYXhzaXplKSB7Ci0JCWVycigic3VibWl0X2NvbW1vbl9tZXNzYWdlOiBwaXBlc2l6ZSBmb3IgcGlwZSAlbHggaXMgemVybyIsCi0JCQlwaXBlKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChzb2hjaV9zdWJtaXRfam9iKGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIHNldHVwLCBpbnRlcnZhbCkgPCAwKSB7Ci0JCWVycigic29oY2lfc3VibWl0X2pvYiBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXdhaXRfbXMoMTApOwotCS8qIG9oY2lfZHVtcF9zdGF0dXMoJmdvaGNpKTsgKi8KLQotCS8qIGFsbG93IG1vcmUgdGltZSBmb3IgYSBCVUxLIGRldmljZSB0byByZWFjdCAtIHNvbWUgYXJlIHNsb3cgKi8KLSNkZWZpbmUgQlVMS19UTwkgNTAwMAkvKiB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqLwotCWlmICh1c2JfcGlwZXR5cGUgKHBpcGUpID09IFBJUEVfQlVMSykKLQkJdGltZW91dCA9IEJVTEtfVE87Ci0JZWxzZQotCQl0aW1lb3V0ID0gMTAwOwotCi0JLyogd2FpdCBmb3IgaXQgdG8gY29tcGxldGUgKi8KLQlmb3IgKDs7KSB7Ci0JCS8qIGNoZWNrIHdoZXRoZXIgdGhlIGNvbnRyb2xsZXIgaXMgZG9uZSAqLwotCQlzdGF0ID0gaGNfaW50ZXJydXB0KCk7Ci0JCWlmIChzdGF0IDwgMCkgewotCQkJc3RhdCA9IFVTQl9TVF9DUkNfRVJSOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHN0YXQgPj0gMCAmJiBzdGF0ICE9IDB4ZmYpIHsKLQkJCS8qIDB4ZmYgaXMgcmV0dXJuZWQgZm9yIGFuIFNGLWludGVycnVwdCAqLwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKC0tdGltZW91dCkgewotCQkJd2FpdF9tcygxKTsKLQkJfSBlbHNlIHsKLQkJCWVycigiQ1RMOlRJTUVPVVQgIik7Ci0JCQlzdGF0ID0gVVNCX1NUX0NSQ19FUlI7Ci0JCQlicmVhazsKLQkJfQotCX0KLQkvKiB3ZSBnb3QgYW4gUm9vdCBIdWIgU3RhdHVzIENoYW5nZSBpbnRlcnJ1cHQgKi8KLQlpZiAoZ290X3Joc2MpIHsKLSNpZmRlZiBERUJVRwotCQlvaGNpX2R1bXBfcm9vdGh1YiAoJmdvaGNpLCAxKTsKLSNlbmRpZgotCQlnb3RfcmhzYyA9IDA7Ci0JCS8qIGFidXNlIHRpbWVvdXQgKi8KLQkJdGltZW91dCA9IHJoX2NoZWNrX3BvcnRfc3RhdHVzKCZnb2hjaSk7Ci0JCWlmICh0aW1lb3V0ID49IDApIHsKLSNpZiAwIC8qIHRoaXMgZG9lcyBub3RoaW5nIHVzZWZ1bCwgYnV0IGxlYXZlIGl0IGhlcmUgaW4gY2FzZSB0aGF0IGNoYW5nZXMgKi8KLQkJCS8qIHRoZSBjYWxsZWQgcm91dGluZSBhZGRzIDEgdG8gdGhlIHBhc3NlZCB2YWx1ZSAqLwotCQkJdXNiX2h1Yl9wb3J0X2Nvbm5lY3RfY2hhbmdlKGdvaGNpLnJoLmRldiwgdGltZW91dCAtIDEpOwotI2VuZGlmCi0JCQkvKgotCQkJICogWFhYCi0JCQkgKiBUaGlzIGlzIHBvdGVudGlhbGx5IGRhbmdlcm91cyBiZWNhdXNlIGl0IGFzc3VtZXMKLQkJCSAqIHRoYXQgb25seSBvbmUgZGV2aWNlIGlzIGV2ZXIgcGx1Z2dlZCBpbiEKLQkJCSAqLwotCQkJZGV2Z29uZSA9IGRldjsKLQkJfQotCX0KLQotCWRldi0+c3RhdHVzID0gc3RhdDsKLQlkZXYtPmFjdF9sZW4gPSB0cmFuc2Zlcl9sZW47Ci0KLSNpZmRlZiBERUJVRwotCXBrdF9wcmludChkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBzZXR1cCwgIlJFVChjdGxyKSIsIHVzYl9waXBlaW4ocGlwZSkpOwotI2Vsc2UKLQl3YWl0X21zKDEpOwotI2VuZGlmCi0KLQkvKiBmcmVlIFREcyBpbiB1cmJfcHJpdiAqLwotCXVyYl9mcmVlX3ByaXYgKCZ1cmJfcHJpdik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIHN1Ym1pdCByb3V0aW5lcyBjYWxsZWQgZnJvbSB1c2IuYyAqLwotaW50IHN1Ym1pdF9idWxrX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKLQkJaW50IHRyYW5zZmVyX2xlbikKLXsKLQlpbmZvKCJzdWJtaXRfYnVsa19tc2ciKTsKLQlyZXR1cm4gc3VibWl0X2NvbW1vbl9tc2coZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgTlVMTCwgMCk7Ci19Ci0KLWludCBzdWJtaXRfY29udHJvbF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCi0JCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICpzZXR1cCkKLXsKLQlpbnQgbWF4c2l6ZSA9IHVzYl9tYXhwYWNrZXQoZGV2LCBwaXBlKTsKLQotCWluZm8oInN1Ym1pdF9jb250cm9sX21zZyIpOwotI2lmZGVmIERFQlVHCi0JdXJiX3ByaXYuYWN0dWFsX2xlbmd0aCA9IDA7Ci0JcGt0X3ByaW50KGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIHNldHVwLCAiU1VCIiwgdXNiX3BpcGVpbihwaXBlKSk7Ci0jZWxzZQotCXdhaXRfbXMoMSk7Ci0jZW5kaWYKLQlpZiAoIW1heHNpemUpIHsKLQkJZXJyKCJzdWJtaXRfY29udHJvbF9tZXNzYWdlOiBwaXBlc2l6ZSBmb3IgcGlwZSAlbHggaXMgemVybyIsCi0JCQlwaXBlKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoKChwaXBlID4+IDgpICYgMHg3ZikgPT0gZ29oY2kucmguZGV2bnVtKSB7Ci0JCWdvaGNpLnJoLmRldiA9IGRldjsKLQkJLyogcm9vdCBodWIgLSByZWRpcmVjdCAqLwotCQlyZXR1cm4gb2hjaV9zdWJtaXRfcmhfbXNnKGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sCi0JCQlzZXR1cCk7Ci0JfQotCi0JcmV0dXJuIHN1Ym1pdF9jb21tb25fbXNnKGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIHNldHVwLCAwKTsKLX0KLQotaW50IHN1Ym1pdF9pbnRfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAotCQlpbnQgdHJhbnNmZXJfbGVuLCBpbnQgaW50ZXJ2YWwpCi17Ci0JaW5mbygic3VibWl0X2ludF9tc2ciKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEhDIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogcmVzZXQgdGhlIEhDIGFuZCBCVVMgKi8KLQotc3RhdGljIGludCBoY19yZXNldCAob2hjaV90ICpvaGNpKQotewotCWludCB0aW1lb3V0ID0gMzA7Ci0JaW50IHNtbV90aW1lb3V0ID0gNTA7IC8qIDAsNSBzZWMgKi8KLQotCWRiZygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQlpZiAocmVhZGwgKCZvaGNpLT5yZWdzLT5jb250cm9sKSAmIE9IQ0lfQ1RSTF9JUikgeyAvKiBTTU0gb3ducyB0aGUgSEMgKi8KLQkJd3JpdGVsIChPSENJX09DUiwgJm9oY2ktPnJlZ3MtPmNtZHN0YXR1cyk7IC8qIHJlcXVlc3Qgb3duZXJzaGlwICovCi0JCWluZm8oIlVTQiBIQyBUYWtlT3ZlciBmcm9tIFNNTSIpOwotCQl3aGlsZSAocmVhZGwgKCZvaGNpLT5yZWdzLT5jb250cm9sKSAmIE9IQ0lfQ1RSTF9JUikgewotCQkJd2FpdF9tcyAoMTApOwotCQkJaWYgKC0tc21tX3RpbWVvdXQgPT0gMCkgewotCQkJCWVycigiVVNCIEhDIFRha2VPdmVyIGZhaWxlZCEiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBEaXNhYmxlIEhDIGludGVycnVwdHMgKi8KLQl3cml0ZWwgKE9IQ0lfSU5UUl9NSUUsICZvaGNpLT5yZWdzLT5pbnRyZGlzYWJsZSk7Ci0KLQlkYmcoIlVTQiBIQyByZXNldF9oYyB1c2ItJXM6IGN0cmwgPSAweCVYIDtcbiIsCi0JCW9oY2ktPnNsb3RfbmFtZSwKLQkJcmVhZGwoJm9oY2ktPnJlZ3MtPmNvbnRyb2wpKTsKLQotCS8qIFJlc2V0IFVTQiAobmVlZGVkIGJ5IHNvbWUgY29udHJvbGxlcnMpICovCi0Jd3JpdGVsICgwLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7Ci0KLQkvKiBIQyBSZXNldCByZXF1aXJlcyBtYXggMTAgdXMgZGVsYXkgKi8KLQl3cml0ZWwgKE9IQ0lfSENSLCAgJm9oY2ktPnJlZ3MtPmNtZHN0YXR1cyk7Ci0Jd2hpbGUgKChyZWFkbCAoJm9oY2ktPnJlZ3MtPmNtZHN0YXR1cykgJiBPSENJX0hDUikgIT0gMCkgewotCQlpZiAoLS10aW1lb3V0ID09IDApIHsKLQkJCWVycigiVVNCIEhDIHJlc2V0IHRpbWVkIG91dCEiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQl1ZGVsYXkgKDEpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogU3RhcnQgYW4gT0hDSSBjb250cm9sbGVyLCBzZXQgdGhlIEJVUyBvcGVyYXRpb25hbAotICogZW5hYmxlIGludGVycnVwdHMKLSAqIGNvbm5lY3QgdGhlIHZpcnR1YWwgcm9vdCBodWIgKi8KLQotc3RhdGljIGludCBoY19zdGFydCAob2hjaV90ICogb2hjaSkKLXsKLQlfX3UzMiBtYXNrOwotCXVuc2lnbmVkIGludCBmbWludGVydmFsOwotCi0Jb2hjaS0+ZGlzYWJsZWQgPSAxOwotCi0JLyogVGVsbCB0aGUgY29udHJvbGxlciB3aGVyZSB0aGUgY29udHJvbCBhbmQgYnVsayBsaXN0cyBhcmUKLQkgKiBUaGUgbGlzdHMgYXJlIGVtcHR5IG5vdy4gKi8KLQotCXdyaXRlbCAoMCwgJm9oY2ktPnJlZ3MtPmVkX2NvbnRyb2xoZWFkKTsKLQl3cml0ZWwgKDAsICZvaGNpLT5yZWdzLT5lZF9idWxraGVhZCk7Ci0KLQl3cml0ZWwgKChfX3UzMilvaGNpLT5oY2NhLCAmb2hjaS0+cmVncy0+aGNjYSk7IC8qIGEgcmVzZXQgY2xlYXJzIHRoaXMgKi8KLQotCWZtaW50ZXJ2YWwgPSAweDJlZGY7Ci0Jd3JpdGVsICgoZm1pbnRlcnZhbCAqIDkpIC8gMTAsICZvaGNpLT5yZWdzLT5wZXJpb2RpY3N0YXJ0KTsKLQlmbWludGVydmFsIHw9ICgoKChmbWludGVydmFsIC0gMjEwKSAqIDYpIC8gNykgPDwgMTYpOwotCXdyaXRlbCAoZm1pbnRlcnZhbCwgJm9oY2ktPnJlZ3MtPmZtaW50ZXJ2YWwpOwotCXdyaXRlbCAoMHg2MjgsICZvaGNpLT5yZWdzLT5sc3RocmVzaCk7Ci0KLQkvKiBzdGFydCBjb250cm9sbGVyIG9wZXJhdGlvbnMgKi8KLQlvaGNpLT5oY19jb250cm9sID0gT0hDSV9DT05UUk9MX0lOSVQgfCBPSENJX1VTQl9PUEVSOwotCW9oY2ktPmRpc2FibGVkID0gMDsKLQl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKLQotCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KLQltYXNrID0gKE9IQ0lfSU5UUl9TTyB8IE9IQ0lfSU5UUl9XREggfCBPSENJX0lOVFJfU0YgfCBPSENJX0lOVFJfUkQgfAotCQkJT0hDSV9JTlRSX1VFIHwgT0hDSV9JTlRSX0ZOTyB8IE9IQ0lfSU5UUl9SSFNDIHwKLQkJCU9IQ0lfSU5UUl9PQyB8IE9IQ0lfSU5UUl9NSUUpOwotCXdyaXRlbCAobWFzaywgJm9oY2ktPnJlZ3MtPmludHJkaXNhYmxlKTsKLQkvKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLwotCW1hc2sgJj0gfk9IQ0lfSU5UUl9NSUU7Ci0Jd3JpdGVsIChtYXNrLCAmb2hjaS0+cmVncy0+aW50cnN0YXR1cyk7Ci0JLyogQ2hvb3NlIHRoZSBpbnRlcnJ1cHRzIHdlIGNhcmUgYWJvdXQgbm93ICAtIGJ1dCB3L28gTUlFICovCi0JbWFzayA9IE9IQ0lfSU5UUl9SSFNDIHwgT0hDSV9JTlRSX1VFIHwgT0hDSV9JTlRSX1dESCB8IE9IQ0lfSU5UUl9TTzsKLQl3cml0ZWwgKG1hc2ssICZvaGNpLT5yZWdzLT5pbnRyZW5hYmxlKTsKLQotI2lmZGVmCU9IQ0lfVVNFX05QUwotCS8qIHJlcXVpcmVkIGZvciBBTUQtNzU2IGFuZCBzb21lIE1hYyBwbGF0Zm9ybXMgKi8KLQl3cml0ZWwgKChyb290aHViX2EgKG9oY2kpIHwgUkhfQV9OUFMpICYgflJIX0FfUFNNLAotCQkmb2hjaS0+cmVncy0+cm9vdGh1Yi5hKTsKLQl3cml0ZWwgKFJIX0hTX0xQU0MsICZvaGNpLT5yZWdzLT5yb290aHViLnN0YXR1cyk7Ci0jZW5kaWYJLyogT0hDSV9VU0VfTlBTICovCi0KLSNkZWZpbmUgbWRlbGF5KG4pICh7dW5zaWduZWQgbG9uZyBtc2VjPShuKTsgd2hpbGUgKG1zZWMtLSkgdWRlbGF5KDEwMDApO30pCi0JLyogUE9UUEdUIGRlbGF5IGlzIGJpdHMgMjQtMzEsIGluIDIgbXMgdW5pdHMuICovCi0JbWRlbGF5ICgocm9vdGh1Yl9hIChvaGNpKSA+PiAyMykgJiAweDFmZSk7Ci0KLQkvKiBjb25uZWN0IHRoZSB2aXJ0dWFsIHJvb3QgaHViICovCi0Jb2hjaS0+cmguZGV2bnVtID0gMDsKLQotCXJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBhbiBpbnRlcnJ1cHQgaGFwcGVucyAqLwotCi1zdGF0aWMgaW50Ci1oY19pbnRlcnJ1cHQgKHZvaWQpCi17Ci0Jb2hjaV90ICpvaGNpID0gJmdvaGNpOwotCXN0cnVjdCBvaGNpX3JlZ3MgKnJlZ3MgPSBvaGNpLT5yZWdzOwotCWludCBpbnRzOwotCWludCBzdGF0ID0gLTE7Ci0KLQlpZiAoKG9oY2ktPmhjY2EtPmRvbmVfaGVhZCAhPSAwKSAmJiAhKG0zMl9zd2FwIChvaGNpLT5oY2NhLT5kb25lX2hlYWQpICYgMHgwMSkpIHsKLQkJaW50cyA9CU9IQ0lfSU5UUl9XREg7Ci0JfSBlbHNlIHsKLQkJaW50cyA9IHJlYWRsICgmcmVncy0+aW50cnN0YXR1cyk7Ci0JfQotCi0JLyogZGJnKCJJbnRlcnJ1cHQ6ICV4IGZyYW1lOiAleCIsIGludHMsIGxlMTZfdG9fY3B1IChvaGNpLT5oY2NhLT5mcmFtZV9ubykpOyAqLwotCi0JaWYgKGludHMgJiBPSENJX0lOVFJfUkhTQykgewotCQlnb3RfcmhzYyA9IDE7Ci0JfQotCi0JaWYgKGludHMgJiBPSENJX0lOVFJfVUUpIHsKLQkJb2hjaS0+ZGlzYWJsZWQrKzsKLQkJZXJyICgiT0hDSSBVbnJlY292ZXJhYmxlIEVycm9yLCBjb250cm9sbGVyIHVzYi0lcyBkaXNhYmxlZCIsCi0JCQlvaGNpLT5zbG90X25hbWUpOwotCQkvKiBlLmcuIGR1ZSB0byBQQ0kgTWFzdGVyL1RhcmdldCBBYm9ydCAqLwotCi0jaWZkZWYJREVCVUcKLQkJb2hjaV9kdW1wIChvaGNpLCAxKTsKLSNlbHNlCi0Jd2FpdF9tcygxKTsKLSNlbmRpZgotCQkvKiBGSVhNRTogYmUgb3B0aW1pc3RpYywgaG9wZSB0aGF0IGJ1ZyB3b24ndCByZXBlYXQgb2Z0ZW4uICovCi0JCS8qIE1ha2Ugc29tZSBub24taW50ZXJydXB0IGNvbnRleHQgcmVzdGFydCB0aGUgY29udHJvbGxlci4gKi8KLQkJLyogQ291bnQgYW5kIGxpbWl0IHRoZSByZXRyaWVzIHRob3VnaDsgZWl0aGVyIGhhcmR3YXJlIG9yICovCi0JCS8qIHNvZnR3YXJlIGVycm9ycyBjYW4gZ28gZm9yZXZlci4uLiAqLwotCQloY19yZXNldCAob2hjaSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoaW50cyAmIE9IQ0lfSU5UUl9XREgpIHsKLQkJd2FpdF9tcygxKTsKLQkJd3JpdGVsIChPSENJX0lOVFJfV0RILCAmcmVncy0+aW50cmRpc2FibGUpOwotCQlzdGF0ID0gZGxfZG9uZV9saXN0ICgmZ29oY2ksIGRsX3JldmVyc2VfZG9uZV9saXN0ICgmZ29oY2kpKTsKLQkJd3JpdGVsIChPSENJX0lOVFJfV0RILCAmcmVncy0+aW50cmVuYWJsZSk7Ci0JfQotCi0JaWYgKGludHMgJiBPSENJX0lOVFJfU08pIHsKLQkJZGJnKCJVU0IgU2NoZWR1bGUgb3ZlcnJ1blxuIik7Ci0JCXdyaXRlbCAoT0hDSV9JTlRSX1NPLCAmcmVncy0+aW50cmVuYWJsZSk7Ci0JCXN0YXQgPSAtMTsKLQl9Ci0KLQkvKiBGSVhNRTogIHRoaXMgYXNzdW1lcyBTT0YgKDEvbXMpIGludGVycnVwdHMgZG9uJ3QgZ2V0IGxvc3QuLi4gKi8KLQlpZiAoaW50cyAmIE9IQ0lfSU5UUl9TRikgewotCQl1bnNpZ25lZCBpbnQgZnJhbWUgPSBtMTZfc3dhcCAob2hjaS0+aGNjYS0+ZnJhbWVfbm8pICYgMTsKLQkJd2FpdF9tcygxKTsKLQkJd3JpdGVsIChPSENJX0lOVFJfU0YsICZyZWdzLT5pbnRyZGlzYWJsZSk7Ci0JCWlmIChvaGNpLT5lZF9ybV9saXN0W2ZyYW1lXSAhPSBOVUxMKQotCQkJd3JpdGVsIChPSENJX0lOVFJfU0YsICZyZWdzLT5pbnRyZW5hYmxlKTsKLQkJc3RhdCA9IDB4ZmY7Ci0JfQotCi0Jd3JpdGVsIChpbnRzLCAmcmVncy0+aW50cnN0YXR1cyk7Ci0JcmV0dXJuIHN0YXQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIERlLWFsbG9jYXRlIGFsbCByZXNvdXJjZXMuLiAqLwotCi1zdGF0aWMgdm9pZCBoY19yZWxlYXNlX29oY2kgKG9oY2lfdCAqb2hjaSkKLXsKLQlkYmcgKCJVU0IgSEMgcmVsZWFzZSBvaGNpIHVzYi0lcyIsIG9oY2ktPnNsb3RfbmFtZSk7Ci0KLQlpZiAoIW9oY2ktPmRpc2FibGVkKQotCQloY19yZXNldCAob2hjaSk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0gKiBsb3cgbGV2ZWwgaW5pdGFsaXNhdGlvbiByb3V0aW5lLCBjYWxsZWQgZnJvbSB1c2IuYwotICovCi1zdGF0aWMgY2hhciBvaGNpX2luaXRlZCA9IDA7Ci0KLWludCB1c2JfbG93bGV2ZWxfaW5pdCh2b2lkKQotewotCS8qCi0JICogRW5hYmxlIFVTQiBob3N0IGNsb2NrLgotCSAqLwotCSpBVDkxQ19QTUNfU0NFUiA9IEFUOTFDX1BNQ19VSFA7CS8qIDQ4TUh6IGNsb2NrIGVuYWJsZWQgZm9yIFVIUCAqLwotCSpBVDkxQ19QTUNfUENFUiA9IDEgPDwgQVQ5MUNfSURfVUhQOwkvKiBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZSBSZWdpc3RlciAqLwotCi0JbWVtc2V0ICgmZ29oY2ksIDAsIHNpemVvZiAob2hjaV90KSk7Ci0JbWVtc2V0ICgmdXJiX3ByaXYsIDAsIHNpemVvZiAodXJiX3ByaXZfdCkpOwotCi0JLyogYWxpZ24gdGhlIHN0b3JhZ2UgKi8KLQlpZiAoKF9fdTMyKSZnaGNjYVswXSAmIDB4ZmYpIHsKLQkJZXJyKCJIQ0NBIG5vdCBhbGlnbmVkISEiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlwaGNjYSA9ICZnaGNjYVswXTsKLQlpbmZvKCJhbGlnbmVkIGdoY2NhICVwIiwgcGhjY2EpOwotCW1lbXNldCgmb2hjaV9kZXYsIDAsIHNpemVvZihzdHJ1Y3Qgb2hjaV9kZXZpY2UpKTsKLQlpZiAoKF9fdTMyKSZvaGNpX2Rldi5lZFswXSAmIDB4NykgewotCQllcnIoIkVEcyBub3QgYWxpZ25lZCEhIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbWVtc2V0KGd0ZCwgMCwgc2l6ZW9mKHRkX3QpICogKE5VTV9URCArIDEpKTsKLQlpZiAoKF9fdTMyKWd0ZCAmIDB4NykgewotCQllcnIoIlREcyBub3QgYWxpZ25lZCEhIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcHRkID0gZ3RkOwotCWdvaGNpLmhjY2EgPSBwaGNjYTsKLQltZW1zZXQgKHBoY2NhLCAwLCBzaXplb2YgKHN0cnVjdCBvaGNpX2hjY2EpKTsKLQotCWdvaGNpLmRpc2FibGVkID0gMTsKLQlnb2hjaS5zbGVlcGluZyA9IDA7Ci0JZ29oY2kuaXJxID0gLTE7Ci0JZ29oY2kucmVncyA9IChzdHJ1Y3Qgb2hjaV9yZWdzICopQVQ5MV9VU0JfSE9TVF9CQVNFOwotCi0JZ29oY2kuZmxhZ3MgPSAwOwotCWdvaGNpLnNsb3RfbmFtZSA9ICJhdDkxcm05MjAwIjsKLQotCWlmIChoY19yZXNldCAoJmdvaGNpKSA8IDApIHsKLQkJaGNfcmVsZWFzZV9vaGNpICgmZ29oY2kpOwotCQkvKiBJbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KLQkJKkFUOTFDX1BNQ19QQ0VSID0gQVQ5MUNfSURfVUhQOwotCQkqQVQ5MUNfUE1DX1NDRFIgPSAxIDw8IEFUOTFDX1BNQ19VSFA7CS8qIDQ4TUh6IGNsb2NrIGRpc2FibGVkIGZvciBVSFAgKi8KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIEZJWE1FIHRoaXMgaXMgYSBzZWNvbmQgSEMgcmVzZXQ7IHdoeT8/ICovCi0vKgl3cml0ZWwgKGdvaGNpLmhjX2NvbnRyb2wgPSBPSENJX1VTQl9SRVNFVCwgJmdvaGNpLnJlZ3MtPmNvbnRyb2wpOwotCXdhaXRfbXMgKDEwKTsqLwotCi0JaWYgKGhjX3N0YXJ0ICgmZ29oY2kpIDwgMCkgewotCQllcnIgKCJjYW4ndCBzdGFydCB1c2ItJXMiLCBnb2hjaS5zbG90X25hbWUpOwotCQloY19yZWxlYXNlX29oY2kgKCZnb2hjaSk7Ci0JCS8qIEluaXRpYWxpemF0aW9uIGZhaWxlZCAqLwotCQkqQVQ5MUNfUE1DX1BDRVIgPSBBVDkxQ19JRF9VSFA7Ci0JCSpBVDkxQ19QTUNfU0NEUiA9IDEgPDwgQVQ5MUNfUE1DX1VIUDsJLyogNDhNSHogY2xvY2sgZGlzYWJsZWQgZm9yIFVIUCAqLwotCQlyZXR1cm4gLTE7Ci0JfQotCi0jaWZkZWYJREVCVUcKLQlvaGNpX2R1bXAgKCZnb2hjaSwgMSk7Ci0jZWxzZQotCXdhaXRfbXMoMSk7Ci0jZW5kaWYKLQlvaGNpX2luaXRlZCA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCB1c2JfbG93bGV2ZWxfc3RvcCh2b2lkKQotewotCS8qIHRoaXMgZ2V0cyBjYWxsZWQgcmVhbGx5IGVhcmx5IC0gYmVmb3JlIHRoZSBjb250cm9sbGVyIGhhcyAqLwotCS8qIGV2ZW4gYmVlbiBpbml0aWFsaXplZCEgKi8KLQlpZiAoIW9oY2lfaW5pdGVkKQotCQlyZXR1cm4gMDsKLQkvKiBUT0RPIHJlbGVhc2UgYW55IGludGVycnVwdHMsIGV0Yy4gKi8KLQkvKiBjYWxsIGhjX3JlbGVhc2Vfb2hjaSgpIGhlcmUgPyAqLwotCWhjX3Jlc2V0ICgmZ29oY2kpOwotCS8qIG1heSBub3Qgd2FudCB0byBkbyB0aGlzICovCi0JKkFUOTFDX1BNQ19QQ0VSID0gMSA8PCBBVDkxQ19JRF9VSFA7Ci0JKkFUOTFDX1BNQ19TQ0RSID0gMSA8PCBBVDkxQ19QTUNfVUhQOwkvKiA0OE1IeiBjbG9jayBkaXNhYmxlZCBmb3IgVUhQICovCi0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfVVNCX09IQ0kgKi8KZGlmZiAtLWdpdCBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvdXNiX29oY2kuaCBiL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvdXNiX29oY2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiNGU5My4uMDAwMDAwMAotLS0gYS9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL3VzYl9vaGNpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoKLSAqIFVSQiBPSENJIEhDRCAoSG9zdCBDb250cm9sbGVyIERyaXZlcikgZm9yIFVTQi4KLSAqCi0gKiAoQykgQ29weXJpZ2h0IDE5OTkgUm9tYW4gV2Vpc3NnYWVyYmVyIDx3ZWlzc2dAdmllbm5hLmF0PgotICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDEgRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gKgotICogdXNiLW9oY2kuaAotICovCi0KLQotc3RhdGljIGludCBjY190b19lcnJvclsxNl0gPSB7Ci0KLS8qIG1hcHBpbmcgb2YgdGhlIE9IQ0kgQ0Mgc3RhdHVzIHRvIGVycm9yIGNvZGVzICovCi0JLyogTm8gIEVycm9yICAqLwkgICAgICAgMCwKLQkvKiBDUkMgRXJyb3IgICovCSAgICAgICBVU0JfU1RfQ1JDX0VSUiwKLQkvKiBCaXQgU3R1ZmYgICovCSAgICAgICBVU0JfU1RfQklUX0VSUiwKLQkvKiBEYXRhIFRvZ2cgICovCSAgICAgICBVU0JfU1RfQ1JDX0VSUiwKLQkvKiBTdGFsbCAgICAgICovCSAgICAgICBVU0JfU1RfU1RBTExFRCwKLQkvKiBEZXZOb3RSZXNwICovCSAgICAgICAtMSwKLQkvKiBQSURDaGVjayAgICovCSAgICAgICBVU0JfU1RfQklUX0VSUiwKLQkvKiBVbkV4cFBJRCAgICovCSAgICAgICBVU0JfU1RfQklUX0VSUiwKLQkvKiBEYXRhT3ZlciAgICovCSAgICAgICBVU0JfU1RfQlVGX0VSUiwKLQkvKiBEYXRhVW5kZXIgICovCSAgICAgICBVU0JfU1RfQlVGX0VSUiwKLQkvKiByZXNlcnZkICAgICovCSAgICAgICAtMSwKLQkvKiByZXNlcnZkICAgICovCSAgICAgICAtMSwKLQkvKiBCdWZmZXJPdmVyICovCSAgICAgICBVU0JfU1RfQlVGX0VSUiwKLQkvKiBCdWZmVW5kZXIgICovCSAgICAgICBVU0JfU1RfQlVGX0VSUiwKLQkvKiBOb3QgQWNjZXNzICovCSAgICAgICAtMSwKLQkvKiBOb3QgQWNjZXNzICovCSAgICAgICAtMQotfTsKLQotLyogRUQgU3RhdGVzICovCi0KLSNkZWZpbmUgRURfTkVXCQkweDAwCi0jZGVmaW5lIEVEX1VOTElOSwkweDAxCi0jZGVmaW5lIEVEX09QRVIJCTB4MDIKLSNkZWZpbmUgRURfREVMCQkweDA0Ci0jZGVmaW5lIEVEX1VSQl9ERUwJMHgwOAotCi0vKiB1c2Jfb2hjaV9lZCAqLwotc3RydWN0IGVkIHsKLQlfX3UzMiBod0lORk87Ci0JX191MzIgaHdUYWlsUDsKLQlfX3UzMiBod0hlYWRQOwotCV9fdTMyIGh3TmV4dEVEOwotCi0Jc3RydWN0IGVkICplZF9wcmV2OwotCV9fdTggaW50X3BlcmlvZDsKLQlfX3U4IGludF9icmFuY2g7Ci0JX191OCBpbnRfbG9hZDsKLQlfX3U4IGludF9pbnRlcnZhbDsKLQlfX3U4IHN0YXRlOwotCV9fdTggdHlwZTsKLQlfX3UxNiBsYXN0X2lzbzsKLQlzdHJ1Y3QgZWQgKmVkX3JtX2xpc3Q7Ci0KLQlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKLQlfX3UzMiB1bnVzZWRbM107Ci19IF9fYXR0cmlidXRlKChhbGlnbmVkKDE2KSkpOwotdHlwZWRlZiBzdHJ1Y3QgZWQgZWRfdDsKLQotCi0vKiBURCBpbmZvIGZpZWxkICovCi0jZGVmaW5lIFREX0NDCSAgICAweGYwMDAwMDAwCi0jZGVmaW5lIFREX0NDX0dFVCh0ZF9wKSAoKHRkX3AgPj4yOCkgJiAweDBmKQotI2RlZmluZSBURF9DQ19TRVQodGRfcCwgY2MpICh0ZF9wKSA9ICgodGRfcCkgJiAweDBmZmZmZmZmKSB8ICgoKGNjKSAmIDB4MGYpIDw8IDI4KQotI2RlZmluZSBURF9FQwkgICAgMHgwQzAwMDAwMAotI2RlZmluZSBURF9UCSAgICAweDAzMDAwMDAwCi0jZGVmaW5lIFREX1RfREFUQTAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgVERfVF9EQVRBMSAgMHgwMzAwMDAwMAotI2RlZmluZSBURF9UX1RPR0dMRSAweDAwMDAwMDAwCi0jZGVmaW5lIFREX1IJICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgVERfREkJICAgIDB4MDBFMDAwMDAKLSNkZWZpbmUgVERfRElfU0VUKFgpICgoKFgpICYgMHgwNyk8PCAyMSkKLSNkZWZpbmUgVERfRFAJICAgIDB4MDAxODAwMDAKLSNkZWZpbmUgVERfRFBfU0VUVVAgMHgwMDAwMDAwMAotI2RlZmluZSBURF9EUF9JTiAgICAweDAwMTAwMDAwCi0jZGVmaW5lIFREX0RQX09VVCAgIDB4MDAwODAwMDAKLQotI2RlZmluZSBURF9JU08JICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgVERfREVMCSAgICAweDAwMDIwMDAwCi0KLS8qIENDIENvZGVzICovCi0jZGVmaW5lIFREX0NDX05PRVJST1IJICAgMHgwMAotI2RlZmluZSBURF9DQ19DUkMJICAgMHgwMQotI2RlZmluZSBURF9DQ19CSVRTVFVGRklORyAgMHgwMgotI2RlZmluZSBURF9DQ19EQVRBVE9HR0xFTSAgMHgwMwotI2RlZmluZSBURF9DQ19TVEFMTAkgICAweDA0Ci0jZGVmaW5lIFREX0RFVk5PVFJFU1AJICAgMHgwNQotI2RlZmluZSBURF9QSURDSEVDS0ZBSUwJICAgMHgwNgotI2RlZmluZSBURF9VTkVYUEVDVEVEUElEICAgMHgwNwotI2RlZmluZSBURF9EQVRBT1ZFUlJVTgkgICAweDA4Ci0jZGVmaW5lIFREX0RBVEFVTkRFUlJVTgkgICAweDA5Ci0jZGVmaW5lIFREX0JVRkZFUk9WRVJSVU4gICAweDBDCi0jZGVmaW5lIFREX0JVRkZFUlVOREVSUlVOICAweDBECi0jZGVmaW5lIFREX05PVEFDQ0VTU0VECSAgIDB4MEYKLQotCi0jZGVmaW5lIE1BWFBTVyAxCi0KLXN0cnVjdCB0ZCB7Ci0JX191MzIgaHdJTkZPOwotCV9fdTMyIGh3Q0JQOwkJLyogQ3VycmVudCBCdWZmZXIgUG9pbnRlciAqLwotCV9fdTMyIGh3TmV4dFREOwkJLyogTmV4dCBURCBQb2ludGVyICovCi0JX191MzIgaHdCRTsJCS8qIE1lbW9yeSBCdWZmZXIgRW5kIFBvaW50ZXIgKi8KLQotCV9fdTE2IGh3UFNXW01BWFBTV107Ci0JX191OCB1bnVzZWQ7Ci0JX191OCBpbmRleDsKLQlzdHJ1Y3QgZWQgKmVkOwotCXN0cnVjdCB0ZCAqbmV4dF9kbF90ZDsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKLQlpbnQgdHJhbnNmZXJfbGVuOwotCV9fdTMyIGRhdGE7Ci0KLQlfX3UzMiB1bnVzZWQyWzJdOwotfSBfX2F0dHJpYnV0ZSgoYWxpZ25lZCgzMikpKTsKLXR5cGVkZWYgc3RydWN0IHRkIHRkX3Q7Ci0KLSNkZWZpbmUgT0hDSV9FRF9TS0lQCSgxIDw8IDE0KQotCi0vKgotICogVGhlIEhDQ0EgKEhvc3QgQ29udHJvbGxlciBDb21tdW5pY2F0aW9ucyBBcmVhKSBpcyBhIDI1NiBieXRlCi0gKiBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGUgT0hDSSBzcGVjLiB0aGF0IHRoZSBob3N0IGNvbnRyb2xsZXIgaXMKLSAqIHRvbGQgdGhlIGJhc2UgYWRkcmVzcyBvZi4gIEl0IG11c3QgYmUgMjU2LWJ5dGUgYWxpZ25lZC4KLSAqLwotCi0jZGVmaW5lIE5VTV9JTlRTIDMyCS8qIHBhcnQgb2YgdGhlIE9IQ0kgc3RhbmRhcmQgKi8KLXN0cnVjdCBvaGNpX2hjY2EgewotCV9fdTMyCWludF90YWJsZVtOVU1fSU5UU107CS8qIEludGVycnVwdCBFRCB0YWJsZSAqLwotCV9fdTE2CWZyYW1lX25vOwkJLyogY3VycmVudCBmcmFtZSBudW1iZXIgKi8KLQlfX3UxNglwYWQxOwkJCS8qIHNldCB0byAwIG9uIGVhY2ggZnJhbWVfbm8gY2hhbmdlICovCi0JX191MzIJZG9uZV9oZWFkOwkJLyogaW5mbyByZXR1cm5lZCBmb3IgYW4gaW50ZXJydXB0ICovCi0JdTgJCXJlc2VydmVkX2Zvcl9oY1sxMTZdOwotfSBfX2F0dHJpYnV0ZSgoYWxpZ25lZCgyNTYpKSk7Ci0KLQotLyoKLSAqIE1heGltdW0gbnVtYmVyIG9mIHJvb3QgaHViIHBvcnRzLgotICovCi0jZGVmaW5lIE1BWF9ST09UX1BPUlRTCTE1CS8qIG1heGltdW0gT0hDSSByb290IGh1YiBwb3J0cyAqLwotCi0vKgotICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBPSENJIGNvbnRyb2xsZXIncyBtZW1vcnkgbWFwcGVkIEkvTwotICogcmVnaW9uLiAgVGhpcyBpcyBNZW1vcnkgTWFwcGVkIEkvTy4JWW91IG11c3QgdXNlIHRoZSByZWFkbCgpIGFuZAotICogd3JpdGVsKCkgbWFjcm9zIGRlZmluZWQgaW4gYXNtL2lvLmggdG8gYWNjZXNzIHRoZXNlISEKLSAqLwotc3RydWN0IG9oY2lfcmVncyB7Ci0JLyogY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVycyAqLwotCV9fdTMyCXJldmlzaW9uOwotCV9fdTMyCWNvbnRyb2w7Ci0JX191MzIJY21kc3RhdHVzOwotCV9fdTMyCWludHJzdGF0dXM7Ci0JX191MzIJaW50cmVuYWJsZTsKLQlfX3UzMglpbnRyZGlzYWJsZTsKLQkvKiBtZW1vcnkgcG9pbnRlcnMgKi8KLQlfX3UzMgloY2NhOwotCV9fdTMyCWVkX3BlcmlvZGN1cnJlbnQ7Ci0JX191MzIJZWRfY29udHJvbGhlYWQ7Ci0JX191MzIJZWRfY29udHJvbGN1cnJlbnQ7Ci0JX191MzIJZWRfYnVsa2hlYWQ7Ci0JX191MzIJZWRfYnVsa2N1cnJlbnQ7Ci0JX191MzIJZG9uZWhlYWQ7Ci0JLyogZnJhbWUgY291bnRlcnMgKi8KLQlfX3UzMglmbWludGVydmFsOwotCV9fdTMyCWZtcmVtYWluaW5nOwotCV9fdTMyCWZtbnVtYmVyOwotCV9fdTMyCXBlcmlvZGljc3RhcnQ7Ci0JX191MzIJbHN0aHJlc2g7Ci0JLyogUm9vdCBodWIgcG9ydHMgKi8KLQlzdHJ1Y3QJb2hjaV9yb290aHViX3JlZ3MgewotCQlfX3UzMglhOwotCQlfX3UzMgliOwotCQlfX3UzMglzdGF0dXM7Ci0JCV9fdTMyCXBvcnRzdGF0dXNbTUFYX1JPT1RfUE9SVFNdOwotCX0gcm9vdGh1YjsKLX0gX19hdHRyaWJ1dGUoKGFsaWduZWQoMzIpKSk7Ci0KLQotLyogT0hDSSBDT05UUk9MIEFORCBTVEFUVVMgUkVHSVNURVIgTUFTS1MgKi8KLQotLyoKLSAqIEhjQ29udHJvbCAoY29udHJvbCkgcmVnaXN0ZXIgbWFza3MKLSAqLwotI2RlZmluZSBPSENJX0NUUkxfQ0JTUgkoMyA8PCAwKQkvKiBjb250cm9sL2J1bGsgc2VydmljZSByYXRpbyAqLwotI2RlZmluZSBPSENJX0NUUkxfUExFCSgxIDw8IDIpCS8qIHBlcmlvZGljIGxpc3QgZW5hYmxlICovCi0jZGVmaW5lIE9IQ0lfQ1RSTF9JRQkoMSA8PCAzKQkvKiBpc29jaHJvbm91cyBlbmFibGUgKi8KLSNkZWZpbmUgT0hDSV9DVFJMX0NMRQkoMSA8PCA0KQkvKiBjb250cm9sIGxpc3QgZW5hYmxlICovCi0jZGVmaW5lIE9IQ0lfQ1RSTF9CTEUJKDEgPDwgNSkJLyogYnVsayBsaXN0IGVuYWJsZSAqLwotI2RlZmluZSBPSENJX0NUUkxfSENGUwkoMyA8PCA2KQkvKiBob3N0IGNvbnRyb2xsZXIgZnVuY3Rpb25hbCBzdGF0ZSAqLwotI2RlZmluZSBPSENJX0NUUkxfSVIJKDEgPDwgOCkJLyogaW50ZXJydXB0IHJvdXRpbmcgKi8KLSNkZWZpbmUgT0hDSV9DVFJMX1JXQwkoMSA8PCA5KQkvKiByZW1vdGUgd2FrZXVwIGNvbm5lY3RlZCAqLwotI2RlZmluZSBPSENJX0NUUkxfUldFCSgxIDw8IDEwKQkvKiByZW1vdGUgd2FrZXVwIGVuYWJsZSAqLwotCi0vKiBwcmUtc2hpZnRlZCB2YWx1ZXMgZm9yIEhDRlMgKi8KLSMJZGVmaW5lIE9IQ0lfVVNCX1JFU0VUCSgwIDw8IDYpCi0jCWRlZmluZSBPSENJX1VTQl9SRVNVTUUJKDEgPDwgNikKLSMJZGVmaW5lIE9IQ0lfVVNCX09QRVIJKDIgPDwgNikKLSMJZGVmaW5lIE9IQ0lfVVNCX1NVU1BFTkQgKDMgPDwgNikKLQotLyoKLSAqIEhjQ29tbWFuZFN0YXR1cyAoY21kc3RhdHVzKSByZWdpc3RlciBtYXNrcwotICovCi0jZGVmaW5lIE9IQ0lfSENSCSgxIDw8IDApCS8qIGhvc3QgY29udHJvbGxlciByZXNldCAqLwotI2RlZmluZSBPSENJX0NMRgkoMSA8PCAxKQkvKiBjb250cm9sIGxpc3QgZmlsbGVkICovCi0jZGVmaW5lIE9IQ0lfQkxGCSgxIDw8IDIpCS8qIGJ1bGsgbGlzdCBmaWxsZWQgKi8KLSNkZWZpbmUgT0hDSV9PQ1IJKDEgPDwgMykJLyogb3duZXJzaGlwIGNoYW5nZSByZXF1ZXN0ICovCi0jZGVmaW5lIE9IQ0lfU09DCSgzIDw8IDE2KQkvKiBzY2hlZHVsaW5nIG92ZXJydW4gY291bnQgKi8KLQotLyoKLSAqIG1hc2tzIHVzZWQgd2l0aCBpbnRlcnJ1cHQgcmVnaXN0ZXJzOgotICogSGNJbnRlcnJ1cHRTdGF0dXMgKGludHJzdGF0dXMpCi0gKiBIY0ludGVycnVwdEVuYWJsZSAoaW50cmVuYWJsZSkKLSAqIEhjSW50ZXJydXB0RGlzYWJsZSAoaW50cmRpc2FibGUpCi0gKi8KLSNkZWZpbmUgT0hDSV9JTlRSX1NPCSgxIDw8IDApCS8qIHNjaGVkdWxpbmcgb3ZlcnJ1biAqLwotI2RlZmluZSBPSENJX0lOVFJfV0RICSgxIDw8IDEpCS8qIHdyaXRlYmFjayBvZiBkb25lX2hlYWQgKi8KLSNkZWZpbmUgT0hDSV9JTlRSX1NGCSgxIDw8IDIpCS8qIHN0YXJ0IGZyYW1lICovCi0jZGVmaW5lIE9IQ0lfSU5UUl9SRAkoMSA8PCAzKQkvKiByZXN1bWUgZGV0ZWN0ICovCi0jZGVmaW5lIE9IQ0lfSU5UUl9VRQkoMSA8PCA0KQkvKiB1bnJlY292ZXJhYmxlIGVycm9yICovCi0jZGVmaW5lIE9IQ0lfSU5UUl9GTk8JKDEgPDwgNSkJLyogZnJhbWUgbnVtYmVyIG92ZXJmbG93ICovCi0jZGVmaW5lIE9IQ0lfSU5UUl9SSFNDCSgxIDw8IDYpCS8qIHJvb3QgaHViIHN0YXR1cyBjaGFuZ2UgKi8KLSNkZWZpbmUgT0hDSV9JTlRSX09DCSgxIDw8IDMwKQkvKiBvd25lcnNoaXAgY2hhbmdlICovCi0jZGVmaW5lIE9IQ0lfSU5UUl9NSUUJKDEgPDwgMzEpCS8qIG1hc3RlciBpbnRlcnJ1cHQgZW5hYmxlICovCi0KLQotLyogVmlydHVhbCBSb290IEhVQiAqLwotc3RydWN0IHZpcnRfcm9vdF9odWIgewotCWludCBkZXZudW07IC8qIEFkZHJlc3Mgb2YgUm9vdCBIdWIgZW5kcG9pbnQgKi8KLQl2b2lkICpkZXY7ICAvKiB3YXMgdXJiICovCi0Jdm9pZCAqaW50X2FkZHI7Ci0JaW50IHNlbmQ7Ci0JaW50IGludGVydmFsOwotfTsKLQotLyogVVNCIEhVQiBDT05TVEFOVFMgKG5vdCBPSENJLXNwZWNpZmljOyBzZWUgaHViLmgpICovCi0KLS8qIGRlc3RpbmF0aW9uIG9mIHJlcXVlc3QgKi8KLSNkZWZpbmUgUkhfSU5URVJGQUNFCQkgICAweDAxCi0jZGVmaW5lIFJIX0VORFBPSU5UCQkgICAweDAyCi0jZGVmaW5lIFJIX09USEVSCQkgICAweDAzCi0KLSNkZWZpbmUgUkhfQ0xBU1MJCSAgIDB4MjAKLSNkZWZpbmUgUkhfVkVORE9SCQkgICAweDQwCi0KLS8qIFJlcXVlc3RzOiBiUmVxdWVzdCA8PCA4IHwgYm1SZXF1ZXN0VHlwZSAqLwotI2RlZmluZSBSSF9HRVRfU1RBVFVTCQkweDAwODAKLSNkZWZpbmUgUkhfQ0xFQVJfRkVBVFVSRQkweDAxMDAKLSNkZWZpbmUgUkhfU0VUX0ZFQVRVUkUJCTB4MDMwMAotI2RlZmluZSBSSF9TRVRfQUREUkVTUwkJMHgwNTAwCi0jZGVmaW5lIFJIX0dFVF9ERVNDUklQVE9SCTB4MDY4MAotI2RlZmluZSBSSF9TRVRfREVTQ1JJUFRPUgkweDA3MDAKLSNkZWZpbmUgUkhfR0VUX0NPTkZJR1VSQVRJT04JMHgwODgwCi0jZGVmaW5lIFJIX1NFVF9DT05GSUdVUkFUSU9OCTB4MDkwMAotI2RlZmluZSBSSF9HRVRfU1RBVEUJCTB4MDI4MAotI2RlZmluZSBSSF9HRVRfSU5URVJGQUNFCTB4MEE4MAotI2RlZmluZSBSSF9TRVRfSU5URVJGQUNFCTB4MEIwMAotI2RlZmluZSBSSF9TWU5DX0ZSQU1FCQkweDBDODAKLS8qIE91ciBWZW5kb3IgU3BlY2lmaWMgUmVxdWVzdCAqLwotI2RlZmluZSBSSF9TRVRfRVAJCTB4MjAwMAotCi0KLS8qIEh1YiBwb3J0IGZlYXR1cmVzICovCi0jZGVmaW5lIFJIX1BPUlRfQ09OTkVDVElPTgkgICAweDAwCi0jZGVmaW5lIFJIX1BPUlRfRU5BQkxFCQkgICAweDAxCi0jZGVmaW5lIFJIX1BPUlRfU1VTUEVORAkJICAgMHgwMgotI2RlZmluZSBSSF9QT1JUX09WRVJfQ1VSUkVOVAkgICAweDAzCi0jZGVmaW5lIFJIX1BPUlRfUkVTRVQJCSAgIDB4MDQKLSNkZWZpbmUgUkhfUE9SVF9QT1dFUgkJICAgMHgwOAotI2RlZmluZSBSSF9QT1JUX0xPV19TUEVFRAkgICAweDA5Ci0KLSNkZWZpbmUgUkhfQ19QT1JUX0NPTk5FQ1RJT04JICAgMHgxMAotI2RlZmluZSBSSF9DX1BPUlRfRU5BQkxFCSAgIDB4MTEKLSNkZWZpbmUgUkhfQ19QT1JUX1NVU1BFTkQJICAgMHgxMgotI2RlZmluZSBSSF9DX1BPUlRfT1ZFUl9DVVJSRU5UCSAgIDB4MTMKLSNkZWZpbmUgUkhfQ19QT1JUX1JFU0VUCQkgICAweDE0Ci0KLS8qIEh1YiBmZWF0dXJlcyAqLwotI2RlZmluZSBSSF9DX0hVQl9MT0NBTF9QT1dFUgkgICAweDAwCi0jZGVmaW5lIFJIX0NfSFVCX09WRVJfQ1VSUkVOVAkgICAweDAxCi0KLSNkZWZpbmUgUkhfREVWSUNFX1JFTU9URV9XQUtFVVAJICAgMHgwMAotI2RlZmluZSBSSF9FTkRQT0lOVF9TVEFMTAkgICAweDAxCi0KLSNkZWZpbmUgUkhfQUNLCQkJICAgMHgwMQotI2RlZmluZSBSSF9SRVFfRVJSCQkgICAtMQotI2RlZmluZSBSSF9OQUNLCQkJICAgMHgwMAotCi0KLS8qIE9IQ0kgUk9PVCBIVUIgUkVHSVNURVIgTUFTS1MgKi8KLQotLyogcm9vdGh1Yi5wb3J0c3RhdHVzIFtpXSBiaXRzICovCi0jZGVmaW5lIFJIX1BTX0NDUwkgICAgIDB4MDAwMDAwMDEJCS8qIGN1cnJlbnQgY29ubmVjdCBzdGF0dXMgKi8KLSNkZWZpbmUgUkhfUFNfUEVTCSAgICAgMHgwMDAwMDAwMgkJLyogcG9ydCBlbmFibGUgc3RhdHVzKi8KLSNkZWZpbmUgUkhfUFNfUFNTCSAgICAgMHgwMDAwMDAwNAkJLyogcG9ydCBzdXNwZW5kIHN0YXR1cyAqLwotI2RlZmluZSBSSF9QU19QT0NJCSAgICAgMHgwMDAwMDAwOAkJLyogcG9ydCBvdmVyIGN1cnJlbnQgaW5kaWNhdG9yICovCi0jZGVmaW5lIFJIX1BTX1BSUwkgICAgIDB4MDAwMDAwMTAJCS8qIHBvcnQgcmVzZXQgc3RhdHVzICovCi0jZGVmaW5lIFJIX1BTX1BQUwkgICAgIDB4MDAwMDAxMDAJCS8qIHBvcnQgcG93ZXIgc3RhdHVzICovCi0jZGVmaW5lIFJIX1BTX0xTREEJICAgICAweDAwMDAwMjAwCQkvKiBsb3cgc3BlZWQgZGV2aWNlIGF0dGFjaGVkICovCi0jZGVmaW5lIFJIX1BTX0NTQwkgICAgIDB4MDAwMTAwMDAJCS8qIGNvbm5lY3Qgc3RhdHVzIGNoYW5nZSAqLwotI2RlZmluZSBSSF9QU19QRVNDCSAgICAgMHgwMDAyMDAwMAkJLyogcG9ydCBlbmFibGUgc3RhdHVzIGNoYW5nZSAqLwotI2RlZmluZSBSSF9QU19QU1NDCSAgICAgMHgwMDA0MDAwMAkJLyogcG9ydCBzdXNwZW5kIHN0YXR1cyBjaGFuZ2UgKi8KLSNkZWZpbmUgUkhfUFNfT0NJQwkgICAgIDB4MDAwODAwMDAJCS8qIG92ZXIgY3VycmVudCBpbmRpY2F0b3IgY2hhbmdlICovCi0jZGVmaW5lIFJIX1BTX1BSU0MJICAgICAweDAwMTAwMDAwCQkvKiBwb3J0IHJlc2V0IHN0YXR1cyBjaGFuZ2UgKi8KLQotLyogcm9vdGh1Yi5zdGF0dXMgYml0cyAqLwotI2RlZmluZSBSSF9IU19MUFMJICAgICAweDAwMDAwMDAxCQkvKiBsb2NhbCBwb3dlciBzdGF0dXMgKi8KLSNkZWZpbmUgUkhfSFNfT0NJCSAgICAgMHgwMDAwMDAwMgkJLyogb3ZlciBjdXJyZW50IGluZGljYXRvciAqLwotI2RlZmluZSBSSF9IU19EUldFCSAgICAgMHgwMDAwODAwMAkJLyogZGV2aWNlIHJlbW90ZSB3YWtldXAgZW5hYmxlICovCi0jZGVmaW5lIFJIX0hTX0xQU0MJICAgICAweDAwMDEwMDAwCQkvKiBsb2NhbCBwb3dlciBzdGF0dXMgY2hhbmdlICovCi0jZGVmaW5lIFJIX0hTX09DSUMJICAgICAweDAwMDIwMDAwCQkvKiBvdmVyIGN1cnJlbnQgaW5kaWNhdG9yIGNoYW5nZSAqLwotI2RlZmluZSBSSF9IU19DUldFCSAgICAgMHg4MDAwMDAwMAkJLyogY2xlYXIgcmVtb3RlIHdha2V1cCBlbmFibGUgKi8KLQotLyogcm9vdGh1Yi5iIG1hc2tzICovCi0jZGVmaW5lIFJIX0JfRFIJCTB4MDAwMGZmZmYJCS8qIGRldmljZSByZW1vdmFibGUgZmxhZ3MgKi8KLSNkZWZpbmUgUkhfQl9QUENNCTB4ZmZmZjAwMDAJCS8qIHBvcnQgcG93ZXIgY29udHJvbCBtYXNrICovCi0KLS8qIHJvb3RodWIuYSBtYXNrcyAqLwotI2RlZmluZSBSSF9BX05EUAkoMHhmZiA8PCAwKQkJLyogbnVtYmVyIG9mIGRvd25zdHJlYW0gcG9ydHMgKi8KLSNkZWZpbmUgUkhfQV9QU00JKDEgPDwgOCkJCS8qIHBvd2VyIHN3aXRjaGluZyBtb2RlICovCi0jZGVmaW5lIFJIX0FfTlBTCSgxIDw8IDkpCQkvKiBubyBwb3dlciBzd2l0Y2hpbmcgKi8KLSNkZWZpbmUgUkhfQV9EVAkJKDEgPDwgMTApCQkvKiBkZXZpY2UgdHlwZSAobWJ6KSAqLwotI2RlZmluZSBSSF9BX09DUE0JKDEgPDwgMTEpCQkvKiBvdmVyIGN1cnJlbnQgcHJvdGVjdGlvbiBtb2RlICovCi0jZGVmaW5lIFJIX0FfTk9DUAkoMSA8PCAxMikJCS8qIG5vIG92ZXIgY3VycmVudCBwcm90ZWN0aW9uICovCi0jZGVmaW5lIFJIX0FfUE9UUEdUCSgweGZmIDw8IDI0KQkJLyogcG93ZXIgb24gdG8gcG93ZXIgZ29vZCB0aW1lICovCi0KLS8qIHVyYiAqLwotI2RlZmluZSBOX1VSQl9URCA0OAotdHlwZWRlZiBzdHJ1Y3QKLXsKLQllZF90ICplZDsKLQlfX3UxNiBsZW5ndGg7CS8qIG51bWJlciBvZiB0ZHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdCAqLwotCV9fdTE2IHRkX2NudDsJLyogbnVtYmVyIG9mIHRkcyBhbHJlYWR5IHNlcnZpY2VkICovCi0JaW50ICAgc3RhdGU7Ci0JdW5zaWduZWQgbG9uZyBwaXBlOwotCWludCBhY3R1YWxfbGVuZ3RoOwotCXRkX3QgKnRkW05fVVJCX1REXTsJLyogbGlzdCBwb2ludGVyIHRvIGFsbCBjb3JyZXNwb25kaW5nIFREcyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0ICovCi19IHVyYl9wcml2X3Q7Ci0jZGVmaW5lIFVSQl9ERUwgMQotCi0vKgotICogVGhpcyBpcyB0aGUgZnVsbCBvaGNpIGNvbnRyb2xsZXIgZGVzY3JpcHRpb24KLSAqCi0gKiBOb3RlIGhvdyB0aGUgInByb3BlciIgVVNCIGluZm9ybWF0aW9uIGlzIGp1c3QKLSAqIGEgc3Vic2V0IG9mIHdoYXQgdGhlIGZ1bGwgaW1wbGVtZW50YXRpb24gbmVlZHMuIChMaW51cykKLSAqLwotCi0KLXR5cGVkZWYgc3RydWN0IG9oY2kgewotCXN0cnVjdCBvaGNpX2hjY2EgKmhjY2E7CQkvKiBoY2NhICovCi0JLypkbWFfYWRkcl90IGhjY2FfZG1hOyovCi0KLQlpbnQgaXJxOwotCWludCBkaXNhYmxlZDsJCQkvKiBlLmcuIGdvdCBhIFVFLCB3ZSdyZSBodW5nICovCi0JaW50IHNsZWVwaW5nOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkvKiBmb3IgSEMgYnVncyAqLwotCi0Jc3RydWN0IG9oY2lfcmVncyAqcmVnczsgLyogT0hDSSBjb250cm9sbGVyJ3MgbWVtb3J5ICovCi0KLQllZF90ICplZF9ybV9saXN0WzJdOwkgLyogbGlzdHMgb2YgYWxsIGVuZHBvaW50cyB0byBiZSByZW1vdmVkICovCi0JZWRfdCAqZWRfYnVsa3RhaWw7CSAvKiBsYXN0IGVuZHBvaW50IG9mIGJ1bGsgbGlzdCAqLwotCWVkX3QgKmVkX2NvbnRyb2x0YWlsOwkgLyogbGFzdCBlbmRwb2ludCBvZiBjb250cm9sIGxpc3QgKi8KLQlpbnQgaW50cnN0YXR1czsKLQlfX3UzMiBoY19jb250cm9sOwkJLyogY29weSBvZiB0aGUgaGMgY29udHJvbCByZWcgKi8KLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2WzMyXTsKLQlzdHJ1Y3QgdmlydF9yb290X2h1YiByaDsKLQotCWNvbnN0IGNoYXIJKnNsb3RfbmFtZTsKLX0gb2hjaV90OwotCi0jZGVmaW5lIE5VTV9FRFMgOAkJLyogbnVtIG9mIHByZWFsbG9jYXRlZCBlbmRwb2ludCBkZXNjcmlwdG9ycyAqLwotCi1zdHJ1Y3Qgb2hjaV9kZXZpY2UgewotCWVkX3QJZWRbTlVNX0VEU107Ci0JaW50IGVkX2NudDsKLX07Ci0KLS8qIGhjZCAqLwotLyogZW5kcG9pbnQgKi8KLXN0YXRpYyBpbnQgZXBfbGluayhvaGNpX3QgKiBvaGNpLCBlZF90ICogZWQpOwotc3RhdGljIGludCBlcF91bmxpbmsob2hjaV90ICogb2hjaSwgZWRfdCAqIGVkKTsKLXN0YXRpYyBlZF90ICogZXBfYWRkX2VkKHN0cnVjdCB1c2JfZGV2aWNlICogdXNiX2RldiwgdW5zaWduZWQgbG9uZyBwaXBlKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogd2UgbmVlZCBtb3JlIFREcyB0aGFuIEVEcyAqLwotI2RlZmluZSBOVU1fVEQgNjQKLQotLyogKzEgc28gd2UgY2FuIGFsaWduIHRoZSBzdG9yYWdlICovCi10ZF90IGd0ZFtOVU1fVEQrMV07Ci0vKiBwb2ludGVycyB0byBhbGlnbmVkIHN0b3JhZ2UgKi8KLXRkX3QgKnB0ZDsKLQotLyogVERzIC4uLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgdGQgKgotdGRfYWxsb2MgKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2KQotewotCWludCBpOwotCXN0cnVjdCB0ZAkqdGQ7Ci0KLQl0ZCA9IE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9URDsgaSsrKQotCXsKLQkJaWYgKHB0ZFtpXS51c2JfZGV2ID09IE5VTEwpCi0JCXsKLQkJCXRkID0gJnB0ZFtpXTsKLQkJCXRkLT51c2JfZGV2ID0gdXNiX2RldjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHRkOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWVkX2ZyZWUgKHN0cnVjdCBlZCAqZWQpCi17Ci0JZWQtPnVzYl9kZXYgPSBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyMHQvczNjMjR4MC9NYWtlZmlsZSBiL2NwdS9hcm05MjB0L3MzYzI0eDAvTWFrZWZpbGUKaW5kZXggM2E3YzRiMy4uMGZmMzZjNSAxMDA2NDQKLS0tIGEvY3B1L2FybTkyMHQvczNjMjR4MC9NYWtlZmlsZQorKysgYi9jcHUvYXJtOTIwdC9zM2MyNHgwL01ha2VmaWxlCkBAIC0yNiw3ICsyNiw3IEBACiBMSUIJPSAkKG9iailsaWIkKFNPQykuYQogCiBDT0JKUwk9IGkyYy5vIGludGVycnVwdHMubyBzZXJpYWwubyBzcGVlZC5vIFwKLQkgIHVzYl9vaGNpLm8KKwkgIHVzYi5vCiAKIFNSQ1MJOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKIE9CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpICQoQ09CSlMpKQpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyMHQvczNjMjR4MC91c2IuYyBiL2NwdS9hcm05MjB0L3MzYzI0eDAvdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1ZDViZgotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9hcm05MjB0L3MzYzI0eDAvdXNiLmMKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZyA8bWtAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9ORVcpICYmIGRlZmluZWQoQ0ZHX1VTQl9PSENJX0NQVV9JTklUKQorIyBpZiBkZWZpbmVkKENPTkZJR19TM0MyNDAwKSB8fCBkZWZpbmVkKENPTkZJR19TM0MyNDEwKQorCisjaWYgZGVmaW5lZChDT05GSUdfUzNDMjQwMCkKKyMgaW5jbHVkZSA8czNjMjQwMC5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfUzNDMjQxMCkKKyMgaW5jbHVkZSA8czNjMjQxMC5oPgorI2VuZGlmCisKK2ludCB1c2JfY3B1X2luaXQgKHZvaWQpCit7CisKKwlTM0MyNFgwX0NMT0NLX1BPV0VSICogY29uc3QgY2xrX3Bvd2VyID0gUzNDMjRYMF9HZXRCYXNlX0NMT0NLX1BPV0VSKCk7CisJUzNDMjRYMF9HUElPICogY29uc3QgZ3BpbyA9IFMzQzI0WDBfR2V0QmFzZV9HUElPKCk7CisKKwkvKgorCSAqIFNldCB0aGUgNDggTUh6IFVQTEwgY2xvY2tpbmcuIFZhbHVlcyBhcmUgdGFrZW4gZnJvbQorCSAqICJQTEwgdmFsdWUgc2VsZWN0aW9uIGd1aWRlIiwgNi0yMywgczNjMjQwMF9VTS5wZGYuCisJICovCisJY2xrX3Bvd2VyLT5VUExMQ09OID0gKCg0MCA8PCAxMikgKyAoMSA8PCA0KSArIDIpOworCWdwaW8tPk1JU0NDUiB8PSAweDg7IC8qIDEgPSB1c2UgcGFkcyByZWxhdGVkIFVTQiBmb3IgVVNCIGhvc3QgKi8KKworCS8qCisJICogRW5hYmxlIFVTQiBob3N0IGNsb2NrLgorCSAqLworCWNsa19wb3dlci0+Q0xLQ09OIHw9ICgxIDw8IDQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JfY3B1X3N0b3AgKHZvaWQpCit7CisJUzNDMjRYMF9DTE9DS19QT1dFUiAqIGNvbnN0IGNsa19wb3dlciA9IFMzQzI0WDBfR2V0QmFzZV9DTE9DS19QT1dFUigpOworCS8qIG1heSBub3Qgd2FudCB0byBkbyB0aGlzICovCisJY2xrX3Bvd2VyLT5DTEtDT04gJj0gfigxIDw8IDQpOworCXJldHVybiAwOworfQorCitpbnQgdXNiX2NwdV9pbml0X2ZhaWwgKHZvaWQpCit7CisJUzNDMjRYMF9DTE9DS19QT1dFUiAqIGNvbnN0IGNsa19wb3dlciA9IFMzQzI0WDBfR2V0QmFzZV9DTE9DS19QT1dFUigpOworCWNsa19wb3dlci0+Q0xLQ09OICY9IH4oMSA8PCA0KTsKKwlyZXR1cm4gMDsKK30KKworIyBlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19TM0MyNDAwKSB8fCBkZWZpbmVkKENPTkZJR19TM0MyNDEwKSAqLworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1VTQl9PSENJKSAmJiBkZWZpbmVkKENGR19VU0JfT0hDSV9DUFVfSU5JVCkgKi8KZGlmZiAtLWdpdCBhL2NwdS9hcm05MjZlanMvZGF2aW5jaS9NYWtlZmlsZSBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjc3ZjQwCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL01ha2VmaWxlCkBAIC0wLDAgKzEsNDkgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChTT0MpLmEKKworQ09CSlMJPSB0aW1lci5vIGV0aGVyLm8gbHh0OTcyLm8gZHA4Mzg0OC5vIGkyYy5vIG5hbmQubworU09CSlMJPSBsb3dsZXZlbF9pbml0Lm8gcmVzZXQubworCitTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSAkKFNPQkpTKSkKK1NUQVJUCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNUQVJUKSkKKworYWxsOgkkKG9iaikuZGVwZW5kICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NwdS9hcm05MjZlanMvZGF2aW5jaS9kcDgzODQ4LmMgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvZHA4Mzg0OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MTk4NDUKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvZHA4Mzg0OC5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBEUDgzODQ4IFBIWSBEcml2ZXIgZm9yIFRJIERhVmluY2kKKyAqIChUTVMzMjBETTY0NHgpIGJhc2VkIGJvYXJkcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8ZHA4Mzg0OC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2VtYWNfZGVmcy5oPgorCisjaWZkZWYgQ09ORklHX0RSSVZFUl9USV9FTUFDCisKKyNpZmRlZiBDT05GSUdfQ01EX05FVAorCitpbnQgZHA4Mzg0OF9pc19waHlfY29ubmVjdGVkKGludCBwaHlfYWRkcikKK3sKKwl1X2ludDE2X3QJaWQxLCBpZDI7CisKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIERQODM4NDhfUEhZSUQxX1JFRywgJmlkMSkpCisJCXJldHVybigwKTsKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIERQODM4NDhfUEhZSUQyX1JFRywgJmlkMikpCisJCXJldHVybigwKTsKKworCWlmICgoaWQxID09IERQODM4NDhfUEhZSUQxX09VSSkgJiYgKGlkMiA9PSBEUDgzODQ4X1BIWUlEMl9PVUkpKQorCQlyZXR1cm4oMSk7CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBkcDgzODQ4X2dldF9saW5rX3NwZWVkKGludCBwaHlfYWRkcikKK3sKKwl1X2ludDE2X3QJCXRtcDsKKwl2b2xhdGlsZSBlbWFjX3JlZ3MqCWVtYWMgPSAoZW1hY19yZWdzICopRU1BQ19CQVNFX0FERFI7CisKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIERQODM4NDhfU1RBVF9SRUcsICZ0bXApKQorCQlyZXR1cm4oMCk7CisKKwlpZiAoISh0bXAgJiBEUDgzODQ4X0xJTktfU1RBVFVTKSkJLyogbGluayB1cD8gKi8KKwkJcmV0dXJuKDApOworCisJaWYgKCFkbTY0NHhfZXRoX3BoeV9yZWFkKHBoeV9hZGRyLCBEUDgzODQ4X1BIWV9TVEFUX1JFRywgJnRtcCkpCisJCXJldHVybigwKTsKKworCS8qIFNwZWVkIGRvZXNuJ3QgbWF0dGVyLCB0aGVyZSBpcyBubyBzZXR0aW5nIGZvciBpdCBpbiBFTUFDLi4uICovCisJaWYgKHRtcCAmIERQODM4NDhfU1BFRUQpIHsKKwkJaWYgKHRtcCAmIERQODM4NDhfRFVQTEVYKSB7CisJCQkvKiBzZXQgRE02NDR4IEVNQUMgZm9yIEZ1bGwgRHVwbGV4ICAqLworCQkJZW1hYy0+TUFDQ09OVFJPTCA9IEVNQUNfTUFDQ09OVFJPTF9NSUlFTl9FTkFCTEUgfCBFTUFDX01BQ0NPTlRST0xfRlVMTERVUExFWF9FTkFCTEU7CisJCX0gZWxzZSB7CisJCQkvKnNldCBETTY0NHggRU1BQyBmb3IgSGFsZiBEdXBsZXggICovCisJCQllbWFjLT5NQUNDT05UUk9MID0gRU1BQ19NQUNDT05UUk9MX01JSUVOX0VOQUJMRTsKKwkJfQorCisJCXJldHVybigxKTsKKwl9IGVsc2UgeworCQlpZiAodG1wICYgRFA4Mzg0OF9EVVBMRVgpIHsKKwkJCS8qIHNldCBETTY0NHggRU1BQyBmb3IgRnVsbCBEdXBsZXggICovCisJCQllbWFjLT5NQUNDT05UUk9MID0gRU1BQ19NQUNDT05UUk9MX01JSUVOX0VOQUJMRSB8IEVNQUNfTUFDQ09OVFJPTF9GVUxMRFVQTEVYX0VOQUJMRTsKKwkJfSBlbHNlIHsKKwkJCS8qc2V0IERNNjQ0eCBFTUFDIGZvciBIYWxmIER1cGxleCAgKi8KKwkJCWVtYWMtPk1BQ0NPTlRST0wgPSBFTUFDX01BQ0NPTlRST0xfTUlJRU5fRU5BQkxFOworCQl9CisKKwkJcmV0dXJuKDEpOworCX0KKworCXJldHVybigwKTsKK30KKworCitpbnQgZHA4Mzg0OF9pbml0X3BoeShpbnQgcGh5X2FkZHIpCit7CisJaW50CXJldCA9IDE7CisKKwlpZiAoIWRwODM4NDhfZ2V0X2xpbmtfc3BlZWQocGh5X2FkZHIpKSB7CisJCS8qIFRyeSBhbm90aGVyIHRpbWUgKi8KKwkJdWRlbGF5KDEwMDAwMCk7CisJCXJldCA9IGRwODM4NDhfZ2V0X2xpbmtfc3BlZWQocGh5X2FkZHIpOworCX0KKworCS8qIERpc2FibGUgUEhZIEludGVycnVwdHMgKi8KKwlkbTY0NHhfZXRoX3BoeV93cml0ZShwaHlfYWRkciwgRFA4Mzg0OF9QSFlfSU5UUl9DVFJMX1JFRywgMCk7CisKKwlyZXR1cm4ocmV0KTsKK30KKworCitpbnQgZHA4Mzg0OF9hdXRvX25lZ290aWF0ZShpbnQgcGh5X2FkZHIpCit7CisJdV9pbnQxNl90CXRtcDsKKworCisJaWYgKCFkbTY0NHhfZXRoX3BoeV9yZWFkKHBoeV9hZGRyLCBEUDgzODQ4X0NUTF9SRUcsICZ0bXApKQorCQlyZXR1cm4oMCk7CisKKwkvKiBSZXN0YXJ0IEF1dG9fbmVnb3RpYXRpb24gICovCisJdG1wICY9IH5EUDgzODQ4X0FVVE9ORUc7CS8qIHJlbW92ZSBhdXRvbmVnb3RpYXRpb24gZW5hYmxlICovCisJdG1wIHw9IERQODM4NDhfSVNPTEFURTsJCS8qIEVsZWN0cmljYWxseSBpc29sYXRlIFBIWSAqLworCWRtNjQ0eF9ldGhfcGh5X3dyaXRlKHBoeV9hZGRyLCBEUDgzODQ4X0NUTF9SRUcsIHRtcCk7CisKKwkvKiBTZXQgdGhlIEF1dG9fbmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCBSZWdpc3RlcgorCSAqIE1JSSBhZHZlcnRpc2luZyBmb3IgTmV4dCBwYWdlLCAxMDBCYXNlVHhGRCBhbmQgSEQsCisJICogMTBCYXNlVEZEIGFuZCBIRCwgSUVFRSA4MDIuMworCSAqLworCXRtcCA9IERQODM4NDhfTlAgfCBEUDgzODQ4X1RYX0ZEWCB8IERQODM4NDhfVFhfSERYIHwKKwkgCURQODM4NDhfMTBfRkRYIHwgRFA4Mzg0OF8xMF9IRFggfCBEUDgzODQ4X0FOX0lFRUVfODAyXzM7CisJZG02NDR4X2V0aF9waHlfd3JpdGUocGh5X2FkZHIsIERQODM4NDhfQU5BX1JFRywgdG1wKTsKKworCisJLyogUmVhZCBDb250cm9sIFJlZ2lzdGVyICovCisJaWYgKCFkbTY0NHhfZXRoX3BoeV9yZWFkKHBoeV9hZGRyLCBEUDgzODQ4X0NUTF9SRUcsICZ0bXApKQorCQlyZXR1cm4oMCk7CisKKwl0bXAgfD0gRFA4Mzg0OF9TUEVFRF9TRUxFQ1QgfCBEUDgzODQ4X0FVVE9ORUcgfCBEUDgzODQ4X0RVUExFWF9NT0RFOworCWRtNjQ0eF9ldGhfcGh5X3dyaXRlKHBoeV9hZGRyLCBEUDgzODQ4X0NUTF9SRUcsIHRtcCk7CisKKwkvKiBSZXN0YXJ0IEF1dG9fbmVnb3RpYXRpb24gICovCisJdG1wIHw9IERQODM4NDhfUkVTVEFSVF9BVVRPTkVHOworCWRtNjQ0eF9ldGhfcGh5X3dyaXRlKHBoeV9hZGRyLCBEUDgzODQ4X0NUTF9SRUcsIHRtcCk7CisKKwkvKmNoZWNrIEF1dG9OZWdvdGlhdGUgY29tcGxldGUgKi8KKwl1ZGVsYXkoMTAwMDApOworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgRFA4Mzg0OF9TVEFUX1JFRywgJnRtcCkpCisJCXJldHVybigwKTsKKworCWlmICghKHRtcCAmIERQODM4NDhfQVVUT05FR19DT01QKSkKKwkJcmV0dXJuKDApOworCisJcmV0dXJuIChkcDgzODQ4X2dldF9saW5rX3NwZWVkKHBoeV9hZGRyKSk7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfQ01EX05FVCAqLworCisjZW5kaWYJLyogQ09ORklHX0RSSVZFUl9FVEhFUiAqLwpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyNmVqcy9kYXZpbmNpL2V0aGVyLmMgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvZXRoZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjZiYzdkCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL2V0aGVyLmMKQEAgLTAsMCArMSw2NTAgQEAKKy8qCisgKiBFdGhlcm5ldCBkcml2ZXIgZm9yIFRJIFRNUzMyMERNNjQ0eCAoRGFWaW5jaSkgY2hpcHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIFBhcnRzIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIFRJJ3MgZG02NDR4X2VtYWMuYy4gT3JpZ2luYWwgY29weXJpZ2h0CisgKiBmb2xsb3dzOgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBkbTY0NHhfZW1hYy5jCisgKgorICogVEkgRGFWaW5jaSAoRE02NDRYKSBFTUFDIHBlcmlwaGVyYWwgZHJpdmVyIHNvdXJjZSBmb3IgRFYtRVZNCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRleGFzIEluc3RydW1lbnRzLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogTW9kaWZpY2F0aW9uczoKKyAqIHZlci4gMS4wOiBTZXAgMjAwNSwgQW5hbnQgR29sZSAtIENyZWF0ZWQgRU1BQyB2ZXJzaW9uIGZvciB1Qm9vdC4KKyAqIHZlciAgMS4xOiBOb3YgMjAwNSwgQW5hbnQgR29sZSAtIEV4dGVuZGVkIHRoZSBSWCBsb2dpYyBmb3IgbXVsdGlwbGUgZGVzY3JpcHRvcnMKKyAqCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8bWlpcGh5Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZW1hY19kZWZzLmg+CisKKyNpZmRlZiBDT05GSUdfRFJJVkVSX1RJX0VNQUMKKworI2lmZGVmIENPTkZJR19DTURfTkVUCisKK3Vuc2lnbmVkIGludAllbWFjX2RiZyA9IDA7CisjZGVmaW5lIGRlYnVnX2VtYWMoZm10LGFyZ3MuLi4pCWlmIChlbWFjX2RiZykgcHJpbnRmKGZtdCwjI2FyZ3MpCisKKy8qIEludGVybmFsIHN0YXRpYyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgZG02NDR4X2V0aF9od19pbml0ICh2b2lkKTsKK3N0YXRpYyBpbnQgZG02NDR4X2V0aF9vcGVuICh2b2lkKTsKK3N0YXRpYyBpbnQgZG02NDR4X2V0aF9jbG9zZSAodm9pZCk7CitzdGF0aWMgaW50IGRtNjQ0eF9ldGhfc2VuZF9wYWNrZXQgKHZvbGF0aWxlIHZvaWQgKnBhY2tldCwgaW50IGxlbmd0aCk7CitzdGF0aWMgaW50IGRtNjQ0eF9ldGhfcmN2X3BhY2tldCAodm9pZCk7CitzdGF0aWMgdm9pZCBkbTY0NHhfZXRoX21kaW9fZW5hYmxlKHZvaWQpOworCitzdGF0aWMgaW50IGdlbl9pbml0X3BoeShpbnQgcGh5X2FkZHIpOworc3RhdGljIGludCBnZW5faXNfcGh5X2Nvbm5lY3RlZChpbnQgcGh5X2FkZHIpOworc3RhdGljIGludCBnZW5fZ2V0X2xpbmtfc3BlZWQoaW50IHBoeV9hZGRyKTsKK3N0YXRpYyBpbnQgZ2VuX2F1dG9fbmVnb3RpYXRlKGludCBwaHlfYWRkcik7CisKKy8qIFdyYXBwZXJzIGV4cG9ydGVkIHRvIHRoZSBVLUJvb3QgcHJvcGVyICovCitpbnQgZXRoX2h3X2luaXQodm9pZCkKK3sKKwlyZXR1cm4oZG02NDR4X2V0aF9od19pbml0KCkpOworfQorCitpbnQgZXRoX2luaXQoYmRfdCAqIGJkKQoreworCXJldHVybihkbTY0NHhfZXRoX29wZW4oKSk7Cit9CisKK3ZvaWQgZXRoX2hhbHQodm9pZCkKK3sKKwlkbTY0NHhfZXRoX2Nsb3NlKCk7Cit9CisKK2ludCBldGhfc2VuZCh2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpCit7CisJcmV0dXJuKGRtNjQ0eF9ldGhfc2VuZF9wYWNrZXQocGFja2V0LCBsZW5ndGgpKTsKK30KKworaW50IGV0aF9yeCh2b2lkKQoreworCXJldHVybihkbTY0NHhfZXRoX3Jjdl9wYWNrZXQoKSk7Cit9CisKK3ZvaWQgZXRoX21kaW9fZW5hYmxlKHZvaWQpCit7CisJZG02NDR4X2V0aF9tZGlvX2VuYWJsZSgpOworfQorLyogRW5kIG9mIHdyYXBwZXJzICovCisKKworc3RhdGljIHVfaW50OF90IGRtNjQ0eF9ldGhfbWFjX2FkZHJbXSA9IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OworCisvKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZW1hY19vcGVuKCkgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUKKyAqIHRoZSBkZWZhdWx0IG1hYyBhZGRyZXNzLgorICovCit2b2lkIGRtNjQ0eF9ldGhfc2V0X21hY19hZGRyKGNvbnN0IHVfaW50OF90ICphZGRyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAoZG02NDR4X2V0aF9tYWNfYWRkcik7IGkrKykgeworCQlkbTY0NHhfZXRoX21hY19hZGRyW2ldID0gYWRkcltpXTsKKwl9Cit9CisKKy8qIEVNQUMgQWRkcmVzc2VzICovCitzdGF0aWMgdm9sYXRpbGUgZW1hY19yZWdzCSphZGFwX2VtYWMgPSAoZW1hY19yZWdzICopRU1BQ19CQVNFX0FERFI7CitzdGF0aWMgdm9sYXRpbGUgZXdyYXBfcmVncwkqYWRhcF9ld3JhcCA9IChld3JhcF9yZWdzICopRU1BQ19XUkFQUEVSX0JBU0VfQUREUjsKK3N0YXRpYyB2b2xhdGlsZSBtZGlvX3JlZ3MJKmFkYXBfbWRpbyA9IChtZGlvX3JlZ3MgKilFTUFDX01ESU9fQkFTRV9BRERSOworCisvKiBFTUFDIGRlc2NyaXB0b3JzICovCitzdGF0aWMgdm9sYXRpbGUgZW1hY19kZXNjCSplbWFjX3J4X2Rlc2MgPSAoZW1hY19kZXNjICopKEVNQUNfV1JBUFBFUl9SQU1fQUREUiArIEVNQUNfUlhfREVTQ19CQVNFKTsKK3N0YXRpYyB2b2xhdGlsZSBlbWFjX2Rlc2MJKmVtYWNfdHhfZGVzYyA9IChlbWFjX2Rlc2MgKikoRU1BQ19XUkFQUEVSX1JBTV9BRERSICsgRU1BQ19UWF9ERVNDX0JBU0UpOworc3RhdGljIHZvbGF0aWxlIGVtYWNfZGVzYwkqZW1hY19yeF9hY3RpdmVfaGVhZCA9IDA7CitzdGF0aWMgdm9sYXRpbGUgZW1hY19kZXNjCSplbWFjX3J4X2FjdGl2ZV90YWlsID0gMDsKK3N0YXRpYyBpbnQJCQllbWFjX3J4X3F1ZXVlX2FjdGl2ZSA9IDA7CisKKy8qIFJlY2VpdmUgcGFja2V0IGJ1ZmZlcnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyCQllbWFjX3J4X2J1ZmZlcnNbRU1BQ19NQVhfUlhfQlVGRkVSUyAqIChFTUFDX01BWF9FVEhFUk5FVF9QS1RfU0laRSArIEVNQUNfUEtUX0FMSUdOKV07CisKKy8qIFBIWSBhZGRyZXNzIGZvciBhIGRpc2NvdmVyZWQgUEhZICgweGZmIC0gbm90IGZvdW5kKSAqLworc3RhdGljIHZvbGF0aWxlIHVfaW50OF90CWFjdGl2ZV9waHlfYWRkciA9IDB4ZmY7CisKK3BoeV90CQkJCXBoeTsKKworc3RhdGljIHZvaWQgZG02NDR4X2V0aF9tZGlvX2VuYWJsZSh2b2lkKQoreworCXVfaW50MzJfdAljbGtkaXY7CisKKwljbGtkaXYgPSAoRU1BQ19NRElPX0JVU19GUkVRIC8gRU1BQ19NRElPX0NMT0NLX0ZSRVEpIC0gMTsKKworCWFkYXBfbWRpby0+Q09OVFJPTCA9IChjbGtkaXYgJiAweGZmKSB8CisJCU1ESU9fQ09OVFJPTF9FTkFCTEUgfAorCQlNRElPX0NPTlRST0xfRkFVTFQgfAorCQlNRElPX0NPTlRST0xfRkFVTFRfRU5BQkxFOworCisJd2hpbGUgKGFkYXBfbWRpby0+Q09OVFJPTCAmIE1ESU9fQ09OVFJPTF9JRExFKSB7O30KK30KKworLyoKKyAqIFRyaWVzIHRvIGZpbmQgYW4gYWN0aXZlIGNvbm5lY3RlZCBQSFkuIFJldHVybnMgMSBpZiBhZGRyZXNzIGlmIGZvdW5kLgorICogSWYgbm8gYWN0aXZlIFBIWSAob3IgbW9yZSB0aGFuIG9uZSBQSFkpIGZvdW5kIHJldHVybnMgMC4KKyAqIFNldHMgYWN0aXZlX3BoeV9hZGRyIHZhcmlhYmxlLgorICovCitzdGF0aWMgaW50IGRtNjQ0eF9ldGhfcGh5X2RldGVjdCh2b2lkKQoreworCXVfaW50MzJfdAlwaHlfYWN0X3N0YXRlOworCWludAkJaTsKKworCWFjdGl2ZV9waHlfYWRkciA9IDB4ZmY7CisKKwlpZiAoKHBoeV9hY3Rfc3RhdGUgPSBhZGFwX21kaW8tPkFMSVZFKSA9PSAwKQorCQlyZXR1cm4oMCk7CQkJCS8qIE5vIGFjdGl2ZSBQSFlzICovCisKKwlkZWJ1Z19lbWFjKCJkbTY0NHhfZXRoX3BoeV9kZXRlY3QoKSwgQUxJVkUgPSAweCUwOHhcbiIsIHBoeV9hY3Rfc3RhdGUpOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJaWYgKHBoeV9hY3Rfc3RhdGUgJiAoMSA8PCBpKSkgeworCQkJaWYgKHBoeV9hY3Rfc3RhdGUgJiB+KDEgPDwgaSkpCisJCQkJcmV0dXJuKDApOwkJLyogTW9yZSB0aGFuIG9uZSBQSFkgKi8KKwkJCWVsc2UgeworCQkJCWFjdGl2ZV9waHlfYWRkciA9IGk7CisJCQkJcmV0dXJuKDEpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKDApOwkvKiBKdXN0IHRvIG1ha2UgR0NDIGhhcHB5ICovCit9CisKKworLyogUmVhZCBhIFBIWSByZWdpc3RlciB2aWEgTURJTyBpbnRlZmFjZS4gUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb3RoZXJ3aXNlICovCitpbnQgZG02NDR4X2V0aF9waHlfcmVhZCh1X2ludDhfdCBwaHlfYWRkciwgdV9pbnQ4X3QgcmVnX251bSwgdV9pbnQxNl90ICpkYXRhKQoreworCWludAl0bXA7CisKKwl3aGlsZSAoYWRhcF9tZGlvLT5VU0VSQUNDRVNTMCAmIE1ESU9fVVNFUkFDQ0VTUzBfR08pIHs7fQorCisJYWRhcF9tZGlvLT5VU0VSQUNDRVNTMCA9IE1ESU9fVVNFUkFDQ0VTUzBfR08gfAorCQkJCU1ESU9fVVNFUkFDQ0VTUzBfV1JJVEVfUkVBRCB8CisJCQkJKChyZWdfbnVtICYgMHgxZikgPDwgMjEpIHwKKwkJCQkoKHBoeV9hZGRyICYgMHgxZikgPDwgMTYpOworCisJLyogV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCXdoaWxlICgodG1wID0gYWRhcF9tZGlvLT5VU0VSQUNDRVNTMCkgJiBNRElPX1VTRVJBQ0NFU1MwX0dPKSB7O30KKworCWlmICh0bXAgJiBNRElPX1VTRVJBQ0NFU1MwX0FDSykgeworCQkqZGF0YSA9IHRtcCAmIDB4ZmZmZjsKKwkJcmV0dXJuKDEpOworCX0KKworCSpkYXRhID0gLTE7CisJcmV0dXJuKDApOworfQorCisvKiBXcml0ZSB0byBhIFBIWSByZWdpc3RlciB2aWEgTURJTyBpbnRlZmFjZS4gQmxvY2tzIHVudGlsIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gKi8KK2ludCBkbTY0NHhfZXRoX3BoeV93cml0ZSh1X2ludDhfdCBwaHlfYWRkciwgdV9pbnQ4X3QgcmVnX251bSwgdV9pbnQxNl90IGRhdGEpCit7CisKKwl3aGlsZSAoYWRhcF9tZGlvLT5VU0VSQUNDRVNTMCAmIE1ESU9fVVNFUkFDQ0VTUzBfR08pIHs7fQorCisJYWRhcF9tZGlvLT5VU0VSQUNDRVNTMCA9IE1ESU9fVVNFUkFDQ0VTUzBfR08gfAorCQkJCU1ESU9fVVNFUkFDQ0VTUzBfV1JJVEVfV1JJVEUgfAorCQkJCSgocmVnX251bSAmIDB4MWYpIDw8IDIxKSB8CisJCQkJKChwaHlfYWRkciAmIDB4MWYpIDw8IDE2KSB8CisJCQkJKGRhdGEgJiAweGZmZmYpOworCisJLyogV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCXdoaWxlIChhZGFwX21kaW8tPlVTRVJBQ0NFU1MwICYgTURJT19VU0VSQUNDRVNTMF9HTykgezt9CisKKwlyZXR1cm4oMSk7Cit9CisKKy8qIFBIWSBmdW5jdGlvbnMgZm9yIGEgZ2VuZXJpYyBQSFkgKi8KK3N0YXRpYyBpbnQgZ2VuX2luaXRfcGh5KGludCBwaHlfYWRkcikKK3sKKwlpbnQJcmV0ID0gMTsKKworCWlmIChnZW5fZ2V0X2xpbmtfc3BlZWQocGh5X2FkZHIpKSB7CisJCS8qIFRyeSBhbm90aGVyIHRpbWUgKi8KKwkJcmV0ID0gZ2VuX2dldF9saW5rX3NwZWVkKHBoeV9hZGRyKTsKKwl9CisKKwlyZXR1cm4ocmV0KTsKK30KKworc3RhdGljIGludCBnZW5faXNfcGh5X2Nvbm5lY3RlZChpbnQgcGh5X2FkZHIpCit7CisJdV9pbnQxNl90CWR1bW15OworCisJcmV0dXJuKGRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIFBIWV9QSFlJRFIxLCAmZHVtbXkpKTsKK30KKworc3RhdGljIGludCBnZW5fZ2V0X2xpbmtfc3BlZWQoaW50IHBoeV9hZGRyKQoreworCXVfaW50MTZfdAl0bXA7CisKKwlpZiAoZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgTUlJX1NUQVRVU19SRUcsICZ0bXApICYmICh0bXAgJiAweDA0KSkKKwkJcmV0dXJuKDEpOworCisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IGdlbl9hdXRvX25lZ290aWF0ZShpbnQgcGh5X2FkZHIpCit7CisJdV9pbnQxNl90CXRtcDsKKworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgUEhZX0JNQ1IsICZ0bXApKQorCQlyZXR1cm4oMCk7CisKKwkvKiBSZXN0YXJ0IEF1dG9fbmVnb3RpYXRpb24gICovCisJdG1wIHw9IFBIWV9CTUNSX0FVVE9OOworCWRtNjQ0eF9ldGhfcGh5X3dyaXRlKHBoeV9hZGRyLCBQSFlfQk1DUiwgdG1wKTsKKworCS8qY2hlY2sgQXV0b05lZ290aWF0ZSBjb21wbGV0ZSAqLworCXVkZWxheSAoMTAwMDApOworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgUEhZX0JNU1IsICZ0bXApKQorCQlyZXR1cm4oMCk7CisKKwlpZiAoISh0bXAgJiBQSFlfQk1TUl9BVVROX0NPTVApKQorCQlyZXR1cm4oMCk7CisKKwlyZXR1cm4oZ2VuX2dldF9saW5rX3NwZWVkKHBoeV9hZGRyKSk7Cit9CisvKiBFbmQgb2YgZ2VuZXJpYyBQSFkgZnVuY3Rpb25zICovCisKKworI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKK3N0YXRpYyBpbnQgZG02NDR4X21paV9waHlfcmVhZChjaGFyICpkZXZuYW1lLCB1bnNpZ25lZCBjaGFyIGFkZHIsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBzaG9ydCAqdmFsdWUpCit7CisJcmV0dXJuKGRtNjQ0eF9ldGhfcGh5X3JlYWQoYWRkciwgcmVnLCB2YWx1ZSkgPyAwIDogMSk7Cit9CisKK3N0YXRpYyBpbnQgZG02NDR4X21paV9waHlfd3JpdGUoY2hhciAqZGV2bmFtZSwgdW5zaWduZWQgY2hhciBhZGRyLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisJcmV0dXJuKGRtNjQ0eF9ldGhfcGh5X3dyaXRlKGFkZHIsIHJlZywgdmFsdWUpID8gMCA6IDEpOworfQorCitpbnQgZG02NDR4X2V0aF9taWlwaHlfaW5pdGlhbGl6ZShiZF90ICpiaXMpCit7CisJbWlpcGh5X3JlZ2lzdGVyKHBoeS5uYW1lLCBkbTY0NHhfbWlpX3BoeV9yZWFkLCBkbTY0NHhfbWlpX3BoeV93cml0ZSk7CisKKwlyZXR1cm4oMSk7Cit9CisjZW5kaWYKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGVtYWMgaGFyZHdhcmUuIEl0IGRvZXMgTk9UIGluaXRpYWxpemUKKyAqIEVNQUMgbW9kdWxlcyBwb3dlciBvciBwaW4gbXVsdGlwbGV4b3JzLCB0aGF0IGlzIGRvbmUgYnkgYm9hcmRfaW5pdCgpCisgKiBtdWNoIGVhcmxpZXIgaW4gYm9vdHVwIHByb2Nlc3MuIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBkbTY0NHhfZXRoX2h3X2luaXQodm9pZCkKK3sKKwl1X2ludDMyX3QJcGh5X2lkOworCXVfaW50MTZfdAl0bXA7CisJaW50CQlpOworCisJZG02NDR4X2V0aF9tZGlvX2VuYWJsZSgpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWlmIChhZGFwX21kaW8tPkFMSVZFKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCisJaWYgKGkgPj0gMjU2KSB7CisJCXByaW50ZigiTm8gRVRIIFBIWSBkZXRlY3RlZCEhIVxuIik7CisJCXJldHVybigwKTsKKwl9CisKKwkvKiBGaW5kIGlmIGEgUEhZIGlzIGNvbm5lY3RlZCBhbmQgZ2V0IGl0J3MgYWRkcmVzcyAqLworCWlmICghZG02NDR4X2V0aF9waHlfZGV0ZWN0KCkpCisJCXJldHVybigwKTsKKworCS8qIEdldCBQSFkgSUQgYW5kIGluaXRpYWxpemUgcGh5X29wcyBmb3IgYSBkZXRlY3RlZCBQSFkgKi8KKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQoYWN0aXZlX3BoeV9hZGRyLCBQSFlfUEhZSURSMSwgJnRtcCkpIHsKKwkJYWN0aXZlX3BoeV9hZGRyID0gMHhmZjsKKwkJcmV0dXJuKDApOworCX0KKworCXBoeV9pZCA9ICh0bXAgPDwgMTYpICYgMHhmZmZmMDAwMDsKKworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChhY3RpdmVfcGh5X2FkZHIsIFBIWV9QSFlJRFIyLCAmdG1wKSkgeworCQlhY3RpdmVfcGh5X2FkZHIgPSAweGZmOworCQlyZXR1cm4oMCk7CisJfQorCisJcGh5X2lkIHw9IHRtcCAmIDB4MDAwMGZmZmY7CisKKwlzd2l0Y2ggKHBoeV9pZCkgeworCQljYXNlIFBIWV9MWFQ5NzI6CisJCQlzcHJpbnRmKHBoeS5uYW1lLCAiTFhUOTcyIEAgMHglMDJ4IiwgYWN0aXZlX3BoeV9hZGRyKTsKKwkJCXBoeS5pbml0ID0gbHh0OTcyX2luaXRfcGh5OworCQkJcGh5LmlzX3BoeV9jb25uZWN0ZWQgPSBseHQ5NzJfaXNfcGh5X2Nvbm5lY3RlZDsKKwkJCXBoeS5nZXRfbGlua19zcGVlZCA9IGx4dDk3Ml9nZXRfbGlua19zcGVlZDsKKwkJCXBoeS5hdXRvX25lZ290aWF0ZSA9IGx4dDk3Ml9hdXRvX25lZ290aWF0ZTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV9EUDgzODQ4OgorCQkJc3ByaW50ZihwaHkubmFtZSwgIkRQODM4NDggQCAweCUwMngiLCBhY3RpdmVfcGh5X2FkZHIpOworCQkJcGh5LmluaXQgPSBkcDgzODQ4X2luaXRfcGh5OworCQkJcGh5LmlzX3BoeV9jb25uZWN0ZWQgPSBkcDgzODQ4X2lzX3BoeV9jb25uZWN0ZWQ7CisJCQlwaHkuZ2V0X2xpbmtfc3BlZWQgPSBkcDgzODQ4X2dldF9saW5rX3NwZWVkOworCQkJcGh5LmF1dG9fbmVnb3RpYXRlID0gZHA4Mzg0OF9hdXRvX25lZ290aWF0ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwaHkubmFtZSwgIkdFTkVSSUMgQCAweCUwMngiLCBhY3RpdmVfcGh5X2FkZHIpOworCQkJcGh5LmluaXQgPSBnZW5faW5pdF9waHk7CisJCQlwaHkuaXNfcGh5X2Nvbm5lY3RlZCA9IGdlbl9pc19waHlfY29ubmVjdGVkOworCQkJcGh5LmdldF9saW5rX3NwZWVkID0gZ2VuX2dldF9saW5rX3NwZWVkOworCQkJcGh5LmF1dG9fbmVnb3RpYXRlID0gZ2VuX2F1dG9fbmVnb3RpYXRlOworCX0KKworCXJldHVybigxKTsKK30KKworCisvKiBFdGggZGV2aWNlIG9wZW4gKi8KK3N0YXRpYyBpbnQgZG02NDR4X2V0aF9vcGVuKHZvaWQpCit7CisJZHZfcmVnX3AJCWFkZHI7CisJdV9pbnQzMl90CQljbGtkaXYsIGNudDsKKwl2b2xhdGlsZSBlbWFjX2Rlc2MJKnJ4X2Rlc2M7CisKKwlkZWJ1Z19lbWFjKCIrIGVtYWNfb3BlblxuIik7CisKKwkvKiBSZXNldCBFTUFDIG1vZHVsZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzIGluIHdyYXBwZXIgKi8KKwlhZGFwX2VtYWMtPlNPRlRSRVNFVCA9IDE7CisJd2hpbGUgKGFkYXBfZW1hYy0+U09GVFJFU0VUICE9IDApIHs7fQorCWFkYXBfZXdyYXAtPkVXQ1RMID0gMDsKKwlmb3IgKGNudCA9IDA7IGNudCA8IDU7IGNudCsrKSB7CisJCWNsa2RpdiA9IGFkYXBfZXdyYXAtPkVXQ1RMOworCX0KKworCXJ4X2Rlc2MgPSBlbWFjX3J4X2Rlc2M7CisKKwlhZGFwX2VtYWMtPlRYQ09OVFJPTCA9IDB4MDE7CisJYWRhcF9lbWFjLT5SWENPTlRST0wgPSAweDAxOworCisJLyogU2V0IE1BQyBBZGRyZXNzZXMgJiBJbml0IG11bHRpY2FzdCBIYXNoIHRvIDAgKGRpc2FibGUgYW55IG11bHRpY2FzdCByZWNlaXZlKSAqLworCS8qIFVzaW5nIGNoYW5uZWwgMCBvbmx5IC0gb3RoZXIgY2hhbm5lbHMgYXJlIGRpc2FibGVkICovCisJYWRhcF9lbWFjLT5NQUNJTkRFWCA9IDA7CisJYWRhcF9lbWFjLT5NQUNBRERSSEkgPQorCQkoZG02NDR4X2V0aF9tYWNfYWRkclszXSA8PCAyNCkgfAorCQkoZG02NDR4X2V0aF9tYWNfYWRkclsyXSA8PCAxNikgfAorCQkoZG02NDR4X2V0aF9tYWNfYWRkclsxXSA8PCA4KSAgfAorCQkoZG02NDR4X2V0aF9tYWNfYWRkclswXSk7CisJYWRhcF9lbWFjLT5NQUNBRERSTE8gPQorCQkoZG02NDR4X2V0aF9tYWNfYWRkcls1XSA8PCA4KSB8CisJCShkbTY0NHhfZXRoX21hY19hZGRyWzRdKTsKKworCWFkYXBfZW1hYy0+TUFDSEFTSDEgPSAwOworCWFkYXBfZW1hYy0+TUFDSEFTSDIgPSAwOworCisJLyogU2V0IHNvdXJjZSBNQUMgYWRkcmVzcyAtIFJFUVVJUkVEICovCisJYWRhcF9lbWFjLT5NQUNTUkNBRERSSEkgPQorCQkoZG02NDR4X2V0aF9tYWNfYWRkclszXSA8PCAyNCkgfAorCQkoZG02NDR4X2V0aF9tYWNfYWRkclsyXSA8PCAxNikgfAorCQkoZG02NDR4X2V0aF9tYWNfYWRkclsxXSA8PCA4KSAgfAorCQkoZG02NDR4X2V0aF9tYWNfYWRkclswXSk7CisJYWRhcF9lbWFjLT5NQUNTUkNBRERSTE8gPQorCQkoZG02NDR4X2V0aF9tYWNfYWRkcls0XSA8PCA4KSB8CisJCShkbTY0NHhfZXRoX21hY19hZGRyWzVdKTsKKworCS8qIFNldCBETUEgOCBUWCAvIDggUlggSGVhZCBwb2ludGVycyB0byAwICovCisJYWRkciA9ICZhZGFwX2VtYWMtPlRYMEhEUDsKKwlmb3IoY250ID0gMDsgY250IDwgMTY7IGNudCsrKQorCQkqYWRkcisrID0gMDsKKworCWFkZHIgPSAmYWRhcF9lbWFjLT5SWDBIRFA7CisJZm9yKGNudCA9IDA7IGNudCA8IDE2OyBjbnQrKykKKwkJKmFkZHIrKyA9IDA7CisKKwkvKiBDbGVhciBTdGF0aXN0aWNzIChkbyB0aGlzIGJlZm9yZSBzZXR0aW5nIE1hY0NvbnRyb2wgcmVnaXN0ZXIpICovCisJYWRkciA9ICZhZGFwX2VtYWMtPlJYR09PREZSQU1FUzsKKwlmb3IoY250ID0gMDsgY250IDwgRU1BQ19OVU1fU1RBVFM7IGNudCsrKQorCQkqYWRkcisrID0gMDsKKworCS8qIE5vIG11bHRpY2FzdCBhZGRyZXNzaW5nICovCisJYWRhcF9lbWFjLT5NQUNIQVNIMSA9IDA7CisJYWRhcF9lbWFjLT5NQUNIQVNIMiA9IDA7CisKKwkvKiBDcmVhdGUgUlggcXVldWUgYW5kIHNldCByZWNlaXZlIHByb2Nlc3MgaW4gcGxhY2UgKi8KKwllbWFjX3J4X2FjdGl2ZV9oZWFkID0gZW1hY19yeF9kZXNjOworCWZvciAoY250ID0gMDsgY250IDwgRU1BQ19NQVhfUlhfQlVGRkVSUzsgY250KyspIHsKKwkJcnhfZGVzYy0+bmV4dCA9ICh1X2ludDMyX3QpKHJ4X2Rlc2MgKyAxKTsKKwkJcnhfZGVzYy0+YnVmZmVyID0gJmVtYWNfcnhfYnVmZmVyc1tjbnQgKiAoRU1BQ19NQVhfRVRIRVJORVRfUEtUX1NJWkUgKyBFTUFDX1BLVF9BTElHTildOworCQlyeF9kZXNjLT5idWZmX29mZl9sZW4gPSBFTUFDX01BWF9FVEhFUk5FVF9QS1RfU0laRTsKKwkJcnhfZGVzYy0+cGt0X2ZsYWdfbGVuID0gRU1BQ19DUFBJX09XTkVSU0hJUF9CSVQ7CisJCXJ4X2Rlc2MrKzsKKwl9CisKKwkvKiBTZXQgdGhlIGxhc3QgZGVzY3JpcHRvcidzICJuZXh0IiBwYXJhbWV0ZXIgdG8gMCB0byBlbmQgdGhlIFJYIGRlc2MgbGlzdCAqLworCXJ4X2Rlc2MtLTsKKwlyeF9kZXNjLT5uZXh0ID0gMDsKKwllbWFjX3J4X2FjdGl2ZV90YWlsID0gcnhfZGVzYzsKKwllbWFjX3J4X3F1ZXVlX2FjdGl2ZSA9IDE7CisKKwkvKiBFbmFibGUgVFgvUlggKi8KKwlhZGFwX2VtYWMtPlJYTUFYTEVOID0gRU1BQ19NQVhfRVRIRVJORVRfUEtUX1NJWkU7CisJYWRhcF9lbWFjLT5SWEJVRkZFUk9GRlNFVCA9IDA7CisKKwkvKiBObyBmYW5jeSBjb25maWdzIC0gVXNlIHRoaXMgZm9yIHByb21pc2NvdXMgZm9yIGRlYnVnIC0gRU1BQ19SWE1CUEVOQUJMRV9SWENBRkVOX0VOQUJMRSAqLworCWFkYXBfZW1hYy0+UlhNQlBFTkFCTEUgPSBFTUFDX1JYTUJQRU5BQkxFX1JYQlJPQURFTjsKKworCS8qIEVuYWJsZSBjaCAwIG9ubHkgKi8KKwlhZGFwX2VtYWMtPlJYVU5JQ0FTVFNFVCA9IDB4MDE7CisKKwkvKiBFbmFibGUgTUlJIGludGVyZmFjZSBhbmQgRnVsbCBkdXBsZXggbW9kZSAqLworCWFkYXBfZW1hYy0+TUFDQ09OVFJPTCA9IChFTUFDX01BQ0NPTlRST0xfTUlJRU5fRU5BQkxFIHwgRU1BQ19NQUNDT05UUk9MX0ZVTExEVVBMRVhfRU5BQkxFKTsKKworCS8qIEluaXQgTURJTyAmIGdldCBsaW5rIHN0YXRlICovCisJY2xrZGl2ID0gKEVNQUNfTURJT19CVVNfRlJFUSAvIEVNQUNfTURJT19DTE9DS19GUkVRKSAtIDE7CisJYWRhcF9tZGlvLT5DT05UUk9MID0gKChjbGtkaXYgJiAweGZmKSB8IE1ESU9fQ09OVFJPTF9FTkFCTEUgfCBNRElPX0NPTlRST0xfRkFVTFQpOworCisJaWYgKCFwaHkuZ2V0X2xpbmtfc3BlZWQoYWN0aXZlX3BoeV9hZGRyKSkKKwkJcmV0dXJuKDApOworCisJLyogU3RhcnQgcmVjZWl2ZSBwcm9jZXNzICovCisJYWRhcF9lbWFjLT5SWDBIRFAgPSAodV9pbnQzMl90KWVtYWNfcnhfZGVzYzsKKworCWRlYnVnX2VtYWMoIi0gZW1hY19vcGVuXG4iKTsKKworCXJldHVybigxKTsKK30KKworLyogRU1BQyBDaGFubmVsIFRlYXJkb3duICovCitzdGF0aWMgdm9pZCBkbTY0NHhfZXRoX2NoX3RlYXJkb3duKGludCBjaCkKK3sKKwlkdl9yZWcJCWRseSA9IDB4ZmY7CisJZHZfcmVnCQljbnQ7CisKKwlkZWJ1Z19lbWFjKCIrIGVtYWNfY2hfdGVhcmRvd25cbiIpOworCisJaWYgKGNoID09IEVNQUNfQ0hfVFgpIHsKKwkJLyogSW5pdCBUWCBjaGFubmVsIHRlYXJkb3duICovCisJCWFkYXBfZW1hYy0+VFhURUFSRE9XTiA9IDE7CisJCWZvcihjbnQgPSAwOyBjbnQgIT0gMHhmZmZmZmZmYzsgY250ID0gYWRhcF9lbWFjLT5UWDBDUCkgeworCQkJLyogV2FpdCBoZXJlIGZvciBUeCB0ZWFyZG93biBjb21wbGV0aW9uIGludGVycnVwdCB0byBvY2N1cgorCQkJICogTm90ZTogQSB0YXNrIGRlbGF5IGNhbiBiZSBjYWxsZWQgaGVyZSB0byBwZW5kIHJhdGhlciB0aGFuCisJCQkgKiBvY2N1cHlpbmcgQ1BVIGN5Y2xlcyAtIGFueXdheSBpdCBoYXMgYmVlbiBmb3VuZCB0aGF0IHRlYXJkb3duCisJCQkgKiB0YWtlcyB2ZXJ5IGZldyBjcHUgY3ljbGVzIGFuZCBkb2VzIG5vdCBhZmZlY3QgZnVuY3Rpb25hbGl0eSAqLworCQkJIGRseS0tOworCQkJIHVkZWxheSgxKTsKKwkJCSBpZiAoZGx5ID09IDApCisJCQkgCWJyZWFrOworCQl9CisJCWFkYXBfZW1hYy0+VFgwQ1AgPSBjbnQ7CisJCWFkYXBfZW1hYy0+VFgwSERQID0gMDsKKwl9IGVsc2UgeworCQkvKiBJbml0IFJYIGNoYW5uZWwgdGVhcmRvd24gKi8KKwkJYWRhcF9lbWFjLT5SWFRFQVJET1dOID0gMTsKKwkJZm9yKGNudCA9IDA7IGNudCAhPSAweGZmZmZmZmZjOyBjbnQgPSBhZGFwX2VtYWMtPlJYMENQKSB7CisJCQkvKiBXYWl0IGhlcmUgZm9yIFJ4IHRlYXJkb3duIGNvbXBsZXRpb24gaW50ZXJydXB0IHRvIG9jY3VyCisJCQkgKiBOb3RlOiBBIHRhc2sgZGVsYXkgY2FuIGJlIGNhbGxlZCBoZXJlIHRvIHBlbmQgcmF0aGVyIHRoYW4KKwkJCSAqIG9jY3VweWluZyBDUFUgY3ljbGVzIC0gYW55d2F5IGl0IGhhcyBiZWVuIGZvdW5kIHRoYXQgdGVhcmRvd24KKwkJCSAqIHRha2VzIHZlcnkgZmV3IGNwdSBjeWNsZXMgYW5kIGRvZXMgbm90IGFmZmVjdCBmdW5jdGlvbmFsaXR5ICovCisJCQkgZGx5LS07CisJCQkgdWRlbGF5KDEpOworCQkJIGlmIChkbHkgPT0gMCkKKwkJCSAJYnJlYWs7CisJCX0KKwkJYWRhcF9lbWFjLT5SWDBDUCA9IGNudDsKKwkJYWRhcF9lbWFjLT5SWDBIRFAgPSAwOworCX0KKworCWRlYnVnX2VtYWMoIi0gZW1hY19jaF90ZWFyZG93blxuIik7Cit9CisKKy8qIEV0aCBkZXZpY2UgY2xvc2UgKi8KK3N0YXRpYyBpbnQgZG02NDR4X2V0aF9jbG9zZSh2b2lkKQoreworCWRlYnVnX2VtYWMoIisgZW1hY19jbG9zZVxuIik7CisKKwlkbTY0NHhfZXRoX2NoX3RlYXJkb3duKEVNQUNfQ0hfVFgpOwkvKiBUWCBDaGFubmVsIHRlYXJkb3duICovCisJZG02NDR4X2V0aF9jaF90ZWFyZG93bihFTUFDX0NIX1JYKTsJLyogUlggQ2hhbm5lbCB0ZWFyZG93biAqLworCisJLyogUmVzZXQgRU1BQyBtb2R1bGUgYW5kIGRpc2FibGUgaW50ZXJydXB0cyBpbiB3cmFwcGVyICovCisJYWRhcF9lbWFjLT5TT0ZUUkVTRVQgPSAxOworCWFkYXBfZXdyYXAtPkVXQ1RMID0gMDsKKworCWRlYnVnX2VtYWMoIi0gZW1hY19jbG9zZVxuIik7CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50IHR4X3NlbmRfbG9vcCA9IDA7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgc2luZ2xlIHBhY2tldCBvbiB0aGUgbmV0d29yayBhbmQgcmV0dXJucworICogcG9zaXRpdmUgbnVtYmVyIChudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQpIG9yIG5lZ2F0aXZlIGZvciBlcnJvcgorICovCitzdGF0aWMgaW50IGRtNjQ0eF9ldGhfc2VuZF9wYWNrZXQodm9sYXRpbGUgdm9pZCAqcGFja2V0LCBpbnQgbGVuZ3RoKQoreworCWludCByZXRfc3RhdHVzID0gLTE7CisJdHhfc2VuZF9sb29wID0gMDsKKworCS8qIFJldHVybiBlcnJvciBpZiBubyBsaW5rICovCisJaWYgKCFwaHkuZ2V0X2xpbmtfc3BlZWQoYWN0aXZlX3BoeV9hZGRyKSkKKwl7CisJCXByaW50ZigiV0FSTjogZW1hY19zZW5kX3BhY2tldDogTm8gbGlua1xuIik7CisJCXJldHVybiAocmV0X3N0YXR1cyk7CisJfQorCisJLyogQ2hlY2sgcGFja2V0IHNpemUgYW5kIGlmIDwgRU1BQ19NSU5fRVRIRVJORVRfUEtUX1NJWkUsIHBhZCBpdCB1cCAqLworCWlmIChsZW5ndGggPCBFTUFDX01JTl9FVEhFUk5FVF9QS1RfU0laRSkKKwl7CisJCWxlbmd0aCA9IEVNQUNfTUlOX0VUSEVSTkVUX1BLVF9TSVpFOworCX0KKworCS8qIFBvcHVsYXRlIHRoZSBUWCBkZXNjcmlwdG9yICovCisJZW1hY190eF9kZXNjLT5uZXh0ICAgICAgICAgPSAwOworCWVtYWNfdHhfZGVzYy0+YnVmZmVyICAgICAgID0gKHVfaW50OF90ICopcGFja2V0OworCWVtYWNfdHhfZGVzYy0+YnVmZl9vZmZfbGVuID0gKGxlbmd0aCAmIDB4ZmZmZik7CisJZW1hY190eF9kZXNjLT5wa3RfZmxhZ19sZW4gPSAoKGxlbmd0aCAmIDB4ZmZmZikgfAorCQkJRU1BQ19DUFBJX1NPUF9CSVQgfAorCQkJRU1BQ19DUFBJX09XTkVSU0hJUF9CSVQgfAorCQkJRU1BQ19DUFBJX0VPUF9CSVQpOworCS8qIFNlbmQgdGhlIHBhY2tldCAqLworCWFkYXBfZW1hYy0+VFgwSERQID0gKHVuc2lnbmVkIGludCllbWFjX3R4X2Rlc2M7CisKKwkvKiBXYWl0IGZvciBwYWNrZXQgdG8gY29tcGxldGUgb3IgbGluayBkb3duICovCisJd2hpbGUgKDEpIHsKKwkgICAgICAgIGlmICghcGh5LmdldF9saW5rX3NwZWVkKGFjdGl2ZV9waHlfYWRkcikpIHsKKwkgICAgICAgIAlkbTY0NHhfZXRoX2NoX3RlYXJkb3duKEVNQUNfQ0hfVFgpOworCSAgICAgICAgCXJldHVybiAocmV0X3N0YXR1cyk7CisJICAgICAgICB9CisJICAgICAgICBpZiAoYWRhcF9lbWFjLT5UWElOVFNUQVRSQVcgJiAweDAxKSB7CisJICAgICAgICAJcmV0X3N0YXR1cyA9IGxlbmd0aDsKKwkgICAgICAgIAlicmVhazsKKwkJfQorCSAgICAgICAgdHhfc2VuZF9sb29wKys7CisJfQorCisJcmV0dXJuKHJldF9zdGF0dXMpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlY2VpcHQgb2YgYSBwYWNrZXQgZnJvbSB0aGUgbmV0d29yaworICovCitzdGF0aWMgaW50IGRtNjQ0eF9ldGhfcmN2X3BhY2tldCh2b2lkKQoreworCXZvbGF0aWxlIGVtYWNfZGVzYwkqcnhfY3Vycl9kZXNjOworCXZvbGF0aWxlIGVtYWNfZGVzYwkqY3Vycl9kZXNjOworCXZvbGF0aWxlIGVtYWNfZGVzYwkqdGFpbF9kZXNjOworCWludAkJCXN0YXR1cywgcmV0ID0gLTE7CisKKwlyeF9jdXJyX2Rlc2MgPSBlbWFjX3J4X2FjdGl2ZV9oZWFkOworCXN0YXR1cyA9IHJ4X2N1cnJfZGVzYy0+cGt0X2ZsYWdfbGVuOworCWlmICgocnhfY3Vycl9kZXNjKSAmJiAoKHN0YXR1cyAmIEVNQUNfQ1BQSV9PV05FUlNISVBfQklUKSA9PSAwKSkgeworCSAgICAgICAgaWYgKHN0YXR1cyAmIEVNQUNfQ1BQSV9SWF9FUlJPUl9GUkFNRSkgeworCSAgICAgICAgCS8qIEVycm9yIGluIHBhY2tldCAtIGRpc2NhcmQgaXQgYW5kIHJlcXVldWUgZGVzYyAqLworCSAgICAgICAgCXByaW50ZigiV0FSTjogZW1hY19yY3ZfcGt0OiBFcnJvciBpbiBwYWNrZXRcbiIpOworCQl9IGVsc2UgeworCQkJTmV0UmVjZWl2ZShyeF9jdXJyX2Rlc2MtPmJ1ZmZlciwgKHJ4X2N1cnJfZGVzYy0+YnVmZl9vZmZfbGVuICYgMHhmZmZmKSk7CisJCQlyZXQgPSByeF9jdXJyX2Rlc2MtPmJ1ZmZfb2ZmX2xlbiAmIDB4ZmZmZjsKKwkgICAgICAgIH0KKworCSAgICAgICAgLyogQWNrIHJlY2VpdmVkIHBhY2tldCBkZXNjcmlwdG9yICovCisJICAgICAgICBhZGFwX2VtYWMtPlJYMENQID0gKHVuc2lnbmVkIGludClyeF9jdXJyX2Rlc2M7CisJICAgICAgICBjdXJyX2Rlc2MgPSByeF9jdXJyX2Rlc2M7CisJICAgICAgICBlbWFjX3J4X2FjdGl2ZV9oZWFkID0gKHZvbGF0aWxlIGVtYWNfZGVzYyAqKXJ4X2N1cnJfZGVzYy0+bmV4dDsKKworCSAgICAgICAgaWYgKHN0YXR1cyAmIEVNQUNfQ1BQSV9FT1FfQklUKSB7CisJICAgICAgICAJaWYgKGVtYWNfcnhfYWN0aXZlX2hlYWQpIHsKKwkgICAgICAgIAkJYWRhcF9lbWFjLT5SWDBIRFAgPSAodW5zaWduZWQgaW50KWVtYWNfcnhfYWN0aXZlX2hlYWQ7CisJCQl9IGVsc2UgeworCQkJCWVtYWNfcnhfcXVldWVfYWN0aXZlID0gMDsKKwkJCQlwcmludGYoIklORk86ZW1hY19yY3ZfcGFja2V0OiBSWCBRdWV1ZSBub3QgYWN0aXZlXG4iKTsKKwkJCX0KKwkJfQorCisJCS8qIFJlY3ljbGUgUlggZGVzY3JpcHRvciAqLworCQlyeF9jdXJyX2Rlc2MtPmJ1ZmZfb2ZmX2xlbiA9IEVNQUNfTUFYX0VUSEVSTkVUX1BLVF9TSVpFOworCQlyeF9jdXJyX2Rlc2MtPnBrdF9mbGFnX2xlbiA9IEVNQUNfQ1BQSV9PV05FUlNISVBfQklUOworCQlyeF9jdXJyX2Rlc2MtPm5leHQgPSAwOworCisJCWlmIChlbWFjX3J4X2FjdGl2ZV9oZWFkID09IDApIHsKKwkJCXByaW50ZigiSU5GTzogZW1hY19yY3ZfcGt0OiBhY3RpdmUgcXVldWUgaGVhZCA9IDBcbiIpOworCQkJZW1hY19yeF9hY3RpdmVfaGVhZCA9IGN1cnJfZGVzYzsKKwkJCWVtYWNfcnhfYWN0aXZlX3RhaWwgPSBjdXJyX2Rlc2M7CisJCQlpZiAoZW1hY19yeF9xdWV1ZV9hY3RpdmUgIT0gMCkgeworCQkJCWFkYXBfZW1hYy0+UlgwSERQID0gKHVuc2lnbmVkIGludCllbWFjX3J4X2FjdGl2ZV9oZWFkOworCQkJCXByaW50ZigiSU5GTzogZW1hY19yY3ZfcGt0OiBhY3RpdmUgcXVldWUgaGVhZCA9IDAsIEhEUCBmaXJlZFxuIik7CisJCQkJZW1hY19yeF9xdWV1ZV9hY3RpdmUgPSAxOworCQkJfQorCQl9IGVsc2UgeworCQkJdGFpbF9kZXNjID0gZW1hY19yeF9hY3RpdmVfdGFpbDsKKwkJCWVtYWNfcnhfYWN0aXZlX3RhaWwgPSBjdXJyX2Rlc2M7CisJCQl0YWlsX2Rlc2MtPm5leHQgPSAodW5zaWduZWQgaW50KWN1cnJfZGVzYzsKKwkJCXN0YXR1cyA9IHRhaWxfZGVzYy0+cGt0X2ZsYWdfbGVuOworCQkJaWYgKHN0YXR1cyAmIEVNQUNfQ1BQSV9FT1FfQklUKSB7CisJCQkJYWRhcF9lbWFjLT5SWDBIRFAgPSAodW5zaWduZWQgaW50KWN1cnJfZGVzYzsKKwkJCQlzdGF0dXMgJj0gfkVNQUNfQ1BQSV9FT1FfQklUOworCQkJCXRhaWxfZGVzYy0+cGt0X2ZsYWdfbGVuID0gc3RhdHVzOworCQkJfQorCQl9CisJCXJldHVybihyZXQpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfQ01EX05FVCAqLworCisjZW5kaWYgLyogQ09ORklHX0RSSVZFUl9USV9FTUFDICovCmRpZmYgLS1naXQgYS9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvaTJjLmMgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5ZGMwMwotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9pMmMuYwpAQCAtMCwwICsxLDM1MSBAQAorLyoKKyAqIFRJIERhVmluY2kgKFRNUzMyMERNNjQ0eCkgSTJDIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfRFJJVkVSX0RBVklOQ0lfSTJDCisKKyNpbmNsdWRlIDxpMmMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2kyY19kZWZzLmg+CisKKyNkZWZpbmUgQ0hFQ0tfTkFDSygpIFwKKwlkbyB7XAorCQlpZiAodG1wICYgKEkyQ19USU1FT1VUIHwgSTJDX1NUQVRfTkFDSykpIHtcCisJCQlSRUcoSTJDX0NPTikgPSAwO1wKKwkJCXJldHVybigxKTtcCisJCX1cCisJfSB3aGlsZSAoMCkKKworCitzdGF0aWMgaW50IHdhaXRfZm9yX2J1cyh2b2lkKQoreworCWludAlzdGF0LCB0aW1lb3V0OworCisJUkVHKEkyQ19TVEFUKSA9IDB4ZmZmZjsKKworCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCAxMDsgdGltZW91dCsrKSB7CisJCWlmICghKChzdGF0ID0gUkVHKEkyQ19TVEFUKSkgJiBJMkNfU1RBVF9CQikpIHsKKwkJCVJFRyhJMkNfU1RBVCkgPSAweGZmZmY7CisJCQlyZXR1cm4oMCk7CisJCX0KKworCQlSRUcoSTJDX1NUQVQpID0gc3RhdDsKKwkJdWRlbGF5KDUwMDAwKTsKKwl9CisKKwlSRUcoSTJDX1NUQVQpID0gMHhmZmZmOworCXJldHVybigxKTsKK30KKworCitzdGF0aWMgaW50IHBvbGxfaTJjX2lycShpbnQgbWFzaykKK3sKKwlpbnQJc3RhdCwgdGltZW91dDsKKworCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCAxMDsgdGltZW91dCsrKSB7CisJCXVkZWxheSgxMDAwKTsKKwkJc3RhdCA9IFJFRyhJMkNfU1RBVCk7CisJCWlmIChzdGF0ICYgbWFzaykgeworCQkJcmV0dXJuKHN0YXQpOworCQl9CisJfQorCisJUkVHKEkyQ19TVEFUKSA9IDB4ZmZmZjsKKwlyZXR1cm4oc3RhdCB8IEkyQ19USU1FT1VUKTsKK30KKworCit2b2lkIGZsdXNoX3J4KHZvaWQpCit7CisJaW50CWR1bW15OworCisJd2hpbGUgKDEpIHsKKwkJaWYgKCEoUkVHKEkyQ19TVEFUKSAmIEkyQ19TVEFUX1JSRFkpKQorCQkJYnJlYWs7CisKKwkJZHVtbXkgPSBSRUcoSTJDX0RSUik7CisJCVJFRyhJMkNfU1RBVCkgPSBJMkNfU1RBVF9SUkRZOworCQl1ZGVsYXkoMTAwMCk7CisJfQorfQorCisKK3ZvaWQgaTJjX2luaXQoaW50IHNwZWVkLCBpbnQgc2xhdmVhZGQpCit7CisJdV9pbnQzMl90CWRpdiwgcHNjOworCisJaWYgKFJFRyhJMkNfQ09OKSAmIEkyQ19DT05fRU4pIHsKKwkJUkVHKEkyQ19DT04pID0gMDsKKwkJdWRlbGF5ICg1MDAwMCk7CisJfQorCisJcHNjID0gMjsKKwlkaXYgPSAoQ0ZHX0haX0NMT0NLIC8gKChwc2MgKyAxKSAqIHNwZWVkKSkgLSAxMDsJLyogU0NMTCArIFNDTEggKi8KKwlSRUcoSTJDX1BTQykgPSBwc2M7CQkJLyogMjdNSHogLyAoMiArIDEpID0gOU1IeiAqLworCVJFRyhJMkNfU0NMTCkgPSAoZGl2ICogNTApIC8gMTAwOwkvKiA1MCUgRHV0eSAqLworCVJFRyhJMkNfU0NMSCkgPSBkaXYgLSBSRUcoSTJDX1NDTEwpOworCisJUkVHKEkyQ19PQSkgPSBzbGF2ZWFkZDsKKwlSRUcoSTJDX0NOVCkgPSAwOworCisJLyogSW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgb3IgSTJDIG1vZHVsZSB3b24ndCB3b3JrICovCisJUkVHKEkyQ19JRSkgPSBJMkNfSUVfU0NEX0lFIHwgSTJDX0lFX1hSRFlfSUUgfAorCQlJMkNfSUVfUlJEWV9JRSB8IEkyQ19JRV9BUkRZX0lFIHwgSTJDX0lFX05BQ0tfSUU7CisKKwkvKiBOb3cgZW5hYmxlIEkyQyBjb250cm9sbGVyIChnZXQgaXQgb3V0IG9mIHJlc2V0KSAqLworCVJFRyhJMkNfQ09OKSA9IEkyQ19DT05fRU47CisKKwl1ZGVsYXkoMTAwMCk7Cit9CisKKworaW50IGkyY19wcm9iZSh1X2ludDhfdCBjaGlwKQoreworCWludAlyYyA9IDE7CisKKwlpZiAoY2hpcCA9PSBSRUcoSTJDX09BKSkgeworCQlyZXR1cm4ocmMpOworCX0KKworCVJFRyhJMkNfQ09OKSA9IDA7CisJaWYgKHdhaXRfZm9yX2J1cygpKSB7cmV0dXJuKDEpO30KKworCS8qIHRyeSB0byByZWFkIG9uZSBieXRlIGZyb20gY3VycmVudCAob3Igb25seSkgYWRkcmVzcyAqLworCVJFRyhJMkNfQ05UKSA9IDE7CisJUkVHKEkyQ19TQSkgPSBjaGlwOworCVJFRyhJMkNfQ09OKSA9IChJMkNfQ09OX0VOIHwgSTJDX0NPTl9NU1QgfCBJMkNfQ09OX1NUVCB8IEkyQ19DT05fU1RQKTsKKwl1ZGVsYXkgKDUwMDAwKTsKKworCWlmICghKFJFRyhJMkNfU1RBVCkgJiBJMkNfU1RBVF9OQUNLKSkgeworCQlyYyA9IDA7CisJCWZsdXNoX3J4KCk7CisJCVJFRyhJMkNfU1RBVCkgPSAweGZmZmY7CisJfSBlbHNlIHsKKwkJUkVHKEkyQ19TVEFUKSA9IDB4ZmZmZjsKKwkJUkVHKEkyQ19DT04pIHw9IEkyQ19DT05fU1RQOworCQl1ZGVsYXkoMjAwMDApOworCQlpZiAod2FpdF9mb3JfYnVzKCkpIHtyZXR1cm4oMSk7fQorCX0KKworCWZsdXNoX3J4KCk7CisJUkVHKEkyQ19TVEFUKSA9IDB4ZmZmZjsKKwlSRUcoSTJDX0NOVCkgPSAwOworCXJldHVybihyYyk7Cit9CisKKworaW50IGkyY19yZWFkKHVfaW50OF90IGNoaXAsIHVfaW50MzJfdCBhZGRyLCBpbnQgYWxlbiwgdV9pbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKwl1X2ludDMyX3QJdG1wOworCWludAkJaTsKKworCWlmICgoYWxlbiA8IDApIHx8IChhbGVuID4gMikpIHsKKwkJcHJpbnRmKCIlcygpOiBib2d1cyBhZGRyZXNzIGxlbmd0aCAleFxuIiwgX19GVU5DVElPTl9fLCBhbGVuKTsKKwkJcmV0dXJuKDEpOworCX0KKworCWlmICh3YWl0X2Zvcl9idXMoKSkge3JldHVybigxKTt9CisKKwlpZiAoYWxlbiAhPSAwKSB7CisJCS8qIFN0YXJ0IGFkZHJlc3MgcGhhc2UgKi8KKwkJdG1wID0gSTJDX0NPTl9FTiB8IEkyQ19DT05fTVNUIHwgSTJDX0NPTl9TVFQgfCBJMkNfQ09OX1RSWDsKKwkJUkVHKEkyQ19DTlQpID0gYWxlbjsKKwkJUkVHKEkyQ19TQSkgPSBjaGlwOworCQlSRUcoSTJDX0NPTikgPSB0bXA7CisKKwkJdG1wID0gcG9sbF9pMmNfaXJxKEkyQ19TVEFUX1hSRFkgfCBJMkNfU1RBVF9OQUNLKTsKKworCQlDSEVDS19OQUNLKCk7CisKKwkJc3dpdGNoIChhbGVuKSB7CisJCQljYXNlIDI6CisJCQkJLyogU2VuZCBhZGRyZXNzIE1TQnl0ZSAqLworCQkJCWlmICh0bXAgJiBJMkNfU1RBVF9YUkRZKSB7CisJCQkJCVJFRyhJMkNfRFhSKSA9IChhZGRyID4+IDgpICYgMHhmZjsKKwkJCQl9IGVsc2UgeworCQkJCQlSRUcoSTJDX0NPTikgPSAwOworCQkJCQlyZXR1cm4oMSk7CisJCQkJfQorCisJCQkJdG1wID0gcG9sbF9pMmNfaXJxKEkyQ19TVEFUX1hSRFkgfCBJMkNfU1RBVF9OQUNLKTsKKworCQkJCUNIRUNLX05BQ0soKTsKKwkJCQkvKiBObyBicmVhaywgZmFsbCB0aHJvdWdoICovCisJCQljYXNlIDE6CisJCQkJLyogU2VuZCBhZGRyZXNzIExTQnl0ZSAqLworCQkJCWlmICh0bXAgJiBJMkNfU1RBVF9YUkRZKSB7CisJCQkJCVJFRyhJMkNfRFhSKSA9IGFkZHIgJiAweGZmOworCQkJCX0gZWxzZSB7CisJCQkJCVJFRyhJMkNfQ09OKSA9IDA7CisJCQkJCXJldHVybigxKTsKKwkJCQl9CisKKwkJCQl0bXAgPSBwb2xsX2kyY19pcnEoSTJDX1NUQVRfWFJEWSB8IEkyQ19TVEFUX05BQ0sgfCBJMkNfU1RBVF9BUkRZKTsKKworCQkJCUNIRUNLX05BQ0soKTsKKworCQkJCWlmICghKHRtcCAmIEkyQ19TVEFUX0FSRFkpKSB7CisJCQkJCVJFRyhJMkNfQ09OKSA9IDA7CisJCQkJCXJldHVybigxKTsKKwkJCQl9CisJCX0KKwl9CisKKwkvKiBBZGRyZXNzIHBoYXNlIGlzIG92ZXIsIG5vdyByZWFkICdsZW4nIGJ5dGVzIGFuZCBzdG9wICovCisJdG1wID0gSTJDX0NPTl9FTiB8IEkyQ19DT05fTVNUIHwgSTJDX0NPTl9TVFQgfCBJMkNfQ09OX1NUUDsKKwlSRUcoSTJDX0NOVCkgPSBsZW4gJiAweGZmZmY7CisJUkVHKEkyQ19TQSkgPSBjaGlwOworCVJFRyhJMkNfQ09OKSA9IHRtcDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQl0bXAgPSBwb2xsX2kyY19pcnEoSTJDX1NUQVRfUlJEWSB8IEkyQ19TVEFUX05BQ0sgfCBJMkNfU1RBVF9ST1ZSKTsKKworCQlDSEVDS19OQUNLKCk7CisKKwkJaWYgKHRtcCAmIEkyQ19TVEFUX1JSRFkpIHsKKwkJCWJ1ZltpXSA9IFJFRyhJMkNfRFJSKTsKKwkJfSBlbHNlIHsKKwkJCVJFRyhJMkNfQ09OKSA9IDA7CisJCQlyZXR1cm4oMSk7CisJCX0KKwl9CisKKwl0bXAgPSBwb2xsX2kyY19pcnEoSTJDX1NUQVRfU0NEIHwgSTJDX1NUQVRfTkFDSyk7CisKKwlDSEVDS19OQUNLKCk7CisKKwlpZiAoISh0bXAgJiBJMkNfU1RBVF9TQ0QpKSB7CisJCVJFRyhJMkNfQ09OKSA9IDA7CisJCXJldHVybigxKTsKKwl9CisKKwlmbHVzaF9yeCgpOworCVJFRyhJMkNfU1RBVCkgPSAweGZmZmY7CisJUkVHKEkyQ19DTlQpID0gMDsKKwlSRUcoSTJDX0NPTikgPSAwOworCisJcmV0dXJuKDApOworfQorCisKK2ludCBpMmNfd3JpdGUodV9pbnQ4X3QgY2hpcCwgdV9pbnQzMl90IGFkZHIsIGludCBhbGVuLCB1X2ludDhfdCAqYnVmLCBpbnQgbGVuKQoreworCXVfaW50MzJfdAl0bXA7CisJaW50CQlpOworCisJaWYgKChhbGVuIDwgMCkgfHwgKGFsZW4gPiAyKSkgeworCQlwcmludGYoIiVzKCk6IGJvZ3VzIGFkZHJlc3MgbGVuZ3RoICV4XG4iLCBfX0ZVTkNUSU9OX18sIGFsZW4pOworCQlyZXR1cm4oMSk7CisJfQorCWlmIChsZW4gPCAwKSB7CisJCXByaW50ZigiJXMoKTogYm9ndXMgbGVuZ3RoICV4XG4iLCBfX0ZVTkNUSU9OX18sIGxlbik7CisJCXJldHVybigxKTsKKwl9CisKKwlpZiAod2FpdF9mb3JfYnVzKCkpIHtyZXR1cm4oMSk7fQorCisJLyogU3RhcnQgYWRkcmVzcyBwaGFzZSAqLworCXRtcCA9IEkyQ19DT05fRU4gfCBJMkNfQ09OX01TVCB8IEkyQ19DT05fU1RUIHwgSTJDX0NPTl9UUlggfCBJMkNfQ09OX1NUUDsKKwlSRUcoSTJDX0NOVCkgPSAoYWxlbiA9PSAwKSA/IGxlbiAmIDB4ZmZmZiA6IChsZW4gJiAweGZmZmYpICsgYWxlbjsKKwlSRUcoSTJDX1NBKSA9IGNoaXA7CisJUkVHKEkyQ19DT04pID0gdG1wOworCisJc3dpdGNoIChhbGVuKSB7CisJCWNhc2UgMjoKKwkJCS8qIFNlbmQgYWRkcmVzcyBNU0J5dGUgKi8KKwkJCXRtcCA9IHBvbGxfaTJjX2lycShJMkNfU1RBVF9YUkRZIHwgSTJDX1NUQVRfTkFDSyk7CisKKwkJCUNIRUNLX05BQ0soKTsKKworCQkJaWYgKHRtcCAmIEkyQ19TVEFUX1hSRFkpIHsKKwkJCQlSRUcoSTJDX0RYUikgPSAoYWRkciA+PiA4KSAmIDB4ZmY7CisJCQl9IGVsc2UgeworCQkJCVJFRyhJMkNfQ09OKSA9IDA7CisJCQkJcmV0dXJuKDEpOworCQkJfQorCQkJLyogTm8gYnJlYWssIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIDE6CisJCQkvKiBTZW5kIGFkZHJlc3MgTFNCeXRlICovCisJCQl0bXAgPSBwb2xsX2kyY19pcnEoSTJDX1NUQVRfWFJEWSB8IEkyQ19TVEFUX05BQ0spOworCisJCQlDSEVDS19OQUNLKCk7CisKKwkJCWlmICh0bXAgJiBJMkNfU1RBVF9YUkRZKSB7CisJCQkJUkVHKEkyQ19EWFIpID0gYWRkciAmIDB4ZmY7CisJCQl9IGVsc2UgeworCQkJCVJFRyhJMkNfQ09OKSA9IDA7CisJCQkJcmV0dXJuKDEpOworCQkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQl0bXAgPSBwb2xsX2kyY19pcnEoSTJDX1NUQVRfWFJEWSB8IEkyQ19TVEFUX05BQ0spOworCisJCUNIRUNLX05BQ0soKTsKKworCQlpZiAodG1wICYgSTJDX1NUQVRfWFJEWSkgeworCQkJUkVHKEkyQ19EWFIpID0gYnVmW2ldOworCQl9IGVsc2UgeworCQkJcmV0dXJuKDEpOworCQl9CisJfQorCisJdG1wID0gcG9sbF9pMmNfaXJxKEkyQ19TVEFUX1NDRCB8IEkyQ19TVEFUX05BQ0spOworCisJQ0hFQ0tfTkFDSygpOworCisJaWYgKCEodG1wICYgSTJDX1NUQVRfU0NEKSkgeworCQlSRUcoSTJDX0NPTikgPSAwOworCQlyZXR1cm4oMSk7CisJfQorCisJZmx1c2hfcngoKTsKKwlSRUcoSTJDX1NUQVQpID0gMHhmZmZmOworCVJFRyhJMkNfQ05UKSA9IDA7CisJUkVHKEkyQ19DT04pID0gMDsKKworCXJldHVybigwKTsKK30KKworCit1X2ludDhfdCBpMmNfcmVnX3JlYWQodV9pbnQ4X3QgY2hpcCwgdV9pbnQ4X3QgcmVnKQoreworCXVfaW50OF90CXRtcDsKKworCWkyY19yZWFkKGNoaXAsIHJlZywgMSwgJnRtcCwgMSk7CisJcmV0dXJuKHRtcCk7Cit9CisKKwordm9pZCBpMmNfcmVnX3dyaXRlKHVfaW50OF90IGNoaXAsIHVfaW50OF90IHJlZywgdV9pbnQ4X3QgdmFsKQoreworCXVfaW50OF90CXRtcDsKKworCWkyY193cml0ZShjaGlwLCByZWcsIDEsICZ0bXAsIDEpOworfQorCisjZW5kaWYgLyogQ09ORklHX0RSSVZFUl9EQVZJTkNJX0kyQyAqLwpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyNmVqcy9kYXZpbmNpL2xvd2xldmVsX2luaXQuUyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9sb3dsZXZlbF9pbml0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3YzExMgotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9sb3dsZXZlbF9pbml0LlMKQEAgLTAsMCArMSw3MDcgQEAKKy8qCisgKiBMb3ctbGV2ZWwgYm9hcmQgc2V0dXAgY29kZSBmb3IgVEkgRGFWaW5jaSBTb0MgYmFzZWQgYm9hcmRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBQYXJ0aWFsbHkgYmFzZWQgb24gVEkgc291cmNlcywgb3JpZ2luYWwgY29weXJpZ2h0cyBmb2xsb3c6CisgKi8KKworLyoKKyAqIEJvYXJkIHNwZWNpZmljIHNldHVwIGluZm8KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDMKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIEtzaGl0aWogR3VwdGEgPEtzaGl0aWpAdGkuY29tPgorICoKKyAqIE1vZGlmaWVkIGZvciBPTUFQIDE2MTAgSDIgYm9hcmQgYnkgTmlzaGFudCBLYW1hdCwgSmFuIDIwMDQKKyAqCisgKiBNb2RpZmllZCBmb3IgT01BUCA1OTEyIE9TSyBib2FyZCBieSBSaXNoaSBCaGF0dGFjaGFyeWEsIEFwciAyMDA0CisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBNb2RpZmllZCBmb3IgRFYtRVZNIGJvYXJkIGJ5IFJpc2hpIEJoYXR0YWNoYXJ5YSwgQXByIDIwMDUKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIE1vZGlmaWVkIGZvciBEVi1FVk0gYm9hcmQgYnkgU3dhbWluYXRoYW4gUywgTm92IDIwMDUKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworLmdsb2JsCWxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogTWFzayBhbGwgSVJRcyBieSBzZXR0aW5nIGFsbCBiaXRzIGluIHRoZSBFSU5UIGRlZmF1bHQgKgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbW92CXIxLCAkMAorCWxkcglyMCwgPUVJTlRfRU5BQkxFMAorCXN0cglyMSwgW3IwXQorCWxkcglyMCwgPUVJTlRfRU5BQkxFMQorCXN0cglyMSwgW3IwXQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogUHV0IHRoZSBHRU0gaW4gcmVzZXQJCQkJCSoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKiBQdXQgdGhlIEdFTSBpbiByZXNldCAqLworCWxkcglyOCwgUFNDX0dFTV9GTEFHX0NMRUFSCisJbGRyCXI2LCBNRENUTF9HRU0KKwlsZHIJcjcsIFtyNl0KKwlhbmQJcjcsIHI3LCByOAorCXN0cglyNywgW3I2XQorCisJLyogRW5hYmxlIHRoZSBQb3dlciBEb21haW4gVHJhbnNpdGlvbiBDb21tYW5kICovCisJbGRyCXI2LCBQVENNRAorCWxkcglyNywgW3I2XQorCW9ycglyNywgcjcsICQweDAyCisJc3RyCXI3LCBbcjZdCisKKwkvKiBDaGVjayBmb3IgVHJhbnNpdGlvbiBDb21wbGV0ZShQVFNUQVQpICovCitjaGVja1N0YXRDbGtTdG9wR2VtOgorCWxkcglyNiwgUFRTVEFUCisJbGRyCXI3LCBbcjZdCisJYW5kcwlyNywgcjcsICQweDAyCisJYm5lCWNoZWNrU3RhdENsa1N0b3BHZW0KKworCS8qIENoZWNrIGZvciBHRU0gUmVzZXQgQ29tcGxldGlvbiAqLworY2hlY2tHZW1TdGF0Q2xrU3RvcDoKKwlsZHIJcjYsIE1EU1RBVF9HRU0KKwlsZHIJcjcsIFtyNl0KKwlhbmRzCXI3LCByNywgJDB4MTAwCisJYm5lCWNoZWNrR2VtU3RhdENsa1N0b3AKKworCS8qIERvIHRoaXMgZm9yIGVuYWJsaW5nIGEgV0RUIGluaXRpYXRlZCByZXNldCB0aGlzIGlzIGEgd29ya2Fyb3VuZAorCSAgIGZvciBhIGNoaXAgYnVnLiAgTm90IHJlcXVpcmVkIHVuZGVyIG5vcm1hbCBzaXR1YXRpb25zICovCisJbGRyCXI2LCBQMTM5NAorCW1vdglyMTAsICQwCisJc3RyCXIxMCwgW3I2XQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogRW5hYmxlIEwxICYgTDIgTWVtb3JpZXMgaW4gRmFzdCBtb2RlICAgICAgICAgICAgICAgICAqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxkcglyNiwgREZUX0VOQUJMRQorCW1vdglyMTAsICQweDAxCisJc3RyCXIxMCwgW3I2XQorCisJbGRyCXI2LCBNTUFSR19CUkYwCisJbGRyCXIxMCwgTU1BUkdfQlJGMF9WQUwKKwlzdHIJcjEwLCBbcjZdCisKKwlsZHIJcjYsIERGVF9FTkFCTEUKKwltb3YJcjEwLCAkMAorCXN0cglyMTAsIFtyNl0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCSAqIEREUjIgUExMIEluaXRpYWxpemF0aW9uCQkJICAgIAkqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJLyogU2VsZWN0IHRoZSBDbG9jayBNb2RlIERlcGVuZGluZyBvbiB0aGUgVmFsdWUgd3JpdHRlbiBpbiB0aGUgQm9vdCBUYWJsZSBieSB0aGUgcnVuIHNjcmlwdCAqLworCW1vdglyMTAsICQwCisJbGRyCXI2LCBQTEwyX0NUTAorCWxkcglyNywgUExMX0NMS1NSQ19NQVNLCisJbGRyCXI4LCBbcjZdCisJYW5kCXI4LCByOCwgcjcKKwltb3YJcjksIHIxMCwgbHNsICQ4CisJb3JyCXI4LCByOCwgcjkKKwlzdHIJcjgsIFtyNl0KKworCS8qIFNlbGVjdCB0aGUgUExMRU4gc291cmNlICovCisJbGRyCXI3LCBQTExfRU5TUkNfTUFTSworCWFuZAlyOCwgcjgsIHI3CisJc3RyCXI4LCBbcjZdCisKKwkvKiBCeXBhc3MgdGhlIFBMTCAqLworCWxkcglyNywgUExMX0JZUEFTU19NQVNLCisJYW5kCXI4LCByOCwgcjcKKwlzdHIJcjgsIFtyNl0KKworCS8qIFdhaXQgZm9yIGZldyBjeWNsZXMgdG8gYWxsb3cgUExMRU4gTXV4IHN3aXRjaCBwcm9wZXJseSB0byBieXBhc3MgQ2xvY2sgKi8KKwltb3YJcjEwLCAkMHgyMAorV2FpdFBQTDJMb29wOgorCXN1YnMJcjEwLCByMTAsICQxCisJYm5lCVdhaXRQUEwyTG9vcAorCisJLyogUmVzZXQgdGhlIFBMTCAqLworCWxkcglyNywgUExMX1JFU0VUX01BU0sKKwlhbmQJcjgsIHI4LCByNworCXN0cglyOCwgW3I2XQorCisJLyogUG93ZXIgdXAgdGhlIFBMTCAqLworCWxkcglyNywgUExMX1BXUlVQX01BU0sKKwlhbmQJcjgsIHI4LCByNworCXN0cglyOCwgW3I2XQorCisJLyogRW5hYmxlIHRoZSBQTEwgZnJvbSBEaXNhYmxlIE1vZGUgKi8KKwlsZHIJcjcsIFBMTF9ESVNBQkxFX0VOQUJMRV9NQVNLCisJYW5kCXI4LCByOCwgcjcKKwlzdHIJcjgsIFtyNl0KKworCS8qIFByb2dyYW0gdGhlIFBMTCBNdWx0aXBsaWVyICovCisJbGRyCXI2LCBQTEwyX1BMTE0KKwltb3YJcjIsICQweDE3CS8qIDE2MiBNSHogKi8KKwlzdHIJcjIsIFtyNl0KKworCS8qIFByb2dyYW0gdGhlIFBMTDIgRGl2aXNvciBWYWx1ZSAqLworCWxkcglyNiwgUExMMl9ESVYyCisJbW92CXIzLCAkMHgwMQorCXN0cglyMywgW3I2XQorCisJLyogUHJvZ3JhbSB0aGUgUExMMiBEaXZpc29yIFZhbHVlICovCisJbGRyCXI2LCBQTEwyX0RJVjEKKwltb3YJcjQsICQweDBiCS8qIDU0IE1IeiAqLworCXN0cglyNCwgW3I2XQorCisJLyogUExMMiBESVYyIE1NUiAqLworCWxkcglyOCwgUExMMl9ESVZfTUFTSworCWxkcglyNiwgUExMMl9ESVYyCisJbGRyCXI5LCBbcjZdCisJYW5kCXI4LCByOCwgcjkKKwltb3YJcjksICQweDAxCisJbW92CXI5LCByOSwgbHNsICQxNQorCW9ycglyOCwgcjgsIHI5CisJc3RyCXI4LCBbcjZdCisKKwkvKiBQcm9ncmFtIHRoZSBHT1NFVCBiaXQgdG8gdGFrZSBuZXcgZGl2aWRlciB2YWx1ZXMgKi8KKwlsZHIJcjYsIFBMTDJfUExMQ01ECisJbGRyCXI3LCBbcjZdCisJb3JyCXI3LCByNywgJDB4MDEKKwlzdHIJcjcsIFtyNl0KKworCS8qIFdhaXQgZm9yIERvbmUgKi8KKwlsZHIJcjYsIFBMTDJfUExMU1RBVAorZG9uZUxvb3BfMDoKKwlsZHIJcjcsIFtyNl0KKwlhbmRzCXI3LCByNywgJDB4MDEKKwlibmUJZG9uZUxvb3BfMAorCisJLyogUExMMiBESVYxIE1NUiAqLworCWxkcglyOCwgUExMMl9ESVZfTUFTSworCWxkcglyNiwgUExMMl9ESVYxCisJbGRyCXI5LCBbcjZdCisJYW5kCXI4LCByOCwgcjkKKwltb3YJcjksICQweDAxCisJbW92CXI5LCByOSwgbHNsICQxNQorCW9ycglyOCwgcjgsIHI5CisJc3RyCXI4LCBbcjZdCisKKwkvKiBQcm9ncmFtIHRoZSBHT1NFVCBiaXQgdG8gdGFrZSBuZXcgZGl2aWRlciB2YWx1ZXMgKi8KKwlsZHIJcjYsIFBMTDJfUExMQ01ECisJbGRyCXI3LCBbcjZdCisJb3JyCXI3LCByNywgJDB4MDEKKwlzdHIJcjcsIFtyNl0KKworCS8qIFdhaXQgZm9yIERvbmUgKi8KKwlsZHIJcjYsIFBMTDJfUExMU1RBVAorZG9uZUxvb3A6CisJbGRyCXI3LCBbcjZdCisJYW5kcwlyNywgcjcsICQweDAxCisJYm5lCWRvbmVMb29wCisKKwkvKiBXYWl0IGZvciBQTEwgdG8gUmVzZXQgUHJvcGVybHkgKi8KKwltb3YJcjEwLCAkMHgyMTgKK1Jlc2V0UFBMMkxvb3A6CisJc3VicwlyMTAsIHIxMCwgJDEKKwlibmUJUmVzZXRQUEwyTG9vcAorCisJLyogQnJpbmcgUExMIG91dCBvZiBSZXNldCAqLworCWxkcglyNiwgUExMMl9DVEwKKwlsZHIJcjgsIFtyNl0KKwlvcnIJcjgsIHI4LCAkMHgwOAorCXN0cglyOCwgW3I2XQorCisJLyogV2FpdCBmb3IgUExMIHRvIExvY2sgKi8KKwlsZHIJcjEwLCBQTExfTE9DS19DT1VOVAorUExMMkxvY2s6CisJc3VicwlyMTAsIHIxMCwgJDEKKwlibmUJUExMMkxvY2sKKworCS8qIEVuYWJsZSB0aGUgUExMICovCisJbGRyCXI2LCBQTEwyX0NUTAorCWxkcglyOCwgW3I2XQorCW9ycglyOCwgcjgsICQweDAxCisJc3RyCXI4LCBbcjZdCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBJc3N1ZSBTb2Z0IFJlc2V0IHRvIEREUiBNb2R1bGUJCQkqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJLyogU2h1dCBkb3duIHRoZSBERFIyIExQU0MgTW9kdWxlICovCisJbGRyCXI4LCBQU0NfRkxBR19DTEVBUgorCWxkcglyNiwgTURDVExfRERSMgorCWxkcglyNywgW3I2XQorCWFuZAlyNywgcjcsIHI4CisJb3JyCXI3LCByNywgJDB4MDMKKwlzdHIJcjcsIFtyNl0KKworCS8qIEVuYWJsZSB0aGUgUG93ZXIgRG9tYWluIFRyYW5zaXRpb24gQ29tbWFuZCAqLworCWxkcglyNiwgUFRDTUQKKwlsZHIJcjcsIFtyNl0KKwlvcnIJcjcsIHI3LCAkMHgwMQorCXN0cglyNywgW3I2XQorCisJLyogQ2hlY2sgZm9yIFRyYW5zaXRpb24gQ29tcGxldGUoUFRTVEFUKSAqLworY2hlY2tTdGF0Q2xrU3RvcDoKKwlsZHIJcjYsIFBUU1RBVAorCWxkcglyNywgW3I2XQorCWFuZHMJcjcsIHI3LCAkMHgwMQorCWJuZQljaGVja1N0YXRDbGtTdG9wCisKKwkvKiBDaGVjayBmb3IgRERSMiBDb250cm9sbGVyIEVuYWJsZSBDb21wbGV0aW9uICovCitjaGVja0REUlN0YXRDbGtTdG9wOgorCWxkcglyNiwgTURTVEFUX0REUjIKKwlsZHIJcjcsIFtyNl0KKwlhbmQJcjcsIHI3LCAkMHgxZgorCWNtcAlyNywgJDB4MDMKKwlibmUJY2hlY2tERFJTdGF0Q2xrU3RvcAorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogUHJvZ3JhbSBERFIyIE1NUnMgZm9yIDE2Mk1IeiBTZXR0aW5nCQkJKgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCS8qIFByb2dyYW0gUEhZIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlsZHIJcjYsIEREUkNUTAorCWxkcglyNywgRERSQ1RMX1ZBTAorCXN0cglyNywgW3I2XQorCisJLyogUHJvZ3JhbSBTRFJBTSBCYW5rIENvbmZpZyBSZWdpc3RlciAqLworCWxkcglyNiwgU0RDRkcKKwlsZHIJcjcsIFNEQ0ZHX1ZBTAorCXN0cglyNywgW3I2XQorCisJLyogUHJvZ3JhbSBTRFJBTSBUSU0tMCBDb25maWcgUmVnaXN0ZXIgKi8KKwlsZHIJcjYsIFNEVElNMAorCWxkcglyNywgU0RUSU0wX1ZBTF8xNjJNSHoKKwlzdHIJcjcsIFtyNl0KKworCS8qIFByb2dyYW0gU0RSQU0gVElNLTEgQ29uZmlnIFJlZ2lzdGVyICovCisJbGRyCXI2LCBTRFRJTTEKKwlsZHIJcjcsIFNEVElNMV9WQUxfMTYyTUh6CisJc3RyCXI3LCBbcjZdCisKKwkvKiBQcm9ncmFtIHRoZSBTRFJBTSBCYW5rIENvbmZpZyBDb250cm9sIFJlZ2lzdGVyICovCisJbGRyCXIxMCwgTUFTS19WQUwKKwlsZHIJcjgsIFNEQ0ZHCisJbGRyCXI5LCBTRENGR19WQUwKKwlhbmQJcjksIHI5LCByMTAKKwlzdHIJcjksIFtyOF0KKworCS8qIFByb2dyYW0gU0RSQU0gU0RSRUYgQ29uZmlnIFJlZ2lzdGVyICovCisJbGRyCXI2LCBTRFJFRgorCWxkcglyNywgU0RSRUZfVkFMCisJc3RyCXI3LCBbcjZdCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBJc3N1ZSBTb2Z0IFJlc2V0IHRvIEREUiBNb2R1bGUJCQkqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJLyogSXNzdWUgYSBEdW1teSBERFIyIHJlYWQvd3JpdGUgKi8KKwlsZHIJcjgsIEREUjJfU1RBUlRfQUREUgorCWxkcglyNywgRFVNTVlfVkFMCisJc3RyCXI3LCBbcjhdCisJbGRyCXI3LCBbcjhdCisKKwkvKiBTaHV0IGRvd24gdGhlIEREUjIgTFBTQyBNb2R1bGUgKi8KKwlsZHIJcjgsIFBTQ19GTEFHX0NMRUFSCisJbGRyCXI2LCBNRENUTF9ERFIyCisJbGRyCXI3LCBbcjZdCisJYW5kCXI3LCByNywgcjgKKwlvcnIJcjcsIHI3LCAkMHgwMQorCXN0cglyNywgW3I2XQorCisJLyogRW5hYmxlIHRoZSBQb3dlciBEb21haW4gVHJhbnNpdGlvbiBDb21tYW5kICovCisJbGRyCXI2LCBQVENNRAorCWxkcglyNywgW3I2XQorCW9ycglyNywgcjcsICQweDAxCisJc3RyCXI3LCBbcjZdCisKKwkvKiBDaGVjayBmb3IgVHJhbnNpdGlvbiBDb21wbGV0ZShQVFNUQVQpICovCitjaGVja1N0YXRDbGtTdG9wMjoKKwlsZHIJcjYsIFBUU1RBVAorCWxkcglyNywgW3I2XQorCWFuZHMJcjcsIHI3LCAkMHgwMQorCWJuZQljaGVja1N0YXRDbGtTdG9wMgorCisJLyogQ2hlY2sgZm9yIEREUjIgQ29udHJvbGxlciBFbmFibGUgQ29tcGxldGlvbiAqLworY2hlY2tERFJTdGF0Q2xrU3RvcDI6CisJbGRyCXI2LCBNRFNUQVRfRERSMgorCWxkcglyNywgW3I2XQorCWFuZAlyNywgcjcsICQweDFmCisJY21wCXI3LCAkMHgwMQorCWJuZQljaGVja0REUlN0YXRDbGtTdG9wMgorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogVHVybiBERFIyIENvbnRyb2xsZXIgQ2xvY2tzIE9uCQkJKgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCS8qIEVuYWJsZSB0aGUgRERSMiBMUFNDIE1vZHVsZSAqLworCWxkcglyNiwgTURDVExfRERSMgorCWxkcglyNywgW3I2XQorCW9ycglyNywgcjcsICQweDAzCisJc3RyCXI3LCBbcjZdCisKKwkvKiBFbmFibGUgdGhlIFBvd2VyIERvbWFpbiBUcmFuc2l0aW9uIENvbW1hbmQgKi8KKwlsZHIJcjYsIFBUQ01ECisJbGRyCXI3LCBbcjZdCisJb3JyCXI3LCByNywgJDB4MDEKKwlzdHIJcjcsIFtyNl0KKworCS8qIENoZWNrIGZvciBUcmFuc2l0aW9uIENvbXBsZXRlKFBUU1RBVCkgKi8KK2NoZWNrU3RhdENsa0VuMjoKKwlsZHIJcjYsIFBUU1RBVAorCWxkcglyNywgW3I2XQorCWFuZHMJcjcsIHI3LCAkMHgwMQorCWJuZQljaGVja1N0YXRDbGtFbjIKKworCS8qIENoZWNrIGZvciBERFIyIENvbnRyb2xsZXIgRW5hYmxlIENvbXBsZXRpb24gKi8KK2NoZWNrRERSU3RhdENsa0VuMjoKKwlsZHIJcjYsIE1EU1RBVF9ERFIyCisJbGRyCXI3LCBbcjZdCisJYW5kCXI3LCByNywgJDB4MWYKKwljbXAJcjcsICQweDAzCisJYm5lCWNoZWNrRERSU3RhdENsa0VuMgorCisJLyogIEREUiBXcml0ZXMgYW5kIFJlYWRzICovCisJbGRyCXI2LCBDRkdURVNUCisJbW92CXIzLCAkMHgwMQorCXN0cglyMywgW3I2XQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogU3lzdGVtIFBMTCBJbml0aWFsaXphdGlvbgkJCQkqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJLyogU2VsZWN0IHRoZSBDbG9jayBNb2RlIERlcGVuZGluZyBvbiB0aGUgVmFsdWUgd3JpdHRlbiBpbiB0aGUgQm9vdCBUYWJsZSBieSB0aGUgcnVuIHNjcmlwdCAqLworCW1vdglyMiwgJDAKKwlsZHIJcjYsIFBMTDFfQ1RMCisJbGRyCXI3LCBQTExfQ0xLU1JDX01BU0sKKwlsZHIJcjgsIFtyNl0KKwlhbmQJcjgsIHI4LCByNworCW1vdglyOSwgcjIsIGxzbCAkOAorCW9ycglyOCwgcjgsIHI5CisJc3RyCXI4LCBbcjZdCisKKwkvKiBTZWxlY3QgdGhlIFBMTEVOIHNvdXJjZSAqLworCWxkcglyNywgUExMX0VOU1JDX01BU0sKKwlhbmQJcjgsIHI4LCByNworCXN0cglyOCwgW3I2XQorCisJLyogQnlwYXNzIHRoZSBQTEwgKi8KKwlsZHIJcjcsIFBMTF9CWVBBU1NfTUFTSworCWFuZAlyOCwgcjgsIHI3CisJc3RyCXI4LCBbcjZdCisKKwkvKiBXYWl0IGZvciBmZXcgY3ljbGVzIHRvIGFsbG93IFBMTEVOIE11eCBzd2l0Y2ggcHJvcGVybHkgdG8gYnlwYXNzIENsb2NrICovCisJbW92CXIxMCwgJDB4MjAKKworV2FpdExvb3A6CisJc3VicwlyMTAsIHIxMCwgJDEKKwlibmUJV2FpdExvb3AKKworCS8qIFJlc2V0IHRoZSBQTEwgKi8KKwlsZHIJcjcsIFBMTF9SRVNFVF9NQVNLCisJYW5kCXI4LCByOCwgcjcKKwlzdHIJcjgsIFtyNl0KKworCS8qIERpc2FibGUgdGhlIFBMTCAqLworCW9ycglyOCwgcjgsICQweDEwCisJc3RyCXI4LCBbcjZdCisKKwkvKiBQb3dlciB1cCB0aGUgUExMICovCisJbGRyCXI3LCBQTExfUFdSVVBfTUFTSworCWFuZAlyOCwgcjgsIHI3CisJc3RyCXI4LCBbcjZdCisKKwkvKiBFbmFibGUgdGhlIFBMTCBmcm9tIERpc2FibGUgTW9kZSAqLworCWxkcglyNywgUExMX0RJU0FCTEVfRU5BQkxFX01BU0sKKwlhbmQJcjgsIHI4LCByNworCXN0cglyOCwgW3I2XQorCisJLyogUHJvZ3JhbSB0aGUgUExMIE11bHRpcGxpZXIgKi8KKwlsZHIJcjYsIFBMTDFfUExMTQorCW1vdglyMywgJDB4MTUJLyogRm9yIDU5NE1IeiAqLworCXN0cglyMywgW3I2XQorCisJLyogV2FpdCBmb3IgUExMIHRvIFJlc2V0IFByb3Blcmx5ICovCisJbW92CXIxMCwgJDB4ZmYKKworUmVzZXRMb29wOgorCXN1YnMJcjEwLCByMTAsICQxCisJYm5lCVJlc2V0TG9vcAorCisJLyogQnJpbmcgUExMIG91dCBvZiBSZXNldCAqLworCWxkcglyNiwgUExMMV9DVEwKKwlvcnIJcjgsIHI4LCAkMHgwOAorCXN0cglyOCwgW3I2XQorCisJLyogV2FpdCBmb3IgUExMIHRvIExvY2sgKi8KKwlsZHIJcjEwLCBQTExfTE9DS19DT1VOVAorCitQTEwxTG9jazoKKwlzdWJzCXIxMCwgcjEwLCAkMQorCWJuZQlQTEwxTG9jaworCisJLyogRW5hYmxlIHRoZSBQTEwgKi8KKwlvcnIJcjgsIHI4LCAkMHgwMQorCXN0cglyOCwgW3I2XQorCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBBRU1JRiBjb25maWd1cmF0aW9uIGZvciBOT1IgRmxhc2ggKGRvdWJsZSBjaGVjaykgICAgICoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGRyCXIwLCBfUElOTVVYMAorCWxkcglyMSwgX0RFVl9TRVRUSU5HCisJc3RyCXIxLCBbcjBdCisKKwlsZHIJcjAsIFdBSVRDRkcKKwlsZHIJcjEsIFdBSVRDRkdfVkFMCisJbGRyCXIyLCBbcjBdCisJb3JyCXIyLCByMiwgcjEKKwlzdHIJcjIsIFtyMF0KKworCWxkcglyMCwgQUNGRzMKKwlsZHIJcjEsIEFDRkczX1ZBTAorCWxkcglyMiwgW3IwXQorCWFuZAlyMSwgcjIsIHIxCisJc3RyCXIxLCBbcjBdCisKKwlsZHIJcjAsIEFDRkc0CisJbGRyCXIxLCBBQ0ZHNF9WQUwKKwlsZHIJcjIsIFtyMF0KKwlhbmQJcjEsIHIyLCByMQorCXN0cglyMSwgW3IwXQorCisJbGRyCXIwLCBBQ0ZHNQorCWxkcglyMSwgQUNGRzVfVkFMCisJbGRyCXIyLCBbcjBdCisJYW5kCXIxLCByMiwgcjEKKwlzdHIJcjEsIFtyMF0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogVlRQIG1hbnVhbCBDYWxpYnJhdGlvbiAgICAgICAgICAgICAgICoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsZHIJcjAsIFZUUElPQ1IKKwlsZHIJcjEsIFZUUF9NTVIwCisJc3RyCXIxLCBbcjBdCisKKwlsZHIJcjAsIFZUUElPQ1IKKwlsZHIJcjEsIFZUUF9NTVIxCisJc3RyCXIxLCBbcjBdCisKKwkvKiBXYWl0IGZvciAzMyBWVFAgQ0xLIGN5Y2xlcy4gIFZSUCBvcGVyYXRlcyBhdCAyNyBNSHogKi8KKwlsZHIJcjEwLCBWVFBfTE9DS19DT1VOVAorVlRQTG9jazoKKwlzdWJzCXIxMCwgcjEwLCAkMQorCWJuZQlWVFBMb2NrCisKKwlsZHIJcjYsIERGVF9FTkFCTEUKKwltb3YJcjEwLCAkMHgwMQorCXN0cglyMTAsIFtyNl0KKworCWxkcglyNiwgRERSVlRQUgorCWxkcglyNywgW3I2XQorCWFuZAlyNywgcjcsICQweDFmCisJYW5kCXI4LCByNywgJDB4M2UwCisJb3JyCXI4LCByNywgcjgKKwlsZHIJcjcsIFZUUF9SRUNBTAorCW9ycglyOCwgcjcsIHI4CisJbGRyCXI3LCBWVFBfRU4KKwlvcnIJcjgsIHI3LCByOAorCXN0cglyOCwgW3IwXQorCisKKwkvKiBXYWl0IGZvciAzMyBWVFAgQ0xLIGN5Y2xlcy4gIFZSUCBvcGVyYXRlcyBhdCAyNyBNSHogKi8KKwlsZHIJcjEwLCBWVFBfTE9DS19DT1VOVAorVlRQMUxvY2s6CisJc3VicwlyMTAsIHIxMCwgJDEKKwlibmUJVlRQMUxvY2sKKworCWxkcglyMSwgW3IwXQorCWxkcglyMiwgVlRQX01BU0sKKwlhbmQJcjIsIHIxLCByMgorCXN0cglyMiwgW3IwXQorCisJbGRyCXI2LCBERlRfRU5BQkxFCisJbW92CXIxMCwgJDAKKwlzdHIJcjEwLCBbcjZdCisKKwkvKgorCSAqIENhbGwgYm9hcmQtc3BlY2lmaWMgbG93bGV2ZWwgaW5pdC4KKyAJICogVGhhdCBNVVNUIGJlIHByZXNlbnQgYW5kIFRIQVQgcmV0dXJucworCSAqIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgd2l0aCAibW92IHBjLCBsci4iCisJICovCisJYglkdl9ib2FyZF9pbml0CisKKy5sdG9yZworCitfUElOTVVYMDoKKwkud29yZAkweDAxYzQwMDAwCQkvKiBEZXZpY2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMgKi8KK19QSU5NVVgxOgorCS53b3JkCTB4MDFjNDAwMDQJCS8qIERldmljZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyAqLworCitfREVWX1NFVFRJTkc6CisJLndvcmQJMHgwMDAwMGMxZgorCitXQUlUQ0ZHOgorCS53b3JkCTB4MDFlMDAwMDQKK1dBSVRDRkdfVkFMOgorCS53b3JkCTAKK0FDRkczOgorCS53b3JkCTB4MDFlMDAwMTQKK0FDRkczX1ZBTDoKKwkud29yZAkweDNmZmZmZmZkCitBQ0ZHNDoKKwkud29yZAkweDAxZTAwMDE4CitBQ0ZHNF9WQUw6CisJLndvcmQJMHgzZmZmZmZmZAorQUNGRzU6CisJLndvcmQJMHgwMWUwMDAxYworQUNGRzVfVkFMOgorCS53b3JkCTB4M2ZmZmZmZmQKKworTURDVExfRERSMjoKKwkud29yZAkweDAxYzQxYTM0CitNRFNUQVRfRERSMjoKKwkud29yZAkweDAxYzQxODM0CisKK1BUQ01EOgorCS53b3JkCTB4MDFjNDExMjAKK1BUU1RBVDoKKwkud29yZAkweDAxYzQxMTI4CisKK0VJTlRfRU5BQkxFMDoKKwkud29yZAkweDAxYzQ4MDE4CitFSU5UX0VOQUJMRTE6CisJLndvcmQJMHgwMWM0ODAxYworCitQU0NfRkxBR19DTEVBUjoKKwkud29yZAkweGZmZmZmZmUwCitQU0NfR0VNX0ZMQUdfQ0xFQVI6CisJLndvcmQJMHhmZmZmZmVmZgorCisvKiBERFIyIE1NUiAmIENPTkZJR1VSQVRJT04gVkFMVUVTLCAxNjIgTUhaIGNsb2NrICovCitERFJDVEw6CisJLndvcmQJMHgyMDAwMDBlNAorRERSQ1RMX1ZBTDoKKwkud29yZAkweDUwMDA2NDA1CitTRFJFRjoKKwkud29yZAkweDIwMDAwMDBjCitTRFJFRl9WQUw6CisJLndvcmQJMHgwMDAwMDVjMworU0RDRkc6CisJLndvcmQJMHgyMDAwMDAwOAorU0RDRkdfVkFMOgorI2lmZGVmCUREUl80QkFOS1MKKwkud29yZAkweDAwMTc4NjIyCisjZWxpZiBkZWZpbmVkIEREUl84QkFOS1MKKwkud29yZAkweDAwMTc4NjMyCisjZWxzZQorI2Vycm9yICJVbmtub3duIEREUiBjb25maWd1cmF0aW9uISEhIgorI2VuZGlmCitTRFRJTTA6CisJLndvcmQJMHgyMDAwMDAxMAorU0RUSU0wX1ZBTF8xNjJNSHo6CisJLndvcmQJMHgyODkyMzIxMQorU0RUSU0xOgorCS53b3JkCTB4MjAwMDAwMTQKK1NEVElNMV9WQUxfMTYyTUh6OgorCS53b3JkCTB4MDAxNmM3MjIKK1ZUUElPQ1I6CisJLndvcmQJMHgyMDAwMDBmMAkvKiBWVFAgSU8gQ29udHJvbCByZWdpc3RlciAqLworRERSVlRQUjoKKwkud29yZAkweDAxYzQyMDMwCS8qIEREUiBWUFRSIE1NUiAqLworVlRQX01NUjA6CisJLndvcmQJMHgyMDFmCitWVFBfTU1SMToKKwkud29yZAkweGEwMWYKK0RGVF9FTkFCTEU6CisJLndvcmQJMHgwMWM0MDA0YworVlRQX0xPQ0tfQ09VTlQ6CisJLndvcmQJMHg1YjAKK1ZUUF9NQVNLOgorCS53b3JkCTB4ZmZmZmRmZmYKK1ZUUF9SRUNBTDoKKwkud29yZAkweDQwMDAwCitWVFBfRU46CisJLndvcmQJMHgwMjAwMAorQ0ZHVEVTVDoKKwkud29yZAkweDgwMDEwMDAwCitNQVNLX1ZBTDoKKwkud29yZAkweDAwMDAwZmZmCisKKy8qIEdFTSBQb3dlciBVcCAmIExQU0MgQ29udHJvbCBSZWdpc3RlciAqLworTURDVExfR0VNOgorCS53b3JkCTB4MDFjNDFhOWMKK01EU1RBVF9HRU06CisJLndvcmQJMHgwMWM0MTg5YworCisvKiBGb3IgV0RUIHJlc2V0IGNoaXAgYnVnICovCitQMTM5NDoKKwkud29yZAkweDAxYzQxYTIwCisKK1BMTF9DTEtTUkNfTUFTSzoKKwkud29yZAkweGZmZmZmZWZmCS8qIE1hc2sgdGhlIENsb2NrIE1vZGUgYml0ICovCitQTExfRU5TUkNfTUFTSzoKKwkud29yZAkweGZmZmZmZmRmCS8qIFNlbGVjdCB0aGUgUExMRU4gc291cmNlICovCitQTExfQllQQVNTX01BU0s6CisJLndvcmQJMHhmZmZmZmZmZQkvKiBQdXQgdGhlIFBMTCBpbiBCWVBBU1MgKi8KK1BMTF9SRVNFVF9NQVNLOgorCS53b3JkCTB4ZmZmZmZmZjcJLyogUHV0IHRoZSBQTEwgaW4gUmVzZXQgTW9kZSAqLworUExMX1BXUlVQX01BU0s6CisJLndvcmQJMHhmZmZmZmZmZAkvKiBQTEwgUG93ZXIgdXAgTWFzayBCaXQgICovCitQTExfRElTQUJMRV9FTkFCTEVfTUFTSzoKKwkud29yZAkweGZmZmZmZmVmCS8qIEVuYWJsZSB0aGUgUExMIGZyb20gRGlzYWJsZSAqLworUExMX0xPQ0tfQ09VTlQ6CisJLndvcmQJMHgyMDAwCisKKy8qIFBMTDEtU1lTVEVNIFBMTCBNTVJzICovCitQTEwxX0NUTDoKKwkud29yZAkweDAxYzQwOTAwCitQTEwxX1BMTE06CisJLndvcmQJMHgwMWM0MDkxMAorCisvKiBQTEwyLVNZU1RFTSBQTEwgTU1ScyAqLworUExMMl9DVEw6CisJLndvcmQJMHgwMWM0MGQwMAorUExMMl9QTExNOgorCS53b3JkCTB4MDFjNDBkMTAKK1BMTDJfRElWMToKKwkud29yZAkweDAxYzQwZDE4CitQTEwyX0RJVjI6CisJLndvcmQJMHgwMWM0MGQxYworUExMMl9QTExDTUQ6CisJLndvcmQJMHgwMWM0MGQzOAorUExMMl9QTExTVEFUOgorCS53b3JkCTB4MDFjNDBkM2MKK1BMTDJfRElWX01BU0s6CisJLndvcmQJMHhmZmZmN2ZmZgorCitNTUFSR19CUkYwOgorCS53b3JkCTB4MDFjNDIwMTAJLyogQlJGIG1hcmdpbiBtb2RlIDAgKFIvVykqLworTU1BUkdfQlJGMF9WQUw6CisJLndvcmQJMHgwMDQ0NDQwMAorCitERFIyX1NUQVJUX0FERFI6CisJLndvcmQJMHg4MDAwMDAwMAorRFVNTVlfVkFMOgorCS53b3JkCTB4YTU1YWE1NWEKZGlmZiAtLWdpdCBhL2NwdS9hcm05MjZlanMvZGF2aW5jaS9seHQ5NzIuYyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9seHQ5NzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWViNmU1Ci0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL2x4dDk3Mi5jCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogSW50ZWwgTFhUOTcxL0xYVDk3MiBQSFkgRHJpdmVyIGZvciBUSSBEYVZpbmNpCisgKiAoVE1TMzIwRE02NDR4KSBiYXNlZCBib2FyZHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgPGx4dDk3MWEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9lbWFjX2RlZnMuaD4KKworI2lmZGVmIENPTkZJR19EUklWRVJfVElfRU1BQworCisjaWZkZWYgQ09ORklHX0NNRF9ORVQKKworaW50IGx4dDk3Ml9pc19waHlfY29ubmVjdGVkKGludCBwaHlfYWRkcikKK3sKKwl1X2ludDE2X3QJaWQxLCBpZDI7CisKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIFBIWV9DT01NT05fSUQxLCAmaWQxKSkKKwkJcmV0dXJuKDApOworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgUEhZX0NPTU1PTl9JRDIsICZpZDIpKQorCQlyZXR1cm4oMCk7CisKKwlpZiAoKGlkMSA9PSAoMHgwMDEzKSkgJiYgKChpZDIgICYgMHhmZmYwKSA9PSAweDc4ZTApKQorCQlyZXR1cm4oMSk7CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBseHQ5NzJfZ2V0X2xpbmtfc3BlZWQoaW50IHBoeV9hZGRyKQoreworCXVfaW50MTZfdAkJc3RhdDEsIHRtcDsKKwl2b2xhdGlsZSBlbWFjX3JlZ3MqCWVtYWMgPSAoZW1hY19yZWdzICopRU1BQ19CQVNFX0FERFI7CisKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIFBIWV9MWFQ5NzFfU1RBVDIsICZzdGF0MSkpCisJCXJldHVybigwKTsKKworCWlmICghKHN0YXQxICYgUEhZX0xYVDk3MV9TVEFUMl9MSU5LKSkJLyogbGluayB1cD8gKi8KKwkJcmV0dXJuKDApOworCisJaWYgKCFkbTY0NHhfZXRoX3BoeV9yZWFkKHBoeV9hZGRyLCBQSFlfTFhUOTcxX0RJR19DRkcsICZ0bXApKQorCQlyZXR1cm4oMCk7CisKKwl0bXAgfD0gUEhZX0xYVDk3MV9ESUdfQ0ZHX01JSV9EUklWRTsKKworCWRtNjQ0eF9ldGhfcGh5X3dyaXRlKHBoeV9hZGRyLCBQSFlfTFhUOTcxX0RJR19DRkcsIHRtcCk7CisJLyogUmVhZCBiYWNrICovCisJaWYgKCFkbTY0NHhfZXRoX3BoeV9yZWFkKHBoeV9hZGRyLCBQSFlfTFhUOTcxX0RJR19DRkcsICZ0bXApKQorCQlyZXR1cm4oMCk7CisKKworCS8qIFNwZWVkIGRvZXNuJ3QgbWF0dGVyLCB0aGVyZSBpcyBubyBzZXR0aW5nIGZvciBpdCBpbiBFTUFDLi4uICovCisJaWYgKHN0YXQxICYgUEhZX0xYVDk3MV9TVEFUMl8xMDBCVFgpIHsKKwkJaWYgKHN0YXQxICYgUEhZX0xYVDk3MV9TVEFUMl9EVVBMRVhfTU9ERSkgeworCQkJLyogc2V0IERNNjQ0eCBFTUFDIGZvciBGdWxsIER1cGxleCAgKi8KKwkJCWVtYWMtPk1BQ0NPTlRST0wgPSBFTUFDX01BQ0NPTlRST0xfTUlJRU5fRU5BQkxFIHwgRU1BQ19NQUNDT05UUk9MX0ZVTExEVVBMRVhfRU5BQkxFOworCQl9IGVsc2UgeworCQkJLypzZXQgRE02NDR4IEVNQUMgZm9yIEhhbGYgRHVwbGV4ICAqLworCQkJZW1hYy0+TUFDQ09OVFJPTCA9IEVNQUNfTUFDQ09OVFJPTF9NSUlFTl9FTkFCTEU7CisJCX0KKworCQlyZXR1cm4oMSk7CisJfSBlbHNlIHsKKwkJaWYgKHN0YXQxICYgUEhZX0xYVDk3MV9TVEFUMl9EVVBMRVhfTU9ERSkgeworCQkJLyogc2V0IERNNjQ0eCBFTUFDIGZvciBGdWxsIER1cGxleCAgKi8KKwkJCWVtYWMtPk1BQ0NPTlRST0wgPSBFTUFDX01BQ0NPTlRST0xfTUlJRU5fRU5BQkxFIHwgRU1BQ19NQUNDT05UUk9MX0ZVTExEVVBMRVhfRU5BQkxFOworCQl9IGVsc2UgeworCQkJLypzZXQgRE02NDR4IEVNQUMgZm9yIEhhbGYgRHVwbGV4ICAqLworCQkJZW1hYy0+TUFDQ09OVFJPTCA9IEVNQUNfTUFDQ09OVFJPTF9NSUlFTl9FTkFCTEU7CisJCX0KKworCQlyZXR1cm4oMSk7CisJfQorCisJcmV0dXJuKDApOworfQorCisKK2ludCBseHQ5NzJfaW5pdF9waHkoaW50IHBoeV9hZGRyKQoreworCWludAlyZXQgPSAxOworCisJaWYgKCFseHQ5NzJfZ2V0X2xpbmtfc3BlZWQocGh5X2FkZHIpKSB7CisJCS8qIFRyeSBhbm90aGVyIHRpbWUgKi8KKwkJcmV0ID0gbHh0OTcyX2dldF9saW5rX3NwZWVkKHBoeV9hZGRyKTsKKwl9CisKKwkvKiBEaXNhYmxlIFBIWSBJbnRlcnJ1cHRzICovCisJZG02NDR4X2V0aF9waHlfd3JpdGUocGh5X2FkZHIsIFBIWV9MWFQ5NzFfSU5UX0VOQUJMRSwgMCk7CisKKwlyZXR1cm4ocmV0KTsKK30KKworCitpbnQgbHh0OTcyX2F1dG9fbmVnb3RpYXRlKGludCBwaHlfYWRkcikKK3sKKwl1X2ludDE2X3QJdG1wOworCisKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIFBIWV9DT01NT05fQ1RSTCwgJnRtcCkpCisJCXJldHVybigwKTsKKworCS8qIFJlc3RhcnQgQXV0b19uZWdvdGlhdGlvbiAgKi8KKwl0bXAgfD0gUEhZX0NPTU1PTl9DVFJMX1JFU19BVVRPOworCWRtNjQ0eF9ldGhfcGh5X3dyaXRlKHBoeV9hZGRyLCBQSFlfQ09NTU9OX0NUUkwsIHRtcCk7CisKKwkvKmNoZWNrIEF1dG9OZWdvdGlhdGUgY29tcGxldGUgKi8KKwl1ZGVsYXkgKDEwMDAwKTsKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIFBIWV9DT01NT05fU1RBVCwgJnRtcCkpCisJCXJldHVybigwKTsKKworCWlmICghKHRtcCAmIFBIWV9DT01NT05fU1RBVF9BTl9DT01QKSkKKwkJcmV0dXJuKDApOworCisJcmV0dXJuIChseHQ5NzJfZ2V0X2xpbmtfc3BlZWQocGh5X2FkZHIpKTsKK30KKworI2VuZGlmCS8qIENPTkZJR19DTURfTkVUICovCisKKyNlbmRpZgkvKiBDT05GSUdfRFJJVkVSX0VUSEVSICovCmRpZmYgLS1naXQgYS9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvbmFuZC5jIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL25hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjdiZTlmCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL25hbmQuYwpAQCAtMCwwICsxLDM4OSBAQAorLyoKKyAqIE5BTkQgZHJpdmVyIGZvciBUSSBEYVZpbmNpIGJhc2VkIGJvYXJkcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogQmFzZWQgb24gTGludXggRGFWaW5jaSBOQU5EIGRyaXZlciBieSBUSS4gT3JpZ2luYWwgY29weXJpZ2h0IGZvbGxvd3M6CisgKi8KKworLyoKKyAqCisgKiBsaW51eC9kcml2ZXJzL210ZC9uYW5kL25hbmRfZGF2aW5jaS5jCisgKgorICogTkFORCBGbGFzaCBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBPdmVydmlldzoKKyAqICAgVGhpcyBpcyBhIGRldmljZSBkcml2ZXIgZm9yIHRoZSBOQU5EIGZsYXNoIGRldmljZSBmb3VuZCBvbiB0aGUKKyAqICAgRGFWaW5jaSBib2FyZCB3aGljaCB1dGlsaXplcyB0aGUgU2Ftc3VuZyBrOWsyZzA4IHBhcnQuCisgKgorIE1vZGlmaWNhdGlvbnM6CisgdmVyLiAxLjA6IEZlYiAyMDA1LCBWaW5vZC9TdWRoYWthcgorIC0KKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ0ZHX1VTRV9OQU5ECisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQorCisjaW5jbHVkZSA8bmFuZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL25hbmRfZGVmcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2VtaWZfZGVmcy5oPgorCitleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOworCitzdGF0aWMgdm9pZCBuYW5kX2RhdmluY2lfaHdjb250cm9sKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY21kKQoreworCXN0cnVjdAkJbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXVfaW50MzJfdAlJT19BRERSX1cgPSAodV9pbnQzMl90KXRoaXMtPklPX0FERFJfVzsKKworCUlPX0FERFJfVyAmPSB+KE1BU0tfQUxFfE1BU0tfQ0xFKTsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgTkFORF9DVExfU0VUQ0xFOgorCQkJSU9fQUREUl9XIHw9IE1BU0tfQ0xFOworCQkJYnJlYWs7CisJCWNhc2UgTkFORF9DVExfU0VUQUxFOgorCQkJSU9fQUREUl9XIHw9IE1BU0tfQUxFOworCQkJYnJlYWs7CisJfQorCisJdGhpcy0+SU9fQUREUl9XID0gKHZvaWQgKilJT19BRERSX1c7Cit9CisKKy8qIFNldCBXUCBvbiBkZXNlbGVjdCwgd3JpdGUgZW5hYmxlIG9uIHNlbGVjdCAqLworc3RhdGljIHZvaWQgbmFuZF9kYXZpbmNpX3NlbGVjdF9jaGlwKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY2hpcCkKK3sKKyNkZWZpbmUgR1BJT19TRVRfREFUQTAxCTB4MDFjNjcwMTgKKyNkZWZpbmUgR1BJT19DTFJfREFUQTAxCTB4MDFjNjcwMWMKKyNkZWZpbmUgR1BJT19OQU5EX1dQCSgxIDw8IDQpCisjaWZkZWYgU09OQVRBX0JPQVJEX0dQSU9XUAorCWlmIChjaGlwIDwgMCkgeworCQlSRUcoR1BJT19DTFJfREFUQTAxKSB8PSBHUElPX05BTkRfV1A7CisJfSBlbHNlIHsKKwkJUkVHKEdQSU9fU0VUX0RBVEEwMSkgfD0gR1BJT19OQU5EX1dQOworCX0KKyNlbmRpZgorfQorCisjaWZkZWYgQ0ZHX05BTkRfSFdfRUNDCisjaWZkZWYgQ0ZHX05BTkRfTEFSR0VQQUdFCitzdGF0aWMgc3RydWN0IG5hbmRfb29iaW5mbyBkYXZpbmNpX25hbmRfb29iaW5mbyA9IHsKKwkudXNlZWNjID0gTVREX05BTkRFQ0NfQVVUT1BMQUNFLAorCS5lY2NieXRlcyA9IDEyLAorCS5lY2Nwb3MgPSB7OCwgOSwgMTAsIDI0LCAyNSwgMjYsIDQwLCA0MSwgNDIsIDU2LCA1NywgNTh9LAorCS5vb2JmcmVlID0geyB7MiwgNn0sIHsxMiwgMTJ9LCB7MjgsIDEyfSwgezQ0LCAxMn0sIHs2MCwgNH0gfQorfTsKKyNlbGlmIGRlZmluZWQoQ0ZHX05BTkRfU01BTExQQUdFKQorc3RhdGljIHN0cnVjdCBuYW5kX29vYmluZm8gZGF2aW5jaV9uYW5kX29vYmluZm8gPSB7CisJLnVzZWVjYyA9IE1URF9OQU5ERUNDX0FVVE9QTEFDRSwKKwkuZWNjYnl0ZXMgPSAzLAorCS5lY2Nwb3MgPSB7MCwgMSwgMn0sCisJLm9vYmZyZWUgPSB7IHs2LCAyfSwgezgsIDh9IH0KK307CisjZWxzZQorI2Vycm9yICJFaXRoZXIgQ0ZHX05BTkRfTEFSR0VQQUdFIG9yIENGR19OQU5EX1NNQUxMUEFHRSBtdXN0IGJlIGRlZmluZWQhIgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIG5hbmRfZGF2aW5jaV9lbmFibGVfaHdlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtb2RlKQoreworCWVtaWZyZWdzCWVtaWZfYWRkcjsKKwlpbnQJCWR1bW15OworCisJZW1pZl9hZGRyID0gKGVtaWZyZWdzKURBVklOQ0lfQVNZTkNfRU1JRl9DTlRSTF9CQVNFOworCisJZHVtbXkgPSBlbWlmX2FkZHItPk5BTkRGMUVDQzsKKwlkdW1teSA9IGVtaWZfYWRkci0+TkFOREYyRUNDOworCWR1bW15ID0gZW1pZl9hZGRyLT5OQU5ERjNFQ0M7CisJZHVtbXkgPSBlbWlmX2FkZHItPk5BTkRGNEVDQzsKKworCWVtaWZfYWRkci0+TkFOREZDUiB8PSAoMSA8PCA4KTsKK30KKworc3RhdGljIHVfaW50MzJfdCBuYW5kX2RhdmluY2lfcmVhZGVjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9pbnQzMl90IHJlZ2lvbikKK3sKKwl1X2ludDMyX3QJZWNjID0gMDsKKwllbWlmcmVncwllbWlmX2Jhc2VfYWRkcjsKKworCWVtaWZfYmFzZV9hZGRyID0gKGVtaWZyZWdzKURBVklOQ0lfQVNZTkNfRU1JRl9DTlRSTF9CQVNFOworCisJaWYgKHJlZ2lvbiA9PSAxKQorCQllY2MgPSBlbWlmX2Jhc2VfYWRkci0+TkFOREYxRUNDOworCWVsc2UgaWYgKHJlZ2lvbiA9PSAyKQorCQllY2MgPSBlbWlmX2Jhc2VfYWRkci0+TkFOREYyRUNDOworCWVsc2UgaWYgKHJlZ2lvbiA9PSAzKQorCQllY2MgPSBlbWlmX2Jhc2VfYWRkci0+TkFOREYzRUNDOworCWVsc2UgaWYgKHJlZ2lvbiA9PSA0KQorCQllY2MgPSBlbWlmX2Jhc2VfYWRkci0+TkFOREY0RUNDOworCisJcmV0dXJuKGVjYyk7Cit9CisKK3N0YXRpYyBpbnQgbmFuZF9kYXZpbmNpX2NhbGN1bGF0ZV9lY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqZGF0LCB1X2NoYXIgKmVjY19jb2RlKQoreworCXVfaW50MzJfdAkJdG1wOworCWludAkJCXJlZ2lvbiwgbjsKKwlzdHJ1Y3QgbmFuZF9jaGlwCSp0aGlzID0gbXRkLT5wcml2OworCisJbiA9ICh0aGlzLT5lY2Ntb2RlID09IE5BTkRfRUNDX0hXMTJfMjA0OCkgPyA0IDogMTsKKworCXJlZ2lvbiA9IDE7CisJd2hpbGUgKG4tLSkgeworCQl0bXAgPSBuYW5kX2RhdmluY2lfcmVhZGVjYyhtdGQsIHJlZ2lvbik7CisJCSplY2NfY29kZSsrID0gdG1wOworCQkqZWNjX2NvZGUrKyA9IHRtcCA+PiAxNjsKKwkJKmVjY19jb2RlKysgPSAoKHRtcCA+PiA4KSAmIDB4MGYpIHwgKCh0bXAgPj4gMjApICYgMHhmMCk7CisJCXJlZ2lvbisrOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIG5hbmRfZGF2aW5jaV9nZW5fdHJ1ZV9lY2ModV9pbnQ4X3QgKmVjY19idWYpCit7CisJdV9pbnQzMl90CXRtcCA9IGVjY19idWZbMF0gfCAoZWNjX2J1ZlsxXSA8PCAxNikgfCAoKGVjY19idWZbMl0gJiAweGYwKSA8PCAyMCkgfCAoKGVjY19idWZbMl0gJiAweDBmKSA8PCA4KTsKKworCWVjY19idWZbMF0gPSB+KFA2NG8odG1wKSB8IFA2NGUodG1wKSB8IFAzMm8odG1wKSB8IFAzMmUodG1wKSB8IFAxNm8odG1wKSB8IFAxNmUodG1wKSB8IFA4byh0bXApIHwgUDhlKHRtcCkpOworCWVjY19idWZbMV0gPSB+KFAxMDI0byh0bXApIHwgUDEwMjRlKHRtcCkgfCBQNTEybyh0bXApIHwgUDUxMmUodG1wKSB8IFAyNTZvKHRtcCkgfCBQMjU2ZSh0bXApIHwgUDEyOG8odG1wKSB8IFAxMjhlKHRtcCkpOworCWVjY19idWZbMl0gPSB+KCBQNG8odG1wKSB8IFA0ZSh0bXApIHwgUDJvKHRtcCkgfCBQMmUodG1wKSB8IFAxbyh0bXApIHwgUDFlKHRtcCkgfCBQMjA0OG8odG1wKSB8IFAyMDQ4ZSh0bXApKTsKK30KKworc3RhdGljIGludCBuYW5kX2RhdmluY2lfY29tcGFyZV9lY2ModV9pbnQ4X3QgKmVjY19uYW5kLCB1X2ludDhfdCAqZWNjX2NhbGMsIHVfaW50OF90ICpwYWdlX2RhdGEpCit7CisJdV9pbnQzMl90CWk7CisJdV9pbnQ4X3QJdG1wMF9iaXRbOF0sIHRtcDFfYml0WzhdLCB0bXAyX2JpdFs4XTsKKwl1X2ludDhfdAljb21wMF9iaXRbOF0sIGNvbXAxX2JpdFs4XSwgY29tcDJfYml0WzhdOworCXVfaW50OF90CWVjY19iaXRbMjRdOworCXVfaW50OF90CWVjY19zdW0gPSAwOworCXVfaW50OF90CWZpbmRfYml0ID0gMDsKKwl1X2ludDMyX3QJZmluZF9ieXRlID0gMDsKKwlpbnQJCWlzX2VjY19mZjsKKworCWlzX2VjY19mZiA9ICgoKmVjY19uYW5kID09IDB4ZmYpICYmICgqKGVjY19uYW5kICsgMSkgPT0gMHhmZikgJiYgKCooZWNjX25hbmQgKyAyKSA9PSAweGZmKSk7CisKKwluYW5kX2RhdmluY2lfZ2VuX3RydWVfZWNjKGVjY19uYW5kKTsKKwluYW5kX2RhdmluY2lfZ2VuX3RydWVfZWNjKGVjY19jYWxjKTsKKworCWZvciAoaSA9IDA7IGkgPD0gMjsgaSsrKSB7CisJCSooZWNjX25hbmQgKyBpKSA9IH4oKihlY2NfbmFuZCArIGkpKTsKKwkJKihlY2NfY2FsYyArIGkpID0gfigqKGVjY19jYWxjICsgaSkpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJdG1wMF9iaXRbaV0gPSAqZWNjX25hbmQgJSAyOworCQkqZWNjX25hbmQgPSAqZWNjX25hbmQgLyAyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJdG1wMV9iaXRbaV0gPSAqKGVjY19uYW5kICsgMSkgJSAyOworCQkqKGVjY19uYW5kICsgMSkgPSAqKGVjY19uYW5kICsgMSkgLyAyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJdG1wMl9iaXRbaV0gPSAqKGVjY19uYW5kICsgMikgJSAyOworCQkqKGVjY19uYW5kICsgMikgPSAqKGVjY19uYW5kICsgMikgLyAyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJY29tcDBfYml0W2ldID0gKmVjY19jYWxjICUgMjsKKwkJKmVjY19jYWxjID0gKmVjY19jYWxjIC8gMjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWNvbXAxX2JpdFtpXSA9ICooZWNjX2NhbGMgKyAxKSAlIDI7CisJCSooZWNjX2NhbGMgKyAxKSA9ICooZWNjX2NhbGMgKyAxKSAvIDI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQljb21wMl9iaXRbaV0gPSAqKGVjY19jYWxjICsgMikgJSAyOworCQkqKGVjY19jYWxjICsgMikgPSAqKGVjY19jYWxjICsgMikgLyAyOworCX0KKworCWZvciAoaSA9IDA7IGk8IDY7IGkrKykKKwkJZWNjX2JpdFtpXSA9IHRtcDJfYml0W2kgKyAyXSBeIGNvbXAyX2JpdFtpICsgMl07CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQllY2NfYml0W2kgKyA2XSA9IHRtcDBfYml0W2ldIF4gY29tcDBfYml0W2ldOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJZWNjX2JpdFtpICsgMTRdID0gdG1wMV9iaXRbaV0gXiBjb21wMV9iaXRbaV07CisKKwllY2NfYml0WzIyXSA9IHRtcDJfYml0WzBdIF4gY29tcDJfYml0WzBdOworCWVjY19iaXRbMjNdID0gdG1wMl9iaXRbMV0gXiBjb21wMl9iaXRbMV07CisKKwlmb3IgKGkgPSAwOyBpIDwgMjQ7IGkrKykKKwkJZWNjX3N1bSArPSBlY2NfYml0W2ldOworCisJc3dpdGNoIChlY2Nfc3VtKSB7CisJCWNhc2UgMDoKKwkJCS8qIE5vdCByZWFjaGVkIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBub3QgY2FsbGVkIGlmCisJCQkgICBFQ0MgdmFsdWVzIGFyZSBlcXVhbCAqLworCQkJcmV0dXJuIDA7CisJCWNhc2UgMToKKwkJCS8qIFVuY29ycmVjdGFibGUgZXJyb3IgKi8KKwkJCURFQlVHIChNVERfREVCVUdfTEVWRUwwLCAiRUNDIFVOQ09SUkVDVEVEX0VSUk9SIDFcbiIpOworCQkJcmV0dXJuKC0xKTsKKwkJY2FzZSAxMjoKKwkJCS8qIENvcnJlY3RhYmxlIGVycm9yICovCisJCQlmaW5kX2J5dGUgPSAoZWNjX2JpdFsyM10gPDwgOCkgKworCQkJCShlY2NfYml0WzIxXSA8PCA3KSArCisJCQkJKGVjY19iaXRbMTldIDw8IDYpICsKKwkJCQkoZWNjX2JpdFsxN10gPDwgNSkgKworCQkJCShlY2NfYml0WzE1XSA8PCA0KSArCisJCQkJKGVjY19iaXRbMTNdIDw8IDMpICsKKwkJCQkoZWNjX2JpdFsxMV0gPDwgMikgKworCQkJCShlY2NfYml0WzldICA8PCAxKSArCisJCQkJZWNjX2JpdFs3XTsKKworCQkJZmluZF9iaXQgPSAoZWNjX2JpdFs1XSA8PCAyKSArIChlY2NfYml0WzNdIDw8IDEpICsgZWNjX2JpdFsxXTsKKworCQkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJDb3JyZWN0aW5nIHNpbmdsZSBiaXQgRUNDIGVycm9yIGF0IG9mZnNldDogJWQsIGJpdDogJWRcbiIsIGZpbmRfYnl0ZSwgZmluZF9iaXQpOworCisJCQlwYWdlX2RhdGFbZmluZF9ieXRlXSBePSAoMSA8PCBmaW5kX2JpdCk7CisKKwkJCXJldHVybigwKTsKKwkJZGVmYXVsdDoKKwkJCWlmIChpc19lY2NfZmYpIHsKKwkJCQlpZiAoZWNjX2NhbGNbMF0gPT0gMCAmJiBlY2NfY2FsY1sxXSA9PSAwICYmIGVjY19jYWxjWzJdID09IDApCisJCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCURFQlVHIChNVERfREVCVUdfTEVWRUwwLCAiVU5DT1JSRUNURURfRVJST1IgZGVmYXVsdFxuIik7CisJCQlyZXR1cm4oLTEpOworCX0KK30KKworc3RhdGljIGludCBuYW5kX2RhdmluY2lfY29ycmVjdF9kYXRhKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmRhdCwgdV9jaGFyICpyZWFkX2VjYywgdV9jaGFyICpjYWxjX2VjYykKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwCSp0aGlzOworCWludAkJCWJsb2NrX2NvdW50ID0gMCwgaSwgcmM7CisKKwl0aGlzID0gbXRkLT5wcml2OworCWJsb2NrX2NvdW50ID0gKHRoaXMtPmVjY21vZGUgPT0gTkFORF9FQ0NfSFcxMl8yMDQ4KSA/IDQgOiAxOworCWZvciAoaSA9IDA7IGkgPCBibG9ja19jb3VudDsgaSsrKSB7CisJCWlmIChtZW1jbXAocmVhZF9lY2MsIGNhbGNfZWNjLCAzKSAhPSAwKSB7CisJCQlyYyA9IG5hbmRfZGF2aW5jaV9jb21wYXJlX2VjYyhyZWFkX2VjYywgY2FsY19lY2MsIGRhdCk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJcmV0dXJuKHJjKTsKKwkJCX0KKwkJfQorCQlyZWFkX2VjYyArPSAzOworCQljYWxjX2VjYyArPSAzOworCQlkYXQgKz0gNTEyOworCX0KKwlyZXR1cm4oMCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBuYW5kX2RhdmluY2lfZGV2X3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCWVtaWZyZWdzCWVtaWZfYWRkcjsKKworCWVtaWZfYWRkciA9IChlbWlmcmVncylEQVZJTkNJX0FTWU5DX0VNSUZfQ05UUkxfQkFTRTsKKworCXJldHVybihlbWlmX2FkZHItPk5BTkRGU1IgJiAweDEpOworfQorCitzdGF0aWMgaW50IG5hbmRfZGF2aW5jaV93YWl0ZnVuYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqdGhpcywgaW50IHN0YXRlKQoreworCXdoaWxlKCFuYW5kX2RhdmluY2lfZGV2X3JlYWR5KG10ZCkpIHs7fQorCSpOQU5EX0NFMENMRSA9IE5BTkRfU1RBVFVTOworCXJldHVybigqTkFORF9DRTBEQVRBKTsKK30KKworc3RhdGljIHZvaWQgbmFuZF9mbGFzaF9pbml0KHZvaWQpCit7CisJdV9pbnQzMl90CWFjZmcxID0gMHgzZmZmZmZmYzsKKwl1X2ludDMyX3QJYWNmZzIgPSAweDNmZmZmZmZjOworCXVfaW50MzJfdAlhY2ZnMyA9IDB4M2ZmZmZmZmM7CisJdV9pbnQzMl90CWFjZmc0ID0gMHgzZmZmZmZmYzsKKwllbWlmcmVncwllbWlmX3JlZ3M7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiAgTkFORCBGTEFTSCBDSElQIFRJTUVPVVQgQCA0NTkgTUh6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKwkgKiAgQUVNSUYuQ0xLIGZyZXEgICA9IFBMTDEvNiA9IDQ1OS82ID0gNzYuNSBNSHogICAgICAgICAgICAgICAgICAgICoKKwkgKiAgQUVNSUYuQ0xLIHBlcmlvZCA9IDEvNzYuNSBNSHogPSAxMy4xIG5zICAgICAgICAgICAgICAgICAgICAgICAgICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJIGFjZmcxID0gMAorCSAJfCAoMCA8PCAzMSApCS8qIHNlbGVjdFN0cm9iZSAqLworCSAJfCAoMCA8PCAzMCApCS8qIGV4dFdhaXQgKi8KKwkgCXwgKDEgPDwgMjYgKQkvKiB3cml0ZVNldHVwCTEwIG5zICovCisJIAl8ICgzIDw8IDIwICkJLyogd3JpdGVTdHJvYmUJNDAgbnMgKi8KKwkgCXwgKDEgPDwgMTcgKQkvKiB3cml0ZUhvbGQJMTAgbnMgKi8KKwkgCXwgKDEgPDwgMTMgKQkvKiByZWFkU2V0dXAJMTAgbnMgKi8KKwkgCXwgKDUgPDwgNyApCS8qIHJlYWRTdHJvYmUJNjAgbnMgKi8KKwkgCXwgKDEgPDwgNCApCS8qIHJlYWRIb2xkCTEwIG5zICovCisJIAl8ICgzIDw8IDIgKQkvKiB0dXJuQXJvdW5kCT8/IG5zICovCisJIAl8ICgwIDw8IDAgKQkvKiBhc3luY1NpemUJOC1iaXQgYnVzICovCisJIAk7CisKKwllbWlmX3JlZ3MgPSAoZW1pZnJlZ3MpREFWSU5DSV9BU1lOQ19FTUlGX0NOVFJMX0JBU0U7CisKKwllbWlmX3JlZ3MtPkFXQ0NSIHw9IDB4MTAwMDAwMDA7CisJZW1pZl9yZWdzLT5BQjFDUiA9IGFjZmcxOwkvKiAweDA4MjQ0MTI4ICovOworCWVtaWZfcmVncy0+QUIyQ1IgPSBhY2ZnMjsKKwllbWlmX3JlZ3MtPkFCM0NSID0gYWNmZzM7CisJZW1pZl9yZWdzLT5BQjRDUiA9IGFjZmc0OworCWVtaWZfcmVncy0+TkFOREZDUiA9IDB4MDAwMDAxMDE7Cit9CisKK2ludCBib2FyZF9uYW5kX2luaXQoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCkKK3sKKwluYW5kLT5JT19BRERSX1IgICA9ICh2b2lkICBfX2lvbWVtICopTkFORF9DRTBEQVRBOworCW5hbmQtPklPX0FERFJfVyAgID0gKHZvaWQgIF9faW9tZW0gKilOQU5EX0NFMERBVEE7CisJbmFuZC0+Y2hpcF9kZWxheSAgPSAwOworCW5hbmQtPnNlbGVjdF9jaGlwID0gbmFuZF9kYXZpbmNpX3NlbGVjdF9jaGlwOworI2lmZGVmIENGR19OQU5EX1VTRV9GTEFTSF9CQlQKKwluYW5kLT5vcHRpb25zCSAgPSBOQU5EX1VTRV9GTEFTSF9CQlQ7CisjZW5kaWYKKyNpZmRlZiBDRkdfTkFORF9IV19FQ0MKKyNpZmRlZiBDRkdfTkFORF9MQVJHRVBBR0UKKwluYW5kLT5lY2Ntb2RlICAgICA9IE5BTkRfRUNDX0hXMTJfMjA0ODsKKyNlbGlmIGRlZmluZWQoQ0ZHX05BTkRfU01BTExQQUdFKQorCW5hbmQtPmVjY21vZGUgICAgID0gTkFORF9FQ0NfSFczXzUxMjsKKyNlbHNlCisjZXJyb3IgIkVpdGhlciBDRkdfTkFORF9MQVJHRVBBR0Ugb3IgQ0ZHX05BTkRfU01BTExQQUdFIG11c3QgYmUgZGVmaW5lZCEiCisjZW5kaWYKKwluYW5kLT5hdXRvb29iCSAgPSAmZGF2aW5jaV9uYW5kX29vYmluZm87CisJbmFuZC0+Y2FsY3VsYXRlX2VjYyA9IG5hbmRfZGF2aW5jaV9jYWxjdWxhdGVfZWNjOworCW5hbmQtPmNvcnJlY3RfZGF0YSAgPSBuYW5kX2RhdmluY2lfY29ycmVjdF9kYXRhOworCW5hbmQtPmVuYWJsZV9od2VjYyAgPSBuYW5kX2RhdmluY2lfZW5hYmxlX2h3ZWNjOworI2Vsc2UKKwluYW5kLT5lY2Ntb2RlICAgICA9IE5BTkRfRUNDX1NPRlQ7CisjZW5kaWYKKworCS8qIFNldCBhZGRyZXNzIG9mIGhhcmR3YXJlIGNvbnRyb2wgZnVuY3Rpb24gKi8KKwluYW5kLT5od2NvbnRyb2wgPSBuYW5kX2RhdmluY2lfaHdjb250cm9sOworCisJbmFuZC0+ZGV2X3JlYWR5ID0gbmFuZF9kYXZpbmNpX2Rldl9yZWFkeTsKKwluYW5kLT53YWl0ZnVuYyA9IG5hbmRfZGF2aW5jaV93YWl0ZnVuYzsKKworCW5hbmRfZmxhc2hfaW5pdCgpOworCisJcmV0dXJuKDApOworfQorCisjZWxzZQorI2Vycm9yICJVLUJvb3QgbGVnYWN5IE5BTkQgc3VwcG9ydCBub3QgYXZhaWxhYmxlIGZvciBEYVZpbmNpIGNoaXBzIgorI2VuZGlmCisjZW5kaWYJLyogQ0ZHX1VTRV9OQU5EICovCmRpZmYgLS1naXQgYS9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvcmVzZXQuUyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9yZXNldC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ODdkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvcmVzZXQuUwpAQCAtMCwwICsxLDc3IEBACisvKgorICogUHJvY2Vzc29yIHJlc2V0IHVzaW5nIFdEVCBmb3IgVEkgVE1TMzIwRE02NDR4IFNvQy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisuZ2xvYmwgcmVzZXRfY3B1CityZXNldF9jcHU6CisJbGRyCXIwLCBXRFRfVEdDUgorCW1vdglyMSwgJDB4MDgKKwlzdHIJcjEsIFtyMF0KKwlsZHIJcjEsIFtyMF0KKwlvcnIJcjEsIHIxLCAkMHgwMworCXN0cglyMSwgW3IwXQorCW1vdglyMSwgJDAKKwlsZHIJcjAsIFdEVF9USU0xMgorCXN0cglyMSwgW3IwXQorCWxkcglyMCwgV0RUX1RJTTM0CisJc3RyCXIxLCBbcjBdCisJbGRyCXIwLCBXRFRfUFJEMTIKKwlzdHIJcjEsIFtyMF0KKwlsZHIJcjAsIFdEVF9QUkQzNAorCXN0cglyMSwgW3IwXQorCWxkcglyMCwgV0RUX1RDUgorCWxkcglyMSwgW3IwXQorCW9ycglyMSwgcjEsICQweDQwCisJc3RyCXIxLCBbcjBdCisJbGRyCXIwLCBXRFRfV0RUQ1IKKwlsZHIJcjEsIFtyMF0KKwlvcnIJcjEsIHIxLCAkMHg0MDAwCisJc3RyCXIxLCBbcjBdCisJbGRyCXIxLCBXRFRDUl9WQUwxCisJc3RyCXIxLCBbcjBdCisJbGRyCXIxLCBXRFRDUl9WQUwyCisJc3RyCXIxLCBbcjBdCisJbm9wCisJbm9wCisJbm9wCisJbm9wCityZXNldF9jcHVfbG9vcDoKKwliCXJlc2V0X2NwdV9sb29wCisKK1dEVF9UR0NSOgorCS53b3JkCTB4MDFjMjFjMjQKK1dEVF9USU0xMjoKKwkud29yZAkweDAxYzIxYzEwCitXRFRfVElNMzQ6CisJLndvcmQJMHgwMWMyMWMxNAorV0RUX1BSRDEyOgorCS53b3JkCTB4MDFjMjFjMTgKK1dEVF9QUkQzNDoKKwkud29yZAkweDAxYzIxYzFjCitXRFRfVENSOgorCS53b3JkCTB4MDFjMjFjMjAKK1dEVF9XRFRDUjoKKwkud29yZAkweDAxYzIxYzI4CitXRFRDUl9WQUwxOgorCS53b3JkCTB4YTVjNjQwMDAKK1dEVENSX1ZBTDI6CisJLndvcmQJMHhkYTdlNDAwMApkaWZmIC0tZ2l0IGEvY3B1L2FybTkyNmVqcy9kYXZpbmNpL3RpbWVyLmMgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmIxZGRhCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL3RpbWVyLmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMKKyAqIFRleGFzIEluc3RydW1lbnRzIDx3d3cudGkuY29tPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIEFsZXggWnVlcGtlIDxhenVAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyLTIwMDQKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFBoaWxpcHBlIFJvYmluLCBBUk0gTHRkLiA8cGhpbGlwcGUucm9iaW5AYXJtLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFybTkyNmVqcy5oPgorCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCB7CisJdV9pbnQzMl90CXBpZDEyOworCXVfaW50MzJfdAllbXVtZ3RfY2xrc3BlZDsKKwl1X2ludDMyX3QJZ3BpbnRfZW47CisJdV9pbnQzMl90CWdwZGlyX2RhdDsKKwl1X2ludDMyX3QJdGltMTI7CisJdV9pbnQzMl90CXRpbTM0OworCXVfaW50MzJfdAlwcmQxMjsKKwl1X2ludDMyX3QJcHJkMzQ7CisJdV9pbnQzMl90CXRjcjsKKwl1X2ludDMyX3QJdGdjcjsKKwl1X2ludDMyX3QJd2R0Y3I7CisJdV9pbnQzMl90CXRsZ2M7CisJdV9pbnQzMl90CXRsbXI7Cit9IGRhdmluY2lfdGltZXI7CisKK2RhdmluY2lfdGltZXIJCSp0aW1lciA9IChkYXZpbmNpX3RpbWVyICopQ0ZHX1RJTUVSQkFTRTsKKworI2RlZmluZSBUSU1FUl9MT0FEX1ZBTAkoQ0ZHX0haX0NMT0NLIC8gQ0ZHX0haKQorI2RlZmluZSBSRUFEX1RJTUVSCXRpbWVyLT50aW0zNAorCitzdGF0aWMgdWxvbmcgdGltZXN0YW1wOworc3RhdGljIHVsb25nIGxhc3RpbmM7CisKK2ludCB0aW1lcl9pbml0KHZvaWQpCit7CisJLyogV2UgYXJlIHVzaW5nIHRpbWVyMzQgaW4gdW5jaGFpbmVkIDMyLWJpdCBtb2RlLCBmdWxsIHNwZWVkICovCisJdGltZXItPnRjciA9IDB4MDsKKwl0aW1lci0+dGdjciA9IDB4MDsKKwl0aW1lci0+dGdjciA9IDB4MDY7CisJdGltZXItPnRpbTM0ID0gMHgwOworCXRpbWVyLT5wcmQzNCA9IFRJTUVSX0xPQURfVkFMOworCWxhc3RpbmMgPSAwOworCXRpbWVyLT50Y3IgPSAweDgwIDw8IDE2OworCXRpbWVzdGFtcCA9IDA7CisKKwlyZXR1cm4oMCk7Cit9CisKK3ZvaWQgcmVzZXRfdGltZXIodm9pZCkKK3sKKwlyZXNldF90aW1lcl9tYXNrZWQoKTsKK30KKwordWxvbmcgZ2V0X3RpbWVyKHVsb25nIGJhc2UpCit7CisJcmV0dXJuKGdldF90aW1lcl9tYXNrZWQoKSAtIGJhc2UpOworfQorCit2b2lkIHNldF90aW1lcih1bG9uZyB0KQoreworCXRpbWVzdGFtcCA9IHQ7Cit9CisKK3ZvaWQgdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlYykKK3sKKwl1ZGVsYXlfbWFza2VkKHVzZWMpOworfQorCit2b2lkIHJlc2V0X3RpbWVyX21hc2tlZCh2b2lkKQoreworCWxhc3RpbmMgPSBSRUFEX1RJTUVSOworCXRpbWVzdGFtcCA9IDA7Cit9CisKK3Vsb25nIGdldF90aW1lcl9yYXcodm9pZCkKK3sKKwl1bG9uZyBub3cgPSBSRUFEX1RJTUVSOworCisJaWYgKG5vdyA+PSBsYXN0aW5jKSB7CisJCS8qIG5vcm1hbCBtb2RlICovCisJCXRpbWVzdGFtcCArPSBub3cgLSBsYXN0aW5jOworCX0gZWxzZSB7CisJCS8qIG92ZXJmbG93IC4uLiAqLworCQl0aW1lc3RhbXAgKz0gbm93ICsgVElNRVJfTE9BRF9WQUwgLSBsYXN0aW5jOworCX0KKwlsYXN0aW5jID0gbm93OworCXJldHVybiB0aW1lc3RhbXA7Cit9CisKK3Vsb25nIGdldF90aW1lcl9tYXNrZWQodm9pZCkKK3sKKwlyZXR1cm4oZ2V0X3RpbWVyX3JhdygpIC8gVElNRVJfTE9BRF9WQUwpOworfQorCit2b2lkIHVkZWxheV9tYXNrZWQodW5zaWduZWQgbG9uZyB1c2VjKQoreworCXVsb25nIHRtbzsKKwl1bG9uZyBlbmR0aW1lOworCXNpZ25lZCBsb25nIGRpZmY7CisKKwl0bW8gPSBDRkdfSFpfQ0xPQ0sgLyAxMDAwOworCXRtbyAqPSB1c2VjOworCXRtbyAvPSAxMDAwOworCisJZW5kdGltZSA9IGdldF90aW1lcl9yYXcoKSArIHRtbzsKKworCWRvIHsKKwkJdWxvbmcgbm93ID0gZ2V0X3RpbWVyX3JhdygpOworCQlkaWZmID0gZW5kdGltZSAtIG5vdzsKKwl9IHdoaWxlIChkaWZmID49IDApOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBkZXJpdmVkIGZyb20gUG93ZXJQQyBjb2RlIChyZWFkIHRpbWViYXNlIGFzIGxvbmcgbG9uZykuCisgKiBPbiBBUk0gaXQganVzdCByZXR1cm5zIHRoZSB0aW1lciB2YWx1ZS4KKyAqLwordW5zaWduZWQgbG9uZyBsb25nIGdldF90aWNrcyh2b2lkKQoreworCXJldHVybihnZXRfdGltZXIoMCkpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBkZXJpdmVkIGZyb20gUG93ZXJQQyBjb2RlICh0aW1lYmFzZSBjbG9jayBmcmVxdWVuY3kpLgorICogT24gQVJNIGl0IHJldHVybnMgdGhlIG51bWJlciBvZiB0aW1lciB0aWNrcyBwZXIgc2Vjb25kLgorICovCit1bG9uZyBnZXRfdGJjbGsodm9pZCkKK3sKKwl1bG9uZyB0YmNsazsKKworCXRiY2xrID0gQ0ZHX0haOworCXJldHVybih0YmNsayk7Cit9CmRpZmYgLS1naXQgYS9jcHUvYXQzMmFwL2F0bWVsX21jaS5jIGIvY3B1L2F0MzJhcC9hdG1lbF9tY2kuYwppbmRleCA5ZjYyYzBmLi5jZjQ4YmUxIDEwMDY0NAotLS0gYS9jcHUvYXQzMmFwL2F0bWVsX21jaS5jCisrKyBiL2NwdS9hdDMyYXAvYXRtZWxfbWNpLmMKQEAgLTU2LDYgKzU2LDcgQEAKICNkZWZpbmUgTU1DX0RFRkFVTFRfUkNBCQkxCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbW1jX3JjYTsKK3N0YXRpYyBpbnQgbW1jX2NhcmRfaXNfc2Q7CiBzdGF0aWMgYmxvY2tfZGV2X2Rlc2NfdCBtbWNfYmxrZGV2OwogCiBibG9ja19kZXZfZGVzY190ICptbWNfZ2V0X2RldihpbnQgZGV2KQpAQCAtODIsNyArODMsOSBAQAogCiAJYmxrbGVuICY9IDB4ZmZmYzsKIAltbWNpX3dyaXRlbChNUiwgKE1NQ0lfQkYoQ0xLRElWLCBjbGtkaXYpCi0JCQkgfCBNTUNJX0JGKEJMS0xFTiwgYmxrbGVuKSkpOworCQkJIHwgTU1DSV9CRihCTEtMRU4sIGJsa2xlbikKKwkJCSB8IE1NQ0lfQklUKFJEUFJPT0YpCisJCQkgfCBNTUNJX0JJVChXUlBST09GKSkpOwogfQogCiAjZGVmaW5lIFJFU1BfTk9fQ1JDCTEKQEAgLTIyNSw3ICsyMjgsNyBAQAogCQkJCSpidWZmZXIrKyA9IGRhdGE7CiAJCQkJd29yZGNvdW50Kys7CiAJCQl9Ci0JCX0gd2hpbGUod29yZGNvdW50IDwgKDUxMiAvIDQpKTsKKwkJfSB3aGlsZSh3b3JkY291bnQgPCAobW1jX2Jsa2Rldi5ibGtzeiAvIDQpKTsKIAogCQlwcl9kZWJ1ZygibW1jOiByZWFkICV1IHdvcmRzLCB3YWl0aW5nIGZvciBCTEtFXG4iLCB3b3JkY291bnQpOwogCkBAIC0yNDMsNyArMjQ2LDcgQEAKIAogZmFpbDoKIAltbWNfY21kKE1NQ19DTURfU0VORF9TVEFUVVMsIG1tY19yY2EgPDwgMTYsICZjYXJkX3N0YXR1cywgUjEgfCBOQ1IpOwotCXByaW50ZigibW1jOiBicmVhZCBmYWlsZWQsIGNhcmQgc3RhdHVzID0gIiwgY2FyZF9zdGF0dXMpOworCXByaW50ZigibW1jOiBicmVhZCBmYWlsZWQsIGNhcmQgc3RhdHVzID0gJTA4eFxuIiwgY2FyZF9zdGF0dXMpOwogCWdvdG8gb3V0OwogfQogCkBAIC0zNzEsNiArMzc0LDcgQEAKIAltbWNfcmNhID0gcmVzcFswXSA+PiAxNjsKIAlpZiAodmVyYm9zZSkKIAkJcHJpbnRmKCJTRCBDYXJkIGRldGVjdGVkIChSQ0EgJXUpXG4iLCBtbWNfcmNhKTsKKwltbWNfY2FyZF9pc19zZCA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQwNSwxMCArNDA5LDY0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgbWNpX3NldF9kYXRhX3RpbWVvdXQoc3RydWN0IG1tY19jc2QgKmNzZCkKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR0b211bF90b19zaGlmdFtdID0geworCQkwLCA0LCA3LCA4LCAxMCwgMTIsIDE2LCAyMCwKKwl9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdGFhY19leHBbXSA9IHsKKwkJMSwgMTAsIDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgMTAwMDAwMCwgMTAwMDAwMDAsCisJfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHRhYWNfbWFudFtdID0geworCQkwLCAgMTAsIDEyLCAxMywgMTUsIDYwLCAyNSwgMzAsCisJCTM1LCA0MCwgNDUsIDUwLCA1NSwgNjAsIDcwLCA4MCwKKwl9OworCXVuc2lnbmVkIGludCB0aW1lb3V0X25zLCB0aW1lb3V0X2Nsa3M7CisJdW5zaWduZWQgaW50IGUsIG07CisJdW5zaWduZWQgaW50IGR0b2N5YywgZHRvbXVsOworCXVuc2lnbmVkIGludCBzaGlmdDsKKwl1MzIgZHRvcjsKKworCWUgPSBjc2QtPnRhYWMgJiAweDA3OworCW0gPSAoY3NkLT50YWFjID4+IDMpICYgMHgwZjsKKworCXRpbWVvdXRfbnMgPSAodGFhY19leHBbZV0gKiB0YWFjX21hbnRbbV0gKyA5KSAvIDEwOworCXRpbWVvdXRfY2xrcyA9IGNzZC0+bnNhYyAqIDEwMDsKKworCXRpbWVvdXRfY2xrcyArPSAoKCh0aW1lb3V0X25zICsgOSkgLyAxMCkKKwkJCSAqICgoQ0ZHX01NQ19DTEtfUFAgKyA5OTk5OSkgLyAxMDAwMDApICsgOTk5OSkgLyAxMDAwMDsKKwlpZiAoIW1tY19jYXJkX2lzX3NkKQorCQl0aW1lb3V0X2Nsa3MgKj0gMTA7CisJZWxzZQorCQl0aW1lb3V0X2Nsa3MgKj0gMTAwOworCisJZHRvY3ljID0gdGltZW91dF9jbGtzOworCWR0b211bCA9IDA7CisJd2hpbGUgKGR0b2N5YyA+IDE1ICYmIGR0b211bCA8IDgpIHsKKwkJZHRvbXVsKys7CisJCXNoaWZ0ID0gZHRvbXVsX3RvX3NoaWZ0W2R0b211bF07CisJCWR0b2N5YyA9ICh0aW1lb3V0X2Nsa3MgKyAoMSA8PCBzaGlmdCkgLSAxKSA+PiBzaGlmdDsKKwl9CisKKwlpZiAoZHRvbXVsID49IDgpIHsKKwkJZHRvbXVsID0gNzsKKwkJZHRvY3ljID0gMTU7CisJCXB1dHMoIldhcm5pbmc6IFVzaW5nIG1heGltdW0gZGF0YSB0aW1lb3V0XG4iKTsKKwl9CisKKwlkdG9yID0gKE1NQ0lfQkYoRFRPTVVMLCBkdG9tdWwpCisJCXwgTU1DSV9CRihEVE9DWUMsIGR0b2N5YykpOworCW1tY2lfd3JpdGVsKERUT1IsIGR0b3IpOworCisJcHJpbnRmKCJtbWM6IFVzaW5nICV1IGN5Y2xlcyBkYXRhIHRpbWVvdXQgKERUT1I9MHgleClcbiIsCisJICAgICAgIGR0b2N5YyA8PCBzaGlmdCwgZHRvcik7Cit9CisKIGludCBtbWNfaW5pdChpbnQgdmVyYm9zZSkKIHsKIAlzdHJ1Y3QgbW1jX2NpZCBjaWQ7CiAJc3RydWN0IG1tY19jc2QgY3NkOworCXVuc2lnbmVkIGludCBtYXhfYmxrc3o7CiAJaW50IHJldDsKIAogCS8qIEluaXRpYWxpemUgY29udHJvbGxlciAqLwpAQCAtNDE4LDYgKzQ3Niw4IEBACiAJbW1jaV93cml0ZWwoSURSLCB+MFVMKTsKIAltY2lfc2V0X21vZGUoQ0ZHX01NQ19DTEtfT0QsIE1NQ19ERUZBVUxUX0JMS0xFTik7CiAKKwltbWNfY2FyZF9pc19zZCA9IDA7CisKIAlyZXQgPSBzZF9pbml0X2NhcmQoJmNpZCwgdmVyYm9zZSk7CiAJaWYgKHJldCkgewogCQltbWNfcmNhID0gTU1DX0RFRkFVTFRfUkNBOwpAQCAtNDMzLDYgKzQ5Myw4IEBACiAJaWYgKHZlcmJvc2UpCiAJCW1tY19kdW1wX2NzZCgmY3NkKTsKIAorCW1jaV9zZXRfZGF0YV90aW1lb3V0KCZjc2QpOworCiAJLyogSW5pdGlhbGl6ZSB0aGUgYmxvY2tkZXYgc3RydWN0dXJlICovCiAJbW1jX2Jsa2Rldi5pZl90eXBlID0gSUZfVFlQRV9NTUM7CiAJbW1jX2Jsa2Rldi5wYXJ0X3R5cGUgPSBQQVJUX1RZUEVfRE9TOwpAQCAtNDQ0LDcgKzUwNiwxNyBAQAogCQlzaXplb2YobW1jX2Jsa2Rldi5wcm9kdWN0KSk7CiAJc3ByaW50ZigoY2hhciAqKW1tY19ibGtkZXYucmV2aXNpb24sICIleCAleCIsCiAJCWNpZC5wcnYgPj4gNCwgY2lkLnBydiAmIDB4MGYpOwotCW1tY19ibGtkZXYuYmxrc3ogPSAxIDw8IGNzZC5yZWFkX2JsX2xlbjsKKworCS8qCisJICogSWYgd2UgY2FuJ3QgdXNlIDUxMiBieXRlIGJsb2NrcywgcmVmdXNlIHRvIGRlYWwgd2l0aCB0aGUKKwkgKiBjYXJkLiBUb25zIG9mIGNvZGUgZWxzZXdoZXJlIHNlZW1zIHRvIGRlcGVuZCBvbiB0aGlzLgorCSAqLworCW1heF9ibGtzeiA9IDEgPDwgY3NkLnJlYWRfYmxfbGVuOworCWlmIChtYXhfYmxrc3ogPCA1MTIgfHwgKG1heF9ibGtzeiA+IDUxMiAmJiAhY3NkLnJlYWRfYmxfcGFydGlhbCkpIHsKKwkJcHJpbnRmKCJDYXJkIGRvZXMgbm90IHN1cHBvcnQgNTEyIGJ5dGUgcmVhZHMsIGFib3J0aW5nLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwltbWNfYmxrZGV2LmJsa3N6ID0gNTEyOwogCW1tY19ibGtkZXYubGJhID0gKGNzZC5jX3NpemUgKyAxKSAqICgxIDw8IChjc2QuY19zaXplX211bHQgKyAyKSk7CiAKIAltY2lfc2V0X21vZGUoQ0ZHX01NQ19DTEtfUFAsIG1tY19ibGtkZXYuYmxrc3opOwpkaWZmIC0tZ2l0IGEvY3B1L2F0MzJhcC9hdG1lbF9tY2kuaCBiL2NwdS9hdDMyYXAvYXRtZWxfbWNpLmgKaW5kZXggMGZmYmM0Zi4uNWI0ZjVjOSAxMDA2NDQKLS0tIGEvY3B1L2F0MzJhcC9hdG1lbF9tY2kuaAorKysgYi9jcHUvYXQzMmFwL2F0bWVsX21jaS5oCkBAIC01Nyw2ICs1NywxMCBAQAogI2RlZmluZSBNTUNJX0NMS0RJVl9TSVpFCQkJOAogI2RlZmluZSBNTUNJX1BXU0RJVl9PRkZTRVQJCQk4CiAjZGVmaW5lIE1NQ0lfUFdTRElWX1NJWkUJCQkzCisjZGVmaW5lIE1NQ0lfUkRQUk9PRl9PRkZTRVQJCQkxMQorI2RlZmluZSBNTUNJX1JEUFJPT0ZfU0laRQkJCTEKKyNkZWZpbmUgTU1DSV9XUlBST09GX09GRlNFVAkJCTEyCisjZGVmaW5lIE1NQ0lfV1JQUk9PRl9TSVpFCQkJMQogI2RlZmluZSBNTUNJX1BEQ1BBRFZfT0ZGU0VUCQkJMTQKICNkZWZpbmUgTU1DSV9QRENQQURWX1NJWkUJCQkxCiAjZGVmaW5lIE1NQ0lfUERDTU9ERV9PRkZTRVQJCQkxNQpkaWZmIC0tZ2l0IGEvY3B1L2F0MzJhcC9pbnRlcnJ1cHRzLmMgYi9jcHUvYXQzMmFwL2ludGVycnVwdHMuYwppbmRleCBjOWUwNDk5Li5iZWYxZjMwIDEwMDY0NAotLS0gYS9jcHUvYXQzMmFwL2ludGVycnVwdHMuYworKysgYi9jcHUvYXQzMmFwL2ludGVycnVwdHMuYwpAQCAtMjAsOCArMjAsOCBAQAogICogTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGRpdjY0Lmg+CiAKLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CmRpZmYgLS1naXQgYS9jcHUvaTM4Ni9zZXJpYWwuYyBiL2NwdS9pMzg2L3NlcmlhbC5jCmluZGV4IGU3Mjk5YTcuLmJhZjM1ZTUgMTAwNjQ0Ci0tLSBhL2NwdS9pMzg2L3NlcmlhbC5jCisrKyBiL2NwdS9pMzg2L3NlcmlhbC5jCkBAIC0zOTQsNyArMzk0LDcgQEAKICNlbmRpZgkvKiBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8gKi8KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIC8qCiAgIEFTIEhBUk5PSVMgOiBhY2NvcmRpbmcgdG8gQ09ORklHX0tHREJfU0VSX0lOREVYIGtnZGIgdXNlcyBzZXJpYWwgcG9ydAogICBudW1iZXIgMCBvciBudW1iZXIgMQpAQCAtNTAwLDQgKzUwMCw0IEBACiAJcmV0dXJuOwogfQogI2VuZGlmCS8qIChDT05GSUdfS0dEQl9TRVJfSU5ERVggJiAyKSAqLwotI2VuZGlmCS8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvaXhwL2NwdS5jIGIvY3B1L2l4cC9jcHUuYwppbmRleCA3ZjlmMzM0Li4yYzdkNWEwIDEwMDY0NAotLS0gYS9jcHUvaXhwL2NwdS5jCisrKyBiL2NwdS9peHAvY3B1LmMKQEAgLTg1LDcgKzg1LDcgQEAKIAlGSVFfU1RBQ0tfU1RBUlQgPSBJUlFfU1RBQ0tfU1RBUlQgLSBDT05GSUdfU1RBQ0tTSVpFX0lSUTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENJKSB8fCBkZWZpbmVkIChDT05GSUdfUENJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ0kpIHx8IGRlZmluZWQgKENPTkZJR19QQ0kpCiAJcGNpX2luaXQoKTsKICNlbmRpZgogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvY3B1L2l4cC9ucGUvbnBlLmMgYi9jcHUvaXhwL25wZS9ucGUuYwppbmRleCBhYjdjYThiLi43ZTRhZjQ0IDEwMDY0NAotLS0gYS9jcHUvaXhwL25wZS9ucGUuYworKysgYi9jcHUvaXhwL25wZS9ucGUuYwpAQCAtNjgyLDcgKzY4Miw3IEBACiAKIAkJZXRoX3JlZ2lzdGVyKGRldik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAJCW1paXBoeV9yZWdpc3RlcihkZXYtPm5hbWUsIG5wZV9taWlwaHlfcmVhZCwgbnBlX21paXBoeV93cml0ZSk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvY3B1L21jZjUyeDIvZmVjLmMgYi9jcHUvbWNmNTJ4Mi9mZWMuYwppbmRleCBiNjU0MGI1Li5lZjljNzk4IDEwMDY0NAotLS0gYS9jcHUvbWNmNTJ4Mi9mZWMuYworKysgYi9jcHUvbWNmNTJ4Mi9mZWMuYwpAQCAtNTMsNyArNTMsNyBAQAogI3VuZGVmCUVUX0RFQlVHCiAjdW5kZWYJTUlJX0RFQlVHCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoRkVDX0VORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChGRUNfRU5FVCkKIAogI2lmZGVmIENGR19ESVNDT1ZFUl9QSFkKICNpbmNsdWRlIDxtaWlwaHkuaD4KQEAgLTM2Myw3ICszNjMsNyBAQAogfQogCiAKLSNpZiBkZWZpbmVkKENGR19ESVNDT1ZFUl9QSFkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENGR19ESVNDT1ZFUl9QSFkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAKIHN0YXRpYyBpbnQgcGh5YWRkciA9IC0xOwkvKiBkaWRuJ3QgZmluZCBhIFBIWSB5ZXQgKi8KIHN0YXRpYyB1aW50IHBoeXR5cGU7CkBAIC00MTksNyArNDE5LDcgQEAKICNlbmRpZgogCXJldHVybiAobWlpX3JlcGx5ICYgMHhmZmZmKTsJLyogZGF0YSByZWFkIGZyb20gcGh5ICovCiB9Ci0jZW5kaWYgLyogQ0ZHX0RJU0NPVkVSX1BIWSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICovCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ0ZHX0RJU0NPVkVSX1BIWSkKIHN0YXRpYyB2b2lkIG1paV9kaXNjb3Zlcl9waHkgKHZvaWQpCkBAIC00ODUsNyArNDg1LDcgQEAKIH0KICNlbmRpZiAvKiBDRkdfRElTQ09WRVJfUEhZICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICYmICFkZWZpbmVkKENPTkZJR19CSVRCQU5HTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NSUkpICYmICFkZWZpbmVkKENPTkZJR19CSVRCQU5HTUlJKQogCiBzdGF0aWMgaW50IG1paV9pbml0X2RvbmUgPSAwOwogCkBAIC01OTEsMTMgKzU5MSwxMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSAmJiAhZGVmaW5lZChDT05GSUdfQklUQkFOR01JSSkgKi8KLSNlbmRpZiAvKiBDRkdfQ01EX05FVCwgRkVDX0VORVQgKi8KKyNlbmRpZgorI2VuZGlmCiAKIGludCBtY2Y1MngyX21paXBoeV9pbml0aWFsaXplKGJkX3QgKmJpcykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoRkVDX0VORVQpCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSAmJiAhZGVmaW5lZChDT05GSUdfQklUQkFOR01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKEZFQ19FTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NSUkpICYmICFkZWZpbmVkKENPTkZJR19CSVRCQU5HTUlJKQogCW1paXBoeV9yZWdpc3RlcigibWNmNTJ4MnBoeSIsIG1jZjUyeDJfbWlpcGh5X3JlYWQsIG1jZjUyeDJfbWlpcGh5X3dyaXRlKTsKICNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbWljcm9ibGF6ZS9jYWNoZS5jIGIvY3B1L21pY3JvYmxhemUvY2FjaGUuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDRmMzZhODQuLjZjZTBiNTUKLS0tIGEvY3B1L21pY3JvYmxhemUvY2FjaGUuYworKysgYi9jcHUvbWljcm9ibGF6ZS9jYWNoZS5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQ0FDSEUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NBQ0hFKQogCiBpbnQgZGNhY2hlX3N0YXR1cyAodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2NwdS9taWNyb2JsYXplL2ludGVycnVwdHMuYyBiL2NwdS9taWNyb2JsYXplL2ludGVycnVwdHMuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGI2MTE1M2YuLjNmMDRiMjkKLS0tIGEvY3B1L21pY3JvYmxhemUvaW50ZXJydXB0cy5jCisrKyBiL2NwdS9taWNyb2JsYXplL2ludGVycnVwdHMuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiB9CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQogI2lmZGVmIENGR19JTlRDXzAKIGludCBkb19pcnFpbmZvIChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CkBAIC0yMTcsNCArMjE3LDQgQEAKIAlwdXRzICgiVW5kZWZpbmVkIGludGVycnVwdCBjb250cm9sbGVyXG4iKTsKIH0KICNlbmRpZgotI2VuZGlmCQkJCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9taWNyb2JsYXplL2lycS5TIGIvY3B1L21pY3JvYmxhemUvaXJxLlMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvY3B1L21pcHMvYXUxeDAwX2V0aC5jIGIvY3B1L21pcHMvYXUxeDAwX2V0aC5jCmluZGV4IDA3OGU4MzIuLmI2OTc0MWEgMTAwNjQ0Ci0tLSBhL2NwdS9taXBzL2F1MXgwMF9ldGguYworKysgYi9jcHUvbWlwcy9hdTF4MDBfZXRoLmMKQEAgLTYzLDcgKzYzLDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vYXUxeDAwLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKICNpbmNsdWRlIDxtaWlwaHkuaD4KICNlbmRpZgogCkBAIC0yNDEsNyArMjQxLDcgQEAKIAogCWV0aF9yZWdpc3RlcihkZXYpOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAJbWlpcGh5X3JlZ2lzdGVyKGRldi0+bmFtZSwKIAkJYXUxeDAwX21paXBoeV9yZWFkLCBhdTF4MDBfbWlpcGh5X3dyaXRlKTsKICNlbmRpZgpAQCAtMjQ5LDcgKzI0OSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKIGludCAgYXUxeDAwX21paXBoeV9yZWFkKGNoYXIgKmRldm5hbWUsIHVuc2lnbmVkIGNoYXIgYWRkciwKIAkJdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIHNob3J0ICogdmFsdWUpCiB7CkBAIC0zMDYsNiArMzA2LDYgQEAKIAkqbWlpX2NvbnRyb2xfcmVnID0gbWlpX2NvbnRyb2w7CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkgKi8KKyNlbmRpZgogCiAjZW5kaWYgLyogQ09ORklHX0FVMVgwMCAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzUxMngvTWFrZWZpbGUgYi9jcHUvbXBjNTEyeC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmUzNWIyCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzUxMngvTWFrZWZpbGUKQEAgLTAsMCArMSw0NiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDcgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZworIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChDUFUpLmEKKworU1RBUlQJPSBzdGFydC5vCitDT0JKUwk9IHRyYXBzLm8gY3B1Lm8gY3B1X2luaXQubyBzcGVlZC5vIGludGVycnVwdHMubyBzZXJpYWwubyBmZWMubyBpMmMubworCitTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKK1NUQVJUCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNUQVJUKSkKKworYWxsOgkkKG9iaikuZGVwZW5kICQoU1RBUlQpICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NwdS9tcGM1MTJ4L2NvbmZpZy5tayBiL2NwdS9tcGM1MTJ4L2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTA3YzVhCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzUxMngvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA3IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaQorCitQTEFURk9STV9DUFBGTEFHUyArPSAtRENPTkZJR19NUEM1MTJYIC1EQ09ORklHX0UzMDAgXAorCQkJLWZmaXhlZC1yMiAtZmZpeGVkLXIyOSAtbXNvZnQtZmxvYXQgLW1jcHU9NjAzZQpkaWZmIC0tZ2l0IGEvY3B1L21wYzUxMngvY3B1LmMgYi9jcHUvbXBjNTEyeC9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2NhZTZlCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzUxMngvY3B1LmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogKEMpIENvcHlyaWdodCAyMDA3IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogQ1BVIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBNUEM1MTJ4IGZhbWlseS4KKyAqCisgKiBEZXJpdmVkIGZyb20gdGhlIE1QQzgzeHggY29kZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPG1wYzUxMnguaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCitpbnQgY2hlY2tjcHUgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENGR19JTU1SOworCXVsb25nIGNsb2NrID0gZ2QtPmNwdV9jbGs7CisJdTMyIHB2ciA9IGdldF9wdnIgKCk7CisJdTMyIHNwcmlkciA9IGltbXItPnN5c2NvbmYuc3ByaWRyOworCWNoYXIgYnVmWzMyXTsKKworCXB1dHMgKCJDUFU6ICAgIik7CisKKwlzd2l0Y2ggKHNwcmlkciAmIDB4ZmZmZjAwMDApIHsKKwljYXNlIFNQUl81MTIxRToKKwkJcHV0cyAoIk1QQzUxMjFlICIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYgKCJVbmtub3duIHBhcnQgSUQgJTA4eCAiLCBzcHJpZHIgJiAweGZmZmYwMDAwKTsKKwl9CisJcHJpbnRmICgicmV2LiAlZC4lZCwgQ29yZSAiLCBTVlJfTUpSRVYgKHNwcmlkciksIFNWUl9NTlJFViAoc3ByaWRyKSk7CisKKwlzd2l0Y2ggKHB2ciAmIDB4ZmZmZjAwMDApIHsKKwljYXNlIFBWUl9FMzAwQzQ6CisJCXB1dHMgKCJlMzAwYzQgIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXB1dHMgKCJ1bmtub3duICIpOworCX0KKwlwcmludGYgKCJhdCAlcyBNSHosIENTQiBhdCAlM2QgTUh6XG4iLCBzdHJtaHooYnVmLCBjbG9jayksCisJCWdkLT5jc2JfY2xrIC8gMTAwMDAwMCk7CisJcmV0dXJuIDA7Cit9CisKKworaW50Citkb19yZXNldCAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXVsb25nIG1zcjsKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19JTU1SOworCisJLyogSW50ZXJydXB0cyBhbmQgTU1VIG9mZiAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICgibWZtc3IgICAgJTAiOiI9ciIgKG1zcik6KTsKKworCW1zciAmPSB+KCBNU1JfRUUgfCBNU1JfSVIgfCBNU1JfRFIpOworCV9fYXNtX18gX192b2xhdGlsZV9fICgibXRtc3IgICAgJTAiOjoiciIgKG1zcikpOworCisJLyoKKwkgKiBFbmFibGUgUmVzZXQgQ29udHJvbCBSZWcgLSAiUlNURSIgaXMgdGhlIG1hZ2ljIHdvcmQgdGhhdCBsZXQgdXMgZ28KKwkgKi8KKwlpbW1hcC0+cmVzZXQucnByID0gMHg1MjUzNTQ0NTsKKworCS8qIFZlcmlmeSBSZXNldCBDb250cm9sIFJlZyBpcyBlbmFibGVkICovCisJd2hpbGUgKCEoKGltbWFwLT5yZXNldC5yY2VyKSAmIFJDRVJfQ1JFKSkKKwkJOworCisJcHJpbnRmICgiUmVzZXR0aW5nIHRoZSBib2FyZC5cbiIpOworCXVkZWxheSgyMDApOworCisJLyogUGVyZm9ybSByZXNldCAqLworCWltbWFwLT5yZXNldC5yY3IgPSBSQ1JfU1dIUjsKKworCS8qIFVucmVhY2hlZC4uLiAqLworCXJldHVybiAxOworfQorCisKKy8qCisgKiBHZXQgdGltZWJhc2UgY2xvY2sgZnJlcXVlbmN5IChsaWtlIGNwdV9jbGsgaW4gSHopCisgKi8KK3Vuc2lnbmVkIGxvbmcgZ2V0X3RiY2xrICh2b2lkKQoreworCXVsb25nIHRiY2xrOworCisJdGJjbGsgPSAoZ2QtPmJ1c19jbGsgKyAzTCkgLyA0TDsKKworCXJldHVybiB0YmNsazsKK30KKworCisjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCit2b2lkIHdhdGNoZG9nX3Jlc2V0ICh2b2lkKQoreworCWludCByZV9lbmFibGUgPSBkaXNhYmxlX2ludGVycnVwdHMgKCk7CisKKwkvKiBSZXNldCB3YXRjaGRvZyAqLworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwlpbW1yLT53ZHQuc3dzcnIgPSAweDU1NmM7CisJaW1tci0+d2R0LnN3c3JyID0gMHhhYTM5OworCisJaWYgKHJlX2VuYWJsZSkKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM1MTJ4L2NwdV9pbml0LmMgYi9jcHUvbXBjNTEyeC9jcHVfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTQ5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNTEyeC9jcHVfaW5pdC5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogKEMpIENvcHlyaWdodCAyMDA3IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBEZXJpdmVkIGZyb20gdGhlIE1QQzgzeHggY29kZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzUxMnguaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKy8qCisgKiBTZXQgdXAgdGhlIG1lbW9yeSBtYXAsIGluaXRpYWxpemUgcmVnaXN0ZXJzLAorICovCit2b2lkIGNwdV9pbml0X2YgKHZvbGF0aWxlIGltbWFwX3QgKiBpbSkKK3sKKwl1MzIgaXBzX2RpdjsKKworCS8qIFBvaW50ZXIgaXMgd3JpdGFibGUgc2luY2Ugd2UgYWxsb2NhdGVkIGEgcmVnaXN0ZXIgZm9yIGl0ICovCisJZ2QgPSAoZ2RfdCAqKSAoQ0ZHX0lOSVRfUkFNX0FERFIgKyBDRkdfR0JMX0RBVEFfT0ZGU0VUKTsKKworCS8qIENsZWFyIGluaXRpYWwgZ2xvYmFsIGRhdGEgKi8KKwltZW1zZXQgKCh2b2lkICopIGdkLCAwLCBzaXplb2YgKGdkX3QpKTsKKworCS8qIHN5c3RlbSBwZXJmb3JtYW5jZSB0d2Vha2luZyAqLworCisjaWZkZWYgQ0ZHX0FDUl9QSVBFX0RFUAorCS8qIEFyYml0ZXIgcGlwZWxpbmUgZGVwdGggKi8KKwlpbS0+YXJiaXRlci5hY3IgPSAoaW0tPmFyYml0ZXIuYWNyICYgfkFDUl9QSVBFX0RFUCkgfAorCQkJICAoQ0ZHX0FDUl9QSVBFX0RFUCA8PCBBQ1JfUElQRV9ERVBfU0hJRlQpOworI2VuZGlmCisKKyNpZmRlZiBDRkdfQUNSX1JQVENOVAorCS8qIEFyYml0ZXIgcmVwZWF0IGNvdW50ICovCisJaW0tPmFyYml0ZXIuYWNyID0gKChpbS0+YXJiaXRlci5hY3IgJiB+KEFDUl9SUFRDTlQpKSB8CisJCQkgICAoQ0ZHX0FDUl9SUFRDTlQgPDwgQUNSX1JQVENOVF9TSElGVCkpOworI2VuZGlmCisKKwkvKiBSU1IgLSBSZXNldCBTdGF0dXMgUmVnaXN0ZXIgLSBjbGVhciBhbGwgc3RhdHVzICovCisJZ2QtPnJlc2V0X3N0YXR1cyA9IGltLT5yZXNldC5yc3I7CisJaW0tPnJlc2V0LnJzciA9IH4oUlNSX1JFUyk7CisKKwkvKgorCSAqIFJNUiAtIFJlc2V0IE1vZGUgUmVnaXN0ZXIgLSBlbmFibGUgY2hlY2tzdG9wIHJlc2V0CisJICovCisJaW0tPnJlc2V0LnJtciA9IChSTVJfQ1NSRSAmICgxIDw8IFJNUl9DU1JFX1NISUZUKSk7CisKKwkvKiBTZXQgSVBTLUNTQiBkaXZpZGVyOiBJUFMgPSAxLzIgQ1NCICovCisJaXBzX2RpdiA9IGltLT5jbGsuc2NmclswXTsKKwlpcHNfZGl2ICY9IH4oU0NGUjFfSVBTX0RJVl9NQVNLKTsKKwlpcHNfZGl2IHw9IFNDRlIxX0lQU19ESVYgPDwgU0NGUjFfSVBTX0RJVl9TSElGVDsKKwlpbS0+Y2xrLnNjZnJbMF0gPSBpcHNfZGl2OworCisJLyoKKwkgKiBFbmFibGUgVGltZSBCYXNlL0RlY3JlbWVudGVyCisJICoKKwkgKiBOT1RJQ0U6IFRCIG5lZWRzIHRvIGJlIGVuYWJsZWQgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gb3JkZXIgdG8KKwkgKiBoYXZlIHVkZWxheSgpIHdvcmtpbmc7IGlmIG5vdCBlbmFibGVkLCB1c3VhbGx5IGxlYWRzIHRvIGEgaGFuZywgbGlrZQorCSAqIGR1cmluZyBGTEFTSCBjaGlwIGlkZW50aWZpY2F0aW9uIGV0Yy4KKwkgKi8KKwlpbS0+c3lzY29uZi5zcGNyIHw9IFNQQ1JfVEJFTjsKK30KKworaW50IGNwdV9pbml0X3IgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jcHUvbXBjNTEyeC9mZWMuYyBiL2NwdS9tcGM1MTJ4L2ZlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMTQyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNTEyeC9mZWMuYwpAQCAtMCwwICsxLDgwMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIERlcml2ZWQgZnJvbSB0aGUgTVBDOHh4IEZFQyBkcml2ZXIuCisgKiBBZGFwdGVkIGZvciBNUEM1MTJ4IGJ5IEdyemVnb3J6IEJlcm5hY2tpIDxnamJAc2VtaWhhbGYuY29tPgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM1MTJ4Lmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8bWlpcGh5Lmg+CisjaW5jbHVkZSAiZmVjLmgiCisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjZGVmaW5lIERFQlVHIDAKKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAorCWRlZmluZWQoQ09ORklHX01QQzUxMnhfRkVDKQorCisjaWYgIShkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpKQorI2Vycm9yICJDT05GSUdfTUlJIGhhcyB0byBiZSBkZWZpbmVkISIKKyNlbmRpZgorCisjaWYgKERFQlVHICYgMHg0MCkKK3N0YXRpYyB1aW50MzIgbG9jYWxfY3JjMzIoY2hhciAqc3RyaW5nLCB1bnNpZ25lZCBpbnQgY3JjX3ZhbHVlLCBpbnQgbGVuKTsKKyNlbmRpZgorCitpbnQgZmVjNTEyeF9taWlwaHlfcmVhZChjaGFyICpkZXZuYW1lLCB1aW50OCBwaHlBZGRyLCB1aW50OCByZWdBZGRyLCB1aW50MTYgKiByZXRWYWwpOworaW50IGZlYzUxMnhfbWlpcGh5X3dyaXRlKGNoYXIgKmRldm5hbWUsIHVpbnQ4IHBoeUFkZHIsIHVpbnQ4IHJlZ0FkZHIsIHVpbnQxNiBkYXRhKTsKK2ludCBtcGM1MTJ4X2ZlY19pbml0X3BoeShzdHJ1Y3QgZXRoX2RldmljZSAqZGV2LCBiZF90ICogYmlzKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIChERUJVRyAmIDB4MikKK3N0YXRpYyB2b2lkIG1wYzUxMnhfZmVjX3BoeWR1bXAgKGNoYXIgKmRldm5hbWUpCit7CisJdWludDE2IHBoeVN0YXR1cywgaTsKKwl1aW50OCBwaHlBZGRyID0gQ09ORklHX1BIWV9BRERSOworCXVpbnQ4IHJlZ19tYXNrW10gPSB7CisJCS8qIHJlZ3MgdG8gcHJpbnQ6IDAuLi44LCAyMSwyNywzMSAqLworCQkxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgICAgIDEsIDAsIDAsIDAsICAwLCAwLCAwLCAwLAorCQkwLCAwLCAwLCAwLCAgMCwgMSwgMCwgMCwgICAgIDAsIDAsIDAsIDEsICAwLCAwLCAwLCAxLAorCX07CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQlpZiAocmVnX21hc2tbaV0pIHsKKwkJCW1paXBoeV9yZWFkIChkZXZuYW1lLCBwaHlBZGRyLCBpLCAmcGh5U3RhdHVzKTsKKwkJCXByaW50ZiAoIk1paSByZWcgJWQ6IDB4JTA0eFxuIiwgaSwgcGh5U3RhdHVzKTsKKwkJfQorCX0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG1wYzUxMnhfZmVjX2JkX2luaXQgKG1wYzUxMnhfZmVjX3ByaXYgKmZlYykKK3sKKwlpbnQgaXg7CisKKwkvKgorCSAqIFJlY2VpdmUgQkRzIGluaXQKKwkgKi8KKwlmb3IgKGl4ID0gMDsgaXggPCBGRUNfUkJEX05VTTsgaXgrKykgeworCQlmZWMtPmJkQmFzZS0+cmJkW2l4XS5kYXRhUG9pbnRlciA9ICh1aW50MzIpJmZlYy0+YmRCYXNlLT5yZWN2X2ZyYW1lc1tpeF07CisJCWZlYy0+YmRCYXNlLT5yYmRbaXhdLnN0YXR1cyA9IEZFQ19SQkRfRU1QVFk7CisJCWZlYy0+YmRCYXNlLT5yYmRbaXhdLmRhdGFMZW5ndGggPSAwOworCX0KKworCS8qCisJICogaGF2ZSB0aGUgbGFzdCBSQkQgdG8gY2xvc2UgdGhlIHJpbmcKKwkgKi8KKwlmZWMtPmJkQmFzZS0+cmJkW2l4IC0gMV0uc3RhdHVzIHw9IEZFQ19SQkRfV1JBUDsKKwlmZWMtPnJiZEluZGV4ID0gMDsKKworCS8qCisJICogVHJhc21pdCBCRHMgaW5pdAorCSAqLworCWZvciAoaXggPSAwOyBpeCA8IEZFQ19UQkRfTlVNOyBpeCsrKSB7CisJCWZlYy0+YmRCYXNlLT50YmRbaXhdLnN0YXR1cyA9IDA7CisJfQorCisJLyoKKwkgKiBIYXZlIHRoZSBsYXN0IFRCRCB0byBjbG9zZSB0aGUgcmluZworCSAqLworCWZlYy0+YmRCYXNlLT50YmRbaXggLSAxXS5zdGF0dXMgfD0gRkVDX1RCRF9XUkFQOworCisJLyoKKwkgKiBJbml0aWFsaXplIHNvbWUgaW5kaWNlcworCSAqLworCWZlYy0+dGJkSW5kZXggPSAwOworCWZlYy0+dXNlZFRiZEluZGV4ID0gMDsKKwlmZWMtPmNsZWFuVGJkTnVtID0gRkVDX1RCRF9OVU07CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbXBjNTEyeF9mZWNfcmJkX2NsZWFuIChtcGM1MTJ4X2ZlY19wcml2ICpmZWMsIHZvbGF0aWxlIEZFQ19SQkQgKiBwUmJkKQoreworCS8qCisJICogUmVzZXQgYnVmZmVyIGRlc2NyaXB0b3IgYXMgZW1wdHkKKwkgKi8KKwlpZiAoKGZlYy0+cmJkSW5kZXgpID09IChGRUNfUkJEX05VTSAtIDEpKQorCQlwUmJkLT5zdGF0dXMgPSAoRkVDX1JCRF9XUkFQIHwgRkVDX1JCRF9FTVBUWSk7CisJZWxzZQorCQlwUmJkLT5zdGF0dXMgPSBGRUNfUkJEX0VNUFRZOworCisJcFJiZC0+ZGF0YUxlbmd0aCA9IDA7CisKKwkvKgorCSAqIEluY3JlbWVudCBCRCBjb3VudAorCSAqLworCWZlYy0+cmJkSW5kZXggPSAoZmVjLT5yYmRJbmRleCArIDEpICUgRkVDX1JCRF9OVU07CisKKwkvKgorCSAqIE5vdywgd2UgaGF2ZSBhbiBlbXB0eSBSeEJELCBub3RpZnkgRkVDCisJICovCisJZmVjLT5ldGgtPnJfZGVzX2FjdGl2ZSA9IDB4MDEwMDAwMDA7CS8qIERlc2NyaXB0b3IgcG9sbGluZyBhY3RpdmUgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbXBjNTEyeF9mZWNfdGJkX3NjcnViIChtcGM1MTJ4X2ZlY19wcml2ICpmZWMpCit7CisJdm9sYXRpbGUgRkVDX1RCRCAqcFVzZWRUYmQ7CisKKyNpZiAoREVCVUcgJiAweDEpCisJcHJpbnRmICgidGJkX3NjcnViOiBmZWMtPmNsZWFuVGJkTnVtID0gJWQsIGZlYy0+dXNlZFRiZEluZGV4ID0gJWRcbiIsCisJCWZlYy0+Y2xlYW5UYmROdW0sIGZlYy0+dXNlZFRiZEluZGV4KTsKKyNlbmRpZgorCisJLyoKKwkgKiBwcm9jZXNzIGFsbCB0aGUgY29uc3VtZWQgVEJEcworCSAqLworCXdoaWxlIChmZWMtPmNsZWFuVGJkTnVtIDwgRkVDX1RCRF9OVU0pIHsKKwkJcFVzZWRUYmQgPSAmZmVjLT5iZEJhc2UtPnRiZFtmZWMtPnVzZWRUYmRJbmRleF07CisJCWlmIChwVXNlZFRiZC0+c3RhdHVzICYgRkVDX1RCRF9SRUFEWSkgeworI2lmIChERUJVRyAmIDB4MjApCisJCQlwcmludGYgKCJDYW5ub3QgY2xlYW4gVEJEICVkLCBpbiB1c2VcbiIsIGZlYy0+dXNlZFRiZEluZGV4KTsKKyNlbmRpZgorCQkJcmV0dXJuOworCQl9CisKKwkJLyoKKwkJICogY2xlYW4gdGhpcyBidWZmZXIgZGVzY3JpcHRvcgorCQkgKi8KKwkJaWYgKGZlYy0+dXNlZFRiZEluZGV4ID09IChGRUNfVEJEX05VTSAtIDEpKQorCQkJcFVzZWRUYmQtPnN0YXR1cyA9IEZFQ19UQkRfV1JBUDsKKwkJZWxzZQorCQkJcFVzZWRUYmQtPnN0YXR1cyA9IDA7CisKKwkJLyoKKwkJICogdXBkYXRlIHNvbWUgaW5kZWNlcyBmb3IgYSBjb3JyZWN0IGhhbmRsaW5nIG9mIHRoZSBUQkQgcmluZworCQkgKi8KKwkJZmVjLT5jbGVhblRiZE51bSsrOworCQlmZWMtPnVzZWRUYmRJbmRleCA9IChmZWMtPnVzZWRUYmRJbmRleCArIDEpICUgRkVDX1RCRF9OVU07CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBtcGM1MTJ4X2ZlY19zZXRfaHdhZGRyIChtcGM1MTJ4X2ZlY19wcml2ICpmZWMsIGNoYXIgKm1hYykKK3sKKwl1aW50OCBjdXJyQnl0ZTsJCQkvKiBieXRlIGZvciB3aGljaCB0byBjb21wdXRlIHRoZSBDUkMgKi8KKwlpbnQgYnl0ZTsJCQkvKiBsb29wIC0gY291bnRlciAqLworCWludCBiaXQ7CQkJLyogbG9vcCAtIGNvdW50ZXIgKi8KKwl1aW50MzIgY3JjID0gMHhmZmZmZmZmZjsJLyogaW5pdGlhbCB2YWx1ZSAqLworCisJLyoKKwkgKiBUaGUgYWxnb3JpdGhtIHVzZWQgaXMgdGhlIGZvbGxvd2luZzoKKwkgKiB3ZSBsb29wIG9uIGVhY2ggb2YgdGhlIHNpeCBieXRlcyBvZiB0aGUgcHJvdmlkZWQgYWRkcmVzcywKKwkgKiBhbmQgd2UgY29tcHV0ZSB0aGUgQ1JDIGJ5IGxlZnQtc2hpZnRpbmcgdGhlIHByZXZpb3VzCisJICogdmFsdWUgYnkgb25lIHBvc2l0aW9uLCBzbyB0aGF0IGVhY2ggYml0IGluIHRoZSBjdXJyZW50CisJICogYnl0ZSBvZiB0aGUgYWRkcmVzcyBtYXkgY29udHJpYnV0ZSB0aGUgY2FsY3VsYXRpb24uIElmCisJICogdGhlIGxhdHRlciBhbmQgdGhlIE1TQiBpbiB0aGUgQ1JDIGFyZSBkaWZmZXJlbnQsIHRoZW4KKwkgKiB0aGUgQ1JDIHZhbHVlIHNvIGNvbXB1dGVkIGlzIGFsc28gZXgtb3JlZCB3aXRoIHRoZQorCSAqICJwb2x5bm9taXVtIGdlbmVyYXRvciIuIFRoZSBjdXJyZW50IGJ5dGUgb2YgdGhlIGFkZHJlc3MKKwkgKiBpcyBhbHNvIHNoaWZ0ZWQgcmlnaHQgYnkgb25lIGJpdCBhdCBlYWNoIGl0ZXJhdGlvbi4KKwkgKiBUaGlzIGlzIGJlY2F1c2UgdGhlIENSQyBnZW5lcmF0b3JlIGluIGhhcmR3YXJlIGlzIGltcGxlbWVudGVkCisJICogYXMgYSBzaGlmdC1yZWdpc3RlciB3aXRoIGFzIG1hbnkgZXgtb3JlcyBhcyB0aGUgcmFkaXhlcworCSAqIGluIHRoZSBwb2x5bm9taXVtLiBUaGlzIHN1Z2dlc3RzIHRoYXQgd2UgcmVwcmVzZW50IHRoZQorCSAqIHBvbHlub21pdW1tIGl0c2VsZiBhcyBhIDMyLWJpdCBjb25zdGFudC4KKwkgKi8KKwlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgNjsgYnl0ZSsrKSB7CisJCWN1cnJCeXRlID0gbWFjW2J5dGVdOworCQlmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7CisJCQlpZiAoKGN1cnJCeXRlICYgMHgwMSkgXiAoY3JjICYgMHgwMSkpIHsKKwkJCQljcmMgPj49IDE7CisJCQkJY3JjID0gY3JjIF4gMHhlZGI4ODMyMDsKKwkJCX0gZWxzZSB7CisJCQkJY3JjID4+PSAxOworCQkJfQorCQkJY3VyckJ5dGUgPj49IDE7CisJCX0KKwl9CisKKwljcmMgPSBjcmMgPj4gMjY7CisKKwkvKgorCSAqIFNldCBpbmRpdmlkdWFsIGhhc2ggdGFibGUgcmVnaXN0ZXIKKwkgKi8KKwlpZiAoY3JjID49IDMyKSB7CisJCWZlYy0+ZXRoLT5pYWRkcjEgPSAoMSA8PCAoY3JjIC0gMzIpKTsKKwkJZmVjLT5ldGgtPmlhZGRyMiA9IDA7CisJfSBlbHNlIHsKKwkJZmVjLT5ldGgtPmlhZGRyMSA9IDA7CisJCWZlYy0+ZXRoLT5pYWRkcjIgPSAoMSA8PCBjcmMpOworCX0KKworCS8qCisJICogU2V0IHBoeXNpY2FsIGFkZHJlc3MKKwkgKi8KKwlmZWMtPmV0aC0+cGFkZHIxID0gKG1hY1swXSA8PCAyNCkgKyAobWFjWzFdIDw8IDE2KSArIChtYWNbMl0gPDwgOCkgKyBtYWNbM107CisJZmVjLT5ldGgtPnBhZGRyMiA9IChtYWNbNF0gPDwgMjQpICsgKG1hY1s1XSA8PCAxNikgKyAweDg4MDg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgbXBjNTEyeF9mZWNfaW5pdCAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgYmRfdCAqIGJpcykKK3sKKwltcGM1MTJ4X2ZlY19wcml2ICpmZWMgPSAobXBjNTEyeF9mZWNfcHJpdiAqKWRldi0+cHJpdjsKKworI2lmIChERUJVRyAmIDB4MSkKKwlwcmludGYgKCJtcGM1MTJ4X2ZlY19pbml0Li4uIEJlZ2luXG4iKTsKKyNlbmRpZgorCisJLyogU2V0IGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisJZmVjLT5ldGgtPmltYXNrID0gMHgwMDAwMDAwMDsKKworCS8qIENsZWFyIEZFQy1MaXRlIGludGVycnVwdCBldmVudCByZWdpc3RlcihJRVZFTlQpICovCisJZmVjLT5ldGgtPmlldmVudCA9IDB4ZmZmZmZmZmY7CisKKwkvKiBTZXQgdHJhbnNtaXQgZmlmbyB3YXRlcm1hcmsgcmVnaXN0ZXIoWF9XTVJLKSwgZGVmYXVsdCA9IDY0ICovCisJZmVjLT5ldGgtPnhfd21yayA9IDB4MDsKKworCS8qIFNldCBPcGNvZGUvUGF1c2UgRHVyYXRpb24gUmVnaXN0ZXIgKi8KKwlmZWMtPmV0aC0+b3BfcGF1c2UgPSAweDAwMDEwMDIwOworCisJLyogRnJhbWUgbGVuZ3RoPTE1MTg7IE1JSSBtb2RlICovCisJZmVjLT5ldGgtPnJfY250cmwgPSAweDA1ZWUwMDBjOworCisJLyogSGFsZi1kdXBsZXgsIGhlYXJ0YmVhdCBkaXNhYmxlZCAqLworCWZlYy0+ZXRoLT54X2NudHJsID0gMHgwMDAwMDAwMDsKKworCS8qIEVuYWJsZSBNSUIgY291bnRlcnMgKi8KKwlmZWMtPmV0aC0+bWliX2NvbnRyb2wgPSAweDA7CisKKwkvKiBTZXR1cCByZWN2IGZpZm8gc3RhcnQgYW5kIGJ1ZmYgc2l6ZSAqLworCWZlYy0+ZXRoLT5yX2ZzdGFydCA9IDB4NTAwOworCWZlYy0+ZXRoLT5yX2J1ZmZfc2l6ZSA9IDB4NWUwOworCisJLyogU2V0dXAgQkQgYmFzZSBhZGRyZXNzZXMgKi8KKwlmZWMtPmV0aC0+cl9kZXNfc3RhcnQgPSAodWludDMyKWZlYy0+YmRCYXNlLT5yYmQ7CisJZmVjLT5ldGgtPnhfZGVzX3N0YXJ0ID0gKHVpbnQzMilmZWMtPmJkQmFzZS0+dGJkOworCisJLyogRE1BIENvbnRyb2wgKi8KKwlmZWMtPmV0aC0+ZG1hX2NvbnRyb2wgPSAweGMwMDAwMDAwOworCisJLyogRW5hYmxlIEZFQyAqLworCWZlYy0+ZXRoLT5lY250cmwgfD0gMHgwMDAwMDAwNjsKKworCS8qIEluaXRpbGl6ZSBhZGRyZXNzZXMgYW5kIHN0YXR1cyB3b3JkcyBvZiBCRHMgKi8KKwltcGM1MTJ4X2ZlY19iZF9pbml0IChmZWMpOworCisJIC8qIERlc2NyaXB0b3IgcG9sbGluZyBhY3RpdmUgKi8KKwlmZWMtPmV0aC0+cl9kZXNfYWN0aXZlID0gMHgwMTAwMDAwMDsKKworI2lmIChERUJVRyAmIDB4MSkKKwlwcmludGYoIm1wYzUxMnhfZmVjX2luaXQuLi4gRG9uZSBcbiIpOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtcGM1MTJ4X2ZlY19pbml0X3BoeSAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgYmRfdCAqIGJpcykKK3sKKwltcGM1MTJ4X2ZlY19wcml2ICpmZWMgPSAobXBjNTEyeF9mZWNfcHJpdiAqKWRldi0+cHJpdjsKKwljb25zdCB1aW50OCBwaHlBZGRyID0gQ09ORklHX1BIWV9BRERSOwkvKiBPbmx5IG9uZSBQSFkgKi8KKwlpbnQgdGltZW91dCA9IDE7CisJdWludDE2IHBoeVN0YXR1czsKKworI2lmIChERUJVRyAmIDB4MSkKKwlwcmludGYgKCJtcGM1MTJ4X2ZlY19pbml0X3BoeS4uLiBCZWdpblxuIik7CisjZW5kaWYKKworCS8qCisJICogQ2xlYXIgRkVDLUxpdGUgaW50ZXJydXB0IGV2ZW50IHJlZ2lzdGVyKElFVkVOVCkKKwkgKi8KKwlmZWMtPmV0aC0+aWV2ZW50ID0gMHhmZmZmZmZmZjsKKworCS8qCisJICogU2V0IGludGVycnVwdCBtYXNrIHJlZ2lzdGVyCisJICovCisJZmVjLT5ldGgtPmltYXNrID0gMHgwMDAwMDAwMDsKKworCWlmIChmZWMtPnhjdl90eXBlICE9IFNFVkVOV0lSRSkgeworCQkvKgorCQkgKiBTZXQgTUlJX1NQRUVEID0gKDEvKG1paV9zcGVlZCAqIDIpKSAqIFN5c3RlbSBDbG9jaworCQkgKiBhbmQgZG8gbm90IGRyb3AgdGhlIFByZWFtYmxlLgorCQkgKi8KKwkJZmVjLT5ldGgtPm1paV9zcGVlZCA9ICgoKGdkLT5pcGJfY2xrIC8gMTAwMDAwMCkgLyA1KSArIDEpIDw8IDE7CisKKwkJLyoKKwkJICogUmVzZXQgUEhZLCB0aGVuIGRlbGF5IDMwMG5zCisJCSAqLworCQltaWlwaHlfd3JpdGUgKGRldi0+bmFtZSwgcGh5QWRkciwgMHgwLCAweDgwMDApOworCQl1ZGVsYXkgKDEwMDApOworCisJCWlmIChmZWMtPnhjdl90eXBlID09IE1JSTEwKSB7CisJCS8qCisJCSAqIEZvcmNlIDEwQmFzZS1ULCBGRFggb3BlcmF0aW9uCisJCSAqLworI2lmIChERUJVRyAmIDB4MikKKwkJCXByaW50ZiAoIkZvcmNpbmcgMTAgTWJwcyBldGhlcm5ldCBsaW5rLi4uICIpOworI2VuZGlmCisJCQltaWlwaHlfcmVhZCAoZGV2LT5uYW1lLCBwaHlBZGRyLCAweDEsICZwaHlTdGF0dXMpOworCisJCQltaWlwaHlfd3JpdGUgKGRldi0+bmFtZSwgcGh5QWRkciwgMHgwLCAweDAxODApOworCisJCQl0aW1lb3V0ID0gMjA7CisJCQlkbyB7ICAgIC8qIHdhaXQgZm9yIGxpbmsgc3RhdHVzIHRvIGdvIGRvd24gKi8KKwkJCQl1ZGVsYXkgKDEwMDAwKTsKKwkJCQlpZiAoKHRpbWVvdXQtLSkgPT0gMCkgeworI2lmIChERUJVRyAmIDB4MikKKwkJCQkJcHJpbnRmICgiaG1tbSwgc2hvdWxkIG5vdCBoYXZlIHdhaXRlZC4uLiIpOworI2VuZGlmCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQltaWlwaHlfcmVhZCAoZGV2LT5uYW1lLCBwaHlBZGRyLCAweDEsICZwaHlTdGF0dXMpOworI2lmIChERUJVRyAmIDB4MikKKwkJCQlwcmludGYgKCI9Iik7CisjZW5kaWYKKwkJCX0gd2hpbGUgKChwaHlTdGF0dXMgJiAweDAwMDQpKTsgLyogIWxpbmsgdXAgKi8KKworCQkJdGltZW91dCA9IDEwMDA7CisJCQlkbyB7ICAgIC8qIHdhaXQgZm9yIGxpbmsgc3RhdHVzIHRvIGNvbWUgYmFjayB1cCAqLworCQkJCXVkZWxheSAoMTAwMDApOworCQkJCWlmICgodGltZW91dC0tKSA9PSAwKSB7CisJCQkJCXByaW50ZiAoImZhaWxlZC4gTGluayBpcyBkb3duLlxuIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQltaWlwaHlfcmVhZCAoZGV2LT5uYW1lLCBwaHlBZGRyLCAweDEsICZwaHlTdGF0dXMpOworI2lmIChERUJVRyAmIDB4MikKKwkJCQlwcmludGYgKCIrIik7CisjZW5kaWYKKwkJCX0gd2hpbGUgKCEocGh5U3RhdHVzICYgMHgwMDA0KSk7IC8qICFsaW5rIHVwICovCisKKyNpZiAoREVCVUcgJiAweDIpCisJCQlwcmludGYgKCJkb25lLlxuIik7CisjZW5kaWYKKwkJfSBlbHNlIHsJLyogTUlJMTAwICovCisJCQkvKgorCQkJICogU2V0IHRoZSBhdXRvLW5lZ290aWF0aW9uIGFkdmVydGlzZW1lbnQgcmVnaXN0ZXIgYml0cworCQkJICovCisJCQltaWlwaHlfd3JpdGUgKGRldi0+bmFtZSwgcGh5QWRkciwgMHg0LCAweDAxZTEpOworCisJCQkvKgorCQkJICogU2V0IE1ESU8gYml0IDAuMTIgPSAxKCYmIGJpdCAwLjk9MT8pIHRvIGVuYWJsZSBhdXRvLW5lZ290aWF0aW9uCisJCQkgKi8KKwkJCW1paXBoeV93cml0ZSAoZGV2LT5uYW1lLCBwaHlBZGRyLCAweDAsIDB4MTIwMCk7CisKKwkJCS8qCisJCQkgKiBXYWl0IGZvciBBTiBjb21wbGV0aW9uCisJCQkgKi8KKwkJCXRpbWVvdXQgPSA1MDAwMDsKKwkJCWRvIHsKKwkJCQl1ZGVsYXkgKDEwMDApOworCisJCQkJaWYgKCh0aW1lb3V0LS0pID09IDApIHsKKyNpZiAoREVCVUcgJiAweDIpCisJCQkJCXByaW50ZiAoIlBIWSBhdXRvIG5lZyAwIGZhaWxlZC4uLlxuIik7CisjZW5kaWYKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKworCQkJCWlmIChtaWlwaHlfcmVhZCAoZGV2LT5uYW1lLCBwaHlBZGRyLCAweDEsICZwaHlTdGF0dXMpICE9IDApIHsKKyNpZiAoREVCVUcgJiAweDIpCisJCQkJCXByaW50ZiAoIlBIWSBhdXRvIG5lZyAxIGZhaWxlZCAweCUwNHguLi5cbiIsIHBoeVN0YXR1cyk7CisjZW5kaWYKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0gd2hpbGUgKCEocGh5U3RhdHVzICYgMHgwMDA0KSk7CisKKyNpZiAoREVCVUcgJiAweDIpCisJCQlwcmludGYgKCJQSFkgYXV0byBuZWcgY29tcGxldGUhIFxuIik7CisjZW5kaWYKKwkJfQorCX0KKworI2lmIChERUJVRyAmIDB4MikKKwlpZiAoZmVjLT54Y3ZfdHlwZSAhPSBTRVZFTldJUkUpCisJCW1wYzUxMnhfZmVjX3BoeWR1bXAgKGRldi0+bmFtZSk7CisjZW5kaWYKKworI2lmIChERUJVRyAmIDB4MSkKKwlwcmludGYgKCJtcGM1MTJ4X2ZlY19pbml0X3BoeS4uLiBEb25lIFxuIik7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbXBjNTEyeF9mZWNfaGFsdCAoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKwltcGM1MTJ4X2ZlY19wcml2ICpmZWMgPSAobXBjNTEyeF9mZWNfcHJpdiAqKWRldi0+cHJpdjsKKwlpbnQgY291bnRlciA9IDB4ZmZmZjsKKworI2lmIChERUJVRyAmIDB4MikKKwlpZiAoZmVjLT54Y3ZfdHlwZSAhPSBTRVZFTldJUkUpCisJCW1wYzUxMnhfZmVjX3BoeWR1bXAgKGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qCisJICogbWFzayBGRUMgY2hpcCBpbnRlcnJ1cHRzCisJICovCisJZmVjLT5ldGgtPmltYXNrID0gMDsKKworCS8qCisJICogaXNzdWUgZ3JhY2VmdWwgc3RvcCBjb21tYW5kIHRvIHRoZSBGRUMgdHJhbnNtaXR0ZXIgaWYgbmVjZXNzYXJ5CisJICovCisJZmVjLT5ldGgtPnhfY250cmwgfD0gMHgwMDAwMDAwMTsKKworCS8qCisJICogd2FpdCBmb3IgZ3JhY2VmdWwgc3RvcCB0byByZWdpc3RlcgorCSAqLworCXdoaWxlICgoY291bnRlci0tKSAmJiAoIShmZWMtPmV0aC0+aWV2ZW50ICYgMHgxMDAwMDAwMCkpKSA7CisKKwkvKgorCSAqIERpc2FibGUgdGhlIEV0aGVybmV0IENvbnRyb2xsZXIKKwkgKi8KKwlmZWMtPmV0aC0+ZWNudHJsICY9IDB4ZmZmZmZmZmQ7CisKKwkvKgorCSAqIElzc3VlIGEgcmVzZXQgY29tbWFuZCB0byB0aGUgRkVDIGNoaXAKKwkgKi8KKwlmZWMtPmV0aC0+ZWNudHJsIHw9IDB4MTsKKworCS8qCisJICogd2FpdCBhdCBsZWFzdCAxNiBjbG9jayBjeWNsZXMKKwkgKi8KKwl1ZGVsYXkgKDEwKTsKKyNpZiAoREVCVUcgJiAweDMpCisJcHJpbnRmICgiRXRoZXJuZXQgdGFzayBzdG9wcGVkXG4iKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgbXBjNTEyeF9mZWNfc2VuZCAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgdm9sYXRpbGUgdm9pZCAqZXRoX2RhdGEsCisJCWludCBkYXRhX2xlbmd0aCkKK3sKKwkvKgorCSAqIFRoaXMgcm91dGluZSB0cmFuc21pdHMgb25lIGZyYW1lLiAgVGhpcyByb3V0aW5lIG9ubHkgYWNjZXB0cworCSAqIDYtYnl0ZSBFdGhlcm5ldCBhZGRyZXNzZXMuCisJICovCisJbXBjNTEyeF9mZWNfcHJpdiAqZmVjID0gKG1wYzUxMnhfZmVjX3ByaXYgKilkZXYtPnByaXY7CisJdm9sYXRpbGUgRkVDX1RCRCAqcFRiZDsKKworI2lmIChERUJVRyAmIDB4MjApCisJcHJpbnRmKCJ0YmQgc3RhdHVzOiAweCUwNHhcbiIsIGZlYy0+dGJkQmFzZVtmZWMtPnRiZEluZGV4XS5zdGF0dXMpOworI2VuZGlmCisKKwkvKgorCSAqIENsZWFyIFR4IEJEIHJpbmcgYXQgZmlyc3QKKwkgKi8KKwltcGM1MTJ4X2ZlY190YmRfc2NydWIgKGZlYyk7CisKKwkvKgorCSAqIENoZWNrIGZvciB2YWxpZCBsZW5ndGggb2YgZGF0YS4KKwkgKi8KKwlpZiAoKGRhdGFfbGVuZ3RoID4gMTUwMCkgfHwgKGRhdGFfbGVuZ3RoIDw9IDApKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoZSBudW1iZXIgb2YgdmFjYW50IFR4QkRzLgorCSAqLworCWlmIChmZWMtPmNsZWFuVGJkTnVtIDwgMSkgeworI2lmIChERUJVRyAmIDB4MjApCisJCXByaW50ZiAoIk5vIGF2YWlsYWJsZSBUeEJEcyAuLi5cbiIpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIEdldCB0aGUgZmlyc3QgVHhCRCB0byBzZW5kIHRoZSBtYWMgaGVhZGVyCisJICovCisJcFRiZCA9ICZmZWMtPmJkQmFzZS0+dGJkW2ZlYy0+dGJkSW5kZXhdOworCXBUYmQtPmRhdGFMZW5ndGggPSBkYXRhX2xlbmd0aDsKKwlwVGJkLT5kYXRhUG9pbnRlciA9ICh1aW50MzIpZXRoX2RhdGE7CisJcFRiZC0+c3RhdHVzIHw9IEZFQ19UQkRfTEFTVCB8IEZFQ19UQkRfVEMgfCBGRUNfVEJEX1JFQURZOworCWZlYy0+dGJkSW5kZXggPSAoZmVjLT50YmRJbmRleCArIDEpICUgRkVDX1RCRF9OVU07CisKKwkvKiBBY3RpdmF0ZSB0cmFuc21pdCBCdWZmZXIgRGVzY3JpcHRvciBwb2xsaW5nICovCisJZmVjLT5ldGgtPnhfZGVzX2FjdGl2ZSA9IDB4MDEwMDAwMDA7CS8qIERlc2NyaXB0b3IgcG9sbGluZyBhY3RpdmUJKi8KKworI2lmIChERUJVRyAmIDB4OCkKKwlwcmludGYgKCAiKyIgKTsKKyNlbmRpZgorCisJZmVjLT5jbGVhblRiZE51bSAtPSAxOworCisJLyoKKwkgKiB3YWl0IHVudGlsIGZyYW1lIGlzIHNlbnQgLgorCSAqLworCXdoaWxlIChwVGJkLT5zdGF0dXMgJiBGRUNfVEJEX1JFQURZKSB7CisJCXVkZWxheSAoMTApOworI2lmIChERUJVRyAmIDB4OCkKKwkJcHJpbnRmICgiVERCIHN0YXR1cyA9ICUwNHhcbiIsIHBUYmQtPnN0YXR1cyk7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG1wYzUxMnhfZmVjX3JlY3YgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBUaGlzIGNvbW1hbmQgcHVsbHMgb25lIGZyYW1lIGZyb20gdGhlIGNhcmQKKwkgKi8KKwltcGM1MTJ4X2ZlY19wcml2ICpmZWMgPSAobXBjNTEyeF9mZWNfcHJpdiAqKWRldi0+cHJpdjsKKwl2b2xhdGlsZSBGRUNfUkJEICpwUmJkID0gJmZlYy0+YmRCYXNlLT5yYmRbZmVjLT5yYmRJbmRleF07CisJdW5zaWduZWQgbG9uZyBpZXZlbnQ7CisJaW50IGZyYW1lX2xlbmd0aCwgbGVuID0gMDsKKwl1Y2hhciBidWZmW0ZFQ19NQVhfUEtUX1NJWkVdOworCisjaWYgKERFQlVHICYgMHgxKQorCXByaW50ZiAoIm1wYzUxMnhfZmVjX3JlY3YgJWQgU3RhcnQuLi5cbiIsIGZlYy0+cmJkSW5kZXgpOworI2VuZGlmCisjaWYgKERFQlVHICYgMHg4KQorCXByaW50ZiggIi0iICk7CisjZW5kaWYKKworCS8qCisJICogQ2hlY2sgaWYgYW55IGNyaXRpY2FsIGV2ZW50cyBoYXZlIGhhcHBlbmVkCisJICovCisJaWV2ZW50ID0gZmVjLT5ldGgtPmlldmVudDsKKwlmZWMtPmV0aC0+aWV2ZW50ID0gaWV2ZW50OworCWlmIChpZXZlbnQgJiAweDIwMDYwMDAwKSB7CisJCS8qIEJBQlQsIFJ4L1R4IEZJRk8gZXJyb3JzICovCisJCW1wYzUxMnhfZmVjX2hhbHQgKGRldik7CisJCW1wYzUxMnhfZmVjX2luaXQgKGRldiwgTlVMTCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoaWV2ZW50ICYgMHg4MDAwMDAwMCkgeworCQkvKiBIZWFydGJlYXQgZXJyb3IgKi8KKwkJZmVjLT5ldGgtPnhfY250cmwgfD0gMHgwMDAwMDAwMTsKKwl9CisJaWYgKGlldmVudCAmIDB4MTAwMDAwMDApIHsKKwkJLyogR3JhY2VmdWwgc3RvcCBjb21wbGV0ZSAqLworCQlpZiAoZmVjLT5ldGgtPnhfY250cmwgJiAweDAwMDAwMDAxKSB7CisJCQltcGM1MTJ4X2ZlY19oYWx0IChkZXYpOworCQkJZmVjLT5ldGgtPnhfY250cmwgJj0gfjB4MDAwMDAwMDE7CisJCQltcGM1MTJ4X2ZlY19pbml0IChkZXYsIE5VTEwpOworCQl9CisJfQorCisJaWYgKCEocFJiZC0+c3RhdHVzICYgRkVDX1JCRF9FTVBUWSkpIHsKKwkJaWYgKChwUmJkLT5zdGF0dXMgJiBGRUNfUkJEX0xBU1QpICYmCisJCQkhKHBSYmQtPnN0YXR1cyAmIEZFQ19SQkRfRVJSKSAmJgorCQkJKChwUmJkLT5kYXRhTGVuZ3RoIC0gNCkgPiAxNCkpIHsKKworCQkJLyoKKwkJCSAqIEdldCBidWZmZXIgc2l6ZQorCQkJICovCisJCQlmcmFtZV9sZW5ndGggPSBwUmJkLT5kYXRhTGVuZ3RoIC0gNDsKKworI2lmIChERUJVRyAmIDB4MjApCisJCQl7CisJCQkJaW50IGk7CisJCQkJcHJpbnRmICgicmVjdiBkYXRhIGhkcjoiKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykKKwkJCQkJcHJpbnRmICgiJXggIiwgKigodWludDgqKXBSYmQtPmRhdGFQb2ludGVyICsgaSkpOworCQkJCXByaW50ZigiXG4iKTsKKwkJCX0KKyNlbmRpZgorCisJCQkvKgorCQkJICogIEZpbGwgdGhlIGJ1ZmZlciBhbmQgcGFzcyBpdCB0byB1cHBlciBsYXllcnMKKwkJCSAqLworCQkJbWVtY3B5IChidWZmLCAodm9pZCopcFJiZC0+ZGF0YVBvaW50ZXIsIGZyYW1lX2xlbmd0aCk7CisJCQlOZXRSZWNlaXZlICgodWNoYXIqKWJ1ZmYsIGZyYW1lX2xlbmd0aCk7CisJCQlsZW4gPSBmcmFtZV9sZW5ndGg7CisJCX0KKworCQkvKgorCQkgKiBSZXNldCBidWZmZXIgZGVzY3JpcHRvciBhcyBlbXB0eQorCQkgKi8KKwkJbXBjNTEyeF9mZWNfcmJkX2NsZWFuIChmZWMsIHBSYmQpOworCX0KKworCS8qIFRyeSB0byBmaWxsIEJ1ZmZlciBEZXNjcmlwdG9ycyAqLworCWZlYy0+ZXRoLT5yX2Rlc19hY3RpdmUgPSAweDAxMDAwMDAwOwkvKiBEZXNjcmlwdG9yIHBvbGxpbmcgYWN0aXZlICovCisJcmV0dXJuIGxlbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG1wYzUxMnhfZmVjX2luaXRpYWxpemUgKGJkX3QgKiBiaXMpCit7CisKKwlpbW1hcF90ICppbSA9IChpbW1hcF90KikgQ0ZHX0lNTVI7CisJbXBjNTEyeF9mZWNfcHJpdiAqZmVjOworCXN0cnVjdCBldGhfZGV2aWNlICpkZXY7CisJaW50IGk7CisJY2hhciAqdG1wLCAqZW5kLCBlbnZfZW5ldGFkZHJbNl07CisJdWludDMyICpyZWc7CisJdm9pZCAqIGJkOworCisJZmVjID0gKG1wYzUxMnhfZmVjX3ByaXYgKikgbWFsbG9jIChzaXplb2YoKmZlYykpOworCWRldiA9IChzdHJ1Y3QgZXRoX2RldmljZSAqKSBtYWxsb2MgKHNpemVvZigqZGV2KSk7CisJbWVtc2V0IChkZXYsIDAsIHNpemVvZiAqZGV2KTsKKworCWZlYy0+ZXRoID0gKGV0aGVybmV0X3JlZ3MgKikgTVBDNTEyWF9GRUM7CisKKyMgaWZuZGVmIENPTkZJR19GRUNfMTBNQklUCisJZmVjLT54Y3ZfdHlwZSA9IE1JSTEwMDsKKyMgZWxzZQorCWZlYy0+eGN2X3R5cGUgPSBNSUkxMDsKKyMgZW5kaWYKKwlkZXYtPnByaXYgPSAodm9pZCAqKWZlYzsKKwlkZXYtPmlvYmFzZSA9IE1QQzUxMlhfRkVDOworCWRldi0+aW5pdCA9IG1wYzUxMnhfZmVjX2luaXQ7CisJZGV2LT5oYWx0ID0gbXBjNTEyeF9mZWNfaGFsdDsKKwlkZXYtPnNlbmQgPSBtcGM1MTJ4X2ZlY19zZW5kOworCWRldi0+cmVjdiA9IG1wYzUxMnhfZmVjX3JlY3Y7CisKKwlzcHJpbnRmIChkZXYtPm5hbWUsICJGRUMgRVRIRVJORVQiKTsKKwlldGhfcmVnaXN0ZXIgKGRldik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCisJbWlpcGh5X3JlZ2lzdGVyIChkZXYtPm5hbWUsCisJCQlmZWM1MTJ4X21paXBoeV9yZWFkLCBmZWM1MTJ4X21paXBoeV93cml0ZSk7CisjZW5kaWYKKworCS8qCisJICogSW5pdGlhbGl6ZSBJXE8gcGlucworCSAqLworCXJlZyA9ICh1aW50MzIgKikgJihpbS0+aW9fY3RybC5yZWdzW1BTQzBfMF9JRFhdKTsKKworCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQorCQlyZWdbaV0gPSBJT0NUUkxfTVVYX0ZFQyB8IDB4MDAwMDAwMDE7CisKKwlpbS0+aW9fY3RybC5yZWdzW1NQRElGX1RYQ0xPQ0tfSURYXSA9IElPQ1RSTF9NVVhfRkVDIHwgMHgwMDAwMDAwMTsKKwlpbS0+aW9fY3RybC5yZWdzW1NQRElGX1RYX0lEWF0gPSBJT0NUUkxfTVVYX0ZFQyB8IDB4MDAwMDAwMDE7CisJaW0tPmlvX2N0cmwucmVnc1tTUERJRl9SWF9JRFhdID0gSU9DVFJMX01VWF9GRUMgfCAweDAwMDAwMDAxOworCisJLyogQ2xlYW4gdXAgc3BhY2UgRkVDJ3MgTUlCIGFuZCBGSUZPIFJBTSAuLi4qLworCW1lbXNldCAoKHZvaWQgKikgTVBDNTEyWF9GRUMgKyAweDIwMCwgMHgwMCwgMHg0MDApOworCisJLyoKKwkgKiBNYWxsb2Mgc3BhY2UgZm9yIEJEcyAgKG11c3QgYmUgcXVhZCB3b3JkLWFsaWduZWQpCisJICogdGhpcyBwb2ludGVyIGlzIGxvc3QsIHNvIGNhbm5vdCBiZSBmcmVlZAorCSAqLworCWJkID0gbWFsbG9jIChzaXplb2YobXBjNTEyeF9idWZmX2Rlc2NzKSArIDB4MWYpOworCWZlYy0+YmRCYXNlID0gKG1wYzUxMnhfYnVmZl9kZXNjcyopKCh1aW50MzIpYmQgJiAweGZmZmZmZmYwKTsKKwltZW1zZXQgKCh2b2lkICopIGJkLCAweDAwLCBzaXplb2YobXBjNTEyeF9idWZmX2Rlc2NzKSArIDB4MWYpOworCisJLyoKKwkgKiBTZXQgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKKwkgKi8KKwlmZWMtPmV0aC0+aW1hc2sgPSAweDAwMDAwMDAwOworCisJLyoKKwkgKiBDbGVhciBGRUMtTGl0ZSBpbnRlcnJ1cHQgZXZlbnQgcmVnaXN0ZXIoSUVWRU5UKQorCSAqLworCWZlYy0+ZXRoLT5pZXZlbnQgPSAweGZmZmZmZmZmOworCisJLyoKKwkgKiBUcnkgdG8gc2V0IHRoZSBtYWMgYWRkcmVzcyBub3cuIFRoZSBmZWMgbWFjIGFkZHJlc3MgaXMKKwkgKiBhIGdhcmJhZ2UgYWZ0ZXIgcmVzZXQuIFdoZW4gbm90IHVzaW5nIGZlYyBmb3IgYm9vdGluZworCSAqIHRoZSBMaW51eCBmZWMgZHJpdmVyIHdpbGwgdHJ5IHRvIHdvcmsgd2l0aCB0aGlzIGdhcmJhZ2UuCisJICovCisJdG1wID0gZ2V0ZW52ICgiZXRoYWRkciIpOworCWlmICh0bXApIHsKKwkJZm9yIChpPTA7IGk8NjsgaSsrKSB7CisJCQllbnZfZW5ldGFkZHJbaV0gPSB0bXAgPyBzaW1wbGVfc3RydG91bCAodG1wLCAmZW5kLCAxNikgOiAwOworCQkJaWYgKHRtcCkKKwkJCQl0bXAgPSAoKmVuZCkgPyBlbmQrMSA6IGVuZDsKKwkJfQorCQltcGM1MTJ4X2ZlY19zZXRfaHdhZGRyIChmZWMsIGVudl9lbmV0YWRkcik7CisJCWZlYy0+ZXRoLT5nYWRkcjEgPSAweDAwMDAwMDAwOworCQlmZWMtPmV0aC0+Z2FkZHIyID0gMHgwMDAwMDAwMDsKKwl9CisKKwltcGM1MTJ4X2ZlY19pbml0X3BoeSAoZGV2LCBiaXMpOworCisJcmV0dXJuIDE7Cit9CisKKy8qIE1JSS1pbnRlcmZhY2UgcmVsYXRlZCBmdW5jdGlvbnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBmZWM1MTJ4X21paXBoeV9yZWFkIChjaGFyICpkZXZuYW1lLCB1aW50OCBwaHlBZGRyLCB1aW50OCByZWdBZGRyLCB1aW50MTYgKiByZXRWYWwpCit7CisJZXRoZXJuZXRfcmVncyAqZXRoID0gKGV0aGVybmV0X3JlZ3MgKikgTVBDNTEyWF9GRUM7CisJdWludDMyIHJlZzsJCS8qIGNvbnZlbmllbnQgaG9sZGVyIGZvciB0aGUgUEhZIHJlZ2lzdGVyICovCisJdWludDMyIHBoeTsJCS8qIGNvbnZlbmllbnQgaG9sZGVyIGZvciB0aGUgUEhZICovCisJaW50IHRpbWVvdXQgPSAweGZmZmY7CisKKwkvKgorCSAqIHJlYWRpbmcgZnJvbSBhbnkgUEhZJ3MgcmVnaXN0ZXIgaXMgZG9uZSBieSBwcm9wZXJseQorCSAqIHByb2dyYW1taW5nIHRoZSBGRUMncyBNSUkgZGF0YSByZWdpc3Rlci4KKwkgKi8KKwlyZWcgPSByZWdBZGRyIDw8IEZFQ19NSUlfREFUQV9SQV9TSElGVDsKKwlwaHkgPSBwaHlBZGRyIDw8IEZFQ19NSUlfREFUQV9QQV9TSElGVDsKKworCWV0aC0+bWlpX2RhdGEgPSAoRkVDX01JSV9EQVRBX1NUIHwgRkVDX01JSV9EQVRBX09QX1JEIHwgRkVDX01JSV9EQVRBX1RBIHwgcGh5IHwgcmVnKTsKKworCS8qCisJICogd2FpdCBmb3IgdGhlIHJlbGF0ZWQgaW50ZXJydXB0CisJICovCisJd2hpbGUgKCh0aW1lb3V0LS0pICYmICghKGV0aC0+aWV2ZW50ICYgMHgwMDgwMDAwMCkpKSA7CisKKwlpZiAodGltZW91dCA9PSAwKSB7CisjaWYgKERFQlVHICYgMHgyKQorCQlwcmludGYgKCJSZWFkIE1ESU8gZmFpbGVkLi4uXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBjbGVhciBtaWkgaW50ZXJydXB0IGJpdAorCSAqLworCWV0aC0+aWV2ZW50ID0gMHgwMDgwMDAwMDsKKworCS8qCisJICogaXQncyBub3cgc2FmZSB0byByZWFkIHRoZSBQSFkncyByZWdpc3RlcgorCSAqLworCSpyZXRWYWwgPSAodWludDE2KSBldGgtPm1paV9kYXRhOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBmZWM1MTJ4X21paXBoeV93cml0ZSAoY2hhciAqZGV2bmFtZSwgdWludDggcGh5QWRkciwgdWludDggcmVnQWRkciwgdWludDE2IGRhdGEpCit7CisJZXRoZXJuZXRfcmVncyAqZXRoID0gKGV0aGVybmV0X3JlZ3MgKikgTVBDNTEyWF9GRUM7CisJdWludDMyIHJlZzsJCS8qIGNvbnZlbmllbnQgaG9sZGVyIGZvciB0aGUgUEhZIHJlZ2lzdGVyICovCisJdWludDMyIHBoeTsJCS8qIGNvbnZlbmllbnQgaG9sZGVyIGZvciB0aGUgUEhZICovCisJaW50IHRpbWVvdXQgPSAweGZmZmY7CisKKwlyZWcgPSByZWdBZGRyIDw8IEZFQ19NSUlfREFUQV9SQV9TSElGVDsKKwlwaHkgPSBwaHlBZGRyIDw8IEZFQ19NSUlfREFUQV9QQV9TSElGVDsKKworCWV0aC0+bWlpX2RhdGEgPSAoRkVDX01JSV9EQVRBX1NUIHwgRkVDX01JSV9EQVRBX09QX1dSIHwKKwkJCUZFQ19NSUlfREFUQV9UQSB8IHBoeSB8IHJlZyB8IGRhdGEpOworCisJLyoKKwkgKiB3YWl0IGZvciB0aGUgTUlJIGludGVycnVwdAorCSAqLworCXdoaWxlICgodGltZW91dC0tKSAmJiAoIShldGgtPmlldmVudCAmIDB4MDA4MDAwMDApKSkgOworCisJaWYgKHRpbWVvdXQgPT0gMCkgeworI2lmIChERUJVRyAmIDB4MikKKwkJcHJpbnRmICgiV3JpdGUgTURJTyBmYWlsZWQuLi5cbiIpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIGNsZWFyIE1JSSBpbnRlcnJ1cHQgYml0CisJICovCisJZXRoLT5pZXZlbnQgPSAweDAwODAwMDAwOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiAoREVCVUcgJiAweDQwKQorc3RhdGljIHVpbnQzMiBsb2NhbF9jcmMzMiAoY2hhciAqc3RyaW5nLCB1bnNpZ25lZCBpbnQgY3JjX3ZhbHVlLCBpbnQgbGVuKQoreworCWludCBpOworCWNoYXIgYzsKKwl1bnNpZ25lZCBpbnQgY3JjLCBjb3VudDsKKworCS8qCisJICogY3JjMzIgYWxnb3JpdGhtCisJICovCisJLyoKKwkgKiBjcmMgPSAweGZmZmZmZmZmOyAqIFRoZSBpbml0aWFsaXplZCB2YWx1ZSBzaG91bGQgYmUgMHhmZmZmZmZmZgorCSAqLworCWNyYyA9IGNyY192YWx1ZTsKKworCWZvciAoaSA9IGxlbjsgLS1pID49IDA7KSB7CisJCWMgPSAqc3RyaW5nKys7CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDg7IGNvdW50KyspIHsKKwkJCWlmICgoYyAmIDB4MDEpIF4gKGNyYyAmIDB4MDEpKSB7CisJCQkJY3JjID4+PSAxOworCQkJCWNyYyA9IGNyYyBeIDB4ZWRiODgzMjA7CisJCQl9IGVsc2UgeworCQkJCWNyYyA+Pj0gMTsKKwkJCX0KKwkJCWMgPj49IDE7CisJCX0KKwl9CisKKwkvKgorCSAqIEluIGJpZyBlbmRpYW4gc3lzdGVtLCBkbyBieXRlIHN3YXBpbmcgZm9yIGNyYyB2YWx1ZQorCSAqLworCSAvKiovIHJldHVybiBjcmM7Cit9CisjZW5kaWYJLyogREVCVUcgKi8KKworI2VuZGlmIC8qIENPTkZJR19NUEM1MTJ4X0ZFQyAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzUxMngvZmVjLmggYi9jcHUvbXBjNTEyeC9mZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmQ4NzdhCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzUxMngvZmVjLmgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMgLSAyMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIERlcml2ZWQgZnJvbSB0aGUgTVBDOHh4IGRyaXZlcidzIGhlYWRlciBmaWxlLgorICovCisKKyNpZm5kZWYgX19NUEM1MTJYX0ZFQ19ICisjZGVmaW5lIF9fTVBDNTEyWF9GRUNfSAorCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjNTEyeC5oPgorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludDMyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTY7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDg7CisKK3R5cGVkZWYgc3RydWN0IGV0aGVybmV0X3JlZ2lzdGVyX3NldCB7CisKKy8qIFsxMDoyXWFkZHIgPSAwMCAqLworCisvKiAgQ29udHJvbCBhbmQgc3RhdHVzIFJlZ2lzdGVycyAob2Zmc2V0IDAwMC0xRkYpICovCisKKwl2b2xhdGlsZSB1aW50MzIgZmVjX2lkOwkJCS8qIE1CQVJfRVRIICsgMHgwMDAgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWV2ZW50OwkJCS8qIE1CQVJfRVRIICsgMHgwMDQgKi8KKwl2b2xhdGlsZSB1aW50MzIgaW1hc2s7CQkJLyogTUJBUl9FVEggKyAweDAwOCAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzBbMV07CQkvKiBNQkFSX0VUSCArIDB4MDBDICovCisJdm9sYXRpbGUgdWludDMyIHJfZGVzX2FjdGl2ZTsJCS8qIE1CQVJfRVRIICsgMHgwMTAgKi8KKwl2b2xhdGlsZSB1aW50MzIgeF9kZXNfYWN0aXZlOwkJLyogTUJBUl9FVEggKyAweDAxNCAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzFbM107CQkvKiBNQkFSX0VUSCArIDB4MDE4LTAyMCAqLworCXZvbGF0aWxlIHVpbnQzMiBlY250cmw7CQkJLyogTUJBUl9FVEggKyAweDAyNCAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzJbNl07CQkvKiBNQkFSX0VUSCArIDB4MDI4LTAzQyAqLworCXZvbGF0aWxlIHVpbnQzMiBtaWlfZGF0YTsJCS8qIE1CQVJfRVRIICsgMHgwNDAgKi8KKwl2b2xhdGlsZSB1aW50MzIgbWlpX3NwZWVkOwkJLyogTUJBUl9FVEggKyAweDA0NCAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzNbN107CQkvKiBNQkFSX0VUSCArIDB4MDQ4LTA2MCAqLworCXZvbGF0aWxlIHVpbnQzMiBtaWJfY29udHJvbDsJCS8qIE1CQVJfRVRIICsgMHgwNjQgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBSRVM0WzddOwkJLyogTUJBUl9FVEggKyAweDA2OC04MCAqLworCXZvbGF0aWxlIHVpbnQzMiByX2NudHJsOwkJLyogTUJBUl9FVEggKyAweDA4NCAqLworCXZvbGF0aWxlIHVpbnQzMiByX2hhc2g7CQkJLyogTUJBUl9FVEggKyAweDA4OCAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzVbMTRdOwkJLyogTUJBUl9FVEggKyAweDA4Yy0wQzAgKi8KKwl2b2xhdGlsZSB1aW50MzIgeF9jbnRybDsJCS8qIE1CQVJfRVRIICsgMHgwQzQgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBSRVM2WzddOwkJLyogTUJBUl9FVEggKyAweDBDOC0wRTAgKi8KKwl2b2xhdGlsZSB1aW50MzIgcGFkZHIxOwkJCS8qIE1CQVJfRVRIICsgMHgwRTQgKi8KKwl2b2xhdGlsZSB1aW50MzIgcGFkZHIyOwkJCS8qIE1CQVJfRVRIICsgMHgwRTggKi8KKwl2b2xhdGlsZSB1aW50MzIgb3BfcGF1c2U7CQkvKiBNQkFSX0VUSCArIDB4MEVDICovCisKKwl2b2xhdGlsZSB1aW50MzIgUkVTN1sxMF07CQkvKiBNQkFSX0VUSCArIDB4MEYwLTExNCAqLworCXZvbGF0aWxlIHVpbnQzMiBpYWRkcjE7CQkJLyogTUJBUl9FVEggKyAweDExOCAqLworCXZvbGF0aWxlIHVpbnQzMiBpYWRkcjI7CQkJLyogTUJBUl9FVEggKyAweDExQyAqLworCXZvbGF0aWxlIHVpbnQzMiBnYWRkcjE7CQkJLyogTUJBUl9FVEggKyAweDEyMCAqLworCXZvbGF0aWxlIHVpbnQzMiBnYWRkcjI7CQkJLyogTUJBUl9FVEggKyAweDEyNCAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzhbNl07CQkvKiBNQkFSX0VUSCArIDB4MTI4LTEzQyAqLworCXZvbGF0aWxlIHVpbnQzMiBmaWZvX2lkOwkJLyogTUJBUl9FVEggKyAweDE0MCAqLworCXZvbGF0aWxlIHVpbnQzMiB4X3dtcms7CQkJLyogTUJBUl9FVEggKyAweDE0NCAqLworCXZvbGF0aWxlIHVpbnQzMiBSRVM5WzFdOwkJLyogTUJBUl9FVEggKyAweDE0OCAqLworCXZvbGF0aWxlIHVpbnQzMiByX2JvdW5kOwkJLyogTUJBUl9FVEggKyAweDE0QyAqLworCXZvbGF0aWxlIHVpbnQzMiByX2ZzdGFydDsJCS8qIE1CQVJfRVRIICsgMHgxNTAgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBSRVMxMFsxMV07CQkvKiBNQkFSX0VUSCArIDB4MTU0LTE3QyAqLworCXZvbGF0aWxlIHVpbnQzMiByX2Rlc19zdGFydDsJCS8qIE1CQVJfRVRIICsgMHgxODAgKi8KKwl2b2xhdGlsZSB1aW50MzIgeF9kZXNfc3RhcnQ7CQkvKiBNQkFSX0VUSCArIDB4MTg0ICovCisJdm9sYXRpbGUgdWludDMyIHJfYnVmZl9zaXplOwkJLyogTUJBUl9FVEggKyAweDE4OCAqLworCXZvbGF0aWxlIHVpbnQzMiBSRVMxMVsyNl07CQkvKiBNQkFSX0VUSCArIDB4MThDLTFGMCAqLworCXZvbGF0aWxlIHVpbnQzMiBkbWFfY29udHJvbDsJCS8qIE1CQVJfRVRIICsgMHgxRjQgKi8KKwl2b2xhdGlsZSB1aW50MzIgUkVTMTJbMl07CQkvKiBNQkFSX0VUSCArIDB4MUY4LTFGQyAqLworCisvKiAgTUlCIENPVU5URVJTIChPZmZzZXQgMjAwLTJGRikgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3RfZHJvcDsJCS8qIE1CQVJfRVRIICsgMHgyMDAgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl90X3BhY2tldHM7CQkvKiBNQkFSX0VUSCArIDB4MjA0ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9iY19wa3Q7CQkvKiBNQkFSX0VUSCArIDB4MjA4ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9tY19wa3Q7CQkvKiBNQkFSX0VUSCArIDB4MjBDICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9jcmNfYWxpZ247CS8qIE1CQVJfRVRIICsgMHgyMTAgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl90X3VuZGVyc2l6ZTsJLyogTUJBUl9FVEggKyAweDIxNCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3Rfb3ZlcnNpemU7CS8qIE1CQVJfRVRIICsgMHgyMTggKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl90X2ZyYWc7CQkvKiBNQkFSX0VUSCArIDB4MjFDICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9qYWI7CQkvKiBNQkFSX0VUSCArIDB4MjIwICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9jb2w7CQkvKiBNQkFSX0VUSCArIDB4MjI0ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9wNjQ7CQkvKiBNQkFSX0VUSCArIDB4MjI4ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9wNjV0bzEyNzsJLyogTUJBUl9FVEggKyAweDIyQyAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3RfcDEyOHRvMjU1OwkvKiBNQkFSX0VUSCArIDB4MjMwICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9wMjU2dG81MTE7CS8qIE1CQVJfRVRIICsgMHgyMzQgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl90X3A1MTJ0bzEwMjM7CS8qIE1CQVJfRVRIICsgMHgyMzggKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl90X3AxMDI0dG8yMDQ3OwkvKiBNQkFSX0VUSCArIDB4MjNDICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9wX2d0ZTIwNDg7CS8qIE1CQVJfRVRIICsgMHgyNDAgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl90X29jdGV0czsJCS8qIE1CQVJfRVRIICsgMHgyNDQgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWVlZV90X2Ryb3A7CQkvKiBNQkFSX0VUSCArIDB4MjQ4ICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfdF9mcmFtZV9vazsJLyogTUJBUl9FVEggKyAweDI0QyAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3RfMWNvbDsJCS8qIE1CQVJfRVRIICsgMHgyNTAgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWVlZV90X21jb2w7CQkvKiBNQkFSX0VUSCArIDB4MjU0ICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfdF9kZWY7CQkvKiBNQkFSX0VUSCArIDB4MjU4ICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfdF9sY29sOwkJLyogTUJBUl9FVEggKyAweDI1QyAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3RfZXhjb2w7CQkvKiBNQkFSX0VUSCArIDB4MjYwICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfdF9tYWNlcnI7CQkvKiBNQkFSX0VUSCArIDB4MjY0ICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfdF9jc2VycjsJCS8qIE1CQVJfRVRIICsgMHgyNjggKi8KKwl2b2xhdGlsZSB1aW50MzIgaWVlZV90X3NxZTsJCS8qIE1CQVJfRVRIICsgMHgyNkMgKi8KKwl2b2xhdGlsZSB1aW50MzIgdF9mZHhmYzsJCS8qIE1CQVJfRVRIICsgMHgyNzAgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWVlZV90X29jdGV0c19vazsJLyogTUJBUl9FVEggKyAweDI3NCAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzEzWzJdOwkJLyogTUJBUl9FVEggKyAweDI3OC0yN0MgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl9yX2Ryb3A7CQkvKiBNQkFSX0VUSCArIDB4MjgwICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9wYWNrZXRzOwkJLyogTUJBUl9FVEggKyAweDI4NCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfYmNfcGt0OwkJLyogTUJBUl9FVEggKyAweDI4OCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfbWNfcGt0OwkJLyogTUJBUl9FVEggKyAweDI4QyAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfY3JjX2FsaWduOwkvKiBNQkFSX0VUSCArIDB4MjkwICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl91bmRlcnNpemU7CS8qIE1CQVJfRVRIICsgMHgyOTQgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl9yX292ZXJzaXplOwkvKiBNQkFSX0VUSCArIDB4Mjk4ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9mcmFnOwkJLyogTUJBUl9FVEggKyAweDI5QyAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfamFiOwkJLyogTUJBUl9FVEggKyAweDJBMCAqLworCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9yZXN2ZF8wOwkJLyogTUJBUl9FVEggKyAweDJBNCAqLworCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9wNjQ7CQkvKiBNQkFSX0VUSCArIDB4MkE4ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9wNjV0bzEyNzsJLyogTUJBUl9FVEggKyAweDJBQyAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfcDEyOHRvMjU1OwkvKiBNQkFSX0VUSCArIDB4MkIwICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9wMjU2dG81MTE7CS8qIE1CQVJfRVRIICsgMHgyQjQgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl9yX3A1MTJ0bzEwMjM7CS8qIE1CQVJfRVRIICsgMHgyQjggKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl9yX3AxMDI0dG8yMDQ3OwkvKiBNQkFSX0VUSCArIDB4MkJDICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9wX2d0ZTIwNDg7CS8qIE1CQVJfRVRIICsgMHgyQzAgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl9yX29jdGV0czsJCS8qIE1CQVJfRVRIICsgMHgyQzQgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWVlZV9yX2Ryb3A7CQkvKiBNQkFSX0VUSCArIDB4MkM4ICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfcl9mcmFtZV9vazsJLyogTUJBUl9FVEggKyAweDJDQyAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3JfY3JjOwkJLyogTUJBUl9FVEggKyAweDJEMCAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3JfYWxpZ247CQkvKiBNQkFSX0VUSCArIDB4MkQ0ICovCisJdm9sYXRpbGUgdWludDMyIHJfbWFjZXJyOwkJLyogTUJBUl9FVEggKyAweDJEOCAqLworCXZvbGF0aWxlIHVpbnQzMiByX2ZkeGZjOwkJLyogTUJBUl9FVEggKyAweDJEQyAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3Jfb2N0ZXRzX29rOwkvKiBNQkFSX0VUSCArIDB4MkUwICovCisKKwl2b2xhdGlsZSB1aW50MzIgUkVTMTRbNl07CQkvKiBNQkFSX0VUSCArIDB4MkU0LTJGQyAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzE1WzY0XTsJCS8qIE1CQVJfRVRIICsgMHgzMDAtM0ZGICovCit9IGV0aGVybmV0X3JlZ3M7CisKKy8qIFJlY2VpdmUgJiBUcmFuc21pdCBCdWZmZXIgRGVzY3JpcHRvciBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QgQnVmZmVyRGVzY3JpcHRvciB7CisJdWludDE2IHN0YXR1czsKKwl1aW50MTYgZGF0YUxlbmd0aDsKKwl1aW50MzIgZGF0YVBvaW50ZXI7Cit9IEZFQ19SQkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTYgc3RhdHVzOworCXVpbnQxNiBkYXRhTGVuZ3RoOworCXVpbnQzMiBkYXRhUG9pbnRlcjsKK30gRkVDX1RCRDsKKworLyogcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgZW51bSB7CisJU0VWRU5XSVJFLAkJCS8qIDctd2lyZSAgICAgICAqLworCU1JSTEwLAkJCQkvKiBNSUkgMTBNYnBzICAgKi8KKwlNSUkxMDAJCQkJLyogTUlJIDEwME1icHMgICovCit9IHhjZWl2ZXJfdHlwZTsKKworLyogQkQgTnVtZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRkVDX1RCRF9OVU0JCTQ4CS8qIFRoZSB1c2VyIGNhbiBhZGp1c3QgdGhpcyB2YWx1ZSAqLworI2RlZmluZSBGRUNfUkJEX05VTQkJMzIJLyogVGhlIHVzZXIgY2FuIGFkanVzdCB0aGlzIHZhbHVlICovCisKKy8qIHBhY2tldCBzaXplIGxpbWl0ICovCisjZGVmaW5lIEZFQ19NQVhfUEtUX1NJWkUJMTUzNgorCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDggZnJhbWVbRkVDX01BWF9QS1RfU0laRV07Cit9IG1wYzUxMnhfZnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlGRUNfUkJEIHJiZFtGRUNfUkJEX05VTV07CQkJLyogUkJEIHJpbmcgKi8KKwlGRUNfVEJEIHRiZFtGRUNfVEJEX05VTV07CQkJLyogVEJEIHJpbmcgKi8KKwltcGM1MTJ4X2ZyYW1lIHJlY3ZfZnJhbWVzW0ZFQ19SQkRfTlVNXTsJCS8qIHJlY2VpdmUgYnVmZiAqLworfSBtcGM1MTJ4X2J1ZmZfZGVzY3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlldGhlcm5ldF9yZWdzICpldGg7CisJeGNlaXZlcl90eXBlIHhjdl90eXBlOwkJLyogdHJhbnNjZWl2ZXIgdHlwZSAqLworCW1wYzUxMnhfYnVmZl9kZXNjcyAqYmRCYXNlOwkvKiBCRCByaW5ncyBhbmQgcmVjdiBidWZmZXIgKi8KKwl1aW50MTYgcmJkSW5kZXg7CQkvKiBuZXh0IHJlY2VpdmUgQkQgdG8gcmVhZCAqLworCXVpbnQxNiB0YmRJbmRleDsJCS8qIG5leHQgdHJhbnNtaXQgQkQgdG8gc2VuZCAqLworCXVpbnQxNiB1c2VkVGJkSW5kZXg7CQkvKiBuZXh0IHRyYW5zbWl0IEJEIHRvIGNsZWFuICovCisJdWludDE2IGNsZWFuVGJkTnVtOwkJLyogdGhlIG51bWJlciBvZiBhdmFpbGFibGUgdHJhbnNtaXQgQkRzICovCit9IG1wYzUxMnhfZmVjX3ByaXY7CisKKy8qIFJCRCBiaXRzIGRlZmluaXRpb25zICovCisjZGVmaW5lIEZFQ19SQkRfRU1QVFkJCTB4ODAwMAkvKiBCdWZmZXIgaXMgZW1wdHkgKi8KKyNkZWZpbmUgRkVDX1JCRF9XUkFQCQkweDIwMDAJLyogTGFzdCBCRCBpbiByaW5nICovCisjZGVmaW5lIEZFQ19SQkRfTEFTVAkJMHgwODAwCS8qIEJ1ZmZlciBpcyBsYXN0IGluIGZyYW1lKHVzZWxlc3MpICovCisjZGVmaW5lIEZFQ19SQkRfTUlTUwkJMHgwMTAwCS8qIE1pc3MgYml0IGZvciBwcm9tIG1vZGUgKi8KKyNkZWZpbmUgRkVDX1JCRF9CQwkJMHgwMDgwCS8qIFRoZSByZWNlaXZlZCBmcmFtZSBpcyBicm9hZGNhc3QgZnJhbWUgKi8KKyNkZWZpbmUgRkVDX1JCRF9NQwkJMHgwMDQwCS8qIFRoZSByZWNlaXZlZCBmcmFtZSBpcyBtdWx0aWNhc3QgZnJhbWUgKi8KKyNkZWZpbmUgRkVDX1JCRF9MRwkJMHgwMDIwCS8qIEZyYW1lIGxlbmd0aCB2aW9sYXRpb24gKi8KKyNkZWZpbmUgRkVDX1JCRF9OTwkJMHgwMDEwCS8qIE5vbm9jdGV0IGFsaWduIGZyYW1lICovCisjZGVmaW5lIEZFQ19SQkRfU0gJCTB4MDAwOAkvKiBTaG9ydCBmcmFtZSAqLworI2RlZmluZSBGRUNfUkJEX0NSCQkweDAwMDQJLyogQ1JDIGVycm9yICovCisjZGVmaW5lIEZFQ19SQkRfT1YJCTB4MDAwMgkvKiBSZWNlaXZlIEZJRk8gb3ZlcnJ1biAqLworI2RlZmluZSBGRUNfUkJEX1RSCQkweDAwMDEJLyogRnJhbWUgaXMgdHJ1bmNhdGVkICovCisjZGVmaW5lIEZFQ19SQkRfRVJSCQkoRkVDX1JCRF9MRyB8IEZFQ19SQkRfTk8gfCBGRUNfUkJEX0NSIHwgXAorCQkJCUZFQ19SQkRfT1YgfCBGRUNfUkJEX1RSKQorCisvKiBUQkQgYml0cyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBGRUNfVEJEX1JFQURZCQkweDgwMDAJLyogQnVmZmVyIGlzIHJlYWR5ICovCisjZGVmaW5lIEZFQ19UQkRfV1JBUAkJMHgyMDAwCS8qIExhc3QgQkQgaW4gcmluZyAqLworI2RlZmluZSBGRUNfVEJEX0xBU1QJCTB4MDgwMAkvKiBCdWZmZXIgaXMgbGFzdCBpbiBmcmFtZSAqLworI2RlZmluZSBGRUNfVEJEX1RDCQkweDA0MDAJLyogVHJhbnNtaXQgdGhlIENSQyAqLworI2RlZmluZSBGRUNfVEJEX0FCQwkJMHgwMjAwCS8qIEFwcGVuZCBiYWQgQ1JDICovCisKKy8qIE1JSS1yZWxhdGVkIGRlZmluaXRpb3MgKi8KKyNkZWZpbmUgRkVDX01JSV9EQVRBX1NUCQkweDQwMDAwMDAwCS8qIFN0YXJ0IG9mIGZyYW1lIGRlbGltaXRlciAqLworI2RlZmluZSBGRUNfTUlJX0RBVEFfT1BfUkQJMHgyMDAwMDAwMAkvKiBQZXJmb3JtIGEgcmVhZCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgRkVDX01JSV9EQVRBX09QX1dSCTB4MTAwMDAwMDAJLyogUGVyZm9ybSBhIHdyaXRlIG9wZXJhdGlvbiAqLworI2RlZmluZSBGRUNfTUlJX0RBVEFfUEFfTVNLCTB4MGY4MDAwMDAJLyogUEhZIEFkZHJlc3MgZmllbGQgbWFzayAqLworI2RlZmluZSBGRUNfTUlJX0RBVEFfUkFfTVNLCTB4MDA3YzAwMDAJLyogUEhZIFJlZ2lzdGVyIGZpZWxkIG1hc2sgKi8KKyNkZWZpbmUgRkVDX01JSV9EQVRBX1RBCQkweDAwMDIwMDAwCS8qIFR1cm5hcm91bmQgKi8KKyNkZWZpbmUgRkVDX01JSV9EQVRBX0RBVEFNU0sJMHgwMDAwZmZmZgkvKiBQSFkgZGF0YSBmaWVsZCAqLworCisjZGVmaW5lIEZFQ19NSUlfREFUQV9SQV9TSElGVAkxOAkvKiBNSUkgUmVnaXN0ZXIgYWRkcmVzcyBiaXRzICovCisjZGVmaW5lIEZFQ19NSUlfREFUQV9QQV9TSElGVAkyMwkvKiBNSUkgUEhZIGFkZHJlc3MgYml0cyAqLworCisjZW5kaWYJLyogX19NUEM1MTJYX0ZFQ19IICovCmRpZmYgLS1naXQgYS9jcHUvbXBjNTEyeC9pMmMuYyBiL2NwdS9tcGM1MTJ4L2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZTI4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNTEyeC9pMmMuYwpAQCAtMCwwICsxLDQzMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMyAtIDIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogQmFzZWQgb24gdGhlIE1QQzV4eHggY29kZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWZkZWYgQ09ORklHX0hBUkRfSTJDCisKKyNpbmNsdWRlIDxtcGM1MTJ4Lmg+CisjaW5jbHVkZSA8aTJjLmg+CisKKyNkZWZpbmUgaW1tciAoKGltbWFwX3QgKilDRkdfSU1NUikKKworLyogYnkgZGVmYXVsdCBzZXQgSTJDIGJ1cyAwIGFjdGl2ZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBidXNfbnVtID0gMDsKKworI2RlZmluZSBJMkNfVElNRU9VVAkxMDAKKyNkZWZpbmUgSTJDX1JFVFJJRVMJMworCitzdHJ1Y3QgbXBjNTEyeF9pMmNfdGFwIHsKKwlpbnQgc2NsMnRhcDsKKwlpbnQgdGFwMnRhcDsKK307CisKK3N0YXRpYyBpbnQgIG1wY19yZWdfaW4odm9sYXRpbGUgdTMyICpyZWcpOworc3RhdGljIHZvaWQgbXBjX3JlZ19vdXQodm9sYXRpbGUgdTMyICpyZWcsIGludCB2YWwsIGludCBtYXNrKTsKK3N0YXRpYyBpbnQgIHdhaXRfZm9yX2JiKHZvaWQpOworc3RhdGljIGludCAgd2FpdF9mb3JfcGluKGludCAqc3RhdHVzKTsKK3N0YXRpYyBpbnQgIGRvX2FkZHJlc3ModWNoYXIgY2hpcCwgY2hhciByZHdyX2ZsYWcpOworc3RhdGljIGludCAgc2VuZF9ieXRlcyh1Y2hhciBjaGlwLCBjaGFyICpidWYsIGludCBsZW4pOworc3RhdGljIGludCAgcmVjZWl2ZV9ieXRlcyh1Y2hhciBjaGlwLCBjaGFyICpidWYsIGludCBsZW4pOworc3RhdGljIGludCAgbXBjX2dldF9mZHIoaW50KTsKKworc3RhdGljIGludCBtcGNfcmVnX2luICh2b2xhdGlsZSB1MzIgKnJlZykKK3sKKwlpbnQgcmV0ID0gKnJlZyA+PiAyNDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXBjX3JlZ19vdXQgKHZvbGF0aWxlIHUzMiAqcmVnLCBpbnQgdmFsLCBpbnQgbWFzaykKK3sKKwlpbnQgdG1wOworCisJaWYgKCFtYXNrKSB7CisJCSpyZWcgPSB2YWwgPDwgMjQ7CisJfSBlbHNlIHsKKwkJdG1wID0gbXBjX3JlZ19pbiAocmVnKTsKKwkJKnJlZyA9ICgodG1wICYgfm1hc2spIHwgKHZhbCAmIG1hc2spKSA8PCAyNDsKKwl9CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHdhaXRfZm9yX2JiICh2b2lkKQoreworCWkyYzUxMnhfZGV2X3QgKnJlZ3MgPSAmaW1tci0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgdGltZW91dCA9IEkyQ19USU1FT1VUOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBtcGNfcmVnX2luICgmcmVncy0+bXNyKTsKKworCXdoaWxlICh0aW1lb3V0LS0gJiYgKHN0YXR1cyAmIEkyQ19CQikpIHsKKwkJdm9sYXRpbGUgaW50IHRlbXA7CisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfU1RBLCBJMkNfU1RBKTsKKwkJdGVtcCA9IG1wY19yZWdfaW4gKCZyZWdzLT5tZHIpOworCQltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgMCwgSTJDX1NUQSk7CisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCAwLCAwKTsKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIEkyQ19FTiwgMCk7CisKKwkJdWRlbGF5ICgxMDAwKTsKKwkJc3RhdHVzID0gbXBjX3JlZ19pbiAoJnJlZ3MtPm1zcik7CisJfQorCisJcmV0dXJuIChzdGF0dXMgJiBJMkNfQkIpOworfQorCitzdGF0aWMgaW50IHdhaXRfZm9yX3BpbiAoaW50ICpzdGF0dXMpCit7CisJaTJjNTEyeF9kZXZfdCAqcmVncyA9ICZpbW1yLT5pMmMuZGV2W2J1c19udW1dOworCWludCB0aW1lb3V0ID0gSTJDX1RJTUVPVVQ7CisKKwkqc3RhdHVzID0gbXBjX3JlZ19pbiAoJnJlZ3MtPm1zcik7CisKKwl3aGlsZSAodGltZW91dC0tICYmICEoKnN0YXR1cyAmIEkyQ19JRikpIHsKKwkJdWRlbGF5ICgxMDAwKTsKKwkJKnN0YXR1cyA9IG1wY19yZWdfaW4gKCZyZWdzLT5tc3IpOworCX0KKworCWlmICghKCpzdGF0dXMgJiBJMkNfSUYpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwltcGNfcmVnX291dCAoJnJlZ3MtPm1zciwgMCwgSTJDX0lGKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX2FkZHJlc3MgKHVjaGFyIGNoaXAsIGNoYXIgcmR3cl9mbGFnKQoreworCWkyYzUxMnhfZGV2X3QgKnJlZ3MgPSAmaW1tci0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgc3RhdHVzOworCisJY2hpcCA8PD0gMTsKKworCWlmIChyZHdyX2ZsYWcpIHsKKwkJY2hpcCB8PSAxOworCX0KKworCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfVFgsIEkyQ19UWCk7CisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tZHIsIGNoaXAsIDApOworCisJaWYgKHdhaXRfZm9yX3BpbiAoJnN0YXR1cykpIHsKKwkJcmV0dXJuIC0yOworCX0KKworCWlmIChzdGF0dXMgJiBJMkNfUlhBSykgeworCQlyZXR1cm4gLTM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9ieXRlcyAodWNoYXIgY2hpcCwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWkyYzUxMnhfZGV2X3QgKnJlZ3MgPSAmaW1tci0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgd3Jjb3VudDsKKwlpbnQgc3RhdHVzOworCisJZm9yICh3cmNvdW50ID0gMDsgd3Jjb3VudCA8IGxlbjsgKyt3cmNvdW50KSB7CisKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tZHIsIGJ1Zlt3cmNvdW50XSwgMCk7CisKKwkJaWYgKHdhaXRfZm9yX3BpbiAoJnN0YXR1cykpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIEkyQ19SWEFLKSB7CisJCQlicmVhazsKKwkJfQorCisJfQorCisJcmV0dXJuICEod3Jjb3VudCA9PSBsZW4pOworfQorCitzdGF0aWMgaW50IHJlY2VpdmVfYnl0ZXMgKHVjaGFyIGNoaXAsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpMmM1MTJ4X2Rldl90ICpyZWdzID0gJmltbXItPmkyYy5kZXZbYnVzX251bV07CisJaW50IGR1bW15ICAgPSAxOworCWludCByZGNvdW50ID0gMDsKKwlpbnQgc3RhdHVzOworCWludCBpOworCisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIDAsIEkyQ19UWCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJYnVmW3JkY291bnRdID0gbXBjX3JlZ19pbiAoJnJlZ3MtPm1kcik7CisKKwkJaWYgKGR1bW15KSB7CisJCQlkdW1teSA9IDA7CisJCX0gZWxzZSB7CisJCQlyZGNvdW50Kys7CisJCX0KKworCQlpZiAod2FpdF9mb3JfcGluICgmc3RhdHVzKSkgeworCQkJcmV0dXJuIC00OworCQl9CisJfQorCisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIEkyQ19UWEFLLCBJMkNfVFhBSyk7CisJYnVmW3JkY291bnQrK10gPSBtcGNfcmVnX2luICgmcmVncy0+bWRyKTsKKworCWlmICh3YWl0X2Zvcl9waW4gKCZzdGF0dXMpKSB7CisJCXJldHVybiAtNTsKKwl9CisKKwltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgMCwgSTJDX1RYQUspOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqIEkyQyBBUEkgKioqKioqKioqKioqKioqKi8KKwordm9pZCBpMmNfaW5pdCAoaW50IHNwZWVkLCBpbnQgc2FkZHIpCit7CisJaW50IGk7CisJZm9yKGkgPSAwOyBpIDwgSTJDX0JVU19DTlQ7IGkrKyl7CisJCWkyYzUxMnhfZGV2X3QgKnJlZ3MgPSAmaW1tci0+aTJjLmRldltpXTsKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIDAsIDApOworCisJCS8qIFNldCBjbG9jayAqLworCQltcGNfcmVnX291dCAoJnJlZ3MtPm1mZHIsIG1wY19nZXRfZmRyIChzcGVlZCksIDApOworCQltcGNfcmVnX291dCAoJnJlZ3MtPm1hZHIsIHNhZGRyIDw8IDEsIDApOworCisJCS8qIEVuYWJsZSBtb2R1bGUgKi8KKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIEkyQ19FTiwgSTJDX0lOSVRfTUFTSyk7CisJCW1wY19yZWdfb3V0ICgmcmVncy0+bXNyLCAwLCBJMkNfSUYpOworCX0KKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWltbXItPmkyYy5pY3IgPSAwOworCS8qIFR1cm4gb2ZmIGZpbHRlcnMgKi8KKwlpbW1yLT5pMmMubWlmciA9IDA7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IG1wY19nZXRfZmRyIChpbnQgc3BlZWQpCit7CisJc3RhdGljIGludCBmZHIgPSAtMTsKKworCWlmIChmZHIgPT0gLTEpIHsKKwkJdWxvbmcgYmVzdF9zcGVlZCA9IDA7CisJCXVsb25nIGRpdmlkZXI7CisJCXVsb25nIGlwYiwgc2NsOworCQl1bG9uZyBiZXN0bWF0Y2ggPSAweGZmZmZmZmZmVUw7CisJCWludCBiZXN0X2kgPSAwLCBiZXN0X2ogPSAwLCBpLCBqOworCQlpbnQgU0NMX1RhcFtdID0geyA5LCAxMCwgMTIsIDE1LCA1LCA2LCA3LCA4fTsKKwkJc3RydWN0IG1wYzUxMnhfaTJjX3RhcCBzY2x0YXBbXSA9IHsKKwkJCXs0LCAxfSwKKwkJCXs0LCAyfSwKKwkJCXs2LCA0fSwKKwkJCXs2LCA4fSwKKwkJCXsxNCwgMTZ9LAorCQkJezMwLCAzMn0sCisJCQl7NjIsIDY0fSwKKwkJCXsxMjYsIDEyOH0KKwkJfTsKKworCQlpcGIgPSBnZC0+aXBiX2NsazsKKwkJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsKKwkJCWZvciAoaiA9IDc7IGogPj0gMDsgai0tKSB7CisJCQkJc2NsID0gMiAqIChzY2x0YXBbal0uc2NsMnRhcCArCisJCQkJCSAgIChTQ0xfVGFwW2ldIC0gMSkgKiBzY2x0YXBbal0udGFwMnRhcAorCQkJCQkgICArIDIpOworCQkJCWlmIChpcGIgPD0gc3BlZWQqc2NsKSB7CisJCQkJCWlmICgoc3BlZWQqc2NsIC0gaXBiKSA8IGJlc3RtYXRjaCkgeworCQkJCQkJYmVzdG1hdGNoID0gc3BlZWQqc2NsIC0gaXBiOworCQkJCQkJYmVzdF9pID0gaTsKKwkJCQkJCWJlc3RfaiA9IGo7CisJCQkJCQliZXN0X3NwZWVkID0gaXBiL3NjbDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlkaXZpZGVyID0gKGJlc3RfaSAmIDMpIHwgKChiZXN0X2kgJiA0KSA8PCAzKSB8IChiZXN0X2ogPDwgMik7CisJCWlmIChnZC0+ZmxhZ3MgJiBHRF9GTEdfUkVMT0MpIHsKKwkJCWZkciA9IGRpdmlkZXI7CisJCX0gZWxzZSB7CisJCQlkZWJ1ZygiJWxkIGtIeiwgXG4iLCBiZXN0X3NwZWVkIC8gMTAwMCk7CisJCQlyZXR1cm4gZGl2aWRlcjsKKwkJfQorCX0KKworCXJldHVybiBmZHI7Cit9CisKK2ludCBpMmNfcHJvYmUgKHVjaGFyIGNoaXApCit7CisJaTJjNTEyeF9kZXZfdCAqcmVncyA9ICZpbW1yLT5pMmMuZGV2W2J1c19udW1dOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEkyQ19SRVRSSUVTOyBpKyspIHsKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIEkyQ19TVEEsIEkyQ19TVEEpOworCisJCWlmICghIGRvX2FkZHJlc3MgKGNoaXAsIDApKSB7CisJCQltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgMCwgSTJDX1NUQSk7CisJCQl1ZGVsYXkgKDUwMCk7CisJCQlicmVhazsKKwkJfQorCisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCAwLCBJMkNfU1RBKTsKKwkJdWRlbGF5ICg1MDApOworCX0KKworCXJldHVybiAoaSA9PSBJMkNfUkVUUklFUyk7Cit9CisKK2ludCBpMmNfcmVhZCAodWNoYXIgY2hpcCwgdWludCBhZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwljaGFyIHhhZGRyWzRdOworCWkyYzUxMnhfZGV2X3QgKnJlZ3MgPSAmaW1tci0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgcmV0ID0gLTE7CisKKwl4YWRkclswXSA9IChhZGRyID4+IDI0KSAmIDB4RkY7CisJeGFkZHJbMV0gPSAoYWRkciA+PiAxNikgJiAweEZGOworCXhhZGRyWzJdID0gKGFkZHIgPj4gIDgpICYgMHhGRjsKKwl4YWRkclszXSA9ICBhZGRyCSYgMHhGRjsKKworCWlmICh3YWl0X2Zvcl9iYiAoKSkgeworCQlwcmludGYgKCJpMmNfcmVhZDogYnVzIGlzIGJ1c3lcbiIpOworCQlnb3RvIERvbmU7CisJfQorCisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIEkyQ19TVEEsIEkyQ19TVEEpOworCWlmIChkb19hZGRyZXNzIChjaGlwLCAwKSkgeworCQlwcmludGYgKCJpMmNfcmVhZDogZmFpbGVkIHRvIGFkZHJlc3MgY2hpcFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlpZiAoc2VuZF9ieXRlcyAoY2hpcCwgJnhhZGRyWzQtYWxlbl0sIGFsZW4pKSB7CisJCXByaW50ZiAoImkyY19yZWFkOiBzZW5kX2J5dGVzIGZhaWxlZFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgSTJDX1JTVEEsIEkyQ19SU1RBKTsKKwlpZiAoZG9fYWRkcmVzcyAoY2hpcCwgMSkpIHsKKwkJcHJpbnRmICgiaTJjX3JlYWQ6IGZhaWxlZCB0byBhZGRyZXNzIGNoaXBcbiIpOworCQlnb3RvIERvbmU7CisJfQorCisJaWYgKHJlY2VpdmVfYnl0ZXMgKGNoaXAsIChjaGFyICopYnVmLCBsZW4pKSB7CisJCXByaW50ZiAoImkyY19yZWFkOiByZWNlaXZlX2J5dGVzIGZhaWxlZFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlyZXQgPSAwOworRG9uZToKKwltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgMCwgSTJDX1NUQSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGkyY193cml0ZSAodWNoYXIgY2hpcCwgdWludCBhZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwljaGFyIHhhZGRyWzRdOworCWkyYzUxMnhfZGV2X3QgKnJlZ3MgPSAmaW1tci0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgcmV0ID0gLTE7CisKKwl4YWRkclswXSA9IChhZGRyID4+IDI0KSAmIDB4RkY7CisJeGFkZHJbMV0gPSAoYWRkciA+PiAxNikgJiAweEZGOworCXhhZGRyWzJdID0gKGFkZHIgPj4gIDgpICYgMHhGRjsKKwl4YWRkclszXSA9ICBhZGRyCSYgMHhGRjsKKworCWlmICh3YWl0X2Zvcl9iYiAoKSkgeworCQlwcmludGYgKCJpMmNfd3JpdGU6IGJ1cyBpcyBidXN5XG4iKTsKKwkJZ290byBEb25lOworCX0KKworCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfU1RBLCBJMkNfU1RBKTsKKwlpZiAoZG9fYWRkcmVzcyAoY2hpcCwgMCkpIHsKKwkJcHJpbnRmICgiaTJjX3dyaXRlOiBmYWlsZWQgdG8gYWRkcmVzcyBjaGlwXG4iKTsKKwkJZ290byBEb25lOworCX0KKworCWlmIChzZW5kX2J5dGVzIChjaGlwLCAmeGFkZHJbNC1hbGVuXSwgYWxlbikpIHsKKwkJcHJpbnRmICgiaTJjX3dyaXRlOiBzZW5kX2J5dGVzIGZhaWxlZFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlpZiAoc2VuZF9ieXRlcyAoY2hpcCwgKGNoYXIgKilidWYsIGxlbikpIHsKKwkJcHJpbnRmICgiaTJjX3dyaXRlOiBzZW5kX2J5dGVzIGZhaWxlZFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlyZXQgPSAwOworRG9uZToKKwltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgMCwgSTJDX1NUQSk7CisJcmV0dXJuIHJldDsKK30KKwordWNoYXIgaTJjX3JlZ19yZWFkICh1Y2hhciBjaGlwLCB1Y2hhciByZWcpCit7CisJdWNoYXIgYnVmOworCisJaTJjX3JlYWQgKGNoaXAsIHJlZywgMSwgJmJ1ZiwgMSk7CisKKwlyZXR1cm4gYnVmOworfQorCit2b2lkIGkyY19yZWdfd3JpdGUgKHVjaGFyIGNoaXAsIHVjaGFyIHJlZywgdWNoYXIgdmFsKQoreworCWkyY193cml0ZSAoY2hpcCwgcmVnLCAxLCAmdmFsLCAxKTsKKworCXJldHVybjsKK30KKworCitpbnQgaTJjX3NldF9idXNfbnVtICh1bnNpZ25lZCBpbnQgYnVzKQoreworCWlmIChidXMgPj0gSTJDX0JVU19DTlQpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlidXNfbnVtID0gYnVzOworCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGludCBpMmNfZ2V0X2J1c19udW0gKHZvaWQpCit7CisJcmV0dXJuIGJ1c19udW07Cit9CisKKy8qIFRPRE8gKi8KK3Vuc2lnbmVkIGludCBpMmNfZ2V0X2J1c19zcGVlZCAodm9pZCkKK3sKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBpMmNfc2V0X2J1c19zcGVlZCAodW5zaWduZWQgaW50IHNwZWVkKQoreworCWlmIChzcGVlZCAhPSBDRkdfSTJDX1NQRUVEKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCS8qIENPTkZJR19IQVJEX0kyQyAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzUxMngvaW50ZXJydXB0cy5jIGIvY3B1L21wYzUxMngvaW50ZXJydXB0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYzI0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNTEyeC9pbnRlcnJ1cHRzLmMKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogRGVyaXZlZCBmcm9tIHRoZSBNUEM4M3h4IGNvZGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworc3RydWN0IGlycV9hY3Rpb24geworCWludGVycnVwdF9oYW5kbGVyX3QgKmhhbmRsZXI7CisJdm9pZCAqYXJnOworCXVsb25nIGNvdW50OworfTsKKworaW50IGludGVycnVwdF9pbml0X2NwdSAodW5zaWduZWQgKmRlY3JlbWVudGVyX2NvdW50KQoreworCSpkZWNyZW1lbnRlcl9jb3VudCA9IGdldF90YmNsayAoKSAvIENGR19IWjsKKworCXJldHVybiAwOworfQorCisvKgorICogSW5zdGFsbCBhbmQgZnJlZSBhbiBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLwordm9pZAoraXJxX2luc3RhbGxfaGFuZGxlciAoaW50IGlycSwgaW50ZXJydXB0X2hhbmRsZXJfdCAqIGhhbmRsZXIsIHZvaWQgKmFyZykKK3sKK30KKwordm9pZCBpcnFfZnJlZV9oYW5kbGVyIChpbnQgaXJxKQoreworfQorCit2b2lkIHRpbWVyX2ludGVycnVwdF9jcHUgKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM1MTJ4L3NlcmlhbC5jIGIvY3B1L21wYzUxMngvc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwZmYyYwotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM1MTJ4L3NlcmlhbC5jCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwIC0gMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBCYXNlZCBvbnQgdGhlIE1QQzUyMDAgUFNDIGRyaXZlci4KKyAqIEFkYXB0ZWQgZm9yIE1QQzUxMnggYnkgSmFuIFdyb2JlbCA8d3JyQHNlbWloYWxmLmNvbT4KKyAqLworCisvKgorICogTWluaW1hbCBzZXJpYWwgZnVuY3Rpb25zIG5lZWRlZCB0byB1c2Ugb25lIG9mIHRoZSBQU0MgcG9ydHMKKyAqIGFzIHNlcmlhbCBjb25zb2xlIGludGVyZmFjZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWYgZGVmaW5lZChDT05GSUdfUFNDX0NPTlNPTEUpCisKK3N0YXRpYyB2b2lkIGZpZm9faW5pdCAodm9sYXRpbGUgcHNjNTEyeF90ICpwc2MpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKworCS8qIHJlc2V0IFJ4ICYgVHggZmlmbyBzbGljZSAqLworCXBzYy0+cmZjbWQgPSBQU0NfRklGT19SRVNFVF9TTElDRTsKKwlwc2MtPnRmY21kID0gUFNDX0ZJRk9fUkVTRVRfU0xJQ0U7CisKKwkvKiBkaXNhYmxlIFR4ICYgUnggRklGTyBpbnRlcnJ1cHRzICovCisJcHNjLT5yZmludG1hc2sgPSAwOworCXBzYy0+dGZpbnRtYXNrID0gMDsKKworCXBzYy0+dGZzaXplID0gQ09OU09MRV9GSUZPX1RYX1NJWkUgfCAoQ09OU09MRV9GSUZPX1RYX0FERFIgPDwgMTYpOworCXBzYy0+cmZzaXplID0gQ09OU09MRV9GSUZPX1JYX1NJWkUgfCAoQ09OU09MRV9GSUZPX1JYX0FERFIgPDwgMTYpOworCisJLyogZW5hYmxlIFR4ICYgUnggRklGTyBzbGljZSAqLworCXBzYy0+cmZjbWQgPSBQU0NfRklGT19FTkFCTEVfU0xJQ0U7CisJcHNjLT50ZmNtZCA9IFBTQ19GSUZPX0VOQUJMRV9TTElDRTsKKworCWltLT5maWZvYy5maWZvY19jbWQgPSBGSUZPQ19ESVNBQkxFX0NMT0NLX0dBVEU7CisJX19hc21fXyB2b2xhdGlsZSAoInN5bmMiKTsKK30KKworaW50IHNlcmlhbF9pbml0KHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBwc2M1MTJ4X3QgKnBzYyA9IChwc2M1MTJ4X3QgKikgJmltLT5wc2NbQ09ORklHX1BTQ19DT05TT0xFXTsKKwl1bnNpZ25lZCBsb25nIGJhc2VjbGs7CisJaW50IGRpdjsKKworCWZpZm9faW5pdCAocHNjKTsKKworCS8qIHNldCBNUiByZWdpc3RlciB0byBwb2ludCB0byBNUjEgKi8KKwlwc2MtPmNvbW1hbmQgPSBQU0NfU0VMX01PREVfUkVHXzE7CisKKwkvKiBkaXNhYmxlIFR4L1J4ICovCisJcHNjLT5jb21tYW5kID0gUFNDX1RYX0RJU0FCTEUgfCBQU0NfUlhfRElTQUJMRTsKKworCS8qIGNob29zZSB0aGUgcHJlc2NhbGVyCWJ5IDE2IGZvciB0aGUgVHgvUnggY2xvY2sgZ2VuZXJhdGlvbiAqLworCXBzYy0+cHNjX2Nsb2NrX3NlbGVjdCA9ICAweGRkMDA7CisKKwkvKiBzd2l0Y2ggdG8gVUFSVCBtb2RlICovCisJcHNjLT5zaWNyID0gMDsKKworCS8qIG1vZGUgcmVnaXN0ZXIgcG9pbnRzIHRvIG1yMSAqLworCS8qIGNvbmZpZ3VyZSBwYXJpdHksIGJpdCBsZW5ndGggYW5kIHNvIG9uIGluIG1vZGUgcmVnaXN0ZXIgMSovCisJcHNjLT5tb2RlID0gUFNDX01PREVfOF9CSVRTIHwgUFNDX01PREVfUEFSTk9ORTsKKwkvKiBub3csIG1vZGUgcmVnaXN0ZXIgcG9pbnRzIHRvIG1yMiAqLworCXBzYy0+bW9kZSA9IFBTQ19NT0RFXzFfU1RPUEJJVDsKKworCS8qIGNhbGN1bGF0ZSBkaXZpZG9yIGZvciBzZXR0aW5nIFBTQyBDVFVSIGFuZCBDVExSIHJlZ2lzdGVycyAqLworCWJhc2VjbGsgPSAoZ2QtPmlwYl9jbGsgKyA4KSAvIDE2OworCWRpdiA9IChiYXNlY2xrICsgKGdkLT5iYXVkcmF0ZSAvIDIpKSAvIGdkLT5iYXVkcmF0ZTsKKworCXBzYy0+Y3R1ciA9IChkaXYgPj4gOCkgJiAweGZmOworCS8qIHNldCBiYXVkcmF0ZSAqLworCXBzYy0+Y3RsciA9IGRpdiAmIDB4ZmY7CisKKwkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJcHNjLT5wc2NfaW1yID0gMDsKKworCS8qIHJlc2V0IGFuZCBlbmFibGUgUngvVHggKi8KKwlwc2MtPmNvbW1hbmQgPSBQU0NfUlNUX1JYOworCXBzYy0+Y29tbWFuZCA9IFBTQ19SU1RfVFg7CisJcHNjLT5jb21tYW5kID0gUFNDX1JYX0VOQUJMRSB8IFBTQ19UWF9FTkFCTEU7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzZXJpYWxfcHV0YyAoY29uc3QgY2hhciBjKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKwl2b2xhdGlsZSBwc2M1MTJ4X3QgKnBzYyA9IChwc2M1MTJ4X3QgKikgJmltLT5wc2NbQ09ORklHX1BTQ19DT05TT0xFXTsKKworCWlmIChjID09ICdcbicpCisJCXNlcmlhbF9wdXRjICgnXHInKTsKKworCS8qIFdhaXQgZm9yIGxhc3QgY2hhcmFjdGVyIHRvIGdvLiAqLworCXdoaWxlICghKHBzYy0+cHNjX3N0YXR1cyAmIFBTQ19TUl9UWEVNUCkpCisJCTsKKworCXBzYy0+dGZkYXRhXzggPSBjOworfQorCit2b2lkIHNlcmlhbF9wdXRjX3JhdyAoY29uc3QgY2hhciBjKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdm9sYXRpbGUgcHNjNTEyeF90ICpwc2MgPSAocHNjNTEyeF90ICopICZpbS0+cHNjW0NPTkZJR19QU0NfQ09OU09MRV07CisKKwkvKiBXYWl0IGZvciBsYXN0IGNoYXJhY3RlciB0byBnby4gKi8KKwl3aGlsZSAoIShwc2MtPnBzY19zdGF0dXMgJiBQU0NfU1JfVFhFTVApKQorCQk7CisKKwlwc2MtPnRmZGF0YV84ID0gYzsKK30KKworCit2b2lkIHNlcmlhbF9wdXRzIChjb25zdCBjaGFyICpzKQoreworCXdoaWxlICgqcykgeworCQlzZXJpYWxfcHV0YyAoKnMrKyk7CisJfQorfQorCitpbnQgc2VyaWFsX2dldGMgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBwc2M1MTJ4X3QgKnBzYyA9IChwc2M1MTJ4X3QgKikgJmltLT5wc2NbQ09ORklHX1BTQ19DT05TT0xFXTsKKworCS8qIFdhaXQgZm9yIGEgY2hhcmFjdGVyIHRvIGFycml2ZS4gKi8KKwl3aGlsZSAocHNjLT5yZnN0YXQgJiBQU0NfRklGT19FTVBUWSkKKwkJOworCisJcmV0dXJuIHBzYy0+cmZkYXRhXzg7Cit9CisKK2ludCBzZXJpYWxfdHN0YyAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENGR19JTU1SOworCXZvbGF0aWxlIHBzYzUxMnhfdCAqcHNjID0gKHBzYzUxMnhfdCAqKSAmaW0tPnBzY1tDT05GSUdfUFNDX0NPTlNPTEVdOworCisJcmV0dXJuICEocHNjLT5yZnN0YXQgJiBQU0NfRklGT19FTVBUWSk7Cit9CisKK3ZvaWQgc2VyaWFsX3NldGJyZyAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENGR19JTU1SOworCXZvbGF0aWxlIHBzYzUxMnhfdCAqcHNjID0gKHBzYzUxMnhfdCAqKSAmaW0tPnBzY1tDT05GSUdfUFNDX0NPTlNPTEVdOworCXVuc2lnbmVkIGxvbmcgYmFzZWNsaywgZGl2OworCisJYmFzZWNsayA9IChnZC0+Y3NiX2NsayArIDgpIC8gMTY7CisJZGl2ID0gKGJhc2VjbGsgKyAoZ2QtPmJhdWRyYXRlIC8gMikpIC8gZ2QtPmJhdWRyYXRlOworCisJcHNjLT5jdHVyID0gKGRpdiA+PiA4KSAmIDB4RkY7CisJcHNjLT5jdGxyID0gIGRpdiAmIDB4ZmY7IC8qIHNldCBiYXVkcmF0ZSAqLworfQorCit2b2lkIHNlcmlhbF9zZXRydHMoaW50IHMpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBwc2M1MTJ4X3QgKnBzYyA9IChwc2M1MTJ4X3QgKikgJmltLT5wc2NbQ09ORklHX1BTQ19DT05TT0xFXTsKKworCWlmIChzKSB7CisJCS8qIEFzc2VydCBSVFMgKGJlY29tZSBMT1cpICovCisJCXBzYy0+b3AxID0gMHgxOworCX0KKwllbHNlIHsKKwkJLyogTmVnYXRlIFJUUyAoYmVjb21lIEhJR0gpICovCisJCXBzYy0+b3AwID0gMHgxOworCX0KK30KKworaW50IHNlcmlhbF9nZXRjdHModm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENGR19JTU1SOworCXZvbGF0aWxlIHBzYzUxMnhfdCAqcHNjID0gKHBzYzUxMnhfdCAqKSAmaW0tPnBzY1tDT05GSUdfUFNDX0NPTlNPTEVdOworCisJcmV0dXJuIChwc2MtPmlwICYgMHgxKSA/IDAgOiAxOworfQorI2VuZGlmIC8qIENPTkZJR19QU0NfQ09OU09MRSAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzUxMngvc3BlZWQuYyBiL2NwdS9tcGM1MTJ4L3NwZWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwOTgyNwotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM1MTJ4L3NwZWVkLmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEJhc2VkIG9uIHRoZSBNUEM4M3h4IGNvZGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzUxMnguaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworc3RhdGljIGludCBzcG1mX211bHRbXSA9IHsKKwk2OCwgMSwgMTIsIDE2LAorCTIwLCAyNCwgMjgsIDMyLAorCTM2LCA0MCwgNDQsIDQ4LAorCTUyLCA1NiwgNjAsIDY0Cit9OworCitzdGF0aWMgaW50IGNwbWZfbXVsdFtdWzJdID0geworCXswLCAxfSwgezAsIDF9LCAvKiAwIGFuZCAxIGFyZSBub3QgdmFsaWQgKi8KKwl7MSwgMX0sIHszLCAyfSwKKwl7MiwgMX0sIHs1LCAyfSwKKwl7MywgMX0sIHs3LCAyfSwKKwl7MCwgMX0sIHswLCAxfSwgLyogYW5kIGFsbCBhYm92ZSA3IGFyZSBub3QgdmFsaWQgdG9vICovCisJezAsIDF9LCB7MCwgMX0sCisJezAsIDF9LCB7MCwgMX0sCisJezAsIDF9LCB7MCwgMX0KK307CisKK3N0YXRpYyBpbnQgc3lzX2Rpdmlkb3JzW11bMl0gPSB7CisJezIsIDF9LCB7NSwgMn0sIHszLCAxfSwgezcsIDJ9LCB7NCwgMX0sCisJezksIDJ9LCB7NSwgMX0sIHs3LCAxfSwgezYsIDF9LCB7OCwgMX0sCisJezksIDF9LCB7MTEsIDF9LCB7MTAsIDF9LCB7MTIsIDF9LCB7MTMsIDF9LAorCXsxNSwgMX0sIHsxNCwgMX0sIHsxNiwgMX0sIHsxNywgMX0sIHsxOSwgMX0sCisJezE4LCAxfSwgezIwLCAxfSwgezIxLCAxfSwgezIzLCAxfSwgezIyLCAxfSwKKwl7MjQsIDF9LCB7MjUsIDF9LCB7MjcsIDF9LCB7MjYsIDF9LCB7MjgsIDF9LAorCXsyOSwgMX0sIHszMSwgMX0sIHszMCwgMX0sIHszMiwgMX0sIHszMywgMX0KK307CisKK2ludCBnZXRfY2xvY2tzICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdTggc3BtZjsKKwl1OCBjcG1mOworCXU4IHN5c19kaXY7CisJdTggaXBzX2RpdjsKKwl1MzIgcmVmX2NsayA9IENGR19NUEM1MTJYX0NMS0lOOworCXUzMiBzcGxsOworCXUzMiBzeXNfY2xrOworCXUzMiBjb3JlX2NsazsKKwl1MzIgY3NiX2NsazsKKwl1MzIgaXBzX2NsazsKKworCWlmICgoaW0tPnN5c2NvbmYuaW1tcmJhciAmIElNTVJCQVJfQkFTRV9BRERSKSAhPSAodTMyKSBpbSkKKwkJcmV0dXJuIC0xOworCisJc3BtZiA9IChpbS0+Y2xrLnNwbXIgJiBTUE1SX1NQTUYpID4+IFNQTVJfU1BNRl9TSElGVDsKKwlzcGxsID0gcmVmX2NsayAqIHNwbWZfbXVsdFtzcG1mXTsKKworCXN5c19kaXYgPSAoaW0tPmNsay5zY2ZyWzFdICYgU0NGUjJfU1lTX0RJVikgPj4gU0NGUjJfU1lTX0RJVl9TSElGVDsKKwlzeXNfY2xrID0gKHNwbGwgKiBzeXNfZGl2aWRvcnNbc3lzX2Rpdl1bMV0pIC8gc3lzX2Rpdmlkb3JzW3N5c19kaXZdWzBdOworCisJY3NiX2NsayA9IHN5c19jbGsgLyAyOworCisJY3BtZiA9IChpbS0+Y2xrLnNwbXIgJiBTUE1SX0NQTUYpID4+IFNQTVJfQ1BNRl9TSElGVDsKKwljb3JlX2NsayA9IChjc2JfY2xrICogY3BtZl9tdWx0W2NwbWZdWzBdKSAvIGNwbWZfbXVsdFtjcG1mXVsxXTsKKworCWlwc19kaXYgPSAoaW0tPmNsay5zY2ZyWzBdICYgU0NGUjFfSVBTX0RJVl9NQVNLKSA+PiBTQ0ZSMV9JUFNfRElWX1NISUZUOworCWlmIChpcHNfZGl2ICE9IDApIHsKKwkJaXBzX2NsayA9IGNzYl9jbGsgLyBpcHNfZGl2OworCX0gZWxzZSB7CisJCS8qIGluIGNhc2Ugd2UgY2Fubm90IGdldCBhIHNhbmUgSVBTIGRpdmlzb3IsIGZhaWwgZ3JhY2VmdWxseSAqLworCQlpcHNfY2xrID0gMDsKKwl9CisKKwlnZC0+aXBiX2NsayA9IGlwc19jbGs7CisJZ2QtPmNzYl9jbGsgPSBjc2JfY2xrOworCWdkLT5jcHVfY2xrID0gY29yZV9jbGs7CisJZ2QtPmJ1c19jbGsgPSBjc2JfY2xrOworCXJldHVybiAwOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2J1c19mcmVxCisgKiByZXR1cm4gc3lzdGVtIGJ1cyBmcmVxIGluIEh6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgZ2V0X2J1c19mcmVxICh1bG9uZyBkdW1teSkKK3sKKwlyZXR1cm4gZ2QtPmNzYl9jbGs7Cit9CisKK2ludCBkb19jbG9ja3MgKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlwcmludGYgKCJDbG9jayBjb25maWd1cmF0aW9uOlxuIik7CisJcHJpbnRmICgiICBDUFU6ICAgICAgICAgICAgICAgICAlNGQgTUh6XG4iLCBnZC0+Y3B1X2NsayAvIDEwMDAwMDApOworCXByaW50ZiAoIiAgQ29oZXJlbnQgU3lzdGVtIEJ1czogJTRkIE1IelxuIiwgZ2QtPmNzYl9jbGsgLyAxMDAwMDAwKTsKKwlwcmludGYgKCIgIElQUyBCdXM6ICAgICAgICAgICAgICU0ZCBNSHpcbiIsIGdkLT5pcGJfY2xrIC8gMTAwMDAwMCk7CisJcHJpbnRmICgiICBERFI6ICAgICAgICAgICAgICAgICAlNGQgTUh6XG4iLCAyICogZ2QtPmNzYl9jbGsgLyAxMDAwMDAwKTsKKwlyZXR1cm4gMDsKK30KKworVV9CT09UX0NNRChjbG9ja3MsIDEsIDAsIGRvX2Nsb2NrcywKKwkiY2xvY2tzICAtIHByaW50IGNsb2NrIGNvbmZpZ3VyYXRpb25cbiIsCisJIiAgICBjbG9ja3NcbiIKKyk7CisKK2ludCBwcnRfbXBjNTEyeF9jbGtzICh2b2lkKQoreworCWRvX2Nsb2NrcyAoTlVMTCwgMCwgMCwgTlVMTCk7CisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM1MTJ4L3N0YXJ0LlMgYi9jcHUvbXBjNTEyeC9zdGFydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NGM2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNTEyeC9zdGFydC5TCkBAIC0wLDAgKzEsNzgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk4ICBEYW4gTWFsZWsgPGRtYWxla0BqbGMubmV0PgorICogQ29weXJpZ2h0IChDKSAxOTk5ICBNYWdudXMgRGFtbSA8a2llcmF5cGMwMS5wLnkua2llLmVyYS5lcmljc3Nvbi5zZT4KKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNyBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorICogQ29weXJpZ2h0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIDIwMDQsIDIwMDYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogQmFzZWQgb24gdGhlIE1QQzgzeHggY29kZS4KKyAqLworCisvKgorICogIFUtQm9vdCAtIFN0YXJ0dXAgQ29kZSBmb3IgTVBDNTEyeCBiYXNlZCBFbWJlZGRlZCBCb2FyZHMKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bXBjNTEyeC5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKworI2RlZmluZSBDT05GSUdfNTIxWAkxCQkvKiBuZWVkZWQgZm9yIExpbnV4IGtlcm5lbCBoZWFkZXIgZmlsZXMqLworCisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPHBwY19kZWZzLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisKKyNpZm5kZWYgIENPTkZJR19JREVOVF9TVFJJTkcKKyNkZWZpbmUgIENPTkZJR19JREVOVF9TVFJJTkcgIk1QQzUxMlgiCisjZW5kaWYKKworLyoKKyAqIEZsb2F0aW5nIFBvaW50IGVuYWJsZSwgTWFjaGluZSBDaGVjayBhbmQgUmVjb3ZlcmFibGUgSW50ZXJyLgorICovCisjdW5kZWYJTVNSX0tFUk5FTAorI2lmZGVmIERFQlVHCisjZGVmaW5lIE1TUl9LRVJORUwgKE1TUl9GUHxNU1JfUkkpCisjZWxzZQorI2RlZmluZSBNU1JfS0VSTkVMIChNU1JfRlB8TVNSX01FfE1TUl9SSSkKKyNlbmRpZgorCisvKiBNYWNyb3MgZm9yIG1hbmlwdWxhdGluZyBDU3hfU1RBUlQvU1RPUCAqLworI2RlZmluZSBTVEFSVF9SRUcoc3RhcnQpCSgoc3RhcnQpID4+IDE2KQorI2RlZmluZSBTVE9QX1JFRyhzdGFydCwgc2l6ZSkJKCgoc3RhcnQpICsgKHNpemUpIC0gMSkgPj4gMTYpCisKKy8qCisgKiBTZXQgdXAgR09UOiBHbG9iYWwgT2Zmc2V0IFRhYmxlCisgKgorICogVXNlIHIxNCB0byBhY2Nlc3MgdGhlIEdPVAorICovCisJU1RBUlRfR09UCisJR09UX0VOVFJZKF9HT1QyX1RBQkxFXykKKwlHT1RfRU5UUlkoX0ZJWFVQX1RBQkxFXykKKworCUdPVF9FTlRSWShfc3RhcnQpCisJR09UX0VOVFJZKF9zdGFydF9vZl92ZWN0b3JzKQorCUdPVF9FTlRSWShfZW5kX29mX3ZlY3RvcnMpCisJR09UX0VOVFJZKHRyYW5zZmVyX3RvX2hhbmRsZXIpCisKKwlHT1RfRU5UUlkoX19pbml0X2VuZCkKKwlHT1RfRU5UUlkoX2VuZCkKKwlHT1RfRU5UUlkoX19ic3Nfc3RhcnQpCisJRU5EX0dPVAorCisvKgorICogTWFnaWMgbnVtYmVyIGFuZCB2ZXJzaW9uIHN0cmluZworICovCisJLmxvbmcJMHgyNzA1MTk1NgkJLyogVS1Cb290IE1hZ2ljIE51bWJlciAqLworCS5nbG9ibAl2ZXJzaW9uX3N0cmluZwordmVyc2lvbl9zdHJpbmc6CisJLmFzY2lpIFVfQk9PVF9WRVJTSU9OCisJLmFzY2lpICIgKCIsIF9fREFURV9fLCAiIC0gIiwgX19USU1FX18sICIpIgorCS5hc2NpaSAiICIsIENPTkZJR19JREVOVF9TVFJJTkcsICJcMCIKKworLyoKKyAqIFZlY3RvciBUYWJsZQorICovCisJLnRleHQKKwkuID0gRVhDX09GRl9TWVNfUkVTRVQKKworCS5nbG9ibAlfc3RhcnQKKwkvKiBTdGFydCBmcm9tIGhlcmUgYWZ0ZXIgcmVzZXQvcG93ZXIgb24gKi8KK19zdGFydDoKKwlsaQlyMjEsIEJPT1RGTEFHX0NPTEQgIC8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCisJYglib290X2NvbGQKKworCS5nbG9ibAlfc3RhcnRfb2ZfdmVjdG9ycworX3N0YXJ0X29mX3ZlY3RvcnM6CisKKy8qIE1hY2hpbmUgY2hlY2sgKi8KKwlTVERfRVhDRVBUSU9OKDB4MjAwLCBNYWNoaW5lQ2hlY2ssIE1hY2hpbmVDaGVja0V4Y2VwdGlvbikKKworLyogRGF0YSBTdG9yYWdlIGV4Y2VwdGlvbi4gKi8KKwlTVERfRVhDRVBUSU9OKDB4MzAwLCBEYXRhU3RvcmFnZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogSW5zdHJ1Y3Rpb24gU3RvcmFnZSBleGNlcHRpb24uICovCisJU1REX0VYQ0VQVElPTigweDQwMCwgSW5zdFN0b3JhZ2UsIFVua25vd25FeGNlcHRpb24pCisKKy8qIEV4dGVybmFsIEludGVycnVwdCBleGNlcHRpb24uICovCisJU1REX0VYQ0VQVElPTigweDUwMCwgRXh0SW50ZXJydXB0LCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBBbGlnbm1lbnQgZXhjZXB0aW9uLiAqLworCS4gPSAweDYwMAorQWxpZ25tZW50OgorCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKKwltZnNwcglyNCxEQVIKKwlzdHcJcjQsX0RBUihyMjEpCisJbWZzcHIJcjUsRFNJU1IKKwlzdHcJcjUsX0RTSVNSKHIyMSkKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJbGkJcjIwLE1TUl9LRVJORUwKKwlybHdpbWkJcjIwLHIyMywwLDE2LDE2CQkvKiBjb3B5IEVFIGJpdCBmcm9tIHNhdmVkIE1TUiAqLworCXJsd2ltaQlyMjAscjIzLDAsMjUsMjUJCS8qIGNvcHkgSVAgYml0IGZyb20gc2F2ZWQgTVNSICovCisJbHd6CXI2LEdPVCh0cmFuc2Zlcl90b19oYW5kbGVyKQorCW10bHIJcjYKKwlibHJsCisuTF9BbGlnbm1lbnQ6CisJLmxvbmcJQWxpZ25tZW50RXhjZXB0aW9uIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwkubG9uZwlpbnRfcmV0dXJuIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKworLyogUHJvZ3JhbSBjaGVjayBleGNlcHRpb24gKi8KKwkuID0gMHg3MDAKK1Byb2dyYW1DaGVjazoKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCWxpCXIyMCxNU1JfS0VSTkVMCisJcmx3aW1pCXIyMCxyMjMsMCwxNiwxNgkJLyogY29weSBFRSBiaXQgZnJvbSBzYXZlZCBNU1IgKi8KKwlybHdpbWkJcjIwLHIyMywwLDI1LDI1CQkvKiBjb3B5IElQIGJpdCBmcm9tIHNhdmVkIE1TUiAqLworCWx3eglyNixHT1QodHJhbnNmZXJfdG9faGFuZGxlcikKKwltdGxyCXI2CisJYmxybAorLkxfUHJvZ3JhbUNoZWNrOgorCS5sb25nCVByb2dyYW1DaGVja0V4Y2VwdGlvbiAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJLmxvbmcJaW50X3JldHVybiAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisKKy8qIEZsb2F0aW5nIFBvaW50IFVuaXQgdW5hdmFpbGFibGUgZXhjZXB0aW9uICovCisJU1REX0VYQ0VQVElPTigweDgwMCwgRlBVbmF2YWlsYWJsZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogRGVjcmVtZW50ZXIgKi8KKwlTVERfRVhDRVBUSU9OKDB4OTAwLCBEZWNyZW1lbnRlciwgdGltZXJfaW50ZXJydXB0KQorCisvKiBDcml0aWNhbCBpbnRlcnJ1cHQgKi8KKwlTVERfRVhDRVBUSU9OKDB4YTAwLCBDcml0aWNhbCwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogU3lzdGVtIENhbGwgKi8KKwlTVERfRVhDRVBUSU9OKDB4YzAwLCBTeXN0ZW1DYWxsLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBUcmFjZSBpbnRlcnJ1cHQgKi8KKwlTVERfRVhDRVBUSU9OKDB4ZDAwLCBUcmFjZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogUGVyZm9ybWFuY2UgTW9uaXRvciBpbnRlcnJ1cHQgKi8KKwlTVERfRVhDRVBUSU9OKDB4ZjAwLCBQZXJmTW9uLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBJbnRydWN0aW9uIFRyYW5zbGF0aW9uIE1pc3MgKi8KKwlTVERfRVhDRVBUSU9OKDB4MTAwMCwgSW5zdHJ1Y3Rpb25UTEJNaXNzLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBEYXRhIExvYWQgVHJhbnNsYXRpb24gTWlzcyAqLworCVNURF9FWENFUFRJT04oMHgxMTAwLCBEYXRhTG9hZFRMQk1pc3MsIFVua25vd25FeGNlcHRpb24pCisKKy8qIERhdGEgU3RvcmUgVHJhbnNsYXRpb24gTWlzcyAqLworCVNURF9FWENFUFRJT04oMHgxMjAwLCBEYXRhU3RvcmVUTEJNaXNzLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBJbnN0cnVjdGlvbiBBZGRyZXNzIEJyZWFrcG9pbnQgKi8KKwlTVERfRVhDRVBUSU9OKDB4MTMwMCwgSW5zdHJ1Y3Rpb25BZGRyQnJlYWtwb2ludCwgRGVidWdFeGNlcHRpb24pCisKKy8qIFN5c3RlbSBNYW5hZ2VtZW50IGludGVycnVwdCAqLworCVNURF9FWENFUFRJT04oMHgxNDAwLCBTeXN0ZW1NZ210SW50ZXJydXB0LCBVbmtub3duRXhjZXB0aW9uKQorCisJLmdsb2JsCV9lbmRfb2ZfdmVjdG9ycworX2VuZF9vZl92ZWN0b3JzOgorCisJLiA9IDB4MzAwMAorYm9vdF9jb2xkOgorCS8qIFNhdmUgbXNyIGNvbnRlbnRzICovCisJbWZtc3IJcjUKKworCS8qIFNldCBJTU1SIGFyZWEgdG8gb3VyIHByZWZlcnJlZCBsb2NhdGlvbiAqLworCWxpcwlyNCwgQ09ORklHX0RFRkFVTFRfSU1NUkBoCisJbGlzCXIzLCBDRkdfSU1NUkBoCisJb3JpCXIzLCByMywgQ0ZHX0lNTVJAbAorCXN0dwlyMywgSU1NUkJBUihyNCkKKwltdHNwcglNQkFSLCByMwkJLyogSU1NUkJBUiBpcyBtaXJyb3JlZCBpbnRvIHRoZSBNQkFSIFNQUiAoMzExKSAqLworCisJLyogSW5pdGlhbGlzZSB0aGUgbWFjaGluZSAqLworCWJsCWNwdV9lYXJseV9pbml0CisKKwkvKgorCSAqIFNldCB1cCBMb2NhbCBBY2Nlc3MgV2luZG93czoKKwkgKgorCSAqIDEpIEJvb3QvQ1MwIChib290IEZMQVNIKQorCSAqIDIpIE9uLWNoaXAgU1JBTSAoaW5pdGlhbCBzdGFjayBwdXJwb3NlcykKKwkgKi8KKworCS8qIEJvb3QgQ1MvQ1MwIHdpbmRvdyByYW5nZSAqLworCWxpcyAgICAgcjMsIENGR19JTU1SQGgKKwlvcmkgICAgIHIzLCByMywgQ0ZHX0lNTVJAbAorCisJbGlzCXI0LCBTVEFSVF9SRUcoQ0ZHX0ZMQVNIX0JBU0UpCisJb3JpCXI0LCByNCwgU1RPUF9SRUcoQ0ZHX0ZMQVNIX0JBU0UsIENGR19GTEFTSF9TSVpFKQorCXN0dwlyNCwgTFBDUzBBVyhyMykKKworCS8qCisJICogVGhlIFNSQU0gd2luZG93IGhhcyBhIGZpeGVkIHNpemUgKDI1NkspLCBzbyBvbmx5IHRoZSBzdGFydCBhZGRyZXNzCisJICogaXMgbmVjZXNzYXJ5CisJICovCisJbGlzIAlyNCwgU1RBUlRfUkVHKENGR19TUkFNX0JBU0UpICYgMHhmZjAwCisJc3R3CXI0LCBTUkFNQkFSKHIzKQorCisJLyoKKwkgKiBBY2NvcmRpbmcgdG8gTVBDNTEyMWUgUk0sIGNvbmZpZ3VyaW5nIGxvY2FsIGFjY2VzcyB3aW5kb3dzIHNob3VsZAorCSAqIGJlIGZvbGxvd2VkIGJ5IGEgZHVtbXkgcmVhZCBvZiB0aGUgY29uZmlnIHJlZ2lzdGVyIHRoYXQgd2FzCisJICogbW9kaWZpZWQgbGFzdCBhbmQgYW4gaXN5bmMKKwkgKi8KKwlsd3oJcjQsIFNSQU1CQVIocjMpCisJaXN5bmMKKworCS8qCisJICogU2V0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIEJvb3QvQ1MwLCB0aGUgU1JBTSB3aW5kb3cgZG9lcyBub3QgaGF2ZSBhCisJICogY29uZmlnIHJlZ2lzdGVyIHNvIG5vIHBhcmFtcyBjYW4gYmUgc2V0IGZvciBpdAorCSAqLworCWxpcyAgICAgcjMsIChDRkdfSU1NUiArIExQQ19PRkZTRVQpQGgKKwlvcmkgICAgIHIzLCByMywgKENGR19JTU1SICsgTFBDX09GRlNFVClAbAorCisJbGlzICAgICByNCwgQ0ZHX0NTMF9DRkdAaAorCW9yaSAgICAgcjQsIHI0LCBDRkdfQ1MwX0NGR0BsCisJc3R3ICAgICByNCwgQ1MwX0NPTkZJRyhyMykKKworCS8qIE1hc3RlciBlbmFibGUgYWxsIENTJ3MgKi8KKwlsaXMJcjQsIENTX0NUUkxfTUVAaAorCW9yaQlyNCwgcjQsIENTX0NUUkxfTUVAbAorCXN0dwlyNCwgQ1NfQ1RSTChyMykKKworCWxpcwlyNCwgKENGR19NT05JVE9SX0JBU0UpQGgKKwlvcmkJcjQsIHI0LCAoQ0ZHX01PTklUT1JfQkFTRSlAbAorCWFkZGkJcjUsIHI0LCBpbl9mbGFzaCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbXRscglyNQorCWJscgorCitpbl9mbGFzaDoKKwlsaXMJcjEsIChDRkdfSU5JVF9SQU1fQUREUiArIENGR19HQkxfREFUQV9PRkZTRVQpQGgKKwlvcmkJcjEsIHIxLCAoQ0ZHX0lOSVRfUkFNX0FERFIgKyBDRkdfR0JMX0RBVEFfT0ZGU0VUKUBsCisKKwlsaQlyMCwgMAkJLyogTWFrZSByb29tIGZvciBzdGFjayBmcmFtZSBoZWFkZXIgYW5kCSovCisJc3R3dQlyMCwgLTQocjEpCS8qIGNsZWFyIGZpbmFsIHN0YWNrIGZyYW1lIHNvIHRoYXQJKi8KKwlzdHd1CXIwLCAtNChyMSkJLyogc3RhY2sgYmFja3RyYWNlcyB0ZXJtaW5hdGUgY2xlYW5seQkqLworCisJLyogbGV0IHRoZSBDLWNvZGUgc2V0IHVwIHRoZSByZXN0CQkJKi8KKwkvKgkJCQkJCQkqLworCS8qIEJlIGNhcmVmdWwgdG8ga2VlcCBjb2RlIHJlbG9jYXRhYmxlICYgc3RhY2sgaHVtYmxlCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJR0VUX0dPVAkJCS8qIGluaXRpYWxpemUgR09UIGFjY2VzcwkqLworCisJLyogcjM6IElNTVIgKi8KKwlsaXMJcjMsIENGR19JTU1SQGgKKwkvKiBydW4gbG93LWxldmVsIENQVSBpbml0IGNvZGUgKGluIEZsYXNoKSAqLworCWJsCWNwdV9pbml0X2YKKworCS8qIHIzOiBCT09URkxBRyAqLworCW1yCXIzLCByMjEKKwkvKiBydW4gMXN0IHBhcnQgb2YgYm9hcmQgaW5pdCBjb2RlIChpbiBGbGFzaCkgKi8KKwlibAlib2FyZF9pbml0X2YKKworCS8qIE5PVFJFQUNIRUQgLSBib2FyZF9pbml0X2YoKSBkb2VzIG5vdCByZXR1cm4gKi8KKworLyoKKyAqIFRoaXMgY29kZSBmaW5pc2hlcyBzYXZpbmcgdGhlIHJlZ2lzdGVycyB0byB0aGUgZXhjZXB0aW9uIGZyYW1lCisgKiBhbmQganVtcHMgdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgZm9yIHRoZSBleGNlcHRpb24uCisgKiBSZWdpc3RlciByMjEgaXMgcG9pbnRlciBpbnRvIHRyYXAgZnJhbWUsIHIxIGhhcyBuZXcgc3RhY2sgcG9pbnRlci4KKyAqLworCS5nbG9ibAl0cmFuc2Zlcl90b19oYW5kbGVyCit0cmFuc2Zlcl90b19oYW5kbGVyOgorCXN0dwlyMjIsX05JUChyMjEpCisJbGlzCXIyMixNU1JfUE9XQGgKKwlhbmRjCXIyMyxyMjMscjIyCisJc3R3CXIyMyxfTVNSKHIyMSkKKwlTQVZFX0dQUig3LCByMjEpCisJU0FWRV80R1BSUyg4LCByMjEpCisJU0FWRV84R1BSUygxMiwgcjIxKQorCVNBVkVfOEdQUlMoMjQsIHIyMSkKKwltZmxyCXIyMworCWFuZGkuCXIyNCxyMjMsMHgzZjAwCQkvKiBnZXQgdmVjdG9yIG9mZnNldCAqLworCXN0dwlyMjQsVFJBUChyMjEpCisJbGkJcjIyLDAKKwlzdHcJcjIyLFJFU1VMVChyMjEpCisJbHd6CXIyNCwwKHIyMykJCS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBoYW5kbGVyICovCisJbHd6CXIyMyw0KHIyMykJCS8qIHdoZXJlIHRvIGdvIHdoZW4gZG9uZSAqLworCW10c3ByCVNSUjAscjI0CisJbXRzcHIJU1JSMSxyMjAKKwltdGxyCXIyMworCVNZTkMKKwlyZmkJCQkJLyoganVtcCB0byBoYW5kbGVyLCBlbmFibGUgTU1VICovCisKK2ludF9yZXR1cm46CisJbWZtc3IJcjI4CQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlsaQlyNCwwCisJb3JpCXI0LHI0LE1TUl9FRQorCWFuZGMJcjI4LHIyOCxyNAorCVNZTkMJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMjgKKwlTWU5DCisJbHd6CXIyLF9DVFIocjEpCisJbHd6CXIwLF9MSU5LKHIxKQorCW10Y3RyCXIyCisJbXRscglyMAorCWx3eglyMixfWEVSKHIxKQorCWx3eglyMCxfQ0NSKHIxKQorCW10c3ByCVhFUixyMgorCW10Y3JmCTB4RkYscjAKKwlSRVNUXzEwR1BSUygzLCByMSkKKwlSRVNUXzEwR1BSUygxMywgcjEpCisJUkVTVF84R1BSUygyMywgcjEpCisJUkVTVF9HUFIoMzEsIHIxKQorCWx3eglyMixfTklQKHIxKQkvKiBSZXN0b3JlIGVudmlyb25tZW50ICovCisJbHd6CXIwLF9NU1IocjEpCisJbXRzcHIJU1JSMCxyMgorCW10c3ByCVNSUjEscjAKKwlsd3oJcjAsR1BSMChyMSkKKwlsd3oJcjIsR1BSMihyMSkKKwlsd3oJcjEsR1BSMShyMSkKKwlTWU5DCisJcmZpCisKKy8qCisgKiBUaGlzIGNvZGUgaW5pdGlhbGlzZXMgdGhlIG1hY2hpbmUsIGl0IGV4cGVjdHMgb3JpZ2luYWwgTVNSIGNvbnRlbnRzIHRvIGJlIGluIHI1LgorICovCitjcHVfZWFybHlfaW5pdDoKKwkvKiBJbml0aWFsaXplIG1hY2hpbmUgc3RhdHVzOyBlbmFibGUgbWFjaGluZSBjaGVjayBpbnRlcnJ1cHQgKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWxpCXIzLCBNU1JfS0VSTkVMCQkJLyogU2V0IE1FIGFuZCBSSSBmbGFncyAqLworCXJsd2ltaQlyMywgcjUsIDAsIDI1LCAyNQkJLyogcHJlc2VydmUgSVAgYml0ICovCisjaWZkZWYgREVCVUcKKwlybHdpbWkJcjMsIHI1LCAwLCAyMSwgMjIJCS8qIGRlYnVnZ2VyIG1pZ2h0IHNldCBTRSwgQkUgYml0cyAqLworI2VuZGlmCisJbXRtc3IJcjMKKwlTWU5DCisJbXRzcHIJU1JSMSwgcjMJCQkvKiBNaXJyb3IgY3VycmVudCBNU1Igc3RhdGUgaW4gU1JSMSAqLworCisJbGlzCXIzLCBDRkdfSU1NUkBoCisKKyNpZiBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKKwkvKiBJbml0aWFsaXNlIHRoZSB3YXRjaGRvZyBhbmQgcmVzZXQgaXQgKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsaXMgcjQsIENGR19XQVRDSERPR19WQUxVRQorCW9yaSByNCwgcjQsIChTV0NSUl9TV0VOIHwgU1dDUlJfU1dSSSB8IFNXQ1JSX1NXUFIpCisJc3R3IHI0LCBTV0NSUihyMykKKworCS8qIHJlc2V0ICovCisJbGkJcjQsIDB4NTU2QworCXN0aAlyNCwgU1dTUlJAbChyMykKKwlsaQlyNCwgMHgwCisJb3JpCXI0LCByNCwgMHhBQTM5CisJc3RoCXI0LCBTV1NSUkBsKHIzKQorI2Vsc2UKKwkvKiBEaXNhYmxlIHRoZSB3YXRjaGRvZyAqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbHd6IHI0LCBTV0NSUihyMykKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiBpdCdzIGVuYWJsZWQgZm9yIGRpc2FibGluZzogb25jZSBkaXNhYmxlZCBieSBzL3cKKwkgKiBpdCdzIG5vdCBwb3NzaWJsZSB0byByZS1lbmFibGUgaXQKKwkgKi8KKwlhbmRpLiByNCwgcjQsIDB4NAorCWJlcSAxZgorCXhvciByNCwgcjQsIHI0CisJc3R3IHI0LCBTV0NSUihyMykKKzE6CisjZW5kaWYgLyogQ09ORklHX1dBVENIRE9HICovCisKKwkvKiBJbml0aWFsaXplIHRoZSBIYXJkd2FyZSBJbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQgUmVnaXN0ZXJzICovCisJLyogSElEMCBhbHNvIGNvbnRhaW5zIGNhY2hlIGNvbnRyb2wJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsaXMJcjMsIENGR19ISUQwX0lOSVRAaAorCW9yaQlyMywgcjMsIENGR19ISUQwX0lOSVRAbAorCVNZTkMKKwltdHNwcglISUQwLCByMworCisJbGlzCXIzLCBDRkdfSElEMF9GSU5BTEBoCisJb3JpCXIzLCByMywgQ0ZHX0hJRDBfRklOQUxAbAorCVNZTkMKKwltdHNwcglISUQwLCByMworCisJbGlzCXIzLCBDRkdfSElEMkBoCisJb3JpCXIzLCByMywgQ0ZHX0hJRDJAbAorCVNZTkMKKwltdHNwcglISUQyLCByMworCXN5bmMKKwlibHIKKworCisvKiBDYWNoZSBmdW5jdGlvbnMuCisgKgorICogTm90ZTogcmVxdWlyZXMgdGhhdCBhbGwgY2FjaGUgYml0cyBpbgorICogSElEMCBhcmUgaW4gdGhlIGxvdyBoYWxmIHdvcmQuCisgKi8KKwkuZ2xvYmwJaWNhY2hlX2VuYWJsZQoraWNhY2hlX2VuYWJsZToKKwltZnNwcglyMywgSElEMAorCW9yaQlyMywgcjMsIEhJRDBfSUNFCisJbGlzCXI0LCAwCisJb3JpCXI0LCByNCwgSElEMF9JTE9DSworCWFuZGMJcjMsIHIzLCByNAorCW9yaQlyNCwgcjMsIEhJRDBfSUNGSQorCWlzeW5jCisJbXRzcHIJSElEMCwgcjQgICAgLyogc2V0cyBlbmFibGUgYW5kIGludmFsaWRhdGUsIGNsZWFycyBsb2NrICovCisJaXN5bmMKKwltdHNwcglISUQwLCByMwkvKiBjbGVhcnMgaW52YWxpZGF0ZSAqLworCWJscgorCisJLmdsb2JsCWljYWNoZV9kaXNhYmxlCitpY2FjaGVfZGlzYWJsZToKKwltZnNwcglyMywgSElEMAorCWxpcwlyNCwgMAorCW9yaQlyNCwgcjQsIEhJRDBfSUNFfEhJRDBfSUxPQ0sKKwlhbmRjCXIzLCByMywgcjQKKwlvcmkJcjQsIHIzLCBISUQwX0lDRkkKKwlpc3luYworCW10c3ByCUhJRDAsIHI0ICAgICAvKiBzZXRzIGludmFsaWRhdGUsIGNsZWFycyBlbmFibGUgYW5kIGxvY2sqLworCWlzeW5jCisJbXRzcHIJSElEMCwgcjMJLyogY2xlYXJzIGludmFsaWRhdGUgKi8KKwlibHIKKworCS5nbG9ibAlpY2FjaGVfc3RhdHVzCitpY2FjaGVfc3RhdHVzOgorCW1mc3ByCXIzLCBISUQwCisJcmx3aW5tCXIzLCByMywgKDMxIC0gSElEMF9JQ0VfU0hJRlQgKyAxKSwgMzEsIDMxCisJYmxyCisKKwkuZ2xvYmwJZGNhY2hlX2VuYWJsZQorZGNhY2hlX2VuYWJsZToKKwltZnNwcglyMywgSElEMAorCWxpCXI1LCBISUQwX0RDRkl8SElEMF9ETE9DSworCWFuZGMJcjMsIHIzLCByNQorCW10c3ByCUhJRDAsIHIzCQkvKiBubyBpbnZhbGlkYXRlLCB1bmxvY2sgKi8KKwlvcmkJcjMsIHIzLCBISUQwX0RDRQorCW9yaQlyNSwgcjMsIEhJRDBfRENGSQorCW10c3ByCUhJRDAsIHI1CQkvKiBlbmFibGUgKyBpbnZhbGlkYXRlICovCisJbXRzcHIJSElEMCwgcjMJCS8qIGVuYWJsZSAqLworCXN5bmMKKwlibHIKKworCS5nbG9ibAlkY2FjaGVfZGlzYWJsZQorZGNhY2hlX2Rpc2FibGU6CisJbWZzcHIJcjMsIEhJRDAKKwlsaXMJcjQsIDAKKwlvcmkJcjQsIHI0LCBISUQwX0RDRXxISUQwX0RMT0NLCisJYW5kYwlyMywgcjMsIHI0CisJb3JpCXI0LCByMywgSElEMF9EQ0kKKwlzeW5jCisJbXRzcHIJSElEMCwgcjQJLyogc2V0cyBpbnZhbGlkYXRlLCBjbGVhcnMgZW5hYmxlIGFuZCBsb2NrICovCisJc3luYworCW10c3ByCUhJRDAsIHIzCS8qIGNsZWFycyBpbnZhbGlkYXRlICovCisJYmxyCisKKwkuZ2xvYmwJZGNhY2hlX3N0YXR1cworZGNhY2hlX3N0YXR1czoKKwltZnNwcglyMywgSElEMAorCXJsd2lubQlyMywgcjMsICgzMSAtIEhJRDBfRENFX1NISUZUICsgMSksIDMxLCAzMQorCWJscgorCisJLmdsb2JsIGdldF9wdnIKK2dldF9wdnI6CisJbWZzcHIJcjMsIFBWUgorCWJscgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEZ1bmN0aW9uOgkgcHBjRGNiZiAqLworLyogRGVzY3JpcHRpb246CSBEYXRhIENhY2hlIGJsb2NrIGZsdXNoICovCisvKiBJbnB1dDoJIHIzID0gZWZmZWN0aXZlIGFkZHJlc3MgKi8KKy8qIE91dHB1dDoJIG5vbmUuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwJcHBjRGNiZgorcHBjRGNiZjoKKwlkY2JmCXIwLHIzCisJYmxyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRnVuY3Rpb246CSBwcGNEY2JpICovCisvKiBEZXNjcmlwdGlvbjoJIERhdGEgQ2FjaGUgYmxvY2sgSW52YWxpZGF0ZSAqLworLyogSW5wdXQ6CSByMyA9IGVmZmVjdGl2ZSBhZGRyZXNzICovCisvKiBPdXRwdXQ6CSBub25lLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsCXBwY0RjYmkKK3BwY0RjYmk6CisJZGNiaQlyMCxyMworCWJscgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJIHBwY0RjYnoKKyAqIERlc2NyaXB0aW9uOgkgRGF0YSBDYWNoZSBibG9jayB6ZXJvLgorICogSW5wdXQ6CSByMyA9IGVmZmVjdGl2ZSBhZGRyZXNzCisgKiBPdXRwdXQ6CSBub25lLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLmdsb2JsCXBwY0RjYnoKK3BwY0RjYno6CisJZGNieglyMCxyMworCWJscgorCisJLmdsb2JsCXBwY0RXc3RvcmUKK3BwY0RXc3RvcmU6CisJbGZkCTEsIDAocjQpCisJc3RmZAkxLCAwKHIzKQorCWJscgorCisJLmdsb2JsCXBwY0RXbG9hZAorcHBjRFdsb2FkOgorCWxmZAkxLCAwKHIzKQorCXN0ZmQJMSwgMChyNCkKKwlibHIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIHZvaWQgcmVsb2NhdGVfY29kZSAoYWRkcl9zcCwgZ2QsIGFkZHJfbW9uaSkKKyAqCisgKiBUaGlzICJmdW5jdGlvbiIgZG9lcyBub3QgcmV0dXJuLCBpbnN0ZWFkIGl0IGNvbnRpbnVlcyBpbiBSQU0KKyAqIGFmdGVyIHJlbG9jYXRpbmcgdGhlIG1vbml0b3IgY29kZS4KKyAqCisgKiByMyA9IGRlc3QKKyAqIHI0ID0gc3JjCisgKiByNSA9IGxlbmd0aCBpbiBieXRlcworICogcjYgPSBjYWNoZWxpbmVzaXplCisgKi8KKwkuZ2xvYmwJcmVsb2NhdGVfY29kZQorcmVsb2NhdGVfY29kZToKKwltcglyMSwgIHIzCQkvKiBTZXQgbmV3IHN0YWNrIHBvaW50ZXIJKi8KKwltcglyOSwgIHI0CQkvKiBTYXZlIGNvcHkgb2YgR2xvYmFsIERhdGEgcG9pbnRlciAqLworCW1yCXIxMCwgcjUJCS8qIFNhdmUgY29weSBvZiBEZXN0aW5hdGlvbiBBZGRyZXNzICovCisKKwltcglyMywgIHI1CQkJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MgKi8KKwlsaXMJcjQsIENGR19NT05JVE9SX0JBU0VAaAkJLyogU291cmNlICAgICAgQWRkcmVzcyAqLworCW9yaQlyNCwgcjQsIENGR19NT05JVE9SX0JBU0VAbAorCWx3eglyNSwgR09UKF9faW5pdF9lbmQpCisJc3ViCXI1LCByNSwgcjQKKwlsaQlyNiwgQ0ZHX0NBQ0hFTElORV9TSVpFCQkvKiBDYWNoZSBMaW5lIFNpemUgKi8KKworCS8qCisJICogRml4IEdPVCBwb2ludGVyOgorCSAqCisJICogTmV3IEdPVC1QVFIgPSAob2xkIEdPVC1QVFIgLSBDRkdfTU9OSVRPUl9CQVNFKQorCSAqCQkrIERlc3RpbmF0aW9uIEFkZHJlc3MKKwkgKgorCSAqIE9mZnNldDoKKwkgKi8KKwlzdWIJcjE1LCByMTAsIHI0CisKKwkvKiBGaXJzdCBvdXIgb3duIEdPVCAqLworCWFkZAlyMTQsIHIxNCwgcjE1CisJLyogdGhlbiB0aGUgb25lIHVzZWQgYnkgdGhlIEMgY29kZSAqLworCWFkZAlyMzAsIHIzMCwgcjE1CisKKwkvKgorCSAqIE5vdyByZWxvY2F0ZSBjb2RlCisJICovCisJY21wbHcJY3IxLHIzLHI0CisJYWRkaQlyMCxyNSwzCisJc3J3aS4JcjAscjAsMgorCWJlcQljcjEsNGYJCS8qIEluIHBsYWNlIGNvcHkgaXMgbm90IG5lY2Vzc2FyeSAqLworCWJlcQk3ZgkJLyogUHJvdGVjdCBhZ2FpbnN0IDAgY291bnQJICAqLworCW10Y3RyCXIwCisJYmdlCWNyMSwyZgorCWxhCXI4LC00KHI0KQorCWxhCXI3LC00KHIzKQorCisJLyogY29weSAqLworMToJbHd6dQlyMCw0KHI4KQorCXN0d3UJcjAsNChyNykKKwliZG56CTFiCisKKwlhZGRpCXIwLHI1LDMKKwlzcndpLglyMCxyMCwyCisJbXRjdHIJcjAKKwlsYQlyOCwtNChyNCkKKwlsYQlyNywtNChyMykKKworCS8qIGFuZCBjb21wYXJlICovCisyMDoJbHd6dQlyMjAsNChyOCkKKwlsd3p1CXIyMSw0KHI3KQorCXhvci4gcjIyLCByMjAsIHIyMQorCWJuZSAgMzBmCisJYmRuegkyMGIKKwliIDRmCisKKwkvKiBjb21wYXJlIGZhaWxlZCAqLworMzA6CWxpIHIzLCAwCisJYmxyCisKKzI6CXNsd2kJcjAscjAsMiAvKiByZSBjb3B5IGluIHJldmVyc2Ugb3JkZXIgLi4uIHkgZG8gd2UgbmVlZGVkIGl0PyAqLworCWFkZAlyOCxyNCxyMAorCWFkZAlyNyxyMyxyMAorMzoJbHd6dQlyMCwtNChyOCkKKwlzdHd1CXIwLC00KHI3KQorCWJkbnoJM2IKKworLyoKKyAqIE5vdyBmbHVzaCB0aGUgY2FjaGU6IG5vdGUgdGhhdCB3ZSBtdXN0IHN0YXJ0IGZyb20gYSBjYWNoZSBhbGlnbmVkCisgKiBhZGRyZXNzLiBPdGhlcndpc2Ugd2UgbWlnaHQgbWlzcyBvbmUgY2FjaGUgbGluZS4KKyAqLworNDoJY21wd2kJcjYsMAorCWFkZAlyNSxyMyxyNQorCWJlcQk3ZgkJLyogQWx3YXlzIGZsdXNoIHByZWZldGNoIHF1ZXVlIGluIGFueSBjYXNlICovCisJc3ViaQlyMCxyNiwxCisJYW5kYwlyMyxyMyxyMAorCW1yCXI0LHIzCis1OglkY2JzdAkwLHI0CisJYWRkCXI0LHI0LHI2CisJY21wbHcJcjQscjUKKwlibHQJNWIKKwlzeW5jCQkJLyogV2FpdCBmb3IgYWxsIGRjYnN0IHRvIGNvbXBsZXRlIG9uIGJ1cyAqLworCW1yCXI0LHIzCis2OglpY2JpCTAscjQKKwlhZGQJcjQscjQscjYKKwljbXBsdwlyNCxyNQorCWJsdAk2YgorNzoJc3luYwkJCS8qIFdhaXQgZm9yIGFsbCBpY2JpIHRvIGNvbXBsZXRlIG9uIGJ1cwkqLworCWlzeW5jCisKKy8qCisgKiBXZSBhcmUgZG9uZS4gRG8gbm90IHJldHVybiwgaW5zdGVhZCBicmFuY2ggdG8gc2Vjb25kIHBhcnQgb2YgYm9hcmQKKyAqIGluaXRpYWxpemF0aW9uLCBub3cgcnVubmluZyBmcm9tIFJBTS4KKyAqLworCWFkZGkJcjAsIHIxMCwgaW5fcmFtIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwltdGxyCXIwCisJYmxyCisKK2luX3JhbToKKwkvKgorCSAqIFJlbG9jYXRpb24gRnVuY3Rpb24sIHIxNCBwb2ludCB0byBnb3QyKzB4ODAwMAorCSAqCisJICogQWRqdXN0IGdvdDIgcG9pbnRlcnMsIG5vIG5lZWQgdG8gY2hlY2sgZm9yIDAsIHRoaXMgY29kZQorCSAqIGFscmVhZHkgcHV0cyBhIGZldyBlbnRyaWVzIGluIHRoZSB0YWJsZS4KKwkgKi8KKwlsaQlyMCxfX2dvdDJfZW50cmllc0BzZWN0b2ZmQGwKKwlsYQlyMyxHT1QoX0dPVDJfVEFCTEVfKQorCWx3eglyMTEsR09UKF9HT1QyX1RBQkxFXykKKwltdGN0cglyMAorCXN1YglyMTEscjMscjExCisJYWRkaQlyMyxyMywtNAorMToJbHd6dQlyMCw0KHIzKQorCWFkZAlyMCxyMCxyMTEKKwlzdHcJcjAsMChyMykKKwliZG56CTFiCisKKwkvKgorCSAqIE5vdyBhZGp1c3QgdGhlIGZpeHVwcyBhbmQgdGhlIHBvaW50ZXJzIHRvIHRoZSBmaXh1cHMKKwkgKiBpbiBjYXNlIHdlIG5lZWQgdG8gbW92ZSBvdXJzZWx2ZXMgYWdhaW4uCisJICovCisyOglsaQlyMCxfX2ZpeHVwX2VudHJpZXNAc2VjdG9mZkBsCisJbHd6CXIzLEdPVChfRklYVVBfVEFCTEVfKQorCWNtcHdpCXIwLDAKKwltdGN0cglyMAorCWFkZGkJcjMscjMsLTQKKwliZXEJNGYKKzM6CWx3enUJcjQsNChyMykKKwlsd3p1eAlyMCxyNCxyMTEKKwlhZGQJcjAscjAscjExCisJc3R3CXIxMCwwKHIzKQorCXN0dwlyMCwwKHI0KQorCWJkbnoJM2IKKzQ6CitjbGVhcl9ic3M6CisJLyoKKwkgKiBOb3cgY2xlYXIgQlNTIHNlZ21lbnQKKwkgKi8KKwlsd3oJcjMsR09UKF9fYnNzX3N0YXJ0KQorCWx3eglyNCxHT1QoX2VuZCkKKworCWNtcGx3CTAsIHIzLCByNAorCWJlcQk2ZgorCisJbGkJcjAsIDAKKzU6CisJc3R3CXIwLCAwKHIzKQorCWFkZGkJcjMsIHIzLCA0CisJY21wbHcJMCwgcjMsIHI0CisJYm5lCTViCis2OgorCW1yCXIzLCByOQkJLyogR2xvYmFsIERhdGEgcG9pbnRlcgkJKi8KKwltcglyNCwgcjEwCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzCQkqLworCWJsCWJvYXJkX2luaXRfcgorCisJLyoKKwkgKiBDb3B5IGV4Y2VwdGlvbiB2ZWN0b3IgY29kZSB0byBsb3cgbWVtb3J5CisJICoKKwkgKiByMzogZGVzdF9hZGRyCisJICogcjc6IHNvdXJjZSBhZGRyZXNzLCByODogZW5kIGFkZHJlc3MsIHI5OiB0YXJnZXQgYWRkcmVzcworCSAqLworCS5nbG9ibAl0cmFwX2luaXQKK3RyYXBfaW5pdDoKKwlsd3oJcjcsIEdPVChfc3RhcnQpCisJbHd6CXI4LCBHT1QoX2VuZF9vZl92ZWN0b3JzKQorCisJbGkJcjksIDB4MTAwCS8qIHJlc2V0IHZlY3RvciBhdCAweDEwMCAqLworCisJY21wbHcJMCwgcjcsIHI4CisJYmdlbHIJCQkvKiByZXR1cm4gaWYgcjc+PXI4IC0ganVzdCBpbiBjYXNlICovCisKKwltZmxyCXI0CQkvKiBzYXZlIGxpbmsgcmVnaXN0ZXIgKi8KKzE6CisJbHd6CXIwLCAwKHI3KQorCXN0dwlyMCwgMChyOSkKKwlhZGRpCXI3LCByNywgNAorCWFkZGkJcjksIHI5LCA0CisJY21wbHcJMCwgcjcsIHI4CisJYm5lCTFiCisKKwkvKgorCSAqIHJlbG9jYXRlIGBoZGxyJyBhbmQgYGludF9yZXR1cm4nIGVudHJpZXMKKwkgKi8KKwlsaQlyNywgLkxfTWFjaGluZUNoZWNrIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgQWxpZ25tZW50IC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKzI6CisJYmwJdHJhcF9yZWxvYworCWFkZGkJcjcsIHI3LCAweDEwMAkJLyogbmV4dCBleGNlcHRpb24gdmVjdG9yICovCisJY21wbHcJMCwgcjcsIHI4CisJYmx0CTJiCisKKwlsaQlyNywgLkxfQWxpZ25tZW50IC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfUHJvZ3JhbUNoZWNrIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfRlBVbmF2YWlsYWJsZSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjgsIFN5c3RlbUNhbGwgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorMzoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IgKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJM2IKKworCWxpCXI3LCAuTF9UcmFjZSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjgsIF9lbmRfb2ZfdmVjdG9ycyAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCis0OgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LCByNywgMHgxMDAJCS8qIG5leHQgZXhjZXB0aW9uIHZlY3RvciAqLworCWNtcGx3CTAsIHI3LCByOAorCWJsdAk0YgorCisJbWZtc3IJcjMJCQkvKiBub3cgdGhhdCB0aGUgdmVjdG9ycyBoYXZlICovCisJbGlzCXI3LCBNU1JfSVBAaAkJLyogcmVsb2NhdGVkIGludG8gbG93IG1lbW9yeSAqLworCW9yaQlyNywgcjcsIE1TUl9JUEBsCS8qIE1TUltJUF0gY2FuIGJlIHR1cm5lZCBvZmYgKi8KKwlhbmRjCXIzLCByMywgcjcJCS8qIChpZiBpdCB3YXMgb24pICovCisJU1lOQwkJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMworCVNZTkMKKworCW10bHIJcjQJCQkvKiByZXN0b3JlIGxpbmsgcmVnaXN0ZXIgICAgKi8KKwlibHIKKworCS8qCisJICogRnVuY3Rpb246IHJlbG9jYXRlIGVudHJpZXMgZm9yIG9uZSBleGNlcHRpb24gdmVjdG9yCisJICovCit0cmFwX3JlbG9jOgorCWx3eglyMCwgMChyNykJCS8qIGhkbHIgLi4uCQkqLworCWFkZAlyMCwgcjAsIHIzCQkvKiAgLi4uICs9IGRlc3RfYWRkcgkqLworCXN0dwlyMCwgMChyNykKKworCWx3eglyMCwgNChyNykJCS8qIGludF9yZXR1cm4gLi4uCSovCisJYWRkCXIwLCByMCwgcjMJCS8qICAuLi4gKz0gZGVzdF9hZGRyCSovCisJc3R3CXIwLCA0KHI3KQorCisJYmxyCmRpZmYgLS1naXQgYS9jcHUvbXBjNTEyeC90cmFwcy5jIGIvY3B1L21wYzUxMngvdHJhcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDU1YzkyCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzUxMngvdHJhcHMuYwpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMCAtIDIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgIEdhcnkgVGhvbWFzIChnZHRAbGludXhwcGMub3JnKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIERlcml2ZWQgZnJvbSB0aGUgTVBDODN4eCBjb2RlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaGFuZGxlcyB0aGUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBwYXJ0cyBvZiBoYXJkd2FyZQorICogZXhjZXB0aW9ucworICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlKHVuc2lnbmVkIGxvbmcpOworCisjZGVmaW5lIEVORF9PRl9NRU0JKGdkLT5iZC0+YmlfbWVtc3RhcnQgKyBnZC0+YmQtPmJpX21lbXNpemUpCisKKy8qCisgKiBUcmFwICYgRXhjZXB0aW9uIHN1cHBvcnQKKyAqLworCit2b2lkCitwcmludF9iYWNrdHJhY2UgKHVuc2lnbmVkIGxvbmcgKnNwKQoreworCWludCBjbnQgPSAwOworCXVuc2lnbmVkIGxvbmcgaTsKKworCXB1dHMgKCJDYWxsIGJhY2t0cmFjZTogIik7CisJd2hpbGUgKHNwKSB7CisJCWlmICgodWludClzcCA+IEVORF9PRl9NRU0pCisJCQlicmVhazsKKworCQlpID0gc3BbMV07CisJCWlmIChjbnQrKyAlIDcgPT0gMCkKKwkJCXB1dGMgKCdcbicpOworCQlwcmludGYgKCIlMDhsWCAiLCBpKTsKKwkJaWYgKGNudCA+IDMyKSBicmVhazsKKwkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSAqc3A7CisJfQorCXB1dGMgKCdcbicpOworfQorCit2b2lkIHNob3dfcmVncyAoc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBpOworCisJcHJpbnRmICgiTklQOiAlMDhsWCBYRVI6ICUwOGxYIExSOiAlMDhsWCBSRUdTOiAlcCBUUkFQOiAlMDRseCBEQVI6ICUwOGxYXG4iLAorCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPnhlciwgcmVncy0+bGluaywgcmVncywgcmVncy0+dHJhcCwgcmVncy0+ZGFyKTsKKwlwcmludGYgKCJNU1I6ICUwOGx4IEVFOiAlMDF4IFBSOiAlMDF4IEZQOiAlMDF4IE1FOiAlMDF4IElSL0RSOiAlMDF4JTAxeFxuIiwKKwkgICAgICAgcmVncy0+bXNyLCByZWdzLT5tc3IgJiBNU1JfRUUgPyAxIDogMCwgcmVncy0+bXNyICYgTVNSX1BSID8gMSA6IDAsCisJICAgICAgIHJlZ3MtPm1zciAmIE1TUl9GUCA/IDEgOiAwLHJlZ3MtPm1zciAmIE1TUl9NRSA/IDEgOiAwLAorCSAgICAgICByZWdzLT5tc3IgJiBNU1JfSVIgPyAxIDogMCwKKwkgICAgICAgcmVncy0+bXNyICYgTVNSX0RSID8gMSA6IDApOworCisJcHV0YyAoJ1xuJyk7CisJZm9yIChpID0gMDsgIGkgPCAzMjsgIGkrKykgeworCQlpZiAoKGkgJSA4KSA9PSAwKSB7CisJCQlwcmludGYgKCJHUFIlMDJkOiAiLCBpKTsKKwkJfQorCisJCXByaW50ZiAoIiUwOGxYICIsIHJlZ3MtPmdwcltpXSk7CisJCWlmICgoaSAlIDgpID09IDcpIHsKKwkJCXB1dGMgKCdcbicpOworCQl9CisJfQorfQorCisKK3ZvaWQKK19leGNlcHRpb24gKGludCBzaWduciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2hvd19yZWdzIChyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UgKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYyAoIkV4Y2VwdGlvbiBhdCBwYyAlbHggc2lnbmFsICVkIiwgcmVncy0+bmlwLHNpZ25yKTsKK30KKworCit2b2lkCitNYWNoaW5lQ2hlY2tFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZml4dXA7CisKKwlpZiAoKGZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZSAocmVncy0+bmlwKSkgIT0gMCkgeworCQlyZWdzLT5uaXAgPSBmaXh1cDsKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIENPTkZJR19DTURfS0dEQgorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisKKwlwdXRzICgiTWFjaGluZSBjaGVjay5cbkNhdXNlZCBieSAoZnJvbSBtc3IpOiAiKTsKKwlwcmludGYgKCJyZWdzICVwICIscmVncyk7CisJc3dpdGNoIChyZWdzLT5tc3IgJiAweDAwRkYwMDAwKSB7CisJY2FzZSAoMHg4MDAwMDAwMCA+PiAxMCk6CisJCXB1dHMgKCJJbnN0cnVjdGlvbiBjYWNoZSBwYXJpdHkgc2lnbmFsXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMCA+PiAxMSk6CisJCXB1dHMgKCJEYXRhIGNhY2hlIHBhcml0eSBzaWduYWxcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwID4+IDEyKToKKwkJcHV0cyAoIk1hY2hpbmUgY2hlY2sgc2lnbmFsXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMCA+PiAxMyk6CisJCXB1dHMgKCJUcmFuc2ZlciBlcnJvciBhY2sgc2lnbmFsXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMCA+PiAxNCk6CisJCXB1dHMgKCJEYXRhIHBhcml0eSBzaWduYWxcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwID4+IDE1KToKKwkJcHV0cyAoIkFkZHJlc3MgcGFyaXR5IHNpZ25hbFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXB1dHMgKCJVbmtub3duIHZhbHVlcyBpbiBtc3JcbiIpOworCX0KKwlzaG93X3JlZ3MgKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSAoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCisJcGFuaWMgKCJtYWNoaW5lIGNoZWNrIik7Cit9CisKK3ZvaWQKK0FsaWdubWVudEV4Y2VwdGlvbiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWZkZWYgQ09ORklHX0NNRF9LR0RCCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKwlzaG93X3JlZ3MgKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSAoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljICgiQWxpZ25tZW50IEV4Y2VwdGlvbiIpOworfQorCit2b2lkCitQcm9ncmFtQ2hlY2tFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmZGVmIENPTkZJR19DTURfS0dEQgorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJc2hvd19yZWdzIChyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UgKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYyAoIlByb2dyYW0gQ2hlY2sgRXhjZXB0aW9uIik7Cit9CisKK3ZvaWQKK1NvZnRFbXVFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmZGVmIENPTkZJR19DTURfS0dEQgorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJc2hvd19yZWdzIChyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UgKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYyAoIlNvZnR3YXJlIEVtdWxhdGlvbiBFeGNlcHRpb24iKTsKK30KKworCit2b2lkCitVbmtub3duRXhjZXB0aW9uIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZmRlZiBDT05GSUdfQ01EX0tHREIKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXByaW50ZiAoIkJhZCB0cmFwIGF0IFBDOiAlbHgsIFNSOiAlbHgsIHZlY3Rvcj0lbHhcbiIsCisJICAgICAgIHJlZ3MtPm5pcCwgcmVncy0+bXNyLCByZWdzLT50cmFwKTsKKwlfZXhjZXB0aW9uICgwLCByZWdzKTsKK30KKworI2lmZGVmIENPTkZJR19DTURfQkVEQlVHCitleHRlcm4gdm9pZCBkb19iZWRidWdfYnJlYWtwb2ludCAoc3RydWN0IHB0X3JlZ3MgKik7CisjZW5kaWYKKwordm9pZAorRGVidWdFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByaW50ZiAoIkRlYnVnZ2VyIHRyYXAgYXQgQCAlbHhcbiIsIHJlZ3MtPm5pcCApOworCXNob3dfcmVncyAocmVncyk7CisjaWZkZWYgQ09ORklHX0NNRF9CRURCVUcKKwlkb19iZWRidWdfYnJlYWtwb2ludCAocmVncyk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHgvY29uZmlnLm1rIGIvY3B1L21wYzV4eC9jb25maWcubWsKaW5kZXggNWIyNmE3Ni4uZTk1YjhhMSAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eC9jb25maWcubWsKKysrIGIvY3B1L21wYzV4eC9jb25maWcubWsKQEAgLTI4LDYgKzI4LDkgQEAKICMKIAogCi1QTEFURk9STV9SRUxGTEFHUyArPSAJLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpCitQTEFURk9STV9SRUxGTEFHUyArPSAJLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpIC1tcmVsb2NhdGFibGUKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0JLURDT05GSUdfNXh4IC1mZml4ZWQtcjIgLWZmaXhlZC1yMjkgLW1wb3dlcnBjIC1tc29mdC1mbG9hdAorCisjIFVzZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQuICBCb2FyZCBwb3J0IGNhbiBvdmVycmlkZSBpbiBib2FyZC8qL2NvbmZpZy5taworTERTQ1JJUFQgOj0gJChTUkNUUkVFKS9jcHUvbXBjNXh4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHgvaW50ZXJydXB0cy5jIGIvY3B1L21wYzV4eC9pbnRlcnJ1cHRzLmMKaW5kZXggN2Y2ZTEzNi4uYTRmNDdjNyAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eC9pbnRlcnJ1cHRzLmMKKysrIGIvY3B1L21wYzV4eC9pbnRlcnJ1cHRzLmMKQEAgLTE3OCw3ICsxNzgsNyBAQAogCXJldHVybjsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBpcnFpbmZvIC0gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgSVJRcwpAQCAtMjA0LDQgKzIwNCw0IEBACiB9CiAKIAotI2VuZGlmICAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbXBjNXh4L3RyYXBzLmMgYi9jcHUvbXBjNXh4L3RyYXBzLmMKaW5kZXggMTRmZDU5ZS4uZDIyYjg5YSAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eC90cmFwcy5jCisrKyBiL2NwdS9tcGM1eHgvdHJhcHMuYwpAQCAtMzYsMTEgKzM2LDExIEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiBpbnQgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikoc3RydWN0IHB0X3JlZ3MgKikgPSAwOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKIGV4dGVybiB2b2lkIGRvX2JlZGJ1Z19icmVha3BvaW50KHN0cnVjdCBwdF9yZWdzICopOwogI2VuZGlmCiAKQEAgLTEzMSw3ICsxMzEsNyBAQAogCQlyZXR1cm47CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTY1LDcgKzE2NSw3IEBACiAgKi8KIHZvaWQgQWxpZ25tZW50RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE3OSw3ICsxNzksNyBAQAogICovCiB2b2lkIFByb2dyYW1DaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xOTMsNyArMTkzLDcgQEAKICAqLwogdm9pZCBTb2Z0RW11RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIwOCw3ICsyMDgsNyBAQAogICovCiB2b2lkIFVua25vd25FeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjI0LDcgKzIyNCw3IEBACiB7CiAJcHJpbnRmKCJEZWJ1Z2dlciB0cmFwIGF0IEAgJWx4XG4iLCByZWdzLT5uaXAgKTsKICAgCXNob3dfcmVncyhyZWdzKTsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKICAgCWRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHgvdS1ib290LmxkcyBiL2NwdS9tcGM1eHgvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDAwMWIxCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzV4eC91LWJvb3QubGRzCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCVdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUKKyAqIChDKSBDb3B5cmlnaHQgMjAwMwlNYXJ0aW4gV2luaXN0b2VyZmVyLCBtYXJ0aW53aW5pc3RvZXJmZXJAZ214LmNoCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0FSQ0gocG93ZXJwYykKK1NFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOworLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQorICAucGx0IDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICA6CisgIHsKKyAgICAvKiBXQVJOSU5HIC0gdGhlIGZvbGxvd2luZyBpcyBoYW5kLW9wdGltaXplZCB0byBmaXQgd2l0aGluCSovCisgICAgLyogdGhlIHNlY3RvciBsYXlvdXQgb2Ygb3VyIGZsYXNoIGNoaXBzIQlYWFggRklYTUUgWFhYCSovCisKKyAgICBjcHUvbXBjNXh4L3N0YXJ0Lm8JKC50ZXh0KQorCisgICAgKigudGV4dCkKKyAgICAqKC5nb3QxKQorICB9CisgIF9ldGV4dCA9IC47CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgOgorICB7CisgICAgKigucm9kYXRhKQorICAgICooLnJvZGF0YTEpCisgICAgKigucm9kYXRhLnN0cjEuNCkKKyAgICAqKC5laF9mcmFtZSkKKyAgfQorICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCisgIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KKyAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQorCisgIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLworICAuID0gKC4gKyAweDAwRkYpICYgMHhGRkZGRkYwMDsKKyAgX2Vyb3RleHQgPSAuOworICBQUk9WSURFIChlcm90ZXh0ID0gLik7CisgIC5yZWxvYyAgIDoKKyAgeworICAgICooLmdvdCkKKyAgICBfR09UMl9UQUJMRV8gPSAuOworICAgICooLmdvdDIpCisgICAgX0ZJWFVQX1RBQkxFXyA9IC47CisgICAgKiguZml4dXApCisgIH0KKyAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4yOworICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pPj4yOworCisgIC5kYXRhICAgIDoKKyAgeworICAgICooLmRhdGEpCisgICAgKiguZGF0YTEpCisgICAgKiguc2RhdGEpCisgICAgKiguc2RhdGEyKQorICAgICooLmR5bmFtaWMpCisgICAgQ09OU1RSVUNUT1JTCisgIH0KKyAgX2VkYXRhICA9ICAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworCisgIC4gPSAuOworICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCisgIC4gPSAuOworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKworICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworLyogICAuID0gZW52X3N0YXJ0OworCS5wcGNlbnYJOgorCXsKKwkJY29tbW9uL2Vudmlyb25tZW50Lm8gKC5wcGNlbnYpCisJfQorKi8KK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L01ha2VmaWxlIGIvY3B1L21wYzV4eHgvTWFrZWZpbGUKaW5kZXggMjM1YWRiNy4uMzEyYjBiZiAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eHgvTWFrZWZpbGUKKysrIGIvY3B1L21wYzV4eHgvTWFrZWZpbGUKQEAgLTI4LDcgKzI4LDcgQEAKIFNUQVJUCT0gc3RhcnQubwogU09CSlMJPSBpby5vIGZpcm13YXJlX3NjX3Rhc2tfYmVzdGNvbW0uaW1wbC5vIGZpcm13YXJlX3NjX3Rhc2suaW1wbC5vCiBDT0JKUwk9IGkyYy5vIHRyYXBzLm8gY3B1Lm8gY3B1X2luaXQubyBmZWMubyBpZGUubyBpbnRlcnJ1cHRzLm8gXAotCSAgbG9hZHRhc2subyBwY2lfbXBjNTIwMC5vIHNlcmlhbC5vIHNwZWVkLm8gdXNiX29oY2kubworCSAgbG9hZHRhc2subyBwY2lfbXBjNTIwMC5vIHNlcmlhbC5vIHNwZWVkLm8gdXNiX29oY2kubyB1c2IubwogCiBTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCiBPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L2NvbmZpZy5tayBiL2NwdS9tcGM1eHh4L2NvbmZpZy5tawppbmRleCBlY2Q5NGU5Li4wZTg2MWM0IDEwMDY0NAotLS0gYS9jcHUvbXBjNXh4eC9jb25maWcubWsKKysrIGIvY3B1L21wYzV4eHgvY29uZmlnLm1rCkBAIC0yMSw3ICsyMSwxMCBAQAogIyBNQSAwMjExMS0xMzA3IFVTQQogIwogCi1QTEFURk9STV9SRUxGTEFHUyArPSAtZlBJQyAtZmZpeGVkLXIxNCAtbWVhYmkKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaSAtbXJlbG9jYXRhYmxlCiAKIFBMQVRGT1JNX0NQUEZMQUdTICs9IC1EQ09ORklHX01QQzV4eHggLWZmaXhlZC1yMiAtZmZpeGVkLXIyOSBcCiAJCSAgICAgLW1zdHJpbmcgLW1jcHU9NjAzZSAtbW11bHRpcGxlCisKKyMgVXNlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIEJvYXJkIHBvcnQgY2FuIG92ZXJyaWRlIGluIGJvYXJkLyovY29uZmlnLm1rCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM1eHh4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L2NwdV9pbml0LmMgYi9jcHUvbXBjNXh4eC9jcHVfaW5pdC5jCmluZGV4IGQ3NDQwMzAuLmJjNjIwMWUgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM1eHh4L2NwdV9pbml0LmMKKysrIGIvY3B1L21wYzV4eHgvY3B1X2luaXQuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAJLyogcm91dGUgY3JpdGljYWwgaW50cyB0byBub3JtYWwgaW50cyAqLwogCSoodnVfbG9uZyAqKU1QQzVYWFhfSUNUTF9FWFQgfD0gMHgwMDAwMDAwMTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTVBDNXh4eF9GRUMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTVBDNXh4eF9GRUMpCiAJLyogbG9hZCBGRUMgbWljcm9jb2RlICovCiAJbG9hZHRhc2soMCwgMik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L2ZlYy5jIGIvY3B1L21wYzV4eHgvZmVjLmMKaW5kZXggM2Q5OWQ1Yy4uMWQzZGE3NyAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eHgvZmVjLmMKKysrIGIvY3B1L21wYzV4eHgvZmVjLmMKQEAgLTE4LDEwICsxOCwxMCBAQAogCiAvKiAjZGVmaW5lIERFQlVHCTB4MjggKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCiAJZGVmaW5lZChDT05GSUdfTVBDNXh4eF9GRUMpCiAKLSNpZiAhKGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSkKKyNpZiAhKGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkpCiAjZXJyb3IgIkNPTkZJR19NSUkgaGFzIHRvIGJlIGRlZmluZWQhIgogI2VuZGlmCiAKQEAgLTg5MCw3ICs4OTAsNyBAQAogCWZlYy0+dGJkQmFzZSA9IChGRUNfVEJEICopRkVDX0JEX0JBU0U7CiAJZmVjLT5yYmRCYXNlID0gKEZFQ19SQkQgKikoRkVDX0JEX0JBU0UgKyBGRUNfVEJEX05VTSAqIHNpemVvZihGRUNfVEJEKSk7CiAjaWYgZGVmaW5lZChDT05GSUdfQ0FOTUIpCQl8fCBcCi0JZGVmaW5lZChDT05GSUdfQ00xX1FQMSkJCXx8IFwKKwlkZWZpbmVkKENPTkZJR19DTTUyMDApCQl8fCBcCiAJZGVmaW5lZChDT05GSUdfSE1JMTAwMSkJCXx8IFwKIAlkZWZpbmVkKENPTkZJR19JQ0VDVUJFKQkJfHwgXAogCWRlZmluZWQoQ09ORklHX0lOS0E0WDApCQl8fCBcCkBAIC05MjQsNyArOTI0LDcgQEAKIAlzcHJpbnRmKGRldi0+bmFtZSwgIkZFQyBFVEhFUk5FVCIpOwogCWV0aF9yZWdpc3RlcihkZXYpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCW1paXBoeV9yZWdpc3RlciAoZGV2LT5uYW1lLAogCQkJZmVjNXh4eF9taWlwaHlfcmVhZCwgZmVjNXh4eF9taWlwaHlfd3JpdGUpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbXBjNXh4eC9pZGUuYyBiL2NwdS9tcGM1eHh4L2lkZS5jCmluZGV4IDI5Yjk5ZjYuLjA4N2RkYWMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM1eHh4L2lkZS5jCisrKyBiL2NwdS9tcGM1eHh4L2lkZS5jCkBAIC0yNCw3ICsyNCw3IEBACiAgKi8KICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmZGVmIENGR19DTURfSURFCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKICNpbmNsdWRlIDxtcGM1eHh4Lmg+CiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwpAQCAtODUsNCArODUsNCBAQAogCiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZiAvKiBDRkdfQ01EX0lERSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbXBjNXh4eC9pbnRlcnJ1cHRzLmMgYi9jcHUvbXBjNXh4eC9pbnRlcnJ1cHRzLmMKaW5kZXggYmVlYjIyMi4uODgxNmRkMSAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eHgvaW50ZXJydXB0cy5jCisrKyBiL2NwdS9tcGM1eHh4L2ludGVycnVwdHMuYwpAQCAtMzEwLDcgKzMxMCw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JUlEpCiB2b2lkIGRvX2lycWluZm8oY21kX3RibF90ICogY21kdHAsIGJkX3QgKiBiZCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJaW50IGlycSwgcmVfZW5hYmxlOwpkaWZmIC0tZ2l0IGEvY3B1L21wYzV4eHgvdHJhcHMuYyBiL2NwdS9tcGM1eHh4L3RyYXBzLmMKaW5kZXggMmVlNzgyYi4uZGFhMWVjNiAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eHgvdHJhcHMuYworKysgYi9jcHUvbXBjNXh4eC90cmFwcy5jCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiBpbnQgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikoc3RydWN0IHB0X3JlZ3MgKikgPSAwOwogI2VuZGlmCiAKQEAgLTEyMyw3ICsxMjMsNyBAQAogCQlyZXR1cm47CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTU4LDcgKzE1OCw3IEBACiB2b2lkCiBBbGlnbm1lbnRFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTcwLDcgKzE3MCw3IEBACiB2b2lkCiBQcm9ncmFtQ2hlY2tFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTgyLDcgKzE4Miw3IEBACiB2b2lkCiBTb2Z0RW11RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE5NSw3ICsxOTUsNyBAQAogdm9pZAogVW5rbm93bkV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yMDQsNyArMjA0LDcgQEAKIAlfZXhjZXB0aW9uKDAsIHJlZ3MpOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiBleHRlcm4gdm9pZCBkb19iZWRidWdfYnJlYWtwb2ludChzdHJ1Y3QgcHRfcmVncyAqKTsKICNlbmRpZgogCkBAIC0yMTQsNyArMjE0LDcgQEAKIAogICBwcmludGYoIkRlYnVnZ2VyIHRyYXAgYXQgQCAlbHhcbiIsIHJlZ3MtPm5pcCApOwogICBzaG93X3JlZ3MocmVncyk7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiAgIGRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L3UtYm9vdC1jdXN0b21sYXlvdXQubGRzIGIvY3B1L21wYzV4eHgvdS1ib290LWN1c3RvbWxheW91dC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwNzk0MwotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM1eHh4L3UtYm9vdC1jdXN0b21sYXlvdXQubGRzCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDQKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0FSQ0gocG93ZXJwYykKK1NFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOworLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQorICAucGx0IDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICA6CisgIHsKKyAgICAvKiBXQVJOSU5HIC0gdGhlIGZvbGxvd2luZyBpcyBoYW5kLW9wdGltaXplZCB0byBmaXQgd2l0aGluICAqLworICAgIC8qIHRoZSBzZWN0b3IgbGF5b3V0IG9mIG91ciBmbGFzaCBjaGlwcyEgICAgWFhYIEZJWE1FIFhYWCAgICovCisKKyAgICBjcHUvbXBjNXh4eC9zdGFydC5vICAgICAgICAgICgudGV4dCkKKyAgICBjcHUvbXBjNXh4eC90cmFwcy5vICAgICAgICAgICgudGV4dCkKKyAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vICAgICAgICAgKC50ZXh0KQorICAgIGxpYl9wcGMvY2FjaGUubyAgICAgICAgICAgICAoLnRleHQpCisgICAgbGliX3BwYy90aW1lLm8gICAgICAgICAgICAgICgudGV4dCkKKworICAgIC4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47CisgICAgY29tbW9uL2Vudmlyb25tZW50Lm8gICAgICAgICgucHBjZW52KQorCisgICAgKigudGV4dCkKKyAgICAqKC5nb3QxKQorICAgIC4gPSBBTElHTigxNik7CisgICAgKigucm9kYXRhKQorICAgICooLnJvZGF0YTEpCisgICAgKigucm9kYXRhLnN0cjEuNCkKKyAgICAqKC5laF9mcmFtZSkKKyAgfQorICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCisgIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KKyAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQorCisgIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLworICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKKyAgX2Vyb3RleHQgPSAuOworICBQUk9WSURFIChlcm90ZXh0ID0gLik7CisgIC5yZWxvYyAgIDoKKyAgeworICAgICooLmdvdCkKKyAgICBfR09UMl9UQUJMRV8gPSAuOworICAgICooLmdvdDIpCisgICAgX0ZJWFVQX1RBQkxFXyA9IC47CisgICAgKiguZml4dXApCisgIH0KKyAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOworCisgIC5kYXRhICAgIDoKKyAgeworICAgICooLmRhdGEpCisgICAgKiguZGF0YTEpCisgICAgKiguc2RhdGEpCisgICAgKiguc2RhdGEyKQorICAgICooLmR5bmFtaWMpCisgICAgQ09OU1RSVUNUT1JTCisgIH0KKyAgX2VkYXRhICA9ICAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworCisgIC4gPSAuOworICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCisgIC4gPSAuOworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2JlZ2luID0gLjsKKyAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9CisgIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQorICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICA6CisgIHsKKyAgICooLnNic3MpICooLnNjb21tb24pCisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgfQorICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworfQpkaWZmIC0tZ2l0IGEvY3B1L21wYzV4eHgvdS1ib290LmxkcyBiL2NwdS9tcGM1eHh4L3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4YTNhZgotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM1eHh4L3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7CisvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgICAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQorICAgICooLnRleHQpCisgICAgKiguZ290MSkKKyAgICAuID0gQUxJR04oMTYpOworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L3VzYi5jIGIvY3B1L21wYzV4eHgvdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3MDlmYwotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM1eHh4L3VzYi5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcKKyAqIE1hcmt1cyBLbG90emJ1ZWNoZXIsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgPG1rQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfTkVXKSAmJiBkZWZpbmVkKENGR19VU0JfT0hDSV9DUFVfSU5JVCkKKworI2luY2x1ZGUgPG1wYzV4eHguaD4KKworaW50IHVzYl9jcHVfaW5pdCgpCit7CisJLyogU2V0IHRoZSBVU0IgQ2xvY2sJCQkJCQkgICAgICovCisJKih2dV9sb25nICopTVBDNVhYWF9DRE1fNDhfRkRDID0gQ09ORklHX1VTQl9DTE9DSzsKKworCS8qIHJlbW92ZSBhbGwgVVNCIGJpdHMgZmlyc3QgYmVmb3JlIE9SaW5nIGluIG91cnMgKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX0dQU19QT1JUX0NPTkZJRyAmPSB+MHgwMDgwNzAwMDsKKworCS8qIEFjdGl2YXRlIFVTQiBwb3J0CQkJCQkJICAgICAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfR1BTX1BPUlRfQ09ORklHIHw9IENPTkZJR19VU0JfQ09ORklHOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JfY3B1X3N0b3AoKQoreworCXJldHVybiAwOworfQorCitpbnQgdXNiX2NwdV9pbml0X2ZhaWwoKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfVVNCX09IQ0kpICYmIGRlZmluZWQoQ0ZHX1VTQl9PSENJX0NQVV9JTklUKSAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyMjAvY29uZmlnLm1rIGIvY3B1L21wYzgyMjAvY29uZmlnLm1rCmluZGV4IDZmZWM1ZGYuLmM0MWNhZmUgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjIwL2NvbmZpZy5taworKysgYi9jcHUvbXBjODIyMC9jb25maWcubWsKQEAgLTIxLDcgKzIxLDEwIEBACiAjIE1BIDAyMTExLTEzMDcgVVNBCiAjCiAKLVBMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaQorUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpIC1tcmVsb2NhdGFibGUKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDODIyMCAtZmZpeGVkLXIyIC1mZml4ZWQtcjI5IFwKIAkJICAgICAtbXN0cmluZyAtbWNwdT02MDNlIC1tbXVsdGlwbGUKKworIyBVc2UgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgQm9hcmQgcG9ydCBjYW4gb3ZlcnJpZGUgaW4gYm9hcmQvKi9jb25maWcubWsKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvY3B1L21wYzgyMjAvdS1ib290LmxkcwpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyMjAvY3B1X2luaXQuYyBiL2NwdS9tcGM4MjIwL2NwdV9pbml0LmMKaW5kZXggM2NmNWY2Ni4uMGRhYWM1YiAxMDA2NDQKLS0tIGEvY3B1L21wYzgyMjAvY3B1X2luaXQuYworKysgYi9jcHUvbXBjODIyMC9jcHVfaW5pdC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkvKiByb3V0ZSBjcml0aWNhbCBpbnRzIHRvIG5vcm1hbCBpbnRzICovCiAJKih2dV9sb25nICopIDB4ZjAwMDA3MTAgfD0gMHgwMDAwMDAwMTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTVBDODIyMF9GRUMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTVBDODIyMF9GRUMpCiAJLyogbG9hZCBGRUMgbWljcm9jb2RlICovCiAJbG9hZHRhc2sgKDAsIDIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbXBjODIyMC9mZWMuYyBiL2NwdS9tcGM4MjIwL2ZlYy5jCmluZGV4IDEyMDFlNzkuLjk5MmUwZmYgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjIwL2ZlYy5jCisrKyBiL2NwdS9tcGM4MjIwL2ZlYy5jCkBAIC0xNSwxMCArMTUsMTAgQEAKICNpbmNsdWRlICJmZWMuaCIKIAogI3VuZGVmICBERUJVRwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCiAgICAgZGVmaW5lZChDT05GSUdfTVBDODIyMF9GRUMpCiAKLSNpZiAhKGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSkKKyNpZiAhKGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkpCiAjZXJyb3IgIkNPTkZJR19NSUkgaGFzIHRvIGJlIGRlZmluZWQhIgogI2VuZGlmCiAKQEAgLTg0Nyw3ICs4NDcsNyBAQAogCXNwcmludGYgKGRldi0+bmFtZSwgIkZFQyBFVEhFUk5FVCIpOwogCWV0aF9yZWdpc3RlciAoZGV2KTsKIAotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKIAltaWlwaHlfcmVnaXN0ZXIgKGRldi0+bmFtZSwKIAkJCWZlYzgyMjBfbWlpcGh5X3JlYWQsIGZlYzgyMjBfbWlpcGh5X3dyaXRlKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyMjAvdHJhcHMuYyBiL2NwdS9tcGM4MjIwL3RyYXBzLmMKaW5kZXggY2RlZTJiZS4uODljY2ExZCAxMDA2NDQKLS0tIGEvY3B1L21wYzgyMjAvdHJhcHMuYworKysgYi9jcHUvbXBjODIyMC90cmFwcy5jCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiBpbnQgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHN0cnVjdCBwdF9yZWdzICopID0gMDsKICNlbmRpZgogCkBAIC0xMTgsNyArMTE4LDcgQEAKIAkJcmVncy0+bmlwID0gZml4dXA7CiAJCXJldHVybjsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIKIAkgICAgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQogCQlyZXR1cm47CkBAIC0xNTIsNyArMTUyLDcgQEAKIAogdm9pZCBBbGlnbm1lbnRFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyCiAJICAgICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpIChyZWdzKSkKIAkJcmV0dXJuOwpAQCAtMTY0LDcgKzE2NCw3IEBACiAKIHZvaWQgUHJvZ3JhbUNoZWNrRXhjZXB0aW9uIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcgogCSAgICAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKSAocmVncykpCiAJCXJldHVybjsKQEAgLTE3Niw3ICsxNzYsNyBAQAogCiB2b2lkIFNvZnRFbXVFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyCiAJICAgICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpIChyZWdzKSkKIAkJcmV0dXJuOwpAQCAtMTg5LDcgKzE4OSw3IEBACiAKIHZvaWQgVW5rbm93bkV4Y2VwdGlvbiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIKIAkgICAgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQogCQlyZXR1cm47CkBAIC0xOTksNyArMTk5LDcgQEAKIAlfZXhjZXB0aW9uICgwLCByZWdzKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQgKHN0cnVjdCBwdF9yZWdzICopOwogI2VuZGlmCiAKQEAgLTIwOCw3ICsyMDgsNyBAQAogCiAJcHJpbnRmICgiRGVidWdnZXIgdHJhcCBhdCBAICVseFxuIiwgcmVncy0+bmlwKTsKIAlzaG93X3JlZ3MgKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogCWRvX2JlZGJ1Z19icmVha3BvaW50IChyZWdzKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyMjAvdS1ib290LmxkcyBiL2NwdS9tcGM4MjIwL3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5OWE2NAotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM4MjIwL3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7CisvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgICAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIGNwdS9tcGM4MjIwL3N0YXJ0Lm8JKC50ZXh0KQorICAgICooLnRleHQpCisgICAgKiguZ290MSkKKyAgICAuID0gQUxJR04oMTYpOworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjR4L2NvbmZpZy5tayBiL2NwdS9tcGM4MjR4L2NvbmZpZy5tawppbmRleCBkYWM2MWQ4Li4xN2ZkYjIxIDEwMDY0NAotLS0gYS9jcHUvbXBjODI0eC9jb25maWcubWsKKysrIGIvY3B1L21wYzgyNHgvY29uZmlnLm1rCkBAIC0yMSw2ICsyMSw5IEBACiAjIE1BIDAyMTExLTEzMDcgVVNBCiAjCiAKLVBMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaSAtZm5vLXN0cmljdC1hbGlhc2luZworUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1tcmVsb2NhdGFibGUKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDODI0WCAtZmZpeGVkLXIyIC1mZml4ZWQtcjI5IC1tc3RyaW5nIC1tY3B1PTYwM2UgLW1zb2Z0LWZsb2F0CisKKyMgVXNlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIEJvYXJkIHBvcnQgY2FuIG92ZXJyaWRlIGluIGJvYXJkLyovY29uZmlnLm1rCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM4MjR4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjR4L3RyYXBzLmMgYi9jcHUvbXBjODI0eC90cmFwcy5jCmluZGV4IDA3MWQwMDMuLjBhNzI0MzAgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjR4L3RyYXBzLmMKKysrIGIvY3B1L21wYzgyNHgvdHJhcHMuYwpAQCAtMTc1LDcgKzE3NSw3IEBACiAJX2V4Y2VwdGlvbigwLCByZWdzKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQoc3RydWN0IHB0X3JlZ3MgKik7CiAjZW5kaWYKIApAQCAtMTg1LDcgKzE4NSw3IEBACiAKICAgcHJpbnRmKCJEZWJ1Z2dlciB0cmFwIGF0IEAgJWx4XG4iLCByZWdzLT5uaXAgKTsKICAgc2hvd19yZWdzKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogICBkb19iZWRidWdfYnJlYWtwb2ludCggcmVncyApOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9jcHUvbXBjODI0eC91LWJvb3QubGRzIGIvY3B1L21wYzgyNHgvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2JlZjRhCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzgyNHgvdS1ib290LmxkcwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMS0yMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/CisgICBfX0RZTkFNSUMgPSAwOyAgICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgY3B1L21wYzgyNHgvc3RhcnQubwkJKC50ZXh0KQorICAgICooLnRleHQpCisgICAgKiguZ290MSkKKyAgICAuID0gQUxJR04oMTYpOworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjYwL2JlZGJ1Z182MDNlLmMgYi9jcHUvbXBjODI2MC9iZWRidWdfNjAzZS5jCmluZGV4IGJlMDljZmIuLmYxYmU0ODUgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjYwL2JlZGJ1Z182MDNlLmMKKysrIGIvY3B1L21wYzgyNjAvYmVkYnVnXzYwM2UuYwpAQCAtMTAsNyArMTAsOCBAQAogI2luY2x1ZGUgPGJlZGJ1Zy9yZWdzLmg+CiAjaW5jbHVkZSA8YmVkYnVnL3BwYy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKSAmJiAoZGVmaW5lZChDT05GSUdfTVBDODI0WCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODI2MCkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykgXAorCSYmIChkZWZpbmVkKENPTkZJR19NUEM4MjRYKSB8fCBkZWZpbmVkKENPTkZJR19NUEM4MjYwKSkKIAogI2RlZmluZSBNQVhfQlJFQUtfUE9JTlRTIDEKIApkaWZmIC0tZ2l0IGEvY3B1L21wYzgyNjAvY29uZmlnLm1rIGIvY3B1L21wYzgyNjAvY29uZmlnLm1rCmluZGV4IGRkN2E3MWYuLmQ0MDFlNGMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjYwL2NvbmZpZy5taworKysgYi9jcHUvbXBjODI2MC9jb25maWcubWsKQEAgLTIxLDcgKzIxLDEwIEBACiAjIE1BIDAyMTExLTEzMDcgVVNBCiAjCiAKLVBMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaQorUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpIC1tcmVsb2NhdGFibGUKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfODI2MCAtRENPTkZJR19DUE0yIC1mZml4ZWQtcjIgLWZmaXhlZC1yMjkgXAogCQkgICAgIC1tc3RyaW5nIC1tY3B1PTYwM2UgLW1tdWx0aXBsZQorCisjIFVzZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQuICBCb2FyZCBwb3J0IGNhbiBvdmVycmlkZSBpbiBib2FyZC8qL2NvbmZpZy5taworTERTQ1JJUFQgOj0gJChTUkNUUkVFKS9jcHUvbXBjODI2MC91LWJvb3QubGRzCmRpZmYgLS1naXQgYS9jcHUvbXBjODI2MC9jcHVfaW5pdC5jIGIvY3B1L21wYzgyNjAvY3B1X2luaXQuYwppbmRleCAzODBkN2FmLi4zNmZjMWViIDEwMDY0NAotLS0gYS9jcHUvbXBjODI2MC9jcHVfaW5pdC5jCisrKyBiL2NwdS9tcGM4MjYwL2NwdV9pbml0LmMKQEAgLTE4Miw3ICsxODIsNyBAQAogI2VuZGlmCiAKIAkvKiBub3cgcmVzdHJpY3QgdG8gcHJlbGltaW5hcnkgcmFuZ2UgKi8KLQkvKiB0aGUgUFMgY2FtZSBmcm9tIHRoZSBIUkNXLCBkb27CtHQgY2hhbmdlIGl0ICovCisJLyogdGhlIFBTIGNhbWUgZnJvbSB0aGUgSFJDVywgZG9utHQgY2hhbmdlIGl0ICovCiAJbWVtY3RsLT5tZW1jX2JyMCA9IFNFVF9WQUxfTUFTSyhtZW1jdGwtPm1lbWNfYnIwICwgQ0ZHX0JSMF9QUkVMSU0sIEJSeF9QU19NU0spOwogCW1lbWN0bC0+bWVtY19vcjAgPSBDRkdfT1IwX1BSRUxJTTsKIApkaWZmIC0tZ2l0IGEvY3B1L21wYzgyNjAvZXRoZXJfZmNjLmMgYi9jcHUvbXBjODI2MC9ldGhlcl9mY2MuYwppbmRleCA1ODRjNDBmLi4zN2JmNDQ1IDEwMDY0NAotLS0gYS9jcHUvbXBjODI2MC9ldGhlcl9mY2MuYworKysgYi9jcHUvbXBjODI2MC9ldGhlcl9mY2MuYwpAQCAtNDcsMTMgKzQ3LDEzIEBACiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8bmV0Lmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAjaW5jbHVkZSA8bWlpcGh5Lmg+CiAjZW5kaWYKIAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgXAorI2lmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykgJiYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgXAogCWRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKIAogc3RhdGljIHN0cnVjdCBldGhlcl9mY2NfaW5mb19zCkBAIC0zOTMsNyArMzkzLDcgQEAKIAogCQlldGhfcmVnaXN0ZXIoZGV2KTsKIAotI2lmIChkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkpIFwKKyNpZiAoZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKSkgXAogCQkmJiBkZWZpbmVkKENPTkZJR19CSVRCQU5HTUlJKQogCQltaWlwaHlfcmVnaXN0ZXIoZGV2LT5uYW1lLAogCQkJCWJiX21paXBoeV9yZWFkLAliYl9taWlwaHlfd3JpdGUpOwpAQCAtMTE4Nyw0ICsxMTg3LDQgQEAKIAogI2VuZGlmIC8qIENPTkZJR19FVEhFUl9MT09QQkFDS19URVNUICovCiAKLSNlbmRpZgkvKiBDT05GSUdfRVRIRVJfT05fRkNDICYmIENGR19DTURfTkVUICYmIENPTkZJR19ORVRfTVVMVEkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyNjAvZXRoZXJfc2NjLmMgYi9jcHUvbXBjODI2MC9ldGhlcl9zY2MuYwppbmRleCBhNzMzYjQ1Li5lNTY4MzlkIDEwMDY0NAotLS0gYS9jcHUvbXBjODI2MC9ldGhlcl9zY2MuYworKysgYi9jcHUvbXBjODI2MC9ldGhlcl9zY2MuYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxjb25maWcuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX1NDQykgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX1NDQykgJiYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogI2lmIChDT05GSUdfRVRIRVJfSU5ERVggPT0gMSkKICMgIGRlZmluZSBQUk9GRl9FTkVUICAgICAgICAgICAgUFJPRkZfU0NDMQpAQCAtMzUzLDQgKzM1Myw0IEBACiB9CiAjZW5kaWYKIAotI2VuZGlmICAvKiBDT05GSUdfRVRIRVJfT05fU0NDICYmIENGR19DTURfTkVUICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjYwL2ludGVycnVwdHMuYyBiL2NwdS9tcGM4MjYwL2ludGVycnVwdHMuYwppbmRleCA1NmU5YTcyLi5iZjBkNGQwIDEwMDY0NAotLS0gYS9jcHUvbXBjODI2MC9pbnRlcnJ1cHRzLmMKKysrIGIvY3B1L21wYzgyNjAvaW50ZXJydXB0cy5jCkBAIC0yNDYsNyArMjQ2LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JUlEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lSUSkKIAogLyogcmlwcGVkIHRoaXMgb3V0IG9mIHBwYzR4eC9pbnRlcnJ1cHRzLmMgKi8KIApAQCAtMjc2LDQgKzI3Niw0IEBACiAJCWVuYWJsZV9pbnRlcnJ1cHRzICgpOwogfQogCi0jZW5kaWYJCQkJCQkJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JUlEgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyNjAva2dkYi5TIGIvY3B1L21wYzgyNjAva2dkYi5TCmluZGV4IDJhMjUwMjQuLmRhZTg3YmIgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjYwL2tnZGIuUworKysgYi9jcHUvbXBjODI2MC9rZ2RiLlMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vbW11Lmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCiAgLyoKICAqIGNhY2hlIGZsdXNoaW5nIHJvdXRpbmVzIGZvciBrZ2RiCkBAIC02OSw0ICs2OSw0IEBACiAJU1lOQwogCWJscgogCi0jZW5kaWYgLyogQ0ZHX0NNRF9LR0RCICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjYwL3RyYXBzLmMgYi9jcHUvbXBjODI2MC90cmFwcy5jCmluZGV4IDBjMzllNDMuLmI1ZDQxNmMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjYwL3RyYXBzLmMKKysrIGIvY3B1L21wYzgyNjAvdHJhcHMuYwpAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vbTgyNjBfcGNpLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogaW50ICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHN0cnVjdCBwdF9yZWdzICopID0gMDsKICNlbmRpZgogCkBAIC0xNTAsNyArMTUwLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE4Niw3ICsxODYsNyBAQAogdm9pZAogQWxpZ25tZW50RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE5OCw3ICsxOTgsNyBAQAogdm9pZAogUHJvZ3JhbUNoZWNrRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIxMCw3ICsyMTAsNyBAQAogdm9pZAogU29mdEVtdUV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yMjMsNyArMjIzLDcgQEAKIHZvaWQKIFVua25vd25FeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjMyLDcgKzIzMiw3IEBACiAJX2V4Y2VwdGlvbigwLCByZWdzKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQoc3RydWN0IHB0X3JlZ3MgKik7CiAjZW5kaWYKIApAQCAtMjQyLDcgKzI0Miw3IEBACiAKICAgcHJpbnRmKCJEZWJ1Z2dlciB0cmFwIGF0IEAgJWx4XG4iLCByZWdzLT5uaXAgKTsKICAgc2hvd19yZWdzKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogICBkb19iZWRidWdfYnJlYWtwb2ludCggcmVncyApOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9jcHUvbXBjODI2MC91LWJvb3QubGRzIGIvY3B1L21wYzgyNjAvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGFiYzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzgyNjAvdS1ib290LmxkcwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMS0yMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/CisgICBfX0RZTkFNSUMgPSAwOyAgICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgY3B1L21wYzgyNjAvc3RhcnQubwkJKC50ZXh0KQorICAgICooLnRleHQpCisgICAgKiguZ290MSkKKyAgICAuID0gQUxJR04oMTYpOworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM4M3h4L01ha2VmaWxlIGIvY3B1L21wYzgzeHgvTWFrZWZpbGUKaW5kZXggYmI5NmY3Ny4uMjMyOTk3MCAxMDA2NDQKLS0tIGEvY3B1L21wYzgzeHgvTWFrZWZpbGUKKysrIGIvY3B1L21wYzgzeHgvTWFrZWZpbGUKQEAgLTI5LDcgKzI5LDcgQEAKIAogU1RBUlQJPSBzdGFydC5vCiBDT0JKUwk9IHRyYXBzLm8gY3B1Lm8gY3B1X2luaXQubyBzcGVlZC5vIGludGVycnVwdHMubyBcCi0JICBzcGRfc2RyYW0ubyBxZV9pby5vIHBjaS5vCisJICBzcGRfc2RyYW0ubyBlY2MubyBxZV9pby5vIHBjaS5vCiAKIFNSQ1MJOj0gJChTVEFSVDoubz0uUykgJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKIE9CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpICQoQ09CSlMpKQpkaWZmIC0tZ2l0IGEvY3B1L21wYzgzeHgvY29uZmlnLm1rIGIvY3B1L21wYzgzeHgvY29uZmlnLm1rCmluZGV4IDhiNGZmOTIuLjJlYzM5NWQgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4M3h4L2NvbmZpZy5taworKysgYi9jcHUvbXBjODN4eC9jb25maWcubWsKQEAgLTIwLDcgKzIwLDEwIEBACiAjIE1BIDAyMTExLTEzMDcgVVNBCiAjCiAKLVBMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaQorUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpIC1tcmVsb2NhdGFibGUKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDODNYWCAtRENPTkZJR19FMzAwIFwKIAkJCS1mZml4ZWQtcjIgLWZmaXhlZC1yMjkgLW1zb2Z0LWZsb2F0CisKKyMgVXNlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIEJvYXJkIHBvcnQgY2FuIG92ZXJyaWRlIGluIGJvYXJkLyovY29uZmlnLm1rCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM4M3h4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2NwdS9tcGM4M3h4L2NwdS5jIGIvY3B1L21wYzgzeHgvY3B1LmMKaW5kZXggODQxZmU4Mi4uYWRmODA4MyAxMDA2NDQKLS0tIGEvY3B1L21wYzgzeHgvY3B1LmMKKysrIGIvY3B1L21wYzgzeHgvY3B1LmMKQEAgLTMzLDggKzMzLDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQogI2luY2x1ZGUgPGZ0X2J1aWxkLmg+Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisjZWxpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCiAjaW5jbHVkZSA8bGliZmR0Lmg+CiAjaW5jbHVkZSA8bGliZmR0X2Vudi5oPgogI2VuZGlmCkBAIC0xMTMsMTIgKzExMiwxNCBAQAogCWNhc2UgU1BSXzgzNjBFX1JFVjExOgogCWNhc2UgU1BSXzgzNjBFX1JFVjEyOgogCWNhc2UgU1BSXzgzNjBFX1JFVjIwOgorCWNhc2UgU1BSXzgzNjBFX1JFVjIxOgogCQlwdXRzKCJNUEM4MzYwRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgU1BSXzgzNjBfUkVWMTA6CiAJY2FzZSBTUFJfODM2MF9SRVYxMToKIAljYXNlIFNQUl84MzYwX1JFVjEyOgogCWNhc2UgU1BSXzgzNjBfUkVWMjA6CisJY2FzZSBTUFJfODM2MF9SRVYyMToKIAkJcHV0cygiTVBDODM2MCwgIik7CiAJCWJyZWFrOwogCWNhc2UgU1BSXzgzMjNFX1JFVjEwOgpAQCAtMTUwLDcgKzE1MSw4IEBACiAJCXB1dHMoIk1QQzgzMTNFLCAiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHV0cygiUmV2OiBVbmtub3duIHJldmlzaW9uIG51bWJlci5cbldhcm5pbmc6IFVuc3VwcG9ydGVkIGNwdSByZXZpc2lvbiFcbiIpOworCQlwcmludGYoIlJldjogVW5rbm93biByZXZpc2lvbiBudW1iZXI6JTA4eFxuIgorCQkJIldhcm5pbmc6IFVuc3VwcG9ydGVkIGNwdSByZXZpc2lvbiFcbiIsc3ByaWRyKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zMjksMTU0ICszMzEsMTY3IEBACiAvKgogICogIlNldHRlciIgZnVuY3Rpb25zIHVzZWQgdG8gYWRkL21vZGlmeSBGRFQgZW50cmllcy4KICAqLwotc3RhdGljIGludCBmZHRfc2V0X2V0aDAodm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSwgYmRfdCAqYmQpCitzdGF0aWMgaW50IGZkdF9zZXRfZXRoMCh2b2lkICpibG9iLCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSwgYmRfdCAqYmQpCiB7CiAJLyoKIAkgKiBGaXggaXQgdXAgaWYgaXQgZXhpc3RzLCBkb24ndCBjcmVhdGUgaXQgaWYgaXQgZG9lc24ndCBleGlzdC4KIAkgKi8KLQlpZiAoZmR0X2dldF9wcm9wZXJ0eShmZHQsIG5vZGVvZmZzZXQsIG5hbWUsIDApKSB7Ci0JCXJldHVybiBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIG5hbWUsIGJkLT5iaV9lbmV0YWRkciwgNik7CisJaWYgKGZkdF9nZXRfcHJvcGVydHkoYmxvYiwgbm9kZW9mZnNldCwgbmFtZSwgMCkpIHsKKwkJcmV0dXJuIGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsIG5hbWUsIGJkLT5iaV9lbmV0YWRkciwgNik7CiAJfQotCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKKwlyZXR1cm4gMDsKIH0KICNpZmRlZiBDT05GSUdfSEFTX0VUSDEKIC8qIHNlY29uZCBvbmJvYXJkIGV0aGVybmV0IHBvcnQgKi8KLXN0YXRpYyBpbnQgZmR0X3NldF9ldGgxKHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsIGJkX3QgKmJkKQorc3RhdGljIGludCBmZHRfc2V0X2V0aDEodm9pZCAqYmxvYiwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsIGJkX3QgKmJkKQogewogCS8qCiAJICogRml4IGl0IHVwIGlmIGl0IGV4aXN0cywgZG9uJ3QgY3JlYXRlIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuCiAJICovCi0JaWYgKGZkdF9nZXRfcHJvcGVydHkoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCAwKSkgewotCQlyZXR1cm4gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCBiZC0+YmlfZW5ldDFhZGRyLCA2KTsKKwlpZiAoZmR0X2dldF9wcm9wZXJ0eShibG9iLCBub2Rlb2Zmc2V0LCBuYW1lLCAwKSkgeworCQlyZXR1cm4gZmR0X3NldHByb3AoYmxvYiwgbm9kZW9mZnNldCwgbmFtZSwgYmQtPmJpX2VuZXQxYWRkciwgNik7CiAJfQotCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogI2lmZGVmIENPTkZJR19IQVNfRVRIMgogLyogdGhpcmQgb25ib2FyZCBldGhlcm5ldCBwb3J0ICovCi1zdGF0aWMgaW50IGZkdF9zZXRfZXRoMih2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBiZF90ICpiZCkKK3N0YXRpYyBpbnQgZmR0X3NldF9ldGgyKHZvaWQgKmJsb2IsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBiZF90ICpiZCkKIHsKIAkvKgogCSAqIEZpeCBpdCB1cCBpZiBpdCBleGlzdHMsIGRvbid0IGNyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0LgogCSAqLwotCWlmIChmZHRfZ2V0X3Byb3BlcnR5KGZkdCwgbm9kZW9mZnNldCwgbmFtZSwgMCkpIHsKLQkJcmV0dXJuIGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgbmFtZSwgYmQtPmJpX2VuZXQyYWRkciwgNik7CisJaWYgKGZkdF9nZXRfcHJvcGVydHkoYmxvYiwgbm9kZW9mZnNldCwgbmFtZSwgMCkpIHsKKwkJcmV0dXJuIGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsIG5hbWUsIGJkLT5iaV9lbmV0MmFkZHIsIDYpOwogCX0KLQlyZXR1cm4gLUZEVF9FUlJfTk9URk9VTkQ7CisJcmV0dXJuIDA7CiB9CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSEFTX0VUSDMKIC8qIGZvdXJ0aCBvbmJvYXJkIGV0aGVybmV0IHBvcnQgKi8KLXN0YXRpYyBpbnQgZmR0X3NldF9ldGgzKHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsIGJkX3QgKmJkKQorc3RhdGljIGludCBmZHRfc2V0X2V0aDModm9pZCAqYmxvYiwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsIGJkX3QgKmJkKQogewogCS8qCiAJICogRml4IGl0IHVwIGlmIGl0IGV4aXN0cywgZG9uJ3QgY3JlYXRlIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuCiAJICovCi0JaWYgKGZkdF9nZXRfcHJvcGVydHkoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCAwKSkgewotCQlyZXR1cm4gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCBiZC0+YmlfZW5ldDNhZGRyLCA2KTsKKwlpZiAoZmR0X2dldF9wcm9wZXJ0eShibG9iLCBub2Rlb2Zmc2V0LCBuYW1lLCAwKSkgeworCQlyZXR1cm4gZmR0X3NldHByb3AoYmxvYiwgbm9kZW9mZnNldCwgbmFtZSwgYmQtPmJpX2VuZXQzYWRkciwgNik7CiAJfQotCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IGZkdF9zZXRfYnVzZnJlcSh2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBiZF90ICpiZCkKK3N0YXRpYyBpbnQgZmR0X3NldF9idXNmcmVxKHZvaWQgKmJsb2IsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBiZF90ICpiZCkKIHsKIAl1MzIgIHRtcDsKIAkvKgogCSAqIENyZWF0ZSBvciB1cGRhdGUgdGhlIHByb3BlcnR5LgogCSAqLwogCXRtcCA9IGNwdV90b19iZTMyKGJkLT5iaV9idXNmcmVxKTsKLQlyZXR1cm4gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCAmdG1wLCBzaXplb2YodG1wKSk7CisJcmV0dXJuIGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsIG5hbWUsICZ0bXAsIHNpemVvZih0bXApKTsKIH0KIAorc3RhdGljIGludCBmZHRfc2V0X3RiZnJlcSh2b2lkICpibG9iLCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSwgYmRfdCAqYmQpCit7CisJdTMyICB0bXA7CisJLyoKKwkgKiBDcmVhdGUgb3IgdXBkYXRlIHRoZSBwcm9wZXJ0eS4KKwkgKi8KKwl0bXAgPSBjcHVfdG9fYmUzMihPRl9UQkNMSyk7CisJcmV0dXJuIGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsIG5hbWUsICZ0bXAsIHNpemVvZih0bXApKTsKK30KKworCiAvKgotICogRml4dXBzIHRvIHRoZSBmZHQuICBJZiAiY3JlYXRlIiBpcyBUUlVFLCB0aGUgbm9kZSBpcyBjcmVhdGVkCi0gKiB1bmNvbmRpdGlvbmFsbHkuICBJZiAiY3JlYXRlIiBpcyBGQUxTRSwgdGhlIG5vZGUgaXMgdXBkYXRlZAotICogb25seSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KKyAqIEZpeHVwcyB0byB0aGUgZmR0LgogICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAljaGFyICpub2RlOwogCWNoYXIgKnByb3A7Ci0JaW50ICgqc2V0X2ZuKSh2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBiZF90ICpiZCk7CisJaW50ICgqc2V0X2ZuKSh2b2lkICpibG9iLCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSwgYmRfdCAqYmQpOwogfSBmaXh1cF9wcm9wc1tdID0gewogCXsJIi9jcHVzLyIgT0ZfQ1BVLAotCQkgImJ1cy1mcmVxdWVuY3kiLAotCQlmZHRfc2V0X2J1c2ZyZXEKKwkJInRpbWViYXNlLWZyZXF1ZW5jeSIsCisJCWZkdF9zZXRfdGJmcmVxCiAJfSwKLQl7CSIvY3B1cy8iIE9GX1NPQywKKwl7CSIvY3B1cy8iIE9GX0NQVSwKIAkJImJ1cy1mcmVxdWVuY3kiLAogCQlmZHRfc2V0X2J1c2ZyZXEKIAl9LAotCXsJIi8iIE9GX1NPQyAiL3NlcmlhbEA0NTAwLyIsCisJewkiL2NwdXMvIiBPRl9DUFUsCiAJCSJjbG9jay1mcmVxdWVuY3kiLAogCQlmZHRfc2V0X2J1c2ZyZXEKIAl9LAotCXsJIi8iIE9GX1NPQyAiL3NlcmlhbEA0NjAwLyIsCisJewkiLyIgT0ZfU09DICIvc2VyaWFsQDQ1MDAiLAorCQkiY2xvY2stZnJlcXVlbmN5IiwKKwkJZmR0X3NldF9idXNmcmVxCisJfSwKKwl7CSIvIiBPRl9TT0MgIi9zZXJpYWxANDYwMCIsCiAJCSJjbG9jay1mcmVxdWVuY3kiLAogCQlmZHRfc2V0X2J1c2ZyZXEKIAl9LAogI2lmZGVmIENPTkZJR19UU0VDMQotCXsJIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI0MDAwLAorCXsJIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI0MDAwIiwKIAkJIm1hYy1hZGRyZXNzIiwKIAkJZmR0X3NldF9ldGgwCiAJfSwKLQl7CSIvIiBPRl9TT0MgIi9ldGhlcm5ldEAyNDAwMCwKKwl7CSIvIiBPRl9TT0MgIi9ldGhlcm5ldEAyNDAwMCIsCiAJCSJsb2NhbC1tYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMAogCX0sCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVFNFQzIKLQl7CSIvIiBPRl9TT0MgIi9ldGhlcm5ldEAyNTAwMCwKKwl7CSIvIiBPRl9TT0MgIi9ldGhlcm5ldEAyNTAwMCIsCiAJCSJtYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMQogCX0sCi0JewkiLyIgT0ZfU09DICIvZXRoZXJuZXRAMjUwMDAsCisJewkiLyIgT0ZfU09DICIvZXRoZXJuZXRAMjUwMDAiLAogCQkibG9jYWwtbWFjLWFkZHJlc3MiLAogCQlmZHRfc2V0X2V0aDEKIAl9LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1VFQ19FVEgxCiAjaWYgQ0ZHX1VFQzFfVUNDX05VTSA9PSAwICAvKiBVQ0MxICovCi0JewkiLyIgT0ZfUUUgIi91Y2NAMjAwMC9tYWMtYWRkcmVzcyIsCisJewkiLyIgT0ZfUUUgIi91Y2NAMjAwMCIsCiAJCSJtYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMAogCX0sCi0JewkiLyIgT0ZfUUUgIi91Y2NAMjAwMC9tYWMtYWRkcmVzcyIsCisJewkiLyIgT0ZfUUUgIi91Y2NAMjAwMCIsCiAJCSJsb2NhbC1tYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMAogCX0sCiAjZWxpZiBDRkdfVUVDMV9VQ0NfTlVNID09IDIgIC8qIFVDQzMgKi8KLQl7CSIvIiBPRl9RRSAiL3VjY0AyMjAwL21hYy1hZGRyZXNzIiwKKwl7CSIvIiBPRl9RRSAiL3VjY0AyMjAwIiwKIAkJIm1hYy1hZGRyZXNzIiwKIAkJZmR0X3NldF9ldGgwCiAJfSwKLQl7CSIvIiBPRl9RRSAiL3VjY0AyMjAwL21hYy1hZGRyZXNzIiwKKwl7CSIvIiBPRl9RRSAiL3VjY0AyMjAwIiwKIAkJImxvY2FsLW1hYy1hZGRyZXNzIiwKIAkJZmR0X3NldF9ldGgwCiAJfSwKICNlbmRpZgotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX1VFQ19FVEgxICovCiAjaWZkZWYgQ09ORklHX1VFQ19FVEgyCiAjaWYgQ0ZHX1VFQzJfVUNDX05VTSA9PSAxICAvKiBVQ0MyICovCi0JewkiLyIgT0ZfUUUgIi91Y2NAMzAwMC9tYWMtYWRkcmVzcyIsCisJewkiLyIgT0ZfUUUgIi91Y2NAMzAwMCIsCiAJCSJtYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMQogCX0sCi0JewkiLyIgT0ZfUUUgIi91Y2NAMzAwMC9tYWMtYWRkcmVzcyIsCisJewkiLyIgT0ZfUUUgIi91Y2NAMzAwMCIsCiAJCSJsb2NhbC1tYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMQogCX0sCiAjZWxpZiBDRkdfVUVDMV9VQ0NfTlVNID09IDMgIC8qIFVDQzQgKi8KLQl7CSIvIiBPRl9RRSAiL3VjY0AzMjAwL21hYy1hZGRyZXNzIiwKKwl7CSIvIiBPRl9RRSAiL3VjY0AzMjAwIiwKIAkJIm1hYy1hZGRyZXNzIiwKIAkJZmR0X3NldF9ldGgxCiAJfSwKLQl7CSIvIiBPRl9RRSAiL3VjY0AzMjAwL21hYy1hZGRyZXNzIiwKKwl7CSIvIiBPRl9RRSAiL3VjY0AzMjAwIiwKIAkJImxvY2FsLW1hYy1hZGRyZXNzIiwKIAkJZmR0X3NldF9ldGgxCiAJfSwKICNlbmRpZgotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX1VFQ19FVEgyICovCiB9OwogCiB2b2lkCkBAIC00ODcsMjAgKzUwMiwyMyBAQAogCWludCAgajsKIAogCWZvciAoaiA9IDA7IGogPCAoc2l6ZW9mKGZpeHVwX3Byb3BzKSAvIHNpemVvZihmaXh1cF9wcm9wc1swXSkpOyBqKyspIHsKLQkJbm9kZW9mZnNldCA9IGZkdF9wYXRoX29mZnNldChmZHQsIGZpeHVwX3Byb3BzW2pdLm5vZGUpOworCQlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKGJsb2IsIGZpeHVwX3Byb3BzW2pdLm5vZGUpOwogCQlpZiAobm9kZW9mZnNldCA+PSAwKSB7Ci0JCQllcnIgPSAoKmZpeHVwX3Byb3BzW2pdLnNldF9mbikoYmxvYiwgbm9kZW9mZnNldCwgZml4dXBfcHJvcHNbal0ucHJvcCwgYmQpOworCQkJZXJyID0gZml4dXBfcHJvcHNbal0uc2V0X2ZuKGJsb2IsIG5vZGVvZmZzZXQsCisJCQkJCQkgICAgZml4dXBfcHJvcHNbal0ucHJvcCwgYmQpOwogCQkJaWYgKGVyciA8IDApCi0JCQkJcHJpbnRmKCJzZXRfZm4vbGliZmR0OiAlcyAlcyByZXR1cm5lZCAlc1xuIiwKKwkJCQlkZWJ1ZygiUHJvYmxlbSBzZXR0aW5nICVzID0gJXM6ICVzXG4iLAogCQkJCQlmaXh1cF9wcm9wc1tqXS5ub2RlLAogCQkJCQlmaXh1cF9wcm9wc1tqXS5wcm9wLAogCQkJCQlmZHRfc3RyZXJyb3IoZXJyKSk7CisJCX0gZWxzZSB7CisJCQlkZWJ1ZygiQ291bGRuJ3QgZmluZCAlczogJXNcbiIsCisJCQkJZml4dXBfcHJvcHNbal0ubm9kZSwKKwkJCQlmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOwogCQl9CiAJfQogfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpCisjZWxpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpCiB2b2lkCiBmdF9jcHVfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCiB7CmRpZmYgLS1naXQgYS9jcHUvbXBjODN4eC9jcHVfaW5pdC5jIGIvY3B1L21wYzgzeHgvY3B1X2luaXQuYwppbmRleCAzYWM5MTYxLi43MjI0OTc5IDEwMDY0NAotLS0gYS9jcHUvbXBjODN4eC9jcHVfaW5pdC5jCisrKyBiL2NwdS9tcGM4M3h4L2NwdV9pbml0LmMKQEAgLTgzLDIwICs4MywzMCBAQAogCWltLT5zeXNjb25mLnNwY3IgPSAoaW0tPnN5c2NvbmYuc3BjciAmIH5TUENSX1RTRUMyRVApIHwgKENGR19TUENSX1RTRUMyRVAgPDwgU1BDUl9UU0VDMkVQX1NISUZUKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX01QQzgzNFgKICNpZmRlZiBDRkdfU0NDUl9UU0VDMUNNCiAJLyogVFNFQzEgY2xvY2sgbW9kZSAqLwogCWltLT5jbGsuc2NjciA9IChpbS0+Y2xrLnNjY3IgJiB+U0NDUl9UU0VDMUNNKSB8IChDRkdfU0NDUl9UU0VDMUNNIDw8IFNDQ1JfVFNFQzFDTV9TSElGVCk7CiAjZW5kaWYKKwogI2lmZGVmIENGR19TQ0NSX1RTRUMyQ00KIAkvKiBUU0VDMiAmIEkyQzEgY2xvY2sgbW9kZSAqLwogCWltLT5jbGsuc2NjciA9IChpbS0+Y2xrLnNjY3IgJiB+U0NDUl9UU0VDMkNNKSB8IChDRkdfU0NDUl9UU0VDMkNNIDw8IFNDQ1JfVFNFQzJDTV9TSElGVCk7CiAjZW5kaWYKKworI2lmZGVmIENGR19TQ0NSX1RTRUMxT04KKwkvKiBUU0VDMSBjbG9jayBzd2l0Y2ggKi8KKwlpbS0+Y2xrLnNjY3IgPSAoaW0tPmNsay5zY2NyICYgflNDQ1JfVFNFQzFPTikgfCAoQ0ZHX1NDQ1JfVFNFQzFPTiA8PCBTQ0NSX1RTRUMxT05fU0hJRlQpOworI2VuZGlmCisKKyNpZmRlZiBDRkdfU0NDUl9UU0VDMk9OCisJLyogVFNFQzIgY2xvY2sgc3dpdGNoICovCisJaW0tPmNsay5zY2NyID0gKGltLT5jbGsuc2NjciAmIH5TQ0NSX1RTRUMyT04pIHwgKENGR19TQ0NSX1RTRUMyT04gPDwgU0NDUl9UU0VDMk9OX1NISUZUKTsKKyNlbmRpZgorCiAjaWZkZWYgQ0ZHX1NDQ1JfVVNCTVBIQ00KIAkvKiBVU0IgTVBIIGNsb2NrIG1vZGUgKi8KIAlpbS0+Y2xrLnNjY3IgPSAoaW0tPmNsay5zY2NyICYgflNDQ1JfVVNCTVBIQ00pIHwgKENGR19TQ0NSX1VTQk1QSENNIDw8IFNDQ1JfVVNCTVBIQ01fU0hJRlQpOwogI2VuZGlmCi0jZW5kaWYgLyogQ09ORklHX01QQzgzNFggKi8KIAogI2lmZGVmIENGR19TQ0NSX1BDSUNNCiAJLyogUENJICYgRE1BIGNsb2NrIG1vZGUgKi8KQEAgLTI0NywzICsyNTcsMzkgQEAKICNlbmRpZgogCXJldHVybiAwOwogfQorCisvKgorICogRmlndXJlIG91dCB0aGUgY2F1c2Ugb2YgdGhlIHJlc2V0CisgKi8KK2ludCBwcnRfODN4eF9yc3Iodm9pZCkKK3sKKwlzdGF0aWMgc3RydWN0IHsKKwkJdWxvbmcgbWFzazsKKwkJY2hhciAqZGVzYzsKKwl9IGJpdHNbXSA9IHsKKwkJeworCQlSU1JfU1dTUiwgIlNvZnR3YXJlIFNvZnQifSwgeworCQlSU1JfU1dIUiwgIlNvZnR3YXJlIEhhcmQifSwgeworCQlSU1JfSlNSUywgIkpUQUcgU29mdCJ9LCB7CisJCVJTUl9DU0hSLCAiQ2hlY2sgU3RvcCJ9LCB7CisJCVJTUl9TV1JTLCAiU29mdHdhcmUgV2F0Y2hkb2cifSwgeworCQlSU1JfQk1SUywgIkJ1cyBNb25pdG9yIn0sIHsKKwkJUlNSX1NSUywgICJFeHRlcm5hbC9JbnRlcm5hbCBTb2Z0In0sIHsKKwkJUlNSX0hSUywgICJFeHRlcm5hbC9JbnRlcm5hbCBIYXJkIn0KKwl9OworCXN0YXRpYyBpbnQgbiA9IHNpemVvZiBiaXRzIC8gc2l6ZW9mIGJpdHNbMF07CisJdWxvbmcgcnNyID0gZ2QtPnJlc2V0X3N0YXR1czsKKwlpbnQgaTsKKwljaGFyICpzZXA7CisKKwlwdXRzKCJSZXNldCBTdGF0dXM6Iik7CisKKwlzZXAgPSAiICI7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJaWYgKHJzciAmIGJpdHNbaV0ubWFzaykgeworCQkJcHJpbnRmKCIlcyVzIiwgc2VwLCBiaXRzW2ldLmRlc2MpOworCQkJc2VwID0gIiwgIjsKKwkJfQorCXB1dHMoIlxuXG4iKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM4M3h4L2VjYy5jIGIvY3B1L21wYzgzeHgvZWNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxMzA5NAotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM4M3h4L2VjYy5jCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KKyAqIGJhc2VkIG9uIHRoZSBjb250cmlidXRpb24gb2YgTWFyaWFuIEJhbGFrb3dpY3ogPG04QHNlbWloYWxmLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4M3h4Lmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfRERSX0VDQykgJiYgZGVmaW5lZChDT05GSUdfRERSX0VDQ19DTUQpCit2b2lkIGVjY19wcmludF9zdGF0dXModm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19JTU1SOworCXZvbGF0aWxlIGRkcjgzeHhfdCAqZGRyID0gJmltbWFwLT5kZHI7CisKKwlwcmludGYoIlxuRUNDIG1vZGU6ICVzXG5cbiIsCisJICAgICAgIChkZHItPnNkcmFtX2NmZyAmIFNEUkFNX0NGR19FQ0NfRU4pID8gIk9OIiA6ICJPRkYiKTsKKworCS8qIEludGVycnVwdHMgKi8KKwlwcmludGYoIk1lbW9yeSBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlOlxuIik7CisJcHJpbnRmKCIgIE11bHRpcGxlLUJpdCBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlOiAlZFxuIiwKKwkgICAgICAgKGRkci0+ZXJyX2ludF9lbiAmIEVDQ19FUlJfSU5UX0VOX01CRUUpID8gMSA6IDApOworCXByaW50ZigiICBTaW5nbGUtQml0IEVycm9yIEludGVycnVwdCBFbmFibGU6ICVkXG4iLAorCSAgICAgICAoZGRyLT5lcnJfaW50X2VuICYgRUNDX0VSUl9JTlRfRU5fU0JFRSkgPyAxIDogMCk7CisJcHJpbnRmKCIgIE1lbW9yeSBTZWxlY3QgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTogJWRcblxuIiwKKwkgICAgICAgKGRkci0+ZXJyX2ludF9lbiAmIEVDQ19FUlJfSU5UX0VOX01TRUUpID8gMSA6IDApOworCisJLyogRXJyb3IgZGlzYWJsZSAqLworCXByaW50ZigiTWVtb3J5IEVycm9yIERpc2FibGU6XG4iKTsKKwlwcmludGYoIiAgTXVsdGlwbGUtQml0IEVycm9yIERpc2FibGU6ICVkXG4iLAorCSAgICAgICAoZGRyLT5lcnJfZGlzYWJsZSAmIEVDQ19FUlJPUl9ESVNBQkxFX01CRUQpID8gMSA6IDApOworCXByaW50ZigiICBTaW5sZS1CaXQgRXJyb3IgRGlzYWJsZTogJWRcbiIsCisJICAgICAgIChkZHItPmVycl9kaXNhYmxlICYgRUNDX0VSUk9SX0RJU0FCTEVfU0JFRCkgPyAxIDogMCk7CisJcHJpbnRmKCIgIE1lbW9yeSBTZWxlY3QgRXJyb3IgRGlzYWJsZTogJWRcblxuIiwKKwkgICAgICAgKGRkci0+ZXJyX2Rpc2FibGUgJiBFQ0NfRVJST1JfRElTQUJMRV9NU0VEKSA/IDEgOiAwKTsKKworCS8qIEVycm9yIGluamVjdGlvbiAqLworCXByaW50ZigiTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBIaWdoL0xvdzogJTA4bHggJTA4bHhcbiIsCisJICAgICAgIGRkci0+ZGF0YV9lcnJfaW5qZWN0X2hpLCBkZHItPmRhdGFfZXJyX2luamVjdF9sbyk7CisKKwlwcmludGYoIk1lbW9yeSBEYXRhIFBhdGggRXJyb3IgSW5qZWN0aW9uIE1hc2sgRUNDOlxuIik7CisJcHJpbnRmKCIgIEVDQyBNaXJyb3IgQnl0ZTogJWRcbiIsCisJICAgICAgIChkZHItPmVjY19lcnJfaW5qZWN0ICYgRUNDX0VSUl9JTkpFQ1RfRU1CKSA/IDEgOiAwKTsKKwlwcmludGYoIiAgRUNDIEluamVjdGlvbiBFbmFibGU6ICVkXG4iLAorCSAgICAgICAoZGRyLT5lY2NfZXJyX2luamVjdCAmIEVDQ19FUlJfSU5KRUNUX0VJRU4pID8gMSA6IDApOworCXByaW50ZigiICBFQ0MgRXJyb3IgSW5qZWN0aW9uIE1hc2s6IDB4JTAyeFxuXG4iLAorCSAgICAgICBkZHItPmVjY19lcnJfaW5qZWN0ICYgRUNDX0VSUl9JTkpFQ1RfRUVJTSk7CisKKwkvKiBTQkUgY291bnRlci90aHJlc2hvbGQgKi8KKwlwcmludGYoIk1lbW9yeSBTaW5nbGUtQml0IEVycm9yIE1hbmFnZW1lbnQgKDAuLjI1NSk6XG4iKTsKKwlwcmludGYoIiAgU2luZ2xlLUJpdCBFcnJvciBUaHJlc2hvbGQ6ICVkXG4iLAorCSAgICAgICAoZGRyLT5lcnJfc2JlICYgRUNDX0VSUk9SX01BTl9TQkVUKSA+PiBFQ0NfRVJST1JfTUFOX1NCRVRfU0hJRlQpOworCXByaW50ZigiICBTaW5nbGUtQml0IEVycm9yIENvdW50ZXI6ICVkXG5cbiIsCisJICAgICAgIChkZHItPmVycl9zYmUgJiBFQ0NfRVJST1JfTUFOX1NCRUMpID4+IEVDQ19FUlJPUl9NQU5fU0JFQ19TSElGVCk7CisKKwkvKiBFcnJvciBkZXRlY3QgKi8KKwlwcmludGYoIk1lbW9yeSBFcnJvciBEZXRlY3Q6XG4iKTsKKwlwcmludGYoIiAgTXVsdGlwbGUgTWVtb3J5IEVycm9yczogJWRcbiIsCisJICAgICAgIChkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX01NRSkgPyAxIDogMCk7CisJcHJpbnRmKCIgIE11bHRpcGxlLUJpdCBFcnJvcjogJWRcbiIsCisJICAgICAgIChkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX01CRSkgPyAxIDogMCk7CisJcHJpbnRmKCIgIFNpbmdsZS1CaXQgRXJyb3I6ICVkXG4iLAorCSAgICAgICAoZGRyLT5lcnJfZGV0ZWN0ICYgRUNDX0VSUk9SX0RFVEVDVF9TQkUpID8gMSA6IDApOworCXByaW50ZigiICBNZW1vcnkgU2VsZWN0IEVycm9yOiAlZFxuXG4iLAorCSAgICAgICAoZGRyLT5lcnJfZGV0ZWN0ICYgRUNDX0VSUk9SX0RFVEVDVF9NU0UpID8gMSA6IDApOworCisJLyogQ2FwdHVyZSBkYXRhICovCisJcHJpbnRmKCJNZW1vcnkgRXJyb3IgQWRkcmVzcyBDYXB0dXJlOiAweCUwOGx4XG4iLCBkZHItPmNhcHR1cmVfYWRkcmVzcyk7CisJcHJpbnRmKCJNZW1vcnkgRGF0YSBQYXRoIFJlYWQgQ2FwdHVyZSBIaWdoL0xvdzogJTA4bHggJTA4bHhcbiIsCisJICAgICAgIGRkci0+Y2FwdHVyZV9kYXRhX2hpLCBkZHItPmNhcHR1cmVfZGF0YV9sbyk7CisJcHJpbnRmKCJNZW1vcnkgRGF0YSBQYXRoIFJlYWQgQ2FwdHVyZSBFQ0M6IDB4JTAyeFxuXG4iLAorCSAgICAgICBkZHItPmNhcHR1cmVfZWNjICYgQ0FQVFVSRV9FQ0NfRUNFKTsKKworCXByaW50ZigiTWVtb3J5IEVycm9yIEF0dHJpYnV0ZXMgQ2FwdHVyZTpcbiIpOworCXByaW50ZigiIERhdGEgQmVhdCBOdW1iZXI6ICVkXG4iLAorCSAgICAgICAoZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX0JOVU0pID4+CisJICAgICAgIEVDQ19DQVBUX0FUVFJfQk5VTV9TSElGVCk7CisJcHJpbnRmKCIgIFRyYW5zYWN0aW9uIFNpemU6ICVkXG4iLAorCSAgICAgICAoZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX1RTSVopID4+CisJICAgICAgIEVDQ19DQVBUX0FUVFJfVFNJWl9TSElGVCk7CisJcHJpbnRmKCIgIFRyYW5zYWN0aW9uIFNvdXJjZTogJWRcbiIsCisJICAgICAgIChkZHItPmNhcHR1cmVfYXR0cmlidXRlcyAmIEVDQ19DQVBUX0FUVFJfVFNSQykgPj4KKwkgICAgICAgRUNDX0NBUFRfQVRUUl9UU1JDX1NISUZUKTsKKwlwcmludGYoIiAgVHJhbnNhY3Rpb24gVHlwZTogJWRcbiIsCisJICAgICAgIChkZHItPmNhcHR1cmVfYXR0cmlidXRlcyAmIEVDQ19DQVBUX0FUVFJfVFRZUCkgPj4KKwkgICAgICAgRUNDX0NBUFRfQVRUUl9UVFlQX1NISUZUKTsKKwlwcmludGYoIiAgRXJyb3IgSW5mb3JtYXRpb24gVmFsaWQ6ICVkXG5cbiIsCisJICAgICAgIGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9WTEQpOworfQorCitpbnQgZG9fZWNjKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19JTU1SOworCXZvbGF0aWxlIGRkcjgzeHhfdCAqZGRyID0gJmltbWFwLT5kZHI7CisJdm9sYXRpbGUgdTMyIHZhbDsKKwl1NjQgKmFkZHI7CisJdTMyIGNvdW50OworCXJlZ2lzdGVyIHU2NCAqaTsKKwl1MzIgcmV0WzJdOworCXUzMiBwYXR0ZXJuWzJdOworCXUzMiB3cml0ZWJhY2tbMl07CisKKwkvKiBUaGUgcGF0dGVybiBpcyB3cml0dGVuIGludG8gbWVtb3J5IHRvIGdlbmVyYXRlIGVycm9yICovCisJcGF0dGVyblswXSA9IDB4ZmVkY2JhOThVTDsKKwlwYXR0ZXJuWzFdID0gMHg3NjU0MzIxMFVMOworCisJLyogQWZ0ZXIgaW5qZWN0aW5nIGVycm9yLCByZS1pbml0aWFsaXplIHRoZSBtZW1vcnkgd2l0aCB0aGUgdmFsdWUgKi8KKwl3cml0ZWJhY2tbMF0gPSAweDAxMjM0NTY3VUw7CisJd3JpdGViYWNrWzFdID0gMHg4OWFiY2RlZlVMOworCisJaWYgKGFyZ2MgPiA0KSB7CisJCXByaW50ZigiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGFyZ2MgPT0gMikgeworCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJzdGF0dXMiKSA9PSAwKSB7CisJCQllY2NfcHJpbnRfc3RhdHVzKCk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImNhcHR1cmVjbGVhciIpID09IDApIHsKKwkJCWRkci0+Y2FwdHVyZV9hZGRyZXNzID0gMDsKKwkJCWRkci0+Y2FwdHVyZV9kYXRhX2hpID0gMDsKKwkJCWRkci0+Y2FwdHVyZV9kYXRhX2xvID0gMDsKKwkJCWRkci0+Y2FwdHVyZV9lY2MgPSAwOworCQkJZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKGFyZ2MgPT0gMykgeworCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJzYmVjbnQiKSA9PSAwKSB7CisJCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxMCk7CisJCQlpZiAodmFsID4gMjU1KSB7CisJCQkJcHJpbnRmKCJJbmNvcnJlY3QgQ291bnRlciB2YWx1ZSwgIgorCQkJCSAgICAgICAic2hvdWxkIGJlIDAuLjI1NVxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCXZhbCA9ICh2YWwgPDwgRUNDX0VSUk9SX01BTl9TQkVDX1NISUZUKTsKKwkJCXZhbCB8PSAoZGRyLT5lcnJfc2JlICYgRUNDX0VSUk9SX01BTl9TQkVUKTsKKworCQkJZGRyLT5lcnJfc2JlID0gdmFsOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJzYmV0aHIiKSA9PSAwKSB7CisJCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxMCk7CisJCQlpZiAodmFsID4gMjU1KSB7CisJCQkJcHJpbnRmKCJJbmNvcnJlY3QgQ291bnRlciB2YWx1ZSwgIgorCQkJCSAgICAgICAic2hvdWxkIGJlIDAuLjI1NVxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCXZhbCA9ICh2YWwgPDwgRUNDX0VSUk9SX01BTl9TQkVUX1NISUZUKTsKKwkJCXZhbCB8PSAoZGRyLT5lcnJfc2JlICYgRUNDX0VSUk9SX01BTl9TQkVDKTsKKworCQkJZGRyLT5lcnJfc2JlID0gdmFsOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJlcnJkaXNhYmxlIikgPT0gMCkgeworCQkJdmFsID0gZGRyLT5lcnJfZGlzYWJsZTsKKworCQkJaWYgKHN0cmNtcChhcmd2WzJdLCAiK3NiZSIpID09IDApIHsKKwkJCQl2YWwgfD0gRUNDX0VSUk9SX0RJU0FCTEVfU0JFRDsKKwkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICIrbWJlIikgPT0gMCkgeworCQkJCXZhbCB8PSBFQ0NfRVJST1JfRElTQUJMRV9NQkVEOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIittc2UiKSA9PSAwKSB7CisJCQkJdmFsIHw9IEVDQ19FUlJPUl9ESVNBQkxFX01TRUQ7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiK2FsbCIpID09IDApIHsKKwkJCQl2YWwgfD0gKEVDQ19FUlJPUl9ESVNBQkxFX1NCRUQgfAorCQkJCQlFQ0NfRVJST1JfRElTQUJMRV9NQkVEIHwKKwkJCQkJRUNDX0VSUk9SX0RJU0FCTEVfTVNFRCk7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiLXNiZSIpID09IDApIHsKKwkJCQl2YWwgJj0gfkVDQ19FUlJPUl9ESVNBQkxFX1NCRUQ7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiLW1iZSIpID09IDApIHsKKwkJCQl2YWwgJj0gfkVDQ19FUlJPUl9ESVNBQkxFX01CRUQ7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiLW1zZSIpID09IDApIHsKKwkJCQl2YWwgJj0gfkVDQ19FUlJPUl9ESVNBQkxFX01TRUQ7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiLWFsbCIpID09IDApIHsKKwkJCQl2YWwgJj0gfihFQ0NfRVJST1JfRElTQUJMRV9TQkVEIHwKKwkJCQkJIEVDQ19FUlJPUl9ESVNBQkxFX01CRUQgfAorCQkJCQkgRUNDX0VSUk9SX0RJU0FCTEVfTVNFRCk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ZigiSW5jb3JyZWN0IGVycl9kaXNhYmxlIGZpZWxkXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKworCQkJZGRyLT5lcnJfZGlzYWJsZSA9IHZhbDsKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaXN5bmMiKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiZXJyZGV0ZWN0Y2xyIikgPT0gMCkgeworCQkJdmFsID0gZGRyLT5lcnJfZGV0ZWN0OworCisJCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJtbWUiKSA9PSAwKSB7CisJCQkJdmFsIHw9IEVDQ19FUlJPUl9ERVRFQ1RfTU1FOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgInNiZSIpID09IDApIHsKKwkJCQl2YWwgfD0gRUNDX0VSUk9SX0RFVEVDVF9TQkU7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAibWJlIikgPT0gMCkgeworCQkJCXZhbCB8PSBFQ0NfRVJST1JfREVURUNUX01CRTsKKwkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJtc2UiKSA9PSAwKSB7CisJCQkJdmFsIHw9IEVDQ19FUlJPUl9ERVRFQ1RfTVNFOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgImFsbCIpID09IDApIHsKKwkJCQl2YWwgfD0gKEVDQ19FUlJPUl9ERVRFQ1RfTU1FIHwKKwkJCQkJRUNDX0VSUk9SX0RFVEVDVF9NQkUgfAorCQkJCQlFQ0NfRVJST1JfREVURUNUX1NCRSB8CisJCQkJCUVDQ19FUlJPUl9ERVRFQ1RfTVNFKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKCJJbmNvcnJlY3QgZXJyX2RldGVjdCBmaWVsZFxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCWRkci0+ZXJyX2RldGVjdCA9IHZhbDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiaW5qZWN0ZGF0YWhpIikgPT0gMCkgeworCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOworCisJCQlkZHItPmRhdGFfZXJyX2luamVjdF9oaSA9IHZhbDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiaW5qZWN0ZGF0YWxvIikgPT0gMCkgeworCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOworCisJCQlkZHItPmRhdGFfZXJyX2luamVjdF9sbyA9IHZhbDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiaW5qZWN0ZWNjIikgPT0gMCkgeworCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOworCQkJaWYgKHZhbCA+IDB4ZmYpIHsKKwkJCQlwcmludGYoIkluY29ycmVjdCBFQ0MgaW5qZWN0IG1hc2ssICIKKwkJCQkgICAgICAgInNob3VsZCBiZSAweDAwLi4weGZmXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCXZhbCB8PSAoZGRyLT5lY2NfZXJyX2luamVjdCAmIH5FQ0NfRVJSX0lOSkVDVF9FRUlNKTsKKworCQkJZGRyLT5lY2NfZXJyX2luamVjdCA9IHZhbDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiaW5qZWN0IikgPT0gMCkgeworCQkJdmFsID0gZGRyLT5lY2NfZXJyX2luamVjdDsKKworCQkJaWYgKHN0cmNtcChhcmd2WzJdLCAiZW4iKSA9PSAwKQorCQkJCXZhbCB8PSBFQ0NfRVJSX0lOSkVDVF9FSUVOOworCQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJkaXMiKSA9PSAwKQorCQkJCXZhbCAmPSB+RUNDX0VSUl9JTkpFQ1RfRUlFTjsKKwkJCWVsc2UKKwkJCQlwcmludGYoIkluY29ycmVjdCBjb21tYW5kXG4iKTsKKworCQkJZGRyLT5lY2NfZXJyX2luamVjdCA9IHZhbDsKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaXN5bmMiKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAibWlycm9yIikgPT0gMCkgeworCQkJdmFsID0gZGRyLT5lY2NfZXJyX2luamVjdDsKKworCQkJaWYgKHN0cmNtcChhcmd2WzJdLCAiZW4iKSA9PSAwKQorCQkJCXZhbCB8PSBFQ0NfRVJSX0lOSkVDVF9FTUI7CisJCQllbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgImRpcyIpID09IDApCisJCQkJdmFsICY9IH5FQ0NfRVJSX0lOSkVDVF9FTUI7CisJCQllbHNlCisJCQkJcHJpbnRmKCJJbmNvcnJlY3QgY29tbWFuZFxuIik7CisKKwkJCWRkci0+ZWNjX2Vycl9pbmplY3QgPSB2YWw7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoYXJnYyA9PSA0KSB7CisJCWlmIChzdHJjbXAoYXJndlsxXSwgInRlc3RkdyIpID09IDApIHsKKwkJCWFkZHIgPSAodTY0ICopIHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKwkJCWNvdW50ID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCisJCQlpZiAoKHUzMikgYWRkciAlIDgpIHsKKwkJCQlwcmludGYoIkFkZHJlc3Mgbm90IGFsbGlnbmVkIG9uICIKKwkJCQkgICAgICAgImRvdWJsZSB3b3JkIGJvdW5kYXJ5XG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWRpc2FibGVfaW50ZXJydXB0cygpOworCisJCQlmb3IgKGkgPSBhZGRyOyBpIDwgYWRkciArIGNvdW50OyBpKyspIHsKKworCQkJCS8qIGVuYWJsZSBpbmplY3RzICovCisJCQkJZGRyLT5lY2NfZXJyX2luamVjdCB8PSBFQ0NfRVJSX0lOSkVDVF9FSUVOOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImlzeW5jIik7CisKKwkJCQkvKiB3cml0ZSBtZW1vcnkgbG9jYXRpb24gaW5qZWN0aW5nIGVycm9ycyAqLworCQkJCXBwY0RXc3RvcmUoKHUzMiAqKSBpLCBwYXR0ZXJuKTsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCisJCQkJLyogZGlzYWJsZSBpbmplY3RzICovCisJCQkJZGRyLT5lY2NfZXJyX2luamVjdCAmPSB+RUNDX0VSUl9JTkpFQ1RfRUlFTjsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpc3luYyIpOworCisJCQkJLyogcmVhZCBkYXRhLCB0aGlzIGdlbmVyYXRlcyBFQ0MgZXJyb3IgKi8KKwkJCQlwcGNEV2xvYWQoKHUzMiAqKSBpLCByZXQpOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisKKwkJCQkvKiByZS1pbml0aWFsaXplIG1lbW9yeSwgZG91YmxlIHdvcmQgd3JpdGUgdGhlIGxvY2F0aW9uIGFnYWluLAorCQkJCSAqIGdlbmVyYXRlcyBuZXcgRUNDIGNvZGUgdGhpcyB0aW1lICovCisJCQkJcHBjRFdzdG9yZSgodTMyICopIGksIHdyaXRlYmFjayk7CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKKwkJCX0KKwkJCWVuYWJsZV9pbnRlcnJ1cHRzKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJ0ZXN0d29yZCIpID09IDApIHsKKwkJCWFkZHIgPSAodTY0ICopIHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKwkJCWNvdW50ID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCisJCQlpZiAoKHUzMikgYWRkciAlIDgpIHsKKwkJCQlwcmludGYoIkFkZHJlc3Mgbm90IGFsbGlnbmVkIG9uICIKKwkJCQkgICAgICAgImRvdWJsZSB3b3JkIGJvdW5kYXJ5XG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWRpc2FibGVfaW50ZXJydXB0cygpOworCisJCQlmb3IgKGkgPSBhZGRyOyBpIDwgYWRkciArIGNvdW50OyBpKyspIHsKKworCQkJCS8qIGVuYWJsZSBpbmplY3RzICovCisJCQkJZGRyLT5lY2NfZXJyX2luamVjdCB8PSBFQ0NfRVJSX0lOSkVDVF9FSUVOOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImlzeW5jIik7CisKKwkJCQkvKiB3cml0ZSBtZW1vcnkgbG9jYXRpb24gaW5qZWN0aW5nIGVycm9ycyAqLworCQkJCSoodTMyICopIGkgPSAweGZlZGNiYTk4VUw7CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKKworCQkJCS8qIHN1YiBkb3VibGUgd29yZCB3cml0ZSwKKwkJCQkgKiBidXMgd2lsbCByZWFkLW1vZGlmeS13cml0ZSwKKwkJCQkgKiBnZW5lcmF0ZXMgRUNDIGVycm9yICovCisJCQkJKigodTMyICopIGkgKyAxKSA9IDB4NzY1NDMyMTBVTDsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCisJCQkJLyogZGlzYWJsZSBpbmplY3RzICovCisJCQkJZGRyLT5lY2NfZXJyX2luamVjdCAmPSB+RUNDX0VSUl9JTkpFQ1RfRUlFTjsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpc3luYyIpOworCisJCQkJLyogcmUtaW5pdGlhbGl6ZSBtZW1vcnksCisJCQkJICogZG91YmxlIHdvcmQgd3JpdGUgdGhlIGxvY2F0aW9uIGFnYWluLAorCQkJCSAqIGdlbmVyYXRlcyBuZXcgRUNDIGNvZGUgdGhpcyB0aW1lICovCisJCQkJcHBjRFdzdG9yZSgodTMyICopIGksIHdyaXRlYmFjayk7CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKKwkJCX0KKwkJCWVuYWJsZV9pbnRlcnJ1cHRzKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlwcmludGYoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisJcmV0dXJuIDE7Cit9CisKK1VfQk9PVF9DTUQoZWNjLCA0LCAwLCBkb19lY2MsCisJICAgImVjYyAgICAgLSBzdXBwb3J0IGZvciBERFIgRUNDIGZlYXR1cmVzXG4iLAorCSAgICJzdGF0dXMgICAgICAgICAgICAgIC0gcHJpbnQgb3V0IHN0YXR1cyBpbmZvXG4iCisJICAgImVjYyBjYXB0dXJlY2xlYXIgICAgICAgIC0gY2xlYXIgY2FwdHVyZSByZWdzIGRhdGFcbiIKKwkgICAiZWNjIHNiZWNudCA8dmFsPiAgICAgICAgLSBzZXQgU2luZ2xlLUJpdCBFcnJvciBjb3VudGVyXG4iCisJICAgImVjYyBzYmV0aHIgPHZhbD4gICAgICAgIC0gc2V0IFNpbmdsZS1CaXQgVGhyZXNob2xkXG4iCisJICAgImVjYyBlcnJkaXNhYmxlIDxmbGFnPiAgIC0gY2xlYXIvc2V0IGRpc2FibGUgTWVtb3J5IEVycm9yIERpc2FibGUsIGZsYWc6XG4iCisJICAgIiAgWy18K11zYmUgLSBTaW5nbGUtQml0IEVycm9yXG4iCisJICAgIiAgWy18K11tYmUgLSBNdWx0aXBsZS1CaXQgRXJyb3JcbiIKKwkgICAiICBbLXwrXW1zZSAtIE1lbW9yeSBTZWxlY3QgRXJyb3JcbiIKKwkgICAiICBbLXwrXWFsbCAtIGFsbCBlcnJvcnNcbiIKKwkgICAiZWNjIGVycmRldGVjdGNsciA8ZmxhZz4gLSBjbGVhciBNZW1vcnkgRXJyb3IgRGV0ZWN0LCBmbGFnOlxuIgorCSAgICIgIG1tZSAtIE11bHRpcGxlIE1lbW9yeSBFcnJvcnNcbiIKKwkgICAiICBzYmUgLSBTaW5nbGUtQml0IEVycm9yXG4iCisJICAgIiAgbWJlIC0gTXVsdGlwbGUtQml0IEVycm9yXG4iCisJICAgIiAgbXNlIC0gTWVtb3J5IFNlbGVjdCBFcnJvclxuIgorCSAgICIgIGFsbCAtIGFsbCBlcnJvcnNcbiIKKwkgICAiZWNjIGluamVjdGRhdGFoaSA8aGk+ICAtIHNldCBNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIEhpZ2hcbiIKKwkgICAiZWNjIGluamVjdGRhdGFsbyA8bG8+ICAtIHNldCBNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIExvd1xuIgorCSAgICJlY2MgaW5qZWN0ZWNjIDxlY2M+ICAgIC0gc2V0IEVDQyBFcnJvciBJbmplY3Rpb24gTWFza1xuIgorCSAgICJlY2MgaW5qZWN0IDxlbnxkaXM+ICAgIC0gZW5hYmxlL2Rpc2FibGUgZXJyb3IgaW5qZWN0aW9uXG4iCisJICAgImVjYyBtaXJyb3IgPGVufGRpcz4gICAgLSBlbmFibGUvZGlzYWJsZSBtaXJyb3IgYnl0ZVxuIgorCSAgICJlY2MgdGVzdGR3IDxhZGRyPiA8Y250PiAgLSB0ZXN0IG1lbSByZWdpb24gd2l0aCBkb3VibGUgd29yZCBhY2Nlc3M6XG4iCisJICAgIiAgLSBlbmFibGVzIGluamVjdHNcbiIKKwkgICAiICAtIHdyaXRlcyBwYXR0ZXJuIGluamVjdGluZyBlcnJvcnMgd2l0aCBkb3VibGUgd29yZCBhY2Nlc3NcbiIKKwkgICAiICAtIGRpc2FibGVzIGluamVjdHNcbiIKKwkgICAiICAtIHJlYWRzIHBhdHRlcm4gYmFjayB3aXRoIGRvdWJsZSB3b3JkIGFjY2VzcywgZ2VuZXJhdGVzIGVycm9yXG4iCisJICAgIiAgLSByZS1pbml0cyBtZW1vcnlcbiIKKwkgICAiZWNjIHRlc3R3b3JkIDxhZGRyPiA8Y250PiAgLSB0ZXN0IG1lbSByZWdpb24gd2l0aCB3b3JkIGFjY2VzczpcbiIKKwkgICAiICAtIGVuYWJsZXMgaW5qZWN0c1xuIgorCSAgICIgIC0gd3JpdGVzIHBhdHRlcm4gaW5qZWN0aW5nIGVycm9ycyB3aXRoIHdvcmQgYWNjZXNzXG4iCisJICAgIiAgLSB3cml0ZXMgcGF0dGVybiB3aXRoIHdvcmQgYWNjZXNzLCBnZW5lcmF0ZXMgZXJyb3JcbiIKKwkgICAiICAtIGRpc2FibGVzIGluamVjdHNcbiIgIiAgLSByZS1pbml0cyBtZW1vcnkiKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzgzeHgvaW50ZXJydXB0cy5jIGIvY3B1L21wYzgzeHgvaW50ZXJydXB0cy5jCmluZGV4IGJiMWZlMWEuLjk4ZWQyMWMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4M3h4L2ludGVycnVwdHMuYworKysgYi9jcHUvbXBjODN4eC9pbnRlcnJ1cHRzLmMKQEAgLTgxLDcgKzgxLDcgQEAKIH0KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JUlEpCiAKIC8qIHJpcHBlZCB0aGlzIG91dCBvZiBwcGM0eHgvaW50ZXJydXB0cy5jICovCiAKQEAgLTk0LDQgKzk0LDQgQEAKIHsKIH0KIAotI2VuZGlmCQkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbXBjODN4eC9wY2kuYyBiL2NwdS9tcGM4M3h4L3BjaS5jCmluZGV4IDc4NWQ2MTIuLjIyOTgyMTggMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4M3h4L3BjaS5jCisrKyBiL2NwdS9tcGM4M3h4L3BjaS5jCkBAIC0yNSw3ICsyNSwxNCBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8cGNpLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisjaW5jbHVkZSA8bGliZmR0Lmg+CisjaW5jbHVkZSA8bGliZmR0X2Vudi5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQogI2luY2x1ZGUgPGZ0X2J1aWxkLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPGFzbS9tcGM4MzQ5X3BjaS5oPgogCiAjaWZkZWYgQ09ORklHXzgzWFhfR0VORVJJQ19QQ0kKQEAgLTE2Myw3ICsxNzAsMzQgQEAKIAkJcGNpX2luaXRfYnVzKGksIHJlZ1tpXSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfT0ZfRkxBVF9UUkVFCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQordm9pZCBmdF9wY2lfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCit7CisJaW50IG5vZGVvZmZzZXQ7CisJaW50IGVycjsKKwlpbnQgdG1wWzJdOworCisJaWYgKHBjaV9udW1fYnVzZXMgPCAxKQorCQlyZXR1cm47CisKKwlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKGJsb2IsICIvIiBPRl9TT0MgIi9wY2lAODUwMCIpOworCWlmIChub2Rlb2Zmc2V0ID49IDApIHsKKwkJdG1wWzBdID0gY3B1X3RvX2JlMzIocGNpX2hvc2VbMF0uZmlyc3RfYnVzbm8pOworCQl0bXBbMV0gPSBjcHVfdG9fYmUzMihwY2lfaG9zZVswXS5sYXN0X2J1c25vKTsKKwkJZXJyID0gZmR0X3NldHByb3AoYmxvYiwgbm9kZW9mZnNldCwgImJ1cy1yYW5nZSIsIHRtcCwgc2l6ZW9mKHRtcCkpOworCX0KKworCWlmIChwY2lfbnVtX2J1c2VzIDwgMikKKwkJcmV0dXJuOworCisJbm9kZW9mZnNldCA9IGZkdF9maW5kX25vZGVfYnlfcGF0aChibG9iLCAiLyIgT0ZfU09DICIvcGNpQDg2MDAiKTsKKwlpZiAobm9kZW9mZnNldCA+PSAwKSB7CisJCXRtcFswXSA9IGNwdV90b19iZTMyKHBjaV9ob3NlWzBdLmZpcnN0X2J1c25vKTsKKwkJdG1wWzFdID0gY3B1X3RvX2JlMzIocGNpX2hvc2VbMF0ubGFzdF9idXNubyk7CisJCWVyciA9IGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsICJidXMtcmFuZ2UiLCB0bXAsIHNpemVvZih0bXApKTsKKwl9Cit9CisjZWxpZiBDT05GSUdfT0ZfRkxBVF9UUkVFCiB2b2lkIGZ0X3BjaV9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCkKIHsKIAl1MzIgKnA7CmRpZmYgLS1naXQgYS9jcHUvbXBjODN4eC9zcGRfc2RyYW0uYyBiL2NwdS9tcGM4M3h4L3NwZF9zZHJhbS5jCmluZGV4IDY0NzgxM2YuLjU0ZjBjODMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4M3h4L3NwZF9zZHJhbS5jCisrKyBiL2NwdS9tcGM4M3h4L3NwZF9zZHJhbS5jCkBAIC01NzQsNyArNTc0LDEwIEBACiAKIAkvKiBDaGVjayBESU1NIGRhdGEgYnVzIHdpZHRoICovCiAJaWYgKHNwZC5kYXRhd19sc2IgPT0gMHgyMCkgewotCQlidXJzdGxlbiA9IDB4MDM7IC8qIDMyIGJpdCBkYXRhIGJ1cywgYnVyc3QgbGVuIGlzIDggKi8KKwkJaWYgKHNwZC5tZW1fdHlwZSA9PSBTUERfTUVNVFlQRV9ERFIpCisJCQlidXJzdGxlbiA9IDB4MDM7IC8qIDMyIGJpdCBkYXRhIGJ1cywgYnVyc3QgbGVuIGlzIDggKi8KKwkJZWxzZQorCQkJYnVyc3RsZW4gPSAweDAyOyAvKiAzMiBiaXQgZGF0YSBidXMsIGJ1cnN0IGxlbiBpcyA0ICovCiAJCXByaW50ZigiXG4gICBERFIgRElNTTogZGF0YSBidXMgd2lkdGggaXMgMzIgYml0Iik7CiAJfSBlbHNlIHsKIAkJYnVyc3RsZW4gPSAweDAyOyAvKiBPdGhlcnMgYWN0IGFzIDY0IGJpdCBidXMsIGJ1cnN0IGxlbiBpcyA0ICovCkBAIC03MzAsOCArNzMzLDEyIEBACiAJCXNkcmFtX2NmZyB8PSAweDEwMDAwMDAwOwogCiAJLyogVGhlIERJTU0gaXMgMzJiaXQgd2lkdGggKi8KLQlpZiAoc3BkLmRhdGF3X2xzYiA9PSAweDIwKQotCQlzZHJhbV9jZmcgfD0gMHgwMDBDMDAwMDsKKwlpZiAoc3BkLmRhdGF3X2xzYiA9PSAweDIwKSB7CisJCWlmIChzcGQubWVtX3R5cGUgPT0gU1BEX01FTVRZUEVfRERSKQorCQkJc2RyYW1fY2ZnIHw9IDB4MDAwQzAwMDA7CisJCWlmIChzcGQubWVtX3R5cGUgPT0gU1BEX01FTVRZUEVfRERSMikKKwkJCXNkcmFtX2NmZyB8PSAweDAwMDgwMDAwOworCX0KIAogCWRkcmNfZWNjX2VuYWJsZSA9IDA7CiAKZGlmZiAtLWdpdCBhL2NwdS9tcGM4M3h4L3RyYXBzLmMgYi9jcHUvbXBjODN4eC90cmFwcy5jCmluZGV4IDE1MmZhNzMuLmRmZDZjMDMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4M3h4L3RyYXBzLmMKKysrIGIvY3B1L21wYzgzeHgvdHJhcHMuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAJCXJldHVybjsKIAl9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xNzYsNyArMTc2LDcgQEAKIHZvaWQKIEFsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xODgsNyArMTg4LDcgQEAKIHZvaWQKIFByb2dyYW1DaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yMDAsNyArMjAwLDcgQEAKIHZvaWQKIFNvZnRFbXVFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjEzLDcgKzIxMyw3IEBACiB2b2lkCiBVbmtub3duRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIyMiw3ICsyMjIsNyBAQAogCV9leGNlcHRpb24oMCwgcmVncyk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKIGV4dGVybiB2b2lkIGRvX2JlZGJ1Z19icmVha3BvaW50KHN0cnVjdCBwdF9yZWdzICopOwogI2VuZGlmCiAKQEAgLTIzMSw3ICsyMzEsNyBAQAogewogCXByaW50ZigiRGVidWdnZXIgdHJhcCBhdCBAICVseFxuIiwgcmVncy0+bmlwICk7CiAJc2hvd19yZWdzKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogCWRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2NwdS9tcGM4M3h4L3UtYm9vdC5sZHMgYi9jcHUvbXBjODN4eC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjYzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjODN4eC91LWJvb3QubGRzCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQorICAucGx0IDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICA6CisgIHsKKyAgICBjcHUvbXBjODN4eC9zdGFydC5vCSgudGV4dCkKKyAgICAqKC50ZXh0KQorICAgICooLmdvdDEpCisgICAgLiA9IEFMSUdOKDE2KTsKKyAgICAqKC5yb2RhdGEpCisgICAgKigucm9kYXRhMSkKKyAgICAqKC5yb2RhdGEuc3RyMS40KQorICAgICooLmVoX2ZyYW1lKQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOworICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgLiA9IC47CisgIF9fdV9ib290X2NtZF9zdGFydCA9IC47CisgIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisgIF9fdV9ib290X2NtZF9lbmQgPSAuOworCisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2VuZCA9IC47CisKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgIDoKKyAgeworICAgKiguc2JzcykgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICB9CisgIF9lbmQgPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7Cit9CitFTlRSWShfc3RhcnQpCmRpZmYgLS1naXQgYS9jcHUvbXBjODV4eC9NYWtlZmlsZSBiL2NwdS9tcGM4NXh4L01ha2VmaWxlCmluZGV4IGZmNjdkY2QuLjMyMDkxZmEgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4NXh4L01ha2VmaWxlCisrKyBiL2NwdS9tcGM4NXh4L01ha2VmaWxlCkBAIC0zMCw3ICszMCw3IEBACiAKIFNUQVJUCT0gc3RhcnQubyByZXNldHZlYy5vCiBDT0JKUwk9IHRyYXBzLm8gY3B1Lm8gY3B1X2luaXQubyBzcGVlZC5vIGludGVycnVwdHMubyBcCi0JICBwY2kubyBzZXJpYWxfc2NjLm8gY29tbXByb2MubyBldGhlcl9mY2MubyBzcGRfc2RyYW0ubworCSAgcGNpLm8gc2VyaWFsX3NjYy5vIGNvbW1wcm9jLm8gZXRoZXJfZmNjLm8gc3BkX3NkcmFtLm8gcWVfaW8ubwogCiBTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCiBPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKZGlmZiAtLWdpdCBhL2NwdS9tcGM4NXh4L2NwdS5jIGIvY3B1L21wYzg1eHgvY3B1LmMKaW5kZXggMWQ3OTFjOS4uMDhlMDQ2OCAxMDA2NDQKLS0tIGEvY3B1L21wYzg1eHgvY3B1LmMKKysrIGIvY3B1L21wYzg1eHgvY3B1LmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCWlmIChwICE9IE5VTEwpCiAJCSpwID0gY3B1X3RvX2JlMzIoY2xvY2spOwogCi0jaWYgZGVmaW5lZChDT05GSUdfVFNFQzEpCisjaWYgZGVmaW5lZChDT05GSUdfSEFTX0VUSDApCiAJcCA9IGZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9TT0MgIi9ldGhlcm5ldEAyNDAwMC9tYWMtYWRkcmVzcyIsICZsZW4pOwogCWlmIChwKQogCQltZW1jcHkocCwgYmQtPmJpX2VuZXRhZGRyLCA2KTsKQEAgLTMwOCw2ICszMDgsMTcgQEAKIAlwID0gZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI2MDAwL2xvY2FsLW1hYy1hZGRyZXNzIiwgJmxlbik7CiAJaWYgKHApCiAJCW1lbWNweShwLCBiZC0+YmlfZW5ldDJhZGRyLCA2KTsKKworI2lmZGVmIENPTkZJR19VRUNfRVRICisJcCA9IGZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9RRSAiL3VjY0AyMDAwL21hYy1hZGRyZXNzIiwgJmxlbik7CisJaWYgKHApCisJCW1lbWNweShwLCBiZC0+YmlfZW5ldDJhZGRyLCA2KTsKKworCXAgPSBmdF9nZXRfcHJvcChibG9iLCAiLyIgT0ZfUUUgIi91Y2NAMjAwMC9sb2NhbC1tYWMtYWRkcmVzcyIsICZsZW4pOworCWlmIChwKQorCQltZW1jcHkocCwgYmQtPmJpX2VuZXQyYWRkciwgNik7CisKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19IQVNfRVRIMykKQEAgLTMxOCw2ICszMjksMTcgQEAKIAlwID0gZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI3MDAwL2xvY2FsLW1hYy1hZGRyZXNzIiwgJmxlbik7CiAJaWYgKHApCiAJCW1lbWNweShwLCBiZC0+YmlfZW5ldDNhZGRyLCA2KTsKKworI2lmZGVmIENPTkZJR19VRUNfRVRICisJcCA9IGZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9RRSAiL3VjY0AzMDAwL21hYy1hZGRyZXNzIiwgJmxlbik7CisJaWYgKHApCisJCW1lbWNweShwLCBiZC0+YmlfZW5ldDNhZGRyLCA2KTsKKworCXAgPSBmdF9nZXRfcHJvcChibG9iLCAiLyIgT0ZfUUUgIi91Y2NAMzAwMC9sb2NhbC1tYWMtYWRkcmVzcyIsICZsZW4pOworCWlmIChwKQorCQltZW1jcHkocCwgYmQtPmJpX2VuZXQzYWRkciwgNik7CisKKyNlbmRpZgogI2VuZGlmCiAKIH0KZGlmZiAtLWdpdCBhL2NwdS9tcGM4NXh4L2NwdV9pbml0LmMgYi9jcHUvbXBjODV4eC9jcHVfaW5pdC5jCmluZGV4IDk1MTcxNDYuLjdiOTk2MTAgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4NXh4L2NwdV9pbml0LmMKKysrIGIvY3B1L21wYzg1eHgvY3B1X2luaXQuYwpAQCAtMSw0ICsxLDYgQEAKIC8qCisgKiBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqCiAgKiAoQykgQ29weXJpZ2h0IDIwMDMgTW90b3JvbGEgSW5jLgogICogTW9kaWZpZWQgYnkgWGlhbmdodWEgWGlhbywgWC5YaWFvQG1vdG9yb2xhLmNvbQogICoKQEAgLTMyLDYgKzM0LDI5IEBACiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCisjaWZkZWYgQ09ORklHX1FFCitleHRlcm4gcWVfaW9wX2NvbmZfdCBxZV9pb3BfY29uZl90YWJbXTsKK2V4dGVybiB2b2lkIHFlX2NvbmZpZ19pb3Bpbih1OCBwb3J0LCB1OCBwaW4sIGludCBkaXIsCisJCQkJaW50IG9wZW5fZHJhaW4sIGludCBhc3NpZ24pOworZXh0ZXJuIHZvaWQgcWVfaW5pdCh1aW50IHFlX2Jhc2UpOworZXh0ZXJuIHZvaWQgcWVfcmVzZXQodm9pZCk7CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19xZV9pb3BvcnRzKHZvaWQpCit7CisJdTggICAgICBwb3J0LCBwaW47CisJaW50ICAgICBkaXIsIG9wZW5fZHJhaW4sIGFzc2lnbjsKKwlpbnQgICAgIGk7CisKKwlmb3IgKGkgPSAwOyBxZV9pb3BfY29uZl90YWJbaV0uYXNzaWduICE9IFFFX0lPUF9UQUJfRU5EOyBpKyspIHsKKwkJcG9ydAkJPSBxZV9pb3BfY29uZl90YWJbaV0ucG9ydDsKKwkJcGluCQk9IHFlX2lvcF9jb25mX3RhYltpXS5waW47CisJCWRpcgkJPSBxZV9pb3BfY29uZl90YWJbaV0uZGlyOworCQlvcGVuX2RyYWluCT0gcWVfaW9wX2NvbmZfdGFiW2ldLm9wZW5fZHJhaW47CisJCWFzc2lnbgkJPSBxZV9pb3BfY29uZl90YWJbaV0uYXNzaWduOworCQlxZV9jb25maWdfaW9waW4ocG9ydCwgcGluLCBkaXIsIG9wZW5fZHJhaW4sIGFzc2lnbik7CisJfQorfQorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQ1BNMgogc3RhdGljIHZvaWQgY29uZmlnXzg1NjBfaW9wb3J0cyAodm9sYXRpbGUgaW1tYXBfdCAqIGltbXIpCkBAIC0xMzMsMTUgKzE1OCwxOCBAQAogI2VuZGlmCiAKIAkvKiBub3cgcmVzdHJpY3QgdG8gcHJlbGltaW5hcnkgcmFuZ2UgKi8KKwkvKiBpZiBjczEgaXMgYWxyZWFkeSBzZXQgdmlhIGRlYnVnZ2VyLCBsZWF2ZSBjczAvY3MxIGFsb25lICovCisJaWYgKCEgbWVtY3RsLT5icjEgJiAxKSB7CiAjaWYgZGVmaW5lZChDRkdfQlIwX1BSRUxJTSkgJiYgZGVmaW5lZChDRkdfT1IwX1BSRUxJTSkKLQltZW1jdGwtPmJyMCA9IENGR19CUjBfUFJFTElNOwotCW1lbWN0bC0+b3IwID0gQ0ZHX09SMF9QUkVMSU07CisJCW1lbWN0bC0+YnIwID0gQ0ZHX0JSMF9QUkVMSU07CisJCW1lbWN0bC0+b3IwID0gQ0ZHX09SMF9QUkVMSU07CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ0ZHX0JSMV9QUkVMSU0pICYmIGRlZmluZWQoQ0ZHX09SMV9QUkVMSU0pCi0JbWVtY3RsLT5vcjEgPSBDRkdfT1IxX1BSRUxJTTsKLQltZW1jdGwtPmJyMSA9IENGR19CUjFfUFJFTElNOworCQltZW1jdGwtPm9yMSA9IENGR19PUjFfUFJFTElNOworCQltZW1jdGwtPmJyMSA9IENGR19CUjFfUFJFTElNOwogI2VuZGlmCisJfQogCiAjaWYgZGVmaW5lZChDRkdfQlIyX1BSRUxJTSkgJiYgZGVmaW5lZChDRkdfT1IyX1BSRUxJTSkKIAltZW1jdGwtPm9yMiA9IENGR19PUjJfUFJFTElNOwpAQCAtMTc2LDYgKzIwNCwxMSBAQAogI2lmIGRlZmluZWQoQ09ORklHX0NQTTIpCiAJbTg1NjBfY3BtX3Jlc2V0KCk7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUUUKKwkvKiBDb25maWcgUUUgaW9wb3J0cyAqLworCWNvbmZpZ19xZV9pb3BvcnRzKCk7CisjZW5kaWYKKwogfQogCiAKQEAgLTE4NSwxNiArMjE4LDI1IEBACiAgKiBUaGUgbmV3ZXIgODU0OCwgZXRjLCBwYXJ0cyBoYXZlIHR3aWNlIGFzIG11Y2ggY2FjaGUsIGJ1dAogICogdXNlIHRoZSBzYW1lIGJpdC1lbmNvZGluZyBhcyB0aGUgb2xkZXIgODU1NSwgZXRjLCBwYXJ0cy4KICAqCi0gKiBGSVhNRTogVXNlIFBWUl9WRVIocHZyKSA9PSAxIHRlc3QgaGVyZSBpbnN0ZWFkIG9mIFNWUl9WRVIoKT8KICAqLwogCiBpbnQgY3B1X2luaXRfcih2b2lkKQogeworI2lmIGRlZmluZWQoQ09ORklHX0NMRUFSX0xBVzApIHx8IGRlZmluZWQoQ09ORklHX0wyX0NBQ0hFKQorCXZvbGF0aWxlIGltbWFwX3QgICAgKmltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DTEVBUl9MQVcwCisJdm9sYXRpbGUgY2Nzcl9sb2NhbF9lY21fdCAqZWNtID0gJmltbWFwLT5pbV9sb2NhbF9lY207CisKKwkvKiBjbGVhciBhbHRlcm5hdGUgYm9vdCBsb2NhdGlvbiBMQVcgKHVzZWQgZm9yIHNkcmFtLCBvciBkZHIgYmFuaykgKi8KKwllY20tPmxhd2FyMCA9IDA7CisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX0wyX0NBQ0hFKQotCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUjsKIAl2b2xhdGlsZSBjY3NyX2wyY2FjaGVfdCAqbDJjYWNoZSA9ICZpbW1hcC0+aW1fbDJjYWNoZTsKIAl2b2xhdGlsZSB1aW50IGNhY2hlX2N0bDsKIAl1aW50IHN2ciwgdmVyOworCXVpbnQgbDJzcmJhcjsKIAogCXN2ciA9IGdldF9zdnIoKTsKIAl2ZXIgPSBTVlJfVkVSKHN2cik7CkBAIC0yMDQsMzMgKzI0Niw1NSBAQAogCiAJc3dpdGNoIChjYWNoZV9jdGwgJiAweDMwMDAwMDAwKSB7CiAJY2FzZSAweDIwMDAwMDAwOgotCQlpZiAodmVyID09IFNWUl84NTQ4IHx8IHZlciA9PSBTVlJfODU0OF9FKSB7CisJCWlmICh2ZXIgPT0gU1ZSXzg1NDggfHwgdmVyID09IFNWUl84NTQ4X0UgfHwKKwkJICAgIHZlciA9PSBTVlJfODU0NCkgewogCQkJcHJpbnRmICgiTDIgY2FjaGUgNTEyS0I6Iik7CisJCQkvKiBzZXQgTDJFPTEsIEwyST0xLCAmIEwyU1JBTT0wICovCisJCQljYWNoZV9jdGwgPSAweGMwMDAwMDAwOwogCQl9IGVsc2UgewogCQkJcHJpbnRmICgiTDIgY2FjaGUgMjU2S0I6Iik7CisJCQkvKiBzZXQgTDJFPTEsIEwyST0xLCAmIEwyQkxLU1o9MiAoMjU2IEtieXRlKSAqLworCQkJY2FjaGVfY3RsID0gMHhjODAwMDAwMDsKIAkJfQogCQlicmVhazsKLQljYXNlIDB4MDAwMDAwMDA6CiAJY2FzZSAweDEwMDAwMDAwOgorCQlwcmludGYgKCJMMiBjYWNoZSAyNTZLQjoiKTsKKwkJaWYgKHZlciA9PSBTVlJfODU0NCB8fCB2ZXIgPT0gU1ZSXzg1NDRfRSkgeworCQkJY2FjaGVfY3RsID0gMHhjMDAwMDAwMDsgLyogc2V0IEwyRT0xLCBMMkk9MSwgJiBMMlNSQU09MCAqLworCQl9CisJCWJyZWFrOwogCWNhc2UgMHgzMDAwMDAwMDoKKwljYXNlIDB4MDAwMDAwMDA6CiAJZGVmYXVsdDoKIAkJcHJpbnRmICgiTDIgY2FjaGUgdW5rbm93biBzaXplICgweCUwOHgpXG4iLCBjYWNoZV9jdGwpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JYXNtKCJtc3luYztpc3luYyIpOwotCWwyY2FjaGUtPmwyY3RsID0gMHg2ODAwMDAwMDsgLyogaW52YWxpZGF0ZSAqLwotCWNhY2hlX2N0bCA9IGwyY2FjaGUtPmwyY3RsOwotCWFzbSgibXN5bmM7aXN5bmMiKTsKLQotCWwyY2FjaGUtPmwyY3RsID0gMHhhODAwMDAwMDsgLyogZW5hYmxlIDI1NktCIEwyIGNhY2hlICovCi0JY2FjaGVfY3RsID0gbDJjYWNoZS0+bDJjdGw7Ci0JYXNtKCJtc3luYztpc3luYyIpOwotCi0JcHJpbnRmKCIgZW5hYmxlZFxuIik7CisJaWYgKGwyY2FjaGUtPmwyY3RsICYgMHg4MDAwMDAwMCkgeworCQlwcmludGYoIiBhbHJlYWR5IGVuYWJsZWQuIik7CisJCWwyc3JiYXIgPSBsMmNhY2hlLT5sMnNyYmFyMDsKKyNpZmRlZiBDRkdfSU5JVF9MMl9BRERSCisJCWlmIChsMmNhY2hlLT5sMmN0bCAmIDB4MDAwMTAwMDAgJiYgbDJzcmJhciA+PSBDRkdfRkxBU0hfQkFTRSkgeworCQkJbDJzcmJhciA9IENGR19JTklUX0wyX0FERFI7CisJCQlsMmNhY2hlLT5sMnNyYmFyMCA9IGwyc3JiYXI7CisJCQlwcmludGYoIiAgTW92aW5nIHRvIDB4JTA4eCIsIENGR19JTklUX0wyX0FERFIpOworCQl9CisjZW5kaWYgLyogQ0ZHX0lOSVRfTDJfQUREUiAqLworCQlwdXRzKCJcbiIpOworCX0gZWxzZSB7CisJCWFzbSgibXN5bmM7aXN5bmMiKTsKKwkJbDJjYWNoZS0+bDJjdGwgPSBjYWNoZV9jdGw7IC8qIGludmFsaWRhdGUgJiBlbmFibGUgKi8KKwkJYXNtKCJtc3luYztpc3luYyIpOworCQlwcmludGYoIiBlbmFibGVkXG4iKTsKKwl9CiAjZWxzZQogCXByaW50ZigiTDIgY2FjaGU6IGRpc2FibGVkXG4iKTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19RRQorCXVpbnQgcWVfYmFzZSA9IENGR19JTU1SICsgMHgwMDA4MDAwMDsgLyogUUUgaW1tciBiYXNlICovCisJcWVfaW5pdChxZV9iYXNlKTsKKwlxZV9yZXNldCgpOworI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2NwdS9tcGM4NXh4L2V0aGVyX2ZjYy5jIGIvY3B1L21wYzg1eHgvZXRoZXJfZmNjLmMKaW5kZXggZDE1ZDI0Mi4uNWIyM2E4MCAxMDA2NDQKLS0tIGEvY3B1L21wYzg1eHgvZXRoZXJfZmNjLmMKKysrIGIvY3B1L21wYzg1eHgvZXRoZXJfZmNjLmMKQEAgLTQ4LDEzICs0OCwxMyBAQAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPG5ldC5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogI2luY2x1ZGUgPG1paXBoeS5oPgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19DUE0yKQogCi0jaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIFwKKyNpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpICYmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIFwKIAlkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCiAKIHN0YXRpYyBzdHJ1Y3QgZXRoZXJfZmNjX2luZm9fcwpAQCAtNDU4LDcgKzQ1OCw3IEBACiAKIAkJZXRoX3JlZ2lzdGVyKGRldik7CiAKLSNpZiAoZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpKSBcCisjaWYgKGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkpIFwKIAkJJiYgZGVmaW5lZChDT05GSUdfQklUQkFOR01JSSkKIAkJbWlpcGh5X3JlZ2lzdGVyKGRldi0+bmFtZSwKIAkJCQliYl9taWlwaHlfcmVhZCwJYmJfbWlpcGh5X3dyaXRlKTsKQEAgLTQ2OCw2ICs0NjgsNiBAQAogCXJldHVybiAxOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0VUSEVSX09OX0ZDQyAmJiBDRkdfQ01EX05FVCAmJiBDT05GSUdfTkVUX01VTFRJICovCisjZW5kaWYKIAogI2VuZGlmIC8qIENPTkZJR19DUE0yICovCmRpZmYgLS1naXQgYS9jcHUvbXBjODV4eC9pbnRlcnJ1cHRzLmMgYi9jcHUvbXBjODV4eC9pbnRlcnJ1cHRzLmMKaW5kZXggODMyNzgxYi4uYmY3MzdkNiAxMDA2NDQKLS0tIGEvY3B1L21wYzg1eHgvaW50ZXJydXB0cy5jCisrKyBiL2NwdS9tcGM4NXh4L2ludGVycnVwdHMuYwpAQCAtODksNiArODksMzkgQEAKIAltdHNwcihTUFJOX1RDUiwgVENSX1BJRSk7CiAJc2V0X2RlYyAoZGVjcmVtZW50ZXJfY291bnQpOwogCXNldF9tc3IgKGdldF9tc3IgKCkgfCBNU1JfRUUpOworCisjaWZkZWYgQ09ORklHX0lOVEVSUlVQVFMKKwl2b2xhdGlsZSBjY3NyX3BpY190ICpwaWMgPSAmaW1tci0+aW1fcGljOworCisJcGljLT5paXZwcjEgPSAweDgxMDAwMjsJLyogNTAyMjAgZW5hYmxlIGVjbSBpbnRlcnJ1cHRzICovCisJZGVidWcoImlpdnByMUAleCA9ICV4XG4iLCZwaWMtPmlpdnByMSwgcGljLT5paXZwcjEpOworCisJcGljLT5paXZwcjIgPSAweDgxMDAwMjsJLyogNTAyNDAgZW5hYmxlIGRkciBpbnRlcnJ1cHRzICovCisJZGVidWcoImlpdnByMkAleCA9ICV4XG4iLCZwaWMtPmlpdnByMiwgcGljLT5paXZwcjIpOworCisJcGljLT5paXZwcjMgPSAweDgxMDAwMzsJLyogNTAyNjAgZW5hYmxlIGxiYyBpbnRlcnJ1cHRzICovCisJZGVidWcoImlpdnByM0AleCA9ICV4XG4iLCZwaWMtPmlpdnByMywgcGljLT5paXZwcjMpOworCisjaWZkZWYgQ09ORklHX1BDSTEKKwlwaWMtPmlpdnByOCA9IDB4ODEwMDA4OwkvKiBlbmFibGUgcGNpMSBpbnRlcnJ1cHRzICovCisJZGVidWcoImlpdnByOEAleCA9ICV4XG4iLCZwaWMtPmlpdnByOCwgcGljLT5paXZwcjgpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfUENJMikgfHwgZGVmaW5lZChDT05GSUdfUENJRTIpCisJcGljLT5paXZwcjkgPSAweDgxMDAwOTsJLyogZW5hYmxlIHBjaTEgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjlAJXggPSAleFxuIiwmcGljLT5paXZwcjksIHBpYy0+aWl2cHI5KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0lFMQorCXBpYy0+aWl2cHIxMCA9IDB4ODEwMDBhOwkvKiBlbmFibGUgcGNpZTEgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjEwQCV4ID0gJXhcbiIsJnBpYy0+aWl2cHIxMCwgcGljLT5paXZwcjEwKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0lFMworCXBpYy0+aWl2cHIxMSA9IDB4ODEwMDBiOwkvKiBlbmFibGUgcGNpZTMgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjExQCV4ID0gJXhcbiIsJnBpYy0+aWl2cHIxMSwgcGljLT5paXZwcjExKTsKKyNlbmRpZgorCisJcGljLT5jdHByPTA7CQkvKiA0MDA4MCBjbGVhciBjdXJyZW50IHRhc2sgcHJpb3JpdHkgcmVnaXN0ZXIgKi8KKyNlbmRpZgorCiAJcmV0dXJuICgwKTsKIH0KIApAQCAtMTQ0LDcgKzE3Nyw3IEBACiAJdGltZXN0YW1wID0gdDsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE1OSw0ICsxOTIsNCBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgIC8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM4NXh4L3BjaS5jIGIvY3B1L21wYzg1eHgvcGNpLmMKaW5kZXggM2MxYTMyMy4uZGIwOWU0NSAxMDA2NDQKLS0tIGEvY3B1L21wYzg1eHgvcGNpLmMKKysrIGIvY3B1L21wYzg1eHgvcGNpLmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogCQl1OCBoZWFkZXJfdHlwZTsKIAogCQlwY2lfaG9zZV9yZWFkX2NvbmZpZ19ieXRlKGhvc2UsCi0JCQkJCSAgUENJX0JERigwLDE3LDApLAorCQkJCQkgIFBDSV9CREYoMCxCUklER0VfSUQsMCksCiAJCQkJCSAgUENJX0hFQURFUl9UWVBFLAogCQkJCQkgICZoZWFkZXJfdHlwZSk7CiAJfQpkaWZmIC0tZ2l0IGEvY3B1L21wYzg1eHgvcWVfaW8uYyBiL2NwdS9tcGM4NXh4L3FlX2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3OGJjNQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM4NXh4L3FlX2lvLmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIERhdmUgTGl1IDxkYXZlbGl1QGZyZWVzY2FsZS5jb20+CisgKiBiYXNlZCBvbiBzb3VyY2UgY29kZSBvZiBTaGxvbWkgR3JpZGlzaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJhc20vZXJybm8uaCIKKyNpbmNsdWRlICJhc20vaW8uaCIKKyNpbmNsdWRlICJhc20vaW1tYXBfODV4eC5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfUUUpCisjZGVmaW5lCU5VTV9PRl9QSU5TCTMyCit2b2lkIHFlX2NvbmZpZ19pb3Bpbih1OCBwb3J0LCB1OCBwaW4sIGludCBkaXIsIGludCBvcGVuX2RyYWluLCBpbnQgYXNzaWduKQoreworCXUzMgkJCXBpbl8yYml0X21hc2s7CisJdTMyCQkJcGluXzJiaXRfZGlyOworCXUzMgkJCXBpbl8yYml0X2Fzc2lnbjsKKwl1MzIJCQlwaW5fMWJpdF9tYXNrOworCXUzMgkJCXRtcF92YWw7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW0gPSAodm9sYXRpbGUgaW1tYXBfdCAqKUNGR19JTU1SOworCXZvbGF0aWxlIHBhcl9pb190CSpwYXJfaW8gPSAodm9sYXRpbGUgcGFyX2lvX3QgKikKKwkJCQkJCSYoaW0tPmltX2d1ci5xZV9wYXJfaW8pOworCisJLyogQ2FjdWxhdGUgcGluIGxvY2F0aW9uIGFuZCAyYml0IG1hc2sgYW5kIGRpciAqLworCXBpbl8yYml0X21hc2sgPSAodTMyKSgweDMgPDwgKE5VTV9PRl9QSU5TLShwaW4lKE5VTV9PRl9QSU5TLzIpKzEpKjIpKTsKKwlwaW5fMmJpdF9kaXIgPSAodTMyKShkaXIgPDwgKE5VTV9PRl9QSU5TLShwaW4lKE5VTV9PRl9QSU5TLzIpKzEpKjIpKTsKKworCS8qIFNldHVwIHRoZSBkaXJlY3Rpb24gKi8KKwl0bXBfdmFsID0gKHBpbiA+IChOVU1fT0ZfUElOUy8yKSAtIDEpID8gXAorCQlpbl9iZTMyKCZwYXJfaW9bcG9ydF0uY3BkaXIyKSA6CisJCWluX2JlMzIoJnBhcl9pb1twb3J0XS5jcGRpcjEpOworCisJaWYgKHBpbiA+IChOVU1fT0ZfUElOUy8yKSAtMSkgeworCQlvdXRfYmUzMigmcGFyX2lvW3BvcnRdLmNwZGlyMiwgfnBpbl8yYml0X21hc2sgJiB0bXBfdmFsKTsKKwkJb3V0X2JlMzIoJnBhcl9pb1twb3J0XS5jcGRpcjIsIHBpbl8yYml0X2RpciB8IHRtcF92YWwpOworCX0gZWxzZSB7CisJCW91dF9iZTMyKCZwYXJfaW9bcG9ydF0uY3BkaXIxLCB+cGluXzJiaXRfbWFzayAmIHRtcF92YWwpOworCQlvdXRfYmUzMigmcGFyX2lvW3BvcnRdLmNwZGlyMSwgcGluXzJiaXRfZGlyIHwgdG1wX3ZhbCk7CisJfQorCisJLyogQ2FsY3VsYXRlIHBpbiBsb2NhdGlvbiBmb3IgMWJpdCBtYXNrICovCisJcGluXzFiaXRfbWFzayA9ICh1MzIpKDEgPDwgKE5VTV9PRl9QSU5TIC0gKHBpbisxKSkpOworCisJLyogU2V0dXAgdGhlIG9wZW4gZHJhaW4gKi8KKwl0bXBfdmFsID0gaW5fYmUzMigmcGFyX2lvW3BvcnRdLmNwb2RyKTsKKwlpZiAob3Blbl9kcmFpbikKKwkJb3V0X2JlMzIoJnBhcl9pb1twb3J0XS5jcG9kciwgcGluXzFiaXRfbWFzayB8IHRtcF92YWwpOworCWVsc2UKKwkJb3V0X2JlMzIoJnBhcl9pb1twb3J0XS5jcG9kciwgfnBpbl8xYml0X21hc2sgJiB0bXBfdmFsKTsKKworCS8qIFNldHVwIHRoZSBhc3NpZ25tZW50ICovCisJdG1wX3ZhbCA9IChwaW4gPiAoTlVNX09GX1BJTlMvMikgLSAxKSA/CisJCWluX2JlMzIoJnBhcl9pb1twb3J0XS5jcHBhcjIpOgorCQlpbl9iZTMyKCZwYXJfaW9bcG9ydF0uY3BwYXIxKTsKKwlwaW5fMmJpdF9hc3NpZ24gPSAodTMyKShhc3NpZ24KKwkJCQk8PCAoTlVNX09GX1BJTlMgLSAocGluJShOVU1fT0ZfUElOUy8yKSsxKSoyKSk7CisKKwkvKiBDbGVhciBhbmQgc2V0IDIgYml0cyBtYXNrICovCisJaWYgKHBpbiA+IChOVU1fT0ZfUElOUy8yKSAtIDEpIHsKKwkJb3V0X2JlMzIoJnBhcl9pb1twb3J0XS5jcHBhcjIsIH5waW5fMmJpdF9tYXNrICYgdG1wX3ZhbCk7CisJCW91dF9iZTMyKCZwYXJfaW9bcG9ydF0uY3BwYXIyLCBwaW5fMmJpdF9hc3NpZ24gfCB0bXBfdmFsKTsKKwl9IGVsc2UgeworCQlvdXRfYmUzMigmcGFyX2lvW3BvcnRdLmNwcGFyMSwgfnBpbl8yYml0X21hc2sgJiB0bXBfdmFsKTsKKwkJb3V0X2JlMzIoJnBhcl9pb1twb3J0XS5jcHBhcjEsIHBpbl8yYml0X2Fzc2lnbiB8IHRtcF92YWwpOworCX0KK30KKworI2VuZGlmIC8qIENPTkZJR19RRSAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzg1eHgvc3BkX3NkcmFtLmMgYi9jcHUvbXBjODV4eC9zcGRfc2RyYW0uYwppbmRleCAzNzc3ZjQ5Li41ZGMyMjNhIDEwMDY0NAotLS0gYS9jcHUvbXBjODV4eC9zcGRfc2RyYW0uYworKysgYi9jcHUvbXBjODV4eC9zcGRfc2RyYW0uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqIENvcHlyaWdodCAyMDA0LCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgogICogKEMpIENvcHlyaWdodCAyMDAzIE1vdG9yb2xhIEluYy4KICAqIFhpYW5naHVhIFhpYW8gKFguWGlhb0Btb3Rvcm9sYS5jb20pCiAgKgpAQCAtMTczLDExICsxNzMsMTAgQEAKIHsKIAl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CiAJdm9sYXRpbGUgY2Nzcl9kZHJfdCAqZGRyID0gJmltbWFwLT5pbV9kZHI7Ci0Jdm9sYXRpbGUgY2Nzcl9ndXJfdCAqZ3VyID0gJmltbWFwLT5pbV9ndXI7CiAJc3BkX2VlcHJvbV90IHNwZDsKIAl1bnNpZ25lZCBpbnQgbl9yYW5rczsKIAl1bnNpZ25lZCBpbnQgcmFua19kZW5zaXR5OwotCXVuc2lnbmVkIGludCBvZHRfcmRfY2ZnLCBvZHRfd3JfY2ZnOworCXVuc2lnbmVkIGludCBvZHRfcmRfY2ZnLCBvZHRfd3JfY2ZnLCBiYV9iaXRzOwogCXVuc2lnbmVkIGludCBvZHRfY2ZnLCBtb2RlX29kdF9lbmFibGU7CiAJdW5zaWduZWQgaW50IHJlZnJlc2hfY2xrOwogI2lmZGVmIE1QQzg1eHhfRERSX1NEUkFNX0NMS19DTlRMCkBAIC0xODksNyArMTg4LDcgQEAKIAl1bnNpZ25lZCBpbnQgbWF4X2RhdGFfcmF0ZSwgZWZmZWN0aXZlX2RhdGFfcmF0ZTsKIAl1bnNpZ25lZCBpbnQgYnVzZnJlcTsKIAl1bnNpZ25lZCBzZHJhbV9jZmc7Ci0JdW5zaWduZWQgaW50IG1lbXNpemU7CisJdW5zaWduZWQgaW50IG1lbXNpemUgPSAwOwogCXVuc2lnbmVkIGNoYXIgY2FzbGF0LCBjYXNsYXRfY3RybDsKIAl1bnNpZ25lZCBpbnQgdHJmYywgdHJmY19jbGssIHRyZmNfbG93LCB0cmZjX2hpZ2g7CiAJdW5zaWduZWQgaW50IHRyY2RfY2xrOwpAQCAtMjA0LDYgKzIwMyw0NiBAQAogCXVuc2lnbmVkIGludCBtb2RlX2Nhc2xhdDsKIAl1bnNpZ25lZCBjaGFyIHNkcmFtX3R5cGU7CiAJdW5zaWduZWQgY2hhciBkX2luaXQ7CisJdW5zaWduZWQgaW50IGJuZHM7CisKKwkvKgorCSAqIFNraXAgY29uZmlndXJhdGlvbiBpZiBhbHJlYWR5IGNvbmZpZ3VyZWQuCisJICogbWVtc2l6ZSBpcyBkZXRlcm1pbmVkIGZyb20gbGFzdCBjb25maWd1cmVkIGNoaXAgc2VsZWN0LgorCSAqLworCWlmIChkZHItPmNzMF9jb25maWcgJiAweDgwMDAwMDAwKSB7CisJCWRlYnVnKCIgY3MwIGFscmVhZHkgY29uZmlndXJlZCwgYm5kcz0leFxuIixkZHItPmNzMF9ibmRzKTsKKwkJYm5kcyA9IDB4ZmZmICYgZGRyLT5jczBfYm5kczsKKwkJaWYgKGJuZHMgPCAweGZmKSB7IC8qIGRvIG5vdCBhZGQgaWYgYXQgdG9wIG9mIDRHICovCisJCQltZW1zaXplID0gKGJuZHMgKyAxKSA8PCA0OworCQl9CisJfQorCWlmIChkZHItPmNzMV9jb25maWcgJiAweDgwMDAwMDAwKSB7CisJCWRlYnVnKCIgY3MxIGFscmVhZHkgY29uZmlndXJlZCwgYm5kcz0leFxuIixkZHItPmNzMV9ibmRzKTsKKwkJYm5kcyA9IDB4ZmZmICYgZGRyLT5jczFfYm5kczsKKwkJaWYgKGJuZHMgPCAweGZmKSB7IC8qIGRvIG5vdCBhZGQgaWYgYXQgdG9wIG9mIDRHICovCisJCQltZW1zaXplID0gKGJuZHMgKyAxKSA8PCA0OyAvKiBhc3N1bWUgb3JkZXJlZCBibmRzICovCisJCX0KKwl9CisJaWYgKGRkci0+Y3MyX2NvbmZpZyAmIDB4ODAwMDAwMDApIHsKKwkJZGVidWcoIiBjczIgYWxyZWFkeSBjb25maWd1cmVkLCBibmRzPSV4XG4iLGRkci0+Y3MyX2JuZHMpOworCQlibmRzID0gMHhmZmYgJiBkZHItPmNzMl9ibmRzOworCQlpZiAoYm5kcyA8IDB4ZmYpIHsgLyogZG8gbm90IGFkZCBpZiBhdCB0b3Agb2YgNEcgKi8KKwkJCW1lbXNpemUgPSAoYm5kcyArIDEpIDw8IDQ7CisJCX0KKwl9CisJaWYgKGRkci0+Y3MzX2NvbmZpZyAmIDB4ODAwMDAwMDApIHsKKwkJZGVidWcoIiBjczMgYWxyZWFkeSBjb25maWd1cmVkLCBibmRzPSV4XG4iLGRkci0+Y3MzX2JuZHMpOworCQlibmRzID0gMHhmZmYgJiBkZHItPmNzM19ibmRzOworCQlpZiAoYm5kcyA8IDB4ZmYpIHsgLyogZG8gbm90IGFkZCBpZiBhdCB0b3Agb2YgNEcgKi8KKwkJCW1lbXNpemUgPSAoYm5kcyArIDEpIDw8IDQ7CisJCX0KKwl9CisKKwlpZiAobWVtc2l6ZSkgeworCQlwcmludGYoIiAgICAgICBSZXVzaW5nIGN1cnJlbnQgJWRNQiBjb25maWd1cmF0aW9uXG4iLG1lbXNpemUpOworCQltZW1zaXplID0gc2V0dXBfbGF3c19hbmRfdGxicyhtZW1zaXplKTsKKwkJcmV0dXJuIG1lbXNpemUgPDwgMjA7CisJfQogCiAJLyoKIAkgKiBSZWFkIFNQRCBpbmZvcm1hdGlvbi4KQEAgLTI2Miw2ICszMDEsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKyNpZmRlZiBDT05GSUdfTVBDODU0OAogCS8qCiAJICogQWRqdXN0IEREUiBJSSBJTyB2b2x0YWdlIGJpYXNpbmcuCiAJICogT25seSA4NTQ4IHJldiAxIG5lZWRzIHRoZSBmaXgKQEAgLTI2OSw5ICszMDksMTEgQEAKIAlpZiAoKFNWUl9WRVIoZ2V0X3N2cigpKSA9PSBTVlJfODU0OF9FKSAmJgogCQkJKFNWUl9NSlJFVihnZXRfc3ZyKCkpID09IDEpICYmCiAJCQkoc3BkLm1lbV90eXBlID09IFNQRF9NRU1UWVBFX0REUjIpKSB7CisJCXZvbGF0aWxlIGNjc3JfZ3VyX3QgKmd1ciA9ICZpbW1hcC0+aW1fZ3VyOwogCQlndXItPmRkcmlvb3ZjciA9ICgweDgwMDAwMDAwCS8qIEVuYWJsZSAqLwogCQkJCSAgfCAweDEwMDAwMDAwKTsvKiBWU0VMIHRvIDEuOFYgKi8KIAl9CisjZW5kaWYKIAogCS8qCiAJICogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGVhY2ggUmFuayBpbiBieXRlcy4KQEAgLTI5OSw5ICszNDEsMTQgQEAKICNlbmRpZgogCX0KIAorCWJhX2JpdHMgPSAwOworCWlmIChzcGQubmJhbmtzID09IDB4OCkKKwkJYmFfYml0cyA9IDE7CisKIAlkZHItPmNzMF9jb25maWcgPSAoIDEgPDwgMzEKIAkJCSAgICB8IChvZHRfcmRfY2ZnIDw8IDIwKQogCQkJICAgIHwgKG9kdF93cl9jZmcgPDwgMTYpCisJCQkgICAgfCAoYmFfYml0cyA8PCAxNCkKIAkJCSAgICB8IChzcGQubnJvd19hZGRyIC0gMTIpIDw8IDgKIAkJCSAgICB8IChzcGQubmNvbF9hZGRyIC0gOCkgKTsKIAlkZWJ1ZygiXG4iKTsKQEAgLTY0NSwxMyArNjkyLDEwIEBACiAJICovCiAJY3BvID0gMDsKIAlpZiAoc3BkLm1lbV90eXBlID09IFNQRF9NRU1UWVBFX0REUjIpIHsKLQkJaWYgKGVmZmVjdGl2ZV9kYXRhX3JhdGUgPT0gMjY2IHx8IGVmZmVjdGl2ZV9kYXRhX3JhdGUgPT0gMzMzKSB7CisJCWlmIChlZmZlY3RpdmVfZGF0YV9yYXRlIDw9IDMzMykgewogCQkJY3BvID0gMHg3OwkJLyogUkVBRF9MQVQgKyA1LzQgKi8KLQkJfSBlbHNlIGlmIChlZmZlY3RpdmVfZGF0YV9yYXRlID09IDQwMCkgewotCQkJY3BvID0gMHg5OwkJLyogUkVBRF9MQVQgKyA3LzQgKi8KIAkJfSBlbHNlIHsKLQkJCS8qIFB1cmUgc3BlY3VsYXRpb24gKi8KLQkJCWNwbyA9IDB4YjsKKwkJCWNwbyA9IDB4OTsJCS8qIFJFQURfTEFUICsgNy80ICovCiAJCX0KIAl9CiAKQEAgLTg1OCw3ICs5MDIsMTIgQEAKIAlpZiAoc3BkLm1lbV90eXBlID09IFNQRF9NRU1UWVBFX0REUikKIAkJY2xrX2FkanVzdCA9IDB4NjsKIAllbHNlCisjaWZkZWYgQ09ORklHX01QQzg1NjgKKwkJLyogRW1waXJhbGx5IHNldHRpbmcgY2xrX2FkanVzdCAqLworCQljbGtfYWRqdXN0ID0gMHg2OworI2Vsc2UKIAkJY2xrX2FkanVzdCA9IDB4NzsKKyNlbmRpZgogCiAJZGRyLT5zZHJhbV9jbGtfY250bCA9ICgwCiAJCQkgICAgICAgfCAweDgwMDAwMDAwCmRpZmYgLS1naXQgYS9jcHUvbXBjODV4eC9zdGFydC5TIGIvY3B1L21wYzg1eHgvc3RhcnQuUwppbmRleCA3N2MxNTVjLi4yYzk4YzJhIDEwMDY0NAotLS0gYS9jcHUvbXBjODV4eC9zdGFydC5TCisrKyBiL2NwdS9tcGM4NXh4L3N0YXJ0LlMKQEAgLTEsNyArMSw2IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisgKiBDb3B5cmlnaHQgMjAwNCwgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KICAqIENvcHlyaWdodCAoQykgMjAwMyAgTW90b3JvbGEsSW5jLgotICogWGlhbmdodWEgWGlhbzxYLlhpYW9AbW90b3JvbGEuY29tPgogICoKICAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAgKiBwcm9qZWN0LgpAQCAtNDYsNyArNDUsNyBAQAogI2VuZGlmCiAKICN1bmRlZglNU1JfS0VSTkVMCi0jZGVmaW5lIE1TUl9LRVJORUwgKCBNU1JfTUUgICkJLyogTWFjaGluZSBDaGVjayAqLworI2RlZmluZSBNU1JfS0VSTkVMICggTVNSX01FICkJLyogTWFjaGluZSBDaGVjayAqLwogCiAvKgogICogU2V0IHVwIEdPVDogR2xvYmFsIE9mZnNldCBUYWJsZQpAQCAtODAsMTEwICs3OSwzNyBAQAogICoKICAqLwogCi0gICAgLnNlY3Rpb24gLmJvb3RwZywiYXgiCi0gICAgLmdsb2JsIF9zdGFydF9lNTAwCisJLnNlY3Rpb24gLmJvb3RwZywiYXgiCisJLmdsb2JsIF9zdGFydF9lNTAwCiAKIF9zdGFydF9lNTAwOgotCW1mc3ByCXIwLCBQVlIKLQlsaXMJcjEsIFBWUl84NXh4X1JFVjFAaAotCW9yaQlyMSwgcjEsIFBWUl84NXh4X1JFVjFAbAotCWNtcHcJcjAsIHIxCi0JYm5lCTFmCiAKLQkvKiBTZW1pLWJvZ3VzIGVycmF0YSBmaXh1cCBmb3IgUmV2IDEgKi8KLQlsaQlyMCwweDIwMDAKLQltdHNwcgk5NzcscjAKKy8qIGNsZWFyIHJlZ2lzdGVycy9hcnJheXMgbm90IHJlc2V0IGJ5IGhhcmR3YXJlICovCiAKLQkvKgotCSAqIEJlZm9yZSBpbnZhbGlkYXRpbmcgTU1VIEwxL0wyLCByZWFkIFRMQjEgRW50cnkgMCBhbmQgdGhlbgotCSAqIHdyaXRlIGl0IGJhY2sgaW1tZWRpYXRlbHkgdG8gZml4dXAgYSBSZXYgMSBidWcgKEVycmF0YSBDUFU0KQotCSAqIGZvciB0aGlzIGluaXRpYWwgVExCMSBlbnRyeSAwLCBvdGhlcndpc2UgdGhlIFRMQjEgZW50cnkgMAotCSAqIHdpbGwgYmUgaW52YWxpZGF0ZWQgKGluY29ycmVjdGx5KS4KLQkgKi8KLQlsaXMJcjIsMHgxMDAwCi0JbXRzcHIJTUFTMCxyMgotCXRsYnJlCi0JdGxid2UKLQlpc3luYwotCi0xOgotCS8qCi0JICogQ2xlYXIgYW5kIHNldCB1cCBzb21lIHJlZ2lzdGVycy4KLQkgKiBOb3RlOiBTb21lIHJlZ2lzdGVycyBuZWVkIHN0cmljdCBzeW5jaHJvbml6YXRpb24gYnkKLQkgKiBzeW5jL21iYXIvbXN5bmMvaXN5bmMgd2hlbiBiZWluZyAibXRzcHIiLgotCSAqIEJvb2tFOiBpc3luYyBiZWZvcmUgUElELHRsYml2YXgsdGxid2UKLQkgKiBCb29rRTogaXN5bmMgYWZ0ZXIgTVNSLFBJRDsgbXN5bmNfaXN5bmMgYWZ0ZXIgdGxiaXZheCAmIHRsYndlCi0JICogRTUwMDogIG1zeW5jLGlzeW5jIGJlZm9yZSBMMUNTUjAKLQkgKiBFNTAwOiAgaXN5bmMgYWZ0ZXIgQkJFQVIsQkJUQVIsQlVDU1IsREJDUjAsREJDUjEsSElEMCxISUQxLAotCSAqCSAgTDFDU1IwLCBMMUNTUjEsIE1BU1swLDEsMiwzLDQsNl0sTU1VQ1NSMCwgUElEWzAsMSwyXSwKLQkgKgkgIFNQRUZDU1IKLQkgKi8KLQotCS8qIGludmFsaWRhdGUgZC1jYWNoZSAqLwotCW1mc3ByCXIwLEwxQ1NSMAotCW9yaQlyMCxyMCwweDAwMDIKLQltc3luYwotCWlzeW5jCi0JbXRzcHIJTDFDU1IwLHIwCi0JaXN5bmMKLQotCS8qIGRpc2FibGUgZC1jYWNoZSAqLwotCWxpCXIwLDB4MAotCW10c3ByCUwxQ1NSMCxyMAotCi0JLyogaW52YWxpZGF0ZSBpLWNhY2hlICovCi0JbWZzcHIJcjAsTDFDU1IxCi0Jb3JpCXIwLHIwLDB4MDAwMgotCW10c3ByCUwxQ1NSMSxyMAotCWlzeW5jCi0KLQkvKiBkaXNhYmxlIGktY2FjaGUgKi8KLQlsaQlyMCwweDAKLQltdHNwcglMMUNTUjEscjAKLQlpc3luYwotCi0JLyogY2xlYXIgcmVnaXN0ZXJzICovCi0JbGkJcjAsMAotCW10c3ByCVNSUjAscjAKLQltdHNwcglTUlIxLHIwCi0JbXRzcHIJQ1NSUjAscjAKLQltdHNwcglDU1JSMSxyMAotCW10c3ByCU1DU1JSMCxyMAotCW10c3ByCU1DU1JSMSxyMAotCi0JbXRzcHIJRVNSLHIwCi0JbXRzcHIJTUNTUixyMAotCW10c3ByCURFQVIscjAKLQotCS8qIG5vdCBuZWVkZWQgYW5kIGNvbmZsaWN0cyB3aXRoIHNvbWUgZGVidWdnZXJzICovCi0JLyogbXRzcHIJREJDUjAscjAgKi8KLQltdHNwcglEQkNSMSxyMAotCW10c3ByCURCQ1IyLHIwCi0JLyogbm90IG5lZWRlZCBhbmQgY29uZmxpY3RzIHdpdGggc29tZSBkZWJ1Z2dlcnMgKi8KLQkvKiBtdHNwcglJQUMxLHIwICovCi0JLyogbXRzcHIJSUFDMixyMCAqLwotCW10c3ByCURBQzEscjAKLQltdHNwcglEQUMyLHIwCisJLyogTDEgKi8KKwlsaQlyMCwyCisJbXRzcHIJTDFDU1IwLHIwCS8qIGludmFsaWRhdGUgZC1jYWNoZSAqLworCW10c3ByCUwxQ1NSMSxyMCAJLyogaW52YWxpZGF0ZSBpLWNhY2hlICovCiAKIAltZnNwcglyMSxEQlNSCiAJbXRzcHIJREJTUixyMQkJLyogQ2xlYXIgYWxsIHZhbGlkIGJpdHMgKi8KIAotCW10c3ByCVBJRDAscjAKLQltdHNwcglQSUQxLHIwCi0JbXRzcHIJUElEMixyMAotCW10c3ByCVRDUixyMAorCS8qCisJICoJRW5hYmxlIEwxIENhY2hlcyBlYXJseQorCSAqCisJICovCiAKLQltdHNwcglCVUNTUixyMAkvKiBkaXNhYmxlIGJyYW5jaCBwcmVkaWN0aW9uICovCi0JbXRzcHIJTUFTNCxyMAotCW10c3ByCU1BUzYscjAKLSNpZiBkZWZpbmVkKENPTkZJR19FTkFCTEVfMzZCSVRfUEhZUykKLQltdHNwcglNQVM3LHIwCi0jZW5kaWYKKwlsaXMJcjIsTDFDU1IwX0NQRUBICS8qIGVuYWJsZSBwYXJpdHkgKi8KKwlvcmkJcjIscjIsTDFDU1IwX0RDRQorCW10c3ByCUwxQ1NSMCxyMgkvKiBlbmFibGUgTDEgRGNhY2hlICovCiAJaXN5bmMKKwltdHNwcglMMUNTUjEscjIJLyogZW5hYmxlIEwxIEljYWNoZSAqLworCWlzeW5jCisJbXN5bmMKIAogCS8qIFNldHVwIGludGVycnVwdCB2ZWN0b3JzICovCiAJbGlzCXIxLFRFWFRfQkFTRUBoCi0JbXRzcHIgSVZQUiwgcjEKKwltdHNwcglJVlBSLHIxCiAKIAlsaQlyMSwweDAxMDAKIAltdHNwcglJVk9SMCxyMQkvKiAwOiBDcml0aWNhbCBpbnB1dCAqLwpAQCAtMjE3LDI2ICsxNDMsNiBAQAogCWxpCXIxLDB4MGYwMAogCW10c3ByCUlWT1IxNSxyMQkvKiAxNTogRGVidWcgKi8KIAotCS8qCi0JICogSW52YWxpZGF0ZSBNTVUgTDEvTDIKLQkgKgotCSAqIE5vdGU6IFRoZXJlIGlzIGEgZml4dXAgZWFybGllciBmb3IgRXJyYXRhIENQVTQgb24KLQkgKiBSZXYgMSBwYXJ0cyB0aGF0IG11c3QgcHJlY2VkZSB0aGlzIE1NVSBpbnZhbGlkYXRpb24uCi0JICovCi0JbGkJcjIsIDB4MDAxZQotCW10c3ByCU1NVUNTUjAsIHIyCi0JaXN5bmMKLQotCS8qCi0JICogSW52YWxpZGF0ZSBhbGwgVExCMCBlbnRyaWVzLgotCSAqLwotCWxpCXIzLDQKLQlsaQlyNCwwCi0JdGxiaXZheCByNCxyMwotCS8qCi0JICogVG8gYXZvaWQgUkVWMSBFcnJhdGEgQ1BVNiBpc3N1ZXMsIG1ha2Ugc3VyZQotCSAqIHRoZSBpbnN0cnVjdGlvbiBmb2xsb3dpbmcgdGxiaXZheCBpcyBub3QgYSBzdG9yZS4KLQkgKi8KIAogCS8qCiAJICogQWZ0ZXIgcmVzZXQsIENDU1JCQVIgaXMgbG9jYXRlZCBhdCBDRkdfQ0NTUkJBUl9ERUZBVUxULCBpLmUuCkBAIC0yNTQsMTQgKzE2MCwxNCBAQAogCWx3enUJcjQsMChyNSkJLyogaG93IG1hbnkgVExCMSBlbnRyaWVzIHdlIGFjdHVhbGx5IHVzZSAqLwogCW10Y3RyCXI0CiAKLTA6CWx3enUJcjAsNChyNSkKLQlsd3p1CXIxLDQocjUpCi0JbHd6dQlyMiw0KHI1KQotCWx3enUJcjMsNChyNSkKLQltdHNwcglNQVMwLHIwCi0JbXRzcHIJTUFTMSxyMQotCW10c3ByCU1BUzIscjIKLQltdHNwcglNQVMzLHIzCiswOglsd3p1CXI2LDQocjUpCisJbHd6dQlyNyw0KHI1KQorCWx3enUJcjgsNChyNSkKKwlsd3p1CXI5LDQocjUpCisJbXRzcHIJTUFTMCxyNgorCW10c3ByCU1BUzEscjcKKwltdHNwcglNQVMyLHI4CisJbXRzcHIJTUFTMyxyOQogCWlzeW5jCiAJbXN5bmMKIAl0bGJ3ZQpAQCAtMjcxLDIyICsxNzcsMjIgQEAKIDE6CiAjaWYgKENGR19DQ1NSQkFSX0RFRkFVTFQgIT0gQ0ZHX0NDU1JCQVIpCiAJLyogU3BlY2lhbCBzZXF1ZW5jZSBuZWVkZWQgdG8gdXBkYXRlIENDU1JCQVIgaXRzZWxmICovCi0JbGlzCXI0LCBDRkdfQ0NTUkJBUl9ERUZBVUxUQGgKLQlvcmkJcjQsIHI0LCBDRkdfQ0NTUkJBUl9ERUZBVUxUQGwKKwlsaXMJcjQsQ0ZHX0NDU1JCQVJfREVGQVVMVEBoCisJb3JpCXI0LHI0LENGR19DQ1NSQkFSX0RFRkFVTFRAbAogCi0JbGlzCXI1LCBDRkdfQ0NTUkJBUkBoCi0Jb3JpCXI1LCByNSwgQ0ZHX0NDU1JCQVJAbAorCWxpcwlyNSxDRkdfQ0NTUkJBUkBoCisJb3JpCXI1LHI1LENGR19DQ1NSQkFSQGwKIAlzcndpCXI2LHI1LDEyCi0Jc3R3CXI2LCAwKHI0KQorCXN0dwlyNiwwKHI0KQogCWlzeW5jCiAKLQlsaXMJcjUsIDB4ZmZmZgorCWxpcwlyNSwweGZmZmYKIAlvcmkJcjUscjUsMHhmMDAwCi0JbHd6CXI1LCAwKHI1KQorCWx3eglyNSwwKHI1KQogCWlzeW5jCiAKLQlsaXMJcjMsIENGR19DQ1NSQkFSQGgKLQlsd3oJcjUsIENGR19DQ1NSQkFSQGwocjMpCisJbGlzCXIzLENGR19DQ1NSQkFSQGgKKwlsd3oJcjUsQ0ZHX0NDU1JCQVJAbChyMykKIAlpc3luYwogI2VuZGlmCiAKQEAgLTMwMCw4ICsyMDYsOCBAQAogCWx3enUJcjUsMChyNikJLyogaG93IG1hbnkgd2luZG93cyB3ZSBhY3R1YWxseSB1c2UgKi8KIAltdGN0cglyNQogCi0JbGkJcjIsMHgwYzI4CS8qIHRoZSBmaXJzdCBwYWlyIGlzIHJlc2VydmVkIGZvciBib290LW92ZXItcmlvLW9yLXBjaSAqLwotCWxpCXIxLDB4MGMzMAorCWxpCXIyLDB4MGMyOAkvKiB0aGUgZmlyc3QgcGFpciBpcyByZXNlcnZlZCBmb3IgKi8KKwlsaQlyMSwweDBjMzAJLyogYm9vdC1vdmVyLXJpby1vci1wY2kgKi8KIAogMDoJbHd6dQlyNCw0KHI2KQogCWx3enUJcjMsNChyNikKQEAgLTMxMSwzMSArMjE3LDYgQEAKIAlhZGRpCXIxLHIxLDB4MDAyMAogCWJkbnoJMGIKIAotCS8qIEp1bXAgb3V0IHRoZSBsYXN0IDRLIHBhZ2UgYW5kIGNvbnRpbnVlIHRvICdub3JtYWwnIHN0YXJ0ICovCi0xOglibAkzZgotCWIJX3N0YXJ0Ci0KLTM6CWxpCXIwLDAKLQltdHNwcglTUlIxLHIwCQkvKiBLZWVwIHRoaW5ncyBkaXNhYmxlZCBmb3Igbm93ICovCi0JbWZscglyMQotCW10c3ByCVNSUjAscjEKLQlyZmkKLQotLyoKLSAqIHIzIC0gMXN0IGFyZyB0byBib2FyZF9pbml0KCk6IElNTVAgcG9pbnRlcgotICogcjQgLSAybmQgYXJnIHRvIGJvYXJkX2luaXQoKTogYm9vdCBmbGFnCi0gKi8KLQkudGV4dAotCS5sb25nCTB4MjcwNTE5NTYJCS8qIFUtQk9PVCBNYWdpYyBOdW1iZXIJCQkqLwotCS5nbG9ibAl2ZXJzaW9uX3N0cmluZwotdmVyc2lvbl9zdHJpbmc6Ci0JLmFzY2lpIFVfQk9PVF9WRVJTSU9OCi0JLmFzY2lpICIgKCIsIF9fREFURV9fLCAiIC0gIiwgX19USU1FX18sICIpIgotCS5hc2NpaSBDT05GSUdfSURFTlRfU1RSSU5HLCAiXDAiCi0KLQkuID0gRVhDX09GRl9TWVNfUkVTRVQKLQkuZ2xvYmwJX3N0YXJ0Ci1fc3RhcnQ6CiAJLyogQ2xlYXIgYW5kIHNldCB1cCBzb21lIHJlZ2lzdGVycy4gKi8KIAlsaQlyMCwweDAwMDAKIAlsaXMJcjEsMHhmZmZmCkBAIC0zNTQsMTcgKzIzNSwxNCBAQAogCiAJLyogRW5hYmxlIFRpbWUgQmFzZSBhbmQgU2VsZWN0IFRpbWUgQmFzZSBDbG9jayAqLwogCWxpcwlyMCxISUQwX0VNQ1BAaAkJLyogRW5hYmxlIG1hY2hpbmUgY2hlY2sgKi8KLQlvcmkJcjAscjAsMHg0MDAwCQkvKiB0aW1lIGJhc2UgaXMgcHJvY2Vzc29yIGNsb2NrICovCiAjaWYgZGVmaW5lZChDT05GSUdfRU5BQkxFXzM2QklUX1BIWVMpCi0Jb3JpCXIwLHIwLDB4MDA4MAkJLyogZW5hYmxlIE1BUzcgdXBkYXRlcyAqLworCW9yaQlyMCxyMCwoSElEMF9UQkVOfEhJRDBfRU5NQVM3KUBsCS8qIEVuYWJsZSBUaW1lYmFzZSAmIE1BUzcgKi8KKyNlbHNlCisJb3JpCXIwLHIwLEhJRDBfVEJFTkBsCS8qIGVuYWJsZSBUaW1lYmFzZSAqLwogI2VuZGlmCiAJbXRzcHIJSElEMCxyMAogCi0jaWYgZGVmaW5lZChDT05GSUdfQUREUl9TVFJFQU1JTkcpCi0JbGkJcjAsMHgzMDAwCi0jZWxzZQotCWxpCXIwLDB4MTAwMAotI2VuZGlmCisJbGkJcjAsKEhJRDFfQVNUTUV8SElEMV9BQkUpQGwJLyogQWRkciBzdHJlYW1pbmcgJiBicm9hZGNhc3QgKi8KIAltdHNwcglISUQxLHIwCiAKIAkvKiBFbmFibGUgQnJhbmNoIFByZWRpY3Rpb24gKi8KQEAgLTM4MywzNyArMjYxLDUzIEBACiAjZW5kaWYKIAogLyogTDEgRENhY2hlIGlzIHVzZWQgZm9yIGluaXRpYWwgUkFNICovCi0JbWZzcHIJcjIsIEwxQ1NSMAotCW9yaQlyMiwgcjIsIDB4MDAwMwotCW9yaXMJcjIsIHIyLCAweDAwMDEKLQltdHNwcglMMUNTUjAsIHIyCS8qIGVuYWJsZS9pbnZhbGlkYXRlIEwxIERjYWNoZSAqLwotCWlzeW5jCiAKIAkvKiBBbGxvY2F0ZSBJbml0aWFsIFJBTSBpbiBkYXRhIGNhY2hlLgogCSAqLwotCWxpcwlyMywgQ0ZHX0lOSVRfUkFNX0FERFJAaAotCW9yaQlyMywgcjMsIENGR19JTklUX1JBTV9BRERSQGwKLQlsaQlyMiwgNTEyIC8qIDUxMiozMj0xNksgKi8KKwlsaXMJcjMsQ0ZHX0lOSVRfUkFNX0FERFJAaAorCW9yaQlyMyxyMyxDRkdfSU5JVF9SQU1fQUREUkBsCisJbGkJcjIsNTEyIC8qIDUxMiozMj0xNksgKi8KIAltdGN0cglyMgotCWxpCXIwLCAwCisJbGkJcjAsMAogMToKLQlkY2J6CXIwLCByMwotCWRjYnRscwkwLHIwLCByMwotCWFkZGkJcjMsIHIzLCAzMgorCWRjYnoJcjAscjMKKwlkY2J0bHMJMCxyMCxyMworCWFkZGkJcjMscjMsMzIKIAliZG56CTFiCiAKLSNpZm5kZWYgQ0ZHX1JBTUJPT1QKKwkvKiBKdW1wIG91dCB0aGUgbGFzdCA0SyBwYWdlIGFuZCBjb250aW51ZSB0byAnbm9ybWFsJyBzdGFydCAqLworI2lmZGVmIENGR19SQU1CT09UCisJYmwJM2YKKwliCV9zdGFydF9jb250CisjZWxzZQogCS8qIENhbGN1bGF0ZSBhYnNvbHV0ZSBhZGRyZXNzIGluIEZMQVNIIGFuZCBqdW1wIHRoZXJlCQkqLwogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCWxpcwlyMywgQ0ZHX01PTklUT1JfQkFTRUBoCi0Jb3JpCXIzLCByMywgQ0ZHX01PTklUT1JfQkFTRUBsCi0JYWRkaQlyMywgcjMsIGluX2ZsYXNoIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaXMJcjMsQ0ZHX01PTklUT1JfQkFTRUBoCisJb3JpCXIzLHIzLENGR19NT05JVE9SX0JBU0VAbAorCWFkZGkJcjMscjMsX3N0YXJ0X2NvbnQgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCiAJbXRscglyMwotCWJscgorI2VuZGlmCiAKLWluX2ZsYXNoOgotI2VuZGlmCS8qIENGR19SQU1CT09UICovCiszOglsaQlyMCwwCisJbXRzcHIJU1JSMSxyMAkJLyogS2VlcCB0aGluZ3MgZGlzYWJsZWQgZm9yIG5vdyAqLworCW1mbHIJcjEKKwltdHNwcglTUlIwLHIxCisJcmZpCisJaXN5bmMKIAorCS50ZXh0CisJLmdsb2JsCV9zdGFydAorX3N0YXJ0OgorCS5sb25nCTB4MjcwNTE5NTYJCS8qIFUtQk9PVCBNYWdpYyBOdW1iZXIgKi8KKwkuZ2xvYmwJdmVyc2lvbl9zdHJpbmcKK3ZlcnNpb25fc3RyaW5nOgorCS5hc2NpaSBVX0JPT1RfVkVSU0lPTgorCS5hc2NpaSAiICgiLCBfX0RBVEVfXywgIiAtICIsIF9fVElNRV9fLCAiKSIKKwkuYXNjaWkgQ09ORklHX0lERU5UX1NUUklORywgIlwwIgorCisJLmFsaWduCTQKKwkuZ2xvYmwJX3N0YXJ0X2NvbnQKK19zdGFydF9jb250OgogCS8qIFNldHVwIHRoZSBzdGFjayBpbiBpbml0aWFsIFJBTSxjb3VsZCBiZSBMMi1hcy1TUkFNIG9yIEwxIGRjYWNoZSovCiAJbGlzCXIxLENGR19JTklUX1JBTV9BRERSQGgKIAlvcmkJcjEscjEsQ0ZHX0lOSVRfU1BfT0ZGU0VUQGwKQEAgLTQyNCwyNiArMzE4LDI0IEBACiAKIAlzdHd1CXIxLC04KHIxKQkJLyogU2F2ZSBiYWNrIGNoYWluIGFuZCBtb3ZlIFNQICovCiAJbGlzCXIwLFJFU0VUX1ZFQ1RPUkBoCS8qIEFkZHJlc3Mgb2YgcmVzZXQgdmVjdG9yICovCi0Jb3JpCXIwLHIwLCBSRVNFVF9WRUNUT1JAbAorCW9yaQlyMCxyMCxSRVNFVF9WRUNUT1JAbAogCXN0d3UJcjEsLTgocjEpCQkvKiBTYXZlIGJhY2sgY2hhaW4gYW5kIG1vdmUgU1AgKi8KIAlzdHcJcjAsKzEyKHIxKQkJLyogU2F2ZSByZXR1cm4gYWRkciAodW5kZXJmbG93IHZlY3QpICovCiAKIAlHRVRfR09UCiAJYmwJY3B1X2luaXRfZgotCWJsCWljYWNoZV9lbmFibGUKIAlibAlib2FyZF9pbml0X2YKIAlpc3luYwogCi0vKiAtLUZJWE1FLS0gbWFjaGluZSBjaGVjayB3aXRoIE1DU1JSbiBhbmQgcmZtY2kgKi8KLQorCS4gPSBFWENfT0ZGX1NZU19SRVNFVAogCS5nbG9ibAlfc3RhcnRfb2ZfdmVjdG9ycwogX3N0YXJ0X29mX3ZlY3RvcnM6Ci0jaWYgMAorCiAvKiBDcml0aWNhbCBpbnB1dC4gKi8KLQlDUklUX0VYQ0VQVElPTigweDAxMDAsIENyaXRjYWxJbnB1dCwgQ3JpdGNhbElucHV0RXhjZXB0aW9uKQotI2VuZGlmCi0vKiBNYWNoaW5lIGNoZWNrIC0tRklYTUUtLSBTaG91bGQgYmUgTUFDSF9FWENFUFRJT04gKi8KLQlDUklUX0VYQ0VQVElPTigweDAyMDAsIE1hY2hpbmVDaGVjaywgTWFjaGluZUNoZWNrRXhjZXB0aW9uKQorCUNSSVRfRVhDRVBUSU9OKDB4MDEwMCwgQ3JpdGljYWxJbnB1dCwgQ3JpdGNhbElucHV0RXhjZXB0aW9uKQorCisvKiBNYWNoaW5lIGNoZWNrICovCisJTUNLX0VYQ0VQVElPTigweDIwMCwgTWFjaGluZUNoZWNrLCBNYWNoaW5lQ2hlY2tFeGNlcHRpb24pCiAKIC8qIERhdGEgU3RvcmFnZSBleGNlcHRpb24uICovCiAJU1REX0VYQ0VQVElPTigweDAzMDAsIERhdGFTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQpAQCAtNDUyLDcgKzM0NCw3IEBACiAJU1REX0VYQ0VQVElPTigweDA0MDAsIEluc3RTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQogCiAvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgZXhjZXB0aW9uLiAqLwotCVNURF9FWENFUFRJT04oMHgwNTAwLCBFeHRJbnRlcnJ1cHQsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDA1MDAsIEV4dEludGVycnVwdCwgRXh0SW50RXhjZXB0aW9uKQogCiAvKiBBbGlnbm1lbnQgZXhjZXB0aW9uLiAqLwogCS4gPSAweDA2MDAKQEAgLTQ2OSw4ICszNjEsOCBAQAogCW10bHIJcjYKIAlibHJsCiAuTF9BbGlnbm1lbnQ6Ci0JLmxvbmcJQWxpZ25tZW50RXhjZXB0aW9uIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKLQkubG9uZwlpbnRfcmV0dXJuIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwkubG9uZwlBbGlnbm1lbnRFeGNlcHRpb24gLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisJLmxvbmcJaW50X3JldHVybiAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKIAogLyogUHJvZ3JhbSBjaGVjayBleGNlcHRpb24gKi8KIAkuID0gMHgwNzAwCkBAIC00ODMsOCArMzc1LDggQEAKIAltdGxyCXI2CiAJYmxybAogLkxfUHJvZ3JhbUNoZWNrOgotCS5sb25nCVByb2dyYW1DaGVja0V4Y2VwdGlvbiAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCi0JLmxvbmcJaW50X3JldHVybiAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJLmxvbmcJUHJvZ3JhbUNoZWNrRXhjZXB0aW9uIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCS5sb25nCWludF9yZXR1cm4gLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCiAKIAkvKiBObyBGUFUgb24gTVBDODV4eC4gIFRoaXMgZXhjZXB0aW9uIGlzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW4uCiAJKi8KQEAgLTQ5NiwyMyArMzg4LDIzIEBACiAgKiByMy0uLi4gYXJndW1lbnRzCiAgKi8KIFN5c3RlbUNhbGw6Ci0JYWRkaXMJcjExLHIwLDAJCS8qIGdldCBmdW5jdGlvbnMgdGFibGUgYWRkciAqLwotCW9yaQlyMTEscjExLDAJCS8qIE5vdGU6IHRoaXMgY29kZSBpcyBwYXRjaGVkIGluIHRyYXBfaW5pdCAqLwotCWFkZGlzCXIxMixyMCwwCQkvKiBnZXQgbnVtYmVyIG9mIGZ1bmN0aW9ucyAqLworCWFkZGlzCXIxMSxyMCwwCS8qIGdldCBmdW5jdGlvbnMgdGFibGUgYWRkciAqLworCW9yaQlyMTEscjExLDAJLyogTm90ZTogdGhpcyBjb2RlIGlzIHBhdGNoZWQgaW4gdHJhcF9pbml0ICovCisJYWRkaXMJcjEyLHIwLDAJLyogZ2V0IG51bWJlciBvZiBmdW5jdGlvbnMgKi8KIAlvcmkJcjEyLHIxMiwwCiAKLQljbXBsdwkwLCByMCwgcjEyCisJY21wbHcJMCxyMCxyMTIKIAliZ2UJMWYKIAotCXJsd2lubQlyMCxyMCwyLDAsMzEJCS8qIGZuX2FkZHIgPSBmbl90YmxbcjBdICovCisJcmx3aW5tCXIwLHIwLDIsMCwzMQkvKiBmbl9hZGRyID0gZm5fdGJsW3IwXSAqLwogCWFkZAlyMTEscjExLHIwCiAJbHd6CXIxMSwwKHIxMSkKIAotCWxpCXIyMCwweGQwMC00CQkvKiBHZXQgc3RhY2sgcG9pbnRlciAqLworCWxpCXIyMCwweGQwMC00CS8qIEdldCBzdGFjayBwb2ludGVyICovCiAJbHd6CXIxMiwwKHIyMCkKLQlzdWJpCXIxMixyMTIsMTIJCS8qIEFkanVzdCBzdGFjayBwb2ludGVyICovCisJc3ViaQlyMTIscjEyLDEyCS8qIEFkanVzdCBzdGFjayBwb2ludGVyICovCiAJbGkJcjAsMHhjMDArX2VuZF9iYWNrLVN5c3RlbUNhbGwKLQljbXBsdwkwLCByMCwgcjEyCQkvKiBDaGVjayBzdGFjayBvdmVyZmxvdyAqLworCWNtcGx3CTAscjAscjEyCS8qIENoZWNrIHN0YWNrIG92ZXJmbG93ICovCiAJYmd0CTFmCiAJc3R3CXIxMiwwKHIyMCkKIApAQCAtNTcwLDcgKzQ2Miw3IEBACiBfZW5kX29mX3ZlY3RvcnM6CiAKIAotCS4gPSAweDIxMDAKKwkuID0gLiArICgweDEwMCAtICggLiAmIDB4ZmYgKSkJLyogYWxpZ24gZm9yIGRlYnVnICovCiAKIC8qCiAgKiBUaGlzIGNvZGUgZmluaXNoZXMgc2F2aW5nIHRoZSByZWdpc3RlcnMgdG8gdGhlIGV4Y2VwdGlvbiBmcmFtZQpAQCAtNjU1LDI2ICs1NDcsNTggQEAKIAlSRVNUX0dQUigzMSwgcjEpCiAJbHd6CXIyLF9OSVAocjEpCS8qIFJlc3RvcmUgZW52aXJvbm1lbnQgKi8KIAlsd3oJcjAsX01TUihyMSkKLQltdHNwcgk5OTAscjIJCS8qIFNSUjIgKi8KLQltdHNwcgk5OTEscjAJCS8qIFNSUjMgKi8KKwltdHNwcglTUFJOX0NTUlIwLHIyCisJbXRzcHIJU1BSTl9DU1JSMSxyMAogCWx3eglyMCxHUFIwKHIxKQogCWx3eglyMixHUFIyKHIxKQogCWx3eglyMSxHUFIxKHIxKQogCVNZTkMKIAlyZmNpCiAKK21ja19yZXR1cm46CisJbWZtc3IJcjI4CQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlsaQlyNCwwCisJb3JpCXI0LHI0LE1TUl9FRQorCWFuZGMJcjI4LHIyOCxyNAorCVNZTkMJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMjgKKwlTWU5DCisJbHd6CXIyLF9DVFIocjEpCisJbHd6CXIwLF9MSU5LKHIxKQorCW10Y3RyCXIyCisJbXRscglyMAorCWx3eglyMixfWEVSKHIxKQorCWx3eglyMCxfQ0NSKHIxKQorCW10c3ByCVhFUixyMgorCW10Y3JmCTB4RkYscjAKKwlSRVNUXzEwR1BSUygzLCByMSkKKwlSRVNUXzEwR1BSUygxMywgcjEpCisJUkVTVF84R1BSUygyMywgcjEpCisJUkVTVF9HUFIoMzEsIHIxKQorCWx3eglyMixfTklQKHIxKQkvKiBSZXN0b3JlIGVudmlyb25tZW50ICovCisJbHd6CXIwLF9NU1IocjEpCisJbXRzcHIJU1BSTl9NQ1NSUjAscjIKKwltdHNwcglTUFJOX01DU1JSMSxyMAorCWx3eglyMCxHUFIwKHIxKQorCWx3eglyMixHUFIyKHIxKQorCWx3eglyMSxHUFIxKHIxKQorCVNZTkMKKwlyZm1jaQorCiAvKiBDYWNoZSBmdW5jdGlvbnMuCiAqLwogaW52YWxpZGF0ZV9pY2FjaGU6CiAJbWZzcHIJcjAsTDFDU1IxCi0Jb3JpCXIwLHIwLDB4MDAwMgorCW9yaQlyMCxyMCxMMUNTUjFfSUNGSQorCW1zeW5jCisJaXN5bmMKIAltdHNwcglMMUNTUjEscjAKIAlpc3luYwotCWJscgkJCQkvKiAgIGVudGlyZSBJIGNhY2hlICovCisJYmxyCQkJCS8qIGVudGlyZSBJIGNhY2hlICovCiAKIGludmFsaWRhdGVfZGNhY2hlOgogCW1mc3ByCXIwLEwxQ1NSMAotCW9yaQlyMCxyMCwweDAwMDIKKwlvcmkJcjAscjAsTDFDU1IwX0RDRkkKIAltc3luYwogCWlzeW5jCiAJbXRzcHIJTDFDU1IwLHIwCkBAIC02OTcsOSArNjIxLDkgQEAKIAkuZ2xvYmwJaWNhY2hlX2Rpc2FibGUKIGljYWNoZV9kaXNhYmxlOgogCW1mc3ByCXIwLEwxQ1NSMQotCWxpcwlyMSwweGZmZmZmZmZlQGgKLQlvcmkJcjEscjEsMHhmZmZmZmZmZUBsCi0JYW5kCXIwLHIwLHIxCisJbGlzCXIzLDAKKwlvcmkJcjMscjMsTDFDU1IxX0lDRQorCWFuZGMJcjAscjAscjMKIAltdHNwcglMMUNTUjEscjAKIAlpc3luYwogCWJscgpAQCAtNzA3LDcgKzYzMSw3IEBACiAJLmdsb2JsCWljYWNoZV9zdGF0dXMKIGljYWNoZV9zdGF0dXM6CiAJbWZzcHIJcjMsTDFDU1IxCi0JYW5kaS4JcjMscjMsMQorCWFuZGkuCXIzLHIzLEwxQ1NSMV9JQ0UKIAlibHIKIAogCS5nbG9ibAlkY2FjaGVfZW5hYmxlCkBAIC03MjcsMTIgKzY1MSwxMCBAQAogCiAJLmdsb2JsCWRjYWNoZV9kaXNhYmxlCiBkY2FjaGVfZGlzYWJsZToKLQltZnNwcglyMCxMMUNTUjAKLQlsaXMJcjEsMHhmZmZmZmZmZUBoCi0Jb3JpCXIxLHIxLDB4ZmZmZmZmZmVAbAotCWFuZAlyMCxyMCxyMQotCW1zeW5jCi0JaXN5bmMKKwltZnNwcglyMyxMMUNTUjAKKwlsaXMJcjQsMAorCW9yaQlyNCxyNCxMMUNTUjBfRENFCisJYW5kYwlyMyxyMyxyNAogCW10c3ByCUwxQ1NSMCxyMAogCWlzeW5jCiAJYmxyCkBAIC03NDAsMjcgKzY2MiwyNyBAQAogCS5nbG9ibAlkY2FjaGVfc3RhdHVzCiBkY2FjaGVfc3RhdHVzOgogCW1mc3ByCXIzLEwxQ1NSMAotCWFuZGkuCXIzLHIzLDEKKwlhbmRpLglyMyxyMyxMMUNTUjBfRENFCiAJYmxyCiAKIAkuZ2xvYmwgZ2V0X3BpcgogZ2V0X3BpcjoKLQltZnNwcglyMywgUElSCisJbWZzcHIJcjMsUElSCiAJYmxyCiAKIAkuZ2xvYmwgZ2V0X3B2cgogZ2V0X3B2cjoKLQltZnNwcglyMywgUFZSCisJbWZzcHIJcjMsUFZSCiAJYmxyCiAKIAkuZ2xvYmwgZ2V0X3N2cgogZ2V0X3N2cjoKLQltZnNwcglyMywgU1ZSCisJbWZzcHIJcjMsU1ZSCiAJYmxyCiAKIAkuZ2xvYmwgd3JfdGNyCiB3cl90Y3I6Ci0JbXRzcHIJVENSLCByMworCW10c3ByCVRDUixyMwogCWJscgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTkxMywxNiArODM1LDE2IEBACiAgKi8KIAkuZ2xvYmwJcmVsb2NhdGVfY29kZQogcmVsb2NhdGVfY29kZToKLQltcglyMSwgIHIzCQkvKiBTZXQgbmV3IHN0YWNrIHBvaW50ZXIJCSovCi0JbXIJcjksICByNAkJLyogU2F2ZSBjb3B5IG9mIEluaXQgRGF0YSBwb2ludGVyCSovCi0JbXIJcjEwLCByNQkJLyogU2F2ZSBjb3B5IG9mIERlc3RpbmF0aW9uIEFkZHJlc3MJKi8KKwltcglyMSxyMwkJLyogU2V0IG5ldyBzdGFjayBwb2ludGVyCQkqLworCW1yCXI5LHI0CQkvKiBTYXZlIGNvcHkgb2YgSW5pdCBEYXRhIHBvaW50ZXIJKi8KKwltcglyMTAscjUJCS8qIFNhdmUgY29weSBvZiBEZXN0aW5hdGlvbiBBZGRyZXNzCSovCiAKLQltcglyMywgIHI1CQkJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MJKi8KLQlsaXMJcjQsIENGR19NT05JVE9SX0JBU0VAaAkJLyogU291cmNlICAgICAgQWRkcmVzcwkqLwotCW9yaQlyNCwgcjQsIENGR19NT05JVE9SX0JBU0VAbAorCW1yCXIzLHI1CQkJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MJKi8KKwlsaXMJcjQsQ0ZHX01PTklUT1JfQkFTRUBoCQkvKiBTb3VyY2UgICAgICBBZGRyZXNzCSovCisJb3JpCXI0LHI0LENGR19NT05JVE9SX0JBU0VAbAogCWx3eglyNSxHT1QoX19pbml0X2VuZCkKIAlzdWIJcjUscjUscjQKLQlsaQlyNiwgQ0ZHX0NBQ0hFTElORV9TSVpFCQkvKiBDYWNoZSBMaW5lIFNpemUJKi8KKwlsaQlyNixDRkdfQ0FDSEVMSU5FX1NJWkUJCS8qIENhY2hlIExpbmUgU2l6ZQkqLwogCiAJLyoKIAkgKiBGaXggR09UIHBvaW50ZXI6CkBAIC05MzEsMTIgKzg1MywxMiBAQAogCSAqCiAJICogT2Zmc2V0OgogCSAqLwotCXN1YglyMTUsIHIxMCwgcjQKKwlzdWIJcjE1LHIxMCxyNAogCiAJLyogRmlyc3Qgb3VyIG93biBHT1QgKi8KLQlhZGQJcjE0LCByMTQsIHIxNQorCWFkZAlyMTQscjE0LHIxNQogCS8qIHRoZSB0aGUgb25lIHVzZWQgYnkgdGhlIEMgY29kZSAqLwotCWFkZAlyMzAsIHIzMCwgcjE1CisJYWRkCXIzMCxyMzAscjE1CiAKIAkvKgogCSAqIE5vdyByZWxvY2F0ZSBjb2RlCkBAIC05OTcsMTAgKzkxOSwxMCBAQAogICogaW5pdGlhbGl6YXRpb24sIG5vdyBydW5uaW5nIGZyb20gUkFNLgogICovCiAKLQlhZGRpCXIwLCByMTAsIGluX3JhbSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJYWRkaQlyMCxyMTAsaW5fcmFtIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAogCW10bHIJcjAKIAlibHIJCQkJLyogTkVWRVIgUkVUVVJOUyEgKi8KLQorCS5nbG9ibAlpbl9yYW0KIGluX3JhbToKIAogCS8qCkBAIC0xMDQ0LDE5ICs5NjYsMTkgQEAKIAlsd3oJcjMsR09UKF9fYnNzX3N0YXJ0KQogCWx3eglyNCxHT1QoX2VuZCkKIAotCWNtcGx3CTAsIHIzLCByNAorCWNtcGx3CTAscjMscjQKIAliZXEJNmYKIAotCWxpCXIwLCAwCisJbGkJcjAsMAogNToKLQlzdHcJcjAsIDAocjMpCi0JYWRkaQlyMywgcjMsIDQKLQljbXBsdwkwLCByMywgcjQKKwlzdHcJcjAsMChyMykKKwlhZGRpCXIzLHIzLDQKKwljbXBsdwkwLHIzLHI0CiAJYm5lCTViCiA2OgogCi0JbXIJcjMsIHI5CQkvKiBJbml0IERhdGEgcG9pbnRlcgkJKi8KLQltcglyNCwgcjEwCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzCQkqLworCW1yCXIzLHI5CQkvKiBJbml0IERhdGEgcG9pbnRlcgkJKi8KKwltcglyNCxyMTAJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MJCSovCiAJYmwJYm9hcmRfaW5pdF9yCiAKIAkvKgpAQCAtMTA2Nyw1MiArOTg5LDU0IEBACiAJICovCiAJLmdsb2JsCXRyYXBfaW5pdAogdHJhcF9pbml0OgotCWx3eglyNywgR09UKF9zdGFydCkKLQlsd3oJcjgsIEdPVChfZW5kX29mX3ZlY3RvcnMpCisJbHd6CXI3LEdPVChfc3RhcnRfb2ZfdmVjdG9ycykKKwlsd3oJcjgsR09UKF9lbmRfb2ZfdmVjdG9ycykKIAotCWxpCXI5LCAweDEwMAkJLyogcmVzZXQgdmVjdG9yIGFsd2F5cyBhdCAweDEwMCAqLworCWxpCXI5LDB4MTAwCQkvKiByZXNldCB2ZWN0b3IgYWx3YXlzIGF0IDB4MTAwICovCiAKLQljbXBsdwkwLCByNywgcjgKKwljbXBsdwkwLHI3LHI4CiAJYmdlbHIJCQkJLyogcmV0dXJuIGlmIHI3Pj1yOCAtIGp1c3QgaW4gY2FzZSAqLwogCiAJbWZscglyNAkJCS8qIHNhdmUgbGluayByZWdpc3RlcgkJKi8KIDE6Ci0JbHd6CXIwLCAwKHI3KQotCXN0dwlyMCwgMChyOSkKLQlhZGRpCXI3LCByNywgNAotCWFkZGkJcjksIHI5LCA0Ci0JY21wbHcJMCwgcjcsIHI4CisJbHd6CXIwLDAocjcpCisJc3R3CXIwLDAocjkpCisJYWRkaQlyNyxyNyw0CisJYWRkaQlyOSxyOSw0CisJY21wbHcJMCxyNyxyOAogCWJuZQkxYgogCiAJLyoKIAkgKiByZWxvY2F0ZSBgaGRscicgYW5kIGBpbnRfcmV0dXJuJyBlbnRyaWVzCiAJICovCi0JbGkJcjcsIC5MX01hY2hpbmVDaGVjayAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjcsLkxfQ3JpdGljYWxJbnB1dCAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKIAlibAl0cmFwX3JlbG9jCi0JbGkJcjcsIC5MX0RhdGFTdG9yYWdlIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyNywuTF9NYWNoaW5lQ2hlY2sgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCiAJYmwJdHJhcF9yZWxvYwotCWxpCXI3LCAuTF9JbnN0U3RvcmFnZSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjcsLkxfRGF0YVN0b3JhZ2UgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCiAJYmwJdHJhcF9yZWxvYwotCWxpCXI3LCAuTF9FeHRJbnRlcnJ1cHQgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI3LC5MX0luc3RTdG9yYWdlIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAogCWJsCXRyYXBfcmVsb2MKLQlsaQlyNywgLkxfQWxpZ25tZW50IC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyNywuTF9FeHRJbnRlcnJ1cHQgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCiAJYmwJdHJhcF9yZWxvYwotCWxpCXI3LCAuTF9Qcm9ncmFtQ2hlY2sgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI3LC5MX0FsaWdubWVudCAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKIAlibAl0cmFwX3JlbG9jCi0JbGkJcjcsIC5MX0ZQVW5hdmFpbGFibGUgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI3LC5MX1Byb2dyYW1DaGVjayAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKIAlibAl0cmFwX3JlbG9jCi0JbGkJcjcsIC5MX0RlY3JlbWVudGVyIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyNywuTF9GUFVuYXZhaWxhYmxlIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAogCWJsCXRyYXBfcmVsb2MKLQlsaQlyNywgLkxfSW50ZXJ2YWxUaW1lciAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCi0JbGkJcjgsIF9lbmRfb2ZfdmVjdG9ycyAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjcsLkxfRGVjcmVtZW50ZXIgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisJYmwJdHJhcF9yZWxvYworCWxpCXI3LC5MX0ludGVydmFsVGltZXIgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisJbGkJcjgsX2VuZF9vZl92ZWN0b3JzIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAogMjoKIAlibAl0cmFwX3JlbG9jCi0JYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KLQljbXBsdwkwLCByNywgcjgKKwlhZGRpCXI3LHI3LDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLHI3LHI4CiAJYmx0CTJiCiAKIAlsaXMJcjcsMHgwCi0JbXRzcHIJSVZQUiwgcjcKKwltdHNwcglJVlBSLHI3CiAKIAltdGxyCXI0CQkJLyogcmVzdG9yZSBsaW5rIHJlZ2lzdGVyCSovCiAJYmxyCkBAIC0xMTIxLDEzICsxMDQ1LDEzIEBACiAJICogRnVuY3Rpb246IHJlbG9jYXRlIGVudHJpZXMgZm9yIG9uZSBleGNlcHRpb24gdmVjdG9yCiAJICovCiB0cmFwX3JlbG9jOgotCWx3eglyMCwgMChyNykJCS8qIGhkbHIgLi4uCQkJKi8KLQlhZGQJcjAsIHIwLCByMwkJLyogIC4uLiArPSBkZXN0X2FkZHIJCSovCi0Jc3R3CXIwLCAwKHI3KQorCWx3eglyMCwwKHI3KQkJLyogaGRsciAuLi4JCQkqLworCWFkZAlyMCxyMCxyMwkJLyogIC4uLiArPSBkZXN0X2FkZHIJCSovCisJc3R3CXIwLDAocjcpCiAKLQlsd3oJcjAsIDQocjcpCQkvKiBpbnRfcmV0dXJuIC4uLgkJKi8KLQlhZGQJcjAsIHIwLCByMwkJLyogIC4uLiArPSBkZXN0X2FkZHIJCSovCi0Jc3R3CXIwLCA0KHI3KQorCWx3eglyMCw0KHI3KQkJLyogaW50X3JldHVybiAuLi4JCSovCisJYWRkCXIwLHIwLHIzCQkvKiAgLi4uICs9IGRlc3RfYWRkcgkJKi8KKwlzdHcJcjAsNChyNykKIAogCWJscgogCkBAIC0xMTM1LDEzICsxMDU5LDEzIEBACiAuZ2xvYmwgdW5sb2NrX3JhbV9pbl9jYWNoZQogdW5sb2NrX3JhbV9pbl9jYWNoZToKIAkvKiBpbnZhbGlkYXRlIHRoZSBJTklUX1JBTSBzZWN0aW9uICovCi0JbGlzCXIzLCAoQ0ZHX0lOSVRfUkFNX0FERFIgJiB+MzEpQGgKLQlvcmkJcjMsIHIzLCAoQ0ZHX0lOSVRfUkFNX0FERFIgJiB+MzEpQGwKLQlsaQlyMiw1MTIKLQltdGN0cglyMgotMToJaWNiaQlyMCwgcjMKLQlkY2JpCXIwLCByMwotCWFkZGkJcjMsIHIzLCAzMgorCWxpcwlyMywoQ0ZHX0lOSVRfUkFNX0FERFIgJiB+MzEpQGgKKwlvcmkJcjMscjMsKENGR19JTklUX1JBTV9BRERSICYgfjMxKUBsCisJbGkJcjQsNTEyCisJbXRjdHIJcjQKKzE6CWljYmkJcjAscjMKKwlkY2JpCXIwLHIzCisJYWRkaQlyMyxyMywzMgogCWJkbnoJMWIKIAlzeW5jCQkJLyogV2FpdCBmb3IgYWxsIGljYmkgdG8gY29tcGxldGUgb24gYnVzICovCiAJaXN5bmMKZGlmZiAtLWdpdCBhL2NwdS9tcGM4NXh4L3RyYXBzLmMgYi9jcHUvbXBjODV4eC90cmFwcy5jCmluZGV4IDkwNGYwNTIuLmVmYzgwYzcgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4NXh4L3RyYXBzLmMKKysrIGIvY3B1L21wYzg1eHgvdHJhcHMuYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBsaW51eC9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYwogICoKKyAqIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgogICogQ29weXJpZ2h0IChDKSAyMDAzIE1vdG9yb2xhCiAgKiBNb2RpZmllZCBieSBYaWFuZ2h1YSBYaWFvKHgueGlhb0Btb3Rvcm9sYS5jb20pCiAgKgpAQCAtNDEsNyArNDIsNyBAQAogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiBpbnQgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikoc3RydWN0IHB0X3JlZ3MgKikgPSAwOwogI2VuZGlmCiAKQEAgLTc0LDcgKzc1LDcgQEAKICNkZWZpbmUgRVNSX0RJWiAweDAwNDAwMDAwCiAjZGVmaW5lIEVTUl9VMEYgMHgwMDAwODAwMAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiBleHRlcm4gdm9pZCBkb19iZWRidWdfYnJlYWtwb2ludChzdHJ1Y3QgcHRfcmVncyAqKTsKICNlbmRpZgogCkBAIC0xNDUsMTAgKzE0NiwxMyBAQAogCXBhbmljKCJDcml0aWNhbCBJbnB1dCBFeGNlcHRpb24iKTsKIH0KIAoraW50IG1hY2hpbmVjaGVja19jb3VudCA9IDA7CitpbnQgbWFjaGluZWNoZWNrX2Vycm9yID0gMDsKIHZvaWQKIE1hY2hpbmVDaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIGZpeHVwOworCXVuc2lnbmVkIGludCBtY3NyLCBtY3NycjAsIG1jc3JyMSwgbWNhcjsKIAogCS8qIFByb2JpbmcgUENJIHVzaW5nIGNvbmZpZyBjeWNsZXMgY2F1c2UgdGhpcyBleGNlcHRpb24KIAkgKiB3aGVuIGEgZGV2aWNlIGlzIG5vdCBwcmVzZW50LiAgQ2F0Y2ggaXQgYW5kIHJldHVybiB0bwpAQCAtMTU5LDQwICsxNjMsNjggQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisJbWNzcnIwID0gbWZzcHIoU1BSTl9NQ1NSUjApOworCW1jc3JyMSA9IG1mc3ByKFNQUk5fTUNTUlIxKTsKKwltY3NyID0gbWZzcHIoU1BSTl9NQ1NSKTsKKwltY2FyID0gbWZzcHIoU1BSTl9NQ0FSKTsKKworCW1hY2hpbmVjaGVja19jb3VudCsrOworCW1hY2hpbmVjaGVja19lcnJvcj0xOworCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKIAogCXByaW50ZigiTWFjaGluZSBjaGVjayBpbiBrZXJuZWwgbW9kZS5cbiIpOwotCXByaW50ZigiQ2F1c2VkIGJ5IChmcm9tIG1zcik6ICIpOwotCXByaW50ZigicmVncyAlcCAiLHJlZ3MpOwotCXN3aXRjaCggcmVncy0+bXNyICYgMHgwMDBGMDAwMCkgewotCWNhc2UgKDB4ODAwMDAwMDA+PjEyKToKLQkJcHJpbnRmKCJNYWNoaW5lIGNoZWNrIHNpZ25hbCAtIHByb2JhYmx5IGR1ZSB0byBtbSBmYXVsdFxuIgotCQkgICAgICAgIndpdGggbW11IG9mZlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgKDB4ODAwMDAwMDA+PjEzKToKLQkJcHJpbnRmKCJUcmFuc2ZlciBlcnJvciBhY2sgc2lnbmFsXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSAoMHg4MDAwMDAwMD4+MTQpOgotCQlwcmludGYoIkRhdGEgcGFyaXR5IHNpZ25hbFxuIik7Ci0JCWJyZWFrOwotCWNhc2UgKDB4ODAwMDAwMDA+PjE1KToKLQkJcHJpbnRmKCJBZGRyZXNzIHBhcml0eSBzaWduYWxcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGYoIlVua25vd24gdmFsdWVzIGluIG1zclxuIik7Ci0JfQorCXByaW50ZigiQ2F1c2VkIGJ5IChmcm9tIG1jc3IpOiAiKTsKKwlwcmludGYoIm1jc3IgPSAweCUwOHhcbiIsIG1jc3IpOworCWlmIChtY3NyICYgMHg4MDAwMDAwMCkKKwkJcHJpbnRmKCJNYWNoaW5lIGNoZWNrIGlucHV0IHBpblxuIik7CisJaWYgKG1jc3IgJiAweDQwMDAwMDAwKQorCQlwcmludGYoIkluc3RydWN0aW9uIGNhY2hlIHBhcml0eSBlcnJvclxuIik7CisJaWYgKG1jc3IgJiAweDIwMDAwMDAwKQorCQlwcmludGYoIkRhdGEgY2FjaGUgcHVzaCBwYXJpdHkgZXJyb3JcbiIpOworCWlmIChtY3NyICYgMHgxMDAwMDAwMCkKKwkJcHJpbnRmKCJEYXRhIGNhY2hlIHBhcml0eSBlcnJvclxuIik7CisJaWYgKG1jc3IgJiAweDAwMDAwMDgwKQorCQlwcmludGYoIkJ1cyBpbnN0cnVjdGlvbiBhZGRyZXNzIGVycm9yXG4iKTsKKwlpZiAobWNzciAmIDB4MDAwMDAwNDApCisJCXByaW50ZigiQnVzIFJlYWQgYWRkcmVzcyBlcnJvclxuIik7CisJaWYgKG1jc3IgJiAweDAwMDAwMDIwKQorCQlwcmludGYoIkJ1cyBXcml0ZSBhZGRyZXNzIGVycm9yXG4iKTsKKwlpZiAobWNzciAmIDB4MDAwMDAwMTApCisJCXByaW50ZigiQnVzIEluc3RydWN0aW9uIGRhdGEgYnVzIGVycm9yXG4iKTsKKwlpZiAobWNzciAmIDB4MDAwMDAwMDgpCisJCXByaW50ZigiQnVzIFJlYWQgZGF0YSBidXMgZXJyb3JcbiIpOworCWlmIChtY3NyICYgMHgwMDAwMDAwNCkKKwkJcHJpbnRmKCJCdXMgV3JpdGUgYnVzIGVycm9yXG4iKTsKKwlpZiAobWNzciAmIDB4MDAwMDAwMDIpCisJCXByaW50ZigiQnVzIEluc3RydWN0aW9uIHBhcml0eSBlcnJvclxuIik7CisJaWYgKG1jc3IgJiAweDAwMDAwMDAxKQorCQlwcmludGYoIkJ1cyBSZWFkIHBhcml0eSBlcnJvclxuIik7CisKIAlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRmKCJNQ1NSPTB4JTA4eCBcdE1DU1JSMD0weCUwOHggXG5NQ1NSUjE9MHglMDh4IFx0TUNBUj0weCUwOHhcbiIsCisJICAgICAgIG1jc3IsIG1jc3JyMCwgbWNzcnIxLCBtY2FyKTsKIAlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOwotCXBhbmljKCJtYWNoaW5lIGNoZWNrIik7CisJaWYgKG1hY2hpbmVjaGVja19jb3VudCA+IDEwKSB7CisJCXBhbmljKCJtYWNoaW5lIGNoZWNrIGNvdW50IHRvbyBoaWdoXG4iKTsKKwl9CisKKwlpZiAobWFjaGluZWNoZWNrX2NvdW50ID4gMSkgeworCQlyZWdzLT5uaXAgKz0gNDsgLyogc2tpcCBvZmZlbmRpbmcgaW5zdHJ1Y3Rpb24gKi8KKwkJcHJpbnRmKCJTa2lwcGluZyBjdXJyZW50IGluc3RyLCBSZXR1cm5pbmcgdG8gMHglMDh4XG4iLAorCQkgICAgICAgcmVncy0+bmlwKTsKKwl9IGVsc2UgeworCQlwcmludGYoIlJldHVybmluZyBiYWNrIHRvIDB4JTA4eFxuIixyZWdzLT5uaXApOworCX0KIH0KIAogdm9pZAogQWxpZ25tZW50RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIwNyw3ICsyMzksNyBAQAogewogCWxvbmcgZXNyX3ZhbDsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTI0NCw3ICsyNzYsNyBAQAogdm9pZAogVW5rbm93bkV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yNTMsMTMgKzI4NSw0MCBAQAogCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPm1zciwgcmVncy0+dHJhcCk7CiAJX2V4Y2VwdGlvbigwLCByZWdzKTsKIH0KK3ZvaWQKK0V4dEludEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJdm9sYXRpbGUgY2Nzcl9waWNfdCAqcGljID0gJmltbWFwLT5pbV9waWM7CisJdWludCB2ZWN0OworCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXByaW50ZigiRXh0ZXJuYWwgSW50ZXJydXB0IEV4Y2VwdGlvbiBhdCBQQzogJWx4LCBTUjogJWx4LCB2ZWN0b3I9JWx4IiwKKwkgICAgICAgcmVncy0+bmlwLCByZWdzLT5tc3IsIHJlZ3MtPnRyYXApOworCXZlY3QgPSBwaWMtPmlhY2swOworCXByaW50ZigiIGlycSBJQUNLMEAlMDV4PSVkXG4iLCZwaWMtPmlhY2swLHZlY3QpOworCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCW1hY2hpbmVjaGVja19jb3VudCsrOworI2lmZGVmIEVYVElOVF9OT1NLSVAKKwlwcmludGYoIlJldHVybmluZyBiYWNrIHRvIDB4JTA4eFxuIixyZWdzLT5uaXApOworI2Vsc2UKKwlyZWdzLT5uaXAgKz0gNDsgLyogc2tpcCBvZmZlbmRpbmcgaW5zdHJ1Y3Rpb24gKi8KKwlwcmludGYoIlNraXBwaW5nIGN1cnJlbnQgaW5zdHIsIFJldHVybmluZyB0byAweCUwOHhcbiIscmVncy0+bmlwKTsKKyNlbmRpZgorCit9CiAKIHZvaWQKIERlYnVnRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXByaW50ZigiRGVidWdnZXIgdHJhcCBhdCBAICVseFxuIiwgcmVncy0+bmlwICk7CiAJc2hvd19yZWdzKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogCWRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2NwdS9tcGM4Nnh4L01ha2VmaWxlIGIvY3B1L21wYzg2eHgvTWFrZWZpbGUKaW5kZXggZmZmY2ZkMi4uNmQ5MzAwZSAxMDA2NDQKLS0tIGEvY3B1L21wYzg2eHgvTWFrZWZpbGUKKysrIGIvY3B1L21wYzg2eHgvTWFrZWZpbGUKQEAgLTEsNCArMSw1IEBACiAjCisjIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCiAjIChDKSBDb3B5cmlnaHQgMjAwMiwyMDAzIE1vdG9yb2xhIEluYy4KICMgWGlhbmdodWEgWGlhbyxYLlhpYW9AbW90b3JvbGEuY29tCiAjCkBAIC0zMCw3ICszMSw3IEBACiBTVEFSVAk9IHN0YXJ0Lm8gI3Jlc2V0dmVjLm8KIFNPQkpTCT0gY2FjaGUubwogQ09CSlMJPSB0cmFwcy5vIGNwdS5vIGNwdV9pbml0Lm8gc3BlZWQubyBpbnRlcnJ1cHRzLm8gXAotCSAgcGNpLm8gcGNpZV9pbmRpcmVjdC5vIHNwZF9zZHJhbS5vCisJICBzcGRfc2RyYW0ubwogCiBTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCiBPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKZGlmZiAtLWdpdCBhL2NwdS9tcGM4Nnh4L2NwdV9pbml0LmMgYi9jcHUvbXBjODZ4eC9jcHVfaW5pdC5jCmluZGV4IDQ2NzNkMDUuLmM4ZTQ2NjYgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4Nnh4L2NwdV9pbml0LmMKKysrIGIvY3B1L21wYzg2eHgvY3B1X2luaXQuYwpAQCAtMTA0LDggKzEwNCw4IEBACiAJLyogZW5hYmxlIHRoZSB0aW1lYmFzZSBiaXQgaW4gSElEMCAqLwogCXNldF9oaWQwKGdldF9oaWQwKCkgfCAweDQwMDAwMDApOwogCi0JLyogZW5hYmxlIFNZTkNCRSB8IEFCRSBiaXRzIGluICBISUQxICovCi0Jc2V0X2hpZDEoZ2V0X2hpZDEoKSB8IDB4MDAwMDBDMDApOworCS8qIGVuYWJsZSBFTUNQLCBTWU5DQkUgfCBBQkUgYml0cyBpbiBISUQxICovCisJc2V0X2hpZDEoZ2V0X2hpZDEoKSB8IDB4ODAwMDBDMDApOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvY3B1L21wYzg2eHgvaW50ZXJydXB0cy5jIGIvY3B1L21wYzg2eHgvaW50ZXJydXB0cy5jCmluZGV4IDQ5ODIwYmIuLmQ5ZjYzNGYgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4Nnh4L2ludGVycnVwdHMuYworKysgYi9jcHUvbXBjODZ4eC9pbnRlcnJ1cHRzLmMKQEAgLTgsNyArOCw3IEBACiAgKiAoQykgQ29weXJpZ2h0IDIwMDMgTW90b3JvbGEgSW5jLiAoTVBDODV4eCBwb3J0KQogICogWGlhbmdodWEgWGlhbyAoWC5YaWFvQG1vdG9yb2xhLmNvbSkKICAqCi0gKiAoQykgQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuIChNUEM4Nnh4IFBvcnQpCisgKiAoQykgQ29weXJpZ2h0IDIwMDQsIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuIChNUEM4Nnh4IFBvcnQpCiAgKiBKZWZmIEJyb3duCiAgKiBTcmlrYW50aCBTcmluaXZhc2FuIChzcmlrYW50aC5zcmluaXZhc2FuQGZyZWVzY2FsZS5jb20pCiAgKgpAQCAtNzEsNyArNzEsNyBAQAogfQogCiAvKiBpbnRlcnJ1cHQgaXMgbm90IHN1cHBvcnRlZCB5ZXQgKi8KLWludCBpbnRlcnJ1cHRfaW5pdF9jcHUodW5zaWduZWQgKmRlY3JlbWVudGVyX2NvdW50KQoraW50IGludGVycnVwdF9pbml0X2NwdSh1bnNpZ25lZCBsb25nICpkZWNyZW1lbnRlcl9jb3VudCkKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTgwLDI1ICs4MCwxMCBAQAogewogCWludCByZXQ7CiAKLQkvKgotCSAqIFRoZSBJUlEwIG9uIFJldiAyIGlzIHB1bGxlZCBoaWdoIChsb3cgaW4gUmV2IDEueCkgdG8KLQkgKiBpbXBsZW1lbnQgUEVYMTAgZXJyYXRhLiAgQXMgSU5UIGlzIGFjdGl2ZSBoaWdoLCBpdAotCSAqIHdpbGwgY2F1c2UgY29yZSB0byB0YWtlIDB4NTAwIGludGVycnVwdC4KLQkgKgotCSAqIER1ZSB0byB0aGUgUElDJ3MgZGVmYXVsdCBwYXNzIHRocm91Z2ggbW9kZSwgYXMgc29vbgotCSAqIGFzIGludGVycnVwdHMgYXJlIGVuYWJsZWQgKE1TUltFRV0gPSAxKSwgYW4gaW50ZXJydXB0Ci0JICogd2lsbCBiZSB0YWtlbiBhbmQgdS1ib290IHdpbGwgaGFuZy4gIFRoaXMgaXMgZHVlIHRvIGEKLQkgKiBoYXJkd2FyZSBjaGFuZ2UgKHBlciBhbiBlcnJhdGEgZml4KSBvbiBuZXcgcmV2aXNpb25zCi0JICogb2YgdGhlIGJvYXJkIHdpdGggUmV2IDIueCBwYXJ0cy4KLQkgKgotCSAqIFNldHRpbmcgdGhlIFBJQyB0byBtaXhlZCBtb2RlIHByZXZlbnRzIHRoZSBoYW5nLgotCSAqLwotCWlmICgoZ2V0X3N2cigpICYgMHhmMCkgPT0gMHgyMCkgewotCQl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDRkdfSU1NUjsKLQkJaW1tci0+aW1fcGljLmdjciA9IE1QQzg2eHhfUElDR0NSX1JTVDsKLQkJd2hpbGUgKGltbXItPmltX3BpYy5nY3IgJiBNUEM4Nnh4X1BJQ0dDUl9SU1QpOwotCQlpbW1yLT5pbV9waWMuZ2NyID0gTVBDODZ4eF9QSUNHQ1JfTU9ERTsKLQl9CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJaW1tci0+aW1fcGljLmdjciA9IE1QQzg2eHhfUElDR0NSX1JTVDsKKwl3aGlsZSAoaW1tci0+aW1fcGljLmdjciAmIE1QQzg2eHhfUElDR0NSX1JTVCk7CisJaW1tci0+aW1fcGljLmdjciA9IE1QQzg2eHhfUElDR0NSX01PREU7CiAKIAkvKiBjYWxsIGNwdSBzcGVjaWZpYyBmdW5jdGlvbiBmcm9tICQoQ1BVKS9pbnRlcnJ1cHRzLmMgKi8KIAlyZXQgPSBpbnRlcnJ1cHRfaW5pdF9jcHUoJmRlY3JlbWVudGVyX2NvdW50KTsKQEAgLTEwNyw3ICs5Miw3IEBACiAJCXJldHVybiByZXQ7CiAKIAlkZWNyZW1lbnRlcl9jb3VudCA9IGdldF90YmNsaygpIC8gQ0ZHX0haOwotCWRlYnVnKCJpbnRlcnJ1cHQgaW5pdDogdGJjbGsoKSA9ICVkIE1IeiwgZGVjcmVtZW50ZXJfY291bnQgPSAlZFxuIiwKKwlkZWJ1ZygiaW50ZXJydXB0IGluaXQ6IHRiY2xrKCkgPSAlZCBNSHosIGRlY3JlbWVudGVyX2NvdW50ID0gJWxkXG4iLAogCSAgICAgIChnZXRfdGJjbGsoKSAvIDEwMDAwMDApLAogCSAgICAgIGRlY3JlbWVudGVyX2NvdW50KTsKIApAQCAtMTE5LDYgKzEwNCwzMCBAQAogCSAgICAgIGdldF9tc3IoKSwKIAkgICAgICBnZXRfZGVjKCkpOwogCisjaWZkZWYgQ09ORklHX0lOVEVSUlVQVFMKKwl2b2xhdGlsZSBjY3NyX3BpY190ICpwaWMgPSAmaW1tci0+aW1fcGljOworCisJcGljLT5paXZwcjEgPSAweDgxMDAwMTsJLyogNTAyMjAgZW5hYmxlIG1jbSBpbnRlcnJ1cHRzICovCisJZGVidWcoImlpdnByMUAleCA9ICV4XG4iLCAmcGljLT5paXZwcjEsIHBpYy0+aWl2cHIxKTsKKworCXBpYy0+aWl2cHIyID0gMHg4MTAwMDI7CS8qIDUwMjQwIGVuYWJsZSBkZHIgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjJAJXggPSAleFxuIiwgJnBpYy0+aWl2cHIyLCBwaWMtPmlpdnByMik7CisKKwlwaWMtPmlpdnByMyA9IDB4ODEwMDAzOwkvKiA1MDI2MCBlbmFibGUgbGJjIGludGVycnVwdHMgKi8KKwlkZWJ1ZygiaWl2cHIzQCV4ID0gJXhcbiIsICZwaWMtPmlpdnByMywgcGljLT5paXZwcjMpOworCisjaWYgZGVmaW5lZChDT05GSUdfUENJMSkgfHwgZGVmaW5lZChDT05GSUdfUENJRTEpCisJcGljLT5paXZwcjggPSAweDgxMDAwODsJLyogZW5hYmxlIHBjaWUxIGludGVycnVwdHMgKi8KKwlkZWJ1ZygiaWl2cHI4QCV4ID0gJXhcbiIsICZwaWMtPmlpdnByOCwgcGljLT5paXZwcjgpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfUENJMikgfHwgZGVmaW5lZChDT05GSUdfUENJRTIpCisJcGljLT5paXZwcjkgPSAweDgxMDAwOTsJLyogZW5hYmxlIHBjaWUyIGludGVycnVwdHMgKi8KKwlkZWJ1ZygiaWl2cHI5QCV4ID0gJXhcbiIsICZwaWMtPmlpdnByOSwgcGljLT5paXZwcjkpOworI2VuZGlmCisKKwlwaWMtPmN0cHIgPSAwOwkvKiA0MDA4MCBjbGVhciBjdXJyZW50IHRhc2sgcHJpb3JpdHkgcmVnaXN0ZXIgKi8KKyNlbmRpZgorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1OCw4ICsxNjcsNiBAQAogCiAJdGltZXN0YW1wKys7CiAKLQlwcGNEY2JmKCZ0aW1lc3RhbXApOwotCiAJLyogUmVzdG9yZSBEZWNyZW1lbnRlciBDb3VudCAqLwogCXNldF9kZWMoZGVjcmVtZW50ZXJfY291bnQpOwogCmRpZmYgLS1naXQgYS9jcHUvbXBjODZ4eC9wY2kuYyBiL2NwdS9tcGM4Nnh4L3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODY1NDhkLi4wMDAwMDAwCi0tLSBhL2NwdS9tcGM4Nnh4L3BjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLEluYy4KLSAqIDIwMDUsIDIwMDYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogRWQgU3dhcnRob3V0IChlZC5zd2FydGhvdXRAZnJlZXNjYWxlLmNvbSkKLSAqIEphc29uIEppbiAoSmFzb24uamluQGZyZWVzY2FsZS5jb20pCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotLyoKLSAqIFBDSUUgQ29uZmlndXJhdGlvbiBzcGFjZSBhY2Nlc3Mgc3VwcG9ydCBmb3IgUENJRSBCcmlkZ2UKLSAqLwotI2luY2x1ZGUgPGNvbW1vbi5oPgotI2luY2x1ZGUgPHBjaS5oPgotCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKQotdm9pZAotcGNpX21wYzg2eHhfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCi17Ci0Jdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfQ0NTUkJBUjsKLQl2b2xhdGlsZSBjY3NyX3BleF90ICpwY2llMSA9ICZpbW1hcC0+aW1fcGV4MTsKLQl1MTYgdGVtcDE2OwotCXUzMiB0ZW1wMzI7Ci0KLQl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAmaW1tYXAtPmltX2d1cjsKLQl1aW50IGhvc3QxX2FnZW50ID0gKGd1ci0+cG9yYm1zciAmIE1QQzg2eHhfUE9SQk1TUl9IQSkgPj4gMTc7Ci0JdWludCBwY2llMV9ob3N0ID0gKGhvc3QxX2FnZW50ID09IDIpIHx8IChob3N0MV9hZ2VudCA9PSAzKTsKLQl1aW50IHBjaWUxX2FnZW50ID0gKGhvc3QxX2FnZW50ID09IDApIHx8IChob3N0MV9hZ2VudCA9PSAxKTsKLQl1aW50IGRldmRpc3IgPSBndXItPmRldmRpc3I7Ci0JdWludCBpb19zZWwgPSAoZ3VyLT5wb3JkZXZzciAmIE1QQzg2eHhfUE9SREVWU1JfSU9fU0VMKSA+PiAxNjsKLQotCWlmICgoaW9fc2VsID09IDIgfHwgaW9fc2VsID09IDMgfHwgaW9fc2VsID09IDUgfHwgaW9fc2VsID09IDYgfHwKLQkgICAgIGlvX3NlbCA9PSA3IHx8IGlvX3NlbCA9PSAweGYpCi0JICAgICYmICEoZGV2ZGlzciAmIE1QQzg2eHhfREVWRElTUl9QQ0lFWDEpKSB7Ci0JCXByaW50ZigiUENJLUVYUFJFU1MgMTogQ29uZmlndXJlZCBhcyAlcyBcbiIsCi0JCSAgICAgICBwY2llMV9hZ2VudCA/ICJBZ2VudCIgOiAiSG9zdCIpOwotCQlpZiAocGNpZTFfYWdlbnQpCi0JCQlyZXR1cm47CS8qRG9uJ3Qgc2NhbiBidXMgd2hlbiBjb25maWd1cmVkIGFzIGFnZW50ICovCi0JCXByaW50ZigiICAgICAgICAgICAgICAgU2Nhbm5pbmcgUENJRSBidXMiKTsKLQkJZGVidWcoIjB4JTA4eD0weCUwOHggIiwKLQkJICAgICAgJnBjaWUxLT5wbWVfbXNnX2RldCwKLQkJICAgICAgcGNpZTEtPnBtZV9tc2dfZGV0KTsKLQkJaWYgKHBjaWUxLT5wbWVfbXNnX2RldCkgewotCQkJcGNpZTEtPnBtZV9tc2dfZGV0ID0gMHhmZmZmZmZmZjsKLQkJCWRlYnVnKCIgd2l0aCBlcnJvcnMuICBDbGVhcmluZy4gIE5vdyAweCUwOHgiLAotCQkJICAgICAgcGNpZTEtPnBtZV9tc2dfZGV0KTsKLQkJfQotCQlkZWJ1ZygiXG4iKTsKLQl9IGVsc2UgewotCQlwcmludGYoIlBDSS1FWFBSRVNTIDEgZGlzYWJsZWQhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogU2V0IGZpcnN0X2J1cz0wIG9ubHkgc2tpcHBlZCBCMDpEMDpGMCB3aGljaCBpcwotCSAqIGEgcmVzZXJ2ZWQgZGV2aWNlIGluIE0xNTc1LCBidXQgbWFrZSBpdCBlYXN5IGZvcgotCSAqIG1vc3Qgb2YgdGhlIHNjYW4gcHJvY2Vzcy4KLQkgKi8KLQlob3NlLT5maXJzdF9idXNubyA9IDB4MDA7Ci0JaG9zZS0+bGFzdF9idXNubyA9IDB4ZmU7Ci0KLQlwY2llX3NldHVwX2luZGlyZWN0KGhvc2UsIChDRkdfSU1NUiArIDB4ODAwMCksIChDRkdfSU1NUiArIDB4ODAwNCkpOwotCi0JcGNpX2hvc2VfcmVhZF9jb25maWdfd29yZChob3NlLAotCQkJCSAgUENJX0JERigwLCAwLCAwKSwgUENJX0NPTU1BTkQsICZ0ZW1wMTYpOwotCXRlbXAxNiB8PSBQQ0lfQ09NTUFORF9TRVJSIHwgUENJX0NPTU1BTkRfTUFTVEVSIHwKLQkgICAgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfSU87Ci0JcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwKLQkJCQkgICBQQ0lfQkRGKDAsIDAsIDApLCBQQ0lfQ09NTUFORCwgdGVtcDE2KTsKLQotCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIFBDSV9CREYoMCwgMCwgMCksIFBDSV9TVEFUVVMsIDB4ZmZmZik7Ci0JcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwKLQkJCQkgICBQQ0lfQkRGKDAsIDAsIDApLCBQQ0lfTEFURU5DWV9USU1FUiwgMHg4MCk7Ci0KLQlwY2lfaG9zZV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBQQ0lfQkRGKDAsIDAsIDApLCBQQ0lfUFJJTUFSWV9CVVMsCi0JCQkJICAgJnRlbXAzMik7Ci0JdGVtcDMyID0gKHRlbXAzMiAmIDB4ZmYwMDAwMDApIHwgKDB4ZmYpIHwgKDB4MCA8PCA4KSB8ICgweGZlIDw8IDE2KTsKLQlwY2lfaG9zZV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgUENJX0JERigwLCAwLCAwKSwgUENJX1BSSU1BUllfQlVTLAotCQkJCSAgICB0ZW1wMzIpOwotCi0JcGNpZTEtPnBvd2FyMSA9IDA7Ci0JcGNpZTEtPnBvd2FyMiA9IDA7Ci0JcGNpZTEtPnBpd2FyMSA9IDA7Ci0JcGNpZTEtPnBpd2FyMSA9IDA7Ci0KLQlwY2llMS0+cG93YmFyMSA9IChDRkdfUENJMV9NRU1fQkFTRSA+PiAxMikgJiAweDAwMGZmZmZmOwotCXBjaWUxLT5wb3dhcjEgPSAweDgwMDQ0MDFjOwkvKiA1MTJNIE1FTSBzcGFjZSAqLwotCXBjaWUxLT5wb3RhcjEgPSAoQ0ZHX1BDSTFfTUVNX0JBU0UgPj4gMTIpICYgMHgwMDBmZmZmZjsKLQlwY2llMS0+cG90ZWFyMSA9IDB4MDAwMDAwMDA7Ci0KLQlwY2llMS0+cG93YmFyMiA9IChDRkdfUENJMV9JT19CQVNFID4+IDEyKSAmIDB4MDAwZmZmZmY7Ci0JcGNpZTEtPnBvd2FyMiA9IDB4ODAwODgwMTc7CS8qIDE2TSBJTyBzcGFjZSAqLwotCXBjaWUxLT5wb3RhcjIgPSAweDAwMDAwMDAwOwotCXBjaWUxLT5wb3RlYXIyID0gMHgwMDAwMDAwMDsKLQotCXBjaWUxLT5waXRhcjEgPSAweDAwMDAwMDAwOwotCXBjaWUxLT5waXdiYXIxID0gMHgwMDAwMDAwMDsKLQkvKiBFbmFibGUsIFByZWZldGNoLCBMb2NhbCBNZW0sICogU25vb3AgUi9XLCAyRyAqLwotCXBjaWUxLT5waXdhcjEgPSAweGEwZjU1MDFlOwotCi0JcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDAsCi0JCSAgICAgICBDRkdfUENJX01FTU9SWV9CVVMsCi0JCSAgICAgICBDRkdfUENJX01FTU9SWV9QSFlTLAotCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfU0laRSwKLQkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOwotCi0JcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCi0JCSAgICAgICBDRkdfUENJMV9NRU1fQkFTRSwKLQkJICAgICAgIENGR19QQ0kxX01FTV9QSFlTLAotCQkgICAgICAgQ0ZHX1BDSTFfTUVNX1NJWkUsCi0JCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7Ci0KLQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMiwKLQkJICAgICAgIENGR19QQ0kxX0lPX0JBU0UsCi0JCSAgICAgICBDRkdfUENJMV9JT19QSFlTLAotCQkgICAgICAgQ0ZHX1BDSTFfSU9fU0laRSwKLQkJICAgICAgIFBDSV9SRUdJT05fSU8pOwotCi0JaG9zZS0+cmVnaW9uX2NvdW50ID0gMzsKLQotCXBjaV9yZWdpc3Rlcl9ob3NlKGhvc2UpOwotCi0JaG9zZS0+bGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW4oaG9zZSk7Ci0JZGVidWcoInBjaWVfbXBjODZ4eF9pbml0OiBsYXN0X2J1c25vICV4XG4iLCBob3NlLT5sYXN0X2J1c25vKTsKLQlkZWJ1ZygicGNpZV9tcGM4Nnh4IGluaXQ6IGN1cnJlbnRfYnVzbm8gJXhcbiAiLCBob3NlLT5jdXJyZW50X2J1c25vKTsKLQotCXByaW50ZigiLi4uLlBDSUUxIHNjYW4gJiBlbnVtZXJhdGlvbiBkb25lXG4iKTsKLX0KLSNlbmRpZgkJCQkvKiBDT05GSUdfUENJICovCmRpZmYgLS1naXQgYS9jcHUvbXBjODZ4eC9wY2llX2luZGlyZWN0LmMgYi9jcHUvbXBjODZ4eC9wY2llX2luZGlyZWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMGFkNzYuLjAwMDAwMDAKLS0tIGEvY3B1L21wYzg2eHgvcGNpZV9pbmRpcmVjdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qCi0gKiBTdXBwb3J0IGZvciBpbmRpcmVjdCBQQ0kgYnJpZGdlcy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCi0gKiAyMDA2LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBwYXJ0bHkgZGVyaXZlZCBmcm9tCi0gKiBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9wY2llLmMKLSAqLwotCi0jaW5jbHVkZSA8Y29tbW9uLmg+Ci0KLSNpZmRlZiBDT05GSUdfUENJCi0KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8cGNpLmg+Ci0KLSNkZWZpbmUgUENJX0NGR19PVVQgCW91dF9iZTMyCi0jZGVmaW5lIFBFWF9GSVgJCW91dF9iZTMyKGhvc2UtPmNmZ19hZGRyKzB4NCwgMHgwNDAwZmZmZikKLQotc3RhdGljIGludAotaW5kaXJlY3RfcmVhZF9jb25maWdfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkgIHBjaV9kZXZfdCBkZXYsCi0JCQkgIGludCBvZmZzZXQsCi0JCQkgIGludCBsZW4sCi0JCQkgIHUzMiAqdmFsKQotewotCWludCBidXMgPSBQQ0lfQlVTKGRldik7Ci0KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpjZmdfZGF0YTsKLQl1MzIgdGVtcDsKLQotCVBFWF9GSVg7Ci0JaWYgKGJ1cyA9PSAweGZmKSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgIGRldiB8IChvZmZzZXQgJiAweGZjKSB8IDB4ODAwMDAwMDEpOwotCX0gZWxzZSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgIGRldiB8IChvZmZzZXQgJiAweGZjKSB8IDB4ODAwMDAwMDApOwotCX0KLQkvKgotCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcwotCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KLQkgKi8KLQkvKiBFUlJBVEEgUENJLUV4IDEyIC0gQ29uZmlndXJhdGlvbiBBZGRyZXNzL0RhdGEgQWxpZ25tZW50ICovCi0JY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YTsKLQlQRVhfRklYOwotCXRlbXAgPSBpbl9sZTMyKCh1MzIgKikgY2ZnX2RhdGEpOwotCXN3aXRjaCAobGVuKSB7Ci0JY2FzZSAxOgotCQkqdmFsID0gKHRlbXAgPj4gKCgob2Zmc2V0ICYgMykpICogOCkpICYgMHhmZjsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkqdmFsID0gKHRlbXAgPj4gKCgob2Zmc2V0ICYgMykpICogOCkpICYgMHhmZmZmOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkqdmFsID0gdGVtcDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWluZGlyZWN0X3dyaXRlX2NvbmZpZ19wY2llKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCSAgIHBjaV9kZXZfdCBkZXYsCi0JCQkgICBpbnQgb2Zmc2V0LAotCQkJICAgaW50IGxlbiwKLQkJCSAgIHUzMiB2YWwpCi17Ci0JaW50IGJ1cyA9IFBDSV9CVVMoZGV2KTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpjZmdfZGF0YTsKLQl1MzIgdGVtcDsKLQotCVBFWF9GSVg7Ci0JaWYgKGJ1cyA9PSAweGZmKSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgIGRldiB8IChvZmZzZXQgJiAweGZjKSB8IDB4ODAwMDAwMDEpOwotCX0gZWxzZSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgIGRldiB8IChvZmZzZXQgJiAweGZjKSB8IDB4ODAwMDAwMDApOwotCX0KLQotCS8qCi0JICogTm90ZTogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgb2Zmc2V0IGlzCi0JICogc3VpdGFibHkgYWxpZ25lZCBhbmQgdGhhdCBsZW4gaXMgMSwgMiBvciA0LgotCSAqLwotCS8qIEVSUkFUQSBQQ0ktRXggMTIgLSBDb25maWd1cmF0aW9uIEFkZHJlc3MvRGF0YSBBbGlnbm1lbnQgKi8KLQljZmdfZGF0YSA9IGhvc2UtPmNmZ19kYXRhOwotCXN3aXRjaCAobGVuKSB7Ci0JY2FzZSAxOgotCQlQRVhfRklYOwotCQl0ZW1wID0gaW5fbGUzMigodTMyICopIGNmZ19kYXRhKTsKLQkJdGVtcCA9ICh0ZW1wICYgfigweGZmIDw8ICgob2Zmc2V0ICYgMykgKiA4KSkpIHwKLQkJICAgICh2YWwgPDwgKChvZmZzZXQgJiAzKSAqIDgpKTsKLQkJUEVYX0ZJWDsKLQkJb3V0X2xlMzIoKHUzMiAqKSBjZmdfZGF0YSwgdGVtcCk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJUEVYX0ZJWDsKLQkJdGVtcCA9IGluX2xlMzIoKHUzMiAqKSBjZmdfZGF0YSk7Ci0JCXRlbXAgPSAodGVtcCAmIH4oMHhmZmZmIDw8ICgob2Zmc2V0ICYgMykgKiA4KSkpOwotCQl0ZW1wIHw9ICh2YWwgPDwgKChvZmZzZXQgJiAzKSAqIDgpKTsKLQkJUEVYX0ZJWDsKLQkJb3V0X2xlMzIoKHUzMiAqKSBjZmdfZGF0YSwgdGVtcCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVBFWF9GSVg7Ci0JCW91dF9sZTMyKCh1MzIgKikgY2ZnX2RhdGEsIHZhbCk7Ci0JCWJyZWFrOwotCX0KLQlQRVhfRklYOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1pbmRpcmVjdF9yZWFkX2NvbmZpZ19ieXRlX3BjaWUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAotCQkJICAgICAgIHBjaV9kZXZfdCBkZXYsCi0JCQkgICAgICAgaW50IG9mZnNldCwKLQkJCSAgICAgICB1OCAqdmFsKQotewotCXUzMiB2YWwzMjsKLQlpbmRpcmVjdF9yZWFkX2NvbmZpZ19wY2llKGhvc2UsIGRldiwgb2Zmc2V0LCAxLCAmdmFsMzIpOwotCSp2YWwgPSAodTgpIHZhbDMyOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1pbmRpcmVjdF9yZWFkX2NvbmZpZ193b3JkX3BjaWUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAotCQkJICAgICAgIHBjaV9kZXZfdCBkZXYsCi0JCQkgICAgICAgaW50IG9mZnNldCwKLQkJCSAgICAgICB1MTYgKnZhbCkKLXsKLQl1MzIgdmFsMzI7Ci0JaW5kaXJlY3RfcmVhZF9jb25maWdfcGNpZShob3NlLCBkZXYsIG9mZnNldCwgMiwgJnZhbDMyKTsKLQkqdmFsID0gKHUxNikgdmFsMzI7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWluZGlyZWN0X3JlYWRfY29uZmlnX2R3b3JkX3BjaWUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAotCQkJCXBjaV9kZXZfdCBkZXYsCi0JCQkJaW50IG9mZnNldCwKLQkJCQl1MzIgKnZhbCkKLXsKLQlyZXR1cm4gaW5kaXJlY3RfcmVhZF9jb25maWdfcGNpZShob3NlLCBkZXYsIG9mZnNldCwgNCwgdmFsKTsKLX0KLQotc3RhdGljIGludAotaW5kaXJlY3Rfd3JpdGVfY29uZmlnX2J5dGVfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJcGNpX2Rldl90IGRldiwKLQkJCQlpbnQgb2Zmc2V0LAotCQkJCXU4IHZhbCkKLXsKLQlyZXR1cm4gaW5kaXJlY3Rfd3JpdGVfY29uZmlnX3BjaWUoaG9zZSwgZGV2LCBvZmZzZXQsIDEsICh1MzIpIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWluZGlyZWN0X3dyaXRlX2NvbmZpZ193b3JkX3BjaWUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAotCQkJCXBjaV9kZXZfdCBkZXYsCi0JCQkJaW50IG9mZnNldCwKLQkJCQl1bnNpZ25lZCBzaG9ydCB2YWwpCi17Ci0JcmV0dXJuIGluZGlyZWN0X3dyaXRlX2NvbmZpZ19wY2llKGhvc2UsIGRldiwgb2Zmc2V0LCAyLCAodTMyKSB2YWwpOwotfQotCi1zdGF0aWMgaW50Ci1pbmRpcmVjdF93cml0ZV9jb25maWdfZHdvcmRfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJIHBjaV9kZXZfdCBkZXYsCi0JCQkJIGludCBvZmZzZXQsCi0JCQkJIHUzMiB2YWwpCi17Ci0JcmV0dXJuIGluZGlyZWN0X3dyaXRlX2NvbmZpZ19wY2llKGhvc2UsIGRldiwgb2Zmc2V0LCA0LCB2YWwpOwotfQotCi12b2lkCi1wY2llX3NldHVwX2luZGlyZWN0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgdTMyIGNmZ19hZGRyLCB1MzIgY2ZnX2RhdGEpCi17Ci0JcGNpX3NldF9vcHMoaG9zZSwKLQkJICAgIGluZGlyZWN0X3JlYWRfY29uZmlnX2J5dGVfcGNpZSwKLQkJICAgIGluZGlyZWN0X3JlYWRfY29uZmlnX3dvcmRfcGNpZSwKLQkJICAgIGluZGlyZWN0X3JlYWRfY29uZmlnX2R3b3JkX3BjaWUsCi0JCSAgICBpbmRpcmVjdF93cml0ZV9jb25maWdfYnl0ZV9wY2llLAotCQkgICAgaW5kaXJlY3Rfd3JpdGVfY29uZmlnX3dvcmRfcGNpZSwKLQkJICAgIGluZGlyZWN0X3dyaXRlX2NvbmZpZ19kd29yZF9wY2llKTsKLQotCWhvc2UtPmNmZ19hZGRyID0gKHVuc2lnbmVkIGludCAqKWNmZ19hZGRyOwotCWhvc2UtPmNmZ19kYXRhID0gKHVuc2lnbmVkIGNoYXIgKiljZmdfZGF0YTsKLX0KLQotI2VuZGlmCQkJCS8qIENPTkZJR19QQ0kgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM4Nnh4L3N0YXJ0LlMgYi9jcHUvbXBjODZ4eC9zdGFydC5TCmluZGV4IDQxMjc0NWIuLmM4MzMxMGEgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4Nnh4L3N0YXJ0LlMKKysrIGIvY3B1L21wYzg2eHgvc3RhcnQuUwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqIENvcHlyaWdodCAyMDA0LCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgogICogU3Jpa2FudGggU3Jpbml2YXNhbiA8c3Jpa2FudGguc3Jpbml2YWFuQGZyZWVzY2FsZS5jb20+CiAgKgogICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKQEAgLTQ0LDExICs0NCw5IEBACiAjZGVmaW5lIENPTkZJR19JREVOVF9TVFJJTkcgIiIKICNlbmRpZgogCi0vKiBXZSBkb24ndCB3YW50IHRoZSAgTU1VIHlldC4KLSovCi0jdW5kZWYJTVNSX0tFUk5FTAotLyogTWFjaGluZSBDaGVjayBhbmQgUmVjb3ZlcmFibGUgSW50ZXJyLiAqLwotI2RlZmluZSBNU1JfS0VSTkVMICggTVNSX01FIHwgTVNSX1JJICkKKy8qCisgKiBOZWVkIE1TUl9EUiB8IE1TUl9JUiBlbmFibGVkIHRvIGFjY2VzcyBJL08gKHByaW50ZikgaW4gZXhjZXB0aW9ucworICovCiAKIC8qCiAgKiBTZXQgdXAgR09UOiBHbG9iYWwgT2Zmc2V0IFRhYmxlCkBAIC0xOTUsMTcgKzE5MywyMSBAQAogCWJsCXNlY29uZGFyeV9jcHVfc2V0dXAKICNlbmRpZgogCisxOgorI2lmZGVmIENGR19SQU1CT09UCiAJLyogZGlzYWJsZSBldmVyeXRoaW5nICovCi0xOglsaQlyMCwgMAorCWxpCXIwLCAwCiAJbXRzcHIJSElEMCwgcjAKIAlzeW5jCiAJbXRtc3IJMAorI2VuZGlmCisKIAlibAlpbnZhbGlkYXRlX2JhdHMKIAlzeW5jCiAKICNpZmRlZiBDRkdfTDIKIAkvKiBpbml0IHRoZSBMMiBjYWNoZSAqLwotCWFkZGlzCXIzLCByMCwgTDJfSU5JVEBoCisJbGlzCXIzLCBMMl9JTklUQGgKIAlvcmkJcjMsIHIzLCBMMl9JTklUQGwKIAltdHNwcglsMmNyLCByMwogCS8qIGludmFsaWRhdGUgdGhlIEwyIGNhY2hlICovCkBAIC0yNDEsNjkgKzI0Myw5IEBACiAJYmwJc2V0dXBfY2NzcmJhcgogI2VuZGlmCiAKLQotCS8qIC0tIE1QQzg2NDEgUmV2IDEuMCBNQ00gRXJyYXRhIGZpeHVwcyAtLSAqLwotCi0JLyogc2tpcCBmaXh1cHMgaWYgbm90IFJldiAxLjAgKi8KLQltZnNwcglyNCwgU1ZSCi0Jcmx3aW5tCXI0LHI0LDAsMjQsMzEKLQljbXB3aQlyNCwweDEwCi0JYm5lCTFmCi0KLQlsaXMJcjMsTUNNX0FCQ1JAaGEKLQlsd3oJcjQsTUNNX0FCQ1JAbChyMykJLyogQUJDUiAtPiByNCAqLwotCi0JLyogc2V0IEFCQ1JbQV9TVFJNX0NOVF0gPSAwICovCi0Jcmx3aW5tCXI0LHI0LDAsMCwyOQotCi0JLyogc2V0IEFCQ1JbQVJCX1BPTElDWV0gdG8gMHgxIChyb3VuZC1yb2JpbikgKi8KLQlhZGRpCXIwLHIwLDEKLQlybHdpbWkJcjQscjAsMTIsMTgsMTkKLQotCXN0dwlyNCxNQ01fQUJDUkBsKHIzKQkvKiByNCAtPiBBQkNSICovCi0Jc3luYwotCi0JLyogU2V0IERCQ1JbRVJEX0RJU10gKi8KLQlsaXMJcjMsTUNNX0RCQ1JAaGEKLQlsd3oJcjQsTUNNX0RCQ1JAbChyMykKLQlvcmlzCXI0LCByNCwgMHg0MDAwCi0Jc3R3CXI0LE1DTV9EQkNSQGwocjMpCi0Jc3luYwotMToKIAkvKiBzZXR1cCB0aGUgbGF3IGVudHJpZXMgKi8KIAlibAlsYXdfZW50cnkKIAlzeW5jCi0KLQotI2lmIChFTVVMQVRPUl9SVU4gPT0gMSkKLQkvKiBPbiB0aGUgZW11bGF0b3Igd2Ugd2FudCB0byBhZGp1c3QgdGhlc2UgQVNBUCAqLwotCS8qIG90aGVyd2lzZSB0aGluZ3MgYXJlIHNsb29vb3cgKi8KLQkvKiBTZXR1cCBPUjAgKExBTEUgRklYKSovCi0JbGlzCXIzLCBDRkdfQ0NTUkJBUkBoCi0Jb3JpCXIzLCByMywgMHg1MDA0Ci0JbGkJcjQsIDB4MEZGMwotCXN0dwlyNCwgMChyMykKLQlzeW5jCi0KLQkvKiBTZXR1cCBMQ1JSICovCi0JbGlzCXIzLCBDRkdfQ0NTUkJBUkBoCi0Jb3JpCXIzLCByMywgMHg1MEQ0Ci0JbGlzCXI0LCAweDgwMDAKLQlvcmkJcjQsIHI0LCAweDAwMDIKLQlzdHcJcjQsIDAocjMpCi0Jc3luYwotI2VuZGlmCi0jaWYgMQotCS8qIG1ha2Ugc3VyZSB0aW1lciBlbmFibGVkIGluIGd1dHMgcmVnaXN0ZXIgdG9vICovCi0JbGlzCXIzLCBDRkdfQ0NTUkJBUkBoCi0Jb3JpcwlyMyxyMywgMHhFCi0Jb3JpCXIzLHIzLDB4MDA3MAotCWx3eglyNCwgMChyMykKLQlsaXMJcjUsMHhGRkZDCi0Jb3JpCXI1LHI1LDB4NUZGRgotCWFuZAlyNCxyNCxyNQotCXN0dwlyNCwwKHIzKQotI2VuZGlmCiAJLyoKIAkgKiBDYWNoZSBtdXN0IGJlIGVuYWJsZWQgaGVyZSBmb3Igc3RhY2staW4tY2FjaGUgdHJpY2suCiAJICogVGhpcyBtZWFucyB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgQkFUUy4KQEAgLTM0Niw4ICsyODgsNiBAQAogCiAjaWZkZWYJUlVOX0RJQUcKIAotCS8qIFNyaToJIENvZGUgdG8gcnVuIHRoZSBkaWFnbm9zdGljIGF1dG9tYXRpY2FsbHkgKi8KLQogCS8qIExvYWQgUFhfQVVYIHJlZ2lzdGVyIGFkZHJlc3MgaW4gcjQgKi8KIAlsaXMJcjQsIDB4ZjgxMAogCW9yaQlyNCwgcjQsIDB4NgpAQCAtMzkyLDYgKzMzMiw3IEBACiAJLmdsb2JsCWludmFsaWRhdGVfYmF0cwogaW52YWxpZGF0ZV9iYXRzOgogCisJbGkJcjAsIDAKIAkvKiBpbnZhbGlkYXRlIEJBVHMgKi8KIAltdHNwcglJQkFUMFUsIHIwCiAJbXRzcHIJSUJBVDFVLCByMApAQCAtMTA0MCw2ICs5ODEsNyBAQAogCW1mbXNyCXI3CiAJbGkJcjgsTVNSX0lQCiAJYW5kYwlyNyxyNyxyOAorCW9yaQlyNyxyNyxNU1JfTUUJCS8qIEVuYWJsZSBNYWNoaW5lIENoZWNrICovCiAJbXRtc3IJcjcKIAogCW10bHIJcjQJCQkvKiByZXN0b3JlIGxpbmsgcmVnaXN0ZXIJKi8KQEAgLTEyMjQsOCArMTE2Niw5IEBACiAJc3luYwogCWlzeW5jCiAKLQkvKlNZTkNCRXxBQkUgaW4gSElEMSovCisJLyogTUNQfFNZTkNCRXxBQkUgaW4gSElEMSAqLwogCW1mc3ByCXI0LCBISUQxCisJb3JpcwlyNCwgcjQsIDB4ODAwMAogCW9yaQlyNCwgcjQsIDB4MEMwMAogCW10c3ByCUhJRDEsIHI0CiAJc3luYwpkaWZmIC0tZ2l0IGEvY3B1L21wYzg2eHgvdHJhcHMuYyBiL2NwdS9tcGM4Nnh4L3RyYXBzLmMKaW5kZXggOGVhMTRlNS4uYzg0YmZiZiAxMDA2NDQKLS0tIGEvY3B1L21wYzg2eHgvdHJhcHMuYworKysgYi9jcHUvbXBjODZ4eC90cmFwcy5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiBpbnQgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikoc3RydWN0IHB0X3JlZ3MgKikgPSAwOwogI2VuZGlmCiAKQEAgLTEyMiw3ICsxMjIsNyBAQAogCQlyZXR1cm47CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTEzMCw4ICsxMzAsMTEgQEAKIAlwcmludGYoIk1hY2hpbmUgY2hlY2sgaW4ga2VybmVsIG1vZGUuXG4iKTsKIAlwcmludGYoIkNhdXNlZCBieSAoZnJvbSBtc3IpOiAiKTsKIAlwcmludGYoInJlZ3MgJXAgIiwgcmVncyk7Ci0Jc3dpdGNoIChyZWdzLT5tc3IgJiAweDAwMEYwMDAwKSB7Ci0JY2FzZSAoMHg4MDAwMDAwMCA+PiAxMik6CisJc3dpdGNoICggcmVncy0+bXNyICYgMHgwMDFGMDAwMCkgeworCWNhc2UgKDB4ODAwMDAwMDA+PjExKToKKwkJcHJpbnRmKCJNU1MgZXJyb3IuIE1TU1NSMDogJTA4eFxuIiwgbWZzcHIoU1BSTl9NU1NTUjApKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMD4+MTIpOgogCQlwcmludGYoIk1hY2hpbmUgY2hlY2sgc2lnbmFsIC0gcHJvYmFibHkgZHVlIHRvIG1tIGZhdWx0XG4iCiAJCSAgICAgICAid2l0aCBtbXUgb2ZmXG4iKTsKIAkJYnJlYWs7CkBAIC0xNTUsNyArMTU4LDcgQEAKIHZvaWQKIEFsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKSAocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTcwLDcgKzE3Myw3IEBACiAJdW5zaWduZWQgY2hhciAqcCA9IHJlZ3MgPyAodW5zaWduZWQgY2hhciAqKShyZWdzLT5uaXApIDogTlVMTDsKIAlpbnQgaSwgajsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpIChyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xOTMsNyArMTk2LDcgQEAKIHZvaWQKIFNvZnRFbXVFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIwNSwxMCArMjA4LDExIEBACiB2b2lkCiBVbmtub3duRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpIChyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCisJcHJpbnRmKCJVbmtub3duRXhjZXB0aW9uIHJlZ3NAJXhcbiIsIHJlZ3MpOwogCXByaW50ZigiQmFkIHRyYXAgYXQgUEM6ICVseCwgU1I6ICVseCwgdmVjdG9yPSVseFxuIiwKIAkgICAgICAgcmVncy0+bmlwLCByZWdzLT5tc3IsIHJlZ3MtPnRyYXApOwogCV9leGNlcHRpb24oMCwgcmVncyk7CmRpZmYgLS1naXQgYS9jcHUvbXBjOHh4L2JlZGJ1Z184NjAuYyBiL2NwdS9tcGM4eHgvYmVkYnVnXzg2MC5jCmluZGV4IGU5MWExMDAuLjVkNTIzNjYgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4eHgvYmVkYnVnXzg2MC5jCisrKyBiL2NwdS9tcGM4eHgvYmVkYnVnXzg2MC5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8YmVkYnVnL3BwYy5oPgogI2luY2x1ZGUgPGJlZGJ1Zy90eXBlLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpICYmIGRlZmluZWQoQ09ORklHXzh4eCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKSAmJiBkZWZpbmVkKENPTkZJR184eHgpCiAKICNkZWZpbmUgTUFYX0JSRUFLX1BPSU5UUyAyCiAKZGlmZiAtLWdpdCBhL2NwdS9tcGM4eHgvZmVjLmMgYi9jcHUvbXBjOHh4L2ZlYy5jCmluZGV4IDZkMjc1NWUuLjA4YTM3MTUgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4eHgvZmVjLmMKKysrIGIvY3B1L21wYzh4eC9mZWMuYwpAQCAtMzEsNyArMzEsNyBAQAogCiAjdW5kZWYJRVRfREVCVUcKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgXAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIFwKIAkoZGVmaW5lZChGRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkVDMSkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkVDMikpCiAKIC8qIGNvbXBhdGliaWxpdHkgdGVzdCwgaWYgb25seSBGRUNfRU5FVCBkZWZpbmVkIGFzc3VtZSBFVEhFUiBvbiBGRUMxICovCkBAIC00OSw3ICs0OSw3IEBACiAjaWYgZGVmaW5lZChXQU5UX01JSSkKICNpbmNsdWRlIDxtaWlwaHkuaD4KIAotI2lmICEoZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpKQorI2lmICEoZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKSkKICNlcnJvciAiQ09ORklHX01JSSBoYXMgdG8gYmUgZGVmaW5lZCEiCiAjZW5kaWYKIApAQCAtMTgyLDcgKzE4Miw3IEBACiAKIAkJZXRoX3JlZ2lzdGVyKGRldik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAJCW1paXBoeV9yZWdpc3RlcihkZXYtPm5hbWUsCiAJCQlmZWM4eHhfbWlpcGh5X3JlYWQsIGZlYzh4eF9taWlwaHlfd3JpdGUpOwogI2VuZGlmCkBAIC0yNjgsNyArMjY4LDcgQEAKIAogCQkJbGVuZ3RoIC09IDQ7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9DRFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NEUCkKIAkJCWlmICgocnhbMF0gJiAxKSAhPSAwCiAJCQkgICAgJiYgbWVtY21wICgodWNoYXIgKikgcngsIE5ldEJjYXN0QWRkciwgNikgIT0gMAogCQkJICAgICYmIG1lbWNtcCAoKHVjaGFyICopIHJ4LCBOZXRDRFBBZGRyLCA2KSAhPSAwKQpAQCAtNjA4LDcgKzYwOCw3IEBACiAJZmVjcC0+ZmVjX2FkZHJfaGlnaCA9IChlYVs0XSA8PCA4KSB8IChlYVs1XSk7CiAjdW5kZWYgZWEKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogCS8qCiAJICogVHVybiBvbiBtdWx0aWNhc3QgYWRkcmVzcyBoYXNoIHRhYmxlCiAJICovCkBAIC03ODcsNyArNzg3LDcgQEAKIAllZmlzLT5pbml0aWFsaXplZCA9IDA7CiB9CiAKLSNpZiBkZWZpbmVkKENGR19ESVNDT1ZFUl9QSFkpIHx8IGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ0ZHX0RJU0NPVkVSX1BIWSkgfHwgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCiAvKiBNYWtlIE1JSSByZWFkL3dyaXRlIGNvbW1hbmRzIGZvciB0aGUgRkVDLgogKi8KQEAgLTg1Miw3ICs4NTIsNyBAQAogI2VuZGlmCiAJcmV0dXJuIChtaWlfcmVwbHkgJiAweGZmZmYpOwkJLyogZGF0YSByZWFkIGZyb20gcGh5ICovCiB9Ci0jZW5kaWYgLyogQ0ZHX0RJU0NPVkVSX1BIWSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICovCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ0ZHX0RJU0NPVkVSX1BIWSkKIHN0YXRpYyBpbnQgbWlpX2Rpc2NvdmVyX3BoeShzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQpAQCAtOTI2LDcgKzkyNiw3IEBACiB9CiAjZW5kaWYJLyogQ0ZHX0RJU0NPVkVSX1BIWSAqLwogCi0jaWYgKGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSkgJiYgIWRlZmluZWQoQ09ORklHX0JJVEJBTkdNSUkpCisjaWYgKGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkpICYmICFkZWZpbmVkKENPTkZJR19CSVRCQU5HTUlJKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogbWlpX2luaXQgLS0gSW5pdGlhbGl6ZSB0aGUgTUlJIGZvciBNSUkgY29tbWFuZCB3aXRob3V0IGV0aGVybmV0CkBAIC0xMDIwLDYgKzEwMjAsNiBAQAogI2VuZGlmCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSAmJiAhZGVmaW5lZChDT05GSUdfQklUQkFOR01JSSkqLworI2VuZGlmCiAKLSNlbmRpZgkvKiBDRkdfQ01EX05FVCwgRkVDX0VORVQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzh4eC9rZ2RiLlMgYi9jcHUvbXBjOHh4L2tnZGIuUwppbmRleCAxMWMzYzY5Li44MTJiYWEzIDEwMDY0NAotLS0gYS9jcHUvbXBjOHh4L2tnZGIuUworKysgYi9jcHUvbXBjOHh4L2tnZGIuUwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9tbXUuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAKICAvKgogICogY2FjaGUgZmx1c2hpbmcgcm91dGluZXMgZm9yIGtnZGIKQEAgLTcxLDQgKzcxLDQgQEAKIAlTWU5DCiAJYmxyCiAKLSNlbmRpZiAvKiBDRkdfQ01EX0tHREIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzh4eC9zY2MuYyBiL2NwdS9tcGM4eHgvc2NjLmMKaW5kZXggNmI5MTEwZi4uNzQ0ZGNkZCAxMDA2NDQKLS0tIGEvY3B1L21wYzh4eC9zY2MuYworKysgYi9jcHUvbXBjOHh4L3NjYy5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSA8bmV0Lmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKFNDQ19FTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoU0NDX0VORVQpCiAKIC8qIEV0aGVybmV0IFRyYW5zbWl0IGFuZCBSZWNlaXZlIEJ1ZmZlcnMgKi8KICNkZWZpbmUgREJVRl9MRU5HVEggIDE1MjAKQEAgLTU2Nyw0ICs1NjcsNCBAQAogCQkoU0NDX0dTTVJMX0VOUiB8IFNDQ19HU01STF9FTlQpOwogfQogI2VuZGlmCi0jZW5kaWYJLyogQ0ZHX0NNRF9ORVQsIFNDQ19FTkVUICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM4eHgvc2VyaWFsLmMgYi9jcHUvbXBjOHh4L3NlcmlhbC5jCmluZGV4IGZmYzg5OGMuLjY4ODA0Y2MgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4eHgvc2VyaWFsLmMKKysrIGIvY3B1L21wYzh4eC9zZXJpYWwuYwpAQCAtNjY2LDcgKzY2Niw3IEBACiB9CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAKIHZvaWQKIGtnZGJfc2VyaWFsX2luaXQodm9pZCkKQEAgLTcyMyw2ICs3MjMsNiBAQAogewogCXJldHVybjsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX0tHREIJKi8KKyNlbmRpZgogCiAjZW5kaWYJLyogQ09ORklHXzh4eF9DT05TX05PTkUgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM4eHgvdHJhcHMuYyBiL2NwdS9tcGM4eHgvdHJhcHMuYwppbmRleCA2N2I3NWNjLi5lMWVjODg5IDEwMDY0NAotLS0gYS9jcHUvbXBjOHh4L3RyYXBzLmMKKysrIGIvY3B1L21wYzh4eC90cmFwcy5jCkBAIC0zNiwxMSArMzYsMTEgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIGludCAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShzdHJ1Y3QgcHRfcmVncyAqKSA9IDA7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQoc3RydWN0IHB0X3JlZ3MgKik7CiAjZW5kaWYKIApAQCAtMTI2LDcgKzEyNiw3IEBACiAJCXJldHVybjsKIAl9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xNTksNyArMTU5LDcgQEAKIHZvaWQKIEFsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xNzEsNyArMTcxLDcgQEAKIHZvaWQKIFByb2dyYW1DaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xODMsNyArMTgzLDcgQEAKIHZvaWQKIFNvZnRFbXVFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTk2LDcgKzE5Niw3IEBACiB2b2lkCiBVbmtub3duRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIxMCw3ICsyMTAsNyBAQAogewogICBwcmludGYoIkRlYnVnZ2VyIHRyYXAgYXQgQCAlbHhcbiIsIHJlZ3MtPm5pcCApOwogICBzaG93X3JlZ3MocmVncyk7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiAgIGRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2NwdS9uaW9zL2NwdS5jIGIvY3B1L25pb3MvY3B1LmMKaW5kZXggZDJiYjJjMC4uNTUxOWU4MiAxMDA2NDQKLS0tIGEvY3B1L25pb3MvY3B1LmMKKysrIGIvY3B1L25pb3MvY3B1LmMKQEAgLTM0LDcgKzM0LDcgQEAKIAogCS8qIEdldCBjcHUgdmVyc2lvbiBpbmZvICovCiAJdmFsID0gcmRjdGwgKENUTF9DUFVfSUQpOwotCXByaW50ZiAoIkNQVTogIik7CisJcHV0cyAoIkNQVTogICAiKTsKIAlwcmludGYgKCIlcyIsICh2YWwgJiAweDAwMDA4MDAwKSA/ICJOaW9zLTE2ICIgOiAiTmlvcy0zMiAiKTsKIAlyZXZfbWFqb3IgPSAodmFsPj4xMikgJiAweDA3OwogCXJldl9taW5vciA9ICh2YWw+PjQpICYgMHgwZmY7CmRpZmYgLS1naXQgYS9jcHUvbmlvcy9pbnRlcnJ1cHRzLmMgYi9jcHUvbmlvcy9pbnRlcnJ1cHRzLmMKaW5kZXggNDhmYzgxZS4uNzVlNDkxZCAxMDA2NDQKLS0tIGEvY3B1L25pb3MvaW50ZXJydXB0cy5jCisrKyBiL2NwdS9uaW9zL2ludGVycnVwdHMuYwpAQCAtMTczLDcgKzE3Myw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQogaW50IGRvX2lycWluZm8gKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCWludCB2ZWM7CkBAIC0xOTMsNCArMTkzLDQgQEAKIAogCXJldHVybiAoMCk7CiB9Ci0jZW5kaWYgIC8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9uaW9zMi9pbnRlcnJ1cHRzLmMgYi9jcHUvbmlvczIvaW50ZXJydXB0cy5jCmluZGV4IDQ2ODUxNjEuLmFlYjViNjUgMTAwNjQ0Ci0tLSBhL2NwdS9uaW9zMi9pbnRlcnJ1cHRzLmMKKysrIGIvY3B1L25pb3MyL2ludGVycnVwdHMuYwpAQCAtMjA0LDcgKzIwNCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JUlEpCiBpbnQgZG9faXJxaW5mbyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJaW50IGk7CkBAIC0yMjgsNCArMjI4LDQgQEAKIAogCXJldHVybiAoMCk7CiB9Ci0jZW5kaWYgIC8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvNHh4X2VuZXQuYyBiL2NwdS9wcGM0eHgvNHh4X2VuZXQuYwppbmRleCBiOTAzNjNmLi5jYzhlNzM0IDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4LzR4eF9lbmV0LmMKKysrIGIvY3B1L3BwYzR4eC80eHhfZW5ldC5jCkBAIC05NCw5ICs5NCw5IEBACiAgKiBuZXR3b3JrIHN1cHBvcnQgZW5hYmxlZC4KICAqIFJlbWFyazogQ09ORklHXzQwNSBkZXNjcmliZXMgWGlsaW54IFBQQzQwNSBGUEdBIHdpdGhvdXQgRU1BQyBjb250cm9sbGVyIQogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiAhZGVmaW5lZChDT05GSUdfNDA1KSAmJiAhZGVmaW5lZChDT05GSUdfSU9QNDgwKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmICFkZWZpbmVkKENPTkZJR180MDUpICYmICFkZWZpbmVkKENPTkZJR19JT1A0ODApCiAKLSNpZiAhKGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSkKKyNpZiAhKGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkpCiAjZXJyb3IgIkNPTkZJR19NSUkgaGFzIHRvIGJlIGRlZmluZWQhIgogI2VuZGlmCiAKQEAgLTE2ODUsNyArMTY4NSw3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAJCW1paXBoeV9yZWdpc3RlciAoZGV2LT5uYW1lLAogCQkJCSBlbWFjNHh4X21paXBoeV9yZWFkLCBlbWFjNHh4X21paXBoeV93cml0ZSk7CiAjZW5kaWYKQEAgLTE3MjYsNyArMTcyNiw3IEBACiAKIGludCBlbWFjNHh4X21paXBoeV9pbml0aWFsaXplIChiZF90ICogYmlzKQogewotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKIAltaWlwaHlfcmVnaXN0ZXIgKCJwcGNfNHh4X2V0aDAiLAogCQkJIGVtYWM0eHhfbWlpcGh5X3JlYWQsIGVtYWM0eHhfbWlpcGh5X3dyaXRlKTsKICNlbmRpZgpAQCAtMTczNSw0ICsxNzM1LDQgQEAKIH0KICNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAqLwogCi0jZW5kaWYgLyogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L3BwYzR4eC9NYWtlZmlsZSBiL2NwdS9wcGM0eHgvTWFrZWZpbGUKaW5kZXggNDA2OGI1My4uYWY5ZGE1YiAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC9NYWtlZmlsZQorKysgYi9jcHUvcHBjNHh4L01ha2VmaWxlCkBAIC0yNywxMiArMjcsMTIgQEAKIAogU1RBUlQJPSBzdGFydC5vIHJlc2V0dmVjLm8ga2dkYi5vCiBTT0JKUwk9IGRjci5vCi1DT0JKUwk9IDQwNWdwX3BjaS5vIDR4eF9lbmV0Lm8gXAorQ09CSlMJPSA0MDVncF9wY2kubyA0NDBzcGVfcGNpZS5vIDR4eF9lbmV0Lm8gXAogCSAgYmVkYnVnXzQwNS5vIGNvbW1wcm9jLm8gXAogCSAgY3B1Lm8gY3B1X2luaXQubyBncGlvLm8gaTJjLm8gaW50ZXJydXB0cy5vIFwKIAkgIG1paXBoeS5vIG5kZmMubyBzZHJhbS5vIHNlcmlhbC5vIFwKIAkgIDQweF9zcGRfc2RyYW0ubyA0NHhfc3BkX2Rkci5vIDQ0eF9zcGRfZGRyMi5vIHNwZWVkLm8gXAotCSAgdGxiLm8gdHJhcHMubyB1c2Jfb2hjaS5vIHVzYmRldi5vIFwKKwkgIHRsYi5vIHRyYXBzLm8gdXNiX29oY2kubyB1c2IubyB1c2JkZXYubyBcCiAJICA0NDBzcGVfcGNpZS5vCiAKIFNSQ1MJOj0gJChTVEFSVDoubz0uUykgJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvYmVkYnVnXzQwNS5jIGIvY3B1L3BwYzR4eC9iZWRidWdfNDA1LmMKaW5kZXggYTNjMjExOS4uNWVmNTYwNyAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC9iZWRidWdfNDA1LmMKKysrIGIvY3B1L3BwYzR4eC9iZWRidWdfNDA1LmMKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxiZWRidWcvcmVncy5oPgogI2luY2x1ZGUgPGJlZGJ1Zy9wcGMuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykgJiYgZGVmaW5lZChDT05GSUdfNHh4KQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpICYmIGRlZmluZWQoQ09ORklHXzR4eCkKIAogI2RlZmluZSBNQVhfQlJFQUtfUE9JTlRTIDQKIApkaWZmIC0tZ2l0IGEvY3B1L3BwYzR4eC9kY3IuUyBiL2NwdS9wcGM0eHgvZGNyLlMKaW5kZXggNzEwMjM2NC4uOTM0NjVhMyAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC9kY3IuUworKysgYi9jcHUvcHBjNHh4L2Rjci5TCkBAIC0yMiw3ICsyMiw3IEBACiAgKi8KICNpbmNsdWRlIDxjb25maWcuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHXzR4eCkgJiYgZGVmaW5lZChDRkdfQ01EX1NFVEdFVERDUikKKyNpZiBkZWZpbmVkKENPTkZJR180eHgpICYmIGRlZmluZWQoQ09ORklHX0NNRF9TRVRHRVREQ1IpCiAKICNpbmNsdWRlIDxwcGM0eHguaD4KIApAQCAtMTk1LDQgKzE5NSw0IEBACiAJCWJscgkJCQkvKiBSZXR1cm4gdG8gY2FsbGluZyBmdW5jdGlvbiAqLwogLkxmZTQ6CQkuc2l6ZQlzZXRfZGNyLC5MZmU0LXNldF9kY3IKIC8qIGVuZCBzZXRfZGNyKCkgKi8KLSNlbmRpZiAvKiBDT05GSUdfNHh4ICYgQ0ZHX0NNRF9TRVRHRVREQ1IgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L3BwYzR4eC9pbnRlcnJ1cHRzLmMgYi9jcHUvcHBjNHh4L2ludGVycnVwdHMuYwppbmRleCBjNWE5ZjAyLi5jYTU2NWNjIDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4L2ludGVycnVwdHMuYworKysgYi9jcHUvcHBjNHh4L2ludGVycnVwdHMuYwpAQCAtNjI4LDcgKzYyOCw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JUlEpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjk4LDQgKzY5OCw0IEBACiAKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAgLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JUlEgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L3BwYzR4eC9rZ2RiLlMgYi9jcHUvcHBjNHh4L2tnZGIuUwppbmRleCBiZTI4MzQwLi44YzRiYmYyIDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4L2tnZGIuUworKysgYi9jcHUvcHBjNHh4L2tnZGIuUwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9tbXUuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAgLyoKICAqIGNhY2hlIGZsdXNoaW5nIHJvdXRpbmVzIGZvciBrZ2RiCiAgKi8KQEAgLTc1LDQgKzc1LDQgQEAKIAlTWU5DCiAJYmxyCiAKLSNlbmRpZiAvKiBDRkdfQ01EX0tHREIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L3BwYzR4eC9uZGZjLmMgYi9jcHUvcHBjNHh4L25kZmMuYwppbmRleCBmNjNmYzc5Li4zOTg0NTc3IDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4L25kZmMuYworKysgYi9jcHUvcHBjNHh4L25kZmMuYwpAQCAtMzEsNyArMzEsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpICYmIFwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKSAmJiBcCiAJKGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUikgfHwJICAgICBcCiAJIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKSB8fAkgICAgIFwKIAkgZGVmaW5lZChDT05GSUdfNDA1RVopKQpkaWZmIC0tZ2l0IGEvY3B1L3BwYzR4eC9zZXJpYWwuYyBiL2NwdS9wcGM0eHgvc2VyaWFsLmMKaW5kZXggMzc2Y2ExZS4uNjA3MTJiMSAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC9zZXJpYWwuYworKysgYi9jcHUvcHBjNHh4L3NlcmlhbC5jCkBAIC04NDgsNyArODQ4LDcgQEAKIAogI2VuZGlmCS8qIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTyAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIC8qCiAgIEFTIEhBUk5PSVMgOiBhY2NvcmRpbmcgdG8gQ09ORklHX0tHREJfU0VSX0lOREVYIGtnZGIgdXNlcyBzZXJpYWwgcG9ydAogICBudW1iZXIgMCBvciBudW1iZXIgMQpAQCAtOTU0LDcgKzk1NCw3IEBACiAJcmV0dXJuOwogfQogI2VuZGlmCS8qIChDT05GSUdfS0dEQl9TRVJfSU5ERVggJiAyKSAqLwotI2VuZGlmCS8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCiAKIAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9NVUxUSSkKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvdHJhcHMuYyBiL2NwdS9wcGM0eHgvdHJhcHMuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGRlNWZkZTkuLmY1MzY1Y2IKLS0tIGEvY3B1L3BwYzR4eC90cmFwcy5jCisrKyBiL2NwdS9wcGM0eHgvdHJhcHMuYwpAQCAtMzgsNyArMzgsNyBAQAogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiBpbnQgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikoc3RydWN0IHB0X3JlZ3MgKikgPSAwOwogI2VuZGlmCiAKQEAgLTc4LDcgKzc4LDcgQEAKICNkZWZpbmUgRVNSX0RJWiAweDAwNDAwMDAwCiAjZGVmaW5lIEVTUl9VMEYgMHgwMDAwODAwMAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiBleHRlcm4gdm9pZCBkb19iZWRidWdfYnJlYWtwb2ludChzdHJ1Y3QgcHRfcmVncyAqKTsKICNlbmRpZgogCkBAIC0xNjUsNyArMTY1LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTMxMiw3ICszMTIsNyBAQAogdm9pZAogQWxpZ25tZW50RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTMyNyw3ICszMjcsNyBAQAogewogCWxvbmcgZXNyX3ZhbDsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTM2NCw3ICszNjQsNyBAQAogdm9pZAogVW5rbm93bkV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0zNzksNyArMzc5LDcgQEAKIHsKIAlwcmludGYoIkRlYnVnZ2VyIHRyYXAgYXQgQCAlbHhcbiIsIHJlZ3MtPm5pcCApOwogCXNob3dfcmVncyhyZWdzKTsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKIAlkb19iZWRidWdfYnJlYWtwb2ludCggcmVncyApOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4L3VzYi5jIGIvY3B1L3BwYzR4eC91c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzJlZDhjCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L3BwYzR4eC91c2IuYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBNYXJrdXMgS2xvdHpidWVjaGVyLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIDxta0BkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9PSENJX05FVykgJiYgZGVmaW5lZChDRkdfVVNCX09IQ0lfQ1BVX0lOSVQpCisKKyNpbmNsdWRlICJ1c2JkZXYuaCIKKworaW50IHVzYl9jcHVfaW5pdCh2b2lkKQoreworCisjaWYgZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IGRlZmluZWQoQ09ORklHXzQ0MEVQWCkKKwl1c2JfZGV2X2luaXQoKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JfY3B1X3N0b3Aodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9jcHVfaW5pdF9mYWlsKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSSkgJiYgZGVmaW5lZChDRkdfVVNCX09IQ0lfQ1BVX0lOSVQpICovCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4L3VzYmRldi5jIGIvY3B1L3BwYzR4eC91c2JkZXYuYwppbmRleCA2MTQwZDJhLi41OTI0YTZjIDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4L3VzYmRldi5jCisrKyBiL2NwdS9wcGM0eHgvdXNiZGV2LmMKQEAgLTMsNyArMyw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCi0jaWYgKGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBFUFgpKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpCisjaWYgKGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBFUFgpKSAmJiBkZWZpbmVkKENPTkZJR19DTURfVVNCKQogCiAjaW5jbHVkZSA8dXNiLmg+CiAjaW5jbHVkZSAidXNiZGV2LmgiCmRpZmYgLS1naXQgYS9jcHUvcHhhL01ha2VmaWxlIGIvY3B1L3B4YS9NYWtlZmlsZQppbmRleCBjZGVkN2ZmLi44YjQzNjdlIDEwMDY0NAotLS0gYS9jcHUvcHhhL01ha2VmaWxlCisrKyBiL2NwdS9weGEvTWFrZWZpbGUKQEAgLTI2LDcgKzI2LDcgQEAKIExJQgk9ICQob2JqKWxpYiQoQ1BVKS5hCiAKIFNUQVJUCT0gc3RhcnQubwotQ09CSlMJPSBzZXJpYWwubyBpbnRlcnJ1cHRzLm8gY3B1Lm8gaTJjLm8gcHhhZmIubyBtbWMubworQ09CSlMJPSBzZXJpYWwubyBpbnRlcnJ1cHRzLm8gY3B1Lm8gaTJjLm8gcHhhZmIubyBtbWMubyB1c2IubwogCiBTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCiBPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKZGlmZiAtLWdpdCBhL2NwdS9weGEvdXNiLmMgYi9jcHUvcHhhL3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZjQ1N2YKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvcHhhL3VzYi5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIE1hcmt1cyBLbG90emJ1ZWNoZXIsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgPG1rQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfTkVXKSAmJiBkZWZpbmVkKENGR19VU0JfT0hDSV9DUFVfSU5JVCkKKyMgaWYgZGVmaW5lZChDT05GSUdfQ1BVX01PTkFIQU5TKSB8fCBkZWZpbmVkKENPTkZJR19QWEEyN1gpCisKKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorCitpbnQgdXNiX2NwdV9pbml0KCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfTU9OQUhBTlMpCisJLyogRW5hYmxlIFVTQiBob3N0IGNsb2NrLiAqLworCUNLRU5BIHw9IChDS0VOQV8yX1VTQkhPU1QgfCAgQ0tFTkFfMjBfVURDKTsKKwl1ZGVsYXkoMTAwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1BYQTI3WCkKKwkvKiBFbmFibGUgVVNCIGhvc3QgY2xvY2suICovCisJQ0tFTiB8PSBDS0VOMTBfVVNCSE9TVDsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX01PTkFIQU5TKQorCS8qIENvbmZpZ3VyZSBQb3J0IDIgZm9yIEhvc3QgKFVTQiBDbGllbnQgUmVnaXN0ZXJzKSAqLworCVVQMk9DUiA9IDB4MzAwMGM7CisjZW5kaWYKKworCVVIQ0hSIHw9IFVIQ0hSX0ZIUjsKKwl3YWl0X21zKDExKTsKKwlVSENIUiAmPSB+VUhDSFJfRkhSOworCisJVUhDSFIgfD0gVUhDSFJfRlNCSVI7CisJd2hpbGUgKFVIQ0hSICYgVUhDSFJfRlNCSVIpCisJCXVkZWxheSgxKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9NT05BSEFOUykKKwlVSENIUiAmPSB+VUhDSFJfU1NFUDA7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19QWEEyN1gpCisJVUhDSFIgJj0gflVIQ0hSX1NTRVAyOworI2VuZGlmCisJVUhDSFIgJj0gflVIQ0hSX1NTRVAxOworCVVIQ0hSICY9IH5VSENIUl9TU0U7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9jcHVfc3RvcCgpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JfY3B1X2luaXRfZmFpbCgpCit7CisJcmV0dXJuIDA7Cit9CisKKyMgZW5kaWYgLyogZGVmaW5lZChDT05GSUdfQ1BVX01PTkFIQU5TKSB8fCBkZWZpbmVkKENPTkZJR19QWEEyN1gpICovCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfVVNCX09IQ0kpICYmIGRlZmluZWQoQ0ZHX1VTQl9PSENJX0NQVV9JTklUKSAqLwpkaWZmIC0tZ2l0IGEvZGlzay9wYXJ0LmMgYi9kaXNrL3BhcnQuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDZhYjU4NTcuLjU2Yjk0MjcKLS0tIGEvZGlzay9wYXJ0LmMKKysrIGIvZGlzay9wYXJ0LmMKQEAgLTM0LDkgKzM0LDkgQEAKICNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQogI2VuZGlmCiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCXx8IFwKLSAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKQl8fCBcCisjaWYgKGRlZmluZWQoQ09ORklHX0NNRF9JREUpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1VTQikgfHwgXAogICAgICBkZWZpbmVkKENPTkZJR19NTUMpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfU1lTVEVNQUNFKSApCiAKQEAgLTQ2LDEzICs0NiwxMyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBibG9ja19kcnZyIGJsb2NrX2RydnJbXSA9IHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKIAl7IC5uYW1lID0gImlkZSIsIC5nZXRfZGV2ID0gaWRlX2dldF9kZXYsIH0sCiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TQ1NJKQogCXsgLm5hbWUgPSAic2NzaSIsIC5nZXRfZGV2ID0gc2NzaV9nZXRfZGV2LCB9LAogI2VuZGlmCi0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikgJiYgZGVmaW5lZChDT05GSUdfVVNCX1NUT1JBR0UpKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9VU0IpICYmIGRlZmluZWQoQ09ORklHX1VTQl9TVE9SQUdFKQogCXsgLm5hbWUgPSAidXNiIiwgLmdldF9kZXYgPSB1c2Jfc3Rvcl9nZXRfZGV2LCB9LAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfTU1DKQpAQCAtODYsOSArODYsOSBAQAogfQogI2VuZGlmCiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCXx8IFwKLSAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKQl8fCBcCisjaWYgKGRlZmluZWQoQ09ORklHX0NNRF9JREUpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1VTQikgfHwgXAogICAgICBkZWZpbmVkKENPTkZJR19NTUMpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfU1lTVEVNQUNFKSApCiAKQEAgLTE3NCwxMSArMTc0LDExIEBACiAJCXB1dHMgKCIgICAgICAgICAgICBDYXBhY2l0eTogbm90IGF2YWlsYWJsZVxuIik7CiAJfQogfQotI2VuZGlmCS8qIENGR19DTURfSURFIHx8IENGR19DTURfU0NTSSB8fCBDRkdfQ01EX1VTQiB8fCBDT05GSUdfTU1DICovCisjZW5kaWYKIAotI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCXx8IFwKLSAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkJfHwgXAotICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpCXx8IFwKKyNpZiAoZGVmaW5lZChDT05GSUdfQ01EX0lERSkgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19DTURfVVNCKSB8fCBcCiAgICAgIGRlZmluZWQoQ09ORklHX01NQykJCXx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfU1lTVEVNQUNFKSAgICAgICAgICApCiAKQEAgLTMzMCw0ICszMzAsNCBAQAogIyBlcnJvciBub3IgQ09ORklHX0lTT19QQVJUSVRJT04gY29uZmlndXJlZCEKICNlbmRpZgogCi0jZW5kaWYJLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSB8fCBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc2svcGFydF9hbWlnYS5jIGIvZGlzay9wYXJ0X2FtaWdhLmMKaW5kZXggNDFlNjhmYy4uNmMzZDc0OCAxMDA2NDQKLS0tIGEvZGlzay9wYXJ0X2FtaWdhLmMKKysrIGIvZGlzay9wYXJ0X2FtaWdhLmMKQEAgLTI2LDkgKzI2LDkgQEAKICNpbmNsdWRlIDxpZGUuaD4KICNpbmNsdWRlICJwYXJ0X2FtaWdhLmgiCiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCXx8IFwKLSAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKQl8fCBcCisjaWYgKGRlZmluZWQoQ09ORklHX0NNRF9JREUpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1VTQikgfHwgXAogICAgICBkZWZpbmVkKENPTkZJR19NTUMpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfU1lTVEVNQUNFKSApICYmIGRlZmluZWQoQ09ORklHX0FNSUdBX1BBUlRJVElPTikKIApkaWZmIC0tZ2l0IGEvZGlzay9wYXJ0X2Rvcy5jIGIvZGlzay9wYXJ0X2Rvcy5jCmluZGV4IDEzM2VlNzkuLjQ3MDdmODAgMTAwNjQ0Ci0tLSBhL2Rpc2svcGFydF9kb3MuYworKysgYi9kaXNrL3BhcnRfZG9zLmMKQEAgLTM1LDkgKzM1LDkgQEAKICNpbmNsdWRlIDxpZGUuaD4KICNpbmNsdWRlICJwYXJ0X2Rvcy5oIgogCi0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkJfHwgXAotICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikJfHwgXAorI2lmIChkZWZpbmVkKENPTkZJR19DTURfSURFKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9TQ1NJKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9VU0IpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfTU1DKSB8fCBcCiAgICAgIGRlZmluZWQoQ09ORklHX1NZU1RFTUFDRSkgKSAmJiBkZWZpbmVkKENPTkZJR19ET1NfUEFSVElUSU9OKQogCkBAIC0yNDgsNCArMjQ4LDQgQEAKIH0KIAogCi0jZW5kaWYJLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBDT05GSUdfRE9TX1BBUlRJVElPTiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kaXNrL3BhcnRfaXNvLmMgYi9kaXNrL3BhcnRfaXNvLmMKaW5kZXggMDczNTMyNC4uMDZkZDc1ZSAxMDA2NDQKLS0tIGEvZGlzay9wYXJ0X2lzby5jCisrKyBiL2Rpc2svcGFydF9pc28uYwpAQCAtMjUsOSArMjUsOSBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlICJwYXJ0X2lzby5oIgogCi0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkJfHwgXAotICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikJfHwgXAorI2lmIChkZWZpbmVkKENPTkZJR19DTURfSURFKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9TQ1NJKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9VU0IpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfTU1DKSB8fCBcCiAgICAgIGRlZmluZWQoQ09ORklHX1NZU1RFTUFDRSkgKSAmJiBkZWZpbmVkKENPTkZJR19JU09fUEFSVElUSU9OKQogCkBAIC0yNTcsNCArMjU3LDQgQEAKIAlyZXR1cm4oZ2V0X3BhcnRpdGlvbl9pbmZvX2lzb192ZXJiKGRldl9kZXNjLDAsJmluZm8sMCkpOwogfQogCi0jZW5kaWYgLyogKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkpICYmIGRlZmluZWQoQ09ORklHX0lTT19QQVJUSVRJT04pICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc2svcGFydF9tYWMuYyBiL2Rpc2svcGFydF9tYWMuYwppbmRleCA4YzIzZTIxLi5kMzAzYTczIDEwMDY0NAotLS0gYS9kaXNrL3BhcnRfbWFjLmMKKysrIGIvZGlzay9wYXJ0X21hYy5jCkBAIC0zNCw5ICszNCw5IEBACiAjaW5jbHVkZSA8aWRlLmg+CiAjaW5jbHVkZSAicGFydF9tYWMuaCIKIAotI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCXx8IFwKLSAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkJfHwgXAotICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpCXx8IFwKKyNpZiAoZGVmaW5lZChDT05GSUdfQ01EX0lERSkgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19DTURfVVNCKSB8fCBcCiAgICAgIGRlZmluZWQoQ09ORklHX01NQykgfHwgXAogICAgICBkZWZpbmVkKENPTkZJR19TWVNURU1BQ0UpICkgJiYgZGVmaW5lZChDT05GSUdfTUFDX1BBUlRJVElPTikKIApAQCAtMjUxLDQgKzI1MSw0IEBACiAJcmV0dXJuICgwKTsKIH0KIAotI2VuZGlmCS8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgJiYgQ09ORklHX01BQ19QQVJUSVRJT04gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5KRkZTMiBiL2RvYy9SRUFETUUuSkZGUzIKaW5kZXggMjcwZGE5MC4uYzVkNjdmZCAxMDA2NDQKLS0tIGEvZG9jL1JFQURNRS5KRkZTMgorKysgYi9kb2MvUkVBRE1FLkpGRlMyCkBAIC0yLDcgKzIsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogSkZGUzIgaW4gVS1Cb290IGlzIGEgcmVhZCBvbmx5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBmaWxlIHN5c3RlbSBpbgotTGludXggd2l0aCB0aGUgc2FtZSBuYW1lLiBUbyB1c2UgSkZGUzIgZGVmaW5lIENGR19DTURfSkZGUzIuCitMaW51eCB3aXRoIHRoZSBzYW1lIG5hbWUuIFRvIHVzZSBKRkZTMiBkZWZpbmUgQ09ORklHX0NNRF9KRkZTMi4KIAogVGhlIG1vZHVsZSBhZGRzIHRocmVlIG5ldyBjb21tYW5kcy4KIGZzbG9hZCAgLSBsb2FkIGJpbmFyeSBmaWxlIGZyb20gYSBmaWxlIHN5c3RlbSBpbWFnZQpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5QSVA0MDUgYi9kb2MvUkVBRE1FLlBJUDQwNQppbmRleCBjNWNjZjE4Li42MTBmZjIxIDEwMDY0NAotLS0gYS9kb2MvUkVBRE1FLlBJUDQwNQorKysgYi9kb2MvUkVBRE1FLlBJUDQwNQpAQCAtMzIsMTAgKzMyLDggQEAKIC0gaW5jbHVkZS9jbWRfYnNwLmgJCWFkZGVkIFBJUDQwNSBjb21tYW5kcyBkZWZpbml0aW9ucwogLSBpbmNsdWRlL2NtZF9jb25kZWZzLmgJCWFkZGVkIEZsb3BweSBhbmQgU0NTSSBzdXBwb3J0CiAtIGluY2x1ZGUvY21kX2Rpc2suaAkJY2hhbmdlZCB0byB3b3JrIHdpdGggYmxvY2sgZGV2aWNlIGRlc2NyaXB0aW9uCi0tIGluY2x1ZGUvY29uZmlnX0xBTlRFQy5oCWV4Y2x1ZGVkIENGR19DTURfRkRDIGFuZCBDRkdfQ01EX1NDU0kgZnJvbQotCQkJCUNPTkZJR19DTURfRlVMTAotLSBpbmNsdWRlL2NvbmZpZ19oeW1vZC5oCWV4Y2x1ZGVkIENGR19DTURfRkRDIGFuZCBDRkdfQ01EX1NDU0kgZnJvbQotCQkJCUNPTkZJR19DTURfRlVMTAorLSBpbmNsdWRlL2NvbmZpZ19MQU5URUMuaAlleGNsdWRlZCBDT05GSUdfQ01EX0ZEQyBhbmQgQ09ORklHX0NNRF9TQ1NJCistIGluY2x1ZGUvY29uZmlnX2h5bW9kLmgJZXhjbHVkZWQgQ09ORklHX0NNRF9GREMgYW5kIENPTkZJR19DTURfU0NTSQogLSBpbmNsdWRlL2ZsYXNoLmgJCWFkZGVkIElOVEVMX0lEXzI4RjMyMEMzVCAgMHg4OEM0ODhDNAogLSBpbmNsdWRlL2kyYy5oCQkJYWRkZWQgImRlZmluZWQoQ09ORklHX1BJUDQwNSkiCiAtIGluY2x1ZGUvaW1hZ2UuaAkJYWRkZWQgSUhfT1NfVV9CT09ULCBJSF9UWVBFX0ZJUk1XQVJFCkBAIC04OCw4ICs4Niw4IEBACiAKIE5ldyBDb21tYW5kczoKIC0tLS0tLS0tLS0tLS0KLUNGR19DTURfU0NTSQlTQ1NJIFN1cHBvcnQKLUNGR19DTUZfRkRDCUZsb3BweSBkaXNrIHN1cHBvcnQKK0NPTkZJR19DTURfU0NTSQlTQ1NJIFN1cHBvcnQKK0NPTkZJR19DTUZfRkRDCUZsb3BweSBkaXNrIHN1cHBvcnQKIAogSURFIGFkZGl0aW9uczoKIC0tLS0tLS0tLS0tLS0tCkBAIC0xNzIsOCArMTcwLDggQEAKIEZsb3BweSBzdXBwb3J0OgogLS0tLS0tLS0tLS0tLS0tCiBTdXBwb3J0IG9mIGEgc3RhbmRhcmQgZmxvcHB5IGRpc2sgY29udHJvbGxlciBhdCBhZGRyZXNzIENGR19JU0FfSU9fQkFTRV9BRERSRVNTCi0rIDB4M0YwLiBFbmFibGVkIHdpdGggZGVmaW5lIENGR19DTURfRkRDLiBSZWFkcyBhIHVuZm9ybWF0ZWQgZmxvcHB5IGRpc2sgd2l0aCBhCi1pbWFnZSBoZWFkZXIgKHNlZTogbWtpbWFnZSkuIE5vIGludGVycnVwdHMgYW5kIG5vIERNQSBhcmUgdXNlZCBmb3IgdGhpcy4KKysgMHgzRjAuIEVuYWJsZWQgd2l0aCBkZWZpbmUgQ09ORklHX0NNRF9GREMuIFJlYWRzIGEgdW5mb3JtYXRlZCBmbG9wcHkgZGlzaword2l0aCBhIGltYWdlIGhlYWRlciAoc2VlOiBta2ltYWdlKS4gTm8gaW50ZXJydXB0cyBhbmQgbm8gRE1BIGFyZSB1c2VkIGZvciB0aGlzLgogQWRkZWQgZmlsZXM6CiAtIGNvbW1vbi9jbWRfZmRjLmMKIC0gaW5jbHVkZS9jbWRfZmRjLmgKZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUuU05UUCBiL2RvYy9SRUFETUUuU05UUAppbmRleCBmZDZmMjA5Li45ZWRjOTU3IDEwMDY0NAotLS0gYS9kb2MvUkVBRE1FLlNOVFAKKysrIGIvZG9jL1JFQURNRS5TTlRQCkBAIC0xLDUgKzEsNSBAQAotVG8gdXNlIFNOVFAgc3VwcG9ydCwgYWRkIGEgZGVmaW5lIENGR19DTURfU05UUCB0byBDT05GSUdfQ09NTUFORFMgaW4KLXRoZSBjb25maWd1cmF0aW9uIGZpbGUgb2YgdGhlIGJvYXJkLgorVG8gdXNlIFNOVFAgc3VwcG9ydCwgYWRkIGRlZmluZSBDT05GSUdfQ01EX1NOVFAgdG8gdGhlCitjb25maWd1cmF0aW9uIGZpbGUgb2YgdGhlIGJvYXJkLgogCiBUaGUgInNudHAiIGNvbW1hbmQgZ2V0cyBuZXR3b3JrIHRpbWUgZnJvbSBOVFAgdGltZSBzZXJ2ZXIgYW5kCiBzeW5jcm9uaXplIFJUQyBvZiB0aGUgYm9hcmQuIFRoaXMgY29tbWFuZCBuZWVkcyB0aGUgY29tbWFuZCBsaW5lCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLmJlZGJ1ZyBiL2RvYy9SRUFETUUuYmVkYnVnCmluZGV4IDljZmI0MjEuLjI2MTZhY2MgMTAwNjQ0Ci0tLSBhL2RvYy9SRUFETUUuYmVkYnVnCisrKyBiL2RvYy9SRUFETUUuYmVkYnVnCkBAIC0zMSwxMiArMzEsNiBAQAogCWlmIGl0IGlzIGFuIGlsbGVnYWwgaW5zdHJ1Y3Rpb24sIHByaXZpbGVnZWQgaW5zdHJ1Y3Rpb24gb3IKIAlhIHRyYXAuIEFsc28gYWRkZWQgZGVidWcgdHJhcCBoYW5kbGVyLgogCi0uL2luY2x1ZGUvY21kX2NvbmZkZWZzLmgKLQlBZGRlZCBkZWZpbml0aW9uIG9mIENGR19DTURfQkVEQlVHLgotCi0uL2luY2x1ZGUvY29uZmlnX1dBTE5VVDQwNS5oCi0JQWRkZWQgQ0ZHX0NNRF9CRURCVUcgdG8gdGhlIENPTkZJR19DT01NQU5EUyBmb3IgdGhlIFdBTE5VVC4KLQogLi9pbmNsdWRlL3BwY19hc20udG1wbAogCUFkZGVkIGNvZGUgdG8gaGFuZGxlIGNyaXRpY2FsIGV4Y2VwdGlvbnMKIApAQCAtNzgsMTAgKzcyLDYgQEAKIAljcHUvbXBjOHh4L3RyYXBzLmMKIAkJQWRkZWQgbmV3IHJvdXRpbmUgRGVidWdFeGNlcHRpb24oKQogCi0JaW5jbHVkZS9jb25maWdfTUJYLmgKLQkJQWRkZWQgQ0ZHX0NNRF9CRURCVUcgdG8gQ09ORklHX0NPTU1BTkRTIGRlZmluZQotCi0KIE5ldyBGaWxlczoKIAogCWNwdS9tcGM4eHgvYmVkYnVnXzg2MC5jCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLmdlbmVyaWNfdXNiX29oY2kgYi9kb2MvUkVBRE1FLmdlbmVyaWNfdXNiX29oY2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0ZGQxZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9SRUFETUUuZ2VuZXJpY191c2Jfb2hjaQpAQCAtMCwwICsxLDU3IEBACitOb3RlcyBvbiB0aGUgdGhlIGdlbmVyaWMgVVNCLU9IQ0kgZHJpdmVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZHJpdmVyIChkcml2ZXJzL3VzYl9vaGNpLltjaF0pIGlzIHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlIG9mCit2YXJpb3VzIGV4aXN0aW5nIE9IQ0kgZHJpdmVycyB0aGF0IHdlcmUgYmFzaWNhbGx5IGlkZW50aWNhbCBiZXNpZGUKK2NwdS9ib2FyZCBkZXBlbmRhbnQgaW5pdGFsaXphdGlvbi4gVGhpcyBpbml0YWxpemF0aW9uIGhhcyBiZWVuIG1vdmVkCitpbnRvIGNwdS9ib2FyZCBkaXJlY3RvcmllcyBhbmQgYXJlIGNhbGxlZCB2aWEgdGhlIGhvb2tzIGJlbG93LgorCitDb25maWd1cmF0aW9uIG9wdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCUNPTkZJR19VU0JfT0hDSV9ORVc6IGVuYWJsZSB0aGUgbmV3IE9IQ0kgZHJpdmVyCisKKwlDRkdfVVNCX09IQ0lfQk9BUkRfSU5JVDogY2FsbCB0aGUgYm9hcmQgZGVwZW5kYW50IGhvb2tzOgorCisJCSAgLSBleHRlcm4gaW50IHVzYl9ib2FyZF9pbml0KHZvaWQpOworCQkgIC0gZXh0ZXJuIGludCB1c2JfYm9hcmRfc3RvcCh2b2lkKTsKKwkJICAtIGV4dGVybiBpbnQgdXNiX2NwdV9pbml0X2ZhaWwodm9pZCk7CisKKwlDRkdfVVNCX09IQ0lfQ1BVX0lOSVQ6IGNhbGwgdGhlIGNwdSBkZXBlbmRhbnQgaG9va3M6CisKKwkJICAtIGV4dGVybiBpbnQgdXNiX2NwdV9pbml0KHZvaWQpOworCQkgIC0gZXh0ZXJuIGludCB1c2JfY3B1X3N0b3Aodm9pZCk7CisJCSAgLSBleHRlcm4gaW50IHVzYl9jcHVfaW5pdF9mYWlsKHZvaWQpOworCisJQ0ZHX1VTQl9PSENJX1JFR1NfQkFTRTogZGVmaW5lcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBPSENJCisJCQkJcmVnaXN0ZXJzCisKKwlDRkdfVVNCX09IQ0lfU0xPVF9OQU1FOiBzbG90IG5hbWUKKworCUNGR19VU0JfT0hDSV9NQVhfUk9PVF9QT1JUUzogbWF4aW1hbCBudW1iZXIgb2YgcG9ydHMgb2YgdGhlCisJCQkJICAgICByb290IGh1Yi4KKworCitFbmRpYW5uZXNzIGlzc3VlcworLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBVU0IgYnVzIG9wZXJhdGVzIGluIGxpdHRsZSBlbmRpYW4sIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZXJlIGFyZQorT0hDSSBjb250cm9sbGVycyB0aGF0IG9wZXJhdGUgaW4gYmlnIGVuZGlhbiBzdWNoIGFzIHBwYzR4eCBhbmQKK21wYzV4eHguIEZvciB0aGVzZSB0aGUgY29uZmlnIG9wdGlvbgorCisJQ0ZHX09IQ0lfQkVfQ09OVFJPTExFUgorCituZWVkcyB0byBiZSBkZWZpbmVkLgorCisKK1BDSSBDb250cm9sbGVycworLS0tLS0tLS0tLS0tLS0tLQorCitZb3UnbGwgbmVlZCB0byBkZWZpbmUKKworCUNPTkZJR19QQ0lfT0hDSQorCitQQ0kgQ29udHJvbGxlcnMgbmVlZCB0byBkbyBieXRlIHN3YXBwaW5nIG9uIHJlZ2lzdGVyIGFjY2Vzc2VzLCBzbyB0aGV5CitzaG91bGQgdG8gZGVmaW5lOgorCisJQ0ZHX09IQ0lfU1dBUF9SRUdfQUNDRVNTCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLm1wYzgzMjNlcmRiIGIvZG9jL1JFQURNRS5tcGM4MzIzZXJkYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjg5ODI5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL1JFQURNRS5tcGM4MzIzZXJkYgpAQCAtMCwwICsxLDcxIEBACitGcmVlc2NhbGUgTVBDODMyM0VSREIgQm9hcmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEuCU1lbW9yeSBNYXAKKwlUaGUgbWVtb3J5IG1hcCBsb29rcyBsaWtlIHRoaXM6CisKKwkweDAwMDBfMDAwMAkweDAzZmZfZmZmZglERFIJCSA2NE0KKwkweDgwMDBfMDAwMAkweDhmZmZfZmZmZglQQ0kgTUVNCQkgMjU2TQorCTB4OTAwMF8wMDAwCTB4OWZmZl9mZmZmCVBDSV9NTUlPCSAyNTZNCisJMHhlMDAwXzAwMDAJMHhlMDBmX2ZmZmYJSU1NUgkJIDFNCisJMHhkMDAwXzAwMDAJMHhkM2ZmX2ZmZmYJUENJIElPCQkgNjRNCisJMHhmZTAwXzAwMDAJMHhmZWZmX2ZmZmYJTk9SIEZMQVNIIChDUzApCSAxNk0KKworMi4JQ29tcGlsYXRpb24KKworCUFzc3VtaW5nIHlvdSdyZSB1c2luZyBCQVNIIChvciBzaW1pbGFyKSBhcyB5b3VyIHNoZWxsOgorCisJZXhwb3J0IENST1NTX0NPTVBJTEU9eW91ci1jcm9zcy1jb21waWxlci1wcmVmaXgtCisJbWFrZSBkaXN0Y2xlYW4KKwltYWtlIE1QQzgzMjNFUkRCX2NvbmZpZworCW1ha2UKKworMy4JRG93bmxvYWRpbmcgYW5kIEZsYXNoaW5nIEltYWdlcworCiszLjEJUmVmbGFzaCBVLWJvb3QgSW1hZ2UgdXNpbmcgVS1ib290CisKKwlOLmIsIGhhdmUgYW4gYWx0ZXJuYXRlIG1lYW5zIG9mIHByb2dyYW1taW5nCisJdGhlIGZsYXNoIGF2YWlsYWJsZSBpZiB0aGUgbmV3IHUtYm9vdCBkb2Vzbid0IGJvb3QuCisKKwlGaXJzdCB0cnkgYToKKworCXRmdHBib290ICRsb2FkYWRkciAkdWJvb3QKKworCXRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBURlRQIGxvYWQgd2lsbCBzdWNjZWVkIGJlZm9yZQorCWFuIGVyYXNlIGdvZXMgYWhlYWQgYW5kIHdpcGVzIG91dCB5b3VyIGN1cnJlbnQgZmlybXdhcmUuCisJVGhlbiBkbyBhOgorCisJcnVuIHRmdHBmbGFzaAorCisJd2hpY2ggaXMgYSBzaG9ydGVyIHZlcnNpb24gb2YgdGhlIG1hbnVhbCBzZXF1ZW5jZToKKworCXRmdHAgJGxvYWRhZGRyIHUtYm9vdC5iaW4KKwlwcm90ZWN0IG9mZiBmZTAwMDAwMCArJGZpbGVzaXplCisJZXJhc2UgZmUwMDAwMDAgKyRmaWxlc2l6ZQorCWNwLmIgJGxvYWRhZGRyIGZlMDAwMDAwICRmaWxlc2l6ZQorCisJVG8ga2VlcCB5b3VyIG9sZCB1LWJvb3QncyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGRvIGE6CisKKwlzYXZlZW52CisKKwlwcmlvciB0byByZXNldHRpbmcgdGhlIGJvYXJkLgorCiszLjIJRG93bmxvYWRpbmcgYW5kIEJvb3RpbmcgTGludXggS2VybmVsCisKKwlFbnN1cmUgdGhhdCBhbGwgbmV0d29ya2luZy1yZWxhdGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0CisJcHJvcGVybHkgKGluY2x1ZGluZyBpcGFkZHIsIHNlcnZlcmlwLCBnYXRld2F5aXAgKGlmIG5lZWRlZCksCisJbmV0bWFzaywgZXRoYWRkciwgZXRoMWFkZHIsIHJvb3RwYXRoIChpZiB1c2luZyBORlMgcm9vdCksCisJZmR0ZmlsZSwgYW5kIGJvb3RmaWxlKS4KKworCVRoZW4sIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nLCBkZXBlbmRpbmcgb24gd2hldGhlciB5b3UKKwl3YW50IGFuIE5GUyByb290IG9yIGEgcmFtZGlzayByb290OgorCisJcnVuIG5mc2Jvb3QKKworCW9yCisKKwlydW4gcmFtYm9vdAorCis0CU5vdGVzCisKKwlUaGUgY29uc29sZSBiYXVkcmF0ZSBmb3IgTVBDODMyM0VSREIgaXMgMTE1MjAwYnBzLgpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5tcGM4MzQ5ZW1kcy5kZHJlY2MgYi9kb2MvUkVBRE1FLm1wYzgzNDllbWRzLmRkcmVjYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyNDljMy4uMDAwMDAwMAotLS0gYS9kb2MvUkVBRE1FLm1wYzgzNDllbWRzLmRkcmVjYworKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi1PdmVydmlldwotPT09PT09PT0KLQotVGhlIG92ZXJhbGwgdXNhZ2UgcGF0dGVybiBmb3IgRUNDIGRpYWdub3N0aWMgY29tbWFuZHMgaXMgdGhlIGZvbGxvd2luZzoKLQotICAqIChpbmplY3RpbmcgZXJyb3JzIGlzIGluaXRpYWxseSBkaXNhYmxlZCkKLQotICAqIGRlZmluZSBpbmplY3QgbWFzayAod2hpY2ggdGVsbHMgdGhlIEREUiBjb250cm9sbGVyIHdoYXQgdHlwZSBvZiBlcnJvcnMKLSAgICB3ZSdsbCBiZSBpbmplY3Rpbmc6IHNpbmdsZS9tdWx0aXBsZSBiaXQgZXRjLikKLQotICAqIGVuYWJsZSBpbmplY3RpbmcgZXJyb3JzIC0gZnJvbSBub3cgb24gdGhlIGNvbnRyb2xsZXIgaW5qZWN0cyBlcnJvcnMgYXMKLSAgICBpbmRpY2F0ZWQgaW4gdGhlIGluamVjdCBtYXNrCi0KLUlNUE9SVEFOVCBOT1RJQ0U6IGVuYWJsaW5nIGluamVjdGluZyBtdWx0aXBsZS1iaXQgZXJyb3JzIGlzIHBvdGVudGlhbGx5Ci1kYW5nZXJvdXMgYXMgc3VjaCBlcnJvcnMgYXJlIE5PVCBjb3JyZWN0ZWQgYnkgdGhlIGNvbnRyb2xsZXIuIFRoZXJlZm9yZSBjYXV0aW9uCi1zaG91bGQgYmUgdGFrZW4gd2hlbiBlbmFibGluZyB0aGUgaW5qZWN0aW9uIG9mIG11bHRpcGxlLWJpdCBlcnJvcnM6IGl0IGlzIG9ubHkKLXNhZmUgd2hlbiB1c2VkIG9uIGEgY2FyZWZ1bGx5IHNlbGVjdGVkIG1lbW9yeSBhcmVhIGFuZCB1c2VkIHVuZGVyIGNvbnRyb2wgb2YKLXRoZSAnZWNjIHRlc3QnIGNvbW1hbmQgKHNlZSBleGFtcGxlICdJbmplY3RpbmcgTXVsdGlwbGUtQml0IEVycm9ycycgYmVsb3cpLiBJbgotcGFydGljdWxhciwgd2hlbiB5b3Ugc2ltcGx5IHNldCB0aGUgbXVsdGlwbGUtYml0IGVycm9ycyBpbiBpbmplY3QgbWFzayBhbmQKLWVuYWJsZSBpbmplY3Rpb24sIFUtQm9vdCBpcyB2ZXJ5IGxpa2VseSB0byBoYW5nIHF1aWNrbHkgYXMgdGhlIGVycm9ycyB3aWxsIGJlCi1pbmplY3RlZCB3aGVuIGl0IGFjY2Vzc2VzIGl0cyBjb2RlLCBkYXRhIGV0Yy4KLQotCi1Vc2UgY2FzZXMgZm9yIEREUiAnZWNjJyBjb21tYW5kOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQmVmb3JlIGV4ZWN1dGluZyBwYXJ0aWN1bGFyIHRlc3RzIHJlc2V0IHRhcmdldCBib2FyZCBvciBjbGVhciBzdGF0dXMgcmVnaXN0ZXJzOgotCi09PiBlY2MgY2FwdHVyZWNsZWFyCi09PiBlY2MgZXJyZGV0ZWN0Y2xyIGFsbAotPT4gZWNjIHNiZWNudCAwCi0KLQotSW5qZWN0aW5nIFNpbmdsZS1CaXQgRXJyb3JzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotMS4gU2V0IDEgYml0IGluIERhdGEgUGF0aCBFcnJvciBJbmplY3QgTWFzawotCi09PiBlY2MgaW5qZWN0ZGF0YWhpIDEKLQotMi4gUnVuIHRlc3Qgb3ZlciBzb21lIG1lbW9yeSByZWdpb24KLQotPT4gZWNjIHRlc3QgMjAwMDAwIDEwCi0KLTMuIENoZWNrIEVDQyBzdGF0dXMKLQotPT4gZWNjIHN0YXR1cwotLi4uCi1NZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIEhpZ2gvTG93OiAwMDAwMDAwMSAwMDAwMDAwMAotLi4uCi1NZW1vcnkgU2luZ2xlLUJpdCBFcnJvciBNYW5hZ2VtZW50ICgwLi4yNTUpOgotICBTaW5nbGUtQml0IEVycm9yIFRocmVzaG9sZDogMjU1Ci0gIFNpbmdsZSBCaXQgRXJyb3IgQ291bnRlcjogMTYKLS4uLgotTWVtb3J5IEVycm9yIERldGVjdDoKLSAgTXVsdGlwbGUgTWVtb3J5IEVycm9yczogMAotICBNdWx0aXBsZS1CaXQgRXJyb3I6IDAKLSAgU2luZ2xlLUJpdCBFcnJvcjogMAotLi4uCi0KLTE2IGVycm9ycyB3ZXJlIGdlbmVyYXRlZCwgU2luZ2xlLUJpdCBFcnJvciBmbGFnIHdhcyBub3Qgc2V0IGFzIFNpbmdsZSBCaXQgRXJyb3IKLUNvdW50ZXIgZGlkIG5vdCByZWFjaCAgU2luZ2xlLUJpdCBFcnJvciBUaHJlc2hvbGQuCi0KLTQuIE1ha2Ugc3VyZSB1c2VkIG1lbW9yeSByZWdpb24gZ290IHJlLWluaXRpYWxpemVkIHdpdGggMHhjYWZlY2FmZSBwYXR0ZXJuCi0KLT0+IG1kIDIwMDAwMAotMDAyMDAwMDA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDEwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDAyMDogY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwMzA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDQwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDA1MDogY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwNjA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDcwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDA4MDogZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwOTA6IGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmICAgIC4uLi4uLi4uLi4uLi4uLi4KLQotCi1JbmplY3RpbmcgTXVsdGlwbGUtQml0IEVycm9ycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotMS4gU2V0IG1vcmUgdGhhbiAxIGJpdCBpbiBEYXRhIFBhdGggRXJyb3IgSW5qZWN0IE1hc2sKLQotPT4gZWNjIGluamVjdGRhdGFoaSA1Ci0KLTIuIFJ1biB0ZXN0IG92ZXIgc29tZSBtZW1vcnkgcmVnaW9uCi0KLT0+IGVjYyB0ZXN0IDIwMDAwMCAxMAotCi0zLiBDaGVjayBFQ0Mgc3RhdHVzCi0KLT0+IGVjYyBzdGF0dXMKLS4uLgotTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBIaWdoL0xvdzogMDAwMDAwMDUgMDAwMDAwMDAKLS4uLgotTWVtb3J5IEVycm9yIERldGVjdDoKLSAgTXVsdGlwbGUgTWVtb3J5IEVycm9yczogMQotICBNdWx0aXBsZS1CaXQgRXJyb3I6IDEKLSAgU2luZ2xlLUJpdCBFcnJvcjogMAotLi4uCi0KLU9ic2VydmUgdGhhdCBib3RoIE11bHRpcGxlIE1lbW9yeSBFcnJvcnMgYW5kIE11bHRpcGxlLUJpdCBFcnJvciBmbGFncyBhcmUgc2V0LgotCi00LiBNYWtlIHN1cmUgdXNlZCBtZW1vcnkgcmVnaW9uIGdvdCByZS1pbml0aWFsaXplZCB3aXRoIDB4Y2FmZWNhZmUgcGF0dGVybgotCi09PiBtZCAyMDAwMDAKLTAwMjAwMDAwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDAxMDogY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwMjA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDMwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDA0MDogY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwNTA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDYwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDA3MDogY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwODA6IGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDkwOiBkZWFkYmVlZiBkZWFkYmVlZiBkZWFkYmVlZiBkZWFkYmVlZiAgICAuLi4uLi4uLi4uLi4uLi4uCi0KLQotVGVzdCBTaW5nbGUtQml0IEVycm9yIENvdW50ZXIgYW5kIFRocmVzaG9sZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0xLiBTZXQgMSBiaXQgaW4gRGF0YSBQYXRoIEVycm9yIEluamVjdCBNYXNrCi0KLT0+IGVjYyBpbmplY3RkYXRhaGkgMQotCi0yLiBFbmFibGUgZXJyb3IgaW5qZWN0aW9uCi0KLT0+IGVjYyBpbmplY3QgZW4KLQotMy4gTGV0IHUtYm9vdCBydW4gZm9yIGEgd2l0aCBTaW5nbGUtQml0IGVycm9yIGluamVjdGlvbiBlbmFibGVkCi0KLTQuIERpc2FibGUgZXJyb3IgaW5qZWN0aW9uCi0KLT0+IGVjYyBpbmplY3QgZGlzCi0KLTQuIENoZWNrIHN0YXR1cwotCi09PiBlY2Mgc3RhdHVzCi0KLS4uLgotTWVtb3J5IFNpbmdsZS1CaXQgRXJyb3IgTWFuYWdlbWVudCAoMC4uMjU1KToKLSAgU2luZ2xlLUJpdCBFcnJvciBUaHJlc2hvbGQ6IDI1NQotICBTaW5nbGUgQml0IEVycm9yIENvdW50ZXI6IDYwCi0KLU1lbW9yeSBFcnJvciBEZXRlY3Q6Ci0gIE11bHRpcGxlIE1lbW9yeSBFcnJvcnM6IDEKLSAgTXVsdGlwbGUtQml0IEVycm9yOiAwCi0gIFNpbmdsZS1CaXQgRXJyb3I6IDEKLS4uLgotCi1PYnNlcnZlIHRoYXQgU2luZ2xlLUJpdCBFcnJvciBpcyAnb24nIHdoaWNoIG1lYW5zIHRoYXQgU2luZ2xlLUJpdCBFcnJvciBDb3VudGVyCi1yZWFjaGVkIFNpbmdsZS1CaXQgRXJyb3IgVGhyZXNob2xkLiBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzIGJpdCBpcyBhbHNvICdvbicsIHRoYXQKLWlzIENvdW50ZXIgcmVhY2hlZCBUaHJlc2hvbGQgbW9yZSB0aGFuIG9uZSB0aW1lIChpdCB3cmFwcyBiYWNrIGFmdGVyIHJlYWNoaW5nCi1UaHJlc2hvbGQpLgpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5tcGM4MzYwZW1kcyBiL2RvYy9SRUFETUUubXBjODM2MGVtZHMKaW5kZXggYzg3NDY5Zi4uNWYyMDI0NyAxMDA2NDQKLS0tIGEvZG9jL1JFQURNRS5tcGM4MzYwZW1kcworKysgYi9kb2MvUkVBRE1FLm1wYzgzNjBlbWRzCkBAIC0yMSw3ICsyMSwxMyBAQAogCVNXM1sxOjhdPSAwMDAwXzAwMDEgcmVmZXJzIHRvIGJpdHMgbGFiZWxlZCAxIHRocm91Z2ggNiBpcyBzZXQgYXMgIk9uIgogCQlhbmQgYml0cyBsYWJlbGVkIDggaXMgc2V0IGFzICJPZmYiLgogCi0xLjEJRm9yIHRoZSBNUEM4MzYwRSBQQiBQUk9UTyBCb2FyZAorMS4xCVRoZXJlIGFyZSB0aHJlZSB0eXBlIGJvYXJkcyBmb3IgTVBDODM2MEUgc2lsaWNvbiB1cCB0byBub3csIFRoZXkgYXJlCisKKwkqIE1QQzgzNjBFLU1EUy1QQiBQUk9UTyAoYS5rLmEgODM2MFNZUyBQUk9UT1RZUEUpCisJKiBNUEM4MzYwRS1NRFMtUEIgUElMT1QgKGEuay5hIDgzNjBTWVMgUElMT1QpCisJKiBNUEM4MzYwRUEtTURTLVBCIFBST1RPIChhLmsuYSA4MzYwU1lTMiBQUk9UT1RZUEUpCisKKzEuMglGb3IgYWxsIHRoZSBNUEM4MzYwRU1EUyBCb2FyZAogCiAJRmlyc3QsIG1ha2Ugc3VyZSB0aGUgYm9hcmQgZGVmYXVsdCBzZXR0aW5nIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUKIAlkb2N1bWVudCBzaGlwcGVkIHdpdGggeW91ciBib2FyZC4gVGhlbiBhcHBseSB0aGUgZm9sbG93aW5nIHNldHRpbmc6CkBAIC0zMyw2ICszOSwyMSBAQAogCUpQNiAxLTIKIAlvbiBib2FyZCBPc2NpbGxhdG9yOiA2Nk0KIAorMS4zCVNpbmNlIGRpZmZlcmVudCBib2FyZC9jaGlwIHJldi4gY29tYmluYXRpb25zIGhhdmUgQUMgdGltaW5nIGlzc3VlcywKKwl1LWJvb3QgZm9yY2VzIFJHTUlJLUlEIChSR01JSSB3aXRoIEludGVybmFsIERlbGF5KSBtb2RlIG9uIGJ5IGRlZmF1bHQKKwlieSB0aGUgcGF0Y2ggKG1wYzgzeHg6IERpc2FibGUgRzFUWENMSywgRzJUWENMSyBoL3cgYnVmZmVycykuCisKKwlXaGVuIHRoZSByZXYyLnggc2lsaWNvbiBtb3VudCBvbiB0aGVzZSBib2FyZHMsIGFuZCBpZiB5b3UgYXJlIHVzaW5nCisJdS1ib290IHZlcnNpb24gYWZ0ZXIgdGhpcyBwYXRjaCwgdG8gbWFrZSB0aGUgZXRoZXJuZXQgaW50ZXJmYWNlcyB1c2FibGUsCisJYW5kIHRvIGVuYWJsZSBSR01JSS1JRCBvbiB5b3VyIGJvYXJkLCB5b3UgaGF2ZSB0byBzZXR1cCB0aGUganVtcGVycworCWNvcnJlY3RseS4KKworCSogTVBDODM2MEUtTURTLVBCIFBST1RPCisJICBub3RoaW5nIHRvIGRvCisJKiBNUEM4MzYwRS1NRFMtUEIgUElMT1QKKwkgIEpQOSBhbmQgSlA4IHNob3VsZCBiZSBPTgorCSogTVBDODM2MEVBLU1EUy1QQiBQUk9UTworCSAgSlAyIGFuZCBKUDMgc2hvdWxkIGJlIE9OCiAKIDIuCU1lbW9yeSBNYXAKIApkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5tcGM4M3h4LmRkcmVjYyBiL2RvYy9SRUFETUUubXBjODN4eC5kZHJlY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyOWYwOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9SRUFETUUubXBjODN4eC5kZHJlY2MKQEAgLTAsMCArMSwxNTQgQEAKK092ZXJ2aWV3Cis9PT09PT09PQorCitUaGUgb3ZlcmFsbCB1c2FnZSBwYXR0ZXJuIGZvciBFQ0MgZGlhZ25vc3RpYyBjb21tYW5kcyBpcyB0aGUgZm9sbG93aW5nOgorCisgICogKGluamVjdGluZyBlcnJvcnMgaXMgaW5pdGlhbGx5IGRpc2FibGVkKQorCisgICogZGVmaW5lIGluamVjdCBtYXNrICh3aGljaCB0ZWxscyB0aGUgRERSIGNvbnRyb2xsZXIgd2hhdCB0eXBlIG9mIGVycm9ycworICAgIHdlJ2xsIGJlIGluamVjdGluZzogc2luZ2xlL211bHRpcGxlIGJpdCBldGMuKQorCisgICogZW5hYmxlIGluamVjdGluZyBlcnJvcnMgLSBmcm9tIG5vdyBvbiB0aGUgY29udHJvbGxlciBpbmplY3RzIGVycm9ycyBhcworICAgIGluZGljYXRlZCBpbiB0aGUgaW5qZWN0IG1hc2sKKworSU1QT1JUQU5UIE5PVElDRTogZW5hYmxpbmcgaW5qZWN0aW5nIG11bHRpcGxlLWJpdCBlcnJvcnMgaXMgcG90ZW50aWFsbHkKK2Rhbmdlcm91cyBhcyBzdWNoIGVycm9ycyBhcmUgTk9UIGNvcnJlY3RlZCBieSB0aGUgY29udHJvbGxlci4gVGhlcmVmb3JlIGNhdXRpb24KK3Nob3VsZCBiZSB0YWtlbiB3aGVuIGVuYWJsaW5nIHRoZSBpbmplY3Rpb24gb2YgbXVsdGlwbGUtYml0IGVycm9yczogaXQgaXMgb25seQorc2FmZSB3aGVuIHVzZWQgb24gYSBjYXJlZnVsbHkgc2VsZWN0ZWQgbWVtb3J5IGFyZWEgYW5kIHVzZWQgdW5kZXIgY29udHJvbCBvZgordGhlICdlY2MgdGVzdGR3JyAnZWNjIHRlc3R3b3JkJyBjb21tYW5kIChzZWUgZXhhbXBsZSAnSW5qZWN0aW5nIE11bHRpcGxlLUJpdAorRXJyb3JzJyBiZWxvdykuIEluIHBhcnRpY3VsYXIsIHdoZW4geW91IHNpbXBseSBzZXQgdGhlIG11bHRpcGxlLWJpdCBlcnJvcnMgaW4KK2luamVjdCBtYXNrIGFuZCBlbmFibGUgaW5qZWN0aW9uLCBVLUJvb3QgaXMgdmVyeSBsaWtlbHkgdG8gaGFuZyBxdWlja2x5IGFzIHRoZQorZXJyb3JzIHdpbGwgYmUgaW5qZWN0ZWQgd2hlbiBpdCBhY2Nlc3NlcyBpdHMgY29kZSwgZGF0YSBldGMuCisKKworVXNlIGNhc2VzIGZvciBERFIgJ2VjYycgY29tbWFuZDoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0JlZm9yZSBleGVjdXRpbmcgcGFydGljdWxhciB0ZXN0cyByZXNldCB0YXJnZXQgYm9hcmQgb3IgY2xlYXIgc3RhdHVzIHJlZ2lzdGVyczoKKworPT4gZWNjIGNhcHR1cmVjbGVhcgorPT4gZWNjIGVycmRldGVjdGNsciBhbGwKKz0+IGVjYyBzYmVjbnQgMAorCisKK0luamVjdGluZyBTaW5nbGUtQml0IEVycm9ycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEuIFNldCAxIGJpdCBpbiBEYXRhIFBhdGggRXJyb3IgSW5qZWN0IE1hc2sKKworPT4gZWNjIGluamVjdGRhdGFoaSAxCisKKzIuIFJ1biB0ZXN0IG92ZXIgc29tZSBtZW1vcnkgcmVnaW9uCisKKz0+IGVjYyB0ZXN0ZHcgMjAwMDAwIDEwCisKKzMuIENoZWNrIEVDQyBzdGF0dXMKKworPT4gZWNjIHN0YXR1cworLi4uCitNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIEhpZ2gvTG93OiAwMDAwMDAwMSAwMDAwMDAwMAorLi4uCitNZW1vcnkgU2luZ2xlLUJpdCBFcnJvciBNYW5hZ2VtZW50ICgwLi4yNTUpOgorICBTaW5nbGUtQml0IEVycm9yIFRocmVzaG9sZDogMjU1CisgIFNpbmdsZSBCaXQgRXJyb3IgQ291bnRlcjogMTYKKy4uLgorTWVtb3J5IEVycm9yIERldGVjdDoKKyAgTXVsdGlwbGUgTWVtb3J5IEVycm9yczogMAorICBNdWx0aXBsZS1CaXQgRXJyb3I6IDAKKyAgU2luZ2xlLUJpdCBFcnJvcjogMAorLi4uCisKKzE2IGVycm9ycyB3ZXJlIGdlbmVyYXRlZCwgU2luZ2xlLUJpdCBFcnJvciBmbGFnIHdhcyBub3Qgc2V0IGFzIFNpbmdsZSBCaXQgRXJyb3IKK0NvdW50ZXIgZGlkIG5vdCByZWFjaCAgU2luZ2xlLUJpdCBFcnJvciBUaHJlc2hvbGQuCisKKzQuIE1ha2Ugc3VyZSB1c2VkIG1lbW9yeSByZWdpb24gZ290IHJlLWluaXRpYWxpemVkIHdpdGggMHgwMTIzNDU2Nzg5YWJjZGVmCisKKz0+IG1kIDIwMDAwMAorMDAyMDAwMDA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDEwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDAyMDogMDEyMzQ1NjcgODlhYmNkZWYgMDEyMzQ1NjcgODlhYmNkZWYgICAgLiNFZy4uLi4uI0VnLi4uLgorMDAyMDAwMzA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDQwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDA1MDogMDEyMzQ1NjcgODlhYmNkZWYgMDEyMzQ1NjcgODlhYmNkZWYgICAgLiNFZy4uLi4uI0VnLi4uLgorMDAyMDAwNjA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDcwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDA4MDogZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgICAgLi4uLi4uLi4uLi4uLi4uLgorMDAyMDAwOTA6IGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmICAgIC4uLi4uLi4uLi4uLi4uLi4KKworSW5qZWN0aW5nIE11bHRpcGxlLUJpdCBFcnJvcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEuIFNldCBtb3JlIHRoYW4gMSBiaXQgaW4gRGF0YSBQYXRoIEVycm9yIEluamVjdCBNYXNrCisKKz0+IGVjYyBpbmplY3RkYXRhaGkgMQorPT4gZWNjIGluamVjdGRhdGFsbyAxCisKKzIuIFJ1biB0ZXN0IG92ZXIgc29tZSBtZW1vcnkgcmVnaW9uCisKKz0+IGVjYyB0ZXN0d29yZCAyMDAwMDAgMQorCiszLiBDaGVjayBFQ0Mgc3RhdHVzCisKKz0+IGVjYyBzdGF0dXMKKy4uLgorTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBIaWdoL0xvdzogMDAwMDAwMDEgMDAwMDAwMDEKKy4uLgorTWVtb3J5IEVycm9yIERldGVjdDoKKyAgTXVsdGlwbGUgTWVtb3J5IEVycm9yczogMAorICBNdWx0aXBsZS1CaXQgRXJyb3I6IDEKKyAgU2luZ2xlLUJpdCBFcnJvcjogMAorLi4uCisKK1RoZSBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzIGZsYWdzIG5vdCBzZXQgYW5kIE11bHRpcGxlLUJpdCBFcnJvciBmbGFncyBhcmUgc2V0LgorCis0LiBNYWtlIHN1cmUgdXNlZCBtZW1vcnkgcmVnaW9uIGdvdCByZS1pbml0aWFsaXplZCB3aXRoIDB4MDEyMzQ1Njc4OWFiY2RlZgorCis9PiBtZCAyMDAwMDAKKzAwMjAwMDAwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDAxMDogMDEyMzQ1NjcgODlhYmNkZWYgMDEyMzQ1NjcgODlhYmNkZWYgICAgLiNFZy4uLi4uI0VnLi4uLgorMDAyMDAwMjA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDMwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDA0MDogMDEyMzQ1NjcgODlhYmNkZWYgMDEyMzQ1NjcgODlhYmNkZWYgICAgLiNFZy4uLi4uI0VnLi4uLgorMDAyMDAwNTA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDYwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDA3MDogMDEyMzQ1NjcgODlhYmNkZWYgMDEyMzQ1NjcgODlhYmNkZWYgICAgLiNFZy4uLi4uI0VnLi4uLgorMDAyMDAwODA6IGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmICAgIC4uLi4uLi4uLi4uLi4uLi4KKzAwMjAwMDkwOiBkZWFkYmVlZiBkZWFkYmVlZiBkZWFkYmVlZiBkZWFkYmVlZiAgICAuLi4uLi4uLi4uLi4uLi4uCisKKworVGVzdCBTaW5nbGUtQml0IEVycm9yIENvdW50ZXIgYW5kIFRocmVzaG9sZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisxLiBTZXQgMSBiaXQgaW4gRGF0YSBQYXRoIEVycm9yIEluamVjdCBNYXNrCisKKz0+IGVjYyBpbmplY3RkYXRhaGkgMQorCisyLiBFbmFibGUgZXJyb3IgaW5qZWN0aW9uCisKKz0+IGVjYyBpbmplY3QgZW4KKworMy4gTGV0IHUtYm9vdCBydW4gZm9yIGEgd2l0aCBTaW5nbGUtQml0IGVycm9yIGluamVjdGlvbiBlbmFibGVkCisKKzQuIERpc2FibGUgZXJyb3IgaW5qZWN0aW9uCisKKz0+IGVjYyBpbmplY3QgZGlzCisKKzQuIENoZWNrIHN0YXR1cworCis9PiBlY2Mgc3RhdHVzCisKKy4uLgorTWVtb3J5IFNpbmdsZS1CaXQgRXJyb3IgTWFuYWdlbWVudCAoMC4uMjU1KToKKyAgU2luZ2xlLUJpdCBFcnJvciBUaHJlc2hvbGQ6IDI1NQorICBTaW5nbGUgQml0IEVycm9yIENvdW50ZXI6IDE5OQorCitNZW1vcnkgRXJyb3IgRGV0ZWN0OgorICBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzOiAxCisgIE11bHRpcGxlLUJpdCBFcnJvcjogMAorICBTaW5nbGUtQml0IEVycm9yOiAxCisuLi4KKworT2JzZXJ2ZSB0aGF0IFNpbmdsZS1CaXQgRXJyb3IgaXMgJ29uJyB3aGljaCBtZWFucyB0aGF0IFNpbmdsZS1CaXQgRXJyb3IgQ291bnRlcgorcmVhY2hlZCBTaW5nbGUtQml0IEVycm9yIFRocmVzaG9sZC4gTXVsdGlwbGUgTWVtb3J5IEVycm9ycyBiaXQgaXMgYWxzbyAnb24nLCB0aGF0CitpcyBDb3VudGVyIHJlYWNoZWQgVGhyZXNob2xkIG1vcmUgdGhhbiBvbmUgdGltZSAoaXQgd3JhcHMgYmFjayBhZnRlciByZWFjaGluZworVGhyZXNob2xkKS4KZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUubXBjODU0NGRzIGIvZG9jL1JFQURNRS5tcGM4NTQ0ZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyNTdhMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9SRUFETUUubXBjODU0NGRzCkBAIC0wLDAgKzEsMTIyIEBACitPdmVydmlldworLS0tLS0tLS0KK1RoZSBNUEM4NTQ0RFMgc3lzdGVtIGlzIHNpbWlsYXIgdG8gdGhlIDg1eHggQ0RTIHN5c3RlbXMgc3VjaAorYXMgdGhlIE1QQzg1NDhDRFMgZHVlIHRvIHRoZSBzaW1pbGFyIEU1MDAgY29yZS4gIEhvd2V2ZXIsIGl0CitpcyBwbGFjZWQgb24gdGhlIHNhbWUgYm9hcmQgYXMgdGhlIDg2NDEgSFBDTiBzeXN0ZW0uCisKKworRmxhc2ggQmFua3MKKy0tLS0tLS0tLS0tCitMaWtlIHRoZSA4NXh4IENEUyBzeXN0ZW1zLCB0aGUgODU0NCBEUyBib2FyZCBoYXMgdHdvIGZsYXNoIGJhbmtzLgorVGhleSBhcmUgYm90aCBwcmVzZW50IG9uIGJvb3QsIGJ1dCB0aGVyZSBsb2NhdGlvbnMgY2FuIGJlIHN3YXBwZWQKK3VzaW5nIHRoZSBkaXAtc3dpdGNoIFNXMTAsIGJpdCAyLgorCitIb3dldmVyLCB1bmxpa2UgdGhlIENEUyBzeXN0ZW1zLCBidXQgc2ltaWxhciB0byB0aGUgODY0MSBIUENOCitib2FyZCwgYSBydW50aW1lIHJlc2V0IHRocm91Z2ggdGhlIEZQR0EgY2FuIGFsc28gYWZmZWN0IGEgc3dhcAorb24gdGhlIGZsYXNoIGJhbmsgbWFwcGluZ3MgZm9yIHRoZSBuZXh0IHJlc2V0IGN5Y2xlLgorCitJcnJlc3BlY3RpdmUgb2YgdGhlIHN3aXRjaCBTVzEwWzJdLCBib290aW5nIGlzIGFsd2F5cyBmcm9tIHRoZQorYm9vdCBiYW5rIGF0IDB4ZmZmOF8wMDAwLgorCisKK01lbW9yeSBNYXAKKy0tLS0tLS0tLS0KKworMHhmZjgwXzAwMDAgLSAweGZmYmZfZmZmZglBbGVybmF0ZSBiYW5rCQk0TUIKKzB4ZmZjMF8wMDAwIC0gMHhmZmZmX2ZmZmYJQm9vdCBiYW5rCQk0TUIKKworMHhmZmI4XzAwMDAJCQlBbHRlcm5hdGUgaW1hZ2Ugc3RhcnQJNTEyS0IKKzB4ZmZmOF8wMDAwCQkJQm9vdCBpbWFnZSBzdGFydAk1MTJLQgorCisKK0ZsYXNoaW5nIEltYWdlcworLS0tLS0tLS0tLS0tLS0tCisKK0ZvciBleGFtcGxlLCB0byBwbGFjZSBhIG5ldyBpbWFnZSBpbiB0aGUgYWx0ZXJuYXRlIGZsYXNoIGJhbmsKK2FuZCB0aGVuIHJlc2V0IHdpdGggdGhhdCBuZXcgaW1hZ2UgdGVtcG9yYXJpbHksIHVzZSB0aGlzOgorCisgICAgdGZ0cCAxMDAwMDAwIHUtYm9vdC5iaW4uODU0NGRzCisgICAgZXJhc2UgZmZiODAwMDAgZmZiZmZmZmYKKyAgICBjcC5iIDEwMDAwMDAgZmZiODAwMDAgODAwMDAKKyAgICBwaXhpc19yZXNldCBhbHRiYW5rCisKKworVG8gb3ZlcndyaXRlIHRoZSBpbWFnZSBpbiB0aGUgYm9vdCBmbGFzaCBiYW5rOgorCisgICAgdGZ0cCAxMDAwMDAwIHUtYm9vdC5iaW4uODU0NGRzCisgICAgcHJvdGVjdCBvZmYgYWxsCisgICAgZXJhc2UgZmZmODAwMDAgZmZmZmZmZmYKKyAgICBjcC5iIDEwMDAwMDAgZmZmODAwMDAgODAwMDAKKworT3RoZXIgZXhhbXBsZSBVLUJvb3QgaW1hZ2UgYW5kIGZsYXNoIG1hbmlwdWxhdGlvbnMgZXhhbXBsZXMKK2NhbiBiZSBmb3VuZCBpbiB0aGUgUkVBRE1FLm1wYzg1eHhjZHMgZmlsZSBhcyB3ZWxsLgorCisKK1RoZSBwaXhpc19yZXNldCBjb21tYW5kCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBuZXcgY29tbWFuZCwgInBpeGlzX3Jlc2V0IiwgaXMgaW50cm9kdWNlZCB0byByZXNldCBtcGM4NjQxaHBjbiBib2FyZAordXNpbmcgdGhlIEZQR0Egc2VxdWVuY2VyLiAgV2hlbiB0aGUgYm9hcmQgcmVzdGFydHMsIGl0IGhhcyB0aGUgb3B0aW9uCitvZiB1c2luZyBlaXRoZXIgdGhlIGN1cnJlbnQgb3IgYWx0ZXJuYXRlIGZsYXNoIGJhbmsgYXMgdGhlIGJvb3QKK2ltYWdlLCB3aXRoIG9yIHdpdGhvdXQgdGhlIHdhdGNoZG9nIHRpbWVyIGVuYWJsZWQsIGFuZCBmaW5hbGx5IHdpdGgKK29yIHdpdGhvdXQgZnJlcXVlbmN5IGNoYW5nZXMuCisKK1VzYWdlIGlzOworCisJcGl4aXNfcmVzZXQKKwlwaXhpc19yZXNldCBhbHRiYW5rCisJcGl4aXNfcmVzZXQgYWx0YmFuayB3ZAorCXBpeGlzX3Jlc2V0IGFsdGJhbmsgY2YgPFNZU0NMSyBmcmVxPiA8Q09SRVBMTCByYXRpbz4gPE1QWFBMTCByYXRpbz4KKwlwaXhpc19yZXNldCBjZiA8U1lTQ0xLIGZyZXE+IDxDT1JFUExMIHJhdGlvPiA8TVBYUExMIHJhdGlvPgorCitFeGFtcGxlczsKKworCS8qIHJlc2V0IHRvIGN1cnJlbnQgYmFuaywgbGlrZSAicmVzZXQiIGNvbW1hbmQgKi8KKwlwaXhpc19yZXNldAorCisJLyogcmVzZXQgYm9hcmQgYnV0IHVzZSB0aGUgdG8gYWx0ZXJuYXRlIGZsYXNoIGJhbmsgKi8KKwlwaXhpc19yZXNldCBhbHRiYW5rCisKKwkvKiByZXNldCBib2FyZCwgdXNlIGFsdGVybmF0ZSBmbGFzaCBiYW5rIHdpdGggd2F0Y2hkb2cgdGltZXIgZW5hYmxlZCovCisJcGl4aXNfcmVzZXQgYWx0YmFuayB3ZAorCisJLyogcmVzZXQgYm9hcmQgdG8gYWx0ZXJuYXRlIGJhbmsgd2l0aCBmcmVxdWVuY3kgY2hhbmdlZC4KKwkgKiA0MCBpcyBTWVNDTEssIDIuNSBpcyBDT1JFUExMIHJhdGlvLCAxMCBpcyBNUFhQTEwgcmF0aW8KKwkgKi8KKwlwaXhpcy1yZXNldCBhbHRiYW5rIGNmIDQwIDIuNSAxMAorCitWYWxpZCBjbG9jayBjaG9pY2VzIGFyZSBpbiB0aGUgODY0MSBSZWZlcmVuY2UgTWFudWFscy4KKworCitVc2luZyB0aGUgRGV2aWNlIFRyZWUgU291cmNlIEZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVG8gY3JlYXRlIHRoZSBEVEIgKERldmljZSBUcmVlIEJpbmFyeSkgaW1hZ2UgZmlsZSwKK3VzZSBhIGNvbW1hbmQgc2ltaWxhciB0byB0aGlzOgorCisgICAgZHRjIC1iIDAgLWYgLUkgZHRzIC1PIGR0YiBtcGM4NTQ0ZHMuZHRzID4gbXBjODU0NGRzLmR0YgorCitMaWtlbHksIHRoYXQgLmR0cyBmaWxlIHdpbGwgY29tZSBmcm9tIGhlcmU7CisKKyAgICBsaW51eC0yLjYvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDRkcy5kdHMKKworQWZ0ZXIgcGxhY2luZyB0aGUgRFRCIGZpbGUgaW4geW91ciBURlRQIGRpc2sgYXJlYSwKK3lvdSBjYW4gZG93bmxvYWQgdGhhdCBkdGIgZmlsZSB1c2luZyBhIGNvbW1hbmQgbGlrZToKKworICAgIHRmdHAgOTAwMDAwIG1wYzg1NDRkcy5kdGIKKworQnVybiBpdCB0byBmbGFzaCBpZiB5b3Ugd2FudC4KKworCitCb290aW5nIExpbnV4CistLS0tLS0tLS0tLS0tCisKK1BsYWNlIGEgbGludXggdUltYWdlIGluIHRoZSBURlRQIGRpc2sgYXJlYSB0b28uCisKKyAgICB0ZnRwIDEwMDAwMDAgdUltYWdlLjg1NDQKKyAgICB0ZnRwIDkwMDAwMCBtcGM4NTQ0ZHMuZHRiCisgICAgYm9vdG0gMTAwMDAwMCAtIDkwMDAwMAorCitXYXRjaCB5b3VyIGV0aGFjdCwgbmV0ZGV2IGFuZCBib290YXJncyBVLUJvb3QgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorWW91IG1heSB3YW50IHRvIGRvIHNvbWV0aGluZyBsaWtlIHRoaXMgdG9vOgorCisgICAgc2V0ZW52IGV0aGFjdCBlVFNFQzMKKyAgICBzZXRlbnYgbmV0ZGV2IGV0aDEKZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUubmFuZCBiL2RvYy9SRUFETUUubmFuZAppbmRleCA1YzMxODQ1Li5jNWM1ZWYyIDEwMDY0NAotLS0gYS9kb2MvUkVBRE1FLm5hbmQKKysrIGIvZG9jL1JFQURNRS5uYW5kCkBAIC05Myw4ICs5Myw4IEBACiAKIENvbmZpZ3VyYXRpb24gT3B0aW9uczoKIAotICAgQ0ZHX0NNRF9OQU5ECi0gICAgICBBIGdvb2Qgb25lIHRvIGFkZCB0byBDT05GSUdfQ09NTUFORFMgc2luY2UgaXQgZW5hYmxlcyBOQU5EIHN1cHBvcnQuCisgICBDT05GSUdfQ01EX05BTkQKKyAgICAgIEVuYWJsZXMgTkFORCBzdXBwb3J0IGFuZCBjb21tbWFuZHMuCiAKICAgIENPTkZJR19NVERfTkFORF9FQ0NfSkZGUzIKICAgICAgIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHRoZSBFcnJvciBDb3JyZWN0aW9uIENvZGUgaW5mb3JtYXRpb24gaW4KZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUuc2JjODY0MWQgYi9kb2MvUkVBRE1FLnNiYzg2NDFkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNTE0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvUkVBRE1FLnNiYzg2NDFkCkBAIC0wLDAgKzEsMjggQEAKK1dpbmQgUml2ZXIgU0JDODY0MUQgcmVmZXJlbmNlIGJvYXJkCis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ3JlYXRlZCAwNi8xNC8yMDA3IEpvZSBIYW1tYW4KK0NvcHlyaWdodCAyMDA3LCBFbWJlZGRlZCBTcGVjaWFsdGllcywgSW5jLgorQ29weXJpZ2h0IDIwMDcgV2luZCBSaXZlciBTeXN0ZW1lcywgSW5jLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMS4gQnVpbGRpbmcgVS1Cb290CistLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBTQkM4NjQxRCBjb2RlIGlzIGtub3duIHRvIGJ1aWxkIHVzaW5nIEVMREsgNC4xLgorCisgICAgJCBtYWtlIHNiYzg2NDFkX2NvbmZpZworICAgIENvbmZpZ3VyaW5nIGZvciBzYmM4NjQxZCBib2FyZC4uLgorCisgICAgJCBtYWtlCisKKworMi4gU3dpdGNoIGFuZCBKdW1wZXIgU2V0dGluZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBbGwgSnVtcGVycyAmIFN3aXRjaGVzIGFyZSBpbiB0aGVpciBkZWZhdWx0IHBvc2l0aW9ucy4gIFBsZWFzZSByZWZlciB0bwordGhlIGJvYXJkIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuICBTb21lIHNldHRpbmdzIGNvbnRyb2wgQ1BVIHZvbHRhZ2VzCithbmQgc2V0dGluZ3MgbWF5IGNoYW5nZSB3aXRoIGJvYXJkIHJldmlzaW9ucy4KKworMy4gS25vd24gbGltaXRhdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitQQ0k6CisJVGhlIFBDSSBjb21tYW5kIG1heSBoYW5nIGlmIG5vIGJvYXJkcyBhcmUgcHJlc2VudCBpbiBlaXRoZXIgc2xvdC4KZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUudXNiIGIvZG9jL1JFQURNRS51c2IKaW5kZXggNDFmNzZmNC4uYjNiY2I5MSAxMDA2NDQKLS0tIGEvZG9jL1JFQURNRS51c2IKKysrIGIvZG9jL1JFQURNRS51c2IKQEAgLTczLDggKzczLDggQEAKIAogQ29uZmlnIFN3aXRjaGVzOgogLS0tLS0tLS0tLS0tLS0tLQotQ0ZHX0NNRF9VU0IJICAgIGVuYWJsZXMgYmFzaWMgVVNCIHN1cHBvcnQgYW5kIHRoZSB1c2IgY29tbWFuZAotQ09ORklHX1VTQl9VSENJCSAgICBkZWZpbmVzIHRoZSBsb3dsZXZlbCBwYXJ0LkEgbG93bGV2ZWwgcGFydCBtdXN0IGJlIGRlZmluZWQgaWYKLQkJICAgIHVzaW5nIENGR19DTURfVVNCCitDT05GSUdfQ01EX1VTQgkgICAgZW5hYmxlcyBiYXNpYyBVU0Igc3VwcG9ydCBhbmQgdGhlIHVzYiBjb21tYW5kCitDT05GSUdfVVNCX1VIQ0kJICAgIGRlZmluZXMgdGhlIGxvd2xldmVsIHBhcnQuQSBsb3dsZXZlbCBwYXJ0IG11c3QgYmUgZGVmaW5lZAorCQkgICAgaWYgdXNpbmcgQ09ORklHX0NNRF9VU0IKIENPTkZJR19VU0JfS0VZQk9BUkQgZW5hYmxlcyB0aGUgVVNCIEtleWJvYXJkCiBDT05GSUdfVVNCX1NUT1JBR0UgIGVuYWJsZXMgdGhlIFVTQiBzdG9yYWdlIGRldmljZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL01ha2VmaWxlCmluZGV4IDQ4ZmQ0ZWEuLmZjOTgwNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9NYWtlZmlsZQpAQCAtMzEsNyArMzEsNyBAQAogCSAgYmNtNTcweC5vIGJjbTU3MHhfYXV0b25lZy5vIGNmYl9jb25zb2xlLm8gY2ZpX2ZsYXNoLm8gXAogCSAgY3M4OTAwLm8gY3Q2OTAwMC5vIGRhdGFmbGFzaC5vIGRjMjExNHgubyBkbTkwMDB4Lm8gXAogCSAgZTEwMDAubyBlZXBybzEwMC5vIGVuYzI4ajYwLm8gXAotCSAgaTgwNDIubyBpbmNhLWlwX3N3Lm8ga2V5Ym9hcmQubyBcCisJICBpODA0Mi5vIGluY2EtaXBfc3cubyBpc3AxMTZ4LWhjZC5vIGtleWJvYXJkLm8gXAogCSAgbGFuOTFjOTYubyBtYWNiLm8gXAogCSAgbmF0c2VtaS5vIG5lMjAwMC5vIG5ldGFybV9ldGgubyBuZXRjb25zb2xlLm8gXAogCSAgbnMxNjU1MC5vIG5zODM4MngubyBuczg3MzA4Lm8gbnM3NTIwX2V0aC5vIG9tYXAxNTEwX2kyYy5vIFwKQEAgLTQ3LDEyICs0NywxNCBAQAogCSAgc3RhdHVzX2xlZC5vIHN5bTUzYzh4eC5vIHN5c3RlbWFjZS5vIGFoY2kubyBcCiAJICB0aV9wY2kxNDEwYS5vIHRpZ29uMy5vIHRzZWMubyBcCiAJICB0c2kxMDhfZXRoLm8gdHNpMTA4X2kyYy5vIHRzaTEwOF9wY2kubyBcCi0JICB1c2JkY29yZS5vIHVzYmRjb3JlX2VwMC5vIHVzYmRjb3JlX29tYXAxNTEwLm8gdXNidHR5Lm8gXAorCSAgdXNiX29oY2kubyBcCisJICB1c2JkY29yZS5vIHVzYmRjb3JlX2VwMC5vIHVzYmRjb3JlX21wYzh4eC5vIHVzYmRjb3JlX29tYXAxNTEwLm8gXAorCSAgdXNidHR5Lm8gXAogCSAgdmlkZW9tb2Rlcy5vIHc4M2M1NTNmLm8gXAogCSAga3M4Njk1ZXRoLm8gXAogCSAgcHhhX3BjbWNpYS5vIG1wYzh4eF9wY21jaWEubyB0cW04eHhfcGNtY2lhLm8JXAogCSAgcnB4X3BjbWNpYS5vIFwKLQkgIGZzbF9pMmMubworCSAgZnNsX2kyYy5vIGZzbF9wY2lfaW5pdC5vIGF0aV9yYWRlb25fZmIubwogCiBTUkNTCTo9ICQoQ09CSlM6Lm89LmMpCiBPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWhjaS5jIGIvZHJpdmVycy9haGNpLmMKaW5kZXggOGNlZmYwMC4uY2NkNGQ3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9haGNpLmMKKysrIGIvZHJpdmVycy9haGNpLmMKQEAgLTI1Myw3ICsyNTMsOCBAQAogCiBzdGF0aWMgaW50IGFoY2lfaW5pdF9vbmUocGNpX2Rldl90IHBkZXYpCiB7Ci0JdTMyIGlvYmFzZSwgdmVuZG9yOworCXUzMiBpb2Jhc2U7CisJdTE2IHZlbmRvcjsKIAlpbnQgcmM7CiAKIAltZW1zZXQoKHZvaWQgKilhdGFpZCwgMCwgc2l6ZW9mKGhkX2RyaXZlaWRfdCAqKSAqIEFIQ0lfTUFYX1BPUlRTKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRpX2lkcy5oIGIvZHJpdmVycy9hdGlfaWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3MmE3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXRpX2lkcy5oCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogQVRJIFBDSSBJRHMgZnJvbSBYRnJlZTg2LCBrZXB0IGhlcmUgdG8gbWFrZSBzeW5jJ2luZyB3aXRoCisgKiBYRnJlZSBtdWNoIHNpbXBsZXIuIEN1cnJlbnRseSwgdGhpcyBsaXN0IGlzIG9ubHkgdXNlZCBieQorICogcmFkZW9uZmIKKyAqLworCisjZGVmaW5lIFBDSV9DSElQX1JWMzgwXzMxNTAgICAgICAgICAgICAgMHgzMTUwCisjZGVmaW5lIFBDSV9DSElQX1JWMzgwXzMxNTEgICAgICAgICAgICAgMHgzMTUxCisjZGVmaW5lIFBDSV9DSElQX1JWMzgwXzMxNTIgICAgICAgICAgICAgMHgzMTUyCisjZGVmaW5lIFBDSV9DSElQX1JWMzgwXzMxNTMgICAgICAgICAgICAgMHgzMTUzCisjZGVmaW5lIFBDSV9DSElQX1JWMzgwXzMxNTQgICAgICAgICAgICAgMHgzMTU0CisjZGVmaW5lIFBDSV9DSElQX1JWMzgwXzMxNTYgICAgICAgICAgICAgMHgzMTU2CisjZGVmaW5lIFBDSV9DSElQX1JWMzgwXzNFNTAgICAgICAgICAgICAgMHgzRTUwCisjZGVmaW5lIFBDSV9DSElQX1JWMzgwXzNFNTEgICAgICAgICAgICAgMHgzRTUxCisjZGVmaW5lIFBDSV9DSElQX1JWMzgwXzNFNTIgICAgICAgICAgICAgMHgzRTUyCisjZGVmaW5lIFBDSV9DSElQX1JWMzgwXzNFNTMgICAgICAgICAgICAgMHgzRTUzCisjZGVmaW5lIFBDSV9DSElQX1JWMzgwXzNFNTQgICAgICAgICAgICAgMHgzRTU0CisjZGVmaW5lIFBDSV9DSElQX1JWMzgwXzNFNTYgICAgICAgICAgICAgMHgzRTU2CisjZGVmaW5lIFBDSV9DSElQX1JTMTAwXzQxMzYJCTB4NDEzNgorI2RlZmluZSBQQ0lfQ0hJUF9SUzIwMF80MTM3CQkweDQxMzcKKyNkZWZpbmUgUENJX0NISVBfUjMwMF9BRAkJMHg0MTQ0CisjZGVmaW5lIFBDSV9DSElQX1IzMDBfQUUJCTB4NDE0NQorI2RlZmluZSBQQ0lfQ0hJUF9SMzAwX0FGCQkweDQxNDYKKyNkZWZpbmUgUENJX0NISVBfUjMwMF9BRwkJMHg0MTQ3CisjZGVmaW5lIFBDSV9DSElQX1IzNTBfQUggICAgICAgICAgICAgICAgMHg0MTQ4CisjZGVmaW5lIFBDSV9DSElQX1IzNTBfQUkgICAgICAgICAgICAgICAgMHg0MTQ5CisjZGVmaW5lIFBDSV9DSElQX1IzNTBfQUogICAgICAgICAgICAgICAgMHg0MTRBCisjZGVmaW5lIFBDSV9DSElQX1IzNTBfQUsgICAgICAgICAgICAgICAgMHg0MTRCCisjZGVmaW5lIFBDSV9DSElQX1JWMzUwX0FQICAgICAgICAgICAgICAgMHg0MTUwCisjZGVmaW5lIFBDSV9DSElQX1JWMzUwX0FRICAgICAgICAgICAgICAgMHg0MTUxCisjZGVmaW5lIFBDSV9DSElQX1JWMzYwX0FSICAgICAgICAgICAgICAgMHg0MTUyCisjZGVmaW5lIFBDSV9DSElQX1JWMzUwX0FTICAgICAgICAgICAgICAgMHg0MTUzCisjZGVmaW5lIFBDSV9DSElQX1JWMzUwX0FUICAgICAgICAgICAgICAgMHg0MTU0CisjZGVmaW5lIFBDSV9DSElQX1JWMzUwX0FWICAgICAgICAgICAgICAgMHg0MTU2CisjZGVmaW5lIFBDSV9DSElQX01BQ0gzMgkJMHg0MTU4CisjZGVmaW5lIFBDSV9DSElQX1JTMjUwXzQyMzcJCTB4NDIzNworI2RlZmluZSBQQ0lfQ0hJUF9SMjAwX0JCCQkweDQyNDIKKyNkZWZpbmUgUENJX0NISVBfUjIwMF9CQwkJMHg0MjQzCisjZGVmaW5lIFBDSV9DSElQX1JTMTAwXzQzMzYJCTB4NDMzNgorI2RlZmluZSBQQ0lfQ0hJUF9SUzIwMF80MzM3CQkweDQzMzcKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0Q1QJCTB4NDM1NAorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRDWAkJMHg0MzU4CisjZGVmaW5lIFBDSV9DSElQX1JTMjUwXzQ0MzcJCTB4NDQzNworI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRFVAkJMHg0NTU0CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdCCQkweDQ3NDIKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R0QJCTB4NDc0NAorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHSQkJMHg0NzQ5CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdMCQkweDQ3NEMKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R00JCTB4NDc0RAorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHTgkJMHg0NzRFCisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdPCQkweDQ3NEYKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R1AJCTB4NDc1MAorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHUQkJMHg0NzUxCisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdSCQkweDQ3NTIKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R1MJCTB4NDc1MworI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHVAkJMHg0NzU0CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdVCQkweDQ3NTUKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R1YJCTB4NDc1NgorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHVwkJMHg0NzU3CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdYCQkweDQ3NTgKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R1kJCTB4NDc1OQorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHWgkJMHg0NzVBCisjZGVmaW5lIFBDSV9DSElQX1JWMjUwX0lkCQkweDQ5NjQKKyNkZWZpbmUgUENJX0NISVBfUlYyNTBfSWUJCTB4NDk2NQorI2RlZmluZSBQQ0lfQ0hJUF9SVjI1MF9JZgkJMHg0OTY2CisjZGVmaW5lIFBDSV9DSElQX1JWMjUwX0lnCQkweDQ5NjcKKyNkZWZpbmUgUENJX0NISVBfUjQyMF9KSCAgICAgICAgICAgICAgICAweDRBNDgKKyNkZWZpbmUgUENJX0NISVBfUjQyMF9KSSAgICAgICAgICAgICAgICAweDRBNDkKKyNkZWZpbmUgUENJX0NISVBfUjQyMF9KSiAgICAgICAgICAgICAgICAweDRBNEEKKyNkZWZpbmUgUENJX0NISVBfUjQyMF9KSyAgICAgICAgICAgICAgICAweDRBNEIKKyNkZWZpbmUgUENJX0NISVBfUjQyMF9KTCAgICAgICAgICAgICAgICAweDRBNEMKKyNkZWZpbmUgUENJX0NISVBfUjQyMF9KTSAgICAgICAgICAgICAgICAweDRBNEQKKyNkZWZpbmUgUENJX0NISVBfUjQyMF9KTiAgICAgICAgICAgICAgICAweDRBNEUKKyNkZWZpbmUgUENJX0NISVBfUjQyMF9KUCAgICAgICAgICAgICAgICAweDRBNTAKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0TEIJCTB4NEM0MgorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRMRAkJMHg0QzQ0CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhMRQkJMHg0QzQ1CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhMRgkJMHg0QzQ2CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NExHCQkweDRDNDcKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0TEkJCTB4NEM0OQorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRMTQkJMHg0QzRECisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NExOCQkweDRDNEUKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0TFAJCTB4NEM1MAorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRMUQkJMHg0QzUxCisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NExSCQkweDRDNTIKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0TFMJCTB4NEM1MworI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRMVAkJMHg0QzU0CisjZGVmaW5lIFBDSV9DSElQX1JBREVPTl9MVwkJMHg0QzU3CisjZGVmaW5lIFBDSV9DSElQX1JBREVPTl9MWAkJMHg0QzU4CisjZGVmaW5lIFBDSV9DSElQX1JBREVPTl9MWQkJMHg0QzU5CisjZGVmaW5lIFBDSV9DSElQX1JBREVPTl9MWgkJMHg0QzVBCisjZGVmaW5lIFBDSV9DSElQX1JWMjUwX0xkCQkweDRDNjQKKyNkZWZpbmUgUENJX0NISVBfUlYyNTBfTGUJCTB4NEM2NQorI2RlZmluZSBQQ0lfQ0hJUF9SVjI1MF9MZgkJMHg0QzY2CisjZGVmaW5lIFBDSV9DSElQX1JWMjUwX0xnCQkweDRDNjcKKyNkZWZpbmUgUENJX0NISVBfUlYyNTBfTG4JCTB4NEM2RQorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4TUYJCTB4NEQ0NgorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4TUwJCTB4NEQ0QworI2RlZmluZSBQQ0lfQ0hJUF9SMzAwX05ECQkweDRFNDQKKyNkZWZpbmUgUENJX0NISVBfUjMwMF9ORQkJMHg0RTQ1CisjZGVmaW5lIFBDSV9DSElQX1IzMDBfTkYJCTB4NEU0NgorI2RlZmluZSBQQ0lfQ0hJUF9SMzAwX05HCQkweDRFNDcKKyNkZWZpbmUgUENJX0NISVBfUjM1MF9OSCAgICAgICAgICAgICAgICAweDRFNDgKKyNkZWZpbmUgUENJX0NISVBfUjM1MF9OSSAgICAgICAgICAgICAgICAweDRFNDkKKyNkZWZpbmUgUENJX0NISVBfUjM2MF9OSiAgICAgICAgICAgICAgICAweDRFNEEKKyNkZWZpbmUgUENJX0NISVBfUjM1MF9OSyAgICAgICAgICAgICAgICAweDRFNEIKKyNkZWZpbmUgUENJX0NISVBfUlYzNTBfTlAgICAgICAgICAgICAgICAweDRFNTAKKyNkZWZpbmUgUENJX0NISVBfUlYzNTBfTlEgICAgICAgICAgICAgICAweDRFNTEKKyNkZWZpbmUgUENJX0NISVBfUlYzNTBfTlIgICAgICAgICAgICAgICAweDRFNTIKKyNkZWZpbmUgUENJX0NISVBfUlYzNTBfTlMgICAgICAgICAgICAgICAweDRFNTMKKyNkZWZpbmUgUENJX0NISVBfUlYzNTBfTlQgICAgICAgICAgICAgICAweDRFNTQKKyNkZWZpbmUgUENJX0NISVBfUlYzNTBfTlYgICAgICAgICAgICAgICAweDRFNTYKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBBCQkweDUwNDEKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBCCQkweDUwNDIKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBDCQkweDUwNDMKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBECQkweDUwNDQKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBFCQkweDUwNDUKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBGCQkweDUwNDYKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBHCQkweDUwNDcKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBICQkweDUwNDgKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBJCQkweDUwNDkKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBKCQkweDUwNEEKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBLCQkweDUwNEIKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBMCQkweDUwNEMKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBNCQkweDUwNEQKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBOCQkweDUwNEUKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBPCQkweDUwNEYKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBQCQkweDUwNTAKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBRCQkweDUwNTEKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBSCQkweDUwNTIKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBTCQkweDUwNTMKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBUCQkweDUwNTQKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBVCQkweDUwNTUKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBWCQkweDUwNTYKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBXCQkweDUwNTcKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFBYCQkweDUwNTgKKyNkZWZpbmUgUENJX0NISVBfUkFERU9OX1FECQkweDUxNDQKKyNkZWZpbmUgUENJX0NISVBfUkFERU9OX1FFCQkweDUxNDUKKyNkZWZpbmUgUENJX0NISVBfUkFERU9OX1FGCQkweDUxNDYKKyNkZWZpbmUgUENJX0NISVBfUkFERU9OX1FHCQkweDUxNDcKKyNkZWZpbmUgUENJX0NISVBfUjIwMF9RSAkJMHg1MTQ4CisjZGVmaW5lIFBDSV9DSElQX1IyMDBfUUkJCTB4NTE0OQorI2RlZmluZSBQQ0lfQ0hJUF9SMjAwX1FKCQkweDUxNEEKKyNkZWZpbmUgUENJX0NISVBfUjIwMF9RSwkJMHg1MTRCCisjZGVmaW5lIFBDSV9DSElQX1IyMDBfUUwJCTB4NTE0QworI2RlZmluZSBQQ0lfQ0hJUF9SMjAwX1FNCQkweDUxNEQKKyNkZWZpbmUgUENJX0NISVBfUjIwMF9RTgkJMHg1MTRFCisjZGVmaW5lIFBDSV9DSElQX1IyMDBfUU8JCTB4NTE0RgorI2RlZmluZSBQQ0lfQ0hJUF9SVjIwMF9RVwkJMHg1MTU3CisjZGVmaW5lIFBDSV9DSElQX1JWMjAwX1FYCQkweDUxNTgKKyNkZWZpbmUgUENJX0NISVBfUlYxMDBfUVkJCTB4NTE1OQorI2RlZmluZSBQQ0lfQ0hJUF9SVjEwMF9RWgkJMHg1MTVBCisjZGVmaW5lIFBDSV9DSElQX1JONTAJCQkweDUxNUUKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFJFCQkweDUyNDUKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFJGCQkweDUyNDYKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFJHCQkweDUyNDcKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFJLCQkweDUyNEIKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFJMCQkweDUyNEMKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFNFCQkweDUzNDUKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFNGCQkweDUzNDYKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFNHCQkweDUzNDcKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFNICQkweDUzNDgKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFNLCQkweDUzNEIKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFNMCQkweDUzNEMKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFNNCQkweDUzNEQKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFNOCQkweDUzNEUKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFRGCQkweDU0NDYKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFRMCQkweDU0NEMKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFRSCQkweDU0NTIKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFRTCQkweDU0NTMKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFRUCQkweDU0NTQKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOFRVCQkweDU0NTUKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNTQ2MCAgICAgICAgICAgICAweDU0NjAKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNTQ2MSAgICAgICAgICAgICAweDU0NjEKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNTQ2MiAgICAgICAgICAgICAweDU0NjIKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNTQ2MyAgICAgICAgICAgICAweDU0NjMKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNTQ2NCAgICAgICAgICAgICAweDU0NjQKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNTQ2NSAgICAgICAgICAgICAweDU0NjUKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNTQ2NiAgICAgICAgICAgICAweDU0NjYKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNTQ2NyAgICAgICAgICAgICAweDU0NjcKKyNkZWZpbmUgUENJX0NISVBfUjQyM19VSCAgICAgICAgICAgICAgICAweDU1NDgKKyNkZWZpbmUgUENJX0NISVBfUjQyM19VSSAgICAgICAgICAgICAgICAweDU1NDkKKyNkZWZpbmUgUENJX0NISVBfUjQyM19VSiAgICAgICAgICAgICAgICAweDU1NEEKKyNkZWZpbmUgUENJX0NISVBfUjQyM19VSyAgICAgICAgICAgICAgICAweDU1NEIKKyNkZWZpbmUgUENJX0NISVBfUjQyM19VUSAgICAgICAgICAgICAgICAweDU1NTEKKyNkZWZpbmUgUENJX0NISVBfUjQyM19VUiAgICAgICAgICAgICAgICAweDU1NTIKKyNkZWZpbmUgUENJX0NISVBfUjQyM19VVCAgICAgICAgICAgICAgICAweDU1NTQKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0VlQJCTB4NTY1NAorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRWVQkJMHg1NjU1CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NFZWCQkweDU2NTYKKyNkZWZpbmUgUENJX0NISVBfUlMzMDBfNTgzNAkJMHg1ODM0CisjZGVmaW5lIFBDSV9DSElQX1JTMzAwXzU4MzUJCTB4NTgzNQorI2RlZmluZSBQQ0lfQ0hJUF9SUzMwMF81ODM2CQkweDU4MzYKKyNkZWZpbmUgUENJX0NISVBfUlMzMDBfNTgzNwkJMHg1ODM3CisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzVCNjAgICAgICAgICAgICAgMHg1QjYwCisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzVCNjEgICAgICAgICAgICAgMHg1QjYxCisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzVCNjIgICAgICAgICAgICAgMHg1QjYyCisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzVCNjMgICAgICAgICAgICAgMHg1QjYzCisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzVCNjQgICAgICAgICAgICAgMHg1QjY0CisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzVCNjUgICAgICAgICAgICAgMHg1QjY1CisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzVCNjYgICAgICAgICAgICAgMHg1QjY2CisjZGVmaW5lIFBDSV9DSElQX1JWMzcwXzVCNjcgICAgICAgICAgICAgMHg1QjY3CisjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzU5NjAJCTB4NTk2MAorI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81OTYxCQkweDU5NjEKKyNkZWZpbmUgUENJX0NISVBfUlYyODBfNTk2MgkJMHg1OTYyCisjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzU5NjQJCTB4NTk2NAorI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81QzYxCQkweDVDNjEKKyNkZWZpbmUgUENJX0NISVBfUlYyODBfNUM2MwkJMHg1QzYzCisjZGVmaW5lIFBDSV9DSElQX1I0MjNfNUQ1NyAgICAgICAgICAgICAgMHg1RDU3CisjZGVmaW5lIFBDSV9DSElQX1JTMzUwXzc4MzQgICAgICAgICAgICAgMHg3ODM0CisjZGVmaW5lIFBDSV9DSElQX1JTMzUwXzc4MzUgICAgICAgICAgICAgMHg3ODM1CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0aV9yYWRlb25fZmIuYyBiL2RyaXZlcnMvYXRpX3JhZGVvbl9mYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNzRmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0aV9yYWRlb25fZmIuYwpAQCAtMCwwICsxLDQ4NiBAQAorLyoKKyAqIEFUSSBSYWRlb24gVmlkZW8gY2FyZCBGcmFtZWJ1ZmZlciBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIFpoYW5nIFdlaSA8d2VpLnpoYW5nQGZyZWVzY2FsZS5jb20+CisgKiBKYXNvbiBKaW4gPGphc29uLmppbkBmcmVlc2NhbGUuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIFNvbWUgY29kZXMgb2YgdGhpcyBmaWxlIGlzIHBhcnRseSBwb3J0ZWQgZnJvbSBMaW51eCBrZXJuZWwKKyAqIEFUSSB2aWRlbyBmcmFtZWJ1ZmZlciBkcml2ZXIuCisgKgorICogTm93IHRoZSBkcml2ZXIgaXMgdGVzdGVkIG9uIGJlbG93IEFUSSBjaGlwczoKKyAqICAgOTIwMAorICogICBYMzAwCisgKiAgIFg3MDAKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ09ORklHX0FUSV9SQURFT05fRkIKKworI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8dmlkZW9fZmIuaD4KKworI2luY2x1ZGUgPHJhZGVvbi5oPgorI2luY2x1ZGUgImF0aV9pZHMuaCIKKyNpbmNsdWRlICJhdGlfcmFkZW9uX2ZiLmgiCisKKyN1bmRlZiBERUJVRworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgRFBSSU5UKHguLi4pIHByaW50Zih4KQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5UKHguLi4pIGRve313aGlsZSgwKQorI2VuZGlmCisKKyNpZm5kZWYgbWluX3QKKyNkZWZpbmUgbWluX3QodHlwZSx4LHkpIFwKKwkoeyB0eXBlIF9feCA9ICh4KTsgdHlwZSBfX3kgPSAoeSk7IF9feCA8IF9feSA/IF9feDogX195OyB9KQorI2VuZGlmCisKKyNkZWZpbmUgTUFYX01BUFBFRF9WUkFNCSgyMDQ4KjIwNDgqNCkKKyNkZWZpbmUgTUlOX01BUFBFRF9WUkFNCSgxMDI0Kjc2OCoxKQorCisvKiNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BVEkqLworI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81OTYwCQkweDU5NjAKKyNkZWZpbmUgUENJX0NISVBfUlYyODBfNTk2MQkJMHg1OTYxCisjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzU5NjIJCTB4NTk2MgorI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81OTY0CQkweDU5NjQKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNUI2MAkJMHg1QjYwCisjZGVmaW5lIFBDSV9DSElQX1JWMzgwXzU2NTcJCTB4NTY1NworI2RlZmluZSBQQ0lfQ0hJUF9SNDIwXzU1NGQJCTB4NTU0ZAorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYXRpX3JhZGVvbl9wY2lfaWRzW10gPSB7CisJe1BDSV9WRU5ET1JfSURfQVRJLCBQQ0lfQ0hJUF9SVjI4MF81OTYwfSwKKwl7UENJX1ZFTkRPUl9JRF9BVEksIFBDSV9DSElQX1JWMjgwXzU5NjF9LAorCXtQQ0lfVkVORE9SX0lEX0FUSSwgUENJX0NISVBfUlYyODBfNTk2Mn0sCisJe1BDSV9WRU5ET1JfSURfQVRJLCBQQ0lfQ0hJUF9SVjI4MF81OTY0fSwKKwl7UENJX1ZFTkRPUl9JRF9BVEksIFBDSV9DSElQX1JWMzcwXzVCNjB9LAorCXtQQ0lfVkVORE9SX0lEX0FUSSwgUENJX0NISVBfUlYzODBfNTY1N30sCisJe1BDSV9WRU5ET1JfSURfQVRJLCBQQ0lfQ0hJUF9SNDIwXzU1NGR9LAorCXswLCAwfQorfTsKKworc3RhdGljIHUxNiBhdGlfcmFkZW9uX2lkX2ZhbWlseV90YWJsZVtdWzJdID0geworCXtQQ0lfQ0hJUF9SVjI4MF81OTYwLCBDSElQX0ZBTUlMWV9SVjI4MH0sCisJe1BDSV9DSElQX1JWMjgwXzU5NjEsIENISVBfRkFNSUxZX1JWMjgwfSwKKwl7UENJX0NISVBfUlYyODBfNTk2MiwgQ0hJUF9GQU1JTFlfUlYyODB9LAorCXtQQ0lfQ0hJUF9SVjI4MF81OTY0LCBDSElQX0ZBTUlMWV9SVjI4MH0sCisJe1BDSV9DSElQX1JWMzcwXzVCNjAsIENISVBfRkFNSUxZX1JWMzgwfSwKKwl7UENJX0NISVBfUlYzODBfNTY1NywgQ0hJUF9GQU1JTFlfUlYzODB9LAorCXtQQ0lfQ0hJUF9SNDIwXzU1NGQsICBDSElQX0ZBTUlMWV9SNDIwfSwKKwl7MCwgMH0KK307CisKK3UxNiBnZXRfcmFkZW9uX2lkX2ZhbWlseSh1MTYgZGV2aWNlKQoreworCWludCBpOworCWZvciAoaT0wOyBhdGlfcmFkZW9uX2lkX2ZhbWlseV90YWJsZVswXVtpXTsgaSs9MikKKwkJaWYgKGF0aV9yYWRlb25faWRfZmFtaWx5X3RhYmxlWzBdW2ldID09IGRldmljZSkKKwkJCXJldHVybiBhdGlfcmFkZW9uX2lkX2ZhbWlseV90YWJsZVswXVtpICsgMV07CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbzsKKworc3RhdGljIHZvaWQgcmFkZW9uX2lkZW50aWZ5X3ZyYW0oc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvKQoreworCXUzMiB0bXA7CisKKwkvKiBmcmFtZWJ1ZmZlciBzaXplICovCisJaWYgKChyaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JTMTAwKSB8fAorCQkocmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SUzIwMCkgfHwKKwkJKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlMzMDApKSB7CisJCXUzMiB0b20gPSBJTlJFRyhOQl9UT00pOworCQl0bXAgPSAoKCgodG9tID4+IDE2KSAtICh0b20gJiAweGZmZmYpICsgMSkgPDwgNikgKiAxMDI0KTsKKworCQlyYWRlb25fZmlmb193YWl0KDYpOworCQlPVVRSRUcoTUNfRkJfTE9DQVRJT04sIHRvbSk7CisJCU9VVFJFRyhESVNQTEFZX0JBU0VfQUREUiwgKHRvbSAmIDB4ZmZmZikgPDwgMTYpOworCQlPVVRSRUcoQ1JUQzJfRElTUExBWV9CQVNFX0FERFIsICh0b20gJiAweGZmZmYpIDw8IDE2KTsKKwkJT1VUUkVHKE9WMF9CQVNFX0FERFIsICh0b20gJiAweGZmZmYpIDw8IDE2KTsKKworCQkvKiBUaGlzIGlzIHN1cHBvc2VkIHRvIGZpeCB0aGUgY3J0YzIgbm9pc2UgcHJvYmxlbS4gKi8KKwkJT1VUUkVHKEdSUEgyX0JVRkZFUl9DTlRMLCBJTlJFRyhHUlBIMl9CVUZGRVJfQ05UTCkgJiB+MHg3ZjAwMDApOworCisJCWlmICgocmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SUzEwMCkgfHwKKwkJCShyaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JTMjAwKSkgeworCQkvKiBUaGlzIGlzIHRvIHdvcmthcm91bmQgdGhlIGFzaWMgYnVnIGZvciBSTVgsIHNvbWUgdmVyc2lvbnMKKwkJICAgb2YgQklPUyBkb3Nlbid0IGhhdmUgdGhpcyByZWdpc3RlciBpbml0aWFsaXplZCBjb3JyZWN0bHkuCisJCSovCisJCQlPVVRSRUdQKENSVENfTU9SRV9DTlRMLCBDUlRDX0hfQ1VUT0ZGX0FDVElWRV9FTiwKKwkJCQl+Q1JUQ19IX0NVVE9GRl9BQ1RJVkVfRU4pOworCQl9CisJfSBlbHNlIHsKKwkJdG1wID0gSU5SRUcoQ09ORklHX01FTVNJWkUpOworCX0KKworCS8qIG1lbSBzaXplIGlzIGJpdHMgWzI4OjBdLCBtYXNrIG9mZiB0aGUgcmVzdCAqLworCXJpbmZvLT52aWRlb19yYW0gPSB0bXAgJiBDT05GSUdfTUVNU0laRV9NQVNLOworCisJLyoKKwkgKiBIYWNrIHRvIGdldCBhcm91bmQgc29tZSBidXN0ZWQgcHJvZHVjdGlvbiBNNidzCisJICogcmVwb3J0aW5nIG5vIHJhbQorCSAqLworCWlmIChyaW5mby0+dmlkZW9fcmFtID09IDApIHsKKwkJc3dpdGNoIChyaW5mby0+cGRldi5kZXZpY2UpIHsKKwkJY2FzZSBQQ0lfQ0hJUF9SQURFT05fTFk6CisJCWNhc2UgUENJX0NISVBfUkFERU9OX0xaOgorCQkJcmluZm8tPnZpZGVvX3JhbSA9IDgxOTIgKiAxMDI0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogTm93IHRyeSB0byBpZGVudGlmeSBWUkFNIHR5cGUKKwkgKi8KKwlpZiAoKHJpbmZvLT5mYW1pbHkgPj0gQ0hJUF9GQU1JTFlfUjMwMCkgfHwKKwkgICAgKElOUkVHKE1FTV9TRFJBTV9NT0RFX1JFRykgJiAoMTw8MzApKSkKKwkJcmluZm8tPnZyYW1fZGRyID0gMTsKKwllbHNlCisJCXJpbmZvLT52cmFtX2RkciA9IDA7CisKKwl0bXAgPSBJTlJFRyhNRU1fQ05UTCk7CisJaWYgKElTX1IzMDBfVkFSSUFOVChyaW5mbykpIHsKKwkJdG1wICY9ICBSMzAwX01FTV9OVU1fQ0hBTk5FTFNfTUFTSzsKKwkJc3dpdGNoICh0bXApIHsKKwkJY2FzZSAwOiAgcmluZm8tPnZyYW1fd2lkdGggPSA2NDsgYnJlYWs7CisJCWNhc2UgMTogIHJpbmZvLT52cmFtX3dpZHRoID0gMTI4OyBicmVhazsKKwkJY2FzZSAyOiAgcmluZm8tPnZyYW1fd2lkdGggPSAyNTY7IGJyZWFrOworCQlkZWZhdWx0OiByaW5mby0+dnJhbV93aWR0aCA9IDEyODsgYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKChyaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JWMTAwKSB8fAorCQkgICAocmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SUzEwMCkgfHwKKwkJICAgKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlMyMDApKXsKKwkJaWYgKHRtcCAmIFJWMTAwX01FTV9IQUxGX01PREUpCisJCQlyaW5mby0+dnJhbV93aWR0aCA9IDMyOworCQllbHNlCisJCQlyaW5mby0+dnJhbV93aWR0aCA9IDY0OworCX0gZWxzZSB7CisJCWlmICh0bXAgJiBNRU1fTlVNX0NIQU5ORUxTX01BU0spCisJCQlyaW5mby0+dnJhbV93aWR0aCA9IDEyODsKKwkJZWxzZQorCQkJcmluZm8tPnZyYW1fd2lkdGggPSA2NDsKKwl9CisKKwkvKiBUaGlzIG1heSBub3QgYmUgY29ycmVjdCwgYXMgc29tZSBjYXJkcyBjYW4gaGF2ZSBoYWxmIG9mIGNoYW5uZWwgZGlzYWJsZWQKKwkgKiBUb0RvOiBpZGVudGlmeSB0aGVzZSBjYXNlcworCSAqLworCisJRFBSSU5UKCJyYWRlb25mYjogRm91bmQgJWxkayBvZiAlcyAlZCBiaXRzIHdpZGUgdmlkZW9yYW1cbiIsCisJICAgICAgIHJpbmZvLT52aWRlb19yYW0gLyAxMDI0LAorCSAgICAgICByaW5mby0+dnJhbV9kZHIgPyAiRERSIiA6ICJTRFJBTSIsCisJICAgICAgIHJpbmZvLT52cmFtX3dpZHRoKTsKKworfQorCitzdGF0aWMgdm9pZCByYWRlb25fd3JpdGVfcGxsX3JlZ3Moc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvLCBzdHJ1Y3QgcmFkZW9uX3JlZ3MgKm1vZGUpCit7CisJaW50IGk7CisKKwlyYWRlb25fZmlmb193YWl0KDIwKTsKKworI2lmIDAKKwkvKiBXb3JrYXJvdW5kIGZyb20gWEZyZWUgKi8KKwlpZiAocmluZm8tPmlzX21vYmlsaXR5KSB7CisJCS8qIEEgdGVtcG9yYWwgd29ya2Fyb3VuZCBmb3IgdGhlIG9jY2F0aW9uYWwgYmxhbmtpbmcgb24gY2VydGFpbiBsYXB0b3AKKwkJICogcGFuZWxzLiBUaGlzIGFwcGVhcnMgdG8gcmVsYXRlZCB0byB0aGUgUExMIGRpdmlkZXIgcmVnaXN0ZXJzCisJCSAqIChmYWlsIHRvIGxvY2s/KS4gSXQgb2NjdXJzIGV2ZW4gd2hlbiBhbGwgZGl2aWRlcnMgYXJlIHRoZSBzYW1lCisJCSAqIHdpdGggdGhlaXIgb2xkIHNldHRpbmdzLiBJbiB0aGlzIGNhc2Ugd2UgcmVhbGx5IGRvbid0IG5lZWQgdG8KKwkJICogZmlkZGxlIHdpdGggUExMIHJlZ2lzdGVycy4gQnkgZG9pbmcgdGhpcyB3ZSBjYW4gYXZvaWQgdGhlIGJsYW5raW5nCisJCSAqIHByb2JsZW0gd2l0aCBzb21lIHBhbmVscy4KKwkJICovCisJCWlmICgobW9kZS0+cHBsbF9yZWZfZGl2ID09IChJTlBMTChQUExMX1JFRl9ESVYpICYgUFBMTF9SRUZfRElWX01BU0spKSAmJgorCQkgICAgKG1vZGUtPnBwbGxfZGl2XzMgPT0gKElOUExMKFBQTExfRElWXzMpICYKKwkJCQkJICAoUFBMTF9QT1NUM19ESVZfTUFTSyB8IFBQTExfRkIzX0RJVl9NQVNLKSkpKSB7CisJCQkvKiBXZSBzdGlsbCBoYXZlIHRvIGZvcmNlIGEgc3dpdGNoIHRvIHNlbGVjdGVkIFBQTEwgZGl2IHRoYW5rcyB0bworCQkJICogYW4gWEZyZWU4NiBkcml2ZXIgYnVnIHdoaWNoIHdpbGwgc3dpdGNoIGl0IGF3YXkgaW4gc29tZSBjYXNlcworCQkJICogZXZlbiB3aGVuIHVzaW5nIFVzZUZEZXYgKi8KKwkJCU9VVFJFR1AoQ0xPQ0tfQ05UTF9JTkRFWCwKKwkJCQltb2RlLT5jbGtfY250bF9pbmRleCAmIFBQTExfRElWX1NFTF9NQVNLLAorCQkJCX5QUExMX0RJVl9TRUxfTUFTSyk7CisJCQlyYWRlb25fcGxsX2VycmF0YV9hZnRlcl9pbmRleChyaW5mbyk7CisJCQlyYWRlb25fcGxsX2VycmF0YV9hZnRlcl9kYXRhKHJpbmZvKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNlbmRpZgorCWlmKHJpbmZvLT5wZGV2LmRldmljZSA9PSBQQ0lfQ0hJUF9SVjM3MF81QjYwKSByZXR1cm47CisKKwkvKiBTd2ljaCBWQ0tMIGNsb2NrIGlucHV0IHRvIENQVUNMSyBzbyBpdCBzdGF5cyBmZWQgd2hpbGUgUFBMTCB1cGRhdGVzKi8KKwlPVVRQTExQKFZDTEtfRUNQX0NOVEwsIFZDTEtfU1JDX1NFTF9DUFVDTEssIH5WQ0xLX1NSQ19TRUxfTUFTSyk7CisKKwkvKiBSZXNldCBQUExMICYgZW5hYmxlIGF0b21pYyB1cGRhdGUgKi8KKwlPVVRQTExQKFBQTExfQ05UTCwKKwkJUFBMTF9SRVNFVCB8IFBQTExfQVRPTUlDX1VQREFURV9FTiB8IFBQTExfVkdBX0FUT01JQ19VUERBVEVfRU4sCisJCX4oUFBMTF9SRVNFVCB8IFBQTExfQVRPTUlDX1VQREFURV9FTiB8IFBQTExfVkdBX0FUT01JQ19VUERBVEVfRU4pKTsKKworCS8qIFN3aXRjaCB0byBzZWxlY3RlZCBQUExMIGRpdmlkZXIgKi8KKwlPVVRSRUdQKENMT0NLX0NOVExfSU5ERVgsCisJCW1vZGUtPmNsa19jbnRsX2luZGV4ICYgUFBMTF9ESVZfU0VMX01BU0ssCisJCX5QUExMX0RJVl9TRUxfTUFTSyk7CisKKwkvKiBTZXQgUFBMTCByZWYuIGRpdiAqLworCWlmIChyaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1IzMDAgfHwKKwkgICAgcmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SUzMwMCB8fAorCSAgICByaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1IzNTAgfHwKKwkgICAgcmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SVjM1MCkgeworCQlpZiAobW9kZS0+cHBsbF9yZWZfZGl2ICYgUjMwMF9QUExMX1JFRl9ESVZfQUNDX01BU0spIHsKKwkJCS8qIFdoZW4gcmVzdG9yaW5nIGNvbnNvbGUgbW9kZSwgdXNlIHNhdmVkIFBQTExfUkVGX0RJVgorCQkJICogc2V0dGluZy4KKwkJCSAqLworCQkJT1VUUExMUChQUExMX1JFRl9ESVYsIG1vZGUtPnBwbGxfcmVmX2RpdiwgMCk7CisJCX0gZWxzZSB7CisJCQkvKiBSMzAwIHVzZXMgcmVmX2Rpdl9hY2MgZmllbGQgYXMgcmVhbCByZWYgZGl2aWRlciAqLworCQkJT1VUUExMUChQUExMX1JFRl9ESVYsCisJCQkJKG1vZGUtPnBwbGxfcmVmX2RpdiA8PCBSMzAwX1BQTExfUkVGX0RJVl9BQ0NfU0hJRlQpLAorCQkJCX5SMzAwX1BQTExfUkVGX0RJVl9BQ0NfTUFTSyk7CisJCX0KKwl9IGVsc2UKKwkJT1VUUExMUChQUExMX1JFRl9ESVYsIG1vZGUtPnBwbGxfcmVmX2RpdiwgflBQTExfUkVGX0RJVl9NQVNLKTsKKworCS8qIFNldCBQUExMIGRpdmlkZXIgMyAmIHBvc3QgZGl2aWRlciovCisJT1VUUExMUChQUExMX0RJVl8zLCBtb2RlLT5wcGxsX2Rpdl8zLCB+UFBMTF9GQjNfRElWX01BU0spOworCU9VVFBMTFAoUFBMTF9ESVZfMywgbW9kZS0+cHBsbF9kaXZfMywgflBQTExfUE9TVDNfRElWX01BU0spOworCisJLyogV3JpdGUgdXBkYXRlICovCisJd2hpbGUgKElOUExMKFBQTExfUkVGX0RJVikgJiBQUExMX0FUT01JQ19VUERBVEVfUikKKwkJOworCU9VVFBMTFAoUFBMTF9SRUZfRElWLCBQUExMX0FUT01JQ19VUERBVEVfVywgflBQTExfQVRPTUlDX1VQREFURV9XKTsKKworCS8qIFdhaXQgcmVhZCB1cGRhdGUgY29tcGxldGUgKi8KKwkvKiBGSVhNRTogQ2VydGFpbiByZXZpc2lvbnMgb2YgUjMwMCBjYW4ndCByZWNvdmVyIGhlcmUuICBOb3Qgc3VyZSBvZgorCSAgIHRoZSBjYXVzZSB5ZXQsIGJ1dCB0aGlzIHdvcmthcm91bmQgd2lsbCBtYXNrIHRoZSBwcm9ibGVtIGZvciBub3cuCisJICAgT3RoZXIgY2hpcHMgdXN1YWxseSB3aWxsIHBhc3MgYXQgdGhlIHZlcnkgZmlyc3QgdGVzdCwgc28gdGhlCisJICAgd29ya2Fyb3VuZCBzaG91bGRuJ3QgaGF2ZSBhbnkgZWZmZWN0IG9uIHRoZW0uICovCisJZm9yIChpID0gMDsgKGkgPCAxMDAwMCAmJiBJTlBMTChQUExMX1JFRl9ESVYpICYgUFBMTF9BVE9NSUNfVVBEQVRFX1IpOyBpKyspCisJCTsKKworCU9VVFBMTChIVE9UQUxfQ05UTCwgMCk7CisKKwkvKiBDbGVhciByZXNldCAmIGF0b21pYyB1cGRhdGUgKi8KKwlPVVRQTExQKFBQTExfQ05UTCwgMCwKKwkJfihQUExMX1JFU0VUIHwgUFBMTF9TTEVFUCB8IFBQTExfQVRPTUlDX1VQREFURV9FTiB8IFBQTExfVkdBX0FUT01JQ19VUERBVEVfRU4pKTsKKworCS8qIFdlIG1heSB3YW50IHNvbWUgbG9ja2luZyAuLi4gb2ggd2VsbCAqLworCXVkZWxheSg1MDAwKTsKKworCS8qIFN3aXRjaCBiYWNrIFZDTEsgc291cmNlIHRvIFBQTEwgKi8KKwlPVVRQTExQKFZDTEtfRUNQX0NOVEwsIFZDTEtfU1JDX1NFTF9QUExMQ0xLLCB+VkNMS19TUkNfU0VMX01BU0spOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IHJlZzsKKwl1MzIgdmFsOworfSByZWdfdmFsOworCisKKy8qIHRoZXNlIGNvbW1vbiByZWdzIGFyZSBjbGVhcmVkIGJlZm9yZSBtb2RlIHNldHRpbmcgc28gdGhleSBkbyBub3QKKyAqIGludGVyZmVyZSB3aXRoIGFueXRoaW5nCisgKi8KK3N0YXRpYyByZWdfdmFsIGNvbW1vbl9yZWdzW10gPSB7CisJeyBPVlJfQ0xSLCAwIH0sCisJeyBPVlJfV0lEX0xFRlRfUklHSFQsIDAgfSwKKwl7IE9WUl9XSURfVE9QX0JPVFRPTSwgMCB9LAorCXsgT1YwX1NDQUxFX0NOVEwsIDAgfSwKKwl7IFNVQlBJQ19DTlRMLCAwIH0sCisJeyBWSVBIX0NPTlRST0wsIDAgfSwKKwl7IEkyQ19DTlRMXzEsIDAgfSwKKwl7IEdFTl9JTlRfQ05UTCwgMCB9LAorCXsgQ0FQMF9UUklHX0NOVEwsIDAgfSwKKwl7IENBUDFfVFJJR19DTlRMLCAwIH0sCit9OworCisKK3ZvaWQgcmFkZW9uX3NldG1vZGUodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmFkZW9uX3JlZ3MgKm1vZGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fcmVncykpOworCisJbW9kZS0+Y3J0Y19nZW5fY250bCA9IDB4MDMwMDAyMDA7CisJbW9kZS0+Y3J0Y19leHRfY250bCA9IDB4MDAwMDgwNDg7CisJbW9kZS0+ZGFjX2NudGwgPSAweGZmMDAyMTAwOworCW1vZGUtPmNydGNfaF90b3RhbF9kaXNwID0gMHg0ZjAwNjM7CisJbW9kZS0+Y3J0Y19oX3N5bmNfc3RydF93aWQgPSAweDhjMDJhMjsKKwltb2RlLT5jcnRjX3ZfdG90YWxfZGlzcCA9IDB4MDFkZjAyMGM7CisJbW9kZS0+Y3J0Y192X3N5bmNfc3RydF93aWQgPSAweDgyMDFlYTsKKwltb2RlLT5jcnRjX3BpdGNoID0gMHgwMDUwMDA1MDsKKworCU9VVFJFRyhDUlRDX0dFTl9DTlRMLCBtb2RlLT5jcnRjX2dlbl9jbnRsKTsKKwlPVVRSRUdQKENSVENfRVhUX0NOVEwsIG1vZGUtPmNydGNfZXh0X2NudGwsCisJCX4oQ1JUQ19IU1lOQ19ESVMgfCBDUlRDX1ZTWU5DX0RJUyB8IENSVENfRElTUExBWV9ESVMpKTsKKwlPVVRSRUdQKERBQ19DTlRMLCBtb2RlLT5kYWNfY250bCwgREFDX1JBTkdFX0NOVEwgfCBEQUNfQkxBTktJTkcpOworCU9VVFJFRyhDUlRDX0hfVE9UQUxfRElTUCwgbW9kZS0+Y3J0Y19oX3RvdGFsX2Rpc3ApOworCU9VVFJFRyhDUlRDX0hfU1lOQ19TVFJUX1dJRCwgbW9kZS0+Y3J0Y19oX3N5bmNfc3RydF93aWQpOworCU9VVFJFRyhDUlRDX1ZfVE9UQUxfRElTUCwgbW9kZS0+Y3J0Y192X3RvdGFsX2Rpc3ApOworCU9VVFJFRyhDUlRDX1ZfU1lOQ19TVFJUX1dJRCwgbW9kZS0+Y3J0Y192X3N5bmNfc3RydF93aWQpOworCU9VVFJFRyhDUlRDX09GRlNFVCwgMCk7CisJT1VUUkVHKENSVENfT0ZGU0VUX0NOVEwsIDApOworCU9VVFJFRyhDUlRDX1BJVENILCBtb2RlLT5jcnRjX3BpdGNoKTsKKworCW1vZGUtPmNsa19jbnRsX2luZGV4ID0gMHgzMDA7CisJbW9kZS0+cHBsbF9yZWZfZGl2ID0gMHhjOworCW1vZGUtPnBwbGxfZGl2XzMgPSAweDAwMDMwMDU5OworCisJcmFkZW9uX3dyaXRlX3BsbF9yZWdzKHJpbmZvLCBtb2RlKTsKK30KKworaW50IHJhZGVvbl9wcm9iZShzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8pCit7CisJcGNpX2Rldl90IHBkZXY7CisJdTE2IGRpZDsKKworCXBkZXYgPSBwY2lfZmluZF9kZXZpY2VzKGF0aV9yYWRlb25fcGNpX2lkcywgMCk7CisKKwlpZiAocGRldiAhPSAtMSkgeworCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfREVWSUNFX0lELCAmZGlkKTsKKwkJcHJpbnRmKCJBVEkgUmFkZW9uIHZpZGVvIGNhcmQgKCUwNHgsICUwNHgpIGZvdW5kIEAoJWQ6JWQ6JWQpXG4iLAorCQkJCVBDSV9WRU5ET1JfSURfQVRJLCBkaWQsIChwZGV2ID4+IDE2KSAmIDB4ZmYsCisJCQkJKHBkZXYgPj4gMTEpICYgMHgxZiwgKHBkZXYgPj4gOCkgJiAweDcpOworCisJCXN0cmNweShyaW5mby0+bmFtZSwgIkFUSSBSYWRlb24iKTsKKwkJcmluZm8tPnBkZXYudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9BVEk7CisJCXJpbmZvLT5wZGV2LmRldmljZSA9IGRpZDsKKwkJcmluZm8tPmZhbWlseSA9IGdldF9yYWRlb25faWRfZmFtaWx5KHJpbmZvLT5wZGV2LmRldmljZSk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsCisJCQkJJnJpbmZvLT5mYl9iYXNlX3BoeXMpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18yLAorCQkJCSZyaW5mby0+bW1pb19iYXNlX3BoeXMpOworCQlyaW5mby0+ZmJfYmFzZV9waHlzICY9IDB4ZmZmZmYwMDA7CisJCXJpbmZvLT5tbWlvX2Jhc2VfcGh5cyAmPSB+MHgwNDsKKworCQlyaW5mby0+bW1pb19iYXNlID0gKHZvaWQgKilyaW5mby0+bW1pb19iYXNlX3BoeXM7CisJCURQUklOVCgicmluZm8tPm1taW9fYmFzZSA9IDB4JXhcbiIscmluZm8tPm1taW9fYmFzZSk7CisJCXJpbmZvLT5mYl9sb2NhbF9iYXNlID0gSU5SRUcoTUNfRkJfTE9DQVRJT04pIDw8IDE2OworCQlEUFJJTlQoInJpbmZvLT5mYl9sb2NhbF9iYXNlID0gMHgleFxuIixyaW5mby0+ZmJfbG9jYWxfYmFzZSk7CisJCS8qIFBvc3RCSU9TIHdpdGggeDg2IGVtdWxhdGVyICovCisJCUJvb3RWaWRlb0NhcmRCSU9TKHBkZXYsIE5VTEwsIDApOworCisJCS8qCisJCSAqIENoZWNrIGZvciBlcnJhdGEKKwkJICogKFRoZXNlIHdpbGwgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZSBmb3IgdGhlIGNoaXBmYW1pbHkKKwkJICogUjMwMCwgUlYyMDAsIFJTMjAwLCBSVjEwMCwgUlMxMDAuKQorCQkgKi8KKworCQkvKiBHZXQgVlJBTSBzaXplIGFuZCB0eXBlICovCisJCXJhZGVvbl9pZGVudGlmeV92cmFtKHJpbmZvKTsKKworCQlyaW5mby0+bWFwcGVkX3ZyYW0gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBNQVhfTUFQUEVEX1ZSQU0sCisJCQkJcmluZm8tPnZpZGVvX3JhbSk7CisJCXJpbmZvLT5mYl9iYXNlID0gKHZvaWQgKilyaW5mby0+ZmJfYmFzZV9waHlzOworCisJCURQUklOVCgiUmFkZW9uOiBmcmFtZWJ1ZmZlciBiYXNlIHBoeSBhZGRyZXNzIDB4JTA4eCwiIFwKKwkJICAgICAgIk1NSU8gYmFzZSBwaHkgYWRkcmVzcyAweCUwOHgsIiBcCisJCSAgICAgICJmcmFtZWJ1ZmZlciBsb2NhbCBiYXNlIDB4JTA4eC5cbiAiLAorCQkgICAgICByaW5mby0+ZmJfYmFzZV9waHlzLCByaW5mby0+bW1pb19iYXNlX3BoeXMsCisJCSAgICAgIHJpbmZvLT5mYl9sb2NhbF9iYXNlKTsKKworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC0xOworfQorCisvKgorICogVGhlIEdyYXBoaWMgRGV2aWNlCisgKi8KK0dyYXBoaWNEZXZpY2UgY3RmYjsKKworI2RlZmluZSBDVVJTT1JfU0laRQkweDEwMDAJLyogaW4gS0J5dGUgZm9yIEhXIEN1cnNvciAqLworI2RlZmluZSBQQVRURVJOX0FEUgkocEdELT5kcHJCYXNlICsgQ1VSU09SX1NJWkUpCS8qIHBhdHRlcm4gTWVtb3J5IGFmdGVyIEN1cnNvciBNZW1vcnkgKi8KKyNkZWZpbmUgUEFUVEVSTl9TSVpFCTgqOCo0CS8qIDQgQnl0ZXMgcGVyIFBpeGVsIDggeCA4IFBpeGVsICovCisjZGVmaW5lIEFDQ0VMTUVNT1JZCShDVVJTT1JfU0laRSArIFBBVFRFUk5fU0laRSkJLyogcmVzZXJ2ZWQgTWVtb3J5IGZvciBCSVRCbHQgYW5kIGh3IGN1cnNvciAqLworCit2b2lkICp2aWRlb19od19pbml0KHZvaWQpCit7CisJR3JhcGhpY0RldmljZSAqcEdEID0gKEdyYXBoaWNEZXZpY2UgKikgJiBjdGZiOworCWludCBpOworCXUzMiAqdm07CisKKwlyaW5mbyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHJhZGVvbmZiX2luZm8pKTsKKworCWlmKHJhZGVvbl9wcm9iZShyaW5mbykpIHsKKwkJcHJpbnRmKCJObyByYWRlb24gdmlkZW8gY2FyZCBmb3VuZCFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBmaWxsIGluIEdyYXBoaWMgZGV2aWNlIHN0cnVjdCAqLworCXNwcmludGYgKHBHRC0+bW9kZUlkZW50LCAiJWR4JWR4JWQgJWxka0h6ICVsZEh6IiwgNjQwLAorCQkgNDgwLCAxNiwgKDEwMDAgLyAxMDAwKSwKKwkJICgyMDAwIC8gMTAwMCkpOworCXByaW50ZiAoIiVzXG4iLCBwR0QtPm1vZGVJZGVudCk7CisKKwlwR0QtPndpblNpemVYID0gNjQwOworCXBHRC0+d2luU2l6ZVkgPSA0ODA7CisJcEdELT5wbG5TaXplWCA9IDY0MDsKKwlwR0QtPnBsblNpemVZID0gNDgwOworCisJcEdELT5nZGZCeXRlc1BQID0gMTsKKwlwR0QtPmdkZkluZGV4ID0gR0RGX184QklUX0lOREVYOworCisJcEdELT5pc2FCYXNlID0gQ0ZHX0lTQV9JT19CQVNFX0FERFJFU1M7CisJcEdELT5wY2lCYXNlID0gcmluZm8tPmZiX2Jhc2VfcGh5czsKKwlwR0QtPmZyYW1lQWRycyA9IHJpbmZvLT5mYl9iYXNlX3BoeXM7CisJcEdELT5tZW1TaXplID0gNjQgKiAxMDI0ICogMTAyNDsKKworCS8qIEN1cnNvciBTdGFydCBBZGRyZXNzICovCisJcEdELT5kcHJCYXNlID0KKwkgICAgKHBHRC0+d2luU2l6ZVggKiBwR0QtPndpblNpemVZICogcEdELT5nZGZCeXRlc1BQKSArIHJpbmZvLT5mYl9iYXNlX3BoeXM7CisJaWYgKChwR0QtPmRwckJhc2UgJiAweDBmZmYpICE9IDApIHsKKwkJLyogYWxsaWduIGl0ICovCisJCXBHRC0+ZHByQmFzZSAmPSAweGZmZmZmMDAwOworCQlwR0QtPmRwckJhc2UgKz0gMHgwMDAwMTAwMDsKKwl9CisJRFBSSU5UICgiQ3Vyc29yIFN0YXJ0ICV4IFBhdHRlcm4gU3RhcnQgJXhcbiIsIHBHRC0+ZHByQmFzZSwKKwkJUEFUVEVSTl9BRFIpOworCXBHRC0+dnByQmFzZSA9IHJpbmZvLT5mYl9iYXNlX3BoeXM7CS8qIER1bW15ICovCisJcEdELT5jcHJCYXNlID0gcmluZm8tPmZiX2Jhc2VfcGh5czsJLyogRHVtbXkgKi8KKwkvKiBzZXQgdXAgSGFyZHdhcmUgKi8KKworCS8qIENsZWFyIHZpZGVvIG1lbW9yeSAqLworCWkgPSBwR0QtPm1lbVNpemUgLyA0OworCXZtID0gKHVuc2lnbmVkIGludCAqKSBwR0QtPnBjaUJhc2U7CisJd2hpbGUgKGktLSkKKwkJKnZtKysgPSAwOworCS8qU2V0RHJhd2luZ0VuZ2luZSAoYml0c19wZXJfcGl4ZWwpOyovCisKKwlyYWRlb25fc2V0bW9kZSgpOworCisJcmV0dXJuICgodm9pZCAqKSBwR0QpOworfQorCit2b2lkIHZpZGVvX3NldF9sdXQgKHVuc2lnbmVkIGludCBpbmRleCwJLyogY29sb3IgbnVtYmVyICovCisJICAgICAgIHVuc2lnbmVkIGNoYXIgciwJLyogcmVkICovCisJICAgICAgIHVuc2lnbmVkIGNoYXIgZywJLyogZ3JlZW4gKi8KKwkgICAgICAgdW5zaWduZWQgY2hhciBiCS8qIGJsdWUgKi8KKwkgICAgICAgKQoreworCU9VVFJFRyhQQUxFVFRFX0lOREVYLCBpbmRleCk7CisJT1VUUkVHKFBBTEVUVEVfREFUQSwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGlfcmFkZW9uX2ZiLmggYi9kcml2ZXJzL2F0aV9yYWRlb25fZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWM0YjhiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hdGlfcmFkZW9uX2ZiLmgKQEAgLTAsMCArMSwyODIgQEAKKyNpZm5kZWYgX19BVElfUkFERU9OX0ZCX0gKKyNkZWZpbmUgX19BVElfUkFERU9OX0ZCX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTW9zdCBvZiB0aGUgZGVmaW5pdGlvbnMgaGVyZSBhcmUgYWRhcHRlZCByaWdodCBmcm9tIFhGcmVlODYgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENoaXAgZmFtaWxpZXMuIE11c3QgZml0IGluIHRoZSBsb3cgMTYgYml0cyBvZiBhIGxvbmcgd29yZAorICovCitlbnVtIHJhZGVvbl9mYW1pbHkgeworCUNISVBfRkFNSUxZX1VOS05PVywKKwlDSElQX0ZBTUlMWV9MRUdBQ1ksCisJQ0hJUF9GQU1JTFlfUkFERU9OLAorCUNISVBfRkFNSUxZX1JWMTAwLAorCUNISVBfRkFNSUxZX1JTMTAwLCAgICAvKiBVMSAoSUdQMzIwTSkgb3IgQTMgKElHUDMyMCkqLworCUNISVBfRkFNSUxZX1JWMjAwLAorCUNISVBfRkFNSUxZX1JTMjAwLCAgICAvKiBVMiAoSUdQMzMwTS8zNDBNLzM1ME0pIG9yIEE0IChJR1AzMzAvMzQwLzM0NS8zNTApLAorCQkJCSBSUzI1MCAoSUdQIDcwMDApICovCisJQ0hJUF9GQU1JTFlfUjIwMCwKKwlDSElQX0ZBTUlMWV9SVjI1MCwKKwlDSElQX0ZBTUlMWV9SUzMwMCwgICAgLyogUmFkZW9uIDkwMDAgSUdQICovCisJQ0hJUF9GQU1JTFlfUlYyODAsCisJQ0hJUF9GQU1JTFlfUjMwMCwKKwlDSElQX0ZBTUlMWV9SMzUwLAorCUNISVBfRkFNSUxZX1JWMzUwLAorCUNISVBfRkFNSUxZX1JWMzgwLCAgICAvKiBSVjM3MC9SVjM4MC9NMjIvTTI0ICovCisJQ0hJUF9GQU1JTFlfUjQyMCwgICAgIC8qIFI0MjAvUjQyMy9NMTggKi8KKwlDSElQX0ZBTUlMWV9MQVNULAorfTsKKworI2RlZmluZSBJU19SVjEwMF9WQVJJQU5UKHJpbmZvKSAoKChyaW5mbyktPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SVjEwMCkgIHx8IFwKKwkJCQkgKChyaW5mbyktPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SVjIwMCkgIHx8IFwKKwkJCQkgKChyaW5mbyktPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SUzEwMCkgIHx8IFwKKwkJCQkgKChyaW5mbyktPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SUzIwMCkgIHx8IFwKKwkJCQkgKChyaW5mbyktPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SVjI1MCkgIHx8IFwKKwkJCQkgKChyaW5mbyktPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SVjI4MCkgIHx8IFwKKwkJCQkgKChyaW5mbyktPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SUzMwMCkpCisKKyNkZWZpbmUgSVNfUjMwMF9WQVJJQU5UKHJpbmZvKSAoKChyaW5mbyktPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SMzAwKSAgfHwgXAorCQkJCSgocmluZm8pLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlYzNTApIHx8IFwKKwkJCQkoKHJpbmZvKS0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1IzNTApICB8fCBcCisJCQkJKChyaW5mbyktPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SVjM4MCkgfHwgXAorCQkJCSgocmluZm8pLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUjQyMCkpCisKK3N0cnVjdCByYWRlb25mYl9pbmZvIHsKKwljaGFyIG5hbWVbMjBdOworCisJc3RydWN0IHBjaV9kZXZpY2VfaWQJcGRldjsKKwl1MTYgCQkJZmFtaWx5OworCisJdTMyIAkJCWZiX2Jhc2VfcGh5czsKKwl1MzIgCQkJbW1pb19iYXNlX3BoeXM7CisKKwl2b2lkIAkJCSptbWlvX2Jhc2U7CisJdm9pZCAJCQkqZmJfYmFzZTsKKworCXUzMgkJCXZpZGVvX3JhbTsKKwl1MzIJCQltYXBwZWRfdnJhbTsKKwlpbnQJCQl2cmFtX3dpZHRoOworCWludAkJCXZyYW1fZGRyOworCisJdTMyIAkJCWZiX2xvY2FsX2Jhc2U7Cit9OworCisjZGVmaW5lIElOUkVHOChhZGRyKQkJcmVhZGIoKHJpbmZvLT5tbWlvX2Jhc2UpK2FkZHIpCisjZGVmaW5lIE9VVFJFRzgoYWRkcix2YWwpCXdyaXRlYih2YWwsIChyaW5mby0+bW1pb19iYXNlKSthZGRyKQorI2RlZmluZSBJTlJFRzE2KGFkZHIpCQlyZWFkdygocmluZm8tPm1taW9fYmFzZSkrYWRkcikKKyNkZWZpbmUgT1VUUkVHMTYoYWRkcix2YWwpCXdyaXRldyh2YWwsIChyaW5mby0+bW1pb19iYXNlKSthZGRyKQorI2RlZmluZSBJTlJFRyhhZGRyKQkJcmVhZGwoKHJpbmZvLT5tbWlvX2Jhc2UpK2FkZHIpCisjZGVmaW5lIE9VVFJFRyhhZGRyLHZhbCkJd3JpdGVsKHZhbCwgKHJpbmZvLT5tbWlvX2Jhc2UpK2FkZHIpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfT1VUUkVHUChzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8sIHUzMiBhZGRyLAorCQkgICAgICAgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXRtcCA9IElOUkVHKGFkZHIpOworCXRtcCAmPSAobWFzayk7CisJdG1wIHw9ICh2YWwpOworCU9VVFJFRyhhZGRyLCB0bXApOworfQorCisjZGVmaW5lIE9VVFJFR1AoYWRkcix2YWwsbWFzaykJX09VVFJFR1AocmluZm8sIGFkZHIsIHZhbCxtYXNrKQorCisvKgorICogMkQgRW5naW5lIGhlbHBlciByb3V0aW5lcworICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmFkZW9uX2VuZ2luZV9mbHVzaCAoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvKQoreworCWludCBpOworCisJLyogaW5pdGlhdGUgZmx1c2ggKi8KKwlPVVRSRUdQKFJCMkRfRFNUQ0FDSEVfQ1RMU1RBVCwgUkIyRF9EQ19GTFVTSF9BTEwsCisJICAgICAgICB+UkIyRF9EQ19GTFVTSF9BTEwpOworCisJZm9yIChpPTA7IGkgPCAyMDAwMDAwOyBpKyspIHsKKwkJaWYgKCEoSU5SRUcoUkIyRF9EU1RDQUNIRV9DVExTVEFUKSAmIFJCMkRfRENfQlVTWSkpCisJCQlyZXR1cm47CisJCXVkZWxheSgxKTsKKwl9CisJcHJpbnRmKCJyYWRlb25mYjogRmx1c2ggVGltZW91dCAhXG4iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9yYWRlb25fZmlmb193YWl0KHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbywgaW50IGVudHJpZXMpCit7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaTwyMDAwMDAwOyBpKyspIHsKKwkJaWYgKChJTlJFRyhSQkJNX1NUQVRVUykgJiAweDdmKSA+PSBlbnRyaWVzKQorCQkJcmV0dXJuOworCQl1ZGVsYXkoMSk7CisJfQorCXByaW50ZigicmFkZW9uZmI6IEZJRk8gVGltZW91dCAhXG4iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9yYWRlb25fZW5naW5lX2lkbGUoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvKQoreworCWludCBpOworCisJLyogZW5zdXJlIEZJRk8gaXMgZW1wdHkgYmVmb3JlIHdhaXRpbmcgZm9yIGlkbGUgKi8KKwlfcmFkZW9uX2ZpZm9fd2FpdCAocmluZm8sIDY0KTsKKworCWZvciAoaT0wOyBpPDIwMDAwMDA7IGkrKykgeworCQlpZiAoKChJTlJFRyhSQkJNX1NUQVRVUykgJiBHVUlfQUNUSVZFKSkgPT0gMCkgeworCQkJcmFkZW9uX2VuZ2luZV9mbHVzaCAocmluZm8pOworCQkJcmV0dXJuOworCQl9CisJCXVkZWxheSgxKTsKKwl9CisJcHJpbnRmKCJyYWRlb25mYjogSWRsZSBUaW1lb3V0ICFcbiIpOworfQorCisjZGVmaW5lIHJhZGVvbl9lbmdpbmVfaWRsZSgpCQlfcmFkZW9uX2VuZ2luZV9pZGxlKHJpbmZvKQorI2RlZmluZSByYWRlb25fZmlmb193YWl0KGVudHJpZXMpCV9yYWRlb25fZmlmb193YWl0KHJpbmZvLGVudHJpZXMpCisjZGVmaW5lIHJhZGVvbl9tc2xlZXAobXMpCQlfcmFkZW9uX21zbGVlcChyaW5mbyxtcykKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSB2YXJpb3VzIHJlZ2lzdGVycyBtYW5pcHVsYXRlZCBieSB0aGlzCisgKiBkcml2ZXIgZm9yIHNldHRpbmcgb3IgcmVzdG9yaW5nIGEgbW9kZS4gSXQncyBtb3N0bHkgY29waWVkIGZyb20KKyAqIFhGcmVlJ3MgUkFERU9OU2F2ZVJlYyBzdHJ1Y3R1cmUuIEEgZmV3IGNoaXAgc2V0dGluZ3MgbWlnaHQgc3RpbGwgYmUKKyAqIHR3ZWFrZWQgd2l0aG91dCBiZWVpbmcgcmVmbGVjdGVkIG9yIHNhdmVkIGluIHRoZXNlIHJlZ2lzdGVycyB0aG91Z2gKKyAqLworc3RydWN0IHJhZGVvbl9yZWdzIHsKKwkvKiBDb21tb24gcmVnaXN0ZXJzICovCisJdTMyCQlvdnJfY2xyOworCXUzMgkJb3ZyX3dpZF9sZWZ0X3JpZ2h0OworCXUzMgkJb3ZyX3dpZF90b3BfYm90dG9tOworCXUzMgkJb3YwX3NjYWxlX2NudGw7CisJdTMyCQltcHBfdGJfY29uZmlnOworCXUzMgkJbXBwX2dwX2NvbmZpZzsKKwl1MzIJCXN1YnBpY19jbnRsOworCXUzMgkJdmlwaF9jb250cm9sOworCXUzMgkJaTJjX2NudGxfMTsKKwl1MzIJCWdlbl9pbnRfY250bDsKKwl1MzIJCWNhcDBfdHJpZ19jbnRsOworCXUzMgkJY2FwMV90cmlnX2NudGw7CisJdTMyCQlidXNfY250bDsKKwl1MzIJCXN1cmZhY2VfY250bDsKKwl1MzIJCWJpb3NfNV9zY3JhdGNoOworCisJLyogT3RoZXIgcmVnaXN0ZXJzIHRvIHNhdmUgZm9yIFZUIHN3aXRjaGVzIG9yIGRyaXZlciBsb2FkL3VubG9hZCAqLworCXUzMgkJZHBfZGF0YXR5cGU7CisJdTMyCQlyYmJtX3NvZnRfcmVzZXQ7CisJdTMyCQljbG9ja19jbnRsX2luZGV4OworCXUzMgkJYW1jZ3Bpb19lbl9yZWc7CisJdTMyCQlhbWNncGlvX21hc2s7CisKKwkvKiBTdXJmYWNlL3RpbGluZyByZWdpc3RlcnMgKi8KKwl1MzIJCXN1cmZfbG93ZXJfYm91bmRbOF07CisJdTMyCQlzdXJmX3VwcGVyX2JvdW5kWzhdOworCXUzMgkJc3VyZl9pbmZvWzhdOworCisJLyogQ1JUQyByZWdpc3RlcnMgKi8KKwl1MzIJCWNydGNfZ2VuX2NudGw7CisJdTMyCQljcnRjX2V4dF9jbnRsOworCXUzMgkJZGFjX2NudGw7CisJdTMyCQljcnRjX2hfdG90YWxfZGlzcDsKKwl1MzIJCWNydGNfaF9zeW5jX3N0cnRfd2lkOworCXUzMgkJY3J0Y192X3RvdGFsX2Rpc3A7CisJdTMyCQljcnRjX3Zfc3luY19zdHJ0X3dpZDsKKwl1MzIJCWNydGNfb2Zmc2V0OworCXUzMgkJY3J0Y19vZmZzZXRfY250bDsKKwl1MzIJCWNydGNfcGl0Y2g7CisJdTMyCQlkaXNwX21lcmdlX2NudGw7CisJdTMyCQlncnBoX2J1ZmZlcl9jbnRsOworCXUzMgkJY3J0Y19tb3JlX2NudGw7CisKKwkvKiBDUlRDMiByZWdpc3RlcnMgKi8KKwl1MzIJCWNydGMyX2dlbl9jbnRsOworCXUzMgkJZGFjMl9jbnRsOworCXUzMgkJZGlzcF9vdXRwdXRfY250bDsKKwl1MzIJCWRpc3BfaHdfZGVidWc7CisJdTMyCQlkaXNwMl9tZXJnZV9jbnRsOworCXUzMgkJZ3JwaDJfYnVmZmVyX2NudGw7CisJdTMyCQljcnRjMl9oX3RvdGFsX2Rpc3A7CisJdTMyCQljcnRjMl9oX3N5bmNfc3RydF93aWQ7CisJdTMyCQljcnRjMl92X3RvdGFsX2Rpc3A7CisJdTMyCQljcnRjMl92X3N5bmNfc3RydF93aWQ7CisJdTMyCQljcnRjMl9vZmZzZXQ7CisJdTMyCQljcnRjMl9vZmZzZXRfY250bDsKKwl1MzIJCWNydGMyX3BpdGNoOworCisJLyogRmxhdCBwYW5lbCByZWdzICovCisJdTMyIAkJZnBfY3J0Y19oX3RvdGFsX2Rpc3A7CisJdTMyCQlmcF9jcnRjX3ZfdG90YWxfZGlzcDsKKwl1MzIJCWZwX2dlbl9jbnRsOworCXUzMgkJZnAyX2dlbl9jbnRsOworCXUzMgkJZnBfaF9zeW5jX3N0cnRfd2lkOworCXUzMgkJZnAyX2hfc3luY19zdHJ0X3dpZDsKKwl1MzIJCWZwX2hvcnpfc3RyZXRjaDsKKwl1MzIJCWZwX3BhbmVsX2NudGw7CisJdTMyCQlmcF92X3N5bmNfc3RydF93aWQ7CisJdTMyCQlmcDJfdl9zeW5jX3N0cnRfd2lkOworCXUzMgkJZnBfdmVydF9zdHJldGNoOworCXUzMgkJbHZkc19nZW5fY250bDsKKwl1MzIJCWx2ZHNfcGxsX2NudGw7CisJdTMyCQl0bWRzX2NyYzsKKwl1MzIJCXRtZHNfdHJhbnNtaXR0ZXJfY250bDsKKworCS8qIENvbXB1dGVkIHZhbHVlcyBmb3IgUExMICovCisJdTMyCQlkb3RfY2xvY2tfZnJlcTsKKwlpbnQJCWZlZWRiYWNrX2RpdjsKKwlpbnQJCXBvc3RfZGl2OworCisJLyogUExMIHJlZ2lzdGVycyAqLworCXUzMgkJcHBsbF9kaXZfMzsKKwl1MzIJCXBwbGxfcmVmX2RpdjsKKwl1MzIJCXZjbGtfZWNwX2NudGw7CisJdTMyCQljbGtfY250bF9pbmRleDsKKworCS8qIENvbXB1dGVkIHZhbHVlcyBmb3IgUExMMiAqLworCXUzMgkJZG90X2Nsb2NrX2ZyZXFfMjsKKwlpbnQJCWZlZWRiYWNrX2Rpdl8yOworCWludAkJcG9zdF9kaXZfMjsKKworCS8qIFBMTDIgcmVnaXN0ZXJzICovCisJdTMyCQlwMnBsbF9yZWZfZGl2OworCXUzMgkJcDJwbGxfZGl2XzA7CisJdTMyCQlodG90YWxfY250bDI7CisKKwkvKiBQYWxldHRlICovCisJaW50CQlwYWxldHRlX3ZhbGlkOworfTsKKworc3RhdGljIGlubGluZSB1MzIgX19JTlBMTChzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8sIHUzMiBhZGRyKQoreworCXUzMiBkYXRhOworCisJT1VUUkVHOChDTE9DS19DTlRMX0lOREVYLCBhZGRyICYgMHgwMDAwMDAzZik7CisJLyogcmFkZW9uX3BsbF9lcnJhdGFfYWZ0ZXJfaW5kZXgocmluZm8pOyAqLworCWRhdGEgPSBJTlJFRyhDTE9DS19DTlRMX0RBVEEpOworCS8qIHJhZGVvbl9wbGxfZXJyYXRhX2FmdGVyX2RhdGEocmluZm8pOyAqLworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19PVVRQTEwoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvLCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJCQkgICAgdTMyIHZhbCkKK3sKKworCU9VVFJFRzgoQ0xPQ0tfQ05UTF9JTkRFWCwgKGluZGV4ICYgMHgwMDAwMDAzZikgfCAweDAwMDAwMDgwKTsKKwkvKiByYWRlb25fcGxsX2VycmF0YV9hZnRlcl9pbmRleChyaW5mbyk7ICovCisJT1VUUkVHKENMT0NLX0NOVExfREFUQSwgdmFsKTsKKwkvKiByYWRlb25fcGxsX2VycmF0YV9hZnRlcl9kYXRhKHJpbmZvKTsgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fT1VUUExMUChzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8sIHVuc2lnbmVkIGludCBpbmRleCwKKwkJCSAgICAgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXRtcCAgPSBfX0lOUExMKHJpbmZvLCBpbmRleCk7CisJdG1wICY9IChtYXNrKTsKKwl0bXAgfD0gKHZhbCk7CisJX19PVVRQTEwocmluZm8sIGluZGV4LCB0bXApOworfQorCisjZGVmaW5lIElOUExMKGFkZHIpCQkJX19JTlBMTChyaW5mbywgYWRkcikKKyNkZWZpbmUgT1VUUExMKGluZGV4LCB2YWwpCQlfX09VVFBMTChyaW5mbywgaW5kZXgsIHZhbCkKKyNkZWZpbmUgT1VUUExMUChpbmRleCwgdmFsLCBtYXNrKQlfX09VVFBMTFAocmluZm8sIGluZGV4LCB2YWwsIG1hc2spCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY201NzB4LmMgYi9kcml2ZXJzL2JjbTU3MHguYwppbmRleCA1ZjYzMmE2Li5jOGY0MDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbTU3MHguYworKysgYi9kcml2ZXJzL2JjbTU3MHguYwpAQCAtNiw4ICs2LDggQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiAoIWRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkpICYmIFwKLQlkZWZpbmVkKENPTkZJR19CQ001NzB4KQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpIFwKKwkmJiAoIWRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkpICYmIGRlZmluZWQoQ09ORklHX0JDTTU3MHgpCiAKICNpZmRlZiBDT05GSUdfQk1XCiAjaW5jbHVkZSA8bXBjODI0eC5oPgpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPHBjaS5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgogCi0KIC8qCiAgKiBQQ0kgUmVnaXN0ZXJzIGFuZCBkZWZpbml0aW9ucy4KICAqLwpAQCAtMzEsNyArMzAsNiBAQAogI2RlZmluZSBCQ001NzBYX01CQVIgCTB4ODAxMDAwMDAKICNkZWZpbmUgQkNNNTcwWF9JTElORSAgIDEKIAotCiAjZGVmaW5lIFNFQ09ORF9VU0VDCTEwMDAwMDAKICNkZWZpbmUgTUFYX1BBQ0tFVF9TSVpFIDE2MDAKICNkZWZpbmUgTUFYX1VOSVRTICAgICAgIDQKQEAgLTM5LDYyICszNyw2MSBAQAogLyogR2xvYmFscyB0byB0aGlzIG1vZHVsZSAqLwogaW50IGluaXRpYWxpemVkID0gMDsKIHVuc2lnbmVkIGludCBpb0Jhc2UgPSAwOwotdm9sYXRpbGUgUExNX0RFVklDRV9CTE9DSyAgICBwRGV2aWNlID0gTlVMTDsgICAgICAgIC8qIDU3MHggc29mdGMgKi8KLXZvbGF0aWxlIFBVTV9ERVZJQ0VfQkxPQ0sgICAgcFVtRGV2aWNlID0gTlVMTDsKK3ZvbGF0aWxlIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSA9IE5VTEw7CS8qIDU3MHggc29mdGMgKi8KK3ZvbGF0aWxlIFBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gTlVMTDsKIAogLyogVXNlZCB0byBwYXNzIHRoZSBmdWxsLWR1cGxleCBmbGFnLCBldGMuICovCi1pbnQgbGluZV9zcGVlZFtNQVhfVU5JVFNdID0gezAsMCwwLDB9Owotc3RhdGljIGludCBmdWxsX2R1cGxleFtNQVhfVU5JVFNdID0gezEsMSwxLDF9Owotc3RhdGljIGludCByeF9mbG93X2NvbnRyb2xbTUFYX1VOSVRTXSA9IHswLDAsMCwwfTsKLXN0YXRpYyBpbnQgdHhfZmxvd19jb250cm9sW01BWF9VTklUU10gPSB7MCwwLDAsMH07Ci1zdGF0aWMgaW50IGF1dG9fZmxvd19jb250cm9sW01BWF9VTklUU10gPSB7MCwwLDAsMH07Ci1zdGF0aWMgaW50IHR4X2NoZWNrc3VtW01BWF9VTklUU10gPSB7MSwxLDEsMX07Ci1zdGF0aWMgaW50IHJ4X2NoZWNrc3VtW01BWF9VTklUU10gPSB7MSwxLDEsMX07Ci1zdGF0aWMgaW50IGF1dG9fc3BlZWRbTUFYX1VOSVRTXSA9IHsxLDEsMSwxfTsKK2ludCBsaW5lX3NwZWVkW01BWF9VTklUU10gPSB7IDAsIDAsIDAsIDAgfTsKK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXhbTUFYX1VOSVRTXSA9IHsgMSwgMSwgMSwgMSB9Oworc3RhdGljIGludCByeF9mbG93X2NvbnRyb2xbTUFYX1VOSVRTXSA9IHsgMCwgMCwgMCwgMCB9Oworc3RhdGljIGludCB0eF9mbG93X2NvbnRyb2xbTUFYX1VOSVRTXSA9IHsgMCwgMCwgMCwgMCB9Oworc3RhdGljIGludCBhdXRvX2Zsb3dfY29udHJvbFtNQVhfVU5JVFNdID0geyAwLCAwLCAwLCAwIH07CitzdGF0aWMgaW50IHR4X2NoZWNrc3VtW01BWF9VTklUU10gPSB7IDEsIDEsIDEsIDEgfTsKK3N0YXRpYyBpbnQgcnhfY2hlY2tzdW1bTUFYX1VOSVRTXSA9IHsgMSwgMSwgMSwgMSB9Oworc3RhdGljIGludCBhdXRvX3NwZWVkW01BWF9VTklUU10gPSB7IDEsIDEsIDEsIDEgfTsKIAogI2lmIEpVTUJPX0ZSQU1FUwogLyogSnVtYm8gTVRVIGZvciBpbnRlcmZhY2VzLiAqLwotc3RhdGljIGludCBtdHVbTUFYX1VOSVRTXSA9IHswLDAsMCwwfTsKK3N0YXRpYyBpbnQgbXR1W01BWF9VTklUU10gPSB7IDAsIDAsIDAsIDAgfTsKICNlbmRpZgogCiAvKiBUdXJuIG9uIFdha2Utb24gbGFuIGZvciBhIGRldmljZSB1bml0ICovCi1zdGF0aWMgaW50IGVuYWJsZV93b2xbTUFYX1VOSVRTXSA9IHswLDAsMCwwfTsKK3N0YXRpYyBpbnQgZW5hYmxlX3dvbFtNQVhfVU5JVFNdID0geyAwLCAwLCAwLCAwIH07CiAKICNkZWZpbmUgVFhfREVTQ19DTlQgREVGQVVMVF9UWF9QQUNLRVRfREVTQ19DT1VOVAogc3RhdGljIHVuc2lnbmVkIGludCB0eF9wa3RfZGVzY19jbnRbTUFYX1VOSVRTXSA9Ci0Je1RYX0RFU0NfQ05ULFRYX0RFU0NfQ05ULFRYX0RFU0NfQ05ULCBUWF9ERVNDX0NOVH07CisgICAgeyBUWF9ERVNDX0NOVCwgVFhfREVTQ19DTlQsIFRYX0RFU0NfQ05ULCBUWF9ERVNDX0NOVCB9OwogCiAjZGVmaW5lIFJYX0RFU0NfQ05UIERFRkFVTFRfU1REX1JDVl9ERVNDX0NPVU5UCiBzdGF0aWMgdW5zaWduZWQgaW50IHJ4X3N0ZF9kZXNjX2NudFtNQVhfVU5JVFNdID0KLQl7UlhfREVTQ19DTlQsUlhfREVTQ19DTlQsUlhfREVTQ19DTlQsUlhfREVTQ19DTlR9OworICAgIHsgUlhfREVTQ19DTlQsIFJYX0RFU0NfQ05ULCBSWF9ERVNDX0NOVCwgUlhfREVTQ19DTlQgfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCByeF9hZGFwdGl2ZV9jb2FsZXNjZVtNQVhfVU5JVFNdID0gezEsMSwxLDF9Oworc3RhdGljIHVuc2lnbmVkIGludCByeF9hZGFwdGl2ZV9jb2FsZXNjZVtNQVhfVU5JVFNdID0geyAxLCAxLCAxLCAxIH07CiAKICNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCiAjZGVmaW5lIEpCT19ERVNDX0NOVCBERUZBVUxUX0pVTUJPX1JDVl9ERVNDX0NPVU5UCiBzdGF0aWMgdW5zaWduZWQgaW50IHJ4X2p1bWJvX2Rlc2NfY250W01BWF9VTklUU10gPQotCXtKQk9fREVTQ19DTlQsIEpCT19ERVNDX0NOVCwgSkJPX0RFU0NfQ05ULCBKQk9fREVTQ19DTlR9OworICAgIHsgSkJPX0RFU0NfQ05ULCBKQk9fREVTQ19DTlQsIEpCT19ERVNDX0NOVCwgSkJPX0RFU0NfQ05UIH07CiAjZW5kaWYKICNkZWZpbmUgUlhfQ09BTF9USyBERUZBVUxUX1JYX0NPQUxFU0NJTkdfVElDS1MKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcnhfY29hbGVzY2VfdGlja3NbTUFYX1VOSVRTXSA9Ci0Je1JYX0NPQUxfVEssIFJYX0NPQUxfVEssIFJYX0NPQUxfVEssIFJYX0NPQUxfVEt9OworICAgIHsgUlhfQ09BTF9USywgUlhfQ09BTF9USywgUlhfQ09BTF9USywgUlhfQ09BTF9USyB9OwogCiAjZGVmaW5lIFJYX0NPQUxfRk0gREVGQVVMVF9SWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUwogc3RhdGljIHVuc2lnbmVkIGludCByeF9tYXhfY29hbGVzY2VfZnJhbWVzW01BWF9VTklUU10gPQotCXtSWF9DT0FMX0ZNLCBSWF9DT0FMX0ZNLCBSWF9DT0FMX0ZNLCBSWF9DT0FMX0ZNfTsKKyAgICB7IFJYX0NPQUxfRk0sIFJYX0NPQUxfRk0sIFJYX0NPQUxfRk0sIFJYX0NPQUxfRk0gfTsKIAogI2RlZmluZSBUWF9DT0FMX1RLIERFRkFVTFRfVFhfQ09BTEVTQ0lOR19USUNLUwogc3RhdGljIHVuc2lnbmVkIGludCB0eF9jb2FsZXNjZV90aWNrc1tNQVhfVU5JVFNdID0KLQl7VFhfQ09BTF9USywgVFhfQ09BTF9USywgVFhfQ09BTF9USywgVFhfQ09BTF9US307CisgICAgeyBUWF9DT0FMX1RLLCBUWF9DT0FMX1RLLCBUWF9DT0FMX1RLLCBUWF9DT0FMX1RLIH07CiAKICNkZWZpbmUgVFhfQ09BTF9GTSBERUZBVUxUX1RYX01BWF9DT0FMRVNDRURfRlJBTUVTCiBzdGF0aWMgdW5zaWduZWQgaW50IHR4X21heF9jb2FsZXNjZV9mcmFtZXNbTUFYX1VOSVRTXSA9Ci0Je1RYX0NPQUxfRk0sIFRYX0NPQUxfRk0sIFRYX0NPQUxfRk0sIFRYX0NPQUxfRk19OworICAgIHsgVFhfQ09BTF9GTSwgVFhfQ09BTF9GTSwgVFhfQ09BTF9GTSwgVFhfQ09BTF9GTSB9OwogCiAjZGVmaW5lIFNUX0NPQUxfVEsgREVGQVVMVF9TVEFUU19DT0FMRVNDSU5HX1RJQ0tTCiBzdGF0aWMgdW5zaWduZWQgaW50IHN0YXRzX2NvYWxlc2NlX3RpY2tzW01BWF9VTklUU10gPQotCXtTVF9DT0FMX1RLLCBTVF9DT0FMX1RLLCBTVF9DT0FMX1RLLCBTVF9DT0FMX1RLfTsKLQorICAgIHsgU1RfQ09BTF9USywgU1RfQ09BTF9USywgU1RfQ09BTF9USywgU1RfQ09BTF9USyB9OwogCiAvKgogICogTGVnaXRpbWF0ZSB2YWx1ZXMgZm9yIEJDTTU3MHggZGV2aWNlIHR5cGVzCkBAIC0xMzQsNzA3ICsxMzEsNzAxIEBACiAKIC8qIENoaXAtUmV2IG5hbWVzIGZvciBlYWNoIGRldmljZS10eXBlICovCiBzdGF0aWMgc3RydWN0IHsKLSAgICBjaGFyKiBuYW1lOworCWNoYXIgKm5hbWU7CiB9IGNoaXBfcmV2W10gPSB7Ci0gICAgICAgeyJCQ001NzAwVklHSUwifSwKLSAgICAgICB7IkJDTTU3MDBBNiJ9LAotICAgICAgIHsiQkNNNTcwMFQ2In0sCi0gICAgICAgeyJCQ001NzAwQTkifSwKLSAgICAgICB7IkJDTTU3MDBUOSJ9LAotICAgICAgIHsiQkNNNTcwMCJ9LAotICAgICAgIHsiQkNNNTcwMUE1In0sCi0gICAgICAgeyJCQ001NzAxVDEifSwKLSAgICAgICB7IkJDTTU3MDFUOCJ9LAotICAgICAgIHsiQkNNNTcwMUE3In0sCi0gICAgICAgeyJCQ001NzAxQTEwIn0sCi0gICAgICAgeyJCQ001NzAxQTEyIn0sCi0gICAgICAgeyJCQ001NzAxIn0sCi0gICAgICAgeyJCQ001NzAyIn0sCi0gICAgICAgeyJCQ001NzAzIn0sCi0gICAgICAgeyJCQ001NzAzQTMxIn0sCi0gICAgICAgeyJUQzk5NlQifSwKLSAgICAgICB7IlRDOTk2U1QifSwKLSAgICAgICB7IlRDOTk2U1NYIn0sCi0gICAgICAgeyJUQzk5NlNYIn0sCi0gICAgICAgeyJUQzk5NkJUIn0sCi0gICAgICAgeyJUQzk5N1QifSwKLSAgICAgICB7IlRDOTk3U1gifSwKLSAgICAgICB7IlRDMTAwMFQifSwKLSAgICAgICB7IlRDOTQwQlIwMSJ9LAotICAgICAgIHsiVEM5NDJCUjAxIn0sCi0gICAgICAgeyJOQzY3NzAifSwKLSAgICAgICB7Ik5DNzc2MCJ9LAotICAgICAgIHsiTkM3NzcwIn0sCi0gICAgICAgeyJOQzc3ODAifSwKLSAgICAgICB7MH0KKwl7CisJIkJDTTU3MDBWSUdJTCJ9LCB7CisJIkJDTTU3MDBBNiJ9LCB7CisJIkJDTTU3MDBUNiJ9LCB7CisJIkJDTTU3MDBBOSJ9LCB7CisJIkJDTTU3MDBUOSJ9LCB7CisJIkJDTTU3MDAifSwgeworCSJCQ001NzAxQTUifSwgeworCSJCQ001NzAxVDEifSwgeworCSJCQ001NzAxVDgifSwgeworCSJCQ001NzAxQTcifSwgeworCSJCQ001NzAxQTEwIn0sIHsKKwkiQkNNNTcwMUExMiJ9LCB7CisJIkJDTTU3MDEifSwgeworCSJCQ001NzAyIn0sIHsKKwkiQkNNNTcwMyJ9LCB7CisJIkJDTTU3MDNBMzEifSwgeworCSJUQzk5NlQifSwgeworCSJUQzk5NlNUIn0sIHsKKwkiVEM5OTZTU1gifSwgeworCSJUQzk5NlNYIn0sIHsKKwkiVEM5OTZCVCJ9LCB7CisJIlRDOTk3VCJ9LCB7CisJIlRDOTk3U1gifSwgeworCSJUQzEwMDBUIn0sIHsKKwkiVEM5NDBCUjAxIn0sIHsKKwkiVEM5NDJCUjAxIn0sIHsKKwkiTkM2NzcwIn0sIHsKKwkiTkM3NzYwIn0sIHsKKwkiTkM3NzcwIn0sIHsKKwkiTkM3NzgwIn0sIHsKKwkwfQogfTsKIAotCiAvKiBpbmRleGVkIGJ5IGJvYXJkX3QsIGFib3ZlICovCiBzdGF0aWMgc3RydWN0IHsKLSAgICBjaGFyICpuYW1lOworCWNoYXIgKm5hbWU7CiB9IGJvYXJkX2luZm9bXSA9IHsKLQl7ICJCcm9hZGNvbSBWaWdpbCBCNTcwMCAxMDAwQmFzZS1UIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MDAgMTAwMEJhc2UtVCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzAwIDEwMDBCYXNlLVNYIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MDAgMTAwMEJhc2UtU1giIH0sCi0JeyAiQnJvYWRjb20gQkNNNTcwMCAxMDAwQmFzZS1UIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MDAiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTcwMSAxMDAwQmFzZS1UIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MDEgMTAwMEJhc2UtVCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzAxIDEwMDBCYXNlLVQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTcwMSAxMDAwQmFzZS1TWCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzAxIDEwMDBCYXNlLVQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTcwMSAxMDAwQmFzZS1UIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MDEiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTcwMiAxMDAwQmFzZS1UIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MDMgMTAwMEJhc2UtVCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzAzIDEwMDBCYXNlLVNYIiB9LAotCXsgIjNDb20gM0M5OTYgMTAvMTAwLzEwMDAgU2VydmVyIE5JQyIgfSwKLQl7ICIzQ29tIDNDOTk2IDEwLzEwMC8xMDAwIFNlcnZlciBOSUMiIH0sCi0JeyAiM0NvbSAzQzk5NiBHaWdhYml0IEZpYmVyLVNYIFNlcnZlciBOSUMiIH0sCi0JeyAiM0NvbSAzQzk5NiBHaWdhYml0IEZpYmVyLVNYIFNlcnZlciBOSUMiIH0sCi0JeyAiM0NvbSAzQzk5NkIgR2lnYWJpdCBTZXJ2ZXIgTklDIiB9LAotCXsgIjNDb20gM0M5OTcgR2lnYWJpdCBTZXJ2ZXIgTklDIiB9LAotCXsgIjNDb20gM0M5OTcgR2lnYWJpdCBGaWJlci1TWCBTZXJ2ZXIgTklDIiB9LAotCXsgIjNDb20gM0MxMDAwIEdpZ2FiaXQgTklDIiB9LAotCXsgIjNDb20gM0M5NDAgR2lnYWJpdCBMT00gKDIxWDIxKSIgfSwKLQl7ICIzQ29tIDNDOTQyIEdpZ2FiaXQgTE9NICgzMVgzMSkiIH0sCi0JeyAiQ29tcGFxIE5DNjc3MCBHaWdhYml0IFNlcnZlciBBZGFwdGVyIiB9LAotCXsgIkNvbXBhcSBOQzc3NjAgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlciIgfSwKLQl7ICJDb21wYXEgTkM3NzcwIEdpZ2FiaXQgU2VydmVyIEFkYXB0ZXIiIH0sCi0JeyAiQ29tcGFxIE5DNzc4MCBHaWdhYml0IFNlcnZlciBBZGFwdGVyIiB9LAotCXsgMCB9LAotfTsKKwl7CisJIkJyb2FkY29tIFZpZ2lsIEI1NzAwIDEwMDBCYXNlLVQifSwgeworCSJCcm9hZGNvbSBCQ001NzAwIDEwMDBCYXNlLVQifSwgeworCSJCcm9hZGNvbSBCQ001NzAwIDEwMDBCYXNlLVNYIn0sIHsKKwkiQnJvYWRjb20gQkNNNTcwMCAxMDAwQmFzZS1TWCJ9LCB7CisJIkJyb2FkY29tIEJDTTU3MDAgMTAwMEJhc2UtVCJ9LCB7CisJIkJyb2FkY29tIEJDTTU3MDAifSwgeworCSJCcm9hZGNvbSBCQ001NzAxIDEwMDBCYXNlLVQifSwgeworCSJCcm9hZGNvbSBCQ001NzAxIDEwMDBCYXNlLVQifSwgeworCSJCcm9hZGNvbSBCQ001NzAxIDEwMDBCYXNlLVQifSwgeworCSJCcm9hZGNvbSBCQ001NzAxIDEwMDBCYXNlLVNYIn0sIHsKKwkiQnJvYWRjb20gQkNNNTcwMSAxMDAwQmFzZS1UIn0sIHsKKwkiQnJvYWRjb20gQkNNNTcwMSAxMDAwQmFzZS1UIn0sIHsKKwkiQnJvYWRjb20gQkNNNTcwMSJ9LCB7CisJIkJyb2FkY29tIEJDTTU3MDIgMTAwMEJhc2UtVCJ9LCB7CisJIkJyb2FkY29tIEJDTTU3MDMgMTAwMEJhc2UtVCJ9LCB7CisJIkJyb2FkY29tIEJDTTU3MDMgMTAwMEJhc2UtU1gifSwgeworCSIzQ29tIDNDOTk2IDEwLzEwMC8xMDAwIFNlcnZlciBOSUMifSwgeworCSIzQ29tIDNDOTk2IDEwLzEwMC8xMDAwIFNlcnZlciBOSUMifSwgeworCSIzQ29tIDNDOTk2IEdpZ2FiaXQgRmliZXItU1ggU2VydmVyIE5JQyJ9LCB7CisJIjNDb20gM0M5OTYgR2lnYWJpdCBGaWJlci1TWCBTZXJ2ZXIgTklDIn0sIHsKKwkiM0NvbSAzQzk5NkIgR2lnYWJpdCBTZXJ2ZXIgTklDIn0sIHsKKwkiM0NvbSAzQzk5NyBHaWdhYml0IFNlcnZlciBOSUMifSwgeworCSIzQ29tIDNDOTk3IEdpZ2FiaXQgRmliZXItU1ggU2VydmVyIE5JQyJ9LCB7CisJIjNDb20gM0MxMDAwIEdpZ2FiaXQgTklDIn0sIHsKKwkiM0NvbSAzQzk0MCBHaWdhYml0IExPTSAoMjFYMjEpIn0sIHsKKwkiM0NvbSAzQzk0MiBHaWdhYml0IExPTSAoMzFYMzEpIn0sIHsKKwkiQ29tcGFxIE5DNjc3MCBHaWdhYml0IFNlcnZlciBBZGFwdGVyIn0sIHsKKwkiQ29tcGFxIE5DNzc2MCBHaWdhYml0IFNlcnZlciBBZGFwdGVyIn0sIHsKKwkiQ29tcGFxIE5DNzc3MCBHaWdhYml0IFNlcnZlciBBZGFwdGVyIn0sIHsKKwkiQ29tcGFxIE5DNzc4MCBHaWdhYml0IFNlcnZlciBBZGFwdGVyIn0sIHsKKzB9LH07CiAKIC8qIFBDSSBEZXZpY2VzIHdoaWNoIHVzZSB0aGUgNTcweCBjaGlwc2V0ICovCiBzdHJ1Y3QgcGNpX2RldmljZV90YWJsZSB7Ci0gICAgdW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLCBkZXZpY2VfaWQ7IC8qIFZlbmRvci9EZXZpY2VJRCAqLwotICAgIHVuc2lnbmVkIHNob3J0IHN1YnZlbmRvciwgc3ViZGV2aWNlOyAvKiBTdWJzeXN0ZW0gSUQncyBvciBQQ0lfQU5ZX0lEICovCi0gICAgdW5zaWduZWQgaW50IGNsYXNzLCBjbGFzc19tYXNrOyAvKiAoY2xhc3Msc3ViY2xhc3MscHJvZy1pZikgdHJpcGxldCAqLwotICAgIHVuc2lnbmVkIGxvbmcgYm9hcmRfaWQ7CSAgICAvKiBEYXRhIHByaXZhdGUgdG8gdGhlIGRyaXZlciAqLwotICAgIGludCBpb19zaXplLCBtaW5fbGF0ZW5jeTsKKwl1bnNpZ25lZCBzaG9ydCB2ZW5kb3JfaWQsIGRldmljZV9pZDsJLyogVmVuZG9yL0RldmljZUlEICovCisJdW5zaWduZWQgc2hvcnQgc3VidmVuZG9yLCBzdWJkZXZpY2U7CS8qIFN1YnN5c3RlbSBJRCdzIG9yIFBDSV9BTllfSUQgKi8KKwl1bnNpZ25lZCBpbnQgY2xhc3MsIGNsYXNzX21hc2s7CS8qIChjbGFzcyxzdWJjbGFzcyxwcm9nLWlmKSB0cmlwbGV0ICovCisJdW5zaWduZWQgbG9uZyBib2FyZF9pZDsJLyogRGF0YSBwcml2YXRlIHRvIHRoZSBkcml2ZXIgKi8KKwlpbnQgaW9fc2l6ZSwgbWluX2xhdGVuY3k7CiB9IGJjbTU3MHhEZXZpY2VzW10gPSB7Ci0JezB4MTRlNCwgMHgxNjQ0LCAweDEwMTQsIDB4MDI3NywgMCwgMCwgQkNNNTcwMFZJR0lMICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NCwgMHgxNGU0LCAweDE2NDQsIDAsIDAsIEJDTTU3MDBBNiAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDQsIDB4MTRlNCwgMHgyLCAwLCAwLCBCQ001NzAwVDYgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ0LCAweDE0ZTQsIDB4MywgMCwgMCwgQkNNNTcwMEE5ICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NCwgMHgxNGU0LCAweDQsIDAsIDAsIEJDTTU3MDBUOSAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDQsIDB4MTAyOCwgMHhkMSwgMCwgMCwgQkNNNTcwMCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDQsIDB4MTAyOCwgMHgwMTA2LCAwLCAwLCBCQ001NzAwICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NCwgMHgxMDI4LCAweDAxMDksIDAsIDAsIEJDTTU3MDAgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ0LCAweDEwMjgsIDB4MDEwYSwgMCwgMCwgQkNNNTcwMCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDQsIDB4MTBiNywgMHgxMDAwLCAwLCAwLCBUQzk5NlQgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ0LCAweDEwYjcsIDB4MTAwMSwgMCwgMCwgVEM5OTZTVCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDQsIDB4MTBiNywgMHgxMDAyLCAwLCAwLCBUQzk5NlNTWCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDQsIDB4MTBiNywgMHgxMDAzLCAwLCAwLCBUQzk5N1QgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ0LCAweDEwYjcsIDB4MTAwNSwgMCwgMCwgVEM5OTdTWCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDQsIDB4MTBiNywgMHgxMDA4LCAwLCAwLCBUQzk0MkJSMDEgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCQ001NzAwICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NSwgMHgxNGU0LCAxLCAwLCAwLCBCQ001NzAxQTUgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ1LCAweDE0ZTQsIDUsIDAsIDAsIEJDTTU3MDFUMSAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDUsIDB4MTRlNCwgNiwgMCwgMCwgQkNNNTcwMVQ4ICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NSwgMHgxNGU0LCA3LCAwLCAwLCBCQ001NzAxQTcgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ1LCAweDE0ZTQsIDgsIDAsIDAsIEJDTTU3MDFBMTAgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ1LCAweDE0ZTQsIDB4ODAwOCwgMCwgMCwgQkNNNTcwMUExMiAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDUsIDB4MGUxMSwgMHhjMSwgMCwgMCwgTkM2NzcwICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NSwgMHgwZTExLCAweDdjLCAwLCAwLCBOQzc3NzAgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ1LCAweDBlMTEsIDB4ODUsIDAsIDAsIE5DNzc4MCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDUsIDB4MTAyOCwgMHgwMTIxLCAwLCAwLCBCQ001NzAxICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NSwgMHgxMGI3LCAweDEwMDQsIDAsIDAsIFRDOTk2U1ggLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ1LCAweDEwYjcsIDB4MTAwNiwgMCwgMCwgVEM5OTZCVCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDUsIDB4MTBiNywgMHgxMDA3LCAwLCAwLCBUQzEwMDBUICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NSwgMHgxMGI3LCAweDEwMDgsIDAsIDAsIFRDOTQwQlIwMSAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEJDTTU3MDEgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ2LCAweDE0ZTQsIDB4ODAwOSwgMCwgMCwgQkNNNTcwMiAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDYsIDB4MGUxMSwgMHhiYiwgMCwgMCwgTkM3NzYwICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQkNNNTcwMiAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2YTYsIDB4MTRlNCwgMHg4MDA5LCAwLCAwLCBCQ001NzAyICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTZhNiwgMHgwZTExLCAweGJiLCAwLCAwLCBOQzc3NjAgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNmE2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCQ001NzAyICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NywgMHgxNGU0LCAweDAwMDksIDAsIDAsIEJDTTU3MDMgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ3LCAweDE0ZTQsIDB4MDAwYSwgMCwgMCwgQkNNNTcwM0EzMSAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDcsIDB4MTRlNCwgMHgwMDBiLCAwLCAwLCBCQ001NzAzICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NywgMHgxNGU0LCAweDgwMGEsIDAsIDAsIEJDTTU3MDMgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNjQ3LCAweDBlMTEsIDB4OWEsIDAsIDAsIE5DNzc3MCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2NDcsIDB4MGUxMSwgMHg5OSwgMCwgMCwgTkM3NzgwICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTY0NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQkNNNTcwMyAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2YTcsIDB4MTRlNCwgMHgwMDA5LCAwLCAwLCBCQ001NzAzICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTZhNywgMHgxNGU0LCAweDAwMGEsIDAsIDAsIEJDTTU3MDNBMzEgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNmE3LCAweDE0ZTQsIDB4MDAwYiwgMCwgMCwgQkNNNTcwMyAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2YTcsIDB4MTRlNCwgMHg4MDBhLCAwLCAwLCBCQ001NzAzICwxMjgsMzJ9LAotCXsweDE0ZTQsIDB4MTZhNywgMHgwZTExLCAweDlhLCAwLCAwLCBOQzc3NzAgLDEyOCwzMn0sCi0JezB4MTRlNCwgMHgxNmE3LCAweDBlMTEsIDB4OTksIDAsIDAsIE5DNzc4MCAsMTI4LDMyfSwKLQl7MHgxNGU0LCAweDE2YTcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEJDTTU3MDMgLDEyOCwzMn0KKwl7CisJMHgxNGU0LCAweDE2NDQsIDB4MTAxNCwgMHgwMjc3LCAwLCAwLCBCQ001NzAwVklHSUwsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDQsIDB4MTRlNCwgMHgxNjQ0LCAwLCAwLCBCQ001NzAwQTYsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDQsIDB4MTRlNCwgMHgyLCAwLCAwLCBCQ001NzAwVDYsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDQsIDB4MTRlNCwgMHgzLCAwLCAwLCBCQ001NzAwQTksIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDQsIDB4MTRlNCwgMHg0LCAwLCAwLCBCQ001NzAwVDksIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDQsIDB4MTAyOCwgMHhkMSwgMCwgMCwgQkNNNTcwMCwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NCwgMHgxMDI4LCAweDAxMDYsIDAsIDAsIEJDTTU3MDAsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDQsIDB4MTAyOCwgMHgwMTA5LCAwLCAwLCBCQ001NzAwLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ0LCAweDEwMjgsIDB4MDEwYSwgMCwgMCwgQkNNNTcwMCwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NCwgMHgxMGI3LCAweDEwMDAsIDAsIDAsIFRDOTk2VCwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NCwgMHgxMGI3LCAweDEwMDEsIDAsIDAsIFRDOTk2U1QsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDQsIDB4MTBiNywgMHgxMDAyLCAwLCAwLCBUQzk5NlNTWCwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NCwgMHgxMGI3LCAweDEwMDMsIDAsIDAsIFRDOTk3VCwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NCwgMHgxMGI3LCAweDEwMDUsIDAsIDAsIFRDOTk3U1gsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDQsIDB4MTBiNywgMHgxMDA4LCAwLCAwLCBUQzk0MkJSMDEsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEJDTTU3MDAsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDUsIDB4MTRlNCwgMSwgMCwgMCwgQkNNNTcwMUE1LCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ1LCAweDE0ZTQsIDUsIDAsIDAsIEJDTTU3MDFUMSwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NSwgMHgxNGU0LCA2LCAwLCAwLCBCQ001NzAxVDgsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDUsIDB4MTRlNCwgNywgMCwgMCwgQkNNNTcwMUE3LCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ1LCAweDE0ZTQsIDgsIDAsIDAsIEJDTTU3MDFBMTAsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDUsIDB4MTRlNCwgMHg4MDA4LCAwLCAwLCBCQ001NzAxQTEyLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ1LCAweDBlMTEsIDB4YzEsIDAsIDAsIE5DNjc3MCwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NSwgMHgwZTExLCAweDdjLCAwLCAwLCBOQzc3NzAsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDUsIDB4MGUxMSwgMHg4NSwgMCwgMCwgTkM3NzgwLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ1LCAweDEwMjgsIDB4MDEyMSwgMCwgMCwgQkNNNTcwMSwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NSwgMHgxMGI3LCAweDEwMDQsIDAsIDAsIFRDOTk2U1gsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDUsIDB4MTBiNywgMHgxMDA2LCAwLCAwLCBUQzk5NkJULCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ1LCAweDEwYjcsIDB4MTAwNywgMCwgMCwgVEMxMDAwVCwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NSwgMHgxMGI3LCAweDEwMDgsIDAsIDAsIFRDOTQwQlIwMSwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQkNNNTcwMSwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NiwgMHgxNGU0LCAweDgwMDksIDAsIDAsIEJDTTU3MDIsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDYsIDB4MGUxMSwgMHhiYiwgMCwgMCwgTkM3NzYwLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCQ001NzAyLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNmE2LCAweDE0ZTQsIDB4ODAwOSwgMCwgMCwgQkNNNTcwMiwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTZhNiwgMHgwZTExLCAweGJiLCAwLCAwLCBOQzc3NjAsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2YTYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEJDTTU3MDIsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDcsIDB4MTRlNCwgMHgwMDA5LCAwLCAwLCBCQ001NzAzLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ3LCAweDE0ZTQsIDB4MDAwYSwgMCwgMCwgQkNNNTcwM0EzMSwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NywgMHgxNGU0LCAweDAwMGIsIDAsIDAsIEJDTTU3MDMsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDcsIDB4MTRlNCwgMHg4MDBhLCAwLCAwLCBCQ001NzAzLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNjQ3LCAweDBlMTEsIDB4OWEsIDAsIDAsIE5DNzc3MCwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTY0NywgMHgwZTExLCAweDk5LCAwLCAwLCBOQzc3ODAsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2NDcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEJDTTU3MDMsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2YTcsIDB4MTRlNCwgMHgwMDA5LCAwLCAwLCBCQ001NzAzLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNmE3LCAweDE0ZTQsIDB4MDAwYSwgMCwgMCwgQkNNNTcwM0EzMSwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTZhNywgMHgxNGU0LCAweDAwMGIsIDAsIDAsIEJDTTU3MDMsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2YTcsIDB4MTRlNCwgMHg4MDBhLCAwLCAwLCBCQ001NzAzLCAxMjgsIDMyfSwgeworCTB4MTRlNCwgMHgxNmE3LCAweDBlMTEsIDB4OWEsIDAsIDAsIE5DNzc3MCwgMTI4LCAzMn0sIHsKKwkweDE0ZTQsIDB4MTZhNywgMHgwZTExLCAweDk5LCAwLCAwLCBOQzc3ODAsIDEyOCwgMzJ9LCB7CisJMHgxNGU0LCAweDE2YTcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEJDTTU3MDMsIDEyOCwgMzJ9CiB9OwogCiAjZGVmaW5lIG41NzB4RGV2aWNlcyAgIChzaXplb2YoYmNtNTcweERldmljZXMpL3NpemVvZihiY201NzB4RGV2aWNlc1swXSkpCiAKLQogLyoKICAqIEFsbG9jYXRlIGEgcGFja2V0IGJ1ZmZlciBmcm9tIHRoZSBiY201NzB4IHBhY2tldCBwb29sLgogICovCi12b2lkICoKLWJjbTU3MHhQa3RBbGxvYyhpbnQgdSwgaW50IHBrc2l6ZSkKK3ZvaWQgKmJjbTU3MHhQa3RBbGxvYyAoaW50IHUsIGludCBwa3NpemUpCiB7Ci0gICAgcmV0dXJuIG1hbGxvYyhwa3NpemUpOworCXJldHVybiBtYWxsb2MgKHBrc2l6ZSk7CiB9CiAKIC8qCiAgKiBGcmVlIGEgcGFja2V0IHByZXZpb3VzbHkgYWxsb2NhdGVkIGZyb20gdGhlIGJjbTU3MHggcGFja2V0CiAgKiBidWZmZXIgcG9vbC4KICAqLwotdm9pZAotYmNtNTcweFBrdEZyZWUoaW50IHUsIHZvaWQgKnApCit2b2lkIGJjbTU3MHhQa3RGcmVlIChpbnQgdSwgdm9pZCAqcCkKIHsKLSAgICBmcmVlKHApOworCWZyZWUgKHApOwogfQogCi1pbnQKLWJjbTU3MHhSZXBsZW5pc2hSeEJ1ZmZlcnMoUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UpCitpbnQgYmNtNTcweFJlcGxlbmlzaFJ4QnVmZmVycyAoUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UpCiB7Ci0gICAgUExNX1BBQ0tFVCBwUGFja2V0OwotICAgIFBVTV9QQUNLRVQgcFVtUGFja2V0OwotICAgIHZvaWQgKnNrYjsKLSAgICBpbnQgcXVldWVfcnggPSAwOwotICAgIGludCByZXQgPSAwOworCVBMTV9QQUNLRVQgcFBhY2tldDsKKwlQVU1fUEFDS0VUIHBVbVBhY2tldDsKKwl2b2lkICpza2I7CisJaW50IHF1ZXVlX3J4ID0gMDsKKwlpbnQgcmV0ID0gMDsKIAotICAgIHdoaWxlICgocFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpCi0JICAgIFFRX1BvcEhlYWQoJnBVbURldmljZS0+cnhfb3V0X29mX2J1Zl9xLkNvbnRhaW5lcikpICE9IDApIHsKKwl3aGlsZSAoKHBVbVBhY2tldCA9IChQVU1fUEFDS0VUKQorCQlRUV9Qb3BIZWFkICgmcFVtRGV2aWNlLT5yeF9vdXRfb2ZfYnVmX3EuQ29udGFpbmVyKSkgIT0gMCkgewogCi0JcFBhY2tldCA9IChQTE1fUEFDS0VUKSBwVW1QYWNrZXQ7CisJCXBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgcFVtUGFja2V0OwogCi0JLyogcmV1c2UgYW4gb2xkIHNrYiAqLwotCWlmIChwVW1QYWNrZXQtPnNrYnVmZikgewotCSAgICBRUV9QdXNoVGFpbCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOwotCSAgICBxdWV1ZV9yeCA9IDE7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlpZiAoICggc2tiID0gYmNtNTcweFBrdEFsbG9jKHBVbURldmljZS0+aW5kZXgsCi0JCQkJICAgICBwUGFja2V0LT51LlJ4LlJ4QnVmZmVyU2l6ZSArIDIpKSA9PSAwKSB7Ci0JICAgIFFRX1B1c2hIZWFkKCZwVW1EZXZpY2UtPnJ4X291dF9vZl9idWZfcS5Db250YWluZXIscFBhY2tldCk7Ci0JICAgIHByaW50ZigiTk9USUNFOiBPdXQgb2YgUlggbWVtb3J5LlxuIik7Ci0JICAgIHJldCA9IDE7Ci0JICAgIGJyZWFrOworCQkvKiByZXVzZSBhbiBvbGQgc2tiICovCisJCWlmIChwVW1QYWNrZXQtPnNrYnVmZikgeworCQkJUVFfUHVzaFRhaWwgKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwKKwkJCQkgICAgIHBQYWNrZXQpOworCQkJcXVldWVfcnggPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKChza2IgPSBiY201NzB4UGt0QWxsb2MgKHBVbURldmljZS0+aW5kZXgsCisJCQkJCSAgICBwUGFja2V0LT51LlJ4LlJ4QnVmZmVyU2l6ZSArIDIpKSA9PQorCQkgICAgMCkgeworCQkJUVFfUHVzaEhlYWQgKCZwVW1EZXZpY2UtPnJ4X291dF9vZl9idWZfcS5Db250YWluZXIsCisJCQkJICAgICBwUGFja2V0KTsKKwkJCXByaW50ZiAoIk5PVElDRTogT3V0IG9mIFJYIG1lbW9yeS5cbiIpOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJcFVtUGFja2V0LT5za2J1ZmYgPSBza2I7CisJCVFRX1B1c2hUYWlsICgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCQlxdWV1ZV9yeCA9IDE7CiAJfQogCi0JcFVtUGFja2V0LT5za2J1ZmYgPSBza2I7Ci0JUVFfUHVzaFRhaWwoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKLQlxdWV1ZV9yeCA9IDE7Ci0gICAgfQorCWlmIChxdWV1ZV9yeCkgeworCQlMTV9RdWV1ZVJ4UGFja2V0cyAocERldmljZSk7CisJfQogCi0gICAgaWYgKHF1ZXVlX3J4KSB7Ci0JTE1fUXVldWVSeFBhY2tldHMocERldmljZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgogICogUHJvYmUsIE1hcCwgYW5kIEluaXQgNTcweCBkZXZpY2UuCiAgKi8KLWludCBldGhfaW5pdChiZF90ICpiaXMpCitpbnQgZXRoX2luaXQgKGJkX3QgKiBiaXMpCiB7Ci0gICAgaW50IGksIHJ2LCBkZXZGb3VuZCA9IEZBTFNFOwotICAgIHBjaV9kZXZfdCAgZGV2YnVzZm47Ci0gICAgdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCWludCBpLCBydiwgZGV2Rm91bmQgPSBGQUxTRTsKKwlwY2lfZGV2X3QgZGV2YnVzZm47CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOwogCi0gICAgLyogRmluZCBQQ0kgZGV2aWNlLCBpZiBpdCBleGlzdHMsIGNvbmZpZ3VyZSAuLi4gICovCi0gICAgZm9yKCBpID0gMDsgaSA8IG41NzB4RGV2aWNlczsgaSsrKXsKLQlkZXZidXNmbiA9IHBjaV9maW5kX2RldmljZShiY201NzB4RGV2aWNlc1tpXS52ZW5kb3JfaWQsCi0JCQkJICAgYmNtNTcweERldmljZXNbaV0uZGV2aWNlX2lkLCAwKTsKLQlpZihkZXZidXNmbiA9PSAtMSkgewotCSAgICBjb250aW51ZTsgLyogTm8gZGV2aWNlIG9mIHRoYXQgdmVuZG9yL2RldmljZSBJRCAqLworCS8qIEZpbmQgUENJIGRldmljZSwgaWYgaXQgZXhpc3RzLCBjb25maWd1cmUgLi4uICAqLworCWZvciAoaSA9IDA7IGkgPCBuNTcweERldmljZXM7IGkrKykgeworCQlkZXZidXNmbiA9IHBjaV9maW5kX2RldmljZSAoYmNtNTcweERldmljZXNbaV0udmVuZG9yX2lkLAorCQkJCQkgICAgYmNtNTcweERldmljZXNbaV0uZGV2aWNlX2lkLCAwKTsKKwkJaWYgKGRldmJ1c2ZuID09IC0xKSB7CisJCQljb250aW51ZTsJLyogTm8gZGV2aWNlIG9mIHRoYXQgdmVuZG9yL2RldmljZSBJRCAqLworCQl9IGVsc2UgeworCisJCQkvKiBTZXQgSUxJTkUgKi8KKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZSAoZGV2YnVzZm4sCisJCQkJCSAgICAgICBQQ0lfSU5URVJSVVBUX0xJTkUsCisJCQkJCSAgICAgICBCQ001NzBYX0lMSU5FKTsKKworCQkJLyoKKwkJCSAqIDB4MTAgLSAweDE0IGRlZmluZSBvbmUgNjQtYml0IE1CQVIuCisJCQkgKiAweDE0IGlzIHRoZSBoaWdoZXItb3JkZXIgYWRkcmVzcyBiaXRzIG9mIHRoZSBCQVIuCisJCQkgKi8KKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKGRldmJ1c2ZuLAorCQkJCQkJUENJX0JBU0VfQUREUkVTU18xLCAwKTsKKworCQkJaW9CYXNlID0gQkNNNTcwWF9NQkFSOworCisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkIChkZXZidXNmbiwKKwkJCQkJCVBDSV9CQVNFX0FERFJFU1NfMCwgaW9CYXNlKTsKKworCQkJLyoKKwkJCSAqIEVuYWJsZSBQQ0kgbWVtb3J5LCBJTywgYW5kIE1hc3RlciAtLSBkb24ndAorCQkJICogcmVzZXQgYW55IHN0YXR1cyBiaXRzIGluIGRvaW5nIHNvLgorCQkJICovCisJCQlwY2lfcmVhZF9jb25maWdfd29yZCAoZGV2YnVzZm4sIFBDSV9DT01NQU5ELCAmc3RhdHVzKTsKKworCQkJc3RhdHVzIHw9IFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUjsKKworCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkIChkZXZidXNmbiwgUENJX0NPTU1BTkQsIHN0YXR1cyk7CisKKwkJCXByaW50ZgorCQkJICAgICgiXG4lczogYnVzICVkLCBkZXZpY2UgJWQsIGZ1bmN0aW9uICVkOiBNQkFSPTB4JXhcbiIsCisJCQkgICAgIGJvYXJkX2luZm9bYmNtNTcweERldmljZXNbaV0uYm9hcmRfaWRdLm5hbWUsCisJCQkgICAgIFBDSV9CVVMgKGRldmJ1c2ZuKSwgUENJX0RFViAoZGV2YnVzZm4pLAorCQkJICAgICBQQ0lfRlVOQyAoZGV2YnVzZm4pLCBpb0Jhc2UpOworCisJCQkvKiBBbGxvY2F0ZSBvbmNlLCBidXQgYWx3YXlzIGNsZWFyIG9uIGluaXQgKi8KKwkJCWlmICghcERldmljZSkgeworCQkJCXBEZXZpY2UgPSBtYWxsb2MgKHNpemVvZiAoVU1fREVWSUNFX0JMT0NLKSk7CisJCQkJcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7CisJCQkJbWVtc2V0IChwRGV2aWNlLCAweDAsIHNpemVvZiAoVU1fREVWSUNFX0JMT0NLKSk7CisJCQl9CisKKwkJCS8qIENvbmZpZ3VyZSBwY2kgZGV2IHN0cnVjdHVyZSAqLworCQkJcFVtRGV2aWNlLT5wZGV2ID0gZGV2YnVzZm47CisJCQlwVW1EZXZpY2UtPmluZGV4ID0gMDsKKwkJCXBVbURldmljZS0+dHhfcGt0ID0gMDsKKwkJCXBVbURldmljZS0+cnhfcGt0ID0gMDsKKwkJCWRldkZvdW5kID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFkZXZGb3VuZCkgeworCQlwcmludGYKKwkJICAgICgiZXRoX2luaXQ6IEZBSUxVUkU6IG5vIEJDTTU3MHggRXRoZXJuZXQgZGV2aWNlcyBmb3VuZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogU2V0dXAgZGVmYXVsdHMgZm9yIGNoaXAgKi8KKwlwRGV2aWNlLT5UYXNrVG9PZmZsb2FkID0gTE1fVEFTS19PRkZMT0FEX05PTkU7CisKKwlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMF9CMCkgeworCQlwRGV2aWNlLT5UYXNrVG9PZmZsb2FkID0gTE1fVEFTS19PRkZMT0FEX05PTkU7CiAJfSBlbHNlIHsKIAotCSAgICAvKiBTZXQgSUxJTkUgKi8KLQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldmJ1c2ZuLAotCQkJCSAgUENJX0lOVEVSUlVQVF9MSU5FLCBCQ001NzBYX0lMSU5FKTsKKwkJaWYgKHJ4X2NoZWNrc3VtW2ldKSB7CisJCQlwRGV2aWNlLT5UYXNrVG9PZmZsb2FkIHw9CisJCQkgICAgTE1fVEFTS19PRkZMT0FEX1JYX1RDUF9DSEVDS1NVTSB8CisJCQkgICAgTE1fVEFTS19PRkZMT0FEX1JYX1VEUF9DSEVDS1NVTTsKKwkJfQogCi0JICAgIC8qCi0JICAgICAqIDB4MTAgLSAweDE0IGRlZmluZSBvbmUgNjQtYml0IE1CQVIuCi0JICAgICAqIDB4MTQgaXMgdGhlIGhpZ2hlci1vcmRlciBhZGRyZXNzIGJpdHMgb2YgdGhlIEJBUi4KLQkgICAgICovCi0JICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2YnVzZm4sCi0JCQkJICAgUENJX0JBU0VfQUREUkVTU18xLCAwKTsKLQotCSAgICBpb0Jhc2UgPSBCQ001NzBYX01CQVI7Ci0KLQkgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXZidXNmbiwKLQkJCQkgICBQQ0lfQkFTRV9BRERSRVNTXzAsIGlvQmFzZSk7Ci0KLQkgICAgLyoKLQkgICAgICogRW5hYmxlIFBDSSBtZW1vcnksIElPLCBhbmQgTWFzdGVyIC0tIGRvbid0Ci0JICAgICAqIHJlc2V0IGFueSBzdGF0dXMgYml0cyBpbiBkb2luZyBzby4KLQkgICAgICovCi0JICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldmJ1c2ZuLAotCQkJCSBQQ0lfQ09NTUFORCwgJnN0YXR1cyk7Ci0KLQkgICAgc3RhdHVzIHw9IFBDSV9DT01NQU5EX01FTU9SWXxQQ0lfQ09NTUFORF9NQVNURVI7Ci0KLQkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldmJ1c2ZuLAotCQkJCSAgUENJX0NPTU1BTkQsIHN0YXR1cyk7Ci0KLQkgICAgcHJpbnRmKCJcbiVzOiBidXMgJWQsIGRldmljZSAlZCwgZnVuY3Rpb24gJWQ6IE1CQVI9MHgleFxuIiwKLQkJICAgYm9hcmRfaW5mb1tiY201NzB4RGV2aWNlc1tpXS5ib2FyZF9pZF0ubmFtZSwKLQkJICAgUENJX0JVUyhkZXZidXNmbiksCi0JCSAgIFBDSV9ERVYoZGV2YnVzZm4pLAotCQkgICBQQ0lfRlVOQyhkZXZidXNmbiksCi0JCSAgIGlvQmFzZSk7Ci0KLQkgICAgLyogQWxsb2NhdGUgb25jZSwgYnV0IGFsd2F5cyBjbGVhciBvbiBpbml0ICovCi0JICAgIGlmICghcERldmljZSkgewotCQlwRGV2aWNlID0gbWFsbG9jKHNpemVvZihVTV9ERVZJQ0VfQkxPQ0spKTsKLQkJcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spcERldmljZTsKLQkJbWVtc2V0KHBEZXZpY2UsIDB4MCwgc2l6ZW9mKFVNX0RFVklDRV9CTE9DSykpOwotCSAgICB9Ci0KLQkgICAgLyogQ29uZmlndXJlIHBjaSBkZXYgc3RydWN0dXJlICovCi0JICAgIHBVbURldmljZS0+cGRldiA9IGRldmJ1c2ZuOwotCSAgICBwVW1EZXZpY2UtPmluZGV4ID0gMDsKLQkgICAgcFVtRGV2aWNlLT50eF9wa3QgPSAwOwotCSAgICBwVW1EZXZpY2UtPnJ4X3BrdCA9IDA7Ci0JICAgIGRldkZvdW5kID0gVFJVRTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAgIGlmKCFkZXZGb3VuZCl7Ci0JcHJpbnRmKCJldGhfaW5pdDogRkFJTFVSRTogbm8gQkNNNTcweCBFdGhlcm5ldCBkZXZpY2VzIGZvdW5kLlxuIik7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIFNldHVwIGRlZmF1bHRzIGZvciBjaGlwICovCi0gICAgcERldmljZS0+VGFza1RvT2ZmbG9hZCA9IExNX1RBU0tfT0ZGTE9BRF9OT05FOwotCi0gICAgaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDBfQjApIHsKLQlwRGV2aWNlLT5UYXNrVG9PZmZsb2FkID0gTE1fVEFTS19PRkZMT0FEX05PTkU7Ci0gICAgfSBlbHNlIHsKLQotCWlmIChyeF9jaGVja3N1bVtpXSkgewotCSAgICBwRGV2aWNlLT5UYXNrVG9PZmZsb2FkIHw9Ci0JCUxNX1RBU0tfT0ZGTE9BRF9SWF9UQ1BfQ0hFQ0tTVU0gfAotCQlMTV9UQVNLX09GRkxPQURfUlhfVURQX0NIRUNLU1VNOworCQlpZiAodHhfY2hlY2tzdW1baV0pIHsKKwkJCXBEZXZpY2UtPlRhc2tUb09mZmxvYWQgfD0KKwkJCSAgICBMTV9UQVNLX09GRkxPQURfVFhfVENQX0NIRUNLU1VNIHwKKwkJCSAgICBMTV9UQVNLX09GRkxPQURfVFhfVURQX0NIRUNLU1VNOworCQkJcERldmljZS0+Tm9UeFBzZXVkb0hkckNoa3N1bSA9IFRSVUU7CisJCX0KIAl9CiAKLQlpZiAodHhfY2hlY2tzdW1baV0pIHsKLQkgICAgcERldmljZS0+VGFza1RvT2ZmbG9hZCB8PQotCQlMTV9UQVNLX09GRkxPQURfVFhfVENQX0NIRUNLU1VNIHwKLQkJTE1fVEFTS19PRkZMT0FEX1RYX1VEUF9DSEVDS1NVTTsKLQkgICAgcERldmljZS0+Tm9UeFBzZXVkb0hkckNoa3N1bSA9IFRSVUU7CisJLyogU2V0IERldmljZSBQQ0kgTWVtb3J5IGJhc2UgYWRkcmVzcyAqLworCXBEZXZpY2UtPnBNYXBwZWRNZW1CYXNlID0gKFBMTV9VSU5UOCkgaW9CYXNlOworCisJLyogUHVsbCBkb3duIGFkYXB0ZXIgaW5mbyAqLworCWlmICgocnYgPSBMTV9HZXRBZGFwdGVySW5mbyAocERldmljZSkpICE9IExNX1NUQVRVU19TVUNDRVNTKSB7CisJCXByaW50ZiAoImJjbTU3MHhFbmQ6IExNX0dldEFkYXB0ZXJJbmZvIGZhaWxlZDogcnY9JWQhXG4iLCBydik7CisJCXJldHVybiAtMjsKIAl9Ci0gICAgfQogCi0gICAgLyogU2V0IERldmljZSBQQ0kgTWVtb3J5IGJhc2UgYWRkcmVzcyAqLwotICAgIHBEZXZpY2UtPnBNYXBwZWRNZW1CYXNlID0gKFBMTV9VSU5UOCkgaW9CYXNlOworCS8qIExvY2sgbm90IG5lZWRlZCAqLworCXBVbURldmljZS0+ZG9fZ2xvYmFsX2xvY2sgPSAwOwogCi0gICAgLyogUHVsbCBkb3duIGFkYXB0ZXIgaW5mbyAqLwotICAgIGlmICgocnYgPSBMTV9HZXRBZGFwdGVySW5mbyhwRGV2aWNlKSkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKLQlwcmludGYoImJjbTU3MHhFbmQ6IExNX0dldEFkYXB0ZXJJbmZvIGZhaWxlZDogcnY9JWQhXG4iLCBydiApOwotCXJldHVybiAtMjsKLSAgICB9CisJaWYgKFQzX0FTSUNfUkVWIChwVW1EZXZpY2UtPmxtX2Rldi5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApIHsKKwkJLyogVGhlIDU3MDAgY2hpcCB3b3JrcyBiZXN0IHdpdGhvdXQgaW50ZXJsZWF2ZWQgcmVnaXN0ZXIgKi8KKwkJLyogYWNjZXNzZXMgb24gY2VydGFpbiBtYWNoaW5lcy4gKi8KKwkJcFVtRGV2aWNlLT5kb19nbG9iYWxfbG9jayA9IDE7CisJfQogCi0gICAgLyogTG9jayBub3QgbmVlZGVkICovCi0gICAgcFVtRGV2aWNlLT5kb19nbG9iYWxfbG9jayA9IDA7CisJLyogU2V0dXAgdGltZXIgZGVsYXlzICovCisJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpIHsKKwkJcERldmljZS0+VXNlVGFnZ2VkU3RhdHVzID0gVFJVRTsKKwkJcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbCA9IENGR19IWjsKKwl9IGVsc2UgeworCQlwVW1EZXZpY2UtPnRpbWVyX2ludGVydmFsID0gQ0ZHX0haIC8gNTA7CisJfQogCi0gICAgaWYgKFQzX0FTSUNfUkVWKHBVbURldmljZS0+bG1fZGV2LkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkgewotCS8qIFRoZSA1NzAwIGNoaXAgd29ya3MgYmVzdCB3aXRob3V0IGludGVybGVhdmVkIHJlZ2lzdGVyICovCi0JLyogYWNjZXNzZXMgb24gY2VydGFpbiBtYWNoaW5lcy4gKi8KLQlwVW1EZXZpY2UtPmRvX2dsb2JhbF9sb2NrID0gMTsKLSAgICB9CisJLyogR3JhYiBuYW1lIC4uLi4gKi8KKwlwVW1EZXZpY2UtPm5hbWUgPQorCSAgICAoY2hhciAqKW1hbGxvYyAoc3RybGVuIChib2FyZF9pbmZvW2JjbTU3MHhEZXZpY2VzW2ldLmJvYXJkX2lkXS5uYW1lKQorCQkJICAgICsgMSk7CisJc3RyY3B5IChwVW1EZXZpY2UtPm5hbWUsIGJvYXJkX2luZm9bYmNtNTcweERldmljZXNbaV0uYm9hcmRfaWRdLm5hbWUpOwogCi0gICAgLyogU2V0dXAgdGltZXIgZGVsYXlzICovCi0gICAgaWYgKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkgewotCXBEZXZpY2UtPlVzZVRhZ2dlZFN0YXR1cyA9IFRSVUU7Ci0JcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbCA9IENGR19IWjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbCA9IENGR19IWiAvIDUwOwotICAgIH0KKwltZW1jcHkgKHBEZXZpY2UtPk5vZGVBZGRyZXNzLCBiaXMtPmJpX2VuZXRhZGRyLCA2KTsKKwlMTV9TZXRNYWNBZGRyZXNzIChwRGV2aWNlLCBiaXMtPmJpX2VuZXRhZGRyKTsKKwkvKiBJbml0IHF1ZXVlcyAgLi4gKi8KKwlRUV9Jbml0UXVldWUgKCZwVW1EZXZpY2UtPnJ4X291dF9vZl9idWZfcS5Db250YWluZXIsCisJCSAgICAgIE1BWF9SWF9QQUNLRVRfREVTQ19DT1VOVCk7CisJcFVtRGV2aWNlLT5yeF9sYXN0X2NudCA9IHBVbURldmljZS0+dHhfbGFzdF9jbnQgPSAwOwogCi0gICAgLyogR3JhYiBuYW1lIC4uLi4gKi8KLSAgICBwVW1EZXZpY2UtPm5hbWUgPQotCShjaGFyKiltYWxsb2Moc3RybGVuKGJvYXJkX2luZm9bYmNtNTcweERldmljZXNbaV0uYm9hcmRfaWRdLm5hbWUpKzEpOwotICAgIHN0cmNweShwVW1EZXZpY2UtPm5hbWUsYm9hcmRfaW5mb1tiY201NzB4RGV2aWNlc1tpXS5ib2FyZF9pZF0ubmFtZSk7CisJLyogZGVsYXkgZm9yIDQgc2Vjb25kcyAqLworCXBVbURldmljZS0+ZGVsYXllZF9saW5rX2luZCA9ICg0ICogQ0ZHX0haKSAvIHBVbURldmljZS0+dGltZXJfaW50ZXJ2YWw7CiAKLSAgICBtZW1jcHkocERldmljZS0+Tm9kZUFkZHJlc3MsIGJpcy0+YmlfZW5ldGFkZHIsIDYpOwotICAgIExNX1NldE1hY0FkZHJlc3MocERldmljZSwgYmlzLT5iaV9lbmV0YWRkcik7Ci0gICAgLyogSW5pdCBxdWV1ZXMgIC4uICovCi0gICAgUVFfSW5pdFF1ZXVlKCZwVW1EZXZpY2UtPnJ4X291dF9vZl9idWZfcS5Db250YWluZXIsCi0JCSBNQVhfUlhfUEFDS0VUX0RFU0NfQ09VTlQpOwotICAgIHBVbURldmljZS0+cnhfbGFzdF9jbnQgPSBwVW1EZXZpY2UtPnR4X2xhc3RfY250ID0gMDsKKwlwVW1EZXZpY2UtPmFkYXB0aXZlX2V4cGlyeSA9IENGR19IWiAvIHBVbURldmljZS0+dGltZXJfaW50ZXJ2YWw7CiAKLSAgICAvKiBkZWxheSBmb3IgNCBzZWNvbmRzICovCi0gICAgcFVtRGV2aWNlLT5kZWxheWVkX2xpbmtfaW5kID0KLQkoNCAqIENGR19IWikgLyBwVW1EZXZpY2UtPnRpbWVyX2ludGVydmFsOworCS8qIFNvbWV0aW1lcyB3ZSBnZXQgc3B1cmlvdXMgaW50cy4gYWZ0ZXIgcmVzZXQgd2hlbiBsaW5rIGlzIGRvd24uICovCisJLyogVGhpcyBmaWVsZCB0ZWxscyB0aGUgaXNyIHRvIHNlcnZpY2UgdGhlIGludC4gZXZlbiBpZiB0aGVyZSBpcyAqLworCS8qIG5vIHN0YXR1cyBibG9jayB1cGRhdGUuICovCisJcFVtRGV2aWNlLT5hZGFwdGVyX2p1c3RfaW5pdGVkID0KKwkgICAgKDMgKiBDRkdfSFopIC8gcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbDsKIAotICAgIHBVbURldmljZS0+YWRhcHRpdmVfZXhwaXJ5ID0KLQlDRkdfSFogLyBwVW1EZXZpY2UtPnRpbWVyX2ludGVydmFsOworCS8qIEluaXRpYWxpemUgNTcweCAqLworCWlmIChMTV9Jbml0aWFsaXplQWRhcHRlciAocERldmljZSkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcHJpbnRmICgiRVJST1I6IEFkYXB0ZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisJCXJldHVybiBFUlJPUjsKKwl9CiAKLSAgICAvKiBTb21ldGltZXMgd2UgZ2V0IHNwdXJpb3VzIGludHMuIGFmdGVyIHJlc2V0IHdoZW4gbGluayBpcyBkb3duLiAqLwotICAgIC8qIFRoaXMgZmllbGQgdGVsbHMgdGhlIGlzciB0byBzZXJ2aWNlIHRoZSBpbnQuIGV2ZW4gaWYgdGhlcmUgaXMgKi8KLSAgICAvKiBubyBzdGF0dXMgYmxvY2sgdXBkYXRlLiAqLwotICAgIHBVbURldmljZS0+YWRhcHRlcl9qdXN0X2luaXRlZCA9Ci0JKDMgKiBDRkdfSFopIC8gcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbDsKKwkvKiBFbmFibGUgY2hpcCBJU1IgKi8KKwlMTV9FbmFibGVJbnRlcnJ1cHQgKHBEZXZpY2UpOwogCi0gICAgLyogSW5pdGlhbGl6ZSA1NzB4ICovCi0gICAgaWYgKExNX0luaXRpYWxpemVBZGFwdGVyKHBEZXZpY2UpICE9IExNX1NUQVRVU19TVUNDRVNTKSB7Ci0JcHJpbnRmKCJFUlJPUjogQWRhcHRlciBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKLQlyZXR1cm4gRVJST1I7Ci0gICAgfQorCS8qIENsZWFyIE1DIHRhYmxlICovCisJTE1fTXVsdGljYXN0Q2xlYXIgKHBEZXZpY2UpOwogCi0gICAgLyogRW5hYmxlIGNoaXAgSVNSICovCi0gICAgTE1fRW5hYmxlSW50ZXJydXB0KHBEZXZpY2UpOworCS8qIEVuYWJsZSBNdWx0aWNhc3QgKi8KKwlMTV9TZXRSZWNlaXZlTWFzayAocERldmljZSwKKwkJCSAgIHBEZXZpY2UtPlJlY2VpdmVNYXNrIHwgTE1fQUNDRVBUX0FMTF9NVUxUSUNBU1QpOwogCi0gICAgLyogQ2xlYXIgTUMgdGFibGUgKi8KLSAgICBMTV9NdWx0aWNhc3RDbGVhcihwRGV2aWNlKTsKKwlwVW1EZXZpY2UtPm9wZW5lZCA9IDE7CisJcFVtRGV2aWNlLT50eF9mdWxsID0gMDsKKwlwVW1EZXZpY2UtPnR4X3BrdCA9IDA7CisJcFVtRGV2aWNlLT5yeF9wa3QgPSAwOworCXByaW50ZiAoImV0aCVkOiAlcyBAMHglbHgsIiwKKwkJcERldmljZS0+aW5kZXgsIHBVbURldmljZS0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpaW9CYXNlKTsKKwlwcmludGYgKCJub2RlIGFkZHIgIik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlwcmludGYgKCIlMi4yeCIsIHBEZXZpY2UtPk5vZGVBZGRyZXNzW2ldKTsKKwl9CisJcHJpbnRmICgiXG4iKTsKIAotICAgIC8qIEVuYWJsZSBNdWx0aWNhc3QgKi8KLSAgICBMTV9TZXRSZWNlaXZlTWFzayhwRGV2aWNlLAotCQkgICAgICBwRGV2aWNlLT5SZWNlaXZlTWFzayB8IExNX0FDQ0VQVF9BTExfTVVMVElDQVNUKTsKKwlwcmludGYgKCJldGglZDogIiwgcERldmljZS0+aW5kZXgpOworCXByaW50ZiAoIiVzIHdpdGggIiwgY2hpcF9yZXZbYmNtNTcweERldmljZXNbaV0uYm9hcmRfaWRdLm5hbWUpOwogCi0gICAgcFVtRGV2aWNlLT5vcGVuZWQgPSAxOwotICAgIHBVbURldmljZS0+dHhfZnVsbCA9IDA7Ci0gICAgcFVtRGV2aWNlLT50eF9wa3QgPSAwOwotICAgIHBVbURldmljZS0+cnhfcGt0ID0gMDsKLSAgICBwcmludGYoImV0aCVkOiAlcyBAMHglbHgsIiwKLQkgICBwRGV2aWNlLT5pbmRleCwgcFVtRGV2aWNlLT5uYW1lLCAodW5zaWduZWQgbG9uZylpb0Jhc2UpOwotICAgIHByaW50ZigJIm5vZGUgYWRkciAiKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JcHJpbnRmKCIlMi4yeCIsIHBEZXZpY2UtPk5vZGVBZGRyZXNzW2ldKTsKLSAgICB9Ci0gICAgcHJpbnRmKCJcbiIpOworCWlmICgocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0JDTTU0MDBfUEhZX0lEKQorCQlwcmludGYgKCJCcm9hZGNvbSBCQ001NDAwIENvcHBlciAiKTsKKwllbHNlIGlmICgocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0JDTTU0MDFfUEhZX0lEKQorCQlwcmludGYgKCJCcm9hZGNvbSBCQ001NDAxIENvcHBlciAiKTsKKwllbHNlIGlmICgocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0JDTTU0MTFfUEhZX0lEKQorCQlwcmludGYgKCJCcm9hZGNvbSBCQ001NDExIENvcHBlciAiKTsKKwllbHNlIGlmICgocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0JDTTU3MDFfUEhZX0lEKQorCQlwcmludGYgKCJCcm9hZGNvbSBCQ001NzAxIEludGVncmF0ZWQgQ29wcGVyICIpOworCWVsc2UgaWYgKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfQkNNNTcwM19QSFlfSUQpCisJCXByaW50ZiAoIkJyb2FkY29tIEJDTTU3MDMgSW50ZWdyYXRlZCBDb3BwZXIgIik7CisJZWxzZSBpZiAoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spID09IFBIWV9CQ004MDAyX1BIWV9JRCkKKwkJcHJpbnRmICgiQnJvYWRjb20gQkNNODAwMiBTZXJEZXMgIik7CisJZWxzZSBpZiAocERldmljZS0+RW5hYmxlVGJpKQorCQlwcmludGYgKCJBZ2lsZW50IEhETVAtMTYzNiBTZXJEZXMgIik7CisJZWxzZQorCQlwcmludGYgKCJVbmtub3duICIpOworCXByaW50ZiAoInRyYW5zY2VpdmVyIGZvdW5kXG4iKTsKIAotICAgIHByaW50ZigiZXRoJWQ6ICIsIHBEZXZpY2UtPmluZGV4KTsKLSAgICBwcmludGYoIiVzIHdpdGggIiwKLQkgICBjaGlwX3JldltiY201NzB4RGV2aWNlc1tpXS5ib2FyZF9pZF0ubmFtZSk7CisJcHJpbnRmICgiZXRoJWQ6ICVzLCBNVFU6ICVkLCIsCisJCXBEZXZpY2UtPmluZGV4LCBwRGV2aWNlLT5CdXNTcGVlZFN0ciwgMTUwMCk7CiAKLSAgICBpZiAoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spID09IFBIWV9CQ001NDAwX1BIWV9JRCkKLQlwcmludGYoIkJyb2FkY29tIEJDTTU0MDAgQ29wcGVyICIpOwotICAgIGVsc2UgaWYgKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfQkNNNTQwMV9QSFlfSUQpCi0JcHJpbnRmKCJCcm9hZGNvbSBCQ001NDAxIENvcHBlciAiKTsKLSAgICBlbHNlIGlmICgocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0JDTTU0MTFfUEhZX0lEKQotCXByaW50ZigiQnJvYWRjb20gQkNNNTQxMSBDb3BwZXIgIik7Ci0gICAgZWxzZSBpZiAoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spID09IFBIWV9CQ001NzAxX1BIWV9JRCkKLQlwcmludGYoIkJyb2FkY29tIEJDTTU3MDEgSW50ZWdyYXRlZCBDb3BwZXIgIik7Ci0gICAgZWxzZSBpZiAoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spID09IFBIWV9CQ001NzAzX1BIWV9JRCkKLQlwcmludGYoIkJyb2FkY29tIEJDTTU3MDMgSW50ZWdyYXRlZCBDb3BwZXIgIik7Ci0gICAgZWxzZSBpZiAoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spID09IFBIWV9CQ004MDAyX1BIWV9JRCkKLQlwcmludGYoIkJyb2FkY29tIEJDTTgwMDIgU2VyRGVzICIpOwotICAgIGVsc2UgaWYgKHBEZXZpY2UtPkVuYWJsZVRiaSkKLQlwcmludGYoIkFnaWxlbnQgSERNUC0xNjM2IFNlckRlcyAiKTsKLSAgICBlbHNlCi0JcHJpbnRmKCJVbmtub3duICIpOwotICAgIHByaW50ZigidHJhbnNjZWl2ZXIgZm91bmRcbiIpOworCWlmICgocERldmljZS0+Q2hpcFJldklkICE9IFQzX0NISVBfSURfNTcwMF9CMCkgJiYgcnhfY2hlY2tzdW1baV0pCisJCXByaW50ZiAoIlJ4IENoZWNrc3VtIE9OXG4iKTsKKwllbHNlCisJCXByaW50ZiAoIlJ4IENoZWNrc3VtIE9GRlxuIik7CisJaW5pdGlhbGl6ZWQrKzsKIAotICAgIHByaW50ZigiZXRoJWQ6ICVzLCBNVFU6ICVkLCIsCi0JICAgcERldmljZS0+aW5kZXgsIHBEZXZpY2UtPkJ1c1NwZWVkU3RyLCAxNTAwKTsKLQotICAgIGlmICgocERldmljZS0+Q2hpcFJldklkICE9IFQzX0NISVBfSURfNTcwMF9CMCkgJiYKLQlyeF9jaGVja3N1bVtpXSkKLQlwcmludGYoIlJ4IENoZWNrc3VtIE9OXG4iKTsKLSAgICBlbHNlCi0JcHJpbnRmKCJSeCBDaGVja3N1bSBPRkZcbiIpOwotICAgIGluaXRpYWxpemVkKys7Ci0KLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogLyogRXRoZXJuZXQgSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAqLwotdm9pZAotZXRoX2lzcih2b2lkKQordm9pZCBldGhfaXNyICh2b2lkKQogewotICAgIExNX1VJTlQzMiBvbGR0YWcsIG5ld3RhZzsKLSAgICBpbnQgaTsKKwlMTV9VSU5UMzIgb2xkdGFnLCBuZXd0YWc7CisJaW50IGk7CiAKLSAgICBwVW1EZXZpY2UtPmludGVycnVwdCA9IDE7CisJcFVtRGV2aWNlLT5pbnRlcnJ1cHQgPSAxOwogCi0gICAgaWYgKHBEZXZpY2UtPlVzZVRhZ2dlZFN0YXR1cykgewotCWlmICgocERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1cyAmIFNUQVRVU19CTE9DS19VUERBVEVEKSB8fAotCSAgICBwVW1EZXZpY2UtPmFkYXB0ZXJfanVzdF9pbml0ZWQpIHsKLQkgICAgTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guSW50ZXJydXB0WzBdLkxvdywgMSk7Ci0JICAgIG9sZHRhZyA9IHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXNUYWc7CisJaWYgKHBEZXZpY2UtPlVzZVRhZ2dlZFN0YXR1cykgeworCQlpZiAoKHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgJiBTVEFUVVNfQkxPQ0tfVVBEQVRFRCkgfHwKKwkJICAgIHBVbURldmljZS0+YWRhcHRlcl9qdXN0X2luaXRlZCkgeworCQkJTUJfUkVHX1dSIChwRGV2aWNlLCBNYWlsYm94LkludGVycnVwdFswXS5Mb3csIDEpOworCQkJb2xkdGFnID0gcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1c1RhZzsKIAotCSAgICBmb3IgKGkgPSAwOyA7IGkrKykgewotCQlwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzICY9IH5TVEFUVVNfQkxPQ0tfVVBEQVRFRDsKLQkJTE1fU2VydmljZUludGVycnVwdHMocERldmljZSk7Ci0JCW5ld3RhZyA9IHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXNUYWc7Ci0JCWlmICgobmV3dGFnID09IG9sZHRhZykgfHwgKGkgPiA1MCkpIHsKLQkJICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LkludGVycnVwdFswXS5Mb3csIG5ld3RhZyA8PCAyNCk7Ci0JCSAgICBpZiAocERldmljZS0+VW5kaUZpeCkgewotCQkJUkVHX1dSKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsCi0JCQkgICAgICAgcERldmljZS0+R3JjTG9jYWxDdHJsIHwgMHgyKTsKLQkJICAgIH0KLQkJICAgIGJyZWFrOwotCQkgfQotCQlvbGR0YWcgPSBuZXd0YWc7Ci0JICAgIH0KKwkJCWZvciAoaSA9IDA7OyBpKyspIHsKKwkJCQlwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzICY9CisJCQkJICAgIH5TVEFUVVNfQkxPQ0tfVVBEQVRFRDsKKwkJCQlMTV9TZXJ2aWNlSW50ZXJydXB0cyAocERldmljZSk7CisJCQkJbmV3dGFnID0gcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1c1RhZzsKKwkJCQlpZiAoKG5ld3RhZyA9PSBvbGR0YWcpIHx8IChpID4gNTApKSB7CisJCQkJCU1CX1JFR19XUiAocERldmljZSwKKwkJCQkJCSAgIE1haWxib3guSW50ZXJydXB0WzBdLkxvdywKKwkJCQkJCSAgIG5ld3RhZyA8PCAyNCk7CisJCQkJCWlmIChwRGV2aWNlLT5VbmRpRml4KSB7CisJCQkJCQlSRUdfV1IgKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsCisJCQkJCQkJcERldmljZS0+CisJCQkJCQkJR3JjTG9jYWxDdHJsIHwgMHgyKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJb2xkdGFnID0gbmV3dGFnOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgJiBTVEFUVVNfQkxPQ0tfVVBEQVRFRCkgeworCQkJdW5zaWduZWQgaW50IGR1bW15OworCisJCQlwRGV2aWNlLT5wTWVtVmlldy0+TWFpbGJveC5JbnRlcnJ1cHRbMF0uTG93ID0gMTsKKwkJCXBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgJj0KKwkJCSAgICB+U1RBVFVTX0JMT0NLX1VQREFURUQ7CisJCQlMTV9TZXJ2aWNlSW50ZXJydXB0cyAocERldmljZSk7CisJCQlwRGV2aWNlLT5wTWVtVmlldy0+TWFpbGJveC5JbnRlcnJ1cHRbMF0uTG93ID0gMDsKKwkJCWR1bW15ID0gcERldmljZS0+cE1lbVZpZXctPk1haWxib3guSW50ZXJydXB0WzBdLkxvdzsKKwkJfQogCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0Jd2hpbGUgKHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgJiBTVEFUVVNfQkxPQ0tfVVBEQVRFRCkgewotCSAgICB1bnNpZ25lZCBpbnQgZHVtbXk7CiAKLQkgICAgcERldmljZS0+cE1lbVZpZXctPk1haWxib3guSW50ZXJydXB0WzBdLkxvdyA9IDE7Ci0JICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgJj0gflNUQVRVU19CTE9DS19VUERBVEVEOwotCSAgICBMTV9TZXJ2aWNlSW50ZXJydXB0cyhwRGV2aWNlKTsKLQkgICAgcERldmljZS0+cE1lbVZpZXctPk1haWxib3guSW50ZXJydXB0WzBdLkxvdyA9IDA7Ci0JICAgIGR1bW15ID0gcERldmljZS0+cE1lbVZpZXctPk1haWxib3guSW50ZXJydXB0WzBdLkxvdzsKKwkvKiBBbGxvY2F0ZSBuZXcgUlggYnVmZmVycyAqLworCWlmIChRUV9HZXRFbnRyeUNudCAoJnBVbURldmljZS0+cnhfb3V0X29mX2J1Zl9xLkNvbnRhaW5lcikpIHsKKwkJYmNtNTcweFJlcGxlbmlzaFJ4QnVmZmVycyAocFVtRGV2aWNlKTsKIAl9Ci0gICAgfQogCi0gICAgLyogQWxsb2NhdGUgbmV3IFJYIGJ1ZmZlcnMgKi8KLSAgICBpZiAoUVFfR2V0RW50cnlDbnQoJnBVbURldmljZS0+cnhfb3V0X29mX2J1Zl9xLkNvbnRhaW5lcikpIHsKLQliY201NzB4UmVwbGVuaXNoUnhCdWZmZXJzKHBVbURldmljZSk7Ci0gICAgfQotCi0gICAgLyogUXVldWUgcGFja2V0cyAqLwotICAgIGlmIChRUV9HZXRFbnRyeUNudCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIpKSB7Ci0JTE1fUXVldWVSeFBhY2tldHMocERldmljZSk7Ci0gICAgfQotCi0gICAgaWYgKHBVbURldmljZS0+dHhfcXVldWVkKSB7Ci0JcFVtRGV2aWNlLT50eF9xdWV1ZWQgPSAwOwotICAgIH0KLQotICAgIGlmKHBVbURldmljZS0+dHhfZnVsbCl7Ci0JaWYocERldmljZS0+TGlua1N0YXR1cyAhPSBMTV9TVEFUVVNfTElOS19ET1dOKXsKLQkgICAgcHJpbnRmKCJOT1RJQ0U6IHR4IHdhcyBwcmV2aW91c2x5IGJsb2NrZWQsIHJlc3RhcnRpbmcgTVVYXG4iKTsKLQkgICAgcFVtRGV2aWNlLT50eF9mdWxsID0gMDsKKwkvKiBRdWV1ZSBwYWNrZXRzICovCisJaWYgKFFRX0dldEVudHJ5Q250ICgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIpKSB7CisJCUxNX1F1ZXVlUnhQYWNrZXRzIChwRGV2aWNlKTsKIAl9Ci0gICAgfQogCi0gICAgcFVtRGV2aWNlLT5pbnRlcnJ1cHQgPSAwOworCWlmIChwVW1EZXZpY2UtPnR4X3F1ZXVlZCkgeworCQlwVW1EZXZpY2UtPnR4X3F1ZXVlZCA9IDA7CisJfQorCisJaWYgKHBVbURldmljZS0+dHhfZnVsbCkgeworCQlpZiAocERldmljZS0+TGlua1N0YXR1cyAhPSBMTV9TVEFUVVNfTElOS19ET1dOKSB7CisJCQlwcmludGYKKwkJCSAgICAoIk5PVElDRTogdHggd2FzIHByZXZpb3VzbHkgYmxvY2tlZCwgcmVzdGFydGluZyBNVVhcbiIpOworCQkJcFVtRGV2aWNlLT50eF9mdWxsID0gMDsKKwkJfQorCX0KKworCXBVbURldmljZS0+aW50ZXJydXB0ID0gMDsKIAogfQogCi1pbnQKLWV0aF9zZW5kKHZvbGF0aWxlIHZvaWQgKnBhY2tldCwgaW50IGxlbmd0aCkKK2ludCBldGhfc2VuZCAodm9sYXRpbGUgdm9pZCAqcGFja2V0LCBpbnQgbGVuZ3RoKQogewotICAgIGludCBzdGF0dXMgPSAwOworCWludCBzdGF0dXMgPSAwOwogI2lmIEVUX0RFQlVHCi0gICAgdW5zaWduZWQgY2hhciogcHRyID0gKHVuc2lnbmVkIGNoYXIqKXBhY2tldDsKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKXBhY2tldDsKICNlbmRpZgotICAgIFBMTV9QQUNLRVQgcFBhY2tldDsKLSAgICBQVU1fUEFDS0VUIHBVbVBhY2tldDsKKwlQTE1fUEFDS0VUIHBQYWNrZXQ7CisJUFVNX1BBQ0tFVCBwVW1QYWNrZXQ7CiAKLSAgICAvKiBMaW5rIGRvd24sIHJldHVybiAqLwotICAgIHdoaWxlKHBEZXZpY2UtPkxpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfRE9XTikgeworCS8qIExpbmsgZG93biwgcmV0dXJuICovCisJd2hpbGUgKHBEZXZpY2UtPkxpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfRE9XTikgewogI2lmIDAKLQlwcmludGYoImV0aCVkOiBsaW5rIGRvd24gLSBjaGVjayBjYWJsZSBvciBsaW5rIHBhcnRuZXIuXG4iLAotCSAgICAgICBwVW1EZXZpY2UtPmluZGV4KTsKKwkJcHJpbnRmICgiZXRoJWQ6IGxpbmsgZG93biAtIGNoZWNrIGNhYmxlIG9yIGxpbmsgcGFydG5lci5cbiIsCisJCQlwVW1EZXZpY2UtPmluZGV4KTsKICNlbmRpZgotCWV0aF9pc3IoKTsKKwkJZXRoX2lzciAoKTsKIAotCS8qIFdhaXQgdG8gc2VlIGxpbmsgZm9yIG9uZS1oYWxmIGEgc2Vjb25kIGJlZm9yZSBzZW5kaW5nIC4uLiAqLwotCXVkZWxheSgxNTAwMDAwKTsKKwkJLyogV2FpdCB0byBzZWUgbGluayBmb3Igb25lLWhhbGYgYSBzZWNvbmQgYmVmb3JlIHNlbmRpbmcgLi4uICovCisJCXVkZWxheSAoMTUwMDAwMCk7CiAKLSAgICB9Ci0KLSAgICAvKiBDbGVhciBzZW50IGZsYWcgKi8KLSAgICBwVW1EZXZpY2UtPnR4X3BrdCA9IDA7Ci0KLSAgICAvKiBQcmV2aW91c2x5IGJsb2NrZWQgKi8KLSAgICBpZihwVW1EZXZpY2UtPnR4X2Z1bGwpewotCXByaW50ZigiZXRoJWQ6IHR4IGJsb2NrZWQuXG4iLCBwVW1EZXZpY2UtPmluZGV4KTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwUGFja2V0ID0gKFBMTV9QQUNLRVQpCi0JUVFfUG9wSGVhZCgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIpOwotCi0gICAgaWYgKHBQYWNrZXQgPT0gMCkgewotCXBVbURldmljZS0+dHhfZnVsbCA9IDE7Ci0JcHJpbnRmKCJiY201NzB4RW5kU2VuZDogVFggZnVsbCFcbiIpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChwRGV2aWNlLT5TZW5kQmRMZWZ0LmNvdW50ZXIgPT0gMCkgewotCXBVbURldmljZS0+dHhfZnVsbCA9IDE7Ci0JcHJpbnRmKCJiY201NzB4RW5kU2VuZDogbm8gbW9yZSBUWCBkZXNjcmlwdG9ycyFcbiIpOwotCVFRX1B1c2hIZWFkKCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKGxlbmd0aCA8PSAwKXsKLQlwcmludGYoImV0aDogYmFkIHBhY2tldCBzaXplOiAlZFxuIiwgbGVuZ3RoKTsKLQlnb3RvIG91dDsKLSAgICB9Ci0KLSAgICAvKiBHZXQgcGFja2V0IGJ1ZmZlcnMgYW5kIGZyYWdtZW50IGxpc3QgKi8KLSAgICBwVW1QYWNrZXQgPSAoUFVNX1BBQ0tFVCkgcFBhY2tldDsKLSAgICAvKiBTaW5nbGUgRE1BIERlc2NyaXB0b3IgdHJhbnNtaXQuCi0gICAgICogRnJhZ21lbnRzIG1heSBiZSBwcm92aWRlZCwgYnV0IG9uZSBETUEgZGVzY3JpcHRvciBtYXggaXMKLSAgICAgKiB1c2VkIHRvIHNlbmQgdGhlIHBhY2tldC4KLSAgICAgKi8KLSAgICBpZiAoTU1fQ29hbGVzY2VUeEJ1ZmZlciAocERldmljZSwgcFBhY2tldCkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKLQlpZiAocFVtUGFja2V0LT5za2J1ZmYgPT0gTlVMTCl7Ci0JICAgIC8qIFBhY2tldCB3YXMgZGlzY2FyZGVkICovCi0JICAgIHByaW50ZigiVFg6IGZhaWxlZCAoMSlcbiIpOwotCSAgICBzdGF0dXMgPSAxOwotCX0gZWxzZXsKLQkgICAgcHJpbnRmKCJUWDogZmFpbGVkICgyKVxuIik7Ci0JICAgIHN0YXR1cyA9IDI7Ci0JfQotCVFRX1B1c2hIZWFkICgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOwotCXJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgLyogQ29weSBwYWNrZXQgdG8gRE1BIGJ1ZmZlciAqLwotICAgIG1lbXNldChwVW1QYWNrZXQtPnNrYnVmZiwgMHgwLCBNQVhfUEFDS0VUX1NJWkUpOwotICAgIG1lbWNweSgodm9pZCopcFVtUGFja2V0LT5za2J1ZmYsICh2b2lkKilwYWNrZXQsIGxlbmd0aCk7Ci0gICAgcFBhY2tldC0+UGFja2V0U2l6ZSA9IGxlbmd0aDsKLSAgICBwUGFja2V0LT5GbGFncyB8PSBTTkRfQkRfRkxBR19FTkR8U05EX0JEX0ZMQUdfQ09BTF9OT1c7Ci0gICAgcFBhY2tldC0+dS5UeC5GcmFnQ291bnQgPSAxOwotICAgIC8qIFdlJ3ZlIGFscmVhZHkgcHJvdmlkZWQgYSBmcmFtZSByZWFkeSBmb3IgdHJhbnNtaXNzaW9uICovCi0gICAgcFBhY2tldC0+RmxhZ3MgJj0gflNORF9CRF9GTEFHX1RDUF9VRFBfQ0tTVU07Ci0KLSAgICBpZiAoIExNX1NlbmRQYWNrZXQocERldmljZSwgcFBhY2tldCkgPT0gTE1fU1RBVFVTX0ZBSUxVUkUpewotCS8qCi0JICogIEEgbG93ZXIgbGV2ZWwgc2VuZCBmYWlsdXJlIHdpbGwgcHVzaCB0aGUgcGFja2V0IGRlc2NyaXB0b3IgYmFjawotCSAqICBpbiB0aGUgZnJlZSBxdWV1ZSwgc28ganVzdCBkZWFsIHdpdGggdGhlIFZ4V29ya3MgY2x1c3RlcnMuCi0JICovCi0JaWYgKHBVbVBhY2tldC0+c2tidWZmID09IE5VTEwpewotCSAgICBwcmludGYoIlRYIGZhaWxlZCAoMSkhXG4iKTsKLQkgICAgLyogUGFja2V0IHdhcyBkaXNjYXJkZWQgKi8KLQkgICAgc3RhdHVzID0gMzsKLQl9IGVsc2UgewotCSAgICAvKiBBIHJlc291cmNlIHByb2JsZW0gLi4uICovCi0JICAgIHByaW50ZigiVFggZmFpbGVkICgyKSFcbiIpOwotCSAgICBzdGF0dXMgPSA0OwogCX0KIAotCWlmIChRUV9HZXRFbnRyeUNudCgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIpID09IDApIHsKLQkgICAgcHJpbnRmKCJUWDogZW1wdHlRIVxuIik7Ci0JICAgIHBVbURldmljZS0+dHhfZnVsbCA9IDE7Ci0JfQotICAgIH0KKwkvKiBDbGVhciBzZW50IGZsYWcgKi8KKwlwVW1EZXZpY2UtPnR4X3BrdCA9IDA7CiAKLSAgICB3aGlsZShwVW1EZXZpY2UtPnR4X3BrdCA9PSAwKXsKLQkvKiBTZXJ2aWNlIFRYICovCi0JZXRoX2lzcigpOwotICAgIH0KLSNpZiBFVF9ERUJVRwotICAgIHByaW50ZigiZXRoX3NlbmQ6IDB4JXgsICVkIGJ5dGVzXG4iCi0JICAgIlsleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleF0gLi4uXG4iLAotCSAgIChpbnQpcFBhY2tldCwgbGVuZ3RoLAotCSAgIHB0clswXSxwdHJbMV0scHRyWzJdLHB0clszXSxwdHJbNF0scHRyWzVdLAotCSAgIHB0cls2XSxwdHJbN10scHRyWzhdLHB0cls5XSxwdHJbMTBdLHB0clsxMV0scHRyWzEyXSwKLQkgICBwdHJbMTNdLHB0clsxNF0scHRyWzE1XSk7Ci0jZW5kaWYKLSAgICBwVW1EZXZpY2UtPnR4X3BrdCA9IDA7Ci0gICAgUVFfUHVzaEhlYWQoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKLQotICAgIC8qIERvbmUgd2l0aCBzZW5kICovCi0gb3V0OgotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLQotLyogRXRoZXJuZXQgcmVjZWl2ZSAqLwotaW50Ci1ldGhfcngodm9pZCkKLXsKLSAgICBQTE1fUEFDS0VUICAgICAgICAgIHBQYWNrZXQgPSBOVUxMOwotICAgIFBVTV9QQUNLRVQgICAgICAgICAgcFVtUGFja2V0ID0gTlVMTDsKLSAgICB2b2lkICpza2I7Ci0gICAgaW50IHNpemU9MDsKLQotICAgIHdoaWxlKFRSVUUpIHsKLQotICAgIGJjbTU3MHhfc2VydmljZV9pc3I6Ci0JLyogUHVsbCBkb3duIHBhY2tldCBpZiBpdCBpcyB0aGVyZSAqLwotCWV0aF9pc3IoKTsKLQotCS8qIEluZGljYXRlIFJYIHBhY2tldHMgY2FsbGVkICovCi0JaWYocFVtRGV2aWNlLT5yeF9wa3QpewotCSAgICAvKiBwcmludGYoImV0aF9yeDogZ290IGEgcGFja2V0Li4uXG4iKTsgKi8KLQkgICAgcFVtRGV2aWNlLT5yeF9wa3QgPSAwOwotCX0gZWxzZSB7Ci0JICAgIC8qIHByaW50ZigiZXRoX3J4OiB3YWl0aW5nIGZvciBwYWNrZXQuLi5cbiIpOyAqLwotCSAgICBnb3RvIGJjbTU3MHhfc2VydmljZV9pc3I7CisJLyogUHJldmlvdXNseSBibG9ja2VkICovCisJaWYgKHBVbURldmljZS0+dHhfZnVsbCkgeworCQlwcmludGYgKCJldGglZDogdHggYmxvY2tlZC5cbiIsIHBVbURldmljZS0+aW5kZXgpOworCQlyZXR1cm4gMDsKIAl9CiAKIAlwUGFja2V0ID0gKFBMTV9QQUNLRVQpCi0JICAgIFFRX1BvcEhlYWQoJnBEZXZpY2UtPlJ4UGFja2V0UmVjZWl2ZWRRLkNvbnRhaW5lcik7CisJICAgIFFRX1BvcEhlYWQgKCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLkNvbnRhaW5lcik7CiAKLQlpZiAocFBhY2tldCA9PSAwKXsKLQkgICAgcHJpbnRmKCJldGhfcng6IGVtcHR5IHBhY2tldCFcbiIpOwotCSAgICBnb3RvIGJjbTU3MHhfc2VydmljZV9pc3I7CisJaWYgKHBQYWNrZXQgPT0gMCkgeworCQlwVW1EZXZpY2UtPnR4X2Z1bGwgPSAxOworCQlwcmludGYgKCJiY201NzB4RW5kU2VuZDogVFggZnVsbCFcbiIpOworCQlyZXR1cm4gMDsKIAl9CiAKKwlpZiAocERldmljZS0+U2VuZEJkTGVmdC5jb3VudGVyID09IDApIHsKKwkJcFVtRGV2aWNlLT50eF9mdWxsID0gMTsKKwkJcHJpbnRmICgiYmNtNTcweEVuZFNlbmQ6IG5vIG1vcmUgVFggZGVzY3JpcHRvcnMhXG4iKTsKKwkJUVFfUHVzaEhlYWQgKCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsZW5ndGggPD0gMCkgeworCQlwcmludGYgKCJldGg6IGJhZCBwYWNrZXQgc2l6ZTogJWRcbiIsIGxlbmd0aCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEdldCBwYWNrZXQgYnVmZmVycyBhbmQgZnJhZ21lbnQgbGlzdCAqLwogCXBVbVBhY2tldCA9IChQVU1fUEFDS0VUKSBwUGFja2V0OwotI2lmIEVUX0RFQlVHCi0JcHJpbnRmKCJldGhfcng6IHBhY2tldCBAMHgleFxuIiwKLQkgICAgICAgKGludClwUGFja2V0KTsKLSNlbmRpZgotCS8qIElmIHRoZSBwYWNrZXQgZ2VuZXJhdGVkIGFuIGVycm9yLCByZXVzZSBidWZmZXIgKi8KLQlpZiAoKHBQYWNrZXQtPlBhY2tldFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgfHwKLQkgICAgKChzaXplID0gcFBhY2tldC0+UGFja2V0U2l6ZSkgPiBwRGV2aWNlLT5SeE10dSkpIHsKLQotCSAgICAvKiByZXVzZSBza2IgKi8KLQkgICAgUVFfUHVzaFRhaWwoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKLQkgICAgcHJpbnRmKCJldGhfcng6IGVycm9yIGluIHBhY2tldCBkbWEhXG4iKTsKLQkgICAgZ290byBiY201NzB4X3NlcnZpY2VfaXNyOworCS8qIFNpbmdsZSBETUEgRGVzY3JpcHRvciB0cmFuc21pdC4KKwkgKiBGcmFnbWVudHMgbWF5IGJlIHByb3ZpZGVkLCBidXQgb25lIERNQSBkZXNjcmlwdG9yIG1heCBpcworCSAqIHVzZWQgdG8gc2VuZCB0aGUgcGFja2V0LgorCSAqLworCWlmIChNTV9Db2FsZXNjZVR4QnVmZmVyIChwRGV2aWNlLCBwUGFja2V0KSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCQlpZiAocFVtUGFja2V0LT5za2J1ZmYgPT0gTlVMTCkgeworCQkJLyogUGFja2V0IHdhcyBkaXNjYXJkZWQgKi8KKwkJCXByaW50ZiAoIlRYOiBmYWlsZWQgKDEpXG4iKTsKKwkJCXN0YXR1cyA9IDE7CisJCX0gZWxzZSB7CisJCQlwcmludGYgKCJUWDogZmFpbGVkICgyKVxuIik7CisJCQlzdGF0dXMgPSAyOworCQl9CisJCVFRX1B1c2hIZWFkICgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCQlyZXR1cm4gc3RhdHVzOwogCX0KIAotCS8qIFNldCBzaXplIGFuZCBhZGRyZXNzICovCi0Jc2tiID0gcFVtUGFja2V0LT5za2J1ZmY7Ci0Jc2l6ZSA9IHBQYWNrZXQtPlBhY2tldFNpemU7CisJLyogQ29weSBwYWNrZXQgdG8gRE1BIGJ1ZmZlciAqLworCW1lbXNldCAocFVtUGFja2V0LT5za2J1ZmYsIDB4MCwgTUFYX1BBQ0tFVF9TSVpFKTsKKwltZW1jcHkgKCh2b2lkICopcFVtUGFja2V0LT5za2J1ZmYsICh2b2lkICopcGFja2V0LCBsZW5ndGgpOworCXBQYWNrZXQtPlBhY2tldFNpemUgPSBsZW5ndGg7CisJcFBhY2tldC0+RmxhZ3MgfD0gU05EX0JEX0ZMQUdfRU5EIHwgU05EX0JEX0ZMQUdfQ09BTF9OT1c7CisJcFBhY2tldC0+dS5UeC5GcmFnQ291bnQgPSAxOworCS8qIFdlJ3ZlIGFscmVhZHkgcHJvdmlkZWQgYSBmcmFtZSByZWFkeSBmb3IgdHJhbnNtaXNzaW9uICovCisJcFBhY2tldC0+RmxhZ3MgJj0gflNORF9CRF9GTEFHX1RDUF9VRFBfQ0tTVU07CiAKLQkvKiBQYXNzIHRoZSBwYWNrZXQgdXAgdG8gdGhlIHByb3RvY29sCi0JICogbGF5ZXJzLgotCSAqLwotCU5ldFJlY2VpdmUoc2tiLCBzaXplKTsKKwlpZiAoTE1fU2VuZFBhY2tldCAocERldmljZSwgcFBhY2tldCkgPT0gTE1fU1RBVFVTX0ZBSUxVUkUpIHsKKwkJLyoKKwkJICogIEEgbG93ZXIgbGV2ZWwgc2VuZCBmYWlsdXJlIHdpbGwgcHVzaCB0aGUgcGFja2V0IGRlc2NyaXB0b3IgYmFjaworCQkgKiAgaW4gdGhlIGZyZWUgcXVldWUsIHNvIGp1c3QgZGVhbCB3aXRoIHRoZSBWeFdvcmtzIGNsdXN0ZXJzLgorCQkgKi8KKwkJaWYgKHBVbVBhY2tldC0+c2tidWZmID09IE5VTEwpIHsKKwkJCXByaW50ZiAoIlRYIGZhaWxlZCAoMSkhXG4iKTsKKwkJCS8qIFBhY2tldCB3YXMgZGlzY2FyZGVkICovCisJCQlzdGF0dXMgPSAzOworCQl9IGVsc2UgeworCQkJLyogQSByZXNvdXJjZSBwcm9ibGVtIC4uLiAqLworCQkJcHJpbnRmICgiVFggZmFpbGVkICgyKSFcbiIpOworCQkJc3RhdHVzID0gNDsKKwkJfQogCi0JLyogRnJlZSBwYWNrZXQgYnVmZmVyICovCi0JYmNtNTcweFBrdEZyZWUgKHBVbURldmljZS0+aW5kZXgsIHNrYik7Ci0JcFVtUGFja2V0LT5za2J1ZmYgPSBOVUxMOworCQlpZiAoUVFfR2V0RW50cnlDbnQgKCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLkNvbnRhaW5lcikgPT0gMCkgeworCQkJcHJpbnRmICgiVFg6IGVtcHR5USFcbiIpOworCQkJcFVtRGV2aWNlLT50eF9mdWxsID0gMTsKKwkJfQorCX0KIAotCS8qIFJldXNlIFNLQiAqLwotCVFRX1B1c2hUYWlsKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisJd2hpbGUgKHBVbURldmljZS0+dHhfcGt0ID09IDApIHsKKwkJLyogU2VydmljZSBUWCAqLworCQlldGhfaXNyICgpOworCX0KKyNpZiBFVF9ERUJVRworCXByaW50ZiAoImV0aF9zZW5kOiAweCV4LCAlZCBieXRlc1xuIgorCQkiWyV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4XSAuLi5cbiIsCisJCShpbnQpcFBhY2tldCwgbGVuZ3RoLAorCQlwdHJbMF0sIHB0clsxXSwgcHRyWzJdLCBwdHJbM10sIHB0cls0XSwgcHRyWzVdLAorCQlwdHJbNl0sIHB0cls3XSwgcHRyWzhdLCBwdHJbOV0sIHB0clsxMF0sIHB0clsxMV0sIHB0clsxMl0sCisJCXB0clsxM10sIHB0clsxNF0sIHB0clsxNV0pOworI2VuZGlmCisJcFVtRGV2aWNlLT50eF9wa3QgPSAwOworCVFRX1B1c2hIZWFkICgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOwogCi0JcmV0dXJuIDA7IC8qIEdvdCBhIHBhY2tldCwgYmFpbCAuLi4gKi8KLSAgICB9Ci0gICAgcmV0dXJuIHNpemU7CisJLyogRG9uZSB3aXRoIHNlbmQgKi8KKyAgICAgIG91dDoKKwlyZXR1cm4gc3RhdHVzOwogfQogCisvKiBFdGhlcm5ldCByZWNlaXZlICovCitpbnQgZXRoX3J4ICh2b2lkKQoreworCVBMTV9QQUNLRVQgcFBhY2tldCA9IE5VTEw7CisJUFVNX1BBQ0tFVCBwVW1QYWNrZXQgPSBOVUxMOworCXZvaWQgKnNrYjsKKwlpbnQgc2l6ZSA9IDA7CisKKwl3aGlsZSAoVFJVRSkgeworCisJICAgICAgYmNtNTcweF9zZXJ2aWNlX2lzcjoKKwkJLyogUHVsbCBkb3duIHBhY2tldCBpZiBpdCBpcyB0aGVyZSAqLworCQlldGhfaXNyICgpOworCisJCS8qIEluZGljYXRlIFJYIHBhY2tldHMgY2FsbGVkICovCisJCWlmIChwVW1EZXZpY2UtPnJ4X3BrdCkgeworCQkJLyogcHJpbnRmKCJldGhfcng6IGdvdCBhIHBhY2tldC4uLlxuIik7ICovCisJCQlwVW1EZXZpY2UtPnJ4X3BrdCA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBwcmludGYoImV0aF9yeDogd2FpdGluZyBmb3IgcGFja2V0Li4uXG4iKTsgKi8KKwkJCWdvdG8gYmNtNTcweF9zZXJ2aWNlX2lzcjsKKwkJfQorCisJCXBQYWNrZXQgPSAoUExNX1BBQ0tFVCkKKwkJICAgIFFRX1BvcEhlYWQgKCZwRGV2aWNlLT5SeFBhY2tldFJlY2VpdmVkUS5Db250YWluZXIpOworCisJCWlmIChwUGFja2V0ID09IDApIHsKKwkJCXByaW50ZiAoImV0aF9yeDogZW1wdHkgcGFja2V0IVxuIik7CisJCQlnb3RvIGJjbTU3MHhfc2VydmljZV9pc3I7CisJCX0KKworCQlwVW1QYWNrZXQgPSAoUFVNX1BBQ0tFVCkgcFBhY2tldDsKKyNpZiBFVF9ERUJVRworCQlwcmludGYgKCJldGhfcng6IHBhY2tldCBAMHgleFxuIiwgKGludClwUGFja2V0KTsKKyNlbmRpZgorCQkvKiBJZiB0aGUgcGFja2V0IGdlbmVyYXRlZCBhbiBlcnJvciwgcmV1c2UgYnVmZmVyICovCisJCWlmICgocFBhY2tldC0+UGFja2V0U3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKSB8fAorCQkgICAgKChzaXplID0gcFBhY2tldC0+UGFja2V0U2l6ZSkgPiBwRGV2aWNlLT5SeE10dSkpIHsKKworCQkJLyogcmV1c2Ugc2tiICovCisJCQlRUV9QdXNoVGFpbCAoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLAorCQkJCSAgICAgcFBhY2tldCk7CisJCQlwcmludGYgKCJldGhfcng6IGVycm9yIGluIHBhY2tldCBkbWEhXG4iKTsKKwkJCWdvdG8gYmNtNTcweF9zZXJ2aWNlX2lzcjsKKwkJfQorCisJCS8qIFNldCBzaXplIGFuZCBhZGRyZXNzICovCisJCXNrYiA9IHBVbVBhY2tldC0+c2tidWZmOworCQlzaXplID0gcFBhY2tldC0+UGFja2V0U2l6ZTsKKworCQkvKiBQYXNzIHRoZSBwYWNrZXQgdXAgdG8gdGhlIHByb3RvY29sCisJCSAqIGxheWVycy4KKwkJICovCisJCU5ldFJlY2VpdmUgKHNrYiwgc2l6ZSk7CisKKwkJLyogRnJlZSBwYWNrZXQgYnVmZmVyICovCisJCWJjbTU3MHhQa3RGcmVlIChwVW1EZXZpY2UtPmluZGV4LCBza2IpOworCQlwVW1QYWNrZXQtPnNrYnVmZiA9IE5VTEw7CisKKwkJLyogUmV1c2UgU0tCICovCisJCVFRX1B1c2hUYWlsICgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCisJCXJldHVybiAwOwkvKiBHb3QgYSBwYWNrZXQsIGJhaWwgLi4uICovCisJfQorCXJldHVybiBzaXplOworfQogCiAvKiBTaHV0IGRvd24gZGV2aWNlICovCi12b2lkCi1ldGhfaGFsdCh2b2lkKQordm9pZCBldGhfaGFsdCAodm9pZCkKIHsKLSAgICBpbnQgaTsKLSAgICBpZiAoIGluaXRpYWxpemVkKQotICAgIGlmIChwRGV2aWNlICYmIHBVbURldmljZSAmJiBwVW1EZXZpY2UtPm9wZW5lZCl7Ci0JcHJpbnRmKCJcbmV0aCVkOiVzLCIsIHBVbURldmljZS0+aW5kZXgsIHBVbURldmljZS0+bmFtZSk7Ci0JcHJpbnRmKCJIQUxULCIpOwotCS8qIHN0b3AgZGV2aWNlICovCi0JTE1fSGFsdChwRGV2aWNlKTsKLQlwcmludGYoIlBPV0VSIERPV04sIik7Ci0JTE1fU2V0UG93ZXJTdGF0ZShwRGV2aWNlLCBMTV9QT1dFUl9TVEFURV9EMyk7CisJaW50IGk7CisJaWYgKGluaXRpYWxpemVkKQorCQlpZiAocERldmljZSAmJiBwVW1EZXZpY2UgJiYgcFVtRGV2aWNlLT5vcGVuZWQpIHsKKwkJCXByaW50ZiAoIlxuZXRoJWQ6JXMsIiwgcFVtRGV2aWNlLT5pbmRleCwKKwkJCQlwVW1EZXZpY2UtPm5hbWUpOworCQkJcHJpbnRmICgiSEFMVCwiKTsKKwkJCS8qIHN0b3AgZGV2aWNlICovCisJCQlMTV9IYWx0IChwRGV2aWNlKTsKKwkJCXByaW50ZiAoIlBPV0VSIERPV04sIik7CisJCQlMTV9TZXRQb3dlclN0YXRlIChwRGV2aWNlLCBMTV9QT1dFUl9TVEFURV9EMyk7CiAKLQkvKiBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBkZXZpY2UgaW4gdGlnb24zICovCi0JZm9yIChpID0gMDsgaSA8IHBVbURldmljZS0+bWVtX2xpc3RfbnVtOyBpKyspICB7Ci0JICAgIGlmIChwVW1EZXZpY2UtPm1lbV9saXN0W2ldKSAgewotCQkvKiBzYW5pdHkgY2hlY2sgKi8KLQkJaWYgKHBVbURldmljZS0+ZG1hX2xpc3RbaV0pIHsgIC8qIGNhY2hlLXNhZmUgbWVtb3J5ICovCi0JCSAgICBmcmVlKHBVbURldmljZS0+bWVtX2xpc3RbaV0pOwotCQl9IGVsc2UgewotCQkgICAgZnJlZShwVW1EZXZpY2UtPm1lbV9saXN0W2ldKTsgIC8qIG5vcm1hbCBtZW1vcnkgICAqLworCQkJLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgZGV2aWNlIGluIHRpZ29uMyAqLworCQkJZm9yIChpID0gMDsgaSA8IHBVbURldmljZS0+bWVtX2xpc3RfbnVtOyBpKyspIHsKKwkJCQlpZiAocFVtRGV2aWNlLT5tZW1fbGlzdFtpXSkgeworCQkJCQkvKiBzYW5pdHkgY2hlY2sgKi8KKwkJCQkJaWYgKHBVbURldmljZS0+ZG1hX2xpc3RbaV0pIHsJLyogY2FjaGUtc2FmZSBtZW1vcnkgKi8KKwkJCQkJCWZyZWUgKHBVbURldmljZS0+bWVtX2xpc3RbaV0pOworCQkJCQl9IGVsc2UgeworCQkJCQkJZnJlZSAocFVtRGV2aWNlLT5tZW1fbGlzdFtpXSk7CS8qIG5vcm1hbCBtZW1vcnkgICAqLworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcFVtRGV2aWNlLT5vcGVuZWQgPSAwOworCQkJZnJlZSAocERldmljZSk7CisJCQlwRGV2aWNlID0gTlVMTDsKKwkJCXBVbURldmljZSA9IE5VTEw7CisJCQlpbml0aWFsaXplZCA9IDA7CisJCQlwcmludGYgKCJkb25lIC0gb2ZmbGluZS5cbiIpOwogCQl9Ci0JICAgIH0KLQl9Ci0JcFVtRGV2aWNlLT5vcGVuZWQgPSAwOwotCWZyZWUocERldmljZSk7Ci0JcERldmljZSA9IE5VTEw7Ci0JcFVtRGV2aWNlID0gTlVMTDsKLQlpbml0aWFsaXplZCA9IDA7Ci0JcHJpbnRmKCJkb25lIC0gb2ZmbGluZS5cbiIpOwotICAgIH0KIH0KIAotCiAvKgogICoKICAqIE1pZGRsZSBNb2R1bGU6IEludGVyZmFjZSBiZXR3ZWVuIHRoZSBIVyBkcml2ZXIgKHRpZ29uMyBtb2R1bGVzKSBhbmQKQEAgLTg0Myw0MDkgKzgzNCwzODAgQEAKICAqLwogCiAvKiBNaWRkbGUgbW9kdWxlIGRlcGVuZGVuY3kgLSBzaXplIG9mIGEgcGFja2V0IGRlc2NyaXB0b3IgKi8KLWludCBNTV9QYWNrZXRfRGVzY19TaXplID0gc2l6ZW9mKFVNX1BBQ0tFVCk7Ci0KK2ludCBNTV9QYWNrZXRfRGVzY19TaXplID0gc2l6ZW9mIChVTV9QQUNLRVQpOwogCiBMTV9TVEFUVVMKLU1NX1JlYWRDb25maWczMihQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi0JCUxNX1VJTlQzMiBPZmZzZXQsCi0JCUxNX1VJTlQzMiAqcFZhbHVlMzIpCitNTV9SZWFkQ29uZmlnMzIgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkJIExNX1VJTlQzMiBPZmZzZXQsIExNX1VJTlQzMiAqIHBWYWx1ZTMyKQogewotICAgIFVNX0RFVklDRV9CTE9DSyAqcFVtRGV2aWNlOwotICAgIHBVbURldmljZSA9IChVTV9ERVZJQ0VfQkxPQ0sgKikgcERldmljZTsKLSAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocFVtRGV2aWNlLT5wZGV2LAotCQkJICBPZmZzZXQsICh1MzIgKikgcFZhbHVlMzIpOwotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1MTV9TVEFUVVMKLU1NX1dyaXRlQ29uZmlnMzIoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotCQkgTE1fVUlOVDMyIE9mZnNldCwKLQkJIExNX1VJTlQzMiBWYWx1ZTMyKQotewotICAgIFVNX0RFVklDRV9CTE9DSyAqcFVtRGV2aWNlOwotICAgIHBVbURldmljZSA9IChVTV9ERVZJQ0VfQkxPQ0sgKikgcERldmljZTsKLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBVbURldmljZS0+cGRldiwKLQkJCSAgIE9mZnNldCwgVmFsdWUzMik7Ci0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLUxNX1NUQVRVUwotTU1fUmVhZENvbmZpZzE2KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLQkJTE1fVUlOVDMyIE9mZnNldCwKLQkJTE1fVUlOVDE2ICpwVmFsdWUxNikKLXsKLSAgICBVTV9ERVZJQ0VfQkxPQ0sgKnBVbURldmljZTsKLSAgICBwVW1EZXZpY2UgPSAoVU1fREVWSUNFX0JMT0NLICopIHBEZXZpY2U7Ci0gICAgcGNpX3JlYWRfY29uZmlnX3dvcmQocFVtRGV2aWNlLT5wZGV2LAotCQkJIE9mZnNldCwgKHUxNiopIHBWYWx1ZTE2KTsKLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJVU1fREVWSUNFX0JMT0NLICpwVW1EZXZpY2U7CisJcFVtRGV2aWNlID0gKFVNX0RFVklDRV9CTE9DSyAqKSBwRGV2aWNlOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAocFVtRGV2aWNlLT5wZGV2LCBPZmZzZXQsICh1MzIgKikgcFZhbHVlMzIpOworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKIH0KIAogTE1fU1RBVFVTCi1NTV9Xcml0ZUNvbmZpZzE2KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLQkJIExNX1VJTlQzMiBPZmZzZXQsCi0JCSBMTV9VSU5UMTYgVmFsdWUxNikKK01NX1dyaXRlQ29uZmlnMzIgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE9mZnNldCwgTE1fVUlOVDMyIFZhbHVlMzIpCiB7Ci0gICAgVU1fREVWSUNFX0JMT0NLICpwVW1EZXZpY2U7Ci0gICAgcFVtRGV2aWNlID0gKFVNX0RFVklDRV9CTE9DSyAqKSBwRGV2aWNlOwotICAgIHBjaV93cml0ZV9jb25maWdfd29yZChwVW1EZXZpY2UtPnBkZXYsCi0JCQkgIE9mZnNldCwgVmFsdWUxNik7Ci0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLUxNX1NUQVRVUwotTU1fQWxsb2NhdGVTaGFyZWRNZW1vcnkoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQmxvY2tTaXplLAotCQkJUExNX1ZPSUQgKnBNZW1vcnlCbG9ja1ZpcnQsCi0JCQlQTE1fUEhZU0lDQUxfQUREUkVTUyBwTWVtb3J5QmxvY2tQaHksCi0JCQlMTV9CT09MIENhY2hlZCkKLXsKLSAgICBQTE1fVk9JRCBwdmlydDsKLSAgICBQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOwotICAgIGRtYV9hZGRyX3QgbWFwcGluZzsKLQotICAgIHB2aXJ0ID0gbWFsbG9jKEJsb2NrU2l6ZSk7Ci0gICAgbWFwcGluZyA9IChkbWFfYWRkcl90KShwdmlydCk7Ci0gICAgaWYgKCFwdmlydCkKLQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7Ci0KLSAgICBwVW1EZXZpY2UtPm1lbV9saXN0W3BVbURldmljZS0+bWVtX2xpc3RfbnVtXSA9IHB2aXJ0OwotICAgIHBVbURldmljZS0+ZG1hX2xpc3RbcFVtRGV2aWNlLT5tZW1fbGlzdF9udW1dID0gbWFwcGluZzsKLSAgICBwVW1EZXZpY2UtPm1lbV9zaXplX2xpc3RbcFVtRGV2aWNlLT5tZW1fbGlzdF9udW0rK10gPSBCbG9ja1NpemU7Ci0gICAgbWVtc2V0KHB2aXJ0LCAwLCBCbG9ja1NpemUpOwotCi0gICAgKnBNZW1vcnlCbG9ja1ZpcnQgPSAoUExNX1ZPSUQpIHB2aXJ0OwotICAgIE1NX1NldEFkZHIgKHBNZW1vcnlCbG9ja1BoeSwgKGRtYV9hZGRyX3QpIG1hcHBpbmcpOwotCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLUxNX1NUQVRVUwotTU1fQWxsb2NhdGVNZW1vcnkoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQmxvY2tTaXplLAotCVBMTV9WT0lEICpwTWVtb3J5QmxvY2tWaXJ0KQotewotICAgIFBMTV9WT0lEIHB2aXJ0OwotICAgIFBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7Ci0KLSAgICBwdmlydCA9IG1hbGxvYyhCbG9ja1NpemUpOwotCi0gICAgaWYgKCFwdmlydCkKLQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7Ci0KLSAgICBwVW1EZXZpY2UtPm1lbV9saXN0W3BVbURldmljZS0+bWVtX2xpc3RfbnVtXSA9IHB2aXJ0OwotICAgIHBVbURldmljZS0+ZG1hX2xpc3RbcFVtRGV2aWNlLT5tZW1fbGlzdF9udW1dID0gMDsKLSAgICBwVW1EZXZpY2UtPm1lbV9zaXplX2xpc3RbcFVtRGV2aWNlLT5tZW1fbGlzdF9udW0rK10gPSBCbG9ja1NpemU7Ci0gICAgbWVtc2V0KHB2aXJ0LCAwLCBCbG9ja1NpemUpOwotICAgICpwTWVtb3J5QmxvY2tWaXJ0ID0gcHZpcnQ7Ci0KLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJVU1fREVWSUNFX0JMT0NLICpwVW1EZXZpY2U7CisJcFVtRGV2aWNlID0gKFVNX0RFVklDRV9CTE9DSyAqKSBwRGV2aWNlOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKHBVbURldmljZS0+cGRldiwgT2Zmc2V0LCBWYWx1ZTMyKTsKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIExNX1NUQVRVUwotTU1fTWFwTWVtQmFzZShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCitNTV9SZWFkQ29uZmlnMTYgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkJIExNX1VJTlQzMiBPZmZzZXQsIExNX1VJTlQxNiAqIHBWYWx1ZTE2KQogewotICAgIHByaW50ZigiQkNNNTcweCBQQ0kgTWVtb3J5IGJhc2UgYWRkcmVzcyBAMHgleFxuIiwKLQkgICAodW5zaWduZWQgaW50KXBEZXZpY2UtPnBNYXBwZWRNZW1CYXNlKTsKLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJVU1fREVWSUNFX0JMT0NLICpwVW1EZXZpY2U7CisJcFVtRGV2aWNlID0gKFVNX0RFVklDRV9CTE9DSyAqKSBwRGV2aWNlOworCXBjaV9yZWFkX2NvbmZpZ193b3JkIChwVW1EZXZpY2UtPnBkZXYsIE9mZnNldCwgKHUxNiAqKSBwVmFsdWUxNik7CisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwogfQogCiBMTV9TVEFUVVMKLU1NX0luaXRpYWxpemVVbVBhY2tldHMoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQorTU1fV3JpdGVDb25maWcxNiAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgT2Zmc2V0LCBMTV9VSU5UMTYgVmFsdWUxNikKIHsKLSAgICBpbnQgaTsKLSAgICB2b2lkKiBza2I7Ci0gICAgUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKLSAgICBQVU1fUEFDS0VUIHBVbVBhY2tldCA9IE5VTEw7Ci0gICAgUExNX1BBQ0tFVCBwUGFja2V0ID0gTlVMTDsKKwlVTV9ERVZJQ0VfQkxPQ0sgKnBVbURldmljZTsKKwlwVW1EZXZpY2UgPSAoVU1fREVWSUNFX0JMT0NLICopIHBEZXZpY2U7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkIChwVW1EZXZpY2UtPnBkZXYsIE9mZnNldCwgVmFsdWUxNik7CisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQogCi0gICAgZm9yIChpID0gMDsgaSA8IHBEZXZpY2UtPlJ4UGFja2V0RGVzY0NudDsgaSsrKSB7Ci0JcFBhY2tldCA9IFFRX1BvcEhlYWQoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyKTsKLQlwVW1QYWNrZXQgPSAoUFVNX1BBQ0tFVCkgcFBhY2tldDsKK0xNX1NUQVRVUworTU1fQWxsb2NhdGVTaGFyZWRNZW1vcnkgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIEJsb2NrU2l6ZSwKKwkJCSBQTE1fVk9JRCAqIHBNZW1vcnlCbG9ja1ZpcnQsCisJCQkgUExNX1BIWVNJQ0FMX0FERFJFU1MgcE1lbW9yeUJsb2NrUGh5LCBMTV9CT09MIENhY2hlZCkKK3sKKwlQTE1fVk9JRCBwdmlydDsKKwlQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOworCWRtYV9hZGRyX3QgbWFwcGluZzsKIAotCWlmIChwUGFja2V0ID09IDApIHsKLQkgICAgcHJpbnRmKCJNTV9Jbml0aWFsaXplVW1QYWNrZXRzOiBCYWQgUnhQYWNrZXRGcmVlUVxuIik7CisJcHZpcnQgPSBtYWxsb2MgKEJsb2NrU2l6ZSk7CisJbWFwcGluZyA9IChkbWFfYWRkcl90KSAocHZpcnQpOworCWlmICghcHZpcnQpCisJCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKworCXBVbURldmljZS0+bWVtX2xpc3RbcFVtRGV2aWNlLT5tZW1fbGlzdF9udW1dID0gcHZpcnQ7CisJcFVtRGV2aWNlLT5kbWFfbGlzdFtwVW1EZXZpY2UtPm1lbV9saXN0X251bV0gPSBtYXBwaW5nOworCXBVbURldmljZS0+bWVtX3NpemVfbGlzdFtwVW1EZXZpY2UtPm1lbV9saXN0X251bSsrXSA9IEJsb2NrU2l6ZTsKKwltZW1zZXQgKHB2aXJ0LCAwLCBCbG9ja1NpemUpOworCisJKnBNZW1vcnlCbG9ja1ZpcnQgPSAoUExNX1ZPSUQpIHB2aXJ0OworCU1NX1NldEFkZHIgKHBNZW1vcnlCbG9ja1BoeSwgKGRtYV9hZGRyX3QpIG1hcHBpbmcpOworCisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCitMTV9TVEFUVVMKK01NX0FsbG9jYXRlTWVtb3J5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBCbG9ja1NpemUsCisJCSAgIFBMTV9WT0lEICogcE1lbW9yeUJsb2NrVmlydCkKK3sKKwlQTE1fVk9JRCBwdmlydDsKKwlQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOworCisJcHZpcnQgPSBtYWxsb2MgKEJsb2NrU2l6ZSk7CisKKwlpZiAoIXB2aXJ0KQorCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisKKwlwVW1EZXZpY2UtPm1lbV9saXN0W3BVbURldmljZS0+bWVtX2xpc3RfbnVtXSA9IHB2aXJ0OworCXBVbURldmljZS0+ZG1hX2xpc3RbcFVtRGV2aWNlLT5tZW1fbGlzdF9udW1dID0gMDsKKwlwVW1EZXZpY2UtPm1lbV9zaXplX2xpc3RbcFVtRGV2aWNlLT5tZW1fbGlzdF9udW0rK10gPSBCbG9ja1NpemU7CisJbWVtc2V0IChwdmlydCwgMCwgQmxvY2tTaXplKTsKKwkqcE1lbW9yeUJsb2NrVmlydCA9IHB2aXJ0OworCisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCitMTV9TVEFUVVMgTU1fTWFwTWVtQmFzZSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQoreworCXByaW50ZiAoIkJDTTU3MHggUENJIE1lbW9yeSBiYXNlIGFkZHJlc3MgQDB4JXhcbiIsCisJCSh1bnNpZ25lZCBpbnQpcERldmljZS0+cE1hcHBlZE1lbUJhc2UpOworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30KKworTE1fU1RBVFVTIE1NX0luaXRpYWxpemVVbVBhY2tldHMgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKwlpbnQgaTsKKwl2b2lkICpza2I7CisJUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKKwlQVU1fUEFDS0VUIHBVbVBhY2tldCA9IE5VTEw7CisJUExNX1BBQ0tFVCBwUGFja2V0ID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBwRGV2aWNlLT5SeFBhY2tldERlc2NDbnQ7IGkrKykgeworCQlwUGFja2V0ID0gUVFfUG9wSGVhZCAoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyKTsKKwkJcFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpIHBQYWNrZXQ7CisKKwkJaWYgKHBQYWNrZXQgPT0gMCkgeworCQkJcHJpbnRmICgiTU1fSW5pdGlhbGl6ZVVtUGFja2V0czogQmFkIFJ4UGFja2V0RnJlZVFcbiIpOworCQl9CisKKwkJc2tiID0gYmNtNTcweFBrdEFsbG9jIChwVW1EZXZpY2UtPmluZGV4LAorCQkJCSAgICAgICBwUGFja2V0LT51LlJ4LlJ4QnVmZmVyU2l6ZSArIDIpOworCisJCWlmIChza2IgPT0gMCkgeworCQkJcFVtUGFja2V0LT5za2J1ZmYgPSAwOworCQkJUVFfUHVzaFRhaWwgKCZwVW1EZXZpY2UtPnJ4X291dF9vZl9idWZfcS5Db250YWluZXIsCisJCQkJICAgICBwUGFja2V0KTsKKwkJCXByaW50ZiAoIk1NX0luaXRpYWxpemVVbVBhY2tldHM6IG91dCBvZiBidWZmZXIuXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcFVtUGFja2V0LT5za2J1ZmYgPSBza2I7CisJCVFRX1B1c2hUYWlsICgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOwogCX0KIAotCXNrYiA9IGJjbTU3MHhQa3RBbGxvYyhwVW1EZXZpY2UtPmluZGV4LAotCQkJICAgICAgcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclNpemUgKyAyKTsKKwlwVW1EZXZpY2UtPnJ4X2xvd19idWZfdGhyZXNoID0gcERldmljZS0+UnhQYWNrZXREZXNjQ250IC8gODsKIAotCWlmIChza2IgPT0gMCkgewotCSAgICBwVW1QYWNrZXQtPnNrYnVmZiA9IDA7Ci0JICAgIFFRX1B1c2hUYWlsKCZwVW1EZXZpY2UtPnJ4X291dF9vZl9idWZfcS5Db250YWluZXIsIHBQYWNrZXQpOwotCSAgICBwcmludGYoIk1NX0luaXRpYWxpemVVbVBhY2tldHM6IG91dCBvZiBidWZmZXIuXG4iKTsKLQkgICAgY29udGludWU7Ci0JfQotCi0JcFVtUGFja2V0LT5za2J1ZmYgPSBza2I7Ci0JUVFfUHVzaFRhaWwoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKLSAgICB9Ci0KLSAgICBwVW1EZXZpY2UtPnJ4X2xvd19idWZfdGhyZXNoID0gcERldmljZS0+UnhQYWNrZXREZXNjQ250IC8gODsKLQotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLUxNX1NUQVRVUwotTU1fR2V0Q29uZmlnKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK0xNX1NUQVRVUyBNTV9HZXRDb25maWcgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKIHsKLSAgICBQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOwotICAgIGludCBpbmRleCA9IHBEZXZpY2UtPmluZGV4OworCVBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7CisJaW50IGluZGV4ID0gcERldmljZS0+aW5kZXg7CiAKLSAgICBpZiAoYXV0b19zcGVlZFtpbmRleF0gPT0gMCkKLQlwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9IFRSVUU7Ci0gICAgZWxzZQotCXBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID0gRkFMU0U7Ci0KLSAgICBpZiAobGluZV9zcGVlZFtpbmRleF0gPT0gMCkgewotCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9Ci0JICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0FVVE87Ci0JcERldmljZS0+RGlzYWJsZUF1dG9OZWcgPSBGQUxTRTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JaWYgKGxpbmVfc3BlZWRbaW5kZXhdID09IDEwMDApIHsKLQkgICAgaWYgKHBEZXZpY2UtPkVuYWJsZVRiaSkgewotCQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPQotCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfRklCRVJfMTAwME1CUFNfRlVMTF9EVVBMRVg7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoZnVsbF9kdXBsZXhbaW5kZXhdKSB7Ci0JCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9Ci0JCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTAwME1CUFNfRlVMTF9EVVBMRVg7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9Ci0JCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTAwME1CUFM7Ci0JICAgIH0KLQkgICAgaWYgKCFwRGV2aWNlLT5FbmFibGVUYmkpCisJaWYgKGF1dG9fc3BlZWRbaW5kZXhdID09IDApCisJCXBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID0gVFJVRTsKKwllbHNlCiAJCXBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID0gRkFMU0U7CisKKwlpZiAobGluZV9zcGVlZFtpbmRleF0gPT0gMCkgeworCQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9BVVRPOworCQlwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9IEZBTFNFOworCX0gZWxzZSB7CisJCWlmIChsaW5lX3NwZWVkW2luZGV4XSA9PSAxMDAwKSB7CisJCQlpZiAocERldmljZS0+RW5hYmxlVGJpKSB7CisJCQkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KKwkJCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfRklCRVJfMTAwME1CUFNfRlVMTF9EVVBMRVg7CisJCQl9IGVsc2UgaWYgKGZ1bGxfZHVwbGV4W2luZGV4XSkgeworCQkJCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9CisJCQkJICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xMDAwTUJQU19GVUxMX0RVUExFWDsKKwkJCX0gZWxzZSB7CisJCQkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KKwkJCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwMDBNQlBTOworCQkJfQorCQkJaWYgKCFwRGV2aWNlLT5FbmFibGVUYmkpCisJCQkJcERldmljZS0+RGlzYWJsZUF1dG9OZWcgPSBGQUxTRTsKKwkJfSBlbHNlIGlmIChsaW5lX3NwZWVkW2luZGV4XSA9PSAxMDApIHsKKwkJCWlmIChmdWxsX2R1cGxleFtpbmRleF0pIHsKKwkJCQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPQorCQkJCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTAwTUJQU19GVUxMX0RVUExFWDsKKwkJCX0gZWxzZSB7CisJCQkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KKwkJCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwME1CUFM7CisJCQl9CisJCX0gZWxzZSBpZiAobGluZV9zcGVlZFtpbmRleF0gPT0gMTApIHsKKwkJCWlmIChmdWxsX2R1cGxleFtpbmRleF0pIHsKKwkJCQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPQorCQkJCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTBNQlBTX0ZVTExfRFVQTEVYOworCQkJfSBlbHNlIHsKKwkJCQlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPQorCQkJCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTBNQlBTOworCQkJfQorCQl9IGVsc2UgeworCQkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KKwkJCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9BVVRPOworCQkJcERldmljZS0+RGlzYWJsZUF1dG9OZWcgPSBGQUxTRTsKKwkJfQorCiAJfQotCWVsc2UgaWYgKGxpbmVfc3BlZWRbaW5kZXhdID09IDEwMCkgewotCSAgICBpZiAoZnVsbF9kdXBsZXhbaW5kZXhdKSB7Ci0JCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9Ci0JCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTAwTUJQU19GVUxMX0RVUExFWDsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KLQkJICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xMDBNQlBTOwotCSAgICB9CisJcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgPSAwOworCWlmIChyeF9mbG93X2NvbnRyb2xbaW5kZXhdICE9IDApIHsKKwkJcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgfD0gTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0U7CiAJfQotCWVsc2UgaWYgKGxpbmVfc3BlZWRbaW5kZXhdID09IDEwKSB7Ci0JICAgIGlmIChmdWxsX2R1cGxleFtpbmRleF0pIHsKLQkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0KLQkJICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xME1CUFNfRlVMTF9EVVBMRVg7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9Ci0JCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTBNQlBTOwotCSAgICB9CisJaWYgKHR4X2Zsb3dfY29udHJvbFtpbmRleF0gIT0gMCkgeworCQlwRGV2aWNlLT5GbG93Q29udHJvbENhcCB8PSBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0U7CiAJfQotCWVsc2UgewotCSAgICBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPQotCQlMTV9SRVFVRVNURURfTUVESUFfVFlQRV9BVVRPOwotCSAgICBwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9IEZBTFNFOworCWlmICgoYXV0b19mbG93X2NvbnRyb2xbaW5kZXhdICE9IDApICYmCisJICAgIChwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9PSBGQUxTRSkpIHsKKworCQlwRGV2aWNlLT5GbG93Q29udHJvbENhcCB8PSBMTV9GTE9XX0NPTlRST0xfQVVUT19QQVVTRTsKKwkJaWYgKCh0eF9mbG93X2NvbnRyb2xbaW5kZXhdID09IDApICYmCisJCSAgICAocnhfZmxvd19jb250cm9sW2luZGV4XSA9PSAwKSkgeworCQkJcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgfD0KKwkJCSAgICBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0UgfAorCQkJICAgIExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFOworCQl9CiAJfQogCi0gICAgfQotICAgIHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwID0gMDsKLSAgICBpZiAocnhfZmxvd19jb250cm9sW2luZGV4XSAhPSAwKSB7Ci0JcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgfD0gTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0U7Ci0gICAgfQotICAgIGlmICh0eF9mbG93X2NvbnRyb2xbaW5kZXhdICE9IDApIHsKLQlwRGV2aWNlLT5GbG93Q29udHJvbENhcCB8PSBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0U7Ci0gICAgfQotICAgIGlmICgoYXV0b19mbG93X2NvbnRyb2xbaW5kZXhdICE9IDApICYmCi0JKHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID09IEZBTFNFKSkgewotCi0JcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgfD0gTE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0U7Ci0JaWYgKCh0eF9mbG93X2NvbnRyb2xbaW5kZXhdID09IDApICYmCi0JICAgIChyeF9mbG93X2NvbnRyb2xbaW5kZXhdID09IDApKSB7Ci0JICAgIHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwIHw9Ci0JCUxNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSB8Ci0JCUxNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFOwotCX0KLSAgICB9Ci0KLSAgICAvKiBEZWZhdWx0IE1UVSBmb3Igbm93ICovCi0gICAgcFVtRGV2aWNlLT5tdHUgPSAxNTAwOworCS8qIERlZmF1bHQgTVRVIGZvciBub3cgKi8KKwlwVW1EZXZpY2UtPm10dSA9IDE1MDA7CiAKICNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCi0gICAgaWYgKHBVbURldmljZS0+bXR1ID4gMTUwMCkgewotCXBEZXZpY2UtPlJ4TXR1ID0gcFVtRGV2aWNlLT5tdHU7Ci0JcERldmljZS0+UnhKdW1ib0Rlc2NDbnQgPSBERUZBVUxUX0pVTUJPX1JDVl9ERVNDX0NPVU5UOwotICAgIH0KLSAgICBlbHNlIHsKLQlwRGV2aWNlLT5SeEp1bWJvRGVzY0NudCA9IDA7Ci0gICAgfQotICAgIHBEZXZpY2UtPlJ4SnVtYm9EZXNjQ250ID0gcnhfanVtYm9fZGVzY19jbnRbaW5kZXhdOworCWlmIChwVW1EZXZpY2UtPm10dSA+IDE1MDApIHsKKwkJcERldmljZS0+UnhNdHUgPSBwVW1EZXZpY2UtPm10dTsKKwkJcERldmljZS0+UnhKdW1ib0Rlc2NDbnQgPSBERUZBVUxUX0pVTUJPX1JDVl9ERVNDX0NPVU5UOworCX0gZWxzZSB7CisJCXBEZXZpY2UtPlJ4SnVtYm9EZXNjQ250ID0gMDsKKwl9CisJcERldmljZS0+UnhKdW1ib0Rlc2NDbnQgPSByeF9qdW1ib19kZXNjX2NudFtpbmRleF07CiAjZWxzZQotICAgIHBEZXZpY2UtPlJ4TXR1ID0gcFVtRGV2aWNlLT5tdHU7CisJcERldmljZS0+UnhNdHUgPSBwVW1EZXZpY2UtPm10dTsKICNlbmRpZgogCi0gICAgaWYgKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkgewotCXBEZXZpY2UtPlVzZVRhZ2dlZFN0YXR1cyA9IFRSVUU7Ci0JcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbCA9IENGR19IWjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcFVtRGV2aWNlLT50aW1lcl9pbnRlcnZhbCA9IENGR19IWi81MDsKLSAgICB9Ci0KLSAgICBwRGV2aWNlLT5UeFBhY2tldERlc2NDbnQgPSB0eF9wa3RfZGVzY19jbnRbaW5kZXhdOwotICAgIHBEZXZpY2UtPlJ4U3RkRGVzY0NudCA9IHJ4X3N0ZF9kZXNjX2NudFtpbmRleF07Ci0gICAgLyogTm90ZTogIGFkYXB0aXZlIGNvYWxlc2NlbmNlIHJlYWxseSBpc24ndCBhZGFwdGl2ZSBpbiB0aGlzIGRyaXZlciAqLwotICAgIHBVbURldmljZS0+cnhfYWRhcHRpdmVfY29hbGVzY2UgPSByeF9hZGFwdGl2ZV9jb2FsZXNjZVtpbmRleF07Ci0gICAgaWYgKCFwVW1EZXZpY2UtPnJ4X2FkYXB0aXZlX2NvYWxlc2NlKSB7Ci0JcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3MgPSByeF9jb2FsZXNjZV90aWNrc1tpbmRleF07Ci0JaWYgKHBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzID4gTUFYX1JYX0NPQUxFU0NJTkdfVElDS1MpCi0JICAgIHBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzID0gTUFYX1JYX0NPQUxFU0NJTkdfVElDS1M7Ci0JcFVtRGV2aWNlLT5yeF9jdXJyX2NvYWxlc2NlX3RpY2tzID1wRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrczsKLQotCXBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzID0gcnhfbWF4X2NvYWxlc2NlX2ZyYW1lc1tpbmRleF07Ci0JaWYgKHBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzPk1BWF9SWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUykKLQkgICAgcERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXMgPQotCQkJCU1BWF9SWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUzsKLQlwVW1EZXZpY2UtPnJ4X2N1cnJfY29hbGVzY2VfZnJhbWVzID0KLQkgICAgcERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXM7Ci0JcERldmljZS0+U3RhdHNDb2FsZXNjaW5nVGlja3MgPSBzdGF0c19jb2FsZXNjZV90aWNrc1tpbmRleF07Ci0JaWYgKHBEZXZpY2UtPlN0YXRzQ29hbGVzY2luZ1RpY2tzPk1BWF9TVEFUU19DT0FMRVNDSU5HX1RJQ0tTKQotCSAgICBwRGV2aWNlLT5TdGF0c0NvYWxlc2NpbmdUaWNrcz0KLQkJTUFYX1NUQVRTX0NPQUxFU0NJTkdfVElDS1M7Ci0JfQotCWVsc2UgewotCSAgICBwVW1EZXZpY2UtPnJ4X2N1cnJfY29hbGVzY2VfZnJhbWVzID0KLQkJREVGQVVMVF9SWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUzsKLQkgICAgcFVtRGV2aWNlLT5yeF9jdXJyX2NvYWxlc2NlX3RpY2tzID0KLQkJREVGQVVMVF9SWF9DT0FMRVNDSU5HX1RJQ0tTOwotCX0KLSAgICBwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrcyA9IHR4X2NvYWxlc2NlX3RpY2tzW2luZGV4XTsKLSAgICBpZiAocERldmljZS0+VHhDb2FsZXNjaW5nVGlja3MgPiBNQVhfVFhfQ09BTEVTQ0lOR19USUNLUykKLQlwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrcyA9IE1BWF9UWF9DT0FMRVNDSU5HX1RJQ0tTOwotICAgIHBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzID0gdHhfbWF4X2NvYWxlc2NlX2ZyYW1lc1tpbmRleF07Ci0gICAgaWYgKHBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzID4gTUFYX1RYX01BWF9DT0FMRVNDRURfRlJBTUVTKQotCXBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzID0gTUFYX1RYX01BWF9DT0FMRVNDRURfRlJBTUVTOwotCi0gICAgaWYgKGVuYWJsZV93b2xbaW5kZXhdKSB7Ci0JcERldmljZS0+V2FrZVVwTW9kZUNhcCA9IExNX1dBS0VfVVBfTU9ERV9NQUdJQ19QQUNLRVQ7Ci0JcERldmljZS0+V2FrZVVwTW9kZSA9IExNX1dBS0VfVVBfTU9ERV9NQUdJQ19QQUNLRVQ7Ci0gICAgfQotICAgIHBEZXZpY2UtPk5pY1NlbmRCZCA9IFRSVUU7Ci0KLSAgICAvKiBEb24ndCB1cGRhdGUgc3RhdHVzIGJsb2NrcyBkdXJpbmcgaW50ZXJydXB0ICovCi0gICAgcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPSAwOwotICAgIHBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID0gMDsKLQotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLQotfQotCi0KLUxNX1NUQVRVUwotTU1fU3RhcnRUeERtYShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9QQUNLRVQgcFBhY2tldCkKLXsKLSAgICBQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOwotICAgIHByaW50ZigiU3RhcnQgVFggRE1BOiBkZXY9JWQgcGFja2V0IEAweCV4XG4iLAotCSAgIChpbnQpcFVtRGV2aWNlLT5pbmRleCwgKHVuc2lnbmVkIGludClwUGFja2V0KTsKLQotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotTE1fU1RBVFVTCi1NTV9Db21wbGV0ZVR4RG1hKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KQotewotICAgIFBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7Ci0gICAgcHJpbnRmKCJDb21wbGV0ZSBUWCBETUE6IGRldj0lZCBwYWNrZXQgQDB4JXhcbiIsCi0JICAgKGludClwVW1EZXZpY2UtPmluZGV4LCAodW5zaWduZWQgaW50KXBQYWNrZXQpOwotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1MTV9TVEFUVVMKLU1NX0luZGljYXRlU3RhdHVzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fU1RBVFVTIFN0YXR1cykKLXsKLSAgICBjaGFyIGJ1ZlsxMjhdOwotICAgIGNoYXIgbGNkWzRdOwotICAgIFBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7Ci0gICAgTE1fRkxPV19DT05UUk9MIGZsb3dfY29udHJvbDsKLQotICAgIHBVbURldmljZS0+ZGVsYXllZF9saW5rX2luZCA9IDA7Ci0gICAgbWVtc2V0KGxjZCwgMHgwLCA0KTsKLQotICAgIGlmIChTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfRE9XTikgewotCXNwcmludGYoYnVmLCJldGglZDogJXM6IE5JQyBMaW5rIGlzIGRvd25cbiIsCi0JCXBVbURldmljZS0+aW5kZXgscFVtRGV2aWNlLT5uYW1lKTsKLQlsY2RbMF0gPSAnTCc7bGNkWzFdPSdOJztsY2RbMl09J0snO2xjZFszXSA9ICc/JzsKLSAgICB9IGVsc2UgaWYgKFN0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19BQ1RJVkUpIHsKLQlzcHJpbnRmKGJ1ZiwiZXRoJWQ6JXM6ICIsIHBVbURldmljZS0+aW5kZXgsIHBVbURldmljZS0+bmFtZSk7Ci0KLQlpZiAocERldmljZS0+TGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTAwME1CUFMpewotCSAgICBzdHJjYXQoYnVmLCIxMDAwIE1icHMgIik7Ci0JICAgIGxjZFswXSA9ICcxJztsY2RbMV09J0cnO2xjZFsyXT0nQic7Ci0JfSBlbHNlIGlmIChwRGV2aWNlLT5MaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xMDBNQlBTKXsKLQkgICAgc3RyY2F0KGJ1ZiwiMTAwIE1icHMgIik7Ci0JICAgIGxjZFswXSA9ICcxJztsY2RbMV09JzAnO2xjZFsyXT0nMCc7Ci0JfSBlbHNlIGlmIChwRGV2aWNlLT5MaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xME1CUFMpewotCSAgICBzdHJjYXQoYnVmLCIxMCBNYnBzICIpOwotCSAgICBsY2RbMF0gPSAnMSc7bGNkWzFdPScwJztsY2RbMl09JyAnOwotCX0KLQlpZiAocERldmljZS0+RHVwbGV4TW9kZSA9PSBMTV9EVVBMRVhfTU9ERV9GVUxMKXsKLQkgICAgc3RyY2F0KGJ1ZiwgImZ1bGwgZHVwbGV4Iik7Ci0JICAgIGxjZFszXSA9ICdGJzsKKwlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkgeworCQlwRGV2aWNlLT5Vc2VUYWdnZWRTdGF0dXMgPSBUUlVFOworCQlwVW1EZXZpY2UtPnRpbWVyX2ludGVydmFsID0gQ0ZHX0haOwogCX0gZWxzZSB7Ci0JICAgIHN0cmNhdChidWYsICJoYWxmIGR1cGxleCIpOwotCSAgICBsY2RbM10gPSAnSCc7CisJCXBVbURldmljZS0+dGltZXJfaW50ZXJ2YWwgPSBDRkdfSFogLyA1MDsKIAl9Ci0Jc3RyY2F0KGJ1ZiwgIiBsaW5rIHVwIik7CiAKLQlmbG93X2NvbnRyb2wgPSBwRGV2aWNlLT5GbG93Q29udHJvbCAmCi0JICAgIChMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRSB8Ci0JICAgICBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0UpOworCXBEZXZpY2UtPlR4UGFja2V0RGVzY0NudCA9IHR4X3BrdF9kZXNjX2NudFtpbmRleF07CisJcERldmljZS0+UnhTdGREZXNjQ250ID0gcnhfc3RkX2Rlc2NfY250W2luZGV4XTsKKwkvKiBOb3RlOiAgYWRhcHRpdmUgY29hbGVzY2VuY2UgcmVhbGx5IGlzbid0IGFkYXB0aXZlIGluIHRoaXMgZHJpdmVyICovCisJcFVtRGV2aWNlLT5yeF9hZGFwdGl2ZV9jb2FsZXNjZSA9IHJ4X2FkYXB0aXZlX2NvYWxlc2NlW2luZGV4XTsKKwlpZiAoIXBVbURldmljZS0+cnhfYWRhcHRpdmVfY29hbGVzY2UpIHsKKwkJcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3MgPSByeF9jb2FsZXNjZV90aWNrc1tpbmRleF07CisJCWlmIChwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrcyA+IE1BWF9SWF9DT0FMRVNDSU5HX1RJQ0tTKQorCQkJcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3MgPSBNQVhfUlhfQ09BTEVTQ0lOR19USUNLUzsKKwkJcFVtRGV2aWNlLT5yeF9jdXJyX2NvYWxlc2NlX3RpY2tzID0gcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3M7CiAKLQlpZiAoZmxvd19jb250cm9sKSB7Ci0JICAgIGlmIChmbG93X2NvbnRyb2wgJiBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRSkgewotCQlzdHJjYXQoYnVmLCIsIHJlY2VpdmUgIik7Ci0JCWlmIChmbG93X2NvbnRyb2wgJiBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0UpCi0JCSAgICBzdHJjYXQoYnVmLCIgJiB0cmFuc21pdCAiKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJc3RyY2F0KGJ1ZiwiLCB0cmFuc21pdCAiKTsKLQkgICAgfQotCSAgICBzdHJjYXQoYnVmLCJmbG93IGNvbnRyb2wgT04iKTsKKwkJcERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXMgPSByeF9tYXhfY29hbGVzY2VfZnJhbWVzW2luZGV4XTsKKwkJaWYgKHBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzID4gTUFYX1JYX01BWF9DT0FMRVNDRURfRlJBTUVTKQorCQkJcERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXMgPQorCQkJICAgIE1BWF9SWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUzsKKwkJcFVtRGV2aWNlLT5yeF9jdXJyX2NvYWxlc2NlX2ZyYW1lcyA9CisJCSAgICBwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lczsKKwkJcERldmljZS0+U3RhdHNDb2FsZXNjaW5nVGlja3MgPSBzdGF0c19jb2FsZXNjZV90aWNrc1tpbmRleF07CisJCWlmIChwRGV2aWNlLT5TdGF0c0NvYWxlc2NpbmdUaWNrcyA+IE1BWF9TVEFUU19DT0FMRVNDSU5HX1RJQ0tTKQorCQkJcERldmljZS0+U3RhdHNDb2FsZXNjaW5nVGlja3MgPQorCQkJICAgIE1BWF9TVEFUU19DT0FMRVNDSU5HX1RJQ0tTOwogCX0gZWxzZSB7Ci0JICAgIHN0cmNhdChidWYsICIsIGZsb3cgY29udHJvbCBPRkYiKTsKKwkJcFVtRGV2aWNlLT5yeF9jdXJyX2NvYWxlc2NlX2ZyYW1lcyA9CisJCSAgICBERUZBVUxUX1JYX01BWF9DT0FMRVNDRURfRlJBTUVTOworCQlwVW1EZXZpY2UtPnJ4X2N1cnJfY29hbGVzY2VfdGlja3MgPSBERUZBVUxUX1JYX0NPQUxFU0NJTkdfVElDS1M7CiAJfQotCXN0cmNhdChidWYsIlxuIik7Ci0JcHJpbnRmKCIlcyIsYnVmKTsKLSAgICB9CisJcERldmljZS0+VHhDb2FsZXNjaW5nVGlja3MgPSB0eF9jb2FsZXNjZV90aWNrc1tpbmRleF07CisJaWYgKHBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzID4gTUFYX1RYX0NPQUxFU0NJTkdfVElDS1MpCisJCXBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzID0gTUFYX1RYX0NPQUxFU0NJTkdfVElDS1M7CisJcERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXMgPSB0eF9tYXhfY29hbGVzY2VfZnJhbWVzW2luZGV4XTsKKwlpZiAocERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXMgPiBNQVhfVFhfTUFYX0NPQUxFU0NFRF9GUkFNRVMpCisJCXBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzID0gTUFYX1RYX01BWF9DT0FMRVNDRURfRlJBTUVTOworCisJaWYgKGVuYWJsZV93b2xbaW5kZXhdKSB7CisJCXBEZXZpY2UtPldha2VVcE1vZGVDYXAgPSBMTV9XQUtFX1VQX01PREVfTUFHSUNfUEFDS0VUOworCQlwRGV2aWNlLT5XYWtlVXBNb2RlID0gTE1fV0FLRV9VUF9NT0RFX01BR0lDX1BBQ0tFVDsKKwl9CisJcERldmljZS0+TmljU2VuZEJkID0gVFJVRTsKKworCS8qIERvbid0IHVwZGF0ZSBzdGF0dXMgYmxvY2tzIGR1cmluZyBpbnRlcnJ1cHQgKi8KKwlwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9IDA7CisJcERldmljZS0+VHhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPSAwOworCisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCit9CisKK0xNX1NUQVRVUyBNTV9TdGFydFR4RG1hIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9QQUNLRVQgcFBhY2tldCkKK3sKKwlQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOworCXByaW50ZiAoIlN0YXJ0IFRYIERNQTogZGV2PSVkIHBhY2tldCBAMHgleFxuIiwKKwkJKGludClwVW1EZXZpY2UtPmluZGV4LCAodW5zaWduZWQgaW50KXBQYWNrZXQpOworCisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQorCitMTV9TVEFUVVMgTU1fQ29tcGxldGVUeERtYSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpCit7CisJUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKKwlwcmludGYgKCJDb21wbGV0ZSBUWCBETUE6IGRldj0lZCBwYWNrZXQgQDB4JXhcbiIsCisJCShpbnQpcFVtRGV2aWNlLT5pbmRleCwgKHVuc2lnbmVkIGludClwUGFja2V0KTsKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9CisKK0xNX1NUQVRVUyBNTV9JbmRpY2F0ZVN0YXR1cyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9TVEFUVVMgU3RhdHVzKQoreworCWNoYXIgYnVmWzEyOF07CisJY2hhciBsY2RbNF07CisJUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKKwlMTV9GTE9XX0NPTlRST0wgZmxvd19jb250cm9sOworCisJcFVtRGV2aWNlLT5kZWxheWVkX2xpbmtfaW5kID0gMDsKKwltZW1zZXQgKGxjZCwgMHgwLCA0KTsKKworCWlmIChTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfRE9XTikgeworCQlzcHJpbnRmIChidWYsICJldGglZDogJXM6IE5JQyBMaW5rIGlzIGRvd25cbiIsCisJCQkgcFVtRGV2aWNlLT5pbmRleCwgcFVtRGV2aWNlLT5uYW1lKTsKKwkJbGNkWzBdID0gJ0wnOworCQlsY2RbMV0gPSAnTic7CisJCWxjZFsyXSA9ICdLJzsKKwkJbGNkWzNdID0gJz8nOworCX0gZWxzZSBpZiAoU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0FDVElWRSkgeworCQlzcHJpbnRmIChidWYsICJldGglZDolczogIiwgcFVtRGV2aWNlLT5pbmRleCwgcFVtRGV2aWNlLT5uYW1lKTsKKworCQlpZiAocERldmljZS0+TGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTAwME1CUFMpIHsKKwkJCXN0cmNhdCAoYnVmLCAiMTAwMCBNYnBzICIpOworCQkJbGNkWzBdID0gJzEnOworCQkJbGNkWzFdID0gJ0cnOworCQkJbGNkWzJdID0gJ0InOworCQl9IGVsc2UgaWYgKHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwME1CUFMpIHsKKwkJCXN0cmNhdCAoYnVmLCAiMTAwIE1icHMgIik7CisJCQlsY2RbMF0gPSAnMSc7CisJCQlsY2RbMV0gPSAnMCc7CisJCQlsY2RbMl0gPSAnMCc7CisJCX0gZWxzZSBpZiAocERldmljZS0+TGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTBNQlBTKSB7CisJCQlzdHJjYXQgKGJ1ZiwgIjEwIE1icHMgIik7CisJCQlsY2RbMF0gPSAnMSc7CisJCQlsY2RbMV0gPSAnMCc7CisJCQlsY2RbMl0gPSAnICc7CisJCX0KKwkJaWYgKHBEZXZpY2UtPkR1cGxleE1vZGUgPT0gTE1fRFVQTEVYX01PREVfRlVMTCkgeworCQkJc3RyY2F0IChidWYsICJmdWxsIGR1cGxleCIpOworCQkJbGNkWzNdID0gJ0YnOworCQl9IGVsc2UgeworCQkJc3RyY2F0IChidWYsICJoYWxmIGR1cGxleCIpOworCQkJbGNkWzNdID0gJ0gnOworCQl9CisJCXN0cmNhdCAoYnVmLCAiIGxpbmsgdXAiKTsKKworCQlmbG93X2NvbnRyb2wgPSBwRGV2aWNlLT5GbG93Q29udHJvbCAmCisJCSAgICAoTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0UgfAorCQkgICAgIExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSk7CisKKwkJaWYgKGZsb3dfY29udHJvbCkgeworCQkJaWYgKGZsb3dfY29udHJvbCAmIExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFKSB7CisJCQkJc3RyY2F0IChidWYsICIsIHJlY2VpdmUgIik7CisJCQkJaWYgKGZsb3dfY29udHJvbCAmCisJCQkJICAgIExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSkKKwkJCQkJc3RyY2F0IChidWYsICIgJiB0cmFuc21pdCAiKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RyY2F0IChidWYsICIsIHRyYW5zbWl0ICIpOworCQkJfQorCQkJc3RyY2F0IChidWYsICJmbG93IGNvbnRyb2wgT04iKTsKKwkJfSBlbHNlIHsKKwkJCXN0cmNhdCAoYnVmLCAiLCBmbG93IGNvbnRyb2wgT0ZGIik7CisJCX0KKwkJc3RyY2F0IChidWYsICJcbiIpOworCQlwcmludGYgKCIlcyIsIGJ1Zik7CisJfQogI2lmIDAKLSAgICBzeXNMZWREc3BseShsY2RbMF0sbGNkWzFdLGxjZFsyXSxsY2RbM10pOworCXN5c0xlZERzcGx5IChsY2RbMF0sIGxjZFsxXSwgbGNkWzJdLCBsY2RbM10pOwogI2VuZGlmCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKIH0KIAotTE1fU1RBVFVTCi1NTV9GcmVlUnhCdWZmZXIoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpCitMTV9TVEFUVVMgTU1fRnJlZVJ4QnVmZmVyIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9QQUNLRVQgcFBhY2tldCkKIHsKIAotICAgIFBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7Ci0gICAgUFVNX1BBQ0tFVCBwVW1QYWNrZXQ7Ci0gICAgdm9pZCAqc2tiOworCVBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7CisJUFVNX1BBQ0tFVCBwVW1QYWNrZXQ7CisJdm9pZCAqc2tiOwogCi0gICAgcFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpIHBQYWNrZXQ7CisJcFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpIHBQYWNrZXQ7CiAKLSAgICBpZiAoKHNrYiA9IHBVbVBhY2tldC0+c2tidWZmKSkKLQliY201NzB4UGt0RnJlZShwVW1EZXZpY2UtPmluZGV4LCBza2IpOworCWlmICgoc2tiID0gcFVtUGFja2V0LT5za2J1ZmYpKQorCQliY201NzB4UGt0RnJlZSAocFVtRGV2aWNlLT5pbmRleCwgc2tiKTsKIAotICAgIHBVbVBhY2tldC0+c2tidWZmID0gMDsKKwlwVW1QYWNrZXQtPnNrYnVmZiA9IDA7CiAKLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwogfQogCi11bnNpZ25lZCBsb25nCi1NTV9BbkdldEN1cnJlbnRUaW1lX3VzKFBBTl9TVEFURV9JTkZPIHBBbkluZm8pCit1bnNpZ25lZCBsb25nIE1NX0FuR2V0Q3VycmVudFRpbWVfdXMgKFBBTl9TVEFURV9JTkZPIHBBbkluZm8pCiB7Ci0gICAgcmV0dXJuIGdldF90aW1lcigwKTsKKwlyZXR1cm4gZ2V0X3RpbWVyICgwKTsKIH0KIAogLyoKQEAgLTEyNTgsODYgKzEyMjAsODIgQEAKICAqICAgbm9uLWZhdGFsLiAgVGhlIGluY29taW5nIGNsdXN0ZXIgY2hhaW4gaXMgbm90IGZyZWVkLCBnaXZpbmcKICAqICAgdGhlIGNhbGxlciB0aGUgY2hvaWNlIG9mIHdoZXRoZXIgdG8gdHJ5IGEgcmV0cmFuc21pdCBsYXRlci4KICAqLwotTE1fU1RBVFVTCi1NTV9Db2FsZXNjZVR4QnVmZmVyKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KQorTE1fU1RBVFVTIE1NX0NvYWxlc2NlVHhCdWZmZXIgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KQogewotICAgIFBVTV9QQUNLRVQgcFVtUGFja2V0ID0gKFBVTV9QQUNLRVQpIHBQYWNrZXQ7Ci0gICAgUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKLSAgICB2b2lkICpza2JuZXc7Ci0gICAgaW50IGxlbiA9IDA7CisJUFVNX1BBQ0tFVCBwVW1QYWNrZXQgPSAoUFVNX1BBQ0tFVCkgcFBhY2tldDsKKwlQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOworCXZvaWQgKnNrYm5ldzsKKwlpbnQgbGVuID0gMDsKIAotICAgIGlmIChsZW4gPT0gMCkKKwlpZiAobGVuID09IDApCisJCXJldHVybiAoTE1fU1RBVFVTX1NVQ0NFU1MpOworCisJaWYgKGxlbiA+IE1BWF9QQUNLRVRfU0laRSkgeworCQlwcmludGYgKCJldGglZDogeG1pdCBmcmFtZSBkaXNjYXJkZWQsIHRvbyBiaWchLCBzaXplID0gJWRcbiIsCisJCQlwVW1EZXZpY2UtPmluZGV4LCBsZW4pOworCQlyZXR1cm4gKExNX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwlza2JuZXcgPSBiY201NzB4UGt0QWxsb2MgKHBVbURldmljZS0+aW5kZXgsIE1BWF9QQUNLRVRfU0laRSk7CisKKwlpZiAoc2tibmV3ID09IE5VTEwpIHsKKwkJcFVtRGV2aWNlLT50eF9mdWxsID0gMTsKKwkJcHJpbnRmICgiZXRoJWQ6IG91dCBvZiB0cmFuc21pdCBidWZmZXJzIiwgcFVtRGV2aWNlLT5pbmRleCk7CisJCXJldHVybiAoTE1fU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCS8qIE5ldyBwYWNrZXQgdmFsdWVzICovCisJcFVtUGFja2V0LT5za2J1ZmYgPSBza2JuZXc7CisJcFVtUGFja2V0LT5sbV9wYWNrZXQudS5UeC5GcmFnQ291bnQgPSAxOworCiAJcmV0dXJuIChMTV9TVEFUVVNfU1VDQ0VTUyk7Ci0KLSAgICBpZiAobGVuID4gTUFYX1BBQ0tFVF9TSVpFKXsKLQlwcmludGYgKCJldGglZDogeG1pdCBmcmFtZSBkaXNjYXJkZWQsIHRvbyBiaWchLCBzaXplID0gJWRcbiIsCi0JCXBVbURldmljZS0+aW5kZXgsIGxlbik7Ci0JcmV0dXJuIChMTV9TVEFUVVNfRkFJTFVSRSk7Ci0gICAgfQotCi0gICAgc2tibmV3ID0gYmNtNTcweFBrdEFsbG9jKHBVbURldmljZS0+aW5kZXgsIE1BWF9QQUNLRVRfU0laRSk7Ci0KLSAgICBpZiAoc2tibmV3ID09IE5VTEwpIHsKLQlwVW1EZXZpY2UtPnR4X2Z1bGwgPSAxOwotCXByaW50ZiAoImV0aCVkOiBvdXQgb2YgdHJhbnNtaXQgYnVmZmVycyIsIHBVbURldmljZS0+aW5kZXgpOwotCXJldHVybiAoTE1fU1RBVFVTX0ZBSUxVUkUpOwotICAgIH0KLQotICAgIC8qIE5ldyBwYWNrZXQgdmFsdWVzICovCi0gICAgcFVtUGFja2V0LT5za2J1ZmYgPSBza2JuZXc7Ci0gICAgcFVtUGFja2V0LT5sbV9wYWNrZXQudS5UeC5GcmFnQ291bnQgPSAxOwotCi0gICAgcmV0dXJuIChMTV9TVEFUVVNfU1VDQ0VTUyk7CiB9CiAKLQotTE1fU1RBVFVTCi1NTV9JbmRpY2F0ZVJ4UGFja2V0cyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCitMTV9TVEFUVVMgTU1fSW5kaWNhdGVSeFBhY2tldHMgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKIHsKLSAgICBQVU1fREVWSUNFX0JMT0NLIHBVbURldmljZSA9IChQVU1fREVWSUNFX0JMT0NLKSBwRGV2aWNlOwotICAgIHBVbURldmljZS0+cnhfcGt0ID0gMTsKLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKKwlwVW1EZXZpY2UtPnJ4X3BrdCA9IDE7CisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwogfQogCi1MTV9TVEFUVVMKLU1NX0luZGljYXRlVHhQYWNrZXRzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK0xNX1NUQVRVUyBNTV9JbmRpY2F0ZVR4UGFja2V0cyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQogewotICAgIFBVTV9ERVZJQ0VfQkxPQ0sgcFVtRGV2aWNlID0gKFBVTV9ERVZJQ0VfQkxPQ0spIHBEZXZpY2U7Ci0gICAgUExNX1BBQ0tFVCBwUGFja2V0OwotICAgIFBVTV9QQUNLRVQgcFVtUGFja2V0OwotICAgIHZvaWQgKnNrYjsKLSAgICB3aGlsZSAoIFRSVUUgKSB7CisJUFVNX0RFVklDRV9CTE9DSyBwVW1EZXZpY2UgPSAoUFVNX0RFVklDRV9CTE9DSykgcERldmljZTsKKwlQTE1fUEFDS0VUIHBQYWNrZXQ7CisJUFVNX1BBQ0tFVCBwVW1QYWNrZXQ7CisJdm9pZCAqc2tiOworCXdoaWxlIChUUlVFKSB7CiAKLQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpCi0JICAgIFFRX1BvcEhlYWQoJnBEZXZpY2UtPlR4UGFja2V0WG1pdHRlZFEuQ29udGFpbmVyKTsKKwkJcFBhY2tldCA9IChQTE1fUEFDS0VUKQorCQkgICAgUVFfUG9wSGVhZCAoJnBEZXZpY2UtPlR4UGFja2V0WG1pdHRlZFEuQ29udGFpbmVyKTsKIAotCWlmIChwUGFja2V0ID09IDApCi0JICAgIGJyZWFrOworCQlpZiAocFBhY2tldCA9PSAwKQorCQkJYnJlYWs7CiAKLQlwVW1QYWNrZXQgPSAoUFVNX1BBQ0tFVCkgcFBhY2tldDsKLQlza2IgPSAodm9pZCopcFVtUGFja2V0LT5za2J1ZmY7CisJCXBVbVBhY2tldCA9IChQVU1fUEFDS0VUKSBwUGFja2V0OworCQlza2IgPSAodm9pZCAqKXBVbVBhY2tldC0+c2tidWZmOwogCi0JLyoKLQkqIEZyZWUgTUJMSyBpZiB3ZSB0cmFuc21pdHRlZCBhIGZyYWdtZW50ZWQgcGFja2V0IG9yIGEKLQkqIG5vbi1mcmFnbWVudGVkIHBhY2tldCBzdHJhaWdodCBmcm9tIHRoZSBWeFdvcmtzCi0JKiBidWZmZXIgcG9vbC4gSWYgcGFja2V0IHdhcyBjb3BpZWQgdG8gYSBsb2NhbCB0cmFuc21pdAotCSogYnVmZmVyLCB0aGVuIHRoZXJlJ3Mgbm8gTUJVRiB0byBmcmVlLCBqdXN0IGZyZWUKLQkqIHRoZSB0cmFuc21pdCBidWZmZXIgYmFjayB0byB0aGUgY2x1c3RlciBwb29sLgotCSovCisJCS8qCisJCSAqIEZyZWUgTUJMSyBpZiB3ZSB0cmFuc21pdHRlZCBhIGZyYWdtZW50ZWQgcGFja2V0IG9yIGEKKwkJICogbm9uLWZyYWdtZW50ZWQgcGFja2V0IHN0cmFpZ2h0IGZyb20gdGhlIFZ4V29ya3MKKwkJICogYnVmZmVyIHBvb2wuIElmIHBhY2tldCB3YXMgY29waWVkIHRvIGEgbG9jYWwgdHJhbnNtaXQKKwkJICogYnVmZmVyLCB0aGVuIHRoZXJlJ3Mgbm8gTUJVRiB0byBmcmVlLCBqdXN0IGZyZWUKKwkJICogdGhlIHRyYW5zbWl0IGJ1ZmZlciBiYWNrIHRvIHRoZSBjbHVzdGVyIHBvb2wuCisJCSAqLwogCi0JaWYgKHNrYikKLQkgICAgYmNtNTcweFBrdEZyZWUgKHBVbURldmljZS0+aW5kZXgsIHNrYik7CisJCWlmIChza2IpCisJCQliY201NzB4UGt0RnJlZSAocFVtRGV2aWNlLT5pbmRleCwgc2tiKTsKIAotCXBVbVBhY2tldC0+c2tidWZmID0gMDsKLQlRUV9QdXNoVGFpbCgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOwotCXBVbURldmljZS0+dHhfcGt0ID0gMTsKLSAgICB9Ci0gICAgaWYgKHBVbURldmljZS0+dHhfZnVsbCkgewotCWlmIChRUV9HZXRFbnRyeUNudCgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIpID49Ci0JICAgIChRUV9HZXRTaXplKCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLkNvbnRhaW5lcikgPj4gMSkpCi0JICAgIHBVbURldmljZS0+dHhfZnVsbCA9IDA7Ci0gICAgfQotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwkJcFVtUGFja2V0LT5za2J1ZmYgPSAwOworCQlRUV9QdXNoVGFpbCAoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKKwkJcFVtRGV2aWNlLT50eF9wa3QgPSAxOworCX0KKwlpZiAocFVtRGV2aWNlLT50eF9mdWxsKSB7CisJCWlmIChRUV9HZXRFbnRyeUNudCAoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyKSA+PQorCQkgICAgKFFRX0dldFNpemUgKCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLkNvbnRhaW5lcikgPj4gMSkpCisJCQlwVW1EZXZpY2UtPnR4X2Z1bGwgPSAwOworCX0KKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIC8qCkBAIC0xMzQ1LDE2ICsxMzAzLDEyIEBACiAgKiAgUmV0dXJuIGl0cyBsZW5ndGggYW5kIHBoeXNpY2FsIGFkZHJlc3MuCiAgKi8KIHZvaWQgTU1fTWFwVHhEbWEKLSAgICAoCi0gICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotICAgIHN0cnVjdCBfTE1fUEFDS0VUICpwUGFja2V0LAotICAgIFQzXzY0QklUX0hPU1RfQUREUiAqcGFkZHIsCi0gICAgTE1fVUlOVDMyICpsZW4sCi0gICAgaW50IGZyYWcpCi17Ci0gICAgUFVNX1BBQ0tFVCBwVW1QYWNrZXQgPSAoUFVNX1BBQ0tFVCkgcFBhY2tldDsKLSAgICAqbGVuID0gcFBhY2tldC0+UGFja2V0U2l6ZTsKLSAgICBNTV9TZXRUM0FkZHIocGFkZHIsIChkbWFfYWRkcl90KSBwVW1QYWNrZXQtPnNrYnVmZik7CisgICAgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKyAgICAgc3RydWN0IF9MTV9QQUNLRVQgKnBQYWNrZXQsCisgICAgIFQzXzY0QklUX0hPU1RfQUREUiAqIHBhZGRyLCBMTV9VSU5UMzIgKiBsZW4sIGludCBmcmFnKSB7CisJUFVNX1BBQ0tFVCBwVW1QYWNrZXQgPSAoUFVNX1BBQ0tFVCkgcFBhY2tldDsKKwkqbGVuID0gcFBhY2tldC0+UGFja2V0U2l6ZTsKKwlNTV9TZXRUM0FkZHIgKHBhZGRyLCAoZG1hX2FkZHJfdCkgcFVtUGFja2V0LT5za2J1ZmYpOwogfQogCiAvKgpAQCAtMTM2MiwzNSArMTMxNiwzMSBAQAogICogIHRvIGEgcGh5c2ljYWwgYWRkcmVzcyBhcyBzZWVuIGZyb20gYSBQQ0kgZGV2aWNlLiAgU3RvcmUgdGhlCiAgKiAgcmVzdWx0IGF0IHBhZGRyLgogICovCi12b2lkIE1NX01hcFJ4RG1hKAotCQkgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotCQkgc3RydWN0IF9MTV9QQUNLRVQgKnBQYWNrZXQsCi0JCSBUM182NEJJVF9IT1NUX0FERFIgKnBhZGRyKQordm9pZCBNTV9NYXBSeERtYSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorCQkgIHN0cnVjdCBfTE1fUEFDS0VUICpwUGFja2V0LCBUM182NEJJVF9IT1NUX0FERFIgKiBwYWRkcikKIHsKLSAgICBQVU1fUEFDS0VUIHBVbVBhY2tldCA9IChQVU1fUEFDS0VUKSBwUGFja2V0OwotICAgIE1NX1NldFQzQWRkcihwYWRkciwgKGRtYV9hZGRyX3QpIHBVbVBhY2tldC0+c2tidWZmKTsKKwlQVU1fUEFDS0VUIHBVbVBhY2tldCA9IChQVU1fUEFDS0VUKSBwUGFja2V0OworCU1NX1NldFQzQWRkciAocGFkZHIsIChkbWFfYWRkcl90KSBwVW1QYWNrZXQtPnNrYnVmZik7CiB9CiAKLXZvaWQKLU1NX1NldEFkZHIgKExNX1BIWVNJQ0FMX0FERFJFU1MgKnBhZGRyLCBkbWFfYWRkcl90IGFkZHIpCit2b2lkIE1NX1NldEFkZHIgKExNX1BIWVNJQ0FMX0FERFJFU1MgKiBwYWRkciwgZG1hX2FkZHJfdCBhZGRyKQogewogI2lmIChCSVRTX1BFUl9MT05HID09IDY0KQotCXBhZGRyLT5IaWdoID0gKCh1bnNpZ25lZCBsb25nKSBhZGRyKSA+PiAzMjsKLQlwYWRkci0+TG93ID0gKCh1bnNpZ25lZCBsb25nKSBhZGRyKSAmIDB4ZmZmZmZmZmY7CisJcGFkZHItPkhpZ2ggPSAoKHVuc2lnbmVkIGxvbmcpYWRkcikgPj4gMzI7CisJcGFkZHItPkxvdyA9ICgodW5zaWduZWQgbG9uZylhZGRyKSAmIDB4ZmZmZmZmZmY7CiAjZWxzZQogCXBhZGRyLT5IaWdoID0gMDsKLQlwYWRkci0+TG93ID0gKHVuc2lnbmVkIGxvbmcpIGFkZHI7CisJcGFkZHItPkxvdyA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CiAjZW5kaWYKIH0KIAotdm9pZAotTU1fU2V0VDNBZGRyKFQzXzY0QklUX0hPU1RfQUREUiAqcGFkZHIsIGRtYV9hZGRyX3QgYWRkcikKK3ZvaWQgTU1fU2V0VDNBZGRyIChUM182NEJJVF9IT1NUX0FERFIgKiBwYWRkciwgZG1hX2FkZHJfdCBhZGRyKQogewotCXVuc2lnbmVkIGxvbmcgYmFkZHIgPSAodW5zaWduZWQgbG9uZykgYWRkcjsKKwl1bnNpZ25lZCBsb25nIGJhZGRyID0gKHVuc2lnbmVkIGxvbmcpYWRkcjsKICNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKLQlzZXRfNjRiaXRfYWRkcihwYWRkciwgYmFkZHIgJiAweGZmZmZmZmZmLCBiYWRkciA+PiAzMik7CisJc2V0XzY0Yml0X2FkZHIgKHBhZGRyLCBiYWRkciAmIDB4ZmZmZmZmZmYsIGJhZGRyID4+IDMyKTsKICNlbHNlCi0Jc2V0XzY0Yml0X2FkZHIocGFkZHIsIGJhZGRyLCAwKTsKKwlzZXRfNjRiaXRfYWRkciAocGFkZHIsIGJhZGRyLCAwKTsKICNlbmRpZgogfQogCkBAIC0xNDAzLDQyICsxMzUzLDM4IEBACiAgKiBJZiBhbnkgdXNlcyBvZiB0aGUgZnVuY3Rpb24gcmVtYWluLCB0aGV5IHdpbGwgcmVmZXIgdG8gdGhlIHNpbmdsZSBjb3B5CiAgKiBpbiB0aGUgbGlicmFyeS4KICAqLwotdm9pZAotYXRvbWljX3NldChhdG9taWNfdCogZW50cnksIGludCB2YWwpCit2b2lkIGF0b21pY19zZXQgKGF0b21pY190ICogZW50cnksIGludCB2YWwpCiB7Ci0gICAgZW50cnktPmNvdW50ZXIgPSB2YWw7Ci19Ci1pbnQKLWF0b21pY19yZWFkKGF0b21pY190KiBlbnRyeSkKLXsKLSAgICByZXR1cm4gZW50cnktPmNvdW50ZXI7Ci19Ci12b2lkCi1hdG9taWNfaW5jKGF0b21pY190KiBlbnRyeSkKLXsKLSAgICBpZihlbnRyeSkKLQllbnRyeS0+Y291bnRlcisrOworCWVudHJ5LT5jb3VudGVyID0gdmFsOwogfQogCi12b2lkCi1hdG9taWNfZGVjKGF0b21pY190KiBlbnRyeSkKK2ludCBhdG9taWNfcmVhZCAoYXRvbWljX3QgKiBlbnRyeSkKIHsKLSAgICBpZihlbnRyeSkKLQllbnRyeS0+Y291bnRlci0tOworCXJldHVybiBlbnRyeS0+Y291bnRlcjsKIH0KIAotdm9pZAotYXRvbWljX3N1YihpbnQgYSwgYXRvbWljX3QqIGVudHJ5KQordm9pZCBhdG9taWNfaW5jIChhdG9taWNfdCAqIGVudHJ5KQogewotICAgIGlmKGVudHJ5KQotCWVudHJ5LT5jb3VudGVyIC09IGE7CisJaWYgKGVudHJ5KQorCQllbnRyeS0+Y291bnRlcisrOwogfQogCi12b2lkCi1hdG9taWNfYWRkKGludCBhLCBhdG9taWNfdCogZW50cnkpCit2b2lkIGF0b21pY19kZWMgKGF0b21pY190ICogZW50cnkpCiB7Ci0gICAgaWYoZW50cnkpCi0JZW50cnktPmNvdW50ZXIgKz0gYTsKKwlpZiAoZW50cnkpCisJCWVudHJ5LT5jb3VudGVyLS07Cit9CisKK3ZvaWQgYXRvbWljX3N1YiAoaW50IGEsIGF0b21pY190ICogZW50cnkpCit7CisJaWYgKGVudHJ5KQorCQllbnRyeS0+Y291bnRlciAtPSBhOworfQorCit2b2lkIGF0b21pY19hZGQgKGludCBhLCBhdG9taWNfdCAqIGVudHJ5KQoreworCWlmIChlbnRyeSkKKwkJZW50cnktPmNvdW50ZXIgKz0gYTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE0NDYsNjggKzEzOTIsNTcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLVFRX0luaXRRdWV1ZSgKLVBRUV9DT05UQUlORVIgcFF1ZXVlLAotdW5zaWduZWQgaW50IFF1ZXVlU2l6ZSkgewotICAgIHBRdWV1ZS0+SGVhZCA9IDA7Ci0gICAgcFF1ZXVlLT5UYWlsID0gMDsKLSAgICBwUXVldWUtPlNpemUgPSBRdWV1ZVNpemUrMTsKLSAgICBhdG9taWNfc2V0KCZwUXVldWUtPkVudHJ5Q250LCAwKTsKLX0gLyogUVFfSW5pdFF1ZXVlICovCi0KK3ZvaWQgUVFfSW5pdFF1ZXVlIChQUVFfQ09OVEFJTkVSIHBRdWV1ZSwgdW5zaWduZWQgaW50IFF1ZXVlU2l6ZSkKK3sKKwlwUXVldWUtPkhlYWQgPSAwOworCXBRdWV1ZS0+VGFpbCA9IDA7CisJcFF1ZXVlLT5TaXplID0gUXVldWVTaXplICsgMTsKKwlhdG9taWNfc2V0ICgmcFF1ZXVlLT5FbnRyeUNudCwgMCk7Cit9CQkJCS8qIFFRX0luaXRRdWV1ZSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIKLVFRX0Z1bGwoCi1QUVFfQ09OVEFJTkVSIHBRdWV1ZSkgewotICAgIHVuc2lnbmVkIGludCBOZXdIZWFkOworY2hhciBRUV9GdWxsIChQUVFfQ09OVEFJTkVSIHBRdWV1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgTmV3SGVhZDsKIAotICAgIE5ld0hlYWQgPSAocFF1ZXVlLT5IZWFkICsgMSkgJSBwUXVldWUtPlNpemU7CisJTmV3SGVhZCA9IChwUXVldWUtPkhlYWQgKyAxKSAlIHBRdWV1ZS0+U2l6ZTsKIAotICAgIHJldHVybihOZXdIZWFkID09IHBRdWV1ZS0+VGFpbCk7Ci19IC8qIFFRX0Z1bGwgKi8KLQorCXJldHVybiAoTmV3SGVhZCA9PSBwUXVldWUtPlRhaWwpOworfQkJCQkvKiBRUV9GdWxsICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhcgotUVFfRW1wdHkoCi1QUVFfQ09OVEFJTkVSIHBRdWV1ZSkgewotICAgIHJldHVybihwUXVldWUtPkhlYWQgPT0gcFF1ZXVlLT5UYWlsKTsKLX0gLyogUVFfRW1wdHkgKi8KLQorY2hhciBRUV9FbXB0eSAoUFFRX0NPTlRBSU5FUiBwUXVldWUpCit7CisJcmV0dXJuIChwUXVldWUtPkhlYWQgPT0gcFF1ZXVlLT5UYWlsKTsKK30JCQkJLyogUVFfRW1wdHkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bnNpZ25lZCBpbnQKLVFRX0dldFNpemUoCi1QUVFfQ09OVEFJTkVSIHBRdWV1ZSkgewotICAgIHJldHVybiBwUXVldWUtPlNpemU7Ci19IC8qIFFRX0dldFNpemUgKi8KLQordW5zaWduZWQgaW50IFFRX0dldFNpemUgKFBRUV9DT05UQUlORVIgcFF1ZXVlKQoreworCXJldHVybiBwUXVldWUtPlNpemU7Cit9CQkJCS8qIFFRX0dldFNpemUgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bnNpZ25lZCBpbnQKLVFRX0dldEVudHJ5Q250KAotUFFRX0NPTlRBSU5FUiBwUXVldWUpIHsKLSAgICByZXR1cm4gYXRvbWljX3JlYWQoJnBRdWV1ZS0+RW50cnlDbnQpOwotfSAvKiBRUV9HZXRFbnRyeUNudCAqLwotCit1bnNpZ25lZCBpbnQgUVFfR2V0RW50cnlDbnQgKFBRUV9DT05UQUlORVIgcFF1ZXVlKQoreworCXJldHVybiBhdG9taWNfcmVhZCAoJnBRdWV1ZS0+RW50cnlDbnQpOworfQkJCQkvKiBRUV9HZXRFbnRyeUNudCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE1MTYsMjggKzE0NTEsMjUgQEAKIC8qICAgIFRSVUUgZW50cnkgd2FzIGFkZGVkIHN1Y2Nlc3NmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGQUxTRSBxdWV1ZSBpcyBmdWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIKLVFRX1B1c2hIZWFkKAotUFFRX0NPTlRBSU5FUiBwUXVldWUsCi1QUVFfRU5UUlkgcEVudHJ5KSB7Ci0gICAgdW5zaWduZWQgaW50IEhlYWQ7CitjaGFyIFFRX1B1c2hIZWFkIChQUVFfQ09OVEFJTkVSIHBRdWV1ZSwgUFFRX0VOVFJZIHBFbnRyeSkKK3sKKwl1bnNpZ25lZCBpbnQgSGVhZDsKIAotICAgIEhlYWQgPSAocFF1ZXVlLT5IZWFkICsgMSkgJSBwUXVldWUtPlNpemU7CisJSGVhZCA9IChwUXVldWUtPkhlYWQgKyAxKSAlIHBRdWV1ZS0+U2l6ZTsKIAogI2lmICFkZWZpbmVkKFFRX05PX09WRVJGTE9XX0NIRUNLKQotICAgIGlmKEhlYWQgPT0gcFF1ZXVlLT5UYWlsKSB7Ci0JcmV0dXJuIDA7Ci0gICAgfSAvKiBpZiAqLwotI2VuZGlmIC8qIFFRX05PX09WRVJGTE9XX0NIRUNLICovCisJaWYgKEhlYWQgPT0gcFF1ZXVlLT5UYWlsKSB7CisJCXJldHVybiAwOworCX0JCQkvKiBpZiAqLworI2VuZGlmCQkJCS8qIFFRX05PX09WRVJGTE9XX0NIRUNLICovCiAKLSAgICBwUXVldWUtPkFycmF5W3BRdWV1ZS0+SGVhZF0gPSBwRW50cnk7Ci0gICAgd21iKCk7Ci0gICAgcFF1ZXVlLT5IZWFkID0gSGVhZDsKLSAgICBhdG9taWNfaW5jKCZwUXVldWUtPkVudHJ5Q250KTsKKwlwUXVldWUtPkFycmF5W3BRdWV1ZS0+SGVhZF0gPSBwRW50cnk7CisJd21iICgpOworCXBRdWV1ZS0+SGVhZCA9IEhlYWQ7CisJYXRvbWljX2luYyAoJnBRdWV1ZS0+RW50cnlDbnQpOwogCi0gICAgcmV0dXJuIC0xOwotfSAvKiBRUV9QdXNoSGVhZCAqLwotCisJcmV0dXJuIC0xOworfQkJCQkvKiBRUV9QdXNoSGVhZCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE1NDYsMTQ2ICsxNDc4LDEyNiBAQAogLyogICAgVFJVRSBlbnRyeSB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZBTFNFIHF1ZXVlIGlzIGZ1bGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhcgotUVFfUHVzaFRhaWwoCi1QUVFfQ09OVEFJTkVSIHBRdWV1ZSwKLVBRUV9FTlRSWSBwRW50cnkpIHsKLSAgICB1bnNpZ25lZCBpbnQgVGFpbDsKK2NoYXIgUVFfUHVzaFRhaWwgKFBRUV9DT05UQUlORVIgcFF1ZXVlLCBQUVFfRU5UUlkgcEVudHJ5KQoreworCXVuc2lnbmVkIGludCBUYWlsOwogCi0gICAgVGFpbCA9IHBRdWV1ZS0+VGFpbDsKLSAgICBpZihUYWlsID09IDApIHsKLQlUYWlsID0gcFF1ZXVlLT5TaXplOwotICAgIH0gLyogaWYgKi8KLSAgICBUYWlsLS07CisJVGFpbCA9IHBRdWV1ZS0+VGFpbDsKKwlpZiAoVGFpbCA9PSAwKSB7CisJCVRhaWwgPSBwUXVldWUtPlNpemU7CisJfQkJCS8qIGlmICovCisJVGFpbC0tOwogCiAjaWYgIWRlZmluZWQoUVFfTk9fT1ZFUkZMT1dfQ0hFQ0spCi0gICAgaWYoVGFpbCA9PSBwUXVldWUtPkhlYWQpIHsKLQlyZXR1cm4gMDsKLSAgICB9IC8qIGlmICovCi0jZW5kaWYgLyogUVFfTk9fT1ZFUkZMT1dfQ0hFQ0sgKi8KKwlpZiAoVGFpbCA9PSBwUXVldWUtPkhlYWQpIHsKKwkJcmV0dXJuIDA7CisJfQkJCS8qIGlmICovCisjZW5kaWYJCQkJLyogUVFfTk9fT1ZFUkZMT1dfQ0hFQ0sgKi8KIAotICAgIHBRdWV1ZS0+QXJyYXlbVGFpbF0gPSBwRW50cnk7Ci0gICAgd21iKCk7Ci0gICAgcFF1ZXVlLT5UYWlsID0gVGFpbDsKLSAgICBhdG9taWNfaW5jKCZwUXVldWUtPkVudHJ5Q250KTsKKwlwUXVldWUtPkFycmF5W1RhaWxdID0gcEVudHJ5OworCXdtYiAoKTsKKwlwUXVldWUtPlRhaWwgPSBUYWlsOworCWF0b21pY19pbmMgKCZwUXVldWUtPkVudHJ5Q250KTsKIAotICAgIHJldHVybiAtMTsKLX0gLyogUVFfUHVzaFRhaWwgKi8KLQorCXJldHVybiAtMTsKK30JCQkJLyogUVFfUHVzaFRhaWwgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QUVFfRU5UUlkKLVFRX1BvcEhlYWQoCi1QUVFfQ09OVEFJTkVSIHBRdWV1ZSkgewotICAgIHVuc2lnbmVkIGludCBIZWFkOwotICAgIFBRUV9FTlRSWSBFbnRyeTsKK1BRUV9FTlRSWSBRUV9Qb3BIZWFkIChQUVFfQ09OVEFJTkVSIHBRdWV1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgSGVhZDsKKwlQUVFfRU5UUlkgRW50cnk7CiAKLSAgICBIZWFkID0gcFF1ZXVlLT5IZWFkOworCUhlYWQgPSBwUXVldWUtPkhlYWQ7CiAKICNpZiAhZGVmaW5lZChRUV9OT19VTkRFUkZMT1dfQ0hFQ0spCi0gICAgaWYoSGVhZCA9PSBwUXVldWUtPlRhaWwpIHsKLQlyZXR1cm4gKFBRUV9FTlRSWSkgMDsKLSAgICB9IC8qIGlmICovCi0jZW5kaWYgLyogUVFfTk9fVU5ERVJGTE9XX0NIRUNLICovCisJaWYgKEhlYWQgPT0gcFF1ZXVlLT5UYWlsKSB7CisJCXJldHVybiAoUFFRX0VOVFJZKSAwOworCX0JCQkvKiBpZiAqLworI2VuZGlmCQkJCS8qIFFRX05PX1VOREVSRkxPV19DSEVDSyAqLwogCi0gICAgaWYoSGVhZCA9PSAwKSB7Ci0JSGVhZCA9IHBRdWV1ZS0+U2l6ZTsKLSAgICB9IC8qIGlmICovCi0gICAgSGVhZC0tOworCWlmIChIZWFkID09IDApIHsKKwkJSGVhZCA9IHBRdWV1ZS0+U2l6ZTsKKwl9CQkJLyogaWYgKi8KKwlIZWFkLS07CiAKLSAgICBFbnRyeSA9IHBRdWV1ZS0+QXJyYXlbSGVhZF07Ci0gICAgbWVtYmFyKCk7CisJRW50cnkgPSBwUXVldWUtPkFycmF5W0hlYWRdOworCW1lbWJhciAoKTsKIAotICAgIHBRdWV1ZS0+SGVhZCA9IEhlYWQ7Ci0gICAgYXRvbWljX2RlYygmcFF1ZXVlLT5FbnRyeUNudCk7CisJcFF1ZXVlLT5IZWFkID0gSGVhZDsKKwlhdG9taWNfZGVjICgmcFF1ZXVlLT5FbnRyeUNudCk7CiAKLSAgICByZXR1cm4gRW50cnk7Ci19IC8qIFFRX1BvcEhlYWQgKi8KLQorCXJldHVybiBFbnRyeTsKK30JCQkJLyogUVFfUG9wSGVhZCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBRUV9FTlRSWQotUVFfUG9wVGFpbCgKLVBRUV9DT05UQUlORVIgcFF1ZXVlKSB7Ci0gICAgdW5zaWduZWQgaW50IFRhaWw7Ci0gICAgUFFRX0VOVFJZIEVudHJ5OworUFFRX0VOVFJZIFFRX1BvcFRhaWwgKFBRUV9DT05UQUlORVIgcFF1ZXVlKQoreworCXVuc2lnbmVkIGludCBUYWlsOworCVBRUV9FTlRSWSBFbnRyeTsKIAotICAgIFRhaWwgPSBwUXVldWUtPlRhaWw7CisJVGFpbCA9IHBRdWV1ZS0+VGFpbDsKIAogI2lmICFkZWZpbmVkKFFRX05PX1VOREVSRkxPV19DSEVDSykKLSAgICBpZihUYWlsID09IHBRdWV1ZS0+SGVhZCkgewotCXJldHVybiAoUFFRX0VOVFJZKSAwOwotICAgIH0gLyogaWYgKi8KLSNlbmRpZiAvKiBRUV9OT19VTkRFUkZMT1dfQ0hFQ0sgKi8KKwlpZiAoVGFpbCA9PSBwUXVldWUtPkhlYWQpIHsKKwkJcmV0dXJuIChQUVFfRU5UUlkpIDA7CisJfQkJCS8qIGlmICovCisjZW5kaWYJCQkJLyogUVFfTk9fVU5ERVJGTE9XX0NIRUNLICovCiAKLSAgICBFbnRyeSA9IHBRdWV1ZS0+QXJyYXlbVGFpbF07Ci0gICAgbWVtYmFyKCk7Ci0gICAgcFF1ZXVlLT5UYWlsID0gKFRhaWwgKyAxKSAlIHBRdWV1ZS0+U2l6ZTsKLSAgICBhdG9taWNfZGVjKCZwUXVldWUtPkVudHJ5Q250KTsKKwlFbnRyeSA9IHBRdWV1ZS0+QXJyYXlbVGFpbF07CisJbWVtYmFyICgpOworCXBRdWV1ZS0+VGFpbCA9IChUYWlsICsgMSkgJSBwUXVldWUtPlNpemU7CisJYXRvbWljX2RlYyAoJnBRdWV1ZS0+RW50cnlDbnQpOwogCi0gICAgcmV0dXJuIEVudHJ5OwotfSAvKiBRUV9Qb3BUYWlsICovCi0KKwlyZXR1cm4gRW50cnk7Cit9CQkJCS8qIFFRX1BvcFRhaWwgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QUVFfRU5UUlkKLVFRX0dldEhlYWQoCi0gICAgUFFRX0NPTlRBSU5FUiBwUXVldWUsCi0gICAgdW5zaWduZWQgaW50IElkeCkKK1BRUV9FTlRSWSBRUV9HZXRIZWFkIChQUVFfQ09OVEFJTkVSIHBRdWV1ZSwgdW5zaWduZWQgaW50IElkeCkKIHsKLSAgICBpZihJZHggPj0gYXRvbWljX3JlYWQoJnBRdWV1ZS0+RW50cnlDbnQpKQotICAgIHsKLQlyZXR1cm4gKFBRUV9FTlRSWSkgMDsKLSAgICB9CisJaWYgKElkeCA+PSBhdG9taWNfcmVhZCAoJnBRdWV1ZS0+RW50cnlDbnQpKSB7CisJCXJldHVybiAoUFFRX0VOVFJZKSAwOworCX0KIAotICAgIGlmKHBRdWV1ZS0+SGVhZCA+IElkeCkKLSAgICB7Ci0JSWR4ID0gcFF1ZXVlLT5IZWFkIC0gSWR4OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCUlkeCA9IHBRdWV1ZS0+U2l6ZSAtIChJZHggLSBwUXVldWUtPkhlYWQpOwotICAgIH0KLSAgICBJZHgtLTsKKwlpZiAocFF1ZXVlLT5IZWFkID4gSWR4KSB7CisJCUlkeCA9IHBRdWV1ZS0+SGVhZCAtIElkeDsKKwl9IGVsc2UgeworCQlJZHggPSBwUXVldWUtPlNpemUgLSAoSWR4IC0gcFF1ZXVlLT5IZWFkKTsKKwl9CisJSWR4LS07CiAKLSAgICByZXR1cm4gcFF1ZXVlLT5BcnJheVtJZHhdOworCXJldHVybiBwUXVldWUtPkFycmF5W0lkeF07CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QUVFfRU5UUlkKLVFRX0dldFRhaWwoCi0gICAgUFFRX0NPTlRBSU5FUiBwUXVldWUsCi0gICAgdW5zaWduZWQgaW50IElkeCkKK1BRUV9FTlRSWSBRUV9HZXRUYWlsIChQUVFfQ09OVEFJTkVSIHBRdWV1ZSwgdW5zaWduZWQgaW50IElkeCkKIHsKLSAgICBpZihJZHggPj0gYXRvbWljX3JlYWQoJnBRdWV1ZS0+RW50cnlDbnQpKQotICAgIHsKLQlyZXR1cm4gKFBRUV9FTlRSWSkgMDsKLSAgICB9CisJaWYgKElkeCA+PSBhdG9taWNfcmVhZCAoJnBRdWV1ZS0+RW50cnlDbnQpKSB7CisJCXJldHVybiAoUFFRX0VOVFJZKSAwOworCX0KIAotICAgIElkeCArPSBwUXVldWUtPlRhaWw7Ci0gICAgaWYoSWR4ID49IHBRdWV1ZS0+U2l6ZSkKLSAgICB7Ci0JSWR4ID0gSWR4IC0gcFF1ZXVlLT5TaXplOwotICAgIH0KKwlJZHggKz0gcFF1ZXVlLT5UYWlsOworCWlmIChJZHggPj0gcFF1ZXVlLT5TaXplKSB7CisJCUlkeCA9IElkeCAtIHBRdWV1ZS0+U2l6ZTsKKwl9CiAKLSAgICByZXR1cm4gcFF1ZXVlLT5BcnJheVtJZHhdOworCXJldHVybiBwUXVldWUtPkFycmF5W0lkeF07CiB9CiAKLSNlbmRpZgkvKiBDRkdfQ01EX05FVCwgIUNPTkZJR19ORVRfTVVMVEksIENPTkZJR19CQ001NzB4ICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtNTcweF9sbS5oIGIvZHJpdmVycy9iY201NzB4X2xtLmgKaW5kZXggNjA3ZjNmZC4uMmVhNmNhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iY201NzB4X2xtLmgKKysrIGIvZHJpdmVycy9iY201NzB4X2xtLmgKQEAgLTE5LDI5ICsxOSwyOCBAQAogI2luY2x1ZGUgImJjbTU3MHhfcXVldWUuaCIKICNpbmNsdWRlICJiY201NzB4X2JpdHMuaCIKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogQmFzaWMgdHlwZXMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi10eXBlZGVmIGNoYXIgICAgICAgICAgIExNX0NIQVIsICAgICpQTE1fQ0hBUjsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgTE1fVUlOVCwgICAgKlBMTV9VSU5UOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICBMTV9VSU5UOCwgICAqUExNX1VJTlQ4OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBMTV9VSU5UMTYsICAqUExNX1VJTlQxNjsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgTE1fVUlOVDMyLCAgKlBMTV9VSU5UMzI7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgIExNX0NPVU5URVIsICpQTE1fQ09VTlRFUjsKLXR5cGVkZWYgdm9pZCAgICAgICAgICAgTE1fVk9JRCwgICAgKlBMTV9WT0lEOwotdHlwZWRlZiBjaGFyICAgICAgICAgICBMTV9CT09MLCAgICAqUExNX0JPT0w7Cit0eXBlZGVmIGNoYXIgTE1fQ0hBUiwgKlBMTV9DSEFSOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgTE1fVUlOVCwgKlBMTV9VSU5UOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIExNX1VJTlQ4LCAqUExNX1VJTlQ4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBMTV9VSU5UMTYsICpQTE1fVUlOVDE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgTE1fVUlOVDMyLCAqUExNX1VJTlQzMjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IExNX0NPVU5URVIsICpQTE1fQ09VTlRFUjsKK3R5cGVkZWYgdm9pZCBMTV9WT0lELCAqUExNX1ZPSUQ7Cit0eXBlZGVmIGNoYXIgTE1fQk9PTCwgKlBMTV9CT09MOwogCiAvKiA2NGJpdCB2YWx1ZS4gKi8KIHR5cGVkZWYgc3RydWN0IHsKICNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKLSAgICBMTV9VSU5UMzIgSGlnaDsKLSAgICBMTV9VSU5UMzIgTG93OwotI2Vsc2UgLyogQklHX0VORElBTl9IT1NUICovCi0gICAgTE1fVUlOVDMyIExvdzsKLSAgICBMTV9VSU5UMzIgSGlnaDsKLSNlbmRpZiAvKiAhQklHX0VORElBTl9IT1NUICovCisJTE1fVUlOVDMyIEhpZ2g7CisJTE1fVUlOVDMyIExvdzsKKyNlbHNlCQkJCS8qIEJJR19FTkRJQU5fSE9TVCAqLworCUxNX1VJTlQzMiBMb3c7CisJTE1fVUlOVDMyIEhpZ2g7CisjZW5kaWYJCQkJLyogIUJJR19FTkRJQU5fSE9TVCAqLwogfSBMTV9VSU5UNjQsICpQTE1fVUlOVDY0OwogCiB0eXBlZGVmIExNX1VJTlQ2NCBMTV9QSFlTSUNBTF9BRERSRVNTLCAqUExNX1BIWVNJQ0FMX0FERFJFU1M7CkBAIC01OCwxNSArNTcsMTMgQEAKIAl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0KIAotCiAjaWZuZGVmIE5VTEwKICNkZWZpbmUgTlVMTCAgICAgICAgICAgICAgICAoKHZvaWQgKikgMCkKLSNlbmRpZiAvKiBOVUxMICovCisjZW5kaWYJCQkJLyogTlVMTCAqLwogCiAjaWZuZGVmIE9GRlNFVE9GCiAjZGVmaW5lIE9GRlNFVE9GKF9zLCBfbSkgICAgKE1NX1VJTlRfUFRSKCYoKChfcyAqKSAwKS0+X20pKSkKLSNlbmRpZiAvKiBPRkZTRVRPRiAqLwotCisjZW5kaWYJCQkJLyogT0ZGU0VUT0YgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFNpbXBsZSBtYWNyb3MuICovCkBAIC0xMDAsMjYgKzk3LDI0IEBACiAgICAgKCh1bnNpZ25lZCBjaGFyICopIChfRHN0KSlbNF0gPSAoKHVuc2lnbmVkIGNoYXIgKikgKF9TcmMpKVs0XTsgICAgICAgICAgXAogICAgICgodW5zaWduZWQgY2hhciAqKSAoX0RzdCkpWzVdID0gKCh1bnNpZ25lZCBjaGFyICopIChfU3JjKSlbNV07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIENvbnN0YW50cy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNkZWZpbmUgRVRIRVJORVRfQUREUkVTU19TSVpFICAgICAgICAgICA2CiAjZGVmaW5lIEVUSEVSTkVUX1BBQ0tFVF9IRUFERVJfU0laRSAgICAgMTQKLSNkZWZpbmUgTUlOX0VUSEVSTkVUX1BBQ0tFVF9TSVpFICAgICAgICA2NCAgICAgIC8qIHdpdGggNCBieXRlIGNyYy4gKi8KLSNkZWZpbmUgTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFICAgICAgICAxNTE4ICAgIC8qIHdpdGggNCBieXRlIGNyYy4gKi8KKyNkZWZpbmUgTUlOX0VUSEVSTkVUX1BBQ0tFVF9TSVpFICAgICAgICA2NAkvKiB3aXRoIDQgYnl0ZSBjcmMuICovCisjZGVmaW5lIE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRSAgICAgICAgMTUxOAkvKiB3aXRoIDQgYnl0ZSBjcmMuICovCiAjZGVmaW5lIE1JTl9FVEhFUk5FVF9QQUNLRVRfU0laRV9OT19DUkMgNjAKICNkZWZpbmUgTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFX05PX0NSQyAxNTE0Ci0jZGVmaW5lIE1BWF9FVEhFUk5FVF9QQUNLRVRfQlVGRkVSX1NJWkUgMTUzNiAgICAvKiBBIG5pY2UgZXZlbiBudW1iZXIuICovCisjZGVmaW5lIE1BWF9FVEhFUk5FVF9QQUNLRVRfQlVGRkVSX1NJWkUgMTUzNgkvKiBBIG5pY2UgZXZlbiBudW1iZXIuICovCiAKICNpZm5kZWYgTE1fTUFYX01DX1RBQkxFX1NJWkUKICNkZWZpbmUgTE1fTUFYX01DX1RBQkxFX1NJWkUgICAgICAgICAgICAzMgotI2VuZGlmIC8qIExNX01BWF9NQ19UQUJMRV9TSVpFICovCisjZW5kaWYJCQkJLyogTE1fTUFYX01DX1RBQkxFX1NJWkUgKi8KICNkZWZpbmUgTE1fTUNfRU5UUllfU0laRSAgICAgICAgICAgICAgICAoRVRIRVJORVRfQUREUkVTU19TSVpFKzEpCiAjZGVmaW5lIExNX01DX0lOU1RBTkNFX0NPVU5UX0lOREVYICAgICAgKExNX01DX0VOVFJZX1NJWkUtMSkKIAotCiAvKiBSZWNlaXZlIGZpbHRlciBtYXNrcy4gKi8KICNkZWZpbmUgTE1fQUNDRVBUX1VOSUNBU1QgICAgICAgICAgICAgICAweDAwMDEKICNkZWZpbmUgTE1fQUNDRVBUX01VTFRJQ0FTVCAgICAgICAgICAgICAweDAwMDIKQEAgLTEyOSw3ICsxMjQsNiBAQAogCiAjZGVmaW5lIExNX1BST01JU0NVT1VTX01PREUgICAgICAgICAgICAgMHgxMDAwMAogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBQQ0kgcmVnaXN0ZXJzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE2OSwyMCArMTYzLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgTE1fVUlOVDMyIEZyYWdTaXplOwotICAgIExNX1BIWVNJQ0FMX0FERFJFU1MgRnJhZ0J1ZjsKKwlMTV9VSU5UMzIgRnJhZ1NpemU7CisJTE1fUEhZU0lDQUxfQUREUkVTUyBGcmFnQnVmOwogfSBMTV9GUkFHLCAqUExNX0ZSQUc7CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiBGcmFnQ291bnQgaXMgaW5pdGlhbGl6ZWQgZm9yIHRoZSBjYWxsZXIgdG8gdGhlIG1heGltdW0gYXJyYXkgc2l6ZSwgb24gKi8KLSAgICAvKiByZXR1cm4gRnJhZ0NvdW50IGlzIHRoZSBudW1iZXIgb2YgdGhlIGFjdHVhbCBmcmFnbWVudHMgaW4gdGhlIGFycmF5LiAqLwotICAgIExNX1VJTlQzMiBGcmFnQ291bnQ7CisJLyogRnJhZ0NvdW50IGlzIGluaXRpYWxpemVkIGZvciB0aGUgY2FsbGVyIHRvIHRoZSBtYXhpbXVtIGFycmF5IHNpemUsIG9uICovCisJLyogcmV0dXJuIEZyYWdDb3VudCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBhY3R1YWwgZnJhZ21lbnRzIGluIHRoZSBhcnJheS4gKi8KKwlMTV9VSU5UMzIgRnJhZ0NvdW50OwogCi0gICAgLyogVG90YWwgYnVmZmVyIHNpemUuICovCi0gICAgTE1fVUlOVDMyIFRvdGFsU2l6ZTsKKwkvKiBUb3RhbCBidWZmZXIgc2l6ZS4gKi8KKwlMTV9VSU5UMzIgVG90YWxTaXplOwogCi0gICAgLyogRnJhZ21lbnQgYXJyYXkgYnVmZmVyLiAqLwotICAgIExNX0ZSQUcgRnJhZ21lbnRzWzFdOworCS8qIEZyYWdtZW50IGFycmF5IGJ1ZmZlci4gKi8KKwlMTV9GUkFHIEZyYWdtZW50c1sxXTsKIH0gTE1fRlJBR19MSVNULCAqUExNX0ZSQUdfTElTVDsKIAogI2RlZmluZSBERUNMQVJFX0ZSQUdfTElTVF9CVUZGRVJfVFlQRShfRlJBR19MSVNUX1RZUEVfTkFNRSwgX01BWF9GUkFHX0NPVU5UKSBcCkBAIC0xOTEsNyArMTg1LDYgQEAKIAlMTV9GUkFHIEZyYWdMaXN0QnVmZmVyW19NQVhfRlJBR19DT1VOVC0xXTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSBfRlJBR19MSVNUX1RZUEVfTkFNRSwgKlAjI19GUkFHX0xJU1RfVFlQRV9OQU1FCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFN0YXR1cyBjb2Rlcy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMTcsNyArMjEwLDYgQEAKIAogdHlwZWRlZiBMTV9VSU5UIExNX1NUQVRVUywgKlBMTV9TVEFUVVM7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFJlcXVlc3RlZCBtZWRpYSB0eXBlLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI0MCw3ICsyMzIsNiBAQAogCiB0eXBlZGVmIExNX1VJTlQzMiBMTV9SRVFVRVNURURfTUVESUFfVFlQRSwgKlBMTV9SRVFVRVNURURfTUVESUFfVFlQRTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogTWVkaWEgdHlwZS4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNTQsNyArMjQ1LDYgQEAKIAogdHlwZWRlZiBMTV9VSU5UMzIgTE1fTUVESUFfVFlQRSwgKlBMTV9NRURJQV9UWVBFOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBMaW5lIHNwZWVkLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI2Niw3ICsyNTYsNiBAQAogCiB0eXBlZGVmIExNX1VJTlQzMiBMTV9MSU5FX1NQRUVELCAqUExNX0xJTkVfU1BFRUQ7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIER1cGxleCBtb2RlLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI3Nyw3ICsyNjYsNiBAQAogCiB0eXBlZGVmIExNX1VJTlQzMiBMTV9EVVBMRVhfTU9ERSwgKlBMTV9EVVBMRVhfTU9ERTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUG93ZXIgc3RhdGUuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjg5LDcgKzI3Nyw2IEBACiAKIHR5cGVkZWYgTE1fVUlOVDMyIExNX1BPV0VSX1NUQVRFLCAqUExNX1BPV0VSX1NUQVRFOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBUYXNrIG9mZmxvYWRpbmcuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzA1LDcgKzI5Miw2IEBACiAKIHR5cGVkZWYgTE1fVUlOVDMyIExNX1RBU0tfT0ZGTE9BRCwgKlBMTV9UQVNLX09GRkxPQUQ7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZsb3cgY29udHJvbC4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMjQsNyArMzEwLDYgQEAKIAogdHlwZWRlZiBMTV9VSU5UMzIgTE1fRkxPV19DT05UUk9MLCAqUExNX0ZMT1dfQ09OVFJPTDsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogV2FrZSB1cCBtb2RlLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTMzNiw3ICszMjEsNiBAQAogCiB0eXBlZGVmIExNX1VJTlQzMiBMTV9XQUtFX1VQX01PREUsICpQTE1fV0FLRV9VUF9NT0RFOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBDb3VudGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zNjIsNyArMzQ2LDYgQEAKIAogdHlwZWRlZiBMTV9VSU5UMzIgTE1fQ09VTlRFUl9UWVBFLCAqUExNX0NPVU5URVJfVFlQRTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRm9yd2FyZCBkZWZpbml0aW9uLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM3MCw4MiArMzUzLDgyIEBACiB0eXBlZGVmIHN0cnVjdCBfTE1fREVWSUNFX0JMT0NLICpQTE1fREVWSUNFX0JMT0NLOwogdHlwZWRlZiBzdHJ1Y3QgX0xNX1BBQ0tFVCAqUExNX1BBQ0tFVDsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxNX1NUQVRVUyBMTV9HZXRBZGFwdGVySW5mbyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotTE1fU1RBVFVTIExNX0luaXRpYWxpemVBZGFwdGVyKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1MTV9TVEFUVVMgTE1fUmVzZXRBZGFwdGVyKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1MTV9TVEFUVVMgTE1fRGlzYWJsZUludGVycnVwdChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotTE1fU1RBVFVTIExNX0VuYWJsZUludGVycnVwdChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotTE1fU1RBVFVTIExNX1NlbmRQYWNrZXQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpOwotTE1fU1RBVFVTIExNX1NlcnZpY2VJbnRlcnJ1cHRzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1MTV9TVEFUVVMgTE1fUXVldWVSeFBhY2tldHMoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLUxNX1NUQVRVUyBMTV9TZXRSZWNlaXZlTWFzayhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBNYXNrKTsKLUxNX1NUQVRVUyBMTV9IYWx0KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1MTV9TVEFUVVMgTE1fQWJvcnQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLUxNX1NUQVRVUyBMTV9NdWx0aWNhc3RBZGQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fVUlOVDggcE1jQWRkcmVzcyk7Ci1MTV9TVEFUVVMgTE1fTXVsdGljYXN0RGVsKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1VJTlQ4IHBNY0FkZHJlc3MpOwotTE1fU1RBVFVTIExNX011bHRpY2FzdENsZWFyKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1MTV9TVEFUVVMgTE1fU2V0TWFjQWRkcmVzcyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9VSU5UOCBwTWFjQWRkcmVzcyk7Ci1MTV9TVEFUVVMgTE1fTG9vcGJhY2tBZGRyZXNzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1VJTlQ4IHBBZGRyZXNzKTsKK0xNX1NUQVRVUyBMTV9HZXRBZGFwdGVySW5mbyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBMTV9Jbml0aWFsaXplQWRhcHRlciAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBMTV9SZXNldEFkYXB0ZXIgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTE1fRGlzYWJsZUludGVycnVwdCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBMTV9FbmFibGVJbnRlcnJ1cHQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTE1fU2VuZFBhY2tldCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpOworTE1fU1RBVFVTIExNX1NlcnZpY2VJbnRlcnJ1cHRzIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIExNX1F1ZXVlUnhQYWNrZXRzIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIExNX1NldFJlY2VpdmVNYXNrIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBNYXNrKTsKK0xNX1NUQVRVUyBMTV9IYWx0IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIExNX0Fib3J0IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworTE1fU1RBVFVTIExNX011bHRpY2FzdEFkZCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fVUlOVDggcE1jQWRkcmVzcyk7CitMTV9TVEFUVVMgTE1fTXVsdGljYXN0RGVsIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9VSU5UOCBwTWNBZGRyZXNzKTsKK0xNX1NUQVRVUyBMTV9NdWx0aWNhc3RDbGVhciAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBMTV9TZXRNYWNBZGRyZXNzIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9VSU5UOCBwTWFjQWRkcmVzcyk7CitMTV9TVEFUVVMgTE1fTG9vcGJhY2tBZGRyZXNzIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9VSU5UOCBwQWRkcmVzcyk7CiAKLUxNX1VJTlQzMiBMTV9HZXRDcmNDb3VudGVyKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9VSU5UMzIgTE1fR2V0Q3JjQ291bnRlciAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKIAotTE1fV0FLRV9VUF9NT0RFIExNX1BNQ2FwYWJpbGl0aWVzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1MTV9TVEFUVVMgTE1fTnd1ZkFkZChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBCeXRlTWFza1NpemUsCi0gICAgTE1fVUlOVDggKnBCeXRlTWFzaywgTE1fVUlOVDggKnBQYXR0ZXJuKTsKLUxNX1NUQVRVUyBMTV9Od3VmUmVtb3ZlKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIEJ5dGVNYXNrU2l6ZSwKLSAgICBMTV9VSU5UOCAqcEJ5dGVNYXNrLCBMTV9VSU5UOCAqcFBhdHRlcm4pOwotTE1fU1RBVFVTIExNX1NldFBvd2VyU3RhdGUoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9QT1dFUl9TVEFURSBQb3dlckxldmVsKTsKK0xNX1dBS0VfVVBfTU9ERSBMTV9QTUNhcGFiaWxpdGllcyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBMTV9Od3VmQWRkIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBCeXRlTWFza1NpemUsCisJCSAgICAgIExNX1VJTlQ4ICogcEJ5dGVNYXNrLCBMTV9VSU5UOCAqIHBQYXR0ZXJuKTsKK0xNX1NUQVRVUyBMTV9Od3VmUmVtb3ZlIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBCeXRlTWFza1NpemUsCisJCQkgTE1fVUlOVDggKiBwQnl0ZU1hc2ssIExNX1VJTlQ4ICogcFBhdHRlcm4pOworTE1fU1RBVFVTIExNX1NldFBvd2VyU3RhdGUgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkJCSAgICBMTV9QT1dFUl9TVEFURSBQb3dlckxldmVsKTsKIAotTE1fVk9JRCBMTV9SZWFkUGh5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIFBoeVJlZywKLSAgICBQTE1fVUlOVDMyIHBEYXRhMzIpOwotTE1fVk9JRCBMTV9Xcml0ZVBoeShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBQaHlSZWcsCi0gICAgTE1fVUlOVDMyIERhdGEzMik7CitMTV9WT0lEIExNX1JlYWRQaHkgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIFBoeVJlZywKKwkJICAgIFBMTV9VSU5UMzIgcERhdGEzMik7CitMTV9WT0lEIExNX1dyaXRlUGh5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBQaHlSZWcsCisJCSAgICAgTE1fVUlOVDMyIERhdGEzMik7CiAKLUxNX1NUQVRVUyBMTV9Db250cm9sTG9vcEJhY2soUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQ29udHJvbCk7Ci1MTV9TVEFUVVMgTE1fU2V0dXBQaHkoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLWludCBMTV9CbGlua0xFRChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBCbGlua0R1cmF0aW9uKTsKLQorTE1fU1RBVFVTIExNX0NvbnRyb2xMb29wQmFjayAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQ29udHJvbCk7CitMTV9TVEFUVVMgTE1fU2V0dXBQaHkgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitpbnQgTE1fQmxpbmtMRUQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIEJsaW5rRHVyYXRpb24pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogVGhlc2UgYXJlIHRoZSBPUyBzcGVjaWZpYyBmdW5jdGlvbnMgY2FsbGVkIGJ5IExNQUMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MTV9TVEFUVVMgTU1fUmVhZENvbmZpZzE2KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE9mZnNldCwKLSAgICBMTV9VSU5UMTYgKnBWYWx1ZTE2KTsKLUxNX1NUQVRVUyBNTV9Xcml0ZUNvbmZpZzE2KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE9mZnNldCwKLSAgICBMTV9VSU5UMTYgVmFsdWUxNik7Ci1MTV9TVEFUVVMgTU1fUmVhZENvbmZpZzMyKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE9mZnNldCwKLSAgICBMTV9VSU5UMzIgKnBWYWx1ZTMyKTsKLUxNX1NUQVRVUyBNTV9Xcml0ZUNvbmZpZzMyKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE9mZnNldCwKLSAgICBMTV9VSU5UMzIgVmFsdWUzMik7Ci1MTV9TVEFUVVMgTU1fTWFwTWVtQmFzZShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotTE1fU1RBVFVTIE1NX01hcElvQmFzZShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotTE1fU1RBVFVTIE1NX0luZGljYXRlUnhQYWNrZXRzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1MTV9TVEFUVVMgTU1fSW5kaWNhdGVUeFBhY2tldHMoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLUxNX1NUQVRVUyBNTV9TdGFydFR4RG1hKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KTsKLUxNX1NUQVRVUyBNTV9Db21wbGV0ZVR4RG1hKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KTsKLUxNX1NUQVRVUyBNTV9BbGxvY2F0ZU1lbW9yeShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBCbG9ja1NpemUsCi0gICAgUExNX1ZPSUQgKnBNZW1vcnlCbG9ja1ZpcnQpOwotTE1fU1RBVFVTIE1NX0FsbG9jYXRlU2hhcmVkTWVtb3J5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIEJsb2NrU2l6ZSwKLSAgICBQTE1fVk9JRCAqcE1lbW9yeUJsb2NrVmlydCwgUExNX1BIWVNJQ0FMX0FERFJFU1MgcE1lbW9yeUJsb2NrUGh5LAotICAgIExNX0JPT0wgQ2FjaGVkKTsKLUxNX1NUQVRVUyBNTV9HZXRDb25maWcoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLUxNX1NUQVRVUyBNTV9JbmRpY2F0ZVN0YXR1cyhQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1NUQVRVUyBTdGF0dXMpOwotTE1fU1RBVFVTIE1NX0luaXRpYWxpemVVbVBhY2tldHMoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLUxNX1NUQVRVUyBNTV9GcmVlUnhCdWZmZXIoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpOwotTE1fU1RBVFVTIE1NX0NvYWxlc2NlVHhCdWZmZXIoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpOwotTE1fU1RBVFVTIExNX01idWZXb3JrQXJvdW5kKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1MTV9TVEFUVVMgTE1fU2V0TGlua1NwZWVkKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLQkJCSAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEUgUmVxdWVzdGVkTWVkaWFUeXBlKTsKK0xNX1NUQVRVUyBNTV9SZWFkQ29uZmlnMTYgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE9mZnNldCwKKwkJCSAgIExNX1VJTlQxNiAqIHBWYWx1ZTE2KTsKK0xNX1NUQVRVUyBNTV9Xcml0ZUNvbmZpZzE2IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBPZmZzZXQsCisJCQkgICAgTE1fVUlOVDE2IFZhbHVlMTYpOworTE1fU1RBVFVTIE1NX1JlYWRDb25maWczMiAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgT2Zmc2V0LAorCQkJICAgTE1fVUlOVDMyICogcFZhbHVlMzIpOworTE1fU1RBVFVTIE1NX1dyaXRlQ29uZmlnMzIgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE9mZnNldCwKKwkJCSAgICBMTV9VSU5UMzIgVmFsdWUzMik7CitMTV9TVEFUVVMgTU1fTWFwTWVtQmFzZSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBNTV9NYXBJb0Jhc2UgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTU1fSW5kaWNhdGVSeFBhY2tldHMgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTU1fSW5kaWNhdGVUeFBhY2tldHMgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTU1fU3RhcnRUeERtYSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQpOworTE1fU1RBVFVTIE1NX0NvbXBsZXRlVHhEbWEgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KTsKK0xNX1NUQVRVUyBNTV9BbGxvY2F0ZU1lbW9yeSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgQmxvY2tTaXplLAorCQkJICAgICBQTE1fVk9JRCAqIHBNZW1vcnlCbG9ja1ZpcnQpOworTE1fU1RBVFVTIE1NX0FsbG9jYXRlU2hhcmVkTWVtb3J5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisJCQkJICAgTE1fVUlOVDMyIEJsb2NrU2l6ZSwKKwkJCQkgICBQTE1fVk9JRCAqIHBNZW1vcnlCbG9ja1ZpcnQsCisJCQkJICAgUExNX1BIWVNJQ0FMX0FERFJFU1MgcE1lbW9yeUJsb2NrUGh5LAorCQkJCSAgIExNX0JPT0wgQ2FjaGVkKTsKK0xNX1NUQVRVUyBNTV9HZXRDb25maWcgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTU1fSW5kaWNhdGVTdGF0dXMgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fU1RBVFVTIFN0YXR1cyk7CitMTV9TVEFUVVMgTU1fSW5pdGlhbGl6ZVVtUGFja2V0cyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK0xNX1NUQVRVUyBNTV9GcmVlUnhCdWZmZXIgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KTsKK0xNX1NUQVRVUyBNTV9Db2FsZXNjZVR4QnVmZmVyIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9QQUNLRVQgcFBhY2tldCk7CitMTV9TVEFUVVMgTE1fTWJ1ZldvcmtBcm91bmQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTE1fU2V0TGlua1NwZWVkIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisJCQkgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRSBSZXF1ZXN0ZWRNZWRpYVR5cGUpOwogCiAjaWYgSU5DTFVERV81NzAzX0EwX0ZJWAotTE1fU1RBVFVTIExNX0xvYWQ1NzAzRG1hV0Zpcm13YXJlKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTE1fTG9hZDU3MDNEbWFXRmlybXdhcmUgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CiAjZW5kaWYKIAotCi0jZW5kaWYgLyogTE1fSCAqLworI2VuZGlmCQkJCS8qIExNX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtNTcweF9tbS5oIGIvZHJpdmVycy9iY201NzB4X21tLmgKaW5kZXggYjdjYmY4YS4uZmY1MzAyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iY201NzB4X21tLmgKKysrIGIvZHJpdmVycy9iY201NzB4X21tLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogI2RlZmluZSBNTV9QQUNLRVRfREVTQ19TSVpFIE1NX1BhY2tldF9EZXNjX1NpemUKIAotREVDTEFSRV9RVUVVRV9UWVBFKFVNX1JYX1BBQ0tFVF9RLCBNQVhfUlhfUEFDS0VUX0RFU0NfQ09VTlQrMSk7CitERUNMQVJFX1FVRVVFX1RZUEUgKFVNX1JYX1BBQ0tFVF9RLCBNQVhfUlhfUEFDS0VUX0RFU0NfQ09VTlQgKyAxKTsKIAogI2RlZmluZSBNQVhfTUVNIDE2CiAKQEAgLTY1LDUxICs2NSw1MCBAQAogCWludCBtdHU7CiAJaW50IGluZGV4OwogCWludCBvcGVuZWQ7Ci0JaW50IGRlbGF5ZWRfbGlua19pbmQ7IC8qIERlbGF5IGxpbmsgc3RhdHVzIGR1cmluZyBpbml0aWFsIGxvYWQgKi8KLQlpbnQgYWRhcHRlcl9qdXN0X2luaXRlZDsgLyogdGhlIGZpcnN0IGZldyBzZWNvbmRzIGFmdGVyIGluaXQuICovCi0JaW50IHNwdXJpb3VzX2ludDsgICAgICAgICAgICAvKiBuZXcgLS0gdW5zdXBwb3J0ZWQgKi8KKwlpbnQgZGVsYXllZF9saW5rX2luZDsJLyogRGVsYXkgbGluayBzdGF0dXMgZHVyaW5nIGluaXRpYWwgbG9hZCAqLworCWludCBhZGFwdGVyX2p1c3RfaW5pdGVkOwkvKiB0aGUgZmlyc3QgZmV3IHNlY29uZHMgYWZ0ZXIgaW5pdC4gKi8KKwlpbnQgc3B1cmlvdXNfaW50OwkvKiBuZXcgLS0gdW5zdXBwb3J0ZWQgKi8KIAlpbnQgdGltZXJfaW50ZXJ2YWw7CiAJaW50IGFkYXB0aXZlX2V4cGlyeTsKLQlpbnQgY3JjX2NvdW50ZXJfZXhwaXJ5OyAgICAgICAgIC8qIG5ldyAtLSB1bnN1cHBvcnRlZCAqLwotCWludCBwb2xsX3RpYl9leHBpcnk7ICAgICAgICAgLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCisJaW50IGNyY19jb3VudGVyX2V4cGlyeTsJLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCisJaW50IHBvbGxfdGliX2V4cGlyeTsJLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCiAJaW50IHR4X2Z1bGw7CiAJaW50IHR4X3F1ZXVlZDsKIAlpbnQgbGluZV9zcGVlZDsJCS8qIGluIE1icHMsIDAgaWYgbGluayBpcyBkb3duICovCiAJVU1fUlhfUEFDS0VUX1Egcnhfb3V0X29mX2J1Zl9xOwogCWludCByeF9vdXRfb2ZfYnVmOwotCWludCByeF9sb3dfYnVmX3RocmVzaDsgLyogY2hhbmdlZCB0byByeF9idWZfcmVwbF90aHJlc2ggKi8KKwlpbnQgcnhfbG93X2J1Zl90aHJlc2g7CS8qIGNoYW5nZWQgdG8gcnhfYnVmX3JlcGxfdGhyZXNoICovCiAJaW50IHJ4X2J1Zl9yZXBsX3BhbmljX3RocmVzaDsKLQlpbnQgcnhfYnVmX2FsaWduOyAgICAgICAgICAgIC8qIG5ldyAtLSB1bnN1cHBvcnRlZCAqLworCWludCByeF9idWZfYWxpZ247CS8qIG5ldyAtLSB1bnN1cHBvcnRlZCAqLwogCWludCBkb19nbG9iYWxfbG9jazsKIAltdXRleF90IGdsb2JhbF9sb2NrOwogCW11dGV4X3QgdW5kaV9sb2NrOwogCWxvbmcgdW5kaV9mbGFnczsKIAl2b2xhdGlsZSBpbnQgaW50ZXJydXB0OwogCWludCB0YXNrbGV0X3BlbmRpbmc7Ci0JaW50IHRhc2tsZXRfYnVzeTsJICAgICAvKiBuZXcgLS0gdW5zdXBwb3J0ZWQgKi8KKwlpbnQgdGFza2xldF9idXN5OwkvKiBuZXcgLS0gdW5zdXBwb3J0ZWQgKi8KIAlpbnQgcnhfcGt0OwogCWludCB0eF9wa3Q7Ci0jaWZkZWYgTklDRV9TVVBQT1JUICAgLyogdW5zdXBwb3J0ZWQsIHRoaXMgaXMgYSBsaW51eCBpb2N0bCAqLwotCXZvaWQgKCpuaWNlX3J4KSh2b2lkKiwgdm9pZCogKTsKLQl2b2lkKiBuaWNlX2N0eDsKLSNlbmRpZiAvKiBOSUNFX1NVUFBPUlQgKi8KKyNpZmRlZiBOSUNFX1NVUFBPUlQJCS8qIHVuc3VwcG9ydGVkLCB0aGlzIGlzIGEgbGludXggaW9jdGwgKi8KKwl2b2lkICgqbmljZV9yeCkgKHZvaWQgKiwgdm9pZCAqKTsKKwl2b2lkICpuaWNlX2N0eDsKKyNlbmRpZgkJCQkvKiBOSUNFX1NVUFBPUlQgKi8KIAlpbnQgcnhfYWRhcHRpdmVfY29hbGVzY2U7CiAJdW5zaWduZWQgaW50IHJ4X2xhc3RfY250OwogCXVuc2lnbmVkIGludCB0eF9sYXN0X2NudDsKIAl1bnNpZ25lZCBpbnQgcnhfY3Vycl9jb2FsZXNjZV9mcmFtZXM7CiAJdW5zaWduZWQgaW50IHJ4X2N1cnJfY29hbGVzY2VfdGlja3M7Ci0JdW5zaWduZWQgaW50IHR4X2N1cnJfY29hbGVzY2VfZnJhbWVzOyAgLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCi0jaWYgVElHT04zX0RFQlVHICAgICAgICAgIC8qIG5ldyAtLSB1bnN1cHBvcnRlZCAqLworCXVuc2lnbmVkIGludCB0eF9jdXJyX2NvYWxlc2NlX2ZyYW1lczsJLyogbmV3IC0tIHVuc3VwcG9ydGVkICovCisjaWYgVElHT04zX0RFQlVHCQkvKiBuZXcgLS0gdW5zdXBwb3J0ZWQgKi8KIAl1aW50IHR4X3pjX2NvdW50OwogCXVpbnQgdHhfY2hrc3VtX2NvdW50OwogCXVpbnQgdHhfaGltZW1fY291bnQ7CiAJdWludCByeF9nb29kX2Noa3N1bV9jb3VudDsKICNlbmRpZgotCXVuc2lnbmVkIGludCByeF9iYWRfY2hrc3VtX2NvdW50OyAgIC8qIG5ldyAtLSB1bnN1cHBvcnRlZCAqLwotCXVuc2lnbmVkIGludCByeF9taXNjX2Vycm9yczsgICAgICAgIC8qIG5ldyAtLSB1bnN1cHBvcnRlZCAqLworCXVuc2lnbmVkIGludCByeF9iYWRfY2hrc3VtX2NvdW50OwkvKiBuZXcgLS0gdW5zdXBwb3J0ZWQgKi8KKwl1bnNpZ25lZCBpbnQgcnhfbWlzY19lcnJvcnM7CS8qIG5ldyAtLSB1bnN1cHBvcnRlZCAqLwogfSBVTV9ERVZJQ0VfQkxPQ0ssICpQVU1fREVWSUNFX0JMT0NLOwogCi0KIC8qIFBoeXNpY2FsL1BDSSBETUEgYWRkcmVzcyAqLwogdHlwZWRlZiB1bmlvbiB7CiAJZG1hX2FkZHJfdCBkbWFfbWFwOwpAQCAtMTE3LDkgKzExNiw5IEBACiAKIC8qIFBhY2tldCAqLwogdHlwZWRlZiBzdHJ1Y3QKLV9VTV9QQUNLRVQgewotICAgIExNX1BBQ0tFVCBsbV9wYWNrZXQ7Ci0gICAgdm9pZCogc2tidWZmOyAgICAgIC8qIEFkZHJlc3Mgb2YgcGFja2V0IGJ1ZmZlciAqLworICAgIF9VTV9QQUNLRVQgeworCUxNX1BBQ0tFVCBsbV9wYWNrZXQ7CisJdm9pZCAqc2tidWZmOwkJLyogQWRkcmVzcyBvZiBwYWNrZXQgYnVmZmVyICovCiB9IFVNX1BBQ0tFVCwgKlBVTV9QQUNLRVQ7CiAKICNkZWZpbmUgTU1fQUNRVUlSRV9VTkRJX0xPQ0soX3BEZXZpY2UpCkBAIC0xMzcsMTUgKzEzNiwxNCBAQAogCiAjZGVmaW5lIE1FTV9UT19QQ0lfUEhZUyhhZGRyKSAoYWRkcikKIAotZXh0ZXJuIHZvaWQgTU1fU2V0QWRkciAoTE1fUEhZU0lDQUxfQUREUkVTUyAqcGFkZHIsIGRtYV9hZGRyX3QgYWRkcik7Ci1leHRlcm4gdm9pZCBNTV9TZXRUM0FkZHIoVDNfNjRCSVRfSE9TVF9BRERSICpwYWRkciwgZG1hX2FkZHJfdCBhZGRyKTsKK2V4dGVybiB2b2lkIE1NX1NldEFkZHIgKExNX1BIWVNJQ0FMX0FERFJFU1MgKiBwYWRkciwgZG1hX2FkZHJfdCBhZGRyKTsKK2V4dGVybiB2b2lkIE1NX1NldFQzQWRkciAoVDNfNjRCSVRfSE9TVF9BRERSICogcGFkZHIsIGRtYV9hZGRyX3QgYWRkcik7CiBleHRlcm4gdm9pZCBNTV9NYXBUeERtYSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotCQkJIHN0cnVjdCBfTE1fUEFDS0VUICpwUGFja2V0LCBUM182NEJJVF9IT1NUX0FERFIgKnBhZGRyLAotCQkJIExNX1VJTlQzMiAqbGVuLCBpbnQgZnJhZyk7Ci1leHRlcm4gdm9pZCBNTV9NYXBSeERtYSAoIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLQkJCSAgc3RydWN0IF9MTV9QQUNLRVQgKnBQYWNrZXQsCi0JCQkgIFQzXzY0QklUX0hPU1RfQUREUiAqcGFkZHIpOwotCisJCQkgc3RydWN0IF9MTV9QQUNLRVQgKnBQYWNrZXQsIFQzXzY0QklUX0hPU1RfQUREUiAqIHBhZGRyLAorCQkJIExNX1VJTlQzMiAqIGxlbiwgaW50IGZyYWcpOworZXh0ZXJuIHZvaWQgTU1fTWFwUnhEbWEgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkJCSBzdHJ1Y3QgX0xNX1BBQ0tFVCAqcFBhY2tldCwKKwkJCSBUM182NEJJVF9IT1NUX0FERFIgKiBwYWRkcik7CiAKIC8qIEJTUCBuZWVkcyB0byBwcm92aWRlIHN5c1VzZWNEZWxheSBhbmQgc3lzU2VyaWFsUHJpbnRTdHJpbmcgKi8KIGV4dGVybiB2b2lkIHN5c1NlcmlhbFByaW50U3RyaW5nIChjaGFyICpzKTsKQEAgLTE1Nyw0ICsxNTUsNCBAQAogI2lmIDAKICNkZWZpbmUgY3B1X3RvX2xlMzIodmFsKSBMT05HU1dBUCh2YWwpCiAjZW5kaWYKLSNlbmRpZiAvKiBNTV9IICovCisjZW5kaWYJCQkJLyogTU1fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL01ha2VmaWxlIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NmU4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvTWFrZWZpbGUKQEAgLTAsMCArMSwzMCBAQAoraW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQiA6PSAkKG9iailsaWJhdGliaW9zZW11LmEKKworWDg2RElSICA9IC4veDg2ZW11CisKK09CSlMJPSBhdGliaW9zLm8gYmlvc2VtdS5vIGJlc3lzLm8gYmlvcy5vICBcCisJJChYODZESVIpL2RlY29kZS5vIFwKKwkkKFg4NkRJUikvb3BzMi5vIFwKKwkkKFg4NkRJUikvb3BzLm8gXAorCSQoWDg2RElSKS9wcmltX29wcy5vIFwKKwkkKFg4NkRJUikvc3lzLm8gXAorCSQoWDg2RElSKS9kZWJ1Zy5vCisKK0NGTEFHUyArPSAtSS4gLUkuL2luY2x1ZGUgIC1JJChYODZESVIpIC1JJChUT1BESVIpL2luY2x1ZGUgXAorCS1EX19QUENfXyAgLURfX0JJR19FTkRJQU5fXworCithbGw6CSQoTElCKQorCiskKExJQik6ICQoT0JKUykKKwkkKEFSKSBjcnYgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy5kZXBlbmQ6CU1ha2VmaWxlICQoT0JKUzoubz0uYykKKwkJJChDQykgLU0gJChDRkxBR1MpICQoT0JKUzoubz0uYykgPiAkQAorCitzaW5jbHVkZSAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9hdGliaW9zLmMgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvYXRpYmlvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NzlmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvYXRpYmlvcy5jCkBAIC0wLDAgKzEsMzQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJICAgICBWaWRlbyBCT09UIEdyYXBoaWNzIENhcmQgUE9TVCBNb2R1bGUKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiAgIENvcHlyaWdodCAoQykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiAgIEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisqCisqICAgQ29weXJpZ2h0IChDKSAxOTkxLTIwMDQgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiAgIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyogICBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBhcHBlYXJpbmcgaW4gdGhlIGZpbGUgTElDRU5TRS5HUEwgaW5jbHVkZWQKKyogICBpbiB0aGUgcGFja2FnaW5nIG9mIHRoaXMgZmlsZS4KKyoKKyogICBMaWNlbnNlZXMgaG9sZGluZyBhIHZhbGlkIENvbW1lcmNpYWwgTGljZW5zZSBmb3IgdGhpcyBwcm9kdWN0IGZyb20KKyogICBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuIG1heSB1c2UgdGhpcyBmaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKKyogICBDb21tZXJjaWFsIExpY2Vuc2UgQWdyZWVtZW50IHByb3ZpZGVkIHdpdGggdGhlIFNvZnR3YXJlLgorKgorKiAgIFRoaXMgZmlsZSBpcyBwcm92aWRlZCBBUyBJUyB3aXRoIE5PIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBJTkNMVURJTkcKKyogICBUSEUgV0FSUkFOVFkgT0YgREVTSUdOLCBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorKiAgIFBVUlBPU0UuCisqCisqICAgU2VlIGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL2xpY2Vuc2UvIGZvciBpbmZvcm1hdGlvbiBhYm91dAorKiAgIHRoZSBsaWNlbnNpbmcgb3B0aW9ucyBhdmFpbGFibGUgYW5kIGhvdyB0byBwdXJjaGFzZSBhIENvbW1lcmNpYWwKKyogICBMaWNlbnNlIEFncmVlbWVudC4KKyoKKyogICBDb250YWN0IGxpY2Vuc2VAc2NpdGVjaHNvZnQuY29tIGlmIGFueSBjb25kaXRpb25zIG9mIHRoaXMgbGljZW5zaW5nCisqICAgYXJlIG5vdCBjbGVhciB0byB5b3UsIG9yIHlvdSBoYXZlIHF1ZXN0aW9ucyBhYm91dCBsaWNlbnNpbmcgb3B0aW9ucy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZToJQU5TSSBDCisqIEVudmlyb25tZW50OglMaW51eCBLZXJuZWwKKyogRGV2ZWxvcGVyOglLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246CU1vZHVsZSB0byBpbXBsZW1lbnQgYm9vdGluZyBQQ0kvQUdQIGNvbnRyb2xsZXJzIG9uIHRoZQorKgkJYnVzLiBXZSB1c2UgdGhlIHg4NiByZWFsIG1vZGUgZW11bGF0b3IgdG8gcnVuIHRoZSBCSU9TIG9uCisqCQlncmFwaGljcyBjb250cm9sbGVycyB0byBicmluZyB0aGUgY2FyZHMgdXAuCisqCisqCQlOb3RlIHRoYXQgYXQgcHJlc2VudCB0aGlzIG1vZHVsZSBkb2VzICpub3QqIHN1cHBvcnQKKyoJCW11bHRpcGxlIGNvbnRyb2xsZXJzLgorKgorKgkJVGhlIG9yaWduYWwgbmFtZSBvZiB0aGlzIGZpbGUgaXMgd2FybWJvb3QuYy4KKyoJCUphc29uIHBvcnRlZCB0aGlzIGZpbGUgdG8gdS1ib290IHRvIHJ1biB0aGUgQVRJIHZpZGVvIGNhcmQKKyoJCUJJT1MgaW4gdS1ib290LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19CSU9TRU1VCisKKyNpbmNsdWRlICJiaW9zZW11aS5oIgorI2luY2x1ZGUgPG1hbGxvYy5oPgorCisvKiBMZW5ndGggb2YgdGhlIEJJT1MgaW1hZ2UgKi8KKyNkZWZpbmUgTUFYX0JJT1NMRU4JICAgICgxMjggKiAxMDI0TCkKKworLyogRGVmaW5lIHNvbWUgdXNlZnVsIHR5cGVzIGFuZCBtYWNyb3MgKi8KKyNkZWZpbmUgdHJ1ZQkJICAgIDEKKyNkZWZpbmUgZmFsc2UJCSAgICAwCisKKy8qIFBsYWNlIHRvIHNhdmUgUENJIEJBUidzIHRoYXQgd2UgY2hhbmdlIGFuZCBsYXRlciByZXN0b3JlICovCitzdGF0aWMgdTMyIHNhdmVST01CYXNlQWRkcmVzczsKK3N0YXRpYyB1MzIgc2F2ZUJhc2VBZGRyZXNzMTA7CitzdGF0aWMgdTMyIHNhdmVCYXNlQWRkcmVzczE0Oworc3RhdGljIHUzMiBzYXZlQmFzZUFkZHJlc3MxODsKK3N0YXRpYyB1MzIgc2F2ZUJhc2VBZGRyZXNzMjA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcGNpZGV2CS0gUENJIGRldmljZSBpbmZvIGZvciB0aGUgdmlkZW8gY2FyZCBvbiB0aGUgYnVzIHRvIGJvb3QKK1ZHQUluZm8gLSBCSU9TIGVtdWxhdG9yIFZHQSBpbmZvIHN0cnVjdHVyZQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgQklPUyBQT1NUIGNvZGUgb24gdGhlIGNvbnRyb2xsZXIuIFdlIGFzc3VtZSB0aGF0CithdCB0aGlzIHN0YWdlIHRoZSBjb250cm9sbGVyIGhhcyBpdHMgSS9PIGFuZCBtZW1vcnkgc3BhY2UgZW5hYmxlZCBhbmQKK3RoYXQgYWxsIG90aGVyIGNvbnRyb2xsZXJzIGFyZSBpbiBhIGRpc2FibGVkIHN0YXRlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFBDSV9kb0JJT1NQT1NUKHBjaV9kZXZfdCBwY2lkZXYsIEJFX1ZHQUluZm8gKiBWR0FJbmZvKQoreworCVJNUkVHUyByZWdzOworCVJNU1JFR1Mgc3JlZ3M7CisKKwkvKiBEZXRlcm1pbmUgdGhlIHZhbHVlIHRvIHN0b3JlIGluIEFYIGZvciBCSU9TIFBPU1QuIFBlciB0aGUgUENJIHNwZWNzLAorCSBBSCBtdXN0IGNvbnRhaW4gdGhlIGJ1cyBhbmQgQUwgbXVzdCBjb250YWluIHRoZSBkZXZmbiwgZW5jb2RlZCBhcworCSAoZGV2IDw8IDMpIHwgZm4KKwkgKi8KKwltZW1zZXQoJnJlZ3MsIDAsIHNpemVvZihyZWdzKSk7CisJbWVtc2V0KCZzcmVncywgMCwgc2l6ZW9mKHNyZWdzKSk7CisJcmVncy54LmF4ID0gKChpbnQpUENJX0JVUyhwY2lkZXYpIDw8IDgpIHwKKwkgICAgKChpbnQpUENJX0RFVihwY2lkZXYpIDw8IDMpIHwgKGludClQQ0lfRlVOQyhwY2lkZXYpOworCisJLypTZXR1cCB0aGUgWDg2IGVtdWxhdG9yIGZvciB0aGUgVkdBIEJJT1MqLworCUJFX3NldFZHQShWR0FJbmZvKTsKKworCS8qRXhlY3V0ZSB0aGUgQklPUyBQT1NUIGNvZGUqLworCUJFX2NhbGxSZWFsTW9kZSgweEMwMDAsIDB4MDAwMywgJnJlZ3MsICZzcmVncyk7CisKKwkvKkNsZWFudXAgYW5kIGV4aXQqLworCUJFX2dldFZHQShWR0FJbmZvKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitwY2lkZXYJLSBQQ0kgZGV2aWNlIGluZm8gZm9yIHRoZSB2aWRlbyBjYXJkIG9uIHRoZSBidXMKK2JhcgktIFBsYWNlIHRvIHJldHVybiB0aGUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIG9mZnNldCB0byB1c2UKKworUkVUVVJOUzoKK1RoZSBhZGRyZXNzIHRvIHVzZSB0byBtYXAgdGhlIHNlY29uZGFyeSBCSU9TIChBR1AgZGV2aWNlcykKKworUkVNQVJLUzoKK1NlYXJjaGVzIGFsbCB0aGUgUENJIGJhc2UgYWRkcmVzcyByZWdpc3RlcnMgZm9yIHRoZSBkZXZpY2UgbG9va2luZyBmb3IgYQorbWVtb3J5IG1hcHBpbmcgdGhhdCBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXIgUk9NIEJJT1MuIFdlIHVzdWFsbHkgZW5kIHVwCitmaW5kaW5nIHRoZSBmcmFtZWJ1ZmZlciBtYXBwaW5nICh1c3VhbGx5IEJBUiAweDEwKSwgYW5kIHdlIHVzZSB0aGlzIG1hcHBpbmcKK3RvIG1hcCB0aGUgQklPUyBmb3IgdGhlIGRldmljZSBpbnRvLiBXZSB1c2UgYSBtYXBwaW5nIHRoYXQgaXMgYWxyZWFkeQorYXNzaWduZWQgdG8gdGhlIGRldmljZSB0byBlbnN1cmUgdGhlIG1lbW9yeSByYW5nZSB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoCitieSBhbnkgUENJLT5QQ0kgb3IgQUdQLT5QQ0kgYnJpZGdlIHRoYXQgbWF5IGJlIHByZXNlbnQuCisKK05PVEU6IFVzdWFsbHkgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgZm9yIEFHUCBkZXZpY2VzLCBidXQgaXQgbWF5IGJlCisgICAgICB1c2VkIGZvciBQQ0kgZGV2aWNlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIFBPU1QnZWQgYW5kIHRoZSBCSU9TCisgICAgICBST00gYmFzZSBhZGRyZXNzIGhhcyBiZWVuIHplcm8nZWQgb3V0LgorCitOT1RFOiBUaGlzIGZ1bmN0aW9uIGxlYXZlcyB0aGUgb3JpZ2luYWwgbWVtb3J5IGFwZXJ0dXJlIGRpc2FibGVkIGJ5IGxlYXZpbmcKKyAgICAgIGl0IHByb2dyYW1tZWQgdG8gYWxsIDEncy4gSXQgbXVzdCBiZSByZXN0b3JlZCB0byB0aGUgY29ycmVjdCB2YWx1ZQorICAgICAgbGF0ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHUzMiBQQ0lfZmluZEJJT1NBZGRyKHBjaV9kZXZfdCBwY2lkZXYsIGludCAqYmFyKQoreworCXUzMiBiYXNlLCBzaXplOworCisJZm9yICgqYmFyID0gMHgxMDsgKmJhciA8PSAweDE0OyAoKmJhcikgKz0gNCkgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCAqYmFyLCAmYmFzZSk7CisJCWlmICghKGJhc2UgJiAweDEpKSB7CisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaWRldiwgKmJhciwgMHhGRkZGRkZGRik7CisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCAqYmFyLCAmc2l6ZSk7CisJCQlzaXplID0gfihzaXplICYgfjB4RkYpICsgMTsKKwkJCWlmIChzaXplID49IE1BWF9CSU9TTEVOKQorCQkJCXJldHVybiBiYXNlICYgfjB4RkY7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU29tZSBub24teDg2IExpbnV4IGtlcm5lbHMgbWFwIFBDSSByZWxvY2F0ZWFibGUgSS9PIHRvIHZhbHVlcyB0aGF0CithcmUgYWJvdmUgNjRLLCB3aGljaCB3aWxsIG5vdCB3b3JrIHdpdGggdGhlIEJJT1MgaW1hZ2UgdGhhdCByZXF1aXJlcwordGhlIG9mZnNldCBmb3IgdGhlIEkvTyBwb3J0cyB0byBiZSBhIG1heGltdW0gb2YgMTYtYml0cy4gSWRlYWxseQorc29tZW9uZSBzaG91bGQgZml4IHRoZSBrZXJuZWwgdG8gbWFwIHRoZSBJL08gcG9ydHMgZm9yIFZHQSBjb21wYXRpYmxlCitkZXZpY2VzIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uIChvciBqdXN0IGFsbCBJL08gcG9ydHMgc2luY2UgaXQgaXMKK3VubGlrZWx5IHlvdSBjYW4gaGF2ZSBlbm91Z2ggZGV2aWNlcyBpbiB0aGUgbWFjaGluZSB0byB1c2UgdXAgYWxsCis2NEsgb2YgdGhlIEkvTyBzcGFjZSAtIGEgdG90YWwgb2YgbW9yZSB0aGFuIDI1NiBjYXJkcyB3b3VsZCBiZQorbmVjZXNzYXJ5KS4KKworQW55d2F5IHRvIGZpeCB0aGlzIHdlIGNoYW5nZSBhbGwgSS9PIG1hcHBlZCBiYXNlIHJlZ2lzdGVycyBhbmQKK2Nob3Agb2ZmIHRoZSB0b3AgYml0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBQQ0lfZml4dXBJT2Jhc2UocGNpX2Rldl90IHBjaWRldiwgaW50IHJlZywgdTMyICogYmFzZSkKK3sKKwlpZiAoKCpiYXNlICYgMHgxKSAmJiAoKmJhc2UgPiAweEZGRkUpKSB7CisJCSpiYXNlICY9IDB4RkZGRjsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIHJlZywgKmJhc2UpOworCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BjaWRldgktIFBDSSBkZXZpY2UgaW5mbyBmb3IgdGhlIHZpZGVvIGNhcmQgb24gdGhlIGJ1cworCitSRVRVUk5TOgorUG9pbnRlcnMgdG8gdGhlIG1hcHBlZCBCSU9TIGltYWdlCisKK1JFTUFSS1M6CitNYXBzIGEgcG9pbnRlciB0byB0aGUgQklPUyBpbWFnZSBvbiB0aGUgZ3JhcGhpY3MgY2FyZCBvbiB0aGUgUENJIGJ1cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICpQQ0lfbWFwQklPU0ltYWdlKHBjaV9kZXZfdCBwY2lkZXYpCit7CisJdTMyIEJJT1NJbWFnZVBoeXM7CisJaW50IEJJT1NJbWFnZUJBUjsKKwl1OCAqQklPU0ltYWdlOworCisJLypTYXZlIFBDSSBCQVIgcmVnaXN0ZXJzIHRoYXQgbWlnaHQgZ2V0IGNoYW5nZWQqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9ST01fQUREUkVTUywgJnNhdmVST01CYXNlQWRkcmVzcyk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18wLCAmc2F2ZUJhc2VBZGRyZXNzMTApOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMSwgJnNhdmVCYXNlQWRkcmVzczE0KTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzIsICZzYXZlQmFzZUFkZHJlc3MxOCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU180LCAmc2F2ZUJhc2VBZGRyZXNzMjApOworCisJLypGaXggdXAgSS9PIGJhc2UgcmVnaXN0ZXJzIHRvIGxlc3MgdGhhbiA2NEsgKi8KKwlpZihzYXZlQmFzZUFkZHJlc3MxNCAhPSAwKQorCQlQQ0lfZml4dXBJT2Jhc2UocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzEsICZzYXZlQmFzZUFkZHJlc3MxNCk7CisJZWxzZQorCQlQQ0lfZml4dXBJT2Jhc2UocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzQsICZzYXZlQmFzZUFkZHJlc3MyMCk7CisKKwkvKiBTb21lIGNhcmRzIGhhdmUgcHJvYmxlbXMgdGhhdCBzdG9wIHVzIGZyb20gYmVpbmcgYWJsZSB0byByZWFkIHRoZQorCSBCSU9TIGltYWdlIGZyb20gdGhlIFJPTSBCQVIuIFRvIGZpeCB0aGlzIHdlIGhhdmUgdG8gZG8gc29tZSBjaGlwc2V0CisJIHNwZWNpZmljIHByb2dyYW1taW5nIGZvciBkaWZmZXJlbnQgY2FyZHMgdG8gc29sdmUgdGhpcyBwcm9ibGVtLgorCSovCisKKwlpZiAoKEJJT1NJbWFnZVBoeXMgPSBQQ0lfZmluZEJJT1NBZGRyKHBjaWRldiwgJkJJT1NJbWFnZUJBUikpID09IDApIHsKKwkJcHJpbnRmKCJGaW5kIGJpb3MgYWRkciBlcnJvclxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCUJJT1NJbWFnZSA9ICh1OCAqKSBCSU9TSW1hZ2VQaHlzOworCisJLypDaGFuZ2UgdGhlIFBDSSBCQVIgcmVnaXN0ZXJzIHRvIG1hcCBpdCBvbnRvIHRoZSBidXMuKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaWRldiwgQklPU0ltYWdlQkFSLCAwKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX1JPTV9BRERSRVNTLCBCSU9TSW1hZ2VQaHlzIHwgMHgxKTsKKworCXVkZWxheSgxKTsKKworCS8qQ2hlY2sgdGhhdCB0aGUgQklPUyBpbWFnZSBpcyB2YWxpZC4gSWYgbm90IGZhaWwsIG9yIHJldHVybiB0aGUKKwkgY29tcGlsZWQgaW4gQklPUyBpbWFnZSBpZiB0aGF0IG9wdGlvbiB3YXMgZW5hYmxlZAorCSAqLworCWlmIChCSU9TSW1hZ2VbMF0gIT0gMHg1NSB8fCBCSU9TSW1hZ2VbMV0gIT0gMHhBQSB8fCBCSU9TSW1hZ2VbMl0gPT0gMCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gQklPU0ltYWdlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BjaWRldgktIFBDSSBkZXZpY2UgaW5mbyBmb3IgdGhlIHZpZGVvIGNhcmQgb24gdGhlIGJ1cworCitSRU1BUktTOgorVW5tYXBzIHRoZSBCSU9TIGltYWdlIGZvciB0aGUgZGV2aWNlIGFuZCByZXN0b3JlcyBmcmFtZWJ1ZmZlciBtYXBwaW5ncworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUENJX3VubWFwQklPU0ltYWdlKHBjaV9kZXZfdCBwY2lkZXYsIHZvaWQgKkJJT1NJbWFnZSkKK3sKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX1JPTV9BRERSRVNTLCBzYXZlUk9NQmFzZUFkZHJlc3MpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsIHNhdmVCYXNlQWRkcmVzczEwKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18xLCBzYXZlQmFzZUFkZHJlc3MxNCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMiwgc2F2ZUJhc2VBZGRyZXNzMTgpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzQsIHNhdmVCYXNlQWRkcmVzczIwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitwY2lkZXYJLSBQQ0kgZGV2aWNlIGluZm8gZm9yIHRoZSB2aWRlbyBjYXJkIG9uIHRoZSBidXMgdG8gYm9vdAorVkdBSW5mbyAtIEJJT1MgZW11bGF0b3IgVkdBIGluZm8gc3RydWN0dXJlCisKK1JFVFVSTlM6CitUcnVlIGlmIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXNlZCwgZmFsc2UgaWYgbm90LgorCitSRU1BUktTOgorTG9hZHMgYW5kIFBPU1QncyB0aGUgZGlzcGxheSBjb250cm9sbGVycyBCSU9TLCBkaXJlY3RseSBmcm9tIHRoZSBCSU9TCitpbWFnZSB3ZSBjYW4gZXh0cmFjdCBvdmVyIHRoZSBQQ0kgYnVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgUENJX3Bvc3RDb250cm9sbGVyKHBjaV9kZXZfdCBwY2lkZXYsIEJFX1ZHQUluZm8gKiBWR0FJbmZvKQoreworCXUzMiBCSU9TSW1hZ2VMZW47CisJdWNoYXIgKm1hcHBlZEJJT1M7CisJdWNoYXIgKmNvcHlPZkJJT1M7CisKKwkvKkFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSBjb3B5IG9mIEJJT1MgZnJvbSBkaXNwbGF5IGNvbnRyb2xsZXIqLworCWlmICgobWFwcGVkQklPUyA9IFBDSV9tYXBCSU9TSW1hZ2UocGNpZGV2KSkgPT0gTlVMTCkgeworCQlwcmludGYoInZpZGVvYm9vdDogVmlkZW8gUk9NIGZhaWxlZCB0byBtYXAhXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUJJT1NJbWFnZUxlbiA9IG1hcHBlZEJJT1NbMl0gKiA1MTI7CisKKwlpZiAoKGNvcHlPZkJJT1MgPSBtYWxsb2MoQklPU0ltYWdlTGVuKSkgPT0gTlVMTCkgeworCQlwcmludGYoInZpZGVvYm9vdDogT3V0IG9mIG1lbW9yeSFcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCW1lbWNweShjb3B5T2ZCSU9TLCBtYXBwZWRCSU9TLCBCSU9TSW1hZ2VMZW4pOworCisJUENJX3VubWFwQklPU0ltYWdlKHBjaWRldiwgbWFwcGVkQklPUyk7CisKKwkvKlNhdmUgaW5mb3JtYXRpb24gaW4gVkdBSW5mbyBzdHJ1Y3R1cmUqLworCVZHQUluZm8tPmZ1bmN0aW9uID0gUENJX0ZVTkMocGNpZGV2KTsKKwlWR0FJbmZvLT5kZXZpY2UgPSBQQ0lfREVWKHBjaWRldik7CisJVkdBSW5mby0+YnVzID0gUENJX0JVUyhwY2lkZXYpOworCVZHQUluZm8tPnBjaWRldiA9IHBjaWRldjsKKwlWR0FJbmZvLT5CSU9TSW1hZ2UgPSBjb3B5T2ZCSU9TOworCVZHQUluZm8tPkJJT1NJbWFnZUxlbiA9IEJJT1NJbWFnZUxlbjsKKworCS8qTm93IGV4ZWN1dGUgdGhlIEJJT1MgUE9TVCBmb3IgdGhlIGRldmljZSovCisJaWYgKGNvcHlPZkJJT1NbMF0gIT0gMHg1NSB8fCBjb3B5T2ZCSU9TWzFdICE9IDB4QUEpIHsKKwkJcHJpbnRmKCJ2aWRlb2Jvb3Q6IFZpZGVvIFJPTSBpbWFnZSBpcyBpbnZhbGlkIVxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlQQ0lfZG9CSU9TUE9TVChwY2lkZXYsIFZHQUluZm8pOworCisJLypSZXNldCB0aGUgc2l6ZSBvZiB0aGUgQklPUyBpbWFnZSB0byB0aGUgZmluYWwgc2l6ZSovCisJVkdBSW5mby0+QklPU0ltYWdlTGVuID0gY29weU9mQklPU1syXSAqIDUxMjsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitwY2lkZXYJICAgIC0gUENJIGRldmljZSBpbmZvIGZvciB0aGUgdmlkZW8gY2FyZCBvbiB0aGUgYnVzIHRvIGJvb3QKK3BWR0FJbmZvICAgIC0gUGxhY2UgdG8gcmV0dXJuIFZHQSBpbmZvIHN0cnVjdHVyZSBpcyByZXF1ZXN0ZWQKK2NsZWFuVXAJICAgIC0gVHJ1ZSB0byBjbGVhbiB1cCBvbiBleGl0LCBmYWxzZSB0byBsZWF2ZSBlbXVsYXRvciBhY3RpdmUKKworUkVNQVJLUzoKK0Jvb3RzIHRoZSBQQ0kvQUdQIHZpZGVvIGNhcmQgb24gdGhlIGJ1cyB1c2luZyB0aGUgVmlkZW8gUk9NIEJJT1MgaW1hZ2UKK2FuZCB0aGUgWDg2IEJJT1MgZW11bGF0b3IgbW9kdWxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBCb290VmlkZW9DYXJkQklPUyhwY2lfZGV2X3QgcGNpZGV2LCBCRV9WR0FJbmZvICoqIHBWR0FJbmZvLCBpbnQgY2xlYW5VcCkKK3sKKwlCRV9WR0FJbmZvICpWR0FJbmZvOworCisJcHJpbnRmKCJ2aWRlb2Jvb3Q6IEJvb3RpbmcgUENJIHZpZGVvIGNhcmQgYnVzICVkLCBmdW5jdGlvbiAlZCwgZGV2aWNlICVkXG4iLAorCSAgICAgUENJX0JVUyhwY2lkZXYpLCBQQ0lfRlVOQyhwY2lkZXYpLCBQQ0lfREVWKHBjaWRldikpOworCisJLypJbml0aWFsaXNlIHRoZSB4ODYgQklPUyBlbXVsYXRvciovCisJaWYgKChWR0FJbmZvID0gbWFsbG9jKHNpemVvZigqVkdBSW5mbykpKSA9PSBOVUxMKSB7CisJCXByaW50ZigidmlkZW9ib290OiBPdXQgb2YgbWVtb3J5IVxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJbWVtc2V0KFZHQUluZm8sIDAsIHNpemVvZigqVkdBSW5mbykpOworCUJFX2luaXQoMCwgNjU1MzYsIFZHQUluZm8sIDApOworCisJLypQb3N0IGFsbCB0aGUgZGlzcGxheSBjb250cm9sbGVyIEJJT1MnZXMqLworCVBDSV9wb3N0Q29udHJvbGxlcihwY2lkZXYsIFZHQUluZm8pOworCisJLypDbGVhbnVwIGFuZCBleGl0IHRoZSBlbXVsYXRvciBpZiByZXF1ZXN0ZWQuIElmIHRoZSBCSU9TIGVtdWxhdG9yCisJaXMgbmVlZGVkIGFmdGVyIGJvb3RpbmcgdGhlIGNhcmQsIHdlIHdpbGwgbm90IGNhbGwgQkVfZXhpdCBhbmQKKwlsZWF2ZSBpdCBlbmFibGVkIGZvciBmdXJ0aGVyIHVzZSAoaWU6IFZFU0EgZHJpdmVyIGV0YykuCisJKi8KKwlpZiAoY2xlYW5VcCkgeworCQlCRV9leGl0KCk7CisJCWlmIChWR0FJbmZvLT5CSU9TSW1hZ2UpCisJCQlmcmVlKFZHQUluZm8tPkJJT1NJbWFnZSk7CisJCWZyZWUoVkdBSW5mbyk7CisJCVZHQUluZm8gPSBOVUxMOworCX0KKwkvKlJldHVybiBWR0EgaW5mbyBwb2ludGVyIGlmIHRoZSBjYWxsZXIgcmVxdWVzdGVkIGl0Ki8KKwlpZiAocFZHQUluZm8pCisJCSpwVkdBSW5mbyA9IFZHQUluZm87CisJcmV0dXJuIHRydWU7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2Jlc3lzLmMgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvYmVzeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzRiYzhkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2Jlc3lzLmMKQEAgLTAsMCArMSw3MjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgQklPUyBlbXVsYXRvciBhbmQgaW50ZXJmYWNlCisqICAgICAgICAgICAgICAgICAgICAgIHRvIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogICBKYXNvbiBKaW48SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisqCisqICAgQ29weXJpZ2h0IChDKSAxOTkxLTIwMDQgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiAgIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyogICBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBhcHBlYXJpbmcgaW4gdGhlIGZpbGUgTElDRU5TRS5HUEwgaW5jbHVkZWQKKyogICBpbiB0aGUgcGFja2FnaW5nIG9mIHRoaXMgZmlsZS4KKyoKKyogICBMaWNlbnNlZXMgaG9sZGluZyBhIHZhbGlkIENvbW1lcmNpYWwgTGljZW5zZSBmb3IgdGhpcyBwcm9kdWN0IGZyb20KKyogICBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuIG1heSB1c2UgdGhpcyBmaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKKyogICBDb21tZXJjaWFsIExpY2Vuc2UgQWdyZWVtZW50IHByb3ZpZGVkIHdpdGggdGhlIFNvZnR3YXJlLgorKgorKiAgIFRoaXMgZmlsZSBpcyBwcm92aWRlZCBBUyBJUyB3aXRoIE5PIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBJTkNMVURJTkcKKyogICBUSEUgV0FSUkFOVFkgT0YgREVTSUdOLCBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorKiAgIFBVUlBPU0UuCisqCisqICAgU2VlIGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL2xpY2Vuc2UvIGZvciBpbmZvcm1hdGlvbiBhYm91dAorKiAgIHRoZSBsaWNlbnNpbmcgb3B0aW9ucyBhdmFpbGFibGUgYW5kIGhvdyB0byBwdXJjaGFzZSBhIENvbW1lcmNpYWwKKyogICBMaWNlbnNlIEFncmVlbWVudC4KKyoKKyogICBDb250YWN0IGxpY2Vuc2VAc2NpdGVjaHNvZnQuY29tIGlmIGFueSBjb25kaXRpb25zIG9mIHRoaXMgbGljZW5zaW5nCisqICAgYXJlIG5vdCBjbGVhciB0byB5b3UsIG9yIHlvdSBoYXZlIHF1ZXN0aW9ucyBhYm91dCBsaWNlbnNpbmcgb3B0aW9ucy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBpbmNsdWRlcyBCSU9TIGVtdWxhdG9yIEkvTyBhbmQgbWVtb3J5IGFjY2VzcworKiAgICAgICAgICAgICAgIGZ1bmN0aW9ucy4KKyoKKyoJCUphc29uIHBvcnRlZCB0aGlzIGZpbGUgdG8gdS1ib290IHRvIHJ1biB0aGUgQVRJIHZpZGVvIGNhcmQKKyoJCUJJT1MgaW4gdS1ib290LiBSZW1vdmVkIHNvbWUgZW11bGF0ZSBmdW5jdGlvbnMgc3VjaCBhcyB0aGUKKyoJCXRpbWVyIHBvcnQgYWNjZXNzLiBNYWRlIGFsbCB0aGUgVkdBIHBvcnQgZXhjZXB0IHJlYWRpbmcgMHgzYzMKKyoJCWJlIGVtdWxhdGVkLiBTZWVtcyBsaWtlIHJlYWRpbmcgMHgzYzMgc2hvdWxkIHJldHVybiB0aGUgaGlnaAorKgkJMTYgYml0IG9mIHRoZSBpbyBwb3J0LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJpb3NlbXVpLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19CSU9TRU1VKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX2kzODZfXworc3RhdGljIGNoYXIgKkJFX2Jpb3NEYXRlID0gIjA4LzE0Lzk5IjsKK3N0YXRpYyB1OCBCRV9tb2RlbCA9IDB4RkM7CitzdGF0aWMgdTggQkVfc3VibW9kZWwgPSAweDAwOworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIGNvbnZlcnQKKworUkVUVVJOUzoKK0FjdHVhbCBtZW1vcnkgYWRkcmVzcyB0byByZWFkIG9yIHdyaXRlIHRoZSBkYXRhCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIGVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIGluIGEgMzItYml0IHJhbmdlIHRvCithIHJlYWwgbWVtb3J5IGFkZHJlc3MgdGhhdCB3ZSB3aXNoIHRvIGFjY2Vzcy4gSXQgaGFuZGxlcyBzcGxpdHRpbmcgdXAgdGhlCittZW1vcnkgYWRkcmVzcyBzcGFjZSBhcHByb3ByaWF0ZWx5IHRvIGFjY2VzcyB0aGUgZW11bGF0b3IgQklPUyBpbWFnZSwgdmlkZW8KK21lbW9yeSBhbmQgc3lzdGVtIEJJT1MgZXRjLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1OCAqQkVfbWVtYWRkcih1MzIgYWRkcikKK3sKKwlpZiAoYWRkciA+PSAweEMwMDAwICYmIGFkZHIgPD0gX0JFX2Vudi5iaW9zbWVtX2xpbWl0KSB7CisJCXJldHVybiAodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgLSAweEMwMDAwKTsKKwl9IGVsc2UgaWYgKGFkZHIgPiBfQkVfZW52LmJpb3NtZW1fbGltaXQgJiYgYWRkciA8IDB4RDAwMDApIHsKKwkJREIocHJpbnRmKCJCRV9tZW1hZGRyOiBhZGRyZXNzICUjbHggbWF5IGJlIGludmFsaWQhXG4iLCBhZGRyKTspCisJCXJldHVybiBNLm1lbV9iYXNlOworCX0gZWxzZSBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhCRkZGRikgeworCQlyZXR1cm4gKHU4KikoX0JFX2Vudi5idXNtZW1fYmFzZSArIGFkZHIgLSAweEEwMDAwKTsKKwl9CisjaWZkZWYgX19pMzg2X18KKwllbHNlIGlmIChhZGRyID49IDB4RDAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7CisJCS8qIFdlIG1hcCB0aGUgcmVhbCBTeXN0ZW0gQklPUyBkaXJlY3RseSBvbiByZWFsIFBDJ3MgKi8KKwkJREIocHJpbnRmKCJCRV9tZW1hZGRyOiBTeXN0ZW0gQklPUyBhZGRyZXNzICUjbHhcbiIsIGFkZHIpOykKKwkJICAgIHJldHVybiBfQkVfZW52LmJ1c21lbV9iYXNlICsgYWRkciAtIDB4QTAwMDA7CisJfQorI2Vsc2UKKwllbHNlIGlmIChhZGRyID49IDB4RkZGRjUgJiYgYWRkciA8IDB4RkZGRkUpIHsKKwkJLyogUmV0dXJuIGEgZmFrZWQgQklPUyBkYXRlIHN0cmluZyBmb3Igbm9uLXg4NiBtYWNoaW5lcyAqLworCQlEQihwcmludGYoIkJFX21lbWFkZHIgLSBSZXR1cm5pbmcgQklPUyBkYXRlXG4iKTspCisJCXJldHVybiBCRV9iaW9zRGF0ZSArIGFkZHIgLSAweEZGRkY1OworCX0gZWxzZSBpZiAoYWRkciA9PSAweEZGRkZFKSB7CisJCS8qIFJldHVybiBzeXN0ZW0gbW9kZWwgaWRlbnRpZmllciBmb3Igbm9uLXg4NiBtYWNoaW5lcyAqLworCQlEQihwcmludGYoIkJFX21lbWFkZHIgLSBSZXR1cm5pbmcgbW9kZWxcbiIpOykKKwkJcmV0dXJuICZCRV9tb2RlbDsKKwl9IGVsc2UgaWYgKGFkZHIgPT0gMHhGRkZGRikgeworCQkvKiBSZXR1cm4gc3lzdGVtIHN1Ym1vZGVsIGlkZW50aWZpZXIgZm9yIG5vbi14ODYgbWFjaGluZXMgKi8KKwkJREIocHJpbnRmKCJCRV9tZW1hZGRyIC0gUmV0dXJuaW5nIHN1Ym1vZGVsXG4iKTspCisJCXJldHVybiAmQkVfc3VibW9kZWw7CisJfQorI2VuZGlmCisJZWxzZSBpZiAoYWRkciA+IE0ubWVtX3NpemUgLSAxKSB7CisJCUhBTFRfU1lTKCk7CisJCXJldHVybiBNLm1lbV9iYXNlOworCX0KKworCXJldHVybiBNLm1lbV9iYXNlICsgYWRkcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAorCitSRVRVUk5TOgorQnl0ZSB2YWx1ZSByZWFkIGZyb20gZW11bGF0b3IgbWVtb3J5LgorCitSRU1BUktTOgorUmVhZHMgYSBieXRlIHZhbHVlIGZyb20gdGhlIGVtdWxhdG9yIG1lbW9yeS4gV2UgaGF2ZSB0aHJlZSBkaXN0aW5jdCBtZW1vcnkKK3JlZ2lvbnMgdGhhdCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgd2hpY2ggdGhpcyBmdW5jdGlvbiBoYW5kbGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IFg4NkFQSSBCRV9yZGIodTMyIGFkZHIpCit7CisJaWYgKF9CRV9lbnYuZW11bGF0ZVZHQSAmJiBhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEJGRkZGKQorCQlyZXR1cm4gMDsKKwllbHNlIHsKKwkJdTggdmFsID0gcmVhZGJfbGUoQkVfbWVtYWRkcihhZGRyKSk7CisJCXJldHVybiB2YWw7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCisKK1JFVFVSTlM6CitXb3JkIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCisKK1JFTUFSS1M6CitSZWFkcyBhIHdvcmQgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQorcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IFg4NkFQSSBCRV9yZHcodTMyIGFkZHIpCit7CisJaWYgKF9CRV9lbnYuZW11bGF0ZVZHQSAmJiBhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEJGRkZGKQorCQlyZXR1cm4gMDsKKwllbHNlIHsKKwkJdTggKmJhc2UgPSBCRV9tZW1hZGRyKGFkZHIpOworCQl1MTYgdmFsID0gcmVhZHdfbGUoYmFzZSk7CisJCXJldHVybiB2YWw7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCisKK1JFVFVSTlM6CitMb25nIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCisKK1JFTUFSS1M6CitSZWFkcyBhIDMyLWJpdCB2YWx1ZSBmcm9tIHRoZSBlbXVsYXRvciBtZW1vcnkuIFdlIGhhdmUgdGhyZWUgZGlzdGluY3QgbWVtb3J5CityZWdpb25zIHRoYXQgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIHdoaWNoIHRoaXMgZnVuY3Rpb24gaGFuZGxlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgWDg2QVBJIEJFX3JkbCh1MzIgYWRkcikKK3sKKwlpZiAoX0JFX2Vudi5lbXVsYXRlVkdBICYmIGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4QkZGRkYpCisJCXJldHVybiAwOworCWVsc2UgeworCQl1OCAqYmFzZSA9IEJFX21lbWFkZHIoYWRkcik7CisJCXUzMiB2YWwgPSByZWFkbF9sZShiYXNlKTsKKwkJcmV0dXJuIHZhbDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKK3ZhbCAgICAgLSBWYWx1ZSB0byBzdG9yZQorCitSRU1BUktTOgorV3JpdGVzIGEgYnl0ZSB2YWx1ZSB0byBlbXVsYXRvciBtZW1vcnkuIFdlIGhhdmUgdGhyZWUgZGlzdGluY3QgbWVtb3J5CityZWdpb25zIHRoYXQgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIHdoaWNoIHRoaXMgZnVuY3Rpb24gaGFuZGxlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSBCRV93cmIodTMyIGFkZHIsIHU4IHZhbCkKK3sKKwlpZiAoIShfQkVfZW52LmVtdWxhdGVWR0EgJiYgYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhCRkZGRikpIHsKKwkJd3JpdGViX2xlKEJFX21lbWFkZHIoYWRkciksIHZhbCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCit2YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKKworUkVNQVJLUzoKK1dyaXRlcyBhIHdvcmQgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQorcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZBUEkgQkVfd3J3KHUzMiBhZGRyLCB1MTYgdmFsKQoreworCWlmICghKF9CRV9lbnYuZW11bGF0ZVZHQSAmJiBhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEJGRkZGKSkgeworCQl1OCAqYmFzZSA9IEJFX21lbWFkZHIoYWRkcik7CisJCXdyaXRld19sZShiYXNlLCB2YWwpOworCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCit2YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKKworUkVNQVJLUzoKK1dyaXRlcyBhIDMyLWJpdCB2YWx1ZSB0byBlbXVsYXRvciBtZW1vcnkuIFdlIGhhdmUgdGhyZWUgZGlzdGluY3QgbWVtb3J5CityZWdpb25zIHRoYXQgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIHdoaWNoIHRoaXMgZnVuY3Rpb24gaGFuZGxlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSBCRV93cmwodTMyIGFkZHIsIHUzMiB2YWwpCit7CisJaWYgKCEoX0JFX2Vudi5lbXVsYXRlVkdBICYmIGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4QkZGRkYpKSB7CisJCXU4ICpiYXNlID0gQkVfbWVtYWRkcihhZGRyKTsKKwkJd3JpdGVsX2xlKGJhc2UsIHZhbCk7CisJfQorfQorCisjaWYgZGVmaW5lZChERUJVRykgfHwgIWRlZmluZWQoX19pMzg2X18pCisKKy8qIEZvciBOb24tSW50ZWwgbWFjaGluZXMgd2UgbWF5IG5lZWQgdG8gZW11bGF0ZSBzb21lIEkvTyBwb3J0IGFjY2Vzc2VzIHRoYXQKKyAqIHRoZSBCSU9TIG1heSB0cnkgdG8gYWNjZXNzLCBzdWNoIGFzIHRoZSBQQ0kgY29uZmlnIHJlZ2lzdGVycy4KKyAqLworCisjZGVmaW5lIElTX1RJTUVSX1BPUlQocG9ydCkgKDB4NDAgPD0gcG9ydCAmJiBwb3J0IDw9IDB4NDMpCisjZGVmaW5lIElTX0NNT1NfUE9SVChwb3J0KSAgKDB4NzAgPD0gcG9ydCAmJiBwb3J0IDw9IDB4NzEpCisvKiNkZWZpbmUgSVNfVkdBX1BPUlQocG9ydCkgICAoX0JFX2Vudi5lbXVsYXRlVkdBICYmIDB4M0MwIDw9IHBvcnQgJiYgcG9ydCA8PSAweDNEQSkqLworI2RlZmluZSBJU19WR0FfUE9SVChwb3J0KSAgICgweDNDMCA8PSBwb3J0ICYmIHBvcnQgPD0gMHgzREEpCisjZGVmaW5lIElTX1BDSV9QT1JUKHBvcnQpICAgKDB4Q0Y4IDw9IHBvcnQgJiYgcG9ydCA8PSAweENGRikKKyNkZWZpbmUgSVNfU1BLUl9QT1JUKHBvcnQpICAocG9ydCA9PSAweDYxKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BvcnQgICAgLSBQb3J0IHRvIHJlYWQgZnJvbQordHlwZSAgICAtIFR5cGUgb2YgYWNjZXNzIHRvIHBlcmZvcm0KKworUkVNQVJLUzoKK1BlcmZvcm1zIGFuIGVtdWxhdGVkIHJlYWQgZnJvbSB0aGUgU3RhbmRhcmQgVkdBIEkvTyBwb3J0cy4gSWYgdGhlIHRhcmdldAoraGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBtYXBwaW5nIHRoZSBWR0EgSS9PIGFuZCBtZW1vcnkgKHN1Y2ggYXMgc29tZQorUG93ZXJQQyBzeXN0ZW1zKSwgd2UgZW11bGF0ZSB0aGUgVkdBIHNvIHRoYXQgdGhlIEJJT1Mgd2lsbCBzdGlsbCBiZSBhYmxlIHRvCitzZXQgTm9uVkdBIGRpc3BsYXkgbW9kZXMgc3VjaCBhcyBvbiBBVEkgaGFyZHdhcmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHU4IFZHQV9pbnBiIChjb25zdCBpbnQgcG9ydCkKK3sKKwl1OCB2YWwgPSAweGZmOworCisJc3dpdGNoIChwb3J0KSB7CisJY2FzZSAweDNDMDoKKwkJLyogM0MwIGhhcyBmdW5reSBjaGFyYWN0ZXJpc3RpY3MgYmVjYXVzZSBpdCBjYW4gYWN0IGFzIGVpdGhlcgorCQkgICBhIGRhdGEgcmVnaXN0ZXIgb3IgaW5kZXggcmVnaXN0ZXIgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZQorCQkgICBvZiBhbiBpbnRlcm5hbCBmbGlwIGZsb3AgaW4gdGhlIGhhcmR3YXJlLiBIZW5jZSB3ZSBoYXZlCisJCSAgIHRvIGVtdWxhdGUgdGhhdCBmdW5jdGlvbmFsaXR5IGluIGhlcmUuICovCisJCWlmIChfQkVfZW52LmZsaXBGbG9wM0MwID09IDApIHsKKwkJCS8qIEFjY2VzcyAzQzAgYXMgaW5kZXggcmVnaXN0ZXIgKi8KKwkJCXZhbCA9IF9CRV9lbnYuZW11M0MwOworCQl9IGVsc2UgeworCQkJLyogQWNjZXNzIDNDMCBhcyBkYXRhIHJlZ2lzdGVyICovCisJCQlpZiAoX0JFX2Vudi5lbXUzQzAgPCBBVFRfQykKKwkJCQl2YWwgPSBfQkVfZW52LmVtdTNDMVtfQkVfZW52LmVtdTNDMF07CisJCX0KKwkJX0JFX2Vudi5mbGlwRmxvcDNDMCBePSAxOworCQlicmVhazsKKwljYXNlIDB4M0MxOgorCQlpZiAoX0JFX2Vudi5lbXUzQzAgPCBBVFRfQykKKwkJCXJldHVybiBfQkVfZW52LmVtdTNDMVtfQkVfZW52LmVtdTNDMF07CisJCWJyZWFrOworCWNhc2UgMHgzQ0M6CisJCXJldHVybiBfQkVfZW52LmVtdTNDMjsKKwljYXNlIDB4M0M0OgorCQlyZXR1cm4gX0JFX2Vudi5lbXUzQzQ7CisJY2FzZSAweDNDNToKKwkJaWYgKF9CRV9lbnYuZW11M0M0IDwgQVRUX0MpCisJCQlyZXR1cm4gX0JFX2Vudi5lbXUzQzVbX0JFX2Vudi5lbXUzQzRdOworCQlicmVhazsKKwljYXNlIDB4M0M2OgorCQlyZXR1cm4gX0JFX2Vudi5lbXUzQzY7CisJY2FzZSAweDNDNzoKKwkJcmV0dXJuIF9CRV9lbnYuZW11M0M3OworCWNhc2UgMHgzQzg6CisJCXJldHVybiBfQkVfZW52LmVtdTNDODsKKwljYXNlIDB4M0M5OgorCQlpZiAoX0JFX2Vudi5lbXUzQzcgPCBQQUxfQykKKwkJCXJldHVybiBfQkVfZW52LmVtdTNDOVtfQkVfZW52LmVtdTNDNysrXTsKKwkJYnJlYWs7CisJY2FzZSAweDNDRToKKwkJcmV0dXJuIF9CRV9lbnYuZW11M0NFOworCWNhc2UgMHgzQ0Y6CisJCWlmIChfQkVfZW52LmVtdTNDRSA8IEdSQV9DKQorCQkJcmV0dXJuIF9CRV9lbnYuZW11M0NGW19CRV9lbnYuZW11M0NFXTsKKwkJYnJlYWs7CisJY2FzZSAweDNENDoKKwkJaWYgKF9CRV9lbnYuZW11M0MyICYgMHgxKQorCQkJcmV0dXJuIF9CRV9lbnYuZW11M0Q0OworCQlicmVhazsKKwljYXNlIDB4M0Q1OgorCQlpZiAoKF9CRV9lbnYuZW11M0MyICYgMHgxKSAmJiAoX0JFX2Vudi5lbXUzRDQgPCBDUlRfQykpCisJCQlyZXR1cm4gX0JFX2Vudi5lbXUzRDVbX0JFX2Vudi5lbXUzRDRdOworCQlicmVhazsKKwljYXNlIDB4M0RBOgorCQlfQkVfZW52LmZsaXBGbG9wM0MwID0gMDsKKwkJdmFsID0gX0JFX2Vudi5lbXUzREE7CisJCV9CRV9lbnYuZW11M0RBIF49IDB4OTsKKwkJYnJlYWs7CisJfQorCXJldHVybiB2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcG9ydCAgICAtIFBvcnQgdG8gd3JpdGUgdG8KK3R5cGUgICAgLSBUeXBlIG9mIGFjY2VzcyB0byBwZXJmb3JtCisKK1JFTUFSS1M6CitQZXJmb3JtcyBhbiBlbXVsYXRlZCB3cml0ZSB0byBvbmUgb2YgdGhlIDgyNTMgdGltZXIgcmVnaXN0ZXJzLiBGb3Igbm93Cit3ZSBvbmx5IGVtdWxhdGUgdGltZXIgMCB3aGljaCBpcyB0aGUgb25seSB0aW1lciB0aGF0IHRoZSBCSU9TIGNvZGUgYXBwZWFycwordG8gdXNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFZHQV9vdXRwYiAoaW50IHBvcnQsIHU4IHZhbCkKK3sKKwlzd2l0Y2ggKHBvcnQpIHsKKwljYXNlIDB4M0MwOgorCQkvKiAzQzAgaGFzIGZ1bmt5IGNoYXJhY3RlcmlzdGljcyBiZWNhdXNlIGl0IGNhbiBhY3QgYXMgZWl0aGVyCisJCSAgIGEgZGF0YSByZWdpc3RlciBvciBpbmRleCByZWdpc3RlciBkZXBlbmRpbmcgb24gdGhlIHN0YXRlCisJCSAgIG9mIGFuIGludGVybmFsIGZsaXAgZmxvcCBpbiB0aGUgaGFyZHdhcmUuIEhlbmNlIHdlIGhhdmUKKwkJICAgdG8gZW11bGF0ZSB0aGF0IGZ1bmN0aW9uYWxpdHkgaW4gaGVyZS4gKi8KKwkJaWYgKF9CRV9lbnYuZmxpcEZsb3AzQzAgPT0gMCkgeworCQkJLyogQWNjZXNzIDNDMCBhcyBpbmRleCByZWdpc3RlciAqLworCQkJX0JFX2Vudi5lbXUzQzAgPSB2YWw7CisJCX0gZWxzZSB7CisJCQkvKiBBY2Nlc3MgM0MwIGFzIGRhdGEgcmVnaXN0ZXIgKi8KKwkJCWlmIChfQkVfZW52LmVtdTNDMCA8IEFUVF9DKQorCQkJCV9CRV9lbnYuZW11M0MxW19CRV9lbnYuZW11M0MwXSA9IHZhbDsKKwkJfQorCQlfQkVfZW52LmZsaXBGbG9wM0MwIF49IDE7CisJCWJyZWFrOworCWNhc2UgMHgzQzI6CisJCV9CRV9lbnYuZW11M0MyID0gdmFsOworCQlicmVhazsKKwljYXNlIDB4M0M0OgorCQlfQkVfZW52LmVtdTNDNCA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSAweDNDNToKKwkJaWYgKF9CRV9lbnYuZW11M0M0IDwgQVRUX0MpCisJCQlfQkVfZW52LmVtdTNDNVtfQkVfZW52LmVtdTNDNF0gPSB2YWw7CisJCWJyZWFrOworCWNhc2UgMHgzQzY6CisJCV9CRV9lbnYuZW11M0M2ID0gdmFsOworCQlicmVhazsKKwljYXNlIDB4M0M3OgorCQlfQkVfZW52LmVtdTNDNyA9IChpbnQpIHZhbCAqMzsKKworCQlicmVhazsKKwljYXNlIDB4M0M4OgorCQlfQkVfZW52LmVtdTNDOCA9IChpbnQpIHZhbCAqMzsKKworCQlicmVhazsKKwljYXNlIDB4M0M5OgorCQlpZiAoX0JFX2Vudi5lbXUzQzggPCBQQUxfQykKKwkJCV9CRV9lbnYuZW11M0M5W19CRV9lbnYuZW11M0M4KytdID0gdmFsOworCQlicmVhazsKKwljYXNlIDB4M0NFOgorCQlfQkVfZW52LmVtdTNDRSA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSAweDNDRjoKKwkJaWYgKF9CRV9lbnYuZW11M0NFIDwgR1JBX0MpCisJCQlfQkVfZW52LmVtdTNDRltfQkVfZW52LmVtdTNDRV0gPSB2YWw7CisJCWJyZWFrOworCWNhc2UgMHgzRDQ6CisJCWlmIChfQkVfZW52LmVtdTNDMiAmIDB4MSkKKwkJCV9CRV9lbnYuZW11M0Q0ID0gdmFsOworCQlicmVhazsKKwljYXNlIDB4M0Q1OgorCQlpZiAoKF9CRV9lbnYuZW11M0MyICYgMHgxKSAmJiAoX0JFX2Vudi5lbXUzRDQgPCBDUlRfQykpCisJCQlfQkVfZW52LmVtdTNENVtfQkVfZW52LmVtdTNENF0gPSB2YWw7CisJCWJyZWFrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CityZWdPZmZzZXQgICAtIE9mZnNldCBpbnRvIHJlZ2lzdGVyIHNwYWNlIGZvciBub24tRFdPUkQgYWNjZXNzZXMKK3ZhbHVlICAgICAgIC0gVmFsdWUgdG8gd3JpdGUgdG8gcmVnaXN0ZXIgZm9yIFBDSV9XUklURV8qIG9wZXJhdGlvbnMKK2Z1bmMgICAgICAgIC0gRnVuY3Rpb24gdG8gcGVyZm9ybSAoUENJQWNjZXNzUmVnRmxhZ3MpCisKK1JFVFVSTlM6CitWYWx1ZSByZWFkIGZyb20gY29uZmlndXJhdGlvbiByZWdpc3RlciBmb3IgUENJX1JFQURfKiBvcGVyYXRpb25zCisKK1JFTUFSS1M6CitBY2Nlc3NlcyBhIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHJlZ2lzdGVyIGJ5IGRlY29kaW5nIHRoZSB2YWx1ZSBjdXJyZW50bHkKK3N0b3JlZCBpbiB0aGUgX0JFX2Vudi5jb25maWdBZGRyZXNzIHZhcmlhYmxlIGFuZCBwYXNzaW5nIGl0IHRocm91Z2ggdG8gdGhlCitwb3J0YWJsZSBQQ0lfYWNjZXNzUmVnIGZ1bmN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1MzIgQkVfYWNjZXNzUmVnKGludCByZWdPZmZzZXQsIHUzMiB2YWx1ZSwgaW50IGZ1bmMpCit7CisjaWZkZWYgX19LRVJORUxfXworCWludCBmdW5jdGlvbiwgZGV2aWNlLCBidXM7CisJdTggdmFsODsKKwl1MTYgdmFsMTY7CisJdTMyIHZhbDMyOworCisKKwkvKiBEZWNvZGUgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgdmFsdWVzIGZvciB0aGUgcmVnaXN0ZXIgd2Ugd2lzaCB0bworCSAqIGFjY2VzcworCSAqLworCXJlZ09mZnNldCArPSAoX0JFX2Vudi5jb25maWdBZGRyZXNzICYgMHhGRik7CisJZnVuY3Rpb24gPSAoX0JFX2Vudi5jb25maWdBZGRyZXNzID4+IDgpICYgMHg3OworCWRldmljZSA9IChfQkVfZW52LmNvbmZpZ0FkZHJlc3MgPj4gMTEpICYgMHgxRjsKKwlidXMgPSAoX0JFX2Vudi5jb25maWdBZGRyZXNzID4+IDE2KSAmIDB4RkY7CisKKwkvKiBJZ25vcmUgYWNjZXNzZXMgdG8gYWxsIGRldmljZXMgb3RoZXIgdGhhbiB0aGUgb25lIHdlJ3JlIFBPU1RpbmcgKi8KKwlpZiAoKGZ1bmN0aW9uID09IF9CRV9lbnYudmdhSW5mby5mdW5jdGlvbikgJiYKKwkgICAgKGRldmljZSA9PSBfQkVfZW52LnZnYUluZm8uZGV2aWNlKSAmJgorCSAgICAoYnVzID09IF9CRV9lbnYudmdhSW5mby5idXMpKSB7CisJCXN3aXRjaCAoZnVuYykgeworCQljYXNlIFJFR19SRUFEX0JZVEU6CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShfQkVfZW52LnZnYUluZm8ucGNpZGV2LCByZWdPZmZzZXQsCisJCQkJCSAgICAgJnZhbDgpOworCQkJcmV0dXJuIHZhbDg7CisJCWNhc2UgUkVHX1JFQURfV09SRDoKKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKF9CRV9lbnYudmdhSW5mby5wY2lkZXYsIHJlZ09mZnNldCwKKwkJCQkJICAgICAmdmFsMTYpOworCQkJcmV0dXJuIHZhbDE2OworCQljYXNlIFJFR19SRUFEX0RXT1JEOgorCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKF9CRV9lbnYudmdhSW5mby5wY2lkZXYsIHJlZ09mZnNldCwKKwkJCQkJICAgICAgJnZhbDMyKTsKKwkJCXJldHVybiB2YWwzMjsKKwkJY2FzZSBSRUdfV1JJVEVfQllURToKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShfQkVfZW52LnZnYUluZm8ucGNpZGV2LCByZWdPZmZzZXQsCisJCQkJCSAgICAgIHZhbHVlKTsKKworCQkJcmV0dXJuIDA7CisJCWNhc2UgUkVHX1dSSVRFX1dPUkQ6CisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwgcmVnT2Zmc2V0LAorCQkJCQkgICAgICB2YWx1ZSk7CisKKwkJCXJldHVybiAwOworCQljYXNlIFJFR19XUklURV9EV09SRDoKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwKKwkJCQkJICAgICAgIHJlZ09mZnNldCwgdmFsdWUpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKyNlbHNlCisJUENJRGV2aWNlSW5mbyBwY2lJbmZvOworCisJcGNpSW5mby5tZWNoMSA9IDE7CisJcGNpSW5mby5zbG90LmkgPSAwOworCXBjaUluZm8uc2xvdC5wLkZ1bmN0aW9uID0gKF9CRV9lbnYuY29uZmlnQWRkcmVzcyA+PiA4KSAmIDB4NzsKKwlwY2lJbmZvLnNsb3QucC5EZXZpY2UgPSAoX0JFX2Vudi5jb25maWdBZGRyZXNzID4+IDExKSAmIDB4MUY7CisJcGNpSW5mby5zbG90LnAuQnVzID0gKF9CRV9lbnYuY29uZmlnQWRkcmVzcyA+PiAxNikgJiAweEZGOworCXBjaUluZm8uc2xvdC5wLkVuYWJsZSA9IDE7CisKKwkvKiBJZ25vcmUgYWNjZXNzZXMgdG8gYWxsIGRldmljZXMgb3RoZXIgdGhhbiB0aGUgb25lIHdlJ3JlIFBPU1RpbmcgKi8KKwlpZiAoKHBjaUluZm8uc2xvdC5wLkZ1bmN0aW9uID09CisJICAgICBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+c2xvdC5wLkZ1bmN0aW9uKQorCSAgICAmJiAocGNpSW5mby5zbG90LnAuRGV2aWNlID09IF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5zbG90LnAuRGV2aWNlKQorCSAgICAmJiAocGNpSW5mby5zbG90LnAuQnVzID09IF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5zbG90LnAuQnVzKSkKKwkJcmV0dXJuIFBDSV9hY2Nlc3NSZWcoKF9CRV9lbnYuY29uZmlnQWRkcmVzcyAmIDB4RkYpICsgcmVnT2Zmc2V0LAorCQkJCSAgICAgdmFsdWUsIGZ1bmMsICZwY2lJbmZvKTsKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BvcnQgICAgLSBQb3J0IHRvIHJlYWQgZnJvbQordHlwZSAgICAtIFR5cGUgb2YgYWNjZXNzIHRvIHBlcmZvcm0KKworUkVNQVJLUzoKK1BlcmZvcm1zIGFuIGVtdWxhdGVkIHJlYWQgZnJvbSBvbmUgb2YgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHJlZ2lzdGVycy4KK1dlIGVtdWxhdGUgdGhpcyB1c2luZyBvdXIgUENJX2FjY2Vzc1JlZyBmdW5jdGlvbiB3aGljaCB3aWxsIGFjY2VzcyB0aGUgUENJCitjb25maWd1cmF0aW9uIHNwYWNlIHJlZ2lzdGVycyBpbiBhIHBvcnRhYmxlIGZhc2hpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHUzMiBQQ0lfaW5wKGludCBwb3J0LCBpbnQgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFJFR19SRUFEX0JZVEU6CisJCWlmICgoX0JFX2Vudi5jb25maWdBZGRyZXNzICYgMHg4MDAwMDAwMCkgJiYgMHhDRkMgPD0gcG9ydAorCQkgICAgJiYgcG9ydCA8PSAweENGRikKKwkJCXJldHVybiBCRV9hY2Nlc3NSZWcocG9ydCAtIDB4Q0ZDLCAwLCBSRUdfUkVBRF9CWVRFKTsKKwkJYnJlYWs7CisJY2FzZSBSRUdfUkVBRF9XT1JEOgorCQlpZiAoKF9CRV9lbnYuY29uZmlnQWRkcmVzcyAmIDB4ODAwMDAwMDApICYmIDB4Q0ZDIDw9IHBvcnQKKwkJICAgICYmIHBvcnQgPD0gMHhDRkYpCisJCQlyZXR1cm4gQkVfYWNjZXNzUmVnKHBvcnQgLSAweENGQywgMCwgUkVHX1JFQURfV09SRCk7CisJCWJyZWFrOworCWNhc2UgUkVHX1JFQURfRFdPUkQ6CisJCWlmIChwb3J0ID09IDB4Q0Y4KQorCQkJcmV0dXJuIF9CRV9lbnYuY29uZmlnQWRkcmVzczsKKwkJZWxzZSBpZiAoKF9CRV9lbnYuY29uZmlnQWRkcmVzcyAmIDB4ODAwMDAwMDApICYmIHBvcnQgPT0gMHhDRkMpCisJCQlyZXR1cm4gQkVfYWNjZXNzUmVnKDAsIDAsIFJFR19SRUFEX0RXT1JEKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BvcnQgICAgLSBQb3J0IHRvIHdyaXRlIHRvCit0eXBlICAgIC0gVHlwZSBvZiBhY2Nlc3MgdG8gcGVyZm9ybQorCitSRU1BUktTOgorUGVyZm9ybXMgYW4gZW11bGF0ZWQgd3JpdGUgdG8gb25lIG9mIHRoZSBQQ0kgY29udHJvbCByZWdpc3RlcnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgUENJX291dHAoaW50IHBvcnQsIHUzMiB2YWwsIGludCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgUkVHX1dSSVRFX0JZVEU6CisJCWlmICgoX0JFX2Vudi5jb25maWdBZGRyZXNzICYgMHg4MDAwMDAwMCkgJiYgMHhDRkMgPD0gcG9ydAorCQkgICAgJiYgcG9ydCA8PSAweENGRikKKwkJCUJFX2FjY2Vzc1JlZyhwb3J0IC0gMHhDRkMsIHZhbCwgUkVHX1dSSVRFX0JZVEUpOworCQlicmVhazsKKwljYXNlIFJFR19XUklURV9XT1JEOgorCQlpZiAoKF9CRV9lbnYuY29uZmlnQWRkcmVzcyAmIDB4ODAwMDAwMDApICYmIDB4Q0ZDIDw9IHBvcnQKKwkJICAgICYmIHBvcnQgPD0gMHhDRkYpCisJCQlCRV9hY2Nlc3NSZWcocG9ydCAtIDB4Q0ZDLCB2YWwsIFJFR19XUklURV9XT1JEKTsKKwkJYnJlYWs7CisJY2FzZSBSRUdfV1JJVEVfRFdPUkQ6CisJCWlmIChwb3J0ID09IDB4Q0Y4KQorCQl7CisJCQlfQkVfZW52LmNvbmZpZ0FkZHJlc3MgPSB2YWwgJiAweDgwRkZGRkZDOworCQl9CisJCWVsc2UgaWYgKChfQkVfZW52LmNvbmZpZ0FkZHJlc3MgJiAweDgwMDAwMDAwKSAmJiBwb3J0ID09IDB4Q0ZDKQorCQkJQkVfYWNjZXNzUmVnKDAsIHZhbCwgUkVHX1dSSVRFX0RXT1JEKTsKKwkJYnJlYWs7CisJfQorfQorCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Citwb3J0ICAgIC0gUG9ydCB0byB3cml0ZSB0bworCitSRVRVUk5TOgorVmFsdWUgcmVhZCBmcm9tIHRoZSBJL08gcG9ydAorCitSRU1BUktTOgorUGVyZm9ybXMgYW4gZW11bGF0ZWQgOC1iaXQgcmVhZCBmcm9tIGFuIEkvTyBwb3J0LiBXZSBoYW5kbGUgc3BlY2lhbCBjYXNlcwordGhhdCB3ZSBuZWVkIHRvIGVtdWxhdGUgaW4gaGVyZSwgYW5kIGZhbGwgdGhyb3VnaCB0byByZWZsZWN0aW5nIHRoZSB3cml0ZQordGhyb3VnaCB0byB0aGUgcmVhbCBoYXJkd2FyZSBpZiB3ZSBkb24ndCBuZWVkIHRvIHNwZWNpYWwgY2FzZSBpdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBYODZBUEkgQkVfaW5iKFg4NkVNVV9waW9BZGRyIHBvcnQpCit7CisJdTggdmFsID0gMDsKKworI2lmIGRlZmluZWQoREVCVUcpIHx8ICFkZWZpbmVkKF9faTM4Nl9fKQorCWlmIChJU19WR0FfUE9SVChwb3J0KSl7CisJCS8qc2VlbXMgcmVhZGluZyBwb3J0IDB4M2MzIHJldHVybiB0aGUgaGlnaCAxNiBiaXQgb2YgaW8gcG9ydCovCisJCWlmKHBvcnQgPT0gMHgzYzMpCisJCQl2YWwgPSBMT0dfaW5wYihwb3J0KTsKKwkJZWxzZQorCQkJdmFsID0gVkdBX2lucGIocG9ydCk7CisJfQorCWVsc2UgaWYgKElTX1RJTUVSX1BPUlQocG9ydCkpCisJCURCKHByaW50ZigiQ2FuIG5vdCBpbnRlcmVwdCBUSU1FUiBwb3J0IG5vdyFcbiIpOykKKwllbHNlIGlmIChJU19TUEtSX1BPUlQocG9ydCkpCisJCURCKHByaW50ZigiQ2FuIG5vdCBpbnRlcmVwdCBTUEVBS0VSIHBvcnQgbm93IVxuIik7KQorCWVsc2UgaWYgKElTX0NNT1NfUE9SVChwb3J0KSkKKwkJREIocHJpbnRmKCJDYW4gbm90IGludGVyZXB0IENNT1MgcG9ydCBub3chXG4iKTspCisJZWxzZSBpZiAoSVNfUENJX1BPUlQocG9ydCkpCisJCXZhbCA9IFBDSV9pbnAocG9ydCwgUkVHX1JFQURfQllURSk7CisJZWxzZSBpZiAocG9ydCA8IDB4MTAwKSB7CisJCURCKHByaW50ZigiV0FSTjogSU5WQUxJRCBpbmIuJTA0WCAtPiAlMDJYXG4iLCAodTE2KSBwb3J0LCB2YWwpOykKKwkJdmFsID0gTE9HX2lucGIocG9ydCk7CisJfSBlbHNlCisjZW5kaWYKKwkJdmFsID0gTE9HX2lucGIocG9ydCk7CisJcmV0dXJuIHZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Citwb3J0ICAgIC0gUG9ydCB0byB3cml0ZSB0bworCitSRVRVUk5TOgorVmFsdWUgcmVhZCBmcm9tIHRoZSBJL08gcG9ydAorCitSRU1BUktTOgorUGVyZm9ybXMgYW4gZW11bGF0ZWQgMTYtYml0IHJlYWQgZnJvbSBhbiBJL08gcG9ydC4gV2UgaGFuZGxlIHNwZWNpYWwgY2FzZXMKK3RoYXQgd2UgbmVlZCB0byBlbXVsYXRlIGluIGhlcmUsIGFuZCBmYWxsIHRocm91Z2ggdG8gcmVmbGVjdGluZyB0aGUgd3JpdGUKK3Rocm91Z2ggdG8gdGhlIHJlYWwgaGFyZHdhcmUgaWYgd2UgZG9uJ3QgbmVlZCB0byBzcGVjaWFsIGNhc2UgaXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IFg4NkFQSSBCRV9pbncoWDg2RU1VX3Bpb0FkZHIgcG9ydCkKK3sKKwl1MTYgdmFsID0gMDsKKworI2lmIGRlZmluZWQoREVCVUcpIHx8ICFkZWZpbmVkKF9faTM4Nl9fKQorCWlmIChJU19QQ0lfUE9SVChwb3J0KSkKKwkJdmFsID0gUENJX2lucChwb3J0LCBSRUdfUkVBRF9XT1JEKTsKKwllbHNlIGlmIChwb3J0IDwgMHgxMDApIHsKKwkJREIocHJpbnRmKCJXQVJOOiBNYXliZSBJTlZBTElEIGludy4lMDRYIC0+ICUwNFhcbiIsICh1MTYpIHBvcnQsIHZhbCk7KQorCQl2YWwgPSBMT0dfaW5wdyhwb3J0KTsKKwl9IGVsc2UKKyNlbmRpZgorCQl2YWwgPSBMT0dfaW5wdyhwb3J0KTsKKwlyZXR1cm4gdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BvcnQgICAgLSBQb3J0IHRvIHdyaXRlIHRvCisKK1JFVFVSTlM6CitWYWx1ZSByZWFkIGZyb20gdGhlIEkvTyBwb3J0CisKK1JFTUFSS1M6CitQZXJmb3JtcyBhbiBlbXVsYXRlZCAzMi1iaXQgcmVhZCBmcm9tIGFuIEkvTyBwb3J0LiBXZSBoYW5kbGUgc3BlY2lhbCBjYXNlcwordGhhdCB3ZSBuZWVkIHRvIGVtdWxhdGUgaW4gaGVyZSwgYW5kIGZhbGwgdGhyb3VnaCB0byByZWZsZWN0aW5nIHRoZSB3cml0ZQordGhyb3VnaCB0byB0aGUgcmVhbCBoYXJkd2FyZSBpZiB3ZSBkb24ndCBuZWVkIHRvIHNwZWNpYWwgY2FzZSBpdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgWDg2QVBJIEJFX2lubChYODZFTVVfcGlvQWRkciBwb3J0KQoreworCXUzMiB2YWwgPSAwOworCisjaWYgZGVmaW5lZChERUJVRykgfHwgIWRlZmluZWQoX19pMzg2X18pCisJaWYgKElTX1BDSV9QT1JUKHBvcnQpKQorCQl2YWwgPSBQQ0lfaW5wKHBvcnQsIFJFR19SRUFEX0RXT1JEKTsKKwllbHNlIGlmIChwb3J0IDwgMHgxMDApIHsKKwkJdmFsID0gTE9HX2lucGQocG9ydCk7CisJfSBlbHNlCisjZW5kaWYKKwkJdmFsID0gTE9HX2lucGQocG9ydCk7CisJcmV0dXJuIHZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Citwb3J0ICAgIC0gUG9ydCB0byB3cml0ZSB0bwordmFsICAgICAtIFZhbHVlIHRvIHdyaXRlIHRvIHBvcnQKKworUkVNQVJLUzoKK1BlcmZvcm1zIGFuIGVtdWxhdGVkIDgtYml0IHdyaXRlIHRvIGFuIEkvTyBwb3J0LiBXZSBoYW5kbGUgc3BlY2lhbCBjYXNlcwordGhhdCB3ZSBuZWVkIHRvIGVtdWxhdGUgaW4gaGVyZSwgYW5kIGZhbGwgdGhyb3VnaCB0byByZWZsZWN0aW5nIHRoZSB3cml0ZQordGhyb3VnaCB0byB0aGUgcmVhbCBoYXJkd2FyZSBpZiB3ZSBkb24ndCBuZWVkIHRvIHNwZWNpYWwgY2FzZSBpdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSBCRV9vdXRiKFg4NkVNVV9waW9BZGRyIHBvcnQsIHU4IHZhbCkKK3sKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCAhZGVmaW5lZChfX2kzODZfXykKKwlpZiAoSVNfVkdBX1BPUlQocG9ydCkpCisJCVZHQV9vdXRwYihwb3J0LCB2YWwpOworCWVsc2UgaWYgKElTX1RJTUVSX1BPUlQocG9ydCkpCisJCURCKHByaW50ZigiQ2FuIG5vdCBpbnRlcmVwdCBUSU1FUiBwb3J0IG5vdyFcbiIpOykKKwllbHNlIGlmIChJU19TUEtSX1BPUlQocG9ydCkpCisJCURCKHByaW50ZigiQ2FuIG5vdCBpbnRlcmVwdCBTUEVBS0VSIHBvcnQgbm93IVxuIik7KQorCWVsc2UgaWYgKElTX0NNT1NfUE9SVChwb3J0KSkKKwkJREIocHJpbnRmKCJDYW4gbm90IGludGVyZXB0IENNT1MgcG9ydCBub3chXG4iKTspCisJZWxzZSBpZiAoSVNfUENJX1BPUlQocG9ydCkpCisJCVBDSV9vdXRwKHBvcnQsIHZhbCwgUkVHX1dSSVRFX0JZVEUpOworCWVsc2UgaWYgKHBvcnQgPCAweDEwMCkgeworCQlEQihwcmludGYoIldBUk46TWF5YmUgSU5WQUxJRCBvdXRiLiUwNFggPC0gJTAyWFxuIiwgKHUxNikgcG9ydCwgdmFsKTspCisJCUxPR19vdXRwYihwb3J0LCB2YWwpOworCX0gZWxzZQorI2VuZGlmCisJCUxPR19vdXRwYihwb3J0LCB2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BvcnQgICAgLSBQb3J0IHRvIHdyaXRlIHRvCit2YWwgICAgIC0gVmFsdWUgdG8gd3JpdGUgdG8gcG9ydAorCitSRU1BUktTOgorUGVyZm9ybXMgYW4gZW11bGF0ZWQgMTYtYml0IHdyaXRlIHRvIGFuIEkvTyBwb3J0LiBXZSBoYW5kbGUgc3BlY2lhbCBjYXNlcwordGhhdCB3ZSBuZWVkIHRvIGVtdWxhdGUgaW4gaGVyZSwgYW5kIGZhbGwgdGhyb3VnaCB0byByZWZsZWN0aW5nIHRoZSB3cml0ZQordGhyb3VnaCB0byB0aGUgcmVhbCBoYXJkd2FyZSBpZiB3ZSBkb24ndCBuZWVkIHRvIHNwZWNpYWwgY2FzZSBpdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSBCRV9vdXR3KFg4NkVNVV9waW9BZGRyIHBvcnQsIHUxNiB2YWwpCit7CisjaWYgZGVmaW5lZChERUJVRykgfHwgIWRlZmluZWQoX19pMzg2X18pCisJCWlmIChJU19WR0FfUE9SVChwb3J0KSkgeworCQkJVkdBX291dHBiKHBvcnQsIHZhbCk7CisJCQlWR0Ffb3V0cGIocG9ydCArIDEsIHZhbCA+PiA4KTsKKwkJfSBlbHNlIGlmIChJU19QQ0lfUE9SVChwb3J0KSkKKwkJCVBDSV9vdXRwKHBvcnQsIHZhbCwgUkVHX1dSSVRFX1dPUkQpOworCQllbHNlIGlmIChwb3J0IDwgMHgxMDApIHsKKwkJCURCKHByaW50ZigiV0FSTjogTUF5YmUgSU5WQUxJRCBvdXR3LiUwNFggPC0gJTA0WFxuIiwgKHUxNikgcG9ydCwKKwkJCSAgICAgICB2YWwpOykKKwkJCUxPR19vdXRwdyhwb3J0LCB2YWwpOworCQl9IGVsc2UKKyNlbmRpZgorCQkJTE9HX291dHB3KHBvcnQsIHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcG9ydCAgICAtIFBvcnQgdG8gd3JpdGUgdG8KK3ZhbCAgICAgLSBWYWx1ZSB0byB3cml0ZSB0byBwb3J0CisKK1JFTUFSS1M6CitQZXJmb3JtcyBhbiBlbXVsYXRlZCAzMi1iaXQgd3JpdGUgdG8gYW4gSS9PIHBvcnQuIFdlIGhhbmRsZSBzcGVjaWFsIGNhc2VzCit0aGF0IHdlIG5lZWQgdG8gZW11bGF0ZSBpbiBoZXJlLCBhbmQgZmFsbCB0aHJvdWdoIHRvIHJlZmxlY3RpbmcgdGhlIHdyaXRlCit0aHJvdWdoIHRvIHRoZSByZWFsIGhhcmR3YXJlIGlmIHdlIGRvbid0IG5lZWQgdG8gc3BlY2lhbCBjYXNlIGl0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2QVBJIEJFX291dGwoWDg2RU1VX3Bpb0FkZHIgcG9ydCwgdTMyIHZhbCkKK3sKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCAhZGVmaW5lZChfX2kzODZfXykKKwlpZiAoSVNfUENJX1BPUlQocG9ydCkpCisJCVBDSV9vdXRwKHBvcnQsIHZhbCwgUkVHX1dSSVRFX0RXT1JEKTsKKwllbHNlIGlmIChwb3J0IDwgMHgxMDApIHsKKwkJREIocHJpbnRmKCJXQVJOOiBJTlZBTElEIG91dGwuJTA0WCA8LSAlMDhYXG4iLCAodTE2KSBwb3J0LHZhbCk7KQorCQlMT0dfb3V0cGQocG9ydCwgdmFsKTsKKwl9IGVsc2UKKyNlbmRpZgorCQlMT0dfb3V0cGQocG9ydCwgdmFsKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2Jpb3MuYyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9iaW9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhMWJmYjJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2Jpb3MuYwpAQCAtMCwwICsxLDMyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICBCSU9TIGVtdWxhdG9yIGFuZCBpbnRlcmZhY2UKKyogICAgICAgICAgICAgICAgICAgICAgdG8gUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogIENvcHlyaWdodCAoQykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiAgSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIE1vZHVsZSBpbXBsZW1lbnRpbmcgdGhlIEJJT1Mgc3BlY2lmaWMgZnVuY3Rpb25zLgorKgorKiAJCUphc29uIHBvcnRlZCB0aGlzIGZpbGUgdG8gdS1ib290IHRvIHJ1biB0aGUgQVRJIHZpZGVvIGNhcmQKKyogCQl2aWRlbyBCSU9TLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJpb3NlbXVpLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19CSU9TRU1VKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbnRubyAgIC0gSW50ZXJydXB0IG51bWJlciBiZWluZyBzZXJ2aWNlZAorCitSRU1BUktTOgorSGFuZGxlciBmb3IgdW5kZWZpbmVkIGludGVycnVwdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgWDg2QVBJIHVuZGVmaW5lZF9pbnRyKGludCBpbnRubykKK3sKKwlpZiAoQkVfcmR3KGludG5vICogNCArIDIpID09IEJJT1NfU0VHKSB7CisJCURCKHByaW50ZigiYmlvc0VtdTogdW5kZWZpbmVkIGludGVycnVwdCAleGggY2FsbGVkIVxuIiwgaW50bm8pOykKKwl9IGVsc2UKKwkJWDg2RU1VX3ByZXBhcmVGb3JJbnQoaW50bm8pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2ludG5vICAgLSBJbnRlcnJ1cHQgbnVtYmVyIGJlaW5nIHNlcnZpY2VkCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGRlZmF1bHQgc3lzdGVtIEJJT1MgSW50IDEwaCAodGhlIGRlZmF1bHQgaXMgc3RvcmVkCitpbiB0aGUgSW50IDQyaCB2ZWN0b3IgYnkgdGhlIHN5c3RlbSBCSU9TIGF0IGJvb3R1cCkuIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUKK2Egc21hbGwgbnVtYmVyIG9mIHNwZWNpYWwgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIEJJT1MgZHVyaW5nIFBPU1QgdGltZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBYODZBUEkgaW50NDIoaW50IGludG5vKQoreworCWlmIChNLng4Ni5SX0FIID09IDB4MTIgJiYgTS54ODYuUl9CTCA9PSAweDMyKSB7CisJCWlmIChNLng4Ni5SX0FMID09IDApIHsKKwkJCS8qIEVuYWJsZSBDUFUgYWNjZXNzZXMgdG8gdmlkZW8gbWVtb3J5ICovCisJCQlQTV9vdXRwYigweDNjMiwgUE1faW5wYigweDNjYykgfCAodTgpIDB4MDIpOworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKE0ueDg2LlJfQUwgPT0gMSkgeworCQkJLyogRGlzYWJsZSBDUFUgYWNjZXNzZXMgdG8gdmlkZW8gbWVtb3J5ICovCisJCQlQTV9vdXRwYigweDNjMiwgUE1faW5wYigweDNjYykgJiAodTgpIH4gMHgwMik7CisJCQlyZXR1cm47CisJCX0KKyNpZmRlZiAgREVCVUcKKwkJZWxzZSB7CisJCQlwcmludGYoImludDQyOiB1bmtub3duIGZ1bmN0aW9uIEFIPTB4MTIsIEJMPTB4MzIsIEFMPSUjMDJ4XG4iLAorCQkJICAgICBNLng4Ni5SX0FMKTsKKwkJfQorI2VuZGlmCisJfQorI2lmZGVmICBERUJVRworCWVsc2UgeworCQlwcmludGYoImludDQyOiB1bmtub3duIGZ1bmN0aW9uIEFIPSUjMDJ4LCBBTD0lIzAyeCwgQkw9JSMwMnhcbiIsCisJCSAgICAgTS54ODYuUl9BSCwgTS54ODYuUl9BTCwgTS54ODYuUl9CTCk7CisJfQorI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW50bm8gICAtIEludGVycnVwdCBudW1iZXIgYmVpbmcgc2VydmljZWQKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgZGVmYXVsdCBzeXN0ZW0gQklPUyBJbnQgMTBoLiBJZiB0aGUgUE9TVCBjb2RlCitoYXMgbm90IHlldCByZS12ZWN0b3JlZCB0aGUgSW50IDEwaCBCSU9TIGludGVycnVwdCB2ZWN0b3IsIHdlIGhhbmRsZSB0aGlzCitieSBzaW1wbHkgY2FsbGluZyB0aGUgaW50NDIgaW50ZXJydXB0IGhhbmRsZXIgYWJvdmUuIFZlcnkgZWFybHkgaW4gdGhlCitCSU9TIFBPU1QgcHJvY2VzcywgdGhlIHZlY3RvciBnZXRzIHJlcGxhY2VkIGFuZCB3ZSBzaW1wbHkgbGV0IHRoZSByZWFsCittb2RlIGludGVycnVwdCBoYW5kbGVyIHByb2Nlc3MgdGhlIGludGVycnVwdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBYODZBUEkgaW50MTAoaW50IGludG5vKQoreworCWlmIChCRV9yZHcoaW50bm8gKiA0ICsgMikgPT0gQklPU19TRUcpCisJCWludDQyKGludG5vKTsKKwllbHNlCisJCVg4NkVNVV9wcmVwYXJlRm9ySW50KGludG5vKTsKK30KKworLyogUmVzdWx0IGNvZGVzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUyAqLworCisjZGVmaW5lIFNVQ0NFU1NGVUwgICAgICAgICAgMHgwMAorI2RlZmluZSBGVU5DX05PVF9TVVBQT1JUICAgIDB4ODEKKyNkZWZpbmUgQkFEX1ZFTkRPUl9JRCAgICAgICAweDgzCisjZGVmaW5lIERFVklDRV9OT1RfRk9VTkQgICAgMHg4NgorI2RlZmluZSBCQURfUkVHSVNURVJfTlVNQkVSIDB4ODcKKyNkZWZpbmUgU0VUX0ZBSUxFRCAgICAgICAgICAweDg4CisjZGVmaW5lIEJVRkZFUl9UT09fU01BTEwgICAgMHg4OQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2ludG5vICAgLSBJbnRlcnJ1cHQgbnVtYmVyIGJlaW5nIHNlcnZpY2VkCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGRlZmF1bHQgSW50IDFBaCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHJlYWwKK21vZGUgY29kZSwgd2hpY2ggcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIFBDSSBCSU9TIGZ1bmN0aW9ucy4gU2luY2Ugd2Ugb25seQord2FudCB0byBhbGxvdyB0aGUgcmVhbCBtb2RlIEJJT1MgY29kZSAqb25seSogc2VlIHRoZSBQQ0kgY29uZmlnIHNwYWNlIGZvcgoraXRzIG93biBkZXZpY2UsIHdlIG9ubHkgcmV0dXJuIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWMgUENJIGNvbmZpZworc3BhY2UgdGhhdCB3ZSBoYXZlIHBhc3NlZCBpbiB0byB0aGUgaW5pdCBmdW5jdGlvbi4gVGhpcyBzb2x2ZXMgcHJvYmxlbXMKK3doZW4gdXNpbmcgdGhlIEJJT1MgdG8gd2FybSBib290IGEgc2Vjb25kYXJ5IGFkYXB0ZXIgd2hlbiB0aGVyZSBpcyBhbgoraWRlbnRpY2FsIGFkYXB0ZXIgYmVmb3JlIGl0IG9uIHRoZSBidXMgKHNvbWUgQklPUydlcyBnZXQgY29uZnVzZWQgaW4gdGhpcworY2FzZSkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgWDg2QVBJIGludDFBKGludCB1bnVzZWQpCit7CisJdTE2IHBjaVNsb3Q7CisKKyNpZmRlZiBfX0tFUk5FTF9fCisJdTggaW50ZXJmYWNlLCBzdWJjbGFzcywgYmFzZWNsYXNzOworCisJLyogSW5pdGlhbGlzZSB0aGUgUENJIHNsb3QgbnVtYmVyICovCisJcGNpU2xvdCA9ICgoaW50KV9CRV9lbnYudmdhSW5mby5idXMgPDwgOCkgfAorCSAgICAoKGludClfQkVfZW52LnZnYUluZm8uZGV2aWNlIDw8IDMpIHwgKGludClfQkVfZW52LnZnYUluZm8uZnVuY3Rpb247CisjZWxzZQorLyogRmFpbCBpZiBubyBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlZ2lzdGVyZWQgKi8KKwlpZiAoIV9CRV9lbnYudmdhSW5mby5wY2lJbmZvKQorCQlyZXR1cm47CisKKwlwY2lTbG90ID0gKHUxNikgKF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5zbG90LmkgPj4gOCk7CisjZW5kaWYKKwlzd2l0Y2ggKE0ueDg2LlJfQVgpIHsKKwljYXNlIDB4QjEwMToJCS8qIFBDSSBiaW9zIHByZXNlbnQ/ICovCisJCU0ueDg2LlJfQUwgPSAweDAwOwkvKiBubyBjb25maWcgc3BhY2Uvc3BlY2lhbCBjeWNsZSBnZW5lcmF0aW9uIHN1cHBvcnQgKi8KKwkJTS54ODYuUl9FRFggPSAweDIwNDk0MzUwOwkvKiAiIElDUCIgKi8KKwkJTS54ODYuUl9CWCA9IDB4MDIxMDsJLyogVmVyc2lvbiAyLjEwICovCisJCU0ueDg2LlJfQ0wgPSAwOwkvKiBNYXggYnVzIG51bWJlciBpbiBzeXN0ZW0gKi8KKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJYnJlYWs7CisJY2FzZSAweEIxMDI6CQkvKiBGaW5kIFBDSSBkZXZpY2UgKi8KKwkJTS54ODYuUl9BSCA9IERFVklDRV9OT1RfRk9VTkQ7CisjaWZkZWYgX19LRVJORUxfXworCQlpZiAoTS54ODYuUl9EWCA9PSBfQkVfZW52LnZnYUluZm8uVmVuZG9ySUQgJiYKKwkJICAgIE0ueDg2LlJfQ1ggPT0gX0JFX2Vudi52Z2FJbmZvLkRldmljZUlEICYmIE0ueDg2LlJfU0kgPT0gMCkgeworI2Vsc2UKKwkJaWYgKE0ueDg2LlJfRFggPT0gX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8tPlZlbmRvcklEICYmCisJCSAgICBNLng4Ni5SX0NYID09IF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5EZXZpY2VJRCAmJgorCQkgICAgTS54ODYuUl9TSSA9PSAwKSB7CisjZW5kaWYKKwkJCU0ueDg2LlJfQUggPSBTVUNDRVNTRlVMOworCQkJTS54ODYuUl9CWCA9IHBjaVNsb3Q7CisJCX0KKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOworCQlicmVhazsKKwljYXNlIDB4QjEwMzoJCS8qIEZpbmQgUENJIGNsYXNzIGNvZGUgKi8KKwkJTS54ODYuUl9BSCA9IERFVklDRV9OT1RfRk9VTkQ7CisjaWZkZWYgX19LRVJORUxfXworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShfQkVfZW52LnZnYUluZm8ucGNpZGV2LCBQQ0lfQ0xBU1NfUFJPRywKKwkJCQkgICAgICZpbnRlcmZhY2UpOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShfQkVfZW52LnZnYUluZm8ucGNpZGV2LCBQQ0lfQ0xBU1NfREVWSUNFLAorCQkJCSAgICAgJnN1YmNsYXNzKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwKKwkJCQkgICAgIFBDSV9DTEFTU19ERVZJQ0UgKyAxLCAmYmFzZWNsYXNzKTsKKwkJaWYgKE0ueDg2LlJfQ0wgPT0gaW50ZXJmYWNlICYmIE0ueDg2LlJfQ0ggPT0gc3ViY2xhc3MKKwkJICAgICYmICh1OCkgKE0ueDg2LlJfRUNYID4+IDE2KSA9PSBiYXNlY2xhc3MpIHsKKyNlbHNlCisJCWlmIChNLng4Ni5SX0NMID09IF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5JbnRlcmZhY2UgJiYKKwkJICAgIE0ueDg2LlJfQ0ggPT0gX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8tPlN1YkNsYXNzICYmCisJCSAgICAodTgpIChNLng4Ni5SX0VDWCA+PiAxNikgPT0KKwkJICAgIF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5CYXNlQ2xhc3MpIHsKKyNlbmRpZgorCQkJTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7CisJCQlNLng4Ni5SX0JYID0gcGNpU2xvdDsKKwkJfQorCQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7CisJCWJyZWFrOworCWNhc2UgMHhCMTA4OgkJLyogUmVhZCBjb25maWd1cmF0aW9uIGJ5dGUgKi8KKwkJTS54ODYuUl9BSCA9IEJBRF9SRUdJU1RFUl9OVU1CRVI7CisJCWlmIChNLng4Ni5SX0JYID09IHBjaVNsb3QpIHsKKwkJCU0ueDg2LlJfQUggPSBTVUNDRVNTRlVMOworI2lmZGVmIF9fS0VSTkVMX18KKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKF9CRV9lbnYudmdhSW5mby5wY2lkZXYsIE0ueDg2LlJfREksCisJCQkJCSAgICAgJk0ueDg2LlJfQ0wpOworI2Vsc2UKKwkJCU0ueDg2LlJfQ0wgPQorCQkJICAgICh1OCkgUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLCAwLCBQQ0lfUkVBRF9CWVRFLAorCQkJCQkgICAgICAgX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8pOworI2VuZGlmCisJCX0KKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOworCQlicmVhazsKKwljYXNlIDB4QjEwOToJCS8qIFJlYWQgY29uZmlndXJhdGlvbiB3b3JkICovCisJCU0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOworCQlpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7CisJCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKKyNpZmRlZiBfX0tFUk5FTF9fCisJCQlwY2lfcmVhZF9jb25maWdfd29yZChfQkVfZW52LnZnYUluZm8ucGNpZGV2LCBNLng4Ni5SX0RJLAorCQkJCQkgICAgICZNLng4Ni5SX0NYKTsKKyNlbHNlCisJCQlNLng4Ni5SX0NYID0KKwkJCSAgICAodTE2KSBQQ0lfYWNjZXNzUmVnKE0ueDg2LlJfREksIDAsIFBDSV9SRUFEX1dPUkQsCisJCQkJCQlfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7CisjZW5kaWYKKwkJfQorCQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7CisJCWJyZWFrOworCWNhc2UgMHhCMTBBOgkJLyogUmVhZCBjb25maWd1cmF0aW9uIGR3b3JkICovCisJCU0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOworCQlpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7CisJCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKKyNpZmRlZiBfX0tFUk5FTF9fCisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwKKwkJCQkJICAgICAgTS54ODYuUl9ESSwgJk0ueDg2LlJfRUNYKTsKKyNlbHNlCisJCQlNLng4Ni5SX0VDWCA9CisJCQkgICAgKHUzMikgUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLCAwLCBQQ0lfUkVBRF9EV09SRCwKKwkJCQkJCV9CRV9lbnYudmdhSW5mby5wY2lJbmZvKTsKKyNlbmRpZgorCQl9CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKKwkJYnJlYWs7CisJY2FzZSAweEIxMEI6CQkvKiBXcml0ZSBjb25maWd1cmF0aW9uIGJ5dGUgKi8KKwkJTS54ODYuUl9BSCA9IEJBRF9SRUdJU1RFUl9OVU1CRVI7CisJCWlmIChNLng4Ni5SX0JYID09IHBjaVNsb3QpIHsKKwkJCU0ueDg2LlJfQUggPSBTVUNDRVNTRlVMOworI2lmZGVmIF9fS0VSTkVMX18KKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShfQkVfZW52LnZnYUluZm8ucGNpZGV2LAorCQkJCQkgICAgICBNLng4Ni5SX0RJLCBNLng4Ni5SX0NMKTsKKyNlbHNlCisJCQlQQ0lfYWNjZXNzUmVnKE0ueDg2LlJfREksIE0ueDg2LlJfQ0wsIFBDSV9XUklURV9CWVRFLAorCQkJCSAgICAgIF9CRV9lbnYudmdhSW5mby5wY2lJbmZvKTsKKyNlbmRpZgorCQl9CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKKwkJYnJlYWs7CisJY2FzZSAweEIxMEM6CQkvKiBXcml0ZSBjb25maWd1cmF0aW9uIHdvcmQgKi8KKwkJTS54ODYuUl9BSCA9IEJBRF9SRUdJU1RFUl9OVU1CRVI7CisJCWlmIChNLng4Ni5SX0JYID09IHBjaVNsb3QpIHsKKwkJCU0ueDg2LlJfQUggPSBTVUNDRVNTRlVMOworI2lmZGVmIF9fS0VSTkVMX18KKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChfQkVfZW52LnZnYUluZm8ucGNpZGV2LAorCQkJCQkgICAgICBNLng4Ni5SX0RJLCBNLng4Ni5SX0NYKTsKKyNlbHNlCisJCQlQQ0lfYWNjZXNzUmVnKE0ueDg2LlJfREksIE0ueDg2LlJfQ1gsIFBDSV9XUklURV9XT1JELAorCQkJCSAgICAgIF9CRV9lbnYudmdhSW5mby5wY2lJbmZvKTsKKyNlbmRpZgorCQl9CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKKwkJYnJlYWs7CisJY2FzZSAweEIxMEQ6CQkvKiBXcml0ZSBjb25maWd1cmF0aW9uIGR3b3JkICovCisJCU0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOworCQlpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7CisJCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKKyNpZmRlZiBfX0tFUk5FTF9fCisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKF9CRV9lbnYudmdhSW5mby5wY2lkZXYsCisJCQkJCSAgICAgICBNLng4Ni5SX0RJLCBNLng4Ni5SX0VDWCk7CisjZWxzZQorCQkJUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLCBNLng4Ni5SX0VDWCwgUENJX1dSSVRFX0RXT1JELAorCQkJCSAgICAgIF9CRV9lbnYudmdhSW5mby5wY2lJbmZvKTsKKyNlbmRpZgorCQl9CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJiaW9zRW11L2Jpb3MuaW50MWE6IHVua25vd24gZnVuY3Rpb24gQVg9JSMwNHhcbiIsCisJCSAgICAgICBNLng4Ni5SX0FYKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgQklPUyBlbXVsYXRpb24gZnVuY3Rpb25zIGZvciB0aGUgc3BlY2lmaWMKK1BDSSBkaXNwbGF5IGRldmljZS4gV2UgaW5zdWxhdGUgdGhlIHJlYWwgbW9kZSBCSU9TIGZyb20gYW55IG90aGVyIGRldmljZXMKK29uIHRoZSBidXMsIHNvIHRoYXQgaXQgd2lsbCB3b3JrIGNvcnJlY3RseSB0aGlua2luZyB0aGF0IGl0IGlzIHRoZSBvbmx5CitkZXZpY2UgcHJlc2VudCBvbiB0aGUgYnVzIChpZTogYXZvaWRpbmcgYW55IGFkYXB0ZXJzIHByZXNlbnQgaW4gZnJvbSBvZgordGhlIGRldmljZSB3ZSBhcmUgdHJ5aW5nIHRvIGNvbnRyb2wpLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQkVfY29uc3RMRV8zMih2KSAgICAoKCgoKCh2KSYweGZmMDApPj44KXwoKCh2KSYweGZmKTw8OCkpPDwxNil8KCgoKCh2KSYweGZmMDAwMDAwKT4+OCl8KCgodikmMHgwMGZmMDAwMCk8PDgpKT4+MTYpKQorCit2b2lkIF9CRV9iaW9zX2luaXQodTMyICogaW50clRhYikKK3sKKwlpbnQgaTsKKwlYODZFTVVfaW50ckZ1bmNzIGJpb3NfaW50cl90YWJbMjU2XTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworCQlpbnRyVGFiW2ldID0gQkVfY29uc3RMRV8zMihCSU9TX1NFRyA8PCAxNik7CisJCWJpb3NfaW50cl90YWJbaV0gPSB1bmRlZmluZWRfaW50cjsKKwl9CisJYmlvc19pbnRyX3RhYlsweDEwXSA9IGludDEwOworCWJpb3NfaW50cl90YWJbMHgxQV0gPSBpbnQxQTsKKwliaW9zX2ludHJfdGFiWzB4NDJdID0gaW50NDI7CisJYmlvc19pbnRyX3RhYlsweDZEXSA9IGludDEwOworCVg4NkVNVV9zZXR1cEludHJGdW5jcyhiaW9zX2ludHJfdGFiKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2Jpb3NlbXUuYyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9iaW9zZW11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzYWVkZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9iaW9zZW11LmMKQEAgLTAsMCArMSwzNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCQkJIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQorKgkJICAgICAgIHRvIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogIEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisqCisqCQlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4JVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOglBTlNJIEMKKyogRW52aXJvbm1lbnQ6CUFueQorKiBEZXZlbG9wZXI6CUtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjoJTW9kdWxlIGltcGxlbWVudGluZyB0aGUgc3lzdGVtIHNwZWNpZmljIGZ1bmN0aW9ucy4gVGhpcworKgkJbW9kdWxlIGlzIGFsd2F5cyBjb21waWxlZCBhbmQgbGlua2VkIGluIHRoZSBPUyBkZXBlZGVudAorKgkJbGlicmFyaWVzLCBhbmQgbmV2ZXIgaW4gYSBiaW5hcnkgcG9ydGFibGUgZHJpdmVyLgorKgorKgkJSmFzb24gcG9ydGVkIHRoaXMgZmlsZSB0byB1LWJvb3QgdG8gcnVuIHRoZSBBVEkgdmlkZW8gY2FyZCBCSU9TCisqCQlpbiB1LWJvb3QuIE1hZGUgYWxsIHRoZSB2aWRlbyBtZW1vcnkgYmUgZW11bGF0ZWQgZHVyaW5nIHRoZQorKgkJQklPUyBydW5pbmcgcHJvY2VzcyB3aGljaCBtYXkgYWZmZWN0IHRoZSBWR0EgZnVuY3Rpb24gYnV0IHRoZQorKgkJZnJhbWJ1ZmZlciBmdW5jdGlvbiBjYW4gd29yayBhZnRlciBydW4gdGhlIEJJT1MuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYmlvc2VtdWkuaCIKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0JJT1NFTVUpCisKK0JFX3N5c0VudiBfQkVfZW52ID0ge3swfX07CitzdGF0aWMgWDg2RU1VX21lbUZ1bmNzIF9CRV9tZW0gX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmdvdDIiKSkpID0geworCUJFX3JkYiwKKwlCRV9yZHcsCisJQkVfcmRsLAorCUJFX3dyYiwKKwlCRV93cncsCisJQkVfd3JsLAorCX07CisKK3N0YXRpYyBYODZFTVVfcGlvRnVuY3MgX0JFX3BpbyBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuZ290MiIpKSkgPSB7CisJQkVfaW5iLAorCUJFX2ludywKKwlCRV9pbmwsCisJQkVfb3V0YiwKKwlCRV9vdXR3LAorCUJFX291dGwsCisJfTsKKworI2RlZmluZSBPRkYoYWRkcikJKHUxNikoKChhZGRyKSA+PiAwKSAmIDB4ZmZmZikKKyNkZWZpbmUgU0VHKGFkZHIpCSh1MTYpKCgoYWRkcikgPj4gNCkgJiAweGYwMDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorZGVidWdGbGFncyAgLSBGbGFncyB0byBlbmFibGUgZGVidWdnaW5nIG9wdGlvbnMgKGRlYnVnIGJ1aWxkcyBvbmx5KQorbWVtU2l6ZQkgICAgLSBBbW91bnQgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIGZvciByZWFsIG1vZGUgbWFjaGluZQoraW5mbwkgICAgLSBQb2ludGVyIHRvIGRlZmF1bHQgVkdBIGRldmljZSBpbmZvcm1hdGlvbgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbnMgaW5pdGlhbGlzZXMgdGhlIEJFbGliLCBhbmQgdXNlcyB0aGUgcGFzc2VkIGluCitCSU9TIGltYWdlIGFzIHRoZSBCSU9TIHRoYXQgaXMgdXNlZCBhbmQgZW11bGF0ZWQgYXQgMHhDMDAwMC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgWDg2QVBJIEJFX2luaXQodTMyIGRlYnVnRmxhZ3MsIGludCBtZW1TaXplLCBCRV9WR0FJbmZvICogaW5mbywgaW50IHNoYXJlZCkKK3sKKyNpZiAhZGVmaW5lZChfX0RSSVZFUl9fKSAgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKworCVBNX2luaXQoKTsKKyNlbmRpZgorCW1lbXNldCgmTSwgMCwgc2l6ZW9mKE0pKTsKKwlpZiAobWVtU2l6ZSA8IDIwNDgwKXsKKwkJcHJpbnRmKCJFbXVsYXRvciByZXF1aXJlcyBhdCBsZWFzdCAyMEtiIG9mIG1lbW9yeSFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlNLm1lbV9iYXNlID0gKHVuc2lnbmVkIGxvbmcpbWFsbG9jKG1lbVNpemUpOworCisJaWYgKE0ubWVtX2Jhc2UgPT0gTlVMTCl7CisJCXByaW50ZigiQmlvc2VtdTpPdXQgb2YgbWVtb3J5ISIpOworCQlyZXR1cm4gMDsKKwl9CisJTS5tZW1fc2l6ZSA9IG1lbVNpemU7CisKKwlfQkVfZW52LmVtdWxhdGVWR0EgPSAwOworCV9CRV9lbnYuYnVzbWVtX2Jhc2UgPSAodW5zaWduZWQgbG9uZyltYWxsb2MoMTI4ICogMTAyNCk7CisJaWYgKF9CRV9lbnYuYnVzbWVtX2Jhc2UgPT0gTlVMTCl7CisJCXByaW50ZigiQmlvc2VtdTpPdXQgb2YgbWVtb3J5ISIpOworCQlyZXR1cm4gMDsKKwl9CisJTS54ODYuZGVidWcgPSBkZWJ1Z0ZsYWdzOworCV9CRV9iaW9zX2luaXQoKHUzMiopaW5mby0+TG93TWVtKTsKKwlYODZFTVVfc2V0dXBNZW1GdW5jcygmX0JFX21lbSk7CisJWDg2RU1VX3NldHVwUGlvRnVuY3MoJl9CRV9waW8pOworCUJFX3NldFZHQShpbmZvKTsKKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbmZvCSAgICAtIFBvaW50ZXIgdG8gVkdBIGRldmljZSBpbmZvcm1hdGlvbiB0byBtYWtlIGN1cnJlbnQKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gc2V0cyB0aGUgVkdBIEJJT1MgZnVuY3Rpb25zIGluIHRoZSBlbXVsYXRvciB0byBwb2ludCB0byB0aGUKK3NwZWNpZmljIFZHQSBCSU9TIGluIHVzZS4gVGhpcyBpbmNsdWRlcyBzd2FwcGluZyB0aGUgQklPUyBpbnRlcnJ1cHQKK3ZlY3RvcnMsIEJJT1MgaW1hZ2UgYW5kIEJJT1MgZGF0YSBhcmVhIHRvIHRoZSBuZXcgQklPUy4gVGhpcyBhbGxvd3MgdGhlCityZWFsIG1vZGUgQklPUyB0byBiZSBzd2FwcGVkIHdpdGhvdXQgcmVzZXR0aW5nIHRoZSBlbnRpcmUgZW11bGF0b3IuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZBUEkgQkVfc2V0VkdBKEJFX1ZHQUluZm8gKiBpbmZvKQoreworCisjaWZkZWYgX19LRVJORUxfXworCV9CRV9lbnYudmdhSW5mby5mdW5jdGlvbiA9IGluZm8tPmZ1bmN0aW9uOworCV9CRV9lbnYudmdhSW5mby5kZXZpY2UgPSBpbmZvLT5kZXZpY2U7CisJX0JFX2Vudi52Z2FJbmZvLmJ1cyA9IGluZm8tPmJ1czsKKwlfQkVfZW52LnZnYUluZm8ucGNpZGV2ID0gaW5mby0+cGNpZGV2OworI2Vsc2UKKwlfQkVfZW52LnZnYUluZm8ucGNpSW5mbyA9IGluZm8tPnBjaUluZm87CisjZW5kaWYKKwlfQkVfZW52LnZnYUluZm8uQklPU0ltYWdlID0gaW5mby0+QklPU0ltYWdlOworCWlmIChpbmZvLT5CSU9TSW1hZ2UpIHsKKwkJX0JFX2Vudi5iaW9zbWVtX2Jhc2UgPSAodWxvbmcpIGluZm8tPkJJT1NJbWFnZTsKKwkJX0JFX2Vudi5iaW9zbWVtX2xpbWl0ID0gMHhDMDAwMCArIGluZm8tPkJJT1NJbWFnZUxlbiAtIDE7CisJfSBlbHNlIHsKKwkJX0JFX2Vudi5iaW9zbWVtX2Jhc2UgPSBfQkVfZW52LmJ1c21lbV9iYXNlICsgMHgyMDAwMDsKKwkJX0JFX2Vudi5iaW9zbWVtX2xpbWl0ID0gMHhDN0ZGRjsKKwl9CisJaWYgKCooKHUzMiAqKSBpbmZvLT5Mb3dNZW0pID09IDApCisJCV9CRV9iaW9zX2luaXQoKHUzMiAqKSBpbmZvLT5Mb3dNZW0pOworCW1lbWNweSgodTggKikgTS5tZW1fYmFzZSwgaW5mby0+TG93TWVtLCBzaXplb2YoaW5mby0+TG93TWVtKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW5mbwkgICAgLSBQb2ludGVyIHRvIFZHQSBkZXZpY2UgaW5mb3JtYXRpb24gdG8gcmV0cmlldmUgY3VycmVudAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBWR0EgQklPUyBmdW5jdGlvbnMgY3VycmVudGx5IGFjdGl2ZSBpbiB0aGUKK2VtdWxhdG9yLCBzbyB0aGV5IGNhbiBiZSByZXN0b3JlZCBhdCBhIGxhdGVyIGRhdGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZBUEkgQkVfZ2V0VkdBKEJFX1ZHQUluZm8gKiBpbmZvKQoreworI2lmZGVmIF9fS0VSTkVMX18KKwlpbmZvLT5mdW5jdGlvbiA9IF9CRV9lbnYudmdhSW5mby5mdW5jdGlvbjsKKwlpbmZvLT5kZXZpY2UgPSBfQkVfZW52LnZnYUluZm8uZGV2aWNlOworCWluZm8tPmJ1cyA9IF9CRV9lbnYudmdhSW5mby5idXM7CisJaW5mby0+cGNpZGV2ID0gX0JFX2Vudi52Z2FJbmZvLnBjaWRldjsKKyNlbHNlCisJaW5mby0+cGNpSW5mbyA9IF9CRV9lbnYudmdhSW5mby5wY2lJbmZvOworI2VuZGlmCisJaW5mby0+QklPU0ltYWdlID0gX0JFX2Vudi52Z2FJbmZvLkJJT1NJbWFnZTsKKwltZW1jcHkoaW5mby0+TG93TWVtLCAodTggKikgTS5tZW1fYmFzZSwgc2l6ZW9mKGluZm8tPkxvd01lbSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3Jfc2VnCS0gU2VnbWVudCBmb3IgcG9pbnRlciB0byBjb252ZXJ0CityX29mZgktIE9mZnNldCBmb3IgcG9pbnRlciB0byBjb252ZXJ0CisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIG1hcHMgYSByZWFsIG1vZGUgcG9pbnRlciBpbiB0aGUgZW11bGF0b3IgbWVtb3J5IHRvIGEgcHJvdGVjdGVkCittb2RlIHBvaW50ZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBkaXJlY3RseSBhY2Nlc3MgdGhlIG1lbW9yeS4KKworTk9URToJVGhlIG1lbW9yeSBpcyAqYWx3YXlzKiBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgc29uIG9uIG5vbi14ODYKKwlzeXN0ZW1zIHlvdSB3aWxsIG5lZWQgdG8gZG8gZW5kaWFuIHRyYW5zbGF0aW9ucyB0byBhY2Nlc3MgdGhpcworCW1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICpYODZBUEkgQkVfbWFwUmVhbFBvaW50ZXIodWludCByX3NlZywgdWludCByX29mZikKK3sKKwl1MzIgYWRkciA9ICgodTMyKSByX3NlZyA8PCA0KSArIHJfb2ZmOworCisJaWYgKGFkZHIgPj0gMHhDMDAwMCAmJiBhZGRyIDw9IF9CRV9lbnYuYmlvc21lbV9saW1pdCkgeworCQlyZXR1cm4gKHZvaWQgKikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyIC0gMHhDMDAwMCk7CisJfSBlbHNlIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7CisJCXJldHVybiAodm9pZCAqKShfQkVfZW52LmJ1c21lbV9iYXNlICsgYWRkciAtIDB4QTAwMDApOworCX0KKwlyZXR1cm4gKHZvaWQgKikoTS5tZW1fYmFzZSArIGFkZHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2xlbgktIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBWRVNBIGJ1ZmZlcgorcnNlZwktIFBsYWNlIHRvIHN0b3JlIFZFU0EgYnVmZmVyIHNlZ21lbnQKK3JvZmYJLSBQbGFjZSB0byBzdG9yZSBWRVNBIGJ1ZmZlciBvZmZzZXQKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgVkVTQSB0cmFuc2ZlciBidWZmZXIgaW4gcmVhbAorX0JFX3Bpb21vZGUgZW11bGF0b3IgbWVtb3J5LiBUaGUgVkVTQSB0cmFuc2ZlciBidWZmZXIgaXMgYWx3YXlzIDEwMjQgYnl0ZXMgbG9uZywKK2FuZCBsb2NhdGVkIGF0IDE1S2IgaW50byB0aGUgc3RhcnQgb2YgdGhlIHJlYWwgbW9kZSBtZW1vcnkgKDE2S2IgaXMgd2hlcmUKK3dlIHB1dCB0aGUgcmVhbCBtb2RlIGNvZGUgd2UgZXhlY3V0ZSBmb3IgaXNzdWluZyBpbnRlcnJ1cHRzKS4KKworTk9URToJVGhlIG1lbW9yeSBpcyAqYWx3YXlzKiBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgc29uIG9uIG5vbi14ODYKKwlzeXN0ZW1zIHlvdSB3aWxsIG5lZWQgdG8gZG8gZW5kaWFuIHRyYW5zbGF0aW9ucyB0byBhY2Nlc3MgdGhpcworCW1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICpYODZBUEkgQkVfZ2V0VkVTQUJ1Zih1aW50ICogbGVuLCB1aW50ICogcnNlZywgdWludCAqIHJvZmYpCit7CisJKmxlbiA9IDEwMjQ7CisJKnJzZWcgPSBTRUcoMHgwM0MwMCk7CisJKnJvZmYgPSBPRkYoMHgwM0MwMCk7CisJcmV0dXJuICh2b2lkICopKE0ubWVtX2Jhc2UgKyAoKHUzMikgKiByc2VnIDw8IDQpICsgKnJvZmYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0NsZWFucyB1cCBhbmQgZXhpdHMgdGhlIGVtdWxhdG9yLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2QVBJIEJFX2V4aXQodm9pZCkKK3sKKwlmcmVlKE0ubWVtX2Jhc2UpOworCWZyZWUoX0JFX2Vudi5idXNtZW1fYmFzZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2VnCS0gU2VnbWVudCBvZiBjb2RlIHRvIGNhbGwKK29mZgktIE9mZnNldCBvZiBjb2RlIHRvIGNhbGwKK3JlZ3MJLSBSZWFsIG1vZGUgcmVnaXN0ZXJzIHRvIGxvYWQKK3NyZWdzCS0gUmVhbCBtb2RlIHNlZ21lbnQgcmVnaXN0ZXJzIHRvIGxvYWQKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb25zIGNhbGxzIGEgcmVhbCBtb2RlIGZhciBmdW5jdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MsCithbmQgbG9hZHMgYWxsIHRoZSB4ODYgcmVnaXN0ZXJzIGZyb20gdGhlIHBhc3NlZCBpbiByZWdpc3RlcnMgc3RydWN0dXJlLgorT24gZXhpdCB0aGUgcmVnaXN0ZXJzIHJldHVybmVkIGZyb20gdGhlIGNhbGwgYXJlIHJldHVybmVkIGluIHRoZSBzYW1lCitzdHJ1Y3R1cmVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2QVBJIEJFX2NhbGxSZWFsTW9kZSh1aW50IHNlZywgdWludCBvZmYsIFJNUkVHUyAqIHJlZ3MsIFJNU1JFR1MgKiBzcmVncykKK3sKKwlNLng4Ni5SX0VBWCA9IHJlZ3MtPmUuZWF4OworCU0ueDg2LlJfRUJYID0gcmVncy0+ZS5lYng7CisJTS54ODYuUl9FQ1ggPSByZWdzLT5lLmVjeDsKKwlNLng4Ni5SX0VEWCA9IHJlZ3MtPmUuZWR4OworCU0ueDg2LlJfRVNJID0gcmVncy0+ZS5lc2k7CisJTS54ODYuUl9FREkgPSByZWdzLT5lLmVkaTsKKwlNLng4Ni5SX0RTID0gc3JlZ3MtPmRzOworCU0ueDg2LlJfRVMgPSBzcmVncy0+ZXM7CisJTS54ODYuUl9GUyA9IHNyZWdzLT5mczsKKwlNLng4Ni5SX0dTID0gc3JlZ3MtPmdzOworCisJKCh1OCAqKSBNLm1lbV9iYXNlKVsweDQwMDBdID0gMHg5QTsKKwkoKHU4ICopIE0ubWVtX2Jhc2UpWzB4NDAwMV0gPSAodTgpIG9mZjsKKwkoKHU4ICopIE0ubWVtX2Jhc2UpWzB4NDAwMl0gPSAodTgpIChvZmYgPj4gOCk7CisJKCh1OCAqKSBNLm1lbV9iYXNlKVsweDQwMDNdID0gKHU4KSBzZWc7CisJKCh1OCAqKSBNLm1lbV9iYXNlKVsweDQwMDRdID0gKHU4KSAoc2VnID4+IDgpOworCSgodTggKikgTS5tZW1fYmFzZSlbMHg0MDA1XSA9IDB4RjE7CS8qIElsbGVnYWwgb3AtY29kZSAqLworCU0ueDg2LlJfQ1MgPSBTRUcoMHgwNDAwMCk7CisJTS54ODYuUl9JUCA9IE9GRigweDA0MDAwKTsKKworCU0ueDg2LlJfU1MgPSBTRUcoTS5tZW1fc2l6ZSAtIDIpOworCU0ueDg2LlJfU1AgPSBPRkYoTS5tZW1fc2l6ZSAtIDIpICsgMjsKKworCVg4NkVNVV9leGVjKCk7CisKKwlyZWdzLT5lLmNmbGFnID0gTS54ODYuUl9FRkxHICYgRl9DRjsKKwlyZWdzLT5lLmVheCA9IE0ueDg2LlJfRUFYOworCXJlZ3MtPmUuZWJ4ID0gTS54ODYuUl9FQlg7CisJcmVncy0+ZS5lY3ggPSBNLng4Ni5SX0VDWDsKKwlyZWdzLT5lLmVkeCA9IE0ueDg2LlJfRURYOworCXJlZ3MtPmUuZXNpID0gTS54ODYuUl9FU0k7CisJcmVncy0+ZS5lZGkgPSBNLng4Ni5SX0VESTsKKwlzcmVncy0+ZHMgPSBNLng4Ni5SX0RTOworCXNyZWdzLT5lcyA9IE0ueDg2LlJfRVM7CisJc3JlZ3MtPmZzID0gTS54ODYuUl9GUzsKKwlzcmVncy0+Z3MgPSBNLng4Ni5SX0dTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2ludG5vCS0gSW50ZXJydXB0IG51bWJlciB0byBleGVjdXRlCitpbgktIFJlYWwgbW9kZSByZWdpc3RlcnMgdG8gbG9hZAorb3V0CS0gUGxhY2UgdG8gc3RvcmUgcmVzdWx0aW5nIHJlYWwgbW9kZSByZWdpc3RlcnMKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb25zIGNhbGxzIGEgcmVhbCBtb2RlIGludGVycnVwdCBmdW5jdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MsCithbmQgbG9hZHMgYWxsIHRoZSB4ODYgcmVnaXN0ZXJzIGZyb20gdGhlIHBhc3NlZCBpbiByZWdpc3RlcnMgc3RydWN0dXJlLgorT24gZXhpdCB0aGUgcmVnaXN0ZXJzIHJldHVybmVkIGZyb20gdGhlIGNhbGwgYXJlIHJldHVybmVkIGluIG91dCBzdHVjdHVyZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgWDg2QVBJIEJFX2ludDg2KGludCBpbnRubywgUk1SRUdTICogaW4sIFJNUkVHUyAqIG91dCkKK3sKKwlNLng4Ni5SX0VBWCA9IGluLT5lLmVheDsKKwlNLng4Ni5SX0VCWCA9IGluLT5lLmVieDsKKwlNLng4Ni5SX0VDWCA9IGluLT5lLmVjeDsKKwlNLng4Ni5SX0VEWCA9IGluLT5lLmVkeDsKKwlNLng4Ni5SX0VTSSA9IGluLT5lLmVzaTsKKwlNLng4Ni5SX0VESSA9IGluLT5lLmVkaTsKKwkoKHU4ICopIE0ubWVtX2Jhc2UpWzB4NDAwMF0gPSAweENEOworCSgodTggKikgTS5tZW1fYmFzZSlbMHg0MDAxXSA9ICh1OCkgaW50bm87CisJKCh1OCAqKSBNLm1lbV9iYXNlKVsweDQwMDJdID0gMHhGMTsKKwlNLng4Ni5SX0NTID0gU0VHKDB4MDQwMDApOworCU0ueDg2LlJfSVAgPSBPRkYoMHgwNDAwMCk7CisKKwlNLng4Ni5SX1NTID0gU0VHKE0ubWVtX3NpemUgLSAxKTsKKwlNLng4Ni5SX1NQID0gT0ZGKE0ubWVtX3NpemUgLSAxKSAtIDE7CisKKwlYODZFTVVfZXhlYygpOworCW91dC0+ZS5jZmxhZyA9IE0ueDg2LlJfRUZMRyAmIEZfQ0Y7CisJb3V0LT5lLmVheCA9IE0ueDg2LlJfRUFYOworCW91dC0+ZS5lYnggPSBNLng4Ni5SX0VCWDsKKwlvdXQtPmUuZWN4ID0gTS54ODYuUl9FQ1g7CisJb3V0LT5lLmVkeCA9IE0ueDg2LlJfRURYOworCW91dC0+ZS5lc2kgPSBNLng4Ni5SX0VTSTsKKwlvdXQtPmUuZWRpID0gTS54ODYuUl9FREk7CisJcmV0dXJuIG91dC0+eC5heDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbnRubwktIEludGVycnVwdCBudW1iZXIgdG8gZXhlY3V0ZQoraW4JLSBSZWFsIG1vZGUgcmVnaXN0ZXJzIHRvIGxvYWQKK291dAktIFBsYWNlIHRvIHN0b3JlIHJlc3VsdGluZyByZWFsIG1vZGUgcmVnaXN0ZXJzCitzcmVncwktIFJlYWwgbW9kZSBzZWdtZW50IHJlZ2lzdGVycyB0byBsb2FkCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9ucyBjYWxscyBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgZnVuY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLAorYW5kIGxvYWRzIGFsbCB0aGUgeDg2IHJlZ2lzdGVycyBmcm9tIHRoZSBwYXNzZWQgaW4gcmVnaXN0ZXJzIHN0cnVjdHVyZS4KK09uIGV4aXQgdGhlIHJlZ2lzdGVycyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsIGFyZSByZXR1cm5lZCBpbiBvdXQgc3R1Y3R1cmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFg4NkFQSSBCRV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKiBpbiwgUk1SRUdTICogb3V0LCBSTVNSRUdTICogc3JlZ3MpCit7CisJTS54ODYuUl9FQVggPSBpbi0+ZS5lYXg7CisJTS54ODYuUl9FQlggPSBpbi0+ZS5lYng7CisJTS54ODYuUl9FQ1ggPSBpbi0+ZS5lY3g7CisJTS54ODYuUl9FRFggPSBpbi0+ZS5lZHg7CisJTS54ODYuUl9FU0kgPSBpbi0+ZS5lc2k7CisJTS54ODYuUl9FREkgPSBpbi0+ZS5lZGk7CisJTS54ODYuUl9EUyA9IHNyZWdzLT5kczsKKwlNLng4Ni5SX0VTID0gc3JlZ3MtPmVzOworCU0ueDg2LlJfRlMgPSBzcmVncy0+ZnM7CisJTS54ODYuUl9HUyA9IHNyZWdzLT5nczsKKwkoKHU4ICopIE0ubWVtX2Jhc2UpWzB4NDAwMF0gPSAweENEOworCSgodTggKikgTS5tZW1fYmFzZSlbMHg0MDAxXSA9ICh1OCkgaW50bm87CisJKCh1OCAqKSBNLm1lbV9iYXNlKVsweDQwMDJdID0gMHhGMTsKKwlNLng4Ni5SX0NTID0gU0VHKDB4MDQwMDApOworCU0ueDg2LlJfSVAgPSBPRkYoMHgwNDAwMCk7CisKKwlNLng4Ni5SX1NTID0gU0VHKE0ubWVtX3NpemUgLSAxKTsKKwlNLng4Ni5SX1NQID0gT0ZGKE0ubWVtX3NpemUgLSAxKSAtIDE7CisKKwlYODZFTVVfZXhlYygpOworCW91dC0+ZS5jZmxhZyA9IE0ueDg2LlJfRUZMRyAmIEZfQ0Y7CisJb3V0LT5lLmVheCA9IE0ueDg2LlJfRUFYOworCW91dC0+ZS5lYnggPSBNLng4Ni5SX0VCWDsKKwlvdXQtPmUuZWN4ID0gTS54ODYuUl9FQ1g7CisJb3V0LT5lLmVkeCA9IE0ueDg2LlJfRURYOworCW91dC0+ZS5lc2kgPSBNLng4Ni5SX0VTSTsKKwlvdXQtPmUuZWRpID0gTS54ODYuUl9FREk7CisJc3JlZ3MtPmRzID0gTS54ODYuUl9EUzsKKwlzcmVncy0+ZXMgPSBNLng4Ni5SX0VTOworCXNyZWdzLT5mcyA9IE0ueDg2LlJfRlM7CisJc3JlZ3MtPmdzID0gTS54ODYuUl9HUzsKKwlyZXR1cm4gb3V0LT54LmF4OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvYmlvc2VtdWkuaCBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9iaW9zZW11aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NWU2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvYmlvc2VtdWkuaApAQCAtMCwwICsxLDE2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJCQkgQklPUyBlbXVsYXRvciBhbmQgaW50ZXJmYWNlCisqCQkgICAgICAgdG8gUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogIENvcHlyaWdodCAoQykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiAgSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KKyoKKyoJCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLglUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CUFOU0kgQworKiBFbnZpcm9ubWVudDoJQW55CisqIERldmVsb3BlcjoJS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOglJbnRlcm5hbCBoZWFkZXIgZmlsZSBmb3IgdGhlIEJJT1MgZW11bGF0b3IgbGlicmFyeS4KKyoKKyoJCUphc29uIHBvcnRlZCB0aGlzIGZpbGUgdG8gdS1ib290LCBBZGRlZCBzb21lIGFyY2hpdGVjdHVyZQorKgkJcmVsYXRlZCBNYWNyby4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19CSU9TRU1VSV9ICisjZGVmaW5lIF9fQklPU0VNVUlfSAorCisjaW5jbHVkZSAiYmlvc2VtdS5oIgorI2luY2x1ZGUgPGFzbS9pby5oPgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCKHgpCXgKKyNlbHNlCisjZGVmaW5lIERCKHgpCWRve313aGlsZSgwKTsKKyNlbmRpZgorCisjZGVmaW5lIEJJT1NfU0VHCTB4ZmZmMAorZXh0ZXJuIFg4NkVNVV9zeXNFbnYgX1g4NkVNVV9lbnY7CisjZGVmaW5lIE0JCV9YODZFTVVfZW52CisKKy8qIE1hY3JvcyB0byByZWFkIGFuZCB3cml0ZSB2YWx1ZXMgdG8geDg2IGVtdWxhdG9yIG1lbW9yeS4gTWVtb3J5IGlzIGFsd2F5cworICogY29uc2lkZXJlZCB0byBiZSBsaXR0bGUgZW5kaWFuLCBzbyB3ZSB1c2UgbWFjcm9zIHRvIGRvIGVuZGlhbiBzd2FwcGluZworICogd2hlcmUgbmVjZXNzYXJ5LgorICovCisKKyNpZmRlZiBfX0JJR19FTkRJQU5fXworI2RlZmluZSByZWFkYl9sZShiYXNlKQkgICAgKigodTgqKShiYXNlKSkKKyNkZWZpbmUgcmVhZHdfbGUoYmFzZSkJICAgICgodTE2KXJlYWRiX2xlKGJhc2UpIHwgKCh1MTYpcmVhZGJfbGUoKGJhc2UpICsgMSkgPDwgOCkpCisjZGVmaW5lIHJlYWRsX2xlKGJhc2UpCSAgICAoKHUzMilyZWFkYl9sZSgoYmFzZSkgKyAwKSB8ICgodTMyKXJlYWRiX2xlKChiYXNlKSArIDEpIDw8IDgpIHwgXAorCQkJICAgICgodTMyKXJlYWRiX2xlKChiYXNlKSArIDIpIDw8IDE2KSB8ICgodTMyKXJlYWRiX2xlKChiYXNlKSArIDMpIDw8IDI0KSkKKyNkZWZpbmUgd3JpdGViX2xlKGJhc2UsIHYpICAqKCh1OCopKGJhc2UpKSA9ICh2KQorI2RlZmluZSB3cml0ZXdfbGUoYmFzZSwgdikgIHdyaXRlYl9sZShiYXNlICsgMCwgKHYgPj4gMCkgJiAweGZmKSwJXAorCQkJICAgIHdyaXRlYl9sZShiYXNlICsgMSwgKHYgPj4gOCkgJiAweGZmKQorI2RlZmluZSB3cml0ZWxfbGUoYmFzZSwgdikgIHdyaXRlYl9sZShiYXNlICsgMCwgKHYgPj4gMCkgJiAweGZmKSwJXAorCQkJICAgIHdyaXRlYl9sZShiYXNlICsgMSwgKHYgPj4gOCkgJiAweGZmKSwJXAorCQkJICAgIHdyaXRlYl9sZShiYXNlICsgMiwgKHYgPj4gMTYpICYgMHhmZiksCVwKKwkJCSAgICB3cml0ZWJfbGUoYmFzZSArIDMsICh2ID4+IDI0KSAmIDB4ZmYpCisjZWxzZQorI2RlZmluZSByZWFkYl9sZShiYXNlKQkgICAgKigodTgqKShiYXNlKSkKKyNkZWZpbmUgcmVhZHdfbGUoYmFzZSkJICAgICooKHUxNiopKGJhc2UpKQorI2RlZmluZSByZWFkbF9sZShiYXNlKQkgICAgKigodTMyKikoYmFzZSkpCisjZGVmaW5lIHdyaXRlYl9sZShiYXNlLCB2KSAgKigodTgqKShiYXNlKSkgPSAodikKKyNkZWZpbmUgd3JpdGV3X2xlKGJhc2UsIHYpICAqKCh1MTYqKShiYXNlKSkgPSAodikKKyNkZWZpbmUgd3JpdGVsX2xlKGJhc2UsIHYpICAqKCh1MzIqKShiYXNlKSkgPSAodikKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIGNvZGVzIHBhc3NlZCB0byB0aGUgZW11bGF0ZWQgSS9PIHBvcnQgZnVuY3Rpb25zIHRvIGRldGVybWluZSB0aGUKK3R5cGUgb2Ygb3BlcmF0aW9uIHRvIHBlcmZvcm0uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKwlSRUdfUkVBRF9CWVRFID0gMCwKKwlSRUdfUkVBRF9XT1JEID0gMSwKKwlSRUdfUkVBRF9EV09SRCA9IDIsCisJUkVHX1dSSVRFX0JZVEUgPSAzLAorCVJFR19XUklURV9XT1JEID0gNCwKKwlSRUdfV1JJVEVfRFdPUkQgPSA1Cit9IFJlZ2lzdGVyRmxhZ3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gY29kZXMgcGFzc2VkIHRvIHRoZSBlbXVsYXRlZCBJL08gcG9ydCBmdW5jdGlvbnMgdG8gZGV0ZXJtaW5lIHRoZQordHlwZSBvZiBvcGVyYXRpb24gdG8gcGVyZm9ybS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworCVBPUlRfQllURSA9IDEsCisJUE9SVF9XT1JEID0gMiwKKwlQT1JUX0RXT1JEID0gMywKK30gUG9ydEluZm9GbGFnczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBkZXRhaWxzIGZvciB0aGUgQklPUyBlbXVsYXRvciBzeXN0ZW0KK2Vudmlyb25tZW50IGFzIHVzZWQgYnkgdGhlIFg4NiBlbXVsYXRvciBsaWJyYXJ5LgorCitIRUFERVI6CitiaW9zZW11LmgKKworTUVNQkVSUzoKK3R5cGUJICAgIC0gVHlwZSBvZiBwb3J0IGFjY2VzcyAoMSA9IGJ5dGUsIDIgPSB3b3JkLCAzID0gZHdvcmQpCitkZWZWYWwJICAgIC0gRGVmYXVsdCBwb3dlciBvbiB2YWx1ZQorZmluYWxWYWwgICAgLSBGaW5hbCB2YWx1ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1OCB0eXBlOworCXUzMiBkZWZWYWw7CisJdTMyIGZpbmFsVmFsOworfSBCRV9wb3J0SW5mbzsKKworI2RlZmluZSBQTV9pbnBiKHBvcnQpCWluYihwb3J0K1ZJREVPX0lPX09GRlNFVCkKKyNkZWZpbmUgUE1faW5wdyhwb3J0KQlpbncocG9ydCtWSURFT19JT19PRkZTRVQpCisjZGVmaW5lIFBNX2lucGQocG9ydCkJaW5sKHBvcnQrVklERU9fSU9fT0ZGU0VUKQorI2RlZmluZSBQTV9vdXRwYihwb3J0LHZhbCkJb3V0Yih2YWwscG9ydCtWSURFT19JT19PRkZTRVQpCisjZGVmaW5lIFBNX291dHB3KHBvcnQsdmFsKQlvdXR3KHZhbCxwb3J0K1ZJREVPX0lPX09GRlNFVCkKKyNkZWZpbmUgUE1fb3V0cGQocG9ydCx2YWwpCW91dGwodmFsLHBvcnQrVklERU9fSU9fT0ZGU0VUKQorCisjZGVmaW5lIExPR19pbnBiKHBvcnQpCVBNX2lucGIocG9ydCkKKyNkZWZpbmUgTE9HX2lucHcocG9ydCkJUE1faW5wdyhwb3J0KQorI2RlZmluZSBMT0dfaW5wZChwb3J0KQlQTV9pbnBkKHBvcnQpCisjZGVmaW5lIExPR19vdXRwYihwb3J0LHZhbCkJUE1fb3V0cGIocG9ydCx2YWwpCisjZGVmaW5lIExPR19vdXRwdyhwb3J0LHZhbCkJUE1fb3V0cHcocG9ydCx2YWwpCisjZGVmaW5lIExPR19vdXRwZChwb3J0LHZhbCkJUE1fb3V0cGQocG9ydCx2YWwpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGJpb3MuYyAqLworCit2b2lkIF9CRV9iaW9zX2luaXQodTMyICogaW50clRhYik7Cit2b2lkIF9CRV9zZXR1cF9mdW5jcyh2b2lkKTsKKworLyogYmVzeXMuYyAqLworI2RlZmluZSBERUJVR19JTygpCShNLng4Ni5kZWJ1ZyAmIERFQlVHX0lPX1RSQUNFX0YpCisKK3U4IFg4NkFQSSBCRV9yZGIodTMyIGFkZHIpOwordTE2IFg4NkFQSSBCRV9yZHcodTMyIGFkZHIpOwordTMyIFg4NkFQSSBCRV9yZGwodTMyIGFkZHIpOwordm9pZCBYODZBUEkgQkVfd3JiKHUzMiBhZGRyLCB1OCB2YWwpOwordm9pZCBYODZBUEkgQkVfd3J3KHUzMiBhZGRyLCB1MTYgdmFsKTsKK3ZvaWQgWDg2QVBJIEJFX3dybCh1MzIgYWRkciwgdTMyIHZhbCk7CisKK3U4IFg4NkFQSSBCRV9pbmIoWDg2RU1VX3Bpb0FkZHIgcG9ydCk7Cit1MTYgWDg2QVBJIEJFX2ludyhYODZFTVVfcGlvQWRkciBwb3J0KTsKK3UzMiBYODZBUEkgQkVfaW5sKFg4NkVNVV9waW9BZGRyIHBvcnQpOwordm9pZCBYODZBUEkgQkVfb3V0YihYODZFTVVfcGlvQWRkciBwb3J0LCB1OCB2YWwpOwordm9pZCBYODZBUEkgQkVfb3V0dyhYODZFTVVfcGlvQWRkciBwb3J0LCB1MTYgdmFsKTsKK3ZvaWQgWDg2QVBJIEJFX291dGwoWDg2RU1VX3Bpb0FkZHIgcG9ydCwgdTMyIHZhbCk7CisjZW5kaWYKKy8qIF9fQklPU0VNVUlfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUvYmlvc2VtdS5oIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUvYmlvc2VtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzY2IzMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS9iaW9zZW11LmgKQEAgLTAsMCArMSwzOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgQklPUyBlbXVsYXRvciBhbmQgaW50ZXJmYWNlCisqICAgICAgICAgICAgICAgICAgICAgIHRvIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgdGhlIHJlYWwgbW9kZSB4ODYgQklPUyBlbXVsYXRvciwgd2hpY2ggaXMKKyogICAgICAgICAgICAgICB1c2VkIHRvIHdhcm1ib290IGFueSBudW1iZXIgb2YgVkdBIGNvbXBhdGlibGUgUENJL0FHUAorKiAgICAgICAgICAgICAgIGNvbnRyb2xsZXJzIHVuZGVyIGFueSBPUywgb24gYW55IHByb2Nlc3NvciBmYW1pbHkgdGhhdAorKiAgICAgICAgICAgICAgIHN1cHBvcnRzIFBDSS4gV2UgYWxzbyBhbGxvdyB0aGUgdXNlciBhcHBsaWNhdGlvbiB0byBjYWxsCisqICAgICAgICAgICAgICAgcmVhbCBtb2RlIEJJT1MgZnVuY3Rpb25zIGFuZCBJbnQgMTBoIGZ1bmN0aW9ucyAoaW5jbHVkaW5nCisqICAgICAgICAgICAgICAgdGhlIFZFU0EgQklPUykuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQklPU0VNVV9ICisjZGVmaW5lIF9fQklPU0VNVV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSAieDg2ZW11LmgiCisjZWxzZQorI2luY2x1ZGUgIng4NmVtdS5oIgorI2luY2x1ZGUgInBtYXBpLmgiCisjaW5jbHVkZSAicGNpbGliLmgiCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI3ByYWdtYSBwYWNrKDEpCisKKyNpZm5kZWYgX19LRVJORUxfXworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBkZXRhaWxzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBWR0EKK2NvbnRyb2xsZXIuIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBhbGxvdyB0aGUgVkdBIGNvbnRyb2xsZXIgdG8gYmUKK3N3YXBwZWQgb24gdGhlIGZseSB3aXRoaW4gdGhlIEJJT1MgZW11bGF0b3IuCisKK0hFQURFUjoKK2Jpb3NlbXUuaAorCitNRU1CRVJTOgorcGNpSW5mbyAgICAgICAgIC0gUENJIGRldmljZSBpbmZvcm1hdGlvbiBibG9jayBmb3IgdGhlIGNvbnRyb2xsZXIKK0JJT1NJbWFnZSAgICAgICAtIFBvaW50ZXIgdG8gYSByZWFkL3dyaXRlIGNvcHkgb2YgdGhlIEJJT1MgaW1hZ2UKK0JJT1NJbWFnZUxlbiAgICAtIExlbmd0aCBvZiB0aGUgQklPUyBpbWFnZQorTG93TWVtICAgICAgICAgIC0gQ29weSBvZiBrZXkgbG93IG1lbW9yeSBhcmVhcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlQQ0lEZXZpY2VJbmZvICpwY2lJbmZvOworCXZvaWQgKkJJT1NJbWFnZTsKKwl1bG9uZyBCSU9TSW1hZ2VMZW47CisJdWNoYXIgTG93TWVtWzE1MzZdOworfSBCRV9WR0FJbmZvOworI2Vsc2UKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgZGV0YWlscyBmb3IgdGhlIEJJT1MgZW11bGF0b3Igc3lzdGVtCitlbnZpcm9ubWVudCBhcyB1c2VkIGJ5IHRoZSBYODYgZW11bGF0b3IgbGlicmFyeS4KKworSEVBREVSOgorYmlvc2VtdS5oCisKK01FTUJFUlM6Cit2Z2FJbmZvICAgICAgICAgLSBWR0EgQklPUyBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKK2Jpb3NtZW1fYmFzZSAgICAtIEJhc2Ugb2YgdGhlIEJJT1MgaW1hZ2UKK2Jpb3NtZW1fbGltaXQgICAtIExpbWl0IG9mIHRoZSBCSU9TIGltYWdlCitidXNtZW1fYmFzZSAgICAgLSBCYXNlIG9mIHRoZSBWR0EgYnVzIG1lbW9yeQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgZnVuY3Rpb247CisJaW50IGRldmljZTsKKwlpbnQgYnVzOworCXUzMiBWZW5kb3JJRDsKKwl1MzIgRGV2aWNlSUQ7CisJcGNpX2Rldl90IHBjaWRldjsKKwl2b2lkICpCSU9TSW1hZ2U7CisJdTMyIEJJT1NJbWFnZUxlbjsKKwl1OCBMb3dNZW1bMTUzNl07Cit9IEJFX1ZHQUluZm87CisKKyNlbmRpZgkJCQkvKiBfX0tFUk5FTF9fICovCisKKyNkZWZpbmUgQ1JUX0MgICAyNAkJLyogMjQgIENSVCBDb250cm9sbGVyIFJlZ2lzdGVycyAgICAgICAgICAgICAqLworI2RlZmluZSBBVFRfQyAgIDIxCQkvKiAyMSAgQXR0cmlidXRlIENvbnRyb2xsZXIgUmVnaXN0ZXJzICAgICAgICovCisjZGVmaW5lIEdSQV9DICAgOQkJLyogOSAgIEdyYXBoaWNzIENvbnRyb2xsZXIgUmVnaXN0ZXJzICAgICAgICAqLworI2RlZmluZSBTRVFfQyAgIDUJCS8qIDUgICBTZXF1ZW5jZXIgUmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUEFMX0MgICA3NjgJCS8qIDc2OCBQYWxldHRlIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitEYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBkZXRhaWxzIGZvciB0aGUgQklPUyBlbXVsYXRvciBzeXN0ZW0KK2Vudmlyb25tZW50IGFzIHVzZWQgYnkgdGhlIFg4NiBlbXVsYXRvciBsaWJyYXJ5LgorCitIRUFERVI6CitiaW9zZW11LmgKKworTUVNQkVSUzoKK3ZnYUluZm8gICAgICAgICAtIFZHQSBCSU9TIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorYmlvc21lbV9iYXNlICAgIC0gQmFzZSBvZiB0aGUgQklPUyBpbWFnZQorYmlvc21lbV9saW1pdCAgIC0gTGltaXQgb2YgdGhlIEJJT1MgaW1hZ2UKK2J1c21lbV9iYXNlICAgICAtIEJhc2Ugb2YgdGhlIFZHQSBidXMgbWVtb3J5Cit0aW1lciAgICAgICAgICAgLSBUaW1lciB1c2VkIHRvIGVtdWxhdGUgUEMgdGltZXIgcG9ydHMKK3RpbWVyMCAgICAgICAgICAtIExhdGNoZWQgdmFsdWUgZm9yIHRpbWVyIDAKK3RpbWVyMExhdGNoZWQgICAtIFRydWUgaWYgdGltZXIgMCB2YWx1ZSB3YXMganVzdCBsYXRjaGVkCit0aW1lcjIgICAgICAgICAgLSBDdXJyZW50IHZhbHVlIGZvciB0aW1lciAyCitlbXVsYXRlVkdBICAgICAgLSBUcnVlIHRvIGVtdWxhdGUgVkdBIEkvTyBhbmQgbWVtb3J5IGFjY2Vzc2VzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisJQkVfVkdBSW5mbyB2Z2FJbmZvOworCXVsb25nIGJpb3NtZW1fYmFzZTsKKwl1bG9uZyBiaW9zbWVtX2xpbWl0OworCXVsb25nIGJ1c21lbV9iYXNlOworCisJdTMyIHRpbWVyMDsKKwlpbnQgdGltZXIwTGF0Y2hlZDsKKwl1MzIgdGltZXIxOworCWludCB0aW1lcjFMYXRjaGVkOworCXUzMiB0aW1lcjI7CisJaW50IHRpbWVyMkxhdGNoZWQ7CisKKwlpbnQgZW11bGF0ZVZHQTsKKwl1OCBlbXU2MTsKKwl1OCBlbXU3MDsKKwlpbnQgZmxpcEZsb3AzQzA7CisJdTMyIGNvbmZpZ0FkZHJlc3M7CisJdTggZW11M0MwOworCXU4IGVtdTNDMVtBVFRfQ107CisJdTggZW11M0MyOworCXU4IGVtdTNDNDsKKwl1OCBlbXUzQzVbU0VRX0NdOworCXU4IGVtdTNDNjsKKwl1aW50IGVtdTNDNzsKKwl1aW50IGVtdTNDODsKKwl1OCBlbXUzQzlbUEFMX0NdOworCXU4IGVtdTNDRTsKKwl1OCBlbXUzQ0ZbR1JBX0NdOworCXU4IGVtdTNENDsKKwl1OCBlbXUzRDVbQ1JUX0NdOworCXU4IGVtdTNEQTsKKworfSBCRV9zeXNFbnY7CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qIERlZmluZSBzb21lIHR5cGVzIHdoZW4gY29tcGlsaW5nIGZvciB0aGUgTGludXgga2VybmVsIHRoYXQgbm9ybWFsbHkKKyAqIGNvbWUgZnJvbSB0aGUgU2NpVGVjaCBQTSBsaWJyYXJ5LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIDMyLWJpdCBleHRlbmRlZCB4ODYgQ1BVIHJlZ2lzdGVycworCitIRUFERVI6CitwbWFwaS5oCisKK01FTUJFUlM6CitlYXggICAgIC0gVmFsdWUgb2YgdGhlIEVBWCByZWdpc3RlcgorZWJ4ICAgICAtIFZhbHVlIG9mIHRoZSBFQlggcmVnaXN0ZXIKK2VjeCAgICAgLSBWYWx1ZSBvZiB0aGUgRUNYIHJlZ2lzdGVyCitlZHggICAgIC0gVmFsdWUgb2YgdGhlIEVEWCByZWdpc3RlcgorZXNpICAgICAtIFZhbHVlIG9mIHRoZSBFU0kgcmVnaXN0ZXIKK2VkaSAgICAgLSBWYWx1ZSBvZiB0aGUgRURJIHJlZ2lzdGVyCitjZmxhZyAgIC0gVmFsdWUgb2YgdGhlIGNhcnJ5IGZsYWcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIGVheDsKKwl1MzIgZWJ4OworCXUzMiBlY3g7CisJdTMyIGVkeDsKKwl1MzIgZXNpOworCXUzMiBlZGk7CisJdTMyIGNmbGFnOworfSBSTURXT1JEUkVHUzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgMTYtYml0IHg4NiBDUFUgcmVnaXN0ZXJzCisKK0hFQURFUjoKK3BtYXBpLmgKKworTUVNQkVSUzoKK2F4ICAgICAgLSBWYWx1ZSBvZiB0aGUgQVggcmVnaXN0ZXIKK2J4ICAgICAgLSBWYWx1ZSBvZiB0aGUgQlggcmVnaXN0ZXIKK2N4ICAgICAgLSBWYWx1ZSBvZiB0aGUgQ1ggcmVnaXN0ZXIKK2R4ICAgICAgLSBWYWx1ZSBvZiB0aGUgRFggcmVnaXN0ZXIKK3NpICAgICAgLSBWYWx1ZSBvZiB0aGUgU0kgcmVnaXN0ZXIKK2RpICAgICAgLSBWYWx1ZSBvZiB0aGUgREkgcmVnaXN0ZXIKK2NmbGFnICAgLSBWYWx1ZSBvZiB0aGUgY2FycnkgZmxhZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX0JJR19FTkRJQU5fXwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBheF9oaSwgYXg7CisJdTE2IGJ4X2hpLCBieDsKKwl1MTYgY3hfaGksIGN4OworCXUxNiBkeF9oaSwgZHg7CisJdTE2IHNpX2hpLCBzaTsKKwl1MTYgZGlfaGksIGRpOworCXUxNiBjZmxhZ19oaSwgY2ZsYWc7Cit9IFJNV09SRFJFR1M7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBheCwgYXhfaGk7CisJdTE2IGJ4LCBieF9oaTsKKwl1MTYgY3gsIGN4X2hpOworCXUxNiBkeCwgZHhfaGk7CisJdTE2IHNpLCBzaV9oaTsKKwl1MTYgZGksIGRpX2hpOworCXUxNiBjZmxhZywgY2ZsYWdfaGk7Cit9IFJNV09SRFJFR1M7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgOC1iaXQgeDg2IENQVSByZWdpc3RlcnMKKworSEVBREVSOgorcG1hcGkuaAorCitNRU1CRVJTOgorYWwgICAgICAtIFZhbHVlIG9mIHRoZSBBTCByZWdpc3RlcgorYWggICAgICAtIFZhbHVlIG9mIHRoZSBBSCByZWdpc3RlcgorYmwgICAgICAtIFZhbHVlIG9mIHRoZSBCTCByZWdpc3RlcgorYmggICAgICAtIFZhbHVlIG9mIHRoZSBCSCByZWdpc3RlcgorY2wgICAgICAtIFZhbHVlIG9mIHRoZSBDTCByZWdpc3RlcgorY2ggICAgICAtIFZhbHVlIG9mIHRoZSBDSCByZWdpc3RlcgorZGwgICAgICAtIFZhbHVlIG9mIHRoZSBETCByZWdpc3RlcgorZGggICAgICAtIFZhbHVlIG9mIHRoZSBESCByZWdpc3RlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX0JJR19FTkRJQU5fXwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBheF9oaTsKKwl1OCBhaCwgYWw7CisJdTE2IGJ4X2hpOworCXU4IGJoLCBibDsKKwl1MTYgY3hfaGk7CisJdTggY2gsIGNsOworCXUxNiBkeF9oaTsKKwl1OCBkaCwgZGw7Cit9IFJNQllURVJFR1M7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgeworCXU4IGFsOworCXU4IGFoOworCXUxNiBheF9oaTsKKwl1OCBibDsKKwl1OCBiaDsKKwl1MTYgYnhfaGk7CisJdTggY2w7CisJdTggY2g7CisJdTE2IGN4X2hpOworCXU4IGRsOworCXU4IGRoOworCXUxNiBkeF9oaTsKK30gUk1CWVRFUkVHUzsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N0cnVjdHVyZSBkZXNjcmliaW5nIGFsbCB0aGUgeDg2IENQVSByZWdpc3RlcnMKKworSEVBREVSOgorcG1hcGkuaAorCitNRU1CRVJTOgorZSAgIC0gTWVtYmVyIHRvIGFjY2VzcyByZWdpc3RlcnMgYXMgMzItYml0IHZhbHVlcworeCAgIC0gTWVtYmVyIHRvIGFjY2VzcyByZWdpc3RlcnMgYXMgMTYtYml0IHZhbHVlcworaCAgIC0gTWVtYmVyIHRvIGFjY2VzcyByZWdpc3RlcnMgYXMgOC1iaXQgdmFsdWVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiB1bmlvbiB7CisJUk1EV09SRFJFR1MgZTsKKwlSTVdPUkRSRUdTIHg7CisJUk1CWVRFUkVHUyBoOworfSBSTVJFR1M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU3RydWN0dXJlIGRlc2NyaWJpbmcgYWxsIHRoZSB4ODYgc2VnbWVudCByZWdpc3RlcnMKKworSEVBREVSOgorcG1hcGkuaAorCitNRU1CRVJTOgorZXMgIC0gRVMgc2VnbWVudCByZWdpc3RlcgorY3MgIC0gQ1Mgc2VnbWVudCByZWdpc3Rlcgorc3MgIC0gU1Mgc2VnbWVudCByZWdpc3RlcgorZHMgIC0gRFMgc2VnbWVudCByZWdpc3RlcgorZnMgIC0gRlMgc2VnbWVudCByZWdpc3RlcgorZ3MgIC0gR1Mgc2VnbWVudCByZWdpc3RlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgZXM7CisJdTE2IGNzOworCXUxNiBzczsKKwl1MTYgZHM7CisJdTE2IGZzOworCXUxNiBnczsKK30gUk1TUkVHUzsKKworI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU3RydWN0dXJlIGRlZmluaW5nIGFsbCB0aGUgQklPUyBFbXVsYXRvciBBUEkgZnVuY3Rpb25zIGFzIGV4cG9ydGVkIGZyb20KK3RoZSBCaW5hcnkgUG9ydGFibGUgRExMLgore3NlY3JldH0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisJdWxvbmcgZHdTaXplOworCSBpYm9vbChQTUFQSVAgQkVfaW5pdCkgKHUzMiBkZWJ1Z0ZsYWdzLCBpbnQgbWVtU2l6ZSwgQkVfVkdBSW5mbyAqIGluZm8pOworCXZvaWQgKFBNQVBJUCBCRV9zZXRWR0EpIChCRV9WR0FJbmZvICogaW5mbyk7CisJdm9pZCAoUE1BUElQIEJFX2dldFZHQSkgKEJFX1ZHQUluZm8gKiBpbmZvKTsKKwl2b2lkICooUE1BUElQIEJFX21hcFJlYWxQb2ludGVyKSAodWludCByX3NlZywgdWludCByX29mZik7CisJdm9pZCAqKFBNQVBJUCBCRV9nZXRWRVNBQnVmKSAodWludCAqIGxlbiwgdWludCAqIHJzZWcsIHVpbnQgKiByb2ZmKTsKKwl2b2lkIChQTUFQSVAgQkVfY2FsbFJlYWxNb2RlKSAodWludCBzZWcsIHVpbnQgb2ZmLCBSTVJFR1MgKiByZWdzLAorCQkJCSAgICAgICBSTVNSRUdTICogc3JlZ3MpOworCWludCAoUE1BUElQIEJFX2ludDg2KSAoaW50IGludG5vLCBSTVJFR1MgKiBpbiwgUk1SRUdTICogb3V0KTsKKwlpbnQgKFBNQVBJUCBCRV9pbnQ4NngpIChpbnQgaW50bm8sIFJNUkVHUyAqIGluLCBSTVJFR1MgKiBvdXQsCisJCQkJUk1TUkVHUyAqIHNyZWdzKTsKKwl2b2lkICpyZXNlcnZlZDE7CisJdm9pZCAoUE1BUElQIEJFX2V4aXQpICh2b2lkKTsKK30gQkVfZXhwb3J0czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiBwb2ludGVyIHR5cGUgZm9yIHRoZSBCaW5hcnkgUG9ydGFibGUgRExMIGluaXRpYWxpc2F0aW9uIGVudHJ5IHBvaW50Lgore3NlY3JldH0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIEJFX2V4cG9ydHMgKihQTUFQSVAgQkVfaW5pdExpYnJhcnlfdCkgKFBNX2ltcG9ydHMgKiBQTUltcCk7CisjZW5kaWYKKworI3ByYWdtYSBwYWNrKCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CQkJLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KKyNlbmRpZgorCisvKiB7c2VjcmV0fSBHbG9iYWwgQklPUyBlbXVsYXRvciBzeXN0ZW0gZW52aXJvbm1lbnQgKi8KKwlleHRlcm4gQkVfc3lzRW52IF9CRV9lbnY7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEJJT1MgZW11bGF0b3IgbGlicmFyeSBlbnRyeSBwb2ludHMgKi8KKwlpbnQgWDg2QVBJIEJFX2luaXQodTMyIGRlYnVnRmxhZ3MsIGludCBtZW1TaXplLCBCRV9WR0FJbmZvICogaW5mbywKKwkJCSAgIGludCBzaGFyZWQpOworCXZvaWQgWDg2QVBJIEJFX3NldFZHQShCRV9WR0FJbmZvICogaW5mbyk7CisJdm9pZCBYODZBUEkgQkVfZ2V0VkdBKEJFX1ZHQUluZm8gKiBpbmZvKTsKKwl2b2lkIFg4NkFQSSBCRV9zZXREZWJ1Z0ZsYWdzKHUzMiBkZWJ1Z0ZsYWdzKTsKKwl2b2lkICpYODZBUEkgQkVfbWFwUmVhbFBvaW50ZXIodWludCByX3NlZywgdWludCByX29mZik7CisJdm9pZCAqWDg2QVBJIEJFX2dldFZFU0FCdWYodWludCAqIGxlbiwgdWludCAqIHJzZWcsIHVpbnQgKiByb2ZmKTsKKwl2b2lkIFg4NkFQSSBCRV9jYWxsUmVhbE1vZGUodWludCBzZWcsIHVpbnQgb2ZmLCBSTVJFR1MgKiByZWdzLAorCQkJCSAgICBSTVNSRUdTICogc3JlZ3MpOworCWludCBYODZBUEkgQkVfaW50ODYoaW50IGludG5vLCBSTVJFR1MgKiBpbiwgUk1SRUdTICogb3V0KTsKKwlpbnQgWDg2QVBJIEJFX2ludDg2eChpbnQgaW50bm8sIFJNUkVHUyAqIGluLCBSTVJFR1MgKiBvdXQsCisJCQkgICAgIFJNU1JFR1MgKiBzcmVncyk7CisJdm9pZCBYODZBUEkgQkVfZXhpdCh2b2lkKTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQkJCQkvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICAgICAqLworI2VuZGlmCisjZW5kaWYJCQkJLyogX19CSU9TRU1VX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS5oIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwNGJlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS5oCkBAIC0wLDAgKzEsMTkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgcHVibGljIHNwZWNpZmljIGZ1bmN0aW9ucy4KKyogICAgICAgICAgICAgICBBbnkgYXBwbGljYXRpb24gbGlua2luZyBhZ2FpbnN0IHVzIHNob3VsZCBvbmx5CisqICAgICAgICAgICAgICAgaW5jbHVkZSB0aGlzIGhlYWRlcgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1g4NkVNVV9YODZFTVVfSAorI2RlZmluZSBfX1g4NkVNVV9YODZFTVVfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjZGVmaW5lIFg4NkFQSQorI2RlZmluZSBYODZBUElQICoKK3R5cGVkZWYgdTE2IFg4NkVNVV9waW9BZGRyOworCisjaW5jbHVkZSAieDg2ZW11L3JlZ3MuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI3ByYWdtYSBwYWNrKDEpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBwb250ZXJzIHRvIHByb2dyYW1tZWQgSS9PIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZQorZW11bGF0b3IuIFRoaXMgaXMgdXNlZCBzbyB0aGF0IHRoZSB1c2VyIHByb2dyYW0gY2FuIGhvb2sgYWxsIHByb2dyYW1tZWQKK0kvTyBmb3IgdGhlIGVtdWxhdG9yIHRvIGhhbmRsZWQgYXMgbmVjZXNzYXJ5IGJ5IHRoZSB1c2VyIHByb2dyYW0uIEJ5CitkZWZhdWx0IHRoZSBlbXVsYXRvciBjb250YWlucyBzaW1wbGUgZnVuY3Rpb25zIHRoYXQgZG8gbm90IGRvIGFjY2VzcyB0aGUKK2hhcmR3YXJlIGluIGFueSB3YXkuIFRvIGFsbG93IHRoZSBlbXVhbHRvciBhY2Nlc3MgdGhlIGhhcmR3YXJlLCB5b3Ugd2lsbAorbmVlZCB0byBvdmVycmlkZSB0aGUgcHJvZ3JhbW1lZCBJL08gZnVuY3Rpb25zIHVzaW5nIHRoZSBYODZFTVVfc2V0dXBQaW9GdW5jcworZnVuY3Rpb24uCisKK0hFQURFUjoKK3g4NmVtdS5oCisKK01FTUJFUlM6CitpbmIgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIGJ5dGUgZnJvbSBhbiBJL08gcG9ydAoraW53ICAgICAtIEZ1bmN0aW9uIHRvIHJlYWQgYSB3b3JkIGZyb20gYW4gSS9PIHBvcnQKK2lubCAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgZHdvcmQgZnJvbSBhbiBJL08gcG9ydAorb3V0YiAgICAtIEZ1bmN0aW9uIHRvIHdyaXRlIGEgYnl0ZSB0byBhbiBJL08gcG9ydAorb3V0dyAgICAtIEZ1bmN0aW9uIHRvIHdyaXRlIGEgd29yZCB0byBhbiBJL08gcG9ydAorb3V0bCAgICAtIEZ1bmN0aW9uIHRvIHdyaXRlIGEgZHdvcmQgdG8gYW4gSS9PIHBvcnQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisJdTgoWDg2QVBJUCBpbmIpIChYODZFTVVfcGlvQWRkciBhZGRyKTsKKwl1MTYoWDg2QVBJUCBpbncpIChYODZFTVVfcGlvQWRkciBhZGRyKTsKKwl1MzIoWDg2QVBJUCBpbmwpIChYODZFTVVfcGlvQWRkciBhZGRyKTsKKwl2b2lkIChYODZBUElQIG91dGIpIChYODZFTVVfcGlvQWRkciBhZGRyLCB1OCB2YWwpOworCXZvaWQgKFg4NkFQSVAgb3V0dykgKFg4NkVNVV9waW9BZGRyIGFkZHIsIHUxNiB2YWwpOworCXZvaWQgKFg4NkFQSVAgb3V0bCkgKFg4NkVNVV9waW9BZGRyIGFkZHIsIHUzMiB2YWwpOworfSBYODZFTVVfcGlvRnVuY3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBwb250ZXJzIHRvIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zIHVzZWQgYnkgdGhlCitlbXVsYXRvci4gVGhpcyBpcyB1c2VkIHNvIHRoYXQgdGhlIHVzZXIgcHJvZ3JhbSBjYW4gaG9vayBhbGwgbWVtb3J5CithY2Nlc3MgZnVuY3Rpb25zIGFzIG5lY2Vzc2FyeSBmb3IgdGhlIGVtdWxhdG9yLiBCeSBkZWZhdWx0IHRoZSBlbXVsYXRvcgorY29udGFpbnMgc2ltcGxlIGZ1bmN0aW9ucyB0aGF0IG9ubHkgYWNjZXNzIHRoZSBpbnRlcm5hbCBtZW1vcnkgb2YgdGhlCitlbXVsYXRvci4gSWYgeW91IG5lZWQgc3BlY2lhbGlzZWQgZnVuY3Rpb25zIHRvIGhhbmRsZSBhY2Nlc3MgdG8gZGlmZmVyZW50Cit0eXBlcyBvZiBtZW1vcnkgKGllOiBoYXJkd2FyZSBmcmFtZWJ1ZmZlciBhY2Nlc3NlcyBhbmQgQklPUyBtZW1vcnkgYWNjZXNzCitldGMpLCB5b3Ugd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgdXNpbmcgdGhlIFg4NkVNVV9zZXR1cE1lbUZ1bmNzCitmdW5jdGlvbi4KKworSEVBREVSOgoreDg2ZW11LmgKKworTUVNQkVSUzoKK3JkYiAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgYnl0ZSBmcm9tIGFuIGFkZHJlc3MKK3JkdyAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgd29yZCBmcm9tIGFuIGFkZHJlc3MKK3JkbCAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgZHdvcmQgZnJvbSBhbiBhZGRyZXNzCit3cmIgICAgIC0gRnVuY3Rpb24gdG8gd3JpdGUgYSBieXRlIHRvIGFuIGFkZHJlc3MKK3dydyAgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIHdvcmQgdG8gYW4gYWRkcmVzcword3JsICAgICAtIEZ1bmN0aW9uIHRvIHdyaXRlIGEgZHdvcmQgdG8gYW4gYWRkcmVzcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1OChYODZBUElQIHJkYikgKHUzMiBhZGRyKTsKKwl1MTYoWDg2QVBJUCByZHcpICh1MzIgYWRkcik7CisJdTMyKFg4NkFQSVAgcmRsKSAodTMyIGFkZHIpOworCXZvaWQgKFg4NkFQSVAgd3JiKSAodTMyIGFkZHIsIHU4IHZhbCk7CisJdm9pZCAoWDg2QVBJUCB3cncpICh1MzIgYWRkciwgdTE2IHZhbCk7CisJdm9pZCAoWDg2QVBJUCB3cmwpICh1MzIgYWRkciwgdTMyIHZhbCk7Cit9IFg4NkVNVV9tZW1GdW5jczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgSGVyZSBhcmUgdGhlIGRlZmF1bHQgbWVtb3J5IHJlYWQgYW5kIHdyaXRlCisgIGZ1bmN0aW9uIGluIGNhc2UgdGhleSBhcmUgbmVlZGVkIGFzIGZhbGxiYWNrcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiB1OCBYODZBUEkgcmRiKHUzMiBhZGRyKTsKK2V4dGVybiB1MTYgWDg2QVBJIHJkdyh1MzIgYWRkcik7CitleHRlcm4gdTMyIFg4NkFQSSByZGwodTMyIGFkZHIpOworZXh0ZXJuIHZvaWQgWDg2QVBJIHdyYih1MzIgYWRkciwgdTggdmFsKTsKK2V4dGVybiB2b2lkIFg4NkFQSSB3cncodTMyIGFkZHIsIHUxNiB2YWwpOworZXh0ZXJuIHZvaWQgWDg2QVBJIHdybCh1MzIgYWRkciwgdTMyIHZhbCk7CisKKyNwcmFnbWEgcGFjaygpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHZvaWQgKFg4NkFQSVAgWDg2RU1VX2ludHJGdW5jcykgKGludCBudW0pOworZXh0ZXJuIFg4NkVNVV9pbnRyRnVuY3MgX1g4NkVNVV9pbnRyVGFiWzI1Nl07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgewkJCS8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCisjZW5kaWYKKworCXZvaWQgWDg2RU1VX3NldHVwTWVtRnVuY3MoWDg2RU1VX21lbUZ1bmNzICogZnVuY3MpOworCXZvaWQgWDg2RU1VX3NldHVwUGlvRnVuY3MoWDg2RU1VX3Bpb0Z1bmNzICogZnVuY3MpOworCXZvaWQgWDg2RU1VX3NldHVwSW50ckZ1bmNzKFg4NkVNVV9pbnRyRnVuY3MgZnVuY3NbXSk7CisJdm9pZCBYODZFTVVfcHJlcGFyZUZvckludChpbnQgbnVtKTsKKworLyogZGVjb2RlLmMgKi8KKworCXZvaWQgWDg2RU1VX2V4ZWModm9pZCk7CisJdm9pZCBYODZFTVVfaGFsdF9zeXModm9pZCk7CisKKyNpZmRlZiAgREVCVUcKKyNkZWZpbmUgSEFMVF9TWVMoKSAgXAorICAgIHByaW50ZigiaGFsdF9zeXM6IGZpbGUgJXMsIGxpbmUgJWRcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyksIFwKKyAgICBYODZFTVVfaGFsdF9zeXMoKQorI2Vsc2UKKyNkZWZpbmUgSEFMVF9TWVMoKSAgWDg2RU1VX2hhbHRfc3lzKCkKKyNlbmRpZgorCisvKiBEZWJ1ZyBvcHRpb25zICovCisKKyNkZWZpbmUgREVCVUdfREVDT0RFX0YgICAgICAgICAgMHgwMDAxCS8qIHByaW50IGRlY29kZWQgaW5zdHJ1Y3Rpb24gICovCisjZGVmaW5lIERFQlVHX1RSQUNFX0YgICAgICAgICAgIDB4MDAwMgkvKiBkdW1wIHJlZ3MgYmVmb3JlL2FmdGVyIGV4ZWN1dGlvbiAqLworI2RlZmluZSBERUJVR19TVEVQX0YgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgREVCVUdfRElTQVNTRU1CTEVfRiAgICAgMHgwMDA4CisjZGVmaW5lIERFQlVHX0JSRUFLX0YgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBERUJVR19TVkNfRiAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgREVCVUdfU0FWRV9DU19JUCAgICAgICAgMHgwMDQwCisjZGVmaW5lIERFQlVHX0ZTX0YgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBERUJVR19QUk9DX0YgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgREVCVUdfU1lTSU5UX0YgICAgICAgICAgMHgwMjAwCS8qIGJpb3Mgc3lzdGVtIGludGVycnVwdHMuICovCisjZGVmaW5lIERFQlVHX1RSQUNFQ0FMTF9GICAgICAgIDB4MDQwMAorI2RlZmluZSBERUJVR19JTlNUUlVNRU5UX0YgICAgICAweDA4MDAKKyNkZWZpbmUgREVCVUdfTUVNX1RSQUNFX0YgICAgICAgMHgxMDAwCisjZGVmaW5lIERFQlVHX0lPX1RSQUNFX0YgICAgICAgIDB4MjAwMAorI2RlZmluZSBERUJVR19UUkFDRUNBTExfUkVHU19GICAweDQwMDAKKyNkZWZpbmUgREVCVUdfREVDT0RFX05PUFJJTlRfRiAgMHg4MDAwCisjZGVmaW5lIERFQlVHX0VYSVQgICAgICAgICAgICAgIDB4MTAwMDAKKyNkZWZpbmUgREVCVUdfU1lTX0YgICAgICAgICAgICAgKERFQlVHX1NWQ19GfERFQlVHX0ZTX0Z8REVCVUdfUFJPQ19GKQorCisJdm9pZCBYODZFTVVfdHJhY2VfcmVncyh2b2lkKTsKKwl2b2lkIFg4NkVNVV90cmFjZV94cmVncyh2b2lkKTsKKwl2b2lkIFg4NkVNVV9kdW1wX21lbW9yeSh1MTYgc2VnLCB1MTYgb2ZmLCB1MzIgYW10KTsKKwlpbnQgWDg2RU1VX3RyYWNlX29uKHZvaWQpOworCWludCBYODZFTVVfdHJhY2Vfb2ZmKHZvaWQpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CQkJCS8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgICAgICovCisjZW5kaWYKKyNlbmRpZgkJCQkvKiBfX1g4NkVNVV9YODZFTVVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L2RlYnVnLmggYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjhjOWQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L2RlYnVnLmgKQEAgLTAsMCArMSwyMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyoJCUNvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKgkJICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCVRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZToJQU5TSSBDCisqIEVudmlyb25tZW50OglBbnkKKyogRGV2ZWxvcGVyOglLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246CUhlYWRlciBmaWxlIGZvciBkZWJ1ZyBkZWZpbml0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19YODZFTVVfREVCVUdfSAorI2RlZmluZSBfX1g4NkVNVV9ERUJVR19ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGNoZWNrcyB0byBiZSBlbmFibGVkIGZvciAicnVudGltZSIgKi8KKworI2RlZmluZSBDSEVDS19JUF9GRVRDSF9GCQkweDEKKyNkZWZpbmUgQ0hFQ0tfU1BfQUNDRVNTX0YJCTB4MgorI2RlZmluZSBDSEVDS19NRU1fQUNDRVNTX0YJCTB4NAkvKnVzaW5nIHJlZ3VsYXIgbGluZWFyIHBvaW50ZXIgKi8KKyNkZWZpbmUgQ0hFQ0tfREFUQV9BQ0NFU1NfRgkJMHg4CS8qdXNpbmcgc2VnbWVudDpvZmZzZXQgKi8KKworI2lmZGVmIERFQlVHCisjIGRlZmluZSBDSEVDS19JUF9GRVRDSCgpCQkoTS54ODYuY2hlY2sgJiBDSEVDS19JUF9GRVRDSF9GKQorIyBkZWZpbmUgQ0hFQ0tfU1BfQUNDRVNTKCkJCShNLng4Ni5jaGVjayAmIENIRUNLX1NQX0FDQ0VTU19GKQorIyBkZWZpbmUgQ0hFQ0tfTUVNX0FDQ0VTUygpCQkoTS54ODYuY2hlY2sgJiBDSEVDS19NRU1fQUNDRVNTX0YpCisjIGRlZmluZSBDSEVDS19EQVRBX0FDQ0VTUygpCQkoTS54ODYuY2hlY2sgJiBDSEVDS19EQVRBX0FDQ0VTU19GKQorI2Vsc2UKKyMgZGVmaW5lIENIRUNLX0lQX0ZFVENIKCkKKyMgZGVmaW5lIENIRUNLX1NQX0FDQ0VTUygpCisjIGRlZmluZSBDSEVDS19NRU1fQUNDRVNTKCkKKyMgZGVmaW5lIENIRUNLX0RBVEFfQUNDRVNTKCkKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyMgZGVmaW5lIERFQlVHX0lOU1RSVU1FTlQoKQkoTS54ODYuZGVidWcgJiBERUJVR19JTlNUUlVNRU5UX0YpCisjIGRlZmluZSBERUJVR19ERUNPREUoKQkJKE0ueDg2LmRlYnVnICYgREVCVUdfREVDT0RFX0YpCisjIGRlZmluZSBERUJVR19UUkFDRSgpCQkoTS54ODYuZGVidWcgJiBERUJVR19UUkFDRV9GKQorIyBkZWZpbmUgREVCVUdfU1RFUCgpCQkoTS54ODYuZGVidWcgJiBERUJVR19TVEVQX0YpCisjIGRlZmluZSBERUJVR19ESVNBU1NFTUJMRSgpCShNLng4Ni5kZWJ1ZyAmIERFQlVHX0RJU0FTU0VNQkxFX0YpCisjIGRlZmluZSBERUJVR19CUkVBSygpCQkoTS54ODYuZGVidWcgJiBERUJVR19CUkVBS19GKQorIyBkZWZpbmUgREVCVUdfU1ZDKCkJCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1NWQ19GKQorIyBkZWZpbmUgREVCVUdfU0FWRV9JUF9DUygpCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1NBVkVfQ1NfSVApCisKKyMgZGVmaW5lIERFQlVHX0ZTKCkJCShNLng4Ni5kZWJ1ZyAmIERFQlVHX0ZTX0YpCisjIGRlZmluZSBERUJVR19QUk9DKCkJCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1BST0NfRikKKyMgZGVmaW5lIERFQlVHX1NZU0lOVCgpCQkoTS54ODYuZGVidWcgJiBERUJVR19TWVNJTlRfRikKKyMgZGVmaW5lIERFQlVHX1RSQUNFQ0FMTCgpCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1RSQUNFQ0FMTF9GKQorIyBkZWZpbmUgREVCVUdfVFJBQ0VDQUxMUkVHUygpCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1RSQUNFQ0FMTF9SRUdTX0YpCisjIGRlZmluZSBERUJVR19TWVMoKQkJKE0ueDg2LmRlYnVnICYgREVCVUdfU1lTX0YpCisjIGRlZmluZSBERUJVR19NRU1fVFJBQ0UoKQkoTS54ODYuZGVidWcgJiBERUJVR19NRU1fVFJBQ0VfRikKKyMgZGVmaW5lIERFQlVHX0lPX1RSQUNFKCkJKE0ueDg2LmRlYnVnICYgREVCVUdfSU9fVFJBQ0VfRikKKyMgZGVmaW5lIERFQlVHX0RFQ09ERV9OT1BSSU5UKCkgKE0ueDg2LmRlYnVnICYgREVCVUdfREVDT0RFX05PUFJJTlRfRikKKyNlbHNlCisjIGRlZmluZSBERUJVR19JTlNUUlVNRU5UKCkJMAorIyBkZWZpbmUgREVCVUdfREVDT0RFKCkJCTAKKyMgZGVmaW5lIERFQlVHX1RSQUNFKCkJCTAKKyMgZGVmaW5lIERFQlVHX1NURVAoKQkJMAorIyBkZWZpbmUgREVCVUdfRElTQVNTRU1CTEUoKQkwCisjIGRlZmluZSBERUJVR19CUkVBSygpCQkwCisjIGRlZmluZSBERUJVR19TVkMoKQkJMAorIyBkZWZpbmUgREVCVUdfU0FWRV9JUF9DUygpCTAKKyMgZGVmaW5lIERFQlVHX0ZTKCkJCTAKKyMgZGVmaW5lIERFQlVHX1BST0MoKQkJMAorIyBkZWZpbmUgREVCVUdfU1lTSU5UKCkJCTAKKyMgZGVmaW5lIERFQlVHX1RSQUNFQ0FMTCgpCTAKKyMgZGVmaW5lIERFQlVHX1RSQUNFQ0FMTFJFR1MoKQkwCisjIGRlZmluZSBERUJVR19TWVMoKQkJMAorIyBkZWZpbmUgREVCVUdfTUVNX1RSQUNFKCkJMAorIyBkZWZpbmUgREVCVUdfSU9fVFJBQ0UoKQkwCisjIGRlZmluZSBERUJVR19ERUNPREVfTk9QUklOVCgpIDAKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKworIyBkZWZpbmUgREVDT0RFX1BSSU5URih4KQlpZiAoREVCVUdfREVDT0RFKCkpIFwKKwkJCQkgICAgeDg2ZW11X2RlY29kZV9wcmludGYoeCkKKyMgZGVmaW5lIERFQ09ERV9QUklOVEYyKHgseSkJaWYgKERFQlVHX0RFQ09ERSgpKSBcCisJCQkJICAgIHg4NmVtdV9kZWNvZGVfcHJpbnRmMih4LHkpCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGFsbG93IHVzIHRvIGxvb2sgYXQgdGhlIGJ5dGVzIG9mIGFuIGluc3RydWN0aW9uLiAgVGhlCisgKiBmaXJzdCBJTkNSX0lOU1RSTl9MRU4sIGlzIGNhbGxlZCBldmVyeXRpbWUgYnl0ZXMgYXJlIGNvbnN1bWVkIGluCisgKiB0aGUgZGVjb2RpbmcgcHJvY2Vzcy4gIFRoZSBTQVZFX0lQX0NTIGlzIGNhbGxlZCBpbml0aWFsbHkgd2hlbiB0aGUKKyAqIG1ham9yIG9wY29kZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYWNjZXNzZWQuCisgKi8KKyNkZWZpbmUgSU5DX0RFQ09ERURfSU5TVF9MRU4oeCkJCQkgICAgXAorICAgIGlmIChERUJVR19ERUNPREUoKSkJCQkJICAgIFwKKwl4ODZlbXVfaW5jX2RlY29kZWRfaW5zdF9sZW4oeCkKKworI2RlZmluZSBTQVZFX0lQX0NTKHgseSkJCQkJCQlcCisgICAgaWYgKERFQlVHX0RFQ09ERSgpIHwgREVCVUdfVFJBQ0VDQUxMKCkgfCBERUJVR19CUkVBSygpIFwKKwkgICAgICB8IERFQlVHX0lPX1RSQUNFKCkgfCBERUJVR19TQVZFX0lQX0NTKCkpIHsgXAorCU0ueDg2LnNhdmVkX2NzID0geDsJCQkJCVwKKwlNLng4Ni5zYXZlZF9pcCA9IHk7CQkJCQlcCisgICAgfQorI2Vsc2UKKyMgZGVmaW5lIElOQ19ERUNPREVEX0lOU1RfTEVOKHgpCisjIGRlZmluZSBERUNPREVfUFJJTlRGKHgpCisjIGRlZmluZSBERUNPREVfUFJJTlRGMih4LHkpCisjIGRlZmluZSBTQVZFX0lQX0NTKHgseSkKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgVFJBQ0VfUkVHUygpCQkJCQkgICAgXAorICAgIGlmIChERUJVR19ESVNBU1NFTUJMRSgpKSB7CQkJCSAgICBcCisJeDg2ZW11X2p1c3RfZGlzYXNzZW1ibGUoKTsJCQkgICAgXAorCWdvdG8gRW5kT2ZUaGVJbnN0cnVjdGlvblByb2NlZHVyZTsJCSAgICBcCisgICAgfQkJCQkJCQkgICAgXAorICAgIGlmIChERUJVR19UUkFDRSgpIHx8IERFQlVHX0RFQ09ERSgpKSBYODZFTVVfdHJhY2VfcmVncygpCisjZWxzZQorIyBkZWZpbmUgVFJBQ0VfUkVHUygpCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjIGRlZmluZSBTSU5HTEVfU1RFUCgpCSAgICBpZiAoREVCVUdfU1RFUCgpKSB4ODZlbXVfc2luZ2xlX3N0ZXAoKQorI2Vsc2UKKyMgZGVmaW5lIFNJTkdMRV9TVEVQKCkKKyNlbmRpZgorCisjZGVmaW5lIFRSQUNFX0FORF9TVEVQKCkgICAgXAorICAgIFRSQUNFX1JFR1MoKTsJICAgIFwKKyAgICBTSU5HTEVfU1RFUCgpCisKKyNpZmRlZiBERUJVRworIyBkZWZpbmUgU1RBUlRfT0ZfSU5TVFIoKQorIyBkZWZpbmUgRU5EX09GX0lOU1RSKCkJICAgIEVuZE9mVGhlSW5zdHJ1Y3Rpb25Qcm9jZWR1cmU6IHg4NmVtdV9lbmRfaW5zdHIoKTsKKyMgZGVmaW5lIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpICAgIHg4NmVtdV9lbmRfaW5zdHIoKTsKKyNlbHNlCisjIGRlZmluZSBTVEFSVF9PRl9JTlNUUigpCisjIGRlZmluZSBFTkRfT0ZfSU5TVFIoKQorIyBkZWZpbmUgRU5EX09GX0lOU1RSX05PX1RSQUNFKCkKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyMgZGVmaW5lICBDQUxMX1RSQUNFKHUsdix3LHgscykJCQkJCVwKKyAgICBpZiAoREVCVUdfVFJBQ0VDQUxMUkVHUygpKQkJCQkJXAorCXg4NmVtdV9kdW1wX3JlZ3MoKTsJCQkJCVwKKyAgICBpZiAoREVCVUdfVFJBQ0VDQUxMKCkpCQkJCQlcCisJcHJpbnRrKCIlMDR4OiUwNHg6IENBTEwgJXMlMDR4OiUwNHhcbiIsIHUgLCB2LCBzLCB3LCB4KTsKKyMgZGVmaW5lIFJFVFVSTl9UUkFDRShuLHUsdikJCQkJCVwKKyAgICBpZiAoREVCVUdfVFJBQ0VDQUxMUkVHUygpKQkJCQkJXAorCXg4NmVtdV9kdW1wX3JlZ3MoKTsJCQkJCVwKKyAgICBpZiAoREVCVUdfVFJBQ0VDQUxMKCkpCQkJCQlcCisJcHJpbnRrKCIlMDR4OiUwNHg6ICVzXG4iLHUsdixuKTsKKyNlbHNlCisjIGRlZmluZSBDQUxMX1RSQUNFKHUsdix3LHgscykKKyMgZGVmaW5lIFJFVFVSTl9UUkFDRShuLHUsdikKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREIoeCkJeAorI2Vsc2UKKyNkZWZpbmUgREIoeCkKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgewkJCS8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCisjZW5kaWYKKworCWV4dGVybiB2b2lkIHg4NmVtdV9pbmNfZGVjb2RlZF9pbnN0X2xlbihpbnQgeCk7CisJZXh0ZXJuIHZvaWQgeDg2ZW11X2RlY29kZV9wcmludGYoY2hhciAqeCk7CisJZXh0ZXJuIHZvaWQgeDg2ZW11X2RlY29kZV9wcmludGYyKGNoYXIgKngsIGludCB5KTsKKwlleHRlcm4gdm9pZCB4ODZlbXVfanVzdF9kaXNhc3NlbWJsZSh2b2lkKTsKKwlleHRlcm4gdm9pZCB4ODZlbXVfc2luZ2xlX3N0ZXAodm9pZCk7CisJZXh0ZXJuIHZvaWQgeDg2ZW11X2VuZF9pbnN0cih2b2lkKTsKKwlleHRlcm4gdm9pZCB4ODZlbXVfZHVtcF9yZWdzKHZvaWQpOworCWV4dGVybiB2b2lkIHg4NmVtdV9kdW1wX3hyZWdzKHZvaWQpOworCWV4dGVybiB2b2lkIHg4NmVtdV9wcmludF9pbnRfdmVjdCh1MTYgaXYpOworCWV4dGVybiB2b2lkIHg4NmVtdV9pbnN0cnVtZW50X2luc3RydWN0aW9uKHZvaWQpOworCWV4dGVybiB2b2lkIHg4NmVtdV9jaGVja19pcF9hY2Nlc3Modm9pZCk7CisJZXh0ZXJuIHZvaWQgeDg2ZW11X2NoZWNrX3NwX2FjY2Vzcyh2b2lkKTsKKwlleHRlcm4gdm9pZCB4ODZlbXVfY2hlY2tfbWVtX2FjY2Vzcyh1MzIgcCk7CisJZXh0ZXJuIHZvaWQgeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHVpbnQgcywgdWludCBvKTsKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CQkJCS8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrCSAgICAqLworI2VuZGlmCisjZW5kaWYJCQkJLyogX19YODZFTVVfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L2RlY29kZS5oIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L2RlY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NzY5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUvZGVjb2RlLmgKQEAgLTAsMCArMSw4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTIwMDQgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIGluc3RydWN0aW9uIGRlY29kaW5nIGxvZ2ljLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1g4NkVNVV9ERUNPREVfSAorI2RlZmluZSBfX1g4NkVNVV9ERUNPREVfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBJbnN0cnVjdGlvbiBEZWNvZGluZyBTdHVmZiAqLworCisjZGVmaW5lIEZFVENIX0RFQ09ERV9NT0RSTShtb2QscmgscmwpICAgZmV0Y2hfZGVjb2RlX21vZHJtKCZtb2QsJnJoLCZybCkKKyNkZWZpbmUgREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocikgICAgICBkZWNvZGVfcm1fYnl0ZV9yZWdpc3RlcihyKQorI2RlZmluZSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyKSAgICAgIGRlY29kZV9ybV93b3JkX3JlZ2lzdGVyKHIpCisjZGVmaW5lIERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHIpICAgICAgZGVjb2RlX3JtX2xvbmdfcmVnaXN0ZXIocikKKyNkZWZpbmUgREVDT0RFX0NMRUFSX1NFR09WUigpICAgICAgICAgICBNLng4Ni5tb2RlICY9IH5TWVNNT0RFX0NMUk1BU0sKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KKyNlbmRpZgorCit2b2lkICAgIHg4NmVtdV9pbnRyX3JhaXNlICh1OCB0eXBlKTsKK3ZvaWQgICAgZmV0Y2hfZGVjb2RlX21vZHJtIChpbnQgKm1vZCxpbnQgKnJlZ2gsaW50ICpyZWdsKTsKK3U4ICAgICAgZmV0Y2hfYnl0ZV9pbW0gKHZvaWQpOwordTE2ICAgICBmZXRjaF93b3JkX2ltbSAodm9pZCk7Cit1MzIgICAgIGZldGNoX2xvbmdfaW1tICh2b2lkKTsKK3U4ICAgICAgZmV0Y2hfZGF0YV9ieXRlICh1aW50IG9mZnNldCk7Cit1OCAgICAgIGZldGNoX2RhdGFfYnl0ZV9hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQpOwordTE2ICAgICBmZXRjaF9kYXRhX3dvcmQgKHVpbnQgb2Zmc2V0KTsKK3UxNiAgICAgZmV0Y2hfZGF0YV93b3JkX2FicyAodWludCBzZWdtZW50LCB1aW50IG9mZnNldCk7Cit1MzIgICAgIGZldGNoX2RhdGFfbG9uZyAodWludCBvZmZzZXQpOwordTMyICAgICBmZXRjaF9kYXRhX2xvbmdfYWJzICh1aW50IHNlZ21lbnQsIHVpbnQgb2Zmc2V0KTsKK3ZvaWQgICAgc3RvcmVfZGF0YV9ieXRlICh1aW50IG9mZnNldCwgdTggdmFsKTsKK3ZvaWQgICAgc3RvcmVfZGF0YV9ieXRlX2FicyAodWludCBzZWdtZW50LCB1aW50IG9mZnNldCwgdTggdmFsKTsKK3ZvaWQgICAgc3RvcmVfZGF0YV93b3JkICh1aW50IG9mZnNldCwgdTE2IHZhbCk7Cit2b2lkICAgIHN0b3JlX2RhdGFfd29yZF9hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQsIHUxNiB2YWwpOwordm9pZCAgICBzdG9yZV9kYXRhX2xvbmcgKHVpbnQgb2Zmc2V0LCB1MzIgdmFsKTsKK3ZvaWQgICAgc3RvcmVfZGF0YV9sb25nX2FicyAodWludCBzZWdtZW50LCB1aW50IG9mZnNldCwgdTMyIHZhbCk7Cit1OCogICAgIGRlY29kZV9ybV9ieXRlX3JlZ2lzdGVyKGludCByZWcpOwordTE2KiAgICBkZWNvZGVfcm1fd29yZF9yZWdpc3RlcihpbnQgcmVnKTsKK3UzMiogICAgZGVjb2RlX3JtX2xvbmdfcmVnaXN0ZXIoaW50IHJlZyk7Cit1MTYqICAgIGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIoaW50IHJlZyk7Cit1bnNpZ25lZCBkZWNvZGVfcm0wMF9hZGRyZXNzKGludCBybSk7Cit1bnNpZ25lZCBkZWNvZGVfcm0wMV9hZGRyZXNzKGludCBybSk7Cit1bnNpZ25lZCBkZWNvZGVfcm0xMF9hZGRyZXNzKGludCBybSk7Cit1bnNpZ25lZCBkZWNvZGVfcm1YWF9hZGRyZXNzKGludCBtb2QsIGludCBybSk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgICAgICovCisjZW5kaWYKKworI2VuZGlmIC8qIF9fWDg2RU1VX0RFQ09ERV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUvb3BzLmggYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUvb3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmMjMxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS9vcHMuaApAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3Igb3BlcmFuZCBkZWNvZGluZyBmdW5jdGlvbnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fWDg2RU1VX09QU19ICisjZGVmaW5lIF9fWDg2RU1VX09QU19ICisKK2V4dGVybiB2b2lkICgqeDg2ZW11X29wdGFiWzB4MTAwXSkodTggb3AxKTsKK2V4dGVybiB2b2lkICgqeDg2ZW11X29wdGFiMlsweDEwMF0pKHU4IG9wMik7CisKKyNlbmRpZiAvKiBfX1g4NkVNVV9PUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L3ByaW1fYXNtLmggYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUvcHJpbV9hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2I0Y2FiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L3ByaW1fYXNtLmgKQEAgLTAsMCArMSw5NzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyogICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIFdhdGNvbSBDKysgMTAuNiBvciBsYXRlcgorKiBFbnZpcm9ubWVudDogIEFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIElubGluZSBhc3NlbWJsZXIgdmVyc2lvbnMgb2YgdGhlIHByaW1pdGl2ZSBvcGVyYW5kCisqICAgICAgICAgICAgICAgZnVuY3Rpb25zIGZvciBmYXN0ZXIgcGVyZm9ybWFuY2UuIEF0IHRoZSBtb21lbnQgdGhpcyBpcworKiAgICAgICAgICAgICAgIHg4NiBpbmxpbmUgYXNzZW1ibGVyLCBidXQgdGhlc2UgZnVuY3Rpb25zIGNvdWxkIGJlIHJlcGxhY2VkCisqICAgICAgICAgICAgICAgd2l0aCBuYXRpdmUgaW5saW5lIGFzc2VtYmxlciBmb3IgZWFjaCBzdXBwb3J0ZWQgcHJvY2Vzc29yCisqICAgICAgICAgICAgICAgcGxhdGZvcm0uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fWDg2RU1VX1BSSU1fQVNNX0gKKyNkZWZpbmUgX19YODZFTVVfUFJJTV9BU01fSAorCisjaWZkZWYgIF9fV0FUQ09NQ19fCisKKyNpZm5kZWYgVkFMSURBVEUKKyNkZWZpbmUgX19IQVZFX0lOTElORV9BU1NFTUJMRVJfXworI2VuZGlmCisKK3UzMiBnZXRfZmxhZ3NfYXNtKHZvaWQpOworI3ByYWdtYSBhdXggZ2V0X2ZsYWdzX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgZWF4IiAgICAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4XTsKKwordTE2IGFhYV93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQpOworI3ByYWdtYSBhdXggYWFhX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhYWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXhdOworCit1MTYgYWFzX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCk7CisjcHJhZ21hIGF1eCBhYXNfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImFhcyIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheF07CisKK3UxNiBhYWRfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkKTsKKyNwcmFnbWEgYXV4IGFhZF93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiYWFkIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4XTsKKwordTE2IGFhbV93b3JkX2FzbSh1MzIgKiBmbGFncywgdTggZCk7CisjcHJhZ21hIGF1eCBhYW1fd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImFhbSIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheF07CisKK3U4IGFkY19ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBhZGNfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImFkYyAgICBhbCxibCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBibF07CisKK3UxNiBhZGNfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkLCB1MTYgcyk7CisjcHJhZ21hIGF1eCBhZGNfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImFkYyAgICBheCxieCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBieF07CisKK3UzMiBhZGNfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1MzIgcyk7CisjcHJhZ21hIGF1eCBhZGNfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImFkYyAgICBlYXgsZWJ4IiAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKKwordTggYWRkX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IGFkZF9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiYWRkICAgIGFsLGJsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsIGJsXTsKKwordTE2IGFkZF93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IGFkZF93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiYWRkICAgIGF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGJ4XTsKKwordTMyIGFkZF9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHUzMiBzKTsKKyNwcmFnbWEgYXV4IGFkZF9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiYWRkICAgIGVheCxlYngiICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtlYnhdICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBlYnhdOworCit1OCBhbmRfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggYW5kX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhbmQgICAgYWwsYmwiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgYmxdOworCit1MTYgYW5kX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTE2IHMpOworI3ByYWdtYSBhdXggYW5kX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhbmQgICAgYXgsYngiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggYnhdOworCit1MzIgYW5kX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggYW5kX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhbmQgICAgZWF4LGVieCIgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3U4IGNtcF9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBjbXBfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImNtcCAgICBhbCxibCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBibF07CisKK3UxNiBjbXBfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkLCB1MTYgcyk7CisjcHJhZ21hIGF1eCBjbXBfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImNtcCAgICBheCxieCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBieF07CisKK3UzMiBjbXBfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1MzIgcyk7CisjcHJhZ21hIGF1eCBjbXBfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImNtcCAgICBlYXgsZWJ4IiAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKKwordTggZGFhX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkKTsKKyNwcmFnbWEgYXV4IGRhYV9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZGFhIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsXTsKKwordTggZGFzX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkKTsKKyNwcmFnbWEgYXV4IGRhc19ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZGFzIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsXTsKKwordTggZGVjX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkKTsKKyNwcmFnbWEgYXV4IGRlY19ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZGVjICAgIGFsIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsXTsKKwordTE2IGRlY193b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQpOworI3ByYWdtYSBhdXggZGVjX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJkZWMgICAgYXgiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXhdOworCit1MzIgZGVjX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCk7CisjcHJhZ21hIGF1eCBkZWNfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImRlYyAgICBlYXgiICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXhdOworCit1OCBpbmNfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQpOworI3ByYWdtYSBhdXggaW5jX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpbmMgICAgYWwiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWxdOworCit1MTYgaW5jX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCk7CisjcHJhZ21hIGF1eCBpbmNfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImluYyAgICBheCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheF07CisKK3UzMiBpbmNfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkKTsKKyNwcmFnbWEgYXV4IGluY19sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiaW5jICAgIGVheCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheF07CisKK3U4IG9yX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IG9yX2J5dGVfYXNtID0gICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAib3IgYWwsYmwiICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsIGJsXTsKKwordTE2IG9yX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTE2IHMpOworI3ByYWdtYSBhdXggb3Jfd29yZF9hc20gPSAgICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJvciBheCxieCIgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggYnhdOworCit1MzIgb3JfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1MzIgcyk7CisjcHJhZ21hIGF1eCBvcl9sb25nX2FzbSA9ICAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm9yIGVheCxlYngiICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKKwordTggbmVnX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkKTsKKyNwcmFnbWEgYXV4IG5lZ19ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibmVnICAgIGFsIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsXTsKKwordTE2IG5lZ193b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQpOworI3ByYWdtYSBhdXggbmVnX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJuZWcgICAgYXgiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXhdOworCit1MzIgbmVnX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCk7CisjcHJhZ21hIGF1eCBuZWdfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm5lZyAgICBlYXgiICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXhdOworCit1OCBub3RfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQpOworI3ByYWdtYSBhdXggbm90X2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJub3QgICAgYWwiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWxdOworCit1MTYgbm90X3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCk7CisjcHJhZ21hIGF1eCBub3Rfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm5vdCAgICBheCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheF07CisKK3UzMiBub3RfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkKTsKKyNwcmFnbWEgYXV4IG5vdF9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibm90ICAgIGVheCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheF07CisKK3U4IHJjbF9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCByY2xfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJjbCAgICBhbCxjbCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBjbF07CisKK3UxNiByY2xfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJjbF93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmNsICAgIGF4LGNsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGNsXTsKKwordTMyIHJjbF9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHU4IHMpOworI3ByYWdtYSBhdXggcmNsX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyY2wgICAgZWF4LGNsIiAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGNsXTsKKwordTggcmNyX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJjcl9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmNyICAgIGFsLGNsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gW2NsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsIGNsXTsKKwordTE2IHJjcl93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHU4IHMpOworI3ByYWdtYSBhdXggcmNyX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyY3IgICAgYXgsY2wiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbY2xdICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggY2xdOworCit1MzIgcmNyX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTggcyk7CisjcHJhZ21hIGF1eCByY3JfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJjciAgICBlYXgsY2wiICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbY2xdICAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggY2xdOworCit1OCByb2xfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggcm9sX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyb2wgICAgYWwsY2wiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbY2xdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgY2xdOworCit1MTYgcm9sX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTggcyk7CisjcHJhZ21hIGF1eCByb2xfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJvbCAgICBheCxjbCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtjbF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBjbF07CisKK3UzMiByb2xfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJvbF9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicm9sICAgIGVheCxjbCIgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtjbF0gICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBjbF07CisKK3U4IHJvcl9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCByb3JfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJvciAgICBhbCxjbCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBjbF07CisKK3UxNiByb3Jfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJvcl93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicm9yICAgIGF4LGNsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGNsXTsKKwordTMyIHJvcl9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHU4IHMpOworI3ByYWdtYSBhdXggcm9yX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyb3IgICAgZWF4LGNsIiAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGNsXTsKKwordTggc2hsX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNobF9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2hsICAgIGFsLGNsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gW2NsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsIGNsXTsKKwordTE2IHNobF93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHU4IHMpOworI3ByYWdtYSBhdXggc2hsX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzaGwgICAgYXgsY2wiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbY2xdICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggY2xdOworCit1MzIgc2hsX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTggcyk7CisjcHJhZ21hIGF1eCBzaGxfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNobCAgICBlYXgsY2wiICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbY2xdICAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggY2xdOworCit1OCBzaHJfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggc2hyX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzaHIgICAgYWwsY2wiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbY2xdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgY2xdOworCit1MTYgc2hyX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTggcyk7CisjcHJhZ21hIGF1eCBzaHJfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNociAgICBheCxjbCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtjbF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBjbF07CisKK3UzMiBzaHJfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNocl9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2hyICAgIGVheCxjbCIgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtjbF0gICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBjbF07CisKK3U4IHNhcl9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBzYXJfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNhciAgICBhbCxjbCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBjbF07CisKK3UxNiBzYXJfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNhcl93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2FyICAgIGF4LGNsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGNsXTsKKwordTMyIHNhcl9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHU4IHMpOworI3ByYWdtYSBhdXggc2FyX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzYXIgICAgZWF4LGNsIiAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGNsXTsKKwordTE2IHNobGRfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkLCB1MTYgZmlsbCwgdTggcyk7CisjcHJhZ21hIGF1eCBzaGxkX3dvcmRfYXNtID0gICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNobGQgICBheCxkeCxjbCIgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtkeF0gW2NsXSAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBkeCBjbF07CisKK3UzMiBzaGxkX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTMyIGZpbGwsIHU4IHMpOworI3ByYWdtYSBhdXggc2hsZF9sb25nX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzaGxkICAgZWF4LGVkeCxjbCIgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2VkeF0gW2NsXSAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGVkeCBjbF07CisKK3UxNiBzaHJkX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTE2IGZpbGwsIHU4IHMpOworI3ByYWdtYSBhdXggc2hyZF93b3JkX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzaHJkICAgYXgsZHgsY2wiICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbZHhdIFtjbF0gICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggZHggY2xdOworCit1MzIgc2hyZF9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHUzMiBmaWxsLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNocmRfbG9uZ19hc20gPSAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2hyZCAgIGVheCxlZHgsY2wiICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtlZHhdIFtjbF0gICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBlZHggY2xdOworCit1OCBzYmJfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggc2JiX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzYmIgICAgYWwsYmwiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgYmxdOworCit1MTYgc2JiX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTE2IHMpOworI3ByYWdtYSBhdXggc2JiX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzYmIgICAgYXgsYngiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggYnhdOworCit1MzIgc2JiX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggc2JiX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzYmIgICAgZWF4LGVieCIgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3U4IHN1Yl9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBzdWJfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInN1YiAgICBhbCxibCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBibF07CisKK3UxNiBzdWJfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkLCB1MTYgcyk7CisjcHJhZ21hIGF1eCBzdWJfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInN1YiAgICBheCxieCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBieF07CisKK3UzMiBzdWJfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1MzIgcyk7CisjcHJhZ21hIGF1eCBzdWJfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInN1YiAgICBlYXgsZWJ4IiAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKKwordm9pZCB0ZXN0X2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHRlc3RfYnl0ZV9hc20gPSAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAidGVzdCAgIGFsLGJsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsIGJsXTsKKwordm9pZCB0ZXN0X3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTE2IHMpOworI3ByYWdtYSBhdXggdGVzdF93b3JkX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJ0ZXN0ICAgYXgsYngiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggYnhdOworCit2b2lkIHRlc3RfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1MzIgcyk7CisjcHJhZ21hIGF1eCB0ZXN0X2xvbmdfYXNtID0gICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInRlc3QgICBlYXgsZWJ4IiAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKKwordTggeG9yX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHhvcl9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAieG9yICAgIGFsLGJsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsIGJsXTsKKwordTE2IHhvcl93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IHhvcl93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAieG9yICAgIGF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGJ4XTsKKwordTMyIHhvcl9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHUzMiBzKTsKKyNwcmFnbWEgYXV4IHhvcl9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAieG9yICAgIGVheCxlYngiICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtlYnhdICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBlYnhdOworCit2b2lkIGltdWxfYnl0ZV9hc20odTMyICogZmxhZ3MsIHUxNiAqIGF4LCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IGltdWxfYnl0ZV9hc20gPSAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiaW11bCAgIGJsIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlc2ldLGF4IiAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlc2ldIFthbF0gW2JsXSAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VzaSBheCBibF07CisKK3ZvaWQgaW11bF93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2ICogYXgsIHUxNiAqIGR4LCB1MTYgZCwgdTE2IHMpOworI3ByYWdtYSBhdXggaW11bF93b3JkX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpbXVsICAgYngiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VzaV0sYXgiICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VjeF0sZHgiICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbYnhdXAorICAgIG1vZGlmeSBleGFjdCBbZXNpIGVkaSBheCBieCBkeF07CisKK3ZvaWQgaW11bF9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyICogZWF4LCB1MzIgKiBlZHgsIHUzMiBkLCB1MzIgcyk7CisjcHJhZ21hIGF1eCBpbXVsX2xvbmdfYXNtID0gICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImltdWwgICBlYngiICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZXNpXSxlYXgiICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZWN4XSxlZHgiICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbZWF4XSBbZWJ4XSBcCisgICAgbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGVheCBlYnggZWR4XTsKKwordm9pZCBtdWxfYnl0ZV9hc20odTMyICogZmxhZ3MsIHUxNiAqIGF4LCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IG11bF9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibXVsICAgIGJsIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlc2ldLGF4IiAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlc2ldIFthbF0gW2JsXSAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VzaSBheCBibF07CisKK3ZvaWQgbXVsX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgKiBheCwgdTE2ICogZHgsIHUxNiBkLCB1MTYgcyk7CisjcHJhZ21hIGF1eCBtdWxfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm11bCAgICBieCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZXNpXSxheCIgICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZWN4XSxkeCIgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbYXhdIFtieF1cCisgICAgbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGF4IGJ4IGR4XTsKKwordm9pZCBtdWxfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiAqIGVheCwgdTMyICogZWR4LCB1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggbXVsX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtdWwgICAgZWJ4IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VzaV0sZWF4IiAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VjeF0sZWR4IiAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2VheF0gW2VieF0gXAorICAgIG1vZGlmeSBleGFjdCBbZXNpIGVkaSBlYXggZWJ4IGVkeF07CisKK3ZvaWQgaWRpdl9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggKiBhbCwgdTggKiBhaCwgdTE2IGQsIHU4IHMpOworI3ByYWdtYSBhdXggaWRpdl9ieXRlX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpZGl2ICAgYmwiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VzaV0sYWwiICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VjeF0sYWgiICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbYmxdXAorICAgIG1vZGlmeSBleGFjdCBbZXNpIGVkaSBheCBibF07CisKK3ZvaWQgaWRpdl93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2ICogYXgsIHUxNiAqIGR4LCB1MTYgZGxvLCB1MTYgZGhpLCB1MTYgcyk7CisjcHJhZ21hIGF1eCBpZGl2X3dvcmRfYXNtID0gICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImlkaXYgICBieCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZXNpXSxheCIgICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZWN4XSxkeCIgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbYXhdIFtkeF0gW2J4XVwKKyAgICBtb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggZHggYnhdOworCit2b2lkIGlkaXZfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiAqIGVheCwgdTMyICogZWR4LCB1MzIgZGxvLCB1MzIgZGhpLCB1MzIgcyk7CisjcHJhZ21hIGF1eCBpZGl2X2xvbmdfYXNtID0gICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImlkaXYgICBlYngiICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZXNpXSxlYXgiICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZWN4XSxlZHgiICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbZWF4XSBbZWR4XSBbZWJ4XVwKKyAgICBtb2RpZnkgZXhhY3QgW2VzaSBlZGkgZWF4IGVkeCBlYnhdOworCit2b2lkIGRpdl9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggKiBhbCwgdTggKiBhaCwgdTE2IGQsIHU4IHMpOworI3ByYWdtYSBhdXggZGl2X2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJkaXYgICAgYmwiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VzaV0sYWwiICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VjeF0sYWgiICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbYmxdXAorICAgIG1vZGlmeSBleGFjdCBbZXNpIGVkaSBheCBibF07CisKK3ZvaWQgZGl2X3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgKiBheCwgdTE2ICogZHgsIHUxNiBkbG8sIHUxNiBkaGksIHUxNiBzKTsKKyNwcmFnbWEgYXV4IGRpdl93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZGl2ICAgIGJ4IiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlc2ldLGF4IiAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlY3hdLGR4IiAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtheF0gW2R4XSBbYnhdXAorICAgIG1vZGlmeSBleGFjdCBbZXNpIGVkaSBheCBkeCBieF07CisKK3ZvaWQgZGl2X2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgKiBlYXgsIHUzMiAqIGVkeCwgdTMyIGRsbywgdTMyIGRoaSwgdTMyIHMpOworI3ByYWdtYSBhdXggZGl2X2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJkaXYgICAgZWJ4IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VzaV0sZWF4IiAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VjeF0sZWR4IiAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2VheF0gW2VkeF0gW2VieF1cCisgICAgbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGVheCBlZHggZWJ4XTsKKworI2VuZGlmCisKKyNlbmRpZgkJCQkvKiBfX1g4NkVNVV9QUklNX0FTTV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUvcHJpbV9vcHMuaCBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS9wcmltX29wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTFlODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUvcHJpbV9vcHMuaApAQCAtMCwwICsxLDE0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTIwMDQgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHByaW1pdGl2ZSBvcGVyYXRpb24gZnVuY3Rpb25zLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1g4NkVNVV9QUklNX09QU19ICisjZGVmaW5lIF9fWDg2RU1VX1BSSU1fT1BTX0gKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KKyNlbmRpZgorCit1MTYgICAgIGFhYV93b3JkICh1MTYgZCk7Cit1MTYgICAgIGFhc193b3JkICh1MTYgZCk7Cit1MTYgICAgIGFhZF93b3JkICh1MTYgZCk7Cit1MTYgICAgIGFhbV93b3JkICh1OCBkKTsKK3U4ICAgICAgYWRjX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICBhZGNfd29yZCAodTE2IGQsIHUxNiBzKTsKK3UzMiAgICAgYWRjX2xvbmcgKHUzMiBkLCB1MzIgcyk7Cit1OCAgICAgIGFkZF9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgYWRkX3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit1MzIgICAgIGFkZF9sb25nICh1MzIgZCwgdTMyIHMpOwordTggICAgICBhbmRfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIGFuZF93b3JkICh1MTYgZCwgdTE2IHMpOwordTMyICAgICBhbmRfbG9uZyAodTMyIGQsIHUzMiBzKTsKK3U4ICAgICAgY21wX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICBjbXBfd29yZCAodTE2IGQsIHUxNiBzKTsKK3UzMiAgICAgY21wX2xvbmcgKHUzMiBkLCB1MzIgcyk7Cit1OCAgICAgIGRhYV9ieXRlICh1OCBkKTsKK3U4ICAgICAgZGFzX2J5dGUgKHU4IGQpOwordTggICAgICBkZWNfYnl0ZSAodTggZCk7Cit1MTYgICAgIGRlY193b3JkICh1MTYgZCk7Cit1MzIgICAgIGRlY19sb25nICh1MzIgZCk7Cit1OCAgICAgIGluY19ieXRlICh1OCBkKTsKK3UxNiAgICAgaW5jX3dvcmQgKHUxNiBkKTsKK3UzMiAgICAgaW5jX2xvbmcgKHUzMiBkKTsKK3U4ICAgICAgb3JfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIG9yX3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit1MzIgICAgIG9yX2xvbmcgKHUzMiBkLCB1MzIgcyk7Cit1OCAgICAgIG5lZ19ieXRlICh1OCBzKTsKK3UxNiAgICAgbmVnX3dvcmQgKHUxNiBzKTsKK3UzMiAgICAgbmVnX2xvbmcgKHUzMiBzKTsKK3U4ICAgICAgbm90X2J5dGUgKHU4IHMpOwordTE2ICAgICBub3Rfd29yZCAodTE2IHMpOwordTMyICAgICBub3RfbG9uZyAodTMyIHMpOwordTggICAgICByY2xfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIHJjbF93b3JkICh1MTYgZCwgdTggcyk7Cit1MzIgICAgIHJjbF9sb25nICh1MzIgZCwgdTggcyk7Cit1OCAgICAgIHJjcl9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgcmNyX3dvcmQgKHUxNiBkLCB1OCBzKTsKK3UzMiAgICAgcmNyX2xvbmcgKHUzMiBkLCB1OCBzKTsKK3U4ICAgICAgcm9sX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICByb2xfd29yZCAodTE2IGQsIHU4IHMpOwordTMyICAgICByb2xfbG9uZyAodTMyIGQsIHU4IHMpOwordTggICAgICByb3JfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIHJvcl93b3JkICh1MTYgZCwgdTggcyk7Cit1MzIgICAgIHJvcl9sb25nICh1MzIgZCwgdTggcyk7Cit1OCAgICAgIHNobF9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgc2hsX3dvcmQgKHUxNiBkLCB1OCBzKTsKK3UzMiAgICAgc2hsX2xvbmcgKHUzMiBkLCB1OCBzKTsKK3U4ICAgICAgc2hyX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICBzaHJfd29yZCAodTE2IGQsIHU4IHMpOwordTMyICAgICBzaHJfbG9uZyAodTMyIGQsIHU4IHMpOwordTggICAgICBzYXJfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIHNhcl93b3JkICh1MTYgZCwgdTggcyk7Cit1MzIgICAgIHNhcl9sb25nICh1MzIgZCwgdTggcyk7Cit1MTYgICAgIHNobGRfd29yZCAodTE2IGQsIHUxNiBmaWxsLCB1OCBzKTsKK3UzMiAgICAgc2hsZF9sb25nICh1MzIgZCwgdTMyIGZpbGwsIHU4IHMpOwordTE2ICAgICBzaHJkX3dvcmQgKHUxNiBkLCB1MTYgZmlsbCwgdTggcyk7Cit1MzIgICAgIHNocmRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKTsKK3U4ICAgICAgc2JiX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICBzYmJfd29yZCAodTE2IGQsIHUxNiBzKTsKK3UzMiAgICAgc2JiX2xvbmcgKHUzMiBkLCB1MzIgcyk7Cit1OCAgICAgIHN1Yl9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgc3ViX3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit1MzIgICAgIHN1Yl9sb25nICh1MzIgZCwgdTMyIHMpOwordm9pZCAgICB0ZXN0X2J5dGUgKHU4IGQsIHU4IHMpOwordm9pZCAgICB0ZXN0X3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit2b2lkICAgIHRlc3RfbG9uZyAodTMyIGQsIHUzMiBzKTsKK3U4ICAgICAgeG9yX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICB4b3Jfd29yZCAodTE2IGQsIHUxNiBzKTsKK3UzMiAgICAgeG9yX2xvbmcgKHUzMiBkLCB1MzIgcyk7Cit2b2lkICAgIGltdWxfYnl0ZSAodTggcyk7Cit2b2lkICAgIGltdWxfd29yZCAodTE2IHMpOwordm9pZCAgICBpbXVsX2xvbmcgKHUzMiBzKTsKK3ZvaWQgICAgaW11bF9sb25nX2RpcmVjdCh1MzIgKnJlc19sbywgdTMyKiByZXNfaGksdTMyIGQsIHUzMiBzKTsKK3ZvaWQgICAgbXVsX2J5dGUgKHU4IHMpOwordm9pZCAgICBtdWxfd29yZCAodTE2IHMpOwordm9pZCAgICBtdWxfbG9uZyAodTMyIHMpOwordm9pZCAgICBpZGl2X2J5dGUgKHU4IHMpOwordm9pZCAgICBpZGl2X3dvcmQgKHUxNiBzKTsKK3ZvaWQgICAgaWRpdl9sb25nICh1MzIgcyk7Cit2b2lkICAgIGRpdl9ieXRlICh1OCBzKTsKK3ZvaWQgICAgZGl2X3dvcmQgKHUxNiBzKTsKK3ZvaWQgICAgZGl2X2xvbmcgKHUzMiBzKTsKK3ZvaWQgICAgaW5zIChpbnQgc2l6ZSk7Cit2b2lkICAgIG91dHMgKGludCBzaXplKTsKK3UxNiAgICAgbWVtX2FjY2Vzc193b3JkIChpbnQgYWRkcik7Cit2b2lkICAgIHB1c2hfd29yZCAodTE2IHcpOwordm9pZCAgICBwdXNoX2xvbmcgKHUzMiB3KTsKK3UxNiAgICAgcG9wX3dvcmQgKHZvaWQpOwordTMyICAgICBwb3BfbG9uZyAodm9pZCk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgICAgICovCisjZW5kaWYKKworI2VuZGlmIC8qIF9fWDg2RU1VX1BSSU1fT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS9yZWdzLmggYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUvcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZmVkZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUvcmVncy5oCkBAIC0wLDAgKzEsMzQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqCQlDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyoJCSAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLglUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CUFOU0kgQworKiBFbnZpcm9ubWVudDoJQW55CisqIERldmVsb3BlcjoJS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOglIZWFkZXIgZmlsZSBmb3IgeDg2IHJlZ2lzdGVyIGRlZmluaXRpb25zLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1g4NkVNVV9SRUdTX0gKKyNkZWZpbmUgX19YODZFTVVfUkVHU19ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgcGFjaygxKQorCisvKgorICogR2VuZXJhbCBFQVgsIEVCWCwgRUNYLCBFRFggdHlwZSByZWdpc3RlcnMuICBOb3RlIHRoYXQgZm9yCisgKiBwb3J0YWJpbGl0eSwgYW5kIHNwZWVkLCB0aGUgaXNzdWUgb2YgYnl0ZSBzd2FwcGluZyBpcyBub3QgYWRkcmVzc2VkCisgKiBpbiB0aGUgcmVnaXN0ZXJzLiAgQWxsIHJlZ2lzdGVycyBhcmUgc3RvcmVkIGluIHRoZSBkZWZhdWx0IGZvcm1hdAorICogYXZhaWxhYmxlIG9uIHRoZSBob3N0IG1hY2hpbmUuICBUaGUgb25seSBjcml0aWNhbCBpc3N1ZSBpcyB0aGF0IHRoZQorICogcmVnaXN0ZXJzIHNob3VsZCBsaW5lIHVwIEVYQUNUTFkgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRoZXkgZG8gaW4KKyAqIHRoZSAzODYuICBUaGF0IGlzOgorICoKKyAqIEVBWCAmIDB4ZmYgID09PSBBTAorICogRUFYICYgMHhmZmZmID09IEFYCisgKgorICogZXRjLgkgVGhlIHJlc3VsdCBpcyB0aGF0IGFsb3Qgb2YgdGhlIGNhbGN1bGF0aW9ucyBjYW4gdGhlbiBiZQorICogZG9uZSB1c2luZyB0aGUgbmF0aXZlIGluc3RydWN0aW9uIHNldCBmdWxseS4KKyAqLworCisjaWZkZWYJX19CSUdfRU5ESUFOX18KKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBlX3JlZzsKK30gSTMyX3JlZ190OworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGZpbGxlcjAsIHhfcmVnOworfSBJMTZfcmVnX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1OCBmaWxsZXIwLCBmaWxsZXIxLCBoX3JlZywgbF9yZWc7Cit9IEk4X3JlZ190OworCisjZWxzZQkJCQkvKiAhX19CSUdfRU5ESUFOX18gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBlX3JlZzsKK30gSTMyX3JlZ190OworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IHhfcmVnOworfSBJMTZfcmVnX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1OCBsX3JlZywgaF9yZWc7Cit9IEk4X3JlZ190OworCisjZW5kaWYJCQkJLyogQklHX0VORElBTiAqLworCit0eXBlZGVmIHVuaW9uIHsKKwlJMzJfcmVnX3QgSTMyX3JlZzsKKwlJMTZfcmVnX3QgSTE2X3JlZzsKKwlJOF9yZWdfdCBJOF9yZWc7Cit9IGkzODZfZ2VuZXJhbF9yZWdpc3RlcjsKKworc3RydWN0IGkzODZfZ2VuZXJhbF9yZWdzIHsKKwlpMzg2X2dlbmVyYWxfcmVnaXN0ZXIgQSwgQiwgQywgRDsKK307CisKK3R5cGVkZWYgc3RydWN0IGkzODZfZ2VuZXJhbF9yZWdzIEdlbl9yZWdfdDsKKworc3RydWN0IGkzODZfc3BlY2lhbF9yZWdzIHsKKwlpMzg2X2dlbmVyYWxfcmVnaXN0ZXIgU1AsIEJQLCBTSSwgREksIElQOworCXUzMiBGTEFHUzsKK307CisKKy8qCisgKiBTZWdtZW50IHJlZ2lzdGVycyBoZXJlIHJlcHJlc2VudCB0aGUgMTYgYml0IHF1YW50aXRpZXMKKyAqIENTLCBEUywgRVMsIFNTLgorICovCisKKyN1bmRlZiBDUworI3VuZGVmIERTCisjdW5kZWYgU1MKKyN1bmRlZiBFUworI3VuZGVmIEZTCisjdW5kZWYgR1MKKworc3RydWN0IGkzODZfc2VnbWVudF9yZWdzIHsKKwl1MTYgQ1MsIERTLCBTUywgRVMsIEZTLCBHUzsKK307CisKKy8qIDggYml0IHJlZ2lzdGVycyAqLworI2RlZmluZSBSX0FIICBnZW4uQS5JOF9yZWcuaF9yZWcKKyNkZWZpbmUgUl9BTCAgZ2VuLkEuSThfcmVnLmxfcmVnCisjZGVmaW5lIFJfQkggIGdlbi5CLkk4X3JlZy5oX3JlZworI2RlZmluZSBSX0JMICBnZW4uQi5JOF9yZWcubF9yZWcKKyNkZWZpbmUgUl9DSCAgZ2VuLkMuSThfcmVnLmhfcmVnCisjZGVmaW5lIFJfQ0wgIGdlbi5DLkk4X3JlZy5sX3JlZworI2RlZmluZSBSX0RIICBnZW4uRC5JOF9yZWcuaF9yZWcKKyNkZWZpbmUgUl9ETCAgZ2VuLkQuSThfcmVnLmxfcmVnCisKKy8qIDE2IGJpdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUl9BWCAgZ2VuLkEuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0JYICBnZW4uQi5JMTZfcmVnLnhfcmVnCisjZGVmaW5lIFJfQ1ggIGdlbi5DLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9EWCAgZ2VuLkQuSTE2X3JlZy54X3JlZworCisvKiAzMiBiaXQgZXh0ZW5kZWQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJfRUFYICBnZW4uQS5JMzJfcmVnLmVfcmVnCisjZGVmaW5lIFJfRUJYICBnZW4uQi5JMzJfcmVnLmVfcmVnCisjZGVmaW5lIFJfRUNYICBnZW4uQy5JMzJfcmVnLmVfcmVnCisjZGVmaW5lIFJfRURYICBnZW4uRC5JMzJfcmVnLmVfcmVnCisKKy8qIHNwZWNpYWwgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJfU1AgIHNwYy5TUC5JMTZfcmVnLnhfcmVnCisjZGVmaW5lIFJfQlAgIHNwYy5CUC5JMTZfcmVnLnhfcmVnCisjZGVmaW5lIFJfU0kgIHNwYy5TSS5JMTZfcmVnLnhfcmVnCisjZGVmaW5lIFJfREkgIHNwYy5ESS5JMTZfcmVnLnhfcmVnCisjZGVmaW5lIFJfSVAgIHNwYy5JUC5JMTZfcmVnLnhfcmVnCisjZGVmaW5lIFJfRkxHIHNwYy5GTEFHUworCisvKiBzcGVjaWFsIHJlZ2lzdGVycyAqLworI2RlZmluZSBSX1NQICBzcGMuU1AuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0JQICBzcGMuQlAuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX1NJICBzcGMuU0kuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0RJICBzcGMuREkuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0lQICBzcGMuSVAuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0ZMRyBzcGMuRkxBR1MKKworLyogc3BlY2lhbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUl9FU1AgIHNwYy5TUC5JMzJfcmVnLmVfcmVnCisjZGVmaW5lIFJfRUJQICBzcGMuQlAuSTMyX3JlZy5lX3JlZworI2RlZmluZSBSX0VTSSAgc3BjLlNJLkkzMl9yZWcuZV9yZWcKKyNkZWZpbmUgUl9FREkgIHNwYy5ESS5JMzJfcmVnLmVfcmVnCisjZGVmaW5lIFJfRUlQICBzcGMuSVAuSTMyX3JlZy5lX3JlZworI2RlZmluZSBSX0VGTEcgc3BjLkZMQUdTCisKKy8qIHNlZ21lbnQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJfQ1MgIHNlZy5DUworI2RlZmluZSBSX0RTICBzZWcuRFMKKyNkZWZpbmUgUl9TUyAgc2VnLlNTCisjZGVmaW5lIFJfRVMgIHNlZy5FUworI2RlZmluZSBSX0ZTICBzZWcuRlMKKyNkZWZpbmUgUl9HUyAgc2VnLkdTCisKKy8qIGZsYWcgY29uZGl0aW9ucyAgICovCisjZGVmaW5lIEZCX0NGIDB4MDAwMQkJLyogQ0FSUlkgZmxhZyAgKi8KKyNkZWZpbmUgRkJfUEYgMHgwMDA0CQkvKiBQQVJJVFkgZmxhZyAqLworI2RlZmluZSBGQl9BRiAweDAwMTAJCS8qIEFVWAlmbGFnICAgKi8KKyNkZWZpbmUgRkJfWkYgMHgwMDQwCQkvKiBaRVJPIGZsYWcgICAqLworI2RlZmluZSBGQl9TRiAweDAwODAJCS8qIFNJR04gZmxhZyAgICovCisjZGVmaW5lIEZCX1RGIDB4MDEwMAkJLyogVFJBUCBmbGFnICAgKi8KKyNkZWZpbmUgRkJfSUYgMHgwMjAwCQkvKiBJTlRFUlJVUFQgRU5BQkxFIGZsYWcgKi8KKyNkZWZpbmUgRkJfREYgMHgwNDAwCQkvKiBESVIgZmxhZyAgICAqLworI2RlZmluZSBGQl9PRiAweDA4MDAJCS8qIE9WRVJGTE9XIGZsYWcgKi8KKworLyogODAyODYgYW5kIGFib3ZlIGFsd2F5cyBoYXZlIGJpdCMxIHNldCAqLworI2RlZmluZSBGX0FMV0FZU19PTiAgKDB4MDAwMikJLyogZmxhZyBiaXRzIGFsd2F5cyBvbiAqLworCisvKgorICogRGVmaW5lIGEgbWFzayBmb3Igb25seSB0aG9zZSBmbGFnIGJpdHMgd2Ugd2lsbCBldmVyIHBhc3MgYmFjaworICogKHZpYSBQVVNIRikKKyAqLworI2RlZmluZSBGX01TSyAoRkJfQ0Z8RkJfUEZ8RkJfQUZ8RkJfWkZ8RkJfU0Z8RkJfVEZ8RkJfSUZ8RkJfREZ8RkJfT0YpCisKKy8qIGZvbGxvd2luZyBiaXRzIG1hc2tlZCBpbiB0byBhIDE2Yml0IHF1YW50aXR5ICovCisKKyNkZWZpbmUgRl9DRiAweDAwMDEJCS8qIENBUlJZIGZsYWcgICovCisjZGVmaW5lIEZfUEYgMHgwMDA0CQkvKiBQQVJJVFkgZmxhZyAqLworI2RlZmluZSBGX0FGIDB4MDAxMAkJLyogQVVYCWZsYWcgICAqLworI2RlZmluZSBGX1pGIDB4MDA0MAkJLyogWkVSTyBmbGFnICAgKi8KKyNkZWZpbmUgRl9TRiAweDAwODAJCS8qIFNJR04gZmxhZyAgICovCisjZGVmaW5lIEZfVEYgMHgwMTAwCQkvKiBUUkFQIGZsYWcgICAqLworI2RlZmluZSBGX0lGIDB4MDIwMAkJLyogSU5URVJSVVBUIEVOQUJMRSBmbGFnICovCisjZGVmaW5lIEZfREYgMHgwNDAwCQkvKiBESVIgZmxhZyAgICAqLworI2RlZmluZSBGX09GIDB4MDgwMAkJLyogT1ZFUkZMT1cgZmxhZyAqLworCisjZGVmaW5lIFRPR0dMRV9GTEFHKGZsYWcpCShNLng4Ni5SX0ZMRyBePSAoZmxhZykpCisjZGVmaW5lIFNFVF9GTEFHKGZsYWcpCQkoTS54ODYuUl9GTEcgfD0gKGZsYWcpKQorI2RlZmluZSBDTEVBUl9GTEFHKGZsYWcpCShNLng4Ni5SX0ZMRyAmPSB+KGZsYWcpKQorI2RlZmluZSBBQ0NFU1NfRkxBRyhmbGFnKQkoTS54ODYuUl9GTEcgJiAoZmxhZykpCisjZGVmaW5lIENMRUFSQUxMX0ZMQUcobSkJKE0ueDg2LlJfRkxHID0gMCkKKworI2RlZmluZSBDT05ESVRJT05BTF9TRVRfRkxBRyhDT05ELEZMQUcpIFwKKyAgaWYgKENPTkQpIFNFVF9GTEFHKEZMQUcpOyBlbHNlIENMRUFSX0ZMQUcoRkxBRykKKworI2RlZmluZSBGX1BGX0NBTEMgMHgwMTAwMDAJLyogUEFSSVRZIGZsYWcgaGFzIGJlZW4gY2FsY2VkCSAgKi8KKyNkZWZpbmUgRl9aRl9DQUxDIDB4MDIwMDAwCS8qIFpFUk8gZmxhZyBoYXMgYmVlbiBjYWxjZWQJICAqLworI2RlZmluZSBGX1NGX0NBTEMgMHgwNDAwMDAJLyogU0lHTiBmbGFnIGhhcyBiZWVuIGNhbGNlZAkgICovCisKKyNkZWZpbmUgRl9BTExfQ0FMQwkweGZmMDAwMAkvKiBBbGwgaGF2ZSBiZWVuIGNhbGNlZAkgICovCisKKy8qCisgKiBFbXVsYXRvciBtYWNoaW5lIHN0YXRlLgorICogU2VnbWVudCB1c2FnZSBjb250cm9sLgorICovCisjZGVmaW5lIFNZU01PREVfU0VHX0RTX1NTCTB4MDAwMDAwMDEKKyNkZWZpbmUgU1lTTU9ERV9TRUdPVlJfQ1MJMHgwMDAwMDAwMgorI2RlZmluZSBTWVNNT0RFX1NFR09WUl9EUwkweDAwMDAwMDA0CisjZGVmaW5lIFNZU01PREVfU0VHT1ZSX0VTCTB4MDAwMDAwMDgKKyNkZWZpbmUgU1lTTU9ERV9TRUdPVlJfRlMJMHgwMDAwMDAxMAorI2RlZmluZSBTWVNNT0RFX1NFR09WUl9HUwkweDAwMDAwMDIwCisjZGVmaW5lIFNZU01PREVfU0VHT1ZSX1NTCTB4MDAwMDAwNDAKKyNkZWZpbmUgU1lTTU9ERV9QUkVGSVhfUkVQRQkweDAwMDAwMDgwCisjZGVmaW5lIFNZU01PREVfUFJFRklYX1JFUE5FCTB4MDAwMDAxMDAKKyNkZWZpbmUgU1lTTU9ERV9QUkVGSVhfREFUQQkweDAwMDAwMjAwCisjZGVmaW5lIFNZU01PREVfUFJFRklYX0FERFIJMHgwMDAwMDQwMAorI2RlZmluZSBTWVNNT0RFX0lOVFJfUEVORElORwkweDEwMDAwMDAwCisjZGVmaW5lIFNZU01PREVfRVhUUk5fSU5UUgkweDIwMDAwMDAwCisjZGVmaW5lIFNZU01PREVfSEFMVEVECQkweDQwMDAwMDAwCisKKyNkZWZpbmUgU1lTTU9ERV9TRUdNQVNLIChTWVNNT0RFX1NFR19EU19TUwl8IFwKKwkJCSBTWVNNT0RFX1NFR09WUl9DUwl8IFwKKwkJCSBTWVNNT0RFX1NFR09WUl9EUwl8IFwKKwkJCSBTWVNNT0RFX1NFR09WUl9FUwl8IFwKKwkJCSBTWVNNT0RFX1NFR09WUl9GUwl8IFwKKwkJCSBTWVNNT0RFX1NFR09WUl9HUwl8IFwKKwkJCSBTWVNNT0RFX1NFR09WUl9TUykKKyNkZWZpbmUgU1lTTU9ERV9DTFJNQVNLIChTWVNNT0RFX1NFR19EU19TUwl8IFwKKwkJCSBTWVNNT0RFX1NFR09WUl9DUwl8IFwKKwkJCSBTWVNNT0RFX1NFR09WUl9EUwl8IFwKKwkJCSBTWVNNT0RFX1NFR09WUl9FUwl8IFwKKwkJCSBTWVNNT0RFX1NFR09WUl9GUwl8IFwKKwkJCSBTWVNNT0RFX1NFR09WUl9HUwl8IFwKKwkJCSBTWVNNT0RFX1NFR09WUl9TUwl8IFwKKwkJCSBTWVNNT0RFX1BSRUZJWF9EQVRBCXwgXAorCQkJIFNZU01PREVfUFJFRklYX0FERFIpCisKKyNkZWZpbmUJIElOVFJfU1lOQ0gJICAgICAgMHgxCisjZGVmaW5lCSBJTlRSX0FTWU5DSAkgICAgICAweDIKKyNkZWZpbmUJIElOVFJfSEFMVEVECSAgICAgIDB4NAorCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IGkzODZfZ2VuZXJhbF9yZWdzIGdlbjsKKwlzdHJ1Y3QgaTM4Nl9zcGVjaWFsX3JlZ3Mgc3BjOworCXN0cnVjdCBpMzg2X3NlZ21lbnRfcmVncyBzZWc7CisJLyoKKwkgKiBNT0RFIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uOgorCSAqICBSRVBFIHByZWZpeAkJICAgIDIgYml0cyAgcmVwZSxyZXBuZQorCSAqICBTRUdNRU5UIG92ZXJyaWRlcwkgICAgNSBiaXRzICBub3JtYWwsRFMsU1MsQ1MsRVMKKwkgKiAgRGVsYXllZCBmbGFnIHNldAkgICAgMyBiaXRzICAoemVybywgc2lnbmVkLCBwYXJpdHkpCisJICogIHJlc2VydmVkCQkgICAgNiBiaXRzCisJICogIGludGVycnVwdCAjCQkgICAgOCBiaXRzICBpbnN0cnVjdGlvbiByYWlzZWQgaW50ZXJydXB0CisJICogIEJJT1MgdmlkZW8gc2VncmVncwkgICAgNCBiaXRzCisJICogIEludGVycnVwdCBQZW5kaW5nCSAgICAxIGJpdHMKKwkgKiAgRXh0ZXJuIGludGVycnVwdAkgICAgMSBiaXRzCisJICogIEhhbHRlZAkJICAgIDEgYml0cworCSAqLworCWxvbmcgbW9kZTsKKwl1OCBpbnRubzsKKwl2b2xhdGlsZSBpbnQgaW50cjsJLyogbWFzayBvZiBwZW5kaW5nIGludGVycnVwdHMgKi8KKwlpbnQgZGVidWc7CisjaWZkZWYgREVCVUcKKwlpbnQgY2hlY2s7CisJdTE2IHNhdmVkX2lwOworCXUxNiBzYXZlZF9jczsKKwlpbnQgZW5jX3BvczsKKwlpbnQgZW5jX3N0cl9wb3M7CisJY2hhciBkZWNvZGVfYnVmWzMyXTsJLyogZW5jb2RlZCBieXRlIHN0cmVhbQkqLworCWNoYXIgZGVjb2RlZF9idWZbMjU2XTsJLyogZGlzYXNzZW1ibGVkIHN0cmluZ3MgKi8KKyNlbmRpZgorfSBYODZFTVVfcmVnczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTdHJ1Y3R1cmUgbWFpbnRhaW5pbmcgdGhlIGVtdWxhdG9yIG1hY2hpbmUgc3RhdGUuCisKK01FTUJFUlM6Cit4ODYJCS0gWDg2IHJlZ2lzdGVycworbWVtX2Jhc2UJLSBCYXNlIHJlYWwgbW9kZSBtZW1vcnkgZm9yIHRoZSBlbXVsYXRvcgorbWVtX3NpemUJLSBTaXplIG9mIHRoZSByZWFsIG1vZGUgbWVtb3J5IGJsb2NrIGZvciB0aGUgZW11bGF0b3IKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjdW5kZWYgeDg2Cit0eXBlZGVmIHN0cnVjdCB7CisJWDg2RU1VX3JlZ3MgeDg2OworCXU4ICptZW1fYmFzZTsKKwl1MzIgbWVtX3NpemU7CisJdm9pZCAqcHJpdmF0ZTsKK30gWDg2RU1VX3N5c0VudjsKKworI3ByYWdtYSBwYWNrKCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsJCQkvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLworI2VuZGlmCisKKy8qIEdsb2JhbCBlbXVsYXRvciBtYWNoaW5lIHN0YXRlLgorICoKKyAqIFdlIGtlZXAgaXQgZ2xvYmFsIHRvIGF2b2lkIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGluIHRoZSBjb2RlIGZvciBzcGVlZC4KKyAqLworCisJZXh0ZXJuIFg4NkVNVV9zeXNFbnYgX1g4NkVNVV9lbnY7CisjZGVmaW5lCSAgTQkJX1g4NkVNVV9lbnYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRnVuY3Rpb24gdG8gbG9nIGluZm9ybWF0aW9uIGF0IHJ1bnRpbWUgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisJdm9pZCBwcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pOworI2VuZGlmCisKKyNpZmRlZglfX2NwbHVzcGx1cworfQkJCQkvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKwkgICAgKi8KKyNlbmRpZgorI2VuZGlmCQkJCS8qIF9fWDg2RU1VX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L3g4NmVtdWkuaCBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS94ODZlbXVpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0OTU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS94ODZlbXVpLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyogICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBzeXN0ZW0gc3BlY2lmaWMgZnVuY3Rpb25zLiBUaGVzZSBmdW5jdGlvbnMKKyogICAgICAgICAgICAgICBhcmUgYWx3YXlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW4gdGhlIE9TIGRlcGVkZW50IGxpYnJhcmllcywKKyogICAgICAgICAgICAgICBhbmQgbmV2ZXIgaW4gYSBiaW5hcnkgcG9ydGFibGUgZHJpdmVyLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1g4NkVNVV9YODZFTVVJX0gKKyNkZWZpbmUgX19YODZFTVVfWDg2RU1VSV9ICisKKy8qIElmIHdlIGFyZSBjb21waWxpbmcgaW4gQysrIG1vZGUsIHdlIGNhbiBjb21waWxlIHNvbWUgZnVuY3Rpb25zIGFzCisgKiBpbmxpbmUgdG8gaW5jcmVhc2UgcGVyZm9ybWFuY2UgKGhvd2V2ZXIgdGhlIGNvZGUgc2l6ZSBpbmNyZWFzZXMgcXVpdGUKKyAqIGRyYW1hdGljYWxseSBpbiB0aGlzIGNhc2UpLgorICovCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChfTk9fSU5MSU5FKQorI2RlZmluZSBfSU5MSU5FIGlubGluZQorI2Vsc2UKKyNkZWZpbmUgX0lOTElORSBzdGF0aWMKKyNlbmRpZgorCisvKiBHZXQgcmlkIG9mIHVudXNlZCBwYXJhbWV0ZXJzIGluIEMrKyBjb21waWxhdGlvbiBtb2RlICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBYODZFTVVfVU5VU0VEKHYpCisjZWxzZQorI2RlZmluZSBYODZFTVVfVU5VU0VEKHYpICAgIHYKKyNlbmRpZgorCisjaW5jbHVkZSAieDg2ZW11LmgiCisjaW5jbHVkZSAieDg2ZW11L3JlZ3MuaCIKKyNpbmNsdWRlICJ4ODZlbXUvZGVidWcuaCIKKyNpbmNsdWRlICJ4ODZlbXUvZGVjb2RlLmgiCisjaW5jbHVkZSAieDg2ZW11L29wcy5oIgorI2luY2x1ZGUgIng4NmVtdS9wcmltX29wcy5oIgorI2lmbmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisjZGVmaW5lIHByaW50ayBwcmludGYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbmxpbmUgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsJCQkvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLworI2VuZGlmCisKKwlleHRlcm4gdTgoWDg2QVBJUCBzeXNfcmRiKSAodTMyIGFkZHIpOworCWV4dGVybiB1MTYoWDg2QVBJUCBzeXNfcmR3KSAodTMyIGFkZHIpOworCWV4dGVybiB1MzIoWDg2QVBJUCBzeXNfcmRsKSAodTMyIGFkZHIpOworCWV4dGVybiB2b2lkIChYODZBUElQIHN5c193cmIpICh1MzIgYWRkciwgdTggdmFsKTsKKwlleHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfd3J3KSAodTMyIGFkZHIsIHUxNiB2YWwpOworCWV4dGVybiB2b2lkIChYODZBUElQIHN5c193cmwpICh1MzIgYWRkciwgdTMyIHZhbCk7CisKKwlleHRlcm4gdTgoWDg2QVBJUCBzeXNfaW5iKSAoWDg2RU1VX3Bpb0FkZHIgYWRkcik7CisJZXh0ZXJuIHUxNihYODZBUElQIHN5c19pbncpIChYODZFTVVfcGlvQWRkciBhZGRyKTsKKwlleHRlcm4gdTMyKFg4NkFQSVAgc3lzX2lubCkgKFg4NkVNVV9waW9BZGRyIGFkZHIpOworCWV4dGVybiB2b2lkIChYODZBUElQIHN5c19vdXRiKSAoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTggdmFsKTsKKwlleHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfb3V0dykgKFg4NkVNVV9waW9BZGRyIGFkZHIsIHUxNiB2YWwpOworCWV4dGVybiB2b2lkIChYODZBUElQIHN5c19vdXRsKSAoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTMyIHZhbCk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30JCQkJLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAgICAgKi8KKyNlbmRpZgorI2VuZGlmCQkJCS8qIF9fWDg2RU1VX1g4NkVNVUlfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9kZWJ1Zy5jIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNTczOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IveDg2ZW11L2RlYnVnLmMKQEAgLTAsMCArMSw0NjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyogICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0byBoYW5kbGUgZGVidWdnaW5nIG9mIHRoZQorKiAgICAgICAgICAgICAgIGVtdWxhdG9yLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIng4NmVtdS94ODZlbXVpLmgiCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19CSU9TRU1VKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgREVCVUcKKworc3RhdGljIHZvaWQgcHJpbnRfZW5jb2RlZF9ieXRlcyh1MTYgcywgdTE2IG8pOworc3RhdGljIHZvaWQgcHJpbnRfZGVjb2RlZF9pbnN0cnVjdGlvbih2b2lkKTsKK3N0YXRpYyBpbnQgcGFyc2VfbGluZShjaGFyICpzLCBpbnQgKnBzLCBpbnQgKm4pOworCisvKiBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSBkZWJ1ZydzIG91dHB1dC4gKi8KK3ZvaWQgWDg2RU1VX3RyYWNlX3JlZ3Modm9pZCkKK3sKKwlpZiAoREVCVUdfVFJBQ0UoKSkgeworCQl4ODZlbXVfZHVtcF9yZWdzKCk7CisJfQorCWlmIChERUJVR19ERUNPREUoKSAmJiAhREVCVUdfREVDT0RFX05PUFJJTlQoKSkgeworCQlwcmludGsoIiUwNHg6JTA0eCAiLCBNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXApOworCQlwcmludF9lbmNvZGVkX2J5dGVzKE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCk7CisJCXByaW50X2RlY29kZWRfaW5zdHJ1Y3Rpb24oKTsKKwl9Cit9CisKK3ZvaWQgWDg2RU1VX3RyYWNlX3hyZWdzKHZvaWQpCit7CisJaWYgKERFQlVHX1RSQUNFKCkpIHsKKwkJeDg2ZW11X2R1bXBfeHJlZ3MoKTsKKwl9Cit9CisKK3ZvaWQgeDg2ZW11X2p1c3RfZGlzYXNzZW1ibGUodm9pZCkKK3sKKwkvKgorCSAqIFRoaXMgcm91dGluZSBjYWxsZWQgaWYgdGhlIGZsYWcgREVCVUdfRElTQVNTRU1CTEUgaXMgc2V0IGtpbmQKKwkgKiBvZiBhIGhhY2shCisJICovCisJcHJpbnRrKCIlMDR4OiUwNHggIiwgTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwKTsKKwlwcmludF9lbmNvZGVkX2J5dGVzKE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCk7CisJcHJpbnRfZGVjb2RlZF9pbnN0cnVjdGlvbigpOworfQorCitzdGF0aWMgdm9pZCBkaXNhc3NlbWJsZV9mb3J3YXJkKHUxNiBzZWcsIHUxNiBvZmYsIGludCBuKQoreworCVg4NkVNVV9zeXNFbnYgdHJlZ3M7CisJaW50IGk7CisJdTggb3AxOworCS8qCisJICogaGFjaywgaGFjaywgaGFjay4gIFdoYXQgd2UgZG8gaXMgdXNlIHRoZSBleGFjdCBtYWNoaW5lcnkgc2V0IHVwCisJICogZm9yIGV4ZWN1dGlvbiwgZXhjZXB0IHRoYXQgbm93IHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgc3RhdGUKKwkgKiBmbGFnIGFzc29jaWF0ZWQgd2l0aCB0aGUgImV4ZWN1dGlvbiIsIGFuZCB3ZSBhcmUgdXNpbmcgYSBjb3B5CisJICogb2YgdGhlIHJlZ2lzdGVyIHN0cnVjdC4gIEFsbCB0aGUgbWFqb3Igb3Bjb2Rlcywgb25jZSBmdWxseQorCSAqIGRlY29kZWQsIGhhdmUgdGhlIGZvbGxvd2luZyB0d28gc3RlcHM6IFRSQUNFX1JFR1MocixtKTsKKwkgKiBTSU5HTEVfU1RFUChyLG0pOyB3aGljaCBkaXNhcHBlYXIgaWYgREVCVUcgaXMgbm90IGRlZmluZWQgdG8KKwkgKiB0aGUgcHJlcHJvY2Vzc29yLiAgVGhlIFRSQUNFX1JFR1MgbWFjcm8gZXhwYW5kcyB0bzoKKwkgKgorCSAqIGlmIChkZWJ1ZyZERUJVR19ESVNBU1NFTUJMRSkKKwkgKiAgICAge2p1c3RfZGlzYXNzZW1ibGUoKTsgZ290byBFbmRPZkluc3RydWN0aW9uO30KKwkgKiAgICAgaWYgKGRlYnVnJkRFQlVHX1RSQUNFKSB0cmFjZV9yZWdzKHIsbSk7CisJICoKKwkgKiAuLi4uLi4gIGFuZCBhdCB0aGUgbGFzdCBsaW5lIG9mIHRoZSByb3V0aW5lLgorCSAqCisJICogRW5kT2ZJbnN0cnVjdGlvbjogZW5kX2luc3RyKCk7CisJICoKKwkgKiBVcCB0byB0aGUgcG9pbnQgd2hlcmUgVFJBQ0VfUkVHIGlzIGV4cGFuZGVkLCBOTyBtb2RpZmljYXRpb25zCisJICogYXJlIGRvbmUgdG8gYW55IHJlZ2lzdGVyIEVYQ0VQVCB0aGUgSVAgcmVnaXN0ZXIsIGZvciBmZXRjaCBhbmQKKwkgKiBkZWNvZGluZyBwdXJwb3Nlcy4KKwkgKgorCSAqIFRoaXMgd2FzIGRvbmUgZm9yIGFuIGVudGlyZWx5IGRpZmZlcmVudCByZWFzb24sIGJ1dCBtYWtlcyBhCisJICogbmljZSB3YXkgdG8gZ2V0IHRoZSBzeXN0ZW0gdG8gaGVscCBkZWJ1ZyBjb2Rlcy4KKwkgKi8KKwl0cmVncyA9IE07CisJdHJlZ3MueDg2LlJfSVAgPSBvZmY7CisJdHJlZ3MueDg2LlJfQ1MgPSBzZWc7CisKKwkvKiByZXNldCB0aGUgZGVjb2RpbmcgYnVmZmVycyAqLworCXRyZWdzLng4Ni5lbmNfc3RyX3BvcyA9IDA7CisJdHJlZ3MueDg2LmVuY19wb3MgPSAwOworCisJLyogdHVybiBvbiB0aGUgImRpc2Fzc2VtYmxlIG9ubHksIG5vIGV4ZWN1dGUiIGZsYWcgKi8KKwl0cmVncy54ODYuZGVidWcgfD0gREVCVUdfRElTQVNTRU1CTEVfRjsKKworCS8qIERVTVAgTkVYVCBuIGluc3RydWN0aW9ucyB0byBzY3JlZW4gaW4gc3RyYWlnaHRfbGluZSBmYXNoaW9uICovCisJLyoKKwkgKiBUaGlzIGxvb2tzIGxpa2UgdGhlIHJlZ3VsYXIgaW5zdHJ1Y3Rpb24gZmV0Y2ggc3RyZWFtLCBleGNlcHQKKwkgKiB0aGF0IHdoZW4gdGhpcyBvY2N1cnMsIGVhY2ggZmV0Y2hlZCBvcGNvZGUsIHVwb24gc2VlaW5nIHRoZQorCSAqIERFQlVHX0RJU0FTU0VNQkxFIGZsYWcgc2V0LCBleGl0cyBpbW1lZGlhdGVseSBhZnRlciBkZWNvZGluZworCSAqIHRoZSBpbnN0cnVjdGlvbi4gIFhYWCAtLS0gQ0hFQ0sgVEhBVCBNRU0gSVMgTk9UIEFGRkVDVEVEISEhCisJICogTm90ZSB0aGUgdXNlIG9mIGEgY29weSBvZiB0aGUgcmVnaXN0ZXIgc3RydWN0dXJlLi4uCisJICovCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlvcDEgPSAoKnN5c19yZGIpICgoKHUzMikgTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKyspKTsKKwkJKHg4NmVtdV9vcHRhYltvcDFdKSAob3AxKTsKKwl9CisJLyogZW5kIG1ham9yIGhhY2sgbW9kZS4gKi8KK30KKwordm9pZCB4ODZlbXVfY2hlY2tfaXBfYWNjZXNzKHZvaWQpCit7CisJLyogTlVMTCBhcyBvZiBub3cgKi8KK30KKwordm9pZCB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzKHZvaWQpCit7Cit9CisKK3ZvaWQgeDg2ZW11X2NoZWNrX21lbV9hY2Nlc3ModTMyIGR1bW15KQoreworCS8qICBjaGVjayBib3VuZHMsIGV0YyAqLworfQorCit2b2lkIHg4NmVtdV9jaGVja19kYXRhX2FjY2Vzcyh1aW50IGR1bW15MSwgdWludCBkdW1teTIpCit7CisJLyogIGNoZWNrIGJvdW5kcywgZXRjICovCit9CisKK3ZvaWQgeDg2ZW11X2luY19kZWNvZGVkX2luc3RfbGVuKGludCB4KQoreworCU0ueDg2LmVuY19wb3MgKz0geDsKK30KKwordm9pZCB4ODZlbXVfZGVjb2RlX3ByaW50ZihjaGFyICp4KQoreworCXNwcmludGYoTS54ODYuZGVjb2RlZF9idWYgKyBNLng4Ni5lbmNfc3RyX3BvcywgIiVzIiwgeCk7CisJTS54ODYuZW5jX3N0cl9wb3MgKz0gc3RybGVuKHgpOworfQorCit2b2lkIHg4NmVtdV9kZWNvZGVfcHJpbnRmMihjaGFyICp4LCBpbnQgeSkKK3sKKwljaGFyIHRlbXBbMTAwXTsKKwlzcHJpbnRmKHRlbXAsIHgsIHkpOworCXNwcmludGYoTS54ODYuZGVjb2RlZF9idWYgKyBNLng4Ni5lbmNfc3RyX3BvcywgIiVzIiwgdGVtcCk7CisJTS54ODYuZW5jX3N0cl9wb3MgKz0gc3RybGVuKHRlbXApOworfQorCit2b2lkIHg4NmVtdV9lbmRfaW5zdHIodm9pZCkKK3sKKwlNLng4Ni5lbmNfc3RyX3BvcyA9IDA7CisJTS54ODYuZW5jX3BvcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2VuY29kZWRfYnl0ZXModTE2IHMsIHUxNiBvKQoreworCWludCBpOworCWNoYXIgYnVmMVs2NF07CisJZm9yIChpID0gMDsgaSA8IE0ueDg2LmVuY19wb3M7IGkrKykgeworCQlzcHJpbnRmKGJ1ZjEgKyAyICogaSwgIiUwMngiLCBmZXRjaF9kYXRhX2J5dGVfYWJzKHMsIG8gKyBpKSk7CisJfQorCXByaW50aygiJS0yMHMiLCBidWYxKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZGVjb2RlZF9pbnN0cnVjdGlvbih2b2lkKQoreworCXByaW50aygiJXMiLCBNLng4Ni5kZWNvZGVkX2J1Zik7Cit9CisKK3ZvaWQgeDg2ZW11X3ByaW50X2ludF92ZWN0KHUxNiBpdikKK3sKKwl1MTYgc2VnLCBvZmY7CisKKwlpZiAoaXYgPiAyNTYpCisJCXJldHVybjsKKwlzZWcgPSBmZXRjaF9kYXRhX3dvcmRfYWJzKDAsIGl2ICogNCk7CisJb2ZmID0gZmV0Y2hfZGF0YV93b3JkX2FicygwLCBpdiAqIDQgKyAyKTsKKwlwcmludGsoIiUwNHg6JTA0eCAiLCBzZWcsIG9mZik7Cit9CisKK3ZvaWQgWDg2RU1VX2R1bXBfbWVtb3J5KHUxNiBzZWcsIHUxNiBvZmYsIHUzMiBhbXQpCit7CisJdTMyIHN0YXJ0ID0gb2ZmICYgMHhmZmZmZmZmMDsKKwl1MzIgZW5kID0gKG9mZiArIDE2KSAmIDB4ZmZmZmZmZjA7CisJdTMyIGk7CisJdTMyIGN1cnJlbnQ7CisKKwljdXJyZW50ID0gc3RhcnQ7CisJd2hpbGUgKGVuZCA8PSBvZmYgKyBhbXQpIHsKKwkJcHJpbnRrKCIlMDR4OiUwNHggIiwgc2VnLCBzdGFydCk7CisJCWZvciAoaSA9IHN0YXJ0OyBpIDwgb2ZmOyBpKyspCisJCQlwcmludGsoIiAgICIpOworCQlmb3IgKDsgaSA8IGVuZDsgaSsrKQorCQkJcHJpbnRrKCIlMDJ4ICIsIGZldGNoX2RhdGFfYnl0ZV9hYnMoc2VnLCBpKSk7CisJCXByaW50aygiXG4iKTsKKwkJc3RhcnQgPSBlbmQ7CisJCWVuZCA9IHN0YXJ0ICsgMTY7CisJfQorfQorCit2b2lkIHg4NmVtdV9zaW5nbGVfc3RlcCh2b2lkKQoreworCWNoYXIgc1sxMDI0XTsKKwlpbnQgcHNbMTBdOworCWludCBudG9rOworCWludCBjbWQ7CisJaW50IGRvbmU7CisJaW50IHNlZ21lbnQ7CisJaW50IG9mZnNldDsKKwlzdGF0aWMgaW50IGJyZWFrcG9pbnQ7CisJc3RhdGljIGludCBub0RlY29kZSA9IDE7CisKKwljaGFyICpwOworCisJaWYgKERFQlVHX0JSRUFLKCkpIHsKKwkJaWYgKE0ueDg2LnNhdmVkX2lwICE9IGJyZWFrcG9pbnQpIHsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCU0ueDg2LmRlYnVnICY9IH5ERUJVR19ERUNPREVfTk9QUklOVF9GOworCQkJTS54ODYuZGVidWcgfD0gREVCVUdfVFJBQ0VfRjsKKwkJCU0ueDg2LmRlYnVnICY9IH5ERUJVR19CUkVBS19GOworCQkJcHJpbnRfZGVjb2RlZF9pbnN0cnVjdGlvbigpOworCQkJWDg2RU1VX3RyYWNlX3JlZ3MoKTsKKwkJfQorCX0KKwlkb25lID0gMDsKKwlvZmZzZXQgPSBNLng4Ni5zYXZlZF9pcDsKKwl3aGlsZSAoIWRvbmUpIHsKKwkJcHJpbnRrKCItIik7CisJCWNtZCA9IHBhcnNlX2xpbmUocywgcHMsICZudG9rKTsKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSAndSc6CisJCQlkaXNhc3NlbWJsZV9mb3J3YXJkKE0ueDg2LnNhdmVkX2NzLCAodTE2KSBvZmZzZXQsIDEwKTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWlmIChudG9rID09IDIpIHsKKwkJCQlzZWdtZW50ID0gTS54ODYuc2F2ZWRfY3M7CisJCQkJb2Zmc2V0ID0gcHNbMV07CisJCQkJWDg2RU1VX2R1bXBfbWVtb3J5KHNlZ21lbnQsICh1MTYpIG9mZnNldCwgMTYpOworCQkJCW9mZnNldCArPSAxNjsKKwkJCX0gZWxzZSBpZiAobnRvayA9PSAzKSB7CisJCQkJc2VnbWVudCA9IHBzWzFdOworCQkJCW9mZnNldCA9IHBzWzJdOworCQkJCVg4NkVNVV9kdW1wX21lbW9yeShzZWdtZW50LCAodTE2KSBvZmZzZXQsIDE2KTsKKwkJCQlvZmZzZXQgKz0gMTY7CisJCQl9IGVsc2UgeworCQkJCXNlZ21lbnQgPSBNLng4Ni5zYXZlZF9jczsKKwkJCQlYODZFTVVfZHVtcF9tZW1vcnkoc2VnbWVudCwgKHUxNikgb2Zmc2V0LCAxNik7CisJCQkJb2Zmc2V0ICs9IDE2OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkJTS54ODYuZGVidWcgXj0gREVCVUdfVFJBQ0VDQUxMX0Y7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlNLng4Ni5kZWJ1ZyBePQorCQkJICAgIERFQlVHX1NWQ19GIHwgREVCVUdfU1lTX0YgfCBERUJVR19TWVNJTlRfRjsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCVg4NkVNVV90cmFjZV9yZWdzKCk7CisJCQlicmVhazsKKwkJY2FzZSAneCc6CisJCQlYODZFTVVfdHJhY2VfeHJlZ3MoKTsKKwkJCWJyZWFrOworCQljYXNlICdnJzoKKwkJCWlmIChudG9rID09IDIpIHsKKwkJCQlicmVha3BvaW50ID0gcHNbMV07CisJCQkJaWYgKG5vRGVjb2RlKSB7CisJCQkJCU0ueDg2LmRlYnVnIHw9IERFQlVHX0RFQ09ERV9OT1BSSU5UX0Y7CisJCQkJfSBlbHNlIHsKKwkJCQkJTS54ODYuZGVidWcgJj0gfkRFQlVHX0RFQ09ERV9OT1BSSU5UX0Y7CisJCQkJfQorCQkJCU0ueDg2LmRlYnVnICY9IH5ERUJVR19UUkFDRV9GOworCQkJCU0ueDg2LmRlYnVnIHw9IERFQlVHX0JSRUFLX0Y7CisJCQkJZG9uZSA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAncSc6CisJCQlNLng4Ni5kZWJ1ZyB8PSBERUJVR19FWElUOworCQkJcmV0dXJuOworCQljYXNlICdQJzoKKwkJCW5vRGVjb2RlID0gKG5vRGVjb2RlKSA/IDAgOiAxOworCQkJcHJpbnRrKCJUb2dnbGVkIGRlY29kaW5nIHRvICVzXG4iLAorCQkJICAgICAgIChub0RlY29kZSkgPyAiRkFMU0UiIDogIlRSVUUiKTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJY2FzZSAwOgorCQkJZG9uZSA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworaW50IFg4NkVNVV90cmFjZV9vbih2b2lkKQoreworCXJldHVybiBNLng4Ni5kZWJ1ZyB8PSBERUJVR19TVEVQX0YgfCBERUJVR19ERUNPREVfRiB8IERFQlVHX1RSQUNFX0Y7Cit9CisKK2ludCBYODZFTVVfdHJhY2Vfb2ZmKHZvaWQpCit7CisJcmV0dXJuIE0ueDg2LmRlYnVnICY9IH4oREVCVUdfU1RFUF9GIHwgREVCVUdfREVDT0RFX0YgfCBERUJVR19UUkFDRV9GKTsKK30KKworc3RhdGljIGludCBwYXJzZV9saW5lKGNoYXIgKnMsIGludCAqcHMsIGludCAqbikKK3sKKwlpbnQgY21kOworCisJKm4gPSAwOworCXdoaWxlICgqcyA9PSAnICcgfHwgKnMgPT0gJ1x0JykKKwkJcysrOworCXBzWypuXSA9ICpzOworCXN3aXRjaCAoKnMpIHsKKwljYXNlICdcbic6CisJCSpuICs9IDE7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCWNtZCA9ICpzOworCQkqbiArPSAxOworCX0KKworCXdoaWxlICgxKSB7CisJCXdoaWxlICgqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JyAmJiAqcyAhPSAnXG4nKQorCQkJcysrOworCisJCWlmICgqcyA9PSAnXG4nKQorCQkJcmV0dXJuIGNtZDsKKworCQl3aGlsZSAoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpCisJCQlzKys7CisKKwkJKm4gKz0gMTsKKwl9Cit9CisKKyNlbmRpZgkJCQkvKiBERUJVRyAqLworCit2b2lkIHg4NmVtdV9kdW1wX3JlZ3Modm9pZCkKK3sKKwlwcmludGsoIlx0QVg9JTA0eCAgIiwgTS54ODYuUl9BWCk7CisJcHJpbnRrKCJCWD0lMDR4ICAiLCBNLng4Ni5SX0JYKTsKKwlwcmludGsoIkNYPSUwNHggICIsIE0ueDg2LlJfQ1gpOworCXByaW50aygiRFg9JTA0eCAgIiwgTS54ODYuUl9EWCk7CisJcHJpbnRrKCJTUD0lMDR4ICAiLCBNLng4Ni5SX1NQKTsKKwlwcmludGsoIkJQPSUwNHggICIsIE0ueDg2LlJfQlApOworCXByaW50aygiU0k9JTA0eCAgIiwgTS54ODYuUl9TSSk7CisJcHJpbnRrKCJEST0lMDR4XG4iLCBNLng4Ni5SX0RJKTsKKwlwcmludGsoIlx0RFM9JTA0eCAgIiwgTS54ODYuUl9EUyk7CisJcHJpbnRrKCJFUz0lMDR4ICAiLCBNLng4Ni5SX0VTKTsKKwlwcmludGsoIlNTPSUwNHggICIsIE0ueDg2LlJfU1MpOworCXByaW50aygiQ1M9JTA0eCAgIiwgTS54ODYuUl9DUyk7CisJcHJpbnRrKCJJUD0lMDR4ICAgIiwgTS54ODYuUl9JUCk7CisJaWYgKEFDQ0VTU19GTEFHKEZfT0YpKQorCQlwcmludGsoIk9WICIpOwkvKiBDSEVDS0VELi4uICovCisJZWxzZQorCQlwcmludGsoIk5WICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkKKwkJcHJpbnRrKCJETiAiKTsKKwllbHNlCisJCXByaW50aygiVVAgIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfSUYpKQorCQlwcmludGsoIkVJICIpOworCWVsc2UKKwkJcHJpbnRrKCJESSAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9TRikpCisJCXByaW50aygiTkcgIik7CisJZWxzZQorCQlwcmludGsoIlBMICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX1pGKSkKKwkJcHJpbnRrKCJaUiAiKTsKKwllbHNlCisJCXByaW50aygiTlogIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfQUYpKQorCQlwcmludGsoIkFDICIpOworCWVsc2UKKwkJcHJpbnRrKCJOQSAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9QRikpCisJCXByaW50aygiUEUgIik7CisJZWxzZQorCQlwcmludGsoIlBPICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkKKwkJcHJpbnRrKCJDWSAiKTsKKwllbHNlCisJCXByaW50aygiTkMgIik7CisJcHJpbnRrKCJcbiIpOworfQorCit2b2lkIHg4NmVtdV9kdW1wX3hyZWdzKHZvaWQpCit7CisJcHJpbnRrKCJcdEVBWD0lMDh4ICAiLCBNLng4Ni5SX0VBWCk7CisJcHJpbnRrKCJFQlg9JTA4eCAgIiwgTS54ODYuUl9FQlgpOworCXByaW50aygiRUNYPSUwOHggICIsIE0ueDg2LlJfRUNYKTsKKwlwcmludGsoIkVEWD0lMDh4ICBcbiIsIE0ueDg2LlJfRURYKTsKKwlwcmludGsoIlx0RVNQPSUwOHggICIsIE0ueDg2LlJfRVNQKTsKKwlwcmludGsoIkVCUD0lMDh4ICAiLCBNLng4Ni5SX0VCUCk7CisJcHJpbnRrKCJFU0k9JTA4eCAgIiwgTS54ODYuUl9FU0kpOworCXByaW50aygiRURJPSUwOHhcbiIsIE0ueDg2LlJfRURJKTsKKwlwcmludGsoIlx0RFM9JTA0eCAgIiwgTS54ODYuUl9EUyk7CisJcHJpbnRrKCJFUz0lMDR4ICAiLCBNLng4Ni5SX0VTKTsKKwlwcmludGsoIlNTPSUwNHggICIsIE0ueDg2LlJfU1MpOworCXByaW50aygiQ1M9JTA0eCAgIiwgTS54ODYuUl9DUyk7CisJcHJpbnRrKCJFSVA9JTA4eFxuXHQiLCBNLng4Ni5SX0VJUCk7CisJaWYgKEFDQ0VTU19GTEFHKEZfT0YpKQorCQlwcmludGsoIk9WICIpOwkvKiBDSEVDS0VELi4uICovCisJZWxzZQorCQlwcmludGsoIk5WICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkKKwkJcHJpbnRrKCJETiAiKTsKKwllbHNlCisJCXByaW50aygiVVAgIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfSUYpKQorCQlwcmludGsoIkVJICIpOworCWVsc2UKKwkJcHJpbnRrKCJESSAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9TRikpCisJCXByaW50aygiTkcgIik7CisJZWxzZQorCQlwcmludGsoIlBMICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX1pGKSkKKwkJcHJpbnRrKCJaUiAiKTsKKwllbHNlCisJCXByaW50aygiTlogIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfQUYpKQorCQlwcmludGsoIkFDICIpOworCWVsc2UKKwkJcHJpbnRrKCJOQSAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9QRikpCisJCXByaW50aygiUEUgIik7CisJZWxzZQorCQlwcmludGsoIlBPICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkKKwkJcHJpbnRrKCJDWSAiKTsKKwllbHNlCisJCXByaW50aygiTkMgIik7CisJcHJpbnRrKCJcbiIpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci94ODZlbXUvZGVjb2RlLmMgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IveDg2ZW11L2RlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OWYwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IveDg2ZW11L2RlY29kZS5jCkBAIC0wLDAgKzEsMTE0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKgkJQ29weXJpZ2h0IChDKSAxOTkxLTIwMDQgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqCQkgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4JVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOglBTlNJIEMKKyogRW52aXJvbm1lbnQ6CUFueQorKiBEZXZlbG9wZXI6CUtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjoJVGhpcyBmaWxlIGluY2x1ZGVzIHN1YnJvdXRpbmVzIHdoaWNoIGFyZSByZWxhdGVkIHRvCisqCQlpbnN0cnVjdGlvbiBkZWNvZGluZyBhbmQgYWNjZXNzZXNzIG9mIGltbWVkaWF0ZSBkYXRhIHZpYSBJUC4gIGV0Yy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfQklPU0VNVSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIGFueSBwZW5kaW5nIGFzeWNocm9ub3VzIGludGVycnVwdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgeDg2ZW11X2ludHJfaGFuZGxlKHZvaWQpCit7CisgICAgdTgJaW50bm87CisKKyAgICBpZiAoTS54ODYuaW50ciAmIElOVFJfU1lOQ0gpIHsKKwlpbnRubyA9IE0ueDg2LmludG5vOworCWlmIChfWDg2RU1VX2ludHJUYWJbaW50bm9dKSB7CisJICAgICgqX1g4NkVNVV9pbnRyVGFiW2ludG5vXSkoaW50bm8pOworCX0gZWxzZSB7CisJICAgIHB1c2hfd29yZCgodTE2KU0ueDg2LlJfRkxHKTsKKwkgICAgQ0xFQVJfRkxBRyhGX0lGKTsKKwkgICAgQ0xFQVJfRkxBRyhGX1RGKTsKKwkgICAgcHVzaF93b3JkKE0ueDg2LlJfQ1MpOworCSAgICBNLng4Ni5SX0NTID0gbWVtX2FjY2Vzc193b3JkKGludG5vICogNCArIDIpOworCSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisJICAgIE0ueDg2LlJfSVAgPSBtZW1fYWNjZXNzX3dvcmQoaW50bm8gKiA0KTsKKwkgICAgTS54ODYuaW50ciA9IDA7CisJfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbnRybnVtIC0gSW50ZXJydXB0IG51bWJlciB0byByYWlzZQorCitSRU1BUktTOgorUmFpc2UgdGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQgdG8gYmUgaGFuZGxlZCBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKK25leHQgaW5zdHJ1Y3Rpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVfaW50cl9yYWlzZSgKKyAgICB1OCBpbnRybnVtKQoreworICAgIE0ueDg2LmludG5vID0gaW50cm51bTsKKyAgICBNLng4Ni5pbnRyIHw9IElOVFJfU1lOQ0g7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorTWFpbiBleGVjdXRpb24gbG9vcCBmb3IgdGhlIGVtdWxhdG9yLiBXZSByZXR1cm4gZnJvbSBoZXJlIHdoZW4gdGhlIHN5c3RlbQoraGFsdHMsIHdoaWNoIGlzIG5vcm1hbGx5IGNhdXNlZCBieSBhIHN0YWNrIGZhdWx0IHdoZW4gd2UgcmV0dXJuIGZyb20gdGhlCitvcmlnaW5hbCByZWFsIG1vZGUgY2FsbC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkVNVV9leGVjKHZvaWQpCit7CisgICAgdTggb3AxOworCisgICAgTS54ODYuaW50ciA9IDA7CisgICAgREIoeDg2ZW11X2VuZF9pbnN0cigpOykKKworICAgIGZvciAoOzspIHsKK0RCKAlpZiAoQ0hFQ0tfSVBfRkVUQ0goKSkKKwkgICAgeDg2ZW11X2NoZWNrX2lwX2FjY2VzcygpOykKKwkvKiBJZiBkZWJ1Z2dpbmcsIHNhdmUgdGhlIElQIGFuZCBDUyB2YWx1ZXMuICovCisJU0FWRV9JUF9DUyhNLng4Ni5SX0NTLCBNLng4Ni5SX0lQKTsKKwlJTkNfREVDT0RFRF9JTlNUX0xFTigxKTsKKwlpZiAoTS54ODYuaW50cikgeworCSAgICBpZiAoTS54ODYuaW50ciAmIElOVFJfSEFMVEVEKSB7CitEQigJCWlmIChNLng4Ni5SX1NQICE9IDApIHsKKwkJICAgIHByaW50aygiaGFsdGVkXG4iKTsKKwkJICAgIFg4NkVNVV90cmFjZV9yZWdzKCk7CisJCSAgICB9CisJCWVsc2UgeworCQkgICAgaWYgKE0ueDg2LmRlYnVnKQorCQkJcHJpbnRrKCJTZXJ2aWNlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiIpOworCQkgICAgfSkKKwkJcmV0dXJuOworCSAgICB9CisJICAgIGlmICgoKE0ueDg2LmludHIgJiBJTlRSX1NZTkNIKSAmJiAoTS54ODYuaW50bm8gPT0gMCB8fCBNLng4Ni5pbnRubyA9PSAyKSkgfHwKKwkJIUFDQ0VTU19GTEFHKEZfSUYpKSB7CisJCXg4NmVtdV9pbnRyX2hhbmRsZSgpOworCSAgICB9CisJfQorCW9wMSA9ICgqc3lzX3JkYikoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKyspKTsKKwkoKng4NmVtdV9vcHRhYltvcDFdKShvcDEpOworCWlmIChNLng4Ni5kZWJ1ZyAmIERFQlVHX0VYSVQpIHsKKwkgICAgTS54ODYuZGVidWcgJj0gfkRFQlVHX0VYSVQ7CisJICAgIHJldHVybjsKKwl9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbHRzIHRoZSBzeXN0ZW0gYnkgc2V0dGluZyB0aGUgaGFsdGVkIHN5c3RlbSBmbGFnLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2RU1VX2hhbHRfc3lzKHZvaWQpCit7CisgICAgTS54ODYuaW50ciB8PSBJTlRSX0hBTFRFRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Cittb2QJLSBNb2QgdmFsdWUgZnJvbSBkZWNvZGVkIGJ5dGUKK3JlZ2gJLSBSZWcgaCB2YWx1ZSBmcm9tIGRlY29kZWQgYnl0ZQorcmVnbAktIFJlZyBsIHZhbHVlIGZyb20gZGVjb2RlZCBieXRlCisKK1JFTUFSS1M6CitSYWlzZSB0aGUgc3BlY2lmaWVkIGludGVycnVwdCB0byBiZSBoYW5kbGVkIGJlZm9yZSB0aGUgZXhlY3V0aW9uIG9mIHRoZQorbmV4dCBpbnN0cnVjdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uLCBhcyAoKnN5c19yZGIpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZmV0Y2hfZGVjb2RlX21vZHJtKAorICAgIGludCAqbW9kLAorICAgIGludCAqcmVnaCwKKyAgICBpbnQgKnJlZ2wpCit7CisgICAgaW50IGZldGNoZWQ7CisKK0RCKCBpZiAoQ0hFQ0tfSVBfRkVUQ0goKSkKKwl4ODZlbXVfY2hlY2tfaXBfYWNjZXNzKCk7KQorICAgIGZldGNoZWQgPSAoKnN5c19yZGIpKCgodTMyKU0ueDg2LlJfQ1MgPDwgNCkgKyAoTS54ODYuUl9JUCsrKSk7CisgICAgSU5DX0RFQ09ERURfSU5TVF9MRU4oMSk7CisgICAgKm1vZCAgPSAoZmV0Y2hlZCA+PiA2KSAmIDB4MDM7CisgICAgKnJlZ2ggPSAoZmV0Y2hlZCA+PiAzKSAmIDB4MDc7CisgICAgKnJlZ2wgPSAoZmV0Y2hlZCA+PiAwKSAmIDB4MDc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRVRVUk5TOgorSW1tZWRpYXRlIGJ5dGUgdmFsdWUgcmVhZCBmcm9tIGluc3RydWN0aW9uIHF1ZXVlCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGltbWVkaWF0ZSBieXRlIGZyb20gdGhlIGluc3RydWN0aW9uIHF1ZXVlLCBhbmQKK21vdmVzIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIHRvIHRoZSBuZXh0IHZhbHVlLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24sIGFzICgqc3lzX3JkYikgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggZmV0Y2hfYnl0ZV9pbW0odm9pZCkKK3sKKyAgICB1OCBmZXRjaGVkOworCitEQiggaWYgKENIRUNLX0lQX0ZFVENIKCkpCisJeDg2ZW11X2NoZWNrX2lwX2FjY2VzcygpOykKKyAgICBmZXRjaGVkID0gKCpzeXNfcmRiKSgoKHUzMilNLng4Ni5SX0NTIDw8IDQpICsgKE0ueDg2LlJfSVArKykpOworICAgIElOQ19ERUNPREVEX0lOU1RfTEVOKDEpOworICAgIHJldHVybiBmZXRjaGVkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK0ltbWVkaWF0ZSB3b3JkIHZhbHVlIHJlYWQgZnJvbSBpbnN0cnVjdGlvbiBxdWV1ZQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbW1lZGlhdGUgYnl0ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbiBxdWV1ZSwgYW5kCittb3ZlcyB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciB0byB0aGUgbmV4dCB2YWx1ZS4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uLCBhcyAoKnN5c19yZHcpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBmZXRjaF93b3JkX2ltbSh2b2lkKQoreworICAgIHUxNiBmZXRjaGVkOworCitEQiggaWYgKENIRUNLX0lQX0ZFVENIKCkpCisJeDg2ZW11X2NoZWNrX2lwX2FjY2VzcygpOykKKyAgICBmZXRjaGVkID0gKCpzeXNfcmR3KSgoKHUzMilNLng4Ni5SX0NTIDw8IDQpICsgKE0ueDg2LlJfSVApKTsKKyAgICBNLng4Ni5SX0lQICs9IDI7CisgICAgSU5DX0RFQ09ERURfSU5TVF9MRU4oMik7CisgICAgcmV0dXJuIGZldGNoZWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRVRVUk5TOgorSW1tZWRpYXRlIGxvbmUgdmFsdWUgcmVhZCBmcm9tIGluc3RydWN0aW9uIHF1ZXVlCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGltbWVkaWF0ZSBieXRlIGZyb20gdGhlIGluc3RydWN0aW9uIHF1ZXVlLCBhbmQKK21vdmVzIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIHRvIHRoZSBuZXh0IHZhbHVlLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24sIGFzICgqc3lzX3JkdykgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGZldGNoX2xvbmdfaW1tKHZvaWQpCit7CisgICAgdTMyIGZldGNoZWQ7CisKK0RCKCBpZiAoQ0hFQ0tfSVBfRkVUQ0goKSkKKwl4ODZlbXVfY2hlY2tfaXBfYWNjZXNzKCk7KQorICAgIGZldGNoZWQgPSAoKnN5c19yZGwpKCgodTMyKU0ueDg2LlJfQ1MgPDwgNCkgKyAoTS54ODYuUl9JUCkpOworICAgIE0ueDg2LlJfSVAgKz0gNDsKKyAgICBJTkNfREVDT0RFRF9JTlNUX0xFTig0KTsKKyAgICByZXR1cm4gZmV0Y2hlZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFVFVSTlM6CitWYWx1ZSBvZiB0aGUgZGVmYXVsdCBkYXRhIHNlZ21lbnQKKworUkVNQVJLUzoKK0lubGluZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGRlZmF1bHQgZGF0YSBzZWdtZW50IGZvciB0aGUgY3VycmVudAoraW5zdHJ1Y3Rpb24uCisKK09uIHRoZSB4ODYgcHJvY2Vzc29yLCB0aGUgZGVmYXVsdCBzZWdtZW50IGlzIG5vdCBhbHdheXMgRFMgaWYgdGhlcmUgaXMKK25vIHNlZ21lbnQgb3ZlcnJpZGUuIEFkZHJlc3MgbW9kZXMgc3VjaCBhcyAtM1tCUF0gb3IgMTBbQlArU0ldIGFsbCByZWZlciB0bworYWRkcmVzc2VzIHJlbGF0aXZlIHRvIFNTIChpZTogb24gdGhlIHN0YWNrKS4gU28sIGF0IHRoZSBtaW5pbXVtLCBhbGwKK2RlY29kaW5ncyBvZiBhZGRyZXNzaW5nIG1vZGVzIHdvdWxkIGhhdmUgdG8gc2V0L2NsZWFyIGEgYml0IGRlc2NyaWJpbmcKK3doZXRoZXIgdGhlIGFjY2VzcyBpcyByZWxhdGl2ZSB0byBEUyBvciBTUy4gIFRoYXQgaXMgdGhlIGZ1bmN0aW9uIG9mIHRoZQorY3B1LXN0YXRlLXZhcmlibGUgTS54ODYubW9kZS4gVGhlcmUgYXJlIHNldmVyYWwgcG90ZW50aWFsIHN0YXRlczoKKworICAgIHJlcGUgcHJlZml4IHNlZW4gIChoYW5kbGVkIGVsc2V3aGVyZSkKKyAgICByZXBuZSBwcmVmaXggc2VlbiAgKGRpdHRvKQorCisgICAgY3Mgc2VnbWVudCBvdmVycmlkZQorICAgIGRzIHNlZ21lbnQgb3ZlcnJpZGUKKyAgICBlcyBzZWdtZW50IG92ZXJyaWRlCisgICAgZnMgc2VnbWVudCBvdmVycmlkZQorICAgIGdzIHNlZ21lbnQgb3ZlcnJpZGUKKyAgICBzcyBzZWdtZW50IG92ZXJyaWRlCisKKyAgICBkcy9zcyBzZWxlY3QgKGluIGFic2Vuc2Ugb2Ygb3ZlcnJpZGUpCisKK0VhY2ggb2YgdGhlIGFib3ZlIDcgaXRlbXMgYXJlIGhhbmRsZWQgd2l0aCBhIGJpdCBpbiB0aGUgbW9kZSBmaWVsZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitfSU5MSU5FIHUzMiBnZXRfZGF0YV9zZWdtZW50KHZvaWQpCit7CisjZGVmaW5lIEdFVF9TRUdNRU5UKHNlZ21lbnQpCisgICAgc3dpdGNoIChNLng4Ni5tb2RlICYgU1lTTU9ERV9TRUdNQVNLKSB7CisgICAgICBjYXNlIDA6CQkJLyogZGVmYXVsdCBjYXNlOiB1c2UgZHMgcmVnaXN0ZXIgKi8KKyAgICAgIGNhc2UgU1lTTU9ERV9TRUdPVlJfRFM6CisgICAgICBjYXNlIFNZU01PREVfU0VHT1ZSX0RTIHwgU1lTTU9ERV9TRUdfRFNfU1M6CisJcmV0dXJuCU0ueDg2LlJfRFM7CisgICAgICBjYXNlIFNZU01PREVfU0VHX0RTX1NTOgkvKiBub24tb3ZlcnJpZGRlbiwgdXNlIHNzIHJlZ2lzdGVyICovCisJcmV0dXJuCU0ueDg2LlJfU1M7CisgICAgICBjYXNlIFNZU01PREVfU0VHT1ZSX0NTOgorICAgICAgY2FzZSBTWVNNT0RFX1NFR09WUl9DUyB8IFNZU01PREVfU0VHX0RTX1NTOgorCXJldHVybglNLng4Ni5SX0NTOworICAgICAgY2FzZSBTWVNNT0RFX1NFR09WUl9FUzoKKyAgICAgIGNhc2UgU1lTTU9ERV9TRUdPVlJfRVMgfCBTWVNNT0RFX1NFR19EU19TUzoKKwlyZXR1cm4JTS54ODYuUl9FUzsKKyAgICAgIGNhc2UgU1lTTU9ERV9TRUdPVlJfRlM6CisgICAgICBjYXNlIFNZU01PREVfU0VHT1ZSX0ZTIHwgU1lTTU9ERV9TRUdfRFNfU1M6CisJcmV0dXJuCU0ueDg2LlJfRlM7CisgICAgICBjYXNlIFNZU01PREVfU0VHT1ZSX0dTOgorICAgICAgY2FzZSBTWVNNT0RFX1NFR09WUl9HUyB8IFNZU01PREVfU0VHX0RTX1NTOgorCXJldHVybglNLng4Ni5SX0dTOworICAgICAgY2FzZSBTWVNNT0RFX1NFR09WUl9TUzoKKyAgICAgIGNhc2UgU1lTTU9ERV9TRUdPVlJfU1MgfCBTWVNNT0RFX1NFR19EU19TUzoKKwlyZXR1cm4JTS54ODYuUl9TUzsKKyAgICAgIGRlZmF1bHQ6CisjaWZkZWYJREVCVUcKKwlwcmludGsoImVycm9yOiBzaG91bGQgbm90IGhhcHBlbjogIG11bHRpcGxlIG92ZXJyaWRlcy5cbiIpOworI2VuZGlmCisJSEFMVF9TWVMoKTsKKwlyZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorb2Zmc2V0CS0gT2Zmc2V0IHRvIGxvYWQgZGF0YSBmcm9tCisKK1JFVFVSTlM6CitCeXRlIHZhbHVlIHJlYWQgZnJvbSB0aGUgYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBmZXRjaF9kYXRhX2J5dGUoCisgICAgdWludCBvZmZzZXQpCit7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MoKHUxNilnZXRfZGF0YV9zZWdtZW50KCksIG9mZnNldCk7CisjZW5kaWYKKyAgICByZXR1cm4gKCpzeXNfcmRiKSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitvZmZzZXQJLSBPZmZzZXQgdG8gbG9hZCBkYXRhIGZyb20KKworUkVUVVJOUzoKK1dvcmQgdmFsdWUgcmVhZCBmcm9tIHRoZSBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBmZXRjaF9kYXRhX3dvcmQoCisgICAgdWludCBvZmZzZXQpCit7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MoKHUxNilnZXRfZGF0YV9zZWdtZW50KCksIG9mZnNldCk7CisjZW5kaWYKKyAgICByZXR1cm4gKCpzeXNfcmR3KSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitvZmZzZXQJLSBPZmZzZXQgdG8gbG9hZCBkYXRhIGZyb20KKworUkVUVVJOUzoKK0xvbmcgdmFsdWUgcmVhZCBmcm9tIHRoZSBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBmZXRjaF9kYXRhX2xvbmcoCisgICAgdWludCBvZmZzZXQpCit7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MoKHUxNilnZXRfZGF0YV9zZWdtZW50KCksIG9mZnNldCk7CisjZW5kaWYKKyAgICByZXR1cm4gKCpzeXNfcmRsKSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitzZWdtZW50IC0gU2VnbWVudCB0byBsb2FkIGRhdGEgZnJvbQorb2Zmc2V0CS0gT2Zmc2V0IHRvIGxvYWQgZGF0YSBmcm9tCisKK1JFVFVSTlM6CitCeXRlIHZhbHVlIHJlYWQgZnJvbSB0aGUgYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBmZXRjaF9kYXRhX2J5dGVfYWJzKAorICAgIHVpbnQgc2VnbWVudCwKKyAgICB1aW50IG9mZnNldCkKK3sKKyNpZmRlZiBERUJVRworICAgIGlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQorCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcyhzZWdtZW50LCBvZmZzZXQpOworI2VuZGlmCisgICAgcmV0dXJuICgqc3lzX3JkYikoKCh1MzIpc2VnbWVudCA8PCA0KSArIG9mZnNldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2VnbWVudCAtIFNlZ21lbnQgdG8gbG9hZCBkYXRhIGZyb20KK29mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQorCitSRVRVUk5TOgorV29yZCB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IGZldGNoX2RhdGFfd29yZF9hYnMoCisgICAgdWludCBzZWdtZW50LAorICAgIHVpbnQgb2Zmc2V0KQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7CisjZW5kaWYKKyAgICByZXR1cm4gKCpzeXNfcmR3KSgoKHUzMilzZWdtZW50IDw8IDQpICsgb2Zmc2V0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitzZWdtZW50IC0gU2VnbWVudCB0byBsb2FkIGRhdGEgZnJvbQorb2Zmc2V0CS0gT2Zmc2V0IHRvIGxvYWQgZGF0YSBmcm9tCisKK1JFVFVSTlM6CitMb25nIHZhbHVlIHJlYWQgZnJvbSB0aGUgYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZmV0Y2hfZGF0YV9sb25nX2FicygKKyAgICB1aW50IHNlZ21lbnQsCisgICAgdWludCBvZmZzZXQpCit7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3Moc2VnbWVudCwgb2Zmc2V0KTsKKyNlbmRpZgorICAgIHJldHVybiAoKnN5c19yZGwpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK29mZnNldAktIE9mZnNldCB0byBzdG9yZSBkYXRhIGF0Cit2YWwJLSBWYWx1ZSB0byBzdG9yZQorCitSRU1BUktTOgorV3JpdGVzIGEgd29yZCB2YWx1ZSB0byBhbiBzZWdtZW50ZWQgbWVtb3J5IGxvY2F0aW9uLiBUaGUgc2VnbWVudCB1c2VkIGlzCit0aGUgY3VycmVudCAnZGVmYXVsdCcgc2VnbWVudCwgd2hpY2ggbWF5IGhhdmUgYmVlbiBvdmVycmlkZGVuLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHN0b3JlX2RhdGFfYnl0ZSgKKyAgICB1aW50IG9mZnNldCwKKyAgICB1OCB2YWwpCit7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MoKHUxNilnZXRfZGF0YV9zZWdtZW50KCksIG9mZnNldCk7CisjZW5kaWYKKyAgICAoKnN5c193cmIpKChnZXRfZGF0YV9zZWdtZW50KCkgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorb2Zmc2V0CS0gT2Zmc2V0IHRvIHN0b3JlIGRhdGEgYXQKK3ZhbAktIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSB3b3JkIHZhbHVlIHRvIGFuIHNlZ21lbnRlZCBtZW1vcnkgbG9jYXRpb24uIFRoZSBzZWdtZW50IHVzZWQgaXMKK3RoZSBjdXJyZW50ICdkZWZhdWx0JyBzZWdtZW50LCB3aGljaCBtYXkgaGF2ZSBiZWVuIG92ZXJyaWRkZW4uCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3RvcmVfZGF0YV93b3JkKAorICAgIHVpbnQgb2Zmc2V0LAorICAgIHUxNiB2YWwpCit7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MoKHUxNilnZXRfZGF0YV9zZWdtZW50KCksIG9mZnNldCk7CisjZW5kaWYKKyAgICAoKnN5c193cncpKChnZXRfZGF0YV9zZWdtZW50KCkgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorb2Zmc2V0CS0gT2Zmc2V0IHRvIHN0b3JlIGRhdGEgYXQKK3ZhbAktIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSBsb25nIHZhbHVlIHRvIGFuIHNlZ21lbnRlZCBtZW1vcnkgbG9jYXRpb24uIFRoZSBzZWdtZW50IHVzZWQgaXMKK3RoZSBjdXJyZW50ICdkZWZhdWx0JyBzZWdtZW50LCB3aGljaCBtYXkgaGF2ZSBiZWVuIG92ZXJyaWRkZW4uCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3RvcmVfZGF0YV9sb25nKAorICAgIHVpbnQgb2Zmc2V0LAorICAgIHUzMiB2YWwpCit7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MoKHUxNilnZXRfZGF0YV9zZWdtZW50KCksIG9mZnNldCk7CisjZW5kaWYKKyAgICAoKnN5c193cmwpKChnZXRfZGF0YV9zZWdtZW50KCkgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2VnbWVudCAtIFNlZ21lbnQgdG8gc3RvcmUgZGF0YSBhdAorb2Zmc2V0CS0gT2Zmc2V0IHRvIHN0b3JlIGRhdGEgYXQKK3ZhbAktIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSBieXRlIHZhbHVlIHRvIGFuIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzdG9yZV9kYXRhX2J5dGVfYWJzKAorICAgIHVpbnQgc2VnbWVudCwKKyAgICB1aW50IG9mZnNldCwKKyAgICB1OCB2YWwpCit7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3Moc2VnbWVudCwgb2Zmc2V0KTsKKyNlbmRpZgorICAgICgqc3lzX3dyYikoKCh1MzIpc2VnbWVudCA8PCA0KSArIG9mZnNldCwgdmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitzZWdtZW50IC0gU2VnbWVudCB0byBzdG9yZSBkYXRhIGF0CitvZmZzZXQJLSBPZmZzZXQgdG8gc3RvcmUgZGF0YSBhdAordmFsCS0gVmFsdWUgdG8gc3RvcmUKKworUkVNQVJLUzoKK1dyaXRlcyBhIHdvcmQgdmFsdWUgdG8gYW4gYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHN0b3JlX2RhdGFfd29yZF9hYnMoCisgICAgdWludCBzZWdtZW50LAorICAgIHVpbnQgb2Zmc2V0LAorICAgIHUxNiB2YWwpCit7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3Moc2VnbWVudCwgb2Zmc2V0KTsKKyNlbmRpZgorICAgICgqc3lzX3dydykoKCh1MzIpc2VnbWVudCA8PCA0KSArIG9mZnNldCwgdmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitzZWdtZW50IC0gU2VnbWVudCB0byBzdG9yZSBkYXRhIGF0CitvZmZzZXQJLSBPZmZzZXQgdG8gc3RvcmUgZGF0YSBhdAordmFsCS0gVmFsdWUgdG8gc3RvcmUKKworUkVNQVJLUzoKK1dyaXRlcyBhIGxvbmcgdmFsdWUgdG8gYW4gYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHN0b3JlX2RhdGFfbG9uZ19hYnMoCisgICAgdWludCBzZWdtZW50LAorICAgIHVpbnQgb2Zmc2V0LAorICAgIHUzMiB2YWwpCit7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3Moc2VnbWVudCwgb2Zmc2V0KTsKKyNlbmRpZgorICAgICgqc3lzX3dybCkoKCh1MzIpc2VnbWVudCA8PCA0KSArIG9mZnNldCwgdmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CityZWcgLSBSZWdpc3RlciB0byBkZWNvZGUKKworUkVUVVJOUzoKK1BvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyCisKK1JFTUFSS1M6CitSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWdpc3RlciBnaXZlbiBieSB0aGUgUi9STSBmaWVsZCBvZiB0aGUKK21vZHJtIGJ5dGUsIGZvciBieXRlIG9wZXJhbmRzLiBBbHNvIGVuYWJsZXMgdGhlIGRlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCogZGVjb2RlX3JtX2J5dGVfcmVnaXN0ZXIoCisgICAgaW50IHJlZykKK3sKKyAgICBzd2l0Y2ggKHJlZykgeworICAgICAgY2FzZSAwOgorCURFQ09ERV9QUklOVEYoIkFMIik7CisJcmV0dXJuICZNLng4Ni5SX0FMOworICAgICAgY2FzZSAxOgorCURFQ09ERV9QUklOVEYoIkNMIik7CisJcmV0dXJuICZNLng4Ni5SX0NMOworICAgICAgY2FzZSAyOgorCURFQ09ERV9QUklOVEYoIkRMIik7CisJcmV0dXJuICZNLng4Ni5SX0RMOworICAgICAgY2FzZSAzOgorCURFQ09ERV9QUklOVEYoIkJMIik7CisJcmV0dXJuICZNLng4Ni5SX0JMOworICAgICAgY2FzZSA0OgorCURFQ09ERV9QUklOVEYoIkFIIik7CisJcmV0dXJuICZNLng4Ni5SX0FIOworICAgICAgY2FzZSA1OgorCURFQ09ERV9QUklOVEYoIkNIIik7CisJcmV0dXJuICZNLng4Ni5SX0NIOworICAgICAgY2FzZSA2OgorCURFQ09ERV9QUklOVEYoIkRIIik7CisJcmV0dXJuICZNLng4Ni5SX0RIOworICAgICAgY2FzZSA3OgorCURFQ09ERV9QUklOVEYoIkJIIik7CisJcmV0dXJuICZNLng4Ni5SX0JIOworICAgIH0KKyAgICBIQUxUX1NZUygpOworICAgIHJldHVybiBOVUxMOwkJLyogTk9UIFJFQUNIRUQgT1IgUkVBQ0hFRCBPTiBFUlJPUiAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3JlZyAtIFJlZ2lzdGVyIHRvIGRlY29kZQorCitSRVRVUk5TOgorUG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIKKworUkVNQVJLUzoKK1JldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVyIGdpdmVuIGJ5IHRoZSBSL1JNIGZpZWxkIG9mIHRoZQorbW9kcm0gYnl0ZSwgZm9yIHdvcmQgb3BlcmFuZHMuCUFsc28gZW5hYmxlcyB0aGUgZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiogZGVjb2RlX3JtX3dvcmRfcmVnaXN0ZXIoCisgICAgaW50IHJlZykKK3sKKyAgICBzd2l0Y2ggKHJlZykgeworICAgICAgY2FzZSAwOgorCURFQ09ERV9QUklOVEYoIkFYIik7CisJcmV0dXJuICZNLng4Ni5SX0FYOworICAgICAgY2FzZSAxOgorCURFQ09ERV9QUklOVEYoIkNYIik7CisJcmV0dXJuICZNLng4Ni5SX0NYOworICAgICAgY2FzZSAyOgorCURFQ09ERV9QUklOVEYoIkRYIik7CisJcmV0dXJuICZNLng4Ni5SX0RYOworICAgICAgY2FzZSAzOgorCURFQ09ERV9QUklOVEYoIkJYIik7CisJcmV0dXJuICZNLng4Ni5SX0JYOworICAgICAgY2FzZSA0OgorCURFQ09ERV9QUklOVEYoIlNQIik7CisJcmV0dXJuICZNLng4Ni5SX1NQOworICAgICAgY2FzZSA1OgorCURFQ09ERV9QUklOVEYoIkJQIik7CisJcmV0dXJuICZNLng4Ni5SX0JQOworICAgICAgY2FzZSA2OgorCURFQ09ERV9QUklOVEYoIlNJIik7CisJcmV0dXJuICZNLng4Ni5SX1NJOworICAgICAgY2FzZSA3OgorCURFQ09ERV9QUklOVEYoIkRJIik7CisJcmV0dXJuICZNLng4Ni5SX0RJOworICAgIH0KKyAgICBIQUxUX1NZUygpOworICAgIHJldHVybiBOVUxMOwkJLyogTk9UUkVBQ0hFRCBPUiBSRUFDSEVEIE9OIEVSUk9SICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcmVnIC0gUmVnaXN0ZXIgdG8gZGVjb2RlCisKK1JFVFVSTlM6CitQb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcgorCitSRU1BUktTOgorUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVnaXN0ZXIgZ2l2ZW4gYnkgdGhlIFIvUk0gZmllbGQgb2YgdGhlCittb2RybSBieXRlLCBmb3IgZHdvcmQgb3BlcmFuZHMuCSBBbHNvIGVuYWJsZXMgdGhlIGRlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIqIGRlY29kZV9ybV9sb25nX3JlZ2lzdGVyKAorICAgIGludCByZWcpCit7CisgICAgc3dpdGNoIChyZWcpIHsKKyAgICAgIGNhc2UgMDoKKwlERUNPREVfUFJJTlRGKCJFQVgiKTsKKwlyZXR1cm4gJk0ueDg2LlJfRUFYOworICAgICAgY2FzZSAxOgorCURFQ09ERV9QUklOVEYoIkVDWCIpOworCXJldHVybiAmTS54ODYuUl9FQ1g7CisgICAgICBjYXNlIDI6CisJREVDT0RFX1BSSU5URigiRURYIik7CisJcmV0dXJuICZNLng4Ni5SX0VEWDsKKyAgICAgIGNhc2UgMzoKKwlERUNPREVfUFJJTlRGKCJFQlgiKTsKKwlyZXR1cm4gJk0ueDg2LlJfRUJYOworICAgICAgY2FzZSA0OgorCURFQ09ERV9QUklOVEYoIkVTUCIpOworCXJldHVybiAmTS54ODYuUl9FU1A7CisgICAgICBjYXNlIDU6CisJREVDT0RFX1BSSU5URigiRUJQIik7CisJcmV0dXJuICZNLng4Ni5SX0VCUDsKKyAgICAgIGNhc2UgNjoKKwlERUNPREVfUFJJTlRGKCJFU0kiKTsKKwlyZXR1cm4gJk0ueDg2LlJfRVNJOworICAgICAgY2FzZSA3OgorCURFQ09ERV9QUklOVEYoIkVESSIpOworCXJldHVybiAmTS54ODYuUl9FREk7CisgICAgfQorICAgIEhBTFRfU1lTKCk7CisgICAgcmV0dXJuIE5VTEw7CQkvKiBOT1RSRUFDSEVEIE9SIFJFQUNIRUQgT04gRVJST1IgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CityZWcgLSBSZWdpc3RlciB0byBkZWNvZGUKKworUkVUVVJOUzoKK1BvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyCisKK1JFTUFSS1M6CitSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWdpc3RlciBnaXZlbiBieSB0aGUgUi9STSBmaWVsZCBvZiB0aGUKK21vZHJtIGJ5dGUsIGZvciB3b3JkIG9wZXJhbmRzLCBtb2RpZmllZCBmcm9tIGFib3ZlIGZvciB0aGUgd2VpcmRvCitzcGVjaWFsIGNhc2Ugb2Ygc2VncmVnIG9wZXJhbmRzLiAgQWxzbyBlbmFibGVzIHRoZSBkZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2KiBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKAorICAgIGludCByZWcpCit7CisgICAgc3dpdGNoIChyZWcpIHsKKyAgICAgIGNhc2UgMDoKKwlERUNPREVfUFJJTlRGKCJFUyIpOworCXJldHVybiAmTS54ODYuUl9FUzsKKyAgICAgIGNhc2UgMToKKwlERUNPREVfUFJJTlRGKCJDUyIpOworCXJldHVybiAmTS54ODYuUl9DUzsKKyAgICAgIGNhc2UgMjoKKwlERUNPREVfUFJJTlRGKCJTUyIpOworCXJldHVybiAmTS54ODYuUl9TUzsKKyAgICAgIGNhc2UgMzoKKwlERUNPREVfUFJJTlRGKCJEUyIpOworCXJldHVybiAmTS54ODYuUl9EUzsKKyAgICAgIGNhc2UgNDoKKwlERUNPREVfUFJJTlRGKCJGUyIpOworCXJldHVybiAmTS54ODYuUl9GUzsKKyAgICAgIGNhc2UgNToKKwlERUNPREVfUFJJTlRGKCJHUyIpOworCXJldHVybiAmTS54ODYuUl9HUzsKKyAgICAgIGNhc2UgNjoKKyAgICAgIGNhc2UgNzoKKwlERUNPREVfUFJJTlRGKCJJTExFR0FMIFNFR1JFRyIpOworCWJyZWFrOworICAgIH0KKyAgICBIQUxUX1NZUygpOworICAgIHJldHVybiBOVUxMOwkJLyogTk9UIFJFQUNIRUQgT1IgUkVBQ0hFRCBPTiBFUlJPUiAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NjYWxlIC0gc2NhbGUgdmFsdWUgb2YgU0lCIGJ5dGUKK2luZGV4IC0gaW5kZXggdmFsdWUgb2YgU0lCIGJ5dGUKKworUkVUVVJOUzoKK1ZhbHVlIG9mIHNjYWxlICogaW5kZXgKKworUkVNQVJLUzoKK0RlY29kZXMgc2NhbGUvaW5kZXggb2YgU0lCIGJ5dGUgYW5kIHJldHVybnMgcmVsZXZhbnQgb2Zmc2V0IHBhcnQgb2YKK2VmZmVjdGl2ZSBhZGRyZXNzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGRlY29kZV9zaWJfc2koCisgICAgaW50IHNjYWxlLAorICAgIGludCBpbmRleCkKK3sKKyAgICBzY2FsZSA9IDEgPDwgc2NhbGU7CisgICAgaWYgKHNjYWxlID4gMSkgeworCURFQ09ERV9QUklOVEYyKCJbJWQqIiwgc2NhbGUpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiWyIpOworICAgIH0KKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICBjYXNlIDA6CisJREVDT0RFX1BSSU5URigiRUFYXSIpOworCXJldHVybiBNLng4Ni5SX0VBWCAqIGluZGV4OworICAgICAgY2FzZSAxOgorCURFQ09ERV9QUklOVEYoIkVDWF0iKTsKKwlyZXR1cm4gTS54ODYuUl9FQ1ggKiBpbmRleDsKKyAgICAgIGNhc2UgMjoKKwlERUNPREVfUFJJTlRGKCJFRFhdIik7CisJcmV0dXJuIE0ueDg2LlJfRURYICogaW5kZXg7CisgICAgICBjYXNlIDM6CisJREVDT0RFX1BSSU5URigiRUJYXSIpOworCXJldHVybiBNLng4Ni5SX0VCWCAqIGluZGV4OworICAgICAgY2FzZSA0OgorCURFQ09ERV9QUklOVEYoIjBdIik7CisJcmV0dXJuIDA7CisgICAgICBjYXNlIDU6CisJREVDT0RFX1BSSU5URigiRUJQXSIpOworCXJldHVybiBNLng4Ni5SX0VCUCAqIGluZGV4OworICAgICAgY2FzZSA2OgorCURFQ09ERV9QUklOVEYoIkVTSV0iKTsKKwlyZXR1cm4gTS54ODYuUl9FU0kgKiBpbmRleDsKKyAgICAgIGNhc2UgNzoKKwlERUNPREVfUFJJTlRGKCJFREldIik7CisJcmV0dXJuIE0ueDg2LlJfRURJICogaW5kZXg7CisgICAgfQorICAgIEhBTFRfU1lTKCk7CisgICAgcmV0dXJuIDA7CQkJLyogTk9UIFJFQUNIRUQgT1IgUkVBQ0hFRCBPTiBFUlJPUiAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK21vZCAtIE1PRCB2YWx1ZSBvZiBwcmVjZWRpbmcgTW9kUi9NIGJ5dGUKKworUkVUVVJOUzoKK09mZnNldCBpbiBtZW1vcnkgZm9yIHRoZSBhZGRyZXNzIGRlY29kaW5nCisKK1JFTUFSS1M6CitEZWNvZGVzIFNJQiBhZGRyZXNzaW5nIGJ5dGUgYW5kIHJldHVybnMgY2FsY3VsYXRlZCBlZmZlY3RpdmUgYWRkcmVzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBkZWNvZGVfc2liX2FkZHJlc3MoCisgICAgaW50IG1vZCkKK3sKKyAgICBpbnQgc2liICAgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgIGludCBzcyAgICA9IChzaWIgPj4gNikgJiAweDAzOworICAgIGludCBpbmRleCA9IChzaWIgPj4gMykgJiAweDA3OworICAgIGludCBiYXNlICA9IHNpYiAmIDB4MDc7CisgICAgaW50IG9mZnNldCA9IDA7CisgICAgaW50IGRpc3BsYWNlbWVudDsKKworICAgIHN3aXRjaCAoYmFzZSkgeworICAgICAgY2FzZSAwOgorCURFQ09ERV9QUklOVEYoIltFQVhdIik7CisJb2Zmc2V0ID0gTS54ODYuUl9FQVg7CisJYnJlYWs7CisgICAgICBjYXNlIDE6CisJREVDT0RFX1BSSU5URigiW0VDWF0iKTsKKwlvZmZzZXQgPSBNLng4Ni5SX0VDWDsKKwlicmVhazsKKyAgICAgIGNhc2UgMjoKKwlERUNPREVfUFJJTlRGKCJbRURYXSIpOworCW9mZnNldCA9IE0ueDg2LlJfRURYOworCWJyZWFrOworICAgICAgY2FzZSAzOgorCURFQ09ERV9QUklOVEYoIltFQlhdIik7CisJb2Zmc2V0ID0gTS54ODYuUl9FQlg7CisJYnJlYWs7CisgICAgICBjYXNlIDQ6CisJREVDT0RFX1BSSU5URigiW0VTUF0iKTsKKwlvZmZzZXQgPSBNLng4Ni5SX0VTUDsKKwlicmVhazsKKyAgICAgIGNhc2UgNToKKwlzd2l0Y2ggKG1vZCkgeworCSAgY2FzZSAwOgorCSAgICBkaXNwbGFjZW1lbnQgPSAoczMyKWZldGNoX2xvbmdfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCJbJWRdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgb2Zmc2V0ID0gZGlzcGxhY2VtZW50OworCSAgICBicmVhazsKKwkgIGNhc2UgMToKKwkgICAgZGlzcGxhY2VtZW50ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCJbJWRdW0VCUF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICBvZmZzZXQgPSBNLng4Ni5SX0VCUCArIGRpc3BsYWNlbWVudDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDI6CisJICAgIGRpc3BsYWNlbWVudCA9IChzMzIpZmV0Y2hfbG9uZ19pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIlslZF1bRUJQXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIG9mZnNldCA9IE0ueDg2LlJfRUJQICsgZGlzcGxhY2VtZW50OworCSAgICBicmVhazsKKwkgIGRlZmF1bHQ6CisJICAgIEhBTFRfU1lTKCk7CisJfQorCURFQ09ERV9QUklOVEYoIltFQVhdIik7CisJb2Zmc2V0ID0gTS54ODYuUl9FQVg7CisJYnJlYWs7CisgICAgICBjYXNlIDY6CisJREVDT0RFX1BSSU5URigiW0VTSV0iKTsKKwlvZmZzZXQgPSBNLng4Ni5SX0VTSTsKKwlicmVhazsKKyAgICAgIGNhc2UgNzoKKwlERUNPREVfUFJJTlRGKCJbRURJXSIpOworCW9mZnNldCA9IE0ueDg2LlJfRURJOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlIQUxUX1NZUygpOworICAgIH0KKyAgICBvZmZzZXQgKz0gZGVjb2RlX3NpYl9zaShzcywgaW5kZXgpOworICAgIHJldHVybiBvZmZzZXQ7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitybSAgLSBSTSB2YWx1ZSB0byBkZWNvZGUKKworUkVUVVJOUzoKK09mZnNldCBpbiBtZW1vcnkgZm9yIHRoZSBhZGRyZXNzIGRlY29kaW5nCisKK1JFTUFSS1M6CitSZXR1cm4gdGhlIG9mZnNldCBnaXZlbiBieSBtb2Q9MDAgYWRkcmVzc2luZy4gIEFsc28gZW5hYmxlcyB0aGUKK2RlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KKworTk9URToJVGhlIGNvZGUgd2hpY2ggc3BlY2lmaWVzIHRoZSBjb3JyZXNwb25kaW5nIHNlZ21lbnQgKGRzIHZzIHNzKQorCWJlbG93IGluIHRoZSBjYXNlIG9mIFtCUCsuLl0uICBUaGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgYXQgdGhlCisJcG9pbnQgdGhhdCB0aGlzIHN1YnJvdXRpbmUgaXMgY2FsbGVkLCB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG8KKwlTWVNNT0RFX1NFR19EU19TUyB3aWxsIGJlIHplcm8uCSBBZnRlciBldmVyeSBpbnN0cnVjdGlvbgorCWV4Y2VwdCB0aGUgc2VnbWVudCBvdmVycmlkZSBpbnN0cnVjdGlvbnMsIHRoaXMgYml0IChhcyB3ZWxsCisJYXMgYW55IGJpdHMgaW5kaWNhdGluZyBzZWdtZW50IG92ZXJyaWRlcykgd2lsbCBiZSBjbGVhci4gIFNvCisJaWYgYSBTUyBhY2Nlc3MgaXMgbmVlZGVkLCBzZXQgdGhpcyBiaXQuCSBPdGhlcndpc2UsIERTIGFjY2VzcworCW9jY3VycyAodW5sZXNzIGFueSBvZiB0aGUgc2VnbWVudCBvdmVycmlkZSBiaXRzIGFyZSBzZXQpLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGRlY29kZV9ybTAwX2FkZHJlc3MoCisgICAgaW50IHJtKQoreworICAgIHVuc2lnbmVkIG9mZnNldDsKKworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfQUREUikgeworCS8qIDMyLWJpdCBhZGRyZXNzaW5nICovCisJc3dpdGNoIChybSkgeworCSAgY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJbRUFYXSIpOworCSAgICByZXR1cm4gTS54ODYuUl9FQVg7CisJICBjYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIltFQ1hdIik7CisJICAgIHJldHVybiBNLng4Ni5SX0VDWDsKKwkgIGNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiW0VEWF0iKTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRURYOworCSAgY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJbRUJYXSIpOworCSAgICByZXR1cm4gTS54ODYuUl9FQlg7CisJICBjYXNlIDQ6CisJICAgIHJldHVybiBkZWNvZGVfc2liX2FkZHJlc3MoMCk7CisJICBjYXNlIDU6CisJICAgIG9mZnNldCA9IGZldGNoX2xvbmdfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCJbJTA4eF0iLCBvZmZzZXQpOworCSAgICByZXR1cm4gb2Zmc2V0OworCSAgY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJbRVNJXSIpOworCSAgICByZXR1cm4gTS54ODYuUl9FU0k7CisJICBjYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYoIltFREldIik7CisJICAgIHJldHVybiBNLng4Ni5SX0VESTsKKwl9CisgICAgfSBlbHNlIHsKKwkvKiAxNi1iaXQgYWRkcmVzc2luZyAqLworCXN3aXRjaCAocm0pIHsKKwkgIGNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URigiW0JYK1NJXSIpOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlggKyBNLng4Ni5SX1NJKSAmIDB4ZmZmZjsKKwkgIGNhc2UgMToKKwkgICAgREVDT0RFX1BSSU5URigiW0JYK0RJXSIpOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlggKyBNLng4Ni5SX0RJKSAmIDB4ZmZmZjsKKwkgIGNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiW0JQK1NJXSIpOworCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlAgKyBNLng4Ni5SX1NJKSAmIDB4ZmZmZjsKKwkgIGNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiW0JQK0RJXSIpOworCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlAgKyBNLng4Ni5SX0RJKSAmIDB4ZmZmZjsKKwkgIGNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URigiW1NJXSIpOworCSAgICByZXR1cm4gTS54ODYuUl9TSTsKKwkgIGNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiW0RJXSIpOworCSAgICByZXR1cm4gTS54ODYuUl9ESTsKKwkgIGNhc2UgNjoKKwkgICAgb2Zmc2V0ID0gZmV0Y2hfd29yZF9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIlslMDR4XSIsIG9mZnNldCk7CisJICAgIHJldHVybiBvZmZzZXQ7CisJICBjYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYoIltCWF0iKTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfQlg7CisJfQorICAgIH0KKyAgICBIQUxUX1NZUygpOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3JtICAtIFJNIHZhbHVlIHRvIGRlY29kZQorCitSRVRVUk5TOgorT2Zmc2V0IGluIG1lbW9yeSBmb3IgdGhlIGFkZHJlc3MgZGVjb2RpbmcKKworUkVNQVJLUzoKK1JldHVybiB0aGUgb2Zmc2V0IGdpdmVuIGJ5IG1vZD0wMSBhZGRyZXNzaW5nLiAgQWxzbyBlbmFibGVzIHRoZQorZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGRlY29kZV9ybTAxX2FkZHJlc3MoCisgICAgaW50IHJtKQoreworICAgIGludCBkaXNwbGFjZW1lbnQ7CisKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0FERFIpIHsKKwkvKiAzMi1iaXQgYWRkcmVzc2luZyAqLworCWlmIChybSAhPSA0KQorCSAgICBkaXNwbGFjZW1lbnQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKwllbHNlCisJICAgIGRpc3BsYWNlbWVudCA9IDA7CisKKwlzd2l0Y2ggKHJtKSB7CisJICBjYXNlIDA6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQVhdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRUFYICsgZGlzcGxhY2VtZW50OworCSAgY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUNYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VDWCArIGRpc3BsYWNlbWVudDsKKwkgIGNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VEWF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FRFggKyBkaXNwbGFjZW1lbnQ7CisJICBjYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQlhdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRUJYICsgZGlzcGxhY2VtZW50OworCSAgY2FzZSA0OiB7CisJICAgIGludCBvZmZzZXQgPSBkZWNvZGVfc2liX2FkZHJlc3MoMSk7CisJICAgIGRpc3BsYWNlbWVudCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiWyVkXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBvZmZzZXQgKyBkaXNwbGFjZW1lbnQ7CisJICB9CisJICBjYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQlBdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRUJQICsgZGlzcGxhY2VtZW50OworCSAgY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRVNJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VTSSArIGRpc3BsYWNlbWVudDsKKwkgIGNhc2UgNzoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VESV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FREkgKyBkaXNwbGFjZW1lbnQ7CisJfQorICAgIH0gZWxzZSB7CisJLyogMTYtYml0IGFkZHJlc3NpbmcgKi8KKwlkaXNwbGFjZW1lbnQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKwlzd2l0Y2ggKHJtKSB7CisJICBjYXNlIDA6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWCtTSV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlggKyBNLng4Ni5SX1NJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwkgIGNhc2UgMToKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JYK0RJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiAoTS54ODYuUl9CWCArIE0ueDg2LlJfREkgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCSAgY2FzZSAyOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlArU0ldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgTS54ODYuUl9TSSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJICBjYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCUCtESV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlAgKyBNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwkgIGNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW1NJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiAoTS54ODYuUl9TSSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJICBjYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtESV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfREkgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCSAgY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlBdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwkgIGNhc2UgNzoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiAoTS54ODYuUl9CWCArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJfQorICAgIH0KKyAgICBIQUxUX1NZUygpOworICAgIHJldHVybiAwOwkJCS8qIFNIT1VMRCBOT1QgSEFQUEVOICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcm0gIC0gUk0gdmFsdWUgdG8gZGVjb2RlCisKK1JFVFVSTlM6CitPZmZzZXQgaW4gbWVtb3J5IGZvciB0aGUgYWRkcmVzcyBkZWNvZGluZworCitSRU1BUktTOgorUmV0dXJuIHRoZSBvZmZzZXQgZ2l2ZW4gYnkgbW9kPTEwIGFkZHJlc3NpbmcuICBBbHNvIGVuYWJsZXMgdGhlCitkZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgZGVjb2RlX3JtMTBfYWRkcmVzcygKKyAgICBpbnQgcm0pCit7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9BRERSKSB7CisJaW50IGRpc3BsYWNlbWVudDsKKworCS8qIDMyLWJpdCBhZGRyZXNzaW5nICovCisJaWYgKHJtICE9IDQpCisJICAgIGRpc3BsYWNlbWVudCA9IChzMzIpZmV0Y2hfbG9uZ19pbW0oKTsKKwllbHNlCisJICAgIGRpc3BsYWNlbWVudCA9IDA7CisKKwlzd2l0Y2ggKHJtKSB7CisJICBjYXNlIDA6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQVhdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRUFYICsgZGlzcGxhY2VtZW50OworCSAgY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUNYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VDWCArIGRpc3BsYWNlbWVudDsKKwkgIGNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VEWF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FRFggKyBkaXNwbGFjZW1lbnQ7CisJICBjYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQlhdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRUJYICsgZGlzcGxhY2VtZW50OworCSAgY2FzZSA0OiB7CisJICAgIGludCBvZmZzZXQgPSBkZWNvZGVfc2liX2FkZHJlc3MoMik7CisJICAgIGRpc3BsYWNlbWVudCA9IChzMzIpZmV0Y2hfbG9uZ19pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIlslZF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gb2Zmc2V0ICsgZGlzcGxhY2VtZW50OworCSAgfQorCSAgY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUJQXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VCUCArIGRpc3BsYWNlbWVudDsKKwkgIGNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VTSV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FU0kgKyBkaXNwbGFjZW1lbnQ7CisJICBjYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFREldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRURJICsgZGlzcGxhY2VtZW50OworCX0KKyAgICB9IGVsc2UgeworCWludCBkaXNwbGFjZW1lbnQgPSAoczE2KWZldGNoX3dvcmRfaW1tKCk7CisKKwkvKiAxNi1iaXQgYWRkcmVzc2luZyAqLworCXN3aXRjaCAocm0pIHsKKwkgIGNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JYK1NJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiAoTS54ODYuUl9CWCArIE0ueDg2LlJfU0kgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCSAgY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlgrREldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JYICsgTS54ODYuUl9ESSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJICBjYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCUCtTSV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlAgKyBNLng4Ni5SX1NJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwkgIGNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JQK0RJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7CisJICAgIHJldHVybiAoTS54ODYuUl9CUCArIE0ueDg2LlJfREkgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCSAgY2FzZSA0OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbU0ldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIChNLng4Ni5SX1NJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwkgIGNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0RJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiAoTS54ODYuUl9ESSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJICBjYXNlIDY6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCUF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlAgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCSAgY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlhdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JYICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwl9CisgICAgfQorICAgIEhBTFRfU1lTKCk7CisgICAgcmV0dXJuIDA7CQkJLyogU0hPVUxEIE5PVCBIQVBQRU4gKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Cittb2QgLSBtb2RpZmllcgorcm0gIC0gUk0gdmFsdWUgdG8gZGVjb2RlCisKK1JFVFVSTlM6CitPZmZzZXQgaW4gbWVtb3J5IGZvciB0aGUgYWRkcmVzcyBkZWNvZGluZywgbXVsdGlwbGV4aW5nIGNhbGxzIHRvCit0aGUgZGVjb2RlX3JtWFhfYWRkcmVzcyBmdW5jdGlvbnMKKworUkVNQVJLUzoKK1JldHVybiB0aGUgb2Zmc2V0IGdpdmVuIGJ5ICJtb2QiIGFkZHJlc3NpbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bnNpZ25lZCBkZWNvZGVfcm1YWF9hZGRyZXNzKGludCBtb2QsIGludCBybSkKK3sKKyAgaWYobW9kID09IDApCisgICAgcmV0dXJuIGRlY29kZV9ybTAwX2FkZHJlc3Mocm0pOworICBpZihtb2QgPT0gMSkKKyAgICByZXR1cm4gZGVjb2RlX3JtMDFfYWRkcmVzcyhybSk7CisgIHJldHVybiBkZWNvZGVfcm0xMF9hZGRyZXNzKHJtKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jpb3NfZW11bGF0b3IveDg2ZW11L29wcy5jIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9vcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzM0ZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9vcHMuYwpAQCAtMCwwICsxLDU0MzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogIENvcHlyaWdodCAoQykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiAgSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KKyoKKyoJCUNvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLglUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CQlBTlNJIEMKKyogRW52aXJvbm1lbnQ6CUFueQorKiBEZXZlbG9wZXI6CUtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjoJVGhpcyBmaWxlIGluY2x1ZGVzIHN1YnJvdXRpbmVzIHRvIGltcGxlbWVudCB0aGUgZGVjb2RpbmcKKyoJCWFuZCBlbXVsYXRpb24gb2YgYWxsIHRoZSB4ODYgcHJvY2Vzc29yIGluc3RydWN0aW9ucy4KKyoKKyogVGhlcmUgYXJlIGFwcHJveGltYXRlbHkgMjUwIHN1YnJvdXRpbmVzIGluIGhlcmUsIHdoaWNoIGNvcnJlc3BvbmQKKyogdG8gdGhlIDI1NiBieXRlLSJvcGNvZGVzIiBmb3VuZCBvbiB0aGUgODA4Ni4JVGhlIHRhYmxlIHdoaWNoCisqIGRpc3BhdGNoZXMgdGhpcyBpcyBmb3VuZCBpbiB0aGUgZmlsZXMgb3B0YWIuW2NoXS4KKyoKKyogRWFjaCBvcGNvZGUgcHJvYyBoYXMgYSBjb21tZW50IHByZWNlZWRpbmcgaXQgd2hpY2ggZ2l2ZXMgaXQncyB0YWJsZQorKiBhZGRyZXNzLiAgU2V2ZXJhbCBvcGNvZGVzIGFyZSBtaXNzaW5nICh1bmRlZmluZWQpIGluIHRoZSB0YWJsZS4KKyoKKyogRWFjaCBwcm9jIGluY2x1ZGVzIGluZm9ybWF0aW9uIGZvciBkZWNvZGluZyAoREVDT0RFX1BSSU5URiBhbmQKKyogREVDT0RFX1BSSU5URjIpLCBkZWJ1Z2dpbmcgKFRSQUNFX1JFR1MsIFNJTkdMRV9TVEVQKSwgYW5kIG1pc2MKKyogZnVuY3Rpb25zIChTVEFSVF9PRl9JTlNUUiwgRU5EX09GX0lOU1RSKS4KKyoKKyogTWFueSBvZiB0aGUgcHJvY2VkdXJlcyBhcmUgKlZFUlkqIHNpbWlsYXIgaW4gY29kaW5nLglUaGlzIGhhcworKiBhbGxvd2VkIGZvciBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIGNvZGUgdG8gYmUgZ2VuZXJhdGVkIGluIGEgZmFpcmx5CisqIHNob3J0IGFtb3VudCBvZiB0aW1lIChpLmUuIGN1dCwgcGFzdGUsIGFuZCBtb2RpZnkpLiAgVGhlIHJlc3VsdCBpcworKiB0aGF0IG11Y2ggb2YgdGhlIGNvZGUgYmVsb3cgY291bGQgaGF2ZSBiZWVuIGZvbGRlZCBpbnRvIHN1YnJvdXRpbmVzCisqIGZvciBhIGxhcmdlIHJlZHVjdGlvbiBpbiBzaXplIG9mIHRoaXMgZmlsZS4gIFRoZSBkb3duc2lkZSB3b3VsZCBiZQorKiB0aGF0IHRoZXJlIHdvdWxkIGJlIGEgcGVuYWx0eSBpbiBleGVjdXRpb24gc3BlZWQuICBUaGUgZmlsZSBjb3VsZAorKiBhbHNvIGhhdmUgYmVlbiAqTVVDSCogbGFyZ2VyIGJ5IGlubGluaW5nIGNlcnRhaW4gZnVuY3Rpb25zIHdoaWNoCisqIHdlcmUgY2FsbGVkLglUaGlzIGNvdWxkIGhhdmUgcmVzdWx0ZWQgZXZlbiBmYXN0ZXIgZXhlY3V0aW9uLgkgVGhlCisqIHByaW1lIGRpcmVjdGl2ZSBJIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gaW5saW5lIHRoZSBjb2RlIG9yIHRvCisqIG1vZHVsYXJpemUgaXQsIHdhcyBiYXNpY2FsbHk6IDEpIG5vIHVubmVjZXNzYXJ5IHN1YnJvdXRpbmUgY2FsbHMsCisqIDIpIG5vIHJvdXRpbmVzIG1vcmUgdGhhbiBhYm91dCAyMDAgbGluZXMgaW4gc2l6ZSwgYW5kIDMpIG1vZHVsYXJpemUKKyogYW55IGNvZGUgdGhhdCBJIG1pZ2h0IG5vdCBnZXQgcmlnaHQgdGhlIGZpcnN0IHRpbWUuICBUaGUgZmV0Y2hfKgorKiBzdWJyb3V0aW5lcyBmYWxsIGludG8gdGhlIGxhdHRlciBjYXRlZ29yeS4gIFRoZSBUaGUgZGVjb2RlXyogZmFsbAorKiBpbnRvIHRoZSBzZWNvbmQgY2F0ZWdvcnkuICBUaGUgY29kaW5nIG9mIHRoZSAic3dpdGNoKG1vZCl7IC4uLi4gfSIKKyogaW4gbWFueSBvZiB0aGUgc3Vicm91dGluZXMgYmVsb3cgZmFsbHMgaW50byB0aGUgZmlyc3QgY2F0ZWdvcnkuCisqIEVzcGVjaWFsbHksIHRoZSBjb2Rpbmcgb2Yge2FkZCxhbmQsb3Isc3ViLC4uLn1fe2J5dGUsd29yZH0KKyogc3Vicm91dGluZXMgYXJlIGFuIGVzcGVjaWFsbHkgZ2xhcmluZyBjYXNlIG9mIHRoZSB0aGlyZCBndWlkZWxpbmUuCisqIFNpbmNlIHNvIG11Y2ggb2YgdGhlIGNvZGUgaXMgY2xvbmVkIGZyb20gb3RoZXIgbW9kdWxlcyAoY29tcGFyZQorKiBvcGNvZGUgIzAwIHRvIG9wY29kZSAjMDEpLCBtYWtpbmcgdGhlIGJhc2ljIG9wZXJhdGlvbnMgc3Vicm91dGluZQorKiBjYWxscyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudDsgb3RoZXJ3aXNlIG1pc3Rha2VzIGluIGNvZGluZyBhbgorKiAiYWRkIiB3b3VsZCByZXByZXNlbnQgYSBuaWdodG1hcmUgaW4gbWFpbnRlbmFuY2UuCisqCisqIEphc29uIHBvcnRlZCB0aGlzIGZpbGUgdG8gdS1ib290LiBwbGFjZSBhbGwgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaW4KKyogdGhlIGdvdDIgc2VjdG9yLiBSZW1vdmVkIHNvbWUgb3Bjb2RlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIng4NmVtdS94ODZlbXVpLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19CSU9TRU1VKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBjb25zdGFudCBhcnJheXMgdG8gZG8gc2V2ZXJhbCBpbnN0cnVjdGlvbnMgaW4ganVzdCBvbmUgZnVuY3Rpb24gKi8KKworI2lmZGVmIERFQlVHCitzdGF0aWMgY2hhciAqeDg2ZW11X0dlbk9wTmFtZVs4XSA9IHsKKyAgICAiQUREIiwgIk9SIiwgIkFEQyIsICJTQkIiLCAiQU5EIiwgIlNVQiIsICJYT1IiLCAiQ01QIn07CisjZW5kaWYKKworLyogdXNlZCBieSBzZXZlcmFsIG9wY29kZXMgICovCitzdGF0aWMgdTggKCpnZW5vcF9ieXRlX29wZXJhdGlvbltdKSh1OCBkLCB1OCBzKSBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbigiLmdvdDIiKSkpID0KK3sKKyAgICBhZGRfYnl0ZSwJCS8qIDAwICovCisgICAgb3JfYnl0ZSwJCS8qIDAxICovCisgICAgYWRjX2J5dGUsCQkvKiAwMiAqLworICAgIHNiYl9ieXRlLAkJLyogMDMgKi8KKyAgICBhbmRfYnl0ZSwJCS8qIDA0ICovCisgICAgc3ViX2J5dGUsCQkvKiAwNSAqLworICAgIHhvcl9ieXRlLAkJLyogMDYgKi8KKyAgICBjbXBfYnl0ZSwJCS8qIDA3ICovCit9OworCitzdGF0aWMgdTE2ICgqZ2Vub3Bfd29yZF9vcGVyYXRpb25bXSkodTE2IGQsIHUxNiBzKSBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbigiLmdvdDIiKSkpID0KK3sKKyAgICBhZGRfd29yZCwJCS8qMDAgKi8KKyAgICBvcl93b3JkLAkJLyowMSAqLworICAgIGFkY193b3JkLAkJLyowMiAqLworICAgIHNiYl93b3JkLAkJLyowMyAqLworICAgIGFuZF93b3JkLAkJLyowNCAqLworICAgIHN1Yl93b3JkLAkJLyowNSAqLworICAgIHhvcl93b3JkLAkJLyowNiAqLworICAgIGNtcF93b3JkLAkJLyowNyAqLworfTsKKworc3RhdGljIHUzMiAoKmdlbm9wX2xvbmdfb3BlcmF0aW9uW10pKHUzMiBkLCB1MzIgcykgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24oIi5nb3QyIikpKSA9Cit7CisgICAgYWRkX2xvbmcsCQkvKjAwICovCisgICAgb3JfbG9uZywJCS8qMDEgKi8KKyAgICBhZGNfbG9uZywJCS8qMDIgKi8KKyAgICBzYmJfbG9uZywJCS8qMDMgKi8KKyAgICBhbmRfbG9uZywJCS8qMDQgKi8KKyAgICBzdWJfbG9uZywJCS8qMDUgKi8KKyAgICB4b3JfbG9uZywJCS8qMDYgKi8KKyAgICBjbXBfbG9uZywJCS8qMDcgKi8KK307CisKKy8qIHVzZWQgYnkgb3Bjb2RlcyA4MCwgYzAsIGQwLCBhbmQgZDIuICovCitzdGF0aWMgdTgoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW10pKHU4IGQsIHU4IHMpIF9fYXR0cmlidXRlX18gKChzZWN0aW9uKCIuZ290MiIpKSkgPQoreworICAgIHJvbF9ieXRlLAorICAgIHJvcl9ieXRlLAorICAgIHJjbF9ieXRlLAorICAgIHJjcl9ieXRlLAorICAgIHNobF9ieXRlLAorICAgIHNocl9ieXRlLAorICAgIHNobF9ieXRlLAkJLyogc2FsX2J5dGUgPT09IHNobF9ieXRlICBieSBkZWZpbml0aW9uICovCisgICAgc2FyX2J5dGUsCit9OworCisvKiB1c2VkIGJ5IG9wY29kZXMgYzEsIGQxLCBhbmQgZDMuICovCitzdGF0aWMgdTE2KCpvcGNEMV93b3JkX29wZXJhdGlvbltdKSh1MTYgcywgdTggZCkgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24oIi5nb3QyIikpKSA9Cit7CisgICAgcm9sX3dvcmQsCisgICAgcm9yX3dvcmQsCisgICAgcmNsX3dvcmQsCisgICAgcmNyX3dvcmQsCisgICAgc2hsX3dvcmQsCisgICAgc2hyX3dvcmQsCisgICAgc2hsX3dvcmQsCQkvKiBzYWxfYnl0ZSA9PT0gc2hsX2J5dGUgIGJ5IGRlZmluaXRpb24gKi8KKyAgICBzYXJfd29yZCwKK307CisKKy8qIHVzZWQgYnkgb3Bjb2RlcyBjMSwgZDEsIGFuZCBkMy4gKi8KK3N0YXRpYyB1MzIgKCpvcGNEMV9sb25nX29wZXJhdGlvbltdKSh1MzIgcywgdTggZCkgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24oIi5nb3QyIikpKSA9Cit7CisgICAgcm9sX2xvbmcsCisgICAgcm9yX2xvbmcsCisgICAgcmNsX2xvbmcsCisgICAgcmNyX2xvbmcsCisgICAgc2hsX2xvbmcsCisgICAgc2hyX2xvbmcsCisgICAgc2hsX2xvbmcsCQkvKiBzYWxfYnl0ZSA9PT0gc2hsX2J5dGUgIGJ5IGRlZmluaXRpb24gKi8KKyAgICBzYXJfbG9uZywKK307CisKKyNpZmRlZiBERUJVRworCitzdGF0aWMgY2hhciAqb3BGNl9uYW1lc1s4XSA9CisgIHsgIlRFU1RcdCIsICIiLCAiTk9UXHQiLCAiTkVHXHQiLCAiTVVMXHQiLCAiSU1VTFx0IiwgIkRJVlx0IiwgIklESVZcdCIgfTsKKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorb3AxIC0gSW5zdHJ1Y3Rpb24gb3AgY29kZQorCitSRU1BUktTOgorSGFuZGxlcyBpbGxlZ2FsIG9wY29kZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbGxlZ2FsX29wKAorICAgIHU4IG9wMSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5SX1NQICE9IDApIHsKKwlERUNPREVfUFJJTlRGKCJJTExFR0FMIFg4NiBPUENPREVcbiIpOworCVRSQUNFX1JFR1MoKTsKKwlEQiggcHJpbnRrKCIlMDR4OiUwNHg6ICUwMlggSUxMRUdBTCBYODYgT1BDT0RFIVxuIiwKKwkgICAgTS54ODYuUl9DUywgTS54ODYuUl9JUC0xLG9wMSkpOworCUhBTFRfU1lTKCk7CisJfQorICAgIGVsc2UgeworCS8qIElmIHdlIGdldCBoZXJlLCBpdCBtZWFucyB0aGUgc3RhY2sgcG9pbnRlciBpcyBiYWNrIHRvIHplcm8KKwkgKiBzbyB3ZSBhcmUganVzdCByZXR1cm5pbmcgZnJvbSBhbiBlbXVsYXRvciBzZXJ2aWNlIGNhbGwKKwkgKiBzbyB0aGVydGUgaXMgbm8gbmVlZCB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UuIFdlIHRyYXAKKwkgKiB0aGUgZW11bGF0b3Igd2l0aCBhbiAweEYxIG9wY29kZSB0byBmaW5pc2ggdGhlIHNlcnZpY2UKKwkgKiBjYWxsLgorCSAqLworCVg4NkVNVV9oYWx0X3N5cygpOworCX0KKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZXMgMHgwMCwgMHgwOCwgMHgxMCwgMHgxOCwgMHgyMCwgMHgyOCwgMHgzMCwgMHgzOAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfZ2Vub3BfYnl0ZV9STV9SKHU4IG9wMSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHU4IGRlc3R2YWw7CisKKyAgICBvcDEgPSAob3AxID4+IDMpICYgMHg3OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKHg4NmVtdV9HZW5PcE5hbWVbb3AxXSk7CisgICAgREVDT0RFX1BSSU5URigiXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmKG1vZDwzKQorCXsgZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKwlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCWRlc3R2YWwgPSBnZW5vcF9ieXRlX29wZXJhdGlvbltvcDFdKGRlc3R2YWwsICpzcmNyZWcpOworCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9CisgICAgZWxzZQorCXsJCQkvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRlc3RyZWcgPSBnZW5vcF9ieXRlX29wZXJhdGlvbltvcDFdKCpkZXN0cmVnLCAqc3JjcmVnKTsKKwl9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlcyAweDAxLCAweDA5LCAweDExLCAweDE5LCAweDIxLCAweDI5LCAweDMxLCAweDM5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9nZW5vcF93b3JkX1JNX1IodTggb3AxKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBvcDEgPSAob3AxID4+IDMpICYgMHg3OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKHg4NmVtdV9HZW5PcE5hbWVbb3AxXSk7CisgICAgREVDT0RFX1BSSU5URigiXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworCisgICAgaWYobW9kPDMpIHsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QscmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbDsKKwkgICAgdTMyICpzcmNyZWc7CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSBnZW5vcF9sb25nX29wZXJhdGlvbltvcDFdKGRlc3R2YWwsICpzcmNyZWcpOworCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGRlc3R2YWw7CisJICAgIHUxNiAqc3JjcmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gZ2Vub3Bfd29yZF9vcGVyYXRpb25bb3AxXShkZXN0dmFsLCAqc3JjcmVnKTsKKwkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0KKyAgICB9IGVsc2UgewkJCS8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IGdlbm9wX2xvbmdfb3BlcmF0aW9uW29wMV0oKmRlc3RyZWcsICpzcmNyZWcpOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IGdlbm9wX3dvcmRfb3BlcmF0aW9uW29wMV0oKmRlc3RyZWcsICpzcmNyZWcpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlcyAweDAyLCAweDBhLCAweDEyLCAweDFhLCAweDIyLCAweDJhLCAweDMyLCAweDNhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9nZW5vcF9ieXRlX1JfUk0odTggb3AxKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICB1OCBzcmN2YWw7CisKKyAgICBvcDEgPSAob3AxID4+IDMpICYgMHg3OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKHg4NmVtdV9HZW5PcE5hbWVbb3AxXSk7CisgICAgREVDT0RFX1BSSU5URigiXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QscmwpOworCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOworICAgIH0gZWxzZSB7CSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlzcmN2YWwgPSAqc3JjcmVnOworICAgIH0KKyAgICBERUNPREVfUFJJTlRGKCJcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgKmRlc3RyZWcgPSBnZW5vcF9ieXRlX29wZXJhdGlvbltvcDFdKCpkZXN0cmVnLCBzcmN2YWwpOworCisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlcyAweDAzLCAweDBiLCAweDEzLCAweDFiLCAweDIzLCAweDJiLCAweDMzLCAweDNiCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9nZW5vcF93b3JkX1JfUk0odTggb3AxKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICB1MzIgKmRlc3RyZWczMiwgc3JjdmFsOworICAgIHUxNiAqZGVzdHJlZzsKKworICAgIG9wMSA9IChvcDEgPj4gMykgJiAweDc7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoeDg2ZW11X0dlbk9wTmFtZVtvcDFdKTsKKyAgICBERUNPREVfUFJJTlRGKCJcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCxybCk7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIGRlc3RyZWczMiA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWczMiA9IGdlbm9wX2xvbmdfb3BlcmF0aW9uW29wMV0oKmRlc3RyZWczMiwgc3JjdmFsKTsKKwl9IGVsc2UgeworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IGdlbm9wX3dvcmRfb3BlcmF0aW9uW29wMV0oKmRlc3RyZWcsIHNyY3ZhbCk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqc3JjcmVnOworCSAgICBkZXN0cmVnMzIgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZzMyID0gZ2Vub3BfbG9uZ19vcGVyYXRpb25bb3AxXSgqZGVzdHJlZzMyLCAqc3JjcmVnKTsKKwl9IGVsc2UgeworCSAgICB1MTYgKnNyY3JlZzsKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gZ2Vub3Bfd29yZF9vcGVyYXRpb25bb3AxXSgqZGVzdHJlZywgKnNyY3JlZyk7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGVzIDB4MDQsIDB4MGMsIDB4MTQsIDB4MWMsIDB4MjQsIDB4MmMsIDB4MzQsIDB4M2MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2dlbm9wX2J5dGVfQUxfSU1NKHU4IG9wMSkKK3sKKyAgICB1OCBzcmN2YWw7CisKKyAgICBvcDEgPSAob3AxID4+IDMpICYgMHg3OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKHg4NmVtdV9HZW5PcE5hbWVbb3AxXSk7CisgICAgREVDT0RFX1BSSU5URigiXHRBTCwiKTsKKyAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQUwgPSBnZW5vcF9ieXRlX29wZXJhdGlvbltvcDFdKE0ueDg2LlJfQUwsIHNyY3ZhbCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlcyAweDA1LCAweDBkLCAweDE1LCAweDFkLCAweDI1LCAweDJkLCAweDM1LCAweDNkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9nZW5vcF93b3JkX0FYX0lNTSh1OCBvcDEpCit7CisgICAgdTMyIHNyY3ZhbDsKKworICAgIG9wMSA9IChvcDEgPj4gMykgJiAweDc7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoeDg2ZW11X0dlbk9wTmFtZVtvcDFdKTsKKwlERUNPREVfUFJJTlRGKCJcdEVBWCwiKTsKKwlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URih4ODZlbXVfR2VuT3BOYW1lW29wMV0pOworCURFQ09ERV9QUklOVEYoIlx0QVgsIik7CisJc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICB9CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJTS54ODYuUl9FQVggPSBnZW5vcF9sb25nX29wZXJhdGlvbltvcDFdKE0ueDg2LlJfRUFYLCBzcmN2YWwpOworICAgIH0gZWxzZSB7CisJTS54ODYuUl9BWCA9IGdlbm9wX3dvcmRfb3BlcmF0aW9uW29wMV0oTS54ODYuUl9BWCwgKHUxNilzcmN2YWwpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHVzaF9FUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRFU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBwdXNoX3dvcmQoTS54ODYuUl9FUyk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MDcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3BvcF9FUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJQT1BcdEVTXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfRVMgPSBwb3Bfd29yZCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wdXNoX0NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdENTXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIHB1c2hfd29yZChNLng4Ni5SX0NTKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZi4gRXNjYXBlIGZvciB0d28tYnl0ZSBvcGNvZGUgKDI4NiBvciBiZXR0ZXIpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF90d29fYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggb3AyID0gKCpzeXNfcmRiKSgoKHUzMilNLng4Ni5SX0NTIDw8IDQpICsgKE0ueDg2LlJfSVArKykpOworICAgIElOQ19ERUNPREVEX0lOU1RfTEVOKDEpOworICAgICgqeDg2ZW11X29wdGFiMltvcDJdKShvcDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3B1c2hfU1ModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUFVTSFx0U1NcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfU1MpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDE3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BfU1ModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUE9QXHRTU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX1NTID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgxZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHVzaF9EUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJQVVNIXHREU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBwdXNoX3dvcmQoTS54ODYuUl9EUyk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MWYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3BvcF9EUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJQT1BcdERTXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfRFMgPSBwb3Bfd29yZCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDI2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zZWdvdnJfRVModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiRVM6XG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfRVM7CisgICAgLyoKKyAgICAgKiBub3RlIHRoZSBsYWNrIG9mIERFQ09ERV9DTEVBUl9TRUdPVlIocikgc2luY2UsIGhlcmUgaXMgb25lIG9mIDQKKyAgICAgKiBvcGNvZGUgc3Vicm91dGluZXMgd2UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcy4KKyAgICAgKi8KKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDI3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9kYWEodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiREFBXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQUwgPSBkYWFfYnl0ZShNLng4Ni5SX0FMKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc2Vnb3ZyX0NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkNTOlxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHT1ZSX0NTOworICAgIC8qIG5vdGUgbm8gREVDT0RFX0NMRUFSX1NFR09WUiBoZXJlLiAqLworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MmYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2Rhcyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJEQVNcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9BTCA9IGRhc19ieXRlKE0ueDg2LlJfQUwpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDM2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zZWdvdnJfU1ModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU1M6XG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfU1M7CisgICAgLyogbm8gREVDT0RFX0NMRUFSX1NFR09WUiAhICovCisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgzNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfYWFhKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkFBQVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0FYID0gYWFhX3dvcmQoTS54ODYuUl9BWCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4M2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3NlZ292cl9EUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJEUzpcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR09WUl9EUzsKKyAgICAvKiBOTyBERUNPREVfQ0xFQVJfU0VHT1ZSISAqLworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4M2YKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2Fhcyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJBQVNcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9BWCA9IGFhc193b3JkKE0ueDg2LlJfQVgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDQwIC0gMHg0NworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaW5jX3JlZ2lzdGVyKHU4IG9wMSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIG9wMSAmPSAweDc7CisgICAgREVDT0RFX1BSSU5URigiSU5DXHQiKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwl1MzIgKnJlZzsKKwlyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihvcDEpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqcmVnID0gaW5jX2xvbmcoKnJlZyk7CisgICAgfSBlbHNlIHsKKwl1MTYgKnJlZzsKKwlyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihvcDEpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqcmVnID0gaW5jX3dvcmQoKnJlZyk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDQ4IC0gMHg0RgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfZGVjX3JlZ2lzdGVyKHU4IG9wMSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIG9wMSAmPSAweDc7CisgICAgREVDT0RFX1BSSU5URigiREVDXHQiKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwl1MzIgKnJlZzsKKwlyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihvcDEpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqcmVnID0gZGVjX2xvbmcoKnJlZyk7CisgICAgfSBlbHNlIHsKKwl1MTYgKnJlZzsKKwlyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihvcDEpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqcmVnID0gZGVjX3dvcmQoKnJlZyk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDUwIC0gMHg1NworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHVzaF9yZWdpc3Rlcih1OCBvcDEpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBvcDEgJj0gMHg3OworICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdCIpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCXUzMiAqcmVnOworCXJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKG9wMSk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCXB1c2hfbG9uZygqcmVnKTsKKyAgICB9IGVsc2UgeworCXUxNiAqcmVnOworCXJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKG9wMSk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCXB1c2hfd29yZCgqcmVnKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NTggLSAweDVGCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIodTggb3AxKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgb3AxICY9IDB4NzsKKyAgICBERUNPREVfUFJJTlRGKCJQT1BcdCIpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCXUzMiAqcmVnOworCXJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKG9wMSk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpyZWcgPSBwb3BfbG9uZygpOworICAgIH0gZWxzZSB7CisJdTE2ICpyZWc7CisJcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIob3AxKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKnJlZyA9IHBvcF93b3JkKCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDYwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wdXNoX2FsbCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGKCJQVVNIQURcbiIpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiUFVTSEFcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCXUzMiBvbGRfc3AgPSBNLng4Ni5SX0VTUDsKKworCXB1c2hfbG9uZyhNLng4Ni5SX0VBWCk7CisJcHVzaF9sb25nKE0ueDg2LlJfRUNYKTsKKwlwdXNoX2xvbmcoTS54ODYuUl9FRFgpOworCXB1c2hfbG9uZyhNLng4Ni5SX0VCWCk7CisJcHVzaF9sb25nKG9sZF9zcCk7CisJcHVzaF9sb25nKE0ueDg2LlJfRUJQKTsKKwlwdXNoX2xvbmcoTS54ODYuUl9FU0kpOworCXB1c2hfbG9uZyhNLng4Ni5SX0VESSk7CisgICAgfSBlbHNlIHsKKwl1MTYgb2xkX3NwID0gTS54ODYuUl9TUDsKKworCXB1c2hfd29yZChNLng4Ni5SX0FYKTsKKwlwdXNoX3dvcmQoTS54ODYuUl9DWCk7CisJcHVzaF93b3JkKE0ueDg2LlJfRFgpOworCXB1c2hfd29yZChNLng4Ni5SX0JYKTsKKwlwdXNoX3dvcmQob2xkX3NwKTsKKwlwdXNoX3dvcmQoTS54ODYuUl9CUCk7CisJcHVzaF93b3JkKE0ueDg2LlJfU0kpOworCXB1c2hfd29yZChNLng4Ni5SX0RJKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NjEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3BvcF9hbGwodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiUE9QQURcbiIpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiUE9QQVxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJTS54ODYuUl9FREkgPSBwb3BfbG9uZygpOworCU0ueDg2LlJfRVNJID0gcG9wX2xvbmcoKTsKKwlNLng4Ni5SX0VCUCA9IHBvcF9sb25nKCk7CisJTS54ODYuUl9FU1AgKz0gNDsJICAgICAgIC8qIHNraXAgRVNQICovCisJTS54ODYuUl9FQlggPSBwb3BfbG9uZygpOworCU0ueDg2LlJfRURYID0gcG9wX2xvbmcoKTsKKwlNLng4Ni5SX0VDWCA9IHBvcF9sb25nKCk7CisJTS54ODYuUl9FQVggPSBwb3BfbG9uZygpOworICAgIH0gZWxzZSB7CisJTS54ODYuUl9ESSA9IHBvcF93b3JkKCk7CisJTS54ODYuUl9TSSA9IHBvcF93b3JkKCk7CisJTS54ODYuUl9CUCA9IHBvcF93b3JkKCk7CisJTS54ODYuUl9TUCArPSAyOwkgICAgICAgLyogc2tpcCBTUCAqLworCU0ueDg2LlJfQlggPSBwb3Bfd29yZCgpOworCU0ueDg2LlJfRFggPSBwb3Bfd29yZCgpOworCU0ueDg2LlJfQ1ggPSBwb3Bfd29yZCgpOworCU0ueDg2LlJfQVggPSBwb3Bfd29yZCgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qb3Bjb2RlIDB4NjIJSUxMRUdBTCBPUCwgY2FsbHMgeDg2ZW11T3BfaWxsZWdhbF9vcCgpICovCisvKm9wY29kZSAweDYzCUlMTEVHQUwgT1AsIGNhbGxzIHg4NmVtdU9wX2lsbGVnYWxfb3AoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NjQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3NlZ292cl9GUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJGUzpcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR09WUl9GUzsKKyAgICAvKgorICAgICAqIG5vdGUgdGhlIGxhY2sgb2YgREVDT0RFX0NMRUFSX1NFR09WUihyKSBzaW5jZSwgaGVyZSBpcyBvbmUgb2YgNAorICAgICAqIG9wY29kZSBzdWJyb3V0aW5lcyB3ZSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLgorICAgICAqLworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NjUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3NlZ292cl9HUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJHUzpcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR09WUl9HUzsKKyAgICAvKgorICAgICAqIG5vdGUgdGhlIGxhY2sgb2YgREVDT0RFX0NMRUFSX1NFR09WUihyKSBzaW5jZSwgaGVyZSBpcyBvbmUgb2YgNAorICAgICAqIG9wY29kZSBzdWJyb3V0aW5lcyB3ZSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLgorICAgICAqLworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NjYgLSBwcmVmaXggZm9yIDMyLWJpdCByZWdpc3RlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHJlZml4X2RhdGEodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiREFUQTpcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1BSRUZJWF9EQVRBOworICAgIC8qIG5vdGUgbm8gREVDT0RFX0NMRUFSX1NFR09WUiBoZXJlLiAqLworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NjcgLSBwcmVmaXggZm9yIDMyLWJpdCBhZGRyZXNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wcmVmaXhfYWRkcih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJBRERSOlxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfUFJFRklYX0FERFI7CisgICAgLyogbm90ZSBubyBERUNPREVfQ0xFQVJfU0VHT1ZSIGhlcmUuICovCisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg2OAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHVzaF93b3JkX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKKyAgICB9IGVsc2UgeworCWltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgfQorICAgIERFQ09ERV9QUklOVEYyKCJQVVNIXHQleFxuIiwgaW1tKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCXB1c2hfbG9uZyhpbW0pOworICAgIH0gZWxzZSB7CisJcHVzaF93b3JkKCh1MTYpaW1tKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NjkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2ltdWxfd29yZF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU1VTFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKwkgICAgdTMyIHNyY3ZhbDsKKwkgICAgdTMyIHJlc19sbyxyZXNfaGk7CisJICAgIHMzMiBpbW07CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKwkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKXNyY3ZhbCwoczMyKWltbSk7CisJICAgIGlmICgoKChyZXNfbG8gJiAweDgwMDAwMDAwKSA9PSAwKSAmJiAocmVzX2hpID09IDB4MDAwMDAwMDApKSB8fAorCQkoKChyZXNfbG8gJiAweDgwMDAwMDAwKSAhPSAwKSAmJiAocmVzX2hpID09IDB4RkZGRkZGRkYpKSkgeworCQlDTEVBUl9GTEFHKEZfQ0YpOworCQlDTEVBUl9GTEFHKEZfT0YpOworCSAgICB9IGVsc2UgeworCQlTRVRfRkxBRyhGX0NGKTsKKwkJU0VUX0ZMQUcoRl9PRik7CisJICAgIH0KKwkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisJICAgIHUxNiBzcmN2YWw7CisJICAgIHUzMiByZXM7CisJICAgIHMxNiBpbW07CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICByZXMgPSAoczE2KXNyY3ZhbCAqIChzMTYpaW1tOworCSAgICBpZiAoKCgocmVzICYgMHg4MDAwKSA9PSAwKSAmJiAoKHJlcyA+PiAxNikgPT0gMHgwMDAwKSkgfHwKKwkJKCgocmVzICYgMHg4MDAwKSAhPSAwKSAmJiAoKHJlcyA+PiAxNikgPT0gMHhGRkZGKSkpIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkgICAgfSBlbHNlIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCSAgICB9CisJICAgICpkZXN0cmVnID0gKHUxNilyZXM7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOworCSAgICB1MzIgcmVzX2xvLHJlc19oaTsKKwkgICAgczMyIGltbTsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKSpzcmNyZWcsKHMzMilpbW0pOworCSAgICBpZiAoKCgocmVzX2xvICYgMHg4MDAwMDAwMCkgPT0gMCkgJiYgKHJlc19oaSA9PSAweDAwMDAwMDAwKSkgfHwKKwkJKCgocmVzX2xvICYgMHg4MDAwMDAwMCkgIT0gMCkgJiYgKHJlc19oaSA9PSAweEZGRkZGRkZGKSkpIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkgICAgfSBlbHNlIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCSAgICB9CisJICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7CisJICAgIHUzMiByZXM7CisJICAgIHMxNiBpbW07CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKwkgICAgcmVzID0gKHMxNikqc3JjcmVnICogKHMxNilpbW07CisJICAgIGlmICgoKChyZXMgJiAweDgwMDApID09IDApICYmICgocmVzID4+IDE2KSA9PSAweDAwMDApKSB8fAorCQkoKChyZXMgJiAweDgwMDApICE9IDApICYmICgocmVzID4+IDE2KSA9PSAweEZGRkYpKSkgeworCQlDTEVBUl9GTEFHKEZfQ0YpOworCQlDTEVBUl9GTEFHKEZfT0YpOworCSAgICB9IGVsc2UgeworCQlTRVRfRkxBRyhGX0NGKTsKKwkJU0VUX0ZMQUcoRl9PRik7CisJICAgIH0KKwkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDZhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wdXNoX2J5dGVfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBzMTYgaW1tOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpbW0gPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiUFVTSFx0JWRcbiIsIGltbSk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBwdXNoX3dvcmQoaW1tKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg2YgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaW11bF9ieXRlX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHM4CWltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU1VTFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKwkgICAgdTMyIHNyY3ZhbDsKKwkgICAgdTMyIHJlc19sbyxyZXNfaGk7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKwkgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKXNyY3ZhbCwoczMyKWltbSk7CisJICAgIGlmICgoKChyZXNfbG8gJiAweDgwMDAwMDAwKSA9PSAwKSAmJiAocmVzX2hpID09IDB4MDAwMDAwMDApKSB8fAorCQkoKChyZXNfbG8gJiAweDgwMDAwMDAwKSAhPSAwKSAmJiAocmVzX2hpID09IDB4RkZGRkZGRkYpKSkgeworCQlDTEVBUl9GTEFHKEZfQ0YpOworCQlDTEVBUl9GTEFHKEZfT0YpOworCSAgICB9IGVsc2UgeworCQlTRVRfRkxBRyhGX0NGKTsKKwkJU0VUX0ZMQUcoRl9PRik7CisJICAgIH0KKwkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisJICAgIHUxNiBzcmN2YWw7CisJICAgIHUzMiByZXM7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwkgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICByZXMgPSAoczE2KXNyY3ZhbCAqIChzMTYpaW1tOworCSAgICBpZiAoKCgocmVzICYgMHg4MDAwKSA9PSAwKSAmJiAoKHJlcyA+PiAxNikgPT0gMHgwMDAwKSkgfHwKKwkJKCgocmVzICYgMHg4MDAwKSAhPSAwKSAmJiAoKHJlcyA+PiAxNikgPT0gMHhGRkZGKSkpIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkgICAgfSBlbHNlIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCSAgICB9CisJICAgICpkZXN0cmVnID0gKHUxNilyZXM7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOworCSAgICB1MzIgcmVzX2xvLHJlc19oaTsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKSpzcmNyZWcsKHMzMilpbW0pOworCSAgICBpZiAoKCgocmVzX2xvICYgMHg4MDAwMDAwMCkgPT0gMCkgJiYgKHJlc19oaSA9PSAweDAwMDAwMDAwKSkgfHwKKwkJKCgocmVzX2xvICYgMHg4MDAwMDAwMCkgIT0gMCkgJiYgKHJlc19oaSA9PSAweEZGRkZGRkZGKSkpIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkgICAgfSBlbHNlIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCSAgICB9CisJICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7CisJICAgIHUzMiByZXM7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgcmVzID0gKHMxNikqc3JjcmVnICogKHMxNilpbW07CisJICAgIGlmICgoKChyZXMgJiAweDgwMDApID09IDApICYmICgocmVzID4+IDE2KSA9PSAweDAwMDApKSB8fAorCQkoKChyZXMgJiAweDgwMDApICE9IDApICYmICgocmVzID4+IDE2KSA9PSAweEZGRkYpKSkgeworCQlDTEVBUl9GTEFHKEZfQ0YpOworCQlDTEVBUl9GTEFHKEZfT0YpOworCSAgICB9IGVsc2UgeworCQlTRVRfRkxBRyhGX0NGKTsKKwkJU0VUX0ZMQUcoRl9PRik7CisJICAgIH0KKwkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDZjCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbnNfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJJTlNCXG4iKTsKKyAgICBpbnMoMSk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg2ZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaW5zX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiSU5TRFxuIik7CisJaW5zKDQpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiSU5TV1xuIik7CisJaW5zKDIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDZlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vdXRzX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiT1VUU0JcbiIpOworICAgIG91dHMoMSk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg2ZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3V0c193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIk9VVFNEXG4iKTsKKwlvdXRzKDQpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiT1VUU1dcbiIpOworCW91dHMoMik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NzAgLSAweDdGCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHg4NmVtdV9jaGVja19qdW1wX2NvbmRpdGlvbih1OCBvcCk7CisKK3ZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX2NvbmQodTggb3AxKQoreworICAgIHM4IG9mZnNldDsKKyAgICB1MTYgdGFyZ2V0OworICAgIGludCBjb25kOworCisgICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBvdmVyZmxvdyBmbGFnIGlzIHNldCAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgY29uZCA9IHg4NmVtdV9jaGVja19qdW1wX2NvbmRpdGlvbihvcDEgJiAweEYpOworICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOworICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKGNvbmQpCisJTS54ODYuUl9JUCA9IHRhcmdldDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4MAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjODBfYnl0ZV9STV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggaW1tOworICAgIHU4IGRlc3R2YWw7CisKKyAgICAvKgorICAgICAqIFdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LglQYXJ0IG9mIHRoZSBvcGNvZGUKKyAgICAgKiBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQgcmVzdWx0LCBleGNlcHQKKyAgICAgKiB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCisgICAgICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7CisJLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKwkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQorCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKworCXN3aXRjaCAocmgpIHsKKwljYXNlIDA6CisJICAgIERFQ09ERV9QUklOVEYoIkFERFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMToKKwkgICAgREVDT0RFX1BSSU5URigiT1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiU0JCXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBERUNPREVfUFJJTlRGKCJBTkRcdCIpOworCSAgICBicmVhazsKKwljYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYoIlNVQlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URigiWE9SXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJDTVBcdCIpOworCSAgICBicmVhazsKKwl9CisgICAgfQorI2VuZGlmCisgICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZworICAgICAgIG1vZGUuICovCisgICAgaWYgKG1vZCA8IDMpIHsKKwlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKwlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCWRlc3R2YWwgPSAoKmdlbm9wX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7CisJaWYgKHJoICE9IDcpCisJICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisJREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOworCVRSQUNFX0FORF9TVEVQKCk7CisJZGVzdHZhbCA9ICgqZ2Vub3BfYnl0ZV9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGltbSk7CisJaWYgKHJoICE9IDcpCisJICAgICpkZXN0cmVnID0gZGVzdHZhbDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wYzgxX3dvcmRfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgLyoKKyAgICAgKiBXZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4JUGFydCBvZiB0aGUgb3Bjb2RlCisgICAgICogaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkIHJlc3VsdCwgZXhjZXB0CisgICAgICogdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisKKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJBRERcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgorCSAgICBERUNPREVfUFJJTlRGKCJBRENcdCIpOworCSAgICBicmVhazsKKwljYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYoIlNCQlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOworCSAgICBicmVhazsKKwljYXNlIDY6CisJICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNzoKKwkgICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyNlbmRpZgorICAgIC8qCisgICAgICogS25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZworICAgICAqIG1vZGUuCisgICAgICovCisgICAgaWYgKG1vZCA8IDMpIHsKKwlERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBkZXN0dmFsLGltbTsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9ICgqZ2Vub3BfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKKwkgICAgaWYgKHJoICE9IDcpCisJCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9IGVsc2UgeworCSAgICB1MTYgZGVzdHZhbCxpbW07CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKmdlbm9wX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7CisJICAgIGlmIChyaCAhPSA3KQorCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKwkgICAgdTMyIGRlc3R2YWwsaW1tOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gKCpnZW5vcF9sb25nX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgaW1tKTsKKwkgICAgaWYgKHJoICE9IDcpCisJCSpkZXN0cmVnID0gZGVzdHZhbDsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisJICAgIHUxNiBkZXN0dmFsLGltbTsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9ICgqZ2Vub3Bfd29yZF9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGltbSk7CisJICAgIGlmIChyaCAhPSA3KQorCQkqZGVzdHJlZyA9IGRlc3R2YWw7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4MgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjODJfYnl0ZV9STV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggaW1tOworICAgIHU4IGRlc3R2YWw7CisKKyAgICAvKgorICAgICAqIFdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LglQYXJ0IG9mIHRoZSBvcGNvZGUKKyAgICAgKiBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQgcmVzdWx0LCBleGNlcHQKKyAgICAgKiB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uIFNpbWlsYXIgdG8gb3Bjb2RlIDgxLCBleGNlcHQgdGhhdAorICAgICAqIHRoZSBpbW1lZGlhdGUgYnl0ZSBpcyBzaWduIGV4dGVuZGVkIHRvIGEgd29yZCBsZW5ndGguCisgICAgICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7CisJLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKwkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQorCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJBRERcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgorCSAgICBERUNPREVfUFJJTlRGKCJBRENcdCIpOworCSAgICBicmVhazsKKwljYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYoIlNCQlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOworCSAgICBicmVhazsKKwljYXNlIDY6CisJICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNzoKKwkgICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyNlbmRpZgorICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKKyAgICAgICBtb2RlLiAqLworICAgIGlmIChtb2QgPCAzKSB7CisJREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKwlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlkZXN0dmFsID0gKCpnZW5vcF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworCWlmIChyaCAhPSA3KQorCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisJREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCWRlc3R2YWwgPSAoKmdlbm9wX2J5dGVfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBpbW0pOworCWlmIChyaCAhPSA3KQorCSAgICAqZGVzdHJlZyA9IGRlc3R2YWw7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDgzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGM4M193b3JkX1JNX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIC8qCisgICAgICogV2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuCVBhcnQgb2YgdGhlIG9wY29kZQorICAgICAqIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZCByZXN1bHQsIGV4Y2VwdAorICAgICAqIHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24gU2ltaWxhciB0byBvcGNvZGUgODEsIGV4Y2VwdCB0aGF0CisgICAgICogdGhlIGltbWVkaWF0ZSBieXRlIGlzIHNpZ24gZXh0ZW5kZWQgdG8gYSB3b3JkIGxlbmd0aC4KKyAgICAgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKKwkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQorCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCisJICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCisJICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLworICAgICAgIHN3aXRjaCAocmgpIHsKKwljYXNlIDA6CisJICAgIERFQ09ERV9QUklOVEYoIkFERFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMToKKwkgICAgREVDT0RFX1BSSU5URigiT1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiU0JCXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBERUNPREVfUFJJTlRGKCJBTkRcdCIpOworCSAgICBicmVhazsKKwljYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYoIlNVQlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URigiWE9SXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJDTVBcdCIpOworCSAgICBicmVhazsKKwl9CisgICAgfQorI2VuZGlmCisgICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZworICAgICAgIG1vZGUuICovCisgICAgaWYgKG1vZCA8IDMpIHsKKwlERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLHJsKTsKKworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbCxpbW07CisKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKwkgICAgaW1tID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gKCpnZW5vcF9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworCSAgICBpZiAocmggIT0gNykKKwkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0gZWxzZSB7CisJICAgIHUxNiBkZXN0dmFsLGltbTsKKworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBpbW0gPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKmdlbm9wX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7CisJICAgIGlmIChyaCAhPSA3KQorCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKwkgICAgdTMyIGRlc3R2YWwsaW1tOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9ICgqZ2Vub3BfbG9uZ19vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGltbSk7CisJICAgIGlmIChyaCAhPSA3KQorCQkqZGVzdHJlZyA9IGRlc3R2YWw7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCSAgICB1MTYgZGVzdHZhbCxpbW07CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgaW1tID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gKCpnZW5vcF93b3JkX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgaW1tKTsKKwkgICAgaWYgKHJoICE9IDcpCisJCSpkZXN0cmVnID0gZGVzdHZhbDsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDg0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF90ZXN0X2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBkZXN0dmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJURVNUXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisJc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwl0ZXN0X2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCXRlc3RfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDg1CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF90ZXN0X3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiVEVTVFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbDsKKwkgICAgdTMyICpzcmNyZWc7CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHRlc3RfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKKwl9IGVsc2UgeworCSAgICB1MTYgZGVzdHZhbDsKKwkgICAgdTE2ICpzcmNyZWc7CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHRlc3Rfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKKwl9CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHRlc3RfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHRlc3Rfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4NgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfeGNoZ19ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggZGVzdHZhbDsKKyAgICB1OCB0bXA7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlhDSEdcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKwlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCXRtcCA9ICpzcmNyZWc7CisJKnNyY3JlZyA9IGRlc3R2YWw7CisJZGVzdHZhbCA9IHRtcDsKKwlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCXRtcCA9ICpzcmNyZWc7CisJKnNyY3JlZyA9ICpkZXN0cmVnOworCSpkZXN0cmVnID0gdG1wOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4NworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfeGNoZ193b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlhDSEdcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqc3JjcmVnOworCSAgICB1MzIgZGVzdHZhbCx0bXA7CisKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICB0bXAgPSAqc3JjcmVnOworCSAgICAqc3JjcmVnID0gZGVzdHZhbDsKKwkgICAgZGVzdHZhbCA9IHRtcDsKKwkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0gZWxzZSB7CisJICAgIHUxNiAqc3JjcmVnOworCSAgICB1MTYgZGVzdHZhbCx0bXA7CisKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICB0bXAgPSAqc3JjcmVnOworCSAgICAqc3JjcmVnID0gZGVzdHZhbDsKKwkgICAgZGVzdHZhbCA9IHRtcDsKKwkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKKwkgICAgdTMyIHRtcDsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgdG1wID0gKnNyY3JlZzsKKwkgICAgKnNyY3JlZyA9ICpkZXN0cmVnOworCSAgICAqZGVzdHJlZyA9IHRtcDsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKKwkgICAgdTE2IHRtcDsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgdG1wID0gKnNyY3JlZzsKKwkgICAgKnNyY3JlZyA9ICpkZXN0cmVnOworCSAgICAqZGVzdHJlZyA9IHRtcDsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDg4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWcsICpzcmNyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgKnNyY3JlZyk7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkZXN0cmVnID0gKnNyY3JlZzsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl93b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsICpzcmNyZWcpOworCX0gZWxzZSB7CisJICAgIHUxNiAqc3JjcmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgKnNyY3JlZyk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9ICpzcmNyZWc7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gKnNyY3JlZzsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDhhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWcsICpzcmNyZWc7CisgICAgdWludCBzcmNvZmZzZXQ7CisgICAgdTggc3JjdmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRlc3RyZWcgPSAqc3JjcmVnOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4YgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnOworCSAgICB1MzIgc3JjdmFsOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gc3JjdmFsOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZzsKKwkgICAgdTE2IHNyY3ZhbDsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKwl9CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnLCAqc3JjcmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9ICpzcmNyZWc7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnLCAqc3JjcmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9ICpzcmNyZWc7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4YworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X3dvcmRfUk1fU1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1MTYgKmRlc3RyZWcsICpzcmNyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHUxNiBkZXN0dmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3JjcmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCWRlc3R2YWwgPSAqc3JjcmVnOworCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY3JlZyA9IGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIocmgpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZGVzdHJlZyA9ICpzcmNyZWc7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDhkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9sZWFfd29yZF9SX00odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1MTYgKnNyY3JlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKy8qCisgKiBUT0RPOiBOZWVkIHRvIGhhbmRsZSBhZGRyZXNzIHNpemUgcHJlZml4IQorICoKKyAqIGxlYQllYXgsW2VheCtlYngqMl0gPz8KKyAqLworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMRUFcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqc3JjcmVnID0gKHUxNilkZXN0b2Zmc2V0OworCX0KKyAgICAvKiB9IGVsc2UgeyB1bmRlZmluZWQuICBEbyBub3RoaW5nLiB9ICovCisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl93b3JkX1NSX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTE2ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHUxNiBzcmN2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RyZWcgPSBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKHJoKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRlc3RyZWcgPSBzcmN2YWw7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRlc3RyZWcgPSAqc3JjcmVnOworICAgIH0KKyAgICAvKgorICAgICAqIENsZWFuIHVwLCBhbmQgcmVzZXQgYWxsIHRoZSBSX3hTUCBwb2ludGVycyB0byB0aGUgY29ycmVjdAorICAgICAqIGxvY2F0aW9ucy4gIFRoaXMgaXMgYWJvdXQgM3ggdG9vIG11Y2ggb3ZlcmhlYWQgKGRvaW5nIGFsbCB0aGUKKyAgICAgKiBzZWdyZWcgcHRycyB3aGVuIG9ubHkgb25lIGlzIG5lZWRlZCwgYnV0IHRoaXMgaW5zdHJ1Y3Rpb24KKyAgICAgKiAqY2Fubm90KiBiZSB0aGF0IGNvbW1vbiwgYW5kIHRoaXMgaXNuJ3QgdG9vIG11Y2ggd29yayBhbnl3YXkuCisgICAgICovCisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OGYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3BvcF9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUE9QXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChyaCAhPSAwKSB7CisJREVDT0RFX1BSSU5URigiSUxMRUdBTCBERUNPREUgT0YgT1BDT0RFIDhGXG4iKTsKKwlIQUxUX1NZUygpOworICAgIH0KKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbDsKKworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gcG9wX2xvbmcoKTsKKwkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0gZWxzZSB7CisJICAgIHUxNiBkZXN0dmFsOworCisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSBwb3Bfd29yZCgpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfQorICAgIH0gZWxzZSB7CQkJLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gcG9wX2xvbmcoKTsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBwb3Bfd29yZCgpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OTAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX25vcCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJOT1BcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OTEtMHg5NworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfeGNoZ193b3JkX0FYX3JlZ2lzdGVyKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MzIgdG1wOworCisgICAgb3AxICY9IDB4NzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwl1MzIgKnJlZzMyOworCURFQ09ERV9QUklOVEYoIlhDSEdcdEVBWCwiKTsKKwlyZWczMiA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKG9wMSk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCXRtcCA9IE0ueDg2LlJfRUFYOworCU0ueDg2LlJfRUFYID0gKnJlZzMyOworCSpyZWczMiA9IHRtcDsKKyAgICB9IGVsc2UgeworCXUxNiAqcmVnMTY7CisJREVDT0RFX1BSSU5URigiWENIR1x0QVgsIik7CisJcmVnMTYgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihvcDEpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwl0bXAgPSBNLng4Ni5SX0FYOworCU0ueDg2LlJfRUFYID0gKnJlZzE2OworCSpyZWcxNiA9ICh1MTYpdG1wOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg5OAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfY2J3KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIkNXREVcbiIpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiQ0JXXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlpZiAoTS54ODYuUl9BWCAmIDB4ODAwMCkgeworCSAgICBNLng4Ni5SX0VBWCB8PSAweGZmZmYwMDAwOworCX0gZWxzZSB7CisJICAgIE0ueDg2LlJfRUFYICY9IDB4MDAwMGZmZmY7CisJfQorICAgIH0gZWxzZSB7CisJaWYgKE0ueDg2LlJfQUwgJiAweDgwKSB7CisJICAgIE0ueDg2LlJfQUggPSAweGZmOworCX0gZWxzZSB7CisJICAgIE0ueDg2LlJfQUggPSAweDA7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg5OQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfY3dkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIkNEUVxuIik7CisgICAgfSBlbHNlIHsKKwlERUNPREVfUFJJTlRGKCJDV0RcbiIpOworICAgIH0KKyAgICBERUNPREVfUFJJTlRGKCJDV0RcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJaWYgKE0ueDg2LlJfRUFYICYgMHg4MDAwMDAwMCkgeworCSAgICBNLng4Ni5SX0VEWCA9IDB4ZmZmZmZmZmY7CisJfSBlbHNlIHsKKwkgICAgTS54ODYuUl9FRFggPSAweDA7CisJfQorICAgIH0gZWxzZSB7CisJaWYgKE0ueDg2LlJfQVggJiAweDgwMDApIHsKKwkgICAgTS54ODYuUl9EWCA9IDB4ZmZmZjsKKwl9IGVsc2UgeworCSAgICBNLng4Ni5SX0RYID0gMHgwOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OWEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2NhbGxfZmFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IGZhcnNlZywgZmFyb2ZmOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKwlERUNPREVfUFJJTlRGKCJDQUxMXHQiKTsKKwlmYXJvZmYgPSBmZXRjaF93b3JkX2ltbSgpOworCWZhcnNlZyA9IGZldGNoX3dvcmRfaW1tKCk7CisJREVDT0RFX1BSSU5URjIoIiUwNHg6IiwgZmFyc2VnKTsKKwlERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgZmFyb2ZmKTsKKwlDQUxMX1RSQUNFKE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCwgZmFyc2VnLCBmYXJvZmYsICJGQVIgIik7CisKKyAgICAvKiBYWFgKKyAgICAgKgorICAgICAqIEhvb2tlZCBpbnRlcnJ1cHQgdmVjdG9ycyBjYWxsaW5nIGludG8gb3VyICJCSU9TIiB3aWxsIGNhdXNlCisgICAgICogcHJvYmxlbXMgdW5sZXNzIGFsbCBpbnRlcnNlZ21lbnQgc3R1ZmYgaXMgY2hlY2tlZCBmb3IgQklPUworICAgICAqIGFjY2Vzcy4JQ2hlY2sgbmVlZGVkIGhlcmUuICBGb3IgbW9tZW50LCBsZXQgaXQgYWxvbmUuCisgICAgICovCisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisgICAgTS54ODYuUl9DUyA9IGZhcnNlZzsKKyAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisgICAgTS54ODYuUl9JUCA9IGZhcm9mZjsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg5YgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfd2FpdCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJXQUlUIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAvKiBOQURBLiAgKi8KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg5YworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHVzaGZfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIGZsYWdzOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGKCJQVVNIRkRcbiIpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiUFVTSEZcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworCisgICAgLyogY2xlYXIgb3V0ICphbGwqIGJpdHMgbm90IHJlcHJlc2VudGluZyBmbGFncywgYW5kIHR1cm4gb24gcmVhbCBiaXRzICovCisgICAgZmxhZ3MgPSAoTS54ODYuUl9FRkxHICYgRl9NU0spIHwgRl9BTFdBWVNfT047CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJcHVzaF9sb25nKGZsYWdzKTsKKyAgICB9IGVsc2UgeworCXB1c2hfd29yZCgodTE2KWZsYWdzKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3BvcGZfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGKCJQT1BGRFxuIik7CisgICAgfSBlbHNlIHsKKwlERUNPREVfUFJJTlRGKCJQT1BGXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlNLng4Ni5SX0VGTEcgPSBwb3BfbG9uZygpOworICAgIH0gZWxzZSB7CisJTS54ODYuUl9GTEcgPSBwb3Bfd29yZCgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg5ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc2FoZih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJTQUhGXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIC8qIGNsZWFyIHRoZSBsb3dlciBiaXRzIG9mIHRoZSBmbGFnIHJlZ2lzdGVyICovCisgICAgTS54ODYuUl9GTEcgJj0gMHhmZmZmZmYwMDsKKyAgICAvKiBvciBpbiB0aGUgQUggcmVnaXN0ZXIgaW50byB0aGUgZmxhZ3MgcmVnaXN0ZXIgKi8KKyAgICBNLng4Ni5SX0ZMRyB8PSBNLng4Ni5SX0FIOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDlmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9sYWhmKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxBSEZcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisJTS54ODYuUl9BSCA9ICh1OCkoTS54ODYuUl9GTEcgJiAweGZmKTsKKyAgICAvKnVuZG9jdW1lbnRlZCBUQysrIGJlaGF2aW9yPz8/IE5vcGUuICBJdCdzIGRvY3VtZW50ZWQsIGJ1dAorICAgICAgIHlvdSBoYXZlIHRvbyBsb29rIHJlYWwgaGFyZCB0byBub3RpY2UgaXQuICovCisgICAgTS54ODYuUl9BSCB8PSAweDI7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YTAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl9BTF9NX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHRBTCwiKTsKKyAgICBvZmZzZXQgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCJbJTA0eF1cbiIsIG9mZnNldCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0FMID0gZmV0Y2hfZGF0YV9ieXRlKG9mZnNldCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YTEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl9BWF9NX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgb2Zmc2V0ID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGMigiTU9WXHRFQVgsWyUwNHhdXG4iLCBvZmZzZXQpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URjIoIk1PVlx0QVgsWyUwNHhdXG4iLCBvZmZzZXQpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCU0ueDg2LlJfRUFYID0gZmV0Y2hfZGF0YV9sb25nKG9mZnNldCk7CisgICAgfSBlbHNlIHsKKwlNLng4Ni5SX0FYID0gZmV0Y2hfZGF0YV93b3JkKG9mZnNldCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGEyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZfTV9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7CisgICAgb2Zmc2V0ID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiWyUwNHhdLEFMXG4iLCBvZmZzZXQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgc3RvcmVfZGF0YV9ieXRlKG9mZnNldCwgTS54ODYuUl9BTCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YTMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl9NX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgb2Zmc2V0ID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGMigiTU9WXHRbJTA0eF0sRUFYXG4iLCBvZmZzZXQpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URjIoIk1PVlx0WyUwNHhdLEFYXG4iLCBvZmZzZXQpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCXN0b3JlX2RhdGFfbG9uZyhvZmZzZXQsIE0ueDg2LlJfRUFYKTsKKyAgICB9IGVsc2UgeworCXN0b3JlX2RhdGFfd29yZChvZmZzZXQsIE0ueDg2LlJfQVgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhNAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92c19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1OAl2YWw7CisgICAgdTMyIGNvdW50OworICAgIGludCBpbmM7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlNcdEJZVEVcbiIpOworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCisJaW5jID0gLTE7CisgICAgZWxzZQorCWluYyA9IDE7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBjb3VudCA9IDE7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgeworCS8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KKwkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKwljb3VudCA9IE0ueDg2LlJfQ1g7CisJTS54ODYuUl9DWCA9IDA7CisJTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7CisgICAgfQorICAgIHdoaWxlIChjb3VudC0tKSB7CisJdmFsID0gZmV0Y2hfZGF0YV9ieXRlKE0ueDg2LlJfU0kpOworCXN0b3JlX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgdmFsKTsKKwlNLng4Ni5SX1NJICs9IGluYzsKKwlNLng4Ni5SX0RJICs9IGluYzsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YTUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdnNfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIHZhbDsKKyAgICBpbnQgaW5jOworICAgIHUzMiBjb3VudDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiTU9WU1x0RFdPUkRcbiIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkJICAgIC8qIGRvd24gKi8KKwkgICAgaW5jID0gLTQ7CisJZWxzZQorCSAgICBpbmMgPSA0OworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiTU9WU1x0V09SRFxuIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfREYpKQkgICAgLyogZG93biAqLworCSAgICBpbmMgPSAtMjsKKwllbHNlCisJICAgIGluYyA9IDI7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgY291bnQgPSAxOworICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKKwkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCisJLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisJY291bnQgPSBNLng4Ni5SX0NYOworCU0ueDg2LlJfQ1ggPSAwOworCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOworICAgIH0KKyAgICB3aGlsZSAoY291bnQtLSkgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB2YWwgPSBmZXRjaF9kYXRhX2xvbmcoTS54ODYuUl9TSSk7CisJICAgIHN0b3JlX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgdmFsKTsKKwl9IGVsc2UgeworCSAgICB2YWwgPSBmZXRjaF9kYXRhX3dvcmQoTS54ODYuUl9TSSk7CisJICAgIHN0b3JlX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgKHUxNil2YWwpOworCX0KKwlNLng4Ni5SX1NJICs9IGluYzsKKwlNLng4Ni5SX0RJICs9IGluYzsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2NtcHNfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczggdmFsMSwgdmFsMjsKKyAgICBpbnQgaW5jOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJDTVBTXHRCWVRFXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCisJaW5jID0gLTE7CisgICAgZWxzZQorCWluYyA9IDE7CisKKyAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7CisJLyogUkVQRQkgKi8KKwkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKwl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7CisJICAgIHZhbDEgPSBmZXRjaF9kYXRhX2J5dGUoTS54ODYuUl9TSSk7CisJICAgIHZhbDIgPSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworCQkgICAgIGNtcF9ieXRlKHZhbDEsIHZhbDIpOworCSAgICBNLng4Ni5SX0NYIC09IDE7CisJICAgIE0ueDg2LlJfU0kgKz0gaW5jOworCSAgICBNLng4Ni5SX0RJICs9IGluYzsKKwkgICAgaWYgKCAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUEUpICYmIChBQ0NFU1NfRkxBRyhGX1pGKSA9PSAwKSApIGJyZWFrOworCSAgICBpZiAoIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQTkUpICYmIEFDQ0VTU19GTEFHKEZfWkYpICkgYnJlYWs7CisJfQorCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOworICAgIH0gZWxzZSB7CisJdmFsMSA9IGZldGNoX2RhdGFfYnl0ZShNLng4Ni5SX1NJKTsKKwl2YWwyID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwljbXBfYnl0ZSh2YWwxLCB2YWwyKTsKKwlNLng4Ni5SX1NJICs9IGluYzsKKwlNLng4Ni5SX0RJICs9IGluYzsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YTcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2NtcHNfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIHZhbDEsdmFsMjsKKyAgICBpbnQgaW5jOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGKCJDTVBTXHREV09SRFxuIik7CisJaW5jID0gNDsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIkNNUFNcdFdPUkRcbiIpOworCWluYyA9IDI7CisgICAgfQorICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCisJaW5jID0gLWluYzsKKworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgeworCS8qIFJFUEUJICovCisJLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisJd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgeworCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkJdmFsMSA9IGZldGNoX2RhdGFfbG9uZyhNLng4Ni5SX1NJKTsKKwkJdmFsMiA9IGZldGNoX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJCWNtcF9sb25nKHZhbDEsIHZhbDIpOworCSAgICB9IGVsc2UgeworCQl2YWwxID0gZmV0Y2hfZGF0YV93b3JkKE0ueDg2LlJfU0kpOworCQl2YWwyID0gZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkJY21wX3dvcmQoKHUxNil2YWwxLCAodTE2KXZhbDIpOworCSAgICB9CisJICAgIE0ueDg2LlJfQ1ggLT0gMTsKKwkgICAgTS54ODYuUl9TSSArPSBpbmM7CisJICAgIE0ueDg2LlJfREkgKz0gaW5jOworCSAgICBpZiAoIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQRSkgJiYgQUNDRVNTX0ZMQUcoRl9aRikgPT0gMCApIGJyZWFrOworCSAgICBpZiAoIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQTkUpICYmIEFDQ0VTU19GTEFHKEZfWkYpICkgYnJlYWs7CisJfQorCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOworICAgIH0gZWxzZSB7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHZhbDEgPSBmZXRjaF9kYXRhX2xvbmcoTS54ODYuUl9TSSk7CisJICAgIHZhbDIgPSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworCSAgICBjbXBfbG9uZyh2YWwxLCB2YWwyKTsKKwl9IGVsc2UgeworCSAgICB2YWwxID0gZmV0Y2hfZGF0YV93b3JkKE0ueDg2LlJfU0kpOworCSAgICB2YWwyID0gZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkgICAgY21wX3dvcmQoKHUxNil2YWwxLCAodTE2KXZhbDIpOworCX0KKwlNLng4Ni5SX1NJICs9IGluYzsKKwlNLng4Ni5SX0RJICs9IGluYzsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YTgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3Rlc3RfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgaW1tOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJURVNUXHRBTCwiKTsKKyAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBpbW0pOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisJdGVzdF9ieXRlKE0ueDg2LlJfQUwsICh1OClpbW0pOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGE5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF90ZXN0X0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiVEVTVFx0RUFYLCIpOworCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7CisgICAgfSBlbHNlIHsKKwlERUNPREVfUFJJTlRGKCJURVNUXHRBWCwiKTsKKwlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIH0KKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwl0ZXN0X2xvbmcoTS54ODYuUl9FQVgsIHNyY3ZhbCk7CisgICAgfSBlbHNlIHsKKwl0ZXN0X3dvcmQoTS54ODYuUl9BWCwgKHUxNilzcmN2YWwpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhYQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc3Rvc19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgaW5jOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJTVE9TXHRCWVRFXG4iKTsKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLworCWluYyA9IC0xOworICAgIGVsc2UKKwlpbmMgPSAxOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgeworCS8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KKwkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKwl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7CisJICAgIHN0b3JlX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgTS54ODYuUl9BTCk7CisJICAgIE0ueDg2LlJfQ1ggLT0gMTsKKwkgICAgTS54ODYuUl9ESSArPSBpbmM7CisJfQorCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOworICAgIH0gZWxzZSB7CisJc3RvcmVfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCBNLng4Ni5SX0FMKTsKKwlNLng4Ni5SX0RJICs9IGluYzsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YWIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3N0b3Nfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IGluYzsKKyAgICB1MzIgY291bnQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIlNUT1NcdERXT1JEXG4iKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpCSAvKiBkb3duICovCisJICAgIGluYyA9IC00OworCWVsc2UKKwkgICAgaW5jID0gNDsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIlNUT1NcdFdPUkRcbiIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkJIC8qIGRvd24gKi8KKwkgICAgaW5jID0gLTI7CisJZWxzZQorCSAgICBpbmMgPSAyOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGNvdW50ID0gMTsKKyAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7CisJLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLworCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLworCWNvdW50ID0gTS54ODYuUl9DWDsKKwlNLng4Ni5SX0NYID0gMDsKKwlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKKyAgICB9CisgICAgd2hpbGUgKGNvdW50LS0pIHsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgc3RvcmVfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCBNLng4Ni5SX0VBWCk7CisJfSBlbHNlIHsKKwkgICAgc3RvcmVfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCBNLng4Ni5SX0FYKTsKKwl9CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGFjCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9sb2RzX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBpbmM7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxPRFNcdEJZVEVcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KKwlpbmMgPSAtMTsKKyAgICBlbHNlCisJaW5jID0gMTsKKyAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7CisJLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLworCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLworCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKKwkgICAgTS54ODYuUl9BTCA9IGZldGNoX2RhdGFfYnl0ZShNLng4Ni5SX1NJKTsKKwkgICAgTS54ODYuUl9DWCAtPSAxOworCSAgICBNLng4Ni5SX1NJICs9IGluYzsKKwl9CisJTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7CisgICAgfSBlbHNlIHsKKwlNLng4Ni5SX0FMID0gZmV0Y2hfZGF0YV9ieXRlKE0ueDg2LlJfU0kpOworCU0ueDg2LlJfU0kgKz0gaW5jOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbG9kc193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgaW5jOworICAgIHUzMiBjb3VudDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiTE9EU1x0RFdPUkRcbiIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkJIC8qIGRvd24gKi8KKwkgICAgaW5jID0gLTQ7CisJZWxzZQorCSAgICBpbmMgPSA0OworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiTE9EU1x0V09SRFxuIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfREYpKQkgLyogZG93biAqLworCSAgICBpbmMgPSAtMjsKKwllbHNlCisJICAgIGluYyA9IDI7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgY291bnQgPSAxOworICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKKwkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCisJLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisJY291bnQgPSBNLng4Ni5SX0NYOworCU0ueDg2LlJfQ1ggPSAwOworCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOworICAgIH0KKyAgICB3aGlsZSAoY291bnQtLSkgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICBNLng4Ni5SX0VBWCA9IGZldGNoX2RhdGFfbG9uZyhNLng4Ni5SX1NJKTsKKwl9IGVsc2UgeworCSAgICBNLng4Ni5SX0FYID0gZmV0Y2hfZGF0YV93b3JkKE0ueDg2LlJfU0kpOworCX0KKwlNLng4Ni5SX1NJICs9IGluYzsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3NjYXNfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczggdmFsMjsKKyAgICBpbnQgaW5jOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJTQ0FTXHRCWVRFXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCisJaW5jID0gLTE7CisgICAgZWxzZQorCWluYyA9IDE7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBFKSB7CisJLyogUkVQRQkgKi8KKwkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKwl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7CisJICAgIHZhbDIgPSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworCSAgICBjbXBfYnl0ZShNLng4Ni5SX0FMLCB2YWwyKTsKKwkgICAgTS54ODYuUl9DWCAtPSAxOworCSAgICBNLng4Ni5SX0RJICs9IGluYzsKKwkgICAgaWYgKEFDQ0VTU19GTEFHKEZfWkYpID09IDApCisJCWJyZWFrOworCX0KKwlNLng4Ni5tb2RlICY9IH5TWVNNT0RFX1BSRUZJWF9SRVBFOworICAgIH0gZWxzZSBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUE5FKSB7CisJLyogUkVQTkUgICovCisJLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisJd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgeworCSAgICB2YWwyID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkgICAgY21wX2J5dGUoTS54ODYuUl9BTCwgdmFsMik7CisJICAgIE0ueDg2LlJfQ1ggLT0gMTsKKwkgICAgTS54ODYuUl9ESSArPSBpbmM7CisJICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSkKKwkJYnJlYWs7CQkvKiB6ZXJvIGZsYWcgc2V0IG1lYW5zIGVxdWFsICovCisJfQorCU0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUE5FOworICAgIH0gZWxzZSB7CisJdmFsMiA9IGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJY21wX2J5dGUoTS54ODYuUl9BTCwgdmFsMik7CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGFmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zY2FzX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBpbmM7CisgICAgdTMyIHZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiU0NBU1x0RFdPUkRcbiIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkJIC8qIGRvd24gKi8KKwkgICAgaW5jID0gLTQ7CisJZWxzZQorCSAgICBpbmMgPSA0OworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiU0NBU1x0V09SRFxuIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfREYpKQkgLyogZG93biAqLworCSAgICBpbmMgPSAtMjsKKwllbHNlCisJICAgIGluYyA9IDI7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBFKSB7CisJLyogUkVQRQkgKi8KKwkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKwl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7CisJICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQl2YWwgPSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworCQljbXBfbG9uZyhNLng4Ni5SX0VBWCwgdmFsKTsKKwkgICAgfSBlbHNlIHsKKwkJdmFsID0gZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkJY21wX3dvcmQoTS54ODYuUl9BWCwgKHUxNil2YWwpOworCSAgICB9CisJICAgIE0ueDg2LlJfQ1ggLT0gMTsKKwkgICAgTS54ODYuUl9ESSArPSBpbmM7CisJICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSA9PSAwKQorCQlicmVhazsKKwl9CisJTS54ODYubW9kZSAmPSB+U1lTTU9ERV9QUkVGSVhfUkVQRTsKKyAgICB9IGVsc2UgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBORSkgeworCS8qIFJFUE5FICAqLworCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLworCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKKwkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCXZhbCA9IGZldGNoX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJCWNtcF9sb25nKE0ueDg2LlJfRUFYLCB2YWwpOworCSAgICB9IGVsc2UgeworCQl2YWwgPSBmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworCQljbXBfd29yZChNLng4Ni5SX0FYLCAodTE2KXZhbCk7CisJICAgIH0KKwkgICAgTS54ODYuUl9DWCAtPSAxOworCSAgICBNLng4Ni5SX0RJICs9IGluYzsKKwkgICAgaWYgKEFDQ0VTU19GTEFHKEZfWkYpKQorCQlicmVhazsJCS8qIHplcm8gZmxhZyBzZXQgbWVhbnMgZXF1YWwgKi8KKwl9CisJTS54ODYubW9kZSAmPSB+U1lTTU9ERV9QUkVGSVhfUkVQTkU7CisgICAgfSBlbHNlIHsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdmFsID0gZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkgICAgY21wX2xvbmcoTS54ODYuUl9FQVgsIHZhbCk7CisJfSBlbHNlIHsKKwkgICAgdmFsID0gZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkgICAgY21wX3dvcmQoTS54ODYuUl9BWCwgKHUxNil2YWwpOworCX0KKwlNLng4Ni5SX0RJICs9IGluYzsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YjAgLSAweGI3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9yZWdpc3Rlcl9JTU0odTggb3AxKQoreworICAgIHU4IGltbSwgKnB0cjsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBwdHIgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihvcDEgJiAweDcpOworICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKyAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICpwdHIgPSBpbW07CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YjggLSAweGJmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9yZWdpc3Rlcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiBzcmN2YWw7CisKKyAgICBvcDEgJj0gMHg3OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCXUzMiAqcmVnMzI7CisJcmVnMzIgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihvcDEpOworCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7CisJREVDT0RFX1BSSU5URjIoIiwleFxuIiwgc3JjdmFsKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpyZWczMiA9IHNyY3ZhbDsKKyAgICB9IGVsc2UgeworCXUxNiAqcmVnMTY7CisJcmVnMTYgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihvcDEpOworCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisJREVDT0RFX1BSSU5URjIoIiwleFxuIiwgc3JjdmFsKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpyZWcxNiA9ICh1MTYpc3JjdmFsOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjMAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjQzBfYnl0ZV9STV9NRU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggZGVzdHZhbDsKKyAgICB1OCBhbXQ7CisKKyAgICAvKgorICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgorICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCisgICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisKKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOworCSAgICBicmVhazsKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCisgICAgICAgbW9kZS4gKi8KKyAgICBpZiAobW9kIDwgMykgeworCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWFtdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKKwlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworCVRSQUNFX0FORF9TVEVQKCk7CisJZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKKwlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCWFtdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBhbXQpOworCSpkZXN0cmVnID0gZGVzdHZhbDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YzEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wY0MxX3dvcmRfUk1fTUVNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGFtdDsKKworICAgIC8qCisgICAgICogWWV0IGFub3RoZXIgd2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mCisgICAgICogdGhlIG9wY29kZSBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQKKyAgICAgKiByZXN1bHQsIGV4Y2VwdCB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCisgICAgICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7CisJLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKwkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQorCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKworCXN3aXRjaCAocmgpIHsKKwljYXNlIDA6CisJICAgIERFQ09ERV9QUklOVEYoIlJPTFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMToKKwkgICAgREVDT0RFX1BSSU5URigiUk9SXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgorCSAgICBERUNPREVfUFJJTlRGKCJSQ0xcdCIpOworCSAgICBicmVhazsKKwljYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYoIlJDUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URigiU0hMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGKCJTSFJcdCIpOworCSAgICBicmVhazsKKwljYXNlIDY6CisJICAgIERFQ09ERV9QUklOVEYoIlNBTFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNzoKKwkgICAgREVDT0RFX1BSSU5URigiU0FSXHQiKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyNlbmRpZgorICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKKyAgICAgICBtb2RlLiAqLworICAgIGlmIChtb2QgPCAzKSB7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBkZXN0dmFsOworCisJICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKKwkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7CisJICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9IGVsc2UgeworCSAgICB1MTYgZGVzdHZhbDsKKworCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKKwkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7CisJICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBhbXQpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YzIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3JldF9uZWFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUkVUXHQiKTsKKyAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKwlSRVRVUk5fVFJBQ0UoIlJFVCIsTS54ODYuc2F2ZWRfY3MsTS54ODYuc2F2ZWRfaXApOworCVRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9JUCA9IHBvcF93b3JkKCk7CisgICAgTS54ODYuUl9TUCArPSBpbW07CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YzMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3JldF9uZWFyKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlJFVFxuIik7CisJUkVUVVJOX1RSQUNFKCJSRVQiLE0ueDg2LnNhdmVkX2NzLE0ueDg2LnNhdmVkX2lwKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfSVAgPSBwb3Bfd29yZCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGM0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9sZXNfUl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJoLCBybDsKKyAgICB1MTYgKmRzdHJlZzsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTEVTXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJTS54ODYuUl9FUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKKyAgICB9CisgICAgLyogZWxzZSBVTkRFRklORUQhCQkJIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjNQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbGRzX1JfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCByaCwgcmw7CisgICAgdTE2ICpkc3RyZWc7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxEU1x0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCU0ueDg2LlJfRFMgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7CisgICAgfQorICAgIC8qIGVsc2UgVU5ERUZJTkVEISAqLworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGM2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9STV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggaW1tOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKHJoICE9IDApIHsKKwlERUNPREVfUFJJTlRGKCJJTExFR0FMIERFQ09ERSBPRiBPUENPREUgYzZcbiIpOworCUhBTFRfU1lTKCk7CisgICAgfQorICAgIGlmIChtb2QgPCAzKSB7CisJREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwlERUNPREVfUFJJTlRGMigiLCUyeFxuIiwgaW1tKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBpbW0pOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIsJTJ4XG4iLCBpbW0pOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRlc3RyZWcgPSBpbW07CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGM3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9STV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAocmggIT0gMCkgeworCURFQ09ERV9QUklOVEYoIklMTEVHQUwgREVDT0RFIE9GIE9QQ09ERSA4RlxuIik7CisJSEFMVF9TWVMoKTsKKyAgICB9CisgICAgaWYgKG1vZCA8IDMpIHsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGltbTsKKworCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgaW1tKTsKKwl9IGVsc2UgeworCSAgICB1MTYgaW1tOworCisJICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOworCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGltbSk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCQl1MzIgKmRlc3RyZWc7CisJCQl1MzIgaW1tOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gaW1tOworCX0gZWxzZSB7CisJCQl1MTYgKmRlc3RyZWc7CisJCQl1MTYgaW1tOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gaW1tOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YzgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2VudGVyKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MTYgbG9jYWwsZnJhbWVfcG9pbnRlcjsKKyAgICB1OAluZXN0aW5nOworICAgIGludCBpOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBsb2NhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgbmVzdGluZyA9IGZldGNoX2J5dGVfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIkVOVEVSICV4XG4iLCBsb2NhbCk7CisgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgbmVzdGluZyk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBwdXNoX3dvcmQoTS54ODYuUl9CUCk7CisgICAgZnJhbWVfcG9pbnRlciA9IE0ueDg2LlJfU1A7CisgICAgaWYgKG5lc3RpbmcgPiAwKSB7CisJZm9yIChpID0gMTsgaSA8IG5lc3Rpbmc7IGkrKykgeworCSAgICBNLng4Ni5SX0JQIC09IDI7CisJICAgIHB1c2hfd29yZChmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfU1MsIE0ueDg2LlJfQlApKTsKKwkgICAgfQorCXB1c2hfd29yZChmcmFtZV9wb2ludGVyKTsKKwl9CisgICAgTS54ODYuUl9CUCA9IGZyYW1lX3BvaW50ZXI7CisgICAgTS54ODYuUl9TUCA9ICh1MTYpKE0ueDg2LlJfU1AgLSBsb2NhbCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YzkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2xlYXZlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxFQVZFXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfU1AgPSBNLng4Ni5SX0JQOworICAgIE0ueDg2LlJfQlAgPSBwb3Bfd29yZCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGNhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9yZXRfZmFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUkVURlx0Iik7CisgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisJUkVUVVJOX1RSQUNFKCJSRVRGIixNLng4Ni5zYXZlZF9jcyxNLng4Ni5zYXZlZF9pcCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0lQID0gcG9wX3dvcmQoKTsKKyAgICBNLng4Ni5SX0NTID0gcG9wX3dvcmQoKTsKKyAgICBNLng4Ni5SX1NQICs9IGltbTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjYgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcmV0X2Zhcih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJSRVRGXG4iKTsKKwlSRVRVUk5fVFJBQ0UoIlJFVEYiLE0ueDg2LnNhdmVkX2NzLE0ueDg2LnNhdmVkX2lwKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfSVAgPSBwb3Bfd29yZCgpOworICAgIE0ueDg2LlJfQ1MgPSBwb3Bfd29yZCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGNjCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbnQzKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MTYgdG1wOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJJTlQgM1xuIik7CisgICAgdG1wID0gKHUxNikgbWVtX2FjY2Vzc193b3JkKDMgKiA0ICsgMik7CisgICAgLyogYWNjZXNzIHRoZSBzZWdtZW50IHJlZ2lzdGVyICovCisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwlpZiAoX1g4NkVNVV9pbnRyVGFiWzNdKSB7CisJCSgqX1g4NkVNVV9pbnRyVGFiWzNdKSgzKTsKKyAgICB9IGVsc2UgeworCXB1c2hfd29yZCgodTE2KU0ueDg2LlJfRkxHKTsKKwlDTEVBUl9GTEFHKEZfSUYpOworCUNMRUFSX0ZMQUcoRl9URik7CisJcHVzaF93b3JkKE0ueDg2LlJfQ1MpOworCU0ueDg2LlJfQ1MgPSBtZW1fYWNjZXNzX3dvcmQoMyAqIDQgKyAyKTsKKwlwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisJTS54ODYuUl9JUCA9IG1lbV9hY2Nlc3Nfd29yZCgzICogNCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGNkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbnRfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MTYgdG1wOworICAgIHU4IGludG51bTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU5UXHQiKTsKKyAgICBpbnRudW0gPSBmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW50bnVtKTsKKyAgICB0bXAgPSBtZW1fYWNjZXNzX3dvcmQoaW50bnVtICogNCArIDIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisJaWYgKF9YODZFTVVfaW50clRhYltpbnRudW1dKSB7CisJCSgqX1g4NkVNVV9pbnRyVGFiW2ludG51bV0pKGludG51bSk7CisgICAgfSBlbHNlIHsKKwlwdXNoX3dvcmQoKHUxNilNLng4Ni5SX0ZMRyk7CisJQ0xFQVJfRkxBRyhGX0lGKTsKKwlDTEVBUl9GTEFHKEZfVEYpOworCXB1c2hfd29yZChNLng4Ni5SX0NTKTsKKwlNLng4Ni5SX0NTID0gbWVtX2FjY2Vzc193b3JkKGludG51bSAqIDQgKyAyKTsKKwlwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisJTS54ODYuUl9JUCA9IG1lbV9hY2Nlc3Nfd29yZChpbnRudW0gKiA0KTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4Y2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2ludG8odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiB0bXA7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklOVE9cbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKEFDQ0VTU19GTEFHKEZfT0YpKSB7CisJdG1wID0gbWVtX2FjY2Vzc193b3JkKDQgKiA0ICsgMik7CisJCWlmIChfWDg2RU1VX2ludHJUYWJbNF0pIHsKKwkJCSgqX1g4NkVNVV9pbnRyVGFiWzRdKSg0KTsKKwl9IGVsc2UgeworCSAgICBwdXNoX3dvcmQoKHUxNilNLng4Ni5SX0ZMRyk7CisJICAgIENMRUFSX0ZMQUcoRl9JRik7CisJICAgIENMRUFSX0ZMQUcoRl9URik7CisJICAgIHB1c2hfd29yZChNLng4Ni5SX0NTKTsKKwkgICAgTS54ODYuUl9DUyA9IG1lbV9hY2Nlc3Nfd29yZCg0ICogNCArIDIpOworCSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisJICAgIE0ueDg2LlJfSVAgPSBtZW1fYWNjZXNzX3dvcmQoNCAqIDQpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4Y2YKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2lyZXQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSVJFVFxuIik7CisKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworCisgICAgTS54ODYuUl9JUCA9IHBvcF93b3JkKCk7CisgICAgTS54ODYuUl9DUyA9IHBvcF93b3JkKCk7CisgICAgTS54ODYuUl9GTEcgPSBwb3Bfd29yZCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGQwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGNEMF9ieXRlX1JNXzEodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggZGVzdHZhbDsKKworICAgIC8qCisgICAgICogWWV0IGFub3RoZXIgd2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mCisgICAgICogdGhlIG9wY29kZSBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQKKyAgICAgKiByZXN1bHQsIGV4Y2VwdCB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCisgICAgICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7CisJLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKwkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQorCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOworCSAgICBicmVhazsKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCisgICAgICAgbW9kZS4gKi8KKyAgICBpZiAobW9kIDwgMykgeworCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIiwxXG4iKTsKKwlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworCVRSQUNFX0FORF9TVEVQKCk7CisJZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgMSk7CisJc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlERUNPREVfUFJJTlRGKCIsMVxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgMSk7CisJKmRlc3RyZWcgPSBkZXN0dmFsOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhkMQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjRDFfd29yZF9STV8xKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgLyoKKyAgICAgKiBZZXQgYW5vdGhlciB3ZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YKKyAgICAgKiB0aGUgb3Bjb2RlIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZAorICAgICAqIHJlc3VsdCwgZXhjZXB0IHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKKwkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQorCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCisJICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCisJICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLworCXN3aXRjaCAocmgpIHsKKwljYXNlIDA6CisJICAgIERFQ09ERV9QUklOVEYoIlJPTFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMToKKwkgICAgREVDT0RFX1BSSU5URigiUk9SXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgorCSAgICBERUNPREVfUFJJTlRGKCJSQ0xcdCIpOworCSAgICBicmVhazsKKwljYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYoIlJDUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URigiU0hMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGKCJTSFJcdCIpOworCSAgICBicmVhazsKKwljYXNlIDY6CisJICAgIERFQ09ERV9QUklOVEYoIlNBTFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNzoKKwkgICAgREVDT0RFX1BSSU5URigiU0FSXHQiKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyNlbmRpZgorICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKKyAgICAgICBtb2RlLiAqLworICAgIGlmIChtb2QgPCAzKSB7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBkZXN0dmFsOworCisJICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKKwkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgMSk7CisJICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9IGVsc2UgeworCSAgICB1MTYgZGVzdHZhbDsKKworCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKKwkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgMSk7CisJICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkJCXUzMiBkZXN0dmFsOworCQkJdTMyICpkZXN0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIDEpOworCSAgICAqZGVzdHJlZyA9IGRlc3R2YWw7CisJfSBlbHNlIHsKKwkJCXUxNiBkZXN0dmFsOworCQkJdTE2ICpkZXN0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIDEpOworCSAgICAqZGVzdHJlZyA9IGRlc3R2YWw7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhkMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjRDJfYnl0ZV9STV9DTCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBkZXN0dmFsOworICAgIHU4IGFtdDsKKworICAgIC8qCisgICAgICogWWV0IGFub3RoZXIgd2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mCisgICAgICogdGhlIG9wY29kZSBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQKKyAgICAgKiByZXN1bHQsIGV4Y2VwdCB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCisgICAgICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7CisJLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKwkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQorCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOworCSAgICBicmVhazsKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCisgICAgICAgbW9kZS4gKi8KKyAgICBhbXQgPSBNLng4Ni5SX0NMOworICAgIGlmIChtb2QgPCAzKSB7CisJREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLENMXG4iKTsKKwlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworCVRSQUNFX0FORF9TVEVQKCk7CisJZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKKwlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCURFQ09ERV9QUklOVEYoIixDTFxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKKwkqZGVzdHJlZyA9IGRlc3R2YWw7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGQzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGNEM193b3JkX1JNX0NMKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGFtdDsKKworICAgIC8qCisgICAgICogWWV0IGFub3RoZXIgd2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mCisgICAgICogdGhlIG9wY29kZSBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQKKyAgICAgKiByZXN1bHQsIGV4Y2VwdCB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCisgICAgICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7CisJLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKwkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQorCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOworCSAgICBicmVhazsKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCisgICAgICAgbW9kZS4gKi8KKyAgICBhbXQgPSBNLng4Ni5SX0NMOworICAgIGlmIChtb2QgPCAzKSB7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBkZXN0dmFsOworCisJICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKKwkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7CisJICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9IGVsc2UgeworCSAgICB1MTYgZGVzdHZhbDsKKworCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKKwkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7CisJICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBhbXQpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZDQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2FhbSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggYTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQUFNXG4iKTsKKyAgICBhID0gZmV0Y2hfYnl0ZV9pbW0oKTsgICAgICAvKiB0aGlzIGlzIGEgc3R1cGlkIGVuY29kaW5nLiAqLworICAgIGlmIChhICE9IDEwKSB7CisJREVDT0RFX1BSSU5URigiRVJST1IgREVDT0RJTkcgQUFNXG4iKTsKKwlUUkFDRV9SRUdTKCk7CisJSEFMVF9TWVMoKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAvKiBub3RlIHRoZSB0eXBlIGNoYW5nZSBoZXJlIC0tLSByZXR1cm5pbmcgQUwgYW5kIEFIIGluIEFYLiAqLworICAgIE0ueDg2LlJfQVggPSBhYW1fd29yZChNLng4Ni5SX0FMKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhkNQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfYWFkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1OCBhOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJBQURcbiIpOworICAgIGEgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9BWCA9IGFhZF93b3JkKE0ueDg2LlJfQVgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyogb3Bjb2RlIDB4ZDYgSUxMRUdBTCBPUENPREUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGQ3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF94bGF0KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MTYgYWRkcjsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiWExBVFxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwlhZGRyID0gKHUxNikoTS54ODYuUl9CWCArICh1OClNLng4Ni5SX0FMKTsKKyAgICBNLng4Ni5SX0FMID0gZmV0Y2hfZGF0YV9ieXRlKGFkZHIpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyogaW5zdHVjdGlvbnMJRDggLi4gREYgYXJlIGluIGk4N19vcHMuYyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2xvb3BuZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczE2IGlwOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMT09QTkVcdCIpOworICAgIGlwID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOworICAgIGlwICs9IChzMTYpIE0ueDg2LlJfSVA7CisgICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGlwKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQ1ggLT0gMTsKKyAgICBpZiAoTS54ODYuUl9DWCAhPSAwICYmICFBQ0NFU1NfRkxBRyhGX1pGKSkJICAgIC8qIENYICE9IDAgYW5kICFaRiAqLworCU0ueDg2LlJfSVAgPSBpcDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlMQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbG9vcGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHMxNiBpcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTE9PUEVcdCIpOworICAgIGlwID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOworICAgIGlwICs9IChzMTYpIE0ueDg2LlJfSVA7CisgICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGlwKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQ1ggLT0gMTsKKyAgICBpZiAoTS54ODYuUl9DWCAhPSAwICYmIEFDQ0VTU19GTEFHKEZfWkYpKQkgICAgLyogQ1ggIT0gMCBhbmQgWkYgKi8KKwlNLng4Ni5SX0lQID0gaXA7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2xvb3AodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHMxNiBpcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTE9PUFx0Iik7CisgICAgaXAgPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7CisgICAgaXAgKz0gKHMxNikgTS54ODYuUl9JUDsKKyAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaXApOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9DWCAtPSAxOworICAgIGlmIChNLng4Ni5SX0NYICE9IDApCisJTS54ODYuUl9JUCA9IGlwOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGUzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9qY3h6KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MTYgdGFyZ2V0OworICAgIHM4CW9mZnNldDsKKworICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgb3ZlcmZsb3cgZmxhZyBpcyBzZXQgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkpDWFpcdCIpOworICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOworICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyBvZmZzZXQpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5SX0NYID09IDApCisJTS54ODYuUl9JUCA9IHRhcmdldDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlNAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaW5fYnl0ZV9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHU4IHBvcnQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklOXHQiKTsKKwlwb3J0ID0gKHU4KSBmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCIleCxBTFxuIiwgcG9ydCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0FMID0gKCpzeXNfaW5iKShwb3J0KTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlNQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaW5fd29yZF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHU4IHBvcnQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklOXHQiKTsKKwlwb3J0ID0gKHU4KSBmZXRjaF9ieXRlX2ltbSgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYyKCJFQVgsJXhcbiIsIHBvcnQpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URjIoIkFYLCV4XG4iLCBwb3J0KTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlNLng4Ni5SX0VBWCA9ICgqc3lzX2lubCkocG9ydCk7CisgICAgfSBlbHNlIHsKKwlNLng4Ni5SX0FYID0gKCpzeXNfaW53KShwb3J0KTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX291dF9ieXRlX0lNTV9BTCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggcG9ydDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiT1VUXHQiKTsKKwlwb3J0ID0gKHU4KSBmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCIleCxBTFxuIiwgcG9ydCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAoKnN5c19vdXRiKShwb3J0LCBNLng4Ni5SX0FMKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3V0X3dvcmRfSU1NX0FYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1OCBwb3J0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJPVVRcdCIpOworCXBvcnQgPSAodTgpIGZldGNoX2J5dGVfaW1tKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URjIoIiV4LEVBWFxuIiwgcG9ydCk7CisgICAgfSBlbHNlIHsKKwlERUNPREVfUFJJTlRGMigiJXgsQVhcbiIsIHBvcnQpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSgqc3lzX291dGwpKHBvcnQsIE0ueDg2LlJfRUFYKTsKKyAgICB9IGVsc2UgeworCSgqc3lzX291dHcpKHBvcnQsIE0ueDg2LlJfQVgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlOAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfY2FsbF9uZWFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczE2IGlwOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKwlERUNPREVfUFJJTlRGKCJDQUxMXHQiKTsKKwlpcCA9IChzMTYpIGZldGNoX3dvcmRfaW1tKCk7CisJaXAgKz0gKHMxNikgTS54ODYuUl9JUDsJICAgLyogQ0hFQ0sgU0lHTiAqLworCURFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBpcCk7CisJQ0FMTF9UUkFDRShNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXAsIE0ueDg2LlJfQ1MsIGlwLCAiIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisgICAgTS54ODYuUl9JUCA9IGlwOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGU5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgaXA7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkpNUFx0Iik7CisgICAgaXAgPSAoczE2KWZldGNoX3dvcmRfaW1tKCk7CisgICAgaXAgKz0gKHMxNilNLng4Ni5SX0lQOworICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBpcCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0lQID0gKHUxNilpcDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlYQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfanVtcF9mYXJfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MTYgY3MsIGlwOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJKTVBcdEZBUiAiKTsKKyAgICBpcCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgY3MgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCIlMDR4OiIsIGNzKTsKKyAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaXApOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9JUCA9IGlwOworICAgIE0ueDg2LlJfQ1MgPSBjczsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlYgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfanVtcF9ieXRlX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IHRhcmdldDsKKyAgICBzOCBvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkpNUFx0Iik7CisgICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7CisgICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIG9mZnNldCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9JUCA9IHRhcmdldDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaW5fYnl0ZV9BTF9EWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJJTlx0QUwsRFhcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9BTCA9ICgqc3lzX2luYikoTS54ODYuUl9EWCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luX3dvcmRfQVhfRFgodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiSU5cdEVBWCxEWFxuIik7CisgICAgfSBlbHNlIHsKKwlERUNPREVfUFJJTlRGKCJJTlx0QVgsRFhcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCU0ueDg2LlJfRUFYID0gKCpzeXNfaW5sKShNLng4Ni5SX0RYKTsKKyAgICB9IGVsc2UgeworCU0ueDg2LlJfQVggPSAoKnN5c19pbncpKE0ueDg2LlJfRFgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3V0X2J5dGVfRFhfQUwodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiT1VUXHREWCxBTFxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAoKnN5c19vdXRiKShNLng4Ni5SX0RYLCBNLng4Ni5SX0FMKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3V0X3dvcmRfRFhfQVgodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiT1VUXHREWCxFQVhcbiIpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiT1VUXHREWCxBWFxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJKCpzeXNfb3V0bCkoTS54ODYuUl9EWCwgTS54ODYuUl9FQVgpOworICAgIH0gZWxzZSB7CisJKCpzeXNfb3V0dykoTS54ODYuUl9EWCwgTS54ODYuUl9BWCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGYwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9sb2NrKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxPQ0s6XG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLypvcGNvZGUgMHhmMSBJTExFR0FMIE9QRVJBVElPTiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZjIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3JlcG5lKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlJFUE5FXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9QUkVGSVhfUkVQTkU7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZjMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3JlcGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUkVQRVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfUFJFRklYX1JFUEU7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZjQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2hhbHQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSEFMVFxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBIQUxUX1NZUygpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGY1CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9jbWModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIC8qIGNvbXBsZW1lbnQgdGhlIGNhcnJ5IGZsYWcuICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJDTUNcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgVE9HR0xFX0ZMQUcoRl9DRik7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZjYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wY0Y2X2J5dGVfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggZGVzdHZhbCwgc3JjdmFsOworCisgICAgLyogbG9uZywgZHJhd24gb3V0IGNvZGUgZm9sbG93cy4gIERvdWJsZSBzd2l0Y2ggZm9yIGEgdG90YWwKKyAgICAgICBvZiAzMiBjYXNlcy4gICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIERFQ09ERV9QUklOVEYob3BGNl9uYW1lc1tyaF0pOworICAgIGlmIChtb2QgPCAzKSB7CisJREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKworCXN3aXRjaCAocmgpIHsKKwljYXNlIDA6CQkvKiB0ZXN0IGJ5dGUgaW1tICovCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiUwMnhcbiIsIHNyY3ZhbCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHRlc3RfYnl0ZShkZXN0dmFsLCBzcmN2YWwpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAwIFJIPTAxIE9QPUY2XG4iKTsKKwkgICAgSEFMVF9TWVMoKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgorCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gbm90X2J5dGUoZGVzdHZhbCk7CisJICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gbmVnX2J5dGUoZGVzdHZhbCk7CisJICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBtdWxfYnl0ZShkZXN0dmFsKTsKKwkgICAgYnJlYWs7CisJY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBpbXVsX2J5dGUoZGVzdHZhbCk7CisJICAgIGJyZWFrOworCWNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGl2X2J5dGUoZGVzdHZhbCk7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGlkaXZfYnl0ZShkZXN0dmFsKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIG1vZD0xMSAqLworCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoJCS8qIHRlc3QgYnl0ZSBpbW0gKi8KKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiJTAyeFxuIiwgc3JjdmFsKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgdGVzdF9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAwIFJIPTAxIE9QPUY2XG4iKTsKKwkgICAgSEFMVF9TWVMoKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgorCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IG5vdF9ieXRlKCpkZXN0cmVnKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IG5lZ19ieXRlKCpkZXN0cmVnKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBtdWxfYnl0ZSgqZGVzdHJlZyk7CSAgICAgLyohISEgICovCisJICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgaW11bF9ieXRlKCpkZXN0cmVnKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkaXZfYnl0ZSgqZGVzdHJlZyk7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGlkaXZfYnl0ZSgqZGVzdHJlZyk7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZjcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wY0Y3X3dvcmRfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgREVDT0RFX1BSSU5URihvcEY2X25hbWVzW3JoXSk7CisgICAgaWYgKG1vZCA8IDMpIHsKKworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbCwgc3JjdmFsOworCisJICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKKwkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisKKwkgICAgc3dpdGNoIChyaCkgeworCSAgICBjYXNlIDA6CisJCURFQ09ERV9QUklOVEYoIiwiKTsKKwkJc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKKwkJREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQl0ZXN0X2xvbmcoZGVzdHZhbCwgc3JjdmFsKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgMToKKwkJREVDT0RFX1BSSU5URigiSUxMRUdBTCBPUCBNT0Q9MDAgUkg9MDEgT1A9RjdcbiIpOworCQlIQUxUX1NZUygpOworCQlicmVhazsKKwkgICAgY2FzZSAyOgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlkZXN0dmFsID0gbm90X2xvbmcoZGVzdHZhbCk7CisJCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgMzoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJZGVzdHZhbCA9IG5lZ19sb25nKGRlc3R2YWwpOworCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJCWJyZWFrOworCSAgICBjYXNlIDQ6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCW11bF9sb25nKGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSA1OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlpbXVsX2xvbmcoZGVzdHZhbCk7CisJCWJyZWFrOworCSAgICBjYXNlIDY6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCWRpdl9sb25nKGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSA3OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlpZGl2X2xvbmcoZGVzdHZhbCk7CisJCWJyZWFrOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgdTE2IGRlc3R2YWwsIHNyY3ZhbDsKKworCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKKwkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisKKwkgICAgc3dpdGNoIChyaCkgeworCSAgICBjYXNlIDA6CSAgICAvKiB0ZXN0IHdvcmQgaW1tICovCisJCURFQ09ERV9QUklOVEYoIiwiKTsKKwkJc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKKwkJREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQl0ZXN0X3dvcmQoZGVzdHZhbCwgc3JjdmFsKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgMToKKwkJREVDT0RFX1BSSU5URigiSUxMRUdBTCBPUCBNT0Q9MDAgUkg9MDEgT1A9RjdcbiIpOworCQlIQUxUX1NZUygpOworCQlicmVhazsKKwkgICAgY2FzZSAyOgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlkZXN0dmFsID0gbm90X3dvcmQoZGVzdHZhbCk7CisJCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgMzoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJZGVzdHZhbCA9IG5lZ193b3JkKGRlc3R2YWwpOworCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJCWJyZWFrOworCSAgICBjYXNlIDQ6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCW11bF93b3JkKGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSA1OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlpbXVsX3dvcmQoZGVzdHZhbCk7CisJCWJyZWFrOworCSAgICBjYXNlIDY6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCWRpdl93b3JkKGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSA3OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlpZGl2X3dvcmQoZGVzdHZhbCk7CisJCWJyZWFrOworCSAgICB9CisJfQorCisgICAgfSBlbHNlIHsJCQkgLyogbW9kPTExICovCisKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnOworCSAgICB1MzIgc3JjdmFsOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisKKwkgICAgc3dpdGNoIChyaCkgeworCSAgICBjYXNlIDA6CSAgICAvKiB0ZXN0IHdvcmQgaW1tICovCisJCURFQ09ERV9QUklOVEYoIiwiKTsKKwkJc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKKwkJREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQl0ZXN0X2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7CisJCWJyZWFrOworCSAgICBjYXNlIDE6CisJCURFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAwIFJIPTAxIE9QPUY2XG4iKTsKKwkJSEFMVF9TWVMoKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgMjoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJKmRlc3RyZWcgPSBub3RfbG9uZygqZGVzdHJlZyk7CisJCWJyZWFrOworCSAgICBjYXNlIDM6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCSpkZXN0cmVnID0gbmVnX2xvbmcoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgY2FzZSA0OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQltdWxfbG9uZygqZGVzdHJlZyk7CSAvKiEhIQkqLworCQlicmVhazsKKwkgICAgY2FzZSA1OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlpbXVsX2xvbmcoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgY2FzZSA2OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlkaXZfbG9uZygqZGVzdHJlZyk7CisJCWJyZWFrOworCSAgICBjYXNlIDc6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCWlkaXZfbG9uZygqZGVzdHJlZyk7CisJCWJyZWFrOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCSAgICB1MTYgc3JjdmFsOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisKKwkgICAgc3dpdGNoIChyaCkgeworCSAgICBjYXNlIDA6CSAgICAvKiB0ZXN0IHdvcmQgaW1tICovCisJCURFQ09ERV9QUklOVEYoIiwiKTsKKwkJc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKKwkJREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQl0ZXN0X3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7CisJCWJyZWFrOworCSAgICBjYXNlIDE6CisJCURFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAwIFJIPTAxIE9QPUY2XG4iKTsKKwkJSEFMVF9TWVMoKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgMjoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJKmRlc3RyZWcgPSBub3Rfd29yZCgqZGVzdHJlZyk7CisJCWJyZWFrOworCSAgICBjYXNlIDM6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCSpkZXN0cmVnID0gbmVnX3dvcmQoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgY2FzZSA0OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQltdWxfd29yZCgqZGVzdHJlZyk7CSAvKiEhIQkqLworCQlicmVhazsKKwkgICAgY2FzZSA1OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlpbXVsX3dvcmQoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgY2FzZSA2OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlkaXZfd29yZCgqZGVzdHJlZyk7CisJCWJyZWFrOworCSAgICBjYXNlIDc6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCWlkaXZfd29yZCgqZGVzdHJlZyk7CisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmOAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfY2xjKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICAvKiBjbGVhciB0aGUgY2FycnkgZmxhZy4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkNMQ1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGY5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zdGModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIC8qIHNldCB0aGUgY2FycnkgZmxhZy4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNUQ1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBTRVRfRkxBRyhGX0NGKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmYQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfY2xpKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICAvKiBjbGVhciBpbnRlcnJ1cHRzLiAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQ0xJXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIENMRUFSX0ZMQUcoRl9JRik7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZmIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3N0aSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgLyogZW5hYmxlICBpbnRlcnJ1cHRzLiAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU1RJXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIFNFVF9GTEFHKEZfSUYpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGZjCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9jbGQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIC8qIGNsZWFyIGludGVycnVwdHMuICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJDTERcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgQ0xFQVJfRkxBRyhGX0RGKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc3RkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICAvKiBjbGVhciBpbnRlcnJ1cHRzLiAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU1REXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIFNFVF9GTEFHKEZfREYpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGZlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGNGRV9ieXRlX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCByaCwgcmw7CisgICAgdTggZGVzdHZhbDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggKmRlc3RyZWc7CisKKyAgICAvKiBZZXQgYW5vdGhlciBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24uICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7CisJLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKwkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQorCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKworCXN3aXRjaCAocmgpIHsKKwljYXNlIDA6CisJICAgIERFQ09ERV9QUklOVEYoIklOQ1x0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMToKKwkgICAgREVDT0RFX1BSSU5URigiREVDXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgorCWNhc2UgMzoKKwljYXNlIDQ6CisJY2FzZSA1OgorCWNhc2UgNjoKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYyKCJJTExFR0FMIE9QIE1BSk9SIE9QIDB4RkUgTUlOT1IgT1AgJXggXG4iLCBtb2QpOworCSAgICBIQUxUX1NZUygpOworCSAgICBicmVhazsKKwl9CisgICAgfQorI2VuZGlmCisgICAgaWYgKG1vZCA8IDMpIHsKKwlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlpZiAocmggPT0gMCkKKwkgIGRlc3R2YWwgPSBpbmNfYnl0ZShkZXN0dmFsKTsKKwllbHNlCisJICBkZXN0dmFsID0gZGVjX2J5dGUoZGVzdHZhbCk7CisJc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgIH0gZWxzZSB7CisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJaWYgKHJoID09IDApCisJICAqZGVzdHJlZyA9IGluY19ieXRlKCpkZXN0cmVnKTsKKwllbHNlCisJICAqZGVzdHJlZyA9IGRlY19ieXRlKCpkZXN0cmVnKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZmYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wY0ZGX3dvcmRfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJoLCBybDsKKyAgICB1aW50IGRlc3RvZmZzZXQgPSAwOworCXUxNiAqZGVzdHJlZzsKKwl1MTYgZGVzdHZhbCxkZXN0dmFsMjsKKworICAgIC8qIFlldCBhbm90aGVyIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbi4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKKwkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQorCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCisJICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCisJICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLworCisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoKKwkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCURFQ09ERV9QUklOVEYoIklOQ1x0RFdPUkQgUFRSICIpOworCSAgICB9IGVsc2UgeworCQlERUNPREVfUFJJTlRGKCJJTkNcdFdPUkQgUFRSICIpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgMToKKwkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCURFQ09ERV9QUklOVEYoIkRFQ1x0RFdPUkQgUFRSICIpOworCSAgICB9IGVsc2UgeworCQlERUNPREVfUFJJTlRGKCJERUNcdFdPUkQgUFRSICIpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiQ0FMTFx0ICIpOworCSAgICBicmVhazsKKwljYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYoIkNBTExcdEZBUiAiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBERUNPREVfUFJJTlRGKCJKTVBcdCIpOworCSAgICBicmVhazsKKwljYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYoIkpNUFx0RkFSICIpOworCSAgICBicmVhazsKKwljYXNlIDY6CisJICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdCIpOworCSAgICBicmVhazsKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgREVDT0RJTkcgT0YgT1BDT0RFIEZGXHQiKTsKKwkgICAgSEFMVF9TWVMoKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyNlbmRpZgorICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgkJLyogaW5jIHdvcmQgcHRyIC4uLiAqLworCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkJdTMyIGRlc3R2YWw7CisKKwkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJZGVzdHZhbCA9IGluY19sb25nKGRlc3R2YWwpOworCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJICAgIH0gZWxzZSB7CisJCXUxNiBkZXN0dmFsOworCisJCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCWRlc3R2YWwgPSBpbmNfd29yZChkZXN0dmFsKTsKKwkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgMToJCS8qIGRlYyB3b3JkIHB0ciAuLi4gKi8KKwkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCXUzMiBkZXN0dmFsOworCisJCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCWRlc3R2YWwgPSBkZWNfbG9uZyhkZXN0dmFsKTsKKwkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCSAgICB9IGVsc2UgeworCQl1MTYgZGVzdHZhbDsKKworCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlkZXN0dmFsID0gZGVjX3dvcmQoZGVzdHZhbCk7CisJCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIDI6CQkvKiBjYWxsIHdvcmQgcHRyIC4uLiAqLworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisJICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOworCSAgICBicmVhazsKKwljYXNlIDM6CQkvKiBjYWxsIGZhciBwdHIgLi4uICovCisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisJICAgIGRlc3R2YWwyID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQgKyAyKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgcHVzaF93b3JkKE0ueDg2LlJfQ1MpOworCSAgICBNLng4Ni5SX0NTID0gZGVzdHZhbDI7CisJICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKKwkgICAgTS54ODYuUl9JUCA9IGRlc3R2YWw7CisJICAgIGJyZWFrOworCWNhc2UgNDoJCS8qIGptcCB3b3JkIHB0ciAuLi4gKi8KKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgTS54ODYuUl9JUCA9IGRlc3R2YWw7CisJICAgIGJyZWFrOworCWNhc2UgNToJCS8qIGptcCBmYXIgcHRyIC4uLiAqLworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBkZXN0dmFsMiA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0ICsgMik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOworCSAgICBNLng4Ni5SX0NTID0gZGVzdHZhbDI7CisJICAgIGJyZWFrOworCWNhc2UgNjoJCS8qICBwdXNoIHdvcmQgcHRyIC4uLiAqLworCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkJdTMyIGRlc3R2YWw7CisKKwkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJcHVzaF9sb25nKGRlc3R2YWwpOworCSAgICB9IGVsc2UgeworCQl1MTYgZGVzdHZhbDsKKworCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlwdXNoX3dvcmQoZGVzdHZhbCk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorICAgIH0gZWxzZSB7CisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoKKwkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCXUzMiAqZGVzdHJlZzsKKworCQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQkqZGVzdHJlZyA9IGluY19sb25nKCpkZXN0cmVnKTsKKwkgICAgfSBlbHNlIHsKKwkJdTE2ICpkZXN0cmVnOworCisJCWRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCSpkZXN0cmVnID0gaW5jX3dvcmQoKmRlc3RyZWcpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgMToKKwkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCXUzMiAqZGVzdHJlZzsKKworCQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQkqZGVzdHJlZyA9IGRlY19sb25nKCpkZXN0cmVnKTsKKwkgICAgfSBlbHNlIHsKKwkJdTE2ICpkZXN0cmVnOworCisJCWRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCSpkZXN0cmVnID0gZGVjX3dvcmQoKmRlc3RyZWcpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgMjoJCS8qIGNhbGwgd29yZCBwdHIgLi4uICovCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKKwkgICAgTS54ODYuUl9JUCA9ICpkZXN0cmVnOworCSAgICBicmVhazsKKwljYXNlIDM6CQkvKiBqbXAgZmFyIHB0ciAuLi4gKi8KKwkgICAgREVDT0RFX1BSSU5URigiT1BFUkFUSU9OIFVOREVGSU5FRCAwWEZGIFxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIEhBTFRfU1lTKCk7CisJICAgIGJyZWFrOworCisJY2FzZSA0OgkJLyogam1wCS4uLiAqLworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBNLng4Ni5SX0lQID0gKHUxNikgKCpkZXN0cmVnKTsKKwkgICAgYnJlYWs7CisJY2FzZSA1OgkJLyogam1wIGZhciBwdHIgLi4uICovCisJICAgIERFQ09ERV9QUklOVEYoIk9QRVJBVElPTiBVTkRFRklORUQgMFhGRiBcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBIQUxUX1NZUygpOworCSAgICBicmVhazsKKwljYXNlIDY6CisJICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQl1MzIgKmRlc3RyZWc7CisKKwkJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJcHVzaF9sb25nKCpkZXN0cmVnKTsKKwkgICAgfSBlbHNlIHsKKwkJdTE2ICpkZXN0cmVnOworCisJCWRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCXB1c2hfd29yZCgqZGVzdHJlZyk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNpbmdsZSBieXRlIG9wZXJhdGlvbiBjb2RlIHRhYmxlOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAoKng4NmVtdV9vcHRhYlsyNTZdKSh1OCkgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24oIi5nb3QyIikpKSA9Cit7CisvKiAgMHgwMCAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX1JNX1IsCisvKiAgMHgwMSAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX1JNX1IsCisvKiAgMHgwMiAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX1JfUk0sCisvKiAgMHgwMyAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX1JfUk0sCisvKiAgMHgwNCAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX0FMX0lNTSwKKy8qICAweDA1ICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfQVhfSU1NLAorLyogIDB4MDYgKi8geDg2ZW11T3BfcHVzaF9FUywKKy8qICAweDA3ICovIHg4NmVtdU9wX3BvcF9FUywKKworLyogIDB4MDggKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9STV9SLAorLyogIDB4MDkgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9STV9SLAorLyogIDB4MGEgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9SX1JNLAorLyogIDB4MGIgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9SX1JNLAorLyogIDB4MGMgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9BTF9JTU0sCisvKiAgMHgwZCAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX0FYX0lNTSwKKy8qICAweDBlICovIHg4NmVtdU9wX3B1c2hfQ1MsCisvKiAgMHgwZiAqLyB4ODZlbXVPcF90d29fYnl0ZSwKKworLyogIDB4MTAgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9STV9SLAorLyogIDB4MTEgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9STV9SLAorLyogIDB4MTIgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9SX1JNLAorLyogIDB4MTMgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9SX1JNLAorLyogIDB4MTQgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9BTF9JTU0sCisvKiAgMHgxNSAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX0FYX0lNTSwKKy8qICAweDE2ICovIHg4NmVtdU9wX3B1c2hfU1MsCisvKiAgMHgxNyAqLyB4ODZlbXVPcF9wb3BfU1MsCisKKy8qICAweDE4ICovIHg4NmVtdU9wX2dlbm9wX2J5dGVfUk1fUiwKKy8qICAweDE5ICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfUk1fUiwKKy8qICAweDFhICovIHg4NmVtdU9wX2dlbm9wX2J5dGVfUl9STSwKKy8qICAweDFiICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfUl9STSwKKy8qICAweDFjICovIHg4NmVtdU9wX2dlbm9wX2J5dGVfQUxfSU1NLAorLyogIDB4MWQgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9BWF9JTU0sCisvKiAgMHgxZSAqLyB4ODZlbXVPcF9wdXNoX0RTLAorLyogIDB4MWYgKi8geDg2ZW11T3BfcG9wX0RTLAorCisvKiAgMHgyMCAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX1JNX1IsCisvKiAgMHgyMSAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX1JNX1IsCisvKiAgMHgyMiAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX1JfUk0sCisvKiAgMHgyMyAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX1JfUk0sCisvKiAgMHgyNCAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX0FMX0lNTSwKKy8qICAweDI1ICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfQVhfSU1NLAorLyogIDB4MjYgKi8geDg2ZW11T3Bfc2Vnb3ZyX0VTLAorLyogIDB4MjcgKi8geDg2ZW11T3BfZGFhLAorCisvKiAgMHgyOCAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX1JNX1IsCisvKiAgMHgyOSAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX1JNX1IsCisvKiAgMHgyYSAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX1JfUk0sCisvKiAgMHgyYiAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX1JfUk0sCisvKiAgMHgyYyAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX0FMX0lNTSwKKy8qICAweDJkICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfQVhfSU1NLAorLyogIDB4MmUgKi8geDg2ZW11T3Bfc2Vnb3ZyX0NTLAorLyogIDB4MmYgKi8geDg2ZW11T3BfZGFzLAorCisvKiAgMHgzMCAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX1JNX1IsCisvKiAgMHgzMSAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX1JNX1IsCisvKiAgMHgzMiAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX1JfUk0sCisvKiAgMHgzMyAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX1JfUk0sCisvKiAgMHgzNCAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX0FMX0lNTSwKKy8qICAweDM1ICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfQVhfSU1NLAorLyogIDB4MzYgKi8geDg2ZW11T3Bfc2Vnb3ZyX1NTLAorLyogIDB4MzcgKi8geDg2ZW11T3BfYWFhLAorCisvKiAgMHgzOCAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX1JNX1IsCisvKiAgMHgzOSAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX1JNX1IsCisvKiAgMHgzYSAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX1JfUk0sCisvKiAgMHgzYiAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX1JfUk0sCisvKiAgMHgzYyAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX0FMX0lNTSwKKy8qICAweDNkICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfQVhfSU1NLAorLyogIDB4M2UgKi8geDg2ZW11T3Bfc2Vnb3ZyX0RTLAorLyogIDB4M2YgKi8geDg2ZW11T3BfYWFzLAorCisvKiAgMHg0MCAqLyB4ODZlbXVPcF9pbmNfcmVnaXN0ZXIsCisvKiAgMHg0MSAqLyB4ODZlbXVPcF9pbmNfcmVnaXN0ZXIsCisvKiAgMHg0MiAqLyB4ODZlbXVPcF9pbmNfcmVnaXN0ZXIsCisvKiAgMHg0MyAqLyB4ODZlbXVPcF9pbmNfcmVnaXN0ZXIsCisvKiAgMHg0NCAqLyB4ODZlbXVPcF9pbmNfcmVnaXN0ZXIsCisvKiAgMHg0NSAqLyB4ODZlbXVPcF9pbmNfcmVnaXN0ZXIsCisvKiAgMHg0NiAqLyB4ODZlbXVPcF9pbmNfcmVnaXN0ZXIsCisvKiAgMHg0NyAqLyB4ODZlbXVPcF9pbmNfcmVnaXN0ZXIsCisKKy8qICAweDQ4ICovIHg4NmVtdU9wX2RlY19yZWdpc3RlciwKKy8qICAweDQ5ICovIHg4NmVtdU9wX2RlY19yZWdpc3RlciwKKy8qICAweDRhICovIHg4NmVtdU9wX2RlY19yZWdpc3RlciwKKy8qICAweDRiICovIHg4NmVtdU9wX2RlY19yZWdpc3RlciwKKy8qICAweDRjICovIHg4NmVtdU9wX2RlY19yZWdpc3RlciwKKy8qICAweDRkICovIHg4NmVtdU9wX2RlY19yZWdpc3RlciwKKy8qICAweDRlICovIHg4NmVtdU9wX2RlY19yZWdpc3RlciwKKy8qICAweDRmICovIHg4NmVtdU9wX2RlY19yZWdpc3RlciwKKworLyogIDB4NTAgKi8geDg2ZW11T3BfcHVzaF9yZWdpc3RlciwKKy8qICAweDUxICovIHg4NmVtdU9wX3B1c2hfcmVnaXN0ZXIsCisvKiAgMHg1MiAqLyB4ODZlbXVPcF9wdXNoX3JlZ2lzdGVyLAorLyogIDB4NTMgKi8geDg2ZW11T3BfcHVzaF9yZWdpc3RlciwKKy8qICAweDU0ICovIHg4NmVtdU9wX3B1c2hfcmVnaXN0ZXIsCisvKiAgMHg1NSAqLyB4ODZlbXVPcF9wdXNoX3JlZ2lzdGVyLAorLyogIDB4NTYgKi8geDg2ZW11T3BfcHVzaF9yZWdpc3RlciwKKy8qICAweDU3ICovIHg4NmVtdU9wX3B1c2hfcmVnaXN0ZXIsCisKKy8qICAweDU4ICovIHg4NmVtdU9wX3BvcF9yZWdpc3RlciwKKy8qICAweDU5ICovIHg4NmVtdU9wX3BvcF9yZWdpc3RlciwKKy8qICAweDVhICovIHg4NmVtdU9wX3BvcF9yZWdpc3RlciwKKy8qICAweDViICovIHg4NmVtdU9wX3BvcF9yZWdpc3RlciwKKy8qICAweDVjICovIHg4NmVtdU9wX3BvcF9yZWdpc3RlciwKKy8qICAweDVkICovIHg4NmVtdU9wX3BvcF9yZWdpc3RlciwKKy8qICAweDVlICovIHg4NmVtdU9wX3BvcF9yZWdpc3RlciwKKy8qICAweDVmICovIHg4NmVtdU9wX3BvcF9yZWdpc3RlciwKKworLyogIDB4NjAgKi8geDg2ZW11T3BfcHVzaF9hbGwsCisvKiAgMHg2MSAqLyB4ODZlbXVPcF9wb3BfYWxsLAorLyogIDB4NjIgKi8geDg2ZW11T3BfaWxsZWdhbF9vcCwgICAvKiBib3VuZCAqLworLyogIDB4NjMgKi8geDg2ZW11T3BfaWxsZWdhbF9vcCwgICAvKiBhcnBsICovCisvKiAgMHg2NCAqLyB4ODZlbXVPcF9zZWdvdnJfRlMsCisvKiAgMHg2NSAqLyB4ODZlbXVPcF9zZWdvdnJfR1MsCisvKiAgMHg2NiAqLyB4ODZlbXVPcF9wcmVmaXhfZGF0YSwKKy8qICAweDY3ICovIHg4NmVtdU9wX3ByZWZpeF9hZGRyLAorCisvKiAgMHg2OCAqLyB4ODZlbXVPcF9wdXNoX3dvcmRfSU1NLAorLyogIDB4NjkgKi8geDg2ZW11T3BfaW11bF93b3JkX0lNTSwKKy8qICAweDZhICovIHg4NmVtdU9wX3B1c2hfYnl0ZV9JTU0sCisvKiAgMHg2YiAqLyB4ODZlbXVPcF9pbXVsX2J5dGVfSU1NLAorLyogIDB4NmMgKi8geDg2ZW11T3BfaW5zX2J5dGUsCisvKiAgMHg2ZCAqLyB4ODZlbXVPcF9pbnNfd29yZCwKKy8qICAweDZlICovIHg4NmVtdU9wX291dHNfYnl0ZSwKKy8qICAweDZmICovIHg4NmVtdU9wX291dHNfd29yZCwKKworLyogIDB4NzAgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisvKiAgMHg3MSAqLyB4ODZlbXVPcF9qdW1wX25lYXJfY29uZCwKKy8qICAweDcyICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4NzMgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisvKiAgMHg3NCAqLyB4ODZlbXVPcF9qdW1wX25lYXJfY29uZCwKKy8qICAweDc1ICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4NzYgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisvKiAgMHg3NyAqLyB4ODZlbXVPcF9qdW1wX25lYXJfY29uZCwKKworLyogIDB4NzggKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisvKiAgMHg3OSAqLyB4ODZlbXVPcF9qdW1wX25lYXJfY29uZCwKKy8qICAweDdhICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4N2IgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisvKiAgMHg3YyAqLyB4ODZlbXVPcF9qdW1wX25lYXJfY29uZCwKKy8qICAweDdkICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4N2UgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisvKiAgMHg3ZiAqLyB4ODZlbXVPcF9qdW1wX25lYXJfY29uZCwKKworLyogIDB4ODAgKi8geDg2ZW11T3Bfb3BjODBfYnl0ZV9STV9JTU0sCisvKiAgMHg4MSAqLyB4ODZlbXVPcF9vcGM4MV93b3JkX1JNX0lNTSwKKy8qICAweDgyICovIHg4NmVtdU9wX29wYzgyX2J5dGVfUk1fSU1NLAorLyogIDB4ODMgKi8geDg2ZW11T3Bfb3BjODNfd29yZF9STV9JTU0sCisvKiAgMHg4NCAqLyB4ODZlbXVPcF90ZXN0X2J5dGVfUk1fUiwKKy8qICAweDg1ICovIHg4NmVtdU9wX3Rlc3Rfd29yZF9STV9SLAorLyogIDB4ODYgKi8geDg2ZW11T3BfeGNoZ19ieXRlX1JNX1IsCisvKiAgMHg4NyAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfUk1fUiwKKworLyogIDB4ODggKi8geDg2ZW11T3BfbW92X2J5dGVfUk1fUiwKKy8qICAweDg5ICovIHg4NmVtdU9wX21vdl93b3JkX1JNX1IsCisvKiAgMHg4YSAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9SX1JNLAorLyogIDB4OGIgKi8geDg2ZW11T3BfbW92X3dvcmRfUl9STSwKKy8qICAweDhjICovIHg4NmVtdU9wX21vdl93b3JkX1JNX1NSLAorLyogIDB4OGQgKi8geDg2ZW11T3BfbGVhX3dvcmRfUl9NLAorLyogIDB4OGUgKi8geDg2ZW11T3BfbW92X3dvcmRfU1JfUk0sCisvKiAgMHg4ZiAqLyB4ODZlbXVPcF9wb3BfUk0sCisKKy8qICAweDkwICovIHg4NmVtdU9wX25vcCwKKy8qICAweDkxICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9yZWdpc3RlciwKKy8qICAweDkyICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9yZWdpc3RlciwKKy8qICAweDkzICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9yZWdpc3RlciwKKy8qICAweDk0ICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9yZWdpc3RlciwKKy8qICAweDk1ICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9yZWdpc3RlciwKKy8qICAweDk2ICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9yZWdpc3RlciwKKy8qICAweDk3ICovIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9yZWdpc3RlciwKKworLyogIDB4OTggKi8geDg2ZW11T3BfY2J3LAorLyogIDB4OTkgKi8geDg2ZW11T3BfY3dkLAorLyogIDB4OWEgKi8geDg2ZW11T3BfY2FsbF9mYXJfSU1NLAorLyogIDB4OWIgKi8geDg2ZW11T3Bfd2FpdCwKKy8qICAweDljICovIHg4NmVtdU9wX3B1c2hmX3dvcmQsCisvKiAgMHg5ZCAqLyB4ODZlbXVPcF9wb3BmX3dvcmQsCisvKiAgMHg5ZSAqLyB4ODZlbXVPcF9zYWhmLAorLyogIDB4OWYgKi8geDg2ZW11T3BfbGFoZiwKKworLyogIDB4YTAgKi8geDg2ZW11T3BfbW92X0FMX01fSU1NLAorLyogIDB4YTEgKi8geDg2ZW11T3BfbW92X0FYX01fSU1NLAorLyogIDB4YTIgKi8geDg2ZW11T3BfbW92X01fQUxfSU1NLAorLyogIDB4YTMgKi8geDg2ZW11T3BfbW92X01fQVhfSU1NLAorLyogIDB4YTQgKi8geDg2ZW11T3BfbW92c19ieXRlLAorLyogIDB4YTUgKi8geDg2ZW11T3BfbW92c193b3JkLAorLyogIDB4YTYgKi8geDg2ZW11T3BfY21wc19ieXRlLAorLyogIDB4YTcgKi8geDg2ZW11T3BfY21wc193b3JkLAorLyogIDB4YTggKi8geDg2ZW11T3BfdGVzdF9BTF9JTU0sCisvKiAgMHhhOSAqLyB4ODZlbXVPcF90ZXN0X0FYX0lNTSwKKy8qICAweGFhICovIHg4NmVtdU9wX3N0b3NfYnl0ZSwKKy8qICAweGFiICovIHg4NmVtdU9wX3N0b3Nfd29yZCwKKy8qICAweGFjICovIHg4NmVtdU9wX2xvZHNfYnl0ZSwKKy8qICAweGFkICovIHg4NmVtdU9wX2xvZHNfd29yZCwKKy8qICAweGFjICovIHg4NmVtdU9wX3NjYXNfYnl0ZSwKKy8qICAweGFkICovIHg4NmVtdU9wX3NjYXNfd29yZCwKKworLyogIDB4YjAgKi8geDg2ZW11T3BfbW92X2J5dGVfcmVnaXN0ZXJfSU1NLAorLyogIDB4YjEgKi8geDg2ZW11T3BfbW92X2J5dGVfcmVnaXN0ZXJfSU1NLAorLyogIDB4YjIgKi8geDg2ZW11T3BfbW92X2J5dGVfcmVnaXN0ZXJfSU1NLAorLyogIDB4YjMgKi8geDg2ZW11T3BfbW92X2J5dGVfcmVnaXN0ZXJfSU1NLAorLyogIDB4YjQgKi8geDg2ZW11T3BfbW92X2J5dGVfcmVnaXN0ZXJfSU1NLAorLyogIDB4YjUgKi8geDg2ZW11T3BfbW92X2J5dGVfcmVnaXN0ZXJfSU1NLAorLyogIDB4YjYgKi8geDg2ZW11T3BfbW92X2J5dGVfcmVnaXN0ZXJfSU1NLAorLyogIDB4YjcgKi8geDg2ZW11T3BfbW92X2J5dGVfcmVnaXN0ZXJfSU1NLAorCisvKiAgMHhiOCAqLyB4ODZlbXVPcF9tb3Zfd29yZF9yZWdpc3Rlcl9JTU0sCisvKiAgMHhiOSAqLyB4ODZlbXVPcF9tb3Zfd29yZF9yZWdpc3Rlcl9JTU0sCisvKiAgMHhiYSAqLyB4ODZlbXVPcF9tb3Zfd29yZF9yZWdpc3Rlcl9JTU0sCisvKiAgMHhiYiAqLyB4ODZlbXVPcF9tb3Zfd29yZF9yZWdpc3Rlcl9JTU0sCisvKiAgMHhiYyAqLyB4ODZlbXVPcF9tb3Zfd29yZF9yZWdpc3Rlcl9JTU0sCisvKiAgMHhiZCAqLyB4ODZlbXVPcF9tb3Zfd29yZF9yZWdpc3Rlcl9JTU0sCisvKiAgMHhiZSAqLyB4ODZlbXVPcF9tb3Zfd29yZF9yZWdpc3Rlcl9JTU0sCisvKiAgMHhiZiAqLyB4ODZlbXVPcF9tb3Zfd29yZF9yZWdpc3Rlcl9JTU0sCisKKy8qICAweGMwICovIHg4NmVtdU9wX29wY0MwX2J5dGVfUk1fTUVNLAorLyogIDB4YzEgKi8geDg2ZW11T3Bfb3BjQzFfd29yZF9STV9NRU0sCisvKiAgMHhjMiAqLyB4ODZlbXVPcF9yZXRfbmVhcl9JTU0sCisvKiAgMHhjMyAqLyB4ODZlbXVPcF9yZXRfbmVhciwKKy8qICAweGM0ICovIHg4NmVtdU9wX2xlc19SX0lNTSwKKy8qICAweGM1ICovIHg4NmVtdU9wX2xkc19SX0lNTSwKKy8qICAweGM2ICovIHg4NmVtdU9wX21vdl9ieXRlX1JNX0lNTSwKKy8qICAweGM3ICovIHg4NmVtdU9wX21vdl93b3JkX1JNX0lNTSwKKy8qICAweGM4ICovIHg4NmVtdU9wX2VudGVyLAorLyogIDB4YzkgKi8geDg2ZW11T3BfbGVhdmUsCisvKiAgMHhjYSAqLyB4ODZlbXVPcF9yZXRfZmFyX0lNTSwKKy8qICAweGNiICovIHg4NmVtdU9wX3JldF9mYXIsCisvKiAgMHhjYyAqLyB4ODZlbXVPcF9pbnQzLAorLyogIDB4Y2QgKi8geDg2ZW11T3BfaW50X0lNTSwKKy8qICAweGNlICovIHg4NmVtdU9wX2ludG8sCisvKiAgMHhjZiAqLyB4ODZlbXVPcF9pcmV0LAorCisvKiAgMHhkMCAqLyB4ODZlbXVPcF9vcGNEMF9ieXRlX1JNXzEsCisvKiAgMHhkMSAqLyB4ODZlbXVPcF9vcGNEMV93b3JkX1JNXzEsCisvKiAgMHhkMiAqLyB4ODZlbXVPcF9vcGNEMl9ieXRlX1JNX0NMLAorLyogIDB4ZDMgKi8geDg2ZW11T3Bfb3BjRDNfd29yZF9STV9DTCwKKy8qICAweGQ0ICovIHg4NmVtdU9wX2FhbSwKKy8qICAweGQ1ICovIHg4NmVtdU9wX2FhZCwKKy8qICAweGQ2ICovIHg4NmVtdU9wX2lsbGVnYWxfb3AsICAgLyogVW5kb2N1bWVudGVkIFNFVEFMQyBpbnN0cnVjdGlvbiAqLworLyogIDB4ZDcgKi8geDg2ZW11T3BfeGxhdCwKKy8qICAweGQ4ICovIE5VTEwsIC8qeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kOCwqLworLyogIDB4ZDkgKi8gTlVMTCwgLyp4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2Q5LCovCisvKiAgMHhkYSAqLyBOVUxMLCAvKng4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGEsKi8KKy8qICAweGRiICovIE5VTEwsIC8qeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kYiwqLworLyogIDB4ZGMgKi8gTlVMTCwgLyp4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RjLCovCisvKiAgMHhkZCAqLyBOVUxMLCAvKng4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGQsKi8KKy8qICAweGRlICovIE5VTEwsIC8qeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZSwqLworLyogIDB4ZGYgKi8gTlVMTCwgLyp4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RmLCovCisKKy8qICAweGUwICovIHg4NmVtdU9wX2xvb3BuZSwKKy8qICAweGUxICovIHg4NmVtdU9wX2xvb3BlLAorLyogIDB4ZTIgKi8geDg2ZW11T3BfbG9vcCwKKy8qICAweGUzICovIHg4NmVtdU9wX2pjeHosCisvKiAgMHhlNCAqLyB4ODZlbXVPcF9pbl9ieXRlX0FMX0lNTSwKKy8qICAweGU1ICovIHg4NmVtdU9wX2luX3dvcmRfQVhfSU1NLAorLyogIDB4ZTYgKi8geDg2ZW11T3Bfb3V0X2J5dGVfSU1NX0FMLAorLyogIDB4ZTcgKi8geDg2ZW11T3Bfb3V0X3dvcmRfSU1NX0FYLAorCisvKiAgMHhlOCAqLyB4ODZlbXVPcF9jYWxsX25lYXJfSU1NLAorLyogIDB4ZTkgKi8geDg2ZW11T3BfanVtcF9uZWFyX0lNTSwKKy8qICAweGVhICovIHg4NmVtdU9wX2p1bXBfZmFyX0lNTSwKKy8qICAweGViICovIHg4NmVtdU9wX2p1bXBfYnl0ZV9JTU0sCisvKiAgMHhlYyAqLyB4ODZlbXVPcF9pbl9ieXRlX0FMX0RYLAorLyogIDB4ZWQgKi8geDg2ZW11T3BfaW5fd29yZF9BWF9EWCwKKy8qICAweGVlICovIHg4NmVtdU9wX291dF9ieXRlX0RYX0FMLAorLyogIDB4ZWYgKi8geDg2ZW11T3Bfb3V0X3dvcmRfRFhfQVgsCisKKy8qICAweGYwICovIHg4NmVtdU9wX2xvY2ssCisvKiAgMHhmMSAqLyB4ODZlbXVPcF9pbGxlZ2FsX29wLAorLyogIDB4ZjIgKi8geDg2ZW11T3BfcmVwbmUsCisvKiAgMHhmMyAqLyB4ODZlbXVPcF9yZXBlLAorLyogIDB4ZjQgKi8geDg2ZW11T3BfaGFsdCwKKy8qICAweGY1ICovIHg4NmVtdU9wX2NtYywKKy8qICAweGY2ICovIHg4NmVtdU9wX29wY0Y2X2J5dGVfUk0sCisvKiAgMHhmNyAqLyB4ODZlbXVPcF9vcGNGN193b3JkX1JNLAorCisvKiAgMHhmOCAqLyB4ODZlbXVPcF9jbGMsCisvKiAgMHhmOSAqLyB4ODZlbXVPcF9zdGMsCisvKiAgMHhmYSAqLyB4ODZlbXVPcF9jbGksCisvKiAgMHhmYiAqLyB4ODZlbXVPcF9zdGksCisvKiAgMHhmYyAqLyB4ODZlbXVPcF9jbGQsCisvKiAgMHhmZCAqLyB4ODZlbXVPcF9zdGQsCisvKiAgMHhmZSAqLyB4ODZlbXVPcF9vcGNGRV9ieXRlX1JNLAorLyogIDB4ZmYgKi8geDg2ZW11T3Bfb3BjRkZfd29yZF9STSwKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9vcHMyLmMgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IveDg2ZW11L29wczIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWMwZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9vcHMyLmMKQEAgLTAsMCArMSwxNzc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogIEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisqCisqCQlDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyoJCSAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLglUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CUFOU0kgQworKiBFbnZpcm9ubWVudDoJQW55CisqIERldmVsb3BlcjoJS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOglUaGlzIGZpbGUgaW5jbHVkZXMgc3Vicm91dGluZXMgdG8gaW1wbGVtZW50IHRoZSBkZWNvZGluZworKgkJYW5kIGVtdWxhdGlvbiBvZiBhbGwgdGhlIHg4NiBleHRlbmRlZCB0d28tYnl0ZSBwcm9jZXNzb3IKKyoJCWluc3RydWN0aW9ucy4KKyoKKyoJCUphc29uIHBvcnQgdGhpcyBmaWxlIHRvIHUtYm9vdC4gUHV0IHRoZSBmdW5jdGlvbiBwb2ludGVyIGludG8KKyoJCWdvdDIgc2VjdG9yLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIng4NmVtdS94ODZlbXVpLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19CSU9TRU1VKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK29wMSAtIEluc3RydWN0aW9uIG9wIGNvZGUKKworUkVNQVJLUzoKK0hhbmRsZXMgaWxsZWdhbCBvcGNvZGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX2lsbGVnYWxfb3AoCisgICAgdTggb3AyKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBFWFRFTkRFRCBYODYgT1BDT0RFXG4iKTsKKyAgICBUUkFDRV9SRUdTKCk7CisgICAgcHJpbnRrKCIlMDR4OiUwNHg6ICUwMlggSUxMRUdBTCBFWFRFTkRFRCBYODYgT1BDT0RFIVxuIiwKKwlNLng4Ni5SX0NTLCBNLng4Ni5SX0lQLTIsb3AyKTsKKyAgICBIQUxUX1NZUygpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisjZGVmaW5lIHhvcmwoYSxiKSAgICgoYSkgJiYgIShiKSkgfHwgKCEoYSkgJiYgKGIpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHg4MC0weDhGCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHg4NmVtdV9jaGVja19qdW1wX2NvbmRpdGlvbih1OCBvcCkKK3sKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgICBjYXNlIDB4MDoKKwlERUNPREVfUFJJTlRGKCJKT1x0Iik7CisJcmV0dXJuIEFDQ0VTU19GTEFHKEZfT0YpOworICAgICAgY2FzZSAweDE6CisJREVDT0RFX1BSSU5URigiSk5PXHQiKTsKKwlyZXR1cm4gIUFDQ0VTU19GTEFHKEZfT0YpOworCWJyZWFrOworICAgICAgY2FzZSAweDI6CisJREVDT0RFX1BSSU5URigiSkJcdCIpOworCXJldHVybiBBQ0NFU1NfRkxBRyhGX0NGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHgzOgorCURFQ09ERV9QUklOVEYoIkpOQlx0Iik7CisJcmV0dXJuICFBQ0NFU1NfRkxBRyhGX0NGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg0OgorCURFQ09ERV9QUklOVEYoIkpaXHQiKTsKKwlyZXR1cm4gQUNDRVNTX0ZMQUcoRl9aRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4NToKKwlERUNPREVfUFJJTlRGKCJKTlpcdCIpOworCXJldHVybiAhQUNDRVNTX0ZMQUcoRl9aRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4NjoKKwlERUNPREVfUFJJTlRGKCJKQkVcdCIpOworCXJldHVybiBBQ0NFU1NfRkxBRyhGX0NGKSB8fCBBQ0NFU1NfRkxBRyhGX1pGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg3OgorCURFQ09ERV9QUklOVEYoIkpOQkVcdCIpOworCXJldHVybiAhKEFDQ0VTU19GTEFHKEZfQ0YpIHx8IEFDQ0VTU19GTEFHKEZfWkYpKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg4OgorCURFQ09ERV9QUklOVEYoIkpTXHQiKTsKKwlyZXR1cm4gQUNDRVNTX0ZMQUcoRl9TRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OToKKwlERUNPREVfUFJJTlRGKCJKTlNcdCIpOworCXJldHVybiAhQUNDRVNTX0ZMQUcoRl9TRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4YToKKwlERUNPREVfUFJJTlRGKCJKUFx0Iik7CisJcmV0dXJuIEFDQ0VTU19GTEFHKEZfUEYpOworCWJyZWFrOworICAgICAgY2FzZSAweGI6CisJREVDT0RFX1BSSU5URigiSk5QXHQiKTsKKwlyZXR1cm4gIUFDQ0VTU19GTEFHKEZfUEYpOworCWJyZWFrOworICAgICAgY2FzZSAweGM6CisJREVDT0RFX1BSSU5URigiSkxcdCIpOworCXJldHVybiB4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSk7CisJYnJlYWs7CisgICAgICBjYXNlIDB4ZDoKKwlERUNPREVfUFJJTlRGKCJKTkxcdCIpOworCXJldHVybiAheG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpOworCWJyZWFrOworICAgICAgY2FzZSAweGU6CisJREVDT0RFX1BSSU5URigiSkxFXHQiKTsKKwlyZXR1cm4gKHhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKSB8fAorCQlBQ0NFU1NfRkxBRyhGX1pGKSk7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCURFQ09ERV9QUklOVEYoIkpOTEVcdCIpOworCXJldHVybiAhKHhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKSB8fAorCQkgQUNDRVNTX0ZMQUcoRl9aRikpOworICAgIH0KK30KKwordm9pZCB4ODZlbXVPcDJfbG9uZ19qdW1wKHU4IG9wMikKK3sKKyAgICBzMzIgdGFyZ2V0OworICAgIGludCBjb25kOworCisgICAgLyogY29uZGl0aW9uYWwganVtcCB0byB3b3JkIG9mZnNldC4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGNvbmQgPSB4ODZlbXVfY2hlY2tfanVtcF9jb25kaXRpb24ob3AyICYgMHhGKTsKKyAgICB0YXJnZXQgPSAoczE2KSBmZXRjaF93b3JkX2ltbSgpOworICAgIHRhcmdldCArPSAoczE2KSBNLng4Ni5SX0lQOworICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCB0YXJnZXQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKGNvbmQpCisJTS54ODYuUl9JUCA9ICh1MTYpdGFyZ2V0OworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4OTAtMHg5RgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX3NldF9ieXRlKHU4IG9wMikKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4CSpkZXN0cmVnOworICAgIGNoYXIgKm5hbWUgPSAwOworICAgIGludCBjb25kID0gMDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgc3dpdGNoIChvcDIpIHsKKyAgICAgIGNhc2UgMHg5MDoKKwluYW1lID0gIlNFVE9cdCI7CisJY29uZCA9CUFDQ0VTU19GTEFHKEZfT0YpOworCWJyZWFrOworICAgICAgY2FzZSAweDkxOgorCW5hbWUgPSAiU0VUTk9cdCI7CisJY29uZCA9ICFBQ0NFU1NfRkxBRyhGX09GKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg5MjoKKwluYW1lID0gIlNFVEJcdCI7CisJY29uZCA9IEFDQ0VTU19GTEFHKEZfQ0YpOworCWJyZWFrOworICAgICAgY2FzZSAweDkzOgorCW5hbWUgPSAiU0VUTkJcdCI7CisJY29uZCA9ICFBQ0NFU1NfRkxBRyhGX0NGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg5NDoKKwluYW1lID0gIlNFVFpcdCI7CisJY29uZCA9IEFDQ0VTU19GTEFHKEZfWkYpOworCWJyZWFrOworICAgICAgY2FzZSAweDk1OgorCW5hbWUgPSAiU0VUTlpcdCI7CisJY29uZCA9ICFBQ0NFU1NfRkxBRyhGX1pGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg5NjoKKwluYW1lID0gIlNFVEJFXHQiOworCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX0NGKSB8fCBBQ0NFU1NfRkxBRyhGX1pGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg5NzoKKwluYW1lID0gIlNFVE5CRVx0IjsKKwljb25kID0gIShBQ0NFU1NfRkxBRyhGX0NGKSB8fCBBQ0NFU1NfRkxBRyhGX1pGKSk7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OTg6CisJbmFtZSA9ICJTRVRTXHQiOworCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX1NGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg5OToKKwluYW1lID0gIlNFVE5TXHQiOworCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9TRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OWE6CisJbmFtZSA9ICJTRVRQXHQiOworCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX1BGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg5YjoKKwluYW1lID0gIlNFVE5QXHQiOworCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9QRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OWM6CisJbmFtZSA9ICJTRVRMXHQiOworCWNvbmQgPSB4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSk7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OWQ6CisJbmFtZSA9ICJTRVROTFx0IjsKKwljb25kID0gIXhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg5ZToKKwluYW1lID0gIlNFVExFXHQiOworCWNvbmQgPSAoeG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpIHx8CisJCUFDQ0VTU19GTEFHKEZfWkYpKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg5ZjoKKwluYW1lID0gIlNFVE5MRVx0IjsKKwljb25kID0gISh4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSkgfHwKKwkJIEFDQ0VTU19GTEFHKEZfWkYpKTsKKwlicmVhazsKKyAgICB9CisgICAgREVDT0RFX1BSSU5URihuYW1lKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgY29uZCA/IDB4MDEgOiAweDAwKTsKKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZGVzdHJlZyA9IGNvbmQgPyAweDAxIDogMHgwMDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhMAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX3B1c2hfRlModTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUFVTSFx0RlNcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfRlMpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YTEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9wb3BfRlModTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUE9QXHRGU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0ZTID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGEzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfYnRfUih1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIGludCBiaXQsZGlzcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQlRcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgc3JjdmFsOworCSAgICB1MzIgKnNoaWZ0cmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7CisJICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiAoMHgxIDw8IGJpdCksRl9DRik7CisJfSBlbHNlIHsKKwkgICAgdTE2IHNyY3ZhbDsKKwkgICAgdTE2ICpzaGlmdHJlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7CisJICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiAoMHgxIDw8IGJpdCksRl9DRik7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqc3JjcmVnLCpzaGlmdHJlZzsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiAoMHgxIDw8IGJpdCksRl9DRik7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpzcmNyZWcsKnNoaWZ0cmVnOworCisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgKDB4MSA8PCBiaXQpLEZfQ0YpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhNAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX3NobGRfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IHNoaWZ0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJTSExEXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBkZXN0dmFsOworCSAgICB1MzIgKnNoaWZ0cmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKwkgICAgZGVzdHZhbCA9IHNobGRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7CisJICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9IGVsc2UgeworCSAgICB1MTYgZGVzdHZhbDsKKwkgICAgdTE2ICpzaGlmdHJlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisJICAgIGRlc3R2YWwgPSBzaGxkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZywqc2hpZnRyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IHNobGRfbG9uZygqZGVzdHJlZywqc2hpZnRyZWcsc2hpZnQpOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywqc2hpZnRyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IHNobGRfd29yZCgqZGVzdHJlZywqc2hpZnRyZWcsc2hpZnQpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhNQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX3NobGRfQ0wodTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNITERcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGRlc3R2YWw7CisJICAgIHUzMiAqc2hpZnRyZWc7CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKwkgICAgZGVzdHZhbCA9IHNobGRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKKwkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0gZWxzZSB7CisJICAgIHUxNiBkZXN0dmFsOworCSAgICB1MTYgKnNoaWZ0cmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisJICAgIGRlc3R2YWwgPSBzaGxkX3dvcmQoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7CisJICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnLCpzaGlmdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IHNobGRfbG9uZygqZGVzdHJlZywqc2hpZnRyZWcsTS54ODYuUl9DTCk7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnLCpzaGlmdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IHNobGRfd29yZCgqZGVzdHJlZywqc2hpZnRyZWcsTS54ODYuUl9DTCk7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGE4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfcHVzaF9HUyh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRHU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBwdXNoX3dvcmQoTS54ODYuUl9HUyk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhOQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX3BvcF9HUyh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJQT1BcdEdTXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfR1MgPSBwb3Bfd29yZCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YWEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9idHNfUih1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIGludCBiaXQsZGlzcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQlRTXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIHNyY3ZhbCxtYXNrOworCSAgICB1MzIgKnNoaWZ0cmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7CisJICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOworCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCSAgICBzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCB8IG1hc2spOworCX0gZWxzZSB7CisJICAgIHUxNiBzcmN2YWwsbWFzazsKKwkgICAgdTE2ICpzaGlmdHJlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7CisJICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOworCSAgICBtYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7CisJICAgIHN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCwgc3JjdmFsIHwgbWFzayk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqc3JjcmVnLCpzaGlmdHJlZzsKKwkgICAgdTMyIG1hc2s7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOworCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKKwkgICAgKnNyY3JlZyB8PSBtYXNrOworCX0gZWxzZSB7CisJICAgIHUxNiAqc3JjcmVnLCpzaGlmdHJlZzsKKwkgICAgdTE2IG1hc2s7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7CisJICAgIG1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7CisJICAgICpzcmNyZWcgfD0gbWFzazsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YWMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9zaHJkX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBzaGlmdDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU0hMRFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbDsKKwkgICAgdTMyICpzaGlmdHJlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIGRlc3R2YWwgPSBzaHJkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOworCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGRlc3R2YWw7CisJICAgIHUxNiAqc2hpZnRyZWc7CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBkZXN0dmFsID0gc2hyZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKKwkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWcsKnNoaWZ0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzaHJkX2xvbmcoKmRlc3RyZWcsKnNoaWZ0cmVnLHNoaWZ0KTsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWcsKnNoaWZ0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzaHJkX3dvcmQoKmRlc3RyZWcsKnNoaWZ0cmVnLHNoaWZ0KTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9zaHJkX0NMKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJTSExEXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbDsKKwkgICAgdTMyICpzaGlmdHJlZzsKKworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKwkgICAgZGVzdHZhbCA9IHNocmRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKKwkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0gZWxzZSB7CisJICAgIHUxNiBkZXN0dmFsOworCSAgICB1MTYgKnNoaWZ0cmVnOworCisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBkZXN0dmFsID0gc2hyZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZywqc2hpZnRyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzaHJkX2xvbmcoKmRlc3RyZWcsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywqc2hpZnRyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzaHJkX3dvcmQoKmRlc3RyZWcsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX2ltdWxfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJJTVVMXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKwkgICAgdTMyIHNyY3ZhbDsKKwkgICAgdTMyIHJlc19sbyxyZXNfaGk7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMikqZGVzdHJlZywoczMyKXNyY3ZhbCk7CisJICAgIGlmIChyZXNfaGkgIT0gMCkgeworCQlTRVRfRkxBRyhGX0NGKTsKKwkJU0VUX0ZMQUcoRl9PRik7CisJICAgIH0gZWxzZSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJICAgIH0KKwkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisJICAgIHUxNiBzcmN2YWw7CisJICAgIHUzMiByZXM7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgcmVzID0gKHMxNikqZGVzdHJlZyAqIChzMTYpc3JjdmFsOworCSAgICBpZiAocmVzID4gMHhGRkZGKSB7CisJCVNFVF9GTEFHKEZfQ0YpOworCQlTRVRfRkxBRyhGX09GKTsKKwkgICAgfSBlbHNlIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkgICAgfQorCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKKwkgICAgdTMyIHJlc19sbyxyZXNfaGk7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpKmRlc3RyZWcsKHMzMikqc3JjcmVnKTsKKwkgICAgaWYgKHJlc19oaSAhPSAwKSB7CisJCVNFVF9GTEFHKEZfQ0YpOworCQlTRVRfRkxBRyhGX09GKTsKKwkgICAgfSBlbHNlIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkgICAgfQorCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCSAgICB1MzIgcmVzOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICByZXMgPSAoczE2KSpkZXN0cmVnICogKHMxNikqc3JjcmVnOworCSAgICBpZiAocmVzID4gMHhGRkZGKSB7CisJCVNFVF9GTEFHKEZfQ0YpOworCQlTRVRfRkxBRyhGX09GKTsKKwkgICAgfSBlbHNlIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkgICAgfQorCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX2xzc19SX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmgsIHJsOworICAgIHUxNiAqZHN0cmVnOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMU1NcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwlNLng4Ni5SX1NTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJLyogVU5ERUZJTkVEISAqLworCVRSQUNFX0FORF9TVEVQKCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YjMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9idHJfUih1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIGludCBiaXQsZGlzcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQlRSXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBzcmN2YWwsbWFzazsKKwkgICAgdTMyICpzaGlmdHJlZzsKKworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKwkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDU7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCk7CisJICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7CisJICAgIHN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCwgc3JjdmFsICYgfm1hc2spOworCX0gZWxzZSB7CisJICAgIHUxNiBzcmN2YWwsbWFzazsKKwkgICAgdTE2ICpzaGlmdHJlZzsKKworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOworCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKKwkgICAgbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsICh1MTYpKHNyY3ZhbCAmIH5tYXNrKSk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqc3JjcmVnLCpzaGlmdHJlZzsKKwkgICAgdTMyIG1hc2s7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOworCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKKwkgICAgKnNyY3JlZyAmPSB+bWFzazsKKwl9IGVsc2UgeworCSAgICB1MTYgKnNyY3JlZywqc2hpZnRyZWc7CisJICAgIHUxNiBtYXNrOworCisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOworCSAgICBtYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOworCSAgICAqc3JjcmVnICY9IH5tYXNrOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiNAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX2xmc19SX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmgsIHJsOworICAgIHUxNiAqZHN0cmVnOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMRlNcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwlNLng4Ni5SX0ZTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJLyogVU5ERUZJTkVEISAqLworCVRSQUNFX0FORF9TVEVQKCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YjUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9sZ3NfUl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJoLCBybDsKKyAgICB1MTYgKmRzdHJlZzsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTEdTXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJTS54ODYuUl9HUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCS8qIFVOREVGSU5FRCEgKi8KKwlUUkFDRV9BTkRfU1RFUCgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGI2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfbW92enhfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlpYXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKwkgICAgdTMyIHNyY3ZhbDsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisJICAgIHUxNiBzcmN2YWw7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzcmN2YWw7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKwkgICAgdTgJKnNyY3JlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSAqc3JjcmVnOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZzsKKwkgICAgdTgJKnNyY3JlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSAqc3JjcmVnOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX21vdnp4X3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHUzMiAqZGVzdHJlZzsKKyAgICB1MzIgc3JjdmFsOworICAgIHUxNiAqc3JjcmVnOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZaWFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkZXN0cmVnID0gc3JjdmFsOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZGVzdHJlZyA9ICpzcmNyZWc7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YmEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9idFhfSSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHU4IHNoaWZ0OworICAgIGludCBiaXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgc3dpdGNoIChyaCkgeworICAgIGNhc2UgNDoKKwlERUNPREVfUFJJTlRGKCJCVFx0Iik7CisJYnJlYWs7CisgICAgY2FzZSA1OgorCURFQ09ERV9QUklOVEYoIkJUU1x0Iik7CisJYnJlYWs7CisgICAgY2FzZSA2OgorCURFQ09ERV9QUklOVEYoIkJUUlx0Iik7CisJYnJlYWs7CisgICAgY2FzZSA3OgorCURFQ09ERV9QUklOVEYoIkJUQ1x0Iik7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlERUNPREVfUFJJTlRGKCJJTExFR0FMIEVYVEVOREVEIFg4NiBPUENPREVcbiIpOworCVRSQUNFX1JFR1MoKTsKKwlwcmludGsoIiUwNHg6JTA0eDogJTAyWCUwMlggSUxMRUdBTCBFWFRFTkRFRCBYODYgT1BDT0RFIEVYVEVOU0lPTiFcbiIsCisJCU0ueDg2LlJfQ1MsIE0ueDg2LlJfSVAtMyxvcDIsIChtb2Q8PDYpfChyaDw8Myl8cmwpOworCUhBTFRfU1lTKCk7CisgICAgfQorICAgIGlmIChtb2QgPCAzKSB7CisKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCXNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwlERUNPREVfUFJJTlRGMigiLCVkXG4iLCBzaGlmdCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgc3JjdmFsLCBtYXNrOworCisJICAgIGJpdCA9IHNoaWZ0ICYgMHgxRjsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisJICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7CisJICAgIHN3aXRjaCAocmgpIHsKKwkgICAgY2FzZSA1OgorCQlzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0LCBzcmN2YWwgfCBtYXNrKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNjoKKwkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsICYgfm1hc2spOworCQlicmVhazsKKwkgICAgY2FzZSA3OgorCQlzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0LCBzcmN2YWwgXiBtYXNrKTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgdTE2IHNyY3ZhbCwgbWFzazsKKworCSAgICBiaXQgPSBzaGlmdCAmIDB4RjsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7CisJICAgIHN3aXRjaCAocmgpIHsKKwkgICAgY2FzZSA1OgorCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0LCBzcmN2YWwgfCBtYXNrKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNjoKKwkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsICYgfm1hc2spOworCQlicmVhazsKKwkgICAgY2FzZSA3OgorCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0LCBzcmN2YWwgXiBtYXNrKTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqc3JjcmVnOworCSAgICB1MzIgbWFzazsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgc2hpZnQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSBzaGlmdCAmIDB4MUY7CisJICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOworCSAgICBzd2l0Y2ggKHJoKSB7CisJICAgIGNhc2UgNToKKwkJKnNyY3JlZyB8PSBtYXNrOworCQlicmVhazsKKwkgICAgY2FzZSA2OgorCQkqc3JjcmVnICY9IH5tYXNrOworCQlicmVhazsKKwkgICAgY2FzZSA3OgorCQkqc3JjcmVnIF49IG1hc2s7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlicmVhazsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHUxNiAqc3JjcmVnOworCSAgICB1MTYgbWFzazsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgc2hpZnQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSBzaGlmdCAmIDB4RjsKKwkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7CisJICAgIHN3aXRjaCAocmgpIHsKKwkgICAgY2FzZSA1OgorCQkqc3JjcmVnIHw9IG1hc2s7CisJCWJyZWFrOworCSAgICBjYXNlIDY6CisJCSpzcmNyZWcgJj0gfm1hc2s7CisJCWJyZWFrOworCSAgICBjYXNlIDc6CisJCSpzcmNyZWcgXj0gbWFzazsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGJiCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfYnRjX1IodTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICBpbnQgYml0LGRpc3A7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkJUQ1x0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgc3JjdmFsLG1hc2s7CisJICAgIHUzMiAqc2hpZnRyZWc7CisKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7CisJICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOworCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCSAgICBzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCBeIG1hc2spOworCX0gZWxzZSB7CisJICAgIHUxNiBzcmN2YWwsbWFzazsKKwkgICAgdTE2ICpzaGlmdHJlZzsKKworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOworCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKKwkgICAgbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsICh1MTYpKHNyY3ZhbCBeIG1hc2spKTsKKwl9CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpzcmNyZWcsKnNoaWZ0cmVnOworCSAgICB1MzIgbWFzazsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7CisJICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOworCSAgICAqc3JjcmVnIF49IG1hc2s7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpzcmNyZWcsKnNoaWZ0cmVnOworCSAgICB1MTYgbWFzazsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKwkgICAgbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKKwkgICAgKnNyY3JlZyBePSBtYXNrOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX2JzZih1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJCU0ZcbiIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIHNyY3ZhbCwgKmRzdHJlZzsKKworCSAgICBkc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7CisJICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDMyOyAoKmRzdHJlZykrKykKKwkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKKwl9IGVsc2UgeworCSAgICB1MTYgc3JjdmFsLCAqZHN0cmVnOworCisJICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKKwkgICAgZm9yKCpkc3RyZWcgPSAwOyAqZHN0cmVnIDwgMTY7ICgqZHN0cmVnKSsrKQorCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOworCX0KKyAgICB9IGVsc2UgewkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqc3JjcmVnLCAqZHN0cmVnOworCisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBkc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgPT0gMCwgRl9aRik7CisJICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDMyOyAoKmRzdHJlZykrKykKKwkJaWYgKCgqc3JjcmVnID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpzcmNyZWcsICpkc3RyZWc7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyA9PSAwLCBGX1pGKTsKKwkgICAgZm9yKCpkc3RyZWcgPSAwOyAqZHN0cmVnIDwgMTY7ICgqZHN0cmVnKSsrKQorCQlpZiAoKCpzcmNyZWcgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YmQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9ic3IodTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQlNGXG4iKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBzcmN2YWwsICpkc3RyZWc7CisKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDMxOyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCisJCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7CisJfSBlbHNlIHsKKwkgICAgdTE2IHNyY3ZhbCwgKmRzdHJlZzsKKworCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7CisJICAgIGZvcigqZHN0cmVnID0gMTU7ICpkc3RyZWcgPiAwOyAoKmRzdHJlZyktLSkKKwkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKKwl9CisgICAgfSBlbHNlIHsJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZywgKmRzdHJlZzsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDMxOyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCisJCWlmICgoKnNyY3JlZyA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOworCX0gZWxzZSB7CisJICAgIHUxNiAqc3JjcmVnLCAqZHN0cmVnOworCisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgPT0gMCwgRl9aRik7CisJICAgIGZvcigqZHN0cmVnID0gMTU7ICpkc3RyZWcgPiAwOyAoKmRzdHJlZyktLSkKKwkJaWYgKCgqc3JjcmVnID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGJlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfbW92c3hfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlNYXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKwkgICAgdTMyIHNyY3ZhbDsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIHNyY3ZhbCA9IChzMzIpKChzOClmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KSk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gc3JjdmFsOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZzsKKwkgICAgdTE2IHNyY3ZhbDsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIHNyY3ZhbCA9IChzMTYpKChzOClmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KSk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gc3JjdmFsOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHU4CSpzcmNyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gKHMzMikoKHM4KSpzcmNyZWcpOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZzsKKwkgICAgdTgJKnNyY3JlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSAoczE2KSgoczgpKnNyY3JlZyk7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGJmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfbW92c3hfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisgICAgdTMyICpkZXN0cmVnOworICAgIHUzMiBzcmN2YWw7CisgICAgdTE2ICpzcmNyZWc7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlNYXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlzcmN2YWwgPSAoczMyKSgoczE2KWZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRlc3RyZWcgPSBzcmN2YWw7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkZXN0cmVnID0gKHMzMikoKHMxNikqc3JjcmVnKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEb3VibGUgYnl0ZSBvcGVyYXRpb24gY29kZSB0YWJsZToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKCp4ODZlbXVfb3B0YWIyWzI1Nl0pKHU4KSBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuZ290MiIpKSkgPQoreworLyogIDB4MDAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBHcm91cCBGIChyaW5nIDAgUE0pICAgICAgKi8KKy8qICAweDAxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogR3JvdXAgRyAocmluZyAwIFBNKSAgICAgICovCisvKiAgMHgwMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIGxhciAocmluZyAwIFBNKQkgICAgICAgKi8KKy8qICAweDAzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbHNsIChyaW5nIDAgUE0pCSAgICAgICAqLworLyogIDB4MDQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgwNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIGxvYWRhbGwgKHVuZG9jdW1lbnRlZCkgICAqLworLyogIDB4MDYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBjbHRzIChyaW5nIDAgUE0pCSAgICAgICAqLworLyogIDB4MDcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBsb2FkYWxsICh1bmRvY3VtZW50ZWQpICAgKi8KKy8qICAweDA4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogaW52ZCAocmluZyAwIFBNKQkgICAgICAgKi8KKy8qICAweDA5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogd2JpbnZkIChyaW5nIDAgUE0pICAgICAgICovCisvKiAgMHgwYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDBiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MGMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgwZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDBlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MGYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisKKy8qICAweDEwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MTEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDEzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MTQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDE2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MTcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDE5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MWEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDFjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MWQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDFmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorCisvKiAgMHgyMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIG1vdiByZWczMixjcmVnIChyaW5nIDAgUE0pICovCisvKiAgMHgyMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIG1vdiByZWczMixkcmVnIChyaW5nIDAgUE0pICovCisvKiAgMHgyMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIG1vdiBjcmVnLHJlZzMyIChyaW5nIDAgUE0pICovCisvKiAgMHgyMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIG1vdiBkcmVnLHJlZzMyIChyaW5nIDAgUE0pICovCisvKiAgMHgyNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIG1vdiByZWczMix0cmVnIChyaW5nIDAgUE0pICovCisvKiAgMHgyNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDI2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbW92IHRyZWcscmVnMzIgKHJpbmcgMCBQTSkgKi8KKy8qICAweDI3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MjggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgyOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDJhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MmIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgyYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDJkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MmUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgyZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKworLyogIDB4MzAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDMyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MzMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDM1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MzYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDM4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MzkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDNiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4M2MgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDNlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4M2YgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisKKy8qICAweDQwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NDEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0MiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDQzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NDQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0NSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDQ2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NDcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0OCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDQ5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NGEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0YiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDRjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NGQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0ZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDRmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorCisvKiAgMHg1MCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDUxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NTIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1MyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDU0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NTUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1NiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDU3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NTggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1OSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDVhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NWIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1YyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDVkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NWUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1ZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKworLyogIDB4NjAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2MSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDYyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NjMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2NCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDY1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NjYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2NyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDY4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NjkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2YSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDZiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NmMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2ZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDZlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NmYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisKKy8qICAweDcwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NzEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3MiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDczICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NzQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3NSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDc2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NzcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3OCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDc5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4N2EgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3YiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDdjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4N2QgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3ZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDdmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorCisvKiAgMHg4MCAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4ODEgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDgyICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4MyAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4ODQgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDg1ICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4NiAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4ODcgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDg4ICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4OSAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4OGEgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDhiICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4YyAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4OGQgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDhlICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4ZiAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorCisvKiAgMHg5MCAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisvKiAgMHg5MSAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisvKiAgMHg5MiAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisvKiAgMHg5MyAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisvKiAgMHg5NCAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisvKiAgMHg5NSAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisvKiAgMHg5NiAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisvKiAgMHg5NyAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisvKiAgMHg5OCAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisvKiAgMHg5OSAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisvKiAgMHg5YSAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisvKiAgMHg5YiAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisvKiAgMHg5YyAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisvKiAgMHg5ZCAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisvKiAgMHg5ZSAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisvKiAgMHg5ZiAqLyB4ODZlbXVPcDJfc2V0X2J5dGUsCisKKy8qICAweGEwICovIHg4NmVtdU9wMl9wdXNoX0ZTLAorLyogIDB4YTEgKi8geDg2ZW11T3AyX3BvcF9GUywKKy8qICAweGEyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YTMgKi8geDg2ZW11T3AyX2J0X1IsCisvKiAgMHhhNCAqLyB4ODZlbXVPcDJfc2hsZF9JTU0sCisvKiAgMHhhNSAqLyB4ODZlbXVPcDJfc2hsZF9DTCwKKy8qICAweGE2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YTcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhhOCAqLyB4ODZlbXVPcDJfcHVzaF9HUywKKy8qICAweGE5ICovIHg4NmVtdU9wMl9wb3BfR1MsCisvKiAgMHhhYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGFiICovIHg4NmVtdU9wMl9idF9SLAorLyogIDB4YWMgKi8geDg2ZW11T3AyX3NocmRfSU1NLAorLyogIDB4YWQgKi8geDg2ZW11T3AyX3NocmRfQ0wsCisvKiAgMHhhZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGFmICovIHg4NmVtdU9wMl9pbXVsX1JfUk0sCisKKy8qICAweGIwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogY21weGNoZyAqLworLyogIDB4YjEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBjbXB4Y2hnICovCisvKiAgMHhiMiAqLyB4ODZlbXVPcDJfbHNzX1JfSU1NLAorLyogIDB4YjMgKi8geDg2ZW11T3AyX2J0cl9SLAorLyogIDB4YjQgKi8geDg2ZW11T3AyX2xmc19SX0lNTSwKKy8qICAweGI1ICovIHg4NmVtdU9wMl9sZ3NfUl9JTU0sCisvKiAgMHhiNiAqLyB4ODZlbXVPcDJfbW92enhfYnl0ZV9SX1JNLAorLyogIDB4YjcgKi8geDg2ZW11T3AyX21vdnp4X3dvcmRfUl9STSwKKy8qICAweGI4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YjkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhiYSAqLyB4ODZlbXVPcDJfYnRYX0ksCisvKiAgMHhiYiAqLyB4ODZlbXVPcDJfYnRjX1IsCisvKiAgMHhiYyAqLyB4ODZlbXVPcDJfYnNmLAorLyogIDB4YmQgKi8geDg2ZW11T3AyX2JzciwKKy8qICAweGJlICovIHg4NmVtdU9wMl9tb3ZzeF9ieXRlX1JfUk0sCisvKiAgMHhiZiAqLyB4ODZlbXVPcDJfbW92c3hfd29yZF9SX1JNLAorCisvKiAgMHhjMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IHhhZGQgKi8KKy8qICAweGMxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogeGFkZCAqLworLyogIDB4YzIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhjMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGM0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YzUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhjNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGM3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YzggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLworLyogIDB4YzkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLworLyogIDB4Y2EgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLworLyogIDB4Y2IgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLworLyogIDB4Y2MgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLworLyogIDB4Y2QgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLworLyogIDB4Y2UgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLworLyogIDB4Y2YgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBic3dhcCAqLworCisvKiAgMHhkMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGQxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZDIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGQ0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZDUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGQ3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZDggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGRhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZGIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGRkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZGUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKworLyogIDB4ZTAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGUyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZTMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGU1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZTYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGU4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZTkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGViICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZWMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGVlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZWYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisKKy8qICAweGYwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZjEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGYzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZjQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGY2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZjcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGY5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZmEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGZjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZmQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGZmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jpb3NfZW11bGF0b3IveDg2ZW11L3ByaW1fb3BzLmMgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IveDg2ZW11L3ByaW1fb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExNTJlYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci94ODZlbXUvcHJpbV9vcHMuYwpAQCAtMCwwICsxLDI0NDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyoJCUNvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKgkJICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCVRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZToJQU5TSSBDCisqIEVudmlyb25tZW50OglBbnkKKyogRGV2ZWxvcGVyOglLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246CVRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0byBpbXBsZW1lbnQgdGhlIHByaW1pdGl2ZQorKgkJbWFjaGluZSBvcGVyYXRpb25zIHVzZWQgYnkgdGhlIGVtdWxhdGlvbiBjb2RlIGluIG9wcy5jCisqCisqIENhcnJ5IENoYWluIENhbGN1bGF0aW9uCisqCisqIFRoaXMgcmVwcmVzZW50cyBhIHNvbWV3aGF0IGV4cGVuc2l2ZSBjYWxjdWxhdGlvbiB3aGljaCBpcworKiBhcHBhcmVudGx5IHJlcXVpcmVkIHRvIGVtdWxhdGUgdGhlIHNldHRpbmcgb2YgdGhlIE9GMzQzMzY0IGFuZCBBRiBmbGFnLgorKiBUaGUgbGF0dGVyIGlzIG5vdCBzbyBpbXBvcnRhbnQsIGJ1dCB0aGUgZm9ybWVyIGlzLiAgVGhlIG92ZXJmbG93CisqIGZsYWcgaXMgdGhlIFhPUiBvZiB0aGUgdG9wIHR3byBiaXRzIG9mIHRoZSBjYXJyeSBjaGFpbiBmb3IgYW4KKyogYWRkaXRpb24gKHNpbWlsYXIgZm9yIHN1YnRyYWN0aW9uKS4gIFNpbmNlIHdlIGRvIG5vdCB3YW50IHRvCisqIHNpbXVsYXRlIHRoZSBhZGRpdGlvbiBpbiBhIGJpdHdpc2UgbWFubmVyLCB3ZSB0cnkgdG8gY2FsY3VsYXRlIHRoZQorKiBjYXJyeSBjaGFpbiBnaXZlbiB0aGUgdHdvIG9wZXJhbmRzIGFuZCB0aGUgcmVzdWx0LgorKgorKiBTbywgZ2l2ZW4gdGhlIGZvbGxvd2luZyB0YWJsZSwgd2hpY2ggcmVwcmVzZW50cyB0aGUgYWRkaXRpb24gb2YgdHdvCisqIGJpdHMsIHdlIGNhbiBkZXJpdmUgYSBmb3JtdWxhIGZvciB0aGUgY2FycnkgY2hhaW4uCisqCisqIGEgICBiCSAgY2luCXIgICAgIGNvdXQKKyogMCAgIDAJICAwCTAgICAgIDAKKyogMCAgIDAJICAxCTEgICAgIDAKKyogMCAgIDEJICAwCTEgICAgIDAKKyogMCAgIDEJICAxCTAgICAgIDEKKyogMSAgIDAJICAwCTEgICAgIDAKKyogMSAgIDAJICAxCTAgICAgIDEKKyogMSAgIDEJICAwCTAgICAgIDEKKyogMSAgIDEJICAxCTEgICAgIDEKKyoKKyogQ29uc3RydWN0aW9uIG9mIHRhYmxlIGZvciBjb3V0OgorKgorKiBhYgorKiByICBcCTAwICAgMDEJICAxMSAgMTAKKyogfC0tLS0tLS0tLS0tLS0tLS0tLQorKiAwICB8CSAwICAgIDEJICAgMSAgIDEKKyogMSAgfAkgMCAgICAwCSAgIDEgICAwCisqCisqIEJ5IGluc3BlY3Rpb24sIG9uZSBnZXRzOiAgY2MgPSBhYiArICByJyhhICsgYikKKyoKKyogVGhhdCByZXByZXNlbnRzIGFsb3Qgb2Ygb3BlcmF0aW9ucywgYnV0IE5PIENIT0lDRS4uLi4KKyoKKyogQm9ycm93IENoYWluIENhbGN1bGF0aW9uLgorKgorKiBUaGUgZm9sbG93aW5nIHRhYmxlIHJlcHJlc2VudHMgdGhlIHN1YnRyYWN0aW9uIG9mIHR3byBiaXRzLCBmcm9tCisqIHdoaWNoIHdlIGNhbiBkZXJpdmUgYSBmb3JtdWxhIGZvciB0aGUgYm9ycm93IGNoYWluLgorKgorKiBhICAgYgkgIGJpbglyICAgICBib3V0CisqIDAgICAwCSAgMAkwICAgICAwCisqIDAgICAwCSAgMQkxICAgICAxCisqIDAgICAxCSAgMAkxICAgICAxCisqIDAgICAxCSAgMQkwICAgICAxCisqIDEgICAwCSAgMAkxICAgICAwCisqIDEgICAwCSAgMQkwICAgICAwCisqIDEgICAxCSAgMAkwICAgICAwCisqIDEgICAxCSAgMQkxICAgICAxCisqCisqIENvbnN0cnVjdGlvbiBvZiB0YWJsZSBmb3IgY291dDoKKyoKKyogYWIKKyogciAgXAkwMCAgIDAxCSAgMTEgIDEwCisqIHwtLS0tLS0tLS0tLS0tLS0tLS0KKyogMCAgfAkgMCAgICAxCSAgIDAgICAwCisqIDEgIHwJIDEgICAgMQkgICAxICAgMAorKgorKiBCeSBpbnNwZWN0aW9uLCBvbmUgZ2V0czogIGJjID0gYSdiICsJcihhJyArIGIpCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFBSSU1fT1BTX05PX1JFREVGSU5FX0FTTQorI2luY2x1ZGUgIng4NmVtdS94ODZlbXVpLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19CSU9TRU1VKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIHg4NmVtdV9wYXJpdHlfdGFiWzhdID0KK3sKKyAgICAweDk2Njk2OTk2LAorICAgIDB4Njk5Njk2NjksCisgICAgMHg2OTk2OTY2OSwKKyAgICAweDk2Njk2OTk2LAorICAgIDB4Njk5Njk2NjksCisgICAgMHg5NjY5Njk5NiwKKyAgICAweDk2Njk2OTk2LAorICAgIDB4Njk5Njk2NjksCit9OworCisjZGVmaW5lIFBBUklUWSh4KSAgICgoKHg4NmVtdV9wYXJpdHlfdGFiWyh4KSAvIDMyXSA+PiAoKHgpICUgMzIpKSAmIDEpID09IDApCisjZGVmaW5lIFhPUjIoeCkJICAgICgoKHgpIF4gKCh4KT4+MSkpICYgMHgxKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBhYnMoaW50IHYpCit7CisJcmV0dXJuICh2PjApP3Y6LXY7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0gU2lkZSBlZmZlY3RzIGhlbHBlciBmdW5jdGlvbnMgLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgoraW1wbGVtZW50cyBzaWRlIGVmZWN0cyBmb3IgYnl0ZSBvcGVyYXRpb25zIHRoYXQgZG9uJ3Qgb3ZlcmZsb3cKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHNldF9wYXJpdHlfZmxhZyh1MzIgcmVzKQoreworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweEZGKSwgRl9QRik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zenBfZmxhZ3NfOCh1OCByZXMpCit7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOworICAgIHNldF9wYXJpdHlfZmxhZyhyZXMpOworfQorCitzdGF0aWMgdm9pZCBzZXRfc3pwX2ZsYWdzXzE2KHUxNiByZXMpCit7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7CisgICAgc2V0X3Bhcml0eV9mbGFnKHJlcyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zenBfZmxhZ3NfMzIodTMyIHJlcykKK3sKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7CisgICAgc2V0X3Bhcml0eV9mbGFnKHJlcyk7Cit9CisKK3N0YXRpYyB2b2lkIG5vX2NhcnJ5X2J5dGVfc2lkZV9lZmYodTggcmVzKQoreworICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICBDTEVBUl9GTEFHKEZfQUYpOworICAgIHNldF9zenBfZmxhZ3NfOChyZXMpOworfQorCitzdGF0aWMgdm9pZCBub19jYXJyeV93b3JkX3NpZGVfZWZmKHUxNiByZXMpCit7CisgICAgQ0xFQVJfRkxBRyhGX09GKTsKKyAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgIENMRUFSX0ZMQUcoRl9BRik7CisgICAgc2V0X3N6cF9mbGFnc18xNihyZXMpOworfQorCitzdGF0aWMgdm9pZCBub19jYXJyeV9sb25nX3NpZGVfZWZmKHUzMiByZXMpCit7CisgICAgQ0xFQVJfRkxBRyhGX09GKTsKKyAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgIENMRUFSX0ZMQUcoRl9BRik7CisgICAgc2V0X3N6cF9mbGFnc18zMihyZXMpOworfQorCitzdGF0aWMgdm9pZCBjYWxjX2NhcnJ5X2NoYWluKGludCBiaXRzLCB1MzIgZCwgdTMyIHMsIHUzMiByZXMsIGludCBzZXRfY2FycnkpCit7CisgICAgdTMyIGNjOworCisgICAgY2MgPSAocyAmIGQpIHwgKCh+cmVzKSAmIChzIHwgZCkpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoY2MgPj4gKGJpdHMgLSAyKSksIEZfT0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGNjICYgMHg4LCBGX0FGKTsKKyAgICBpZiAoc2V0X2NhcnJ5KSB7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgKDEgPDwgYml0cyksIEZfQ0YpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2FsY19ib3Jyb3dfY2hhaW4oaW50IGJpdHMsIHUzMiBkLCB1MzIgcywgdTMyIHJlcywgaW50IHNldF9jYXJyeSkKK3sKKyAgICB1MzIgYmM7CisKKyAgICBiYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IChiaXRzIC0gMikpLCBGX09GKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7CisgICAgaWYgKHNldF9jYXJyeSkgeworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgKDEgPDwgKGJpdHMgLSAxKSksIEZfQ0YpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBQUEgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgYWFhX3dvcmQodTE2IGQpCit7CisgICAgdTE2IHJlczsKKyAgICBpZiAoKGQgJiAweGYpID4gMHg5IHx8IEFDQ0VTU19GTEFHKEZfQUYpKSB7CisJZCArPSAweDY7CisJZCArPSAweDEwMDsKKwlTRVRfRkxBRyhGX0FGKTsKKwlTRVRfRkxBRyhGX0NGKTsKKyAgICB9IGVsc2UgeworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX0FGKTsKKyAgICB9CisgICAgcmVzID0gKHUxNikoZCAmIDB4RkYwRik7CisgICAgc2V0X3N6cF9mbGFnc18xNihyZXMpOworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQUFBIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IGFhc193b3JkKHUxNiBkKQoreworICAgIHUxNiByZXM7CisgICAgaWYgKChkICYgMHhmKSA+IDB4OSB8fCBBQ0NFU1NfRkxBRyhGX0FGKSkgeworCWQgLT0gMHg2OworCWQgLT0gMHgxMDA7CisJU0VUX0ZMQUcoRl9BRik7CisJU0VUX0ZMQUcoRl9DRik7CisgICAgfSBlbHNlIHsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9BRik7CisgICAgfQorICAgIHJlcyA9ICh1MTYpKGQgJiAweEZGMEYpOworICAgIHNldF9zenBfZmxhZ3NfMTYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIEFBRCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBhYWRfd29yZCh1MTYgZCkKK3sKKyAgICB1MTYgbDsKKyAgICB1OCBoYiwgbGI7CisKKyAgICBoYiA9ICh1OCkoKGQgPj4gOCkgJiAweGZmKTsKKyAgICBsYiA9ICh1OCkoKGQgJiAweGZmKSk7CisgICAgbCA9ICh1MTYpKChsYiArIDEwICogaGIpICYgMHhGRik7CisKKyAgICBub19jYXJyeV9ieXRlX3NpZGVfZWZmKGwgJiAweEZGKTsKKyAgICByZXR1cm4gbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBQU0gaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgYWFtX3dvcmQodTggZCkKK3sKKyAgICB1MTYgaCwgbDsKKworICAgIGggPSAodTE2KShkIC8gMTApOworICAgIGwgPSAodTE2KShkICUgMTApOworICAgIGwgfD0gKHUxNikoaCA8PCA4KTsKKworICAgIG5vX2NhcnJ5X2J5dGVfc2lkZV9lZmYobCAmIDB4RkYpOworICAgIHJldHVybiBsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIEFEQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IGFkY19ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgKyBzOworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgcmVzKys7CisKKyAgICBzZXRfc3pwX2ZsYWdzXzgocmVzKTsKKyAgICBjYWxjX2NhcnJ5X2NoYWluKDgscyxkLHJlcywxKTsKKworICAgIHJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIEFEQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBhZGNfd29yZCh1MTYgZCwgdTE2IHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgKyBzOworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0NGKSkKKwlyZXMrKzsKKworICAgIHNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworICAgIGNhbGNfY2FycnlfY2hhaW4oMTYscyxkLHJlcywxKTsKKworICAgIHJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBREMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgYWRjX2xvbmcodTMyIGQsIHUzMiBzKQoreworICAgIHUzMiBsbzsgICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisgICAgdTMyIGhpOworICAgIHUzMiByZXM7CisKKyAgICBsbyA9IChkICYgMHhGRkZGKSArIChzICYgMHhGRkZGKTsKKyAgICByZXMgPSBkICsgczsKKworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgeworCWxvKys7CisJcmVzKys7CisgICAgfQorCisgICAgaGkgPSAobG8gPj4gMTYpICsgKGQgPj4gMTYpICsgKHMgPj4gMTYpOworCisgICAgc2V0X3N6cF9mbGFnc18zMihyZXMpOworICAgIGNhbGNfY2FycnlfY2hhaW4oMzIscyxkLHJlcywwKTsKKworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGhpICYgMHgxMDAwMCwgRl9DRik7CisKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIEFERCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IGFkZF9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgKyBzOworICAgIHNldF9zenBfZmxhZ3NfOCgodTgpcmVzKTsKKyAgICBjYWxjX2NhcnJ5X2NoYWluKDgscyxkLHJlcywxKTsKKworICAgIHJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIEFERCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBhZGRfd29yZCh1MTYgZCwgdTE2IHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgKyBzOworICAgIHNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworICAgIGNhbGNfY2FycnlfY2hhaW4oMTYscyxkLHJlcywxKTsKKworICAgIHJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBREQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgYWRkX2xvbmcodTMyIGQsIHUzMiBzKQoreworICAgIHUzMiByZXM7CisKKyAgICByZXMgPSBkICsgczsKKyAgICBzZXRfc3pwX2ZsYWdzXzMyKHJlcyk7CisgICAgY2FsY19jYXJyeV9jaGFpbigzMixzLGQscmVzLDApOworCisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzIDwgZCB8fCByZXMgPCBzLCBGX0NGKTsKKworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQU5EIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggYW5kX2J5dGUodTggZCwgdTggcykKK3sKKyAgICB1OCByZXM7ICAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAmIHM7CisKKyAgICBub19jYXJyeV9ieXRlX3NpZGVfZWZmKHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBTkQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgYW5kX3dvcmQodTE2IGQsIHUxNiBzKQoreworICAgIHUxNiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICYgczsKKworICAgIG5vX2NhcnJ5X3dvcmRfc2lkZV9lZmYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIEFORCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBhbmRfbG9uZyh1MzIgZCwgdTMyIHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgJiBzOworICAgIG5vX2NhcnJ5X2xvbmdfc2lkZV9lZmYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIENNUCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IGNtcF9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgLSBzOworICAgIHNldF9zenBfZmxhZ3NfOCgodTgpcmVzKTsKKyAgICBjYWxjX2JvcnJvd19jaGFpbig4LCBkLCBzLCByZXMsIDEpOworCisgICAgcmV0dXJuIGQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQ01QIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IGNtcF93b3JkKHUxNiBkLCB1MTYgcykKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAtIHM7CisgICAgc2V0X3N6cF9mbGFnc18xNigodTE2KXJlcyk7CisgICAgY2FsY19ib3Jyb3dfY2hhaW4oMTYsIGQsIHMsIHJlcywgMSk7CisKKyAgICByZXR1cm4gZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBDTVAgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgY21wX2xvbmcodTMyIGQsIHUzMiBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkIC0gczsKKyAgICBzZXRfc3pwX2ZsYWdzXzMyKHJlcyk7CisgICAgY2FsY19ib3Jyb3dfY2hhaW4oMzIsIGQsIHMsIHJlcywgMSk7CisKKyAgICByZXR1cm4gZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBEQUEgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBkYWFfYnl0ZSh1OCBkKQoreworICAgIHUzMiByZXMgPSBkOworICAgIGlmICgoZCAmIDB4ZikgPiA5IHx8IEFDQ0VTU19GTEFHKEZfQUYpKSB7CisJcmVzICs9IDY7CisJU0VUX0ZMQUcoRl9BRik7CisgICAgfQorICAgIGlmIChyZXMgPiAweDlGIHx8IEFDQ0VTU19GTEFHKEZfQ0YpKSB7CisJcmVzICs9IDB4NjA7CisJU0VUX0ZMQUcoRl9DRik7CisgICAgfQorICAgIHNldF9zenBfZmxhZ3NfOCgodTgpcmVzKTsKKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBEQVMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBkYXNfYnl0ZSh1OCBkKQoreworICAgIGlmICgoZCAmIDB4ZikgPiA5IHx8IEFDQ0VTU19GTEFHKEZfQUYpKSB7CisJZCAtPSA2OworCVNFVF9GTEFHKEZfQUYpOworICAgIH0KKyAgICBpZiAoZCA+IDB4OUYgfHwgQUNDRVNTX0ZMQUcoRl9DRikpIHsKKwlkIC09IDB4NjA7CisJU0VUX0ZMQUcoRl9DRik7CisgICAgfQorICAgIHNldF9zenBfZmxhZ3NfOChkKTsKKyAgICByZXR1cm4gZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBERUMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBkZWNfYnl0ZSh1OCBkKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkIC0gMTsKKyAgICBzZXRfc3pwX2ZsYWdzXzgoKHU4KXJlcyk7CisgICAgY2FsY19ib3Jyb3dfY2hhaW4oOCwgZCwgMSwgcmVzLCAwKTsKKworICAgIHJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIERFQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBkZWNfd29yZCh1MTYgZCkKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAtIDE7CisgICAgc2V0X3N6cF9mbGFnc18xNigodTE2KXJlcyk7CisgICAgY2FsY19ib3Jyb3dfY2hhaW4oMTYsIGQsIDEsIHJlcywgMCk7CisKKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgREVDIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGRlY19sb25nKHUzMiBkKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkIC0gMTsKKworICAgIHNldF9zenBfZmxhZ3NfMzIocmVzKTsKKyAgICBjYWxjX2JvcnJvd19jaGFpbigzMiwgZCwgMSwgcmVzLCAwKTsKKworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgSU5DIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggaW5jX2J5dGUodTggZCkKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCArIDE7CisgICAgc2V0X3N6cF9mbGFnc184KCh1OClyZXMpOworICAgIGNhbGNfY2FycnlfY2hhaW4oOCwgZCwgMSwgcmVzLCAwKTsKKworICAgIHJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIElOQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBpbmNfd29yZCh1MTYgZCkKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCArIDE7CisgICAgc2V0X3N6cF9mbGFnc18xNigodTE2KXJlcyk7CisgICAgY2FsY19jYXJyeV9jaGFpbigxNiwgZCwgMSwgcmVzLCAwKTsKKworICAgIHJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBJTkMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgaW5jX2xvbmcodTMyIGQpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgKyAxOworICAgIHNldF9zenBfZmxhZ3NfMzIocmVzKTsKKyAgICBjYWxjX2NhcnJ5X2NoYWluKDMyLCBkLCAxLCByZXMsIDApOworCisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IG9yX2J5dGUodTggZCwgdTggcykKK3sKKyAgICB1OCByZXM7ICAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCB8IHM7CisgICAgbm9fY2FycnlfYnl0ZV9zaWRlX2VmZihyZXMpOworCisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBvcl93b3JkKHUxNiBkLCB1MTYgcykKK3sKKyAgICB1MTYgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCB8IHM7CisgICAgbm9fY2Fycnlfd29yZF9zaWRlX2VmZihyZXMpOworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgb3JfbG9uZyh1MzIgZCwgdTMyIHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgfCBzOworICAgIG5vX2NhcnJ5X2xvbmdfc2lkZV9lZmYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggbmVnX2J5dGUodTggcykKK3sKKyAgICB1OCByZXM7CisKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzICE9IDAsIEZfQ0YpOworICAgIHJlcyA9ICh1OCktczsKKyAgICBzZXRfc3pwX2ZsYWdzXzgocmVzKTsKKyAgICBjYWxjX2JvcnJvd19jaGFpbig4LCAwLCBzLCByZXMsIDApOworCisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBuZWdfd29yZCh1MTYgcykKK3sKKyAgICB1MTYgcmVzOworCisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcocyAhPSAwLCBGX0NGKTsKKyAgICByZXMgPSAodTE2KS1zOworICAgIHNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworICAgIGNhbGNfYm9ycm93X2NoYWluKDE2LCAwLCBzLCByZXMsIDApOworCisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBuZWdfbG9uZyh1MzIgcykKK3sKKyAgICB1MzIgcmVzOworCisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcocyAhPSAwLCBGX0NGKTsKKyAgICByZXMgPSAodTMyKS1zOworICAgIHNldF9zenBfZmxhZ3NfMzIocmVzKTsKKyAgICBjYWxjX2JvcnJvd19jaGFpbigzMiwgMCwgcywgcmVzLCAwKTsKKworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgTk9UIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggbm90X2J5dGUodTggcykKK3sKKyAgICByZXR1cm4gfnM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgTk9UIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IG5vdF93b3JkKHUxNiBzKQoreworICAgIHJldHVybiB+czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBOT1QgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgbm90X2xvbmcodTMyIHMpCit7CisgICAgcmV0dXJuIH5zOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJDTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHJjbF9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IHJlcywgY250LCBtYXNrLCBjZjsKKworICAgIC8qIHMgaXMgdGhlIHJvdGF0ZSBkaXN0YW5jZS4gIEl0IHZhcmllcyBmcm9tIDAgLSA4LiAqLworICAgIC8qIGhhdmUKKworICAgICAgIENGICBCXzcgQl82IEJfNSBCXzQgQl8zIEJfMiBCXzEgQl8wCisKKyAgICAgICB3YW50IHRvIHJvdGF0ZSB0aHJvdWdoIHRoZSBjYXJyeSBieSAicyIgYml0cy4gIFdlIGNvdWxkCisgICAgICAgbG9vcCwgYnV0IHRoYXQncyBpbmVmZmljaWVudC4gIFNvIHRoZSB3aWR0aCBpcyA5LAorICAgICAgIGFuZCB3ZSBzcGxpdCBpbnRvIHRocmVlIHBhcnRzOgorCisgICAgICAgVGhlIG5ldyBjYXJyeSBmbGFnICAgKHdhcyBCX24pCisgICAgICAgdGhlIHN0dWZmIGluIEJfbi0xIC4uIEJfMAorICAgICAgIHRoZSBzdHVmZiBpbiBCXzcgLi4gQl9uKzEKKworICAgICAgIFRoZSBuZXcgcm90YXRlIGlzIGRvbmUgbW9kIDksIGFuZCBnaXZlbiB0aGlzLAorICAgICAgIGZvciBhIHJvdGF0aW9uIG9mIG4gYml0cyAobW9kIDkpIHRoZSBuZXcgY2FycnkgZmxhZyBpcworICAgICAgIHRoZW4gbG9jYXRlZCBuIGJpdHMgZnJvbSB0aGUgTVNCLiAgVGhlIGxvdyBwYXJ0IGlzCisgICAgICAgdGhlbiBzaGlmdGVkIHVwIGNudCBiaXRzLCBhbmQgdGhlIGhpZ2ggcGFydCBpcyBvcidkCisgICAgICAgaW4uICBVc2luZyBDQVBTIGZvciBuZXcgdmFsdWVzLCBhbmQgbG93ZXJjYXNlIGZvciB0aGUKKyAgICAgICBvcmlnaW5hbCB2YWx1ZXMsIHRoaXMgY2FuIGJlIGV4cHJlc3NlZCBhczoKKworICAgICAgIElGIG4gPiAwCisgICAgICAgMSkgQ0YgPC0JIGJfKDgtbikKKyAgICAgICAyKSBCXyg3KSAuLiBCXyhuKSAgPC0gIGJfKDgtKG4rMSkpIC4uIGJfMAorICAgICAgIDMpIEJfKG4tMSkgPC0gY2YKKyAgICAgICA0KSBCXyhuLTIpIC4uIEJfMCA8LSAgYl83IC4uIGJfKDgtKG4tMSkpCisgICAgICovCisgICAgcmVzID0gZDsKKyAgICBpZiAoKGNudCA9IHMgJSA5KSAhPSAwKSB7CisJLyogZXh0cmFjdCB0aGUgbmV3IENBUlJZIEZMQUcuICovCisJLyogQ0YgPC0gIGJfKDgtbikJICAgICAgKi8KKwljZiA9IChkID4+ICg4IC0gY250KSkgJiAweDE7CisKKwkvKiBnZXQgdGhlIGxvdyBzdHVmZiB3aGljaCByb3RhdGVkCisJICAgaW50byB0aGUgcmFuZ2UgQl83IC4uIEJfY250ICovCisJLyogQl8oNykgLi4gQl8obikgIDwtICBiXyg4LShuKzEpKSAuLiBiXzAgICovCisJLyogbm90ZSB0aGF0IHRoZSByaWdodCBoYW5kIHNpZGUgZG9uZSBieSB0aGUgbWFzayAqLworCXJlcyA9IChkIDw8IGNudCkgJiAweGZmOworCisJLyogbm93IHRoZSBoaWdoIHN0dWZmIHdoaWNoIHJvdGF0ZWQgYXJvdW5kCisJICAgaW50byB0aGUgcG9zaXRpb25zIEJfY250LTIgLi4gQl8wICovCisJLyogQl8obi0yKSAuLiBCXzAgPC0gIGJfNyAuLiBiXyg4LShuLTEpKSAqLworCS8qIHNoaWZ0IGl0IGRvd253YXJkLCA3LShuLTIpID0gOS1uIHBvc2l0aW9ucy4KKwkgICBhbmQgbWFzayBvZmYgdGhlIHJlc3VsdCBiZWZvcmUgb3InaW5nIGluLgorCSAqLworCW1hc2sgPSAoMSA8PCAoY250IC0gMSkpIC0gMTsKKwlyZXMgfD0gKGQgPj4gKDkgLSBjbnQpKSAmIG1hc2s7CisKKwkvKiBpZiB0aGUgY2FycnkgZmxhZyB3YXMgc2V0LCBvciBpdCBpbi4JICovCisJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7ICAgICAvKiBjYXJyeSBmbGFnIGlzIHNldCAqLworCSAgICAvKglCXyhuLTEpIDwtIGNmICovCisJICAgIHJlcyB8PSAxIDw8IChjbnQgLSAxKTsKKwl9CisJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgYmFzZWQgb24gdGhlIHZhcmlhYmxlICJjZiIgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJLyogT1ZFUkZMT1cgaXMgc2V0ICpJRkYqIGNudD09MSwgdGhlbiBpdCBpcyB0aGUKKwkgICB4b3Igb2YgQ0YgYW5kIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4gIEJsZWNjay4gKi8KKwkvKiBwYXJlbnRoZXNpemVkIHRoaXMgZXhwcmVzc2lvbiBzaW5jZSBpdCBhcHBlYXJzIHRvCisJICAgYmUgY2F1c2luZyBPRiB0byBiZSBtaXNzZXQgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhjbnQgPT0gMSAmJiBYT1IyKGNmICsgKChyZXMgPj4gNikgJiAweDIpKSwKKwkJCSAgICAgRl9PRik7CisKKyAgICB9CisgICAgcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUkNMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHJjbF93b3JkKHUxNiBkLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCByZXMsIGNudCwgbWFzaywgY2Y7CisKKyAgICByZXMgPSBkOworICAgIGlmICgoY250ID0gcyAlIDE3KSAhPSAwKSB7CisJY2YgPSAoZCA+PiAoMTYgLSBjbnQpKSAmIDB4MTsKKwlyZXMgPSAoZCA8PCBjbnQpICYgMHhmZmZmOworCW1hc2sgPSAoMSA8PCAoY250IC0gMSkpIC0gMTsKKwlyZXMgfD0gKGQgPj4gKDE3IC0gY250KSkgJiBtYXNrOworCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgeworCSAgICByZXMgfD0gMSA8PCAoY250IC0gMSk7CisJfQorCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhjbnQgPT0gMSAmJiBYT1IyKGNmICsgKChyZXMgPj4gMTQpICYgMHgyKSksCisJCQkgICAgIEZfT0YpOworICAgIH0KKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUkNMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHJjbF9sb25nKHUzMiBkLCB1OCBzKQoreworICAgIHUzMiByZXMsIGNudCwgbWFzaywgY2Y7CisKKyAgICByZXMgPSBkOworICAgIGlmICgoY250ID0gcyAlIDMzKSAhPSAwKSB7CisJY2YgPSAoZCA+PiAoMzIgLSBjbnQpKSAmIDB4MTsKKwlyZXMgPSAoZCA8PCBjbnQpICYgMHhmZmZmZmZmZjsKKwltYXNrID0gKDEgPDwgKGNudCAtIDEpKSAtIDE7CisJcmVzIHw9IChkID4+ICgzMyAtIGNudCkpICYgbWFzazsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsgICAgIC8qIGNhcnJ5IGZsYWcgaXMgc2V0ICovCisJICAgIHJlcyB8PSAxIDw8IChjbnQgLSAxKTsKKwl9CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNudCA9PSAxICYmIFhPUjIoY2YgKyAoKHJlcyA+PiAzMCkgJiAweDIpKSwKKwkJCSAgICAgRl9PRik7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUkNSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggcmNyX2J5dGUodTggZCwgdTggcykKK3sKKyAgICB1MzIgcmVzLCBjbnQ7CisgICAgdTMyIG1hc2ssIGNmLCBvY2YgPSAwOworCisgICAgLyogcm90YXRlIHJpZ2h0IHRocm91Z2ggY2FycnkgKi8KKyAgICAvKgorICAgICAgIHMgaXMgdGhlIHJvdGF0ZSBkaXN0YW5jZS4gIEl0IHZhcmllcyBmcm9tIDAgLSA4LgorICAgICAgIGQgaXMgdGhlIGJ5dGUgb2JqZWN0IHJvdGF0ZWQuCisKKyAgICAgICBoYXZlCisKKyAgICAgICBDRiAgQl83IEJfNiBCXzUgQl80IEJfMyBCXzIgQl8xIEJfMAorCisgICAgICAgVGhlIG5ldyByb3RhdGUgaXMgZG9uZSBtb2QgOSwgYW5kIGdpdmVuIHRoaXMsCisgICAgICAgZm9yIGEgcm90YXRpb24gb2YgbiBiaXRzIChtb2QgOSkgdGhlIG5ldyBjYXJyeSBmbGFnIGlzCisgICAgICAgdGhlbiBsb2NhdGVkIG4gYml0cyBmcm9tIHRoZSBMU0IuICBUaGUgbG93IHBhcnQgaXMKKyAgICAgICB0aGVuIHNoaWZ0ZWQgdXAgY250IGJpdHMsIGFuZCB0aGUgaGlnaCBwYXJ0IGlzIG9yJ2QKKyAgICAgICBpbi4gIFVzaW5nIENBUFMgZm9yIG5ldyB2YWx1ZXMsIGFuZCBsb3dlcmNhc2UgZm9yIHRoZQorICAgICAgIG9yaWdpbmFsIHZhbHVlcywgdGhpcyBjYW4gYmUgZXhwcmVzc2VkIGFzOgorCisgICAgICAgSUYgbiA+IDAKKyAgICAgICAxKSBDRiA8LQkgYl8obi0xKQorICAgICAgIDIpIEJfKDgtKG4rMSkpIC4uIEJfKDApCTwtICBiXyg3KSAuLiBiXyhuKQorICAgICAgIDMpIEJfKDgtbikgPC0gY2YKKyAgICAgICA0KSBCXyg3KSAuLiBCXyg4LShuLTEpKSA8LSAgYl8obi0yKSAuLiBiXygwKQorICAgICAqLworICAgIHJlcyA9IGQ7CisgICAgaWYgKChjbnQgPSBzICUgOSkgIT0gMCkgeworCS8qIGV4dHJhY3QgdGhlIG5ldyBDQVJSWSBGTEFHLiAqLworCS8qIENGIDwtICBiXyhuLTEpCSAgICAgICAqLworCWlmIChjbnQgPT0gMSkgeworCSAgICBjZiA9IGQgJiAweDE7CisJICAgIC8qIG5vdGUgaGFja2VyeSBoZXJlLiAgQWNjZXNzX2ZsYWcoLi4pIGV2YWx1YXRlcyB0byBlaXRoZXIKKwkgICAgICAgMCBpZiBmbGFnIG5vdCBzZXQKKwkgICAgICAgbm9uLXplcm8gaWYgZmxhZyBpcyBzZXQuCisJICAgICAgIGRvaW5nIGFjY2Vzc19mbGFnKC4uKSAhPSAwIGNhc3RzIHRoYXQgaW50byBlaXRoZXIKKwkgICAgICAgMC4uMSBpbiBhbnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZsYWdzIHJlZ2lzdGVyCisJICAgICAgIChpLmUuIHBhY2tlZCBiaXQgYXJyYXkgb3IgdW5wYWNrZWQuKQorCSAgICAgKi8KKwkgICAgb2NmID0gQUNDRVNTX0ZMQUcoRl9DRikgIT0gMDsKKwl9IGVsc2UKKwkgICAgY2YgPSAoZCA+PiAoY250IC0gMSkpICYgMHgxOworCisJLyogQl8oOC0obisxKSkgLi4gQl8oMCkJIDwtICBiXyg3KSAuLiBiX24gICovCisJLyogbm90ZSB0aGF0IHRoZSByaWdodCBoYW5kIHNpZGUgZG9uZSBieSB0aGUgbWFzaworCSAgIFRoaXMgaXMgZWZmZWN0aXZlbHkgZG9uZSBieSBzaGlmdGluZyB0aGUKKwkgICBvYmplY3QgdG8gdGhlIHJpZ2h0LgkgVGhlIHJlc3VsdCBtdXN0IGJlIG1hc2tlZCwKKwkgICBpbiBjYXNlIHRoZSBvYmplY3QgY2FtZSBpbiBhbmQgd2FzIHRyZWF0ZWQKKwkgICBhcyBhIG5lZ2F0aXZlIG51bWJlci4gIE5lZWRlZD8/PyAqLworCisJbWFzayA9ICgxIDw8ICg4IC0gY250KSkgLSAxOworCXJlcyA9IChkID4+IGNudCkgJiBtYXNrOworCisJLyogbm93IHRoZSBoaWdoIHN0dWZmIHdoaWNoIHJvdGF0ZWQgYXJvdW5kCisJICAgaW50byB0aGUgcG9zaXRpb25zIEJfY250LTIgLi4gQl8wICovCisJLyogQl8oNykgLi4gQl8oOC0obi0xKSkgPC0gIGJfKG4tMikgLi4gYl8oMCkgKi8KKwkvKiBzaGlmdCBpdCBkb3dud2FyZCwgNy0obi0yKSA9IDktbiBwb3NpdGlvbnMuCisJICAgYW5kIG1hc2sgb2ZmIHRoZSByZXN1bHQgYmVmb3JlIG9yJ2luZyBpbi4KKwkgKi8KKwlyZXMgfD0gKGQgPDwgKDkgLSBjbnQpKTsKKworCS8qIGlmIHRoZSBjYXJyeSBmbGFnIHdhcyBzZXQsIG9yIGl0IGluLgkgKi8KKwlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsgICAgIC8qIGNhcnJ5IGZsYWcgaXMgc2V0ICovCisJICAgIC8qCUJfKDgtbikgPC0gY2YgKi8KKwkgICAgcmVzIHw9IDEgPDwgKDggLSBjbnQpOworCX0KKwkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBiYXNlZCBvbiB0aGUgdmFyaWFibGUgImNmIiAqLworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkvKiBPVkVSRkxPVyBpcyBzZXQgKklGRiogY250PT0xLCB0aGVuIGl0IGlzIHRoZQorCSAgIHhvciBvZiBDRiBhbmQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAgQmxlY2NrLiAqLworCS8qIHBhcmVudGhlc2l6ZWQuLi4gKi8KKwlpZiAoY250ID09IDEpIHsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihvY2YgKyAoKGQgPj4gNikgJiAweDIpKSwKKwkJCQkgRl9PRik7CisJfQorICAgIH0KKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBSQ1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgcmNyX3dvcmQodTE2IGQsIHU4IHMpCit7CisgICAgdTMyIHJlcywgY250OworICAgIHUzMiBtYXNrLCBjZiwgb2NmID0gMDsKKworICAgIC8qIHJvdGF0ZSByaWdodCB0aHJvdWdoIGNhcnJ5ICovCisgICAgcmVzID0gZDsKKyAgICBpZiAoKGNudCA9IHMgJSAxNykgIT0gMCkgeworCWlmIChjbnQgPT0gMSkgeworCSAgICBjZiA9IGQgJiAweDE7CisJICAgIG9jZiA9IEFDQ0VTU19GTEFHKEZfQ0YpICE9IDA7CisJfSBlbHNlCisJICAgIGNmID0gKGQgPj4gKGNudCAtIDEpKSAmIDB4MTsKKwltYXNrID0gKDEgPDwgKDE2IC0gY250KSkgLSAxOworCXJlcyA9IChkID4+IGNudCkgJiBtYXNrOworCXJlcyB8PSAoZCA8PCAoMTcgLSBjbnQpKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsKKwkgICAgcmVzIHw9IDEgPDwgKDE2IC0gY250KTsKKwl9CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCWlmIChjbnQgPT0gMSkgeworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKG9jZiArICgoZCA+PiAxNCkgJiAweDIpKSwKKwkJCQkgRl9PRik7CisJfQorICAgIH0KKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUkNSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHJjcl9sb25nKHUzMiBkLCB1OCBzKQoreworICAgIHUzMiByZXMsIGNudDsKKyAgICB1MzIgbWFzaywgY2YsIG9jZiA9IDA7CisKKyAgICAvKiByb3RhdGUgcmlnaHQgdGhyb3VnaCBjYXJyeSAqLworICAgIHJlcyA9IGQ7CisgICAgaWYgKChjbnQgPSBzICUgMzMpICE9IDApIHsKKwlpZiAoY250ID09IDEpIHsKKwkgICAgY2YgPSBkICYgMHgxOworCSAgICBvY2YgPSBBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwOworCX0gZWxzZQorCSAgICBjZiA9IChkID4+IChjbnQgLSAxKSkgJiAweDE7CisJbWFzayA9ICgxIDw8ICgzMiAtIGNudCkpIC0gMTsKKwlyZXMgPSAoZCA+PiBjbnQpICYgbWFzazsKKwlpZiAoY250ICE9IDEpCisJICAgIHJlcyB8PSAoZCA8PCAoMzMgLSBjbnQpKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsgICAgIC8qIGNhcnJ5IGZsYWcgaXMgc2V0ICovCisJICAgIHJlcyB8PSAxIDw8ICgzMiAtIGNudCk7CisJfQorCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwlpZiAoY250ID09IDEpIHsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihvY2YgKyAoKGQgPj4gMzApICYgMHgyKSksCisJCQkJIEZfT0YpOworCX0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBST0wgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCByb2xfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCByZXMsIGNudCwgbWFzazsKKworICAgIC8qIHJvdGF0ZSBsZWZ0ICovCisgICAgLyoKKyAgICAgICBzIGlzIHRoZSByb3RhdGUgZGlzdGFuY2UuICBJdCB2YXJpZXMgZnJvbSAwIC0gOC4KKyAgICAgICBkIGlzIHRoZSBieXRlIG9iamVjdCByb3RhdGVkLgorCisgICAgICAgaGF2ZQorCisgICAgICAgQ0YgIEJfNyAuLi4gQl8wCisKKyAgICAgICBUaGUgbmV3IHJvdGF0ZSBpcyBkb25lIG1vZCA4LgorICAgICAgIE11Y2ggc2ltcGxlciB0aGFuIHRoZSAicmNsIiBvciAicmNyIiBvcGVyYXRpb25zLgorCisgICAgICAgSUYgbiA+IDAKKyAgICAgICAxKSBCXyg3KSAuLiBCXyhuKSAgPC0gIGJfKDgtKG4rMSkpIC4uIGJfKDApCisgICAgICAgMikgQl8obi0xKSAuLiBCXygwKSA8LSAgYl8oNykgLi4gYl8oOC1uKQorICAgICAqLworICAgIHJlcyA9IGQ7CisgICAgaWYgKChjbnQgPSBzICUgOCkgIT0gMCkgeworCS8qIEJfKDcpIC4uIEJfKG4pICA8LSAgYl8oOC0obisxKSkgLi4gYl8oMCkgKi8KKwlyZXMgPSAoZCA8PCBjbnQpOworCisJLyogQl8obi0xKSAuLiBCXygwKSA8LQliXyg3KSAuLiBiXyg4LW4pICovCisJbWFzayA9ICgxIDw8IGNudCkgLSAxOworCXJlcyB8PSAoZCA+PiAoOCAtIGNudCkpICYgbWFzazsKKworCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCisJICAgYml0IG9mIHRoZSByZXN1bHQhISEJCQkJICAgICAgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOworCS8qIE9WRVJGTE9XIGlzIHNldCAqSUZGKiBzPT0xLCB0aGVuIGl0IGlzIHRoZQorCSAgIHhvciBvZiBDRiBhbmQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAgQmxlY2NrLiAqLworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgPT0gMSAmJgorCQkJICAgICBYT1IyKChyZXMgJiAweDEpICsgKChyZXMgPj4gNikgJiAweDIpKSwKKwkJCSAgICAgRl9PRik7CisgICAgfSBpZiAocyAhPSAwKSB7CisJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKKwkgICBiaXQgb2YgdGhlIHJlc3VsdCEhIQkJCQkgICAgICAqLworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MSwgRl9DRik7CisgICAgfQorICAgIHJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJPTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiByb2xfd29yZCh1MTYgZCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmVzLCBjbnQsIG1hc2s7CisKKyAgICByZXMgPSBkOworICAgIGlmICgoY250ID0gcyAlIDE2KSAhPSAwKSB7CisJcmVzID0gKGQgPDwgY250KTsKKwltYXNrID0gKDEgPDwgY250KSAtIDE7CisJcmVzIHw9IChkID4+ICgxNiAtIGNudCkpICYgbWFzazsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgPT0gMSAmJgorCQkJICAgICBYT1IyKChyZXMgJiAweDEpICsgKChyZXMgPj4gMTQpICYgMHgyKSksCisJCQkgICAgIEZfT0YpOworICAgIH0gaWYgKHMgIT0gMCkgeworCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCisJICAgYml0IG9mIHRoZSByZXN1bHQhISEJCQkJICAgICAgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOworICAgIH0KKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUk9MIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHJvbF9sb25nKHUzMiBkLCB1OCBzKQoreworICAgIHUzMiByZXMsIGNudCwgbWFzazsKKworICAgIHJlcyA9IGQ7CisgICAgaWYgKChjbnQgPSBzICUgMzIpICE9IDApIHsKKwlyZXMgPSAoZCA8PCBjbnQpOworCW1hc2sgPSAoMSA8PCBjbnQpIC0gMTsKKwlyZXMgfD0gKGQgPj4gKDMyIC0gY250KSkgJiBtYXNrOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MSwgRl9DRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocyA9PSAxICYmCisJCQkgICAgIFhPUjIoKHJlcyAmIDB4MSkgKyAoKHJlcyA+PiAzMCkgJiAweDIpKSwKKwkJCSAgICAgRl9PRik7CisgICAgfSBpZiAocyAhPSAwKSB7CisJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKKwkgICBiaXQgb2YgdGhlIHJlc3VsdCEhIQkJCQkgICAgICAqLworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MSwgRl9DRik7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUk9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggcm9yX2J5dGUodTggZCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmVzLCBjbnQsIG1hc2s7CisKKyAgICAvKiByb3RhdGUgcmlnaHQgKi8KKyAgICAvKgorICAgICAgIHMgaXMgdGhlIHJvdGF0ZSBkaXN0YW5jZS4gIEl0IHZhcmllcyBmcm9tIDAgLSA4LgorICAgICAgIGQgaXMgdGhlIGJ5dGUgb2JqZWN0IHJvdGF0ZWQuCisKKyAgICAgICBoYXZlCisKKyAgICAgICBCXzcgLi4uIEJfMAorCisgICAgICAgVGhlIHJvdGF0ZSBpcyBkb25lIG1vZCA4LgorCisgICAgICAgSUYgbiA+IDAKKyAgICAgICAxKSBCXyg4LShuKzEpKSAuLiBCXygwKQk8LSAgYl8oNykgLi4gYl8obikKKyAgICAgICAyKSBCXyg3KSAuLiBCXyg4LW4pIDwtICBiXyhuLTEpIC4uIGJfKDApCisgICAgICovCisgICAgcmVzID0gZDsKKyAgICBpZiAoKGNudCA9IHMgJSA4KSAhPSAwKSB7CQkvKiBub3QgYSB0eXBvLCBkbyBuYWRhIGlmIGNudD09MCAqLworCS8qIEJfKDcpIC4uIEJfKDgtbikgPC0JYl8obi0xKSAuLiBiXygwKSAqLworCXJlcyA9IChkIDw8ICg4IC0gY250KSk7CisKKwkvKiBCXyg4LShuKzEpKSAuLiBCXygwKQkgPC0gIGJfKDcpIC4uIGJfKG4pICovCisJbWFzayA9ICgxIDw8ICg4IC0gY250KSkgLSAxOworCXJlcyB8PSAoZCA+PiAoY250KSkgJiBtYXNrOworCisJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKKwkgICBiaXQgb2YgdGhlIHJlc3VsdCEhIQkJCQkgICAgICAqLworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfQ0YpOworCS8qIE9WRVJGTE9XIGlzIHNldCAqSUZGKiBzPT0xLCB0aGVuIGl0IGlzIHRoZQorCSAgIHhvciBvZiB0aGUgdHdvIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4gIEJsZWNjay4gKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYgWE9SMihyZXMgPj4gNiksIEZfT0YpOworICAgIH0gZWxzZSBpZiAocyAhPSAwKSB7CisJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKKwkgICBiaXQgb2YgdGhlIHJlc3VsdCEhIQkJCQkgICAgICAqLworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfQ0YpOworICAgIH0KKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBST1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgcm9yX3dvcmQodTE2IGQsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IHJlcywgY250LCBtYXNrOworCisgICAgcmVzID0gZDsKKyAgICBpZiAoKGNudCA9IHMgJSAxNikgIT0gMCkgeworCXJlcyA9IChkIDw8ICgxNiAtIGNudCkpOworCW1hc2sgPSAoMSA8PCAoMTYgLSBjbnQpKSAtIDE7CisJcmVzIHw9IChkID4+IChjbnQpKSAmIG1hc2s7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX0NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYgWE9SMihyZXMgPj4gMTQpLCBGX09GKTsKKyAgICB9IGVsc2UgaWYgKHMgIT0gMCkgeworCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCisJICAgYml0IG9mIHRoZSByZXN1bHQhISEJCQkJICAgICAgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfQ0YpOworICAgIH0KKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUk9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHJvcl9sb25nKHUzMiBkLCB1OCBzKQoreworICAgIHUzMiByZXMsIGNudCwgbWFzazsKKworICAgIHJlcyA9IGQ7CisgICAgaWYgKChjbnQgPSBzICUgMzIpICE9IDApIHsKKwlyZXMgPSAoZCA8PCAoMzIgLSBjbnQpKTsKKwltYXNrID0gKDEgPDwgKDMyIC0gY250KSkgLSAxOworCXJlcyB8PSAoZCA+PiAoY250KSkgJiBtYXNrOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfQ0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgPT0gMSAmJiBYT1IyKHJlcyA+PiAzMCksIEZfT0YpOworICAgIH0gZWxzZSBpZiAocyAhPSAwKSB7CisJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKKwkgICBiaXQgb2YgdGhlIHJlc3VsdCEhIQkJCQkgICAgICAqLworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfQ0YpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNITCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHNobF9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKKworICAgIGlmIChzIDwgOCkgeworCWNudCA9IHMgJSA4OworCisJLyogbGFzdCBiaXQgc2hpZnRlZCBvdXQgZ29lcyBpbnRvIGNhcnJ5IGZsYWcgKi8KKwlpZiAoY250ID4gMCkgeworCSAgICByZXMgPSBkIDw8IGNudDsKKwkgICAgY2YgPSBkICYgKDEgPDwgKDggLSBjbnQpKTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCSAgICBzZXRfc3pwX2ZsYWdzXzgoKHU4KXJlcyk7CisJfSBlbHNlIHsKKwkgICAgcmVzID0gKHU4KSBkOworCX0KKworCWlmIChjbnQgPT0gMSkgeworCSAgICAvKiBOZWVkcyBzaW1wbGlmaWNhdGlvbi4gKi8KKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoCisJCQkJICAgICgoKHJlcyAmIDB4ODApID09IDB4ODApIF4KKwkJCQkgICAgIChBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwKSksCisJICAgIC8qIHdhcyAoTS54ODYuUl9GTEcmRl9DRik9PUZfQ0YpKSwgKi8KKwkJCQkgICAgRl9PRik7CisJfSBlbHNlIHsKKwkgICAgQ0xFQVJfRkxBRyhGX09GKTsKKwl9CisgICAgfSBlbHNlIHsKKwlyZXMgPSAwOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKChkIDw8IChzLTEpKSAmIDB4ODAsIEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisJQ0xFQVJfRkxBRyhGX1NGKTsKKwlTRVRfRkxBRyhGX1BGKTsKKwlTRVRfRkxBRyhGX1pGKTsKKyAgICB9CisgICAgcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0hMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHNobF93b3JkKHUxNiBkLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7CisKKyAgICBpZiAocyA8IDE2KSB7CisJY250ID0gcyAlIDE2OworCWlmIChjbnQgPiAwKSB7CisJICAgIHJlcyA9IGQgPDwgY250OworCSAgICBjZiA9IGQgJiAoMSA8PCAoMTYgLSBjbnQpKTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCSAgICBzZXRfc3pwX2ZsYWdzXzE2KCh1MTYpcmVzKTsKKwl9IGVsc2UgeworCSAgICByZXMgPSAodTE2KSBkOworCX0KKworCWlmIChjbnQgPT0gMSkgeworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygKKwkJCQkgICAgKCgocmVzICYgMHg4MDAwKSA9PSAweDgwMDApIF4KKwkJCQkgICAgIChBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwKSksCisJCQkJICAgIEZfT0YpOworCX0gZWxzZSB7CisJICAgIENMRUFSX0ZMQUcoRl9PRik7CisJfQorICAgIH0gZWxzZSB7CisJcmVzID0gMDsKKwlDT05ESVRJT05BTF9TRVRfRkxBRygoZCA8PCAocy0xKSkgJiAweDgwMDAsIEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisJQ0xFQVJfRkxBRyhGX1NGKTsKKwlTRVRfRkxBRyhGX1BGKTsKKwlTRVRfRkxBRyhGX1pGKTsKKyAgICB9CisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNITCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBzaGxfbG9uZyh1MzIgZCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOworCisgICAgaWYgKHMgPCAzMikgeworCWNudCA9IHMgJSAzMjsKKwlpZiAoY250ID4gMCkgeworCSAgICByZXMgPSBkIDw8IGNudDsKKwkgICAgY2YgPSBkICYgKDEgPDwgKDMyIC0gY250KSk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkgICAgc2V0X3N6cF9mbGFnc18zMigodTMyKXJlcyk7CisJfSBlbHNlIHsKKwkgICAgcmVzID0gZDsKKwl9CisJaWYgKGNudCA9PSAxKSB7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCgoKHJlcyAmIDB4ODAwMDAwMDApID09IDB4ODAwMDAwMDApIF4KKwkJCQkgIChBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwKSksIEZfT0YpOworCX0gZWxzZSB7CisJICAgIENMRUFSX0ZMQUcoRl9PRik7CisJfQorICAgIH0gZWxzZSB7CisJcmVzID0gMDsKKwlDT05ESVRJT05BTF9TRVRfRkxBRygoZCA8PCAocy0xKSkgJiAweDgwMDAwMDAwLCBGX0NGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworCUNMRUFSX0ZMQUcoRl9TRik7CisJU0VUX0ZMQUcoRl9QRik7CisJU0VUX0ZMQUcoRl9aRik7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0hSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggc2hyX2J5dGUodTggZCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOworCisgICAgaWYgKHMgPCA4KSB7CisJY250ID0gcyAlIDg7CisJaWYgKGNudCA+IDApIHsKKwkgICAgY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKKwkgICAgcmVzID0gZCA+PiBjbnQ7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkgICAgc2V0X3N6cF9mbGFnc184KCh1OClyZXMpOworCX0gZWxzZSB7CisJICAgIHJlcyA9ICh1OCkgZDsKKwl9CisKKwlpZiAoY250ID09IDEpIHsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihyZXMgPj4gNiksIEZfT0YpOworCX0gZWxzZSB7CisJICAgIENMRUFSX0ZMQUcoRl9PRik7CisJfQorICAgIH0gZWxzZSB7CisJcmVzID0gMDsKKwlDT05ESVRJT05BTF9TRVRfRkxBRygoZCA+PiAocy0xKSkgJiAweDEsIEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisJQ0xFQVJfRkxBRyhGX1NGKTsKKwlTRVRfRkxBRyhGX1BGKTsKKwlTRVRfRkxBRyhGX1pGKTsKKyAgICB9CisgICAgcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0hSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHNocl93b3JkKHUxNiBkLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7CisKKyAgICBpZiAocyA8IDE2KSB7CisJY250ID0gcyAlIDE2OworCWlmIChjbnQgPiAwKSB7CisJICAgIGNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7CisJICAgIHJlcyA9IGQgPj4gY250OworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJICAgIHNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworCX0gZWxzZSB7CisJICAgIHJlcyA9IGQ7CisJfQorCisJaWYgKGNudCA9PSAxKSB7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIocmVzID4+IDE0KSwgRl9PRik7CisJfSBlbHNlIHsKKwkgICAgQ0xFQVJfRkxBRyhGX09GKTsKKwl9CisgICAgfSBlbHNlIHsKKwlyZXMgPSAwOworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKwlTRVRfRkxBRyhGX1pGKTsKKwlDTEVBUl9GTEFHKEZfU0YpOworCUNMRUFSX0ZMQUcoRl9QRik7CisgICAgfQorICAgIHJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTSFIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgc2hyX2xvbmcodTMyIGQsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKKworICAgIGlmIChzIDwgMzIpIHsKKwljbnQgPSBzICUgMzI7CisJaWYgKGNudCA+IDApIHsKKwkgICAgY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKKwkgICAgcmVzID0gZCA+PiBjbnQ7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkgICAgc2V0X3N6cF9mbGFnc18zMigodTMyKXJlcyk7CisJfSBlbHNlIHsKKwkgICAgcmVzID0gZDsKKwl9CisJaWYgKGNudCA9PSAxKSB7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIocmVzID4+IDMwKSwgRl9PRik7CisJfSBlbHNlIHsKKwkgICAgQ0xFQVJfRkxBRyhGX09GKTsKKwl9CisgICAgfSBlbHNlIHsKKwlyZXMgPSAwOworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKwlTRVRfRkxBRyhGX1pGKTsKKwlDTEVBUl9GTEFHKEZfU0YpOworCUNMRUFSX0ZMQUcoRl9QRik7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0FSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggc2FyX2J5dGUodTggZCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmLCBtYXNrLCBzZjsKKworICAgIHJlcyA9IGQ7CisgICAgc2YgPSBkICYgMHg4MDsKKyAgICBjbnQgPSBzICUgODsKKyAgICBpZiAoY250ID4gMCAmJiBjbnQgPCA4KSB7CisJbWFzayA9ICgxIDw8ICg4IC0gY250KSkgLSAxOworCWNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7CisJcmVzID0gKGQgPj4gY250KSAmIG1hc2s7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCWlmIChzZikgeworCSAgICByZXMgfD0gfm1hc2s7CisJfQorCXNldF9zenBfZmxhZ3NfOCgodTgpcmVzKTsKKyAgICB9IGVsc2UgaWYgKGNudCA+PSA4KSB7CisJaWYgKHNmKSB7CisJICAgIHJlcyA9IDB4ZmY7CisJICAgIFNFVF9GTEFHKEZfQ0YpOworCSAgICBDTEVBUl9GTEFHKEZfWkYpOworCSAgICBTRVRfRkxBRyhGX1NGKTsKKwkgICAgU0VUX0ZMQUcoRl9QRik7CisJfSBlbHNlIHsKKwkgICAgcmVzID0gMDsKKwkgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKwkgICAgU0VUX0ZMQUcoRl9aRik7CisJICAgIENMRUFSX0ZMQUcoRl9TRik7CisJICAgIENMRUFSX0ZMQUcoRl9QRik7CisJfQorICAgIH0KKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTQVIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgc2FyX3dvcmQodTE2IGQsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZiwgbWFzaywgc2Y7CisKKyAgICBzZiA9IGQgJiAweDgwMDA7CisgICAgY250ID0gcyAlIDE2OworICAgIHJlcyA9IGQ7CisgICAgaWYgKGNudCA+IDAgJiYgY250IDwgMTYpIHsKKwltYXNrID0gKDEgPDwgKDE2IC0gY250KSkgLSAxOworCWNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7CisJcmVzID0gKGQgPj4gY250KSAmIG1hc2s7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCWlmIChzZikgeworCSAgICByZXMgfD0gfm1hc2s7CisJfQorCXNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworICAgIH0gZWxzZSBpZiAoY250ID49IDE2KSB7CisJaWYgKHNmKSB7CisJICAgIHJlcyA9IDB4ZmZmZjsKKwkgICAgU0VUX0ZMQUcoRl9DRik7CisJICAgIENMRUFSX0ZMQUcoRl9aRik7CisJICAgIFNFVF9GTEFHKEZfU0YpOworCSAgICBTRVRfRkxBRyhGX1BGKTsKKwl9IGVsc2UgeworCSAgICByZXMgPSAwOworCSAgICBDTEVBUl9GTEFHKEZfQ0YpOworCSAgICBTRVRfRkxBRyhGX1pGKTsKKwkgICAgQ0xFQVJfRkxBRyhGX1NGKTsKKwkgICAgQ0xFQVJfRkxBRyhGX1BGKTsKKwl9CisgICAgfQorICAgIHJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTQVIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgc2FyX2xvbmcodTMyIGQsIHU4IHMpCit7CisgICAgdTMyIGNudCwgcmVzLCBjZiwgbWFzaywgc2Y7CisKKyAgICBzZiA9IGQgJiAweDgwMDAwMDAwOworICAgIGNudCA9IHMgJSAzMjsKKyAgICByZXMgPSBkOworICAgIGlmIChjbnQgPiAwICYmIGNudCA8IDMyKSB7CisJbWFzayA9ICgxIDw8ICgzMiAtIGNudCkpIC0gMTsKKwljZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOworCXJlcyA9IChkID4+IGNudCkgJiBtYXNrOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwlpZiAoc2YpIHsKKwkgICAgcmVzIHw9IH5tYXNrOworCX0KKwlzZXRfc3pwX2ZsYWdzXzMyKHJlcyk7CisgICAgfSBlbHNlIGlmIChjbnQgPj0gMzIpIHsKKwlpZiAoc2YpIHsKKwkgICAgcmVzID0gMHhmZmZmZmZmZjsKKwkgICAgU0VUX0ZMQUcoRl9DRik7CisJICAgIENMRUFSX0ZMQUcoRl9aRik7CisJICAgIFNFVF9GTEFHKEZfU0YpOworCSAgICBTRVRfRkxBRyhGX1BGKTsKKwl9IGVsc2UgeworCSAgICByZXMgPSAwOworCSAgICBDTEVBUl9GTEFHKEZfQ0YpOworCSAgICBTRVRfRkxBRyhGX1pGKTsKKwkgICAgQ0xFQVJfRkxBRyhGX1NGKTsKKwkgICAgQ0xFQVJfRkxBRyhGX1BGKTsKKwl9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0hMRCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBzaGxkX3dvcmQgKHUxNiBkLCB1MTYgZmlsbCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOworCisgICAgaWYgKHMgPCAxNikgeworCWNudCA9IHMgJSAxNjsKKwlpZiAoY250ID4gMCkgeworCSAgICByZXMgPSAoZCA8PCBjbnQpIHwgKGZpbGwgPj4gKDE2LWNudCkpOworCSAgICBjZiA9IGQgJiAoMSA8PCAoMTYgLSBjbnQpKTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCSAgICBzZXRfc3pwX2ZsYWdzXzE2KCh1MTYpcmVzKTsKKwl9IGVsc2UgeworCSAgICByZXMgPSBkOworCX0KKwlpZiAoY250ID09IDEpIHsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKCgocmVzICYgMHg4MDAwKSA9PSAweDgwMDApIF4KKwkJCQkgIChBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwKSksIEZfT0YpOworCX0gZWxzZSB7CisJICAgIENMRUFSX0ZMQUcoRl9PRik7CisJfQorICAgIH0gZWxzZSB7CisJcmVzID0gMDsKKwlDT05ESVRJT05BTF9TRVRfRkxBRygoZCA8PCAocy0xKSkgJiAweDgwMDAsIEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisJQ0xFQVJfRkxBRyhGX1NGKTsKKwlTRVRfRkxBRyhGX1BGKTsKKwlTRVRfRkxBRyhGX1pGKTsKKyAgICB9CisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNITEQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgc2hsZF9sb25nICh1MzIgZCwgdTMyIGZpbGwsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKKworICAgIGlmIChzIDwgMzIpIHsKKwljbnQgPSBzICUgMzI7CisJaWYgKGNudCA+IDApIHsKKwkgICAgcmVzID0gKGQgPDwgY250KSB8IChmaWxsID4+ICgzMi1jbnQpKTsKKwkgICAgY2YgPSBkICYgKDEgPDwgKDMyIC0gY250KSk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkgICAgc2V0X3N6cF9mbGFnc18zMigodTMyKXJlcyk7CisJfSBlbHNlIHsKKwkgICAgcmVzID0gZDsKKwl9CisJaWYgKGNudCA9PSAxKSB7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCgoKHJlcyAmIDB4ODAwMDAwMDApID09IDB4ODAwMDAwMDApIF4KKwkJCQkgIChBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwKSksIEZfT0YpOworCX0gZWxzZSB7CisJICAgIENMRUFSX0ZMQUcoRl9PRik7CisJfQorICAgIH0gZWxzZSB7CisJcmVzID0gMDsKKwlDT05ESVRJT05BTF9TRVRfRkxBRygoZCA8PCAocy0xKSkgJiAweDgwMDAwMDAwLCBGX0NGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworCUNMRUFSX0ZMQUcoRl9TRik7CisJU0VUX0ZMQUcoRl9QRik7CisJU0VUX0ZMQUcoRl9aRik7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0hSRCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBzaHJkX3dvcmQgKHUxNiBkLCB1MTYgZmlsbCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOworCisgICAgaWYgKHMgPCAxNikgeworCWNudCA9IHMgJSAxNjsKKwlpZiAoY250ID4gMCkgeworCSAgICBjZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOworCSAgICByZXMgPSAoZCA+PiBjbnQpIHwgKGZpbGwgPDwgKDE2IC0gY250KSk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkgICAgc2V0X3N6cF9mbGFnc18xNigodTE2KXJlcyk7CisJfSBlbHNlIHsKKwkgICAgcmVzID0gZDsKKwl9CisKKwlpZiAoY250ID09IDEpIHsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihyZXMgPj4gMTQpLCBGX09GKTsKKwl9IGVsc2UgeworCSAgICBDTEVBUl9GTEFHKEZfT0YpOworCX0KKyAgICB9IGVsc2UgeworCXJlcyA9IDA7CisJQ0xFQVJfRkxBRyhGX0NGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworCVNFVF9GTEFHKEZfWkYpOworCUNMRUFSX0ZMQUcoRl9TRik7CisJQ0xFQVJfRkxBRyhGX1BGKTsKKyAgICB9CisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNIUkQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgc2hyZF9sb25nICh1MzIgZCwgdTMyIGZpbGwsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKKworICAgIGlmIChzIDwgMzIpIHsKKwljbnQgPSBzICUgMzI7CisJaWYgKGNudCA+IDApIHsKKwkgICAgY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKKwkgICAgcmVzID0gKGQgPj4gY250KSB8IChmaWxsIDw8ICgzMiAtIGNudCkpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJICAgIHNldF9zenBfZmxhZ3NfMzIoKHUzMilyZXMpOworCX0gZWxzZSB7CisJICAgIHJlcyA9IGQ7CisJfQorCWlmIChjbnQgPT0gMSkgeworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKHJlcyA+PiAzMCksIEZfT0YpOworCX0gZWxzZSB7CisJICAgIENMRUFSX0ZMQUcoRl9PRik7CisJfQorICAgIH0gZWxzZSB7CisJcmVzID0gMDsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisJU0VUX0ZMQUcoRl9aRik7CisJQ0xFQVJfRkxBRyhGX1NGKTsKKwlDTEVBUl9GTEFHKEZfUEYpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNCQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHNiYl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKyAgICB1MzIgYmM7CisKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCisJcmVzID0gZCAtIHMgLSAxOworICAgIGVsc2UKKwlyZXMgPSBkIC0gczsKKyAgICBzZXRfc3pwX2ZsYWdzXzgoKHU4KXJlcyk7CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLworICAgIGJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MCwgRl9DRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiA2KSwgRl9PRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworICAgIHJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNCQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBzYmJfd29yZCh1MTYgZCwgdTE2IHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKyAgICB1MzIgYmM7CisKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCisJcmVzID0gZCAtIHMgLSAxOworICAgIGVsc2UKKwlyZXMgPSBkIC0gczsKKyAgICBzZXRfc3pwX2ZsYWdzXzE2KCh1MTYpcmVzKTsKKworICAgIC8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCisgICAgYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwMDAsIEZfQ0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gMTQpLCBGX09GKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7CisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNCQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBzYmJfbG9uZyh1MzIgZCwgdTMyIHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKyAgICB1MzIgYmM7CisKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCisJcmVzID0gZCAtIHMgLSAxOworICAgIGVsc2UKKwlyZXMgPSBkIC0gczsKKworICAgIHNldF9zenBfZmxhZ3NfMzIocmVzKTsKKworICAgIC8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCisgICAgYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwMDAwMDAwLCBGX0NGKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDMwKSwgRl9PRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU1VCIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggc3ViX2J5dGUodTggZCwgdTggcykKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworICAgIHUzMiBiYzsKKworICAgIHJlcyA9IGQgLSBzOworICAgIHNldF9zenBfZmxhZ3NfOCgodTgpcmVzKTsKKworICAgIC8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCisgICAgYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwLCBGX0NGKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDYpLCBGX09GKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7CisgICAgcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU1VCIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHN1Yl93b3JkKHUxNiBkLCB1MTYgcykKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworICAgIHUzMiBiYzsKKworICAgIHJlcyA9IGQgLSBzOworICAgIHNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworCisgICAgLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KKyAgICBiYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAwMCwgRl9DRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAxNCksIEZfT0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU1VCIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHN1Yl9sb25nKHUzMiBkLCB1MzIgcykKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworICAgIHUzMiBiYzsKKworICAgIHJlcyA9IGQgLSBzOworICAgIHNldF9zenBfZmxhZ3NfMzIocmVzKTsKKworICAgIC8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCisgICAgYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwMDAwMDAwLCBGX0NGKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDMwKSwgRl9PRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgVEVTVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdGVzdF9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgJiBzOworCisgICAgQ0xFQVJfRkxBRyhGX09GKTsKKyAgICBzZXRfc3pwX2ZsYWdzXzgoKHU4KXJlcyk7CisgICAgLyogQUYgPT0gZG9udCBjYXJlICovCisgICAgQ0xFQVJfRkxBRyhGX0NGKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBURVNUIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0ZXN0X3dvcmQodTE2IGQsIHUxNiBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICYgczsKKworICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgc2V0X3N6cF9mbGFnc18xNigodTE2KXJlcyk7CisgICAgLyogQUYgPT0gZG9udCBjYXJlICovCisgICAgQ0xFQVJfRkxBRyhGX0NGKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBURVNUIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0ZXN0X2xvbmcodTMyIGQsIHUzMiBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICYgczsKKworICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgc2V0X3N6cF9mbGFnc18zMihyZXMpOworICAgIC8qIEFGID09IGRvbnQgY2FyZSAqLworICAgIENMRUFSX0ZMQUcoRl9DRik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgWE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggeG9yX2J5dGUodTggZCwgdTggcykKK3sKKyAgICB1OCByZXM7ICAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCBeIHM7CisgICAgbm9fY2FycnlfYnl0ZV9zaWRlX2VmZihyZXMpOworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgWE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHhvcl93b3JkKHUxNiBkLCB1MTYgcykKK3sKKyAgICB1MTYgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCBeIHM7CisgICAgbm9fY2Fycnlfd29yZF9zaWRlX2VmZihyZXMpOworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgWE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHhvcl9sb25nKHUzMiBkLCB1MzIgcykKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCBeIHM7CisgICAgbm9fY2FycnlfbG9uZ19zaWRlX2VmZihyZXMpOworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgSU1VTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW11bF9ieXRlKHU4IHMpCit7CisgICAgczE2IHJlcyA9IChzMTYpKChzOClNLng4Ni5SX0FMICogKHM4KXMpOworCisgICAgTS54ODYuUl9BWCA9IHJlczsKKyAgICBpZiAoKChNLng4Ni5SX0FMICYgMHg4MCkgPT0gMCAmJiBNLng4Ni5SX0FIID09IDB4MDApIHx8CisJKChNLng4Ni5SX0FMICYgMHg4MCkgIT0gMCAmJiBNLng4Ni5SX0FIID09IDB4RkYpKSB7CisJQ0xFQVJfRkxBRyhGX0NGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworICAgIH0gZWxzZSB7CisJU0VUX0ZMQUcoRl9DRik7CisJU0VUX0ZMQUcoRl9PRik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIElNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGltdWxfd29yZCh1MTYgcykKK3sKKyAgICBzMzIgcmVzID0gKHMxNilNLng4Ni5SX0FYICogKHMxNilzOworCisgICAgTS54ODYuUl9BWCA9ICh1MTYpcmVzOworICAgIE0ueDg2LlJfRFggPSAodTE2KShyZXMgPj4gMTYpOworICAgIGlmICgoKE0ueDg2LlJfQVggJiAweDgwMDApID09IDAgJiYgTS54ODYuUl9EWCA9PSAweDAwMDApIHx8CisJKChNLng4Ni5SX0FYICYgMHg4MDAwKSAhPSAwICYmIE0ueDg2LlJfRFggPT0gMHhGRkZGKSkgeworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKyAgICB9IGVsc2UgeworCVNFVF9GTEFHKEZfQ0YpOworCVNFVF9GTEFHKEZfT0YpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBJTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpbXVsX2xvbmdfZGlyZWN0KHUzMiAqcmVzX2xvLCB1MzIqIHJlc19oaSx1MzIgZCwgdTMyIHMpCit7CisjaWZkZWYJX19IQVNfTE9OR19MT05HX18KKyAgICBzNjQgcmVzID0gKHMzMilkICogKHMzMilzOworCisgICAgKnJlc19sbyA9ICh1MzIpcmVzOworICAgICpyZXNfaGkgPSAodTMyKShyZXMgPj4gMzIpOworI2Vsc2UKKyAgICB1MzIgZF9sbyxkX2hpLGRfc2lnbjsKKyAgICB1MzIgc19sbyxzX2hpLHNfc2lnbjsKKyAgICB1MzIgcmxvX2xvLHJsb19oaSxyaGlfbG87CisKKyAgICBpZiAoKGRfc2lnbiA9IGQgJiAweDgwMDAwMDAwKSAhPSAwKQorCWQgPSAtZDsKKyAgICBkX2xvID0gZCAmIDB4RkZGRjsKKyAgICBkX2hpID0gZCA+PiAxNjsKKyAgICBpZiAoKHNfc2lnbiA9IHMgJiAweDgwMDAwMDAwKSAhPSAwKQorCXMgPSAtczsKKyAgICBzX2xvID0gcyAmIDB4RkZGRjsKKyAgICBzX2hpID0gcyA+PiAxNjsKKyAgICBybG9fbG8gPSBkX2xvICogc19sbzsKKyAgICBybG9faGkgPSAoZF9oaSAqIHNfbG8gKyBkX2xvICogc19oaSkgKyAocmxvX2xvID4+IDE2KTsKKyAgICByaGlfbG8gPSBkX2hpICogc19oaSArIChybG9faGkgPj4gMTYpOworICAgICpyZXNfbG8gPSAocmxvX2hpIDw8IDE2KSB8IChybG9fbG8gJiAweEZGRkYpOworICAgICpyZXNfaGkgPSByaGlfbG87CisgICAgaWYgKGRfc2lnbiAhPSBzX3NpZ24pIHsKKwlkID0gfipyZXNfbG87CisJcyA9ICgoKGQgJiAweEZGRkYpICsgMSkgPj4gMTYpICsgKGQgPj4gMTYpOworCSpyZXNfbG8gPSB+KnJlc19sbysxOworCSpyZXNfaGkgPSB+KnJlc19oaSsocyA+PiAxNik7CisJfQorI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgSU1VTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW11bF9sb25nKHUzMiBzKQoreworICAgIGltdWxfbG9uZ19kaXJlY3QoJk0ueDg2LlJfRUFYLCZNLng4Ni5SX0VEWCxNLng4Ni5SX0VBWCxzKTsKKyAgICBpZiAoKChNLng4Ni5SX0VBWCAmIDB4ODAwMDAwMDApID09IDAgJiYgTS54ODYuUl9FRFggPT0gMHgwMDAwMDAwMCkgfHwKKwkoKE0ueDg2LlJfRUFYICYgMHg4MDAwMDAwMCkgIT0gMCAmJiBNLng4Ni5SX0VEWCA9PSAweEZGRkZGRkZGKSkgeworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKyAgICB9IGVsc2UgeworCVNFVF9GTEFHKEZfQ0YpOworCVNFVF9GTEFHKEZfT0YpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG11bF9ieXRlKHU4IHMpCit7CisgICAgdTE2IHJlcyA9ICh1MTYpKE0ueDg2LlJfQUwgKiBzKTsKKworICAgIE0ueDg2LlJfQVggPSByZXM7CisgICAgaWYgKE0ueDg2LlJfQUggPT0gMCkgeworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKyAgICB9IGVsc2UgeworCVNFVF9GTEFHKEZfQ0YpOworCVNFVF9GTEFHKEZfT0YpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG11bF93b3JkKHUxNiBzKQoreworICAgIHUzMiByZXMgPSBNLng4Ni5SX0FYICogczsKKworICAgIE0ueDg2LlJfQVggPSAodTE2KXJlczsKKyAgICBNLng4Ni5SX0RYID0gKHUxNikocmVzID4+IDE2KTsKKyAgICBpZiAoTS54ODYuUl9EWCA9PSAwKSB7CisJQ0xFQVJfRkxBRyhGX0NGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworICAgIH0gZWxzZSB7CisJU0VUX0ZMQUcoRl9DRik7CisJU0VUX0ZMQUcoRl9PRik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIE1VTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbXVsX2xvbmcodTMyIHMpCit7CisjaWZkZWYJX19IQVNfTE9OR19MT05HX18KKyAgICB1NjQgcmVzID0gKHUzMilNLng4Ni5SX0VBWCAqICh1MzIpczsKKworICAgIE0ueDg2LlJfRUFYID0gKHUzMilyZXM7CisgICAgTS54ODYuUl9FRFggPSAodTMyKShyZXMgPj4gMzIpOworI2Vsc2UKKyAgICB1MzIgYSxhX2xvLGFfaGk7CisgICAgdTMyIHNfbG8sc19oaTsKKyAgICB1MzIgcmxvX2xvLHJsb19oaSxyaGlfbG87CisKKyAgICBhID0gTS54ODYuUl9FQVg7CisgICAgYV9sbyA9IGEgJiAweEZGRkY7CisgICAgYV9oaSA9IGEgPj4gMTY7CisgICAgc19sbyA9IHMgJiAweEZGRkY7CisgICAgc19oaSA9IHMgPj4gMTY7CisgICAgcmxvX2xvID0gYV9sbyAqIHNfbG87CisgICAgcmxvX2hpID0gKGFfaGkgKiBzX2xvICsgYV9sbyAqIHNfaGkpICsgKHJsb19sbyA+PiAxNik7CisgICAgcmhpX2xvID0gYV9oaSAqIHNfaGkgKyAocmxvX2hpID4+IDE2KTsKKyAgICBNLng4Ni5SX0VBWCA9IChybG9faGkgPDwgMTYpIHwgKHJsb19sbyAmIDB4RkZGRik7CisgICAgTS54ODYuUl9FRFggPSByaGlfbG87CisjZW5kaWYKKyAgICBpZiAoTS54ODYuUl9FRFggPT0gMCkgeworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKyAgICB9IGVsc2UgeworCVNFVF9GTEFHKEZfQ0YpOworCVNFVF9GTEFHKEZfT0YpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBJRElWIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpZGl2X2J5dGUodTggcykKK3sKKyAgICBzMzIgZHZkLCBkaXYsIG1vZDsKKworICAgIGR2ZCA9IChzMTYpTS54ODYuUl9BWDsKKyAgICBpZiAocyA9PSAwKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBkaXYgPSBkdmQgLyAoczgpczsKKyAgICBtb2QgPSBkdmQgJSAoczgpczsKKyAgICBpZiAoYWJzKGRpdikgPiAweDdmKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBNLng4Ni5SX0FMID0gKHM4KSBkaXY7CisgICAgTS54ODYuUl9BSCA9IChzOCkgbW9kOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIElESVYgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGlkaXZfd29yZCh1MTYgcykKK3sKKyAgICBzMzIgZHZkLCBkaXYsIG1vZDsKKworICAgIGR2ZCA9ICgoKHMzMilNLng4Ni5SX0RYKSA8PCAxNikgfCBNLng4Ni5SX0FYOworICAgIGlmIChzID09IDApIHsKKwl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwlyZXR1cm47CisgICAgfQorICAgIGRpdiA9IGR2ZCAvIChzMTYpczsKKyAgICBtb2QgPSBkdmQgJSAoczE2KXM7CisgICAgaWYgKGFicyhkaXYpID4gMHg3ZmZmKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgIENMRUFSX0ZMQUcoRl9TRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoZGl2ID09IDAsIEZfWkYpOworICAgIHNldF9wYXJpdHlfZmxhZyhtb2QpOworCisgICAgTS54ODYuUl9BWCA9ICh1MTYpZGl2OworICAgIE0ueDg2LlJfRFggPSAodTE2KW1vZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBJRElWIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpZGl2X2xvbmcodTMyIHMpCit7CisjaWZkZWYJX19IQVNfTE9OR19MT05HX18KKyAgICBzNjQgZHZkLCBkaXYsIG1vZDsKKworICAgIGR2ZCA9ICgoKHM2NClNLng4Ni5SX0VEWCkgPDwgMzIpIHwgTS54ODYuUl9FQVg7CisgICAgaWYgKHMgPT0gMCkgeworCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCXJldHVybjsKKyAgICB9CisgICAgZGl2ID0gZHZkIC8gKHMzMilzOworICAgIG1vZCA9IGR2ZCAlIChzMzIpczsKKyAgICBpZiAoYWJzKGRpdikgPiAweDdmZmZmZmZmKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyNlbHNlCisgICAgczMyIGRpdiA9IDAsIG1vZDsKKyAgICBzMzIgaF9kdmQgPSBNLng4Ni5SX0VEWDsKKyAgICB1MzIgbF9kdmQgPSBNLng4Ni5SX0VBWDsKKyAgICB1MzIgYWJzX3MgPSBzICYgMHg3RkZGRkZGRjsKKyAgICB1MzIgYWJzX2hfZHZkID0gaF9kdmQgJiAweDdGRkZGRkZGOworICAgIHUzMiBoX3MgPSBhYnNfcyA+PiAxOworICAgIHUzMiBsX3MgPSBhYnNfcyA8PCAzMTsKKyAgICBpbnQgY291bnRlciA9IDMxOworICAgIGludCBjYXJyeTsKKworICAgIGlmIChzID09IDApIHsKKwl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwlyZXR1cm47CisgICAgfQorICAgIGRvIHsKKwlkaXYgPDw9IDE7CisJY2FycnkgPSAobF9kdmQgPj0gbF9zKSA/IDAgOiAxOworCisJaWYgKGFic19oX2R2ZCA8IChoX3MgKyBjYXJyeSkpIHsKKwkgICAgaF9zID4+PSAxOworCSAgICBsX3MgPSBhYnNfcyA8PCAoLS1jb3VudGVyKTsKKwkgICAgY29udGludWU7CisJfSBlbHNlIHsKKwkgICAgYWJzX2hfZHZkIC09IChoX3MgKyBjYXJyeSk7CisJICAgIGxfZHZkID0gY2FycnkgPyAoKDB4RkZGRkZGRkYgLSBsX3MpICsgbF9kdmQgKyAxKQorCQk6IChsX2R2ZCAtIGxfcyk7CisJICAgIGhfcyA+Pj0gMTsKKwkgICAgbF9zID0gYWJzX3MgPDwgKC0tY291bnRlcik7CisJICAgIGRpdiB8PSAxOworCSAgICBjb250aW51ZTsKKwl9CisKKyAgICB9IHdoaWxlIChjb3VudGVyID4gLTEpOworICAgIC8qIG92ZXJmbG93ICovCisgICAgaWYgKGFic19oX2R2ZCB8fCAobF9kdmQgPiBhYnNfcykpIHsKKwl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwlyZXR1cm47CisgICAgfQorICAgIC8qIHNpZ24gKi8KKyAgICBkaXYgfD0gKChoX2R2ZCAmIDB4MTAwMDAwMDApIF4gKHMgJiAweDEwMDAwMDAwKSk7CisgICAgbW9kID0gbF9kdmQ7CisKKyNlbmRpZgorICAgIENMRUFSX0ZMQUcoRl9DRik7CisgICAgQ0xFQVJfRkxBRyhGX0FGKTsKKyAgICBDTEVBUl9GTEFHKEZfU0YpOworICAgIFNFVF9GTEFHKEZfWkYpOworICAgIHNldF9wYXJpdHlfZmxhZyhtb2QpOworCisgICAgTS54ODYuUl9FQVggPSAodTMyKWRpdjsKKyAgICBNLng4Ni5SX0VEWCA9ICh1MzIpbW9kOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIERJViBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZGl2X2J5dGUodTggcykKK3sKKyAgICB1MzIgZHZkLCBkaXYsIG1vZDsKKworICAgIGR2ZCA9IE0ueDg2LlJfQVg7CisgICAgaWYgKHMgPT0gMCkgeworCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCXJldHVybjsKKyAgICB9CisgICAgZGl2ID0gZHZkIC8gKHU4KXM7CisgICAgbW9kID0gZHZkICUgKHU4KXM7CisgICAgaWYgKGFicyhkaXYpID4gMHhmZikgeworCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCXJldHVybjsKKyAgICB9CisgICAgTS54ODYuUl9BTCA9ICh1OClkaXY7CisgICAgTS54ODYuUl9BSCA9ICh1OCltb2Q7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgRElWIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBkaXZfd29yZCh1MTYgcykKK3sKKyAgICB1MzIgZHZkLCBkaXYsIG1vZDsKKworICAgIGR2ZCA9ICgoKHUzMilNLng4Ni5SX0RYKSA8PCAxNikgfCBNLng4Ni5SX0FYOworICAgIGlmIChzID09IDApIHsKKwl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwlyZXR1cm47CisgICAgfQorICAgIGRpdiA9IGR2ZCAvICh1MTYpczsKKyAgICBtb2QgPSBkdmQgJSAodTE2KXM7CisgICAgaWYgKGFicyhkaXYpID4gMHhmZmZmKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgIENMRUFSX0ZMQUcoRl9TRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoZGl2ID09IDAsIEZfWkYpOworICAgIHNldF9wYXJpdHlfZmxhZyhtb2QpOworCisgICAgTS54ODYuUl9BWCA9ICh1MTYpZGl2OworICAgIE0ueDg2LlJfRFggPSAodTE2KW1vZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBESVYgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGRpdl9sb25nKHUzMiBzKQoreworI2lmZGVmCV9fSEFTX0xPTkdfTE9OR19fCisgICAgdTY0IGR2ZCwgZGl2LCBtb2Q7CisKKyAgICBkdmQgPSAoKCh1NjQpTS54ODYuUl9FRFgpIDw8IDMyKSB8IE0ueDg2LlJfRUFYOworICAgIGlmIChzID09IDApIHsKKwl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwlyZXR1cm47CisgICAgfQorICAgIGRpdiA9IGR2ZCAvICh1MzIpczsKKyAgICBtb2QgPSBkdmQgJSAodTMyKXM7CisgICAgaWYgKGFicyhkaXYpID4gMHhmZmZmZmZmZikgeworCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCXJldHVybjsKKyAgICB9CisjZWxzZQorICAgIHMzMiBkaXYgPSAwLCBtb2Q7CisgICAgczMyIGhfZHZkID0gTS54ODYuUl9FRFg7CisgICAgdTMyIGxfZHZkID0gTS54ODYuUl9FQVg7CisKKyAgICB1MzIgaF9zID0gczsKKyAgICB1MzIgbF9zID0gMDsKKyAgICBpbnQgY291bnRlciA9IDMyOworICAgIGludCBjYXJyeTsKKworICAgIGlmIChzID09IDApIHsKKwl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwlyZXR1cm47CisgICAgfQorICAgIGRvIHsKKwlkaXYgPDw9IDE7CisJY2FycnkgPSAobF9kdmQgPj0gbF9zKSA/IDAgOiAxOworCisJaWYgKGhfZHZkIDwgKGhfcyArIGNhcnJ5KSkgeworCSAgICBoX3MgPj49IDE7CisJICAgIGxfcyA9IHMgPDwgKC0tY291bnRlcik7CisJICAgIGNvbnRpbnVlOworCX0gZWxzZSB7CisJICAgIGhfZHZkIC09IChoX3MgKyBjYXJyeSk7CisJICAgIGxfZHZkID0gY2FycnkgPyAoKDB4RkZGRkZGRkYgLSBsX3MpICsgbF9kdmQgKyAxKQorCQk6IChsX2R2ZCAtIGxfcyk7CisJICAgIGhfcyA+Pj0gMTsKKwkgICAgbF9zID0gcyA8PCAoLS1jb3VudGVyKTsKKwkgICAgZGl2IHw9IDE7CisJICAgIGNvbnRpbnVlOworCX0KKworICAgIH0gd2hpbGUgKGNvdW50ZXIgPiAtMSk7CisgICAgLyogb3ZlcmZsb3cgKi8KKyAgICBpZiAoaF9kdmQgfHwgKGxfZHZkID4gcykpIHsKKwl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwlyZXR1cm47CisgICAgfQorICAgIG1vZCA9IGxfZHZkOworI2VuZGlmCisgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICBDTEVBUl9GTEFHKEZfQUYpOworICAgIENMRUFSX0ZMQUcoRl9TRik7CisgICAgU0VUX0ZMQUcoRl9aRik7CisgICAgc2V0X3Bhcml0eV9mbGFnKG1vZCk7CisKKyAgICBNLng4Ni5SX0VBWCA9ICh1MzIpZGl2OworICAgIE0ueDg2LlJfRURYID0gKHUzMiltb2Q7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgSU4gc3RyaW5nIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzaW5nbGVfaW4oaW50IHNpemUpCit7CisgICAgaWYoc2l6ZSA9PSAxKQorCXN0b3JlX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwoKnN5c19pbmIpKE0ueDg2LlJfRFgpKTsKKyAgICBlbHNlIGlmIChzaXplID09IDIpCisJc3RvcmVfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCgqc3lzX2ludykoTS54ODYuUl9EWCkpOworICAgIGVsc2UKKwlzdG9yZV9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksKCpzeXNfaW5sKShNLng4Ni5SX0RYKSk7Cit9CisKK3ZvaWQgaW5zKGludCBzaXplKQoreworICAgIGludCBpbmMgPSBzaXplOworCisgICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSB7CisJaW5jID0gLXNpemU7CisgICAgfQorICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKKwkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCisJLyogaW4gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKwl1MzIgY291bnQgPSAoKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSA/CisJCSAgICAgTS54ODYuUl9FQ1ggOiBNLng4Ni5SX0NYKTsKKworCXdoaWxlIChjb3VudC0tKSB7CisJICBzaW5nbGVfaW4oc2l6ZSk7CisJICBNLng4Ni5SX0RJICs9IGluYzsKKwkgIH0KKwlNLng4Ni5SX0NYID0gMDsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgTS54ODYuUl9FQ1ggPSAwOworCX0KKwlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKKyAgICB9IGVsc2UgeworCXNpbmdsZV9pbihzaXplKTsKKwlNLng4Ni5SX0RJICs9IGluYzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgT1VUIHN0cmluZyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc2luZ2xlX291dChpbnQgc2l6ZSkKK3sKKyAgICAgaWYoc2l6ZSA9PSAxKQorICAgICAgICgqc3lzX291dGIpKE0ueDg2LlJfRFgsZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX1NJKSk7CisgICAgIGVsc2UgaWYgKHNpemUgPT0gMikKKyAgICAgICAoKnN5c19vdXR3KShNLng4Ni5SX0RYLGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9TSSkpOworICAgICBlbHNlCisgICAgICAgKCpzeXNfb3V0bCkoTS54ODYuUl9EWCxmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfU0kpKTsKK30KKwordm9pZCBvdXRzKGludCBzaXplKQoreworICAgIGludCBpbmMgPSBzaXplOworCisgICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSB7CisJaW5jID0gLXNpemU7CisgICAgfQorICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKKwkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCisJLyogb3V0IHVudGlsIENYIGlzIFpFUk8uICovCisJdTMyIGNvdW50ID0gKChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgPworCQkgICAgIE0ueDg2LlJfRUNYIDogTS54ODYuUl9DWCk7CisJd2hpbGUgKGNvdW50LS0pIHsKKwkgIHNpbmdsZV9vdXQoc2l6ZSk7CisJICBNLng4Ni5SX1NJICs9IGluYzsKKwkgIH0KKwlNLng4Ni5SX0NYID0gMDsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgTS54ODYuUl9FQ1ggPSAwOworCX0KKwlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKKyAgICB9IGVsc2UgeworCXNpbmdsZV9vdXQoc2l6ZSk7CisJTS54ODYuUl9TSSArPSBpbmM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIJLSBBZGRyZXNzIHRvIGZldGNoIHdvcmQgZnJvbQorCitSRU1BUktTOgorRmV0Y2hlcyBhIHdvcmQgZnJvbSBlbXVsYXRvciBtZW1vcnkgdXNpbmcgYW4gYWJzb2x1dGUgYWRkcmVzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgbWVtX2FjY2Vzc193b3JkKGludCBhZGRyKQoreworREIoIGlmIChDSEVDS19NRU1fQUNDRVNTKCkpCisgICAgICB4ODZlbXVfY2hlY2tfbWVtX2FjY2VzcyhhZGRyKTspCisgICAgcmV0dXJuICgqc3lzX3JkdykoYWRkcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUHVzaGVzIGEgd29yZCBvbnRvIHRoZSBzdGFjay4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzLCBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHVzaF93b3JkKHUxNiB3KQoreworREIoIGlmIChDSEVDS19TUF9BQ0NFU1MoKSkKKyAgICAgIHg4NmVtdV9jaGVja19zcF9hY2Nlc3MoKTspCisgICAgTS54ODYuUl9TUCAtPSAyOworICAgICgqc3lzX3dydykoKCh1MzIpTS54ODYuUl9TUyA8PCA0KSAgKyBNLng4Ni5SX1NQLCB3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitQdXNoZXMgYSBsb25nIG9udG8gdGhlIHN0YWNrLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMsIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwdXNoX2xvbmcodTMyIHcpCit7CitEQiggaWYgKENIRUNLX1NQX0FDQ0VTUygpKQorICAgICAgeDg2ZW11X2NoZWNrX3NwX2FjY2VzcygpOykKKyAgICBNLng4Ni5SX1NQIC09IDQ7CisgICAgKCpzeXNfd3JsKSgoKHUzMilNLng4Ni5SX1NTIDw8IDQpICArIE0ueDg2LlJfU1AsIHcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1BvcHMgYSB3b3JkIGZyb20gdGhlIHN0YWNrLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMsIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHBvcF93b3JkKHZvaWQpCit7CisgICAgdTE2IHJlczsKKworREIoIGlmIChDSEVDS19TUF9BQ0NFU1MoKSkKKyAgICAgIHg4NmVtdV9jaGVja19zcF9hY2Nlc3MoKTspCisgICAgcmVzID0gKCpzeXNfcmR3KSgoKHUzMilNLng4Ni5SX1NTIDw8IDQpICArIE0ueDg2LlJfU1ApOworICAgIE0ueDg2LlJfU1AgKz0gMjsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1BvcHMgYSBsb25nIGZyb20gdGhlIHN0YWNrLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMsIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHBvcF9sb25nKHZvaWQpCit7CisgICAgdTMyIHJlczsKKworREIoIGlmIChDSEVDS19TUF9BQ0NFU1MoKSkKKyAgICAgIHg4NmVtdV9jaGVja19zcF9hY2Nlc3MoKTspCisgICAgcmVzID0gKCpzeXNfcmRsKSgoKHUzMilNLng4Ni5SX1NTIDw8IDQpICArIE0ueDg2LlJfU1ApOworICAgIE0ueDg2LlJfU1AgKz0gNDsKKyAgICByZXR1cm4gcmVzOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci94ODZlbXUvc3lzLmMgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IveDg2ZW11L3N5cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NjM4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IveDg2ZW11L3N5cy5jCkBAIC0wLDAgKzEsMzI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgaW5jbHVkZXMgc3Vicm91dGluZXMgd2hpY2ggYXJlIHJlbGF0ZWQgdG8KKyogICAgICAgICAgICAgICBwcm9ncmFtbWVkIEkvTyBhbmQgbWVtb3J5IGFjY2Vzcy4gSW5jbHVkZWQgaW4gdGhpcyBtb2R1bGUKKyogICAgICAgICAgICAgICBhcmUgZGVmYXVsdCBmdW5jdGlvbnMgdGhhdCBkbyBub3RoaW5nLiBGb3IgcmVhbCB1c2VzIHRoZXNlCisqICAgICAgICAgICAgICAgZnVuY3Rpb25zIHdpbGwgaGF2ZSB0byBiZSBvdmVycmlkZW4gYnkgdGhlIHVzZXIgbGlicmFyeS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfQklPU0VNVSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworWDg2RU1VX3N5c0VudiBfWDg2RU1VX2VudjsJLyogR2xvYmFsIGVtdWxhdG9yIG1hY2hpbmUgc3RhdGUgKi8KK1g4NkVNVV9pbnRyRnVuY3MgX1g4NkVNVV9pbnRyVGFiWzI1Nl07CisKK2ludCBkZWJ1Z19pbnRyOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCisKK1JFVFVSTlM6CitCeXRlIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCisKK1JFTUFSS1M6CitSZWFkcyBhIGJ5dGUgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IFg4NkFQSSByZGIodTMyIGFkZHIpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKKworUkVUVVJOUzoKK1dvcmQgdmFsdWUgcmVhZCBmcm9tIGVtdWxhdG9yIG1lbW9yeS4KKworUkVNQVJLUzoKK1JlYWRzIGEgd29yZCB2YWx1ZSBmcm9tIHRoZSBlbXVsYXRvciBtZW1vcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IFg4NkFQSSByZHcodTMyIGFkZHIpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKKworUkVUVVJOUzoKK0xvbmcgdmFsdWUgcmVhZCBmcm9tIGVtdWxhdG9yIG1lbW9yeS4KK1JFTUFSS1M6CitSZWFkcyBhIGxvbmcgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBYODZBUEkgcmRsKHUzMiBhZGRyKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCit2YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKKworUkVNQVJLUzoKK1dyaXRlcyBhIGJ5dGUgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2QVBJIHdyYih1MzIgYWRkciwgdTggdmFsKQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCit2YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKKworUkVNQVJLUzoKK1dyaXRlcyBhIHdvcmQgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2QVBJIHdydyh1MzIgYWRkciwgdTE2IHZhbCkKK3sKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAordmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSBsb25nIHZhbHVlIHRvIGVtdWxhdG9yIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSB3cmwodTMyIGFkZHIsIHUzMiB2YWwpCit7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIFBJTyBhZGRyZXNzIHRvIHJlYWQKK1JFVFVSTjoKKzAKK1JFTUFSS1M6CitEZWZhdWx0IFBJTyBieXRlIHJlYWQgZnVuY3Rpb24uIERvZXNuJ3QgcGVyZm9ybSByZWFsIGluYi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdTggWDg2QVBJIHBfaW5iKFg4NkVNVV9waW9BZGRyIGFkZHIpCit7CisJREIoaWYgKERFQlVHX0lPX1RSQUNFKCkpCisJICAgcHJpbnRrKCJpbmIgJSMwNHggXG4iLCBhZGRyKTspCisJCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBQSU8gYWRkcmVzcyB0byByZWFkCitSRVRVUk46CiswCitSRU1BUktTOgorRGVmYXVsdCBQSU8gd29yZCByZWFkIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBpbncuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHUxNiBYODZBUEkgcF9pbncoWDg2RU1VX3Bpb0FkZHIgYWRkcikKK3sKKwlEQihpZiAoREVCVUdfSU9fVFJBQ0UoKSkKKwkgICBwcmludGsoImludyAlIzA0eCBcbiIsIGFkZHIpOykKKwkJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIFBJTyBhZGRyZXNzIHRvIHJlYWQKK1JFVFVSTjoKKzAKK1JFTUFSS1M6CitEZWZhdWx0IFBJTyBsb25nIHJlYWQgZnVuY3Rpb24uIERvZXNuJ3QgcGVyZm9ybSByZWFsIGlubC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdTMyIFg4NkFQSSBwX2lubChYODZFTVVfcGlvQWRkciBhZGRyKQoreworCURCKGlmIChERUJVR19JT19UUkFDRSgpKQorCSAgIHByaW50aygiaW5sICUjMDR4IFxuIiwgYWRkcik7KQorCQlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gUElPIGFkZHJlc3MgdG8gd3JpdGUKK3ZhbCAgICAgLSBWYWx1ZSB0byBzdG9yZQorUkVNQVJLUzoKK0RlZmF1bHQgUElPIGJ5dGUgd3JpdGUgZnVuY3Rpb24uIERvZXNuJ3QgcGVyZm9ybSByZWFsIG91dGIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgWDg2QVBJIHBfb3V0YihYODZFTVVfcGlvQWRkciBhZGRyLCB1OCB2YWwpCit7CisJREIoaWYgKERFQlVHX0lPX1RSQUNFKCkpCisJICAgcHJpbnRrKCJvdXRiICUjMDJ4IC0+ICUjMDR4IFxuIiwgdmFsLCBhZGRyKTspCisJCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gUElPIGFkZHJlc3MgdG8gd3JpdGUKK3ZhbCAgICAgLSBWYWx1ZSB0byBzdG9yZQorUkVNQVJLUzoKK0RlZmF1bHQgUElPIHdvcmQgd3JpdGUgZnVuY3Rpb24uIERvZXNuJ3QgcGVyZm9ybSByZWFsIG91dHcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgWDg2QVBJIHBfb3V0dyhYODZFTVVfcGlvQWRkciBhZGRyLCB1MTYgdmFsKQoreworCURCKGlmIChERUJVR19JT19UUkFDRSgpKQorCSAgIHByaW50aygib3V0dyAlIzA0eCAtPiAlIzA0eCBcbiIsIHZhbCwgYWRkcik7KQorCQlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIFBJTyBhZGRyZXNzIHRvIHdyaXRlCit2YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKK1JFTUFSS1M6CitEZWZhdWx0IFBJTyA7b25nIHdyaXRlIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBvdXRsLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFg4NkFQSSBwX291dGwoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTMyIHZhbCkKK3sKKwlEQihpZiAoREVCVUdfSU9fVFJBQ0UoKSkKKwkgICBwcmludGsoIm91dGwgJSMwOHggLT4gJSMwNHggXG4iLCB2YWwsIGFkZHIpOykKKwkJcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1OChYODZBUElQIHN5c19yZGIpICh1MzIgYWRkcikgPSByZGI7Cit1MTYoWDg2QVBJUCBzeXNfcmR3KSAodTMyIGFkZHIpID0gcmR3OwordTMyKFg4NkFQSVAgc3lzX3JkbCkgKHUzMiBhZGRyKSA9IHJkbDsKK3ZvaWQgKFg4NkFQSVAgc3lzX3dyYikgKHUzMiBhZGRyLCB1OCB2YWwpID0gd3JiOwordm9pZCAoWDg2QVBJUCBzeXNfd3J3KSAodTMyIGFkZHIsIHUxNiB2YWwpID0gd3J3Owordm9pZCAoWDg2QVBJUCBzeXNfd3JsKSAodTMyIGFkZHIsIHUzMiB2YWwpID0gd3JsOwordTgoWDg2QVBJUCBzeXNfaW5iKSAoWDg2RU1VX3Bpb0FkZHIgYWRkcikgPSBwX2luYjsKK3UxNihYODZBUElQIHN5c19pbncpIChYODZFTVVfcGlvQWRkciBhZGRyKSA9IHBfaW53OwordTMyKFg4NkFQSVAgc3lzX2lubCkgKFg4NkVNVV9waW9BZGRyIGFkZHIpID0gcF9pbmw7Cit2b2lkIChYODZBUElQIHN5c19vdXRiKSAoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTggdmFsKSA9IHBfb3V0YjsKK3ZvaWQgKFg4NkFQSVAgc3lzX291dHcpIChYODZFTVVfcGlvQWRkciBhZGRyLCB1MTYgdmFsKSA9IHBfb3V0dzsKK3ZvaWQgKFg4NkFQSVAgc3lzX291dGwpIChYODZFTVVfcGlvQWRkciBhZGRyLCB1MzIgdmFsKSA9IHBfb3V0bDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitmdW5jcyAgIC0gTmV3IG1lbW9yeSBmdW5jdGlvbiBwb2ludGVycyB0byBtYWtlIGFjdGl2ZQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHdoaWNoIGFjY2VzcworbWVtb3J5IHNwYWNlLCBhbGxvd2luZyB0aGUgdXNlciBhcHBsaWNhdGlvbiB0byBvdmVycmlkZSB0aGVzZSBmdW5jdGlvbnMKK2FuZCBob29rIHRoZW0gb3V0IGFzIG5lY2Vzc2FyeSBmb3IgdGhlaXIgYXBwbGljYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZFTVVfc2V0dXBNZW1GdW5jcyhYODZFTVVfbWVtRnVuY3MgKiBmdW5jcykKK3sKKwlzeXNfcmRiID0gZnVuY3MtPnJkYjsKKwlzeXNfcmR3ID0gZnVuY3MtPnJkdzsKKwlzeXNfcmRsID0gZnVuY3MtPnJkbDsKKwlzeXNfd3JiID0gZnVuY3MtPndyYjsKKwlzeXNfd3J3ID0gZnVuY3MtPndydzsKKwlzeXNfd3JsID0gZnVuY3MtPndybDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitmdW5jcyAgIC0gTmV3IHByb2dyYW1tZWQgSS9PIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIG1ha2UgYWN0aXZlCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBwb2ludGVycyB0byBmdW5jdGlvbnMgd2hpY2ggYWNjZXNzCitJL08gc3BhY2UsIGFsbG93aW5nIHRoZSB1c2VyIGFwcGxpY2F0aW9uIHRvIG92ZXJyaWRlIHRoZXNlIGZ1bmN0aW9ucworYW5kIGhvb2sgdGhlbSBvdXQgYXMgbmVjZXNzYXJ5IGZvciB0aGVpciBhcHBsaWNhdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkVNVV9zZXR1cFBpb0Z1bmNzKFg4NkVNVV9waW9GdW5jcyAqIGZ1bmNzKQoreworCXN5c19pbmIgPSBmdW5jcy0+aW5iOworCXN5c19pbncgPSBmdW5jcy0+aW53OworCXN5c19pbmwgPSBmdW5jcy0+aW5sOworCXN5c19vdXRiID0gZnVuY3MtPm91dGI7CisJc3lzX291dHcgPSBmdW5jcy0+b3V0dzsKKwlzeXNfb3V0bCA9IGZ1bmNzLT5vdXRsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2Z1bmNzICAgLSBOZXcgaW50ZXJydXB0IHZlY3RvciB0YWJsZSB0byBtYWtlIGFjdGl2ZQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHdoaWNoIGhhbmRsZQoraW50ZXJydXB0IHByb2Nlc3NpbmcgaW4gdGhlIGVtdWxhdG9yLCBhbGxvd2luZyB0aGUgdXNlciBhcHBsaWNhdGlvbiB0bworaG9vayBpbnRlcnJ1cHRzIGFzIG5lY2Vzc2FyeSBmb3IgdGhlaXIgYXBwbGljYXRpb24uIEFueSBpbnRlcnJ1cHRzIHRoYXQKK2FyZSBub3QgaG9va2VkIGJ5IHRoZSB1c2VyIGFwcGxpY2F0aW9uLCBhbmQgcmVmbGVjdGVkIGFuZCBoYW5kbGVkIGludGVybmFsbHkKK2luIHRoZSBlbXVsYXRvciB2aWEgdGhlIGludGVycnVwdCB2ZWN0b3IgdGFibGUuIFRoaXMgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbgordG8gZ2V0IGNvbnRyb2wgd2hlbiB0aGUgY29kZSBiZWluZyBlbXVsYXRlZCBleGVjdXRlcyBzcGVjaWZpYyBzb2Z0d2FyZQoraW50ZXJydXB0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkVNVV9zZXR1cEludHJGdW5jcyhYODZFTVVfaW50ckZ1bmNzIGZ1bmNzW10pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCV9YODZFTVVfaW50clRhYltpXSA9IE5VTEw7CisJaWYgKGZ1bmNzKSB7CisJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCV9YODZFTVVfaW50clRhYltpXSA9IGZ1bmNzW2ldOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbnQgLSBOZXcgc29mdHdhcmUgaW50ZXJydXB0IHRvIHByZXBhcmUgZm9yCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHVwIHRoZSBlbXVsYXRvciBzdGF0ZSB0byBleGNldXRlIGEgc29mdHdhcmUKK2ludGVycnVwdC4gVGhpcyBjYW4gYmUgdXNlZCBieSB0aGUgdXNlciBhcHBsaWNhdGlvbiBjb2RlIHRvIGFsbG93IGFuCitpbnRlcnJ1cHQgdG8gYmUgaG9va2VkLCBleGFtaW5lZCBhbmQgdGhlbiByZWZsZWN0ZWQgYmFjayB0byB0aGUgZW11bGF0b3IKK3NvIHRoYXQgdGhlIGNvZGUgaW4gdGhlIGVtdWxhdG9yIHdpbGwgY29udGludWUgcHJvY2Vzc2luZyB0aGUgc29mdHdhcmUKK2ludGVycnVwdCBhcyBwZXIgbm9ybWFsLiBUaGlzIGVzc2VudGlhbGx5IGFsbG93cyBzeXN0ZW0gY29kZSB0byBhY3RpdmVseQoraG9vayBhbmQgaGFuZGxlIGNlcnRhaW4gc29mdHdhcmUgaW50ZXJydXB0cyBhcyBuZWNlc3NhcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZFTVVfcHJlcGFyZUZvckludChpbnQgbnVtKQoreworCXB1c2hfd29yZCgodTE2KSBNLng4Ni5SX0ZMRyk7CisJQ0xFQVJfRkxBRyhGX0lGKTsKKwlDTEVBUl9GTEFHKEZfVEYpOworCXB1c2hfd29yZChNLng4Ni5SX0NTKTsKKwlNLng4Ni5SX0NTID0gbWVtX2FjY2Vzc193b3JkKG51bSAqIDQgKyAyKTsKKwlwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisJTS54ODYuUl9JUCA9IG1lbV9hY2Nlc3Nfd29yZChudW0gKiA0KTsKKwlNLng4Ni5pbnRyID0gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NmYl9jb25zb2xlLmMgYi9kcml2ZXJzL2NmYl9jb25zb2xlLmMKaW5kZXggOTcyN2FlYi4uYmNmODc3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZmJfY29uc29sZS5jCisrKyBiL2RyaXZlcnMvY2ZiX2NvbnNvbGUuYwpAQCAtNjMsNyArNjMsNyBAQAogCQkJICAgICAgIGxvb3AgaW4gVklERU9fVFNUQ19GQ1QgKGk4MDQyKQogIENGR19DT05TT0xFX0JMSU5LX0NPVU5UICAgICAtIHZhbHVlIGZvciBkZWxheSBsb29wIC0gYmxpbmsgcmF0ZQogIENPTkZJR19DT05TT0xFX1RJTUUJICAgICAtIGRpc3BsYXkgdGltZS9kYXRlIGluIHVwcGVyIHJpZ2h0IGNvcm5lciwKLQkJCSAgICAgICBuZWVkcyBDRkdfQ01EX0RBVEUgYW5kIENPTkZJR19DT05TT0xFX0NVUlNPUgorCQkJICAgICAgIG5lZWRzIENPTkZJR19DTURfREFURSBhbmQgQ09ORklHX0NPTlNPTEVfQ1VSU09SCiAgQ09ORklHX1ZJREVPX0xPR08JICAgICAtIGRpc3BsYXkgTGludXggTG9nbyBpbiB1cHBlciBsZWZ0IGNvcm5lcgogIENPTkZJR19WSURFT19CTVBfTE9HTwkgICAgIC0gdXNlIGJtcF9sb2dvIGluc3RlYWQgb2YgbGludXhfbG9nbwogIENPTkZJR19DT05TT0xFX0VYVFJBX0lORk8gICAtIGRpc3BsYXkgYWRkaXRpb25hbCBib2FyZCBpbmZvcm1hdGlvbiBzdHJpbmdzCkBAIC0xNzUsMTUgKzE3NSwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8ZGV2aWNlcy5oPgogI2luY2x1ZGUgPHZpZGVvX2ZvbnQuaD4KLSNpZmRlZiBDRkdfQ01EX0RBVEUKLSNpbmNsdWRlIDxydGMuaD4KIAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQorI2luY2x1ZGUgPHJ0Yy5oPgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CTVApIHx8IGRlZmluZWQoQ09ORklHX1NQTEFTSF9TQ1JFRU4pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JNUCkgfHwgZGVmaW5lZChDT05GSUdfU1BMQVNIX1NDUkVFTikKICNpbmNsdWRlIDx3YXRjaGRvZy5oPgogI2luY2x1ZGUgPGJtcF9sYXlvdXQuaD4KLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CTVApIHx8IENPTkZJR19TUExBU0hfU0NSRUVOICovCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogQ3Vyc29yIGRlZmluaXRpb246CQkJCQkJCSAgICAgKi8KQEAgLTcwOSw3ICs3MDksNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CTVApIHx8IGRlZmluZWQoQ09ORklHX1NQTEFTSF9TQ1JFRU4pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JNUCkgfHwgZGVmaW5lZChDT05GSUdfU1BMQVNIX1NDUkVFTikKIAogI2RlZmluZSBGSUxMXzhCSVRfMzMyUkdCKHIsZyxiKQl7CQkJXAogCSpmYiA9ICgocj4+NSk8PDUpIHwgKChnPj41KTw8MikgfCAoYj4+Nik7CVwKQEAgLTEwMDQsNyArMTAwNCw3IEBACiAKIAlyZXR1cm4gKDApOwogfQotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JNUCkgfHwgQ09ORklHX1NQTEFTSF9TQ1JFRU4gKi8KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3M4OTAwLmMgYi9kcml2ZXJzL2NzODkwMC5jCmluZGV4IDA4MjQzNGMuLjgwYzRiYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3M4OTAwLmMKKysrIGIvZHJpdmVycy9jczg5MDAuYwpAQCAtNDMsNyArNDMsNyBAQAogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9DUzg5MDAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAjdW5kZWYgREVCVUcKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kYzIxMTR4LmMgYi9kcml2ZXJzL2RjMjExNHguYwppbmRleCBjNDNjZDVlLi5kNTI3NWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RjMjExNHguYworKysgYi9kcml2ZXJzL2RjMjExNHguYwpAQCAtMjAsOCArMjAsOCBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgXAotCSYmIGRlZmluZWQoQ09ORklHX1RVTElQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpIFwKKwkmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIGRlZmluZWQoQ09ORklHX1RVTElQKQogCiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjaW5jbHVkZSA8bmV0Lmg+CkBAIC03NjgsNCArNzY4LDQgQEAKIH0KICNlbmRpZgkvKiBVUERBVEVfU1JPTSAqLwogCi0jZW5kaWYJLyogQ0ZHX0NNRF9ORVQgJiYgQ09ORklHX05FVF9NVUxUSSAmJiBDT05GSUdfVFVMSVAgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbTkwMDB4LmMgYi9kcml2ZXJzL2RtOTAwMHguYwppbmRleCA2ODc3MDc2Li43OGFjYjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtOTAwMHguYworKysgYi9kcml2ZXJzL2RtOTAwMHguYwpAQCAtMzAyLDYgKzMwMiwyMSBAQAogCS8qIFNldCBOb2RlIGFkZHJlc3MgKi8KIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQogCQkoKHUxNiAqKSBiZC0+YmlfZW5ldGFkZHIpW2ldID0gcmVhZF9zcm9tX3dvcmQoaSk7CisKKwlpZiAoIWlzX3plcm9fZXRoZXJfYWRkcihiZC0+YmlfZW5ldGFkZHIpICYmCisJICAgICFpc19tdXRsaWNhc3RfZXRoZXJfYWRkcihiZC0+YmlfZW5ldGFkZHIpKSB7CisJCS8qIHRyeSByZWFkaW5nIGZyb20gZW52aXJvbm1lbnQgKi8KKwkJdTggaTsKKwkJY2hhciAqcywgKmU7CisJCXMgPSBnZXRlbnYgKCJldGhhZGRyIik7CisJCWZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHsKKwkJCWJkLT5iaV9lbmV0YWRkcltpXSA9IHMgPworCQkJCXNpbXBsZV9zdHJ0b3VsIChzLCAmZSwgMTYpIDogMDsKKwkJCWlmIChzKQorCQkJCXMgPSAoKmUpID8gZSArIDEgOiBlOworCQl9CisJfQorCiAJcHJpbnRmKCJNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBiZC0+YmlfZW5ldGFkZHJbMF0sCiAJICAgICAgIGJkLT5iaV9lbmV0YWRkclsxXSwgYmQtPmJpX2VuZXRhZGRyWzJdLCBiZC0+YmlfZW5ldGFkZHJbM10sCiAJICAgICAgIGJkLT5iaV9lbmV0YWRkcls0XSwgYmQtPmJpX2VuZXRhZGRyWzVdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZTEwMDAuYyBiL2RyaXZlcnMvZTEwMDAuYwppbmRleCA5MjdhY2JiLi5mMDc0MWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2UxMDAwLmMKKysrIGIvZHJpdmVycy9lMTAwMC5jCkBAIC00NCw4ICs0NCw4IEBACiAKICNpbmNsdWRlICJlMTAwMC5oIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKLQlkZWZpbmVkKENPTkZJR19FMTAwMCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSBcCisJJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBkZWZpbmVkKENPTkZJR19FMTAwMCkKIAogI2RlZmluZSBUT1VUX0xPT1AgICAxMDAwMDAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZXBybzEwMC5jIGIvZHJpdmVycy9lZXBybzEwMC5jCmluZGV4IDA0YzE3ZjYuLjczODE0NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWVwcm8xMDAuYworKysgYi9kcml2ZXJzL2VlcHJvMTAwLmMKQEAgLTMwLDggKzMwLDggQEAKIAogI3VuZGVmIERFQlVHCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAotCWRlZmluZWQoQ09ORklHX0VFUFJPMTAwKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpIFwKKwkmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIGRlZmluZWQoQ09ORklHX0VFUFJPMTAwKQogCiAJLyogRXRoZXJuZXQgY2hpcCByZWdpc3RlcnMuCiAJICovCkBAIC0yNzIsNyArMjcyLDcgQEAKIAkqKHZvbGF0aWxlIHUzMiAqKSAoKGFkZHIgKyBkZXYtPmlvYmFzZSkpID0gY3B1X3RvX2xlMzIgKGNvbW1hbmQpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogc3RhdGljIGlubGluZSBpbnQgSU5MIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2LCB1X2xvbmcgYWRkcikKIHsKIAlyZXR1cm4gbGUzMl90b19jcHUgKCoodm9sYXRpbGUgdTMyICopIChhZGRyICsgZGV2LT5pb2Jhc2UpKTsKQEAgLTM4Niw3ICszODYsNyBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICovCisjZW5kaWYKIAogLyogV2FpdCBmb3IgdGhlIGNoaXAgZ2V0IHRoZSBjb21tYW5kLgogKi8KQEAgLTQ2Miw3ICs0NjIsNyBAQAogCiAJCWV0aF9yZWdpc3RlciAoZGV2KTsKIAotI2lmIGRlZmluZWQgKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkIChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCQkvKiByZWdpc3RlciBtaWkgY29tbWFuZCBhY2Nlc3Mgcm91dGluZXMgKi8KIAkJbWlpcGh5X3JlZ2lzdGVyKGRldi0+bmFtZSwKIAkJCQllZXBybzEwMF9taWlwaHlfcmVhZCwgZWVwcm8xMDBfbWlpcGh5X3dyaXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZW5jMjhqNjAuYyBiL2RyaXZlcnMvZW5jMjhqNjAuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZzbF9pMmMuYyBiL2RyaXZlcnMvZnNsX2kyYy5jCmluZGV4IGViYWU1YWYuLjIyNDg1ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZnNsX2kyYy5jCisrKyBiL2RyaXZlcnMvZnNsX2kyYy5jCkBAIC02OSw5ICs2OSwxMCBAQAogCWRldiA9IChzdHJ1Y3QgZnNsX2kyYyAqKSAoQ0ZHX0lNTVIgKyBDRkdfSTJDMl9PRkZTRVQpOwogCiAJd3JpdGViKDAsICZkZXYtPmNyKTsJCQkvKiBzdG9wIEkyQyBjb250cm9sbGVyICovCisJdWRlbGF5KDUpOwkJCQkvKiBsZXQgaXQgc2h1dGRvd24gaW4gcGVhY2UgKi8KIAl3cml0ZWIoMHgzRiwgJmRldi0+ZmRyKTsJCS8qIHNldCBidXMgc3BlZWQgKi8KIAl3cml0ZWIoMHgzRiwgJmRldi0+ZGZzcnIpOwkJLyogc2V0IGRlZmF1bHQgZmlsdGVyICovCi0Jd3JpdGViKHNsYXZlYWRkLCAmZGV2LT5hZHIpOwkJLyogd3JpdGUgc2xhdmUgYWRkcmVzcyAqLworCXdyaXRlYihzbGF2ZWFkZCA8PCAxLCAmZGV2LT5hZHIpOwkvKiB3cml0ZSBzbGF2ZSBhZGRyZXNzICovCiAJd3JpdGViKDB4MCwgJmRldi0+c3IpOwkJCS8qIGNsZWFyIHN0YXR1cyByZWdpc3RlciAqLwogCXdyaXRlYihJMkNfQ1JfTUVOLCAmZGV2LT5jcik7CQkvKiBzdGFydCBJMkMgY29udHJvbGxlciAqLwogI2VuZGlmCS8qIENGR19JMkMyX09GRlNFVCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mc2xfcGNpX2luaXQuYyBiL2RyaXZlcnMvZnNsX3BjaV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4NGRjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnNsX3BjaV9pbml0LmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19GU0xfUENJX0lOSVQKKworLyoKKyAqIFBDSS9QQ0lFIENvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb24gZm9yIG1wYzg1eHgvbXBjODZ4eCBzb2MncworICoKKyAqIEluaXRpYWxpemUgY29udHJvbGxlciBhbmQgY2FsbCB0aGUgY29tbW9uIGRyaXZlci9wY2kgcGNpX2hvc2Vfc2NhbiB0bworICogc2NhbiBmb3IgYnJpZGdlcyBhbmQgZGV2aWNlcy4KKyAqCisgKiBIb3NlIGZpZWxkcyB3aGljaCBuZWVkIHRvIGJlIHByZS1pbml0aWFsaXplZCBieSBib2FyZCBzcGVjaWZpYyBjb2RlOgorICogICByZWdpb25zW10KKyAqICAgZmlyc3RfYnVzbm8KKyAqCisgKiBGaWVsZHMgdXBkYXRlZDoKKyAqICAgbGFzdF9idXNubworICovCisKKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxhc20vaW1tYXBfZnNsX3BjaS5oPgorCit2b2lkIHBjaWF1dG9fcHJlc2Nhbl9zZXR1cF9icmlkZ2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCXBjaV9kZXZfdCBkZXYsIGludCBzdWJfYnVzKTsKK3ZvaWQgcGNpYXV0b19wb3N0c2Nhbl9zZXR1cF9icmlkZ2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCXBjaV9kZXZfdCBkZXYsIGludCBzdWJfYnVzKTsKKwordm9pZCBwY2lhdXRvX2NvbmZpZ19pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7Cit2b2lkCitmc2xfcGNpX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCXUxNiB0ZW1wMTY7CisJdTMyIHRlbXAzMjsKKwlpbnQgYnVzbm8gPSBob3NlLT5maXJzdF9idXNubzsKKwlpbnQgZW5hYmxlZDsKKwl1MTYgbHRzc207CisJdTggdGVtcDg7CisJaW50IHI7CisJaW50IGJyaWRnZTsKKwl2b2xhdGlsZSBjY3NyX2ZzbF9wY2lfdCAqcGNpID0gKGNjc3JfZnNsX3BjaV90ICopIGhvc2UtPmNmZ19hZGRyOworCXBjaV9kZXZfdCBkZXYgPSBQQ0lfQkRGKGJ1c25vLDAsMCk7CisKKwkvKiBJbml0aWFsaXplIEFUTVUgcmVnaXN0ZXJzIGJhc2VkIG9uIGhvc2UgcmVnaW9ucyBhbmQgZmxhZ3MgKi8KKwl2b2xhdGlsZSBwb3RfdCAqcG89JnBjaS0+cG90WzFdOwkvKiBza2lwIDAgKi8KKwl2b2xhdGlsZSBwaXRfdCAqcGk9JnBjaS0+cGl0WzBdOwkvKiByYW5nZXMgZnJvbTogMyB0byAxICovCisKKyNpZmRlZiBERUJVRworCWludCBuZWdfbGlua193OworI2VuZGlmCisKKwlmb3IgKHI9MDsgcjxob3NlLT5yZWdpb25fY291bnQ7IHIrKykgeworCQlpZiAoaG9zZS0+cmVnaW9uc1tyXS5mbGFncyAmIFBDSV9SRUdJT05fTUVNT1JZKSB7IC8qIGluYm91bmQgKi8KKwkJCXBpLT5waXRhciA9IChob3NlLT5yZWdpb25zW3JdLmJ1c19zdGFydCA+PiAxMikgJiAweDAwMGZmZmZmOworCQkJcGktPnBpd2JhciA9IChob3NlLT5yZWdpb25zW3JdLnBoeXNfc3RhcnQgPj4gMTIpICYgMHgwMDBmZmZmZjsKKwkJCXBpLT5waXdiZWFyID0gMDsKKwkJCXBpLT5waXdhciA9IFBJV0FSX0VOIHwgUElXQVJfUEYgfCBQSVdBUl9MT0NBTCB8CisJCQkJUElXQVJfUkVBRF9TTk9PUCB8IFBJV0FSX1dSSVRFX1NOT09QIHwKKwkJCQkoX19pbG9nMihob3NlLT5yZWdpb25zW3JdLnNpemUpIC0gMSk7CisJCQlwaSsrOworCQl9IGVsc2UgeyAvKiBPdXRib3VuZCAqLworCQkJcG8tPnBvd2JhciA9IChob3NlLT5yZWdpb25zW3JdLnBoeXNfc3RhcnQgPj4gMTIpICYgMHgwMDBmZmZmZjsKKwkJCXBvLT5wb3RhciA9IChob3NlLT5yZWdpb25zW3JdLmJ1c19zdGFydCA+PiAxMikgJiAweDAwMGZmZmZmOworCQkJcG8tPnBvdGVhciA9IDA7CisJCQlpZiAoaG9zZS0+cmVnaW9uc1tyXS5mbGFncyAmIFBDSV9SRUdJT05fSU8pCisJCQkJcG8tPnBvd2FyID0gUE9XQVJfRU4gfCBQT1dBUl9JT19SRUFEIHwgUE9XQVJfSU9fV1JJVEUgfAorCQkJCQkoX19pbG9nMihob3NlLT5yZWdpb25zW3JdLnNpemUpIC0gMSk7CisJCQllbHNlCisJCQkJcG8tPnBvd2FyID0gUE9XQVJfRU4gfCBQT1dBUl9NRU1fUkVBRCB8IFBPV0FSX01FTV9XUklURSB8CisJCQkJCShfX2lsb2cyKGhvc2UtPnJlZ2lvbnNbcl0uc2l6ZSkgLSAxKTsKKwkJCXBvKys7CisJCX0KKwl9CisKKwlwY2lfcmVnaXN0ZXJfaG9zZShob3NlKTsKKwlwY2lhdXRvX2NvbmZpZ19pbml0KGhvc2UpOwkvKiBncmFiIHBjaV97bWVtLHByZWZldGNoLGlvfSAqLworCWhvc2UtPmN1cnJlbnRfYnVzbm8gPSBob3NlLT5maXJzdF9idXNubzsKKworCXBjaS0+cGVkciA9IDB4ZmZmZmZmZmY7CQkvKiBDbGVhciBhbnkgZXJyb3JzICovCisJcGNpLT5wZWVyID0gfjB4MjAxNDA7CQkvKiBFbmFibGUgQWxsIEVycm9yIEludGVydXB0cyBleGNlcHQKKwkJCQkJICogLSBNYXN0ZXIgYWJvcnQgKHBjaSkKKwkJCQkJICogLSBNYXN0ZXIgUEVSUiAocGNpKQorCQkJCQkgKiAtIElDQ0EgKFBDSWUpCisJCQkJCSAqLworCXBjaV9ob3NlX3JlYWRfY29uZmlnX2R3b3JkIChob3NlLCBkZXYsIFBDSV9EQ1IsICZ0ZW1wMzIpOworCXRlbXAzMiB8PSAweGYwMDBlOwkJLyogc2V0IFVSUiwgRkVSLCBORkVSIChidXQgbm90IENFUikgKi8KKwlwY2lfaG9zZV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBQQ0lfRENSLCB0ZW1wMzIpOworCisJcGNpX2hvc2VfcmVhZF9jb25maWdfYnl0ZSAoaG9zZSwgZGV2LCBQQ0lfSEVBREVSX1RZUEUsICZ0ZW1wOCk7CisJYnJpZGdlID0gdGVtcDggJiBQQ0lfSEVBREVSX1RZUEVfQlJJREdFOyAvKiBCcmlkZ2UsIHN1Y2ggYXMgcGNpZSAqLworCisJaWYgKCBicmlkZ2UgKSB7CisKKwkJcGNpX2hvc2VfcmVhZF9jb25maWdfd29yZChob3NlLCBkZXYsIFBDSV9MVFNTTSwgJmx0c3NtKTsKKwkJZW5hYmxlZCA9IGx0c3NtID49IFBDSV9MVFNTTV9MMDsKKworCQlpZiAoIWVuYWJsZWQpIHsKKwkJCWRlYnVnKCIuLi4uUENJRSBsaW5rIGVycm9yLiAgU2tpcHBpbmcgc2Nhbi4iCisJCQkgICAgICAiTFRTU009MHglMDJ4XG4iLCBsdHNzbSk7CisJCQlob3NlLT5sYXN0X2J1c25vID0gaG9zZS0+Zmlyc3RfYnVzbm87CisJCQlyZXR1cm47CisJCX0KKworCQlwY2ktPnBtZV9tc2dfZGV0ID0gMHhmZmZmZmZmZjsKKwkJcGNpLT5wbWVfbXNnX2ludF9lbiA9IDB4ZmZmZmZmZmY7CisjaWZkZWYgREVCVUcKKwkJcGNpX2hvc2VfcmVhZF9jb25maWdfd29yZChob3NlLCBkZXYsIFBDSV9MU1IsICZ0ZW1wMTYpOworCQluZWdfbGlua193ID0gKHRlbXAxNiAmIDB4M2YwICkgPj4gNDsKKwkJcHJpbnRmKCIuLi5QQ0lFIExUU1NNPTB4JXgsIE5lZ290aWF0ZWQgbGluayB3aWR0aD0lZFxuIiwKKwkJICAgICAgbHRzc20sIG5lZ19saW5rX3cpOworI2VuZGlmCisJCWhvc2UtPmN1cnJlbnRfYnVzbm8rKzsgLyogU3RhcnQgc2NhbiB3aXRoIHNlY29uZGFyeSAqLworCQlwY2lhdXRvX3ByZXNjYW5fc2V0dXBfYnJpZGdlKGhvc2UsIGRldiwgaG9zZS0+Y3VycmVudF9idXNubyk7CisKKwl9CisKKwkvKiBDYWxsIHNldHVwIHRvIGFsbG9jYXRlIFBDU1JCQVIgd2luZG93ICovCisJcGNpYXV0b19zZXR1cF9kZXZpY2UoaG9zZSwgZGV2LCAxLCBob3NlLT5wY2lfbWVtLAorCQkJICAgICBob3NlLT5wY2lfcHJlZmV0Y2gsIGhvc2UtPnBjaV9pbyk7CisjaWZuZGVmIENPTkZJR19QQ0lfTk9TQ0FOCisJcHJpbnRmICgiICAgICAgICAgICAgICAgU2Nhbm5pbmcgUENJIGJ1cyAlMDJ4XG4iLCBob3NlLT5jdXJyZW50X2J1c25vKTsKKwlob3NlLT5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2Nhbl9idXMoaG9zZSxob3NlLT5jdXJyZW50X2J1c25vKTsKKworCWlmICggYnJpZGdlICkgeyAvKiB1cGRhdGUgbGltaXQgcmVncyBhbmQgc3Vib3JkaW5hdGUgYnVzbm8gKi8KKwkJcGNpYXV0b19wb3N0c2Nhbl9zZXR1cF9icmlkZ2UoaG9zZSwgZGV2LCBob3NlLT5sYXN0X2J1c25vKTsKKwl9CisjZWxzZQorCWhvc2UtPmxhc3RfYnVzbm8gPSBob3NlLT5jdXJyZW50X2J1c25vOworI2VuZGlmCisKKwkvKiBDbGVhciBhbGwgZXJyb3IgaW5kaWNhdGlvbnMgKi8KKworCXBjaS0+cG1lX21zZ19kZXQgPSAweGZmZmZmZmZmOworCXBjaS0+cGVkciA9IDB4ZmZmZmZmZmY7CisKKwlwY2lfaG9zZV9yZWFkX2NvbmZpZ193b3JkIChob3NlLCBkZXYsIFBDSV9EU1IsICZ0ZW1wMTYpOworCWlmICh0ZW1wMTYpIHsKKwkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LAorCQkJCQlQQ0lfRFNSLCAweGZmZmYpOworCX0KKworCXBjaV9ob3NlX3JlYWRfY29uZmlnX3dvcmQgKGhvc2UsIGRldiwgUENJX1NFQ19TVEFUVVMsICZ0ZW1wMTYpOworCWlmICh0ZW1wMTYpIHsKKwkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfU0VDX1NUQVRVUywgMHhmZmZmKTsKKwl9Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfRlNMX1BDSSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmNhLWlwX3N3LmMgYi9kcml2ZXJzL2luY2EtaXBfc3cuYwppbmRleCBhYjIyYjRkLi5lNGFhZWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luY2EtaXBfc3cuYworKysgYi9kcml2ZXJzL2luY2EtaXBfc3cuYwpAQCAtMjYsOCArMjYsOCBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgXAotCSYmIGRlZmluZWQoQ09ORklHX0lOQ0FfSVBfU1dJVENIKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpIFwKKwkmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIGRlZmluZWQoQ09ORklHX0lOQ0FfSVBfU1dJVENIKQogCiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjaW5jbHVkZSA8bmV0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzcDExNngtaGNkLmMgYi9kcml2ZXJzL2lzcDExNngtaGNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyYmM3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaXNwMTE2eC1oY2QuYwpAQCAtMCwwICsxLDE0MTMgQEAKKy8qCisgKiBJU1AxMTZ4IEhDRCAoSG9zdCBDb250cm9sbGVyIERyaXZlcikgZm9yIHUtYm9vdC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBSb2RvbGZvIEdpb21ldHRpIDxnaW9tZXR0aUBsaW51eC5pdD4KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IEV1cm90ZWNoIFMucC5BLiA8aW5mb0BldXJvdGVjaC5pdD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKgorICogRGVyaXZlZCBpbiBwYXJ0IGZyb20gdGhlIFNMODExIEhDRCBkcml2ZXIgInUtYm9vdC9kcml2ZXJzL3NsODExX3VzYi5jIgorICogKG9yaWdpbmFsIGNvcHlyaWdodCBtZXNzYWdlIGZvbGxvd3MpOgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNAorICogICAgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiAgICBUaGlzIGNvZGUgaXMgYmFzZWQgb24gbGludXggZHJpdmVyIGZvciBzbDgxMWhzIGNoaXAsIHNvdXJjZSBhdAorICogICAgZHJpdmVycy91c2IvaG9zdC9zbDgxMS5jOgorICoKKyAqICAgIFNMODExIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UgZHJpdmVyIGZvciBVU0IuCisgKgorICogICAgQ29weXJpZ2h0IChjKSAyMDAzLzA2LCBDb3VyYWdlIENvLiwgTHRkLgorICoKKyAqICAgIEJhc2VkIG9uOgorICogICAgICAgICAxLnVoY2kuYyBieSBMaW51cyBUb3J2YWxkcywgSm9oYW5uZXMgRXJkZmVsdCwgUmFuZHkgRHVubGFwLAorICogICAgICAgICAgIEdlb3JnIEFjaGVyLCBEZXRpIEZsaWVnbCwgVGhvbWFzIFNhaWxlciwgUm9tYW4gV2Vpc3NnYWVyYmVyLAorICogICAgICAgICAgIEFkYW0gUmljaHRlciwgR3JlZ29yeSBQLiBTbWl0aDsKKyAqICAgICAgICAgMi5PcmlnaW5hbCBTTDgxMSBkcml2ZXIgKGhjX3NsODExLm8pIGJ5IFBlaSBMaXUgPHBibEBjeXByZXNzLmNvbT4KKyAqICAgICAgICAgMy5SZXdyaXRlZCBhcyBzbDgxMS5vIGJ5IFlpbiBBaWh1YSA8eWluYWg6Y291cmFnZXRlY2guY29tLmNuPgorICoKKyAqICAgIFtbR05VL0dQTCBkaXNjbGFpbWVyXV0KKyAqCisgKiBhbmQgaW4gcGFydCBmcm9tIEFVMXgwMCBPSENJIEhDRCBkcml2ZXIgInUtYm9vdC9jcHUvbWlwcy9hdTF4MDBfdXNiX29oY2kuYyIKKyAqIChvcmlnaW5hbCBjb3B5cmlnaHQgbWVzc2FnZSBmb2xsb3dzKToKKyAqCisgKiAgICBVUkIgT0hDSSBIQ0QgKEhvc3QgQ29udHJvbGxlciBEcml2ZXIpIGZvciBVU0Igb24gdGhlIEFVMXgwMC4KKyAqCisgKiAgICAoQykgQ29weXJpZ2h0IDIwMDMKKyAqICAgIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIDxnakBkZW54LmRlPgorICoKKyAqICAgIFtbR05VL0dQTCBkaXNjbGFpbWVyXV0KKyAqCisgKiAgICBOb3RlOiBQYXJ0IG9mIHRoaXMgY29kZSBoYXMgYmVlbiBkZXJpdmVkIGZyb20gbGludXgKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfVVNCX0lTUDExNlhfSENECisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8dXNiLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisvKgorICogSVNQMTE2eCBjaGlwcyByZXF1aXJlIGNlcnRhaW4gZGVsYXlzIGJldHdlZW4gYWNjZXNzZXMgdG8gaXRzCisgKiByZWdpc3RlcnMuIFRoZSBmb2xsb3dpbmcgdGltaW5nIG9wdGlvbnMgZXhpc3QuCisgKgorICogMS4gQ29uZmlndXJlIHlvdXIgbWVtb3J5IGNvbnRyb2xsZXIgKHRoZSBiZXN0KQorICogMi4gVXNlIG5kZWxheSAoZWFzaWVzdCwgcG9vcmVzdCkuIEZvciB0aGF0LCBlbmFibGUgdGhlIGZvbGxvd2luZyBtYWNyby4KKyAqCisgKiBWYWx1ZSBpcyBpbiBtaWNyb3NlY29uZHMuCisgKi8KKyNpZmRlZiBJU1AxMTZYX0hDRF9VU0VfVURFTEFZCisjZGVmaW5lIFVERUxBWQkJMQorI2VuZGlmCisKKy8qCisgKiBPbiBzb21lIChzbG93bHk/KSBtYWNoaW5lcyBhbiBleHRyYSBkZWxheSBhZnRlciBkYXRhIHBhY2tpbmcgaW50bworICogY29udHJvbGxlcidzIEZJRk9zIGlzIHJlcXVpcmVkLCAqIG90aGVyd2lzZSB5b3UgbWF5IGdldCB0aGUgZm9sbG93aW5nCisgKiBlcnJvcjoKKyAqCisgKiAgIHVib290PiB1c2Igc3RhcnQKKyAqICAgKFJlKXN0YXJ0IFVTQi4uLgorICogICBVU0I6ICAgc2Nhbm5pbmcgYnVzIGZvciBkZXZpY2VzLi4uIGlzcDExNng6IGlzcDExNnhfc3VibWl0X2pvYjogQ1RMOlRJTUVPVVQKKyAqICAgaXNwMTE2eDogaXNwMTE2eF9zdWJtaXRfam9iOiAqKioqKiogRklGTyBub3QgcmVhZHkhICoqKioqKgorICoKKyAqICAgICAgICAgVVNCIGRldmljZSBub3QgcmVzcG9uZGluZywgZ2l2aW5nIHVwIChzdGF0dXM9NCkKKyAqICAgICAgICAgaXNwMTE2eDogaXNwMTE2eF9zdWJtaXRfam9iOiAqKioqKiogRklGTyBub3QgZW1wdHkhICoqKioqKgorICogICAgICAgICBpc3AxMTZ4OiBpc3AxMTZ4X3N1Ym1pdF9qb2I6ICoqKioqKiBGSUZPIG5vdCBlbXB0eSEgKioqKioqCisgKiAgICAgICAgIGlzcDExNng6IGlzcDExNnhfc3VibWl0X2pvYjogKioqKioqIEZJRk8gbm90IGVtcHR5ISAqKioqKioKKyAqICAgICAgICAgMyBVU0IgRGV2aWNlKHMpIGZvdW5kCisgKiAgICAgICAgICAgICAgICBzY2FubmluZyBidXMgZm9yIHN0b3JhZ2UgZGV2aWNlcy4uLiAwIFN0b3JhZ2UgRGV2aWNlKHMpIGZvdW5kCisgKgorICogVmFsdWUgaXMgaW4gbWlsbGlzZWNvbmRzLgorICovCisjaWZkZWYgSVNQMTE2WF9IQ0RfVVNFX0VYVFJBX0RFTEFZCisjZGVmaW5lIEVYVFJBX0RFTEFZCTIKKyNlbmRpZgorCisvKgorICogRW5hYmxlIHRoZSBmb2xsb3dpbmcgZGVmaW5lcyBpZiB5b3Ugd2lzaCBlbmFibGUgZGVidWdnaW5nIG1lc3NhZ2VzLgorICovCisjdW5kZWYgREVCVUcJCQkvKiBlbmFibGUgZGVidWdnaW5nIG1lc3NhZ2VzICovCisjdW5kZWYgVFJBQ0UJCQkvKiBlbmFibGUgdHJhY2luZyBjb2RlICovCisjdW5kZWYgVkVSQk9TRQkJCS8qIHZlcmJvc2UgZGVidWdnaW5nIG1lc3NhZ2VzICovCisKKyNpbmNsdWRlICJpc3AxMTZ4LmgiCisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjA4IEphbiAyMDA3Igorc3RhdGljIGNvbnN0IGNoYXIgaGNkX25hbWVbXSA9ICJpc3AxMTZ4LWhjZCI7CisKK3N0cnVjdCBpc3AxMTZ4IGlzcDExNnhfZGV2Oworc3RydWN0IGlzcDExNnhfcGxhdGZvcm1fZGF0YSBpc3AxMTZ4X2JvYXJkOworaW50IGdvdF9yaHNjID0gMDsJCS8qIHJvb3QgaHViIHN0YXR1cyBjaGFuZ2UgKi8KK3N0cnVjdCB1c2JfZGV2aWNlICpkZXZnb25lOwkvKiBkZXZpY2Ugd2hpY2ggd2FzIGRpc2Nvbm5lY3RlZCAqLworaW50IHJoX2Rldm51bSA9IDA7CQkvKiBhZGRyZXNzIG9mIFJvb3QgSHViIGVuZHBvaW50ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBBTElHTih4LGEpCSgoKHgpKyhhKS0xVUwpJn4oKGEpLTFVTCkpCisjZGVmaW5lIG1pbl90KHR5cGUseCx5KQlcCisJKHsgdHlwZSBfX3ggPSAoeCk7IHR5cGUgX195ID0gKHkpOyBfX3ggPCBfX3kgPyBfX3ggOiBfX3k7IH0pCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBpc3AxMTZ4X3Jlc2V0KHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KTsKKworLyogLS0tIERlYnVnZ2luZyBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIGlzcDExNnhfc2hvd19yZWcoZCwgcikgewkJCQlcCisJaWYgKChyKSA8IDB4MjApIHsJCQkJCVwKKwkJREJHKCIlLTEyc1slMDJ4XTogJTA4eCIsICNyLAkJCVwKKwkJCXIsIGlzcDExNnhfcmVhZF9yZWczMihkLCByKSk7CQlcCisJfSBlbHNlIHsJCQkJCQlcCisJCURCRygiJS0xMnNbJTAyeF06ICAgICAlMDR4IiwgI3IsCQlcCisJCQlyLCBpc3AxMTZ4X3JlYWRfcmVnMTYoZCwgcikpOyAgCQlcCisJfQkJCQkJCQlcCit9CisKKyNkZWZpbmUgaXNwMTE2eF9zaG93X3JlZ3MoZCkgewkJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENSRVZJU0lPTik7CQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENDT05UUk9MKTsJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENDTURTVEFUKTsJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENJTlRTVEFUKTsJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENJTlRFTkIpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ0ZNSU5UVkwpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ0ZNUkVNKTsJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENGTU5VTSk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDTFNUSFJFU0gpOwkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDUkhERVNDQSk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDUkhERVNDQik7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDUkhTVEFUVVMpOwkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDUkhQT1JUMSk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDUkhQT1JUMik7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDSFdDRkcpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ0RNQUNGRyk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDWEZFUkNUUik7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDdVBJTlQpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ3VQSU5URU5CKTsJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ0NISVBJRCk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDU0NSQVRDSCk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDSVRMQlVGTEVOKTsJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ0FUTEJVRkxFTik7CQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENCVUZTVEFUKTsJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENSRElUTDBMRU4pOwkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDUkRJVEwxTEVOKTsJCQlcCit9CisKKyNpZiBkZWZpbmVkKFRSQUNFKQorCitzdGF0aWMgaW50IGlzcDExNnhfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2KQoreworCXN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4ID0gJmlzcDExNnhfZGV2OworCisJcmV0dXJuIGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ0ZNTlVNKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJCSAgICAgaW50IGxlbiwgY2hhciAqc3RyKQoreworI2lmIGRlZmluZWQoVkVSQk9TRSkKKwlpbnQgaTsKKyNlbmRpZgorCisJREJHKCIlcyBVUkI6WyU0eF0gZGV2OiUyZCxlcDolMmQtJWMsdHlwZTolcyxsZW46JWQgc3RhdDolI2x4IiwKKwkgICAgc3RyLAorCSAgICBpc3AxMTZ4X2dldF9jdXJyZW50X2ZyYW1lX251bWJlcihkZXYpLAorCSAgICB1c2JfcGlwZWRldmljZShwaXBlKSwKKwkgICAgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwKKwkgICAgdXNiX3BpcGVvdXQocGlwZSkgPyAnTycgOiAnSScsCisJICAgIHVzYl9waXBldHlwZShwaXBlKSA8IDIgPworCSAgICAodXNiX3BpcGVpbnQocGlwZSkgPworCSAgICAgIklOVFIiIDogIklTT0MiKSA6CisJICAgICh1c2JfcGlwZWNvbnRyb2wocGlwZSkgPyAiQ1RSTCIgOiAiQlVMSyIpLCBsZW4sIGRldi0+c3RhdHVzKTsKKyNpZiBkZWZpbmVkKFZFUkJPU0UpCisJaWYgKGxlbiA+IDAgJiYgYnVmZmVyKSB7CisJCXByaW50ZihfX0ZJTEVfXyAiOiBkYXRhKCVkKToiLCBsZW4pOworCQlmb3IgKGkgPSAwOyBpIDwgMTYgJiYgaSA8IGxlbjsgaSsrKQorCQkJcHJpbnRmKCIgJTAyeCIsICgoX191OCAqKSBidWZmZXIpW2ldKTsKKwkJcHJpbnRmKCIlc1xuIiwgaSA8IGxlbiA/ICIuLi4iIDogIiIpOworCX0KKyNlbmRpZgorfQorCisjZGVmaW5lIFBURF9ESVJfU1RSKHB0ZCkgICh7Y2hhciBfX2M7CQlcCisJc3dpdGNoKFBURF9HRVRfRElSKHB0ZCkpewkJXAorCWNhc2UgMDogIF9fYyA9ICdzJzsgYnJlYWs7CQlcCisJY2FzZSAxOiAgX19jID0gJ28nOyBicmVhazsJCVwKKwlkZWZhdWx0OiBfX2MgPSAnaSc7IGJyZWFrOwkJXAorCX07IF9fYzt9KQorCisvKgorICBEdW1wIFBURCBpbmZvLiBUaGUgY29kZSBkb2N1bWVudHMgdGhlIGZvcm1hdAorICBwZXJmZWN0bHksIHJpZ2h0IDopCisqLworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfcHRkKHN0cnVjdCBwdGQgKnB0ZCkKK3sKKyNpZiBkZWZpbmVkKFZFUkJPU0UpCisJaW50IGs7CisjZW5kaWYKKworCURCRygiUFREKGV4dCkgOiBjYzoleCAlZCVjJWQgJWQsJWQsJWQgdDoleCAleCV4JXgiLAorCSAgICBQVERfR0VUX0NDKHB0ZCksCisJICAgIFBURF9HRVRfRkEocHRkKSwgUFREX0RJUl9TVFIocHRkKSwgUFREX0dFVF9FUChwdGQpLAorCSAgICBQVERfR0VUX0NPVU5UKHB0ZCksIFBURF9HRVRfTEVOKHB0ZCksIFBURF9HRVRfTVBTKHB0ZCksCisJICAgIFBURF9HRVRfVE9HR0xFKHB0ZCksCisJICAgIFBURF9HRVRfQUNUSVZFKHB0ZCksIFBURF9HRVRfU1BEKHB0ZCksIFBURF9HRVRfTEFTVChwdGQpKTsKKyNpZiBkZWZpbmVkKFZFUkJPU0UpCisJcHJpbnRmKCJpc3AxMTZ4OiAlczogUFREKGJ5dGUpOiAiLCBfX0ZVTkNUSU9OX18pOworCWZvciAoayA9IDA7IGsgPCBzaXplb2Yoc3RydWN0IHB0ZCk7ICsraykKKwkJcHJpbnRmKCIlMDJ4ICIsICgodTggKikgcHRkKVtrXSk7CisJcHJpbnRmKCJcbiIpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3B0ZF9kYXRhKHN0cnVjdCBwdGQgKnB0ZCwgdTggKiBidWYsIGludCB0eXBlKQoreworI2lmIGRlZmluZWQoVkVSQk9TRSkKKwlpbnQgazsKKworCWlmICh0eXBlID09IDAgLyogMHV0IGRhdGEgKi8gKSB7CisJCXByaW50ZigiaXNwMTE2eDogJXM6IG91dCBkYXRhOiAiLCBfX0ZVTkNUSU9OX18pOworCQlmb3IgKGsgPSAwOyBrIDwgUFREX0dFVF9MRU4ocHRkKTsgKytrKQorCQkJcHJpbnRmKCIlMDJ4ICIsICgodTggKikgYnVmKVtrXSk7CisJCXByaW50ZigiXG4iKTsKKwl9CisJaWYgKHR5cGUgPT0gMSAvKiAxbiBkYXRhICovICkgeworCQlwcmludGYoImlzcDExNng6ICVzOiBpbiBkYXRhOiAiLCBfX0ZVTkNUSU9OX18pOworCQlmb3IgKGsgPSAwOyBrIDwgUFREX0dFVF9DT1VOVChwdGQpOyArK2spCisJCQlwcmludGYoIiUwMnggIiwgKCh1OCAqKSBidWYpW2tdKTsKKwkJcHJpbnRmKCJcbiIpOworCX0KKworCWlmIChQVERfR0VUX0xBU1QocHRkKSkKKwkJREJHKCItLS0gbGFzdCBQVEQgLS0tIik7CisjZW5kaWYKK30KKworI2Vsc2UKKworI2RlZmluZSBkdW1wX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgbGVuLCBzdHIpCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBkdW1wX3BrdChkZXYsIHBpcGUsIGJ1ZmZlciwgbGVuLCBzZXR1cCwgc3RyLCBzbWFsbCkJZG8ge30gd2hpbGUgKDApCisKKyNkZWZpbmUgZHVtcF9wdGQocHRkKQkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkdW1wX3B0ZF9kYXRhKHB0ZCwgYnVmLCB0eXBlKQlkbyB7fSB3aGlsZSAoMCkKKworI2VuZGlmCisKKy8qIC0tLSBWaXJ0dWFsIFJvb3QgSHViIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogRGV2aWNlIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBfX3U4IHJvb3RfaHViX2Rldl9kZXNbXSA9IHsKKwkweDEyLAkJCS8qICBfX3U4ICBiTGVuZ3RoOyAqLworCTB4MDEsCQkJLyogIF9fdTggIGJEZXNjcmlwdG9yVHlwZTsgRGV2aWNlICovCisJMHgxMCwJCQkvKiAgX191MTYgYmNkVVNCOyB2MS4xICovCisJMHgwMSwKKwkweDA5LAkJCS8qICBfX3U4ICBiRGV2aWNlQ2xhc3M7IEhVQl9DTEFTU0NPREUgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBiRGV2aWNlU3ViQ2xhc3M7ICovCisJMHgwMCwJCQkvKiAgX191OCAgYkRldmljZVByb3RvY29sOyAqLworCTB4MDgsCQkJLyogIF9fdTggIGJNYXhQYWNrZXRTaXplMDsgOCBCeXRlcyAqLworCTB4MDAsCQkJLyogIF9fdTE2IGlkVmVuZG9yOyAqLworCTB4MDAsCisJMHgwMCwJCQkvKiAgX191MTYgaWRQcm9kdWN0OyAqLworCTB4MDAsCisJMHgwMCwJCQkvKiAgX191MTYgYmNkRGV2aWNlOyAqLworCTB4MDAsCisJMHgwMCwJCQkvKiAgX191OCAgaU1hbnVmYWN0dXJlcjsgKi8KKwkweDAxLAkJCS8qICBfX3U4ICBpUHJvZHVjdDsgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBpU2VyaWFsTnVtYmVyOyAqLworCTB4MDEJCQkvKiAgX191OCAgYk51bUNvbmZpZ3VyYXRpb25zOyAqLworfTsKKworLyogQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yICovCitzdGF0aWMgX191OCByb290X2h1Yl9jb25maWdfZGVzW10gPSB7CisJMHgwOSwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KKwkweDAyLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IENvbmZpZ3VyYXRpb24gKi8KKwkweDE5LAkJCS8qICBfX3UxNiB3VG90YWxMZW5ndGg7ICovCisJMHgwMCwKKwkweDAxLAkJCS8qICBfX3U4ICBiTnVtSW50ZXJmYWNlczsgKi8KKwkweDAxLAkJCS8qICBfX3U4ICBiQ29uZmlndXJhdGlvblZhbHVlOyAqLworCTB4MDAsCQkJLyogIF9fdTggIGlDb25maWd1cmF0aW9uOyAqLworCTB4NDAsCQkJLyogIF9fdTggIGJtQXR0cmlidXRlczsKKwkJCQkgICBCaXQgNzogQnVzLXBvd2VyZWQsIDY6IFNlbGYtcG93ZXJlZCwgNSBSZW1vdGUtd2Frd3VwLCA0Li4wOiByZXN2ZCAqLworCTB4MDAsCQkJLyogIF9fdTggIE1heFBvd2VyOyAqLworCisJLyogaW50ZXJmYWNlICovCisJMHgwOSwJCQkvKiAgX191OCAgaWZfYkxlbmd0aDsgKi8KKwkweDA0LAkJCS8qICBfX3U4ICBpZl9iRGVzY3JpcHRvclR5cGU7IEludGVyZmFjZSAqLworCTB4MDAsCQkJLyogIF9fdTggIGlmX2JJbnRlcmZhY2VOdW1iZXI7ICovCisJMHgwMCwJCQkvKiAgX191OCAgaWZfYkFsdGVybmF0ZVNldHRpbmc7ICovCisJMHgwMSwJCQkvKiAgX191OCAgaWZfYk51bUVuZHBvaW50czsgKi8KKwkweDA5LAkJCS8qICBfX3U4ICBpZl9iSW50ZXJmYWNlQ2xhc3M7IEhVQl9DTEFTU0NPREUgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBpZl9iSW50ZXJmYWNlU3ViQ2xhc3M7ICovCisJMHgwMCwJCQkvKiAgX191OCAgaWZfYkludGVyZmFjZVByb3RvY29sOyAqLworCTB4MDAsCQkJLyogIF9fdTggIGlmX2lJbnRlcmZhY2U7ICovCisKKwkvKiBlbmRwb2ludCAqLworCTB4MDcsCQkJLyogIF9fdTggIGVwX2JMZW5ndGg7ICovCisJMHgwNSwJCQkvKiAgX191OCAgZXBfYkRlc2NyaXB0b3JUeXBlOyBFbmRwb2ludCAqLworCTB4ODEsCQkJLyogIF9fdTggIGVwX2JFbmRwb2ludEFkZHJlc3M7IElOIEVuZHBvaW50IDEgKi8KKwkweDAzLAkJCS8qICBfX3U4ICBlcF9ibUF0dHJpYnV0ZXM7IEludGVycnVwdCAqLworCTB4MDAsCQkJLyogIF9fdTE2IGVwX3dNYXhQYWNrZXRTaXplOyAoKE1BWF9ST09UX1BPUlRTICsgMSkgLyA4ICovCisJMHgwMiwKKwkweGZmCQkJLyogIF9fdTggIGVwX2JJbnRlcnZhbDsgMjU1IG1zICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciByb290X2h1Yl9zdHJfaW5kZXgwW10gPSB7CisJMHgwNCwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KKwkweDAzLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IFN0cmluZy1kZXNjcmlwdG9yICovCisJMHgwOSwJCQkvKiAgX191OCAgbGFuZyBJRCAqLworCTB4MDQsCQkJLyogIF9fdTggIGxhbmcgSUQgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJvb3RfaHViX3N0cl9pbmRleDFbXSA9IHsKKwkweDIyLAkJCS8qICBfX3U4ICBiTGVuZ3RoOyAqLworCTB4MDMsCQkJLyogIF9fdTggIGJEZXNjcmlwdG9yVHlwZTsgU3RyaW5nLWRlc2NyaXB0b3IgKi8KKwknSScsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ1MnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdQJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknMScsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJzEnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSc2JywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkneCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJyAnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdSJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknbycsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ28nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSd0JywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknICcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ0gnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSd1JywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknYicsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCit9OworCisvKgorICogSHViIGNsYXNzLXNwZWNpZmljIGRlc2NyaXB0b3IgaXMgY29uc3RydWN0ZWQgZHluYW1pY2FsbHkKKyAqLworCisvKiAtLS0gVmlydHVhbCByb290IGh1YiBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgcmhfY2hlY2tfcG9ydF9zdGF0dXMoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJdTMyIHRlbXAsIG5kcCwgaTsKKwlpbnQgcmVzOworCisJcmVzID0gLTE7CisJdGVtcCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIU1RBVFVTKTsKKwluZHAgPSAodGVtcCAmIFJIX0FfTkRQKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmRwOyBpKyspIHsKKwkJdGVtcCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDEgKyBpKTsKKwkJLyogY2hlY2sgZm9yIGEgZGV2aWNlIGRpc2Nvbm5lY3QgKi8KKwkJaWYgKCgodGVtcCAmIChSSF9QU19QRVNDIHwgUkhfUFNfQ1NDKSkgPT0KKwkJICAgICAoUkhfUFNfUEVTQyB8IFJIX1BTX0NTQykpICYmICgodGVtcCAmIFJIX1BTX0NDUykgPT0gMCkpIHsKKwkJCXJlcyA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmVzOworfQorCisvKiAtLS0gSEMgbWFuYWdlbWVudCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFdyaXRlIGxlbiBieXRlcyB0byBmaWZvLCBwYWQgdGlsbCAzMi1iaXQgYm91bmRhcnkKKyAqLworc3RhdGljIHZvaWQgd3JpdGVfcHRkZGF0YV90b19maWZvKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB2b2lkICpidWYsIGludCBsZW4pCit7CisJdTggKmRwID0gKHU4ICopIGJ1ZjsKKwl1MTYgKmRwMiA9ICh1MTYgKikgYnVmOworCXUxNiB3OworCWludCBxdW90ID0gbGVuICUgNDsKKworCWlmICgodW5zaWduZWQgbG9uZylkcDIgJiAxKSB7CisJCS8qIG5vdCBhbGlnbmVkICovCisJCWZvciAoOyBsZW4gPiAxOyBsZW4gLT0gMikgeworCQkJdyA9ICpkcCsrOworCQkJdyB8PSAqZHArKyA8PCA4OworCQkJaXNwMTE2eF9yYXdfd3JpdGVfZGF0YTE2KGlzcDExNngsIHcpOworCQl9CisJCWlmIChsZW4pCisJCQlpc3AxMTZ4X3dyaXRlX2RhdGExNihpc3AxMTZ4LCAodTE2KSAqIGRwKTsKKwl9IGVsc2UgeworCQkvKiBhbGlnbmVkICovCisJCWZvciAoOyBsZW4gPiAxOyBsZW4gLT0gMikKKwkJCWlzcDExNnhfcmF3X3dyaXRlX2RhdGExNihpc3AxMTZ4LCAqZHAyKyspOworCQlpZiAobGVuKQorCQkJaXNwMTE2eF93cml0ZV9kYXRhMTYoaXNwMTE2eCwgMHhmZiAmICooKHU4ICopIGRwMikpOworCX0KKwlpZiAocXVvdCA9PSAxIHx8IHF1b3QgPT0gMikKKwkJaXNwMTE2eF9yYXdfd3JpdGVfZGF0YTE2KGlzcDExNngsIDApOworfQorCisvKiBSZWFkIGxlbiBieXRlcyBmcm9tIGZpZm8gYW5kIHRoZW4gcmVhZCB0aWxsIDMyLWJpdCBib3VuZGFyeQorICovCitzdGF0aWMgdm9pZCByZWFkX3B0ZGRhdGFfZnJvbV9maWZvKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB2b2lkICpidWYsIGludCBsZW4pCit7CisJdTggKmRwID0gKHU4ICopIGJ1ZjsKKwl1MTYgKmRwMiA9ICh1MTYgKikgYnVmOworCXUxNiB3OworCWludCBxdW90ID0gbGVuICUgNDsKKworCWlmICgodW5zaWduZWQgbG9uZylkcDIgJiAxKSB7CisJCS8qIG5vdCBhbGlnbmVkICovCisJCWZvciAoOyBsZW4gPiAxOyBsZW4gLT0gMikgeworCQkJdyA9IGlzcDExNnhfcmF3X3JlYWRfZGF0YTE2KGlzcDExNngpOworCQkJKmRwKysgPSB3ICYgMHhmZjsKKwkJCSpkcCsrID0gKHcgPj4gOCkgJiAweGZmOworCQl9CisJCWlmIChsZW4pCisJCQkqZHAgPSAweGZmICYgaXNwMTE2eF9yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwl9IGVsc2UgeworCQkvKiBhbGlnbmVkICovCisJCWZvciAoOyBsZW4gPiAxOyBsZW4gLT0gMikKKwkJCSpkcDIrKyA9IGlzcDExNnhfcmF3X3JlYWRfZGF0YTE2KGlzcDExNngpOworCQlpZiAobGVuKQorCQkJKih1OCAqKSBkcDIgPSAweGZmICYgaXNwMTE2eF9yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwl9CisJaWYgKHF1b3QgPT0gMSB8fCBxdW90ID09IDIpCisJCWlzcDExNnhfcmF3X3JlYWRfZGF0YTE2KGlzcDExNngpOworfQorCisvKiBXcml0ZSBQVEQncyBhbmQgZGF0YSBmb3Igc2NoZWR1bGVkIHRyYW5zZmVycyBpbnRvIHRoZSBmaWZvIHJhbS4KKyAqIEZpZm8gbXVzdCBiZSBlbXB0eSBhbmQgcmVhZHkgKi8KK3N0YXRpYyB2b2lkIHBhY2tfZmlmbyhzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBwaXBlLCBzdHJ1Y3QgcHRkICpwdGQsIGludCBuLCB2b2lkICpkYXRhLAorCQkgICAgICBpbnQgbGVuKQoreworCWludCBidWZsZW4gPSBuICogc2l6ZW9mKHN0cnVjdCBwdGQpICsgbGVuOworCWludCBpLCBkb25lOworCisJREJHKCItLS0gcGFjayBidWZmZXIgJXAgLSAlZCBieXRlcyAoZmlmbyAlZCkgLS0tIiwgZGF0YSwgbGVuLCBidWZsZW4pOworCisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ3VQSU5ULCBIQ3VQSU5UX0FJSUVPVCk7CisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ1hGRVJDVFIsIGJ1Zmxlbik7CisJaXNwMTE2eF93cml0ZV9hZGRyKGlzcDExNngsIEhDQVRMUE9SVCB8IElTUDExNnhfV1JJVEVfT0ZGU0VUKTsKKworCWRvbmUgPSAwOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJREJHKCJpPSVkIC0gZG9uZT0lZCAtIGxlbj0lZCIsIGksIGRvbmUsIFBURF9HRVRfTEVOKCZwdGRbaV0pKTsKKworCQlkdW1wX3B0ZCgmcHRkW2ldKTsKKwkJaXNwMTE2eF93cml0ZV9kYXRhMTYoaXNwMTE2eCwgcHRkW2ldLmNvdW50KTsKKwkJaXNwMTE2eF93cml0ZV9kYXRhMTYoaXNwMTE2eCwgcHRkW2ldLm1wcyk7CisJCWlzcDExNnhfd3JpdGVfZGF0YTE2KGlzcDExNngsIHB0ZFtpXS5sZW4pOworCQlpc3AxMTZ4X3dyaXRlX2RhdGExNihpc3AxMTZ4LCBwdGRbaV0uZmFkZHIpOworCisJCWR1bXBfcHRkX2RhdGEoJnB0ZFtpXSwgKF9fdTggKikgZGF0YSArIGRvbmUsIDApOworCQl3cml0ZV9wdGRkYXRhX3RvX2ZpZm8oaXNwMTE2eCwKKwkJCQkgICAgICAoX191OCAqKSBkYXRhICsgZG9uZSwKKwkJCQkgICAgICBQVERfR0VUX0xFTigmcHRkW2ldKSk7CisKKwkJZG9uZSArPSBQVERfR0VUX0xFTigmcHRkW2ldKTsKKwl9Cit9CisKKy8qIFJlYWQgdGhlIHByb2Nlc3NlZCBQVEQncyBhbmQgZGF0YSBmcm9tIGZpZm8gcmFtIGJhY2sgdG8gVVJCcycgYnVmZmVycy4KKyAqIEZpZm8gbXVzdCBiZSBmdWxsIGFuZCBkb25lICovCitzdGF0aWMgaW50IHVucGFja19maWZvKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBwaXBlLCBzdHJ1Y3QgcHRkICpwdGQsIGludCBuLCB2b2lkICpkYXRhLAorCQkgICAgICAgaW50IGxlbikKK3sKKwlpbnQgYnVmbGVuID0gbiAqIHNpemVvZihzdHJ1Y3QgcHRkKSArIGxlbjsKKwlpbnQgaSwgZG9uZSwgY2MsIHJldDsKKworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSEN1UElOVCwgSEN1UElOVF9BSUlFT1QpOworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSENYRkVSQ1RSLCBidWZsZW4pOworCWlzcDExNnhfd3JpdGVfYWRkcihpc3AxMTZ4LCBIQ0FUTFBPUlQpOworCisJcmV0ID0gVERfQ0NfTk9FUlJPUjsKKwlkb25lID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCURCRygiaT0lZCAtIGRvbmU9JWQgLSBsZW49JWQiLCBpLCBkb25lLCBQVERfR0VUX0xFTigmcHRkW2ldKSk7CisKKwkJcHRkW2ldLmNvdW50ID0gaXNwMTE2eF9yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwkJcHRkW2ldLm1wcyA9IGlzcDExNnhfcmVhZF9kYXRhMTYoaXNwMTE2eCk7CisJCXB0ZFtpXS5sZW4gPSBpc3AxMTZ4X3JlYWRfZGF0YTE2KGlzcDExNngpOworCQlwdGRbaV0uZmFkZHIgPSBpc3AxMTZ4X3JlYWRfZGF0YTE2KGlzcDExNngpOworCQlkdW1wX3B0ZCgmcHRkW2ldKTsKKworCQlyZWFkX3B0ZGRhdGFfZnJvbV9maWZvKGlzcDExNngsCisJCQkJICAgICAgIChfX3U4ICopIGRhdGEgKyBkb25lLAorCQkJCSAgICAgICBQVERfR0VUX0xFTigmcHRkW2ldKSk7CisJCWR1bXBfcHRkX2RhdGEoJnB0ZFtpXSwgKF9fdTggKikgZGF0YSArIGRvbmUsIDEpOworCisJCWRvbmUgKz0gUFREX0dFVF9MRU4oJnB0ZFtpXSk7CisKKwkJY2MgPSBQVERfR0VUX0NDKCZwdGRbaV0pOworCQlpZiAoY2MgPT0gVERfREFUQVVOREVSUlVOKSB7CS8qIHVuZGVycnVuIGlzIG5vIGVycm9yLi4uICovCisJCQlEQkcoImFsbG93ZWQgZGF0YSB1bmRlcnJ1biIpOworCQkJY2MgPSBURF9DQ19OT0VSUk9SOworCQl9CisJCWlmIChjYyAhPSBURF9DQ19OT0VSUk9SICYmIHJldCA9PSBURF9DQ19OT0VSUk9SKQorCQkJcmV0ID0gY2M7CisJfQorCisJREJHKCItLS0gdW5wYWNrIGJ1ZmZlciAlcCAtICVkIGJ5dGVzIChmaWZvICVkKSAtLS0iLCBkYXRhLCBsZW4sIGJ1Zmxlbik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBJbnRlcnJ1cHQgaGFuZGxpbmcKKyAqLworc3RhdGljIGludCBpc3AxMTZ4X2ludGVycnVwdChzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwl1MTYgaXJxc3RhdDsKKwl1MzIgaW50c3RhdDsKKwlpbnQgcmV0ID0gMDsKKworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSEN1UElOVEVOQiwgMCk7CisJaXJxc3RhdCA9IGlzcDExNnhfcmVhZF9yZWcxNihpc3AxMTZ4LCBIQ3VQSU5UKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlQsIGlycXN0YXQpOworCURCRygiPj4+Pj4+IGlycXN0YXQgJXggPDw8PDw8IiwgaXJxc3RhdCk7CisKKwlpZiAoaXJxc3RhdCAmIEhDdVBJTlRfQVRMKSB7CisJCURCRygiPj4+Pj4+IEhDdVBJTlRfQVRMIDw8PDw8PCIpOworCQl1ZGVsYXkoNTAwKTsKKwkJcmV0ID0gMTsKKwl9CisKKwlpZiAoaXJxc3RhdCAmIEhDdVBJTlRfT1BSKSB7CisJCWludHN0YXQgPSBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENJTlRTVEFUKTsKKwkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ0lOVFNUQVQsIGludHN0YXQpOworCQlEQkcoIj4+Pj4+PiBIQ3VQSU5UX09QUiAleCA8PDw8PDwiLCBpbnRzdGF0KTsKKworCQlpZiAoaW50c3RhdCAmIEhDSU5UX1VFKSB7CisJCQlFUlIoInVucmVjb3ZlcmFibGUgZXJyb3IsIGNvbnRyb2xsZXIgZGlzYWJsZWQiKTsKKworCQkJLyogRklYTUU6IGJlIG9wdGltaXN0aWMsIGhvcGUgdGhhdCBidWcgd29uJ3QgcmVwZWF0CisJCQkgKiBvZnRlbi4gTWFrZSBzb21lIG5vbi1pbnRlcnJ1cHQgY29udGV4dCByZXN0YXJ0IHRoZQorCQkJICogY29udHJvbGxlci4gQ291bnQgYW5kIGxpbWl0IHRoZSByZXRyaWVzIHRob3VnaDsKKwkJCSAqIGVpdGhlciBoYXJkd2FyZSBvciBzb2Z0d2FyZSBlcnJvcnMgY2FuIGdvIGZvcmV2ZXIuLi4KKwkJCSAqLworCQkJaXNwMTE2eF9yZXNldChpc3AxMTZ4KTsKKwkJCXJldCA9IC0xOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKGludHN0YXQgJiBIQ0lOVF9SSFNDKSB7CisJCQlnb3RfcmhzYyA9IDE7CisJCQlyZXQgPSAxOworCQkJLyogV2hlbiByb290IGh1YiBvciBhbnkgb2YgaXRzIHBvcnRzIGlzIGdvaW5nCisJCQkgICB0byBjb21lIG91dCBvZiBzdXNwZW5kLCBpdCBtYXkgdGFrZSBtb3JlCisJCQkgICB0aGFuIDEwbXMgZm9yIHN0YXR1cyBiaXRzIHRvIHN0YWJpbGl6ZS4gKi8KKwkJCXdhaXRfbXMoMjApOworCQl9CisKKwkJaWYgKGludHN0YXQgJiBIQ0lOVF9TTykgeworCQkJRVJSKCJzY2hlZHVsZSBvdmVycnVuIik7CisJCQlyZXQgPSAtMTsKKwkJfQorCisJCWlycXN0YXQgJj0gfkhDdVBJTlRfT1BSOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgUFREX05VTQkJCTY0CS8qIGl0IHNob3VsZCBiZSBlbm91Z3RoLi4uICovCitzdHJ1Y3QgcHRkIHB0ZFtQVERfTlVNXTsKK3N0YXRpYyBpbmxpbmUgaW50IG1heF90cmFuc2Zlcl9sZW4oc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlKQoreworCXJldHVybiBtaW4oUFREX05VTSAqIHVzYl9tYXhwYWNrZXQoZGV2LCBwaXBlKSwgUFREX05VTSAqIDE2KTsKK30KKworLyogRG8gYW4gVVNCIHRyYW5zZmVyCisgKi8KK3N0YXRpYyBpbnQgaXNwMTE2eF9zdWJtaXRfam9iKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwKKwkJCSAgICAgIGludCBkaXIsIHZvaWQgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9ICZpc3AxMTZ4X2RldjsKKwlpbnQgdHlwZSA9IHVzYl9waXBldHlwZShwaXBlKTsKKwlpbnQgZXBudW0gPSB1c2JfcGlwZWVuZHBvaW50KHBpcGUpOworCWludCBtYXggPSB1c2JfbWF4cGFja2V0KGRldiwgcGlwZSk7CisJaW50IGRpcl9vdXQgPSB1c2JfcGlwZW91dChwaXBlKTsKKwlpbnQgc3BlZWRfbG93ID0gdXNiX3BpcGVzbG93KHBpcGUpOworCWludCBpLCBkb25lLCBzdGF0LCB0aW1lb3V0LCBjYzsKKwlpbnQgcmV0cmllcyA9IDEwOworCisJREJHKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwlkdW1wX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgbGVuLCAiU1VCTUlUIik7CisJREJHKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKworCWlmIChpc3AxMTZ4LT5kaXNhYmxlZCkgeworCQlFUlIoIkVQSVBFIik7CisJCWRldi0+c3RhdHVzID0gVVNCX1NUX0NSQ19FUlI7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBkZXZpY2UgcHVsbGVkPyBTaG9ydGN1dCB0aGUgYWN0aW9uLiAqLworCWlmIChkZXZnb25lID09IGRldikgeworCQlFUlIoIkVOT0RFViIpOworCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9DUkNfRVJSOworCQlyZXR1cm4gVVNCX1NUX0NSQ19FUlI7CisJfQorCisJaWYgKCFtYXgpIHsKKwkJRVJSKCJwaXBlc2l6ZSBmb3IgcGlwZSAlbHggaXMgemVybyIsIHBpcGUpOworCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9DUkNfRVJSOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHR5cGUgPT0gUElQRV9JU09DSFJPTk9VUykgeworCQlFUlIoImlzb2Nocm9ub3VzIHRyYW5zZmVycyBub3Qgc3VwcG9ydGVkIik7CisJCWRldi0+c3RhdHVzID0gVVNCX1NUX0NSQ19FUlI7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBGSUZPIG5vdCBlbXB0eT8gKi8KKwlpZiAoaXNwMTE2eF9yZWFkX3JlZzE2KGlzcDExNngsIEhDQlVGU1RBVCkgJiBIQ0JVRlNUQVRfQVRMX0ZVTEwpIHsKKwkJRVJSKCIqKioqKiogRklGTyBub3QgZW1wdHkhICoqKioqKiIpOworCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9CVUZfRVJSOworCQlyZXR1cm4gLTE7CisJfQorCisgICAgICByZXRyeToKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDSU5UU1RBVCwgMHhmZik7CisKKwkvKiBQcmVwYXJlIHRoZSBQVEQgZGF0YSAqLworCWRvbmUgPSAwOworCWkgPSAwOworCWRvIHsKKwkJcHRkW2ldLmNvdW50ID0gUFREX0NDX01TSyB8IFBURF9BQ1RJVkVfTVNLIHwKKwkJICAgIFBURF9UT0dHTEUodXNiX2dldHRvZ2dsZShkZXYsIGVwbnVtLCBkaXJfb3V0KSk7CisJCXB0ZFtpXS5tcHMgPSBQVERfTVBTKG1heCkgfCBQVERfU1BEKHNwZWVkX2xvdykgfCBQVERfRVAoZXBudW0pOworCQlwdGRbaV0ubGVuID0gUFREX0xFTihtYXggPiBsZW4gLSBkb25lID8gbGVuIC0gZG9uZSA6IG1heCkgfAorCQkgICAgUFREX0RJUihkaXIpOworCQlwdGRbaV0uZmFkZHIgPSBQVERfRkEodXNiX3BpcGVkZXZpY2UocGlwZSkpOworCisJCXVzYl9kb3RvZ2dsZShkZXYsIGVwbnVtLCBkaXJfb3V0KTsKKwkJZG9uZSArPSBQVERfR0VUX0xFTigmcHRkW2ldKTsKKwkJaSsrOworCQlpZiAoaSA+PSBQVERfTlVNKSB7CisJCQlFUlIoIioqKioqKiBDYW5ub3QgcGFjayBidWZmZXIhICoqKioqKiIpOworCQkJZGV2LT5zdGF0dXMgPSBVU0JfU1RfQlVGX0VSUjsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0gd2hpbGUgKGRvbmUgPCBsZW4pOworCXB0ZFtpIC0gMV0ubXBzIHw9IFBURF9MQVNUX01TSzsKKworCS8qIFBhY2sgZGF0YSBpbnRvIEZJRk8gcmFtICovCisJcGFja19maWZvKGlzcDExNngsIGRldiwgcGlwZSwgcHRkLCBpLCBidWZmZXIsIGxlbik7CisjaWZkZWYgRVhUUkFfREVMQVkKKwl3YWl0X21zKEVYVFJBX0RFTEFZKTsKKyNlbmRpZgorCisJLyogU3RhcnQgdGhlIGRhdGEgdHJhbnNmZXIgKi8KKworCS8qIEFsbG93IG1vcmUgdGltZSBmb3IgYSBCVUxLIGRldmljZSB0byByZWFjdCAtIHNvbWUgYXJlIHNsb3cgKi8KKwlpZiAodXNiX3BpcGV0eXBlKHBpcGUpID09IFBJUEVfQlVMSykKKwkJdGltZW91dCA9IDUwMDA7CisJZWxzZQorCQl0aW1lb3V0ID0gMTAwOworCisJLyogV2FpdCBmb3IgaXQgdG8gY29tcGxldGUgKi8KKwlmb3IgKDs7KSB7CisJCS8qIENoZWNrIHdoZXRoZXIgdGhlIGNvbnRyb2xsZXIgaXMgZG9uZSAqLworCQlzdGF0ID0gaXNwMTE2eF9pbnRlcnJ1cHQoaXNwMTE2eCk7CisKKwkJaWYgKHN0YXQgPCAwKSB7CisJCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9DUkNfRVJSOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHN0YXQgPiAwKQorCQkJYnJlYWs7CisKKwkJLyogQ2hlY2sgdGhlIHRpbWVvdXQgKi8KKwkJaWYgKC0tdGltZW91dCkKKwkJCXVkZWxheSgxKTsKKwkJZWxzZSB7CisJCQlFUlIoIkNUTDpUSU1FT1VUICIpOworCQkJc3RhdCA9IFVTQl9TVF9DUkNfRVJSOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBXZSBnb3QgYW4gUm9vdCBIdWIgU3RhdHVzIENoYW5nZSBpbnRlcnJ1cHQgKi8KKwlpZiAoZ290X3Joc2MpIHsKKwkJaXNwMTE2eF9zaG93X3JlZ3MoaXNwMTE2eCk7CisKKwkJZ290X3Joc2MgPSAwOworCisJCS8qIEFidXNlIHRpbWVvdXQgKi8KKwkJdGltZW91dCA9IHJoX2NoZWNrX3BvcnRfc3RhdHVzKGlzcDExNngpOworCQlpZiAodGltZW91dCA+PSAwKSB7CisJCQkvKgorCQkJICogRklYTUUhIE5PVEUhIEFBQUFSR0ghCisJCQkgKiBUaGlzIGlzIHBvdGVudGlhbGx5IGRhbmdlcm91cyBiZWNhdXNlIGl0IGFzc3VtZXMKKwkJCSAqIHRoYXQgb25seSBvbmUgZGV2aWNlIGlzIGV2ZXIgcGx1Z2dlZCBpbiEKKwkJCSAqLworCQkJZGV2Z29uZSA9IGRldjsKKwkJfQorCX0KKworCS8qIE9rLCBub3cgd2UgY2FuIHJlYWQgdHJhbnNmZXIgc3RhdHVzICovCisKKwkvKiBGSUZPIG5vdCByZWFkeT8gKi8KKwlpZiAoIShpc3AxMTZ4X3JlYWRfcmVnMTYoaXNwMTE2eCwgSENCVUZTVEFUKSAmIEhDQlVGU1RBVF9BVExfRE9ORSkpIHsKKwkJRVJSKCIqKioqKiogRklGTyBub3QgcmVhZHkhICoqKioqKiIpOworCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9CVUZfRVJSOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVW5wYWNrIGRhdGEgZnJvbSBGSUZPIHJhbSAqLworCWNjID0gdW5wYWNrX2ZpZm8oaXNwMTE2eCwgZGV2LCBwaXBlLCBwdGQsIGksIGJ1ZmZlciwgbGVuKTsKKworCS8qIE1tbS4uLiBzb21ldGltZSB3ZSBnZXQgMHgwZiBhcyBjYyB3aGljaCBpcyBhIG5vbiBzZW5zZSEKKwkgKiBKdXN0IHJldHJ5IHRoZSB0cmFuc2Zlci4uLgorCSAqLworCWlmIChjYyA9PSAweDBmICYmIHJldHJpZXMtLSA+IDApIHsKKwkJdXNiX2RvdG9nZ2xlKGRldiwgZXBudW0sIGRpcl9vdXQpOworCQlnb3RvIHJldHJ5OworCX0KKworCWlmIChjYyAhPSBURF9DQ19OT0VSUk9SKSB7CisJCURCRygiKioqKioqIGNvbXBsZXRpdGlvbiBjb2RlIGVycm9yICV4ICoqKioqKiIsIGNjKTsKKwkJc3dpdGNoIChjYykgeworCQljYXNlIFREX0NDX0JJVFNUVUZGSU5HOgorCQkJZGV2LT5zdGF0dXMgPSBVU0JfU1RfQklUX0VSUjsKKwkJCWJyZWFrOworCQljYXNlIFREX0NDX1NUQUxMOgorCQkJZGV2LT5zdGF0dXMgPSBVU0JfU1RfU1RBTExFRDsKKwkJCWJyZWFrOworCQljYXNlIFREX0JVRkZFUk9WRVJSVU46CisJCWNhc2UgVERfQlVGRkVSVU5ERVJSVU46CisJCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9CVUZfRVJSOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9DUkNfRVJSOworCQl9CisJCXJldHVybiAtY2M7CisJfQorCisJZHVtcF9tc2coZGV2LCBwaXBlLCBidWZmZXIsIGxlbiwgIlNVQk1JVChyZXQpIik7CisKKwlkZXYtPnN0YXR1cyA9IDA7CisJcmV0dXJuIGRvbmU7Cit9CisKKy8qIEFkYXB0ZWQgZnJvbSBhdTF4MDBfdXNiX29oY2kuYworICovCitzdGF0aWMgaW50IGlzcDExNnhfc3VibWl0X3JoX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsCisJCQkJIHZvaWQgKmJ1ZmZlciwgaW50IHRyYW5zZmVyX2xlbiwKKwkJCQkgc3RydWN0IGRldnJlcXVlc3QgKmNtZCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9ICZpc3AxMTZ4X2RldjsKKwl1MzIgdG1wID0gMDsKKworCWludCBsZW5pID0gdHJhbnNmZXJfbGVuOworCWludCBsZW4gPSAwOworCWludCBzdGF0ID0gMDsKKwl1MzIgZGF0YWJbNF07CisJdTggKmRhdGFfYnVmID0gKHU4ICopIGRhdGFiOworCXUxNiBibVJUeXBlX2JSZXE7CisJdTE2IHdWYWx1ZTsKKwl1MTYgd0luZGV4OworCXUxNiB3TGVuZ3RoOworCisJaWYgKChwaXBlICYgUElQRV9JTlRFUlJVUFQpID09IFBJUEVfSU5URVJSVVBUKSB7CisJCUlORk8oIlJvb3QtSHViIHN1Ym1pdCBJUlE6IE5PVCBpbXBsZW1lbnRlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlibVJUeXBlX2JSZXEgPSBjbWQtPnJlcXVlc3R0eXBlIHwgKGNtZC0+cmVxdWVzdCA8PCA4KTsKKwl3VmFsdWUgPSBzd2FwXzE2KGNtZC0+dmFsdWUpOworCXdJbmRleCA9IHN3YXBfMTYoY21kLT5pbmRleCk7CisJd0xlbmd0aCA9IHN3YXBfMTYoY21kLT5sZW5ndGgpOworCisJREJHKCItLS0gSFVCIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwlEQkcoInN1Ym1pdCByaCB1cmIsIHJlcT0leCB2YWw9JSN4IGluZGV4PSUjeCBsZW49JWQiLAorCSAgICBibVJUeXBlX2JSZXEsIHdWYWx1ZSwgd0luZGV4LCB3TGVuZ3RoKTsKKwlkdW1wX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCAiUkgiKTsKKwlEQkcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCisJc3dpdGNoIChibVJUeXBlX2JSZXEpIHsKKwljYXNlIFJIX0dFVF9TVEFUVVM6CisJCURCRygiUkhfR0VUX1NUQVRVUyIpOworCisJCSooX191MTYgKikgZGF0YV9idWYgPSBzd2FwXzE2KDEpOworCQlsZW4gPSAyOworCQlicmVhazsKKworCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX0lOVEVSRkFDRToKKwkJREJHKCJSSF9HRVRfU1RBVFVTIHwgUkhfSU5URVJGQUNFIik7CisKKwkJKihfX3UxNiAqKSBkYXRhX2J1ZiA9IHN3YXBfMTYoMCk7CisJCWxlbiA9IDI7CisJCWJyZWFrOworCisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfRU5EUE9JTlQ6CisJCURCRygiUkhfR0VUX1NUQVRVUyB8IFJIX0VORFBPSU5UIik7CisKKwkJKihfX3UxNiAqKSBkYXRhX2J1ZiA9IHN3YXBfMTYoMCk7CisJCWxlbiA9IDI7CisJCWJyZWFrOworCisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfQ0xBU1M6CisJCURCRygiUkhfR0VUX1NUQVRVUyB8IFJIX0NMQVNTIik7CisKKwkJdG1wID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhTVEFUVVMpOworCisJCSooX191MzIgKikgZGF0YV9idWYgPSBzd2FwXzMyKHRtcCAmIH4oUkhfSFNfQ1JXRSB8IFJIX0hTX0RSV0UpKTsKKwkJbGVuID0gNDsKKwkJYnJlYWs7CisKKwljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9PVEhFUiB8IFJIX0NMQVNTOgorCQlEQkcoIlJIX0dFVF9TVEFUVVMgfCBSSF9PVEhFUiB8IFJIX0NMQVNTIik7CisKKwkJdG1wID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSArIHdJbmRleCAtIDEpOworCQkqKF9fdTMyICopIGRhdGFfYnVmID0gc3dhcF8zMih0bXApOworCQlpc3AxMTZ4X3Nob3dfcmVncyhpc3AxMTZ4KTsKKwkJbGVuID0gNDsKKwkJYnJlYWs7CisKKwljYXNlIFJIX0NMRUFSX0ZFQVRVUkUgfCBSSF9FTkRQT0lOVDoKKwkJREJHKCJSSF9DTEVBUl9GRUFUVVJFIHwgUkhfRU5EUE9JTlQiKTsKKworCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIFJIX0VORFBPSU5UX1NUQUxMOgorCQkJREJHKCJDX0hVQl9FTkRQT0lOVF9TVEFMTCIpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfQ0xBU1M6CisJCURCRygiUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX0NMQVNTIik7CisKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSBSSF9DX0hVQl9MT0NBTF9QT1dFUjoKKwkJCURCRygiQ19IVUJfTE9DQUxfUE9XRVIiKTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFJIX0NfSFVCX09WRVJfQ1VSUkVOVDoKKwkJCURCRygiQ19IVUJfT1ZFUl9DVVJSRU5UIik7CisJCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhTVEFUVVMsIFJIX0hTX09DSUMpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJREJHKCJSSF9DTEVBUl9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUyIpOworCisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgUkhfUE9SVF9FTkFCTEU6CisJCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSArIHdJbmRleCAtIDEsCisJCQkJCSAgICBSSF9QU19DQ1MpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkhfUE9SVF9TVVNQRU5EOgorCQkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDEgKyB3SW5kZXggLSAxLAorCQkJCQkgICAgUkhfUFNfUE9DSSk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBSSF9QT1JUX1BPV0VSOgorCQkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDEgKyB3SW5kZXggLSAxLAorCQkJCQkgICAgUkhfUFNfTFNEQSk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBSSF9DX1BPUlRfQ09OTkVDVElPTjoKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX0NTQyk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBSSF9DX1BPUlRfRU5BQkxFOgorCQkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDEgKyB3SW5kZXggLSAxLAorCQkJCQkgICAgUkhfUFNfUEVTQyk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBSSF9DX1BPUlRfU1VTUEVORDoKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX1BTU0MpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkhfQ19QT1JUX09WRVJfQ1VSUkVOVDoKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX1BPQ0kpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkhfQ19QT1JUX1JFU0VUOgorCQkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDEgKyB3SW5kZXggLSAxLAorCQkJCQkgICAgUkhfUFNfUFJTQyk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUVSUigiaW52YWxpZCB3VmFsdWUiKTsKKwkJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKKwkJfQorCisJCWlzcDExNnhfc2hvd19yZWdzKGlzcDExNngpOworCisJCWJyZWFrOworCisJY2FzZSBSSF9TRVRfRkVBVFVSRSB8IFJIX09USEVSIHwgUkhfQ0xBU1M6CisJCURCRygiUkhfU0VUX0ZFQVRVUkUgfCBSSF9PVEhFUiB8IFJIX0NMQVNTIik7CisKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSBSSF9QT1JUX1NVU1BFTkQ6CisJCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSArIHdJbmRleCAtIDEsCisJCQkJCSAgICBSSF9QU19QU1MpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkhfUE9SVF9SRVNFVDoKKwkJCS8qIFNwaW4gdW50aWwgYW55IGN1cnJlbnQgcmVzZXQgZmluaXNoZXMgKi8KKwkJCXdoaWxlICgxKSB7CisJCQkJdG1wID0KKwkJCQkgICAgaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsCisJCQkJCQkgICAgICAgSENSSFBPUlQxICsgd0luZGV4IC0gMSk7CisJCQkJaWYgKCEodG1wICYgUkhfUFNfUFJTKSkKKwkJCQkJYnJlYWs7CisJCQkJd2FpdF9tcygxKTsKKwkJCX0KKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX1BSUyk7CisJCQl3YWl0X21zKDEwKTsKKworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkhfUE9SVF9QT1dFUjoKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX1BQUyk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBSSF9QT1JUX0VOQUJMRToKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX1BFUyk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUVSUigiaW52YWxpZCB3VmFsdWUiKTsKKwkJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKKwkJfQorCisJCWlzcDExNnhfc2hvd19yZWdzKGlzcDExNngpOworCisJCWJyZWFrOworCisJY2FzZSBSSF9TRVRfQUREUkVTUzoKKwkJREJHKCJSSF9TRVRfQUREUkVTUyIpOworCisJCXJoX2Rldm51bSA9IHdWYWx1ZTsKKwkJbGVuID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFJIX0dFVF9ERVNDUklQVE9SOgorCQlEQkcoIlJIX0dFVF9ERVNDUklQVE9SOiAleCwgJWQiLCB3VmFsdWUsIHdMZW5ndGgpOworCisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgKFVTQl9EVF9ERVZJQ0UgPDwgOCk6CS8qIGRldmljZSBkZXNjcmlwdG9yICovCisJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJICAgIGxlbmksIG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJCXNpemVvZihyb290X2h1Yl9kZXZfZGVzKSwKKwkJCQkJCXdMZW5ndGgpKTsKKwkJCWRhdGFfYnVmID0gcm9vdF9odWJfZGV2X2RlczsKKwkJCWJyZWFrOworCisJCWNhc2UgKFVTQl9EVF9DT05GSUcgPDwgOCk6CS8qIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciAqLworCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCSAgICBsZW5pLCBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQlzaXplb2Yocm9vdF9odWJfY29uZmlnX2RlcyksCisJCQkJCQl3TGVuZ3RoKSk7CisJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX2NvbmZpZ19kZXM7CisJCQlicmVhazsKKworCQljYXNlICgoVVNCX0RUX1NUUklORyA8PCA4KSB8IDB4MDApOgkvKiBzdHJpbmcgMCBkZXNjcmlwdG9ycyAqLworCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCSAgICBsZW5pLCBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQlzaXplb2Yocm9vdF9odWJfc3RyX2luZGV4MCksCisJCQkJCQl3TGVuZ3RoKSk7CisJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX3N0cl9pbmRleDA7CisJCQlicmVhazsKKworCQljYXNlICgoVVNCX0RUX1NUUklORyA8PCA4KSB8IDB4MDEpOgkvKiBzdHJpbmcgMSBkZXNjcmlwdG9ycyAqLworCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCSAgICBsZW5pLCBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQlzaXplb2Yocm9vdF9odWJfc3RyX2luZGV4MSksCisJCQkJCQl3TGVuZ3RoKSk7CisJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX3N0cl9pbmRleDE7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJRVJSKCJpbnZhbGlkIHdWYWx1ZSIpOworCQkJc3RhdCA9IFVTQl9TVF9TVEFMTEVEOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFJIX0dFVF9ERVNDUklQVE9SIHwgUkhfQ0xBU1M6CisJCURCRygiUkhfR0VUX0RFU0NSSVBUT1IgfCBSSF9DTEFTUyIpOworCisJCXRtcCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIREVTQ0EpOworCisJCWRhdGFfYnVmWzBdID0gMHgwOTsJLyogbWluIGxlbmd0aDsgKi8KKwkJZGF0YV9idWZbMV0gPSAweDI5OworCQlkYXRhX2J1ZlsyXSA9IHRtcCAmIFJIX0FfTkRQOworCQlkYXRhX2J1ZlszXSA9IDA7CisJCWlmICh0bXAgJiBSSF9BX1BTTSkJLyogcGVyLXBvcnQgcG93ZXIgc3dpdGNoaW5nPyAqLworCQkJZGF0YV9idWZbM10gfD0gMHgwMTsKKwkJaWYgKHRtcCAmIFJIX0FfTk9DUCkJLyogbm8gb3ZlcmN1cnJlbnQgcmVwb3J0aW5nPyAqLworCQkJZGF0YV9idWZbM10gfD0gMHgxMDsKKwkJZWxzZSBpZiAodG1wICYgUkhfQV9PQ1BNKQkvKiBwZXItcG9ydCBvdmVyY3VycmVudCByZXA/ICovCisJCQlkYXRhX2J1ZlszXSB8PSAweDA4OworCisJCS8qIENvcnJlc3BvbmRzIHRvIGRhdGFfYnVmWzQtN10gKi8KKwkJZGF0YWJbMV0gPSAwOworCQlkYXRhX2J1Zls1XSA9ICh0bXAgJiBSSF9BX1BPVFBHVCkgPj4gMjQ7CisKKwkJdG1wID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhERVNDQik7CisKKwkJZGF0YV9idWZbN10gPSB0bXAgJiBSSF9CX0RSOworCQlpZiAoZGF0YV9idWZbMl0gPCA3KQorCQkJZGF0YV9idWZbOF0gPSAweGZmOworCQllbHNlIHsKKwkJCWRhdGFfYnVmWzBdICs9IDI7CisJCQlkYXRhX2J1Zls4XSA9ICh0bXAgJiBSSF9CX0RSKSA+PiA4OworCQkJZGF0YV9idWZbMTBdID0gZGF0YV9idWZbOV0gPSAweGZmOworCQl9CisKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW5pLAorCQkJICAgIG1pbl90KHVuc2lnbmVkIGludCwgZGF0YV9idWZbMF0sIHdMZW5ndGgpKTsKKwkJYnJlYWs7CisKKwljYXNlIFJIX0dFVF9DT05GSUdVUkFUSU9OOgorCQlEQkcoIlJIX0dFVF9DT05GSUdVUkFUSU9OIik7CisKKwkJKihfX3U4ICopIGRhdGFfYnVmID0gMHgwMTsKKwkJbGVuID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFJIX1NFVF9DT05GSUdVUkFUSU9OOgorCQlEQkcoIlJIX1NFVF9DT05GSUdVUkFUSU9OIik7CisKKwkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIU1RBVFVTLCBSSF9IU19MUFNDKTsKKwkJbGVuID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlFUlIoIioqKiAqKiogKioqIHVuc3VwcG9ydGVkIHJvb3QgaHViIGNvbW1hbmQgKioqICoqKiAqKioiKTsKKwkJc3RhdCA9IFVTQl9TVF9TVEFMTEVEOworCX0KKworCWxlbiA9IG1pbl90KGludCwgbGVuLCBsZW5pKTsKKwlpZiAoYnVmZmVyICE9IGRhdGFfYnVmKQorCQltZW1jcHkoYnVmZmVyLCBkYXRhX2J1ZiwgbGVuKTsKKworCWRldi0+YWN0X2xlbiA9IGxlbjsKKwlkZXYtPnN0YXR1cyA9IHN0YXQ7CisJREJHKCJkZXYgYWN0X2xlbiAlZCwgc3RhdHVzICVkIiwgZGV2LT5hY3RfbGVuLCBkZXYtPnN0YXR1cyk7CisKKwlkdW1wX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCAiUkgocmV0KSIpOworCisJcmV0dXJuIHN0YXQ7Cit9CisKKy8qIC0tLSBUcmFuc2ZlciBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IHN1Ym1pdF9pbnRfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAorCQkgICBpbnQgbGVuLCBpbnQgaW50ZXJ2YWwpCit7CisJREJHKCJkZXY9JXAgcGlwZT0lI2x4IGJ1Zj0lcCBzaXplPSVkIGludD0lZCIsCisJICAgIGRldiwgcGlwZSwgYnVmZmVyLCBsZW4sIGludGVydmFsKTsKKworCXJldHVybiAtMTsKK30KKworaW50IHN1Ym1pdF9jb250cm9sX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKKwkJICAgICAgIGludCBsZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICpzZXR1cCkKK3sKKwlpbnQgZGV2bnVtID0gdXNiX3BpcGVkZXZpY2UocGlwZSk7CisJaW50IGVwbnVtID0gdXNiX3BpcGVlbmRwb2ludChwaXBlKTsKKwlpbnQgbWF4ID0gbWF4X3RyYW5zZmVyX2xlbihkZXYsIHBpcGUpOworCWludCBkaXJfaW4gPSB1c2JfcGlwZWluKHBpcGUpOworCWludCBkb25lLCByZXQ7CisKKwkvKiBDb250cm9sIG1lc3NhZ2UgaXMgZm9yIHRoZSBIVUI/ICovCisJaWYgKGRldm51bSA9PSByaF9kZXZudW0pCisJCXJldHVybiBpc3AxMTZ4X3N1Ym1pdF9yaF9tc2coZGV2LCBwaXBlLCBidWZmZXIsIGxlbiwgc2V0dXApOworCisJLyogT2ssIG5vIEhVQiBtZXNzYWdlIHNvIHNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIGRldmljZSAqLworCisJLyogU2V0dXAgcGhhc2UgKi8KKwlEQkcoIi0tLSBTRVRVUCBQSEFTRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCXVzYl9zZXR0b2dnbGUoZGV2LCBlcG51bSwgMSwgMCk7CisJcmV0ID0gaXNwMTE2eF9zdWJtaXRfam9iKGRldiwgcGlwZSwKKwkJCQkgUFREX0RJUl9TRVRVUCwKKwkJCQkgc2V0dXAsIHNpemVvZihzdHJ1Y3QgZGV2cmVxdWVzdCkpOworCWlmIChyZXQgPCAwKSB7CisJCURCRygiY29udHJvbCBzZXR1cCBwaGFzZSBlcnJvciAocmV0ID0gJWQiLCByZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogRGF0YSBwaGFzZSAqLworCURCRygiLS0tIERBVEEgUEhBU0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJZG9uZSA9IDA7CisJdXNiX3NldHRvZ2dsZShkZXYsIGVwbnVtLCAhZGlyX2luLCAxKTsKKwl3aGlsZSAoZG9uZSA8IGxlbikgeworCQlyZXQgPSBpc3AxMTZ4X3N1Ym1pdF9qb2IoZGV2LCBwaXBlLAorCQkJCQkgZGlyX2luID8gUFREX0RJUl9JTiA6IFBURF9ESVJfT1VULAorCQkJCQkgKF9fdTggKikgYnVmZmVyICsgZG9uZSwKKwkJCQkJIG1heCA+IGxlbiAtIGRvbmUgPyBsZW4gLSBkb25lIDogbWF4KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCURCRygiY29udHJvbCBkYXRhIHBoYXNlIGVycm9yIChyZXQgPSAlZCkiLCByZXQpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWRvbmUgKz0gcmV0OworCisJCWlmIChkaXJfaW4gJiYgcmV0IDwgbWF4KQkvKiBzaG9ydCBwYWNrZXQgKi8KKwkJCWJyZWFrOworCX0KKworCS8qIFN0YXR1cyBwaGFzZSAqLworCURCRygiLS0tIFNUQVRVUyBQSEFTRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJdXNiX3NldHRvZ2dsZShkZXYsIGVwbnVtLCAhZGlyX2luLCAxKTsKKwlyZXQgPSBpc3AxMTZ4X3N1Ym1pdF9qb2IoZGV2LCBwaXBlLAorCQkJCSAhZGlyX2luID8gUFREX0RJUl9JTiA6IFBURF9ESVJfT1VULCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlEQkcoImNvbnRyb2wgc3RhdHVzIHBoYXNlIGVycm9yIChyZXQgPSAlZCIsIHJldCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlkZXYtPmFjdF9sZW4gPSBkb25lOworCisJZHVtcF9tc2coZGV2LCBwaXBlLCBidWZmZXIsIGxlbiwgIkRFVihyZXQpIik7CisKKwlyZXR1cm4gZG9uZTsKK30KKworaW50IHN1Ym1pdF9idWxrX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKKwkJICAgIGludCBsZW4pCit7CisJaW50IGRpcl9vdXQgPSB1c2JfcGlwZW91dChwaXBlKTsKKwlpbnQgbWF4ID0gbWF4X3RyYW5zZmVyX2xlbihkZXYsIHBpcGUpOworCWludCBkb25lLCByZXQ7CisKKwlEQkcoIi0tLSBCVUxLIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCURCRygiZGV2PSVsZCBwaXBlPSVsZCBidWY9JXAgc2l6ZT0lZCBkaXJfb3V0PSVkIiwKKwkgICAgdXNiX3BpcGVkZXZpY2UocGlwZSksIHVzYl9waXBlZW5kcG9pbnQocGlwZSksIGJ1ZmZlciwgbGVuLCBkaXJfb3V0KTsKKworCWRvbmUgPSAwOworCXdoaWxlIChkb25lIDwgbGVuKSB7CisJCXJldCA9IGlzcDExNnhfc3VibWl0X2pvYihkZXYsIHBpcGUsCisJCQkJCSAhZGlyX291dCA/IFBURF9ESVJfSU4gOiBQVERfRElSX09VVCwKKwkJCQkJIChfX3U4ICopIGJ1ZmZlciArIGRvbmUsCisJCQkJCSBtYXggPiBsZW4gLSBkb25lID8gbGVuIC0gZG9uZSA6IG1heCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlEQkcoImVycm9yIG9uIGJ1bGsgbWVzc2FnZSAocmV0ID0gJWQpIiwgcmV0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWRvbmUgKz0gcmV0OworCisJCWlmICghZGlyX291dCAmJiByZXQgPCBtYXgpCS8qIHNob3J0IHBhY2tldCAqLworCQkJYnJlYWs7CisJfQorCisJZGV2LT5hY3RfbGVuID0gZG9uZTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0gQmFzaWMgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgaXNwMTE2eF9zd19yZXNldChzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwlpbnQgcmV0cmllcyA9IDE1OworCWludCByZXQgPSAwOworCisJREJHKCIiKTsKKworCWlzcDExNngtPmRpc2FibGVkID0gMTsKKworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSENTV1JFUywgSENTV1JFU19NQUdJQyk7CisJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ0NNRFNUQVQsIEhDQ01EU1RBVF9IQ1IpOworCXdoaWxlICgtLXJldHJpZXMpIHsKKwkJLyogSXQgdXN1YWxseSByZXNldHMgd2l0aGluIDEgbXMgKi8KKwkJd2FpdF9tcygxKTsKKwkJaWYgKCEoaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDQ01EU1RBVCkgJiBIQ0NNRFNUQVRfSENSKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoIXJldHJpZXMpIHsKKwkJRVJSKCJzb2Z0d2FyZSByZXNldCB0aW1lb3V0Iik7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlzcDExNnhfcmVzZXQoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJdW5zaWduZWQgbG9uZyB0OworCXUxNiBjbGtyZHkgPSAwOworCWludCByZXQsIHRpbWVvdXQgPSAxNSAvKiBtcyAqLyA7CisKKwlEQkcoIiIpOworCisJcmV0ID0gaXNwMTE2eF9zd19yZXNldChpc3AxMTZ4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yICh0ID0gMDsgdCA8IHRpbWVvdXQ7IHQrKykgeworCQljbGtyZHkgPSBpc3AxMTZ4X3JlYWRfcmVnMTYoaXNwMTE2eCwgSEN1UElOVCkgJiBIQ3VQSU5UX0NMS1JEWTsKKwkJaWYgKGNsa3JkeSkKKwkJCWJyZWFrOworCQl3YWl0X21zKDEpOworCX0KKwlpZiAoIWNsa3JkeSkgeworCQlFUlIoImNsb2NrIG5vdCByZWFkeSBhZnRlciAlZG1zIiwgdGltZW91dCk7CisJCS8qIEFmdGVyIHN3X3Jlc2V0IHRoZSBjbG9jayB3b24ndCByZXBvcnQgdG8gYmUgcmVhZHksIGlmCisJCSAgIEhfV0FLRVVQIHBpbiBpcyBoaWdoLiAqLworCQlFUlIoInBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgSF9XQUtFVVAgcGluIGlzIHB1bGxlZCBsb3chIik7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpc3AxMTZ4X3N0b3Aoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJdTMyIHZhbDsKKworCURCRygiIik7CisKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlRFTkIsIDApOworCisJLyogU3dpdGNoIG9mZiBwb3J0cycgcG93ZXIsIHNvbWUgZGV2aWNlcyBkb24ndCBjb21lIHVwCisJICAgYWZ0ZXIgbmV4dCAnc3RhcnQnIHdpdGhvdXQgdGhpcyAqLworCXZhbCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIREVTQ0EpOworCXZhbCAmPSB+KFJIX0FfTlBTIHwgUkhfQV9QU00pOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSERFU0NBLCB2YWwpOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFNUQVRVUywgUkhfSFNfTFBTKTsKKworCWlzcDExNnhfc3dfcmVzZXQoaXNwMTE2eCk7Cit9CisKKy8qCisgKiAgQ29uZmlndXJlIHRoZSBjaGlwLiBUaGUgY2hpcCBtdXN0IGJlIHN1Y2Nlc3NmdWxseSByZXNldCBieSBub3cuCisgKi8KK3N0YXRpYyBpbnQgaXNwMTE2eF9zdGFydChzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eF9wbGF0Zm9ybV9kYXRhICpib2FyZCA9IGlzcDExNngtPmJvYXJkOworCXUzMiB2YWw7CisKKwlEQkcoIiIpOworCisJLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyBhbmQgZGlzYWJsZSBhbGwgaW50ZXJydXB0IHNvdXJjZXMgKi8KKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlQsIDB4ZmYpOworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSEN1UElOVEVOQiwgMCk7CisKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDSVRMQlVGTEVOLCBJU1AxMTZ4X0lUTF9CVUZTSVpFKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDQVRMQlVGTEVOLCBJU1AxMTZ4X0FUTF9CVUZTSVpFKTsKKworCS8qIEhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gKi8KKwl2YWwgPSBIQ0hXQ0ZHX0RCV0lEVEgoMSk7CisJaWYgKGJvYXJkLT5zZWwxNUtyZXMpCisJCXZhbCB8PSBIQ0hXQ0ZHXzE1S1JTRUw7CisJLyogUmVtb3RlIHdha2V1cCB3b24ndCB3b3JrIHdpdGhvdXQgd29ya2luZyBjbG9jayAqLworCWlmIChib2FyZC0+cmVtb3RlX3dha2V1cF9lbmFibGUpCisJCXZhbCB8PSBIQ0hXQ0ZHX0NMS05PVFNUT1A7CisJaWYgKGJvYXJkLT5vY19lbmFibGUpCisJCXZhbCB8PSBIQ0hXQ0ZHX0FOQUxPR19PQzsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDSFdDRkcsIHZhbCk7CisKKwkvKiAtLS0gUm9vdCBodWIgY29uZmlndXJhdGlvbiAqLworCXZhbCA9ICgyNSA8PCAyNCkgJiBSSF9BX1BPVFBHVDsKKwkvKiBBTjEwMDAzXzEucGRmIHJlY29tbWVuZHMgUkhfQV9OUFMgKG5vIHBvd2VyIHN3aXRjaGluZykgdG8KKwkgICBiZSBhbHdheXMgc2V0LiBZZXQsIGluc3RlYWQsIHdlIHJlcXVlc3QgaW5kaXZpZHVhbCBwb3J0CisJICAgcG93ZXIgc3dpdGNoaW5nLiAqLworCXZhbCB8PSBSSF9BX1BTTTsKKwkvKiBSZXBvcnQgb3ZlcmN1cnJlbnQgcGVyIHBvcnQgKi8KKwl2YWwgfD0gUkhfQV9PQ1BNOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSERFU0NBLCB2YWwpOworCWlzcDExNngtPnJoZGVzY2EgPSBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENSSERFU0NBKTsKKworCXZhbCA9IFJIX0JfUFBDTTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhERVNDQiwgdmFsKTsKKwlpc3AxMTZ4LT5yaGRlc2NiID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhERVNDQik7CisKKwl2YWwgPSAwOworCWlmIChib2FyZC0+cmVtb3RlX3dha2V1cF9lbmFibGUpCisJCXZhbCB8PSBSSF9IU19EUldFOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFNUQVRVUywgdmFsKTsKKwlpc3AxMTZ4LT5yaHN0YXR1cyA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIU1RBVFVTKTsKKworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENGTUlOVFZMLCAweDI3NzgyZWRmKTsKKworCS8qIEdvIG9wZXJhdGlvbmFsICovCisJdmFsID0gSENDT05UUk9MX1VTQl9PUEVSOworCWlmIChib2FyZC0+cmVtb3RlX3dha2V1cF9lbmFibGUpCisJCXZhbCB8PSBIQ0NPTlRST0xfUldFOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENDT05UUk9MLCB2YWwpOworCisJLyogRGlzYWJsZSBwb3J0cyB0byBhdm9pZCByYWNlIGluIGRldmljZSBlbnVtZXJhdGlvbiAqLworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxLCBSSF9QU19DQ1MpOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQyLCBSSF9QU19DQ1MpOworCisJaXNwMTE2eF9zaG93X3JlZ3MoaXNwMTE2eCk7CisKKwlpc3AxMTZ4LT5kaXNhYmxlZCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tIEluaXQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgaXNwMTE2eF9jaGVja19pZChzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwlpbnQgdmFsOworCisJdmFsID0gaXNwMTE2eF9yZWFkX3JlZzE2KGlzcDExNngsIEhDQ0hJUElEKTsKKwlpZiAoKHZhbCAmIEhDQ0hJUElEX01BU0spICE9IEhDQ0hJUElEX01BR0lDKSB7CisJCUVSUigiaW52YWxpZCBjaGlwIElEICUwNHgiLCB2YWwpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JfbG93bGV2ZWxfaW5pdCh2b2lkKQoreworCXN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4ID0gJmlzcDExNnhfZGV2OworCisJREJHKCIiKTsKKworCS8qIEluaXQgZGV2aWNlIHJlZ2lzdGVycyBhZGRyICovCisJaXNwMTE2eC0+YWRkcl9yZWcgPSAodTE2ICopIElTUDExNlhfSENEX0FERFI7CisJaXNwMTE2eC0+ZGF0YV9yZWcgPSAodTE2ICopIElTUDExNlhfSENEX0RBVEE7CisKKwkvKiBTZXR1cCBzcGVjaWZpYyBib2FyZCBzZXR0aW5ncyAqLworI2lmZGVmIElTUDExNlhfSENEX1NFTDE1a1JFUworCWlzcDExNnhfYm9hcmQuc2VsMTVLcmVzID0gMTsKKyNlbmRpZgorI2lmZGVmIElTUDExNlhfSENEX09DX0VOQUJMRQorCWlzcDExNnhfYm9hcmQub2NfZW5hYmxlID0gMTsKKyNlbmRpZgorI2lmZGVmIElTUDExNlhfSENEX1JFTU9URV9XQUtFVVBfRU5BQkxFCisJaXNwMTE2eF9ib2FyZC5yZW1vdGVfd2FrZXVwX2VuYWJsZSA9IDE7CisjZW5kaWYKKwlpc3AxMTZ4LT5ib2FyZCA9ICZpc3AxMTZ4X2JvYXJkOworCisJLyogVHJ5IHRvIGdldCBJU1AxMTZ4IHNpbGljb24gY2hpcCBJRCAqLworCWlmIChpc3AxMTZ4X2NoZWNrX2lkKGlzcDExNngpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaXNwMTE2eC0+ZGlzYWJsZWQgPSAxOworCWlzcDExNngtPnNsZWVwaW5nID0gMDsKKworCWlzcDExNnhfcmVzZXQoaXNwMTE2eCk7CisJaXNwMTE2eF9zdGFydChpc3AxMTZ4KTsKKworCXJldHVybiAwOworfQorCitpbnQgdXNiX2xvd2xldmVsX3N0b3Aodm9pZCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9ICZpc3AxMTZ4X2RldjsKKworCURCRygiIik7CisKKwlpZiAoIWlzcDExNngtPmRpc2FibGVkKQorCQlpc3AxMTZ4X3N0b3AoaXNwMTE2eCk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCQkJCS8qIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNwMTE2eC5oIGIvZHJpdmVycy9pc3AxMTZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNjZTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaXNwMTE2eC5oCkBAIC0wLDAgKzEsNDg5IEBACisvKgorICogSVNQMTE2eCByZWdpc3RlciBkZWNsYXJhdGlvbnMgYW5kIEhDRCBkYXRhIHN0cnVjdHVyZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRXVyb3RlY2ggUy5wLkEuIDxpbmZvQGV1cm90ZWNoLml0PgorICogQ29weXJpZ2h0IChDKSAyMDA1IE9sYXYgS29uZ2FzIDxva0BhcnRlY2Rlc2lnbi5lZT4KKyAqIFBvcnRpb25zOgorICogQ29weXJpZ2h0IChDKSAyMDA0IExvdGhhciBXYXNzbWFubgorICogQ29weXJpZ2h0IChDKSAyMDA0IFBzaW9uIFRla2xvZ2l4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREJHKGZtdCwgYXJncy4uLikJXAorCQlwcmludGYoImlzcDExNng6ICVzOiAiIGZtdCAiXG4iICwgX19GVU5DVElPTl9fICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQsIGFyZ3MuLi4pCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZmRlZiBWRVJCT1NFCisjICAgIGRlZmluZSBWREJHCQlEQkcKKyNlbHNlCisjICAgIGRlZmluZSBWREJHKGZtdCwgYXJncy4uLikJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBFUlIoZm10LCBhcmdzLi4uKQlcCisJCXByaW50ZigiaXNwMTE2eDogJXM6ICIgZm10ICJcbiIgLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQorI2RlZmluZSBXQVJOKGZtdCwgYXJncy4uLikJXAorCQlwcmludGYoImlzcDExNng6ICVzOiAiIGZtdCAiXG4iICwgX19GVU5DVElPTl9fICwgIyMgYXJncykKKyNkZWZpbmUgSU5GTyhmbXQsIGFyZ3MuLi4pCVwKKwkJcHJpbnRmKCJpc3AxMTZ4OiAiIGZtdCAiXG4iICwgIyMgYXJncykKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiB1cyBvZiAxbXMgZnJhbWUgKi8KKyNkZWZpbmUgIE1BWF9MT0FEX0xJTUlUCQk4NTAKKworLyogRnVsbCBzcGVlZDogbWF4ICMgb2YgYnl0ZXMgdG8gdHJhbnNmZXIgZm9yIGEgc2luZ2xlIHVyYgorICAgYXQgYSB0aW1lIG11c3QgYmUgPCAxMDI0ICYmIG11c3QgYmUgbXVsdGlwbGUgb2YgNjQuCisgICA4MzIgYWxsb3dzIHRyYW5zZmVyaW5nIDRraUIgd2l0aGluIDUgZnJhbWVzLiAqLworI2RlZmluZSBNQVhfVFJBTlNGRVJfU0laRV9GVUxMU1BFRUQJODMyCisKKy8qIExvdyBzcGVlZDogdGhlcmUgaXMgbm8gcmVhc29uIHRvIHNjaGVkdWxlIGluIHZlcnkgYmlnCisgICBjaHVua3M7IG9mdGVuIHRoZSByZXF1ZXN0ZWQgbG9uZyB0cmFuc2ZlcnMgYXJlIGZvcgorICAgc3RyaW5nIGRlc2NyaXB0b3JzIGNvbnRhaW5pbmcgc2hvcnQgc3RyaW5ncy4gKi8KKyNkZWZpbmUgTUFYX1RSQU5TRkVSX1NJWkVfTE9XU1BFRUQJNjQKKworLyogQnl0ZXRpbWUgKHVzKSwgYSByb3VnaCBpbmRpY2F0aW9uIG9mIGhvdyBtdWNoIHRpbWUgaXQKKyAgIHdvdWxkIHRha2UgdG8gdHJhbnNmZXIgYSBieXRlIG9mIHVzZWZ1bCBkYXRhIG92ZXIgVVNCICovCisjZGVmaW5lIEJZVEVfVElNRV9GVUxMU1BFRUQJMQorI2RlZmluZSBCWVRFX1RJTUVfTE9XU1BFRUQJMjAKKworLyogQnVmZmVyIHNpemVzICovCisjZGVmaW5lIElTUDExNnhfQlVGX1NJWkUJNDA5NgorI2RlZmluZSBJU1AxMTZ4X0lUTF9CVUZTSVpFCTAKKyNkZWZpbmUgSVNQMTE2eF9BVExfQlVGU0laRQkoKElTUDExNnhfQlVGX1NJWkUpIC0gMiooSVNQMTE2eF9JVExfQlVGU0laRSkpCisKKyNkZWZpbmUgSVNQMTE2eF9XUklURV9PRkZTRVQJMHg4MAorCisvKiAtLS0gSVNQMTE2eCByZWdpc3RlcnMvYml0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUJSENSRVZJU0lPTgkweDAwCisjZGVmaW5lCUhDQ09OVFJPTAkweDAxCisjZGVmaW5lCQlIQ0NPTlRST0xfSENGUwkoMyA8PCA2KQkvKiBob3N0IGNvbnRyb2xsZXIKKwkJCQkJCSAgIGZ1bmN0aW9uYWwgc3RhdGUgKi8KKyNkZWZpbmUJCUhDQ09OVFJPTF9VU0JfUkVTRVQJKDAgPDwgNikKKyNkZWZpbmUJCUhDQ09OVFJPTF9VU0JfUkVTVU1FCSgxIDw8IDYpCisjZGVmaW5lCQlIQ0NPTlRST0xfVVNCX09QRVIJKDIgPDwgNikKKyNkZWZpbmUJCUhDQ09OVFJPTF9VU0JfU1VTUEVORAkoMyA8PCA2KQorI2RlZmluZQkJSENDT05UUk9MX1JXQwkoMSA8PCA5KQkvKiByZW1vdGUgd2FrZXVwIGNvbm5lY3RlZCAqLworI2RlZmluZQkJSENDT05UUk9MX1JXRQkoMSA8PCAxMCkJLyogcmVtb3RlIHdha2V1cCBlbmFibGUgKi8KKyNkZWZpbmUJSENDTURTVEFUCTB4MDIKKyNkZWZpbmUJCUhDQ01EU1RBVF9IQ1IJKDEgPDwgMCkJLyogaG9zdCBjb250cm9sbGVyIHJlc2V0ICovCisjZGVmaW5lCQlIQ0NNRFNUQVRfU09DCSgzIDw8IDE2KQkvKiBzY2hlZHVsaW5nIG92ZXJydW4gY291bnQgKi8KKyNkZWZpbmUJSENJTlRTVEFUCTB4MDMKKyNkZWZpbmUJCUhDSU5UX1NPCSgxIDw8IDApCS8qIHNjaGVkdWxpbmcgb3ZlcnJ1biAqLworI2RlZmluZQkJSENJTlRfV0RICSgxIDw8IDEpCS8qIHdyaXRlYmFjayBvZiBkb25lX2hlYWQgKi8KKyNkZWZpbmUJCUhDSU5UX1NGCSgxIDw8IDIpCS8qIHN0YXJ0IGZyYW1lICovCisjZGVmaW5lCQlIQ0lOVF9SRAkoMSA8PCAzKQkvKiByZXN1bWUgZGV0ZWN0ICovCisjZGVmaW5lCQlIQ0lOVF9VRQkoMSA8PCA0KQkvKiB1bnJlY292ZXJhYmxlIGVycm9yICovCisjZGVmaW5lCQlIQ0lOVF9GTk8JKDEgPDwgNSkJLyogZnJhbWUgbnVtYmVyIG92ZXJmbG93ICovCisjZGVmaW5lCQlIQ0lOVF9SSFNDCSgxIDw8IDYpCS8qIHJvb3QgaHViIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJCUhDSU5UX09DCSgxIDw8IDMwKQkvKiBvd25lcnNoaXAgY2hhbmdlICovCisjZGVmaW5lCQlIQ0lOVF9NSUUJKDEgPDwgMzEpCS8qIG1hc3RlciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lCUhDSU5URU5CCTB4MDQKKyNkZWZpbmUJSENJTlRESVMJMHgwNQorI2RlZmluZQlIQ0ZNSU5UVkwJMHgwZAorI2RlZmluZQlIQ0ZNUkVNCQkweDBlCisjZGVmaW5lCUhDRk1OVU0JCTB4MGYKKyNkZWZpbmUJSENMU1RIUkVTSAkweDExCisjZGVmaW5lCUhDUkhERVNDQQkweDEyCisjZGVmaW5lCQlSSF9BX05EUAkoMHgzIDw8IDApCS8qICMgZG93bnN0cmVhbSBwb3J0cyAqLworI2RlZmluZQkJUkhfQV9QU00JKDEgPDwgOCkJLyogcG93ZXIgc3dpdGNoaW5nIG1vZGUgKi8KKyNkZWZpbmUJCVJIX0FfTlBTCSgxIDw8IDkpCS8qIG5vIHBvd2VyIHN3aXRjaGluZyAqLworI2RlZmluZQkJUkhfQV9EVAkJKDEgPDwgMTApCS8qIGRldmljZSB0eXBlIChtYnopICovCisjZGVmaW5lCQlSSF9BX09DUE0JKDEgPDwgMTEpCS8qIG92ZXJjdXJyZW50IHByb3RlY3Rpb24KKwkJCQkJCSAgIG1vZGUgKi8KKyNkZWZpbmUJCVJIX0FfTk9DUAkoMSA8PCAxMikJLyogbm8gb3ZlcmN1cnJlbnQgcHJvdGVjdGlvbiAqLworI2RlZmluZQkJUkhfQV9QT1RQR1QJKDB4ZmYgPDwgMjQpCS8qIHBvd2VyIG9uIC0+IHBvd2VyIGdvb2QKKwkJCQkJCSAgIHRpbWUgKi8KKyNkZWZpbmUJSENSSERFU0NCCTB4MTMKKyNkZWZpbmUJCVJIX0JfRFIJCSgweGZmZmYgPDwgMCkJLyogZGV2aWNlIHJlbW92YWJsZSBmbGFncyAqLworI2RlZmluZQkJUkhfQl9QUENNCSgweGZmZmYgPDwgMTYpCS8qIHBvcnQgcG93ZXIgY29udHJvbCBtYXNrICovCisjZGVmaW5lCUhDUkhTVEFUVVMJMHgxNAorI2RlZmluZQkJUkhfSFNfTFBTCSgxIDw8IDApCS8qIGxvY2FsIHBvd2VyIHN0YXR1cyAqLworI2RlZmluZQkJUkhfSFNfT0NJCSgxIDw8IDEpCS8qIG92ZXIgY3VycmVudCBpbmRpY2F0b3IgKi8KKyNkZWZpbmUJCVJIX0hTX0RSV0UJKDEgPDwgMTUpCS8qIGRldmljZSByZW1vdGUgd2FrZXVwCisJCQkJCQkgICBlbmFibGUgKi8KKyNkZWZpbmUJCVJIX0hTX0xQU0MJKDEgPDwgMTYpCS8qIGxvY2FsIHBvd2VyIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJCVJIX0hTX09DSUMJKDEgPDwgMTcpCS8qIG92ZXIgY3VycmVudCBpbmRpY2F0b3IKKwkJCQkJCSAgIGNoYW5nZSAqLworI2RlZmluZQkJUkhfSFNfQ1JXRQkoMSA8PCAzMSkJLyogY2xlYXIgcmVtb3RlIHdha2V1cAorCQkJCQkJICAgZW5hYmxlICovCisjZGVmaW5lCUhDUkhQT1JUMQkweDE1CisjZGVmaW5lCQlSSF9QU19DQ1MJKDEgPDwgMCkJLyogY3VycmVudCBjb25uZWN0IHN0YXR1cyAqLworI2RlZmluZQkJUkhfUFNfUEVTCSgxIDw8IDEpCS8qIHBvcnQgZW5hYmxlIHN0YXR1cyAqLworI2RlZmluZQkJUkhfUFNfUFNTCSgxIDw8IDIpCS8qIHBvcnQgc3VzcGVuZCBzdGF0dXMgKi8KKyNkZWZpbmUJCVJIX1BTX1BPQ0kJKDEgPDwgMykJLyogcG9ydCBvdmVyIGN1cnJlbnQKKwkJCQkJCSAgIGluZGljYXRvciAqLworI2RlZmluZQkJUkhfUFNfUFJTCSgxIDw8IDQpCS8qIHBvcnQgcmVzZXQgc3RhdHVzICovCisjZGVmaW5lCQlSSF9QU19QUFMJKDEgPDwgOCkJLyogcG9ydCBwb3dlciBzdGF0dXMgKi8KKyNkZWZpbmUJCVJIX1BTX0xTREEJKDEgPDwgOSkJLyogbG93IHNwZWVkIGRldmljZSBhdHRhY2hlZCAqLworI2RlZmluZQkJUkhfUFNfQ1NDCSgxIDw8IDE2KQkvKiBjb25uZWN0IHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJCVJIX1BTX1BFU0MJKDEgPDwgMTcpCS8qIHBvcnQgZW5hYmxlIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJCVJIX1BTX1BTU0MJKDEgPDwgMTgpCS8qIHBvcnQgc3VzcGVuZCBzdGF0dXMKKwkJCQkJCSAgIGNoYW5nZSAqLworI2RlZmluZQkJUkhfUFNfT0NJQwkoMSA8PCAxOSkJLyogb3ZlciBjdXJyZW50IGluZGljYXRvcgorCQkJCQkJICAgY2hhbmdlICovCisjZGVmaW5lCQlSSF9QU19QUlNDCSgxIDw8IDIwKQkvKiBwb3J0IHJlc2V0IHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJCUhDUkhQT1JUX0NMUk1BU0sJKDB4MWYgPDwgMTYpCisjZGVmaW5lCUhDUkhQT1JUMgkweDE2CisjZGVmaW5lCUhDSFdDRkcJCTB4MjAKKyNkZWZpbmUJCUhDSFdDRkdfMTVLUlNFTAkJKDEgPDwgMTIpCisjZGVmaW5lCQlIQ0hXQ0ZHX0NMS05PVFNUT1AJKDEgPDwgMTEpCisjZGVmaW5lCQlIQ0hXQ0ZHX0FOQUxPR19PQwkoMSA8PCAxMCkKKyNkZWZpbmUJCUhDSFdDRkdfREFDS19NT0RFCSgxIDw8IDgpCisjZGVmaW5lCQlIQ0hXQ0ZHX0VPVF9QT0wJCSgxIDw8IDcpCisjZGVmaW5lCQlIQ0hXQ0ZHX0RBQ0tfUE9MCSgxIDw8IDYpCisjZGVmaW5lCQlIQ0hXQ0ZHX0RSRVFfUE9MCSgxIDw8IDUpCisjZGVmaW5lCQlIQ0hXQ0ZHX0RCV0lEVEhfTUFTSwkoMHgwMyA8PCAzKQorI2RlZmluZQkJSENIV0NGR19EQldJRFRIKG4pCSgoKG4pIDw8IDMpICYgSENIV0NGR19EQldJRFRIX01BU0spCisjZGVmaW5lCQlIQ0hXQ0ZHX0lOVF9QT0wJCSgxIDw8IDIpCisjZGVmaW5lCQlIQ0hXQ0ZHX0lOVF9UUklHR0VSCSgxIDw8IDEpCisjZGVmaW5lCQlIQ0hXQ0ZHX0lOVF9FTkFCTEUJKDEgPDwgMCkKKyNkZWZpbmUJSENETUFDRkcJMHgyMQorI2RlZmluZQkJSENETUFDRkdfQlVSU1RfTEVOX01BU0sJKDB4MDMgPDwgNSkKKyNkZWZpbmUJCUhDRE1BQ0ZHX0JVUlNUX0xFTihuKQkoKChuKSA8PCA1KSAmIEhDRE1BQ0ZHX0JVUlNUX0xFTl9NQVNLKQorI2RlZmluZQkJSENETUFDRkdfQlVSU1RfTEVOXzEJSENETUFDRkdfQlVSU1RfTEVOKDApCisjZGVmaW5lCQlIQ0RNQUNGR19CVVJTVF9MRU5fNAlIQ0RNQUNGR19CVVJTVF9MRU4oMSkKKyNkZWZpbmUJCUhDRE1BQ0ZHX0JVUlNUX0xFTl84CUhDRE1BQ0ZHX0JVUlNUX0xFTigyKQorI2RlZmluZQkJSENETUFDRkdfRE1BX0VOQUJMRQkoMSA8PCA0KQorI2RlZmluZQkJSENETUFDRkdfQlVGX1RZUEVfTUFTSwkoMHgwNyA8PCAxKQorI2RlZmluZQkJSENETUFDRkdfQ1RSX1NFTAkoMSA8PCAyKQorI2RlZmluZQkJSENETUFDRkdfSVRMQVRMX1NFTAkoMSA8PCAxKQorI2RlZmluZQkJSENETUFDRkdfRE1BX1JXX1NFTEVDVAkoMSA8PCAwKQorI2RlZmluZQlIQ1hGRVJDVFIJMHgyMgorI2RlZmluZQlIQ3VQSU5UCQkweDI0CisjZGVmaW5lCQlIQ3VQSU5UX1NPRgkJKDEgPDwgMCkKKyNkZWZpbmUJCUhDdVBJTlRfQVRMCQkoMSA8PCAxKQorI2RlZmluZQkJSEN1UElOVF9BSUlFT1QJCSgxIDw8IDIpCisjZGVmaW5lCQlIQ3VQSU5UX09QUgkJKDEgPDwgNCkKKyNkZWZpbmUJCUhDdVBJTlRfU1VTUAkJKDEgPDwgNSkKKyNkZWZpbmUJCUhDdVBJTlRfQ0xLUkRZCQkoMSA8PCA2KQorI2RlZmluZQlIQ3VQSU5URU5CCTB4MjUKKyNkZWZpbmUJSENDSElQSUQJMHgyNworI2RlZmluZQkJSENDSElQSURfTUFTSwkJMHhmZjAwCisjZGVmaW5lCQlIQ0NISVBJRF9NQUdJQwkJMHg2MTAwCisjZGVmaW5lCUhDU0NSQVRDSAkweDI4CisjZGVmaW5lCUhDU1dSRVMJCTB4MjkKKyNkZWZpbmUJCUhDU1dSRVNfTUFHSUMJCTB4MDBmNgorI2RlZmluZQlIQ0lUTEJVRkxFTgkweDJhCisjZGVmaW5lCUhDQVRMQlVGTEVOCTB4MmIKKyNkZWZpbmUJSENCVUZTVEFUCTB4MmMKKyNkZWZpbmUJCUhDQlVGU1RBVF9JVEwwX0ZVTEwJKDEgPDwgMCkKKyNkZWZpbmUJCUhDQlVGU1RBVF9JVEwxX0ZVTEwJKDEgPDwgMSkKKyNkZWZpbmUJCUhDQlVGU1RBVF9BVExfRlVMTAkoMSA8PCAyKQorI2RlZmluZQkJSENCVUZTVEFUX0lUTDBfRE9ORQkoMSA8PCAzKQorI2RlZmluZQkJSENCVUZTVEFUX0lUTDFfRE9ORQkoMSA8PCA0KQorI2RlZmluZQkJSENCVUZTVEFUX0FUTF9ET05FCSgxIDw8IDUpCisjZGVmaW5lCUhDUkRJVEwwTEVOCTB4MmQKKyNkZWZpbmUJSENSRElUTDFMRU4JMHgyZQorI2RlZmluZQlIQ0lUTFBPUlQJMHg0MAorI2RlZmluZQlIQ0FUTFBPUlQJMHg0MQorCisvKiBQVEQgYWNjZXNzb3IgbWFjcm9zLiAqLworI2RlZmluZSBQVERfR0VUX0NPVU5UKHApCSgoKHApLT5jb3VudCAmIFBURF9DT1VOVF9NU0spID4+IDApCisjZGVmaW5lIFBURF9DT1VOVCh2KQkJKCgodikgPDwgMCkgJiBQVERfQ09VTlRfTVNLKQorI2RlZmluZSBQVERfR0VUX1RPR0dMRShwKQkoKChwKS0+Y291bnQgJiBQVERfVE9HR0xFX01TSykgPj4gMTApCisjZGVmaW5lIFBURF9UT0dHTEUodikJCSgoKHYpIDw8IDEwKSAmIFBURF9UT0dHTEVfTVNLKQorI2RlZmluZSBQVERfR0VUX0FDVElWRShwKQkoKChwKS0+Y291bnQgJiBQVERfQUNUSVZFX01TSykgPj4gMTEpCisjZGVmaW5lIFBURF9BQ1RJVkUodikJCSgoKHYpIDw8IDExKSAmIFBURF9BQ1RJVkVfTVNLKQorI2RlZmluZSBQVERfR0VUX0NDKHApCQkoKChwKS0+Y291bnQgJiBQVERfQ0NfTVNLKSA+PiAxMikKKyNkZWZpbmUgUFREX0NDKHYpCQkoKCh2KSA8PCAxMikgJiBQVERfQ0NfTVNLKQorI2RlZmluZSBQVERfR0VUX01QUyhwKQkJKCgocCktPm1wcyAmIFBURF9NUFNfTVNLKSA+PiAwKQorI2RlZmluZSBQVERfTVBTKHYpCQkoKCh2KSA8PCAwKSAmIFBURF9NUFNfTVNLKQorI2RlZmluZSBQVERfR0VUX1NQRChwKQkJKCgocCktPm1wcyAmIFBURF9TUERfTVNLKSA+PiAxMCkKKyNkZWZpbmUgUFREX1NQRCh2KQkJKCgodikgPDwgMTApICYgUFREX1NQRF9NU0spCisjZGVmaW5lIFBURF9HRVRfTEFTVChwKQkJKCgocCktPm1wcyAmIFBURF9MQVNUX01TSykgPj4gMTEpCisjZGVmaW5lIFBURF9MQVNUKHYpCQkoKCh2KSA8PCAxMSkgJiBQVERfTEFTVF9NU0spCisjZGVmaW5lIFBURF9HRVRfRVAocCkJCSgoKHApLT5tcHMgJiBQVERfRVBfTVNLKSA+PiAxMikKKyNkZWZpbmUgUFREX0VQKHYpCQkoKCh2KSA8PCAxMikgJiBQVERfRVBfTVNLKQorI2RlZmluZSBQVERfR0VUX0xFTihwKQkJKCgocCktPmxlbiAmIFBURF9MRU5fTVNLKSA+PiAwKQorI2RlZmluZSBQVERfTEVOKHYpCQkoKCh2KSA8PCAwKSAmIFBURF9MRU5fTVNLKQorI2RlZmluZSBQVERfR0VUX0RJUihwKQkJKCgocCktPmxlbiAmIFBURF9ESVJfTVNLKSA+PiAxMCkKKyNkZWZpbmUgUFREX0RJUih2KQkJKCgodikgPDwgMTApICYgUFREX0RJUl9NU0spCisjZGVmaW5lIFBURF9HRVRfQjVfNShwKQkJKCgocCktPmxlbiAmIFBURF9CNV81X01TSykgPj4gMTMpCisjZGVmaW5lIFBURF9CNV81KHYpCQkoKCh2KSA8PCAxMykgJiBQVERfQjVfNV9NU0spCisjZGVmaW5lIFBURF9HRVRfRkEocCkJCSgoKHApLT5mYWRkciAmIFBURF9GQV9NU0spID4+IDApCisjZGVmaW5lIFBURF9GQSh2KQkJKCgodikgPDwgMCkgJiBQVERfRkFfTVNLKQorI2RlZmluZSBQVERfR0VUX0ZNVChwKQkJKCgocCktPmZhZGRyICYgUFREX0ZNVF9NU0spID4+IDcpCisjZGVmaW5lIFBURF9GTVQodikJCSgoKHYpIDw8IDcpICYgUFREX0ZNVF9NU0spCisKKy8qICBIYXJkd2FyZSB0cmFuc2ZlciBzdGF0dXMgY29kZXMgLS0gQ0MgZnJvbSBwdGQtPmNvdW50ICovCisjZGVmaW5lIFREX0NDX05PRVJST1IgICAgICAweDAwCisjZGVmaW5lIFREX0NDX0NSQyAgICAgICAgICAweDAxCisjZGVmaW5lIFREX0NDX0JJVFNUVUZGSU5HICAweDAyCisjZGVmaW5lIFREX0NDX0RBVEFUT0dHTEVNICAweDAzCisjZGVmaW5lIFREX0NDX1NUQUxMICAgICAgICAweDA0CisjZGVmaW5lIFREX0RFVk5PVFJFU1AgICAgICAweDA1CisjZGVmaW5lIFREX1BJRENIRUNLRkFJTCAgICAweDA2CisjZGVmaW5lIFREX1VORVhQRUNURURQSUQgICAweDA3CisjZGVmaW5lIFREX0RBVEFPVkVSUlVOICAgICAweDA4CisjZGVmaW5lIFREX0RBVEFVTkRFUlJVTiAgICAweDA5CisgICAgLyogMHgwQSwgMHgwQiByZXNlcnZlZCBmb3IgaGFyZHdhcmUgKi8KKyNkZWZpbmUgVERfQlVGRkVST1ZFUlJVTiAgIDB4MEMKKyNkZWZpbmUgVERfQlVGRkVSVU5ERVJSVU4gIDB4MEQKKyAgICAvKiAweDBFLCAweDBGIHJlc2VydmVkIGZvciBIQ0QgKi8KKyNkZWZpbmUgVERfTk9UQUNDRVNTRUQgICAgIDB4MEYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lCUxPRzJfUEVSSU9ESUNfU0laRQk1CS8qIGFyYml0cmFyeTsgdGhpcyBtYXRjaGVzIE9IQ0kgKi8KKyNkZWZpbmUJUEVSSU9ESUNfU0laRQkJKDEgPDwgTE9HMl9QRVJJT0RJQ19TSVpFKQorCisvKiBQaGlsaXBzIHRyYW5zZmVyIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBwdGQgeworCXUxNiBjb3VudDsKKyNkZWZpbmUJUFREX0NPVU5UX01TSwkoMHgzZmYgPDwgMCkKKyNkZWZpbmUJUFREX1RPR0dMRV9NU0sJKDEgPDwgMTApCisjZGVmaW5lCVBURF9BQ1RJVkVfTVNLCSgxIDw8IDExKQorI2RlZmluZQlQVERfQ0NfTVNLCSgweGYgPDwgMTIpCisJdTE2IG1wczsKKyNkZWZpbmUJUFREX01QU19NU0sJKDB4M2ZmIDw8IDApCisjZGVmaW5lCVBURF9TUERfTVNLCSgxIDw8IDEwKQorI2RlZmluZQlQVERfTEFTVF9NU0sJKDEgPDwgMTEpCisjZGVmaW5lCVBURF9FUF9NU0sJKDB4ZiA8PCAxMikKKwl1MTYgbGVuOworI2RlZmluZQlQVERfTEVOX01TSwkoMHgzZmYgPDwgMCkKKyNkZWZpbmUJUFREX0RJUl9NU0sJKDMgPDwgMTApCisjZGVmaW5lCVBURF9ESVJfU0VUVVAJKDApCisjZGVmaW5lCVBURF9ESVJfT1VUCSgxKQorI2RlZmluZQlQVERfRElSX0lOCSgyKQorI2RlZmluZQlQVERfQjVfNV9NU0sJKDEgPDwgMTMpCisJdTE2IGZhZGRyOworI2RlZmluZQlQVERfRkFfTVNLCSgweDdmIDw8IDApCisjZGVmaW5lCVBURF9GTVRfTVNLCSgxIDw8IDcpCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsIGFsaWduZWQoMikpKTsKKworc3RydWN0IGlzcDExNnhfZXAgeworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCBwdGQgcHRkOworCisJdTggbWF4cGFja2V0OworCXU4IGVwbnVtOworCXU4IG5leHRwaWQ7CisKKwl1MTYgbGVuZ3RoOwkJLyogb2YgY3VycmVudCBwYWNrZXQgKi8KKwl1bnNpZ25lZCBjaGFyICpkYXRhOwkvKiB0byBkYXRhYnVmICovCisKKwl1MTYgZXJyb3JfY291bnQ7Cit9OworCisvKiBVUkIgc3RydWN0ICovCisjZGVmaW5lIE5fVVJCX1RECQk0OAorI2RlZmluZSBVUkJfREVMCQkJMQordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBpc3AxMTZ4X2VwICplZDsKKwl2b2lkICp0cmFuc2Zlcl9idWZmZXI7CS8qIChpbikgYXNzb2NpYXRlZCBkYXRhIGJ1ZmZlciAqLworCWludCBhY3R1YWxfbGVuZ3RoOwkvKiAocmV0dXJuKSBhY3R1YWwgdHJhbnNmZXIgbGVuZ3RoICovCisJdW5zaWduZWQgbG9uZyBwaXBlOwkvKiAoaW4pIHBpcGUgaW5mb3JtYXRpb24gKi8KKyNpZiAwCisJaW50IHN0YXRlOworI2VuZGlmCit9IHVyYl9wcml2X3Q7CisKK3N0cnVjdCBpc3AxMTZ4X3BsYXRmb3JtX2RhdGEgeworCS8qIEVuYWJsZSBpbnRlcm5hbCByZXNpc3RvcnMgb24gZG93bnN0cmVhbSBwb3J0cyAqLworCXVuc2lnbmVkIHNlbDE1S3JlczoxOworCS8qIE9uLWNoaXAgb3ZlcmN1cnJlbnQgZGV0ZWN0aW9uICovCisJdW5zaWduZWQgb2NfZW5hYmxlOjE7CisJLyogRW5hYmxlIHdha2V1cCBieSBkZXZpY2VzIG9uIHVzYiBidXMgKGUuZy4gd2FrZXVwCisJICAgYnkgYXR0YWNobWVudC9kZXRhY2htZW50IG9yIGJ5IGRldmljZSBhY3Rpdml0eQorCSAgIHN1Y2ggYXMgbW92aW5nIGEgbW91c2UpLiBXaGVuIGNob3NlbiwgdGhpcyBvcHRpb24KKwkgICBwcmV2ZW50cyBzdG9wcGluZyBpbnRlcm5hbCBjbG9jaywgaW5jcmVhc2luZworCSAgIHRoZXJlYnkgcG93ZXIgY29uc3VtcHRpb24gaW4gc3VzcGVuZGVkIHN0YXRlLiAqLworCXVuc2lnbmVkIHJlbW90ZV93YWtldXBfZW5hYmxlOjE7Cit9OworCitzdHJ1Y3QgaXNwMTE2eCB7CisJdTE2ICphZGRyX3JlZzsKKwl1MTYgKmRhdGFfcmVnOworCisJc3RydWN0IGlzcDExNnhfcGxhdGZvcm1fZGF0YSAqYm9hcmQ7CisKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJdW5zaWduZWQgbG9uZyBzdGF0MSwgc3RhdDIsIHN0YXQ0LCBzdGF0OCwgc3RhdDE2OworCisJLyogU3RhdHVzIGZsYWdzICovCisJdW5zaWduZWQgZGlzYWJsZWQ6MTsKKwl1bnNpZ25lZCBzbGVlcGluZzoxOworCisJLyogUm9vdCBodWIgcmVnaXN0ZXJzICovCisJdTMyIHJoZGVzY2E7CisJdTMyIHJoZGVzY2I7CisJdTMyIHJoc3RhdHVzOworCXUzMiByaHBvcnRbMl07CisKKwkvKiBTY2hlZHVsZSBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgKi8KKwlzdHJ1Y3QgaXNwMTE2eF9lcCAqYXRsX2FjdGl2ZTsKKwlpbnQgYXRsX2J1ZmxlbjsKKwlpbnQgYXRsX2J1ZnNocnQ7CisJaW50IGF0bF9sYXN0X2RpcjsKKwlpbnQgYXRsX2ZpbmlzaGluZzsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogSW50ZXItaW8gZGVsYXkgKG5zKS4gVGhlIGNoaXAgaXMgcGlja3kgYWJvdXQgYWNjZXNzIHRpbWluZ3M7IGl0CisgKiBleHBlY3RzIGF0IGxlYXN0OgorICogMTUwbnMgZGVsYXkgYmV0d2VlbiBjb25zZWN1dGl2ZSBhY2Nlc3NlcyB0byBEQVRBX1JFRywKKyAqIDMwMG5zIGRlbGF5IGJldHdlZW4gYWNjZXNzIHRvIEFERFJfUkVHIGFuZCBEQVRBX1JFRworICogT0UsIFdFIE1VU1QgTk9UIGJlIGNoYW5nZWQgZHVyaW5nIHRoZXNlIGludGVydmFscworICovCisjaWYgZGVmaW5lZChVREVMQVkpCisjZGVmaW5lCWlzcDExNnhfZGVsYXkoaCxkKQl1ZGVsYXkoZCkKKyNlbHNlCisjZGVmaW5lCWlzcDExNnhfZGVsYXkoaCxkKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgaXNwMTE2eF93cml0ZV9hZGRyKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB1bnNpZ25lZCByZWcpCit7CisJd3JpdGV3KHJlZyAmIDB4ZmYsIGlzcDExNngtPmFkZHJfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIFVERUxBWSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc3AxMTZ4X3dyaXRlX2RhdGExNihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdTE2IHZhbCkKK3sKKwl3cml0ZXcodmFsLCBpc3AxMTZ4LT5kYXRhX3JlZyk7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCBVREVMQVkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXNwMTE2eF9yYXdfd3JpdGVfZGF0YTE2KHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB1MTYgdmFsKQoreworCV9fcmF3X3dyaXRldyh2YWwsIGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIFVERUxBWSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGlzcDExNnhfcmVhZF9kYXRhMTYoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJdTE2IHZhbDsKKworCXZhbCA9IHJlYWR3KGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIFVERUxBWSk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB1MTYgaXNwMTE2eF9yYXdfcmVhZF9kYXRhMTYoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJdTE2IHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWR3KGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIFVERUxBWSk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlzcDExNnhfd3JpdGVfZGF0YTMyKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB1MzIgdmFsKQoreworCXdyaXRldyh2YWwgJiAweGZmZmYsIGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIFVERUxBWSk7CisJd3JpdGV3KHZhbCA+PiAxNiwgaXNwMTE2eC0+ZGF0YV9yZWcpOworCWlzcDExNnhfZGVsYXkoaXNwMTE2eCwgVURFTEFZKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaXNwMTE2eF9yZWFkX2RhdGEzMihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gKHUzMikgcmVhZHcoaXNwMTE2eC0+ZGF0YV9yZWcpOworCWlzcDExNnhfZGVsYXkoaXNwMTE2eCwgVURFTEFZKTsKKwl2YWwgfD0gKCh1MzIpIHJlYWR3KGlzcDExNngtPmRhdGFfcmVnKSkgPDwgMTY7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCBVREVMQVkpOworCXJldHVybiB2YWw7Cit9CisKKy8qIExldCdzIGtlZXAgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9ucyBvdXQgb2YgbGluZS4gSGludDoKKyAgIHdlIHdhaXQgYXQgbGVhc3QgMTUwIG5zIGF0IGV2ZXJ5IGFjY2Vzcy4KKyovCitzdGF0aWMgdTE2IGlzcDExNnhfcmVhZF9yZWcxNihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdW5zaWduZWQgcmVnKQoreworCWlzcDExNnhfd3JpdGVfYWRkcihpc3AxMTZ4LCByZWcpOworCXJldHVybiBpc3AxMTZ4X3JlYWRfZGF0YTE2KGlzcDExNngpOworfQorCitzdGF0aWMgdTMyIGlzcDExNnhfcmVhZF9yZWczMihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdW5zaWduZWQgcmVnKQoreworCWlzcDExNnhfd3JpdGVfYWRkcihpc3AxMTZ4LCByZWcpOworCXJldHVybiBpc3AxMTZ4X3JlYWRfZGF0YTMyKGlzcDExNngpOworfQorCitzdGF0aWMgdm9pZCBpc3AxMTZ4X3dyaXRlX3JlZzE2KHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB1bnNpZ25lZCByZWcsCisJCQkJdW5zaWduZWQgdmFsKQoreworCWlzcDExNnhfd3JpdGVfYWRkcihpc3AxMTZ4LCByZWcgfCBJU1AxMTZ4X1dSSVRFX09GRlNFVCk7CisJaXNwMTE2eF93cml0ZV9kYXRhMTYoaXNwMTE2eCwgKHUxNikgKHZhbCAmIDB4ZmZmZikpOworfQorCitzdGF0aWMgdm9pZCBpc3AxMTZ4X3dyaXRlX3JlZzMyKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB1bnNpZ25lZCByZWcsCisJCQkJdW5zaWduZWQgdmFsKQoreworCWlzcDExNnhfd3JpdGVfYWRkcihpc3AxMTZ4LCByZWcgfCBJU1AxMTZ4X1dSSVRFX09GRlNFVCk7CisJaXNwMTE2eF93cml0ZV9kYXRhMzIoaXNwMTE2eCwgKHUzMikgdmFsKTsKK30KKworLyogLS0tIFVTQiBIVUIgY29uc3RhbnRzIChub3QgT0hDSS1zcGVjaWZpYzsgc2VlIGh1Yi5oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBkZXN0aW5hdGlvbiBvZiByZXF1ZXN0ICovCisjZGVmaW5lIFJIX0lOVEVSRkFDRSAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUkhfRU5EUE9JTlQgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBSSF9PVEhFUiAgICAgICAgICAgICAgICAgICAweDAzCisKKyNkZWZpbmUgUkhfQ0xBU1MgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBSSF9WRU5ET1IgICAgICAgICAgICAgICAgICAweDQwCisKKy8qIFJlcXVlc3RzOiBiUmVxdWVzdCA8PCA4IHwgYm1SZXF1ZXN0VHlwZSAqLworI2RlZmluZSBSSF9HRVRfU1RBVFVTICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgUkhfQ0xFQVJfRkVBVFVSRSAgICAgICAgMHgwMTAwCisjZGVmaW5lIFJIX1NFVF9GRUFUVVJFICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBSSF9TRVRfQUREUkVTUyAgICAgICAgICAweDA1MDAKKyNkZWZpbmUgUkhfR0VUX0RFU0NSSVBUT1IgICAgICAgMHgwNjgwCisjZGVmaW5lIFJIX1NFVF9ERVNDUklQVE9SICAgICAgIDB4MDcwMAorI2RlZmluZSBSSF9HRVRfQ09ORklHVVJBVElPTiAgICAweDA4ODAKKyNkZWZpbmUgUkhfU0VUX0NPTkZJR1VSQVRJT04gICAgMHgwOTAwCisjZGVmaW5lIFJIX0dFVF9TVEFURSAgICAgICAgICAgIDB4MDI4MAorI2RlZmluZSBSSF9HRVRfSU5URVJGQUNFICAgICAgICAweDBBODAKKyNkZWZpbmUgUkhfU0VUX0lOVEVSRkFDRSAgICAgICAgMHgwQjAwCisjZGVmaW5lIFJIX1NZTkNfRlJBTUUgICAgICAgICAgIDB4MEM4MAorLyogT3VyIFZlbmRvciBTcGVjaWZpYyBSZXF1ZXN0ICovCisjZGVmaW5lIFJIX1NFVF9FUCAgICAgICAgICAgICAgIDB4MjAwMAorCisvKiBIdWIgcG9ydCBmZWF0dXJlcyAqLworI2RlZmluZSBSSF9QT1JUX0NPTk5FQ1RJT04gICAgICAgICAweDAwCisjZGVmaW5lIFJIX1BPUlRfRU5BQkxFICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUkhfUE9SVF9TVVNQRU5EICAgICAgICAgICAgMHgwMgorI2RlZmluZSBSSF9QT1JUX09WRVJfQ1VSUkVOVCAgICAgICAweDAzCisjZGVmaW5lIFJIX1BPUlRfUkVTRVQgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgUkhfUE9SVF9QT1dFUiAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBSSF9QT1JUX0xPV19TUEVFRCAgICAgICAgICAweDA5CisKKyNkZWZpbmUgUkhfQ19QT1JUX0NPTk5FQ1RJT04gICAgICAgMHgxMAorI2RlZmluZSBSSF9DX1BPUlRfRU5BQkxFICAgICAgICAgICAweDExCisjZGVmaW5lIFJIX0NfUE9SVF9TVVNQRU5EICAgICAgICAgIDB4MTIKKyNkZWZpbmUgUkhfQ19QT1JUX09WRVJfQ1VSUkVOVCAgICAgMHgxMworI2RlZmluZSBSSF9DX1BPUlRfUkVTRVQgICAgICAgICAgICAweDE0CisKKy8qIEh1YiBmZWF0dXJlcyAqLworI2RlZmluZSBSSF9DX0hVQl9MT0NBTF9QT1dFUiAgICAgICAweDAwCisjZGVmaW5lIFJIX0NfSFVCX09WRVJfQ1VSUkVOVCAgICAgIDB4MDEKKworI2RlZmluZSBSSF9ERVZJQ0VfUkVNT1RFX1dBS0VVUCAgICAweDAwCisjZGVmaW5lIFJIX0VORFBPSU5UX1NUQUxMICAgICAgICAgIDB4MDEKKworI2RlZmluZSBSSF9BQ0sgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFJIX1JFUV9FUlIgICAgICAgICAgICAgICAgIC0xCisjZGVmaW5lIFJIX05BQ0sgICAgICAgICAgICAgICAgICAgIDB4MDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGFuOTFjOTYuYyBiL2RyaXZlcnMvbGFuOTFjOTYuYwppbmRleCBhNTBjNWYwLi5lY2RjYmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xhbjkxYzk2LmMKKysrIGIvZHJpdmVycy9sYW45MWM5Ni5jCkBAIC02NSw3ICs2NSw3IEBACiAKICNpZmRlZiBDT05GSUdfRFJJVkVSX0xBTjkxQzk2CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2IuYyBiL2RyaXZlcnMvbWFjYi5jCmluZGV4IDE4NmFiMTkuLjk1Y2RjNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjYi5jCisrKyBiL2RyaXZlcnMvbWFjYi5jCkBAIC0xNyw3ICsxNyw4IEBACiAgKi8KICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX01BQ0IpICYmIChDT05GSUdfQ09NTUFORFMgJiAoQ0ZHX0NNRF9ORVQgfCBDRkdfQ01EX01JSSkpCisjaWYgZGVmaW5lZChDT05GSUdfTUFDQikgXAorCSYmIChkZWZpbmVkKENPTkZJR19DTURfTkVUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKSkKIAogLyoKICAqIFRoZSB1LWJvb3QgbmV0d29ya2luZyBzdGFjayBpcyBhIGxpdHRsZSB3ZWlyZC4gIEl0IHNlZW1zIGxpa2UgdGhlCkBAIC01MSw2ICs1Miw4IEBACiAKICNpbmNsdWRlICJtYWNiLmgiCiAKKyNkZWZpbmUgYmFycmllcigpIGFzbSB2b2xhdGlsZSgiIiA6OjogIm1lbW9yeSIpCisKICNkZWZpbmUgQ0ZHX01BQ0JfUlhfQlVGRkVSX1NJWkUJCTQwOTYKICNkZWZpbmUgQ0ZHX01BQ0JfUlhfUklOR19TSVpFCQkoQ0ZHX01BQ0JfUlhfQlVGRkVSX1NJWkUgLyAxMjgpCiAjZGVmaW5lIENGR19NQUNCX1RYX1JJTkdfU0laRQkJMTYKQEAgLTE2Myw3ICsxNjYsNyBAQAogCXJldHVybiBNQUNCX0JGRVhUKERBVEEsIGZyYW1lKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiBzdGF0aWMgaW50IG1hY2Jfc2VuZChzdHJ1Y3QgZXRoX2RldmljZSAqbmV0ZGV2LCB2b2xhdGlsZSB2b2lkICpwYWNrZXQsCiAJCSAgICAgaW50IGxlbmd0aCkKQEAgLTE4NSwzMSArMTg4LDMxIEBACiAKIAltYWNiLT50eF9yaW5nW3R4X2hlYWRdLmN0cmwgPSBjdHJsOwogCW1hY2ItPnR4X3JpbmdbdHhfaGVhZF0uYWRkciA9IHBhZGRyOworCWJhcnJpZXIoKTsKIAltYWNiX3dyaXRlbChtYWNiLCBOQ1IsIE1BQ0JfQklUKFRFKSB8IE1BQ0JfQklUKFJFKSB8IE1BQ0JfQklUKFRTVEFSVCkpOwogCiAJLyoKIAkgKiBJIGd1ZXNzIHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIG5ldHdvcmtpbmcgY29yZSBtYXkKIAkgKiByZS11c2UgdGhlIHRyYW5zbWl0IGJ1ZmZlciBhcyBzb29uIGFzIHdlIHJldHVybi4uLgogCSAqLwotCWkgPSAwOwotCXdoaWxlICghKG1hY2ItPnR4X3JpbmdbdHhfaGVhZF0uY3RybCAmIFRYQlVGX1VTRUQpKSB7Ci0JCWlmIChpID4gQ0ZHX01BQ0JfVFhfVElNRU9VVCkgewotCQkJcHJpbnRmKCIlczogVFggdGltZW91dFxuIiwgbmV0ZGV2LT5uYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDw9IENGR19NQUNCX1RYX1RJTUVPVVQ7IGkrKykgeworCQliYXJyaWVyKCk7CisJCWN0cmwgPSBtYWNiLT50eF9yaW5nW3R4X2hlYWRdLmN0cmw7CisJCWlmIChjdHJsICYgVFhCVUZfVVNFRCkKIAkJCWJyZWFrOwotCQl9CiAJCXVkZWxheSgxKTsKLQkJaSsrOwogCX0KIAogCWRtYV91bm1hcF9zaW5nbGUocGFja2V0LCBsZW5ndGgsIHBhZGRyKTsKIAogCWlmIChpIDw9IENGR19NQUNCX1RYX1RJTUVPVVQpIHsKLQkJY3RybCA9IG1hY2ItPnR4X3JpbmdbdHhfaGVhZF0uY3RybDsKIAkJaWYgKGN0cmwgJiBUWEJVRl9VTkRFUlJVTikKIAkJCXByaW50ZigiJXM6IFRYIHVuZGVycnVuXG4iLCBuZXRkZXYtPm5hbWUpOwogCQlpZiAoY3RybCAmIFRYQlVGX0VYSEFVU1RFRCkKIAkJCXByaW50ZigiJXM6IFRYIGJ1ZmZlcnMgZXhoYXVzdGVkIGluIG1pZCBmcmFtZVxuIiwKIAkJCSAgICAgICBuZXRkZXYtPm5hbWUpOworCX0gZWxzZSB7CisJCXByaW50ZigiJXM6IFRYIHRpbWVvdXRcbiIsIG5ldGRldi0+bmFtZSk7CiAJfQogCiAJLyogTm8gb25lIGNhcmVzIGFueXdheSAqLwpAQCAtMjM0LDYgKzIzNyw3IEBACiAJCWkrKzsKIAl9CiAKKwliYXJyaWVyKCk7CiAJbWFjYi0+cnhfdGFpbCA9IG5ld190YWlsOwogfQogCkBAIC0yODMsMTEgKzI4NywzOCBAQAogCQkJCXJ4X3RhaWwgPSAwOwogCQkJfQogCQl9CisJCWJhcnJpZXIoKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbWFjYl9waHlfcmVzZXQoc3RydWN0IG1hY2JfZGV2aWNlICptYWNiKQoreworCXN0cnVjdCBldGhfZGV2aWNlICpuZXRkZXYgPSAmbWFjYi0+bmV0ZGV2OworCWludCBpOworCXUxNiBzdGF0dXMsIGFkdjsKKworCWFkdiA9IEFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX0FMTDsKKwltYWNiX21kaW9fd3JpdGUobWFjYiwgTUlJX0FEVkVSVElTRSwgYWR2KTsKKwlwcmludGYoIiVzOiBTdGFydGluZyBhdXRvbmVnb3RpYXRpb24uLi5cbiIsIG5ldGRldi0+bmFtZSk7CisJbWFjYl9tZGlvX3dyaXRlKG1hY2IsIE1JSV9CTUNSLCAoQk1DUl9BTkVOQUJMRQorCQkJCQkgfCBCTUNSX0FOUkVTVEFSVCkpOworCisJZm9yIChpID0gMDsgaSA8IENGR19NQUNCX0FVVE9ORUdfVElNRU9VVCAvIDEwMDsgaSsrKSB7CisJCXN0YXR1cyA9IG1hY2JfbWRpb19yZWFkKG1hY2IsIE1JSV9CTVNSKTsKKwkJaWYgKHN0YXR1cyAmIEJNU1JfQU5FR0NPTVBMRVRFKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCX0KKworCWlmIChzdGF0dXMgJiBCTVNSX0FORUdDT01QTEVURSkKKwkJcHJpbnRmKCIlczogQXV0b25lZ290aWF0aW9uIGNvbXBsZXRlXG4iLCBuZXRkZXYtPm5hbWUpOworCWVsc2UKKwkJcHJpbnRmKCIlczogQXV0b25lZ290aWF0aW9uIHRpbWVkIG91dCAoc3RhdHVzPTB4JTA0eClcbiIsCisJCSAgICAgICBuZXRkZXYtPm5hbWUsIHN0YXR1cyk7Cit9CisKIHN0YXRpYyBpbnQgbWFjYl9waHlfaW5pdChzdHJ1Y3QgbWFjYl9kZXZpY2UgKm1hY2IpCiB7CiAJc3RydWN0IGV0aF9kZXZpY2UgKm5ldGRldiA9ICZtYWNiLT5uZXRkZXY7CkBAIC0zMDMsMzYgKzMzNCwxNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlhZHYgPSBBRFZFUlRJU0VfQ1NNQSB8IEFEVkVSVElTRV9BTEw7Ci0JbWFjYl9tZGlvX3dyaXRlKG1hY2IsIE1JSV9BRFZFUlRJU0UsIGFkdik7Ci0JcHJpbnRmKCIlczogU3RhcnRpbmcgYXV0b25lZ290aWF0aW9uLi4uXG4iLCBuZXRkZXYtPm5hbWUpOwotCW1hY2JfbWRpb193cml0ZShtYWNiLCBNSUlfQk1DUiwgKEJNQ1JfQU5FTkFCTEUKLQkJCQkJIHwgQk1DUl9BTlJFU1RBUlQpKTsKLQotI2lmIDAKLQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQotCQlwcmludGYoIm1paSVkOiAweCUwNHhcbiIsIGksIG1hY2JfbWRpb19yZWFkKG1hY2IsIGkpKTsKLSNlbmRpZgotCi0JZm9yIChpID0gMDsgaSA8IENGR19NQUNCX0FVVE9ORUdfVElNRU9VVCAvIDEwMDsgaSsrKSB7Ci0JCXN0YXR1cyA9IG1hY2JfbWRpb19yZWFkKG1hY2IsIE1JSV9CTVNSKTsKLQkJaWYgKHN0YXR1cyAmIEJNU1JfQU5FR0NPTVBMRVRFKQotCQkJYnJlYWs7Ci0JCXVkZWxheSgxMDApOwotCX0KLQotCWlmIChzdGF0dXMgJiBCTVNSX0FORUdDT01QTEVURSkKLQkJcHJpbnRmKCIlczogQXV0b25lZ290aWF0aW9uIGNvbXBsZXRlXG4iLCBuZXRkZXYtPm5hbWUpOwotCWVsc2UKLQkJcHJpbnRmKCIlczogQXV0b25lZ290aWF0aW9uIHRpbWVkIG91dCAoc3RhdHVzPTB4JTA0eClcbiIsCi0JCSAgICAgICBuZXRkZXYtPm5hbWUsIHN0YXR1cyk7Ci0KKwlzdGF0dXMgPSBtYWNiX21kaW9fcmVhZChtYWNiLCBNSUlfQk1TUik7CiAJaWYgKCEoc3RhdHVzICYgQk1TUl9MU1RBVFVTKSkgeworCQkvKiBUcnkgdG8gcmUtbmVnb3RpYXRlIGlmIHdlIGRvbid0IGhhdmUgbGluayBhbHJlYWR5LiAqLworCQltYWNiX3BoeV9yZXNldChtYWNiKTsKKwogCQlmb3IgKGkgPSAwOyBpIDwgQ0ZHX01BQ0JfQVVUT05FR19USU1FT1VUIC8gMTAwOyBpKyspIHsKLQkJCXVkZWxheSgxMDApOwogCQkJc3RhdHVzID0gbWFjYl9tZGlvX3JlYWQobWFjYiwgTUlJX0JNU1IpOwogCQkJaWYgKHN0YXR1cyAmIEJNU1JfTFNUQVRVUykKIAkJCQlicmVhazsKKwkJCXVkZWxheSgxMDApOwogCQl9CiAJfQogCkBAIC0zNDEsNiArMzUyLDcgQEAKIAkJICAgICAgIG5ldGRldi0+bmFtZSwgc3RhdHVzKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKKwkJYWR2ID0gbWFjYl9tZGlvX3JlYWQobWFjYiwgTUlJX0FEVkVSVElTRSk7CiAJCWxwYSA9IG1hY2JfbWRpb19yZWFkKG1hY2IsIE1JSV9MUEEpOwogCQltZWRpYSA9IG1paV9ud2F5X3Jlc3VsdChscGEgJiBhZHYpOwogCQlzcGVlZCA9IChtZWRpYSAmIChBRFZFUlRJU0VfMTAwRlVMTCB8IEFEVkVSVElTRV8xMDBIQUxGKQpAQCAtNDkyLDkgKzUwNCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICovCisjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCiBpbnQgbWlpcGh5X3JlYWQodW5zaWduZWQgY2hhciBhZGRyLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgc2hvcnQgKnZhbHVlKQogewpAQCAtNTcwLDYgKzU4Miw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICovCisjZW5kaWYKIAogI2VuZGlmIC8qIENPTkZJR19NQUNCICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21wYzh4eF9wY21jaWEuYyBiL2RyaXZlcnMvbXBjOHh4X3BjbWNpYS5jCmluZGV4IDM5OWE3MTkuLjhhMzRjZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXBjOHh4X3BjbWNpYS5jCisrKyBiL2RyaXZlcnMvbXBjOHh4X3BjbWNpYS5jCkBAIC02LDExICs2LDExIEBACiAKICN1bmRlZglDT05GSUdfUENNQ0lBCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIApAQCAtMjMsNyArMjMsNyBAQAogZXh0ZXJuIGludCBwY21jaWFfaGFyZHdhcmVfZW5hYmxlIChpbnQgc2xvdCk7CiBleHRlcm4gaW50IHBjbWNpYV92b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCk7CiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGV4dGVybiBpbnQgcGNtY2lhX2hhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpOwogI2VuZGlmCiAKQEAgLTE4OSw3ICsxODksNyBAQAogCXJldHVybiByYzsKIH0KIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogaW50IHBjbWNpYV9vZmYgKHZvaWQpCiB7CiAJaW50IGk7CkBAIC0yMjEsNyArMjIxLDcgQEAKIAlwY21jaWFfaGFyZHdhcmVfZGlzYWJsZShfc2xvdF8pOwogCXJldHVybiAwOwogfQotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogCiBzdGF0aWMgdV9pbnQgbTh4eF9nZXRfZ3JheWNvZGUodV9pbnQgc2l6ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmFuZC9uYW5kLmMgYi9kcml2ZXJzL25hbmQvbmFuZC5jCmluZGV4IDlmZWY3MWQuLjI3YjU3OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmFuZC9uYW5kLmMKKysrIGIvZHJpdmVycy9uYW5kL25hbmQuYwpAQCAtMjMsNyArMjMsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKIAogI2luY2x1ZGUgPG5hbmQuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uYW5kL25hbmRfYmFzZS5jIGIvZHJpdmVycy9uYW5kL25hbmRfYmFzZS5jCmluZGV4IGM2ZmVlMTguLjE1MWY1MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmFuZC9uYW5kX2Jhc2UuYworKysgYi9kcml2ZXJzL25hbmQvbmFuZF9iYXNlLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAKICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDx3YXRjaGRvZy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uYW5kL25hbmRfYmJ0LmMgYi9kcml2ZXJzL25hbmQvbmFuZF9iYnQuYwppbmRleCBhYWE5NDAwLi4xOWE5YmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25hbmQvbmFuZF9iYnQuYworKysgYi9kcml2ZXJzL25hbmQvbmFuZF9iYnQuYwpAQCAtNTQsNyArNTQsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKIAogI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9jb21wYXQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmFuZC9uYW5kX2VjYy5jIGIvZHJpdmVycy9uYW5kL25hbmRfZWNjLmMKaW5kZXggOTAyNzRlNi4uNGM1MzJiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uYW5kL25hbmRfZWNjLmMKKysrIGIvZHJpdmVycy9uYW5kL25hbmRfZWNjLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAKICNpbmNsdWRlPGxpbnV4L210ZC9tdGQuaD4KIApAQCAtMTk3LDQgKzE5Nyw0IEBACiAJcmV0dXJuIC0xOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmFuZC9uYW5kX2lkcy5jIGIvZHJpdmVycy9uYW5kL25hbmRfaWRzLmMKaW5kZXggOGI1ODczNi4uMDc1Y2FlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uYW5kL25hbmRfaWRzLmMKKysrIGIvZHJpdmVycy9uYW5kL25hbmRfaWRzLmMKQEAgLTEzLDcgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25hbmQvbmFuZF91dGlsLmMgYi9kcml2ZXJzL25hbmQvbmFuZF91dGlsLmMKaW5kZXggMTBiZjAzNi4uY2YwNTA0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uYW5kL25hbmRfdXRpbC5jCisrKyBiL2RyaXZlcnMvbmFuZC9uYW5kX3V0aWwuYwpAQCAtMzIsMTEgKzMyLDEyIEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQogCiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPHdhdGNoZG9nLmg+CiAjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8ZGl2NjQuaD4KIAogI2luY2x1ZGUgPG5hbmQuaD4KICNpbmNsdWRlIDxqZmZzMi9qZmZzMi5oPgpAQCAtMjA4LDEwICsyMDksMTAgQEAKIAkJfQogCiAJCWlmICghb3B0cy0+cXVpZXQpIHsKLQkJCWludCBwZXJjZW50ID0gKGludCkKLQkJCQkoKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyBuID0odW5zaWduZWQgbG9uZyBsb25nKQogCQkJCSAoZXJhc2UuYWRkcittZW1pbmZvLT5lcmFzZXNpemUtb3B0cy0+b2Zmc2V0KQotCQkJCSAqIDEwMCAvIGVyYXNlX2xlbmd0aCk7CisJCQkJICogMTAwOworCQkJaW50IHBlcmNlbnQgPSAoaW50KWRvX2RpdihuLCBlcmFzZV9sZW5ndGgpOwogCiAJCQkvKiBvdXRwdXQgcHJvZ3Jlc3MgbWVzc2FnZSBvbmx5IGF0IHdob2xlIHBlcmNlbnQKIAkJCSAqIHN0ZXBzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIHByaW50ZWQKQEAgLTQ3NSwxMCArNDc2LDkgQEAKIAkJaW1nbGVuIC09IHJlYWRsZW47CiAKIAkJaWYgKCFvcHRzLT5xdWlldCkgewotCQkJaW50IHBlcmNlbnQgPSAoaW50KQotCQkJCSgodW5zaWduZWQgbG9uZyBsb25nKQotCQkJCSAob3B0cy0+bGVuZ3RoLWltZ2xlbikgKiAxMDAKLQkJCQkgLyBvcHRzLT5sZW5ndGgpOworCQkJdW5zaWduZWQgbG9uZyBsb25nIG4gPSAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCSAob3B0cy0+bGVuZ3RoLWltZ2xlbikgKiAxMDA7CisJCQlpbnQgcGVyY2VudCA9IChpbnQpZG9fZGl2KG4sIG9wdHMtPmxlbmd0aCk7CiAJCQkvKiBvdXRwdXQgcHJvZ3Jlc3MgbWVzc2FnZSBvbmx5IGF0IHdob2xlIHBlcmNlbnQKIAkJCSAqIHN0ZXBzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIHByaW50ZWQKIAkJCSAqIG9uIChzbG93KSBzZXJpYWwgY29uc29sZXMKQEAgLTY1MSwxMCArNjUxLDkgQEAKIAkJfQogCiAJCWlmICghb3B0cy0+cXVpZXQpIHsKLQkJCWludCBwZXJjZW50ID0gKGludCkKLQkJCQkoKHVuc2lnbmVkIGxvbmcgbG9uZykKLQkJCQkgKG9wdHMtPmxlbmd0aC1pbWdsZW4pICogMTAwCi0JCQkJIC8gb3B0cy0+bGVuZ3RoKTsKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyBuID0gKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkgKG9wdHMtPmxlbmd0aC1pbWdsZW4pICogMTAwOworCQkJaW50IHBlcmNlbnQgPSAoaW50KWRvX2RpdihuICxvcHRzLT5sZW5ndGgpOwogCQkJLyogb3V0cHV0IHByb2dyZXNzIG1lc3NhZ2Ugb25seSBhdCB3aG9sZSBwZXJjZW50CiAJCQkgKiBzdGVwcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBtZXNzYWdlcyBwcmludGVkCiAJCQkgKiBvbiAoc2xvdykgc2VyaWFsIGNvbnNvbGVzCkBAIC04NTksNCArODU4LDQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25hbmRfbGVnYWN5L25hbmRfbGVnYWN5LmMgYi9kcml2ZXJzL25hbmRfbGVnYWN5L25hbmRfbGVnYWN5LmMKaW5kZXggNzUzZjU0MS4uNDlkMmViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uYW5kX2xlZ2FjeS9uYW5kX2xlZ2FjeS5jCisrKyBiL2RyaXZlcnMvbmFuZF9sZWdhY3kvbmFuZF9sZWdhY3kuYwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHdhdGNoZG9nLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9pZHMuaD4KQEAgLTE2MDksNCArMTYwOSw0IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0pGRlMyX05BTkQgKi8KIAotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICYmIGRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25hdHNlbWkuYyBiL2RyaXZlcnMvbmF0c2VtaS5jCmluZGV4IGIwMDlkYjYuLjA3NWQ2YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmF0c2VtaS5jCisrKyBiL2RyaXZlcnMvbmF0c2VtaS5jCkBAIC01Niw4ICs1Niw4IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8cGNpLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAotCWRlZmluZWQoQ09ORklHX05BVFNFTUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgXAorCSYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgZGVmaW5lZChDT05GSUdfTkFUU0VNSSkKIAogLyogZGVmaW5lcyAqLwogI2RlZmluZSBFRVBST01fU0laRSAweGIgLyoxMiAxNi1iaXQgY2h1bmtzLCBvciAyNCBieXRlcyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldGFybV9ldGguYyBiL2RyaXZlcnMvbmV0YXJtX2V0aC5jCmluZGV4IDg5YjNhODMuLmE5OWVlNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0YXJtX2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0YXJtX2V0aC5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvbmV0YXJtX3JlZ2lzdGVycy5oPgogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogc3RhdGljIGludCBuYV9taWlfcG9sbF9idXN5ICh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uczgzODJ4LmMgYi9kcml2ZXJzL25zODM4MnguYwppbmRleCA5NzZmODZhLi5mOGIxNDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25zODM4MnguYworKysgYi9kcml2ZXJzL25zODM4MnguYwpAQCAtNTYsOCArNTYsOCBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHBjaS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKLQlkZWZpbmVkKENPTkZJR19OUzgzODJYKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpIFwKKwkmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIGRlZmluZWQoQ09ORklHX05TODM4MlgpCiAKIC8qIGRlZmluZXMgKi8KICNkZWZpbmUgRFNJWkUgICAgIDB4MDAwMDBGRkYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpLmMgYi9kcml2ZXJzL3BjaS5jCmluZGV4IDA1MDU4MmYuLjQxNTg5MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpLmMKKysrIGIvZHJpdmVycy9wY2kuYwpAQCAtNDkwLDEwICs0OTAsMTYgQEAKIAogaW50IHBjaV9ob3NlX3NjYW4oc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQogeworCS8qIFN0YXJ0IHNjYW4gYXQgY3VycmVudF9idXNuby4KKwkgKiBQQ0llIHdpbGwgc3RhcnQgc2NhbiBhdCBmaXJzdF9idXNubysxLgorCSAqLworCS8qIEZvciBsZWdhY3kgc3VwcG9ydCwgZW5zdXJlIGN1cnJlbnQ+PWZpcnN0ICovCisJaWYgKGhvc2UtPmZpcnN0X2J1c25vID4gaG9zZS0+Y3VycmVudF9idXNubykKKwkJaG9zZS0+Y3VycmVudF9idXNubyA9IGhvc2UtPmZpcnN0X2J1c25vOwogI2lmZGVmIENPTkZJR19QQ0lfUE5QCiAJcGNpYXV0b19jb25maWdfaW5pdChob3NlKTsKICNlbmRpZgotCXJldHVybiBwY2lfaG9zZV9zY2FuX2J1cyhob3NlLCBob3NlLT5maXJzdF9idXNubyk7CisJcmV0dXJuIHBjaV9ob3NlX3NjYW5fYnVzKGhvc2UsIGhvc2UtPmN1cnJlbnRfYnVzbm8pOwogfQogCiB2b2lkIHBjaV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaV9hdXRvLmMgYi9kcml2ZXJzL3BjaV9hdXRvLmMKaW5kZXggZjE3MGMyZC4uMjM3ODU1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2lfYXV0by5jCisrKyBiL2RyaXZlcnMvcGNpX2F1dG8uYwpAQCAtNjUsNyArNjUsNyBAQAogCiAJcmVzLT5idXNfbG93ZXIgPSBhZGRyICsgc2l6ZTsKIAotCURFQlVHRigiYWRkcmVzcz0weCVseCIsIGFkZHIpOworCURFQlVHRigiYWRkcmVzcz0weCVseCBidXNfbG93ZXI9JXgiLCBhZGRyLCByZXMtPmJ1c19sb3dlcik7CiAKIAkqYmFyID0gYWRkcjsKIAlyZXR1cm4gMDsKQEAgLTk0LDcgKzk0LDcgQEAKIAlwY2lfaG9zZV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBkZXYsIFBDSV9DT01NQU5ELCAmY21kc3RhdCk7CiAJY21kc3RhdCA9IChjbWRzdGF0ICYgfihQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSkpIHwgUENJX0NPTU1BTkRfTUFTVEVSOwogCi0JZm9yIChiYXIgPSBQQ0lfQkFTRV9BRERSRVNTXzA7IGJhciA8PSBQQ0lfQkFTRV9BRERSRVNTXzAgKyAoYmFyc19udW0qNCk7IGJhciArPSA0KSB7CisJZm9yIChiYXIgPSBQQ0lfQkFTRV9BRERSRVNTXzA7IGJhciA8IFBDSV9CQVNFX0FERFJFU1NfMCArIChiYXJzX251bSo0KTsgYmFyICs9IDQpIHsKIAkJLyogVGlja2xlIHRoZSBCQVIgYW5kIGdldCB0aGUgcmVzcG9uc2UgKi8KIAkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgYmFyLCAweGZmZmZmZmZmKTsKIAkJcGNpX2hvc2VfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBiYXIsICZiYXJfcmVzcG9uc2UpOwpAQCAtMTU0LDcgKzE1NCw3IEBACiAJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg4MCk7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaWF1dG9fcHJlc2Nhbl9zZXR1cF9icmlkZ2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAordm9pZCBwY2lhdXRvX3ByZXNjYW5fc2V0dXBfYnJpZGdlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKIAkJCQkJIHBjaV9kZXZfdCBkZXYsIGludCBzdWJfYnVzKQogewogCXN0cnVjdCBwY2lfcmVnaW9uICpwY2lfbWVtID0gaG9zZS0+cGNpX21lbTsKQEAgLTE2NSw4ICsxNjUsMTAgQEAKIAlwY2lfaG9zZV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBkZXYsIFBDSV9DT01NQU5ELCAmY21kc3RhdCk7CiAKIAkvKiBDb25maWd1cmUgYnVzIG51bWJlciByZWdpc3RlcnMgKi8KLQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9QUklNQVJZX0JVUywgUENJX0JVUyhkZXYpKTsKLQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9TRUNPTkRBUllfQlVTLCBzdWJfYnVzKTsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9QUklNQVJZX0JVUywKKwkJCQkgICBQQ0lfQlVTKGRldikgLSBob3NlLT5maXJzdF9idXNubyk7CisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfU0VDT05EQVJZX0JVUywKKwkJCQkgICBzdWJfYnVzIC0gaG9zZS0+Zmlyc3RfYnVzbm8pOwogCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX1NVQk9SRElOQVRFX0JVUywgMHhmZik7CiAKIAlpZiAocGNpX21lbSkgewpAQCAtMjExLDcgKzIxMyw3IEBACiAJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgUENJX0NPTU1BTkQsIGNtZHN0YXQgfCBQQ0lfQ09NTUFORF9NQVNURVIpOwogfQogCi1zdGF0aWMgdm9pZCBwY2lhdXRvX3Bvc3RzY2FuX3NldHVwX2JyaWRnZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCit2b2lkIHBjaWF1dG9fcG9zdHNjYW5fc2V0dXBfYnJpZGdlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKIAkJCQkJICBwY2lfZGV2X3QgZGV2LCBpbnQgc3ViX2J1cykKIHsKIAlzdHJ1Y3QgcGNpX3JlZ2lvbiAqcGNpX21lbSA9IGhvc2UtPnBjaV9tZW07CkBAIC0yMTksNyArMjIxLDggQEAKIAlzdHJ1Y3QgcGNpX3JlZ2lvbiAqcGNpX2lvID0gaG9zZS0+cGNpX2lvOwogCiAJLyogQ29uZmlndXJlIGJ1cyBudW1iZXIgcmVnaXN0ZXJzICovCi0JcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfU1VCT1JESU5BVEVfQlVTLCBzdWJfYnVzKTsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9TVUJPUkRJTkFURV9CVVMsCisJCQkJICAgc3ViX2J1cyAtIGhvc2UtPmZpcnN0X2J1c25vKTsKIAogCWlmIChwY2lfbWVtKSB7CiAJCS8qIFJvdW5kIG1lbW9yeSBhbGxvY2F0b3IgdG8gMU1CIGJvdW5kYXJ5ICovCkBAIC0yODIsMjUgKzI4NSwzNiBAQAogCWlmIChob3NlLT5wY2lfbWVtKSB7CiAJCXBjaWF1dG9fcmVnaW9uX2luaXQoaG9zZS0+cGNpX21lbSk7CiAKLQkJREVCVUdGKCJQQ0kgQXV0b2NvbmZpZzogTWVtb3J5IHJlZ2lvbjogWyVseC0lbHhdXG4iLAorCQlERUJVR0YoIlBDSSBBdXRvY29uZmlnOiBCdXMgTWVtb3J5IHJlZ2lvbjogWyVseC0lbHhdLFxuIgorCQkgICAgICAgIlx0XHRQaHlzaWNhbCBNZW1vcnkgWyV4LSV4XVxuIiwKIAkJICAgIGhvc2UtPnBjaV9tZW0tPmJ1c19zdGFydCwKLQkJICAgIGhvc2UtPnBjaV9tZW0tPmJ1c19zdGFydCArIGhvc2UtPnBjaV9tZW0tPnNpemUgLSAxKTsKKwkJICAgIGhvc2UtPnBjaV9tZW0tPmJ1c19zdGFydCArIGhvc2UtPnBjaV9tZW0tPnNpemUgLSAxLAorCQkgICAgaG9zZS0+cGNpX21lbS0+cGh5c19zdGFydCwKKwkJICAgIGhvc2UtPnBjaV9tZW0tPnBoeXNfc3RhcnQgKyBob3NlLT5wY2lfbWVtLT5zaXplIC0gMSk7CiAJfQogCiAJaWYgKGhvc2UtPnBjaV9wcmVmZXRjaCkgewogCQlwY2lhdXRvX3JlZ2lvbl9pbml0KGhvc2UtPnBjaV9wcmVmZXRjaCk7CiAKLQkJREVCVUdGKCJQQ0kgQXV0b2NvbmZpZzogUHJlZmV0Y2hhYmxlIE1lbW9yeSByZWdpb246IFslbHgtJWx4XVxuIiwKKwkJREVCVUdGKCJQQ0kgQXV0b2NvbmZpZzogQnVzIFByZWZldGNoYWJsZSBNZW06IFslbHgtJWx4XSxcbiIKKwkJICAgICAgICJcdFx0UGh5c2ljYWwgTWVtb3J5IFsleC0leF1cbiIsCiAJCSAgICBob3NlLT5wY2lfcHJlZmV0Y2gtPmJ1c19zdGFydCwKLQkJICAgIGhvc2UtPnBjaV9wcmVmZXRjaC0+YnVzX3N0YXJ0ICsgaG9zZS0+cGNpX3ByZWZldGNoLT5zaXplIC0gMSk7CisJCSAgICBob3NlLT5wY2lfcHJlZmV0Y2gtPmJ1c19zdGFydCArIGhvc2UtPnBjaV9wcmVmZXRjaC0+c2l6ZSAtIDEsCisJCSAgICBob3NlLT5wY2lfcHJlZmV0Y2gtPnBoeXNfc3RhcnQsCisJCSAgICBob3NlLT5wY2lfcHJlZmV0Y2gtPnBoeXNfc3RhcnQgKworCQkJCWhvc2UtPnBjaV9wcmVmZXRjaC0+c2l6ZSAtIDEpOwogCX0KIAogCWlmIChob3NlLT5wY2lfaW8pIHsKIAkJcGNpYXV0b19yZWdpb25faW5pdChob3NlLT5wY2lfaW8pOwogCi0JCURFQlVHRigiUENJIEF1dG9jb25maWc6IEkvTyByZWdpb246IFslbHgtJWx4XVxuIiwKKwkJREVCVUdGKCJQQ0kgQXV0b2NvbmZpZzogQnVzIEkvTyByZWdpb246IFslbHgtJWx4XSxcbiIKKwkJICAgICAgICJcdFx0UGh5c2ljYWwgTWVtb3J5OiBbJXgtJXhdXG4iLAogCQkgICAgaG9zZS0+cGNpX2lvLT5idXNfc3RhcnQsCi0JCSAgICBob3NlLT5wY2lfaW8tPmJ1c19zdGFydCArIGhvc2UtPnBjaV9pby0+c2l6ZSAtIDEpOworCQkgICAgaG9zZS0+cGNpX2lvLT5idXNfc3RhcnQgKyBob3NlLT5wY2lfaW8tPnNpemUgLSAxLAorCQkgICAgaG9zZS0+cGNpX2lvLT5waHlzX3N0YXJ0LAorCQkgICAgaG9zZS0+cGNpX2lvLT5waHlzX3N0YXJ0ICsgaG9zZS0+cGNpX2lvLT5zaXplIC0gMSk7CisKIAl9CiB9CiAKQEAgLTMxNyw2ICszMzEsMTIgQEAKIAlwY2lfaG9zZV9yZWFkX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgUENJX0NMQVNTX0RFVklDRSwgJmNsYXNzKTsKIAogCXN3aXRjaChjbGFzcykgeworCWNhc2UgUENJX0NMQVNTX1BST0NFU1NPUl9QT1dFUlBDOiAvKiBhbiBhZ2VudCBvciBlbmQtcG9pbnQgKi8KKwkJREVCVUdGKCJQQ0kgQXV0b0NvbmZpZzogRm91bmQgUG93ZXJQQyBkZXZpY2VcbiIpOworCQlwY2lhdXRvX3NldHVwX2RldmljZShob3NlLCBkZXYsIDYsIGhvc2UtPnBjaV9tZW0sCisJCQkJICAgICBob3NlLT5wY2lfcHJlZmV0Y2gsIGhvc2UtPnBjaV9pbyk7CisJCWJyZWFrOworCiAJY2FzZSBQQ0lfQ0xBU1NfQlJJREdFX1BDSToKIAkJaG9zZS0+Y3VycmVudF9idXNubysrOwogCQlwY2lhdXRvX3NldHVwX2RldmljZShob3NlLCBkZXYsIDIsIGhvc2UtPnBjaV9tZW0sIGhvc2UtPnBjaV9wcmVmZXRjaCwgaG9zZS0+cGNpX2lvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpX2luZGlyZWN0LmMgYi9kcml2ZXJzL3BjaV9pbmRpcmVjdC5jCmluZGV4IGQ3YmUwODEuLmE4MjIwZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpX2luZGlyZWN0LmMKKysrIGIvZHJpdmVycy9wY2lfaW5kaXJlY3QuYwpAQCAtNDUsNyArNDUsNyBAQAogCWNmZ18jI3J3KHZhbCwgaG9zZS0+Y2ZnX2RhdGEgKyAob2Zmc2V0ICYgbWFzayksIHR5cGUsIG9wKTsJIFwKIAlyZXR1cm4gMDsgICAgCQkJCQkgCQkgXAogfQotI2VsaWYgZGVmaW5lZChDT05GSUdfRTUwMCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0U1MDApIHx8IGRlZmluZWQoQ09ORklHX01QQzg2eHgpCiAjZGVmaW5lIElORElSRUNUX1BDSV9PUChydywgc2l6ZSwgdHlwZSwgb3AsIG1hc2spICAgICAgICAgICAgICAgICAgICAgICAgXAogc3RhdGljIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIGluZGlyZWN0XyMjcncjI19jb25maWdfIyNzaXplKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgICAgICAgICAgICAgICBcCkBAIC01NSw3ICs1NSw3IEBACiAJYiA9IFBDSV9CVVMoZGV2KTsgZCA9IFBDSV9ERVYoZGV2KTsgZiA9IFBDSV9GVU5DKGRldik7CQkgXAogCWIgPSBiIC0gaG9zZS0+Zmlyc3RfYnVzbm87CQkJCQkgXAogCWRldiA9IFBDSV9CREYoYiwgZCwgZik7CQkJCQkJIFwKLQkqKGhvc2UtPmNmZ19hZGRyKSA9IGRldiB8IChvZmZzZXQgJiAweGZjKSB8IDB4ODAwMDAwMDA7ICAgICAgICAgIFwKKwkqKGhvc2UtPmNmZ19hZGRyKSA9IGRldiB8IChvZmZzZXQgJiAweGZjKSB8ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8IDB4ODAwMDAwMDA7IFwKIAlzeW5jKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAljZmdfIyNydyh2YWwsIGhvc2UtPmNmZ19kYXRhICsgKG9mZnNldCAmIG1hc2spLCB0eXBlLCBvcCk7ICAgICAgIFwKIAlyZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNuZXQuYyBiL2RyaXZlcnMvcGNuZXQuYwppbmRleCBkYTlhYzdmLi4yYWYwZThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbmV0LmMKKysrIGIvZHJpdmVycy9wY25ldC5jCkBAIC00NSw4ICs0NSw4IEBACiAjZGVmaW5lIFBDTkVUX0RFQlVHMihmbXQsYXJncy4uLikKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpIFwKLSAgICAmJiBkZWZpbmVkKENPTkZJR19QQ05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSBcCisJJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBkZWZpbmVkKENPTkZJR19QQ05FVCkKIAogI2lmICFkZWZpbmVkKENPTkZfUENORVRfNzlDOTczKSAmJiBkZWZpbmVkKENPTkZfUENORVRfNzlDOTc1KQogI2Vycm9yICJNYWNybyBmb3IgUENuZXQgY2hpcCB2ZXJzaW9uIGlzIG5vdCBkZWZpbmVkISIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxiMjgwMF9ldGguYyBiL2RyaXZlcnMvcGxiMjgwMF9ldGguYwppbmRleCA0YzY4M2Q3Li4wYWU1ZDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYjI4MDBfZXRoLmMKKysrIGIvZHJpdmVycy9wbGIyODAwX2V0aC5jCkBAIC0yNSw4ICsyNSw4IEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSBcCi0JJiYgZGVmaW5lZChDT05GSUdfUExCMjgwMF9FVEhFUikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSBcCisJJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBkZWZpbmVkKENPTkZJR19QTEIyODAwX0VUSEVSKQogCiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjaW5jbHVkZSA8bmV0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3B4YV9wY21jaWEuYyBiL2RyaXZlcnMvcHhhX3BjbWNpYS5jCmluZGV4IGQ5ZDM4YmIuLjYwMjBlNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHhhX3BjbWNpYS5jCisrKyBiL2RyaXZlcnMvcHhhX3BjbWNpYS5jCkBAIC04NSw3ICs4NSw3IEBACiAJcmV0dXJuIHJjOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBpbnQgcGNtY2lhX29mZiAodm9pZCkKIHsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcWUvcWUuYyBiL2RyaXZlcnMvcWUvcWUuYwppbmRleCA1ZjIwOTYyLi4wZjUyMzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3FlL3FlLmMKKysrIGIvZHJpdmVycy9xZS9xZS5jCkBAIC05OCw3ICs5OCw3IEBACiAJb3V0X2JlMzIoJnAtPnNkYXFtciwgMCk7CiAKIAkvKiBBbGxvY2F0ZSAyS0IgdGVtcG9yYXJ5IGJ1ZmZlciBmb3Igc2RtYSAqLwotCXNkbWFfYnVmZmVyX2Jhc2UgPSBxZV9tdXJhbV9hbGxvYygyMDQ4LCA2NCk7CisJc2RtYV9idWZmZXJfYmFzZSA9IHFlX211cmFtX2FsbG9jKDIwNDgsIDQwOTYpOwogCW91dF9iZTMyKCZwLT5zZHdiY3IsIHNkbWFfYnVmZmVyX2Jhc2UgJiBRRV9TREVCQ1JfQkFfTUFTSyk7CiAKIAkvKiBDbGVhciBzZG1hIHN0YXR1cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9xZS9xZS5oIGIvZHJpdmVycy9xZS9xZS5oCmluZGV4IDBiY2QwYTkuLjQwMGIxYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcWUvcWUuaAorKysgYi9kcml2ZXJzL3FlL3FlLmgKQEAgLTI5LDcgKzI5LDcgQEAKICNkZWZpbmUgUUVfTlVNX09GX0JSR1MJMTYKICNkZWZpbmUgVUNDX01BWF9OVU0JOAogCi0jZGVmaW5lIFFFX0RBVEFPTkxZX0JBU0UJKHVpbnQpKDEyOCkKKyNkZWZpbmUgUUVfREFUQU9OTFlfQkFTRQkwCiAjZGVmaW5lIFFFX0RBVEFPTkxZX1NJWkUJKFFFX01VUkFNX1NJWkUgLSBRRV9EQVRBT05MWV9CQVNFKQogCiAvKiBRRSB0aHJlYWRzIFNOVU0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcWUvdWVjLmMgYi9kcml2ZXJzL3FlL3VlYy5jCmluZGV4IGM0MTZhNjcuLjg5YTcyNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcWUvdWVjLmMKKysrIGIvZHJpdmVycy9xZS91ZWMuYwpAQCAtMzkxLDE3ICszOTEsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpbml0X21paV9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24odWVjX3QgKnVlY19yZWdzKQorc3RhdGljIGludCBpbml0X21paV9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24odWVjX21paV90ICp1ZWNfbWlpX3JlZ3MpCiB7CiAJdWludAkJdGltZW91dCA9IDB4MTAwMDsKIAl1MzIJCW1paW1jZmcgPSAwOwogCi0JbWlpbWNmZyA9IGluX2JlMzIoJnVlY19yZWdzLT5taWltY2ZnKTsKKwltaWltY2ZnID0gaW5fYmUzMigmdWVjX21paV9yZWdzLT5taWltY2ZnKTsKIAltaWltY2ZnIHw9IE1JSU1DRkdfTU5HTU5UX0NMQ19ESVZfSU5JVF9WQUxVRTsKLQlvdXRfYmUzMigmdWVjX3JlZ3MtPm1paW1jZmcsIG1paW1jZmcpOworCW91dF9iZTMyKCZ1ZWNfbWlpX3JlZ3MtPm1paW1jZmcsIG1paW1jZmcpOwogCiAJLyogV2FpdCB1bnRpbCB0aGUgYnVzIGlzIGZyZWUgKi8KLQl3aGlsZSAoKGluX2JlMzIoJnVlY19yZWdzLT5taWltY2ZnKSAmIE1JSU1JTkRfQlVTWSkgJiYgdGltZW91dC0tKTsKKwl3aGlsZSAoKGluX2JlMzIoJnVlY19taWlfcmVncy0+bWlpbWNmZykgJiBNSUlNSU5EX0JVU1kpICYmIHRpbWVvdXQtLSk7CiAJaWYgKHRpbWVvdXQgPD0gMCkgewogCQlwcmludGYoIiVzOiBUaGUgTUlJIEJ1cyBpcyBzdHVjayEiLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKQEAgLTQxMywxMyArNDEzLDEzIEBACiBzdGF0aWMgaW50IGluaXRfcGh5KHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCiB7CiAJdWVjX3ByaXZhdGVfdAkJKnVlYzsKLQl1ZWNfdAkJCSp1ZWNfcmVnczsKKwl1ZWNfbWlpX3QJCSp1bWlpX3JlZ3M7CiAJc3RydWN0IHVlY19taWlfaW5mbwkqbWlpX2luZm87CiAJc3RydWN0IHBoeV9pbmZvCQkqY3VycGh5OwogCWludAkJCWVycjsKIAogCXVlYyA9ICh1ZWNfcHJpdmF0ZV90ICopZGV2LT5wcml2OwotCXVlY19yZWdzID0gdWVjLT51ZWNfcmVnczsKKwl1bWlpX3JlZ3MgPSB1ZWMtPnVlY19taWlfcmVnczsKIAogCXVlYy0+b2xkbGluayA9IDA7CiAJdWVjLT5vbGRzcGVlZCA9IDA7CkBAIC00NTEsMTkgKzQ1MSwxOSBAQAogCW1paV9pbmZvLT5taWlfaWQgPSB1ZWMtPnVlY19pbmZvLT5waHlfYWRkcmVzczsKIAltaWlfaW5mby0+ZGV2ID0gZGV2OwogCi0JbWlpX2luZm8tPm1kaW9fcmVhZCA9ICZyZWFkX3BoeV9yZWc7Ci0JbWlpX2luZm8tPm1kaW9fd3JpdGUgPSAmd3JpdGVfcGh5X3JlZzsKKwltaWlfaW5mby0+bWRpb19yZWFkID0gJnVlY19yZWFkX3BoeV9yZWc7CisJbWlpX2luZm8tPm1kaW9fd3JpdGUgPSAmdWVjX3dyaXRlX3BoeV9yZWc7CiAKIAl1ZWMtPm1paV9pbmZvID0gbWlpX2luZm87CiAKLQlpZiAoaW5pdF9taWlfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uKHVlY19yZWdzKSkgeworCWlmIChpbml0X21paV9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24odW1paV9yZWdzKSkgewogCQlwcmludGYoIiVzOiBUaGUgTUlJIEJ1cyBpcyBzdHVjayEiLCBkZXYtPm5hbWUpOwogCQllcnIgPSAtMTsKIAkJZ290byBidXNfZmFpbDsKIAl9CiAKIAkvKiBnZXQgaW5mbyBmb3IgdGhpcyBQSFkgKi8KLQljdXJwaHkgPSBnZXRfcGh5X2luZm8odWVjLT5taWlfaW5mbyk7CisJY3VycGh5ID0gdWVjX2dldF9waHlfaW5mbyh1ZWMtPm1paV9pbmZvKTsKIAlpZiAoIWN1cnBoeSkgewogCQlwcmludGYoIiVzOiBObyBQSFkgZm91bmQiLCBkZXYtPm5hbWUpOwogCQllcnIgPSAtMTsKQEAgLTk4OSw2ICs5ODksMTMgQEAKIAkvKiBTZXR1cCBNQUMgaW50ZXJmYWNlIG1vZGUgKi8KIAl1ZWNfc2V0X21hY19pZl9tb2RlKHVlYywgdWVjX2luZm8tPmVuZXRfaW50ZXJmYWNlKTsKIAorCS8qIFNldHVwIE1JSSBtYW5hZ2VtZW50IGJhc2UgKi8KKyNpZm5kZWYgQ09ORklHX2VUU0VDX01ESU9fQlVTCisJdWVjLT51ZWNfbWlpX3JlZ3MgPSAodWVjX21paV90ICopKCZ1ZWNfcmVncy0+bWlpbWNmZyk7CisjZWxzZQorCXVlYy0+dWVjX21paV9yZWdzID0gKHVlY19taWlfdCAqKSBDT05GSUdfTUlJTV9BRERSRVNTOworI2VuZGlmCisKIAkvKiBTZXR1cCBNSUkgbWFzdGVyIGNsb2NrIHNvdXJjZSAqLwogCXFlX3NldF9taWlfY2xrX3NyYyh1ZWNfaW5mby0+dWZfaW5mby51Y2NfbnVtKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9xZS91ZWMuaCBiL2RyaXZlcnMvcWUvdWVjLmgKaW5kZXggMDQ5NTAyNi4uYzM4NDA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9xZS91ZWMuaAorKysgYi9kcml2ZXJzL3FlL3VlYy5oCkBAIC02NzUsNiArNjc1LDcgQEAKIAl1Y2NfZmFzdF9wcml2YXRlX3QJCSp1Y2NmOwogCXN0cnVjdCBldGhfZGV2aWNlCQkqZGV2OwogCXVlY190CQkJCSp1ZWNfcmVnczsKKwl1ZWNfbWlpX3QJCQkqdWVjX21paV9yZWdzOwogCS8qIGVuZXQgaW5pdCBjb21tYW5kIHBhcmFtZXRlciAqLwogCXVlY19pbml0X2NtZF9wcmFtX3QJCSpwX2luaXRfZW5ldF9wYXJhbTsKIAl1MzIJCQkJaW5pdF9lbmV0X3BhcmFtX29mZnNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcWUvdWVjX3BoeS5jIGIvZHJpdmVycy9xZS91ZWNfcGh5LmMKaW5kZXggNzZmZDM4OC4uY2E2ZmFhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9xZS91ZWNfcGh5LmMKKysrIGIvZHJpdmVycy9xZS91ZWNfcGh5LmMKQEAgLTYwLDE0ICs2MCwxNCBAQAogLyogV3JpdGUgdmFsdWUgdG8gdGhlIFBIWSBmb3IgdGhpcyBkZXZpY2UgdG8gdGhlIHJlZ2lzdGVyIGF0IHJlZ251bSwgKi8KIC8qIHdhaXRpbmcgdW50aWwgdGhlIHdyaXRlIGlzIGRvbmUgYmVmb3JlIGl0IHJldHVybnMuICBBbGwgUEhZICovCiAvKiBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIHRocm91Z2ggdGhlIFRTRUMxIE1JSU0gcmVncyAqLwotdm9pZCB3cml0ZV9waHlfcmVnIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtLCBpbnQgdmFsdWUpCit2b2lkIHVlY193cml0ZV9waHlfcmVnIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtLCBpbnQgdmFsdWUpCiB7CiAJdWVjX3ByaXZhdGVfdCAqdWdldGggPSAodWVjX3ByaXZhdGVfdCAqKSBkZXYtPnByaXY7Ci0JdWVjX3QgKnVnX3JlZ3M7CisJdWVjX21paV90ICp1Z19yZWdzOwogCWVuZXRfdGJpX21paV9yZWdfZSBtaWlfcmVnID0gKGVuZXRfdGJpX21paV9yZWdfZSkgcmVnbnVtOwogCXUzMiB0bXBfcmVnOwogCi0JdWdfcmVncyA9IHVnZXRoLT51ZWNfcmVnczsKKwl1Z19yZWdzID0gdWdldGgtPnVlY19taWlfcmVnczsKIAogCS8qIFN0b3AgdGhlIE1JSSBtYW5hZ2VtZW50IHJlYWQgY3ljbGUgKi8KIAlvdXRfYmUzMiAoJnVnX3JlZ3MtPm1paW1jb20sIDApOwpAQCAtODcsMTUgKzg3LDE1IEBACiAvKiBSZWFkcyBmcm9tIHJlZ2lzdGVyIHJlZ251bSBpbiB0aGUgUEhZIGZvciBkZXZpY2UgZGV2LCAqLwogLyogcmV0dXJuaW5nIHRoZSB2YWx1ZS4gIENsZWFycyBtaWltY29tIGZpcnN0LiAgQWxsIFBIWSAqLwogLyogY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSB0aHJvdWdoIHRoZSBUU0VDMSBNSUlNIHJlZ3MgKi8KLWludCByZWFkX3BoeV9yZWcgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWdudW0pCitpbnQgdWVjX3JlYWRfcGh5X3JlZyAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZ251bSkKIHsKIAl1ZWNfcHJpdmF0ZV90ICp1Z2V0aCA9ICh1ZWNfcHJpdmF0ZV90ICopIGRldi0+cHJpdjsKLQl1ZWNfdCAqdWdfcmVnczsKKwl1ZWNfbWlpX3QgKnVnX3JlZ3M7CiAJZW5ldF90YmlfbWlpX3JlZ19lIG1paV9yZWcgPSAoZW5ldF90YmlfbWlpX3JlZ19lKSByZWdudW07CiAJdTMyIHRtcF9yZWc7CiAJdTE2IHZhbHVlOwogCi0JdWdfcmVncyA9IHVnZXRoLT51ZWNfcmVnczsKKwl1Z19yZWdzID0gdWdldGgtPnVlY19taWlfcmVnczsKIAogCS8qIFNldHRpbmcgdXAgdGhlIE1JSSBNYW5nZW1lbnQgQWRkcmVzcyBSZWdpc3RlciAqLwogCXRtcF9yZWcgPSAoKHUzMikgbWlpX2lkIDw8IE1JSU1BRERfUEhZX0FERFJFU1NfU0hJRlQpIHwgbWlpX3JlZzsKQEAgLTUyMSw3ICs1MjEsNyBAQAogLyogVXNlIHRoZSBQSFkgSUQgcmVnaXN0ZXJzIHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgUEhZIGlzIGF0dGFjaGVkCiAgKiB0byBkZXZpY2UgZGV2LiAgcmV0dXJuIGEgc3RydWN0IHBoeV9pbmZvIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoYXQgUEhZCiAgKi8KLXN0cnVjdCBwaHlfaW5mbyAqZ2V0X3BoeV9pbmZvIChzdHJ1Y3QgdWVjX21paV9pbmZvICptaWlfaW5mbykKK3N0cnVjdCBwaHlfaW5mbyAqdWVjX2dldF9waHlfaW5mbyAoc3RydWN0IHVlY19taWlfaW5mbyAqbWlpX2luZm8pCiB7CiAJdTE2IHBoeV9yZWc7CiAJdTMyIHBoeV9JRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcWUvdWVjX3BoeS5oIGIvZHJpdmVycy9xZS91ZWNfcGh5LmgKaW5kZXggOWJkOTI2ZC4uZTU5YTk0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9xZS91ZWNfcGh5LmgKKysrIGIvZHJpdmVycy9xZS91ZWNfcGh5LmgKQEAgLTI0OSwxMCArMjQ5LDEwIEBACiAJdm9pZCAoKmNsb3NlKSAoc3RydWN0IHVlY19taWlfaW5mbyAqIG1paV9pbmZvKTsKIH07CiAKLXN0cnVjdCBwaHlfaW5mbyAqZ2V0X3BoeV9pbmZvIChzdHJ1Y3QgdWVjX21paV9pbmZvICptaWlfaW5mbyk7Ci12b2lkIHdyaXRlX3BoeV9yZWcgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWdudW0sCitzdHJ1Y3QgcGh5X2luZm8gKnVlY19nZXRfcGh5X2luZm8gKHN0cnVjdCB1ZWNfbWlpX2luZm8gKm1paV9pbmZvKTsKK3ZvaWQgdWVjX3dyaXRlX3BoeV9yZWcgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWdudW0sCiAJCSAgICBpbnQgdmFsdWUpOwotaW50IHJlYWRfcGh5X3JlZyAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZ251bSk7CitpbnQgdWVjX3JlYWRfcGh5X3JlZyAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZ251bSk7CiB2b2lkIG1paV9jbGVhcl9waHlfaW50ZXJydXB0IChzdHJ1Y3QgdWVjX21paV9pbmZvICptaWlfaW5mbyk7CiB2b2lkIG1paV9jb25maWd1cmVfcGh5X2ludGVycnVwdCAoc3RydWN0IHVlY19taWlfaW5mbyAqbWlpX2luZm8sCiAJCQkJICB1MzIgaW50ZXJydXB0cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JweF9wY21jaWEuYyBiL2RyaXZlcnMvcnB4X3BjbWNpYS5jCmluZGV4IDJhMGE5ZTAuLmM3YzQyNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnB4X3BjbWNpYS5jCisrKyBiL2RyaXZlcnMvcnB4X3BjbWNpYS5jCkBAIC05LDExICs5LDExIEBACiAKICN1bmRlZglDT05GSUdfUENNQ0lBCiAKLSNpZglDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTYyLDEyICs2MiwxMiBAQAogCXJldHVybiAwOwkvKiBObyBoYXJkd2FyZSB0byBlbmFibGUgKi8KIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogc3RhdGljIGludCBwY21jaWFfaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKIHsKIAlyZXR1cm4gMDsJLyogTm8gaGFyZHdhcmUgdG8gZGlzYWJsZSAqLwogfQotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogCiAjZW5kaWYJLyogQ09ORklHX1BDTUNJQSAmJiAoQ09ORklHX1JQWENMQVNTSUMgfHwgQ09ORklHX1JQWExJVEUpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0bDgwMTkuYyBiL2RyaXZlcnMvcnRsODAxOS5jCmluZGV4IDYyYjkyNDUuLjQwOWE2OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRsODAxOS5jCisrKyBiL2RyaXZlcnMvcnRsODAxOS5jCkBAIC0zNCw3ICszNCw3IEBACiAKICNpZmRlZiBDT05GSUdfRFJJVkVSX1JUTDgwMTkKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAKIC8qIHBhY2tldCBwYWdlIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRsODEzOS5jIGIvZHJpdmVycy9ydGw4MTM5LmMKaW5kZXggYWZlMWE0Zi4uMjM2NzE4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGw4MTM5LmMKKysrIGIvZHJpdmVycy9ydGw4MTM5LmMKQEAgLTc3LDcgKzc3LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxwY2kuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCiAJZGVmaW5lZChDT05GSUdfUlRMODEzOSkKIAogI2RlZmluZSBUSUNLU19QRVJfU0VDCUNGR19IWgpAQCAtMTkzLDYgKzE5MywxMiBAQAogc3RhdGljIGludCBydGxfdHJhbnNtaXQoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgdm9sYXRpbGUgdm9pZCAqcGFja2V0LCBpbnQgbGVuZ3RoKTsKIHN0YXRpYyBpbnQgcnRsX3BvbGwoc3RydWN0IGV0aF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBydGxfZGlzYWJsZShzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KTsKKyNpZmRlZiBDT05GSUdfTUNBU1RfVEZUUC8qICBUaGlzIGRyaXZlciBhbHJlYWR5IGFjY2VwdHMgYWxsIGIvbWNhc3QgKi8KK3N0YXRpYyBpbnQgcnRsX2JjYXN0X2FkZHIgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIHU4IGJjYXN0X21hYywgdTggc2V0KQoreworCXJldHVybiAoMCk7Cit9CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHN1cHBvcnRlZFtdID0gewogICAgICAgIHtQQ0lfVkVORE9SX0lEX1JFQUxURUssIFBDSV9ERVZJQ0VfSURfUkVBTFRFS184MTM5fSwKQEAgLTIyOCw2ICsyMzQsOSBAQAogCQlkZXYtPmhhbHQgPSBydGxfZGlzYWJsZTsKIAkJZGV2LT5zZW5kID0gcnRsX3RyYW5zbWl0OwogCQlkZXYtPnJlY3YgPSBydGxfcG9sbDsKKyNpZmRlZiBDT05GSUdfTUNBU1RfVEZUUAorCQlkZXYtPm1jYXN0ID0gcnRsX2JjYXN0X2FkZHI7CisjZW5kaWYKIAogCQlldGhfcmVnaXN0ZXIgKGRldik7CiAKQEAgLTUzNSw0ICs1NDQsNCBAQAogCQl1ZGVsYXkgKDEwMCk7IC8qIHdhaXQgMTAwdXMgKi8KIAl9CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9ORVQgJiYgQ09ORklHX05FVF9NVUxUSSAmJiBDT05GSUdfUlRMODEzOSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0bDgxNjkuYyBiL2RyaXZlcnMvcnRsODE2OS5jCmluZGV4IDMzOTNiYTguLjYzZWEyY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRsODE2OS5jCisrKyBiL2RyaXZlcnMvcnRsODE2OS5jCkBAIC01NSw3ICs1NSw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8cGNpLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAogCWRlZmluZWQoQ09ORklHX1JUTDgxNjkpCiAKICN1bmRlZiBERUJVR19SVEw4MTY5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NrOThsaW4vdWJvb3RfZHJ2LmMgYi9kcml2ZXJzL3NrOThsaW4vdWJvb3RfZHJ2LmMKaW5kZXggMjYzZGFjOC4uZDAyY2QxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zazk4bGluL3Vib290X2Rydi5jCisrKyBiL2RyaXZlcnMvc2s5OGxpbi91Ym9vdF9kcnYuYwpAQCAtMjUsNyArMjUsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAogCWRlZmluZWQoQ09ORklHX1NLOTgpCiAKICNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N5bTUzYzh4eC5jIGIvZHJpdmVycy9zeW01M2M4eHguYwppbmRleCBhZTEwZjgwLi4yOWVlY2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N5bTUzYzh4eC5jCisrKyBiL2RyaXZlcnMvc3ltNTNjOHh4LmMKQEAgLTUxLDcgKzUxLDcgQEAKICNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKSAmJiBkZWZpbmVkKENPTkZJR19TQ1NJX1NZTTUzQzhYWCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkgJiYgZGVmaW5lZChDT05GSUdfU0NTSV9TWU01M0M4WFgpCiAKICN1bmRlZiBTQ1NJX1NJTkdMRV9TVEVQCiAvKgpAQCAtNzg3LDcgKzc4Nyw3IEBACiAJc2NzaV93cml0ZV9ieXRlKERNT0RFLDB4MDApOwogI2VuZGlmCiB9Ci0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkgKi8KKyNlbmRpZgogCiAKICNlbmRpZiAvKiBDT05GSUdfU0NTSV9TWU01M0M4WFggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGlfcGNpMTQxMGEuYyBiL2RyaXZlcnMvdGlfcGNpMTQxMGEuYwppbmRleCBkNTI5N2I1Li4yMDhjYTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RpX3BjaTE0MTBhLmMKKysrIGIvZHJpdmVycy90aV9wY2kxNDEwYS5jCkBAIC02NCw3ICs2NCw3IEBACiAKICNpbmNsdWRlIDxwY21jaWEuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkgJiYgZGVmaW5lZChDT05GSUdfSURFX1RJX0NBUkRCVVMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkgJiYgZGVmaW5lZChDT05GSUdfSURFX1RJX0NBUkRCVVMpCiAKIGludCBwY21jaWFfb24oaW50IGlkZV9iYXNlX2J1cyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGlnb24zLmMgYi9kcml2ZXJzL3RpZ29uMy5jCmluZGV4IGVjMmNkMmEuLjVmNmE0ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGlnb24zLmMKKysrIGIvZHJpdmVycy90aWdvbjMuYwpAQCAtMTIsNyArMTIsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmICFkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiAhZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCiAJZGVmaW5lZChDT05GSUdfVElHT04zKQogI2lmZGVmIENPTkZJR19CTVcKICNpbmNsdWRlIDxtcGM4MjR4Lmg+CkBAIC0yNiw2OSArMjYsNzAgQEAKIC8qIExvY2FsIGZ1bmN0aW9ucy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxNX1NUQVRVUyBMTV9BYm9ydChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotTE1fU1RBVFVTIExNX1F1ZXVlUnhQYWNrZXRzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTE1fQWJvcnQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitMTV9TVEFUVVMgTE1fUXVldWVSeFBhY2tldHMgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CiAKLXN0YXRpYyBMTV9TVEFUVVMgTE1fVHJhbnNsYXRlUmVxdWVzdGVkTWVkaWFUeXBlKAotICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFIFJlcXVlc3RlZE1lZGlhVHlwZSwKLSAgICBQTE1fTUVESUFfVFlQRSBwTWVkaWFUeXBlLCBQTE1fTElORV9TUEVFRCBwTGluZVNwZWVkLAotICAgIFBMTV9EVVBMRVhfTU9ERSBwRHVwbGV4TW9kZSk7CitzdGF0aWMgTE1fU1RBVFVTIExNX1RyYW5zbGF0ZVJlcXVlc3RlZE1lZGlhVHlwZSAoTE1fUkVRVUVTVEVEX01FRElBX1RZUEUKKwkJCQkJCSBSZXF1ZXN0ZWRNZWRpYVR5cGUsCisJCQkJCQkgUExNX01FRElBX1RZUEUgcE1lZGlhVHlwZSwKKwkJCQkJCSBQTE1fTElORV9TUEVFRCBwTGluZVNwZWVkLAorCQkJCQkJIFBMTV9EVVBMRVhfTU9ERSBwRHVwbGV4TW9kZSk7CiAKLXN0YXRpYyBMTV9TVEFUVVMgTE1fSW5pdEJjbTU0MHhQaHkoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK3N0YXRpYyBMTV9TVEFUVVMgTE1fSW5pdEJjbTU0MHhQaHkgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CiAKLV9faW5saW5lIHN0YXRpYyBMTV9WT0lEIExNX1NlcnZpY2VSeEludGVycnVwdChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwotX19pbmxpbmUgc3RhdGljIExNX1ZPSUQgTE1fU2VydmljZVR4SW50ZXJydXB0KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitfX2lubGluZSBzdGF0aWMgTE1fVk9JRCBMTV9TZXJ2aWNlUnhJbnRlcnJ1cHQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitfX2lubGluZSBzdGF0aWMgTE1fVk9JRCBMTV9TZXJ2aWNlVHhJbnRlcnJ1cHQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CiAKLXN0YXRpYyBMTV9TVEFUVVMgTE1fRm9yY2VBdXRvTmVnQmNtNTQweFBoeShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi0gICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEUgUmVxdWVzdGVkTWVkaWFUeXBlKTsKLXN0YXRpYyBMTV9TVEFUVVMgTE1fRm9yY2VBdXRvTmVnKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRSBSZXF1ZXN0ZWRNZWRpYVR5cGUpOwotc3RhdGljIExNX1VJTlQzMiBHZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1TVEFUSUMgTE1fU1RBVFVTIExNX1NldEZsb3dDb250cm9sKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLSAgICBMTV9VSU5UMzIgTG9jYWxQaHlBZCwgTE1fVUlOVDMyIFJlbW90ZVBoeUFkKTsKK3N0YXRpYyBMTV9TVEFUVVMgTE1fRm9yY2VBdXRvTmVnQmNtNTQweFBoeSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorCQkJCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEUKKwkJCQkJICAgIFJlcXVlc3RlZE1lZGlhVHlwZSk7CitzdGF0aWMgTE1fU1RBVFVTIExNX0ZvcmNlQXV0b05lZyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorCQkJCSAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEUgUmVxdWVzdGVkTWVkaWFUeXBlKTsKK3N0YXRpYyBMTV9VSU5UMzIgR2V0UGh5QWRGbG93Q250cmxTZXR0aW5ncyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKK1NUQVRJQyBMTV9TVEFUVVMgTE1fU2V0Rmxvd0NvbnRyb2wgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkJCQkgICAgTE1fVUlOVDMyIExvY2FsUGh5QWQsCisJCQkJICAgIExNX1VJTlQzMiBSZW1vdGVQaHlBZCk7CiAjaWYgSU5DTFVERV9UQklfU1VQUE9SVAotU1RBVElDIExNX1NUQVRVUyBMTV9TZXR1cEZpYmVyUGh5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1TVEFUSUMgTE1fU1RBVFVTIExNX0luaXRCY204MDB4UGh5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitTVEFUSUMgTE1fU1RBVFVTIExNX1NldHVwRmliZXJQaHkgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitTVEFUSUMgTE1fU1RBVFVTIExNX0luaXRCY204MDB4UGh5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOwogI2VuZGlmCi1TVEFUSUMgTE1fU1RBVFVTIExNX1NldHVwQ29wcGVyUGh5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1TVEFUSUMgUExNX0FEQVBURVJfSU5GTyBMTV9HZXRBZGFwdGVySW5mb0J5U3NpZChMTV9VSU5UMTYgU3ZpZCwgTE1fVUlOVDE2IFNzaWQpOwotU1RBVElDIExNX1NUQVRVUyBMTV9EbWFUZXN0KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1VJTlQ4IHBCdWZmZXJWaXJ0LAotCSAgIExNX1BIWVNJQ0FMX0FERFJFU1MgQnVmZmVyUGh5LCBMTV9VSU5UMzIgQnVmZmVyU2l6ZSk7Ci1TVEFUSUMgTE1fU1RBVFVTIExNX0hhbHRDcHUoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLExNX1VJTlQzMiBjcHVfbnVtYmVyKTsKLVNUQVRJQyBMTV9TVEFUVVMgTE1fUmVzZXRDaGlwKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7Ci1TVEFUSUMgTE1fU1RBVFVTIExNX1Rlc3Q0R0JvdW5kYXJ5KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0LAotICAgIFBUM19TTkRfQkQgcFNlbmRCZCk7CitTVEFUSUMgTE1fU1RBVFVTIExNX1NldHVwQ29wcGVyUGh5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpOworU1RBVElDIFBMTV9BREFQVEVSX0lORk8gTE1fR2V0QWRhcHRlckluZm9CeVNzaWQgKExNX1VJTlQxNiBTdmlkLAorCQkJCQkJIExNX1VJTlQxNiBTc2lkKTsKK1NUQVRJQyBMTV9TVEFUVVMgTE1fRG1hVGVzdCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fVUlOVDggcEJ1ZmZlclZpcnQsCisJCQkgICAgIExNX1BIWVNJQ0FMX0FERFJFU1MgQnVmZmVyUGh5LAorCQkJICAgICBMTV9VSU5UMzIgQnVmZmVyU2l6ZSk7CitTVEFUSUMgTE1fU1RBVFVTIExNX0hhbHRDcHUgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIGNwdV9udW1iZXIpOworU1RBVElDIExNX1NUQVRVUyBMTV9SZXNldENoaXAgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSk7CitTVEFUSUMgTE1fU1RBVFVTIExNX1Rlc3Q0R0JvdW5kYXJ5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisJCQkJICAgIFBMTV9QQUNLRVQgcFBhY2tldCwgUFQzX1NORF9CRCBwU2VuZEJkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEV4dGVybmFsIGZ1bmN0aW9ucy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxNX1NUQVRVUyBMTV9Mb2FkUmxzRmlybXdhcmUoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKLQorTE1fU1RBVFVTIExNX0xvYWRSbHNGaXJtd2FyZSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9VSU5UMzIKLUxNX1JlZ1JkSW5kKAotUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotTE1fVUlOVDMyIFJlZ2lzdGVyKSB7Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7CitMTV9VSU5UMzIgTE1fUmVnUmRJbmQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIFJlZ2lzdGVyKQoreworCUxNX1VJTlQzMiBWYWx1ZTMyOwogCiAjaWYgUENJWF9UQVJHRVRfV09SS0FST1VORAotICAgIE1NX0FDUVVJUkVfVU5ESV9MT0NLKHBEZXZpY2UpOworCU1NX0FDUVVJUkVfVU5ESV9MT0NLIChwRGV2aWNlKTsKICNlbmRpZgotICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX1JFR19BRERSX1JFRywgUmVnaXN0ZXIpOwotICAgIE1NX1JlYWRDb25maWczMihwRGV2aWNlLCBUM19QQ0lfUkVHX0RBVEFfUkVHLCAmVmFsdWUzMik7CisJTU1fV3JpdGVDb25maWczMiAocERldmljZSwgVDNfUENJX1JFR19BRERSX1JFRywgUmVnaXN0ZXIpOworCU1NX1JlYWRDb25maWczMiAocERldmljZSwgVDNfUENJX1JFR19EQVRBX1JFRywgJlZhbHVlMzIpOwogI2lmIFBDSVhfVEFSR0VUX1dPUktBUk9VTkQKLSAgICBNTV9SRUxFQVNFX1VORElfTE9DSyhwRGV2aWNlKTsKKwlNTV9SRUxFQVNFX1VORElfTE9DSyAocERldmljZSk7CiAjZW5kaWYKIAotICAgIHJldHVybiBWYWx1ZTMyOwotfSAvKiBMTV9SZWdSZEluZCAqLwotCisJcmV0dXJuIFZhbHVlMzI7Cit9CQkJCS8qIExNX1JlZ1JkSW5kICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtOTYsNDcgKzk3LDQxIEBACiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIExNX1ZPSUQKLUxNX1JlZ1dySW5kKAotUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotTE1fVUlOVDMyIFJlZ2lzdGVyLAotTE1fVUlOVDMyIFZhbHVlMzIpIHsKK0xNX1JlZ1dySW5kIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBSZWdpc3RlciwgTE1fVUlOVDMyIFZhbHVlMzIpCit7CiAKICNpZiBQQ0lYX1RBUkdFVF9XT1JLQVJPVU5ECi0gICAgTU1fQUNRVUlSRV9VTkRJX0xPQ0socERldmljZSk7CisJTU1fQUNRVUlSRV9VTkRJX0xPQ0sgKHBEZXZpY2UpOwogI2VuZGlmCi0gICAgTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBUM19QQ0lfUkVHX0FERFJfUkVHLCBSZWdpc3Rlcik7Ci0gICAgTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBUM19QQ0lfUkVHX0RBVEFfUkVHLCBWYWx1ZTMyKTsKKwlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfUkVHX0FERFJfUkVHLCBSZWdpc3Rlcik7CisJTU1fV3JpdGVDb25maWczMiAocERldmljZSwgVDNfUENJX1JFR19EQVRBX1JFRywgVmFsdWUzMik7CiAjaWYgUENJWF9UQVJHRVRfV09SS0FST1VORAotICAgIE1NX1JFTEVBU0VfVU5ESV9MT0NLKHBEZXZpY2UpOworCU1NX1JFTEVBU0VfVU5ESV9MT0NLIChwRGV2aWNlKTsKICNlbmRpZgotfSAvKiBMTV9SZWdXckluZCAqLwotCit9CQkJCS8qIExNX1JlZ1dySW5kICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fVUlOVDMyCi1MTV9NZW1SZEluZCgKLVBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLUxNX1VJTlQzMiBNZW1BZGRyKSB7Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7CitMTV9VSU5UMzIgTE1fTWVtUmRJbmQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE1lbUFkZHIpCit7CisJTE1fVUlOVDMyIFZhbHVlMzI7CiAKLSAgICBNTV9BQ1FVSVJFX1VORElfTE9DSyhwRGV2aWNlKTsKKwlNTV9BQ1FVSVJFX1VORElfTE9DSyAocERldmljZSk7CiAjaWZkZWYgQklHX0VORElBTl9IT1NUCi0gICAgTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBUM19QQ0lfTUVNX1dJTl9BRERSX1JFRywgTWVtQWRkcik7Ci0gICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBQY2lDZmcuTWVtV2luZG93RGF0YSk7Ci0gICAgLyogICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLHVJbnRNZW0uTWJ1ZlsoTWVtQWRkciAmIDB4N2ZmZikvNF0pOyAqLworCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0FERFJfUkVHLCBNZW1BZGRyKTsKKwlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBQY2lDZmcuTWVtV2luZG93RGF0YSk7CisJLyogICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLHVJbnRNZW0uTWJ1ZlsoTWVtQWRkciAmIDB4N2ZmZikvNF0pOyAqLwogI2Vsc2UKLSAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0FERFJfUkVHLCBNZW1BZGRyKTsKLSAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgVDNfUENJX01FTV9XSU5fREFUQV9SRUcsICZWYWx1ZTMyKTsKKwlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfTUVNX1dJTl9BRERSX1JFRywgTWVtQWRkcik7CisJTU1fUmVhZENvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfTUVNX1dJTl9EQVRBX1JFRywgJlZhbHVlMzIpOwogI2VuZGlmCi0gICAgTU1fUkVMRUFTRV9VTkRJX0xPQ0socERldmljZSk7CisJTU1fUkVMRUFTRV9VTkRJX0xPQ0sgKHBEZXZpY2UpOwogCi0gICAgcmV0dXJuIFZhbHVlMzI7Ci19IC8qIExNX01lbVJkSW5kICovCi0KKwlyZXR1cm4gVmFsdWUzMjsKK30JCQkJLyogTE1fTWVtUmRJbmQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNDQsNTEyICsxMzksNDU1IEBACiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIExNX1ZPSUQKLUxNX01lbVdySW5kKAotUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotTE1fVUlOVDMyIE1lbUFkZHIsCi1MTV9VSU5UMzIgVmFsdWUzMikgewotICAgIE1NX0FDUVVJUkVfVU5ESV9MT0NLKHBEZXZpY2UpOworTE1fTWVtV3JJbmQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE1lbUFkZHIsIExNX1VJTlQzMiBWYWx1ZTMyKQoreworCU1NX0FDUVVJUkVfVU5ESV9MT0NLIChwRGV2aWNlKTsKICNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKLSAgICBSRUdfV1IocERldmljZSxQY2lDZmcuTWVtV2luZG93QmFzZUFkZHIsTWVtQWRkcik7Ci0gICAgUkVHX1dSKHBEZXZpY2UsdUludE1lbS5NYnVmWyhNZW1BZGRyICYgMHg3ZmZmKS80XSxWYWx1ZTMyKTsKKwlSRUdfV1IgKHBEZXZpY2UsIFBjaUNmZy5NZW1XaW5kb3dCYXNlQWRkciwgTWVtQWRkcik7CisJUkVHX1dSIChwRGV2aWNlLCB1SW50TWVtLk1idWZbKE1lbUFkZHIgJiAweDdmZmYpIC8gNF0sIFZhbHVlMzIpOwogI2Vsc2UKLSAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0FERFJfUkVHLCBNZW1BZGRyKTsKLSAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0RBVEFfUkVHLCBWYWx1ZTMyKTsKKwlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfTUVNX1dJTl9BRERSX1JFRywgTWVtQWRkcik7CisJTU1fV3JpdGVDb25maWczMiAocERldmljZSwgVDNfUENJX01FTV9XSU5fREFUQV9SRUcsIFZhbHVlMzIpOwogI2VuZGlmCi0gICAgTU1fUkVMRUFTRV9VTkRJX0xPQ0socERldmljZSk7Ci19IC8qIExNX01lbVdySW5kICovCi0KKwlNTV9SRUxFQVNFX1VORElfTE9DSyAocERldmljZSk7Cit9CQkJCS8qIExNX01lbVdySW5kICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fU1RBVFVTCi1MTV9RdWV1ZVJ4UGFja2V0cygKLVBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkgewotICAgIExNX1NUQVRVUyBMbXN0YXR1czsKLSAgICBQTE1fUEFDS0VUIHBQYWNrZXQ7Ci0gICAgUFQzX1JDVl9CRCBwUmN2QmQ7Ci0gICAgTE1fVUlOVDMyIFN0ZEJkQWRkZWQgPSAwOworTE1fU1RBVFVTIExNX1F1ZXVlUnhQYWNrZXRzIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCit7CisJTE1fU1RBVFVTIExtc3RhdHVzOworCVBMTV9QQUNLRVQgcFBhY2tldDsKKwlQVDNfUkNWX0JEIHBSY3ZCZDsKKwlMTV9VSU5UMzIgU3RkQmRBZGRlZCA9IDA7CiAjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAotICAgIExNX1VJTlQzMiBKdW1ib0JkQWRkZWQgPSAwOwotI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KKwlMTV9VSU5UMzIgSnVtYm9CZEFkZGVkID0gMDsKKyNlbmRpZgkJCQkvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCiAKLSAgICBMbXN0YXR1cyA9IExNX1NUQVRVU19TVUNDRVNTOworCUxtc3RhdHVzID0gTE1fU1RBVFVTX1NVQ0NFU1M7CiAKLSAgICBwUGFja2V0ID0gKFBMTV9QQUNLRVQpIFFRX1BvcEhlYWQoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyKTsKLSAgICB3aGlsZShwUGFja2V0KSB7Ci0Jc3dpdGNoKHBQYWNrZXQtPnUuUnguUmN2UHJvZFJpbmcpIHsKKwlwUGFja2V0ID0gKFBMTV9QQUNLRVQpIFFRX1BvcEhlYWQgKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lcik7CisJd2hpbGUgKHBQYWNrZXQpIHsKKwkJc3dpdGNoIChwUGFja2V0LT51LlJ4LlJjdlByb2RSaW5nKSB7CiAjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAotCSAgICBjYXNlIFQzX0pVTUJPX1JDVl9QUk9EX1JJTkc6ICAgICAgICAvKiBKdW1ibyBSZWNlaXZlIFJpbmcuICovCi0JCS8qIEluaXRpYWxpemUgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yLiAqLwotCQlwUmN2QmQgPQotCQkgICAgJnBEZXZpY2UtPnBSeEp1bWJvQmRWaXJ0W3BEZXZpY2UtPlJ4SnVtYm9Qcm9kSWR4XTsKLQkJcFJjdkJkLT5GbGFncyA9IFJDVl9CRF9GTEFHX0VORCB8IFJDVl9CRF9GTEFHX0pVTUJPX1JJTkc7Ci0JCXBSY3ZCZC0+TGVuID0gKExNX1VJTlQxNikgcERldmljZS0+UnhKdW1ib0J1ZmZlclNpemU7CisJCWNhc2UgVDNfSlVNQk9fUkNWX1BST0RfUklORzoJLyogSnVtYm8gUmVjZWl2ZSBSaW5nLiAqLworCQkJLyogSW5pdGlhbGl6ZSB0aGUgYnVmZmVyIGRlc2NyaXB0b3IuICovCisJCQlwUmN2QmQgPQorCQkJICAgICZwRGV2aWNlLT5wUnhKdW1ib0JkVmlydFtwRGV2aWNlLT5SeEp1bWJvUHJvZElkeF07CisJCQlwUmN2QmQtPkZsYWdzID0KKwkJCSAgICBSQ1ZfQkRfRkxBR19FTkQgfCBSQ1ZfQkRfRkxBR19KVU1CT19SSU5HOworCQkJcFJjdkJkLT5MZW4gPSAoTE1fVUlOVDE2KSBwRGV2aWNlLT5SeEp1bWJvQnVmZmVyU2l6ZTsKIAotCQkvKiBJbml0aWFsaXplIHRoZSByZWNlaXZlIGJ1ZmZlciBwb2ludGVyICovCi0jaWYgMCAvKiBKaW1teSwgZGVsZXRlZCBpbiBuZXcgKi8KLQkJcFJjdkJkLT5Ib3N0QWRkci5Mb3cgPSBwUGFja2V0LT51LlJ4LlJ4QnVmZmVyUGh5LkxvdzsKLQkJcFJjdkJkLT5Ib3N0QWRkci5IaWdoID0gcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclBoeS5IaWdoOworCQkJLyogSW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZSBidWZmZXIgcG9pbnRlciAqLworI2lmIDAJCQkJLyogSmltbXksIGRlbGV0ZWQgaW4gbmV3ICovCisJCQlwUmN2QmQtPkhvc3RBZGRyLkxvdyA9IHBQYWNrZXQtPnUuUnguUnhCdWZmZXJQaHkuTG93OworCQkJcFJjdkJkLT5Ib3N0QWRkci5IaWdoID0gcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclBoeS5IaWdoOwogI2VuZGlmCi0JCU1NX01hcFJ4RG1hKHBEZXZpY2UsIHBQYWNrZXQsICZwUmN2QmQtPkhvc3RBZGRyKTsKKwkJCU1NX01hcFJ4RG1hIChwRGV2aWNlLCBwUGFja2V0LCAmcFJjdkJkLT5Ib3N0QWRkcik7CiAKLQkJLyogVGhlIG9wYXF1ZSBmaWVsZCBtYXkgcG9pbnQgdG8gYW4gb2Zmc2V0IGZyb20gYSBmaXggYWRkci4gKi8KLQkJcFJjdkJkLT5PcGFxdWUgPSAoTE1fVUlOVDMyKSAoTU1fVUlOVF9QVFIocFBhY2tldCkgLQotCQkgICAgTU1fVUlOVF9QVFIocERldmljZS0+cFBhY2tldERlc2NCYXNlKSk7CisJCQkvKiBUaGUgb3BhcXVlIGZpZWxkIG1heSBwb2ludCB0byBhbiBvZmZzZXQgZnJvbSBhIGZpeCBhZGRyLiAqLworCQkJcFJjdkJkLT5PcGFxdWUgPSAoTE1fVUlOVDMyKSAoTU1fVUlOVF9QVFIgKHBQYWNrZXQpIC0KKwkJCQkJCSAgICAgIE1NX1VJTlRfUFRSIChwRGV2aWNlLT4KKwkJCQkJCQkJICAgcFBhY2tldERlc2NCYXNlKSk7CiAKLQkJLyogVXBkYXRlIHRoZSBwcm9kdWNlciBpbmRleC4gKi8KLQkJcERldmljZS0+UnhKdW1ib1Byb2RJZHggPSAocERldmljZS0+UnhKdW1ib1Byb2RJZHggKyAxKSAmCi0JCSAgICBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UX01BU0s7CisJCQkvKiBVcGRhdGUgdGhlIHByb2R1Y2VyIGluZGV4LiAqLworCQkJcERldmljZS0+UnhKdW1ib1Byb2RJZHggPQorCQkJICAgIChwRGV2aWNlLT5SeEp1bWJvUHJvZElkeCArCisJCQkgICAgIDEpICYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVF9NQVNLOwogCi0JCUp1bWJvQmRBZGRlZCsrOwotCQlicmVhazsKLSNlbmRpZiAvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCi0KLQkgICAgY2FzZSBUM19TVERfUkNWX1BST0RfUklORzogICAgICAvKiBTdGFuZGFyZCBSZWNlaXZlIFJpbmcuICovCi0JCS8qIEluaXRpYWxpemUgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yLiAqLwotCQlwUmN2QmQgPSAmcERldmljZS0+cFJ4U3RkQmRWaXJ0W3BEZXZpY2UtPlJ4U3RkUHJvZElkeF07Ci0JCXBSY3ZCZC0+RmxhZ3MgPSBSQ1ZfQkRfRkxBR19FTkQ7Ci0JCXBSY3ZCZC0+TGVuID0gTUFYX1NURF9SQ1ZfQlVGRkVSX1NJWkU7Ci0KLQkJLyogSW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZSBidWZmZXIgcG9pbnRlciAqLwotI2lmIDAgIC8qIEppbW15LCBkZWxldGVkIGluIG5ldyByZXBsYWNlZCB3aXRoIE1NX01hcFJ4RG1hICovCi0JCXBSY3ZCZC0+SG9zdEFkZHIuTG93ID0gcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclBoeS5Mb3c7Ci0JCXBSY3ZCZC0+SG9zdEFkZHIuSGlnaCA9IHBQYWNrZXQtPnUuUnguUnhCdWZmZXJQaHkuSGlnaDsKLSNlbmRpZgotCQlNTV9NYXBSeERtYShwRGV2aWNlLCBwUGFja2V0LCAmcFJjdkJkLT5Ib3N0QWRkcik7Ci0KLQkJLyogVGhlIG9wYXF1ZSBmaWVsZCBtYXkgcG9pbnQgdG8gYW4gb2Zmc2V0IGZyb20gYSBmaXggYWRkci4gKi8KLQkJcFJjdkJkLT5PcGFxdWUgPSAoTE1fVUlOVDMyKSAoTU1fVUlOVF9QVFIocFBhY2tldCkgLQotCQkgICAgTU1fVUlOVF9QVFIocERldmljZS0+cFBhY2tldERlc2NCYXNlKSk7Ci0KLQkJLyogVXBkYXRlIHRoZSBwcm9kdWNlciBpbmRleC4gKi8KLQkJcERldmljZS0+UnhTdGRQcm9kSWR4ID0gKHBEZXZpY2UtPlJ4U3RkUHJvZElkeCArIDEpICYKLQkJICAgIFQzX1NURF9SQ1ZfUkNCX0VOVFJZX0NPVU5UX01BU0s7Ci0KLQkJU3RkQmRBZGRlZCsrOwotCQlicmVhazsKLQotCSAgICBjYXNlIFQzX1VOS05PV05fUkNWX1BST0RfUklORzoKLQkgICAgZGVmYXVsdDoKLQkJTG1zdGF0dXMgPSBMTV9TVEFUVVNfRkFJTFVSRTsKLQkJYnJlYWs7Ci0JfSAvKiBzd2l0Y2ggKi8KLQotCS8qIEJhaWwgb3V0IGlmIHRoZXJlIGlzIGFueSBlcnJvci4gKi8KLQlpZihMbXN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JICAgIGJyZWFrOwotCX0KLQotCXBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgUVFfUG9wSGVhZCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIpOwotICAgIH0gLyogd2hpbGUgKi8KLQotICAgIHdtYigpOwotICAgIC8qIFVwZGF0ZSB0aGUgcHJvY2VkdXJlIGluZGV4LiAqLwotICAgIGlmKFN0ZEJkQWRkZWQpCi0gICAgewotCU1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlJjdlN0ZFByb2RJZHguTG93LCBwRGV2aWNlLT5SeFN0ZFByb2RJZHgpOwotICAgIH0KLSNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCi0gICAgaWYoSnVtYm9CZEFkZGVkKQotICAgIHsKLQlNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5SY3ZKdW1ib1Byb2RJZHguTG93LAotCSAgICBwRGV2aWNlLT5SeEp1bWJvUHJvZElkeCk7Ci0gICAgfQotI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KLQotICAgIHJldHVybiBMbXN0YXR1czsKLX0gLyogTE1fUXVldWVSeFBhY2tldHMgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVNUQVRJQyBMTV9WT0lECi1MTV9OdnJhbUluaXQoCi0gICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQotewotICAgIExNX1VJTlQzMiBWYWx1ZTMyOwotICAgIExNX1VJTlQzMiBqOwotCi0gICAgLyogSW50aWFsaXplIGNsb2NrIHBlcmlvZCBhbmQgc3RhdGUgbWFjaGluZS4gKi8KLSAgICBWYWx1ZTMyID0gU0VFUFJPTV9BRERSX0NMS19QRVJEKFNFRVBST01fQ0xPQ0tfUEVSSU9EKSB8Ci0JU0VFUFJPTV9BRERSX0ZTTV9SRVNFVDsKLSAgICBSRUdfV1IocERldmljZSwgR3JjLkVlcHJvbUFkZHIsIFZhbHVlMzIpOwotCi0gICAgZm9yKGogPSAwOyBqIDwgMTAwOyBqKyspCi0gICAgewotCU1NX1dhaXQoMTApOwotICAgIH0KLQotICAgIC8qIFNlcmlhbCBlZXByb20gYWNjZXNzIHVzaW5nIHRoZSBHcmMuRWVwcm9tQWRkci9FZXByb21EYXRhIHJlZ2lzdGVycy4gKi8KLSAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwpOwotICAgIFJFR19XUihwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBWYWx1ZTMyIHwgR1JDX01JU0NfTE9DQUxfQ1RSTF9BVVRPX1NFRVBST00pOwotCi0gICAgLyogU2V0IHRoZSA1NzAxIGNvbXBhdGliaWxpdHkgbW9kZSBpZiB3ZSBhcmUgdXNpbmcgRUVQUk9NLiAqLwotICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMCAmJgotCVQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMSkKLSAgICB7Ci0JVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBOdnJhbS5Db25maWcxKTsKLQlpZigoVmFsdWUzMiAmIEZMQVNIX0lOVEVSRkFDRV9FTkFCTEUpID09IDApCi0JewotCSAgICAvKiBVc2UgdGhlIG5ldyBpbnRlcmZhY2UgdG8gcmVhZCBFRVBST00uICovCi0JICAgIFZhbHVlMzIgJj0gfkZMQVNIX0NPTVBBVF9CWVBBU1M7Ci0KLQkgICAgUkVHX1dSKHBEZXZpY2UsIE52cmFtLkNvbmZpZzEsIFZhbHVlMzIpOwotCX0KLSAgICB9Ci19IC8qIExNX052UmFtSW5pdCAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotU1RBVElDIExNX1NUQVRVUwotTE1fRWVwcm9tUmVhZCgKLSAgICBQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi0gICAgTE1fVUlOVDMyIE9mZnNldCwKLSAgICBMTV9VSU5UMzIgKnBEYXRhKQotewotICAgIExNX1VJTlQzMiBWYWx1ZTMyOwotICAgIExNX1VJTlQzMiBBZGRyOwotICAgIExNX1VJTlQzMiBEZXY7Ci0gICAgTE1fVUlOVDMyIGo7Ci0KLSAgICBpZihPZmZzZXQgPiBTRUVQUk9NX0NISVBfU0laRSkKLSAgICB7Ci0JcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotICAgIH0KLQotICAgIERldiA9IE9mZnNldCAvIFNFRVBST01fQ0hJUF9TSVpFOwotICAgIEFkZHIgPSBPZmZzZXQgJSBTRUVQUk9NX0NISVBfU0laRTsKLQotICAgIFZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgR3JjLkVlcHJvbUFkZHIpOwotICAgIFZhbHVlMzIgJj0gfihTRUVQUk9NX0FERFJfQUREUkVTU19NQVNLIHwgU0VFUFJPTV9BRERSX0RFVl9JRF9NQVNLIHwKLQlTRUVQUk9NX0FERFJfUldfTUFTSyk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5FZXByb21BZGRyLCBWYWx1ZTMyIHwgU0VFUFJPTV9BRERSX0RFVl9JRChEZXYpIHwKLQlTRUVQUk9NX0FERFJfQUREUkVTUyhBZGRyKSB8IFNFRVBST01fQUREUl9TVEFSVCB8IFNFRVBST01fQUREUl9SRUFEKTsKLQotICAgIGZvcihqID0gMDsgaiA8IDEwMDA7IGorKykKLSAgICB7Ci0JVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBHcmMuRWVwcm9tQWRkcik7Ci0JaWYoVmFsdWUzMiAmIFNFRVBST01fQUREUl9DT01QTEVURSkKLQl7Ci0JICAgIGJyZWFrOwotCX0KLQlNTV9XYWl0KDEwKTsKLSAgICB9Ci0KLSAgICBpZihWYWx1ZTMyICYgU0VFUFJPTV9BRERSX0NPTVBMRVRFKQotICAgIHsKLQlWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIEdyYy5FZXByb21EYXRhKTsKLQkqcERhdGEgPSBWYWx1ZTMyOwotCi0JcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotICAgIH0KLQotICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKLX0gLyogTE1fRWVwcm9tUmVhZCAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotU1RBVElDIExNX1NUQVRVUwotTE1fTnZyYW1SZWFkKAotICAgIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLSAgICBMTV9VSU5UMzIgT2Zmc2V0LAotICAgIExNX1VJTlQzMiAqcERhdGEpCi17Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7Ci0gICAgTE1fU1RBVFVTIFN0YXR1czsKLSAgICBMTV9VSU5UMzIgajsKLQotICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAotCVQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkKLSAgICB7Ci0JU3RhdHVzID0gTE1fRWVwcm9tUmVhZChwRGV2aWNlLCBPZmZzZXQsIHBEYXRhKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkvKiBEZXRlcm1pbmUgaWYgd2UgaGF2ZSBmbGFzaCBvciBFRVBST00uICovCi0JVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBOdnJhbS5Db25maWcxKTsKLQlpZihWYWx1ZTMyICYgRkxBU0hfSU5URVJGQUNFX0VOQUJMRSkKLQl7Ci0JICAgIGlmKFZhbHVlMzIgJiBGTEFTSF9TU1JBTV9CVUZGRVJSRURfTU9ERSkKLQkgICAgewotCQlPZmZzZXQgPSAoKE9mZnNldC9CVUZGRVJFRF9GTEFTSF9QQUdFX1NJWkUpIDw8Ci0JCSAgICBCVUZGRVJFRF9GTEFTSF9QQUdFX1BPUykgKwotCQkgICAgKE9mZnNldCAlIEJVRkZFUkVEX0ZMQVNIX1BBR0VfU0laRSk7Ci0JICAgIH0KLQl9Ci0KLQlSRUdfV1IocERldmljZSwgTnZyYW0uU3dBcmIsIFNXX0FSQl9SRVFfU0VUMSk7Ci0JZm9yIChqID0gMDsgaiA8IDEwMDA7IGorKykKLQl7Ci0JICAgIGlmIChSRUdfUkQocERldmljZSwgTnZyYW0uU3dBcmIpICYgU1dfQVJCX0dOVDEpCi0JICAgIHsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgTU1fV2FpdCgyMCk7Ci0JfQotCWlmIChqID09IDEwMDApCi0JewotCSAgICByZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JLyogUmVhZCBmcm9tIGZsYXNoIG9yIEVFUFJPTSB3aXRoIHRoZSBuZXcgNTcwMy8wMiBpbnRlcmZhY2UuICovCi0JUkVHX1dSKHBEZXZpY2UsIE52cmFtLkFkZHIsIE9mZnNldCAmIE5WUkFNX0FERFJFU1NfTUFTSyk7Ci0KLQlSRUdfV1IocERldmljZSwgTnZyYW0uQ21kLCBOVlJBTV9DTURfUkQgfCBOVlJBTV9DTURfRE9fSVQgfAotCSAgICBOVlJBTV9DTURfRklSU1QgfCBOVlJBTV9DTURfTEFTVCB8IE5WUkFNX0NNRF9ET05FKTsKLQotCS8qIFdhaXQgZm9yIHRoZSBkb25lIGJpdCB0byBjbGVhci4gKi8KLQlmb3IoaiA9IDA7IGogPCA1MDA7IGorKykKLQl7Ci0JICAgIE1NX1dhaXQoMTApOwotCi0JICAgIFZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgTnZyYW0uQ21kKTsKLQkgICAgaWYoIShWYWx1ZTMyICYgTlZSQU1fQ01EX0RPTkUpKQotCSAgICB7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0JLyogV2FpdCBmb3IgdGhlIGRvbmUgYml0LiAqLwotCWlmKCEoVmFsdWUzMiAmIE5WUkFNX0NNRF9ET05FKSkKLQl7Ci0JICAgIGZvcihqID0gMDsgaiA8IDUwMDsgaisrKQotCSAgICB7Ci0JCU1NX1dhaXQoMTApOwotCi0JCVZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgTnZyYW0uQ21kKTsKLQkJaWYoVmFsdWUzMiAmIE5WUkFNX0NNRF9ET05FKQotCQl7Ci0JCSAgICBNTV9XYWl0KDEwKTsKLQotCQkgICAgKnBEYXRhID0gUkVHX1JEKHBEZXZpY2UsIE52cmFtLlJlYWREYXRhKTsKLQotCQkgICAgLyogQ2hhbmdlIHRoZSBlbmRpYW5lc3MuICovCi0JCSAgICAqcERhdGEgPSAoKCpwRGF0YSAmIDB4ZmYpIDw8IDI0KXwgKCgqcERhdGEgJiAweGZmMDApIDw8IDgpfAotCQkJKCgqcERhdGEgJiAweGZmMDAwMCkgPj4gOCkgfCAoKCpwRGF0YSA+PiAyNCkgJiAweGZmKTsKLQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotCVJFR19XUihwRGV2aWNlLCBOdnJhbS5Td0FyYiwgU1dfQVJCX1JFUV9DTFIxKTsKLQlpZihWYWx1ZTMyICYgTlZSQU1fQ01EX0RPTkUpCi0JewotCSAgICBTdGF0dXMgPSBMTV9TVEFUVVNfU1VDQ0VTUzsKLQl9Ci0JZWxzZQotCXsKLQkgICAgU3RhdHVzID0gTE1fU1RBVFVTX0ZBSUxVUkU7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM7Ci19IC8qIExNX052cmFtUmVhZCAqLwotCi0KLVNUQVRJQyB2b2lkCi1MTV9SZWFkVlBEKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKLXsKLSAgICBMTV9VSU5UMzIgVnBkX2FyclsyNTYvNF07Ci0gICAgTE1fVUlOVDggKlZwZCA9IChMTV9VSU5UOCAqKSAmVnBkX2FyclswXTsKLSAgICBMTV9VSU5UMzIgKlZwZF9kcHRyID0gJlZwZF9hcnJbMF07Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7Ci0gICAgdW5zaWduZWQgaW50IGo7Ci0KLSAgICAvKiBSZWFkIFBOIGZyb20gVlBEICovCi0gICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaiArPSA0LCBWcGRfZHB0cisrICkKLSAgICB7Ci0JaWYgKExNX052cmFtUmVhZChwRGV2aWNlLCAweDEwMCArIGosICZWYWx1ZTMyKSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgewotCSAgICBwcmludGYoIkJDTTU3MHg6IExNX1JlYWRWUEQ6IFZQRCByZWFkIGZhaWxlZCIKLQkJICAgIiAobm8gRUVQUk9NIG9uYm9hcmQpXG4iKTsKLQkgICAgcmV0dXJuOwotCX0KLQkqVnBkX2RwdHIgPSBjcHVfdG9fbGUzMihWYWx1ZTMyKTsKLSAgICB9Ci0gICAgZm9yIChqID0gMDsgaiA8IDI1NjsgKQotICAgIHsKLQl1bnNpZ25lZCBpbnQgVnBkX3JfbGVuOwotCXVuc2lnbmVkIGludCBWcGRfcl9lbmQ7Ci0KLQlpZiAoKFZwZFtqXSA9PSAweDgyKSB8fCAoVnBkW2pdID09IDB4OTEpKQotCXsKLQkgICAgaiA9IGogKyAzICsgVnBkW2ogKyAxXSArIChWcGRbaiArIDJdIDw8IDgpOwotCX0KLQllbHNlIGlmIChWcGRbal0gPT0gMHg5MCkKLQl7Ci0JICAgIFZwZF9yX2xlbiA9ICBWcGRbaiArIDFdICsgKFZwZFtqICsgMl0gPDwgOCk7Ci0JICAgIGogKz0gMzsKLQkgICAgVnBkX3JfZW5kID0gVnBkX3JfbGVuICsgajsKLQkgICAgd2hpbGUgKGogPCBWcGRfcl9lbmQpCi0JICAgIHsKLQkJaWYgKChWcGRbal0gPT0gJ1AnKSAmJiAoVnBkW2ogKyAxXSA9PSAnTicpKQotCQl7Ci0JCSAgICB1bnNpZ25lZCBpbnQgbGVuID0gVnBkW2ogKyAyXTsKLQotCQkgICAgaWYgKGxlbiA8PSAyNCkKLQkJICAgIHsKLQkJCW1lbWNweShwRGV2aWNlLT5QYXJ0Tm8sICZWcGRbaiArIDNdLCBsZW4pOwotCQkgICAgfQotCQkgICAgYnJlYWs7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCSAgICBpZiAoVnBkW2ogKyAyXSA9PSAwKQotCQkgICAgeworCQkJSnVtYm9CZEFkZGVkKys7CiAJCQlicmVhazsKLQkJICAgIH0KLQkJICAgIGogPSBqICsgVnBkW2ogKyAyXTsKKyNlbmRpZgkJCQkvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCisKKwkJY2FzZSBUM19TVERfUkNWX1BST0RfUklORzoJLyogU3RhbmRhcmQgUmVjZWl2ZSBSaW5nLiAqLworCQkJLyogSW5pdGlhbGl6ZSB0aGUgYnVmZmVyIGRlc2NyaXB0b3IuICovCisJCQlwUmN2QmQgPSAmcERldmljZS0+cFJ4U3RkQmRWaXJ0W3BEZXZpY2UtPlJ4U3RkUHJvZElkeF07CisJCQlwUmN2QmQtPkZsYWdzID0gUkNWX0JEX0ZMQUdfRU5EOworCQkJcFJjdkJkLT5MZW4gPSBNQVhfU1REX1JDVl9CVUZGRVJfU0laRTsKKworCQkJLyogSW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZSBidWZmZXIgcG9pbnRlciAqLworI2lmIDAJCQkJLyogSmltbXksIGRlbGV0ZWQgaW4gbmV3IHJlcGxhY2VkIHdpdGggTU1fTWFwUnhEbWEgKi8KKwkJCXBSY3ZCZC0+SG9zdEFkZHIuTG93ID0gcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclBoeS5Mb3c7CisJCQlwUmN2QmQtPkhvc3RBZGRyLkhpZ2ggPSBwUGFja2V0LT51LlJ4LlJ4QnVmZmVyUGh5LkhpZ2g7CisjZW5kaWYKKwkJCU1NX01hcFJ4RG1hIChwRGV2aWNlLCBwUGFja2V0LCAmcFJjdkJkLT5Ib3N0QWRkcik7CisKKwkJCS8qIFRoZSBvcGFxdWUgZmllbGQgbWF5IHBvaW50IHRvIGFuIG9mZnNldCBmcm9tIGEgZml4IGFkZHIuICovCisJCQlwUmN2QmQtPk9wYXF1ZSA9IChMTV9VSU5UMzIpIChNTV9VSU5UX1BUUiAocFBhY2tldCkgLQorCQkJCQkJICAgICAgTU1fVUlOVF9QVFIgKHBEZXZpY2UtPgorCQkJCQkJCQkgICBwUGFja2V0RGVzY0Jhc2UpKTsKKworCQkJLyogVXBkYXRlIHRoZSBwcm9kdWNlciBpbmRleC4gKi8KKwkJCXBEZXZpY2UtPlJ4U3RkUHJvZElkeCA9IChwRGV2aWNlLT5SeFN0ZFByb2RJZHggKyAxKSAmCisJCQkgICAgVDNfU1REX1JDVl9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKKworCQkJU3RkQmRBZGRlZCsrOworCQkJYnJlYWs7CisKKwkJY2FzZSBUM19VTktOT1dOX1JDVl9QUk9EX1JJTkc6CisJCWRlZmF1bHQ6CisJCQlMbXN0YXR1cyA9IExNX1NUQVRVU19GQUlMVVJFOworCQkJYnJlYWs7CisJCX0JCS8qIHN3aXRjaCAqLworCisJCS8qIEJhaWwgb3V0IGlmIHRoZXJlIGlzIGFueSBlcnJvci4gKi8KKwkJaWYgKExtc3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKSB7CisJCQlicmVhazsKIAkJfQotCSAgICB9Ci0JICAgIGJyZWFrOworCisJCXBQYWNrZXQgPQorCQkgICAgKFBMTV9QQUNLRVQpIFFRX1BvcEhlYWQgKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lcik7CisJfQkJCS8qIHdoaWxlICovCisKKwl3bWIgKCk7CisJLyogVXBkYXRlIHRoZSBwcm9jZWR1cmUgaW5kZXguICovCisJaWYgKFN0ZEJkQWRkZWQpIHsKKwkJTUJfUkVHX1dSIChwRGV2aWNlLCBNYWlsYm94LlJjdlN0ZFByb2RJZHguTG93LAorCQkJICAgcERldmljZS0+UnhTdGRQcm9kSWR4KTsKIAl9Ci0JZWxzZSB7Ci0JICAgIGJyZWFrOworI2lmIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQKKwlpZiAoSnVtYm9CZEFkZGVkKSB7CisJCU1CX1JFR19XUiAocERldmljZSwgTWFpbGJveC5SY3ZKdW1ib1Byb2RJZHguTG93LAorCQkJICAgcERldmljZS0+UnhKdW1ib1Byb2RJZHgpOwogCX0KLSAgICB9CisjZW5kaWYJCQkJLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLworCisJcmV0dXJuIExtc3RhdHVzOworfQkJCQkvKiBMTV9RdWV1ZVJ4UGFja2V0cyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NUQVRJQyBMTV9WT0lEIExNX052cmFtSW5pdCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQoreworCUxNX1VJTlQzMiBWYWx1ZTMyOworCUxNX1VJTlQzMiBqOworCisJLyogSW50aWFsaXplIGNsb2NrIHBlcmlvZCBhbmQgc3RhdGUgbWFjaGluZS4gKi8KKwlWYWx1ZTMyID0gU0VFUFJPTV9BRERSX0NMS19QRVJEIChTRUVQUk9NX0NMT0NLX1BFUklPRCkgfAorCSAgICBTRUVQUk9NX0FERFJfRlNNX1JFU0VUOworCVJFR19XUiAocERldmljZSwgR3JjLkVlcHJvbUFkZHIsIFZhbHVlMzIpOworCisJZm9yIChqID0gMDsgaiA8IDEwMDsgaisrKSB7CisJCU1NX1dhaXQgKDEwKTsKKwl9CisKKwkvKiBTZXJpYWwgZWVwcm9tIGFjY2VzcyB1c2luZyB0aGUgR3JjLkVlcHJvbUFkZHIvRWVwcm9tRGF0YSByZWdpc3RlcnMuICovCisJVmFsdWUzMiA9IFJFR19SRCAocERldmljZSwgR3JjLkxvY2FsQ3RybCk7CisJUkVHX1dSIChwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLAorCQlWYWx1ZTMyIHwgR1JDX01JU0NfTE9DQUxfQ1RSTF9BVVRPX1NFRVBST00pOworCisJLyogU2V0IHRoZSA1NzAxIGNvbXBhdGliaWxpdHkgbW9kZSBpZiB3ZSBhcmUgdXNpbmcgRUVQUk9NLiAqLworCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSAhPSBUM19BU0lDX1JFVl81NzAwICYmCisJICAgIFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0FTSUNfUkVWXzU3MDEpIHsKKwkJVmFsdWUzMiA9IFJFR19SRCAocERldmljZSwgTnZyYW0uQ29uZmlnMSk7CisJCWlmICgoVmFsdWUzMiAmIEZMQVNIX0lOVEVSRkFDRV9FTkFCTEUpID09IDApIHsKKwkJCS8qIFVzZSB0aGUgbmV3IGludGVyZmFjZSB0byByZWFkIEVFUFJPTS4gKi8KKwkJCVZhbHVlMzIgJj0gfkZMQVNIX0NPTVBBVF9CWVBBU1M7CisKKwkJCVJFR19XUiAocERldmljZSwgTnZyYW0uQ29uZmlnMSwgVmFsdWUzMik7CisJCX0KKwl9Cit9CQkJCS8qIExNX052UmFtSW5pdCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NUQVRJQyBMTV9TVEFUVVMKK0xNX0VlcHJvbVJlYWQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE9mZnNldCwgTE1fVUlOVDMyICogcERhdGEpCit7CisJTE1fVUlOVDMyIFZhbHVlMzI7CisJTE1fVUlOVDMyIEFkZHI7CisJTE1fVUlOVDMyIERldjsKKwlMTV9VSU5UMzIgajsKKworCWlmIChPZmZzZXQgPiBTRUVQUk9NX0NISVBfU0laRSkgeworCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJRGV2ID0gT2Zmc2V0IC8gU0VFUFJPTV9DSElQX1NJWkU7CisJQWRkciA9IE9mZnNldCAlIFNFRVBST01fQ0hJUF9TSVpFOworCisJVmFsdWUzMiA9IFJFR19SRCAocERldmljZSwgR3JjLkVlcHJvbUFkZHIpOworCVZhbHVlMzIgJj0gfihTRUVQUk9NX0FERFJfQUREUkVTU19NQVNLIHwgU0VFUFJPTV9BRERSX0RFVl9JRF9NQVNLIHwKKwkJICAgICBTRUVQUk9NX0FERFJfUldfTUFTSyk7CisJUkVHX1dSIChwRGV2aWNlLCBHcmMuRWVwcm9tQWRkciwgVmFsdWUzMiB8IFNFRVBST01fQUREUl9ERVZfSUQgKERldikgfAorCQlTRUVQUk9NX0FERFJfQUREUkVTUyAoQWRkcikgfCBTRUVQUk9NX0FERFJfU1RBUlQgfAorCQlTRUVQUk9NX0FERFJfUkVBRCk7CisKKwlmb3IgKGogPSAwOyBqIDwgMTAwMDsgaisrKSB7CisJCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIEdyYy5FZXByb21BZGRyKTsKKwkJaWYgKFZhbHVlMzIgJiBTRUVQUk9NX0FERFJfQ09NUExFVEUpIHsKKwkJCWJyZWFrOworCQl9CisJCU1NX1dhaXQgKDEwKTsKKwl9CisKKwlpZiAoVmFsdWUzMiAmIFNFRVBST01fQUREUl9DT01QTEVURSkgeworCQlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBHcmMuRWVwcm9tRGF0YSk7CisJCSpwRGF0YSA9IFZhbHVlMzI7CisKKwkJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCX0KKworCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKK30JCQkJLyogTE1fRWVwcm9tUmVhZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NUQVRJQyBMTV9TVEFUVVMKK0xNX052cmFtUmVhZCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgT2Zmc2V0LCBMTV9VSU5UMzIgKiBwRGF0YSkKK3sKKwlMTV9VSU5UMzIgVmFsdWUzMjsKKwlMTV9TVEFUVVMgU3RhdHVzOworCUxNX1VJTlQzMiBqOworCisJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKKwkgICAgVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkgeworCQlTdGF0dXMgPSBMTV9FZXByb21SZWFkIChwRGV2aWNlLCBPZmZzZXQsIHBEYXRhKTsKKwl9IGVsc2UgeworCQkvKiBEZXRlcm1pbmUgaWYgd2UgaGF2ZSBmbGFzaCBvciBFRVBST00uICovCisJCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIE52cmFtLkNvbmZpZzEpOworCQlpZiAoVmFsdWUzMiAmIEZMQVNIX0lOVEVSRkFDRV9FTkFCTEUpIHsKKwkJCWlmIChWYWx1ZTMyICYgRkxBU0hfU1NSQU1fQlVGRkVSUkVEX01PREUpIHsKKwkJCQlPZmZzZXQgPSAoKE9mZnNldCAvIEJVRkZFUkVEX0ZMQVNIX1BBR0VfU0laRSkgPDwKKwkJCQkJICBCVUZGRVJFRF9GTEFTSF9QQUdFX1BPUykgKworCQkJCSAgICAoT2Zmc2V0ICUgQlVGRkVSRURfRkxBU0hfUEFHRV9TSVpFKTsKKwkJCX0KKwkJfQorCisJCVJFR19XUiAocERldmljZSwgTnZyYW0uU3dBcmIsIFNXX0FSQl9SRVFfU0VUMSk7CisJCWZvciAoaiA9IDA7IGogPCAxMDAwOyBqKyspIHsKKwkJCWlmIChSRUdfUkQgKHBEZXZpY2UsIE52cmFtLlN3QXJiKSAmIFNXX0FSQl9HTlQxKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlNTV9XYWl0ICgyMCk7CisJCX0KKwkJaWYgKGogPT0gMTAwMCkgeworCQkJcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworCQl9CisKKwkJLyogUmVhZCBmcm9tIGZsYXNoIG9yIEVFUFJPTSB3aXRoIHRoZSBuZXcgNTcwMy8wMiBpbnRlcmZhY2UuICovCisJCVJFR19XUiAocERldmljZSwgTnZyYW0uQWRkciwgT2Zmc2V0ICYgTlZSQU1fQUREUkVTU19NQVNLKTsKKworCQlSRUdfV1IgKHBEZXZpY2UsIE52cmFtLkNtZCwgTlZSQU1fQ01EX1JEIHwgTlZSQU1fQ01EX0RPX0lUIHwKKwkJCU5WUkFNX0NNRF9GSVJTVCB8IE5WUkFNX0NNRF9MQVNUIHwgTlZSQU1fQ01EX0RPTkUpOworCisJCS8qIFdhaXQgZm9yIHRoZSBkb25lIGJpdCB0byBjbGVhci4gKi8KKwkJZm9yIChqID0gMDsgaiA8IDUwMDsgaisrKSB7CisJCQlNTV9XYWl0ICgxMCk7CisKKwkJCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIE52cmFtLkNtZCk7CisJCQlpZiAoIShWYWx1ZTMyICYgTlZSQU1fQ01EX0RPTkUpKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBXYWl0IGZvciB0aGUgZG9uZSBiaXQuICovCisJCWlmICghKFZhbHVlMzIgJiBOVlJBTV9DTURfRE9ORSkpIHsKKwkJCWZvciAoaiA9IDA7IGogPCA1MDA7IGorKykgeworCQkJCU1NX1dhaXQgKDEwKTsKKworCQkJCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIE52cmFtLkNtZCk7CisJCQkJaWYgKFZhbHVlMzIgJiBOVlJBTV9DTURfRE9ORSkgeworCQkJCQlNTV9XYWl0ICgxMCk7CisKKwkJCQkJKnBEYXRhID0KKwkJCQkJICAgIFJFR19SRCAocERldmljZSwgTnZyYW0uUmVhZERhdGEpOworCisJCQkJCS8qIENoYW5nZSB0aGUgZW5kaWFuZXNzLiAqLworCQkJCQkqcERhdGEgPQorCQkJCQkgICAgKCgqcERhdGEgJiAweGZmKSA8PCAyNCkgfAorCQkJCQkgICAgKCgqcERhdGEgJiAweGZmMDApIDw8IDgpIHwKKwkJCQkJICAgICgoKnBEYXRhICYgMHhmZjAwMDApID4+IDgpIHwKKwkJCQkJICAgICgoKnBEYXRhID4+IDI0KSAmIDB4ZmYpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCVJFR19XUiAocERldmljZSwgTnZyYW0uU3dBcmIsIFNXX0FSQl9SRVFfQ0xSMSk7CisJCWlmIChWYWx1ZTMyICYgTlZSQU1fQ01EX0RPTkUpIHsKKwkJCVN0YXR1cyA9IExNX1NUQVRVU19TVUNDRVNTOworCQl9IGVsc2UgeworCQkJU3RhdHVzID0gTE1fU1RBVFVTX0ZBSUxVUkU7CisJCX0KKwl9CisKKwlyZXR1cm4gU3RhdHVzOworfQkJCQkvKiBMTV9OdnJhbVJlYWQgKi8KKworU1RBVElDIHZvaWQgTE1fUmVhZFZQRCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQoreworCUxNX1VJTlQzMiBWcGRfYXJyWzI1NiAvIDRdOworCUxNX1VJTlQ4ICpWcGQgPSAoTE1fVUlOVDggKikgJiBWcGRfYXJyWzBdOworCUxNX1VJTlQzMiAqVnBkX2RwdHIgPSAmVnBkX2FyclswXTsKKwlMTV9VSU5UMzIgVmFsdWUzMjsKKwl1bnNpZ25lZCBpbnQgajsKKworCS8qIFJlYWQgUE4gZnJvbSBWUEQgKi8KKwlmb3IgKGogPSAwOyBqIDwgMjU2OyBqICs9IDQsIFZwZF9kcHRyKyspIHsKKwkJaWYgKExNX052cmFtUmVhZCAocERldmljZSwgMHgxMDAgKyBqLCAmVmFsdWUzMikgIT0KKwkJICAgIExNX1NUQVRVU19TVUNDRVNTKSB7CisJCQlwcmludGYgKCJCQ001NzB4OiBMTV9SZWFkVlBEOiBWUEQgcmVhZCBmYWlsZWQiCisJCQkJIiAobm8gRUVQUk9NIG9uYm9hcmQpXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQkqVnBkX2RwdHIgPSBjcHVfdG9fbGUzMiAoVmFsdWUzMik7CisJfQorCWZvciAoaiA9IDA7IGogPCAyNTY7KSB7CisJCXVuc2lnbmVkIGludCBWcGRfcl9sZW47CisJCXVuc2lnbmVkIGludCBWcGRfcl9lbmQ7CisKKwkJaWYgKChWcGRbal0gPT0gMHg4MikgfHwgKFZwZFtqXSA9PSAweDkxKSkgeworCQkJaiA9IGogKyAzICsgVnBkW2ogKyAxXSArIChWcGRbaiArIDJdIDw8IDgpOworCQl9IGVsc2UgaWYgKFZwZFtqXSA9PSAweDkwKSB7CisJCQlWcGRfcl9sZW4gPSBWcGRbaiArIDFdICsgKFZwZFtqICsgMl0gPDwgOCk7CisJCQlqICs9IDM7CisJCQlWcGRfcl9lbmQgPSBWcGRfcl9sZW4gKyBqOworCQkJd2hpbGUgKGogPCBWcGRfcl9lbmQpIHsKKwkJCQlpZiAoKFZwZFtqXSA9PSAnUCcpICYmIChWcGRbaiArIDFdID09ICdOJykpIHsKKwkJCQkJdW5zaWduZWQgaW50IGxlbiA9IFZwZFtqICsgMl07CisKKwkJCQkJaWYgKGxlbiA8PSAyNCkgeworCQkJCQkJbWVtY3B5IChwRGV2aWNlLT5QYXJ0Tm8sCisJCQkJCQkJJlZwZFtqICsgM10sIGxlbik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKFZwZFtqICsgMl0gPT0gMCkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaiA9IGogKyBWcGRbaiArIDJdOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9CiB9CiAKLVNUQVRJQyB2b2lkCi1MTV9SZWFkQm9vdENvZGVWZXJzaW9uKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK1NUQVRJQyB2b2lkIExNX1JlYWRCb290Q29kZVZlcnNpb24gKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKIHsKLSAgICBMTV9VSU5UMzIgVmFsdWUzMiwgb2Zmc2V0LCB2ZXJfb2Zmc2V0OwotICAgIGludCBpOworCUxNX1VJTlQzMiBWYWx1ZTMyLCBvZmZzZXQsIHZlcl9vZmZzZXQ7CisJaW50IGk7CiAKLSAgICBpZiAoTE1fTnZyYW1SZWFkKHBEZXZpY2UsIDB4MCwgJlZhbHVlMzIpICE9IExNX1NUQVRVU19TVUNDRVNTKQotCXJldHVybjsKLSAgICBpZiAoVmFsdWUzMiAhPSAweGFhNTU5OTY2KQotCXJldHVybjsKLSAgICBpZiAoTE1fTnZyYW1SZWFkKHBEZXZpY2UsIDB4YywgJm9mZnNldCkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0JcmV0dXJuOwotCi0gICAgb2Zmc2V0ID0gKChvZmZzZXQgJiAweGZmKSA8PCAyNCl8ICgob2Zmc2V0ICYgMHhmZjAwKSA8PCA4KXwKLQkoKG9mZnNldCAmIDB4ZmYwMDAwKSA+PiA4KSB8ICgob2Zmc2V0ID4+IDI0KSAmIDB4ZmYpOwotICAgIGlmIChMTV9OdnJhbVJlYWQocERldmljZSwgb2Zmc2V0LCAmVmFsdWUzMikgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0JcmV0dXJuOwotICAgIGlmICgoVmFsdWUzMiA9PSAweDAzMDAwMDBlKSAmJgotCShMTV9OdnJhbVJlYWQocERldmljZSwgb2Zmc2V0ICsgNCwgJlZhbHVlMzIpID09IExNX1NUQVRVU19TVUNDRVNTKSAmJgotCShWYWx1ZTMyID09IDApKSB7Ci0KLQlpZiAoTE1fTnZyYW1SZWFkKHBEZXZpY2UsIG9mZnNldCArIDgsICZ2ZXJfb2Zmc2V0KSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKLQkgICAgcmV0dXJuOwotCXZlcl9vZmZzZXQgPSAoKHZlcl9vZmZzZXQgJiAweGZmMDAwMCkgPj4gOCkgfAotCSAgICAoKHZlcl9vZmZzZXQgPj4gMjQpICYgMHhmZik7Ci0JZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDQpIHsKLQkgICAgaWYgKExNX052cmFtUmVhZChwRGV2aWNlLCBvZmZzZXQgKyB2ZXJfb2Zmc2V0ICsgaSwgJlZhbHVlMzIpICE9Ci0JCUxNX1NUQVRVU19TVUNDRVNTKQotCSAgICB7CisJaWYgKExNX052cmFtUmVhZCAocERldmljZSwgMHgwLCAmVmFsdWUzMikgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCiAJCXJldHVybjsKLQkgICAgfQotCSAgICAqKChMTV9VSU5UMzIgKikgJnBEZXZpY2UtPkJvb3RDb2RlVmVyW2ldKSA9IGNwdV90b19sZTMyKFZhbHVlMzIpOwotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JY2hhciBjOworCWlmIChWYWx1ZTMyICE9IDB4YWE1NTk5NjYpCisJCXJldHVybjsKKwlpZiAoTE1fTnZyYW1SZWFkIChwRGV2aWNlLCAweGMsICZvZmZzZXQpICE9IExNX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm47CiAKLQlpZiAoTE1fTnZyYW1SZWFkKHBEZXZpY2UsIDB4OTQsICZWYWx1ZTMyKSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKLQkgICAgcmV0dXJuOworCW9mZnNldCA9ICgob2Zmc2V0ICYgMHhmZikgPDwgMjQpIHwgKChvZmZzZXQgJiAweGZmMDApIDw8IDgpIHwKKwkgICAgKChvZmZzZXQgJiAweGZmMDAwMCkgPj4gOCkgfCAoKG9mZnNldCA+PiAyNCkgJiAweGZmKTsKKwlpZiAoTE1fTnZyYW1SZWFkIChwRGV2aWNlLCBvZmZzZXQsICZWYWx1ZTMyKSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuOworCWlmICgoVmFsdWUzMiA9PSAweDAzMDAwMDBlKSAmJgorCSAgICAoTE1fTnZyYW1SZWFkIChwRGV2aWNlLCBvZmZzZXQgKyA0LCAmVmFsdWUzMikgPT0gTE1fU1RBVFVTX1NVQ0NFU1MpCisJICAgICYmIChWYWx1ZTMyID09IDApKSB7CiAKLQlpID0gMDsKLQljID0gKChWYWx1ZTMyICYgMHhmZjAwMDApID4+IDE2KTsKKwkJaWYgKExNX052cmFtUmVhZCAocERldmljZSwgb2Zmc2V0ICsgOCwgJnZlcl9vZmZzZXQpICE9CisJCSAgICBMTV9TVEFUVVNfU1VDQ0VTUykKKwkJCXJldHVybjsKKwkJdmVyX29mZnNldCA9ICgodmVyX29mZnNldCAmIDB4ZmYwMDAwKSA+PiA4KSB8CisJCSAgICAoKHZlcl9vZmZzZXQgPj4gMjQpICYgMHhmZik7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSA0KSB7CisJCQlpZiAoTE1fTnZyYW1SZWFkCisJCQkgICAgKHBEZXZpY2UsIG9mZnNldCArIHZlcl9vZmZzZXQgKyBpLAorCQkJICAgICAmVmFsdWUzMikgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkqKChMTV9VSU5UMzIgKikgJiBwRGV2aWNlLT5Cb290Q29kZVZlcltpXSkgPQorCQkJICAgIGNwdV90b19sZTMyIChWYWx1ZTMyKTsKKwkJfQorCX0gZWxzZSB7CisJCWNoYXIgYzsKIAotCWlmIChjIDwgMTApIHsKLQkgICAgcERldmljZS0+Qm9vdENvZGVWZXJbaSsrXSA9IGMgKyAnMCc7CisJCWlmIChMTV9OdnJhbVJlYWQgKHBEZXZpY2UsIDB4OTQsICZWYWx1ZTMyKSAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKKwkJCXJldHVybjsKKworCQlpID0gMDsKKwkJYyA9ICgoVmFsdWUzMiAmIDB4ZmYwMDAwKSA+PiAxNik7CisKKwkJaWYgKGMgPCAxMCkgeworCQkJcERldmljZS0+Qm9vdENvZGVWZXJbaSsrXSA9IGMgKyAnMCc7CisJCX0gZWxzZSB7CisJCQlwRGV2aWNlLT5Cb290Q29kZVZlcltpKytdID0gKGMgLyAxMCkgKyAnMCc7CisJCQlwRGV2aWNlLT5Cb290Q29kZVZlcltpKytdID0gKGMgJSAxMCkgKyAnMCc7CisJCX0KKwkJcERldmljZS0+Qm9vdENvZGVWZXJbaSsrXSA9ICcuJzsKKwkJYyA9IChWYWx1ZTMyICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisJCWlmIChjIDwgMTApIHsKKwkJCXBEZXZpY2UtPkJvb3RDb2RlVmVyW2krK10gPSBjICsgJzAnOworCQl9IGVsc2UgeworCQkJcERldmljZS0+Qm9vdENvZGVWZXJbaSsrXSA9IChjIC8gMTApICsgJzAnOworCQkJcERldmljZS0+Qm9vdENvZGVWZXJbaSsrXSA9IChjICUgMTApICsgJzAnOworCQl9CisJCXBEZXZpY2UtPkJvb3RDb2RlVmVyW2ldID0gMDsKIAl9Ci0JZWxzZSB7Ci0JICAgIHBEZXZpY2UtPkJvb3RDb2RlVmVyW2krK10gPSAoYyAvIDEwKSArICcwJzsKLQkgICAgcERldmljZS0+Qm9vdENvZGVWZXJbaSsrXSA9IChjICUgMTApICsgJzAnOwotCX0KLQlwRGV2aWNlLT5Cb290Q29kZVZlcltpKytdID0gJy4nOwotCWMgPSAoVmFsdWUzMiAmIDB4ZmYwMDAwMDApID4+IDI0OwotCWlmIChjIDwgMTApIHsKLQkgICAgcERldmljZS0+Qm9vdENvZGVWZXJbaSsrXSA9IGMgKyAnMCc7Ci0JfQotCWVsc2UgewotCSAgICBwRGV2aWNlLT5Cb290Q29kZVZlcltpKytdID0gKGMgLyAxMCkgKyAnMCc7Ci0JICAgIHBEZXZpY2UtPkJvb3RDb2RlVmVyW2krK10gPSAoYyAlIDEwKSArICcwJzsKLQl9Ci0JcERldmljZS0+Qm9vdENvZGVWZXJbaV0gPSAwOwotICAgIH0KIH0KIAotU1RBVElDIHZvaWQKLUxNX0dldEJ1c1NwZWVkKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK1NUQVRJQyB2b2lkIExNX0dldEJ1c1NwZWVkIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCiB7Ci0gICAgTE1fVUlOVDMyIFBjaVN0YXRlID0gcERldmljZS0+UGNpU3RhdGU7Ci0gICAgTE1fVUlOVDMyIENsb2NrQ3RybDsKLSAgICBjaGFyICpTcGVlZFN0ciA9ICIiOworCUxNX1VJTlQzMiBQY2lTdGF0ZSA9IHBEZXZpY2UtPlBjaVN0YXRlOworCUxNX1VJTlQzMiBDbG9ja0N0cmw7CisJY2hhciAqU3BlZWRTdHIgPSAiIjsKIAotICAgIGlmIChQY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV8zMkJJVF9QQ0lfQlVTKQotICAgIHsKLQlzdHJjcHkocERldmljZS0+QnVzU3BlZWRTdHIsICIzMi1iaXQgIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0Jc3RyY3B5KHBEZXZpY2UtPkJ1c1NwZWVkU3RyLCAiNjQtYml0ICIpOwotICAgIH0KLSAgICBpZiAoUGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKQotICAgIHsKLQlzdHJjYXQocERldmljZS0+QnVzU3BlZWRTdHIsICJQQ0kgIik7Ci0JaWYgKFBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0hJR0hfQlVTX1NQRUVEKQotCXsKLQkgICAgU3BlZWRTdHIgPSAiNjZNSHoiOworCWlmIChQY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV8zMkJJVF9QQ0lfQlVTKSB7CisJCXN0cmNweSAocERldmljZS0+QnVzU3BlZWRTdHIsICIzMi1iaXQgIik7CisJfSBlbHNlIHsKKwkJc3RyY3B5IChwRGV2aWNlLT5CdXNTcGVlZFN0ciwgIjY0LWJpdCAiKTsKIAl9Ci0JZWxzZQotCXsKLQkgICAgU3BlZWRTdHIgPSAiMzNNSHoiOworCWlmIChQY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9DT05WRU5USU9OQUxfUENJX01PREUpIHsKKwkJc3RyY2F0IChwRGV2aWNlLT5CdXNTcGVlZFN0ciwgIlBDSSAiKTsKKwkJaWYgKFBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0hJR0hfQlVTX1NQRUVEKSB7CisJCQlTcGVlZFN0ciA9ICI2Nk1IeiI7CisJCX0gZWxzZSB7CisJCQlTcGVlZFN0ciA9ICIzM01IeiI7CisJCX0KKwl9IGVsc2UgeworCQlzdHJjYXQgKHBEZXZpY2UtPkJ1c1NwZWVkU3RyLCAiUENJWCAiKTsKKwkJaWYgKHBEZXZpY2UtPkJvbmRJZCA9PSBHUkNfTUlTQ19CRF9JRF81NzA0Q0lPQkUpIHsKKwkJCVNwZWVkU3RyID0gIjEzM01IeiI7CisJCX0gZWxzZSB7CisJCQlDbG9ja0N0cmwgPSBSRUdfUkQgKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwpICYgMHgxZjsKKwkJCXN3aXRjaCAoQ2xvY2tDdHJsKSB7CisJCQljYXNlIDA6CisJCQkJU3BlZWRTdHIgPSAiMzNNSHoiOworCQkJCWJyZWFrOworCisJCQljYXNlIDI6CisJCQkJU3BlZWRTdHIgPSAiNTBNSHoiOworCQkJCWJyZWFrOworCisJCQljYXNlIDQ6CisJCQkJU3BlZWRTdHIgPSAiNjZNSHoiOworCQkJCWJyZWFrOworCisJCQljYXNlIDY6CisJCQkJU3BlZWRTdHIgPSAiMTAwTUh6IjsKKwkJCQlicmVhazsKKworCQkJY2FzZSA3OgorCQkJCVNwZWVkU3RyID0gIjEzM01IeiI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KIAl9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0Jc3RyY2F0KHBEZXZpY2UtPkJ1c1NwZWVkU3RyLCAiUENJWCAiKTsKLQlpZiAocERldmljZS0+Qm9uZElkID09IEdSQ19NSVNDX0JEX0lEXzU3MDRDSU9CRSkKLQl7Ci0JICAgIFNwZWVkU3RyID0gIjEzM01IeiI7Ci0JfQotCWVsc2UKLQl7Ci0JICAgIENsb2NrQ3RybCA9IFJFR19SRChwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsKSAmIDB4MWY7Ci0JICAgIHN3aXRjaCAoQ2xvY2tDdHJsKQotCSAgICB7Ci0JICAgIGNhc2UgMDoKLQkJU3BlZWRTdHIgPSAiMzNNSHoiOwotCQlicmVhazsKLQotCSAgICBjYXNlIDI6Ci0JCVNwZWVkU3RyID0gIjUwTUh6IjsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSA0OgotCQlTcGVlZFN0ciA9ICI2Nk1IeiI7Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgNjoKLQkJU3BlZWRTdHIgPSAiMTAwTUh6IjsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSA3OgotCQlTcGVlZFN0ciA9ICIxMzNNSHoiOwotCQlicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgc3RyY2F0KHBEZXZpY2UtPkJ1c1NwZWVkU3RyLCBTcGVlZFN0cik7CisJc3RyY2F0IChwRGV2aWNlLT5CdXNTcGVlZFN0ciwgU3BlZWRTdHIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjYwLDk3NyArNTk4LDg5MCBAQAogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIExNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fU1RBVFVTCi1MTV9HZXRBZGFwdGVySW5mbygKLVBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK0xNX1NUQVRVUyBMTV9HZXRBZGFwdGVySW5mbyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQogewotICAgIFBMTV9BREFQVEVSX0lORk8gcEFkYXB0ZXJJbmZvOwotICAgIExNX1VJTlQzMiBWYWx1ZTMyOwotICAgIExNX1NUQVRVUyBTdGF0dXM7Ci0gICAgTE1fVUlOVDMyIGo7Ci0gICAgTE1fVUlOVDMyIEVlU2lnRm91bmQ7Ci0gICAgTE1fVUlOVDMyIEVlUGh5VHlwZVNlcmRlcyA9IDA7Ci0gICAgTE1fVUlOVDMyIEVlUGh5TGVkTW9kZSA9IDA7Ci0gICAgTE1fVUlOVDMyIEVlUGh5SWQgPSAwOworCVBMTV9BREFQVEVSX0lORk8gcEFkYXB0ZXJJbmZvOworCUxNX1VJTlQzMiBWYWx1ZTMyOworCUxNX1NUQVRVUyBTdGF0dXM7CisJTE1fVUlOVDMyIGo7CisJTE1fVUlOVDMyIEVlU2lnRm91bmQ7CisJTE1fVUlOVDMyIEVlUGh5VHlwZVNlcmRlcyA9IDA7CisJTE1fVUlOVDMyIEVlUGh5TGVkTW9kZSA9IDA7CisJTE1fVUlOVDMyIEVlUGh5SWQgPSAwOwogCi0gICAgLyogR2V0IERldmljZSBJZCBhbmQgVmVuZG9yIElkICovCi0gICAgU3RhdHVzID0gTU1fUmVhZENvbmZpZzMyKHBEZXZpY2UsIFBDSV9WRU5ET1JfSURfUkVHLCAmVmFsdWUzMik7Ci0gICAgaWYoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKQotICAgIHsKLQlyZXR1cm4gU3RhdHVzOwotICAgIH0KLSAgICBwRGV2aWNlLT5QY2lWZW5kb3JJZCA9IChMTV9VSU5UMTYpIFZhbHVlMzI7Ci0gICAgcERldmljZS0+UGNpRGV2aWNlSWQgPSAoTE1fVUlOVDE2KSAoVmFsdWUzMiA+PiAxNik7CisJLyogR2V0IERldmljZSBJZCBhbmQgVmVuZG9yIElkICovCisJU3RhdHVzID0gTU1fUmVhZENvbmZpZzMyIChwRGV2aWNlLCBQQ0lfVkVORE9SX0lEX1JFRywgJlZhbHVlMzIpOworCWlmIChTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmV0dXJuIFN0YXR1czsKKwl9CisJcERldmljZS0+UGNpVmVuZG9ySWQgPSAoTE1fVUlOVDE2KSBWYWx1ZTMyOworCXBEZXZpY2UtPlBjaURldmljZUlkID0gKExNX1VJTlQxNikgKFZhbHVlMzIgPj4gMTYpOwogCi0gICAgLyogSWYgd2UgYXJlIG5vdCBnZXR0aW5nIHRoZSB3cml0ZSBhZGFwdGVyLCBleGl0LiAqLwotICAgIGlmKChWYWx1ZTMyICE9IFQzX1BDSV9JRF9CQ001NzAwKSAmJgotICAgICAgIChWYWx1ZTMyICE9IFQzX1BDSV9JRF9CQ001NzAxKSAmJgotICAgICAgIChWYWx1ZTMyICE9IFQzX1BDSV9JRF9CQ001NzAyKSAmJgotICAgICAgIChWYWx1ZTMyICE9IFQzX1BDSV9JRF9CQ001NzAyeCkgJiYKLSAgICAgICAoVmFsdWUzMiAhPSBUM19QQ0lfSURfQkNNNTcwMkZFKSAmJgotICAgICAgIChWYWx1ZTMyICE9IFQzX1BDSV9JRF9CQ001NzAzKSAmJgotICAgICAgIChWYWx1ZTMyICE9IFQzX1BDSV9JRF9CQ001NzAzeCkgJiYKLSAgICAgICAoVmFsdWUzMiAhPSBUM19QQ0lfSURfQkNNNTcwNCkpCi0gICAgewotCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKLSAgICB9CisJLyogSWYgd2UgYXJlIG5vdCBnZXR0aW5nIHRoZSB3cml0ZSBhZGFwdGVyLCBleGl0LiAqLworCWlmICgoVmFsdWUzMiAhPSBUM19QQ0lfSURfQkNNNTcwMCkgJiYKKwkgICAgKFZhbHVlMzIgIT0gVDNfUENJX0lEX0JDTTU3MDEpICYmCisJICAgIChWYWx1ZTMyICE9IFQzX1BDSV9JRF9CQ001NzAyKSAmJgorCSAgICAoVmFsdWUzMiAhPSBUM19QQ0lfSURfQkNNNTcwMngpICYmCisJICAgIChWYWx1ZTMyICE9IFQzX1BDSV9JRF9CQ001NzAyRkUpICYmCisJICAgIChWYWx1ZTMyICE9IFQzX1BDSV9JRF9CQ001NzAzKSAmJgorCSAgICAoVmFsdWUzMiAhPSBUM19QQ0lfSURfQkNNNTcwM3gpICYmIChWYWx1ZTMyICE9IFQzX1BDSV9JRF9CQ001NzA0KSkgeworCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJfQogCi0gICAgU3RhdHVzID0gTU1fUmVhZENvbmZpZzMyKHBEZXZpY2UsIFBDSV9SRVZfSURfUkVHLCAmVmFsdWUzMik7Ci0gICAgaWYoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKQotICAgIHsKLQlyZXR1cm4gU3RhdHVzOwotICAgIH0KLSAgICBwRGV2aWNlLT5QY2lSZXZJZCA9IChMTV9VSU5UOCkgVmFsdWUzMjsKKwlTdGF0dXMgPSBNTV9SZWFkQ29uZmlnMzIgKHBEZXZpY2UsIFBDSV9SRVZfSURfUkVHLCAmVmFsdWUzMik7CisJaWYgKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCQlyZXR1cm4gU3RhdHVzOworCX0KKwlwRGV2aWNlLT5QY2lSZXZJZCA9IChMTV9VSU5UOCkgVmFsdWUzMjsKIAotICAgIC8qIEdldCBJUlEuICovCi0gICAgU3RhdHVzID0gTU1fUmVhZENvbmZpZzMyKHBEZXZpY2UsIFBDSV9JTlRfTElORV9SRUcsICZWYWx1ZTMyKTsKLSAgICBpZihTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0gICAgewotCXJldHVybiBTdGF0dXM7Ci0gICAgfQotICAgIHBEZXZpY2UtPklycSA9IChMTV9VSU5UOCkgVmFsdWUzMjsKKwkvKiBHZXQgSVJRLiAqLworCVN0YXR1cyA9IE1NX1JlYWRDb25maWczMiAocERldmljZSwgUENJX0lOVF9MSU5FX1JFRywgJlZhbHVlMzIpOworCWlmIChTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmV0dXJuIFN0YXR1czsKKwl9CisJcERldmljZS0+SXJxID0gKExNX1VJTlQ4KSBWYWx1ZTMyOwogCi0gICAgLyogR2V0IGludGVycnVwdCBwaW4uICovCi0gICAgcERldmljZS0+SW50UGluID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiA4KTsKKwkvKiBHZXQgaW50ZXJydXB0IHBpbi4gKi8KKwlwRGV2aWNlLT5JbnRQaW4gPSAoTE1fVUlOVDgpIChWYWx1ZTMyID4+IDgpOwogCi0gICAgLyogR2V0IGNoaXAgcmV2aXNpb24gaWQuICovCi0gICAgU3RhdHVzID0gTU1fUmVhZENvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9NSVNDX0hPU1RfQ1RSTF9SRUcsICZWYWx1ZTMyKTsKLSAgICBwRGV2aWNlLT5DaGlwUmV2SWQgPSBWYWx1ZTMyID4+IDE2OworCS8qIEdldCBjaGlwIHJldmlzaW9uIGlkLiAqLworCVN0YXR1cyA9IE1NX1JlYWRDb25maWczMiAocERldmljZSwgVDNfUENJX01JU0NfSE9TVF9DVFJMX1JFRywgJlZhbHVlMzIpOworCXBEZXZpY2UtPkNoaXBSZXZJZCA9IFZhbHVlMzIgPj4gMTY7CiAKLSAgICAvKiBHZXQgc3Vic3lzdGVtIHZlbmRvci4gKi8KLSAgICBTdGF0dXMgPSBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSURfUkVHLCAmVmFsdWUzMik7Ci0gICAgaWYoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKQotICAgIHsKLQlyZXR1cm4gU3RhdHVzOwotICAgIH0KLSAgICBwRGV2aWNlLT5TdWJzeXN0ZW1WZW5kb3JJZCA9IChMTV9VSU5UMTYpIFZhbHVlMzI7CisJLyogR2V0IHN1YnN5c3RlbSB2ZW5kb3IuICovCisJU3RhdHVzID0KKwkgICAgTU1fUmVhZENvbmZpZzMyIChwRGV2aWNlLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRF9SRUcsICZWYWx1ZTMyKTsKKwlpZiAoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKSB7CisJCXJldHVybiBTdGF0dXM7CisJfQorCXBEZXZpY2UtPlN1YnN5c3RlbVZlbmRvcklkID0gKExNX1VJTlQxNikgVmFsdWUzMjsKIAotICAgIC8qIEdldCBQQ0kgc3Vic3lzdGVtIGlkLiAqLwotICAgIHBEZXZpY2UtPlN1YnN5c3RlbUlkID0gKExNX1VJTlQxNikgKFZhbHVlMzIgPj4gMTYpOworCS8qIEdldCBQQ0kgc3Vic3lzdGVtIGlkLiAqLworCXBEZXZpY2UtPlN1YnN5c3RlbUlkID0gKExNX1VJTlQxNikgKFZhbHVlMzIgPj4gMTYpOwogCi0gICAgLyogR2V0IHRoZSBjYWNoZSBsaW5lIHNpemUuICovCi0gICAgTU1fUmVhZENvbmZpZzMyKHBEZXZpY2UsIFBDSV9DQUNIRV9MSU5FX1NJWkVfUkVHLCAmVmFsdWUzMik7Ci0gICAgcERldmljZS0+Q2FjaGVMaW5lU2l6ZSA9IChMTV9VSU5UOCkgVmFsdWUzMjsKLSAgICBwRGV2aWNlLT5TYXZlZENhY2hlTGluZVJlZyA9IFZhbHVlMzI7CisJLyogR2V0IHRoZSBjYWNoZSBsaW5lIHNpemUuICovCisJTU1fUmVhZENvbmZpZzMyIChwRGV2aWNlLCBQQ0lfQ0FDSEVfTElORV9TSVpFX1JFRywgJlZhbHVlMzIpOworCXBEZXZpY2UtPkNhY2hlTGluZVNpemUgPSAoTE1fVUlOVDgpIFZhbHVlMzI7CisJcERldmljZS0+U2F2ZWRDYWNoZUxpbmVSZWcgPSBWYWx1ZTMyOwogCi0gICAgaWYocERldmljZS0+Q2hpcFJldklkICE9IFQzX0NISVBfSURfNTcwM19BMSAmJgotCXBEZXZpY2UtPkNoaXBSZXZJZCAhPSBUM19DSElQX0lEXzU3MDNfQTIgJiYKLQlwRGV2aWNlLT5DaGlwUmV2SWQgIT0gVDNfQ0hJUF9JRF81NzA0X0EwKQotICAgIHsKLQlwRGV2aWNlLT5VbmRpRml4ID0gRkFMU0U7Ci0gICAgfQorCWlmIChwRGV2aWNlLT5DaGlwUmV2SWQgIT0gVDNfQ0hJUF9JRF81NzAzX0ExICYmCisJICAgIHBEZXZpY2UtPkNoaXBSZXZJZCAhPSBUM19DSElQX0lEXzU3MDNfQTIgJiYKKwkgICAgcERldmljZS0+Q2hpcFJldklkICE9IFQzX0NISVBfSURfNTcwNF9BMCkgeworCQlwRGV2aWNlLT5VbmRpRml4ID0gRkFMU0U7CisJfQogI2lmICFQQ0lYX1RBUkdFVF9XT1JLQVJPVU5ECi0gICAgcERldmljZS0+VW5kaUZpeCA9IEZBTFNFOworCXBEZXZpY2UtPlVuZGlGaXggPSBGQUxTRTsKICNlbmRpZgotICAgIC8qIE1hcCB0aGUgbWVtb3J5IGJhc2UgdG8gc3lzdGVtIGFkZHJlc3Mgc3BhY2UuICovCi0gICAgaWYgKCFwRGV2aWNlLT5VbmRpRml4KQotICAgIHsKLQlTdGF0dXMgPSBNTV9NYXBNZW1CYXNlKHBEZXZpY2UpOwotCWlmKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JICAgIHJldHVybiBTdGF0dXM7CisJLyogTWFwIHRoZSBtZW1vcnkgYmFzZSB0byBzeXN0ZW0gYWRkcmVzcyBzcGFjZS4gKi8KKwlpZiAoIXBEZXZpY2UtPlVuZGlGaXgpIHsKKwkJU3RhdHVzID0gTU1fTWFwTWVtQmFzZSAocERldmljZSk7CisJCWlmIChTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJldHVybiBTdGF0dXM7CisJCX0KKwkJLyogSW5pdGlhbGl6ZSB0aGUgbWVtb3J5IHZpZXcgcG9pbnRlci4gKi8KKwkJcERldmljZS0+cE1lbVZpZXcgPSAoUFQzX1NURF9NRU1fTUFQKSBwRGV2aWNlLT5wTWFwcGVkTWVtQmFzZTsKIAl9Ci0JLyogSW5pdGlhbGl6ZSB0aGUgbWVtb3J5IHZpZXcgcG9pbnRlci4gKi8KLQlwRGV2aWNlLT5wTWVtVmlldyA9IChQVDNfU1REX01FTV9NQVApIHBEZXZpY2UtPnBNYXBwZWRNZW1CYXNlOwotICAgIH0KKyNpZiBQQ0lYX1RBUkdFVF9XT1JLQVJPVU5ECisJLyogc3RvcmUgd2hldGhlciB3ZSBhcmUgaW4gUENJIGFyZSBQQ0ktWCBtb2RlICovCisJcERldmljZS0+RW5hYmxlUGNpWEZpeCA9IEZBTFNFOworCisJTU1fUmVhZENvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfU1RBVEVfUkVHLCAmVmFsdWUzMik7CisJaWYgKChWYWx1ZTMyICYgVDNfUENJX1NUQVRFX0NPTlZFTlRJT05BTF9QQ0lfTU9ERSkgPT0gMCkgeworCQkvKiBFbmFibGUgUENJLVggd29ya2Fyb3VuZCBvbmx5IGlmIHdlIGFyZSBydW5uaW5nIG9uIDU3MDAgQlguICovCisJCWlmIChUM19DSElQX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19DSElQX1JFVl81NzAwX0JYKSB7CisJCQlwRGV2aWNlLT5FbmFibGVQY2lYRml4ID0gVFJVRTsKKwkJfQorCX0KKwlpZiAocERldmljZS0+VW5kaUZpeCkgeworCQlwRGV2aWNlLT5FbmFibGVQY2lYRml4ID0gVFJVRTsKKwl9CisjZW5kaWYKKwkvKiBCeCBidWc6IGR1ZSB0byB0aGUgImJ5dGVfZW5hYmxlIGJ1ZyIgaW4gUENJLVggbW9kZSwgdGhlIHBvd2VyICovCisJLyogbWFuYWdlbWVudCByZWdpc3RlciBtYXkgYmUgY2xvYmJlcmVkIHdoaWNoIG1heSBjYXVzZSB0aGUgKi8KKwkvKiBCQ001NzAwIHRvIGdvIGludG8gRDMgc3RhdGUuICBXaGlsZSBpbiB0aGlzIHN0YXRlLCB3ZSB3aWxsICovCisJLyogbm90IGhhdmUgbWVtb3J5IG1hcHBlZCByZWdpc3RlciBhY2Nlc3MuICBBcyBhIHdvcmthcm91bmQsIHdlICovCisJLyogbmVlZCB0byByZXN0b3JlIHRoZSBkZXZpY2UgdG8gRDAgc3RhdGUuICovCisJTU1fUmVhZENvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfUE1fU1RBVFVTX0NUUkxfUkVHLCAmVmFsdWUzMik7CisJVmFsdWUzMiB8PSBUM19QTV9QTUVfQVNTRVJURUQ7CisJVmFsdWUzMiAmPSB+VDNfUE1fUE9XRVJfU1RBVEVfTUFTSzsKKwlWYWx1ZTMyIHw9IFQzX1BNX1BPV0VSX1NUQVRFX0QwOworCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9QTV9TVEFUVVNfQ1RSTF9SRUcsIFZhbHVlMzIpOworCisJLyogcmVhZCB0aGUgY3VycmVudCBQQ0kgY29tbWFuZCB3b3JkICovCisJTU1fUmVhZENvbmZpZzMyIChwRGV2aWNlLCBQQ0lfQ09NTUFORF9SRUcsICZWYWx1ZTMyKTsKKworCS8qIE1ha2Ugc3VyZSBidXMtbWFzdGVyaW5nIGlzIGVuYWJsZWQuICovCisJVmFsdWUzMiB8PSBQQ0lfQlVTTUFTVEVSX0VOQUJMRTsKIAogI2lmIFBDSVhfVEFSR0VUX1dPUktBUk9VTkQKLSAgICAvKiBzdG9yZSB3aGV0aGVyIHdlIGFyZSBpbiBQQ0kgYXJlIFBDSS1YIG1vZGUgKi8KLSAgICBwRGV2aWNlLT5FbmFibGVQY2lYRml4ID0gRkFMU0U7Ci0KLSAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgVDNfUENJX1NUQVRFX1JFRywgJlZhbHVlMzIpOwotICAgIGlmKChWYWx1ZTMyICYgVDNfUENJX1NUQVRFX0NPTlZFTlRJT05BTF9QQ0lfTU9ERSkgPT0gMCkKLSAgICB7Ci0JLyogRW5hYmxlIFBDSS1YIHdvcmthcm91bmQgb25seSBpZiB3ZSBhcmUgcnVubmluZyBvbiA1NzAwIEJYLiAqLwotCWlmKFQzX0NISVBfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQ0hJUF9SRVZfNTcwMF9CWCkKLQl7Ci0JICAgIHBEZXZpY2UtPkVuYWJsZVBjaVhGaXggPSBUUlVFOworCS8qIGlmIHdlIGFyZSBpbiBQQ0ktWCBtb2RlLCBhbHNvIG1ha2Ugc3VyZSBtZW0tbWFwcGluZyBhbmQgU0VSUiMvUEVSUiMKKwkgICBhcmUgZW5hYmxlZCAqLworCWlmIChwRGV2aWNlLT5FbmFibGVQY2lYRml4ID09IFRSVUUpIHsKKwkJVmFsdWUzMiB8PSAoUENJX01FTV9TUEFDRV9FTkFCTEUgfCBQQ0lfU1lTVEVNX0VSUk9SX0VOQUJMRSB8CisJCQkgICAgUENJX1BBUklUWV9FUlJPUl9FTkFCTEUpOwogCX0KLSAgICB9Ci0gICAgaWYgKHBEZXZpY2UtPlVuZGlGaXgpCi0gICAgewotCXBEZXZpY2UtPkVuYWJsZVBjaVhGaXggPSBUUlVFOwotICAgIH0KLSNlbmRpZgotICAgIC8qIEJ4IGJ1ZzogZHVlIHRvIHRoZSAiYnl0ZV9lbmFibGUgYnVnIiBpbiBQQ0ktWCBtb2RlLCB0aGUgcG93ZXIgKi8KLSAgICAvKiBtYW5hZ2VtZW50IHJlZ2lzdGVyIG1heSBiZSBjbG9iYmVyZWQgd2hpY2ggbWF5IGNhdXNlIHRoZSAqLwotICAgIC8qIEJDTTU3MDAgdG8gZ28gaW50byBEMyBzdGF0ZS4gIFdoaWxlIGluIHRoaXMgc3RhdGUsIHdlIHdpbGwgKi8KLSAgICAvKiBub3QgaGF2ZSBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVyIGFjY2Vzcy4gIEFzIGEgd29ya2Fyb3VuZCwgd2UgKi8KLSAgICAvKiBuZWVkIHRvIHJlc3RvcmUgdGhlIGRldmljZSB0byBEMCBzdGF0ZS4gKi8KLSAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgVDNfUENJX1BNX1NUQVRVU19DVFJMX1JFRywgJlZhbHVlMzIpOwotICAgIFZhbHVlMzIgfD0gVDNfUE1fUE1FX0FTU0VSVEVEOwotICAgIFZhbHVlMzIgJj0gflQzX1BNX1BPV0VSX1NUQVRFX01BU0s7Ci0gICAgVmFsdWUzMiB8PSBUM19QTV9QT1dFUl9TVEFURV9EMDsKLSAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9QTV9TVEFUVVNfQ1RSTF9SRUcsIFZhbHVlMzIpOwotCi0gICAgLyogcmVhZCB0aGUgY3VycmVudCBQQ0kgY29tbWFuZCB3b3JkICovCi0gICAgTU1fUmVhZENvbmZpZzMyKHBEZXZpY2UsIFBDSV9DT01NQU5EX1JFRywgJlZhbHVlMzIpOwotCi0gICAgLyogTWFrZSBzdXJlIGJ1cy1tYXN0ZXJpbmcgaXMgZW5hYmxlZC4gKi8KLSAgICBWYWx1ZTMyIHw9IFBDSV9CVVNNQVNURVJfRU5BQkxFOwotCi0jaWYgUENJWF9UQVJHRVRfV09SS0FST1VORAotICAgIC8qIGlmIHdlIGFyZSBpbiBQQ0ktWCBtb2RlLCBhbHNvIG1ha2Ugc3VyZSBtZW0tbWFwcGluZyBhbmQgU0VSUiMvUEVSUiMKLQlhcmUgZW5hYmxlZCAqLwotICAgIGlmIChwRGV2aWNlLT5FbmFibGVQY2lYRml4ID09IFRSVUUpIHsKLQlWYWx1ZTMyIHw9IChQQ0lfTUVNX1NQQUNFX0VOQUJMRSB8IFBDSV9TWVNURU1fRVJST1JfRU5BQkxFIHwKLQkJICAgIFBDSV9QQVJJVFlfRVJST1JfRU5BQkxFKTsKLSAgICB9Ci0gICAgaWYgKHBEZXZpY2UtPlVuZGlGaXgpCi0gICAgewotCVZhbHVlMzIgJj0gflBDSV9NRU1fU1BBQ0VfRU5BQkxFOwotICAgIH0KLQorCWlmIChwRGV2aWNlLT5VbmRpRml4KSB7CisJCVZhbHVlMzIgJj0gflBDSV9NRU1fU1BBQ0VfRU5BQkxFOworCX0KICNlbmRpZgogCi0gICAgaWYocERldmljZS0+RW5hYmxlTVdJKQotICAgIHsKLQlWYWx1ZTMyIHw9IFBDSV9NRU1PUllfV1JJVEVfSU5WQUxJREFURTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JVmFsdWUzMiAmPSAoflBDSV9NRU1PUllfV1JJVEVfSU5WQUxJREFURSk7Ci0gICAgfQorCWlmIChwRGV2aWNlLT5FbmFibGVNV0kpIHsKKwkJVmFsdWUzMiB8PSBQQ0lfTUVNT1JZX1dSSVRFX0lOVkFMSURBVEU7CisJfSBlbHNlIHsKKwkJVmFsdWUzMiAmPSAoflBDSV9NRU1PUllfV1JJVEVfSU5WQUxJREFURSk7CisJfQogCi0gICAgLyogRXJyb3Igb3V0IGlmIG1lbS1tYXBwaW5nIGlzIE5PVCBlbmFibGVkIGZvciBQQ0kgc3lzdGVtcyAqLwotICAgIGlmICghKFZhbHVlMzIgfCBQQ0lfTUVNX1NQQUNFX0VOQUJMRSkpCi0gICAgewotCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKLSAgICB9CisJLyogRXJyb3Igb3V0IGlmIG1lbS1tYXBwaW5nIGlzIE5PVCBlbmFibGVkIGZvciBQQ0kgc3lzdGVtcyAqLworCWlmICghKFZhbHVlMzIgfCBQQ0lfTUVNX1NQQUNFX0VOQUJMRSkpIHsKKwkJcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworCX0KIAotICAgIC8qIHNhdmUgdGhlIHZhbHVlIHdlIGFyZSBnb2luZyB0byB3cml0ZSBpbnRvIHRoZSBQQ0kgY29tbWFuZCB3b3JkICovCi0gICAgcERldmljZS0+UGNpQ29tbWFuZFN0YXR1c1dvcmRzID0gVmFsdWUzMjsKKwkvKiBzYXZlIHRoZSB2YWx1ZSB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgaW50byB0aGUgUENJIGNvbW1hbmQgd29yZCAqLworCXBEZXZpY2UtPlBjaUNvbW1hbmRTdGF0dXNXb3JkcyA9IFZhbHVlMzI7CiAKLSAgICBTdGF0dXMgPSBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFBDSV9DT01NQU5EX1JFRywgVmFsdWUzMik7Ci0gICAgaWYoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKQotICAgIHsKLQlyZXR1cm4gU3RhdHVzOwotICAgIH0KKwlTdGF0dXMgPSBNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBQQ0lfQ09NTUFORF9SRUcsIFZhbHVlMzIpOworCWlmIChTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmV0dXJuIFN0YXR1czsKKwl9CiAKLSAgICAvKiBTZXQgcG93ZXIgc3RhdGUgdG8gRDAuICovCi0gICAgTE1fU2V0UG93ZXJTdGF0ZShwRGV2aWNlLCBMTV9QT1dFUl9TVEFURV9EMCk7CisJLyogU2V0IHBvd2VyIHN0YXRlIHRvIEQwLiAqLworCUxNX1NldFBvd2VyU3RhdGUgKHBEZXZpY2UsIExNX1BPV0VSX1NUQVRFX0QwKTsKIAogI2lmZGVmIEJJR19FTkRJQU5fUENJCi0gICAgcERldmljZS0+TWlzY0hvc3RDdHJsID0KLQlNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQgfAotCU1JU0NfSE9TVF9DVFJMX0VOQUJMRV9JTkRJUkVDVF9BQ0NFU1MgfAotCU1JU0NfSE9TVF9DVFJMX0VOQUJMRV9FTkRJQU5fV09SRF9TV0FQIHwKLQlNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfUENJX1NUQVRFX1JFR19SVzsKLSNlbHNlIC8qIE5vIENQVSBTd2FwIG1vZGVzIGZvciBQQ0kgSU8gKi8KKwlwRGV2aWNlLT5NaXNjSG9zdEN0cmwgPQorCSAgICBNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQgfAorCSAgICBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfSU5ESVJFQ1RfQUNDRVNTIHwKKwkgICAgTUlTQ19IT1NUX0NUUkxfRU5BQkxFX0VORElBTl9XT1JEX1NXQVAgfAorCSAgICBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfUENJX1NUQVRFX1JFR19SVzsKKyNlbHNlCQkJCS8qIE5vIENQVSBTd2FwIG1vZGVzIGZvciBQQ0kgSU8gKi8KIAotICAgIC8qIFNldHVwIHRoZSBtb2RlIHJlZ2lzdGVycy4gKi8KLSAgICBwRGV2aWNlLT5NaXNjSG9zdEN0cmwgPQotCU1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCB8Ci0JTUlTQ19IT1NUX0NUUkxfRU5BQkxFX0VORElBTl9XT1JEX1NXQVAgfAorCS8qIFNldHVwIHRoZSBtb2RlIHJlZ2lzdGVycy4gKi8KKwlwRGV2aWNlLT5NaXNjSG9zdEN0cmwgPQorCSAgICBNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQgfAorCSAgICBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfRU5ESUFOX1dPUkRfU1dBUCB8CiAjaWZkZWYgQklHX0VORElBTl9IT1NUCi0JTUlTQ19IT1NUX0NUUkxfRU5BQkxFX0VORElBTl9CWVRFX1NXQVAgfAotI2VuZGlmIC8qIEJJR19FTkRJQU5fSE9TVCAqLwotCU1JU0NfSE9TVF9DVFJMX0VOQUJMRV9JTkRJUkVDVF9BQ0NFU1MgfAotCU1JU0NfSE9TVF9DVFJMX0VOQUJMRV9QQ0lfU1RBVEVfUkVHX1JXOwotI2VuZGlmIC8qICFCSUdfRU5ESUFOX1BDSSAqLworCSAgICBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfRU5ESUFOX0JZVEVfU1dBUCB8CisjZW5kaWYJCQkJLyogQklHX0VORElBTl9IT1NUICovCisJICAgIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9JTkRJUkVDVF9BQ0NFU1MgfAorCSAgICBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfUENJX1NUQVRFX1JFR19SVzsKKyNlbmRpZgkJCQkvKiAhQklHX0VORElBTl9QQ0kgKi8KIAotICAgIC8qIHdyaXRlIHRvIFBDSSBtaXNjIGhvc3QgY3RyIGZpcnN0IGluIG9yZGVyIHRvIGVuYWJsZSBpbmRpcmVjdCBhY2Nlc3NlcyAqLwotICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX01JU0NfSE9TVF9DVFJMX1JFRywgcERldmljZS0+TWlzY0hvc3RDdHJsKTsKKwkvKiB3cml0ZSB0byBQQ0kgbWlzYyBob3N0IGN0ciBmaXJzdCBpbiBvcmRlciB0byBlbmFibGUgaW5kaXJlY3QgYWNjZXNzZXMgKi8KKwlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfTUlTQ19IT1NUX0NUUkxfUkVHLAorCQkJICBwRGV2aWNlLT5NaXNjSG9zdEN0cmwpOwogCi0gICAgUkVHX1dSKHBEZXZpY2UsIFBjaUNmZy5NaXNjSG9zdEN0cmwsIHBEZXZpY2UtPk1pc2NIb3N0Q3RybCk7CisJUkVHX1dSIChwRGV2aWNlLCBQY2lDZmcuTWlzY0hvc3RDdHJsLCBwRGV2aWNlLT5NaXNjSG9zdEN0cmwpOwogCiAjaWZkZWYgQklHX0VORElBTl9QQ0kKLSAgICBWYWx1ZTMyID0gR1JDX01PREVfV09SRF9TV0FQX0RBVEF8Ci0JICAgICAgR1JDX01PREVfV09SRF9TV0FQX05PTl9GUkFNRV9EQVRBOworCVZhbHVlMzIgPSBHUkNfTU9ERV9XT1JEX1NXQVBfREFUQSB8IEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQTsKICNlbHNlCiAvKiBObyBDUFUgU3dhcCBtb2RlcyBmb3IgUENJIElPICovCiAjaWZkZWYgQklHX0VORElBTl9IT1NUCi0gICAgVmFsdWUzMiA9IEdSQ19NT0RFX0JZVEVfU1dBUF9OT05fRlJBTUVfREFUQSB8Ci0JICAgICAgR1JDX01PREVfV09SRF9TV0FQX05PTl9GUkFNRV9EQVRBOworCVZhbHVlMzIgPSBHUkNfTU9ERV9CWVRFX1NXQVBfTk9OX0ZSQU1FX0RBVEEgfAorCSAgICBHUkNfTU9ERV9XT1JEX1NXQVBfTk9OX0ZSQU1FX0RBVEE7CiAjZWxzZQotICAgIFZhbHVlMzIgPSBHUkNfTU9ERV9CWVRFX1NXQVBfTk9OX0ZSQU1FX0RBVEEgfCBHUkNfTU9ERV9CWVRFX1NXQVBfREFUQTsKKwlWYWx1ZTMyID0gR1JDX01PREVfQllURV9TV0FQX05PTl9GUkFNRV9EQVRBIHwgR1JDX01PREVfQllURV9TV0FQX0RBVEE7CiAjZW5kaWYKLSNlbmRpZiAvKiAhQklHX0VORElBTl9QQ0kgKi8KKyNlbmRpZgkJCQkvKiAhQklHX0VORElBTl9QQ0kgKi8KIAotICAgIFJFR19XUihwRGV2aWNlLCBHcmMuTW9kZSwgVmFsdWUzMik7CisJUkVHX1dSIChwRGV2aWNlLCBHcmMuTW9kZSwgVmFsdWUzMik7CiAKLSAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApCi0gICAgewotCVJFR19XUihwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMSB8Ci0JICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTEpOwotICAgIH0KLSAgICBNTV9XYWl0KDQwKTsKKwlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkgeworCQlSRUdfV1IgKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsCisJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMSB8CisJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UxKTsKKwl9CisJTU1fV2FpdCAoNDApOwogCi0gICAgLyogRW5hYmxlIGluZGlyZWN0IG1lbW9yeSBhY2Nlc3MgKi8KLSAgICBSRUdfV1IocERldmljZSwgTWVtQXJiaXRlci5Nb2RlLCBUM19NRU1fQVJCSVRFUl9NT0RFX0VOQUJMRSk7CisJLyogRW5hYmxlIGluZGlyZWN0IG1lbW9yeSBhY2Nlc3MgKi8KKwlSRUdfV1IgKHBEZXZpY2UsIE1lbUFyYml0ZXIuTW9kZSwgVDNfTUVNX0FSQklURVJfTU9ERV9FTkFCTEUpOwogCi0gICAgaWYgKFJFR19SRChwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsKSAmIFQzX1BDSV80NE1IWl9DT1JFX0NMT0NLKQotICAgIHsKLQlSRUdfV1IocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCwgVDNfUENJXzQ0TUhaX0NPUkVfQ0xPQ0sgfAotCQlUM19QQ0lfU0VMRUNUX0FMVEVSTkFURV9DTE9DSyk7Ci0JUkVHX1dSKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwsIFQzX1BDSV9TRUxFQ1RfQUxURVJOQVRFX0NMT0NLKTsKLQlNTV9XYWl0KDQwKTsgIC8qIHJlcXVpcmVkIGRlbGF5IGlzIDI3dXNlYyAqLwotICAgIH0KLSAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCwgMCk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIFBjaUNmZy5NZW1XaW5kb3dCYXNlQWRkciwgMCk7CisJaWYgKFJFR19SRCAocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCkgJiBUM19QQ0lfNDRNSFpfQ09SRV9DTE9DSykgeworCQlSRUdfV1IgKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwsIFQzX1BDSV80NE1IWl9DT1JFX0NMT0NLIHwKKwkJCVQzX1BDSV9TRUxFQ1RfQUxURVJOQVRFX0NMT0NLKTsKKwkJUkVHX1dSIChwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsLAorCQkJVDNfUENJX1NFTEVDVF9BTFRFUk5BVEVfQ0xPQ0spOworCQlNTV9XYWl0ICg0MCk7CS8qIHJlcXVpcmVkIGRlbGF5IGlzIDI3dXNlYyAqLworCX0KKwlSRUdfV1IgKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwsIDApOworCVJFR19XUiAocERldmljZSwgUGNpQ2ZnLk1lbVdpbmRvd0Jhc2VBZGRyLCAwKTsKIAogI2lmIFBDSVhfVEFSR0VUX1dPUktBUk9VTkQKLSAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgVDNfUENJX1NUQVRFX1JFRywgJlZhbHVlMzIpOwotICAgIGlmICgocERldmljZS0+RW5hYmxlUGNpWEZpeCA9PSBGQUxTRSkgJiYKLQkoKFZhbHVlMzIgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKSA9PSAwKSkKLSAgICB7Ci0JaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQTAgfHwKLQkgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMCB8fAotCSAgICBwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0IyIHx8Ci0JICAgIHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQjUpCi0JewotCSAgICBfX3Jhd193cml0ZWwoMCwgJihwRGV2aWNlLT5wTWVtVmlldy0+dUludE1lbS5NZW1CbG9jazMyS1sweDMwMF0pKTsKLQkgICAgX19yYXdfd3JpdGVsKDAsICYocERldmljZS0+cE1lbVZpZXctPnVJbnRNZW0uTWVtQmxvY2szMktbMHgzMDFdKSk7Ci0JICAgIF9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCAmKHBEZXZpY2UtPnBNZW1WaWV3LT51SW50TWVtLk1lbUJsb2NrMzJLWzB4MzAxXSkpOwotCSAgICBpZiAoX19yYXdfcmVhZGwoJihwRGV2aWNlLT5wTWVtVmlldy0+dUludE1lbS5NZW1CbG9jazMyS1sweDMwMF0pKSkKLQkgICAgewotCQlwRGV2aWNlLT5FbmFibGVQY2lYRml4ID0gVFJVRTsKLQkgICAgfQorCU1NX1JlYWRDb25maWczMiAocERldmljZSwgVDNfUENJX1NUQVRFX1JFRywgJlZhbHVlMzIpOworCWlmICgocERldmljZS0+RW5hYmxlUGNpWEZpeCA9PSBGQUxTRSkgJiYKKwkgICAgKChWYWx1ZTMyICYgVDNfUENJX1NUQVRFX0NPTlZFTlRJT05BTF9QQ0lfTU9ERSkgPT0gMCkpIHsKKwkJaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQTAgfHwKKwkJICAgIHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQjAgfHwKKwkJICAgIHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQjIgfHwKKwkJICAgIHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQjUpIHsKKwkJCV9fcmF3X3dyaXRlbCAoMCwKKwkJCQkgICAgICAmKHBEZXZpY2UtPnBNZW1WaWV3LT51SW50TWVtLgorCQkJCQlNZW1CbG9jazMyS1sweDMwMF0pKTsKKwkJCV9fcmF3X3dyaXRlbCAoMCwKKwkJCQkgICAgICAmKHBEZXZpY2UtPnBNZW1WaWV3LT51SW50TWVtLgorCQkJCQlNZW1CbG9jazMyS1sweDMwMV0pKTsKKwkJCV9fcmF3X3dyaXRlbCAoMHhmZmZmZmZmZiwKKwkJCQkgICAgICAmKHBEZXZpY2UtPnBNZW1WaWV3LT51SW50TWVtLgorCQkJCQlNZW1CbG9jazMyS1sweDMwMV0pKTsKKwkJCWlmIChfX3Jhd19yZWFkbAorCQkJICAgICgmKHBEZXZpY2UtPnBNZW1WaWV3LT51SW50TWVtLk1lbUJsb2NrMzJLWzB4MzAwXSkpKQorCQkJeworCQkJCXBEZXZpY2UtPkVuYWJsZVBjaVhGaXggPSBUUlVFOworCQkJfQorCQl9CiAJfQotICAgIH0KICNlbmRpZgogI2lmIDEKLSAgICAvKgotICAgICogIFRoaXMgY29kZSB3YXMgYXQgdGhlIGJlZ2lubmluZyBvZiBlbHNlIGJsb2NrIGJlbG93LCBidXQgdGhhdCdzCi0gICAgKiAgYSBidWcgaWYgbm9kZSBhZGRyZXNzIGluIHNoYXJlZCBtZW1vcnkuCi0gICAgKi8KLSAgICBNTV9XYWl0KDUwKTsKLSAgICBMTV9OdnJhbUluaXQocERldmljZSk7CisJLyoKKwkgKiAgVGhpcyBjb2RlIHdhcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVsc2UgYmxvY2sgYmVsb3csIGJ1dCB0aGF0J3MKKwkgKiAgYSBidWcgaWYgbm9kZSBhZGRyZXNzIGluIHNoYXJlZCBtZW1vcnkuCisJICovCisJTU1fV2FpdCAoNTApOworCUxNX052cmFtSW5pdCAocERldmljZSk7CiAjZW5kaWYKLSAgICAvKiBHZXQgdGhlIG5vZGUgYWRkcmVzcy4gIEZpcnN0IHRyeSB0byBnZXQgaW4gZnJvbSB0aGUgc2hhcmVkIG1lbW9yeS4gKi8KLSAgICAvKiBJZiB0aGUgc2lnbmF0dXJlIGlzIG5vdCBwcmVzZW50LCB0aGVuIGdldCBpdCBmcm9tIHRoZSBOVlJBTS4gKi8KLSAgICBWYWx1ZTMyID0gTUVNX1JEX09GRlNFVChwRGV2aWNlLCBUM19NQUNfQUREUl9ISUdIX01BSUxCT1gpOwotICAgIGlmKChWYWx1ZTMyID4+IDE2KSA9PSAweDQ4NGIpCi0gICAgeworCS8qIEdldCB0aGUgbm9kZSBhZGRyZXNzLiAgRmlyc3QgdHJ5IHRvIGdldCBpbiBmcm9tIHRoZSBzaGFyZWQgbWVtb3J5LiAqLworCS8qIElmIHRoZSBzaWduYXR1cmUgaXMgbm90IHByZXNlbnQsIHRoZW4gZ2V0IGl0IGZyb20gdGhlIE5WUkFNLiAqLworCVZhbHVlMzIgPSBNRU1fUkRfT0ZGU0VUIChwRGV2aWNlLCBUM19NQUNfQUREUl9ISUdIX01BSUxCT1gpOworCWlmICgoVmFsdWUzMiA+PiAxNikgPT0gMHg0ODRiKSB7CiAKLQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1swXSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gOCk7Ci0JcERldmljZS0+Tm9kZUFkZHJlc3NbMV0gPSAoTE1fVUlOVDgpIFZhbHVlMzI7CisJCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzBdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiA4KTsKKwkJcERldmljZS0+Tm9kZUFkZHJlc3NbMV0gPSAoTE1fVUlOVDgpIFZhbHVlMzI7CiAKLQlWYWx1ZTMyID0gTUVNX1JEX09GRlNFVChwRGV2aWNlLCBUM19NQUNfQUREUl9MT1dfTUFJTEJPWCk7CisJCVZhbHVlMzIgPSBNRU1fUkRfT0ZGU0VUIChwRGV2aWNlLCBUM19NQUNfQUREUl9MT1dfTUFJTEJPWCk7CiAKLQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1syXSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gMjQpOwotCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzNdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiAxNik7Ci0JcERldmljZS0+Tm9kZUFkZHJlc3NbNF0gPSAoTE1fVUlOVDgpIChWYWx1ZTMyID4+IDgpOwotCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzVdID0gKExNX1VJTlQ4KSBWYWx1ZTMyOworCQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1syXSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gMjQpOworCQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1szXSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gMTYpOworCQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1s0XSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gOCk7CisJCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzVdID0gKExNX1VJTlQ4KSBWYWx1ZTMyOwogCi0JU3RhdHVzID0gTE1fU1RBVFVTX1NVQ0NFU1M7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JU3RhdHVzID0gTE1fTnZyYW1SZWFkKHBEZXZpY2UsIDB4N2MsICZWYWx1ZTMyKTsKLQlpZihTdGF0dXMgPT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0JewotCSAgICBwRGV2aWNlLT5Ob2RlQWRkcmVzc1swXSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gMTYpOwotCSAgICBwRGV2aWNlLT5Ob2RlQWRkcmVzc1sxXSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gMjQpOworCQlTdGF0dXMgPSBMTV9TVEFUVVNfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlTdGF0dXMgPSBMTV9OdnJhbVJlYWQgKHBEZXZpY2UsIDB4N2MsICZWYWx1ZTMyKTsKKwkJaWYgKFN0YXR1cyA9PSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCQkJcERldmljZS0+Tm9kZUFkZHJlc3NbMF0gPSAoTE1fVUlOVDgpIChWYWx1ZTMyID4+IDE2KTsKKwkJCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzFdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiAyNCk7CiAKLQkgICAgU3RhdHVzID0gTE1fTnZyYW1SZWFkKHBEZXZpY2UsIDB4ODAsICZWYWx1ZTMyKTsKKwkJCVN0YXR1cyA9IExNX052cmFtUmVhZCAocERldmljZSwgMHg4MCwgJlZhbHVlMzIpOwogCi0JICAgIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzJdID0gKExNX1VJTlQ4KSBWYWx1ZTMyOwotCSAgICBwRGV2aWNlLT5Ob2RlQWRkcmVzc1szXSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gOCk7Ci0JICAgIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzRdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiAxNik7Ci0JICAgIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzVdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiAyNCk7CisJCQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1syXSA9IChMTV9VSU5UOCkgVmFsdWUzMjsKKwkJCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzNdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiA4KTsKKwkJCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzRdID0gKExNX1VJTlQ4KSAoVmFsdWUzMiA+PiAxNik7CisJCQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1s1XSA9IChMTV9VSU5UOCkgKFZhbHVlMzIgPj4gMjQpOworCQl9CiAJfQotICAgIH0KIAotICAgIC8qIEFzc2lnbiBhIGRlZmF1bHQgYWRkcmVzcy4gKi8KLSAgICBpZihTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0gICAgeworCS8qIEFzc2lnbiBhIGRlZmF1bHQgYWRkcmVzcy4gKi8KKwlpZiAoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKSB7CiAjaWZuZGVmIEVNQkVEREVECi0JcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgZ2V0IE1BQyBhZGRyIGZyb20gTlZSQU0uIFVzaW5nIGRlZmF1bHQuXG4iKTsKKwkJcHJpbnRrIChLRVJOX0VSUgorCQkJIkNhbm5vdCBnZXQgTUFDIGFkZHIgZnJvbSBOVlJBTS4gVXNpbmcgZGVmYXVsdC5cbiIpOwogI2VuZGlmCi0JcERldmljZS0+Tm9kZUFkZHJlc3NbMF0gPSAweDAwOyBwRGV2aWNlLT5Ob2RlQWRkcmVzc1sxXSA9IDB4MTA7Ci0JcERldmljZS0+Tm9kZUFkZHJlc3NbMl0gPSAweDE4OyBwRGV2aWNlLT5Ob2RlQWRkcmVzc1szXSA9IDB4Njg7Ci0JcERldmljZS0+Tm9kZUFkZHJlc3NbNF0gPSAweDYxOyBwRGV2aWNlLT5Ob2RlQWRkcmVzc1s1XSA9IDB4NzY7Ci0gICAgfQorCQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1swXSA9IDB4MDA7CisJCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzFdID0gMHgxMDsKKwkJcERldmljZS0+Tm9kZUFkZHJlc3NbMl0gPSAweDE4OworCQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1szXSA9IDB4Njg7CisJCXBEZXZpY2UtPk5vZGVBZGRyZXNzWzRdID0gMHg2MTsKKwkJcERldmljZS0+Tm9kZUFkZHJlc3NbNV0gPSAweDc2OworCX0KIAotICAgIHBEZXZpY2UtPlBlcm1hbmVudE5vZGVBZGRyZXNzWzBdID0gcERldmljZS0+Tm9kZUFkZHJlc3NbMF07Ci0gICAgcERldmljZS0+UGVybWFuZW50Tm9kZUFkZHJlc3NbMV0gPSBwRGV2aWNlLT5Ob2RlQWRkcmVzc1sxXTsKLSAgICBwRGV2aWNlLT5QZXJtYW5lbnROb2RlQWRkcmVzc1syXSA9IHBEZXZpY2UtPk5vZGVBZGRyZXNzWzJdOwotICAgIHBEZXZpY2UtPlBlcm1hbmVudE5vZGVBZGRyZXNzWzNdID0gcERldmljZS0+Tm9kZUFkZHJlc3NbM107Ci0gICAgcERldmljZS0+UGVybWFuZW50Tm9kZUFkZHJlc3NbNF0gPSBwRGV2aWNlLT5Ob2RlQWRkcmVzc1s0XTsKLSAgICBwRGV2aWNlLT5QZXJtYW5lbnROb2RlQWRkcmVzc1s1XSA9IHBEZXZpY2UtPk5vZGVBZGRyZXNzWzVdOworCXBEZXZpY2UtPlBlcm1hbmVudE5vZGVBZGRyZXNzWzBdID0gcERldmljZS0+Tm9kZUFkZHJlc3NbMF07CisJcERldmljZS0+UGVybWFuZW50Tm9kZUFkZHJlc3NbMV0gPSBwRGV2aWNlLT5Ob2RlQWRkcmVzc1sxXTsKKwlwRGV2aWNlLT5QZXJtYW5lbnROb2RlQWRkcmVzc1syXSA9IHBEZXZpY2UtPk5vZGVBZGRyZXNzWzJdOworCXBEZXZpY2UtPlBlcm1hbmVudE5vZGVBZGRyZXNzWzNdID0gcERldmljZS0+Tm9kZUFkZHJlc3NbM107CisJcERldmljZS0+UGVybWFuZW50Tm9kZUFkZHJlc3NbNF0gPSBwRGV2aWNlLT5Ob2RlQWRkcmVzc1s0XTsKKwlwRGV2aWNlLT5QZXJtYW5lbnROb2RlQWRkcmVzc1s1XSA9IHBEZXZpY2UtPk5vZGVBZGRyZXNzWzVdOwogCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB2YWx1ZXMuICovCi0gICAgcERldmljZS0+Tm9UeFBzZXVkb0hkckNoa3N1bSA9IEZBTFNFOwotICAgIHBEZXZpY2UtPk5vUnhQc2V1ZG9IZHJDaGtzdW0gPSBGQUxTRTsKLSAgICBwRGV2aWNlLT5OaWNTZW5kQmQgPSBGQUxTRTsKLSAgICBwRGV2aWNlLT5UeFBhY2tldERlc2NDbnQgPSBERUZBVUxUX1RYX1BBQ0tFVF9ERVNDX0NPVU5UOwotICAgIHBEZXZpY2UtPlJ4U3RkRGVzY0NudCA9IERFRkFVTFRfU1REX1JDVl9ERVNDX0NPVU5UOwotICAgIHBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzID0gREVGQVVMVF9SWF9DT0FMRVNDSU5HX1RJQ0tTOwotICAgIHBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzID0gREVGQVVMVF9UWF9DT0FMRVNDSU5HX1RJQ0tTOwotICAgIHBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzID0gREVGQVVMVF9SWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FUzsKLSAgICBwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lcyA9IERFRkFVTFRfVFhfTUFYX0NPQUxFU0NFRF9GUkFNRVM7Ci0gICAgcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPSBCQURfREVGQVVMVF9WQUxVRTsKLSAgICBwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9IEJBRF9ERUZBVUxUX1ZBTFVFOwotICAgIHBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID0gQkFEX0RFRkFVTFRfVkFMVUU7Ci0gICAgcERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPSBCQURfREVGQVVMVF9WQUxVRTsKLSAgICBwRGV2aWNlLT5TdGF0c0NvYWxlc2NpbmdUaWNrcyA9IERFRkFVTFRfU1RBVFNfQ09BTEVTQ0lOR19USUNLUzsKLSAgICBwRGV2aWNlLT5FbmFibGVNV0kgPSBGQUxTRTsKLSAgICBwRGV2aWNlLT5UeE10dSA9IE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRV9OT19DUkM7Ci0gICAgcERldmljZS0+UnhNdHUgPSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkVfTk9fQ1JDOwotICAgIHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID0gRkFMU0U7Ci0gICAgcERldmljZS0+UGh5SW50TW9kZSA9IFQzX1BIWV9JTlRfTU9ERV9BVVRPOwotICAgIHBEZXZpY2UtPkxpbmtDaG5nTW9kZSA9IFQzX0xJTktfQ0hOR19NT0RFX0FVVE87Ci0gICAgcERldmljZS0+TGVkTW9kZSA9IExFRF9NT0RFX0FVVE87Ci0gICAgcERldmljZS0+UmVzZXRQaHlPbkluaXQgPSBUUlVFOwotICAgIHBEZXZpY2UtPkRlbGF5UGNpR3JhbnQgPSBUUlVFOwotICAgIHBEZXZpY2UtPlVzZVRhZ2dlZFN0YXR1cyA9IEZBTFNFOwotICAgIHBEZXZpY2UtPk9uZURtYUF0T25jZSA9IEJBRF9ERUZBVUxUX1ZBTFVFOworCS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgdmFsdWVzLiAqLworCXBEZXZpY2UtPk5vVHhQc2V1ZG9IZHJDaGtzdW0gPSBGQUxTRTsKKwlwRGV2aWNlLT5Ob1J4UHNldWRvSGRyQ2hrc3VtID0gRkFMU0U7CisJcERldmljZS0+TmljU2VuZEJkID0gRkFMU0U7CisJcERldmljZS0+VHhQYWNrZXREZXNjQ250ID0gREVGQVVMVF9UWF9QQUNLRVRfREVTQ19DT1VOVDsKKwlwRGV2aWNlLT5SeFN0ZERlc2NDbnQgPSBERUZBVUxUX1NURF9SQ1ZfREVTQ19DT1VOVDsKKwlwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrcyA9IERFRkFVTFRfUlhfQ09BTEVTQ0lOR19USUNLUzsKKwlwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrcyA9IERFRkFVTFRfVFhfQ09BTEVTQ0lOR19USUNLUzsKKwlwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lcyA9IERFRkFVTFRfUlhfTUFYX0NPQUxFU0NFRF9GUkFNRVM7CisJcERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXMgPSBERUZBVUxUX1RYX01BWF9DT0FMRVNDRURfRlJBTUVTOworCXBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID0gQkFEX0RFRkFVTFRfVkFMVUU7CisJcERldmljZS0+VHhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPSBCQURfREVGQVVMVF9WQUxVRTsKKwlwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9IEJBRF9ERUZBVUxUX1ZBTFVFOworCXBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID0gQkFEX0RFRkFVTFRfVkFMVUU7CisJcERldmljZS0+U3RhdHNDb2FsZXNjaW5nVGlja3MgPSBERUZBVUxUX1NUQVRTX0NPQUxFU0NJTkdfVElDS1M7CisJcERldmljZS0+RW5hYmxlTVdJID0gRkFMU0U7CisJcERldmljZS0+VHhNdHUgPSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkVfTk9fQ1JDOworCXBEZXZpY2UtPlJ4TXR1ID0gTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFX05PX0NSQzsKKwlwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9IEZBTFNFOworCXBEZXZpY2UtPlBoeUludE1vZGUgPSBUM19QSFlfSU5UX01PREVfQVVUTzsKKwlwRGV2aWNlLT5MaW5rQ2huZ01vZGUgPSBUM19MSU5LX0NITkdfTU9ERV9BVVRPOworCXBEZXZpY2UtPkxlZE1vZGUgPSBMRURfTU9ERV9BVVRPOworCXBEZXZpY2UtPlJlc2V0UGh5T25Jbml0ID0gVFJVRTsKKwlwRGV2aWNlLT5EZWxheVBjaUdyYW50ID0gVFJVRTsKKwlwRGV2aWNlLT5Vc2VUYWdnZWRTdGF0dXMgPSBGQUxTRTsKKwlwRGV2aWNlLT5PbmVEbWFBdE9uY2UgPSBCQURfREVGQVVMVF9WQUxVRTsKIAotICAgIHBEZXZpY2UtPkRtYU1idWZMb3dNYXJrID0gVDNfREVGX0RNQV9NQlVGX0xPV19XTUFSS19KVU1CTzsKLSAgICBwRGV2aWNlLT5SeE1hY01idWZMb3dNYXJrID0gVDNfREVGX1JYX01BQ19NQlVGX0xPV19XTUFSS19KVU1CTzsKLSAgICBwRGV2aWNlLT5NYnVmSGlnaE1hcmsgPSBUM19ERUZfTUJVRl9ISUdIX1dNQVJLX0pVTUJPOworCXBEZXZpY2UtPkRtYU1idWZMb3dNYXJrID0gVDNfREVGX0RNQV9NQlVGX0xPV19XTUFSS19KVU1CTzsKKwlwRGV2aWNlLT5SeE1hY01idWZMb3dNYXJrID0gVDNfREVGX1JYX01BQ19NQlVGX0xPV19XTUFSS19KVU1CTzsKKwlwRGV2aWNlLT5NYnVmSGlnaE1hcmsgPSBUM19ERUZfTUJVRl9ISUdIX1dNQVJLX0pVTUJPOwogCi0gICAgcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfQVVUTzsKLSAgICBwRGV2aWNlLT5UYXNrT2ZmbG9hZENhcCA9IExNX1RBU0tfT0ZGTE9BRF9OT05FOwotICAgIHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwID0gTE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0U7Ci0gICAgcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7CisJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0gTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfQVVUTzsKKwlwRGV2aWNlLT5UYXNrT2ZmbG9hZENhcCA9IExNX1RBU0tfT0ZGTE9BRF9OT05FOworCXBEZXZpY2UtPkZsb3dDb250cm9sQ2FwID0gTE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0U7CisJcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7CiAjaWYgSU5DTFVERV9UQklfU1VQUE9SVAotICAgIHBEZXZpY2UtPlBvbGxUYmlMaW5rID0gQkFEX0RFRkFVTFRfVkFMVUU7CisJcERldmljZS0+UG9sbFRiaUxpbmsgPSBCQURfREVGQVVMVF9WQUxVRTsKICNlbmRpZgogCi0gICAgc3dpdGNoIChUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpKQotICAgIHsKLSAgICBjYXNlIFQzX0FTSUNfUkVWXzU3MDQ6Ci0JcERldmljZS0+TWJ1ZkJhc2UgPSBUM19OSUNfTUJVRl9QT09MX0FERFI7Ci0JcERldmljZS0+TWJ1ZlNpemUgPSBUM19OSUNfTUJVRl9QT09MX1NJWkU2NDsKLQlicmVhazsKLSAgICBkZWZhdWx0OgotCXBEZXZpY2UtPk1idWZCYXNlID0gVDNfTklDX01CVUZfUE9PTF9BRERSOwotCXBEZXZpY2UtPk1idWZTaXplID0gVDNfTklDX01CVUZfUE9PTF9TSVpFOTY7Ci0JYnJlYWs7Ci0gICAgfQorCXN3aXRjaCAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkpIHsKKwljYXNlIFQzX0FTSUNfUkVWXzU3MDQ6CisJCXBEZXZpY2UtPk1idWZCYXNlID0gVDNfTklDX01CVUZfUE9PTF9BRERSOworCQlwRGV2aWNlLT5NYnVmU2l6ZSA9IFQzX05JQ19NQlVGX1BPT0xfU0laRTY0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwRGV2aWNlLT5NYnVmQmFzZSA9IFQzX05JQ19NQlVGX1BPT0xfQUREUjsKKwkJcERldmljZS0+TWJ1ZlNpemUgPSBUM19OSUNfTUJVRl9QT09MX1NJWkU5NjsKKwkJYnJlYWs7CisJfQogCi0gICAgcERldmljZS0+TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0RPV047Ci0gICAgcERldmljZS0+UXVldWVSeFBhY2tldHMgPSBUUlVFOworCXBEZXZpY2UtPkxpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19ET1dOOworCXBEZXZpY2UtPlF1ZXVlUnhQYWNrZXRzID0gVFJVRTsKIAotICAgIHBEZXZpY2UtPkVuYWJsZVdpcmVTcGVlZCA9IFRSVUU7CisJcERldmljZS0+RW5hYmxlV2lyZVNwZWVkID0gVFJVRTsKIAogI2lmIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQKLSAgICBwRGV2aWNlLT5SeEp1bWJvRGVzY0NudCA9IERFRkFVTFRfSlVNQk9fUkNWX0RFU0NfQ09VTlQ7Ci0jZW5kaWYgLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLworCXBEZXZpY2UtPlJ4SnVtYm9EZXNjQ250ID0gREVGQVVMVF9KVU1CT19SQ1ZfREVTQ19DT1VOVDsKKyNlbmRpZgkJCQkvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCiAKLSAgICAvKiBNYWtlIHRoaXMgaXMgYSBrbm93biBhZGFwdGVyLiAqLwotICAgIHBBZGFwdGVySW5mbyA9IExNX0dldEFkYXB0ZXJJbmZvQnlTc2lkKHBEZXZpY2UtPlN1YnN5c3RlbVZlbmRvcklkLAotCXBEZXZpY2UtPlN1YnN5c3RlbUlkKTsKKwkvKiBNYWtlIHRoaXMgaXMgYSBrbm93biBhZGFwdGVyLiAqLworCXBBZGFwdGVySW5mbyA9IExNX0dldEFkYXB0ZXJJbmZvQnlTc2lkIChwRGV2aWNlLT5TdWJzeXN0ZW1WZW5kb3JJZCwKKwkJCQkJCXBEZXZpY2UtPlN1YnN5c3RlbUlkKTsKIAotICAgIHBEZXZpY2UtPkJvbmRJZCA9IFJFR19SRChwRGV2aWNlLCBHcmMuTWlzY0NmZykgJiBHUkNfTUlTQ19CRF9JRF9NQVNLOwotICAgIGlmIChwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwMCAmJgotCXBEZXZpY2UtPkJvbmRJZCAhPSBHUkNfTUlTQ19CRF9JRF81NzAxICYmCi0JcERldmljZS0+Qm9uZElkICE9IEdSQ19NSVNDX0JEX0lEXzU3MDJGRSAmJgotCXBEZXZpY2UtPkJvbmRJZCAhPSBHUkNfTUlTQ19CRF9JRF81NzAzICYmCi0JcERldmljZS0+Qm9uZElkICE9IEdSQ19NSVNDX0JEX0lEXzU3MDNTICYmCi0JcERldmljZS0+Qm9uZElkICE9IEdSQ19NSVNDX0JEX0lEXzU3MDQgJiYKLQlwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwNENJT0JFKQotICAgIHsKLQlyZXR1cm4gTE1fU1RBVFVTX1VOS05PV05fQURBUFRFUjsKLSAgICB9Ci0KLSAgICBwRGV2aWNlLT5TcGxpdE1vZGVFbmFibGUgPSBTUExJVF9NT0RFX0RJU0FCTEU7Ci0gICAgaWYgKChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzA0X0EwKSAmJgotCShwRGV2aWNlLT5Cb25kSWQgPT0gR1JDX01JU0NfQkRfSURfNTcwNENJT0JFKSkKLSAgICB7Ci0JcERldmljZS0+U3BsaXRNb2RlRW5hYmxlID0gU1BMSVRfTU9ERV9FTkFCTEU7Ci0JcERldmljZS0+U3BsaXRNb2RlTWF4UmVxID0gU1BMSVRfTU9ERV81NzA0X01BWF9SRVE7Ci0gICAgfQotCi0gICAgLyogR2V0IEVlcHJvbSBpbmZvLiAqLwotICAgIFZhbHVlMzIgPSBNRU1fUkRfT0ZGU0VUKHBEZXZpY2UsIFQzX05JQ19EQVRBX1NJR19BRERSKTsKLSAgICBpZiAoVmFsdWUzMiA9PSBUM19OSUNfREFUQV9TSUcpCi0gICAgewotCUVlU2lnRm91bmQgPSBUUlVFOwotCVZhbHVlMzIgPSBNRU1fUkRfT0ZGU0VUKHBEZXZpY2UsIFQzX05JQ19EQVRBX05JQ19DRkdfQUREUik7Ci0KLQkvKiBEZXRlcm1pbmUgUEhZIHR5cGUuICovCi0Jc3dpdGNoIChWYWx1ZTMyICYgVDNfTklDX0NGR19QSFlfVFlQRV9NQVNLKQotCXsKLQkgICAgY2FzZSBUM19OSUNfQ0ZHX1BIWV9UWVBFX0NPUFBFUjoKLQkJRWVQaHlUeXBlU2VyZGVzID0gRkFMU0U7Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgVDNfTklDX0NGR19QSFlfVFlQRV9GSUJFUjoKLQkJRWVQaHlUeXBlU2VyZGVzID0gVFJVRTsKLQkJYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkJRWVQaHlUeXBlU2VyZGVzID0gRkFMU0U7Ci0JCWJyZWFrOworCXBEZXZpY2UtPkJvbmRJZCA9IFJFR19SRCAocERldmljZSwgR3JjLk1pc2NDZmcpICYgR1JDX01JU0NfQkRfSURfTUFTSzsKKwlpZiAocERldmljZS0+Qm9uZElkICE9IEdSQ19NSVNDX0JEX0lEXzU3MDAgJiYKKwkgICAgcERldmljZS0+Qm9uZElkICE9IEdSQ19NSVNDX0JEX0lEXzU3MDEgJiYKKwkgICAgcERldmljZS0+Qm9uZElkICE9IEdSQ19NSVNDX0JEX0lEXzU3MDJGRSAmJgorCSAgICBwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwMyAmJgorCSAgICBwRGV2aWNlLT5Cb25kSWQgIT0gR1JDX01JU0NfQkRfSURfNTcwM1MgJiYKKwkgICAgcERldmljZS0+Qm9uZElkICE9IEdSQ19NSVNDX0JEX0lEXzU3MDQgJiYKKwkgICAgcERldmljZS0+Qm9uZElkICE9IEdSQ19NSVNDX0JEX0lEXzU3MDRDSU9CRSkgeworCQlyZXR1cm4gTE1fU1RBVFVTX1VOS05PV05fQURBUFRFUjsKIAl9CiAKLQkvKiBEZXRlcm1pbmUgUEhZIGxlZCBtb2RlLiAqLwotCWlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAotCSAgICBUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpCi0JewotCSAgICBzd2l0Y2goVmFsdWUzMiAmIFQzX05JQ19DRkdfTEVEX01PREVfTUFTSykKLQkgICAgewotCQljYXNlIFQzX05JQ19DRkdfTEVEX01PREVfVFJJUExFX1NQRUVEOgotCQkgICAgRWVQaHlMZWRNb2RlID0gTEVEX01PREVfVEhSRUVfTElOSzsKLQkJICAgIGJyZWFrOworCXBEZXZpY2UtPlNwbGl0TW9kZUVuYWJsZSA9IFNQTElUX01PREVfRElTQUJMRTsKKwlpZiAoKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDRfQTApICYmCisJICAgIChwRGV2aWNlLT5Cb25kSWQgPT0gR1JDX01JU0NfQkRfSURfNTcwNENJT0JFKSkgeworCQlwRGV2aWNlLT5TcGxpdE1vZGVFbmFibGUgPSBTUExJVF9NT0RFX0VOQUJMRTsKKwkJcERldmljZS0+U3BsaXRNb2RlTWF4UmVxID0gU1BMSVRfTU9ERV81NzA0X01BWF9SRVE7CisJfQogCi0JCWNhc2UgVDNfTklDX0NGR19MRURfTU9ERV9MSU5LX1NQRUVEOgotCQkgICAgRWVQaHlMZWRNb2RlID0gTEVEX01PREVfTElOSzEwOwotCQkgICAgYnJlYWs7CisJLyogR2V0IEVlcHJvbSBpbmZvLiAqLworCVZhbHVlMzIgPSBNRU1fUkRfT0ZGU0VUIChwRGV2aWNlLCBUM19OSUNfREFUQV9TSUdfQUREUik7CisJaWYgKFZhbHVlMzIgPT0gVDNfTklDX0RBVEFfU0lHKSB7CisJCUVlU2lnRm91bmQgPSBUUlVFOworCQlWYWx1ZTMyID0gTUVNX1JEX09GRlNFVCAocERldmljZSwgVDNfTklDX0RBVEFfTklDX0NGR19BRERSKTsKKworCQkvKiBEZXRlcm1pbmUgUEhZIHR5cGUuICovCisJCXN3aXRjaCAoVmFsdWUzMiAmIFQzX05JQ19DRkdfUEhZX1RZUEVfTUFTSykgeworCQljYXNlIFQzX05JQ19DRkdfUEhZX1RZUEVfQ09QUEVSOgorCQkJRWVQaHlUeXBlU2VyZGVzID0gRkFMU0U7CisJCQlicmVhazsKKworCQljYXNlIFQzX05JQ19DRkdfUEhZX1RZUEVfRklCRVI6CisJCQlFZVBoeVR5cGVTZXJkZXMgPSBUUlVFOworCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJICAgIEVlUGh5TGVkTW9kZSA9IExFRF9NT0RFX0FVVE87Ci0JCSAgICBicmVhazsKLQkgICAgfQotCX0KLQllbHNlCi0JewotCSAgICBzd2l0Y2goVmFsdWUzMiAmIFQzX05JQ19DRkdfTEVEX01PREVfTUFTSykKLQkgICAgewotCQljYXNlIFQzX05JQ19DRkdfTEVEX01PREVfT1BFTl9EUkFJTjoKLQkJICAgIEVlUGh5TGVkTW9kZSA9IExFRF9NT0RFX09QRU5fRFJBSU47Ci0JCSAgICBicmVhazsKKwkJCUVlUGh5VHlwZVNlcmRlcyA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KIAotCQljYXNlIFQzX05JQ19DRkdfTEVEX01PREVfT1VUUFVUOgotCQkgICAgRWVQaHlMZWRNb2RlID0gTEVEX01PREVfT1VUUFVUOwotCQkgICAgYnJlYWs7CisJCS8qIERldGVybWluZSBQSFkgbGVkIG1vZGUuICovCisJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8CisJCSAgICBUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKSB7CisJCQlzd2l0Y2ggKFZhbHVlMzIgJiBUM19OSUNfQ0ZHX0xFRF9NT0RFX01BU0spIHsKKwkJCWNhc2UgVDNfTklDX0NGR19MRURfTU9ERV9UUklQTEVfU1BFRUQ6CisJCQkJRWVQaHlMZWRNb2RlID0gTEVEX01PREVfVEhSRUVfTElOSzsKKwkJCQlicmVhazsKIAotCQlkZWZhdWx0OgotCQkgICAgRWVQaHlMZWRNb2RlID0gTEVEX01PREVfQVVUTzsKLQkJICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCWlmKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDNfQTEgfHwKLQkgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwM19BMikKLQl7Ci0JICAgIC8qIEVuYWJsZSBFRVBST00gd3JpdGUgcHJvdGVjdGlvbi4gKi8KLQkgICAgaWYoVmFsdWUzMiAmIFQzX05JQ19FRVBST01fV1ApCi0JICAgIHsKLQkJcERldmljZS0+RWVwcm9tV3AgPSBUUlVFOwotCSAgICB9CisJCQljYXNlIFQzX05JQ19DRkdfTEVEX01PREVfTElOS19TUEVFRDoKKwkJCQlFZVBoeUxlZE1vZGUgPSBMRURfTU9ERV9MSU5LMTA7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJRWVQaHlMZWRNb2RlID0gTEVEX01PREVfQVVUTzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoVmFsdWUzMiAmIFQzX05JQ19DRkdfTEVEX01PREVfTUFTSykgeworCQkJY2FzZSBUM19OSUNfQ0ZHX0xFRF9NT0RFX09QRU5fRFJBSU46CisJCQkJRWVQaHlMZWRNb2RlID0gTEVEX01PREVfT1BFTl9EUkFJTjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBUM19OSUNfQ0ZHX0xFRF9NT0RFX09VVFBVVDoKKwkJCQlFZVBoeUxlZE1vZGUgPSBMRURfTU9ERV9PVVRQVVQ7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJRWVQaHlMZWRNb2RlID0gTEVEX01PREVfQVVUTzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwM19BMSB8fAorCQkgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwM19BMikgeworCQkJLyogRW5hYmxlIEVFUFJPTSB3cml0ZSBwcm90ZWN0aW9uLiAqLworCQkJaWYgKFZhbHVlMzIgJiBUM19OSUNfRUVQUk9NX1dQKSB7CisJCQkJcERldmljZS0+RWVwcm9tV3AgPSBUUlVFOworCQkJfQorCQl9CisKKwkJLyogR2V0IHRoZSBQSFkgSWQuICovCisJCVZhbHVlMzIgPSBNRU1fUkRfT0ZGU0VUIChwRGV2aWNlLCBUM19OSUNfREFUQV9QSFlfSURfQUREUik7CisJCWlmIChWYWx1ZTMyKSB7CisJCQlFZVBoeUlkID0gKCgoVmFsdWUzMiAmIFQzX05JQ19QSFlfSUQxX01BU0spID4+IDE2KSAmCisJCQkJICAgUEhZX0lEMV9PVUlfTUFTSykgPDwgMTA7CisKKwkJCVZhbHVlMzIgPSBWYWx1ZTMyICYgVDNfTklDX1BIWV9JRDJfTUFTSzsKKworCQkJRWVQaHlJZCB8PSAoKFZhbHVlMzIgJiBQSFlfSUQyX09VSV9NQVNLKSA8PCAxNikgfAorCQkJICAgIChWYWx1ZTMyICYgUEhZX0lEMl9NT0RFTF9NQVNLKSB8IChWYWx1ZTMyICYKKwkJCQkJCQkgICAgICBQSFlfSUQyX1JFVl9NQVNLKTsKKwkJfSBlbHNlIHsKKwkJCUVlUGh5SWQgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJRWVTaWdGb3VuZCA9IEZBTFNFOwogCX0KIAotCS8qIEdldCB0aGUgUEhZIElkLiAqLwotCVZhbHVlMzIgPSBNRU1fUkRfT0ZGU0VUKHBEZXZpY2UsIFQzX05JQ19EQVRBX1BIWV9JRF9BRERSKTsKLQlpZiAoVmFsdWUzMikKLQl7Ci0JICAgIEVlUGh5SWQgPSAoKChWYWx1ZTMyICYgVDNfTklDX1BIWV9JRDFfTUFTSykgPj4gMTYpICYKLQkJUEhZX0lEMV9PVUlfTUFTSykgPDwgMTA7CisJLyogU2V0IHRoZSBQSFkgYWRkcmVzcy4gKi8KKwlwRGV2aWNlLT5QaHlBZGRyID0gUEhZX0RFVklDRV9JRDsKIAotCSAgICBWYWx1ZTMyID0gVmFsdWUzMiAmIFQzX05JQ19QSFlfSUQyX01BU0s7CisJLyogRGlzYWJsZSBhdXRvIHBvbGxpbmcuICovCisJcERldmljZS0+TWlNb2RlID0gMHhjMDAwMDsKKwlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTWlNb2RlLCBwRGV2aWNlLT5NaU1vZGUpOworCU1NX1dhaXQgKDQwKTsKIAotCSAgICBFZVBoeUlkIHw9ICgoVmFsdWUzMiAmIFBIWV9JRDJfT1VJX01BU0spIDw8IDE2KSB8Ci0JICAgICAgKFZhbHVlMzIgJiBQSFlfSUQyX01PREVMX01BU0spIHwgKFZhbHVlMzIgJiBQSFlfSUQyX1JFVl9NQVNLKTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgRWVQaHlJZCA9IDA7Ci0JfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotCUVlU2lnRm91bmQgPSBGQUxTRTsKLSAgICB9CisJLyogR2V0IHRoZSBQSFkgaWQuICovCisJTE1fUmVhZFBoeSAocERldmljZSwgUEhZX0lEMV9SRUcsICZWYWx1ZTMyKTsKKwlwRGV2aWNlLT5QaHlJZCA9IChWYWx1ZTMyICYgUEhZX0lEMV9PVUlfTUFTSykgPDwgMTA7CiAKLSAgICAvKiBTZXQgdGhlIFBIWSBhZGRyZXNzLiAqLwotICAgIHBEZXZpY2UtPlBoeUFkZHIgPSBQSFlfREVWSUNFX0lEOworCUxNX1JlYWRQaHkgKHBEZXZpY2UsIFBIWV9JRDJfUkVHLCAmVmFsdWUzMik7CisJcERldmljZS0+UGh5SWQgfD0gKChWYWx1ZTMyICYgUEhZX0lEMl9PVUlfTUFTSykgPDwgMTYpIHwKKwkgICAgKFZhbHVlMzIgJiBQSFlfSUQyX01PREVMX01BU0spIHwgKFZhbHVlMzIgJiBQSFlfSUQyX1JFVl9NQVNLKTsKIAotICAgIC8qIERpc2FibGUgYXV0byBwb2xsaW5nLiAqLwotICAgIHBEZXZpY2UtPk1pTW9kZSA9IDB4YzAwMDA7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWlNb2RlLCBwRGV2aWNlLT5NaU1vZGUpOwotICAgIE1NX1dhaXQoNDApOwotCi0gICAgLyogR2V0IHRoZSBQSFkgaWQuICovCi0gICAgTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfSUQxX1JFRywgJlZhbHVlMzIpOwotICAgIHBEZXZpY2UtPlBoeUlkID0gKFZhbHVlMzIgJiBQSFlfSUQxX09VSV9NQVNLKSA8PCAxMDsKLQotICAgIExNX1JlYWRQaHkocERldmljZSwgUEhZX0lEMl9SRUcsICZWYWx1ZTMyKTsKLSAgICBwRGV2aWNlLT5QaHlJZCB8PSAoKFZhbHVlMzIgJiBQSFlfSUQyX09VSV9NQVNLKSA8PCAxNikgfAotICAgICAgKFZhbHVlMzIgJiBQSFlfSUQyX01PREVMX01BU0spIHwgKFZhbHVlMzIgJiBQSFlfSUQyX1JFVl9NQVNLKTsKLQotICAgIC8qIFNldCB0aGUgRW5hYmxlVGJpIGZsYWcgdG8gZmFsc2UgaWYgd2UgaGF2ZSBhIGNvcHBlciBQSFkuICovCi0gICAgc3dpdGNoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spCi0gICAgeworCS8qIFNldCB0aGUgRW5hYmxlVGJpIGZsYWcgdG8gZmFsc2UgaWYgd2UgaGF2ZSBhIGNvcHBlciBQSFkuICovCisJc3dpdGNoIChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSB7CiAJY2FzZSBQSFlfQkNNNTQwMF9QSFlfSUQ6Ci0JICAgIHBEZXZpY2UtPkVuYWJsZVRiaSA9IEZBTFNFOwotCSAgICBicmVhazsKKwkJcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7CisJCWJyZWFrOwogCiAJY2FzZSBQSFlfQkNNNTQwMV9QSFlfSUQ6Ci0JICAgIHBEZXZpY2UtPkVuYWJsZVRiaSA9IEZBTFNFOwotCSAgICBicmVhazsKKwkJcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7CisJCWJyZWFrOwogCiAJY2FzZSBQSFlfQkNNNTQxMV9QSFlfSUQ6Ci0JICAgIHBEZXZpY2UtPkVuYWJsZVRiaSA9IEZBTFNFOwotCSAgICBicmVhazsKKwkJcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7CisJCWJyZWFrOwogCiAJY2FzZSBQSFlfQkNNNTcwMV9QSFlfSUQ6Ci0JICAgIHBEZXZpY2UtPkVuYWJsZVRiaSA9IEZBTFNFOwotCSAgICBicmVhazsKKwkJcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7CisJCWJyZWFrOwogCiAJY2FzZSBQSFlfQkNNNTcwM19QSFlfSUQ6Ci0JICAgIHBEZXZpY2UtPkVuYWJsZVRiaSA9IEZBTFNFOwotCSAgICBicmVhazsKKwkJcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7CisJCWJyZWFrOwogCiAJY2FzZSBQSFlfQkNNNTcwNF9QSFlfSUQ6Ci0JICAgIHBEZXZpY2UtPkVuYWJsZVRiaSA9IEZBTFNFOwotCSAgICBicmVhazsKKwkJcERldmljZS0+RW5hYmxlVGJpID0gRkFMU0U7CisJCWJyZWFrOwogCiAJY2FzZSBQSFlfQkNNODAwMl9QSFlfSUQ6Ci0JICAgIHBEZXZpY2UtPkVuYWJsZVRiaSA9IFRSVUU7Ci0JICAgIGJyZWFrOworCQlwRGV2aWNlLT5FbmFibGVUYmkgPSBUUlVFOworCQlicmVhazsKIAogCWRlZmF1bHQ6CiAKLQkgICAgaWYgKHBBZGFwdGVySW5mbykKLQkgICAgewotCQlwRGV2aWNlLT5QaHlJZCA9IHBBZGFwdGVySW5mby0+UGh5SWQ7Ci0JCXBEZXZpY2UtPkVuYWJsZVRiaSA9IHBBZGFwdGVySW5mby0+U2VyZGVzOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKEVlU2lnRm91bmQpCi0JICAgIHsKLQkJcERldmljZS0+UGh5SWQgPSBFZVBoeUlkOwotCQlwRGV2aWNlLT5FbmFibGVUYmkgPSBFZVBoeVR5cGVTZXJkZXM7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogQmFpbCBvdXQgaWYgd2UgZG9uJ3Qga25vdyB0aGUgY29wcGVyIFBIWSBpZC4gKi8KLSAgICBpZihVTktOT1dOX1BIWV9JRChwRGV2aWNlLT5QaHlJZCkgJiYgIXBEZXZpY2UtPkVuYWJsZVRiaSkKLSAgICB7Ci0JcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotICAgIH0KLQotICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMykKLSAgICB7Ci0JaWYoKHBEZXZpY2UtPlNhdmVkQ2FjaGVMaW5lUmVnICYgMHhmZjAwKSA8IDB4NDAwMCkKLQl7Ci0JICAgIHBEZXZpY2UtPlNhdmVkQ2FjaGVMaW5lUmVnICY9IDB4ZmZmZjAwZmY7Ci0JICAgIHBEZXZpY2UtPlNhdmVkQ2FjaGVMaW5lUmVnIHw9IDB4NDAwMDsKLQl9Ci0gICAgfQotICAgIC8qIENoYW5nZSBkcml2ZXIgcGFyYW1ldGVycy4gKi8KLSAgICBTdGF0dXMgPSBNTV9HZXRDb25maWcocERldmljZSk7Ci0gICAgaWYoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKQotICAgIHsKLQlyZXR1cm4gU3RhdHVzOwotICAgIH0KLQotI2lmIElOQ0xVREVfNTcwMV9BWF9GSVgKLSAgICBpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9BMCB8fAotCXBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQjApCi0gICAgewotCXBEZXZpY2UtPlJlc2V0UGh5T25Jbml0ID0gVFJVRTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgcGh5IGxpbmsgc3RhdHVzLiAqLwotICAgIGlmKCFwRGV2aWNlLT5FbmFibGVUYmkpCi0gICAgewotCUxNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKLQlMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7Ci0KLQkvKiBJZiB3ZSBkb24ndCBoYXZlIGxpbmsgcmVzZXQgdGhlIFBIWS4gKi8KLQlpZighKFZhbHVlMzIgJiBQSFlfU1RBVFVTX0xJTktfUEFTUykgfHwgcERldmljZS0+UmVzZXRQaHlPbkluaXQpCi0JewotCi0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgUEhZX0NUUkxfUEhZX1JFU0VUKTsKLQotCSAgICBmb3IoaiA9IDA7IGogPCAxMDA7IGorKykKLQkgICAgewotCQlNTV9XYWl0KDEwKTsKLQotCQlMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgJlZhbHVlMzIpOwotCQlpZihWYWx1ZTMyICYmICEoVmFsdWUzMiAmIFBIWV9DVFJMX1BIWV9SRVNFVCkpCi0JCXsKLQkJICAgIE1NX1dhaXQoNDApOwotCQkgICAgYnJlYWs7CisJCWlmIChwQWRhcHRlckluZm8pIHsKKwkJCXBEZXZpY2UtPlBoeUlkID0gcEFkYXB0ZXJJbmZvLT5QaHlJZDsKKwkJCXBEZXZpY2UtPkVuYWJsZVRiaSA9IHBBZGFwdGVySW5mby0+U2VyZGVzOworCQl9IGVsc2UgaWYgKEVlU2lnRm91bmQpIHsKKwkJCXBEZXZpY2UtPlBoeUlkID0gRWVQaHlJZDsKKwkJCXBEZXZpY2UtPkVuYWJsZVRiaSA9IEVlUGh5VHlwZVNlcmRlczsKIAkJfQotCSAgICB9CisJCWJyZWFrOworCX0KIAorCS8qIEJhaWwgb3V0IGlmIHdlIGRvbid0IGtub3cgdGhlIGNvcHBlciBQSFkgaWQuICovCisJaWYgKFVOS05PV05fUEhZX0lEIChwRGV2aWNlLT5QaHlJZCkgJiYgIXBEZXZpY2UtPkVuYWJsZVRiaSkgeworCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDMpIHsKKwkJaWYgKChwRGV2aWNlLT5TYXZlZENhY2hlTGluZVJlZyAmIDB4ZmYwMCkgPCAweDQwMDApIHsKKwkJCXBEZXZpY2UtPlNhdmVkQ2FjaGVMaW5lUmVnICY9IDB4ZmZmZjAwZmY7CisJCQlwRGV2aWNlLT5TYXZlZENhY2hlTGluZVJlZyB8PSAweDQwMDA7CisJCX0KKwl9CisJLyogQ2hhbmdlIGRyaXZlciBwYXJhbWV0ZXJzLiAqLworCVN0YXR1cyA9IE1NX0dldENvbmZpZyAocERldmljZSk7CisJaWYgKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCQlyZXR1cm4gU3RhdHVzOworCX0KKyNpZiBJTkNMVURFXzU3MDFfQVhfRklYCisJaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQTAgfHwKKwkgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMCkgeworCQlwRGV2aWNlLT5SZXNldFBoeU9uSW5pdCA9IFRSVUU7CisJfQorI2VuZGlmCisKKwkvKiBTYXZlIHRoZSBjdXJyZW50IHBoeSBsaW5rIHN0YXR1cy4gKi8KKwlpZiAoIXBEZXZpY2UtPkVuYWJsZVRiaSkgeworCQlMTV9SZWFkUGh5IChwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOworCQlMTV9SZWFkUGh5IChwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOworCisJCS8qIElmIHdlIGRvbid0IGhhdmUgbGluayByZXNldCB0aGUgUEhZLiAqLworCQlpZiAoIShWYWx1ZTMyICYgUEhZX1NUQVRVU19MSU5LX1BBU1MpCisJCSAgICB8fCBwRGV2aWNlLT5SZXNldFBoeU9uSW5pdCkgeworCisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgUEhZX0NUUkxfUkVHLCBQSFlfQ1RSTF9QSFlfUkVTRVQpOworCisJCQlmb3IgKGogPSAwOyBqIDwgMTAwOyBqKyspIHsKKwkJCQlNTV9XYWl0ICgxMCk7CisKKwkJCQlMTV9SZWFkUGh5IChwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsICZWYWx1ZTMyKTsKKwkJCQlpZiAoVmFsdWUzMiAmJiAhKFZhbHVlMzIgJiBQSFlfQ1RSTF9QSFlfUkVTRVQpKSB7CisJCQkJCU1NX1dhaXQgKDQwKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQogCiAjaWYgSU5DTFVERV81NzAxX0FYX0ZJWAotCSAgICAvKiA1NzAxX0FYX0JYIGJ1ZzogIG9ubHkgYWR2ZXJ0aXNlcyAxMG1iIHNwZWVkLiAqLwotCSAgICBpZihwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0EwIHx8Ci0JCXBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQjApCi0JICAgIHsKKwkJCS8qIDU3MDFfQVhfQlggYnVnOiAgb25seSBhZHZlcnRpc2VzIDEwbWIgc3BlZWQuICovCisJCQlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9BMCB8fAorCQkJICAgIHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQjApIHsKIAotCQlWYWx1ZTMyID0gUEhZX0FOX0FEX1BST1RPQ09MXzgwMl8zX0NTTUFfQ0QgfAotCQkgICAgUEhZX0FOX0FEXzEwQkFTRVRfSEFMRiB8IFBIWV9BTl9BRF8xMEJBU0VUX0ZVTEwgfAotCQkgICAgUEhZX0FOX0FEXzEwMEJBU0VUWF9GVUxMIHwgUEhZX0FOX0FEXzEwMEJBU0VUWF9IQUxGOwotCQlWYWx1ZTMyIHw9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MocERldmljZSk7Ci0JCUxNX1dyaXRlUGh5KHBEZXZpY2UsIFBIWV9BTl9BRF9SRUcsIFZhbHVlMzIpOwotCQlwRGV2aWNlLT5hZHZlcnRpc2luZyA9IFZhbHVlMzI7CisJCQkJVmFsdWUzMiA9IFBIWV9BTl9BRF9QUk9UT0NPTF84MDJfM19DU01BX0NEIHwKKwkJCQkgICAgUEhZX0FOX0FEXzEwQkFTRVRfSEFMRiB8CisJCQkJICAgIFBIWV9BTl9BRF8xMEJBU0VUX0ZVTEwgfAorCQkJCSAgICBQSFlfQU5fQURfMTAwQkFTRVRYX0ZVTEwgfAorCQkJCSAgICBQSFlfQU5fQURfMTAwQkFTRVRYX0hBTEY7CisJCQkJVmFsdWUzMiB8PSBHZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzIChwRGV2aWNlKTsKKwkJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgUEhZX0FOX0FEX1JFRywgVmFsdWUzMik7CisJCQkJcERldmljZS0+YWR2ZXJ0aXNpbmcgPSBWYWx1ZTMyOwogCi0JCVZhbHVlMzIgPSBCQ001NDBYX0FOX0FEXzEwMDBCQVNFVF9IQUxGIHwKLQkJICAgIEJDTTU0MFhfQU5fQURfMTAwMEJBU0VUX0ZVTEwgfCBCQ001NDBYX0NPTkZJR19BU19NQVNURVIgfAotCQkgICAgQkNNNTQwWF9FTkFCTEVfQ09ORklHX0FTX01BU1RFUjsKLQkJTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcsIFZhbHVlMzIpOwotCQlwRGV2aWNlLT5hZHZlcnRpc2luZzEwMDAgPSBWYWx1ZTMyOworCQkJCVZhbHVlMzIgPSBCQ001NDBYX0FOX0FEXzEwMDBCQVNFVF9IQUxGIHwKKwkJCQkgICAgQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfRlVMTCB8CisJCQkJICAgIEJDTTU0MFhfQ09ORklHX0FTX01BU1RFUiB8CisJCQkJICAgIEJDTTU0MFhfRU5BQkxFX0NPTkZJR19BU19NQVNURVI7CisJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsCisJCQkJCSAgICAgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcsCisJCQkJCSAgICAgVmFsdWUzMik7CisJCQkJcERldmljZS0+YWR2ZXJ0aXNpbmcxMDAwID0gVmFsdWUzMjsKIAotCQlMTV9Xcml0ZVBoeShwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsIFBIWV9DVFJMX0FVVE9fTkVHX0VOQUJMRSB8Ci0JCSAgICBQSFlfQ1RSTF9SRVNUQVJUX0FVVE9fTkVHKTsKLQkgICAgfQorCQkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsCisJCQkJCSAgICAgUEhZX0NUUkxfQVVUT19ORUdfRU5BQkxFIHwKKwkJCQkJICAgICBQSFlfQ1RSTF9SRVNUQVJUX0FVVE9fTkVHKTsKKwkJCX0KICNlbmRpZgotCSAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDMpCi0JICAgIHsKLQkJTE1fV3JpdGVQaHkocERldmljZSwgMHgxOCwgMHgwYzAwKTsKLQkJTE1fV3JpdGVQaHkocERldmljZSwgMHgxNywgMHgyMDFmKTsKLQkJTE1fV3JpdGVQaHkocERldmljZSwgMHgxNSwgMHgyYWFhKTsKLQkgICAgfQotCSAgICBpZihwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzA0X0EwKQotCSAgICB7Ci0JCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MWMsIDB4OGQ2OCk7Ci0JCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MWMsIDB4OGQ2OCk7Ci0JICAgIH0KLQkgICAgLyogRW5hYmxlIEV0aGVybmV0QFdpcmVTcGVlZC4gKi8KLQkgICAgaWYocERldmljZS0+RW5hYmxlV2lyZVNwZWVkKQotCSAgICB7Ci0JCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTgsIDB4NzAwNyk7Ci0JCUxNX1JlYWRQaHkocERldmljZSwgMHgxOCwgJlZhbHVlMzIpOwotCQlMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDE4LCBWYWx1ZTMyIHwgQklUXzE1IHwgQklUXzQpOwotCSAgICB9CisJCQlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0KKwkJCSAgICBUM19BU0lDX1JFVl81NzAzKSB7CisJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MTgsIDB4MGMwMCk7CisJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MTcsIDB4MjAxZik7CisJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MTUsIDB4MmFhYSk7CisJCQl9CisJCQlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwNF9BMCkgeworCQkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCAweDFjLCAweDhkNjgpOworCQkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCAweDFjLCAweDhkNjgpOworCQkJfQorCQkJLyogRW5hYmxlIEV0aGVybmV0QFdpcmVTcGVlZC4gKi8KKwkJCWlmIChwRGV2aWNlLT5FbmFibGVXaXJlU3BlZWQpIHsKKwkJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgMHgxOCwgMHg3MDA3KTsKKwkJCQlMTV9SZWFkUGh5IChwRGV2aWNlLCAweDE4LCAmVmFsdWUzMik7CisJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MTgsCisJCQkJCSAgICAgVmFsdWUzMiB8IEJJVF8xNSB8IEJJVF80KTsKKwkJCX0KKwkJfQogCX0KLSAgICB9CiAKLSAgICAvKiBUdXJuIG9mZiB0YXAgcG93ZXIgbWFuYWdlbWVudC4gKi8KLSAgICBpZigocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0JDTTU0MDFfUEhZX0lEKQotICAgIHsKLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDAxX0FVWF9DVFJMLCAweDBjMjApOwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDAwMTIpOwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MTgwNCk7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MDAxMyk7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgxMjA0KTsKLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywgMHg4MDA2KTsKLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDAxMzIpOwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDgwMDYpOwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MDIzMik7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MjAxZik7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgwYTIwKTsKKwkvKiBUdXJuIG9mZiB0YXAgcG93ZXIgbWFuYWdlbWVudC4gKi8KKwlpZiAoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spID09IFBIWV9CQ001NDAxX1BIWV9JRCkgeworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwMV9BVVhfQ1RSTCwgMHgwYzIwKTsKKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDAwMTIpOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgxODA0KTsKKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDAwMTMpOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgxMjA0KTsKKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDgwMDYpOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgwMTMyKTsKKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDgwMDYpOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgwMjMyKTsKKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDIwMWYpOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgwYTIwKTsKIAotCU1NX1dhaXQoNDApOwotICAgIH0KLQorCQlNTV9XYWl0ICg0MCk7CisJfQogI2lmIElOQ0xVREVfVEJJX1NVUFBPUlQKLSAgICBwRGV2aWNlLT5JZ25vcmVUYmlMaW5rQ2hhbmdlID0gRkFMU0U7CisJcERldmljZS0+SWdub3JlVGJpTGlua0NoYW5nZSA9IEZBTFNFOwogCi0gICAgaWYocERldmljZS0+RW5hYmxlVGJpKQotICAgIHsKLQlwRGV2aWNlLT5XYWtlVXBNb2RlQ2FwID0gTE1fV0FLRV9VUF9NT0RFX05PTkU7Ci0JcERldmljZS0+UGh5SW50TW9kZSA9IFQzX1BIWV9JTlRfTU9ERV9MSU5LX1JFQURZOwotCWlmICgocERldmljZS0+UG9sbFRiaUxpbmsgPT0gQkFEX0RFRkFVTFRfVkFMVUUpIHx8Ci0JICAgIHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnKQotCXsKLQkgICAgcERldmljZS0+UG9sbFRiaUxpbmsgPSBGQUxTRTsKKwlpZiAocERldmljZS0+RW5hYmxlVGJpKSB7CisJCXBEZXZpY2UtPldha2VVcE1vZGVDYXAgPSBMTV9XQUtFX1VQX01PREVfTk9ORTsKKwkJcERldmljZS0+UGh5SW50TW9kZSA9IFQzX1BIWV9JTlRfTU9ERV9MSU5LX1JFQURZOworCQlpZiAoKHBEZXZpY2UtPlBvbGxUYmlMaW5rID09IEJBRF9ERUZBVUxUX1ZBTFVFKSB8fAorCQkgICAgcERldmljZS0+RGlzYWJsZUF1dG9OZWcpIHsKKwkJCXBEZXZpY2UtPlBvbGxUYmlMaW5rID0gRkFMU0U7CisJCX0KKwl9IGVsc2UgeworCQlwRGV2aWNlLT5Qb2xsVGJpTGluayA9IEZBTFNFOwogCX0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlwRGV2aWNlLT5Qb2xsVGJpTGluayA9IEZBTFNFOwotICAgIH0KLSNlbmRpZiAvKiBJTkNMVURFX1RCSV9TVVBQT1JUICovCisjZW5kaWYJCQkJLyogSU5DTFVERV9UQklfU1VQUE9SVCAqLwogCi0gICAgLyogVXNlVGFnZ2VkU3RhdHVzIGlzIG9ubHkgdmFsaWQgZm9yIDU3MDEgYW5kIGxhdGVyLiAqLwotICAgIGlmIChUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApCi0gICAgewotCXBEZXZpY2UtPlVzZVRhZ2dlZFN0YXR1cyA9IEZBTFNFOworCS8qIFVzZVRhZ2dlZFN0YXR1cyBpcyBvbmx5IHZhbGlkIGZvciA1NzAxIGFuZCBsYXRlci4gKi8KKwlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkgeworCQlwRGV2aWNlLT5Vc2VUYWdnZWRTdGF0dXMgPSBGQUxTRTsKIAotCXBEZXZpY2UtPkNvYWxlc2NlTW9kZSA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JcERldmljZS0+Q29hbGVzY2VNb2RlID0gSE9TVF9DT0FMRVNDRV9DTEVBUl9USUNLU19PTl9SWF9CRF9FVkVOVCB8Ci0JICAgIEhPU1RfQ09BTEVTQ0VfQ0xFQVJfVElDS1NfT05fVFhfQkRfRVZFTlQ7Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBzdGF0dXMgYmxvY2sgc2l6ZS4gKi8KLSAgICBpZihUM19DSElQX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0NISVBfUkVWXzU3MDBfQVggJiYKLQlUM19DSElQX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0NISVBfUkVWXzU3MDBfQlgpCi0gICAgewotCXBEZXZpY2UtPkNvYWxlc2NlTW9kZSB8PSBIT1NUX0NPQUxFU0NFXzMyX0JZVEVfU1RBVFVTX01PREU7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgdGhlIERVUklOR19JTlQgY29hbGVzY2luZyB0aWNrcyBwYXJhbWV0ZXJzLiAqLwotICAgIGlmKHBEZXZpY2UtPlVzZVRhZ2dlZFN0YXR1cykKLSAgICB7Ci0JaWYocERldmljZS0+UnhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPT0gQkFEX0RFRkFVTFRfVkFMVUUpCi0JewotCSAgICBwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9Ci0JCURFRkFVTFRfUlhfQ09BTEVTQ0lOR19USUNLU19EVVJJTkdfSU5UOworCQlwRGV2aWNlLT5Db2FsZXNjZU1vZGUgPSAwOworCX0gZWxzZSB7CisJCXBEZXZpY2UtPkNvYWxlc2NlTW9kZSA9CisJCSAgICBIT1NUX0NPQUxFU0NFX0NMRUFSX1RJQ0tTX09OX1JYX0JEX0VWRU5UIHwKKwkJICAgIEhPU1RfQ09BTEVTQ0VfQ0xFQVJfVElDS1NfT05fVFhfQkRfRVZFTlQ7CiAJfQogCi0JaWYocERldmljZS0+VHhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPT0gQkFEX0RFRkFVTFRfVkFMVUUpCi0JewotCSAgICBwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9Ci0JCURFRkFVTFRfVFhfQ09BTEVTQ0lOR19USUNLU19EVVJJTkdfSU5UOworCS8qIFNldCB0aGUgc3RhdHVzIGJsb2NrIHNpemUuICovCisJaWYgKFQzX0NISVBfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0NISVBfUkVWXzU3MDBfQVggJiYKKwkgICAgVDNfQ0hJUF9SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQ0hJUF9SRVZfNTcwMF9CWCkgeworCQlwRGV2aWNlLT5Db2FsZXNjZU1vZGUgfD0gSE9TVF9DT0FMRVNDRV8zMl9CWVRFX1NUQVRVU19NT0RFOwogCX0KIAotCWlmKHBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID09IEJBRF9ERUZBVUxUX1ZBTFVFKQotCXsKLQkgICAgcERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPQotCQlERUZBVUxUX1JYX01BWF9DT0FMRVNDRURfRlJBTUVTX0RVUklOR19JTlQ7Ci0JfQorCS8qIENoZWNrIHRoZSBEVVJJTkdfSU5UIGNvYWxlc2NpbmcgdGlja3MgcGFyYW1ldGVycy4gKi8KKwlpZiAocERldmljZS0+VXNlVGFnZ2VkU3RhdHVzKSB7CisJCWlmIChwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkgeworCQkJcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPQorCQkJICAgIERFRkFVTFRfUlhfQ09BTEVTQ0lOR19USUNLU19EVVJJTkdfSU5UOworCQl9CiAKLQlpZihwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkKLQl7Ci0JICAgIHBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID0KLQkJREVGQVVMVF9UWF9NQVhfQ09BTEVTQ0VEX0ZSQU1FU19EVVJJTkdfSU5UOwotCX0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlpZihwRGV2aWNlLT5SeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkKLQl7Ci0JICAgIHBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID0gMDsKLQl9CisJCWlmIChwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkgeworCQkJcERldmljZS0+VHhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPQorCQkJICAgIERFRkFVTFRfVFhfQ09BTEVTQ0lOR19USUNLU19EVVJJTkdfSU5UOworCQl9CiAKLQlpZihwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkKLQl7Ci0JICAgIHBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID0gMDsKLQl9CisJCWlmIChwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkgeworCQkJcERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPQorCQkJICAgIERFRkFVTFRfUlhfTUFYX0NPQUxFU0NFRF9GUkFNRVNfRFVSSU5HX0lOVDsKKwkJfQogCi0JaWYocERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPT0gQkFEX0RFRkFVTFRfVkFMVUUpCi0JewotCSAgICBwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9IDA7Ci0JfQorCQlpZiAocERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPT0gQkFEX0RFRkFVTFRfVkFMVUUpIHsKKwkJCXBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID0KKwkJCSAgICBERUZBVUxUX1RYX01BWF9DT0FMRVNDRURfRlJBTUVTX0RVUklOR19JTlQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocERldmljZS0+UnhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPT0gQkFEX0RFRkFVTFRfVkFMVUUpIHsKKwkJCXBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50ID0gMDsKKwkJfQogCi0JaWYocERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPT0gQkFEX0RFRkFVTFRfVkFMVUUpCi0JewotCSAgICBwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9IDA7CisJCWlmIChwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludCA9PSBCQURfREVGQVVMVF9WQUxVRSkgeworCQkJcERldmljZS0+VHhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQgPSAwOworCQl9CisKKwkJaWYgKHBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID09IEJBRF9ERUZBVUxUX1ZBTFVFKSB7CisJCQlwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCA9IDA7CisJCX0KKworCQlpZiAocERldmljZS0+VHhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQgPT0gQkFEX0RFRkFVTFRfVkFMVUUpIHsKKwkJCXBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50ID0gMDsKKwkJfQogCX0KLSAgICB9CiAKICNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCi0gICAgaWYocERldmljZS0+UnhNdHUgPD0gKE1BWF9TVERfUkNWX0JVRkZFUl9TSVpFIC0gOCAvKiBDUkMgKi8pKQotICAgIHsKLQlwRGV2aWNlLT5SeEp1bWJvRGVzY0NudCA9IDA7Ci0JaWYocERldmljZS0+UnhNdHUgPD0gTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFX05PX0NSQykKLQl7Ci0JICAgIHBEZXZpY2UtPlJ4TXR1ID0gTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFX05PX0NSQzsKLQl9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JcERldmljZS0+UnhKdW1ib0J1ZmZlclNpemUgPSAocERldmljZS0+UnhNdHUgKyA4IC8qIENSQyArIFZMQU4gKi8gKwotCSAgICBDT01NT05fQ0FDSEVfTElORV9TSVpFLTEpICYgfkNPTU1PTl9DQUNIRV9MSU5FX01BU0s7CisJaWYgKHBEZXZpY2UtPlJ4TXR1IDw9IChNQVhfU1REX1JDVl9CVUZGRVJfU0laRSAtIDggLyogQ1JDICovICkpIHsKKwkJcERldmljZS0+UnhKdW1ib0Rlc2NDbnQgPSAwOworCQlpZiAocERldmljZS0+UnhNdHUgPD0gTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFX05PX0NSQykgeworCQkJcERldmljZS0+UnhNdHUgPSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkVfTk9fQ1JDOworCQl9CisJfSBlbHNlIHsKKwkJcERldmljZS0+UnhKdW1ib0J1ZmZlclNpemUgPQorCQkgICAgKHBEZXZpY2UtPlJ4TXR1ICsgOCAvKiBDUkMgKyBWTEFOICovICArCisJCSAgICAgQ09NTU9OX0NBQ0hFX0xJTkVfU0laRSAtIDEpICYgfkNPTU1PTl9DQUNIRV9MSU5FX01BU0s7CiAKLQlpZihwRGV2aWNlLT5SeEp1bWJvQnVmZmVyU2l6ZSA+IE1BWF9KVU1CT19SQ1ZfQlVGRkVSX1NJWkUpCi0JewotCSAgICBwRGV2aWNlLT5SeEp1bWJvQnVmZmVyU2l6ZSA9IERFRkFVTFRfSlVNQk9fUkNWX0JVRkZFUl9TSVpFOwotCSAgICBwRGV2aWNlLT5SeE10dSA9IHBEZXZpY2UtPlJ4SnVtYm9CdWZmZXJTaXplIC0gOCAvKiBDUkMgKyBWTEFOICovOwotCX0KLQlwRGV2aWNlLT5UeE10dSA9IHBEZXZpY2UtPlJ4TXR1OworCQlpZiAocERldmljZS0+UnhKdW1ib0J1ZmZlclNpemUgPiBNQVhfSlVNQk9fUkNWX0JVRkZFUl9TSVpFKSB7CisJCQlwRGV2aWNlLT5SeEp1bWJvQnVmZmVyU2l6ZSA9CisJCQkgICAgREVGQVVMVF9KVU1CT19SQ1ZfQlVGRkVSX1NJWkU7CisJCQlwRGV2aWNlLT5SeE10dSA9CisJCQkgICAgcERldmljZS0+UnhKdW1ib0J1ZmZlclNpemUgLSA4IC8qIENSQyArIFZMQU4gKi8gOworCQl9CisJCXBEZXZpY2UtPlR4TXR1ID0gcERldmljZS0+UnhNdHU7CiAKLSAgICB9CisJfQogI2Vsc2UKLSAgICBwRGV2aWNlLT5SeE10dSA9IE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRV9OT19DUkM7Ci0jZW5kaWYgLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLworCXBEZXZpY2UtPlJ4TXR1ID0gTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFX05PX0NSQzsKKyNlbmRpZgkJCQkvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCiAKLSAgICBwRGV2aWNlLT5SeFBhY2tldERlc2NDbnQgPQorCXBEZXZpY2UtPlJ4UGFja2V0RGVzY0NudCA9CiAjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAotCXBEZXZpY2UtPlJ4SnVtYm9EZXNjQ250ICsKLSNlbmRpZiAvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCi0JcERldmljZS0+UnhTdGREZXNjQ250OworCSAgICBwRGV2aWNlLT5SeEp1bWJvRGVzY0NudCArCisjZW5kaWYJCQkJLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLworCSAgICBwRGV2aWNlLT5SeFN0ZERlc2NDbnQ7CiAKLSAgICBpZihwRGV2aWNlLT5UeE10dSA8IE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRV9OT19DUkMpCi0gICAgewotCXBEZXZpY2UtPlR4TXR1ID0gTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFX05PX0NSQzsKLSAgICB9Ci0KLSAgICBpZihwRGV2aWNlLT5UeE10dSA+IE1BWF9KVU1CT19UWF9CVUZGRVJfU0laRSkKLSAgICB7Ci0JcERldmljZS0+VHhNdHUgPSBNQVhfSlVNQk9fVFhfQlVGRkVSX1NJWkU7Ci0gICAgfQotCi0gICAgLyogQ29uZmlndXJlIHRoZSBwcm9wZXIgd2F5cyB0byBnZXQgbGluayBjaGFuZ2UgaW50ZXJydXB0LiAqLwotICAgIGlmKHBEZXZpY2UtPlBoeUludE1vZGUgPT0gVDNfUEhZX0lOVF9NT0RFX0FVVE8pCi0gICAgewotCWlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkKLQl7Ci0JICAgIHBEZXZpY2UtPlBoeUludE1vZGUgPSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUOworCWlmIChwRGV2aWNlLT5UeE10dSA8IE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRV9OT19DUkMpIHsKKwkJcERldmljZS0+VHhNdHUgPSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkVfTk9fQ1JDOwogCX0KLQllbHNlCi0JewotCSAgICBwRGV2aWNlLT5QaHlJbnRNb2RlID0gVDNfUEhZX0lOVF9NT0RFX0xJTktfUkVBRFk7Ci0JfQotICAgIH0KLSAgICBlbHNlIGlmKHBEZXZpY2UtPlBoeUludE1vZGUgPT0gVDNfUEhZX0lOVF9NT0RFX0FVVE9fUE9MTElORykKLSAgICB7Ci0JLyogQXV0by1wb2xsaW5nIGRvZXMgbm90IHdvcmsgb24gNTcwMF9BWCBhbmQgNTcwMF9CWC4gKi8KLQlpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApCi0JewotCSAgICBwRGV2aWNlLT5QaHlJbnRNb2RlID0gVDNfUEhZX0lOVF9NT0RFX01JX0lOVEVSUlVQVDsKLQl9Ci0gICAgfQogCi0gICAgLyogRGV0ZXJtaW5lIHRoZSBtZXRob2QgdG8gZ2V0IGxpbmsgY2hhbmdlIHN0YXR1cy4gKi8KLSAgICBpZihwRGV2aWNlLT5MaW5rQ2huZ01vZGUgPT0gVDNfTElOS19DSE5HX01PREVfQVVUTykKLSAgICB7Ci0JLyogVGhlIGxpbmsgc3RhdHVzIGJpdCBpbiB0aGUgc3RhdHVzIGJsb2NrIGRvZXMgbm90IHdvcmsgb24gNTcwMF9BWCAqLwotCS8qIGFuZCA1NzAwX0JYIGNoaXBzLiAqLwotCWlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkKLQl7Ci0JICAgIHBEZXZpY2UtPkxpbmtDaG5nTW9kZSA9IFQzX0xJTktfQ0hOR19NT0RFX1VTRV9TVEFUVVNfUkVHOworCWlmIChwRGV2aWNlLT5UeE10dSA+IE1BWF9KVU1CT19UWF9CVUZGRVJfU0laRSkgeworCQlwRGV2aWNlLT5UeE10dSA9IE1BWF9KVU1CT19UWF9CVUZGRVJfU0laRTsKIAl9Ci0JZWxzZQotCXsKLQkgICAgcERldmljZS0+TGlua0NobmdNb2RlID0gVDNfTElOS19DSE5HX01PREVfVVNFX1NUQVRVU19CTE9DSzsKLQl9Ci0gICAgfQogCi0gICAgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUIHx8Ci0JVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKQotICAgIHsKLQlwRGV2aWNlLT5MaW5rQ2huZ01vZGUgPSBUM19MSU5LX0NITkdfTU9ERV9VU0VfU1RBVFVTX1JFRzsKLSAgICB9Ci0KLSAgICAvKiBDb25maWd1cmUgUEhZIGxlZCBtb2RlLiAqLwotICAgIGlmKHBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfQVVUTykKLSAgICB7Ci0JaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8Ci0JICAgIFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkKLQl7Ci0JICAgIGlmKHBEZXZpY2UtPlN1YnN5c3RlbVZlbmRvcklkID09IFQzX1NWSURfREVMTCkKLQkgICAgewotCQlwRGV2aWNlLT5MZWRNb2RlID0gTEVEX01PREVfTElOSzEwOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQlwRGV2aWNlLT5MZWRNb2RlID0gTEVEX01PREVfVEhSRUVfTElOSzsKLQotCQlpZihFZVNpZ0ZvdW5kICYmIEVlUGh5TGVkTW9kZSAhPSBMRURfTU9ERV9BVVRPKQotCQl7Ci0JCSAgICBwRGV2aWNlLT5MZWRNb2RlID0gRWVQaHlMZWRNb2RlOworCS8qIENvbmZpZ3VyZSB0aGUgcHJvcGVyIHdheXMgdG8gZ2V0IGxpbmsgY2hhbmdlIGludGVycnVwdC4gKi8KKwlpZiAocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUTykgeworCQlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkgeworCQkJcERldmljZS0+UGh5SW50TW9kZSA9IFQzX1BIWV9JTlRfTU9ERV9NSV9JTlRFUlJVUFQ7CisJCX0gZWxzZSB7CisJCQlwRGV2aWNlLT5QaHlJbnRNb2RlID0gVDNfUEhZX0lOVF9NT0RFX0xJTktfUkVBRFk7CiAJCX0KLQkgICAgfQorCX0gZWxzZSBpZiAocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUT19QT0xMSU5HKSB7CisJCS8qIEF1dG8tcG9sbGluZyBkb2VzIG5vdCB3b3JrIG9uIDU3MDBfQVggYW5kIDU3MDBfQlguICovCisJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKSB7CisJCQlwRGV2aWNlLT5QaHlJbnRNb2RlID0gVDNfUEhZX0lOVF9NT0RFX01JX0lOVEVSUlVQVDsKKwkJfQorCX0KIAotCSAgICAvKiBidWc/IDU3MDEgaW4gTElOSzEwIG1vZGUgZG9lcyBub3Qgc2VlbSB0byB3b3JrIHdoZW4gKi8KLQkgICAgLyogUGh5SW50TW9kZSBpcyBMSU5LX1JFQURZLiAqLwotCSAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0FTSUNfUkVWXzU3MDAgJiYKLSNpZiBJTkNMVURFX1RCSV9TVVBQT1JUCi0JCXBEZXZpY2UtPkVuYWJsZVRiaSA9PSBGQUxTRSAmJgotI2VuZGlmCi0JCXBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfTElOSzEwKQotCSAgICB7Ci0JCXBEZXZpY2UtPlBoeUludE1vZGUgPSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUOworCS8qIERldGVybWluZSB0aGUgbWV0aG9kIHRvIGdldCBsaW5rIGNoYW5nZSBzdGF0dXMuICovCisJaWYgKHBEZXZpY2UtPkxpbmtDaG5nTW9kZSA9PSBUM19MSU5LX0NITkdfTU9ERV9BVVRPKSB7CisJCS8qIFRoZSBsaW5rIHN0YXR1cyBiaXQgaW4gdGhlIHN0YXR1cyBibG9jayBkb2VzIG5vdCB3b3JrIG9uIDU3MDBfQVggKi8KKwkJLyogYW5kIDU3MDBfQlggY2hpcHMuICovCisJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKSB7CisJCQlwRGV2aWNlLT5MaW5rQ2huZ01vZGUgPQorCQkJICAgIFQzX0xJTktfQ0hOR19NT0RFX1VTRV9TVEFUVVNfUkVHOworCQl9IGVsc2UgeworCQkJcERldmljZS0+TGlua0NobmdNb2RlID0KKwkJCSAgICBUM19MSU5LX0NITkdfTU9ERV9VU0VfU1RBVFVTX0JMT0NLOworCQl9CisJfQorCisJaWYgKHBEZXZpY2UtPlBoeUludE1vZGUgPT0gVDNfUEhZX0lOVF9NT0RFX01JX0lOVEVSUlVQVCB8fAorCSAgICBUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKSB7CiAJCXBEZXZpY2UtPkxpbmtDaG5nTW9kZSA9IFQzX0xJTktfQ0hOR19NT0RFX1VTRV9TVEFUVVNfUkVHOwotCSAgICB9Ci0KLQkgICAgaWYocERldmljZS0+RW5hYmxlVGJpKQotCSAgICB7Ci0JCXBEZXZpY2UtPkxlZE1vZGUgPSBMRURfTU9ERV9USFJFRV9MSU5LOwotCSAgICB9CiAJfQotCWVsc2UKLQl7Ci0JICAgIGlmKEVlU2lnRm91bmQgJiYgRWVQaHlMZWRNb2RlICE9IExFRF9NT0RFX0FVVE8pCi0JICAgIHsKLQkJcERldmljZS0+TGVkTW9kZSA9IEVlUGh5TGVkTW9kZTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJcERldmljZS0+TGVkTW9kZSA9IExFRF9NT0RFX09QRU5fRFJBSU47Ci0JICAgIH0KKworCS8qIENvbmZpZ3VyZSBQSFkgbGVkIG1vZGUuICovCisJaWYgKHBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfQVVUTykgeworCQlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAorCQkgICAgVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkgeworCQkJaWYgKHBEZXZpY2UtPlN1YnN5c3RlbVZlbmRvcklkID09IFQzX1NWSURfREVMTCkgeworCQkJCXBEZXZpY2UtPkxlZE1vZGUgPSBMRURfTU9ERV9MSU5LMTA7CisJCQl9IGVsc2UgeworCQkJCXBEZXZpY2UtPkxlZE1vZGUgPSBMRURfTU9ERV9USFJFRV9MSU5LOworCisJCQkJaWYgKEVlU2lnRm91bmQgJiYgRWVQaHlMZWRNb2RlICE9IExFRF9NT0RFX0FVVE8pIHsKKwkJCQkJcERldmljZS0+TGVkTW9kZSA9IEVlUGh5TGVkTW9kZTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIGJ1Zz8gNTcwMSBpbiBMSU5LMTAgbW9kZSBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgd2hlbiAqLworCQkJLyogUGh5SW50TW9kZSBpcyBMSU5LX1JFQURZLiAqLworCQkJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0FTSUNfUkVWXzU3MDAKKwkJCSAgICAmJgorI2lmIElOQ0xVREVfVEJJX1NVUFBPUlQKKwkJCSAgICBwRGV2aWNlLT5FbmFibGVUYmkgPT0gRkFMU0UgJiYKKyNlbmRpZgorCQkJICAgIHBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfTElOSzEwKSB7CisJCQkJcERldmljZS0+UGh5SW50TW9kZSA9CisJCQkJICAgIFQzX1BIWV9JTlRfTU9ERV9NSV9JTlRFUlJVUFQ7CisJCQkJcERldmljZS0+TGlua0NobmdNb2RlID0KKwkJCQkgICAgVDNfTElOS19DSE5HX01PREVfVVNFX1NUQVRVU19SRUc7CisJCQl9CisKKwkJCWlmIChwRGV2aWNlLT5FbmFibGVUYmkpIHsKKwkJCQlwRGV2aWNlLT5MZWRNb2RlID0gTEVEX01PREVfVEhSRUVfTElOSzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChFZVNpZ0ZvdW5kICYmIEVlUGh5TGVkTW9kZSAhPSBMRURfTU9ERV9BVVRPKSB7CisJCQkJcERldmljZS0+TGVkTW9kZSA9IEVlUGh5TGVkTW9kZTsKKwkJCX0gZWxzZSB7CisJCQkJcERldmljZS0+TGVkTW9kZSA9IExFRF9NT0RFX09QRU5fRFJBSU47CisJCQl9CisJCX0KIAl9Ci0gICAgfQogCi0gICAgLyogRW5hYmxlIE9uZURtYUF0T25jZS4gKi8KLSAgICBpZihwRGV2aWNlLT5PbmVEbWFBdE9uY2UgPT0gQkFEX0RFRkFVTFRfVkFMVUUpCi0gICAgewotCXBEZXZpY2UtPk9uZURtYUF0T25jZSA9IEZBTFNFOwotICAgIH0KKwkvKiBFbmFibGUgT25lRG1hQXRPbmNlLiAqLworCWlmIChwRGV2aWNlLT5PbmVEbWFBdE9uY2UgPT0gQkFEX0RFRkFVTFRfVkFMVUUpIHsKKwkJcERldmljZS0+T25lRG1hQXRPbmNlID0gRkFMU0U7CisJfQogCi0gICAgaWYgKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAotCXBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQTAgfHwKLQlwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0IwIHx8Ci0JcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMikKLSAgICB7Ci0JcERldmljZS0+V29sU3BlZWQgPSBXT0xfU1BFRURfMTBNQjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlwRGV2aWNlLT5Xb2xTcGVlZCA9IFdPTF9TUEVFRF8xMDBNQjsKLSAgICB9CisJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKKwkgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9BMCB8fAorCSAgICBwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0IwIHx8CisJICAgIHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQjIpIHsKKwkJcERldmljZS0+V29sU3BlZWQgPSBXT0xfU1BFRURfMTBNQjsKKwl9IGVsc2UgeworCQlwRGV2aWNlLT5Xb2xTcGVlZCA9IFdPTF9TUEVFRF8xMDBNQjsKKwl9CiAKLSAgICAvKiBPZmZsb2FkaW5ncy4gKi8KLSAgICBwRGV2aWNlLT5UYXNrVG9PZmZsb2FkID0gTE1fVEFTS19PRkZMT0FEX05PTkU7CisJLyogT2ZmbG9hZGluZ3MuICovCisJcERldmljZS0+VGFza1RvT2ZmbG9hZCA9IExNX1RBU0tfT0ZGTE9BRF9OT05FOwogCi0gICAgLyogVHVybiBvZmYgdGFzayBvZmZsb2FkaW5nIG9uIEF4LiAqLwotICAgIGlmKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDBfQjApCi0gICAgewotCXBEZXZpY2UtPlRhc2tPZmZsb2FkQ2FwICY9IH4oTE1fVEFTS19PRkZMT0FEX1RYX1RDUF9DSEVDS1NVTSB8Ci0JICAgIExNX1RBU0tfT0ZGTE9BRF9UWF9VRFBfQ0hFQ0tTVU0pOwotICAgIH0KLSAgICBwRGV2aWNlLT5QY2lTdGF0ZSA9IFJFR19SRChwRGV2aWNlLCBQY2lDZmcuUGNpU3RhdGUpOwotICAgIExNX1JlYWRWUEQocERldmljZSk7Ci0gICAgTE1fUmVhZEJvb3RDb2RlVmVyc2lvbihwRGV2aWNlKTsKLSAgICBMTV9HZXRCdXNTcGVlZChwRGV2aWNlKTsKKwkvKiBUdXJuIG9mZiB0YXNrIG9mZmxvYWRpbmcgb24gQXguICovCisJaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDBfQjApIHsKKwkJcERldmljZS0+VGFza09mZmxvYWRDYXAgJj0gfihMTV9UQVNLX09GRkxPQURfVFhfVENQX0NIRUNLU1VNIHwKKwkJCQkJICAgICBMTV9UQVNLX09GRkxPQURfVFhfVURQX0NIRUNLU1VNKTsKKwl9CisJcERldmljZS0+UGNpU3RhdGUgPSBSRUdfUkQgKHBEZXZpY2UsIFBjaUNmZy5QY2lTdGF0ZSk7CisJTE1fUmVhZFZQRCAocERldmljZSk7CisJTE1fUmVhZEJvb3RDb2RlVmVyc2lvbiAocERldmljZSk7CisJTE1fR2V0QnVzU3BlZWQgKHBEZXZpY2UpOwogCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotfSAvKiBMTV9HZXRBZGFwdGVySW5mbyAqLworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30JCQkJLyogTE1fR2V0QWRhcHRlckluZm8gKi8KIAotU1RBVElDIFBMTV9BREFQVEVSX0lORk8KLUxNX0dldEFkYXB0ZXJJbmZvQnlTc2lkKAotICAgIExNX1VJTlQxNiBTdmlkLAotICAgIExNX1VJTlQxNiBTc2lkKQorU1RBVElDIFBMTV9BREFQVEVSX0lORk8gTE1fR2V0QWRhcHRlckluZm9CeVNzaWQgKExNX1VJTlQxNiBTdmlkLCBMTV9VSU5UMTYgU3NpZCkKIHsKLSAgICBzdGF0aWMgTE1fQURBUFRFUl9JTkZPIEFkYXB0ZXJBcnJbXSA9Ci0gICAgewotCXsgVDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMEE2LCBQSFlfQkNNNTQwMV9QSFlfSUQsIDB9LAotCXsgVDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMUE1LCBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAotCXsgVDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMFQ2LCBQSFlfQkNNODAwMl9QSFlfSUQsIDF9LAotCXsgVDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMEE5LCAwLCAxIH0sCi0JeyBUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAxVDEsIFBIWV9CQ001NzAxX1BIWV9JRCwgMH0sCi0JeyBUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAxVDgsIFBIWV9CQ001NzAxX1BIWV9JRCwgMH0sCi0JeyBUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAxQTcsIDAsIDF9LAotCXsgVDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMUExMCwgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKLQl7IFQzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDFBMTIsIFBIWV9CQ001NzAxX1BIWV9JRCwgMH0sCi0JeyBUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAzQXgxLCBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAotCXsgVDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwM0F4MiwgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKKwlzdGF0aWMgTE1fQURBUFRFUl9JTkZPIEFkYXB0ZXJBcnJbXSA9IHsKKwkJe1QzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDBBNiwKKwkJIFBIWV9CQ001NDAxX1BIWV9JRCwgMH0sCisJCXtUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAxQTUsCisJCSBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAorCQl7VDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMFQ2LAorCQkgUEhZX0JDTTgwMDJfUEhZX0lELCAxfSwKKwkJe1QzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDBBOSwgMCwgMX0sCisJCXtUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAxVDEsCisJCSBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAorCQl7VDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMVQ4LAorCQkgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKKwkJe1QzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDFBNywgMCwgMX0sCisJCXtUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAxQTEwLAorCQkgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKKwkJe1QzX1NWSURfQlJPQURDT00sIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDFBMTIsCisJCSBQSFlfQkNNNTcwMV9QSFlfSUQsIDB9LAorCQl7VDNfU1ZJRF9CUk9BRENPTSwgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwM0F4MSwKKwkJIFBIWV9CQ001NzAxX1BIWV9JRCwgMH0sCisJCXtUM19TVklEX0JST0FEQ09NLCBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAzQXgyLAorCQkgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKIAotCXsgVDNfU1ZJRF8zQ09NLCBUM19TU0lEXzNDT01fM0M5OTZULCBQSFlfQkNNNTQwMV9QSFlfSUQsIDAgfSwKLQl7IFQzX1NWSURfM0NPTSwgVDNfU1NJRF8zQ09NXzNDOTk2QlQsIFBIWV9CQ001NzAxX1BIWV9JRCwgMCB9LAotCXsgVDNfU1ZJRF8zQ09NLCBUM19TU0lEXzNDT01fM0M5OTZTWCwgMCwgMSB9LAotCXsgVDNfU1ZJRF8zQ09NLCBUM19TU0lEXzNDT01fM0MxMDAwVCwgUEhZX0JDTTU3MDFfUEhZX0lELCAwIH0sCi0JeyBUM19TVklEXzNDT00sIFQzX1NTSURfM0NPTV8zQzk0MEJSMDEsIFBIWV9CQ001NzAxX1BIWV9JRCwgMCB9LAorCQl7VDNfU1ZJRF8zQ09NLCBUM19TU0lEXzNDT01fM0M5OTZULCBQSFlfQkNNNTQwMV9QSFlfSUQsIDB9LAorCQl7VDNfU1ZJRF8zQ09NLCBUM19TU0lEXzNDT01fM0M5OTZCVCwgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKKwkJe1QzX1NWSURfM0NPTSwgVDNfU1NJRF8zQ09NXzNDOTk2U1gsIDAsIDF9LAorCQl7VDNfU1ZJRF8zQ09NLCBUM19TU0lEXzNDT01fM0MxMDAwVCwgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKKwkJe1QzX1NWSURfM0NPTSwgVDNfU1NJRF8zQ09NXzNDOTQwQlIwMSwgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKIAotCXsgVDNfU1ZJRF9ERUxMLCBUM19TU0lEX0RFTExfVklQRVIsIFBIWV9CQ001NDAxX1BIWV9JRCwgMCB9LAotCXsgVDNfU1ZJRF9ERUxMLCBUM19TU0lEX0RFTExfSkFHVUFSLCBQSFlfQkNNNTQwMV9QSFlfSUQsIDAgfSwKLQl7IFQzX1NWSURfREVMTCwgVDNfU1NJRF9ERUxMX01FUkxPVCwgUEhZX0JDTTU0MTFfUEhZX0lELCAwIH0sCi0JeyBUM19TVklEX0RFTEwsIFQzX1NTSURfREVMTF9TTElNX01FUkxPVCwgUEhZX0JDTTU0MTFfUEhZX0lELCAwIH0sCisJCXtUM19TVklEX0RFTEwsIFQzX1NTSURfREVMTF9WSVBFUiwgUEhZX0JDTTU0MDFfUEhZX0lELCAwfSwKKwkJe1QzX1NWSURfREVMTCwgVDNfU1NJRF9ERUxMX0pBR1VBUiwgUEhZX0JDTTU0MDFfUEhZX0lELCAwfSwKKwkJe1QzX1NWSURfREVMTCwgVDNfU1NJRF9ERUxMX01FUkxPVCwgUEhZX0JDTTU0MTFfUEhZX0lELCAwfSwKKwkJe1QzX1NWSURfREVMTCwgVDNfU1NJRF9ERUxMX1NMSU1fTUVSTE9ULCBQSFlfQkNNNTQxMV9QSFlfSUQsIDB9LAogCi0JeyBUM19TVklEX0NPTVBBUSwgVDNfU1NJRF9DT01QQVFfQkFOU0hFRSwgUEhZX0JDTTU3MDFfUEhZX0lELCAwIH0sCi0JeyBUM19TVklEX0NPTVBBUSwgVDNfU1NJRF9DT01QQVFfQkFOU0hFRV8yLCBQSFlfQkNNNTcwMV9QSFlfSUQsIDAgfSwKLQl7IFQzX1NWSURfQ09NUEFRLCBUM19TU0lEX0NPTVBBUV9DSEFOR0VMSU5HLCAwLCAxIH0sCi0JeyBUM19TVklEX0NPTVBBUSwgVDNfU1NJRF9DT01QQVFfTkM3NzgwLCBQSFlfQkNNNTcwMV9QSFlfSUQsIDAgfSwKLQl7IFQzX1NWSURfQ09NUEFRLCBUM19TU0lEX0NPTVBBUV9OQzc3ODBfMiwgUEhZX0JDTTU3MDFfUEhZX0lELCAwIH0sCisJCXtUM19TVklEX0NPTVBBUSwgVDNfU1NJRF9DT01QQVFfQkFOU0hFRSwgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKKwkJe1QzX1NWSURfQ09NUEFRLCBUM19TU0lEX0NPTVBBUV9CQU5TSEVFXzIsIFBIWV9CQ001NzAxX1BIWV9JRCwKKwkJIDB9LAorCQl7VDNfU1ZJRF9DT01QQVEsIFQzX1NTSURfQ09NUEFRX0NIQU5HRUxJTkcsIDAsIDF9LAorCQl7VDNfU1ZJRF9DT01QQVEsIFQzX1NTSURfQ09NUEFRX05DNzc4MCwgUEhZX0JDTTU3MDFfUEhZX0lELCAwfSwKKwkJe1QzX1NWSURfQ09NUEFRLCBUM19TU0lEX0NPTVBBUV9OQzc3ODBfMiwgUEhZX0JDTTU3MDFfUEhZX0lELAorCQkgMH0sCiAKLSAgICB9OwotICAgIExNX1VJTlQzMiBqOworCX07CisJTE1fVUlOVDMyIGo7CiAKLSAgICBmb3IoaiA9IDA7IGogPCBzaXplb2YoQWRhcHRlckFycikvc2l6ZW9mKExNX0FEQVBURVJfSU5GTyk7IGorKykKLSAgICB7Ci0JaWYoQWRhcHRlckFycltqXS5TdmlkID09IFN2aWQgJiYgQWRhcHRlckFycltqXS5Tc2lkID09IFNzaWQpCi0JewotCSAgICByZXR1cm4gJkFkYXB0ZXJBcnJbal07CisJZm9yIChqID0gMDsgaiA8IHNpemVvZiAoQWRhcHRlckFycikgLyBzaXplb2YgKExNX0FEQVBURVJfSU5GTyk7IGorKykgeworCQlpZiAoQWRhcHRlckFycltqXS5TdmlkID09IFN2aWQgJiYgQWRhcHRlckFycltqXS5Tc2lkID09IFNzaWQpIHsKKwkJCXJldHVybiAmQWRhcHRlckFycltqXTsKKwkJfQogCX0KLSAgICB9CiAKLSAgICByZXR1cm4gTlVMTDsKKwlyZXR1cm4gTlVMTDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFRoaXMgcm91dGluZSBzZXRzIHVwIHJlY2VpdmUvdHJhbnNtaXQgYnVmZmVyIGRlc2NyaXB0aW9ucyBxdWV1ZXMuICAgICAgICovCkBAIC0xNjM4LDIzNyArMTQ4OSwyMjYgQEAKIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBMTV9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxNX1NUQVRVUwotTE1fSW5pdGlhbGl6ZUFkYXB0ZXIoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCitMTV9TVEFUVVMgTE1fSW5pdGlhbGl6ZUFkYXB0ZXIgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKIHsKLSAgICBMTV9QSFlTSUNBTF9BRERSRVNTIE1lbVBoeTsKLSAgICBQTE1fVUlOVDggcE1lbVZpcnQ7Ci0gICAgUExNX1BBQ0tFVCBwUGFja2V0OwotICAgIExNX1NUQVRVUyBTdGF0dXM7Ci0gICAgTE1fVUlOVDMyIFNpemU7Ci0gICAgTE1fVUlOVDMyIGo7CisJTE1fUEhZU0lDQUxfQUREUkVTUyBNZW1QaHk7CisJUExNX1VJTlQ4IHBNZW1WaXJ0OworCVBMTV9QQUNLRVQgcFBhY2tldDsKKwlMTV9TVEFUVVMgU3RhdHVzOworCUxNX1VJTlQzMiBTaXplOworCUxNX1VJTlQzMiBqOwogCi0gICAgLyogU2V0IHBvd2VyIHN0YXRlIHRvIEQwLiAqLwotICAgIExNX1NldFBvd2VyU3RhdGUocERldmljZSwgTE1fUE9XRVJfU1RBVEVfRDApOworCS8qIFNldCBwb3dlciBzdGF0ZSB0byBEMC4gKi8KKwlMTV9TZXRQb3dlclN0YXRlIChwRGV2aWNlLCBMTV9QT1dFUl9TVEFURV9EMCk7CiAKLSAgICAvKiBJbnRpYWxpemUgdGhlIHF1ZXVlcy4gKi8KLSAgICBRUV9Jbml0UXVldWUoJnBEZXZpY2UtPlJ4UGFja2V0UmVjZWl2ZWRRLkNvbnRhaW5lciwKLQlNQVhfUlhfUEFDS0VUX0RFU0NfQ09VTlQpOwotICAgIFFRX0luaXRRdWV1ZSgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsCi0JTUFYX1JYX1BBQ0tFVF9ERVNDX0NPVU5UKTsKKwkvKiBJbnRpYWxpemUgdGhlIHF1ZXVlcy4gKi8KKwlRUV9Jbml0UXVldWUgKCZwRGV2aWNlLT5SeFBhY2tldFJlY2VpdmVkUS5Db250YWluZXIsCisJCSAgICAgIE1BWF9SWF9QQUNLRVRfREVTQ19DT1VOVCk7CisJUVFfSW5pdFF1ZXVlICgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsCisJCSAgICAgIE1BWF9SWF9QQUNLRVRfREVTQ19DT1VOVCk7CiAKLSAgICBRUV9Jbml0UXVldWUoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyLE1BWF9UWF9QQUNLRVRfREVTQ19DT1VOVCk7Ci0gICAgUVFfSW5pdFF1ZXVlKCZwRGV2aWNlLT5UeFBhY2tldEFjdGl2ZVEuQ29udGFpbmVyLE1BWF9UWF9QQUNLRVRfREVTQ19DT1VOVCk7Ci0gICAgUVFfSW5pdFF1ZXVlKCZwRGV2aWNlLT5UeFBhY2tldFhtaXR0ZWRRLkNvbnRhaW5lcixNQVhfVFhfUEFDS0VUX0RFU0NfQ09VTlQpOworCVFRX0luaXRRdWV1ZSAoJnBEZXZpY2UtPlR4UGFja2V0RnJlZVEuQ29udGFpbmVyLAorCQkgICAgICBNQVhfVFhfUEFDS0VUX0RFU0NfQ09VTlQpOworCVFRX0luaXRRdWV1ZSAoJnBEZXZpY2UtPlR4UGFja2V0QWN0aXZlUS5Db250YWluZXIsCisJCSAgICAgIE1BWF9UWF9QQUNLRVRfREVTQ19DT1VOVCk7CisJUVFfSW5pdFF1ZXVlICgmcERldmljZS0+VHhQYWNrZXRYbWl0dGVkUS5Db250YWluZXIsCisJCSAgICAgIE1BWF9UWF9QQUNLRVRfREVTQ19DT1VOVCk7CiAKLSAgICAvKiBBbGxvY2F0ZSBzaGFyZWQgbWVtb3J5IGZvcjogc3RhdHVzIGJsb2NrLCB0aGUgYnVmZmVycyBmb3IgcmVjZWl2ZSAqLwotICAgIC8qIHJpbmdzIC0tIHN0YW5kYXJkLCBtaW5pLCBqdW1ibywgYW5kIHJldHVybiByaW5ncy4gKi8KLSAgICBTaXplID0gVDNfU1RBVFVTX0JMT0NLX1NJWkUgKyBzaXplb2YoVDNfU1RBVFNfQkxPQ0spICsKLQlUM19TVERfUkNWX1JDQl9FTlRSWV9DT1VOVCAqIHNpemVvZihUM19SQ1ZfQkQpICsKKwkvKiBBbGxvY2F0ZSBzaGFyZWQgbWVtb3J5IGZvcjogc3RhdHVzIGJsb2NrLCB0aGUgYnVmZmVycyBmb3IgcmVjZWl2ZSAqLworCS8qIHJpbmdzIC0tIHN0YW5kYXJkLCBtaW5pLCBqdW1ibywgYW5kIHJldHVybiByaW5ncy4gKi8KKwlTaXplID0gVDNfU1RBVFVTX0JMT0NLX1NJWkUgKyBzaXplb2YgKFQzX1NUQVRTX0JMT0NLKSArCisJICAgIFQzX1NURF9SQ1ZfUkNCX0VOVFJZX0NPVU5UICogc2l6ZW9mIChUM19SQ1ZfQkQpICsKICNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCi0JVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqIHNpemVvZihUM19SQ1ZfQkQpICsKLSNlbmRpZiAvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCi0JVDNfUkNWX1JFVFVSTl9SQ0JfRU5UUllfQ09VTlQgKiBzaXplb2YoVDNfUkNWX0JEKTsKKwkgICAgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqIHNpemVvZiAoVDNfUkNWX0JEKSArCisjZW5kaWYJCQkJLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLworCSAgICBUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVCAqIHNpemVvZiAoVDNfUkNWX0JEKTsKIAotICAgIC8qIE1lbW9yeSBmb3IgaG9zdCBiYXNlZCBTZW5kIEJELiAqLwotICAgIGlmKHBEZXZpY2UtPk5pY1NlbmRCZCA9PSBGQUxTRSkKLSAgICB7Ci0JU2l6ZSArPSBzaXplb2YoVDNfU05EX0JEKSAqIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgYmxvY2suICovCi0gICAgU3RhdHVzID0gTU1fQWxsb2NhdGVTaGFyZWRNZW1vcnkocERldmljZSwgU2l6ZSwgKFBMTV9WT0lEKSAmcE1lbVZpcnQsICZNZW1QaHksIEZBTFNFKTsKLSAgICBpZihTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0gICAgewotCXJldHVybiBTdGF0dXM7Ci0gICAgfQotCi0gICAgLyogUHJvZ3JhbSBETUEgUmVhZC9Xcml0ZSAqLwotICAgIGlmIChwRGV2aWNlLT5QY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9OT1RfUENJX1hfQlVTKQotICAgIHsKLQlwRGV2aWNlLT5EbWFSZWFkV3JpdGVDdHJsID0gMHg3NjNmMDAwZjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDQpCi0JewotCSAgICBwRGV2aWNlLT5EbWFSZWFkV3JpdGVDdHJsID0gMHg3NjFmMDAwMDsKKwkvKiBNZW1vcnkgZm9yIGhvc3QgYmFzZWQgU2VuZCBCRC4gKi8KKwlpZiAocERldmljZS0+TmljU2VuZEJkID09IEZBTFNFKSB7CisJCVNpemUgKz0gc2l6ZW9mIChUM19TTkRfQkQpICogVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQ7CiAJfQotCWVsc2UKLQl7Ci0JICAgIHBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwgPSAweDc2MWIwMDBmOworCisJLyogQWxsb2NhdGUgdGhlIG1lbW9yeSBibG9jay4gKi8KKwlTdGF0dXMgPQorCSAgICBNTV9BbGxvY2F0ZVNoYXJlZE1lbW9yeSAocERldmljZSwgU2l6ZSwgKFBMTV9WT0lEKSAmIHBNZW1WaXJ0LAorCQkJCSAgICAgJk1lbVBoeSwgRkFMU0UpOworCWlmIChTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmV0dXJuIFN0YXR1czsKIAl9Ci0JaWYocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwM19BMSB8fAotCSAgICBwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAzX0EyKQotCXsKLQkgICAgcERldmljZS0+T25lRG1hQXRPbmNlID0gVFJVRTsKKworCS8qIFByb2dyYW0gRE1BIFJlYWQvV3JpdGUgKi8KKwlpZiAocERldmljZS0+UGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfTk9UX1BDSV9YX0JVUykgeworCQlwRGV2aWNlLT5EbWFSZWFkV3JpdGVDdHJsID0gMHg3NjNmMDAwZjsKKwl9IGVsc2UgeworCQlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwNCkgeworCQkJcERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCA9IDB4NzYxZjAwMDA7CisJCX0gZWxzZSB7CisJCQlwRGV2aWNlLT5EbWFSZWFkV3JpdGVDdHJsID0gMHg3NjFiMDAwZjsKKwkJfQorCQlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwM19BMSB8fAorCQkgICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwM19BMikgeworCQkJcERldmljZS0+T25lRG1hQXRPbmNlID0gVFJVRTsKKwkJfQogCX0KLSAgICB9Ci0gICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAzKQotICAgIHsKLQlwRGV2aWNlLT5EbWFSZWFkV3JpdGVDdHJsICY9IDB4ZmZmZmZmZjA7Ci0gICAgfQorCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAzKSB7CisJCXBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwgJj0gMHhmZmZmZmZmMDsKKwl9CiAKLSAgICBpZihwRGV2aWNlLT5PbmVEbWFBdE9uY2UpCi0gICAgewotCXBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwgfD0gRE1BX0NUUkxfV1JJVEVfT05FX0RNQV9BVF9PTkNFOwotICAgIH0KLSAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLkRtYVJlYWRXcml0ZUN0cmwsIHBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwpOworCWlmIChwRGV2aWNlLT5PbmVEbWFBdE9uY2UpIHsKKwkJcERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCB8PSBETUFfQ1RSTF9XUklURV9PTkVfRE1BX0FUX09OQ0U7CisJfQorCVJFR19XUiAocERldmljZSwgUGNpQ2ZnLkRtYVJlYWRXcml0ZUN0cmwsIHBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwpOwogCi0gICAgaWYgKExNX0RtYVRlc3QocERldmljZSwgcE1lbVZpcnQsIE1lbVBoeSwgMHg0MDApICE9IExNX1NUQVRVU19TVUNDRVNTKQotICAgIHsKLQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7Ci0gICAgfQorCWlmIChMTV9EbWFUZXN0IChwRGV2aWNlLCBwTWVtVmlydCwgTWVtUGh5LCAweDQwMCkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworCX0KIAotICAgIC8qIFN0YXR1cyBibG9jay4gKi8KLSAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydCA9IChQVDNfU1RBVFVTX0JMT0NLKSBwTWVtVmlydDsKLSAgICBwRGV2aWNlLT5TdGF0dXNCbGtQaHkgPSBNZW1QaHk7Ci0gICAgcE1lbVZpcnQgKz0gVDNfU1RBVFVTX0JMT0NLX1NJWkU7Ci0gICAgTE1fSU5DX1BIWVNJQ0FMX0FERFJFU1MoJk1lbVBoeSwgVDNfU1RBVFVTX0JMT0NLX1NJWkUpOworCS8qIFN0YXR1cyBibG9jay4gKi8KKwlwRGV2aWNlLT5wU3RhdHVzQmxrVmlydCA9IChQVDNfU1RBVFVTX0JMT0NLKSBwTWVtVmlydDsKKwlwRGV2aWNlLT5TdGF0dXNCbGtQaHkgPSBNZW1QaHk7CisJcE1lbVZpcnQgKz0gVDNfU1RBVFVTX0JMT0NLX1NJWkU7CisJTE1fSU5DX1BIWVNJQ0FMX0FERFJFU1MgKCZNZW1QaHksIFQzX1NUQVRVU19CTE9DS19TSVpFKTsKIAotICAgIC8qIFN0YXRpc3RpY3MgYmxvY2suICovCi0gICAgcERldmljZS0+cFN0YXRzQmxrVmlydCA9IChQVDNfU1RBVFNfQkxPQ0spIHBNZW1WaXJ0OwotICAgIHBEZXZpY2UtPlN0YXRzQmxrUGh5ID0gTWVtUGh5OwotICAgIHBNZW1WaXJ0ICs9IHNpemVvZihUM19TVEFUU19CTE9DSyk7Ci0gICAgTE1fSU5DX1BIWVNJQ0FMX0FERFJFU1MoJk1lbVBoeSwgc2l6ZW9mKFQzX1NUQVRTX0JMT0NLKSk7CisJLyogU3RhdGlzdGljcyBibG9jay4gKi8KKwlwRGV2aWNlLT5wU3RhdHNCbGtWaXJ0ID0gKFBUM19TVEFUU19CTE9DSykgcE1lbVZpcnQ7CisJcERldmljZS0+U3RhdHNCbGtQaHkgPSBNZW1QaHk7CisJcE1lbVZpcnQgKz0gc2l6ZW9mIChUM19TVEFUU19CTE9DSyk7CisJTE1fSU5DX1BIWVNJQ0FMX0FERFJFU1MgKCZNZW1QaHksIHNpemVvZiAoVDNfU1RBVFNfQkxPQ0spKTsKIAotICAgIC8qIFJlY2VpdmUgc3RhbmRhcmQgQkQgYnVmZmVyLiAqLwotICAgIHBEZXZpY2UtPnBSeFN0ZEJkVmlydCA9IChQVDNfUkNWX0JEKSBwTWVtVmlydDsKLSAgICBwRGV2aWNlLT5SeFN0ZEJkUGh5ID0gTWVtUGh5OworCS8qIFJlY2VpdmUgc3RhbmRhcmQgQkQgYnVmZmVyLiAqLworCXBEZXZpY2UtPnBSeFN0ZEJkVmlydCA9IChQVDNfUkNWX0JEKSBwTWVtVmlydDsKKwlwRGV2aWNlLT5SeFN0ZEJkUGh5ID0gTWVtUGh5OwogCi0gICAgcE1lbVZpcnQgKz0gVDNfU1REX1JDVl9SQ0JfRU5UUllfQ09VTlQgKiBzaXplb2YoVDNfUkNWX0JEKTsKLSAgICBMTV9JTkNfUEhZU0lDQUxfQUREUkVTUygmTWVtUGh5LAotCVQzX1NURF9SQ1ZfUkNCX0VOVFJZX0NPVU5UICogc2l6ZW9mKFQzX1JDVl9CRCkpOworCXBNZW1WaXJ0ICs9IFQzX1NURF9SQ1ZfUkNCX0VOVFJZX0NPVU5UICogc2l6ZW9mIChUM19SQ1ZfQkQpOworCUxNX0lOQ19QSFlTSUNBTF9BRERSRVNTICgmTWVtUGh5LAorCQkJCSBUM19TVERfUkNWX1JDQl9FTlRSWV9DT1VOVCAqCisJCQkJIHNpemVvZiAoVDNfUkNWX0JEKSk7CiAKICNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCi0gICAgLyogUmVjZWl2ZSBqdW1ibyBCRCBidWZmZXIuICovCi0gICAgcERldmljZS0+cFJ4SnVtYm9CZFZpcnQgPSAoUFQzX1JDVl9CRCkgcE1lbVZpcnQ7Ci0gICAgcERldmljZS0+UnhKdW1ib0JkUGh5ID0gTWVtUGh5OworCS8qIFJlY2VpdmUganVtYm8gQkQgYnVmZmVyLiAqLworCXBEZXZpY2UtPnBSeEp1bWJvQmRWaXJ0ID0gKFBUM19SQ1ZfQkQpIHBNZW1WaXJ0OworCXBEZXZpY2UtPlJ4SnVtYm9CZFBoeSA9IE1lbVBoeTsKIAotICAgIHBNZW1WaXJ0ICs9IFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKiBzaXplb2YoVDNfUkNWX0JEKTsKLSAgICBMTV9JTkNfUEhZU0lDQUxfQUREUkVTUygmTWVtUGh5LAotCVQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKiBzaXplb2YoVDNfUkNWX0JEKSk7Ci0jZW5kaWYgLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLworCXBNZW1WaXJ0ICs9IFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKiBzaXplb2YgKFQzX1JDVl9CRCk7CisJTE1fSU5DX1BIWVNJQ0FMX0FERFJFU1MgKCZNZW1QaHksCisJCQkJIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKgorCQkJCSBzaXplb2YgKFQzX1JDVl9CRCkpOworI2VuZGlmCQkJCS8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KIAotICAgIC8qIFJlY2VpdmUgcmV0dXJuIEJEIGJ1ZmZlci4gKi8KLSAgICBwRGV2aWNlLT5wUmN2UmV0QmRWaXJ0ID0gKFBUM19SQ1ZfQkQpIHBNZW1WaXJ0OwotICAgIHBEZXZpY2UtPlJjdlJldEJkUGh5ID0gTWVtUGh5OworCS8qIFJlY2VpdmUgcmV0dXJuIEJEIGJ1ZmZlci4gKi8KKwlwRGV2aWNlLT5wUmN2UmV0QmRWaXJ0ID0gKFBUM19SQ1ZfQkQpIHBNZW1WaXJ0OworCXBEZXZpY2UtPlJjdlJldEJkUGh5ID0gTWVtUGh5OwogCi0gICAgcE1lbVZpcnQgKz0gVDNfUkNWX1JFVFVSTl9SQ0JfRU5UUllfQ09VTlQgKiBzaXplb2YoVDNfUkNWX0JEKTsKLSAgICBMTV9JTkNfUEhZU0lDQUxfQUREUkVTUygmTWVtUGh5LAotCVQzX1JDVl9SRVRVUk5fUkNCX0VOVFJZX0NPVU5UICogc2l6ZW9mKFQzX1JDVl9CRCkpOworCXBNZW1WaXJ0ICs9IFQzX1JDVl9SRVRVUk5fUkNCX0VOVFJZX0NPVU5UICogc2l6ZW9mIChUM19SQ1ZfQkQpOworCUxNX0lOQ19QSFlTSUNBTF9BRERSRVNTICgmTWVtUGh5LAorCQkJCSBUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVCAqCisJCQkJIHNpemVvZiAoVDNfUkNWX0JEKSk7CiAKLSAgICAvKiBTZXQgdXAgU2VuZCBCRC4gKi8KLSAgICBpZihwRGV2aWNlLT5OaWNTZW5kQmQgPT0gRkFMU0UpCi0gICAgewotCXBEZXZpY2UtPnBTZW5kQmRWaXJ0ID0gKFBUM19TTkRfQkQpIHBNZW1WaXJ0OwotCXBEZXZpY2UtPlNlbmRCZFBoeSA9IE1lbVBoeTsKKwkvKiBTZXQgdXAgU2VuZCBCRC4gKi8KKwlpZiAocERldmljZS0+TmljU2VuZEJkID09IEZBTFNFKSB7CisJCXBEZXZpY2UtPnBTZW5kQmRWaXJ0ID0gKFBUM19TTkRfQkQpIHBNZW1WaXJ0OworCQlwRGV2aWNlLT5TZW5kQmRQaHkgPSBNZW1QaHk7CiAKLQlwTWVtVmlydCArPSBzaXplb2YoVDNfU05EX0JEKSAqIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UOwotCUxNX0lOQ19QSFlTSUNBTF9BRERSRVNTKCZNZW1QaHksCi0JICAgIHNpemVvZihUM19TTkRfQkQpICogVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCXBEZXZpY2UtPnBTZW5kQmRWaXJ0ID0gKFBUM19TTkRfQkQpCi0JICAgIHBEZXZpY2UtPnBNZW1WaWV3LT51SW50TWVtLkZpcnN0MzJrLkJ1ZmZlckRlc2M7Ci0JcERldmljZS0+U2VuZEJkUGh5LkhpZ2ggPSAwOwotCXBEZXZpY2UtPlNlbmRCZFBoeS5Mb3cgPSBUM19OSUNfU05EX0JVRkZFUl9ERVNDX0FERFI7Ci0gICAgfQorCQlwTWVtVmlydCArPSBzaXplb2YgKFQzX1NORF9CRCkgKiBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVDsKKwkJTE1fSU5DX1BIWVNJQ0FMX0FERFJFU1MgKCZNZW1QaHksCisJCQkJCSBzaXplb2YgKFQzX1NORF9CRCkgKgorCQkJCQkgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQpOworCX0gZWxzZSB7CisJCXBEZXZpY2UtPnBTZW5kQmRWaXJ0ID0gKFBUM19TTkRfQkQpCisJCSAgICBwRGV2aWNlLT5wTWVtVmlldy0+dUludE1lbS5GaXJzdDMyay5CdWZmZXJEZXNjOworCQlwRGV2aWNlLT5TZW5kQmRQaHkuSGlnaCA9IDA7CisJCXBEZXZpY2UtPlNlbmRCZFBoeS5Mb3cgPSBUM19OSUNfU05EX0JVRkZFUl9ERVNDX0FERFI7CisJfQogCi0gICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBwYWNrZXQgZGVzY3JpcHRvcnMuICovCi0gICAgU2l6ZSA9IChwRGV2aWNlLT5SeFBhY2tldERlc2NDbnQgKwotCXBEZXZpY2UtPlR4UGFja2V0RGVzY0NudCkgKiBNTV9QQUNLRVRfREVTQ19TSVpFOwotICAgIFN0YXR1cyA9IE1NX0FsbG9jYXRlTWVtb3J5KHBEZXZpY2UsIFNpemUsIChQTE1fVk9JRCAqKSAmcFBhY2tldCk7Ci0gICAgaWYoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKQotICAgIHsKLQlyZXR1cm4gU3RhdHVzOwotICAgIH0KLSAgICBwRGV2aWNlLT5wUGFja2V0RGVzY0Jhc2UgPSAoUExNX1ZPSUQpIHBQYWNrZXQ7CisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBwYWNrZXQgZGVzY3JpcHRvcnMuICovCisJU2l6ZSA9IChwRGV2aWNlLT5SeFBhY2tldERlc2NDbnQgKworCQlwRGV2aWNlLT5UeFBhY2tldERlc2NDbnQpICogTU1fUEFDS0VUX0RFU0NfU0laRTsKKwlTdGF0dXMgPSBNTV9BbGxvY2F0ZU1lbW9yeSAocERldmljZSwgU2l6ZSwgKFBMTV9WT0lEICopICYgcFBhY2tldCk7CisJaWYgKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCQlyZXR1cm4gU3RhdHVzOworCX0KKwlwRGV2aWNlLT5wUGFja2V0RGVzY0Jhc2UgPSAoUExNX1ZPSUQpIHBQYWNrZXQ7CiAKLSAgICAvKiBDcmVhdGUgdHJhbnNtaXQgcGFja2V0IGRlc2NyaXB0b3JzIGZyb20gdGhlIG1lbW9yeSBibG9jayBhbmQgYWRkIHRoZW0gKi8KLSAgICAvKiB0byB0aGUgVHhQYWNrZXRGcmVlUSBmb3IgZWFjaCBzZW5kIHJpbmcuICovCi0gICAgZm9yKGogPSAwOyBqIDwgcERldmljZS0+VHhQYWNrZXREZXNjQ250OyBqKyspCi0gICAgewotCS8qIFJpbmcgaW5kZXguICovCi0JcFBhY2tldC0+RmxhZ3MgPSAwOworCS8qIENyZWF0ZSB0cmFuc21pdCBwYWNrZXQgZGVzY3JpcHRvcnMgZnJvbSB0aGUgbWVtb3J5IGJsb2NrIGFuZCBhZGQgdGhlbSAqLworCS8qIHRvIHRoZSBUeFBhY2tldEZyZWVRIGZvciBlYWNoIHNlbmQgcmluZy4gKi8KKwlmb3IgKGogPSAwOyBqIDwgcERldmljZS0+VHhQYWNrZXREZXNjQ250OyBqKyspIHsKKwkJLyogUmluZyBpbmRleC4gKi8KKwkJcFBhY2tldC0+RmxhZ3MgPSAwOwogCi0JLyogUXVldWUgdGhlIGRlc2NyaXB0b3IgaW4gdGhlIFR4UGFja2V0RnJlZVEgb2YgdGhlICdrJyByaW5nLiAqLwotCVFRX1B1c2hUYWlsKCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisJCS8qIFF1ZXVlIHRoZSBkZXNjcmlwdG9yIGluIHRoZSBUeFBhY2tldEZyZWVRIG9mIHRoZSAnaycgcmluZy4gKi8KKwkJUVFfUHVzaFRhaWwgKCZwRGV2aWNlLT5UeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7CiAKLQkvKiBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIG5leHQgZGVzY3JpcHRvci4gIE1NX1BBQ0tFVF9ERVNDX1NJWkUgKi8KLQkvKiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgcGFja2V0IGRlc2NyaXB0b3IgaW5jbHVkaW5nIHRoZSAqLwotCS8qIG9zLXNwZWNpZmljIGV4dGVuc2lvbnMgaW4gdGhlIFVNX1BBQ0tFVCBzdHJ1Y3R1cmUuICovCi0JcFBhY2tldCA9IChQTE1fUEFDS0VUKSAoKFBMTV9VSU5UOCkgcFBhY2tldCArIE1NX1BBQ0tFVF9ERVNDX1NJWkUpOwotICAgIH0gLyogZm9yKGouLiAqLworCQkvKiBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIG5leHQgZGVzY3JpcHRvci4gIE1NX1BBQ0tFVF9ERVNDX1NJWkUgKi8KKwkJLyogaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIHBhY2tldCBkZXNjcmlwdG9yIGluY2x1ZGluZyB0aGUgKi8KKwkJLyogb3Mtc3BlY2lmaWMgZXh0ZW5zaW9ucyBpbiB0aGUgVU1fUEFDS0VUIHN0cnVjdHVyZS4gKi8KKwkJcFBhY2tldCA9CisJCSAgICAoUExNX1BBQ0tFVCkgKChQTE1fVUlOVDgpIHBQYWNrZXQgKyBNTV9QQUNLRVRfREVTQ19TSVpFKTsKKwl9CQkJLyogZm9yKGouLiAqLwogCi0gICAgLyogQ3JlYXRlIHJlY2VpdmUgcGFja2V0IGRlc2NyaXB0b3JzIGZyb20gdGhlIG1lbW9yeSBibG9jayBhbmQgYWRkIHRoZW0gKi8KLSAgICAvKiB0byB0aGUgUnhQYWNrZXRGcmVlUS4gIENyZWF0ZSB0aGUgU3RhbmRhcmQgcGFja2V0IGRlc2NyaXB0b3JzLiAqLwotICAgIGZvcihqID0gMDsgaiA8IHBEZXZpY2UtPlJ4U3RkRGVzY0NudDsgaisrKQotICAgIHsKLQkvKiBSZWNlaXZlIHByb2R1Y2VyIHJpbmcuICovCi0JcFBhY2tldC0+dS5SeC5SY3ZQcm9kUmluZyA9IFQzX1NURF9SQ1ZfUFJPRF9SSU5HOworCS8qIENyZWF0ZSByZWNlaXZlIHBhY2tldCBkZXNjcmlwdG9ycyBmcm9tIHRoZSBtZW1vcnkgYmxvY2sgYW5kIGFkZCB0aGVtICovCisJLyogdG8gdGhlIFJ4UGFja2V0RnJlZVEuICBDcmVhdGUgdGhlIFN0YW5kYXJkIHBhY2tldCBkZXNjcmlwdG9ycy4gKi8KKwlmb3IgKGogPSAwOyBqIDwgcERldmljZS0+UnhTdGREZXNjQ250OyBqKyspIHsKKwkJLyogUmVjZWl2ZSBwcm9kdWNlciByaW5nLiAqLworCQlwUGFja2V0LT51LlJ4LlJjdlByb2RSaW5nID0gVDNfU1REX1JDVl9QUk9EX1JJTkc7CiAKLQkvKiBSZWNlaXZlIGJ1ZmZlciBzaXplLiAqLwotCXBQYWNrZXQtPnUuUnguUnhCdWZmZXJTaXplID0gTUFYX1NURF9SQ1ZfQlVGRkVSX1NJWkU7CisJCS8qIFJlY2VpdmUgYnVmZmVyIHNpemUuICovCisJCXBQYWNrZXQtPnUuUnguUnhCdWZmZXJTaXplID0gTUFYX1NURF9SQ1ZfQlVGRkVSX1NJWkU7CiAKLQkvKiBBZGQgdGhlIGRlc2NyaXB0b3IgdG8gUnhQYWNrZXRGcmVlUS4gKi8KLQlRUV9QdXNoVGFpbCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCQkvKiBBZGQgdGhlIGRlc2NyaXB0b3IgdG8gUnhQYWNrZXRGcmVlUS4gKi8KKwkJUVFfUHVzaFRhaWwgKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7CiAKLQkvKiBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIG5leHQgZGVzY3JpcHRvci4gIE1NX1BBQ0tFVF9ERVNDX1NJWkUgKi8KLQkvKiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgcGFja2V0IGRlc2NyaXB0b3IgaW5jbHVkaW5nIHRoZSAqLwotCS8qIG9zLXNwZWNpZmljIGV4dGVuc2lvbnMgaW4gdGhlIFVNX1BBQ0tFVCBzdHJ1Y3R1cmUuICovCi0JcFBhY2tldCA9IChQTE1fUEFDS0VUKSAoKFBMTV9VSU5UOCkgcFBhY2tldCArIE1NX1BBQ0tFVF9ERVNDX1NJWkUpOwotICAgIH0gLyogZm9yICovCisJCS8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBkZXNjcmlwdG9yLiAgTU1fUEFDS0VUX0RFU0NfU0laRSAqLworCQkvKiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgcGFja2V0IGRlc2NyaXB0b3IgaW5jbHVkaW5nIHRoZSAqLworCQkvKiBvcy1zcGVjaWZpYyBleHRlbnNpb25zIGluIHRoZSBVTV9QQUNLRVQgc3RydWN0dXJlLiAqLworCQlwUGFja2V0ID0KKwkJICAgIChQTE1fUEFDS0VUKSAoKFBMTV9VSU5UOCkgcFBhY2tldCArIE1NX1BBQ0tFVF9ERVNDX1NJWkUpOworCX0JCQkvKiBmb3IgKi8KIAogI2lmIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQKLSAgICAvKiBDcmVhdGUgdGhlIEp1bWJvIHBhY2tldCBkZXNjcmlwdG9ycy4gKi8KLSAgICBmb3IoaiA9IDA7IGogPCBwRGV2aWNlLT5SeEp1bWJvRGVzY0NudDsgaisrKQotICAgIHsKLQkvKiBSZWNlaXZlIHByb2R1Y2VyIHJpbmcuICovCi0JcFBhY2tldC0+dS5SeC5SY3ZQcm9kUmluZyA9IFQzX0pVTUJPX1JDVl9QUk9EX1JJTkc7CisJLyogQ3JlYXRlIHRoZSBKdW1ibyBwYWNrZXQgZGVzY3JpcHRvcnMuICovCisJZm9yIChqID0gMDsgaiA8IHBEZXZpY2UtPlJ4SnVtYm9EZXNjQ250OyBqKyspIHsKKwkJLyogUmVjZWl2ZSBwcm9kdWNlciByaW5nLiAqLworCQlwUGFja2V0LT51LlJ4LlJjdlByb2RSaW5nID0gVDNfSlVNQk9fUkNWX1BST0RfUklORzsKIAotCS8qIFJlY2VpdmUgYnVmZmVyIHNpemUuICovCi0JcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclNpemUgPSBwRGV2aWNlLT5SeEp1bWJvQnVmZmVyU2l6ZTsKKwkJLyogUmVjZWl2ZSBidWZmZXIgc2l6ZS4gKi8KKwkJcFBhY2tldC0+dS5SeC5SeEJ1ZmZlclNpemUgPSBwRGV2aWNlLT5SeEp1bWJvQnVmZmVyU2l6ZTsKIAotCS8qIEFkZCB0aGUgZGVzY3JpcHRvciB0byBSeFBhY2tldEZyZWVRLiAqLwotCVFRX1B1c2hUYWlsKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisJCS8qIEFkZCB0aGUgZGVzY3JpcHRvciB0byBSeFBhY2tldEZyZWVRLiAqLworCQlRUV9QdXNoVGFpbCAoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKIAotCS8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBkZXNjcmlwdG9yLiAgTU1fUEFDS0VUX0RFU0NfU0laRSAqLwotCS8qIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBwYWNrZXQgZGVzY3JpcHRvciBpbmNsdWRpbmcgdGhlICovCi0JLyogb3Mtc3BlY2lmaWMgZXh0ZW5zaW9ucyBpbiB0aGUgVU1fUEFDS0VUIHN0cnVjdHVyZS4gKi8KLQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpICgoUExNX1VJTlQ4KSBwUGFja2V0ICsgTU1fUEFDS0VUX0RFU0NfU0laRSk7Ci0gICAgfSAvKiBmb3IgKi8KLSNlbmRpZiAvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCisJCS8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBkZXNjcmlwdG9yLiAgTU1fUEFDS0VUX0RFU0NfU0laRSAqLworCQkvKiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgcGFja2V0IGRlc2NyaXB0b3IgaW5jbHVkaW5nIHRoZSAqLworCQkvKiBvcy1zcGVjaWZpYyBleHRlbnNpb25zIGluIHRoZSBVTV9QQUNLRVQgc3RydWN0dXJlLiAqLworCQlwUGFja2V0ID0KKwkJICAgIChQTE1fUEFDS0VUKSAoKFBMTV9VSU5UOCkgcFBhY2tldCArIE1NX1BBQ0tFVF9ERVNDX1NJWkUpOworCX0JCQkvKiBmb3IgKi8KKyNlbmRpZgkJCQkvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCiAKLSAgICAvKiBJbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSBwYWNrZXQgZGVzY3JpcHRvcnMuICovCi0gICAgU3RhdHVzID0gTU1fSW5pdGlhbGl6ZVVtUGFja2V0cyhwRGV2aWNlKTsKLSAgICBpZihTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0gICAgewotCXJldHVybiBTdGF0dXM7Ci0gICAgfSAvKiBpZiAqLworCS8qIEluaXRpYWxpemUgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldCBkZXNjcmlwdG9ycy4gKi8KKwlTdGF0dXMgPSBNTV9Jbml0aWFsaXplVW1QYWNrZXRzIChwRGV2aWNlKTsKKwlpZiAoU3RhdHVzICE9IExNX1NUQVRVU19TVUNDRVNTKSB7CisJCXJldHVybiBTdGF0dXM7CisJfQogCi0gICAgLyogRGVmYXVsdCByZWNlaXZlIG1hc2suICovCi0gICAgcERldmljZS0+UmVjZWl2ZU1hc2sgPSBMTV9BQ0NFUFRfTVVMVElDQVNUIHwgTE1fQUNDRVBUX0JST0FEQ0FTVCB8Ci0JTE1fQUNDRVBUX1VOSUNBU1Q7CisJLyogaWYgKi8KKwkvKiBEZWZhdWx0IHJlY2VpdmUgbWFzay4gKi8KKwlwRGV2aWNlLT5SZWNlaXZlTWFzayA9IExNX0FDQ0VQVF9NVUxUSUNBU1QgfCBMTV9BQ0NFUFRfQlJPQURDQVNUIHwKKwkgICAgTE1fQUNDRVBUX1VOSUNBU1Q7CiAKLSAgICAvKiBNYWtlIHN1cmUgd2UgYXJlIGluIHRoZSBmaXJzdCAzMmsgbWVtb3J5IHdpbmRvdyBvciBOaWNTZW5kQmQuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIFBjaUNmZy5NZW1XaW5kb3dCYXNlQWRkciwgMCk7CisJLyogTWFrZSBzdXJlIHdlIGFyZSBpbiB0aGUgZmlyc3QgMzJrIG1lbW9yeSB3aW5kb3cgb3IgTmljU2VuZEJkLiAqLworCVJFR19XUiAocERldmljZSwgUGNpQ2ZnLk1lbVdpbmRvd0Jhc2VBZGRyLCAwKTsKIAotICAgIC8qIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlLiAqLwotICAgIFN0YXR1cyA9IExNX1Jlc2V0QWRhcHRlcihwRGV2aWNlKTsKLSAgICBpZihTdGF0dXMgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpCi0gICAgewotCXJldHVybiBTdGF0dXM7Ci0gICAgfQorCS8qIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlLiAqLworCVN0YXR1cyA9IExNX1Jlc2V0QWRhcHRlciAocERldmljZSk7CisJaWYgKFN0YXR1cyAhPSBMTV9TVEFUVVNfU1VDQ0VTUykgeworCQlyZXR1cm4gU3RhdHVzOworCX0KIAotICAgIC8qIFdlIGFyZSBkb25lIHdpdGggaW5pdGlhbGl6YXRpb24uICovCi0gICAgcERldmljZS0+SW5pdERvbmUgPSBUUlVFOworCS8qIFdlIGFyZSBkb25lIHdpdGggaW5pdGlhbGl6YXRpb24uICovCisJcERldmljZS0+SW5pdERvbmUgPSBUUlVFOwogCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotfSAvKiBMTV9Jbml0aWFsaXplQWRhcHRlciAqLwotCisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQkJCQkvKiBMTV9Jbml0aWFsaXplQWRhcHRlciAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE4NzgsNDE0ICsxNzE4LDQwOCBAQAogLyogICAgTE1fU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBMTV9TVEFUVVMKLUxNX0NudHJsQmxvY2soCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi1MTV9VSU5UMzIgbWFzayxMTV9VSU5UMzIgY250cmwpCitMTV9DbnRybEJsb2NrIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBtYXNrLCBMTV9VSU5UMzIgY250cmwpCiB7Ci0gICAgTE1fVUlOVDMyIGosaSxkYXRhOwotICAgIExNX1VJTlQzMiBNYXhXYWl0Q250OworCUxNX1VJTlQzMiBqLCBpLCBkYXRhOworCUxNX1VJTlQzMiBNYXhXYWl0Q250OwogCi0gICAgTWF4V2FpdENudCA9IDI7Ci0gICAgaiA9IDA7CisJTWF4V2FpdENudCA9IDI7CisJaiA9IDA7CiAKLSAgICBmb3IoaSA9IDAgOyBpIDwgMzI7IGkrKykKLSAgICB7Ci0JaWYoIShtYXNrICYgKDEgPDwgaSkpKQotCSAgICBjb250aW51ZTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQlpZiAoIShtYXNrICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CiAKLQlzd2l0Y2ggKDEgPDwgaSkKLQl7Ci0JICAgIGNhc2UgVDNfQkxPQ0tfRE1BX1JEOgotCQlkYXRhID0gUkVHX1JEKHBEZXZpY2UsIERtYVJlYWQuTW9kZSk7Ci0JCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBkYXRhICY9IH5ETUFfUkVBRF9NT0RFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBEbWFSZWFkLk1vZGUsIGRhdGEpOwotCQkgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQotCQkgICAgewotCQkJaWYoIShSRUdfUkQocERldmljZSwgRG1hUmVhZC5Nb2RlKSAmIERNQV9SRUFEX01PREVfRU5BQkxFKSkKLQkJCSAgICBicmVhazsKLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIFJFR19XUihwRGV2aWNlLCBEbWFSZWFkLk1vZGUsIGRhdGEgfCBETUFfUkVBRF9NT0RFX0VOQUJMRSk7Ci0JCWJyZWFrOworCQlzd2l0Y2ggKDEgPDwgaSkgeworCQljYXNlIFQzX0JMT0NLX0RNQV9SRDoKKwkJCWRhdGEgPSBSRUdfUkQgKHBEZXZpY2UsIERtYVJlYWQuTW9kZSk7CisJCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkgeworCQkJCWRhdGEgJj0gfkRNQV9SRUFEX01PREVfRU5BQkxFOworCQkJCVJFR19XUiAocERldmljZSwgRG1hUmVhZC5Nb2RlLCBkYXRhKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKSB7CisJCQkJCWlmICghCisJCQkJCSAgICAoUkVHX1JEIChwRGV2aWNlLCBEbWFSZWFkLk1vZGUpICYKKwkJCQkJICAgICBETUFfUkVBRF9NT0RFX0VOQUJMRSkpCisJCQkJCQlicmVhazsKKwkJCQkJTU1fV2FpdCAoMTApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCVJFR19XUiAocERldmljZSwgRG1hUmVhZC5Nb2RlLAorCQkJCQlkYXRhIHwgRE1BX1JFQURfTU9ERV9FTkFCTEUpOworCQkJYnJlYWs7CiAKLQkgICAgY2FzZSBUM19CTE9DS19ETUFfQ09NUDoKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLERtYUNvbXAuTW9kZSk7Ci0JCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBkYXRhICY9IH5ETUFfQ09NUF9NT0RFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBEbWFDb21wLk1vZGUsIGRhdGEpOwotCQkgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQotCQkgICAgewotCQkJaWYoIShSRUdfUkQocERldmljZSwgRG1hQ29tcC5Nb2RlKSAmIERNQV9DT01QX01PREVfRU5BQkxFKSkKLQkJCSAgICBicmVhazsKLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIFJFR19XUihwRGV2aWNlLCBEbWFDb21wLk1vZGUsIGRhdGEgfCBETUFfQ09NUF9NT0RFX0VOQUJMRSk7Ci0JCWJyZWFrOworCQljYXNlIFQzX0JMT0NLX0RNQV9DT01QOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgRG1hQ29tcC5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+RE1BX0NPTVBfTU9ERV9FTkFCTEU7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBEbWFDb21wLk1vZGUsIGRhdGEpOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQgKHBEZXZpY2UsIERtYUNvbXAuTW9kZSkgJgorCQkJCQkgICAgIERNQV9DT01QX01PREVfRU5BQkxFKSkKKwkJCQkJCWJyZWFrOworCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJUkVHX1dSIChwRGV2aWNlLCBEbWFDb21wLk1vZGUsCisJCQkJCWRhdGEgfCBETUFfQ09NUF9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX1JYX0JEX0lOSVRJQVRPUjoKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLCBSY3ZCZEluLk1vZGUpOwotCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKLQkJewotCQkgICAgZGF0YSAmPSB+UkNWX0JEX0lOX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkJkSW4uTW9kZSxkYXRhKTsKLQkJICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKLQkJICAgIHsKLQkJCWlmKCEoUkVHX1JEKHBEZXZpY2UsIFJjdkJkSW4uTW9kZSkgJiBSQ1ZfQkRfSU5fTU9ERV9FTkFCTEUpKQotCQkJICAgIGJyZWFrOwotCQkJTU1fV2FpdCgxMCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZQotCQkgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkJkSW4uTW9kZSxkYXRhIHwgUkNWX0JEX0lOX01PREVfRU5BQkxFKTsKLQkJYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfUlhfQkRfSU5JVElBVE9SOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgUmN2QmRJbi5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+UkNWX0JEX0lOX01PREVfRU5BQkxFOworCQkJCVJFR19XUiAocERldmljZSwgUmN2QmRJbi5Nb2RlLCBkYXRhKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKSB7CisJCQkJCWlmICghCisJCQkJCSAgICAoUkVHX1JEIChwRGV2aWNlLCBSY3ZCZEluLk1vZGUpICYKKwkJCQkJICAgICBSQ1ZfQkRfSU5fTU9ERV9FTkFCTEUpKQorCQkJCQkJYnJlYWs7CisJCQkJCU1NX1dhaXQgKDEwKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIFJjdkJkSW4uTW9kZSwKKwkJCQkJZGF0YSB8IFJDVl9CRF9JTl9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX1JYX0JEX0NPTVA6Ci0JCWRhdGEgPSBSRUdfUkQocERldmljZSwgUmN2QmRDb21wLk1vZGUpOwotCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKLQkJewotCQkgICAgZGF0YSAmPSB+UkNWX0JEX0NPTVBfTU9ERV9FTkFCTEU7Ci0JCSAgICBSRUdfV1IocERldmljZSwgUmN2QmRDb21wLk1vZGUsZGF0YSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBSY3ZCZENvbXAuTW9kZSkgJiBSQ1ZfQkRfQ09NUF9NT0RFX0VOQUJMRSkpCi0JCQkgICAgYnJlYWs7Ci0JCQlNTV9XYWl0KDEwKTsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCSAgICBSRUdfV1IocERldmljZSwgUmN2QmRDb21wLk1vZGUsZGF0YSB8IFJDVl9CRF9DT01QX01PREVfRU5BQkxFKTsKLQkJYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfUlhfQkRfQ09NUDoKKwkJCWRhdGEgPSBSRUdfUkQgKHBEZXZpY2UsIFJjdkJkQ29tcC5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+UkNWX0JEX0NPTVBfTU9ERV9FTkFCTEU7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBSY3ZCZENvbXAuTW9kZSwgZGF0YSk7CisJCQkJZm9yIChqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykgeworCQkJCQlpZiAoIQorCQkJCQkgICAgKFJFR19SRCAocERldmljZSwgUmN2QmRDb21wLk1vZGUpICYKKwkJCQkJICAgICBSQ1ZfQkRfQ09NUF9NT0RFX0VOQUJMRSkpCisJCQkJCQlicmVhazsKKwkJCQkJTU1fV2FpdCAoMTApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCVJFR19XUiAocERldmljZSwgUmN2QmRDb21wLk1vZGUsCisJCQkJCWRhdGEgfCBSQ1ZfQkRfQ09NUF9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX0RNQV9XUjoKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLCBEbWFXcml0ZS5Nb2RlKTsKLQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpCi0JCXsKLQkJICAgIGRhdGEgJj0gfkRNQV9XUklURV9NT0RFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBEbWFXcml0ZS5Nb2RlLGRhdGEpOworCQljYXNlIFQzX0JMT0NLX0RNQV9XUjoKKwkJCWRhdGEgPSBSRUdfUkQgKHBEZXZpY2UsIERtYVdyaXRlLk1vZGUpOworCQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpIHsKKwkJCQlkYXRhICY9IH5ETUFfV1JJVEVfTU9ERV9FTkFCTEU7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBEbWFXcml0ZS5Nb2RlLCBkYXRhKTsKIAotCQkgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQotCQkgICAgewotCQkJaWYoIShSRUdfUkQocERldmljZSwgRG1hV3JpdGUuTW9kZSkgJiBETUFfV1JJVEVfTU9ERV9FTkFCTEUpKQotCQkJICAgIGJyZWFrOwotCQkJTU1fV2FpdCgxMCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZQotCQkgICAgUkVHX1dSKHBEZXZpY2UsIERtYVdyaXRlLk1vZGUsZGF0YSB8IERNQV9XUklURV9NT0RFX0VOQUJMRSk7Ci0JCWJyZWFrOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQgKHBEZXZpY2UsIERtYVdyaXRlLk1vZGUpICYKKwkJCQkJICAgICBETUFfV1JJVEVfTU9ERV9FTkFCTEUpKQorCQkJCQkJYnJlYWs7CisJCQkJCU1NX1dhaXQgKDEwKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIERtYVdyaXRlLk1vZGUsCisJCQkJCWRhdGEgfCBETUFfV1JJVEVfTU9ERV9FTkFCTEUpOworCQkJYnJlYWs7CiAKLQkgICAgY2FzZSBUM19CTE9DS19NU0lfSEFORExFUjoKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLCBNc2kuTW9kZSk7Ci0JCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBkYXRhICY9IH5NU0lfTU9ERV9FTkFCTEU7Ci0JCSAgICBSRUdfV1IocERldmljZSwgTXNpLk1vZGUsIGRhdGEpOwotCQkgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQotCQkgICAgewotCQkJaWYoIShSRUdfUkQocERldmljZSwgTXNpLk1vZGUpICYgTVNJX01PREVfRU5BQkxFKSkKLQkJCSAgICBicmVhazsKLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIFJFR19XUihwRGV2aWNlLCBNc2kuTW9kZSwgZGF0YSB8TVNJX01PREVfRU5BQkxFKTsKLQkJYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfTVNJX0hBTkRMRVI6CisJCQlkYXRhID0gUkVHX1JEIChwRGV2aWNlLCBNc2kuTW9kZSk7CisJCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkgeworCQkJCWRhdGEgJj0gfk1TSV9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIE1zaS5Nb2RlLCBkYXRhKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKSB7CisJCQkJCWlmICghCisJCQkJCSAgICAoUkVHX1JEIChwRGV2aWNlLCBNc2kuTW9kZSkgJgorCQkJCQkgICAgIE1TSV9NT0RFX0VOQUJMRSkpCisJCQkJCQlicmVhazsKKwkJCQkJTU1fV2FpdCAoMTApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCVJFR19XUiAocERldmljZSwgTXNpLk1vZGUsCisJCQkJCWRhdGEgfCBNU0lfTU9ERV9FTkFCTEUpOworCQkJYnJlYWs7CiAKLQkgICAgY2FzZSBUM19CTE9DS19SWF9MSVNUX1BMTVQ6Ci0JCWRhdGEgPSBSRUdfUkQocERldmljZSwgUmN2TGlzdFBsbXQuTW9kZSk7Ci0JCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBkYXRhICY9IH5SQ1ZfTElTVF9QTE1UX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkxpc3RQbG10Lk1vZGUsZGF0YSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBSY3ZMaXN0UGxtdC5Nb2RlKSAmIFJDVl9MSVNUX1BMTVRfTU9ERV9FTkFCTEUpKQotCQkJICAgIGJyZWFrOwotCQkJTU1fV2FpdCgxMCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZQotCQkgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkxpc3RQbG10Lk1vZGUsZGF0YSB8IFJDVl9MSVNUX1BMTVRfTU9ERV9FTkFCTEUpOwotCQlicmVhazsKKwkJY2FzZSBUM19CTE9DS19SWF9MSVNUX1BMTVQ6CisJCQlkYXRhID0gUkVHX1JEIChwRGV2aWNlLCBSY3ZMaXN0UGxtdC5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+UkNWX0xJU1RfUExNVF9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIFJjdkxpc3RQbG10Lk1vZGUsIGRhdGEpOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQgKHBEZXZpY2UsIFJjdkxpc3RQbG10Lk1vZGUpCisJCQkJCSAgICAgJiBSQ1ZfTElTVF9QTE1UX01PREVfRU5BQkxFKSkKKwkJCQkJCWJyZWFrOworCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJUkVHX1dSIChwRGV2aWNlLCBSY3ZMaXN0UGxtdC5Nb2RlLAorCQkJCQlkYXRhIHwgUkNWX0xJU1RfUExNVF9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX1JYX0xJU1RfU0VMRUNUT1I6Ci0JCWRhdGEgPSBSRUdfUkQocERldmljZSwgUmN2TGlzdFNlbC5Nb2RlKTsKLQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpCi0JCXsKLQkJICAgIGRhdGEgJj0gflJDVl9MSVNUX1NFTF9NT0RFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBSY3ZMaXN0U2VsLk1vZGUsZGF0YSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBSY3ZMaXN0U2VsLk1vZGUpICYgUkNWX0xJU1RfU0VMX01PREVfRU5BQkxFKSkKLQkJCSAgICBicmVhazsKLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIFJFR19XUihwRGV2aWNlLCBSY3ZMaXN0U2VsLk1vZGUsZGF0YSB8UkNWX0xJU1RfU0VMX01PREVfRU5BQkxFKTsKLQkJYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfUlhfTElTVF9TRUxFQ1RPUjoKKwkJCWRhdGEgPSBSRUdfUkQgKHBEZXZpY2UsIFJjdkxpc3RTZWwuTW9kZSk7CisJCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkgeworCQkJCWRhdGEgJj0gflJDVl9MSVNUX1NFTF9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIFJjdkxpc3RTZWwuTW9kZSwgZGF0YSk7CisJCQkJZm9yIChqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykgeworCQkJCQlpZiAoIQorCQkJCQkgICAgKFJFR19SRCAocERldmljZSwgUmN2TGlzdFNlbC5Nb2RlKSAmCisJCQkJCSAgICAgUkNWX0xJU1RfU0VMX01PREVfRU5BQkxFKSkKKwkJCQkJCWJyZWFrOworCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJUkVHX1dSIChwRGV2aWNlLCBSY3ZMaXN0U2VsLk1vZGUsCisJCQkJCWRhdGEgfCBSQ1ZfTElTVF9TRUxfTU9ERV9FTkFCTEUpOworCQkJYnJlYWs7CiAKLQkgICAgY2FzZSBUM19CTE9DS19SWF9EQVRBX0lOSVRJQVRPUjoKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLCBSY3ZEYXRhQmRJbi5Nb2RlKTsKLQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpCi0JCXsKLQkJICAgIGRhdGEgJj0gflJDVl9EQVRBX0JEX0lOX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1vZGUsZGF0YSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBSY3ZEYXRhQmRJbi5Nb2RlKSAmIFJDVl9EQVRBX0JEX0lOX01PREVfRU5BQkxFKSkKLQkJCSAgICBicmVhazsKLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIFJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQmRJbi5Nb2RlLCBkYXRhIHwgUkNWX0RBVEFfQkRfSU5fTU9ERV9FTkFCTEUpOwotCQlicmVhazsKKwkJY2FzZSBUM19CTE9DS19SWF9EQVRBX0lOSVRJQVRPUjoKKwkJCWRhdGEgPSBSRUdfUkQgKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1vZGUpOworCQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpIHsKKwkJCQlkYXRhICY9IH5SQ1ZfREFUQV9CRF9JTl9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1vZGUsIGRhdGEpOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQgKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1vZGUpCisJCQkJCSAgICAgJiBSQ1ZfREFUQV9CRF9JTl9NT0RFX0VOQUJMRSkpCisJCQkJCQlicmVhazsKKwkJCQkJTU1fV2FpdCAoMTApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCVJFR19XUiAocERldmljZSwgUmN2RGF0YUJkSW4uTW9kZSwKKwkJCQkJZGF0YSB8IFJDVl9EQVRBX0JEX0lOX01PREVfRU5BQkxFKTsKKwkJCWJyZWFrOwogCi0JICAgIGNhc2UgVDNfQkxPQ0tfUlhfREFUQV9DT01QOgotCQlkYXRhID0gUkVHX1JEKHBEZXZpY2UsIFJjdkRhdGFDb21wLk1vZGUpOwotCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKLQkJewotCQkgICAgZGF0YSAmPSB+UkNWX0RBVEFfQ09NUF9NT0RFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQ29tcC5Nb2RlLGRhdGEpOwotCQkgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQotCQkgICAgewotCQkJaWYoIShSRUdfUkQocERldmljZSwgUmN2RGF0YUJkSW4uTW9kZSkgJiBSQ1ZfREFUQV9DT01QX01PREVfRU5BQkxFKSkKLQkJCSAgICBicmVhazsKLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIFJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQ29tcC5Nb2RlLGRhdGEgfCBSQ1ZfREFUQV9DT01QX01PREVfRU5BQkxFKTsKLQkJYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfUlhfREFUQV9DT01QOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgUmN2RGF0YUNvbXAuTW9kZSk7CisJCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkgeworCQkJCWRhdGEgJj0gflJDVl9EQVRBX0NPTVBfTU9ERV9FTkFCTEU7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBSY3ZEYXRhQ29tcC5Nb2RlLCBkYXRhKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKSB7CisJCQkJCWlmICghCisJCQkJCSAgICAoUkVHX1JEIChwRGV2aWNlLCBSY3ZEYXRhQmRJbi5Nb2RlKQorCQkJCQkgICAgICYgUkNWX0RBVEFfQ09NUF9NT0RFX0VOQUJMRSkpCisJCQkJCQlicmVhazsKKwkJCQkJTU1fV2FpdCAoMTApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCVJFR19XUiAocERldmljZSwgUmN2RGF0YUNvbXAuTW9kZSwKKwkJCQkJZGF0YSB8IFJDVl9EQVRBX0NPTVBfTU9ERV9FTkFCTEUpOworCQkJYnJlYWs7CiAKLQkgICAgY2FzZSBUM19CTE9DS19IT1NUX0NPQUxFU0lORzoKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLCBIb3N0Q29hbGVzY2UuTW9kZSk7Ci0JCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBkYXRhICY9IH5IT1NUX0NPQUxFU0NFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuTW9kZSwgZGF0YSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBTbmRCZEluLk1vZGUpICYgSE9TVF9DT0FMRVNDRV9FTkFCTEUpKQotCQkJICAgIGJyZWFrOwotCQkJTU1fV2FpdCgxMCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZQotCQkgICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5Nb2RlLCBkYXRhIHwgSE9TVF9DT0FMRVNDRV9FTkFCTEUpOwotCQlicmVhazsKKwkJY2FzZSBUM19CTE9DS19IT1NUX0NPQUxFU0lORzoKKwkJCWRhdGEgPSBSRUdfUkQgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+SE9TVF9DT0FMRVNDRV9FTkFCTEU7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBIb3N0Q29hbGVzY2UuTW9kZSwgZGF0YSk7CisJCQkJZm9yIChqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykgeworCQkJCQlpZiAoIQorCQkJCQkgICAgKFJFR19SRCAocERldmljZSwgU25kQmRJbi5Nb2RlKSAmCisJCQkJCSAgICAgSE9TVF9DT0FMRVNDRV9FTkFCTEUpKQorCQkJCQkJYnJlYWs7CisJCQkJCU1NX1dhaXQgKDEwKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5Nb2RlLAorCQkJCQlkYXRhIHwgSE9TVF9DT0FMRVNDRV9FTkFCTEUpOworCQkJYnJlYWs7CiAKLQkgICAgY2FzZSBUM19CTE9DS19NQUNfUlhfRU5HSU5FOgotCQlpZihjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBwRGV2aWNlLT5SeE1vZGUgJj0gflJYX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUnhNb2RlLCBwRGV2aWNlLT5SeE1vZGUpOwotCQkgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQotCQkgICAgewotCQkJaWYoIShSRUdfUkQocERldmljZSwgTWFjQ3RybC5SeE1vZGUpICYgUlhfTU9ERV9FTkFCTEUpKQotCQkJewotCQkJICAgIGJyZWFrOworCQljYXNlIFQzX0JMT0NLX01BQ19SWF9FTkdJTkU6CisJCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkgeworCQkJCXBEZXZpY2UtPlJ4TW9kZSAmPSB+UlhfTU9ERV9FTkFCTEU7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlJ4TW9kZSwKKwkJCQkJcERldmljZS0+UnhNb2RlKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKSB7CisJCQkJCWlmICghCisJCQkJCSAgICAoUkVHX1JEIChwRGV2aWNlLCBNYWNDdHJsLlJ4TW9kZSkgJgorCQkJCQkgICAgIFJYX01PREVfRU5BQkxFKSkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJTU1fV2FpdCAoMTApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcERldmljZS0+UnhNb2RlIHw9IFJYX01PREVfRU5BQkxFOworCQkJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5SeE1vZGUsCisJCQkJCXBEZXZpY2UtPlJ4TW9kZSk7CiAJCQl9Ci0JCQlNTV9XYWl0KDEwKTsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCXsKLQkJICAgIHBEZXZpY2UtPlJ4TW9kZSB8PSBSWF9NT0RFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJ4TW9kZSwgcERldmljZS0+UnhNb2RlKTsKLQkJfQotCQlicmVhazsKKwkJCWJyZWFrOwogCi0JICAgIGNhc2UgVDNfQkxPQ0tfTUJVRl9DTFVTVEVSX0ZSRUU6Ci0JCWRhdGEgPSBSRUdfUkQocERldmljZSwgTWJ1ZkNsdXN0ZXJGcmVlLk1vZGUpOwotCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKLQkJewotCQkgICAgZGF0YSAmPSB+TUJVRl9DTFVTVEVSX0ZSRUVfTU9ERV9FTkFCTEU7Ci0JCSAgICBSRUdfV1IocERldmljZSwgTWJ1ZkNsdXN0ZXJGcmVlLk1vZGUsZGF0YSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBNYnVmQ2x1c3RlckZyZWUuTW9kZSkgJiBNQlVGX0NMVVNURVJfRlJFRV9NT0RFX0VOQUJMRSkpCi0JCQkgICAgYnJlYWs7Ci0JCQlNTV9XYWl0KDEwKTsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCSAgICBSRUdfV1IocERldmljZSwgTWJ1ZkNsdXN0ZXJGcmVlLk1vZGUsIGRhdGEgfCBNQlVGX0NMVVNURVJfRlJFRV9NT0RFX0VOQUJMRSk7Ci0JCWJyZWFrOworCQljYXNlIFQzX0JMT0NLX01CVUZfQ0xVU1RFUl9GUkVFOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgTWJ1ZkNsdXN0ZXJGcmVlLk1vZGUpOworCQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpIHsKKwkJCQlkYXRhICY9IH5NQlVGX0NMVVNURVJfRlJFRV9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIE1idWZDbHVzdGVyRnJlZS5Nb2RlLCBkYXRhKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKSB7CisJCQkJCWlmICghCisJCQkJCSAgICAoUkVHX1JECisJCQkJCSAgICAgKHBEZXZpY2UsCisJCQkJCSAgICAgIE1idWZDbHVzdGVyRnJlZS4KKwkJCQkJICAgICAgTW9kZSkgJgorCQkJCQkgICAgIE1CVUZfQ0xVU1RFUl9GUkVFX01PREVfRU5BQkxFKSkKKwkJCQkJCWJyZWFrOworCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJUkVHX1dSIChwRGV2aWNlLCBNYnVmQ2x1c3RlckZyZWUuTW9kZSwKKwkJCQkJZGF0YSB8IE1CVUZfQ0xVU1RFUl9GUkVFX01PREVfRU5BQkxFKTsKKwkJCWJyZWFrOwogCi0JICAgIGNhc2UgVDNfQkxPQ0tfU0VORF9CRF9JTklUSUFUT1I6Ci0JCWRhdGEgPSBSRUdfUkQocERldmljZSwgU25kQmRJbi5Nb2RlKTsKLQkJaWYgKGNudHJsID09IExNX0RJU0FCTEUpCi0JCXsKLQkJICAgIGRhdGEgJj0gflNORF9CRF9JTl9NT0RFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBTbmRCZEluLk1vZGUsIGRhdGEpOwotCQkgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQotCQkgICAgewotCQkJaWYoIShSRUdfUkQocERldmljZSwgU25kQmRJbi5Nb2RlKSAmIFNORF9CRF9JTl9NT0RFX0VOQUJMRSkpCi0JCQkgICAgYnJlYWs7Ci0JCQlNTV9XYWl0KDEwKTsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCSAgICBSRUdfV1IocERldmljZSwgU25kQmRJbi5Nb2RlLCBkYXRhICB8IFNORF9CRF9JTl9NT0RFX0VOQUJMRSk7Ci0JCWJyZWFrOworCQljYXNlIFQzX0JMT0NLX1NFTkRfQkRfSU5JVElBVE9SOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgU25kQmRJbi5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+U05EX0JEX0lOX01PREVfRU5BQkxFOworCQkJCVJFR19XUiAocERldmljZSwgU25kQmRJbi5Nb2RlLCBkYXRhKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKSB7CisJCQkJCWlmICghCisJCQkJCSAgICAoUkVHX1JEIChwRGV2aWNlLCBTbmRCZEluLk1vZGUpICYKKwkJCQkJICAgICBTTkRfQkRfSU5fTU9ERV9FTkFCTEUpKQorCQkJCQkJYnJlYWs7CisJCQkJCU1NX1dhaXQgKDEwKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIFNuZEJkSW4uTW9kZSwKKwkJCQkJZGF0YSB8IFNORF9CRF9JTl9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX1NFTkRfQkRfQ09NUDoKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLCBTbmRCZENvbXAuTW9kZSk7Ci0JCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBkYXRhICY9IH5TTkRfQkRfQ09NUF9NT0RFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBTbmRCZENvbXAuTW9kZSwgZGF0YSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBTbmRCZENvbXAuTW9kZSkgJiBTTkRfQkRfQ09NUF9NT0RFX0VOQUJMRSkpCi0JCQkgICAgYnJlYWs7Ci0JCQlNTV9XYWl0KDEwKTsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCSAgICBSRUdfV1IocERldmljZSwgU25kQmRDb21wLk1vZGUsIGRhdGEgfCBTTkRfQkRfQ09NUF9NT0RFX0VOQUJMRSk7Ci0JCWJyZWFrOworCQljYXNlIFQzX0JMT0NLX1NFTkRfQkRfQ09NUDoKKwkJCWRhdGEgPSBSRUdfUkQgKHBEZXZpY2UsIFNuZEJkQ29tcC5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+U05EX0JEX0NPTVBfTU9ERV9FTkFCTEU7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBTbmRCZENvbXAuTW9kZSwgZGF0YSk7CisJCQkJZm9yIChqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykgeworCQkJCQlpZiAoIQorCQkJCQkgICAgKFJFR19SRCAocERldmljZSwgU25kQmRDb21wLk1vZGUpICYKKwkJCQkJICAgICBTTkRfQkRfQ09NUF9NT0RFX0VOQUJMRSkpCisJCQkJCQlicmVhazsKKwkJCQkJTU1fV2FpdCAoMTApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCVJFR19XUiAocERldmljZSwgU25kQmRDb21wLk1vZGUsCisJCQkJCWRhdGEgfCBTTkRfQkRfQ09NUF9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX1NFTkRfQkRfU0VMRUNUT1I6Ci0JCWRhdGEgPSBSRUdfUkQocERldmljZSwgU25kQmRTZWwuTW9kZSk7Ci0JCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBkYXRhICY9IH5TTkRfQkRfU0VMX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIFNuZEJkU2VsLk1vZGUsIGRhdGEpOwotCQkgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQotCQkgICAgewotCQkJaWYoIShSRUdfUkQocERldmljZSwgU25kQmRTZWwuTW9kZSkgJiBTTkRfQkRfU0VMX01PREVfRU5BQkxFKSkKLQkJCSAgICBicmVhazsKLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIFJFR19XUihwRGV2aWNlLCBTbmRCZFNlbC5Nb2RlLCBkYXRhIHwgU05EX0JEX1NFTF9NT0RFX0VOQUJMRSk7Ci0JCWJyZWFrOworCQljYXNlIFQzX0JMT0NLX1NFTkRfQkRfU0VMRUNUT1I6CisJCQlkYXRhID0gUkVHX1JEIChwRGV2aWNlLCBTbmRCZFNlbC5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+U05EX0JEX1NFTF9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIFNuZEJkU2VsLk1vZGUsIGRhdGEpOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQgKHBEZXZpY2UsIFNuZEJkU2VsLk1vZGUpICYKKwkJCQkJICAgICBTTkRfQkRfU0VMX01PREVfRU5BQkxFKSkKKwkJCQkJCWJyZWFrOworCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJUkVHX1dSIChwRGV2aWNlLCBTbmRCZFNlbC5Nb2RlLAorCQkJCQlkYXRhIHwgU05EX0JEX1NFTF9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX1NFTkRfREFUQV9JTklUSUFUT1I6Ci0JCWRhdGEgPSBSRUdfUkQocERldmljZSwgU25kRGF0YUluLk1vZGUpOwotCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKLQkJewotCQkgICAgZGF0YSAmPSB+VDNfU05EX0RBVEFfSU5fTU9ERV9FTkFCTEU7Ci0JCSAgICBSRUdfV1IocERldmljZSwgU25kRGF0YUluLk1vZGUsZGF0YSk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspCi0JCSAgICB7Ci0JCQlpZighKFJFR19SRChwRGV2aWNlLCBTbmREYXRhSW4uTW9kZSkgJiBUM19TTkRfREFUQV9JTl9NT0RFX0VOQUJMRSkpCi0JCQkgICAgYnJlYWs7Ci0JCQlNTV9XYWl0KDEwKTsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCSAgICBSRUdfV1IocERldmljZSwgU25kRGF0YUluLk1vZGUsZGF0YSB8IFQzX1NORF9EQVRBX0lOX01PREVfRU5BQkxFKTsKLQkJYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfU0VORF9EQVRBX0lOSVRJQVRPUjoKKwkJCWRhdGEgPSBSRUdfUkQgKHBEZXZpY2UsIFNuZERhdGFJbi5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+VDNfU05EX0RBVEFfSU5fTU9ERV9FTkFCTEU7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBTbmREYXRhSW4uTW9kZSwgZGF0YSk7CisJCQkJZm9yIChqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykgeworCQkJCQlpZiAoIQorCQkJCQkgICAgKFJFR19SRCAocERldmljZSwgU25kRGF0YUluLk1vZGUpICYKKwkJCQkJICAgICBUM19TTkRfREFUQV9JTl9NT0RFX0VOQUJMRSkpCisJCQkJCQlicmVhazsKKwkJCQkJTU1fV2FpdCAoMTApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCVJFR19XUiAocERldmljZSwgU25kRGF0YUluLk1vZGUsCisJCQkJCWRhdGEgfCBUM19TTkRfREFUQV9JTl9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX1NFTkRfREFUQV9DT01QOgotCQlkYXRhID0gUkVHX1JEKHBEZXZpY2UsIFNuZERhdGFDb21wLk1vZGUpOwotCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKLQkJewotCQkgICAgZGF0YSAmPSB+U05EX0RBVEFfQ09NUF9NT0RFX0VOQUJMRTsKLQkJICAgIFJFR19XUihwRGV2aWNlLCBTbmREYXRhQ29tcC5Nb2RlLCBkYXRhKTsKLQkJICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKLQkJICAgIHsKLQkJCWlmKCEoUkVHX1JEKHBEZXZpY2UsIFNuZERhdGFDb21wLk1vZGUpICYgU05EX0RBVEFfQ09NUF9NT0RFX0VOQUJMRSkpCi0JCQkgICAgYnJlYWs7Ci0JCQlNTV9XYWl0KDEwKTsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCSAgICBSRUdfV1IocERldmljZSwgU25kRGF0YUNvbXAuTW9kZSxkYXRhIHwgU05EX0RBVEFfQ09NUF9NT0RFX0VOQUJMRSk7Ci0JCWJyZWFrOworCQljYXNlIFQzX0JMT0NLX1NFTkRfREFUQV9DT01QOgorCQkJZGF0YSA9IFJFR19SRCAocERldmljZSwgU25kRGF0YUNvbXAuTW9kZSk7CisJCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkgeworCQkJCWRhdGEgJj0gflNORF9EQVRBX0NPTVBfTU9ERV9FTkFCTEU7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBTbmREYXRhQ29tcC5Nb2RlLCBkYXRhKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKSB7CisJCQkJCWlmICghCisJCQkJCSAgICAoUkVHX1JEIChwRGV2aWNlLCBTbmREYXRhQ29tcC5Nb2RlKQorCQkJCQkgICAgICYgU05EX0RBVEFfQ09NUF9NT0RFX0VOQUJMRSkpCisJCQkJCQlicmVhazsKKwkJCQkJTU1fV2FpdCAoMTApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCVJFR19XUiAocERldmljZSwgU25kRGF0YUNvbXAuTW9kZSwKKwkJCQkJZGF0YSB8IFNORF9EQVRBX0NPTVBfTU9ERV9FTkFCTEUpOworCQkJYnJlYWs7CiAKLQkgICAgY2FzZSBUM19CTE9DS19NQUNfVFhfRU5HSU5FOgotCQlpZihjbnRybCA9PSBMTV9ESVNBQkxFKQotCQl7Ci0JCSAgICBwRGV2aWNlLT5UeE1vZGUgJj0gflRYX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuVHhNb2RlLCBwRGV2aWNlLT5UeE1vZGUpOwotCQkgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQotCQkgICAgewotCQkJaWYoIShSRUdfUkQocERldmljZSwgTWFjQ3RybC5UeE1vZGUpICYgVFhfTU9ERV9FTkFCTEUpKQotCQkJICAgIGJyZWFrOwotCQkJTU1fV2FpdCgxMCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCSAgICBwRGV2aWNlLT5UeE1vZGUgfD0gVFhfTU9ERV9FTkFCTEU7Ci0JCSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5UeE1vZGUsIHBEZXZpY2UtPlR4TW9kZSk7Ci0JCX0KLQkJYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfTUFDX1RYX0VOR0lORToKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJcERldmljZS0+VHhNb2RlICY9IH5UWF9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuVHhNb2RlLAorCQkJCQlwRGV2aWNlLT5UeE1vZGUpOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQgKHBEZXZpY2UsIE1hY0N0cmwuVHhNb2RlKSAmCisJCQkJCSAgICAgVFhfTU9ERV9FTkFCTEUpKQorCQkJCQkJYnJlYWs7CisJCQkJCU1NX1dhaXQgKDEwKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXBEZXZpY2UtPlR4TW9kZSB8PSBUWF9NT0RFX0VOQUJMRTsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuVHhNb2RlLAorCQkJCQlwRGV2aWNlLT5UeE1vZGUpOworCQkJfQorCQkJYnJlYWs7CiAKLQkgICAgY2FzZSBUM19CTE9DS19NRU1fQVJCSVRPUjoKLQkJZGF0YSA9IFJFR19SRChwRGV2aWNlLCBNZW1BcmJpdGVyLk1vZGUpOwotCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKLQkJewotCQkgICAgZGF0YSAmPSB+VDNfTUVNX0FSQklURVJfTU9ERV9FTkFCTEU7Ci0JCSAgICBSRUdfV1IocERldmljZSwgTWVtQXJiaXRlci5Nb2RlLCBkYXRhKTsKLQkJICAgIGZvcihqID0gMDsgaiA8IE1heFdhaXRDbnQ7IGorKykKLQkJICAgIHsKLQkJCWlmKCEoUkVHX1JEKHBEZXZpY2UsIE1lbUFyYml0ZXIuTW9kZSkgJiBUM19NRU1fQVJCSVRFUl9NT0RFX0VOQUJMRSkpCi0JCQkgICAgYnJlYWs7Ci0JCQlNTV9XYWl0KDEwKTsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCSAgICBSRUdfV1IocERldmljZSwgTWVtQXJiaXRlci5Nb2RlLGRhdGF8VDNfTUVNX0FSQklURVJfTU9ERV9FTkFCTEUpOwotCQlicmVhazsKKwkJY2FzZSBUM19CTE9DS19NRU1fQVJCSVRPUjoKKwkJCWRhdGEgPSBSRUdfUkQgKHBEZXZpY2UsIE1lbUFyYml0ZXIuTW9kZSk7CisJCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkgeworCQkJCWRhdGEgJj0gflQzX01FTV9BUkJJVEVSX01PREVfRU5BQkxFOworCQkJCVJFR19XUiAocERldmljZSwgTWVtQXJiaXRlci5Nb2RlLCBkYXRhKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKSB7CisJCQkJCWlmICghCisJCQkJCSAgICAoUkVHX1JEIChwRGV2aWNlLCBNZW1BcmJpdGVyLk1vZGUpICYKKwkJCQkJICAgICBUM19NRU1fQVJCSVRFUl9NT0RFX0VOQUJMRSkpCisJCQkJCQlicmVhazsKKwkJCQkJTU1fV2FpdCAoMTApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCVJFR19XUiAocERldmljZSwgTWVtQXJiaXRlci5Nb2RlLAorCQkJCQlkYXRhIHwgVDNfTUVNX0FSQklURVJfTU9ERV9FTkFCTEUpOworCQkJYnJlYWs7CiAKLQkgICAgY2FzZSBUM19CTE9DS19NQlVGX01BTkFHRVI6Ci0JCWRhdGEgPSBSRUdfUkQocERldmljZSwgQnVmTWdyLk1vZGUpOwotCQlpZiAoY250cmwgPT0gTE1fRElTQUJMRSkKLQkJewotCQkgICAgZGF0YSAmPSB+QlVGTUdSX01PREVfRU5BQkxFOwotCQkgICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5Nb2RlLGRhdGEpOwotCQkgICAgZm9yKGogPSAwOyBqIDwgTWF4V2FpdENudDsgaisrKQotCQkgICAgewotCQkJaWYoIShSRUdfUkQocERldmljZSwgQnVmTWdyLk1vZGUpICYgQlVGTUdSX01PREVfRU5BQkxFKSkKLQkJCSAgICBicmVhazsKLQkJCU1NX1dhaXQoMTApOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIFJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTW9kZSxkYXRhIHwgIEJVRk1HUl9NT0RFX0VOQUJMRSk7Ci0JCWJyZWFrOworCQljYXNlIFQzX0JMT0NLX01CVUZfTUFOQUdFUjoKKwkJCWRhdGEgPSBSRUdfUkQgKHBEZXZpY2UsIEJ1Zk1nci5Nb2RlKTsKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJZGF0YSAmPSB+QlVGTUdSX01PREVfRU5BQkxFOworCQkJCVJFR19XUiAocERldmljZSwgQnVmTWdyLk1vZGUsIGRhdGEpOworCQkJCWZvciAoaiA9IDA7IGogPCBNYXhXYWl0Q250OyBqKyspIHsKKwkJCQkJaWYgKCEKKwkJCQkJICAgIChSRUdfUkQgKHBEZXZpY2UsIEJ1Zk1nci5Nb2RlKSAmCisJCQkJCSAgICAgQlVGTUdSX01PREVfRU5BQkxFKSkKKwkJCQkJCWJyZWFrOworCQkJCQlNTV9XYWl0ICgxMCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJUkVHX1dSIChwRGV2aWNlLCBCdWZNZ3IuTW9kZSwKKwkJCQkJZGF0YSB8IEJVRk1HUl9NT0RFX0VOQUJMRSk7CisJCQlicmVhazsKIAotCSAgICBjYXNlIFQzX0JMT0NLX01BQ19HTE9CQUw6Ci0JCWlmKGNudHJsID09IExNX0RJU0FCTEUpCi0JCXsKLQkJICAgIHBEZXZpY2UtPk1hY01vZGUgJj0gfihNQUNfTU9ERV9FTkFCTEVfVERFIHwKLQkJCU1BQ19NT0RFX0VOQUJMRV9SREUgfAotCQkJTUFDX01PREVfRU5BQkxFX0ZIREUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkgICAgcERldmljZS0+TWFjTW9kZSB8PSAoTUFDX01PREVfRU5BQkxFX1RERSB8Ci0JCQlNQUNfTU9ERV9FTkFCTEVfUkRFIHwKLQkJCU1BQ19NT0RFX0VOQUJMRV9GSERFKTsKLQkJfQotCQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5Nb2RlLCBwRGV2aWNlLT5NYWNNb2RlKTsKLQkJYnJlYWs7CisJCWNhc2UgVDNfQkxPQ0tfTUFDX0dMT0JBTDoKKwkJCWlmIChjbnRybCA9PSBMTV9ESVNBQkxFKSB7CisJCQkJcERldmljZS0+TWFjTW9kZSAmPSB+KE1BQ19NT0RFX0VOQUJMRV9UREUgfAorCQkJCQkJICAgICAgTUFDX01PREVfRU5BQkxFX1JERSB8CisJCQkJCQkgICAgICBNQUNfTU9ERV9FTkFCTEVfRkhERSk7CisJCQl9IGVsc2UgeworCQkJCXBEZXZpY2UtPk1hY01vZGUgfD0gKE1BQ19NT0RFX0VOQUJMRV9UREUgfAorCQkJCQkJICAgICBNQUNfTU9ERV9FTkFCTEVfUkRFIHwKKwkJCQkJCSAgICAgTUFDX01PREVfRU5BQkxFX0ZIREUpOworCQkJfQorCQkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUpOworCQkJYnJlYWs7CiAKLQkgICAgZGVmYXVsdDoKLQkJcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotCX0gLyogc3dpdGNoICovCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJCX0JCS8qIHN3aXRjaCAqLwogCi0JaWYoaiA+PSBNYXhXYWl0Q250KQotCXsKLQkgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworCQlpZiAoaiA+PSBNYXhXYWl0Q250KSB7CisJCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJCX0KIAl9Ci0gICAgfQogCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIyOTUsNjgyICsyMTI5LDYzMSBAQAogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIExNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fU1RBVFVTCi1MTV9SZXNldEFkYXB0ZXIoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCitMTV9TVEFUVVMgTE1fUmVzZXRBZGFwdGVyIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCiB7Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7Ci0gICAgTE1fVUlOVDE2IFZhbHVlMTY7Ci0gICAgTE1fVUlOVDMyIGosIGs7CisJTE1fVUlOVDMyIFZhbHVlMzI7CisJTE1fVUlOVDE2IFZhbHVlMTY7CisJTE1fVUlOVDMyIGosIGs7CiAKLSAgICAvKiBEaXNhYmxlIGludGVycnVwdC4gKi8KLSAgICBMTV9EaXNhYmxlSW50ZXJydXB0KHBEZXZpY2UpOworCS8qIERpc2FibGUgaW50ZXJydXB0LiAqLworCUxNX0Rpc2FibGVJbnRlcnJ1cHQgKHBEZXZpY2UpOwogCi0gICAgLyogTWF5IGdldCBhIHNwdXJpb3VzIGludGVycnVwdCAqLwotICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgPSBTVEFUVVNfQkxPQ0tfVVBEQVRFRDsKKwkvKiBNYXkgZ2V0IGEgc3B1cmlvdXMgaW50ZXJydXB0ICovCisJcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1cyA9IFNUQVRVU19CTE9DS19VUERBVEVEOwogCi0gICAgLyogRGlzYWJsZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBETUEgZW5naW5lcy4gIEFib3J0IGFsbCBwZW5kaW5nIHJlcXVlc3RzLiAqLwotICAgIGlmKHBEZXZpY2UtPkluaXREb25lKQotICAgIHsKLQlMTV9BYm9ydChwRGV2aWNlKTsKLSAgICB9Ci0KLSAgICBwRGV2aWNlLT5TaHV0dGluZ0Rvd24gPSBGQUxTRTsKLQotICAgIExNX1Jlc2V0Q2hpcChwRGV2aWNlKTsKLQotICAgIC8qIEJ1ZzogQXRobG9uIGZpeCBmb3IgQjMgc2lsaWNvbiBvbmx5LiAgVGhpcyBiaXQgZG9lcyBub3QgZG8gYW55dGhpbmcgKi8KLSAgICAvKiBpbiBvdGhlciBjaGlwIHJldmlzaW9ucy4gKi8KLSAgICBpZihwRGV2aWNlLT5EZWxheVBjaUdyYW50KQotICAgIHsKLQlWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwpOwotCVJFR19XUihwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsLCBWYWx1ZTMyIHwgQklUXzMxKTsKLSAgICB9Ci0KLSAgICBpZihwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzA0X0EwKQotICAgIHsKLQlpZiAoIShwRGV2aWNlLT5QY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9DT05WRU5USU9OQUxfUENJX01PREUpKQotCXsKLQkgICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBQY2lDZmcuUGNpU3RhdGUpOwotCSAgICBWYWx1ZTMyIHw9IFQzX1BDSV9TVEFURV9SRVRSWV9TQU1FX0RNQTsKLQkgICAgUkVHX1dSKHBEZXZpY2UsIFBjaUNmZy5QY2lTdGF0ZSwgVmFsdWUzMik7CisJLyogRGlzYWJsZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBETUEgZW5naW5lcy4gIEFib3J0IGFsbCBwZW5kaW5nIHJlcXVlc3RzLiAqLworCWlmIChwRGV2aWNlLT5Jbml0RG9uZSkgeworCQlMTV9BYm9ydCAocERldmljZSk7CiAJfQotICAgIH0KIAotICAgIC8qIEVuYWJsZSBUYWdnZWRTdGF0dXMgbW9kZS4gKi8KLSAgICBpZihwRGV2aWNlLT5Vc2VUYWdnZWRTdGF0dXMpCi0gICAgewotCXBEZXZpY2UtPk1pc2NIb3N0Q3RybCB8PSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfVEFHR0VEX1NUQVRVU19NT0RFOwotICAgIH0KKwlwRGV2aWNlLT5TaHV0dGluZ0Rvd24gPSBGQUxTRTsKIAotICAgIC8qIFJlc3RvcmUgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAqLwotICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgUENJX0NBQ0hFX0xJTkVfU0laRV9SRUcsCi0JcERldmljZS0+U2F2ZWRDYWNoZUxpbmVSZWcpOwotICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSURfUkVHLAotCShwRGV2aWNlLT5TdWJzeXN0ZW1JZCA8PCAxNikgfCBwRGV2aWNlLT5TdWJzeXN0ZW1WZW5kb3JJZCk7CisJTE1fUmVzZXRDaGlwIChwRGV2aWNlKTsKIAotICAgIC8qIENsZWFyIHRoZSBzdGF0aXN0aWNzIGJsb2NrLiAqLwotICAgIGZvcihqID0gMHgwMzAwOyBqIDwgMHgwYjAwOyBqKyspCi0gICAgewotCU1FTV9XUl9PRkZTRVQocERldmljZSwgaiwgMCk7Ci0gICAgfQorCS8qIEJ1ZzogQXRobG9uIGZpeCBmb3IgQjMgc2lsaWNvbiBvbmx5LiAgVGhpcyBiaXQgZG9lcyBub3QgZG8gYW55dGhpbmcgKi8KKwkvKiBpbiBvdGhlciBjaGlwIHJldmlzaW9ucy4gKi8KKwlpZiAocERldmljZS0+RGVsYXlQY2lHcmFudCkgeworCQlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsKTsKKwkJUkVHX1dSIChwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsLCBWYWx1ZTMyIHwgQklUXzMxKTsKKwl9CiAKLSAgICAvKiBJbml0aWFsaXplIHRoZSBzdGF0aXN0aXMgQmxvY2sgKi8KLSAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzID0gMDsKLSAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+UmN2U3RkQ29uSWR4ID0gMDsKLSAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+UmN2SnVtYm9Db25JZHggPSAwOwotICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5SY3ZNaW5pQ29uSWR4ID0gMDsKKwlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwNF9BMCkgeworCQlpZiAoIShwRGV2aWNlLT5QY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9DT05WRU5USU9OQUxfUENJX01PREUpKSB7CisJCQlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBQY2lDZmcuUGNpU3RhdGUpOworCQkJVmFsdWUzMiB8PSBUM19QQ0lfU1RBVEVfUkVUUllfU0FNRV9ETUE7CisJCQlSRUdfV1IgKHBEZXZpY2UsIFBjaUNmZy5QY2lTdGF0ZSwgVmFsdWUzMik7CisJCX0KKwl9CiAKLSAgICBmb3IoaiA9IDA7IGogPCAxNjsgaisrKQotICAgIHsKLSAgICAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+SWR4W2pdLlJjdlByb2RJZHggPSAwOwotICAgICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5JZHhbal0uU2VuZENvbklkeCA9IDA7Ci0gICAgfQorCS8qIEVuYWJsZSBUYWdnZWRTdGF0dXMgbW9kZS4gKi8KKwlpZiAocERldmljZS0+VXNlVGFnZ2VkU3RhdHVzKSB7CisJCXBEZXZpY2UtPk1pc2NIb3N0Q3RybCB8PQorCQkgICAgTUlTQ19IT1NUX0NUUkxfRU5BQkxFX1RBR0dFRF9TVEFUVVNfTU9ERTsKKwl9CiAKLSAgICBmb3IoayA9IDA7IGsgPCBUM19TVERfUkNWX1JDQl9FTlRSWV9DT1VOVCA7aysrKQotICAgIHsKLSAgICAgICBwRGV2aWNlLT5wUnhTdGRCZFZpcnRba10uSG9zdEFkZHIuSGlnaCA9IDA7Ci0gICAgICAgcERldmljZS0+cFJ4U3RkQmRWaXJ0W2tdLkhvc3RBZGRyLkxvdyA9IDA7Ci0gICAgfQorCS8qIFJlc3RvcmUgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAqLworCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFBDSV9DQUNIRV9MSU5FX1NJWkVfUkVHLAorCQkJICBwRGV2aWNlLT5TYXZlZENhY2hlTGluZVJlZyk7CisJTU1fV3JpdGVDb25maWczMiAocERldmljZSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSURfUkVHLAorCQkJICAocERldmljZS0+U3Vic3lzdGVtSWQgPDwgMTYpIHwgcERldmljZS0+CisJCQkgIFN1YnN5c3RlbVZlbmRvcklkKTsKKworCS8qIENsZWFyIHRoZSBzdGF0aXN0aWNzIGJsb2NrLiAqLworCWZvciAoaiA9IDB4MDMwMDsgaiA8IDB4MGIwMDsgaisrKSB7CisJCU1FTV9XUl9PRkZTRVQgKHBEZXZpY2UsIGosIDApOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIHN0YXRpc3RpcyBCbG9jayAqLworCXBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgPSAwOworCXBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5SY3ZTdGRDb25JZHggPSAwOworCXBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5SY3ZKdW1ib0NvbklkeCA9IDA7CisJcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdk1pbmlDb25JZHggPSAwOworCisJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPklkeFtqXS5SY3ZQcm9kSWR4ID0gMDsKKwkJcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPklkeFtqXS5TZW5kQ29uSWR4ID0gMDsKKwl9CisKKwlmb3IgKGsgPSAwOyBrIDwgVDNfU1REX1JDVl9SQ0JfRU5UUllfQ09VTlQ7IGsrKykgeworCQlwRGV2aWNlLT5wUnhTdGRCZFZpcnRba10uSG9zdEFkZHIuSGlnaCA9IDA7CisJCXBEZXZpY2UtPnBSeFN0ZEJkVmlydFtrXS5Ib3N0QWRkci5Mb3cgPSAwOworCX0KIAogI2lmIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQKLSAgICAvKiBSZWNlaXZlIGp1bWJvIEJEIGJ1ZmZlci4gKi8KLSAgICBmb3IoayA9IDA7IGsgPCBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UOyBrKyspCi0gICAgewotCXBEZXZpY2UtPnBSeEp1bWJvQmRWaXJ0W2tdLkhvc3RBZGRyLkhpZ2ggPSAwOwotCXBEZXZpY2UtPnBSeEp1bWJvQmRWaXJ0W2tdLkhvc3RBZGRyLkxvdyA9IDA7Ci0gICAgfQorCS8qIFJlY2VpdmUganVtYm8gQkQgYnVmZmVyLiAqLworCWZvciAoayA9IDA7IGsgPCBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UOyBrKyspIHsKKwkJcERldmljZS0+cFJ4SnVtYm9CZFZpcnRba10uSG9zdEFkZHIuSGlnaCA9IDA7CisJCXBEZXZpY2UtPnBSeEp1bWJvQmRWaXJ0W2tdLkhvc3RBZGRyLkxvdyA9IDA7CisJfQogI2VuZGlmCiAKLSAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLkRtYVJlYWRXcml0ZUN0cmwsIHBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwpOworCVJFR19XUiAocERldmljZSwgUGNpQ2ZnLkRtYVJlYWRXcml0ZUN0cmwsIHBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwpOwogCi0gICAgLyogR1JDIG1vZGUgY29udHJvbCByZWdpc3Rlci4gKi8KLSNpZmRlZiBCSUdfRU5ESUFOX1BDSSAgICAvKiBKaW1teSwgdGhpcyBpZmRlZiBibG9jayBkZWxldGVkIGluIG5ldyBjb2RlISAqLwotICAgIFZhbHVlMzIgPQotCUdSQ19NT0RFX1dPUkRfU1dBUF9EQVRBIHwKLQlHUkNfTU9ERV9XT1JEX1NXQVBfTk9OX0ZSQU1FX0RBVEEgfAotCUdSQ19NT0RFX0lOVF9PTl9NQUNfQVRUTiB8Ci0JR1JDX01PREVfSE9TVF9TVEFDS19VUDsKKwkvKiBHUkMgbW9kZSBjb250cm9sIHJlZ2lzdGVyLiAqLworI2lmZGVmIEJJR19FTkRJQU5fUENJCQkvKiBKaW1teSwgdGhpcyBpZmRlZiBibG9jayBkZWxldGVkIGluIG5ldyBjb2RlISAqLworCVZhbHVlMzIgPQorCSAgICBHUkNfTU9ERV9XT1JEX1NXQVBfREFUQSB8CisJICAgIEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQSB8CisJICAgIEdSQ19NT0RFX0lOVF9PTl9NQUNfQVRUTiB8IEdSQ19NT0RFX0hPU1RfU1RBQ0tfVVA7CiAjZWxzZQotICAgIC8qIE5vIENQVSBTd2FwIG1vZGVzIGZvciBQQ0kgSU8gKi8KLSAgICBWYWx1ZTMyID0KKwkvKiBObyBDUFUgU3dhcCBtb2RlcyBmb3IgUENJIElPICovCisJVmFsdWUzMiA9CiAjaWZkZWYgQklHX0VORElBTl9IT1NUCi0JR1JDX01PREVfQllURV9TV0FQX05PTl9GUkFNRV9EQVRBIHwKLQlHUkNfTU9ERV9XT1JEX1NXQVBfTk9OX0ZSQU1FX0RBVEEgfAotCUdSQ19NT0RFX0JZVEVfU1dBUF9EQVRBIHwKLQlHUkNfTU9ERV9XT1JEX1NXQVBfREFUQSB8CisJICAgIEdSQ19NT0RFX0JZVEVfU1dBUF9OT05fRlJBTUVfREFUQSB8CisJICAgIEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQSB8CisJICAgIEdSQ19NT0RFX0JZVEVfU1dBUF9EQVRBIHwgR1JDX01PREVfV09SRF9TV0FQX0RBVEEgfAogI2Vsc2UKLQlHUkNfTU9ERV9XT1JEX1NXQVBfTk9OX0ZSQU1FX0RBVEEgfAotCUdSQ19NT0RFX0JZVEVfU1dBUF9EQVRBIHwKLQlHUkNfTU9ERV9XT1JEX1NXQVBfREFUQSB8CisJICAgIEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQSB8CisJICAgIEdSQ19NT0RFX0JZVEVfU1dBUF9EQVRBIHwgR1JDX01PREVfV09SRF9TV0FQX0RBVEEgfAogI2VuZGlmCi0JR1JDX01PREVfSU5UX09OX01BQ19BVFROIHwKLQlHUkNfTU9ERV9IT1NUX1NUQUNLX1VQOwotI2VuZGlmIC8qICFCSUdfRU5ESUFOX1BDSSAqLworCSAgICBHUkNfTU9ERV9JTlRfT05fTUFDX0FUVE4gfCBHUkNfTU9ERV9IT1NUX1NUQUNLX1VQOworI2VuZGlmCQkJCS8qICFCSUdfRU5ESUFOX1BDSSAqLwogCi0gICAgLyogQ29uZmlndXJlIHNlbmQgQkQgbW9kZS4gKi8KLSAgICBpZihwRGV2aWNlLT5OaWNTZW5kQmQgPT0gRkFMU0UpCi0gICAgewotCVZhbHVlMzIgfD0gR1JDX01PREVfSE9TVF9TRU5EX0JEUzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlWYWx1ZTMyIHw9IEdSQ19NT0RFXzRYX05JQ19CQVNFRF9TRU5EX1JJTkdTOwotICAgIH0KLQotICAgIC8qIENvbmZpZ3VyZSBwc2V1ZG8gY2hlY2tzdW0gbW9kZS4gKi8KLSAgICBpZihwRGV2aWNlLT5Ob1R4UHNldWRvSGRyQ2hrc3VtKQotICAgIHsKLQlWYWx1ZTMyIHw9IEdSQ19NT0RFX1RYX05PX1BTRVVET19IRUFERVJfQ0hLU1VNOwotICAgIH0KLQotICAgIGlmKHBEZXZpY2UtPk5vUnhQc2V1ZG9IZHJDaGtzdW0pCi0gICAgewotCVZhbHVlMzIgfD0gR1JDX01PREVfUlhfTk9fUFNFVURPX0hFQURFUl9DSEtTVU07Ci0gICAgfQotCi0gICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5Nb2RlLCBWYWx1ZTMyKTsKLQotICAgIC8qIFNldHVwIHRoZSB0aW1lciBwcmVzY2FsYXIgcmVnaXN0ZXIuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5NaXNjQ2ZnLCA2NSA8PCAxKTsgICAgICAvKiBDbG9jayBpcyBhbHdhc3kgNjZNaHouICovCi0KLSAgICAvKiBTZXQgdXAgdGhlIE1CVUYgcG9vbCBiYXNlIGFkZHJlc3MgYW5kIHNpemUuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5NYnVmUG9vbEFkZHIsIHBEZXZpY2UtPk1idWZCYXNlKTsKLSAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLk1idWZQb29sU2l6ZSwgcERldmljZS0+TWJ1ZlNpemUpOwotCi0gICAgLyogU2V0IHVwIHRoZSBETUEgZGVzY3JpcHRvciBwb29sIGJhc2UgYWRkcmVzcyBhbmQgc2l6ZS4gKi8KLSAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLkRtYURlc2NQb29sQWRkciwgVDNfTklDX0RNQV9ERVNDX1BPT0xfQUREUik7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5EbWFEZXNjUG9vbFNpemUsIFQzX05JQ19ETUFfREVTQ19QT09MX1NJWkUpOwotCi0gICAgLyogQ29uZmlndXJlIE1CVUYgYW5kIFRocmVzaG9sZCB3YXRlcm1hcmtzICovCi0gICAgLyogQ29uZmlndXJlIHRoZSBETUEgcmVhZCBNQlVGIGxvdyB3YXRlciBtYXJrLiAqLwotICAgIGlmKHBEZXZpY2UtPkRtYU1idWZMb3dNYXJrKQotICAgIHsKLQlSRUdfV1IocERldmljZSwgQnVmTWdyLk1idWZSZWFkRG1hTG93V2F0ZXJNYXJrLAotCSAgICBwRGV2aWNlLT5EbWFNYnVmTG93TWFyayk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JaWYocERldmljZS0+VHhNdHUgPCBNQVhfRVRIRVJORVRfUEFDS0VUX0JVRkZFUl9TSVpFKQotCXsKLQkgICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5NYnVmUmVhZERtYUxvd1dhdGVyTWFyaywKLQkJVDNfREVGX0RNQV9NQlVGX0xPV19XTUFSSyk7CisJLyogQ29uZmlndXJlIHNlbmQgQkQgbW9kZS4gKi8KKwlpZiAocERldmljZS0+TmljU2VuZEJkID09IEZBTFNFKSB7CisJCVZhbHVlMzIgfD0gR1JDX01PREVfSE9TVF9TRU5EX0JEUzsKKwl9IGVsc2UgeworCQlWYWx1ZTMyIHw9IEdSQ19NT0RFXzRYX05JQ19CQVNFRF9TRU5EX1JJTkdTOwogCX0KLQllbHNlCi0JewotCSAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLk1idWZSZWFkRG1hTG93V2F0ZXJNYXJrLAotCQlUM19ERUZfRE1BX01CVUZfTE9XX1dNQVJLX0pVTUJPKTsKKworCS8qIENvbmZpZ3VyZSBwc2V1ZG8gY2hlY2tzdW0gbW9kZS4gKi8KKwlpZiAocERldmljZS0+Tm9UeFBzZXVkb0hkckNoa3N1bSkgeworCQlWYWx1ZTMyIHw9IEdSQ19NT0RFX1RYX05PX1BTRVVET19IRUFERVJfQ0hLU1VNOwogCX0KLSAgICB9CiAKLSAgICAvKiBDb25maWd1cmUgdGhlIE1BQyBSeCBNQlVGIGxvdyB3YXRlciBtYXJrLiAqLwotICAgIGlmKHBEZXZpY2UtPlJ4TWFjTWJ1Zkxvd01hcmspCi0gICAgewotCVJFR19XUihwRGV2aWNlLCBCdWZNZ3IuTWJ1Zk1hY1J4TG93V2F0ZXJNYXJrLAotCSAgICBwRGV2aWNlLT5SeE1hY01idWZMb3dNYXJrKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlpZihwRGV2aWNlLT5UeE10dSA8IE1BWF9FVEhFUk5FVF9QQUNLRVRfQlVGRkVSX1NJWkUpCi0JewotCSAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLk1idWZNYWNSeExvd1dhdGVyTWFyaywKLQkJVDNfREVGX1JYX01BQ19NQlVGX0xPV19XTUFSSyk7CisJaWYgKHBEZXZpY2UtPk5vUnhQc2V1ZG9IZHJDaGtzdW0pIHsKKwkJVmFsdWUzMiB8PSBHUkNfTU9ERV9SWF9OT19QU0VVRE9fSEVBREVSX0NIS1NVTTsKIAl9Ci0JZWxzZQotCXsKLQkgICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5NYnVmTWFjUnhMb3dXYXRlck1hcmssCi0JCVQzX0RFRl9SWF9NQUNfTUJVRl9MT1dfV01BUktfSlVNQk8pOworCisJUkVHX1dSIChwRGV2aWNlLCBHcmMuTW9kZSwgVmFsdWUzMik7CisKKwkvKiBTZXR1cCB0aGUgdGltZXIgcHJlc2NhbGFyIHJlZ2lzdGVyLiAqLworCVJFR19XUiAocERldmljZSwgR3JjLk1pc2NDZmcsIDY1IDw8IDEpOwkvKiBDbG9jayBpcyBhbHdhc3kgNjZNaHouICovCisKKwkvKiBTZXQgdXAgdGhlIE1CVUYgcG9vbCBiYXNlIGFkZHJlc3MgYW5kIHNpemUuICovCisJUkVHX1dSIChwRGV2aWNlLCBCdWZNZ3IuTWJ1ZlBvb2xBZGRyLCBwRGV2aWNlLT5NYnVmQmFzZSk7CisJUkVHX1dSIChwRGV2aWNlLCBCdWZNZ3IuTWJ1ZlBvb2xTaXplLCBwRGV2aWNlLT5NYnVmU2l6ZSk7CisKKwkvKiBTZXQgdXAgdGhlIERNQSBkZXNjcmlwdG9yIHBvb2wgYmFzZSBhZGRyZXNzIGFuZCBzaXplLiAqLworCVJFR19XUiAocERldmljZSwgQnVmTWdyLkRtYURlc2NQb29sQWRkciwgVDNfTklDX0RNQV9ERVNDX1BPT0xfQUREUik7CisJUkVHX1dSIChwRGV2aWNlLCBCdWZNZ3IuRG1hRGVzY1Bvb2xTaXplLCBUM19OSUNfRE1BX0RFU0NfUE9PTF9TSVpFKTsKKworCS8qIENvbmZpZ3VyZSBNQlVGIGFuZCBUaHJlc2hvbGQgd2F0ZXJtYXJrcyAqLworCS8qIENvbmZpZ3VyZSB0aGUgRE1BIHJlYWQgTUJVRiBsb3cgd2F0ZXIgbWFyay4gKi8KKwlpZiAocERldmljZS0+RG1hTWJ1Zkxvd01hcmspIHsKKwkJUkVHX1dSIChwRGV2aWNlLCBCdWZNZ3IuTWJ1ZlJlYWREbWFMb3dXYXRlck1hcmssCisJCQlwRGV2aWNlLT5EbWFNYnVmTG93TWFyayk7CisJfSBlbHNlIHsKKwkJaWYgKHBEZXZpY2UtPlR4TXR1IDwgTUFYX0VUSEVSTkVUX1BBQ0tFVF9CVUZGRVJfU0laRSkgeworCQkJUkVHX1dSIChwRGV2aWNlLCBCdWZNZ3IuTWJ1ZlJlYWREbWFMb3dXYXRlck1hcmssCisJCQkJVDNfREVGX0RNQV9NQlVGX0xPV19XTUFSSyk7CisJCX0gZWxzZSB7CisJCQlSRUdfV1IgKHBEZXZpY2UsIEJ1Zk1nci5NYnVmUmVhZERtYUxvd1dhdGVyTWFyaywKKwkJCQlUM19ERUZfRE1BX01CVUZfTE9XX1dNQVJLX0pVTUJPKTsKKwkJfQogCX0KLSAgICB9CiAKLSAgICAvKiBDb25maWd1cmUgdGhlIE1CVUYgaGlnaCB3YXRlciBtYXJrLiAqLwotICAgIGlmKHBEZXZpY2UtPk1idWZIaWdoTWFyaykKLSAgICB7Ci0JUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5NYnVmSGlnaFdhdGVyTWFyaywgcERldmljZS0+TWJ1ZkhpZ2hNYXJrKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlpZihwRGV2aWNlLT5UeE10dSA8IE1BWF9FVEhFUk5FVF9QQUNLRVRfQlVGRkVSX1NJWkUpCi0JewotCSAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLk1idWZIaWdoV2F0ZXJNYXJrLAotCQlUM19ERUZfTUJVRl9ISUdIX1dNQVJLKTsKKwkvKiBDb25maWd1cmUgdGhlIE1BQyBSeCBNQlVGIGxvdyB3YXRlciBtYXJrLiAqLworCWlmIChwRGV2aWNlLT5SeE1hY01idWZMb3dNYXJrKSB7CisJCVJFR19XUiAocERldmljZSwgQnVmTWdyLk1idWZNYWNSeExvd1dhdGVyTWFyaywKKwkJCXBEZXZpY2UtPlJ4TWFjTWJ1Zkxvd01hcmspOworCX0gZWxzZSB7CisJCWlmIChwRGV2aWNlLT5UeE10dSA8IE1BWF9FVEhFUk5FVF9QQUNLRVRfQlVGRkVSX1NJWkUpIHsKKwkJCVJFR19XUiAocERldmljZSwgQnVmTWdyLk1idWZNYWNSeExvd1dhdGVyTWFyaywKKwkJCQlUM19ERUZfUlhfTUFDX01CVUZfTE9XX1dNQVJLKTsKKwkJfSBlbHNlIHsKKwkJCVJFR19XUiAocERldmljZSwgQnVmTWdyLk1idWZNYWNSeExvd1dhdGVyTWFyaywKKwkJCQlUM19ERUZfUlhfTUFDX01CVUZfTE9XX1dNQVJLX0pVTUJPKTsKKwkJfQogCX0KLQllbHNlCi0JewotCSAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLk1idWZIaWdoV2F0ZXJNYXJrLAotCQlUM19ERUZfTUJVRl9ISUdIX1dNQVJLX0pVTUJPKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgTUJVRiBoaWdoIHdhdGVyIG1hcmsuICovCisJaWYgKHBEZXZpY2UtPk1idWZIaWdoTWFyaykgeworCQlSRUdfV1IgKHBEZXZpY2UsIEJ1Zk1nci5NYnVmSGlnaFdhdGVyTWFyaywKKwkJCXBEZXZpY2UtPk1idWZIaWdoTWFyayk7CisJfSBlbHNlIHsKKwkJaWYgKHBEZXZpY2UtPlR4TXR1IDwgTUFYX0VUSEVSTkVUX1BBQ0tFVF9CVUZGRVJfU0laRSkgeworCQkJUkVHX1dSIChwRGV2aWNlLCBCdWZNZ3IuTWJ1ZkhpZ2hXYXRlck1hcmssCisJCQkJVDNfREVGX01CVUZfSElHSF9XTUFSSyk7CisJCX0gZWxzZSB7CisJCQlSRUdfV1IgKHBEZXZpY2UsIEJ1Zk1nci5NYnVmSGlnaFdhdGVyTWFyaywKKwkJCQlUM19ERUZfTUJVRl9ISUdIX1dNQVJLX0pVTUJPKTsKKwkJfQogCX0KLSAgICB9CiAKLSAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLkRtYUxvd1dhdGVyTWFyaywgVDNfREVGX0RNQV9ERVNDX0xPV19XTUFSSyk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5EbWFIaWdoV2F0ZXJNYXJrLCBUM19ERUZfRE1BX0RFU0NfSElHSF9XTUFSSyk7CisJUkVHX1dSIChwRGV2aWNlLCBCdWZNZ3IuRG1hTG93V2F0ZXJNYXJrLCBUM19ERUZfRE1BX0RFU0NfTE9XX1dNQVJLKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEJ1Zk1nci5EbWFIaWdoV2F0ZXJNYXJrLCBUM19ERUZfRE1BX0RFU0NfSElHSF9XTUFSSyk7CiAKLSAgICAvKiBFbmFibGUgYnVmZmVyIG1hbmFnZXIuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIEJ1Zk1nci5Nb2RlLCBCVUZNR1JfTU9ERV9FTkFCTEUgfCBCVUZNR1JfTU9ERV9BVFROX0VOQUJMRSk7CisJLyogRW5hYmxlIGJ1ZmZlciBtYW5hZ2VyLiAqLworCVJFR19XUiAocERldmljZSwgQnVmTWdyLk1vZGUsCisJCUJVRk1HUl9NT0RFX0VOQUJMRSB8IEJVRk1HUl9NT0RFX0FUVE5fRU5BQkxFKTsKIAotICAgIGZvcihqID0gMCA7aiA8IDIwMDA7IGorKykKLSAgICB7Ci0JaWYoUkVHX1JEKHBEZXZpY2UsIEJ1Zk1nci5Nb2RlKSAmIEJVRk1HUl9NT0RFX0VOQUJMRSkKLQkgICAgYnJlYWs7Ci0JTU1fV2FpdCgxMCk7Ci0gICAgfQorCWZvciAoaiA9IDA7IGogPCAyMDAwOyBqKyspIHsKKwkJaWYgKFJFR19SRCAocERldmljZSwgQnVmTWdyLk1vZGUpICYgQlVGTUdSX01PREVfRU5BQkxFKQorCQkJYnJlYWs7CisJCU1NX1dhaXQgKDEwKTsKKwl9CiAKLSAgICBpZihqID49IDIwMDApCi0gICAgewotCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKLSAgICB9CisJaWYgKGogPj0gMjAwMCkgeworCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJfQogCi0gICAgLyogRW5hYmxlIHRoZSBGVFFzLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBGdHEuUmVzZXQsIDB4ZmZmZmZmZmYpOwotICAgIFJFR19XUihwRGV2aWNlLCBGdHEuUmVzZXQsIDApOworCS8qIEVuYWJsZSB0aGUgRlRRcy4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIEZ0cS5SZXNldCwgMHhmZmZmZmZmZik7CisJUkVHX1dSIChwRGV2aWNlLCBGdHEuUmVzZXQsIDApOwogCi0gICAgLyogV2FpdCB1bnRpbCBGVFEgaXMgcmVhZHkgKi8KLSAgICBmb3IoaiA9IDA7IGogPCAyMDAwOyBqKyspCi0gICAgewotCWlmKFJFR19SRChwRGV2aWNlLCBGdHEuUmVzZXQpID09IDApCi0JICAgIGJyZWFrOwotCU1NX1dhaXQoMTApOwotICAgIH0KKwkvKiBXYWl0IHVudGlsIEZUUSBpcyByZWFkeSAqLworCWZvciAoaiA9IDA7IGogPCAyMDAwOyBqKyspIHsKKwkJaWYgKFJFR19SRCAocERldmljZSwgRnRxLlJlc2V0KSA9PSAwKQorCQkJYnJlYWs7CisJCU1NX1dhaXQgKDEwKTsKKwl9CiAKLSAgICBpZihqID49IDIwMDApCi0gICAgewotCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKLSAgICB9CisJaWYgKGogPj0gMjAwMCkgeworCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJfQogCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgU3RhbmRhcmQgUmVjZWl2ZSBSQ0IuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLlN0ZFJjdlJjYi5Ib3N0UmluZ0FkZHIuSGlnaCwKLQlwRGV2aWNlLT5SeFN0ZEJkUGh5LkhpZ2gpOwotICAgIFJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQmRJbi5TdGRSY3ZSY2IuSG9zdFJpbmdBZGRyLkxvdywKLQlwRGV2aWNlLT5SeFN0ZEJkUGh5Lkxvdyk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLlN0ZFJjdlJjYi51Lk1heExlbl9GbGFncywKLQlNQVhfU1REX1JDVl9CVUZGRVJfU0laRSA8PCAxNik7CisJLyogSW5pdGlhbGl6ZSB0aGUgU3RhbmRhcmQgUmVjZWl2ZSBSQ0IuICovCisJUkVHX1dSIChwRGV2aWNlLCBSY3ZEYXRhQmRJbi5TdGRSY3ZSY2IuSG9zdFJpbmdBZGRyLkhpZ2gsCisJCXBEZXZpY2UtPlJ4U3RkQmRQaHkuSGlnaCk7CisJUkVHX1dSIChwRGV2aWNlLCBSY3ZEYXRhQmRJbi5TdGRSY3ZSY2IuSG9zdFJpbmdBZGRyLkxvdywKKwkJcERldmljZS0+UnhTdGRCZFBoeS5Mb3cpOworCVJFR19XUiAocERldmljZSwgUmN2RGF0YUJkSW4uU3RkUmN2UmNiLnUuTWF4TGVuX0ZsYWdzLAorCQlNQVhfU1REX1JDVl9CVUZGRVJfU0laRSA8PCAxNik7CiAKLSAgICAvKiBJbml0aWFsaXplIHRoZSBKdW1ibyBSZWNlaXZlIFJDQi4gKi8KLSAgICBSRUdfV1IocERldmljZSwgUmN2RGF0YUJkSW4uSnVtYm9SY3ZSY2IudS5NYXhMZW5fRmxhZ3MsCi0JVDNfUkNCX0ZMQUdfUklOR19ESVNBQkxFRCk7CisJLyogSW5pdGlhbGl6ZSB0aGUgSnVtYm8gUmVjZWl2ZSBSQ0IuICovCisJUkVHX1dSIChwRGV2aWNlLCBSY3ZEYXRhQmRJbi5KdW1ib1JjdlJjYi51Lk1heExlbl9GbGFncywKKwkJVDNfUkNCX0ZMQUdfUklOR19ESVNBQkxFRCk7CiAjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAotICAgIFJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQmRJbi5KdW1ib1JjdlJjYi5Ib3N0UmluZ0FkZHIuSGlnaCwKLQlwRGV2aWNlLT5SeEp1bWJvQmRQaHkuSGlnaCk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLkp1bWJvUmN2UmNiLkhvc3RSaW5nQWRkci5Mb3csCi0JcERldmljZS0+UnhKdW1ib0JkUGh5Lkxvdyk7CisJUkVHX1dSIChwRGV2aWNlLCBSY3ZEYXRhQmRJbi5KdW1ib1JjdlJjYi5Ib3N0UmluZ0FkZHIuSGlnaCwKKwkJcERldmljZS0+UnhKdW1ib0JkUGh5LkhpZ2gpOworCVJFR19XUiAocERldmljZSwgUmN2RGF0YUJkSW4uSnVtYm9SY3ZSY2IuSG9zdFJpbmdBZGRyLkxvdywKKwkJcERldmljZS0+UnhKdW1ib0JkUGh5Lkxvdyk7CiAKLSAgICBSRUdfV1IocERldmljZSwgUmN2RGF0YUJkSW4uSnVtYm9SY3ZSY2IudS5NYXhMZW5fRmxhZ3MsIDApOworCVJFR19XUiAocERldmljZSwgUmN2RGF0YUJkSW4uSnVtYm9SY3ZSY2IudS5NYXhMZW5fRmxhZ3MsIDApOwogCi0jZW5kaWYgLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLworI2VuZGlmCQkJCS8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KIAotICAgIC8qIEluaXRpYWxpemUgdGhlIE1pbmkgUmVjZWl2ZSBSQ0IuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1pbmlSY3ZSY2IudS5NYXhMZW5fRmxhZ3MsCi0JVDNfUkNCX0ZMQUdfUklOR19ESVNBQkxFRCk7CisJLyogSW5pdGlhbGl6ZSB0aGUgTWluaSBSZWNlaXZlIFJDQi4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFJjdkRhdGFCZEluLk1pbmlSY3ZSY2IudS5NYXhMZW5fRmxhZ3MsCisJCVQzX1JDQl9GTEFHX1JJTkdfRElTQUJMRUQpOwogCi0gICAgewotCVJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQmRJbi5TdGRSY3ZSY2IuTmljUmluZ0FkZHIsCi0JICAgIChMTV9VSU5UMzIpIFQzX05JQ19TVERfUkNWX0JVRkZFUl9ERVNDX0FERFIpOwotCVJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQmRJbi5KdW1ib1JjdlJjYi5OaWNSaW5nQWRkciwKLQkgICAgKExNX1VJTlQzMikgVDNfTklDX0pVTUJPX1JDVl9CVUZGRVJfREVTQ19BRERSKTsKLSAgICB9CisJeworCQlSRUdfV1IgKHBEZXZpY2UsIFJjdkRhdGFCZEluLlN0ZFJjdlJjYi5OaWNSaW5nQWRkciwKKwkJCShMTV9VSU5UMzIpIFQzX05JQ19TVERfUkNWX0JVRkZFUl9ERVNDX0FERFIpOworCQlSRUdfV1IgKHBEZXZpY2UsIFJjdkRhdGFCZEluLkp1bWJvUmN2UmNiLk5pY1JpbmdBZGRyLAorCQkJKExNX1VJTlQzMikgVDNfTklDX0pVTUJPX1JDVl9CVUZGRVJfREVTQ19BRERSKTsKKwl9CiAKLSAgICAvKiBSZWNlaXZlIEJEIFJpbmcgcmVwbGVuaXNoIHRocmVzaG9sZC4gKi8KLSAgICBSRUdfV1IocERldmljZSwgUmN2QmRJbi5TdGRSY3ZUaHJlc2hvbGQsIHBEZXZpY2UtPlJ4U3RkRGVzY0NudC84KTsKKwkvKiBSZWNlaXZlIEJEIFJpbmcgcmVwbGVuaXNoIHRocmVzaG9sZC4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFJjdkJkSW4uU3RkUmN2VGhyZXNob2xkLCBwRGV2aWNlLT5SeFN0ZERlc2NDbnQgLyA4KTsKICNpZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCi0gICAgUkVHX1dSKHBEZXZpY2UsIFJjdkJkSW4uSnVtYm9SY3ZUaHJlc2hvbGQsIHBEZXZpY2UtPlJ4SnVtYm9EZXNjQ250LzgpOwotI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFJjdkJkSW4uSnVtYm9SY3ZUaHJlc2hvbGQsCisJCXBEZXZpY2UtPlJ4SnVtYm9EZXNjQ250IC8gOCk7CisjZW5kaWYJCQkJLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLwogCi0gICAgLyogRGlzYWJsZSBhbGwgdGhlIHVudXNlZCByaW5ncy4gKi8KLSAgICBmb3IoaiA9IDA7IGogPCBUM19NQVhfU0VORF9SQ0JfQ09VTlQ7IGorKykgewotCU1FTV9XUihwRGV2aWNlLCBTZW5kUmNiW2pdLnUuTWF4TGVuX0ZsYWdzLCBUM19SQ0JfRkxBR19SSU5HX0RJU0FCTEVEKTsKLSAgICB9IC8qIGZvciAqLworCS8qIERpc2FibGUgYWxsIHRoZSB1bnVzZWQgcmluZ3MuICovCisJZm9yIChqID0gMDsgaiA8IFQzX01BWF9TRU5EX1JDQl9DT1VOVDsgaisrKSB7CisJCU1FTV9XUiAocERldmljZSwgU2VuZFJjYltqXS51Lk1heExlbl9GbGFncywKKwkJCVQzX1JDQl9GTEFHX1JJTkdfRElTQUJMRUQpOworCX0JCQkvKiBmb3IgKi8KIAotICAgIC8qIEluaXRpYWxpemUgdGhlIGluZGljZXMuICovCi0gICAgcERldmljZS0+U2VuZFByb2RJZHggPSAwOwotICAgIHBEZXZpY2UtPlNlbmRDb25JZHggPSAwOworCS8qIEluaXRpYWxpemUgdGhlIGluZGljZXMuICovCisJcERldmljZS0+U2VuZFByb2RJZHggPSAwOworCXBEZXZpY2UtPlNlbmRDb25JZHggPSAwOwogCi0gICAgTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guU2VuZEhvc3RQcm9kSWR4WzBdLkxvdywgMCk7Ci0gICAgTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guU2VuZE5pY1Byb2RJZHhbMF0uTG93LCAwKTsKKwlNQl9SRUdfV1IgKHBEZXZpY2UsIE1haWxib3guU2VuZEhvc3RQcm9kSWR4WzBdLkxvdywgMCk7CisJTUJfUkVHX1dSIChwRGV2aWNlLCBNYWlsYm94LlNlbmROaWNQcm9kSWR4WzBdLkxvdywgMCk7CiAKLSAgICAvKiBTZXQgdXAgaG9zdCBvciBOSUMgYmFzZWQgc2VuZCBSQ0IuICovCi0gICAgaWYocERldmljZS0+TmljU2VuZEJkID09IEZBTFNFKQotICAgIHsKLQlNRU1fV1IocERldmljZSwgU2VuZFJjYlswXS5Ib3N0UmluZ0FkZHIuSGlnaCwKLQkgICAgcERldmljZS0+U2VuZEJkUGh5LkhpZ2gpOwotCU1FTV9XUihwRGV2aWNlLCBTZW5kUmNiWzBdLkhvc3RSaW5nQWRkci5Mb3csCi0JICAgIHBEZXZpY2UtPlNlbmRCZFBoeS5Mb3cpOworCS8qIFNldCB1cCBob3N0IG9yIE5JQyBiYXNlZCBzZW5kIFJDQi4gKi8KKwlpZiAocERldmljZS0+TmljU2VuZEJkID09IEZBTFNFKSB7CisJCU1FTV9XUiAocERldmljZSwgU2VuZFJjYlswXS5Ib3N0UmluZ0FkZHIuSGlnaCwKKwkJCXBEZXZpY2UtPlNlbmRCZFBoeS5IaWdoKTsKKwkJTUVNX1dSIChwRGV2aWNlLCBTZW5kUmNiWzBdLkhvc3RSaW5nQWRkci5Mb3csCisJCQlwRGV2aWNlLT5TZW5kQmRQaHkuTG93KTsKKworCQkvKiBTZXQgdXAgdGhlIE5JQyByaW5nIGFkZHJlc3MgaW4gdGhlIFJDQi4gKi8KKwkJTUVNX1dSIChwRGV2aWNlLCBTZW5kUmNiWzBdLk5pY1JpbmdBZGRyLAorCQkJVDNfTklDX1NORF9CVUZGRVJfREVTQ19BRERSKTsKKworCQkvKiBTZXR1cCB0aGUgUkNCLiAqLworCQlNRU1fV1IgKHBEZXZpY2UsIFNlbmRSY2JbMF0udS5NYXhMZW5fRmxhZ3MsCisJCQlUM19TRU5EX1JDQl9FTlRSWV9DT1VOVCA8PCAxNik7CisKKwkJZm9yIChrID0gMDsgayA8IFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UOyBrKyspIHsKKwkJCXBEZXZpY2UtPnBTZW5kQmRWaXJ0W2tdLkhvc3RBZGRyLkhpZ2ggPSAwOworCQkJcERldmljZS0+cFNlbmRCZFZpcnRba10uSG9zdEFkZHIuTG93ID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCU1FTV9XUiAocERldmljZSwgU2VuZFJjYlswXS5Ib3N0UmluZ0FkZHIuSGlnaCwgMCk7CisJCU1FTV9XUiAocERldmljZSwgU2VuZFJjYlswXS5Ib3N0UmluZ0FkZHIuTG93LCAwKTsKKwkJTUVNX1dSIChwRGV2aWNlLCBTZW5kUmNiWzBdLk5pY1JpbmdBZGRyLAorCQkJcERldmljZS0+U2VuZEJkUGh5Lkxvdyk7CisKKwkJZm9yIChrID0gMDsgayA8IFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UOyBrKyspIHsKKwkJCV9fcmF3X3dyaXRlbCAoMCwKKwkJCQkgICAgICAmKHBEZXZpY2UtPnBTZW5kQmRWaXJ0W2tdLkhvc3RBZGRyLkhpZ2gpKTsKKwkJCV9fcmF3X3dyaXRlbCAoMCwKKwkJCQkgICAgICAmKHBEZXZpY2UtPnBTZW5kQmRWaXJ0W2tdLkhvc3RBZGRyLkxvdykpOworCQkJX19yYXdfd3JpdGVsICgwLAorCQkJCSAgICAgICYocERldmljZS0+cFNlbmRCZFZpcnRba10udTEuTGVuX0ZsYWdzKSk7CisJCQlwRGV2aWNlLT5TaGFkb3dTZW5kQmRba10uSG9zdEFkZHIuSGlnaCA9IDA7CisJCQlwRGV2aWNlLT5TaGFkb3dTZW5kQmRba10udTEuTGVuX0ZsYWdzID0gMDsKKwkJfQorCX0KKwlhdG9taWNfc2V0ICgmcERldmljZS0+U2VuZEJkTGVmdCwgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQgLSAxKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgcmVjZWl2ZSByZXR1cm4gcmluZ3MuICovCisJZm9yIChqID0gMDsgaiA8IFQzX01BWF9SQ1ZfUkVUVVJOX1JDQl9DT1VOVDsgaisrKSB7CisJCU1FTV9XUiAocERldmljZSwgUmN2UmV0UmNiW2pdLnUuTWF4TGVuX0ZsYWdzLAorCQkJVDNfUkNCX0ZMQUdfUklOR19ESVNBQkxFRCk7CisJfQorCisJcERldmljZS0+UmN2UmV0Q29uSWR4ID0gMDsKKworCU1FTV9XUiAocERldmljZSwgUmN2UmV0UmNiWzBdLkhvc3RSaW5nQWRkci5IaWdoLAorCQlwRGV2aWNlLT5SY3ZSZXRCZFBoeS5IaWdoKTsKKwlNRU1fV1IgKHBEZXZpY2UsIFJjdlJldFJjYlswXS5Ib3N0UmluZ0FkZHIuTG93LAorCQlwRGV2aWNlLT5SY3ZSZXRCZFBoeS5Mb3cpOwogCiAJLyogU2V0IHVwIHRoZSBOSUMgcmluZyBhZGRyZXNzIGluIHRoZSBSQ0IuICovCi0JTUVNX1dSKHBEZXZpY2UsIFNlbmRSY2JbMF0uTmljUmluZ0FkZHIsVDNfTklDX1NORF9CVUZGRVJfREVTQ19BRERSKTsKKwkvKiBOb3QgdmVyeSBjbGVhciBmcm9tIHRoZSBzcGVjLiAgSSBhbSBndWVzc2luZyB0aGF0IGZvciBSZWNlaXZlICovCisJLyogUmV0dXJuIFJpbmcsIE5pY1JpbmdBZGRyIGlzIG5vdCB1c2VkLiAqLworCU1FTV9XUiAocERldmljZSwgUmN2UmV0UmNiWzBdLk5pY1JpbmdBZGRyLCAwKTsKIAogCS8qIFNldHVwIHRoZSBSQ0IuICovCi0JTUVNX1dSKHBEZXZpY2UsIFNlbmRSY2JbMF0udS5NYXhMZW5fRmxhZ3MsCi0JICAgIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UIDw8IDE2KTsKKwlNRU1fV1IgKHBEZXZpY2UsIFJjdlJldFJjYlswXS51Lk1heExlbl9GbGFncywKKwkJVDNfUkNWX1JFVFVSTl9SQ0JfRU5UUllfQ09VTlQgPDwgMTYpOwogCi0JZm9yKGsgPSAwOyBrIDwgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQ7IGsrKykKLQl7Ci0JICAgIHBEZXZpY2UtPnBTZW5kQmRWaXJ0W2tdLkhvc3RBZGRyLkhpZ2ggPSAwOwotCSAgICBwRGV2aWNlLT5wU2VuZEJkVmlydFtrXS5Ib3N0QWRkci5Mb3cgPSAwOwotCX0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlNRU1fV1IocERldmljZSwgU2VuZFJjYlswXS5Ib3N0UmluZ0FkZHIuSGlnaCwgMCk7Ci0JTUVNX1dSKHBEZXZpY2UsIFNlbmRSY2JbMF0uSG9zdFJpbmdBZGRyLkxvdywgMCk7Ci0JTUVNX1dSKHBEZXZpY2UsIFNlbmRSY2JbMF0uTmljUmluZ0FkZHIsCi0JICAgIHBEZXZpY2UtPlNlbmRCZFBoeS5Mb3cpOwotCi0JZm9yKGsgPSAwOyBrIDwgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQ7IGsrKykKLQl7Ci0JICAgIF9fcmF3X3dyaXRlbCgwLCAmKHBEZXZpY2UtPnBTZW5kQmRWaXJ0W2tdLkhvc3RBZGRyLkhpZ2gpKTsKLQkgICAgX19yYXdfd3JpdGVsKDAsICYocERldmljZS0+cFNlbmRCZFZpcnRba10uSG9zdEFkZHIuTG93KSk7Ci0JICAgIF9fcmF3X3dyaXRlbCgwLCAmKHBEZXZpY2UtPnBTZW5kQmRWaXJ0W2tdLnUxLkxlbl9GbGFncykpOwotCSAgICBwRGV2aWNlLT5TaGFkb3dTZW5kQmRba10uSG9zdEFkZHIuSGlnaCA9IDA7Ci0JICAgIHBEZXZpY2UtPlNoYWRvd1NlbmRCZFtrXS51MS5MZW5fRmxhZ3MgPSAwOwotCX0KLSAgICB9Ci0gICAgYXRvbWljX3NldCgmcERldmljZS0+U2VuZEJkTGVmdCwgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlQtMSk7Ci0KLSAgICAvKiBDb25maWd1cmUgdGhlIHJlY2VpdmUgcmV0dXJuIHJpbmdzLiAqLwotICAgIGZvcihqID0gMDsgaiA8IFQzX01BWF9SQ1ZfUkVUVVJOX1JDQl9DT1VOVDsgaisrKQotICAgIHsKLQlNRU1fV1IocERldmljZSwgUmN2UmV0UmNiW2pdLnUuTWF4TGVuX0ZsYWdzLCBUM19SQ0JfRkxBR19SSU5HX0RJU0FCTEVEKTsKLSAgICB9Ci0KLSAgICBwRGV2aWNlLT5SY3ZSZXRDb25JZHggPSAwOwotCi0gICAgTUVNX1dSKHBEZXZpY2UsIFJjdlJldFJjYlswXS5Ib3N0UmluZ0FkZHIuSGlnaCwKLQlwRGV2aWNlLT5SY3ZSZXRCZFBoeS5IaWdoKTsKLSAgICBNRU1fV1IocERldmljZSwgUmN2UmV0UmNiWzBdLkhvc3RSaW5nQWRkci5Mb3csCi0JcERldmljZS0+UmN2UmV0QmRQaHkuTG93KTsKLQotICAgIC8qIFNldCB1cCB0aGUgTklDIHJpbmcgYWRkcmVzcyBpbiB0aGUgUkNCLiAqLwotICAgIC8qIE5vdCB2ZXJ5IGNsZWFyIGZyb20gdGhlIHNwZWMuICBJIGFtIGd1ZXNzaW5nIHRoYXQgZm9yIFJlY2VpdmUgKi8KLSAgICAvKiBSZXR1cm4gUmluZywgTmljUmluZ0FkZHIgaXMgbm90IHVzZWQuICovCi0gICAgTUVNX1dSKHBEZXZpY2UsIFJjdlJldFJjYlswXS5OaWNSaW5nQWRkciwgMCk7Ci0KLSAgICAvKiBTZXR1cCB0aGUgUkNCLiAqLwotICAgIE1FTV9XUihwRGV2aWNlLCBSY3ZSZXRSY2JbMF0udS5NYXhMZW5fRmxhZ3MsCi0JVDNfUkNWX1JFVFVSTl9SQ0JfRU5UUllfQ09VTlQgPDwgMTYpOwotCi0gICAgLyogUmVpbml0aWFsaXplIFJYIHJpbmcgcHJvZHVjZXIgaW5kZXggKi8KLSAgICBNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5SY3ZTdGRQcm9kSWR4LkxvdywgMCk7Ci0gICAgTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guUmN2SnVtYm9Qcm9kSWR4LkxvdywgMCk7Ci0gICAgTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guUmN2TWluaVByb2RJZHguTG93LCAwKTsKKwkvKiBSZWluaXRpYWxpemUgUlggcmluZyBwcm9kdWNlciBpbmRleCAqLworCU1CX1JFR19XUiAocERldmljZSwgTWFpbGJveC5SY3ZTdGRQcm9kSWR4LkxvdywgMCk7CisJTUJfUkVHX1dSIChwRGV2aWNlLCBNYWlsYm94LlJjdkp1bWJvUHJvZElkeC5Mb3csIDApOworCU1CX1JFR19XUiAocERldmljZSwgTWFpbGJveC5SY3ZNaW5pUHJvZElkeC5Mb3csIDApOwogCiAjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAotICAgIHBEZXZpY2UtPlJ4SnVtYm9Qcm9kSWR4ID0gMDsKLSAgICBwRGV2aWNlLT5SeEp1bWJvUXVldWVkQ250ID0gMDsKKwlwRGV2aWNlLT5SeEp1bWJvUHJvZElkeCA9IDA7CisJcERldmljZS0+UnhKdW1ib1F1ZXVlZENudCA9IDA7CiAjZW5kaWYKIAotICAgIC8qIFJlaW5pdGlhbGl6ZSBvdXIgY29weSBvZiB0aGUgaW5kaWNlcy4gKi8KLSAgICBwRGV2aWNlLT5SeFN0ZFByb2RJZHggPSAwOwotICAgIHBEZXZpY2UtPlJ4U3RkUXVldWVkQ250ID0gMDsKKwkvKiBSZWluaXRpYWxpemUgb3VyIGNvcHkgb2YgdGhlIGluZGljZXMuICovCisJcERldmljZS0+UnhTdGRQcm9kSWR4ID0gMDsKKwlwRGV2aWNlLT5SeFN0ZFF1ZXVlZENudCA9IDA7CiAKICNpZiBUM19KVU1CT19SQ1ZfRU5UUllfQ09VTlQKLSAgICBwRGV2aWNlLT5SeEp1bWJvUHJvZElkeCA9IDA7Ci0jZW5kaWYgLyogVDNfSlVNQk9fUkNWX0VOVFJZX0NPVU5UICovCisJcERldmljZS0+UnhKdW1ib1Byb2RJZHggPSAwOworI2VuZGlmCQkJCS8qIFQzX0pVTUJPX1JDVl9FTlRSWV9DT1VOVCAqLwogCi0gICAgLyogQ29uZmlndXJlIHRoZSBNQUMgYWRkcmVzcy4gKi8KLSAgICBMTV9TZXRNYWNBZGRyZXNzKHBEZXZpY2UsIHBEZXZpY2UtPk5vZGVBZGRyZXNzKTsKKwkvKiBDb25maWd1cmUgdGhlIE1BQyBhZGRyZXNzLiAqLworCUxNX1NldE1hY0FkZHJlc3MgKHBEZXZpY2UsIHBEZXZpY2UtPk5vZGVBZGRyZXNzKTsKIAotICAgIC8qIEluaXRpYWxpemUgdGhlIHRyYW5zbWl0IHJhbmRvbSBiYWNrb2ZmIHNlZWQuICovCi0gICAgVmFsdWUzMiA9IChwRGV2aWNlLT5Ob2RlQWRkcmVzc1swXSArIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzFdICsKLQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1syXSArIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzNdICsKLQlwRGV2aWNlLT5Ob2RlQWRkcmVzc1s0XSArIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzVdKSAmCi0JTUFDX1RYX0JBQ0tPRkZfU0VFRF9NQVNLOwotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlR4QmFja29mZlNlZWQsIFZhbHVlMzIpOworCS8qIEluaXRpYWxpemUgdGhlIHRyYW5zbWl0IHJhbmRvbSBiYWNrb2ZmIHNlZWQuICovCisJVmFsdWUzMiA9IChwRGV2aWNlLT5Ob2RlQWRkcmVzc1swXSArIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzFdICsKKwkJICAgcERldmljZS0+Tm9kZUFkZHJlc3NbMl0gKyBwRGV2aWNlLT5Ob2RlQWRkcmVzc1szXSArCisJCSAgIHBEZXZpY2UtPk5vZGVBZGRyZXNzWzRdICsgcERldmljZS0+Tm9kZUFkZHJlc3NbNV0pICYKKwkgICAgTUFDX1RYX0JBQ0tPRkZfU0VFRF9NQVNLOworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5UeEJhY2tvZmZTZWVkLCBWYWx1ZTMyKTsKIAotICAgIC8qIFJlY2VpdmUgTVRVLiAgRnJhbWVzIGxhcmdlciB0aGFuIHRoZSBNVFUgaXMgbWFya2VkIGFzIG92ZXJzaXplZC4gKi8KLSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5NdHVTaXplLCBwRGV2aWNlLT5SeE10dSArIDgpOyAgIC8qIENSQyArIFZMQU4uICovCisJLyogUmVjZWl2ZSBNVFUuICBGcmFtZXMgbGFyZ2VyIHRoYW4gdGhlIE1UVSBpcyBtYXJrZWQgYXMgb3ZlcnNpemVkLiAqLworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NdHVTaXplLCBwRGV2aWNlLT5SeE10dSArIDgpOwkvKiBDUkMgKyBWTEFOLiAqLwogCi0gICAgLyogQ29uZmlndXJlIFRpbWUgc2xvdC9JUEcgcGVyIDgwMi4zICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuVHhMZW5ndGhzLCAweDI2MjApOworCS8qIENvbmZpZ3VyZSBUaW1lIHNsb3QvSVBHIHBlciA4MDIuMyAqLworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5UeExlbmd0aHMsIDB4MjYyMCk7CiAKLSAgICAvKgotICAgICAqIENvbmZpZ3VyZSBSZWNlaXZlIFJ1bGVzIHNvIHRoYXQgcGFja2V0cyBkb24ndCBtYXRjaAotICAgICAqIFByb2dyYW1tYmxlIHJ1bGUgd2lsbCBiZSBxdWV1ZWQgdG8gUmV0dXJuIFJpbmcgMQotICAgICAqLwotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJjdlJ1bGVDZmcsIFJYX1JVTEVfREVGQVVMVF9DTEFTUyk7CisJLyoKKwkgKiBDb25maWd1cmUgUmVjZWl2ZSBSdWxlcyBzbyB0aGF0IHBhY2tldHMgZG9uJ3QgbWF0Y2gKKwkgKiBQcm9ncmFtbWJsZSBydWxlIHdpbGwgYmUgcXVldWVkIHRvIFJldHVybiBSaW5nIDEKKwkgKi8KKwlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuUmN2UnVsZUNmZywgUlhfUlVMRV9ERUZBVUxUX0NMQVNTKTsKIAotICAgIC8qCi0gICAgICogQ29uZmlndXJlIHRvIGhhdmUgMTYgQ2xhc3NlcyBvZiBTZXJ2aWNlcyAoQ09TKSBhbmQgb25lCi0gICAgICogcXVldWUgcGVyIGNsYXNzLiAgQmFkIGZyYW1lcyBhcmUgcXVldWVkIHRvIFJSUiMxLgotICAgICAqIEFuZCBmcmFtZXMgZG9uJ3QgbWF0Y2ggcnVsZXMgYXJlIGFsc28gcXVldWVkIHRvIENPUyMxLgotICAgICAqLwotICAgIFJFR19XUihwRGV2aWNlLCBSY3ZMaXN0UGxtdC5Db25maWcsIDB4MTgxKTsKKwkvKgorCSAqIENvbmZpZ3VyZSB0byBoYXZlIDE2IENsYXNzZXMgb2YgU2VydmljZXMgKENPUykgYW5kIG9uZQorCSAqIHF1ZXVlIHBlciBjbGFzcy4gIEJhZCBmcmFtZXMgYXJlIHF1ZXVlZCB0byBSUlIjMS4KKwkgKiBBbmQgZnJhbWVzIGRvbid0IG1hdGNoIHJ1bGVzIGFyZSBhbHNvIHF1ZXVlZCB0byBDT1MjMS4KKwkgKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFJjdkxpc3RQbG10LkNvbmZpZywgMHgxODEpOwogCi0gICAgLyogRW5hYmxlIFJlY2VpdmUgUGxhY2VtZW50IFN0YXRpc3RpY3MgKi8KLSAgICBSRUdfV1IocERldmljZSwgUmN2TGlzdFBsbXQuU3RhdHNFbmFibGVNYXNrLDB4ZmZmZmZmKTsKLSAgICBSRUdfV1IocERldmljZSwgUmN2TGlzdFBsbXQuU3RhdHNDdHJsLCBSQ1ZfTElTVF9TVEFUU19FTkFCTEUpOworCS8qIEVuYWJsZSBSZWNlaXZlIFBsYWNlbWVudCBTdGF0aXN0aWNzICovCisJUkVHX1dSIChwRGV2aWNlLCBSY3ZMaXN0UGxtdC5TdGF0c0VuYWJsZU1hc2ssIDB4ZmZmZmZmKTsKKwlSRUdfV1IgKHBEZXZpY2UsIFJjdkxpc3RQbG10LlN0YXRzQ3RybCwgUkNWX0xJU1RfU1RBVFNfRU5BQkxFKTsKIAotICAgIC8qIEVuYWJsZSBTZW5kIERhdGEgSW5pdGF0b3IgU3RhdGlzdGljcyAqLwotICAgIFJFR19XUihwRGV2aWNlLCBTbmREYXRhSW4uU3RhdHNFbmFibGVNYXNrLDB4ZmZmZmZmKTsKLSAgICBSRUdfV1IocERldmljZSwgU25kRGF0YUluLlN0YXRzQ3RybCwKLQlUM19TTkRfREFUQV9JTl9TVEFUU19DVFJMX0VOQUJMRSB8IFwKLQlUM19TTkRfREFUQV9JTl9TVEFUU19DVFJMX0ZBU1RFUl9VUERBVEUpOworCS8qIEVuYWJsZSBTZW5kIERhdGEgSW5pdGF0b3IgU3RhdGlzdGljcyAqLworCVJFR19XUiAocERldmljZSwgU25kRGF0YUluLlN0YXRzRW5hYmxlTWFzaywgMHhmZmZmZmYpOworCVJFR19XUiAocERldmljZSwgU25kRGF0YUluLlN0YXRzQ3RybCwKKwkJVDNfU05EX0RBVEFfSU5fU1RBVFNfQ1RSTF9FTkFCTEUgfAorCQlUM19TTkRfREFUQV9JTl9TVEFUU19DVFJMX0ZBU1RFUl9VUERBVEUpOwogCi0gICAgLyogRGlzYWJsZSB0aGUgaG9zdCBjb2FsZXNjaW5nIHN0YXRlIG1hY2hpbmUgYmVmb3JlIGNvbmZpZ3VyaW5nIGl0J3MgKi8KLSAgICAvKiBwYXJhbWV0ZXJzLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuTW9kZSwgMCk7Ci0gICAgZm9yKGogPSAwOyBqIDwgMjAwMDsgaisrKQotICAgIHsKLQlWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5Nb2RlKTsKLQlpZighKFZhbHVlMzIgJiBIT1NUX0NPQUxFU0NFX0VOQUJMRSkpCi0JewotCSAgICBicmVhazsKKwkvKiBEaXNhYmxlIHRoZSBob3N0IGNvYWxlc2Npbmcgc3RhdGUgbWFjaGluZSBiZWZvcmUgY29uZmlndXJpbmcgaXQncyAqLworCS8qIHBhcmFtZXRlcnMuICovCisJUkVHX1dSIChwRGV2aWNlLCBIb3N0Q29hbGVzY2UuTW9kZSwgMCk7CisJZm9yIChqID0gMDsgaiA8IDIwMDA7IGorKykgeworCQlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBIb3N0Q29hbGVzY2UuTW9kZSk7CisJCWlmICghKFZhbHVlMzIgJiBIT1NUX0NPQUxFU0NFX0VOQUJMRSkpIHsKKwkJCWJyZWFrOworCQl9CisJCU1NX1dhaXQgKDEwKTsKIAl9Ci0JTU1fV2FpdCgxMCk7Ci0gICAgfQogCi0gICAgLyogSG9zdCBjb2FsZXNjaW5nIGNvbmZpZ3VyYXRpb25zLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuUnhDb2FsZXNjaW5nVGlja3MsIHBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzKTsKLSAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlR4Q29hbGVzY2luZ1RpY2tzLCBwRGV2aWNlLT5UeENvYWxlc2NpbmdUaWNrcyk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5SeE1heENvYWxlc2NlZEZyYW1lcywKLQlwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lcyk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5UeE1heENvYWxlc2NlZEZyYW1lcywKLQlwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lcyk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5SeENvYWxlc2NlZFRpY2tEdXJpbmdJbnQsCi0JcERldmljZS0+UnhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQpOwotICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuVHhDb2FsZXNjZWRUaWNrRHVyaW5nSW50LAotCXBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50KTsKLSAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50LAotCXBEZXZpY2UtPlJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50KTsKLSAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50LAotCXBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50KTsKKwkvKiBIb3N0IGNvYWxlc2NpbmcgY29uZmlndXJhdGlvbnMuICovCisJUkVHX1dSIChwRGV2aWNlLCBIb3N0Q29hbGVzY2UuUnhDb2FsZXNjaW5nVGlja3MsCisJCXBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5UeENvYWxlc2NpbmdUaWNrcywKKwkJcERldmljZS0+VHhDb2FsZXNjaW5nVGlja3MpOworCVJFR19XUiAocERldmljZSwgSG9zdENvYWxlc2NlLlJ4TWF4Q29hbGVzY2VkRnJhbWVzLAorCQlwRGV2aWNlLT5SeE1heENvYWxlc2NlZEZyYW1lcyk7CisJUkVHX1dSIChwRGV2aWNlLCBIb3N0Q29hbGVzY2UuVHhNYXhDb2FsZXNjZWRGcmFtZXMsCisJCXBEZXZpY2UtPlR4TWF4Q29hbGVzY2VkRnJhbWVzKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5SeENvYWxlc2NlZFRpY2tEdXJpbmdJbnQsCisJCXBEZXZpY2UtPlJ4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50KTsKKwlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5UeENvYWxlc2NlZFRpY2tEdXJpbmdJbnQsCisJCXBEZXZpY2UtPlR4Q29hbGVzY2luZ1RpY2tzRHVyaW5nSW50KTsKKwlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5SeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCwKKwkJcERldmljZS0+UnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQpOworCVJFR19XUiAocERldmljZSwgSG9zdENvYWxlc2NlLlR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50LAorCQlwRGV2aWNlLT5UeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludCk7CiAKLSAgICAvKiBJbml0aWFsaXplIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGF0dXMgYmxvY2suICBUaGUgTklDIHdpbGwgRE1BICovCi0gICAgLyogdGhlIHN0YXR1cyBibG9jayB0byB0aGlzIG1lbW9yeSB3aGljaCByZXNpZGVzIG9uIHRoZSBob3N0LiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuU3RhdHVzQmxrSG9zdEFkZHIuSGlnaCwKLQlwRGV2aWNlLT5TdGF0dXNCbGtQaHkuSGlnaCk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5TdGF0dXNCbGtIb3N0QWRkci5Mb3csCi0JcERldmljZS0+U3RhdHVzQmxrUGh5Lkxvdyk7CisJLyogSW5pdGlhbGl6ZSB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhdHVzIGJsb2NrLiAgVGhlIE5JQyB3aWxsIERNQSAqLworCS8qIHRoZSBzdGF0dXMgYmxvY2sgdG8gdGhpcyBtZW1vcnkgd2hpY2ggcmVzaWRlcyBvbiB0aGUgaG9zdC4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5TdGF0dXNCbGtIb3N0QWRkci5IaWdoLAorCQlwRGV2aWNlLT5TdGF0dXNCbGtQaHkuSGlnaCk7CisJUkVHX1dSIChwRGV2aWNlLCBIb3N0Q29hbGVzY2UuU3RhdHVzQmxrSG9zdEFkZHIuTG93LAorCQlwRGV2aWNlLT5TdGF0dXNCbGtQaHkuTG93KTsKIAotICAgIC8qIEluaXRpYWxpemUgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXRpc3RpY3MgYmxvY2suICBUaGUgTklDIHdpbGwgRE1BICovCi0gICAgLyogdGhlIHN0YXRpc3RpY3MgdG8gdGhpcyBibG9jayBvZiBtZW1vcnkuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5TdGF0c0Jsa0hvc3RBZGRyLkhpZ2gsCi0JcERldmljZS0+U3RhdHNCbGtQaHkuSGlnaCk7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5TdGF0c0Jsa0hvc3RBZGRyLkxvdywKLQlwRGV2aWNlLT5TdGF0c0Jsa1BoeS5Mb3cpOworCS8qIEluaXRpYWxpemUgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXRpc3RpY3MgYmxvY2suICBUaGUgTklDIHdpbGwgRE1BICovCisJLyogdGhlIHN0YXRpc3RpY3MgdG8gdGhpcyBibG9jayBvZiBtZW1vcnkuICovCisJUkVHX1dSIChwRGV2aWNlLCBIb3N0Q29hbGVzY2UuU3RhdHNCbGtIb3N0QWRkci5IaWdoLAorCQlwRGV2aWNlLT5TdGF0c0Jsa1BoeS5IaWdoKTsKKwlSRUdfV1IgKHBEZXZpY2UsIEhvc3RDb2FsZXNjZS5TdGF0c0Jsa0hvc3RBZGRyLkxvdywKKwkJcERldmljZS0+U3RhdHNCbGtQaHkuTG93KTsKIAotICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuU3RhdHNDb2FsZXNjaW5nVGlja3MsCi0JcERldmljZS0+U3RhdHNDb2FsZXNjaW5nVGlja3MpOworCVJFR19XUiAocERldmljZSwgSG9zdENvYWxlc2NlLlN0YXRzQ29hbGVzY2luZ1RpY2tzLAorCQlwRGV2aWNlLT5TdGF0c0NvYWxlc2NpbmdUaWNrcyk7CiAKLSAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLlN0YXRzQmxrTmljQWRkciwgMHgzMDApOwotICAgIFJFR19XUihwRGV2aWNlLCBIb3N0Q29hbGVzY2UuU3RhdHVzQmxrTmljQWRkciwweGIwMCk7CisJUkVHX1dSIChwRGV2aWNlLCBIb3N0Q29hbGVzY2UuU3RhdHNCbGtOaWNBZGRyLCAweDMwMCk7CisJUkVHX1dSIChwRGV2aWNlLCBIb3N0Q29hbGVzY2UuU3RhdHVzQmxrTmljQWRkciwgMHhiMDApOwogCi0gICAgLyogRW5hYmxlIEhvc3QgQ29hbGVzaW5nIHN0YXRlIG1hY2hpbmUgKi8KLSAgICBSRUdfV1IocERldmljZSwgSG9zdENvYWxlc2NlLk1vZGUsIEhPU1RfQ09BTEVTQ0VfRU5BQkxFIHwKLQlwRGV2aWNlLT5Db2FsZXNjZU1vZGUpOworCS8qIEVuYWJsZSBIb3N0IENvYWxlc2luZyBzdGF0ZSBtYWNoaW5lICovCisJUkVHX1dSIChwRGV2aWNlLCBIb3N0Q29hbGVzY2UuTW9kZSwgSE9TVF9DT0FMRVNDRV9FTkFCTEUgfAorCQlwRGV2aWNlLT5Db2FsZXNjZU1vZGUpOwogCi0gICAgLyogRW5hYmxlIHRoZSBSZWNlaXZlIEJEIENvbXBsZXRpb24gc3RhdGUgbWFjaGluZS4gKi8KLSAgICBSRUdfV1IocERldmljZSwgUmN2QmRDb21wLk1vZGUsIFJDVl9CRF9DT01QX01PREVfRU5BQkxFIHwKLQlSQ1ZfQkRfQ09NUF9NT0RFX0FUVE5fRU5BQkxFKTsKKwkvKiBFbmFibGUgdGhlIFJlY2VpdmUgQkQgQ29tcGxldGlvbiBzdGF0ZSBtYWNoaW5lLiAqLworCVJFR19XUiAocERldmljZSwgUmN2QmRDb21wLk1vZGUsIFJDVl9CRF9DT01QX01PREVfRU5BQkxFIHwKKwkJUkNWX0JEX0NPTVBfTU9ERV9BVFROX0VOQUJMRSk7CiAKLSAgICAvKiBFbmFibGUgdGhlIFJlY2VpdmUgTGlzdCBQbGFjZW1lbnQgc3RhdGUgbWFjaGluZS4gKi8KLSAgICBSRUdfV1IocERldmljZSwgUmN2TGlzdFBsbXQuTW9kZSwgUkNWX0xJU1RfUExNVF9NT0RFX0VOQUJMRSk7CisJLyogRW5hYmxlIHRoZSBSZWNlaXZlIExpc3QgUGxhY2VtZW50IHN0YXRlIG1hY2hpbmUuICovCisJUkVHX1dSIChwRGV2aWNlLCBSY3ZMaXN0UGxtdC5Nb2RlLCBSQ1ZfTElTVF9QTE1UX01PREVfRU5BQkxFKTsKIAotICAgIC8qIEVuYWJsZSB0aGUgUmVjZWl2ZSBMaXN0IFNlbGVjdG9yIHN0YXRlIG1hY2hpbmUuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIFJjdkxpc3RTZWwuTW9kZSwgUkNWX0xJU1RfU0VMX01PREVfRU5BQkxFIHwKLQlSQ1ZfTElTVF9TRUxfTU9ERV9BVFROX0VOQUJMRSk7CisJLyogRW5hYmxlIHRoZSBSZWNlaXZlIExpc3QgU2VsZWN0b3Igc3RhdGUgbWFjaGluZS4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFJjdkxpc3RTZWwuTW9kZSwgUkNWX0xJU1RfU0VMX01PREVfRU5BQkxFIHwKKwkJUkNWX0xJU1RfU0VMX01PREVfQVRUTl9FTkFCTEUpOwogCi0gICAgLyogRW5hYmxlIHRyYW5zbWl0IERNQSwgY2xlYXIgc3RhdGlzdGljcy4gKi8KLSAgICBwRGV2aWNlLT5NYWNNb2RlID0gIE1BQ19NT0RFX0VOQUJMRV9UWF9TVEFUSVNUSUNTIHwKLQlNQUNfTU9ERV9FTkFCTEVfUlhfU1RBVElTVElDUyB8IE1BQ19NT0RFX0VOQUJMRV9UREUgfAotCU1BQ19NT0RFX0VOQUJMRV9SREUgfCBNQUNfTU9ERV9FTkFCTEVfRkhERTsKLSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5Nb2RlLCBwRGV2aWNlLT5NYWNNb2RlIHwKLQlNQUNfTU9ERV9DTEVBUl9SWF9TVEFUSVNUSUNTIHwgTUFDX01PREVfQ0xFQVJfVFhfU1RBVElTVElDUyk7CisJLyogRW5hYmxlIHRyYW5zbWl0IERNQSwgY2xlYXIgc3RhdGlzdGljcy4gKi8KKwlwRGV2aWNlLT5NYWNNb2RlID0gTUFDX01PREVfRU5BQkxFX1RYX1NUQVRJU1RJQ1MgfAorCSAgICBNQUNfTU9ERV9FTkFCTEVfUlhfU1RBVElTVElDUyB8IE1BQ19NT0RFX0VOQUJMRV9UREUgfAorCSAgICBNQUNfTU9ERV9FTkFCTEVfUkRFIHwgTUFDX01PREVfRU5BQkxFX0ZIREU7CisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUgfAorCQlNQUNfTU9ERV9DTEVBUl9SWF9TVEFUSVNUSUNTIHwgTUFDX01PREVfQ0xFQVJfVFhfU1RBVElTVElDUyk7CiAKLSAgICAvKiBHUkMgbWlzY2VsbGFuZW91cyBsb2NhbCBjb250cm9sIHJlZ2lzdGVyLiAqLwotICAgIHBEZXZpY2UtPkdyY0xvY2FsQ3RybCA9IEdSQ19NSVNDX0xPQ0FMX0NUUkxfSU5UX09OX0FUVE4gfAotCUdSQ19NSVNDX0xPQ0FMX0NUUkxfQVVUT19TRUVQUk9NOworCS8qIEdSQyBtaXNjZWxsYW5lb3VzIGxvY2FsIGNvbnRyb2wgcmVnaXN0ZXIuICovCisJcERldmljZS0+R3JjTG9jYWxDdHJsID0gR1JDX01JU0NfTE9DQUxfQ1RSTF9JTlRfT05fQVRUTiB8CisJICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfQVVUT19TRUVQUk9NOwogCi0gICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKQotICAgIHsKLQlwRGV2aWNlLT5HcmNMb2NhbEN0cmwgfD0gR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMSB8Ci0JICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQxOwotICAgIH0KLQotICAgIFJFR19XUihwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBwRGV2aWNlLT5HcmNMb2NhbEN0cmwpOwotICAgIE1NX1dhaXQoNDApOwotCi0gICAgLyogUmVzZXQgUlggY291bnRlcnMuICovCi0gICAgZm9yKGogPSAwOyBqIDwgc2l6ZW9mKExNX1JYX0NPVU5URVJTKTsgaisrKQotICAgIHsKLQkoKFBMTV9VSU5UOCkgJnBEZXZpY2UtPlJ4Q291bnRlcnMpW2pdID0gMDsKLSAgICB9Ci0KLSAgICAvKiBSZXNldCBUWCBjb3VudGVycy4gKi8KLSAgICBmb3IoaiA9IDA7IGogPCBzaXplb2YoTE1fVFhfQ09VTlRFUlMpOyBqKyspCi0gICAgewotCSgoUExNX1VJTlQ4KSAmcERldmljZS0+VHhDb3VudGVycylbal0gPSAwOwotICAgIH0KLQotICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LkludGVycnVwdFswXS5Mb3csIDApOwotCi0gICAgLyogRW5hYmxlIHRoZSBETUEgQ29tcGxldGlvbiBzdGF0ZSBtYWNoaW5lLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBEbWFDb21wLk1vZGUsIERNQV9DT01QX01PREVfRU5BQkxFKTsKLQotICAgIC8qIEVuYWJsZSB0aGUgRE1BIFdyaXRlIHN0YXRlIG1hY2hpbmUuICovCi0gICAgVmFsdWUzMiA9IERNQV9XUklURV9NT0RFX0VOQUJMRSB8Ci0JRE1BX1dSSVRFX01PREVfVEFSR0VUX0FCT1JUX0FUVE5fRU5BQkxFIHwKLQlETUFfV1JJVEVfTU9ERV9NQVNURVJfQUJPUlRfQVRUTl9FTkFCTEUgfAotCURNQV9XUklURV9NT0RFX1BBUklUWV9FUlJPUl9BVFROX0VOQUJMRSB8Ci0JRE1BX1dSSVRFX01PREVfQUREUl9PVkVSRkxPV19BVFROX0VOQUJMRSB8Ci0JRE1BX1dSSVRFX01PREVfRklGT19PVkVSUlVOX0FUVE5fRU5BQkxFIHwKLQlETUFfV1JJVEVfTU9ERV9GSUZPX1VOREVSUlVOX0FUVE5fRU5BQkxFIHwKLQlETUFfV1JJVEVfTU9ERV9GSUZPX09WRVJSRUFEX0FUVE5fRU5BQkxFIHwKLQlETUFfV1JJVEVfTU9ERV9MT05HX1JFQURfQVRUTl9FTkFCTEU7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIERtYVdyaXRlLk1vZGUsIFZhbHVlMzIpOwotCi0gICAgaWYgKCEocERldmljZS0+UGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKSkKLSAgICB7Ci0JaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDRfQTApCi0JewotCSAgICBWYWx1ZTE2ID0gUkVHX1JEKHBEZXZpY2UsIFBjaUNmZy5QY2lYQ29tbWFuZCk7Ci0JICAgIFZhbHVlMTYgJj0gfihQQ0lYX0NNRF9NQVhfU1BMSVRfTUFTSyB8IFBDSVhfQ01EX01BWF9CVVJTVF9NQVNLKTsKLQkgICAgVmFsdWUxNiB8PSAoKFBDSVhfQ01EX01BWF9CVVJTVF9DUElPQiA8PCBQQ0lYX0NNRF9NQVhfQlVSU1RfU0hMKSAmCi0JCVBDSVhfQ01EX01BWF9CVVJTVF9NQVNLKTsKLQkgICAgaWYgKHBEZXZpY2UtPlNwbGl0TW9kZUVuYWJsZSA9PSBTUExJVF9NT0RFX0VOQUJMRSkKLQkgICAgewotCQlWYWx1ZTE2IHw9IChwRGV2aWNlLT5TcGxpdE1vZGVNYXhSZXEgPDwgUENJWF9DTURfTUFYX1NQTElUX1NITCkKLQkJICAgJiBQQ0lYX0NNRF9NQVhfU1BMSVRfTUFTSzsKLQkgICAgfQotCSAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLlBjaVhDb21tYW5kLCBWYWx1ZTE2KTsKKwlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkgeworCQlwRGV2aWNlLT5HcmNMb2NhbEN0cmwgfD0gR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMSB8CisJCSAgICBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMTsKIAl9Ci0gICAgfQogCi0gICAgLyogRW5hYmxlIHRoZSBSZWFkIERNQSBzdGF0ZSBtYWNoaW5lLiAqLwotICAgIFZhbHVlMzIgPSBETUFfUkVBRF9NT0RFX0VOQUJMRSB8Ci0JRE1BX1JFQURfTU9ERV9UQVJHRVRfQUJPUlRfQVRUTl9FTkFCTEUgfAotCURNQV9SRUFEX01PREVfTUFTVEVSX0FCT1JUX0FUVE5fRU5BQkxFIHwKLQlETUFfUkVBRF9NT0RFX1BBUklUWV9FUlJPUl9BVFROX0VOQUJMRSB8Ci0JRE1BX1JFQURfTU9ERV9BRERSX09WRVJGTE9XX0FUVE5fRU5BQkxFIHwKLQlETUFfUkVBRF9NT0RFX0ZJRk9fT1ZFUlJVTl9BVFROX0VOQUJMRSB8Ci0JRE1BX1JFQURfTU9ERV9GSUZPX1VOREVSUlVOX0FUVE5fRU5BQkxFIHwKLQlETUFfUkVBRF9NT0RFX0ZJRk9fT1ZFUlJFQURfQVRUTl9FTkFCTEUgfAotCURNQV9SRUFEX01PREVfTE9OR19SRUFEX0FUVE5fRU5BQkxFOworCVJFR19XUiAocERldmljZSwgR3JjLkxvY2FsQ3RybCwgcERldmljZS0+R3JjTG9jYWxDdHJsKTsKKwlNTV9XYWl0ICg0MCk7CiAKLSAgICBpZiAocERldmljZS0+U3BsaXRNb2RlRW5hYmxlID09IFNQTElUX01PREVfRU5BQkxFKQotICAgIHsKLQlWYWx1ZTMyIHw9IERNQV9SRUFEX01PREVfU1BMSVRfRU5BQkxFOwotICAgIH0KLSAgICBSRUdfV1IocERldmljZSwgRG1hUmVhZC5Nb2RlLCBWYWx1ZTMyKTsKKwkvKiBSZXNldCBSWCBjb3VudGVycy4gKi8KKwlmb3IgKGogPSAwOyBqIDwgc2l6ZW9mIChMTV9SWF9DT1VOVEVSUyk7IGorKykgeworCQkoKFBMTV9VSU5UOCkgJiBwRGV2aWNlLT5SeENvdW50ZXJzKVtqXSA9IDA7CisJfQogCi0gICAgLyogRW5hYmxlIHRoZSBSZWNlaXZlIERhdGEgQ29tcGxldGlvbiBzdGF0ZSBtYWNoaW5lLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQ29tcC5Nb2RlLCBSQ1ZfREFUQV9DT01QX01PREVfRU5BQkxFIHwKLQlSQ1ZfREFUQV9DT01QX01PREVfQVRUTl9FTkFCTEUpOworCS8qIFJlc2V0IFRYIGNvdW50ZXJzLiAqLworCWZvciAoaiA9IDA7IGogPCBzaXplb2YgKExNX1RYX0NPVU5URVJTKTsgaisrKSB7CisJCSgoUExNX1VJTlQ4KSAmIHBEZXZpY2UtPlR4Q291bnRlcnMpW2pdID0gMDsKKwl9CiAKLSAgICAvKiBFbmFibGUgdGhlIE1idWYgQ2x1c3RlciBGcmVlIHN0YXRlIG1hY2hpbmUuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIE1idWZDbHVzdGVyRnJlZS5Nb2RlLCBNQlVGX0NMVVNURVJfRlJFRV9NT0RFX0VOQUJMRSk7CisJTUJfUkVHX1dSIChwRGV2aWNlLCBNYWlsYm94LkludGVycnVwdFswXS5Mb3csIDApOwogCi0gICAgLyogRW5hYmxlIHRoZSBTZW5kIERhdGEgQ29tcGxldGlvbiBzdGF0ZSBtYWNoaW5lLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBTbmREYXRhQ29tcC5Nb2RlLCBTTkRfREFUQV9DT01QX01PREVfRU5BQkxFKTsKKwkvKiBFbmFibGUgdGhlIERNQSBDb21wbGV0aW9uIHN0YXRlIG1hY2hpbmUuICovCisJUkVHX1dSIChwRGV2aWNlLCBEbWFDb21wLk1vZGUsIERNQV9DT01QX01PREVfRU5BQkxFKTsKIAotICAgIC8qIEVuYWJsZSB0aGUgU2VuZCBCRCBDb21wbGV0aW9uIHN0YXRlIG1hY2hpbmUuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIFNuZEJkQ29tcC5Nb2RlLCBTTkRfQkRfQ09NUF9NT0RFX0VOQUJMRSB8Ci0JU05EX0JEX0NPTVBfTU9ERV9BVFROX0VOQUJMRSk7CisJLyogRW5hYmxlIHRoZSBETUEgV3JpdGUgc3RhdGUgbWFjaGluZS4gKi8KKwlWYWx1ZTMyID0gRE1BX1dSSVRFX01PREVfRU5BQkxFIHwKKwkgICAgRE1BX1dSSVRFX01PREVfVEFSR0VUX0FCT1JUX0FUVE5fRU5BQkxFIHwKKwkgICAgRE1BX1dSSVRFX01PREVfTUFTVEVSX0FCT1JUX0FUVE5fRU5BQkxFIHwKKwkgICAgRE1BX1dSSVRFX01PREVfUEFSSVRZX0VSUk9SX0FUVE5fRU5BQkxFIHwKKwkgICAgRE1BX1dSSVRFX01PREVfQUREUl9PVkVSRkxPV19BVFROX0VOQUJMRSB8CisJICAgIERNQV9XUklURV9NT0RFX0ZJRk9fT1ZFUlJVTl9BVFROX0VOQUJMRSB8CisJICAgIERNQV9XUklURV9NT0RFX0ZJRk9fVU5ERVJSVU5fQVRUTl9FTkFCTEUgfAorCSAgICBETUFfV1JJVEVfTU9ERV9GSUZPX09WRVJSRUFEX0FUVE5fRU5BQkxFIHwKKwkgICAgRE1BX1dSSVRFX01PREVfTE9OR19SRUFEX0FUVE5fRU5BQkxFOworCVJFR19XUiAocERldmljZSwgRG1hV3JpdGUuTW9kZSwgVmFsdWUzMik7CiAKLSAgICAvKiBFbmFibGUgdGhlIFJlY2VpdmUgQkQgSW5pdGlhdG9yIHN0YXRlIG1hY2hpbmUuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIFJjdkJkSW4uTW9kZSwgUkNWX0JEX0lOX01PREVfRU5BQkxFIHwKLQlSQ1ZfQkRfSU5fTU9ERV9CRF9JTl9ESUFCTEVEX1JDQl9BVFROX0VOQUJMRSk7CisJaWYgKCEocERldmljZS0+UGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKSkgeworCQlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwNF9BMCkgeworCQkJVmFsdWUxNiA9IFJFR19SRCAocERldmljZSwgUGNpQ2ZnLlBjaVhDb21tYW5kKTsKKwkJCVZhbHVlMTYgJj0KKwkJCSAgICB+KFBDSVhfQ01EX01BWF9TUExJVF9NQVNLIHwKKwkJCSAgICAgIFBDSVhfQ01EX01BWF9CVVJTVF9NQVNLKTsKKwkJCVZhbHVlMTYgfD0KKwkJCSAgICAoKFBDSVhfQ01EX01BWF9CVVJTVF9DUElPQiA8PAorCQkJICAgICAgUENJWF9DTURfTUFYX0JVUlNUX1NITCkgJgorCQkJICAgICBQQ0lYX0NNRF9NQVhfQlVSU1RfTUFTSyk7CisJCQlpZiAocERldmljZS0+U3BsaXRNb2RlRW5hYmxlID09IFNQTElUX01PREVfRU5BQkxFKSB7CisJCQkJVmFsdWUxNiB8PQorCQkJCSAgICAocERldmljZS0+CisJCQkJICAgICBTcGxpdE1vZGVNYXhSZXEgPDwgUENJWF9DTURfTUFYX1NQTElUX1NITCkKKwkJCQkgICAgJiBQQ0lYX0NNRF9NQVhfU1BMSVRfTUFTSzsKKwkJCX0KKwkJCVJFR19XUiAocERldmljZSwgUGNpQ2ZnLlBjaVhDb21tYW5kLCBWYWx1ZTE2KTsKKwkJfQorCX0KIAotICAgIC8qIEVuYWJsZSB0aGUgUmVjZWl2ZSBEYXRhIGFuZCBSZWNlaXZlIEJEIEluaXRpYXRvciBzdGF0ZSBtYWNoaW5lLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBSY3ZEYXRhQmRJbi5Nb2RlLCBSQ1ZfREFUQV9CRF9JTl9NT0RFX0VOQUJMRSB8Ci0JUkNWX0RBVEFfQkRfSU5fTU9ERV9JTlZBTElEX1JJTkdfU0laRSk7CisJLyogRW5hYmxlIHRoZSBSZWFkIERNQSBzdGF0ZSBtYWNoaW5lLiAqLworCVZhbHVlMzIgPSBETUFfUkVBRF9NT0RFX0VOQUJMRSB8CisJICAgIERNQV9SRUFEX01PREVfVEFSR0VUX0FCT1JUX0FUVE5fRU5BQkxFIHwKKwkgICAgRE1BX1JFQURfTU9ERV9NQVNURVJfQUJPUlRfQVRUTl9FTkFCTEUgfAorCSAgICBETUFfUkVBRF9NT0RFX1BBUklUWV9FUlJPUl9BVFROX0VOQUJMRSB8CisJICAgIERNQV9SRUFEX01PREVfQUREUl9PVkVSRkxPV19BVFROX0VOQUJMRSB8CisJICAgIERNQV9SRUFEX01PREVfRklGT19PVkVSUlVOX0FUVE5fRU5BQkxFIHwKKwkgICAgRE1BX1JFQURfTU9ERV9GSUZPX1VOREVSUlVOX0FUVE5fRU5BQkxFIHwKKwkgICAgRE1BX1JFQURfTU9ERV9GSUZPX09WRVJSRUFEX0FUVE5fRU5BQkxFIHwKKwkgICAgRE1BX1JFQURfTU9ERV9MT05HX1JFQURfQVRUTl9FTkFCTEU7CiAKLSAgICAvKiBFbmFibGUgdGhlIFNlbmQgRGF0YSBJbml0aWF0b3Igc3RhdGUgbWFjaGluZS4gKi8KLSAgICBSRUdfV1IocERldmljZSwgU25kRGF0YUluLk1vZGUsIFQzX1NORF9EQVRBX0lOX01PREVfRU5BQkxFKTsKKwlpZiAocERldmljZS0+U3BsaXRNb2RlRW5hYmxlID09IFNQTElUX01PREVfRU5BQkxFKSB7CisJCVZhbHVlMzIgfD0gRE1BX1JFQURfTU9ERV9TUExJVF9FTkFCTEU7CisJfQorCVJFR19XUiAocERldmljZSwgRG1hUmVhZC5Nb2RlLCBWYWx1ZTMyKTsKIAotICAgIC8qIEVuYWJsZSB0aGUgU2VuZCBCRCBJbml0aWF0b3Igc3RhdGUgbWFjaGluZS4gKi8KLSAgICBSRUdfV1IocERldmljZSwgU25kQmRJbi5Nb2RlLCBTTkRfQkRfSU5fTU9ERV9FTkFCTEUgfAotCVNORF9CRF9JTl9NT0RFX0FUVE5fRU5BQkxFKTsKKwkvKiBFbmFibGUgdGhlIFJlY2VpdmUgRGF0YSBDb21wbGV0aW9uIHN0YXRlIG1hY2hpbmUuICovCisJUkVHX1dSIChwRGV2aWNlLCBSY3ZEYXRhQ29tcC5Nb2RlLCBSQ1ZfREFUQV9DT01QX01PREVfRU5BQkxFIHwKKwkJUkNWX0RBVEFfQ09NUF9NT0RFX0FUVE5fRU5BQkxFKTsKIAotICAgIC8qIEVuYWJsZSB0aGUgU2VuZCBCRCBTZWxlY3RvciBzdGF0ZSBtYWNoaW5lLiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBTbmRCZFNlbC5Nb2RlLCBTTkRfQkRfU0VMX01PREVfRU5BQkxFIHwKLQlTTkRfQkRfU0VMX01PREVfQVRUTl9FTkFCTEUpOworCS8qIEVuYWJsZSB0aGUgTWJ1ZiBDbHVzdGVyIEZyZWUgc3RhdGUgbWFjaGluZS4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIE1idWZDbHVzdGVyRnJlZS5Nb2RlLCBNQlVGX0NMVVNURVJfRlJFRV9NT0RFX0VOQUJMRSk7CisKKwkvKiBFbmFibGUgdGhlIFNlbmQgRGF0YSBDb21wbGV0aW9uIHN0YXRlIG1hY2hpbmUuICovCisJUkVHX1dSIChwRGV2aWNlLCBTbmREYXRhQ29tcC5Nb2RlLCBTTkRfREFUQV9DT01QX01PREVfRU5BQkxFKTsKKworCS8qIEVuYWJsZSB0aGUgU2VuZCBCRCBDb21wbGV0aW9uIHN0YXRlIG1hY2hpbmUuICovCisJUkVHX1dSIChwRGV2aWNlLCBTbmRCZENvbXAuTW9kZSwgU05EX0JEX0NPTVBfTU9ERV9FTkFCTEUgfAorCQlTTkRfQkRfQ09NUF9NT0RFX0FUVE5fRU5BQkxFKTsKKworCS8qIEVuYWJsZSB0aGUgUmVjZWl2ZSBCRCBJbml0aWF0b3Igc3RhdGUgbWFjaGluZS4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFJjdkJkSW4uTW9kZSwgUkNWX0JEX0lOX01PREVfRU5BQkxFIHwKKwkJUkNWX0JEX0lOX01PREVfQkRfSU5fRElBQkxFRF9SQ0JfQVRUTl9FTkFCTEUpOworCisJLyogRW5hYmxlIHRoZSBSZWNlaXZlIERhdGEgYW5kIFJlY2VpdmUgQkQgSW5pdGlhdG9yIHN0YXRlIG1hY2hpbmUuICovCisJUkVHX1dSIChwRGV2aWNlLCBSY3ZEYXRhQmRJbi5Nb2RlLCBSQ1ZfREFUQV9CRF9JTl9NT0RFX0VOQUJMRSB8CisJCVJDVl9EQVRBX0JEX0lOX01PREVfSU5WQUxJRF9SSU5HX1NJWkUpOworCisJLyogRW5hYmxlIHRoZSBTZW5kIERhdGEgSW5pdGlhdG9yIHN0YXRlIG1hY2hpbmUuICovCisJUkVHX1dSIChwRGV2aWNlLCBTbmREYXRhSW4uTW9kZSwgVDNfU05EX0RBVEFfSU5fTU9ERV9FTkFCTEUpOworCisJLyogRW5hYmxlIHRoZSBTZW5kIEJEIEluaXRpYXRvciBzdGF0ZSBtYWNoaW5lLiAqLworCVJFR19XUiAocERldmljZSwgU25kQmRJbi5Nb2RlLCBTTkRfQkRfSU5fTU9ERV9FTkFCTEUgfAorCQlTTkRfQkRfSU5fTU9ERV9BVFROX0VOQUJMRSk7CisKKwkvKiBFbmFibGUgdGhlIFNlbmQgQkQgU2VsZWN0b3Igc3RhdGUgbWFjaGluZS4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIFNuZEJkU2VsLk1vZGUsIFNORF9CRF9TRUxfTU9ERV9FTkFCTEUgfAorCQlTTkRfQkRfU0VMX01PREVfQVRUTl9FTkFCTEUpOwogCiAjaWYgSU5DTFVERV81NzAxX0FYX0ZJWAotICAgIC8qIExvYWQgdGhlIGZpcm13YXJlIGZvciB0aGUgNTcwMV9BMCB3b3JrYXJvdW5kLiAqLwotICAgIGlmKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQTApCi0gICAgewotCUxNX0xvYWRSbHNGaXJtd2FyZShwRGV2aWNlKTsKLSAgICB9CisJLyogTG9hZCB0aGUgZmlybXdhcmUgZm9yIHRoZSA1NzAxX0EwIHdvcmthcm91bmQuICovCisJaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQTApIHsKKwkJTE1fTG9hZFJsc0Zpcm13YXJlIChwRGV2aWNlKTsKKwl9CiAjZW5kaWYKIAotICAgIC8qIEVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIuICovCi0gICAgcERldmljZS0+VHhNb2RlID0gVFhfTU9ERV9FTkFCTEU7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuVHhNb2RlLCBwRGV2aWNlLT5UeE1vZGUpOworCS8qIEVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIuICovCisJcERldmljZS0+VHhNb2RlID0gVFhfTU9ERV9FTkFCTEU7CisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlR4TW9kZSwgcERldmljZS0+VHhNb2RlKTsKIAotICAgIC8qIEVuYWJsZSB0aGUgcmVjZWl2ZXIuICovCi0gICAgcERldmljZS0+UnhNb2RlID0gUlhfTU9ERV9FTkFCTEU7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUnhNb2RlLCBwRGV2aWNlLT5SeE1vZGUpOworCS8qIEVuYWJsZSB0aGUgcmVjZWl2ZXIuICovCisJcERldmljZS0+UnhNb2RlID0gUlhfTU9ERV9FTkFCTEU7CisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlJ4TW9kZSwgcERldmljZS0+UnhNb2RlKTsKIAotICAgIGlmIChwRGV2aWNlLT5SZXN0b3JlT25XYWtlVXApCi0gICAgewotCXBEZXZpY2UtPlJlc3RvcmVPbldha2VVcCA9IEZBTFNFOwotCXBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID0gcERldmljZS0+V2FrZVVwRGlzYWJsZUF1dG9OZWc7Ci0JcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID0gcERldmljZS0+V2FrZVVwUmVxdWVzdGVkTWVkaWFUeXBlOwotICAgIH0KLQotICAgIC8qIERpc2FibGUgYXV0byBwb2xsaW5nLiAqLwotICAgIHBEZXZpY2UtPk1pTW9kZSA9IDB4YzAwMDA7Ci0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWlNb2RlLCBwRGV2aWNlLT5NaU1vZGUpOwotCi0gICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8Ci0JVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKQotICAgIHsKLQlWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlpZihwRGV2aWNlLT5MZWRNb2RlID09IExFRF9NT0RFX09VVFBVVCkKLQl7Ci0JICAgIFZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8yOworCWlmIChwRGV2aWNlLT5SZXN0b3JlT25XYWtlVXApIHsKKwkJcERldmljZS0+UmVzdG9yZU9uV2FrZVVwID0gRkFMU0U7CisJCXBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID0gcERldmljZS0+V2FrZVVwRGlzYWJsZUF1dG9OZWc7CisJCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9IHBEZXZpY2UtPldha2VVcFJlcXVlc3RlZE1lZGlhVHlwZTsKIAl9Ci0JZWxzZQotCXsKLQkgICAgVmFsdWUzMiA9IExFRF9DVFJMX1BIWV9NT0RFXzE7CisKKwkvKiBEaXNhYmxlIGF1dG8gcG9sbGluZy4gKi8KKwlwRGV2aWNlLT5NaU1vZGUgPSAweGMwMDAwOworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NaU1vZGUsIHBEZXZpY2UtPk1pTW9kZSk7CisKKwlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAorCSAgICBUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKSB7CisJCVZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8xOworCX0gZWxzZSB7CisJCWlmIChwRGV2aWNlLT5MZWRNb2RlID09IExFRF9NT0RFX09VVFBVVCkgeworCQkJVmFsdWUzMiA9IExFRF9DVFJMX1BIWV9NT0RFXzI7CisJCX0gZWxzZSB7CisJCQlWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMTsKKwkJfQogCX0KLSAgICB9Ci0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTGVkQ3RybCwgVmFsdWUzMik7CisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLkxlZEN0cmwsIFZhbHVlMzIpOwogCi0gICAgLyogQWN0aXZhdGUgTGluayB0byBlbmFibGUgTUFDIHN0YXRlIG1hY2hpbmUgKi8KLSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5NaVN0YXR1cywgTUlfU1RBVFVTX0VOQUJMRV9MSU5LX1NUQVRVU19BVFROKTsKKwkvKiBBY3RpdmF0ZSBMaW5rIHRvIGVuYWJsZSBNQUMgc3RhdGUgbWFjaGluZSAqLworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NaVN0YXR1cywgTUlfU1RBVFVTX0VOQUJMRV9MSU5LX1NUQVRVU19BVFROKTsKIAotICAgIGlmIChwRGV2aWNlLT5FbmFibGVUYmkpCi0gICAgewotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJ4TW9kZSwgUlhfTU9ERV9SRVNFVCk7Ci0JTU1fV2FpdCgxMCk7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUnhNb2RlLCBwRGV2aWNlLT5SeE1vZGUpOwotCWlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAzX0ExKQotCXsKLQkgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuU2VyZGVzQ2ZnLCAweDYxNjAwMCk7CisJaWYgKHBEZXZpY2UtPkVuYWJsZVRiaSkgeworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuUnhNb2RlLCBSWF9NT0RFX1JFU0VUKTsKKwkJTU1fV2FpdCAoMTApOworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuUnhNb2RlLCBwRGV2aWNlLT5SeE1vZGUpOworCQlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwM19BMSkgeworCQkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlNlcmRlc0NmZywgMHg2MTYwMDApOworCQl9CiAJfQotICAgIH0KLSAgICAvKiBTZXR1cCB0aGUgcGh5IGNoaXAuICovCi0gICAgTE1fU2V0dXBQaHkocERldmljZSk7CisJLyogU2V0dXAgdGhlIHBoeSBjaGlwLiAqLworCUxNX1NldHVwUGh5IChwRGV2aWNlKTsKIAotICAgIGlmICghcERldmljZS0+RW5hYmxlVGJpKSB7Ci0JLyogQ2xlYXIgQ1JDIHN0YXRzICovCi0JTE1fUmVhZFBoeShwRGV2aWNlLCAweDFlLCAmVmFsdWUzMik7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgMHgxZSwgVmFsdWUzMiB8IDB4ODAwMCk7Ci0JTE1fUmVhZFBoeShwRGV2aWNlLCAweDE0LCAmVmFsdWUzMik7Ci0gICAgfQorCWlmICghcERldmljZS0+RW5hYmxlVGJpKSB7CisJCS8qIENsZWFyIENSQyBzdGF0cyAqLworCQlMTV9SZWFkUGh5IChwRGV2aWNlLCAweDFlLCAmVmFsdWUzMik7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCAweDFlLCBWYWx1ZTMyIHwgMHg4MDAwKTsKKwkJTE1fUmVhZFBoeSAocERldmljZSwgMHgxNCwgJlZhbHVlMzIpOworCX0KIAotICAgIC8qIFNldCB1cCB0aGUgcmVjZWl2ZSBtYXNrLiAqLwotICAgIExNX1NldFJlY2VpdmVNYXNrKHBEZXZpY2UsIHBEZXZpY2UtPlJlY2VpdmVNYXNrKTsKKwkvKiBTZXQgdXAgdGhlIHJlY2VpdmUgbWFzay4gKi8KKwlMTV9TZXRSZWNlaXZlTWFzayAocERldmljZSwgcERldmljZS0+UmVjZWl2ZU1hc2spOwogCi0gICAgLyogUXVldWUgUnggcGFja2V0IGJ1ZmZlcnMuICovCi0gICAgaWYocERldmljZS0+UXVldWVSeFBhY2tldHMpCi0gICAgewotCUxNX1F1ZXVlUnhQYWNrZXRzKHBEZXZpY2UpOwotICAgIH0KKwkvKiBRdWV1ZSBSeCBwYWNrZXQgYnVmZmVycy4gKi8KKwlpZiAocERldmljZS0+UXVldWVSeFBhY2tldHMpIHsKKwkJTE1fUXVldWVSeFBhY2tldHMgKHBEZXZpY2UpOworCX0KIAotICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHQgdG8gdGhlIGhvc3QuICovCi0gICAgaWYocERldmljZS0+SW5pdERvbmUpCi0gICAgewotCUxNX0VuYWJsZUludGVycnVwdChwRGV2aWNlKTsKLSAgICB9CisJLyogRW5hYmxlIGludGVycnVwdCB0byB0aGUgaG9zdC4gKi8KKwlpZiAocERldmljZS0+SW5pdERvbmUpIHsKKwkJTE1fRW5hYmxlSW50ZXJydXB0IChwRGV2aWNlKTsKKwl9CiAKLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Ci19IC8qIExNX1Jlc2V0QWRhcHRlciAqLwotCisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQkJCQkvKiBMTV9SZXNldEFkYXB0ZXIgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yOTc5LDE4ICsyNzYyLDE1IEBACiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgTE1fU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9TVEFUVVMKLUxNX0Rpc2FibGVJbnRlcnJ1cHQoCi0gICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQorTE1fU1RBVFVTIExNX0Rpc2FibGVJbnRlcnJ1cHQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKIHsKLSAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLk1pc2NIb3N0Q3RybCwgcERldmljZS0+TWlzY0hvc3RDdHJsIHwKLQlNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQpOwotICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LkludGVycnVwdFswXS5Mb3csIDEpOworCVJFR19XUiAocERldmljZSwgUGNpQ2ZnLk1pc2NIb3N0Q3RybCwgcERldmljZS0+TWlzY0hvc3RDdHJsIHwKKwkJTUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UKTsKKwlNQl9SRUdfV1IgKHBEZXZpY2UsIE1haWxib3guSW50ZXJydXB0WzBdLkxvdywgMSk7CiAKLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVGhpcyByb3V0aW5lIGVuYWJsZXMgdGhlIGFkYXB0ZXIgdG8gZ2VuZXJhdGUgaW50ZXJydXB0cy4gICAgICAgICAgICAgICAgKi8KQEAgLTI5OTgsMjQgKzI3NzgsMjAgQEAKIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBMTV9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxNX1NUQVRVUwotTE1fRW5hYmxlSW50ZXJydXB0KAotICAgIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK0xNX1NUQVRVUyBMTV9FbmFibGVJbnRlcnJ1cHQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKIHsKLSAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLk1pc2NIb3N0Q3RybCwgcERldmljZS0+TWlzY0hvc3RDdHJsICYKLQl+TUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UKTsKLSAgICBNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5JbnRlcnJ1cHRbMF0uTG93LCAwKTsKKwlSRUdfV1IgKHBEZXZpY2UsIFBjaUNmZy5NaXNjSG9zdEN0cmwsIHBEZXZpY2UtPk1pc2NIb3N0Q3RybCAmCisJCX5NSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQpOworCU1CX1JFR19XUiAocERldmljZSwgTWFpbGJveC5JbnRlcnJ1cHRbMF0uTG93LCAwKTsKIAotICAgIGlmKHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgJiBTVEFUVVNfQkxPQ0tfVVBEQVRFRCkKLSAgICB7Ci0JUkVHX1dSKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsIHBEZXZpY2UtPkdyY0xvY2FsQ3RybCB8Ci0JICAgIEdSQ19NSVNDX0xPQ0FMX0NUUkxfU0VUX0lOVCk7Ci0gICAgfQorCWlmIChwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzICYgU1RBVFVTX0JMT0NLX1VQREFURUQpIHsKKwkJUkVHX1dSIChwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBwRGV2aWNlLT5HcmNMb2NhbEN0cmwgfAorCQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9TRVRfSU5UKTsKKwl9CiAKLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVGhpcyByb3V0aW5lIHB1dHMgYSBwYWNrZXQgb24gdGhlIHdpcmUgaWYgdGhlcmUgaXMgYSB0cmFuc21pdCBETUEgICAgICAgKi8KQEAgLTMwMjcsMzA2ICsyODAzLDI3OSBAQAogLyogICAgTE1fU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWYgMAotTE1fU1RBVFVTCi1MTV9TZW5kUGFja2V0KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KQorTE1fU1RBVFVTIExNX1NlbmRQYWNrZXQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KQogewotICAgIExNX1VJTlQzMiBGcmFnQ291bnQ7Ci0gICAgUFQzX1NORF9CRCBwU2VuZEJkOwotICAgIFBUM19TTkRfQkQgcFNoYWRvd1NlbmRCZDsKLSAgICBMTV9VSU5UMzIgVmFsdWUzMiwgTGVuOwotICAgIExNX1VJTlQzMiBJZHg7CisJTE1fVUlOVDMyIEZyYWdDb3VudDsKKwlQVDNfU05EX0JEIHBTZW5kQmQ7CisJUFQzX1NORF9CRCBwU2hhZG93U2VuZEJkOworCUxNX1VJTlQzMiBWYWx1ZTMyLCBMZW47CisJTE1fVUlOVDMyIElkeDsKIAotICAgIGlmIChUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApIHsKLQlyZXR1cm4gTE1fNTcwMFNlbmRQYWNrZXQocERldmljZSwgcFBhY2tldCk7Ci0gICAgfQorCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKSB7CisJCXJldHVybiBMTV81NzAwU2VuZFBhY2tldCAocERldmljZSwgcFBhY2tldCk7CisJfQogCi0gICAgLyogVXBkYXRlIHRoZSBTZW5kQmRMZWZ0IGNvdW50LiAqLwotICAgIGF0b21pY19zdWIocFBhY2tldC0+dS5UeC5GcmFnQ291bnQsICZwRGV2aWNlLT5TZW5kQmRMZWZ0KTsKKwkvKiBVcGRhdGUgdGhlIFNlbmRCZExlZnQgY291bnQuICovCisJYXRvbWljX3N1YiAocFBhY2tldC0+dS5UeC5GcmFnQ291bnQsICZwRGV2aWNlLT5TZW5kQmRMZWZ0KTsKIAotICAgIC8qIEluaXRhbGl6ZSB0aGUgc2VuZCBidWZmZXIgZGVzY3JpcHRvcnMuICovCi0gICAgSWR4ID0gcERldmljZS0+U2VuZFByb2RJZHg7CisJLyogSW5pdGFsaXplIHRoZSBzZW5kIGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KKwlJZHggPSBwRGV2aWNlLT5TZW5kUHJvZElkeDsKIAotICAgIHBTZW5kQmQgPSAmcERldmljZS0+cFNlbmRCZFZpcnRbSWR4XTsKKwlwU2VuZEJkID0gJnBEZXZpY2UtPnBTZW5kQmRWaXJ0W0lkeF07CiAKLSAgICAvKiBOZXh0IHByb2R1Y2VyIGluZGV4LiAqLwotICAgIGlmIChwRGV2aWNlLT5OaWNTZW5kQmQgPT0gVFJVRSkKLSAgICB7Ci0JVDNfNjRCSVRfSE9TVF9BRERSIHBhZGRyOworCS8qIE5leHQgcHJvZHVjZXIgaW5kZXguICovCisJaWYgKHBEZXZpY2UtPk5pY1NlbmRCZCA9PSBUUlVFKSB7CisJCVQzXzY0QklUX0hPU1RfQUREUiBwYWRkcjsKIAotCXBTaGFkb3dTZW5kQmQgPSAmcERldmljZS0+U2hhZG93U2VuZEJkW0lkeF07Ci0JZm9yKEZyYWdDb3VudCA9IDA7IDsgKQotCXsKLQkgICAgTU1fTWFwVHhEbWEocERldmljZSwgcFBhY2tldCwgJnBhZGRyLCAmTGVuLCBGcmFnQ291bnQpOwotCSAgICAvKiBJbml0aWFsaXplIHRoZSBwb2ludGVyIHRvIHRoZSBzZW5kIGJ1ZmZlciBmcmFnbWVudC4gKi8KLQkgICAgaWYgKHBhZGRyLkhpZ2ggIT0gcFNoYWRvd1NlbmRCZC0+SG9zdEFkZHIuSGlnaCkKLQkgICAgewotCQlfX3Jhd193cml0ZWwocGFkZHIuSGlnaCwgJihwU2VuZEJkLT5Ib3N0QWRkci5IaWdoKSk7Ci0JCXBTaGFkb3dTZW5kQmQtPkhvc3RBZGRyLkhpZ2ggPSBwYWRkci5IaWdoOwotCSAgICB9Ci0JICAgIF9fcmF3X3dyaXRlbChwYWRkci5Mb3csICYocFNlbmRCZC0+SG9zdEFkZHIuTG93KSk7CisJCXBTaGFkb3dTZW5kQmQgPSAmcERldmljZS0+U2hhZG93U2VuZEJkW0lkeF07CisJCWZvciAoRnJhZ0NvdW50ID0gMDs7KSB7CisJCQlNTV9NYXBUeERtYSAocERldmljZSwgcFBhY2tldCwgJnBhZGRyLCAmTGVuLCBGcmFnQ291bnQpOworCQkJLyogSW5pdGlhbGl6ZSB0aGUgcG9pbnRlciB0byB0aGUgc2VuZCBidWZmZXIgZnJhZ21lbnQuICovCisJCQlpZiAocGFkZHIuSGlnaCAhPSBwU2hhZG93U2VuZEJkLT5Ib3N0QWRkci5IaWdoKSB7CisJCQkJX19yYXdfd3JpdGVsIChwYWRkci5IaWdoLAorCQkJCQkgICAgICAmKHBTZW5kQmQtPkhvc3RBZGRyLkhpZ2gpKTsKKwkJCQlwU2hhZG93U2VuZEJkLT5Ib3N0QWRkci5IaWdoID0gcGFkZHIuSGlnaDsKKwkJCX0KKwkJCV9fcmF3X3dyaXRlbCAocGFkZHIuTG93LCAmKHBTZW5kQmQtPkhvc3RBZGRyLkxvdykpOwogCi0JICAgIC8qIFNldHVwIHRoZSBjb250cm9sIGZsYWdzIGFuZCBzZW5kIGJ1ZmZlciBzaXplLiAqLwotCSAgICBWYWx1ZTMyID0gKExlbiA8PCAxNikgfCBwUGFja2V0LT5GbGFnczsKKwkJCS8qIFNldHVwIHRoZSBjb250cm9sIGZsYWdzIGFuZCBzZW5kIGJ1ZmZlciBzaXplLiAqLworCQkJVmFsdWUzMiA9IChMZW4gPDwgMTYpIHwgcFBhY2tldC0+RmxhZ3M7CiAKLQkgICAgSWR4ID0gKElkeCArIDEpICYgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKKwkJCUlkeCA9IChJZHggKyAxKSAmIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UX01BU0s7CiAKLQkgICAgRnJhZ0NvdW50Kys7Ci0JICAgIGlmIChGcmFnQ291bnQgPj0gcFBhY2tldC0+dS5UeC5GcmFnQ291bnQpCi0JICAgIHsKLQkJVmFsdWUzMiB8PSBTTkRfQkRfRkxBR19FTkQ7Ci0JCWlmIChWYWx1ZTMyICE9IHBTaGFkb3dTZW5kQmQtPnUxLkxlbl9GbGFncykKLQkJewotCQkgICAgX19yYXdfd3JpdGVsKFZhbHVlMzIsICYocFNlbmRCZC0+dTEuTGVuX0ZsYWdzKSk7Ci0JCSAgICBwU2hhZG93U2VuZEJkLT51MS5MZW5fRmxhZ3MgPSBWYWx1ZTMyOwotCQl9Ci0JCWlmIChwUGFja2V0LT5GbGFncyAmIFNORF9CRF9GTEFHX1ZMQU5fVEFHKSB7Ci0JCSAgICBfX3Jhd193cml0ZWwocFBhY2tldC0+VmxhblRhZywgJihwU2VuZEJkLT51Mi5WbGFuVGFnKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCWlmIChWYWx1ZTMyICE9IHBTaGFkb3dTZW5kQmQtPnUxLkxlbl9GbGFncykKLQkJewotCQkgICAgX19yYXdfd3JpdGVsKFZhbHVlMzIsICYocFNlbmRCZC0+dTEuTGVuX0ZsYWdzKSk7Ci0JCSAgICBwU2hhZG93U2VuZEJkLT51MS5MZW5fRmxhZ3MgPSBWYWx1ZTMyOwotCQl9Ci0JCWlmIChwUGFja2V0LT5GbGFncyAmIFNORF9CRF9GTEFHX1ZMQU5fVEFHKSB7Ci0JCSAgICBfX3Jhd193cml0ZWwocFBhY2tldC0+VmxhblRhZywgJihwU2VuZEJkLT51Mi5WbGFuVGFnKSk7Ci0JCX0KLQkgICAgfQorCQkJRnJhZ0NvdW50Kys7CisJCQlpZiAoRnJhZ0NvdW50ID49IHBQYWNrZXQtPnUuVHguRnJhZ0NvdW50KSB7CisJCQkJVmFsdWUzMiB8PSBTTkRfQkRfRkxBR19FTkQ7CisJCQkJaWYgKFZhbHVlMzIgIT0gcFNoYWRvd1NlbmRCZC0+dTEuTGVuX0ZsYWdzKSB7CisJCQkJCV9fcmF3X3dyaXRlbCAoVmFsdWUzMiwKKwkJCQkJCSAgICAgICYocFNlbmRCZC0+dTEuTGVuX0ZsYWdzKSk7CisJCQkJCXBTaGFkb3dTZW5kQmQtPnUxLkxlbl9GbGFncyA9IFZhbHVlMzI7CisJCQkJfQorCQkJCWlmIChwUGFja2V0LT5GbGFncyAmIFNORF9CRF9GTEFHX1ZMQU5fVEFHKSB7CisJCQkJCV9fcmF3X3dyaXRlbCAocFBhY2tldC0+VmxhblRhZywKKwkJCQkJCSAgICAgICYocFNlbmRCZC0+dTIuVmxhblRhZykpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKFZhbHVlMzIgIT0gcFNoYWRvd1NlbmRCZC0+dTEuTGVuX0ZsYWdzKSB7CisJCQkJCV9fcmF3X3dyaXRlbCAoVmFsdWUzMiwKKwkJCQkJCSAgICAgICYocFNlbmRCZC0+dTEuTGVuX0ZsYWdzKSk7CisJCQkJCXBTaGFkb3dTZW5kQmQtPnUxLkxlbl9GbGFncyA9IFZhbHVlMzI7CisJCQkJfQorCQkJCWlmIChwUGFja2V0LT5GbGFncyAmIFNORF9CRF9GTEFHX1ZMQU5fVEFHKSB7CisJCQkJCV9fcmF3X3dyaXRlbCAocFBhY2tldC0+VmxhblRhZywKKwkJCQkJCSAgICAgICYocFNlbmRCZC0+dTIuVmxhblRhZykpOworCQkJCX0KKwkJCX0KIAotCSAgICBwU2VuZEJkKys7Ci0JICAgIHBTaGFkb3dTZW5kQmQrKzsKLQkgICAgaWYgKElkeCA9PSAwKQotCSAgICB7Ci0JCXBTZW5kQmQgPSAmcERldmljZS0+cFNlbmRCZFZpcnRbMF07Ci0JCXBTaGFkb3dTZW5kQmQgPSAmcERldmljZS0+U2hhZG93U2VuZEJkWzBdOwotCSAgICB9Ci0JfSAvKiBmb3IgKi8KKwkJCXBTZW5kQmQrKzsKKwkJCXBTaGFkb3dTZW5kQmQrKzsKKwkJCWlmIChJZHggPT0gMCkgeworCQkJCXBTZW5kQmQgPSAmcERldmljZS0+cFNlbmRCZFZpcnRbMF07CisJCQkJcFNoYWRvd1NlbmRCZCA9ICZwRGV2aWNlLT5TaGFkb3dTZW5kQmRbMF07CisJCQl9CisJCX0JCS8qIGZvciAqLwogCi0JLyogUHV0IHRoZSBwYWNrZXQgZGVzY3JpcHRvciBpbiB0aGUgQWN0aXZlUS4gKi8KLQlRUV9QdXNoVGFpbCgmcERldmljZS0+VHhQYWNrZXRBY3RpdmVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisJCS8qIFB1dCB0aGUgcGFja2V0IGRlc2NyaXB0b3IgaW4gdGhlIEFjdGl2ZVEuICovCisJCVFRX1B1c2hUYWlsICgmcERldmljZS0+VHhQYWNrZXRBY3RpdmVRLkNvbnRhaW5lciwgcFBhY2tldCk7CiAKLQl3bWIoKTsKLQlNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5TZW5kTmljUHJvZElkeFswXS5Mb3csIElkeCk7CisJCXdtYiAoKTsKKwkJTUJfUkVHX1dSIChwRGV2aWNlLCBNYWlsYm94LlNlbmROaWNQcm9kSWR4WzBdLkxvdywgSWR4KTsKIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotCWZvcihGcmFnQ291bnQgPSAwOyA7ICkKLQl7Ci0JICAgIC8qIEluaXRpYWxpemUgdGhlIHBvaW50ZXIgdG8gdGhlIHNlbmQgYnVmZmVyIGZyYWdtZW50LiAqLwotCSAgICBNTV9NYXBUeERtYShwRGV2aWNlLCBwUGFja2V0LCAmcFNlbmRCZC0+SG9zdEFkZHIsICZMZW4sIEZyYWdDb3VudCk7CisJfSBlbHNlIHsKKwkJZm9yIChGcmFnQ291bnQgPSAwOzspIHsKKwkJCS8qIEluaXRpYWxpemUgdGhlIHBvaW50ZXIgdG8gdGhlIHNlbmQgYnVmZmVyIGZyYWdtZW50LiAqLworCQkJTU1fTWFwVHhEbWEgKHBEZXZpY2UsIHBQYWNrZXQsICZwU2VuZEJkLT5Ib3N0QWRkciwgJkxlbiwKKwkJCQkgICAgIEZyYWdDb3VudCk7CiAKLQkgICAgcFNlbmRCZC0+dTIuVmxhblRhZyA9IHBQYWNrZXQtPlZsYW5UYWc7CisJCQlwU2VuZEJkLT51Mi5WbGFuVGFnID0gcFBhY2tldC0+VmxhblRhZzsKIAotCSAgICAvKiBTZXR1cCB0aGUgY29udHJvbCBmbGFncyBhbmQgc2VuZCBidWZmZXIgc2l6ZS4gKi8KLQkgICAgVmFsdWUzMiA9IChMZW4gPDwgMTYpIHwgcFBhY2tldC0+RmxhZ3M7CisJCQkvKiBTZXR1cCB0aGUgY29udHJvbCBmbGFncyBhbmQgc2VuZCBidWZmZXIgc2l6ZS4gKi8KKwkJCVZhbHVlMzIgPSAoTGVuIDw8IDE2KSB8IHBQYWNrZXQtPkZsYWdzOwogCi0JICAgIElkeCA9IChJZHggKyAxKSAmIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UX01BU0s7CisJCQlJZHggPSAoSWR4ICsgMSkgJiBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVF9NQVNLOwogCi0JICAgIEZyYWdDb3VudCsrOwotCSAgICBpZiAoRnJhZ0NvdW50ID49IHBQYWNrZXQtPnUuVHguRnJhZ0NvdW50KQotCSAgICB7Ci0JCXBTZW5kQmQtPnUxLkxlbl9GbGFncyA9IFZhbHVlMzIgfCBTTkRfQkRfRkxBR19FTkQ7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQlwU2VuZEJkLT51MS5MZW5fRmxhZ3MgPSBWYWx1ZTMyOwotCSAgICB9Ci0JICAgIHBTZW5kQmQrKzsKLQkgICAgaWYgKElkeCA9PSAwKQotCSAgICB7Ci0JCXBTZW5kQmQgPSAmcERldmljZS0+cFNlbmRCZFZpcnRbMF07Ci0JICAgIH0KLQl9IC8qIGZvciAqLworCQkJRnJhZ0NvdW50Kys7CisJCQlpZiAoRnJhZ0NvdW50ID49IHBQYWNrZXQtPnUuVHguRnJhZ0NvdW50KSB7CisJCQkJcFNlbmRCZC0+dTEuTGVuX0ZsYWdzID0KKwkJCQkgICAgVmFsdWUzMiB8IFNORF9CRF9GTEFHX0VORDsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJcFNlbmRCZC0+dTEuTGVuX0ZsYWdzID0gVmFsdWUzMjsKKwkJCX0KKwkJCXBTZW5kQmQrKzsKKwkJCWlmIChJZHggPT0gMCkgeworCQkJCXBTZW5kQmQgPSAmcERldmljZS0+cFNlbmRCZFZpcnRbMF07CisJCQl9CisJCX0JCS8qIGZvciAqLwogCi0JLyogUHV0IHRoZSBwYWNrZXQgZGVzY3JpcHRvciBpbiB0aGUgQWN0aXZlUS4gKi8KLQlRUV9QdXNoVGFpbCgmcERldmljZS0+VHhQYWNrZXRBY3RpdmVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisJCS8qIFB1dCB0aGUgcGFja2V0IGRlc2NyaXB0b3IgaW4gdGhlIEFjdGl2ZVEuICovCisJCVFRX1B1c2hUYWlsICgmcERldmljZS0+VHhQYWNrZXRBY3RpdmVRLkNvbnRhaW5lciwgcFBhY2tldCk7CiAKLQl3bWIoKTsKLQlNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5TZW5kSG9zdFByb2RJZHhbMF0uTG93LCBJZHgpOworCQl3bWIgKCk7CisJCU1CX1JFR19XUiAocERldmljZSwgTWFpbGJveC5TZW5kSG9zdFByb2RJZHhbMF0uTG93LCBJZHgpOwogCi0gICAgfQorCX0KIAotICAgIC8qIFVwZGF0ZSB0aGUgcHJvZHVjZXIgaW5kZXguICovCi0gICAgcERldmljZS0+U2VuZFByb2RJZHggPSBJZHg7CisJLyogVXBkYXRlIHRoZSBwcm9kdWNlciBpbmRleC4gKi8KKwlwRGV2aWNlLT5TZW5kUHJvZElkeCA9IElkeDsKIAotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9CiAjZW5kaWYKIAotTE1fU1RBVFVTCi1MTV9TZW5kUGFja2V0KFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KQorTE1fU1RBVFVTIExNX1NlbmRQYWNrZXQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1BBQ0tFVCBwUGFja2V0KQogewotICAgIExNX1VJTlQzMiBGcmFnQ291bnQ7Ci0gICAgUFQzX1NORF9CRCBwU2VuZEJkLCBwVG1wU2VuZEJkLCBwU2hhZG93U2VuZEJkOwotICAgIFQzX1NORF9CRCBOaWNTZW5kQmRBcnJbTUFYX0ZSQUdNRU5UX0NPVU5UXTsKLSAgICBMTV9VSU5UMzIgU3RhcnRJZHgsIElkeDsKKwlMTV9VSU5UMzIgRnJhZ0NvdW50OworCVBUM19TTkRfQkQgcFNlbmRCZCwgcFRtcFNlbmRCZCwgcFNoYWRvd1NlbmRCZDsKKwlUM19TTkRfQkQgTmljU2VuZEJkQXJyW01BWF9GUkFHTUVOVF9DT1VOVF07CisJTE1fVUlOVDMyIFN0YXJ0SWR4LCBJZHg7CiAKLSAgICB3aGlsZSAoMSkKLSAgICB7Ci0JLyogSW5pdGFsaXplIHRoZSBzZW5kIGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KLQlTdGFydElkeCA9IElkeCA9IHBEZXZpY2UtPlNlbmRQcm9kSWR4OworCXdoaWxlICgxKSB7CisJCS8qIEluaXRhbGl6ZSB0aGUgc2VuZCBidWZmZXIgZGVzY3JpcHRvcnMuICovCisJCVN0YXJ0SWR4ID0gSWR4ID0gcERldmljZS0+U2VuZFByb2RJZHg7CiAKLQlpZiAocERldmljZS0+TmljU2VuZEJkKQotCXsKLQkgICAgcFRtcFNlbmRCZCA9IHBTZW5kQmQgPSAmTmljU2VuZEJkQXJyWzBdOwotCX0KLQllbHNlCi0JewotCSAgICBwVG1wU2VuZEJkID0gcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFtJZHhdOwotCX0KLQotCS8qIE5leHQgcHJvZHVjZXIgaW5kZXguICovCi0JZm9yKEZyYWdDb3VudCA9IDA7IDsgKQotCXsKLQkgICAgTE1fVUlOVDMyIFZhbHVlMzIsIExlbjsKLQotCSAgICAvKiBJbml0aWFsaXplIHRoZSBwb2ludGVyIHRvIHRoZSBzZW5kIGJ1ZmZlciBmcmFnbWVudC4gKi8KLQkgICAgTU1fTWFwVHhEbWEocERldmljZSwgcFBhY2tldCwgJnBTZW5kQmQtPkhvc3RBZGRyLCAmTGVuLCBGcmFnQ291bnQpOwotCi0JICAgIHBTZW5kQmQtPnUyLlZsYW5UYWcgPSBwUGFja2V0LT5WbGFuVGFnOwotCi0JICAgIC8qIFNldHVwIHRoZSBjb250cm9sIGZsYWdzIGFuZCBzZW5kIGJ1ZmZlciBzaXplLiAqLwotCSAgICBWYWx1ZTMyID0gKExlbiA8PCAxNikgfCBwUGFja2V0LT5GbGFnczsKLQotCSAgICBJZHggPSAoSWR4ICsgMSkgJiBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVF9NQVNLOwotCi0JICAgIEZyYWdDb3VudCsrOwotCSAgICBpZiAoRnJhZ0NvdW50ID49IHBQYWNrZXQtPnUuVHguRnJhZ0NvdW50KQotCSAgICB7Ci0JCXBTZW5kQmQtPnUxLkxlbl9GbGFncyA9IFZhbHVlMzIgfCBTTkRfQkRfRkxBR19FTkQ7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQlwU2VuZEJkLT51MS5MZW5fRmxhZ3MgPSBWYWx1ZTMyOwotCSAgICB9Ci0JICAgIHBTZW5kQmQrKzsKLQkgICAgaWYgKChJZHggPT0gMCkgJiYgIXBEZXZpY2UtPk5pY1NlbmRCZCkKLQkgICAgewotCQlwU2VuZEJkID0gJnBEZXZpY2UtPnBTZW5kQmRWaXJ0WzBdOwotCSAgICB9Ci0JfSAvKiBmb3IgKi8KLQlpZiAoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKQotCXsKLQkgICAgaWYgKExNX1Rlc3Q0R0JvdW5kYXJ5KHBEZXZpY2UsIHBQYWNrZXQsIHBUbXBTZW5kQmQpID09Ci0JCUxNX1NUQVRVU19TVUNDRVNTKQotCSAgICB7Ci0JCWlmIChNTV9Db2FsZXNjZVR4QnVmZmVyKHBEZXZpY2UsIHBQYWNrZXQpICE9IExNX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCSAgICBRUV9QdXNoSGVhZCgmcERldmljZS0+VHhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOwotCQkgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworCQlpZiAocERldmljZS0+TmljU2VuZEJkKSB7CisJCQlwVG1wU2VuZEJkID0gcFNlbmRCZCA9ICZOaWNTZW5kQmRBcnJbMF07CisJCX0gZWxzZSB7CisJCQlwVG1wU2VuZEJkID0gcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFtJZHhdOwogCQl9Ci0JCWNvbnRpbnVlOwotCSAgICB9CisKKwkJLyogTmV4dCBwcm9kdWNlciBpbmRleC4gKi8KKwkJZm9yIChGcmFnQ291bnQgPSAwOzspIHsKKwkJCUxNX1VJTlQzMiBWYWx1ZTMyLCBMZW47CisKKwkJCS8qIEluaXRpYWxpemUgdGhlIHBvaW50ZXIgdG8gdGhlIHNlbmQgYnVmZmVyIGZyYWdtZW50LiAqLworCQkJTU1fTWFwVHhEbWEgKHBEZXZpY2UsIHBQYWNrZXQsICZwU2VuZEJkLT5Ib3N0QWRkciwgJkxlbiwKKwkJCQkgICAgIEZyYWdDb3VudCk7CisKKwkJCXBTZW5kQmQtPnUyLlZsYW5UYWcgPSBwUGFja2V0LT5WbGFuVGFnOworCisJCQkvKiBTZXR1cCB0aGUgY29udHJvbCBmbGFncyBhbmQgc2VuZCBidWZmZXIgc2l6ZS4gKi8KKwkJCVZhbHVlMzIgPSAoTGVuIDw8IDE2KSB8IHBQYWNrZXQtPkZsYWdzOworCisJCQlJZHggPSAoSWR4ICsgMSkgJiBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVF9NQVNLOworCisJCQlGcmFnQ291bnQrKzsKKwkJCWlmIChGcmFnQ291bnQgPj0gcFBhY2tldC0+dS5UeC5GcmFnQ291bnQpIHsKKwkJCQlwU2VuZEJkLT51MS5MZW5fRmxhZ3MgPQorCQkJCSAgICBWYWx1ZTMyIHwgU05EX0JEX0ZMQUdfRU5EOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlwU2VuZEJkLT51MS5MZW5fRmxhZ3MgPSBWYWx1ZTMyOworCQkJfQorCQkJcFNlbmRCZCsrOworCQkJaWYgKChJZHggPT0gMCkgJiYgIXBEZXZpY2UtPk5pY1NlbmRCZCkgeworCQkJCXBTZW5kQmQgPSAmcERldmljZS0+cFNlbmRCZFZpcnRbMF07CisJCQl9CisJCX0JCS8qIGZvciAqLworCQlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkgeworCQkJaWYgKExNX1Rlc3Q0R0JvdW5kYXJ5IChwRGV2aWNlLCBwUGFja2V0LCBwVG1wU2VuZEJkKSA9PQorCQkJICAgIExNX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJaWYgKE1NX0NvYWxlc2NlVHhCdWZmZXIgKHBEZXZpY2UsIHBQYWNrZXQpICE9CisJCQkJICAgIExNX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJCVFRX1B1c2hIZWFkICgmcERldmljZS0+VHhQYWNrZXRGcmVlUS4KKwkJCQkJCSAgICAgQ29udGFpbmVyLCBwUGFja2V0KTsKKwkJCQkJcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlicmVhazsKIAl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIC8qIFB1dCB0aGUgcGFja2V0IGRlc2NyaXB0b3IgaW4gdGhlIEFjdGl2ZVEuICovCi0gICAgUVFfUHVzaFRhaWwoJnBEZXZpY2UtPlR4UGFja2V0QWN0aXZlUS5Db250YWluZXIsIHBQYWNrZXQpOworCS8qIFB1dCB0aGUgcGFja2V0IGRlc2NyaXB0b3IgaW4gdGhlIEFjdGl2ZVEuICovCisJUVFfUHVzaFRhaWwgKCZwRGV2aWNlLT5UeFBhY2tldEFjdGl2ZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKIAotICAgIGlmIChwRGV2aWNlLT5OaWNTZW5kQmQpCi0gICAgewotCXBTZW5kQmQgPSAmcERldmljZS0+cFNlbmRCZFZpcnRbU3RhcnRJZHhdOwotCXBTaGFkb3dTZW5kQmQgPSAmcERldmljZS0+U2hhZG93U2VuZEJkW1N0YXJ0SWR4XTsKKwlpZiAocERldmljZS0+TmljU2VuZEJkKSB7CisJCXBTZW5kQmQgPSAmcERldmljZS0+cFNlbmRCZFZpcnRbU3RhcnRJZHhdOworCQlwU2hhZG93U2VuZEJkID0gJnBEZXZpY2UtPlNoYWRvd1NlbmRCZFtTdGFydElkeF07CiAKLQl3aGlsZSAoU3RhcnRJZHggIT0gSWR4KQotCXsKLQkgICAgTE1fVUlOVDMyIFZhbHVlMzI7CisJCXdoaWxlIChTdGFydElkeCAhPSBJZHgpIHsKKwkJCUxNX1VJTlQzMiBWYWx1ZTMyOwogCi0JICAgIGlmICgoVmFsdWUzMiA9IHBUbXBTZW5kQmQtPkhvc3RBZGRyLkhpZ2gpICE9Ci0JCXBTaGFkb3dTZW5kQmQtPkhvc3RBZGRyLkhpZ2gpCi0JICAgIHsKLQkJX19yYXdfd3JpdGVsKFZhbHVlMzIsICYocFNlbmRCZC0+SG9zdEFkZHIuSGlnaCkpOwotCQlwU2hhZG93U2VuZEJkLT5Ib3N0QWRkci5IaWdoID0gVmFsdWUzMjsKLQkgICAgfQorCQkJaWYgKChWYWx1ZTMyID0gcFRtcFNlbmRCZC0+SG9zdEFkZHIuSGlnaCkgIT0KKwkJCSAgICBwU2hhZG93U2VuZEJkLT5Ib3N0QWRkci5IaWdoKSB7CisJCQkJX19yYXdfd3JpdGVsIChWYWx1ZTMyLAorCQkJCQkgICAgICAmKHBTZW5kQmQtPkhvc3RBZGRyLkhpZ2gpKTsKKwkJCQlwU2hhZG93U2VuZEJkLT5Ib3N0QWRkci5IaWdoID0gVmFsdWUzMjsKKwkJCX0KIAotCSAgICBfX3Jhd193cml0ZWwocFRtcFNlbmRCZC0+SG9zdEFkZHIuTG93LCAmKHBTZW5kQmQtPkhvc3RBZGRyLkxvdykpOworCQkJX19yYXdfd3JpdGVsIChwVG1wU2VuZEJkLT5Ib3N0QWRkci5Mb3csCisJCQkJICAgICAgJihwU2VuZEJkLT5Ib3N0QWRkci5Mb3cpKTsKIAotCSAgICBpZiAoKFZhbHVlMzIgPSBwVG1wU2VuZEJkLT51MS5MZW5fRmxhZ3MpICE9Ci0JCXBTaGFkb3dTZW5kQmQtPnUxLkxlbl9GbGFncykKLQkgICAgewotCQlfX3Jhd193cml0ZWwoVmFsdWUzMiwgJihwU2VuZEJkLT51MS5MZW5fRmxhZ3MpKTsKLQkJcFNoYWRvd1NlbmRCZC0+dTEuTGVuX0ZsYWdzID0gVmFsdWUzMjsKLQkgICAgfQorCQkJaWYgKChWYWx1ZTMyID0gcFRtcFNlbmRCZC0+dTEuTGVuX0ZsYWdzKSAhPQorCQkJICAgIHBTaGFkb3dTZW5kQmQtPnUxLkxlbl9GbGFncykgeworCQkJCV9fcmF3X3dyaXRlbCAoVmFsdWUzMiwKKwkJCQkJICAgICAgJihwU2VuZEJkLT51MS5MZW5fRmxhZ3MpKTsKKwkJCQlwU2hhZG93U2VuZEJkLT51MS5MZW5fRmxhZ3MgPSBWYWx1ZTMyOworCQkJfQogCi0JICAgIGlmIChwUGFja2V0LT5GbGFncyAmIFNORF9CRF9GTEFHX1ZMQU5fVEFHKQotCSAgICB7Ci0JCV9fcmF3X3dyaXRlbChwVG1wU2VuZEJkLT51Mi5WbGFuVGFnLCAmKHBTZW5kQmQtPnUyLlZsYW5UYWcpKTsKLQkgICAgfQorCQkJaWYgKHBQYWNrZXQtPkZsYWdzICYgU05EX0JEX0ZMQUdfVkxBTl9UQUcpIHsKKwkJCQlfX3Jhd193cml0ZWwgKHBUbXBTZW5kQmQtPnUyLlZsYW5UYWcsCisJCQkJCSAgICAgICYocFNlbmRCZC0+dTIuVmxhblRhZykpOworCQkJfQogCi0JICAgIFN0YXJ0SWR4ID0gKFN0YXJ0SWR4ICsgMSkgJiBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVF9NQVNLOwotCSAgICBpZiAoU3RhcnRJZHggPT0gMCkKLQkJcFNlbmRCZCA9ICZwRGV2aWNlLT5wU2VuZEJkVmlydFswXTsKLQkgICAgZWxzZQotCQlwU2VuZEJkKys7Ci0JICAgIHBUbXBTZW5kQmQrKzsKKwkJCVN0YXJ0SWR4ID0KKwkJCSAgICAoU3RhcnRJZHggKyAxKSAmIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UX01BU0s7CisJCQlpZiAoU3RhcnRJZHggPT0gMCkKKwkJCQlwU2VuZEJkID0gJnBEZXZpY2UtPnBTZW5kQmRWaXJ0WzBdOworCQkJZWxzZQorCQkJCXBTZW5kQmQrKzsKKwkJCXBUbXBTZW5kQmQrKzsKKwkJfQorCQl3bWIgKCk7CisJCU1CX1JFR19XUiAocERldmljZSwgTWFpbGJveC5TZW5kTmljUHJvZElkeFswXS5Mb3csIElkeCk7CisKKwkJaWYgKFQzX0NISVBfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0NISVBfUkVWXzU3MDBfQlgpIHsKKwkJCU1CX1JFR19XUiAocERldmljZSwgTWFpbGJveC5TZW5kTmljUHJvZElkeFswXS5Mb3csIElkeCk7CisJCX0KKwl9IGVsc2UgeworCQl3bWIgKCk7CisJCU1CX1JFR19XUiAocERldmljZSwgTWFpbGJveC5TZW5kSG9zdFByb2RJZHhbMF0uTG93LCBJZHgpOworCisJCWlmIChUM19DSElQX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19DSElQX1JFVl81NzAwX0JYKSB7CisJCQlNQl9SRUdfV1IgKHBEZXZpY2UsIE1haWxib3guU2VuZEhvc3RQcm9kSWR4WzBdLkxvdywKKwkJCQkgICBJZHgpOworCQl9CiAJfQotCXdtYigpOwotCU1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlNlbmROaWNQcm9kSWR4WzBdLkxvdywgSWR4KTsKIAotCWlmKFQzX0NISVBfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQ0hJUF9SRVZfNTcwMF9CWCkKLQl7Ci0JICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlNlbmROaWNQcm9kSWR4WzBdLkxvdywgSWR4KTsKLQl9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0Jd21iKCk7Ci0JTUJfUkVHX1dSKHBEZXZpY2UsIE1haWxib3guU2VuZEhvc3RQcm9kSWR4WzBdLkxvdywgSWR4KTsKKwkvKiBVcGRhdGUgdGhlIFNlbmRCZExlZnQgY291bnQuICovCisJYXRvbWljX3N1YiAocFBhY2tldC0+dS5UeC5GcmFnQ291bnQsICZwRGV2aWNlLT5TZW5kQmRMZWZ0KTsKIAotCWlmKFQzX0NISVBfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQ0hJUF9SRVZfNTcwMF9CWCkKLQl7Ci0JICAgIE1CX1JFR19XUihwRGV2aWNlLCBNYWlsYm94LlNlbmRIb3N0UHJvZElkeFswXS5Mb3csIElkeCk7Ci0JfQotICAgIH0KKwkvKiBVcGRhdGUgdGhlIHByb2R1Y2VyIGluZGV4LiAqLworCXBEZXZpY2UtPlNlbmRQcm9kSWR4ID0gSWR4OwogCi0gICAgLyogVXBkYXRlIHRoZSBTZW5kQmRMZWZ0IGNvdW50LiAqLwotICAgIGF0b21pY19zdWIocFBhY2tldC0+dS5UeC5GcmFnQ291bnQsICZwRGV2aWNlLT5TZW5kQmRMZWZ0KTsKLQotICAgIC8qIFVwZGF0ZSB0aGUgcHJvZHVjZXIgaW5kZXguICovCi0gICAgcERldmljZS0+U2VuZFByb2RJZHggPSBJZHg7Ci0KLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwogfQogCiBTVEFUSUMgTE1fU1RBVFVTCi1MTV9UZXN0NEdCb3VuZGFyeShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9QQUNLRVQgcFBhY2tldCwKLSAgICBQVDNfU05EX0JEIHBTZW5kQmQpCitMTV9UZXN0NEdCb3VuZGFyeSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fUEFDS0VUIHBQYWNrZXQsCisJCSAgIFBUM19TTkRfQkQgcFNlbmRCZCkKIHsKLSAgICBpbnQgRnJhZ0NvdW50OwotICAgIExNX1VJTlQzMiBJZHgsIEJhc2UsIExlbjsKKwlpbnQgRnJhZ0NvdW50OworCUxNX1VJTlQzMiBJZHgsIEJhc2UsIExlbjsKIAotICAgIElkeCA9IHBEZXZpY2UtPlNlbmRQcm9kSWR4OwotICAgIGZvcihGcmFnQ291bnQgPSAwOyA7ICkKLSAgICB7Ci0JTGVuID0gcFNlbmRCZC0+dTEuTGVuX0ZsYWdzID4+IDE2OwotCWlmICgoKEJhc2UgPSBwU2VuZEJkLT5Ib3N0QWRkci5Mb3cpID4gMHhmZmZmZGNjMCkgJiYKLQkgICAgKHBTZW5kQmQtPkhvc3RBZGRyLkhpZ2ggPT0gMCkgJiYKLQkgICAgKChCYXNlICsgOCArIExlbikgPCBCYXNlKSkKLQl7Ci0JICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwlJZHggPSBwRGV2aWNlLT5TZW5kUHJvZElkeDsKKwlmb3IgKEZyYWdDb3VudCA9IDA7OykgeworCQlMZW4gPSBwU2VuZEJkLT51MS5MZW5fRmxhZ3MgPj4gMTY7CisJCWlmICgoKEJhc2UgPSBwU2VuZEJkLT5Ib3N0QWRkci5Mb3cpID4gMHhmZmZmZGNjMCkgJiYKKwkJICAgIChwU2VuZEJkLT5Ib3N0QWRkci5IaWdoID09IDApICYmCisJCSAgICAoKEJhc2UgKyA4ICsgTGVuKSA8IEJhc2UpKSB7CisJCQlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwkJRnJhZ0NvdW50Kys7CisJCWlmIChGcmFnQ291bnQgPj0gcFBhY2tldC0+dS5UeC5GcmFnQ291bnQpIHsKKwkJCWJyZWFrOworCQl9CisJCXBTZW5kQmQrKzsKKwkJaWYgKCFwRGV2aWNlLT5OaWNTZW5kQmQpIHsKKwkJCUlkeCA9IChJZHggKyAxKSAmIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UX01BU0s7CisJCQlpZiAoSWR4ID09IDApIHsKKwkJCQlwU2VuZEJkID0gJnBEZXZpY2UtPnBTZW5kQmRWaXJ0WzBdOworCQkJfQorCQl9CiAJfQotCUZyYWdDb3VudCsrOwotCWlmIChGcmFnQ291bnQgPj0gcFBhY2tldC0+dS5UeC5GcmFnQ291bnQpCi0JewotCSAgICBicmVhazsKLQl9Ci0JcFNlbmRCZCsrOwotCWlmICghcERldmljZS0+TmljU2VuZEJkKQotCXsKLQkgICAgSWR4ID0gKElkeCArIDEpICYgVDNfU0VORF9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKLQkgICAgaWYgKElkeCA9PSAwKQotCSAgICB7Ci0JCXBTZW5kQmQgPSAmcERldmljZS0+cFNlbmRCZFZpcnRbMF07Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKwlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMzM1LDM1ICszMDg0LDMwIEBACiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIF9faW5saW5lIHN0YXRpYyB1bnNpZ25lZCBsb25nCi1Db21wdXRlQ3JjMzIoCi11bnNpZ25lZCBjaGFyICpwQnVmZmVyLAotdW5zaWduZWQgbG9uZyBCdWZmZXJTaXplKSB7Ci0gICAgdW5zaWduZWQgbG9uZyBSZWc7Ci0gICAgdW5zaWduZWQgbG9uZyBUbXA7Ci0gICAgdW5zaWduZWQgbG9uZyBqLCBrOworQ29tcHV0ZUNyYzMyICh1bnNpZ25lZCBjaGFyICpwQnVmZmVyLCB1bnNpZ25lZCBsb25nIEJ1ZmZlclNpemUpCit7CisJdW5zaWduZWQgbG9uZyBSZWc7CisJdW5zaWduZWQgbG9uZyBUbXA7CisJdW5zaWduZWQgbG9uZyBqLCBrOwogCi0gICAgUmVnID0gMHhmZmZmZmZmZjsKKwlSZWcgPSAweGZmZmZmZmZmOwogCi0gICAgZm9yKGogPSAwOyBqIDwgQnVmZmVyU2l6ZTsgaisrKQotICAgIHsKLQlSZWcgXj0gcEJ1ZmZlcltqXTsKKwlmb3IgKGogPSAwOyBqIDwgQnVmZmVyU2l6ZTsgaisrKSB7CisJCVJlZyBePSBwQnVmZmVyW2pdOwogCi0JZm9yKGsgPSAwOyBrIDwgODsgaysrKQotCXsKLQkgICAgVG1wID0gUmVnICYgMHgwMTsKKwkJZm9yIChrID0gMDsgayA8IDg7IGsrKykgeworCQkJVG1wID0gUmVnICYgMHgwMTsKIAotCSAgICBSZWcgPj49IDE7CisJCQlSZWcgPj49IDE7CiAKLQkgICAgaWYoVG1wKQotCSAgICB7Ci0JCVJlZyBePSAweGVkYjg4MzIwOwotCSAgICB9CisJCQlpZiAoVG1wKSB7CisJCQkJUmVnIF49IDB4ZWRiODgzMjA7CisJCQl9CisJCX0KIAl9Ci0gICAgfQogCi0gICAgcmV0dXJuIH5SZWc7Ci19IC8qIENvbXB1dGVDcmMzMiAqLwotCisJcmV0dXJuIH5SZWc7Cit9CQkJCS8qIENvbXB1dGVDcmMzMiAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTMzNzIsMTQ5ICszMTE2LDEzOSBAQAogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIExNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fU1RBVFVTCi1MTV9TZXRSZWNlaXZlTWFzaygKLVBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLUxNX1VJTlQzMiBNYXNrKSB7Ci0gICAgTE1fVUlOVDMyIFJlY2VpdmVNYXNrOwotICAgIExNX1VJTlQzMiBSeE1vZGU7Ci0gICAgTE1fVUlOVDMyIGosIGs7CitMTV9TVEFUVVMgTE1fU2V0UmVjZWl2ZU1hc2sgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE1hc2spCit7CisJTE1fVUlOVDMyIFJlY2VpdmVNYXNrOworCUxNX1VJTlQzMiBSeE1vZGU7CisJTE1fVUlOVDMyIGosIGs7CiAKLSAgICBSZWNlaXZlTWFzayA9IE1hc2s7CisJUmVjZWl2ZU1hc2sgPSBNYXNrOwogCi0gICAgUnhNb2RlID0gcERldmljZS0+UnhNb2RlOworCVJ4TW9kZSA9IHBEZXZpY2UtPlJ4TW9kZTsKIAotICAgIGlmKE1hc2sgJiBMTV9BQ0NFUFRfVU5JQ0FTVCkKLSAgICB7Ci0JTWFzayAmPSB+TE1fQUNDRVBUX1VOSUNBU1Q7Ci0gICAgfQotCi0gICAgaWYoTWFzayAmIExNX0FDQ0VQVF9NVUxUSUNBU1QpCi0gICAgewotCU1hc2sgJj0gfkxNX0FDQ0VQVF9NVUxUSUNBU1Q7Ci0gICAgfQotCi0gICAgaWYoTWFzayAmIExNX0FDQ0VQVF9BTExfTVVMVElDQVNUKQotICAgIHsKLQlNYXNrICY9IH5MTV9BQ0NFUFRfQUxMX01VTFRJQ0FTVDsKLSAgICB9Ci0KLSAgICBpZihNYXNrICYgTE1fQUNDRVBUX0JST0FEQ0FTVCkKLSAgICB7Ci0JTWFzayAmPSB+TE1fQUNDRVBUX0JST0FEQ0FTVDsKLSAgICB9Ci0KLSAgICBSeE1vZGUgJj0gflJYX01PREVfUFJPTUlTQ1VPVVNfTU9ERTsKLSAgICBpZihNYXNrICYgTE1fUFJPTUlTQ1VPVVNfTU9ERSkKLSAgICB7Ci0JUnhNb2RlIHw9IFJYX01PREVfUFJPTUlTQ1VPVVNfTU9ERTsKLQlNYXNrICY9IH5MTV9QUk9NSVNDVU9VU19NT0RFOwotICAgIH0KLQotICAgIFJ4TW9kZSAmPSB+KFJYX01PREVfQUNDRVBUX1JVTlRTIHwgUlhfTU9ERV9BQ0NFUFRfT1ZFUlNJWkVEKTsKLSAgICBpZihNYXNrICYgTE1fQUNDRVBUX0VSUk9SX1BBQ0tFVCkKLSAgICB7Ci0JUnhNb2RlIHw9IFJYX01PREVfQUNDRVBUX1JVTlRTIHwgUlhfTU9ERV9BQ0NFUFRfT1ZFUlNJWkVEOwotCU1hc2sgJj0gfkxNX0FDQ0VQVF9FUlJPUl9QQUNLRVQ7Ci0gICAgfQotCi0gICAgLyogTWFrZSBzdXJlIGFsbCB0aGUgYml0cyBhcmUgdmFsaWQgYmVmb3JlIGNvbW1pdHRpbmcgY2hhbmdlcy4gKi8KLSAgICBpZihNYXNrKQotICAgIHsKLQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7Ci0gICAgfQotCi0gICAgLyogQ29tbWl0IHRoZSBuZXcgZmlsdGVyLiAqLwotICAgIHBEZXZpY2UtPlJ4TW9kZSA9IFJ4TW9kZTsKLSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5SeE1vZGUsIFJ4TW9kZSk7Ci0KLSAgICBwRGV2aWNlLT5SZWNlaXZlTWFzayA9IFJlY2VpdmVNYXNrOwotCi0gICAgLyogU2V0IHVwIHRoZSBNQyBoYXNoIHRhYmxlLiAqLwotICAgIGlmKFJlY2VpdmVNYXNrICYgTE1fQUNDRVBUX0FMTF9NVUxUSUNBU1QpCi0gICAgewotCWZvcihrID0gMDsgayA8IDQ7IGsrKykKLQl7Ci0JICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLkhhc2hSZWdba10sIDB4ZmZmZmZmZmYpOwotCX0KLSAgICB9Ci0gICAgZWxzZSBpZihSZWNlaXZlTWFzayAmIExNX0FDQ0VQVF9NVUxUSUNBU1QpCi0gICAgewotCUxNX1VJTlQzMiBIYXNoUmVnWzRdOwotCi0JSGFzaFJlZ1swXSA9IDA7IEhhc2hSZWdbMV0gPSAwOyBIYXNoUmVnWzJdID0gMDsgSGFzaFJlZ1szXSA9IDA7Ci0JZm9yKGogPSAwOyBqIDwgcERldmljZS0+TWNFbnRyeUNvdW50OyBqKyspCi0JewotCSAgICBMTV9VSU5UMzIgUmVnSW5kZXg7Ci0JICAgIExNX1VJTlQzMiBCaXRwb3M7Ci0JICAgIExNX1VJTlQzMiBDcmMzMjsKLQotCSAgICBDcmMzMiA9IENvbXB1dGVDcmMzMihwRGV2aWNlLT5NY1RhYmxlW2pdLCBFVEhFUk5FVF9BRERSRVNTX1NJWkUpOwotCi0JICAgIC8qIFRoZSBtb3N0IHNpZ25pZmljYW50IDcgYml0cyBvZiB0aGUgQ1JDMzIgKG5vIGludmVyc2lvbiksICovCi0JICAgIC8qIGFyZSB1c2VkIHRvIGluZGV4IGludG8gb25lIG9mIHRoZSBwb3NzaWJsZSAxMjggYml0IHBvc2l0aW9ucy4gKi8KLQkgICAgQml0cG9zID0gfkNyYzMyICYgMHg3ZjsKLQotCSAgICAvKiBIYXNoIHJlZ2lzdGVyIGluZGV4LiAqLwotCSAgICBSZWdJbmRleCA9IChCaXRwb3MgJiAweDYwKSA+PiA1OwotCi0JICAgIC8qIEJpdCB0byB0dXJuIG9uIHdpdGhpbiBhIGhhc2ggcmVnaXN0ZXIuICovCi0JICAgIEJpdHBvcyAmPSAweDFmOwotCi0JICAgIC8qIEVuYWJsZSB0aGUgbXVsdGljYXN0IGJpdC4gKi8KLQkgICAgSGFzaFJlZ1tSZWdJbmRleF0gfD0gKDEgPDwgQml0cG9zKTsKKwlpZiAoTWFzayAmIExNX0FDQ0VQVF9VTklDQVNUKSB7CisJCU1hc2sgJj0gfkxNX0FDQ0VQVF9VTklDQVNUOwogCX0KIAotCS8qIFJFVl9BWCBoYXMgcHJvYmxlbSB3aXRoIG11bHRpY2FzdCBmaWx0ZXJpbmcgd2hlcmUgaXQgdXNlcyBib3RoICovCi0JLyogREEgYW5kIFNBIHRvIHBlcmZvcm0gaGFzaGluZy4gKi8KLQlmb3IoayA9IDA7IGsgPCA0OyBrKyspCi0JewotCSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5IYXNoUmVnW2tdLCBIYXNoUmVnW2tdKTsKKwlpZiAoTWFzayAmIExNX0FDQ0VQVF9NVUxUSUNBU1QpIHsKKwkJTWFzayAmPSB+TE1fQUNDRVBUX01VTFRJQ0FTVDsKIAl9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JLyogUmVqZWN0IGFsbCBtdWx0aWNhc3QgZnJhbWVzLiAqLwotCWZvcihqID0gMDsgaiA8IDQ7IGorKykKLQl7Ci0JICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLkhhc2hSZWdbal0sIDApOworCisJaWYgKE1hc2sgJiBMTV9BQ0NFUFRfQUxMX01VTFRJQ0FTVCkgeworCQlNYXNrICY9IH5MTV9BQ0NFUFRfQUxMX01VTFRJQ0FTVDsKIAl9Ci0gICAgfQogCi0gICAgLyogQnkgZGVmYXVsdCwgVGlnb24zIHdpbGwgYWNjZXB0IGJyb2FkY2FzdCBmcmFtZXMuICBXZSBuZWVkIHRvIHNldHVwICovCi0gICAgaWYoUmVjZWl2ZU1hc2sgJiBMTV9BQ0NFUFRfQlJPQURDQVNUKQotICAgIHsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5SY3ZSdWxlc1tSQ1ZfUlVMRTFfUkVKRUNUX0JST0FEQ0FTVF9JRFhdLlJ1bGUsCi0JICAgIFJFSkVDVF9CUk9BRENBU1RfUlVMRTFfUlVMRSAmIFJDVl9ESVNBQkxFX1JVTEVfTUFTSyk7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUmN2UnVsZXNbUkNWX1JVTEUxX1JFSkVDVF9CUk9BRENBU1RfSURYXS5WYWx1ZSwKLQkgICAgUkVKRUNUX0JST0FEQ0FTVF9SVUxFMV9WQUxVRSAmIFJDVl9ESVNBQkxFX1JVTEVfTUFTSyk7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUmN2UnVsZXNbUkNWX1JVTEUyX1JFSkVDVF9CUk9BRENBU1RfSURYXS5SdWxlLAotCSAgICBSRUpFQ1RfQlJPQURDQVNUX1JVTEUxX1JVTEUgJiBSQ1ZfRElTQUJMRV9SVUxFX01BU0spOwotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJjdlJ1bGVzW1JDVl9SVUxFMl9SRUpFQ1RfQlJPQURDQVNUX0lEWF0uVmFsdWUsCi0JICAgIFJFSkVDVF9CUk9BRENBU1RfUlVMRTFfVkFMVUUgJiBSQ1ZfRElTQUJMRV9SVUxFX01BU0spOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJjdlJ1bGVzW1JDVl9SVUxFMV9SRUpFQ1RfQlJPQURDQVNUX0lEWF0uUnVsZSwKLQkgICAgUkVKRUNUX0JST0FEQ0FTVF9SVUxFMV9SVUxFKTsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5SY3ZSdWxlc1tSQ1ZfUlVMRTFfUkVKRUNUX0JST0FEQ0FTVF9JRFhdLlZhbHVlLAotCSAgICBSRUpFQ1RfQlJPQURDQVNUX1JVTEUxX1ZBTFVFKTsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5SY3ZSdWxlc1tSQ1ZfUlVMRTJfUkVKRUNUX0JST0FEQ0FTVF9JRFhdLlJ1bGUsCi0JICAgIFJFSkVDVF9CUk9BRENBU1RfUlVMRTJfUlVMRSk7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUmN2UnVsZXNbUkNWX1JVTEUyX1JFSkVDVF9CUk9BRENBU1RfSURYXS5WYWx1ZSwKLQkgICAgUkVKRUNUX0JST0FEQ0FTVF9SVUxFMl9WQUxVRSk7Ci0gICAgfQorCWlmIChNYXNrICYgTE1fQUNDRVBUX0JST0FEQ0FTVCkgeworCQlNYXNrICY9IH5MTV9BQ0NFUFRfQlJPQURDQVNUOworCX0KIAotICAgIC8qIGRpc2FibGUgdGhlIHJlc3Qgb2YgdGhlIHJ1bGVzLiAqLwotICAgIGZvcihqID0gUkNWX0xBU1RfUlVMRV9JRFg7IGogPCAxNjsgaisrKQotICAgIHsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5SY3ZSdWxlc1tqXS5SdWxlLCAwKTsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5SY3ZSdWxlc1tqXS5WYWx1ZSwgMCk7Ci0gICAgfQorCVJ4TW9kZSAmPSB+UlhfTU9ERV9QUk9NSVNDVU9VU19NT0RFOworCWlmIChNYXNrICYgTE1fUFJPTUlTQ1VPVVNfTU9ERSkgeworCQlSeE1vZGUgfD0gUlhfTU9ERV9QUk9NSVNDVU9VU19NT0RFOworCQlNYXNrICY9IH5MTV9QUk9NSVNDVU9VU19NT0RFOworCX0KIAotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLX0gLyogTE1fU2V0UmVjZWl2ZU1hc2sgKi8KKwlSeE1vZGUgJj0gfihSWF9NT0RFX0FDQ0VQVF9SVU5UUyB8IFJYX01PREVfQUNDRVBUX09WRVJTSVpFRCk7CisJaWYgKE1hc2sgJiBMTV9BQ0NFUFRfRVJST1JfUEFDS0VUKSB7CisJCVJ4TW9kZSB8PSBSWF9NT0RFX0FDQ0VQVF9SVU5UUyB8IFJYX01PREVfQUNDRVBUX09WRVJTSVpFRDsKKwkJTWFzayAmPSB+TE1fQUNDRVBUX0VSUk9SX1BBQ0tFVDsKKwl9CiAKKwkvKiBNYWtlIHN1cmUgYWxsIHRoZSBiaXRzIGFyZSB2YWxpZCBiZWZvcmUgY29tbWl0dGluZyBjaGFuZ2VzLiAqLworCWlmIChNYXNrKSB7CisJCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwkvKiBDb21taXQgdGhlIG5ldyBmaWx0ZXIuICovCisJcERldmljZS0+UnhNb2RlID0gUnhNb2RlOworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5SeE1vZGUsIFJ4TW9kZSk7CisKKwlwRGV2aWNlLT5SZWNlaXZlTWFzayA9IFJlY2VpdmVNYXNrOworCisJLyogU2V0IHVwIHRoZSBNQyBoYXNoIHRhYmxlLiAqLworCWlmIChSZWNlaXZlTWFzayAmIExNX0FDQ0VQVF9BTExfTVVMVElDQVNUKSB7CisJCWZvciAoayA9IDA7IGsgPCA0OyBrKyspIHsKKwkJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5IYXNoUmVnW2tdLCAweGZmZmZmZmZmKTsKKwkJfQorCX0gZWxzZSBpZiAoUmVjZWl2ZU1hc2sgJiBMTV9BQ0NFUFRfTVVMVElDQVNUKSB7CisJCUxNX1VJTlQzMiBIYXNoUmVnWzRdOworCisJCUhhc2hSZWdbMF0gPSAwOworCQlIYXNoUmVnWzFdID0gMDsKKwkJSGFzaFJlZ1syXSA9IDA7CisJCUhhc2hSZWdbM10gPSAwOworCQlmb3IgKGogPSAwOyBqIDwgcERldmljZS0+TWNFbnRyeUNvdW50OyBqKyspIHsKKwkJCUxNX1VJTlQzMiBSZWdJbmRleDsKKwkJCUxNX1VJTlQzMiBCaXRwb3M7CisJCQlMTV9VSU5UMzIgQ3JjMzI7CisKKwkJCUNyYzMyID0KKwkJCSAgICBDb21wdXRlQ3JjMzIgKHBEZXZpY2UtPk1jVGFibGVbal0sCisJCQkJCSAgRVRIRVJORVRfQUREUkVTU19TSVpFKTsKKworCQkJLyogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgNyBiaXRzIG9mIHRoZSBDUkMzMiAobm8gaW52ZXJzaW9uKSwgKi8KKwkJCS8qIGFyZSB1c2VkIHRvIGluZGV4IGludG8gb25lIG9mIHRoZSBwb3NzaWJsZSAxMjggYml0IHBvc2l0aW9ucy4gKi8KKwkJCUJpdHBvcyA9IH5DcmMzMiAmIDB4N2Y7CisKKwkJCS8qIEhhc2ggcmVnaXN0ZXIgaW5kZXguICovCisJCQlSZWdJbmRleCA9IChCaXRwb3MgJiAweDYwKSA+PiA1OworCisJCQkvKiBCaXQgdG8gdHVybiBvbiB3aXRoaW4gYSBoYXNoIHJlZ2lzdGVyLiAqLworCQkJQml0cG9zICY9IDB4MWY7CisKKwkJCS8qIEVuYWJsZSB0aGUgbXVsdGljYXN0IGJpdC4gKi8KKwkJCUhhc2hSZWdbUmVnSW5kZXhdIHw9ICgxIDw8IEJpdHBvcyk7CisJCX0KKworCQkvKiBSRVZfQVggaGFzIHByb2JsZW0gd2l0aCBtdWx0aWNhc3QgZmlsdGVyaW5nIHdoZXJlIGl0IHVzZXMgYm90aCAqLworCQkvKiBEQSBhbmQgU0EgdG8gcGVyZm9ybSBoYXNoaW5nLiAqLworCQlmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisJCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuSGFzaFJlZ1trXSwgSGFzaFJlZ1trXSk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBSZWplY3QgYWxsIG11bHRpY2FzdCBmcmFtZXMuICovCisJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKwkJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5IYXNoUmVnW2pdLCAwKTsKKwkJfQorCX0KKworCS8qIEJ5IGRlZmF1bHQsIFRpZ29uMyB3aWxsIGFjY2VwdCBicm9hZGNhc3QgZnJhbWVzLiAgV2UgbmVlZCB0byBzZXR1cCAqLworCWlmIChSZWNlaXZlTWFzayAmIExNX0FDQ0VQVF9CUk9BRENBU1QpIHsKKwkJUkVHX1dSIChwRGV2aWNlLAorCQkJTWFjQ3RybC5SY3ZSdWxlc1tSQ1ZfUlVMRTFfUkVKRUNUX0JST0FEQ0FTVF9JRFhdLlJ1bGUsCisJCQlSRUpFQ1RfQlJPQURDQVNUX1JVTEUxX1JVTEUgJiBSQ1ZfRElTQUJMRV9SVUxFX01BU0spOworCQlSRUdfV1IgKHBEZXZpY2UsCisJCQlNYWNDdHJsLlJjdlJ1bGVzW1JDVl9SVUxFMV9SRUpFQ1RfQlJPQURDQVNUX0lEWF0uVmFsdWUsCisJCQlSRUpFQ1RfQlJPQURDQVNUX1JVTEUxX1ZBTFVFICYgUkNWX0RJU0FCTEVfUlVMRV9NQVNLKTsKKwkJUkVHX1dSIChwRGV2aWNlLAorCQkJTWFjQ3RybC5SY3ZSdWxlc1tSQ1ZfUlVMRTJfUkVKRUNUX0JST0FEQ0FTVF9JRFhdLlJ1bGUsCisJCQlSRUpFQ1RfQlJPQURDQVNUX1JVTEUxX1JVTEUgJiBSQ1ZfRElTQUJMRV9SVUxFX01BU0spOworCQlSRUdfV1IgKHBEZXZpY2UsCisJCQlNYWNDdHJsLlJjdlJ1bGVzW1JDVl9SVUxFMl9SRUpFQ1RfQlJPQURDQVNUX0lEWF0uVmFsdWUsCisJCQlSRUpFQ1RfQlJPQURDQVNUX1JVTEUxX1ZBTFVFICYgUkNWX0RJU0FCTEVfUlVMRV9NQVNLKTsKKwl9IGVsc2UgeworCQlSRUdfV1IgKHBEZXZpY2UsCisJCQlNYWNDdHJsLlJjdlJ1bGVzW1JDVl9SVUxFMV9SRUpFQ1RfQlJPQURDQVNUX0lEWF0uUnVsZSwKKwkJCVJFSkVDVF9CUk9BRENBU1RfUlVMRTFfUlVMRSk7CisJCVJFR19XUiAocERldmljZSwKKwkJCU1hY0N0cmwuUmN2UnVsZXNbUkNWX1JVTEUxX1JFSkVDVF9CUk9BRENBU1RfSURYXS5WYWx1ZSwKKwkJCVJFSkVDVF9CUk9BRENBU1RfUlVMRTFfVkFMVUUpOworCQlSRUdfV1IgKHBEZXZpY2UsCisJCQlNYWNDdHJsLlJjdlJ1bGVzW1JDVl9SVUxFMl9SRUpFQ1RfQlJPQURDQVNUX0lEWF0uUnVsZSwKKwkJCVJFSkVDVF9CUk9BRENBU1RfUlVMRTJfUlVMRSk7CisJCVJFR19XUiAocERldmljZSwKKwkJCU1hY0N0cmwuUmN2UnVsZXNbUkNWX1JVTEUyX1JFSkVDVF9CUk9BRENBU1RfSURYXS5WYWx1ZSwKKwkJCVJFSkVDVF9CUk9BRENBU1RfUlVMRTJfVkFMVUUpOworCX0KKworCS8qIGRpc2FibGUgdGhlIHJlc3Qgb2YgdGhlIHJ1bGVzLiAqLworCWZvciAoaiA9IFJDVl9MQVNUX1JVTEVfSURYOyBqIDwgMTY7IGorKykgeworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuUmN2UnVsZXNbal0uUnVsZSwgMCk7CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5SY3ZSdWxlc1tqXS5WYWx1ZSwgMCk7CisJfQorCisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQkJCQkvKiBMTV9TZXRSZWNlaXZlTWFzayAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM1MjUsMTM4ICszMjU5LDEzNSBAQAogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIExNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fU1RBVFVTCi1MTV9BYm9ydCgKLVBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK0xNX1NUQVRVUyBMTV9BYm9ydCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQogewotICAgIFBMTV9QQUNLRVQgcFBhY2tldDsKLSAgICBMTV9VSU5UIElkeDsKKwlQTE1fUEFDS0VUIHBQYWNrZXQ7CisJTE1fVUlOVCBJZHg7CiAKLSAgICBMTV9EaXNhYmxlSW50ZXJydXB0KHBEZXZpY2UpOworCUxNX0Rpc2FibGVJbnRlcnJ1cHQgKHBEZXZpY2UpOwogCi0gICAgLyogRGlzYWJsZSBhbGwgdGhlIHN0YXRlIG1hY2hpbmVzLiAqLwotICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19NQUNfUlhfRU5HSU5FLExNX0RJU0FCTEUpOwotICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19SWF9CRF9JTklUSUFUT1IsTE1fRElTQUJMRSk7Ci0gICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX1JYX0xJU1RfUExNVCxMTV9ESVNBQkxFKTsKLSAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfUlhfTElTVF9TRUxFQ1RPUixMTV9ESVNBQkxFKTsKLSAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfUlhfREFUQV9JTklUSUFUT1IsTE1fRElTQUJMRSk7Ci0gICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX1JYX0RBVEFfQ09NUCxMTV9ESVNBQkxFKTsKLSAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfUlhfQkRfQ09NUCxMTV9ESVNBQkxFKTsKKwkvKiBEaXNhYmxlIGFsbCB0aGUgc3RhdGUgbWFjaGluZXMuICovCisJTE1fQ250cmxCbG9jayAocERldmljZSwgVDNfQkxPQ0tfTUFDX1JYX0VOR0lORSwgTE1fRElTQUJMRSk7CisJTE1fQ250cmxCbG9jayAocERldmljZSwgVDNfQkxPQ0tfUlhfQkRfSU5JVElBVE9SLCBMTV9ESVNBQkxFKTsKKwlMTV9DbnRybEJsb2NrIChwRGV2aWNlLCBUM19CTE9DS19SWF9MSVNUX1BMTVQsIExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX1JYX0xJU1RfU0VMRUNUT1IsIExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX1JYX0RBVEFfSU5JVElBVE9SLCBMTV9ESVNBQkxFKTsKKwlMTV9DbnRybEJsb2NrIChwRGV2aWNlLCBUM19CTE9DS19SWF9EQVRBX0NPTVAsIExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX1JYX0JEX0NPTVAsIExNX0RJU0FCTEUpOwogCi0gICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX1NFTkRfQkRfU0VMRUNUT1IsTE1fRElTQUJMRSk7Ci0gICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX1NFTkRfQkRfSU5JVElBVE9SLExNX0RJU0FCTEUpOwotICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19TRU5EX0RBVEFfSU5JVElBVE9SLExNX0RJU0FCTEUpOwotICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19ETUFfUkQsTE1fRElTQUJMRSk7Ci0gICAgTE1fQ250cmxCbG9jayhwRGV2aWNlLFQzX0JMT0NLX1NFTkRfREFUQV9DT01QLExNX0RJU0FCTEUpOwotICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19ETUFfQ09NUCxMTV9ESVNBQkxFKTsKLSAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfU0VORF9CRF9DT01QLExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX1NFTkRfQkRfU0VMRUNUT1IsIExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX1NFTkRfQkRfSU5JVElBVE9SLCBMTV9ESVNBQkxFKTsKKwlMTV9DbnRybEJsb2NrIChwRGV2aWNlLCBUM19CTE9DS19TRU5EX0RBVEFfSU5JVElBVE9SLCBMTV9ESVNBQkxFKTsKKwlMTV9DbnRybEJsb2NrIChwRGV2aWNlLCBUM19CTE9DS19ETUFfUkQsIExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX1NFTkRfREFUQV9DT01QLCBMTV9ESVNBQkxFKTsKKwlMTV9DbnRybEJsb2NrIChwRGV2aWNlLCBUM19CTE9DS19ETUFfQ09NUCwgTE1fRElTQUJMRSk7CisJTE1fQ250cmxCbG9jayAocERldmljZSwgVDNfQkxPQ0tfU0VORF9CRF9DT01QLCBMTV9ESVNBQkxFKTsKIAotICAgIC8qIENsZWFyIFRERSBiaXQgKi8KLSAgICBwRGV2aWNlLT5NYWNNb2RlICY9IH5NQUNfTU9ERV9FTkFCTEVfVERFOwotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUpOworCS8qIENsZWFyIFRERSBiaXQgKi8KKwlwRGV2aWNlLT5NYWNNb2RlICY9IH5NQUNfTU9ERV9FTkFCTEVfVERFOworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5Nb2RlLCBwRGV2aWNlLT5NYWNNb2RlKTsKIAotICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19NQUNfVFhfRU5HSU5FLExNX0RJU0FCTEUpOwotICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19IT1NUX0NPQUxFU0lORyxMTV9ESVNBQkxFKTsKLSAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfRE1BX1dSLExNX0RJU0FCTEUpOwotICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19NQlVGX0NMVVNURVJfRlJFRSxMTV9ESVNBQkxFKTsKKwlMTV9DbnRybEJsb2NrIChwRGV2aWNlLCBUM19CTE9DS19NQUNfVFhfRU5HSU5FLCBMTV9ESVNBQkxFKTsKKwlMTV9DbnRybEJsb2NrIChwRGV2aWNlLCBUM19CTE9DS19IT1NUX0NPQUxFU0lORywgTE1fRElTQUJMRSk7CisJTE1fQ250cmxCbG9jayAocERldmljZSwgVDNfQkxPQ0tfRE1BX1dSLCBMTV9ESVNBQkxFKTsKKwlMTV9DbnRybEJsb2NrIChwRGV2aWNlLCBUM19CTE9DS19NQlVGX0NMVVNURVJfRlJFRSwgTE1fRElTQUJMRSk7CiAKLSAgICAvKiBSZXNldCBhbGwgRlRRcyAqLwotICAgIFJFR19XUihwRGV2aWNlLCBGdHEuUmVzZXQsIDB4ZmZmZmZmZmYpOwotICAgIFJFR19XUihwRGV2aWNlLCBGdHEuUmVzZXQsIDB4MCk7CisJLyogUmVzZXQgYWxsIEZUUXMgKi8KKwlSRUdfV1IgKHBEZXZpY2UsIEZ0cS5SZXNldCwgMHhmZmZmZmZmZik7CisJUkVHX1dSIChwRGV2aWNlLCBGdHEuUmVzZXQsIDB4MCk7CiAKLSAgICBMTV9DbnRybEJsb2NrKHBEZXZpY2UsVDNfQkxPQ0tfTUJVRl9NQU5BR0VSLExNX0RJU0FCTEUpOwotICAgIExNX0NudHJsQmxvY2socERldmljZSxUM19CTE9DS19NRU1fQVJCSVRPUixMTV9ESVNBQkxFKTsKKwlMTV9DbnRybEJsb2NrIChwRGV2aWNlLCBUM19CTE9DS19NQlVGX01BTkFHRVIsIExNX0RJU0FCTEUpOworCUxNX0NudHJsQmxvY2sgKHBEZXZpY2UsIFQzX0JMT0NLX01FTV9BUkJJVE9SLCBMTV9ESVNBQkxFKTsKIAotICAgIE1NX0FDUVVJUkVfSU5UX0xPQ0socERldmljZSk7CisJTU1fQUNRVUlSRV9JTlRfTE9DSyAocERldmljZSk7CiAKLSAgICAvKiBBYm9ydCBwYWNrZXRzIHRoYXQgaGF2ZSBhbHJlYWR5IHF1ZXVlZCB0byBnbyBvdXQuICovCi0gICAgcFBhY2tldCA9IChQTE1fUEFDS0VUKSBRUV9Qb3BIZWFkKCZwRGV2aWNlLT5UeFBhY2tldEFjdGl2ZVEuQ29udGFpbmVyKTsKLSAgICB3aGlsZShwUGFja2V0KQotICAgIHsKKwkvKiBBYm9ydCBwYWNrZXRzIHRoYXQgaGF2ZSBhbHJlYWR5IHF1ZXVlZCB0byBnbyBvdXQuICovCisJcFBhY2tldCA9IChQTE1fUEFDS0VUKSBRUV9Qb3BIZWFkICgmcERldmljZS0+VHhQYWNrZXRBY3RpdmVRLkNvbnRhaW5lcik7CisJd2hpbGUgKHBQYWNrZXQpIHsKIAotCXBQYWNrZXQtPlBhY2tldFN0YXR1cyA9IExNX1NUQVRVU19UUkFOU01JVF9BQk9SVEVEOwotCXBEZXZpY2UtPlR4Q291bnRlcnMuVHhQYWNrZXRBYm9ydGVkQ250Kys7CisJCXBQYWNrZXQtPlBhY2tldFN0YXR1cyA9IExNX1NUQVRVU19UUkFOU01JVF9BQk9SVEVEOworCQlwRGV2aWNlLT5UeENvdW50ZXJzLlR4UGFja2V0QWJvcnRlZENudCsrOwogCi0JYXRvbWljX2FkZChwUGFja2V0LT51LlR4LkZyYWdDb3VudCwgJnBEZXZpY2UtPlNlbmRCZExlZnQpOworCQlhdG9taWNfYWRkIChwUGFja2V0LT51LlR4LkZyYWdDb3VudCwgJnBEZXZpY2UtPlNlbmRCZExlZnQpOwogCi0JUVFfUHVzaFRhaWwoJnBEZXZpY2UtPlR4UGFja2V0WG1pdHRlZFEuQ29udGFpbmVyLCBwUGFja2V0KTsKKwkJUVFfUHVzaFRhaWwgKCZwRGV2aWNlLT5UeFBhY2tldFhtaXR0ZWRRLkNvbnRhaW5lciwgcFBhY2tldCk7CiAKLQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpCi0JICAgIFFRX1BvcEhlYWQoJnBEZXZpY2UtPlR4UGFja2V0QWN0aXZlUS5Db250YWluZXIpOwotICAgIH0KLQotICAgIC8qIENsZWFudXAgdGhlIHJlY2VpdmUgcmV0dXJuIHJpbmdzLiAqLwotICAgIExNX1NlcnZpY2VSeEludGVycnVwdChwRGV2aWNlKTsKLQotICAgIC8qIERvbid0IHdhbnQgdG8gaW5kaWNhdGUgcnggcGFja2V0cyBpbiBOZGlzIG1pbmlwb3J0IHNodXRkb3duIGNvbnRleHQuICovCi0gICAgLyogRG9pbmcgc28gbWF5IGNhdXNlIHN5c3RlbSBjcmFzaC4gKi8KLSAgICBpZighcERldmljZS0+U2h1dHRpbmdEb3duKQotICAgIHsKLQkvKiBJbmRpY2F0ZSBwYWNrZXRzIHRvIHRoZSBwcm90b2NvbC4gKi8KLQlNTV9JbmRpY2F0ZVR4UGFja2V0cyhwRGV2aWNlKTsKLQotCS8qIEluZGljYXRlIHJlY2VpdmVkIHBhY2tldHMgdG8gdGhlIHByb3RvY29scy4gKi8KLQlNTV9JbmRpY2F0ZVJ4UGFja2V0cyhwRGV2aWNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkvKiBNb3ZlIHRoZSByZWNlaXZlIHBhY2tldCBkZXNjcmlwdG9ycyBpbiB0aGUgUmVjZWl2ZWRRIHRvIHRoZSAqLwotCS8qIGZyZWUgcXVldWUuICovCi0JZm9yKDsgOykKLQl7Ci0JICAgIHBQYWNrZXQgPSAoUExNX1BBQ0tFVCkgUVFfUG9wSGVhZCgKLQkJJnBEZXZpY2UtPlJ4UGFja2V0UmVjZWl2ZWRRLkNvbnRhaW5lcik7Ci0JICAgIGlmKHBQYWNrZXQgPT0gTlVMTCkKLQkgICAgewotCQlicmVhazsKLQkgICAgfQotCSAgICBRUV9QdXNoVGFpbCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpCisJCSAgICBRUV9Qb3BIZWFkICgmcERldmljZS0+VHhQYWNrZXRBY3RpdmVRLkNvbnRhaW5lcik7CiAJfQotICAgIH0KIAotICAgIC8qIENsZWFuIHVwIHRoZSBTdGQgUmVjZWl2ZSBQcm9kdWNlciByaW5nLiAqLwotICAgIElkeCA9IHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5SY3ZTdGRDb25JZHg7CisJLyogQ2xlYW51cCB0aGUgcmVjZWl2ZSByZXR1cm4gcmluZ3MuICovCisJTE1fU2VydmljZVJ4SW50ZXJydXB0IChwRGV2aWNlKTsKIAotICAgIHdoaWxlKElkeCAhPSBwRGV2aWNlLT5SeFN0ZFByb2RJZHgpIHsKLQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpIChNTV9VSU5UX1BUUihwRGV2aWNlLT5wUGFja2V0RGVzY0Jhc2UpICsKLQkgICAgTU1fVUlOVF9QVFIocERldmljZS0+cFJ4U3RkQmRWaXJ0W0lkeF0uT3BhcXVlKSk7CisJLyogRG9uJ3Qgd2FudCB0byBpbmRpY2F0ZSByeCBwYWNrZXRzIGluIE5kaXMgbWluaXBvcnQgc2h1dGRvd24gY29udGV4dC4gKi8KKwkvKiBEb2luZyBzbyBtYXkgY2F1c2Ugc3lzdGVtIGNyYXNoLiAqLworCWlmICghcERldmljZS0+U2h1dHRpbmdEb3duKSB7CisJCS8qIEluZGljYXRlIHBhY2tldHMgdG8gdGhlIHByb3RvY29sLiAqLworCQlNTV9JbmRpY2F0ZVR4UGFja2V0cyAocERldmljZSk7CiAKLQlRUV9QdXNoVGFpbCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCQkvKiBJbmRpY2F0ZSByZWNlaXZlZCBwYWNrZXRzIHRvIHRoZSBwcm90b2NvbHMuICovCisJCU1NX0luZGljYXRlUnhQYWNrZXRzIChwRGV2aWNlKTsKKwl9IGVsc2UgeworCQkvKiBNb3ZlIHRoZSByZWNlaXZlIHBhY2tldCBkZXNjcmlwdG9ycyBpbiB0aGUgUmVjZWl2ZWRRIHRvIHRoZSAqLworCQkvKiBmcmVlIHF1ZXVlLiAqLworCQlmb3IgKDs7KSB7CisJCQlwUGFja2V0ID0KKwkJCSAgICAoUExNX1BBQ0tFVCkgUVFfUG9wSGVhZCAoJnBEZXZpY2UtPgorCQkJCQkJICAgICBSeFBhY2tldFJlY2VpdmVkUS4KKwkJCQkJCSAgICAgQ29udGFpbmVyKTsKKwkJCWlmIChwUGFja2V0ID09IE5VTEwpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCVFRX1B1c2hUYWlsICgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsCisJCQkJICAgICBwUGFja2V0KTsKKwkJfQorCX0KIAotCUlkeCA9IChJZHggKyAxKSAmIFQzX1NURF9SQ1ZfUkNCX0VOVFJZX0NPVU5UX01BU0s7Ci0gICAgfSAvKiB3aGlsZSAqLworCS8qIENsZWFuIHVwIHRoZSBTdGQgUmVjZWl2ZSBQcm9kdWNlciByaW5nLiAqLworCUlkeCA9IHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5SY3ZTdGRDb25JZHg7CiAKLSAgICAvKiBSZWluaXRpYWxpemUgb3VyIGNvcHkgb2YgdGhlIGluZGljZXMuICovCi0gICAgcERldmljZS0+UnhTdGRQcm9kSWR4ID0gMDsKKwl3aGlsZSAoSWR4ICE9IHBEZXZpY2UtPlJ4U3RkUHJvZElkeCkgeworCQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpIChNTV9VSU5UX1BUUiAocERldmljZS0+cFBhY2tldERlc2NCYXNlKSArCisJCQkJCU1NX1VJTlRfUFRSIChwRGV2aWNlLT5wUnhTdGRCZFZpcnRbSWR4XS4KKwkJCQkJCSAgICAgT3BhcXVlKSk7CisKKwkJUVFfUHVzaFRhaWwgKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lciwgcFBhY2tldCk7CisKKwkJSWR4ID0gKElkeCArIDEpICYgVDNfU1REX1JDVl9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKKwl9CQkJLyogd2hpbGUgKi8KKworCS8qIFJlaW5pdGlhbGl6ZSBvdXIgY29weSBvZiB0aGUgaW5kaWNlcy4gKi8KKwlwRGV2aWNlLT5SeFN0ZFByb2RJZHggPSAwOwogCiAjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAotICAgIC8qIENsZWFuIHVwIHRoZSBKdW1ibyBSZWNlaXZlIFByb2R1Y2VyIHJpbmcuICovCi0gICAgSWR4ID0gcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdkp1bWJvQ29uSWR4OworCS8qIENsZWFuIHVwIHRoZSBKdW1ibyBSZWNlaXZlIFByb2R1Y2VyIHJpbmcuICovCisJSWR4ID0gcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdkp1bWJvQ29uSWR4OwogCi0gICAgd2hpbGUoSWR4ICE9IHBEZXZpY2UtPlJ4SnVtYm9Qcm9kSWR4KSB7Ci0JcFBhY2tldCA9IChQTE1fUEFDS0VUKSAoTU1fVUlOVF9QVFIocERldmljZS0+cFBhY2tldERlc2NCYXNlKSArCi0JICAgIE1NX1VJTlRfUFRSKHBEZXZpY2UtPnBSeEp1bWJvQmRWaXJ0W0lkeF0uT3BhcXVlKSk7CisJd2hpbGUgKElkeCAhPSBwRGV2aWNlLT5SeEp1bWJvUHJvZElkeCkgeworCQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpIChNTV9VSU5UX1BUUiAocERldmljZS0+cFBhY2tldERlc2NCYXNlKSArCisJCQkJCU1NX1VJTlRfUFRSIChwRGV2aWNlLT4KKwkJCQkJCSAgICAgcFJ4SnVtYm9CZFZpcnRbSWR4XS4KKwkJCQkJCSAgICAgT3BhcXVlKSk7CiAKLQlRUV9QdXNoVGFpbCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOworCQlRUV9QdXNoVGFpbCAoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKIAotCUlkeCA9IChJZHggKyAxKSAmIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKLSAgICB9IC8qIHdoaWxlICovCisJCUlkeCA9IChJZHggKyAxKSAmIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlRfTUFTSzsKKwl9CQkJLyogd2hpbGUgKi8KIAotICAgIC8qIFJlaW5pdGlhbGl6ZSBvdXIgY29weSBvZiB0aGUgaW5kaWNlcy4gKi8KLSAgICBwRGV2aWNlLT5SeEp1bWJvUHJvZElkeCA9IDA7Ci0jZW5kaWYgLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLworCS8qIFJlaW5pdGlhbGl6ZSBvdXIgY29weSBvZiB0aGUgaW5kaWNlcy4gKi8KKwlwRGV2aWNlLT5SeEp1bWJvUHJvZElkeCA9IDA7CisjZW5kaWYJCQkJLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLwogCi0gICAgTU1fUkVMRUFTRV9JTlRfTE9DSyhwRGV2aWNlKTsKKwlNTV9SRUxFQVNFX0lOVF9MT0NLIChwRGV2aWNlKTsKIAotICAgIC8qIEluaXRpYWxpemUgdGhlIHN0YXRpc3RpcyBCbG9jayAqLwotICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgPSAwOwotICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5SY3ZTdGRDb25JZHggPSAwOwotICAgIHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5SY3ZKdW1ib0NvbklkeCA9IDA7Ci0gICAgcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdk1pbmlDb25JZHggPSAwOworCS8qIEluaXRpYWxpemUgdGhlIHN0YXRpc3RpcyBCbG9jayAqLworCXBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgPSAwOworCXBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5SY3ZTdGRDb25JZHggPSAwOworCXBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5SY3ZKdW1ib0NvbklkeCA9IDA7CisJcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlJjdk1pbmlDb25JZHggPSAwOwogCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotfSAvKiBMTV9BYm9ydCAqLwotCisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQkJCQkvKiBMTV9BYm9ydCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM2NjcsMTQwICszMzk4LDEzMCBAQAogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIExNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fU1RBVFVTCi1MTV9IYWx0KAotUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKSB7Ci0gICAgUExNX1BBQ0tFVCBwUGFja2V0OwotICAgIExNX1VJTlQzMiBFbnRyeUNudDsKLQotICAgIExNX0Fib3J0KHBEZXZpY2UpOwotCi0gICAgLyogR2V0IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcXVldWUuICovCi0gICAgRW50cnlDbnQgPSBRUV9HZXRFbnRyeUNudCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIpOwotCi0gICAgLyogTWFrZSBzdXJlIGFsbCB0aGUgcGFja2V0cyBoYXZlIGJlZW4gYWNjb3VudGVkIGZvci4gKi8KLSAgICBmb3IoRW50cnlDbnQgPSAwOyBFbnRyeUNudCA8IHBEZXZpY2UtPlJ4UGFja2V0RGVzY0NudDsgRW50cnlDbnQrKykKLSAgICB7Ci0JcFBhY2tldCA9IChQTE1fUEFDS0VUKSBRUV9Qb3BIZWFkKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lcik7Ci0JaWYgKHBQYWNrZXQgPT0gMCkKLQkgICAgYnJlYWs7Ci0KLQlNTV9GcmVlUnhCdWZmZXIocERldmljZSwgcFBhY2tldCk7Ci0KLQlRUV9QdXNoVGFpbCgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIsIHBQYWNrZXQpOwotICAgIH0KLQotICAgIExNX1Jlc2V0Q2hpcChwRGV2aWNlKTsKLQotICAgIC8qIFJlc3RvcmUgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAqLwotICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgUENJX0NBQ0hFX0xJTkVfU0laRV9SRUcsCi0JcERldmljZS0+U2F2ZWRDYWNoZUxpbmVSZWcpOwotICAgIExNX1JlZ1dySW5kKHBEZXZpY2UsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lEX1JFRywKLQkocERldmljZS0+U3Vic3lzdGVtSWQgPDwgMTYpIHwgcERldmljZS0+U3Vic3lzdGVtVmVuZG9ySWQpOwotCi0gICAgLyogUmVwcm9ncmFtIHRoZSBNQUMgYWRkcmVzcy4gKi8KLSAgICBMTV9TZXRNYWNBZGRyZXNzKHBEZXZpY2UsIHBEZXZpY2UtPk5vZGVBZGRyZXNzKTsKLQotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLX0gLyogTE1fSGFsdCAqLwotCi0KLVNUQVRJQyBMTV9TVEFUVVMKLUxNX1Jlc2V0Q2hpcChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCitMTV9TVEFUVVMgTE1fSGFsdCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQogewotICAgIExNX1VJTlQzMiBWYWx1ZTMyOwotICAgIExNX1VJTlQzMiBqOworCVBMTV9QQUNLRVQgcFBhY2tldDsKKwlMTV9VSU5UMzIgRW50cnlDbnQ7CiAKLSAgICAvKiBXYWl0IGZvciBhY2Nlc3MgdG8gdGhlIG52cmFtIGludGVyZmFjZSBiZWZvcmUgcmVzZXR0aW5nLiAgVGhpcyBpcyAqLwotICAgIC8qIGEgd29ya2Fyb3VuZCB0byBwcmV2ZW50IEVFUFJPTSBjb3JydXB0aW9uLiAqLwotICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMCAmJgotCVQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMSkKLSAgICB7Ci0JLyogUmVxdWVzdCBhY2Nlc3MgdG8gdGhlIGZsYXNoIGludGVyZmFjZS4gKi8KLQlSRUdfV1IocERldmljZSwgTnZyYW0uU3dBcmIsIFNXX0FSQl9SRVFfU0VUMSk7CisJTE1fQWJvcnQgKHBEZXZpY2UpOwogCi0JZm9yKGogPSAwOyBqIDwgMTAwMDAwOyBqKyspCi0JewotCSAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIE52cmFtLlN3QXJiKTsKLQkgICAgaWYoVmFsdWUzMiAmIFNXX0FSQl9HTlQxKQotCSAgICB7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIE1NX1dhaXQoMTApOworCS8qIEdldCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHF1ZXVlLiAqLworCUVudHJ5Q250ID0gUVFfR2V0RW50cnlDbnQgKCZwRGV2aWNlLT5SeFBhY2tldEZyZWVRLkNvbnRhaW5lcik7CisKKwkvKiBNYWtlIHN1cmUgYWxsIHRoZSBwYWNrZXRzIGhhdmUgYmVlbiBhY2NvdW50ZWQgZm9yLiAqLworCWZvciAoRW50cnlDbnQgPSAwOyBFbnRyeUNudCA8IHBEZXZpY2UtPlJ4UGFja2V0RGVzY0NudDsgRW50cnlDbnQrKykgeworCQlwUGFja2V0ID0KKwkJICAgIChQTE1fUEFDS0VUKSBRUV9Qb3BIZWFkICgmcERldmljZS0+UnhQYWNrZXRGcmVlUS5Db250YWluZXIpOworCQlpZiAocFBhY2tldCA9PSAwKQorCQkJYnJlYWs7CisKKwkJTU1fRnJlZVJ4QnVmZmVyIChwRGV2aWNlLCBwUGFja2V0KTsKKworCQlRUV9QdXNoVGFpbCAoJnBEZXZpY2UtPlJ4UGFja2V0RnJlZVEuQ29udGFpbmVyLCBwUGFja2V0KTsKIAl9Ci0gICAgfQogCi0gICAgLyogR2xvYmFsIHJlc2V0LiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBHcmMuTWlzY0NmZywgR1JDX01JU0NfQ0ZHX0NPUkVfQ0xPQ0tfUkVTRVQpOwotICAgIE1NX1dhaXQoNDApOyBNTV9XYWl0KDQwKTsgTU1fV2FpdCg0MCk7CisJTE1fUmVzZXRDaGlwIChwRGV2aWNlKTsKIAotICAgIC8qIG1ha2Ugc3VyZSB3ZSByZS1lbmFibGUgaW5kaXJlY3QgYWNjZXNzZXMgKi8KLSAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9NSVNDX0hPU1RfQ1RSTF9SRUcsCi0JcERldmljZS0+TWlzY0hvc3RDdHJsKTsKKwkvKiBSZXN0b3JlIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4gKi8KKwlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBQQ0lfQ0FDSEVfTElORV9TSVpFX1JFRywKKwkJCSAgcERldmljZS0+U2F2ZWRDYWNoZUxpbmVSZWcpOworCUxNX1JlZ1dySW5kIChwRGV2aWNlLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRF9SRUcsCisJCSAgICAgKHBEZXZpY2UtPlN1YnN5c3RlbUlkIDw8IDE2KSB8IHBEZXZpY2UtPlN1YnN5c3RlbVZlbmRvcklkKTsKIAotICAgIC8qIFNldCBNQVggUENJIHJldHJ5IHRvIHplcm8uICovCi0gICAgVmFsdWUzMiA9IFQzX1BDSV9TVEFURV9QQ0lfUk9NX0VOQUJMRSB8IFQzX1BDSV9TVEFURV9QQ0lfUk9NX1JFVFJZX0VOQUJMRTsKLSAgICBpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwNF9BMCkKLSAgICB7Ci0JaWYgKCEocERldmljZS0+UGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKSkKLQl7Ci0JICAgIFZhbHVlMzIgfD0gVDNfUENJX1NUQVRFX1JFVFJZX1NBTUVfRE1BOworCS8qIFJlcHJvZ3JhbSB0aGUgTUFDIGFkZHJlc3MuICovCisJTE1fU2V0TWFjQWRkcmVzcyAocERldmljZSwgcERldmljZS0+Tm9kZUFkZHJlc3MpOworCisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQkJCQkvKiBMTV9IYWx0ICovCisKK1NUQVRJQyBMTV9TVEFUVVMgTE1fUmVzZXRDaGlwIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCit7CisJTE1fVUlOVDMyIFZhbHVlMzI7CisJTE1fVUlOVDMyIGo7CisKKwkvKiBXYWl0IGZvciBhY2Nlc3MgdG8gdGhlIG52cmFtIGludGVyZmFjZSBiZWZvcmUgcmVzZXR0aW5nLiAgVGhpcyBpcyAqLworCS8qIGEgd29ya2Fyb3VuZCB0byBwcmV2ZW50IEVFUFJPTSBjb3JydXB0aW9uLiAqLworCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSAhPSBUM19BU0lDX1JFVl81NzAwICYmCisJICAgIFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0FTSUNfUkVWXzU3MDEpIHsKKwkJLyogUmVxdWVzdCBhY2Nlc3MgdG8gdGhlIGZsYXNoIGludGVyZmFjZS4gKi8KKwkJUkVHX1dSIChwRGV2aWNlLCBOdnJhbS5Td0FyYiwgU1dfQVJCX1JFUV9TRVQxKTsKKworCQlmb3IgKGogPSAwOyBqIDwgMTAwMDAwOyBqKyspIHsKKwkJCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIE52cmFtLlN3QXJiKTsKKwkJCWlmIChWYWx1ZTMyICYgU1dfQVJCX0dOVDEpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCU1NX1dhaXQgKDEwKTsKKwkJfQogCX0KLSAgICB9Ci0gICAgTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBUM19QQ0lfU1RBVEVfUkVHLCBWYWx1ZTMyKTsKIAotICAgIC8qIFJlc3RvcmUgUENJIGNvbW1hbmQgcmVnaXN0ZXIuICovCi0gICAgTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBQQ0lfQ09NTUFORF9SRUcsCi0JcERldmljZS0+UGNpQ29tbWFuZFN0YXR1c1dvcmRzKTsKKwkvKiBHbG9iYWwgcmVzZXQuICovCisJUkVHX1dSIChwRGV2aWNlLCBHcmMuTWlzY0NmZywgR1JDX01JU0NfQ0ZHX0NPUkVfQ0xPQ0tfUkVTRVQpOworCU1NX1dhaXQgKDQwKTsKKwlNTV9XYWl0ICg0MCk7CisJTU1fV2FpdCAoNDApOwogCi0gICAgLyogRGlzYWJsZSBQQ0ktWCByZWxheGVkIG9yZGVyaW5nIGJpdC4gKi8KLSAgICBNTV9SZWFkQ29uZmlnMzIocERldmljZSwgUENJWF9DQVBfUkVHLCAmVmFsdWUzMik7Ci0gICAgVmFsdWUzMiAmPSB+UENJWF9FTkFCTEVfUkVMQVhFRF9PUkRFUklORzsKLSAgICBNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFBDSVhfQ0FQX1JFRywgVmFsdWUzMik7CisJLyogbWFrZSBzdXJlIHdlIHJlLWVuYWJsZSBpbmRpcmVjdCBhY2Nlc3NlcyAqLworCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9NSVNDX0hPU1RfQ1RSTF9SRUcsCisJCQkgIHBEZXZpY2UtPk1pc2NIb3N0Q3RybCk7CiAKLSAgICAvKiBFbmFibGUgbWVtb3J5IGFyYml0ZXIuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIE1lbUFyYml0ZXIuTW9kZSwgVDNfTUVNX0FSQklURVJfTU9ERV9FTkFCTEUpOworCS8qIFNldCBNQVggUENJIHJldHJ5IHRvIHplcm8uICovCisJVmFsdWUzMiA9CisJICAgIFQzX1BDSV9TVEFURV9QQ0lfUk9NX0VOQUJMRSB8IFQzX1BDSV9TVEFURV9QQ0lfUk9NX1JFVFJZX0VOQUJMRTsKKwlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwNF9BMCkgeworCQlpZiAoIShwRGV2aWNlLT5QY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9DT05WRU5USU9OQUxfUENJX01PREUpKSB7CisJCQlWYWx1ZTMyIHw9IFQzX1BDSV9TVEFURV9SRVRSWV9TQU1FX0RNQTsKKwkJfQorCX0KKwlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfU1RBVEVfUkVHLCBWYWx1ZTMyKTsKIAotI2lmZGVmIEJJR19FTkRJQU5fUENJICAgICAgLyogVGhpcyBmcm9tIGpmZCAqLwotCVZhbHVlMzIgPSBHUkNfTU9ERV9XT1JEX1NXQVBfREFUQXwKLQkJICBHUkNfTU9ERV9XT1JEX1NXQVBfTk9OX0ZSQU1FX0RBVEE7CisJLyogUmVzdG9yZSBQQ0kgY29tbWFuZCByZWdpc3Rlci4gKi8KKwlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBQQ0lfQ09NTUFORF9SRUcsCisJCQkgIHBEZXZpY2UtPlBjaUNvbW1hbmRTdGF0dXNXb3Jkcyk7CisKKwkvKiBEaXNhYmxlIFBDSS1YIHJlbGF4ZWQgb3JkZXJpbmcgYml0LiAqLworCU1NX1JlYWRDb25maWczMiAocERldmljZSwgUENJWF9DQVBfUkVHLCAmVmFsdWUzMik7CisJVmFsdWUzMiAmPSB+UENJWF9FTkFCTEVfUkVMQVhFRF9PUkRFUklORzsKKwlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBQQ0lYX0NBUF9SRUcsIFZhbHVlMzIpOworCisJLyogRW5hYmxlIG1lbW9yeSBhcmJpdGVyLiAqLworCVJFR19XUiAocERldmljZSwgTWVtQXJiaXRlci5Nb2RlLCBUM19NRU1fQVJCSVRFUl9NT0RFX0VOQUJMRSk7CisKKyNpZmRlZiBCSUdfRU5ESUFOX1BDSQkJLyogVGhpcyBmcm9tIGpmZCAqLworCVZhbHVlMzIgPSBHUkNfTU9ERV9XT1JEX1NXQVBfREFUQSB8IEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQTsKICNlbHNlCiAjaWZkZWYgQklHX0VORElBTl9IT1NUCi0gICAgLyogUmVjb25maWd1cmUgdGhlIG1vZGUgcmVnaXN0ZXIuICovCi0gICAgVmFsdWUzMiA9IEdSQ19NT0RFX0JZVEVfU1dBUF9OT05fRlJBTUVfREFUQSB8Ci0JICAgICAgR1JDX01PREVfV09SRF9TV0FQX05PTl9GUkFNRV9EQVRBIHwKLQkgICAgICBHUkNfTU9ERV9CWVRFX1NXQVBfREFUQSB8Ci0JICAgICAgR1JDX01PREVfV09SRF9TV0FQX0RBVEE7CisJLyogUmVjb25maWd1cmUgdGhlIG1vZGUgcmVnaXN0ZXIuICovCisJVmFsdWUzMiA9IEdSQ19NT0RFX0JZVEVfU1dBUF9OT05fRlJBTUVfREFUQSB8CisJICAgIEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQSB8CisJICAgIEdSQ19NT0RFX0JZVEVfU1dBUF9EQVRBIHwgR1JDX01PREVfV09SRF9TV0FQX0RBVEE7CiAjZWxzZQotICAgIC8qIFJlY29uZmlndXJlIHRoZSBtb2RlIHJlZ2lzdGVyLiAqLwotICAgIFZhbHVlMzIgPSBHUkNfTU9ERV9CWVRFX1NXQVBfTk9OX0ZSQU1FX0RBVEEgfCBHUkNfTU9ERV9CWVRFX1NXQVBfREFUQTsKKwkvKiBSZWNvbmZpZ3VyZSB0aGUgbW9kZSByZWdpc3Rlci4gKi8KKwlWYWx1ZTMyID0gR1JDX01PREVfQllURV9TV0FQX05PTl9GUkFNRV9EQVRBIHwgR1JDX01PREVfQllURV9TV0FQX0RBVEE7CiAjZW5kaWYKICNlbmRpZgotICAgIFJFR19XUihwRGV2aWNlLCBHcmMuTW9kZSwgVmFsdWUzMik7CisJUkVHX1dSIChwRGV2aWNlLCBHcmMuTW9kZSwgVmFsdWUzMik7CiAKLSAgICAvKiBQcmV2ZW50IFBYRSBmcm9tIHJlc3RhcnRpbmcuICovCi0gICAgTUVNX1dSX09GRlNFVChwRGV2aWNlLCAweDBiNTAsIFQzX01BR0lDX05VTSk7CisJLyogUHJldmVudCBQWEUgZnJvbSByZXN0YXJ0aW5nLiAqLworCU1FTV9XUl9PRkZTRVQgKHBEZXZpY2UsIDB4MGI1MCwgVDNfTUFHSUNfTlVNKTsKIAotICAgIGlmKHBEZXZpY2UtPkVuYWJsZVRiaSkgewotCXBEZXZpY2UtPk1hY01vZGUgPSBNQUNfTU9ERV9QT1JUX01PREVfVEJJOwotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIE1BQ19NT0RFX1BPUlRfTU9ERV9UQkkpOwotICAgIH0KLSAgICBlbHNlIHsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5Nb2RlLCAwKTsKLSAgICB9Ci0KLSAgICAvKiBXYWl0IGZvciB0aGUgZmlybXdhcmUgdG8gZmluaXNoIGluaXRpYWxpemF0aW9uLiAqLwotICAgIGZvcihqID0gMDsgaiA8IDEwMDAwMDsgaisrKQotICAgIHsKLQlNTV9XYWl0KDEwKTsKLQotCVZhbHVlMzIgPSBNRU1fUkRfT0ZGU0VUKHBEZXZpY2UsIDB4MGI1MCk7Ci0JaWYoVmFsdWUzMiA9PSB+VDNfTUFHSUNfTlVNKQotCXsKLQkgICAgYnJlYWs7CisJaWYgKHBEZXZpY2UtPkVuYWJsZVRiaSkgeworCQlwRGV2aWNlLT5NYWNNb2RlID0gTUFDX01PREVfUE9SVF9NT0RFX1RCSTsKKwkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIE1BQ19NT0RFX1BPUlRfTU9ERV9UQkkpOworCX0gZWxzZSB7CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5Nb2RlLCAwKTsKIAl9Ci0gICAgfQotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKworCS8qIFdhaXQgZm9yIHRoZSBmaXJtd2FyZSB0byBmaW5pc2ggaW5pdGlhbGl6YXRpb24uICovCisJZm9yIChqID0gMDsgaiA8IDEwMDAwMDsgaisrKSB7CisJCU1NX1dhaXQgKDEwKTsKKworCQlWYWx1ZTMyID0gTUVNX1JEX09GRlNFVCAocERldmljZSwgMHgwYjUwKTsKKwkJaWYgKFZhbHVlMzIgPT0gflQzX01BR0lDX05VTSkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzgwOCwxNjEgKzM1MjksMTQzIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1fX2lubGluZSBzdGF0aWMgdm9pZAotTE1fU2VydmljZVR4SW50ZXJydXB0KAotUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKSB7Ci0gICAgUExNX1BBQ0tFVCBwUGFja2V0OwotICAgIExNX1VJTlQzMiBId0NvbklkeDsKLSAgICBMTV9VSU5UMzIgU3dDb25JZHg7CitfX2lubGluZSBzdGF0aWMgdm9pZCBMTV9TZXJ2aWNlVHhJbnRlcnJ1cHQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKwlQTE1fUEFDS0VUIHBQYWNrZXQ7CisJTE1fVUlOVDMyIEh3Q29uSWR4OworCUxNX1VJTlQzMiBTd0NvbklkeDsKIAotICAgIEh3Q29uSWR4ID0gcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPklkeFswXS5TZW5kQ29uSWR4OwotCi0gICAgLyogR2V0IG91ciBjb3B5IG9mIHRoZSBjb25zdW1lciBpbmRleC4gIFRoZSBidWZmZXIgZGVzY3JpcHRvcnMgKi8KLSAgICAvKiB0aGF0IGFyZSBpbiBiZXR3ZWVuIHRoZSBjb25zdW1lciBpbmRpY2VzIGFyZSBmcmVlZC4gKi8KLSAgICBTd0NvbklkeCA9IHBEZXZpY2UtPlNlbmRDb25JZHg7Ci0KLSAgICAvKiBNb3ZlIHRoZSBwYWNrZXRzIGZyb20gdGhlIFR4UGFja2V0QWN0aXZlUSB0aGF0IGFyZSBzZW50IG91dCB0byAqLwotICAgIC8qIHRoZSBUeFBhY2tldFhtaXR0ZWRRLiAgUGFja2V0cyB0aGF0IGFyZSBzZW50IHVzZSB0aGUgKi8KLSAgICAvKiBkZXNjcmlwdG9ycyB0aGF0IGFyZSBiZXR3ZWVuIFN3Q29uSWR4IGFuZCBId0NvbklkeC4gKi8KLSAgICB3aGlsZShTd0NvbklkeCAhPSBId0NvbklkeCkKLSAgICB7Ci0JLyogR2V0IHRoZSBwYWNrZXQgdGhhdCB3YXMgc2VudCBmcm9tIHRoZSBUeFBhY2tldEFjdGl2ZVEuICovCi0JcFBhY2tldCA9IChQTE1fUEFDS0VUKSBRUV9Qb3BIZWFkKAotCSAgICAmcERldmljZS0+VHhQYWNrZXRBY3RpdmVRLkNvbnRhaW5lcik7Ci0KLQkvKiBTZXQgdGhlIHJldHVybiBzdGF0dXMuICovCi0JcFBhY2tldC0+UGFja2V0U3RhdHVzID0gTE1fU1RBVFVTX1NVQ0NFU1M7Ci0KLQkvKiBQdXQgdGhlIHBhY2tldCBpbiB0aGUgVHhQYWNrZXRYbWl0dGVkUSBmb3IgaW5kaWNhdGlvbiBsYXRlci4gKi8KLQlRUV9QdXNoVGFpbCgmcERldmljZS0+VHhQYWNrZXRYbWl0dGVkUS5Db250YWluZXIsIHBQYWNrZXQpOwotCi0JLyogTW92ZSB0byB0aGUgbmV4dCBwYWNrZXQncyBCRC4gKi8KLQlTd0NvbklkeCA9IChTd0NvbklkeCArIHBQYWNrZXQtPnUuVHguRnJhZ0NvdW50KSAmCi0JICAgIFQzX1NFTkRfUkNCX0VOVFJZX0NPVU5UX01BU0s7Ci0KLQkvKiBVcGRhdGUgdGhlIG51bWJlciBvZiB1bnVzZWQgQkRzLiAqLwotCWF0b21pY19hZGQocFBhY2tldC0+dS5UeC5GcmFnQ291bnQsICZwRGV2aWNlLT5TZW5kQmRMZWZ0KTsKLQotCS8qIEdldCB0aGUgbmV3IHVwZGF0ZWQgSHdDb25JZHguICovCiAJSHdDb25JZHggPSBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+SWR4WzBdLlNlbmRDb25JZHg7Ci0gICAgfSAvKiB3aGlsZSAqLwogCi0gICAgLyogU2F2ZSB0aGUgbmV3IFN3Q29uSWR4LiAqLwotICAgIHBEZXZpY2UtPlNlbmRDb25JZHggPSBTd0NvbklkeDsKKwkvKiBHZXQgb3VyIGNvcHkgb2YgdGhlIGNvbnN1bWVyIGluZGV4LiAgVGhlIGJ1ZmZlciBkZXNjcmlwdG9ycyAqLworCS8qIHRoYXQgYXJlIGluIGJldHdlZW4gdGhlIGNvbnN1bWVyIGluZGljZXMgYXJlIGZyZWVkLiAqLworCVN3Q29uSWR4ID0gcERldmljZS0+U2VuZENvbklkeDsKIAotfSAvKiBMTV9TZXJ2aWNlVHhJbnRlcnJ1cHQgKi8KKwkvKiBNb3ZlIHRoZSBwYWNrZXRzIGZyb20gdGhlIFR4UGFja2V0QWN0aXZlUSB0aGF0IGFyZSBzZW50IG91dCB0byAqLworCS8qIHRoZSBUeFBhY2tldFhtaXR0ZWRRLiAgUGFja2V0cyB0aGF0IGFyZSBzZW50IHVzZSB0aGUgKi8KKwkvKiBkZXNjcmlwdG9ycyB0aGF0IGFyZSBiZXR3ZWVuIFN3Q29uSWR4IGFuZCBId0NvbklkeC4gKi8KKwl3aGlsZSAoU3dDb25JZHggIT0gSHdDb25JZHgpIHsKKwkJLyogR2V0IHRoZSBwYWNrZXQgdGhhdCB3YXMgc2VudCBmcm9tIHRoZSBUeFBhY2tldEFjdGl2ZVEuICovCisJCXBQYWNrZXQgPQorCQkgICAgKFBMTV9QQUNLRVQpIFFRX1BvcEhlYWQgKCZwRGV2aWNlLT5UeFBhY2tldEFjdGl2ZVEuCisJCQkJCSAgICAgQ29udGFpbmVyKTsKIAorCQkvKiBTZXQgdGhlIHJldHVybiBzdGF0dXMuICovCisJCXBQYWNrZXQtPlBhY2tldFN0YXR1cyA9IExNX1NUQVRVU19TVUNDRVNTOworCisJCS8qIFB1dCB0aGUgcGFja2V0IGluIHRoZSBUeFBhY2tldFhtaXR0ZWRRIGZvciBpbmRpY2F0aW9uIGxhdGVyLiAqLworCQlRUV9QdXNoVGFpbCAoJnBEZXZpY2UtPlR4UGFja2V0WG1pdHRlZFEuQ29udGFpbmVyLCBwUGFja2V0KTsKKworCQkvKiBNb3ZlIHRvIHRoZSBuZXh0IHBhY2tldCdzIEJELiAqLworCQlTd0NvbklkeCA9IChTd0NvbklkeCArIHBQYWNrZXQtPnUuVHguRnJhZ0NvdW50KSAmCisJCSAgICBUM19TRU5EX1JDQl9FTlRSWV9DT1VOVF9NQVNLOworCisJCS8qIFVwZGF0ZSB0aGUgbnVtYmVyIG9mIHVudXNlZCBCRHMuICovCisJCWF0b21pY19hZGQgKHBQYWNrZXQtPnUuVHguRnJhZ0NvdW50LCAmcERldmljZS0+U2VuZEJkTGVmdCk7CisKKwkJLyogR2V0IHRoZSBuZXcgdXBkYXRlZCBId0NvbklkeC4gKi8KKwkJSHdDb25JZHggPSBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+SWR4WzBdLlNlbmRDb25JZHg7CisJfQkJCS8qIHdoaWxlICovCisKKwkvKiBTYXZlIHRoZSBuZXcgU3dDb25JZHguICovCisJcERldmljZS0+U2VuZENvbklkeCA9IFN3Q29uSWR4OworCit9CQkJCS8qIExNX1NlcnZpY2VUeEludGVycnVwdCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLV9faW5saW5lIHN0YXRpYyB2b2lkCi1MTV9TZXJ2aWNlUnhJbnRlcnJ1cHQoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpIHsKLSAgICBQTE1fUEFDS0VUIHBQYWNrZXQ7Ci0gICAgUFQzX1JDVl9CRCBwUmN2QmQ7Ci0gICAgTE1fVUlOVDMyIEh3UmN2UmV0UHJvZElkeDsKLSAgICBMTV9VSU5UMzIgU3dSY3ZSZXRDb25JZHg7CitfX2lubGluZSBzdGF0aWMgdm9pZCBMTV9TZXJ2aWNlUnhJbnRlcnJ1cHQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK3sKKwlQTE1fUEFDS0VUIHBQYWNrZXQ7CisJUFQzX1JDVl9CRCBwUmN2QmQ7CisJTE1fVUlOVDMyIEh3UmN2UmV0UHJvZElkeDsKKwlMTV9VSU5UMzIgU3dSY3ZSZXRDb25JZHg7CiAKLSAgICAvKiBMb29wIHRocnUgdGhlIHJlY2VpdmUgcmV0dXJuIHJpbmdzIGZvciByZWNlaXZlZCBwYWNrZXRzLiAqLwotICAgIEh3UmN2UmV0UHJvZElkeCA9IHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5JZHhbMF0uUmN2UHJvZElkeDsKLQotICAgIFN3UmN2UmV0Q29uSWR4ID0gcERldmljZS0+UmN2UmV0Q29uSWR4OwotICAgIHdoaWxlKFN3UmN2UmV0Q29uSWR4ICE9IEh3UmN2UmV0UHJvZElkeCkKLSAgICB7Ci0JcFJjdkJkID0gJnBEZXZpY2UtPnBSY3ZSZXRCZFZpcnRbU3dSY3ZSZXRDb25JZHhdOwotCi0JLyogR2V0IHRoZSByZWNlaXZlZCBwYWNrZXQgZGVzY3JpcHRvci4gKi8KLQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpIChNTV9VSU5UX1BUUihwRGV2aWNlLT5wUGFja2V0RGVzY0Jhc2UpICsKLQkgICAgTU1fVUlOVF9QVFIocFJjdkJkLT5PcGFxdWUpKTsKLQotCS8qIENoZWNrIHRoZSBlcnJvciBmbGFnLiAqLwotCWlmKHBSY3ZCZC0+RXJyb3JGbGFnICYmCi0JICAgIHBSY3ZCZC0+RXJyb3JGbGFnICE9IFJDVl9CRF9FUlJfT0REX05JQkJMRURfUkNWRF9NSUkpCi0JewotCSAgICBwUGFja2V0LT5QYWNrZXRTdGF0dXMgPSBMTV9TVEFUVVNfRkFJTFVSRTsKLQotCSAgICBwRGV2aWNlLT5SeENvdW50ZXJzLlJ4UGFja2V0RXJyQ250Kys7Ci0KLQkgICAgaWYocFJjdkJkLT5FcnJvckZsYWcgJiBSQ1ZfQkRfRVJSX0JBRF9DUkMpCi0JICAgIHsKLQkJcERldmljZS0+UnhDb3VudGVycy5SeEVyckNyY0NudCsrOwotCSAgICB9Ci0KLQkgICAgaWYocFJjdkJkLT5FcnJvckZsYWcgJiBSQ1ZfQkRfRVJSX0NPTExfREVURUNUKQotCSAgICB7Ci0JCXBEZXZpY2UtPlJ4Q291bnRlcnMuUnhFcnJDb2xsQ250Kys7Ci0JICAgIH0KLQotCSAgICBpZihwUmN2QmQtPkVycm9yRmxhZyAmIFJDVl9CRF9FUlJfTElOS19MT1NUX0RVUklOR19QS1QpCi0JICAgIHsKLQkJcERldmljZS0+UnhDb3VudGVycy5SeEVyckxpbmtMb3N0Q250Kys7Ci0JICAgIH0KLQotCSAgICBpZihwUmN2QmQtPkVycm9yRmxhZyAmIFJDVl9CRF9FUlJfUEhZX0RFQ09ERV9FUlIpCi0JICAgIHsKLQkJcERldmljZS0+UnhDb3VudGVycy5SeEVyclBoeURlY29kZUNudCsrOwotCSAgICB9Ci0KLQkgICAgaWYocFJjdkJkLT5FcnJvckZsYWcgJiBSQ1ZfQkRfRVJSX09ERF9OSUJCTEVEX1JDVkRfTUlJKQotCSAgICB7Ci0JCXBEZXZpY2UtPlJ4Q291bnRlcnMuUnhFcnJPZGROaWJibGVDbnQrKzsKLQkgICAgfQotCi0JICAgIGlmKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9NQUNfQUJPUlQpCi0JICAgIHsKLQkJcERldmljZS0+UnhDb3VudGVycy5SeEVyck1hY0Fib3J0Q250Kys7Ci0JICAgIH0KLQotCSAgICBpZihwUmN2QmQtPkVycm9yRmxhZyAmIFJDVl9CRF9FUlJfTEVOX0xUXzY0KQotCSAgICB7Ci0JCXBEZXZpY2UtPlJ4Q291bnRlcnMuUnhFcnJTaG9ydFBhY2tldENudCsrOwotCSAgICB9Ci0KLQkgICAgaWYocFJjdkJkLT5FcnJvckZsYWcgJiBSQ1ZfQkRfRVJSX1RSVU5DX05PX1JFU09VUkNFUykKLQkgICAgewotCQlwRGV2aWNlLT5SeENvdW50ZXJzLlJ4RXJyTm9SZXNvdXJjZUNudCsrOwotCSAgICB9Ci0KLQkgICAgaWYocFJjdkJkLT5FcnJvckZsYWcgJiBSQ1ZfQkRfRVJSX0dJQU5UX0ZSQU1FX1JDVkQpCi0JICAgIHsKLQkJcERldmljZS0+UnhDb3VudGVycy5SeEVyckxhcmdlUGFja2V0Q250Kys7Ci0JICAgIH0KLQl9Ci0JZWxzZQotCXsKLQkgICAgcFBhY2tldC0+UGFja2V0U3RhdHVzID0gTE1fU1RBVFVTX1NVQ0NFU1M7Ci0JICAgIHBQYWNrZXQtPlBhY2tldFNpemUgPSBwUmN2QmQtPkxlbiAtIDQ7Ci0KLQkgICAgcFBhY2tldC0+RmxhZ3MgPSBwUmN2QmQtPkZsYWdzOwotCSAgICBpZihwUmN2QmQtPkZsYWdzICYgUkNWX0JEX0ZMQUdfVkxBTl9UQUcpCi0JICAgIHsKLQkJcFBhY2tldC0+VmxhblRhZyA9IHBSY3ZCZC0+VmxhblRhZzsKLQkgICAgfQotCi0JICAgIHBQYWNrZXQtPnUuUnguVGNwVWRwQ2hlY2tzdW0gPSBwUmN2QmQtPlRjcFVkcENrc3VtOwotCX0KLQotCS8qIFB1dCB0aGUgcGFja2V0IGRlc2NyaXB0b3IgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgcGFja2V0ICovCi0JLyogYnVmZmVyIGluIHRoZSBSeFBhY2tldFJlY2VpdmVkUSBmb3IgaW5kaWNhdGlvbiBsYXRlci4gKi8KLQlRUV9QdXNoVGFpbCgmcERldmljZS0+UnhQYWNrZXRSZWNlaXZlZFEuQ29udGFpbmVyLCBwUGFja2V0KTsKLQotCS8qIEdvIHRvIHRoZSBuZXh0IGJ1ZmZlciBkZXNjcmlwdG9yLiAqLwotCVN3UmN2UmV0Q29uSWR4ID0gKFN3UmN2UmV0Q29uSWR4ICsgMSkgJgotCSAgICBUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVF9NQVNLOwotCi0JLyogR2V0IHRoZSB1cGRhdGVkIEh3UmN2UmV0UHJvZElkeC4gKi8KKwkvKiBMb29wIHRocnUgdGhlIHJlY2VpdmUgcmV0dXJuIHJpbmdzIGZvciByZWNlaXZlZCBwYWNrZXRzLiAqLwogCUh3UmN2UmV0UHJvZElkeCA9IHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5JZHhbMF0uUmN2UHJvZElkeDsKLSAgICB9IC8qIHdoaWxlICovCiAKLSAgICBwRGV2aWNlLT5SY3ZSZXRDb25JZHggPSBTd1JjdlJldENvbklkeDsKKwlTd1JjdlJldENvbklkeCA9IHBEZXZpY2UtPlJjdlJldENvbklkeDsKKwl3aGlsZSAoU3dSY3ZSZXRDb25JZHggIT0gSHdSY3ZSZXRQcm9kSWR4KSB7CisJCXBSY3ZCZCA9ICZwRGV2aWNlLT5wUmN2UmV0QmRWaXJ0W1N3UmN2UmV0Q29uSWR4XTsKIAotICAgIC8qIFVwZGF0ZSB0aGUgcmVjZWl2ZSByZXR1cm4gcmluZyBjb25zdW1lciBpbmRleC4gKi8KLSAgICBNQl9SRUdfV1IocERldmljZSwgTWFpbGJveC5SY3ZSZXRDb25JZHhbMF0uTG93LCBTd1JjdlJldENvbklkeCk7Ci19IC8qIExNX1NlcnZpY2VSeEludGVycnVwdCAqLworCQkvKiBHZXQgdGhlIHJlY2VpdmVkIHBhY2tldCBkZXNjcmlwdG9yLiAqLworCQlwUGFja2V0ID0gKFBMTV9QQUNLRVQpIChNTV9VSU5UX1BUUiAocERldmljZS0+cFBhY2tldERlc2NCYXNlKSArCisJCQkJCU1NX1VJTlRfUFRSIChwUmN2QmQtPk9wYXF1ZSkpOwogCisJCS8qIENoZWNrIHRoZSBlcnJvciBmbGFnLiAqLworCQlpZiAocFJjdkJkLT5FcnJvckZsYWcgJiYKKwkJICAgIHBSY3ZCZC0+RXJyb3JGbGFnICE9IFJDVl9CRF9FUlJfT0REX05JQkJMRURfUkNWRF9NSUkpIHsKKwkJCXBQYWNrZXQtPlBhY2tldFN0YXR1cyA9IExNX1NUQVRVU19GQUlMVVJFOworCisJCQlwRGV2aWNlLT5SeENvdW50ZXJzLlJ4UGFja2V0RXJyQ250Kys7CisKKwkJCWlmIChwUmN2QmQtPkVycm9yRmxhZyAmIFJDVl9CRF9FUlJfQkFEX0NSQykgeworCQkJCXBEZXZpY2UtPlJ4Q291bnRlcnMuUnhFcnJDcmNDbnQrKzsKKwkJCX0KKworCQkJaWYgKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9DT0xMX0RFVEVDVCkgeworCQkJCXBEZXZpY2UtPlJ4Q291bnRlcnMuUnhFcnJDb2xsQ250Kys7CisJCQl9CisKKwkJCWlmIChwUmN2QmQtPkVycm9yRmxhZyAmIFJDVl9CRF9FUlJfTElOS19MT1NUX0RVUklOR19QS1QpIHsKKwkJCQlwRGV2aWNlLT5SeENvdW50ZXJzLlJ4RXJyTGlua0xvc3RDbnQrKzsKKwkJCX0KKworCQkJaWYgKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9QSFlfREVDT0RFX0VSUikgeworCQkJCXBEZXZpY2UtPlJ4Q291bnRlcnMuUnhFcnJQaHlEZWNvZGVDbnQrKzsKKwkJCX0KKworCQkJaWYgKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9PRERfTklCQkxFRF9SQ1ZEX01JSSkgeworCQkJCXBEZXZpY2UtPlJ4Q291bnRlcnMuUnhFcnJPZGROaWJibGVDbnQrKzsKKwkJCX0KKworCQkJaWYgKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9NQUNfQUJPUlQpIHsKKwkJCQlwRGV2aWNlLT5SeENvdW50ZXJzLlJ4RXJyTWFjQWJvcnRDbnQrKzsKKwkJCX0KKworCQkJaWYgKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9MRU5fTFRfNjQpIHsKKwkJCQlwRGV2aWNlLT5SeENvdW50ZXJzLlJ4RXJyU2hvcnRQYWNrZXRDbnQrKzsKKwkJCX0KKworCQkJaWYgKHBSY3ZCZC0+RXJyb3JGbGFnICYgUkNWX0JEX0VSUl9UUlVOQ19OT19SRVNPVVJDRVMpIHsKKwkJCQlwRGV2aWNlLT5SeENvdW50ZXJzLlJ4RXJyTm9SZXNvdXJjZUNudCsrOworCQkJfQorCisJCQlpZiAocFJjdkJkLT5FcnJvckZsYWcgJiBSQ1ZfQkRfRVJSX0dJQU5UX0ZSQU1FX1JDVkQpIHsKKwkJCQlwRGV2aWNlLT5SeENvdW50ZXJzLlJ4RXJyTGFyZ2VQYWNrZXRDbnQrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBQYWNrZXQtPlBhY2tldFN0YXR1cyA9IExNX1NUQVRVU19TVUNDRVNTOworCQkJcFBhY2tldC0+UGFja2V0U2l6ZSA9IHBSY3ZCZC0+TGVuIC0gNDsKKworCQkJcFBhY2tldC0+RmxhZ3MgPSBwUmN2QmQtPkZsYWdzOworCQkJaWYgKHBSY3ZCZC0+RmxhZ3MgJiBSQ1ZfQkRfRkxBR19WTEFOX1RBRykgeworCQkJCXBQYWNrZXQtPlZsYW5UYWcgPSBwUmN2QmQtPlZsYW5UYWc7CisJCQl9CisKKwkJCXBQYWNrZXQtPnUuUnguVGNwVWRwQ2hlY2tzdW0gPSBwUmN2QmQtPlRjcFVkcENrc3VtOworCQl9CisKKwkJLyogUHV0IHRoZSBwYWNrZXQgZGVzY3JpcHRvciBjb250YWluaW5nIHRoZSByZWNlaXZlZCBwYWNrZXQgKi8KKwkJLyogYnVmZmVyIGluIHRoZSBSeFBhY2tldFJlY2VpdmVkUSBmb3IgaW5kaWNhdGlvbiBsYXRlci4gKi8KKwkJUVFfUHVzaFRhaWwgKCZwRGV2aWNlLT5SeFBhY2tldFJlY2VpdmVkUS5Db250YWluZXIsIHBQYWNrZXQpOworCisJCS8qIEdvIHRvIHRoZSBuZXh0IGJ1ZmZlciBkZXNjcmlwdG9yLiAqLworCQlTd1JjdlJldENvbklkeCA9IChTd1JjdlJldENvbklkeCArIDEpICYKKwkJICAgIFQzX1JDVl9SRVRVUk5fUkNCX0VOVFJZX0NPVU5UX01BU0s7CisKKwkJLyogR2V0IHRoZSB1cGRhdGVkIEh3UmN2UmV0UHJvZElkeC4gKi8KKwkJSHdSY3ZSZXRQcm9kSWR4ID0gcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPklkeFswXS5SY3ZQcm9kSWR4OworCX0JCQkvKiB3aGlsZSAqLworCisJcERldmljZS0+UmN2UmV0Q29uSWR4ID0gU3dSY3ZSZXRDb25JZHg7CisKKwkvKiBVcGRhdGUgdGhlIHJlY2VpdmUgcmV0dXJuIHJpbmcgY29uc3VtZXIgaW5kZXguICovCisJTUJfUkVHX1dSIChwRGV2aWNlLCBNYWlsYm94LlJjdlJldENvbklkeFswXS5Mb3csIFN3UmN2UmV0Q29uSWR4KTsKK30JCQkJLyogTE1fU2VydmljZVJ4SW50ZXJydXB0ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzk3MiwyMDcgKzM2NzUsMTgwIEBACiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgTE1fU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9TVEFUVVMKLUxNX1NlcnZpY2VJbnRlcnJ1cHRzKAotICAgIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK0xNX1NUQVRVUyBMTV9TZXJ2aWNlSW50ZXJydXB0cyAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQogewotICAgIExNX1VJTlQzMiBWYWx1ZTMyOwotICAgIGludCBTZXJ2aWNlUGh5SW50ID0gRkFMU0U7CisJTE1fVUlOVDMyIFZhbHVlMzI7CisJaW50IFNlcnZpY2VQaHlJbnQgPSBGQUxTRTsKIAotICAgIC8qIFNldHVwIHRoZSBwaHkgY2hpcCB3aGVuZXZlciB0aGUgbGluayBzdGF0dXMgY2hhbmdlcy4gKi8KLSAgICBpZihwRGV2aWNlLT5MaW5rQ2huZ01vZGUgPT0gVDNfTElOS19DSE5HX01PREVfVVNFX1NUQVRVU19SRUcpCi0gICAgewotCVZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgTWFjQ3RybC5TdGF0dXMpOwotCWlmKHBEZXZpY2UtPlBoeUludE1vZGUgPT0gVDNfUEhZX0lOVF9NT0RFX01JX0lOVEVSUlVQVCkKLQl7Ci0JICAgIGlmIChWYWx1ZTMyICYgTUFDX1NUQVRVU19NSV9JTlRFUlJVUFQpCi0JICAgIHsKLQkJU2VydmljZVBoeUludCA9IFRSVUU7Ci0JICAgIH0KKwkvKiBTZXR1cCB0aGUgcGh5IGNoaXAgd2hlbmV2ZXIgdGhlIGxpbmsgc3RhdHVzIGNoYW5nZXMuICovCisJaWYgKHBEZXZpY2UtPkxpbmtDaG5nTW9kZSA9PSBUM19MSU5LX0NITkdfTU9ERV9VU0VfU1RBVFVTX1JFRykgeworCQlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cyk7CisJCWlmIChwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9NSV9JTlRFUlJVUFQpIHsKKwkJCWlmIChWYWx1ZTMyICYgTUFDX1NUQVRVU19NSV9JTlRFUlJVUFQpIHsKKwkJCQlTZXJ2aWNlUGh5SW50ID0gVFJVRTsKKwkJCX0KKwkJfSBlbHNlIGlmIChWYWx1ZTMyICYgTUFDX1NUQVRVU19MSU5LX1NUQVRFX0NIQU5HRUQpIHsKKwkJCVNlcnZpY2VQaHlJbnQgPSBUUlVFOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT4KKwkJICAgIFN0YXR1cyAmIFNUQVRVU19CTE9DS19MSU5LX0NIQU5HRURfU1RBVFVTKSB7CisJCQlwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzID0KKwkJCSAgICBTVEFUVVNfQkxPQ0tfVVBEQVRFRCB8IChwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+CisJCQkJCQkgICAgU3RhdHVzICYKKwkJCQkJCSAgICB+U1RBVFVTX0JMT0NLX0xJTktfQ0hBTkdFRF9TVEFUVVMpOworCQkJU2VydmljZVBoeUludCA9IFRSVUU7CisJCX0KIAl9Ci0JZWxzZSBpZihWYWx1ZTMyICYgTUFDX1NUQVRVU19MSU5LX1NUQVRFX0NIQU5HRUQpCi0JewotCSAgICBTZXJ2aWNlUGh5SW50ID0gVFJVRTsKLQl9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JaWYocERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1cyAmIFNUQVRVU19CTE9DS19MSU5LX0NIQU5HRURfU1RBVFVTKQotCXsKLQkgICAgcERldmljZS0+cFN0YXR1c0Jsa1ZpcnQtPlN0YXR1cyA9IFNUQVRVU19CTE9DS19VUERBVEVEIHwKLQkJKHBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgJiB+U1RBVFVTX0JMT0NLX0xJTktfQ0hBTkdFRF9TVEFUVVMpOwotCSAgICBTZXJ2aWNlUGh5SW50ID0gVFJVRTsKLQl9Ci0gICAgfQogI2lmIElOQ0xVREVfVEJJX1NVUFBPUlQKLSAgICBpZiAocERldmljZS0+SWdub3JlVGJpTGlua0NoYW5nZSA9PSBUUlVFKQotICAgIHsKLQlTZXJ2aWNlUGh5SW50ID0gRkFMU0U7Ci0gICAgfQorCWlmIChwRGV2aWNlLT5JZ25vcmVUYmlMaW5rQ2hhbmdlID09IFRSVUUpIHsKKwkJU2VydmljZVBoeUludCA9IEZBTFNFOworCX0KICNlbmRpZgotICAgIGlmIChTZXJ2aWNlUGh5SW50ID09IFRSVUUpCi0gICAgewotCUxNX1NldHVwUGh5KHBEZXZpY2UpOwotICAgIH0KLQotICAgIC8qIFNlcnZpY2UgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgaW50ZXJydXB0cy4gKi8KLSAgICBMTV9TZXJ2aWNlUnhJbnRlcnJ1cHQocERldmljZSk7Ci0gICAgTE1fU2VydmljZVR4SW50ZXJydXB0KHBEZXZpY2UpOwotCi0gICAgLyogTm8gc3BpbmxvY2sgZm9yIHRoaXMgcXVldWUgc2luY2UgdGhpcyByb3V0aW5lIGlzIHNlcmlhbGl6ZWQuICovCi0gICAgaWYoIVFRX0VtcHR5KCZwRGV2aWNlLT5SeFBhY2tldFJlY2VpdmVkUS5Db250YWluZXIpKQotICAgIHsKLQkvKiBJbmRpY2F0ZSByZWNlaXZlIHBhY2tldHMuICovCi0JTU1fSW5kaWNhdGVSeFBhY2tldHMocERldmljZSk7Ci0JLyogICAgICAgTE1fUXVldWVSeFBhY2tldHMocERldmljZSk7ICovCi0gICAgfQotCi0gICAgLyogTm8gc3BpbmxvY2sgZm9yIHRoaXMgcXVldWUgc2luY2UgdGhpcyByb3V0aW5lIGlzIHNlcmlhbGl6ZWQuICovCi0gICAgaWYoIVFRX0VtcHR5KCZwRGV2aWNlLT5UeFBhY2tldFhtaXR0ZWRRLkNvbnRhaW5lcikpCi0gICAgewotCU1NX0luZGljYXRlVHhQYWNrZXRzKHBEZXZpY2UpOwotICAgIH0KLQotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLX0gLyogTE1fU2VydmljZUludGVycnVwdHMgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxNX1NUQVRVUwotTE1fTXVsdGljYXN0QWRkKAotUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotUExNX1VJTlQ4IHBNY0FkZHJlc3MpIHsKLSAgICBQTE1fVUlOVDggcEVudHJ5OwotICAgIExNX1VJTlQzMiBqOwotCi0gICAgcEVudHJ5ID0gcERldmljZS0+TWNUYWJsZVswXTsKLSAgICBmb3IoaiA9IDA7IGogPCBwRGV2aWNlLT5NY0VudHJ5Q291bnQ7IGorKykKLSAgICB7Ci0JaWYoSVNfRVRIX0FERFJFU1NfRVFVQUwocEVudHJ5LCBwTWNBZGRyZXNzKSkKLQl7Ci0JICAgIC8qIEZvdW5kIGEgbWF0Y2gsIGluY3JlbWVudCB0aGUgaW5zdGFuY2UgY291bnQuICovCi0JICAgIHBFbnRyeVtMTV9NQ19JTlNUQU5DRV9DT1VOVF9JTkRFWF0gKz0gMTsKLQotCSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJaWYgKFNlcnZpY2VQaHlJbnQgPT0gVFJVRSkgeworCQlMTV9TZXR1cFBoeSAocERldmljZSk7CiAJfQogCi0JcEVudHJ5ICs9IExNX01DX0VOVFJZX1NJWkU7Ci0gICAgfQorCS8qIFNlcnZpY2UgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgaW50ZXJydXB0cy4gKi8KKwlMTV9TZXJ2aWNlUnhJbnRlcnJ1cHQgKHBEZXZpY2UpOworCUxNX1NlcnZpY2VUeEludGVycnVwdCAocERldmljZSk7CiAKLSAgICBpZihwRGV2aWNlLT5NY0VudHJ5Q291bnQgPj0gTE1fTUFYX01DX1RBQkxFX1NJWkUpCi0gICAgewotCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKLSAgICB9Ci0KLSAgICBwRW50cnkgPSBwRGV2aWNlLT5NY1RhYmxlW3BEZXZpY2UtPk1jRW50cnlDb3VudF07Ci0KLSAgICBDT1BZX0VUSF9BRERSRVNTKHBNY0FkZHJlc3MsIHBFbnRyeSk7Ci0gICAgcEVudHJ5W0xNX01DX0lOU1RBTkNFX0NPVU5UX0lOREVYXSA9IDE7Ci0KLSAgICBwRGV2aWNlLT5NY0VudHJ5Q291bnQrKzsKLQotICAgIExNX1NldFJlY2VpdmVNYXNrKHBEZXZpY2UsIHBEZXZpY2UtPlJlY2VpdmVNYXNrIHwgTE1fQUNDRVBUX01VTFRJQ0FTVCk7Ci0KLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Ci19IC8qIExNX011bHRpY2FzdEFkZCAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fU1RBVFVTCi1MTV9NdWx0aWNhc3REZWwoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi1QTE1fVUlOVDggcE1jQWRkcmVzcykgewotICAgIFBMTV9VSU5UOCBwRW50cnk7Ci0gICAgTE1fVUlOVDMyIGo7Ci0KLSAgICBwRW50cnkgPSBwRGV2aWNlLT5NY1RhYmxlWzBdOwotICAgIGZvcihqID0gMDsgaiA8IHBEZXZpY2UtPk1jRW50cnlDb3VudDsgaisrKQotICAgIHsKLQlpZihJU19FVEhfQUREUkVTU19FUVVBTChwRW50cnksIHBNY0FkZHJlc3MpKQotCXsKLQkgICAgLyogRm91bmQgYSBtYXRjaCwgZGVjcmVtZW50IHRoZSBpbnN0YW5jZSBjb3VudC4gKi8KLQkgICAgcEVudHJ5W0xNX01DX0lOU1RBTkNFX0NPVU5UX0lOREVYXSAtPSAxOwotCi0JICAgIC8qIE5vIG1vcmUgaW5zdGFuY2UgbGVmdCwgcmVtb3ZlIHRoZSBhZGRyZXNzIGZyb20gdGhlIHRhYmxlLiAqLwotCSAgICAvKiBNb3ZlIHRoZSBsYXN0IGVudHJ5IGluIHRoZSB0YWJsZSB0byB0aGUgZGVsZXRlIHNsb3QuICovCi0JICAgIGlmKHBFbnRyeVtMTV9NQ19JTlNUQU5DRV9DT1VOVF9JTkRFWF0gPT0gMCAmJgotCQlwRGV2aWNlLT5NY0VudHJ5Q291bnQgPiAxKQotCSAgICB7Ci0KLQkJQ09QWV9FVEhfQUREUkVTUygKLQkJICAgIHBEZXZpY2UtPk1jVGFibGVbcERldmljZS0+TWNFbnRyeUNvdW50LTFdLCBwRW50cnkpOwotCQlwRW50cnlbTE1fTUNfSU5TVEFOQ0VfQ09VTlRfSU5ERVhdID0KLQkJICAgIHBEZXZpY2UtPk1jVGFibGVbcERldmljZS0+TWNFbnRyeUNvdW50LTFdCi0JCSAgICBbTE1fTUNfSU5TVEFOQ0VfQ09VTlRfSU5ERVhdOwotCSAgICB9Ci0JICAgIHBEZXZpY2UtPk1jRW50cnlDb3VudC0tOwotCi0JICAgIC8qIFVwZGF0ZSB0aGUgcmVjZWl2ZSBtYXNrIGlmIHRoZSB0YWJsZSBpcyBlbXB0eS4gKi8KLQkgICAgaWYocERldmljZS0+TWNFbnRyeUNvdW50ID09IDApCi0JICAgIHsKLQkJTE1fU2V0UmVjZWl2ZU1hc2socERldmljZSwKLQkJICAgIHBEZXZpY2UtPlJlY2VpdmVNYXNrICYgfkxNX0FDQ0VQVF9NVUxUSUNBU1QpOwotCSAgICB9Ci0KLQkgICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCS8qIE5vIHNwaW5sb2NrIGZvciB0aGlzIHF1ZXVlIHNpbmNlIHRoaXMgcm91dGluZSBpcyBzZXJpYWxpemVkLiAqLworCWlmICghUVFfRW1wdHkgKCZwRGV2aWNlLT5SeFBhY2tldFJlY2VpdmVkUS5Db250YWluZXIpKSB7CisJCS8qIEluZGljYXRlIHJlY2VpdmUgcGFja2V0cy4gKi8KKwkJTU1fSW5kaWNhdGVSeFBhY2tldHMgKHBEZXZpY2UpOworCQkvKiAgICAgICBMTV9RdWV1ZVJ4UGFja2V0cyhwRGV2aWNlKTsgKi8KIAl9CiAKLQlwRW50cnkgKz0gTE1fTUNfRU5UUllfU0laRTsKLSAgICB9CisJLyogTm8gc3BpbmxvY2sgZm9yIHRoaXMgcXVldWUgc2luY2UgdGhpcyByb3V0aW5lIGlzIHNlcmlhbGl6ZWQuICovCisJaWYgKCFRUV9FbXB0eSAoJnBEZXZpY2UtPlR4UGFja2V0WG1pdHRlZFEuQ29udGFpbmVyKSkgeworCQlNTV9JbmRpY2F0ZVR4UGFja2V0cyAocERldmljZSk7CisJfQogCi0gICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotfSAvKiBMTV9NdWx0aWNhc3REZWwgKi8KLQorCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30JCQkJLyogTE1fU2VydmljZUludGVycnVwdHMgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MTV9TVEFUVVMKLUxNX011bHRpY2FzdENsZWFyKAotUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKSB7Ci0gICAgcERldmljZS0+TWNFbnRyeUNvdW50ID0gMDsKLQotICAgIExNX1NldFJlY2VpdmVNYXNrKHBEZXZpY2UsIHBEZXZpY2UtPlJlY2VpdmVNYXNrICYgfkxNX0FDQ0VQVF9NVUxUSUNBU1QpOwotCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotfSAvKiBMTV9NdWx0aWNhc3RDbGVhciAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fU1RBVFVTCi1MTV9TZXRNYWNBZGRyZXNzKAotICAgIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLSAgICBQTE1fVUlOVDggcE1hY0FkZHJlc3MpCitMTV9TVEFUVVMgTE1fTXVsdGljYXN0QWRkIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIFBMTV9VSU5UOCBwTWNBZGRyZXNzKQogewotICAgIExNX1VJTlQzMiBqOworCVBMTV9VSU5UOCBwRW50cnk7CisJTE1fVUlOVDMyIGo7CiAKLSAgICBmb3IoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgewotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1hY0FkZHJbal0uSGlnaCwKLQkgICAgKHBNYWNBZGRyZXNzWzBdIDw8IDgpIHwgcE1hY0FkZHJlc3NbMV0pOwotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1hY0FkZHJbal0uTG93LAotCSAgICAocE1hY0FkZHJlc3NbMl0gPDwgMjQpIHwgKHBNYWNBZGRyZXNzWzNdIDw8IDE2KSB8Ci0JICAgIChwTWFjQWRkcmVzc1s0XSA8PCA4KSB8IHBNYWNBZGRyZXNzWzVdKTsKLSAgICB9CisJcEVudHJ5ID0gcERldmljZS0+TWNUYWJsZVswXTsKKwlmb3IgKGogPSAwOyBqIDwgcERldmljZS0+TWNFbnRyeUNvdW50OyBqKyspIHsKKwkJaWYgKElTX0VUSF9BRERSRVNTX0VRVUFMIChwRW50cnksIHBNY0FkZHJlc3MpKSB7CisJCQkvKiBGb3VuZCBhIG1hdGNoLCBpbmNyZW1lbnQgdGhlIGluc3RhbmNlIGNvdW50LiAqLworCQkJcEVudHJ5W0xNX01DX0lOU1RBTkNFX0NPVU5UX0lOREVYXSArPSAxOwogCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCQkJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCQl9CisKKwkJcEVudHJ5ICs9IExNX01DX0VOVFJZX1NJWkU7CisJfQorCisJaWYgKHBEZXZpY2UtPk1jRW50cnlDb3VudCA+PSBMTV9NQVhfTUNfVEFCTEVfU0laRSkgeworCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJcEVudHJ5ID0gcERldmljZS0+TWNUYWJsZVtwRGV2aWNlLT5NY0VudHJ5Q291bnRdOworCisJQ09QWV9FVEhfQUREUkVTUyAocE1jQWRkcmVzcywgcEVudHJ5KTsKKwlwRW50cnlbTE1fTUNfSU5TVEFOQ0VfQ09VTlRfSU5ERVhdID0gMTsKKworCXBEZXZpY2UtPk1jRW50cnlDb3VudCsrOworCisJTE1fU2V0UmVjZWl2ZU1hc2sgKHBEZXZpY2UsIHBEZXZpY2UtPlJlY2VpdmVNYXNrIHwgTE1fQUNDRVBUX01VTFRJQ0FTVCk7CisKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9CQkJCS8qIExNX011bHRpY2FzdEFkZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xNX1NUQVRVUyBMTV9NdWx0aWNhc3REZWwgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1VJTlQ4IHBNY0FkZHJlc3MpCit7CisJUExNX1VJTlQ4IHBFbnRyeTsKKwlMTV9VSU5UMzIgajsKKworCXBFbnRyeSA9IHBEZXZpY2UtPk1jVGFibGVbMF07CisJZm9yIChqID0gMDsgaiA8IHBEZXZpY2UtPk1jRW50cnlDb3VudDsgaisrKSB7CisJCWlmIChJU19FVEhfQUREUkVTU19FUVVBTCAocEVudHJ5LCBwTWNBZGRyZXNzKSkgeworCQkJLyogRm91bmQgYSBtYXRjaCwgZGVjcmVtZW50IHRoZSBpbnN0YW5jZSBjb3VudC4gKi8KKwkJCXBFbnRyeVtMTV9NQ19JTlNUQU5DRV9DT1VOVF9JTkRFWF0gLT0gMTsKKworCQkJLyogTm8gbW9yZSBpbnN0YW5jZSBsZWZ0LCByZW1vdmUgdGhlIGFkZHJlc3MgZnJvbSB0aGUgdGFibGUuICovCisJCQkvKiBNb3ZlIHRoZSBsYXN0IGVudHJ5IGluIHRoZSB0YWJsZSB0byB0aGUgZGVsZXRlIHNsb3QuICovCisJCQlpZiAocEVudHJ5W0xNX01DX0lOU1RBTkNFX0NPVU5UX0lOREVYXSA9PSAwICYmCisJCQkgICAgcERldmljZS0+TWNFbnRyeUNvdW50ID4gMSkgeworCisJCQkJQ09QWV9FVEhfQUREUkVTUyAocERldmljZS0+CisJCQkJCQkgIE1jVGFibGVbcERldmljZS0+CisJCQkJCQkJICBNY0VudHJ5Q291bnQgLSAxXSwKKwkJCQkJCSAgcEVudHJ5KTsKKwkJCQlwRW50cnlbTE1fTUNfSU5TVEFOQ0VfQ09VTlRfSU5ERVhdID0KKwkJCQkgICAgcERldmljZS0+TWNUYWJsZVtwRGV2aWNlLT5NY0VudHJ5Q291bnQgLSAxXQorCQkJCSAgICBbTE1fTUNfSU5TVEFOQ0VfQ09VTlRfSU5ERVhdOworCQkJfQorCQkJcERldmljZS0+TWNFbnRyeUNvdW50LS07CisKKwkJCS8qIFVwZGF0ZSB0aGUgcmVjZWl2ZSBtYXNrIGlmIHRoZSB0YWJsZSBpcyBlbXB0eS4gKi8KKwkJCWlmIChwRGV2aWNlLT5NY0VudHJ5Q291bnQgPT0gMCkgeworCQkJCUxNX1NldFJlY2VpdmVNYXNrIChwRGV2aWNlLAorCQkJCQkJICAgcERldmljZS0+CisJCQkJCQkgICBSZWNlaXZlTWFzayAmCisJCQkJCQkgICB+TE1fQUNDRVBUX01VTFRJQ0FTVCk7CisJCQl9CisKKwkJCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwkJfQorCisJCXBFbnRyeSArPSBMTV9NQ19FTlRSWV9TSVpFOworCX0KKworCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKK30JCQkJLyogTE1fTXVsdGljYXN0RGVsICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE1fU1RBVFVTIExNX011bHRpY2FzdENsZWFyIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCit7CisJcERldmljZS0+TWNFbnRyeUNvdW50ID0gMDsKKworCUxNX1NldFJlY2VpdmVNYXNrIChwRGV2aWNlLAorCQkJICAgcERldmljZS0+UmVjZWl2ZU1hc2sgJiB+TE1fQUNDRVBUX01VTFRJQ0FTVCk7CisKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7Cit9CQkJCS8qIExNX011bHRpY2FzdENsZWFyICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE1fU1RBVFVTIExNX1NldE1hY0FkZHJlc3MgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgUExNX1VJTlQ4IHBNYWNBZGRyZXNzKQoreworCUxNX1VJTlQzMiBqOworCisJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTWFjQWRkcltqXS5IaWdoLAorCQkJKHBNYWNBZGRyZXNzWzBdIDw8IDgpIHwgcE1hY0FkZHJlc3NbMV0pOworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTWFjQWRkcltqXS5Mb3csCisJCQkocE1hY0FkZHJlc3NbMl0gPDwgMjQpIHwgKHBNYWNBZGRyZXNzWzNdIDw8IDE2KSB8CisJCQkocE1hY0FkZHJlc3NbNF0gPDwgOCkgfCBwTWFjQWRkcmVzc1s1XSk7CisJfQorCisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgU2V0cyB1cCB0aGUgZGVmYXVsdCBsaW5lIHNwZWVkLCBhbmQgZHVwbGV4IG1vZGVzIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgKi8KQEAgLTQxODIsOTMgKzM4NTgsOTMgQEAKIC8qICAgIE5vbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIExNX1NUQVRVUwotTE1fVHJhbnNsYXRlUmVxdWVzdGVkTWVkaWFUeXBlKAotTE1fUkVRVUVTVEVEX01FRElBX1RZUEUgUmVxdWVzdGVkTWVkaWFUeXBlLAotUExNX01FRElBX1RZUEUgcE1lZGlhVHlwZSwKLVBMTV9MSU5FX1NQRUVEIHBMaW5lU3BlZWQsCi1QTE1fRFVQTEVYX01PREUgcER1cGxleE1vZGUpIHsKLSAgICAqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfQVVUTzsKLSAgICAqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfVU5LTk9XTjsKLSAgICAqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9VTktOT1dOOworTE1fVHJhbnNsYXRlUmVxdWVzdGVkTWVkaWFUeXBlIChMTV9SRVFVRVNURURfTUVESUFfVFlQRSBSZXF1ZXN0ZWRNZWRpYVR5cGUsCisJCQkJUExNX01FRElBX1RZUEUgcE1lZGlhVHlwZSwKKwkJCQlQTE1fTElORV9TUEVFRCBwTGluZVNwZWVkLAorCQkJCVBMTV9EVVBMRVhfTU9ERSBwRHVwbGV4TW9kZSkKK3sKKwkqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfQVVUTzsKKwkqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfVU5LTk9XTjsKKwkqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9VTktOT1dOOwogCi0gICAgLyogZGV0ZXJtaW5lIG1lZGlhIHR5cGUgKi8KLSAgICBzd2l0Y2goUmVxdWVzdGVkTWVkaWFUeXBlKSB7CisJLyogZGV0ZXJtaW5lIG1lZGlhIHR5cGUgKi8KKwlzd2l0Y2ggKFJlcXVlc3RlZE1lZGlhVHlwZSkgewogCWNhc2UgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfQk5DOgotCSAgICAqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfQk5DOwotCSAgICAqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTBNQlBTOwotCSAgICAqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9IQUxGOwotCSAgICBicmVhazsKKwkJKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX0JOQzsKKwkJKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwTUJQUzsKKwkJKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfSEFMRjsKKwkJYnJlYWs7CiAKIAljYXNlIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF9BVVRPOgotCSAgICAqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfVVRQOwotCSAgICBicmVhazsKKwkJKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX1VUUDsKKwkJYnJlYWs7CiAKIAljYXNlIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xME1CUFM6Ci0JICAgICpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9VVFA7Ci0JICAgICpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xME1CUFM7Ci0JICAgICpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7Ci0JICAgIGJyZWFrOworCQkqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfVVRQOworCQkqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTBNQlBTOworCQkqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9IQUxGOworCQlicmVhazsKIAogCWNhc2UgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwTUJQU19GVUxMX0RVUExFWDoKLQkgICAgKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX1VUUDsKLQkgICAgKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwTUJQUzsKLQkgICAgKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfRlVMTDsKLQkgICAgYnJlYWs7CisJCSpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9VVFA7CisJCSpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xME1CUFM7CisJCSpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0ZVTEw7CisJCWJyZWFrOwogCiAJY2FzZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTAwTUJQUzoKLQkgICAgKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX1VUUDsKLQkgICAgKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwME1CUFM7Ci0JICAgICpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7Ci0JICAgIGJyZWFrOworCQkqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfVVRQOworCQkqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwTUJQUzsKKwkJKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfSEFMRjsKKwkJYnJlYWs7CiAKIAljYXNlIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xMDBNQlBTX0ZVTExfRFVQTEVYOgotCSAgICAqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfVVRQOwotCSAgICAqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwTUJQUzsKLQkgICAgKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfRlVMTDsKLQkgICAgYnJlYWs7CisJCSpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9VVFA7CisJCSpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDBNQlBTOworCQkqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOworCQlicmVhazsKIAogCWNhc2UgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQXzEwMDBNQlBTOgotCSAgICAqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfVVRQOwotCSAgICAqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwME1CUFM7Ci0JICAgICpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7Ci0JICAgIGJyZWFrOworCQkqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfVVRQOworCQkqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwME1CUFM7CisJCSpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7CisJCWJyZWFrOwogCiAJY2FzZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTAwME1CUFNfRlVMTF9EVVBMRVg6Ci0JICAgICpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9VVFA7Ci0JICAgICpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDAwTUJQUzsKLQkgICAgKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfRlVMTDsKLQkgICAgYnJlYWs7CisJCSpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9VVFA7CisJCSpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDAwTUJQUzsKKwkJKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfRlVMTDsKKwkJYnJlYWs7CiAKIAljYXNlIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0ZJQkVSXzEwME1CUFM6Ci0JICAgICpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9GSUJFUjsKLQkgICAgKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwME1CUFM7Ci0JICAgICpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7Ci0JICAgIGJyZWFrOworCQkqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfRklCRVI7CisJCSpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDBNQlBTOworCQkqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9IQUxGOworCQlicmVhazsKIAogCWNhc2UgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfRklCRVJfMTAwTUJQU19GVUxMX0RVUExFWDoKLQkgICAgKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX0ZJQkVSOwotCSAgICAqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwTUJQUzsKLQkgICAgKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfRlVMTDsKLQkgICAgYnJlYWs7CisJCSpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9GSUJFUjsKKwkJKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwME1CUFM7CisJCSpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0ZVTEw7CisJCWJyZWFrOwogCiAJY2FzZSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9GSUJFUl8xMDAwTUJQUzoKLQkgICAgKnBNZWRpYVR5cGUgPSBMTV9NRURJQV9UWVBFX0ZJQkVSOwotCSAgICAqcExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwME1CUFM7Ci0JICAgICpwRHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX0hBTEY7Ci0JICAgIGJyZWFrOworCQkqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfRklCRVI7CisJCSpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDAwTUJQUzsKKwkJKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfSEFMRjsKKwkJYnJlYWs7CiAKIAljYXNlIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0ZJQkVSXzEwMDBNQlBTX0ZVTExfRFVQTEVYOgotCSAgICAqcE1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfRklCRVI7Ci0JICAgICpwTGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDAwTUJQUzsKLQkgICAgKnBEdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfRlVMTDsKLQkgICAgYnJlYWs7CisJCSpwTWVkaWFUeXBlID0gTE1fTUVESUFfVFlQRV9GSUJFUjsKKwkJKnBMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTOworCQkqcER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOworCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotICAgIH0gLyogc3dpdGNoICovCisJCWJyZWFrOworCX0JCQkvKiBzd2l0Y2ggKi8KIAotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLX0gLyogTE1fVHJhbnNsYXRlUmVxdWVzdGVkTWVkaWFUeXBlICovCisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQkJCQkvKiBMTV9UcmFuc2xhdGVSZXF1ZXN0ZWRNZWRpYVR5cGUgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00Mjc3LDI4NSArMzk1MywyODQgQEAKIC8qICAgIExNX1NUQVRVU19MSU5LX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBMTV9TVEFUVVNfTElOS19ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBMTV9TVEFUVVMKLUxNX0luaXRCY201NDB4UGh5KAotUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQorc3RhdGljIExNX1NUQVRVUyBMTV9Jbml0QmNtNTQweFBoeSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQogewotICAgIExNX0xJTkVfU1BFRUQgQ3VycmVudExpbmVTcGVlZDsKLSAgICBMTV9EVVBMRVhfTU9ERSBDdXJyZW50RHVwbGV4TW9kZTsKLSAgICBMTV9TVEFUVVMgQ3VycmVudExpbmtTdGF0dXM7Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7Ci0gICAgTE1fVUlOVDMyIGo7CisJTE1fTElORV9TUEVFRCBDdXJyZW50TGluZVNwZWVkOworCUxNX0RVUExFWF9NT0RFIEN1cnJlbnREdXBsZXhNb2RlOworCUxNX1NUQVRVUyBDdXJyZW50TGlua1N0YXR1czsKKwlMTV9VSU5UMzIgVmFsdWUzMjsKKwlMTV9VSU5UMzIgajsKIAotI2lmIDEgIC8qIGptYjogYnVnZml4IC0tIG1vdmVkIGhlcmUsIG91dCBvZiBjb2RlIHRoYXQgc2V0cyBpbml0aWFsIHB3ciBzdGF0ZSAqLwotICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MDFfQVVYX0NUUkwsIDB4Mik7CisjaWYgMQkJCQkvKiBqbWI6IGJ1Z2ZpeCAtLSBtb3ZlZCBoZXJlLCBvdXQgb2YgY29kZSB0aGF0IHNldHMgaW5pdGlhbCBwd3Igc3RhdGUgKi8KKwlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwMV9BVVhfQ1RSTCwgMHgyKTsKICNlbmRpZgotICAgIGlmKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfQkNNNTQwMV9QSFlfSUQpCi0gICAgewotCUxNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKLQlMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisJaWYgKChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfQkNNNTQwMV9QSFlfSUQpIHsKKwkJTE1fUmVhZFBoeSAocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKKwkJTE1fUmVhZFBoeSAocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKIAotCWlmKCFwRGV2aWNlLT5Jbml0RG9uZSkKLQl7Ci0JICAgIFZhbHVlMzIgPSAwOwotCX0KLQotCWlmKCEoVmFsdWUzMiAmIFBIWV9TVEFUVVNfTElOS19QQVNTKSkKLQl7Ci0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MDFfQVVYX0NUUkwsICAweDBjMjApOwotCi0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDAwMTIpOwotCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDE4MDQpOwotCi0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDAwMTMpOwotCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDEyMDQpOwotCi0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDgwMDYpOwotCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDAxMzIpOwotCi0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDgwMDYpOwotCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDAyMzIpOwotCi0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDIwMWYpOwotCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDBhMjApOwotCi0JICAgIExNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKLQkgICAgZm9yKGogPSAwOyBqIDwgMTAwMDsgaisrKQotCSAgICB7Ci0JCU1NX1dhaXQoMTApOwotCi0JCUxNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKLQkJaWYoVmFsdWUzMiAmIFBIWV9TVEFUVVNfTElOS19QQVNTKQotCQl7Ci0JCSAgICBNTV9XYWl0KDQwKTsKLQkJICAgIGJyZWFrOworCQlpZiAoIXBEZXZpY2UtPkluaXREb25lKSB7CisJCQlWYWx1ZTMyID0gMDsKIAkJfQotCSAgICB9CiAKLQkgICAgaWYoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX1JFVl9NQVNLKSA9PSBQSFlfQkNNNTQwMV9CMF9SRVYpCi0JICAgIHsKLQkJaWYoIShWYWx1ZTMyICYgUEhZX1NUQVRVU19MSU5LX1BBU1MpICYmCi0JCSAgICAocERldmljZS0+T2xkTGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTAwME1CUFMpKQotCQl7Ci0JCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsIFBIWV9DVFJMX1BIWV9SRVNFVCk7Ci0JCSAgICBmb3IoaiA9IDA7IGogPCAxMDA7IGorKykKLQkJICAgIHsKLQkJCU1NX1dhaXQoMTApOworCQlpZiAoIShWYWx1ZTMyICYgUEhZX1NUQVRVU19MSU5LX1BBU1MpKSB7CisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwMV9BVVhfQ1RSTCwgMHgwYzIwKTsKIAotCQkJTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsICZWYWx1ZTMyKTsKLQkJCWlmKCEoVmFsdWUzMiAmIFBIWV9DVFJMX1BIWV9SRVNFVCkpCi0JCQl7Ci0JCQkgICAgTU1fV2FpdCg0MCk7Ci0JCQkgICAgYnJlYWs7CisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4MDAxMik7CisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgxODA0KTsKKworCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDAwMTMpOworCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MTIwNCk7CisKKwkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywgMHg4MDA2KTsKKwkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDAxMzIpOworCisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4ODAwNik7CisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgwMjMyKTsKKworCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDIwMWYpOworCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MGEyMCk7CisKKwkJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisJCQlmb3IgKGogPSAwOyBqIDwgMTAwMDsgaisrKSB7CisJCQkJTU1fV2FpdCAoMTApOworCisJCQkJTE1fUmVhZFBoeSAocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKKwkJCQlpZiAoVmFsdWUzMiAmIFBIWV9TVEFUVVNfTElOS19QQVNTKSB7CisJCQkJCU1NX1dhaXQgKDQwKTsKKwkJCQkJYnJlYWs7CisJCQkJfQogCQkJfQotCQkgICAgfQogCi0JCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDAxX0FVWF9DVFJMLCAgMHgwYzIwKTsKKwkJCWlmICgocERldmljZS0+UGh5SWQgJiBQSFlfSURfUkVWX01BU0spID09CisJCQkgICAgUEhZX0JDTTU0MDFfQjBfUkVWKSB7CisJCQkJaWYgKCEoVmFsdWUzMiAmIFBIWV9TVEFUVVNfTElOS19QQVNTKQorCQkJCSAgICAmJiAocERldmljZS0+T2xkTGluZVNwZWVkID09CisJCQkJCUxNX0xJTkVfU1BFRURfMTAwME1CUFMpKSB7CisJCQkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsCisJCQkJCQkgICAgIFBIWV9DVFJMX1BIWV9SRVNFVCk7CisJCQkJCWZvciAoaiA9IDA7IGogPCAxMDA7IGorKykgeworCQkJCQkJTU1fV2FpdCAoMTApOwogCi0JCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywgMHgwMDEyKTsKLQkJICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MTgwNCk7CisJCQkJCQlMTV9SZWFkUGh5IChwRGV2aWNlLAorCQkJCQkJCSAgICBQSFlfQ1RSTF9SRUcsCisJCQkJCQkJICAgICZWYWx1ZTMyKTsKKwkJCQkJCWlmICghCisJCQkJCQkgICAgKFZhbHVlMzIgJgorCQkJCQkJICAgICBQSFlfQ1RSTF9QSFlfUkVTRVQpKSB7CisJCQkJCQkJTU1fV2FpdCAoNDApOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CiAKLQkJICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDAwMTMpOwotCQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgxMjA0KTsKKwkJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MDFfQVVYX0NUUkwsCisJCQkJCQkgICAgIDB4MGMyMCk7CiAKLQkJICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLCAweDgwMDYpOwotCQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfUldfUE9SVCwgMHgwMTMyKTsKKwkJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsCisJCQkJCQkgICAgIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLAorCQkJCQkJICAgICAweDAwMTIpOworCQkJCQlMTV9Xcml0ZVBoeSAocERldmljZSwKKwkJCQkJCSAgICAgQkNNNTQwWF9EU1BfUldfUE9SVCwKKwkJCQkJCSAgICAgMHgxODA0KTsKIAotCQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsIDB4ODAwNik7Ci0JCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9SV19QT1JULCAweDAyMzIpOworCQkJCQlMTV9Xcml0ZVBoeSAocERldmljZSwKKwkJCQkJCSAgICAgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsCisJCQkJCQkgICAgIDB4MDAxMyk7CisJCQkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLAorCQkJCQkJICAgICBCQ001NDBYX0RTUF9SV19QT1JULAorCQkJCQkJICAgICAweDEyMDQpOwogCi0JCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywgMHgyMDFmKTsKLQkJICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRFNQX1JXX1BPUlQsIDB4MGEyMCk7CisJCQkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLAorCQkJCQkJICAgICBCQ001NDBYX0RTUF9BRERSRVNTX1JFRywKKwkJCQkJCSAgICAgMHg4MDA2KTsKKwkJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsCisJCQkJCQkgICAgIEJDTTU0MFhfRFNQX1JXX1BPUlQsCisJCQkJCQkgICAgIDB4MDEzMik7CisKKwkJCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsCisJCQkJCQkgICAgIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHLAorCQkJCQkJICAgICAweDgwMDYpOworCQkJCQlMTV9Xcml0ZVBoeSAocERldmljZSwKKwkJCQkJCSAgICAgQkNNNTQwWF9EU1BfUldfUE9SVCwKKwkJCQkJCSAgICAgMHgwMjMyKTsKKworCQkJCQlMTV9Xcml0ZVBoeSAocERldmljZSwKKwkJCQkJCSAgICAgQkNNNTQwWF9EU1BfQUREUkVTU19SRUcsCisJCQkJCQkgICAgIDB4MjAxZik7CisJCQkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLAorCQkJCQkJICAgICBCQ001NDBYX0RTUF9SV19QT1JULAorCQkJCQkJICAgICAweDBhMjApOworCQkJCX0KKwkJCX0KIAkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgICBlbHNlIGlmKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQTAgfHwKLQlwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0IwKQotICAgIHsKLQkvKiBCdWc6IDU3MDEgQTAsIEIwIFRYIENSQyB3b3JrYXJvdW5kLiAqLwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTUsIDB4MGE3NSk7Ci0JTE1fV3JpdGVQaHkocERldmljZSwgMHgxYywgMHg4YzY4KTsKLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDFjLCAweDhkNjgpOwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MWMsIDB4OGM2OCk7Ci0gICAgfQotCi0gICAgLyogQWNrbm93bGVkZ2UgaW50ZXJydXB0cy4gKi8KLSAgICBMTV9SZWFkUGh5KHBEZXZpY2UsIEJDTTU0MFhfSU5UX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKLSAgICBMTV9SZWFkUGh5KHBEZXZpY2UsIEJDTTU0MFhfSU5UX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKLQotICAgIC8qIENvbmZpZ3VyZSB0aGUgaW50ZXJydXB0IG1hc2suICovCi0gICAgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUKQotICAgIHsKLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0lOVF9NQVNLX1JFRywgfkJDTTU0MFhfSU5UX0xJTktfQ0hBTkdFKTsKLSAgICB9Ci0KLSAgICAvKiBDb25maWd1cmUgUEhZIGxlZCBtb2RlLiAqLwotICAgIGlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSB8fAotCShUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApKQotICAgIHsKLQlpZihwRGV2aWNlLT5MZWRNb2RlID09IExFRF9NT0RFX1RIUkVFX0xJTkspCi0JewotCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYX0VYVF9DVFJMX1JFRywKLQkJQkNNNTQwWF9FWFRfQ1RSTF9MSU5LM19MRURfTU9ERSk7Ci0JfQotCWVsc2UKLQl7Ci0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfRVhUX0NUUkxfUkVHLCAwKTsKLQl9Ci0gICAgfQotCi0gICAgQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19ET1dOOwotCi0gICAgLyogR2V0IGN1cnJlbnQgbGluayBhbmQgZHVwbGV4IG1vZGUuICovCi0gICAgZm9yKGogPSAwOyBqIDwgMTAwOyBqKyspCi0gICAgewotCUxNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKLQlMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7Ci0KLQlpZihWYWx1ZTMyICYgUEhZX1NUQVRVU19MSU5LX1BBU1MpCi0JewotCSAgICBicmVhazsKLQl9Ci0JTU1fV2FpdCg0MCk7Ci0gICAgfQotCi0gICAgaWYoVmFsdWUzMiAmIFBIWV9TVEFUVVNfTElOS19QQVNTKQotICAgIHsKLQotCS8qIERldGVybWluZSB0aGUgY3VycmVudCBsaW5lIGFuZCBkdXBsZXggc2V0dGluZ3MuICovCi0JTE1fUmVhZFBoeShwRGV2aWNlLCBCQ001NDBYX0FVWF9TVEFUVVNfUkVHLCAmVmFsdWUzMik7Ci0JZm9yKGogPSAwOyBqIDwgMjAwMDsgaisrKQotCXsKLQkgICAgTU1fV2FpdCgxMCk7Ci0KLQkgICAgTE1fUmVhZFBoeShwRGV2aWNlLCBCQ001NDBYX0FVWF9TVEFUVVNfUkVHLCAmVmFsdWUzMik7Ci0JICAgIGlmKFZhbHVlMzIpCi0JICAgIHsKLQkJYnJlYWs7Ci0JICAgIH0KKwl9IGVsc2UgaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQTAgfHwKKwkJICAgcERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwMV9CMCkgeworCQkvKiBCdWc6IDU3MDEgQTAsIEIwIFRYIENSQyB3b3JrYXJvdW5kLiAqLworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgMHgxNSwgMHgwYTc1KTsKKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MWMsIDB4OGM2OCk7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCAweDFjLCAweDhkNjgpOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgMHgxYywgMHg4YzY4KTsKIAl9CiAKLQlzd2l0Y2goVmFsdWUzMiAmIEJDTTU0MFhfQVVYX1NQRUVEX01BU0spCi0JewotCSAgICBjYXNlIEJDTTU0MFhfQVVYXzEwQkFTRVRfSEQ6Ci0JCUN1cnJlbnRMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwTUJQUzsKLQkJQ3VycmVudER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9IQUxGOwotCQlicmVhazsKKwkvKiBBY2tub3dsZWRnZSBpbnRlcnJ1cHRzLiAqLworCUxNX1JlYWRQaHkgKHBEZXZpY2UsIEJDTTU0MFhfSU5UX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKKwlMTV9SZWFkUGh5IChwRGV2aWNlLCBCQ001NDBYX0lOVF9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CiAKLQkgICAgY2FzZSBCQ001NDBYX0FVWF8xMEJBU0VUX0ZEOgotCQlDdXJyZW50TGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xME1CUFM7Ci0JCUN1cnJlbnREdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfRlVMTDsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBCQ001NDBYX0FVWF8xMDBCQVNFVFhfSEQ6Ci0JCUN1cnJlbnRMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwME1CUFM7Ci0JCUN1cnJlbnREdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfSEFMRjsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBCQ001NDBYX0FVWF8xMDBCQVNFVFhfRkQ6Ci0JCUN1cnJlbnRMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwME1CUFM7Ci0JCUN1cnJlbnREdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfRlVMTDsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBCQ001NDBYX0FVWF8xMDBCQVNFVF9IRDoKLQkJQ3VycmVudExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwME1CUFM7Ci0JCUN1cnJlbnREdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfSEFMRjsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBCQ001NDBYX0FVWF8xMDBCQVNFVF9GRDoKLQkJQ3VycmVudExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwME1CUFM7Ci0JCUN1cnJlbnREdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfRlVMTDsKLQkJYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQotCQlDdXJyZW50TGluZVNwZWVkID0gTE1fTElORV9TUEVFRF9VTktOT1dOOwotCQlDdXJyZW50RHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX1VOS05PV047Ci0JCWJyZWFrOworCS8qIENvbmZpZ3VyZSB0aGUgaW50ZXJydXB0IG1hc2suICovCisJaWYgKHBEZXZpY2UtPlBoeUludE1vZGUgPT0gVDNfUEhZX0lOVF9NT0RFX01JX0lOVEVSUlVQVCkgeworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF9JTlRfTUFTS19SRUcsCisJCQkgICAgIH5CQ001NDBYX0lOVF9MSU5LX0NIQU5HRSk7CiAJfQogCi0JLyogTWFrZSBzdXJlIHdlIGFyZSBpbiBhdXRvLW5lZyBtb2RlLiAqLwotCWZvciAoaiA9IDA7IGogPCAyMDA7IGorKykKLQl7Ci0JICAgIExNX1JlYWRQaHkocERldmljZSwgUEhZX0NUUkxfUkVHLCAmVmFsdWUzMik7Ci0JICAgIGlmKFZhbHVlMzIgJiYgVmFsdWUzMiAhPSAweDdmZmYpCi0JICAgIHsKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgICBpZihWYWx1ZTMyID09IDAgJiYgcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID09Ci0JCUxNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xME1CUFMpCi0JICAgIHsKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgICBNTV9XYWl0KDEwKTsKLQl9Ci0KLQkvKiBVc2UgdGhlIGN1cnJlbnQgbGluZSBzZXR0aW5ncyBmb3IgImF1dG8iIG1vZGUuICovCi0JaWYocERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID09IExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0FVVE8gfHwKLQkgICAgcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID09IExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF9BVVRPKQotCXsKLQkgICAgaWYoVmFsdWUzMiAmIFBIWV9DVFJMX0FVVE9fTkVHX0VOQUJMRSkKLQkgICAgewotCQlDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0FDVElWRTsKLQotCQkvKiBXZSBtYXkgYmUgZXhpdGluZyBsb3cgcG93ZXIgbW9kZSBhbmQgdGhlIGxpbmsgaXMgaW4gKi8KLQkJLyogMTBtYi4gIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byByZXN0YXJ0IGF1dG9uZWcuICovCi0JCUxNX1JlYWRQaHkocERldmljZSwgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcsICZWYWx1ZTMyKTsKLQkJcERldmljZS0+YWR2ZXJ0aXNpbmcxMDAwID0gVmFsdWUzMjsKLQkJLyogNTcwMkZFIHN1cHBvcnRzIDEwLzEwME1iIG9ubHkuICovCi0JCWlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0gVDNfQVNJQ19SRVZfNTcwMyB8fAotCQkgICAgcERldmljZS0+Qm9uZElkICE9IEdSQ19NSVNDX0JEX0lEXzU3MDJGRSkKLQkJewotCQkgICAgaWYoIShWYWx1ZTMyICYgKEJDTTU0MFhfQU5fQURfMTAwMEJBU0VUX0hBTEYgfAotCQkJQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfRlVMTCkpKQotCQkgICAgewotCQkJQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19TRVRUSU5HX01JU01BVENIOwotCQkgICAgfQorCS8qIENvbmZpZ3VyZSBQSFkgbGVkIG1vZGUuICovCisJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEgfHwKKwkgICAgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDApKSB7CisJCWlmIChwRGV2aWNlLT5MZWRNb2RlID09IExFRF9NT0RFX1RIUkVFX0xJTkspIHsKKwkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDBYX0VYVF9DVFJMX1JFRywKKwkJCQkgICAgIEJDTTU0MFhfRVhUX0NUUkxfTElOSzNfTEVEX01PREUpOworCQl9IGVsc2UgeworCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MFhfRVhUX0NUUkxfUkVHLCAwKTsKIAkJfQotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQlDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX1NFVFRJTkdfTUlTTUFUQ0g7Ci0JICAgIH0KLQl9Ci0JZWxzZQotCXsKLQkgICAgLyogRm9yY2UgbGluZSBzZXR0aW5ncy4gKi8KLQkgICAgLyogVXNlIHRoZSBjdXJyZW50IHNldHRpbmcgaWYgaXQgbWF0Y2hlcyB0aGUgdXNlcidzIHJlcXVlc3RlZCAqLwotCSAgICAvKiBzZXR0aW5nLiAqLwotCSAgICBMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgJlZhbHVlMzIpOwotCSAgICBpZigocERldmljZS0+TGluZVNwZWVkID09IEN1cnJlbnRMaW5lU3BlZWQpICYmCi0JCShwRGV2aWNlLT5EdXBsZXhNb2RlID09IEN1cnJlbnREdXBsZXhNb2RlKSkKLQkgICAgewotCQlpZiAoKHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnICYmCi0JCSAgICAhKFZhbHVlMzIgJiBQSFlfQ1RSTF9BVVRPX05FR19FTkFCTEUpKSB8fAotCQkgICAgKCFwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyAmJgotCQkgICAgKFZhbHVlMzIgJiBQSFlfQ1RSTF9BVVRPX05FR19FTkFCTEUpKSkKLQkJewotCQkgICAgQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19BQ1RJVkU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCSAgICBDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX1NFVFRJTkdfTUlTTUFUQ0g7Ci0JCX0KLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19TRVRUSU5HX01JU01BVENIOwotCSAgICB9CiAJfQogCi0JLyogU2F2ZSBsaW5lIHNldHRpbmdzLiAqLwotCXBEZXZpY2UtPkxpbmVTcGVlZCA9IEN1cnJlbnRMaW5lU3BlZWQ7Ci0JcERldmljZS0+RHVwbGV4TW9kZSA9IEN1cnJlbnREdXBsZXhNb2RlOwotCXBEZXZpY2UtPk1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfVVRQOwotICAgIH0KKwlDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0RPV047CiAKLSAgICByZXR1cm4gQ3VycmVudExpbmtTdGF0dXM7Ci19IC8qIExNX0luaXRCY201NDB4UGh5ICovCisJLyogR2V0IGN1cnJlbnQgbGluayBhbmQgZHVwbGV4IG1vZGUuICovCisJZm9yIChqID0gMDsgaiA8IDEwMDsgaisrKSB7CisJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisKKwkJaWYgKFZhbHVlMzIgJiBQSFlfU1RBVFVTX0xJTktfUEFTUykgeworCQkJYnJlYWs7CisJCX0KKwkJTU1fV2FpdCAoNDApOworCX0KKworCWlmIChWYWx1ZTMyICYgUEhZX1NUQVRVU19MSU5LX1BBU1MpIHsKKworCQkvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgbGluZSBhbmQgZHVwbGV4IHNldHRpbmdzLiAqLworCQlMTV9SZWFkUGh5IChwRGV2aWNlLCBCQ001NDBYX0FVWF9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisJCWZvciAoaiA9IDA7IGogPCAyMDAwOyBqKyspIHsKKwkJCU1NX1dhaXQgKDEwKTsKKworCQkJTE1fUmVhZFBoeSAocERldmljZSwgQkNNNTQwWF9BVVhfU1RBVFVTX1JFRywgJlZhbHVlMzIpOworCQkJaWYgKFZhbHVlMzIpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXN3aXRjaCAoVmFsdWUzMiAmIEJDTTU0MFhfQVVYX1NQRUVEX01BU0spIHsKKwkJY2FzZSBCQ001NDBYX0FVWF8xMEJBU0VUX0hEOgorCQkJQ3VycmVudExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTBNQlBTOworCQkJQ3VycmVudER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9IQUxGOworCQkJYnJlYWs7CisKKwkJY2FzZSBCQ001NDBYX0FVWF8xMEJBU0VUX0ZEOgorCQkJQ3VycmVudExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTBNQlBTOworCQkJQ3VycmVudER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOworCQkJYnJlYWs7CisKKwkJY2FzZSBCQ001NDBYX0FVWF8xMDBCQVNFVFhfSEQ6CisJCQlDdXJyZW50TGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDBNQlBTOworCQkJQ3VycmVudER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9IQUxGOworCQkJYnJlYWs7CisKKwkJY2FzZSBCQ001NDBYX0FVWF8xMDBCQVNFVFhfRkQ6CisJCQlDdXJyZW50TGluZVNwZWVkID0gTE1fTElORV9TUEVFRF8xMDBNQlBTOworCQkJQ3VycmVudER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOworCQkJYnJlYWs7CisKKwkJY2FzZSBCQ001NDBYX0FVWF8xMDBCQVNFVF9IRDoKKwkJCUN1cnJlbnRMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTOworCQkJQ3VycmVudER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9IQUxGOworCQkJYnJlYWs7CisKKwkJY2FzZSBCQ001NDBYX0FVWF8xMDBCQVNFVF9GRDoKKwkJCUN1cnJlbnRMaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTOworCQkJQ3VycmVudER1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKworCQkJQ3VycmVudExpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfVU5LTk9XTjsKKwkJCUN1cnJlbnREdXBsZXhNb2RlID0gTE1fRFVQTEVYX01PREVfVU5LTk9XTjsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTWFrZSBzdXJlIHdlIGFyZSBpbiBhdXRvLW5lZyBtb2RlLiAqLworCQlmb3IgKGogPSAwOyBqIDwgMjAwOyBqKyspIHsKKwkJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgJlZhbHVlMzIpOworCQkJaWYgKFZhbHVlMzIgJiYgVmFsdWUzMiAhPSAweDdmZmYpIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKFZhbHVlMzIgPT0gMCAmJiBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0KKwkJCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTBNQlBTKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCU1NX1dhaXQgKDEwKTsKKwkJfQorCisJCS8qIFVzZSB0aGUgY3VycmVudCBsaW5lIHNldHRpbmdzIGZvciAiYXV0byIgbW9kZS4gKi8KKwkJaWYgKHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9PSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9BVVRPCisJCSAgICB8fCBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0KKwkJICAgIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF9BVVRPKSB7CisJCQlpZiAoVmFsdWUzMiAmIFBIWV9DVFJMX0FVVE9fTkVHX0VOQUJMRSkgeworCQkJCUN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfQUNUSVZFOworCisJCQkJLyogV2UgbWF5IGJlIGV4aXRpbmcgbG93IHBvd2VyIG1vZGUgYW5kIHRoZSBsaW5rIGlzIGluICovCisJCQkJLyogMTBtYi4gIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byByZXN0YXJ0IGF1dG9uZWcuICovCisJCQkJTE1fUmVhZFBoeSAocERldmljZSwgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcsCisJCQkJCSAgICAmVmFsdWUzMik7CisJCQkJcERldmljZS0+YWR2ZXJ0aXNpbmcxMDAwID0gVmFsdWUzMjsKKwkJCQkvKiA1NzAyRkUgc3VwcG9ydHMgMTAvMTAwTWIgb25seS4gKi8KKwkJCQlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgIT0KKwkJCQkgICAgVDNfQVNJQ19SRVZfNTcwMworCQkJCSAgICB8fCBwRGV2aWNlLT5Cb25kSWQgIT0KKwkJCQkgICAgR1JDX01JU0NfQkRfSURfNTcwMkZFKSB7CisJCQkJCWlmICghCisJCQkJCSAgICAoVmFsdWUzMiAmCisJCQkJCSAgICAgKEJDTTU0MFhfQU5fQURfMTAwMEJBU0VUX0hBTEYgfAorCQkJCQkgICAgICBCQ001NDBYX0FOX0FEXzEwMDBCQVNFVF9GVUxMKSkpIHsKKwkJCQkJCUN1cnJlbnRMaW5rU3RhdHVzID0KKwkJCQkJCSAgICBMTV9TVEFUVVNfTElOS19TRVRUSU5HX01JU01BVENIOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlDdXJyZW50TGlua1N0YXR1cyA9CisJCQkJICAgIExNX1NUQVRVU19MSU5LX1NFVFRJTkdfTUlTTUFUQ0g7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBGb3JjZSBsaW5lIHNldHRpbmdzLiAqLworCQkJLyogVXNlIHRoZSBjdXJyZW50IHNldHRpbmcgaWYgaXQgbWF0Y2hlcyB0aGUgdXNlcidzIHJlcXVlc3RlZCAqLworCQkJLyogc2V0dGluZy4gKi8KKwkJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgJlZhbHVlMzIpOworCQkJaWYgKChwRGV2aWNlLT5MaW5lU3BlZWQgPT0gQ3VycmVudExpbmVTcGVlZCkgJiYKKwkJCSAgICAocERldmljZS0+RHVwbGV4TW9kZSA9PSBDdXJyZW50RHVwbGV4TW9kZSkpIHsKKwkJCQlpZiAoKHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnICYmCisJCQkJICAgICAhKFZhbHVlMzIgJiBQSFlfQ1RSTF9BVVRPX05FR19FTkFCTEUpKSB8fAorCQkJCSAgICAoIXBEZXZpY2UtPkRpc2FibGVBdXRvTmVnICYmCisJCQkJICAgICAoVmFsdWUzMiAmIFBIWV9DVFJMX0FVVE9fTkVHX0VOQUJMRSkpKSB7CisJCQkJCUN1cnJlbnRMaW5rU3RhdHVzID0KKwkJCQkJICAgIExNX1NUQVRVU19MSU5LX0FDVElWRTsKKwkJCQl9IGVsc2UgeworCQkJCQlDdXJyZW50TGlua1N0YXR1cyA9CisJCQkJCSAgICBMTV9TVEFUVVNfTElOS19TRVRUSU5HX01JU01BVENIOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJQ3VycmVudExpbmtTdGF0dXMgPQorCQkJCSAgICBMTV9TVEFUVVNfTElOS19TRVRUSU5HX01JU01BVENIOworCQkJfQorCQl9CisKKwkJLyogU2F2ZSBsaW5lIHNldHRpbmdzLiAqLworCQlwRGV2aWNlLT5MaW5lU3BlZWQgPSBDdXJyZW50TGluZVNwZWVkOworCQlwRGV2aWNlLT5EdXBsZXhNb2RlID0gQ3VycmVudER1cGxleE1vZGU7CisJCXBEZXZpY2UtPk1lZGlhVHlwZSA9IExNX01FRElBX1RZUEVfVVRQOworCX0KKworCXJldHVybiBDdXJyZW50TGlua1N0YXR1czsKK30JCQkJLyogTE1fSW5pdEJjbTU0MHhQaHkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00NTYzLDEwNjUgKzQyMzgsOTM1IEBACiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIExNX1NUQVRVUwotTE1fU2V0Rmxvd0NvbnRyb2woCi0gICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotICAgIExNX1VJTlQzMiBMb2NhbFBoeUFkLAotICAgIExNX1VJTlQzMiBSZW1vdGVQaHlBZCkKK0xNX1NldEZsb3dDb250cm9sIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisJCSAgIExNX1VJTlQzMiBMb2NhbFBoeUFkLCBMTV9VSU5UMzIgUmVtb3RlUGh5QWQpCiB7Ci0gICAgTE1fRkxPV19DT05UUk9MIEZsb3dDYXA7CisJTE1fRkxPV19DT05UUk9MIEZsb3dDYXA7CiAKLSAgICAvKiBSZXNvbHZlIGZsb3cgY29udHJvbC4gKi8KLSAgICBGbG93Q2FwID0gTE1fRkxPV19DT05UUk9MX05PTkU7CisJLyogUmVzb2x2ZSBmbG93IGNvbnRyb2wuICovCisJRmxvd0NhcCA9IExNX0ZMT1dfQ09OVFJPTF9OT05FOwogCi0gICAgLyogU2VlIFRhYmxlIDI4Qi0zIG9mIDgwMi4zYWItMTk5OSBzcGVjLiAqLwotICAgIGlmKHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwICYgTE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0UpCi0gICAgewotCWlmKExvY2FsUGh5QWQgJiBQSFlfQU5fQURfUEFVU0VfQ0FQQUJMRSkKLQl7Ci0JICAgIGlmKExvY2FsUGh5QWQgJiBQSFlfQU5fQURfQVNZTV9QQVVTRSkKLQkgICAgewotCQlpZihSZW1vdGVQaHlBZCAmIFBIWV9MSU5LX1BBUlRORVJfUEFVU0VfQ0FQQUJMRSkKLQkJewotCQkgICAgRmxvd0NhcCA9IExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSB8Ci0JCQlMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRTsKKwkvKiBTZWUgVGFibGUgMjhCLTMgb2YgODAyLjNhYi0xOTk5IHNwZWMuICovCisJaWYgKHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwICYgTE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0UpIHsKKwkJaWYgKExvY2FsUGh5QWQgJiBQSFlfQU5fQURfUEFVU0VfQ0FQQUJMRSkgeworCQkJaWYgKExvY2FsUGh5QWQgJiBQSFlfQU5fQURfQVNZTV9QQVVTRSkgeworCQkJCWlmIChSZW1vdGVQaHlBZCAmCisJCQkJICAgIFBIWV9MSU5LX1BBUlRORVJfUEFVU0VfQ0FQQUJMRSkgeworCQkJCQlGbG93Q2FwID0KKwkJCQkJICAgIExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSB8CisJCQkJCSAgICBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRTsKKwkJCQl9IGVsc2UgaWYgKFJlbW90ZVBoeUFkICYKKwkJCQkJICAgUEhZX0xJTktfUEFSVE5FUl9BU1lNX1BBVVNFKSB7CisJCQkJCUZsb3dDYXAgPSBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChSZW1vdGVQaHlBZCAmCisJCQkJICAgIFBIWV9MSU5LX1BBUlRORVJfUEFVU0VfQ0FQQUJMRSkgeworCQkJCQlGbG93Q2FwID0KKwkJCQkJICAgIExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSB8CisJCQkJCSAgICBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoTG9jYWxQaHlBZCAmIFBIWV9BTl9BRF9BU1lNX1BBVVNFKSB7CisJCQlpZiAoKFJlbW90ZVBoeUFkICYgUEhZX0xJTktfUEFSVE5FUl9QQVVTRV9DQVBBQkxFKSAmJgorCQkJICAgIChSZW1vdGVQaHlBZCAmIFBIWV9MSU5LX1BBUlRORVJfQVNZTV9QQVVTRSkpIHsKKwkJCQlGbG93Q2FwID0gTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFOworCQkJfQogCQl9Ci0JCWVsc2UgaWYoUmVtb3RlUGh5QWQgJiBQSFlfTElOS19QQVJUTkVSX0FTWU1fUEFVU0UpCi0JCXsKLQkJICAgIEZsb3dDYXAgPSBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRTsKLQkJfQotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQlpZihSZW1vdGVQaHlBZCAmIFBIWV9MSU5LX1BBUlRORVJfUEFVU0VfQ0FQQUJMRSkKLQkJewotCQkgICAgRmxvd0NhcCA9IExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSB8Ci0JCQlMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRTsKLQkJfQotCSAgICB9CisJfSBlbHNlIHsKKwkJRmxvd0NhcCA9IHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwOwogCX0KLQllbHNlIGlmKExvY2FsUGh5QWQgJiBQSFlfQU5fQURfQVNZTV9QQVVTRSkKLQl7Ci0JICAgIGlmKChSZW1vdGVQaHlBZCAmIFBIWV9MSU5LX1BBUlRORVJfUEFVU0VfQ0FQQUJMRSkgJiYKLQkJKFJlbW90ZVBoeUFkICYgUEhZX0xJTktfUEFSVE5FUl9BU1lNX1BBVVNFKSkKLQkgICAgewotCQlGbG93Q2FwID0gTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFOwotCSAgICB9CisKKwkvKiBFbmFibGUvZGlzYWJsZSByeCBQQVVTRS4gKi8KKwlwRGV2aWNlLT5SeE1vZGUgJj0gflJYX01PREVfRU5BQkxFX0ZMT1dfQ09OVFJPTDsKKwlpZiAoRmxvd0NhcCAmIExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFICYmCisJICAgIChwRGV2aWNlLT5GbG93Q29udHJvbENhcCA9PSBMTV9GTE9XX0NPTlRST0xfQVVUT19QQVVTRSB8fAorCSAgICAgcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgJiBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRSkpIHsKKwkJcERldmljZS0+Rmxvd0NvbnRyb2wgfD0gTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0U7CisJCXBEZXZpY2UtPlJ4TW9kZSB8PSBSWF9NT0RFX0VOQUJMRV9GTE9XX0NPTlRST0w7CisKIAl9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JRmxvd0NhcCA9IHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwOwotICAgIH0KKwlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuUnhNb2RlLCBwRGV2aWNlLT5SeE1vZGUpOwogCi0gICAgLyogRW5hYmxlL2Rpc2FibGUgcnggUEFVU0UuICovCi0gICAgcERldmljZS0+UnhNb2RlICY9IH5SWF9NT0RFX0VOQUJMRV9GTE9XX0NPTlRST0w7Ci0gICAgaWYoRmxvd0NhcCAmIExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFICYmCi0JKHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwID09IExNX0ZMT1dfQ09OVFJPTF9BVVRPX1BBVVNFIHx8Ci0JcERldmljZS0+Rmxvd0NvbnRyb2xDYXAgJiBMTV9GTE9XX0NPTlRST0xfUkVDRUlWRV9QQVVTRSkpCi0gICAgewotCXBEZXZpY2UtPkZsb3dDb250cm9sIHw9IExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFOwotCXBEZXZpY2UtPlJ4TW9kZSB8PSBSWF9NT0RFX0VOQUJMRV9GTE9XX0NPTlRST0w7CisJLyogRW5hYmxlL2Rpc2FibGUgdHggUEFVU0UuICovCisJcERldmljZS0+VHhNb2RlICY9IH5UWF9NT0RFX0VOQUJMRV9GTE9XX0NPTlRST0w7CisJaWYgKEZsb3dDYXAgJiBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0UgJiYKKwkgICAgKHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwID09IExNX0ZMT1dfQ09OVFJPTF9BVVRPX1BBVVNFIHx8CisJICAgICBwRGV2aWNlLT5GbG93Q29udHJvbENhcCAmIExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSkpIHsKKwkJcERldmljZS0+Rmxvd0NvbnRyb2wgfD0gTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFOworCQlwRGV2aWNlLT5UeE1vZGUgfD0gVFhfTU9ERV9FTkFCTEVfRkxPV19DT05UUk9MOwogCi0gICAgfQotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlJ4TW9kZSwgcERldmljZS0+UnhNb2RlKTsKKwl9CisJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlR4TW9kZSwgcERldmljZS0+VHhNb2RlKTsKIAotICAgIC8qIEVuYWJsZS9kaXNhYmxlIHR4IFBBVVNFLiAqLwotICAgIHBEZXZpY2UtPlR4TW9kZSAmPSB+VFhfTU9ERV9FTkFCTEVfRkxPV19DT05UUk9MOwotICAgIGlmKEZsb3dDYXAgJiBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0UgJiYKLQkocERldmljZS0+Rmxvd0NvbnRyb2xDYXAgPT0gTE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0UgfHwKLQlwRGV2aWNlLT5GbG93Q29udHJvbENhcCAmIExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSkpCi0gICAgewotCXBEZXZpY2UtPkZsb3dDb250cm9sIHw9IExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRTsKLQlwRGV2aWNlLT5UeE1vZGUgfD0gVFhfTU9ERV9FTkFCTEVfRkxPV19DT05UUk9MOwotCi0gICAgfQotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlR4TW9kZSwgcERldmljZS0+VHhNb2RlKTsKLQotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogI2lmIElOQ0xVREVfVEJJX1NVUFBPUlQKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotU1RBVElDIExNX1NUQVRVUwotTE1fSW5pdEJjbTgwMHhQaHkoCi0gICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQorU1RBVElDIExNX1NUQVRVUyBMTV9Jbml0QmNtODAweFBoeSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQogewotICAgIExNX1VJTlQzMiBWYWx1ZTMyOwotICAgIExNX1VJTlQzMiBqOworCUxNX1VJTlQzMiBWYWx1ZTMyOworCUxNX1VJTlQzMiBqOwogCi0gICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cyk7CisJVmFsdWUzMiA9IFJFR19SRCAocERldmljZSwgTWFjQ3RybC5TdGF0dXMpOwogCi0gICAgLyogUmVzZXQgdGhlIFNFUkRFUyBkdXJpbmcgaW5pdCBhbmQgd2hlbiB3ZSBoYXZlIGxpbmsuICovCi0gICAgaWYoIXBEZXZpY2UtPkluaXREb25lIHx8IFZhbHVlMzIgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpCi0gICAgewotCS8qIFNldCBQTEwgbG9jayByYW5nZS4gKi8KLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDE2LCAweDgwMDcpOworCS8qIFJlc2V0IHRoZSBTRVJERVMgZHVyaW5nIGluaXQgYW5kIHdoZW4gd2UgaGF2ZSBsaW5rLiAqLworCWlmICghcERldmljZS0+SW5pdERvbmUgfHwgVmFsdWUzMiAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkgeworCQkvKiBTZXQgUExMIGxvY2sgcmFuZ2UuICovCisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCAweDE2LCAweDgwMDcpOwogCi0JLyogU29mdHdhcmUgcmVzZXQuICovCi0JTE1fV3JpdGVQaHkocERldmljZSwgMHgwMCwgMHg4MDAwKTsKKwkJLyogU29mdHdhcmUgcmVzZXQuICovCisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCAweDAwLCAweDgwMDApOwogCi0JLyogV2FpdCBmb3IgcmVzZXQgdG8gY29tcGxldGUuICovCi0JZm9yKGogPSAwOyBqIDwgNTAwOyBqKyspCi0JewotCSAgICBNTV9XYWl0KDEwKTsKKwkJLyogV2FpdCBmb3IgcmVzZXQgdG8gY29tcGxldGUuICovCisJCWZvciAoaiA9IDA7IGogPCA1MDA7IGorKykgeworCQkJTU1fV2FpdCAoMTApOworCQl9CisKKwkJLyogQ29uZmlnIG1vZGU7IHNlbGV0Y3QgUE1BL0NoIDEgcmVncy4gKi8KKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MTAsIDB4ODQxMSk7CisKKwkJLyogRW5hYmxlIGF1dG8tbG9jayBhbmQgY29tZGV0LCBzZWxlY3QgdHhjbGsgZm9yIHR4LiAqLworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgMHgxMSwgMHgwYTEwKTsKKworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgMHgxOCwgMHgwMGEwKTsKKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MTYsIDB4NDFmZik7CisKKwkJLyogQXNzZXJ0IGFuZCBkZWFzc2VydCBQT1IuICovCisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCAweDEzLCAweDA0MDApOworCQlNTV9XYWl0ICg0MCk7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCAweDEzLCAweDAwMDApOworCisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCAweDExLCAweDBhNTApOworCQlNTV9XYWl0ICg0MCk7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCAweDExLCAweDBhMTApOworCisJCS8qIERlbGF5IGZvciBzaWduYWwgdG8gc3RhYmlsaXplLiAqLworCQlmb3IgKGogPSAwOyBqIDwgMTUwMDA7IGorKykgeworCQkJTU1fV2FpdCAoMTApOworCQl9CisKKwkJLyogRGVzZWxlY3QgdGhlIGNoYW5uZWwgcmVnaXN0ZXIgc28gd2UgY2FuIHJlYWQgdGhlIFBIWSBpZCBsYXRlci4gKi8KKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIDB4MTAsIDB4ODAxMSk7CiAJfQogCi0JLyogQ29uZmlnIG1vZGU7IHNlbGV0Y3QgUE1BL0NoIDEgcmVncy4gKi8KLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDEwLCAweDg0MTEpOwotCi0JLyogRW5hYmxlIGF1dG8tbG9jayBhbmQgY29tZGV0LCBzZWxlY3QgdHhjbGsgZm9yIHR4LiAqLwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTEsIDB4MGExMCk7Ci0KLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDE4LCAweDAwYTApOwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTYsIDB4NDFmZik7Ci0KLQkvKiBBc3NlcnQgYW5kIGRlYXNzZXJ0IFBPUi4gKi8KLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDEzLCAweDA0MDApOwotCU1NX1dhaXQoNDApOwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTMsIDB4MDAwMCk7Ci0KLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDExLCAweDBhNTApOwotCU1NX1dhaXQoNDApOwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIDB4MTEsIDB4MGExMCk7Ci0KLQkvKiBEZWxheSBmb3Igc2lnbmFsIHRvIHN0YWJpbGl6ZS4gKi8KLQlmb3IoaiA9IDA7IGogPCAxNTAwMDsgaisrKQotCXsKLQkgICAgTU1fV2FpdCgxMCk7Ci0JfQotCi0JLyogRGVzZWxlY3QgdGhlIGNoYW5uZWwgcmVnaXN0ZXIgc28gd2UgY2FuIHJlYWQgdGhlIFBIWSBpZCBsYXRlci4gKi8KLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCAweDEwLCAweDgwMTEpOwotICAgIH0KLQotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1TVEFUSUMgTE1fU1RBVFVTCi1MTV9TZXR1cEZpYmVyUGh5KAotICAgIFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKK1NUQVRJQyBMTV9TVEFUVVMgTE1fU2V0dXBGaWJlclBoeSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQogewotICAgIExNX1NUQVRVUyBDdXJyZW50TGlua1N0YXR1czsKLSAgICBBVVRPTkVHX1NUQVRVUyBBblN0YXR1cyA9IDA7Ci0gICAgTE1fVUlOVDMyIFZhbHVlMzI7Ci0gICAgTE1fVUlOVDMyIENudDsKLSAgICBMTV9VSU5UMzIgaiwgazsKKwlMTV9TVEFUVVMgQ3VycmVudExpbmtTdGF0dXM7CisJQVVUT05FR19TVEFUVVMgQW5TdGF0dXMgPSAwOworCUxNX1VJTlQzMiBWYWx1ZTMyOworCUxNX1VJTlQzMiBDbnQ7CisJTE1fVUlOVDMyIGosIGs7CiAKLSAgICBwRGV2aWNlLT5NYWNNb2RlICY9IH4oTUFDX01PREVfSEFMRl9EVVBMRVggfCBNQUNfTU9ERV9QT1JUX01PREVfTUFTSyk7CisJcERldmljZS0+TWFjTW9kZSAmPSB+KE1BQ19NT0RFX0hBTEZfRFVQTEVYIHwgTUFDX01PREVfUE9SVF9NT0RFX01BU0spOwogCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgc2VuZF9jb25maWcgcmVnaXN0ZXIuICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuVHhBdXRvTmVnLCAwKTsKKwkvKiBJbml0aWFsaXplIHRoZSBzZW5kX2NvbmZpZyByZWdpc3Rlci4gKi8KKwlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuVHhBdXRvTmVnLCAwKTsKIAotICAgIC8qIEVuYWJsZSBUQkkgYW5kIGZ1bGwgZHVwbGV4IG1vZGUuICovCi0gICAgcERldmljZS0+TWFjTW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfVEJJOwotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUpOworCS8qIEVuYWJsZSBUQkkgYW5kIGZ1bGwgZHVwbGV4IG1vZGUuICovCisJcERldmljZS0+TWFjTW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfVEJJOworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5Nb2RlLCBwRGV2aWNlLT5NYWNNb2RlKTsKIAotICAgIC8qIEluaXRpYWxpemUgdGhlIEJDTTgwMDIgU0VSREVTIFBIWS4gKi8KLSAgICBzd2l0Y2gocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykKLSAgICB7CisJLyogSW5pdGlhbGl6ZSB0aGUgQkNNODAwMiBTRVJERVMgUEhZLiAqLworCXN3aXRjaCAocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykgewogCWNhc2UgUEhZX0JDTTgwMDJfUEhZX0lEOgotCSAgICBMTV9Jbml0QmNtODAweFBoeShwRGV2aWNlKTsKLQkgICAgYnJlYWs7CisJCUxNX0luaXRCY204MDB4UGh5IChwRGV2aWNlKTsKKwkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCSAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBFbmFibGUgbGluayBjaGFuZ2UgaW50ZXJydXB0LiAqLwotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1hY0V2ZW50LCBNQUNfRVZFTlRfRU5BQkxFX0xJTktfU1RBVEVfQ0hBTkdFRF9BVFROKTsKLQotICAgIC8qIERlZmF1bHQgdG8gbGluayBkb3duLiAqLwotICAgIEN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfRE9XTjsKLQotICAgIC8qIEdldCB0aGUgbGluayBzdGF0dXMuICovCi0gICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cyk7Ci0gICAgaWYoVmFsdWUzMiAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkKLSAgICB7Ci0JaWYoKHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9PSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9BVVRPKSB8fAotCSAgICAocERldmljZS0+RGlzYWJsZUF1dG9OZWcgPT0gRkFMU0UpKQotCXsKLQkgICAgLyogYXV0by1uZWdvdGlhdGlvbiBtb2RlLiAqLwotCSAgICAvKiBJbml0aWFsaXplIHRoZSBhdXRvbmVnIGRlZmF1bHQgY2FwYWlibGl0aWVzLiAqLwotCSAgICBBdXRvbmVnSW5pdCgmcERldmljZS0+QW5JbmZvKTsKLQotCSAgICAvKiBTZXQgdGhlIGNvbnRleHQgcG9pbnRlciB0byBwb2ludCB0byB0aGUgbWFpbiBkZXZpY2Ugc3RydWN0dXJlLiAqLwotCSAgICBwRGV2aWNlLT5BbkluZm8ucENvbnRleHQgPSBwRGV2aWNlOwotCi0JICAgIC8qIFNldHVwIGZsb3cgY29udHJvbCBhZHZlcnRpc2VtZW50IHJlZ2lzdGVyLiAqLwotCSAgICBWYWx1ZTMyID0gR2V0UGh5QWRGbG93Q250cmxTZXR0aW5ncyhwRGV2aWNlKTsKLQkgICAgaWYoVmFsdWUzMiAmIFBIWV9BTl9BRF9QQVVTRV9DQVBBQkxFKQotCSAgICB7Ci0JCXBEZXZpY2UtPkFuSW5mby5tcl9hZHZfc3ltX3BhdXNlID0gMTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJcERldmljZS0+QW5JbmZvLm1yX2Fkdl9zeW1fcGF1c2UgPSAwOwotCSAgICB9Ci0KLQkgICAgaWYoVmFsdWUzMiAmIFBIWV9BTl9BRF9BU1lNX1BBVVNFKQotCSAgICB7Ci0JCXBEZXZpY2UtPkFuSW5mby5tcl9hZHZfYXN5bV9wYXVzZSA9IDE7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCXBEZXZpY2UtPkFuSW5mby5tcl9hZHZfYXN5bV9wYXVzZSA9IDA7Ci0JICAgIH0KLQotCSAgICAvKiBUcnkgdG8gYXV0b25lZyB1cCB0byBzaXggdGltZXMuICovCi0JICAgIGlmIChwRGV2aWNlLT5JZ25vcmVUYmlMaW5rQ2hhbmdlKQotCSAgICB7Ci0JCUNudCA9IDE7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCUNudCA9IDY7Ci0JICAgIH0KLQkgICAgZm9yIChqID0gMDsgaiA8IENudDsgaisrKQotCSAgICB7Ci0JCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlR4QXV0b05lZywgMCk7Ci0KLQkJVmFsdWUzMiA9IHBEZXZpY2UtPk1hY01vZGUgJiB+TUFDX01PREVfUE9SVF9NT0RFX01BU0s7Ci0JCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIFZhbHVlMzIpOwotCQlNTV9XYWl0KDIwKTsKLQotCQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5Nb2RlLCBwRGV2aWNlLT5NYWNNb2RlIHwKLQkJICAgIE1BQ19NT0RFX1NFTkRfQ09ORklHUyk7Ci0KLQkJTU1fV2FpdCgyMCk7Ci0KLQkJcERldmljZS0+QW5JbmZvLlN0YXRlID0gQU5fU1RBVEVfVU5LTk9XTjsKLQkJcERldmljZS0+QW5JbmZvLkN1cnJlbnRUaW1lX3VzID0gMDsKLQotCQlSRUdfV1IocERldmljZSwgR3JjLlRpbWVyLCAwKTsKLQkJZm9yKGsgPSAwOyAocERldmljZS0+QW5JbmZvLkN1cnJlbnRUaW1lX3VzIDwgNzUwMDApICYmCi0JCSAgICAoayA8IDc1MDAwKTsgaysrKQotCQl7Ci0JCSAgICBBblN0YXR1cyA9IEF1dG9uZWc4MDIzeigmcERldmljZS0+QW5JbmZvKTsKLQotCQkgICAgaWYoKEFuU3RhdHVzID09IEFVVE9ORUdfU1RBVFVTX0RPTkUpIHx8Ci0JCQkoQW5TdGF0dXMgPT0gQVVUT05FR19TVEFUVVNfRkFJTEVEKSkKLQkJICAgIHsKLQkJCWJyZWFrOwotCQkgICAgfQotCi0JCSAgICBwRGV2aWNlLT5BbkluZm8uQ3VycmVudFRpbWVfdXMgPSBSRUdfUkQocERldmljZSwgR3JjLlRpbWVyKTsKLQotCQl9Ci0JCWlmKChBblN0YXR1cyA9PSBBVVRPTkVHX1NUQVRVU19ET05FKSB8fAotCQkgICAgKEFuU3RhdHVzID09IEFVVE9ORUdfU1RBVFVTX0ZBSUxFRCkpCi0JCXsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWlmIChqID49IDEpCi0JCXsKLQkJICAgIGlmICghKFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cykgJgotCQkJTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSkgewotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICAgIC8qIFN0b3Agc2VuZGluZyBjb25maWdzLiAqLwotCSAgICBNTV9BblR4SWRsZSgmcERldmljZS0+QW5JbmZvKTsKLQotCSAgICAvKiBSZXNvbHZlIGZsb3cgY29udHJvbCBzZXR0aW5ncy4gKi8KLQkgICAgaWYoKEFuU3RhdHVzID09IEFVVE9ORUdfU1RBVFVTX0RPTkUpICYmCi0JCXBEZXZpY2UtPkFuSW5mby5tcl9hbl9jb21wbGV0ZSAmJiBwRGV2aWNlLT5BbkluZm8ubXJfbGlua19vayAmJgotCQlwRGV2aWNlLT5BbkluZm8ubXJfbHBfYWR2X2Z1bGxfZHVwbGV4KQotCQl7Ci0JCUxNX1VJTlQzMiBSZW1vdGVQaHlBZDsKLQkJTE1fVUlOVDMyIExvY2FsUGh5QWQ7Ci0KLQkJTG9jYWxQaHlBZCA9IDA7Ci0JCWlmKHBEZXZpY2UtPkFuSW5mby5tcl9hZHZfc3ltX3BhdXNlKQotCQl7Ci0JCSAgICBMb2NhbFBoeUFkIHw9IFBIWV9BTl9BRF9QQVVTRV9DQVBBQkxFOwotCQl9Ci0KLQkJaWYocERldmljZS0+QW5JbmZvLm1yX2Fkdl9hc3ltX3BhdXNlKQotCQl7Ci0JCSAgICBMb2NhbFBoeUFkIHw9IFBIWV9BTl9BRF9BU1lNX1BBVVNFOwotCQl9Ci0KLQkJUmVtb3RlUGh5QWQgPSAwOwotCQlpZihwRGV2aWNlLT5BbkluZm8ubXJfbHBfYWR2X3N5bV9wYXVzZSkKLQkJewotCQkgICAgUmVtb3RlUGh5QWQgfD0gUEhZX0xJTktfUEFSVE5FUl9QQVVTRV9DQVBBQkxFOwotCQl9Ci0KLQkJaWYocERldmljZS0+QW5JbmZvLm1yX2xwX2Fkdl9hc3ltX3BhdXNlKQotCQl7Ci0JCSAgICBSZW1vdGVQaHlBZCB8PSBQSFlfTElOS19QQVJUTkVSX0FTWU1fUEFVU0U7Ci0JCX0KLQotCQlMTV9TZXRGbG93Q29udHJvbChwRGV2aWNlLCBMb2NhbFBoeUFkLCBSZW1vdGVQaHlBZCk7Ci0KLQkJQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19BQ1RJVkU7Ci0JICAgIH0KLQkgICAgZm9yIChqID0gMDsgaiA8IDMwOyBqKyspCi0JICAgIHsKLQkJTU1fV2FpdCgyMCk7Ci0JCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cywgTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAotCQkgICAgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCk7Ci0JCU1NX1dhaXQoMjApOwotCQlpZiAoKFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cykgJgotCQkgICAgKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCkpID09IDApCi0JCSAgICBicmVhazsKLQkgICAgfQotCSAgICBpZiAocERldmljZS0+UG9sbFRiaUxpbmspCi0JICAgIHsKLQkJVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cyk7Ci0JCWlmIChWYWx1ZTMyICYgTUFDX1NUQVRVU19SRUNFSVZJTkdfQ0ZHKQotCQl7Ci0JCSAgICBwRGV2aWNlLT5JZ25vcmVUYmlMaW5rQ2hhbmdlID0gVFJVRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJICAgIHBEZXZpY2UtPklnbm9yZVRiaUxpbmtDaGFuZ2UgPSBGQUxTRTsKLQkJfQotCSAgICB9Ci0JICAgIFZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgTWFjQ3RybC5TdGF0dXMpOwotCSAgICBpZiAoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfRE9XTiAmJgotCQkgKFZhbHVlMzIgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpICYmCi0JCSAoKFZhbHVlMzIgJiBNQUNfU1RBVFVTX1JFQ0VJVklOR19DRkcpID09IDApKQotCSAgICB7Ci0JCUN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfQUNUSVZFOwotCSAgICB9CisJCWJyZWFrOwogCX0KLQllbHNlCi0JewotCSAgICAvKiBXZSBhcmUgZm9yY2luZyBsaW5lIHNwZWVkLiAqLwotCSAgICBwRGV2aWNlLT5GbG93Q29udHJvbENhcCAmPSB+TE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0U7Ci0JICAgIExNX1NldEZsb3dDb250cm9sKHBEZXZpY2UsIDAsIDApOwogCi0JICAgIEN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfQUNUSVZFOwotCSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5Nb2RlLCBwRGV2aWNlLT5NYWNNb2RlIHwKLQkJTUFDX01PREVfU0VORF9DT05GSUdTKTsKLQl9Ci0gICAgfQotICAgIC8qIFNldCB0aGUgbGluayBwb2xhcml0eSBiaXQuICovCi0gICAgcERldmljZS0+TWFjTW9kZSAmPSB+TUFDX01PREVfTElOS19QT0xBUklUWTsKLSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5Nb2RlLCBwRGV2aWNlLT5NYWNNb2RlKTsKKwkvKiBFbmFibGUgbGluayBjaGFuZ2UgaW50ZXJydXB0LiAqLworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NYWNFdmVudCwKKwkJTUFDX0VWRU5UX0VOQUJMRV9MSU5LX1NUQVRFX0NIQU5HRURfQVRUTik7CiAKLSAgICBwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzID0gU1RBVFVTX0JMT0NLX1VQREFURUQgfAotCShwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+U3RhdHVzICYgflNUQVRVU19CTE9DS19MSU5LX0NIQU5HRURfU1RBVFVTKTsKLQotICAgIGZvciAoaiA9IDA7IGogPCAxMDA7IGorKykKLSAgICB7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzLCBNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCB8Ci0JICAgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpOwotCU1NX1dhaXQoNSk7Ci0JaWYgKChSRUdfUkQocERldmljZSwgTWFjQ3RybC5TdGF0dXMpICYKLQkgICAgKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCkpID09IDApCi0JICAgIGJyZWFrOwotICAgIH0KLQotICAgIFZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgTWFjQ3RybC5TdGF0dXMpOwotICAgIGlmKChWYWx1ZTMyICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSA9PSAwKQotICAgIHsKKwkvKiBEZWZhdWx0IHRvIGxpbmsgZG93bi4gKi8KIAlDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0RPV047Ci0JaWYgKHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID09IEZBTFNFKQotCXsKLQkgICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSB8Ci0JCU1BQ19NT0RFX1NFTkRfQ09ORklHUyk7Ci0JICAgIE1NX1dhaXQoMSk7Ci0JICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUpOworCisJLyogR2V0IHRoZSBsaW5rIHN0YXR1cy4gKi8KKwlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cyk7CisJaWYgKFZhbHVlMzIgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpIHsKKwkJaWYgKChwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0KKwkJICAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9BVVRPKQorCQkgICAgfHwgKHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID09IEZBTFNFKSkgeworCQkJLyogYXV0by1uZWdvdGlhdGlvbiBtb2RlLiAqLworCQkJLyogSW5pdGlhbGl6ZSB0aGUgYXV0b25lZyBkZWZhdWx0IGNhcGFpYmxpdGllcy4gKi8KKwkJCUF1dG9uZWdJbml0ICgmcERldmljZS0+QW5JbmZvKTsKKworCQkJLyogU2V0IHRoZSBjb250ZXh0IHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIG1haW4gZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwkJCXBEZXZpY2UtPkFuSW5mby5wQ29udGV4dCA9IHBEZXZpY2U7CisKKwkJCS8qIFNldHVwIGZsb3cgY29udHJvbCBhZHZlcnRpc2VtZW50IHJlZ2lzdGVyLiAqLworCQkJVmFsdWUzMiA9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MgKHBEZXZpY2UpOworCQkJaWYgKFZhbHVlMzIgJiBQSFlfQU5fQURfUEFVU0VfQ0FQQUJMRSkgeworCQkJCXBEZXZpY2UtPkFuSW5mby5tcl9hZHZfc3ltX3BhdXNlID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJcERldmljZS0+QW5JbmZvLm1yX2Fkdl9zeW1fcGF1c2UgPSAwOworCQkJfQorCisJCQlpZiAoVmFsdWUzMiAmIFBIWV9BTl9BRF9BU1lNX1BBVVNFKSB7CisJCQkJcERldmljZS0+QW5JbmZvLm1yX2Fkdl9hc3ltX3BhdXNlID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJcERldmljZS0+QW5JbmZvLm1yX2Fkdl9hc3ltX3BhdXNlID0gMDsKKwkJCX0KKworCQkJLyogVHJ5IHRvIGF1dG9uZWcgdXAgdG8gc2l4IHRpbWVzLiAqLworCQkJaWYgKHBEZXZpY2UtPklnbm9yZVRiaUxpbmtDaGFuZ2UpIHsKKwkJCQlDbnQgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlDbnQgPSA2OworCQkJfQorCQkJZm9yIChqID0gMDsgaiA8IENudDsgaisrKSB7CisJCQkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlR4QXV0b05lZywgMCk7CisKKwkJCQlWYWx1ZTMyID0KKwkJCQkgICAgcERldmljZS0+TWFjTW9kZSAmIH5NQUNfTU9ERV9QT1JUX01PREVfTUFTSzsKKwkJCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgVmFsdWUzMik7CisJCQkJTU1fV2FpdCAoMjApOworCisJCQkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1vZGUsCisJCQkJCXBEZXZpY2UtPgorCQkJCQlNYWNNb2RlIHwgTUFDX01PREVfU0VORF9DT05GSUdTKTsKKworCQkJCU1NX1dhaXQgKDIwKTsKKworCQkJCXBEZXZpY2UtPkFuSW5mby5TdGF0ZSA9IEFOX1NUQVRFX1VOS05PV047CisJCQkJcERldmljZS0+QW5JbmZvLkN1cnJlbnRUaW1lX3VzID0gMDsKKworCQkJCVJFR19XUiAocERldmljZSwgR3JjLlRpbWVyLCAwKTsKKwkJCQlmb3IgKGsgPSAwOworCQkJCSAgICAgKHBEZXZpY2UtPkFuSW5mby5DdXJyZW50VGltZV91cyA8IDc1MDAwKQorCQkJCSAgICAgJiYgKGsgPCA3NTAwMCk7IGsrKykgeworCQkJCQlBblN0YXR1cyA9CisJCQkJCSAgICBBdXRvbmVnODAyM3ogKCZwRGV2aWNlLT5BbkluZm8pOworCisJCQkJCWlmICgoQW5TdGF0dXMgPT0gQVVUT05FR19TVEFUVVNfRE9ORSkgfHwKKwkJCQkJICAgIChBblN0YXR1cyA9PSBBVVRPTkVHX1NUQVRVU19GQUlMRUQpKQorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCXBEZXZpY2UtPkFuSW5mby5DdXJyZW50VGltZV91cyA9CisJCQkJCSAgICBSRUdfUkQgKHBEZXZpY2UsIEdyYy5UaW1lcik7CisKKwkJCQl9CisJCQkJaWYgKChBblN0YXR1cyA9PSBBVVRPTkVHX1NUQVRVU19ET05FKSB8fAorCQkJCSAgICAoQW5TdGF0dXMgPT0gQVVUT05FR19TVEFUVVNfRkFJTEVEKSkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKGogPj0gMSkgeworCQkJCQlpZiAoIShSRUdfUkQgKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzKSAmCisJCQkJCSAgICAgIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkpIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvKiBTdG9wIHNlbmRpbmcgY29uZmlncy4gKi8KKwkJCU1NX0FuVHhJZGxlICgmcERldmljZS0+QW5JbmZvKTsKKworCQkJLyogUmVzb2x2ZSBmbG93IGNvbnRyb2wgc2V0dGluZ3MuICovCisJCQlpZiAoKEFuU3RhdHVzID09IEFVVE9ORUdfU1RBVFVTX0RPTkUpICYmCisJCQkgICAgcERldmljZS0+QW5JbmZvLm1yX2FuX2NvbXBsZXRlCisJCQkgICAgJiYgcERldmljZS0+QW5JbmZvLm1yX2xpbmtfb2sKKwkJCSAgICAmJiBwRGV2aWNlLT5BbkluZm8ubXJfbHBfYWR2X2Z1bGxfZHVwbGV4KSB7CisJCQkJTE1fVUlOVDMyIFJlbW90ZVBoeUFkOworCQkJCUxNX1VJTlQzMiBMb2NhbFBoeUFkOworCisJCQkJTG9jYWxQaHlBZCA9IDA7CisJCQkJaWYgKHBEZXZpY2UtPkFuSW5mby5tcl9hZHZfc3ltX3BhdXNlKSB7CisJCQkJCUxvY2FsUGh5QWQgfD0gUEhZX0FOX0FEX1BBVVNFX0NBUEFCTEU7CisJCQkJfQorCisJCQkJaWYgKHBEZXZpY2UtPkFuSW5mby5tcl9hZHZfYXN5bV9wYXVzZSkgeworCQkJCQlMb2NhbFBoeUFkIHw9IFBIWV9BTl9BRF9BU1lNX1BBVVNFOworCQkJCX0KKworCQkJCVJlbW90ZVBoeUFkID0gMDsKKwkJCQlpZiAocERldmljZS0+QW5JbmZvLm1yX2xwX2Fkdl9zeW1fcGF1c2UpIHsKKwkJCQkJUmVtb3RlUGh5QWQgfD0KKwkJCQkJICAgIFBIWV9MSU5LX1BBUlRORVJfUEFVU0VfQ0FQQUJMRTsKKwkJCQl9CisKKwkJCQlpZiAocERldmljZS0+QW5JbmZvLm1yX2xwX2Fkdl9hc3ltX3BhdXNlKSB7CisJCQkJCVJlbW90ZVBoeUFkIHw9CisJCQkJCSAgICBQSFlfTElOS19QQVJUTkVSX0FTWU1fUEFVU0U7CisJCQkJfQorCisJCQkJTE1fU2V0Rmxvd0NvbnRyb2wgKHBEZXZpY2UsIExvY2FsUGh5QWQsCisJCQkJCQkgICBSZW1vdGVQaHlBZCk7CisKKwkJCQlDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0FDVElWRTsKKwkJCX0KKwkJCWZvciAoaiA9IDA7IGogPCAzMDsgaisrKSB7CisJCQkJTU1fV2FpdCAoMjApOworCQkJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5TdGF0dXMsCisJCQkJCU1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKKwkJCQkJTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCk7CisJCQkJTU1fV2FpdCAoMjApOworCQkJCWlmICgoUkVHX1JEIChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cykgJgorCQkJCSAgICAgKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKKwkJCQkgICAgICBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSkgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocERldmljZS0+UG9sbFRiaUxpbmspIHsKKwkJCQlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cyk7CisJCQkJaWYgKFZhbHVlMzIgJiBNQUNfU1RBVFVTX1JFQ0VJVklOR19DRkcpIHsKKwkJCQkJcERldmljZS0+SWdub3JlVGJpTGlua0NoYW5nZSA9IFRSVUU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcERldmljZS0+SWdub3JlVGJpTGlua0NoYW5nZSA9IEZBTFNFOworCQkJCX0KKwkJCX0KKwkJCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzKTsKKwkJCWlmIChDdXJyZW50TGlua1N0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19ET1dOICYmCisJCQkgICAgKFZhbHVlMzIgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpICYmCisJCQkgICAgKChWYWx1ZTMyICYgTUFDX1NUQVRVU19SRUNFSVZJTkdfQ0ZHKSA9PSAwKSkgeworCQkJCUN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfQUNUSVZFOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogV2UgYXJlIGZvcmNpbmcgbGluZSBzcGVlZC4gKi8KKwkJCXBEZXZpY2UtPkZsb3dDb250cm9sQ2FwICY9IH5MTV9GTE9XX0NPTlRST0xfQVVUT19QQVVTRTsKKwkJCUxNX1NldEZsb3dDb250cm9sIChwRGV2aWNlLCAwLCAwKTsKKworCQkJQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19BQ1RJVkU7CisJCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSB8CisJCQkJTUFDX01PREVfU0VORF9DT05GSUdTKTsKKwkJfQogCX0KLSAgICB9CisJLyogU2V0IHRoZSBsaW5rIHBvbGFyaXR5IGJpdC4gKi8KKwlwRGV2aWNlLT5NYWNNb2RlICY9IH5NQUNfTU9ERV9MSU5LX1BPTEFSSVRZOworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5Nb2RlLCBwRGV2aWNlLT5NYWNNb2RlKTsKIAotICAgIC8qIEluaXRpYWxpemUgdGhlIGN1cnJlbnQgbGluayBzdGF0dXMuICovCi0gICAgaWYoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfQUNUSVZFKQotICAgIHsKLQlwRGV2aWNlLT5MaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTOwotCXBEZXZpY2UtPkR1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOwotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLkxlZEN0cmwsIExFRF9DVFJMX09WRVJSSURFX0xJTktfTEVEIHwKLQkgICAgTEVEX0NUUkxfMTAwME1CUFNfTEVEX09OKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlwRGV2aWNlLT5MaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEX1VOS05PV047Ci0JcERldmljZS0+RHVwbGV4TW9kZSA9IExNX0RVUExFWF9NT0RFX1VOS05PV047Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTGVkQ3RybCwgTEVEX0NUUkxfT1ZFUlJJREVfTElOS19MRUQgfAotCSAgICBMRURfQ1RSTF9PVkVSUklERV9UUkFGRklDX0xFRCk7Ci0gICAgfQorCXBEZXZpY2UtPnBTdGF0dXNCbGtWaXJ0LT5TdGF0dXMgPSBTVEFUVVNfQkxPQ0tfVVBEQVRFRCB8CisJICAgIChwRGV2aWNlLT5wU3RhdHVzQmxrVmlydC0+CisJICAgICBTdGF0dXMgJiB+U1RBVFVTX0JMT0NLX0xJTktfQ0hBTkdFRF9TVEFUVVMpOwogCi0gICAgLyogSW5kaWNhdGUgbGluayBzdGF0dXMuICovCi0gICAgaWYgKHBEZXZpY2UtPkxpbmtTdGF0dXMgIT0gQ3VycmVudExpbmtTdGF0dXMpIHsKLQlwRGV2aWNlLT5MaW5rU3RhdHVzID0gQ3VycmVudExpbmtTdGF0dXM7Ci0JTU1fSW5kaWNhdGVTdGF0dXMocERldmljZSwgQ3VycmVudExpbmtTdGF0dXMpOwotICAgIH0KKwlmb3IgKGogPSAwOyBqIDwgMTAwOyBqKyspIHsKKwkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cywgTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQkJTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCk7CisJCU1NX1dhaXQgKDUpOworCQlpZiAoKFJFR19SRCAocERldmljZSwgTWFjQ3RybC5TdGF0dXMpICYKKwkJICAgICAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfCBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSkgPT0gMCkKKwkJCWJyZWFrOworCX0KIAotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cyk7CisJaWYgKChWYWx1ZTMyICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSA9PSAwKSB7CisJCUN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfRE9XTjsKKwkJaWYgKHBEZXZpY2UtPkRpc2FibGVBdXRvTmVnID09IEZBTFNFKSB7CisJCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSB8CisJCQkJTUFDX01PREVfU0VORF9DT05GSUdTKTsKKwkJCU1NX1dhaXQgKDEpOworCQkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUpOworCQl9CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgY3VycmVudCBsaW5rIHN0YXR1cy4gKi8KKwlpZiAoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfQUNUSVZFKSB7CisJCXBEZXZpY2UtPkxpbmVTcGVlZCA9IExNX0xJTkVfU1BFRURfMTAwME1CUFM7CisJCXBEZXZpY2UtPkR1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9GVUxMOworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTGVkQ3RybCwgTEVEX0NUUkxfT1ZFUlJJREVfTElOS19MRUQgfAorCQkJTEVEX0NUUkxfMTAwME1CUFNfTEVEX09OKTsKKwl9IGVsc2UgeworCQlwRGV2aWNlLT5MaW5lU3BlZWQgPSBMTV9MSU5FX1NQRUVEX1VOS05PV047CisJCXBEZXZpY2UtPkR1cGxleE1vZGUgPSBMTV9EVVBMRVhfTU9ERV9VTktOT1dOOworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTGVkQ3RybCwgTEVEX0NUUkxfT1ZFUlJJREVfTElOS19MRUQgfAorCQkJTEVEX0NUUkxfT1ZFUlJJREVfVFJBRkZJQ19MRUQpOworCX0KKworCS8qIEluZGljYXRlIGxpbmsgc3RhdHVzLiAqLworCWlmIChwRGV2aWNlLT5MaW5rU3RhdHVzICE9IEN1cnJlbnRMaW5rU3RhdHVzKSB7CisJCXBEZXZpY2UtPkxpbmtTdGF0dXMgPSBDdXJyZW50TGlua1N0YXR1czsKKwkJTU1fSW5kaWNhdGVTdGF0dXMgKHBEZXZpY2UsIEN1cnJlbnRMaW5rU3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9Ci0jZW5kaWYgLyogSU5DTFVERV9UQklfU1VQUE9SVCAqLwotCisjZW5kaWYJCQkJLyogSU5DTFVERV9UQklfU1VQUE9SVCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxNX1NUQVRVUwotTE1fU2V0dXBDb3BwZXJQaHkoCi0gICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQorTE1fU1RBVFVTIExNX1NldHVwQ29wcGVyUGh5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCiB7Ci0gICAgTE1fU1RBVFVTIEN1cnJlbnRMaW5rU3RhdHVzOwotICAgIExNX1VJTlQzMiBWYWx1ZTMyOworCUxNX1NUQVRVUyBDdXJyZW50TGlua1N0YXR1czsKKwlMTV9VSU5UMzIgVmFsdWUzMjsKIAotICAgIC8qIEFzc3VtZSB0aGVyZSBpcyBub3QgbGluayBmaXJzdC4gKi8KLSAgICBDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0RPV047CisJLyogQXNzdW1lIHRoZXJlIGlzIG5vdCBsaW5rIGZpcnN0LiAqLworCUN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfRE9XTjsKIAotICAgIC8qIERpc2FibGUgcGh5IGxpbmsgY2hhbmdlIGF0dGVudGlvbi4gKi8KLSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5NYWNFdmVudCwgMCk7CisJLyogRGlzYWJsZSBwaHkgbGluayBjaGFuZ2UgYXR0ZW50aW9uLiAqLworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NYWNFdmVudCwgMCk7CiAKLSAgICAvKiBDbGVhciBsaW5rIGNoYW5nZSBhdHRlbnRpb24uICovCi0gICAgUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuU3RhdHVzLCBNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCB8Ci0JTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCk7CisJLyogQ2xlYXIgbGluayBjaGFuZ2UgYXR0ZW50aW9uLiAqLworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5TdGF0dXMsIE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKKwkJTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCk7CiAKLSAgICAvKiBEaXNhYmxlIGF1dG8tcG9sbGluZyBmb3IgdGhlIG1vbWVudC4gKi8KLSAgICBwRGV2aWNlLT5NaU1vZGUgPSAweGMwMDAwOwotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1pTW9kZSwgcERldmljZS0+TWlNb2RlKTsKLSAgICBNTV9XYWl0KDQwKTsKKwkvKiBEaXNhYmxlIGF1dG8tcG9sbGluZyBmb3IgdGhlIG1vbWVudC4gKi8KKwlwRGV2aWNlLT5NaU1vZGUgPSAweGMwMDAwOworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NaU1vZGUsIHBEZXZpY2UtPk1pTW9kZSk7CisJTU1fV2FpdCAoNDApOwogCi0gICAgLyogRGV0ZXJtaW5lIHRoZSByZXF1ZXN0ZWQgbGluZSBzcGVlZCBhbmQgZHVwbGV4LiAqLwotICAgIHBEZXZpY2UtPk9sZExpbmVTcGVlZCA9IHBEZXZpY2UtPkxpbmVTcGVlZDsKLSAgICBMTV9UcmFuc2xhdGVSZXF1ZXN0ZWRNZWRpYVR5cGUocERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlLAotCSZwRGV2aWNlLT5NZWRpYVR5cGUsICZwRGV2aWNlLT5MaW5lU3BlZWQsICZwRGV2aWNlLT5EdXBsZXhNb2RlKTsKKwkvKiBEZXRlcm1pbmUgdGhlIHJlcXVlc3RlZCBsaW5lIHNwZWVkIGFuZCBkdXBsZXguICovCisJcERldmljZS0+T2xkTGluZVNwZWVkID0gcERldmljZS0+TGluZVNwZWVkOworCUxNX1RyYW5zbGF0ZVJlcXVlc3RlZE1lZGlhVHlwZSAocERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlLAorCQkJCQkmcERldmljZS0+TWVkaWFUeXBlLAorCQkJCQkmcERldmljZS0+TGluZVNwZWVkLAorCQkJCQkmcERldmljZS0+RHVwbGV4TW9kZSk7CiAKLSAgICAvKiBJbml0aWFsaXplIHRoZSBwaHkgY2hpcC4gKi8KLSAgICBzd2l0Y2gocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykKLSAgICB7CisJLyogSW5pdGlhbGl6ZSB0aGUgcGh5IGNoaXAuICovCisJc3dpdGNoIChwRGV2aWNlLT5QaHlJZCAmIFBIWV9JRF9NQVNLKSB7CiAJY2FzZSBQSFlfQkNNNTQwMF9QSFlfSUQ6CiAJY2FzZSBQSFlfQkNNNTQwMV9QSFlfSUQ6CiAJY2FzZSBQSFlfQkNNNTQxMV9QSFlfSUQ6CiAJY2FzZSBQSFlfQkNNNTcwMV9QSFlfSUQ6CiAJY2FzZSBQSFlfQkNNNTcwM19QSFlfSUQ6CiAJY2FzZSBQSFlfQkNNNTcwNF9QSFlfSUQ6Ci0JICAgIEN1cnJlbnRMaW5rU3RhdHVzID0gTE1fSW5pdEJjbTU0MHhQaHkocERldmljZSk7Ci0JICAgIGJyZWFrOworCQlDdXJyZW50TGlua1N0YXR1cyA9IExNX0luaXRCY201NDB4UGh5IChwRGV2aWNlKTsKKwkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCSAgICBicmVhazsKLSAgICB9CisJCWJyZWFrOworCX0KIAotICAgIGlmKEN1cnJlbnRMaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX1NFVFRJTkdfTUlTTUFUQ0gpCi0gICAgewotCUN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfRE9XTjsKLSAgICB9CisJaWYgKEN1cnJlbnRMaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX1NFVFRJTkdfTUlTTUFUQ0gpIHsKKwkJQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19ET1dOOworCX0KIAotICAgIC8qIFNldHVwIGZsb3cgY29udHJvbC4gKi8KLSAgICBwRGV2aWNlLT5GbG93Q29udHJvbCA9IExNX0ZMT1dfQ09OVFJPTF9OT05FOwotICAgIGlmKEN1cnJlbnRMaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0FDVElWRSkKLSAgICB7Ci0JTE1fRkxPV19DT05UUk9MIEZsb3dDYXA7ICAgICAvKiBGbG93IGNvbnRyb2wgY2FwYWJpbGl0eS4gKi8KKwkvKiBTZXR1cCBmbG93IGNvbnRyb2wuICovCisJcERldmljZS0+Rmxvd0NvbnRyb2wgPSBMTV9GTE9XX0NPTlRST0xfTk9ORTsKKwlpZiAoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfQUNUSVZFKSB7CisJCUxNX0ZMT1dfQ09OVFJPTCBGbG93Q2FwOwkvKiBGbG93IGNvbnRyb2wgY2FwYWJpbGl0eS4gKi8KIAotCUZsb3dDYXAgPSBMTV9GTE9XX0NPTlRST0xfTk9ORTsKKwkJRmxvd0NhcCA9IExNX0ZMT1dfQ09OVFJPTF9OT05FOwogCi0JaWYocERldmljZS0+RHVwbGV4TW9kZSA9PSBMTV9EVVBMRVhfTU9ERV9GVUxMKQotCXsKLQkgICAgaWYocERldmljZS0+RGlzYWJsZUF1dG9OZWcgPT0gRkFMU0UgfHwKLQkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID09IExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0FVVE8gfHwKLQkJcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID09IExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF9BVVRPKQotCSAgICB7Ci0JCUxNX1VJTlQzMiBFeHBlY3RlZFBoeUFkOwotCQlMTV9VSU5UMzIgTG9jYWxQaHlBZDsKLQkJTE1fVUlOVDMyIFJlbW90ZVBoeUFkOworCQlpZiAocERldmljZS0+RHVwbGV4TW9kZSA9PSBMTV9EVVBMRVhfTU9ERV9GVUxMKSB7CisJCQlpZiAocERldmljZS0+RGlzYWJsZUF1dG9OZWcgPT0gRkFMU0UgfHwKKwkJCSAgICBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPT0KKwkJCSAgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9BVVRPCisJCQkgICAgfHwgcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID09CisJCQkgICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEVfVVRQX0FVVE8pIHsKKwkJCQlMTV9VSU5UMzIgRXhwZWN0ZWRQaHlBZDsKKwkJCQlMTV9VSU5UMzIgTG9jYWxQaHlBZDsKKwkJCQlMTV9VSU5UMzIgUmVtb3RlUGh5QWQ7CiAKLQkJTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfQU5fQURfUkVHLCAmTG9jYWxQaHlBZCk7Ci0JCXBEZXZpY2UtPmFkdmVydGlzaW5nID0gTG9jYWxQaHlBZDsKLQkJTG9jYWxQaHlBZCAmPSAoUEhZX0FOX0FEX0FTWU1fUEFVU0UgfCBQSFlfQU5fQURfUEFVU0VfQ0FQQUJMRSk7CisJCQkJTE1fUmVhZFBoeSAocERldmljZSwgUEhZX0FOX0FEX1JFRywKKwkJCQkJICAgICZMb2NhbFBoeUFkKTsKKwkJCQlwRGV2aWNlLT5hZHZlcnRpc2luZyA9IExvY2FsUGh5QWQ7CisJCQkJTG9jYWxQaHlBZCAmPQorCQkJCSAgICAoUEhZX0FOX0FEX0FTWU1fUEFVU0UgfAorCQkJCSAgICAgUEhZX0FOX0FEX1BBVVNFX0NBUEFCTEUpOwogCi0JCUV4cGVjdGVkUGh5QWQgPSBHZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzKHBEZXZpY2UpOworCQkJCUV4cGVjdGVkUGh5QWQgPQorCQkJCSAgICBHZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzIChwRGV2aWNlKTsKIAotCQlpZihMb2NhbFBoeUFkICE9IEV4cGVjdGVkUGh5QWQpCi0JCXsKLQkJICAgIEN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfRE9XTjsKKwkJCQlpZiAoTG9jYWxQaHlBZCAhPSBFeHBlY3RlZFBoeUFkKSB7CisJCQkJCUN1cnJlbnRMaW5rU3RhdHVzID0gTE1fU1RBVFVTX0xJTktfRE9XTjsKKwkJCQl9IGVsc2UgeworCQkJCQlMTV9SZWFkUGh5IChwRGV2aWNlLAorCQkJCQkJICAgIFBIWV9MSU5LX1BBUlRORVJfQUJJTElUWV9SRUcsCisJCQkJCQkgICAgJlJlbW90ZVBoeUFkKTsKKworCQkJCQlMTV9TZXRGbG93Q29udHJvbCAocERldmljZSwgTG9jYWxQaHlBZCwKKwkJCQkJCQkgICBSZW1vdGVQaHlBZCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlwRGV2aWNlLT5GbG93Q29udHJvbENhcCAmPQorCQkJCSAgICB+TE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0U7CisJCQkJTE1fU2V0Rmxvd0NvbnRyb2wgKHBEZXZpY2UsIDAsIDApOworCQkJfQogCQl9Ci0JCWVsc2UKLQkJewotCQkgICAgTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfTElOS19QQVJUTkVSX0FCSUxJVFlfUkVHLAotCQkJJlJlbW90ZVBoeUFkKTsKKwl9CiAKLQkJICAgIExNX1NldEZsb3dDb250cm9sKHBEZXZpY2UsIExvY2FsUGh5QWQsIFJlbW90ZVBoeUFkKTsKKwlpZiAoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfRE9XTikgeworCQlMTV9Gb3JjZUF1dG9OZWcgKHBEZXZpY2UsIHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSk7CisKKwkJLyogSWYgd2UgZm9yY2UgbGluZSBzcGVlZCwgd2UgbWFrZSBnZXQgbGluayByaWdodCBhd2F5LiAqLworCQlMTV9SZWFkUGh5IChwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOworCQlMTV9SZWFkUGh5IChwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOworCQlpZiAoVmFsdWUzMiAmIFBIWV9TVEFUVVNfTElOS19QQVNTKSB7CisJCQlDdXJyZW50TGlua1N0YXR1cyA9IExNX1NUQVRVU19MSU5LX0FDVElWRTsKIAkJfQotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQlwRGV2aWNlLT5GbG93Q29udHJvbENhcCAmPSB+TE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0U7Ci0JCUxNX1NldEZsb3dDb250cm9sKHBEZXZpY2UsIDAsIDApOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIGlmKEN1cnJlbnRMaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0RPV04pCi0gICAgewotCUxNX0ZvcmNlQXV0b05lZyhwRGV2aWNlLCBwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUpOwotCi0JLyogSWYgd2UgZm9yY2UgbGluZSBzcGVlZCwgd2UgbWFrZSBnZXQgbGluayByaWdodCBhd2F5LiAqLwotCUxNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKLQlMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7Ci0JaWYoVmFsdWUzMiAmIFBIWV9TVEFUVVNfTElOS19QQVNTKQotCXsKLQkgICAgQ3VycmVudExpbmtTdGF0dXMgPSBMTV9TVEFUVVNfTElOS19BQ1RJVkU7Ci0JfQotICAgIH0KLQotICAgIC8qIEdNSUkgaW50ZXJmYWNlLiAqLwotICAgIHBEZXZpY2UtPk1hY01vZGUgJj0gfk1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLOwotICAgIGlmKEN1cnJlbnRMaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0FDVElWRSkKLSAgICB7Ci0JaWYocERldmljZS0+TGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTAwTUJQUyB8fAotCSAgICBwRGV2aWNlLT5MaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xME1CUFMpCi0JewotCSAgICBwRGV2aWNlLT5NYWNNb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9NSUk7Ci0JfQotCWVsc2UKLQl7Ci0JICAgIHBEZXZpY2UtPk1hY01vZGUgfD0gTUFDX01PREVfUE9SVF9NT0RFX0dNSUk7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQlwRGV2aWNlLT5NYWNNb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgTUFDIHRvIG9wZXJhdGUgaW4gdGhlIGFwcHJvcHJpYXRlIGR1cGxleCBtb2RlLiAqLwotICAgIHBEZXZpY2UtPk1hY01vZGUgJj0gfk1BQ19NT0RFX0hBTEZfRFVQTEVYOwotICAgIGlmKHBEZXZpY2UtPkR1cGxleE1vZGUgPT0gTE1fRFVQTEVYX01PREVfSEFMRikKLSAgICB7Ci0JcERldmljZS0+TWFjTW9kZSB8PSBNQUNfTU9ERV9IQUxGX0RVUExFWDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIGxpbmsgcG9sYXJpdHkgYml0LiAqLwotICAgIHBEZXZpY2UtPk1hY01vZGUgJj0gfk1BQ19NT0RFX0xJTktfUE9MQVJJVFk7Ci0gICAgaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKQotICAgIHsKLQlpZigocERldmljZS0+TGVkTW9kZSA9PSBMRURfTU9ERV9MSU5LMTApIHx8Ci0JICAgICAoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfQUNUSVZFICYmCi0JICAgICBwRGV2aWNlLT5MaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xME1CUFMpKQotCXsKLQkgICAgcERldmljZS0+TWFjTW9kZSB8PSBNQUNfTU9ERV9MSU5LX1BPTEFSSVRZOwotCX0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlpZiAoQ3VycmVudExpbmtTdGF0dXMgPT0gTE1fU1RBVFVTX0xJTktfQUNUSVZFKQotCXsKLQkgICAgcERldmljZS0+TWFjTW9kZSB8PSBNQUNfTU9ERV9MSU5LX1BPTEFSSVRZOwogCX0KIAotCS8qIFNldCBMRUQgbW9kZS4gKi8KLQlpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKLQkgICAgVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKQotCXsKLQkgICAgVmFsdWUzMiA9IExFRF9DVFJMX1BIWV9NT0RFXzE7CisJLyogR01JSSBpbnRlcmZhY2UuICovCisJcERldmljZS0+TWFjTW9kZSAmPSB+TUFDX01PREVfUE9SVF9NT0RFX01BU0s7CisJaWYgKEN1cnJlbnRMaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0FDVElWRSkgeworCQlpZiAocERldmljZS0+TGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTAwTUJQUyB8fAorCQkgICAgcERldmljZS0+TGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTBNQlBTKSB7CisJCQlwRGV2aWNlLT5NYWNNb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9NSUk7CisJCX0gZWxzZSB7CisJCQlwRGV2aWNlLT5NYWNNb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJOworCQl9CisJfSBlbHNlIHsKKwkJcERldmljZS0+TWFjTW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfR01JSTsKIAl9Ci0JZWxzZQotCXsKLQkgICAgaWYocERldmljZS0+TGVkTW9kZSA9PSBMRURfTU9ERV9PVVRQVVQpCi0JICAgIHsKLQkJVmFsdWUzMiA9IExFRF9DVFJMX1BIWV9NT0RFXzI7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCVZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8xOwotCSAgICB9CisKKwkvKiBTZXQgdGhlIE1BQyB0byBvcGVyYXRlIGluIHRoZSBhcHByb3ByaWF0ZSBkdXBsZXggbW9kZS4gKi8KKwlwRGV2aWNlLT5NYWNNb2RlICY9IH5NQUNfTU9ERV9IQUxGX0RVUExFWDsKKwlpZiAocERldmljZS0+RHVwbGV4TW9kZSA9PSBMTV9EVVBMRVhfTU9ERV9IQUxGKSB7CisJCXBEZXZpY2UtPk1hY01vZGUgfD0gTUFDX01PREVfSEFMRl9EVVBMRVg7CiAJfQotCVJFR19XUihwRGV2aWNlLCBNYWNDdHJsLkxlZEN0cmwsIFZhbHVlMzIpOwotICAgIH0KIAotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIHBEZXZpY2UtPk1hY01vZGUpOworCS8qIFNldCB0aGUgbGluayBwb2xhcml0eSBiaXQuICovCisJcERldmljZS0+TWFjTW9kZSAmPSB+TUFDX01PREVfTElOS19QT0xBUklUWTsKKwlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkgeworCQlpZiAoKHBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfTElOSzEwKSB8fAorCQkgICAgKEN1cnJlbnRMaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0FDVElWRSAmJgorCQkgICAgIHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwTUJQUykpIHsKKwkJCXBEZXZpY2UtPk1hY01vZGUgfD0gTUFDX01PREVfTElOS19QT0xBUklUWTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChDdXJyZW50TGlua1N0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19BQ1RJVkUpIHsKKwkJCXBEZXZpY2UtPk1hY01vZGUgfD0gTUFDX01PREVfTElOS19QT0xBUklUWTsKKwkJfQogCi0gICAgLyogRW5hYmxlIGF1dG8gcG9sbGluZy4gKi8KLSAgICBpZihwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9BVVRPX1BPTExJTkcpCi0gICAgewotCXBEZXZpY2UtPk1pTW9kZSB8PSBNSV9NT0RFX0FVVE9fUE9MTElOR19FTkFCTEU7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWlNb2RlLCBwRGV2aWNlLT5NaU1vZGUpOwotICAgIH0KLQotICAgIC8qIEVuYWJsZSBwaHkgbGluayBjaGFuZ2UgYXR0ZW50aW9uLiAqLwotICAgIGlmKHBEZXZpY2UtPlBoeUludE1vZGUgPT0gVDNfUEhZX0lOVF9NT0RFX01JX0lOVEVSUlVQVCkKLSAgICB7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWFjRXZlbnQsIE1BQ19FVkVOVF9FTkFCTEVfTUlfSU5URVJSVVBUKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5NYWNFdmVudCwKLQkgICAgTUFDX0VWRU5UX0VOQUJMRV9MSU5LX1NUQVRFX0NIQU5HRURfQVRUTik7Ci0gICAgfQotICAgIGlmICgoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKSAmJgotCShDdXJyZW50TGlua1N0YXR1cyA9PSBMTV9TVEFUVVNfTElOS19BQ1RJVkUpICYmCi0JKHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTKSAmJgotCSgoKHBEZXZpY2UtPlBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0NPTlZFTlRJT05BTF9QQ0lfTU9ERSkgJiYKLQkgIChwRGV2aWNlLT5QY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9CVVNfU1BFRURfSElHSCkpIHx8Ci0JICEocERldmljZS0+UGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKSkpCi0gICAgewotCU1NX1dhaXQoMTIwKTsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5TdGF0dXMsIE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKLQkgICAgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCk7Ci0JTUVNX1dSX09GRlNFVChwRGV2aWNlLCBUM19GSVJNV0FSRV9NQUlMQk9YLAotCSAgICBUM19NQUdJQ19OVU1fRElTQUJMRV9ETUFXX09OX0xJTktfQ0hBTkdFKTsKLSAgICB9Ci0KLSAgICAvKiBJbmRpY2F0ZSBsaW5rIHN0YXR1cy4gKi8KLSAgICBpZiAocERldmljZS0+TGlua1N0YXR1cyAhPSBDdXJyZW50TGlua1N0YXR1cykgewotCXBEZXZpY2UtPkxpbmtTdGF0dXMgPSBDdXJyZW50TGlua1N0YXR1czsKLQlNTV9JbmRpY2F0ZVN0YXR1cyhwRGV2aWNlLCBDdXJyZW50TGlua1N0YXR1cyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotfSAvKiBMTV9TZXR1cENvcHBlclBoeSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxNX1NUQVRVUwotTE1fU2V0dXBQaHkoCi0gICAgUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlKQotewotICAgIExNX1NUQVRVUyBMbVN0YXR1czsKLSAgICBMTV9VSU5UMzIgVmFsdWUzMjsKLQotI2lmIElOQ0xVREVfVEJJX1NVUFBPUlQKLSAgICBpZihwRGV2aWNlLT5FbmFibGVUYmkpCi0gICAgewotCUxtU3RhdHVzID0gTE1fU2V0dXBGaWJlclBoeShwRGV2aWNlKTsKLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmIC8qIElOQ0xVREVfVEJJX1NVUFBPUlQgKi8KLSAgICB7Ci0JTG1TdGF0dXMgPSBMTV9TZXR1cENvcHBlclBoeShwRGV2aWNlKTsKLSAgICB9Ci0gICAgaWYgKHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDRfQTApCi0gICAgewotCWlmICghKHBEZXZpY2UtPlBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0NPTlZFTlRJT05BTF9QQ0lfTU9ERSkpCi0JewotCSAgICBWYWx1ZTMyID0gUkVHX1JEKHBEZXZpY2UsIFBjaUNmZy5QY2lTdGF0ZSk7Ci0JICAgIFJFR19XUihwRGV2aWNlLCBQY2lDZmcuUGNpU3RhdGUsCi0JCVZhbHVlMzIgfCBUM19QQ0lfU1RBVEVfUkVUUllfU0FNRV9ETUEpOworCQkvKiBTZXQgTEVEIG1vZGUuICovCisJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8CisJCSAgICBUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKSB7CisJCQlWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwRGV2aWNlLT5MZWRNb2RlID09IExFRF9NT0RFX09VVFBVVCkgeworCQkJCVZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8yOworCQkJfSBlbHNlIHsKKwkJCQlWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMTsKKwkJCX0KKwkJfQorCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTGVkQ3RybCwgVmFsdWUzMik7CiAJfQotICAgIH0KLSAgICBpZiAoKHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTKSAmJgotCShwRGV2aWNlLT5EdXBsZXhNb2RlID09IExNX0RVUExFWF9NT0RFX0hBTEYpKQotICAgIHsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5UeExlbmd0aHMsIDB4MjZmZik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuVHhMZW5ndGhzLCAweDI2MjApOwotICAgIH0KIAotICAgIHJldHVybiBMbVN0YXR1czsKLX0KKwlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgcERldmljZS0+TWFjTW9kZSk7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fVk9JRAotTE1fUmVhZFBoeSgKLVBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKLUxNX1VJTlQzMiBQaHlSZWcsCi1QTE1fVUlOVDMyIHBEYXRhMzIpIHsKLSAgICBMTV9VSU5UMzIgVmFsdWUzMjsKLSAgICBMTV9VSU5UMzIgajsKLQotICAgIGlmKHBEZXZpY2UtPlBoeUludE1vZGUgPT0gVDNfUEhZX0lOVF9NT0RFX0FVVE9fUE9MTElORykKLSAgICB7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWlNb2RlLCBwRGV2aWNlLT5NaU1vZGUgJgotCSAgICB+TUlfTU9ERV9BVVRPX1BPTExJTkdfRU5BQkxFKTsKLQlNTV9XYWl0KDQwKTsKLSAgICB9Ci0KLSAgICBWYWx1ZTMyID0gKHBEZXZpY2UtPlBoeUFkZHIgPDwgTUlfQ09NX0ZJUlNUX1BIWV9BRERSX0JJVCkgfAotCSgoUGh5UmVnICYgTUlfQ09NX1BIWV9SRUdfQUREUl9NQVNLKSA8PCBNSV9DT01fRklSU1RfUEhZX1JFR19BRERSX0JJVCkgfAotCU1JX0NPTV9DTURfUkVBRCB8IE1JX0NPTV9TVEFSVDsKLQotICAgIFJFR19XUihwRGV2aWNlLCBNYWNDdHJsLk1pQ29tLCBWYWx1ZTMyKTsKLQotICAgIGZvcihqID0gMDsgaiA8IDIwOyBqKyspCi0gICAgewotCU1NX1dhaXQoMjUpOwotCi0JVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBNYWNDdHJsLk1pQ29tKTsKLQotCWlmKCEoVmFsdWUzMiAmIE1JX0NPTV9CVVNZKSkKLQl7Ci0JICAgIE1NX1dhaXQoNSk7Ci0JICAgIFZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgTWFjQ3RybC5NaUNvbSk7Ci0JICAgIFZhbHVlMzIgJj0gTUlfQ09NX1BIWV9EQVRBX01BU0s7Ci0JICAgIGJyZWFrOworCS8qIEVuYWJsZSBhdXRvIHBvbGxpbmcuICovCisJaWYgKHBEZXZpY2UtPlBoeUludE1vZGUgPT0gVDNfUEhZX0lOVF9NT0RFX0FVVE9fUE9MTElORykgeworCQlwRGV2aWNlLT5NaU1vZGUgfD0gTUlfTU9ERV9BVVRPX1BPTExJTkdfRU5BQkxFOworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTWlNb2RlLCBwRGV2aWNlLT5NaU1vZGUpOwogCX0KLSAgICB9CiAKLSAgICBpZihWYWx1ZTMyICYgTUlfQ09NX0JVU1kpCi0gICAgewotCVZhbHVlMzIgPSAwOwotICAgIH0KLQotICAgICpwRGF0YTMyID0gVmFsdWUzMjsKLQotICAgIGlmKHBEZXZpY2UtPlBoeUludE1vZGUgPT0gVDNfUEhZX0lOVF9NT0RFX0FVVE9fUE9MTElORykKLSAgICB7Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTWlNb2RlLCBwRGV2aWNlLT5NaU1vZGUpOwotCU1NX1dhaXQoNDApOwotICAgIH0KLX0gLyogTE1fUmVhZFBoeSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fVk9JRAotTE1fV3JpdGVQaHkoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi1MTV9VSU5UMzIgUGh5UmVnLAotTE1fVUlOVDMyIERhdGEzMikgewotICAgIExNX1VJTlQzMiBWYWx1ZTMyOwotICAgIExNX1VJTlQzMiBqOwotCi0gICAgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUT19QT0xMSU5HKQotICAgIHsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5NaU1vZGUsIHBEZXZpY2UtPk1pTW9kZSAmCi0JICAgIH5NSV9NT0RFX0FVVE9fUE9MTElOR19FTkFCTEUpOwotCU1NX1dhaXQoNDApOwotICAgIH0KLQotICAgIFZhbHVlMzIgPSAocERldmljZS0+UGh5QWRkciA8PCBNSV9DT01fRklSU1RfUEhZX0FERFJfQklUKSB8Ci0JKChQaHlSZWcgJiBNSV9DT01fUEhZX1JFR19BRERSX01BU0spIDw8IE1JX0NPTV9GSVJTVF9QSFlfUkVHX0FERFJfQklUKSB8Ci0JKERhdGEzMiAmIE1JX0NPTV9QSFlfREFUQV9NQVNLKSB8IE1JX0NPTV9DTURfV1JJVEUgfCBNSV9DT01fU1RBUlQ7Ci0KLSAgICBSRUdfV1IocERldmljZSwgTWFjQ3RybC5NaUNvbSwgVmFsdWUzMik7Ci0KLSAgICBmb3IoaiA9IDA7IGogPCAyMDsgaisrKQotICAgIHsKLQlNTV9XYWl0KDI1KTsKLQotCVZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgTWFjQ3RybC5NaUNvbSk7Ci0KLQlpZighKFZhbHVlMzIgJiBNSV9DT01fQlVTWSkpCi0JewotCSAgICBNTV9XYWl0KDUpOwotCSAgICBicmVhazsKKwkvKiBFbmFibGUgcGh5IGxpbmsgY2hhbmdlIGF0dGVudGlvbi4gKi8KKwlpZiAocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUKSB7CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NYWNFdmVudCwKKwkJCU1BQ19FVkVOVF9FTkFCTEVfTUlfSU5URVJSVVBUKTsKKwl9IGVsc2UgeworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTWFjRXZlbnQsCisJCQlNQUNfRVZFTlRfRU5BQkxFX0xJTktfU1RBVEVfQ0hBTkdFRF9BVFROKTsKIAl9Ci0gICAgfQorCWlmICgoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkgJiYKKwkgICAgKEN1cnJlbnRMaW5rU3RhdHVzID09IExNX1NUQVRVU19MSU5LX0FDVElWRSkgJiYKKwkgICAgKHBEZXZpY2UtPkxpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTKSAmJgorCSAgICAoKChwRGV2aWNlLT5QY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9DT05WRU5USU9OQUxfUENJX01PREUpICYmCisJICAgICAgKHBEZXZpY2UtPlBjaVN0YXRlICYgVDNfUENJX1NUQVRFX0JVU19TUEVFRF9ISUdIKSkgfHwKKwkgICAgICEocERldmljZS0+UGNpU3RhdGUgJiBUM19QQ0lfU1RBVEVfQ09OVkVOVElPTkFMX1BDSV9NT0RFKSkpIHsKKwkJTU1fV2FpdCAoMTIwKTsKKwkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlN0YXR1cywgTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQkJTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCk7CisJCU1FTV9XUl9PRkZTRVQgKHBEZXZpY2UsIFQzX0ZJUk1XQVJFX01BSUxCT1gsCisJCQkgICAgICAgVDNfTUFHSUNfTlVNX0RJU0FCTEVfRE1BV19PTl9MSU5LX0NIQU5HRSk7CisJfQogCi0gICAgaWYocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUT19QT0xMSU5HKQotICAgIHsKLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5NaU1vZGUsIHBEZXZpY2UtPk1pTW9kZSk7Ci0JTU1fV2FpdCg0MCk7Ci0gICAgfQotfSAvKiBMTV9Xcml0ZVBoeSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fU1RBVFVTCi1MTV9TZXRQb3dlclN0YXRlKAotUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotTE1fUE9XRVJfU1RBVEUgUG93ZXJMZXZlbCkgewotICAgIExNX1VJTlQzMiBQbWVTdXBwb3J0OwotICAgIExNX1VJTlQzMiBWYWx1ZTMyOwotICAgIExNX1VJTlQzMiBQbUN0cmw7Ci0KLSAgICAvKiBtYWtlIHN1cmVpbmRpcmVjdCBhY2Nlc3NlcyBhcmUgZW5hYmxlZCovCi0gICAgTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBUM19QQ0lfTUlTQ19IT1NUX0NUUkxfUkVHLCBwRGV2aWNlLT5NaXNjSG9zdEN0cmwpOwotCi0gICAgLyogQ2xlYXIgdGhlIFBNRV9BU1NFUlQgYml0IGFuZCB0aGUgcG93ZXIgc3RhdGUgYml0cy4gIEFsc28gZW5hYmxlICovCi0gICAgLyogdGhlIFBNRSBiaXQuICovCi0gICAgTU1fUmVhZENvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9QTV9TVEFUVVNfQ1RSTF9SRUcsICZQbUN0cmwpOwotCi0gICAgUG1DdHJsIHw9IFQzX1BNX1BNRV9BU1NFUlRFRDsKLSAgICBQbUN0cmwgJj0gflQzX1BNX1BPV0VSX1NUQVRFX01BU0s7Ci0KLSAgICAvKiBTZXQgdGhlIGFwcHJvcHJpYXRlIHBvd2VyIHN0YXRlLiAqLwotICAgIGlmKFBvd2VyTGV2ZWwgPT0gTE1fUE9XRVJfU1RBVEVfRDApCi0gICAgewotCi0JLyogQnJpbmcgdGhlIGNhcmQgb3V0IG9mIGxvdyBwb3dlciBtb2RlLiAqLwotCVBtQ3RybCB8PSBUM19QTV9QT1dFUl9TVEFURV9EMDsKLQlNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9QTV9TVEFUVVNfQ1RSTF9SRUcsIFBtQ3RybCk7Ci0KLQlSRUdfV1IocERldmljZSwgR3JjLkxvY2FsQ3RybCwgcERldmljZS0+R3JjTG9jYWxDdHJsKTsKLQlNTV9XYWl0ICg0MCk7Ci0jaWYgMCAgIC8qIEJ1Z2ZpeCBieSBqbWIuLi5jYW4ndCBjYWxsIFdyaXRlUGh5IGhlcmUgYmVjYXVzZSBwRGV2aWNlIG5vdCBmdWxseSBpbml0aWFsaXplZCAqLwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MDFfQVVYX0NUUkwsIDB4MDIpOwotI2VuZGlmCisJLyogSW5kaWNhdGUgbGluayBzdGF0dXMuICovCisJaWYgKHBEZXZpY2UtPkxpbmtTdGF0dXMgIT0gQ3VycmVudExpbmtTdGF0dXMpIHsKKwkJcERldmljZS0+TGlua1N0YXR1cyA9IEN1cnJlbnRMaW5rU3RhdHVzOworCQlNTV9JbmRpY2F0ZVN0YXR1cyAocERldmljZSwgQ3VycmVudExpbmtTdGF0dXMpOworCX0KIAogCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLSAgICB9Ci0gICAgZWxzZSBpZihQb3dlckxldmVsID09IExNX1BPV0VSX1NUQVRFX0QxKQotICAgIHsKLQlQbUN0cmwgfD0gVDNfUE1fUE9XRVJfU1RBVEVfRDE7Ci0gICAgfQotICAgIGVsc2UgaWYoUG93ZXJMZXZlbCA9PSBMTV9QT1dFUl9TVEFURV9EMikKLSAgICB7Ci0JUG1DdHJsIHw9IFQzX1BNX1BPV0VSX1NUQVRFX0QyOwotICAgIH0KLSAgICBlbHNlIGlmKFBvd2VyTGV2ZWwgPT0gTE1fUE9XRVJfU1RBVEVfRDMpCi0gICAgewotCVBtQ3RybCB8PSBUM19QTV9QT1dFUl9TVEFURV9EMzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7Ci0gICAgfQotICAgIFBtQ3RybCB8PSBUM19QTV9QTUVfRU5BQkxFOwotCi0gICAgLyogTWFzayBvdXQgYWxsIGludGVycnVwdHMgc28gTE1fU2V0dXBQaHkgd29uJ3QgYmUgY2FsbGVkIHdoaWxlIHdlIGFyZSAqLwotICAgIC8qIHNldHRpbmcgbmV3IGxpbmUgc3BlZWQuICovCi0gICAgVmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBQY2lDZmcuTWlzY0hvc3RDdHJsKTsKLSAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLk1pc2NIb3N0Q3RybCwgVmFsdWUzMiB8IE1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCk7Ci0KLSAgICBpZighcERldmljZS0+UmVzdG9yZU9uV2FrZVVwKQotICAgIHsKLQlwRGV2aWNlLT5SZXN0b3JlT25XYWtlVXAgPSBUUlVFOwotCXBEZXZpY2UtPldha2VVcERpc2FibGVBdXRvTmVnID0gcERldmljZS0+RGlzYWJsZUF1dG9OZWc7Ci0JcERldmljZS0+V2FrZVVwUmVxdWVzdGVkTWVkaWFUeXBlID0gcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlOwotICAgIH0KLQotICAgIC8qIEZvcmNlIGF1dG8tbmVnb3RpYXRpb24gdG8gMTAgbGluZSBzcGVlZC4gKi8KLSAgICBwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9IEZBTFNFOwotICAgIHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9IExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF8xME1CUFM7Ci0gICAgTE1fU2V0dXBQaHkocERldmljZSk7Ci0KLSAgICAvKiBQdXQgdGhlIGRyaXZlciBpbiB0aGUgaW5pdGlhbCBzdGF0ZSwgYW5kIGdvIHRocm91Z2ggdGhlIHBvd2VyIGRvd24gKi8KLSAgICAvKiBzZXF1ZW5jZS4gKi8KLSAgICBMTV9IYWx0KHBEZXZpY2UpOwotCi0gICAgTU1fUmVhZENvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9QTV9DQVBfUkVHLCAmUG1lU3VwcG9ydCk7Ci0KLSAgICBpZiAocERldmljZS0+V2FrZVVwTW9kZUNhcCAhPSBMTV9XQUtFX1VQX01PREVfTk9ORSkKLSAgICB7Ci0KLQkvKiBFbmFibGUgV09MLiAqLwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MDFfQVVYX0NUUkwsIDB4NWEpOwotCU1NX1dhaXQoNDApOwotCi0JLyogU2V0IExFRCBtb2RlLiAqLwotCWlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAotCSAgICBUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpCi0JewotCSAgICBWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgaWYocERldmljZS0+TGVkTW9kZSA9PSBMRURfTU9ERV9PVVRQVVQpCi0JICAgIHsKLQkJVmFsdWUzMiA9IExFRF9DVFJMX1BIWV9NT0RFXzI7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCVZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8xOwotCSAgICB9Ci0JfQotCi0JVmFsdWUzMiA9IE1BQ19NT0RFX1BPUlRfTU9ERV9NSUk7Ci0JaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwKQotCXsKLQkgICAgaWYocERldmljZS0+TGVkTW9kZSA9PSBMRURfTU9ERV9MSU5LMTAgfHwKLQkJcERldmljZS0+V29sU3BlZWQgPT0gV09MX1NQRUVEXzEwTUIpCi0JICAgIHsKLQkJVmFsdWUzMiB8PSBNQUNfTU9ERV9MSU5LX1BPTEFSSVRZOwotCSAgICB9Ci0JfQotCWVsc2UKLQl7Ci0JICAgIFZhbHVlMzIgfD0gTUFDX01PREVfTElOS19QT0xBUklUWTsKLQl9Ci0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTW9kZSwgVmFsdWUzMik7Ci0JTU1fV2FpdCg0MCk7IE1NX1dhaXQoNDApOyBNTV9XYWl0KDQwKTsKLQotCS8qIEFsd2F5cyBlbmFibGUgbWFnaWMgcGFja2V0IHdha2UtdXAgaWYgd2UgaGF2ZSB2YXV4LiAqLwotCWlmKChQbWVTdXBwb3J0ICYgVDNfUENJX1BNX0NBUF9QTUVfRDNDT0xEKSAmJgotCSAgICAocERldmljZS0+V2FrZVVwTW9kZUNhcCAmIExNX1dBS0VfVVBfTU9ERV9NQUdJQ19QQUNLRVQpKQotCXsKLQkgICAgVmFsdWUzMiB8PSBNQUNfTU9ERV9ERVRFQ1RfTUFHSUNfUEFDS0VUX0VOQUJMRTsKLQl9Ci0KLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5Nb2RlLCBWYWx1ZTMyKTsKLQotCS8qIEVuYWJsZSB0aGUgcmVjZWl2ZXIuICovCi0JUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuUnhNb2RlLCBSWF9NT0RFX0VOQUJMRSk7Ci0gICAgfQotCi0gICAgLyogRGlzYWJsZSB0eC9yeCBjbG9ja3MsIGFuZCBzZWxldGVjdCBhbiBhbHRlcm5hdGUgY2xvY2suICovCi0gICAgaWYocERldmljZS0+V29sU3BlZWQgPT0gV09MX1NQRUVEXzEwME1CKQotICAgIHsKLQlpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKLQkgICAgVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKQotCXsKLQkgICAgVmFsdWUzMiA9IFQzX1BDSV9ESVNBQkxFX1JYX0NMT0NLIHwgVDNfUENJX0RJU0FCTEVfVFhfQ0xPQ0sgfAotCQlUM19QQ0lfU0VMRUNUX0FMVEVSTkFURV9DTE9DSzsKLQl9Ci0JZWxzZQotCXsKLQkgICAgVmFsdWUzMiA9IFQzX1BDSV9TRUxFQ1RfQUxURVJOQVRFX0NMT0NLOwotCX0KLQlSRUdfV1IocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCwgVmFsdWUzMik7Ci0KLQlNTV9XYWl0KDQwKTsKLQotCWlmKFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAotCSAgICBUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpCi0JewotCSAgICBWYWx1ZTMyID0gVDNfUENJX0RJU0FCTEVfUlhfQ0xPQ0sgfCBUM19QQ0lfRElTQUJMRV9UWF9DTE9DSyB8Ci0JCVQzX1BDSV9TRUxFQ1RfQUxURVJOQVRFX0NMT0NLIHwgVDNfUENJXzQ0TUhaX0NPUkVfQ0xPQ0s7Ci0JfQotCWVsc2UKLQl7Ci0JICAgIFZhbHVlMzIgPSBUM19QQ0lfU0VMRUNUX0FMVEVSTkFURV9DTE9DSyB8Ci0JCVQzX1BDSV80NE1IWl9DT1JFX0NMT0NLOwotCX0KLQotCVJFR19XUihwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsLCBWYWx1ZTMyKTsKLQotCU1NX1dhaXQoNDApOwotCi0JaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8Ci0JICAgIFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkKLQl7Ci0JICAgIFZhbHVlMzIgPSBUM19QQ0lfRElTQUJMRV9SWF9DTE9DSyB8IFQzX1BDSV9ESVNBQkxFX1RYX0NMT0NLIHwKLQkJVDNfUENJXzQ0TUhaX0NPUkVfQ0xPQ0s7Ci0JfQotCWVsc2UKLQl7Ci0JICAgIFZhbHVlMzIgPSBUM19QQ0lfNDRNSFpfQ09SRV9DTE9DSzsKLQl9Ci0KLQlSRUdfV1IocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCwgVmFsdWUzMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8Ci0JICAgIFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkKLQl7Ci0JICAgIFZhbHVlMzIgPSBUM19QQ0lfRElTQUJMRV9SWF9DTE9DSyB8IFQzX1BDSV9ESVNBQkxFX1RYX0NMT0NLIHwKLQkJVDNfUENJX1NFTEVDVF9BTFRFUk5BVEVfQ0xPQ0sgfAotCQlUM19QQ0lfUE9XRVJfRE9XTl9QQ0lfUExMMTMzOwotCX0KLQllbHNlCi0JewotCSAgICBWYWx1ZTMyID0gVDNfUENJX1NFTEVDVF9BTFRFUk5BVEVfQ0xPQ0sgfAotCQlUM19QQ0lfUE9XRVJfRE9XTl9QQ0lfUExMMTMzOwotCX0KLQotCVJFR19XUihwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsLCBWYWx1ZTMyKTsKLSAgICB9Ci0KLSAgICBNTV9XYWl0KDQwKTsKLQotICAgIGlmKCFwRGV2aWNlLT5FZXByb21XcCAmJiAocERldmljZS0+V2FrZVVwTW9kZUNhcCAhPSBMTV9XQUtFX1VQX01PREVfTk9ORSkpCi0gICAgewotCS8qIFN3aXRjaCBhZGFwdGVyIHRvIGF1eGlsbGlhcnkgcG93ZXIuICovCi0JaWYoVDNfQVNJQ19SRVYocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8Ci0JICAgIFQzX0FTSUNfUkVWKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkKLQl7Ci0JICAgIC8qIEdQSU8wID0gMSwgR1BJTzEgPSAxLCBHUElPMiA9IDAuICovCi0JICAgIFJFR19XUihwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBwRGV2aWNlLT5HcmNMb2NhbEN0cmwgfAotCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UwIHwKLQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMSB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTIgfAotCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMCB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQxKTsKLQkJTU1fV2FpdCg0MCk7Ci0JfQotCWVsc2UKLQl7Ci0JICAgIC8qIEdQSU8wID0gMCwgR1BJTzEgPSAxLCBHUElPMiA9IDEuICovCi0JICAgIFJFR19XUihwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBwRGV2aWNlLT5HcmNMb2NhbEN0cmwgfAotCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UwIHwKLQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMSB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTIgfAotCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMSB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQyKTsKLQkJTU1fV2FpdCg0MCk7Ci0KLQkgICAgLyogR1BJTzAgPSAxLCBHUElPMSA9IDEsIEdQSU8yID0gMS4gKi8KLQkgICAgUkVHX1dSKHBEZXZpY2UsIEdyYy5Mb2NhbEN0cmwsIHBEZXZpY2UtPkdyY0xvY2FsQ3RybCB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTAgfAotCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UxIHwKLQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMiB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQwIHwKLQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDEgfAotCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMik7Ci0JCU1NX1dhaXQoNDApOwotCi0JICAgIC8qIEdQSU8wID0gMSwgR1BJTzEgPSAxLCBHUElPMiA9IDAuICovCi0JICAgIFJFR19XUihwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBwRGV2aWNlLT5HcmNMb2NhbEN0cmwgfAotCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UwIHwKLQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMSB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTIgfAotCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMCB8Ci0JCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQxKTsKLQkJTU1fV2FpdCg0MCk7Ci0JfQotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcGh5IHRvIGxvdyBwb3dlciBtb2RlLiAqLwotICAgIC8qIFB1dCB0aGUgdGhlIGhhcmR3YXJlIGluIGxvdyBwb3dlciBtb2RlLiAqLwotICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX1BNX1NUQVRVU19DVFJMX1JFRywgUG1DdHJsKTsKLQotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLX0gLyogTE1fU2V0UG93ZXJTdGF0ZSAqLwotCit9CQkJCS8qIExNX1NldHVwQ29wcGVyUGh5ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIExNX1VJTlQzMgotR2V0UGh5QWRGbG93Q250cmxTZXR0aW5ncygKLSAgICBQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCitMTV9TVEFUVVMgTE1fU2V0dXBQaHkgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSkKIHsKLSAgICBMTV9VSU5UMzIgVmFsdWUzMjsKKwlMTV9TVEFUVVMgTG1TdGF0dXM7CisJTE1fVUlOVDMyIFZhbHVlMzI7CiAKLSAgICBWYWx1ZTMyID0gMDsKKyNpZiBJTkNMVURFX1RCSV9TVVBQT1JUCisJaWYgKHBEZXZpY2UtPkVuYWJsZVRiaSkgeworCQlMbVN0YXR1cyA9IExNX1NldHVwRmliZXJQaHkgKHBEZXZpY2UpOworCX0gZWxzZQorI2VuZGlmCQkJCS8qIElOQ0xVREVfVEJJX1NVUFBPUlQgKi8KKwl7CisJCUxtU3RhdHVzID0gTE1fU2V0dXBDb3BwZXJQaHkgKHBEZXZpY2UpOworCX0KKwlpZiAocERldmljZS0+Q2hpcFJldklkID09IFQzX0NISVBfSURfNTcwNF9BMCkgeworCQlpZiAoIShwRGV2aWNlLT5QY2lTdGF0ZSAmIFQzX1BDSV9TVEFURV9DT05WRU5USU9OQUxfUENJX01PREUpKSB7CisJCQlWYWx1ZTMyID0gUkVHX1JEIChwRGV2aWNlLCBQY2lDZmcuUGNpU3RhdGUpOworCQkJUkVHX1dSIChwRGV2aWNlLCBQY2lDZmcuUGNpU3RhdGUsCisJCQkJVmFsdWUzMiB8IFQzX1BDSV9TVEFURV9SRVRSWV9TQU1FX0RNQSk7CisJCX0KKwl9CisJaWYgKChwRGV2aWNlLT5MaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xMDAwTUJQUykgJiYKKwkgICAgKHBEZXZpY2UtPkR1cGxleE1vZGUgPT0gTE1fRFVQTEVYX01PREVfSEFMRikpIHsKKwkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLlR4TGVuZ3RocywgMHgyNmZmKTsKKwl9IGVsc2UgeworCQlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuVHhMZW5ndGhzLCAweDI2MjApOworCX0KIAotICAgIC8qIEF1dG8gbmVnb3RpYXRpb24gZmxvdyBjb250cm9sIG9ubHkgd2hlbiBhdXRvbmVnb3RpYXRpb24gaXMgZW5hYmxlZC4gKi8KLSAgICBpZihwRGV2aWNlLT5EaXNhYmxlQXV0b05lZyA9PSBGQUxTRSB8fAotCXBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZSA9PSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9BVVRPIHx8Ci0JcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID09IExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF9BVVRPKQotICAgIHsKLQkvKiBQbGVhc2UgcmVmZXIgdG8gVGFibGUgMjhCLTMgb2YgdGhlIDgwMi4zYWItMTk5OSBzcGVjLiAqLwotCWlmKChwRGV2aWNlLT5GbG93Q29udHJvbENhcCA9PSBMTV9GTE9XX0NPTlRST0xfQVVUT19QQVVTRSkgfHwKLQkgICAgKChwRGV2aWNlLT5GbG93Q29udHJvbENhcCAmIExNX0ZMT1dfQ09OVFJPTF9SRUNFSVZFX1BBVVNFKSAmJgotCSAgICAocERldmljZS0+Rmxvd0NvbnRyb2xDYXAgJiBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0UpKSkKLQl7Ci0JICAgIFZhbHVlMzIgfD0gUEhZX0FOX0FEX1BBVVNFX0NBUEFCTEU7Ci0JfQotCWVsc2UgaWYocERldmljZS0+Rmxvd0NvbnRyb2xDYXAgJiBMTV9GTE9XX0NPTlRST0xfVFJBTlNNSVRfUEFVU0UpCi0JewotCSAgICBWYWx1ZTMyIHw9IFBIWV9BTl9BRF9BU1lNX1BBVVNFOwotCX0KLQllbHNlIGlmKHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwICYgTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0UpCi0JewotCSAgICBWYWx1ZTMyIHw9IFBIWV9BTl9BRF9QQVVTRV9DQVBBQkxFIHwgUEhZX0FOX0FEX0FTWU1fUEFVU0U7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBWYWx1ZTMyOworCXJldHVybiBMbVN0YXR1czsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMTV9WT0lECitMTV9SZWFkUGh5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBQaHlSZWcsIFBMTV9VSU5UMzIgcERhdGEzMikKK3sKKwlMTV9VSU5UMzIgVmFsdWUzMjsKKwlMTV9VSU5UMzIgajsKKworCWlmIChwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9BVVRPX1BPTExJTkcpIHsKKwkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1pTW9kZSwgcERldmljZS0+TWlNb2RlICYKKwkJCX5NSV9NT0RFX0FVVE9fUE9MTElOR19FTkFCTEUpOworCQlNTV9XYWl0ICg0MCk7CisJfQorCisJVmFsdWUzMiA9IChwRGV2aWNlLT5QaHlBZGRyIDw8IE1JX0NPTV9GSVJTVF9QSFlfQUREUl9CSVQpIHwKKwkgICAgKChQaHlSZWcgJiBNSV9DT01fUEhZX1JFR19BRERSX01BU0spIDw8CisJICAgICBNSV9DT01fRklSU1RfUEhZX1JFR19BRERSX0JJVCkgfCBNSV9DT01fQ01EX1JFQUQgfCBNSV9DT01fU1RBUlQ7CisKKwlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTWlDb20sIFZhbHVlMzIpOworCisJZm9yIChqID0gMDsgaiA8IDIwOyBqKyspIHsKKwkJTU1fV2FpdCAoMjUpOworCisJCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIE1hY0N0cmwuTWlDb20pOworCisJCWlmICghKFZhbHVlMzIgJiBNSV9DT01fQlVTWSkpIHsKKwkJCU1NX1dhaXQgKDUpOworCQkJVmFsdWUzMiA9IFJFR19SRCAocERldmljZSwgTWFjQ3RybC5NaUNvbSk7CisJCQlWYWx1ZTMyICY9IE1JX0NPTV9QSFlfREFUQV9NQVNLOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoVmFsdWUzMiAmIE1JX0NPTV9CVVNZKSB7CisJCVZhbHVlMzIgPSAwOworCX0KKworCSpwRGF0YTMyID0gVmFsdWUzMjsKKworCWlmIChwRGV2aWNlLT5QaHlJbnRNb2RlID09IFQzX1BIWV9JTlRfTU9ERV9BVVRPX1BPTExJTkcpIHsKKwkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1pTW9kZSwgcERldmljZS0+TWlNb2RlKTsKKwkJTU1fV2FpdCAoNDApOworCX0KK30JCQkJLyogTE1fUmVhZFBoeSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xNX1ZPSUQKK0xNX1dyaXRlUGh5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBQaHlSZWcsIExNX1VJTlQzMiBEYXRhMzIpCit7CisJTE1fVUlOVDMyIFZhbHVlMzI7CisJTE1fVUlOVDMyIGo7CisKKwlpZiAocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUT19QT0xMSU5HKSB7CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NaU1vZGUsIHBEZXZpY2UtPk1pTW9kZSAmCisJCQl+TUlfTU9ERV9BVVRPX1BPTExJTkdfRU5BQkxFKTsKKwkJTU1fV2FpdCAoNDApOworCX0KKworCVZhbHVlMzIgPSAocERldmljZS0+UGh5QWRkciA8PCBNSV9DT01fRklSU1RfUEhZX0FERFJfQklUKSB8CisJICAgICgoUGh5UmVnICYgTUlfQ09NX1BIWV9SRUdfQUREUl9NQVNLKSA8PAorCSAgICAgTUlfQ09NX0ZJUlNUX1BIWV9SRUdfQUREUl9CSVQpIHwgKERhdGEzMiAmIE1JX0NPTV9QSFlfREFUQV9NQVNLKSB8CisJICAgIE1JX0NPTV9DTURfV1JJVEUgfCBNSV9DT01fU1RBUlQ7CisKKwlSRUdfV1IgKHBEZXZpY2UsIE1hY0N0cmwuTWlDb20sIFZhbHVlMzIpOworCisJZm9yIChqID0gMDsgaiA8IDIwOyBqKyspIHsKKwkJTU1fV2FpdCAoMjUpOworCisJCVZhbHVlMzIgPSBSRUdfUkQgKHBEZXZpY2UsIE1hY0N0cmwuTWlDb20pOworCisJCWlmICghKFZhbHVlMzIgJiBNSV9DT01fQlVTWSkpIHsKKwkJCU1NX1dhaXQgKDUpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocERldmljZS0+UGh5SW50TW9kZSA9PSBUM19QSFlfSU5UX01PREVfQVVUT19QT0xMSU5HKSB7CisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5NaU1vZGUsIHBEZXZpY2UtPk1pTW9kZSk7CisJCU1NX1dhaXQgKDQwKTsKKwl9Cit9CQkJCS8qIExNX1dyaXRlUGh5ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTE1fU1RBVFVTIExNX1NldFBvd2VyU3RhdGUgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fUE9XRVJfU1RBVEUgUG93ZXJMZXZlbCkKK3sKKwlMTV9VSU5UMzIgUG1lU3VwcG9ydDsKKwlMTV9VSU5UMzIgVmFsdWUzMjsKKwlMTV9VSU5UMzIgUG1DdHJsOworCisJLyogbWFrZSBzdXJlaW5kaXJlY3QgYWNjZXNzZXMgYXJlIGVuYWJsZWQgKi8KKwlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfTUlTQ19IT1NUX0NUUkxfUkVHLAorCQkJICBwRGV2aWNlLT5NaXNjSG9zdEN0cmwpOworCisJLyogQ2xlYXIgdGhlIFBNRV9BU1NFUlQgYml0IGFuZCB0aGUgcG93ZXIgc3RhdGUgYml0cy4gIEFsc28gZW5hYmxlICovCisJLyogdGhlIFBNRSBiaXQuICovCisJTU1fUmVhZENvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfUE1fU1RBVFVTX0NUUkxfUkVHLCAmUG1DdHJsKTsKKworCVBtQ3RybCB8PSBUM19QTV9QTUVfQVNTRVJURUQ7CisJUG1DdHJsICY9IH5UM19QTV9QT1dFUl9TVEFURV9NQVNLOworCisJLyogU2V0IHRoZSBhcHByb3ByaWF0ZSBwb3dlciBzdGF0ZS4gKi8KKwlpZiAoUG93ZXJMZXZlbCA9PSBMTV9QT1dFUl9TVEFURV9EMCkgeworCisJCS8qIEJyaW5nIHRoZSBjYXJkIG91dCBvZiBsb3cgcG93ZXIgbW9kZS4gKi8KKwkJUG1DdHJsIHw9IFQzX1BNX1BPV0VSX1NUQVRFX0QwOworCQlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfUE1fU1RBVFVTX0NUUkxfUkVHLCBQbUN0cmwpOworCisJCVJFR19XUiAocERldmljZSwgR3JjLkxvY2FsQ3RybCwgcERldmljZS0+R3JjTG9jYWxDdHJsKTsKKwkJTU1fV2FpdCAoNDApOworI2lmIDAJCQkJLyogQnVnZml4IGJ5IGptYi4uLmNhbid0IGNhbGwgV3JpdGVQaHkgaGVyZSBiZWNhdXNlIHBEZXZpY2Ugbm90IGZ1bGx5IGluaXRpYWxpemVkICovCisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBCQ001NDAxX0FVWF9DVFJMLCAweDAyKTsKKyNlbmRpZgorCisJCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwl9IGVsc2UgaWYgKFBvd2VyTGV2ZWwgPT0gTE1fUE9XRVJfU1RBVEVfRDEpIHsKKwkJUG1DdHJsIHw9IFQzX1BNX1BPV0VSX1NUQVRFX0QxOworCX0gZWxzZSBpZiAoUG93ZXJMZXZlbCA9PSBMTV9QT1dFUl9TVEFURV9EMikgeworCQlQbUN0cmwgfD0gVDNfUE1fUE9XRVJfU1RBVEVfRDI7CisJfSBlbHNlIGlmIChQb3dlckxldmVsID09IExNX1BPV0VSX1NUQVRFX0QzKSB7CisJCVBtQ3RybCB8PSBUM19QTV9QT1dFUl9TVEFURV9EMzsKKwl9IGVsc2UgeworCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJfQorCVBtQ3RybCB8PSBUM19QTV9QTUVfRU5BQkxFOworCisJLyogTWFzayBvdXQgYWxsIGludGVycnVwdHMgc28gTE1fU2V0dXBQaHkgd29uJ3QgYmUgY2FsbGVkIHdoaWxlIHdlIGFyZSAqLworCS8qIHNldHRpbmcgbmV3IGxpbmUgc3BlZWQuICovCisJVmFsdWUzMiA9IFJFR19SRCAocERldmljZSwgUGNpQ2ZnLk1pc2NIb3N0Q3RybCk7CisJUkVHX1dSIChwRGV2aWNlLCBQY2lDZmcuTWlzY0hvc3RDdHJsLAorCQlWYWx1ZTMyIHwgTUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UKTsKKworCWlmICghcERldmljZS0+UmVzdG9yZU9uV2FrZVVwKSB7CisJCXBEZXZpY2UtPlJlc3RvcmVPbldha2VVcCA9IFRSVUU7CisJCXBEZXZpY2UtPldha2VVcERpc2FibGVBdXRvTmVnID0gcERldmljZS0+RGlzYWJsZUF1dG9OZWc7CisJCXBEZXZpY2UtPldha2VVcFJlcXVlc3RlZE1lZGlhVHlwZSA9IHBEZXZpY2UtPlJlcXVlc3RlZE1lZGlhVHlwZTsKKwl9CisKKwkvKiBGb3JjZSBhdXRvLW5lZ290aWF0aW9uIHRvIDEwIGxpbmUgc3BlZWQuICovCisJcERldmljZS0+RGlzYWJsZUF1dG9OZWcgPSBGQUxTRTsKKwlwRGV2aWNlLT5SZXF1ZXN0ZWRNZWRpYVR5cGUgPSBMTV9SRVFVRVNURURfTUVESUFfVFlQRV9VVFBfMTBNQlBTOworCUxNX1NldHVwUGh5IChwRGV2aWNlKTsKKworCS8qIFB1dCB0aGUgZHJpdmVyIGluIHRoZSBpbml0aWFsIHN0YXRlLCBhbmQgZ28gdGhyb3VnaCB0aGUgcG93ZXIgZG93biAqLworCS8qIHNlcXVlbmNlLiAqLworCUxNX0hhbHQgKHBEZXZpY2UpOworCisJTU1fUmVhZENvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfUE1fQ0FQX1JFRywgJlBtZVN1cHBvcnQpOworCisJaWYgKHBEZXZpY2UtPldha2VVcE1vZGVDYXAgIT0gTE1fV0FLRV9VUF9NT0RFX05PTkUpIHsKKworCQkvKiBFbmFibGUgV09MLiAqLworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwMV9BVVhfQ1RSTCwgMHg1YSk7CisJCU1NX1dhaXQgKDQwKTsKKworCQkvKiBTZXQgTEVEIG1vZGUuICovCisJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8CisJCSAgICBUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKSB7CisJCQlWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwRGV2aWNlLT5MZWRNb2RlID09IExFRF9NT0RFX09VVFBVVCkgeworCQkJCVZhbHVlMzIgPSBMRURfQ1RSTF9QSFlfTU9ERV8yOworCQkJfSBlbHNlIHsKKwkJCQlWYWx1ZTMyID0gTEVEX0NUUkxfUEhZX01PREVfMTsKKwkJCX0KKwkJfQorCisJCVZhbHVlMzIgPSBNQUNfTU9ERV9QT1JUX01PREVfTUlJOworCQlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCkgeworCQkJaWYgKHBEZXZpY2UtPkxlZE1vZGUgPT0gTEVEX01PREVfTElOSzEwIHx8CisJCQkgICAgcERldmljZS0+V29sU3BlZWQgPT0gV09MX1NQRUVEXzEwTUIpIHsKKwkJCQlWYWx1ZTMyIHw9IE1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlWYWx1ZTMyIHw9IE1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CisJCX0KKwkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIFZhbHVlMzIpOworCQlNTV9XYWl0ICg0MCk7CisJCU1NX1dhaXQgKDQwKTsKKwkJTU1fV2FpdCAoNDApOworCisJCS8qIEFsd2F5cyBlbmFibGUgbWFnaWMgcGFja2V0IHdha2UtdXAgaWYgd2UgaGF2ZSB2YXV4LiAqLworCQlpZiAoKFBtZVN1cHBvcnQgJiBUM19QQ0lfUE1fQ0FQX1BNRV9EM0NPTEQpICYmCisJCSAgICAocERldmljZS0+V2FrZVVwTW9kZUNhcCAmIExNX1dBS0VfVVBfTU9ERV9NQUdJQ19QQUNLRVQpKSB7CisJCQlWYWx1ZTMyIHw9IE1BQ19NT0RFX0RFVEVDVF9NQUdJQ19QQUNLRVRfRU5BQkxFOworCQl9CisKKwkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLk1vZGUsIFZhbHVlMzIpOworCisJCS8qIEVuYWJsZSB0aGUgcmVjZWl2ZXIuICovCisJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5SeE1vZGUsIFJYX01PREVfRU5BQkxFKTsKKwl9CisKKwkvKiBEaXNhYmxlIHR4L3J4IGNsb2NrcywgYW5kIHNlbGV0ZWN0IGFuIGFsdGVybmF0ZSBjbG9jay4gKi8KKwlpZiAocERldmljZS0+V29sU3BlZWQgPT0gV09MX1NQRUVEXzEwME1CKSB7CisJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8CisJCSAgICBUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKSB7CisJCQlWYWx1ZTMyID0KKwkJCSAgICBUM19QQ0lfRElTQUJMRV9SWF9DTE9DSyB8IFQzX1BDSV9ESVNBQkxFX1RYX0NMT0NLIHwKKwkJCSAgICBUM19QQ0lfU0VMRUNUX0FMVEVSTkFURV9DTE9DSzsKKwkJfSBlbHNlIHsKKwkJCVZhbHVlMzIgPSBUM19QQ0lfU0VMRUNUX0FMVEVSTkFURV9DTE9DSzsKKwkJfQorCQlSRUdfV1IgKHBEZXZpY2UsIFBjaUNmZy5DbG9ja0N0cmwsIFZhbHVlMzIpOworCisJCU1NX1dhaXQgKDQwKTsKKworCQlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAorCQkgICAgVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkgeworCQkJVmFsdWUzMiA9CisJCQkgICAgVDNfUENJX0RJU0FCTEVfUlhfQ0xPQ0sgfCBUM19QQ0lfRElTQUJMRV9UWF9DTE9DSyB8CisJCQkgICAgVDNfUENJX1NFTEVDVF9BTFRFUk5BVEVfQ0xPQ0sgfAorCQkJICAgIFQzX1BDSV80NE1IWl9DT1JFX0NMT0NLOworCQl9IGVsc2UgeworCQkJVmFsdWUzMiA9IFQzX1BDSV9TRUxFQ1RfQUxURVJOQVRFX0NMT0NLIHwKKwkJCSAgICBUM19QQ0lfNDRNSFpfQ09SRV9DTE9DSzsKKwkJfQorCisJCVJFR19XUiAocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCwgVmFsdWUzMik7CisKKwkJTU1fV2FpdCAoNDApOworCisJCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAwIHx8CisJCSAgICBUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSA9PSBUM19BU0lDX1JFVl81NzAxKSB7CisJCQlWYWx1ZTMyID0KKwkJCSAgICBUM19QQ0lfRElTQUJMRV9SWF9DTE9DSyB8IFQzX1BDSV9ESVNBQkxFX1RYX0NMT0NLIHwKKwkJCSAgICBUM19QQ0lfNDRNSFpfQ09SRV9DTE9DSzsKKwkJfSBlbHNlIHsKKwkJCVZhbHVlMzIgPSBUM19QQ0lfNDRNSFpfQ09SRV9DTE9DSzsKKwkJfQorCisJCVJFR19XUiAocERldmljZSwgUGNpQ2ZnLkNsb2NrQ3RybCwgVmFsdWUzMik7CisJfSBlbHNlIHsKKwkJaWYgKFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDAgfHwKKwkJICAgIFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpID09IFQzX0FTSUNfUkVWXzU3MDEpIHsKKwkJCVZhbHVlMzIgPQorCQkJICAgIFQzX1BDSV9ESVNBQkxFX1JYX0NMT0NLIHwgVDNfUENJX0RJU0FCTEVfVFhfQ0xPQ0sgfAorCQkJICAgIFQzX1BDSV9TRUxFQ1RfQUxURVJOQVRFX0NMT0NLIHwKKwkJCSAgICBUM19QQ0lfUE9XRVJfRE9XTl9QQ0lfUExMMTMzOworCQl9IGVsc2UgeworCQkJVmFsdWUzMiA9IFQzX1BDSV9TRUxFQ1RfQUxURVJOQVRFX0NMT0NLIHwKKwkJCSAgICBUM19QQ0lfUE9XRVJfRE9XTl9QQ0lfUExMMTMzOworCQl9CisKKwkJUkVHX1dSIChwRGV2aWNlLCBQY2lDZmcuQ2xvY2tDdHJsLCBWYWx1ZTMyKTsKKwl9CisKKwlNTV9XYWl0ICg0MCk7CisKKwlpZiAoIXBEZXZpY2UtPkVlcHJvbVdwCisJICAgICYmIChwRGV2aWNlLT5XYWtlVXBNb2RlQ2FwICE9IExNX1dBS0VfVVBfTU9ERV9OT05FKSkgeworCQkvKiBTd2l0Y2ggYWRhcHRlciB0byBhdXhpbGxpYXJ5IHBvd2VyLiAqLworCQlpZiAoVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMCB8fAorCQkgICAgVDNfQVNJQ19SRVYgKHBEZXZpY2UtPkNoaXBSZXZJZCkgPT0gVDNfQVNJQ19SRVZfNTcwMSkgeworCQkJLyogR1BJTzAgPSAxLCBHUElPMSA9IDEsIEdQSU8yID0gMC4gKi8KKwkJCVJFR19XUiAocERldmljZSwgR3JjLkxvY2FsQ3RybCwgcERldmljZS0+R3JjTG9jYWxDdHJsIHwKKwkJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UwIHwKKwkJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UxIHwKKwkJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UyIHwKKwkJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMCB8CisJCQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDEpOworCQkJTU1fV2FpdCAoNDApOworCQl9IGVsc2UgeworCQkJLyogR1BJTzAgPSAwLCBHUElPMSA9IDEsIEdQSU8yID0gMS4gKi8KKwkJCVJFR19XUiAocERldmljZSwgR3JjLkxvY2FsQ3RybCwgcERldmljZS0+R3JjTG9jYWxDdHJsIHwKKwkJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UwIHwKKwkJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UxIHwKKwkJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UyIHwKKwkJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMSB8CisJCQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDIpOworCQkJTU1fV2FpdCAoNDApOworCisJCQkvKiBHUElPMCA9IDEsIEdQSU8xID0gMSwgR1BJTzIgPSAxLiAqLworCQkJUkVHX1dSIChwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBwRGV2aWNlLT5HcmNMb2NhbEN0cmwgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTAgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTEgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTIgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQwIHwKKwkJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMSB8CisJCQkJR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDIpOworCQkJTU1fV2FpdCAoNDApOworCisJCQkvKiBHUElPMCA9IDEsIEdQSU8xID0gMSwgR1BJTzIgPSAwLiAqLworCQkJUkVHX1dSIChwRGV2aWNlLCBHcmMuTG9jYWxDdHJsLCBwRGV2aWNlLT5HcmNMb2NhbEN0cmwgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTAgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTEgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTIgfAorCQkJCUdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQwIHwKKwkJCQlHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMSk7CisJCQlNTV9XYWl0ICg0MCk7CisJCX0KKwl9CisKKwkvKiBTZXQgdGhlIHBoeSB0byBsb3cgcG93ZXIgbW9kZS4gKi8KKwkvKiBQdXQgdGhlIHRoZSBoYXJkd2FyZSBpbiBsb3cgcG93ZXIgbW9kZS4gKi8KKwlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfUE1fU1RBVFVTX0NUUkxfUkVHLCBQbUN0cmwpOworCisJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworfQkJCQkvKiBMTV9TZXRQb3dlclN0YXRlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIExNX1VJTlQzMiBHZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UpCit7CisJTE1fVUlOVDMyIFZhbHVlMzI7CisKKwlWYWx1ZTMyID0gMDsKKworCS8qIEF1dG8gbmVnb3RpYXRpb24gZmxvdyBjb250cm9sIG9ubHkgd2hlbiBhdXRvbmVnb3RpYXRpb24gaXMgZW5hYmxlZC4gKi8KKwlpZiAocERldmljZS0+RGlzYWJsZUF1dG9OZWcgPT0gRkFMU0UgfHwKKwkgICAgcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID09IExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX0FVVE8gfHwKKwkgICAgcERldmljZS0+UmVxdWVzdGVkTWVkaWFUeXBlID09IExNX1JFUVVFU1RFRF9NRURJQV9UWVBFX1VUUF9BVVRPKSB7CisJCS8qIFBsZWFzZSByZWZlciB0byBUYWJsZSAyOEItMyBvZiB0aGUgODAyLjNhYi0xOTk5IHNwZWMuICovCisJCWlmICgocERldmljZS0+Rmxvd0NvbnRyb2xDYXAgPT0gTE1fRkxPV19DT05UUk9MX0FVVE9fUEFVU0UpIHx8CisJCSAgICAoKHBEZXZpY2UtPkZsb3dDb250cm9sQ2FwICYgTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0UpCisJCSAgICAgJiYgKHBEZXZpY2UtPgorCQkJIEZsb3dDb250cm9sQ2FwICYgTE1fRkxPV19DT05UUk9MX1RSQU5TTUlUX1BBVVNFKSkpIHsKKwkJCVZhbHVlMzIgfD0gUEhZX0FOX0FEX1BBVVNFX0NBUEFCTEU7CisJCX0gZWxzZSBpZiAocERldmljZS0+CisJCQkgICBGbG93Q29udHJvbENhcCAmIExNX0ZMT1dfQ09OVFJPTF9UUkFOU01JVF9QQVVTRSkgeworCQkJVmFsdWUzMiB8PSBQSFlfQU5fQURfQVNZTV9QQVVTRTsKKwkJfSBlbHNlIGlmIChwRGV2aWNlLT4KKwkJCSAgIEZsb3dDb250cm9sQ2FwICYgTE1fRkxPV19DT05UUk9MX1JFQ0VJVkVfUEFVU0UpIHsKKwkJCVZhbHVlMzIgfD0KKwkJCSAgICBQSFlfQU5fQURfUEFVU0VfQ0FQQUJMRSB8IFBIWV9BTl9BRF9BU1lNX1BBVVNFOworCQl9CisJfQorCisJcmV0dXJuIFZhbHVlMzI7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTYzMiwxOTUgKzUxNzcsMTY5IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBMTV9TVEFUVVMKLUxNX0ZvcmNlQXV0b05lZ0JjbTU0MHhQaHkoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi1MTV9SRVFVRVNURURfTUVESUFfVFlQRSBSZXF1ZXN0ZWRNZWRpYVR5cGUpCitMTV9Gb3JjZUF1dG9OZWdCY201NDB4UGh5IChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCisJCQkgICBMTV9SRVFVRVNURURfTUVESUFfVFlQRSBSZXF1ZXN0ZWRNZWRpYVR5cGUpCiB7Ci0gICAgTE1fTUVESUFfVFlQRSBNZWRpYVR5cGU7Ci0gICAgTE1fTElORV9TUEVFRCBMaW5lU3BlZWQ7Ci0gICAgTE1fRFVQTEVYX01PREUgRHVwbGV4TW9kZTsKLSAgICBMTV9VSU5UMzIgTmV3UGh5Q3RybDsKLSAgICBMTV9VSU5UMzIgVmFsdWUzMjsKLSAgICBMTV9VSU5UMzIgQ250OworCUxNX01FRElBX1RZUEUgTWVkaWFUeXBlOworCUxNX0xJTkVfU1BFRUQgTGluZVNwZWVkOworCUxNX0RVUExFWF9NT0RFIER1cGxleE1vZGU7CisJTE1fVUlOVDMyIE5ld1BoeUN0cmw7CisJTE1fVUlOVDMyIFZhbHVlMzI7CisJTE1fVUlOVDMyIENudDsKIAotICAgIC8qIEdldCB0aGUgaW50ZXJmYWNlIHR5cGUsIGxpbmUgc3BlZWQsIGFuZCBkdXBsZXggbW9kZS4gKi8KLSAgICBMTV9UcmFuc2xhdGVSZXF1ZXN0ZWRNZWRpYVR5cGUoUmVxdWVzdGVkTWVkaWFUeXBlLCAmTWVkaWFUeXBlLCAmTGluZVNwZWVkLAotCSZEdXBsZXhNb2RlKTsKKwkvKiBHZXQgdGhlIGludGVyZmFjZSB0eXBlLCBsaW5lIHNwZWVkLCBhbmQgZHVwbGV4IG1vZGUuICovCisJTE1fVHJhbnNsYXRlUmVxdWVzdGVkTWVkaWFUeXBlIChSZXF1ZXN0ZWRNZWRpYVR5cGUsICZNZWRpYVR5cGUsCisJCQkJCSZMaW5lU3BlZWQsICZEdXBsZXhNb2RlKTsKIAotICAgIGlmIChwRGV2aWNlLT5SZXN0b3JlT25XYWtlVXApCi0gICAgewotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIEJDTTU0MFhfMTAwMEJBU0VUX0NUUkxfUkVHLCAwKTsKLQlwRGV2aWNlLT5hZHZlcnRpc2luZzEwMDAgPSAwOwotCVZhbHVlMzIgPSBQSFlfQU5fQURfMTBCQVNFVF9GVUxMIHwgUEhZX0FOX0FEXzEwQkFTRVRfSEFMRjsKLQlpZiAocERldmljZS0+V29sU3BlZWQgPT0gV09MX1NQRUVEXzEwME1CKQotCXsKLQkgICAgVmFsdWUzMiB8PSBQSFlfQU5fQURfMTAwQkFTRVRYX0ZVTEwgfCBQSFlfQU5fQURfMTAwQkFTRVRYX0hBTEY7CisJaWYgKHBEZXZpY2UtPlJlc3RvcmVPbldha2VVcCkgeworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcsIDApOworCQlwRGV2aWNlLT5hZHZlcnRpc2luZzEwMDAgPSAwOworCQlWYWx1ZTMyID0gUEhZX0FOX0FEXzEwQkFTRVRfRlVMTCB8IFBIWV9BTl9BRF8xMEJBU0VUX0hBTEY7CisJCWlmIChwRGV2aWNlLT5Xb2xTcGVlZCA9PSBXT0xfU1BFRURfMTAwTUIpIHsKKwkJCVZhbHVlMzIgfD0KKwkJCSAgICBQSFlfQU5fQURfMTAwQkFTRVRYX0ZVTEwgfCBQSFlfQU5fQURfMTAwQkFTRVRYX0hBTEY7CisJCX0KKwkJVmFsdWUzMiB8PSBQSFlfQU5fQURfUFJPVE9DT0xfODAyXzNfQ1NNQV9DRDsKKwkJVmFsdWUzMiB8PSBHZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzIChwRGV2aWNlKTsKKwkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIFBIWV9BTl9BRF9SRUcsIFZhbHVlMzIpOworCQlwRGV2aWNlLT5hZHZlcnRpc2luZyA9IFZhbHVlMzI7CiAJfQotCVZhbHVlMzIgfD0gUEhZX0FOX0FEX1BST1RPQ09MXzgwMl8zX0NTTUFfQ0Q7Ci0JVmFsdWUzMiB8PSBHZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzKHBEZXZpY2UpOwotCUxNX1dyaXRlUGh5KHBEZXZpY2UsIFBIWV9BTl9BRF9SRUcsIFZhbHVlMzIpOwotCXBEZXZpY2UtPmFkdmVydGlzaW5nID0gVmFsdWUzMjsKLSAgICB9Ci0gICAgLyogU2V0dXAgdGhlIGF1dG8tbmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudCByZWdpc3Rlci4gKi8KLSAgICBlbHNlIGlmKExpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEX1VOS05PV04pCi0gICAgewotCS8qIFNldHVwIHRoZSAxMC8xMDAgTWJwcyBhdXRvLW5lZ290aWF0aW9uIGFkdmVydGlzZW1lbnQgcmVnaXN0ZXIuICovCi0JVmFsdWUzMiA9IFBIWV9BTl9BRF9QUk9UT0NPTF84MDJfM19DU01BX0NEIHwKLQkgICAgUEhZX0FOX0FEXzEwQkFTRVRfSEFMRiB8IFBIWV9BTl9BRF8xMEJBU0VUX0ZVTEwgfAotCSAgICBQSFlfQU5fQURfMTAwQkFTRVRYX0ZVTEwgfCBQSFlfQU5fQURfMTAwQkFTRVRYX0hBTEY7Ci0JVmFsdWUzMiB8PSBHZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzKHBEZXZpY2UpOworCS8qIFNldHVwIHRoZSBhdXRvLW5lZ290aWF0aW9uIGFkdmVydGlzZW1lbnQgcmVnaXN0ZXIuICovCisJZWxzZSBpZiAoTGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfVU5LTk9XTikgeworCQkvKiBTZXR1cCB0aGUgMTAvMTAwIE1icHMgYXV0by1uZWdvdGlhdGlvbiBhZHZlcnRpc2VtZW50IHJlZ2lzdGVyLiAqLworCQlWYWx1ZTMyID0gUEhZX0FOX0FEX1BST1RPQ09MXzgwMl8zX0NTTUFfQ0QgfAorCQkgICAgUEhZX0FOX0FEXzEwQkFTRVRfSEFMRiB8IFBIWV9BTl9BRF8xMEJBU0VUX0ZVTEwgfAorCQkgICAgUEhZX0FOX0FEXzEwMEJBU0VUWF9GVUxMIHwgUEhZX0FOX0FEXzEwMEJBU0VUWF9IQUxGOworCQlWYWx1ZTMyIHw9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MgKHBEZXZpY2UpOwogCi0JTE1fV3JpdGVQaHkocERldmljZSwgUEhZX0FOX0FEX1JFRywgVmFsdWUzMik7Ci0JcERldmljZS0+YWR2ZXJ0aXNpbmcgPSBWYWx1ZTMyOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgUEhZX0FOX0FEX1JFRywgVmFsdWUzMik7CisJCXBEZXZpY2UtPmFkdmVydGlzaW5nID0gVmFsdWUzMjsKIAotCS8qIEFkdmVydGlzZSAxMDAwTWJwcyAqLwotCVZhbHVlMzIgPSBCQ001NDBYX0FOX0FEXzEwMDBCQVNFVF9IQUxGIHwgQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfRlVMTDsKKwkJLyogQWR2ZXJ0aXNlIDEwMDBNYnBzICovCisJCVZhbHVlMzIgPQorCQkgICAgQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfSEFMRiB8IEJDTTU0MFhfQU5fQURfMTAwMEJBU0VUX0ZVTEw7CiAKICNpZiBJTkNMVURFXzU3MDFfQVhfRklYCi0JLyogQnVnOiB3b3JrYXJvdW5kIGZvciBDUkMgZXJyb3IgaW4gZ2lnYWJpdCBtb2RlIHdoZW4gd2UgYXJlIGluICovCi0JLyogc2xhdmUgbW9kZS4gIFRoaXMgd2lsbCBmb3JjZSB0aGUgUEhZIHRvIG9wZXJhdGUgaW4gKi8KLQkvKiBtYXN0ZXIgbW9kZS4gKi8KLQlpZihwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0EwIHx8Ci0JICAgIHBEZXZpY2UtPkNoaXBSZXZJZCA9PSBUM19DSElQX0lEXzU3MDFfQjApCi0JewotCSAgICBWYWx1ZTMyIHw9IEJDTTU0MFhfQ09ORklHX0FTX01BU1RFUiB8Ci0JCUJDTTU0MFhfRU5BQkxFX0NPTkZJR19BU19NQVNURVI7Ci0JfQorCQkvKiBCdWc6IHdvcmthcm91bmQgZm9yIENSQyBlcnJvciBpbiBnaWdhYml0IG1vZGUgd2hlbiB3ZSBhcmUgaW4gKi8KKwkJLyogc2xhdmUgbW9kZS4gIFRoaXMgd2lsbCBmb3JjZSB0aGUgUEhZIHRvIG9wZXJhdGUgaW4gKi8KKwkJLyogbWFzdGVyIG1vZGUuICovCisJCWlmIChwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0EwIHx8CisJCSAgICBwRGV2aWNlLT5DaGlwUmV2SWQgPT0gVDNfQ0hJUF9JRF81NzAxX0IwKSB7CisJCQlWYWx1ZTMyIHw9IEJDTTU0MFhfQ09ORklHX0FTX01BU1RFUiB8CisJCQkgICAgQkNNNTQwWF9FTkFCTEVfQ09ORklHX0FTX01BU1RFUjsKKwkJfQogI2VuZGlmCiAKLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYXzEwMDBCQVNFVF9DVFJMX1JFRywgVmFsdWUzMik7Ci0JcERldmljZS0+YWR2ZXJ0aXNpbmcxMDAwID0gVmFsdWUzMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlpZihMaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xMDAwTUJQUykKLQl7Ci0JICAgIFZhbHVlMzIgPSBQSFlfQU5fQURfUFJPVE9DT0xfODAyXzNfQ1NNQV9DRDsKLQkgICAgVmFsdWUzMiB8PSBHZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzKHBEZXZpY2UpOworCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcsIFZhbHVlMzIpOworCQlwRGV2aWNlLT5hZHZlcnRpc2luZzEwMDAgPSBWYWx1ZTMyOworCX0gZWxzZSB7CisJCWlmIChMaW5lU3BlZWQgPT0gTE1fTElORV9TUEVFRF8xMDAwTUJQUykgeworCQkJVmFsdWUzMiA9IFBIWV9BTl9BRF9QUk9UT0NPTF84MDJfM19DU01BX0NEOworCQkJVmFsdWUzMiB8PSBHZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzIChwRGV2aWNlKTsKIAotCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBQSFlfQU5fQURfUkVHLCBWYWx1ZTMyKTsKLQkgICAgcERldmljZS0+YWR2ZXJ0aXNpbmcgPSBWYWx1ZTMyOworCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIFBIWV9BTl9BRF9SRUcsIFZhbHVlMzIpOworCQkJcERldmljZS0+YWR2ZXJ0aXNpbmcgPSBWYWx1ZTMyOwogCi0JICAgIGlmKER1cGxleE1vZGUgIT0gTE1fRFVQTEVYX01PREVfRlVMTCkKLQkgICAgewotCQlWYWx1ZTMyID0gQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfSEFMRjsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJVmFsdWUzMiA9IEJDTTU0MFhfQU5fQURfMTAwMEJBU0VUX0ZVTEw7Ci0JICAgIH0KKwkJCWlmIChEdXBsZXhNb2RlICE9IExNX0RVUExFWF9NT0RFX0ZVTEwpIHsKKwkJCQlWYWx1ZTMyID0gQkNNNTQwWF9BTl9BRF8xMDAwQkFTRVRfSEFMRjsKKwkJCX0gZWxzZSB7CisJCQkJVmFsdWUzMiA9IEJDTTU0MFhfQU5fQURfMTAwMEJBU0VUX0ZVTEw7CisJCQl9CiAKLQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcsIFZhbHVlMzIpOwotCSAgICBwRGV2aWNlLT5hZHZlcnRpc2luZzEwMDAgPSBWYWx1ZTMyOwotCX0KLQllbHNlIGlmKExpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwME1CUFMpCi0JewotCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBCQ001NDBYXzEwMDBCQVNFVF9DVFJMX1JFRywgMCk7Ci0JICAgIHBEZXZpY2UtPmFkdmVydGlzaW5nMTAwMCA9IDA7CisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcsCisJCQkJICAgICBWYWx1ZTMyKTsKKwkJCXBEZXZpY2UtPmFkdmVydGlzaW5nMTAwMCA9IFZhbHVlMzI7CisJCX0gZWxzZSBpZiAoTGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTAwTUJQUykgeworCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MFhfMTAwMEJBU0VUX0NUUkxfUkVHLCAwKTsKKwkJCXBEZXZpY2UtPmFkdmVydGlzaW5nMTAwMCA9IDA7CiAKLQkgICAgaWYoRHVwbGV4TW9kZSAhPSBMTV9EVVBMRVhfTU9ERV9GVUxMKQotCSAgICB7Ci0JCVZhbHVlMzIgPSBQSFlfQU5fQURfMTAwQkFTRVRYX0hBTEY7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCVZhbHVlMzIgPSBQSFlfQU5fQURfMTAwQkFTRVRYX0ZVTEw7Ci0JICAgIH0KKwkJCWlmIChEdXBsZXhNb2RlICE9IExNX0RVUExFWF9NT0RFX0ZVTEwpIHsKKwkJCQlWYWx1ZTMyID0gUEhZX0FOX0FEXzEwMEJBU0VUWF9IQUxGOworCQkJfSBlbHNlIHsKKwkJCQlWYWx1ZTMyID0gUEhZX0FOX0FEXzEwMEJBU0VUWF9GVUxMOworCQkJfQogCi0JICAgIFZhbHVlMzIgfD0gUEhZX0FOX0FEX1BST1RPQ09MXzgwMl8zX0NTTUFfQ0Q7Ci0JICAgIFZhbHVlMzIgfD0gR2V0UGh5QWRGbG93Q250cmxTZXR0aW5ncyhwRGV2aWNlKTsKKwkJCVZhbHVlMzIgfD0gUEhZX0FOX0FEX1BST1RPQ09MXzgwMl8zX0NTTUFfQ0Q7CisJCQlWYWx1ZTMyIHw9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MgKHBEZXZpY2UpOwogCi0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIFBIWV9BTl9BRF9SRUcsIFZhbHVlMzIpOwotCSAgICBwRGV2aWNlLT5hZHZlcnRpc2luZyA9IFZhbHVlMzI7Ci0JfQotCWVsc2UgaWYoTGluZVNwZWVkID09IExNX0xJTkVfU1BFRURfMTBNQlBTKQotCXsKLQkgICAgTE1fV3JpdGVQaHkocERldmljZSwgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcsIDApOwotCSAgICBwRGV2aWNlLT5hZHZlcnRpc2luZzEwMDAgPSAwOworCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIFBIWV9BTl9BRF9SRUcsIFZhbHVlMzIpOworCQkJcERldmljZS0+YWR2ZXJ0aXNpbmcgPSBWYWx1ZTMyOworCQl9IGVsc2UgaWYgKExpbmVTcGVlZCA9PSBMTV9MSU5FX1NQRUVEXzEwTUJQUykgeworCQkJTE1fV3JpdGVQaHkgKHBEZXZpY2UsIEJDTTU0MFhfMTAwMEJBU0VUX0NUUkxfUkVHLCAwKTsKKwkJCXBEZXZpY2UtPmFkdmVydGlzaW5nMTAwMCA9IDA7CiAKLQkgICAgaWYoRHVwbGV4TW9kZSAhPSBMTV9EVVBMRVhfTU9ERV9GVUxMKQotCSAgICB7Ci0JCVZhbHVlMzIgPSBQSFlfQU5fQURfMTBCQVNFVF9IQUxGOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQlWYWx1ZTMyID0gUEhZX0FOX0FEXzEwQkFTRVRfRlVMTDsKLQkgICAgfQorCQkJaWYgKER1cGxleE1vZGUgIT0gTE1fRFVQTEVYX01PREVfRlVMTCkgeworCQkJCVZhbHVlMzIgPSBQSFlfQU5fQURfMTBCQVNFVF9IQUxGOworCQkJfSBlbHNlIHsKKwkJCQlWYWx1ZTMyID0gUEhZX0FOX0FEXzEwQkFTRVRfRlVMTDsKKwkJCX0KIAotCSAgICBWYWx1ZTMyIHw9IFBIWV9BTl9BRF9QUk9UT0NPTF84MDJfM19DU01BX0NEOwotCSAgICBWYWx1ZTMyIHw9IEdldFBoeUFkRmxvd0NudHJsU2V0dGluZ3MocERldmljZSk7CisJCQlWYWx1ZTMyIHw9IFBIWV9BTl9BRF9QUk9UT0NPTF84MDJfM19DU01BX0NEOworCQkJVmFsdWUzMiB8PSBHZXRQaHlBZEZsb3dDbnRybFNldHRpbmdzIChwRGV2aWNlKTsKIAotCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBQSFlfQU5fQURfUkVHLCBWYWx1ZTMyKTsKLQkgICAgcERldmljZS0+YWR2ZXJ0aXNpbmcgPSBWYWx1ZTMyOwotCX0KLSAgICB9Ci0KLSAgICAvKiBGb3JjZSBsaW5lIHNwZWVkIGlmIGF1dG8tbmVnb3RpYXRpb24gaXMgZGlzYWJsZWQuICovCi0gICAgaWYocERldmljZS0+RGlzYWJsZUF1dG9OZWcgJiYgTGluZVNwZWVkICE9IExNX0xJTkVfU1BFRURfVU5LTk9XTikKLSAgICB7Ci0JLyogVGhpcyBjb2RlIHBhdGggaXMgZXhlY3V0ZWQgb25seSB3aGVuIHRoZXJlIGlzIGxpbmsuICovCi0JcERldmljZS0+TWVkaWFUeXBlID0gTWVkaWFUeXBlOwotCXBEZXZpY2UtPkxpbmVTcGVlZCA9IExpbmVTcGVlZDsKLQlwRGV2aWNlLT5EdXBsZXhNb2RlID0gRHVwbGV4TW9kZTsKLQotCS8qIEZvcmNlIGxpbmUgc2VlcGQuICovCi0JTmV3UGh5Q3RybCA9IDA7Ci0Jc3dpdGNoKExpbmVTcGVlZCkKLQl7Ci0JICAgIGNhc2UgTE1fTElORV9TUEVFRF8xME1CUFM6Ci0JCU5ld1BoeUN0cmwgfD0gUEhZX0NUUkxfU1BFRURfU0VMRUNUXzEwTUJQUzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgTE1fTElORV9TUEVFRF8xMDBNQlBTOgotCQlOZXdQaHlDdHJsIHw9IFBIWV9DVFJMX1NQRUVEX1NFTEVDVF8xMDBNQlBTOwotCQlicmVhazsKLQkgICAgY2FzZSBMTV9MSU5FX1NQRUVEXzEwMDBNQlBTOgotCQlOZXdQaHlDdHJsIHw9IFBIWV9DVFJMX1NQRUVEX1NFTEVDVF8xMDAwTUJQUzsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCU5ld1BoeUN0cmwgfD0gUEhZX0NUUkxfU1BFRURfU0VMRUNUXzEwMDBNQlBTOwotCQlicmVhazsKLQl9Ci0KLQlpZihEdXBsZXhNb2RlID09IExNX0RVUExFWF9NT0RFX0ZVTEwpCi0JewotCSAgICBOZXdQaHlDdHJsIHw9IFBIWV9DVFJMX0ZVTExfRFVQTEVYX01PREU7Ci0JfQotCi0JLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIFBIWV9DVFJMIGlzIGFscmVhZHkgd2hhdCB3ZSB3YW50ZWQuICovCi0JTE1fUmVhZFBoeShwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsICZWYWx1ZTMyKTsKLQlpZihWYWx1ZTMyICE9IE5ld1BoeUN0cmwpCi0JewotCSAgICAvKiBUZW1wb3JhcnkgYnJpbmcgdGhlIGxpbmsgZG93biBiZWZvcmUgZm9yY2luZyBsaW5lIHNwZWVkLiAqLwotCSAgICBMTV9Xcml0ZVBoeShwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsIFBIWV9DVFJMX0xPT1BCQUNLX01PREUpOwotCi0JICAgIC8qIFdhaXQgZm9yIGxpbmsgdG8gZ28gZG93bi4gKi8KLQkgICAgZm9yKENudCA9IDA7IENudCA8IDE1MDAwOyBDbnQrKykKLQkgICAgewotCQlNTV9XYWl0KDEwKTsKLQotCQlMTV9SZWFkUGh5KHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7Ci0JCUxNX1JlYWRQaHkocERldmljZSwgUEhZX1NUQVRVU19SRUcsICZWYWx1ZTMyKTsKLQotCQlpZighKFZhbHVlMzIgJiBQSFlfU1RBVFVTX0xJTktfUEFTUykpCi0JCXsKLQkJICAgIE1NX1dhaXQoNDApOwotCQkgICAgYnJlYWs7CisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgUEhZX0FOX0FEX1JFRywgVmFsdWUzMik7CisJCQlwRGV2aWNlLT5hZHZlcnRpc2luZyA9IFZhbHVlMzI7CiAJCX0KLQkgICAgfQotCi0JICAgIExNX1dyaXRlUGh5KHBEZXZpY2UsIFBIWV9DVFJMX1JFRywgTmV3UGh5Q3RybCk7Ci0JICAgIE1NX1dhaXQoNDApOwogCX0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlMTV9Xcml0ZVBoeShwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsIFBIWV9DVFJMX0FVVE9fTkVHX0VOQUJMRSB8Ci0JICAgIFBIWV9DVFJMX1JFU1RBUlRfQVVUT19ORUcpOwotICAgIH0KIAotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKLX0gLyogTE1fRm9yY2VBdXRvTmVnQmNtNTQweFBoeSAqLworCS8qIEZvcmNlIGxpbmUgc3BlZWQgaWYgYXV0by1uZWdvdGlhdGlvbiBpcyBkaXNhYmxlZC4gKi8KKwlpZiAocERldmljZS0+RGlzYWJsZUF1dG9OZWcgJiYgTGluZVNwZWVkICE9IExNX0xJTkVfU1BFRURfVU5LTk9XTikgeworCQkvKiBUaGlzIGNvZGUgcGF0aCBpcyBleGVjdXRlZCBvbmx5IHdoZW4gdGhlcmUgaXMgbGluay4gKi8KKwkJcERldmljZS0+TWVkaWFUeXBlID0gTWVkaWFUeXBlOworCQlwRGV2aWNlLT5MaW5lU3BlZWQgPSBMaW5lU3BlZWQ7CisJCXBEZXZpY2UtPkR1cGxleE1vZGUgPSBEdXBsZXhNb2RlOwogCisJCS8qIEZvcmNlIGxpbmUgc2VlcGQuICovCisJCU5ld1BoeUN0cmwgPSAwOworCQlzd2l0Y2ggKExpbmVTcGVlZCkgeworCQljYXNlIExNX0xJTkVfU1BFRURfMTBNQlBTOgorCQkJTmV3UGh5Q3RybCB8PSBQSFlfQ1RSTF9TUEVFRF9TRUxFQ1RfMTBNQlBTOworCQkJYnJlYWs7CisJCWNhc2UgTE1fTElORV9TUEVFRF8xMDBNQlBTOgorCQkJTmV3UGh5Q3RybCB8PSBQSFlfQ1RSTF9TUEVFRF9TRUxFQ1RfMTAwTUJQUzsKKwkJCWJyZWFrOworCQljYXNlIExNX0xJTkVfU1BFRURfMTAwME1CUFM6CisJCQlOZXdQaHlDdHJsIHw9IFBIWV9DVFJMX1NQRUVEX1NFTEVDVF8xMDAwTUJQUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJTmV3UGh5Q3RybCB8PSBQSFlfQ1RSTF9TUEVFRF9TRUxFQ1RfMTAwME1CUFM7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChEdXBsZXhNb2RlID09IExNX0RVUExFWF9NT0RFX0ZVTEwpIHsKKwkJCU5ld1BoeUN0cmwgfD0gUEhZX0NUUkxfRlVMTF9EVVBMRVhfTU9ERTsKKwkJfQorCisJCS8qIERvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBQSFlfQ1RSTCBpcyBhbHJlYWR5IHdoYXQgd2Ugd2FudGVkLiAqLworCQlMTV9SZWFkUGh5IChwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsICZWYWx1ZTMyKTsKKwkJaWYgKFZhbHVlMzIgIT0gTmV3UGh5Q3RybCkgeworCQkJLyogVGVtcG9yYXJ5IGJyaW5nIHRoZSBsaW5rIGRvd24gYmVmb3JlIGZvcmNpbmcgbGluZSBzcGVlZC4gKi8KKwkJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsCisJCQkJICAgICBQSFlfQ1RSTF9MT09QQkFDS19NT0RFKTsKKworCQkJLyogV2FpdCBmb3IgbGluayB0byBnbyBkb3duLiAqLworCQkJZm9yIChDbnQgPSAwOyBDbnQgPCAxNTAwMDsgQ250KyspIHsKKwkJCQlNTV9XYWl0ICgxMCk7CisKKwkJCQlMTV9SZWFkUGh5IChwRGV2aWNlLCBQSFlfU1RBVFVTX1JFRywgJlZhbHVlMzIpOworCQkJCUxNX1JlYWRQaHkgKHBEZXZpY2UsIFBIWV9TVEFUVVNfUkVHLCAmVmFsdWUzMik7CisKKwkJCQlpZiAoIShWYWx1ZTMyICYgUEhZX1NUQVRVU19MSU5LX1BBU1MpKSB7CisJCQkJCU1NX1dhaXQgKDQwKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlMTV9Xcml0ZVBoeSAocERldmljZSwgUEhZX0NUUkxfUkVHLCBOZXdQaHlDdHJsKTsKKwkJCU1NX1dhaXQgKDQwKTsKKwkJfQorCX0gZWxzZSB7CisJCUxNX1dyaXRlUGh5IChwRGV2aWNlLCBQSFlfQ1RSTF9SRUcsIFBIWV9DVFJMX0FVVE9fTkVHX0VOQUJMRSB8CisJCQkgICAgIFBIWV9DVFJMX1JFU1RBUlRfQVVUT19ORUcpOworCX0KKworCXJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKK30JCQkJLyogTE1fRm9yY2VBdXRvTmVnQmNtNTQweFBoeSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU4MjgsMjE4ICs1MzQ3LDE5OSBAQAogLyogUmV0dXJuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgTE1fU1RBVFVTCi1MTV9Gb3JjZUF1dG9OZWcoCi1QTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi1MTV9SRVFVRVNURURfTUVESUFfVFlQRSBSZXF1ZXN0ZWRNZWRpYVR5cGUpCitMTV9Gb3JjZUF1dG9OZWcgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkJIExNX1JFUVVFU1RFRF9NRURJQV9UWVBFIFJlcXVlc3RlZE1lZGlhVHlwZSkKIHsKLSAgICBMTV9TVEFUVVMgTG1TdGF0dXM7CisJTE1fU1RBVFVTIExtU3RhdHVzOwogCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgcGh5IGNoaXAuICovCi0gICAgc3dpdGNoKHBEZXZpY2UtPlBoeUlkICYgUEhZX0lEX01BU0spCi0gICAgeworCS8qIEluaXRpYWxpemUgdGhlIHBoeSBjaGlwLiAqLworCXN3aXRjaCAocERldmljZS0+UGh5SWQgJiBQSFlfSURfTUFTSykgewogCWNhc2UgUEhZX0JDTTU0MDBfUEhZX0lEOgogCWNhc2UgUEhZX0JDTTU0MDFfUEhZX0lEOgogCWNhc2UgUEhZX0JDTTU0MTFfUEhZX0lEOgogCWNhc2UgUEhZX0JDTTU3MDFfUEhZX0lEOgogCWNhc2UgUEhZX0JDTTU3MDNfUEhZX0lEOgogCWNhc2UgUEhZX0JDTTU3MDRfUEhZX0lEOgotCSAgICBMbVN0YXR1cyA9IExNX0ZvcmNlQXV0b05lZ0JjbTU0MHhQaHkocERldmljZSwgUmVxdWVzdGVkTWVkaWFUeXBlKTsKLQkgICAgYnJlYWs7CisJCUxtU3RhdHVzID0KKwkJICAgIExNX0ZvcmNlQXV0b05lZ0JjbTU0MHhQaHkgKHBEZXZpY2UsIFJlcXVlc3RlZE1lZGlhVHlwZSk7CisJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkgICAgTG1TdGF0dXMgPSBMTV9TVEFUVVNfRkFJTFVSRTsKLQkgICAgYnJlYWs7Ci0gICAgfQorCQlMbVN0YXR1cyA9IExNX1NUQVRVU19GQUlMVVJFOworCQlicmVhazsKKwl9CiAKLSAgICByZXR1cm4gTG1TdGF0dXM7Ci19IC8qIExNX0ZvcmNlQXV0b05lZyAqLworCXJldHVybiBMbVN0YXR1czsKK30JCQkJLyogTE1fRm9yY2VBdXRvTmVnICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE1fU1RBVFVTIExNX0xvYWRGaXJtd2FyZShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsCi0JCQkgIFBUM19GV0lNR19JTkZPIHBGd0ltZywKLQkJCSAgTE1fVUlOVDMyIExvYWRDcHUsCi0JCQkgIExNX1VJTlQzMiBTdGFydENwdSkKK0xNX1NUQVRVUyBMTV9Mb2FkRmlybXdhcmUgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkJCSAgIFBUM19GV0lNR19JTkZPIHBGd0ltZywKKwkJCSAgIExNX1VJTlQzMiBMb2FkQ3B1LCBMTV9VSU5UMzIgU3RhcnRDcHUpCiB7Ci0gICAgTE1fVUlOVDMyIGk7Ci0gICAgTE1fVUlOVDMyIGFkZHJlc3M7CisJTE1fVUlOVDMyIGk7CisJTE1fVUlOVDMyIGFkZHJlc3M7CiAKLSAgICBpZiAoTG9hZENwdSAmIFQzX1JYX0NQVV9JRCkKLSAgICB7Ci0JaWYgKExNX0hhbHRDcHUocERldmljZSxUM19SWF9DUFVfSUQpICE9IExNX1NUQVRVU19TVUNDRVNTKQotCXsKLQkgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworCWlmIChMb2FkQ3B1ICYgVDNfUlhfQ1BVX0lEKSB7CisJCWlmIChMTV9IYWx0Q3B1IChwRGV2aWNlLCBUM19SWF9DUFVfSUQpICE9IExNX1NUQVRVU19TVUNDRVNTKSB7CisJCQlyZXR1cm4gTE1fU1RBVFVTX0ZBSUxVUkU7CisJCX0KKworCQkvKiBGaXJzdCBvZiBhbGwgY2xlYXIgc2NyYWNoIHBhZCBtZW1vcnkgKi8KKwkJZm9yIChpID0gMDsgaSA8IFQzX1JYX0NQVV9TUEFEX1NJWkU7IGkgKz0gNCkgeworCQkJTE1fUmVnV3JJbmQgKHBEZXZpY2UsIFQzX1JYX0NQVV9TUEFEX0FERFIgKyBpLCAwKTsKKwkJfQorCisJCS8qIENvcHkgY29kZSBmaXJzdCAqLworCQlhZGRyZXNzID0gVDNfUlhfQ1BVX1NQQURfQUREUiArIChwRndJbWctPlRleHQuT2Zmc2V0ICYgMHhmZmZmKTsKKwkJZm9yIChpID0gMDsgaSA8PSBwRndJbWctPlRleHQuTGVuZ3RoOyBpICs9IDQpIHsKKwkJCUxNX1JlZ1dySW5kIChwRGV2aWNlLCBhZGRyZXNzICsgaSwKKwkJCQkgICAgICgoTE1fVUlOVDMyICopIHBGd0ltZy0+VGV4dC5CdWZmZXIpW2kgLworCQkJCQkJCQkJIDRdKTsKKwkJfQorCisJCWFkZHJlc3MgPQorCQkgICAgVDNfUlhfQ1BVX1NQQURfQUREUiArIChwRndJbWctPlJPbmx5RGF0YS5PZmZzZXQgJiAweGZmZmYpOworCQlmb3IgKGkgPSAwOyBpIDw9IHBGd0ltZy0+Uk9ubHlEYXRhLkxlbmd0aDsgaSArPSA0KSB7CisJCQlMTV9SZWdXckluZCAocERldmljZSwgYWRkcmVzcyArIGksCisJCQkJICAgICAoKExNX1VJTlQzMiAqKSBwRndJbWctPlJPbmx5RGF0YS4KKwkJCQkgICAgICBCdWZmZXIpW2kgLyA0XSk7CisJCX0KKworCQlhZGRyZXNzID0gVDNfUlhfQ1BVX1NQQURfQUREUiArIChwRndJbWctPkRhdGEuT2Zmc2V0ICYgMHhmZmZmKTsKKwkJZm9yIChpID0gMDsgaSA8PSBwRndJbWctPkRhdGEuTGVuZ3RoOyBpICs9IDQpIHsKKwkJCUxNX1JlZ1dySW5kIChwRGV2aWNlLCBhZGRyZXNzICsgaSwKKwkJCQkgICAgICgoTE1fVUlOVDMyICopIHBGd0ltZy0+RGF0YS5CdWZmZXIpW2kgLworCQkJCQkJCQkJIDRdKTsKKwkJfQogCX0KIAotCS8qIEZpcnN0IG9mIGFsbCBjbGVhciBzY3JhY2ggcGFkIG1lbW9yeSAqLwotCWZvciAoaSA9IDA7IGkgPCBUM19SWF9DUFVfU1BBRF9TSVpFOyBpKz00KQotCXsKLQkgICAgTE1fUmVnV3JJbmQocERldmljZSxUM19SWF9DUFVfU1BBRF9BRERSK2ksMCk7CisJaWYgKExvYWRDcHUgJiBUM19UWF9DUFVfSUQpIHsKKwkJaWYgKExNX0hhbHRDcHUgKHBEZXZpY2UsIFQzX1RYX0NQVV9JRCkgIT0gTE1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKwkJfQorCisJCS8qIEZpcnN0IG9mIGFsbCBjbGVhciBzY3JhY2ggcGFkIG1lbW9yeSAqLworCQlmb3IgKGkgPSAwOyBpIDwgVDNfVFhfQ1BVX1NQQURfU0laRTsgaSArPSA0KSB7CisJCQlMTV9SZWdXckluZCAocERldmljZSwgVDNfVFhfQ1BVX1NQQURfQUREUiArIGksIDApOworCQl9CisKKwkJLyogQ29weSBjb2RlIGZpcnN0ICovCisJCWFkZHJlc3MgPSBUM19UWF9DUFVfU1BBRF9BRERSICsgKHBGd0ltZy0+VGV4dC5PZmZzZXQgJiAweGZmZmYpOworCQlmb3IgKGkgPSAwOyBpIDw9IHBGd0ltZy0+VGV4dC5MZW5ndGg7IGkgKz0gNCkgeworCQkJTE1fUmVnV3JJbmQgKHBEZXZpY2UsIGFkZHJlc3MgKyBpLAorCQkJCSAgICAgKChMTV9VSU5UMzIgKikgcEZ3SW1nLT5UZXh0LkJ1ZmZlcilbaSAvCisJCQkJCQkJCQkgNF0pOworCQl9CisKKwkJYWRkcmVzcyA9CisJCSAgICBUM19UWF9DUFVfU1BBRF9BRERSICsgKHBGd0ltZy0+Uk9ubHlEYXRhLk9mZnNldCAmIDB4ZmZmZik7CisJCWZvciAoaSA9IDA7IGkgPD0gcEZ3SW1nLT5ST25seURhdGEuTGVuZ3RoOyBpICs9IDQpIHsKKwkJCUxNX1JlZ1dySW5kIChwRGV2aWNlLCBhZGRyZXNzICsgaSwKKwkJCQkgICAgICgoTE1fVUlOVDMyICopIHBGd0ltZy0+Uk9ubHlEYXRhLgorCQkJCSAgICAgIEJ1ZmZlcilbaSAvIDRdKTsKKwkJfQorCisJCWFkZHJlc3MgPSBUM19UWF9DUFVfU1BBRF9BRERSICsgKHBGd0ltZy0+RGF0YS5PZmZzZXQgJiAweGZmZmYpOworCQlmb3IgKGkgPSAwOyBpIDw9IHBGd0ltZy0+RGF0YS5MZW5ndGg7IGkgKz0gNCkgeworCQkJTE1fUmVnV3JJbmQgKHBEZXZpY2UsIGFkZHJlc3MgKyBpLAorCQkJCSAgICAgKChMTV9VSU5UMzIgKikgcEZ3SW1nLT5EYXRhLkJ1ZmZlcilbaSAvCisJCQkJCQkJCQkgNF0pOworCQl9CiAJfQogCi0JLyogQ29weSBjb2RlIGZpcnN0ICovCi0JYWRkcmVzcyA9IFQzX1JYX0NQVV9TUEFEX0FERFIgKyAocEZ3SW1nLT5UZXh0Lk9mZnNldCAmIDB4ZmZmZik7Ci0JZm9yIChpID0gMDsgaSA8PSBwRndJbWctPlRleHQuTGVuZ3RoOyBpKz00KQotCXsKLQkgICAgTE1fUmVnV3JJbmQocERldmljZSxhZGRyZXNzK2ksCi0JCQkoKExNX1VJTlQzMiAqKXBGd0ltZy0+VGV4dC5CdWZmZXIpW2kvNF0pOworCWlmIChTdGFydENwdSAmIFQzX1JYX0NQVV9JRCkgeworCQkvKiBTdGFydCBSeCBDUFUgKi8KKwkJUkVHX1dSIChwRGV2aWNlLCByeENwdS5yZWcuc3RhdGUsIDB4ZmZmZmZmZmYpOworCQlSRUdfV1IgKHBEZXZpY2UsIHJ4Q3B1LnJlZy5QQywgcEZ3SW1nLT5TdGFydEFkZHJlc3MpOworCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCQlpZiAocEZ3SW1nLT5TdGFydEFkZHJlc3MgPT0KKwkJCSAgICBSRUdfUkQgKHBEZXZpY2UsIHJ4Q3B1LnJlZy5QQykpCisJCQkJYnJlYWs7CisKKwkJCVJFR19XUiAocERldmljZSwgcnhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKKwkJCVJFR19XUiAocERldmljZSwgcnhDcHUucmVnLm1vZGUsIENQVV9NT0RFX0hBTFQpOworCQkJUkVHX1dSIChwRGV2aWNlLCByeENwdS5yZWcuUEMsIHBGd0ltZy0+U3RhcnRBZGRyZXNzKTsKKwkJCU1NX1dhaXQgKDEwMDApOworCQl9CisKKwkJUkVHX1dSIChwRGV2aWNlLCByeENwdS5yZWcuc3RhdGUsIDB4ZmZmZmZmZmYpOworCQlSRUdfV1IgKHBEZXZpY2UsIHJ4Q3B1LnJlZy5tb2RlLCAwKTsKIAl9CiAKLQlhZGRyZXNzID0gVDNfUlhfQ1BVX1NQQURfQUREUiArIChwRndJbWctPlJPbmx5RGF0YS5PZmZzZXQgJiAweGZmZmYpOwotCWZvciAoaSA9IDA7IGkgPD0gcEZ3SW1nLT5ST25seURhdGEuTGVuZ3RoOyBpKz00KQotCXsKLQkgICAgTE1fUmVnV3JJbmQocERldmljZSxhZGRyZXNzK2ksCi0JCQkoKExNX1VJTlQzMiAqKXBGd0ltZy0+Uk9ubHlEYXRhLkJ1ZmZlcilbaS80XSk7CisJaWYgKFN0YXJ0Q3B1ICYgVDNfVFhfQ1BVX0lEKSB7CisJCS8qIFN0YXJ0IFR4IENQVSAqLworCQlSRUdfV1IgKHBEZXZpY2UsIHR4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7CisJCVJFR19XUiAocERldmljZSwgdHhDcHUucmVnLlBDLCBwRndJbWctPlN0YXJ0QWRkcmVzcyk7CisJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCWlmIChwRndJbWctPlN0YXJ0QWRkcmVzcyA9PQorCQkJICAgIFJFR19SRCAocERldmljZSwgdHhDcHUucmVnLlBDKSkKKwkJCQlicmVhazsKKworCQkJUkVHX1dSIChwRGV2aWNlLCB0eENwdS5yZWcuc3RhdGUsIDB4ZmZmZmZmZmYpOworCQkJUkVHX1dSIChwRGV2aWNlLCB0eENwdS5yZWcubW9kZSwgQ1BVX01PREVfSEFMVCk7CisJCQlSRUdfV1IgKHBEZXZpY2UsIHR4Q3B1LnJlZy5QQywgcEZ3SW1nLT5TdGFydEFkZHJlc3MpOworCQkJTU1fV2FpdCAoMTAwMCk7CisJCX0KKworCQlSRUdfV1IgKHBEZXZpY2UsIHR4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7CisJCVJFR19XUiAocERldmljZSwgdHhDcHUucmVnLm1vZGUsIDApOwogCX0KIAotCWFkZHJlc3MgPSBUM19SWF9DUFVfU1BBRF9BRERSICsgKHBGd0ltZy0+RGF0YS5PZmZzZXQgJiAweGZmZmYpOwotCWZvciAoaT0gMDsgaSA8PSBwRndJbWctPkRhdGEuTGVuZ3RoOyBpKz00KQotCXsKLQkgICAgTE1fUmVnV3JJbmQocERldmljZSxhZGRyZXNzK2ksCi0JCQkoKExNX1VJTlQzMiAqKXBGd0ltZy0+RGF0YS5CdWZmZXIpW2kvNF0pOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoTG9hZENwdSAmIFQzX1RYX0NQVV9JRCkKLSAgICB7Ci0JaWYgKExNX0hhbHRDcHUocERldmljZSxUM19UWF9DUFVfSUQpICE9IExNX1NUQVRVU19TVUNDRVNTKQotCXsKLQkgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCS8qIEZpcnN0IG9mIGFsbCBjbGVhciBzY3JhY2ggcGFkIG1lbW9yeSAqLwotCWZvciAoaSA9IDA7IGkgPCBUM19UWF9DUFVfU1BBRF9TSVpFOyBpKz00KQotCXsKLQkgICAgTE1fUmVnV3JJbmQocERldmljZSxUM19UWF9DUFVfU1BBRF9BRERSK2ksMCk7Ci0JfQotCi0JLyogQ29weSBjb2RlIGZpcnN0ICovCi0JYWRkcmVzcyA9IFQzX1RYX0NQVV9TUEFEX0FERFIgKyAocEZ3SW1nLT5UZXh0Lk9mZnNldCAmIDB4ZmZmZik7Ci0JZm9yIChpPSAwOyBpIDw9IHBGd0ltZy0+VGV4dC5MZW5ndGg7IGkrPTQpCi0JewotCSAgICBMTV9SZWdXckluZChwRGV2aWNlLGFkZHJlc3MraSwKLQkJCSgoTE1fVUlOVDMyICopcEZ3SW1nLT5UZXh0LkJ1ZmZlcilbaS80XSk7Ci0JfQotCi0JYWRkcmVzcyA9IFQzX1RYX0NQVV9TUEFEX0FERFIgKyAocEZ3SW1nLT5ST25seURhdGEuT2Zmc2V0ICYgMHhmZmZmKTsKLQlmb3IgKGk9IDA7IGkgPD0gcEZ3SW1nLT5ST25seURhdGEuTGVuZ3RoOyBpKz00KQotCXsKLQkgICAgTE1fUmVnV3JJbmQocERldmljZSxhZGRyZXNzK2ksCi0JCQkoKExNX1VJTlQzMiAqKXBGd0ltZy0+Uk9ubHlEYXRhLkJ1ZmZlcilbaS80XSk7Ci0JfQotCi0JYWRkcmVzcyA9IFQzX1RYX0NQVV9TUEFEX0FERFIgKyAocEZ3SW1nLT5EYXRhLk9mZnNldCAmIDB4ZmZmZik7Ci0JZm9yIChpPSAwOyBpIDw9IHBGd0ltZy0+RGF0YS5MZW5ndGg7IGkrPTQpCi0JewotCSAgICBMTV9SZWdXckluZChwRGV2aWNlLGFkZHJlc3MraSwKLQkJCSgoTE1fVUlOVDMyICopcEZ3SW1nLT5EYXRhLkJ1ZmZlcilbaS80XSk7Ci0JfQotICAgIH0KLQotICAgIGlmIChTdGFydENwdSAmIFQzX1JYX0NQVV9JRCkKLSAgICB7Ci0JLyogU3RhcnQgUnggQ1BVICovCi0JUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKLQlSRUdfV1IocERldmljZSxyeENwdS5yZWcuUEMscEZ3SW1nLT5TdGFydEFkZHJlc3MpOwotCWZvciAoaSA9IDAgOyBpIDwgNTsgaSsrKQotCXsKLQkgIGlmIChwRndJbWctPlN0YXJ0QWRkcmVzcyA9PSBSRUdfUkQocERldmljZSxyeENwdS5yZWcuUEMpKQotCSAgICAgYnJlYWs7Ci0KLQkgIFJFR19XUihwRGV2aWNlLHJ4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7Ci0JICBSRUdfV1IocERldmljZSxyeENwdS5yZWcubW9kZSxDUFVfTU9ERV9IQUxUKTsKLQkgIFJFR19XUihwRGV2aWNlLHJ4Q3B1LnJlZy5QQyxwRndJbWctPlN0YXJ0QWRkcmVzcyk7Ci0JICBNTV9XYWl0KDEwMDApOwotCX0KLQotCVJFR19XUihwRGV2aWNlLHJ4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7Ci0JUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLm1vZGUsIDApOwotICAgIH0KLQotICAgIGlmIChTdGFydENwdSAmIFQzX1RYX0NQVV9JRCkKLSAgICB7Ci0JLyogU3RhcnQgVHggQ1BVICovCi0JUkVHX1dSKHBEZXZpY2UsdHhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKLQlSRUdfV1IocERldmljZSx0eENwdS5yZWcuUEMscEZ3SW1nLT5TdGFydEFkZHJlc3MpOwotCWZvciAoaSA9IDAgOyBpIDwgNTsgaSsrKQotCXsKLQkgIGlmIChwRndJbWctPlN0YXJ0QWRkcmVzcyA9PSBSRUdfUkQocERldmljZSx0eENwdS5yZWcuUEMpKQotCSAgICAgYnJlYWs7Ci0KLQkgIFJFR19XUihwRGV2aWNlLHR4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7Ci0JICBSRUdfV1IocERldmljZSx0eENwdS5yZWcubW9kZSxDUFVfTU9ERV9IQUxUKTsKLQkgIFJFR19XUihwRGV2aWNlLHR4Q3B1LnJlZy5QQyxwRndJbWctPlN0YXJ0QWRkcmVzcyk7Ci0JICBNTV9XYWl0KDEwMDApOwotCX0KLQotCVJFR19XUihwRGV2aWNlLHR4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7Ci0JUkVHX1dSKHBEZXZpY2UsdHhDcHUucmVnLm1vZGUsIDApOwotICAgIH0KLQotICAgIHJldHVybiBMTV9TVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLVNUQVRJQyBMTV9TVEFUVVMgTE1fSGFsdENwdShQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsTE1fVUlOVDMyIGNwdV9udW1iZXIpCitTVEFUSUMgTE1fU1RBVFVTIExNX0hhbHRDcHUgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIGNwdV9udW1iZXIpCiB7Ci0gICAgTE1fVUlOVDMyIGk7CisJTE1fVUlOVDMyIGk7CiAKLSAgICBpZiAoY3B1X251bWJlciA9PSBUM19SWF9DUFVfSUQpCi0gICAgewotCWZvciAoaSA9IDAgOyBpIDwgMTAwMDA7IGkrKykKLQl7Ci0JICAgIFJFR19XUihwRGV2aWNlLHJ4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7Ci0JICAgIFJFR19XUihwRGV2aWNlLHJ4Q3B1LnJlZy5tb2RlLENQVV9NT0RFX0hBTFQpOworCWlmIChjcHVfbnVtYmVyID09IFQzX1JYX0NQVV9JRCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworCQkJUkVHX1dSIChwRGV2aWNlLCByeENwdS5yZWcuc3RhdGUsIDB4ZmZmZmZmZmYpOworCQkJUkVHX1dSIChwRGV2aWNlLCByeENwdS5yZWcubW9kZSwgQ1BVX01PREVfSEFMVCk7CiAKLQkgICAgaWYgKFJFR19SRChwRGV2aWNlLHJ4Q3B1LnJlZy5tb2RlKSAmIENQVV9NT0RFX0hBTFQpCi0JICAgICAgYnJlYWs7CisJCQlpZiAoUkVHX1JEIChwRGV2aWNlLCByeENwdS5yZWcubW9kZSkgJiBDUFVfTU9ERV9IQUxUKQorCQkJCWJyZWFrOworCQl9CisKKwkJUkVHX1dSIChwRGV2aWNlLCByeENwdS5yZWcuc3RhdGUsIDB4ZmZmZmZmZmYpOworCQlSRUdfV1IgKHBEZXZpY2UsIHJ4Q3B1LnJlZy5tb2RlLCBDUFVfTU9ERV9IQUxUKTsKKwkJTU1fV2FpdCAoMTApOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisJCQlSRUdfV1IgKHBEZXZpY2UsIHR4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7CisJCQlSRUdfV1IgKHBEZXZpY2UsIHR4Q3B1LnJlZy5tb2RlLCBDUFVfTU9ERV9IQUxUKTsKKworCQkJaWYgKFJFR19SRCAocERldmljZSwgdHhDcHUucmVnLm1vZGUpICYgQ1BVX01PREVfSEFMVCkKKwkJCQlicmVhazsKKwkJfQogCX0KIAotCVJFR19XUihwRGV2aWNlLHJ4Q3B1LnJlZy5zdGF0ZSwgMHhmZmZmZmZmZik7Ci0JUkVHX1dSKHBEZXZpY2UscnhDcHUucmVnLm1vZGUsQ1BVX01PREVfSEFMVCk7Ci0JTU1fV2FpdCgxMCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JZm9yIChpID0gMCA7IGkgPCAxMDAwMDsgaSsrKQotCXsKLQkgICAgUkVHX1dSKHBEZXZpY2UsdHhDcHUucmVnLnN0YXRlLCAweGZmZmZmZmZmKTsKLQkgICAgUkVHX1dSKHBEZXZpY2UsdHhDcHUucmVnLm1vZGUsQ1BVX01PREVfSEFMVCk7Ci0KLQkgICAgaWYgKFJFR19SRChwRGV2aWNlLHR4Q3B1LnJlZy5tb2RlKSAmIENQVV9NT0RFX0hBTFQpCi0JICAgICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuICgoIGkgPT0gMTAwMDApID8gTE1fU1RBVFVTX0ZBSUxVUkUgOiBMTV9TVEFUVVNfU1VDQ0VTUyk7CisJcmV0dXJuICgoaSA9PSAxMDAwMCkgPyBMTV9TVEFUVVNfRkFJTFVSRSA6IExNX1NUQVRVU19TVUNDRVNTKTsKIH0KIAotCi1pbnQKLUxNX0JsaW5rTEVEKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIEJsaW5rRHVyYXRpb25TZWMpCitpbnQgTE1fQmxpbmtMRUQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIEJsaW5rRHVyYXRpb25TZWMpCiB7CiAJTE1fVUlOVDMyIE9sZGNmZzsKIAlpbnQgajsKIAlpbnQgcmV0ID0gMDsKIAotCWlmKEJsaW5rRHVyYXRpb25TZWMgPT0gMCkKLQl7CisJaWYgKEJsaW5rRHVyYXRpb25TZWMgPT0gMCkgewogCQlyZXR1cm4gMDsKIAl9Ci0JaWYoQmxpbmtEdXJhdGlvblNlYyA+IDEyMCkKLQl7CisJaWYgKEJsaW5rRHVyYXRpb25TZWMgPiAxMjApIHsKIAkJQmxpbmtEdXJhdGlvblNlYyA9IDEyMDsKIAl9CiAKLQlPbGRjZmcgPSBSRUdfUkQocERldmljZSwgTWFjQ3RybC5MZWRDdHJsKTsKLQlmb3IoaiA9IDA7IGogPCBCbGlua0R1cmF0aW9uU2VjICogMjsgaisrKQotCXsKLQkJaWYoaiAlIDIpCi0JCXsKKwlPbGRjZmcgPSBSRUdfUkQgKHBEZXZpY2UsIE1hY0N0cmwuTGVkQ3RybCk7CisJZm9yIChqID0gMDsgaiA8IEJsaW5rRHVyYXRpb25TZWMgKiAyOyBqKyspIHsKKwkJaWYgKGogJSAyKSB7CiAJCQkvKiBUdXJuIG9uIHRoZSBMRURzLiAqLwotCQkJUkVHX1dSKHBEZXZpY2UsIE1hY0N0cmwuTGVkQ3RybCwKKwkJCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5MZWRDdHJsLAogCQkJCUxFRF9DVFJMX09WRVJSSURFX0xJTktfTEVEIHwKIAkJCQlMRURfQ1RSTF8xMDAwTUJQU19MRURfT04gfAogCQkJCUxFRF9DVFJMXzEwME1CUFNfTEVEX09OIHwKQEAgLTYwNDcsMTU0ICs1NTQ3LDE1MyBAQAogCQkJCUxFRF9DVFJMX09WRVJSSURFX1RSQUZGSUNfTEVEIHwKIAkJCQlMRURfQ1RSTF9CTElOS19UUkFGRklDX0xFRCB8CiAJCQkJTEVEX0NUUkxfVFJBRkZJQ19MRUQpOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJLyogVHVybiBvZmYgdGhlIExFRHMuICovCi0JCQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5MZWRDdHJsLAorCQkJUkVHX1dSIChwRGV2aWNlLCBNYWNDdHJsLkxlZEN0cmwsCiAJCQkJTEVEX0NUUkxfT1ZFUlJJREVfTElOS19MRUQgfAogCQkJCUxFRF9DVFJMX09WRVJSSURFX1RSQUZGSUNfTEVEKTsKIAkJfQogCiAjaWZuZGVmIEVNQkVEREVECiAJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlpZiAoc2NoZWR1bGVfdGltZW91dChIWi8yKSAhPSAwKSB7CisJCWlmIChzY2hlZHVsZV90aW1lb3V0IChIWiAvIDIpICE9IDApIHsKIAkJCXJldCA9IC1FSU5UUjsKIAkJCWJyZWFrOwogCQl9CiAjZWxzZQotCQl1ZGVsYXkoMTAwMDAwKTsgIC8qIDFzIHNsZWVwICovCisJCXVkZWxheSAoMTAwMDAwKTsJLyogMXMgc2xlZXAgKi8KICNlbmRpZgogCX0KLQlSRUdfV1IocERldmljZSwgTWFjQ3RybC5MZWRDdHJsLCBPbGRjZmcpOworCVJFR19XUiAocERldmljZSwgTWFjQ3RybC5MZWRDdHJsLCBPbGRjZmcpOwogCXJldHVybiByZXQ7CiB9CiAKLWludCB0M19kb19kbWEoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotCQkgICBMTV9QSFlTSUNBTF9BRERSRVNTIGhvc3RfYWRkcl9waHksIGludCBsZW5ndGgsCi0JCSAgIGludCBkbWFfcmVhZCkKK2ludCB0M19kb19kbWEgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwKKwkgICAgICAgTE1fUEhZU0lDQUxfQUREUkVTUyBob3N0X2FkZHJfcGh5LCBpbnQgbGVuZ3RoLCBpbnQgZG1hX3JlYWQpCiB7Ci0gICAgVDNfRE1BX0RFU0MgZG1hX2Rlc2M7Ci0gICAgaW50IGk7Ci0gICAgTE1fVUlOVDMyIGRtYV9kZXNjX2FkZHI7Ci0gICAgTE1fVUlOVDMyIHZhbHVlMzI7CisJVDNfRE1BX0RFU0MgZG1hX2Rlc2M7CisJaW50IGk7CisJTE1fVUlOVDMyIGRtYV9kZXNjX2FkZHI7CisJTE1fVUlOVDMyIHZhbHVlMzI7CiAKLSAgICBSRUdfV1IocERldmljZSwgQnVmTWdyLk1vZGUsIDApOwotICAgIFJFR19XUihwRGV2aWNlLCBGdHEuUmVzZXQsIDApOworCVJFR19XUiAocERldmljZSwgQnVmTWdyLk1vZGUsIDApOworCVJFR19XUiAocERldmljZSwgRnRxLlJlc2V0LCAwKTsKIAotICAgIGRtYV9kZXNjLmhvc3RfYWRkci5IaWdoID0gaG9zdF9hZGRyX3BoeS5IaWdoOwotICAgIGRtYV9kZXNjLmhvc3RfYWRkci5Mb3cgPSBob3N0X2FkZHJfcGh5LkxvdzsKLSAgICBkbWFfZGVzYy5uaWNfbWJ1ZiA9IDB4MjEwMDsKLSAgICBkbWFfZGVzYy5sZW4gPSBsZW5ndGg7Ci0gICAgZG1hX2Rlc2MuZmxhZ3MgPSAweDAwMDAwMDA0OyAvKiBHZW5lcmF0ZSBSeC1DUFUgZXZlbnQgKi8KKwlkbWFfZGVzYy5ob3N0X2FkZHIuSGlnaCA9IGhvc3RfYWRkcl9waHkuSGlnaDsKKwlkbWFfZGVzYy5ob3N0X2FkZHIuTG93ID0gaG9zdF9hZGRyX3BoeS5Mb3c7CisJZG1hX2Rlc2MubmljX21idWYgPSAweDIxMDA7CisJZG1hX2Rlc2MubGVuID0gbGVuZ3RoOworCWRtYV9kZXNjLmZsYWdzID0gMHgwMDAwMDAwNDsJLyogR2VuZXJhdGUgUngtQ1BVIGV2ZW50ICovCiAKLSAgICBpZiAoZG1hX3JlYWQpCi0gICAgewotCWRtYV9kZXNjLmNxaWRfc3FpZCA9IChUM19RSURfUlhfQkRfQ09NUCA8PCA4KSB8Ci0JICAgIFQzX1FJRF9ETUFfSElHSF9QUklfUkVBRDsKLQlSRUdfV1IocERldmljZSwgRG1hUmVhZC5Nb2RlLCBETUFfUkVBRF9NT0RFX0VOQUJMRSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JZG1hX2Rlc2MuY3FpZF9zcWlkID0gKFQzX1FJRF9SWF9EQVRBX0NPTVAgPDwgOCkgfAotCSAgICBUM19RSURfRE1BX0hJR0hfUFJJX1dSSVRFOwotCVJFR19XUihwRGV2aWNlLCBEbWFXcml0ZS5Nb2RlLCBETUFfV1JJVEVfTU9ERV9FTkFCTEUpOwotICAgIH0KKwlpZiAoZG1hX3JlYWQpIHsKKwkJZG1hX2Rlc2MuY3FpZF9zcWlkID0gKFQzX1FJRF9SWF9CRF9DT01QIDw8IDgpIHwKKwkJICAgIFQzX1FJRF9ETUFfSElHSF9QUklfUkVBRDsKKwkJUkVHX1dSIChwRGV2aWNlLCBEbWFSZWFkLk1vZGUsIERNQV9SRUFEX01PREVfRU5BQkxFKTsKKwl9IGVsc2UgeworCQlkbWFfZGVzYy5jcWlkX3NxaWQgPSAoVDNfUUlEX1JYX0RBVEFfQ09NUCA8PCA4KSB8CisJCSAgICBUM19RSURfRE1BX0hJR0hfUFJJX1dSSVRFOworCQlSRUdfV1IgKHBEZXZpY2UsIERtYVdyaXRlLk1vZGUsIERNQV9XUklURV9NT0RFX0VOQUJMRSk7CisJfQogCi0gICAgZG1hX2Rlc2NfYWRkciA9IFQzX05JQ19ETUFfREVTQ19QT09MX0FERFI7CisJZG1hX2Rlc2NfYWRkciA9IFQzX05JQ19ETUFfREVTQ19QT09MX0FERFI7CiAKLSAgICAvKiBXcml0aW5nIHRoaXMgRE1BIGRlc2NyaXB0b3IgdG8gRE1BIG1lbW9yeSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoVDNfRE1BX0RFU0MpOyBpICs9IDQpCi0gICAgewotCXZhbHVlMzIgPSAqKChQTE1fVUlOVDMyKSAoKChQTE1fVUlOVDgpICZkbWFfZGVzYykgKyBpKSk7Ci0JTU1fV3JpdGVDb25maWczMihwRGV2aWNlLCBUM19QQ0lfTUVNX1dJTl9BRERSX1JFRywgZG1hX2Rlc2NfYWRkcitpKTsKLQlNTV9Xcml0ZUNvbmZpZzMyKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0RBVEFfUkVHLCBjcHVfdG9fbGUzMih2YWx1ZTMyKSk7Ci0gICAgfQotICAgIE1NX1dyaXRlQ29uZmlnMzIocERldmljZSwgVDNfUENJX01FTV9XSU5fQUREUl9SRUcsIDApOworCS8qIFdyaXRpbmcgdGhpcyBETUEgZGVzY3JpcHRvciB0byBETUEgbWVtb3J5ICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAoVDNfRE1BX0RFU0MpOyBpICs9IDQpIHsKKwkJdmFsdWUzMiA9ICooKFBMTV9VSU5UMzIpICgoKFBMTV9VSU5UOCkgJiBkbWFfZGVzYykgKyBpKSk7CisJCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0FERFJfUkVHLAorCQkJCSAgZG1hX2Rlc2NfYWRkciArIGkpOworCQlNTV9Xcml0ZUNvbmZpZzMyIChwRGV2aWNlLCBUM19QQ0lfTUVNX1dJTl9EQVRBX1JFRywKKwkJCQkgIGNwdV90b19sZTMyICh2YWx1ZTMyKSk7CisJfQorCU1NX1dyaXRlQ29uZmlnMzIgKHBEZXZpY2UsIFQzX1BDSV9NRU1fV0lOX0FERFJfUkVHLCAwKTsKIAotICAgIGlmIChkbWFfcmVhZCkKLQlSRUdfV1IocERldmljZSwgRnRxLkRtYUhpZ2hSZWFkRnRxRmlmb0VucXVldWVEZXF1ZXVlLCBkbWFfZGVzY19hZGRyKTsKLSAgICBlbHNlCi0JUkVHX1dSKHBEZXZpY2UsIEZ0cS5EbWFIaWdoV3JpdGVGdHFGaWZvRW5xdWV1ZURlcXVldWUsIGRtYV9kZXNjX2FkZHIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDQwOyBpKyspCi0gICAgewogCWlmIChkbWFfcmVhZCkKLQkgICAgdmFsdWUzMiA9IFJFR19SRChwRGV2aWNlLCBGdHEuUmN2QmRDb21wRnRxRmlmb0VucXVldWVEZXF1ZXVlKTsKKwkJUkVHX1dSIChwRGV2aWNlLCBGdHEuRG1hSGlnaFJlYWRGdHFGaWZvRW5xdWV1ZURlcXVldWUsCisJCQlkbWFfZGVzY19hZGRyKTsKIAllbHNlCi0JICAgIHZhbHVlMzIgPSBSRUdfUkQocERldmljZSwgRnRxLlJjdkRhdGFDb21wRnRxRmlmb0VucXVldWVEZXF1ZXVlKTsKKwkJUkVHX1dSIChwRGV2aWNlLCBGdHEuRG1hSGlnaFdyaXRlRnRxRmlmb0VucXVldWVEZXF1ZXVlLAorCQkJZG1hX2Rlc2NfYWRkcik7CiAKLQlpZiAoKHZhbHVlMzIgJiAweGZmZmYpID09IGRtYV9kZXNjX2FkZHIpCi0JICAgIGJyZWFrOworCWZvciAoaSA9IDA7IGkgPCA0MDsgaSsrKSB7CisJCWlmIChkbWFfcmVhZCkKKwkJCXZhbHVlMzIgPQorCQkJICAgIFJFR19SRCAocERldmljZSwKKwkJCQkgICAgRnRxLlJjdkJkQ29tcEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZSk7CisJCWVsc2UKKwkJCXZhbHVlMzIgPQorCQkJICAgIFJFR19SRCAocERldmljZSwKKwkJCQkgICAgRnRxLlJjdkRhdGFDb21wRnRxRmlmb0VucXVldWVEZXF1ZXVlKTsKIAotCU1NX1dhaXQoMTApOwotICAgIH0KKwkJaWYgKCh2YWx1ZTMyICYgMHhmZmZmKSA9PSBkbWFfZGVzY19hZGRyKQorCQkJYnJlYWs7CiAKLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CisJCU1NX1dhaXQgKDEwKTsKKwl9CisKKwlyZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIFNUQVRJQyBMTV9TVEFUVVMKLUxNX0RtYVRlc3QoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fVUlOVDggcEJ1ZmZlclZpcnQsCi0JICAgTE1fUEhZU0lDQUxfQUREUkVTUyBCdWZmZXJQaHksIExNX1VJTlQzMiBCdWZmZXJTaXplKQorTE1fRG1hVGVzdCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBQTE1fVUlOVDggcEJ1ZmZlclZpcnQsCisJICAgIExNX1BIWVNJQ0FMX0FERFJFU1MgQnVmZmVyUGh5LCBMTV9VSU5UMzIgQnVmZmVyU2l6ZSkKIHsKLSAgICBpbnQgajsKLSAgICBMTV9VSU5UMzIgKnB0cjsKLSAgICBpbnQgZG1hX3N1Y2Nlc3MgPSAwOworCWludCBqOworCUxNX1VJTlQzMiAqcHRyOworCWludCBkbWFfc3VjY2VzcyA9IDA7CiAKLSAgICBpZihUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0FTSUNfUkVWXzU3MDAgJiYKLQlUM19BU0lDX1JFVihwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0FTSUNfUkVWXzU3MDEpCi0gICAgeworCWlmIChUM19BU0lDX1JFViAocERldmljZS0+Q2hpcFJldklkKSAhPSBUM19BU0lDX1JFVl81NzAwICYmCisJICAgIFQzX0FTSUNfUkVWIChwRGV2aWNlLT5DaGlwUmV2SWQpICE9IFQzX0FTSUNfUkVWXzU3MDEpIHsKKwkJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOworCX0KKwl3aGlsZSAoIWRtYV9zdWNjZXNzKSB7CisJCS8qIEZpbGwgZGF0YSB3aXRoIGluY3JlbWVudGFsIHBhdHRlcm5zICovCisJCXB0ciA9IChMTV9VSU5UMzIgKikgcEJ1ZmZlclZpcnQ7CisJCWZvciAoaiA9IDA7IGogPCBCdWZmZXJTaXplIC8gNDsgaisrKQorCQkJKnB0cisrID0gajsKKworCQlpZiAodDNfZG9fZG1hIChwRGV2aWNlLCBCdWZmZXJQaHksIEJ1ZmZlclNpemUsIDEpID09CisJCSAgICBMTV9TVEFUVVNfRkFJTFVSRSkgeworCQkJcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworCQl9CisKKwkJTU1fV2FpdCAoNDApOworCQlwdHIgPSAoTE1fVUlOVDMyICopIHBCdWZmZXJWaXJ0OworCQkvKiBGaWxsIGRhdGEgd2l0aCB6ZXJvICovCisJCWZvciAoaiA9IDA7IGogPCBCdWZmZXJTaXplIC8gNDsgaisrKQorCQkJKnB0cisrID0gMDsKKworCQlpZiAodDNfZG9fZG1hIChwRGV2aWNlLCBCdWZmZXJQaHksIEJ1ZmZlclNpemUsIDApID09CisJCSAgICBMTV9TVEFUVVNfRkFJTFVSRSkgeworCQkJcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOworCQl9CisKKwkJTU1fV2FpdCAoNDApOworCQkvKiBDaGVjayBmb3IgZGF0YSAqLworCQlwdHIgPSAoTE1fVUlOVDMyICopIHBCdWZmZXJWaXJ0OworCQlmb3IgKGogPSAwOyBqIDwgQnVmZmVyU2l6ZSAvIDQ7IGorKykgeworCQkJaWYgKCpwdHIrKyAhPSBqKSB7CisJCQkJaWYgKChwRGV2aWNlLT4KKwkJCQkgICAgIERtYVJlYWRXcml0ZUN0cmwgJgorCQkJCSAgICAgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfTUFTSykKKwkJCQkgICAgPT0gRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfRElTQUJMRSkgeworCQkJCQlwRGV2aWNlLT5EbWFSZWFkV3JpdGVDdHJsID0KKwkJCQkJICAgIChwRGV2aWNlLT4KKwkJCQkJICAgICBEbWFSZWFkV3JpdGVDdHJsICYKKwkJCQkJICAgICB+RE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfTUFTSykgfAorCQkJCQkgICAgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfMTY7CisJCQkJCVJFR19XUiAocERldmljZSwKKwkJCQkJCVBjaUNmZy5EbWFSZWFkV3JpdGVDdHJsLAorCQkJCQkJcERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCk7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGogPT0gKEJ1ZmZlclNpemUgLyA0KSkKKwkJCWRtYV9zdWNjZXNzID0gMTsKKwl9CiAJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwotICAgIH0KLSAgICB3aGlsZSAoIWRtYV9zdWNjZXNzKQotICAgIHsKLQkvKiBGaWxsIGRhdGEgd2l0aCBpbmNyZW1lbnRhbCBwYXR0ZXJucyAqLwotCXB0ciA9IChMTV9VSU5UMzIgKilwQnVmZmVyVmlydDsKLQlmb3IgKGogPSAwOyBqIDwgQnVmZmVyU2l6ZS80OyBqKyspCi0JICAgICpwdHIrKyA9IGo7Ci0KLQlpZiAodDNfZG9fZG1hKHBEZXZpY2UsQnVmZmVyUGh5LEJ1ZmZlclNpemUsIDEpID09IExNX1NUQVRVU19GQUlMVVJFKQotCXsKLQkgICAgcmV0dXJuIExNX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCU1NX1dhaXQoNDApOwotCXB0ciA9IChMTV9VSU5UMzIgKilwQnVmZmVyVmlydDsKLQkvKiBGaWxsIGRhdGEgd2l0aCB6ZXJvICovCi0JZm9yIChqID0gMDsgaiA8IEJ1ZmZlclNpemUvNDsgaisrKQotCSAgICAqcHRyKysgPSAwOwotCi0JaWYgKHQzX2RvX2RtYShwRGV2aWNlLEJ1ZmZlclBoeSxCdWZmZXJTaXplLCAwKSA9PSBMTV9TVEFUVVNfRkFJTFVSRSkKLQl7Ci0JICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQlNTV9XYWl0KDQwKTsKLQkvKiBDaGVjayBmb3IgZGF0YSAqLwotCXB0ciA9IChMTV9VSU5UMzIgKilwQnVmZmVyVmlydDsKLQlmb3IgKGogPSAwOyBqIDwgQnVmZmVyU2l6ZS80OyBqKyspCi0JewotCSAgICBpZiAoKnB0cisrICE9IGopCi0JICAgIHsKLQkJaWYgKChwRGV2aWNlLT5EbWFSZWFkV3JpdGVDdHJsICYgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfTUFTSykKLQkJICAgID09IERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZX0RJU0FCTEUpCi0JCXsKLQkJICAgIHBEZXZpY2UtPkRtYVJlYWRXcml0ZUN0cmwgPSAocERldmljZS0+RG1hUmVhZFdyaXRlQ3RybCAmCi0JCQkgfkRNQV9DVFJMX1dSSVRFX0JPVU5EQVJZX01BU0spIHwKLQkJCSAgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfMTY7Ci0JCSAgICBSRUdfV1IocERldmljZSwgUGNpQ2ZnLkRtYVJlYWRXcml0ZUN0cmwsCi0JCQkgICBwRGV2aWNlLT5EbWFSZWFkV3JpdGVDdHJsKTsKLQkJICAgIGJyZWFrOwotCQkgfQotCQkgZWxzZQotCQkgewotCQkgICAgIHJldHVybiBMTV9TVEFUVVNfRkFJTFVSRTsKLQkJIH0KLQkgICAgfQotCX0KLQlpZiAoaiA9PSAoQnVmZmVyU2l6ZS80KSkKLQkgICAgZG1hX3N1Y2Nlc3MgPSAxOwotICAgIH0KLSAgICByZXR1cm4gTE1fU1RBVFVTX1NVQ0NFU1M7CiB9Ci0jZW5kaWYgLyogQ0ZHX0NNRF9ORVQsICFDT05GSUdfTkVUX01VTFRJLCBDT05GSUdfVElHT04zICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90aWdvbjMuaCBiL2RyaXZlcnMvdGlnb24zLmgKaW5kZXggZWE0MzY3ZC4uYzAzMzQ3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy90aWdvbjMuaAorKysgYi9kcml2ZXJzL3RpZ29uMy5oCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAiYmNtNTcweF9hdXRvbmVnLmgiCiAjZW5kaWYKIAotCiAvKiBpbyBkZWZpbmVzICovCiAjaWYgIWRlZmluZWQoQklHX0VORElBTl9IT1NUKQogI2RlZmluZSByZWFkbChhZGRyKSBcCkBAIC0yOSw3ICsyOCw3IEBACiAjZGVmaW5lIHdyaXRlbChiLGFkZHIpIFwKIAkgICAgICAoKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKGFkZHIpKSA9IChMT05HU1dBUChiKSkpCiAjZWxzZQotI2lmIDAgLyogIWRlZmluZWQoUFBDNjAzKSAqLworI2lmIDAJCQkJLyogIWRlZmluZWQoUFBDNjAzKSAqLwogI2RlZmluZSByZWFkbChhZGRyKSAoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQqKSgweGEwMDAwMDAwICsgKHVuc2lnbmVkIGxvbmcpKGFkZHIpKSkKICNkZWZpbmUgd3JpdGVsKGIsYWRkcikgKCgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoKHVuc2lnbmVkIGxvbmcpKGFkZHIpICsgMHhhMDAwMDAwMCkpID0gKGIpKQogI2Vsc2UKQEAgLTM3LDI1ICszNiwyOCBAQAogI2RlZmluZSByZWFkbChhZGRyKSAoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQqKShhZGRyKSkKICNkZWZpbmUgd3JpdGVsKGIsYWRkcikgKCgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoYWRkcikpID0gKGIpKQogI2Vsc2UKLWV4dGVybiBpbnQgc3ByaW50ZihjaGFyKiBidWYsIGNvbnN0IGNoYXIqIGYsIC4uLik7Ci1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50IHJlYWRsKHZvaWQqIGFkZHIpewotICAgIGNoYXIgYnVmWzEyOF07Ci0gICAgdW5zaWduZWQgaW50IHRtcCA9ICgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCopKGFkZHIpKTsKLSAgICBzcHJpbnRmKGJ1ZiwiJXM6JXM6IHJlYWQgMHgleCBmcm9tIDB4JXhcbiIsX19GSUxFX18sX19MSU5FX18sdG1wLGFkZHIsMCwwKTsKLSAgICBzeXNTZXJpYWxQcmludFN0cmluZyhidWYpOwotICAgIHJldHVybiB0bXA7CitleHRlcm4gaW50IHNwcmludGYgKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZiwgLi4uKTsKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQgcmVhZGwgKHZvaWQgKmFkZHIpCit7CisJY2hhciBidWZbMTI4XTsKKwl1bnNpZ25lZCBpbnQgdG1wID0gKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKGFkZHIpKTsKKwlzcHJpbnRmIChidWYsICIlczolczogcmVhZCAweCV4IGZyb20gMHgleFxuIiwgX19GSUxFX18sIF9fTElORV9fLCB0bXAsCisJCSBhZGRyLCAwLCAwKTsKKwlzeXNTZXJpYWxQcmludFN0cmluZyAoYnVmKTsKKwlyZXR1cm4gdG1wOwogfQotc3RhdGljIF9faW5saW5lIHZvaWQgd3JpdGVsKHVuc2lnbmVkIGludCBiLCB1bnNpZ25lZCBpbnQgYWRkcil7Ci0gICAgY2hhciBidWZbMTI4XTsKLSAgICAoKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIChhZGRyKSkgPSAoYikpOwotICAgIHNwcmludGYoYnVmLCIlczolczogd3JpdGUgMHgleCB0byAweCV4XG4iLF9fRklMRV9fLF9fTElORV9fLGIsYWRkciwwLDApOwotICAgIHN5c1NlcmlhbFByaW50U3RyaW5nKGJ1Zik7CitzdGF0aWMgX19pbmxpbmUgdm9pZCB3cml0ZWwgKHVuc2lnbmVkIGludCBiLCB1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwljaGFyIGJ1ZlsxMjhdOworCSgoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoYWRkcikpID0gKGIpKTsKKwlzcHJpbnRmIChidWYsICIlczolczogd3JpdGUgMHgleCB0byAweCV4XG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIGIsCisJCSBhZGRyLCAwLCAwKTsKKwlzeXNTZXJpYWxQcmludFN0cmluZyAoYnVmKTsKIH0KICNlbmRpZgotI2VuZGlmIC8qIFBQQzYwMyAqLworI2VuZGlmCQkJCS8qIFBQQzYwMyAqLwogI2VuZGlmCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIENvbnN0YW50cy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05MCw3ICs5Miw3IEBACiAKIC8qIEIwIGJ1Zy4gKi8KICNkZWZpbmUgQkNNNTcwMF9CWF9NSU5fRlJBR19TSVpFICAgICAgICAgICAgMTAKLSNkZWZpbmUgQkNNNTcwMF9CWF9NSU5fRlJBR19CVUZfU0laRSAgICAgICAgMTYgIC8qIG5pY2UgYWxpZ25lZCBzaXplLiAqLworI2RlZmluZSBCQ001NzAwX0JYX01JTl9GUkFHX0JVRl9TSVpFICAgICAgICAxNgkvKiBuaWNlIGFsaWduZWQgc2l6ZS4gKi8KICNkZWZpbmUgQkNNNTcwMF9CWF9NSU5fRlJBR19CVUZfU0laRV9NQVNLICAgKEJDTTU3MDBfQlhfTUlOX0ZSQUdfQlVGX1NJWkUtMSkKICNkZWZpbmUgQkNNNTcwMF9CWF9UWF9DT1BZX0JVRl9TSVpFICAgICAgICAgKEJDTTU3MDBfQlhfTUlOX0ZSQUdfQlVGX1NJWkUgKiBcCiAJCQkJCSAgICBNQVhfRlJBR01FTlRfQ09VTlQpCkBAIC0xNjEsMzIgKzE2MywzMiBAQAogLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIFN0YW5kYXJkIFJlY2VpdmUgUkNCLiAgTXVzdCBiZSA1MTIgZW50cmllcy4gKi8KICNkZWZpbmUgVDNfU1REX1JDVl9SQ0JfRU5UUllfQ09VTlQgICAgICAgICAgNTEyCiAjZGVmaW5lIFQzX1NURF9SQ1ZfUkNCX0VOVFJZX0NPVU5UX01BU0sgICAgIChUM19TVERfUkNWX1JDQl9FTlRSWV9DT1VOVC0xKQotI2RlZmluZSBERUZBVUxUX1NURF9SQ1ZfREVTQ19DT1VOVCAgICAgICAgICAyMDAgICAgLyogTXVzdCBiZSA8IDUxMi4gKi8KKyNkZWZpbmUgREVGQVVMVF9TVERfUkNWX0RFU0NfQ09VTlQgICAgICAgICAgMjAwCS8qIE11c3QgYmUgPCA1MTIuICovCiAjZGVmaW5lIE1BWF9TVERfUkNWX0JVRkZFUl9TSVpFICAgICAgICAgICAgIDB4NjAwCiAKIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBNaW5pIFJlY2VpdmUgUkNCLiAgVGhpcyB2YWx1ZSBjYW4gZWl0aGVyIGJlICovCiAvKiAwLCAxMDI0LiAgQ3VycmVudGx5IE1pbmkgUmVjZWl2ZSBSQ0IgaXMgZGlzYWJsZWQuICovCiAjaWZuZGVmIFQzX01JTklfUkNWX1JDQl9FTlRSWV9DT1VOVAogI2RlZmluZSBUM19NSU5JX1JDVl9SQ0JfRU5UUllfQ09VTlQgICAgICAgICAwCi0jZW5kaWYgLyogVDNfTUlOSV9SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCisjZW5kaWYJCQkJLyogVDNfTUlOSV9SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCiAjZGVmaW5lIFQzX01JTklfUkNWX1JDQl9FTlRSWV9DT1VOVF9NQVNLICAgIChUM19NSU5JX1JDVl9SQ0JfRU5UUllfQ09VTlQtMSkKICNkZWZpbmUgTUFYX01JTklfUkNWX0JVRkZFUl9TSVpFICAgICAgICAgICAgNTEyCiAjZGVmaW5lIERFRkFVTFRfTUlOSV9SQ1ZfQlVGRkVSX1NJWkUgICAgICAgIDY0Ci0jZGVmaW5lIERFRkFVTFRfTUlOSV9SQ1ZfREVTQ19DT1VOVCAgICAgICAgIDEwMCAgICAvKiBNdXN0IGJlIDwgMTAyNC4gKi8KKyNkZWZpbmUgREVGQVVMVF9NSU5JX1JDVl9ERVNDX0NPVU5UICAgICAgICAgMTAwCS8qIE11c3QgYmUgPCAxMDI0LiAqLwogCiAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgSnVtYm8gUmVjZWl2ZSBSQ0IuICBUaGlzIHZhbHVlIG11c3QgMjU2IG9yIDAuICovCiAvKiBDdXJyZW50bHksIEp1bWJvIFJlY2VpdmUgUkNCIGlzIGRpc2FibGVkLiAqLwogI2lmbmRlZiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UCiAjZGVmaW5lIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgICAgICAgIDAKLSNlbmRpZiAvKiBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UICovCisjZW5kaWYJCQkJLyogVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVCAqLwogI2RlZmluZSBUM19KVU1CT19SQ1ZfUkNCX0VOVFJZX0NPVU5UX01BU0sgICAoVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVC0xKQogCi0jZGVmaW5lIE1BWF9KVU1CT19SQ1ZfQlVGRkVSX1NJWkUgICAgICAgICAgICgxMCAqIDEwMjQpIC8qID4gMTUxNCAqLwotI2RlZmluZSBERUZBVUxUX0pVTUJPX1JDVl9CVUZGRVJfU0laRSAgICAgICAoNCAqIDEwMjQpIC8qID4gMTUxNCAqLwotI2RlZmluZSBERUZBVUxUX0pVTUJPX1JDVl9ERVNDX0NPVU5UICAgICAgICAxMjggICAgIC8qIE11c3QgYmUgPCAyNTYuICovCisjZGVmaW5lIE1BWF9KVU1CT19SQ1ZfQlVGRkVSX1NJWkUgICAgICAgICAgICgxMCAqIDEwMjQpCS8qID4gMTUxNCAqLworI2RlZmluZSBERUZBVUxUX0pVTUJPX1JDVl9CVUZGRVJfU0laRSAgICAgICAoNCAqIDEwMjQpCS8qID4gMTUxNCAqLworI2RlZmluZSBERUZBVUxUX0pVTUJPX1JDVl9ERVNDX0NPVU5UICAgICAgICAxMjgJLyogTXVzdCBiZSA8IDI1Ni4gKi8KIAotI2RlZmluZSBNQVhfSlVNQk9fVFhfQlVGRkVSX1NJWkUgICAgICAgICAgICAoOCAqIDEwMjQpIC8qID4gMTUxNCAqLwotI2RlZmluZSBERUZBVUxUX0pVTUJPX1RYX0JVRkZFUl9TSVpFICAgICAgICAoNCAqIDEwMjQpIC8qID4gMTUxNCAqLworI2RlZmluZSBNQVhfSlVNQk9fVFhfQlVGRkVSX1NJWkUgICAgICAgICAgICAoOCAqIDEwMjQpCS8qID4gMTUxNCAqLworI2RlZmluZSBERUZBVUxUX0pVTUJPX1RYX0JVRkZFUl9TSVpFICAgICAgICAoNCAqIDEwMjQpCS8qID4gMTUxNCAqLwogCiAvKiBOdW1iZXIgb2YgcmVjZWl2ZSByZXR1cm4gUkNCcy4gIE1heWJlIDEtMTYgYnV0IGZvciBub3csIG9ubHkgc3VwcG9ydCBvbmUuICovCiAjZGVmaW5lIFQzX01BWF9SQ1ZfUkVUVVJOX1JDQl9DT1VOVCAgICAgICAgIDE2CkBAIC0xOTUsMTAgKzE5Nyw5IEBACiAvKiBvciAyMDQ4LiAqLwogI2lmbmRlZiBUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVAogI2RlZmluZSBUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVCAgICAgICAxMDI0Ci0jZW5kaWYgLyogVDNfUkNWX1JFVFVSTl9SQ0JfRU5UUllfQ09VTlQgKi8KKyNlbmRpZgkJCQkvKiBUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVCAqLwogI2RlZmluZSBUM19SQ1ZfUkVUVVJOX1JDQl9FTlRSWV9DT1VOVF9NQVNLICAoVDNfUkNWX1JFVFVSTl9SQ0JfRU5UUllfQ09VTlQtMSkKIAotCiAvKiBEZWZhdWx0IGNvYWxlc2NpbmcgcGFyYW1ldGVycy4gKi8KICNkZWZpbmUgREVGQVVMVF9SWF9DT0FMRVNDSU5HX1RJQ0tTICAgICAgICAgMTAwCiAjZGVmaW5lIE1BWF9SWF9DT0FMRVNDSU5HX1RJQ0tTICAgICAgICAgICAgIDUwMApAQCAtMjI3LDcgKzIyOCw2IEBACiAjZGVmaW5lIERFRkFVTFRfU1RBVFNfQ09BTEVTQ0lOR19USUNLUyAgICAgIDEwMDAwMDAKICNkZWZpbmUgTUFYX1NUQVRTX0NPQUxFU0NJTkdfVElDS1MgICAgICAgICAgMzYwMDAwMDAwMFUKIAotCiAvKiBSZWNlaXZlIEJEIFJlcGxlbmlzaCB0aHJlc2hvbGRzLiAqLwogI2RlZmluZSBERUZBVUxUX1JDVl9TVERfQkRfUkVQTEVOSVNIX1RIUkVTSE9MRCAgICAgIDQKICNkZWZpbmUgREVGQVVMVF9SQ1ZfSlVNQk9fQkRfUkVQTEVOSVNIX1RIUkVTSE9MRCAgICA0CkBAIC0yNDAsMTIgKzI0MCwxMCBAQAogLyogTWF4aW11bSBwaHlzaWNhbCBmcmFnbWVudCBzaXplLiAqLwogI2RlZmluZSBNQVhfRlJBR01FTlRfU0laRSAgICAgICAgICAgICAgICAgICAoNjQgKiAxMDI0KQogCi0KIC8qIFN0YW5kYXJkIHZpZXcuICovCiAjZGVmaW5lIFQzX1NURF9WSUVXX1NJWkUgICAgICAgICAgICAgICAgICAgICg2NCAqIDEwMjQpCiAjZGVmaW5lIFQzX0ZMQVRfVklFV19TSVpFICAgICAgICAgICAgICAgICAgICgzMiAqIDEwMjQgKiAxMDI0KQogCi0KIC8qIEJ1ZmZlciBkZXNjcmlwdG9yIGJhc2UgYWRkcmVzcyBvbiB0aGUgTklDJ3MgbWVtb3J5LiAqLwogCiAjZGVmaW5lIFQzX05JQ19TTkRfQlVGRkVSX0RFU0NfQUREUiAgICAgICAgIDB4NDAwMApAQCAtMjY1LDE5ICsyNjMsMTcgQEAKICNkZWZpbmUgVDNfTklDX0pVTUJPX1JDVl9CVUZGRVJfREVTQ19TSVpFICAgKFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKiBcCiAJCQkJCSAgICBzaXplb2YoVDNfRVhUX1JDVl9CRCkgLyA0KQogCi0KIC8qIE1CVUYgcG9vbC4gKi8KICNkZWZpbmUgVDNfTklDX01CVUZfUE9PTF9BRERSICAgICAgICAgICAgICAgMHg4MDAwCiAvKiAjZGVmaW5lIFQzX05JQ19NQlVGX1BPT0xfU0laRSAgICAgICAgICAgICAgIDB4MTgwMDAgKi8KICNkZWZpbmUgVDNfTklDX01CVUZfUE9PTF9TSVpFOTYgICAgICAgICAgICAgMHgxODAwMAogI2RlZmluZSBUM19OSUNfTUJVRl9QT09MX1NJWkU2NCAgICAgICAgICAgICAweDEwMDAwCiAKLQogI2RlZmluZSBUM19OSUNfTUJVRl9QT09MX0FERFJfRVhUX01FTSAgICAgICAweDIwMDAwCiAKIC8qIERNQSBkZXNjcmlwdG9yIHBvb2wgKi8KICNkZWZpbmUgVDNfTklDX0RNQV9ERVNDX1BPT0xfQUREUiAgICAgICAgICAgMHgyMDAwCi0jZGVmaW5lIFQzX05JQ19ETUFfREVTQ19QT09MX1NJWkUgICAgICAgICAgIDB4MjAwMCAgICAgIC8qIDhLQi4gKi8KKyNkZWZpbmUgVDNfTklDX0RNQV9ERVNDX1BPT0xfU0laRSAgICAgICAgICAgMHgyMDAwCS8qIDhLQi4gKi8KIAogI2RlZmluZSBUM19ERUZfRE1BX01CVUZfTE9XX1dNQVJLICAgICAgICAgICAweDQwCiAjZGVmaW5lIFQzX0RFRl9SWF9NQUNfTUJVRl9MT1dfV01BUksgICAgICAgIDB4MjAKQEAgLTMwMSwyNCArMjk3LDIxIEBACiAjZGVmaW5lIFQzX1RYX0NQVV9TUEFEX0FERFIgIDB4MzQwMDAKICNkZWZpbmUgVDNfVFhfQ1BVX1NQQURfU0laRSAgMHg0MDAwCiAKLXR5cGVkZWYgc3RydWN0IFQzX0RJUl9FTlRSWQotewotICBQTE1fVUlOVDggQnVmZmVyOwotICBMTV9VSU5UMzIgT2Zmc2V0OwotICBMTV9VSU5UMzIgTGVuZ3RoOwotfSBUM19ESVJfRU5UUlksKlBUM19ESVJfRU5UUlk7Cit0eXBlZGVmIHN0cnVjdCBUM19ESVJfRU5UUlkgeworCVBMTV9VSU5UOCBCdWZmZXI7CisJTE1fVUlOVDMyIE9mZnNldDsKKwlMTV9VSU5UMzIgTGVuZ3RoOworfSBUM19ESVJfRU5UUlksICpQVDNfRElSX0VOVFJZOwogCi10eXBlZGVmIHN0cnVjdCBUM19GV0lNR19JTkZPCi17Ci0gIExNX1VJTlQzMiBTdGFydEFkZHJlc3M7Ci0gIFQzX0RJUl9FTlRSWSBUZXh0OwotICBUM19ESVJfRU5UUlkgUk9ubHlEYXRhOwotICBUM19ESVJfRU5UUlkgRGF0YTsKLSAgVDNfRElSX0VOVFJZIFNic3M7Ci0gIFQzX0RJUl9FTlRSWSBCc3M7Cit0eXBlZGVmIHN0cnVjdCBUM19GV0lNR19JTkZPIHsKKwlMTV9VSU5UMzIgU3RhcnRBZGRyZXNzOworCVQzX0RJUl9FTlRSWSBUZXh0OworCVQzX0RJUl9FTlRSWSBST25seURhdGE7CisJVDNfRElSX0VOVFJZIERhdGE7CisJVDNfRElSX0VOVFJZIFNic3M7CisJVDNfRElSX0VOVFJZIEJzczsKIH0gVDNfRldJTUdfSU5GTywgKlBUM19GV0lNR19JTkZPOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBUaWdvbjMgUENJIFJlZ2lzdGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zNjIsNyArMzU1LDYgQEAKICNkZWZpbmUgVDNfQVNJQ19SRVZfNTcwMyAgICAgICAgICAgICAgICAgICAgMHgwMQogI2RlZmluZSBUM19BU0lDX1JFVl81NzA0ICAgICAgICAgICAgICAgICAgICAweDAyCiAKLQogLyogQ2hpcCBpZCBhbmQgcmV2aXNpb24uICovCiAjZGVmaW5lIFQzX0NISVBfUkVWKF9DaGlwUmV2SWQpICAgICAgICAgICAgICgoX0NoaXBSZXZJZCkgPj4gOCkKICNkZWZpbmUgVDNfQ0hJUF9SRVZfNTcwMF9BWCAgICAgICAgICAgICAgICAgMHg3MApAQCAtMzg2LDcgKzM3OCw2IEBACiAjZGVmaW5lIFQzX1BDSV9QT1dFUl9ET1dOX1BDSV9QTEwxMzMgICAgICAgIEJJVF8xNQogI2RlZmluZSBUM19QQ0lfNDRNSFpfQ09SRV9DTE9DSyAgICAgICAgICAgICBCSVRfMTgKIAotCiAjZGVmaW5lIFQzX1BDSV9SRUdfQUREUl9SRUcgICAgICAgICAgICAgICAgIDB4NzgKICNkZWZpbmUgVDNfUENJX1JFR19EQVRBX1JFRyAgICAgICAgICAgICAgICAgMHg4MAogCkBAIC00MDksNyArNDAwLDYgQEAKICNkZWZpbmUgVDNfUE1fUE1FX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgQklUXzgKICNkZWZpbmUgVDNfUE1fUE1FX0FTU0VSVEVEICAgICAgICAgICAgICAgICAgQklUXzE1CiAKLQogLyogUENJIHN0YXRlIHJlZ2lzdGVyLiAqLwogI2RlZmluZSBUM19QQ0lfU1RBVEVfUkVHICAgICAgICAgICAgICAgICAgICAweDcwCiAKQEAgLTQxOSwxNyArNDA5LDE2IEBACiAjZGVmaW5lIFQzX1BDSV9TVEFURV9CVVNfU1BFRURfSElHSCAgICAgICAgIEJJVF8zCiAjZGVmaW5lIFQzX1BDSV9TVEFURV8zMkJJVF9QQ0lfQlVTICAgICAgICAgIEJJVF80CiAKLQogLyogQnJvYWRjb20gc3Vic3lzdGVtL3N1YnZlbmRvciBJRHMuICovCiAjZGVmaW5lIFQzX1NWSURfQlJPQURDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNGU0CiAKICNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMEE2ICAgICAgICAgICAgICAgICAweDE2NDQKICNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMUE1ICAgICAgICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMFQ2ICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEJDTTgwMDIgKi8KLSNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMEE5ICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIEFnaWxlbnQgKi8KKyNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMFQ2ICAgICAgICAgICAgICAgICAweDAwMDIJLyogQkNNODAwMiAqLworI2RlZmluZSBUM19TU0lEX0JST0FEQ09NX0JDTTk1NzAwQTkgICAgICAgICAgICAgICAgIDB4MDAwMwkvKiBBZ2lsZW50ICovCiAjZGVmaW5lIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDFUMSAgICAgICAgICAgICAgICAgMHgwMDA1CiAjZGVmaW5lIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDFUOCAgICAgICAgICAgICAgICAgMHgwMDA2Ci0jZGVmaW5lIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDFBNyAgICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBBZ2lsZW50ICovCisjZGVmaW5lIFQzX1NTSURfQlJPQURDT01fQkNNOTU3MDFBNyAgICAgICAgICAgICAgICAgMHgwMDA3CS8qIEFnaWxlbnQgKi8KICNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMUExMCAgICAgICAgICAgICAgICAweDAwMDgKICNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwMUExMiAgICAgICAgICAgICAgICAweDgwMDgKICNkZWZpbmUgVDNfU1NJRF9CUk9BRENPTV9CQ005NTcwM0F4MSAgICAgICAgICAgICAgICAweDAwMDkKQEAgLTQ0OSw3ICs0MzgsNiBAQAogI2RlZmluZSBUM19TU0lEXzNDT01fM0M5OTZTWCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwNAogI2RlZmluZSBUM19TU0lEXzNDT01fM0M5OTdTWCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwNQogCi0KIC8qIERlbGwgc3Vic3lzdGVtL3N1YnZlbmRvciBJRHMuICovCiAKICNkZWZpbmUgVDNfU1ZJRF9ERUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMjgKQEAgLTQ2OSw3ICs0NTcsNiBAQAogI2RlZmluZSBUM19TU0lEX0NPTVBBUV9OQzc3ODAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4NQogI2RlZmluZSBUM19TU0lEX0NPTVBBUV9OQzc3ODBfMiAgICAgICAgICAgICAgICAgICAgIDB4MDA5OQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBNSUkgcmVnaXN0ZXJzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ5MCwxNCArNDc3LDEyIEBACiAjZGVmaW5lIFBIWV9DVFJMX0xPT1BCQUNLX01PREUgICAgICAgICAgICAgICAgICAgICAgQklUXzE0CiAjZGVmaW5lIFBIWV9DVFJMX1BIWV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzE1CiAKLQogLyogU3RhdHVzIHJlZ2lzdGVyLiAqLwogI2RlZmluZSBQSFlfU1RBVFVTX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKIAogI2RlZmluZSBQSFlfU1RBVFVTX0xJTktfUEFTUyAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yCiAjZGVmaW5lIFBIWV9TVEFUVVNfQVVUT19ORUdfQ09NUExFVEUgICAgICAgICAgICAgICAgQklUXzUKIAotCiAvKiBQaHkgSWQgcmVnaXN0ZXJzLiAqLwogI2RlZmluZSBQSFlfSUQxX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKICNkZWZpbmUgUEhZX0lEMV9PVUlfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKQEAgLTUwNyw3ICs0OTIsNiBAQAogI2RlZmluZSBQSFlfSUQyX01PREVMX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDNmMAogI2RlZmluZSBQSFlfSUQyX09VSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmMwMAogCi0KIC8qIEF1dG8tbmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudCByZWdpc3Rlci4gKi8KICNkZWZpbmUgUEhZX0FOX0FEX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0CiAKQEAgLTUxOSwxOCArNTAzLDE1IEBACiAjZGVmaW5lIFBIWV9BTl9BRF8xMDBCQVNFVFhfRlVMTCAgICAgICAgICAgICAgICAgICAgQklUXzgKICNkZWZpbmUgUEhZX0FOX0FEX1BST1RPQ09MXzgwMl8zX0NTTUFfQ0QgICAgICAgICAgICAweDAxCiAKLQogLyogQXV0by1uZWdvdGlhdGlvbiBMaW5rIFBhcnRuZXIgQWJpbGl0eSByZWdpc3Rlci4gKi8KICNkZWZpbmUgUEhZX0xJTktfUEFSVE5FUl9BQklMSVRZX1JFRyAgICAgICAgICAgICAgICAweDA1CiAKICNkZWZpbmUgUEhZX0xJTktfUEFSVE5FUl9BU1lNX1BBVVNFICAgICAgICAgICAgICAgICBCSVRfMTEKICNkZWZpbmUgUEhZX0xJTktfUEFSVE5FUl9QQVVTRV9DQVBBQkxFICAgICAgICAgICAgICBCSVRfMTAKIAotCiAvKiBBdXRvLW5lZ290aWF0aW9uIGV4cGFuc2lvbiByZWdpc3Rlci4gKi8KICNkZWZpbmUgUEhZX0FOX0VYUEFOU0lPTl9SRUcgICAgICAgICAgICAgICAgICAgICAgICAweDA2CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEJDTTU0MDAgYW5kIEJDTTU0MDEgcGh5IGluZm8uICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTU3LDcgKzUzOCw2IEBACiAjZGVmaW5lIFBIWV9JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBIWV9JRF9PVUlfTUFTSyB8ICAgICAgXAogCQkJCQkJICAgIFBIWV9JRF9NT0RFTF9NQVNLKQogCi0KICNkZWZpbmUgVU5LTk9XTl9QSFlfSUQoeCkgICAoKCgoeCkgJiBQSFlfSURfTUFTSykgIT0gUEhZX0JDTTU0MDBfUEhZX0lEKSAmJiBcCiAJCQkgICAgKCgoeCkgJiBQSFlfSURfTUFTSykgIT0gUEhZX0JDTTU0MDFfUEhZX0lEKSAmJiBcCiAJCQkgICAgKCgoeCkgJiBQSFlfSURfTUFTSykgIT0gUEhZX0JDTTU0MTFfUEhZX0lEKSAmJiBcCkBAIC01NjYsNyArNTQ2LDYgQEAKIAkJCSAgICAoKCh4KSAmIFBIWV9JRF9NQVNLKSAhPSBQSFlfQkNNNTcwNF9QSFlfSUQpICYmIFwKIAkJCSAgICAoKCh4KSAmIFBIWV9JRF9NQVNLKSAhPSBQSFlfQkNNODAwMl9QSFlfSUQpKQogCi0KIC8qIDEwMDBCYXNlLVQgY29udHJvbCByZWdpc3Rlci4gKi8KICNkZWZpbmUgQkNNNTQwWF8xMDAwQkFTRVRfQ1RSTF9SRUcgICAgICAgICAgICAgICAgICAweDA5CiAKQEAgLTU3NSw3ICs1NTQsNiBAQAogI2RlZmluZSBCQ001NDBYX0NPTkZJR19BU19NQVNURVIgICAgICAgICAgICAgICAgICAgIEJJVF8xMQogI2RlZmluZSBCQ001NDBYX0VOQUJMRV9DT05GSUdfQVNfTUFTVEVSICAgICAgICAgICAgIEJJVF8xMgogCi0KIC8qIEV4dGVuZGVkIGNvbnRyb2wgcmVnaXN0ZXIuICovCiAjZGVmaW5lIEJDTTU0MFhfRVhUX0NUUkxfUkVHICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAogCkBAIC01ODcsMTEgKzU2NSw5IEBACiAKICNkZWZpbmUgQkNNNTQwWF9FWFRfU1RBVFVTX0xJTktfUEFTUyAgICAgICAgICAgICAgICBCSVRfOAogCi0KIC8qIERTUCBDb2VmZmljaWVudCBSZWFkL1dyaXRlIFBvcnQuICovCiAjZGVmaW5lIEJDTTU0MFhfRFNQX1JXX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNQogCi0KIC8qIERTUCBDb2VmaWNpZW50IEFkZHJlc3MgUmVnaXN0ZXIuICovCiAjZGVmaW5lIEJDTTU0MFhfRFNQX0FERFJFU1NfUkVHICAgICAgICAgICAgICAgICAgICAgMHgxNwogCkBAIC02MzEsNyArNjA3LDYgQEAKIAogI2RlZmluZSBCQ001NDBYX0NPTlRST0xfQUxMX0NIQU5ORUxTICAgICAgICAgICAgICAgIEJJVF8xNQogCi0KIC8qIEF1eGlsbGlhcnkgQ29udHJvbCBSZWdpc3RlciAoU2hhZG93IFJlZ2lzdGVyKSAqLwogI2RlZmluZSBCQ001NDAxX0FVWF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgKIApAQCAtNjQ0LDcgKzYxOSw2IEBACiAjZGVmaW5lIEJDTTU0MDFfU0hBRE9XX1NFTF9NSVNDX1RFU1QyICAgICAgICAgICAgICAgMHgwNQogI2RlZmluZSBCQ001NDAxX1NIQURPV19TRUxfSVBfUEhPTkVfU0VFRCAgICAgICAgICAgIDB4MDYKIAotCiAvKiBTaGFkb3cgcmVnaXN0ZXIgc2VsZWN0b3IgPT0gJzAwMCcgKi8KICNkZWZpbmUgQkNNNTQwMV9TSERXX05PUk1BTF9ESUFHX01PREUgICAgICAgICAgICAgICBCSVRfMwogI2RlZmluZSBCQ001NDAxX1NIRFdfTk9STUFMX0RJU0FCTEVfTUJQICAgICAgICAgICAgIEJJVF80CkBAIC02NjQsNyArNjM4LDYgQEAKICNkZWZpbmUgQkNNNTQwMV9TSERXX05PUk1BTF9FWFRfUEFDS0VUX0xFTkdUSCAgICAgICBCSVRfMTQKICNkZWZpbmUgQkNNNTQwMV9TSERXX05PUk1BTF9FWFRFUk5BTF9MT09QQkFDSyAgICAgICBCSVRfMTUKIAotCiAvKiBBdXhpbGxpYXJ5IHN0YXR1cyBzdW1tYXJ5LiAqLwogI2RlZmluZSBCQ001NDBYX0FVWF9TVEFUVVNfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MTkKIApAQCAtNjc4LDcgKzY1MSw2IEBACiAjZGVmaW5lIEJDTTU0MFhfQVVYXzEwMEJBU0VUX0hEICAgICAgICAgICAgICAgICAgICAgKEJJVF85IHwgQklUXzEwKQogI2RlZmluZSBCQ001NDBYX0FVWF8xMDBCQVNFVF9GRCAgICAgICAgICAgICAgICAgICAgIChCSVRfOCB8IEJJVF85IHwgQklUXzEwKQogCi0KIC8qIEludGVycnVwdCBzdGF0dXMuICovCiAjZGVmaW5lIEJDTTU0MFhfSU5UX1NUQVRVU19SRUcgICAgICAgICAgICAgICAgICAgICAgMHgxYQogCkBAIC02ODcsMTEgKzY1OSw5IEBACiAjZGVmaW5lIEJDTTU0MFhfSU5UX0RVUExFWF9DSEFOR0UgICAgICAgICAgICAgICAgICAgQklUXzMKICNkZWZpbmUgQkNNNTQwWF9JTlRfQVVUT19ORUdfUEFHRV9SWCAgICAgICAgICAgICAgICBCSVRfMTAKIAotCiAvKiBJbnRlcnJ1cHQgbWFzayByZWdpc3Rlci4gKi8KICNkZWZpbmUgQkNNNTQwWF9JTlRfTUFTS19SRUcgICAgICAgICAgICAgICAgICAgICAgICAweDFiCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFJlZ2lzdGVyIGRlZmluaXRpb25zLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTcwMSw5ICs2NzEsOSBAQAogdHlwZWRlZiB2b2xhdGlsZSBMTV9VSU5UMzIgVDNfMzJCSVRfUkVHSVNURVIsICpQVDNfMzJCSVRfUkVHSVNURVI7CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiBCaWcgZW5kaWFuIGZvcm1hdC4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBIaWdoOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIExvdzsKKwkvKiBCaWcgZW5kaWFuIGZvcm1hdC4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBIaWdoOworCVQzXzMyQklUX1JFR0lTVEVSIExvdzsKIH0gVDNfNjRCSVRfUkVHSVNURVIsICpQVDNfNjRCSVRfUkVHSVNURVI7CiAKIHR5cGVkZWYgVDNfNjRCSVRfUkVHSVNURVIgVDNfNjRCSVRfSE9TVF9BRERSLCAqUFQzXzY0QklUX0hPU1RfQUREUjsKQEAgLTcxMSw0NyArNjgxLDQ0IEBACiAjZGVmaW5lIFQzX05VTV9PRl9ETUFfREVTQyAgICAyNTYKICNkZWZpbmUgVDNfTlVNX09GX01CVUYgICAgICAgIDc2OAogCi10eXBlZGVmIHN0cnVjdAotewotICBUM182NEJJVF9SRUdJU1RFUiBob3N0X2FkZHI7Ci0gIFQzXzMyQklUX1JFR0lTVEVSIG5pY19tYnVmOwotICBUM18xNkJJVF9SRUdJU1RFUiBsZW47Ci0gIFQzXzE2QklUX1JFR0lTVEVSIGNxaWRfc3FpZDsKLSAgVDNfMzJCSVRfUkVHSVNURVIgZmxhZ3M7Ci0gIFQzXzMyQklUX1JFR0lTVEVSIG9wYXF1ZTE7Ci0gIFQzXzMyQklUX1JFR0lTVEVSIG9wYXF1ZTI7Ci0gIFQzXzMyQklUX1JFR0lTVEVSIG9wYXF1ZTM7Ci19VDNfRE1BX0RFU0MsICpQVDNfRE1BX0RFU0M7Ci0KK3R5cGVkZWYgc3RydWN0IHsKKwlUM182NEJJVF9SRUdJU1RFUiBob3N0X2FkZHI7CisJVDNfMzJCSVRfUkVHSVNURVIgbmljX21idWY7CisJVDNfMTZCSVRfUkVHSVNURVIgbGVuOworCVQzXzE2QklUX1JFR0lTVEVSIGNxaWRfc3FpZDsKKwlUM18zMkJJVF9SRUdJU1RFUiBmbGFnczsKKwlUM18zMkJJVF9SRUdJU1RFUiBvcGFxdWUxOworCVQzXzMyQklUX1JFR0lTVEVSIG9wYXF1ZTI7CisJVDNfMzJCSVRfUkVHSVNURVIgb3BhcXVlMzsKK30gVDNfRE1BX0RFU0MsICpQVDNfRE1BX0RFU0M7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBSaW5nIGNvbnRyb2wgYmxvY2suICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgSG9zdFJpbmdBZGRyOworCVQzXzY0QklUX1JFR0lTVEVSIEhvc3RSaW5nQWRkcjsKIAotICAgIHVuaW9uIHsKLQlzdHJ1Y3QgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKICNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKLQkgICAgVDNfMTZCSVRfUkVHSVNURVIgTWF4TGVuOwotCSAgICBUM18xNkJJVF9SRUdJU1RFUiBGbGFnczsKLSNlbHNlIC8qIEJJR19FTkRJQU5fSE9TVCAqLwotCSAgICBUM18xNkJJVF9SRUdJU1RFUiBGbGFnczsKLQkgICAgVDNfMTZCSVRfUkVHSVNURVIgTWF4TGVuOworCQkJVDNfMTZCSVRfUkVHSVNURVIgTWF4TGVuOworCQkJVDNfMTZCSVRfUkVHSVNURVIgRmxhZ3M7CisjZWxzZQkJCQkvKiBCSUdfRU5ESUFOX0hPU1QgKi8KKwkJCVQzXzE2QklUX1JFR0lTVEVSIEZsYWdzOworCQkJVDNfMTZCSVRfUkVHSVNURVIgTWF4TGVuOwogI2VuZGlmCi0JfSBzOworCQl9IHM7CiAKLQlUM18zMkJJVF9SRUdJU1RFUiBNYXhMZW5fRmxhZ3M7Ci0gICAgfSB1OworCQlUM18zMkJJVF9SRUdJU1RFUiBNYXhMZW5fRmxhZ3M7CisJfSB1OwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTmljUmluZ0FkZHI7CisJVDNfMzJCSVRfUkVHSVNURVIgTmljUmluZ0FkZHI7CiB9IFQzX1JDQiwgKlBUM19SQ0I7CiAKICNkZWZpbmUgVDNfUkNCX0ZMQUdfVVNFX0VYVF9SRUNWX0JEICAgICAgICAgICAgICAgICAgICAgQklUXzAKICNkZWZpbmUgVDNfUkNCX0ZMQUdfUklOR19ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogU3RhdHVzIGJsb2NrLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc2Myw5OCArNzMwLDk1IEBACiAjZGVmaW5lIFQzX1NUQVRVU19CTE9DS19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgdm9sYXRpbGUgTE1fVUlOVDMyIFN0YXR1czsKLSAgICAjZGVmaW5lIFNUQVRVU19CTE9DS19VUERBVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgU1RBVFVTX0JMT0NLX0xJTktfQ0hBTkdFRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBTVEFUVVNfQkxPQ0tfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKwl2b2xhdGlsZSBMTV9VSU5UMzIgU3RhdHVzOworI2RlZmluZSBTVEFUVVNfQkxPQ0tfVVBEQVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgU1RBVFVTX0JMT0NLX0xJTktfQ0hBTkdFRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIFNUQVRVU19CTE9DS19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMgogCi0gICAgdm9sYXRpbGUgTE1fVUlOVDMyIFN0YXR1c1RhZzsKKwl2b2xhdGlsZSBMTV9VSU5UMzIgU3RhdHVzVGFnOwogCiAjaWZkZWYgQklHX0VORElBTl9IT1NUCi0gICAgdm9sYXRpbGUgTE1fVUlOVDE2IFJjdlN0ZENvbklkeDsKLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgUmN2SnVtYm9Db25JZHg7CisJdm9sYXRpbGUgTE1fVUlOVDE2IFJjdlN0ZENvbklkeDsKKwl2b2xhdGlsZSBMTV9VSU5UMTYgUmN2SnVtYm9Db25JZHg7CiAKLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgUmVzZXJ2ZWQyOwotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBSY3ZNaW5pQ29uSWR4OworCXZvbGF0aWxlIExNX1VJTlQxNiBSZXNlcnZlZDI7CisJdm9sYXRpbGUgTE1fVUlOVDE2IFJjdk1pbmlDb25JZHg7CiAKLSAgICBzdHJ1Y3QgewotCXZvbGF0aWxlIExNX1VJTlQxNiBTZW5kQ29uSWR4OyAgIC8qIFNlbmQgY29uc3VtZXIgaW5kZXguICovCi0Jdm9sYXRpbGUgTE1fVUlOVDE2IFJjdlByb2RJZHg7ICAgLyogUmVjZWl2ZSBwcm9kdWNlciBpbmRleC4gKi8KLSAgICB9IElkeFsxNl07Ci0jZWxzZSAvKiBCSUdfRU5ESUFOX0hPU1QgKi8KLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgUmN2SnVtYm9Db25JZHg7Ci0gICAgdm9sYXRpbGUgTE1fVUlOVDE2IFJjdlN0ZENvbklkeDsKKwlzdHJ1Y3QgeworCQl2b2xhdGlsZSBMTV9VSU5UMTYgU2VuZENvbklkeDsJLyogU2VuZCBjb25zdW1lciBpbmRleC4gKi8KKwkJdm9sYXRpbGUgTE1fVUlOVDE2IFJjdlByb2RJZHg7CS8qIFJlY2VpdmUgcHJvZHVjZXIgaW5kZXguICovCisJfSBJZHhbMTZdOworI2Vsc2UJCQkJLyogQklHX0VORElBTl9IT1NUICovCisJdm9sYXRpbGUgTE1fVUlOVDE2IFJjdkp1bWJvQ29uSWR4OworCXZvbGF0aWxlIExNX1VJTlQxNiBSY3ZTdGRDb25JZHg7CiAKLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgUmN2TWluaUNvbklkeDsKLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgUmVzZXJ2ZWQyOworCXZvbGF0aWxlIExNX1VJTlQxNiBSY3ZNaW5pQ29uSWR4OworCXZvbGF0aWxlIExNX1VJTlQxNiBSZXNlcnZlZDI7CiAKLSAgICBzdHJ1Y3QgewotCXZvbGF0aWxlIExNX1VJTlQxNiBSY3ZQcm9kSWR4OyAgIC8qIFJlY2VpdmUgcHJvZHVjZXIgaW5kZXguICovCi0Jdm9sYXRpbGUgTE1fVUlOVDE2IFNlbmRDb25JZHg7ICAgLyogU2VuZCBjb25zdW1lciBpbmRleC4gKi8KLSAgICB9IElkeFsxNl07CisJc3RydWN0IHsKKwkJdm9sYXRpbGUgTE1fVUlOVDE2IFJjdlByb2RJZHg7CS8qIFJlY2VpdmUgcHJvZHVjZXIgaW5kZXguICovCisJCXZvbGF0aWxlIExNX1VJTlQxNiBTZW5kQ29uSWR4OwkvKiBTZW5kIGNvbnN1bWVyIGluZGV4LiAqLworCX0gSWR4WzE2XTsKICNlbmRpZgogfSBUM19TVEFUVVNfQkxPQ0ssICpQVDNfU1RBVFVTX0JMT0NLOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBSZWNlaXZlIGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM182NEJJVF9IT1NUX0FERFIgSG9zdEFkZHI7CisJVDNfNjRCSVRfSE9TVF9BRERSIEhvc3RBZGRyOwogCiAjaWZkZWYgQklHX0VORElBTl9IT1NUCi0gICAgdm9sYXRpbGUgTE1fVUlOVDE2IEluZGV4OwotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBMZW47CisJdm9sYXRpbGUgTE1fVUlOVDE2IEluZGV4OworCXZvbGF0aWxlIExNX1VJTlQxNiBMZW47CiAKLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgVHlwZTsKLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgRmxhZ3M7CisJdm9sYXRpbGUgTE1fVUlOVDE2IFR5cGU7CisJdm9sYXRpbGUgTE1fVUlOVDE2IEZsYWdzOwogCi0gICAgdm9sYXRpbGUgTE1fVUlOVDE2IElwQ2tzdW07Ci0gICAgdm9sYXRpbGUgTE1fVUlOVDE2IFRjcFVkcENrc3VtOworCXZvbGF0aWxlIExNX1VJTlQxNiBJcENrc3VtOworCXZvbGF0aWxlIExNX1VJTlQxNiBUY3BVZHBDa3N1bTsKIAotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBFcnJvckZsYWc7Ci0gICAgdm9sYXRpbGUgTE1fVUlOVDE2IFZsYW5UYWc7Ci0jZWxzZSAvKiBCSUdfRU5ESUFOX0hPU1QgKi8KLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgTGVuOwotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBJbmRleDsKKwl2b2xhdGlsZSBMTV9VSU5UMTYgRXJyb3JGbGFnOworCXZvbGF0aWxlIExNX1VJTlQxNiBWbGFuVGFnOworI2Vsc2UJCQkJLyogQklHX0VORElBTl9IT1NUICovCisJdm9sYXRpbGUgTE1fVUlOVDE2IExlbjsKKwl2b2xhdGlsZSBMTV9VSU5UMTYgSW5kZXg7CiAKLSAgICB2b2xhdGlsZSBMTV9VSU5UMTYgRmxhZ3M7Ci0gICAgdm9sYXRpbGUgTE1fVUlOVDE2IFR5cGU7CisJdm9sYXRpbGUgTE1fVUlOVDE2IEZsYWdzOworCXZvbGF0aWxlIExNX1VJTlQxNiBUeXBlOwogCi0gICAgdm9sYXRpbGUgTE1fVUlOVDE2IFRjcFVkcENrc3VtOwotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBJcENrc3VtOworCXZvbGF0aWxlIExNX1VJTlQxNiBUY3BVZHBDa3N1bTsKKwl2b2xhdGlsZSBMTV9VSU5UMTYgSXBDa3N1bTsKIAotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBWbGFuVGFnOwotICAgIHZvbGF0aWxlIExNX1VJTlQxNiBFcnJvckZsYWc7CisJdm9sYXRpbGUgTE1fVUlOVDE2IFZsYW5UYWc7CisJdm9sYXRpbGUgTE1fVUlOVDE2IEVycm9yRmxhZzsKICNlbmRpZgogCi0gICAgdm9sYXRpbGUgTE1fVUlOVDMyIFJlc2VydmVkOwotICAgIHZvbGF0aWxlIExNX1VJTlQzMiBPcGFxdWU7CisJdm9sYXRpbGUgTE1fVUlOVDMyIFJlc2VydmVkOworCXZvbGF0aWxlIExNX1VJTlQzMiBPcGFxdWU7CiB9IFQzX1JDVl9CRCwgKlBUM19SQ1ZfQkQ7CiAKLQogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzXzY0QklUX0hPU1RfQUREUiBIb3N0QWRkclszXTsKKwlUM182NEJJVF9IT1NUX0FERFIgSG9zdEFkZHJbM107CiAKICNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKLSAgICBMTV9VSU5UMTYgTGVuMTsKLSAgICBMTV9VSU5UMTYgTGVuMjsKKwlMTV9VSU5UMTYgTGVuMTsKKwlMTV9VSU5UMTYgTGVuMjsKIAotICAgIExNX1VJTlQxNiBMZW4zOwotICAgIExNX1VJTlQxNiBSZXNlcnZlZDE7Ci0jZWxzZSAvKiBCSUdfRU5ESUFOX0hPU1QgKi8KLSAgICBMTV9VSU5UMTYgTGVuMjsKLSAgICBMTV9VSU5UMTYgTGVuMTsKKwlMTV9VSU5UMTYgTGVuMzsKKwlMTV9VSU5UMTYgUmVzZXJ2ZWQxOworI2Vsc2UJCQkJLyogQklHX0VORElBTl9IT1NUICovCisJTE1fVUlOVDE2IExlbjI7CisJTE1fVUlOVDE2IExlbjE7CiAKLSAgICBMTV9VSU5UMTYgUmVzZXJ2ZWQxOwotICAgIExNX1VJTlQxNiBMZW4zOworCUxNX1VJTlQxNiBSZXNlcnZlZDE7CisJTE1fVUlOVDE2IExlbjM7CiAjZW5kaWYKIAotICAgIFQzX1JDVl9CRCBTdGRSY3ZCZDsKKwlUM19SQ1ZfQkQgU3RkUmN2QmQ7CiB9IFQzX0VYVF9SQ1ZfQkQsICpQVDNfRVhUX1JDVl9CRDsKIAotCiAvKiBFcnJvciBmbGFncy4gKi8KICNkZWZpbmUgUkNWX0JEX0VSUl9CQURfQ1JDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKICNkZWZpbmUgUkNWX0JEX0VSUl9DT0xMX0RFVEVDVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKQEAgLTg2Niw3ICs4MzAsNiBAQAogI2RlZmluZSBSQ1ZfQkRfRVJSX1RSVU5DX05PX1JFU09VUkNFUyAgICAgICAgICAgICAgIDB4MDA4MAogI2RlZmluZSBSQ1ZfQkRfRVJSX0dJQU5UX0ZSQU1FX1JDVkQgICAgICAgICAgICAgICAgIDB4MDEwMAogCi0KIC8qIEJ1ZmZlciBkZXNjcmlwdG9yIGZsYWdzLiAqLwogI2RlZmluZSBSQ1ZfQkRfRkxBR19FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAogI2RlZmluZSBSQ1ZfQkRfRkxBR19KVU1CT19SSU5HICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMApAQCAtODc3LDQ0ICs4NDAsNDIgQEAKICNkZWZpbmUgUkNWX0JEX0ZMQUdfVENQX1VEUF9DSEtTVU1fRklFTEQgICAgICAgICAgICAweDIwMDAKICNkZWZpbmUgUkNWX0JEX0ZMQUdfVENQX1BBQ0tFVCAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogU2VuZCBidWZmZXIgZGVzY3JpcHRvci4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM182NEJJVF9IT1NUX0FERFIgSG9zdEFkZHI7CisJVDNfNjRCSVRfSE9TVF9BRERSIEhvc3RBZGRyOwogCi0gICAgdW5pb24gewotCXN0cnVjdCB7CisJdW5pb24geworCQlzdHJ1Y3QgewogI2lmZGVmIEJJR19FTkRJQU5fSE9TVAotCSAgICBMTV9VSU5UMTYgTGVuOwotCSAgICBMTV9VSU5UMTYgRmxhZ3M7Ci0jZWxzZSAvKiBCSUdfRU5ESUFOX0hPU1QgKi8KLQkgICAgTE1fVUlOVDE2IEZsYWdzOwotCSAgICBMTV9VSU5UMTYgTGVuOworCQkJTE1fVUlOVDE2IExlbjsKKwkJCUxNX1VJTlQxNiBGbGFnczsKKyNlbHNlCQkJCS8qIEJJR19FTkRJQU5fSE9TVCAqLworCQkJTE1fVUlOVDE2IEZsYWdzOworCQkJTE1fVUlOVDE2IExlbjsKICNlbmRpZgotCX0gczE7CisJCX0gczE7CiAKLQlMTV9VSU5UMzIgTGVuX0ZsYWdzOwotICAgIH0gdTE7CisJCUxNX1VJTlQzMiBMZW5fRmxhZ3M7CisJfSB1MTsKIAotICAgIHVuaW9uIHsKLQlzdHJ1Y3QgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKICNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKLQkgICAgTE1fVUlOVDE2IFJlc2VydmVkOwotCSAgICBMTV9VSU5UMTYgVmxhblRhZzsKLSNlbHNlIC8qIEJJR19FTkRJQU5fSE9TVCAqLwotCSAgICBMTV9VSU5UMTYgVmxhblRhZzsKLQkgICAgTE1fVUlOVDE2IFJlc2VydmVkOworCQkJTE1fVUlOVDE2IFJlc2VydmVkOworCQkJTE1fVUlOVDE2IFZsYW5UYWc7CisjZWxzZQkJCQkvKiBCSUdfRU5ESUFOX0hPU1QgKi8KKwkJCUxNX1VJTlQxNiBWbGFuVGFnOworCQkJTE1fVUlOVDE2IFJlc2VydmVkOwogI2VuZGlmCi0JfSBzMjsKKwkJfSBzMjsKIAotCUxNX1VJTlQzMiBWbGFuVGFnOwotICAgIH0gdTI7CisJCUxNX1VJTlQzMiBWbGFuVGFnOworCX0gdTI7CiB9IFQzX1NORF9CRCwgKlBUM19TTkRfQkQ7CiAKLQogLyogU2VuZCBidWZmZXIgZGVzY3JpcHRvciBmbGFncy4gKi8KICNkZWZpbmUgU05EX0JEX0ZMQUdfVENQX1VEUF9DS1NVTSAgICAgICAgICAgICAgICAgICAweDAwMDEKICNkZWZpbmUgU05EX0JEX0ZMQUdfSVBfQ0tTVU0gICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKQEAgLTkzMiw0MzUgKzg5Myw0MjYgQEAKIC8qIE1CVUZzICovCiB0eXBlZGVmIHN0cnVjdCBUM19NQlVGX0ZSQU1FX0RFU0MgewogI2lmZGVmIEJJR19FTkRJQU5fSE9TVAotICBMTV9VSU5UMzIgc3RhdHVzX2NvbnRyb2w7Ci0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotICAgICAgTE1fVUlOVDggY3FpZDsKLSAgICAgIExNX1VJTlQ4IHJlc2VydmVkMTsKLSAgICAgIExNX1VJTlQxNiBsZW5ndGg7Ci0gICAgfXMxOwotICAgIExNX1VJTlQzMiB3b3JkOwotICB9dTE7Ci0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBMTV9VSU5UMTYgaXBfaGRyX3N0YXJ0OwotICAgICAgTE1fVUlOVDE2IHRjcF91ZHBfaGRyX3N0YXJ0OwotICAgIH1zMjsKKwlMTV9VSU5UMzIgc3RhdHVzX2NvbnRyb2w7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJTE1fVUlOVDggY3FpZDsKKwkJCUxNX1VJTlQ4IHJlc2VydmVkMTsKKwkJCUxNX1VJTlQxNiBsZW5ndGg7CisJCX0gczE7CisJCUxNX1VJTlQzMiB3b3JkOworCX0gdTE7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJTE1fVUlOVDE2IGlwX2hkcl9zdGFydDsKKwkJCUxNX1VJTlQxNiB0Y3BfdWRwX2hkcl9zdGFydDsKKwkJfSBzMjsKIAotICAgIExNX1VJTlQzMiB3b3JkOwotICB9dTI7CisJCUxNX1VJTlQzMiB3b3JkOworCX0gdTI7CiAKLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICBMTV9VSU5UMTYgZGF0YV9zdGFydDsKLSAgICAgIExNX1VJTlQxNiB2bGFuX2lkOwotICAgIH1zMzsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlMTV9VSU5UMTYgZGF0YV9zdGFydDsKKwkJCUxNX1VJTlQxNiB2bGFuX2lkOworCQl9IHMzOwogCi0gICAgTE1fVUlOVDMyIHdvcmQ7Ci0gIH11MzsKKwkJTE1fVUlOVDMyIHdvcmQ7CisJfSB1MzsKIAotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIExNX1VJTlQxNiBpcF9jaGVja3N1bTsKLSAgICAgIExNX1VJTlQxNiB0Y3BfdWRwX2NoZWNrc3VtOwotICAgIH1zNDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlMTV9VSU5UMTYgaXBfY2hlY2tzdW07CisJCQlMTV9VSU5UMTYgdGNwX3VkcF9jaGVja3N1bTsKKwkJfSBzNDsKIAotICAgIExNX1VJTlQzMiB3b3JkOwotICB9dTQ7CisJCUxNX1VJTlQzMiB3b3JkOworCX0gdTQ7CiAKLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICBMTV9VSU5UMTYgcHNldWRvX2NoZWNrc3VtOwotICAgICAgTE1fVUlOVDE2IGNoZWNrc3VtX3N0YXR1czsKLSAgICB9czU7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJTE1fVUlOVDE2IHBzZXVkb19jaGVja3N1bTsKKwkJCUxNX1VJTlQxNiBjaGVja3N1bV9zdGF0dXM7CisJCX0gczU7CiAKLSAgICBMTV9VSU5UMzIgd29yZDsKLSAgfXU1OworCQlMTV9VSU5UMzIgd29yZDsKKwl9IHU1OwogCi0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotICAgICAgTE1fVUlOVDE2IHJ1bGVfbWF0Y2g7Ci0gICAgICBMTV9VSU5UOCBjbGFzczsKLSAgICAgIExNX1VJTlQ4IHJ1cHQ7Ci0gICAgfXM2OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCUxNX1VJTlQxNiBydWxlX21hdGNoOworCQkJTE1fVUlOVDggY2xhc3M7CisJCQlMTV9VSU5UOCBydXB0OworCQl9IHM2OwogCi0gICAgTE1fVUlOVDMyIHdvcmQ7Ci0gIH11NjsKKwkJTE1fVUlOVDMyIHdvcmQ7CisJfSB1NjsKIAotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIExNX1VJTlQxNiByZXNlcnZlZDI7Ci0gICAgICBMTV9VSU5UMTYgbWJ1Zl9udW07Ci0gICAgfXM3OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCUxNX1VJTlQxNiByZXNlcnZlZDI7CisJCQlMTV9VSU5UMTYgbWJ1Zl9udW07CisJCX0gczc7CiAKLSAgICBMTV9VSU5UMzIgd29yZDsKLSAgfXU3OworCQlMTV9VSU5UMzIgd29yZDsKKwl9IHU3OwogCi0gIExNX1VJTlQzMiByZXNlcnZlZDM7Ci0gIExNX1VJTlQzMiByZXNlcnZlZDQ7CisJTE1fVUlOVDMyIHJlc2VydmVkMzsKKwlMTV9VSU5UMzIgcmVzZXJ2ZWQ0OwogI2Vsc2UKLSAgTE1fVUlOVDMyIHN0YXR1c19jb250cm9sOwotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIExNX1VJTlQxNiBsZW5ndGg7Ci0gICAgICBMTV9VSU5UOCAgcmVzZXJ2ZWQxOwotICAgICAgTE1fVUlOVDggIGNxaWQ7Ci0gICAgfXMxOwotICAgIExNX1VJTlQzMiB3b3JkOwotICB9dTE7Ci0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBMTV9VSU5UMTYgdGNwX3VkcF9oZHJfc3RhcnQ7Ci0gICAgICBMTV9VSU5UMTYgaXBfaGRyX3N0YXJ0OwotICAgIH1zMjsKKwlMTV9VSU5UMzIgc3RhdHVzX2NvbnRyb2w7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJTE1fVUlOVDE2IGxlbmd0aDsKKwkJCUxNX1VJTlQ4IHJlc2VydmVkMTsKKwkJCUxNX1VJTlQ4IGNxaWQ7CisJCX0gczE7CisJCUxNX1VJTlQzMiB3b3JkOworCX0gdTE7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJTE1fVUlOVDE2IHRjcF91ZHBfaGRyX3N0YXJ0OworCQkJTE1fVUlOVDE2IGlwX2hkcl9zdGFydDsKKwkJfSBzMjsKIAotICAgIExNX1VJTlQzMiB3b3JkOwotICB9dTI7CisJCUxNX1VJTlQzMiB3b3JkOworCX0gdTI7CiAKLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICBMTV9VSU5UMTYgdmxhbl9pZDsKLSAgICAgIExNX1VJTlQxNiBkYXRhX3N0YXJ0OwotICAgIH1zMzsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlMTV9VSU5UMTYgdmxhbl9pZDsKKwkJCUxNX1VJTlQxNiBkYXRhX3N0YXJ0OworCQl9IHMzOwogCi0gICAgTE1fVUlOVDMyIHdvcmQ7Ci0gIH11MzsKKwkJTE1fVUlOVDMyIHdvcmQ7CisJfSB1MzsKIAotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIExNX1VJTlQxNiB0Y3BfdWRwX2NoZWNrc3VtOwotICAgICAgTE1fVUlOVDE2IGlwX2NoZWNrc3VtOwotICAgIH1zNDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlMTV9VSU5UMTYgdGNwX3VkcF9jaGVja3N1bTsKKwkJCUxNX1VJTlQxNiBpcF9jaGVja3N1bTsKKwkJfSBzNDsKIAotICAgIExNX1VJTlQzMiB3b3JkOwotICB9dTQ7CisJCUxNX1VJTlQzMiB3b3JkOworCX0gdTQ7CiAKLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICBMTV9VSU5UMTYgY2hlY2tzdW1fc3RhdHVzOwotICAgICAgTE1fVUlOVDE2IHBzZXVkb19jaGVja3N1bTsKLSAgICB9czU7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJTE1fVUlOVDE2IGNoZWNrc3VtX3N0YXR1czsKKwkJCUxNX1VJTlQxNiBwc2V1ZG9fY2hlY2tzdW07CisJCX0gczU7CiAKLSAgICBMTV9VSU5UMzIgd29yZDsKLSAgfXU1OworCQlMTV9VSU5UMzIgd29yZDsKKwl9IHU1OwogCi0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotICAgICAgTE1fVUlOVDggcnVwdDsKLSAgICAgIExNX1VJTlQ4IGNsYXNzOwotICAgICAgTE1fVUlOVDE2IHJ1bGVfbWF0Y2g7Ci0gICAgfXM2OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCUxNX1VJTlQ4IHJ1cHQ7CisJCQlMTV9VSU5UOCBjbGFzczsKKwkJCUxNX1VJTlQxNiBydWxlX21hdGNoOworCQl9IHM2OwogCi0gICAgTE1fVUlOVDMyIHdvcmQ7Ci0gIH11NjsKKwkJTE1fVUlOVDMyIHdvcmQ7CisJfSB1NjsKIAotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIExNX1VJTlQxNiBtYnVmX251bTsKLSAgICAgIExNX1VJTlQxNiByZXNlcnZlZDI7Ci0gICAgfXM3OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCUxNX1VJTlQxNiBtYnVmX251bTsKKwkJCUxNX1VJTlQxNiByZXNlcnZlZDI7CisJCX0gczc7CiAKLSAgICBMTV9VSU5UMzIgd29yZDsKLSAgfXU3OworCQlMTV9VSU5UMzIgd29yZDsKKwl9IHU3OwogCi0gIExNX1VJTlQzMiByZXNlcnZlZDM7Ci0gIExNX1VJTlQzMiByZXNlcnZlZDQ7CisJTE1fVUlOVDMyIHJlc2VydmVkMzsKKwlMTV9VSU5UMzIgcmVzZXJ2ZWQ0OwogI2VuZGlmCi19VDNfTUJVRl9GUkFNRV9ERVNDLCpQVDNfTUJVRl9GUkFNRV9ERVNDOworfSBUM19NQlVGX0ZSQU1FX0RFU0MsICpQVDNfTUJVRl9GUkFNRV9ERVNDOwogCiB0eXBlZGVmIHN0cnVjdCBUM19NQlVGX0hEUiB7Ci0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotICAgICAgdW5zaWduZWQgaW50IEM6MTsKLSAgICAgIHVuc2lnbmVkIGludCBGOjE7Ci0gICAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQxOjc7Ci0gICAgICB1bnNpZ25lZCBpbnQgbmV4dF9tYnVmOjE2OwotICAgICAgdW5zaWduZWQgaW50IGxlbmd0aDo3OwotICAgIH1zMTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBpbnQgQzoxOworCQkJdW5zaWduZWQgaW50IEY6MTsKKwkJCXVuc2lnbmVkIGludCByZXNlcnZlZDE6NzsKKwkJCXVuc2lnbmVkIGludCBuZXh0X21idWY6MTY7CisJCQl1bnNpZ25lZCBpbnQgbGVuZ3RoOjc7CisJCX0gczE7CiAKLSAgICBMTV9VSU5UMzIgd29yZDsKLSAgfXUxOworCQlMTV9VSU5UMzIgd29yZDsKKwl9IHUxOwogCi0gIExNX1VJTlQzMiBuZXh0X2ZyYW1lX3B0cjsKLX1UM19NQlVGX0hEUiwgKlBUM19NQlVGX0hEUjsKKwlMTV9VSU5UMzIgbmV4dF9mcmFtZV9wdHI7Cit9IFQzX01CVUZfSERSLCAqUFQzX01CVUZfSERSOwogCi10eXBlZGVmIHN0cnVjdCBUM19NQlVGCi17Ci0gIFQzX01CVUZfSERSIGhkcjsKLSAgdW5pb24KLSAgewotICAgIHN0cnVjdCB7Ci0gICAgICBUM19NQlVGX0ZSQU1FX0RFU0MgZnJhbWVfaGRyOwotICAgICAgTE1fVUlOVDMyIGRhdGFbMjBdOwotICAgIH1zMTsKK3R5cGVkZWYgc3RydWN0IFQzX01CVUYgeworCVQzX01CVUZfSERSIGhkcjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlUM19NQlVGX0ZSQU1FX0RFU0MgZnJhbWVfaGRyOworCQkJTE1fVUlOVDMyIGRhdGFbMjBdOworCQl9IHMxOwogCi0gICAgc3RydWN0IHsKLSAgICAgIExNX1VJTlQzMiBkYXRhWzMwXTsKLSAgICB9czI7Ci0gIH1ib2R5OwotfVQzX01CVUYsICpQVDNfTUJVRjsKKwkJc3RydWN0IHsKKwkJCUxNX1VJTlQzMiBkYXRhWzMwXTsKKwkJfSBzMjsKKwl9IGJvZHk7Cit9IFQzX01CVUYsICpQVDNfTUJVRjsKIAogI2RlZmluZSBUM19NQlVGX0JBU0UgICAoVDNfTklDX01CVUZfUE9PTF9BRERSID4+IDcpCiAjZGVmaW5lIFQzX01CVUZfRU5EICAgICgoVDNfTklDX01CVUZfUE9PTF9BRERSICsgVDNfTklDX01CVUZfUE9PTF9TSVpFKSA+PiA3KQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBTdGF0aXN0aWNzIGJsb2NrLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIExNX1VJTlQ4IFJlc2VydmVkMFsweDQwMC0weDMwMF07CisJTE1fVUlOVDggUmVzZXJ2ZWQwWzB4NDAwIC0gMHgzMDBdOwogCi0gICAgLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IFJlY2VpdmUgTUFDLiAqLwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGlmSENJbk9jdGV0czsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBSZXNlcnZlZDE7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c0ZyYWdtZW50czsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBpZkhDSW5VY2FzdFBrdHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgaWZIQ0luTXVsdGljYXN0UGt0czsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBpZkhDSW5Ccm9hZGNhc3RQa3RzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c0ZDU0Vycm9yczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNBbGlnbm1lbnRFcnJvcnM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgeG9uUGF1c2VGcmFtZXNSZWNlaXZlZDsKLSAgICBUM182NEJJVF9SRUdJU1RFUiB4b2ZmUGF1c2VGcmFtZXNSZWNlaXZlZDsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBtYWNDb250cm9sRnJhbWVzUmVjZWl2ZWQ7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgeG9mZlN0YXRlRW50ZXJlZDsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNGcmFtZXNUb29Mb25nOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNKYWJiZXJzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNVbmRlcnNpemVQa3RzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGluUmFuZ2VMZW5ndGhFcnJvcjsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBvdXRSYW5nZUxlbmd0aEVycm9yOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzNjRPY3RldHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHM2NU9jdGV0c3RvMTI3T2N0ZXRzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzMTI4T2N0ZXRzdG8yNTVPY3RldHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHMyNTZPY3RldHN0bzUxMU9jdGV0czsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czUxMk9jdGV0c3RvMTAyM09jdGV0czsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czEwMjRPY3RldHN0bzE1MjJPY3RldHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHMxNTIzT2N0ZXRzdG8yMDQ3T2N0ZXRzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzMjA0OE9jdGV0c3RvNDA5NU9jdGV0czsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czQwOTZPY3RldHN0bzgxOTFPY3RldHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHM4MTkyT2N0ZXRzdG85MDIyT2N0ZXRzOworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBSZWNlaXZlIE1BQy4gKi8KKwlUM182NEJJVF9SRUdJU1RFUiBpZkhDSW5PY3RldHM7CisJVDNfNjRCSVRfUkVHSVNURVIgUmVzZXJ2ZWQxOworCVQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNGcmFnbWVudHM7CisJVDNfNjRCSVRfUkVHSVNURVIgaWZIQ0luVWNhc3RQa3RzOworCVQzXzY0QklUX1JFR0lTVEVSIGlmSENJbk11bHRpY2FzdFBrdHM7CisJVDNfNjRCSVRfUkVHSVNURVIgaWZIQ0luQnJvYWRjYXN0UGt0czsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNGQ1NFcnJvcnM7CisJVDNfNjRCSVRfUkVHSVNURVIgZG90M1N0YXRzQWxpZ25tZW50RXJyb3JzOworCVQzXzY0QklUX1JFR0lTVEVSIHhvblBhdXNlRnJhbWVzUmVjZWl2ZWQ7CisJVDNfNjRCSVRfUkVHSVNURVIgeG9mZlBhdXNlRnJhbWVzUmVjZWl2ZWQ7CisJVDNfNjRCSVRfUkVHSVNURVIgbWFjQ29udHJvbEZyYW1lc1JlY2VpdmVkOworCVQzXzY0QklUX1JFR0lTVEVSIHhvZmZTdGF0ZUVudGVyZWQ7CisJVDNfNjRCSVRfUkVHSVNURVIgZG90M1N0YXRzRnJhbWVzVG9vTG9uZzsKKwlUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzSmFiYmVyczsKKwlUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzVW5kZXJzaXplUGt0czsKKwlUM182NEJJVF9SRUdJU1RFUiBpblJhbmdlTGVuZ3RoRXJyb3I7CisJVDNfNjRCSVRfUkVHSVNURVIgb3V0UmFuZ2VMZW5ndGhFcnJvcjsKKwlUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czY0T2N0ZXRzOworCVQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzNjVPY3RldHN0bzEyN09jdGV0czsKKwlUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czEyOE9jdGV0c3RvMjU1T2N0ZXRzOworCVQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzMjU2T2N0ZXRzdG81MTFPY3RldHM7CisJVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHM1MTJPY3RldHN0bzEwMjNPY3RldHM7CisJVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHMxMDI0T2N0ZXRzdG8xNTIyT2N0ZXRzOworCVQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzMTUyM09jdGV0c3RvMjA0N09jdGV0czsKKwlUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzUGt0czIwNDhPY3RldHN0bzQwOTVPY3RldHM7CisJVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c1BrdHM0MDk2T2N0ZXRzdG84MTkxT2N0ZXRzOworCVQzXzY0QklUX1JFR0lTVEVSIGV0aGVyU3RhdHNQa3RzODE5Mk9jdGV0c3RvOTAyMk9jdGV0czsKIAotICAgIFQzXzY0QklUX1JFR0lTVEVSIFVudXNlZDFbMzddOworCVQzXzY0QklUX1JFR0lTVEVSIFVudXNlZDFbMzddOwogCi0gICAgLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IFRyYW5zbWl0IE1BQy4gKi8KLSAgICBUM182NEJJVF9SRUdJU1RFUiBpZkhDT3V0T2N0ZXRzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIFJlc2VydmVkMjsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBldGhlclN0YXRzQ29sbGlzaW9uczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBvdXRYb25TZW50OwotICAgIFQzXzY0QklUX1JFR0lTVEVSIG91dFhvZmZTZW50OwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGZsb3dDb250cm9sRG9uZTsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNJbnRlcm5hbE1hY1RyYW5zbWl0RXJyb3JzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c1NpbmdsZUNvbGxpc2lvbkZyYW1lczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNNdWx0aXBsZUNvbGxpc2lvbkZyYW1lczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNEZWZlcnJlZFRyYW5zbWlzc2lvbnM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgUmVzZXJ2ZWQzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c0V4Y2Vzc2l2ZUNvbGxpc2lvbnM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M1N0YXRzTGF0ZUNvbGxpc2lvbnM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkMlRpbWVzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDNUaW1lczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQ0VGltZXM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkNVRpbWVzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDZUaW1lczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQ3VGltZXM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkOFRpbWVzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDlUaW1lczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQxMFRpbWVzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDExVGltZXM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkMTJUaW1lczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQxM1RpbWVzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDE0VGltZXM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkMTVUaW1lczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBpZkhDT3V0VWNhc3RQa3RzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGlmSENPdXRNdWx0aWNhc3RQa3RzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGlmSENPdXRCcm9hZGNhc3RQa3RzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c0NhcnJpZXJTZW5zZUVycm9yczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBpZk91dERpc2NhcmRzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGlmT3V0RXJyb3JzOworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBUcmFuc21pdCBNQUMuICovCisJVDNfNjRCSVRfUkVHSVNURVIgaWZIQ091dE9jdGV0czsKKwlUM182NEJJVF9SRUdJU1RFUiBSZXNlcnZlZDI7CisJVDNfNjRCSVRfUkVHSVNURVIgZXRoZXJTdGF0c0NvbGxpc2lvbnM7CisJVDNfNjRCSVRfUkVHSVNURVIgb3V0WG9uU2VudDsKKwlUM182NEJJVF9SRUdJU1RFUiBvdXRYb2ZmU2VudDsKKwlUM182NEJJVF9SRUdJU1RFUiBmbG93Q29udHJvbERvbmU7CisJVDNfNjRCSVRfUkVHSVNURVIgZG90M1N0YXRzSW50ZXJuYWxNYWNUcmFuc21pdEVycm9yczsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNTaW5nbGVDb2xsaXNpb25GcmFtZXM7CisJVDNfNjRCSVRfUkVHSVNURVIgZG90M1N0YXRzTXVsdGlwbGVDb2xsaXNpb25GcmFtZXM7CisJVDNfNjRCSVRfUkVHSVNURVIgZG90M1N0YXRzRGVmZXJyZWRUcmFuc21pc3Npb25zOworCVQzXzY0QklUX1JFR0lTVEVSIFJlc2VydmVkMzsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNFeGNlc3NpdmVDb2xsaXNpb25zOworCVQzXzY0QklUX1JFR0lTVEVSIGRvdDNTdGF0c0xhdGVDb2xsaXNpb25zOworCVQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDJUaW1lczsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQzVGltZXM7CisJVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkNFRpbWVzOworCVQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDVUaW1lczsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQ2VGltZXM7CisJVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkN1RpbWVzOworCVQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDhUaW1lczsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQ5VGltZXM7CisJVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkMTBUaW1lczsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQxMVRpbWVzOworCVQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDEyVGltZXM7CisJVDNfNjRCSVRfUkVHSVNURVIgZG90M0NvbGxpZGVkMTNUaW1lczsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzQ29sbGlkZWQxNFRpbWVzOworCVQzXzY0QklUX1JFR0lTVEVSIGRvdDNDb2xsaWRlZDE1VGltZXM7CisJVDNfNjRCSVRfUkVHSVNURVIgaWZIQ091dFVjYXN0UGt0czsKKwlUM182NEJJVF9SRUdJU1RFUiBpZkhDT3V0TXVsdGljYXN0UGt0czsKKwlUM182NEJJVF9SRUdJU1RFUiBpZkhDT3V0QnJvYWRjYXN0UGt0czsKKwlUM182NEJJVF9SRUdJU1RFUiBkb3QzU3RhdHNDYXJyaWVyU2Vuc2VFcnJvcnM7CisJVDNfNjRCSVRfUkVHSVNURVIgaWZPdXREaXNjYXJkczsKKwlUM182NEJJVF9SRUdJU1RFUiBpZk91dEVycm9yczsKIAotICAgIFQzXzY0QklUX1JFR0lTVEVSIFVudXNlZDJbMzFdOworCVQzXzY0QklUX1JFR0lTVEVSIFVudXNlZDJbMzFdOwogCi0gICAgLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IFJlY2VpdmUgTGlzdCBQbGFjZW1lbnQuICovCi0gICAgVDNfNjRCSVRfUkVHSVNURVIgQ09TSWZIQ0luUGt0c1sxNl07Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgQ09TRnJhbWVzRHJvcHBlZER1ZVRvRmlsdGVyczsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBuaWNEbWFXcml0ZVF1ZXVlRnVsbDsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBuaWNEbWFXcml0ZUhpZ2hQcmlRdWV1ZUZ1bGw7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgbmljTm9Nb3JlUnhCRHM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgaWZJbkRpc2NhcmRzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIGlmSW5FcnJvcnM7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgbmljUmVjdlRocmVzaG9sZEhpdDsKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgUmVjZWl2ZSBMaXN0IFBsYWNlbWVudC4gKi8KKwlUM182NEJJVF9SRUdJU1RFUiBDT1NJZkhDSW5Qa3RzWzE2XTsKKwlUM182NEJJVF9SRUdJU1RFUiBDT1NGcmFtZXNEcm9wcGVkRHVlVG9GaWx0ZXJzOworCVQzXzY0QklUX1JFR0lTVEVSIG5pY0RtYVdyaXRlUXVldWVGdWxsOworCVQzXzY0QklUX1JFR0lTVEVSIG5pY0RtYVdyaXRlSGlnaFByaVF1ZXVlRnVsbDsKKwlUM182NEJJVF9SRUdJU1RFUiBuaWNOb01vcmVSeEJEczsKKwlUM182NEJJVF9SRUdJU1RFUiBpZkluRGlzY2FyZHM7CisJVDNfNjRCSVRfUkVHSVNURVIgaWZJbkVycm9yczsKKwlUM182NEJJVF9SRUdJU1RFUiBuaWNSZWN2VGhyZXNob2xkSGl0OwogCi0gICAgVDNfNjRCSVRfUkVHSVNURVIgVW51c2VkM1s5XTsKKwlUM182NEJJVF9SRUdJU1RFUiBVbnVzZWQzWzldOwogCi0gICAgLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IFNlbmQgRGF0YSBJbml0aWF0b3IuICovCi0gICAgVDNfNjRCSVRfUkVHSVNURVIgQ09TSWZIQ091dFBrdHNbMTZdOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIG5pY0RtYVJlYWRRdWV1ZUZ1bGw7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgbmljRG1hUmVhZEhpZ2hQcmlRdWV1ZUZ1bGw7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgbmljU2VuZERhdGFDb21wUXVldWVGdWxsOworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBTZW5kIERhdGEgSW5pdGlhdG9yLiAqLworCVQzXzY0QklUX1JFR0lTVEVSIENPU0lmSENPdXRQa3RzWzE2XTsKKwlUM182NEJJVF9SRUdJU1RFUiBuaWNEbWFSZWFkUXVldWVGdWxsOworCVQzXzY0QklUX1JFR0lTVEVSIG5pY0RtYVJlYWRIaWdoUHJpUXVldWVGdWxsOworCVQzXzY0QklUX1JFR0lTVEVSIG5pY1NlbmREYXRhQ29tcFF1ZXVlRnVsbDsKIAotICAgIC8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBIb3N0IENvYWxlc2NpbmcuICovCi0gICAgVDNfNjRCSVRfUkVHSVNURVIgbmljUmluZ1NldFNlbmRQcm9kSW5kZXg7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgbmljUmluZ1N0YXR1c1VwZGF0ZTsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBuaWNJbnRlcnJ1cHRzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIG5pY0F2b2lkZWRJbnRlcnJ1cHRzOwotICAgIFQzXzY0QklUX1JFR0lTVEVSIG5pY1NlbmRUaHJlc2hvbGRIaXQ7CisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IEhvc3QgQ29hbGVzY2luZy4gKi8KKwlUM182NEJJVF9SRUdJU1RFUiBuaWNSaW5nU2V0U2VuZFByb2RJbmRleDsKKwlUM182NEJJVF9SRUdJU1RFUiBuaWNSaW5nU3RhdHVzVXBkYXRlOworCVQzXzY0QklUX1JFR0lTVEVSIG5pY0ludGVycnVwdHM7CisJVDNfNjRCSVRfUkVHSVNURVIgbmljQXZvaWRlZEludGVycnVwdHM7CisJVDNfNjRCSVRfUkVHSVNURVIgbmljU2VuZFRocmVzaG9sZEhpdDsKIAotICAgIExNX1VJTlQ4IFJlc2VydmVkNFsweGIwMC0weDljMF07CisJTE1fVUlOVDggUmVzZXJ2ZWQ0WzB4YjAwIC0gMHg5YzBdOwogfSBUM19TVEFUU19CTE9DSywgKlBUM19TVEFUU19CTE9DSzsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzXzE2QklUX1JFR0lTVEVSIFZlbmRvcklkOwotICAgIFQzXzE2QklUX1JFR0lTVEVSIERldmljZUlkOworCVQzXzE2QklUX1JFR0lTVEVSIFZlbmRvcklkOworCVQzXzE2QklUX1JFR0lTVEVSIERldmljZUlkOwogCi0gICAgVDNfMTZCSVRfUkVHSVNURVIgQ29tbWFuZDsKLSAgICBUM18xNkJJVF9SRUdJU1RFUiBTdGF0dXM7CisJVDNfMTZCSVRfUkVHSVNURVIgQ29tbWFuZDsKKwlUM18xNkJJVF9SRUdJU1RFUiBTdGF0dXM7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBDbGFzc0NvZGVSZXZJZDsKKwlUM18zMkJJVF9SRUdJU1RFUiBDbGFzc0NvZGVSZXZJZDsKIAotICAgIFQzXzhCSVRfUkVHSVNURVIgQ2FjaGVMaW5lU2l6ZTsKLSAgICBUM184QklUX1JFR0lTVEVSIExhdGVuY3lUaW1lcjsKLSAgICBUM184QklUX1JFR0lTVEVSIEhlYWRlclR5cGU7Ci0gICAgVDNfOEJJVF9SRUdJU1RFUiBCaXN0OworCVQzXzhCSVRfUkVHSVNURVIgQ2FjaGVMaW5lU2l6ZTsKKwlUM184QklUX1JFR0lTVEVSIExhdGVuY3lUaW1lcjsKKwlUM184QklUX1JFR0lTVEVSIEhlYWRlclR5cGU7CisJVDNfOEJJVF9SRUdJU1RFUiBCaXN0OwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWVtQmFzZUFkZHJMb3c7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWVtQmFzZUFkZHJIaWdoOworCVQzXzMyQklUX1JFR0lTVEVSIE1lbUJhc2VBZGRyTG93OworCVQzXzMyQklUX1JFR0lTVEVSIE1lbUJhc2VBZGRySGlnaDsKIAotICAgIExNX1VJTlQ4IFVudXNlZDFbMjBdOworCUxNX1VJTlQ4IFVudXNlZDFbMjBdOwogCi0gICAgVDNfMTZCSVRfUkVHSVNURVIgU3Vic3lzdGVtVmVuZG9ySWQ7Ci0gICAgVDNfMTZCSVRfUkVHSVNURVIgU3Vic3lzdGVtSWQ7CisJVDNfMTZCSVRfUkVHSVNURVIgU3Vic3lzdGVtVmVuZG9ySWQ7CisJVDNfMTZCSVRfUkVHSVNURVIgU3Vic3lzdGVtSWQ7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSb21CYXNlQWRkcjsKKwlUM18zMkJJVF9SRUdJU1RFUiBSb21CYXNlQWRkcjsKIAotICAgIFQzXzhCSVRfUkVHSVNURVIgUGNpWENhcGlibGl0eVB0cjsKLSAgICBMTV9VSU5UOCBVbnVzZWQyWzddOworCVQzXzhCSVRfUkVHSVNURVIgUGNpWENhcGlibGl0eVB0cjsKKwlMTV9VSU5UOCBVbnVzZWQyWzddOwogCi0gICAgVDNfOEJJVF9SRUdJU1RFUiBJbnRMaW5lOwotICAgIFQzXzhCSVRfUkVHSVNURVIgSW50UGluOwotICAgIFQzXzhCSVRfUkVHSVNURVIgTWluR250OwotICAgIFQzXzhCSVRfUkVHSVNURVIgTWF4TGF0OworCVQzXzhCSVRfUkVHSVNURVIgSW50TGluZTsKKwlUM184QklUX1JFR0lTVEVSIEludFBpbjsKKwlUM184QklUX1JFR0lTVEVSIE1pbkdudDsKKwlUM184QklUX1JFR0lTVEVSIE1heExhdDsKIAotICAgIFQzXzhCSVRfUkVHSVNURVIgUGNpWENhcGFiaWxpdGllczsKLSAgICBUM184QklUX1JFR0lTVEVSIFBtQ2FwYWJpbGl0eVB0cjsKLSAgICBUM18xNkJJVF9SRUdJU1RFUiBQY2lYQ29tbWFuZDsKKwlUM184QklUX1JFR0lTVEVSIFBjaVhDYXBhYmlsaXRpZXM7CisJVDNfOEJJVF9SRUdJU1RFUiBQbUNhcGFiaWxpdHlQdHI7CisJVDNfMTZCSVRfUkVHSVNURVIgUGNpWENvbW1hbmQ7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBQY2lYU3RhdHVzOworCVQzXzMyQklUX1JFR0lTVEVSIFBjaVhTdGF0dXM7CiAKLSAgICBUM184QklUX1JFR0lTVEVSIFBtQ2FwYWJpbGl0eUlkOwotICAgIFQzXzhCSVRfUkVHSVNURVIgVnBkQ2FwYWJpbGl0eVB0cjsKLSAgICBUM18xNkJJVF9SRUdJU1RFUiBQbUNhcGFiaWxpdGllczsKKwlUM184QklUX1JFR0lTVEVSIFBtQ2FwYWJpbGl0eUlkOworCVQzXzhCSVRfUkVHSVNURVIgVnBkQ2FwYWJpbGl0eVB0cjsKKwlUM18xNkJJVF9SRUdJU1RFUiBQbUNhcGFiaWxpdGllczsKIAotICAgIFQzXzE2QklUX1JFR0lTVEVSIFBtQ3RybFN0YXR1czsKLSAgICAjZGVmaW5lIFBNX0NUUkxfUE1FX1NUQVRVUyAgICAgICAgICAgIEJJVF8xNQotICAgICNkZWZpbmUgUE1fQ1RSTF9QTUVfRU5BQkxFICAgICAgICAgICAgQklUXzgKLSAgICAjZGVmaW5lIFBNX0NUUkxfUE1FX1BPV0VSX1NUQVRFX0QwICAgIDAKLSAgICAjZGVmaW5lIFBNX0NUUkxfUE1FX1BPV0VSX1NUQVRFX0QxICAgIDEKLSAgICAjZGVmaW5lIFBNX0NUUkxfUE1FX1BPV0VSX1NUQVRFX0QyICAgIDIKLSAgICAjZGVmaW5lIFBNX0NUUkxfUE1FX1BPV0VSX1NUQVRFX0QzSCAgIDMKKwlUM18xNkJJVF9SRUdJU1RFUiBQbUN0cmxTdGF0dXM7CisjZGVmaW5lIFBNX0NUUkxfUE1FX1NUQVRVUyAgICAgICAgICAgIEJJVF8xNQorI2RlZmluZSBQTV9DVFJMX1BNRV9FTkFCTEUgICAgICAgICAgICBCSVRfOAorI2RlZmluZSBQTV9DVFJMX1BNRV9QT1dFUl9TVEFURV9EMCAgICAwCisjZGVmaW5lIFBNX0NUUkxfUE1FX1BPV0VSX1NUQVRFX0QxICAgIDEKKyNkZWZpbmUgUE1fQ1RSTF9QTUVfUE9XRVJfU1RBVEVfRDIgICAgMgorI2RlZmluZSBQTV9DVFJMX1BNRV9QT1dFUl9TVEFURV9EM0ggICAzCiAKLSAgICBUM184QklUX1JFR0lTVEVSIEJyaWRnZVN1cHBvcnRFeHQ7Ci0gICAgVDNfOEJJVF9SRUdJU1RFUiBQbURhdGE7CisJVDNfOEJJVF9SRUdJU1RFUiBCcmlkZ2VTdXBwb3J0RXh0OworCVQzXzhCSVRfUkVHSVNURVIgUG1EYXRhOwogCi0gICAgVDNfOEJJVF9SRUdJU1RFUiBWcGRDYXBhYmlsaXR5SWQ7Ci0gICAgVDNfOEJJVF9SRUdJU1RFUiBNc2lDYXBhYmlsaXR5UHRyOwotICAgIFQzXzE2QklUX1JFR0lTVEVSIFZwZEFkZHJGbGFnOwotICAgICNkZWZpbmUgVlBEX0ZMQUdfV1JJVEUgICAgICAoMSA8PCAxNSkKLSAgICAjZGVmaW5lIFZQRF9GTEFHX1JXX01BU0sgICAgKDEgPDwgMTUpCi0gICAgI2RlZmluZSBWUERfRkxBR19SRUFEICAgICAgIDAKKwlUM184QklUX1JFR0lTVEVSIFZwZENhcGFiaWxpdHlJZDsKKwlUM184QklUX1JFR0lTVEVSIE1zaUNhcGFiaWxpdHlQdHI7CisJVDNfMTZCSVRfUkVHSVNURVIgVnBkQWRkckZsYWc7CisjZGVmaW5lIFZQRF9GTEFHX1dSSVRFICAgICAgKDEgPDwgMTUpCisjZGVmaW5lIFZQRF9GTEFHX1JXX01BU0sgICAgKDEgPDwgMTUpCisjZGVmaW5lIFZQRF9GTEFHX1JFQUQgICAgICAgMAogCisJVDNfMzJCSVRfUkVHSVNURVIgVnBkRGF0YTsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFZwZERhdGE7CisJVDNfOEJJVF9SRUdJU1RFUiBNc2lDYXBhYmlsaXR5SWQ7CisJVDNfOEJJVF9SRUdJU1RFUiBOZXh0Q2FwYWJpbGl0eVB0cjsKKwlUM18xNkJJVF9SRUdJU1RFUiBNc2lDdHJsOworI2RlZmluZSBNU0lfQ1RSTF82NEJJVF9DQVAgICAgICgxIDw8IDcpCisjZGVmaW5lIE1TSV9DVFJMX01TR19FTkFCTEUoeCkgKHggPDwgNCkKKyNkZWZpbmUgTVNJX0NUUkxfTVNHX0NBUCh4KSAgICAoeCA8PCAxKQorI2RlZmluZSBNU0lfQ1RSTF9FTkFCTEUgICAgICAgICgxIDw8IDApCiAKLSAgICBUM184QklUX1JFR0lTVEVSIE1zaUNhcGFiaWxpdHlJZDsKLSAgICBUM184QklUX1JFR0lTVEVSIE5leHRDYXBhYmlsaXR5UHRyOwotICAgIFQzXzE2QklUX1JFR0lTVEVSIE1zaUN0cmw7Ci0gICAgI2RlZmluZSBNU0lfQ1RSTF82NEJJVF9DQVAgICAgICgxIDw8IDcpCi0gICAgI2RlZmluZSBNU0lfQ1RSTF9NU0dfRU5BQkxFKHgpICh4IDw8IDQpCi0gICAgI2RlZmluZSBNU0lfQ1RSTF9NU0dfQ0FQKHgpICAgICh4IDw8IDEpCi0gICAgI2RlZmluZSBNU0lfQ1RSTF9FTkFCTEUgICAgICAgICgxIDw8IDApCisJVDNfMzJCSVRfUkVHSVNURVIgTXNpQWRkckxvdzsKKwlUM18zMkJJVF9SRUdJU1RFUiBNc2lBZGRySGlnaDsKIAorCVQzXzE2QklUX1JFR0lTVEVSIE1zaURhdGE7CisJVDNfMTZCSVRfUkVHSVNURVIgVW51c2VkMzsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1zaUFkZHJMb3c7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTXNpQWRkckhpZ2g7CisJVDNfMzJCSVRfUkVHSVNURVIgTWlzY0hvc3RDdHJsOworI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9DTEVBUl9JTlQgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQgICAgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfRU5ESUFOX0JZVEVfU1dBUCAgICAgICAgICBCSVRfMgorI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfRU5ESUFOX1dPUkRfU1dBUCAgICAgICAgICBCSVRfMworI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfUENJX1NUQVRFX1JFR19SVyAgICAgICAgICBCSVRfNAorI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfQ0xLX1JFR19SVyAgICAgICAgICAgICAgICBCSVRfNQorI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfUkVHX1dPUkRfU1dBUCAgICAgICAgICAgICBCSVRfNgorI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfSU5ESVJFQ1RfQUNDRVNTICAgICAgICAgICBCSVRfNworI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfSU5UX01BU0tfTU9ERSAgICAgICAgICAgICBCSVRfOAorI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfVEFHR0VEX1NUQVRVU19NT0RFICAgICAgICBCSVRfOQogCi0gICAgVDNfMTZCSVRfUkVHSVNURVIgTXNpRGF0YTsKLSAgICBUM18xNkJJVF9SRUdJU1RFUiBVbnVzZWQzOworCVQzXzMyQklUX1JFR0lTVEVSIERtYVJlYWRXcml0ZUN0cmw7CisjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZX01BU0sgICAgICAgICAgICAoQklUXzExIHwgQklUXzEyIHwgQklUXzEzKQorI2RlZmluZSBETUFfQ1RSTF9XUklURV9CT1VOREFSWV9ESVNBQkxFICAgICAgICAgMAorI2RlZmluZSBETUFfQ1RSTF9XUklURV9CT1VOREFSWV8xNiAgICAgICAgICAgICAgQklUXzExCisjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZXzMyICAgICAgICAgICAgICBCSVRfMTIKKyNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfNjQgICAgICAgICAgICAgIChCSVRfMTIgfCBCSVRfMTEpCisjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZXzEyOCAgICAgICAgICAgICBCSVRfMTMKKyNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfMjU2ICAgICAgICAgICAgIChCSVRfMTMgfCBCSVRfMTEpCisjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZXzUxMiAgICAgICAgICAgICAoQklUXzEzIHwgQklUXzEyKQorI2RlZmluZSBETUFfQ1RSTF9XUklURV9CT1VOREFSWV8xMDI0ICAgICAgICAgICAgKEJJVF8xMyB8IEJJVF8xMiB8IEJJVF8xMSkKKyNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfT05FX0RNQV9BVF9PTkNFICAgICAgICAgIEJJVF8xNAogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWlzY0hvc3RDdHJsOwotICAgICNkZWZpbmUgTUlTQ19IT1NUX0NUUkxfQ0xFQVJfSU5UICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVCAgICAgICAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfRU5ESUFOX0JZVEVfU1dBUCAgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgTUlTQ19IT1NUX0NUUkxfRU5BQkxFX0VORElBTl9XT1JEX1NXQVAgICAgICAgICAgQklUXzMKLSAgICAjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9QQ0lfU1RBVEVfUkVHX1JXICAgICAgICAgIEJJVF80Ci0gICAgI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfQ0xLX1JFR19SVyAgICAgICAgICAgICAgICBCSVRfNQotICAgICNkZWZpbmUgTUlTQ19IT1NUX0NUUkxfRU5BQkxFX1JFR19XT1JEX1NXQVAgICAgICAgICAgICAgQklUXzYKLSAgICAjZGVmaW5lIE1JU0NfSE9TVF9DVFJMX0VOQUJMRV9JTkRJUkVDVF9BQ0NFU1MgICAgICAgICAgIEJJVF83Ci0gICAgI2RlZmluZSBNSVNDX0hPU1RfQ1RSTF9FTkFCTEVfSU5UX01BU0tfTU9ERSAgICAgICAgICAgICBCSVRfOAotICAgICNkZWZpbmUgTUlTQ19IT1NUX0NUUkxfRU5BQkxFX1RBR0dFRF9TVEFUVVNfTU9ERSAgICAgICAgQklUXzkKKwlUM18zMkJJVF9SRUdJU1RFUiBQY2lTdGF0ZTsKKyNkZWZpbmUgVDNfUENJX1NUQVRFX0ZPUkNFX1BDSV9SRVNFVCAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgVDNfUENJX1NUQVRFX0lOVEVSUlVQVF9OT1RfQUNUSVZFICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgVDNfUENJX1NUQVRFX05PVF9QQ0lfWF9CVVMgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKyNkZWZpbmUgVDNfUENJX1NUQVRFX0hJR0hfQlVTX1NQRUVEICAgICAgICAgICAgICAgICAgICAgQklUXzMKKyNkZWZpbmUgVDNfUENJX1NUQVRFXzMyQklUX1BDSV9CVVMgICAgICAgICAgICAgICAgICAgICAgQklUXzQKKyNkZWZpbmUgVDNfUENJX1NUQVRFX1BDSV9ST01fRU5BQkxFICAgICAgICAgICAgICAgICAgICAgQklUXzUKKyNkZWZpbmUgVDNfUENJX1NUQVRFX1BDSV9ST01fUkVUUllfRU5BQkxFICAgICAgICAgICAgICAgQklUXzYKKyNkZWZpbmUgVDNfUENJX1NUQVRFX0ZMQVRfVklFVyAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzgKKyNkZWZpbmUgVDNfUENJX1NUQVRFX1JFVFJZX1NBTUVfRE1BICAgICAgICAgICAgICAgICAgICAgQklUXzEzCiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFSZWFkV3JpdGVDdHJsOwotICAgICNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfTUFTSyAgICAgICAgICAgIChCSVRfMTEgfCBCSVRfMTIgfCBCSVRfMTMpCi0gICAgI2RlZmluZSBETUFfQ1RSTF9XUklURV9CT1VOREFSWV9ESVNBQkxFICAgICAgICAgMAotICAgICNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfMTYgICAgICAgICAgICAgIEJJVF8xMQotICAgICNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfMzIgICAgICAgICAgICAgIEJJVF8xMgotICAgICNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfNjQgICAgICAgICAgICAgIChCSVRfMTIgfCBCSVRfMTEpCi0gICAgI2RlZmluZSBETUFfQ1RSTF9XUklURV9CT1VOREFSWV8xMjggICAgICAgICAgICAgQklUXzEzCi0gICAgI2RlZmluZSBETUFfQ1RSTF9XUklURV9CT1VOREFSWV8yNTYgICAgICAgICAgICAgKEJJVF8xMyB8IEJJVF8xMSkKLSAgICAjZGVmaW5lIERNQV9DVFJMX1dSSVRFX0JPVU5EQVJZXzUxMiAgICAgICAgICAgICAoQklUXzEzIHwgQklUXzEyKQotICAgICNkZWZpbmUgRE1BX0NUUkxfV1JJVEVfQk9VTkRBUllfMTAyNCAgICAgICAgICAgIChCSVRfMTMgfCBCSVRfMTIgfCBCSVRfMTEpCi0gICAgI2RlZmluZSBETUFfQ1RSTF9XUklURV9PTkVfRE1BX0FUX09OQ0UgICAgICAgICAgQklUXzE0CisJVDNfMzJCSVRfUkVHSVNURVIgQ2xvY2tDdHJsOworI2RlZmluZSBUM19QQ0lfQ0xLQ1RSTF9UWENQVV9DTEtfRElTQUJMRSAgICAgICAgICAgICAgICBCSVRfMTEKKyNkZWZpbmUgVDNfUENJX0NMS0NUUkxfUlhDUFVfQ0xLX0RJU0FCTEUgICAgICAgICAgICAgICAgQklUXzEwCisjZGVmaW5lIFQzX1BDSV9DTEtDVFJMX0NPUkVfQ0xLX0RJU0FCTEUgICAgICAgICAgICAgICAgIEJJVF85CiAKKwlUM18zMkJJVF9SRUdJU1RFUiBSZWdCYXNlQWRkcjsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFBjaVN0YXRlOwotICAgICNkZWZpbmUgVDNfUENJX1NUQVRFX0ZPUkNFX1BDSV9SRVNFVCAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFQzX1BDSV9TVEFURV9JTlRFUlJVUFRfTk9UX0FDVElWRSAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBUM19QQ0lfU1RBVEVfTk9UX1BDSV9YX0JVUyAgICAgICAgICAgICAgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgVDNfUENJX1NUQVRFX0hJR0hfQlVTX1NQRUVEICAgICAgICAgICAgICAgICAgICAgQklUXzMKLSAgICAjZGVmaW5lIFQzX1BDSV9TVEFURV8zMkJJVF9QQ0lfQlVTICAgICAgICAgICAgICAgICAgICAgIEJJVF80Ci0gICAgI2RlZmluZSBUM19QQ0lfU1RBVEVfUENJX1JPTV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICBCSVRfNQotICAgICNkZWZpbmUgVDNfUENJX1NUQVRFX1BDSV9ST01fUkVUUllfRU5BQkxFICAgICAgICAgICAgICAgQklUXzYKLSAgICAjZGVmaW5lIFQzX1BDSV9TVEFURV9GTEFUX1ZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF84Ci0gICAgI2RlZmluZSBUM19QQ0lfU1RBVEVfUkVUUllfU0FNRV9ETUEgICAgICAgICAgICAgICAgICAgICBCSVRfMTMKLQotICAgIFQzXzMyQklUX1JFR0lTVEVSIENsb2NrQ3RybDsKLSAgICAjZGVmaW5lIFQzX1BDSV9DTEtDVFJMX1RYQ1BVX0NMS19ESVNBQkxFICAgICAgICAgICAgICAgIEJJVF8xMQotICAgICNkZWZpbmUgVDNfUENJX0NMS0NUUkxfUlhDUFVfQ0xLX0RJU0FCTEUgICAgICAgICAgICAgICAgQklUXzEwCi0gICAgI2RlZmluZSBUM19QQ0lfQ0xLQ1RSTF9DT1JFX0NMS19ESVNBQkxFICAgICAgICAgICAgICAgICBCSVRfOQotCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmVnQmFzZUFkZHI7Ci0KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNZW1XaW5kb3dCYXNlQWRkcjsKKwlUM18zMkJJVF9SRUdJU1RFUiBNZW1XaW5kb3dCYXNlQWRkcjsKIAogI2lmZGVmIE5JQ19DUFVfVklFVwotICAvKiBUaGVzZSByZWdpc3RlcnMgYXJlIE9OTFkgdmlzaWJsZSB0byBOSUMgQ1BVICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgUG93ZXJDb25zdW1lZDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBQb3dlckRpc3NpcGF0ZWQ7Ci0jZWxzZSAvKiBOSUNfQ1BVX1ZJRVcgKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSZWdEYXRhOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1lbVdpbmRvd0RhdGE7Ci0jZW5kaWYgLyogIU5JQ19DUFVfVklFVyAqLworCS8qIFRoZXNlIHJlZ2lzdGVycyBhcmUgT05MWSB2aXNpYmxlIHRvIE5JQyBDUFUgKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBQb3dlckNvbnN1bWVkOworCVQzXzMyQklUX1JFR0lTVEVSIFBvd2VyRGlzc2lwYXRlZDsKKyNlbHNlCQkJCS8qIE5JQ19DUFVfVklFVyAqLworCVQzXzMyQklUX1JFR0lTVEVSIFJlZ0RhdGE7CisJVDNfMzJCSVRfUkVHSVNURVIgTWVtV2luZG93RGF0YTsKKyNlbmRpZgkJCQkvKiAhTklDX0NQVV9WSUVXICovCiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlQ3RybDsKKwlUM18zMkJJVF9SRUdJU1RFUiBNb2RlQ3RybDsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1pc2NDZmc7CisJVDNfMzJCSVRfUkVHSVNURVIgTWlzY0NmZzsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1pc2NMb2NhbEN0cmw7CisJVDNfMzJCSVRfUkVHSVNURVIgTWlzY0xvY2FsQ3RybDsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFVudXNlZDQ7CisJVDNfMzJCSVRfUkVHSVNURVIgVW51c2VkNDsKIAotICAgIC8qIE5PVEU6IEJpZy9MaXR0bGUtZW5kaWFuIGNsYXJpZmljYXRpb24gbmVlZGVkLiAgQXJlIHRoZXNlIHJlZ2lzdGVyICovCi0gICAgLyogaW4gYmlnIG9yIGxpdHRsZSBlbmRpYW4gZm9ybWF0ZS4gKi8KLSAgICBUM182NEJJVF9SRUdJU1RFUiBTdGRSaW5nUHJvZElkeDsKLSAgICBUM182NEJJVF9SRUdJU1RFUiBSY3ZSZXRSaW5nQ29uSWR4OwotICAgIFQzXzY0QklUX1JFR0lTVEVSIFNuZFByb2RJZHg7CisJLyogTk9URTogQmlnL0xpdHRsZS1lbmRpYW4gY2xhcmlmaWNhdGlvbiBuZWVkZWQuICBBcmUgdGhlc2UgcmVnaXN0ZXIgKi8KKwkvKiBpbiBiaWcgb3IgbGl0dGxlIGVuZGlhbiBmb3JtYXRlLiAqLworCVQzXzY0QklUX1JFR0lTVEVSIFN0ZFJpbmdQcm9kSWR4OworCVQzXzY0QklUX1JFR0lTVEVSIFJjdlJldFJpbmdDb25JZHg7CisJVDNfNjRCSVRfUkVHSVNURVIgU25kUHJvZElkeDsKIAotICAgIExNX1VJTlQ4IFVudXNlZDVbODBdOworCUxNX1VJTlQ4IFVudXNlZDVbODBdOwogfSBUM19QQ0lfQ09ORklHVVJBVElPTiwgKlBUM19QQ0lfQ09ORklHVVJBVElPTjsKIAogI2RlZmluZSBQQ0lYX0NNRF9NQVhfU1BMSVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzAKQEAgLTEzNzQsMTM4MiArMTMyNiwxMzQ3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyogTUFDIG1vZGUgY29udHJvbC4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgTUFDX01PREVfR0xPQkFMX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgTUFDX01PREVfSEFMRl9EVVBMRVggICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgTUFDX01PREVfUE9SVF9NT0RFX01BU0sgICAgICAgICAgICAgICAgICAgICAoQklUXzIgfCBCSVRfMykKLSAgICAjZGVmaW5lIE1BQ19NT0RFX1BPUlRfTU9ERV9UQkkgICAgICAgICAgICAgICAgICAgICAgKEJJVF8yIHwgQklUXzMpCi0gICAgI2RlZmluZSBNQUNfTU9ERV9QT1JUX01PREVfR01JSSAgICAgICAgICAgICAgICAgICAgIEJJVF8zCi0gICAgI2RlZmluZSBNQUNfTU9ERV9QT1JUX01PREVfTUlJICAgICAgICAgICAgICAgICAgICAgIEJJVF8yCi0gICAgI2RlZmluZSBNQUNfTU9ERV9QT1JUX01PREVfTk9ORSAgICAgICAgICAgICAgICAgICAgIEJJVF9OT05FCi0gICAgI2RlZmluZSBNQUNfTU9ERV9QT1JUX0lOVEVSTkFMX0xPT1BCQUNLICAgICAgICAgICAgIEJJVF80Ci0gICAgI2RlZmluZSBNQUNfTU9ERV9UQUdHRURfTUFDX0NPTlRST0wgICAgICAgICAgICAgICAgIEJJVF83Ci0gICAgI2RlZmluZSBNQUNfTU9ERV9UWF9CVVJTVElORyAgICAgICAgICAgICAgICAgICAgICAgIEJJVF84Ci0gICAgI2RlZmluZSBNQUNfTU9ERV9NQVhfREVGRVIgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF85Ci0gICAgI2RlZmluZSBNQUNfTU9ERV9MSU5LX1BPTEFSSVRZICAgICAgICAgICAgICAgICAgICAgIEJJVF8xMAotICAgICNkZWZpbmUgTUFDX01PREVfRU5BQkxFX1JYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICBCSVRfMTEKLSAgICAjZGVmaW5lIE1BQ19NT0RFX0NMRUFSX1JYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgQklUXzEyCi0gICAgI2RlZmluZSBNQUNfTU9ERV9GTFVTSF9SWF9TVEFUSVNUSUNTICAgICAgICAgICAgICAgIEJJVF8xMwotICAgICNkZWZpbmUgTUFDX01PREVfRU5BQkxFX1RYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICBCSVRfMTQKLSAgICAjZGVmaW5lIE1BQ19NT0RFX0NMRUFSX1RYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgQklUXzE1Ci0gICAgI2RlZmluZSBNQUNfTU9ERV9GTFVTSF9UWF9TVEFUSVNUSUNTICAgICAgICAgICAgICAgIEJJVF8xNgotICAgICNkZWZpbmUgTUFDX01PREVfU0VORF9DT05GSUdTICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTcKLSAgICAjZGVmaW5lIE1BQ19NT0RFX0RFVEVDVF9NQUdJQ19QQUNLRVRfRU5BQkxFICAgICAgICAgQklUXzE4Ci0gICAgI2RlZmluZSBNQUNfTU9ERV9BQ1BJX1BPV0VSX09OX0VOQUJMRSAgICAgICAgICAgICAgIEJJVF8xOQotICAgICNkZWZpbmUgTUFDX01PREVfRU5BQkxFX01JUCAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjAKLSAgICAjZGVmaW5lIE1BQ19NT0RFX0VOQUJMRV9UREUgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIxCi0gICAgI2RlZmluZSBNQUNfTU9ERV9FTkFCTEVfUkRFICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yMgotICAgICNkZWZpbmUgTUFDX01PREVfRU5BQkxFX0ZIREUgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjMKKwkvKiBNQUMgbW9kZSBjb250cm9sLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisjZGVmaW5lIE1BQ19NT0RFX0dMT0JBTF9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgTUFDX01PREVfSEFMRl9EVVBMRVggICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBNQUNfTU9ERV9QT1JUX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgIChCSVRfMiB8IEJJVF8zKQorI2RlZmluZSBNQUNfTU9ERV9QT1JUX01PREVfVEJJICAgICAgICAgICAgICAgICAgICAgIChCSVRfMiB8IEJJVF8zKQorI2RlZmluZSBNQUNfTU9ERV9QT1JUX01PREVfR01JSSAgICAgICAgICAgICAgICAgICAgIEJJVF8zCisjZGVmaW5lIE1BQ19NT0RFX1BPUlRfTU9ERV9NSUkgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKyNkZWZpbmUgTUFDX01PREVfUE9SVF9NT0RFX05PTkUgICAgICAgICAgICAgICAgICAgICBCSVRfTk9ORQorI2RlZmluZSBNQUNfTU9ERV9QT1JUX0lOVEVSTkFMX0xPT1BCQUNLICAgICAgICAgICAgIEJJVF80CisjZGVmaW5lIE1BQ19NT0RFX1RBR0dFRF9NQUNfQ09OVFJPTCAgICAgICAgICAgICAgICAgQklUXzcKKyNkZWZpbmUgTUFDX01PREVfVFhfQlVSU1RJTkcgICAgICAgICAgICAgICAgICAgICAgICBCSVRfOAorI2RlZmluZSBNQUNfTU9ERV9NQVhfREVGRVIgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF85CisjZGVmaW5lIE1BQ19NT0RFX0xJTktfUE9MQVJJVFkgICAgICAgICAgICAgICAgICAgICAgQklUXzEwCisjZGVmaW5lIE1BQ19NT0RFX0VOQUJMRV9SWF9TVEFUSVNUSUNTICAgICAgICAgICAgICAgQklUXzExCisjZGVmaW5lIE1BQ19NT0RFX0NMRUFSX1JYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgQklUXzEyCisjZGVmaW5lIE1BQ19NT0RFX0ZMVVNIX1JYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgQklUXzEzCisjZGVmaW5lIE1BQ19NT0RFX0VOQUJMRV9UWF9TVEFUSVNUSUNTICAgICAgICAgICAgICAgQklUXzE0CisjZGVmaW5lIE1BQ19NT0RFX0NMRUFSX1RYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgQklUXzE1CisjZGVmaW5lIE1BQ19NT0RFX0ZMVVNIX1RYX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgQklUXzE2CisjZGVmaW5lIE1BQ19NT0RFX1NFTkRfQ09ORklHUyAgICAgICAgICAgICAgICAgICAgICAgQklUXzE3CisjZGVmaW5lIE1BQ19NT0RFX0RFVEVDVF9NQUdJQ19QQUNLRVRfRU5BQkxFICAgICAgICAgQklUXzE4CisjZGVmaW5lIE1BQ19NT0RFX0FDUElfUE9XRVJfT05fRU5BQkxFICAgICAgICAgICAgICAgQklUXzE5CisjZGVmaW5lIE1BQ19NT0RFX0VOQUJMRV9NSVAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIwCisjZGVmaW5lIE1BQ19NT0RFX0VOQUJMRV9UREUgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIxCisjZGVmaW5lIE1BQ19NT0RFX0VOQUJMRV9SREUgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIyCisjZGVmaW5lIE1BQ19NT0RFX0VOQUJMRV9GSERFICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIzCiAKLSAgICAvKiBNQUMgc3RhdHVzICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOwotICAgICNkZWZpbmUgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgTUFDX1NUQVRVU19TSUdOQUxfREVURUNURUQgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgTUFDX1NUQVRVU19SRUNFSVZJTkdfQ0ZHICAgICAgICAgICAgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgICBCSVRfMwotICAgICNkZWZpbmUgTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgICAgICAgICAgICAgICAgICAgICBCSVRfNAotICAgICNkZWZpbmUgTUFDX1NUQVRVU19QT1JUX0RFQ09ERV9FUlJPUiAgICAgICAgICAgICAgICBCSVRfMTAKLSAgICAjZGVmaW5lIE1BQ19TVEFUVVNfTElOS19TVEFURV9DSEFOR0VEICAgICAgICAgICAgICAgQklUXzEyCi0gICAgI2RlZmluZSBNQUNfU1RBVFVTX01JX0NPTVBMRVRJT04gICAgICAgICAgICAgICAgICAgIEJJVF8yMgotICAgICNkZWZpbmUgTUFDX1NUQVRVU19NSV9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICBCSVRfMjMKLSAgICAjZGVmaW5lIE1BQ19TVEFUVVNfQVBfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI0Ci0gICAgI2RlZmluZSBNQUNfU1RBVFVTX09ESV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yNQotICAgICNkZWZpbmUgTUFDX1NUQVRVU19SWF9TVEFUU19PVkVSUlVOICAgICAgICAgICAgICAgICBCSVRfMjYKLSAgICAjZGVmaW5lIE1BQ19TVEFUVVNfVFhfU1RBVFNfT1ZFUlJVTiAgICAgICAgICAgICAgICAgQklUXzI3CisJLyogTUFDIHN0YXR1cyAqLworCVQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKyNkZWZpbmUgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBNQUNfU1RBVFVTX1NJR05BTF9ERVRFQ1RFRCAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIE1BQ19TVEFUVVNfUkVDRUlWSU5HX0NGRyAgICAgICAgICAgICAgICAgICAgQklUXzIKKyNkZWZpbmUgTUFDX1NUQVRVU19DRkdfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgICBCSVRfMworI2RlZmluZSBNQUNfU1RBVFVTX1NZTkNfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgIEJJVF80CisjZGVmaW5lIE1BQ19TVEFUVVNfUE9SVF9ERUNPREVfRVJST1IgICAgICAgICAgICAgICAgQklUXzEwCisjZGVmaW5lIE1BQ19TVEFUVVNfTElOS19TVEFURV9DSEFOR0VEICAgICAgICAgICAgICAgQklUXzEyCisjZGVmaW5lIE1BQ19TVEFUVVNfTUlfQ09NUExFVElPTiAgICAgICAgICAgICAgICAgICAgQklUXzIyCisjZGVmaW5lIE1BQ19TVEFUVVNfTUlfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgQklUXzIzCisjZGVmaW5lIE1BQ19TVEFUVVNfQVBfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI0CisjZGVmaW5lIE1BQ19TVEFUVVNfT0RJX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI1CisjZGVmaW5lIE1BQ19TVEFUVVNfUlhfU1RBVFNfT1ZFUlJVTiAgICAgICAgICAgICAgICAgQklUXzI2CisjZGVmaW5lIE1BQ19TVEFUVVNfVFhfU1RBVFNfT1ZFUlJVTiAgICAgICAgICAgICAgICAgQklUXzI3CiAKLSAgICAvKiBFdmVudCBFbmFibGUgKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNYWNFdmVudDsKLSAgICAjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfUE9SVF9ERUNPREVfRVJSICAgICAgICAgICAgQklUXzEwCi0gICAgI2RlZmluZSBNQUNfRVZFTlRfRU5BQkxFX0xJTktfU1RBVEVfQ0hBTkdFRF9BVFROICAgIEJJVF8xMgotICAgICNkZWZpbmUgTUFDX0VWRU5UX0VOQUJMRV9NSV9DT01QTEVUSU9OICAgICAgICAgICAgICBCSVRfMjIKLSAgICAjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfTUlfSU5URVJSVVBUICAgICAgICAgICAgICAgQklUXzIzCi0gICAgI2RlZmluZSBNQUNfRVZFTlRfRU5BQkxFX0FQX0VSUk9SICAgICAgICAgICAgICAgICAgIEJJVF8yNAotICAgICNkZWZpbmUgTUFDX0VWRU5UX0VOQUJMRV9PRElfRVJST1IgICAgICAgICAgICAgICAgICBCSVRfMjUKLSAgICAjZGVmaW5lIE1BQ19FVkVOVF9FTkFCTEVfUlhfU1RBVFNfT1ZFUlJVTiAgICAgICAgICAgQklUXzI2Ci0gICAgI2RlZmluZSBNQUNfRVZFTlRfRU5BQkxFX1RYX1NUQVRTX09WRVJSVU4gICAgICAgICAgIEJJVF8yNworCS8qIEV2ZW50IEVuYWJsZSAqLworCVQzXzMyQklUX1JFR0lTVEVSIE1hY0V2ZW50OworI2RlZmluZSBNQUNfRVZFTlRfRU5BQkxFX1BPUlRfREVDT0RFX0VSUiAgICAgICAgICAgIEJJVF8xMAorI2RlZmluZSBNQUNfRVZFTlRfRU5BQkxFX0xJTktfU1RBVEVfQ0hBTkdFRF9BVFROICAgIEJJVF8xMgorI2RlZmluZSBNQUNfRVZFTlRfRU5BQkxFX01JX0NPTVBMRVRJT04gICAgICAgICAgICAgIEJJVF8yMgorI2RlZmluZSBNQUNfRVZFTlRfRU5BQkxFX01JX0lOVEVSUlVQVCAgICAgICAgICAgICAgIEJJVF8yMworI2RlZmluZSBNQUNfRVZFTlRfRU5BQkxFX0FQX0VSUk9SICAgICAgICAgICAgICAgICAgIEJJVF8yNAorI2RlZmluZSBNQUNfRVZFTlRfRU5BQkxFX09ESV9FUlJPUiAgICAgICAgICAgICAgICAgIEJJVF8yNQorI2RlZmluZSBNQUNfRVZFTlRfRU5BQkxFX1JYX1NUQVRTX09WRVJSVU4gICAgICAgICAgIEJJVF8yNgorI2RlZmluZSBNQUNfRVZFTlRfRU5BQkxFX1RYX1NUQVRTX09WRVJSVU4gICAgICAgICAgIEJJVF8yNwogCi0gICAgLyogTGVkIGNvbnRyb2wuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTGVkQ3RybDsKLSAgICAjZGVmaW5lIExFRF9DVFJMX09WRVJSSURFX0xJTktfTEVEICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIExFRF9DVFJMXzEwMDBNQlBTX0xFRF9PTiAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIExFRF9DVFJMXzEwME1CUFNfTEVEX09OICAgICAgICAgICAgICAgICAgICAgQklUXzIKLSAgICAjZGVmaW5lIExFRF9DVFJMXzEwTUJQU19MRURfT04gICAgICAgICAgICAgICAgICAgICAgQklUXzMKLSAgICAjZGVmaW5lIExFRF9DVFJMX09WRVJSSURFX1RSQUZGSUNfTEVEICAgICAgICAgICAgICAgQklUXzQKLSAgICAjZGVmaW5lIExFRF9DVFJMX0JMSU5LX1RSQUZGSUNfTEVEICAgICAgICAgICAgICAgICAgQklUXzUKLSAgICAjZGVmaW5lIExFRF9DVFJMX1RSQUZGSUNfTEVEICAgICAgICAgICAgICAgICAgICAgICAgQklUXzYKLSAgICAjZGVmaW5lIExFRF9DVFJMXzEwMDBNQlBTX0xFRF9TVEFUVVMgICAgICAgICAgICAgICAgQklUXzcKLSAgICAjZGVmaW5lIExFRF9DVFJMXzEwME1CUFNfTEVEX1NUQVRVUyAgICAgICAgICAgICAgICAgQklUXzgKLSAgICAjZGVmaW5lIExFRF9DVFJMXzEwTUJQU19MRURfU1RBVFVTICAgICAgICAgICAgICAgICAgQklUXzkKLSAgICAjZGVmaW5lIExFRF9DVFJMX1RSQUZGSUNfTEVEX1NUQVRVUyAgICAgICAgICAgICAgICAgQklUXzEwCi0gICAgI2RlZmluZSBMRURfQ1RSTF9NQUNfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF9OT05FCi0gICAgI2RlZmluZSBMRURfQ1RSTF9QSFlfTU9ERV8xICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xMQotICAgICNkZWZpbmUgTEVEX0NUUkxfUEhZX01PREVfMiAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTIKLSAgICAjZGVmaW5lIExFRF9DVFJMX0JMSU5LX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg3ZmY4MDAwMAotICAgICNkZWZpbmUgTEVEX0NUUkxfT1ZFUlJJREVfQkxJTktfUEVSSU9EICAgICAgICAgICAgICBCSVRfMTkKLSAgICAjZGVmaW5lIExFRF9DVFJMX09WRVJSSURFX0JMSU5LX1JBVEUgICAgICAgICAgICAgICAgQklUXzMxCisJLyogTGVkIGNvbnRyb2wuICovCisJVDNfMzJCSVRfUkVHSVNURVIgTGVkQ3RybDsKKyNkZWZpbmUgTEVEX0NUUkxfT1ZFUlJJREVfTElOS19MRUQgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBMRURfQ1RSTF8xMDAwTUJQU19MRURfT04gICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIExFRF9DVFJMXzEwME1CUFNfTEVEX09OICAgICAgICAgICAgICAgICAgICAgQklUXzIKKyNkZWZpbmUgTEVEX0NUUkxfMTBNQlBTX0xFRF9PTiAgICAgICAgICAgICAgICAgICAgICBCSVRfMworI2RlZmluZSBMRURfQ1RSTF9PVkVSUklERV9UUkFGRklDX0xFRCAgICAgICAgICAgICAgIEJJVF80CisjZGVmaW5lIExFRF9DVFJMX0JMSU5LX1RSQUZGSUNfTEVEICAgICAgICAgICAgICAgICAgQklUXzUKKyNkZWZpbmUgTEVEX0NUUkxfVFJBRkZJQ19MRUQgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNgorI2RlZmluZSBMRURfQ1RSTF8xMDAwTUJQU19MRURfU1RBVFVTICAgICAgICAgICAgICAgIEJJVF83CisjZGVmaW5lIExFRF9DVFJMXzEwME1CUFNfTEVEX1NUQVRVUyAgICAgICAgICAgICAgICAgQklUXzgKKyNkZWZpbmUgTEVEX0NUUkxfMTBNQlBTX0xFRF9TVEFUVVMgICAgICAgICAgICAgICAgICBCSVRfOQorI2RlZmluZSBMRURfQ1RSTF9UUkFGRklDX0xFRF9TVEFUVVMgICAgICAgICAgICAgICAgIEJJVF8xMAorI2RlZmluZSBMRURfQ1RSTF9NQUNfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF9OT05FCisjZGVmaW5lIExFRF9DVFJMX1BIWV9NT0RFXzEgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzExCisjZGVmaW5lIExFRF9DVFJMX1BIWV9NT0RFXzIgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEyCisjZGVmaW5lIExFRF9DVFJMX0JMSU5LX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg3ZmY4MDAwMAorI2RlZmluZSBMRURfQ1RSTF9PVkVSUklERV9CTElOS19QRVJJT0QgICAgICAgICAgICAgIEJJVF8xOQorI2RlZmluZSBMRURfQ1RSTF9PVkVSUklERV9CTElOS19SQVRFICAgICAgICAgICAgICAgIEJJVF8zMQogCi0gICAgLyogTUFDIGFkZHJlc3Nlcy4gKi8KLSAgICBzdHJ1Y3QgewotCVQzXzMyQklUX1JFR0lTVEVSIEhpZ2g7ICAgICAgICAgICAgIC8qIFVwcGVyIDIgYnl0ZXMuICovCi0JVDNfMzJCSVRfUkVHSVNURVIgTG93OyAgICAgICAgICAgICAgLyogTG93ZXIgNCBieXRlcy4gKi8KLSAgICB9IE1hY0FkZHJbNF07CisJLyogTUFDIGFkZHJlc3Nlcy4gKi8KKwlzdHJ1Y3QgeworCQlUM18zMkJJVF9SRUdJU1RFUiBIaWdoOwkvKiBVcHBlciAyIGJ5dGVzLiAqLworCQlUM18zMkJJVF9SRUdJU1RFUiBMb3c7CS8qIExvd2VyIDQgYnl0ZXMuICovCisJfSBNYWNBZGRyWzRdOwogCi0gICAgLyogQUNQSSBNYnVmIHBvaW50ZXIuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgQWNwaU1idWZQdHI7CisJLyogQUNQSSBNYnVmIHBvaW50ZXIuICovCisJVDNfMzJCSVRfUkVHSVNURVIgQWNwaU1idWZQdHI7CiAKLSAgICAvKiBBQ1BJIExlbmd0aCBhbmQgT2Zmc2V0LiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIEFjcGlMZW5ndGhPZmZzZXQ7Ci0gICAgI2RlZmluZSBBQ1BJX0xFTkdUSF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgotICAgICNkZWZpbmUgQUNQSV9PRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBmZmYwMDAwCi0gICAgI2RlZmluZSBBQ1BJX0xFTkdUSCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgKLSAgICAjZGVmaW5lIEFDUElfT0ZGU0VUKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA8PCAxNikKKwkvKiBBQ1BJIExlbmd0aCBhbmQgT2Zmc2V0LiAqLworCVQzXzMyQklUX1JFR0lTVEVSIEFjcGlMZW5ndGhPZmZzZXQ7CisjZGVmaW5lIEFDUElfTEVOR1RIX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisjZGVmaW5lIEFDUElfT0ZGU0VUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZmZmMDAwMAorI2RlZmluZSBBQ1BJX0xFTkdUSCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgKKyNkZWZpbmUgQUNQSV9PRkZTRVQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHgpIDw8IDE2KQogCi0gICAgLyogVHJhbnNtaXQgcmFuZG9tIGJhY2tvZmYuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgVHhCYWNrb2ZmU2VlZDsKLSAgICAjZGVmaW5lIE1BQ19UWF9CQUNLT0ZGX1NFRURfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgzZmYKKwkvKiBUcmFuc21pdCByYW5kb20gYmFja29mZi4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBUeEJhY2tvZmZTZWVkOworI2RlZmluZSBNQUNfVFhfQkFDS09GRl9TRUVEX01BU0sgICAgICAgICAgICAgICAgICAgIDB4M2ZmCiAKLSAgICAvKiBSZWNlaXZlIE1UVSAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE10dVNpemU7Ci0gICAgI2RlZmluZSBNQUNfUlhfTVRVX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorCS8qIFJlY2VpdmUgTVRVICovCisJVDNfMzJCSVRfUkVHSVNURVIgTXR1U2l6ZTsKKyNkZWZpbmUgTUFDX1JYX01UVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKIAotICAgIC8qIEdpZ2FiaXQgUENTIFRlc3QuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgUGNzVGVzdDsKLSAgICAjZGVmaW5lIE1BQ19QQ1NfVEVTVF9EQVRBX1BBVFRFUk5fTUFTSyAgICAgICAgICAgICAgMHgwZmZmZmYKLSAgICAjZGVmaW5lIE1BQ19QQ1NfVEVTVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIwCisJLyogR2lnYWJpdCBQQ1MgVGVzdC4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBQY3NUZXN0OworI2RlZmluZSBNQUNfUENTX1RFU1RfREFUQV9QQVRURVJOX01BU0sgICAgICAgICAgICAgIDB4MGZmZmZmCisjZGVmaW5lIE1BQ19QQ1NfVEVTVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIwCiAKLSAgICAvKiBUcmFuc21pdCBHaWdhYml0IEF1dG8tTmVnb3RpYXRpb24uICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgVHhBdXRvTmVnOwotICAgICNkZWZpbmUgTUFDX0FOX1RYX0FOX0RBVEFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKwkvKiBUcmFuc21pdCBHaWdhYml0IEF1dG8tTmVnb3RpYXRpb24uICovCisJVDNfMzJCSVRfUkVHSVNURVIgVHhBdXRvTmVnOworI2RlZmluZSBNQUNfQU5fVFhfQU5fREFUQV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgogCi0gICAgLyogUmVjZWl2ZSBHaWdhYml0IEF1dG8tTmVnb3RpYXRpb24uICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgUnhBdXRvTmVnOwotICAgICNkZWZpbmUgTUFDX0FOX1JYX0FOX0RBVEFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKwkvKiBSZWNlaXZlIEdpZ2FiaXQgQXV0by1OZWdvdGlhdGlvbi4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBSeEF1dG9OZWc7CisjZGVmaW5lIE1BQ19BTl9SWF9BTl9EQVRBX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCiAKLSAgICAvKiBNSSBDb21tdW5pY2F0aW9uLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1pQ29tOwotICAgICNkZWZpbmUgTUlfQ09NX0NNRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUXzI2IHwgQklUXzI3KQotICAgICNkZWZpbmUgTUlfQ09NX0NNRF9XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjYKLSAgICAjZGVmaW5lIE1JX0NPTV9DTURfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI3Ci0gICAgI2RlZmluZSBNSV9DT01fUkVBRF9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yOAotICAgICNkZWZpbmUgTUlfQ09NX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjkKLSAgICAjZGVmaW5lIE1JX0NPTV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI5CisJLyogTUkgQ29tbXVuaWNhdGlvbi4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBNaUNvbTsKKyNkZWZpbmUgTUlfQ09NX0NNRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUXzI2IHwgQklUXzI3KQorI2RlZmluZSBNSV9DT01fQ01EX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yNgorI2RlZmluZSBNSV9DT01fQ01EX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yNworI2RlZmluZSBNSV9DT01fUkVBRF9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yOAorI2RlZmluZSBNSV9DT01fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yOQorI2RlZmluZSBNSV9DT01fQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yOQogCi0gICAgI2RlZmluZSBNSV9DT01fUEhZX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MWYKLSAgICAjZGVmaW5lIE1JX0NPTV9GSVJTVF9QSFlfQUREUl9CSVQgICAgICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgTUlfQ09NX1BIWV9BRERSX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDFmCisjZGVmaW5lIE1JX0NPTV9GSVJTVF9QSFlfQUREUl9CSVQgICAgICAgICAgICAgICAgICAgMjEKIAotICAgICNkZWZpbmUgTUlfQ09NX1BIWV9SRUdfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDFmCi0gICAgI2RlZmluZSBNSV9DT01fRklSU1RfUEhZX1JFR19BRERSX0JJVCAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE1JX0NPTV9QSFlfUkVHX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgxZgorI2RlZmluZSBNSV9DT01fRklSU1RfUEhZX1JFR19BRERSX0JJVCAgICAgICAgICAgICAgIDE2CiAKLSAgICAjZGVmaW5lIE1JX0NPTV9QSFlfREFUQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisjZGVmaW5lIE1JX0NPTV9QSFlfREFUQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCiAKLSAgICAvKiBNSSBTdGF0dXMuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWlTdGF0dXM7Ci0gICAgI2RlZmluZSBNSV9TVEFUVVNfRU5BQkxFX0xJTktfU1RBVFVTX0FUVE4gICAgICAgICAgIEJJVF8wCisJLyogTUkgU3RhdHVzLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIE1pU3RhdHVzOworI2RlZmluZSBNSV9TVEFUVVNfRU5BQkxFX0xJTktfU1RBVFVTX0FUVE4gICAgICAgICAgIEJJVF8wCiAKLSAgICAvKiBNSSBNb2RlLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1pTW9kZTsKLSAgICAjZGVmaW5lIE1JX01PREVfQ0xPQ0tfU1BFRURfMTBNSFogICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIE1JX01PREVfVVNFX1NIT1JUX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIE1JX01PREVfQVVUT19QT0xMSU5HX0VOQUJMRSAgICAgICAgICAgICAgICAgQklUXzQKLSAgICAjZGVmaW5lIE1JX01PREVfQ09SRV9DTE9DS19TUEVFRF82Mk1IWiAgICAgICAgICAgICAgQklUXzE1CisJLyogTUkgTW9kZS4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBNaU1vZGU7CisjZGVmaW5lIE1JX01PREVfQ0xPQ0tfU1BFRURfMTBNSFogICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgTUlfTU9ERV9VU0VfU0hPUlRfUFJFQU1CTEUgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBNSV9NT0RFX0FVVE9fUE9MTElOR19FTkFCTEUgICAgICAgICAgICAgICAgIEJJVF80CisjZGVmaW5lIE1JX01PREVfQ09SRV9DTE9DS19TUEVFRF82Mk1IWiAgICAgICAgICAgICAgQklUXzE1CiAKLSAgICAvKiBBdXRvLXBvbGxpbmcgc3RhdHVzLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIEF1dG9Qb2xsU3RhdHVzOwotICAgICNkZWZpbmUgQVVUT19QT0xMX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorCS8qIEF1dG8tcG9sbGluZyBzdGF0dXMuICovCisJVDNfMzJCSVRfUkVHSVNURVIgQXV0b1BvbGxTdGF0dXM7CisjZGVmaW5lIEFVVE9fUE9MTF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKIAotICAgIC8qIFRyYW5zbWl0IE1BQyBtb2RlLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4TW9kZTsKLSAgICAjZGVmaW5lIFRYX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFRYX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIFRYX01PREVfRU5BQkxFX0ZMT1dfQ09OVFJPTCAgICAgICAgICAgICAgICAgQklUXzQKLSAgICAjZGVmaW5lIFRYX01PREVfRU5BQkxFX0JJR19CQUNLT0ZGICAgICAgICAgICAgICAgICAgQklUXzUKLSAgICAjZGVmaW5lIFRYX01PREVfRU5BQkxFX0xPTkdfUEFVU0UgICAgICAgICAgICAgICAgICAgQklUXzYKKwkvKiBUcmFuc21pdCBNQUMgbW9kZS4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBUeE1vZGU7CisjZGVmaW5lIFRYX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgVFhfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBUWF9NT0RFX0VOQUJMRV9GTE9XX0NPTlRST0wgICAgICAgICAgICAgICAgIEJJVF80CisjZGVmaW5lIFRYX01PREVfRU5BQkxFX0JJR19CQUNLT0ZGICAgICAgICAgICAgICAgICAgQklUXzUKKyNkZWZpbmUgVFhfTU9ERV9FTkFCTEVfTE9OR19QQVVTRSAgICAgICAgICAgICAgICAgICBCSVRfNgogCi0gICAgLyogVHJhbnNtaXQgTUFDIHN0YXR1cy4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBUeFN0YXR1czsKLSAgICAjZGVmaW5lIFRYX1NUQVRVU19SWF9DVVJSRU5UTFlfWE9GRkVEICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFRYX1NUQVRVU19TRU5UX1hPRkYgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIFRYX1NUQVRVU19TRU5UX1hPTiAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIKLSAgICAjZGVmaW5lIFRYX1NUQVRVU19MSU5LX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzMKLSAgICAjZGVmaW5lIFRYX1NUQVRVU19PRElfVU5ERVJSVU4gICAgICAgICAgICAgICAgICAgICAgQklUXzQKLSAgICAjZGVmaW5lIFRYX1NUQVRVU19PRElfT1ZFUlJVTiAgICAgICAgICAgICAgICAgICAgICAgQklUXzUKKwkvKiBUcmFuc21pdCBNQUMgc3RhdHVzLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFR4U3RhdHVzOworI2RlZmluZSBUWF9TVEFUVVNfUlhfQ1VSUkVOVExZX1hPRkZFRCAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIFRYX1NUQVRVU19TRU5UX1hPRkYgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgVFhfU1RBVFVTX1NFTlRfWE9OICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMgorI2RlZmluZSBUWF9TVEFUVVNfTElOS19VUCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8zCisjZGVmaW5lIFRYX1NUQVRVU19PRElfVU5ERVJSVU4gICAgICAgICAgICAgICAgICAgICAgQklUXzQKKyNkZWZpbmUgVFhfU1RBVFVTX09ESV9PVkVSUlVOICAgICAgICAgICAgICAgICAgICAgICBCSVRfNQogCi0gICAgLyogVHJhbnNtaXQgTUFDIGxlbmd0aC4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBUeExlbmd0aHM7Ci0gICAgI2RlZmluZSBUWF9MRU5fU0xPVF9USU1FX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYKLSAgICAjZGVmaW5lIFRYX0xFTl9JUEdfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZjAwCi0gICAgI2RlZmluZSBUWF9MRU5fSVBHX0NSU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRfMTIgfCBCSVRfMTMpCisJLyogVHJhbnNtaXQgTUFDIGxlbmd0aC4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBUeExlbmd0aHM7CisjZGVmaW5lIFRYX0xFTl9TTE9UX1RJTUVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHhmZgorI2RlZmluZSBUWF9MRU5fSVBHX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGYwMAorI2RlZmluZSBUWF9MRU5fSVBHX0NSU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRfMTIgfCBCSVRfMTMpCiAKLSAgICAvKiBSZWNlaXZlIE1BQyBtb2RlLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4TW9kZTsKLSAgICAjZGVmaW5lIFJYX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFJYX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIFJYX01PREVfRU5BQkxFX0ZMT1dfQ09OVFJPTCAgICAgICAgICAgICAgICAgQklUXzIKLSAgICAjZGVmaW5lIFJYX01PREVfS0VFUF9NQUNfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgQklUXzMKLSAgICAjZGVmaW5lIFJYX01PREVfS0VFUF9QQVVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzQKLSAgICAjZGVmaW5lIFJYX01PREVfQUNDRVBUX09WRVJTSVpFRCAgICAgICAgICAgICAgICAgICAgQklUXzUKLSAgICAjZGVmaW5lIFJYX01PREVfQUNDRVBUX1JVTlRTICAgICAgICAgICAgICAgICAgICAgICAgQklUXzYKLSAgICAjZGVmaW5lIFJYX01PREVfTEVOR1RIX0NIRUNLICAgICAgICAgICAgICAgICAgICAgICAgQklUXzcKLSAgICAjZGVmaW5lIFJYX01PREVfUFJPTUlTQ1VPVVNfTU9ERSAgICAgICAgICAgICAgICAgICAgQklUXzgKLSAgICAjZGVmaW5lIFJYX01PREVfTk9fQ1JDX0NIRUNLICAgICAgICAgICAgICAgICAgICAgICAgQklUXzkKLSAgICAjZGVmaW5lIFJYX01PREVfS0VFUF9WTEFOX1RBRyAgICAgICAgICAgICAgICAgICAgICAgQklUXzEwCisJLyogUmVjZWl2ZSBNQUMgbW9kZS4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBSeE1vZGU7CisjZGVmaW5lIFJYX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgUlhfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBSWF9NT0RFX0VOQUJMRV9GTE9XX0NPTlRST0wgICAgICAgICAgICAgICAgIEJJVF8yCisjZGVmaW5lIFJYX01PREVfS0VFUF9NQUNfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgQklUXzMKKyNkZWZpbmUgUlhfTU9ERV9LRUVQX1BBVVNFICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNAorI2RlZmluZSBSWF9NT0RFX0FDQ0VQVF9PVkVSU0laRUQgICAgICAgICAgICAgICAgICAgIEJJVF81CisjZGVmaW5lIFJYX01PREVfQUNDRVBUX1JVTlRTICAgICAgICAgICAgICAgICAgICAgICAgQklUXzYKKyNkZWZpbmUgUlhfTU9ERV9MRU5HVEhfQ0hFQ0sgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNworI2RlZmluZSBSWF9NT0RFX1BST01JU0NVT1VTX01PREUgICAgICAgICAgICAgICAgICAgIEJJVF84CisjZGVmaW5lIFJYX01PREVfTk9fQ1JDX0NIRUNLICAgICAgICAgICAgICAgICAgICAgICAgQklUXzkKKyNkZWZpbmUgUlhfTU9ERV9LRUVQX1ZMQU5fVEFHICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTAKIAotICAgIC8qIFJlY2VpdmUgTUFDIHN0YXR1cy4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSeFN0YXR1czsKLSAgICAjZGVmaW5lIFJYX1NUQVRVU19SRU1PVEVfVFJBTlNNSVRURVJfWE9GRkVEICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFJYX1NUQVRVU19YT0ZGX1JFQ0VJVkVEICAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIFJYX1NUQVRVU19YT05fUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKwkvKiBSZWNlaXZlIE1BQyBzdGF0dXMuICovCisJVDNfMzJCSVRfUkVHSVNURVIgUnhTdGF0dXM7CisjZGVmaW5lIFJYX1NUQVRVU19SRU1PVEVfVFJBTlNNSVRURVJfWE9GRkVEICAgICAgICAgQklUXzAKKyNkZWZpbmUgUlhfU1RBVFVTX1hPRkZfUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBSWF9TVEFUVVNfWE9OX1JFQ0VJVkVEICAgICAgICAgICAgICAgICAgICAgIEJJVF8yCiAKLSAgICAvKiBIYXNoIHJlZ2lzdGVycy4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBIYXNoUmVnWzRdOworCS8qIEhhc2ggcmVnaXN0ZXJzLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIEhhc2hSZWdbNF07CiAKLSAgICAvKiBSZWNlaXZlIHBsYWNlbWVudCBydWxlcyByZWdpc3RlcnMuICovCi0gICAgc3RydWN0IHsKLQlUM18zMkJJVF9SRUdJU1RFUiBSdWxlOwotCVQzXzMyQklUX1JFR0lTVEVSIFZhbHVlOwotICAgIH0gUmN2UnVsZXNbMTZdOworCS8qIFJlY2VpdmUgcGxhY2VtZW50IHJ1bGVzIHJlZ2lzdGVycy4gKi8KKwlzdHJ1Y3QgeworCQlUM18zMkJJVF9SRUdJU1RFUiBSdWxlOworCQlUM18zMkJJVF9SRUdJU1RFUiBWYWx1ZTsKKwl9IFJjdlJ1bGVzWzE2XTsKIAotICAgICNkZWZpbmUgUkNWX0RJU0FCTEVfUlVMRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDdmZmZmZmZmCisjZGVmaW5lIFJDVl9ESVNBQkxFX1JVTEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHg3ZmZmZmZmZgogCi0gICAgI2RlZmluZSBSQ1ZfUlVMRTFfUkVKRUNUX0JST0FEQ0FTVF9JRFggICAgICAgICAgICAgIDB4MDAKLSAgICAjZGVmaW5lIFJFSkVDVF9CUk9BRENBU1RfUlVMRTFfUlVMRSAgICAgICAgICAgICAgICAgMHhjMjAwMDAwMAotICAgICNkZWZpbmUgUkVKRUNUX0JST0FEQ0FTVF9SVUxFMV9WQUxVRSAgICAgICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIFJDVl9SVUxFMV9SRUpFQ1RfQlJPQURDQVNUX0lEWCAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBSRUpFQ1RfQlJPQURDQVNUX1JVTEUxX1JVTEUgICAgICAgICAgICAgICAgIDB4YzIwMDAwMDAKKyNkZWZpbmUgUkVKRUNUX0JST0FEQ0FTVF9SVUxFMV9WQUxVRSAgICAgICAgICAgICAgICAweGZmZmZmZmZmCiAKLSAgICAjZGVmaW5lIFJDVl9SVUxFMl9SRUpFQ1RfQlJPQURDQVNUX0lEWCAgICAgICAgICAgICAgMHgwMQotICAgICNkZWZpbmUgUkVKRUNUX0JST0FEQ0FTVF9SVUxFMl9SVUxFICAgICAgICAgICAgICAgICAweDg2MDAwMDA0Ci0gICAgI2RlZmluZSBSRUpFQ1RfQlJPQURDQVNUX1JVTEUyX1ZBTFVFICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgUkNWX1JVTEUyX1JFSkVDVF9CUk9BRENBU1RfSURYICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFJFSkVDVF9CUk9BRENBU1RfUlVMRTJfUlVMRSAgICAgICAgICAgICAgICAgMHg4NjAwMDAwNAorI2RlZmluZSBSRUpFQ1RfQlJPQURDQVNUX1JVTEUyX1ZBTFVFICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKIAogI2lmIElOQ0xVREVfNTcwMV9BWF9GSVgKLSAgICAjZGVmaW5lIFJDVl9MQVNUX1JVTEVfSURYICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBSQ1ZfTEFTVF9SVUxFX0lEWCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKICNlbHNlCi0gICAgI2RlZmluZSBSQ1ZfTEFTVF9SVUxFX0lEWCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUkNWX0xBU1RfUlVMRV9JRFggICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyCiAjZW5kaWYKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdlJ1bGVDZmc7Ci0gICAgI2RlZmluZSBSWF9SVUxFX0RFRkFVTFRfQ0xBU1MgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMpCisJVDNfMzJCSVRfUkVHSVNURVIgUmN2UnVsZUNmZzsKKyNkZWZpbmUgUlhfUlVMRV9ERUZBVUxUX0NMQVNTICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzKQogCi0gICAgTE1fVUlOVDggUmVzZXJ2ZWQxWzE0MF07CisJTE1fVUlOVDggUmVzZXJ2ZWQxWzE0MF07CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTZXJkZXNDZmc7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU2VyZGVzU3RhdHVzOworCVQzXzMyQklUX1JFR0lTVEVSIFNlcmRlc0NmZzsKKwlUM18zMkJJVF9SRUdJU1RFUiBTZXJkZXNTdGF0dXM7CiAKLSAgICBMTV9VSU5UOCBSZXNlcnZlZDJbMTA0XTsKKwlMTV9VSU5UOCBSZXNlcnZlZDJbMTA0XTsKIAotICAgIHZvbGF0aWxlIExNX1VJTlQ4IFR4TWFjU3RhdGVbMTZdOwotICAgIHZvbGF0aWxlIExNX1VJTlQ4IFJ4TWFjU3RhdGVbMjBdOworCXZvbGF0aWxlIExNX1VJTlQ4IFR4TWFjU3RhdGVbMTZdOworCXZvbGF0aWxlIExNX1VJTlQ4IFJ4TWFjU3RhdGVbMjBdOwogCi0gICAgTE1fVUlOVDggUmVzZXJ2ZWQzWzQ3Nl07CisJTE1fVUlOVDggUmVzZXJ2ZWQzWzQ3Nl07CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSeFN0YXRzWzI2XTsKKwlUM18zMkJJVF9SRUdJU1RFUiBSeFN0YXRzWzI2XTsKIAotICAgIExNX1VJTlQ4IFJlc2VydmVkNFsyNF07CisJTE1fVUlOVDggUmVzZXJ2ZWQ0WzI0XTsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4U3RhdHNbMjhdOworCVQzXzMyQklUX1JFR0lTVEVSIFR4U3RhdHNbMjhdOwogCi0gICAgTE1fVUlOVDggUmVzZXJ2ZWQ1Wzc4NF07CisJTE1fVUlOVDggUmVzZXJ2ZWQ1Wzc4NF07CiB9IFQzX01BQ19DT05UUk9MLCAqUFQzX01BQ19DT05UUk9MOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBTZW5kIGRhdGEgaW5pdGlhdG9yIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7Ci0gICAgI2RlZmluZSBUM19TTkRfREFUQV9JTl9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgVDNfU05EX0RBVEFfSU5fTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIFQzX1NORF9EQVRBX0lOX01PREVfU1RBVFNfT0ZMV19BVFROX0VOQUJMRSAgICAgIEJJVF8yCisJVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyNkZWZpbmUgVDNfU05EX0RBVEFfSU5fTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgVDNfU05EX0RBVEFfSU5fTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgVDNfU05EX0RBVEFfSU5fTU9ERV9TVEFUU19PRkxXX0FUVE5fRU5BQkxFICAgICAgQklUXzIKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKLSAgICAjZGVmaW5lIFQzX1NORF9EQVRBX0lOX1NUQVRVU19TVEFUU19PRkxXX0FUVE4gICAgICAgICAgIEJJVF8yCisJVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOworI2RlZmluZSBUM19TTkRfREFUQV9JTl9TVEFUVVNfU1RBVFNfT0ZMV19BVFROICAgICAgICAgICBCSVRfMgogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHNDdHJsOwotICAgICNkZWZpbmUgVDNfU05EX0RBVEFfSU5fU1RBVFNfQ1RSTF9FTkFCTEUgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFQzX1NORF9EQVRBX0lOX1NUQVRTX0NUUkxfRkFTVEVSX1VQREFURSAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBUM19TTkRfREFUQV9JTl9TVEFUU19DVFJMX0NMRUFSICAgICAgICAgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgVDNfU05EX0RBVEFfSU5fU1RBVFNfQ1RSTF9GTFVTSCAgICAgICAgICAgICAgICAgQklUXzMKLSAgICAjZGVmaW5lIFQzX1NORF9EQVRBX0lOX1NUQVRTX0NUUkxfRk9SQ0VfWkVSTyAgICAgICAgICAgIEJJVF80CisJVDNfMzJCSVRfUkVHSVNURVIgU3RhdHNDdHJsOworI2RlZmluZSBUM19TTkRfREFUQV9JTl9TVEFUU19DVFJMX0VOQUJMRSAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBUM19TTkRfREFUQV9JTl9TVEFUU19DVFJMX0ZBU1RFUl9VUERBVEUgICAgICAgICBCSVRfMQorI2RlZmluZSBUM19TTkRfREFUQV9JTl9TVEFUU19DVFJMX0NMRUFSICAgICAgICAgICAgICAgICBCSVRfMgorI2RlZmluZSBUM19TTkRfREFUQV9JTl9TVEFUU19DVFJMX0ZMVVNIICAgICAgICAgICAgICAgICBCSVRfMworI2RlZmluZSBUM19TTkRfREFUQV9JTl9TVEFUU19DVFJMX0ZPUkNFX1pFUk8gICAgICAgICAgICBCSVRfNAogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHNFbmFibGVNYXNrOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXRzSW5jTWFzazsKKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0VuYWJsZU1hc2s7CisJVDNfMzJCSVRfUkVHSVNURVIgU3RhdHNJbmNNYXNrOwogCi0gICAgTE1fVUlOVDggUmVzZXJ2ZWRbMTA4XTsKKwlMTV9VSU5UOCBSZXNlcnZlZFsxMDhdOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgQ2xhc3NPZlNlcnZDbnRbMTZdOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYVJlYWRRRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFQcmlvcml0eVJlYWRRRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTZGNRRnVsbENudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBDbGFzc09mU2VydkNudFsxNl07CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hUmVhZFFGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIERtYVByaW9yaXR5UmVhZFFGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIFNkY1FGdWxsQ250OwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTmljUmluZ1NldFNlbmRQcm9kSWR4Q250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1c1VwZGF0ZWRDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgSW50ZXJydXB0c0NudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBBdm9pZEludGVycnVwdHNDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU2VuZFRocmVzaG9sZEhpdENudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBOaWNSaW5nU2V0U2VuZFByb2RJZHhDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzVXBkYXRlZENudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBJbnRlcnJ1cHRzQ250OworCVQzXzMyQklUX1JFR0lTVEVSIEF2b2lkSW50ZXJydXB0c0NudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBTZW5kVGhyZXNob2xkSGl0Q250OwogCi0gICAgLyogVW51c2VkIHNwYWNlLiAqLwotICAgIExNX1VJTlQ4IFVudXNlZFs4MDBdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWRbODAwXTsKIH0gVDNfU0VORF9EQVRBX0lOSVRJQVRPUiwgKlBUM19TRU5EX0RBVEFfSU5JVElBVE9SOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBTZW5kIGRhdGEgY29tcGxldGlvbiBjb250cm9sIHJlZ2lzdGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgU05EX0RBVEFfQ09NUF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFNORF9EQVRBX0NPTVBfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisJVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyNkZWZpbmUgU05EX0RBVEFfQ09NUF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgU05EX0RBVEFfQ09NUF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWRbMTAyMF07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZFsxMDIwXTsKIH0gVDNfU0VORF9EQVRBX0NPTVBMRVRJT04sICpQVDNfU0VORF9EQVRBX0NPTVBMRVRJT047CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFNlbmQgQkQgUmluZyBTZWxlY3RvciBDb250cm9sIFJlZ2lzdGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgU05EX0JEX1NFTF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFNORF9CRF9TRUxfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBTTkRfQkRfU0VMX01PREVfQVRUTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICBCSVRfMgorCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisjZGVmaW5lIFNORF9CRF9TRUxfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIFNORF9CRF9TRUxfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIFNORF9CRF9TRUxfTU9ERV9BVFROX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIEJJVF8yCiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7Ci0gICAgI2RlZmluZSBTTkRfQkRfU0VMX1NUQVRVU19FUlJPUl9BVFROICAgICAgICAgICAgICAgICAgICBCSVRfMgorCVQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKyNkZWZpbmUgU05EX0JEX1NFTF9TVEFUVVNfRVJST1JfQVRUTiAgICAgICAgICAgICAgICAgICAgQklUXzIKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIEh3RGlhZzsKKwlUM18zMkJJVF9SRUdJU1RFUiBId0RpYWc7CiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkMVs1Ml07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZDFbNTJdOwogCi0gICAgLyogU2VuZCBCRCBSaW5nIFNlbGVjdG9yIExvY2FsIE5JQyBTZW5kIEJEIENvbnN1bWVyIEluZGV4LiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE5pY1NlbmRCZFNlbENvbklkeFsxNl07CisJLyogU2VuZCBCRCBSaW5nIFNlbGVjdG9yIExvY2FsIE5JQyBTZW5kIEJEIENvbnN1bWVyIEluZGV4LiAqLworCVQzXzMyQklUX1JFR0lTVEVSIE5pY1NlbmRCZFNlbENvbklkeFsxNl07CiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkMls4OTZdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWQyWzg5Nl07CiB9IFQzX1NFTkRfQkRfU0VMRUNUT1IsICpQVDNfU0VORF9CRF9TRUxFQ1RPUjsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogU2VuZCBCRCBpbml0aWF0b3IgY29udHJvbCByZWdpc3RlcnMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKLSAgICAjZGVmaW5lIFNORF9CRF9JTl9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCi0gICAgI2RlZmluZSBTTkRfQkRfSU5fTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgU05EX0JEX0lOX01PREVfQVRUTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKwlUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworI2RlZmluZSBTTkRfQkRfSU5fTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBTTkRfQkRfSU5fTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBTTkRfQkRfSU5fTU9ERV9BVFROX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICBCSVRfMgogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOwotICAgICNkZWZpbmUgU05EX0JEX0lOX1NUQVRVU19FUlJPUl9BVFROICAgICAgICAgICAgICAgICAgICAgQklUXzIKKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisjZGVmaW5lIFNORF9CRF9JTl9TVEFUVVNfRVJST1JfQVRUTiAgICAgICAgICAgICAgICAgICAgIEJJVF8yCiAKLSAgICAvKiBTZW5kIEJEIGluaXRpYXRvciBsb2NhbCBOSUMgc2VuZCBCRCBwcm9kdWNlciBpbmRleC4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNTZW5kQmRJblByb2RJZHhbMTZdOworCS8qIFNlbmQgQkQgaW5pdGlhdG9yIGxvY2FsIE5JQyBzZW5kIEJEIHByb2R1Y2VyIGluZGV4LiAqLworCVQzXzMyQklUX1JFR0lTVEVSIE5pY1NlbmRCZEluUHJvZElkeFsxNl07CiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkMls5NTJdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWQyWzk1Ml07CiB9IFQzX1NFTkRfQkRfSU5JVElBVE9SLCAqUFQzX1NFTkRfQkRfSU5JVElBVE9SOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBTZW5kIEJEIENvbXBsZXRpb24gQ29udHJvbC4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgU05EX0JEX0NPTVBfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFNORF9CRF9DT01QX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBTTkRfQkRfQ09NUF9NT0RFX0FUVE5fRU5BQkxFICAgICAgICAgICAgICAgICAgICBCSVRfMgorCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisjZGVmaW5lIFNORF9CRF9DT01QX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIFNORF9CRF9DT01QX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIFNORF9CRF9DT01QX01PREVfQVRUTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgIEJJVF8yCiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkMlsxMDIwXTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkMlsxMDIwXTsKIH0gVDNfU0VORF9CRF9DT01QTEVUSU9OLCAqUFQzX1NFTkRfQkRfQ09NUExFVElPTjsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUmVjZWl2ZSBsaXN0IHBsYWNlbWVudCBjb250cm9sIHJlZ2lzdGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiBNb2RlLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7Ci0gICAgI2RlZmluZSBSQ1ZfTElTVF9QTE1UX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgUkNWX0xJU1RfUExNVF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIFJDVl9MSVNUX1BMTVRfTU9ERV9DTEFTUzBfQVRUTl9FTkFCTEUgICAgICAgICAgIEJJVF8yCi0gICAgI2RlZmluZSBSQ1ZfTElTVF9QTE1UX01PREVfTUFQUElOR19PT1JfQVRUTl9FTkFCTEUgICAgICBCSVRfMwotICAgICNkZWZpbmUgUkNWX0xJU1RfUExNVF9NT0RFX1NUQVRTX09GTE9XX0FUVE5fRU5BQkxFICAgICAgQklUXzQKKwkvKiBNb2RlLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisjZGVmaW5lIFJDVl9MSVNUX1BMTVRfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIFJDVl9MSVNUX1BMTVRfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIFJDVl9MSVNUX1BMTVRfTU9ERV9DTEFTUzBfQVRUTl9FTkFCTEUgICAgICAgICAgIEJJVF8yCisjZGVmaW5lIFJDVl9MSVNUX1BMTVRfTU9ERV9NQVBQSU5HX09PUl9BVFROX0VOQUJMRSAgICAgIEJJVF8zCisjZGVmaW5lIFJDVl9MSVNUX1BMTVRfTU9ERV9TVEFUU19PRkxPV19BVFROX0VOQUJMRSAgICAgIEJJVF80CiAKLSAgICAvKiBTdGF0dXMuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOwotICAgICNkZWZpbmUgUkNWX0xJU1RfUExNVF9TVEFUVVNfQ0xBU1MwX0FUVE4gICAgICAgICAgICAgICAgQklUXzIKLSAgICAjZGVmaW5lIFJDVl9MSVNUX1BMTVRfU1RBVFVTX01BUFBJTkdfQVRUTiAgICAgICAgICAgICAgIEJJVF8zCi0gICAgI2RlZmluZSBSQ1ZfTElTVF9QTE1UX1NUQVRVU19TVEFUU19PRkxPV19BVFROICAgICAgICAgICBCSVRfNAorCS8qIFN0YXR1cy4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisjZGVmaW5lIFJDVl9MSVNUX1BMTVRfU1RBVFVTX0NMQVNTMF9BVFROICAgICAgICAgICAgICAgIEJJVF8yCisjZGVmaW5lIFJDVl9MSVNUX1BMTVRfU1RBVFVTX01BUFBJTkdfQVRUTiAgICAgICAgICAgICAgIEJJVF8zCisjZGVmaW5lIFJDVl9MSVNUX1BMTVRfU1RBVFVTX1NUQVRTX09GTE9XX0FUVE4gICAgICAgICAgIEJJVF80CiAKLSAgICAvKiBSZWNlaXZlIHNlbGVjdG9yIGxpc3QgbG9jayByZWdpc3Rlci4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBMb2NrOwotICAgICNkZWZpbmUgUkNWX0xJU1RfU0VMX0xPQ0tfUkVRVUVTVF9NQVNLICAgICAgICAgICAgICAgICAgMHhmZmZmCi0gICAgI2RlZmluZSBSQ1ZfTElTVF9TRUxfTE9DS19HUkFOVF9NQVNLICAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisJLyogUmVjZWl2ZSBzZWxlY3RvciBsaXN0IGxvY2sgcmVnaXN0ZXIuICovCisJVDNfMzJCSVRfUkVHSVNURVIgTG9jazsKKyNkZWZpbmUgUkNWX0xJU1RfU0VMX0xPQ0tfUkVRVUVTVF9NQVNLICAgICAgICAgICAgICAgICAgMHhmZmZmCisjZGVmaW5lIFJDVl9MSVNUX1NFTF9MT0NLX0dSQU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKIAotICAgIC8qIFNlbGVjdG9yIG5vbi1lbXB0eSBiaXRzLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE5vbkVtcHR5Qml0czsKLSAgICAjZGVmaW5lIFJDVl9MSVNUX1NFTF9OT05fRU1QVFlfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorCS8qIFNlbGVjdG9yIG5vbi1lbXB0eSBiaXRzLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIE5vbkVtcHR5Qml0czsKKyNkZWZpbmUgUkNWX0xJU1RfU0VMX05PTl9FTVBUWV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCiAKLSAgICAvKiBSZWNlaXZlIGxpc3QgcGxhY2VtZW50IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgQ29uZmlnOworCS8qIFJlY2VpdmUgbGlzdCBwbGFjZW1lbnQgY29uZmlndXJhdGlvbiByZWdpc3Rlci4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBDb25maWc7CiAKLSAgICAvKiBSZWNlaXZlIExpc3QgUGxhY2VtZW50IHN0YXRpc3RpY3MgQ29udHJvbC4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0N0cmw7CisJLyogUmVjZWl2ZSBMaXN0IFBsYWNlbWVudCBzdGF0aXN0aWNzIENvbnRyb2wuICovCisJVDNfMzJCSVRfUkVHSVNURVIgU3RhdHNDdHJsOwogI2RlZmluZSBSQ1ZfTElTVF9TVEFUU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKICNkZWZpbmUgUkNWX0xJU1RfU1RBVFNfRkFTVF9VUERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCiAKLSAgICAvKiBSZWNlaXZlIExpc3QgUGxhY2VtZW50IHN0YXRpc3RpY3MgRW5hYmxlIE1hc2suICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHNFbmFibGVNYXNrOworCS8qIFJlY2VpdmUgTGlzdCBQbGFjZW1lbnQgc3RhdGlzdGljcyBFbmFibGUgTWFzay4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0VuYWJsZU1hc2s7CiAKLSAgICAvKiBSZWNlaXZlIExpc3QgUGxhY2VtZW50IHN0YXRpc3RpY3MgSW5jcmVtZW50IE1hc2suICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHNJbmNNYXNrOwotCi0gICAgLyogVW51c2VkIHNwYWNlLiAqLwotICAgIExNX1VJTlQ4IFVudXNlZDFbMjI0XTsKLQotICAgIHN0cnVjdCB7Ci0JVDNfMzJCSVRfUkVHSVNURVIgSGVhZDsKLQlUM18zMkJJVF9SRUdJU1RFUiBUYWlsOwotCVQzXzMyQklUX1JFR0lTVEVSIENvdW50OworCS8qIFJlY2VpdmUgTGlzdCBQbGFjZW1lbnQgc3RhdGlzdGljcyBJbmNyZW1lbnQgTWFzay4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0luY01hc2s7CiAKIAkvKiBVbnVzZWQgc3BhY2UuICovCi0JTE1fVUlOVDggVW51c2VkWzRdOwotICAgIH0gUmN2U2VsZWN0b3JMaXN0WzE2XTsKKwlMTV9VSU5UOCBVbnVzZWQxWzIyNF07CiAKLSAgICAvKiBMb2NhbCBzdGF0aXN0aWNzIGNvdW50ZXIuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgQ2xhc3NPZlNlcnZDbnRbMTZdOworCXN0cnVjdCB7CisJCVQzXzMyQklUX1JFR0lTVEVSIEhlYWQ7CisJCVQzXzMyQklUX1JFR0lTVEVSIFRhaWw7CisJCVQzXzMyQklUX1JFR0lTVEVSIENvdW50OwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgRHJvcER1ZVRvRmlsdGVyQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYVdyaXRlUUZ1bGxDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFByaW9yaXR5V3JpdGVRRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBOb01vcmVSZWNlaXZlQmRDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgSWZJbkRpc2NhcmRzQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIElmSW5FcnJvcnNDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2VGhyZXNob2xkSGl0Q250OworCQkvKiBVbnVzZWQgc3BhY2UuICovCisJCUxNX1VJTlQ4IFVudXNlZFs0XTsKKwl9IFJjdlNlbGVjdG9yTGlzdFsxNl07CiAKLSAgICAvKiBBbm90aGVyIHVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQyWzQyMF07CisJLyogTG9jYWwgc3RhdGlzdGljcyBjb3VudGVyLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIENsYXNzT2ZTZXJ2Q250WzE2XTsKKworCVQzXzMyQklUX1JFR0lTVEVSIERyb3BEdWVUb0ZpbHRlckNudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFXcml0ZVFGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIERtYUhpZ2hQcmlvcml0eVdyaXRlUUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgTm9Nb3JlUmVjZWl2ZUJkQ250OworCVQzXzMyQklUX1JFR0lTVEVSIElmSW5EaXNjYXJkc0NudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBJZkluRXJyb3JzQ250OworCVQzXzMyQklUX1JFR0lTVEVSIFJjdlRocmVzaG9sZEhpdENudDsKKworCS8qIEFub3RoZXIgdW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZDJbNDIwXTsKIH0gVDNfUkNWX0xJU1RfUExBQ0VNRU5ULCAqUFQzX1JDVl9MSVNUX1BMQUNFTUVOVDsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUmVjZWl2ZSBEYXRhIGFuZCBSZWNlaXZlIEJEIEluaXRpYXRvciBDb250cm9sLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8qIE1vZGUuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKLSAgICAjZGVmaW5lIFJDVl9EQVRBX0JEX0lOX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFJDVl9EQVRBX0JEX0lOX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIFJDVl9EQVRBX0JEX0lOX01PREVfSlVNQk9fQkRfTkVFREVEICAgICAgICAgQklUXzIKLSAgICAjZGVmaW5lIFJDVl9EQVRBX0JEX0lOX01PREVfRlJBTUVfVE9PX0JJRyAgICAgICAgICAgQklUXzMKLSAgICAjZGVmaW5lIFJDVl9EQVRBX0JEX0lOX01PREVfSU5WQUxJRF9SSU5HX1NJWkUgICAgICAgQklUXzQKKwkvKiBNb2RlLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisjZGVmaW5lIFJDVl9EQVRBX0JEX0lOX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBSQ1ZfREFUQV9CRF9JTl9NT0RFX0pVTUJPX0JEX05FRURFRCAgICAgICAgIEJJVF8yCisjZGVmaW5lIFJDVl9EQVRBX0JEX0lOX01PREVfRlJBTUVfVE9PX0JJRyAgICAgICAgICAgQklUXzMKKyNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fTU9ERV9JTlZBTElEX1JJTkdfU0laRSAgICAgICBCSVRfNAogCi0gICAgLyogU3RhdHVzLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKLSAgICAjZGVmaW5lIFJDVl9EQVRBX0JEX0lOX1NUQVRVU19KVU1CT19CRF9ORUVERUQgICAgICAgQklUXzIKLSAgICAjZGVmaW5lIFJDVl9EQVRBX0JEX0lOX1NUQVRVU19GUkFNRV9UT09fQklHICAgICAgICAgQklUXzMKLSAgICAjZGVmaW5lIFJDVl9EQVRBX0JEX0lOX1NUQVRVU19JTlZBTElEX1JJTkdfU0laRSAgICAgQklUXzQKKwkvKiBTdGF0dXMuICovCisJVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOworI2RlZmluZSBSQ1ZfREFUQV9CRF9JTl9TVEFUVVNfSlVNQk9fQkRfTkVFREVEICAgICAgIEJJVF8yCisjZGVmaW5lIFJDVl9EQVRBX0JEX0lOX1NUQVRVU19GUkFNRV9UT09fQklHICAgICAgICAgQklUXzMKKyNkZWZpbmUgUkNWX0RBVEFfQkRfSU5fU1RBVFVTX0lOVkFMSURfUklOR19TSVpFICAgICBCSVRfNAogCi0gICAgLyogU3BsaXQgZnJhbWUgbWluaXVtIHNpemUuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3BsaXRGcmFtZU1pblNpemU7CisJLyogU3BsaXQgZnJhbWUgbWluaXVtIHNpemUuICovCisJVDNfMzJCSVRfUkVHSVNURVIgU3BsaXRGcmFtZU1pblNpemU7CiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkMVsweDI0NDAtMHgyNDBjXTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkMVsweDI0NDAgLSAweDI0MGNdOwogCi0gICAgLyogUmVjZWl2ZSBSQ0JzLiAqLwotICAgIFQzX1JDQiBKdW1ib1JjdlJjYjsKLSAgICBUM19SQ0IgU3RkUmN2UmNiOwotICAgIFQzX1JDQiBNaW5pUmN2UmNiOworCS8qIFJlY2VpdmUgUkNCcy4gKi8KKwlUM19SQ0IgSnVtYm9SY3ZSY2I7CisJVDNfUkNCIFN0ZFJjdlJjYjsKKwlUM19SQ0IgTWluaVJjdlJjYjsKIAotICAgIC8qIFJlY2VpdmUgRGF0YSBhbmQgUmVjZWl2ZSBCRCBSaW5nIEluaXRpYXRvciBMb2NhbCBOSUMgUmVjZWl2ZSAqLwotICAgIC8qIEJEIENvbnN1bWJlciBJbmRleC4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNKdW1ib0NvbklkeDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNTdGRDb25JZHg7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTmljTWluaUNvbklkeDsKKwkvKiBSZWNlaXZlIERhdGEgYW5kIFJlY2VpdmUgQkQgUmluZyBJbml0aWF0b3IgTG9jYWwgTklDIFJlY2VpdmUgKi8KKwkvKiBCRCBDb25zdW1iZXIgSW5kZXguICovCisJVDNfMzJCSVRfUkVHSVNURVIgTmljSnVtYm9Db25JZHg7CisJVDNfMzJCSVRfUkVHSVNURVIgTmljU3RkQ29uSWR4OworCVQzXzMyQklUX1JFR0lTVEVSIE5pY01pbmlDb25JZHg7CiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkMls0XTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkMls0XTsKIAotICAgIC8qIFJlY2VpdmUgRGF0YSBhbmQgUmVjZWl2ZSBCRCBJbml0aWF0b3IgTG9jYWwgUmVjZWl2ZSBSZXR1cm4gUHJvZElkeC4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZEYXRhQmRQcm9kSWR4WzE2XTsKKwkvKiBSZWNlaXZlIERhdGEgYW5kIFJlY2VpdmUgQkQgSW5pdGlhdG9yIExvY2FsIFJlY2VpdmUgUmV0dXJuIFByb2RJZHguICovCisJVDNfMzJCSVRfUkVHSVNURVIgUmN2RGF0YUJkUHJvZElkeFsxNl07CiAKLSAgICAvKiBSZWNlaXZlIERhdGEgYW5kIFJlY2VpdmUgQkQgSW5pdGlhdG9yIEhhcmR3YXJlIERpYWdub3N0aWMuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgSHdEaWFnOworCS8qIFJlY2VpdmUgRGF0YSBhbmQgUmVjZWl2ZSBCRCBJbml0aWF0b3IgSGFyZHdhcmUgRGlhZ25vc3RpYy4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBId0RpYWc7CiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkM1s4MjhdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWQzWzgyOF07CiB9IFQzX1JDVl9EQVRBX0JEX0lOSVRJQVRPUiwgKlBUM19SQ1ZfREFUQV9CRF9JTklUSUFUT1I7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFJlY2VpdmUgRGF0YSBDb21wbGV0aW9uIENvbnRyb2wgUmVnaXN0ZXMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKLSAgICAjZGVmaW5lIFJDVl9EQVRBX0NPTVBfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCi0gICAgI2RlZmluZSBSQ1ZfREFUQV9DT01QX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgUkNWX0RBVEFfQ09NUF9NT0RFX0FUVE5fRU5BQkxFICAgICAgICAgICAgICAgICAgQklUXzIKKwlUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworI2RlZmluZSBSQ1ZfREFUQV9DT01QX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBSQ1ZfREFUQV9DT01QX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBSQ1ZfREFUQV9DT01QX01PREVfQVRUTl9FTkFCTEUgICAgICAgICAgICAgICAgICBCSVRfMgogCi0gICAgLyogVW51c2VkIHNwYWNlZC4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWRbMTAyMF07CisJLyogVW51c2VkIHNwYWNlZC4gKi8KKwlMTV9VSU5UOCBVbnVzZWRbMTAyMF07CiB9IFQzX1JDVl9EQVRBX0NPTVBMRVRJT04sICpQVDNfUkNWX0RBVEFfQ09NUExFVElPTjsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUmVjZWl2ZSBCRCBJbml0aWF0b3IgQ29udHJvbC4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgUkNWX0JEX0lOX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFJDVl9CRF9JTl9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBSQ1ZfQkRfSU5fTU9ERV9CRF9JTl9ESUFCTEVEX1JDQl9BVFROX0VOQUJMRSAgICBCSVRfMgorCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisjZGVmaW5lIFJDVl9CRF9JTl9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIFJDVl9CRF9JTl9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIFJDVl9CRF9JTl9NT0RFX0JEX0lOX0RJQUJMRURfUkNCX0FUVE5fRU5BQkxFICAgIEJJVF8yCiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7Ci0gICAgI2RlZmluZSBSQ1ZfQkRfSU5fU1RBVFVTX0JEX0lOX0RJQUJMRURfUkNCX0FUVE4gICAgICAgICBCSVRfMgorCVQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKyNkZWZpbmUgUkNWX0JEX0lOX1NUQVRVU19CRF9JTl9ESUFCTEVEX1JDQl9BVFROICAgICAgICAgQklUXzIKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIE5pY0p1bWJvUmN2UHJvZElkeDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNTdGRSY3ZQcm9kSWR4OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE5pY01pbmlSY3ZQcm9kSWR4OworCVQzXzMyQklUX1JFR0lTVEVSIE5pY0p1bWJvUmN2UHJvZElkeDsKKwlUM18zMkJJVF9SRUdJU1RFUiBOaWNTdGRSY3ZQcm9kSWR4OworCVQzXzMyQklUX1JFR0lTVEVSIE5pY01pbmlSY3ZQcm9kSWR4OwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWluaVJjdlRocmVzaG9sZDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGRSY3ZUaHJlc2hvbGQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgSnVtYm9SY3ZUaHJlc2hvbGQ7CisJVDNfMzJCSVRfUkVHSVNURVIgTWluaVJjdlRocmVzaG9sZDsKKwlUM18zMkJJVF9SRUdJU1RFUiBTdGRSY3ZUaHJlc2hvbGQ7CisJVDNfMzJCSVRfUkVHSVNURVIgSnVtYm9SY3ZUaHJlc2hvbGQ7CiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkWzk5Ml07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZFs5OTJdOwogfSBUM19SQ1ZfQkRfSU5JVElBVE9SLCAqUFQzX1JDVl9CRF9JTklUSUFUT1I7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFJlY2VpdmUgQkQgQ29tcGxldGlvbiBDb250cm9sIFJlZ2lzdGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgUkNWX0JEX0NPTVBfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFJDVl9CRF9DT01QX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBSQ1ZfQkRfQ09NUF9NT0RFX0FUVE5fRU5BQkxFICAgICAgICAgICAgICAgICAgICBCSVRfMgorCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisjZGVmaW5lIFJDVl9CRF9DT01QX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIFJDVl9CRF9DT01QX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIFJDVl9CRF9DT01QX01PREVfQVRUTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgIEJJVF8yCiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7Ci0gICAgI2RlZmluZSBSQ1ZfQkRfQ09NUF9TVEFUVVNfRVJST1JfQVRUTiAgICAgICAgICAgICAgICAgICBCSVRfMgorCVQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKyNkZWZpbmUgUkNWX0JEX0NPTVBfU1RBVFVTX0VSUk9SX0FUVE4gICAgICAgICAgICAgICAgICAgQklUXzIKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSICBOaWNKdW1ib1JjdkJkUHJvZElkeDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiAgTmljU3RkUmN2QmRQcm9kSWR4OwotICAgIFQzXzMyQklUX1JFR0lTVEVSICBOaWNNaW5pUmN2QmRQcm9kSWR4OworCVQzXzMyQklUX1JFR0lTVEVSIE5pY0p1bWJvUmN2QmRQcm9kSWR4OworCVQzXzMyQklUX1JFR0lTVEVSIE5pY1N0ZFJjdkJkUHJvZElkeDsKKwlUM18zMkJJVF9SRUdJU1RFUiBOaWNNaW5pUmN2QmRQcm9kSWR4OwogCi0gICAgLyogVW51c2VkIHNwYWNlLiAqLwotICAgIExNX1VJTlQ4IFVudXNlZFsxMDA0XTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkWzEwMDRdOwogfSBUM19SQ1ZfQkRfQ09NUExFVElPTiwgKlBUM19SQ1ZfQkRfQ09NUExFVElPTjsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUmVjZWl2ZSBsaXN0IHNlbGVjdG9yIGNvbnRyb2wgcmVnaXN0ZXIuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKLSAgICAjZGVmaW5lIFJDVl9MSVNUX1NFTF9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCi0gICAgI2RlZmluZSBSQ1ZfTElTVF9TRUxfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgUkNWX0xJU1RfU0VMX01PREVfQVRUTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgQklUXzIKKwlUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworI2RlZmluZSBSQ1ZfTElTVF9TRUxfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBSQ1ZfTElTVF9TRUxfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBSQ1ZfTElTVF9TRUxfTU9ERV9BVFROX0VOQUJMRSAgICAgICAgICAgICAgICAgICBCSVRfMgogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOwotICAgICNkZWZpbmUgUkNWX0xJU1RfU0VMX1NUQVRVU19FUlJPUl9BVFROICAgICAgICAgICAgICAgICAgQklUXzIKKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisjZGVmaW5lIFJDVl9MSVNUX1NFTF9TVEFUVVNfRVJST1JfQVRUTiAgICAgICAgICAgICAgICAgIEJJVF8yCiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkWzEwMTZdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWRbMTAxNl07CiB9IFQzX1JDVl9MSVNUX1NFTEVDVE9SLCAqUFQzX1JDVl9MSVNUX1NFTEVDVE9SOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBNYnVmIGNsdXN0ZXIgZnJlZSByZWdpc3RlcnMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwogI2RlZmluZSBNQlVGX0NMVVNURVJfRlJFRV9NT0RFX1JFU0VUICAgIEJJVF8wCiAjZGVmaW5lIE1CVUZfQ0xVU1RFUl9GUkVFX01PREVfRU5BQkxFICAgQklUXzEKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkWzEwMTZdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWRbMTAxNl07CiB9IFQzX01CVUZfQ0xVU1RFUl9GUkVFLCAqUFQzX01CVUZfQ0xVU1RFUl9GUkVFOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBIb3N0IGNvYWxlc2NpbmcgY29udHJvbCByZWdpc3RlcnMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyogTW9kZS4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9BVFROICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9OT1cgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMwotICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9GVUxMX1NUQVRVU19NT0RFICAgICAgICAgICAgICBCSVRfTk9ORQotICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV82NF9CWVRFX1NUQVRVU19NT0RFICAgICAgICAgICBCSVRfNwotICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV8zMl9CWVRFX1NUQVRVU19NT0RFICAgICAgICAgICBCSVRfOAotICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9DTEVBUl9USUNLU19PTl9SWF9CRF9FVkVOVCAgICBCSVRfOQotICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9DTEVBUl9USUNLU19PTl9UWF9CRF9FVkVOVCAgICBCSVRfMTAKLSAgICAjZGVmaW5lIEhPU1RfQ09BTEVTQ0VfTk9fSU5UX09OX0NPQUxFU0NFX05PV19NT0RFICAgQklUXzExCi0gICAgI2RlZmluZSBIT1NUX0NPQUxFU0NFX05PX0lOVF9PTl9GT1JDRV9ETUFEX01PREUgICAgIEJJVF8xMgorCS8qIE1vZGUuICovCisJVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyNkZWZpbmUgSE9TVF9DT0FMRVNDRV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBIT1NUX0NPQUxFU0NFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIEhPU1RfQ09BTEVTQ0VfQVRUTiAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKyNkZWZpbmUgSE9TVF9DT0FMRVNDRV9OT1cgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMworI2RlZmluZSBIT1NUX0NPQUxFU0NFX0ZVTExfU1RBVFVTX01PREUgICAgICAgICAgICAgIEJJVF9OT05FCisjZGVmaW5lIEhPU1RfQ09BTEVTQ0VfNjRfQllURV9TVEFUVVNfTU9ERSAgICAgICAgICAgQklUXzcKKyNkZWZpbmUgSE9TVF9DT0FMRVNDRV8zMl9CWVRFX1NUQVRVU19NT0RFICAgICAgICAgICBCSVRfOAorI2RlZmluZSBIT1NUX0NPQUxFU0NFX0NMRUFSX1RJQ0tTX09OX1JYX0JEX0VWRU5UICAgIEJJVF85CisjZGVmaW5lIEhPU1RfQ09BTEVTQ0VfQ0xFQVJfVElDS1NfT05fVFhfQkRfRVZFTlQgICAgQklUXzEwCisjZGVmaW5lIEhPU1RfQ09BTEVTQ0VfTk9fSU5UX09OX0NPQUxFU0NFX05PV19NT0RFICAgQklUXzExCisjZGVmaW5lIEhPU1RfQ09BTEVTQ0VfTk9fSU5UX09OX0ZPUkNFX0RNQURfTU9ERSAgICAgQklUXzEyCiAKLSAgICAvKiBTdGF0dXMuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOwotICAgICNkZWZpbmUgSE9TVF9DT0FMRVNDRV9FUlJPUl9BVFROICAgICAgICAgICAgICAgICAgICBCSVRfMgorCS8qIFN0YXR1cy4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisjZGVmaW5lIEhPU1RfQ09BTEVTQ0VfRVJST1JfQVRUTiAgICAgICAgICAgICAgICAgICAgQklUXzIKIAotICAgIC8qIFJlY2VpdmUgY29hbGVzY2luZyB0aWNrcy4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSeENvYWxlc2NpbmdUaWNrczsKKwkvKiBSZWNlaXZlIGNvYWxlc2NpbmcgdGlja3MuICovCisJVDNfMzJCSVRfUkVHSVNURVIgUnhDb2FsZXNjaW5nVGlja3M7CiAKLSAgICAvKiBTZW5kIGNvYWxlc2NpbmcgdGlja3MuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgVHhDb2FsZXNjaW5nVGlja3M7CisJLyogU2VuZCBjb2FsZXNjaW5nIHRpY2tzLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFR4Q29hbGVzY2luZ1RpY2tzOwogCi0gICAgLyogUmVjZWl2ZSBtYXggY29hbGVzY2VkIGZyYW1lcy4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSeE1heENvYWxlc2NlZEZyYW1lczsKKwkvKiBSZWNlaXZlIG1heCBjb2FsZXNjZWQgZnJhbWVzLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFJ4TWF4Q29hbGVzY2VkRnJhbWVzOwogCi0gICAgLyogU2VuZCBtYXggY29hbGVzY2VkIGZyYW1lcy4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBUeE1heENvYWxlc2NlZEZyYW1lczsKKwkvKiBTZW5kIG1heCBjb2FsZXNjZWQgZnJhbWVzLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFR4TWF4Q29hbGVzY2VkRnJhbWVzOwogCi0gICAgLyogUmVjZWl2ZSBjb2FsZXNjaW5nIHRpY2tzIGR1cmluZyBpbnRlcnJ1cHQuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgUnhDb2FsZXNjZWRUaWNrRHVyaW5nSW50OworCS8qIFJlY2VpdmUgY29hbGVzY2luZyB0aWNrcyBkdXJpbmcgaW50ZXJydXB0LiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFJ4Q29hbGVzY2VkVGlja0R1cmluZ0ludDsKIAotICAgIC8qIFNlbmQgY29hbGVzY2luZyB0aWNrcyBkdXJpbmcgaW50ZXJydXB0LiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4Q29hbGVzY2VkVGlja0R1cmluZ0ludDsKKwkvKiBTZW5kIGNvYWxlc2NpbmcgdGlja3MgZHVyaW5nIGludGVycnVwdC4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBUeENvYWxlc2NlZFRpY2tEdXJpbmdJbnQ7CiAKLSAgICAvKiBSZWNlaXZlIG1heCBjb2FsZXNjZWQgZnJhbWVzIGR1cmluZyBpbnRlcnJ1cHQuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgUnhNYXhDb2FsZXNjZWRGcmFtZXNEdXJpbmdJbnQ7CisJLyogUmVjZWl2ZSBtYXggY29hbGVzY2VkIGZyYW1lcyBkdXJpbmcgaW50ZXJydXB0LiAqLworCVQzXzMyQklUX1JFR0lTVEVSIFJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50OwogCi0gICAgLyogU2VuZCBtYXggY29hbGVzY2VkIGZyYW1lcyBkdXJpbmcgaW50ZXJydXB0LiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50OworCS8qIFNlbmQgbWF4IGNvYWxlc2NlZCBmcmFtZXMgZHVyaW5nIGludGVycnVwdC4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBUeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludDsKIAotICAgIC8qIFN0YXRpc3RpY3MgdGljay4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0NvYWxlc2NpbmdUaWNrczsKKwkvKiBTdGF0aXN0aWNzIHRpY2suICovCisJVDNfMzJCSVRfUkVHSVNURVIgU3RhdHNDb2FsZXNjaW5nVGlja3M7CiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkMls0XTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkMls0XTsKIAotICAgIC8qIFN0YXRpc3RpY3MgaG9zdCBhZGRyZXNzLiAqLwotICAgIFQzXzY0QklUX1JFR0lTVEVSIFN0YXRzQmxrSG9zdEFkZHI7CisJLyogU3RhdGlzdGljcyBob3N0IGFkZHJlc3MuICovCisJVDNfNjRCSVRfUkVHSVNURVIgU3RhdHNCbGtIb3N0QWRkcjsKIAotICAgIC8qIFN0YXR1cyBibG9jayBob3N0IGFkZHJlc3MuKi8KLSAgICBUM182NEJJVF9SRUdJU1RFUiBTdGF0dXNCbGtIb3N0QWRkcjsKKwkvKiBTdGF0dXMgYmxvY2sgaG9zdCBhZGRyZXNzLiAqLworCVQzXzY0QklUX1JFR0lTVEVSIFN0YXR1c0Jsa0hvc3RBZGRyOwogCi0gICAgLyogU3RhdGlzdGljcyBOSUMgYWRkcmVzcy4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0Jsa05pY0FkZHI7CisJLyogU3RhdGlzdGljcyBOSUMgYWRkcmVzcy4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0c0Jsa05pY0FkZHI7CiAKLSAgICAvKiBTdGF0dXN0IGJsb2NrIE5JQyBhZGRyZXNzLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1c0Jsa05pY0FkZHI7CisJLyogU3RhdHVzdCBibG9jayBOSUMgYWRkcmVzcy4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXNCbGtOaWNBZGRyOwogCi0gICAgLyogRmxvdyBhdHRlbnRpb24gcmVnaXN0ZXJzLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIEZsb3dBdHRuOworCS8qIEZsb3cgYXR0ZW50aW9uIHJlZ2lzdGVycy4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBGbG93QXR0bjsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQzWzRdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWQzWzRdOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTmljSnVtYm9SY3ZCZENvbklkeDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNTdGRSY3ZCZENvbklkeDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBOaWNNaW5pUmN2QmRDb25JZHg7CisJVDNfMzJCSVRfUkVHSVNURVIgTmljSnVtYm9SY3ZCZENvbklkeDsKKwlUM18zMkJJVF9SRUdJU1RFUiBOaWNTdGRSY3ZCZENvbklkeDsKKwlUM18zMkJJVF9SRUdJU1RFUiBOaWNNaW5pUmN2QmRDb25JZHg7CiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkNFszNl07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZDRbMzZdOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTmljUmV0UHJvZElkeFsxNl07Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTmljU25kQmRDb25JZHhbMTZdOworCVQzXzMyQklUX1JFR0lTVEVSIE5pY1JldFByb2RJZHhbMTZdOworCVQzXzMyQklUX1JFR0lTVEVSIE5pY1NuZEJkQ29uSWR4WzE2XTsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWQ1Wzc2OF07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZDVbNzY4XTsKIH0gVDNfSE9TVF9DT0FMRVNDSU5HLCAqUFQzX0hPU1RfQ09BTEVTQ0lORzsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogTWVtb3J5IGFyYml0ZXIgcmVnaXN0ZXJzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisJVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKICNkZWZpbmUgVDNfTUVNX0FSQklURVJfTU9ERV9SRVNFVCAgICAgICBCSVRfMAogI2RlZmluZSBUM19NRU1fQVJCSVRFUl9NT0RFX0VOQUJMRSAgICAgIEJJVF8xCiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisJVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgQXJiVHJhcEFkZHJMb3c7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgQXJiVHJhcEFkZHJIaWdoOworCVQzXzMyQklUX1JFR0lTVEVSIEFyYlRyYXBBZGRyTG93OworCVQzXzMyQklUX1JFR0lTVEVSIEFyYlRyYXBBZGRySGlnaDsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWRbMTAwOF07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZFsxMDA4XTsKIH0gVDNfTUVNX0FSQklURVIsICpQVDNfTUVNX0FSQklURVI7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEJ1ZmZlciBtYW5hZ2VyIGNvbnRyb2wgcmVnaXN0ZXIuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKLSAgICAjZGVmaW5lIEJVRk1HUl9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIEJVRk1HUl9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIEJVRk1HUl9NT0RFX0FUVE5fRU5BQkxFICAgICAgICAgICAgICAgICAgICAgQklUXzIKLSAgICAjZGVmaW5lIEJVRk1HUl9NT0RFX0JNX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzMKLSAgICAjZGVmaW5lIEJVRk1HUl9NT0RFX01CVUZfTE9XX0FUVE5fRU5BQkxFICAgICAgICAgICAgQklUXzQKKwlUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworI2RlZmluZSBCVUZNR1JfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIEJVRk1HUl9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgQlVGTUdSX01PREVfQVRUTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICBCSVRfMgorI2RlZmluZSBCVUZNR1JfTU9ERV9CTV9URVNUICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8zCisjZGVmaW5lIEJVRk1HUl9NT0RFX01CVUZfTE9XX0FUVE5fRU5BQkxFICAgICAgICAgICAgQklUXzQKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKLSAgICAjZGVmaW5lIEJVRk1HUl9TVEFUVVNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIKLSAgICAjZGVmaW5lIEJVRk1HUl9TVEFUVVNfTUJVRl9MT1cgICAgICAgICAgICAgICAgICAgICAgQklUXzQKKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisjZGVmaW5lIEJVRk1HUl9TVEFUVVNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIKKyNkZWZpbmUgQlVGTUdSX1NUQVRVU19NQlVGX0xPVyAgICAgICAgICAgICAgICAgICAgICBCSVRfNAogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWJ1ZlBvb2xBZGRyOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1idWZQb29sU2l6ZTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNYnVmUmVhZERtYUxvd1dhdGVyTWFyazsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNYnVmTWFjUnhMb3dXYXRlck1hcms7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWJ1ZkhpZ2hXYXRlck1hcms7CisJVDNfMzJCSVRfUkVHSVNURVIgTWJ1ZlBvb2xBZGRyOworCVQzXzMyQklUX1JFR0lTVEVSIE1idWZQb29sU2l6ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBNYnVmUmVhZERtYUxvd1dhdGVyTWFyazsKKwlUM18zMkJJVF9SRUdJU1RFUiBNYnVmTWFjUnhMb3dXYXRlck1hcms7CisJVDNfMzJCSVRfUkVHSVNURVIgTWJ1ZkhpZ2hXYXRlck1hcms7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSeENwdU1idWZBbGxvY1JlcTsKLSAgICAjZGVmaW5lIEJVRk1HUl9NQlVGX0FMTE9DX0JJVCAgICAgICAgICAgICAgICAgICAgIEJJVF8zMQotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4Q3B1TWJ1ZkFsbG9jUmVzcDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBUeENwdU1idWZBbGxvY1JlcTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBUeENwdU1idWZBbGxvY1Jlc3A7CisJVDNfMzJCSVRfUkVHSVNURVIgUnhDcHVNYnVmQWxsb2NSZXE7CisjZGVmaW5lIEJVRk1HUl9NQlVGX0FMTE9DX0JJVCAgICAgICAgICAgICAgICAgICAgIEJJVF8zMQorCVQzXzMyQklUX1JFR0lTVEVSIFJ4Q3B1TWJ1ZkFsbG9jUmVzcDsKKwlUM18zMkJJVF9SRUdJU1RFUiBUeENwdU1idWZBbGxvY1JlcTsKKwlUM18zMkJJVF9SRUdJU1RFUiBUeENwdU1idWZBbGxvY1Jlc3A7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFEZXNjUG9vbEFkZHI7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hRGVzY1Bvb2xTaXplOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYUxvd1dhdGVyTWFyazsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoV2F0ZXJNYXJrOworCVQzXzMyQklUX1JFR0lTVEVSIERtYURlc2NQb29sQWRkcjsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFEZXNjUG9vbFNpemU7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hTG93V2F0ZXJNYXJrOworCVQzXzMyQklUX1JFR0lTVEVSIERtYUhpZ2hXYXRlck1hcms7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSeENwdURtYUFsbG9jUmVxOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4Q3B1RG1hQWxsb2NSZXNwOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4Q3B1RG1hQWxsb2NSZXE7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgVHhDcHVEbWFBbGxvY1Jlc3A7CisJVDNfMzJCSVRfUkVHSVNURVIgUnhDcHVEbWFBbGxvY1JlcTsKKwlUM18zMkJJVF9SRUdJU1RFUiBSeENwdURtYUFsbG9jUmVzcDsKKwlUM18zMkJJVF9SRUdJU1RFUiBUeENwdURtYUFsbG9jUmVxOworCVQzXzMyQklUX1JFR0lTVEVSIFR4Q3B1RG1hQWxsb2NSZXNwOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgSHdkaWFnWzNdOworCVQzXzMyQklUX1JFR0lTVEVSIEh3ZGlhZ1szXTsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWRbOTM2XTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkWzkzNl07CiB9IFQzX0JVRkZFUl9NQU5BR0VSLCAqUFQzX0JVRkZFUl9NQU5BR0VSOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBSZWFkIERNQSBjb250cm9sIHJlZ2lzdGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgRE1BX1JFQURfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgRE1BX1JFQURfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgRE1BX1JFQURfTU9ERV9UQVJHRVRfQUJPUlRfQVRUTl9FTkFCTEUgICAgICBCSVRfMgotICAgICNkZWZpbmUgRE1BX1JFQURfTU9ERV9NQVNURVJfQUJPUlRfQVRUTl9FTkFCTEUgICAgICBCSVRfMwotICAgICNkZWZpbmUgRE1BX1JFQURfTU9ERV9QQVJJVFlfRVJST1JfQVRUTl9FTkFCTEUgICAgICBCSVRfNAotICAgICNkZWZpbmUgRE1BX1JFQURfTU9ERV9BRERSX09WRVJGTE9XX0FUVE5fRU5BQkxFICAgICBCSVRfNQotICAgICNkZWZpbmUgRE1BX1JFQURfTU9ERV9GSUZPX09WRVJSVU5fQVRUTl9FTkFCTEUgICAgICBCSVRfNgotICAgICNkZWZpbmUgRE1BX1JFQURfTU9ERV9GSUZPX1VOREVSUlVOX0FUVE5fRU5BQkxFICAgICBCSVRfNwotICAgICNkZWZpbmUgRE1BX1JFQURfTU9ERV9GSUZPX09WRVJSRUFEX0FUVE5fRU5BQkxFICAgICBCSVRfOAotICAgICNkZWZpbmUgRE1BX1JFQURfTU9ERV9MT05HX1JFQURfQVRUTl9FTkFCTEUgICAgICAgICBCSVRfOQotICAgICNkZWZpbmUgRE1BX1JFQURfTU9ERV9TUExJVF9FTkFCTEUgICAgICAgICAgICAgICAgICBCSVRfMTEKLSAgICAjZGVmaW5lIERNQV9SRUFEX01PREVfU1BMSVRfUkVTRVQgICAgICAgICAgICAgICAgICAgQklUXzEyCisJVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKKyNkZWZpbmUgRE1BX1JFQURfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAorI2RlZmluZSBETUFfUkVBRF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xCisjZGVmaW5lIERNQV9SRUFEX01PREVfVEFSR0VUX0FCT1JUX0FUVE5fRU5BQkxFICAgICAgQklUXzIKKyNkZWZpbmUgRE1BX1JFQURfTU9ERV9NQVNURVJfQUJPUlRfQVRUTl9FTkFCTEUgICAgICBCSVRfMworI2RlZmluZSBETUFfUkVBRF9NT0RFX1BBUklUWV9FUlJPUl9BVFROX0VOQUJMRSAgICAgIEJJVF80CisjZGVmaW5lIERNQV9SRUFEX01PREVfQUREUl9PVkVSRkxPV19BVFROX0VOQUJMRSAgICAgQklUXzUKKyNkZWZpbmUgRE1BX1JFQURfTU9ERV9GSUZPX09WRVJSVU5fQVRUTl9FTkFCTEUgICAgICBCSVRfNgorI2RlZmluZSBETUFfUkVBRF9NT0RFX0ZJRk9fVU5ERVJSVU5fQVRUTl9FTkFCTEUgICAgIEJJVF83CisjZGVmaW5lIERNQV9SRUFEX01PREVfRklGT19PVkVSUkVBRF9BVFROX0VOQUJMRSAgICAgQklUXzgKKyNkZWZpbmUgRE1BX1JFQURfTU9ERV9MT05HX1JFQURfQVRUTl9FTkFCTEUgICAgICAgICBCSVRfOQorI2RlZmluZSBETUFfUkVBRF9NT0RFX1NQTElUX0VOQUJMRSAgICAgICAgICAgICAgICAgIEJJVF8xMQorI2RlZmluZSBETUFfUkVBRF9NT0RFX1NQTElUX1JFU0VUICAgICAgICAgICAgICAgICAgIEJJVF8xMgogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOwotICAgICNkZWZpbmUgRE1BX1JFQURfU1RBVFVTX1RBUkdFVF9BQk9SVF9BVFROICAgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgRE1BX1JFQURfU1RBVFVTX01BU1RFUl9BQk9SVF9BVFROICAgICAgICAgICBCSVRfMwotICAgICNkZWZpbmUgRE1BX1JFQURfU1RBVFVTX1BBUklUWV9FUlJPUl9BVFROICAgICAgICAgICBCSVRfNAotICAgICNkZWZpbmUgRE1BX1JFQURfU1RBVFVTX0FERFJfT1ZFUkZMT1dfQVRUTiAgICAgICAgICBCSVRfNQotICAgICNkZWZpbmUgRE1BX1JFQURfU1RBVFVTX0ZJRk9fT1ZFUlJVTl9BVFROICAgICAgICAgICBCSVRfNgotICAgICNkZWZpbmUgRE1BX1JFQURfU1RBVFVTX0ZJRk9fVU5ERVJSVU5fQVRUTiAgICAgICAgICBCSVRfNwotICAgICNkZWZpbmUgRE1BX1JFQURfU1RBVFVTX0ZJRk9fT1ZFUlJFQURfQVRUTiAgICAgICAgICBCSVRfOAotICAgICNkZWZpbmUgRE1BX1JFQURfU1RBVFVTX0xPTkdfUkVBRF9BVFROICAgICAgICAgICAgICBCSVRfOQorCVQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKKyNkZWZpbmUgRE1BX1JFQURfU1RBVFVTX1RBUkdFVF9BQk9SVF9BVFROICAgICAgICAgICBCSVRfMgorI2RlZmluZSBETUFfUkVBRF9TVEFUVVNfTUFTVEVSX0FCT1JUX0FUVE4gICAgICAgICAgIEJJVF8zCisjZGVmaW5lIERNQV9SRUFEX1NUQVRVU19QQVJJVFlfRVJST1JfQVRUTiAgICAgICAgICAgQklUXzQKKyNkZWZpbmUgRE1BX1JFQURfU1RBVFVTX0FERFJfT1ZFUkZMT1dfQVRUTiAgICAgICAgICBCSVRfNQorI2RlZmluZSBETUFfUkVBRF9TVEFUVVNfRklGT19PVkVSUlVOX0FUVE4gICAgICAgICAgIEJJVF82CisjZGVmaW5lIERNQV9SRUFEX1NUQVRVU19GSUZPX1VOREVSUlVOX0FUVE4gICAgICAgICAgQklUXzcKKyNkZWZpbmUgRE1BX1JFQURfU1RBVFVTX0ZJRk9fT1ZFUlJFQURfQVRUTiAgICAgICAgICBCSVRfOAorI2RlZmluZSBETUFfUkVBRF9TVEFUVVNfTE9OR19SRUFEX0FUVE4gICAgICAgICAgICAgIEJJVF85CiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkWzEwMTZdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWRbMTAxNl07CiB9IFQzX0RNQV9SRUFELCAqUFQzX0RNQV9SRUFEOwogCi10eXBlZGVmIHVuaW9uIFQzX0NQVQotewotICBzdHJ1Y3QKLSAgewotICAgIFQzXzMyQklUX1JFR0lTVEVSIG1vZGU7Ci0gICAgI2RlZmluZSBDUFVfTU9ERV9IQUxUICAgQklUXzEwCi0gICAgI2RlZmluZSBDUFVfTU9ERV9SRVNFVCAgQklUXzAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBzdGF0ZTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBFdmVudE1hc2s7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgcmVzZXJ2ZWQxWzRdOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFBDOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIEluc3RydWN0aW9uOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFNwYWRVbmRlcmZsb3c7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgV2F0Y2hkb2dDbGVhcjsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBXYXRjaGRvZ1ZlY3RvcjsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBXYXRjaGRvZ1NhdmVkUEM7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgSGFyZHdhcmVCcDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiByZXNlcnZlZDJbM107Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgV2F0Y2hkb2dTYXZlZFN0YXRlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIExhc3RCcmNoQWRkcjsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTcGFkVW5kZXJmbG93U2V0OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIHJlc2VydmVkM1soMHgyMDAtMHg1MCkvNF07Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmVnc1szMl07Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgcmVzZXJ2ZWQ0WygweDQwMC0weDI4MCkvNF07Ci0gIH1yZWc7Ci19VDNfQ1BVLCAqUFQzX0NQVTsKK3R5cGVkZWYgdW5pb24gVDNfQ1BVIHsKKwlzdHJ1Y3QgeworCQlUM18zMkJJVF9SRUdJU1RFUiBtb2RlOworI2RlZmluZSBDUFVfTU9ERV9IQUxUICAgQklUXzEwCisjZGVmaW5lIENQVV9NT0RFX1JFU0VUICBCSVRfMAorCQlUM18zMkJJVF9SRUdJU1RFUiBzdGF0ZTsKKwkJVDNfMzJCSVRfUkVHSVNURVIgRXZlbnRNYXNrOworCQlUM18zMkJJVF9SRUdJU1RFUiByZXNlcnZlZDFbNF07CisJCVQzXzMyQklUX1JFR0lTVEVSIFBDOworCQlUM18zMkJJVF9SRUdJU1RFUiBJbnN0cnVjdGlvbjsKKwkJVDNfMzJCSVRfUkVHSVNURVIgU3BhZFVuZGVyZmxvdzsKKwkJVDNfMzJCSVRfUkVHSVNURVIgV2F0Y2hkb2dDbGVhcjsKKwkJVDNfMzJCSVRfUkVHSVNURVIgV2F0Y2hkb2dWZWN0b3I7CisJCVQzXzMyQklUX1JFR0lTVEVSIFdhdGNoZG9nU2F2ZWRQQzsKKwkJVDNfMzJCSVRfUkVHSVNURVIgSGFyZHdhcmVCcDsKKwkJVDNfMzJCSVRfUkVHSVNURVIgcmVzZXJ2ZWQyWzNdOworCQlUM18zMkJJVF9SRUdJU1RFUiBXYXRjaGRvZ1NhdmVkU3RhdGU7CisJCVQzXzMyQklUX1JFR0lTVEVSIExhc3RCcmNoQWRkcjsKKwkJVDNfMzJCSVRfUkVHSVNURVIgU3BhZFVuZGVyZmxvd1NldDsKKwkJVDNfMzJCSVRfUkVHSVNURVIgcmVzZXJ2ZWQzWygweDIwMCAtIDB4NTApIC8gNF07CisJCVQzXzMyQklUX1JFR0lTVEVSIFJlZ3NbMzJdOworCQlUM18zMkJJVF9SRUdJU1RFUiByZXNlcnZlZDRbKDB4NDAwIC0gMHgyODApIC8gNF07CisJfSByZWc7Cit9IFQzX0NQVSwgKlBUM19DUFU7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBXcml0ZSBETUEgY29udHJvbCByZWdpc3RlcnMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKLSAgICAjZGVmaW5lIERNQV9XUklURV9NT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIERNQV9XUklURV9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIERNQV9XUklURV9NT0RFX1RBUkdFVF9BQk9SVF9BVFROX0VOQUJMRSAgICAgQklUXzIKLSAgICAjZGVmaW5lIERNQV9XUklURV9NT0RFX01BU1RFUl9BQk9SVF9BVFROX0VOQUJMRSAgICAgQklUXzMKLSAgICAjZGVmaW5lIERNQV9XUklURV9NT0RFX1BBUklUWV9FUlJPUl9BVFROX0VOQUJMRSAgICAgQklUXzQKLSAgICAjZGVmaW5lIERNQV9XUklURV9NT0RFX0FERFJfT1ZFUkZMT1dfQVRUTl9FTkFCTEUgICAgQklUXzUKLSAgICAjZGVmaW5lIERNQV9XUklURV9NT0RFX0ZJRk9fT1ZFUlJVTl9BVFROX0VOQUJMRSAgICAgQklUXzYKLSAgICAjZGVmaW5lIERNQV9XUklURV9NT0RFX0ZJRk9fVU5ERVJSVU5fQVRUTl9FTkFCTEUgICAgQklUXzcKLSAgICAjZGVmaW5lIERNQV9XUklURV9NT0RFX0ZJRk9fT1ZFUlJFQURfQVRUTl9FTkFCTEUgICAgQklUXzgKLSAgICAjZGVmaW5lIERNQV9XUklURV9NT0RFX0xPTkdfUkVBRF9BVFROX0VOQUJMRSAgICAgICAgQklUXzkKKwlUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworI2RlZmluZSBETUFfV1JJVEVfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIERNQV9XUklURV9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgRE1BX1dSSVRFX01PREVfVEFSR0VUX0FCT1JUX0FUVE5fRU5BQkxFICAgICBCSVRfMgorI2RlZmluZSBETUFfV1JJVEVfTU9ERV9NQVNURVJfQUJPUlRfQVRUTl9FTkFCTEUgICAgIEJJVF8zCisjZGVmaW5lIERNQV9XUklURV9NT0RFX1BBUklUWV9FUlJPUl9BVFROX0VOQUJMRSAgICAgQklUXzQKKyNkZWZpbmUgRE1BX1dSSVRFX01PREVfQUREUl9PVkVSRkxPV19BVFROX0VOQUJMRSAgICBCSVRfNQorI2RlZmluZSBETUFfV1JJVEVfTU9ERV9GSUZPX09WRVJSVU5fQVRUTl9FTkFCTEUgICAgIEJJVF82CisjZGVmaW5lIERNQV9XUklURV9NT0RFX0ZJRk9fVU5ERVJSVU5fQVRUTl9FTkFCTEUgICAgQklUXzcKKyNkZWZpbmUgRE1BX1dSSVRFX01PREVfRklGT19PVkVSUkVBRF9BVFROX0VOQUJMRSAgICBCSVRfOAorI2RlZmluZSBETUFfV1JJVEVfTU9ERV9MT05HX1JFQURfQVRUTl9FTkFCTEUgICAgICAgIEJJVF85CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7Ci0gICAgI2RlZmluZSBETUFfV1JJVEVfU1RBVFVTX1RBUkdFVF9BQk9SVF9BVFROICAgICAgICAgIEJJVF8yCi0gICAgI2RlZmluZSBETUFfV1JJVEVfU1RBVFVTX01BU1RFUl9BQk9SVF9BVFROICAgICAgICAgIEJJVF8zCi0gICAgI2RlZmluZSBETUFfV1JJVEVfU1RBVFVTX1BBUklUWV9FUlJPUl9BVFROICAgICAgICAgIEJJVF80Ci0gICAgI2RlZmluZSBETUFfV1JJVEVfU1RBVFVTX0FERFJfT1ZFUkZMT1dfQVRUTiAgICAgICAgIEJJVF81Ci0gICAgI2RlZmluZSBETUFfV1JJVEVfU1RBVFVTX0ZJRk9fT1ZFUlJVTl9BVFROICAgICAgICAgIEJJVF82Ci0gICAgI2RlZmluZSBETUFfV1JJVEVfU1RBVFVTX0ZJRk9fVU5ERVJSVU5fQVRUTiAgICAgICAgIEJJVF83Ci0gICAgI2RlZmluZSBETUFfV1JJVEVfU1RBVFVTX0ZJRk9fT1ZFUlJFQURfQVRUTiAgICAgICAgIEJJVF84Ci0gICAgI2RlZmluZSBETUFfV1JJVEVfU1RBVFVTX0xPTkdfUkVBRF9BVFROICAgICAgICAgICAgIEJJVF85CisJVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOworI2RlZmluZSBETUFfV1JJVEVfU1RBVFVTX1RBUkdFVF9BQk9SVF9BVFROICAgICAgICAgIEJJVF8yCisjZGVmaW5lIERNQV9XUklURV9TVEFUVVNfTUFTVEVSX0FCT1JUX0FUVE4gICAgICAgICAgQklUXzMKKyNkZWZpbmUgRE1BX1dSSVRFX1NUQVRVU19QQVJJVFlfRVJST1JfQVRUTiAgICAgICAgICBCSVRfNAorI2RlZmluZSBETUFfV1JJVEVfU1RBVFVTX0FERFJfT1ZFUkZMT1dfQVRUTiAgICAgICAgIEJJVF81CisjZGVmaW5lIERNQV9XUklURV9TVEFUVVNfRklGT19PVkVSUlVOX0FUVE4gICAgICAgICAgQklUXzYKKyNkZWZpbmUgRE1BX1dSSVRFX1NUQVRVU19GSUZPX1VOREVSUlVOX0FUVE4gICAgICAgICBCSVRfNworI2RlZmluZSBETUFfV1JJVEVfU1RBVFVTX0ZJRk9fT1ZFUlJFQURfQVRUTiAgICAgICAgIEJJVF84CisjZGVmaW5lIERNQV9XUklURV9TVEFUVVNfTE9OR19SRUFEX0FUVE4gICAgICAgICAgICAgQklUXzkKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWRbMTAxNl07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZFsxMDE2XTsKIH0gVDNfRE1BX1dSSVRFLCAqUFQzX0RNQV9XUklURTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogTWFpbGJveCByZWdpc3RlcnMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyogSW50ZXJydXB0IG1haWxib3ggcmVnaXN0ZXJzLiAqLwotICAgIFQzXzY0QklUX1JFR0lTVEVSIEludGVycnVwdFs0XTsKKwkvKiBJbnRlcnJ1cHQgbWFpbGJveCByZWdpc3RlcnMuICovCisJVDNfNjRCSVRfUkVHSVNURVIgSW50ZXJydXB0WzRdOwogCi0gICAgLyogR2VuZXJhbCBtYWlsYm94IHJlZ2lzdGVycy4gKi8KLSAgICBUM182NEJJVF9SRUdJU1RFUiBHZW5lcmFsWzhdOworCS8qIEdlbmVyYWwgbWFpbGJveCByZWdpc3RlcnMuICovCisJVDNfNjRCSVRfUkVHSVNURVIgR2VuZXJhbFs4XTsKIAotICAgIC8qIFJlbG9hZCBzdGF0aXN0aWNzIG1haWxib3guICovCi0gICAgVDNfNjRCSVRfUkVHSVNURVIgUmVsb2FkU3RhdDsKKwkvKiBSZWxvYWQgc3RhdGlzdGljcyBtYWlsYm94LiAqLworCVQzXzY0QklUX1JFR0lTVEVSIFJlbG9hZFN0YXQ7CiAKLSAgICAvKiBSZWNlaXZlIEJEIHJpbmcgcHJvZHVjZXIgaW5kZXggcmVnaXN0ZXJzLiAqLwotICAgIFQzXzY0QklUX1JFR0lTVEVSIFJjdlN0ZFByb2RJZHg7Ci0gICAgVDNfNjRCSVRfUkVHSVNURVIgUmN2SnVtYm9Qcm9kSWR4OwotICAgIFQzXzY0QklUX1JFR0lTVEVSIFJjdk1pbmlQcm9kSWR4OworCS8qIFJlY2VpdmUgQkQgcmluZyBwcm9kdWNlciBpbmRleCByZWdpc3RlcnMuICovCisJVDNfNjRCSVRfUkVHSVNURVIgUmN2U3RkUHJvZElkeDsKKwlUM182NEJJVF9SRUdJU1RFUiBSY3ZKdW1ib1Byb2RJZHg7CisJVDNfNjRCSVRfUkVHSVNURVIgUmN2TWluaVByb2RJZHg7CiAKLSAgICAvKiBSZWNlaXZlIHJldHVybiByaW5nIGNvbnN1bWVyIGluZGV4IHJlZ2lzdGVycy4gKi8KLSAgICBUM182NEJJVF9SRUdJU1RFUiBSY3ZSZXRDb25JZHhbMTZdOworCS8qIFJlY2VpdmUgcmV0dXJuIHJpbmcgY29uc3VtZXIgaW5kZXggcmVnaXN0ZXJzLiAqLworCVQzXzY0QklUX1JFR0lTVEVSIFJjdlJldENvbklkeFsxNl07CiAKLSAgICAvKiBTZW5kIEJEIHJpbmcgaG9zdCBwcm9kdWNlciBpbmRleCByZWdpc3RlcnMuICovCi0gICAgVDNfNjRCSVRfUkVHSVNURVIgU2VuZEhvc3RQcm9kSWR4WzE2XTsKKwkvKiBTZW5kIEJEIHJpbmcgaG9zdCBwcm9kdWNlciBpbmRleCByZWdpc3RlcnMuICovCisJVDNfNjRCSVRfUkVHSVNURVIgU2VuZEhvc3RQcm9kSWR4WzE2XTsKIAotICAgIC8qIFNlbmQgQkQgcmluZyBuaWMgcHJvZHVjZXIgaW5kZXggcmVnaXN0ZXJzLiAqLwotICAgIFQzXzY0QklUX1JFR0lTVEVSIFNlbmROaWNQcm9kSWR4WzE2XTsKLX1UM19NQUlMQk9YLCAqUFQzX01BSUxCT1g7CisJLyogU2VuZCBCRCByaW5nIG5pYyBwcm9kdWNlciBpbmRleCByZWdpc3RlcnMuICovCisJVDNfNjRCSVRfUkVHSVNURVIgU2VuZE5pY1Byb2RJZHhbMTZdOworfSBUM19NQUlMQk9YLCAqUFQzX01BSUxCT1g7CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM19NQUlMQk9YIE1haWxib3g7CisJVDNfTUFJTEJPWCBNYWlsYm94OwogCi0gICAgLyogUHJpb3JpdHkgbWFpbGJveCByZWdpc3RlcnMuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgSGlnaFByaW9yaXR5RXZlbnRWZWN0b3I7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgSGlnaFByaW9yaXR5RXZlbnRNYXNrOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIExvd1ByaW9yaXR5RXZlbnRWZWN0b3I7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgTG93UHJpb3JpdHlFdmVudE1hc2s7CisJLyogUHJpb3JpdHkgbWFpbGJveCByZWdpc3RlcnMuICovCisJVDNfMzJCSVRfUkVHSVNURVIgSGlnaFByaW9yaXR5RXZlbnRWZWN0b3I7CisJVDNfMzJCSVRfUkVHSVNURVIgSGlnaFByaW9yaXR5RXZlbnRNYXNrOworCVQzXzMyQklUX1JFR0lTVEVSIExvd1ByaW9yaXR5RXZlbnRWZWN0b3I7CisJVDNfMzJCSVRfUkVHSVNURVIgTG93UHJpb3JpdHlFdmVudE1hc2s7CiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkWzQ5Nl07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZFs0OTZdOwogfSBUM19HUkNfTUFJTEJPWCwgKlBUM19HUkNfTUFJTEJPWDsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRmxvdyB0aHJvdWdoIHF1ZXVlcy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSZXNldDsKKwlUM18zMkJJVF9SRUdJU1RFUiBSZXNldDsKIAotICAgIExNX1VJTlQ4IFVudXNlZFsxMl07CisJTE1fVUlOVDggVW51c2VkWzEyXTsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYU5vcm1hbFJlYWRGdHFDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYU5vcm1hbFJlYWRGdHFGdWxsQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYU5vcm1hbFJlYWRGdHFGaWZvRW5xdWV1ZURlcXVldWU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsUmVhZEZ0cUZpZm9Xcml0ZVBlZWs7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsUmVhZEZ0cUN0cmw7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsUmVhZEZ0cUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsUmVhZEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFOb3JtYWxSZWFkRnRxRmlmb1dyaXRlUGVlazsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYUhpZ2hSZWFkRnRxQ3RybDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoUmVhZEZ0cUZ1bGxDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFJlYWRGdHFGaWZvRW5xdWV1ZURlcXVldWU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFJlYWRGdHFGaWZvV3JpdGVQZWVrOworCVQzXzMyQklUX1JFR0lTVEVSIERtYUhpZ2hSZWFkRnRxQ3RybDsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoUmVhZEZ0cUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFJlYWRGdHFGaWZvRW5xdWV1ZURlcXVldWU7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFJlYWRGdHFGaWZvV3JpdGVQZWVrOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hQ29tcERpc2NhcmRGdHFDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYUNvbXBEaXNjYXJkRnRxRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFDb21wRGlzY2FyZEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFDb21wRGlzY2FyZEZ0cUZpZm9Xcml0ZVBlZWs7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hQ29tcERpc2NhcmRGdHFDdHJsOworCVQzXzMyQklUX1JFR0lTVEVSIERtYUNvbXBEaXNjYXJkRnRxRnVsbENudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFDb21wRGlzY2FyZEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFDb21wRGlzY2FyZEZ0cUZpZm9Xcml0ZVBlZWs7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kQmRDb21wRnRxQ3RybDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kQmRDb21wRnRxRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kQmRDb21wRnRxRmlmb0VucXVldWVEZXF1ZXVlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlbmRCZENvbXBGdHFGaWZvV3JpdGVQZWVrOworCVQzXzMyQklUX1JFR0lTVEVSIFNlbmRCZENvbXBGdHFDdHJsOworCVQzXzMyQklUX1JFR0lTVEVSIFNlbmRCZENvbXBGdHFGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIFNlbmRCZENvbXBGdHFGaWZvRW5xdWV1ZURlcXVldWU7CisJVDNfMzJCSVRfUkVHSVNURVIgU2VuZEJkQ29tcEZ0cUZpZm9Xcml0ZVBlZWs7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kRGF0YUluaXRpYXRvckZ0cUN0cmw7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU2VuZERhdGFJbml0aWF0b3JGdHFGdWxsQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlbmREYXRhSW5pdGlhdG9yRnRxRmlmb0VucXVldWVEZXF1ZXVlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlbmREYXRhSW5pdGlhdG9yRnRxRmlmb1dyaXRlUGVlazsKKwlUM18zMkJJVF9SRUdJU1RFUiBTZW5kRGF0YUluaXRpYXRvckZ0cUN0cmw7CisJVDNfMzJCSVRfUkVHSVNURVIgU2VuZERhdGFJbml0aWF0b3JGdHFGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIFNlbmREYXRhSW5pdGlhdG9yRnRxRmlmb0VucXVldWVEZXF1ZXVlOworCVQzXzMyQklUX1JFR0lTVEVSIFNlbmREYXRhSW5pdGlhdG9yRnRxRmlmb1dyaXRlUGVlazsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYU5vcm1hbFdyaXRlRnRxQ3RybDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFOb3JtYWxXcml0ZUZ0cUZ1bGxDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsV3JpdGVGdHFGaWZvRW5xdWV1ZURlcXVldWU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsV3JpdGVGdHFGaWZvV3JpdGVQZWVrOworCVQzXzMyQklUX1JFR0lTVEVSIERtYU5vcm1hbFdyaXRlRnRxQ3RybDsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFOb3JtYWxXcml0ZUZ0cUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsV3JpdGVGdHFGaWZvRW5xdWV1ZURlcXVldWU7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hTm9ybWFsV3JpdGVGdHFGaWZvV3JpdGVQZWVrOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFdyaXRlRnRxQ3RybDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoV3JpdGVGdHFGdWxsQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIERtYUhpZ2hXcml0ZUZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoV3JpdGVGdHFGaWZvV3JpdGVQZWVrOworCVQzXzMyQklUX1JFR0lTVEVSIERtYUhpZ2hXcml0ZUZ0cUN0cmw7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFdyaXRlRnRxRnVsbENudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBEbWFIaWdoV3JpdGVGdHFGaWZvRW5xdWV1ZURlcXVldWU7CisJVDNfMzJCSVRfUkVHSVNURVIgRG1hSGlnaFdyaXRlRnRxRmlmb1dyaXRlUGVlazsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN3VHlwZTFGdHFDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN3VHlwZTFGdHFGdWxsQ250OwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN3VHlwZTFGdHFGaWZvRW5xdWV1ZURlcXVldWU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMUZ0cUZpZm9Xcml0ZVBlZWs7CisJVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMUZ0cUN0cmw7CisJVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMUZ0cUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMUZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBTd1R5cGUxRnRxRmlmb1dyaXRlUGVlazsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlbmREYXRhQ29tcEZ0cUN0cmw7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU2VuZERhdGFDb21wRnRxRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTZW5kRGF0YUNvbXBGdHFGaWZvRW5xdWV1ZURlcXVldWU7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgU2VuZERhdGFDb21wRnRxRmlmb1dyaXRlUGVlazsKKwlUM18zMkJJVF9SRUdJU1RFUiBTZW5kRGF0YUNvbXBGdHFDdHJsOworCVQzXzMyQklUX1JFR0lTVEVSIFNlbmREYXRhQ29tcEZ0cUZ1bGxDbnQ7CisJVDNfMzJCSVRfUkVHSVNURVIgU2VuZERhdGFDb21wRnRxRmlmb0VucXVldWVEZXF1ZXVlOworCVQzXzMyQklUX1JFR0lTVEVSIFNlbmREYXRhQ29tcEZ0cUZpZm9Xcml0ZVBlZWs7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBIb3N0Q29hbGVzY2VGdHFDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIEhvc3RDb2FsZXNjZUZ0cUZ1bGxDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgSG9zdENvYWxlc2NlRnRxRmlmb0VucXVldWVEZXF1ZXVlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIEhvc3RDb2FsZXNjZUZ0cUZpZm9Xcml0ZVBlZWs7CisJVDNfMzJCSVRfUkVHSVNURVIgSG9zdENvYWxlc2NlRnRxQ3RybDsKKwlUM18zMkJJVF9SRUdJU1RFUiBIb3N0Q29hbGVzY2VGdHFGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIEhvc3RDb2FsZXNjZUZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBIb3N0Q29hbGVzY2VGdHFGaWZvV3JpdGVQZWVrOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTWFjVHhGdHFDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1hY1R4RnRxRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNYWNUeEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNYWNUeEZ0cUZpZm9Xcml0ZVBlZWs7CisJVDNfMzJCSVRfUkVHSVNURVIgTWFjVHhGdHFDdHJsOworCVQzXzMyQklUX1JFR0lTVEVSIE1hY1R4RnRxRnVsbENudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBNYWNUeEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBNYWNUeEZ0cUZpZm9Xcml0ZVBlZWs7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNYnVmQ2x1c3RGcmVlRnRxQ3RybDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNYnVmQ2x1c3RGcmVlRnRxRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNYnVmQ2x1c3RGcmVlRnRxRmlmb0VucXVldWVEZXF1ZXVlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1idWZDbHVzdEZyZWVGdHFGaWZvV3JpdGVQZWVrOworCVQzXzMyQklUX1JFR0lTVEVSIE1idWZDbHVzdEZyZWVGdHFDdHJsOworCVQzXzMyQklUX1JFR0lTVEVSIE1idWZDbHVzdEZyZWVGdHFGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIE1idWZDbHVzdEZyZWVGdHFGaWZvRW5xdWV1ZURlcXVldWU7CisJVDNfMzJCSVRfUkVHSVNURVIgTWJ1ZkNsdXN0RnJlZUZ0cUZpZm9Xcml0ZVBlZWs7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZCZENvbXBGdHFDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkJkQ29tcEZ0cUZ1bGxDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2QmRDb21wRnRxRmlmb0VucXVldWVEZXF1ZXVlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkJkQ29tcEZ0cUZpZm9Xcml0ZVBlZWs7CisJVDNfMzJCSVRfUkVHSVNURVIgUmN2QmRDb21wRnRxQ3RybDsKKwlUM18zMkJJVF9SRUdJU1RFUiBSY3ZCZENvbXBGdHFGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIFJjdkJkQ29tcEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBSY3ZCZENvbXBGdHFGaWZvV3JpdGVQZWVrOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2TGlzdFBsbXRGdHFDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkxpc3RQbG10RnRxRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZMaXN0UGxtdEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZMaXN0UGxtdEZ0cUZpZm9Xcml0ZVBlZWs7CisJVDNfMzJCSVRfUkVHSVNURVIgUmN2TGlzdFBsbXRGdHFDdHJsOworCVQzXzMyQklUX1JFR0lTVEVSIFJjdkxpc3RQbG10RnRxRnVsbENudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBSY3ZMaXN0UGxtdEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBSY3ZMaXN0UGxtdEZ0cUZpZm9Xcml0ZVBlZWs7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZEYXRhQmRJbml0aWF0b3JGdHFDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFCZEluaXRpYXRvckZ0cUZ1bGxDbnQ7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2RGF0YUJkSW5pdGlhdG9yRnRxRmlmb0VucXVldWVEZXF1ZXVlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFCZEluaXRpYXRvckZ0cUZpZm9Xcml0ZVBlZWs7CisJVDNfMzJCSVRfUkVHSVNURVIgUmN2RGF0YUJkSW5pdGlhdG9yRnRxQ3RybDsKKwlUM18zMkJJVF9SRUdJU1RFUiBSY3ZEYXRhQmRJbml0aWF0b3JGdHFGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFCZEluaXRpYXRvckZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBSY3ZEYXRhQmRJbml0aWF0b3JGdHFGaWZvV3JpdGVQZWVrOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgUmN2RGF0YUNvbXBGdHFDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFDb21wRnRxRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZEYXRhQ29tcEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSY3ZEYXRhQ29tcEZ0cUZpZm9Xcml0ZVBlZWs7CisJVDNfMzJCSVRfUkVHSVNURVIgUmN2RGF0YUNvbXBGdHFDdHJsOworCVQzXzMyQklUX1JFR0lTVEVSIFJjdkRhdGFDb21wRnRxRnVsbENudDsKKwlUM18zMkJJVF9SRUdJU1RFUiBSY3ZEYXRhQ29tcEZ0cUZpZm9FbnF1ZXVlRGVxdWV1ZTsKKwlUM18zMkJJVF9SRUdJU1RFUiBSY3ZEYXRhQ29tcEZ0cUZpZm9Xcml0ZVBlZWs7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTd1R5cGUyRnRxQ3RybDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTd1R5cGUyRnRxRnVsbENudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTd1R5cGUyRnRxRmlmb0VucXVldWVEZXF1ZXVlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFN3VHlwZTJGdHFGaWZvV3JpdGVQZWVrOworCVQzXzMyQklUX1JFR0lTVEVSIFN3VHlwZTJGdHFDdHJsOworCVQzXzMyQklUX1JFR0lTVEVSIFN3VHlwZTJGdHFGdWxsQ250OworCVQzXzMyQklUX1JFR0lTVEVSIFN3VHlwZTJGdHFGaWZvRW5xdWV1ZURlcXVldWU7CisJVDNfMzJCSVRfUkVHSVNURVIgU3dUeXBlMkZ0cUZpZm9Xcml0ZVBlZWs7CiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkMls3MzZdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWQyWzczNl07CiB9IFQzX0ZUUSwgKlBUM19GVFE7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIE1lc3NhZ2Ugc2lnbmFsZWQgaW50ZXJydXB0IHJlZ2lzdGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOworCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CiAjZGVmaW5lIE1TSV9NT0RFX1JFU0VUICAgICAgIEJJVF8wCiAjZGVmaW5lIE1TSV9NT0RFX0VOQUJMRSAgICAgIEJJVF8xCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOworCVQzXzMyQklUX1JFR0lTVEVSIFN0YXR1czsKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIE1zaUZpZm9BY2Nlc3M7CisJVDNfMzJCSVRfUkVHSVNURVIgTXNpRmlmb0FjY2VzczsKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWRbMTAxMl07CisJLyogVW51c2VkIHNwYWNlLiAqLworCUxNX1VJTlQ4IFVudXNlZFsxMDEyXTsKIH0gVDNfTVNHX1NJR05BTEVEX0lOVCwgKlBUM19NU0dfU0lHTkFMRURfSU5UOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBETUEgQ29tcGxldGlvbiByZWdpc3Rlcy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNb2RlOwotICAgICNkZWZpbmUgRE1BX0NPTVBfTU9ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgRE1BX0NPTVBfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisjZGVmaW5lIERNQV9DT01QX01PREVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgRE1BX0NPTVBfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQogCi0gICAgLyogVW51c2VkIHNwYWNlLiAqLwotICAgIExNX1VJTlQ4IFVudXNlZFsxMDIwXTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkWzEwMjBdOwogfSBUM19ETUFfQ09NUExFVElPTiwgKlBUM19ETUFfQ09NUExFVElPTjsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogR1JDIHJlZ2lzdGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiBNb2RlIGNvbnRyb2wgcmVnaXN0ZXIuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTW9kZTsKLSAgICAjZGVmaW5lIEdSQ19NT0RFX1VQREFURV9PTl9DT0FMRVNDSU5HICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIEdSQ19NT0RFX0JZVEVfU1dBUF9OT05fRlJBTUVfREFUQSAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIEdSQ19NT0RFX1dPUkRfU1dBUF9OT05fRlJBTUVfREFUQSAgICAgICAgICAgQklUXzIKLSAgICAjZGVmaW5lIEdSQ19NT0RFX0JZVEVfU1dBUF9EQVRBICAgICAgICAgICAgICAgICAgICAgQklUXzQKLSAgICAjZGVmaW5lIEdSQ19NT0RFX1dPUkRfU1dBUF9EQVRBICAgICAgICAgICAgICAgICAgICAgQklUXzUKLSAgICAjZGVmaW5lIEdSQ19NT0RFX1NQTElUX0hFQURFUl9NT0RFICAgICAgICAgICAgICAgICAgQklUXzgKLSAgICAjZGVmaW5lIEdSQ19NT0RFX05PX0ZSQU1FX0NSQUNLSU5HICAgICAgICAgICAgICAgICAgQklUXzkKLSAgICAjZGVmaW5lIEdSQ19NT0RFX0lOQ0xVREVfQ1JDICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEwCi0gICAgI2RlZmluZSBHUkNfTU9ERV9BTExPV19CQURfRlJBTUVTICAgICAgICAgICAgICAgICAgIEJJVF8xMQotICAgICNkZWZpbmUgR1JDX01PREVfTk9fSU5URVJSVVBUX09OX1NFTkRTICAgICAgICAgICAgICBCSVRfMTMKLSAgICAjZGVmaW5lIEdSQ19NT0RFX05PX0lOVEVSUlVQVF9PTl9SRUNFSVZFICAgICAgICAgICAgQklUXzE0Ci0gICAgI2RlZmluZSBHUkNfTU9ERV9GT1JDRV8zMkJJVF9QQ0lfQlVTX01PREUgICAgICAgICAgIEJJVF8xNQotICAgICNkZWZpbmUgR1JDX01PREVfSE9TVF9TVEFDS19VUCAgICAgICAgICAgICAgICAgICAgICBCSVRfMTYKLSAgICAjZGVmaW5lIEdSQ19NT0RFX0hPU1RfU0VORF9CRFMgICAgICAgICAgICAgICAgICAgICAgQklUXzE3Ci0gICAgI2RlZmluZSBHUkNfTU9ERV9UWF9OT19QU0VVRE9fSEVBREVSX0NIS1NVTSAgICAgICAgIEJJVF8yMAotICAgICNkZWZpbmUgR1JDX01PREVfUlhfTk9fUFNFVURPX0hFQURFUl9DSEtTVU0gICAgICAgICBCSVRfMjMKLSAgICAjZGVmaW5lIEdSQ19NT0RFX0lOVF9PTl9UWF9DUFVfQVRUTiAgICAgICAgICAgICAgICAgQklUXzI0Ci0gICAgI2RlZmluZSBHUkNfTU9ERV9JTlRfT05fUlhfQ1BVX0FUVE4gICAgICAgICAgICAgICAgIEJJVF8yNQotICAgICNkZWZpbmUgR1JDX01PREVfSU5UX09OX01BQ19BVFROICAgICAgICAgICAgICAgICAgICBCSVRfMjYKLSAgICAjZGVmaW5lIEdSQ19NT0RFX0lOVF9PTl9ETUFfQVRUTiAgICAgICAgICAgICAgICAgICAgQklUXzI3Ci0gICAgI2RlZmluZSBHUkNfTU9ERV9JTlRfT05fRkxPV19BVFROICAgICAgICAgICAgICAgICAgIEJJVF8yOAotICAgICNkZWZpbmUgR1JDX01PREVfNFhfTklDX0JBU0VEX1NFTkRfUklOR1MgICAgICAgICAgICBCSVRfMjkKLSAgICAjZGVmaW5lIEdSQ19NT0RFX01VTFRJQ0FTVF9GUkFNRV9FTkFCTEUgICAgICAgICAgICAgQklUXzMwCisJLyogTW9kZSBjb250cm9sIHJlZ2lzdGVyLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIE1vZGU7CisjZGVmaW5lIEdSQ19NT0RFX1VQREFURV9PTl9DT0FMRVNDSU5HICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgR1JDX01PREVfQllURV9TV0FQX05PTl9GUkFNRV9EQVRBICAgICAgICAgICBCSVRfMQorI2RlZmluZSBHUkNfTU9ERV9XT1JEX1NXQVBfTk9OX0ZSQU1FX0RBVEEgICAgICAgICAgIEJJVF8yCisjZGVmaW5lIEdSQ19NT0RFX0JZVEVfU1dBUF9EQVRBICAgICAgICAgICAgICAgICAgICAgQklUXzQKKyNkZWZpbmUgR1JDX01PREVfV09SRF9TV0FQX0RBVEEgICAgICAgICAgICAgICAgICAgICBCSVRfNQorI2RlZmluZSBHUkNfTU9ERV9TUExJVF9IRUFERVJfTU9ERSAgICAgICAgICAgICAgICAgIEJJVF84CisjZGVmaW5lIEdSQ19NT0RFX05PX0ZSQU1FX0NSQUNLSU5HICAgICAgICAgICAgICAgICAgQklUXzkKKyNkZWZpbmUgR1JDX01PREVfSU5DTFVERV9DUkMgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTAKKyNkZWZpbmUgR1JDX01PREVfQUxMT1dfQkFEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICBCSVRfMTEKKyNkZWZpbmUgR1JDX01PREVfTk9fSU5URVJSVVBUX09OX1NFTkRTICAgICAgICAgICAgICBCSVRfMTMKKyNkZWZpbmUgR1JDX01PREVfTk9fSU5URVJSVVBUX09OX1JFQ0VJVkUgICAgICAgICAgICBCSVRfMTQKKyNkZWZpbmUgR1JDX01PREVfRk9SQ0VfMzJCSVRfUENJX0JVU19NT0RFICAgICAgICAgICBCSVRfMTUKKyNkZWZpbmUgR1JDX01PREVfSE9TVF9TVEFDS19VUCAgICAgICAgICAgICAgICAgICAgICBCSVRfMTYKKyNkZWZpbmUgR1JDX01PREVfSE9TVF9TRU5EX0JEUyAgICAgICAgICAgICAgICAgICAgICBCSVRfMTcKKyNkZWZpbmUgR1JDX01PREVfVFhfTk9fUFNFVURPX0hFQURFUl9DSEtTVU0gICAgICAgICBCSVRfMjAKKyNkZWZpbmUgR1JDX01PREVfUlhfTk9fUFNFVURPX0hFQURFUl9DSEtTVU0gICAgICAgICBCSVRfMjMKKyNkZWZpbmUgR1JDX01PREVfSU5UX09OX1RYX0NQVV9BVFROICAgICAgICAgICAgICAgICBCSVRfMjQKKyNkZWZpbmUgR1JDX01PREVfSU5UX09OX1JYX0NQVV9BVFROICAgICAgICAgICAgICAgICBCSVRfMjUKKyNkZWZpbmUgR1JDX01PREVfSU5UX09OX01BQ19BVFROICAgICAgICAgICAgICAgICAgICBCSVRfMjYKKyNkZWZpbmUgR1JDX01PREVfSU5UX09OX0RNQV9BVFROICAgICAgICAgICAgICAgICAgICBCSVRfMjcKKyNkZWZpbmUgR1JDX01PREVfSU5UX09OX0ZMT1dfQVRUTiAgICAgICAgICAgICAgICAgICBCSVRfMjgKKyNkZWZpbmUgR1JDX01PREVfNFhfTklDX0JBU0VEX1NFTkRfUklOR1MgICAgICAgICAgICBCSVRfMjkKKyNkZWZpbmUgR1JDX01PREVfTVVMVElDQVNUX0ZSQU1FX0VOQUJMRSAgICAgICAgICAgICBCSVRfMzAKIAotICAgIC8qIE1pc2MgY29uZmlndXJhdGlvbiByZWdpc3Rlci4gKi8KLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNaXNjQ2ZnOwotICAgICNkZWZpbmUgR1JDX01JU0NfQ0ZHX0NPUkVfQ0xPQ0tfUkVTRVQgICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgR1JDX01JU0NfUFJFU0NBTEFSX1RJTUVSX01BU0sgICAgICAgICAgICAgICAweGZlCi0gICAgI2RlZmluZSBHUkNfTUlTQ19CRF9JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMWUwMDAKLSAgICAjZGVmaW5lIEdSQ19NSVNDX0JEX0lEXzU3MDAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxZTAwMAotICAgICNkZWZpbmUgR1JDX01JU0NfQkRfSURfNTcwMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0gICAgI2RlZmluZSBHUkNfTUlTQ19CRF9JRF81NzAzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSAgICAjZGVmaW5lIEdSQ19NSVNDX0JEX0lEXzU3MDNTICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAotICAgICNkZWZpbmUgR1JDX01JU0NfQkRfSURfNTcwMkZFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCi0gICAgI2RlZmluZSBHUkNfTUlTQ19CRF9JRF81NzA0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSAgICAjZGVmaW5lIEdSQ19NSVNDX0JEX0lEXzU3MDRDSU9CRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorCS8qIE1pc2MgY29uZmlndXJhdGlvbiByZWdpc3Rlci4gKi8KKwlUM18zMkJJVF9SRUdJU1RFUiBNaXNjQ2ZnOworI2RlZmluZSBHUkNfTUlTQ19DRkdfQ09SRV9DTE9DS19SRVNFVCAgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIEdSQ19NSVNDX1BSRVNDQUxBUl9USU1FUl9NQVNLICAgICAgICAgICAgICAgMHhmZQorI2RlZmluZSBHUkNfTUlTQ19CRF9JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMWUwMDAKKyNkZWZpbmUgR1JDX01JU0NfQkRfSURfNTcwMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDFlMDAwCisjZGVmaW5lIEdSQ19NSVNDX0JEX0lEXzU3MDEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBHUkNfTUlTQ19CRF9JRF81NzAzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgR1JDX01JU0NfQkRfSURfNTcwM1MgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEdSQ19NSVNDX0JEX0lEXzU3MDJGRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBHUkNfTUlTQ19CRF9JRF81NzA0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgR1JDX01JU0NfQkRfSURfNTcwNENJT0JFICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCiAKLSAgICAvKiBNaXNjZWxsYW5lb3VzIGxvY2FsIGNvbnRyb2wgcmVnaXN0ZXIuICovCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgTG9jYWxDdHJsOwotICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9JTlRfQUNUSVZFICAgICAgICAgICAgICBCSVRfMAotICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9DTEVBUl9JTlQgICAgICAgICAgICAgICBCSVRfMQotICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9TRVRfSU5UICAgICAgICAgICAgICAgICBCSVRfMgotICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9JTlRfT05fQVRUTiAgICAgICAgICAgICBCSVRfMwotICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX0lOUFVUMCAgICAgICAgICAgICBCSVRfOAotICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX0lOUFVUMSAgICAgICAgICAgICBCSVRfOQotICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX0lOUFVUMiAgICAgICAgICAgICBCSVRfMTAKLSAgICAjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PRTAgICAgICAgICAgICAgICAgQklUXzExCi0gICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UxICAgICAgICAgICAgICAgIEJJVF8xMgotICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09FMiAgICAgICAgICAgICAgICBCSVRfMTMKLSAgICAjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19PVVRQVVQwICAgICAgICAgICAgQklUXzE0Ci0gICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMSAgICAgICAgICAgIEJJVF8xNQotICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX09VVFBVVDIgICAgICAgICAgICBCSVRfMTYKLSAgICAjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfRU5BQkxFX0VYVF9NRU1PUlkgICAgICAgQklUXzE3Ci0gICAgI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0JBTktfU0VMRUNUICAgICAgICAgICAgIEJJVF8yMQotICAgICNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9TU1JBTV9UWVBFICAgICAgICAgICAgICBCSVRfMjIKKwkvKiBNaXNjZWxsYW5lb3VzIGxvY2FsIGNvbnRyb2wgcmVnaXN0ZXIuICovCisJVDNfMzJCSVRfUkVHSVNURVIgTG9jYWxDdHJsOworI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0lOVF9BQ1RJVkUgICAgICAgICAgICAgIEJJVF8wCisjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfQ0xFQVJfSU5UICAgICAgICAgICAgICAgQklUXzEKKyNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9TRVRfSU5UICAgICAgICAgICAgICAgICBCSVRfMgorI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0lOVF9PTl9BVFROICAgICAgICAgICAgIEJJVF8zCisjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfR1BJT19JTlBVVDAgICAgICAgICAgICAgQklUXzgKKyNkZWZpbmUgR1JDX01JU0NfTE9DQUxfQ1RSTF9HUElPX0lOUFVUMSAgICAgICAgICAgICBCSVRfOQorI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fSU5QVVQyICAgICAgICAgICAgIEJJVF8xMAorI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UwICAgICAgICAgICAgICAgIEJJVF8xMQorI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UxICAgICAgICAgICAgICAgIEJJVF8xMgorI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT0UyICAgICAgICAgICAgICAgIEJJVF8xMworI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMCAgICAgICAgICAgIEJJVF8xNAorI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMSAgICAgICAgICAgIEJJVF8xNQorI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0dQSU9fT1VUUFVUMiAgICAgICAgICAgIEJJVF8xNgorI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0VOQUJMRV9FWFRfTUVNT1JZICAgICAgIEJJVF8xNworI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0JBTktfU0VMRUNUICAgICAgICAgICAgIEJJVF8yMQorI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX1NTUkFNX1RZUEUgICAgICAgICAgICAgIEJJVF8yMgogCi0gICAgI2RlZmluZSBHUkNfTUlTQ19NRU1TSVpFXzI1NksgICAgIDAKLSAgICAjZGVmaW5lIEdSQ19NSVNDX01FTVNJWkVfNTEySyAgICAgKDEgPDwgMTgpCi0gICAgI2RlZmluZSBHUkNfTUlTQ19NRU1TSVpFXzEwMjRLICAgICgyIDw8IDE4KQotICAgICNkZWZpbmUgR1JDX01JU0NfTUVNU0laRV8yMDQ4SyAgICAoMyA8PCAxOCkKLSAgICAjZGVmaW5lIEdSQ19NSVNDX01FTVNJWkVfNDA5NksgICAgKDQgPDwgMTgpCi0gICAgI2RlZmluZSBHUkNfTUlTQ19NRU1TSVpFXzgxOTJLICAgICg1IDw8IDE4KQotICAgICNkZWZpbmUgR1JDX01JU0NfTUVNU0laRV8xNk0gICAgICAoNiA8PCAxOCkKLSAgICAjZGVmaW5lIEdSQ19NSVNDX0xPQ0FMX0NUUkxfQVVUT19TRUVQUk9NICAgICAgICAgICAgQklUXzI0CisjZGVmaW5lIEdSQ19NSVNDX01FTVNJWkVfMjU2SyAgICAgMAorI2RlZmluZSBHUkNfTUlTQ19NRU1TSVpFXzUxMksgICAgICgxIDw8IDE4KQorI2RlZmluZSBHUkNfTUlTQ19NRU1TSVpFXzEwMjRLICAgICgyIDw8IDE4KQorI2RlZmluZSBHUkNfTUlTQ19NRU1TSVpFXzIwNDhLICAgICgzIDw8IDE4KQorI2RlZmluZSBHUkNfTUlTQ19NRU1TSVpFXzQwOTZLICAgICg0IDw8IDE4KQorI2RlZmluZSBHUkNfTUlTQ19NRU1TSVpFXzgxOTJLICAgICg1IDw8IDE4KQorI2RlZmluZSBHUkNfTUlTQ19NRU1TSVpFXzE2TSAgICAgICg2IDw8IDE4KQorI2RlZmluZSBHUkNfTUlTQ19MT0NBTF9DVFJMX0FVVE9fU0VFUFJPTSAgICAgICAgICAgIEJJVF8yNAogCisJVDNfMzJCSVRfUkVHSVNURVIgVGltZXI7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBUaW1lcjsKKwlUM18zMkJJVF9SRUdJU1RFUiBSeENwdUV2ZW50OworCVQzXzMyQklUX1JFR0lTVEVSIFJ4VGltZXJSZWY7CisJVDNfMzJCSVRfUkVHSVNURVIgUnhDcHVTZW1hcGhvcmU7CisJVDNfMzJCSVRfUkVHSVNURVIgUmVtb3RlUnhDcHVBdHRuOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgUnhDcHVFdmVudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSeFRpbWVyUmVmOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJ4Q3B1U2VtYXBob3JlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJlbW90ZVJ4Q3B1QXR0bjsKKwlUM18zMkJJVF9SRUdJU1RFUiBUeENwdUV2ZW50OworCVQzXzMyQklUX1JFR0lTVEVSIFR4VGltZXJSZWY7CisJVDNfMzJCSVRfUkVHSVNURVIgVHhDcHVTZW1hcGhvcmU7CisJVDNfMzJCSVRfUkVHSVNURVIgUmVtb3RlVHhDcHVBdHRuOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgVHhDcHVFdmVudDsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBUeFRpbWVyUmVmOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFR4Q3B1U2VtYXBob3JlOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFJlbW90ZVR4Q3B1QXR0bjsKKwlUM182NEJJVF9SRUdJU1RFUiBNZW1vcnlQb3dlclVwOwogCi0gICAgVDNfNjRCSVRfUkVHSVNURVIgTWVtb3J5UG93ZXJVcDsKKwlUM18zMkJJVF9SRUdJU1RFUiBFZXByb21BZGRyOworI2RlZmluZSBTRUVQUk9NX0FERFJfV1JJVEUgICAgICAgMAorI2RlZmluZSBTRUVQUk9NX0FERFJfUkVBRCAgICAgICAgKDEgPDwgMzEpCisjZGVmaW5lIFNFRVBST01fQUREUl9SV19NQVNLICAgICAweDgwMDAwMDAwCisjZGVmaW5lIFNFRVBST01fQUREUl9DT01QTEVURSAgICAoMSA8PCAzMCkKKyNkZWZpbmUgU0VFUFJPTV9BRERSX0ZTTV9SRVNFVCAgICgxIDw8IDI5KQorI2RlZmluZSBTRUVQUk9NX0FERFJfREVWX0lEKHgpICAgKHggPDwgMjYpCisjZGVmaW5lIFNFRVBST01fQUREUl9ERVZfSURfTUFTSyAweDFjMDAwMDAwCisjZGVmaW5lIFNFRVBST01fQUREUl9TVEFSVCAgICAgICAoMSA8PCAyNSkKKyNkZWZpbmUgU0VFUFJPTV9BRERSX0NMS19QRVJEKHgpICh4IDw8IDE2KQorI2RlZmluZSBTRUVQUk9NX0FERFJfQUREUkVTUyh4KSAgKHggJiAweGZmZmMpCisjZGVmaW5lIFNFRVBST01fQUREUl9BRERSRVNTX01BU0sgMHgwMDAwZmZmZgogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgRWVwcm9tQWRkcjsKLSAgICAjZGVmaW5lIFNFRVBST01fQUREUl9XUklURSAgICAgICAwCi0gICAgI2RlZmluZSBTRUVQUk9NX0FERFJfUkVBRCAgICAgICAgKDEgPDwgMzEpCi0gICAgI2RlZmluZSBTRUVQUk9NX0FERFJfUldfTUFTSyAgICAgMHg4MDAwMDAwMAotICAgICNkZWZpbmUgU0VFUFJPTV9BRERSX0NPTVBMRVRFICAgICgxIDw8IDMwKQotICAgICNkZWZpbmUgU0VFUFJPTV9BRERSX0ZTTV9SRVNFVCAgICgxIDw8IDI5KQotICAgICNkZWZpbmUgU0VFUFJPTV9BRERSX0RFVl9JRCh4KSAgICh4IDw8IDI2KQotICAgICNkZWZpbmUgU0VFUFJPTV9BRERSX0RFVl9JRF9NQVNLIDB4MWMwMDAwMDAKLSAgICAjZGVmaW5lIFNFRVBST01fQUREUl9TVEFSVCAgICAgICAoMSA8PCAyNSkKLSAgICAjZGVmaW5lIFNFRVBST01fQUREUl9DTEtfUEVSRCh4KSAoeCA8PCAxNikKLSAgICAjZGVmaW5lIFNFRVBST01fQUREUl9BRERSRVNTKHgpICAoeCAmIDB4ZmZmYykKLSAgICAjZGVmaW5lIFNFRVBST01fQUREUl9BRERSRVNTX01BU0sgMHgwMDAwZmZmZgorI2RlZmluZSBTRUVQUk9NX0NMT0NLX1BFUklPRCAgICAgICAgNjAKKyNkZWZpbmUgU0VFUFJPTV9DSElQX1NJWkUgICAgICAgICAgICg2NCAqIDEwMjQpCiAKLSAgICAjZGVmaW5lIFNFRVBST01fQ0xPQ0tfUEVSSU9EICAgICAgICA2MAotICAgICNkZWZpbmUgU0VFUFJPTV9DSElQX1NJWkUgICAgICAgICAgICg2NCAqIDEwMjQpCisJVDNfMzJCSVRfUkVHSVNURVIgRWVwcm9tRGF0YTsKKwlUM18zMkJJVF9SRUdJU1RFUiBFZXByb21DdHJsOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgRWVwcm9tRGF0YTsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBFZXByb21DdHJsOworCVQzXzMyQklUX1JFR0lTVEVSIE1kaUN0cmw7CisJVDNfMzJCSVRfUkVHSVNURVIgU2Vwcm9tRGVsYXk7CiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBNZGlDdHJsOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFNlcHJvbURlbGF5OwotCi0gICAgLyogVW51c2VkIHNwYWNlLiAqLwotICAgIExNX1VJTlQ4IFVudXNlZFs5NDhdOworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWRbOTQ4XTsKIH0gVDNfR1JDLCAqUFQzX0dSQzsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogTlZSQU0gY29udHJvbCByZWdpc3RlcnMuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi10eXBlZGVmIHN0cnVjdAotewotICAgIFQzXzMyQklUX1JFR0lTVEVSIENtZDsKLSAgICAjZGVmaW5lIE5WUkFNX0NNRF9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIE5WUkFNX0NNRF9ET05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzMKLSAgICAjZGVmaW5lIE5WUkFNX0NNRF9ET19JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzQKLSAgICAjZGVmaW5lIE5WUkFNX0NNRF9XUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzUKLSAgICAjZGVmaW5lIE5WUkFNX0NNRF9SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUX05PTkUKLSAgICAjZGVmaW5lIE5WUkFNX0NNRF9FUkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzYKLSAgICAjZGVmaW5lIE5WUkFNX0NNRF9GSVJTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzcKLSAgICAjZGVmaW5lIE5WUkFNX0NNRF9MQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzgKK3R5cGVkZWYgc3RydWN0IHsKKwlUM18zMkJJVF9SRUdJU1RFUiBDbWQ7CisjZGVmaW5lIE5WUkFNX0NNRF9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgTlZSQU1fQ01EX0RPTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMworI2RlZmluZSBOVlJBTV9DTURfRE9fSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF80CisjZGVmaW5lIE5WUkFNX0NNRF9XUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzUKKyNkZWZpbmUgTlZSQU1fQ01EX1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfTk9ORQorI2RlZmluZSBOVlJBTV9DTURfRVJBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF82CisjZGVmaW5lIE5WUkFNX0NNRF9GSVJTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzcKKyNkZWZpbmUgTlZSQU1fQ01EX0xBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfOAogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgU3RhdHVzOwotICAgIFQzXzMyQklUX1JFR0lTVEVSIFdyaXRlRGF0YTsKKwlUM18zMkJJVF9SRUdJU1RFUiBTdGF0dXM7CisJVDNfMzJCSVRfUkVHSVNURVIgV3JpdGVEYXRhOwogCi0gICAgVDNfMzJCSVRfUkVHSVNURVIgQWRkcjsKLSAgICAjZGVmaW5lIE5WUkFNX0FERFJFU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmZmYKKwlUM18zMkJJVF9SRUdJU1RFUiBBZGRyOworI2RlZmluZSBOVlJBTV9BRERSRVNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmCiAKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBSZWFkRGF0YTsKKwlUM18zMkJJVF9SRUdJU1RFUiBSZWFkRGF0YTsKIAotICAgIC8qIEZsYXNoIGNvbmZpZyAxIHJlZ2lzdGVyLiAqLwotICAgIFQzXzMyQklUX1JFR0lTVEVSIENvbmZpZzE7Ci0gICAgI2RlZmluZSBGTEFTSF9JTlRFUkZBQ0VfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCi0gICAgI2RlZmluZSBGTEFTSF9TU1JBTV9CVUZGRVJSRURfTU9ERSAgICAgICAgICAgICAgICAgIEJJVF8xCi0gICAgI2RlZmluZSBGTEFTSF9QQVNTX1RIUlVfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yCi0gICAgI2RlZmluZSBGTEFTSF9CSVRfQkFOR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8zCi0gICAgI2RlZmluZSBGTEFTSF9DT01QQVRfQllQQVNTICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8zMQorCS8qIEZsYXNoIGNvbmZpZyAxIHJlZ2lzdGVyLiAqLworCVQzXzMyQklUX1JFR0lTVEVSIENvbmZpZzE7CisjZGVmaW5lIEZMQVNIX0lOVEVSRkFDRV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgRkxBU0hfU1NSQU1fQlVGRkVSUkVEX01PREUgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBGTEFTSF9QQVNTX1RIUlVfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yCisjZGVmaW5lIEZMQVNIX0JJVF9CQU5HX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzMKKyNkZWZpbmUgRkxBU0hfQ09NUEFUX0JZUEFTUyAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMzEKIAotICAgIC8qIEJ1ZmZlcmVkIGZsYXNoIChBdG1lbDogQVQ0NURCMDExQikgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KLSAgICAjZGVmaW5lIEJVRkZFUkVEX0ZMQVNIX1BBR0VfUE9TICAgICAgICAgOQotICAgICNkZWZpbmUgQlVGRkVSRURfRkxBU0hfQllURV9BRERSX01BU0sgICAoKDE8PEJVRkZFUkVEX0ZMQVNIX1BBR0VfUE9TKSAtIDEpCi0gICAgI2RlZmluZSBCVUZGRVJFRF9GTEFTSF9QQUdFX1NJWkUgICAgICAgIDI2NAotICAgICNkZWZpbmUgQlVGRkVSRURfRkxBU0hfUEhZX1BBR0VfU0laRSAgICA1MTIKKwkvKiBCdWZmZXJlZCBmbGFzaCAoQXRtZWw6IEFUNDVEQjAxMUIpIHNwZWNpZmljIGluZm9ybWF0aW9uICovCisjZGVmaW5lIEJVRkZFUkVEX0ZMQVNIX1BBR0VfUE9TICAgICAgICAgOQorI2RlZmluZSBCVUZGRVJFRF9GTEFTSF9CWVRFX0FERFJfTUFTSyAgICgoMTw8QlVGRkVSRURfRkxBU0hfUEFHRV9QT1MpIC0gMSkKKyNkZWZpbmUgQlVGRkVSRURfRkxBU0hfUEFHRV9TSVpFICAgICAgICAyNjQKKyNkZWZpbmUgQlVGRkVSRURfRkxBU0hfUEhZX1BBR0VfU0laRSAgICA1MTIKIAotICAgIFQzXzMyQklUX1JFR0lTVEVSIENvbmZpZzI7Ci0gICAgVDNfMzJCSVRfUkVHSVNURVIgQ29uZmlnMzsKLSAgICBUM18zMkJJVF9SRUdJU1RFUiBTd0FyYjsKLSAgICAjZGVmaW5lIFNXX0FSQl9SRVFfU0VUMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKLSAgICAjZGVmaW5lIFNXX0FSQl9SRVFfU0VUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKLSAgICAjZGVmaW5lIFNXX0FSQl9SRVFfU0VUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzIKLSAgICAjZGVmaW5lIFNXX0FSQl9SRVFfU0VUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzMKLSAgICAjZGVmaW5lIFNXX0FSQl9SRVFfQ0xSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzQKLSAgICAjZGVmaW5lIFNXX0FSQl9SRVFfQ0xSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzUKLSAgICAjZGVmaW5lIFNXX0FSQl9SRVFfQ0xSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzYKLSAgICAjZGVmaW5lIFNXX0FSQl9SRVFfQ0xSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzcKLSAgICAjZGVmaW5lIFNXX0FSQl9HTlQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzgKLSAgICAjZGVmaW5lIFNXX0FSQl9HTlQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzkKLSAgICAjZGVmaW5lIFNXX0FSQl9HTlQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEwCi0gICAgI2RlZmluZSBTV19BUkJfR05UMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xMQotICAgICNkZWZpbmUgU1dfQVJCX1JFUTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTIKLSAgICAjZGVmaW5lIFNXX0FSQl9SRVExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzEzCi0gICAgI2RlZmluZSBTV19BUkJfUkVRMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8xNAotICAgICNkZWZpbmUgU1dfQVJCX1JFUTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTUKKwlUM18zMkJJVF9SRUdJU1RFUiBDb25maWcyOworCVQzXzMyQklUX1JFR0lTVEVSIENvbmZpZzM7CisJVDNfMzJCSVRfUkVHSVNURVIgU3dBcmI7CisjZGVmaW5lIFNXX0FSQl9SRVFfU0VUMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgU1dfQVJCX1JFUV9TRVQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBTV19BUkJfUkVRX1NFVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yCisjZGVmaW5lIFNXX0FSQl9SRVFfU0VUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzMKKyNkZWZpbmUgU1dfQVJCX1JFUV9DTFIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNAorI2RlZmluZSBTV19BUkJfUkVRX0NMUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF81CisjZGVmaW5lIFNXX0FSQl9SRVFfQ0xSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzYKKyNkZWZpbmUgU1dfQVJCX1JFUV9DTFIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfNworI2RlZmluZSBTV19BUkJfR05UMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF84CisjZGVmaW5lIFNXX0FSQl9HTlQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzkKKyNkZWZpbmUgU1dfQVJCX0dOVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTAKKyNkZWZpbmUgU1dfQVJCX0dOVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTEKKyNkZWZpbmUgU1dfQVJCX1JFUTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTIKKyNkZWZpbmUgU1dfQVJCX1JFUTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTMKKyNkZWZpbmUgU1dfQVJCX1JFUTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTQKKyNkZWZpbmUgU1dfQVJCX1JFUTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMTUKIAotICAgIC8qIFVudXNlZCBzcGFjZS4gKi8KLSAgICBMTV9VSU5UOCBVbnVzZWRbOTg4XTsKKwkvKiBVbnVzZWQgc3BhY2UuICovCisJTE1fVUlOVDggVW51c2VkWzk4OF07CiB9IFQzX05WUkFNLCAqUFQzX05WUkFNOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBOSUMncyBpbnRlcm5hbCBtZW1vcnkuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyogUGFnZSB6ZXJvIGZvciB0aGUgaW50ZXJuYWwgQ1BVcy4gKi8KLSAgICBMTV9VSU5UOCBQYWdlWmVyb1sweDEwMF07ICAgICAgICAgICAgICAgLyogMHgwMDAwICovCisJLyogUGFnZSB6ZXJvIGZvciB0aGUgaW50ZXJuYWwgQ1BVcy4gKi8KKwlMTV9VSU5UOCBQYWdlWmVyb1sweDEwMF07CS8qIDB4MDAwMCAqLwogCi0gICAgLyogU2VuZCBSQ0JzLiAqLwotICAgIFQzX1JDQiBTZW5kUmNiWzE2XTsgICAgICAgICAgICAgICAgICAgICAvKiAweDAxMDAgKi8KKwkvKiBTZW5kIFJDQnMuICovCisJVDNfUkNCIFNlbmRSY2JbMTZdOwkvKiAweDAxMDAgKi8KIAotICAgIC8qIFJlY2VpdmUgUmV0dXJuIFJDQnMuICovCi0gICAgVDNfUkNCIFJjdlJldFJjYlsxNl07ICAgICAgICAgICAgICAgICAgIC8qIDB4MDIwMCAqLworCS8qIFJlY2VpdmUgUmV0dXJuIFJDQnMuICovCisJVDNfUkNCIFJjdlJldFJjYlsxNl07CS8qIDB4MDIwMCAqLwogCi0gICAgLyogU3RhdGlzdGljcyBibG9jay4gKi8KLSAgICBUM19TVEFUU19CTE9DSyBTdGF0c0JsazsgICAgICAgICAgICAgICAgLyogMHgwMzAwICovCisJLyogU3RhdGlzdGljcyBibG9jay4gKi8KKwlUM19TVEFUU19CTE9DSyBTdGF0c0JsazsJLyogMHgwMzAwICovCiAKLSAgICAvKiBTdGF0dXMgYmxvY2suICovCi0gICAgVDNfU1RBVFVTX0JMT0NLIFN0YXR1c0JsazsgICAgICAgICAgICAgIC8qIDB4MGIwMCAqLworCS8qIFN0YXR1cyBibG9jay4gKi8KKwlUM19TVEFUVVNfQkxPQ0sgU3RhdHVzQmxrOwkvKiAweDBiMDAgKi8KIAotICAgIC8qIFJlc2VydmVkIGZvciBzb2Z0d2FyZS4gKi8KLSAgICBMTV9VSU5UOCBSZXNlcnZlZFsxMjAwXTsgICAgICAgICAgICAgICAgLyogMHgwYjUwICovCisJLyogUmVzZXJ2ZWQgZm9yIHNvZnR3YXJlLiAqLworCUxNX1VJTlQ4IFJlc2VydmVkWzEyMDBdOwkvKiAweDBiNTAgKi8KIAotICAgIC8qIFVubWFwcGVkIHJlZ2lvbi4gKi8KLSAgICBMTV9VSU5UOCBVbm1hcHBlZFs0MDk2XTsgICAgICAgICAgICAgICAgLyogMHgxMDAwICovCisJLyogVW5tYXBwZWQgcmVnaW9uLiAqLworCUxNX1VJTlQ4IFVubWFwcGVkWzQwOTZdOwkvKiAweDEwMDAgKi8KIAotICAgIC8qIERNQSBkZXNjcmlwdG9ycy4gKi8KLSAgICBMTV9VSU5UOCBEbWFEZXNjWzgxOTJdOyAgICAgICAgICAgICAgICAgLyogMHgyMDAwICovCisJLyogRE1BIGRlc2NyaXB0b3JzLiAqLworCUxNX1VJTlQ4IERtYURlc2NbODE5Ml07CS8qIDB4MjAwMCAqLwogCi0gICAgLyogQnVmZmVyIGRlc2NyaXB0b3JzLiAqLwotICAgIExNX1VJTlQ4IEJ1ZmZlckRlc2NbMTYzODRdOyAgICAgICAgICAgICAvKiAweDQwMDAgKi8KKwkvKiBCdWZmZXIgZGVzY3JpcHRvcnMuICovCisJTE1fVUlOVDggQnVmZmVyRGVzY1sxNjM4NF07CS8qIDB4NDAwMCAqLwogfSBUM19GSVJTVF8zMktfU1JBTSwgKlBUM19GSVJTVF8zMktfU1JBTTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogTWVtb3J5IGxheW91dC4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuICovCi0gICAgVDNfUENJX0NPTkZJR1VSQVRJT04gUGNpQ2ZnOworCS8qIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4gKi8KKwlUM19QQ0lfQ09ORklHVVJBVElPTiBQY2lDZmc7CiAKLSAgICAvKiBVbnVzZWQuICovCi0gICAgTE1fVUlOVDggVW51c2VkMVsweDEwMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDEwMCAqLworCS8qIFVudXNlZC4gKi8KKwlMTV9VSU5UOCBVbnVzZWQxWzB4MTAwXTsJLyogMHgwMTAwICovCiAKLSAgICAvKiBNYWlsYm94IC4gKi8KLSAgICBUM19NQUlMQk9YIE1haWxib3g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMjAwICovCisJLyogTWFpbGJveCAuICovCisJVDNfTUFJTEJPWCBNYWlsYm94OwkvKiAweDAyMDAgKi8KIAotICAgIC8qIE1BQyBjb250cm9sIHJlZ2lzdGVycy4gKi8KLSAgICBUM19NQUNfQ09OVFJPTCBNYWNDdHJsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwNDAwICovCisJLyogTUFDIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworCVQzX01BQ19DT05UUk9MIE1hY0N0cmw7CS8qIDB4MDQwMCAqLwogCi0gICAgLyogU2VuZCBkYXRhIGluaXRpYXRvciBjb250cm9sIHJlZ2lzdGVycy4gKi8KLSAgICBUM19TRU5EX0RBVEFfSU5JVElBVE9SIFNuZERhdGFJbjsgICAgICAgICAgICAgICAgICAgLyogMHgwYzAwICovCisJLyogU2VuZCBkYXRhIGluaXRpYXRvciBjb250cm9sIHJlZ2lzdGVycy4gKi8KKwlUM19TRU5EX0RBVEFfSU5JVElBVE9SIFNuZERhdGFJbjsJLyogMHgwYzAwICovCiAKLSAgICAvKiBTZW5kIGRhdGEgY29tcGxldGlvbiBDb250cm9sIHJlZ2lzdGVycy4gKi8KLSAgICBUM19TRU5EX0RBVEFfQ09NUExFVElPTiBTbmREYXRhQ29tcDsgICAgICAgICAgICAgICAgLyogMHgxMDAwICovCisJLyogU2VuZCBkYXRhIGNvbXBsZXRpb24gQ29udHJvbCByZWdpc3RlcnMuICovCisJVDNfU0VORF9EQVRBX0NPTVBMRVRJT04gU25kRGF0YUNvbXA7CS8qIDB4MTAwMCAqLwogCi0gICAgLyogU2VuZCBCRCByaW5nIHNlbGVjdG9yLiAqLwotICAgIFQzX1NFTkRfQkRfU0VMRUNUT1IgU25kQmRTZWw7ICAgICAgICAgICAgICAgICAgICAgICAvKiAweDE0MDAgKi8KKwkvKiBTZW5kIEJEIHJpbmcgc2VsZWN0b3IuICovCisJVDNfU0VORF9CRF9TRUxFQ1RPUiBTbmRCZFNlbDsJLyogMHgxNDAwICovCiAKLSAgICAvKiBTZW5kIEJEIGluaXRpYXRvciBjb250cm9sIHJlZ2lzdGVycy4gKi8KLSAgICBUM19TRU5EX0JEX0lOSVRJQVRPUiBTbmRCZEluOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgxODAwICovCisJLyogU2VuZCBCRCBpbml0aWF0b3IgY29udHJvbCByZWdpc3RlcnMuICovCisJVDNfU0VORF9CRF9JTklUSUFUT1IgU25kQmRJbjsJLyogMHgxODAwICovCiAKLSAgICAvKiBTZW5kIEJEIGNvbXBsZXRpb24gY29udHJvbCByZWdpc3RlcnMuICovCi0gICAgVDNfU0VORF9CRF9DT01QTEVUSU9OIFNuZEJkQ29tcDsgICAgICAgICAgICAgICAgICAgIC8qIDB4MWMwMCAqLworCS8qIFNlbmQgQkQgY29tcGxldGlvbiBjb250cm9sIHJlZ2lzdGVycy4gKi8KKwlUM19TRU5EX0JEX0NPTVBMRVRJT04gU25kQmRDb21wOwkvKiAweDFjMDAgKi8KIAotICAgIC8qIFJlY2VpdmUgbGlzdCBwbGFjZW1lbnQgY29udHJvbCByZWdpc3RlcnMuICovCi0gICAgVDNfUkNWX0xJU1RfUExBQ0VNRU5UIFJjdkxpc3RQbG10OyAgICAgICAgICAgICAgICAgIC8qIDB4MjAwMCAqLworCS8qIFJlY2VpdmUgbGlzdCBwbGFjZW1lbnQgY29udHJvbCByZWdpc3RlcnMuICovCisJVDNfUkNWX0xJU1RfUExBQ0VNRU5UIFJjdkxpc3RQbG10OwkvKiAweDIwMDAgKi8KIAotICAgIC8qIFJlY2VpdmUgRGF0YSBhbmQgUmVjZWl2ZSBCRCBJbml0aWF0b3IgQ29udHJvbC4gKi8KLSAgICBUM19SQ1ZfREFUQV9CRF9JTklUSUFUT1IgUmN2RGF0YUJkSW47ICAgICAgICAgICAgICAgLyogMHgyNDAwICovCisJLyogUmVjZWl2ZSBEYXRhIGFuZCBSZWNlaXZlIEJEIEluaXRpYXRvciBDb250cm9sLiAqLworCVQzX1JDVl9EQVRBX0JEX0lOSVRJQVRPUiBSY3ZEYXRhQmRJbjsJLyogMHgyNDAwICovCiAKLSAgICAvKiBSZWNlaXZlIERhdGEgQ29tcGxldGlvbiBDb250cm9sICovCi0gICAgVDNfUkNWX0RBVEFfQ09NUExFVElPTiBSY3ZEYXRhQ29tcDsgICAgICAgICAgICAgICAgIC8qIDB4MjgwMCAqLworCS8qIFJlY2VpdmUgRGF0YSBDb21wbGV0aW9uIENvbnRyb2wgKi8KKwlUM19SQ1ZfREFUQV9DT01QTEVUSU9OIFJjdkRhdGFDb21wOwkvKiAweDI4MDAgKi8KIAotICAgIC8qIFJlY2VpdmUgQkQgSW5pdGlhdG9yIENvbnRyb2wgUmVnaXN0ZXJzLiAqLwotICAgIFQzX1JDVl9CRF9JTklUSUFUT1IgUmN2QmRJbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDJjMDAgKi8KKwkvKiBSZWNlaXZlIEJEIEluaXRpYXRvciBDb250cm9sIFJlZ2lzdGVycy4gKi8KKwlUM19SQ1ZfQkRfSU5JVElBVE9SIFJjdkJkSW47CS8qIDB4MmMwMCAqLwogCi0gICAgLyogUmVjZWl2ZSBCRCBDb21wbGV0aW9uIENvbnRyb2wgUmVnaXN0ZXJzLiAqLwotICAgIFQzX1JDVl9CRF9DT01QTEVUSU9OIFJjdkJkQ29tcDsgICAgICAgICAgICAgICAgICAgICAvKiAweDMwMDAgKi8KKwkvKiBSZWNlaXZlIEJEIENvbXBsZXRpb24gQ29udHJvbCBSZWdpc3RlcnMuICovCisJVDNfUkNWX0JEX0NPTVBMRVRJT04gUmN2QmRDb21wOwkvKiAweDMwMDAgKi8KIAotICAgIC8qIFJlY2VpdmUgbGlzdCBzZWxlY3RvciBjb250cm9sIHJlZ2lzdGVycy4gKi8KLSAgICBUM19SQ1ZfTElTVF9TRUxFQ1RPUiBSY3ZMaXN0U2VsOyAgICAgICAgICAgICAgICAgICAgLyogMHgzNDAwICovCisJLyogUmVjZWl2ZSBsaXN0IHNlbGVjdG9yIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworCVQzX1JDVl9MSVNUX1NFTEVDVE9SIFJjdkxpc3RTZWw7CS8qIDB4MzQwMCAqLwogCi0gICAgLyogTWJ1ZiBjbHVzdGVyIGZyZWUgcmVnaXN0ZXJzLiAqLwotICAgIFQzX01CVUZfQ0xVU1RFUl9GUkVFIE1idWZDbHVzdGVyRnJlZTsgICAgICAgICAgICAgICAvKiAweDM4MDAgKi8KKwkvKiBNYnVmIGNsdXN0ZXIgZnJlZSByZWdpc3RlcnMuICovCisJVDNfTUJVRl9DTFVTVEVSX0ZSRUUgTWJ1ZkNsdXN0ZXJGcmVlOwkvKiAweDM4MDAgKi8KIAotICAgIC8qIEhvc3QgY29hbGVzY2luZyBjb250cm9sIHJlZ2lzdGVycy4gKi8KLSAgICBUM19IT1NUX0NPQUxFU0NJTkcgSG9zdENvYWxlc2NlOyAgICAgICAgICAgICAgICAgICAgLyogMHgzYzAwICovCisJLyogSG9zdCBjb2FsZXNjaW5nIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworCVQzX0hPU1RfQ09BTEVTQ0lORyBIb3N0Q29hbGVzY2U7CS8qIDB4M2MwMCAqLwogCi0gICAgLyogTWVtb3J5IGFyYml0ZXIgY29udHJvbCByZWdpc3RlcnMuICovCi0gICAgVDNfTUVNX0FSQklURVIgTWVtQXJiaXRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NDAwMCAqLworCS8qIE1lbW9yeSBhcmJpdGVyIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworCVQzX01FTV9BUkJJVEVSIE1lbUFyYml0ZXI7CS8qIDB4NDAwMCAqLwogCi0gICAgLyogQnVmZmVyIG1hbmdlciBjb250cm9sIHJlZ2lzdGVycy4gKi8KLSAgICBUM19CVUZGRVJfTUFOQUdFUiBCdWZNZ3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg0NDAwICovCisJLyogQnVmZmVyIG1hbmdlciBjb250cm9sIHJlZ2lzdGVycy4gKi8KKwlUM19CVUZGRVJfTUFOQUdFUiBCdWZNZ3I7CS8qIDB4NDQwMCAqLwogCi0gICAgLyogUmVhZCBETUEgY29udHJvbCByZWdpc3RlcnMuICovCi0gICAgVDNfRE1BX1JFQUQgRG1hUmVhZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NDgwMCAqLworCS8qIFJlYWQgRE1BIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworCVQzX0RNQV9SRUFEIERtYVJlYWQ7CS8qIDB4NDgwMCAqLwogCi0gICAgLyogV3JpdGUgRE1BIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLwotICAgIFQzX0RNQV9XUklURSBEbWFXcml0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDRjMDAgKi8KKwkvKiBXcml0ZSBETUEgY29udHJvbCByZWdpc3RlcnMuICovCisJVDNfRE1BX1dSSVRFIERtYVdyaXRlOwkvKiAweDRjMDAgKi8KIAotICAgIFQzX0NQVSByeENwdTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDUwMDAgKi8KLSAgICBUM19DUFUgdHhDcHU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg1NDAwICovCisJVDNfQ1BVIHJ4Q3B1OwkJLyogMHg1MDAwICovCisJVDNfQ1BVIHR4Q3B1OwkJLyogMHg1NDAwICovCiAKLSAgICAvKiBNYWlsYm94ZXMuICovCi0gICAgVDNfR1JDX01BSUxCT1ggR3JjTWFpbGJveDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NTgwMCAqLworCS8qIE1haWxib3hlcy4gKi8KKwlUM19HUkNfTUFJTEJPWCBHcmNNYWlsYm94OwkvKiAweDU4MDAgKi8KIAotICAgIC8qIEZsb3cgVGhyb3VnaCBxdWV1ZXMuICovCi0gICAgVDNfRlRRIEZ0cTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NWMwMCAqLworCS8qIEZsb3cgVGhyb3VnaCBxdWV1ZXMuICovCisJVDNfRlRRIEZ0cTsJCS8qIDB4NWMwMCAqLwogCi0gICAgLyogTWVzc2FnZSBzaWduYWxlZCBpbnRlcnJ1cHQgcmVnaXN0ZXMuICovCi0gICAgVDNfTVNHX1NJR05BTEVEX0lOVCBNc2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NjAwMCAqLworCS8qIE1lc3NhZ2Ugc2lnbmFsZWQgaW50ZXJydXB0IHJlZ2lzdGVzLiAqLworCVQzX01TR19TSUdOQUxFRF9JTlQgTXNpOwkvKiAweDYwMDAgKi8KIAotICAgIC8qIERNQSBjb21wbGV0aW9uIHJlZ2lzdGVycy4gKi8KLSAgICBUM19ETUFfQ09NUExFVElPTiBEbWFDb21wOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg2NDAwICovCisJLyogRE1BIGNvbXBsZXRpb24gcmVnaXN0ZXJzLiAqLworCVQzX0RNQV9DT01QTEVUSU9OIERtYUNvbXA7CS8qIDB4NjQwMCAqLwogCi0gICAgLyogR1JDIHJlZ2lzdGVycy4gKi8KLSAgICBUM19HUkMgR3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg2ODAwICovCisJLyogR1JDIHJlZ2lzdGVycy4gKi8KKwlUM19HUkMgR3JjOwkJLyogMHg2ODAwICovCiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkMlsxMDI0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NmMwMCAqLworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWQyWzEwMjRdOwkvKiAweDZjMDAgKi8KIAotICAgIC8qIE5WUkFNIHJlZ2lzdGVycy4gKi8KLSAgICBUM19OVlJBTSBOdnJhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg3MDAwICovCisJLyogTlZSQU0gcmVnaXN0ZXJzLiAqLworCVQzX05WUkFNIE52cmFtOwkJLyogMHg3MDAwICovCiAKLSAgICAvKiBVbnVzZWQgc3BhY2UuICovCi0gICAgTE1fVUlOVDggVW51c2VkM1szMDcyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4NzQwMCAqLworCS8qIFVudXNlZCBzcGFjZS4gKi8KKwlMTV9VSU5UOCBVbnVzZWQzWzMwNzJdOwkvKiAweDc0MDAgKi8KIAotICAgIC8qIFRoZSAzMmsgbWVtb3J5IHdpbmRvdyBpbnRvIHRoZSBOSUMncyAqLwotICAgIC8qIGludGVybmFsIG1lbW9yeS4gIFRoZSBtZW1vcnkgd2luZG93IGlzICovCi0gICAgLyogY29udHJvbGxlZCBieSB0aGUgTWVtb3J5IFdpbmRvdyBCYXNlICovCi0gICAgLyogQWRkcmVzcyByZWdpc3Rlci4gIFRoaXMgcmVnaXN0ZXIgaXMgbG9jYXRlZCAqLwotICAgIC8qIGluIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZS4gKi8KLSAgICB1bmlvbiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg4MDAwICovCi0JVDNfRklSU1RfMzJLX1NSQU0gRmlyc3QzMms7CisJLyogVGhlIDMyayBtZW1vcnkgd2luZG93IGludG8gdGhlIE5JQydzICovCisJLyogaW50ZXJuYWwgbWVtb3J5LiAgVGhlIG1lbW9yeSB3aW5kb3cgaXMgKi8KKwkvKiBjb250cm9sbGVkIGJ5IHRoZSBNZW1vcnkgV2luZG93IEJhc2UgKi8KKwkvKiBBZGRyZXNzIHJlZ2lzdGVyLiAgVGhpcyByZWdpc3RlciBpcyBsb2NhdGVkICovCisJLyogaW4gdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlLiAqLworCXVuaW9uIHsJCQkvKiAweDgwMDAgKi8KKwkJVDNfRklSU1RfMzJLX1NSQU0gRmlyc3QzMms7CiAKLQkvKiBVc2UgdGhlIG1lbW9yeSB3aW5kb3cgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIHRvIGRldGVybWluZSB0aGUgKi8KLQkvKiBNQlVGIHNlZ21lbnQuICovCi0JTE1fVUlOVDMyIE1idWZbMzI3NjgvNF07Ci0JTE1fVUlOVDMyIE1lbUJsb2NrMzJLWzMyNzY4LzRdOwotICAgIH0gdUludE1lbTsKKwkJLyogVXNlIHRoZSBtZW1vcnkgd2luZG93IGJhc2UgYWRkcmVzcyByZWdpc3RlciB0byBkZXRlcm1pbmUgdGhlICovCisJCS8qIE1CVUYgc2VnbWVudC4gKi8KKwkJTE1fVUlOVDMyIE1idWZbMzI3NjggLyA0XTsKKwkJTE1fVUlOVDMyIE1lbUJsb2NrMzJLWzMyNzY4IC8gNF07CisJfSB1SW50TWVtOwogfSBUM19TVERfTUVNX01BUCwgKlBUM19TVERfTUVNX01BUDsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogQWRhcHRlciBpbmZvLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMTV9VSU5UMTYgU3ZpZDsKLSAgICBMTV9VSU5UMTYgU3NpZDsKLSAgICBMTV9VSU5UMzIgUGh5SWQ7Ci0gICAgTE1fVUlOVDMyIFNlcmRlczsgICAvKiAwID0gY29wcGVyIFBIWSwgMSA9IFNlcmRlcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUxNX1VJTlQxNiBTdmlkOworCUxNX1VJTlQxNiBTc2lkOworCUxNX1VJTlQzMiBQaHlJZDsKKwlMTV9VSU5UMzIgU2VyZGVzOwkvKiAwID0gY29wcGVyIFBIWSwgMSA9IFNlcmRlcyAqLwogfSBMTV9BREFQVEVSX0lORk8sICpQTE1fQURBUFRFUl9JTkZPOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBQYWNrZXQgcXVldWVzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotREVDTEFSRV9RVUVVRV9UWVBFKExNX1JYX1BBQ0tFVF9RLCBNQVhfUlhfUEFDS0VUX0RFU0NfQ09VTlQpOwotREVDTEFSRV9RVUVVRV9UWVBFKExNX1RYX1BBQ0tFVF9RLCBNQVhfVFhfUEFDS0VUX0RFU0NfQ09VTlQpOwotCitERUNMQVJFX1FVRVVFX1RZUEUgKExNX1JYX1BBQ0tFVF9RLCBNQVhfUlhfUEFDS0VUX0RFU0NfQ09VTlQpOworREVDTEFSRV9RVUVVRV9UWVBFIChMTV9UWF9QQUNLRVRfUSwgTUFYX1RYX1BBQ0tFVF9ERVNDX0NPVU5UKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFR4IGNvdW50ZXJzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIExNX0NPVU5URVIgVHhQYWNrZXRHb29kQ250OwotICAgIExNX0NPVU5URVIgVHhCeXRlc0dvb2RDbnQ7Ci0gICAgTE1fQ09VTlRFUiBUeFBhY2tldEFib3J0ZWRDbnQ7Ci0gICAgTE1fQ09VTlRFUiBOb1NlbmRCZExlZnRDbnQ7Ci0gICAgTE1fQ09VTlRFUiBOb01hcFJlZ2lzdGVyTGVmdENudDsKLSAgICBMTV9DT1VOVEVSIFRvb01hbnlGcmFnbWVudHNDbnQ7Ci0gICAgTE1fQ09VTlRFUiBOb1R4UGFja2V0RGVzY0NudDsKKwlMTV9DT1VOVEVSIFR4UGFja2V0R29vZENudDsKKwlMTV9DT1VOVEVSIFR4Qnl0ZXNHb29kQ250OworCUxNX0NPVU5URVIgVHhQYWNrZXRBYm9ydGVkQ250OworCUxNX0NPVU5URVIgTm9TZW5kQmRMZWZ0Q250OworCUxNX0NPVU5URVIgTm9NYXBSZWdpc3RlckxlZnRDbnQ7CisJTE1fQ09VTlRFUiBUb29NYW55RnJhZ21lbnRzQ250OworCUxNX0NPVU5URVIgTm9UeFBhY2tldERlc2NDbnQ7CiB9IExNX1RYX0NPVU5URVJTLCAqUExNX1RYX0NPVU5URVJTOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBSeCBjb3VudGVycy4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBMTV9DT1VOVEVSIFJ4UGFja2V0R29vZENudDsKLSAgICBMTV9DT1VOVEVSIFJ4Qnl0ZXNHb29kQ250OwotICAgIExNX0NPVU5URVIgUnhQYWNrZXRFcnJDbnQ7Ci0gICAgTE1fQ09VTlRFUiBSeEVyckNyY0NudDsKLSAgICBMTV9DT1VOVEVSIFJ4RXJyQ29sbENudDsKLSAgICBMTV9DT1VOVEVSIFJ4RXJyTGlua0xvc3RDbnQ7Ci0gICAgTE1fQ09VTlRFUiBSeEVyclBoeURlY29kZUNudDsKLSAgICBMTV9DT1VOVEVSIFJ4RXJyT2RkTmliYmxlQ250OwotICAgIExNX0NPVU5URVIgUnhFcnJNYWNBYm9ydENudDsKLSAgICBMTV9DT1VOVEVSIFJ4RXJyU2hvcnRQYWNrZXRDbnQ7Ci0gICAgTE1fQ09VTlRFUiBSeEVyck5vUmVzb3VyY2VDbnQ7Ci0gICAgTE1fQ09VTlRFUiBSeEVyckxhcmdlUGFja2V0Q250OworCUxNX0NPVU5URVIgUnhQYWNrZXRHb29kQ250OworCUxNX0NPVU5URVIgUnhCeXRlc0dvb2RDbnQ7CisJTE1fQ09VTlRFUiBSeFBhY2tldEVyckNudDsKKwlMTV9DT1VOVEVSIFJ4RXJyQ3JjQ250OworCUxNX0NPVU5URVIgUnhFcnJDb2xsQ250OworCUxNX0NPVU5URVIgUnhFcnJMaW5rTG9zdENudDsKKwlMTV9DT1VOVEVSIFJ4RXJyUGh5RGVjb2RlQ250OworCUxNX0NPVU5URVIgUnhFcnJPZGROaWJibGVDbnQ7CisJTE1fQ09VTlRFUiBSeEVyck1hY0Fib3J0Q250OworCUxNX0NPVU5URVIgUnhFcnJTaG9ydFBhY2tldENudDsKKwlMTV9DT1VOVEVSIFJ4RXJyTm9SZXNvdXJjZUNudDsKKwlMTV9DT1VOVEVSIFJ4RXJyTGFyZ2VQYWNrZXRDbnQ7CiB9IExNX1JYX0NPVU5URVJTLCAqUExNX1JYX0NPVU5URVJTOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBSZWNlaXZlIHByb2R1Y2VyIHJpbmdzLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBlbnVtIHsKLSAgICBUM19VTktOT1dOX1JDVl9QUk9EX1JJTkcgICAgPSAwLAotICAgIFQzX1NURF9SQ1ZfUFJPRF9SSU5HICAgICAgICA9IDEsCi0gICAgVDNfTUlOSV9SQ1ZfUFJPRF9SSU5HICAgICAgID0gMiwKLSAgICBUM19KVU1CT19SQ1ZfUFJPRF9SSU5HICAgICAgPSAzCisJVDNfVU5LTk9XTl9SQ1ZfUFJPRF9SSU5HID0gMCwKKwlUM19TVERfUkNWX1BST0RfUklORyA9IDEsCisJVDNfTUlOSV9SQ1ZfUFJPRF9SSU5HID0gMiwKKwlUM19KVU1CT19SQ1ZfUFJPRF9SSU5HID0gMwogfSBUM19SQ1ZfUFJPRF9SSU5HLCAqUFQzX1JDVl9QUk9EX1JJTkc7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFBhY2tldCBkZXNjcmlwdG9yLiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI3NTgsMzMxICsyNjc1LDMyOCBAQAogI2RlZmluZSBMTV9QQUNLRVRfU0lHTkFUVVJFX1JYICAgICAgICAgICAgICAweDZiNzY2MTY4CiAKIHR5cGVkZWYgc3RydWN0IF9MTV9QQUNLRVQgewotICAgIC8qIFNldCBpbiBMTS4gKi8KLSAgICBMTV9TVEFUVVMgUGFja2V0U3RhdHVzOworCS8qIFNldCBpbiBMTS4gKi8KKwlMTV9TVEFUVVMgUGFja2V0U3RhdHVzOwogCi0gICAgLyogU2V0IGluIExNIGZvciBSeCwgaW4gVU0gZm9yIFR4LiAqLwotICAgIExNX1VJTlQzMiBQYWNrZXRTaXplOworCS8qIFNldCBpbiBMTSBmb3IgUngsIGluIFVNIGZvciBUeC4gKi8KKwlMTV9VSU5UMzIgUGFja2V0U2l6ZTsKIAotICAgIExNX1VJTlQxNiBGbGFnczsKKwlMTV9VSU5UMTYgRmxhZ3M7CiAKLSAgICBMTV9VSU5UMTYgVmxhblRhZzsKKwlMTV9VSU5UMTYgVmxhblRhZzsKIAotICAgIHVuaW9uIHsKLQkvKiBTZW5kIGluZm8uICovCi0Jc3RydWN0IHsKLQkgICAgLyogU2V0IHVwIGJ5IFVNLiAqLwotCSAgICBMTV9VSU5UMzIgRnJhZ0NvdW50OworCXVuaW9uIHsKKwkJLyogU2VuZCBpbmZvLiAqLworCQlzdHJ1Y3QgeworCQkJLyogU2V0IHVwIGJ5IFVNLiAqLworCQkJTE1fVUlOVDMyIEZyYWdDb3VudDsKIAotCX0gVHg7CisJCX0gVHg7CiAKLQkvKiBSZWNlaXZlIGluZm8uICovCi0Jc3RydWN0IHsKLQkgICAgLyogVGhpcyBkZXNjcmlwdG9yIGJlbG9uZ3MgdG8gZWl0aGVyIFN0ZCwgTWluaSwgb3IgSnVtYm8gcmluZy4gKi8KLQkgICAgVDNfUkNWX1BST0RfUklORyBSY3ZQcm9kUmluZzsKKwkJLyogUmVjZWl2ZSBpbmZvLiAqLworCQlzdHJ1Y3QgeworCQkJLyogVGhpcyBkZXNjcmlwdG9yIGJlbG9uZ3MgdG8gZWl0aGVyIFN0ZCwgTWluaSwgb3IgSnVtYm8gcmluZy4gKi8KKwkJCVQzX1JDVl9QUk9EX1JJTkcgUmN2UHJvZFJpbmc7CiAKLQkgICAgLyogUmVjZWl2ZSBidWZmZXIgc2l6ZSAqLwotCSAgICBMTV9VSU5UMzIgUnhCdWZmZXJTaXplOworCQkJLyogUmVjZWl2ZSBidWZmZXIgc2l6ZSAqLworCQkJTE1fVUlOVDMyIFJ4QnVmZmVyU2l6ZTsKIAotCSAgICAvKiBDaGVja3N1bSBpbmZvcm1hdGlvbi4gKi8KLQkgICAgTE1fVUlOVDE2IElwQ2hlY2tzdW07Ci0JICAgIExNX1VJTlQxNiBUY3BVZHBDaGVja3N1bTsKKwkJCS8qIENoZWNrc3VtIGluZm9ybWF0aW9uLiAqLworCQkJTE1fVUlOVDE2IElwQ2hlY2tzdW07CisJCQlMTV9VSU5UMTYgVGNwVWRwQ2hlY2tzdW07CiAKLQl9IFJ4OwotICAgIH0gdTsKKwkJfSBSeDsKKwl9IHU7CiB9IExNX1BBQ0tFVDsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogVGlnb24zIGRldmljZSBibG9jay4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IF9MTV9ERVZJQ0VfQkxPQ0sgewotICAgIGludCBpbmRleDsgLyogRGV2aWNlIElEICovCi0gICAgLyogTWVtb3J5IHZpZXcuICovCi0gICAgUFQzX1NURF9NRU1fTUFQIHBNZW1WaWV3OworCWludCBpbmRleDsJCS8qIERldmljZSBJRCAqLworCS8qIE1lbW9yeSB2aWV3LiAqLworCVBUM19TVERfTUVNX01BUCBwTWVtVmlldzsKIAotICAgIC8qIEJhc2UgYWRkcmVzcyBvZiB0aGUgYmxvY2sgb2YgbWVtb3J5IGluIHdoaWNoIHRoZSBMTV9QQUNLRVQgZGVzY3JpcHRvcnMgKi8KLSAgICAvKiBhcmUgYWxsb2NhdGVkIGZyb20uICovCi0gICAgUExNX1ZPSUQgcFBhY2tldERlc2NCYXNlOworCS8qIEJhc2UgYWRkcmVzcyBvZiB0aGUgYmxvY2sgb2YgbWVtb3J5IGluIHdoaWNoIHRoZSBMTV9QQUNLRVQgZGVzY3JpcHRvcnMgKi8KKwkvKiBhcmUgYWxsb2NhdGVkIGZyb20uICovCisJUExNX1ZPSUQgcFBhY2tldERlc2NCYXNlOwogCi0gICAgTE1fVUlOVDMyIE1pc2NIb3N0Q3RybDsKLSAgICBMTV9VSU5UMzIgR3JjTG9jYWxDdHJsOwotICAgIExNX1VJTlQzMiBEbWFSZWFkV3JpdGVDdHJsOwotICAgIExNX1VJTlQzMiBQY2lTdGF0ZTsKKwlMTV9VSU5UMzIgTWlzY0hvc3RDdHJsOworCUxNX1VJTlQzMiBHcmNMb2NhbEN0cmw7CisJTE1fVUlOVDMyIERtYVJlYWRXcml0ZUN0cmw7CisJTE1fVUlOVDMyIFBjaVN0YXRlOwogCi0gICAgLyogUnggaW5mbyAqLwotICAgIExNX1VJTlQzMiBSeFN0ZERlc2NDbnQ7Ci0gICAgTE1fVUlOVDMyIFJ4U3RkUXVldWVkQ250OwotICAgIExNX1VJTlQzMiBSeFN0ZFByb2RJZHg7CisJLyogUnggaW5mbyAqLworCUxNX1VJTlQzMiBSeFN0ZERlc2NDbnQ7CisJTE1fVUlOVDMyIFJ4U3RkUXVldWVkQ250OworCUxNX1VJTlQzMiBSeFN0ZFByb2RJZHg7CiAKLSAgICBQVDNfUkNWX0JEIHBSeFN0ZEJkVmlydDsKLSAgICBMTV9QSFlTSUNBTF9BRERSRVNTIFJ4U3RkQmRQaHk7CisJUFQzX1JDVl9CRCBwUnhTdGRCZFZpcnQ7CisJTE1fUEhZU0lDQUxfQUREUkVTUyBSeFN0ZEJkUGh5OwogCi0gICAgTE1fVUlOVDMyIFJ4UGFja2V0RGVzY0NudDsKLSAgICBMTV9SWF9QQUNLRVRfUSBSeFBhY2tldEZyZWVROwotICAgIExNX1JYX1BBQ0tFVF9RIFJ4UGFja2V0UmVjZWl2ZWRROworCUxNX1VJTlQzMiBSeFBhY2tldERlc2NDbnQ7CisJTE1fUlhfUEFDS0VUX1EgUnhQYWNrZXRGcmVlUTsKKwlMTV9SWF9QQUNLRVRfUSBSeFBhY2tldFJlY2VpdmVkUTsKIAotICAgIC8qIFJlY2VpdmUgaW5mby4gKi8KLSAgICBQVDNfUkNWX0JEIHBSY3ZSZXRCZFZpcnQ7Ci0gICAgTE1fUEhZU0lDQUxfQUREUkVTUyBSY3ZSZXRCZFBoeTsKLSAgICBMTV9VSU5UMzIgUmN2UmV0Q29uSWR4OworCS8qIFJlY2VpdmUgaW5mby4gKi8KKwlQVDNfUkNWX0JEIHBSY3ZSZXRCZFZpcnQ7CisJTE1fUEhZU0lDQUxfQUREUkVTUyBSY3ZSZXRCZFBoeTsKKwlMTV9VSU5UMzIgUmN2UmV0Q29uSWR4OwogCiAjaWYgVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVAotICAgIExNX1VJTlQzMiBSeEp1bWJvRGVzY0NudDsKLSAgICBMTV9VSU5UMzIgUnhKdW1ib0J1ZmZlclNpemU7Ci0gICAgTE1fVUlOVDMyIFJ4SnVtYm9RdWV1ZWRDbnQ7CisJTE1fVUlOVDMyIFJ4SnVtYm9EZXNjQ250OworCUxNX1VJTlQzMiBSeEp1bWJvQnVmZmVyU2l6ZTsKKwlMTV9VSU5UMzIgUnhKdW1ib1F1ZXVlZENudDsKIAotICAgIExNX1VJTlQzMiBSeEp1bWJvUHJvZElkeDsKKwlMTV9VSU5UMzIgUnhKdW1ib1Byb2RJZHg7CiAKLSAgICBQVDNfUkNWX0JEIHBSeEp1bWJvQmRWaXJ0OwotICAgIExNX1BIWVNJQ0FMX0FERFJFU1MgUnhKdW1ib0JkUGh5OwotI2VuZGlmIC8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KKwlQVDNfUkNWX0JEIHBSeEp1bWJvQmRWaXJ0OworCUxNX1BIWVNJQ0FMX0FERFJFU1MgUnhKdW1ib0JkUGh5OworI2VuZGlmCQkJCS8qIFQzX0pVTUJPX1JDVl9SQ0JfRU5UUllfQ09VTlQgKi8KIAotICAgIC8qIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCBieSB0aGUgdXBwZXIgbW9kdWxlIHRvIGluZm9ybSB0aGUgcHJvdG9jb2wgKi8KLSAgICAvKiBvZiB0aGUgbWF4aW11bSB0cmFuc21pdC9yZWNlaXZlIHBhY2tldCBzaXplLiAqLwotICAgIExNX1VJTlQzMiBUeE10dTsgICAgLyogRG9lcyBub3QgaW5jbHVkZSBDUkMuICovCi0gICAgTE1fVUlOVDMyIFJ4TXR1OyAgICAvKiBEb2VzIG5vdCBpbmNsdWRlIENSQy4gKi8KKwkvKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgYnkgdGhlIHVwcGVyIG1vZHVsZSB0byBpbmZvcm0gdGhlIHByb3RvY29sICovCisJLyogb2YgdGhlIG1heGltdW0gdHJhbnNtaXQvcmVjZWl2ZSBwYWNrZXQgc2l6ZS4gKi8KKwlMTV9VSU5UMzIgVHhNdHU7CS8qIERvZXMgbm90IGluY2x1ZGUgQ1JDLiAqLworCUxNX1VJTlQzMiBSeE10dTsJLyogRG9lcyBub3QgaW5jbHVkZSBDUkMuICovCiAKLSAgICAvKiBXZSBuZWVkIHRvIHNoYWRvdyB0aGUgRU1BQywgUngsIFR4IG1vZGUgcmVnaXN0ZXJzLiAgV2l0aCBCMCBzaWxpY29uLCAqLwotICAgIC8qIHdlIG1heSBoYXZlIHByb2JsZW1zIHJlYWRpbmcgYW55IE1BQyByZWdpc3RlcnMgaW4gMTBtYiBtb2RlLiAqLwotICAgIExNX1VJTlQzMiBNYWNNb2RlOwotICAgIExNX1VJTlQzMiBSeE1vZGU7Ci0gICAgTE1fVUlOVDMyIFR4TW9kZTsKKwkvKiBXZSBuZWVkIHRvIHNoYWRvdyB0aGUgRU1BQywgUngsIFR4IG1vZGUgcmVnaXN0ZXJzLiAgV2l0aCBCMCBzaWxpY29uLCAqLworCS8qIHdlIG1heSBoYXZlIHByb2JsZW1zIHJlYWRpbmcgYW55IE1BQyByZWdpc3RlcnMgaW4gMTBtYiBtb2RlLiAqLworCUxNX1VJTlQzMiBNYWNNb2RlOworCUxNX1VJTlQzMiBSeE1vZGU7CisJTE1fVUlOVDMyIFR4TW9kZTsKIAotICAgIC8qIE1pTW9kZSByZWdpc3Rlci4gKi8KLSAgICBMTV9VSU5UMzIgTWlNb2RlOworCS8qIE1pTW9kZSByZWdpc3Rlci4gKi8KKwlMTV9VSU5UMzIgTWlNb2RlOwogCi0gICAgLyogSG9zdCBjb2FsZXNjZSBtb2RlIHJlZ2lzdGVyLiAqLwotICAgIExNX1VJTlQzMiBDb2FsZXNjZU1vZGU7CisJLyogSG9zdCBjb2FsZXNjZSBtb2RlIHJlZ2lzdGVyLiAqLworCUxNX1VJTlQzMiBDb2FsZXNjZU1vZGU7CiAKLSAgICAvKiBTZW5kIGluZm8uICovCi0gICAgTE1fVUlOVDMyIFR4UGFja2V0RGVzY0NudDsKKwkvKiBTZW5kIGluZm8uICovCisJTE1fVUlOVDMyIFR4UGFja2V0RGVzY0NudDsKIAotICAgIC8qIFR4IGluZm8uICovCi0gICAgTE1fVFhfUEFDS0VUX1EgVHhQYWNrZXRGcmVlUTsKLSAgICBMTV9UWF9QQUNLRVRfUSBUeFBhY2tldEFjdGl2ZVE7Ci0gICAgTE1fVFhfUEFDS0VUX1EgVHhQYWNrZXRYbWl0dGVkUTsKKwkvKiBUeCBpbmZvLiAqLworCUxNX1RYX1BBQ0tFVF9RIFR4UGFja2V0RnJlZVE7CisJTE1fVFhfUEFDS0VUX1EgVHhQYWNrZXRBY3RpdmVROworCUxNX1RYX1BBQ0tFVF9RIFR4UGFja2V0WG1pdHRlZFE7CiAKLSAgICAvKiBQb2ludGVycyB0byBTZW5kQmQuICovCi0gICAgUFQzX1NORF9CRCBwU2VuZEJkVmlydDsKLSAgICBMTV9QSFlTSUNBTF9BRERSRVNTIFNlbmRCZFBoeTsgIC8qIE9ubHkgdmFsaWQgZm9yIEhvc3QgYmFzZWQgU2VuZCBCRC4gKi8KKwkvKiBQb2ludGVycyB0byBTZW5kQmQuICovCisJUFQzX1NORF9CRCBwU2VuZEJkVmlydDsKKwlMTV9QSFlTSUNBTF9BRERSRVNTIFNlbmRCZFBoeTsJLyogT25seSB2YWxpZCBmb3IgSG9zdCBiYXNlZCBTZW5kIEJELiAqLwogCi0gICAgLyogU2VuZCBwcm9kdWNlciBhbmQgY29uc3VtZXIgaW5kaWNlcy4gKi8KLSAgICBMTV9VSU5UMzIgU2VuZFByb2RJZHg7Ci0gICAgTE1fVUlOVDMyIFNlbmRDb25JZHg7CisJLyogU2VuZCBwcm9kdWNlciBhbmQgY29uc3VtZXIgaW5kaWNlcy4gKi8KKwlMTV9VSU5UMzIgU2VuZFByb2RJZHg7CisJTE1fVUlOVDMyIFNlbmRDb25JZHg7CiAKLSAgICAvKiBOdW1iZXIgb2YgQkQgbGVmdC4gKi8KLSAgICBhdG9taWNfdCBTZW5kQmRMZWZ0OworCS8qIE51bWJlciBvZiBCRCBsZWZ0LiAqLworCWF0b21pY190IFNlbmRCZExlZnQ7CiAKLSAgICBUM19TTkRfQkQgU2hhZG93U2VuZEJkW1QzX1NFTkRfUkNCX0VOVFJZX0NPVU5UXTsKKwlUM19TTkRfQkQgU2hhZG93U2VuZEJkW1QzX1NFTkRfUkNCX0VOVFJZX0NPVU5UXTsKIAotICAgIC8qIENvdW50ZXJzLiAqLwotICAgIExNX1JYX0NPVU5URVJTIFJ4Q291bnRlcnM7Ci0gICAgTE1fVFhfQ09VTlRFUlMgVHhDb3VudGVyczsKKwkvKiBDb3VudGVycy4gKi8KKwlMTV9SWF9DT1VOVEVSUyBSeENvdW50ZXJzOworCUxNX1RYX0NPVU5URVJTIFR4Q291bnRlcnM7CiAKLSAgICAvKiBIb3N0IGNvYWxlc2NpbmcgcGFyYW1ldGVycy4gKi8KLSAgICBMTV9VSU5UMzIgUnhDb2FsZXNjaW5nVGlja3M7Ci0gICAgTE1fVUlOVDMyIFR4Q29hbGVzY2luZ1RpY2tzOwotICAgIExNX1VJTlQzMiBSeE1heENvYWxlc2NlZEZyYW1lczsKLSAgICBMTV9VSU5UMzIgVHhNYXhDb2FsZXNjZWRGcmFtZXM7Ci0gICAgTE1fVUlOVDMyIFN0YXRzQ29hbGVzY2luZ1RpY2tzOwotICAgIExNX1VJTlQzMiBSeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludDsKLSAgICBMTV9VSU5UMzIgVHhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQ7Ci0gICAgTE1fVUlOVDMyIFJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50OwotICAgIExNX1VJTlQzMiBUeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludDsKKwkvKiBIb3N0IGNvYWxlc2NpbmcgcGFyYW1ldGVycy4gKi8KKwlMTV9VSU5UMzIgUnhDb2FsZXNjaW5nVGlja3M7CisJTE1fVUlOVDMyIFR4Q29hbGVzY2luZ1RpY2tzOworCUxNX1VJTlQzMiBSeE1heENvYWxlc2NlZEZyYW1lczsKKwlMTV9VSU5UMzIgVHhNYXhDb2FsZXNjZWRGcmFtZXM7CisJTE1fVUlOVDMyIFN0YXRzQ29hbGVzY2luZ1RpY2tzOworCUxNX1VJTlQzMiBSeENvYWxlc2NpbmdUaWNrc0R1cmluZ0ludDsKKwlMTV9VSU5UMzIgVHhDb2FsZXNjaW5nVGlja3NEdXJpbmdJbnQ7CisJTE1fVUlOVDMyIFJ4TWF4Q29hbGVzY2VkRnJhbWVzRHVyaW5nSW50OworCUxNX1VJTlQzMiBUeE1heENvYWxlc2NlZEZyYW1lc0R1cmluZ0ludDsKIAotICAgIC8qIERNQSB3YXRlciBtYXJrcy4gKi8KLSAgICBMTV9VSU5UMzIgRG1hTWJ1Zkxvd01hcms7Ci0gICAgTE1fVUlOVDMyIFJ4TWFjTWJ1Zkxvd01hcms7Ci0gICAgTE1fVUlOVDMyIE1idWZIaWdoTWFyazsKKwkvKiBETUEgd2F0ZXIgbWFya3MuICovCisJTE1fVUlOVDMyIERtYU1idWZMb3dNYXJrOworCUxNX1VJTlQzMiBSeE1hY01idWZMb3dNYXJrOworCUxNX1VJTlQzMiBNYnVmSGlnaE1hcms7CiAKLSAgICAvKiBTdGF0dXMgYmxvY2suICovCi0gICAgUFQzX1NUQVRVU19CTE9DSyBwU3RhdHVzQmxrVmlydDsKLSAgICBMTV9QSFlTSUNBTF9BRERSRVNTIFN0YXR1c0Jsa1BoeTsKKwkvKiBTdGF0dXMgYmxvY2suICovCisJUFQzX1NUQVRVU19CTE9DSyBwU3RhdHVzQmxrVmlydDsKKwlMTV9QSFlTSUNBTF9BRERSRVNTIFN0YXR1c0Jsa1BoeTsKIAotICAgIC8qIFN0YXRpc3RpY3MgYmxvY2suICovCi0gICAgUFQzX1NUQVRTX0JMT0NLIHBTdGF0c0Jsa1ZpcnQ7Ci0gICAgTE1fUEhZU0lDQUxfQUREUkVTUyBTdGF0c0Jsa1BoeTsKKwkvKiBTdGF0aXN0aWNzIGJsb2NrLiAqLworCVBUM19TVEFUU19CTE9DSyBwU3RhdHNCbGtWaXJ0OworCUxNX1BIWVNJQ0FMX0FERFJFU1MgU3RhdHNCbGtQaHk7CiAKLSAgICAvKiBDdXJyZW50IHJlY2VpdmUgbWFzay4gKi8KLSAgICBMTV9VSU5UMzIgUmVjZWl2ZU1hc2s7CisJLyogQ3VycmVudCByZWNlaXZlIG1hc2suICovCisJTE1fVUlOVDMyIFJlY2VpdmVNYXNrOwogCi0gICAgLyogVGFzayBvZmZsb2FkIGNhcGFiaWxpdGllcy4gKi8KLSAgICBMTV9UQVNLX09GRkxPQUQgVGFza09mZmxvYWRDYXA7CisJLyogVGFzayBvZmZsb2FkIGNhcGFiaWxpdGllcy4gKi8KKwlMTV9UQVNLX09GRkxPQUQgVGFza09mZmxvYWRDYXA7CiAKLSAgICAvKiBUYXNrIG9mZmxvYWQgc2VsZWN0ZWQuICovCi0gICAgTE1fVEFTS19PRkZMT0FEIFRhc2tUb09mZmxvYWQ7CisJLyogVGFzayBvZmZsb2FkIHNlbGVjdGVkLiAqLworCUxNX1RBU0tfT0ZGTE9BRCBUYXNrVG9PZmZsb2FkOwogCi0gICAgLyogV2FrZSB1cCBjYXBhYmlsaXR5LiAqLwotICAgIExNX1dBS0VfVVBfTU9ERSBXYWtlVXBNb2RlQ2FwOworCS8qIFdha2UgdXAgY2FwYWJpbGl0eS4gKi8KKwlMTV9XQUtFX1VQX01PREUgV2FrZVVwTW9kZUNhcDsKIAotICAgIC8qIFdha2UgdXAgY2FwYWJpbGl0eS4gKi8KLSAgICBMTV9XQUtFX1VQX01PREUgV2FrZVVwTW9kZTsKKwkvKiBXYWtlIHVwIGNhcGFiaWxpdHkuICovCisJTE1fV0FLRV9VUF9NT0RFIFdha2VVcE1vZGU7CiAKLSAgICAvKiBGbG93IGNvbnRyb2wuICovCi0gICAgTE1fRkxPV19DT05UUk9MIEZsb3dDb250cm9sQ2FwOwotICAgIExNX0ZMT1dfQ09OVFJPTCBGbG93Q29udHJvbDsKKwkvKiBGbG93IGNvbnRyb2wuICovCisJTE1fRkxPV19DT05UUk9MIEZsb3dDb250cm9sQ2FwOworCUxNX0ZMT1dfQ09OVFJPTCBGbG93Q29udHJvbDsKIAotICAgIC8qIEVuYWJsZSBvciBkaXNhYmxlIFBDSSBNV0kuICovCi0gICAgTE1fVUlOVDMyIEVuYWJsZU1XSTsKKwkvKiBFbmFibGUgb3IgZGlzYWJsZSBQQ0kgTVdJLiAqLworCUxNX1VJTlQzMiBFbmFibGVNV0k7CiAKLSAgICAvKiBFbmFibGUgNTcwMSB0YWdnZWQgc3RhdHVzIG1vZGUuICovCi0gICAgTE1fVUlOVDMyIFVzZVRhZ2dlZFN0YXR1czsKKwkvKiBFbmFibGUgNTcwMSB0YWdnZWQgc3RhdHVzIG1vZGUuICovCisJTE1fVUlOVDMyIFVzZVRhZ2dlZFN0YXR1czsKIAotICAgIC8qIE5JQyB3aWxsIG5vdCBjb21wdXRlIHRoZSBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtLiAgVGhlIGRyaXZlciBvciBPUyAqLwotICAgIC8qIG11c3Qgc2VlZCB0aGUgY2hlY2tzdW0gZmllbGQgd2l0aCB0aGUgcHNldWRvIGNoZWNrc3VtLiAqLwotICAgIExNX1VJTlQzMiBOb1R4UHNldWRvSGRyQ2hrc3VtOworCS8qIE5JQyB3aWxsIG5vdCBjb21wdXRlIHRoZSBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtLiAgVGhlIGRyaXZlciBvciBPUyAqLworCS8qIG11c3Qgc2VlZCB0aGUgY2hlY2tzdW0gZmllbGQgd2l0aCB0aGUgcHNldWRvIGNoZWNrc3VtLiAqLworCUxNX1VJTlQzMiBOb1R4UHNldWRvSGRyQ2hrc3VtOwogCi0gICAgLyogVGhlIHJlY2VpdmUgY2hlY2tzdW0gaW4gdGhlIEJEIGRvZXMgbm90IGluY2x1ZGUgdGhlIHBzZXVkbyBjaGVja3N1bS4gKi8KLSAgICAvKiBUaGUgT1Mgb3IgdGhlIGRyaXZlciBtdXN0IGNhbGN1bGF0ZSB0aGUgcHNldWRvIGNoZWNrc3VtIGFuZCBhZGQgaXQgdG8gKi8KLSAgICAvKiB0aGUgY2hlY2tzdW0gaW4gdGhlIEJELiAqLwotICAgIExNX1VJTlQzMiBOb1J4UHNldWRvSGRyQ2hrc3VtOworCS8qIFRoZSByZWNlaXZlIGNoZWNrc3VtIGluIHRoZSBCRCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBwc2V1ZG8gY2hlY2tzdW0uICovCisJLyogVGhlIE9TIG9yIHRoZSBkcml2ZXIgbXVzdCBjYWxjdWxhdGUgdGhlIHBzZXVkbyBjaGVja3N1bSBhbmQgYWRkIGl0IHRvICovCisJLyogdGhlIGNoZWNrc3VtIGluIHRoZSBCRC4gKi8KKwlMTV9VSU5UMzIgTm9SeFBzZXVkb0hkckNoa3N1bTsKIAotICAgIC8qIEN1cnJlbnQgbm9kZSBhZGRyZXNzLiAqLwotICAgIExNX1VJTlQ4IE5vZGVBZGRyZXNzWzhdOworCS8qIEN1cnJlbnQgbm9kZSBhZGRyZXNzLiAqLworCUxNX1VJTlQ4IE5vZGVBZGRyZXNzWzhdOwogCi0gICAgLyogVGhlIGFkYXB0ZXIncyBub2RlIGFkZHJlc3MuICovCi0gICAgTE1fVUlOVDggUGVybWFuZW50Tm9kZUFkZHJlc3NbOF07CisJLyogVGhlIGFkYXB0ZXIncyBub2RlIGFkZHJlc3MuICovCisJTE1fVUlOVDggUGVybWFuZW50Tm9kZUFkZHJlc3NbOF07CiAKLSAgICAvKiBBZGFwdGVyIGluZm8uICovCi0gICAgTE1fVUlOVDE2IEJ1c051bTsKLSAgICBMTV9VSU5UOCBEZXZOdW07Ci0gICAgTE1fVUlOVDggRnVuY3ROdW07Ci0gICAgTE1fVUlOVDE2IFBjaVZlbmRvcklkOwotICAgIExNX1VJTlQxNiBQY2lEZXZpY2VJZDsKLSAgICBMTV9VSU5UMzIgQm9uZElkOwotICAgIExNX1VJTlQ4IElycTsKLSAgICBMTV9VSU5UOCBJbnRQaW47Ci0gICAgTE1fVUlOVDggQ2FjaGVMaW5lU2l6ZTsKLSAgICBMTV9VSU5UOCBQY2lSZXZJZDsKKwkvKiBBZGFwdGVyIGluZm8uICovCisJTE1fVUlOVDE2IEJ1c051bTsKKwlMTV9VSU5UOCBEZXZOdW07CisJTE1fVUlOVDggRnVuY3ROdW07CisJTE1fVUlOVDE2IFBjaVZlbmRvcklkOworCUxNX1VJTlQxNiBQY2lEZXZpY2VJZDsKKwlMTV9VSU5UMzIgQm9uZElkOworCUxNX1VJTlQ4IElycTsKKwlMTV9VSU5UOCBJbnRQaW47CisJTE1fVUlOVDggQ2FjaGVMaW5lU2l6ZTsKKwlMTV9VSU5UOCBQY2lSZXZJZDsKICNpZiBQQ0lYX1RBUkdFVF9XT1JLQVJPVU5ECiAJTE1fVUlOVDMyIEVuYWJsZVBjaVhGaXg7CiAjZW5kaWYKLSAgICBMTV9VSU5UMzIgVW5kaUZpeDsgICAvKiBuZXcsIGppbW15ICovCi0gICAgTE1fVUlOVDMyIFBjaUNvbW1hbmRTdGF0dXNXb3JkczsKLSAgICBMTV9VSU5UMzIgQ2hpcFJldklkOwotICAgIExNX1VJTlQxNiBTdWJzeXN0ZW1WZW5kb3JJZDsKLSAgICBMTV9VSU5UMTYgU3Vic3lzdGVtSWQ7Ci0jaWYgMCAgLyogSmltbXksIGRlbGV0ZWQgaW4gbmV3IGRyaXZlciAqLwotICAgIExNX1VJTlQzMiBNZW1CYXNlTG93OwotICAgIExNX1VJTlQzMiBNZW1CYXNlSGlnaDsKLSAgICBMTV9VSU5UMzIgTWVtQmFzZVNpemU7CisJTE1fVUlOVDMyIFVuZGlGaXg7CS8qIG5ldywgamltbXkgKi8KKwlMTV9VSU5UMzIgUGNpQ29tbWFuZFN0YXR1c1dvcmRzOworCUxNX1VJTlQzMiBDaGlwUmV2SWQ7CisJTE1fVUlOVDE2IFN1YnN5c3RlbVZlbmRvcklkOworCUxNX1VJTlQxNiBTdWJzeXN0ZW1JZDsKKyNpZiAwCQkJCS8qIEppbW15LCBkZWxldGVkIGluIG5ldyBkcml2ZXIgKi8KKwlMTV9VSU5UMzIgTWVtQmFzZUxvdzsKKwlMTV9VSU5UMzIgTWVtQmFzZUhpZ2g7CisJTE1fVUlOVDMyIE1lbUJhc2VTaXplOwogI2VuZGlmCi0gICAgUExNX1VJTlQ4IHBNYXBwZWRNZW1CYXNlOworCVBMTV9VSU5UOCBwTWFwcGVkTWVtQmFzZTsKIAotICAgIC8qIFNhdmVkIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBmb3IgcmVzdG9yaW5nIGFmdGVyIGEgcmVzZXQuICovCi0gICAgTE1fVUlOVDMyIFNhdmVkQ2FjaGVMaW5lUmVnOworCS8qIFNhdmVkIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBmb3IgcmVzdG9yaW5nIGFmdGVyIGEgcmVzZXQuICovCisJTE1fVUlOVDMyIFNhdmVkQ2FjaGVMaW5lUmVnOwogCi0gICAgLyogUGh5IGluZm8uICovCi0gICAgTE1fVUlOVDMyIFBoeUFkZHI7Ci0gICAgTE1fVUlOVDMyIFBoeUlkOworCS8qIFBoeSBpbmZvLiAqLworCUxNX1VJTlQzMiBQaHlBZGRyOworCUxNX1VJTlQzMiBQaHlJZDsKIAotICAgIC8qIFJlcXVlc3RlZCBwaHkgc2V0dGluZ3MuICovCi0gICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEUgUmVxdWVzdGVkTWVkaWFUeXBlOworCS8qIFJlcXVlc3RlZCBwaHkgc2V0dGluZ3MuICovCisJTE1fUkVRVUVTVEVEX01FRElBX1RZUEUgUmVxdWVzdGVkTWVkaWFUeXBlOwogCi0gICAgLyogRGlzYWJsZSBhdXRvLW5lZ290aWF0aW9uLiAqLwotICAgIExNX1VJTlQzMiBEaXNhYmxlQXV0b05lZzsKKwkvKiBEaXNhYmxlIGF1dG8tbmVnb3RpYXRpb24uICovCisJTE1fVUlOVDMyIERpc2FibGVBdXRvTmVnOwogCi0gICAgLyogV2F5cyBmb3IgdGhlIE1BQyB0byBnZXQgbGluayBjaGFuZ2UgaW50ZXJydXB0LiAqLwotICAgIExNX1VJTlQzMiBQaHlJbnRNb2RlOwotICAgICNkZWZpbmUgVDNfUEhZX0lOVF9NT0RFX0FVVE8gICAgICAgICAgICAgICAgICAgICAgICAwCi0gICAgI2RlZmluZSBUM19QSFlfSU5UX01PREVfTUlfSU5URVJSVVBUICAgICAgICAgICAgICAgIDEKLSAgICAjZGVmaW5lIFQzX1BIWV9JTlRfTU9ERV9MSU5LX1JFQURZICAgICAgICAgICAgICAgICAgMgotICAgICNkZWZpbmUgVDNfUEhZX0lOVF9NT0RFX0FVVE9fUE9MTElORyAgICAgICAgICAgICAgICAzCisJLyogV2F5cyBmb3IgdGhlIE1BQyB0byBnZXQgbGluayBjaGFuZ2UgaW50ZXJydXB0LiAqLworCUxNX1VJTlQzMiBQaHlJbnRNb2RlOworI2RlZmluZSBUM19QSFlfSU5UX01PREVfQVVUTyAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVDNfUEhZX0lOVF9NT0RFX01JX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFQzX1BIWV9JTlRfTU9ERV9MSU5LX1JFQURZICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBUM19QSFlfSU5UX01PREVfQVVUT19QT0xMSU5HICAgICAgICAgICAgICAgIDMKIAotICAgIC8qIFdheXMgdG8gZGV0ZXJtaW5lIGxpbmsgY2hhbmdlIHN0YXR1cy4gKi8KLSAgICBMTV9VSU5UMzIgTGlua0NobmdNb2RlOwotICAgICNkZWZpbmUgVDNfTElOS19DSE5HX01PREVfQVVUTyAgICAgICAgICAgICAgICAgICAgICAwCi0gICAgI2RlZmluZSBUM19MSU5LX0NITkdfTU9ERV9VU0VfU1RBVFVTX1JFRyAgICAgICAgICAgIDEKLSAgICAjZGVmaW5lIFQzX0xJTktfQ0hOR19NT0RFX1VTRV9TVEFUVVNfQkxPQ0sgICAgICAgICAgMgorCS8qIFdheXMgdG8gZGV0ZXJtaW5lIGxpbmsgY2hhbmdlIHN0YXR1cy4gKi8KKwlMTV9VSU5UMzIgTGlua0NobmdNb2RlOworI2RlZmluZSBUM19MSU5LX0NITkdfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVDNfTElOS19DSE5HX01PREVfVVNFX1NUQVRVU19SRUcgICAgICAgICAgICAxCisjZGVmaW5lIFQzX0xJTktfQ0hOR19NT0RFX1VTRV9TVEFUVVNfQkxPQ0sgICAgICAgICAgMgogCisJLyogTEVEIG1vZGUuICovCisJTE1fVUlOVDMyIExlZE1vZGU7CiAKLSAgICAvKiBMRUQgbW9kZS4gKi8KLSAgICBMTV9VSU5UMzIgTGVkTW9kZTsKKyNkZWZpbmUgTEVEX01PREVfQVVUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCiAKLSAgICAjZGVmaW5lIExFRF9NT0RFX0FVVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCS8qIDU3MDAvMDEgTEVEIG1vZGUuICovCisjZGVmaW5lIExFRF9NT0RFX1RIUkVFX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMRURfTU9ERV9MSU5LMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKIAotICAgIC8qIDU3MDAvMDEgTEVEIG1vZGUuICovCi0gICAgI2RlZmluZSBMRURfTU9ERV9USFJFRV9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSAgICAjZGVmaW5lIExFRF9NT0RFX0xJTksxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCS8qIDU3MDMvMDIvMDQgTEVEIG1vZGUuICovCisjZGVmaW5lIExFRF9NT0RFX09QRU5fRFJBSU4gICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMRURfTU9ERV9PVVRQVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKIAotICAgIC8qIDU3MDMvMDIvMDQgTEVEIG1vZGUuICovCi0gICAgI2RlZmluZSBMRURfTU9ERV9PUEVOX0RSQUlOICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSAgICAjZGVmaW5lIExFRF9NT0RFX09VVFBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCS8qIFdPTCBTcGVlZCAqLworCUxNX1VJTlQzMiBXb2xTcGVlZDsKKyNkZWZpbmUgV09MX1NQRUVEXzEwTUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdPTF9TUEVFRF8xMDBNQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgogCi0gICAgLyogV09MIFNwZWVkICovCi0gICAgTE1fVUlOVDMyIFdvbFNwZWVkOwotICAgICNkZWZpbmUgV09MX1NQRUVEXzEwTUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0gICAgI2RlZmluZSBXT0xfU1BFRURfMTAwTUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKwkvKiBSZXNldCB0aGUgUEhZIG9uIGluaXRpYWxpemF0aW9uLiAqLworCUxNX1VJTlQzMiBSZXNldFBoeU9uSW5pdDsKIAotICAgIC8qIFJlc2V0IHRoZSBQSFkgb24gaW5pdGlhbGl6YXRpb24uICovCi0gICAgTE1fVUlOVDMyIFJlc2V0UGh5T25Jbml0OworCUxNX1VJTlQzMiBSZXN0b3JlT25XYWtlVXA7CisJTE1fUkVRVUVTVEVEX01FRElBX1RZUEUgV2FrZVVwUmVxdWVzdGVkTWVkaWFUeXBlOworCUxNX1VJTlQzMiBXYWtlVXBEaXNhYmxlQXV0b05lZzsKIAotICAgIExNX1VJTlQzMiBSZXN0b3JlT25XYWtlVXA7Ci0gICAgTE1fUkVRVUVTVEVEX01FRElBX1RZUEUgV2FrZVVwUmVxdWVzdGVkTWVkaWFUeXBlOwotICAgIExNX1VJTlQzMiBXYWtlVXBEaXNhYmxlQXV0b05lZzsKKwkvKiBDdXJyZW50IHBoeSBzZXR0aW5ncy4gKi8KKwlMTV9NRURJQV9UWVBFIE1lZGlhVHlwZTsKKwlMTV9MSU5FX1NQRUVEIExpbmVTcGVlZDsKKwlMTV9MSU5FX1NQRUVEIE9sZExpbmVTcGVlZDsKKwlMTV9EVVBMRVhfTU9ERSBEdXBsZXhNb2RlOworCUxNX1NUQVRVUyBMaW5rU3RhdHVzOworCUxNX1VJTlQzMiBhZHZlcnRpc2luZzsJLyogSmltbXksIG5ldyEgKi8KKwlMTV9VSU5UMzIgYWR2ZXJ0aXNpbmcxMDAwOwkvKiBKaW1teSwgbmV3ISAqLwogCi0gICAgLyogQ3VycmVudCBwaHkgc2V0dGluZ3MuICovCi0gICAgTE1fTUVESUFfVFlQRSBNZWRpYVR5cGU7Ci0gICAgTE1fTElORV9TUEVFRCBMaW5lU3BlZWQ7Ci0gICAgTE1fTElORV9TUEVFRCBPbGRMaW5lU3BlZWQ7Ci0gICAgTE1fRFVQTEVYX01PREUgRHVwbGV4TW9kZTsKLSAgICBMTV9TVEFUVVMgTGlua1N0YXR1czsKLSAgICBMTV9VSU5UMzIgYWR2ZXJ0aXNpbmc7ICAgICAvKiBKaW1teSwgbmV3ISAqLwotICAgIExNX1VJTlQzMiBhZHZlcnRpc2luZzEwMDA7IC8qIEppbW15LCBuZXchICovCisJLyogTXVsdGljYXN0IGFkZHJlc3MgbGlzdC4gKi8KKwlMTV9VSU5UMzIgTWNFbnRyeUNvdW50OworCUxNX1VJTlQ4IE1jVGFibGVbTE1fTUFYX01DX1RBQkxFX1NJWkVdW0xNX01DX0VOVFJZX1NJWkVdOwogCi0gICAgLyogTXVsdGljYXN0IGFkZHJlc3MgbGlzdC4gKi8KLSAgICBMTV9VSU5UMzIgTWNFbnRyeUNvdW50OwotICAgIExNX1VJTlQ4IE1jVGFibGVbTE1fTUFYX01DX1RBQkxFX1NJWkVdW0xNX01DX0VOVFJZX1NJWkVdOworCS8qIFVzZSBOSUMgb3IgSG9zdCBiYXNlZCBzZW5kIEJELiAqLworCUxNX1VJTlQzMiBOaWNTZW5kQmQ7CiAKLSAgICAvKiBVc2UgTklDIG9yIEhvc3QgYmFzZWQgc2VuZCBCRC4gKi8KLSAgICBMTV9VSU5UMzIgTmljU2VuZEJkOworCS8qIEF0aGxvbiBmaXguICovCisJTE1fVUlOVDMyIERlbGF5UGNpR3JhbnQ7CiAKLSAgICAvKiBBdGhsb24gZml4LiAqLwotICAgIExNX1VJTlQzMiBEZWxheVBjaUdyYW50OworCS8qIEVuYWJsZSBPbmVEbWFBdE9uY2UgKi8KKwlMTV9VSU5UMzIgT25lRG1hQXRPbmNlOwogCi0gICAgLyogRW5hYmxlIE9uZURtYUF0T25jZSAqLwotICAgIExNX1VJTlQzMiBPbmVEbWFBdE9uY2U7CisJLyogU3BsaXQgTW9kZSBmbGFncywgSmltbXkgbmV3ICovCisJTE1fVUlOVDMyIFNwbGl0TW9kZUVuYWJsZTsKKwlMTV9VSU5UMzIgU3BsaXRNb2RlTWF4UmVxOwogCi0gICAgLyogU3BsaXQgTW9kZSBmbGFncywgSmltbXkgbmV3ICovCi0gICAgTE1fVUlOVDMyIFNwbGl0TW9kZUVuYWJsZTsKLSAgICBMTV9VSU5UMzIgU3BsaXRNb2RlTWF4UmVxOworCS8qIEluaXQgZmxhZy4gKi8KKwlMTV9CT09MIEluaXREb25lOwogCi0gICAgLyogSW5pdCBmbGFnLiAqLwotICAgIExNX0JPT0wgSW5pdERvbmU7CisJLyogU2h1dGRvd24gZmxhZy4gIFNldCBieSB0aGUgdXBwZXIgbW9kdWxlLiAqLworCUxNX0JPT0wgU2h1dHRpbmdEb3duOwogCi0gICAgLyogU2h1dGRvd24gZmxhZy4gIFNldCBieSB0aGUgdXBwZXIgbW9kdWxlLiAqLwotICAgIExNX0JPT0wgU2h1dHRpbmdEb3duOworCS8qIEZsYWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gY2FsbCBMTV9RdWV1ZVJ4UGFja2V0cyBvciBub3QgaW4gKi8KKwkvKiBMTV9SZXNldEFkYXB0ZXIgcm91dGluZS4gKi8KKwlMTV9CT09MIFF1ZXVlUnhQYWNrZXRzOwogCi0gICAgLyogRmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBjYWxsIExNX1F1ZXVlUnhQYWNrZXRzIG9yIG5vdCBpbiAqLwotICAgIC8qIExNX1Jlc2V0QWRhcHRlciByb3V0aW5lLiAqLwotICAgIExNX0JPT0wgUXVldWVSeFBhY2tldHM7CisJTE1fVUlOVDMyIE1idWZCYXNlOworCUxNX1VJTlQzMiBNYnVmU2l6ZTsKIAotICAgIExNX1VJTlQzMiBNYnVmQmFzZTsKLSAgICBMTV9VSU5UMzIgTWJ1ZlNpemU7CisJLyogVFJVRSBpZiB3ZSBoYXZlIGEgU0VSREVTIFBIWS4gKi8KKwlMTV9VSU5UMzIgRW5hYmxlVGJpOwogCi0gICAgLyogVFJVRSBpZiB3ZSBoYXZlIGEgU0VSREVTIFBIWS4gKi8KLSAgICBMTV9VSU5UMzIgRW5hYmxlVGJpOworCS8qIEV0aGVybmV0QFdpcmVTcGVlZC4gKi8KKwlMTV9VSU5UMzIgRW5hYmxlV2lyZVNwZWVkOwogCi0gICAgLyogRXRoZXJuZXRAV2lyZVNwZWVkLiAqLwotICAgIExNX1VJTlQzMiBFbmFibGVXaXJlU3BlZWQ7Ci0KLSAgICBMTV9VSU5UMzIgRWVwcm9tV3A7CisJTE1fVUlOVDMyIEVlcHJvbVdwOwogCiAjaWYgSU5DTFVERV9UQklfU1VQUE9SVAotICAgIC8qIEF1dG9uZWcgc3RhdGUgaW5mby4gKi8KLSAgICBBTl9TVEFURV9JTkZPIEFuSW5mbzsKLSAgICBMTV9VSU5UMzIgUG9sbFRiaUxpbms7Ci0gICAgTE1fVUlOVDMyIElnbm9yZVRiaUxpbmtDaGFuZ2U7CisJLyogQXV0b25lZyBzdGF0ZSBpbmZvLiAqLworCUFOX1NUQVRFX0lORk8gQW5JbmZvOworCUxNX1VJTlQzMiBQb2xsVGJpTGluazsKKwlMTV9VSU5UMzIgSWdub3JlVGJpTGlua0NoYW5nZTsKICNlbmRpZgotICAgIGNoYXIgUGFydE5vWzI0XTsKLSAgICBjaGFyIEJvb3RDb2RlVmVyWzE2XTsKLSAgICBjaGFyIEJ1c1NwZWVkU3RyWzI0XTsgLyogSmltbXksIG5ldyEgKi8KLSAgICBMTV9VSU5UMzIgUGh5Q3JjQ291bnQ7CisJY2hhciBQYXJ0Tm9bMjRdOworCWNoYXIgQm9vdENvZGVWZXJbMTZdOworCWNoYXIgQnVzU3BlZWRTdHJbMjRdOwkvKiBKaW1teSwgbmV3ISAqLworCUxNX1VJTlQzMiBQaHlDcmNDb3VudDsKIH0gTE1fREVWSUNFX0JMT0NLOwogCi0KICNkZWZpbmUgVDNfUkVHX0NQVV9WSUVXICAgICAgICAgICAgICAgMHhjMDAwMDAwMAogCiAjZGVmaW5lIFQzX0JMT0NLX0RNQV9SRCAgICAgICAgICAgICAgICgxIDw8IDApCkBAIC0zMjE2LDcgKzMxMzAsNiBAQAogI2RlZmluZSBUWF9DUFVfRVZUX1NXMTIgICAgICAgICAgICAgMzAKICNkZWZpbmUgVFhfQ1BVX0VWVF9TVzEzICAgICAgICAgICAgIDMxCiAKLQogLyogVFgtQ1BVIGV2ZW50ICovCiAjZGVmaW5lIFRYX0NQVV9FVkVOVF9TV19FVkVOVDAgICAgICAoMSA8PCBUWF9DUFVfRVZUX1NXMCkKICNkZWZpbmUgVFhfQ1BVX0VWRU5UX1NXX0VWRU5UMSAgICAgICgxIDw8IFRYX0NQVV9FVlRfU1cxKQpAQCAtMzI1MSwxMiArMzE2NCwxMCBAQAogI2RlZmluZSBUWF9DUFVfRVZFTlRfU1dfRVZFTlQxMiAgICAgKDEgPDwgVFhfQ1BVX0VWVF9TVzEyKQogI2RlZmluZSBUWF9DUFVfRVZFTlRfU1dfRVZFTlQxMyAgICAgKDEgPDwgVFhfQ1BVX0VWVF9TVzEzKQogCi0KICNkZWZpbmUgVFhfQ1BVX01BU0sgKFRYX0NQVV9FVkVOVF9TV19FVkVOVDAgfCBcCiAJCSAgICAgVFhfQ1BVX0VWRU5UX1NESSAgfCBcCiAJCSAgICAgVFhfQ1BVX0VWRU5UX1NEQykKIAotCiAjZGVmaW5lIFQzX0ZUUV9UWVBFMV9VTkRFUkZMT1dfQklUICAgKDEgPDwgMjkpCiAjZGVmaW5lIFQzX0ZUUV9UWVBFMV9QQVNTX0JJVCAgICAgICAgKDEgPDwgMzApCiAjZGVmaW5lIFQzX0ZUUV9UWVBFMV9TS0lQX0JJVCAgICAgICAgKDEgPDwgMzEpCkBAIC0zMjgzLDI1ICszMTk0LDI0IEBACiAjZGVmaW5lIFQzX1FJRF9SWF9EQVRBX0NPTVAgICAgICAgICAgIDE2CiAjZGVmaW5lIFQzX1FJRF9TV19UWVBFMiAgICAgICAgICAgICAgIDE3CiAKLUxNX1NUQVRVUyBMTV9Mb2FkRmlybXdhcmUoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAotCQkJICBQVDNfRldJTUdfSU5GTyBwRndJbWcsCi0JCQkgIExNX1VJTlQzMiBMb2FkQ3B1LAotCQkJICBMTV9VSU5UMzIgU3RhcnRDcHUpOworTE1fU1RBVFVTIExNX0xvYWRGaXJtd2FyZSAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLAorCQkJICAgUFQzX0ZXSU1HX0lORk8gcEZ3SW1nLAorCQkJICAgTE1fVUlOVDMyIExvYWRDcHUsIExNX1VJTlQzMiBTdGFydENwdSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBOSUMgcmVnaXN0ZXIgcmVhZC93cml0ZSBtYWNyb3MuICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgMCAgLyogSmltbXkgKi8KKyNpZiAwCQkJCS8qIEppbW15ICovCiAvKiBNQUMgcmVnaXN0ZXIgYWNjZXNzLiAqLwotTE1fVUlOVDMyIExNX1JlZ1JkSW5kKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIFJlZ2lzdGVyKTsKLUxNX1ZPSUQgTE1fUmVnV3JJbmQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgUmVnaXN0ZXIsCi0gICAgTE1fVUlOVDMyIFZhbHVlMzIpOworTE1fVUlOVDMyIExNX1JlZ1JkSW5kIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBSZWdpc3Rlcik7CitMTV9WT0lEIExNX1JlZ1dySW5kIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBSZWdpc3RlciwKKwkJICAgICBMTV9VSU5UMzIgVmFsdWUzMik7CiAKIC8qIE1BQyBtZW1vcnkgYWNjZXNzLiAqLwotTE1fVUlOVDMyIExNX01lbVJkSW5kKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE1lbUFkZHIpOwotTE1fVk9JRCBMTV9NZW1XckluZChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBNZW1BZGRyLAotICAgIExNX1VJTlQzMiBWYWx1ZTMyKTsKK0xNX1VJTlQzMiBMTV9NZW1SZEluZCAoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgTWVtQWRkcik7CitMTV9WT0lEIExNX01lbVdySW5kIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBNZW1BZGRyLAorCQkgICAgIExNX1VJTlQzMiBWYWx1ZTMyKTsKIAogI2lmIFBDSVhfVEFSR0VUX1dPUktBUk9VTkQKIApAQCAtMzM0Miw3ICszMjUyLDcgQEAKICNkZWZpbmUgTUVNX1dSX09GRlNFVChwRGV2aWNlLCBPZmZzZXQsIFZhbHVlMzIpICAgICAgICAgICAgICAgICAgXAogICAgIExNX01lbVdySW5kKHBEZXZpY2UsIE9mZnNldCwgVmFsdWUzMikKIAotI2Vsc2UgLyogbm9ybWFsIHRhcmdldCBhY2Nlc3MgcGF0aCBiZWxvdyAqLworI2Vsc2UJCQkJLyogbm9ybWFsIHRhcmdldCBhY2Nlc3MgcGF0aCBiZWxvdyAqLwogCiAvKiBSZWdpc3RlciBhY2Nlc3MuICovCiAjZGVmaW5lIFJFR19SRChwRGV2aWNlLCBPZmZzZXROYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMzM1NSw3ICszMjY1LDYgQEAKICNkZWZpbmUgUkVHX1dSX09GRlNFVChwRGV2aWNlLCBPZmZzZXQsIFZhbHVlMzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgd3JpdGVsKFZhbHVlMzIsICgoTE1fVUlOVDggKikgKHBEZXZpY2UpLT5wTWVtVmlldyArIE9mZnNldCkpCiAKLQogLyogVGhlcmUgY291bGQgYmUgcHJvYmxlbSBhY2Nlc3MgdGhlIG1lbW9yeSB3aW5kb3cgZGlyZWN0bHkuICBGb3Igbm93LCAqLwogLyogd2UgaGF2ZSB0byBnbyB0aHJvdWdoIHRoZSBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3Rlci4gKi8KICNkZWZpbmUgTUVNX1JEKHBEZXZpY2UsIEFkZHJOYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0zMzY4LDkgKzMyNzcsOSBAQAogI2RlZmluZSBNRU1fV1JfT0ZGU0VUKHBEZXZpY2UsIE9mZnNldCwgVmFsdWUzMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBMTV9NZW1XckluZChwRGV2aWNlLCBPZmZzZXQsIFZhbHVlMzIpCiAKLSNlbmRpZiAgLyogUENJWF9UQVJHRVRfV09SS0FST1VORCAqLworI2VuZGlmCQkJCS8qIFBDSVhfVEFSR0VUX1dPUktBUk9VTkQgKi8KIAotI2VuZGlmICAvKiBKaW1teSwgbWVyZ2luZyAqLworI2VuZGlmCQkJCS8qIEppbW15LCBtZXJnaW5nICovCiAKICAgLyogSmltbXkuLi5yZXN0IG9mIGZpbGUgaXMgbmV3IHN0dWZmISAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTMzNzgsMTQgKzMyODcsMTQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIE1BQyByZWdpc3RlciBhY2Nlc3MuICovCi1MTV9VSU5UMzIgTE1fUmVnUmRJbmQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgUmVnaXN0ZXIpOwotTE1fVk9JRCBMTV9SZWdXckluZChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBSZWdpc3RlciwKLSAgICBMTV9VSU5UMzIgVmFsdWUzMik7CitMTV9VSU5UMzIgTE1fUmVnUmRJbmQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIFJlZ2lzdGVyKTsKK0xNX1ZPSUQgTE1fUmVnV3JJbmQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIFJlZ2lzdGVyLAorCQkgICAgIExNX1VJTlQzMiBWYWx1ZTMyKTsKIAogLyogTUFDIG1lbW9yeSBhY2Nlc3MuICovCi1MTV9VSU5UMzIgTE1fTWVtUmRJbmQoUExNX0RFVklDRV9CTE9DSyBwRGV2aWNlLCBMTV9VSU5UMzIgTWVtQWRkcik7Ci1MTV9WT0lEIExNX01lbVdySW5kKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE1lbUFkZHIsCi0gICAgTE1fVUlOVDMyIFZhbHVlMzIpOworTE1fVUlOVDMyIExNX01lbVJkSW5kIChQTE1fREVWSUNFX0JMT0NLIHBEZXZpY2UsIExNX1VJTlQzMiBNZW1BZGRyKTsKK0xNX1ZPSUQgTE1fTWVtV3JJbmQgKFBMTV9ERVZJQ0VfQkxPQ0sgcERldmljZSwgTE1fVUlOVDMyIE1lbUFkZHIsCisJCSAgICAgTE1fVUlOVDMyIFZhbHVlMzIpOwogCiAjZGVmaW5lIE1CX1JFR19XUihwRGV2aWNlLCBPZmZzZXROYW1lLCBWYWx1ZTMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgKChwRGV2aWNlKS0+VW5kaUZpeCkgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0zNDI3LDQgKzMzMzYsNCBAQAogI2RlZmluZSBNRU1fV1JfT0ZGU0VUKHBEZXZpY2UsIE9mZnNldCwgVmFsdWUzMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBMTV9NZW1XckluZChwRGV2aWNlLCBPZmZzZXQsIFZhbHVlMzIpCiAKLSNlbmRpZiAvKiBUSUdPTjNfSCAqLworI2VuZGlmCQkJCS8qIFRJR09OM19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RxbTh4eF9wY21jaWEuYyBiL2RyaXZlcnMvdHFtOHh4X3BjbWNpYS5jCmluZGV4IGEwZjUzY2QuLjEzMmM3YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHFtOHh4X3BjbWNpYS5jCisrKyBiL2RyaXZlcnMvdHFtOHh4X3BjbWNpYS5jCkBAIC0xMCwxMSArMTAsMTEgQEAKIAogI3VuZGVmCUNPTkZJR19QQ01DSUEKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCkBAIC0yNDEsNyArMjQxLDcgQEAKIH0KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBpbnQgcGNtY2lhX2hhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCiB7CiAJdV9sb25nIHJlZzsKQEAgLTI2Myw3ICsyNjMsNyBAQAogCiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKIGludCBwY21jaWFfdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RzZWMuYyBiL2RyaXZlcnMvdHNlYy5jCmluZGV4IDEyOTg0NzguLmZkMjFlZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHNlYy5jCisrKyBiL2RyaXZlcnMvdHNlYy5jCkBAIC03MSw2ICs3MSw3IEBACiAjZWxzZQogCXtUU0VDMV9QSFlfQUREUiwgVFNFQ19HSUdBQklULCBUU0VDMV9QSFlJRFh9LAogI2VuZGlmCisjZWxzZQogCXswLCAwLCAwfSwKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1RTRUMyKQpAQCAtNzksNiArODAsNyBAQAogI2Vsc2UKIAl7VFNFQzJfUEhZX0FERFIsIFRTRUNfR0lHQUJJVCwgVFNFQzJfUEhZSURYfSwKICNlbmRpZgorI2Vsc2UKIAl7MCwgMCwgMH0sCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTVBDODVYWF9GRUMKQEAgLTEyNyw2ICsxMjksOSBAQAogCQkJICAgICB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgc2hvcnQgdmFsdWUpOwogc3RhdGljIGludCB0c2VjX21paXBoeV9yZWFkKGNoYXIgKmRldm5hbWUsIHVuc2lnbmVkIGNoYXIgYWRkciwKIAkJCSAgICB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgc2hvcnQgKnZhbHVlKTsKKyNpZmRlZiBDT05GSUdfTUNBU1RfVEZUUAorc3RhdGljIGludCB0c2VjX21jYXN0X2FkZHIgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIHU4IG1jYXN0X21hYywgdTggc2V0KTsKKyNlbmRpZgogCiAvKiBJbml0aWFsaXplIGRldmljZSBzdHJ1Y3R1cmUuIFJldHVybnMgc3VjY2VzcyBpZiBQSFkKICAqIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZCAoaS5lLiBpZiBpdCByZWNvZ25pemVzIHRoZSBQSFkpCkBAIC0xNjUsNiArMTcwLDkgQEAKIAlkZXYtPmhhbHQgPSB0c2VjX2hhbHQ7CiAJZGV2LT5zZW5kID0gdHNlY19zZW5kOwogCWRldi0+cmVjdiA9IHRzZWNfcmVjdjsKKyNpZmRlZiBDT05GSUdfTUNBU1RfVEZUUAorCWRldi0+bWNhc3QgPSB0c2VjX21jYXN0X2FkZHI7CisjZW5kaWYKIAogCS8qIFRlbGwgdS1ib290IHRvIGdldCB0aGUgYWRkciBmcm9tIHRoZSBlbnYgKi8KIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQpAQCAtMTc2LDcgKzE4NCw3IEBACiAJcHJpdi0+cmVncy0+bWFjY2ZnMSB8PSBNQUNDRkcxX1NPRlRfUkVTRVQ7CiAJcHJpdi0+cmVncy0+bWFjY2ZnMSAmPSB+KE1BQ0NGRzFfU09GVF9SRVNFVCk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkgXAorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkgXAogCSYmICFkZWZpbmVkKEJJVEJBTkdNSUkpCiAJbWlpcGh5X3JlZ2lzdGVyKGRldi0+bmFtZSwgdHNlY19taWlwaHlfcmVhZCwgdHNlY19taWlwaHlfd3JpdGUpOwogI2VuZGlmCkBAIC0yOTYsOSArMzA0LDkgQEAKIAl2b2xhdGlsZSB0c2VjX3QgKnJlZ3MgPSAodm9sYXRpbGUgdHNlY190ICopKFRTRUNfQkFTRV9BRERSKTsKIAogCS8qIEFzc2lnbiBhIFBoeXNpY2FsIGFkZHJlc3MgdG8gdGhlIFRCSSAqLwotCXJlZ3MtPnRiaXBhID0gVEJJUEFfVkFMVUU7CisJcmVncy0+dGJpcGEgPSBDRkdfVEJJUEFfVkFMVUU7CiAJcmVncyA9ICh2b2xhdGlsZSB0c2VjX3QgKikoVFNFQ19CQVNFX0FERFIgKyBUU0VDX1NJWkUpOwotCXJlZ3MtPnRiaXBhID0gVEJJUEFfVkFMVUU7CisJcmVncy0+dGJpcGEgPSBDRkdfVEJJUEFfVkFMVUU7CiAJYXNtKCJzeW5jIik7CiAKIAkvKiBSZXNldCBNSUkgKGR1ZSB0byBuZXcgYWRkcmVzc2VzKSAqLwpAQCAtODk4LDYgKzkwNiwzOSBAQAogCQlwaHlfcnVuX2NvbW1hbmRzKHByaXYsIHByaXYtPnBoeWluZm8tPnNodXRkb3duKTsKIH0KIAorc3RydWN0IHBoeV9pbmZvIHBoeV9pbmZvX004OEUxMTQ5UyA9IHsKKwkweDE0MTBjYSwKKwkiTWFydmVsbCA4OEUxMTQ5UyIsCisJNCwKKwkoc3RydWN0IHBoeV9jbWRbXSl7ICAgICAvKiBjb25maWcgKi8KKwkJLyogUmVzZXQgYW5kIGNvbmZpZ3VyZSB0aGUgUEhZICovCisJCXtNSUlNX0NPTlRST0wsIE1JSU1fQ09OVFJPTF9SRVNFVCwgTlVMTH0sCisJCXsweDFkLCAweDFmLCBOVUxMfSwKKwkJezB4MWUsIDB4MjAwYywgTlVMTH0sCisJCXsweDFkLCAweDUsIE5VTEx9LAorCQl7MHgxZSwgMHgwLCBOVUxMfSwKKwkJezB4MWUsIDB4MTAwLCBOVUxMfSwKKwkJe01JSU1fR0JJVF9DT05UUk9MLCBNSUlNX0dCSVRfQ09OVFJPTF9JTklULCBOVUxMfSwKKwkJe01JSU1fQU5BUiwgTUlJTV9BTkFSX0lOSVQsIE5VTEx9LAorCQl7TUlJTV9DT05UUk9MLCBNSUlNX0NPTlRST0xfUkVTRVQsIE5VTEx9LAorCQl7TUlJTV9DT05UUk9MLCBNSUlNX0NPTlRST0xfSU5JVCwgJm1paV9jcl9pbml0fSwKKwkJe21paW1fZW5kLH0KKwl9LAorCShzdHJ1Y3QgcGh5X2NtZFtdKXsgICAgIC8qIHN0YXJ0dXAgKi8KKwkJLyogU3RhdHVzIGlzIHJlYWQgb25jZSB0byBjbGVhciBvbGQgbGluayBzdGF0ZSAqLworCQl7TUlJTV9TVEFUVVMsIG1paW1fcmVhZCwgTlVMTH0sCisJCS8qIEF1dG8tbmVnb3RpYXRlICovCisJCXtNSUlNX1NUQVRVUywgbWlpbV9yZWFkLCAmbWlpX3BhcnNlX3NyfSwKKwkJLyogUmVhZCB0aGUgc3RhdHVzICovCisJCXtNSUlNXzg4RTEwMTFfUEhZX1NUQVRVUywgbWlpbV9yZWFkLAorCQkgJm1paV9wYXJzZV84OEUxMDExX3Bzcn0sCisJCXttaWltX2VuZCx9CisJfSwKKwkoc3RydWN0IHBoeV9jbWRbXSl7ICAgICAvKiBzaHV0ZG93biAqLworCQl7bWlpbV9lbmQsfQorCX0sCit9OworCiAvKiBUaGUgNTQxMSBpZCBpcyAweDIwNjA3MCwgdGhlIDU0MjEgaXMgMHgyMDYwZTAgKi8KIHN0cnVjdCBwaHlfaW5mbyBwaHlfaW5mb19CQ001NDYxUyA9IHsKIAkweDAyMDYwYzEsCS8qIDU0NjEgSUQgKi8KQEAgLTk5MywxMSArMTAzNCw2IEBACiAJKHN0cnVjdCBwaHlfY21kW10pewkvKiBjb25maWcgKi8KIAkJCSAgIC8qIFJlc2V0IGFuZCBjb25maWd1cmUgdGhlIFBIWSAqLwogCQkJICAge01JSU1fQ09OVFJPTCwgTUlJTV9DT05UUk9MX1JFU0VULCBOVUxMfSwKLQkJCSAgIHsweDFkLCAweDFmLCBOVUxMfSwKLQkJCSAgIHsweDFlLCAweDIwMGMsIE5VTEx9LAotCQkJICAgezB4MWQsIDB4NSwgTlVMTH0sCi0JCQkgICB7MHgxZSwgMHgwLCBOVUxMfSwKLQkJCSAgIHsweDFlLCAweDEwMCwgTlVMTH0sCiAJCQkgICB7MHgxNCwgMHgwY2QyLCBOVUxMfSwgLyogRGVsYXkgUkdNSUkgVFggYW5kIFJYICovCiAJCQkgICB7TUlJTV9HQklUX0NPTlRST0wsIE1JSU1fR0JJVF9DT05UUk9MX0lOSVQsIE5VTEx9LAogCQkJICAge01JSU1fQU5BUiwgTUlJTV9BTkFSX0lOSVQsIE5VTEx9LApAQCAtMTAzNywxNCArMTA3MywxNiBAQAogCSJNYXJ2ZWxsIDg4RTExNDUiLAogCTQsCiAJKHN0cnVjdCBwaHlfY21kW10pewkvKiBjb25maWcgKi8KKwkJCSAgIC8qIFJlc2V0IHRoZSBQSFkgKi8KKwkJCSAgIHtNSUlNX0NPTlRST0wsIE1JSU1fQ09OVFJPTF9SRVNFVCwgTlVMTH0sCisKIAkJCSAgIC8qIEVycmF0YSBFMCwgRTEgKi8KIAkJCSAgIHsyOSwgMHgwMDFiLCBOVUxMfSwKIAkJCSAgIHszMCwgMHg0MThmLCBOVUxMfSwKIAkJCSAgIHsyOSwgMHgwMDE2LCBOVUxMfSwKIAkJCSAgIHszMCwgMHhhMmRhLCBOVUxMfSwKIAotCQkJICAgLyogUmVzZXQgYW5kIGNvbmZpZ3VyZSB0aGUgUEhZICovCi0JCQkgICB7TUlJTV9DT05UUk9MLCBNSUlNX0NPTlRST0xfUkVTRVQsIE5VTEx9LAorCQkJICAgLyogQ29uZmlndXJlIHRoZSBQSFkgKi8KIAkJCSAgIHtNSUlNX0dCSVRfQ09OVFJPTCwgTUlJTV9HQklUX0NPTlRST0xfSU5JVCwgTlVMTH0sCiAJCQkgICB7TUlJTV9BTkFSLCBNSUlNX0FOQVJfSU5JVCwgTlVMTH0sCiAJCQkgICB7TUlJTV84OEUxMDExX1BIWV9TQ1IsIE1JSU1fODhFMTAxMV9QSFlfTURJX1hfQVVUTywKQEAgLTEzMjEsNiArMTM1OSw3IEBACiAJJnBoeV9pbmZvX004OEUxMDExUywKIAkmcGh5X2luZm9fTTg4RTExMTFTLAogCSZwaHlfaW5mb19NODhFMTE0NSwKKwkmcGh5X2luZm9fTTg4RTExNDlTLAogCSZwaHlfaW5mb19kbTkxNjEsCiAJJnBoeV9pbmZvX2x4dDk3MSwKIAkmcGh5X2luZm9fVlNDODI0NCwKQEAgLTEzNTEsOCArMTM5MCwxMCBAQAogCS8qIGxvb3AgdGhyb3VnaCBhbGwgdGhlIGtub3duIFBIWSB0eXBlcywgYW5kIGZpbmQgb25lIHRoYXQgKi8KIAkvKiBtYXRjaGVzIHRoZSBJRCB3ZSByZWFkIGZyb20gdGhlIFBIWS4gKi8KIAlmb3IgKGkgPSAwOyBwaHlfaW5mb1tpXTsgaSsrKSB7Ci0JCWlmIChwaHlfaW5mb1tpXS0+aWQgPT0gKHBoeV9JRCA+PiBwaHlfaW5mb1tpXS0+c2hpZnQpKQorCQlpZiAocGh5X2luZm9baV0tPmlkID09IChwaHlfSUQgPj4gcGh5X2luZm9baV0tPnNoaWZ0KSkgewogCQkJdGhlSW5mbyA9IHBoeV9pbmZvW2ldOworCQkJYnJlYWs7CisJCX0KIAl9CiAKIAlpZiAodGhlSW5mbyA9PSBOVUxMKSB7CkBAIC0xNDQzLDcgKzE0ODQsNyBAQAogCXJlbG9jYXRlZCA9IDE7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkgXAorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkgXAogCSYmICFkZWZpbmVkKEJJVEJBTkdNSUkpCiAKIHN0cnVjdCB0c2VjX3ByaXZhdGUgKmdldF9wcml2X2Zvcl9waHkodW5zaWduZWQgY2hhciBwaHlhZGRyKQpAQCAtMTUwMiw3ICsxNTQzLDQ4IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKLQkJJiYgIWRlZmluZWQoQklUQkFOR01JSSkgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01DQVNUX1RGVFAKKworLyogQ1JFRElUUzogbGludXggZ2lhbmZhciBkcml2ZXIsIHNsaWdodGx5IGFkanVzdGVkLi4uIHRoYW54LiAqLworCisvKiBTZXQgdGhlIGFwcHJvcHJpYXRlIGhhc2ggYml0IGZvciB0aGUgZ2l2ZW4gYWRkciAqLworCisvKiBUaGUgYWxnb3JpdGhtIHdvcmtzIGxpa2Ugc286CisgKiAxKSBUYWtlIHRoZSBEZXN0aW5hdGlvbiBBZGRyZXNzIChpZSB0aGUgbXVsdGljYXN0IGFkZHJlc3MpLCBhbmQKKyAqIGRvIGEgQ1JDIG9uIGl0IChsaXR0bGUgZW5kaWFuKSwgYW5kIHJldmVyc2UgdGhlIGJpdHMgb2YgdGhlCisgKiByZXN1bHQuCisgKiAyKSBVc2UgdGhlIDggbW9zdCBzaWduaWZpY2FudCBiaXRzIGFzIGEgaGFzaCBpbnRvIGEgMjU2LWVudHJ5CisgKiB0YWJsZS4gIFRoZSB0YWJsZSBpcyBjb250cm9sbGVkIHRocm91Z2ggOCAzMi1iaXQgcmVnaXN0ZXJzOgorICogZ2FkZHIwLTcuICBnYWRkcjAncyBNU0IgaXMgZW50cnkgMCwgYW5kIGdhZGRyNydzIExTQiBpcworICogZ2FkZHI3LiAgVGhpcyBtZWFucyB0aGF0IHRoZSAzIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBpbiB0aGUKKyAqIGhhc2ggaW5kZXggd2hpY2ggZ2FkZHIgcmVnaXN0ZXIgdG8gdXNlLCBhbmQgdGhlIDUgb3RoZXIgYml0cworICogaW5kaWNhdGUgd2hpY2ggYml0IChhc3N1bWluZyBhbiBJQk0gbnVtYmVyaW5nIHNjaGVtZSwgd2hpY2gKKyAqIGZvciBQb3dlclBDICh0bSkgaXMgdXN1YWxseSB0aGUgY2FzZSkgaW4gdGhlIHRyZWdpc3RlciBob2xkcworICogdGhlIGVudHJ5LiAqLworc3RhdGljIGludAordHNlY19tY2FzdF9hZGRyIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2LCB1OCBtY2FzdF9tYWMsIHU4IHNldCkKK3sKKyBzdHJ1Y3QgdHNlY19wcml2YXRlICpwcml2ID0gcHJpdmxpc3RbMV07Cisgdm9sYXRpbGUgdHNlY190ICpyZWdzID0gcHJpdi0+cmVnczsKKyB2b2xhdGlsZSB1MzIgICpyZWdfYXJyYXksIHZhbHVlOworIHU4IHJlc3VsdCwgd2hpY2hiaXQsIHdoaWNocmVnOworCisJcmVzdWx0ID0gKHU4KSgoZXRoZXJfY3JjKE1BQ19BRERSX0xFTixtY2FzdF9tYWMpID4+IDI0KSAmIDB4ZmYpOworCXdoaWNoYml0ID0gcmVzdWx0ICYgMHgxZjsJLyogdGhlIDUgTFNCID0gd2hpY2ggYml0IHRvIHNldCAqLworCXdoaWNocmVnID0gcmVzdWx0ID4+IDU7CQkvKiB0aGUgMyBNU0IgPSB3aGljaCByZWcgdG8gc2V0IGl0IGluICovCisJdmFsdWUgPSAoMSA8PCAoMzEtd2hpY2hiaXQpKTsKKworCXJlZ19hcnJheSA9ICYocmVncy0+aGFzaC5nYWRkcjApOworCisJaWYgKHNldCkgeworCQlyZWdfYXJyYXlbd2hpY2hyZWddIHw9IHZhbHVlOworCX0gZWxzZSB7CisJCXJlZ19hcnJheVt3aGljaHJlZ10gJj0gfnZhbHVlOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBNdWx0aWNhc3QgVEZUUCA/ICovCiAKICNlbmRpZiAvKiBDT05GSUdfVFNFQ19FTkVUICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RzZWMuaCBiL2RyaXZlcnMvdHNlYy5oCmluZGV4IDdiZjNkZWUuLjJmMDA5MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHNlYy5oCisrKyBiL2RyaXZlcnMvdHNlYy5oCkBAIC03MCw3ICs3MCw5IEBACiAjZGVmaW5lIG1paW1fZW5kIC0yCiAjZGVmaW5lIG1paW1fcmVhZCAtMQogCi0jZGVmaW5lIFRCSVBBX1ZBTFVFCQkweDFmCisjaWZuZGVmIENGR19UQklQQV9WQUxVRQorICAgICNkZWZpbmUgQ0ZHX1RCSVBBX1ZBTFVFCTB4MWYKKyNlbmRpZgogI2RlZmluZSBNSUlNQ0ZHX0lOSVRfVkFMVUUJMHgwMDAwMDAwMwogI2RlZmluZSBNSUlNQ0ZHX1JFU0VUCQkweDgwMDAwMDAwCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHNpMTA4X2V0aC5jIGIvZHJpdmVycy90c2kxMDhfZXRoLmMKaW5kZXggNDczNDFiZS4uNTI0ZTlkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy90c2kxMDhfZXRoLmMKKysrIGIvZHJpdmVycy90c2kxMDhfZXRoLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAogI2luY2x1ZGUgPGNvbmZpZy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpIFwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpIFwKIAkmJiBkZWZpbmVkKENPTkZJR19UU0kxMDhfRVRIKQogCiAjaWYgIWRlZmluZWQoQ09ORklHX1RTSTEwOF9FVEhfTlVNX1BPUlRTKSB8fCAoQ09ORklHX1RTSTEwOF9FVEhfTlVNX1BPUlRTID4gMikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHNpMTA4X2kyYy5jIGIvZHJpdmVycy90c2kxMDhfaTJjLmMKaW5kZXggZWI1MmNiNi4uM2EzYjc1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy90c2kxMDhfaTJjLmMKKysrIGIvZHJpdmVycy90c2kxMDhfaTJjLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpZmRlZiBDT05GSUdfVFNJMTA4X0kyQwogI2luY2x1ZGUgPHRzaTEwOC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JMkMpCiAKICNkZWZpbmUgSTJDX0RFTEFZCTEwMDAwMAogI3VuZGVmICBERUJVR19JMkMKQEAgLTI3OSw1ICsyNzksNSBAQAogCXJldHVybiBpMmNfcmVhZCAoY2hpcCwgMCwgMSwgKGNoYXIgKikmdG1wLCAxKTsKIH0KIAotI2VuZGlmCS8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykgKi8KKyNlbmRpZgogI2VuZGlmIC8qIENPTkZJR19UU0kxMDhfSTJDICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYl9vaGNpLmMgYi9kcml2ZXJzL3VzYl9vaGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhMzdiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiX29oY2kuYwpAQCAtMCwwICsxLDE5MTggQEAKKy8qCisgKiBVUkIgT0hDSSBIQ0QgKEhvc3QgQ29udHJvbGxlciBEcml2ZXIpIGZvciBVU0Igb24gdGhlIEFUOTFSTTkyMDAgYW5kIFBDSSBidXMuCisgKgorICogSW50ZXJydXB0IHN1cHBvcnQgaXMgYWRkZWQuIE5vdywgaXQgaGFzIGJlZW4gdGVzdGVkCisgKiBvbiBVTEkxNTc1IGNoaXAgYW5kIHdvcmtzIHdlbGwgd2l0aCBVU0Iga2V5Ym9hcmQuCisgKgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBaaGFuZyBXZWksIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDMKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIDxnakBkZW54LmRlPgorICoKKyAqIE5vdGU6IE11Y2ggb2YgdGhpcyBjb2RlIGhhcyBiZWVuIGRlcml2ZWQgZnJvbSBMaW51eCAyLjQKKyAqIChDKSBDb3B5cmlnaHQgMTk5OSBSb21hbiBXZWlzc2dhZXJiZXIgPHdlaXNzZ0B2aWVubmEuYXQ+CisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMiBEYXZpZCBCcm93bmVsbAorICoKKyAqIE1vZGlmaWVkIGZvciB0aGUgTVAyVVNCIGJ5IChDKSBDb3B5cmlnaHQgMjAwNSBFcmljIEJlbmFyZAorICogZWJlbmFyZEBldWtyZWEuY29tIC0gYmFzZWQgb24gczNjMjR4MCdzIGRyaXZlcgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisvKgorICogSU1QT1JUQU5UIE5PVEVTCisgKiAxIC0gUmVhZCBkb2MvUkVBRE1FLmdlbmVyaWNfdXNiX29oY2kKKyAqIDIgLSB0aGlzIGRyaXZlciBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggVVNCIE1hc3MgU3RvcmFnZSBEZXZpY2VzCisgKiAgICAgKEJCQikgYW5kIFVTQiBrZXlib2FyZC4gVGhlcmUgaXMgTk8gc3VwcG9ydCBmb3IgSXNvY2hyb25vdXMgcGlwZXMhCisgKiAyIC0gd2hlbiBydW5uaW5nIG9uIGEgUFFGUDIwOCBBVDkxUk05MjAwLCBkZWZpbmUgQ09ORklHX0FUOTFDX1BRRlBfVUhQQlVHCisgKiAgICAgdG8gYWN0aXZhdGUgd29ya2Fyb3VuZCBmb3IgYnVnICM0MSBvciB0aGlzIGRyaXZlciB3aWxsIE5PVCB3b3JrIQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19VU0JfT0hDSV9ORVcKKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1BDSV9PSENJKQorIyBpbmNsdWRlIDxwY2kuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8dXNiLmg+CisjaW5jbHVkZSAidXNiX29oY2kuaCIKKworI2lmIGRlZmluZWQoQ09ORklHX0FSTTkyMFQpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19TM0MyNDAwKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfUzNDMjQxMCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfUENJX09IQ0kpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19NUEM1MjAwKQorIyBkZWZpbmUgT0hDSV9VU0VfTlBTCQkvKiBmb3JjZSBOb1Bvd2VyU3dpdGNoaW5nIG1vZGUgKi8KKyNlbmRpZgorCisjdW5kZWYgT0hDSV9WRVJCT1NFX0RFQlVHCS8qIG5vdCBhbHdheXMgaGVscGZ1bCAqLworI3VuZGVmIERFQlVHCisjdW5kZWYgU0hPV19JTkZPCisjdW5kZWYgT0hDSV9GSUxMX1RSQUNFCisKKy8qIEZvciBpbml0aWFsaXppbmcgY29udHJvbGxlciAobWFzayBpbiBhbiBIQ0ZTIG1vZGUgdG9vKSAqLworI2RlZmluZSBPSENJX0NPTlRST0xfSU5JVCBcCisJKE9IQ0lfQ1RSTF9DQlNSICYgMHgzKSB8IE9IQ0lfQ1RSTF9JRSB8IE9IQ0lfQ1RSTF9QTEUKKworLyoKKyAqIGUuZy4gUENJIGNvbnRyb2xsZXJzIG5lZWQgdGhpcworICovCisjaWZkZWYgQ0ZHX09IQ0lfU1dBUF9SRUdfQUNDRVNTCisjIGRlZmluZSByZWFkbChhKSBfX3N3YXBfMzIoKigodnVfbG9uZyAqKShhKSkpCisjIGRlZmluZSB3cml0ZWwoYSwgYikgKCooKHZ1X2xvbmcgKikoYikpID0gX19zd2FwXzMyKCh2dV9sb25nKWEpKQorI2Vsc2UKKyMgZGVmaW5lIHJlYWRsKGEpICgqKCh2dV9sb25nICopKGEpKSkKKyMgZGVmaW5lIHdyaXRlbChhLCBiKSAoKigodnVfbG9uZyAqKShiKSkgPSAoKHZ1X2xvbmcpYSkpCisjZW5kaWYgLyogQ0ZHX09IQ0lfU1dBUF9SRUdfQUNDRVNTICovCisKKyNkZWZpbmUgbWluX3QodHlwZSx4LHkpICh7IHR5cGUgX194ID0gKHgpOyB0eXBlIF9feSA9ICh5KTsgX194IDwgX195ID8gX194OiBfX3k7IH0pCisKKyNpZmRlZiBDT05GSUdfUENJX09IQ0kKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBvaGNpX3BjaV9pZHNbXSA9IHsKKwl7MHgxMGI5LCAweDUyMzd9LAkvKiBVTEkxNTc1IFBDSSBPSENJIG1vZHVsZSBpZHMgKi8KKwkvKiBQbGVhc2UgYWRkIHN1cHBvcnRlZCBQQ0kgT0hDSSBjb250cm9sbGVyIGlkcyBoZXJlICovCisJezAsIDB9Cit9OworI2VuZGlmCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIHByaW50ZigiREVCVUc6ICIgZm9ybWF0ICJcbiIsICMjIGFyZykKKyNlbHNlCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZiAvKiBERUJVRyAqLworI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pIHByaW50ZigiRVJST1I6ICIgZm9ybWF0ICJcbiIsICMjIGFyZykKKyN1bmRlZiBTSE9XX0lORk8KKyNpZmRlZiBTSE9XX0lORk8KKyNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRmKCJJTkZPOiAiIGZvcm1hdCAiXG4iLCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCisKKyNpZmRlZiBDRkdfT0hDSV9CRV9DT05UUk9MTEVSCisjIGRlZmluZSBtMTZfc3dhcCh4KSBjcHVfdG9fYmUxNih4KQorIyBkZWZpbmUgbTMyX3N3YXAoeCkgY3B1X3RvX2JlMzIoeCkKKyNlbHNlCisjIGRlZmluZSBtMTZfc3dhcCh4KSBjcHVfdG9fbGUxNih4KQorIyBkZWZpbmUgbTMyX3N3YXAoeCkgY3B1X3RvX2xlMzIoeCkKKyNlbmRpZiAvKiBDRkdfT0hDSV9CRV9DT05UUk9MTEVSICovCisKKy8qIGdsb2JhbCBvaGNpX3QgKi8KK3N0YXRpYyBvaGNpX3QgZ29oY2k7CisvKiB0aGlzIG11c3QgYmUgYWxpZ25lZCB0byBhIDI1NiBieXRlIGJvdW5kYXJ5ICovCitzdHJ1Y3Qgb2hjaV9oY2NhIGdoY2NhWzFdOworLyogYSBwb2ludGVyIHRvIHRoZSBhbGlnbmVkIHN0b3JhZ2UgKi8KK3N0cnVjdCBvaGNpX2hjY2EgKnBoY2NhOworLyogdGhpcyBhbGxvY2F0ZXMgRURzIGZvciBhbGwgcG9zc2libGUgZW5kcG9pbnRzICovCitzdHJ1Y3Qgb2hjaV9kZXZpY2Ugb2hjaV9kZXY7CisvKiBSSFNDIGZsYWcgKi8KK2ludCBnb3RfcmhzYzsKKy8qIGRldmljZSB3aGljaCB3YXMgZGlzY29ubmVjdGVkICovCitzdHJ1Y3QgdXNiX2RldmljZSAqZGV2Z29uZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQU1ELTc1NiAoRDIgcmV2KSByZXBvcnRzIGNvcnJ1cHQgcmVnaXN0ZXIgY29udGVudHMgaW4gc29tZSBjYXNlcy4KKyAqIFRoZSBlcnJhdHVtICgjNCkgZGVzY3JpcHRpb24gaXMgaW5jb3JyZWN0LiAgQU1EJ3Mgd29ya2Fyb3VuZCB3YWl0cworICogdGlsbCBzb21lIGJpdHMgKG1vc3RseSByZXNlcnZlZCkgYXJlIGNsZWFyOyBvayBmb3IgYWxsIHJldnMuCisgKi8KKyNkZWZpbmUgT0hDSV9RVUlSS19BTUQ3NTYgMHhhYmNkCisjZGVmaW5lIHJlYWRfcm9vdGh1YihoYywgcmVnaXN0ZXIsIG1hc2spICh7IFwKKwl1MzIgdGVtcCA9IHJlYWRsICgmaGMtPnJlZ3MtPnJvb3RodWIucmVnaXN0ZXIpOyBcCisJaWYgKGhjLT5mbGFncyAmIE9IQ0lfUVVJUktfQU1ENzU2KSBcCisJCXdoaWxlICh0ZW1wICYgbWFzaykgXAorCQkJdGVtcCA9IHJlYWRsICgmaGMtPnJlZ3MtPnJvb3RodWIucmVnaXN0ZXIpOyBcCisJdGVtcDsgfSkKKworc3RhdGljIHUzMiByb290aHViX2EgKHN0cnVjdCBvaGNpICpoYykKKwl7IHJldHVybiByZWFkX3Jvb3RodWIgKGhjLCBhLCAweGZjMGZlMDAwKTsgfQorc3RhdGljIGlubGluZSB1MzIgcm9vdGh1Yl9iIChzdHJ1Y3Qgb2hjaSAqaGMpCisJeyByZXR1cm4gcmVhZGwgKCZoYy0+cmVncy0+cm9vdGh1Yi5iKTsgfQorc3RhdGljIGlubGluZSB1MzIgcm9vdGh1Yl9zdGF0dXMgKHN0cnVjdCBvaGNpICpoYykKKwl7IHJldHVybiByZWFkbCAoJmhjLT5yZWdzLT5yb290aHViLnN0YXR1cyk7IH0KK3N0YXRpYyB1MzIgcm9vdGh1Yl9wb3J0c3RhdHVzIChzdHJ1Y3Qgb2hjaSAqaGMsIGludCBpKQorCXsgcmV0dXJuIHJlYWRfcm9vdGh1YiAoaGMsIHBvcnRzdGF0dXMgW2ldLCAweGZmZTBmY2UwKTsgfQorCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdGF0aWMgaW50IGhjX2ludGVycnVwdCAodm9pZCk7CitzdGF0aWMgdm9pZAordGRfc3VibWl0X2pvYiAoc3RydWN0IHVzYl9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqIGJ1ZmZlciwKKwlpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqIHNldHVwLCB1cmJfcHJpdl90ICogdXJiLCBpbnQgaW50ZXJ2YWwpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBVUkIgc3VwcG9ydCBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGZyZWUgSENELXByaXZhdGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBVUkIgKi8KKworc3RhdGljIHZvaWQgdXJiX2ZyZWVfcHJpdiAodXJiX3ByaXZfdCAqIHVyYikKK3sKKwlpbnQJCWk7CisJaW50CQlsYXN0OworCXN0cnVjdCB0ZAkqIHRkOworCisJbGFzdCA9IHVyYi0+bGVuZ3RoIC0gMTsKKwlpZiAobGFzdCA+PSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPD0gbGFzdDsgaSsrKSB7CisJCQl0ZCA9IHVyYi0+dGRbaV07CisJCQlpZiAodGQpIHsKKwkJCQl0ZC0+dXNiX2RldiA9IE5VTEw7CisJCQkJdXJiLT50ZFtpXSA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisJZnJlZSh1cmIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgREVCVUcKK3N0YXRpYyBpbnQgc29oY2lfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyIChzdHJ1Y3QgdXNiX2RldmljZSAqIGRldik7CisKKy8qIGRlYnVnfCBwcmludCB0aGUgbWFpbiBjb21wb25lbnRzIG9mIGFuIFVSQgorICogc21hbGw6IDApIGhlYWRlciArIGRhdGEgcGFja2V0cyAxKSBqdXN0IGhlYWRlciAqLworCitzdGF0aWMgdm9pZCBwa3RfcHJpbnQgKHVyYl9wcml2X3QgKnB1cmIsIHN0cnVjdCB1c2JfZGV2aWNlICogZGV2LAorCXVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqIGJ1ZmZlciwKKwlpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqIHNldHVwLCBjaGFyICogc3RyLCBpbnQgc21hbGwpCit7CisJZGJnKCIlcyBVUkI6WyU0eF0gZGV2OiUyZCxlcDolMmQtJWMsdHlwZTolcyxsZW46JWQvJWQgc3RhdDolI2x4IiwKKwkJCXN0ciwKKwkJCXNvaGNpX2dldF9jdXJyZW50X2ZyYW1lX251bWJlciAoZGV2KSwKKwkJCXVzYl9waXBlZGV2aWNlIChwaXBlKSwKKwkJCXVzYl9waXBlZW5kcG9pbnQgKHBpcGUpLAorCQkJdXNiX3BpcGVvdXQgKHBpcGUpPyAnTyc6ICdJJywKKwkJCXVzYl9waXBldHlwZSAocGlwZSkgPCAyPyAodXNiX3BpcGVpbnQgKHBpcGUpPyAiSU5UUiI6ICJJU09DIik6CisJCQkJKHVzYl9waXBlY29udHJvbCAocGlwZSk/ICJDVFJMIjogIkJVTEsiKSwKKwkJCShwdXJiID8gcHVyYi0+YWN0dWFsX2xlbmd0aCA6IDApLAorCQkJdHJhbnNmZXJfbGVuLCBkZXYtPnN0YXR1cyk7CisjaWZkZWYJT0hDSV9WRVJCT1NFX0RFQlVHCisJaWYgKCFzbWFsbCkgeworCQlpbnQgaSwgbGVuOworCisJCWlmICh1c2JfcGlwZWNvbnRyb2wgKHBpcGUpKSB7CisJCQlwcmludGYgKF9fRklMRV9fICI6IGNtZCg4KToiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCA4IDsgaSsrKQorCQkJCXByaW50ZiAoIiAlMDJ4IiwgKChfX3U4ICopIHNldHVwKSBbaV0pOworCQkJcHJpbnRmICgiXG4iKTsKKwkJfQorCQlpZiAodHJhbnNmZXJfbGVuID4gMCAmJiBidWZmZXIpIHsKKwkJCXByaW50ZiAoX19GSUxFX18gIjogZGF0YSglZC8lZCk6IiwKKwkJCQkocHVyYiA/IHB1cmItPmFjdHVhbF9sZW5ndGggOiAwKSwKKwkJCQl0cmFuc2Zlcl9sZW4pOworCQkJbGVuID0gdXNiX3BpcGVvdXQgKHBpcGUpPworCQkJCQl0cmFuc2Zlcl9sZW46CisJCQkJCShwdXJiID8gcHVyYi0+YWN0dWFsX2xlbmd0aCA6IDApOworCQkJZm9yIChpID0gMDsgaSA8IDE2ICYmIGkgPCBsZW47IGkrKykKKwkJCQlwcmludGYgKCIgJTAyeCIsICgoX191OCAqKSBidWZmZXIpIFtpXSk7CisJCQlwcmludGYgKCIlc1xuIiwgaSA8IGxlbj8gIi4uLiI6ICIiKTsKKwkJfQorCX0KKyNlbmRpZgorfQorCisvKiBqdXN0IGZvciBkZWJ1Z2dpbmc7IHByaW50cyBub24tZW1wdHkgYnJhbmNoZXMgb2YgdGhlIGludCBlZCB0cmVlIGluY2x1c2l2ZSBpc28gZWRzKi8KK3ZvaWQgZXBfcHJpbnRfaW50X2VkcyAob2hjaV90ICpvaGNpLCBjaGFyICogc3RyKSB7CisJaW50IGksIGo7CisJIF9fdTMyICogZWRfcDsKKwlmb3IgKGk9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWogPSA1OworCQllZF9wID0gJihvaGNpLT5oY2NhLT5pbnRfdGFibGUgW2ldKTsKKwkJaWYgKCplZF9wID09IDApCisJCSAgICBjb250aW51ZTsKKwkJcHJpbnRmIChfX0ZJTEVfXyAiOiAlcyBicmFuY2ggaW50ICUyZCglMngpOiIsIHN0ciwgaSwgaSk7CisJCXdoaWxlICgqZWRfcCAhPSAwICYmIGotLSkgeworCQkJZWRfdCAqZWQgPSAoZWRfdCAqKW0zMl9zd2FwKGVkX3ApOworCQkJcHJpbnRmICgiIGVkOiAlNHg7IiwgZWQtPmh3SU5GTyk7CisJCQllZF9wID0gJmVkLT5od05leHRFRDsKKwkJfQorCQlwcmludGYgKCJcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgb2hjaV9kdW1wX2ludHJfbWFzayAoY2hhciAqbGFiZWwsIF9fdTMyIG1hc2spCit7CisJZGJnICgiJXM6IDB4JTA4eCVzJXMlcyVzJXMlcyVzJXMlcyIsCisJCWxhYmVsLAorCQltYXNrLAorCQkobWFzayAmIE9IQ0lfSU5UUl9NSUUpID8gIiBNSUUiIDogIiIsCisJCShtYXNrICYgT0hDSV9JTlRSX09DKSA/ICIgT0MiIDogIiIsCisJCShtYXNrICYgT0hDSV9JTlRSX1JIU0MpID8gIiBSSFNDIiA6ICIiLAorCQkobWFzayAmIE9IQ0lfSU5UUl9GTk8pID8gIiBGTk8iIDogIiIsCisJCShtYXNrICYgT0hDSV9JTlRSX1VFKSA/ICIgVUUiIDogIiIsCisJCShtYXNrICYgT0hDSV9JTlRSX1JEKSA/ICIgUkQiIDogIiIsCisJCShtYXNrICYgT0hDSV9JTlRSX1NGKSA/ICIgU0YiIDogIiIsCisJCShtYXNrICYgT0hDSV9JTlRSX1dESCkgPyAiIFdESCIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfU08pID8gIiBTTyIgOiAiIgorCQkpOworfQorCitzdGF0aWMgdm9pZCBtYXliZV9wcmludF9lZHMgKGNoYXIgKmxhYmVsLCBfX3UzMiB2YWx1ZSkKK3sKKwllZF90ICplZHAgPSAoZWRfdCAqKXZhbHVlOworCisJaWYgKHZhbHVlKSB7CisJCWRiZyAoIiVzICUwOHgiLCBsYWJlbCwgdmFsdWUpOworCQlkYmcgKCIlMDh4IiwgZWRwLT5od0lORk8pOworCQlkYmcgKCIlMDh4IiwgZWRwLT5od1RhaWxQKTsKKwkJZGJnICgiJTA4eCIsIGVkcC0+aHdIZWFkUCk7CisJCWRiZyAoIiUwOHgiLCBlZHAtPmh3TmV4dEVEKTsKKwl9Cit9CisKK3N0YXRpYyBjaGFyICogaGNmczJzdHJpbmcgKGludCBzdGF0ZSkKK3sKKwlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgT0hDSV9VU0JfUkVTRVQ6CXJldHVybiAicmVzZXQiOworCQljYXNlIE9IQ0lfVVNCX1JFU1VNRToJcmV0dXJuICJyZXN1bWUiOworCQljYXNlIE9IQ0lfVVNCX09QRVI6CXJldHVybiAib3BlcmF0aW9uYWwiOworCQljYXNlIE9IQ0lfVVNCX1NVU1BFTkQ6CXJldHVybiAic3VzcGVuZCI7CisJfQorCXJldHVybiAiPyI7Cit9CisKKy8qIGR1bXAgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQgb2hjaV9kdW1wX3N0YXR1cyAob2hjaV90ICpjb250cm9sbGVyKQoreworCXN0cnVjdCBvaGNpX3JlZ3MJKnJlZ3MgPSBjb250cm9sbGVyLT5yZWdzOworCV9fdTMyCQkJdGVtcDsKKworCXRlbXAgPSByZWFkbCAoJnJlZ3MtPnJldmlzaW9uKSAmIDB4ZmY7CisJaWYgKHRlbXAgIT0gMHgxMCkKKwkJZGJnICgic3BlYyAlZC4lZCIsICh0ZW1wID4+IDQpLCAodGVtcCAmIDB4MGYpKTsKKworCXRlbXAgPSByZWFkbCAoJnJlZ3MtPmNvbnRyb2wpOworCWRiZyAoImNvbnRyb2w6IDB4JTA4eCVzJXMlcyBIQ0ZTPSVzJXMlcyVzJXMgQ0JTUj0lZCIsIHRlbXAsCisJCSh0ZW1wICYgT0hDSV9DVFJMX1JXRSkgPyAiIFJXRSIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0NUUkxfUldDKSA/ICIgUldDIiA6ICIiLAorCQkodGVtcCAmIE9IQ0lfQ1RSTF9JUikgPyAiIElSIiA6ICIiLAorCQloY2ZzMnN0cmluZyAodGVtcCAmIE9IQ0lfQ1RSTF9IQ0ZTKSwKKwkJKHRlbXAgJiBPSENJX0NUUkxfQkxFKSA/ICIgQkxFIiA6ICIiLAorCQkodGVtcCAmIE9IQ0lfQ1RSTF9DTEUpID8gIiBDTEUiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9DVFJMX0lFKSA/ICIgSUUiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9DVFJMX1BMRSkgPyAiIFBMRSIgOiAiIiwKKwkJdGVtcCAmIE9IQ0lfQ1RSTF9DQlNSCisJCSk7CisKKwl0ZW1wID0gcmVhZGwgKCZyZWdzLT5jbWRzdGF0dXMpOworCWRiZyAoImNtZHN0YXR1czogMHglMDh4IFNPQz0lZCVzJXMlcyVzIiwgdGVtcCwKKwkJKHRlbXAgJiBPSENJX1NPQykgPj4gMTYsCisJCSh0ZW1wICYgT0hDSV9PQ1IpID8gIiBPQ1IiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9CTEYpID8gIiBCTEYiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9DTEYpID8gIiBDTEYiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9IQ1IpID8gIiBIQ1IiIDogIiIKKwkJKTsKKworCW9oY2lfZHVtcF9pbnRyX21hc2sgKCJpbnRyc3RhdHVzIiwgcmVhZGwgKCZyZWdzLT5pbnRyc3RhdHVzKSk7CisJb2hjaV9kdW1wX2ludHJfbWFzayAoImludHJlbmFibGUiLCByZWFkbCAoJnJlZ3MtPmludHJlbmFibGUpKTsKKworCW1heWJlX3ByaW50X2VkcyAoImVkX3BlcmlvZGN1cnJlbnQiLCByZWFkbCAoJnJlZ3MtPmVkX3BlcmlvZGN1cnJlbnQpKTsKKworCW1heWJlX3ByaW50X2VkcyAoImVkX2NvbnRyb2xoZWFkIiwgcmVhZGwgKCZyZWdzLT5lZF9jb250cm9saGVhZCkpOworCW1heWJlX3ByaW50X2VkcyAoImVkX2NvbnRyb2xjdXJyZW50IiwgcmVhZGwgKCZyZWdzLT5lZF9jb250cm9sY3VycmVudCkpOworCisJbWF5YmVfcHJpbnRfZWRzICgiZWRfYnVsa2hlYWQiLCByZWFkbCAoJnJlZ3MtPmVkX2J1bGtoZWFkKSk7CisJbWF5YmVfcHJpbnRfZWRzICgiZWRfYnVsa2N1cnJlbnQiLCByZWFkbCAoJnJlZ3MtPmVkX2J1bGtjdXJyZW50KSk7CisKKwltYXliZV9wcmludF9lZHMgKCJkb25laGVhZCIsIHJlYWRsICgmcmVncy0+ZG9uZWhlYWQpKTsKK30KKworc3RhdGljIHZvaWQgb2hjaV9kdW1wX3Jvb3RodWIgKG9oY2lfdCAqY29udHJvbGxlciwgaW50IHZlcmJvc2UpCit7CisJX191MzIJCQl0ZW1wLCBuZHAsIGk7CisKKwl0ZW1wID0gcm9vdGh1Yl9hIChjb250cm9sbGVyKTsKKwluZHAgPSAodGVtcCAmIFJIX0FfTkRQKTsKKyNpZmRlZiBDT05GSUdfQVQ5MUNfUFFGUF9VSFBCVUcKKwluZHAgPSAobmRwID09IDIpID8gMTowOworI2VuZGlmCisJaWYgKHZlcmJvc2UpIHsKKwkJZGJnICgicm9vdGh1Yi5hOiAlMDh4IFBPVFBHVD0lZCVzJXMlcyVzJXMgTkRQPSVkIiwgdGVtcCwKKwkJCSgodGVtcCAmIFJIX0FfUE9UUEdUKSA+PiAyNCkgJiAweGZmLAorCQkJKHRlbXAgJiBSSF9BX05PQ1ApID8gIiBOT0NQIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9BX09DUE0pID8gIiBPQ1BNIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9BX0RUKSA/ICIgRFQiIDogIiIsCisJCQkodGVtcCAmIFJIX0FfTlBTKSA/ICIgTlBTIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9BX1BTTSkgPyAiIFBTTSIgOiAiIiwKKwkJCW5kcAorCQkJKTsKKwkJdGVtcCA9IHJvb3RodWJfYiAoY29udHJvbGxlcik7CisJCWRiZyAoInJvb3RodWIuYjogJTA4eCBQUENNPSUwNHggRFI9JTA0eCIsCisJCQl0ZW1wLAorCQkJKHRlbXAgJiBSSF9CX1BQQ00pID4+IDE2LAorCQkJKHRlbXAgJiBSSF9CX0RSKQorCQkJKTsKKwkJdGVtcCA9IHJvb3RodWJfc3RhdHVzIChjb250cm9sbGVyKTsKKwkJZGJnICgicm9vdGh1Yi5zdGF0dXM6ICUwOHglcyVzJXMlcyVzJXMiLAorCQkJdGVtcCwKKwkJCSh0ZW1wICYgUkhfSFNfQ1JXRSkgPyAiIENSV0UiIDogIiIsCisJCQkodGVtcCAmIFJIX0hTX09DSUMpID8gIiBPQ0lDIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9IU19MUFNDKSA/ICIgTFBTQyIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfSFNfRFJXRSkgPyAiIERSV0UiIDogIiIsCisJCQkodGVtcCAmIFJIX0hTX09DSSkgPyAiIE9DSSIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfSFNfTFBTKSA/ICIgTFBTIiA6ICIiCisJCQkpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuZHA7IGkrKykgeworCQl0ZW1wID0gcm9vdGh1Yl9wb3J0c3RhdHVzIChjb250cm9sbGVyLCBpKTsKKwkJZGJnICgicm9vdGh1Yi5wb3J0c3RhdHVzIFslZF0gPSAweCUwOHglcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMiLAorCQkJaSwKKwkJCXRlbXAsCisJCQkodGVtcCAmIFJIX1BTX1BSU0MpID8gIiBQUlNDIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19PQ0lDKSA/ICIgT0NJQyIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfUFNfUFNTQykgPyAiIFBTU0MiIDogIiIsCisJCQkodGVtcCAmIFJIX1BTX1BFU0MpID8gIiBQRVNDIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19DU0MpID8gIiBDU0MiIDogIiIsCisKKwkJCSh0ZW1wICYgUkhfUFNfTFNEQSkgPyAiIExTREEiIDogIiIsCisJCQkodGVtcCAmIFJIX1BTX1BQUykgPyAiIFBQUyIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfUFNfUFJTKSA/ICIgUFJTIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19QT0NJKSA/ICIgUE9DSSIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfUFNfUFNTKSA/ICIgUFNTIiA6ICIiLAorCisJCQkodGVtcCAmIFJIX1BTX1BFUykgPyAiIFBFUyIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfUFNfQ0NTKSA/ICIgQ0NTIiA6ICIiCisJCQkpOworCX0KK30KKworc3RhdGljIHZvaWQgb2hjaV9kdW1wIChvaGNpX3QgKmNvbnRyb2xsZXIsIGludCB2ZXJib3NlKQoreworCWRiZyAoIk9IQ0kgY29udHJvbGxlciB1c2ItJXMgc3RhdGUiLCBjb250cm9sbGVyLT5zbG90X25hbWUpOworCisJLyogZHVtcHMgc29tZSBvZiB0aGUgc3RhdGUgd2Uga25vdyBhYm91dCAqLworCW9oY2lfZHVtcF9zdGF0dXMgKGNvbnRyb2xsZXIpOworCWlmICh2ZXJib3NlKQorCQllcF9wcmludF9pbnRfZWRzIChjb250cm9sbGVyLCAiaGNjYSIpOworCWRiZyAoImhjY2EgZnJhbWUgIyUwNHgiLCBjb250cm9sbGVyLT5oY2NhLT5mcmFtZV9ubyk7CisJb2hjaV9kdW1wX3Jvb3RodWIgKGNvbnRyb2xsZXIsIDEpOworCisjZW5kaWYgLyogREVCVUcgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogSW50ZXJmYWNlIGZ1bmN0aW9ucyAoVVJCKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZ2V0IGEgdHJhbnNmZXIgcmVxdWVzdCAqLworCitpbnQgc29oY2lfc3VibWl0X2pvYih1cmJfcHJpdl90ICp1cmIsIHN0cnVjdCBkZXZyZXF1ZXN0ICpzZXR1cCkKK3sKKwlvaGNpX3QgKm9oY2k7CisJZWRfdCAqIGVkOworCXVyYl9wcml2X3QgKnB1cmJfcHJpdiA9IHVyYjsKKwlpbnQgaSwgc2l6ZSA9IDA7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHVyYi0+ZGV2OworCXVuc2lnbmVkIGxvbmcgcGlwZSA9IHVyYi0+cGlwZTsKKwl2b2lkICpidWZmZXIgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlpbnQgdHJhbnNmZXJfbGVuID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOworCWludCBpbnRlcnZhbCA9IHVyYi0+aW50ZXJ2YWw7CisKKwlvaGNpID0gJmdvaGNpOworCisJLyogd2hlbiBjb250cm9sbGVyJ3MgaHVuZywgcGVybWl0IG9ubHkgcm9vdGh1YiBjbGVhbnVwIGF0dGVtcHRzCisJICogc3VjaCBhcyBwb3dlcmluZyBkb3duIHBvcnRzICovCisJaWYgKG9oY2ktPmRpc2FibGVkKSB7CisJCWVycigic29oY2lfc3VibWl0X2pvYjogRVBJUEUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHdlJ3JlIGFib3V0IHRvIGJlZ2luIGEgbmV3IHRyYW5zYWN0aW9uIGhlcmUgc28gbWFyayB0aGUgVVJCIHVuZmluaXNoZWQgKi8KKwl1cmItPmZpbmlzaGVkID0gMDsKKworCS8qIGV2ZXJ5IGVuZHBvaW50IGhhcyBhIGVkLCBsb2NhdGUgYW5kIGZpbGwgaXQgKi8KKwlpZiAoIShlZCA9IGVwX2FkZF9lZCAoZGV2LCBwaXBlLCBpbnRlcnZhbCwgMSkpKSB7CisJCWVycigic29oY2lfc3VibWl0X2pvYjogRU5PTUVNIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBmb3IgdGhlIHByaXZhdGUgcGFydCBvZiB0aGUgVVJCIHdlIG5lZWQgdGhlIG51bWJlciBvZiBURHMgKHNpemUpICovCisJc3dpdGNoICh1c2JfcGlwZXR5cGUgKHBpcGUpKSB7CisJCWNhc2UgUElQRV9CVUxLOiAvKiBvbmUgVEQgZm9yIGV2ZXJ5IDQwOTYgQnl0ZSAqLworCQkJc2l6ZSA9ICh0cmFuc2Zlcl9sZW4gLSAxKSAvIDQwOTYgKyAxOworCQkJYnJlYWs7CisJCWNhc2UgUElQRV9DT05UUk9MOiAvKiAxIFREIGZvciBzZXR1cCwgMSBmb3IgQUNLIGFuZCAxIGZvciBldmVyeSA0MDk2IEIgKi8KKwkJCXNpemUgPSAodHJhbnNmZXJfbGVuID09IDApPyAyOgorCQkJCQkJKHRyYW5zZmVyX2xlbiAtIDEpIC8gNDA5NiArIDM7CisJCQlicmVhazsKKwkJY2FzZSBQSVBFX0lOVEVSUlVQVDogLyogMSBURCAqLworCQkJc2l6ZSA9IDE7CisJCQlicmVhazsKKwl9CisKKwllZC0+cHVyYiA9IHVyYjsKKworCWlmIChzaXplID49IChOX1VSQl9URCAtIDEpKSB7CisJCWVycigibmVlZCAlZCBURHMsIG9ubHkgaGF2ZSAlZCIsIHNpemUsIE5fVVJCX1REKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwdXJiX3ByaXYtPnBpcGUgPSBwaXBlOworCisJLyogZmlsbCB0aGUgcHJpdmF0ZSBwYXJ0IG9mIHRoZSBVUkIgKi8KKwlwdXJiX3ByaXYtPmxlbmd0aCA9IHNpemU7CisJcHVyYl9wcml2LT5lZCA9IGVkOworCXB1cmJfcHJpdi0+YWN0dWFsX2xlbmd0aCA9IDA7CisKKwkvKiBhbGxvY2F0ZSB0aGUgVERzICovCisJLyogbm90ZSB0aGF0IHRkWzBdIHdhcyBhbGxvY2F0ZWQgaW4gZXBfYWRkX2VkICovCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlwdXJiX3ByaXYtPnRkW2ldID0gdGRfYWxsb2MgKGRldik7CisJCWlmICghcHVyYl9wcml2LT50ZFtpXSkgeworCQkJcHVyYl9wcml2LT5sZW5ndGggPSBpOworCQkJdXJiX2ZyZWVfcHJpdiAocHVyYl9wcml2KTsKKwkJCWVycigic29oY2lfc3VibWl0X2pvYjogRU5PTUVNIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAoZWQtPnN0YXRlID09IEVEX05FVyB8fCAoZWQtPnN0YXRlICYgRURfREVMKSkgeworCQl1cmJfZnJlZV9wcml2IChwdXJiX3ByaXYpOworCQllcnIoInNvaGNpX3N1Ym1pdF9qb2I6IEVJTlZBTCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogbGluayB0aGUgZWQgaW50byBhIGNoYWluIGlmIGlzIG5vdCBhbHJlYWR5ICovCisJaWYgKGVkLT5zdGF0ZSAhPSBFRF9PUEVSKQorCQllcF9saW5rIChvaGNpLCBlZCk7CisKKwkvKiBmaWxsIHRoZSBURHMgYW5kIGxpbmsgaXQgdG8gdGhlIGVkICovCisJdGRfc3VibWl0X2pvYihkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBzZXR1cCwgcHVyYl9wcml2LCBpbnRlcnZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc29oY2lfcmV0dXJuX2pvYihzdHJ1Y3Qgb2hjaSAqaGMsIHVyYl9wcml2X3QgKnVyYikKK3sKKwlzdHJ1Y3Qgb2hjaV9yZWdzICpyZWdzID0gaGMtPnJlZ3M7CisKKwlzd2l0Y2ggKHVzYl9waXBldHlwZSAodXJiLT5waXBlKSkgeworCWNhc2UgUElQRV9JTlRFUlJVUFQ6CisJCS8qIGltcGxpY2l0bHkgcmVxdWV1ZWQgKi8KKwkJaWYgKHVyYi0+ZGV2LT5pcnFfaGFuZGxlICYmCisJCQkJKHVyYi0+ZGV2LT5pcnFfYWN0X2xlbiA9IHVyYi0+YWN0dWFsX2xlbmd0aCkpIHsKKwkJCXdyaXRlbCAoT0hDSV9JTlRSX1dESCwgJnJlZ3MtPmludHJlbmFibGUpOworCQkJcmVhZGwgKCZyZWdzLT5pbnRyZW5hYmxlKTsgLyogUENJIHBvc3RpbmcgZmx1c2ggKi8KKwkJCXVyYi0+ZGV2LT5pcnFfaGFuZGxlKHVyYi0+ZGV2KTsKKwkJCXdyaXRlbCAoT0hDSV9JTlRSX1dESCwgJnJlZ3MtPmludHJkaXNhYmxlKTsKKwkJCXJlYWRsICgmcmVncy0+aW50cmRpc2FibGUpOyAvKiBQQ0kgcG9zdGluZyBmbHVzaCAqLworCQl9CisJCXVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CisJCXRkX3N1Ym1pdF9qb2IgKAorCQkJCXVyYi0+ZGV2LAorCQkJCXVyYi0+cGlwZSwKKwkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQkJTlVMTCwKKwkJCQl1cmIsCisJCQkJdXJiLT5pbnRlcnZhbCk7CisJCWJyZWFrOworCWNhc2UgUElQRV9DT05UUk9MOgorCWNhc2UgUElQRV9CVUxLOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBERUJVRworLyogdGVsbCB1cyB0aGUgY3VycmVudCBVU0IgZnJhbWUgbnVtYmVyICovCisKK3N0YXRpYyBpbnQgc29oY2lfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyIChzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldikKK3sKKwlvaGNpX3QgKm9oY2kgPSAmZ29oY2k7CisKKwlyZXR1cm4gbTE2X3N3YXAgKG9oY2ktPmhjY2EtPmZyYW1lX25vKTsKK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBFRCBoYW5kbGluZyBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHNlYXJjaCBmb3IgdGhlIHJpZ2h0IGJyYW5jaCB0byBpbnNlcnQgYW4gaW50ZXJydXB0IGVkIGludG8gdGhlIGludCB0cmVlCisgKiBkbyBzb21lIGxvYWQgYmFsbGFuY2luZzsKKyAqIHJldHVybnMgdGhlIGJyYW5jaCBhbmQKKyAqIHNldHMgdGhlIGludGVydmFsIHRvIGludGVydmFsID0gMl5pbnRlZ2VyIChsZCAoaW50ZXJ2YWwpKSAqLworCitzdGF0aWMgaW50IGVwX2ludF9iYWxsYW5jZSAob2hjaV90ICogb2hjaSwgaW50IGludGVydmFsLCBpbnQgbG9hZCkKK3sKKwlpbnQgaSwgYnJhbmNoID0gMDsKKworCS8qIHNlYXJjaCBmb3IgdGhlIGxlYXN0IGxvYWRlZCBpbnRlcnJ1cHQgZW5kcG9pbnQKKwkgKiBicmFuY2ggb2YgYWxsIDMyIGJyYW5jaGVzCisJICovCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCWlmIChvaGNpLT5vaGNpX2ludF9sb2FkIFticmFuY2hdID4gb2hjaS0+b2hjaV9pbnRfbG9hZCBbaV0pCisJCQlicmFuY2ggPSBpOworCisJYnJhbmNoID0gYnJhbmNoICUgaW50ZXJ2YWw7CisJZm9yIChpID0gYnJhbmNoOyBpIDwgMzI7IGkgKz0gaW50ZXJ2YWwpCisJCW9oY2ktPm9oY2lfaW50X2xvYWQgW2ldICs9IGxvYWQ7CisKKwlyZXR1cm4gYnJhbmNoOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAgMl5pbnQoIGxkIChpbnRlcikpICovCisKK3N0YXRpYyBpbnQgZXBfMl9uX2ludGVydmFsIChpbnQgaW50ZXIpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgKChpbnRlciA+PiBpKSA+IDEgKSAmJiAoaSA8IDUpOyBpKyspOworCXJldHVybiAxIDw8IGk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHRoZSBpbnQgdHJlZSBpcyBhIGJpbmFyeSB0cmVlCisgKiBpbiBvcmRlciB0byBwcm9jZXNzIGl0IHNlcXVlbnRpYWxseSB0aGUgaW5kZXhlcyBvZiB0aGUgYnJhbmNoZXMgaGF2ZSB0byBiZSBtYXBwZWQKKyAqIHRoZSBtYXBwaW5nIHJldmVyc2VzIHRoZSBiaXRzIG9mIGEgd29yZCBvZiBudW1fYml0cyBsZW5ndGggKi8KKworc3RhdGljIGludCBlcF9yZXYgKGludCBudW1fYml0cywgaW50IHdvcmQpCit7CisJaW50IGksIHdvdXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG51bV9iaXRzOyBpKyspCisJCXdvdXQgfD0gKCgod29yZCA+PiBpKSAmIDEpIDw8IChudW1fYml0cyAtIGkgLSAxKSk7CisJcmV0dXJuIHdvdXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIEVEIGhhbmRsaW5nIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogbGluayBhbiBlZCBpbnRvIG9uZSBvZiB0aGUgSEMgY2hhaW5zICovCisKK3N0YXRpYyBpbnQgZXBfbGluayAob2hjaV90ICpvaGNpLCBlZF90ICplZGkpCit7CisJdm9sYXRpbGUgZWRfdCAqZWQgPSBlZGk7CisJaW50IGludF9icmFuY2g7CisJaW50IGk7CisJaW50IGludGVyOworCWludCBpbnRlcnZhbDsKKwlpbnQgbG9hZDsKKwlfX3UzMiAqIGVkX3A7CisKKwllZC0+c3RhdGUgPSBFRF9PUEVSOworCWVkLT5pbnRfaW50ZXJ2YWwgPSAwOworCisJc3dpdGNoIChlZC0+dHlwZSkgeworCWNhc2UgUElQRV9DT05UUk9MOgorCQllZC0+aHdOZXh0RUQgPSAwOworCQlpZiAob2hjaS0+ZWRfY29udHJvbHRhaWwgPT0gTlVMTCkgeworCQkJd3JpdGVsIChlZCwgJm9oY2ktPnJlZ3MtPmVkX2NvbnRyb2xoZWFkKTsKKwkJfSBlbHNlIHsKKwkJCW9oY2ktPmVkX2NvbnRyb2x0YWlsLT5od05leHRFRCA9IG0zMl9zd2FwICgodW5zaWduZWQgbG9uZyllZCk7CisJCX0KKwkJZWQtPmVkX3ByZXYgPSBvaGNpLT5lZF9jb250cm9sdGFpbDsKKwkJaWYgKCFvaGNpLT5lZF9jb250cm9sdGFpbCAmJiAhb2hjaS0+ZWRfcm1fbGlzdFswXSAmJgorCQkJIW9oY2ktPmVkX3JtX2xpc3RbMV0gJiYgIW9oY2ktPnNsZWVwaW5nKSB7CisJCQlvaGNpLT5oY19jb250cm9sIHw9IE9IQ0lfQ1RSTF9DTEU7CisJCQl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKKwkJfQorCQlvaGNpLT5lZF9jb250cm9sdGFpbCA9IGVkaTsKKwkJYnJlYWs7CisKKwljYXNlIFBJUEVfQlVMSzoKKwkJZWQtPmh3TmV4dEVEID0gMDsKKwkJaWYgKG9oY2ktPmVkX2J1bGt0YWlsID09IE5VTEwpIHsKKwkJCXdyaXRlbCAoZWQsICZvaGNpLT5yZWdzLT5lZF9idWxraGVhZCk7CisJCX0gZWxzZSB7CisJCQlvaGNpLT5lZF9idWxrdGFpbC0+aHdOZXh0RUQgPSBtMzJfc3dhcCAoKHVuc2lnbmVkIGxvbmcpZWQpOworCQl9CisJCWVkLT5lZF9wcmV2ID0gb2hjaS0+ZWRfYnVsa3RhaWw7CisJCWlmICghb2hjaS0+ZWRfYnVsa3RhaWwgJiYgIW9oY2ktPmVkX3JtX2xpc3RbMF0gJiYKKwkJCSFvaGNpLT5lZF9ybV9saXN0WzFdICYmICFvaGNpLT5zbGVlcGluZykgeworCQkJb2hjaS0+aGNfY29udHJvbCB8PSBPSENJX0NUUkxfQkxFOworCQkJd3JpdGVsIChvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7CisJCX0KKwkJb2hjaS0+ZWRfYnVsa3RhaWwgPSBlZGk7CisJCWJyZWFrOworCisJY2FzZSBQSVBFX0lOVEVSUlVQVDoKKwkJbG9hZCA9IGVkLT5pbnRfbG9hZDsKKwkJaW50ZXJ2YWwgPSBlcF8yX25faW50ZXJ2YWwgKGVkLT5pbnRfcGVyaW9kKTsKKwkJZWQtPmludF9pbnRlcnZhbCA9IGludGVydmFsOworCQlpbnRfYnJhbmNoID0gZXBfaW50X2JhbGxhbmNlIChvaGNpLCBpbnRlcnZhbCwgbG9hZCk7CisJCWVkLT5pbnRfYnJhbmNoID0gaW50X2JyYW5jaDsKKworCQlmb3IgKGkgPSAwOyBpIDwgZXBfcmV2ICg2LCBpbnRlcnZhbCk7IGkgKz0gaW50ZXIpIHsKKwkJCWludGVyID0gMTsKKwkJCWZvciAoZWRfcCA9ICYob2hjaS0+aGNjYS0+aW50X3RhYmxlW2VwX3JldiAoNSwgaSkgKyBpbnRfYnJhbmNoXSk7CisJCQkJKCplZF9wICE9IDApICYmICgoKGVkX3QgKillZF9wKS0+aW50X2ludGVydmFsID49IGludGVydmFsKTsKKwkJCQllZF9wID0gJigoKGVkX3QgKillZF9wKS0+aHdOZXh0RUQpKQorCQkJCQlpbnRlciA9IGVwX3JldiAoNiwgKChlZF90ICopZWRfcCktPmludF9pbnRlcnZhbCk7CisJCQllZC0+aHdOZXh0RUQgPSAqZWRfcDsKKwkJCSplZF9wID0gbTMyX3N3YXAoZWQpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogc2NhbiB0aGUgcGVyaW9kaWMgdGFibGUgdG8gZmluZCBhbmQgdW5saW5rIHRoaXMgRUQgKi8KK3N0YXRpYyB2b2lkIHBlcmlvZGljX3VubGluayAoIHN0cnVjdCBvaGNpICpvaGNpLCB2b2xhdGlsZSBzdHJ1Y3QgZWQgKmVkLAorCQl1bnNpZ25lZCBpbmRleCwgdW5zaWduZWQgcGVyaW9kKQoreworCWZvciAoOyBpbmRleCA8IE5VTV9JTlRTOyBpbmRleCArPSBwZXJpb2QpIHsKKwkJX191MzIJKmVkX3AgPSAmb2hjaS0+aGNjYS0+aW50X3RhYmxlIFtpbmRleF07CisKKwkJLyogRUQgbWlnaHQgaGF2ZSBiZWVuIHVubGlua2VkIHRocm91Z2ggYW5vdGhlciBwYXRoICovCisJCXdoaWxlICgqZWRfcCAhPSAwKSB7CisJCQlpZiAoKChzdHJ1Y3QgZWQgKiltMzJfc3dhcCAoZWRfcCkpID09IGVkKSB7CisJCQkJKmVkX3AgPSBlZC0+aHdOZXh0RUQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQllZF9wID0gJiAoKChzdHJ1Y3QgZWQgKiltMzJfc3dhcCAoZWRfcCkpLT5od05leHRFRCk7CisJCX0KKwl9Cit9CisKKy8qIHVubGluayBhbiBlZCBmcm9tIG9uZSBvZiB0aGUgSEMgY2hhaW5zLgorICoganVzdCB0aGUgbGluayB0byB0aGUgZWQgaXMgdW5saW5rZWQuCisgKiB0aGUgbGluayBmcm9tIHRoZSBlZCBzdGlsbCBwb2ludHMgdG8gYW5vdGhlciBvcGVyYXRpb25hbCBlZCBvciAwCisgKiBzbyB0aGUgSEMgY2FuIGV2ZW50dWFsbHkgZmluaXNoIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSB1bmxpbmtlZCBlZCAqLworCitzdGF0aWMgaW50IGVwX3VubGluayAob2hjaV90ICpvaGNpLCBlZF90ICplZGkpCit7CisJdm9sYXRpbGUgZWRfdCAqZWQgPSBlZGk7CisJaW50IGk7CisKKwllZC0+aHdJTkZPIHw9IG0zMl9zd2FwIChPSENJX0VEX1NLSVApOworCisJc3dpdGNoIChlZC0+dHlwZSkgeworCWNhc2UgUElQRV9DT05UUk9MOgorCQlpZiAoZWQtPmVkX3ByZXYgPT0gTlVMTCkgeworCQkJaWYgKCFlZC0+aHdOZXh0RUQpIHsKKwkJCQlvaGNpLT5oY19jb250cm9sICY9IH5PSENJX0NUUkxfQ0xFOworCQkJCXdyaXRlbCAob2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCQkJfQorCQkJd3JpdGVsIChtMzJfc3dhcCAoKigoX191MzIgKikmZWQtPmh3TmV4dEVEKSksICZvaGNpLT5yZWdzLT5lZF9jb250cm9saGVhZCk7CisJCX0gZWxzZSB7CisJCQllZC0+ZWRfcHJldi0+aHdOZXh0RUQgPSBlZC0+aHdOZXh0RUQ7CisJCX0KKwkJaWYgKG9oY2ktPmVkX2NvbnRyb2x0YWlsID09IGVkKSB7CisJCQlvaGNpLT5lZF9jb250cm9sdGFpbCA9IGVkLT5lZF9wcmV2OworCQl9IGVsc2UgeworCQkJKChlZF90ICopbTMyX3N3YXAgKCooKF9fdTMyICopJmVkLT5od05leHRFRCkpKS0+ZWRfcHJldiA9IGVkLT5lZF9wcmV2OworCQl9CisJCWJyZWFrOworCisJY2FzZSBQSVBFX0JVTEs6CisJCWlmIChlZC0+ZWRfcHJldiA9PSBOVUxMKSB7CisJCQlpZiAoIWVkLT5od05leHRFRCkgeworCQkJCW9oY2ktPmhjX2NvbnRyb2wgJj0gfk9IQ0lfQ1RSTF9CTEU7CisJCQkJd3JpdGVsIChvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7CisJCQl9CisJCQl3cml0ZWwgKG0zMl9zd2FwICgqKChfX3UzMiAqKSZlZC0+aHdOZXh0RUQpKSwgJm9oY2ktPnJlZ3MtPmVkX2J1bGtoZWFkKTsKKwkJfSBlbHNlIHsKKwkJCWVkLT5lZF9wcmV2LT5od05leHRFRCA9IGVkLT5od05leHRFRDsKKwkJfQorCQlpZiAob2hjaS0+ZWRfYnVsa3RhaWwgPT0gZWQpIHsKKwkJCW9oY2ktPmVkX2J1bGt0YWlsID0gZWQtPmVkX3ByZXY7CisJCX0gZWxzZSB7CisJCQkoKGVkX3QgKiltMzJfc3dhcCAoKigoX191MzIgKikmZWQtPmh3TmV4dEVEKSkpLT5lZF9wcmV2ID0gZWQtPmVkX3ByZXY7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBJUEVfSU5URVJSVVBUOgorCQlwZXJpb2RpY191bmxpbmsgKG9oY2ksIGVkLCAwLCAxKTsKKwkJZm9yIChpID0gZWQtPmludF9icmFuY2g7IGkgPCAzMjsgaSArPSBlZC0+aW50X2ludGVydmFsKQorCQkgICAgb2hjaS0+b2hjaV9pbnRfbG9hZFtpXSAtPSBlZC0+aW50X2xvYWQ7CisJCWJyZWFrOworCX0KKwllZC0+c3RhdGUgPSBFRF9VTkxJTks7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGFkZC9yZWluaXQgYW4gZW5kcG9pbnQ7IHRoaXMgc2hvdWxkIGJlIGRvbmUgb25jZSBhdCB0aGUKKyAqIHVzYl9zZXRfY29uZmlndXJhdGlvbiBjb21tYW5kLCBidXQgdGhlIFVTQiBzdGFjayBpcyBhIGxpdHRsZSBiaXQKKyAqIHN0YXRlbGVzcyBzbyB3ZSBkbyBpdCBhdCBldmVyeSB0cmFuc2FjdGlvbiBpZiB0aGUgc3RhdGUgb2YgdGhlIGVkCisgKiBpcyBFRF9ORVcgdGhlbiBhIGR1bW15IHRkIGlzIGFkZGVkIGFuZCB0aGUgc3RhdGUgaXMgY2hhbmdlZCB0bworICogRURfVU5MSU5LIGluIGFsbCBvdGhlciBjYXNlcyB0aGUgc3RhdGUgaXMgbGVmdCB1bmNoYW5nZWQgdGhlIGVkCisgKiBpbmZvIGZpZWxkcyBhcmUgc2V0dGVkIGFueXdheSBldmVuIHRob3VnaCBtb3N0IG9mIHRoZW0gc2hvdWxkIG5vdAorICogY2hhbmdlCisgKi8KK3N0YXRpYyBlZF90ICogZXBfYWRkX2VkIChzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgdW5zaWduZWQgbG9uZyBwaXBlLAorCQlpbnQgaW50ZXJ2YWwsIGludCBsb2FkKQoreworCXRkX3QgKnRkOworCWVkX3QgKmVkX3JldDsKKwl2b2xhdGlsZSBlZF90ICplZDsKKworCWVkID0gZWRfcmV0ID0gJm9oY2lfZGV2LmVkWyh1c2JfcGlwZWVuZHBvaW50IChwaXBlKSA8PCAxKSB8CisJCQkodXNiX3BpcGVjb250cm9sIChwaXBlKT8gMDogdXNiX3BpcGVvdXQgKHBpcGUpKV07CisKKwlpZiAoKGVkLT5zdGF0ZSAmIEVEX0RFTCkgfHwgKGVkLT5zdGF0ZSAmIEVEX1VSQl9ERUwpKSB7CisJCWVycigiZXBfYWRkX2VkOiBwZW5kaW5nIGRlbGV0ZSIpOworCQkvKiBwZW5kaW5nIGRlbGV0ZSByZXF1ZXN0ICovCisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChlZC0+c3RhdGUgPT0gRURfTkVXKSB7CisJCWVkLT5od0lORk8gPSBtMzJfc3dhcCAoT0hDSV9FRF9TS0lQKTsgLyogc2tpcCBlZCAqLworCQkvKiBkdW1teSB0ZDsgZW5kIG9mIHRkIGxpc3QgZm9yIGVkICovCisJCXRkID0gdGRfYWxsb2MgKHVzYl9kZXYpOworCQllZC0+aHdUYWlsUCA9IG0zMl9zd2FwICgodW5zaWduZWQgbG9uZyl0ZCk7CisJCWVkLT5od0hlYWRQID0gZWQtPmh3VGFpbFA7CisJCWVkLT5zdGF0ZSA9IEVEX1VOTElOSzsKKwkJZWQtPnR5cGUgPSB1c2JfcGlwZXR5cGUgKHBpcGUpOworCQlvaGNpX2Rldi5lZF9jbnQrKzsKKwl9CisKKwllZC0+aHdJTkZPID0gbTMyX3N3YXAgKHVzYl9waXBlZGV2aWNlIChwaXBlKQorCQkJfCB1c2JfcGlwZWVuZHBvaW50IChwaXBlKSA8PCA3CisJCQl8ICh1c2JfcGlwZWlzb2MgKHBpcGUpPyAweDgwMDA6IDApCisJCQl8ICh1c2JfcGlwZWNvbnRyb2wgKHBpcGUpPyAwOiAodXNiX3BpcGVvdXQgKHBpcGUpPyAweDgwMDogMHgxMDAwKSkKKwkJCXwgdXNiX3BpcGVzbG93IChwaXBlKSA8PCAxMworCQkJfCB1c2JfbWF4cGFja2V0ICh1c2JfZGV2LCBwaXBlKSA8PCAxNik7CisKKwlpZiAoZWQtPnR5cGUgPT0gUElQRV9JTlRFUlJVUFQgJiYgZWQtPnN0YXRlID09IEVEX1VOTElOSykgeworCQllZC0+aW50X3BlcmlvZCA9IGludGVydmFsOworCQllZC0+aW50X2xvYWQgPSBsb2FkOworCX0KKworCXJldHVybiBlZF9yZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIFREIGhhbmRsaW5nIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZW5xdWV1ZSBuZXh0IFREIGZvciB0aGlzIFVSQiAoT0hDSSBzcGVjIDUuMi44LjIpICovCisKK3N0YXRpYyB2b2lkIHRkX2ZpbGwgKG9oY2lfdCAqb2hjaSwgdW5zaWduZWQgaW50IGluZm8sCisJdm9pZCAqZGF0YSwgaW50IGxlbiwKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgaW5kZXgsIHVyYl9wcml2X3QgKnVyYl9wcml2KQoreworCXZvbGF0aWxlIHRkX3QgICp0ZCwgKnRkX3B0OworI2lmZGVmIE9IQ0lfRklMTF9UUkFDRQorCWludCBpOworI2VuZGlmCisKKwlpZiAoaW5kZXggPiB1cmJfcHJpdi0+bGVuZ3RoKSB7CisJCWVycigiaW5kZXggPiBsZW5ndGgiKTsKKwkJcmV0dXJuOworCX0KKwkvKiB1c2UgdGhpcyB0ZCBhcyB0aGUgbmV4dCBkdW1teSAqLworCXRkX3B0ID0gdXJiX3ByaXYtPnRkIFtpbmRleF07CisJdGRfcHQtPmh3TmV4dFREID0gMDsKKworCS8qIGZpbGwgdGhlIG9sZCBkdW1teSBURCAqLworCXRkID0gdXJiX3ByaXYtPnRkIFtpbmRleF0gPSAodGRfdCAqKShtMzJfc3dhcCAodXJiX3ByaXYtPmVkLT5od1RhaWxQKSAmIH4weGYpOworCisJdGQtPmVkID0gdXJiX3ByaXYtPmVkOworCXRkLT5uZXh0X2RsX3RkID0gTlVMTDsKKwl0ZC0+aW5kZXggPSBpbmRleDsKKwl0ZC0+ZGF0YSA9IChfX3UzMilkYXRhOworI2lmZGVmIE9IQ0lfRklMTF9UUkFDRQorCWlmICgodXNiX3BpcGV0eXBlKHVyYl9wcml2LT5waXBlKSA9PSBQSVBFX0JVTEspICYmIHVzYl9waXBlb3V0KHVyYl9wcml2LT5waXBlKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCXByaW50ZigidGQtPmRhdGFbJWRdICUjMnggIixpLCAoKHVuc2lnbmVkIGNoYXIgKil0ZC0+ZGF0YSlbaV0pOworCQlwcmludGYoIlxuIik7CisJfQorI2VuZGlmCisJaWYgKCFsZW4pCisJCWRhdGEgPSAwOworCisJdGQtPmh3SU5GTyA9IG0zMl9zd2FwIChpbmZvKTsKKwl0ZC0+aHdDQlAgPSBtMzJfc3dhcCAoKHVuc2lnbmVkIGxvbmcpZGF0YSk7CisJaWYgKGRhdGEpCisJCXRkLT5od0JFID0gbTMyX3N3YXAgKCh1bnNpZ25lZCBsb25nKShkYXRhICsgbGVuIC0gMSkpOworCWVsc2UKKwkJdGQtPmh3QkUgPSAwOworCXRkLT5od05leHRURCA9IG0zMl9zd2FwICgodW5zaWduZWQgbG9uZyl0ZF9wdCk7CisKKwkvKiBhcHBlbmQgdG8gcXVldWUgKi8KKwl0ZC0+ZWQtPmh3VGFpbFAgPSB0ZC0+aHdOZXh0VEQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHByZXBhcmUgYWxsIFREcyBvZiBhIHRyYW5zZmVyICovCisKK3N0YXRpYyB2b2lkIHRkX3N1Ym1pdF9qb2IgKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAorCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICpzZXR1cCwgdXJiX3ByaXZfdCAqdXJiLCBpbnQgaW50ZXJ2YWwpCit7CisJb2hjaV90ICpvaGNpID0gJmdvaGNpOworCWludCBkYXRhX2xlbiA9IHRyYW5zZmVyX2xlbjsKKwl2b2lkICpkYXRhOworCWludCBjbnQgPSAwOworCV9fdTMyIGluZm8gPSAwOworCXVuc2lnbmVkIGludCB0b2dnbGUgPSAwOworCisJLyogT0hDSSBoYW5kbGVzIHRoZSBEQVRBLXRvZ2dsZXMgaXRzZWxmLCB3ZSBqdXN0IHVzZSB0aGUgVVNCLXRvZ2dsZSBiaXRzIGZvciByZXNldGluZyAqLworCWlmKHVzYl9nZXR0b2dnbGUoZGV2LCB1c2JfcGlwZWVuZHBvaW50KHBpcGUpLCB1c2JfcGlwZW91dChwaXBlKSkpIHsKKwkJdG9nZ2xlID0gVERfVF9UT0dHTEU7CisJfSBlbHNlIHsKKwkJdG9nZ2xlID0gVERfVF9EQVRBMDsKKwkJdXNiX3NldHRvZ2dsZShkZXYsIHVzYl9waXBlZW5kcG9pbnQocGlwZSksIHVzYl9waXBlb3V0KHBpcGUpLCAxKTsKKwl9CisJdXJiLT50ZF9jbnQgPSAwOworCWlmIChkYXRhX2xlbikKKwkJZGF0YSA9IGJ1ZmZlcjsKKwllbHNlCisJCWRhdGEgPSAwOworCisJc3dpdGNoICh1c2JfcGlwZXR5cGUgKHBpcGUpKSB7CisJY2FzZSBQSVBFX0JVTEs6CisJCWluZm8gPSB1c2JfcGlwZW91dCAocGlwZSk/CisJCQlURF9DQyB8IFREX0RQX09VVCA6IFREX0NDIHwgVERfRFBfSU4gOworCQl3aGlsZShkYXRhX2xlbiA+IDQwOTYpIHsKKwkJCXRkX2ZpbGwgKG9oY2ksIGluZm8gfCAoY250PyBURF9UX1RPR0dMRTp0b2dnbGUpLCBkYXRhLCA0MDk2LCBkZXYsIGNudCwgdXJiKTsKKwkJCWRhdGEgKz0gNDA5NjsgZGF0YV9sZW4gLT0gNDA5NjsgY250Kys7CisJCX0KKwkJaW5mbyA9IHVzYl9waXBlb3V0IChwaXBlKT8KKwkJCVREX0NDIHwgVERfRFBfT1VUIDogVERfQ0MgfCBURF9SIHwgVERfRFBfSU4gOworCQl0ZF9maWxsIChvaGNpLCBpbmZvIHwgKGNudD8gVERfVF9UT0dHTEU6dG9nZ2xlKSwgZGF0YSwgZGF0YV9sZW4sIGRldiwgY250LCB1cmIpOworCQljbnQrKzsKKworCQlpZiAoIW9oY2ktPnNsZWVwaW5nKQorCQkJd3JpdGVsIChPSENJX0JMRiwgJm9oY2ktPnJlZ3MtPmNtZHN0YXR1cyk7IC8qIHN0YXJ0IGJ1bGsgbGlzdCAqLworCQlicmVhazsKKworCWNhc2UgUElQRV9DT05UUk9MOgorCQlpbmZvID0gVERfQ0MgfCBURF9EUF9TRVRVUCB8IFREX1RfREFUQTA7CisJCXRkX2ZpbGwgKG9oY2ksIGluZm8sIHNldHVwLCA4LCBkZXYsIGNudCsrLCB1cmIpOworCQlpZiAoZGF0YV9sZW4gPiAwKSB7CisJCQlpbmZvID0gdXNiX3BpcGVvdXQgKHBpcGUpPworCQkJCVREX0NDIHwgVERfUiB8IFREX0RQX09VVCB8IFREX1RfREFUQTEgOiBURF9DQyB8IFREX1IgfCBURF9EUF9JTiB8IFREX1RfREFUQTE7CisJCQkvKiBOT1RFOiAgbWlzaGFuZGxlcyB0cmFuc2ZlcnMgPjhLLCBzb21lID40SyAqLworCQkJdGRfZmlsbCAob2hjaSwgaW5mbywgZGF0YSwgZGF0YV9sZW4sIGRldiwgY250KyssIHVyYik7CisJCX0KKwkJaW5mbyA9IHVzYl9waXBlb3V0IChwaXBlKT8KKwkJCVREX0NDIHwgVERfRFBfSU4gfCBURF9UX0RBVEExOiBURF9DQyB8IFREX0RQX09VVCB8IFREX1RfREFUQTE7CisJCXRkX2ZpbGwgKG9oY2ksIGluZm8sIGRhdGEsIDAsIGRldiwgY250KyssIHVyYik7CisJCWlmICghb2hjaS0+c2xlZXBpbmcpCisJCQl3cml0ZWwgKE9IQ0lfQ0xGLCAmb2hjaS0+cmVncy0+Y21kc3RhdHVzKTsgLyogc3RhcnQgQ29udHJvbCBsaXN0ICovCisJCWJyZWFrOworCisJY2FzZSBQSVBFX0lOVEVSUlVQVDoKKwkJaW5mbyA9IHVzYl9waXBlb3V0ICh1cmItPnBpcGUpPworCQkJVERfQ0MgfCBURF9EUF9PVVQgfCB0b2dnbGU6CisJCQlURF9DQyB8IFREX1IgfCBURF9EUF9JTiB8IHRvZ2dsZTsKKwkJdGRfZmlsbCAob2hjaSwgaW5mbywgZGF0YSwgZGF0YV9sZW4sIGRldiwgY250KyssIHVyYik7CisJCWJyZWFrOworCX0KKwlpZiAodXJiLT5sZW5ndGggIT0gY250KQorCQlkYmcoIlREIExFTkdUSCAlZCAhPSBDTlQgJWQiLCB1cmItPmxlbmd0aCwgY250KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogRG9uZSBMaXN0IGhhbmRsaW5nIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogY2FsY3VsYXRlIHRoZSB0cmFuc2ZlciBsZW5ndGggYW5kIHVwZGF0ZSB0aGUgdXJiICovCisKK3N0YXRpYyB2b2lkIGRsX3RyYW5zZmVyX2xlbmd0aCh0ZF90ICogdGQpCit7CisJX191MzIgdGRJTkZPLCB0ZEJFLCB0ZENCUDsKKwl1cmJfcHJpdl90ICpsdXJiX3ByaXYgPSB0ZC0+ZWQtPnB1cmI7CisKKwl0ZElORk8gPSBtMzJfc3dhcCAodGQtPmh3SU5GTyk7CisJdGRCRSAgID0gbTMyX3N3YXAgKHRkLT5od0JFKTsKKwl0ZENCUCAgPSBtMzJfc3dhcCAodGQtPmh3Q0JQKTsKKworCWlmICghKHVzYl9waXBldHlwZSAobHVyYl9wcml2LT5waXBlKSA9PSBQSVBFX0NPTlRST0wgJiYKKwkgICAgKCh0ZC0+aW5kZXggPT0gMCkgfHwgKHRkLT5pbmRleCA9PSBsdXJiX3ByaXYtPmxlbmd0aCAtIDEpKSkpIHsKKwkJaWYgKHRkQkUgIT0gMCkgeworCQkJaWYgKHRkLT5od0NCUCA9PSAwKQorCQkJCWx1cmJfcHJpdi0+YWN0dWFsX2xlbmd0aCArPSB0ZEJFIC0gdGQtPmRhdGEgKyAxOworCQkJZWxzZQorCQkJCWx1cmJfcHJpdi0+YWN0dWFsX2xlbmd0aCArPSB0ZENCUCAtIHRkLT5kYXRhOworCQl9CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiByZXBsaWVzIHRvIHRoZSByZXF1ZXN0IGhhdmUgdG8gYmUgb24gYSBGSUZPIGJhc2lzIHNvCisgKiB3ZSByZXZlcnNlIHRoZSByZXZlcnNlZCBkb25lLWxpc3QgKi8KKworc3RhdGljIHRkX3QgKiBkbF9yZXZlcnNlX2RvbmVfbGlzdCAob2hjaV90ICpvaGNpKQoreworCV9fdTMyIHRkX2xpc3RfaGM7CisJdGRfdCAqdGRfcmV2ID0gTlVMTDsKKwl0ZF90ICp0ZF9saXN0ID0gTlVMTDsKKwl1cmJfcHJpdl90ICpsdXJiX3ByaXYgPSBOVUxMOworCisJdGRfbGlzdF9oYyA9IG0zMl9zd2FwIChvaGNpLT5oY2NhLT5kb25lX2hlYWQpICYgMHhmZmZmZmZmMDsKKwlvaGNpLT5oY2NhLT5kb25lX2hlYWQgPSAwOworCisJd2hpbGUgKHRkX2xpc3RfaGMpIHsKKwkJdGRfbGlzdCA9ICh0ZF90ICopdGRfbGlzdF9oYzsKKworCQlpZiAoVERfQ0NfR0VUIChtMzJfc3dhcCAodGRfbGlzdC0+aHdJTkZPKSkpIHsKKwkJCWx1cmJfcHJpdiA9IHRkX2xpc3QtPmVkLT5wdXJiOworCQkJZGJnKCIgVVNCLWVycm9yL3N0YXR1czogJXggOiAlcCIsCisJCQkJCVREX0NDX0dFVCAobTMyX3N3YXAgKHRkX2xpc3QtPmh3SU5GTykpLCB0ZF9saXN0KTsKKwkJCWlmICh0ZF9saXN0LT5lZC0+aHdIZWFkUCAmIG0zMl9zd2FwICgweDEpKSB7CisJCQkJaWYgKGx1cmJfcHJpdiAmJiAoKHRkX2xpc3QtPmluZGV4ICsgMSkgPCBsdXJiX3ByaXYtPmxlbmd0aCkpIHsKKwkJCQkJdGRfbGlzdC0+ZWQtPmh3SGVhZFAgPQorCQkJCQkJKGx1cmJfcHJpdi0+dGRbbHVyYl9wcml2LT5sZW5ndGggLSAxXS0+aHdOZXh0VEQgJiBtMzJfc3dhcCAoMHhmZmZmZmZmMCkpIHwKKwkJCQkJCQkJCSh0ZF9saXN0LT5lZC0+aHdIZWFkUCAmIG0zMl9zd2FwICgweDIpKTsKKwkJCQkJbHVyYl9wcml2LT50ZF9jbnQgKz0gbHVyYl9wcml2LT5sZW5ndGggLSB0ZF9saXN0LT5pbmRleCAtIDE7CisJCQkJfSBlbHNlCisJCQkJCXRkX2xpc3QtPmVkLT5od0hlYWRQICY9IG0zMl9zd2FwICgweGZmZmZmZmYyKTsKKwkJCX0KKyNpZmRlZiBDT05GSUdfTVBDNTIwMAorCQkJdGRfbGlzdC0+aHdOZXh0VEQgPSAwOworI2VuZGlmCisJCX0KKworCQl0ZF9saXN0LT5uZXh0X2RsX3RkID0gdGRfcmV2OworCQl0ZF9yZXYgPSB0ZF9saXN0OworCQl0ZF9saXN0X2hjID0gbTMyX3N3YXAgKHRkX2xpc3QtPmh3TmV4dFREKSAmIDB4ZmZmZmZmZjA7CisJfQorCXJldHVybiB0ZF9saXN0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiB0ZCBkb25lIGxpc3QgKi8KK3N0YXRpYyBpbnQgZGxfZG9uZV9saXN0IChvaGNpX3QgKm9oY2ksIHRkX3QgKnRkX2xpc3QpCit7CisJdGRfdCAqdGRfbGlzdF9uZXh0ID0gTlVMTDsKKwllZF90ICplZDsKKwlpbnQgY2MgPSAwOworCWludCBzdGF0ID0gMDsKKwkvKiB1cmJfdCAqdXJiOyAqLworCXVyYl9wcml2X3QgKmx1cmJfcHJpdjsKKwlfX3UzMiB0ZElORk8sIGVkSGVhZFAsIGVkVGFpbFA7CisKKwl3aGlsZSAodGRfbGlzdCkgeworCQl0ZF9saXN0X25leHQgPSB0ZF9saXN0LT5uZXh0X2RsX3RkOworCisJCXRkSU5GTyA9IG0zMl9zd2FwICh0ZF9saXN0LT5od0lORk8pOworCisJCWVkID0gdGRfbGlzdC0+ZWQ7CisJCWx1cmJfcHJpdiA9IGVkLT5wdXJiOworCisJCWRsX3RyYW5zZmVyX2xlbmd0aCh0ZF9saXN0KTsKKworCQkvKiBlcnJvciBjb2RlIG9mIHRyYW5zZmVyICovCisJCWNjID0gVERfQ0NfR0VUICh0ZElORk8pOworCQlpZiAoY2MgIT0gMCkgeworCQkJZGJnKCJDb25kaXRpb25Db2RlICUjeCIsIGNjKTsKKwkJCXN0YXQgPSBjY190b19lcnJvcltjY107CisJCX0KKworCQkvKiBzZWUgaWYgdGhpcyBkb25lIGxpc3QgbWFrZXMgZm9yIGFsbCBURCdzIG9mIGN1cnJlbnQgVVJCLAorCQkgKiBhbmQgbWFyayB0aGUgVVJCIGZpbmlzaGVkIGlmIHNvICovCisJCWlmICgrKyhsdXJiX3ByaXYtPnRkX2NudCkgPT0gbHVyYl9wcml2LT5sZW5ndGgpIHsKKyNpZiAxCisJCQlpZiAoKGVkLT5zdGF0ZSAmIChFRF9PUEVSIHwgRURfVU5MSU5LKSkgJiYKKwkJCSAgICAobHVyYl9wcml2LT5zdGF0ZSAhPSBVUkJfREVMKSkKKyNlbHNlCisJCQlpZiAoKGVkLT5zdGF0ZSAmIChFRF9PUEVSIHwgRURfVU5MSU5LKSkpCisjZW5kaWYKKwkJCQlsdXJiX3ByaXYtPmZpbmlzaGVkID0gc29oY2lfcmV0dXJuX2pvYihvaGNpLAorCQkJCQkJbHVyYl9wcml2KTsKKwkJCWVsc2UKKwkJCQlkYmcoImRsX2RvbmVfbGlzdDogc3RyYW5nZS4uLCBFRCBzdGF0ZSAleCwgZWQtPnN0YXRlXG4iKTsKKwkJfSBlbHNlCisJCQlkYmcoImRsX2RvbmVfbGlzdDogcHJvY2Vzc2luZyBURCAleCwgbGVuICV4XG4iLCBsdXJiX3ByaXYtPnRkX2NudCwKKwkJCQlsdXJiX3ByaXYtPmxlbmd0aCk7CisJCWlmIChlZC0+c3RhdGUgIT0gRURfTkVXICYmCisJCQkgICh1c2JfcGlwZXR5cGUgKGx1cmJfcHJpdi0+cGlwZSkgIT0gUElQRV9JTlRFUlJVUFQpKSB7CisJCQllZEhlYWRQID0gbTMyX3N3YXAgKGVkLT5od0hlYWRQKSAmIDB4ZmZmZmZmZjA7CisJCQllZFRhaWxQID0gbTMyX3N3YXAgKGVkLT5od1RhaWxQKTsKKworCQkJLyogdW5saW5rIGVkcyBpZiB0aGV5IGFyZSBub3QgYnVzeSAqLworCQkJaWYgKChlZEhlYWRQID09IGVkVGFpbFApICYmIChlZC0+c3RhdGUgPT0gRURfT1BFUikpCisJCQkJZXBfdW5saW5rIChvaGNpLCBlZCk7CisJCX0KKworCQl0ZF9saXN0ID0gdGRfbGlzdF9uZXh0OworCX0KKwlyZXR1cm4gc3RhdDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogVmlydHVhbCBSb290IEh1YgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRGV2aWNlIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBfX3U4IHJvb3RfaHViX2Rldl9kZXNbXSA9Cit7CisJMHgxMiwJICAgIC8qCV9fdTggIGJMZW5ndGg7ICovCisJMHgwMSwJICAgIC8qCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsgRGV2aWNlICovCisJMHgxMCwJICAgIC8qCV9fdTE2IGJjZFVTQjsgdjEuMSAqLworCTB4MDEsCisJMHgwOSwJICAgIC8qCV9fdTggIGJEZXZpY2VDbGFzczsgSFVCX0NMQVNTQ09ERSAqLworCTB4MDAsCSAgICAvKglfX3U4ICBiRGV2aWNlU3ViQ2xhc3M7ICovCisJMHgwMCwJICAgIC8qCV9fdTggIGJEZXZpY2VQcm90b2NvbDsgKi8KKwkweDA4LAkgICAgLyoJX191OCAgYk1heFBhY2tldFNpemUwOyA4IEJ5dGVzICovCisJMHgwMCwJICAgIC8qCV9fdTE2IGlkVmVuZG9yOyAqLworCTB4MDAsCisJMHgwMCwJICAgIC8qCV9fdTE2IGlkUHJvZHVjdDsgKi8KKwkweDAwLAorCTB4MDAsCSAgICAvKglfX3UxNiBiY2REZXZpY2U7ICovCisJMHgwMCwKKwkweDAwLAkgICAgLyoJX191OCAgaU1hbnVmYWN0dXJlcjsgKi8KKwkweDAxLAkgICAgLyoJX191OCAgaVByb2R1Y3Q7ICovCisJMHgwMCwJICAgIC8qCV9fdTggIGlTZXJpYWxOdW1iZXI7ICovCisJMHgwMQkgICAgLyoJX191OCAgYk51bUNvbmZpZ3VyYXRpb25zOyAqLworfTsKKworLyogQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yICovCitzdGF0aWMgX191OCByb290X2h1Yl9jb25maWdfZGVzW10gPQoreworCTB4MDksCSAgICAvKglfX3U4ICBiTGVuZ3RoOyAqLworCTB4MDIsCSAgICAvKglfX3U4ICBiRGVzY3JpcHRvclR5cGU7IENvbmZpZ3VyYXRpb24gKi8KKwkweDE5LAkgICAgLyoJX191MTYgd1RvdGFsTGVuZ3RoOyAqLworCTB4MDAsCisJMHgwMSwJICAgIC8qCV9fdTggIGJOdW1JbnRlcmZhY2VzOyAqLworCTB4MDEsCSAgICAvKglfX3U4ICBiQ29uZmlndXJhdGlvblZhbHVlOyAqLworCTB4MDAsCSAgICAvKglfX3U4ICBpQ29uZmlndXJhdGlvbjsgKi8KKwkweDQwLAkgICAgLyoJX191OCAgYm1BdHRyaWJ1dGVzOworCQkgQml0IDc6IEJ1cy1wb3dlcmVkLCA2OiBTZWxmLXBvd2VyZWQsIDUgUmVtb3RlLXdha3d1cCwgNC4uMDogcmVzdmQgKi8KKwkweDAwLAkgICAgLyoJX191OCAgTWF4UG93ZXI7ICovCisKKwkvKiBpbnRlcmZhY2UgKi8KKwkweDA5LAkgICAgLyoJX191OCAgaWZfYkxlbmd0aDsgKi8KKwkweDA0LAkgICAgLyoJX191OCAgaWZfYkRlc2NyaXB0b3JUeXBlOyBJbnRlcmZhY2UgKi8KKwkweDAwLAkgICAgLyoJX191OCAgaWZfYkludGVyZmFjZU51bWJlcjsgKi8KKwkweDAwLAkgICAgLyoJX191OCAgaWZfYkFsdGVybmF0ZVNldHRpbmc7ICovCisJMHgwMSwJICAgIC8qCV9fdTggIGlmX2JOdW1FbmRwb2ludHM7ICovCisJMHgwOSwJICAgIC8qCV9fdTggIGlmX2JJbnRlcmZhY2VDbGFzczsgSFVCX0NMQVNTQ09ERSAqLworCTB4MDAsCSAgICAvKglfX3U4ICBpZl9iSW50ZXJmYWNlU3ViQ2xhc3M7ICovCisJMHgwMCwJICAgIC8qCV9fdTggIGlmX2JJbnRlcmZhY2VQcm90b2NvbDsgKi8KKwkweDAwLAkgICAgLyoJX191OCAgaWZfaUludGVyZmFjZTsgKi8KKworCS8qIGVuZHBvaW50ICovCisJMHgwNywJICAgIC8qCV9fdTggIGVwX2JMZW5ndGg7ICovCisJMHgwNSwJICAgIC8qCV9fdTggIGVwX2JEZXNjcmlwdG9yVHlwZTsgRW5kcG9pbnQgKi8KKwkweDgxLAkgICAgLyoJX191OCAgZXBfYkVuZHBvaW50QWRkcmVzczsgSU4gRW5kcG9pbnQgMSAqLworCTB4MDMsCSAgICAvKglfX3U4ICBlcF9ibUF0dHJpYnV0ZXM7IEludGVycnVwdCAqLworCTB4MDIsCSAgICAvKglfX3UxNiBlcF93TWF4UGFja2V0U2l6ZTsgKChNQVhfUk9PVF9QT1JUUyArIDEpIC8gOCAqLworCTB4MDAsCisJMHhmZgkgICAgLyoJX191OCAgZXBfYkludGVydmFsOyAyNTUgbXMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJvb3RfaHViX3N0cl9pbmRleDBbXSA9Cit7CisJMHgwNCwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KKwkweDAzLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IFN0cmluZy1kZXNjcmlwdG9yICovCisJMHgwOSwJCQkvKiAgX191OCAgbGFuZyBJRCAqLworCTB4MDQsCQkJLyogIF9fdTggIGxhbmcgSUQgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJvb3RfaHViX3N0cl9pbmRleDFbXSA9Cit7CisJMjgsCQkJLyogIF9fdTggIGJMZW5ndGg7ICovCisJMHgwMywJCQkvKiAgX191OCAgYkRlc2NyaXB0b3JUeXBlOyBTdHJpbmctZGVzY3JpcHRvciAqLworCSdPJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ0gnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknQycsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdJJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJyAnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknUicsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdvJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ28nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkndCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCScgJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ0gnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkndScsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdiJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCit9OworCisvKiBIdWIgY2xhc3Mtc3BlY2lmaWMgZGVzY3JpcHRvciBpcyBjb25zdHJ1Y3RlZCBkeW5hbWljYWxseSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIE9LKHgpCQkJbGVuID0gKHgpOyBicmVhaworI2lmZGVmIERFQlVHCisjZGVmaW5lIFdSX1JIX1NUQVQoeCkJCXtpbmZvKCJXUjpzdGF0dXMgJSM4eCIsICh4KSk7d3JpdGVsKCh4KSwgJmdvaGNpLnJlZ3MtPnJvb3RodWIuc3RhdHVzKTt9CisjZGVmaW5lIFdSX1JIX1BPUlRTVEFUKHgpCXtpbmZvKCJXUjpwb3J0c3RhdHVzWyVkXSAlIzh4Iiwgd0luZGV4LTEsICh4KSk7d3JpdGVsKCh4KSwgJmdvaGNpLnJlZ3MtPnJvb3RodWIucG9ydHN0YXR1c1t3SW5kZXgtMV0pO30KKyNlbHNlCisjZGVmaW5lIFdSX1JIX1NUQVQoeCkJCXdyaXRlbCgoeCksICZnb2hjaS5yZWdzLT5yb290aHViLnN0YXR1cykKKyNkZWZpbmUgV1JfUkhfUE9SVFNUQVQoeCkJd3JpdGVsKCh4KSwgJmdvaGNpLnJlZ3MtPnJvb3RodWIucG9ydHN0YXR1c1t3SW5kZXgtMV0pCisjZW5kaWYKKyNkZWZpbmUgUkRfUkhfU1RBVAkJcm9vdGh1Yl9zdGF0dXMoJmdvaGNpKQorI2RlZmluZSBSRF9SSF9QT1JUU1RBVAkJcm9vdGh1Yl9wb3J0c3RhdHVzKCZnb2hjaSx3SW5kZXgtMSkKKworLyogcmVxdWVzdCB0byB2aXJ0dWFsIHJvb3QgaHViICovCisKK2ludCByaF9jaGVja19wb3J0X3N0YXR1cyhvaGNpX3QgKmNvbnRyb2xsZXIpCit7CisJX191MzIgdGVtcCwgbmRwLCBpOworCWludCByZXM7CisKKwlyZXMgPSAtMTsKKwl0ZW1wID0gcm9vdGh1Yl9hIChjb250cm9sbGVyKTsKKwluZHAgPSAodGVtcCAmIFJIX0FfTkRQKTsKKyNpZmRlZiBDT05GSUdfQVQ5MUNfUFFGUF9VSFBCVUcKKwluZHAgPSAobmRwID09IDIpID8gMTowOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IG5kcDsgaSsrKSB7CisJCXRlbXAgPSByb290aHViX3BvcnRzdGF0dXMgKGNvbnRyb2xsZXIsIGkpOworCQkvKiBjaGVjayBmb3IgYSBkZXZpY2UgZGlzY29ubmVjdCAqLworCQlpZiAoKCh0ZW1wICYgKFJIX1BTX1BFU0MgfCBSSF9QU19DU0MpKSA9PQorCQkJKFJIX1BTX1BFU0MgfCBSSF9QU19DU0MpKSAmJgorCQkJKCh0ZW1wICYgUkhfUFNfQ0NTKSA9PSAwKSkgeworCQkJcmVzID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgb2hjaV9zdWJtaXRfcmhfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwKKwkJdm9pZCAqYnVmZmVyLCBpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqY21kKQoreworCXZvaWQgKiBkYXRhID0gYnVmZmVyOworCWludCBsZW5pID0gdHJhbnNmZXJfbGVuOworCWludCBsZW4gPSAwOworCWludCBzdGF0ID0gMDsKKwlfX3UzMiBkYXRhYls0XTsKKwlfX3U4ICpkYXRhX2J1ZiA9IChfX3U4ICopZGF0YWI7CisJX191MTYgYm1SVHlwZV9iUmVxOworCV9fdTE2IHdWYWx1ZTsKKwlfX3UxNiB3SW5kZXg7CisJX191MTYgd0xlbmd0aDsKKworI2lmZGVmIERFQlVHCitwa3RfcHJpbnQoTlVMTCwgZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgY21kLCAiU1VCKHJoKSIsIHVzYl9waXBlaW4ocGlwZSkpOworI2Vsc2UKKwl3YWl0X21zKDEpOworI2VuZGlmCisJaWYgKChwaXBlICYgUElQRV9JTlRFUlJVUFQpID09IFBJUEVfSU5URVJSVVBUKSB7CisJCWluZm8oIlJvb3QtSHViIHN1Ym1pdCBJUlE6IE5PVCBpbXBsZW1lbnRlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlibVJUeXBlX2JSZXEgID0gY21kLT5yZXF1ZXN0dHlwZSB8IChjbWQtPnJlcXVlc3QgPDwgOCk7CisJd1ZhbHVlCSAgICAgID0gY3B1X3RvX2xlMTYgKGNtZC0+dmFsdWUpOworCXdJbmRleAkgICAgICA9IGNwdV90b19sZTE2IChjbWQtPmluZGV4KTsKKwl3TGVuZ3RoCSAgICAgID0gY3B1X3RvX2xlMTYgKGNtZC0+bGVuZ3RoKTsKKworCWluZm8oIlJvb3QtSHViOiBhZHI6ICUyeCBjbWQoJTF4KTogJTA4eCAlMDR4ICUwNHggJTA0eCIsCisJCWRldi0+ZGV2bnVtLCA4LCBibVJUeXBlX2JSZXEsIHdWYWx1ZSwgd0luZGV4LCB3TGVuZ3RoKTsKKworCXN3aXRjaCAoYm1SVHlwZV9iUmVxKSB7CisJLyogUmVxdWVzdCBEZXN0aW5hdGlvbjoKKwkgICB3aXRob3V0IGZsYWdzOiBEZXZpY2UsCisJICAgUkhfSU5URVJGQUNFOiBpbnRlcmZhY2UsCisJICAgUkhfRU5EUE9JTlQ6IGVuZHBvaW50LAorCSAgIFJIX0NMQVNTIG1lYW5zIEhVQiBoZXJlLAorCSAgIFJIX09USEVSIHwgUkhfQ0xBU1MJYWxtb3N0IGV2ZXIgbWVhbnMgSFVCX1BPUlQgaGVyZQorCSovCisKKwljYXNlIFJIX0dFVF9TVEFUVVM6CisJCQkqKF9fdTE2ICopIGRhdGFfYnVmID0gY3B1X3RvX2xlMTYgKDEpOyBPSyAoMik7CisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfSU5URVJGQUNFOgorCQkJKihfX3UxNiAqKSBkYXRhX2J1ZiA9IGNwdV90b19sZTE2ICgwKTsgT0sgKDIpOworCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX0VORFBPSU5UOgorCQkJKihfX3UxNiAqKSBkYXRhX2J1ZiA9IGNwdV90b19sZTE2ICgwKTsgT0sgKDIpOworCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX0NMQVNTOgorCQkJKihfX3UzMiAqKSBkYXRhX2J1ZiA9IGNwdV90b19sZTMyICgKKwkJCQlSRF9SSF9TVEFUICYgfihSSF9IU19DUldFIHwgUkhfSFNfRFJXRSkpOworCQkJT0sgKDQpOworCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX09USEVSIHwgUkhfQ0xBU1M6CisJCQkqKF9fdTMyICopIGRhdGFfYnVmID0gY3B1X3RvX2xlMzIgKFJEX1JIX1BPUlRTVEFUKTsgT0sgKDQpOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfRU5EUE9JTlQ6CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCQljYXNlIChSSF9FTkRQT0lOVF9TVEFMTCk6IE9LICgwKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX0NMQVNTOgorCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQkJY2FzZSBSSF9DX0hVQl9MT0NBTF9QT1dFUjoKKwkJCQlPSygwKTsKKwkJCWNhc2UgKFJIX0NfSFVCX09WRVJfQ1VSUkVOVCk6CisJCQkJCVdSX1JIX1NUQVQoUkhfSFNfT0NJQyk7IE9LICgwKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX09USEVSIHwgUkhfQ0xBU1M6CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCQljYXNlIChSSF9QT1JUX0VOQUJMRSk6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19DQ1MgKTsgT0sgKDApOworCQkJY2FzZSAoUkhfUE9SVF9TVVNQRU5EKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BPQ0kpOyBPSyAoMCk7CisJCQljYXNlIChSSF9QT1JUX1BPV0VSKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX0xTREEpOyBPSyAoMCk7CisJCQljYXNlIChSSF9DX1BPUlRfQ09OTkVDVElPTik6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19DU0MgKTsgT0sgKDApOworCQkJY2FzZSAoUkhfQ19QT1JUX0VOQUJMRSk6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QRVNDKTsgT0sgKDApOworCQkJY2FzZSAoUkhfQ19QT1JUX1NVU1BFTkQpOgorCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfUFNTQyk7IE9LICgwKTsKKwkJCWNhc2UgKFJIX0NfUE9SVF9PVkVSX0NVUlJFTlQpOgorCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfT0NJQyk7IE9LICgwKTsKKwkJCWNhc2UgKFJIX0NfUE9SVF9SRVNFVCk6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QUlNDKTsgT0sgKDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9TRVRfRkVBVFVSRSB8IFJIX09USEVSIHwgUkhfQ0xBU1M6CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCQljYXNlIChSSF9QT1JUX1NVU1BFTkQpOgorCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfUFNTICk7IE9LICgwKTsKKwkJCWNhc2UgKFJIX1BPUlRfUkVTRVQpOiAvKiBCVUcgSU4gSFVQIENPREUgKioqKioqKioqLworCQkJCQlpZiAoUkRfUkhfUE9SVFNUQVQgJiBSSF9QU19DQ1MpCisJCQkJCSAgICBXUl9SSF9QT1JUU1RBVCAoUkhfUFNfUFJTKTsKKwkJCQkJT0sgKDApOworCQkJY2FzZSAoUkhfUE9SVF9QT1dFUik6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QUFMgKTsKKwkJCQkJd2FpdF9tcygxMDApOworCQkJCQlPSyAoMCk7CisJCQljYXNlIChSSF9QT1JUX0VOQUJMRSk6IC8qIEJVRyBJTiBIVVAgQ09ERSAqKioqKioqKiovCisJCQkJCWlmIChSRF9SSF9QT1JUU1RBVCAmIFJIX1BTX0NDUykKKwkJCQkJICAgIFdSX1JIX1BPUlRTVEFUIChSSF9QU19QRVMgKTsKKwkJCQkJT0sgKDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9TRVRfQUREUkVTUzogZ29oY2kucmguZGV2bnVtID0gd1ZhbHVlOyBPSygwKTsKKworCWNhc2UgUkhfR0VUX0RFU0NSSVBUT1I6CisJCXN3aXRjaCAoKHdWYWx1ZSAmIDB4ZmYwMCkgPj4gOCkgeworCQkJY2FzZSAoMHgwMSk6IC8qIGRldmljZSBkZXNjcmlwdG9yICovCisJCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkgIGxlbmksCisJCQkJCSAgbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkgICAgICBzaXplb2YgKHJvb3RfaHViX2Rldl9kZXMpLAorCQkJCQkgICAgICB3TGVuZ3RoKSk7CisJCQkJZGF0YV9idWYgPSByb290X2h1Yl9kZXZfZGVzOyBPSyhsZW4pOworCQkJY2FzZSAoMHgwMik6IC8qIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciAqLworCQkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJICBsZW5pLAorCQkJCQkgIG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJICAgICAgc2l6ZW9mIChyb290X2h1Yl9jb25maWdfZGVzKSwKKwkJCQkJICAgICAgd0xlbmd0aCkpOworCQkJCWRhdGFfYnVmID0gcm9vdF9odWJfY29uZmlnX2RlczsgT0sobGVuKTsKKwkJCWNhc2UgKDB4MDMpOiAvKiBzdHJpbmcgZGVzY3JpcHRvcnMgKi8KKwkJCQlpZih3VmFsdWU9PTB4MDMwMCkgeworCQkJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQkgIGxlbmksCisJCQkJCQkgIG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJCSAgICAgIHNpemVvZiAocm9vdF9odWJfc3RyX2luZGV4MCksCisJCQkJCQkgICAgICB3TGVuZ3RoKSk7CisJCQkJCWRhdGFfYnVmID0gcm9vdF9odWJfc3RyX2luZGV4MDsKKwkJCQkJT0sobGVuKTsKKwkJCQl9CisJCQkJaWYod1ZhbHVlPT0weDAzMDEpIHsKKwkJCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkJICBsZW5pLAorCQkJCQkJICBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQkgICAgICBzaXplb2YgKHJvb3RfaHViX3N0cl9pbmRleDEpLAorCQkJCQkJICAgICAgd0xlbmd0aCkpOworCQkJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX3N0cl9pbmRleDE7CisJCQkJCU9LKGxlbik7CisJCQl9CisJCQlkZWZhdWx0OgorCQkJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkhfR0VUX0RFU0NSSVBUT1IgfCBSSF9DTEFTUzoKKwl7CisJCV9fdTMyIHRlbXAgPSByb290aHViX2EgKCZnb2hjaSk7CisKKwkJZGF0YV9idWYgWzBdID0gOTsJCS8qIG1pbiBsZW5ndGg7ICovCisJCWRhdGFfYnVmIFsxXSA9IDB4Mjk7CisJCWRhdGFfYnVmIFsyXSA9IHRlbXAgJiBSSF9BX05EUDsKKyNpZmRlZiBDT05GSUdfQVQ5MUNfUFFGUF9VSFBCVUcKKwkJZGF0YV9idWYgWzJdID0gKGRhdGFfYnVmIFsyXSA9PSAyKSA/IDE6MDsKKyNlbmRpZgorCQlkYXRhX2J1ZiBbM10gPSAwOworCQlpZiAodGVtcCAmIFJIX0FfUFNNKQkvKiBwZXItcG9ydCBwb3dlciBzd2l0Y2hpbmc/ICovCisJCQlkYXRhX2J1ZiBbM10gfD0gMHgxOworCQlpZiAodGVtcCAmIFJIX0FfTk9DUCkJLyogbm8gb3ZlcmN1cnJlbnQgcmVwb3J0aW5nPyAqLworCQkJZGF0YV9idWYgWzNdIHw9IDB4MTA7CisJCWVsc2UgaWYgKHRlbXAgJiBSSF9BX09DUE0pCS8qIHBlci1wb3J0IG92ZXJjdXJyZW50IHJlcG9ydGluZz8gKi8KKwkJCWRhdGFfYnVmIFszXSB8PSAweDg7CisKKwkJLyogY29ycmVzcG9uZHMgdG8gZGF0YV9idWZbNC03XSAqLworCQlkYXRhYiBbMV0gPSAwOworCQlkYXRhX2J1ZiBbNV0gPSAodGVtcCAmIFJIX0FfUE9UUEdUKSA+PiAyNDsKKwkJdGVtcCA9IHJvb3RodWJfYiAoJmdvaGNpKTsKKwkJZGF0YV9idWYgWzddID0gdGVtcCAmIFJIX0JfRFI7CisJCWlmIChkYXRhX2J1ZiBbMl0gPCA3KSB7CisJCQlkYXRhX2J1ZiBbOF0gPSAweGZmOworCQl9IGVsc2UgeworCQkJZGF0YV9idWYgWzBdICs9IDI7CisJCQlkYXRhX2J1ZiBbOF0gPSAodGVtcCAmIFJIX0JfRFIpID4+IDg7CisJCQlkYXRhX2J1ZiBbMTBdID0gZGF0YV9idWYgWzldID0gMHhmZjsKKwkJfQorCisJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuaSwKKwkJCSAgICBtaW5fdCh1bnNpZ25lZCBpbnQsIGRhdGFfYnVmIFswXSwgd0xlbmd0aCkpOworCQlPSyAobGVuKTsKKwl9CisKKwljYXNlIFJIX0dFVF9DT05GSUdVUkFUSU9OOgkqKF9fdTggKikgZGF0YV9idWYgPSAweDAxOyBPSyAoMSk7CisKKwljYXNlIFJIX1NFVF9DT05GSUdVUkFUSU9OOglXUl9SSF9TVEFUICgweDEwMDAwKTsgT0sgKDApOworCisJZGVmYXVsdDoKKwkJZGJnICgidW5zdXBwb3J0ZWQgcm9vdCBodWIgY29tbWFuZCIpOworCQlzdGF0ID0gVVNCX1NUX1NUQUxMRUQ7CisJfQorCisjaWZkZWYJREVCVUcKKwlvaGNpX2R1bXBfcm9vdGh1YiAoJmdvaGNpLCAxKTsKKyNlbHNlCisJd2FpdF9tcygxKTsKKyNlbmRpZgorCisJbGVuID0gbWluX3QoaW50LCBsZW4sIGxlbmkpOworCWlmIChkYXRhICE9IGRhdGFfYnVmKQorCSAgICBtZW1jcHkgKGRhdGEsIGRhdGFfYnVmLCBsZW4pOworCWRldi0+YWN0X2xlbiA9IGxlbjsKKwlkZXYtPnN0YXR1cyA9IHN0YXQ7CisKKyNpZmRlZiBERUJVRworCXBrdF9wcmludChOVUxMLCBkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBjbWQsICJSRVQocmgpIiwgMC8qdXNiX3BpcGVpbihwaXBlKSovKTsKKyNlbHNlCisJd2FpdF9tcygxKTsKKyNlbmRpZgorCisJcmV0dXJuIHN0YXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGNvbW1vbiBjb2RlIGZvciBoYW5kbGluZyBzdWJtaXQgbWVzc2FnZXMgLSB1c2VkIGZvciBhbGwgYnV0IHJvb3QgaHViICovCisvKiBhY2Nlc3Nlcy4gKi8KK2ludCBzdWJtaXRfY29tbW9uX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKKwkJaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKnNldHVwLCBpbnQgaW50ZXJ2YWwpCit7CisJaW50IHN0YXQgPSAwOworCWludCBtYXhzaXplID0gdXNiX21heHBhY2tldChkZXYsIHBpcGUpOworCWludCB0aW1lb3V0OworCXVyYl9wcml2X3QgKnVyYjsKKworCXVyYiA9IG1hbGxvYyhzaXplb2YodXJiX3ByaXZfdCkpOworCW1lbXNldCh1cmIsIDAsIHNpemVvZih1cmJfcHJpdl90KSk7CisKKwl1cmItPmRldiA9IGRldjsKKwl1cmItPnBpcGUgPSBwaXBlOworCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gYnVmZmVyOworCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHRyYW5zZmVyX2xlbjsKKwl1cmItPmludGVydmFsID0gaW50ZXJ2YWw7CisKKwkvKiBkZXZpY2UgcHVsbGVkPyBTaG9ydGN1dCB0aGUgYWN0aW9uLiAqLworCWlmIChkZXZnb25lID09IGRldikgeworCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9DUkNfRVJSOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBERUJVRworCXVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CisJcGt0X3ByaW50KHVyYiwgZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsICJTVUIiLCB1c2JfcGlwZWluKHBpcGUpKTsKKyNlbHNlCisJd2FpdF9tcygxKTsKKyNlbmRpZgorCWlmICghbWF4c2l6ZSkgeworCQllcnIoInN1Ym1pdF9jb21tb25fbWVzc2FnZTogcGlwZXNpemUgZm9yIHBpcGUgJWx4IGlzIHplcm8iLAorCQkJcGlwZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc29oY2lfc3VibWl0X2pvYih1cmIsIHNldHVwKSA8IDApIHsKKwkJZXJyKCJzb2hjaV9zdWJtaXRfam9iIGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisjaWYgMAorCXdhaXRfbXMoMTApOworCS8qIG9oY2lfZHVtcF9zdGF0dXMoJmdvaGNpKTsgKi8KKyNlbmRpZgorCisJLyogYWxsb3cgbW9yZSB0aW1lIGZvciBhIEJVTEsgZGV2aWNlIHRvIHJlYWN0IC0gc29tZSBhcmUgc2xvdyAqLworI2RlZmluZSBCVUxLX1RPCSA1MDAwCS8qIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovCisJaWYgKHVzYl9waXBldHlwZSAocGlwZSkgPT0gUElQRV9CVUxLKQorCQl0aW1lb3V0ID0gQlVMS19UTzsKKwllbHNlCisJCXRpbWVvdXQgPSAxMDA7CisKKwkvKiB3YWl0IGZvciBpdCB0byBjb21wbGV0ZSAqLworCWZvciAoOzspIHsKKwkJLyogY2hlY2sgd2hldGhlciB0aGUgY29udHJvbGxlciBpcyBkb25lICovCisJCXN0YXQgPSBoY19pbnRlcnJ1cHQoKTsKKwkJaWYgKHN0YXQgPCAwKSB7CisJCQlzdGF0ID0gVVNCX1NUX0NSQ19FUlI7CisJCQlicmVhazsKKwkJfQorCisJCS8qIE5PVEU6IHNpbmNlIHdlIGFyZSBub3QgaW50ZXJydXB0IGRyaXZlbiBpbiBVLUJvb3QgYW5kIGFsd2F5cworCQkgKiBoYW5kbGUgb25seSBvbmUgVVJCIGF0IGEgdGltZSwgd2UgY2Fubm90IGFzc3VtZSB0aGUKKwkJICogdHJhbnNhY3Rpb24gZmluaXNoZWQgb24gdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20KKwkJICogaGNfaW50ZXJydXB0KCkuLiB1bmxlc3MgdGhlIGZsYWcgZm9yIGN1cnJlbnQgVVJCIGlzIHNldCwKKwkJICogbWVhbmluZyB0aGF0IGFsbCBURCdzIHRvL2Zyb20gZGV2aWNlIGdvdCBhY3R1YWxseQorCQkgKiB0cmFuc2ZlcnJlZCBhbmQgcHJvY2Vzc2VkLiBJZiB0aGUgY3VycmVudCBVUkIgaXMgbm90CisJCSAqIGZpbmlzaGVkIHdlIG5lZWQgdG8gcmUtaXRlcmF0ZSB0aGlzIGxvb3Agc28gYXMKKwkJICogaGNfaW50ZXJydXB0KCkgZ2V0cyBjYWxsZWQgYWdhaW4gYXMgdGhlcmUgbmVlZHMgdG8gYmUgc29tZQorCQkgKiBtb3JlIFREJ3MgdG8gcHJvY2VzcyBzdGlsbCAqLworCQlpZiAoKHN0YXQgPj0gMCkgJiYgKHN0YXQgIT0gMHhmZikgJiYgKHVyYi0+ZmluaXNoZWQpKSB7CisJCQkvKiAweGZmIGlzIHJldHVybmVkIGZvciBhbiBTRi1pbnRlcnJ1cHQgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKC0tdGltZW91dCkgeworCQkJd2FpdF9tcygxKTsKKwkJCWlmICghdXJiLT5maW5pc2hlZCkKKwkJCQlkYmcoIlwlIik7CisKKwkJfSBlbHNlIHsKKwkJCWVycigiQ1RMOlRJTUVPVVQgIik7CisJCQlkYmcoInN1Ym1pdF9jb21tb25fbXNnOiBUTyBzdGF0dXMgJXhcbiIsIHN0YXQpOworCQkJdXJiLT5maW5pc2hlZCA9IDE7CisJCQlzdGF0ID0gVVNCX1NUX0NSQ19FUlI7CisJCQlicmVhazsKKwkJfQorCX0KKworCWRldi0+c3RhdHVzID0gc3RhdDsKKwlkZXYtPmFjdF9sZW4gPSB0cmFuc2Zlcl9sZW47CisKKyNpZmRlZiBERUJVRworCXBrdF9wcmludCh1cmIsIGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIHNldHVwLCAiUkVUKGN0bHIpIiwgdXNiX3BpcGVpbihwaXBlKSk7CisjZWxzZQorCXdhaXRfbXMoMSk7CisjZW5kaWYKKworCS8qIGZyZWUgVERzIGluIHVyYl9wcml2ICovCisJaWYgKHVzYl9waXBldHlwZSAocGlwZSkgIT0gUElQRV9JTlRFUlJVUFQpCisJCXVyYl9mcmVlX3ByaXYgKHVyYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIHN1Ym1pdCByb3V0aW5lcyBjYWxsZWQgZnJvbSB1c2IuYyAqLworaW50IHN1Ym1pdF9idWxrX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKKwkJaW50IHRyYW5zZmVyX2xlbikKK3sKKwlpbmZvKCJzdWJtaXRfYnVsa19tc2ciKTsKKwlyZXR1cm4gc3VibWl0X2NvbW1vbl9tc2coZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgTlVMTCwgMCk7Cit9CisKK2ludCBzdWJtaXRfY29udHJvbF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICpzZXR1cCkKK3sKKwlpbnQgbWF4c2l6ZSA9IHVzYl9tYXhwYWNrZXQoZGV2LCBwaXBlKTsKKworCWluZm8oInN1Ym1pdF9jb250cm9sX21zZyIpOworI2lmZGVmIERFQlVHCisJcGt0X3ByaW50KE5VTEwsIGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIHNldHVwLCAiU1VCIiwgdXNiX3BpcGVpbihwaXBlKSk7CisjZWxzZQorCXdhaXRfbXMoMSk7CisjZW5kaWYKKwlpZiAoIW1heHNpemUpIHsKKwkJZXJyKCJzdWJtaXRfY29udHJvbF9tZXNzYWdlOiBwaXBlc2l6ZSBmb3IgcGlwZSAlbHggaXMgemVybyIsCisJCQlwaXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoKChwaXBlID4+IDgpICYgMHg3ZikgPT0gZ29oY2kucmguZGV2bnVtKSB7CisJCWdvaGNpLnJoLmRldiA9IGRldjsKKwkJLyogcm9vdCBodWIgLSByZWRpcmVjdCAqLworCQlyZXR1cm4gb2hjaV9zdWJtaXRfcmhfbXNnKGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sCisJCQlzZXR1cCk7CisJfQorCisJcmV0dXJuIHN1Ym1pdF9jb21tb25fbXNnKGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIHNldHVwLCAwKTsKK30KKworaW50IHN1Ym1pdF9pbnRfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAorCQlpbnQgdHJhbnNmZXJfbGVuLCBpbnQgaW50ZXJ2YWwpCit7CisJaW5mbygic3VibWl0X2ludF9tc2ciKTsKKwlyZXR1cm4gc3VibWl0X2NvbW1vbl9tc2coZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgTlVMTCwKKwkJCWludGVydmFsKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogSEMgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiByZXNldCB0aGUgSEMgYW5kIEJVUyAqLworCitzdGF0aWMgaW50IGhjX3Jlc2V0IChvaGNpX3QgKm9oY2kpCit7CisJaW50IHRpbWVvdXQgPSAzMDsKKwlpbnQgc21tX3RpbWVvdXQgPSA1MDsgLyogMCw1IHNlYyAqLworCisJZGJnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWlmIChyZWFkbCAoJm9oY2ktPnJlZ3MtPmNvbnRyb2wpICYgT0hDSV9DVFJMX0lSKSB7IC8qIFNNTSBvd25zIHRoZSBIQyAqLworCQl3cml0ZWwgKE9IQ0lfT0NSLCAmb2hjaS0+cmVncy0+Y21kc3RhdHVzKTsgLyogcmVxdWVzdCBvd25lcnNoaXAgKi8KKwkJaW5mbygiVVNCIEhDIFRha2VPdmVyIGZyb20gU01NIik7CisJCXdoaWxlIChyZWFkbCAoJm9oY2ktPnJlZ3MtPmNvbnRyb2wpICYgT0hDSV9DVFJMX0lSKSB7CisJCQl3YWl0X21zICgxMCk7CisJCQlpZiAoLS1zbW1fdGltZW91dCA9PSAwKSB7CisJCQkJZXJyKCJVU0IgSEMgVGFrZU92ZXIgZmFpbGVkISIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCX0KKworCS8qIERpc2FibGUgSEMgaW50ZXJydXB0cyAqLworCXdyaXRlbCAoT0hDSV9JTlRSX01JRSwgJm9oY2ktPnJlZ3MtPmludHJkaXNhYmxlKTsKKworCWRiZygiVVNCIEhDIHJlc2V0X2hjIHVzYi0lczogY3RybCA9IDB4JVggO1xuIiwKKwkJb2hjaS0+c2xvdF9uYW1lLAorCQlyZWFkbCgmb2hjaS0+cmVncy0+Y29udHJvbCkpOworCisJLyogUmVzZXQgVVNCIChuZWVkZWQgYnkgc29tZSBjb250cm9sbGVycykgKi8KKwlvaGNpLT5oY19jb250cm9sID0gMDsKKwl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKKworCS8qIEhDIFJlc2V0IHJlcXVpcmVzIG1heCAxMCB1cyBkZWxheSAqLworCXdyaXRlbCAoT0hDSV9IQ1IsICAmb2hjaS0+cmVncy0+Y21kc3RhdHVzKTsKKwl3aGlsZSAoKHJlYWRsICgmb2hjaS0+cmVncy0+Y21kc3RhdHVzKSAmIE9IQ0lfSENSKSAhPSAwKSB7CisJCWlmICgtLXRpbWVvdXQgPT0gMCkgeworCQkJZXJyKCJVU0IgSEMgcmVzZXQgdGltZWQgb3V0ISIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXVkZWxheSAoMSk7CisJfQorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTdGFydCBhbiBPSENJIGNvbnRyb2xsZXIsIHNldCB0aGUgQlVTIG9wZXJhdGlvbmFsCisgKiBlbmFibGUgaW50ZXJydXB0cworICogY29ubmVjdCB0aGUgdmlydHVhbCByb290IGh1YiAqLworCitzdGF0aWMgaW50IGhjX3N0YXJ0IChvaGNpX3QgKiBvaGNpKQoreworCV9fdTMyIG1hc2s7CisJdW5zaWduZWQgaW50IGZtaW50ZXJ2YWw7CisKKwlvaGNpLT5kaXNhYmxlZCA9IDE7CisKKwkvKiBUZWxsIHRoZSBjb250cm9sbGVyIHdoZXJlIHRoZSBjb250cm9sIGFuZCBidWxrIGxpc3RzIGFyZQorCSAqIFRoZSBsaXN0cyBhcmUgZW1wdHkgbm93LiAqLworCisJd3JpdGVsICgwLCAmb2hjaS0+cmVncy0+ZWRfY29udHJvbGhlYWQpOworCXdyaXRlbCAoMCwgJm9oY2ktPnJlZ3MtPmVkX2J1bGtoZWFkKTsKKworCXdyaXRlbCAoKF9fdTMyKW9oY2ktPmhjY2EsICZvaGNpLT5yZWdzLT5oY2NhKTsgLyogYSByZXNldCBjbGVhcnMgdGhpcyAqLworCisJZm1pbnRlcnZhbCA9IDB4MmVkZjsKKwl3cml0ZWwgKChmbWludGVydmFsICogOSkgLyAxMCwgJm9oY2ktPnJlZ3MtPnBlcmlvZGljc3RhcnQpOworCWZtaW50ZXJ2YWwgfD0gKCgoKGZtaW50ZXJ2YWwgLSAyMTApICogNikgLyA3KSA8PCAxNik7CisJd3JpdGVsIChmbWludGVydmFsLCAmb2hjaS0+cmVncy0+Zm1pbnRlcnZhbCk7CisJd3JpdGVsICgweDYyOCwgJm9oY2ktPnJlZ3MtPmxzdGhyZXNoKTsKKworCS8qIHN0YXJ0IGNvbnRyb2xsZXIgb3BlcmF0aW9ucyAqLworCW9oY2ktPmhjX2NvbnRyb2wgPSBPSENJX0NPTlRST0xfSU5JVCB8IE9IQ0lfVVNCX09QRVI7CisJb2hjaS0+ZGlzYWJsZWQgPSAwOworCXdyaXRlbCAob2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCW1hc2sgPSAoT0hDSV9JTlRSX1NPIHwgT0hDSV9JTlRSX1dESCB8IE9IQ0lfSU5UUl9TRiB8IE9IQ0lfSU5UUl9SRCB8CisJCQlPSENJX0lOVFJfVUUgfCBPSENJX0lOVFJfRk5PIHwgT0hDSV9JTlRSX1JIU0MgfAorCQkJT0hDSV9JTlRSX09DIHwgT0hDSV9JTlRSX01JRSk7CisJd3JpdGVsIChtYXNrLCAmb2hjaS0+cmVncy0+aW50cmRpc2FibGUpOworCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisJbWFzayAmPSB+T0hDSV9JTlRSX01JRTsKKwl3cml0ZWwgKG1hc2ssICZvaGNpLT5yZWdzLT5pbnRyc3RhdHVzKTsKKwkvKiBDaG9vc2UgdGhlIGludGVycnVwdHMgd2UgY2FyZSBhYm91dCBub3cgIC0gYnV0IHcvbyBNSUUgKi8KKwltYXNrID0gT0hDSV9JTlRSX1JIU0MgfCBPSENJX0lOVFJfVUUgfCBPSENJX0lOVFJfV0RIIHwgT0hDSV9JTlRSX1NPOworCXdyaXRlbCAobWFzaywgJm9oY2ktPnJlZ3MtPmludHJlbmFibGUpOworCisjaWZkZWYJT0hDSV9VU0VfTlBTCisJLyogcmVxdWlyZWQgZm9yIEFNRC03NTYgYW5kIHNvbWUgTWFjIHBsYXRmb3JtcyAqLworCXdyaXRlbCAoKHJvb3RodWJfYSAob2hjaSkgfCBSSF9BX05QUykgJiB+UkhfQV9QU00sCisJCSZvaGNpLT5yZWdzLT5yb290aHViLmEpOworCXdyaXRlbCAoUkhfSFNfTFBTQywgJm9oY2ktPnJlZ3MtPnJvb3RodWIuc3RhdHVzKTsKKyNlbmRpZgkvKiBPSENJX1VTRV9OUFMgKi8KKworI2RlZmluZSBtZGVsYXkobikgKHt1bnNpZ25lZCBsb25nIG1zZWM9KG4pOyB3aGlsZSAobXNlYy0tKSB1ZGVsYXkoMTAwMCk7fSkKKwkvKiBQT1RQR1QgZGVsYXkgaXMgYml0cyAyNC0zMSwgaW4gMiBtcyB1bml0cy4gKi8KKwltZGVsYXkgKChyb290aHViX2EgKG9oY2kpID4+IDIzKSAmIDB4MWZlKTsKKworCS8qIGNvbm5lY3QgdGhlIHZpcnR1YWwgcm9vdCBodWIgKi8KKwlvaGNpLT5yaC5kZXZudW0gPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFBvbGwgVVNCIGludGVycnVwdC4gKi8KK3ZvaWQgdXNiX2V2ZW50X3BvbGwodm9pZCkKK3sKKwloY19pbnRlcnJ1cHQoKTsKK30KKworLyogYW4gaW50ZXJydXB0IGhhcHBlbnMgKi8KKworc3RhdGljIGludCBoY19pbnRlcnJ1cHQgKHZvaWQpCit7CisJb2hjaV90ICpvaGNpID0gJmdvaGNpOworCXN0cnVjdCBvaGNpX3JlZ3MgKnJlZ3MgPSBvaGNpLT5yZWdzOworCWludCBpbnRzOworCWludCBzdGF0ID0gLTE7CisKKwlpZiAoKG9oY2ktPmhjY2EtPmRvbmVfaGVhZCAhPSAwKSAmJgorCSAgICAhKG0zMl9zd2FwIChvaGNpLT5oY2NhLT5kb25lX2hlYWQpICYgMHgwMSkpIHsKKwkJaW50cyA9ICBPSENJX0lOVFJfV0RIOworCX0gZWxzZSBpZiAoKGludHMgPSByZWFkbCAoJnJlZ3MtPmludHJzdGF0dXMpKSA9PSB+KHUzMikwKSB7CisJCW9oY2ktPmRpc2FibGVkKys7CisJCWVyciAoIiVzIGRldmljZSByZW1vdmVkISIsIG9oY2ktPnNsb3RfbmFtZSk7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgaWYgKChpbnRzICY9IHJlYWRsICgmcmVncy0+aW50cmVuYWJsZSkpID09IDApIHsKKwkJZGJnKCJoY19pbnRlcnJ1cHQ6IHJldHVybmluZy4uXG4iKTsKKwkJcmV0dXJuIDB4ZmY7CisJfQorCisJLyogZGJnKCJJbnRlcnJ1cHQ6ICV4IGZyYW1lOiAleCIsIGludHMsIGxlMTZfdG9fY3B1IChvaGNpLT5oY2NhLT5mcmFtZV9ubykpOyAqLworCisJaWYgKGludHMgJiBPSENJX0lOVFJfUkhTQykgeworCQlnb3RfcmhzYyA9IDE7CisJCXN0YXQgPSAweGZmOworCX0KKworCWlmIChpbnRzICYgT0hDSV9JTlRSX1VFKSB7CisJCW9oY2ktPmRpc2FibGVkKys7CisJCWVyciAoIk9IQ0kgVW5yZWNvdmVyYWJsZSBFcnJvciwgY29udHJvbGxlciB1c2ItJXMgZGlzYWJsZWQiLAorCQkJb2hjaS0+c2xvdF9uYW1lKTsKKwkJLyogZS5nLiBkdWUgdG8gUENJIE1hc3Rlci9UYXJnZXQgQWJvcnQgKi8KKworI2lmZGVmCURFQlVHCisJCW9oY2lfZHVtcCAob2hjaSwgMSk7CisjZWxzZQorCXdhaXRfbXMoMSk7CisjZW5kaWYKKwkJLyogRklYTUU6IGJlIG9wdGltaXN0aWMsIGhvcGUgdGhhdCBidWcgd29uJ3QgcmVwZWF0IG9mdGVuLiAqLworCQkvKiBNYWtlIHNvbWUgbm9uLWludGVycnVwdCBjb250ZXh0IHJlc3RhcnQgdGhlIGNvbnRyb2xsZXIuICovCisJCS8qIENvdW50IGFuZCBsaW1pdCB0aGUgcmV0cmllcyB0aG91Z2g7IGVpdGhlciBoYXJkd2FyZSBvciAqLworCQkvKiBzb2Z0d2FyZSBlcnJvcnMgY2FuIGdvIGZvcmV2ZXIuLi4gKi8KKwkJaGNfcmVzZXQgKG9oY2kpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGludHMgJiBPSENJX0lOVFJfV0RIKSB7CisJCXdhaXRfbXMoMSk7CisJCXdyaXRlbCAoT0hDSV9JTlRSX1dESCwgJnJlZ3MtPmludHJkaXNhYmxlKTsKKwkJKHZvaWQpcmVhZGwgKCZyZWdzLT5pbnRyZGlzYWJsZSk7IC8qIGZsdXNoICovCisJCXN0YXQgPSBkbF9kb25lX2xpc3QgKCZnb2hjaSwgZGxfcmV2ZXJzZV9kb25lX2xpc3QgKCZnb2hjaSkpOworCQl3cml0ZWwgKE9IQ0lfSU5UUl9XREgsICZyZWdzLT5pbnRyZW5hYmxlKTsKKwkJKHZvaWQpcmVhZGwgKCZyZWdzLT5pbnRyZGlzYWJsZSk7IC8qIGZsdXNoICovCisJfQorCisJaWYgKGludHMgJiBPSENJX0lOVFJfU08pIHsKKwkJZGJnKCJVU0IgU2NoZWR1bGUgb3ZlcnJ1blxuIik7CisJCXdyaXRlbCAoT0hDSV9JTlRSX1NPLCAmcmVncy0+aW50cmVuYWJsZSk7CisJCXN0YXQgPSAtMTsKKwl9CisKKwkvKiBGSVhNRTogIHRoaXMgYXNzdW1lcyBTT0YgKDEvbXMpIGludGVycnVwdHMgZG9uJ3QgZ2V0IGxvc3QuLi4gKi8KKwlpZiAoaW50cyAmIE9IQ0lfSU5UUl9TRikgeworCQl1bnNpZ25lZCBpbnQgZnJhbWUgPSBtMTZfc3dhcCAob2hjaS0+aGNjYS0+ZnJhbWVfbm8pICYgMTsKKwkJd2FpdF9tcygxKTsKKwkJd3JpdGVsIChPSENJX0lOVFJfU0YsICZyZWdzLT5pbnRyZGlzYWJsZSk7CisJCWlmIChvaGNpLT5lZF9ybV9saXN0W2ZyYW1lXSAhPSBOVUxMKQorCQkJd3JpdGVsIChPSENJX0lOVFJfU0YsICZyZWdzLT5pbnRyZW5hYmxlKTsKKwkJc3RhdCA9IDB4ZmY7CisJfQorCisJd3JpdGVsIChpbnRzLCAmcmVncy0+aW50cnN0YXR1cyk7CisJcmV0dXJuIHN0YXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIERlLWFsbG9jYXRlIGFsbCByZXNvdXJjZXMuLiAqLworCitzdGF0aWMgdm9pZCBoY19yZWxlYXNlX29oY2kgKG9oY2lfdCAqb2hjaSkKK3sKKwlkYmcgKCJVU0IgSEMgcmVsZWFzZSBvaGNpIHVzYi0lcyIsIG9oY2ktPnNsb3RfbmFtZSk7CisKKwlpZiAoIW9oY2ktPmRpc2FibGVkKQorCQloY19yZXNldCAob2hjaSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBsb3cgbGV2ZWwgaW5pdGFsaXNhdGlvbiByb3V0aW5lLCBjYWxsZWQgZnJvbSB1c2IuYworICovCitzdGF0aWMgY2hhciBvaGNpX2luaXRlZCA9IDA7CisKK2ludCB1c2JfbG93bGV2ZWxfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19QQ0lfT0hDSQorCXBjaV9kZXZfdCBwZGV2OworI2VuZGlmCisKKyNpZmRlZiBDRkdfVVNCX09IQ0lfQ1BVX0lOSVQKKwkvKiBjcHUgZGVwZW5kYW50IGluaXQgKi8KKwlpZih1c2JfY3B1X2luaXQoKSkKKwkJcmV0dXJuIC0xOworI2VuZGlmCisKKyNpZmRlZiBDRkdfVVNCX09IQ0lfQk9BUkRfSU5JVAorCS8qICBib2FyZCBkZXBlbmRhbnQgaW5pdCAqLworCWlmKHVzYl9ib2FyZF9pbml0KCkpCisJCXJldHVybiAtMTsKKyNlbmRpZgorCW1lbXNldCAoJmdvaGNpLCAwLCBzaXplb2YgKG9oY2lfdCkpOworCisJLyogYWxpZ24gdGhlIHN0b3JhZ2UgKi8KKwlpZiAoKF9fdTMyKSZnaGNjYVswXSAmIDB4ZmYpIHsKKwkJZXJyKCJIQ0NBIG5vdCBhbGlnbmVkISEiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwaGNjYSA9ICZnaGNjYVswXTsKKwlpbmZvKCJhbGlnbmVkIGdoY2NhICVwIiwgcGhjY2EpOworCW1lbXNldCgmb2hjaV9kZXYsIDAsIHNpemVvZihzdHJ1Y3Qgb2hjaV9kZXZpY2UpKTsKKwlpZiAoKF9fdTMyKSZvaGNpX2Rldi5lZFswXSAmIDB4NykgeworCQllcnIoIkVEcyBub3QgYWxpZ25lZCEhIik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtc2V0KGd0ZCwgMCwgc2l6ZW9mKHRkX3QpICogKE5VTV9URCArIDEpKTsKKwlpZiAoKF9fdTMyKWd0ZCAmIDB4NykgeworCQllcnIoIlREcyBub3QgYWxpZ25lZCEhIik7CisJCXJldHVybiAtMTsKKwl9CisJcHRkID0gZ3RkOworCWdvaGNpLmhjY2EgPSBwaGNjYTsKKwltZW1zZXQgKHBoY2NhLCAwLCBzaXplb2YgKHN0cnVjdCBvaGNpX2hjY2EpKTsKKworCWdvaGNpLmRpc2FibGVkID0gMTsKKwlnb2hjaS5zbGVlcGluZyA9IDA7CisJZ29oY2kuaXJxID0gLTE7CisjaWZkZWYgQ09ORklHX1BDSV9PSENJCisJcGRldiA9IHBjaV9maW5kX2RldmljZXMob2hjaV9wY2lfaWRzLCAwKTsKKworCWlmIChwZGV2ICE9IC0xKSB7CisJCXUxNiB2aWQsIGRpZDsKKwkJdTMyIGJhc2U7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9WRU5ET1JfSUQsICZ2aWQpOworCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfREVWSUNFX0lELCAmZGlkKTsKKwkJcHJpbnRmKCJPSENJIHBjaSBjb250cm9sbGVyICglMDR4LCAlMDR4KSBmb3VuZCBAKCVkOiVkOiVkKVxuIiwKKwkJCQl2aWQsIGRpZCwgKHBkZXYgPj4gMTYpICYgMHhmZiwKKwkJCQkocGRldiA+PiAxMSkgJiAweDFmLCAocGRldiA+PiA4KSAmIDB4Nyk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsICZiYXNlKTsKKwkJcHJpbnRmKCJPSENJIHJlZ3MgYWRkcmVzcyAweCUwOHhcbiIsIGJhc2UpOworCQlnb2hjaS5yZWdzID0gKHN0cnVjdCBvaGNpX3JlZ3MgKiliYXNlOworCX0gZWxzZQorCQlyZXR1cm4gLTE7CisjZWxzZQorCWdvaGNpLnJlZ3MgPSAoc3RydWN0IG9oY2lfcmVncyAqKUNGR19VU0JfT0hDSV9SRUdTX0JBU0U7CisjZW5kaWYKKworCWdvaGNpLmZsYWdzID0gMDsKKwlnb2hjaS5zbG90X25hbWUgPSBDRkdfVVNCX09IQ0lfU0xPVF9OQU1FOworCisJaWYgKGhjX3Jlc2V0ICgmZ29oY2kpIDwgMCkgeworCQloY19yZWxlYXNlX29oY2kgKCZnb2hjaSk7CisJCWVyciAoImNhbid0IHJlc2V0IHVzYi0lcyIsIGdvaGNpLnNsb3RfbmFtZSk7CisjaWZkZWYgQ0ZHX1VTQl9PSENJX0JPQVJEX0lOSVQKKwkJLyogYm9hcmQgZGVwZW5kYW50IGNsZWFudXAgKi8KKwkJdXNiX2JvYXJkX2luaXRfZmFpbCgpOworI2VuZGlmCisKKyNpZmRlZiBDRkdfVVNCX09IQ0lfQ1BVX0lOSVQKKwkJLyogY3B1IGRlcGVuZGFudCBjbGVhbnVwICovCisJCXVzYl9jcHVfaW5pdF9mYWlsKCk7CisjZW5kaWYKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEZJWE1FIHRoaXMgaXMgYSBzZWNvbmQgSEMgcmVzZXQ7IHdoeT8/ICovCisJLyogd3JpdGVsKGdvaGNpLmhjX2NvbnRyb2wgPSBPSENJX1VTQl9SRVNFVCwgJmdvaGNpLnJlZ3MtPmNvbnRyb2wpOworCSAgIHdhaXRfbXMoMTApOyAqLworCWlmIChoY19zdGFydCAoJmdvaGNpKSA8IDApIHsKKwkJZXJyICgiY2FuJ3Qgc3RhcnQgdXNiLSVzIiwgZ29oY2kuc2xvdF9uYW1lKTsKKwkJaGNfcmVsZWFzZV9vaGNpICgmZ29oY2kpOworCQkvKiBJbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KKyNpZmRlZiBDRkdfVVNCX09IQ0lfQk9BUkRfSU5JVAorCQkvKiBib2FyZCBkZXBlbmRhbnQgY2xlYW51cCAqLworCQl1c2JfYm9hcmRfc3RvcCgpOworI2VuZGlmCisKKyNpZmRlZiBDRkdfVVNCX09IQ0lfQ1BVX0lOSVQKKwkJLyogY3B1IGRlcGVuZGFudCBjbGVhbnVwICovCisJCXVzYl9jcHVfc3RvcCgpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisKKyNpZmRlZglERUJVRworCW9oY2lfZHVtcCAoJmdvaGNpLCAxKTsKKyNlbHNlCisJd2FpdF9tcygxKTsKKyNlbmRpZgorCW9oY2lfaW5pdGVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9sb3dsZXZlbF9zdG9wKHZvaWQpCit7CisJLyogdGhpcyBnZXRzIGNhbGxlZCByZWFsbHkgZWFybHkgLSBiZWZvcmUgdGhlIGNvbnRyb2xsZXIgaGFzICovCisJLyogZXZlbiBiZWVuIGluaXRpYWxpemVkISAqLworCWlmICghb2hjaV9pbml0ZWQpCisJCXJldHVybiAwOworCS8qIFRPRE8gcmVsZWFzZSBhbnkgaW50ZXJydXB0cywgZXRjLiAqLworCS8qIGNhbGwgaGNfcmVsZWFzZV9vaGNpKCkgaGVyZSA/ICovCisJaGNfcmVzZXQgKCZnb2hjaSk7CisKKyNpZmRlZiBDRkdfVVNCX09IQ0lfQk9BUkRfSU5JVAorCS8qIGJvYXJkIGRlcGVuZGFudCBjbGVhbnVwICovCisJaWYodXNiX2JvYXJkX3N0b3AoKSkKKwkJcmV0dXJuIC0xOworI2VuZGlmCisKKyNpZmRlZiBDRkdfVVNCX09IQ0lfQ1BVX0lOSVQKKwkvKiBjcHUgZGVwZW5kYW50IGNsZWFudXAgKi8KKwlpZih1c2JfY3B1X3N0b3AoKSkKKwkJcmV0dXJuIC0xOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfVVNCX09IQ0lfTkVXICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYl9vaGNpLmggYi9kcml2ZXJzL3VzYl9vaGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwY2I0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiX29oY2kuaApAQCAtMCwwICsxLDQ0NSBAQAorLyoKKyAqIFVSQiBPSENJIEhDRCAoSG9zdCBDb250cm9sbGVyIERyaXZlcikgZm9yIFVTQi4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDE5OTkgUm9tYW4gV2Vpc3NnYWVyYmVyIDx3ZWlzc2dAdmllbm5hLmF0PgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDEgRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogdXNiLW9oY2kuaAorICovCisKKy8qIGZ1bmN0aW9ucyBmb3IgZG9pbmcgYm9hcmQgb3IgQ1BVIHNwZWNpZmljIHNldHVwL2NsZWFudXAgKi8KK2V4dGVybiBpbnQgdXNiX2JvYXJkX2luaXQodm9pZCk7CitleHRlcm4gaW50IHVzYl9ib2FyZF9zdG9wKHZvaWQpOworZXh0ZXJuIGludCB1c2JfYm9hcmRfaW5pdF9mYWlsKHZvaWQpOworCitleHRlcm4gaW50IHVzYl9jcHVfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgdXNiX2NwdV9zdG9wKHZvaWQpOworZXh0ZXJuIGludCB1c2JfY3B1X2luaXRfZmFpbCh2b2lkKTsKKworCitzdGF0aWMgaW50IGNjX3RvX2Vycm9yWzE2XSA9IHsKKworLyogbWFwcGluZyBvZiB0aGUgT0hDSSBDQyBzdGF0dXMgdG8gZXJyb3IgY29kZXMgKi8KKwkvKiBObyAgRXJyb3IgICovCSAgICAgICAwLAorCS8qIENSQyBFcnJvciAgKi8JICAgICAgIFVTQl9TVF9DUkNfRVJSLAorCS8qIEJpdCBTdHVmZiAgKi8JICAgICAgIFVTQl9TVF9CSVRfRVJSLAorCS8qIERhdGEgVG9nZyAgKi8JICAgICAgIFVTQl9TVF9DUkNfRVJSLAorCS8qIFN0YWxsICAgICAgKi8JICAgICAgIFVTQl9TVF9TVEFMTEVELAorCS8qIERldk5vdFJlc3AgKi8JICAgICAgIC0xLAorCS8qIFBJRENoZWNrICAgKi8JICAgICAgIFVTQl9TVF9CSVRfRVJSLAorCS8qIFVuRXhwUElEICAgKi8JICAgICAgIFVTQl9TVF9CSVRfRVJSLAorCS8qIERhdGFPdmVyICAgKi8JICAgICAgIFVTQl9TVF9CVUZfRVJSLAorCS8qIERhdGFVbmRlciAgKi8JICAgICAgIFVTQl9TVF9CVUZfRVJSLAorCS8qIHJlc2VydmQgICAgKi8JICAgICAgIC0xLAorCS8qIHJlc2VydmQgICAgKi8JICAgICAgIC0xLAorCS8qIEJ1ZmZlck92ZXIgKi8JICAgICAgIFVTQl9TVF9CVUZfRVJSLAorCS8qIEJ1ZmZVbmRlciAgKi8JICAgICAgIFVTQl9TVF9CVUZfRVJSLAorCS8qIE5vdCBBY2Nlc3MgKi8JICAgICAgIC0xLAorCS8qIE5vdCBBY2Nlc3MgKi8JICAgICAgIC0xCit9OworCisvKiBFRCBTdGF0ZXMgKi8KKworI2RlZmluZSBFRF9ORVcJCTB4MDAKKyNkZWZpbmUgRURfVU5MSU5LCTB4MDEKKyNkZWZpbmUgRURfT1BFUgkJMHgwMgorI2RlZmluZSBFRF9ERUwJCTB4MDQKKyNkZWZpbmUgRURfVVJCX0RFTAkweDA4CisKKy8qIHVzYl9vaGNpX2VkICovCitzdHJ1Y3QgZWQgeworCV9fdTMyIGh3SU5GTzsKKwlfX3UzMiBod1RhaWxQOworCV9fdTMyIGh3SGVhZFA7CisJX191MzIgaHdOZXh0RUQ7CisKKwlzdHJ1Y3QgZWQgKmVkX3ByZXY7CisJX191OCBpbnRfcGVyaW9kOworCV9fdTggaW50X2JyYW5jaDsKKwlfX3U4IGludF9sb2FkOworCV9fdTggaW50X2ludGVydmFsOworCV9fdTggc3RhdGU7CisJX191OCB0eXBlOworCV9fdTE2IGxhc3RfaXNvOworCXN0cnVjdCBlZCAqZWRfcm1fbGlzdDsKKworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OworCXZvaWQgKnB1cmI7CisJX191MzIgdW51c2VkWzJdOworfSBfX2F0dHJpYnV0ZSgoYWxpZ25lZCgxNikpKTsKK3R5cGVkZWYgc3RydWN0IGVkIGVkX3Q7CisKKworLyogVEQgaW5mbyBmaWVsZCAqLworI2RlZmluZSBURF9DQwkgICAgMHhmMDAwMDAwMAorI2RlZmluZSBURF9DQ19HRVQodGRfcCkgKCh0ZF9wID4+MjgpICYgMHgwZikKKyNkZWZpbmUgVERfQ0NfU0VUKHRkX3AsIGNjKSAodGRfcCkgPSAoKHRkX3ApICYgMHgwZmZmZmZmZikgfCAoKChjYykgJiAweDBmKSA8PCAyOCkKKyNkZWZpbmUgVERfRUMJICAgIDB4MEMwMDAwMDAKKyNkZWZpbmUgVERfVAkgICAgMHgwMzAwMDAwMAorI2RlZmluZSBURF9UX0RBVEEwICAweDAyMDAwMDAwCisjZGVmaW5lIFREX1RfREFUQTEgIDB4MDMwMDAwMDAKKyNkZWZpbmUgVERfVF9UT0dHTEUgMHgwMDAwMDAwMAorI2RlZmluZSBURF9SCSAgICAweDAwMDQwMDAwCisjZGVmaW5lIFREX0RJCSAgICAweDAwRTAwMDAwCisjZGVmaW5lIFREX0RJX1NFVChYKSAoKChYKSAmIDB4MDcpPDwgMjEpCisjZGVmaW5lIFREX0RQCSAgICAweDAwMTgwMDAwCisjZGVmaW5lIFREX0RQX1NFVFVQIDB4MDAwMDAwMDAKKyNkZWZpbmUgVERfRFBfSU4gICAgMHgwMDEwMDAwMAorI2RlZmluZSBURF9EUF9PVVQgICAweDAwMDgwMDAwCisKKyNkZWZpbmUgVERfSVNPCSAgICAweDAwMDEwMDAwCisjZGVmaW5lIFREX0RFTAkgICAgMHgwMDAyMDAwMAorCisvKiBDQyBDb2RlcyAqLworI2RlZmluZSBURF9DQ19OT0VSUk9SCSAgIDB4MDAKKyNkZWZpbmUgVERfQ0NfQ1JDCSAgIDB4MDEKKyNkZWZpbmUgVERfQ0NfQklUU1RVRkZJTkcgIDB4MDIKKyNkZWZpbmUgVERfQ0NfREFUQVRPR0dMRU0gIDB4MDMKKyNkZWZpbmUgVERfQ0NfU1RBTEwJICAgMHgwNAorI2RlZmluZSBURF9ERVZOT1RSRVNQCSAgIDB4MDUKKyNkZWZpbmUgVERfUElEQ0hFQ0tGQUlMCSAgIDB4MDYKKyNkZWZpbmUgVERfVU5FWFBFQ1RFRFBJRCAgIDB4MDcKKyNkZWZpbmUgVERfREFUQU9WRVJSVU4JICAgMHgwOAorI2RlZmluZSBURF9EQVRBVU5ERVJSVU4JICAgMHgwOQorI2RlZmluZSBURF9CVUZGRVJPVkVSUlVOICAgMHgwQworI2RlZmluZSBURF9CVUZGRVJVTkRFUlJVTiAgMHgwRAorI2RlZmluZSBURF9OT1RBQ0NFU1NFRAkgICAweDBGCisKKworI2RlZmluZSBNQVhQU1cgMQorCitzdHJ1Y3QgdGQgeworCV9fdTMyIGh3SU5GTzsKKwlfX3UzMiBod0NCUDsJCS8qIEN1cnJlbnQgQnVmZmVyIFBvaW50ZXIgKi8KKwlfX3UzMiBod05leHRURDsJCS8qIE5leHQgVEQgUG9pbnRlciAqLworCV9fdTMyIGh3QkU7CQkvKiBNZW1vcnkgQnVmZmVyIEVuZCBQb2ludGVyICovCisKKy8qICNpZm5kZWYgQ09ORklHX01QQzUyMDAgL1wqIHRoaXMgc2VlbXMgd3JvbmcgKlwvICovCisJX191MTYgaHdQU1dbTUFYUFNXXTsKKy8qICNlbmRpZiAqLworCV9fdTggdW51c2VkOworCV9fdTggaW5kZXg7CisJc3RydWN0IGVkICplZDsKKwlzdHJ1Y3QgdGQgKm5leHRfZGxfdGQ7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXY7CisJaW50IHRyYW5zZmVyX2xlbjsKKwlfX3UzMiBkYXRhOworCisJX191MzIgdW51c2VkMlsyXTsKK30gX19hdHRyaWJ1dGUoKGFsaWduZWQoMzIpKSk7Cit0eXBlZGVmIHN0cnVjdCB0ZCB0ZF90OworCisjZGVmaW5lIE9IQ0lfRURfU0tJUAkoMSA8PCAxNCkKKworLyoKKyAqIFRoZSBIQ0NBIChIb3N0IENvbnRyb2xsZXIgQ29tbXVuaWNhdGlvbnMgQXJlYSkgaXMgYSAyNTYgYnl0ZQorICogc3RydWN0dXJlIGRlZmluZWQgaW4gdGhlIE9IQ0kgc3BlYy4gdGhhdCB0aGUgaG9zdCBjb250cm9sbGVyIGlzCisgKiB0b2xkIHRoZSBiYXNlIGFkZHJlc3Mgb2YuICBJdCBtdXN0IGJlIDI1Ni1ieXRlIGFsaWduZWQuCisgKi8KKworI2RlZmluZSBOVU1fSU5UUyAzMgkvKiBwYXJ0IG9mIHRoZSBPSENJIHN0YW5kYXJkICovCitzdHJ1Y3Qgb2hjaV9oY2NhIHsKKwlfX3UzMglpbnRfdGFibGVbTlVNX0lOVFNdOwkvKiBJbnRlcnJ1cHQgRUQgdGFibGUgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19NUEM1MjAwKQorCV9fdTE2CXBhZDE7CQkJLyogc2V0IHRvIDAgb24gZWFjaCBmcmFtZV9ubyBjaGFuZ2UgKi8KKwlfX3UxNglmcmFtZV9ubzsJCS8qIGN1cnJlbnQgZnJhbWUgbnVtYmVyICovCisjZWxzZQorCV9fdTE2CWZyYW1lX25vOwkJLyogY3VycmVudCBmcmFtZSBudW1iZXIgKi8KKwlfX3UxNglwYWQxOwkJCS8qIHNldCB0byAwIG9uIGVhY2ggZnJhbWVfbm8gY2hhbmdlICovCisjZW5kaWYKKwlfX3UzMglkb25lX2hlYWQ7CQkvKiBpbmZvIHJldHVybmVkIGZvciBhbiBpbnRlcnJ1cHQgKi8KKwl1OAkJcmVzZXJ2ZWRfZm9yX2hjWzExNl07Cit9IF9fYXR0cmlidXRlKChhbGlnbmVkKDI1NikpKTsKKworCisvKgorICogTWF4aW11bSBudW1iZXIgb2Ygcm9vdCBodWIgcG9ydHMuCisgKi8KKyNpZm5kZWYgQ0ZHX1VTQl9PSENJX01BWF9ST09UX1BPUlRTCisjIGVycm9yICJDRkdfVVNCX09IQ0lfTUFYX1JPT1RfUE9SVFMgdW5kZWZpbmVkISIKKyNlbmRpZgorCisvKgorICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBPSENJIGNvbnRyb2xsZXIncyBtZW1vcnkgbWFwcGVkIEkvTworICogcmVnaW9uLiAgVGhpcyBpcyBNZW1vcnkgTWFwcGVkIEkvTy4JWW91IG11c3QgdXNlIHRoZSByZWFkbCgpIGFuZAorICogd3JpdGVsKCkgbWFjcm9zIGRlZmluZWQgaW4gYXNtL2lvLmggdG8gYWNjZXNzIHRoZXNlISEKKyAqLworc3RydWN0IG9oY2lfcmVncyB7CisJLyogY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVycyAqLworCV9fdTMyCXJldmlzaW9uOworCV9fdTMyCWNvbnRyb2w7CisJX191MzIJY21kc3RhdHVzOworCV9fdTMyCWludHJzdGF0dXM7CisJX191MzIJaW50cmVuYWJsZTsKKwlfX3UzMglpbnRyZGlzYWJsZTsKKwkvKiBtZW1vcnkgcG9pbnRlcnMgKi8KKwlfX3UzMgloY2NhOworCV9fdTMyCWVkX3BlcmlvZGN1cnJlbnQ7CisJX191MzIJZWRfY29udHJvbGhlYWQ7CisJX191MzIJZWRfY29udHJvbGN1cnJlbnQ7CisJX191MzIJZWRfYnVsa2hlYWQ7CisJX191MzIJZWRfYnVsa2N1cnJlbnQ7CisJX191MzIJZG9uZWhlYWQ7CisJLyogZnJhbWUgY291bnRlcnMgKi8KKwlfX3UzMglmbWludGVydmFsOworCV9fdTMyCWZtcmVtYWluaW5nOworCV9fdTMyCWZtbnVtYmVyOworCV9fdTMyCXBlcmlvZGljc3RhcnQ7CisJX191MzIJbHN0aHJlc2g7CisJLyogUm9vdCBodWIgcG9ydHMgKi8KKwlzdHJ1Y3QJb2hjaV9yb290aHViX3JlZ3MgeworCQlfX3UzMglhOworCQlfX3UzMgliOworCQlfX3UzMglzdGF0dXM7CisJCV9fdTMyCXBvcnRzdGF0dXNbQ0ZHX1VTQl9PSENJX01BWF9ST09UX1BPUlRTXTsKKwl9IHJvb3RodWI7Cit9IF9fYXR0cmlidXRlKChhbGlnbmVkKDMyKSkpOworCisKKy8qIE9IQ0kgQ09OVFJPTCBBTkQgU1RBVFVTIFJFR0lTVEVSIE1BU0tTICovCisKKy8qCisgKiBIY0NvbnRyb2wgKGNvbnRyb2wpIHJlZ2lzdGVyIG1hc2tzCisgKi8KKyNkZWZpbmUgT0hDSV9DVFJMX0NCU1IJKDMgPDwgMCkJLyogY29udHJvbC9idWxrIHNlcnZpY2UgcmF0aW8gKi8KKyNkZWZpbmUgT0hDSV9DVFJMX1BMRQkoMSA8PCAyKQkvKiBwZXJpb2RpYyBsaXN0IGVuYWJsZSAqLworI2RlZmluZSBPSENJX0NUUkxfSUUJKDEgPDwgMykJLyogaXNvY2hyb25vdXMgZW5hYmxlICovCisjZGVmaW5lIE9IQ0lfQ1RSTF9DTEUJKDEgPDwgNCkJLyogY29udHJvbCBsaXN0IGVuYWJsZSAqLworI2RlZmluZSBPSENJX0NUUkxfQkxFCSgxIDw8IDUpCS8qIGJ1bGsgbGlzdCBlbmFibGUgKi8KKyNkZWZpbmUgT0hDSV9DVFJMX0hDRlMJKDMgPDwgNikJLyogaG9zdCBjb250cm9sbGVyIGZ1bmN0aW9uYWwgc3RhdGUgKi8KKyNkZWZpbmUgT0hDSV9DVFJMX0lSCSgxIDw8IDgpCS8qIGludGVycnVwdCByb3V0aW5nICovCisjZGVmaW5lIE9IQ0lfQ1RSTF9SV0MJKDEgPDwgOSkJLyogcmVtb3RlIHdha2V1cCBjb25uZWN0ZWQgKi8KKyNkZWZpbmUgT0hDSV9DVFJMX1JXRQkoMSA8PCAxMCkJLyogcmVtb3RlIHdha2V1cCBlbmFibGUgKi8KKworLyogcHJlLXNoaWZ0ZWQgdmFsdWVzIGZvciBIQ0ZTICovCisjCWRlZmluZSBPSENJX1VTQl9SRVNFVAkoMCA8PCA2KQorIwlkZWZpbmUgT0hDSV9VU0JfUkVTVU1FCSgxIDw8IDYpCisjCWRlZmluZSBPSENJX1VTQl9PUEVSCSgyIDw8IDYpCisjCWRlZmluZSBPSENJX1VTQl9TVVNQRU5EICgzIDw8IDYpCisKKy8qCisgKiBIY0NvbW1hbmRTdGF0dXMgKGNtZHN0YXR1cykgcmVnaXN0ZXIgbWFza3MKKyAqLworI2RlZmluZSBPSENJX0hDUgkoMSA8PCAwKQkvKiBob3N0IGNvbnRyb2xsZXIgcmVzZXQgKi8KKyNkZWZpbmUgT0hDSV9DTEYJKDEgPDwgMSkJLyogY29udHJvbCBsaXN0IGZpbGxlZCAqLworI2RlZmluZSBPSENJX0JMRgkoMSA8PCAyKQkvKiBidWxrIGxpc3QgZmlsbGVkICovCisjZGVmaW5lIE9IQ0lfT0NSCSgxIDw8IDMpCS8qIG93bmVyc2hpcCBjaGFuZ2UgcmVxdWVzdCAqLworI2RlZmluZSBPSENJX1NPQwkoMyA8PCAxNikJLyogc2NoZWR1bGluZyBvdmVycnVuIGNvdW50ICovCisKKy8qCisgKiBtYXNrcyB1c2VkIHdpdGggaW50ZXJydXB0IHJlZ2lzdGVyczoKKyAqIEhjSW50ZXJydXB0U3RhdHVzIChpbnRyc3RhdHVzKQorICogSGNJbnRlcnJ1cHRFbmFibGUgKGludHJlbmFibGUpCisgKiBIY0ludGVycnVwdERpc2FibGUgKGludHJkaXNhYmxlKQorICovCisjZGVmaW5lIE9IQ0lfSU5UUl9TTwkoMSA8PCAwKQkvKiBzY2hlZHVsaW5nIG92ZXJydW4gKi8KKyNkZWZpbmUgT0hDSV9JTlRSX1dESAkoMSA8PCAxKQkvKiB3cml0ZWJhY2sgb2YgZG9uZV9oZWFkICovCisjZGVmaW5lIE9IQ0lfSU5UUl9TRgkoMSA8PCAyKQkvKiBzdGFydCBmcmFtZSAqLworI2RlZmluZSBPSENJX0lOVFJfUkQJKDEgPDwgMykJLyogcmVzdW1lIGRldGVjdCAqLworI2RlZmluZSBPSENJX0lOVFJfVUUJKDEgPDwgNCkJLyogdW5yZWNvdmVyYWJsZSBlcnJvciAqLworI2RlZmluZSBPSENJX0lOVFJfRk5PCSgxIDw8IDUpCS8qIGZyYW1lIG51bWJlciBvdmVyZmxvdyAqLworI2RlZmluZSBPSENJX0lOVFJfUkhTQwkoMSA8PCA2KQkvKiByb290IGh1YiBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lIE9IQ0lfSU5UUl9PQwkoMSA8PCAzMCkJLyogb3duZXJzaGlwIGNoYW5nZSAqLworI2RlZmluZSBPSENJX0lOVFJfTUlFCSgxIDw8IDMxKQkvKiBtYXN0ZXIgaW50ZXJydXB0IGVuYWJsZSAqLworCisKKy8qIFZpcnR1YWwgUm9vdCBIVUIgKi8KK3N0cnVjdCB2aXJ0X3Jvb3RfaHViIHsKKwlpbnQgZGV2bnVtOyAvKiBBZGRyZXNzIG9mIFJvb3QgSHViIGVuZHBvaW50ICovCisJdm9pZCAqZGV2OyAgLyogd2FzIHVyYiAqLworCXZvaWQgKmludF9hZGRyOworCWludCBzZW5kOworCWludCBpbnRlcnZhbDsKK307CisKKy8qIFVTQiBIVUIgQ09OU1RBTlRTIChub3QgT0hDSS1zcGVjaWZpYzsgc2VlIGh1Yi5oKSAqLworCisvKiBkZXN0aW5hdGlvbiBvZiByZXF1ZXN0ICovCisjZGVmaW5lIFJIX0lOVEVSRkFDRQkJICAgMHgwMQorI2RlZmluZSBSSF9FTkRQT0lOVAkJICAgMHgwMgorI2RlZmluZSBSSF9PVEhFUgkJICAgMHgwMworCisjZGVmaW5lIFJIX0NMQVNTCQkgICAweDIwCisjZGVmaW5lIFJIX1ZFTkRPUgkJICAgMHg0MAorCisvKiBSZXF1ZXN0czogYlJlcXVlc3QgPDwgOCB8IGJtUmVxdWVzdFR5cGUgKi8KKyNkZWZpbmUgUkhfR0VUX1NUQVRVUwkJMHgwMDgwCisjZGVmaW5lIFJIX0NMRUFSX0ZFQVRVUkUJMHgwMTAwCisjZGVmaW5lIFJIX1NFVF9GRUFUVVJFCQkweDAzMDAKKyNkZWZpbmUgUkhfU0VUX0FERFJFU1MJCTB4MDUwMAorI2RlZmluZSBSSF9HRVRfREVTQ1JJUFRPUgkweDA2ODAKKyNkZWZpbmUgUkhfU0VUX0RFU0NSSVBUT1IJMHgwNzAwCisjZGVmaW5lIFJIX0dFVF9DT05GSUdVUkFUSU9OCTB4MDg4MAorI2RlZmluZSBSSF9TRVRfQ09ORklHVVJBVElPTgkweDA5MDAKKyNkZWZpbmUgUkhfR0VUX1NUQVRFCQkweDAyODAKKyNkZWZpbmUgUkhfR0VUX0lOVEVSRkFDRQkweDBBODAKKyNkZWZpbmUgUkhfU0VUX0lOVEVSRkFDRQkweDBCMDAKKyNkZWZpbmUgUkhfU1lOQ19GUkFNRQkJMHgwQzgwCisvKiBPdXIgVmVuZG9yIFNwZWNpZmljIFJlcXVlc3QgKi8KKyNkZWZpbmUgUkhfU0VUX0VQCQkweDIwMDAKKworCisvKiBIdWIgcG9ydCBmZWF0dXJlcyAqLworI2RlZmluZSBSSF9QT1JUX0NPTk5FQ1RJT04JICAgMHgwMAorI2RlZmluZSBSSF9QT1JUX0VOQUJMRQkJICAgMHgwMQorI2RlZmluZSBSSF9QT1JUX1NVU1BFTkQJCSAgIDB4MDIKKyNkZWZpbmUgUkhfUE9SVF9PVkVSX0NVUlJFTlQJICAgMHgwMworI2RlZmluZSBSSF9QT1JUX1JFU0VUCQkgICAweDA0CisjZGVmaW5lIFJIX1BPUlRfUE9XRVIJCSAgIDB4MDgKKyNkZWZpbmUgUkhfUE9SVF9MT1dfU1BFRUQJICAgMHgwOQorCisjZGVmaW5lIFJIX0NfUE9SVF9DT05ORUNUSU9OCSAgIDB4MTAKKyNkZWZpbmUgUkhfQ19QT1JUX0VOQUJMRQkgICAweDExCisjZGVmaW5lIFJIX0NfUE9SVF9TVVNQRU5ECSAgIDB4MTIKKyNkZWZpbmUgUkhfQ19QT1JUX09WRVJfQ1VSUkVOVAkgICAweDEzCisjZGVmaW5lIFJIX0NfUE9SVF9SRVNFVAkJICAgMHgxNAorCisvKiBIdWIgZmVhdHVyZXMgKi8KKyNkZWZpbmUgUkhfQ19IVUJfTE9DQUxfUE9XRVIJICAgMHgwMAorI2RlZmluZSBSSF9DX0hVQl9PVkVSX0NVUlJFTlQJICAgMHgwMQorCisjZGVmaW5lIFJIX0RFVklDRV9SRU1PVEVfV0FLRVVQCSAgIDB4MDAKKyNkZWZpbmUgUkhfRU5EUE9JTlRfU1RBTEwJICAgMHgwMQorCisjZGVmaW5lIFJIX0FDSwkJCSAgIDB4MDEKKyNkZWZpbmUgUkhfUkVRX0VSUgkJICAgLTEKKyNkZWZpbmUgUkhfTkFDSwkJCSAgIDB4MDAKKworCisvKiBPSENJIFJPT1QgSFVCIFJFR0lTVEVSIE1BU0tTICovCisKKy8qIHJvb3RodWIucG9ydHN0YXR1cyBbaV0gYml0cyAqLworI2RlZmluZSBSSF9QU19DQ1MJICAgICAweDAwMDAwMDAxCQkvKiBjdXJyZW50IGNvbm5lY3Qgc3RhdHVzICovCisjZGVmaW5lIFJIX1BTX1BFUwkgICAgIDB4MDAwMDAwMDIJCS8qIHBvcnQgZW5hYmxlIHN0YXR1cyovCisjZGVmaW5lIFJIX1BTX1BTUwkgICAgIDB4MDAwMDAwMDQJCS8qIHBvcnQgc3VzcGVuZCBzdGF0dXMgKi8KKyNkZWZpbmUgUkhfUFNfUE9DSQkgICAgIDB4MDAwMDAwMDgJCS8qIHBvcnQgb3ZlciBjdXJyZW50IGluZGljYXRvciAqLworI2RlZmluZSBSSF9QU19QUlMJICAgICAweDAwMDAwMDEwCQkvKiBwb3J0IHJlc2V0IHN0YXR1cyAqLworI2RlZmluZSBSSF9QU19QUFMJICAgICAweDAwMDAwMTAwCQkvKiBwb3J0IHBvd2VyIHN0YXR1cyAqLworI2RlZmluZSBSSF9QU19MU0RBCSAgICAgMHgwMDAwMDIwMAkJLyogbG93IHNwZWVkIGRldmljZSBhdHRhY2hlZCAqLworI2RlZmluZSBSSF9QU19DU0MJICAgICAweDAwMDEwMDAwCQkvKiBjb25uZWN0IHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUgUkhfUFNfUEVTQwkgICAgIDB4MDAwMjAwMDAJCS8qIHBvcnQgZW5hYmxlIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUgUkhfUFNfUFNTQwkgICAgIDB4MDAwNDAwMDAJCS8qIHBvcnQgc3VzcGVuZCBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lIFJIX1BTX09DSUMJICAgICAweDAwMDgwMDAwCQkvKiBvdmVyIGN1cnJlbnQgaW5kaWNhdG9yIGNoYW5nZSAqLworI2RlZmluZSBSSF9QU19QUlNDCSAgICAgMHgwMDEwMDAwMAkJLyogcG9ydCByZXNldCBzdGF0dXMgY2hhbmdlICovCisKKy8qIHJvb3RodWIuc3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUgUkhfSFNfTFBTCSAgICAgMHgwMDAwMDAwMQkJLyogbG9jYWwgcG93ZXIgc3RhdHVzICovCisjZGVmaW5lIFJIX0hTX09DSQkgICAgIDB4MDAwMDAwMDIJCS8qIG92ZXIgY3VycmVudCBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgUkhfSFNfRFJXRQkgICAgIDB4MDAwMDgwMDAJCS8qIGRldmljZSByZW1vdGUgd2FrZXVwIGVuYWJsZSAqLworI2RlZmluZSBSSF9IU19MUFNDCSAgICAgMHgwMDAxMDAwMAkJLyogbG9jYWwgcG93ZXIgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZSBSSF9IU19PQ0lDCSAgICAgMHgwMDAyMDAwMAkJLyogb3ZlciBjdXJyZW50IGluZGljYXRvciBjaGFuZ2UgKi8KKyNkZWZpbmUgUkhfSFNfQ1JXRQkgICAgIDB4ODAwMDAwMDAJCS8qIGNsZWFyIHJlbW90ZSB3YWtldXAgZW5hYmxlICovCisKKy8qIHJvb3RodWIuYiBtYXNrcyAqLworI2RlZmluZSBSSF9CX0RSCQkweDAwMDBmZmZmCQkvKiBkZXZpY2UgcmVtb3ZhYmxlIGZsYWdzICovCisjZGVmaW5lIFJIX0JfUFBDTQkweGZmZmYwMDAwCQkvKiBwb3J0IHBvd2VyIGNvbnRyb2wgbWFzayAqLworCisvKiByb290aHViLmEgbWFza3MgKi8KKyNkZWZpbmUgUkhfQV9ORFAJKDB4ZmYgPDwgMCkJCS8qIG51bWJlciBvZiBkb3duc3RyZWFtIHBvcnRzICovCisjZGVmaW5lIFJIX0FfUFNNCSgxIDw8IDgpCQkvKiBwb3dlciBzd2l0Y2hpbmcgbW9kZSAqLworI2RlZmluZSBSSF9BX05QUwkoMSA8PCA5KQkJLyogbm8gcG93ZXIgc3dpdGNoaW5nICovCisjZGVmaW5lIFJIX0FfRFQJCSgxIDw8IDEwKQkJLyogZGV2aWNlIHR5cGUgKG1ieikgKi8KKyNkZWZpbmUgUkhfQV9PQ1BNCSgxIDw8IDExKQkJLyogb3ZlciBjdXJyZW50IHByb3RlY3Rpb24gbW9kZSAqLworI2RlZmluZSBSSF9BX05PQ1AJKDEgPDwgMTIpCQkvKiBubyBvdmVyIGN1cnJlbnQgcHJvdGVjdGlvbiAqLworI2RlZmluZSBSSF9BX1BPVFBHVAkoMHhmZiA8PCAyNCkJCS8qIHBvd2VyIG9uIHRvIHBvd2VyIGdvb2QgdGltZSAqLworCisvKiB1cmIgKi8KKyNkZWZpbmUgTl9VUkJfVEQgNDgKK3R5cGVkZWYgc3RydWN0Cit7CisJZWRfdCAqZWQ7CisJX191MTYgbGVuZ3RoOwkvKiBudW1iZXIgb2YgdGRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QgKi8KKwlfX3UxNiB0ZF9jbnQ7CS8qIG51bWJlciBvZiB0ZHMgYWxyZWFkeSBzZXJ2aWNlZCAqLworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CisJaW50ICAgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBwaXBlOworCXZvaWQgKnRyYW5zZmVyX2J1ZmZlcjsKKwlpbnQgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKKwlpbnQgaW50ZXJ2YWw7CisJaW50IGFjdHVhbF9sZW5ndGg7CisJaW50IGZpbmlzaGVkOworCXRkX3QgKnRkW05fVVJCX1REXTsJLyogbGlzdCBwb2ludGVyIHRvIGFsbCBjb3JyZXNwb25kaW5nIFREcyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0ICovCit9IHVyYl9wcml2X3Q7CisjZGVmaW5lIFVSQl9ERUwgMQorCisvKgorICogVGhpcyBpcyB0aGUgZnVsbCBvaGNpIGNvbnRyb2xsZXIgZGVzY3JpcHRpb24KKyAqCisgKiBOb3RlIGhvdyB0aGUgInByb3BlciIgVVNCIGluZm9ybWF0aW9uIGlzIGp1c3QKKyAqIGEgc3Vic2V0IG9mIHdoYXQgdGhlIGZ1bGwgaW1wbGVtZW50YXRpb24gbmVlZHMuIChMaW51cykKKyAqLworCisKK3R5cGVkZWYgc3RydWN0IG9oY2kgeworCXN0cnVjdCBvaGNpX2hjY2EgKmhjY2E7CQkvKiBoY2NhICovCisJLypkbWFfYWRkcl90IGhjY2FfZG1hOyovCisKKwlpbnQgaXJxOworCWludCBkaXNhYmxlZDsJCQkvKiBlLmcuIGdvdCBhIFVFLCB3ZSdyZSBodW5nICovCisJaW50IHNsZWVwaW5nOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkvKiBmb3IgSEMgYnVncyAqLworCisJc3RydWN0IG9oY2lfcmVncyAqcmVnczsgLyogT0hDSSBjb250cm9sbGVyJ3MgbWVtb3J5ICovCisKKwlpbnQgb2hjaV9pbnRfbG9hZFszMl07CSAvKiBsb2FkIG9mIHRoZSAzMiBJbnRlcnJ1cHQgQ2hhaW5zIChmb3IgbG9hZCBiYWxhbmNpbmcpKi8KKwllZF90ICplZF9ybV9saXN0WzJdOwkgLyogbGlzdHMgb2YgYWxsIGVuZHBvaW50cyB0byBiZSByZW1vdmVkICovCisJZWRfdCAqZWRfYnVsa3RhaWw7CSAvKiBsYXN0IGVuZHBvaW50IG9mIGJ1bGsgbGlzdCAqLworCWVkX3QgKmVkX2NvbnRyb2x0YWlsOwkgLyogbGFzdCBlbmRwb2ludCBvZiBjb250cm9sIGxpc3QgKi8KKwlpbnQgaW50cnN0YXR1czsKKwlfX3UzMiBoY19jb250cm9sOwkJLyogY29weSBvZiB0aGUgaGMgY29udHJvbCByZWcgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2WzMyXTsKKwlzdHJ1Y3QgdmlydF9yb290X2h1YiByaDsKKworCWNvbnN0IGNoYXIJKnNsb3RfbmFtZTsKK30gb2hjaV90OworCisjZGVmaW5lIE5VTV9FRFMgOAkJLyogbnVtIG9mIHByZWFsbG9jYXRlZCBlbmRwb2ludCBkZXNjcmlwdG9ycyAqLworCitzdHJ1Y3Qgb2hjaV9kZXZpY2UgeworCWVkX3QJZWRbTlVNX0VEU107CisJaW50IGVkX2NudDsKK307CisKKy8qIGhjZCAqLworLyogZW5kcG9pbnQgKi8KK3N0YXRpYyBpbnQgZXBfbGluayhvaGNpX3QgKiBvaGNpLCBlZF90ICogZWQpOworc3RhdGljIGludCBlcF91bmxpbmsob2hjaV90ICogb2hjaSwgZWRfdCAqIGVkKTsKK3N0YXRpYyBlZF90ICogZXBfYWRkX2VkKHN0cnVjdCB1c2JfZGV2aWNlICogdXNiX2RldiwgdW5zaWduZWQgbG9uZyBwaXBlLAorCQlpbnQgaW50ZXJ2YWwsIGludCBsb2FkKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogd2UgbmVlZCBtb3JlIFREcyB0aGFuIEVEcyAqLworI2RlZmluZSBOVU1fVEQgNjQKKworLyogKzEgc28gd2UgY2FuIGFsaWduIHRoZSBzdG9yYWdlICovCit0ZF90IGd0ZFtOVU1fVEQrMV07CisvKiBwb2ludGVycyB0byBhbGlnbmVkIHN0b3JhZ2UgKi8KK3RkX3QgKnB0ZDsKKworLyogVERzIC4uLiAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgdGQgKgordGRfYWxsb2MgKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2KQoreworCWludCBpOworCXN0cnVjdCB0ZAkqdGQ7CisKKwl0ZCA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IE5VTV9URDsgaSsrKQorCXsKKwkJaWYgKHB0ZFtpXS51c2JfZGV2ID09IE5VTEwpCisJCXsKKwkJCXRkID0gJnB0ZFtpXTsKKwkJCXRkLT51c2JfZGV2ID0gdXNiX2RldjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHRkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2VkX2ZyZWUgKHN0cnVjdCBlZCAqZWQpCit7CisJZWQtPnVzYl9kZXYgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2JkY29yZV9lcDAuYyBiL2RyaXZlcnMvdXNiZGNvcmVfZXAwLmMKaW5kZXggMjYwYmVmZS4uMWU0NGYzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2JkY29yZV9lcDAuYworKysgYi9kcml2ZXJzL3VzYmRjb3JlX2VwMC5jCkBAIC0yLDYgKzIsOSBAQAogICogKEMpIENvcHlyaWdodCAyMDAzCiAgKiBHZXJyeSBIYW1lbCwgZ2VoQHRpLmNvbSwgVGV4YXMgSW5zdHJ1bWVudHMKICAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIEJyeWFuIE8nRG9ub2dodWUsIGRlY2thcmRAQ29kZUhlcm1pdC5pZQorICoKICAqIEJhc2VkIG9uCiAgKiBsaW51eC9kcml2ZXJzL3VzYmQvZXAwLmMKICAqCkBAIC0zOSwxMSArNDIsMTcgQEAKICAqIGZ1bmN0aW9uIGRyaXZlci4gVGhpcyBtYXkgbmVlZCB0byBjaGFuZ2UuCiAgKgogICogWFhYCisgKgorICogQXMgYWxsdWRlZCB0byBhYm92ZSwgYSBzaW1wbGUgY2FsbGJhY2sgY2RjX3JlY3Zfc2V0dXAgaGFzIGJlZW4gaW1wbGVtZW50ZWQKKyAqIGluIHRoZSB1c2JfZGV2aWNlIGRhdGEgc3RydWN0dXJlIHRvIGZhY2lsaWNhdGUgcGFzc2luZworICogQ29tbW9uIERldmljZSBDbGFzcyBwYWNrZXRzIHRvIGEgZnVuY3Rpb24gZHJpdmVyLgorICoKKyAqIFhYWAogICovCiAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX09NQVAxNTEwKSAmJiBkZWZpbmVkKENPTkZJR19VU0JfREVWSUNFKQorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9ERVZJQ0UpCiAjaW5jbHVkZSAidXNiZGNvcmUuaCIKIAogI2lmIDAKQEAgLTY5LDcgKzc4LDcgQEAKIAljaGFyICpjcDsKIAogCXVyYi0+YWN0dWFsX2xlbmd0aCA9IDI7Ci0JY3AgPSB1cmItPmJ1ZmZlcjsKKwljcCA9IChjaGFyKil1cmItPmJ1ZmZlcjsKIAljcFswXSA9IGNwWzFdID0gMDsKIAogCXN3aXRjaCAocmVxdWVzdHR5cGUpIHsKQEAgLTExNSw3ICsxMjQsNyBAQAogICoKICAqIENvcHkgY29uZmlndXJhdGlvbiBkYXRhIHRvIHVyYiB0cmFuc2ZlciBidWZmZXIgaWYgdGhlcmUgaXMgcm9vbSBmb3IgaXQuCiAgKi8KLXN0YXRpYyB2b2lkIGNvcHlfY29uZmlnIChzdHJ1Y3QgdXJiICp1cmIsIHZvaWQgKmRhdGEsIGludCBtYXhfbGVuZ3RoLAordm9pZCBjb3B5X2NvbmZpZyAoc3RydWN0IHVyYiAqdXJiLCB2b2lkICpkYXRhLCBpbnQgbWF4X2xlbmd0aCwKIAkJCSBpbnQgbWF4X2J1ZikKIHsKIAlpbnQgYXZhaWxhYmxlOwpAQCAtMTI4LDEwICsxMzcsNyBAQAogCQlkYmdfZXAwICgxLCAiZGF0YSBpcyBOVUxMIik7CiAJCXJldHVybjsKIAl9Ci0JaWYgKCEobGVuZ3RoID0gKih1bnNpZ25lZCBjaGFyICopIGRhdGEpKSB7Ci0JCWRiZ19lcDAgKDEsICJsZW5ndGggaXMgemVybyIpOwotCQlyZXR1cm47Ci0JfQorCWxlbmd0aCA9IG1heF9sZW5ndGg7CiAKIAlpZiAobGVuZ3RoID4gbWF4X2xlbmd0aCkgewogCQlkYmdfZXAwICgxLCAibGVuZ3RoOiAlZCA+PSBtYXhfbGVuZ3RoOiAlZCIsIGxlbmd0aCwKQEAgLTE5Miw3ICsxOTgsNyBAQAogCiAJLyogc2V0dXAgdHggdXJiICovCiAJdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKLQljcCA9IHVyYi0+YnVmZmVyOworCWNwID0gKGNoYXIqKXVyYi0+YnVmZmVyOwogCiAJZGJnX2VwMCAoMiwgIiVzIiwgVVNCRF9ERVZJQ0VfREVTQ1JJUFRPUlMgKGRlc2NyaXB0b3JfdHlwZSkpOwogCkBAIC0yMDAsNyArMjA2LDYgQEAKIAljYXNlIFVTQl9ERVNDUklQVE9SX1RZUEVfREVWSUNFOgogCQl7CiAJCQlzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yICpkZXZpY2VfZGVzY3JpcHRvcjsKLQogCQkJaWYgKCEKIAkJCSAgICAoZGV2aWNlX2Rlc2NyaXB0b3IgPQogCQkJICAgICB1c2JkX2RldmljZV9kZXZpY2VfZGVzY3JpcHRvciAoZGV2aWNlLCBwb3J0KSkpIHsKQEAgLTIxNCwyMCArMjE5LDE2IEBACiAJCQkvKiBjb3JyZWN0IHRoZSBjb3JyZWN0IGNvbnRyb2wgZW5kcG9pbnQgMCBtYXggcGFja2V0IHNpemUgaW50byB0aGUgZGVzY3JpcHRvciAqLwogCQkJZGV2aWNlX2Rlc2NyaXB0b3IgPQogCQkJCShzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yICopIHVyYi0+YnVmZmVyOwotCQkJZGV2aWNlX2Rlc2NyaXB0b3ItPmJNYXhQYWNrZXRTaXplMCA9Ci0JCQkJdXJiLT5kZXZpY2UtPmJ1cy0+bWF4cGFja2V0c2l6ZTsKIAogCQl9Ci0JCS8qZGJnX2VwMCgzLCAiY29waWVkIGRldmljZSBjb25maWd1cmF0aW9uLCBhY3R1YWxfbGVuZ3RoOiAleCIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7ICovCisJCWRiZ19lcDAoMywgImNvcGllZCBkZXZpY2UgY29uZmlndXJhdGlvbiwgYWN0dWFsX2xlbmd0aDogMHgleCIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JfREVTQ1JJUFRPUl9UWVBFX0NPTkZJR1VSQVRJT046CiAJCXsKLQkJCWludCBiTnVtSW50ZXJmYWNlOwogCQkJc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IKIAkJCQkqY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yOwogCQkJc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciAqZGV2aWNlX2Rlc2NyaXB0b3I7Ci0KIAkJCWlmICghCiAJCQkgICAgKGRldmljZV9kZXNjcmlwdG9yID0KIAkJCSAgICAgdXNiZF9kZXZpY2VfZGV2aWNlX2Rlc2NyaXB0b3IgKGRldmljZSwgcG9ydCkpKSB7CkBAIC0yNTEsMTMwICsyNTIsMzUgQEAKIAkJCQkJIGluZGV4KTsKIAkJCQlyZXR1cm4gLTE7CiAJCQl9CisJCQlkYmdfZXAwKDAsICJhdHRlbXB0IHRvIGNvcHkgJWQgYnl0ZXMgdG8gdXJiXG4iLGNwdV90b19sZTE2KGNvbmZpZ3VyYXRpb25fZGVzY3JpcHRvci0+d1RvdGFsTGVuZ3RoKSk7CiAJCQljb3B5X2NvbmZpZyAodXJiLCBjb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IsCi0JCQkJICAgICBzaXplb2YgKHN0cnVjdAotCQkJCQkgICAgIHVzYl9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IpLAorCisJCQkJCWNwdV90b19sZTE2KGNvbmZpZ3VyYXRpb25fZGVzY3JpcHRvci0+d1RvdGFsTGVuZ3RoKSwKIAkJCQkgICAgIG1heCk7Ci0KLQotCQkJLyogaXRlcmF0ZSBhY3Jvc3MgaW50ZXJmYWNlcyBmb3Igc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gKi8KLQkJCWRiZ19lcDAgKDAsICJiTnVtSW50ZXJmYWNlczogJWQiLAotCQkJCSBjb25maWd1cmF0aW9uX2Rlc2NyaXB0b3ItPmJOdW1JbnRlcmZhY2VzKTsKLQkJCWZvciAoYk51bUludGVyZmFjZSA9IDA7Ci0JCQkgICAgIGJOdW1JbnRlcmZhY2UgPAotCQkJICAgICBjb25maWd1cmF0aW9uX2Rlc2NyaXB0b3ItPmJOdW1JbnRlcmZhY2VzOwotCQkJICAgICBiTnVtSW50ZXJmYWNlKyspIHsKLQotCQkJCWludCBiQWx0ZXJuYXRlU2V0dGluZzsKLQkJCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9pbnN0YW5jZQotCQkJCQkqaW50ZXJmYWNlX2luc3RhbmNlOwotCi0JCQkJZGJnX2VwMCAoMywgIlslZF0gYk51bUludGVyZmFjZXM6ICVkIiwKLQkJCQkJIGJOdW1JbnRlcmZhY2UsCi0JCQkJCSBjb25maWd1cmF0aW9uX2Rlc2NyaXB0b3ItPmJOdW1JbnRlcmZhY2VzKTsKLQotCQkJCWlmICghIChpbnRlcmZhY2VfaW5zdGFuY2UgPSB1c2JkX2RldmljZV9pbnRlcmZhY2VfaW5zdGFuY2UgKGRldmljZSwKLQkJCQkJCQkJICAgICBwb3J0LCBpbmRleCwgYk51bUludGVyZmFjZSkpKQotCQkJCXsKLQkJCQkJZGJnX2VwMCAoMywgIlslZF0gaW50ZXJmYWNlX2luc3RhbmNlIE5VTEwiLAotCQkJCQkJIGJOdW1JbnRlcmZhY2UpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCS8qIGl0ZXJhdGUgYWNyb3NzIGludGVyZmFjZSBhbHRlcm5hdGVzICovCi0JCQkJZm9yIChiQWx0ZXJuYXRlU2V0dGluZyA9IDA7Ci0JCQkJICAgICBiQWx0ZXJuYXRlU2V0dGluZyA8IGludGVyZmFjZV9pbnN0YW5jZS0+YWx0ZXJuYXRlczsKLQkJCQkgICAgIGJBbHRlcm5hdGVTZXR0aW5nKyspIHsKLQkJCQkJLyppbnQgY2xhc3M7ICovCi0JCQkJCWludCBiTnVtRW5kcG9pbnQ7Ci0JCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKmludGVyZmFjZV9kZXNjcmlwdG9yOwotCi0JCQkJCXN0cnVjdCB1c2JfYWx0ZXJuYXRlX2luc3RhbmNlICphbHRlcm5hdGVfaW5zdGFuY2U7Ci0KLQkJCQkJZGJnX2VwMCAoMywgIlslZDolZF0gYWx0ZXJuYXRlczogJWQiLAotCQkJCQkJIGJOdW1JbnRlcmZhY2UsCi0JCQkJCQkgYkFsdGVybmF0ZVNldHRpbmcsCi0JCQkJCQkgaW50ZXJmYWNlX2luc3RhbmNlLT5hbHRlcm5hdGVzKTsKLQotCQkJCQlpZiAoISAoYWx0ZXJuYXRlX2luc3RhbmNlID0gdXNiZF9kZXZpY2VfYWx0ZXJuYXRlX2luc3RhbmNlIChkZXZpY2UsIHBvcnQsIGluZGV4LCBiTnVtSW50ZXJmYWNlLCBiQWx0ZXJuYXRlU2V0dGluZykpKSB7Ci0JCQkJCQlkYmdfZXAwICgzLCAiWyVkXSBhbHRlcm5hdGVfaW5zdGFuY2UgTlVMTCIsCi0JCQkJCQkJIGJOdW1JbnRlcmZhY2UpOwotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQl9Ci0JCQkJCS8qIGNvcHkgZGVzY3JpcHRvciBmb3IgdGhpcyBpbnRlcmZhY2UgKi8KLQkJCQkJY29weV9jb25maWcgKHVyYiwgYWx0ZXJuYXRlX2luc3RhbmNlLT5pbnRlcmZhY2VfZGVzY3JpcHRvciwKLQkJCQkJCSAgICAgc2l6ZW9mIChzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yKSwKLQkJCQkJCSAgICAgbWF4KTsKLQotCQkJCQkvKmRiZ19lcDAoMywgIlslZDolZF0gY2xhc3NlczogJWQgZW5kcG9pbnRzOiAlZCIsIGJOdW1JbnRlcmZhY2UsIGJBbHRlcm5hdGVTZXR0aW5nLCAqLwotCQkJCQkvKiAgICAgICAgYWx0ZXJuYXRlX2luc3RhbmNlLT5jbGFzc2VzLCBhbHRlcm5hdGVfaW5zdGFuY2UtPmVuZHBvaW50cyk7ICovCi0KLQkJCQkJLyogaXRlcmF0ZSBhY3Jvc3MgY2xhc3NlcyBmb3IgdGhpcyBhbHRlcm5hdGUgaW50ZXJmYWNlICovCi0jaWYgMAotCQkJCQlmb3IgKGNsYXNzID0gMDsKLQkJCQkJICAgICBjbGFzcyA8IGFsdGVybmF0ZV9pbnN0YW5jZS0+Y2xhc3NlczsKLQkJCQkJICAgICBjbGFzcysrKSB7Ci0JCQkJCQlzdHJ1Y3QgdXNiX2NsYXNzX2Rlc2NyaXB0b3IgKmNsYXNzX2Rlc2NyaXB0b3I7Ci0JCQkJCQkvKmRiZ19lcDAoMywgIlslZDolZDolZF0gY2xhc3NlczogJWQiLCBiTnVtSW50ZXJmYWNlLCBiQWx0ZXJuYXRlU2V0dGluZywgKi8KLQkJCQkJCS8qICAgICAgICBjbGFzcywgYWx0ZXJuYXRlX2luc3RhbmNlLT5jbGFzc2VzKTsgKi8KLQkJCQkJCWlmICghKGNsYXNzX2Rlc2NyaXB0b3IgPSB1c2JkX2RldmljZV9jbGFzc19kZXNjcmlwdG9yX2luZGV4IChkZXZpY2UsIHBvcnQsIGluZGV4LCBiTnVtSW50ZXJmYWNlLCBiQWx0ZXJuYXRlU2V0dGluZywgY2xhc3MpKSkgewotCQkJCQkJCWRiZ19lcDAgKDMsICJbJWRdIGNsYXNzIE5VTEwiLAotCQkJCQkJCQkgY2xhc3MpOwotCQkJCQkJCXJldHVybiAtMTsKLQkJCQkJCX0KLQkJCQkJCS8qIGNvcHkgZGVzY3JpcHRvciBmb3IgdGhpcyBjbGFzcyAqLwotCQkJCQkJY29weV9jb25maWcgKHVyYiwgY2xhc3NfZGVzY3JpcHRvciwKLQkJCQkJCQlzaXplb2YgKHN0cnVjdCB1c2JfY2xhc3NfZGVzY3JpcHRvciksCi0JCQkJCQkJbWF4KTsKLQkJCQkJfQotI2VuZGlmCi0KLQkJCQkJLyogaXRlcmF0ZSBhY3Jvc3MgZW5kcG9pbnRzIGZvciB0aGlzIGFsdGVybmF0ZSBpbnRlcmZhY2UgKi8KLQkJCQkJaW50ZXJmYWNlX2Rlc2NyaXB0b3IgPSBhbHRlcm5hdGVfaW5zdGFuY2UtPmludGVyZmFjZV9kZXNjcmlwdG9yOwotCQkJCQlmb3IgKGJOdW1FbmRwb2ludCA9IDA7Ci0JCQkJCSAgICAgYk51bUVuZHBvaW50IDwgYWx0ZXJuYXRlX2luc3RhbmNlLT5lbmRwb2ludHM7Ci0JCQkJCSAgICAgYk51bUVuZHBvaW50KyspIHsKLQkJCQkJCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnRfZGVzY3JpcHRvcjsKLQkJCQkJCWRiZ19lcDAgKDMsICJbJWQ6JWQ6JWRdIGVuZHBvaW50OiAlZCIsCi0JCQkJCQkJIGJOdW1JbnRlcmZhY2UsCi0JCQkJCQkJIGJBbHRlcm5hdGVTZXR0aW5nLAotCQkJCQkJCSBiTnVtRW5kcG9pbnQsCi0JCQkJCQkJIGludGVyZmFjZV9kZXNjcmlwdG9yLT4KLQkJCQkJCQkgYk51bUVuZHBvaW50cyk7Ci0JCQkJCQlpZiAoIShlbmRwb2ludF9kZXNjcmlwdG9yID0gdXNiZF9kZXZpY2VfZW5kcG9pbnRfZGVzY3JpcHRvcl9pbmRleCAoZGV2aWNlLCBwb3J0LCBpbmRleCwgYk51bUludGVyZmFjZSwgYkFsdGVybmF0ZVNldHRpbmcsIGJOdW1FbmRwb2ludCkpKSB7Ci0JCQkJCQkJZGJnX2VwMCAoMywgIlslZF0gZW5kcG9pbnQgTlVMTCIsCi0JCQkJCQkJCSBiTnVtRW5kcG9pbnQpOwotCQkJCQkJCXJldHVybiAtMTsKLQkJCQkJCX0KLQkJCQkJCS8qIGNvcHkgZGVzY3JpcHRvciBmb3IgdGhpcyBlbmRwb2ludCAqLwotCQkJCQkJY29weV9jb25maWcgKHVyYiwgZW5kcG9pbnRfZGVzY3JpcHRvciwKLQkJCQkJCQkgICAgIHNpemVvZiAoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKSwKLQkJCQkJCQkgICAgIG1heCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlkYmdfZXAwICgzLCAibGVuZ3RoczogJWQgJWQiLAotCQkJCSBsZTE2X3RvX2NwdSAoY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yLT53VG90YWxMZW5ndGgpLAotCQkJCSB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQl9CisKIAkJYnJlYWs7CiAKIAljYXNlIFVTQl9ERVNDUklQVE9SX1RZUEVfU1RSSU5HOgogCQl7CiAJCQlzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICpzdHJpbmdfZGVzY3JpcHRvcjsKLQogCQkJaWYgKCEoc3RyaW5nX2Rlc2NyaXB0b3IgPSB1c2JkX2dldF9zdHJpbmcgKGluZGV4KSkpIHsKKwkJCQlzZXJpYWxfcHJpbnRmKCJJbnZhbGlkIHN0cmluZyBpbmRleCAlZFxuIiwgaW5kZXgpOwogCQkJCXJldHVybiAtMTsKIAkJCX0KLQkJCS8qZGJnX2VwMCgzLCAic3RyaW5nX2Rlc2NyaXB0b3I6ICVwIiwgc3RyaW5nX2Rlc2NyaXB0b3IpOyAqLworCQkJZGJnX2VwMCgzLCAic3RyaW5nX2Rlc2NyaXB0b3I6ICVwIGxlbmd0aCAlZCIsIHN0cmluZ19kZXNjcmlwdG9yLCBzdHJpbmdfZGVzY3JpcHRvci0+Ykxlbmd0aCk7CiAJCQljb3B5X2NvbmZpZyAodXJiLCBzdHJpbmdfZGVzY3JpcHRvciwgc3RyaW5nX2Rlc2NyaXB0b3ItPmJMZW5ndGgsIG1heCk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBVU0JfREVTQ1JJUFRPUl9UWVBFX0lOVEVSRkFDRToKKwlzZXJpYWxfcHJpbnRmKCJVU0JfREVTQ1JJUFRPUl9UWVBFX0lOVEVSRkFDRSAtIGVycm9yIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAJCXJldHVybiAtMTsKIAljYXNlIFVTQl9ERVNDUklQVE9SX1RZUEVfRU5EUE9JTlQ6CisJCXNlcmlhbF9wcmludGYoIlVTQl9ERVNDUklQVE9SX1RZUEVfRU5EUE9JTlQgLSBlcnJvciBub3QgaW1wbGVtZW50ZWRcbiIpOwogCQlyZXR1cm4gLTE7CiAJY2FzZSBVU0JfREVTQ1JJUFRPUl9UWVBFX0hJRDoKIAkJeworCQkJc2VyaWFsX3ByaW50ZigiVVNCX0RFU0NSSVBUT1JfVFlQRV9ISUQgLSBlcnJvciBub3QgaW1wbGVtZW50ZWRcbiIpOwogCQkJcmV0dXJuIC0xOwkvKiB1bnN1cHBvcnRlZCBhdCB0aGlzIHRpbWUgKi8KICNpZiAwCiAJCQlpbnQgYk51bUludGVyZmFjZSA9CkBAIC00MDMsNiArMzA5LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBVU0JfREVTQ1JJUFRPUl9UWVBFX1JFUE9SVDoKIAkJeworCQkJc2VyaWFsX3ByaW50ZigiVVNCX0RFU0NSSVBUT1JfVFlQRV9SRVBPUlQgLSBlcnJvciBub3QgaW1wbGVtZW50ZWRcbiIpOwogCQkJcmV0dXJuIC0xOwkvKiB1bnN1cHBvcnRlZCBhdCB0aGlzIHRpbWUgKi8KICNpZiAwCiAJCQlpbnQgYk51bUludGVyZmFjZSA9CkBAIC00MzQsMTIgKzM0MSwxOSBAQAogI2VuZGlmCiAJCX0KIAkJYnJlYWs7CisJY2FzZSBVU0JfREVTQ1JJUFRPUl9UWVBFX0RFVklDRV9RVUFMSUZJRVI6CisJCXsKKwkJCS8qIElmIGEgVVNCIGRldmljZSBzdXBwb3J0cyBib3RoIGEgZnVsbCBzcGVlZCBhbmQgbG93IHNwZWVkIG9wZXJhdGlvbgorCQkJICogd2UgbXVzdCBzZW5kIGEgRGV2aWNlX1F1YWxpZmllciBkZXNjcmlwdG9yIGhlcmUKKwkJCSAqLworCQkJcmV0dXJuIC0xOworCQl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC0xOwogCX0KIAogCi0JZGJnX2VwMCAoMSwgInVyYjogYnVmZmVyOiAlcCBidWZmZXJfbGVuZ3RoOiAlMmQgYWN0dWFsX2xlbmd0aDogJTJkIHBhY2tldCBzaXplOiAlMmQiLAorCWRiZ19lcDAgKDEsICJ1cmI6IGJ1ZmZlcjogJXAgYnVmZmVyX2xlbmd0aDogJTJkIGFjdHVhbF9sZW5ndGg6ICUyZCB0eF9wYWNrZXRTaXplOiAlMmQiLAogCQkgdXJiLT5idWZmZXIsIHVyYi0+YnVmZmVyX2xlbmd0aCwgdXJiLT5hY3R1YWxfbGVuZ3RoLAogCQkgZGV2aWNlLT5idXMtPmVuZHBvaW50X2FycmF5WzBdLnR4X3BhY2tldFNpemUpOwogLyoKQEAgLTQ5NSw2ICs0MDksMTIgQEAKIAogCS8qIGhhbmRsZSBVU0IgU3RhbmRhcmQgUmVxdWVzdCAoYy5mLiBVU0IgU3BlYyB0YWJsZSA5LTIpICovCiAJaWYgKChyZXF1ZXN0LT5ibVJlcXVlc3RUeXBlICYgVVNCX1JFUV9UWVBFX01BU0spICE9IDApIHsKKwkJaWYoZGV2aWNlLT5kZXZpY2Vfc3RhdGUgPD0gU1RBVEVfQ09ORklHVVJFRCl7CisJCQkvKglBdHRlbXB0IHRvIGhhbmRsZSBhIENEQyBzcGVjaWZpYyByZXF1ZXN0IGlmIHdlIGFyZQorCQkJICoJaW4gdGhlIGNvbmZpZ3VyZWQgc3RhdGUuCisJCQkgKi8KKwkJCXJldHVybiBkZXZpY2UtPmNkY19yZWN2X3NldHVwKHJlcXVlc3QsdXJiKTsKKwkJfQogCQlkYmdfZXAwICgxLCAibm9uIHN0YW5kYXJkIHJlcXVlc3Q6ICV4IiwKIAkJCSByZXF1ZXN0LT5ibVJlcXVlc3RUeXBlICYgVVNCX1JFUV9UWVBFX01BU0spOwogCQlyZXR1cm4gLTE7CS8qIFN0YWxsIGhlcmUgKi8KQEAgLTU2Nyw2ICs0ODcsNyBAQAogCQkJCQkJICAgbGUxNl90b19jcHUgKHJlcXVlc3QtPndWYWx1ZSkgJiAweGZmKTsKIAogCQljYXNlIFVTQl9SRVFfR0VUX0NPTkZJR1VSQVRJT046CisJCQlzZXJpYWxfcHJpbnRmKCJnZXQgY29uZmlnICVkXG4iLCBkZXZpY2UtPmNvbmZpZ3VyYXRpb24pOwogCQkJcmV0dXJuIGVwMF9nZXRfb25lIChkZXZpY2UsIHVyYiwKIAkJCQkJICAgIGRldmljZS0+Y29uZmlndXJhdGlvbik7CiAKQEAgLTY0Miw3ICs1NjMsNiBAQAogCQkJLypkYmdfZXAwKDIsICJhZGRyZXNzOiAlZCAlZCAlZCIsICovCiAJCQkvKiAgICAgICAgcmVxdWVzdC0+d1ZhbHVlLCBsZTE2X3RvX2NwdShyZXF1ZXN0LT53VmFsdWUpLCBkZXZpY2UtPmFkZHJlc3MpOyAqLwogCi0JCQlzZXJpYWxfcHJpbnRmICgiREVWSUNFX0FERFJFU1NfQVNTSUdORUQuLiBldmVudD9cbiIpOwogCQkJcmV0dXJuIDA7CiAKIAkJY2FzZSBVU0JfUkVRX1NFVF9ERVNDUklQVE9SOgkvKiBYWFggc2hvdWxkIHdlIHN1cHBvcnQgdGhpcz8gKi8KQEAgLTY1Myw5ICs1NzMsMTAgQEAKIAkJCS8qIGMuZi4gOS40LjcgLSB0aGUgdG9wIGhhbGYgb2Ygd1ZhbHVlIGlzIHJlc2VydmVkICovCiAJCQkvKiAqLwogCQkJaWYgKChkZXZpY2UtPmNvbmZpZ3VyYXRpb24gPQotCQkJICAgICBsZTE2X3RvX2NwdSAocmVxdWVzdC0+d1ZhbHVlKSAmIDB4N2YpICE9IDApIHsKKwkJCQlsZTE2X3RvX2NwdSAocmVxdWVzdC0+d1ZhbHVlKSAmIDB4RkY4MCkgIT0gMCkgewogCQkJCS8qIGMuZi4gOS40LjcgLSB6ZXJvIGlzIHRoZSBkZWZhdWx0IG9yIGFkZHJlc3NlZCBzdGF0ZSwgaW4gb3VyIGNhc2UgdGhpcyAqLwogCQkJCS8qIGlzIHRoZSBzYW1lIGlzIGNvbmZpZ3VyYXRpb24gemVybyAqLworCQkJCXNlcmlhbF9wcmludGYoImVycm9yIHNldHRpbmcgZGV2LT5jb25maWcgdG8gemVybyFcbiIpOwogCQkJCWRldmljZS0+Y29uZmlndXJhdGlvbiA9IDA7CS8qIFRCUiAtID8/Pz8/PyAqLwogCQkJfQogCQkJLyogcmVzZXQgaW50ZXJmYWNlIGFuZCBhbHRlcm5hdGUgc2V0dGluZ3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiZGNvcmVfbXBjOHh4LmMgYi9kcml2ZXJzL3VzYmRjb3JlX21wYzh4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzI4NGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYmRjb3JlX21wYzh4eC5jCkBAIC0wLDAgKzEsMTQwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBieSBCcnlhbiBPJ0Rvbm9naHVlLCBDb2RlSGVybWl0CisgKiBib2Rvbm9naHVlQENvZGVIZXJtaXQuaWUKKyAqCisgKiBSZWZlcmVuY2VzCisgKiBEYXNVQm9vdC9kcml2ZXJzL3VzYmRjb3JlX29tYXAxNTEwLmMsIGZvciBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGlkZWFzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworLyoKKyAqIE5vdGVzIDoKKyAqIDEuCSNkZWZpbmUgX19TSU1VTEFURV9FUlJPUl9fIHRvIGluamVjdCBhIENSQyBlcnJvciBpbnRvIGV2ZXJ5IDJuZCBUWAorICoJCXBhY2tldCB0byBmb3JjZSB0aGUgVVNCIHJlLXRyYW5zbWl0IHByb3RvY29sLgorICoKKyAqIDIuCSNkZWZpbmUgX19ERUJVR19VRENfXyB0byBzd2l0Y2ggb24gZGVidWcgdHJhY2luZyB0byBzZXJpYWwgY29uc29sZQorICoJYmUgY2FyZWZ1bCB0aGF0IHRyYWNpbmcgZG9lc24ndCBjcmVhdGUgSGllc2VuLWJ1Z3Mgd2l0aCByZXNwZWN0IHRvCisgKglyZXNwb25zZSB0aW1lb3V0cyB0byBjb250cm9sIHJlcXVlc3RzLgorICoKKyAqIDMuCVRoaXMgZHJpdmVyIHNob3VsZCBiZSBhYmxlIHRvIHN1cHBvcnQgYW55IGhpZ2hlciBsZXZlbCBkcml2ZXIgdGhhdAorICoJdGhhdCB3YW50cyB0byBkbyBlaXRoZXIgb2YgdGhlIHR3byBzdGFuZGFyZCBVREMgaW1wbGVtZW50YXRpb25zCisgKglDb250cm9sLUJ1bGstSW50ZXJydXB0IG9yICBCdWxrLUlOL0J1bGstT3V0IHN0YW5kYXJkcy4gSGVuY2UKKyAqCWdzZXJpYWwgYW5kIGNkY19hY20gc2hvdWxkIHdvcmsgd2l0aCB0aGlzIGNvZGUuCisgKgorICogNC4JTkFLIGV2ZW50cyBuZXZlciBhY3R1YWxseSBnZXQgcmFpc2VkIGF0IGFsbCwgdGhlIGRvY3VtZW50YXRpb24KKyAqCWlzIGp1c3Qgd3JvbmcgIQorICoKKyAqIDUuCUZvciBzb21lIHJlYXNvbiwgY2JkX2RhdGxlbiBpcyAqYWx3YXlzKiArMiB0aGUgdmFsdWUgaXQgc2hvdWxkIGJlLgorICoJdGhpcyBtZWFucyB0aGF0IGhhdmluZyBhbiBSWCBjYmQgb2YgMTYgYnl0ZXMgaXMgbm90IHBvc3NpYmxlLCBzaW5jZQorICoJdGhlIHNhbWUgc2l6ZSBpcyByZXBvcnRlZCBmb3IgMTQgYnl0ZXMgcmVjZWl2ZWQgYXMgMTYgYnl0ZXMgcmVjZWl2ZWQKKyAqCXVudGlsIHdlIGNhbiBmaW5kIG91dCB3aHkgdGhpcyBoYXBwZW5zLCBSWCBjYmRzIG11c3QgYmUgbGltaXRlZCB0byA4CisgKglieXRlcy4gVE9ETzogY2hlY2sgZXJyYXRhIGZvciB0aGlzIGJlaGF2aW91ci4KKyAqCisgKiA2LglSaWdodCBub3cgdGhpcyBjb2RlIGRvZXNuJ3Qgc3VwcG9ydCBwcm9wZXJseSBwb3dlcmluZyB1cCB3aXRoIHRoZSBVU0IKKyAqCWNhYmxlIGF0dGFjaGVkIHRvIHRoZSBVU0IgaG9zdCBteSBkZXZlbG9wbWVudCBib2FyZCB0aGUgQWRkZXI4N3ggZG9lc24ndAorICoJaGF2ZSBhIHB1bGwtdXAgZml0dGVkIHRvIGFsbG93IHRoaXMsIHNvIGl0IGlzIG5lY2Vzc2FyeSB0byBwb3dlciB0aGUKKyAqCWJvYXJkIGFuZCAqdGhlbiogYXR0YWNoZWQgdGhlIFVTQiBjYWJsZSB0byB0aGUgaG9zdC4gSG93ZXZlciBzb21lYm9keQorICoJd2l0aCBhIGRpZmZlcmVudCBkZXNpZ24gaW4gdGhlaXIgYm9hcmQgbWF5IGJlIGFibGUgdG8ga2VlcCB0aGUgY2FibGUKKyAqCWNvbnN0YW50bHkgY29ubmVjdGVkIGFuZCBzaW1wbHkgZW5hYmxlL2Rpc2FibGUgYSBwdWxsLXVwICByZQorICoJZmlndXJlIDMxLjEgaW4gTVBDODg1Uk0ucGRmIGluc3RlYWQgb2YgaGF2aW5nIHRvIHBvd2VyIHVwIHRoZSBib2FyZCBhbmQKKyAqCXRoZW4gYXR0YWNoIHRoZSBjYWJsZSAhCisgKgorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4ODVfRkFNSUxZKSAmJiBkZWZpbmVkKENPTkZJR19VU0JfREVWSUNFKQorI2luY2x1ZGUgPGNvbW1wcm9jLmg+CisjaW5jbHVkZSAidXNiZGNvcmUuaCIKKyNpbmNsdWRlICJ1c2JkY29yZV9tcGM4eHguaCIKKyNpbmNsdWRlICJ1c2JkY29yZV9lcDAuaCIKKworI2RlZmluZSBFUlIoZm10LCBhcmdzLi4uKVwKKwlzZXJpYWxfcHJpbnRmKCJFUlJPUiA6IFslc10gJXM6JWQ6ICJmbXQsXAorCQkJCV9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXywgIyNhcmdzKQorI2lmZGVmIF9fREVCVUdfVURDX18KKyNkZWZpbmUgREJHKGZtdCxhcmdzLi4uKVwKKwkJc2VyaWFsX3ByaW50ZigiWyVzXSAlczolZDogImZtdCxcCisJCQkJX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fLCAjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBEQkcoZm10LGFyZ3MuLi4pCisjZW5kaWYKKworLyogU3RhdGljIERhdGEgKi8KKyNpZmRlZiBfX1NJTVVMQVRFX0VSUk9SX18KK3N0YXRpYyBjaGFyIGVycl9wb2lzb25fdGVzdCA9IDA7CisjZW5kaWYKK3N0YXRpYyBzdHJ1Y3QgbXBjOHh4X2VwIGVwX3JlZltNQVhfRU5EUE9JTlRTXTsKK3N0YXRpYyB1MzIgYWRkcmVzc19iYXNlID0gU1RBVEVfTk9UX1JFQURZOworc3RhdGljIG1wYzh4eF91ZGNfc3RhdGVfdCB1ZGNfc3RhdGUgPSAwOworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICp1ZGNfZGV2aWNlID0gMDsKK3N0YXRpYyB2b2xhdGlsZSB1c2JfZXBiX3QgKmVuZHBvaW50c1tNQVhfRU5EUE9JTlRTXTsKK3N0YXRpYyB2b2xhdGlsZSBjYmRfdCAqdHhfY2JkW1RYX1JJTkdfU0laRV07CitzdGF0aWMgdm9sYXRpbGUgY2JkX3QgKnJ4X2NiZFtSWF9SSU5HX1NJWkVdOworc3RhdGljIHZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAwOworc3RhdGljIHZvbGF0aWxlIGNwbTh4eF90ICpjcCA9IDA7CitzdGF0aWMgdm9sYXRpbGUgdXNiX3ByYW1fdCAqdXNiX3BhcmFtcCA9IDA7CitzdGF0aWMgdm9sYXRpbGUgdXNiX3QgKnVzYnAgPSAwOworc3RhdGljIGludCByeF9jdCA9IDA7CitzdGF0aWMgaW50IHR4X2N0ID0gMDsKKworLyogU3RhdGljIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqLworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19zdGF0ZV90cmFuc2l0aW9uX3VwICh1c2JfZGV2aWNlX3N0YXRlX3QgaW5pdGlhbCwKKwkJCQkJICAgIHVzYl9kZXZpY2Vfc3RhdGVfdCBmaW5hbCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX3N0YXRlX3RyYW5zaXRpb25fZG93biAodXNiX2RldmljZV9zdGF0ZV90IGluaXRpYWwsCisJCQkJCSAgICAgIHVzYl9kZXZpY2Vfc3RhdGVfdCBmaW5hbCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX3N0YWxsICh1bnNpZ25lZCBpbnQgZXApOworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19mbHVzaF90eF9maWZvIChpbnQgZXBpZCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2ZsdXNoX3J4X2ZpZm8gKHZvaWQpOworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19jbGVhcl9yeGJkICh2b2xhdGlsZSBjYmRfdCAqIHJ4X2NiZHApOworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19pbml0X3R4IChzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplcGksCisJCQkJc3RydWN0IHVyYiAqdHhfdXJiKTsKK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfZHVtcF9yZXF1ZXN0IChzdHJ1Y3QgdXNiX2RldmljZV9yZXF1ZXN0ICpyZXF1ZXN0KTsKK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfY2xvY2tfaW5pdCAodm9sYXRpbGUgaW1tYXBfdCAqIGltbXIsCisJCQkJICAgdm9sYXRpbGUgY3BtOHh4X3QgKiBjcCk7CitzdGF0aWMgaW50IG1wYzh4eF91ZGNfZXBfdHggKHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVwaSk7CitzdGF0aWMgaW50IG1wYzh4eF91ZGNfZXBuX3J4ICh1bnNpZ25lZCBpbnQgZXBpZCwgdm9sYXRpbGUgY2JkX3QgKiByeF9jYmRwKTsKK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfZXAwX3J4ICh2b2xhdGlsZSBjYmRfdCAqIHJ4X2NiZHApOworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19jYmRfaW5pdCAodm9pZCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2VuZHBvaW50X2luaXQgKHZvaWQpOworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19jYmRfYXR0YWNoIChpbnQgZXAsIHVjaGFyIHR4X3NpemUsIHVjaGFyIHJ4X3NpemUpOworc3RhdGljIHUzMiBtcGM4eHhfdWRjX2FsbG9jICh1MzIgZGF0YV9zaXplLCB1MzIgYWxpZ25tZW50KTsKK3N0YXRpYyBpbnQgbXBjOHh4X3VkY19lcDBfcnhfc2V0dXAgKHZvbGF0aWxlIGNiZF90ICogcnhfY2JkcCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX3NldF9uYWsgKHVuc2lnbmVkIGludCBlcCk7CitzdGF0aWMgc2hvcnQgbXBjOHh4X3VkY19oYW5kbGVfdHhlcnIgKHZvaWQpOworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19hZHZhbmNlX3J4ICh2b2xhdGlsZSBjYmRfdCAqKiByeF9jYmRwLCBpbnQgZXBpZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCSAgICAgICBHbG9iYWwgTGlua2FnZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB1ZGNfaW5pdAorICoKKyAqIERvIGluaXRpYWwgYnVzIGdsdWluZworICovCitpbnQgdWRjX2luaXQgKHZvaWQpCit7CisJLyogSW5pdCB2YXJpb3VzIHBvaW50ZXJzICovCisJaW1tciA9IChpbW1hcF90ICopIENGR19JTU1SOworCWNwID0gKGNwbTh4eF90ICopICYgKGltbXItPmltX2NwbSk7CisJdXNiX3BhcmFtcCA9ICh1c2JfcHJhbV90ICopICYgKGNwLT5jcF9kcGFyYW1bUFJPRkZfVVNCXSk7CisJdXNicCA9ICh1c2JfdCAqKSAmIChjcC0+Y3Bfc2NjWzBdKTsKKworCW1lbXNldCAoZXBfcmVmLCAweDAwLCAoc2l6ZW9mIChzdHJ1Y3QgbXBjOHh4X2VwKSAqIE1BWF9FTkRQT0lOVFMpKTsKKworCXVkY19kZXZpY2UgPSAwOworCXVkY19zdGF0ZSA9IFNUQVRFX05PVF9SRUFEWTsKKworCXVzYnAtPnVzbW9kID0gMHgwMDsKKwl1c2JwLT51c2NvbSA9IDA7CisKKwkvKiBTZXQgVVNCIEZyYW1lICMwLCBSZXNwb25kIGF0IEFkZHJlc3MgJiBHZXQgYSBjbG9jayBzb3VyY2UgICovCisJdXNicC0+dXNhZGRyID0gMHgwMDsKKwltcGM4eHhfdWRjX2Nsb2NrX2luaXQgKGltbXIsIGNwKTsKKworCS8qIFBBMTUsIFBBMTQgYXMgcGVyaGlwZXJhbCBVU0JSWEQgYW5kIFVTQk9FICovCisJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRpciAmPSB+MHgwMDAzOworCWltbXItPmltX2lvcG9ydC5pb3BfcGFwYXIgfD0gMHgwMDAzOworCisJLyogUEMxMS9QQzEwIGFzIHBlcmlwaGVyYWwgVVNCUlhQIFVTQlJYTiAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGNzbyB8PSAweDAwMzA7CisKKwkvKiBQQzcvUEM2IGFzIHBlcmhpcGVyYWwgVVNCVFhQIGFuZCBVU0JUWE4gKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGlyIHw9IDB4MDMwMDsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjcGFyIHw9IDB4MDMwMDsKKworCS8qIFNldCB0aGUgYmFzZSBhZGRyZXNzICovCisJYWRkcmVzc19iYXNlID0gKHUzMikgKGNwLT5jcF9kcG1lbSArIENQTV9VU0JfQkFTRSk7CisKKwkvKiBJbml0aWFsaXNlIGVuZHBvaW50cyBhbmQgY2lyY3VsYXIgYnVmZmVycyAqLworCW1wYzh4eF91ZGNfZW5kcG9pbnRfaW5pdCAoKTsKKwltcGM4eHhfdWRjX2NiZF9pbml0ICgpOworCisJLyogQXNzaWduIGFsbG9jYXRlZCBEdWFsIFBvcnQgRW5kcG9pbnQgZGVzY3JpcHRvcnMgKi8KKwl1c2JfcGFyYW1wLT5lcDBwdHIgPSAodTMyKSBlbmRwb2ludHNbMF07CisJdXNiX3BhcmFtcC0+ZXAxcHRyID0gKHUzMikgZW5kcG9pbnRzWzFdOworCXVzYl9wYXJhbXAtPmVwMnB0ciA9ICh1MzIpIGVuZHBvaW50c1syXTsKKwl1c2JfcGFyYW1wLT5lcDNwdHIgPSAodTMyKSBlbmRwb2ludHNbM107CisJdXNiX3BhcmFtcC0+ZnJhbWVfbiA9IDA7CisKKwlEQkcgKCJlcDBwdHI9MHglMDh4IGVwMXB0cj0weCUwOHggZXAycHRyPTB4JTA4eCBlcDNwdHI9MHglMDh4XG4iLAorCSAgICAgdXNiX3BhcmFtcC0+ZXAwcHRyLCB1c2JfcGFyYW1wLT5lcDFwdHIsIHVzYl9wYXJhbXAtPmVwMnB0ciwKKwkgICAgIHVzYl9wYXJhbXAtPmVwM3B0cik7CisKKwlyZXR1cm4gMDsKK30KKworLyogdWRjX2lycQorICoKKyAqIFBvbGwgZm9yIHdoYXRldmVyIGV2ZW50cyBtYXkgaGF2ZSBvY2N1cmVkCisgKi8KK3ZvaWQgdWRjX2lycSAodm9pZCkKK3sKKwlpbnQgZXBpZCA9IDA7CisJdm9sYXRpbGUgY2JkX3QgKnJ4X2NiZHAgPSAwOworCXZvbGF0aWxlIGNiZF90ICpyeF9jYmRwX2Jhc2UgPSAwOworCisJaWYgKHVkY19zdGF0ZSAhPSBTVEFURV9SRUFEWSkgeworCQlyZXR1cm47CisJfQorCisJaWYgKHVzYnAtPnVzYmVyICYgVVNCX0VfQlNZKSB7CisJCS8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbi4gSWYgaXQgZG9lcyB0aGVuIGl0J3MgYSBidWcgISAqLworCQl1c2JwLT51c2JlciB8PSBVU0JfRV9CU1k7CisJCW1wYzh4eF91ZGNfZmx1c2hfcnhfZmlmbyAoKTsKKwl9CisKKwkvKiBTY2FuIGFsbCBSWC9CaWRpcmVjdGlvbmFsIEVuZHBvaW50cyBmb3IgUlggZGF0YS4gKi8KKwlmb3IgKGVwaWQgPSAwOyBlcGlkIDwgTUFYX0VORFBPSU5UUzsgZXBpZCsrKSB7CisJCWlmICghZXBfcmVmW2VwaWRdLnByeCkgeworCQkJY29udGludWU7CisJCX0KKwkJcnhfY2JkcCA9IHJ4X2NiZHBfYmFzZSA9IGVwX3JlZltlcGlkXS5wcng7CisKKwkJZG8geworCQkJaWYgKCEocnhfY2JkcC0+Y2JkX3NjICYgUlhfQkRfRSkpIHsKKworCQkJCWlmIChyeF9jYmRwLT5jYmRfc2MgJiAweDFGKSB7CisJCQkJCS8qIENvcnJ1cHQgZGF0YSBkaXNjYXJkIGl0LgorCQkJCQkgKiBDb250cm9sbGVyIGhhcyBOQUsnZCB0aGlzIHBhY2tldC4KKwkJCQkJICovCisJCQkJCW1wYzh4eF91ZGNfY2xlYXJfcnhiZCAocnhfY2JkcCk7CisKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIWVwaWQpIHsKKwkJCQkJCW1wYzh4eF91ZGNfZXAwX3J4IChyeF9jYmRwKTsKKworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogUHJvY2VzcyBkYXRhICovCisJCQkJCQltcGM4eHhfdWRjX3NldF9uYWsgKGVwaWQpOworCQkJCQkJbXBjOHh4X3VkY19lcG5fcnggKGVwaWQsIHJ4X2NiZHApOworCQkJCQkJbXBjOHh4X3VkY19jbGVhcl9yeGJkIChyeF9jYmRwKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8qIEFkdmFuY2UgUlggQ0JEIHBvaW50ZXIgKi8KKwkJCQltcGM4eHhfdWRjX2FkdmFuY2VfcnggKCZyeF9jYmRwLCBlcGlkKTsKKwkJCQllcF9yZWZbZXBpZF0ucHJ4ID0gcnhfY2JkcDsKKwkJCX0gZWxzZSB7CisJCQkJLyogQWR2YW5jZSBSWCBDQkQgcG9pbnRlciAqLworCQkJCW1wYzh4eF91ZGNfYWR2YW5jZV9yeCAoJnJ4X2NiZHAsIGVwaWQpOworCQkJfQorCisJCX0gd2hpbGUgKHJ4X2NiZHAgIT0gcnhfY2JkcF9iYXNlKTsKKwl9CisKKwkvKiBIYW5kbGUgVFggZXZlbnRzIGFzIGFwcHJvcGlhdGUsIHRoZSBjb3JyZWN0IHBsYWNlIHRvIGRvIHRoaXMgaXMKKwkgKiBpbiBhIHR4IHJvdXRpbmUuIFBlcmhhcHMgVFggb24gZXBuIHdhcyBwcmUtZW1wdGVkIGJ5IGVwMAorCSAqLworCisJaWYgKHVzYnAtPnVzYmVyICYgVVNCX0VfVFhCKSB7CisJCXVzYnAtPnVzYmVyIHw9IFVTQl9FX1RYQjsKKwl9CisKKwlpZiAodXNicC0+dXNiZXIgJiAoVVNCX1RYX0VSUk1BU0spKSB7CisJCW1wYzh4eF91ZGNfaGFuZGxlX3R4ZXJyICgpOworCX0KKworCS8qIFN3aXRjaCB0byB0aGUgZGVmYXVsdCBzdGF0ZSwgcmVzcG9uZCBhdCB0aGUgZGVmYXVsdCBhZGRyZXNzICovCisJaWYgKHVzYnAtPnVzYmVyICYgVVNCX0VfUkVTRVQpIHsKKwkJdXNicC0+dXNiZXIgfD0gVVNCX0VfUkVTRVQ7CisJCXVzYnAtPnVzYWRkciA9IDB4MDA7CisJCXVkY19kZXZpY2UtPmRldmljZV9zdGF0ZSA9IFNUQVRFX0RFRkFVTFQ7CisJfQorCisJLyogaWYodXNicC0+dXNiZXImVVNCX0VfSURMRSl7CisJICAgV2UgY291bGQgc3VzcGVuZCBoZXJlICEKKwkgICB1c2JwLT51c2Jlcnw9VVNCX0VfSURMRTsKKwkgICBEQkcoImlkbGUgc3RhdGUgY2hhbmdlXG4iKTsKKwkgICB9CisJICAgaWYodXNicC0+dXNicyl7CisJICAgV2UgY291bGQgcmVzdW1lIGhlcmUgd2hlbiBJRExFIGlzIGRlYXNzZXJ0ZWQgIQorCSAgIE5vdCB3b3J0aCBkb2luZywgc28gbG9uZyBhcyB3ZSBhcmUgc2VsZiBwb3dlcmVkIHRob3VnaC4KKwkgICB9CisJKi8KKworCXJldHVybjsKK30KKworLyogdWRjX2VuZHBvaW50X3dyaXRlCisgKgorICogV3JpdGUgc29tZSBkYXRhIHRvIGFuIGVuZHBvaW50CisgKi8KK2ludCB1ZGNfZW5kcG9pbnRfd3JpdGUgKHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVwaSkKK3sKKwlpbnQgZXAgPSAwOworCXNob3J0IGVwaWQgPSAxLCB1bm5hayA9IDAsIHJldCA9IDA7CisKKwlpZiAodWRjX3N0YXRlICE9IFNUQVRFX1JFQURZKSB7CisJCUVSUiAoImludmFsaWQgdWRjX3N0YXRlICE9IFNUQVRFX1JFQURZIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIXVkY19kZXZpY2UgfHwgIWVwaSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHVkY19kZXZpY2UtPmRldmljZV9zdGF0ZSAhPSBTVEFURV9DT05GSUdVUkVEKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwllcCA9IGVwaS0+ZW5kcG9pbnRfYWRkcmVzcyAmIDB4MDM7CisJaWYgKGVwID49IE1BWF9FTkRQT0lOVFMpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFNldCBOQUsgZm9yIGFsbCBSWCBlbmRwb2ludHMgZHVyaW5nIFRYICovCisJZm9yIChlcGlkID0gMTsgZXBpZCA8IE1BWF9FTkRQT0lOVFM7IGVwaWQrKykgeworCisJCS8qIERvbid0IHNldCBOQUsgb24gREFUQSBJTi9DT05UUk9MIGVuZHBvaW50cyAqLworCQlpZiAoZXBfcmVmW2VwaWRdLnNjICYgVVNCX0RJUl9JTikgeworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoISh1c2JwLT51c2VwW2VwaWRdICYgKFVTRVBfVEhTX05BSyB8IFVTRVBfUkhTX05BSykpKSB7CisJCQl1bm5hayB8PSAxIDw8IGVwaWQ7CisJCX0KKworCQltcGM4eHhfdWRjX3NldF9uYWsgKGVwaWQpOworCX0KKworCW1wYzh4eF91ZGNfaW5pdF90eCAoJnVkY19kZXZpY2UtPmJ1cy0+ZW5kcG9pbnRfYXJyYXlbZXBdLAorCQkJICAgIGVwaS0+dHhfdXJiKTsKKwlyZXQgPSBtcGM4eHhfdWRjX2VwX3R4ICgmdWRjX2RldmljZS0+YnVzLT5lbmRwb2ludF9hcnJheVtlcF0pOworCisJLyogUmVtb3ZlIHRlbXBvcmFyeSBOQUsgKi8KKwlmb3IgKGVwaWQgPSAxOyBlcGlkIDwgTUFYX0VORFBPSU5UUzsgZXBpZCsrKSB7CisJCWlmICh1bm5hayAmICgxIDw8IGVwaWQpKSB7CisJCQl1ZGNfdW5zZXRfbmFrIChlcGlkKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIG1wYzh4eF91ZGNfYXNzaWduX3VyYgorICoKKyAqIEFzc29jaWF0ZSBhIGdpdmVuIHVyYiB0byBhbiBlbmRwb2ludCBUWCBvciBSWCB0cmFuc21pdC9yZWNlaXZlIGJ1ZmZlcnMKKyAqLworc3RhdGljIGludCBtcGM4eHhfdWRjX2Fzc2lnbl91cmIgKGludCBlcCwgY2hhciBkaXJlY3Rpb24pCit7CisJc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZXBpID0gMDsKKworCWlmIChlcCA+PSBNQVhfRU5EUE9JTlRTKSB7CisJCWdvdG8gZXJyOworCX0KKwllcGkgPSAmdWRjX2RldmljZS0+YnVzLT5lbmRwb2ludF9hcnJheVtlcF07CisJaWYgKCFlcGkpIHsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKCFlcF9yZWZbZXBdLnVyYikgeworCQllcF9yZWZbZXBdLnVyYiA9IHVzYmRfYWxsb2NfdXJiICh1ZGNfZGV2aWNlLCB1ZGNfZGV2aWNlLT5idXMtPmVuZHBvaW50X2FycmF5KTsKKwkJaWYgKCFlcF9yZWZbZXBdLnVyYikgeworCQkJZ290byBlcnI7CisJCX0KKwl9IGVsc2UgeworCQllcF9yZWZbZXBdLnVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CisJfQorCisJc3dpdGNoIChkaXJlY3Rpb24pIHsKKwljYXNlIFVTQl9ESVJfSU46CisJCWVwaS0+dHhfdXJiID0gZXBfcmVmW2VwXS51cmI7CisJCWJyZWFrOworCWNhc2UgVVNCX0RJUl9PVVQ6CisJCWVwaS0+cmN2X3VyYiA9IGVwX3JlZltlcF0udXJiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGVycjsKKwl9CisJcmV0dXJuIDA7CisKKyAgICAgIGVycjoKKwl1ZGNfc3RhdGUgPSBTVEFURV9FUlJPUjsKKwlyZXR1cm4gLTE7Cit9CisKKy8qIHVkY19zZXR1cF9lcAorICoKKyAqIEFzc29jaWF0ZSBVLUJvb3Qgc29mdHdhcmUgZW5kcG9pbnRzIHRvIG1wYzh4eCBlbmRwb2ludCBwYXJhbWV0ZXIgcmFtCisgKiBJc29jaHJvbm91cyBlbmRwb2ludHMgYXJlbid0IHlldCBzdXBwb3J0ZWQhCisgKi8KK3ZvaWQgdWRjX3NldHVwX2VwIChzdHJ1Y3QgdXNiX2RldmljZV9pbnN0YW5jZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgZXAsCisJCSAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVwaSkKK3sKKwl1Y2hhciBkaXJlY3Rpb24gPSAwOworCWludCBlcF9hdHRyaWIgPSAwOworCisJaWYgKGVwaSAmJiAoZXAgPCBNQVhfRU5EUE9JTlRTKSkgeworCisJCWlmIChlcCA9PSAwKSB7CisJCQlpZiAoZXBpLT5yY3ZfYXR0cmlidXRlcyAhPSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MCisJCQkgICAgfHwgZXBpLT50eF9hdHRyaWJ1dGVzICE9CisJCQkgICAgVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCkgeworCisJCQkJLyogZXAwIG11c3QgYmUgYSBjb250cm9sIGVuZHBvaW50ICovCisJCQkJdWRjX3N0YXRlID0gU1RBVEVfRVJST1I7CisJCQkJcmV0dXJuOworCisJCQl9CisJCQlpZiAoIShlcF9yZWZbZXBdLnNjICYgRVBfQVRUQUNIRUQpKSB7CisJCQkJbXBjOHh4X3VkY19jYmRfYXR0YWNoIChlcCwgZXBpLT50eF9wYWNrZXRTaXplLAorCQkJCQkJICAgICAgIGVwaS0+cmN2X3BhY2tldFNpemUpOworCQkJfQorCQkJdXNicC0+dXNlcFtlcF0gPSAweDAwMDA7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoKGVwaS0+ZW5kcG9pbnRfYWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykKKwkJICAgID09IFVTQl9ESVJfSU4pIHsKKworCQkJZGlyZWN0aW9uID0gMTsKKwkJCWVwX2F0dHJpYiA9IGVwaS0+dHhfYXR0cmlidXRlczsKKwkJCWVwaS0+cmN2X3BhY2tldFNpemUgPSAwOworCQkJZXBfcmVmW2VwXS5zYyB8PSBVU0JfRElSX0lOOworCQl9IGVsc2UgeworCisJCQlkaXJlY3Rpb24gPSAwOworCQkJZXBfYXR0cmliID0gZXBpLT5yY3ZfYXR0cmlidXRlczsKKwkJCWVwaS0+dHhfcGFja2V0U2l6ZSA9IDA7CisJCQllcF9yZWZbZXBdLnNjICY9IH5VU0JfRElSX0lOOworCQl9CisKKwkJaWYgKG1wYzh4eF91ZGNfYXNzaWduX3VyYiAoZXAsIGVwaS0+ZW5kcG9pbnRfYWRkcmVzcworCQkJCQkgICAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXN3aXRjaCAoZXBfYXR0cmliKSB7CisJCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTDoKKwkJCWlmICghKGVwX3JlZltlcF0uc2MgJiBFUF9BVFRBQ0hFRCkpIHsKKwkJCQltcGM4eHhfdWRjX2NiZF9hdHRhY2ggKGVwLAorCQkJCQkJICAgICAgIGVwaS0+dHhfcGFja2V0U2l6ZSwKKwkJCQkJCSAgICAgICBlcGktPnJjdl9wYWNrZXRTaXplKTsKKwkJCX0KKwkJCXVzYnAtPnVzZXBbZXBdID0gZXAgPDwgMTI7CisJCQllcGktPnJjdl91cmIgPSBlcGktPnR4X3VyYiA9IGVwX3JlZltlcF0udXJiOworCisJCQlicmVhazsKKwkJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLOgorCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKKwkJCWlmICghKGVwX3JlZltlcF0uc2MgJiBFUF9BVFRBQ0hFRCkpIHsKKwkJCQlpZiAoZGlyZWN0aW9uKSB7CisJCQkJCW1wYzh4eF91ZGNfY2JkX2F0dGFjaCAoZXAsCisJCQkJCQkJICAgICAgIGVwaS0+dHhfcGFja2V0U2l6ZSwKKwkJCQkJCQkgICAgICAgMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbXBjOHh4X3VkY19jYmRfYXR0YWNoIChlcCwKKwkJCQkJCQkgICAgICAgMCwKKwkJCQkJCQkgICAgICAgZXBpLT5yY3ZfcGFja2V0U2l6ZSk7CisJCQkJfQorCQkJfQorCQkJdXNicC0+dXNlcFtlcF0gPSAoZXAgPDwgMTIpIHwgKChlcF9hdHRyaWIpIDw8IDgpOworCisJCQlicmVhazsKKwkJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DOgorCQlkZWZhdWx0OgorCQkJc2VyaWFsX3ByaW50ZiAoIkVycm9yIGVuZHBvaW50IGF0dHJpYiAlZD4zXG4iLCBlcF9hdHRyaWIpOworCQkJdWRjX3N0YXRlID0gU1RBVEVfRVJST1I7CisJCQlicmVhazsKKwkJfQorCX0KKworfQorCisvKiB1ZGNfY29ubmVjdAorICoKKyAqIE1vdmUgc3RhdGUsIHN3aXRjaCBvbiB0aGUgVVNCCisgKi8KK3ZvaWQgdWRjX2Nvbm5lY3QgKHZvaWQpCit7CisJLyogRW5hYmxlIHB1bGwtdXAgcmVzaXN0b3Igb24gRCsKKwkgKiBUT0RPOiBmaXQgYSBwdWxsLXVwIHJlc2lzdG9yIHRvIGRyaXZlIFNFMCBmb3IgPiAyLjV1cworCSAqLworCisJaWYgKHVkY19zdGF0ZSAhPSBTVEFURV9FUlJPUikgeworCQl1ZGNfc3RhdGUgPSBTVEFURV9SRUFEWTsKKwkJdXNicC0+dXNtb2QgfD0gVVNNT0RfRU47CisJfQorfQorCisvKiB1ZGNfZGlzY29ubmVjdAorICoKKyAqIERpc2Nvbm5lY3QgaXMgbm90IHVzZWQgYnV0LCBpcyBpbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzCisgKi8KK3ZvaWQgdWRjX2Rpc2Nvbm5lY3QgKHZvaWQpCit7CisJLyogRGlzYWJsZSBwdWxsLXVwIHJlc2lzdG9yIG9uIEQtCisJICogVE9ETzogZml4IGEgcHVsbHVwIHJlc2lzdG9yIHRvIGNvbnRyb2wgdGhpcworCSAqLworCisJaWYgKHVkY19zdGF0ZSAhPSBTVEFURV9FUlJPUikgeworCQl1ZGNfc3RhdGUgPSBTVEFURV9OT1RfUkVBRFk7CisJfQorCXVzYnAtPnVzbW9kICY9IH5VU01PRF9FTjsKK30KKworLyogdWRjX2VuYWJsZQorICoKKyAqIEdyYWIgYW4gRVAwIFVSQiwgcmVnaXN0ZXIgaW50ZXJlc3QgaW4gYSBzdWJzZXQgb2YgVVNCIGV2ZW50cworICovCit2b2lkIHVkY19lbmFibGUgKHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UpCit7CisJaWYgKHVkY19zdGF0ZSA9PSBTVEFURV9FUlJPUikgeworCQlyZXR1cm47CisJfQorCisJdWRjX2RldmljZSA9IGRldmljZTsKKworCWlmICghZXBfcmVmWzBdLnVyYikgeworCQllcF9yZWZbMF0udXJiID0gdXNiZF9hbGxvY191cmIgKGRldmljZSwgZGV2aWNlLT5idXMtPmVuZHBvaW50X2FycmF5KTsKKwl9CisKKwkvKiBSZWdpc3RlciBpbnRlcmVzdCBpbiBhbGwgZXZlbnRzIGV4Y2VwdCBTT0YsIGVuYWJsZSB0cmFuc2NlaXZlciAqLworCXVzYnAtPnVzYmVyID0gMHgwM0ZGOworCXVzYnAtPnVzYm1yID0gMHgwMkY3OworCisJcmV0dXJuOworfQorCisvKiB1ZGNfZGlzYWJsZQorICoKKyAqIGRpc2FibGUgdGhlIGN1cnJlbnRseSBob29rZWQgZGV2aWNlCisgKi8KK3ZvaWQgdWRjX2Rpc2FibGUgKHZvaWQpCit7CisJaW50IGkgPSAwOworCisJaWYgKHVkY19zdGF0ZSA9PSBTVEFURV9FUlJPUikgeworCQlEQkcgKCJXb24ndCBkaXNhYmxlIFVEQy4gdWRjX3N0YXRlPT1TVEFURV9FUlJPUiAhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXVkY19kZXZpY2UgPSAwOworCisJZm9yICg7IGkgPCBNQVhfRU5EUE9JTlRTOyBpKyspIHsKKwkJaWYgKGVwX3JlZltpXS51cmIpIHsKKwkJCXVzYmRfZGVhbGxvY191cmIgKGVwX3JlZltpXS51cmIpOworCQkJZXBfcmVmW2ldLnVyYiA9IDA7CisJCX0KKwl9CisKKwl1c2JwLT51c2JtciA9IDB4MDA7CisJdXNicC0+dXNtb2QgPSB+VVNNT0RfRU47CisJdWRjX3N0YXRlID0gU1RBVEVfTk9UX1JFQURZOworfQorCisvKiB1ZGNfc3RhcnR1cF9ldmVudHMKKyAqCisgKiBFbmFibGUgdGhlIHNwZWNpZmllZCBkZXZpY2UKKyAqLwordm9pZCB1ZGNfc3RhcnR1cF9ldmVudHMgKHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UpCit7CisJdWRjX2VuYWJsZSAoZGV2aWNlKTsKKwlpZiAodWRjX3N0YXRlID09IFNUQVRFX1JFQURZKSB7CisJCXVzYmRfZGV2aWNlX2V2ZW50X2lycSAoZGV2aWNlLCBERVZJQ0VfQ1JFQVRFLCAwKTsKKwl9Cit9CisKKy8qIHVkY19zZXRfbmFrCisgKgorICogQWxsb3cgdXBwZXIgbGF5ZXJzIHRvIHNpZ25hbCBsb3dlciBsYXllcnMgc2hvdWxkIG5vdCBhY2NlcHQgbW9yZSBSWCBkYXRhCisgKgorICovCit2b2lkIHVkY19zZXRfbmFrIChpbnQgZXBpZCkKK3sKKwlpZiAoZXBpZCkgeworCQltcGM4eHhfdWRjX3NldF9uYWsgKGVwaWQpOworCX0KK30KKworLyogdWRjX3Vuc2V0X25haworICoKKyAqIFN1c3BlbmQgc2VuZGluZyBvZiBOQUsgdG9rZW5zIGZvciBEQVRBIE9VVCB0b2tlbnMgb24gYSBnaXZlbiBlbmRwb2ludC4KKyAqIFN3aXRjaCBvZmYgTkFLaW5nIG9uIHRoaXMgZW5kcG9pbnQgdG8gYWNjZXB0IG1vcmUgZGF0YSBvdXRwdXQgZnJvbSBob3N0LgorICoKKyAqLwordm9pZCB1ZGNfdW5zZXRfbmFrIChpbnQgZXBpZCkKK3sKKwlpZiAoZXBpZCA+IE1BWF9FTkRQT0lOVFMpIHsKKwkJcmV0dXJuOworCX0KKworCWlmICh1c2JwLT51c2VwW2VwaWRdICYgKFVTRVBfVEhTX05BSyB8IFVTRVBfUkhTX05BSykpIHsKKwkJdXNicC0+dXNlcFtlcGlkXSAmPSB+KFVTRVBfVEhTX05BSyB8IFVTRVBfUkhTX05BSyk7CisJCV9fYXNtX18gKCJlaWVpbyIpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJICAgICAgU3RhdGljIExpbmthZ2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogdWRjX3N0YXRlX3RyYW5zaXRpb25fdXAKKyAqIHVkY19zdGF0ZV90cmFuc2l0aW9uX2Rvd24KKyAqCisgKiBIZWxwZXIgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBkZXZpY2Ugc3RhdGUgY2hhbmdlcy4JVGhlIGRldmljZSBzdGF0ZXMgYW5kCisgKiB0aGUgZXZlbnRzIHRoYXQgdHJhbnNpdGlvbiBiZXR3ZWVuIHRoZW0gYXJlOgorICoKKyAqCQkJCVNUQVRFX0FUVEFDSEVECisgKgkJCQl8fAkvXAorICoJCQkJXC8JfHwKKyAqCURFVklDRV9IVUJfQ09ORklHVVJFRAkJCURFVklDRV9IVUJfUkVTRVQKKyAqCQkJCXx8CS9cCisgKgkJCQlcLwl8fAorICoJCQkJU1RBVEVfUE9XRVJFRAorICoJCQkJfHwJL1wKKyAqCQkJCVwvCXx8CisgKglERVZJQ0VfUkVTRVQJCQkJREVWSUNFX1BPV0VSX0lOVEVSUlVQVElPTgorICoJCQkJfHwJL1wKKyAqCQkJCVwvCXx8CisgKgkJCQlTVEFURV9ERUZBVUxUCisgKgkJCQl8fAkvXAorICoJCQkJXC8JfHwKKyAqCURFVklDRV9BRERSRVNTX0FTU0lHTkVECQkJREVWSUNFX1JFU0VUCisgKgkJCQl8fAkvXAorICoJCQkJXC8JfHwKKyAqCQkJCVNUQVRFX0FERFJFU1NFRAorICoJCQkJfHwJL1wKKyAqCQkJCVwvCXx8CisgKglERVZJQ0VfQ09ORklHVVJFRAkJCURFVklDRV9ERV9DT05GSUdVUkVECisgKgkJCQl8fAkvXAorICoJCQkJXC8JfHwKKyAqCQkJCVNUQVRFX0NPTkZJR1VSRUQKKyAqCisgKiB1ZGNfc3RhdGVfdHJhbnNpdGlvbl91cCB0cmFuc2l0aW9ucyB1cCAoaW4gdGhlIGRpcmVjdGlvbiBmcm9tIFNUQVRFX0FUVEFDSEVECisgKiB0byBTVEFURV9DT05GSUdVUkVEKSBmcm9tIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBzdGF0ZSB0byB0aGUgc3BlY2lmaWVkIGZpbmFsCisgKiBzdGF0ZSwgcGFzc2luZyB0aHJvdWdoIGVhY2ggaW50ZXJtZWRpYXRlIHN0YXRlIG9uIHRoZSB3YXkuICBJZiB0aGUgaW5pdGlhbAorICogc3RhdGUgaXMgYXQgb3IgYWJvdmUgKGkuZS4gbmVhcmVyIHRvIFNUQVRFX0NPTkZJR1VSRUQpIHRoZSBmaW5hbCBzdGF0ZSwgdGhlbgorICogbm8gc3RhdGUgdHJhbnNpdGlvbnMgd2lsbCB0YWtlIHBsYWNlLgorICoKKyAqIHVkY19zdGF0ZV90cmFuc2l0aW9uX2Rvd24gdHJhbnNpdGlvbnMgZG93biAoaW4gdGhlIGRpcmVjdGlvbiBmcm9tCisgKiBTVEFURV9DT05GSUdVUkVEIHRvIFNUQVRFX0FUVEFDSEVEKSBmcm9tIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBzdGF0ZSB0byB0aGUKKyAqIHNwZWNpZmllZCBmaW5hbCBzdGF0ZSwgcGFzc2luZyB0aHJvdWdoIGVhY2ggaW50ZXJtZWRpYXRlIHN0YXRlIG9uIHRoZSB3YXkuCisgKiBJZiB0aGUgaW5pdGlhbCBzdGF0ZSBpcyBhdCBvciBiZWxvdyAoaS5lLiBuZWFyZXIgdG8gU1RBVEVfQVRUQUNIRUQpIHRoZSBmaW5hbAorICogc3RhdGUsIHRoZW4gbm8gc3RhdGUgdHJhbnNpdGlvbnMgd2lsbCB0YWtlIHBsYWNlLgorICoKKyAqLworCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX3N0YXRlX3RyYW5zaXRpb25fdXAgKHVzYl9kZXZpY2Vfc3RhdGVfdCBpbml0aWFsLAorCQkJCQkgICAgdXNiX2RldmljZV9zdGF0ZV90IGZpbmFsKQoreworCWlmIChpbml0aWFsIDwgZmluYWwpIHsKKwkJc3dpdGNoIChpbml0aWFsKSB7CisJCWNhc2UgU1RBVEVfQVRUQUNIRUQ6CisJCQl1c2JkX2RldmljZV9ldmVudF9pcnEgKHVkY19kZXZpY2UsCisJCQkJCSAgICAgICBERVZJQ0VfSFVCX0NPTkZJR1VSRUQsIDApOworCQkJaWYgKGZpbmFsID09IFNUQVRFX1BPV0VSRUQpCisJCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfUE9XRVJFRDoKKwkJCXVzYmRfZGV2aWNlX2V2ZW50X2lycSAodWRjX2RldmljZSwgREVWSUNFX1JFU0VULCAwKTsKKwkJCWlmIChmaW5hbCA9PSBTVEFURV9ERUZBVUxUKQorCQkJCWJyZWFrOworCQljYXNlIFNUQVRFX0RFRkFVTFQ6CisJCQl1c2JkX2RldmljZV9ldmVudF9pcnEgKHVkY19kZXZpY2UsCisJCQkJCSAgICAgICBERVZJQ0VfQUREUkVTU19BU1NJR05FRCwgMCk7CisJCQlpZiAoZmluYWwgPT0gU1RBVEVfQUREUkVTU0VEKQorCQkJCWJyZWFrOworCQljYXNlIFNUQVRFX0FERFJFU1NFRDoKKwkJCXVzYmRfZGV2aWNlX2V2ZW50X2lycSAodWRjX2RldmljZSwgREVWSUNFX0NPTkZJR1VSRUQsCisJCQkJCSAgICAgICAwKTsKKwkJY2FzZSBTVEFURV9DT05GSUdVUkVEOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19zdGF0ZV90cmFuc2l0aW9uX2Rvd24gKHVzYl9kZXZpY2Vfc3RhdGVfdCBpbml0aWFsLAorCQkJCQkgICAgICB1c2JfZGV2aWNlX3N0YXRlX3QgZmluYWwpCit7CisJaWYgKGluaXRpYWwgPiBmaW5hbCkgeworCQlzd2l0Y2ggKGluaXRpYWwpIHsKKwkJY2FzZSBTVEFURV9DT05GSUdVUkVEOgorCQkJdXNiZF9kZXZpY2VfZXZlbnRfaXJxICh1ZGNfZGV2aWNlLAorCQkJCQkgICAgICAgREVWSUNFX0RFX0NPTkZJR1VSRUQsIDApOworCQkJaWYgKGZpbmFsID09IFNUQVRFX0FERFJFU1NFRCkKKwkJCQlicmVhazsKKwkJY2FzZSBTVEFURV9BRERSRVNTRUQ6CisJCQl1c2JkX2RldmljZV9ldmVudF9pcnEgKHVkY19kZXZpY2UsIERFVklDRV9SRVNFVCwgMCk7CisJCQlpZiAoZmluYWwgPT0gU1RBVEVfREVGQVVMVCkKKwkJCQlicmVhazsKKwkJY2FzZSBTVEFURV9ERUZBVUxUOgorCQkJdXNiZF9kZXZpY2VfZXZlbnRfaXJxICh1ZGNfZGV2aWNlLAorCQkJCQkgICAgICAgREVWSUNFX1BPV0VSX0lOVEVSUlVQVElPTiwgMCk7CisJCQlpZiAoZmluYWwgPT0gU1RBVEVfUE9XRVJFRCkKKwkJCQlicmVhazsKKwkJY2FzZSBTVEFURV9QT1dFUkVEOgorCQkJdXNiZF9kZXZpY2VfZXZlbnRfaXJxICh1ZGNfZGV2aWNlLCBERVZJQ0VfSFVCX1JFU0VULAorCQkJCQkgICAgICAgMCk7CisJCWNhc2UgU1RBVEVfQVRUQUNIRUQ6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiBtcGM4eHhfdWRjX3N0YWxsCisgKgorICogRm9yY2UgcmV0dXJuaW5nIG9mIFNUQUxMIHRva2VucyBvbiB0aGUgZ2l2ZW4gZW5kcG9pbnQuIFByb3RvY29sIG9yIGZ1bmN0aW9uCisgKiBTVEFMTCBjb25kaXRpb25zIGFyZSBwZXJtaXNzYWJsZSBoZXJlCisgKi8KK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfc3RhbGwgKHVuc2lnbmVkIGludCBlcCkKK3sKKwl1c2JwLT51c2VwW2VwXSB8PSBTVEFMTF9CSVRNQVNLOworfQorCisvKiBtcGM4eHhfdWRjX3NldF9uYWsKKyAqCisgKiBGb3JjZSByZXR1cm5pbmcgb2YgTkFLIHJlc3BvbnNlcyBmb3IgdGhlIGdpdmVuIGVuZHBvaW50IGFzIGEga2luZCBvZiB2ZXJ5CisgKiBzaW1wbGUgZmxvdyBjb250cm9sCisgKi8KK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfc2V0X25hayAodW5zaWduZWQgaW50IGVwKQoreworCXVzYnAtPnVzZXBbZXBdIHw9IE5BS19CSVRNQVNLOworCV9fYXNtX18gKCJlaWVpbyIpOworfQorCisvKiBtcGM4eHhfdWRjX2hhbmRsZV90eGVycgorICoKKyAqIEhhbmRsZSBlcnJvcnMgcmVsZXZhbnQgdG8gVFguIFJldHVybiBhIHN0YXR1cyBjb2RlIHRvIGFsbG93IGNhbGxpbmcKKyAqIGluZGljYXRpdmUgb2Ygd2hhdCBpZiBhbnl0aGluZyBoYXBwZW5lZAorICovCitzdGF0aWMgc2hvcnQgbXBjOHh4X3VkY19oYW5kbGVfdHhlcnIgKCkKK3sKKwlzaG9ydCBlcCA9IDAsIHJldCA9IDA7CisKKwlmb3IgKDsgZXAgPCBUWF9SSU5HX1NJWkU7IGVwKyspIHsKKwkJaWYgKHVzYnAtPnVzYmVyICYgKDB4MTAgPDwgZXApKSB7CisKKwkJCS8qIFRpbWVvdXQgb3IgdW5kZXJydW4gKi8KKwkJCWlmICh0eF9jYmRbZXBdLT5jYmRfc2MgJiAweDA2KSB7CisJCQkJcmV0ID0gMTsKKwkJCQltcGM4eHhfdWRjX2ZsdXNoX3R4X2ZpZm8gKGVwKTsKKworCQkJfSBlbHNlIHsKKwkJCQlpZiAodXNicC0+dXNlcFtlcF0gJiBTVEFMTF9CSVRNQVNLKSB7CisJCQkJCWlmICghZXApIHsKKwkJCQkJCXVzYnAtPnVzZXBbZXBdICY9IH5TVEFMTF9CSVRNQVNLOworCQkJCQl9CisJCQkJfQkvKiBlbHNlIE5BSyAqLworCQkJfQorCQkJdXNicC0+dXNiZXIgfD0gKDB4MTAgPDwgZXApOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIG1wYzh4eF91ZGNfYWR2YW5jZV9yeAorICoKKyAqIEFkdmFuY2UgY2JkIHJ4CisgKi8KK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfYWR2YW5jZV9yeCAodm9sYXRpbGUgY2JkX3QgKiogcnhfY2JkcCwgaW50IGVwaWQpCit7CisJaWYgKCgqcnhfY2JkcCktPmNiZF9zYyAmIFJYX0JEX1cpIHsKKwkJKnJ4X2NiZHAgPSAodm9sYXRpbGUgY2JkX3QgKikgKGVuZHBvaW50c1tlcGlkXS0+cmJhc2UgKyBDRkdfSU1NUik7CisKKwl9IGVsc2UgeworCQkoKnJ4X2NiZHApKys7CisJfQorfQorCisKKy8qIG1wYzh4eF91ZGNfZmx1c2hfdHhfZmlmbworICoKKyAqIEZsdXNoIGEgZ2l2ZW4gVFggZmlmby4gQXNzdW1lcyBvbmUgdHggY2JkIHBlciBlbmRwb2ludAorICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2ZsdXNoX3R4X2ZpZm8gKGludCBlcGlkKQoreworCXZvbGF0aWxlIGNiZF90ICp0eF9jYmRwID0gMDsKKworCWlmIChlcGlkID4gTUFYX0VORFBPSU5UUykgeworCQlyZXR1cm47CisJfQorCisJLyogVFggc3RvcCAqLworCWltbXItPmltX2NwbS5jcF9jcGNyID0gKChlcGlkIDw8IDIpIHwgMHgxRDAxKTsKKwlfX2FzbV9fICgiZWllaW8iKTsKKwl3aGlsZSAoaW1tci0+aW1fY3BtLmNwX2NwY3IgJiAweDAxKTsKKworCXVzYnAtPnVzY29tID0gMHg0MCB8IDA7CisKKwkvKiByZXNldCByaW5nICovCisJdHhfY2JkcCA9IChjYmRfdCAqKSAoZW5kcG9pbnRzW2VwaWRdLT50YnB0ciArIENGR19JTU1SKTsKKwl0eF9jYmRwLT5jYmRfc2MgPSAoVFhfQkRfSSB8IFRYX0JEX1cpOworCisKKwllbmRwb2ludHNbZXBpZF0tPnRwdHIgPSBlbmRwb2ludHNbZXBpZF0tPnRiYXNlOworCWVuZHBvaW50c1tlcGlkXS0+dHN0YXRlID0gMHgwMDsKKwllbmRwb2ludHNbZXBpZF0tPnRiY250ID0gMHgwMDsKKworCS8qIFRYIHN0YXJ0ICovCisJaW1tci0+aW1fY3BtLmNwX2NwY3IgPSAoKGVwaWQgPDwgMikgfCAweDJEMDEpOworCV9fYXNtX18gKCJlaWVpbyIpOworCXdoaWxlIChpbW1yLT5pbV9jcG0uY3BfY3BjciAmIDB4MDEpOworCisJcmV0dXJuOworfQorCisvKiBtcGM4eHhfdWRjX2ZsdXNoX3J4X2ZpZm8KKyAqCisgKiBGb3IgdGhlIHNha2Ugb2YgY29tcGxldGVuZXNzIG9mIHRoZSBuYW1lc3BhY2UsIGl0IHNlZW1zIGxpa2UKKyAqIGEgZ29vZC1kZXNpZ24tZGVjaXNpb24gKHRtKSB0byBpbmNsdWRlIG1wYzh4eF91ZGNfZmx1c2hfcnhfZmlmbygpOworICogSWYgUlhfQkRfRSBpcyB0cnVlID0+IGEgZHJpdmVyIGJ1ZyBlaXRoZXIgaGVyZSBvciBpbiBhbiB1cHBlciBsYXllcgorICogbm90IHBvbGxpbmcgZnJlcXVlbnRseSBlbm91Z2guIElmIFJYX0JEX0UgaXMgdHJ1ZSB3ZSBoYXZlIHRvbGQgdGhlIGhvc3QKKyAqIHdlIGhhdmUgYWNjZXB0ZWQgZGF0YSBidXQsIHRoZSBDUE0gZm91bmQgaXQgaGFkIG5vLXdoZXJlIHRvIHB1dCB0aGF0IGRhdGEKKyAqIHdoaWNoIG5lZWRsZXNzIHRvIHNheSB3b3VsZCBiZSBhIGJhZCB0aGluZy4KKyAqLworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19mbHVzaF9yeF9maWZvICgpCit7CisJaW50IGkgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmICghKHJ4X2NiZFtpXS0+Y2JkX3NjICYgUlhfQkRfRSkpIHsKKwkJCUVSUiAoImJ1ZiAlcCB1c2VkIHJ4IGRhdGEgbGVuID0gMHgleCBzYz0weCV4IVxuIiwKKwkJCSAgICAgcnhfY2JkW2ldLCByeF9jYmRbaV0tPmNiZF9kYXRsZW4sCisJCQkgICAgIHJ4X2NiZFtpXS0+Y2JkX3NjKTsKKworCQl9CisJfQorCUVSUiAoIkJVRyA6IElucHV0IG92ZXItcnVuXG4iKTsKK30KKworLyogbXBjOHh4X3VkY19jbGVhcl9yeGJkCisgKgorICogUmVsZWFzZSBjb250cm9sIG9mIFJYIENCRCB0byBDUC4KKyAqLworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19jbGVhcl9yeGJkICh2b2xhdGlsZSBjYmRfdCAqIHJ4X2NiZHApCit7CisJcnhfY2JkcC0+Y2JkX2RhdGxlbiA9IDB4MDAwMDsKKwlyeF9jYmRwLT5jYmRfc2MgPSAoKHJ4X2NiZHAtPmNiZF9zYyAmIFJYX0JEX1cpIHwgKFJYX0JEX0UgfCBSWF9CRF9JKSk7CisJX19hc21fXyAoImVpZWlvIik7Cit9CisKKy8qIG1wYzh4eF91ZGNfdHhfaXJxCisgKgorICogUGFyc2UgZm9yIHR4IHRpbWVvdXQsIGNvbnRyb2wgUlggb3IgVVNCIHJlc2V0L2J1c3kgY29uZGl0aW9ucworICogUmV0dXJuIC0xIG9uIHRpbWVvdXQsIC0yIG9uIGZhdGFsIGVycm9yLCBlbHNlIHJldHVybiB6ZXJvCisgKi8KK3N0YXRpYyBpbnQgbXBjOHh4X3VkY190eF9pcnEgKGludCBlcCkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAodXNicC0+dXNiZXIgJiAoVVNCX1RYX0VSUk1BU0spKSB7CisJCWlmIChtcGM4eHhfdWRjX2hhbmRsZV90eGVyciAoKSkgeworCQkJLyogVGltZW91dCwgY29udHJvbGxpbmcgZnVuY3Rpb24gbXVzdCByZXRyeSBzZW5kICovCisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAodXNicC0+dXNiZXIgJiAoVVNCX0VfUkVTRVQgfCBVU0JfRV9CU1kpKSB7CisJCS8qIEZhdGFsLCBhYmFuZG9uIFRYIHRyYW5zYWN0aW9uICovCisJCXJldHVybiAtMjsKKwl9CisKKwlpZiAodXNicC0+dXNiZXIgJiBVU0JfRV9SWEIpIHsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlpZiAoIShyeF9jYmRbaV0tPmNiZF9zYyAmIFJYX0JEX0UpKSB7CisJCQkJaWYgKChyeF9jYmRbaV0gPT0gZXBfcmVmWzBdLnByeCkgfHwgZXApIHsKKwkJCQkJcmV0dXJuIC0yOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiBtcGM4eHhfdWRjX2VwX3R4CisgKgorICogVHJhbnNtaXQgaW4gYSByZS1lbnRyYW50IGZhc2hpb24gb3V0Ym91bmQgVVNCIHBhY2tldHMuCisgKiBJbXBsZW1lbnQgcmV0cnkvdGltZW91dCBtZWNoYW5pc20gZGVzY3JpYmVkIGluIFVTQiBzcGVjaWZpY2F0aW9uCisgKiBUb2dnbGUgREFUQTAvREFUQTEgcGlkcyBhcyBuZWNlc3NhcnkKKyAqIEludHJvZHVjZXMgbm9uLXN0YW5kYXJkIHR4X3JldHJ5LiBUaGUgVVNCIHN0YW5kYXJkIGhhcyBubyBzY29wZSBmb3Igc2xhdmUKKyAqIGRldmljZXMgdG8gZ2l2ZSB1cCBUWCwgaG93ZXZlciB0eF9yZXRyeSBzdG9wcyB1cyBnZXR0aW5nIHN0dWNrIGluIGFuIGVuZGxlc3MKKyAqIFRYIGxvb3AuCisgKi8KK3N0YXRpYyBpbnQgbXBjOHh4X3VkY19lcF90eCAoc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZXBpKQoreworCXN0cnVjdCB1cmIgKnVyYiA9IGVwaS0+dHhfdXJiOworCXZvbGF0aWxlIGNiZF90ICp0eF9jYmRwID0gMDsKKwl1bnNpZ25lZCBpbnQgZXAgPSAwLCBwa3RfbGVuID0gMCwgeCA9IDAsIHR4X3JldHJ5ID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghZXBpIHx8IChlcGktPmVuZHBvaW50X2FkZHJlc3MgJiAweDAzKSA+PSBNQVhfRU5EUE9JTlRTIHx8ICF1cmIpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCWVwID0gZXBpLT5lbmRwb2ludF9hZGRyZXNzICYgMHgwMzsKKwl0eF9jYmRwID0gKGNiZF90ICopIChlbmRwb2ludHNbZXBdLT50YnB0ciArIENGR19JTU1SKTsKKworCWlmICh0eF9jYmRwLT5jYmRfc2MgJiBUWF9CRF9SIHx8IHVzYnAtPnVzYmVyICYgVVNCX0VfVFhCKSB7CisJCW1wYzh4eF91ZGNfZmx1c2hfdHhfZmlmbyAoZXApOworCQl1c2JwLT51c2JlciB8PSBVU0JfRV9UWEI7CisJfTsKKworCXdoaWxlICh0eF9yZXRyeSsrIDwgMTAwKSB7CisJCXJldCA9IG1wYzh4eF91ZGNfdHhfaXJxIChlcCk7CisJCWlmIChyZXQgPT0gLTEpIHsKKwkJCS8qIGlnbm9yZSB0aW1lb3V0IGhlcmUgKi8KKwkJfSBlbHNlIGlmIChyZXQgPT0gLTIpIHsKKwkJCS8qIEFiYW5kb24gVFggKi8KKwkJCW1wYzh4eF91ZGNfZmx1c2hfdHhfZmlmbyAoZXApOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJdHhfY2JkcCA9IChjYmRfdCAqKSAoZW5kcG9pbnRzW2VwXS0+dGJwdHIgKyBDRkdfSU1NUik7CisJCXdoaWxlICh0eF9jYmRwLT5jYmRfc2MgJiBUWF9CRF9SKSB7CisJCX07CisJCXR4X2NiZHAtPmNiZF9zYyA9ICh0eF9jYmRwLT5jYmRfc2MgJiBUWF9CRF9XKTsKKworCQlwa3RfbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoIC0gZXBpLT5zZW50OworCisJCWlmIChwa3RfbGVuID4gZXBpLT50eF9wYWNrZXRTaXplIHx8IHBrdF9sZW4gPiBFUF9NQVhfUEtUKSB7CisJCQlwa3RfbGVuID0gTUlOIChlcGktPnR4X3BhY2tldFNpemUsIEVQX01BWF9QS1QpOworCQl9CisKKwkJZm9yICh4ID0gMDsgeCA8IHBrdF9sZW47IHgrKykgeworCQkJKigodW5zaWduZWQgY2hhciAqKSAodHhfY2JkcC0+Y2JkX2J1ZmFkZHIgKyB4KSkgPQorCQkJCXVyYi0+YnVmZmVyW2VwaS0+c2VudCArIHhdOworCQl9CisJCXR4X2NiZHAtPmNiZF9kYXRsZW4gPSBwa3RfbGVuOworCQl0eF9jYmRwLT5jYmRfc2MgfD0gKENCRF9UWF9CSVRNQVNLIHwgZXBfcmVmW2VwXS5waWQpOworCQlfX2FzbV9fICgiZWllaW8iKTsKKworI2lmZGVmIF9fU0lNVUxBVEVfRVJST1JfXworCQlpZiAoKytlcnJfcG9pc29uX3Rlc3QgPT0gMikgeworCQkJZXJyX3BvaXNvbl90ZXN0ID0gMDsKKwkJCXR4X2NiZHAtPmNiZF9zYyAmPSB+VFhfQkRfVEM7CisJCX0KKyNlbmRpZgorCisJCXVzYnAtPnVzY29tID0gKFVTQ09NX1NUUiB8IGVwKTsKKworCQl3aGlsZSAoISh1c2JwLT51c2JlciAmIFVTQl9FX1RYQikpIHsKKwkJCXJldCA9IG1wYzh4eF91ZGNfdHhfaXJxIChlcCk7CisJCQlpZiAocmV0ID09IC0xKSB7CisJCQkJLyogVFggdGltZW91dCAqLworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChyZXQgPT0gLTIpIHsKKwkJCQlpZiAodXNicC0+dXNiZXIgJiBVU0JfRV9UWEIpIHsKKwkJCQkJdXNicC0+dXNiZXIgfD0gVVNCX0VfVFhCOworCQkJCX0KKwkJCQltcGM4eHhfdWRjX2ZsdXNoX3R4X2ZpZm8gKGVwKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX07CisKKwkJaWYgKHVzYnAtPnVzYmVyICYgVVNCX0VfVFhCKSB7CisJCQl1c2JwLT51c2JlciB8PSBVU0JfRV9UWEI7CisJCX0KKworCQkvKiBBQ0sgbXVzdCBiZSBwcmVzZW50IDw9IDE4Yml0IHRpbWVzIGZyb20gVFggKi8KKwkJaWYgKHJldCA9PSAtMSkgeworCQkJY29udGludWU7CisJCX0KKworCQkvKiBUWCBBQ0sgOiBVU0IgMi4wIDguNy4yLCBUb2dnbGUgUElELCBBZHZhbmNlIFRYICovCisJCWVwaS0+c2VudCArPSBwa3RfbGVuOworCQllcGktPmxhc3QgPSBNSU4gKHVyYi0+YWN0dWFsX2xlbmd0aCAtIGVwaS0+c2VudCwgZXBpLT50eF9wYWNrZXRTaXplKTsKKwkJVE9HR0xFX1RYX1BJRCAoZXBfcmVmW2VwXS5waWQpOworCisJCWlmIChlcGktPnNlbnQgPj0gZXBpLT50eF91cmItPmFjdHVhbF9sZW5ndGgpIHsKKworCQkJZXBpLT50eF91cmItPmFjdHVhbF9sZW5ndGggPSAwOworCQkJZXBpLT5zZW50ID0gMDsKKworCQkJaWYgKGVwX3JlZltlcF0uc2MgJiBFUF9TRU5EX1pMUCkgeworCQkJCWVwX3JlZltlcF0uc2MgJj0gfkVQX1NFTkRfWkxQOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworCUVSUiAoIlRYIGZhaWwsIGVuZHBvaW50IDB4JXggdHggYnl0ZXMgMHgleC8weCV4XG4iLCBlcCwgZXBpLT5zZW50LAorCSAgICAgZXBpLT50eF91cmItPmFjdHVhbF9sZW5ndGgpOworCisJcmV0dXJuIC0xOworfQorCisvKiBtcGM4eHhfdWRjX2R1bXBfcmVxdWVzdAorICoKKyAqIER1bXAgYSBjb250cm9sIHJlcXVlc3QgdG8gY29uc29sZQorICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2R1bXBfcmVxdWVzdCAoc3RydWN0IHVzYl9kZXZpY2VfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwlEQkcgKCJibVJlcXVlc3RUeXBlOiUwMnggYlJlcXVlc3Q6JTAyeCB3VmFsdWU6JTA0eCAiCisJICAgICAid0luZGV4OiUwNHggd0xlbmd0aDolMDR4ID9cbiIsCisJICAgICByZXF1ZXN0LT5ibVJlcXVlc3RUeXBlLAorCSAgICAgcmVxdWVzdC0+YlJlcXVlc3QsCisJICAgICByZXF1ZXN0LT53VmFsdWUsIHJlcXVlc3QtPndJbmRleCwgcmVxdWVzdC0+d0xlbmd0aCk7CisKKwlyZXR1cm47Cit9CisKKy8qIG1wYzh4eF91ZGNfZXAwX3J4X3NldHVwCisgKgorICogRGVjb2RlIHJlY2VpdmVkIGVwMCBTRVRVUCBwYWNrZXQuIHJldHVybiBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IG1wYzh4eF91ZGNfZXAwX3J4X3NldHVwICh2b2xhdGlsZSBjYmRfdCAqIHJ4X2NiZHApCit7CisJdW5zaWduZWQgaW50IHggPSAwOworCXN0cnVjdCB1cmIgKnB1cmIgPSBlcF9yZWZbMF0udXJiOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVwaSA9CisJCSZ1ZGNfZGV2aWNlLT5idXMtPmVuZHBvaW50X2FycmF5WzBdOworCisJZm9yICg7IHggPCByeF9jYmRwLT5jYmRfZGF0bGVuOyB4KyspIHsKKwkJKigoKHVuc2lnbmVkIGNoYXIgKikgJmVwX3JlZlswXS51cmItPmRldmljZV9yZXF1ZXN0KSArIHgpID0KKwkJCSooKHVuc2lnbmVkIGNoYXIgKikgKHJ4X2NiZHAtPmNiZF9idWZhZGRyICsgeCkpOworCX0KKworCW1wYzh4eF91ZGNfY2xlYXJfcnhiZCAocnhfY2JkcCk7CisKKwlpZiAoZXAwX3JlY3Zfc2V0dXAgKHB1cmIpKSB7CisJCW1wYzh4eF91ZGNfZHVtcF9yZXF1ZXN0ICgmcHVyYi0+ZGV2aWNlX3JlcXVlc3QpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKChwdXJiLT5kZXZpY2VfcmVxdWVzdC5ibVJlcXVlc3RUeXBlICYgVVNCX1JFUV9ESVJFQ1RJT05fTUFTSykKKwkgICAgPT0gVVNCX1JFUV9IT1NUMkRFVklDRSkgeworCisJCXN3aXRjaCAocHVyYi0+ZGV2aWNlX3JlcXVlc3QuYlJlcXVlc3QpIHsKKwkJY2FzZSBVU0JfUkVRX1NFVF9BRERSRVNTOgorCQkJLyogU2VuZCB0aGUgU3RhdHVzIE9VVCBaTFAgKi8KKwkJCWVwX3JlZlswXS5waWQgPSBUWF9CRF9QSURfREFUQTE7CisJCQlwdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwkJCW1wYzh4eF91ZGNfaW5pdF90eCAoZXBpLCBwdXJiKTsKKwkJCW1wYzh4eF91ZGNfZXBfdHggKGVwaSk7CisKKwkJCS8qIE1vdmUgdG8gdGhlIGFkZHJlc3NlZCBzdGF0ZSAqLworCQkJdXNicC0+dXNhZGRyID0gdWRjX2RldmljZS0+YWRkcmVzczsKKwkJCW1wYzh4eF91ZGNfc3RhdGVfdHJhbnNpdGlvbl91cCAodWRjX2RldmljZS0+ZGV2aWNlX3N0YXRlLAorCQkJCQkJCVNUQVRFX0FERFJFU1NFRCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFVTQl9SRVFfU0VUX0NPTkZJR1VSQVRJT046CisJCQlpZiAoIXB1cmItPmRldmljZV9yZXF1ZXN0LndWYWx1ZSkgeworCQkJCS8qIFJlc3BvbmQgYXQgZGVmYXVsdCBhZGRyZXNzICovCisJCQkJdXNicC0+dXNhZGRyID0gMHgwMDsKKwkJCQltcGM4eHhfdWRjX3N0YXRlX3RyYW5zaXRpb25fZG93biAodWRjX2RldmljZS0+ZGV2aWNlX3N0YXRlLAorCQkJCQkJCQkgIFNUQVRFX0FERFJFU1NFRCk7CisJCQl9IGVsc2UgeworCQkJCS8qIFRPRE86IFN1cHBvcnQgbXVsdGlwbGUgY29uZmlndXJhdGlvbnMgKi8KKwkJCQltcGM4eHhfdWRjX3N0YXRlX3RyYW5zaXRpb25fdXAgKHVkY19kZXZpY2UtPmRldmljZV9zdGF0ZSwKKwkJCQkJCQkJU1RBVEVfQ09ORklHVVJFRCk7CisJCQkJZm9yICh4ID0gMTsgeCA8IE1BWF9FTkRQT0lOVFM7IHgrKykgeworCQkJCQlpZiAoKHVkY19kZXZpY2UtPmJ1cy0+ZW5kcG9pbnRfYXJyYXlbeF0uZW5kcG9pbnRfYWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykKKwkJCQkJICAgID09IFVTQl9ESVJfSU4pIHsKKwkJCQkJCWVwX3JlZlt4XS5waWQgPSBUWF9CRF9QSURfREFUQTA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQllcF9yZWZbeF0ucGlkID0gUlhfQkRfUElEX0RBVEEwOworCQkJCQl9CisJCQkJCS8qIFNldCBjb25maWd1cmF0aW9uIG11c3QgdW5zdGFsbCBlbmRwb2ludHMgKi8KKwkJCQkJdXNicC0+dXNlcFt4XSAmPSB+U1RBTExfQklUTUFTSzsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIENEQy9WZW5kb3Igc3BlY2lmaWMgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJLyogU2VuZCBaTFAgYXMgQUNLIGluIFN0YXR1cyBPVVQgcGhhc2UgKi8KKwkJZXBfcmVmWzBdLnBpZCA9IFRYX0JEX1BJRF9EQVRBMTsKKwkJcHVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CisJCW1wYzh4eF91ZGNfaW5pdF90eCAoZXBpLCBwdXJiKTsKKwkJbXBjOHh4X3VkY19lcF90eCAoZXBpKTsKKworCX0gZWxzZSB7CisKKwkJaWYgKHB1cmItPmFjdHVhbF9sZW5ndGgpIHsKKwkJCWVwX3JlZlswXS5waWQgPSBUWF9CRF9QSURfREFUQTE7CisJCQltcGM4eHhfdWRjX2luaXRfdHggKGVwaSwgcHVyYik7CisKKwkJCWlmICghKHB1cmItPmFjdHVhbF9sZW5ndGggJSBFUDBfTUFYX1BBQ0tFVF9TSVpFKSkgeworCQkJCWVwX3JlZlswXS5zYyB8PSBFUF9TRU5EX1pMUDsKKwkJCX0KKworCQkJaWYgKHB1cmItPmRldmljZV9yZXF1ZXN0LndWYWx1ZSA9PQorCQkJICAgIFVTQl9ERVNDUklQVE9SX1RZUEVfREVWSUNFKSB7CisJCQkJaWYgKGxlMTZfdG9fY3B1IChwdXJiLT5kZXZpY2VfcmVxdWVzdC53TGVuZ3RoKQorCQkJCSAgICA+IHB1cmItPmFjdHVhbF9sZW5ndGgpIHsKKwkJCQkJLyogU2VuZCBFUDBfTUFYX1BBQ0tFVF9TSVpFIGJ5dGVzCisJCQkJCSAqIHVubGVzcyBjb3JyZWN0IHNpemUgcmVxdWVzdGVkLgorCQkJCQkgKi8KKwkJCQkJaWYgKHB1cmItPmFjdHVhbF9sZW5ndGggPiBlcGktPnR4X3BhY2tldFNpemUpIHsKKwkJCQkJCXB1cmItPmFjdHVhbF9sZW5ndGggPSBlcGktPnR4X3BhY2tldFNpemU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQltcGM4eHhfdWRjX2VwX3R4IChlcGkpOworCisJCX0gZWxzZSB7CisJCQkvKiBDb3JydXB0IFNFVFVQIHBhY2tldD8gKi8KKwkJCUVSUiAoIlplcm8gbGVuZ3RoIGRhdGEgb3IgU0VUVVAgd2l0aCBEQVRBLUlOIHBoYXNlID9cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIG1wYzh4eF91ZGNfaW5pdF90eAorICoKKyAqIFNldHVwIHNvbWUgYmFzaWMgcGFyYW1ldGVycyBmb3IgYSBUWCB0cmFuc2FjdGlvbgorICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2luaXRfdHggKHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVwaSwKKwkJCQlzdHJ1Y3QgdXJiICp0eF91cmIpCit7CisJZXBpLT5zZW50ID0gMDsKKwllcGktPmxhc3QgPSAwOworCWVwaS0+dHhfdXJiID0gdHhfdXJiOworfQorCisvKiBtcGM4eHhfdWRjX2VwMF9yeAorICoKKyAqIFJlY2VpdmUgZXAwL2NvbnRyb2wgVVNCIGRhdGEuIFBhcnNlIGFuZCBwb3NzaWJseSBzZW5kIGEgcmVzcG9uc2UuCisgKi8KK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfZXAwX3J4ICh2b2xhdGlsZSBjYmRfdCAqIHJ4X2NiZHApCit7CisJaWYgKHJ4X2NiZHAtPmNiZF9zYyAmIFJYX0JEX1BJRF9TRVRVUCkgeworCisJCS8qIFVuY29uZGl0aW9uYWxseSBhY2NlcHQgU0VUVVAgcGFja2V0cyAqLworCQlpZiAobXBjOHh4X3VkY19lcDBfcnhfc2V0dXAgKHJ4X2NiZHApKSB7CisJCQltcGM4eHhfdWRjX3N0YWxsICgwKTsKKwkJfQorCisJfSBlbHNlIHsKKworCQltcGM4eHhfdWRjX2NsZWFyX3J4YmQgKHJ4X2NiZHApOworCisJCWlmICgocnhfY2JkcC0+Y2JkX2RhdGxlbiAtIDIpKSB7CisJCQkvKiBTRVRVUCB3aXRoIGEgREFUQSBwaGFzZQorCQkJICogb3V0c2lkZSBvZiBTRVRVUCBwYWNrZXQuCisJCQkgKiBSZXBseSB3aXRoIFNUQUxMLgorCQkJICovCisJCQltcGM4eHhfdWRjX3N0YWxsICgwKTsKKwkJfQorCX0KK30KKworLyogbXBjOHh4X3VkY19lcG5fcngKKyAqCisgKiBSZWNlaXZlIHNvbWUgZGF0YSBmcm9tIGNiZCBpbnRvIFVTQiBzeXN0ZW0gdXJiIGRhdGEgYWJzdHJhY3Rpb24KKyAqIFVwcGVyIGxheWVycyBzaG91bGQgTkFLIGlmIHRoZXJlIGlzIGluc3VmZmljaWVudCBSWCBkYXRhIHNwYWNlCisgKi8KK3N0YXRpYyBpbnQgbXBjOHh4X3VkY19lcG5fcnggKHVuc2lnbmVkIGludCBlcGlkLCB2b2xhdGlsZSBjYmRfdCAqIHJ4X2NiZHApCit7CisJc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZXBpID0gMDsKKwlzdHJ1Y3QgdXJiICp1cmIgPSAwOworCXVuc2lnbmVkIGludCB4ID0gMDsKKworCWlmIChlcGlkID49IE1BWF9FTkRQT0lOVFMgfHwgIXJ4X2NiZHAtPmNiZF9kYXRsZW4pIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVVNCIDIuMCBQREYgc2VjdGlvbiA4LjYuNAorCSAqIERpc2NhcmQgZGF0YSB3aXRoIGludmFsaWQgUElEIGl0IGlzIGEgcmVzZW5kLgorCSAqLworCWlmIChlcF9yZWZbZXBpZF0ucGlkICE9IChyeF9jYmRwLT5jYmRfc2MgJiAweEMwKSkgeworCQlyZXR1cm4gMTsKKwl9CisJVE9HR0xFX1JYX1BJRCAoZXBfcmVmW2VwaWRdLnBpZCk7CisKKwllcGkgPSAmdWRjX2RldmljZS0+YnVzLT5lbmRwb2ludF9hcnJheVtlcGlkXTsKKwl1cmIgPSBlcGktPnJjdl91cmI7CisKKwlmb3IgKDsgeCA8IChyeF9jYmRwLT5jYmRfZGF0bGVuIC0gMik7IHgrKykgeworCQkqKCh1bnNpZ25lZCBjaGFyICopICh1cmItPmJ1ZmZlciArIHVyYi0+YWN0dWFsX2xlbmd0aCArIHgpKSA9CisJCQkqKCh1bnNpZ25lZCBjaGFyICopIChyeF9jYmRwLT5jYmRfYnVmYWRkciArIHgpKTsKKwl9CisKKwlpZiAoeCkgeworCQl1c2JkX3Jjdl9jb21wbGV0ZSAoZXBpLCB4LCAwKTsKKwkJaWYgKGVwX3JlZltlcGlkXS51cmItPnN0YXR1cyA9PSBSRUNWX0VSUk9SKSB7CisJCQlEQkcgKCJSWCBlcnJvciB1bnNldCBOQUtcbiIpOworCQkJdWRjX3Vuc2V0X25hayAoZXBpZCk7CisJCX0KKwl9CisJcmV0dXJuIHg7Cit9CisKKy8qIG1wYzh4eF91ZGNfY2xvY2tfaW5pdAorICoKKyAqIE9idGFpbiBhIGNsb2NrIHJlZmVyZW5jZSBmb3IgRnVsbCBTcGVlZCBTaWduYWxpbmcKKyAqLworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19jbG9ja19pbml0ICh2b2xhdGlsZSBpbW1hcF90ICogaW1tciwKKwkJCQkgICB2b2xhdGlsZSBjcG04eHhfdCAqIGNwKQoreworCisjaWYgZGVmaW5lZChDRkdfVVNCX0VYVENfQ0xLKQorCisJLyogVGhpcyBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBhIDQ4TUh6IGNyeXN0YWwgb24gQ0xLNiAqLworCXN3aXRjaCAoQ0ZHX1VTQl9FWFRDX0NMSykgeworCWNhc2UgMToKKwkJaW1tci0+aW1faW9wb3J0LmlvcF9wYXBhciB8PSAweDAxMDA7CisJCWltbXItPmltX2lvcG9ydC5pb3BfcGFkaXIgJj0gfjB4MDEwMDsKKwkJY3AtPmNwX3NpY3IgfD0gMHgyNDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhcGFyIHw9IDB4MDIwMDsKKwkJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRpciAmPSB+MHgwMjAwOworCQljcC0+Y3Bfc2ljciB8PSAweDJEOworCQlicmVhazsKKwljYXNlIDM6CisJCWltbXItPmltX2lvcG9ydC5pb3BfcGFwYXIgfD0gMHgwNDAwOworCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGlyICY9IH4weDA0MDA7CisJCWNwLT5jcF9zaWNyIHw9IDB4MzY7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaW1tci0+aW1faW9wb3J0LmlvcF9wYXBhciB8PSAweDA4MDA7CisJCWltbXItPmltX2lvcG9ydC5pb3BfcGFkaXIgJj0gfjB4MDgwMDsKKwkJY3AtPmNwX3NpY3IgfD0gMHgzRjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdWRjX3N0YXRlID0gU1RBVEVfRVJST1I7CisJCWJyZWFrOworCX0KKworI2VsaWYgZGVmaW5lZChDRkdfVVNCX0JSR0NMSykKKworCS8qIFRoaXMgaGFzIGJlZW4gdGVzdGVkIHdpdGggYnJnY2xrID09IDUwTUh6ICovCisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisJaW50IGRpdmlzb3IgPSAwOworCisJaWYgKGdkLT5jcHVfY2xrIDwgNDgwMDAwMDBMKSB7CisJCUVSUiAoImJyZ2NsayBpcyB0b28gc2xvdyBmb3IgZnVsbC1zcGVlZCBVU0IhXG4iKTsKKwkJdWRjX3N0YXRlID0gU1RBVEVfRVJST1I7CisJCXJldHVybjsKKwl9CisKKwkvKiBBc3N1bWUgdGhlIGJyZ2NsayBpcyAnZ29vZCBlbm91Z2gnLCB3ZSB3YW50ICEoZ2QtPmNwdV9jbGslNDhNaHopCisJICogYnV0LCBjYW4gL3Byb2JhYmx5LyBsaXZlIHdpdGggY2xvc2UtaXNoIGFsdGVybmF0aXZlIHJhdGVzLgorCSAqLworCWRpdmlzb3IgPSAoZ2QtPmNwdV9jbGsgLyA0ODAwMDAwMEwpIC0gMTsKKwljcC0+Y3Bfc2ljciAmPSB+MHgwMDAwMDAzRjsKKworCXN3aXRjaCAoQ0ZHX1VTQl9CUkdDTEspIHsKKwljYXNlIDE6CisJCWNwLT5jcF9icmdjMSB8PSAoZGl2aXNvciB8IENQTV9CUkdfRU4pOworCQljcC0+Y3Bfc2ljciAmPSB+MHgyRjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQljcC0+Y3BfYnJnYzIgfD0gKGRpdmlzb3IgfCBDUE1fQlJHX0VOKTsKKwkJY3AtPmNwX3NpY3IgfD0gMHgwMDAwMDAwOTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQljcC0+Y3BfYnJnYzMgfD0gKGRpdmlzb3IgfCBDUE1fQlJHX0VOKTsKKwkJY3AtPmNwX3NpY3IgfD0gMHgwMDAwMDAxMjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQljcC0+Y3BfYnJnYzQgPSAoZGl2aXNvciB8IENQTV9CUkdfRU4pOworCQljcC0+Y3Bfc2ljciB8PSAweDAwMDAwMDFCOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1ZGNfc3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJYnJlYWs7CisJfQorCisjZWxzZQorI2Vycm9yICJDRkdfVVNCX0VYVENfQ0xLIG9yIENGR19VU0JfQlJHQ0xLIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCit9CisKKy8qIG1wYzh4eF91ZGNfY2JkX2F0dGFjaAorICoKKyAqIGF0dGFjaCBhIGNiZCB0byBhbmQgZW5kcG9pbnQKKyAqLworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19jYmRfYXR0YWNoIChpbnQgZXAsIHVjaGFyIHR4X3NpemUsIHVjaGFyIHJ4X3NpemUpCit7CisKKwlpZiAoIXR4X2NiZFtlcF0gfHwgIXJ4X2NiZFtlcF0gfHwgZXAgPj0gTUFYX0VORFBPSU5UUykgeworCQl1ZGNfc3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJcmV0dXJuOworCX0KKworCWlmICh0eF9zaXplID4gVVNCX01BWF9QS1QgfHwgcnhfc2l6ZSA+IFVTQl9NQVhfUEtUIHx8CisJICAgICghdHhfc2l6ZSAmJiAhcnhfc2l6ZSkpIHsKKwkJdWRjX3N0YXRlID0gU1RBVEVfRVJST1I7CisJCXJldHVybjsKKwl9CisKKwkvKiBBdHRhY2ggQ0JEIHRvIGFwcHJvcGlhdGUgUGFyYW1ldGVyIFJBTSBFbmRwb2ludCBkYXRhIHN0cnVjdHVyZSAqLworCWlmIChyeF9zaXplKSB7CisJCWVuZHBvaW50c1tlcF0tPnJiYXNlID0gKHUzMikgcnhfY2JkW3J4X2N0XTsKKwkJZW5kcG9pbnRzW2VwXS0+cmJwdHIgPSAodTMyKSByeF9jYmRbcnhfY3RdOworCQlyeF9jdCsrOworCisJCWlmICghZXApIHsKKworCQkJZW5kcG9pbnRzW2VwXS0+cmJwdHIgPSAodTMyKSByeF9jYmRbcnhfY3RdOworCQkJcnhfY2JkW3J4X2N0XS0+Y2JkX3NjIHw9IFJYX0JEX1c7CisJCQlyeF9jdCsrOworCisJCX0gZWxzZSB7CisJCQlyeF9jdCArPSAyOworCQkJZW5kcG9pbnRzW2VwXS0+cmJwdHIgPSAodTMyKSByeF9jYmRbcnhfY3RdOworCQkJcnhfY2JkW3J4X2N0XS0+Y2JkX3NjIHw9IFJYX0JEX1c7CisJCQlyeF9jdCsrOworCQl9CisKKwkJLyogV2hlcmUgd2UgZXhwZWN0IHRvIFJYIGRhdGEgb24gdGhpcyBlbmRwb2ludCAqLworCQllcF9yZWZbZXBdLnByeCA9IHJ4X2NiZFtyeF9jdCAtIDFdOworCX0gZWxzZSB7CisKKwkJZXBfcmVmW2VwXS5wcnggPSAwOworCQllbmRwb2ludHNbZXBdLT5yYmFzZSA9IDA7CisJCWVuZHBvaW50c1tlcF0tPnJicHRyID0gMDsKKwl9CisKKwlpZiAodHhfc2l6ZSkgeworCQllbmRwb2ludHNbZXBdLT50YmFzZSA9ICh1MzIpIHR4X2NiZFt0eF9jdF07CisJCWVuZHBvaW50c1tlcF0tPnRicHRyID0gKHUzMikgdHhfY2JkW3R4X2N0XTsKKwkJdHhfY3QrKzsKKwl9IGVsc2UgeworCQllbmRwb2ludHNbZXBdLT50YmFzZSA9IDA7CisJCWVuZHBvaW50c1tlcF0tPnRicHRyID0gMDsKKwl9CisKKwllbmRwb2ludHNbZXBdLT50c3RhdGUgPSAwOworCWVuZHBvaW50c1tlcF0tPnRiY250ID0gMDsKKwllbmRwb2ludHNbZXBdLT5tcmJsciA9IEVQX01BWF9QS1Q7CisJZW5kcG9pbnRzW2VwXS0+cmZjciA9IDB4MTg7CisJZW5kcG9pbnRzW2VwXS0+dGZjciA9IDB4MTg7CisJZXBfcmVmW2VwXS5zYyB8PSBFUF9BVFRBQ0hFRDsKKworCURCRyAoImVwICVkIHJiYXNlIDB4JTA4eCByYnB0ciAweCUwOHggdGJhc2UgMHglMDh4IHRicHRyIDB4JTA4eCBwcnggPSAlcFxuIiwKKwkJZXAsIGVuZHBvaW50c1tlcF0tPnJiYXNlLCBlbmRwb2ludHNbZXBdLT5yYnB0ciwKKwkJZW5kcG9pbnRzW2VwXS0+dGJhc2UsIGVuZHBvaW50c1tlcF0tPnRicHRyLAorCQllcF9yZWZbZXBdLnByeCk7CisKKwlyZXR1cm47Cit9CisKKy8qIG1wYzh4eF91ZGNfY2JkX2luaXQKKyAqCisgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBjYmQgYW5kIGFsbG9jYXRlIFRYL1JYIGRhdGEgc3BhY2UKKyAqLworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19jYmRfaW5pdCAodm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlmb3IgKDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCXR4X2NiZFtpXSA9IChjYmRfdCAqKQorCQkJbXBjOHh4X3VkY19hbGxvYyAoc2l6ZW9mIChjYmRfdCksIHNpemVvZiAoaW50KSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXJ4X2NiZFtpXSA9IChjYmRfdCAqKQorCQkJbXBjOHh4X3VkY19hbGxvYyAoc2l6ZW9mIChjYmRfdCksIHNpemVvZiAoaW50KSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCXR4X2NiZFtpXS0+Y2JkX2J1ZmFkZHIgPQorCQkJbXBjOHh4X3VkY19hbGxvYyAoRVBfTUFYX1BLVCwgc2l6ZW9mIChpbnQpKTsKKworCQl0eF9jYmRbaV0tPmNiZF9zYyA9IChUWF9CRF9JIHwgVFhfQkRfVyk7CisJCXR4X2NiZFtpXS0+Y2JkX2RhdGxlbiA9IDB4MDAwMDsKKwl9CisKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlyeF9jYmRbaV0tPmNiZF9idWZhZGRyID0KKwkJCW1wYzh4eF91ZGNfYWxsb2MgKEVQX01BWF9QS1QsIHNpemVvZiAoaW50KSk7CisJCXJ4X2NiZFtpXS0+Y2JkX3NjID0gKFJYX0JEX0kgfCBSWF9CRF9FKTsKKwkJcnhfY2JkW2ldLT5jYmRfZGF0bGVuID0gMHgwMDAwOworCisJfQorCisJcmV0dXJuOworfQorCisvKiBtcGM4eHhfdWRjX2VuZHBvaW50X2luaXQKKyAqCisgKiBBdHRhY2ggYW4gZW5kcG9pbnQgdG8gc29tZSBkcHJhbQorICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2VuZHBvaW50X2luaXQgKHZvaWQpCit7CisJaW50IGkgPSAwOworCisJZm9yICg7IGkgPCBNQVhfRU5EUE9JTlRTOyBpKyspIHsKKwkJZW5kcG9pbnRzW2ldID0gKHVzYl9lcGJfdCAqKQorCQkJbXBjOHh4X3VkY19hbGxvYyAoc2l6ZW9mICh1c2JfZXBiX3QpLCAzMik7CisJfQorfQorCisvKiBtcGM4eHhfdWRjX2FsbG9jCisgKgorICogR3JhYiB0aGUgYWRkcmVzcyBvZiBzb21lIGRwcmFtCisgKi8KK3N0YXRpYyB1MzIgbXBjOHh4X3VkY19hbGxvYyAodTMyIGRhdGFfc2l6ZSwgdTMyIGFsaWdubWVudCkKK3sKKwl1MzIgcmV0YWRkciA9IGFkZHJlc3NfYmFzZTsKKworCXdoaWxlIChyZXRhZGRyICUgYWxpZ25tZW50KSB7CisJCXJldGFkZHIrKzsKKwl9CisJYWRkcmVzc19iYXNlICs9IGRhdGFfc2l6ZTsKKworCXJldHVybiByZXRhZGRyOworfQorCisjZW5kaWYgLyogQ09ORklHX01QQzg4NV9GQU1JTFkgJiYgQ09ORklHX1VTQl9ERVZJQ0UpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYmRjb3JlX29tYXAxNTEwLmMgYi9kcml2ZXJzL3VzYmRjb3JlX29tYXAxNTEwLmMKaW5kZXggMWQ1NGE2My4uODRiYjkzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2JkY29yZV9vbWFwMTUxMC5jCisrKyBiL2RyaXZlcnMvdXNiZGNvcmVfb21hcDE1MTAuYwpAQCAtMTUxNyw0ICsxNTE3LDMxIEBACiAJdWRjX2VuYWJsZSAoZGV2aWNlKTsKIH0KIAorLyoqCisgKiB1ZGNfaXJxIC0gZG8gcHNldWRvIGludGVycnVwdHMKKyAqLwordm9pZCB1ZGNfaXJxKHZvaWQpCit7CisJLyogTG9vcCB3aGlsZSB3ZSBoYXZlIGludGVycnVwdHMuCisJICogSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlIGlucHV0IGNoYWluCisJICogcG9sbGluZyBkZWxheSBpcyBsaWtlbHkgdG8gbWlzcworCSAqIGhvc3QgcmVxdWVzdHMuCisJICovCisJd2hpbGUgKGludyAoVURDX0lSUV9TUkMpICYgflVEQ19TT0ZfRmxnKSB7CisJCS8qIEhhbmRsZSBhbnkgbmV3IElSUXMgKi8KKwkJb21hcDE1MTBfdWRjX2lycSAoKTsKKwkJb21hcDE1MTBfdWRjX25vbmlzb19pcnEgKCk7CisJfQorfQorCisvKiBGbG93IGNvbnRyb2wgKi8KK3ZvaWQgdWRjX3NldF9uYWsoaW50IGVwaWQpCit7CisJLyogVE9ETzogaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBvbWFwMTUxMCAqLworfQorCit2b2lkIHVkY191bnNldF9uYWsgKGludCBlcGlkKQoreworCS8qIFRPRE86IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gb21hcDE1MTAgKi8KK30KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2J0dHkuYyBiL2RyaXZlcnMvdXNidHR5LmMKaW5kZXggY2U0YTEyZS4uYTNiNTAxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2J0dHkuYworKysgYi9kcml2ZXJzL3VzYnR0eS5jCkBAIC0yLDYgKzIsOSBAQAogICogKEMpIENvcHlyaWdodCAyMDAzCiAgKiBHZXJyeSBIYW1lbCwgZ2VoQHRpLmNvbSwgVGV4YXMgSW5zdHJ1bWVudHMKICAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIEJyeWFuIE8nRG9ub2dodWUsIGJvZG9ub2dodWVAY29kZWhlcm1pdC5pZQorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKQEAgLTI1LDIwICsyOCw0MiBAQAogI2luY2x1ZGUgPGNpcmNidWYuaD4KICNpbmNsdWRlIDxkZXZpY2VzLmg+CiAjaW5jbHVkZSAidXNidHR5LmgiCisjaW5jbHVkZSAidXNiX2NkY19hY20uaCIKKyNpbmNsdWRlICJ1c2JkZXNjcmlwdG9ycy5oIgorI2luY2x1ZGUgPGNvbmZpZy5oPgkJLyogSWYgZGVmaW5lZCwgb3ZlcnJpZGUgTGludXggaWRlbnRpZmllcnMgd2l0aAorCQkJICAgCSAqIHZlbmRvciBzcGVjaWZpYyBvbmVzICovCiAKICNpZiAwCi0jZGVmaW5lIFRUWURCRyhmbXQsYXJncy4uLikgc2VyaWFsX3ByaW50ZigiWyVzXSAlcyAlZDogImZtdCwgX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fLCMjYXJncykKKyNkZWZpbmUgVFRZREJHKGZtdCxhcmdzLi4uKVwKKwlzZXJpYWxfcHJpbnRmKCJbJXNdICVzICVkOiAiZm10LCBfX0ZJTEVfXyxfX0ZVTkNUSU9OX18sX19MSU5FX18sIyNhcmdzKQogI2Vsc2UKICNkZWZpbmUgVFRZREJHKGZtdCxhcmdzLi4uKSBkb3t9d2hpbGUoMCkKICNlbmRpZgogCi0jaWYgMAotI2RlZmluZSBUVFlFUlIoZm10LGFyZ3MuLi4pIHNlcmlhbF9wcmludGYoIkVSUk9SIVslc10gJXMgJWQ6ICJmbXQsIF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXywjI2FyZ3MpCisjaWYgMQorI2RlZmluZSBUVFlFUlIoZm10LGFyZ3MuLi4pXAorCXNlcmlhbF9wcmludGYoIkVSUk9SIVslc10gJXMgJWQ6ICJmbXQsIF9fRklMRV9fLF9fRlVOQ1RJT05fXyxcCisJX19MSU5FX18sIyNhcmdzKQogI2Vsc2UKICNkZWZpbmUgVFRZRVJSKGZtdCxhcmdzLi4uKSBkb3t9d2hpbGUoMCkKICNlbmRpZgogCiAvKgorICogRGVmaW5lcworICovCisjZGVmaW5lIE5VTV9DT05GSUdTICAgIDEKKyNkZWZpbmUgTUFYX0lOVEVSRkFDRVMgMgorI2RlZmluZSBOVU1fRU5EUE9JTlRTICAzCisjZGVmaW5lIEFDTV9UWF9FTkRQT0lOVCAzCisjZGVmaW5lIEFDTV9SWF9FTkRQT0lOVCAyCisjZGVmaW5lIEdTRVJJQUxfVFhfRU5EUE9JTlQgMgorI2RlZmluZSBHU0VSSUFMX1JYX0VORFBPSU5UIDEKKyNkZWZpbmUgTlVNX0FDTV9JTlRFUkZBQ0VTIDIKKyNkZWZpbmUgTlVNX0dTRVJJQUxfSU5URVJGQUNFUyAxCisjZGVmaW5lIENPTkZJR19VU0JEX0RBVEFfSU5URVJGQUNFX1NUUiAiQnVsayBEYXRhIEludGVyZmFjZSIKKyNkZWZpbmUgQ09ORklHX1VTQkRfQ1RSTF9JTlRFUkZBQ0VfU1RSICJDb250cm9sIEludGVyZmFjZSIKKworLyoKICAqIEJ1ZmZlcnMgdG8gaG9sZCBpbnB1dCBhbmQgb3V0cHV0IGRhdGEKICAqLwogI2RlZmluZSBVU0JUVFlfQlVGRkVSX1NJWkUgMjU2CkBAIC01MCwxNTcgKzc1LDMzNiBAQAogICogSW5zdGFuY2UgdmFyaWFibGVzCiAgKi8KIHN0YXRpYyBkZXZpY2VfdCB1c2J0dHlkZXY7Ci1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UJIGRldmljZV9pbnN0YW5jZVsxXTsKLXN0YXRpYyBzdHJ1Y3QgdXNiX2J1c19pbnN0YW5jZQkJIGJ1c19pbnN0YW5jZVsxXTsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pbnN0YW5jZSBkZXZpY2VfaW5zdGFuY2VbMV07CitzdGF0aWMgc3RydWN0IHVzYl9idXNfaW5zdGFuY2UgYnVzX2luc3RhbmNlWzFdOwogc3RhdGljIHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbl9pbnN0YW5jZSBjb25maWdfaW5zdGFuY2VbTlVNX0NPTkZJR1NdOwotc3RhdGljIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2luc3RhbmNlCSBpbnRlcmZhY2VfaW5zdGFuY2VbTlVNX0lOVEVSRkFDRVNdOwotc3RhdGljIHN0cnVjdCB1c2JfYWx0ZXJuYXRlX2luc3RhbmNlCSBhbHRlcm5hdGVfaW5zdGFuY2VbTlVNX0lOVEVSRkFDRVNdOwotc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UJIGVuZHBvaW50X2luc3RhbmNlW05VTV9FTkRQT0lOVFMrMV07IC8qIG9uZSBleHRyYSBmb3IgY29udHJvbCBlbmRwb2ludCAqLwotCi0vKgotICogU3RhdGljIGFsbG9jYXRpb24gb2YgdXJicwotICovCi0jZGVmaW5lIFJFQ1ZfRU5EUE9JTlQgMQotI2RlZmluZSBUWF9FTkRQT0lOVCAyCitzdGF0aWMgc3RydWN0IHVzYl9pbnRlcmZhY2VfaW5zdGFuY2UgaW50ZXJmYWNlX2luc3RhbmNlW01BWF9JTlRFUkZBQ0VTXTsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2FsdGVybmF0ZV9pbnN0YW5jZSBhbHRlcm5hdGVfaW5zdGFuY2VbTUFYX0lOVEVSRkFDRVNdOworLyogb25lIGV4dHJhIGZvciBjb250cm9sIGVuZHBvaW50ICovCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSBlbmRwb2ludF9pbnN0YW5jZVtOVU1fRU5EUE9JTlRTKzFdOwogCiAvKgogICogR2xvYmFsIGZsYWcKICAqLwogaW50IHVzYnR0eV9jb25maWd1cmVkX2ZsYWcgPSAwOwogCi0KIC8qCiAgKiBTZXJpYWwgbnVtYmVyCiAgKi8KIHN0YXRpYyBjaGFyIHNlcmlhbF9udW1iZXJbMTZdOwogCisKIC8qCi0gKiBEZXNjcmlwdG9ycworICogRGVzY3JpcHRvcnMsIFN0cmluZ3MsIExvY2FsIHZhcmlhYmxlcy4KICAqLworCisvKiBkZWZpbmVkIGFuZCB1c2VkIGJ5IHVzYmRjb3JlX2VwMC5jICovCitleHRlcm4gc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciAqKnVzYl9zdHJpbmdzOworCisvKiBJbmRpY2llcywgUmVmZXJlbmNlcyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHJ4X2VuZHBvaW50ID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0eF9lbmRwb2ludCA9IDA7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaW50ZXJmYWNlX2NvdW50ID0gMDsKK3N0YXRpYyBzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICp1c2J0dHlfc3RyaW5nX3RhYmxlW1NUUl9DT1VOVF07CisKKy8qIFVTQiBEZXNjcmlwdG9yIFN0cmluZ3MgKi8KIHN0YXRpYyB1OCB3c3RyTGFuZ1s0XSA9IHs0LFVTQl9EVF9TVFJJTkcsMHg5LDB4NH07CiBzdGF0aWMgdTggd3N0ck1hbnVmYWN0dXJlclsyICsgMiooc2l6ZW9mKENPTkZJR19VU0JEX01BTlVGQUNUVVJFUiktMSldOwogc3RhdGljIHU4IHdzdHJQcm9kdWN0WzIgKyAyKihzaXplb2YoQ09ORklHX1VTQkRfUFJPRFVDVF9OQU1FKS0xKV07CiBzdGF0aWMgdTggd3N0clNlcmlhbFsyICsgMiooc2l6ZW9mKHNlcmlhbF9udW1iZXIpIC0gMSldOwogc3RhdGljIHU4IHdzdHJDb25maWd1cmF0aW9uWzIgKyAyKihzaXplb2YoQ09ORklHX1VTQkRfQ09ORklHVVJBVElPTl9TVFIpLTEpXTsKLXN0YXRpYyB1OCB3c3RySW50ZXJmYWNlWzIgKyAyKihzaXplb2YoQ09ORklHX1VTQkRfSU5URVJGQUNFX1NUUiktMSldOworc3RhdGljIHU4IHdzdHJEYXRhSW50ZXJmYWNlWzIgKyAyKihzaXplb2YoQ09ORklHX1VTQkRfREFUQV9JTlRFUkZBQ0VfU1RSKS0xKV07CitzdGF0aWMgdTggd3N0ckN0cmxJbnRlcmZhY2VbMiArIDIqKHNpemVvZihDT05GSUdfVVNCRF9EQVRBX0lOVEVSRkFDRV9TVFIpLTEpXTsKIAotc3RhdGljIHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgKnVzYnR0eV9zdHJpbmdfdGFibGVbXSA9IHsKLSAgKHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IqKXdzdHJMYW5nLAotICAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciopd3N0ck1hbnVmYWN0dXJlciwKLSAgKHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IqKXdzdHJQcm9kdWN0LAotICAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciopd3N0clNlcmlhbCwKLSAgKHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IqKXdzdHJDb25maWd1cmF0aW9uLAotICAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciopd3N0ckludGVyZmFjZQotfTsKLWV4dGVybiBzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICoqdXNiX3N0cmluZ3M7IC8qIGRlZmluZWQgYW5kIHVzZWQgYnkgb21hcDE1MTBfZXAwLmMgKi8KLQorLyogU3RhbmRhcmQgVVNCIERhdGEgU3RydWN0dXJlcyAqLworc3RhdGljIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgaW50ZXJmYWNlX2Rlc2NyaXB0b3JzW01BWF9JTlRFUkZBQ0VTXTsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2Rlc2NyaXB0b3JfcHRyc1tOVU1fRU5EUE9JTlRTXTsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvcgkqY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yID0gMDsKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yIGRldmljZV9kZXNjcmlwdG9yID0gewotICBiTGVuZ3RoOgkgICAgICBzaXplb2Yoc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciksCi0gIGJEZXNjcmlwdG9yVHlwZTogICAgVVNCX0RUX0RFVklDRSwKLSAgYmNkVVNCOgkgICAgICBVU0JfQkNEX1ZFUlNJT04sCi0gIGJEZXZpY2VDbGFzczoJICAgICAgVVNCVFRZX0RFVklDRV9DTEFTUywKLSAgYkRldmljZVN1YkNsYXNzOiAgICBVU0JUVFlfREVWSUNFX1NVQkNMQVNTLAotICBiRGV2aWNlUHJvdG9jb2w6ICAgIFVTQlRUWV9ERVZJQ0VfUFJPVE9DT0wsCi0gIGJNYXhQYWNrZXRTaXplMDogICAgRVAwX01BWF9QQUNLRVRfU0laRSwKLSAgaWRWZW5kb3I6CSAgICAgIENPTkZJR19VU0JEX1ZFTkRPUklELAotICBpZFByb2R1Y3Q6CSAgICAgIENPTkZJR19VU0JEX1BST0RVQ1RJRCwKLSAgYmNkRGV2aWNlOgkgICAgICBVU0JUVFlfQkNEX0RFVklDRSwKLSAgaU1hbnVmYWN0dXJlcjogICAgICBTVFJfTUFOVUZBQ1RVUkVSLAotICBpUHJvZHVjdDoJICAgICAgU1RSX1BST0RVQ1QsCi0gIGlTZXJpYWxOdW1iZXI6ICAgICAgU1RSX1NFUklBTCwKLSAgYk51bUNvbmZpZ3VyYXRpb25zOiBOVU1fQ09ORklHUwotICB9Owotc3RhdGljIHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yIGNvbmZpZ19kZXNjcmlwdG9yc1tOVU1fQ09ORklHU10gPSB7Ci0gIHsKLSAgICBiTGVuZ3RoOgkJIHNpemVvZihzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvciksCi0gICAgYkRlc2NyaXB0b3JUeXBlOgkgVVNCX0RUX0NPTkZJRywKLSAgICB3VG90YWxMZW5ndGg6CSAoc2l6ZW9mKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yKSpOVU1fQ09ORklHUykgKwotCQkJIChzaXplb2Yoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvcikqTlVNX0lOVEVSRkFDRVMpICsKLQkJCSAoc2l6ZW9mKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcikqTlVNX0VORFBPSU5UUyksCi0gICAgYk51bUludGVyZmFjZXM6CSBOVU1fSU5URVJGQUNFUywKLSAgICBiQ29uZmlndXJhdGlvblZhbHVlOiAxLAotICAgIGlDb25maWd1cmF0aW9uOgkgU1RSX0NPTkZJRywKLSAgICBibUF0dHJpYnV0ZXM6CSBCTUFUVFJJQlVURV9TRUxGX1BPV0VSRUQgfCBCTUFUVFJJQlVURV9SRVNFUlZFRCwKLSAgICBiTWF4UG93ZXI6CQkgVVNCVFRZX01BWFBPV0VSCi0gIH0sCisJLmJMZW5ndGggPSBzaXplb2Yoc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciksCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9ERVZJQ0UsCisJLmJjZFVTQiA9IAkJY3B1X3RvX2xlMTYoVVNCX0JDRF9WRVJTSU9OKSwKKwkuYkRldmljZVN1YkNsYXNzID0JMHgwMCwKKwkuYkRldmljZVByb3RvY29sID0JMHgwMCwKKwkuYk1heFBhY2tldFNpemUwID0JRVAwX01BWF9QQUNLRVRfU0laRSwKKwkuaWRWZW5kb3IgPQkJY3B1X3RvX2xlMTYoQ09ORklHX1VTQkRfVkVORE9SSUQpLAorCS5iY2REZXZpY2UgPQkJY3B1X3RvX2xlMTYoVVNCVFRZX0JDRF9ERVZJQ0UpLAorCS5pTWFudWZhY3R1cmVyID0JU1RSX01BTlVGQUNUVVJFUiwKKwkuaVByb2R1Y3QgPQkJU1RSX1BST0RVQ1QsCisJLmlTZXJpYWxOdW1iZXIgPQlTVFJfU0VSSUFMLAorCS5iTnVtQ29uZmlndXJhdGlvbnMgPQlOVU1fQ09ORklHUwogfTsKLXN0YXRpYyBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yIGludGVyZmFjZV9kZXNjcmlwdG9yc1tOVU1fSU5URVJGQUNFU10gPSB7Ci0gIHsKLSAgICBiTGVuZ3RoOgkJIHNpemVvZihzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yKSwKLSAgICBiRGVzY3JpcHRvclR5cGU6CSBVU0JfRFRfSU5URVJGQUNFLAotICAgIGJJbnRlcmZhY2VOdW1iZXI6CSAwLAotICAgIGJBbHRlcm5hdGVTZXR0aW5nOgkgMCwKLSAgICBiTnVtRW5kcG9pbnRzOgkgTlVNX0VORFBPSU5UUywKLSAgICBiSW50ZXJmYWNlQ2xhc3M6CSBVU0JUVFlfSU5URVJGQUNFX0NMQVNTLAotICAgIGJJbnRlcmZhY2VTdWJDbGFzczoJIFVTQlRUWV9JTlRFUkZBQ0VfU1VCQ0xBU1MsCi0gICAgYkludGVyZmFjZVByb3RvY29sOgkgVVNCVFRZX0lOVEVSRkFDRV9QUk9UT0NPTCwKLSAgICBpSW50ZXJmYWNlOgkJIFNUUl9JTlRFUkZBQ0UKLSAgfSwKKworCisvKgorICogU3RhdGljIENEQyBBQ00gc3BlY2lmaWMgZGVzY3JpcHRvcnMKKyAqLworCitzdHJ1Y3QgYWNtX2NvbmZpZ19kZXNjIHsKKwlzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvciBjb25maWd1cmF0aW9uX2Rlc2M7CisKKwkvKiBNYXN0ZXIgSW50ZXJmYWNlICovCisJc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBpbnRlcmZhY2VfZGVzYzsKKworCXN0cnVjdCB1c2JfY2xhc3NfaGVhZGVyX2Z1bmN0aW9uX2Rlc2NyaXB0b3IgdXNiX2NsYXNzX2hlYWRlcjsKKwlzdHJ1Y3QgdXNiX2NsYXNzX2NhbGxfbWFuYWdlbWVudF9kZXNjcmlwdG9yIHVzYl9jbGFzc19jYWxsX21ndDsKKwlzdHJ1Y3QgdXNiX2NsYXNzX2Fic3RyYWN0X2NvbnRyb2xfZGVzY3JpcHRvciB1c2JfY2xhc3NfYWNtOworCXN0cnVjdCB1c2JfY2xhc3NfdW5pb25fZnVuY3Rpb25fZGVzY3JpcHRvciB1c2JfY2xhc3NfdW5pb247CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIG5vdGlmaWNhdGlvbl9lbmRwb2ludDsKKworCS8qIFNsYXZlIEludGVyZmFjZSAqLworCXN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgZGF0YV9jbGFzc19pbnRlcmZhY2U7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCisJCWRhdGFfZW5kcG9pbnRzW05VTV9FTkRQT0lOVFMtMV0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWMgc3RydWN0IGFjbV9jb25maWdfZGVzYyBhY21fY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yc1tOVU1fQ09ORklHU10gPSB7CisJeworCQkuY29uZmlndXJhdGlvbl9kZXNjID17CisJCQkuYkxlbmd0aCA9CisJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yKSwKKyAgICAJCQkuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0NPTkZJRywKKwkJCS53VG90YWxMZW5ndGggPQorCQkJCWNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgYWNtX2NvbmZpZ19kZXNjKSksCisJICAgIAkJLmJOdW1JbnRlcmZhY2VzID0gTlVNX0FDTV9JTlRFUkZBQ0VTLAorICAgIAkJCS5iQ29uZmlndXJhdGlvblZhbHVlID0gMSwKKwkJCS5pQ29uZmlndXJhdGlvbiA9IFNUUl9DT05GSUcsCisJCQkuYm1BdHRyaWJ1dGVzID0KKwkJCQlCTUFUVFJJQlVURV9TRUxGX1BPV0VSRUR8Qk1BVFRSSUJVVEVfUkVTRVJWRUQsCisJCQkuYk1heFBvd2VyID0gVVNCVFRZX01BWFBPV0VSCisJCX0sCisJCS8qIEludGVyZmFjZSAxICovCisJCS5pbnRlcmZhY2VfZGVzYyA9IHsKKwkJCS5iTGVuZ3RoICA9IHNpemVvZihzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yKSwKKwkJCS5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSU5URVJGQUNFLAorCQkJLmJJbnRlcmZhY2VOdW1iZXIgPSAwLAorCQkJLmJBbHRlcm5hdGVTZXR0aW5nID0gMCwKKwkJCS5iTnVtRW5kcG9pbnRzID0gMHgwMSwKKwkJCS5iSW50ZXJmYWNlQ2xhc3MgPQorCQkJCUNPTU1VTklDQVRJT05TX0lOVEVSRkFDRV9DTEFTU19DT05UUk9MLAorCQkJLmJJbnRlcmZhY2VTdWJDbGFzcyA9IENPTU1VTklDQVRJT05TX0FDTV9TVUJDTEFTUywKKwkJCS5iSW50ZXJmYWNlUHJvdG9jb2wgPSBDT01NVU5JQ0FUSU9OU19WMjVURVJfUFJPVE9DT0wsCisJCQkuaUludGVyZmFjZSA9IFNUUl9DVFJMX0lOVEVSRkFDRSwKKwkJfSwKKwkJLnVzYl9jbGFzc19oZWFkZXIgPSB7CisJCQkuYkZ1bmN0aW9uTGVuZ3RoCT0KKwkJCQlzaXplb2Yoc3RydWN0IHVzYl9jbGFzc19oZWFkZXJfZnVuY3Rpb25fZGVzY3JpcHRvciksCisJCQkuYkRlc2NyaXB0b3JUeXBlCT0gQ1NfSU5URVJGQUNFLAorCQkJLmJEZXNjcmlwdG9yU3VidHlwZQk9IFVTQl9TVF9IRUFERVIsCisJCQkuYmNkQ0RDCT0gY3B1X3RvX2xlMTYoMTEwKSwKKwkJfSwKKwkJLnVzYl9jbGFzc19jYWxsX21ndCA9IHsKKwkJCS5iRnVuY3Rpb25MZW5ndGgJPQorCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2NsYXNzX2NhbGxfbWFuYWdlbWVudF9kZXNjcmlwdG9yKSwKKwkJCS5iRGVzY3JpcHRvclR5cGUJPSBDU19JTlRFUkZBQ0UsCisJCQkuYkRlc2NyaXB0b3JTdWJ0eXBlCT0gVVNCX1NUX0NNRiwKKwkJCS5ibUNhcGFiaWxpdGllcwkJPSAweDAwLAorCQkJLmJEYXRhSW50ZXJmYWNlCQk9IDB4MDEsCisJCX0sCisJCS51c2JfY2xhc3NfYWNtID0geworCQkJLmJGdW5jdGlvbkxlbmd0aAk9CisJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfY2xhc3NfYWJzdHJhY3RfY29udHJvbF9kZXNjcmlwdG9yKSwKKwkJCS5iRGVzY3JpcHRvclR5cGUJPSBDU19JTlRFUkZBQ0UsCisJCQkuYkRlc2NyaXB0b3JTdWJ0eXBlCT0gVVNCX1NUX0FDTUYsCisJCQkuYm1DYXBhYmlsaXRpZXMJCT0gMHgwMCwKKwkJfSwKKwkJLnVzYl9jbGFzc191bmlvbiA9IHsKKwkJCS5iRnVuY3Rpb25MZW5ndGgJPQorCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2NsYXNzX3VuaW9uX2Z1bmN0aW9uX2Rlc2NyaXB0b3IpLAorCQkJLmJEZXNjcmlwdG9yVHlwZQk9IENTX0lOVEVSRkFDRSwKKwkJCS5iRGVzY3JpcHRvclN1YnR5cGUJPSBVU0JfU1RfVUYsCisJCQkuYk1hc3RlckludGVyZmFjZQk9IDB4MDAsCisJCQkuYlNsYXZlSW50ZXJmYWNlMAk9IDB4MDEsCisJCX0sCisJCS5ub3RpZmljYXRpb25fZW5kcG9pbnQgPSB7CisJCQkuYkxlbmd0aCA9CisJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciksCisJCQkuYkRlc2NyaXB0b3JUeXBlCT0gVVNCX0RUX0VORFBPSU5ULAorCQkJLmJFbmRwb2ludEFkZHJlc3MJPSAweDAxIHwgVVNCX0RJUl9JTiwKKwkJCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0VORFBPSU5UX1hGRVJfSU5ULAorCQkJLndNYXhQYWNrZXRTaXplCisJCQkJPSBjcHVfdG9fbGUxNihDT05GSUdfVVNCRF9TRVJJQUxfSU5UX1BLVFNJWkUpLAorCQkJLmJJbnRlcnZhbAkJPSAweEZGLAorCQl9LAorCisJCS8qIEludGVyZmFjZSAyICovCisJCS5kYXRhX2NsYXNzX2ludGVyZmFjZSA9IHsKKwkJCS5iTGVuZ3RoCQk9CisJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IpLAorCQkJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9JTlRFUkZBQ0UsCisJCQkuYkludGVyZmFjZU51bWJlcgk9IDB4MDEsCisJCQkuYkFsdGVybmF0ZVNldHRpbmcJPSAweDAwLAorCQkJLmJOdW1FbmRwb2ludHMJCT0gMHgwMiwKKwkJCS5iSW50ZXJmYWNlQ2xhc3MJPQorCQkJCUNPTU1VTklDQVRJT05TX0lOVEVSRkFDRV9DTEFTU19EQVRBLAorCQkJLmJJbnRlcmZhY2VTdWJDbGFzcwk9IERBVEFfSU5URVJGQUNFX1NVQkNMQVNTX05PTkUsCisJCQkuYkludGVyZmFjZVByb3RvY29sCT0gREFUQV9JTlRFUkZBQ0VfUFJPVE9DT0xfTk9ORSwKKwkJCS5pSW50ZXJmYWNlCQk9IFNUUl9EQVRBX0lOVEVSRkFDRSwKKwkJfSwKKwkJLmRhdGFfZW5kcG9pbnRzID0geworCQkJeworCQkJCS5iTGVuZ3RoCQk9CisJCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IpLAorCQkJCS5iRGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfRU5EUE9JTlQsCisJCQkJLmJFbmRwb2ludEFkZHJlc3MJPSAweDAyIHwgVVNCX0RJUl9PVVQsCisJCQkJLmJtQXR0cmlidXRlcwkJPQorCQkJCQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCQkJCS53TWF4UGFja2V0U2l6ZQkJPQorCQkJCQljcHVfdG9fbGUxNihDT05GSUdfVVNCRF9TRVJJQUxfQlVMS19QS1RTSVpFKSwKKwkJCQkuYkludGVydmFsCQk9IDB4RkYsCisJCQl9LAorCQkJeworCQkJCS5iTGVuZ3RoCQk9CisJCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IpLAorCQkJCS5iRGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfRU5EUE9JTlQsCisJCQkJLmJFbmRwb2ludEFkZHJlc3MJPSAweDAzIHwgVVNCX0RJUl9JTiwKKwkJCQkuYm1BdHRyaWJ1dGVzCQk9CisJCQkJCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJCQkJLndNYXhQYWNrZXRTaXplCQk9CisJCQkJCWNwdV90b19sZTE2KENPTkZJR19VU0JEX1NFUklBTF9CVUxLX1BLVFNJWkUpLAorCQkJCS5iSW50ZXJ2YWwJCT0gMHhGRiwKKwkJCX0sCisJCX0sCisJfSwKIH07Ci1zdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGVwX2Rlc2NyaXB0b3JzW05VTV9FTkRQT0lOVFNdID0gewotICB7Ci0gICAgYkxlbmd0aDoJCSBzaXplb2Yoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKSwKLSAgICBiRGVzY3JpcHRvclR5cGU6CSBVU0JfRFRfRU5EUE9JTlQsCi0gICAgYkVuZHBvaW50QWRkcmVzczoJIENPTkZJR19VU0JEX1NFUklBTF9PVVRfRU5EUE9JTlQgfCBVU0JfRElSX09VVCwKLSAgICBibUF0dHJpYnV0ZXM6CSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAotICAgIHdNYXhQYWNrZXRTaXplOgkgQ09ORklHX1VTQkRfU0VSSUFMX09VVF9QS1RTSVpFLAotICAgIGJJbnRlcnZhbDoJCSAwCi0gIH0sCi0gIHsKLSAgICBiTGVuZ3RoOgkJIHNpemVvZihzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IpLAotICAgIGJEZXNjcmlwdG9yVHlwZToJIFVTQl9EVF9FTkRQT0lOVCwKLSAgICBiRW5kcG9pbnRBZGRyZXNzOgkgQ09ORklHX1VTQkRfU0VSSUFMX0lOX0VORFBPSU5UIHwgVVNCX0RJUl9JTiwKLSAgICBibUF0dHJpYnV0ZXM6CSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAotICAgIHdNYXhQYWNrZXRTaXplOgkgQ09ORklHX1VTQkRfU0VSSUFMX0lOX1BLVFNJWkUsCi0gICAgYkludGVydmFsOgkJIDAKLSAgfSwKLSAgewotICAgIGJMZW5ndGg6CQkgc2l6ZW9mKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciksCi0gICAgYkRlc2NyaXB0b3JUeXBlOgkgVVNCX0RUX0VORFBPSU5ULAotICAgIGJFbmRwb2ludEFkZHJlc3M6CSBDT05GSUdfVVNCRF9TRVJJQUxfSU5UX0VORFBPSU5UIHwgVVNCX0RJUl9JTiwKLSAgICBibUF0dHJpYnV0ZXM6CSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCi0gICAgd01heFBhY2tldFNpemU6CSBDT05GSUdfVVNCRF9TRVJJQUxfSU5UX1BLVFNJWkUsCi0gICAgYkludGVydmFsOgkJIDAKLSAgfSwKKworc3RhdGljIHN0cnVjdCByczIzMl9lbXUgcnMyMzJfZGVzYz17CisJCS5kdGVyIAkJPSAgCTExNTIwMCwKKwkgICAJLnN0b3BfYml0cwk9CTB4MDAsCisJICAgCS5wYXJpdHkJCT0JMHgwMCwKKwkJLmRhdGFfYml0cwk9CTB4MDgKIH07Ci1zdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9kZXNjcmlwdG9yX3B0cnNbTlVNX0VORFBPSU5UU10gPSB7Ci0gICYoZXBfZGVzY3JpcHRvcnNbMF0pLAotICAmKGVwX2Rlc2NyaXB0b3JzWzFdKSwKLSAgJihlcF9kZXNjcmlwdG9yc1syXSksCisKKworLyoKKyAqIFN0YXRpYyBHZW5lcmljIFNlcmlhbCBzcGVjaWZpYyBkYXRhCisgKi8KKworCitzdHJ1Y3QgZ3NlcmlhbF9jb25maWdfZGVzYyB7CisKKwlzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvciBjb25maWd1cmF0aW9uX2Rlc2M7CisJc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvcgorCQlpbnRlcmZhY2VfZGVzY1tOVU1fR1NFUklBTF9JTlRFUkZBQ0VTXSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IKKwkJZGF0YV9lbmRwb2ludHNbTlVNX0VORFBPSU5UU10gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0YXRpYyBzdHJ1Y3QgZ3NlcmlhbF9jb25maWdfZGVzYworZ3NlcmlhbF9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3JzW05VTV9DT05GSUdTXSA9eworCXsKKwkJLmNvbmZpZ3VyYXRpb25fZGVzYyA9eworCQkJLmJMZW5ndGggPSBzaXplb2Yoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IpLAorCQkJLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9DT05GSUcsCisJCQkud1RvdGFsTGVuZ3RoID0KKwkJCQljcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGdzZXJpYWxfY29uZmlnX2Rlc2MpKSwKKwkJCS5iTnVtSW50ZXJmYWNlcyA9IE5VTV9HU0VSSUFMX0lOVEVSRkFDRVMsCisJCQkuYkNvbmZpZ3VyYXRpb25WYWx1ZSA9IDEsCisJCQkuaUNvbmZpZ3VyYXRpb24gPSBTVFJfQ09ORklHLAorCQkJLmJtQXR0cmlidXRlcyA9CisJCQkJQk1BVFRSSUJVVEVfU0VMRl9QT1dFUkVEfEJNQVRUUklCVVRFX1JFU0VSVkVELAorCQkJLmJNYXhQb3dlciA9IFVTQlRUWV9NQVhQT1dFUgorCQl9LAorCQkuaW50ZXJmYWNlX2Rlc2MgPSB7CisJCQl7CisJCQkJLmJMZW5ndGggID0KKwkJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IpLAorCQkJCS5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSU5URVJGQUNFLAorCQkJCS5iSW50ZXJmYWNlTnVtYmVyID0gMCwKKwkJCQkuYkFsdGVybmF0ZVNldHRpbmcgPSAwLAorCQkJCS5iTnVtRW5kcG9pbnRzID0gTlVNX0VORFBPSU5UUywKKwkJCQkuYkludGVyZmFjZUNsYXNzID0KKwkJCQkJQ09NTVVOSUNBVElPTlNfSU5URVJGQUNFX0NMQVNTX1ZFTkRPUiwKKwkJCQkuYkludGVyZmFjZVN1YkNsYXNzID0KKwkJCQkJQ09NTVVOSUNBVElPTlNfTk9fU1VCQ0xBU1MsCisJCQkJLmJJbnRlcmZhY2VQcm90b2NvbCA9CisJCQkJCUNPTU1VTklDQVRJT05TX05PX1BST1RPQ09MLAorCQkJCS5pSW50ZXJmYWNlID0gU1RSX0RBVEFfSU5URVJGQUNFCisJCQl9LAorICAJCX0sCisJCS5kYXRhX2VuZHBvaW50cyAgPSB7CisJCQl7CisJCQkJLmJMZW5ndGggPQorCQkJCQlzaXplb2Yoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKSwKKwkJCQkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAorCQkJCS5iRW5kcG9pbnRBZGRyZXNzID0JMHgwMSB8IFVTQl9ESVJfT1VULAorCQkJCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkJCQkud01heFBhY2tldFNpemUgPQorCQkJCQljcHVfdG9fbGUxNihDT05GSUdfVVNCRF9TRVJJQUxfT1VUX1BLVFNJWkUpLAorCQkJCS5iSW50ZXJ2YWw9CQkweEZGLAorCQkJfSwKKwkJCXsKKwkJCQkuYkxlbmd0aCA9CisJCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IpLAorCQkJCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisJCQkJLmJFbmRwb2ludEFkZHJlc3MgPQkweDAyIHwgVVNCX0RJUl9JTiwKKwkJCQkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJCQkJLndNYXhQYWNrZXRTaXplID0KKwkJCQkJY3B1X3RvX2xlMTYoQ09ORklHX1VTQkRfU0VSSUFMX0lOX1BLVFNJWkUpLAorCQkJCS5iSW50ZXJ2YWwgPSAJCTB4RkYsCisJCQl9LAorCQkJeworCQkJCS5iTGVuZ3RoID0KKwkJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciksCisJCQkJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKwkJCQkuYkVuZHBvaW50QWRkcmVzcyA9CTB4MDMgfCBVU0JfRElSX0lOLAorCQkJCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfSU5ULAorICAgIAkJCQkud01heFBhY2tldFNpemUgPQorCQkJCQljcHVfdG9fbGUxNihDT05GSUdfVVNCRF9TRVJJQUxfSU5UX1BLVFNJWkUpLAorCQkJCS5iSW50ZXJ2YWwgPQkJMHhGRiwKKwkJCX0sCisJCX0sCisJfSwKIH07CiAKKy8qCisgKiBTdGF0aWMgRnVuY3Rpb24gUHJvdG90eXBlcworICovCisKK3N0YXRpYyB2b2lkIHVzYnR0eV9pbml0X3N0cmluZ3MgKHZvaWQpOworc3RhdGljIHZvaWQgdXNidHR5X2luaXRfaW5zdGFuY2VzICh2b2lkKTsKK3N0YXRpYyB2b2lkIHVzYnR0eV9pbml0X2VuZHBvaW50cyAodm9pZCk7CitzdGF0aWMgdm9pZCB1c2J0dHlfaW5pdF90ZXJtaW5hbF90eXBlKHNob3J0IHR5cGUpOworc3RhdGljIHZvaWQgdXNidHR5X2V2ZW50X2hhbmRsZXIgKHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UsCisJCQkJdXNiX2RldmljZV9ldmVudF90IGV2ZW50LCBpbnQgZGF0YSk7CitzdGF0aWMgaW50IHVzYnR0eV9jZGNfc2V0dXAoc3RydWN0IHVzYl9kZXZpY2VfcmVxdWVzdCAqcmVxdWVzdCwKKwkJCQlzdHJ1Y3QgdXJiICp1cmIpOworc3RhdGljIGludCB1c2J0dHlfY29uZmlndXJlZCAodm9pZCk7CitzdGF0aWMgaW50IHdyaXRlX2J1ZmZlciAoY2lyY2J1Zl90ICogYnVmKTsKK3N0YXRpYyBpbnQgZmlsbF9idWZmZXIgKGNpcmNidWZfdCAqIGJ1Zik7CisKK3ZvaWQgdXNidHR5X3BvbGwgKHZvaWQpOworCiAvKiB1dGlsaXR5IGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIGNoYXIqIHRvIHdpZGUgc3RyaW5nIHVzZWQgYnkgVVNCICovCiBzdGF0aWMgdm9pZCBzdHIyd2lkZSAoY2hhciAqc3RyLCB1MTYgKiB3aWRlKQogewogCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHN0cmxlbiAoc3RyKSAmJiBzdHJbaV07IGkrKykKLQkJd2lkZVtpXSA9ICh1MTYpIHN0cltpXTsKKwlmb3IgKGkgPSAwOyBpIDwgc3RybGVuIChzdHIpICYmIHN0cltpXTsgaSsrKXsKKwkJI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCQkJd2lkZVtpXSA9ICh1MTYpIHN0cltpXTsKKwkJI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJCQl3aWRlW2ldID0gKCh1MTYpKHN0cltpXSk8PDgpOworCQkjZWxzZQorCQkJI2Vycm9yICJfX0xJVFRMRV9FTkRJQU4gb3IgX19CSUdfRU5ESUFOIHVuZGVmaW5lZCIKKwkJI2VuZGlmCisJfQogfQogCiAvKgotICogUHJvdG90eXBlcwotICovCi1zdGF0aWMgdm9pZCB1c2J0dHlfaW5pdF9zdHJpbmdzICh2b2lkKTsKLXN0YXRpYyB2b2lkIHVzYnR0eV9pbml0X2luc3RhbmNlcyAodm9pZCk7Ci1zdGF0aWMgdm9pZCB1c2J0dHlfaW5pdF9lbmRwb2ludHMgKHZvaWQpOwotCi1zdGF0aWMgdm9pZCB1c2J0dHlfZXZlbnRfaGFuZGxlciAoc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKmRldmljZSwKLQkJCQkgIHVzYl9kZXZpY2VfZXZlbnRfdCBldmVudCwgaW50IGRhdGEpOwotc3RhdGljIGludCB1c2J0dHlfY29uZmlndXJlZCAodm9pZCk7Ci0KLXN0YXRpYyBpbnQgd3JpdGVfYnVmZmVyIChjaXJjYnVmX3QgKiBidWYpOwotc3RhdGljIGludCBmaWxsX2J1ZmZlciAoY2lyY2J1Zl90ICogYnVmKTsKLQotdm9pZCB1c2J0dHlfcG9sbCAodm9pZCk7Ci1zdGF0aWMgdm9pZCBwcmV0ZW5kX2ludGVycnVwdHMgKHZvaWQpOwotCi0KLS8qCiAgKiBUZXN0IHdoZXRoZXIgYSBjaGFyYWN0ZXIgaXMgaW4gdGhlIFJYIGJ1ZmZlcgogICovCisKIGludCB1c2J0dHlfdHN0YyAodm9pZCkKIHsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplbmRwb2ludCA9CisJCSZlbmRwb2ludF9pbnN0YW5jZVtyeF9lbmRwb2ludF07CisKKwkvKiBJZiBubyBpbnB1dCBkYXRhIGV4aXN0cywgYWxsb3cgbW9yZSBSWCB0byBiZSBhY2NlcHRlZCAqLworCWlmKHVzYnR0eV9pbnB1dC5zaXplIDw9IDApeworCQl1ZGNfdW5zZXRfbmFrKGVuZHBvaW50LT5lbmRwb2ludF9hZGRyZXNzJjB4MDMpOworCX0KKwogCXVzYnR0eV9wb2xsICgpOwogCXJldHVybiAodXNidHR5X2lucHV0LnNpemUgPiAwKTsKIH0KQEAgLTIxMCwxNSArNDE0LDIxIEBACiAgKiBvdGhlcndpc2UuIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIHN1Y2Nlc2Z1bGwsIHRoZSBjaGFyYWN0ZXIgcmVhZCBpcwogICogd3JpdHRlbiBpbnRvIGl0cyBhcmd1bWVudCBjLgogICovCisKIGludCB1c2J0dHlfZ2V0YyAodm9pZCkKIHsKIAljaGFyIGM7CisJc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZW5kcG9pbnQgPQorCQkmZW5kcG9pbnRfaW5zdGFuY2VbcnhfZW5kcG9pbnRdOwogCiAJd2hpbGUgKHVzYnR0eV9pbnB1dC5zaXplIDw9IDApIHsKKwkJdWRjX3Vuc2V0X25hayhlbmRwb2ludC0+ZW5kcG9pbnRfYWRkcmVzcyYweDAzKTsKIAkJdXNidHR5X3BvbGwgKCk7CiAJfQogCiAJYnVmX3BvcCAoJnVzYnR0eV9pbnB1dCwgJmMsIDEpOworCXVkY19zZXRfbmFrKGVuZHBvaW50LT5lbmRwb2ludF9hZGRyZXNzJjB4MDMpOworCiAJcmV0dXJuIGM7CiB9CiAKQEAgLTIzOCw3ICs0NDgsNiBAQAogCX0KIH0KIAotCiAvKiB1c2J0dHlfcHV0cygpIGhlbHBlciBmdW5jdGlvbiBmb3IgZmluZGluZyB0aGUgbmV4dCAnXG4nIGluIGEgc3RyaW5nICovCiBzdGF0aWMgaW50IG5leHRfbmxfcG9zIChjb25zdCBjaGFyICpzKQogewpAQCAtMjUyLDggKzQ2MSw5IEBACiB9CiAKIC8qCi0gKiBPdXRwdXQgYSBzdHJpbmcgdG8gdGhlIHVzYiBjbGllbnQgcG9ydC4KKyAqIE91dHB1dCBhIHN0cmluZyB0byB0aGUgdXNiIGNsaWVudCBwb3J0IC0gaW1wbGVtZW50aW5nIGZsb3cgY29udHJvbAogICovCisKIHN0YXRpYyB2b2lkIF9fdXNidHR5X3B1dHMgKGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbikKIHsKIAlpbnQgbWF4bGVuID0gdXNidHR5X291dHB1dC50b3RhbHNpemU7CkBAIC0yNjEsMjIgKzQ3MSwxOSBAQAogCiAJLyogYnJlYWsgc3RyIGludG8gY2h1bmtzIDwgYnVmZmVyIHNpemUsIGlmIG5lZWRlZCAqLwogCXdoaWxlIChsZW4gPiAwKSB7CisJCXVzYnR0eV9wb2xsICgpOworCiAJCXNwYWNlID0gbWF4bGVuIC0gdXNidHR5X291dHB1dC5zaXplOwotCiAJCS8qIEVtcHR5IGJ1ZmZlciBoZXJlLCBpZiBuZWVkZWQsIHRvIGVuc3VyZSBzcGFjZS4uLiAqLwotCQlpZiAoc3BhY2UgPD0gMCkgeworCQlpZiAoc3BhY2UpIHsKIAkJCXdyaXRlX2J1ZmZlciAoJnVzYnR0eV9vdXRwdXQpOwotCQkJc3BhY2UgPSBtYXhsZW4gLSB1c2J0dHlfb3V0cHV0LnNpemU7Ci0JCQlpZiAoc3BhY2UgPD0gMCkgewotCQkJCXNwYWNlID0gbGVuOwkvKiBhbGxvdyBvbGQgZGF0YSB0byBiZSBvdmVyd3JpdHRlbi4gKi8KLQkJCX0KKworCQkJbiA9IE1JTiAoc3BhY2UsIE1JTiAobGVuLCBtYXhsZW4pKTsKKwkJCWJ1Zl9wdXNoICgmdXNidHR5X291dHB1dCwgc3RyLCBuKTsKKworCQkJc3RyICs9IG47CisJCQlsZW4gLT0gbjsKIAkJfQotCi0JCW4gPSBNSU4gKHNwYWNlLCBNSU4gKGxlbiwgbWF4bGVuKSk7Ci0JCWJ1Zl9wdXNoICgmdXNidHR5X291dHB1dCwgc3RyLCBuKTsKLQotCQlzdHIgKz0gbjsKLQkJbGVuIC09IG47CiAJfQogfQogCkBAIC0zMTMsOCArNTIwLDEwIEBACiB7CiAJaW50IHJjOwogCWNoYXIgKiBzbjsKKwljaGFyICogdHQ7CiAJaW50IHNubGVuOwogCisJLyogR2VyIHNlaXJhbCBudW1iZXIgKi8KIAlpZiAoIShzbiA9IGdldGVudigic2VyaWFsIyIpKSkgewogCQlzbiA9ICIwMDAwMDAwMDAwMDAiOwogCX0KQEAgLTMyNyw2ICs1MzYsMTQgQEAKIAltZW1jcHkgKHNlcmlhbF9udW1iZXIsIHNuLCBzbmxlbik7CiAJc2VyaWFsX251bWJlcltzbmxlbl0gPSAnXDAnOwogCisJLyogRGVjaWRlIG9uIHdoaWNoIHR5cGUgb2YgVURDIGRldmljZSB0byBiZS4KKwkgKi8KKworCWlmKCEodHQgPSBnZXRlbnYoInVzYnR0eSIpKSkgeworCQl0dCA9ICJnZW5lcmljIjsKKwl9CisJdXNidHR5X2luaXRfdGVybWluYWxfdHlwZShzdHJjbXAodHQsImNkY19hY20iKSk7CisKIAkvKiBwcmVwYXJlIGJ1ZmZlcnMuLi4gKi8KIAlidWZfaW5pdCAoJnVzYnR0eV9pbnB1dCwgVVNCVFRZX0JVRkZFUl9TSVpFKTsKIAlidWZfaW5pdCAoJnVzYnR0eV9vdXRwdXQsIFVTQlRUWV9CVUZGRVJfU0laRSk7CkBAIC0zMzcsNyArNTU0LDcgQEAKIAl1c2J0dHlfaW5pdF9zdHJpbmdzICgpOwogCXVzYnR0eV9pbml0X2luc3RhbmNlcyAoKTsKIAotCXVkY19zdGFydHVwX2V2ZW50cyAoZGV2aWNlX2luc3RhbmNlKTsJLyogRW5hYmxlIG91ciBkZXZpY2UsIGluaXRpYWxpemUgdWRjIHBvaW50ZXJzICovCisJdWRjX3N0YXJ0dXBfZXZlbnRzIChkZXZpY2VfaW5zdGFuY2UpOy8qIEVuYWJsZSBkZXYsIGluaXQgdWRjIHBvaW50ZXJzICovCiAJdWRjX2Nvbm5lY3QgKCk7CQkvKiBFbmFibGUgcHVsbHVwIGZvciBob3N0IGRldGVjdGlvbiAqLwogCiAJdXNidHR5X2luaXRfZW5kcG9pbnRzICgpOwpAQCAtMzYyLDMwICs1NzksNDggQEAKIHsKIAlzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICpzdHJpbmc7CiAKKwl1c2J0dHlfc3RyaW5nX3RhYmxlW1NUUl9MQU5HXSA9CisJCShzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yKil3c3RyTGFuZzsKKwogCXN0cmluZyA9IChzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICopIHdzdHJNYW51ZmFjdHVyZXI7Ci0Jc3RyaW5nLT5iTGVuZ3RoID0gc2l6ZW9mICh3c3RyTWFudWZhY3R1cmVyKTsKKwlzdHJpbmctPmJMZW5ndGggPSBzaXplb2Yod3N0ck1hbnVmYWN0dXJlcik7CiAJc3RyaW5nLT5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfU1RSSU5HOwogCXN0cjJ3aWRlIChDT05GSUdfVVNCRF9NQU5VRkFDVFVSRVIsIHN0cmluZy0+d0RhdGEpOworCXVzYnR0eV9zdHJpbmdfdGFibGVbU1RSX01BTlVGQUNUVVJFUl09c3RyaW5nOworCiAKIAlzdHJpbmcgPSAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciAqKSB3c3RyUHJvZHVjdDsKLQlzdHJpbmctPmJMZW5ndGggPSBzaXplb2YgKHdzdHJQcm9kdWN0KTsKKwlzdHJpbmctPmJMZW5ndGggPSBzaXplb2Yod3N0clByb2R1Y3QpOwogCXN0cmluZy0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX1NUUklORzsKIAlzdHIyd2lkZSAoQ09ORklHX1VTQkRfUFJPRFVDVF9OQU1FLCBzdHJpbmctPndEYXRhKTsKKwl1c2J0dHlfc3RyaW5nX3RhYmxlW1NUUl9QUk9EVUNUXT1zdHJpbmc7CisKIAogCXN0cmluZyA9IChzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICopIHdzdHJTZXJpYWw7Ci0Jc3RyaW5nLT5iTGVuZ3RoID0gMiArIDIqc3RybGVuKHNlcmlhbF9udW1iZXIpOworCXN0cmluZy0+Ykxlbmd0aCA9IHNpemVvZihzZXJpYWxfbnVtYmVyKTsKIAlzdHJpbmctPmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9TVFJJTkc7CiAJc3RyMndpZGUgKHNlcmlhbF9udW1iZXIsIHN0cmluZy0+d0RhdGEpOworCXVzYnR0eV9zdHJpbmdfdGFibGVbU1RSX1NFUklBTF09c3RyaW5nOworCiAKIAlzdHJpbmcgPSAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciAqKSB3c3RyQ29uZmlndXJhdGlvbjsKLQlzdHJpbmctPmJMZW5ndGggPSBzaXplb2YgKHdzdHJDb25maWd1cmF0aW9uKTsKKwlzdHJpbmctPmJMZW5ndGggPSBzaXplb2Yod3N0ckNvbmZpZ3VyYXRpb24pOwogCXN0cmluZy0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX1NUUklORzsKIAlzdHIyd2lkZSAoQ09ORklHX1VTQkRfQ09ORklHVVJBVElPTl9TVFIsIHN0cmluZy0+d0RhdGEpOworCXVzYnR0eV9zdHJpbmdfdGFibGVbU1RSX0NPTkZJR109c3RyaW5nOwogCi0Jc3RyaW5nID0gKHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgKikgd3N0ckludGVyZmFjZTsKLQlzdHJpbmctPmJMZW5ndGggPSBzaXplb2YgKHdzdHJJbnRlcmZhY2UpOworCisJc3RyaW5nID0gKHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgKikgd3N0ckRhdGFJbnRlcmZhY2U7CisJc3RyaW5nLT5iTGVuZ3RoID0gc2l6ZW9mKHdzdHJEYXRhSW50ZXJmYWNlKTsKIAlzdHJpbmctPmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9TVFJJTkc7Ci0Jc3RyMndpZGUgKENPTkZJR19VU0JEX0lOVEVSRkFDRV9TVFIsIHN0cmluZy0+d0RhdGEpOworCXN0cjJ3aWRlIChDT05GSUdfVVNCRF9EQVRBX0lOVEVSRkFDRV9TVFIsIHN0cmluZy0+d0RhdGEpOworCXVzYnR0eV9zdHJpbmdfdGFibGVbU1RSX0RBVEFfSU5URVJGQUNFXT1zdHJpbmc7CisKKwlzdHJpbmcgPSAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciAqKSB3c3RyQ3RybEludGVyZmFjZTsKKwlzdHJpbmctPmJMZW5ndGggPSBzaXplb2Yod3N0ckN0cmxJbnRlcmZhY2UpOworCXN0cmluZy0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX1NUUklORzsKKwlzdHIyd2lkZSAoQ09ORklHX1VTQkRfQ1RSTF9JTlRFUkZBQ0VfU1RSLCBzdHJpbmctPndEYXRhKTsKKwl1c2J0dHlfc3RyaW5nX3RhYmxlW1NUUl9DVFJMX0lOVEVSRkFDRV09c3RyaW5nOwogCiAJLyogTm93LCBpbml0aWFsaXplIHRoZSBzdHJpbmcgdGFibGUgZm9yIGVwMCBoYW5kbGluZyAqLwogCXVzYl9zdHJpbmdzID0gdXNidHR5X3N0cmluZ190YWJsZTsKQEAgLTQwMCw2ICs2MzUsNyBAQAogCWRldmljZV9pbnN0YW5jZS0+ZGV2aWNlX3N0YXRlID0gU1RBVEVfSU5JVDsKIAlkZXZpY2VfaW5zdGFuY2UtPmRldmljZV9kZXNjcmlwdG9yID0gJmRldmljZV9kZXNjcmlwdG9yOwogCWRldmljZV9pbnN0YW5jZS0+ZXZlbnQgPSB1c2J0dHlfZXZlbnRfaGFuZGxlcjsKKwlkZXZpY2VfaW5zdGFuY2UtPmNkY19yZWN2X3NldHVwID0gdXNidHR5X2NkY19zZXR1cDsKIAlkZXZpY2VfaW5zdGFuY2UtPmJ1cyA9IGJ1c19pbnN0YW5jZTsKIAlkZXZpY2VfaW5zdGFuY2UtPmNvbmZpZ3VyYXRpb25zID0gTlVNX0NPTkZJR1M7CiAJZGV2aWNlX2luc3RhbmNlLT5jb25maWd1cmF0aW9uX2luc3RhbmNlX2FycmF5ID0gY29uZmlnX2luc3RhbmNlOwpAQCAtNDE1LDggKzY1MSw4IEBACiAJLyogY29uZmlndXJhdGlvbiBpbnN0YW5jZSAqLwogCW1lbXNldCAoY29uZmlnX2luc3RhbmNlLCAwLAogCQlzaXplb2YgKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbl9pbnN0YW5jZSkpOwotCWNvbmZpZ19pbnN0YW5jZS0+aW50ZXJmYWNlcyA9IE5VTV9JTlRFUkZBQ0VTOwotCWNvbmZpZ19pbnN0YW5jZS0+Y29uZmlndXJhdGlvbl9kZXNjcmlwdG9yID0gY29uZmlnX2Rlc2NyaXB0b3JzOworCWNvbmZpZ19pbnN0YW5jZS0+aW50ZXJmYWNlcyA9IGludGVyZmFjZV9jb3VudDsKKwljb25maWdfaW5zdGFuY2UtPmNvbmZpZ3VyYXRpb25fZGVzY3JpcHRvciA9IGNvbmZpZ3VyYXRpb25fZGVzY3JpcHRvcjsKIAljb25maWdfaW5zdGFuY2UtPmludGVyZmFjZV9pbnN0YW5jZV9hcnJheSA9IGludGVyZmFjZV9pbnN0YW5jZTsKIAogCS8qIGludGVyZmFjZSBpbnN0YW5jZSAqLwpAQCAtNDQ3LDE3ICs2ODMsMjIgQEAKIAkJCXNpemVvZiAoc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSkpOwogCiAJCWVuZHBvaW50X2luc3RhbmNlW2ldLmVuZHBvaW50X2FkZHJlc3MgPQotCQkJZXBfZGVzY3JpcHRvcnNbaSAtIDFdLmJFbmRwb2ludEFkZHJlc3M7CisJCQllcF9kZXNjcmlwdG9yX3B0cnNbaSAtIDFdLT5iRW5kcG9pbnRBZGRyZXNzOworCisJCWVuZHBvaW50X2luc3RhbmNlW2ldLnJjdl9hdHRyaWJ1dGVzID0KKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1tpIC0gMV0tPmJtQXR0cmlidXRlczsKIAogCQllbmRwb2ludF9pbnN0YW5jZVtpXS5yY3ZfcGFja2V0U2l6ZSA9Ci0JCQllcF9kZXNjcmlwdG9yc1tpIC0gMV0ud01heFBhY2tldFNpemU7Ci0JCWVuZHBvaW50X2luc3RhbmNlW2ldLnJjdl9hdHRyaWJ1dGVzID0KLQkJCWVwX2Rlc2NyaXB0b3JzW2kgLSAxXS5ibUF0dHJpYnV0ZXM7CisJCQlsZTE2X3RvX2NwdShlcF9kZXNjcmlwdG9yX3B0cnNbaSAtIDFdLT53TWF4UGFja2V0U2l6ZSk7CisKKwkJZW5kcG9pbnRfaW5zdGFuY2VbaV0udHhfYXR0cmlidXRlcyA9CisJCQllcF9kZXNjcmlwdG9yX3B0cnNbaSAtIDFdLT5ibUF0dHJpYnV0ZXM7CiAKIAkJZW5kcG9pbnRfaW5zdGFuY2VbaV0udHhfcGFja2V0U2l6ZSA9Ci0JCQllcF9kZXNjcmlwdG9yc1tpIC0gMV0ud01heFBhY2tldFNpemU7CisJCQlsZTE2X3RvX2NwdShlcF9kZXNjcmlwdG9yX3B0cnNbaSAtIDFdLT53TWF4UGFja2V0U2l6ZSk7CisKIAkJZW5kcG9pbnRfaW5zdGFuY2VbaV0udHhfYXR0cmlidXRlcyA9Ci0JCQllcF9kZXNjcmlwdG9yc1tpIC0gMV0uYm1BdHRyaWJ1dGVzOworCQkJZXBfZGVzY3JpcHRvcl9wdHJzW2kgLSAxXS0+Ym1BdHRyaWJ1dGVzOwogCiAJCXVyYl9saW5rX2luaXQgKCZlbmRwb2ludF9pbnN0YW5jZVtpXS5yY3YpOwogCQl1cmJfbGlua19pbml0ICgmZW5kcG9pbnRfaW5zdGFuY2VbaV0ucmR5KTsKQEAgLTQ4MCwxMyArNzIxLDc5IEBACiAJaW50IGk7CiAKIAlidXNfaW5zdGFuY2UtPm1heF9lbmRwb2ludHMgPSBOVU1fRU5EUE9JTlRTICsgMTsKLQlmb3IgKGkgPSAwOyBpIDw9IE5VTV9FTkRQT0lOVFM7IGkrKykgeworCWZvciAoaSA9IDE7IGkgPD0gTlVNX0VORFBPSU5UUzsgaSsrKSB7CiAJCXVkY19zZXR1cF9lcCAoZGV2aWNlX2luc3RhbmNlLCBpLCAmZW5kcG9pbnRfaW5zdGFuY2VbaV0pOwogCX0KIH0KIAorLyogdXNidHR5X2luaXRfdGVybWluYWxfdHlwZQorICoKKyAqIERvIHNvbWUgbGF0ZSBiaW5kaW5nIGZvciBvdXIgZGV2aWNlIHR5cGUuCisgKi8KK3N0YXRpYyB2b2lkIHVzYnR0eV9pbml0X3Rlcm1pbmFsX3R5cGUoc2hvcnQgdHlwZSkKK3sKKwlzd2l0Y2godHlwZSl7CisJCS8qIENEQyBBQ00gKi8KKwkJY2FzZSAwOgorCQkJLyogQXNzaWduIGVuZHBvaW50IGRlc2NyaXB0b3JzICovCisJCQllcF9kZXNjcmlwdG9yX3B0cnNbMF0gPQorCQkJCSZhY21fY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yc1swXS5ub3RpZmljYXRpb25fZW5kcG9pbnQ7CisJCQllcF9kZXNjcmlwdG9yX3B0cnNbMV0gPQorCQkJCSZhY21fY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yc1swXS5kYXRhX2VuZHBvaW50c1swXTsKKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1syXSA9CisJCQkJJmFjbV9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3JzWzBdLmRhdGFfZW5kcG9pbnRzWzFdOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQkJLyogRW51bWVyYXRlIERldmljZSBEZXNjcmlwdG9yICovCisJCQlkZXZpY2VfZGVzY3JpcHRvci5iRGV2aWNlQ2xhc3MgPQorCQkJCUNPTU1VTklDQVRJT05TX0RFVklDRV9DTEFTUzsKKwkJCWRldmljZV9kZXNjcmlwdG9yLmlkUHJvZHVjdCA9CisJCQkJY3B1X3RvX2xlMTYoQ09ORklHX1VTQkRfUFJPRFVDVElEX0NEQ0FDTSk7CisKKwkJCS8qIEFzc2lnbiBlbmRwb2ludCBpbmRpY2VzICovCisJCQl0eF9lbmRwb2ludCA9IEFDTV9UWF9FTkRQT0lOVDsKKwkJCXJ4X2VuZHBvaW50ID0gQUNNX1JYX0VORFBPSU5UOworCisJCQkvKiBDb25maWd1cmF0aW9uIERlc2NyaXB0b3IgKi8KKwkJCWNvbmZpZ3VyYXRpb25fZGVzY3JpcHRvciA9CisJCQkJKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yKikKKwkJCQkmYWNtX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvcnM7CisKKwkJCS8qIEludGVyZmFjZSBjb3VudCAqLworCQkJaW50ZXJmYWNlX2NvdW50ID0gTlVNX0FDTV9JTlRFUkZBQ0VTOworCQlicmVhazsKKworCQkvKiBCVUxLIElOL09VVCAmIERlZmF1bHQgKi8KKwkJY2FzZSAxOgorCQlkZWZhdWx0OgorCQkJLyogQXNzaWduIGVuZHBvaW50IGRlc2NyaXB0b3JzICovCisJCQllcF9kZXNjcmlwdG9yX3B0cnNbMF0gPQorCQkJCSZnc2VyaWFsX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvcnNbMF0uZGF0YV9lbmRwb2ludHNbMF07CisJCQllcF9kZXNjcmlwdG9yX3B0cnNbMV0gPQorCQkJCSZnc2VyaWFsX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvcnNbMF0uZGF0YV9lbmRwb2ludHNbMV07CisJCQllcF9kZXNjcmlwdG9yX3B0cnNbMl0gPQorCQkJCSZnc2VyaWFsX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvcnNbMF0uZGF0YV9lbmRwb2ludHNbMl07CisKKwkJCS8qIEVudW1lcmF0ZSBEZXZpY2UgRGVzY3JpcHRvciAqLworCQkJZGV2aWNlX2Rlc2NyaXB0b3IuYkRldmljZUNsYXNzID0gMHhGRjsKKwkJCWRldmljZV9kZXNjcmlwdG9yLmlkUHJvZHVjdCA9CisJCQkJY3B1X3RvX2xlMTYoQ09ORklHX1VTQkRfUFJPRFVDVElEX0dTRVJJQUwpOworCisJCQkvKiBBc3NpZ24gZW5kcG9pbnQgaW5kaWNlcyAqLworCQkJdHhfZW5kcG9pbnQgPSBHU0VSSUFMX1RYX0VORFBPSU5UOworCQkJcnhfZW5kcG9pbnQgPSBHU0VSSUFMX1JYX0VORFBPSU5UOworCisJCQkvKiBDb25maWd1cmF0aW9uIERlc2NyaXB0b3IgKi8KKwkJCWNvbmZpZ3VyYXRpb25fZGVzY3JpcHRvciA9CisJCQkJKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yKikKKwkJCQkmZ3NlcmlhbF9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3JzOworCisJCQkvKiBJbnRlcmZhY2UgY291bnQgKi8KKwkJCWludGVyZmFjZV9jb3VudCA9IE5VTV9HU0VSSUFMX0lOVEVSRkFDRVM7CisJCWJyZWFrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHN0cnVjdCB1cmIgKm5leHRfdXJiIChzdHJ1Y3QgdXNiX2RldmljZV9pbnN0YW5jZSAqZGV2aWNlLAogCQkJICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplbmRwb2ludCkKQEAgLTUyNiwyNyArODMzLDM5IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChidWYtPnNpemUpIHsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplbmRwb2ludCA9CisJCQkmZW5kcG9pbnRfaW5zdGFuY2VbdHhfZW5kcG9pbnRdOworCXN0cnVjdCB1cmIgKmN1cnJlbnRfdXJiID0gTlVMTDsKIAotCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplbmRwb2ludCA9Ci0JCQkmZW5kcG9pbnRfaW5zdGFuY2VbVFhfRU5EUE9JTlRdOwotCQlzdHJ1Y3QgdXJiICpjdXJyZW50X3VyYiA9IE5VTEw7CisJY3VycmVudF91cmIgPSBuZXh0X3VyYiAoZGV2aWNlX2luc3RhbmNlLCBlbmRwb2ludCk7CisJLyogVFggZGF0YSBzdGlsbCBleGlzdHMgLSBzZW5kIGl0IG5vdworCSAqLworCWlmKGVuZHBvaW50LT5zZW50IDwgY3VycmVudF91cmItPmFjdHVhbF9sZW5ndGgpeworCQlpZih1ZGNfZW5kcG9pbnRfd3JpdGUgKGVuZHBvaW50KSl7CisJCQkvKiBXcml0ZSBwcmUtZW1wdGVkIGJ5IFJYICovCisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAoYnVmLT5zaXplKSB7CiAJCWNoYXIgKmRlc3Q7CiAKIAkJaW50IHNwYWNlX2F2YWlsOwogCQlpbnQgcG9wbnVtLCBwb3BwZWQ7CiAJCWludCB0b3RhbCA9IDA7CiAKLQkJLyogQnJlYWsgYnVmZmVyIGludG8gdXJiIHNpemVkIHBpZWNlcywgYW5kIGxpbmsgZWFjaCB0byB0aGUgZW5kcG9pbnQgKi8KKwkJLyogQnJlYWsgYnVmZmVyIGludG8gdXJiIHNpemVkIHBpZWNlcywKKwkJICogYW5kIGxpbmsgZWFjaCB0byB0aGUgZW5kcG9pbnQKKwkJICovCiAJCXdoaWxlIChidWYtPnNpemUgPiAwKSB7Ci0JCQljdXJyZW50X3VyYiA9IG5leHRfdXJiIChkZXZpY2VfaW5zdGFuY2UsIGVuZHBvaW50KTsKKwogCQkJaWYgKCFjdXJyZW50X3VyYikgewogCQkJCVRUWUVSUiAoImN1cnJlbnRfdXJiIGlzIE5VTEwsIGJ1Zi0+c2l6ZSAlZFxuIiwKIAkJCQkJYnVmLT5zaXplKTsKIAkJCQlyZXR1cm4gdG90YWw7CiAJCQl9CiAKLQkJCWRlc3QgPSBjdXJyZW50X3VyYi0+YnVmZmVyICsKKwkJCWRlc3QgPSAoY2hhciopY3VycmVudF91cmItPmJ1ZmZlciArCiAJCQkJY3VycmVudF91cmItPmFjdHVhbF9sZW5ndGg7CiAKIAkJCXNwYWNlX2F2YWlsID0KQEAgLTU2MiwxNCArODgxLDE5IEBACiAJCQljdXJyZW50X3VyYi0+YWN0dWFsX2xlbmd0aCArPSBwb3BwZWQ7CiAJCQl0b3RhbCArPSBwb3BwZWQ7CiAKLQkJCS8qIElmIGVuZHBvaW50LT5sYXN0ID09IDAsIHRoZW4gdHJhbnNmZXJzIGhhdmUgbm90IHN0YXJ0ZWQgb24gdGhpcyBlbmRwb2ludCAqLworCQkJLyogSWYgZW5kcG9pbnQtPmxhc3QgPT0gMCwgdGhlbiB0cmFuc2ZlcnMgaGF2ZQorCQkJICogbm90IHN0YXJ0ZWQgb24gdGhpcyBlbmRwb2ludAorCQkJICovCiAJCQlpZiAoZW5kcG9pbnQtPmxhc3QgPT0gMCkgewotCQkJCXVkY19lbmRwb2ludF93cml0ZSAoZW5kcG9pbnQpOworCQkJCWlmKHVkY19lbmRwb2ludF93cml0ZSAoZW5kcG9pbnQpKXsKKwkJCQkJLyogV3JpdGUgcHJlLWVtcHRlZCBieSBSWCAqLworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQogCQkJfQogCi0JCX0JCS8qIGVuZCB3aGlsZSAqLworCQl9LyogZW5kIHdoaWxlICovCiAJCXJldHVybiB0b3RhbDsKLQl9CQkJLyogZW5kIGlmIHR4X3VyYiAqLworCX0KIAogCXJldHVybiAwOwogfQpAQCAtNTc3LDE4ICs5MDEsMjIgQEAKIHN0YXRpYyBpbnQgZmlsbF9idWZmZXIgKGNpcmNidWZfdCAqIGJ1ZikKIHsKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplbmRwb2ludCA9Ci0JCSZlbmRwb2ludF9pbnN0YW5jZVtSRUNWX0VORFBPSU5UXTsKKwkJJmVuZHBvaW50X2luc3RhbmNlW3J4X2VuZHBvaW50XTsKIAogCWlmIChlbmRwb2ludC0+cmN2X3VyYiAmJiBlbmRwb2ludC0+cmN2X3VyYi0+YWN0dWFsX2xlbmd0aCkgewotCQl1bnNpZ25lZCBpbnQgbmIgPSBlbmRwb2ludC0+cmN2X3VyYi0+YWN0dWFsX2xlbmd0aDsKKwkJdW5zaWduZWQgaW50IG5iID0gMDsKIAkJY2hhciAqc3JjID0gKGNoYXIgKikgZW5kcG9pbnQtPnJjdl91cmItPmJ1ZmZlcjsKKwkJdW5zaWduZWQgaW50IHJ4X2F2YWlsID0gYnVmLT50b3RhbHNpemUgLSBidWYtPnNpemU7CiAKLQkJYnVmX3B1c2ggKGJ1Ziwgc3JjLCBuYik7Ci0JCWVuZHBvaW50LT5yY3ZfdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwkJaWYocnhfYXZhaWwgPj0gZW5kcG9pbnQtPnJjdl91cmItPmFjdHVhbF9sZW5ndGgpewogCisJCQluYiA9IGVuZHBvaW50LT5yY3ZfdXJiLT5hY3R1YWxfbGVuZ3RoOworCQkJYnVmX3B1c2ggKGJ1Ziwgc3JjLCBuYik7CisJCQllbmRwb2ludC0+cmN2X3VyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CisKKwkJfQogCQlyZXR1cm4gbmI7CiAJfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU5Nyw3ICs5MjUsNyBAQAogCXJldHVybiB1c2J0dHlfY29uZmlndXJlZF9mbGFnOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQgdXNidHR5X2V2ZW50X2hhbmRsZXIgKHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UsCiAJCQkJICB1c2JfZGV2aWNlX2V2ZW50X3QgZXZlbnQsIGludCBkYXRhKQpAQCAtNjE5LDggKzk0NywzNCBAQAogCX0KIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK2ludCB1c2J0dHlfY2RjX3NldHVwKHN0cnVjdCB1c2JfZGV2aWNlX3JlcXVlc3QgKnJlcXVlc3QsIHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzd2l0Y2ggKHJlcXVlc3QtPmJSZXF1ZXN0KXsKKworCSAgIAljYXNlIEFDTV9TRVRfQ09OVFJPTF9MSU5FX1NUQVRFOgkvKiBJbXBsaWVzIERURSByZWFkeSAqLworCQkJYnJlYWs7CisJICAgCWNhc2UgQUNNX1NFTkRfRU5DQVBTVUxBVEVEX0NPTU1BTkQgOgkvKiBSZXF1aXJlZCAqLworCQkJYnJlYWs7CisJCWNhc2UgQUNNX1NFVF9MSU5FX0VOQ09ESU5HIDoJCS8qIERURSBzdG9wL3Bhcml0eSBiaXRzCisJCQkJCQkJICogcGVyIGNoYXJhY3RlciAqLworCQkJYnJlYWs7CisJICAgCWNhc2UgQUNNX0dFVF9FTkNBUFNVTEFURURfUkVTUE9OU0UgOgkvKiByZXF1ZXN0IHJlc3BvbnNlICovCisJCQlicmVhazsKKwkJY2FzZSBBQ01fR0VUX0xJTkVfRU5DT0RJTkcgOgkJLyogcmVxdWVzdCBEVEUgcmF0ZSwKKwkJCQkJCQkgKiBzdG9wL3Bhcml0eSBiaXRzICovCisJCQltZW1jcHkgKHVyYi0+YnVmZmVyICwgJnJzMjMyX2Rlc2MsIHNpemVvZihyczIzMl9kZXNjKSk7CisJCQl1cmItPmFjdHVhbF9sZW5ndGggPSBzaXplb2YocnMyMzJfZGVzYyk7CisKKwkJCWJyZWFrOworCSAJZGVmYXVsdDoKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKICAqIFNpbmNlIGludGVycnVwdCBoYW5kbGluZyBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkLCB3ZSB1c2UgdGhpcyBmdW5jdGlvbgpAQCAtNjMwLDM2ICs5ODQsMjkgQEAKIHZvaWQgdXNidHR5X3BvbGwgKHZvaWQpCiB7CiAJLyogTmV3IGludGVycnVwdHM/ICovCi0JcHJldGVuZF9pbnRlcnJ1cHRzICgpOworCXVkY19pcnEoKTsKIAotCS8qIFdyaXRlIGFueSBvdXRwdXQgZGF0YSB0byBob3N0IGJ1ZmZlciAoZG8gdGhpcyBiZWZvcmUgY2hlY2tpbmcgaW50ZXJydXB0cyB0byBhdm9pZCBtaXNzaW5nIG9uZSkgKi8KKwkvKiBXcml0ZSBhbnkgb3V0cHV0IGRhdGEgdG8gaG9zdCBidWZmZXIKKwkgKiAoZG8gdGhpcyBiZWZvcmUgY2hlY2tpbmcgaW50ZXJydXB0cyB0byBhdm9pZCBtaXNzaW5nIG9uZSkKKwkgKi8KIAlpZiAodXNidHR5X2NvbmZpZ3VyZWQgKCkpIHsKIAkJd3JpdGVfYnVmZmVyICgmdXNidHR5X291dHB1dCk7CiAJfQogCiAJLyogTmV3IGludGVycnVwdHM/ICovCi0JcHJldGVuZF9pbnRlcnJ1cHRzICgpOworCXVkY19pcnEoKTsKIAotCS8qIENoZWNrIGZvciBuZXcgZGF0YSBmcm9tIGhvc3QuLiAoZG8gdGhpcyBhZnRlciBjaGVja2luZyBpbnRlcnJ1cHRzIHRvIGdldCBsYXRlc3QgZGF0YSkgKi8KKwkvKiBDaGVjayBmb3IgbmV3IGRhdGEgZnJvbSBob3N0Li4KKwkgKiAoZG8gdGhpcyBhZnRlciBjaGVja2luZyBpbnRlcnJ1cHRzIHRvIGdldCBsYXRlc3QgZGF0YSkKKwkgKi8KIAlpZiAodXNidHR5X2NvbmZpZ3VyZWQgKCkpIHsKIAkJZmlsbF9idWZmZXIgKCZ1c2J0dHlfaW5wdXQpOwogCX0KIAogCS8qIE5ldyBpbnRlcnJ1cHRzPyAqLwotCXByZXRlbmRfaW50ZXJydXB0cyAoKTsKKwl1ZGNfaXJxKCk7CisKIH0KIAotc3RhdGljIHZvaWQgcHJldGVuZF9pbnRlcnJ1cHRzICh2b2lkKQotewotCS8qIExvb3Agd2hpbGUgd2UgaGF2ZSBpbnRlcnJ1cHRzLgotCSAqIElmIHdlIGRvbid0IGRvIHRoaXMsIHRoZSBpbnB1dCBjaGFpbgotCSAqIHBvbGxpbmcgZGVsYXkgaXMgbGlrZWx5IHRvIG1pc3MKLQkgKiBob3N0IHJlcXVlc3RzLgotCSAqLwotCXdoaWxlIChpbncgKFVEQ19JUlFfU1JDKSAmIH5VRENfU09GX0ZsZykgewotCQkvKiBIYW5kbGUgYW55IG5ldyBJUlFzICovCi0JCW9tYXAxNTEwX3VkY19pcnEgKCk7Ci0JCW9tYXAxNTEwX3VkY19ub25pc29faXJxICgpOwotCX0KLX0KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYnR0eS5oIGIvZHJpdmVycy91c2J0dHkuaAppbmRleCA3OWMyZmU1Li44MTU0ZTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYnR0eS5oCisrKyBiL2RyaXZlcnMvdXNidHR5LmgKQEAgLTIsNiArMiw5IEBACiAgKiAoQykgQ29weXJpZ2h0IDIwMDMKICAqIEdlcnJ5IEhhbWVsLCBnZWhAdGkuY29tLCBUZXhhcyBJbnN0cnVtZW50cwogICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogQnJ5YW4gTydEb25vZ2h1ZSwgYm9kb25vZ2h1ZUBjb2RlaGVybWl0LmllLCBDb2RlSGVybWl0CisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgpAQCAtMjEsNDQgKzI0LDQ3IEBACiAjaWZuZGVmIF9fVVNCX1RUWV9IX18KICNkZWZpbmUgX19VU0JfVFRZX0hfXwogCi0KICNpbmNsdWRlICJ1c2JkY29yZS5oIgorI2lmIGRlZmluZWQoQ09ORklHX1BQQykKKyNpbmNsdWRlICJ1c2JkY29yZV9tcGM4eHguaCIKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSTSkKICNpbmNsdWRlICJ1c2JkY29yZV9vbWFwMTUxMC5oIgorI2VuZGlmCiAKKyNpbmNsdWRlIDx2ZXJzaW9uX2F1dG9nZW5lcmF0ZWQuaD4KIAotI2RlZmluZSBOVU1fQ09ORklHUyAgICAxCi0jZGVmaW5lIE5VTV9JTlRFUkZBQ0VTIDEKLSNkZWZpbmUgTlVNX0VORFBPSU5UUyAgMworLyogSWYgbm8gVmVuZG9ySUQvUHJvZHVjdElEIGlzIGRlZmluZWQgaW4gY29uZmlnLmgsIHByZXRlbmQgdG8gYmUgTGludXgKKyAqIERPIE5PVCBSZXVzZSB0aGlzIFZlbmRvci9Qcm9kdWN0IHNldHVwIHdpdGggcHJvdG9jb2wgaW5jb21wYXRpYmxlIGRldmljZXMgKi8KIAotI2RlZmluZSBFUDBfTUFYX1BBQ0tFVF9TSVpFIDY0CisjZGVmaW5lIENPTkZJR19VU0JEX1ZFTkRPUklEIDB4MDUyNSAJLyogTGludXgvTmV0Q2hpcCAqLworI2RlZmluZSBDT05GSUdfVVNCRF9QUk9EVUNUSURfR1NFUklBTCAweGE0YTYJLyogZ3NlcmlhbCAqLworI2RlZmluZSBDT05GSUdfVVNCRF9QUk9EVUNUSURfQ0RDQUNNICAweGE0YTcJLyogQ0RDIEFDTSAqLworI2RlZmluZSBDT05GSUdfVVNCRF9NQU5VRkFDVFVSRVIgIkRhcyBVLUJvb3QiCisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RfTkFNRSBVX0JPT1RfVkVSU0lPTgorCiAKICNkZWZpbmUgQ09ORklHX1VTQkRfQ09ORklHVVJBVElPTl9TVFIgIlRUWSB2aWEgVVNCIgotI2RlZmluZSBDT05GSUdfVVNCRF9JTlRFUkZBQ0VfU1RSICAgICAiU2ltcGxlIFNlcmlhbCBEYXRhIEludGVyZmFjZSAtIEJ1bGsgTW9kZSIKIAotCi0jZGVmaW5lIENPTkZJR19VU0JEX1NFUklBTF9PVVRfRU5EUE9JTlQgMgotI2RlZmluZSBDT05GSUdfVVNCRF9TRVJJQUxfT1VUX1BLVFNJWkUJNjQKLSNkZWZpbmUgQ09ORklHX1VTQkRfU0VSSUFMX0lOX0VORFBPSU5UCTEKLSNkZWZpbmUgQ09ORklHX1VTQkRfU0VSSUFMX0lOX1BLVFNJWkUJNjQKLSNkZWZpbmUgQ09ORklHX1VTQkRfU0VSSUFMX0lOVF9FTkRQT0lOVCA1Ci0jZGVmaW5lIENPTkZJR19VU0JEX1NFUklBTF9JTlRfUEtUU0laRQkxNgotCisjZGVmaW5lIENPTkZJR19VU0JEX1NFUklBTF9PVVRfRU5EUE9JTlQgVURDX09VVF9FTkRQT0lOVAorI2RlZmluZSBDT05GSUdfVVNCRF9TRVJJQUxfT1VUX1BLVFNJWkUJVURDX09VVF9QQUNLRVRfU0laRQorI2RlZmluZSBDT05GSUdfVVNCRF9TRVJJQUxfSU5fRU5EUE9JTlQJVURDX0lOX0VORFBPSU5UCisjZGVmaW5lIENPTkZJR19VU0JEX1NFUklBTF9JTl9QS1RTSVpFCVVEQ19JTl9QQUNLRVRfU0laRQorI2RlZmluZSBDT05GSUdfVVNCRF9TRVJJQUxfSU5UX0VORFBPSU5UIFVEQ19JTlRfRU5EUE9JTlQKKyNkZWZpbmUgQ09ORklHX1VTQkRfU0VSSUFMX0lOVF9QS1RTSVpFCVVEQ19JTlRfUEFDS0VUX1NJWkUKKyNkZWZpbmUgQ09ORklHX1VTQkRfU0VSSUFMX0JVTEtfUEtUU0laRQlVRENfQlVMS19QQUNLRVRfU0laRQogCiAjZGVmaW5lIFVTQlRUWV9ERVZJQ0VfQ0xBU1MJQ09NTVVOSUNBVElPTlNfREVWSUNFX0NMQVNTCi0jZGVmaW5lIFVTQlRUWV9ERVZJQ0VfU1VCQ0xBU1MJQ09NTVVOSUNBVElPTlNfTk9fU1VCQ0xBU1MKLSNkZWZpbmUgVVNCVFRZX0RFVklDRV9QUk9UT0NPTAlDT01NVU5JQ0FUSU9OU19OT19QUk9UT0NPTAogCi0jZGVmaW5lIFVTQlRUWV9JTlRFUkZBQ0VfQ0xBU1MJICAgMHhGRiAvKiBWZW5kb3IgU3BlY2lmaWMgKi8KLSNkZWZpbmUgVVNCVFRZX0lOVEVSRkFDRV9TVUJDTEFTUyAgMHgwMgotI2RlZmluZSBVU0JUVFlfSU5URVJGQUNFX1BST1RPQ09MICAweDAxCisjZGVmaW5lIFVTQlRUWV9CQ0RfREVWSUNFIAkweDAwCisjZGVmaW5lIFVTQlRUWV9NQVhQT1dFUgkgIAkweDAwCiAKLSNkZWZpbmUgVVNCVFRZX0JDRF9ERVZJQ0UgMHgwCi0jZGVmaW5lIFVTQlRUWV9NQVhQT1dFUgkgIDB4MAotCi0jZGVmaW5lIFNUUl9NQU5VRkFDVFVSRVIgMQotI2RlZmluZSBTVFJfUFJPRFVDVAkgMgotI2RlZmluZSBTVFJfU0VSSUFMCSAzCi0jZGVmaW5lIFNUUl9DT05GSUcJIDQKLSNkZWZpbmUgU1RSX0lOVEVSRkFDRQkgNQorI2RlZmluZSBTVFJfTEFORwkJMHgwMAorI2RlZmluZSBTVFJfTUFOVUZBQ1RVUkVSCTB4MDEKKyNkZWZpbmUgU1RSX1BST0RVQ1QJCTB4MDIKKyNkZWZpbmUgU1RSX1NFUklBTAkJMHgwMworI2RlZmluZSBTVFJfQ09ORklHCQkweDA0CisjZGVmaW5lIFNUUl9EQVRBX0lOVEVSRkFDRQkweDA1CisjZGVmaW5lIFNUUl9DVFJMX0lOVEVSRkFDRQkweDA2CisjZGVmaW5lIFNUUl9DT1VOVAkJMHgwNwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2NyYW1mcy9jcmFtZnMuYyBiL2ZzL2NyYW1mcy9jcmFtZnMuYwppbmRleCA0OGU3ZjYzLi4zNjlkMWYxIDEwMDY0NAotLS0gYS9mcy9jcmFtZnMvY3JhbWZzLmMKKysrIGIvZnMvY3JhbWZzL2NyYW1mcy5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgpkaWZmIC0tZ2l0IGEvZnMvY3JhbWZzL3VuY29tcHJlc3MuYyBiL2ZzL2NyYW1mcy91bmNvbXByZXNzLmMKaW5kZXggMTcwODMyYS4uMmU5MDZlYiAxMDA2NDQKLS0tIGEvZnMvY3JhbWZzL3VuY29tcHJlc3MuYworKysgYi9mcy9jcmFtZnMvdW5jb21wcmVzcy5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KICNpbmNsdWRlIDx6bGliLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAKIHN0YXRpYyB6X3N0cmVhbSBzdHJlYW07CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvZGV2LmMgYi9mcy9leHQyL2Rldi5jCmluZGV4IDE0NjllOTguLjY0M2ExYTggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvZGV2LmMKKysrIGIvZnMvZXh0Mi9kZXYuYwpAQCAtMjUsNyArMjUsNyBAQAogCiAKICNpbmNsdWRlIDxjb21tb24uaD4KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FWFQyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9FWFQyKQogCiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8ZXh0MmZzLmg+CkBAIC0xMjMsNCArMTIzLDQgQEAKIAl9CiAJcmV0dXJuICgxKTsKIH0KLSNlbmRpZiAvKiBDRkdfQ01EX0VYVDJGUyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9leHQyL2V4dDJmcy5jIGIvZnMvZXh0Mi9leHQyZnMuYwppbmRleCA5Y2YyZmI3Li41MTNhMmY5IDEwMDY0NAotLS0gYS9mcy9leHQyL2V4dDJmcy5jCisrKyBiL2ZzL2V4dDIvZXh0MmZzLmMKQEAgLTI1LDcgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRVhUMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRVhUMikKICNpbmNsdWRlIDxleHQyZnMuaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CkBAIC04NzUsNCArODc1LDQgQEAKIAlyZXR1cm4gKDApOwogfQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9FWFQyRlMgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvZmF0L2ZhdC5jIGIvZnMvZmF0L2ZhdC5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMjFhMDBiOC4uZTk4ZTUwYQotLS0gYS9mcy9mYXQvZmF0LmMKKysrIGIvZnMvZmF0L2ZhdC5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPHBhcnQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZBVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkFUKQogCiAvKgogICogQ29udmVydCBhIHN0cmluZyB0byBsb3dlcmNhc2UuCkBAIC04NSwzOSArODUsNDYgQEAKIAkJLyogbm8gc2lnbmF0dXJlIGZvdW5kICovCiAJCXJldHVybiAtMTsKIAl9Ci0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkJfHwgXAotICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikJfHwgXAotICAgICAoZGVmaW5lZChDT05GSUdfTU1DKSkgfHwgXAotICAgICBkZWZpbmVkKENPTkZJR19TWVNURU1BQ0UpICAgICAgICAgICkKLQkvKiBGaXJzdCB3ZSBhc3N1bWUsIHRoZXJlIGlzIGEgTUJSICovCi0JaWYgKCFnZXRfcGFydGl0aW9uX2luZm8gKGRldl9kZXNjLCBwYXJ0X25vLCAmaW5mbykpIHsKLQkJcGFydF9vZmZzZXQgPSBpbmZvLnN0YXJ0OwotCQljdXJfcGFydCA9IHBhcnRfbm87Ci0JfSBlbHNlIGlmICghc3RybmNtcCgoY2hhciAqKSZidWZmZXJbRE9TX0ZTX1RZUEVfT0ZGU0VUXSwgIkZBVCIsIDMpKSB7CisJaWYoIXN0cm5jbXAoKGNoYXIgKikmYnVmZmVyW0RPU19GU19UWVBFX09GRlNFVF0sIkZBVCIsMykpIHsKIAkJLyogb2ssIHdlIGFzc3VtZSB3ZSBhcmUgb24gYSBQQlIgb25seSAqLwogCQljdXJfcGFydCA9IDE7Ci0JCXBhcnRfb2Zmc2V0ID0gMDsKKwkJcGFydF9vZmZzZXQ9MDsKIAl9IGVsc2UgewotCQlwcmludGYgKCIqKiBQYXJ0aXRpb24gJWQgbm90IHZhbGlkIG9uIGRldmljZSAlZCAqKlxuIiwgcGFydF9ubywgZGV2X2Rlc2MtPmRldik7Ci0JCXJldHVybiAtMTsKLQl9CisjaWYgKGRlZmluZWQoQ09ORklHX0NNRF9JREUpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1VTQikgfHwgXAorICAgICAoZGVmaW5lZChDT05GSUdfTU1DKSAmJiBkZWZpbmVkKENPTkZJR19MUEMyMjkyKSkgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19TWVNURU1BQ0UpICAgICAgICAgICkKKwkJLyogRmlyc3Qgd2UgYXNzdW1lLCB0aGVyZSBpcyBhIE1CUiAqLworCQlpZiAoIWdldF9wYXJ0aXRpb25faW5mbyAoZGV2X2Rlc2MsIHBhcnRfbm8sICZpbmZvKSkgeworCQkJcGFydF9vZmZzZXQgPSBpbmZvLnN0YXJ0OworCQkJY3VyX3BhcnQgPSBwYXJ0X25vOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKChjaGFyICopJmJ1ZmZlcltET1NfRlNfVFlQRV9PRkZTRVRdLCAiRkFUIiwgMykpIHsKKwkJCS8qIG9rLCB3ZSBhc3N1bWUgd2UgYXJlIG9uIGEgUEJSIG9ubHkgKi8KKwkJCWN1cl9wYXJ0ID0gMTsKKwkJCXBhcnRfb2Zmc2V0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZiAoIioqIFBhcnRpdGlvbiAlZCBub3QgdmFsaWQgb24gZGV2aWNlICVkICoqXG4iLAorCQkJCXBhcnRfbm8sIGRldl9kZXNjLT5kZXYpOworCQkJcmV0dXJuIC0xOworCQl9CiAjZWxzZQotCWlmKCFzdHJuY21wKChjaGFyICopJmJ1ZmZlcltET1NfRlNfVFlQRV9PRkZTRVRdLCJGQVQiLDMpKSB7Ci0gCQkvKiBvaywgd2UgYXNzdW1lIHdlIGFyZSBvbiBhIFBCUiBvbmx5ICovCi0gCQljdXJfcGFydCA9IDE7Ci0JCXBhcnRfb2Zmc2V0ID0gMDsKLQkJaW5mby5zdGFydCA9IHBhcnRfb2Zmc2V0OwotCX0gZWxzZSB7Ci0JCS8qIEZJWE1FIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBzdGFydCBibG9jayBvZiB0aGUKLQkJICogcGFydGl0aW9uIHdoZXJlIHRoZSBET1MgRlMgcmVzaWRlcy4gVGhpcyBjYW4gYmUgZG9uZQotCQkgKiBieSB1c2luZyB0aGUgZ2V0X3BhcnRpdGlvbl9pbmZvIHJvdXRpbmUuIEZvciB0aGlzCi0JCSAqIHB1cnBvc2UgdGhlIGxpYnBhcnQgbXVzdCBiZSBpbmNsdWRlZC4KLQkJICovCi0JCXBhcnRfb2Zmc2V0ID0gMzI7Ci0JCWN1cl9wYXJ0ID0gMTsKLQl9CisJCWlmKCFzdHJuY21wKChjaGFyICopJmJ1ZmZlcltET1NfRlNfVFlQRV9PRkZTRVRdLCJGQVQiLDMpKSB7CisJCQkvKiBvaywgd2UgYXNzdW1lIHdlIGFyZSBvbiBhIFBCUiBvbmx5ICovCisJCQljdXJfcGFydCA9IDE7CisJCQlwYXJ0X29mZnNldCA9IDA7CisJCQlpbmZvLnN0YXJ0ID0gcGFydF9vZmZzZXQ7CisJCX0gZWxzZSB7CisJCQkvKiBGSVhNRSB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGUgc3RhcnQgYmxvY2sgb2YgdGhlCisJCQkgKiBwYXJ0aXRpb24gd2hlcmUgdGhlIERPUyBGUyByZXNpZGVzLiBUaGlzIGNhbiBiZSBkb25lCisJCQkgKiBieSB1c2luZyB0aGUgZ2V0X3BhcnRpdGlvbl9pbmZvIHJvdXRpbmUuIEZvciB0aGlzCisJCQkgKiBwdXJwb3NlIHRoZSBsaWJwYXJ0IG11c3QgYmUgaW5jbHVkZWQuCisJCQkgKi8KKwkJCXBhcnRfb2Zmc2V0ID0gMzI7CisJCQljdXJfcGFydCA9IDE7CisJCX0KICNlbmRpZgorCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtOTc5LDggKzk4NiwxMCBAQAogCQlwcmludGYoIk5vIGN1cnJlbnQgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkgfHwgXAotICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikgfHwgKENPTkZJR19NTUMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NNRF9TQ1NJKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ01EX1VTQikgfHwgXAorICAgIChDT05GSUdfTU1DKQogCXByaW50ZigiSW50ZXJmYWNlOiAgIik7CiAJc3dpdGNoKGN1cl9kZXYtPmlmX3R5cGUpIHsKIAkJY2FzZSBJRl9UWVBFX0lERSA6CXByaW50ZigiSURFIik7IGJyZWFrOwpAQCAtMTAyMSw0ICsxMDMwLDQgQEAKIAlyZXR1cm4gZG9fZmF0X3JlYWQoZmlsZW5hbWUsIGJ1ZmZlciwgbWF4c2l6ZSwgTFNfTk8pOwogfQogCi0jZW5kaWYgLyogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZBVCkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvZmF0L2ZpbGUuYyBiL2ZzL2ZhdC9maWxlLmMKaW5kZXggZjk5OWFjNS4uNTE0ZGJhZSAxMDA2NDQKLS0tIGEvZnMvZmF0L2ZpbGUuYworKysgYi9mcy9mYXQvZmlsZS5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZBVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkFUKQogCiAvKiBTdXBwb3J0ZWQgZmlsZXN5c3RlbXMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZXN5c3RlbSBmaWxlc3lzdGVtc1tdID0gewpAQCAtMjA1LDQgKzIwNSw0IEBACiAJcmV0dXJuIGZpbGVzeXN0ZW1zW2N1cnJlbnRfZmlsZXN5c3RlbV0ucmVhZChhcmcsIGJ1ZmZlciwgbWF4c2l6ZSk7CiB9CiAKLSNlbmRpZiAvKiAjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkFUKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9mZG9zL2Rldi5jIGIvZnMvZmRvcy9kZXYuYwppbmRleCA1ZGVhNWNkLi4yNzFkMGU3IDEwMDY0NAotLS0gYS9mcy9mZG9zL2Rldi5jCisrKyBiL2ZzL2Zkb3MvZGV2LmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlICJkb3MuaCIKICNpbmNsdWRlICJmZG9zLmgiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GRE9TKQogCiAjZGVmaW5lIE5CX0hFQURTICAgICAgICAyCiAjZGVmaW5lIE5CX1RSQUNLUyAgICAgICA4MApkaWZmIC0tZ2l0IGEvZnMvZmRvcy9mYXQuYyBiL2ZzL2Zkb3MvZmF0LmMKaW5kZXggMmVmMjM3MS4uMmUyZDJiOCAxMDA2NDQKLS0tIGEvZnMvZmRvcy9mYXQuYworKysgYi9mcy9mZG9zL2ZhdC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GRE9TKQogCiAjaW5jbHVkZSAiZG9zLmgiCiAjaW5jbHVkZSAiZmRvcy5oIgpkaWZmIC0tZ2l0IGEvZnMvZmRvcy9mZG9zLmMgYi9mcy9mZG9zL2Zkb3MuYwppbmRleCBhMjlmNDNkLi41YmU2YTk2IDEwMDY0NAotLS0gYS9mcy9mZG9zL2Zkb3MuYworKysgYi9mcy9mZG9zL2Zkb3MuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbmZpZy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkRPUykKICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlICJkb3MuaCIKICNpbmNsdWRlICJmZG9zLmgiCmRpZmYgLS1naXQgYS9mcy9mZG9zL2ZzLmMgYi9mcy9mZG9zL2ZzLmMKaW5kZXggM2I5ZDA5ZS4uYWRlZDY3MCAxMDA2NDQKLS0tIGEvZnMvZmRvcy9mcy5jCisrKyBiL2ZzL2Zkb3MvZnMuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkRPUykKIAogI2luY2x1ZGUgImRvcy5oIgogI2luY2x1ZGUgImZkb3MuaCIKZGlmZiAtLWdpdCBhL2ZzL2Zkb3Mvc3ViZGlyLmMgYi9mcy9mZG9zL3N1YmRpci5jCmluZGV4IDk3YjI1MDQuLjQ5N2Y1NTQgMTAwNjQ0Ci0tLSBhL2ZzL2Zkb3Mvc3ViZGlyLmMKKysrIGIvZnMvZmRvcy9zdWJkaXIuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkRPUykKIAogI2luY2x1ZGUgImRvcy5oIgogI2luY2x1ZGUgImZkb3MuaCIKZGlmZiAtLWdpdCBhL2ZzL2Zkb3MvdmZhdC5jIGIvZnMvZmRvcy92ZmF0LmMKaW5kZXggNDZhNDY0Yi4uMGU3ODgzYiAxMDA2NDQKLS0tIGEvZnMvZmRvcy92ZmF0LmMKKysrIGIvZnMvZmRvcy92ZmF0LmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb25maWcuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZET1MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZET1MpCiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KIAogI2luY2x1ZGUgImRvcy5oIgpkaWZmIC0tZ2l0IGEvZnMvamZmczIvY29tcHJfbHphcmkuYyBiL2ZzL2pmZnMyL2NvbXByX2x6YXJpLmMKaW5kZXggODI4YjZlNS4uZjY0YmM3NCAxMDA2NDQKLS0tIGEvZnMvamZmczIvY29tcHJfbHphcmkuYworKysgYi9mcy9qZmZzMi9jb21wcl9semFyaS5jCkBAIC01MCw3ICs1MCw3IEBACiAKIAogI2luY2x1ZGUgPGNvbmZpZy5oPgotI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfTFpPX0xaQVJJKSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0xaT19MWkFSSSkKIAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGpmZnMyL2pmZnMyLmg+CkBAIC0yNTksNCArMjU5LDQgQEAKIHsKICAgICByZXR1cm4gRGVjb2RlKGRhdGFfaW4sIGNwYWdlX291dCwgc3JjbGVuLCBkZXN0bGVuKTsKIH0KLSNlbmRpZiAvKiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0xaT19MWkFSSSkpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByX2x6by5jIGIvZnMvamZmczIvY29tcHJfbHpvLmMKaW5kZXggYjZjNTkwYS4uYTMyYjk5MyAxMDA2NDQKLS0tIGEvZnMvamZmczIvY29tcHJfbHpvLmMKKysrIGIvZnMvamZmczIvY29tcHJfbHpvLmMKQEAgLTY3LDcgKzY3LDcgQEAKIAogCiAjaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9MWk9fTFpBUkkpKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfTFpPX0xaQVJJKQogCiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8amZmczIvamZmczIuaD4KQEAgLTQwMiw0ICs0MDIsNCBAQAogCXJldHVybiBsem8xeF9kZWNvbXByZXNzIChkYXRhX2luLCBzcmNsZW4sIGNwYWdlX291dCwgJm91dGxlbiwgTlVMTCk7CiB9CiAKLSNlbmRpZiAvKiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0xaT19MWkFSSSkpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByX3J0aW1lLmMgYi9mcy9qZmZzMi9jb21wcl9ydGltZS5jCmluZGV4IDliYjRmMWIuLjE0NDI2M2MgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2NvbXByX3J0aW1lLmMKKysrIGIvZnMvamZmczIvY29tcHJfcnRpbWUuYwpAQCAtNDYsNyArNDYsNyBAQAogICovCiAKICNpbmNsdWRlIDxjb25maWcuaD4KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAKICNpbmNsdWRlIDxqZmZzMi9qZmZzMi5oPgogCkBAIC04OCw0ICs4OCw0IEBACiAJfQogfQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9KRkZTMiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9jb21wcl9ydWJpbi5jIGIvZnMvamZmczIvY29tcHJfcnViaW4uYwppbmRleCA3NDU3N2Q5Li5mNmYzZmExIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9jb21wcl9ydWJpbi5jCisrKyBiL2ZzL2pmZnMyL2NvbXByX3J1YmluLmMKQEAgLTM5LDcgKzM5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKQogCiAjaW5jbHVkZSA8amZmczIvamZmczIuaD4KICNpbmNsdWRlIDxqZmZzMi9jb21wcl9ydWJpbi5oPgpAQCAtMTIzLDQgKzEyMyw0IEBACiAJcnViaW5fZG9fZGVjb21wcmVzcyhiaXRzLCBkYXRhX2luKzgsIGNwYWdlX291dCwgZHN0bGVuKTsKIH0KIAotI2VuZGlmIC8qIENGR19DTURfSkZGUzIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvamZmczIvY29tcHJfemxpYi5jIGIvZnMvamZmczIvY29tcHJfemxpYi5jCmluZGV4IGQ4OGQwZjguLjI5ZGZlMWIgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2NvbXByX3psaWIuYworKysgYi9mcy9qZmZzMi9jb21wcl96bGliLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbmZpZy5oPgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikKIAogI2luY2x1ZGUgPGpmZnMyL2pmZnMyLmg+CiAjaW5jbHVkZSA8amZmczIvbWluaV9pbmZsYXRlLmg+CkBAIC00OSw0ICs0OSw0IEBACiAKIH0KIAotI2VuZGlmIC8qIENGR19DTURfSkZGUzIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvamZmczIvamZmczJfMXBhc3MuYyBiL2ZzL2pmZnMyL2pmZnMyXzFwYXNzLmMKaW5kZXggNDFmZjRjMS4uNTMxNjY2OCAxMDA2NDQKLS0tIGEvZnMvamZmczIvamZmczJfMXBhc3MuYworKysgYi9mcy9qZmZzMi9qZmZzMl8xcGFzcy5jCkBAIC0xMTcsNyArMTE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKQogCiAjaW5jbHVkZSA8amZmczIvamZmczIuaD4KICNpbmNsdWRlIDxqZmZzMi9qZmZzMl8xcGFzcy5oPgpAQCAtMTQzLDcgKzE0Myw4IEBACiAvKiBrZWVwcyBwb2ludGVyIHRvIGN1cnJlbnRsdSBwcm9jZXNzZWQgcGFydGl0aW9uICovCiBzdGF0aWMgc3RydWN0IHBhcnRfaW5mbyAqY3VycmVudF9wYXJ0OwogCi0jaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiAoZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgXAorICAgICBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgKQogI2lmIGRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogI2Vsc2UKQEAgLTI3NCwxMCArMjc1LDEwIEBACiB7CiAJZnJlZShidWYpOwogfQotI2VuZGlmIC8qICNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAqLworI2VuZGlmCiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZMQVNIKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GTEFTSCkKIC8qCiAgKiBTdXBwb3J0IGZvciBqZmZzMiBvbiB0b3Agb2YgTk9SLWZsYXNoCiAgKgpAQCAtMzAwLDcgKzMwMSw3IEBACiB7CiAJcmV0dXJuICh2b2lkKilnZXRfZmxfbWVtX25vcihvZmYpOwogfQotI2VuZGlmIC8qICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GTEFTSCkgKi8KKyNlbmRpZgogCiAKIC8qCkBAIC0zMTEsMTIgKzMxMiwxMiBAQAogewogCXN0cnVjdCBtdGRpZHMgKmlkID0gY3VycmVudF9wYXJ0LT5kZXYtPmlkOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkxBU0gpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZMQVNIKQogCWlmIChpZC0+dHlwZSA9PSBNVERfREVWX1RZUEVfTk9SKQogCQlyZXR1cm4gZ2V0X2ZsX21lbV9ub3Iob2ZmKTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAlpZiAoaWQtPnR5cGUgPT0gTVREX0RFVl9UWVBFX05BTkQpCiAJCXJldHVybiBnZXRfZmxfbWVtX25hbmQob2ZmLCBzaXplLCBleHRfYnVmKTsKICNlbmRpZgpAQCAtMzI5LDEyICszMzAsMTMgQEAKIHsKIAlzdHJ1Y3QgbXRkaWRzICppZCA9IGN1cnJlbnRfcGFydC0+ZGV2LT5pZDsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZMQVNIKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GTEFTSCkKIAlpZiAoaWQtPnR5cGUgPT0gTVREX0RFVl9UWVBFX05PUikKIAkJcmV0dXJuIGdldF9ub2RlX21lbV9ub3Iob2ZmKTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiBcCisgICAgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAJaWYgKGlkLT50eXBlID09IE1URF9ERVZfVFlQRV9OQU5EKQogCQlyZXR1cm4gZ2V0X25vZGVfbWVtX25hbmQob2ZmKTsKICNlbmRpZgpAQCAtMzQ1LDcgKzM0Nyw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfZmxfbWVtKHZvaWQgKmJ1ZikKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0pGRlMyX05BTkQpICYmIFwKKyAgICBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAlzdHJ1Y3QgbXRkaWRzICppZCA9IGN1cnJlbnRfcGFydC0+ZGV2LT5pZDsKIAogCWlmIChpZC0+dHlwZSA9PSBNVERfREVWX1RZUEVfTkFORCkKQEAgLTEzOTQsNCArMTM5Nyw0IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0pGRlMyICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2pmZnMyX25hbmRfMXBhc3MuYyBiL2ZzL2pmZnMyL2pmZnMyX25hbmRfMXBhc3MuYwppbmRleCBlNzhhZjc1Li4zYTRjNjQ5IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9qZmZzMl9uYW5kXzFwYXNzLmMKKysrIGIvZnMvamZmczIvamZmczJfbmFuZF8xcGFzcy5jCkBAIC0xLDYgKzEsNiBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpICYmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikKIAogI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KQEAgLTEwMzMsNCArMTAzMyw0IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0pGRlMyICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL21pbmlfaW5mbGF0ZS5jIGIvZnMvamZmczIvbWluaV9pbmZsYXRlLmMKaW5kZXggNGY1MTFlYy4uNGM1MGZjMyAxMDA2NDQKLS0tIGEvZnMvamZmczIvbWluaV9pbmZsYXRlLmMKKysrIGIvZnMvamZmczIvbWluaV9pbmZsYXRlLmMKQEAgLTI1LDcgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGNvbmZpZy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKQogCiAjaW5jbHVkZSA8amZmczIvbWluaV9pbmZsYXRlLmg+CiAKQEAgLTM5Myw0ICszOTMsNCBAQAogCXJldHVybiBzdHJlYW0uZXJyb3IgPyAtc3RyZWFtLmVycm9yIDogc3RyZWFtLmRlY29kZWQ7CiB9CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0pGRlMyICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2Rldi5jIGIvZnMvcmVpc2VyZnMvZGV2LmMKaW5kZXggNmY2MDU2Zi4uNmIzNmMwNiAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvZGV2LmMKKysrIGIvZnMvcmVpc2VyZnMvZGV2LmMKQEAgLTE5LDcgKzE5LDcgQEAKIAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUkVJU0VSKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9SRUlTRVIpCiAKICNpbmNsdWRlIDxjb25maWcuaD4KICNpbmNsdWRlIDxyZWlzZXJmcy5oPgpAQCAtMTIwLDQgKzEyMCw0IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNlbmRpZiAvKiBDRkdfQ01EX1JFSVNFUkZTICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL21vZGVfc3RyaW5nLmMgYi9mcy9yZWlzZXJmcy9tb2RlX3N0cmluZy5jCmluZGV4IGJjNTY1ZmIuLmFlOTg4MzQgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL21vZGVfc3RyaW5nLmMKKysrIGIvZnMvcmVpc2VyZnMvbW9kZV9zdHJpbmcuYwpAQCAtMjYsNyArMjYsNyBAQAogCiAKICNpbmNsdWRlIDxjb21tb24uaD4KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9SRUlTRVIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1JFSVNFUikKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAKICNpZiAoIFNfSVNVSUQgIT0gMDQwMDAgKSB8fCAoIFNfSVNHSUQgIT0gMDIwMDAgKSB8fCAoIFNfSVNWVFggIT0gMDEwMDAgKSBcCkBAIC0xMzksNCArMTM5LDQgQEAKIAogI2VuZGlmCiAKLSNlbmRpZiAvKiBDRkdfQ01EX1JFSVNFUiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9yZWlzZXJmcy5jIGIvZnMvcmVpc2VyZnMvcmVpc2VyZnMuYwppbmRleCAzMWMyNWViLi5hYTk2MzYxIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9yZWlzZXJmcy5jCisrKyBiL2ZzL3JlaXNlcmZzL3JlaXNlcmZzLmMKQEAgLTI5LDcgKzI5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUkVJU0VSKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9SRUlTRVIpCiAKICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgpAQCAtOTgzLDQgKzk4Myw0IEBACiAJcmV0dXJuIGZpbGVtYXg7CiB9CiAKLSNlbmRpZiAvKiBDRkdfQ01EX1JFSVNFUiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL19leHBvcnRzLmggYi9pbmNsdWRlL19leHBvcnRzLmgKaW5kZXggMmI4ZWMzZC4uYWY0Mzg4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9fZXhwb3J0cy5oCisrKyBiL2luY2x1ZGUvX2V4cG9ydHMuaApAQCAtMTQsOCArMTQsMTMgQEAKIEVYUE9SVF9GVU5DKGRvX3Jlc2V0KQogRVhQT1JUX0ZVTkMoZ2V0ZW52KQogRVhQT1JUX0ZVTkMoc2V0ZW52KQorI2lmZGVmIENPTkZJR19IQVNfVUlECitFWFBPUlRfRlVOQyhmb3JjZWVudikKKyNlbmRpZgogRVhQT1JUX0ZVTkMoc2ltcGxlX3N0cnRvdWwpCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKQorRVhQT1JUX0ZVTkMoc2ltcGxlX3N0cnRvbCkKK0VYUE9SVF9GVU5DKHN0cmNtcCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogRVhQT1JUX0ZVTkMoaTJjX3dyaXRlKQogRVhQT1JUX0ZVTkMoaTJjX3JlYWQpCi0jZW5kaWYJLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9lbWFjX2RlZnMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWRhdmluY2kvZW1hY19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxMDExNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWRhdmluY2kvZW1hY19kZWZzLmgKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogQmFzZWQgb246CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGRtNjQ0eF9lbWFjLmgKKyAqCisgKiBUSSBEYVZpbmNpIChETTY0NFgpIEVNQUMgcGVyaXBoZXJhbCBkcml2ZXIgaGVhZGVyIGZvciBEVi1FVk0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBNb2RpZmljYXRpb25zOgorICogdmVyLiAxLjA6IFNlcCAyMDA1LCBUSSBQU1AgVGVhbSAtIENyZWF0ZWQgRU1BQyB2ZXJzaW9uIGZvciB1Qm9vdC4KKyAqCisgKi8KKworI2lmbmRlZiBfRE02NDRYX0VNQUNfSF8KKyNkZWZpbmUgX0RNNjQ0WF9FTUFDX0hfCisKKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorCisjZGVmaW5lIEVNQUNfQkFTRV9BRERSCQkJKDB4MDFjODAwMDApCisjZGVmaW5lIEVNQUNfV1JBUFBFUl9CQVNFX0FERFIJCSgweDAxYzgxMDAwKQorI2RlZmluZSBFTUFDX1dSQVBQRVJfUkFNX0FERFIJCSgweDAxYzgyMDAwKQorI2RlZmluZSBFTUFDX01ESU9fQkFTRV9BRERSCQkoMHgwMWM4NDAwMCkKKworLyogTURJTyBtb2R1bGUgaW5wdXQgZnJlcXVlbmN5ICovCisjZGVmaW5lIEVNQUNfTURJT19CVVNfRlJFUQkJOTkwMDAwMDAJLyogUExMLzYgLSA5OSBNSHogKi8KKy8qIE1ESU8gY2xvY2sgb3V0cHV0IGZyZXF1ZW5jeSAqLworI2RlZmluZSBFTUFDX01ESU9fQ0xPQ0tfRlJFUQkJMjAwMDAwMAkJLyogMi4wIE1IeiAqLworCisvKiBFdGhlcm5ldCBNaW4vTWF4IHBhY2tldCBzaXplICovCisjZGVmaW5lIEVNQUNfTUlOX0VUSEVSTkVUX1BLVF9TSVpFCTYwCisjZGVmaW5lIEVNQUNfTUFYX0VUSEVSTkVUX1BLVF9TSVpFCTE1MTgKKyNkZWZpbmUgRU1BQ19QS1RfQUxJR04JCQkxOAkvKiAxNTE4ICsgMTggPSAxNTM2IChwYWNrZXQgYWxpZ25lZCBvbiAzMiBieXRlIGJvdW5kcnkpICovCisKKy8qIE51bWJlciBvZiBSWCBwYWNrZXQgYnVmZmVycworICogTk9URTogT25seSAxIGJ1ZmZlciBzdXBwb3J0ZWQgYXMgb2Ygbm93CisgKi8KKyNkZWZpbmUgRU1BQ19NQVhfUlhfQlVGRkVSUwkJMTAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKiBJbnRlcm5hbGx5IHVzZWQgbWFjcm9zICoqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVNQUNfQ0hfVFgJCQkxCisjZGVmaW5lIEVNQUNfQ0hfUlgJCQkwCisKKy8qIEVhY2ggZGVzY3JpcHRvciBvY2N1cGllcyA0IHdvcmRzLCBsZXRzIHN0YXJ0IFJYIGRlc2MncyBhdCAwIGFuZAorICogcmVzZXJ2ZSBzcGFjZSBmb3IgNjQgZGVzY3JpcHRvcnMgbWF4CisgKi8KKyNkZWZpbmUgRU1BQ19SWF9ERVNDX0JBU0UJCTB4MAorI2RlZmluZSBFTUFDX1RYX0RFU0NfQkFTRQkJMHgxMDAwCisKKy8qIEVNQUMgVGVhcmRvd24gdmFsdWUgKi8KKyNkZWZpbmUgRU1BQ19URUFSRE9XTl9WQUxVRQkJMHhmZmZmZmZmYworCisvKiBNSUkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9TVEFUVVNfUkVHCQkJMQorCisvKiBOdW1iZXIgb2Ygc3RhdGlzdGljcyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRU1BQ19OVU1fU1RBVFMJCQkzNgorCisKKy8qIEVNQUMgRGVzY3JpcHRvciAqLwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgX2VtYWNfZGVzYworeworCXVfaW50MzJfdAluZXh0OwkJLyogUG9pbnRlciB0byBuZXh0IGRlc2NyaXB0b3IgaW4gY2hhaW4gKi8KKwl1X2ludDhfdAkqYnVmZmVyOwkvKiBQb2ludGVyIHRvIGRhdGEgYnVmZmVyICovCisJdV9pbnQzMl90CWJ1ZmZfb2ZmX2xlbjsJLyogQnVmZmVyIE9mZnNldChNU1cpIGFuZCBMZW5ndGgoTFNXKSAqLworCXVfaW50MzJfdAlwa3RfZmxhZ19sZW47CS8qIFBhY2tldCBGbGFncyhNU1cpIGFuZCBMZW5ndGgoTFNXKSAqLworfSBlbWFjX2Rlc2M7CisKKy8qIENQUEkgYml0IHBvc2l0aW9ucyAqLworI2RlZmluZSBFTUFDX0NQUElfU09QX0JJVAkJKDB4ODAwMDAwMDApCisjZGVmaW5lIEVNQUNfQ1BQSV9FT1BfQklUCQkoMHg0MDAwMDAwMCkKKyNkZWZpbmUgRU1BQ19DUFBJX09XTkVSU0hJUF9CSVQJCSgweDIwMDAwMDAwKQorI2RlZmluZSBFTUFDX0NQUElfRU9RX0JJVAkJKDB4MTAwMDAwMDApCisjZGVmaW5lIEVNQUNfQ1BQSV9URUFSRE9XTl9DT01QTEVURV9CSVQJKDB4MDgwMDAwMDApCisjZGVmaW5lIEVNQUNfQ1BQSV9QQVNTX0NSQ19CSVQJCSgweDA0MDAwMDAwKQorCisjZGVmaW5lIEVNQUNfQ1BQSV9SWF9FUlJPUl9GUkFNRQkoMHgwM2ZjMDAwMCkKKworI2RlZmluZSBFTUFDX01BQ0NPTlRST0xfTUlJRU5fRU5BQkxFCQkoMHgyMCkKKyNkZWZpbmUgRU1BQ19NQUNDT05UUk9MX0ZVTExEVVBMRVhfRU5BQkxFCSgweDEpCisKKyNkZWZpbmUgRU1BQ19SWE1CUEVOQUJMRV9SWENBRkVOX0VOQUJMRQkoMHgyMDAwMDApCisjZGVmaW5lIEVNQUNfUlhNQlBFTkFCTEVfUlhCUk9BREVOCSgweDIwMDApCisKKworI2RlZmluZSBNRElPX0NPTlRST0xfSURMRQkJKDB4ODAwMDAwMDApCisjZGVmaW5lIE1ESU9fQ09OVFJPTF9FTkFCTEUJCSgweDQwMDAwMDAwKQorI2RlZmluZSBNRElPX0NPTlRST0xfRkFVTFRfRU5BQkxFCSgweDQwMDAwKQorI2RlZmluZSBNRElPX0NPTlRST0xfRkFVTFQJCSgweDgwMDAwKQorI2RlZmluZSBNRElPX1VTRVJBQ0NFU1MwX0dPCQkoMHg4MDAwMDAwMCkKKyNkZWZpbmUgTURJT19VU0VSQUNDRVNTMF9XUklURV9SRUFECSgweDApCisjZGVmaW5lIE1ESU9fVVNFUkFDQ0VTUzBfV1JJVEVfV1JJVEUJKDB4NDAwMDAwMDApCisjZGVmaW5lIE1ESU9fVVNFUkFDQ0VTUzBfQUNLCQkoMHgyMDAwMDAwMCkKKworLyogRXRoZXJuZXQgTUFDIFJlZ2lzdGVycyBTdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0ICB7CisJZHZfcmVnCQlUWElEVkVSOworCWR2X3JlZwkJVFhDT05UUk9MOworCWR2X3JlZwkJVFhURUFSRE9XTjsKKwl1X2ludDhfdAlSU1ZEMFs0XTsKKwlkdl9yZWcJCVJYSURWRVI7CisJZHZfcmVnCQlSWENPTlRST0w7CisJZHZfcmVnCQlSWFRFQVJET1dOOworCXVfaW50OF90CVJTVkQxWzEwMF07CisJZHZfcmVnCQlUWElOVFNUQVRSQVc7CisJZHZfcmVnCQlUWElOVFNUQVRNQVNLRUQ7CisJZHZfcmVnCQlUWElOVE1BU0tTRVQ7CisJZHZfcmVnCQlUWElOVE1BU0tDTEVBUjsKKwlkdl9yZWcJCU1BQ0lOVkVDVE9SOworCXVfaW50OF90CVJTVkQyWzEyXTsKKwlkdl9yZWcJCVJYSU5UU1RBVFJBVzsKKwlkdl9yZWcJCVJYSU5UU1RBVE1BU0tFRDsKKwlkdl9yZWcJCVJYSU5UTUFTS1NFVDsKKwlkdl9yZWcJCVJYSU5UTUFTS0NMRUFSOworCWR2X3JlZwkJTUFDSU5UU1RBVFJBVzsKKwlkdl9yZWcJCU1BQ0lOVFNUQVRNQVNLRUQ7CisJZHZfcmVnCQlNQUNJTlRNQVNLU0VUOworCWR2X3JlZwkJTUFDSU5UTUFTS0NMRUFSOworCXVfaW50OF90CVJTVkQzWzY0XTsKKwlkdl9yZWcJCVJYTUJQRU5BQkxFOworCWR2X3JlZwkJUlhVTklDQVNUU0VUOworCWR2X3JlZwkJUlhVTklDQVNUQ0xFQVI7CisJZHZfcmVnCQlSWE1BWExFTjsKKwlkdl9yZWcJCVJYQlVGRkVST0ZGU0VUOworCWR2X3JlZwkJUlhGSUxURVJMT1dUSFJFU0g7CisJdV9pbnQ4X3QJUlNWRDRbOF07CisJZHZfcmVnCQlSWDBGTE9XVEhSRVNIOworCWR2X3JlZwkJUlgxRkxPV1RIUkVTSDsKKwlkdl9yZWcJCVJYMkZMT1dUSFJFU0g7CisJZHZfcmVnCQlSWDNGTE9XVEhSRVNIOworCWR2X3JlZwkJUlg0RkxPV1RIUkVTSDsKKwlkdl9yZWcJCVJYNUZMT1dUSFJFU0g7CisJZHZfcmVnCQlSWDZGTE9XVEhSRVNIOworCWR2X3JlZwkJUlg3RkxPV1RIUkVTSDsKKwlkdl9yZWcJCVJYMEZSRUVCVUZGRVI7CisJZHZfcmVnCQlSWDFGUkVFQlVGRkVSOworCWR2X3JlZwkJUlgyRlJFRUJVRkZFUjsKKwlkdl9yZWcJCVJYM0ZSRUVCVUZGRVI7CisJZHZfcmVnCQlSWDRGUkVFQlVGRkVSOworCWR2X3JlZwkJUlg1RlJFRUJVRkZFUjsKKwlkdl9yZWcJCVJYNkZSRUVCVUZGRVI7CisJZHZfcmVnCQlSWDdGUkVFQlVGRkVSOworCWR2X3JlZwkJTUFDQ09OVFJPTDsKKwlkdl9yZWcJCU1BQ1NUQVRVUzsKKwlkdl9yZWcJCUVNQ09OVFJPTDsKKwlkdl9yZWcJCUZJRk9DT05UUk9MOworCWR2X3JlZwkJTUFDQ09ORklHOworCWR2X3JlZwkJU09GVFJFU0VUOworCXVfaW50OF90CVJTVkQ1Wzg4XTsKKwlkdl9yZWcJCU1BQ1NSQ0FERFJMTzsKKwlkdl9yZWcJCU1BQ1NSQ0FERFJISTsKKwlkdl9yZWcJCU1BQ0hBU0gxOworCWR2X3JlZwkJTUFDSEFTSDI7CisJZHZfcmVnCQlCT0ZGVEVTVDsKKwlkdl9yZWcJCVRQQUNFVEVTVDsKKwlkdl9yZWcJCVJYUEFVU0U7CisJZHZfcmVnCQlUWFBBVVNFOworCXVfaW50OF90CVJTVkQ2WzE2XTsKKwlkdl9yZWcJCVJYR09PREZSQU1FUzsKKwlkdl9yZWcJCVJYQkNBU1RGUkFNRVM7CisJZHZfcmVnCQlSWE1DQVNURlJBTUVTOworCWR2X3JlZwkJUlhQQVVTRUZSQU1FUzsKKwlkdl9yZWcJCVJYQ1JDRVJST1JTOworCWR2X3JlZwkJUlhBTElHTkNPREVFUlJPUlM7CisJZHZfcmVnCQlSWE9WRVJTSVpFRDsKKwlkdl9yZWcJCVJYSkFCQkVSOworCWR2X3JlZwkJUlhVTkRFUlNJWkVEOworCWR2X3JlZwkJUlhGUkFHTUVOVFM7CisJZHZfcmVnCQlSWEZJTFRFUkVEOworCWR2X3JlZwkJUlhRT1NGSUxURVJFRDsKKwlkdl9yZWcJCVJYT0NURVRTOworCWR2X3JlZwkJVFhHT09ERlJBTUVTOworCWR2X3JlZwkJVFhCQ0FTVEZSQU1FUzsKKwlkdl9yZWcJCVRYTUNBU1RGUkFNRVM7CisJZHZfcmVnCQlUWFBBVVNFRlJBTUVTOworCWR2X3JlZwkJVFhERUZFUlJFRDsKKwlkdl9yZWcJCVRYQ09MTElTSU9OOworCWR2X3JlZwkJVFhTSU5HTEVDT0xMOworCWR2X3JlZwkJVFhNVUxUSUNPTEw7CisJZHZfcmVnCQlUWEVYQ0VTU0lWRUNPTEw7CisJZHZfcmVnCQlUWExBVEVDT0xMOworCWR2X3JlZwkJVFhVTkRFUlJVTjsKKwlkdl9yZWcJCVRYQ0FSUklFUlNFTlNFOworCWR2X3JlZwkJVFhPQ1RFVFM7CisJZHZfcmVnCQlGUkFNRTY0OworCWR2X3JlZwkJRlJBTUU2NVQxMjc7CisJZHZfcmVnCQlGUkFNRTEyOFQyNTU7CisJZHZfcmVnCQlGUkFNRTI1NlQ1MTE7CisJZHZfcmVnCQlGUkFNRTUxMlQxMDIzOworCWR2X3JlZwkJRlJBTUUxMDI0VFVQOworCWR2X3JlZwkJTkVUT0NURVRTOworCWR2X3JlZwkJUlhTT0ZPVkVSUlVOUzsKKwlkdl9yZWcJCVJYTU9GT1ZFUlJVTlM7CisJZHZfcmVnCQlSWERNQU9WRVJSVU5TOworCXVfaW50OF90CVJTVkQ3WzYyNF07CisJZHZfcmVnCQlNQUNBRERSTE87CisJZHZfcmVnCQlNQUNBRERSSEk7CisJZHZfcmVnCQlNQUNJTkRFWDsKKwl1X2ludDhfdAlSU1ZEOFsyNDRdOworCWR2X3JlZwkJVFgwSERQOworCWR2X3JlZwkJVFgxSERQOworCWR2X3JlZwkJVFgySERQOworCWR2X3JlZwkJVFgzSERQOworCWR2X3JlZwkJVFg0SERQOworCWR2X3JlZwkJVFg1SERQOworCWR2X3JlZwkJVFg2SERQOworCWR2X3JlZwkJVFg3SERQOworCWR2X3JlZwkJUlgwSERQOworCWR2X3JlZwkJUlgxSERQOworCWR2X3JlZwkJUlgySERQOworCWR2X3JlZwkJUlgzSERQOworCWR2X3JlZwkJUlg0SERQOworCWR2X3JlZwkJUlg1SERQOworCWR2X3JlZwkJUlg2SERQOworCWR2X3JlZwkJUlg3SERQOworCWR2X3JlZwkJVFgwQ1A7CisJZHZfcmVnCQlUWDFDUDsKKwlkdl9yZWcJCVRYMkNQOworCWR2X3JlZwkJVFgzQ1A7CisJZHZfcmVnCQlUWDRDUDsKKwlkdl9yZWcJCVRYNUNQOworCWR2X3JlZwkJVFg2Q1A7CisJZHZfcmVnCQlUWDdDUDsKKwlkdl9yZWcJCVJYMENQOworCWR2X3JlZwkJUlgxQ1A7CisJZHZfcmVnCQlSWDJDUDsKKwlkdl9yZWcJCVJYM0NQOworCWR2X3JlZwkJUlg0Q1A7CisJZHZfcmVnCQlSWDVDUDsKKwlkdl9yZWcJCVJYNkNQOworCWR2X3JlZwkJUlg3Q1A7Cit9IGVtYWNfcmVnczsKKworLyogRU1BQyBXcmFwcGVyIFJlZ2lzdGVycyBTdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0ICB7CisJdV9pbnQ4X3QJUlNWRDBbNDEwMF07CisJZHZfcmVnCQlFV0NUTDsKKwlkdl9yZWcJCUVXSU5UVENOVDsKK30gZXdyYXBfcmVnczsKKworCisvKiBFTUFDIE1ESU8gUmVnaXN0ZXJzIFN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgIHsKKwlkdl9yZWcJCVZFUlNJT047CisJZHZfcmVnCQlDT05UUk9MOworCWR2X3JlZwkJQUxJVkU7CisJZHZfcmVnCQlMSU5LOworCWR2X3JlZwkJTElOS0lOVFJBVzsKKwlkdl9yZWcJCUxJTktJTlRNQVNLRUQ7CisJdV9pbnQ4X3QJUlNWRDBbOF07CisJZHZfcmVnCQlVU0VSSU5UUkFXOworCWR2X3JlZwkJVVNFUklOVE1BU0tFRDsKKwlkdl9yZWcJCVVTRVJJTlRNQVNLU0VUOworCWR2X3JlZwkJVVNFUklOVE1BU0tDTEVBUjsKKwl1X2ludDhfdAlSU1ZEMVs4MF07CisJZHZfcmVnCQlVU0VSQUNDRVNTMDsKKwlkdl9yZWcJCVVTRVJQSFlTRUwwOworCWR2X3JlZwkJVVNFUkFDQ0VTUzE7CisJZHZfcmVnCQlVU0VSUEhZU0VMMTsKK30gbWRpb19yZWdzOworCitpbnQgZG02NDR4X2V0aF9waHlfcmVhZCh1X2ludDhfdCBwaHlfYWRkciwgdV9pbnQ4X3QgcmVnX251bSwgdV9pbnQxNl90ICpkYXRhKTsKK2ludCBkbTY0NHhfZXRoX3BoeV93cml0ZSh1X2ludDhfdCBwaHlfYWRkciwgdV9pbnQ4X3QgcmVnX251bSwgdV9pbnQxNl90IGRhdGEpOworCit0eXBlZGVmIHN0cnVjdAoreworCWNoYXIJbmFtZVs2NF07CisJaW50CSgqaW5pdCkoaW50IHBoeV9hZGRyKTsKKwlpbnQJKCppc19waHlfY29ubmVjdGVkKShpbnQgcGh5X2FkZHIpOworCWludAkoKmdldF9saW5rX3NwZWVkKShpbnQgcGh5X2FkZHIpOworCWludAkoKmF1dG9fbmVnb3RpYXRlKShpbnQgcGh5X2FkZHIpOworfSBwaHlfdDsKKworI2RlZmluZSBQSFlfTFhUOTcyCSgweDAwMTM3OGUyKQoraW50IGx4dDk3Ml9pc19waHlfY29ubmVjdGVkKGludCBwaHlfYWRkcik7CitpbnQgbHh0OTcyX2dldF9saW5rX3NwZWVkKGludCBwaHlfYWRkcik7CitpbnQgbHh0OTcyX2luaXRfcGh5KGludCBwaHlfYWRkcik7CitpbnQgbHh0OTcyX2F1dG9fbmVnb3RpYXRlKGludCBwaHlfYWRkcik7CisKKyNkZWZpbmUgUEhZX0RQODM4NDgJKDB4MjAwMDVjOTApCitpbnQgZHA4Mzg0OF9pc19waHlfY29ubmVjdGVkKGludCBwaHlfYWRkcik7CitpbnQgZHA4Mzg0OF9nZXRfbGlua19zcGVlZChpbnQgcGh5X2FkZHIpOworaW50IGRwODM4NDhfaW5pdF9waHkoaW50IHBoeV9hZGRyKTsKK2ludCBkcDgzODQ4X2F1dG9fbmVnb3RpYXRlKGludCBwaHlfYWRkcik7CisKKyNlbmRpZiAgLyogX0RNNjQ0WF9FTUFDX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1kYXZpbmNpL2VtaWZfZGVmcy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9lbWlmX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDZmYzc3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9lbWlmX2RlZnMuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9FTUlGX0RFRlNfSF8KKyNkZWZpbmUgX0VNSUZfREVGU19IXworCisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworCWR2X3JlZwkJRVJDU1I7CisJZHZfcmVnCQlBV0NDUjsKKwlkdl9yZWcJCVNEQkNSOworCWR2X3JlZwkJU0RSQ1I7CisJZHZfcmVnCQlBQjFDUjsKKwlkdl9yZWcJCUFCMkNSOworCWR2X3JlZwkJQUIzQ1I7CisJZHZfcmVnCQlBQjRDUjsKKwlkdl9yZWcJCVNEVElNUjsKKwlkdl9yZWcJCUREUlNSOworCWR2X3JlZwkJRERSUEhZQ1I7CisJZHZfcmVnCQlERFJQSFlTUjsKKwlkdl9yZWcJCVRPVEFSOworCWR2X3JlZwkJVE9UQUNUUjsKKwlkdl9yZWcJCUREUlBIWUlEX1JFVjsKKwlkdl9yZWcJCVNEU1JFVFI7CisJZHZfcmVnCQlFSVJSOworCWR2X3JlZwkJRUlNUjsKKwlkdl9yZWcJCUVJTVNSOworCWR2X3JlZwkJRUlNQ1I7CisJZHZfcmVnCQlJT0NUUkxSOworCWR2X3JlZwkJSU9TVEFUUjsKKwl1X2ludDhfdAlSU1ZEMFs4XTsKKwlkdl9yZWcJCU5BTkRGQ1I7CisJZHZfcmVnCQlOQU5ERlNSOworCXVfaW50OF90CVJTVkQxWzhdOworCWR2X3JlZwkJTkFOREYxRUNDOworCWR2X3JlZwkJTkFOREYyRUNDOworCWR2X3JlZwkJTkFOREYzRUNDOworCWR2X3JlZwkJTkFOREY0RUNDOworfSBlbWlmX3JlZ2lzdGVyczsKKwordHlwZWRlZiBlbWlmX3JlZ2lzdGVycwkqZW1pZnJlZ3M7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWRhdmluY2kvaGFyZHdhcmUuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWRhdmluY2kvaGFyZHdhcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmNkY2ZlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9oYXJkd2FyZS5oCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIEJhc2VkIG9uOgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9oYXJkd2FyZS5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBUZXhhcyBJbnN0cnVtZW50cy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisjaWZuZGVmIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAorI2RlZmluZSBfX0FTTV9BUkNIX0hBUkRXQVJFX0gKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorCisjZGVmaW5lCVJFRyhhZGRyKQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoYWRkcikpCisjZGVmaW5lIFJFR19QKGFkZHIpCSgodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKGFkZHIpKQorCit0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIGludAlkdl9yZWc7Cit0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqCWR2X3JlZ19wOworCisvKgorICogQmFzZSByZWdpc3RlciBhZGRyZXNzZXMKKyAqLworI2RlZmluZSBEQVZJTkNJX0RNQV8zUENDX0JBU0UJCQkoMHgwMWMwMDAwMCkKKyNkZWZpbmUgREFWSU5DSV9ETUFfM1BUQzBfQkFTRQkJCSgweDAxYzEwMDAwKQorI2RlZmluZSBEQVZJTkNJX0RNQV8zUFRDMV9CQVNFCQkJKDB4MDFjMTA0MDApCisjZGVmaW5lIERBVklOQ0lfVUFSVDBfQkFTRQkJCSgweDAxYzIwMDAwKQorI2RlZmluZSBEQVZJTkNJX1VBUlQxX0JBU0UJCQkoMHgwMWMyMDQwMCkKKyNkZWZpbmUgREFWSU5DSV9VQVJUMl9CQVNFCQkJKDB4MDFjMjA4MDApCisjZGVmaW5lIERBVklOQ0lfSTJDX0JBU0UJCQkoMHgwMWMyMTAwMCkKKyNkZWZpbmUgREFWSU5DSV9USU1FUjBfQkFTRQkJCSgweDAxYzIxNDAwKQorI2RlZmluZSBEQVZJTkNJX1RJTUVSMV9CQVNFCQkJKDB4MDFjMjE4MDApCisjZGVmaW5lIERBVklOQ0lfV0RPR19CQVNFCQkJKDB4MDFjMjFjMDApCisjZGVmaW5lIERBVklOQ0lfUFdNMF9CQVNFCQkJKDB4MDFjMjIwMDApCisjZGVmaW5lIERBVklOQ0lfUFdNMV9CQVNFCQkJKDB4MDFjMjI0MDApCisjZGVmaW5lIERBVklOQ0lfUFdNMl9CQVNFCQkJKDB4MDFjMjI4MDApCisjZGVmaW5lIERBVklOQ0lfU1lTVEVNX01PRFVMRV9CQVNFCQkoMHgwMWM0MDAwMCkKKyNkZWZpbmUgREFWSU5DSV9QTExfQ05UUkwwX0JBU0UJCQkoMHgwMWM0MDgwMCkKKyNkZWZpbmUgREFWSU5DSV9QTExfQ05UUkwxX0JBU0UJCQkoMHgwMWM0MGMwMCkKKyNkZWZpbmUgREFWSU5DSV9QV1JfU0xFRVBfQ05UUkxfQkFTRQkJKDB4MDFjNDEwMDApCisjZGVmaW5lIERBVklOQ0lfU1lTVEVNX0RGVF9CQVNFCQkJKDB4MDFjNDIwMDApCisjZGVmaW5lIERBVklOQ0lfQVJNX0lOVENfQkFTRQkJCSgweDAxYzQ4MDAwKQorI2RlZmluZSBEQVZJTkNJX0lFRUUxMzk0X0JBU0UJCQkoMHgwMWM2MDAwMCkKKyNkZWZpbmUgREFWSU5DSV9VU0JfT1RHX0JBU0UJCQkoMHgwMWM2NDAwMCkKKyNkZWZpbmUgREFWSU5DSV9DRkNfQVRBX0JBU0UJCQkoMHgwMWM2NjAwMCkKKyNkZWZpbmUgREFWSU5DSV9TUElfQkFTRQkJCSgweDAxYzY2ODAwKQorI2RlZmluZSBEQVZJTkNJX0dQSU9fQkFTRQkJCSgweDAxYzY3MDAwKQorI2RlZmluZSBEQVZJTkNJX1VIUElfQkFTRQkJCSgweDAxYzY3ODAwKQorI2RlZmluZSBEQVZJTkNJX1ZQU1NfUkVHU19CQVNFCQkJKDB4MDFjNzAwMDApCisjZGVmaW5lIERBVklOQ0lfRU1BQ19DTlRSTF9SRUdTX0JBU0UJCSgweDAxYzgwMDAwKQorI2RlZmluZSBEQVZJTkNJX0VNQUNfV1JBUFBFUl9DTlRSTF9SRUdTX0JBU0UJKDB4MDFjODEwMDApCisjZGVmaW5lIERBVklOQ0lfRU1BQ19XUkFQUEVSX1JBTV9CQVNFCQkoMHgwMWM4MjAwMCkKKyNkZWZpbmUgREFWSU5DSV9NRElPX0NOVFJMX1JFR1NfQkFTRQkJKDB4MDFjODQwMDApCisjZGVmaW5lIERBVklOQ0lfSU1DT1BfQkFTRQkJCSgweDAxY2MwMDAwKQorI2RlZmluZSBEQVZJTkNJX0FTWU5DX0VNSUZfQ05UUkxfQkFTRQkJKDB4MDFlMDAwMDApCisjZGVmaW5lIERBVklOQ0lfVkxZTlFfQkFTRQkJCSgweDAxZTAxMDAwKQorI2RlZmluZSBEQVZJTkNJX01DQlNQX0JBU0UJCQkoMHgwMWUwMjAwMCkKKyNkZWZpbmUgREFWSU5DSV9NTUNfU0RfQkFTRQkJCSgweDAxZTEwMDAwKQorI2RlZmluZSBEQVZJTkNJX01TX0JBU0UJCQkJKDB4MDFlMjAwMDApCisjZGVmaW5lIERBVklOQ0lfQVNZTkNfRU1JRl9EQVRBX0NFMF9CQVNFCSgweDAyMDAwMDAwKQorI2RlZmluZSBEQVZJTkNJX0FTWU5DX0VNSUZfREFUQV9DRTFfQkFTRQkoMHgwNDAwMDAwMCkKKyNkZWZpbmUgREFWSU5DSV9BU1lOQ19FTUlGX0RBVEFfQ0UyX0JBU0UJKDB4MDYwMDAwMDApCisjZGVmaW5lIERBVklOQ0lfQVNZTkNfRU1JRl9EQVRBX0NFM19CQVNFCSgweDA4MDAwMDAwKQorI2RlZmluZSBEQVZJTkNJX1ZMWU5RX1JFTU9URV9CQVNFCQkoMHgwYzAwMDAwMCkKKworLyogUG93ZXIgYW5kIFNsZWVwIENvbnRyb2xsZXIgKFBTQykgRG9tYWlucyAqLworI2RlZmluZSBEQVZJTkNJX0dQU0NfQVJNRE9NQUlOCQkwCisjZGVmaW5lIERBVklOQ0lfR1BTQ19EU1BET01BSU4JCTEKKworI2RlZmluZSBEQVZJTkNJX0xQU0NfVlBTU01TVFIJCTAKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1ZQU1NTTFYJCTEKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RQQ0MJCTIKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RQVEMwCQkzCisjZGVmaW5lIERBVklOQ0lfTFBTQ19UUFRDMQkJNAorI2RlZmluZSBEQVZJTkNJX0xQU0NfRU1BQwkJNQorI2RlZmluZSBEQVZJTkNJX0xQU0NfRU1BQ19XUkFQUEVSCTYKKyNkZWZpbmUgREFWSU5DSV9MUFNDX01ESU8JCTcKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0lFRUUxMzk0CQk4CisjZGVmaW5lIERBVklOQ0lfTFBTQ19VU0IJCTkKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0FUQQkJMTAKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1ZMWU5RCQkxMQorI2RlZmluZSBEQVZJTkNJX0xQU0NfVUhQSQkJMTIKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0REUl9FTUlGCQkxMworI2RlZmluZSBEQVZJTkNJX0xQU0NfQUVNSUYJCTE0CisjZGVmaW5lIERBVklOQ0lfTFBTQ19NTUNfU0QJCTE1CisjZGVmaW5lIERBVklOQ0lfTFBTQ19NRU1TVElDSwkJMTYKKyNkZWZpbmUgREFWSU5DSV9MUFNDX01jQlNQCQkxNworI2RlZmluZSBEQVZJTkNJX0xQU0NfSTJDCQkxOAorI2RlZmluZSBEQVZJTkNJX0xQU0NfVUFSVDAJCTE5CisjZGVmaW5lIERBVklOQ0lfTFBTQ19VQVJUMQkJMjAKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1VBUlQyCQkyMQorI2RlZmluZSBEQVZJTkNJX0xQU0NfU1BJCQkyMgorI2RlZmluZSBEQVZJTkNJX0xQU0NfUFdNMAkJMjMKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1BXTTEJCTI0CisjZGVmaW5lIERBVklOQ0lfTFBTQ19QV00yCQkyNQorI2RlZmluZSBEQVZJTkNJX0xQU0NfR1BJTwkJMjYKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RJTUVSMAkJMjcKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RJTUVSMQkJMjgKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RJTUVSMgkJMjkKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1NZU1RFTV9TVUJTWVMJMzAKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0FSTQkJMzEKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1NDUjIJCTMyCisjZGVmaW5lIERBVklOQ0lfTFBTQ19TQ1IzCQkzMworI2RlZmluZSBEQVZJTkNJX0xQU0NfU0NSNAkJMzQKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0NST1NTQkFSCQkzNQorI2RlZmluZSBEQVZJTkNJX0xQU0NfQ0ZHMjcJCTM2CisjZGVmaW5lIERBVklOQ0lfTFBTQ19DRkczCQkzNworI2RlZmluZSBEQVZJTkNJX0xQU0NfQ0ZHNQkJMzgKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0dFTQkJMzkKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0lNQ09QCQk0MAorCisvKiBTb21lIFBTQyBkZWZpbmVzICovCisjZGVmaW5lIFBTQ19DSFBfU0hSVFNXCQkJKDB4MDFjNDAwMzgpCisjZGVmaW5lIFBTQ19HQkxDVEwJCQkoMHgwMWM0MTAxMCkKKyNkZWZpbmUgUFNDX0VQQ1BSCQkJKDB4MDFjNDEwNzApCisjZGVmaW5lIFBTQ19FUENDUgkJCSgweDAxYzQxMDc4KQorI2RlZmluZSBQU0NfUFRDTUQJCQkoMHgwMWM0MTEyMCkKKyNkZWZpbmUgUFNDX1BUU1RBVAkJCSgweDAxYzQxMTI4KQorI2RlZmluZSBQU0NfUERTVEFUCQkJKDB4MDFjNDEyMDApCisjZGVmaW5lIFBTQ19QRFNUQVQxCQkJKDB4MDFjNDEyMDQpCisjZGVmaW5lIFBTQ19QRENUTAkJCSgweDAxYzQxMzAwKQorI2RlZmluZSBQU0NfUERDVEwxCQkJKDB4MDFjNDEzMDQpCisKKyNkZWZpbmUgUFNDX01EQ1RMX0JBU0UJCQkoMHgwMWM0MWEwMCkKKyNkZWZpbmUgUFNDX01EU1RBVF9CQVNFCQkJKDB4MDFjNDE4MDApCisKKyNkZWZpbmUgVkREM1AzVl9QV0ROCQkJKDB4MDFjNDAwNDgpCisjZGVmaW5lIFVBUlQwX1BXUkVNVV9NR01UCQkoMHgwMWMyMDAzMCkKKworI2RlZmluZSBQU0NfU0lMVkVSX0JVTExFVAkJKDB4MDFjNDFhMjApCisKKy8qIFNvbWUgUExMIGRlZmluZXMgKi8KKyNkZWZpbmUgUExMMV9QTExNCQkJKDB4MDFjNDA5MTApCisjZGVmaW5lIFBMTDJfUExMTQkJCSgweDAxYzQwZDEwKQorI2RlZmluZSBQTEwyX0RJVjIJCQkoMHgwMWM0MGQxYykKKworLyogTWlzY2VsbGFuaWEuLi4gKi8KKyNkZWZpbmUgVkJQUgkJCQkoMHgyMDAwMDAyMCkKKyNkZWZpbmUgUElOTVVYMAkJCQkoMHgwMWM0MDAwMCkKKyNkZWZpbmUgUElOTVVYMQkJCQkoMHgwMWM0MDAwNCkKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9pMmNfZGVmcy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9pMmNfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOTAyZTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1kYXZpbmNpL2kyY19kZWZzLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICoKKyAqIFNvbWUgY2hhbmdlcyBjb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX0RBVklOQ0lfSTJDX0hfCisjZGVmaW5lIF9EQVZJTkNJX0kyQ19IXworCisjZGVmaW5lIEkyQ19XUklURQkJMAorI2RlZmluZSBJMkNfUkVBRAkJMQorCisjZGVmaW5lIEkyQ19CQVNFCQkweDAxYzIxMDAwCisKKyNkZWZpbmUJSTJDX09BCQkJKEkyQ19CQVNFICsgMHgwMCkKKyNkZWZpbmUgSTJDX0lFCQkJKEkyQ19CQVNFICsgMHgwNCkKKyNkZWZpbmUgSTJDX1NUQVQJCShJMkNfQkFTRSArIDB4MDgpCisjZGVmaW5lIEkyQ19TQ0xMCQkoSTJDX0JBU0UgKyAweDBjKQorI2RlZmluZSBJMkNfU0NMSAkJKEkyQ19CQVNFICsgMHgxMCkKKyNkZWZpbmUgSTJDX0NOVAkJCShJMkNfQkFTRSArIDB4MTQpCisjZGVmaW5lIEkyQ19EUlIJCQkoSTJDX0JBU0UgKyAweDE4KQorI2RlZmluZSBJMkNfU0EJCQkoSTJDX0JBU0UgKyAweDFjKQorI2RlZmluZSBJMkNfRFhSCQkJKEkyQ19CQVNFICsgMHgyMCkKKyNkZWZpbmUgSTJDX0NPTgkJCShJMkNfQkFTRSArIDB4MjQpCisjZGVmaW5lIEkyQ19JVgkJCShJMkNfQkFTRSArIDB4MjgpCisjZGVmaW5lIEkyQ19QU0MJCQkoSTJDX0JBU0UgKyAweDMwKQorCisvKiBJMkMgbWFza3MgKi8KKworLyogSTJDIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKEkyQ19JRSk6ICovCisjZGVmaW5lIEkyQ19JRV9TQ0RfSUUJKDEgPDwgNSkJLyogU3RvcCBjb25kaXRpb24gZGV0ZWN0IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX0lFX1hSRFlfSUUJKDEgPDwgNCkJLyogVHJhbnNtaXQgZGF0YSByZWFkeSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEkyQ19JRV9SUkRZX0lFCSgxIDw8IDMpCS8qIFJlY2VpdmUgZGF0YSByZWFkeSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEkyQ19JRV9BUkRZX0lFCSgxIDw8IDIpCS8qIFJlZ2lzdGVyIGFjY2VzcyByZWFkeSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEkyQ19JRV9OQUNLX0lFCSgxIDw8IDEpCS8qIE5vIGFja25vd2xlZGdtZW50IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX0lFX0FMX0lFCSgxIDw8IDApCS8qIEFyYml0cmF0aW9uIGxvc3QgaW50ZXJydXB0IGVuYWJsZSAqLworCisvKiBJMkMgU3RhdHVzIFJlZ2lzdGVyIChJMkNfU1RBVCk6ICovCisKKyNkZWZpbmUgSTJDX1NUQVRfQkIJKDEgPDwgMTIpCS8qIEJ1cyBidXN5ICovCisjZGVmaW5lIEkyQ19TVEFUX1JPVlIJKDEgPDwgMTEpCS8qIFJlY2VpdmUgb3ZlcnJ1biAqLworI2RlZmluZSBJMkNfU1RBVF9YVURGCSgxIDw8IDEwKQkvKiBUcmFuc21pdCB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgSTJDX1NUQVRfQUFTCSgxIDw8IDkpCS8qIEFkZHJlc3MgYXMgc2xhdmUgKi8KKyNkZWZpbmUgSTJDX1NUQVRfU0NECSgxIDw8IDUpCS8qIFN0b3AgY29uZGl0aW9uIGRldGVjdCAqLworI2RlZmluZSBJMkNfU1RBVF9YUkRZCSgxIDw8IDQpCS8qIFRyYW5zbWl0IGRhdGEgcmVhZHkgKi8KKyNkZWZpbmUgSTJDX1NUQVRfUlJEWQkoMSA8PCAzKQkvKiBSZWNlaXZlIGRhdGEgcmVhZHkgKi8KKyNkZWZpbmUgSTJDX1NUQVRfQVJEWQkoMSA8PCAyKQkvKiBSZWdpc3RlciBhY2Nlc3MgcmVhZHkgKi8KKyNkZWZpbmUgSTJDX1NUQVRfTkFDSwkoMSA8PCAxKQkvKiBObyBhY2tub3dsZWRnbWVudCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEkyQ19TVEFUX0FMCSgxIDw8IDApCS8qIEFyYml0cmF0aW9uIGxvc3QgaW50ZXJydXB0IGVuYWJsZSAqLworCisKKy8qIEkyQyBJbnRlcnJ1cHQgQ29kZSBSZWdpc3RlciAoSTJDX0lOVENPREUpOiAqLworCisjZGVmaW5lIEkyQ19JTlRDT0RFX01BU0sJNworI2RlZmluZSBJMkNfSU5UQ09ERV9OT05FCTAKKyNkZWZpbmUgSTJDX0lOVENPREVfQUwJCTEJLyogQXJiaXRyYXRpb24gbG9zdCAqLworI2RlZmluZSBJMkNfSU5UQ09ERV9OQUsJCTIJLyogTm8gYWNrbm93bGVkZ2VtZW50L2dlbmVyYWwgY2FsbCAqLworI2RlZmluZSBJMkNfSU5UQ09ERV9BUkRZCTMJLyogUmVnaXN0ZXIgYWNjZXNzIHJlYWR5ICovCisjZGVmaW5lIEkyQ19JTlRDT0RFX1JSRFkJNAkvKiBSY3YgZGF0YSByZWFkeSAqLworI2RlZmluZSBJMkNfSU5UQ09ERV9YUkRZCTUJLyogWG1pdCBkYXRhIHJlYWR5ICovCisjZGVmaW5lIEkyQ19JTlRDT0RFX1NDRAkJNgkvKiBTdG9wIGNvbmRpdGlvbiBkZXRlY3QgKi8KKworCisvKiBJMkMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoSTJDX0NPTik6ICovCisKKyNkZWZpbmUgSTJDX0NPTl9FTgkoMSA8PCA1KQkvKiBJMkMgbW9kdWxlIGVuYWJsZSAqLworI2RlZmluZSBJMkNfQ09OX1NUQgkoMSA8PCA0KQkvKiBTdGFydCBieXRlIG1vZGUgKG1hc3RlciBtb2RlIG9ubHkpICovCisjZGVmaW5lIEkyQ19DT05fTVNUCSgxIDw8IDEwKQkvKiBNYXN0ZXIvc2xhdmUgbW9kZSAqLworI2RlZmluZSBJMkNfQ09OX1RSWAkoMSA8PCA5KQkvKiBUcmFuc21pdHRlci9yZWNlaXZlciBtb2RlIChtYXN0ZXIgbW9kZSBvbmx5KSAqLworI2RlZmluZSBJMkNfQ09OX1hBCSgxIDw8IDgpCS8qIEV4cGFuZCBhZGRyZXNzICovCisjZGVmaW5lIEkyQ19DT05fU1RQCSgxIDw8IDExKQkvKiBTdG9wIGNvbmRpdGlvbiAobWFzdGVyIG1vZGUgb25seSkgKi8KKyNkZWZpbmUgSTJDX0NPTl9TVFQJKDEgPDwgMTMpCS8qIFN0YXJ0IGNvbmRpdGlvbiAobWFzdGVyIG1vZGUgb25seSkgKi8KKworI2RlZmluZSBJMkNfVElNRU9VVAkweGZmZmYwMDAwCS8qIFRpbWVvdXQgbWFzayBmb3IgcG9sbF9pMmNfaXJxKCkgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1kYXZpbmNpL25hbmRfZGVmcy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9uYW5kX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTliZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9uYW5kX2RlZnMuaApAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBQYXJ0cyBzaGFtZWxlc2x5IHN0b2xlbiBmcm9tIExpbnV4IEtlcm5lbCBzb3VyY2UgdHJlZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfTkFORF9ERUZTX0hfCisjZGVmaW5lIF9OQU5EX0RFRlNfSF8KKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisKKyNkZWZpbmUJTUFTS19DTEUJMHgxMAorI2RlZmluZQlNQVNLX0FMRQkweDBhCisKKyNkZWZpbmUgTkFORF9DRTBDTEUJKCh2b2xhdGlsZSB1X2ludDhfdCAqKShDRkdfTkFORF9CQVNFICsgMHgxMCkpCisjZGVmaW5lIE5BTkRfQ0UwQUxFCSgodm9sYXRpbGUgdV9pbnQ4X3QgKikoQ0ZHX05BTkRfQkFTRSArIDB4MGEpKQorI2RlZmluZSBOQU5EX0NFMERBVEEJKCh2b2xhdGlsZSB1X2ludDhfdCAqKUNGR19OQU5EX0JBU0UpCisKK3R5cGVkZWYgc3RydWN0ICB7CisJdV9pbnQzMl90CU5SQ1NSOworCXVfaW50MzJfdAlBV0NDUjsKKwl1X2ludDhfdAlSU1ZEMFs4XTsKKwl1X2ludDMyX3QJQUIxQ1I7CisJdV9pbnQzMl90CUFCMkNSOworCXVfaW50MzJfdAlBQjNDUjsKKwl1X2ludDMyX3QJQUI0Q1I7CisJdV9pbnQ4X3QJUlNWRDFbMzJdOworCXVfaW50MzJfdAlOSVJSOworCXVfaW50MzJfdAlOSU1SOworCXVfaW50MzJfdAlOSU1TUjsKKwl1X2ludDMyX3QJTklNQ1I7CisJdV9pbnQ4X3QJUlNWRDJbMTZdOworCXVfaW50MzJfdAlOQU5ERkNSOworCXVfaW50MzJfdAlOQU5ERlNSOworCXVfaW50OF90CVJTVkQzWzhdOworCXVfaW50MzJfdAlOQU5ERjFFQ0M7CisJdV9pbnQzMl90CU5BTkRGMkVDQzsKKwl1X2ludDMyX3QJTkFOREYzRUNDOworCXVfaW50MzJfdAlOQU5ERjRFQ0M7CisJdV9pbnQ4X3QJUlNWRDRbNF07CisJdV9pbnQzMl90CUlPREZURUNSOworCXVfaW50MzJfdAlJT0RGVEdDUjsKKwl1X2ludDhfdAlSU1ZENVs0XTsKKwl1X2ludDMyX3QJSU9ERlRNUkxSOworCXVfaW50MzJfdAlJT0RGVE1STVI7CisJdV9pbnQzMl90CUlPREZUTVJNU0JSOworCXVfaW50OF90CVJTVkQ2WzIwXTsKKwl1X2ludDMyX3QJTU9EUk5SOworCXVfaW50OF90CVJTVkQ3Wzc2XTsKKwl1X2ludDMyX3QJQ0UwREFUQTsKKwl1X2ludDMyX3QJQ0UwQUxFOworCXVfaW50MzJfdAlDRTBDTEU7CisJdV9pbnQ4X3QJUlNWRDhbNF07CisJdV9pbnQzMl90CUNFMURBVEE7CisJdV9pbnQzMl90CUNFMUFMRTsKKwl1X2ludDMyX3QJQ0UxQ0xFOworCXVfaW50OF90CVJTVkQ5WzRdOworCXVfaW50MzJfdAlDRTJEQVRBOworCXVfaW50MzJfdAlDRTJBTEU7CisJdV9pbnQzMl90CUNFMkNMRTsKKwl1X2ludDhfdAlSU1ZEMTBbNF07CisJdV9pbnQzMl90CUNFM0RBVEE7CisJdV9pbnQzMl90CUNFM0FMRTsKKwl1X2ludDMyX3QJQ0UzQ0xFOworfSBuYW5kX3JlZ2lzdGVyczsKKwordHlwZWRlZiB2b2xhdGlsZSBuYW5kX3JlZ2lzdGVycwkqbmFuZHJlZ3M7CisKKyNkZWZpbmUgTkFORF9SRUFEX1NUQVJUCQkweDAwCisjZGVmaW5lIE5BTkRfUkVBRF9FTkQJCTB4MzAKKyNkZWZpbmUgTkFORF9TVEFUVVMJCTB4NzAKKworI2lmZGVmIENGR19OQU5EX0hXX0VDQworI2RlZmluZSBOQU5EX0VjY19QMWUJCSgxIDw8IDApCisjZGVmaW5lIE5BTkRfRWNjX1AyZQkJKDEgPDwgMSkKKyNkZWZpbmUgTkFORF9FY2NfUDRlCQkoMSA8PCAyKQorI2RlZmluZSBOQU5EX0VjY19QOGUJCSgxIDw8IDMpCisjZGVmaW5lIE5BTkRfRWNjX1AxNmUJCSgxIDw8IDQpCisjZGVmaW5lIE5BTkRfRWNjX1AzMmUJCSgxIDw8IDUpCisjZGVmaW5lIE5BTkRfRWNjX1A2NGUJCSgxIDw8IDYpCisjZGVmaW5lIE5BTkRfRWNjX1AxMjhlCQkoMSA8PCA3KQorI2RlZmluZSBOQU5EX0VjY19QMjU2ZQkJKDEgPDwgOCkKKyNkZWZpbmUgTkFORF9FY2NfUDUxMmUJCSgxIDw8IDkpCisjZGVmaW5lIE5BTkRfRWNjX1AxMDI0ZQkJKDEgPDwgMTApCisjZGVmaW5lIE5BTkRfRWNjX1AyMDQ4ZQkJKDEgPDwgMTEpCisKKyNkZWZpbmUgTkFORF9FY2NfUDFvCQkoMSA8PCAxNikKKyNkZWZpbmUgTkFORF9FY2NfUDJvCQkoMSA8PCAxNykKKyNkZWZpbmUgTkFORF9FY2NfUDRvCQkoMSA8PCAxOCkKKyNkZWZpbmUgTkFORF9FY2NfUDhvCQkoMSA8PCAxOSkKKyNkZWZpbmUgTkFORF9FY2NfUDE2bwkJKDEgPDwgMjApCisjZGVmaW5lIE5BTkRfRWNjX1AzMm8JCSgxIDw8IDIxKQorI2RlZmluZSBOQU5EX0VjY19QNjRvCQkoMSA8PCAyMikKKyNkZWZpbmUgTkFORF9FY2NfUDEyOG8JCSgxIDw8IDIzKQorI2RlZmluZSBOQU5EX0VjY19QMjU2bwkJKDEgPDwgMjQpCisjZGVmaW5lIE5BTkRfRWNjX1A1MTJvCQkoMSA8PCAyNSkKKyNkZWZpbmUgTkFORF9FY2NfUDEwMjRvCQkoMSA8PCAyNikKKyNkZWZpbmUgTkFORF9FY2NfUDIwNDhvCQkoMSA8PCAyNykKKworI2RlZmluZSBURih2KQkJCSh2ID8gMSA6IDApCisKKyNkZWZpbmUgUDIwNDhlKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AyMDQ4ZSkgPDwgMCkKKyNkZWZpbmUgUDIwNDhvKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AyMDQ4bykgPDwgMSkKKyNkZWZpbmUgUDFlKGEpCQkJKFRGKGEgJiBOQU5EX0VjY19QMWUpIDw8IDIpCisjZGVmaW5lIFAxbyhhKQkJCShURihhICYgTkFORF9FY2NfUDFvKSA8PCAzKQorI2RlZmluZSBQMmUoYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1AyZSkgPDwgNCkKKyNkZWZpbmUgUDJvKGEpCQkJKFRGKGEgJiBOQU5EX0VjY19QMm8pIDw8IDUpCisjZGVmaW5lIFA0ZShhKQkJCShURihhICYgTkFORF9FY2NfUDRlKSA8PCA2KQorI2RlZmluZSBQNG8oYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1A0bykgPDwgNykKKworI2RlZmluZSBQOGUoYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1A4ZSkgPDwgMCkKKyNkZWZpbmUgUDhvKGEpCQkJKFRGKGEgJiBOQU5EX0VjY19QOG8pIDw8IDEpCisjZGVmaW5lIFAxNmUoYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1AxNmUpIDw8IDIpCisjZGVmaW5lIFAxNm8oYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1AxNm8pIDw8IDMpCisjZGVmaW5lIFAzMmUoYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1AzMmUpIDw8IDQpCisjZGVmaW5lIFAzMm8oYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1AzMm8pIDw8IDUpCisjZGVmaW5lIFA2NGUoYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1A2NGUpIDw8IDYpCisjZGVmaW5lIFA2NG8oYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1A2NG8pIDw8IDcpCisKKyNkZWZpbmUgUDEyOGUoYSkJCShURihhICYgTkFORF9FY2NfUDEyOGUpIDw8IDApCisjZGVmaW5lIFAxMjhvKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AxMjhvKSA8PCAxKQorI2RlZmluZSBQMjU2ZShhKQkJKFRGKGEgJiBOQU5EX0VjY19QMjU2ZSkgPDwgMikKKyNkZWZpbmUgUDI1Nm8oYSkJCShURihhICYgTkFORF9FY2NfUDI1Nm8pIDw8IDMpCisjZGVmaW5lIFA1MTJlKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1A1MTJlKSA8PCA0KQorI2RlZmluZSBQNTEybyhhKQkJKFRGKGEgJiBOQU5EX0VjY19QNTEybykgPDwgNSkKKyNkZWZpbmUgUDEwMjRlKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AxMDI0ZSkgPDwgNikKKyNkZWZpbmUgUDEwMjRvKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AxMDI0bykgPDwgNykKKworI2RlZmluZSBQOGVfcyhhKQkJKFRGKGEgJiBOQU5EX0VjY19QOGUpIDw8IDApCisjZGVmaW5lIFA4b19zKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1A4bykgPDwgMSkKKyNkZWZpbmUgUDE2ZV9zKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AxNmUpIDw8IDIpCisjZGVmaW5lIFAxNm9fcyhhKQkJKFRGKGEgJiBOQU5EX0VjY19QMTZvKSA8PCAzKQorI2RlZmluZSBQMWVfcyhhKQkJKFRGKGEgJiBOQU5EX0VjY19QMWUpIDw8IDQpCisjZGVmaW5lIFAxb19zKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AxbykgPDwgNSkKKyNkZWZpbmUgUDJlX3MoYSkJCShURihhICYgTkFORF9FY2NfUDJlKSA8PCA2KQorI2RlZmluZSBQMm9fcyhhKQkJKFRGKGEgJiBOQU5EX0VjY19QMm8pIDw8IDcpCisKKyNkZWZpbmUgUDRlX3MoYSkJCShURihhICYgTkFORF9FY2NfUDRlKSA8PCAwKQorI2RlZmluZSBQNG9fcyhhKQkJKFRGKGEgJiBOQU5EX0VjY19QNG8pIDw8IDEpCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhLXJlZ3MuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oCmluZGV4IGViZGE3MTkuLmU4Y2IyOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oCkBAIC01OTIsOSArNTkyLDExIEBACiAjZGVmaW5lIFBNQ19SRUdfQkFTRQlfX1JFRygweDQwNTAwNDAwKSAgLyogUHJpbWFyeSBNb2RlbSBDb2RlYyAqLwogI2RlZmluZSBTTUNfUkVHX0JBU0UJX19SRUcoMHg0MDUwMDUwMCkgIC8qIFNlY29uZGFyeSBNb2RlbSBDb2RlYyAqLwogCisKIC8qCiAgKiBVU0IgRGV2aWNlIENvbnRyb2xsZXIKICAqLworI2lmbmRlZiBDT05GSUdfQ1BVX01PTkFIQU5TCiAjZGVmaW5lIFVEQ19SRVMxCV9fUkVHKDB4NDA2MDAwMDQpICAvKiBVREMgVW5kb2N1bWVudGVkIC0gUmVzZXJ2ZWQxICovCiAjZGVmaW5lIFVEQ19SRVMyCV9fUkVHKDB4NDA2MDAwMDgpICAvKiBVREMgVW5kb2N1bWVudGVkIC0gUmVzZXJ2ZWQyICovCiAjZGVmaW5lIFVEQ19SRVMzCV9fUkVHKDB4NDA2MDAwMEMpICAvKiBVREMgVW5kb2N1bWVudGVkIC0gUmVzZXJ2ZWQzICovCkBAIC03NDksMTEgKzc1MSwyOCBAQAogI2RlZmluZSBVU0lSMV9JUjEzCSgxIDw8IDUpCS8qIEludGVycnVwIHJlcXVlc3QgZXAgMTMgKi8KICNkZWZpbmUgVVNJUjFfSVIxNAkoMSA8PCA2KQkvKiBJbnRlcnJ1cCByZXF1ZXN0IGVwIDE0ICovCiAjZGVmaW5lIFVTSVIxX0lSMTUJKDEgPDwgNykJLyogSW50ZXJydXAgcmVxdWVzdCBlcCAxNSAqLworI2VuZGlmIC8qICEgQ09ORklHX0NQVV9NT05BSEFOUyAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfUFhBMjdYKQorI2lmIGRlZmluZWQoQ09ORklHX1BYQTI3WCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX01PTkFIQU5TKQorCisvKgorICogVVNCIENsaWVudCBDb250cm9sbGVyIChpbmNvbXBsZXRlKQorICovCisjZGVmaW5lIFVEQ0NSCQlfX1JFRygweDQwNjAwMDAwKQorI2RlZmluZSBVRENJQ1IwCQlfX1JFRygweDQwNjAwMDA0KQorI2RlZmluZSBVRENDSVIwCQlfX1JFRygweDQwNjAwMDA4KQorI2RlZmluZSBVRENJU1IwCQlfX1JFRygweDQwNjAwMDBjKQorI2RlZmluZSBVRENTSVIxCQlfX1JFRygweDQwNjAwMDEwKQorI2RlZmluZSBVRENGTlIJCV9fUkVHKDB4NDA2MDAwMTQpCisjZGVmaW5lIFVEQ09UR0lDUglfX1JFRygweDQwNjAwMDE4KQorI2RlZmluZSBVRENPVEdJU1IJX19SRUcoMHg0MDYwMDAxYykKKyNkZWZpbmUgVVAyT0NSCQlfX1JFRygweDQwNjAwMDIwKQorI2RlZmluZSBVUDNPQ1IJCV9fUkVHKDB4NDA2MDAwMjQpCisKIC8qCiAgKiBVU0IgSG9zdCBDb250cm9sbGVyCiAgKi8KKyNkZWZpbmUgT0hDSV9SRUdTX0JBU0UJMHg0QzAwMDAwMAkvKiByZXF1aXJlZCBmb3Igb2hjaSBkcml2ZXIgKi8KICNkZWZpbmUgVUhDUkVWCQlfX1JFRygweDRDMDAwMDAwKQogI2RlZmluZSBVSENIQ09OCQlfX1JFRygweDRDMDAwMDA0KQogI2RlZmluZSBVSENDT01TCQlfX1JFRygweDRDMDAwMDA4KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWljcm9ibGF6ZS9hc20uaCBiL2luY2x1ZGUvYXNtLW1pY3JvYmxhemUvYXNtLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2UzMDAuaCBiL2luY2x1ZGUvYXNtLXBwYy9lMzAwLmgKaW5kZXggZDFiYjE1OS4uZGU4MjM5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL2UzMDAuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvZTMwMC5oCkBAIC05LDYgKzksNyBAQAogI2RlZmluZSBQVlJfRTMwMEMxCTB4ODA4MzAwMDAKICNkZWZpbmUgUFZSX0UzMDBDMgkweDgwODQwMDAwCiAjZGVmaW5lIFBWUl9FMzAwQzMJMHg4MDg1MDAwMAorI2RlZmluZSBQVlJfRTMwMEM0CTB4ODA4NjAwMDAKIAogLyoKICAqIEhhcmR3YXJlIEltcGxlbWVudGF0aW9uLURlcGVuZGVudCBSZWdpc3RlciAwIChISUQwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2dsb2JhbF9kYXRhLmggYi9pbmNsdWRlL2FzbS1wcGMvZ2xvYmFsX2RhdGEuaAppbmRleCBjZDI0NjM2Li4xZjE1ODNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvZ2xvYmFsX2RhdGEuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvZ2xvYmFsX2RhdGEuaApAQCAtNzEsMjAgKzcxLDI0IEBACiAJdTMyIGxjbGtfY2xrOwogCXUzMiBkZHJfY2xrOwogCXUzMiBwY2lfY2xrOworI2lmIGRlZmluZWQoQ09ORklHX01QQzgzNjApCisJdTMyICBkZHJfc2VjX2NsazsKKyNlbmRpZiAvKiBDT05GSUdfTVBDODM2MCAqLworI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfUUUpCiAJdTMyIHFlX2NsazsKIAl1MzIgYnJnX2NsazsKIAl1aW50IG1wX2FsbG9jX2Jhc2U7CiAJdWludCBtcF9hbGxvY190b3A7CiAjZW5kaWYgLyogQ09ORklHX1FFICovCi0jaWYgZGVmaW5lZCAoQ09ORklHX01QQzgzNjApCi0JdTMyICBkZHJfc2VjX2NsazsKLSNlbmRpZiAvKiBDT05GSUdfTVBDODM2MCAqLwotI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfTVBDNXh4eCkKIAl1bnNpZ25lZCBsb25nCWlwYl9jbGs7CiAJdW5zaWduZWQgbG9uZwlwY2lfY2xrOwogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfTVBDNTEyWCkKKwl1MzIgaXBiX2NsazsKKwl1MzIgY3NiX2NsazsKKyNlbmRpZiAvKiBDT05GSUdfTVBDNTEyWCAqLwogI2lmIGRlZmluZWQoQ09ORklHX01QQzgyMjApCiAJdW5zaWduZWQgbG9uZyAgIGJFeHRVYXJ0OwogCXVuc2lnbmVkIGxvbmcgICBpbnBfY2xrOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2ltbWFwXzUxMnguaCBiL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF81MTJ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkMTBkNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF81MTJ4LmgKQEAgLTAsMCArMSw1NjkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZworICoKKyAqIE1QQzUxMnggSW50ZXJuYWwgTWVtb3J5IE1hcAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogQmFzZWQgb24gdGhlIE1QQzgzeHggaGVhZGVyLgorICovCisKKyNpZm5kZWYgX19JTU1BUF81MTJ4X18KKyNkZWZpbmUgX19JTU1BUF81MTJ4X18KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCit0eXBlZGVmIHN0cnVjdCBsYXc1MTJ4IHsKKwl1MzIgYmFyOwkvKiBCYXNlIEFkZHIgUmVnaXN0ZXIgKi8KKwl1MzIgYXI7CQkvKiBBdHRyaWJ1dGVzIFJlZ2lzdGVyICovCit9IGxhdzUyMXhfdDsKKworLyoKKyAqIFN5c3RlbSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworICovCit0eXBlZGVmIHN0cnVjdCBzeXNjb25mNTEyeCB7CisJdTMyIGltbXJiYXI7CQkvKiBJbnRlcm5hbCBtZW1vcnkgbWFwIGJhc2UgYWRkcmVzcyByZWdpc3RlciAqLworCXU4IHJlczBbMHgxY107CisJdTMyIGxwYmF3OwkJLyogTFAgQm9vdCBBY2Nlc3MgV2luZG93ICovCisJdTMyIGxwY3MwYXc7CQkvKiBMUCBDUzAgQWNjZXNzIFdpbmRvdyAqLworCXUzMiBscGNzMWF3OwkJLyogTFAgQ1MxIEFjY2VzcyBXaW5kb3cgKi8KKwl1MzIgbHBjczJhdzsJCS8qIExQIENTMiBBY2Nlc3MgV2luZG93ICovCisJdTMyIGxwY3MzYXc7CQkvKiBMUCBDUzMgQWNjZXNzIFdpbmRvdyAqLworCXUzMiBscGNzNGF3OwkJLyogTFAgQ1M0IEFjY2VzcyBXaW5kb3cgKi8KKwl1MzIgbHBjczVhdzsJCS8qIExQIENTNSBBY2Nlc3MgV2luZG93ICovCisJdTMyIGxwY3M2YXc7CQkvKiBMUCBDUzYgQWNjZXNzIFdpbmRvdyAqLworCXUzMiBscGNzN2F3OwkJLyogTFAgQ1M3IEFjY2VzcyBXaW5kb3cgKi8KKwl1OCByZXMxWzB4MWNdOworCWxhdzUyMXhfdCBwY2lsYXdbM107CS8qIFBDSSBMb2NhbCBBY2Nlc3MgV2luZG93IDAtMiBSZWdpc3RlcnMgKi8KKwl1OCByZXMyWzB4MjhdOworCWxhdzUyMXhfdCBkZHJsYXc7CS8qIEREUiBMb2NhbCBBY2Nlc3MgV2luZG93ICovCisJdTggcmVzM1sweDE4XTsKKwl1MzIgbWJ4YmFyOwkJLyogTUJYIEJhc2UgQWRkcmVzcyAqLworCXUzMiBzcmFtYmFyOwkJLyogU1JBTSBCYXNlIEFkZHJlc3MgKi8KKwl1MzIgbmZjYmFyOwkJLyogTkZDIEJhc2UgQWRkcmVzcyAqLworCXU4IHJlczRbMHgzNF07CisJdTMyIHNwcmlkcjsJCS8qIFN5c3RlbSBQYXJ0IGFuZCBSZXZpc2lvbiBJRCBSZWdpc3RlciAqLworCXUzMiBzcGNyOwkJLyogU3lzdGVtIFByaW9yaXR5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwl1OCByZXM1WzB4ZjhdOworfSBzeXNjb25mNTEyeF90OworCisvKgorICogV2F0Y2ggRG9nIFRpbWVyIChXRFQpIFJlZ2lzdGVycworICovCit0eXBlZGVmIHN0cnVjdCB3ZHQ1MTJ4IHsKKwl1OCByZXMwWzRdOworCXUzMiBzd2NycjsJCS8qIFN5c3RlbSB3YXRjaGRvZyBjb250cm9sIHJlZ2lzdGVyICovCisJdTMyIHN3Y25yOwkJLyogU3lzdGVtIHdhdGNoZG9nIGNvdW50IHJlZ2lzdGVyICovCisJdTggcmVzMVsyXTsKKwl1MTYgc3dzcnI7CQkvKiBTeXN0ZW0gd2F0Y2hkb2cgc2VydmljZSByZWdpc3RlciAqLworCXU4IHJlczJbMHhGMF07Cit9IHdkdDUxMnhfdDsKKworLyoKKyAqIFJUQyBNb2R1bGUgUmVnaXN0ZXJzCisgKi8KK3R5cGVkZWYgc3RydWN0IHJ0Y2xrNTEyeCB7CisJdTggZml4bWVbMHgxMDBdOworfSBydGNsazUxMnhfdDsKKworLyoKKyAqIEdlbmVyYWwgUHVycG9zZSBUaW1lcgorICovCit0eXBlZGVmIHN0cnVjdCBncHQ1MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IGdwdDUxMnhfdDsKKworLyoKKyAqIEludGVncmF0ZWQgUHJvZ3JhbW1hYmxlIEludGVycnVwdCBDb250cm9sbGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IGlwaWM1MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IGlwaWM1MTJ4X3Q7CisKKy8qCisgKiBTeXN0ZW0gQXJiaXRlciBSZWdpc3RlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXJiaXRlcjUxMnggeworCXUzMiBhY3I7CQkvKiBBcmJpdGVyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwl1MzIgYXRyOwkJLyogQXJiaXRlciBUaW1lcnMgUmVnaXN0ZXIgKi8KKwl1MzIgYXRlcjsJCS8qIEFyYml0ZXIgVHJhbnNmZXIgRXJyb3IgUmVnaXN0ZXIgKi8KKwl1MzIgYWVyOwkJLyogQXJiaXRlciBFdmVudCBSZWdpc3RlciAqLworCXUzMiBhaWRyOwkJLyogQXJiaXRlciBJbnRlcnJ1cHQgRGVmaW5pdGlvbiBSZWdpc3RlciAqLworCXUzMiBhbXI7CQkvKiBBcmJpdGVyIE1hc2sgUmVnaXN0ZXIgKi8KKwl1MzIgYWVhdHI7CQkvKiBBcmJpdGVyIEV2ZW50IEF0dHJpYnV0ZXMgUmVnaXN0ZXIgKi8KKwl1MzIgYWVhZHI7CQkvKiBBcmJpdGVyIEV2ZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1MzIgYWVycjsJCS8qIEFyYml0ZXIgRXZlbnQgUmVzcG9uc2UgUmVnaXN0ZXIgKi8KKwl1OCByZXMxWzB4RENdOworfSBhcmJpdGVyNTEyeF90OworCisvKgorICogUmVzZXQgTW9kdWxlCisgKi8KK3R5cGVkZWYgc3RydWN0IHJlc2V0NTEyeCB7CisJdTMyIHJjd2w7CQkvKiBSZXNldCBDb25maWd1cmF0aW9uIFdvcmQgTG93IFJlZ2lzdGVyICovCisJdTMyIHJjd2g7CQkvKiBSZXNldCBDb25maWd1cmF0aW9uIFdvcmQgSGlnaCBSZWdpc3RlciAqLworCXU4IHJlczBbOF07CisJdTMyIHJzcjsJCS8qIFJlc2V0IFN0YXR1cyBSZWdpc3RlciAqLworCXUzMiBybXI7CQkvKiBSZXNldCBNb2RlIFJlZ2lzdGVyICovCisJdTMyIHJwcjsJCS8qIFJlc2V0IHByb3RlY3Rpb24gUmVnaXN0ZXIgKi8KKwl1MzIgcmNyOwkJLyogUmVzZXQgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMiByY2VyOwkJLyogUmVzZXQgQ29udHJvbCBFbmFibGUgUmVnaXN0ZXIgKi8KKwl1OCByZXMxWzB4RENdOworfSByZXNldDUxMnhfdDsKKworLyoKKyAqIENsb2NrIE1vZHVsZQorICovCit0eXBlZGVmIHN0cnVjdCBjbGs1MTJ4IHsKKwl1MzIgc3BtcjsJCS8qIFN5c3RlbSBQTEwgTW9kZSBSZWdpc3RlciAqLworCXUzMiBzY2NyWzJdOwkJLyogU3lzdGVtIENsb2NrIENvbnRyb2wgUmVnaXN0ZXJzICovCisJdTMyIHNjZnJbMl07CQkvKiBTeXN0ZW0gQ2xvY2sgRnJlcXVlbmN5IFJlZ2lzdGVycyAqLworCXU4IHJlczBbNF07CisJdTMyIGJjcjsJCS8qIEJyZWFkIENydW1iIFJlZ2lzdGVyICovCisJdTMyIHBzY2NjclsxMl07CQkvKiBQU0MwLTExIENsb2NrIENvbnRyb2wgUmVnaXN0ZXJzICovCisJdTMyIHNwY2NyOwkJLyogU1BESUYgQ2xvY2sgQ29udHJvbCBSZWdpc3RlcnMgKi8KKwl1MzIgY2NjcjsJCS8qIENGTSBDbG9jayBDb250cm9sIFJlZ2lzdGVycyAqLworCXUzMiBkY2NyOwkJLyogRElVIENsb2NrIENvbnRyb2wgUmVnaXN0ZXJzICovCisJdTggcmVzMVsweGE4XTsKK30gY2xrNTEyeF90OworCisvKgorICogUG93ZXIgTWFuYWdlbWVudCBDb250cm9sIE1vZHVsZQorICovCit0eXBlZGVmIHN0cnVjdCBwbWM1MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IHBtYzUxMnhfdDsKKworLyoKKyAqIEdlbmVyYWwgcHVycG9zZSBJL08gbW9kdWxlCisgKi8KK3R5cGVkZWYgc3RydWN0IGdwaW81MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IGdwaW81MTJ4X3Q7CisKKy8qCisgKiBERFIgTWVtb3J5IENvbnRyb2xsZXIgTWVtb3J5IE1hcAorICovCit0eXBlZGVmIHN0cnVjdCBkZHI1MTJ4IHsKKwl1MzIgZGRyX3N5c19jb25maWc7CS8qIFN5c3RlbSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJdTMyIGRkcl90aW1lX2NvbmZpZzA7CS8qIFRpbWluZyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJdTMyIGRkcl90aW1lX2NvbmZpZzE7CS8qIFRpbWluZyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJdTMyIGRkcl90aW1lX2NvbmZpZzI7CS8qIFRpbWluZyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJdTMyIGRkcl9jb21tYW5kOwkvKiBDb21tYW5kIFJlZ2lzdGVyICovCisJdTMyIGRkcl9jb21wYWN0X2NvbW1hbmQ7CS8qIENvbXBhY3QgQ29tbWFuZCBSZWdpc3RlciAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzA7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzE7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzI7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzM7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzQ7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzU7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzY7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBzZWxmX3JlZnJlc2hfY21kXzc7CS8qIEVudGVyL0V4aXQgU2VsZiBSZWZyZXNoIFJlZ2lzdGVycyAqLworCXUzMiBEUVNfY29uZmlnX29mZnNldF9jb3VudDsJLyogRFFTIENvbmZpZyBPZmZzZXQgQ291bnQgKi8KKwl1MzIgRFFTX2NvbmZpZ19vZmZzZXRfdGltZTsJLyogRFFTIENvbmZpZyBPZmZzZXQgVGltZSAqLworCXUzMiBEUVNfZGVsYXlfc3RhdHVzOwkvKiBEUVMgRGVsYXkgU3RhdHVzICovCisJdTMyIHJlczBbMHhGXTsKKwl1MzIgcHJpb21hbl9jb25maWcxOwkvKiBQcmlvcml0eSBNYW5hZ2VyIENvbmZpZ3VyYXRpb24gKi8KKwl1MzIgcHJpb21hbl9jb25maWcyOwkvKiBQcmlvcml0eSBNYW5hZ2VyIENvbmZpZ3VyYXRpb24gKi8KKwl1MzIgaGlwcmlvX2NvbmZpZzsJLyogSGlnaCBQcmlvcml0eSBDb25maWd1cmF0aW9uICovCisJdTMyIGx1dF90YWJsZTBfbWFpbl91cHBlcjsJLyogTFVUMCBNYWluIFVwcGVyICovCisJdTMyIGx1dF90YWJsZTFfbWFpbl91cHBlcjsJLyogTFVUMSBNYWluIFVwcGVyICovCisJdTMyIGx1dF90YWJsZTJfbWFpbl91cHBlcjsJLyogTFVUMiBNYWluIFVwcGVyICovCisJdTMyIGx1dF90YWJsZTNfbWFpbl91cHBlcjsJLyogTFVUMyBNYWluIFVwcGVyICovCisJdTMyIGx1dF90YWJsZTRfbWFpbl91cHBlcjsJLyogTFVUNCBNYWluIFVwcGVyICovCisJdTMyIGx1dF90YWJsZTBfbWFpbl9sb3dlcjsJLyogTFVUMCBNYWluIExvd2VyICovCisJdTMyIGx1dF90YWJsZTFfbWFpbl9sb3dlcjsJLyogTFVUMSBNYWluIExvd2VyICovCisJdTMyIGx1dF90YWJsZTJfbWFpbl9sb3dlcjsJLyogTFVUMiBNYWluIExvd2VyICovCisJdTMyIGx1dF90YWJsZTNfbWFpbl9sb3dlcjsJLyogTFVUMyBNYWluIExvd2VyICovCisJdTMyIGx1dF90YWJsZTRfbWFpbl9sb3dlcjsJLyogTFVUNCBNYWluIExvd2VyICovCisJdTMyIGx1dF90YWJsZTBfYWx0ZXJuYXRlX3VwcGVyOwkvKiBMVVQwIEFsdGVybmF0ZSBVcHBlciAqLworCXUzMiBsdXRfdGFibGUxX2FsdGVybmF0ZV91cHBlcjsgLyogTFVUMSBBbHRlcm5hdGUgVXBwZXIgKi8KKwl1MzIgbHV0X3RhYmxlMl9hbHRlcm5hdGVfdXBwZXI7IC8qIExVVDIgQWx0ZXJuYXRlIFVwcGVyICovCisJdTMyIGx1dF90YWJsZTNfYWx0ZXJuYXRlX3VwcGVyOyAvKiBMVVQzIEFsdGVybmF0ZSBVcHBlciAqLworCXUzMiBsdXRfdGFibGU0X2FsdGVybmF0ZV91cHBlcjsgLyogTFVUNCBBbHRlcm5hdGUgVXBwZXIgKi8KKwl1MzIgbHV0X3RhYmxlMF9hbHRlcm5hdGVfbG93ZXI7IC8qIExVVDAgQWx0ZXJuYXRlIExvd2VyICovCisJdTMyIGx1dF90YWJsZTFfYWx0ZXJuYXRlX2xvd2VyOyAvKiBMVVQxIEFsdGVybmF0ZSBMb3dlciAqLworCXUzMiBsdXRfdGFibGUyX2FsdGVybmF0ZV9sb3dlcjsgLyogTFVUMiBBbHRlcm5hdGUgTG93ZXIgKi8KKwl1MzIgbHV0X3RhYmxlM19hbHRlcm5hdGVfbG93ZXI7IC8qIExVVDMgQWx0ZXJuYXRlIExvd2VyICovCisJdTMyIGx1dF90YWJsZTRfYWx0ZXJuYXRlX2xvd2VyOyAvKiBMVVQ0IEFsdGVybmF0ZSBMb3dlciAqLworCXUzMiBwZXJmb3JtYW5jZV9tb25pdG9yX2NvbmZpZzsKKwl1MzIgZXZlbnRfdGltZV9jb3VudGVyOworCXUzMiBldmVudF90aW1lX3ByZXNldDsKKwl1MzIgcGVyZm9ybWFuY2VfbW9uaXRvcjFfYWRkcmVzc19sb3c7CisJdTMyIHBlcmZvcm1hbmNlX21vbml0b3IyX2FkZHJlc3NfbG93OworCXUzMiBwZXJmb3JtYW5jZV9tb25pdG9yMV9hZGRyZXNzX2hpOworCXUzMiBwZXJmb3JtYW5jZV9tb25pdG9yMl9hZGRyZXNzX2hpOworCXUzMiByZXMxWzJdOworCXUzMiBwZXJmb3JtYW5jZV9tb25pdG9yMV9yZWFkX2NvdW50ZXI7CisJdTMyIHBlcmZvcm1hbmNlX21vbml0b3IyX3JlYWRfY291bnRlcjsKKwl1MzIgcGVyZm9ybWFuY2VfbW9uaXRvcjFfd3JpdGVfY291bnRlcjsKKwl1MzIgcGVyZm9ybWFuY2VfbW9uaXRvcjJfd3JpdGVfY291bnRlcjsKKwl1MzIgZ3JhbnRlZF9hY2tfY291bnRlcjA7CisJdTMyIGdyYW50ZWRfYWNrX2NvdW50ZXIxOworCXUzMiBncmFudGVkX2Fja19jb3VudGVyMjsKKwl1MzIgZ3JhbnRlZF9hY2tfY291bnRlcjM7CisJdTMyIGdyYW50ZWRfYWNrX2NvdW50ZXI0OworCXUzMiBjdW11bGF0aXZlX3dhaXRfY291bnRlcjA7CisJdTMyIGN1bXVsYXRpdmVfd2FpdF9jb3VudGVyMTsKKwl1MzIgY3VtdWxhdGl2ZV93YWl0X2NvdW50ZXIyOworCXUzMiBjdW11bGF0aXZlX3dhaXRfY291bnRlcjM7CisJdTMyIGN1bXVsYXRpdmVfd2FpdF9jb3VudGVyNDsKKwl1MzIgc3VtbWVkX3ByaW9yaXR5X2NvdW50ZXIwOworCXUzMiBzdW1tZWRfcHJpb3JpdHlfY291bnRlcjE7CisJdTMyIHN1bW1lZF9wcmlvcml0eV9jb3VudGVyMjsKKwl1MzIgc3VtbWVkX3ByaW9yaXR5X2NvdW50ZXIzOworCXUzMiBzdW1tZWRfcHJpb3JpdHlfY291bnRlcjQ7CisJdTMyIHJlczJbMHgzQURdOworfSBkZHI1MTJ4X3Q7CisKKworLyoKKyAqIERNQS9NZXNzYWdpbmcgVW5pdAorICovCit0eXBlZGVmIHN0cnVjdCBkbWE1MTJ4IHsKKwl1OCBmaXhtZVsweDE4MDBdOworfSBkbWE1MTJ4X3Q7CisKKy8qCisgKiBQQ0kgU29mdHdhcmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGNpY29uZjUxMnggeworCXU4IGZpeG1lWzB4ODBdOworfSBwY2ljb25mNTEyeF90OworCisvKgorICogU2VxdWVuY2VyCisgKi8KK3R5cGVkZWYgc3RydWN0IGlvczUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gaW9zNTEyeF90OworCisvKgorICogUENJIENvbnRyb2xsZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGNpY3RybDUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gcGNpY3RybDUxMnhfdDsKKworCisvKgorICogTVNDQU4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbXNjYW41MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IG1zY2FuNTEyeF90OworCisvKgorICogQkRMQworICovCit0eXBlZGVmIHN0cnVjdCBiZGxjNTEyeCB7CisJdTggZml4bWVbMHgxMDBdOworfSBiZGxjNTEyeF90OworCisvKgorICogU0RIQworICovCit0eXBlZGVmIHN0cnVjdCBzZGhjNTEyeCB7CisJdTggZml4bWVbMHgxMDBdOworfSBzZGhjNTEyeF90OworCisvKgorICogU1BESUYKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc3BkaWY1MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IHNwZGlmNTEyeF90OworCisvKgorICogSTJDCisgKi8KK3R5cGVkZWYgc3RydWN0IGkyYzUxMnhfZGV2IHsKKwl2b2xhdGlsZSB1MzIgbWFkcjsJCS8qIEkyQ24gKyAweDAwICovCisJdm9sYXRpbGUgdTMyIG1mZHI7CQkvKiBJMkNuICsgMHgwNCAqLworCXZvbGF0aWxlIHUzMiBtY3I7CQkvKiBJMkNuICsgMHgwOCAqLworCXZvbGF0aWxlIHUzMiBtc3I7CQkvKiBJMkNuICsgMHgwQyAqLworCXZvbGF0aWxlIHUzMiBtZHI7CQkvKiBJMkNuICsgMHgxMCAqLworCXU4IHJlczBbMHgwQ107Cit9IGkyYzUxMnhfZGV2X3Q7CisKK3R5cGVkZWYgc3RydWN0IGkyYzUxMnggeworCWkyYzUxMnhfZGV2X3QgZGV2WzNdOworCXZvbGF0aWxlIHUzMiBpY3I7CisJdm9sYXRpbGUgdTMyIG1pZnI7CisJdTggcmVzMFsweDk4XTsKK30gaTJjNTEyeF90OworCisvKgorICogQVhFCisgKi8KK3R5cGVkZWYgc3RydWN0IGF4ZTUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gYXhlNTEyeF90OworCisvKgorICogRElVCisgKi8KK3R5cGVkZWYgc3RydWN0IGRpdTUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gZGl1NTEyeF90OworCisvKgorICogQ0ZNCisgKi8KK3R5cGVkZWYgc3RydWN0IGNmbTUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gY2ZtNTEyeF90OworCisvKgorICogRkVDCisgKi8KK3R5cGVkZWYgc3RydWN0IGZlYzUxMnggeworCXU4IGZpeG1lWzB4ODAwXTsKK30gZmVjNTEyeF90OworCisvKgorICogVUxQSQorICovCit0eXBlZGVmIHN0cnVjdCB1bHBpNTEyeCB7CisJdTggZml4bWVbMHg2MDBdOworfSB1bHBpNTEyeF90OworCisvKgorICogVVRNSQorICovCit0eXBlZGVmIHN0cnVjdCB1dG1pNTEyeCB7CisJdTggZml4bWVbMHgzMDAwXTsKK30gdXRtaTUxMnhfdDsKKworLyoKKyAqIFBDSSBETUEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGNpZG1hNTEyeCB7CisJdTggZml4bWVbMHgzMDBdOworfSBwY2lkbWE1MTJ4X3Q7CisKKy8qCisgKiBJTyBDb250cm9sCisgKi8KK3R5cGVkZWYgc3RydWN0IGlvY3RybDUxMnggeworCXUzMiByZWdzWzB4NDAwXTsKK30gaW9jdHJsNTEyeF90OworCisvKgorICogSUlNCisgKi8KK3R5cGVkZWYgc3RydWN0IGlpbTUxMnggeworCXU4IGZpeG1lWzB4MTAwMF07Cit9IGlpbTUxMnhfdDsKKworLyoKKyAqIExQQworICovCit0eXBlZGVmIHN0cnVjdCBscGM1MTJ4IHsKKwl1MzIJY3NfY2ZnWzhdOwkvKiBDaGlwIFNlbGVjdCBOIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzCisJCQkJICAgTm8gZGVkaWNhdGVkIGVudHJ5IGZvciBDUyBCb290IGFzID09IENTMCAqLworCXUzMgljc19jcjsJCS8qIENoaXAgU2VsZWN0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1MzIJY3Nfc3I7CQkvKiBDaGlwIFNlbGVjdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1MzIJY3NfYmNyOwkJLyogQ2hpcCBTZWxlY3QgQnVyc3QgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMgljc19kY2NyOwkvKiBDaGlwIFNlbGVjdCBEZWFkY3ljbGUgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMgljc19oY2NyOwkvKiBDaGlwIFNlbGVjdCBIb2xkY3ljbGUgQ29udHJvbCBSZWdpc3RlciAqLworCXU4CXJlczBbMHhjY107CisJdTMyCXNjbHBjX3BzcjsJLyogU0NMUEMgUGFja2V0IFNpemUgUmVnaXN0ZXIgKi8KKwl1MzIJc2NscGNfc2FyOwkvKiBTQ0xQQyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisJdTMyCXNjbHBjX2NyOwkvKiBTQ0xQQyBDb250cm9sIFJlZ2lzdGVyICovCisJdTMyCXNjbHBjX2VyOwkvKiBTQ0xQQyBFbmFibGUgUmVnaXN0ZXIgKi8KKwl1MzIJc2NscGNfbmFyOwkvKiBTQ0xQQyBOZXh0QWRkcmVzcyBSZWdpc3RlciAqLworCXUzMglzY2xwY19zcjsJLyogU0NMUEMgU3RhdHVzIFJlZ2lzdGVyICovCisJdTMyCXNjbHBjX2JkcjsJLyogU0NMUEMgQnl0ZXMgRG9uZSBSZWdpc3RlciAqLworCXUzMgllbWJfc2NyOwkvKiBFTUIgU2hhcmUgQ291bnRlciBSZWdpc3RlciAqLworCXUzMgllbWJfcGNyOwkvKiBFTUIgUGF1c2UgQ29udHJvbCBSZWdpc3RlciAqLworCXU4CXJlczFbMHgxY107CisJdTMyCWxwY19mZHdyOwkvKiBMUEMgUlgvVFggRklGTyBEYXRhIFdvcmQgUmVnaXN0ZXIgKi8KKwl1MzIJbHBjX2ZzcjsJLyogTFBDIFJYL1RYIEZJRk8gU3RhdHVzIFJlZ2lzdGVyICovCisJdTMyCWxwY19jcjsJCS8qIExQQyBSWC9UWCBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1MzIJbHBjX2FyOwkJLyogTFBDIFJYL1RYIEZJRk8gQWxhcm0gUmVnaXN0ZXIgKi8KKwl1OAlyZXMyWzB4YjBdOworfSBscGM1MTJ4X3Q7CisKKy8qCisgKiBQQVRBCisgKi8KK3R5cGVkZWYgc3RydWN0IHBhdGE1MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IHBhdGE1MTJ4X3Q7CisKKy8qCisgKiBQU0MKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcHNjNTEyeCB7CisJdm9sYXRpbGUgdTgJbW9kZTsJCS8qIFBTQyArIDB4MDAgKi8KKwl2b2xhdGlsZSB1OAlyZXMwWzNdOworCXVuaW9uIHsJCQkJLyogUFNDICsgMHgwNCAqLworCQl2b2xhdGlsZSB1MTYJc3RhdHVzOworCQl2b2xhdGlsZSB1MTYJY2xvY2tfc2VsZWN0OworCX0gc3JfY3NyOworI2RlZmluZSBwc2Nfc3RhdHVzCXNyX2Nzci5zdGF0dXMKKyNkZWZpbmUgcHNjX2Nsb2NrX3NlbGVjdCBzcl9jc3IuY2xvY2tfc2VsZWN0CisJdm9sYXRpbGUgdTE2CXJlczE7CisJdm9sYXRpbGUgdTgJY29tbWFuZDsJLyogUFNDICsgMHgwOCAqLworCXZvbGF0aWxlIHU4CXJlczJbM107CisJdW5pb24gewkJCQkvKiBQU0MgKyAweDBjICovCisJCXZvbGF0aWxlIHU4CWJ1ZmZlcl84OworCQl2b2xhdGlsZSB1MTYJYnVmZmVyXzE2OworCQl2b2xhdGlsZSB1MzIJYnVmZmVyXzMyOworCX0gYnVmZmVyOworI2RlZmluZSBwc2NfYnVmZmVyXzgJYnVmZmVyLmJ1ZmZlcl84CisjZGVmaW5lIHBzY19idWZmZXJfMTYJYnVmZmVyLmJ1ZmZlcl8xNgorI2RlZmluZSBwc2NfYnVmZmVyXzMyCWJ1ZmZlci5idWZmZXJfMzIKKwl1bmlvbiB7CQkJCS8qIFBTQyArIDB4MTAgKi8KKwkJdm9sYXRpbGUgdTgJaXBjcjsKKwkJdm9sYXRpbGUgdTgJYWNyOworCX0gaXBjcl9hY3I7CisjZGVmaW5lIHBzY19pcGNyCWlwY3JfYWNyLmlwY3IKKyNkZWZpbmUgcHNjX2FjcgkJaXBjcl9hY3IuYWNyCisJdm9sYXRpbGUgdTgJcmVzM1szXTsKKwl1bmlvbiB7CQkJCS8qIFBTQyArIDB4MTQgKi8KKwkJdm9sYXRpbGUgdTE2CWlzcjsKKwkJdm9sYXRpbGUgdTE2CWltcjsKKwl9IGlzcl9pbXI7CisjZGVmaW5lIHBzY19pc3IJCWlzcl9pbXIuaXNyCisjZGVmaW5lIHBzY19pbXIJCWlzcl9pbXIuaW1yCisJdm9sYXRpbGUgdTE2CXJlczQ7CisJdm9sYXRpbGUgdTgJY3R1cjsJCS8qIFBTQyArIDB4MTggKi8KKwl2b2xhdGlsZSB1OAlyZXM1WzNdOworCXZvbGF0aWxlIHU4CWN0bHI7CQkvKiBQU0MgKyAweDFjICovCisJdm9sYXRpbGUgdTgJcmVzNlszXTsKKwl2b2xhdGlsZSB1MzIJY2NyOwkJLyogUFNDICsgMHgyMCAqLworCXZvbGF0aWxlIHU4CXJlczdbMTJdOworCXZvbGF0aWxlIHU4CWl2cjsJCS8qIFBTQyArIDB4MzAgKi8KKwl2b2xhdGlsZSB1OAlyZXM4WzNdOworCXZvbGF0aWxlIHU4CWlwOwkJLyogUFNDICsgMHgzNCAqLworCXZvbGF0aWxlIHU4CXJlczlbM107CisJdm9sYXRpbGUgdTgJb3AxOwkJLyogUFNDICsgMHgzOCAqLworCXZvbGF0aWxlIHU4CXJlczEwWzNdOworCXZvbGF0aWxlIHU4CW9wMDsJCS8qIFBTQyArIDB4M2MgKi8KKwl2b2xhdGlsZSB1OAlyZXMxMVszXTsKKwl2b2xhdGlsZSB1MzIJc2ljcjsJCS8qIFBTQyArIDB4NDAgKi8KKwl2b2xhdGlsZSB1OAlyZXMxMls2MF07CisJdm9sYXRpbGUgdTMyCXRmY21kOwkJLyogUFNDICsgMHg4MCAqLworCXZvbGF0aWxlIHUzMgl0ZmFsYXJtOwkvKiBQU0MgKyAweDg0ICovCisJdm9sYXRpbGUgdTMyCXRmc3RhdDsJCS8qIFBTQyArIDB4ODggKi8KKwl2b2xhdGlsZSB1MzIJdGZpbnRzdGF0OwkvKiBQU0MgKyAweDhDICovCisJdm9sYXRpbGUgdTMyCXRmaW50bWFzazsJLyogUFNDICsgMHg5MCAqLworCXZvbGF0aWxlIHUzMgl0ZmNvdW50OwkvKiBQU0MgKyAweDk0ICovCisJdm9sYXRpbGUgdTE2CXRmd3B0cjsJCS8qIFBTQyArIDB4OTggKi8KKwl2b2xhdGlsZSB1MTYJdGZycHRyOwkJLyogUFNDICsgMHg5QSAqLworCXZvbGF0aWxlIHUzMgl0ZnNpemU7CQkvKiBQU0MgKyAweDlDICovCisJdm9sYXRpbGUgdTgJcmVzMTNbMjhdOworCXVuaW9uIHsJCQkJLyogUFNDICsgMHhCQyAqLworCQl2b2xhdGlsZSB1OAlidWZmZXJfODsKKwkJdm9sYXRpbGUgdTE2CWJ1ZmZlcl8xNjsKKwkJdm9sYXRpbGUgdTMyCWJ1ZmZlcl8zMjsKKwl9IHRmZGF0YV9idWZmZXI7CisjZGVmaW5lIHRmZGF0YV84CXRmZGF0YV9idWZmZXIuYnVmZmVyXzgKKyNkZWZpbmUgdGZkYXRhXzE2CXRmZGF0YV9idWZmZXIuYnVmZmVyXzE2CisjZGVmaW5lIHRmZGF0YV8zMgl0ZmRhdGFfYnVmZmVyLmJ1ZmZlcl8zMgorCisJdm9sYXRpbGUgdTMyCXJmY21kOwkJLyogUFNDICsgMHhDMCAqLworCXZvbGF0aWxlIHUzMglyZmFsYXJtOwkvKiBQU0MgKyAweEM0ICovCisJdm9sYXRpbGUgdTMyCXJmc3RhdDsJCS8qIFBTQyArIDB4QzggKi8KKwl2b2xhdGlsZSB1MzIJcmZpbnRzdGF0OwkvKiBQU0MgKyAweENDICovCisJdm9sYXRpbGUgdTMyCXJmaW50bWFzazsJLyogUFNDICsgMHhEMCAqLworCXZvbGF0aWxlIHUzMglyZmNvdW50OwkvKiBQU0MgKyAweEQ0ICovCisJdm9sYXRpbGUgdTE2CXJmd3B0cjsJCS8qIFBTQyArIDB4RDggKi8KKwl2b2xhdGlsZSB1MTYJcmZycHRyOwkJLyogUFNDICsgMHhEQSAqLworCXZvbGF0aWxlIHUzMglyZnNpemU7CQkvKiBQU0MgKyAweERDICovCisJdm9sYXRpbGUgdTgJcmVzMThbMjhdOworCXVuaW9uIHsJCQkJLyogUFNDICsgMHhGQyAqLworCQl2b2xhdGlsZSB1OAlidWZmZXJfODsKKwkJdm9sYXRpbGUgdTE2CWJ1ZmZlcl8xNjsKKwkJdm9sYXRpbGUgdTMyCWJ1ZmZlcl8zMjsKKwl9IHJmZGF0YV9idWZmZXI7CisjZGVmaW5lIHJmZGF0YV84CXJmZGF0YV9idWZmZXIuYnVmZmVyXzgKKyNkZWZpbmUgcmZkYXRhXzE2CXJmZGF0YV9idWZmZXIuYnVmZmVyXzE2CisjZGVmaW5lIHJmZGF0YV8zMglyZmRhdGFfYnVmZmVyLmJ1ZmZlcl8zMgorfSBwc2M1MTJ4X3Q7CisKKy8qCisgKiBGSUZPQworICovCit0eXBlZGVmIHN0cnVjdCBmaWZvYzUxMnggeworCXUzMiBmaWZvY19jbWQ7CisJdTMyIGZpZm9jX2ludDsKKwl1MzIgZmlmb2NfZG1hOworCXUzMiBmaWZvY19heGU7CisJdTMyIGZpZm9jX2RlYnVnOworCXU4IGZpeG1lWzB4RUNdOworfSBmaWZvYzUxMnhfdDsKKworLyoKKyAqIFNBVEEKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc2F0YTUxMnggeworCXU4IGZpeG1lWzB4MjAwMF07Cit9IHNhdGE1MTJ4X3Q7CisKK3R5cGVkZWYgc3RydWN0IGltbWFwIHsKKwlzeXNjb25mNTEyeF90CQlzeXNjb25mOwkvKiBTeXN0ZW0gY29uZmlndXJhdGlvbiAqLworCXU4CQkJcmVzMFsweDcwMF07CisJd2R0NTEyeF90CQl3ZHQ7CQkvKiBXYXRjaCBEb2cgVGltZXIgKFdEVCkgKi8KKwlydGNsazUxMnhfdAkJcnRjOwkJLyogUmVhbCBUaW1lIENsb2NrIE1vZHVsZSAqLworCWdwdDUxMnhfdAkJZ3B0OwkJLyogR2VuZXJhbCBQdXJwb3NlIFRpbWVyICovCisJaXBpYzUxMnhfdAkJaXBpYzsJCS8qIEludGVncmF0ZWQgUHJvZ3JhbW1hYmxlIEludGVycnVwdCBDb250cm9sbGVyICovCisJYXJiaXRlcjUxMnhfdAkJYXJiaXRlcjsJLyogQ1NCIEFyYml0ZXIgKi8KKwlyZXNldDUxMnhfdAkJcmVzZXQ7CQkvKiBSZXNldCBNb2R1bGUgKi8KKwljbGs1MTJ4X3QJCWNsazsJCS8qIENsb2NrIE1vZHVsZSAqLworCXBtYzUxMnhfdAkJcG1jOwkJLyogUG93ZXIgTWFuYWdlbWVudCBDb250cm9sIE1vZHVsZSAqLworCWdwaW81MTJ4X3QJCWdwaW87CQkvKiBHZW5lcmFsIHB1cnBvc2UgSS9PIG1vZHVsZSAqLworCXU4CQkJcmVzMVsweDEwMF07CisJbXNjYW41MTJ4X3QJCW1zY2FuOwkJLyogTVNDQU4gKi8KKwliZGxjNTEyeF90CQliZGxjOwkJLyogQkRMQyAqLworCXNkaGM1MTJ4X3QJCXNkaGM7CQkvKiBTREhDICovCisJc3BkaWY1MTJ4X3QJCXNwZGlmOwkJLyogU1BESUYgKi8KKwlpMmM1MTJ4X3QJCWkyYzsJCS8qIEkyQyBDb250cm9sbGVycyAqLworCXU4CQkJcmVzMlsweDgwMF07CisJYXhlNTEyeF90CQlheGU7CQkvKiBBWEUgKi8KKwlkaXU1MTJ4X3QJCWRpdTsJCS8qIERpc3BsYXkgSW50ZXJmYWNlIFVuaXQgKi8KKwljZm01MTJ4X3QJCWNmbTsJCS8qIENsb2NrIEZyZXF1ZW5jeSBNZWFzdXJlbWVudCAqLworCXU4CQkJcmVzM1sweDUwMF07CisJZmVjNTEyeF90CQlmZWM7CQkvKiBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKwl1bHBpNTEyeF90CQl1bHBpOwkJLyogVVNCIFVMUEkgKi8KKwl1OAkJCXJlczRbMHhhMDBdOworCXV0bWk1MTJ4X3QJCXV0bWk7CQkvKiBVU0IgVVRNSSAqLworCXU4CQkJcmVzNVsweDEwMDBdOworCXBjaWRtYTUxMnhfdAkJcGNpX2RtYTsJLyogUENJIERNQSAqLworCXBjaWNvbmY1MTJ4X3QJCXBjaV9jb25mOwkvKiBQQ0kgQ29uZmlndXJhdGlvbiAqLworCXU4CQkJcmVzNlsweDgwXTsKKwlpb3M1MTJ4X3QJCWlvczsJCS8qIFBDSSBTZXF1ZW5jZXIgKi8KKwlwY2ljdHJsNTEyeF90CQlwY2lfY3RybDsJLyogUENJIENvbnRyb2xsZXIgQ29udHJvbCBhbmQgU3RhdHVzICovCisJdTgJCQlyZXM3WzB4YTAwXTsKKwlkZHI1MTJ4X3QJCW1kZHJjOwkJLyogTXVsdGktcG9ydCBERFIgTWVtb3J5IENvbnRyb2xsZXIgKi8KKwlpb2N0cmw1MTJ4X3QJCWlvX2N0cmw7CS8qIElPIENvbnRyb2wgKi8KKwlpaW01MTJ4X3QJCWlpbTsJCS8qIElDIElkZW50aWZpY2F0aW9uIG1vZHVsZSAqLworCXU4CQkJcmVzOFsweDQwMDBdOworCWxwYzUxMnhfdAkJbHBjOwkJLyogTG9jYWxQbHVzIENvbnRyb2xsZXIgKi8KKwlwYXRhNTEyeF90CQlwYXRhOwkJLyogUGFyYWxsZWwgQVRBICovCisJdTgJCQlyZXM5WzB4ZDAwXTsKKwlwc2M1MTJ4X3QJCXBzY1sxMl07CS8qIFBTQ3MgKi8KKwl1OAkJCXJlczEwWzB4MzAwXTsKKwlmaWZvYzUxMnhfdAkJZmlmb2M7CQkvKiBGSUZPIENvbnRyb2xsZXIgKi8KKwl1OAkJCXJlczExWzB4MjAwMF07CisJZG1hNTEyeF90CQlkbWE7CQkvKiBETUEgKi8KKwl1OAkJCXJlczEyWzB4YTgwMF07CisJc2F0YTUxMnhfdAkJc2F0YTsJCS8qIFNlcmlhbCBBVEEgKi8KKwl1OAkJCXJlczEzWzB4ZGUwMDBdOworfSBpbW1hcF90OworI2VuZGlmIC8qIF9fSU1NQVBfNTEyeF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvaW1tYXBfODV4eC5oIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwXzg1eHguaAppbmRleCA1Mzc3YzJlLi4zZDQ4MTZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvaW1tYXBfODV4eC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF84NXh4LmgKQEAgLTEsNiArMSw4IEBACiAvKgogICogTVBDODV4eCBJbnRlcm5hbCBNZW1vcnkgTWFwCiAgKgorICogQ29weXJpZ2h0IDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisgKgogICogQ29weXJpZ2h0KGMpIDIwMDIsMjAwMyBNb3Rvcm9sYSBJbmMuCiAgKiBYaWFuZ2h1YSBYaWFvICh4LnhpYW9AbW90b3JvbGEuY29tKQogICoKQEAgLTE1MjAsMTQgKzE1MjIsMzkgQEAKIAljaGFyCXJlczU4WzYwMTc2XTsKIH0gY2Nzcl9yaW9fdDsKIAorLyogUXVpY2sgRW5naW5lIEJsb2NrIFBpbiBNdXhpbmcgUmVnaXN0ZXJzICgweGVfMDEwMCAtIDB4ZV8wMWJmKSAqLwordHlwZWRlZiBzdHJ1Y3QgcGFyX2lvIHsKKwl1aW50CWNwb2RyOwkJLyogMHgxMDAgKi8KKwl1aW50CWNwZGF0OwkJLyogMHgxMDQgKi8KKwl1aW50CWNwZGlyMTsJCS8qIDB4MTA4ICovCisJdWludAljcGRpcjI7CQkvKiAweDEwYyAqLworCXVpbnQJY3BwYXIxOwkJLyogMHgxMTAgKi8KKwl1aW50CWNwcGFyMjsJCS8qIDB4MTE0ICovCisJY2hhcglyZXNbOF07Cit9cGFyX2lvX3Q7CisKIC8qCiAgKiBHbG9iYWwgVXRpbGl0aWVzIFJlZ2lzdGVyIEJsb2NrKDB4ZV8wMDAwLTB4Zl9mZmZmKQogICovCiB0eXBlZGVmIHN0cnVjdCBjY3NyX2d1ciB7CiAJdWludAlwb3JwbGxzcjsJLyogMHhlMDAwMCAtIFBPUiBQTEwgcmF0aW8gc3RhdHVzIHJlZ2lzdGVyICovCiAJdWludAlwb3JibXNyOwkvKiAweGUwMDA0IC0gUE9SIGJvb3QgbW9kZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVBDODV4eF9QT1JCTVNSX0hBIAkJMHgwMDA3MDAwMAogCXVpbnQJcG9yaW1wc2NyOwkvKiAweGUwMDA4IC0gUE9SIEkvTyBpbXBlZGFuY2Ugc3RhdHVzIGFuZCBjb250cm9sIHJlZ2lzdGVyICovCiAJdWludAlwb3JkZXZzcjsJLyogMHhlMDAwYyAtIFBPUiBJL08gZGV2aWNlIHN0YXR1cyByZWdzaXRlciAqLworI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX1NHTUlJMV9ESVMJMHgyMDAwMDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX1NHTUlJMl9ESVMJMHgxMDAwMDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX1NHTUlJM19ESVMJMHgwODAwMDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX1NHTUlJNF9ESVMJMHgwNDAwMDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX0lPX1NFTAkJMHgwMDM4MDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX1BDSTJfQVJCIAkweDAwMDQwMDAwCisjZGVmaW5lIE1QQzg1eHhfUE9SREVWU1JfUENJMV9BUkIgCTB4MDAwMjAwMDAKKyNkZWZpbmUgTVBDODV4eF9QT1JERVZTUl9QQ0kxX1BDSTMyIAkweDAwMDEwMDAwCisjZGVmaW5lIE1QQzg1eHhfUE9SREVWU1JfUENJMV9TUEQgCTB4MDAwMDgwMDAKKyNkZWZpbmUgTVBDODV4eF9QT1JERVZTUl9QQ0kyX1NQRCAJMHgwMDAwNDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX0RSQU1fUlRZUEUJMHgwMDAwMDA2MAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX1JJT19DVExTIAkweDAwMDAwMDA4CisjZGVmaW5lIE1QQzg1eHhfUE9SREVWU1JfUklPX0RFVl9JRAkweDAwMDAwMDA3CiAJdWludAlwb3JkYmdtc3I7CS8qIDB4ZTAwMTAgLSBQT1IgZGVidWcgbW9kZSBzdGF0dXMgcmVnaXN0ZXIgKi8KIAljaGFyCXJlczFbMTJdOwogCXVpbnQJZ3Bwb3JjcjsJLyogMHhlMDAyMCAtIEdlbmVyYWwtcHVycG9zZSBQT1IgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwpAQCAtMTU0MSw2ICsxNTY4LDI1IEBACiAJdWludAlwbXV4Y3I7CQkvKiAweGUwMDYwIC0gQWx0ZXJuYXRlIGZ1bmN0aW9uIHNpZ25hbCBtdWx0aXBsZXggY29udHJvbCAqLwogCWNoYXIJcmVzNlsxMl07CiAJdWludAlkZXZkaXNyOwkvKiAweGUwMDcwIC0gRGV2aWNlIGRpc2FibGUgY29udHJvbCAqLworI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfUENJMQkJMHg4MDAwMDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfUENJMgkJMHg0MDAwMDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfUENJRQkJMHgyMDAwMDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfTEJDCQkweDA4MDAwMDAwCisjZGVmaW5lIE1QQzg1eHhfREVWRElTUl9QQ0lFMgkJMHgwNDAwMDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfUENJRTMJCTB4MDIwMDAwMDAKKyNkZWZpbmUgTVBDODV4eF9ERVZESVNSX1NFQwkJMHgwMTAwMDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfU1JJTwkJMHgwMDA4MDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfUk1TRwkJMHgwMDA0MDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfRERSIAkJMHgwMDAxMDAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfQ1BVIAkJMHgwMDAwODAwMAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfVEIgCQkweDAwMDA0MDAwCisjZGVmaW5lIE1QQzg1eHhfREVWRElTUl9ETUEJCTB4MDAwMDA0MDAKKyNkZWZpbmUgTVBDODV4eF9ERVZESVNSX1RTRUMxCQkweDAwMDAwMDgwCisjZGVmaW5lIE1QQzg1eHhfREVWRElTUl9UU0VDMgkJMHgwMDAwMDA0MAorI2RlZmluZSBNUEM4NXh4X0RFVkRJU1JfVFNFQzMJCTB4MDAwMDAwMjAKKyNkZWZpbmUgTVBDODV4eF9ERVZESVNSX1RTRUM0CQkweDAwMDAwMDEwCisjZGVmaW5lIE1QQzg1eHhfREVWRElTUl9JMkMJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTVBDODV4eF9ERVZESVNSX0RVQVJUCQkweDAwMDAwMDAyCiAJY2hhcglyZXM3WzEyXTsKIAl1aW50CXBvd21ndGNzcjsJLyogMHhlMDA4MCAtIFBvd2VyIG1hbmFnZW1lbnQgc3RhdHVzIGFuZCBjb250cm9sIHJlZ2lzdGVyICovCiAJY2hhcglyZXM4WzEyXTsKQEAgLTE1NDgsNyArMTU5NCwxNSBAQAogCWNoYXIJcmVzOVsxMl07CiAJdWludAlwdnI7CQkvKiAweGUwMGEwIC0gUHJvY2Vzc29yIHZlcnNpb24gcmVnaXN0ZXIgKi8KIAl1aW50CXN2cjsJCS8qIDB4ZTAwYTQgLSBTeXN0ZW0gdmVyc2lvbiByZWdpc3RlciAqLwotCWNoYXIJcmVzMTBbMzQxNl07CisJY2hhcglyZXMxMGFbOF07CisJdWludAlyc3RjcjsJCS8qIDB4ZTAwYjAgLSBSZXNldCBjb250cm9sIHJlZ2lzdGVyICovCisjaWZkZWYgTVBDODU2OAorCWNoYXIJcmVzMTBiWzc2XTsKKwlwYXJfaW9fdCBxZV9wYXJfaW9bN107ICAvKiAweGUwMTAwIC0gMHhlMDFiZiAqLworCWNoYXIJcmVzMTBjWzMxMzZdOworI2Vsc2UKKwljaGFyCXJlczEwYlszNDA0XTsKKyNlbmRpZgogCXVpbnQJY2xrb2NyOwkJLyogMHhlMGUwMCAtIENsb2NrIG91dCBzZWxlY3QgcmVnaXN0ZXIgKi8KIAljaGFyCXJlczExWzEyXTsKIAl1aW50CWRkcmRsbGNyOwkvKiAweGUwZTEwIC0gRERSIERMTCBjb250cm9sIHJlZ2lzdGVyICovCkBAIC0xNTYwLDcgKzE2MTQsNyBAQAogCXVpbnQJZGRyaW9vdmNyOwkvKiAweGUwZjI0IC0gRERSIElPIE92ZXJyaWRlIENvbnRyb2wgKi8KIAl1aW50CXJlczE0OwkJLyogMHhlMGYyOCAqLwogCXVpbnQJdHNlYzM0aW9vdmNyOwkvKiAweGUwZjJjIC0gZVRTRUMgMy80IElPIG92ZXJyaWRlIGNvbnRyb2wgKi8KLQljaGFyCXJlczE1WzYxNjUxXTsKKwljaGFyCXJlczE1WzYxNjQ4XTsJLyogMHhlMGYzMCB0byAweGVmZmZmZiAqLwogfSBjY3NyX2d1cl90OwogCiAjZGVmaW5lIFBPUkRFVlNSX1BDSQkoMHgwMDgwMDAwMCkJLyogUENJIE1vZGUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF84Nnh4LmggYi9pbmNsdWRlL2FzbS1wcGMvaW1tYXBfODZ4eC5oCmluZGV4IDBlM2ZjMzQuLjE2OTcyNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF84Nnh4LmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwXzg2eHguaApAQCAtMTI1Nyw5ICsxMjU3LDEyIEBACiAJdWludAlwb3JwbGxzcjsJLyogMHhlMDAwMCAtIFBPUiBQTEwgcmF0aW8gc3RhdHVzIHJlZ2lzdGVyICovCiAJdWludAlwb3JibXNyOwkvKiAweGUwMDA0IC0gUE9SIGJvb3QgbW9kZSBzdGF0dXMgcmVnaXN0ZXIgKi8KICNkZWZpbmUgTVBDODZ4eF9QT1JCTVNSX0hBICAgICAgMHgwMDA2MDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkJNU1JfSEEJCTB4MDAwNzAwMDAKIAl1aW50CXBvcmltcHNjcjsJLyogMHhlMDAwOCAtIFBPUiBJL08gaW1wZWRhbmNlIHN0YXR1cyBhbmQgY29udHJvbCByZWdpc3RlciAqLwogCXVpbnQJcG9yZGV2c3I7CS8qIDB4ZTAwMGMgLSBQT1IgSS9PIGRldmljZSBzdGF0dXMgcmVnc2l0ZXIgKi8KLSNkZWZpbmUgTVBDODZ4eF9QT1JERVZTUl9JT19TRUwgMHgwMDBGMDAwMAorI2RlZmluZSBNUEM4Nnh4X1BPUkRFVlNSX0lPX1NFTAkJMHgwMDBGMDAwMAorI2RlZmluZSBNUEM4NXh4X1BPUkRFVlNSX0lPX1NFTAkJMHgwMDM4MDAwMCAvKiA4NXh4IHBsYXRmb3JtIHR5cGUgKi8KKyNkZWZpbmUgTVBDODZ4eF9QT1JERVZTUl9DT1JFMVRFCTB4MDAwMDAwODAgLyogQVNNUCAoQ29yZTEgYWRkciB0cmFucykgKi8KIAl1aW50CXBvcmRiZ21zcjsJLyogMHhlMDAxMCAtIFBPUiBkZWJ1ZyBtb2RlIHN0YXR1cyByZWdpc3RlciAqLwogCWNoYXIJcmVzMVsxMl07CiAJdWludAlncHBvcmNyOwkvKiAweGUwMDIwIC0gR2VuZXJhbC1wdXJwb3NlIFBPUiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCkBAIC0xMjczLDggKzEyNzYsMTEgQEAKIAl1aW50CXBtdXhjcjsJCS8qIDB4ZTAwNjAgLSBBbHRlcm5hdGUgZnVuY3Rpb24gc2lnbmFsIG11bHRpcGxleCBjb250cm9sICovCiAJY2hhcglyZXM2WzEyXTsKIAl1aW50CWRldmRpc3I7CS8qIDB4ZTAwNzAgLSBEZXZpY2UgZGlzYWJsZSBjb250cm9sICovCi0jZGVmaW5lIE1QQzg2eHhfREVWRElTUl9QQ0lFWDEgIDB4ODAwMDAwMDAKLSNkZWZpbmUgTVBDODZ4eF9ERVZESVNSX1BDSUVYMiAgMHg0MDAwMDAwMAorI2RlZmluZSBNUEM4Nnh4X0RFVkRJU1JfUENJRVgxCTB4ODAwMDAwMDAKKyNkZWZpbmUgTVBDODZ4eF9ERVZESVNSX1BDSUVYMgkweDQwMDAwMDAwCisjZGVmaW5lIE1QQzg2eHhfREVWRElTUl9QQ0kxCTB4ODAwMDAwMDAKKyNkZWZpbmUgTVBDODZ4eF9ERVZESVNSX1BDSUUxCTB4NDAwMDAwMDAKKyNkZWZpbmUgTVBDODZ4eF9ERVZESVNSX1BDSUUyCTB4MjAwMDAwMDAKIAljaGFyCXJlczdbMTJdOwogCXVpbnQJcG93bWd0Y3NyOwkvKiAweGUwMDgwIC0gUG93ZXIgbWFuYWdlbWVudCBzdGF0dXMgYW5kIGNvbnRyb2wgcmVnaXN0ZXIgKi8KIAljaGFyCXJlczhbMTJdOwpAQCAtMTI4Miw3ICsxMjg4LDkgQEAKIAljaGFyCXJlczlbMTJdOwogCXVpbnQJcHZyOwkJLyogMHhlMDBhMCAtIFByb2Nlc3NvciB2ZXJzaW9uIHJlZ2lzdGVyICovCiAJdWludAlzdnI7CQkvKiAweGUwMGE0IC0gU3lzdGVtIHZlcnNpb24gcmVnaXN0ZXIgKi8KLQljaGFyCXJlczEwWzM0MTZdOworCWNoYXIJcmVzMTBhWzE4ODBdOworCXVpbnQJY2xrZHZkcjsJLyogMHhlMDgwMCAtIENsb2NrIERpdmlkZSByZWdpc3RlciAqLworCWNoYXIJcmVzMTBiWzE1MzJdOwogCXVpbnQJY2xrb2NyOwkJLyogMHhlMGUwMCAtIENsb2NrIG91dCBzZWxlY3QgcmVnaXN0ZXIgKi8KIAljaGFyCXJlczExWzEyXTsKIAl1aW50CWRkcmRsbGNyOwkvKiAweGUwZTEwIC0gRERSIERMTCBjb250cm9sIHJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvaW1tYXBfZnNsX3BjaS5oIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwX2ZzbF9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDczMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwX2ZzbF9wY2kuaApAQCAtMCwwICsxLDE1MCBAQAorLyogKEMpIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19JTU1BUF84NXh4X2ZzbF9wY2lfXworI2RlZmluZSBfX0lNTUFQXzg1eHhfZnNsX3BjaV9fCisKKy8qCisgKiBDb21tb24gUENJL1BDSUUgUmVnaXN0ZXIgc3RydWN0dXJlIGZvciBtcGM4NXh4IGFuZCBtcGM4Nnh4CisgKi8KKworLyoKKyAqIFBDSSBUcmFuc2xhdGlvbiBSZWdpc3RlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGNpX291dGJvdW5kX3dpbmRvdyB7CisJdTMyCXBvdGFyOwkJLyogMHgwMCAtIEFkZHJlc3MgKi8KKwl1MzIJcG90ZWFyOwkJLyogMHgwNCAtIEFkZHJlc3MgRXh0ZW5kZWQgKi8KKwl1MzIJcG93YmFyOwkJLyogMHgwOCAtIFdpbmRvdyBCYXNlIEFkZHJlc3MgKi8KKwl1MzIJcmVzMTsKKwl1MzIJcG93YXI7CQkvKiAweDEwIC0gV2luZG93IEF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgUE9XQVJfRU4JMHg4MDAwMDAwMAorI2RlZmluZSBQT1dBUl9JT19SRUFECTB4MDAwODAwMDAKKyNkZWZpbmUgUE9XQVJfTUVNX1JFQUQJMHgwMDA0MDAwMAorI2RlZmluZSBQT1dBUl9JT19XUklURQkweDAwMDA4MDAwCisjZGVmaW5lIFBPV0FSX01FTV9XUklURQkweDAwMDA0MDAwCisJdTMyCXJlczJbM107Cit9IHBvdF90OworCit0eXBlZGVmIHN0cnVjdCBwY2lfaW5ib3VuZF93aW5kb3cgeworCXUzMglwaXRhcjsJCS8qIDB4MDAgLSBBZGRyZXNzICovCisJdTMyCXJlczE7CisJdTMyCXBpd2JhcjsJCS8qIDB4MDggLSBXaW5kb3cgQmFzZSBBZGRyZXNzICovCisJdTMyCXBpd2JlYXI7CS8qIDB4MGMgLSBXaW5kb3cgQmFzZSBBZGRyZXNzIEV4dGVuZGVkICovCisJdTMyCXBpd2FyOwkJLyogMHgxMCAtIFdpbmRvdyBBdHRyaWJ1dGVzICovCisjZGVmaW5lIFBJV0FSX0VOCQkweDgwMDAwMDAwCisjZGVmaW5lIFBJV0FSX1BGCQkweDIwMDAwMDAwCisjZGVmaW5lIFBJV0FSX0xPQ0FMCQkweDAwZjAwMDAwCisjZGVmaW5lIFBJV0FSX1JFQURfU05PT1AJMHgwMDA1MDAwMAorI2RlZmluZSBQSVdBUl9XUklURV9TTk9PUAkweDAwMDA1MDAwCisJdTMyCXJlczJbM107Cit9IHBpdF90OworCisvKiBQQ0kvUENJIEV4cHJlc3MgUmVnaXN0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBjY3NyX3BjaSB7CisJdTMyCWNmZ19hZGRyOwkvKiAweDAwMCAtIFBDSSBDb25maWd1cmF0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1MzIJY2ZnX2RhdGE7CS8qIDB4MDA0IC0gUENJIENvbmZpZ3VyYXRpb24gRGF0YSBSZWdpc3RlciAqLworCXUzMglpbnRfYWNrOwkvKiAweDAwOCAtIFBDSSBJbnRlcnJ1cHQgQWNrbm93bGVkZ2UgUmVnaXN0ZXIgKi8KKwl1MzIJb3V0X2NvbXBfdG87CS8qIDB4MDBDIC0gUENJIE91dGJvdW5kIENvbXBsZXRpb24gVGltZW91dCBSZWdpc3RlciAqLworCXUzMglvdXRfY29uZl90bzsJLyogMHgwMTAgLSBQQ0kgQ29uZmlndXJhdGlvbiBUaW1lb3V0IFJlZ2lzdGVyICovCisJdTMyCWNvbmZpZzsJCS8qIDB4MDE0IC0gUENJRSBDT05GSUcgUmVnaXN0ZXIgKi8KKwljaGFyCXJlczJbOF07CisJdTMyCXBtZV9tc2dfZGV0OwkvKiAweDAyMCAtIFBDSUUgUE1FICYgbWVzc2FnZSBkZXRlY3QgcmVnaXN0ZXIgKi8KKwl1MzIJcG1lX21zZ19kaXM7CS8qIDB4MDI0IC0gUENJRSBQTUUgJiBtZXNzYWdlIGRpc2FibGUgcmVnaXN0ZXIgKi8KKwl1MzIJcG1lX21zZ19pbnRfZW47CS8qIDB4MDI4IC0gUENJRSBQTUUgJiBtZXNzYWdlIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKwl1MzIJcG1fY29tbWFuZDsJLyogMHgwMmMgLSBQQ0lFIFBNIENvbW1hbmQgcmVnaXN0ZXIgKi8KKwljaGFyCXJlczRbMzAxNl07CS8qICAgICAoLSAjeGJmOAkgI3gzMCkzMDE2ICovCisJdTMyCWJsb2NrX3JldjE7CS8qIDB4YmY4IC0gUENJRSBCbG9jayBSZXZpc2lvbiByZWdpc3RlciAxICovCisJdTMyCWJsb2NrX3JldjI7CS8qIDB4YmZjIC0gUENJRSBCbG9jayBSZXZpc2lvbiByZWdpc3RlciAyICovCisKKwlwb3RfdAlwb3RbNV07CQkvKiAweGMwMCAtIDB4YzlmIE91dGJvdW5kIEFUTVUncyAwLCAxLCAyLCAzLCBhbmQgNCAqLworCXUzMglyZXM1WzY0XTsKKwlwaXRfdAlwaXRbM107CQkvKiAweGRhMCAtIDB4ZGZmIEluYm91bmQgQVRNVSdzIDMsIDIsIGFuZCAxICovCisjZGVmaW5lIFBJVDMgMAorI2RlZmluZSBQSVQyIDEKKyNkZWZpbmUgUElUMSAyCisKKyNpZiAwCisJdTMyCXBvdGFyMDsJCS8qIDB4YzAwIC0gUENJIE91dGJvdW5kIFRyYW5zYWN0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgMCAqLworCXUzMglwb3RlYXIwOwkvKiAweGMwNCAtIFBDSSBPdXRib3VuZCBUcmFuc2xhdGlvbiBFeHRlbmRlZCBBZGRyZXNzIFJlZ2lzdGVyIDAgKi8KKwljaGFyCXJlczVbOF07CisJdTMyCXBvd2FyMDsJCS8qIDB4YzEwIC0gUENJIE91dGJvdW5kIFdpbmRvdyBBdHRyaWJ1dGVzIFJlZ2lzdGVyIDAgKi8KKwljaGFyCXJlczZbMTJdOworCXUzMglwb3RhcjE7CQkvKiAweGMyMCAtIFBDSSBPdXRib3VuZCBUcmFuc2FjdGlvbiBBZGRyZXNzIFJlZ2lzdGVyIDEgKi8KKwl1MzIJcG90ZWFyMTsJLyogMHhjMjQgLSBQQ0kgT3V0Ym91bmQgVHJhbnNsYXRpb24gRXh0ZW5kZWQgQWRkcmVzcyBSZWdpc3RlciAxICovCisJdTMyCXBvd2JhcjE7CS8qIDB4YzI4IC0gUENJIE91dGJvdW5kIFdpbmRvdyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMSAqLworCWNoYXIJcmVzN1s0XTsKKwl1MzIJcG93YXIxOwkJLyogMHhjMzAgLSBQQ0kgT3V0Ym91bmQgV2luZG93IEF0dHJpYnV0ZXMgUmVnaXN0ZXIgMSAqLworCWNoYXIJcmVzOFsxMl07CisJdTMyCXBvdGFyMjsJCS8qIDB4YzQwIC0gUENJIE91dGJvdW5kIFRyYW5zYWN0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgMiAqLworCXUzMglwb3RlYXIyOwkvKiAweGM0NCAtIFBDSSBPdXRib3VuZCBUcmFuc2xhdGlvbiBFeHRlbmRlZCBBZGRyZXNzIFJlZ2lzdGVyIDIgKi8KKwl1MzIJcG93YmFyMjsJLyogMHhjNDggLSBQQ0kgT3V0Ym91bmQgV2luZG93IEJhc2UgQWRkcmVzcyBSZWdpc3RlciAyICovCisJY2hhcglyZXM5WzRdOworCXUzMglwb3dhcjI7CQkvKiAweGM1MCAtIFBDSSBPdXRib3VuZCBXaW5kb3cgQXR0cmlidXRlcyBSZWdpc3RlciAyICovCisJY2hhcglyZXMxMFsxMl07CisJdTMyCXBvdGFyMzsJCS8qIDB4YzYwIC0gUENJIE91dGJvdW5kIFRyYW5zYWN0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgMyAqLworCXUzMglwb3RlYXIzOwkvKiAweGM2NCAtIFBDSSBPdXRib3VuZCBUcmFuc2xhdGlvbiBFeHRlbmRlZCBBZGRyZXNzIFJlZ2lzdGVyIDMgKi8KKwl1MzIJcG93YmFyMzsJLyogMHhjNjggLSBQQ0kgT3V0Ym91bmQgV2luZG93IEJhc2UgQWRkcmVzcyBSZWdpc3RlciAzICovCisJY2hhcglyZXMxMVs0XTsKKwl1MzIJcG93YXIzOwkJLyogMHhjNzAgLSBQQ0kgT3V0Ym91bmQgV2luZG93IEF0dHJpYnV0ZXMgUmVnaXN0ZXIgMyAqLworCWNoYXIJcmVzMTJbMTJdOworCXUzMglwb3RhcjQ7CQkvKiAweGM4MCAtIFBDSSBPdXRib3VuZCBUcmFuc2FjdGlvbiBBZGRyZXNzIFJlZ2lzdGVyIDQgKi8KKwl1MzIJcG90ZWFyNDsJLyogMHhjODQgLSBQQ0kgT3V0Ym91bmQgVHJhbnNsYXRpb24gRXh0ZW5kZWQgQWRkcmVzcyBSZWdpc3RlciA0ICovCisJdTMyCXBvd2JhcjQ7CS8qIDB4Yzg4IC0gUENJIE91dGJvdW5kIFdpbmRvdyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgNCAqLworCWNoYXIJcmVzMTNbNF07CisJdTMyCXBvd2FyNDsJCS8qIDB4YzkwIC0gUENJIE91dGJvdW5kIFdpbmRvdyBBdHRyaWJ1dGVzIFJlZ2lzdGVyIDQgKi8KKwljaGFyCXJlczE0WzI2OF07CisJdTMyCXBpdGFyMzsJCS8qIDB4ZGEwIC0gUENJIEluYm91bmQgVHJhbnNsYXRpb24gQWRkcmVzcyBSZWdpc3RlciAzICovCisJY2hhcglyZXMxNVs0XTsKKwl1MzIJcGl3YmFyMzsJLyogMHhkYTggLSBQQ0kgSW5ib3VuZCBXaW5kb3cgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDMgKi8KKwl1MzIJcGl3YmVhcjM7CS8qIDB4ZGFjIC0gUENJIEluYm91bmQgV2luZG93IEJhc2UgRXh0ZW5kZWQgQWRkcmVzcyBSZWdpc3RlciAzICovCisJdTMyCXBpd2FyMzsJCS8qIDB4ZGIwIC0gUENJIEluYm91bmQgV2luZG93IEF0dHJpYnV0ZXMgUmVnaXN0ZXIgMyAqLworCWNoYXIJcmVzMTZbMTJdOworCXUzMglwaXRhcjI7CQkvKiAweGRjMCAtIFBDSSBJbmJvdW5kIFRyYW5zbGF0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgMiAqLworCWNoYXIJcmVzMTdbNF07CisJdTMyCXBpd2JhcjI7CS8qIDB4ZGM4IC0gUENJIEluYm91bmQgV2luZG93IEJhc2UgQWRkcmVzcyBSZWdpc3RlciAyICovCisJdTMyCXBpd2JlYXIyOwkvKiAweGRjYyAtIFBDSSBJbmJvdW5kIFdpbmRvdyBCYXNlIEV4dGVuZGVkIEFkZHJlc3MgUmVnaXN0ZXIgMiAqLworCXUzMglwaXdhcjI7CQkvKiAweGRkMCAtIFBDSSBJbmJvdW5kIFdpbmRvdyBBdHRyaWJ1dGVzIFJlZ2lzdGVyIDIgKi8KKwljaGFyCXJlczE4WzEyXTsKKwl1MzIJcGl0YXIxOwkJLyogMHhkZTAgLSBQQ0kgSW5ib3VuZCBUcmFuc2xhdGlvbiBBZGRyZXNzIFJlZ2lzdGVyIDEgKi8KKwljaGFyCXJlczE5WzRdOworCXUzMglwaXdiYXIxOwkvKiAweGRlOCAtIFBDSSBJbmJvdW5kIFdpbmRvdyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMSAqLworCWNoYXIJcmVzMjBbNF07CisJdTMyCXBpd2FyMTsJCS8qIDB4ZGYwIC0gUENJIEluYm91bmQgV2luZG93IEF0dHJpYnV0ZXMgUmVnaXN0ZXIgMSAqLworCWNoYXIJcmVzMjFbMTJdOworI2VuZGlmCisJdTMyCXBlZHI7CQkvKiAweGUwMCAtIFBDSSBFcnJvciBEZXRlY3QgUmVnaXN0ZXIgKi8KKwl1MzIJcGVjZHI7CQkvKiAweGUwNCAtIFBDSSBFcnJvciBDYXB0dXJlIERpc2FibGUgUmVnaXN0ZXIgKi8KKwl1MzIJcGVlcjsJCS8qIDB4ZTA4IC0gUENJIEVycm9yIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKwl1MzIJcGVhdHRyY3I7CS8qIDB4ZTBjIC0gUENJIEVycm9yIEF0dHJpYnV0ZXMgQ2FwdHVyZSBSZWdpc3RlciAqLworCXUzMglwZWFkZHJjcjsJLyogMHhlMTAgLSBQQ0kgRXJyb3IgQWRkcmVzcyBDYXB0dXJlIFJlZ2lzdGVyICovCisvKgl1MzIJcGVycl9kaXNyCSAqIDB4ZTEwIC0gUENJRSBFcm9yciBEaXNhYmxlIFJlZ2lzdGVyICovCisJdTMyCXBlZXh0YWRkcmNyOwkvKiAweGUxNCAtIFBDSQlFcnJvciBFeHRlbmRlZCBBZGRyZXNzIENhcHR1cmUgUmVnaXN0ZXIgKi8KKwl1MzIJcGVkbGNyOwkJLyogMHhlMTggLSBQQ0kgRXJyb3IgRGF0YSBMb3cgQ2FwdHVyZSBSZWdpc3RlciAqLworCXUzMglwZWRoY3I7CQkvKiAweGUxYyAtIFBDSSBFcnJvciBFcnJvciBEYXRhIEhpZ2ggQ2FwdHVyZSBSZWdpc3RlciAqLworCXUzMglnYXNfdGltcjsJLyogMHhlMjAgLSBQQ0kgR2Fza2V0IFRpbWVyIFJlZ2lzdGVyICovCisvKgl1MzIJcGVycl9jYXBfc3RhdDsJICogMHhlMjAgLSBQQ0lFIEVycm9yIENhcHR1cmUgU3RhdHVzIFJlZ2lzdGVyICovCisJY2hhcglyZXMyMls0XTsKKwl1MzIJcGVycl9jYXAwOwkvKiAweGUyOCAtIFBDSUUgRXJyb3IgQ2FwdHVyZSBSZWdpc3RlciAwICovCisJdTMyCXBlcnJfY2FwMTsJLyogMHhlMmMgLSBQQ0lFIEVycm9yIENhcHR1cmUgUmVnaXN0ZXIgMSAqLworCXUzMglwZXJyX2NhcDI7CS8qIDB4ZTMwIC0gUENJRSBFcnJvciBDYXB0dXJlIFJlZ2lzdGVyIDIgKi8KKwl1MzIJcGVycl9jYXAzOwkvKiAweGUzNCAtIFBDSUUgRXJyb3IgQ2FwdHVyZSBSZWdpc3RlciAzICovCisJY2hhcglyZXMyM1s0NTZdOwkvKiAgICAgKC0gI3gxMDAwICN4ZTM4KSA0NTYgKi8KK30gY2Nzcl9mc2xfcGNpX3Q7CisKKyNlbmRpZiAvKl9fSU1NQVBfZnNsX3BjaV9fKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF9xZS5oIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwX3FlLmgKaW5kZXggOTUwYjk0OS4uYTE2YTZkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL2ltbWFwX3FlLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwX3FlLmgKQEAgLTI4MSw2ICsyODEsMTcgQEAKIAl1OCByZXM0WzB4MjAwIC0gMHgwOTFdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWNjX3Nsb3dfdDsKIAordHlwZWRlZiBzdHJ1Y3QgdWNjX21paV9tbmcgeworCXUzMiBtaWltY2ZnOwkJLyogTUlJIG1hbmFnZW1lbnQgY29uZmlndXJhdGlvbiByZWcgICAgKi8KKwl1MzIgbWlpbWNvbTsJCS8qIE1JSSBtYW5hZ2VtZW50IGNvbW1hbmQgcmVnICAgICAgICAgICovCisJdTMyIG1paW1hZGQ7CQkvKiBNSUkgbWFuYWdlbWVudCBhZGRyZXNzIHJlZyAgICAgICAgICAqLworCXUzMiBtaWltY29uOwkJLyogTUlJIG1hbmFnZW1lbnQgY29udHJvbCByZWcgICAgICAgICAgKi8KKwl1MzIgbWlpbXN0YXQ7CQkvKiBNSUkgbWFuYWdlbWVudCBzdGF0dXMgcmVnICAgICAgICAgICAqLworCXUzMiBtaWltaW5kOwkJLyogTUlJIG1hbmFnZW1lbnQgaW5kaWNhdGlvbiByZWcgICAgICAgKi8KKwl1MzIgaWZjdGw7CQkvKiBpbnRlcmZhY2UgY29udHJvbCByZWcgICAgICAgICAgICAgICAqLworCXUzMiBpZnN0YXQ7CQkvKiBpbnRlcmZhY2Ugc3RhdHV4IHJlZyAgICAgICAgICAgICAgICAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSl1ZWNfbWlpX3Q7CisKIHR5cGVkZWYgc3RydWN0IHVjY19ldGhlcm5ldCB7CiAJdTMyIG1hY2NmZzE7CQkvKiBtYWMgY29uZmlndXJhdGlvbiByZWcuIDEgICAgICAgICAgICAqLwogCXUzMiBtYWNjZmcyOwkJLyogbWFjIGNvbmZpZ3VyYXRpb24gcmVnLiAyICAgICAgICAgICAgKi8KQEAgLTU0MCwxNCArNTUxLDIxIEBACiAJdTggcmVzMTRbMHgzMDBdOwogCXU4IHJlczE1WzB4M0EwMF07CiAJdTggcmVzMTZbMHg4MDAwXTsJLyogMHgxMDgwMDAgLSAgMHgxMTAwMDAgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4NTY4KQorCXU4IG11cmFtWzB4MTAwMDBdOwkvKiAweDFfMDAwMCAtICAweDJfMDAwMCBNdWx0aS11c2VyIFJBTSAqLworCXU4IHJlczE3WzB4MjAwMDBdOwkvKiAweDJfMDAwMCAtICAweDRfMDAwMCAqLworI2Vsc2UKIAl1OCBtdXJhbVsweEMwMDBdOwkvKiAweDExMDAwMCAtICAweDExQzAwMCBNdWx0aS11c2VyIFJBTSAqLwogCXU4IHJlczE3WzB4MjQwMDBdOwkvKiAweDExQzAwMCAtICAweDE0MDAwMCAqLwogCXU4IHJlczE4WzB4QzAwMDBdOwkvKiAweDE0MDAwMCAtICAweDIwMDAwMCAqLworI2VuZGlmCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBxZV9tYXBfdDsKIAogZXh0ZXJuIHFlX21hcF90ICpxZV9pbW1yOwogCi0jaWYgZGVmaW5lZChDT05GSUdfTVBDODM2MCkKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4NTY4KQorI2RlZmluZSBRRV9NVVJBTV9TSVpFCQkweDEwMDAwVUwKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzgzNjApCiAjZGVmaW5lIFFFX01VUkFNX1NJWkUJCTB4YzAwMFVMCiAjZWxpZiBkZWZpbmVkKENPTkZJR19NUEM4MzJYKQogI2RlZmluZSBRRV9NVVJBTV9TSVpFCQkweDQwMDBVTApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tcHBjL3Byb2Nlc3Nvci5oCmluZGV4IDQ4OThkZDQuLjBhMTYwZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvcHJvY2Vzc29yLmgKQEAgLTU4LDcgKzU4LDYgQEAKICNlbHNlCiAjZGVmaW5lIE1TUl9LRVJORUwJTVNSX01FCiAjZW5kaWYKLSNkZWZpbmUgTVNSX1VTRVIJTVNSX0tFUk5FTHxNU1JfUFJ8TVNSX0VFCiAKIC8qIEZsb2F0aW5nIFBvaW50IFN0YXR1cyBhbmQgQ29udHJvbCBSZWdpc3RlciAoRlBTQ1IpIEZpZWxkcyAqLwogCkBAIC0yMTgsMTIgKzIxNywxNCBAQAogI2RlZmluZSAgIEhJRDBfRFBNCSgxPDwyMCkKICNkZWZpbmUgICBISUQwX0lDRQkoMTw8SElEMF9JQ0VfU0hJRlQpCS8qIEluc3RydWN0aW9uIENhY2hlIEVuYWJsZSAqLwogI2RlZmluZSAgIEhJRDBfRENFCSgxPDxISUQwX0RDRV9TSElGVCkJLyogRGF0YSBDYWNoZSBFbmFibGUgKi8KKyNkZWZpbmUgICBISUQwX1RCRU4JKDE8PDE0KQkJLyogVGltZSBCYXNlIEVuYWJsZSAqLwogI2RlZmluZSAgIEhJRDBfSUxPQ0sJKDE8PDEzKQkJLyogSW5zdHJ1Y3Rpb24gQ2FjaGUgTG9jayAqLwogI2RlZmluZSAgIEhJRDBfRExPQ0sJKDE8PEhJRDBfRExPQ0tfU0hJRlQpCS8qIERhdGEgQ2FjaGUgTG9jayAqLwogI2RlZmluZSAgIEhJRDBfSUNGSQkoMTw8MTEpCQkvKiBJbnN0ci4gQ2FjaGUgRmxhc2ggSW52YWxpZGF0ZSAqLwogI2RlZmluZSAgIEhJRDBfRENGSQkoMTw8MTApCQkvKiBEYXRhIENhY2hlIEZsYXNoIEludmFsaWRhdGUgKi8KICNkZWZpbmUgICBISUQwX0RDSQlISUQwX0RDRkkKICNkZWZpbmUgICBISUQwX1NQRAkoMTw8OSkJCS8qIFNwZWN1bGF0aXZlIGRpc2FibGUgKi8KKyNkZWZpbmUgICBISUQwX0VOTUFTNwkoMTw8NykJCS8qIEVuYWJsZSBNQVM3IFVwZGF0ZSBmb3IgMzYtYml0IHBoeXMgKi8KICNkZWZpbmUgICBISUQwX1NHRQkoMTw8NykJCS8qIFN0b3JlIEdhdGhlcmluZyBFbmFibGUgKi8KICNkZWZpbmUgICBISUQwX1NJRUQJSElEX1NHRQkJLyogU2VyaWFsIEluc3RyLiBFeGVjdXRpb24gW0Rpc2FibGVdICovCiAjZGVmaW5lICAgSElEMF9EQ0ZBCSgxPDw2KQkJLyogRGF0YSBDYWNoZSBGbHVzaCBBc3Npc3QgKi8KQEAgLTQ1MSw2ICs0NTIsNyBAQAogI2RlZmluZSBTUFJOX1BJRDEgICAgICAgMHgyNzkgICAvKiBQcm9jZXNzIElEIFJlZ2lzdGVyIDEgKi8KICNkZWZpbmUgU1BSTl9QSUQyICAgICAgIDB4MjdhICAgLyogUHJvY2VzcyBJRCBSZWdpc3RlciAyICovCiAjZGVmaW5lIFNQUk5fTUNTUgkweDIzYwkvKiBNYWNoaW5lIENoZWNrIFN5bmRyb21lIHJlZ2lzdGVyICovCisjZGVmaW5lIFNQUk5fTUNBUgkweDIzZAkvKiBNYWNoaW5lIENoZWNrIEFkZHJlc3MgcmVnaXN0ZXIgKi8KICNpZmRlZiBDT05GSUdfNDQwCiAjZGVmaW5lIE1DU1JfTUNTCTB4ODAwMDAwMDAJLyogTWFjaGluZSBDaGVjayBTdW1tYXJ5ICovCiAjZGVmaW5lIE1DU1JfSUIJCTB4NDAwMDAwMDAJLyogSW5zdHJ1Y3Rpb24gUExCIEVycm9yICovCkBAIC00NjUsNyArNDY3LDggQEAKICNkZWZpbmUgRVNSX1NUICAgICAgICAgIDB4MDA4MDAwMDAgICAgICAvKiBTdG9yZSBPcGVyYXRpb24gKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX01QQzg2eHgpCi0jZGVmaW5lIFNQUk5fTVNTQ1JPCTB4M2Y2CisjZGVmaW5lIFNQUk5fTVNTQ1IwCTB4M2Y2CisjZGVmaW5lIFNQUk5fTVNTU1IwCTB4M2Y3CiAjZW5kaWYKIAogCkBAIC01MzIsNyArNTM1LDcgQEAKICNkZWZpbmUgTFIJU1BSTl9MUgogI2RlZmluZSBNQkFSICAgIFNQUk5fTUJBUiAgICAgICAvKiBTeXN0ZW0gbWVtb3J5IGJhc2UgYWRkcmVzcyAqLwogI2lmIGRlZmluZWQoQ09ORklHX01QQzg2eHgpCi0jZGVmaW5lIE1TU0NSMAlTUFJOX01TU0NSTworI2RlZmluZSBNU1NDUjAJU1BSTl9NU1NDUjAKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0U1MDApIHx8IGRlZmluZWQoQ09ORklHX01QQzg2eHgpCiAjZGVmaW5lIFBJUglTUFJOX1BJUgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbWRfY29uZmRlZnMuaCBiL2luY2x1ZGUvY21kX2NvbmZkZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzY2NkY2UuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jbWRfY29uZmRlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotLyoKLSAqIERlZmluaXRpb25zIGZvciBDb25maWd1cmluZyB0aGUgbW9uaXRvciBjb21tYW5kcwotICovCi0jaWZuZGVmIF9DTURfQ09ORklHX0gKLSNkZWZpbmUgX0NNRF9DT05GSUdfSAotCi0vKgotICogQ29uZmlndXJhYmxlIG1vbml0b3IgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDRkdfQ01EX0JESQkJMHgwMDAwMDAwMVVMTAkvKiBiZGluZm8JCQkqLwotI2RlZmluZSBDRkdfQ01EX0xPQURTCQkweDAwMDAwMDAyVUxMCS8qIGxvYWRzCQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9MT0FEQgkJMHgwMDAwMDAwNFVMTAkvKiBsb2FkYgkJCSovCi0jZGVmaW5lIENGR19DTURfSU1JCQkweDAwMDAwMDA4VUxMCS8qIGltaW5mbwkJCSovCi0jZGVmaW5lIENGR19DTURfQ0FDSEUJCTB4MDAwMDAwMTBVTEwJLyogaWNhY2hlLCBkY2FjaGUJCSovCi0jZGVmaW5lIENGR19DTURfRkxBU0gJCTB4MDAwMDAwMjBVTEwJLyogZmxpbmZvLCBlcmFzZSwgcHJvdGVjdAkqLwotI2RlZmluZSBDRkdfQ01EX01FTU9SWQkJMHgwMDAwMDA0MFVMTAkvKiBtZCwgbW0sIG5tLCBtdywgY3AsIGNtcCwJKi8KLQkJCQkJCS8qIGNyYywgYmFzZSwgbG9vcCwgbXRlc3QJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9ORVQJCTB4MDAwMDAwODBVTEwJLyogYm9vdHAsIHRmdHBib290LCByYXJwYm9vdAkqLwotI2RlZmluZSBDRkdfQ01EX0VOVgkJMHgwMDAwMDEwMFVMTAkvKiBzYXZlZW52CQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9LR0RCCQkweDAwMDAwMDAwMDAwMDAyMDBVTEwJLyoga2dkYgkJCQkqLwotI2RlZmluZSBDRkdfQ01EX1BDTUNJQQkJMHgwMDAwMDQwMFVMTAkvKiBQQ01DSUEgc3VwcG9ydAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9JREUJCTB4MDAwMDA4MDBVTEwJLyogSURFIGhhcmRkaXNrIHN1cHBvcnQJCSovCi0jZGVmaW5lIENGR19DTURfUENJCQkweDAwMDAxMDAwVUxMCS8qIHBjaWluZm8JCQkqLwotI2RlZmluZSBDRkdfQ01EX0lSUQkJMHgwMDAwMjAwMFVMTAkvKiBpcnFpbmZvCQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9CT09URAkJMHgwMDAwNDAwMFVMTAkvKiBib290ZAkJCSovCi0jZGVmaW5lIENGR19DTURfQ09OU09MRQkJMHgwMDAwODAwMFVMTAkvKiBjb25pbmZvCQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9FRVBST00JCTB4MDAwMTAwMDBVTEwJLyogRUVQUk9NIHJlYWQvd3JpdGUgc3VwcG9ydAkqLwotI2RlZmluZSBDRkdfQ01EX0FTS0VOVgkJMHgwMDAyMDAwMFVMTAkvKiBhc2sgZm9yIGVudiB2YXJpYWJsZQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9SVU4JCTB4MDAwNDAwMDBVTEwJLyogcnVuIGNvbW1hbmQgaW4gZW52IHZhcmlhYmxlCSovCi0jZGVmaW5lIENGR19DTURfRUNITwkJMHgwMDA4MDAwMFVMTAkvKiBlY2hvIGFyZ3VtZW50cwkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9JMkMJCTB4MDAxMDAwMDBVTEwJLyogSTJDIHNlcmlhbCBidXMgc3VwcG9ydAkqLwotI2RlZmluZSBDRkdfQ01EX1JFR0lORk8JCTB4MDAyMDAwMDBVTEwJLyogUmVnaXN0ZXIgZHVtcAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9JTU1BUAkJMHgwMDQwMDAwMFVMTAkvKiBJTU1SIGR1bXAgc3VwcG9ydAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9EQVRFCQkweDAwODAwMDAwVUxMCS8qIHN1cHBvcnQgZm9yIFJUQywgZGF0ZS90aW1lLi4uKi8KLSNkZWZpbmUgQ0ZHX0NNRF9ESENQCQkweDAxMDAwMDAwVUxMCS8qIERIQ1AgU3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfQkVEQlVHCQkweDAyMDAwMDAwVUxMCS8qIEluY2x1ZGUgQmVkQnVnIERlYnVnZ2VyCSovCi0jZGVmaW5lIENGR19DTURfRkRDCQkweDA0MDAwMDAwVUxMCS8qIEZsb3BweSBEaXNrIFN1cHBvcnQJCSovCi0jZGVmaW5lIENGR19DTURfU0NTSQkJMHgwODAwMDAwMFVMTAkvKiBTQ1NJIFN1cHBvcnQJCQkqLwotI2RlZmluZSBDRkdfQ01EX0FVVE9TQ1JJUFQJMHgxMDAwMDAwMFVMTAkvKiBBdXRvc2NyaXB0IFN1cHBvcnQJCSovCi0jZGVmaW5lIENGR19DTURfTUlJCQkweDIwMDAwMDAwVUxMCS8qIE1JSSBzdXBwb3J0CQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9TRVRHRVREQ1IJMHg0MDAwMDAwMFVMTAkvKiBEQ1Igc3VwcG9ydCBvbiA0eHgJCSovCi0jZGVmaW5lIENGR19DTURfQlNQCQkweDgwMDAwMDAwVUxMCS8qIEJvYXJkIFNwZWNpZmljIGZ1bmN0aW9ucwkqLwotCi0jZGVmaW5lIENGR19DTURfRUxGCTB4MDAwMDAwMDEwMDAwMDAwMFVMTAkvKiBFTEYgKFZ4V29ya3MpIGxvYWQvYm9vdCBjbWQJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9NSVNDCTB4MDAwMDAwMDIwMDAwMDAwMFVMTAkvKiBNaXNjIGZ1bmN0aW9ucyBsaWtlIHNsZWVwIGV0YyovCi0jZGVmaW5lIENGR19DTURfVVNCCTB4MDAwMDAwMDQwMDAwMDAwMFVMTAkvKiBVU0IgU3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfRE9DCTB4MDAwMDAwMDgwMDAwMDAwMFVMTAkvKiBEaXNrLU9uLUNoaXAgU3VwcG9ydAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9KRkZTMgkweDAwMDAwMDEwMDAwMDAwMDBVTEwJLyogSkZGUzIgU3VwcG9ydAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9EVFQJMHgwMDAwMDAyMDAwMDAwMDAwVUxMCS8qIERpZ2l0YWwgVGhlcm0gYW5kIFRoZXJtb3N0YXQgKi8KLSNkZWZpbmUgQ0ZHX0NNRF9TRFJBTQkweDAwMDAwMDQwMDAwMDAwMDBVTEwJLyogU0RSQU0gRElNTSBTUEQgaW5mbyBwcmludG91dCAqLwotI2RlZmluZSBDRkdfQ01EX0RJQUcJMHgwMDAwMDA4MDAwMDAwMDAwVUxMCS8qIERpYWdub3N0aWNzCQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9GUEdBCTB4MDAwMDAxMDAwMDAwMDAwMFVMTAkvKiBGUEdBIGNvbmZpZ3VyYXRpb24gU3VwcG9ydAkqLwotI2RlZmluZSBDRkdfQ01EX0hXRkxPVwkweDAwMDAwMjAwMDAwMDAwMDBVTEwJLyogUlRTL0NUUyBodyBmbG93IGNvbnRyb2wJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9TQVZFUwkweDAwMDAwNDAwMDAwMDAwMDBVTEwJLyogc2F2ZSBTIHJlY29yZCBkdW1wCQkqLwotI2RlZmluZSBDRkdfQ01EX1NQSQkweDAwMDAxMDAwMDAwMDAwMDBVTEwJLyogU1BJIHV0aWxpdHkJCQkqLwotI2RlZmluZSBDRkdfQ01EX0ZET1MJMHgwMDAwMjAwMDAwMDAwMDAwVUxMCS8qIEZsb3BweSBET1Mgc3VwcG9ydAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9WRkQJMHgwMDAwNDAwMDAwMDAwMDAwVUxMCS8qIFZGRCBzdXBwb3J0IChUUkFCKQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9OQU5ECTB4MDAwMDgwMDAwMDAwMDAwMFVMTAkvKiBOQU5EIHN1cHBvcnQJCQkqLwotI2RlZmluZSBDRkdfQ01EX0JNUAkweDAwMDEwMDAwMDAwMDAwMDBVTEwJLyogQk1QIHN1cHBvcnQJCQkqLwotI2RlZmluZSBDRkdfQ01EX1BPUlRJTwkweDAwMDIwMDAwMDAwMDAwMDBVTEwJLyogUG9ydCBJL08JCQkqLwotI2RlZmluZSBDRkdfQ01EX1BJTkcJMHgwMDA0MDAwMDAwMDAwMDAwVUxMCS8qIHBpbmcgc3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfTU1DCTB4MDAwODAwMDAwMDAwMDAwMFVMTAkvKiBNTUMgc3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfRkFUCTB4MDAxMDAwMDAwMDAwMDAwMFVMTAkvKiBGQVQgc3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfSU1MUwkweDAwMjAwMDAwMDAwMDAwMDBVTEwJLyogTGlzdCBhbGwgZm91bmQgaW1hZ2VzCSovCi0jZGVmaW5lIENGR19DTURfSVRFU1QJMHgwMDQwMDAwMDAwMDAwMDAwVUxMCS8qIEludGVnZXIgKGFuZCBzdHJpbmcpIHRlc3QJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9ORlMJMHgwMDgwMDAwMDAwMDAwMDAwVUxMCS8qIE5GUyBzdXBwb3J0CQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9SRUlTRVIJMHgwMTAwMDAwMDAwMDAwMDAwVUxMCS8qIFJlaXNlcmZzIHN1cHBvcnQJCSovCi0jZGVmaW5lIENGR19DTURfQ0RQCTB4MDIwMDAwMDAwMDAwMDAwMFVMTAkvKiBDaXNjbyBEaXNjb3ZlcnkgUHJvdG9jb2wgCSovCi0jZGVmaW5lIENGR19DTURfWElNRwkweDA0MDAwMDAwMDAwMDAwMDBVTEwJLyogTG9hZCBwYXJ0IG9mIE11bHRpIEltYWdlCSovCi0jZGVmaW5lIENGR19DTURfVU5JVkVSU0UgMHgwODAwMDAwMDAwMDAwMDAwVUxMCS8qIFR1bmRyYSBVbml2ZXJzZSBTdXBwb3J0ICAgICAgKi8KLSNkZWZpbmUgQ0ZHX0NNRF9FWFQyCTB4MTAwMDAwMDAwMDAwMDAwMFVMTAkvKiBFWFQyIFN1cHBvcnQJCQkqLwotI2RlZmluZSBDRkdfQ01EX1NOVFAJMHgyMDAwMDAwMDAwMDAwMDAwVUxMCS8qIFNOVFAgc3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfRElTUExBWQkweDQwMDAwMDAwMDAwMDAwMDBVTEwJLyogRGlzcGxheSBzdXBwb3J0CQkqLwotI2RlZmluZSBDRkdfQ01EX01GU0wJMHg4MDAwMDAwMDAwMDAwMDAwVUxMCS8qIEZTTCBzdXBwb3J0IGZvciBNaWNyb2JsYXplCSovCi0KLSNkZWZpbmUgQ0ZHX0NNRF9BTEwJMHhGRkZGRkZGRkZGRkZGRkZGVUxMCS8qIEFMTCBjb21tYW5kcwkJCSovCi0KLS8qIENvbW1hbmRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgIm5vbi1zdGFuZGFyZCIgZm9yIHNvbWUgcmVhc29uCi0gKiAobWVtb3J5IGhvZ3MsIHJlcXVpcmVzIHNwZWNpYWwgaGFyZHdhcmUsIG5vdCBmdWxseSB0ZXN0ZWQsIGV0Yy4pCi0gKi8KLSNkZWZpbmUgQ0ZHX0NNRF9OT05TVEQgKENGR19DTURfQVNLRU5WCXwgXAotCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQlDRkdfQ01EX0JNUAl8IFwKLQkJCUNGR19DTURfQlNQCXwgXAotCQkJQ0ZHX0NNRF9DQUNIRQl8IFwKLQkJCUNGR19DTURfQ0RQCXwgXAotCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJQ0ZHX0NNRF9ESVNQTEFZCXwgXAotCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQlDRkdfQ01EX0RUVAl8IFwKLQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQlDRkdfQ01EX0ZEQwl8IFwKLQkJCUNGR19DTURfRkFUCXwgXAotCQkJQ0ZHX0NNRF9GRE9TCXwgXAotCQkJQ0ZHX0NNRF9IV0ZMT1cJfCBcCi0JCQlDRkdfQ01EX0kyQwl8IFwKLQkJCUNGR19DTURfSURFCXwgXAotCQkJQ0ZHX0NNRF9JTU1BUAl8IFwKLQkJCUNGR19DTURfSVJRCXwgXAotCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCUNGR19DTURfS0dEQgl8IFwKLQkJCUNGR19DTURfTUZTTAl8IFwKLQkJCUNGR19DTURfTUlJCXwgXAotCQkJQ0ZHX0NNRF9NTUMJfCBcCi0JCQlDRkdfQ01EX05BTkQJfCBcCi0JCQlDRkdfQ01EX1BDSQl8IFwKLQkJCUNGR19DTURfUENNQ0lBCXwgXAotCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJQ0ZHX0NNRF9QT1JUSU8JfCBcCi0JCQlDRkdfQ01EX1JFR0lORk8gfCBcCi0JCQlDRkdfQ01EX1JFSVNFUgl8IFwKLQkJCUNGR19DTURfU0FWRVMJfCBcCi0JCQlDRkdfQ01EX1NDU0kJfCBcCi0JCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJQ0ZHX0NNRF9TTlRQCXwgXAotCQkJQ0ZHX0NNRF9TUEkJfCBcCi0JCQlDRkdfQ01EX1VOSVZFUlNFIHwgXAotCQkJQ0ZHX0NNRF9VU0IJfCBcCi0JCQlDRkdfQ01EX1ZGRAkpCi0KLS8qIERlZmF1bHQgY29uZmlndXJhdGlvbgotICovCi0jZGVmaW5lIENPTkZJR19DTURfREZMCShDRkdfQ01EX0FMTCAmIH5DRkdfQ01EX05PTlNURCkKLQotI2lmbmRlZiBDT05GSUdfQ09NTUFORFMKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIENPTkZJR19DTURfREZMCi0jZW5kaWYKLQotCi0vKgotICogb3B0aW9uYWwgQk9PVFAgZmllbGRzCi0gKi8KLQotI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSwkJMHgwMDAwMDAwMQotI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQkJMHgwMDAwMDAwMgotI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUJCTB4MDAwMDAwMDQKLSNkZWZpbmUgQ09ORklHX0JPT1RQX05JU0RPTUFJTgkJMHgwMDAwMDAwOAotI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgJCTB4MDAwMDAwMTAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQkweDAwMDAwMDIwCi0jZGVmaW5lIENPTkZJR19CT09UUF9ETlMJCTB4MDAwMDAwNDAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUzIJCTB4MDAwMDAwODAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUJMHgwMDAwMDEwMAotI2RlZmluZSBDT05GSUdfQk9PVFBfTlRQU0VSVkVSCQkweDAwMDAwMjAwCi0jZGVmaW5lIENPTkZJR19CT09UUF9USU1FT0ZGU0VUCQkweDAwMDAwNDAwCi0KLSNkZWZpbmUgQ09ORklHX0JPT1RQX1ZFTkRPUkVYCQkweDgwMDAwMDAwCi0KLSNkZWZpbmUgQ09ORklHX0JPT1RQX0FMTAkJKH5DT05GSUdfQk9PVFBfVkVORE9SRVgpCi0KLQotI2RlZmluZSBDT05GSUdfQk9PVFBfREVGQVVMVAkJKENPTkZJR19CT09UUF9TVUJORVRNQVNLIHwgXAotCQkJCQlDT05GSUdfQk9PVFBfR0FURVdBWQkgfCBcCi0JCQkJCUNPTkZJR19CT09UUF9IT1NUTkFNRQkgfCBcCi0JCQkJCUNPTkZJR19CT09UUF9CT09UUEFUSCkKLQotI2lmbmRlZiBDT05GSUdfQk9PVFBfTUFTSwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkJQ09ORklHX0JPT1RQX0RFRkFVTFQKLSNlbmRpZgotCi0jZW5kaWYJLyogX0NNRF9DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tYW5kLmggYi9pbmNsdWRlL2NvbW1hbmQuaAppbmRleCBhMjkzNmFkLi4wNTk3YzEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbW1hbmQuaAorKysgYi9pbmNsdWRlL2NvbW1hbmQuaApAQCAtODQsMTIgKzg0LDYgQEAKICNkZWZpbmUgQ01EX0ZMQUdfUkVQRUFUCQkweDAwMDEJLyogcmVwZWF0IGxhc3QgY29tbWFuZAkJKi8KICNkZWZpbmUgQ01EX0ZMQUdfQk9PVEQJCTB4MDAwMgkvKiBjb21tYW5kIGlzIGZyb20gYm9vdGQJKi8KIAotLyoKLSAqIENvbmZpZ3VyYWJsZSBtb25pdG9yIGNvbW1hbmRzIGRlZmluaXRpb25zIGhhdmUgYmVlbiBtb3ZlZAotICogdG8gaW5jbHVkZS9jbWRfY29uZmRlZnMuaAotICovCi0KLQogI2RlZmluZSBTdHJ1Y3RfU2VjdGlvbiAgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCxzZWN0aW9uICgiLnVfYm9vdF9jbWQiKSkpCiAKICNpZmRlZiAgQ0ZHX0xPTkdIRUxQCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbW1vbi5oIGIvaW5jbHVkZS9jb21tb24uaAppbmRleCAyM2Y5MzkwLi4yN2E2NjBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvY29tbW9uLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDQKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA3CiAgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgogICoKICAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCkBAIC02MywxMCArNjMsMTkgQEAKICNlbmRpZgogI2VsaWYgZGVmaW5lZChDT05GSUdfNXh4KQogI2luY2x1ZGUgPGFzbS81eHhfaW1tYXAuaD4KKyNkZWZpbmUgQ09ORklHX1JFTE9DX0ZJWFVQX1dPUktTCiAjZWxpZiBkZWZpbmVkKENPTkZJR19NUEM1eHh4KQogI2luY2x1ZGUgPG1wYzV4eHguaD4KKyNkZWZpbmUgQ09ORklHX1JFTE9DX0ZJWFVQX1dPUktTCisjZWxpZiBkZWZpbmVkKENPTkZJR19NUEM1MTJYKQorI2luY2x1ZGUgPG1wYzUxMnguaD4KKyNpbmNsdWRlIDxhc20vaW1tYXBfNTEyeC5oPgorI2RlZmluZSBDT05GSUdfUkVMT0NfRklYVVBfV09SS1MKICNlbGlmIGRlZmluZWQoQ09ORklHX01QQzgyMjApCiAjaW5jbHVkZSA8YXNtL2ltbWFwXzgyMjAuaD4KKyNkZWZpbmUgQ09ORklHX1JFTE9DX0ZJWFVQX1dPUktTCisjZWxpZiBkZWZpbmVkKENPTkZJR184MjRYKQorI2RlZmluZSBDT05GSUdfUkVMT0NfRklYVVBfV09SS1MKICNlbGlmIGRlZmluZWQoQ09ORklHXzgyNjApCiAjaWYgICBkZWZpbmVkKENPTkZJR19NUEM4MjQ3KSBcCiAgICB8fCBkZWZpbmVkKENPTkZJR19NUEM4MjQ4KSBcCkBAIC03OCw2ICs4Nyw3IEBACiAjZGVmaW5lIENPTkZJR19NUEM4MjYwCTEKICNlbmRpZgogI2luY2x1ZGUgPGFzbS9pbW1hcF84MjYwLmg+CisjZGVmaW5lIENPTkZJR19SRUxPQ19GSVhVUF9XT1JLUwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX01QQzg2eHgKICNpbmNsdWRlIDxtcGM4Nnh4Lmg+CkBAIC05MCw2ICsxMDAsNyBAQAogI2lmZGVmIENPTkZJR19NUEM4M1hYCiAjaW5jbHVkZSA8bXBjODN4eC5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF84M3h4Lmg+CisjZGVmaW5lIENPTkZJR19SRUxPQ19GSVhVUF9XT1JLUwogI2VuZGlmCiAjaWZkZWYJQ09ORklHXzR4eAogI2luY2x1ZGUgPHBwYzR4eC5oPgpAQCAtMjMwLDYgKzI0MSw5IEBACiB2b2lkIGlubGluZSBzZXRlbnYgICAoY2hhciAqLCBjaGFyICopOwogI2Vsc2UKIHZvaWQJc2V0ZW52CSAgICAgKGNoYXIgKiwgY2hhciAqKTsKKyNpZmRlZiBDT05GSUdfSEFTX1VJRAordm9pZAlmb3JjZWVudiAgICAgKGNoYXIgKiwgY2hhciAqKTsKKyNlbmRpZgogI2VuZGlmIC8qIENPTkZJR19QUEMgKi8KICNpZmRlZiBDT05GSUdfQVJNCiAjIGluY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC00NDgsNiArNDYyLDkgQEAKICNlbGlmIGRlZmluZWQoQ09ORklHX01QQzV4eHgpCiBpbnQJcHJ0X21wYzV4eHhfY2xrcyAodm9pZCk7CiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM1MTJ4KQoraW50CXBydF9tcGM1MTJ4eHhfY2xrcyAodm9pZCk7CisjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19NUEM4MjIwKQogaW50CXBydF9tcGM4MjIwX2Nsa3MgKHZvaWQpOwogI2VuZGlmCkBAIC01MTIsNiArNTI5LDggQEAKIGludAljcHVfaW5pdF9yICAgICh2b2lkKTsKICNpZiBkZWZpbmVkKENPTkZJR184MjYwKQogaW50CXBydF84MjYwX3JzciAgKHZvaWQpOworI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODNYWCkKK2ludAlwcnRfODN4eF9yc3IgICh2b2lkKTsKICNlbmRpZgogCiAvKiAkKENQVSkvaW50ZXJydXB0cy5jICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ19jbWRfYWxsLmggYi9pbmNsdWRlL2NvbmZpZ19jbWRfYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ4MDFiNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlnX2NtZF9hbGwuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgVmVyc2lvbiAyLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpZm5kZWYgX0NPTkZJR19DTURfQUxMX0gKKyNkZWZpbmUgX0NPTkZJR19DTURfQUxMX0gKKworLyoKKyAqIEFscGhhYmV0aWNhbCBsaXN0IG9mIGFsbCBwb3NzaWJsZSBjb21tYW5kcy4KKyAqLworCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCS8qIGFzayBmb3IgZW52IHZhcmlhYmxlCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0FVVE9TQ1JJUFQJLyogQXV0b3NjcmlwdCBTdXBwb3J0CQkqLworI2RlZmluZSBDT05GSUdfQ01EX0JESQkgICAgICAgCS8qIGJkaW5mbwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCS8qIEluY2x1ZGUgQmVkQnVnIERlYnVnZ2VyCSovCisjZGVmaW5lIENPTkZJR19DTURfQk1QCQkvKiBCTVAgc3VwcG9ydAkJCSovCisjZGVmaW5lIENPTkZJR19DTURfQk9PVEQJLyogYm9vdGQJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0JTUAkJLyogQm9hcmQgU3BlY2lmaWMgZnVuY3Rpb25zCSovCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUJLyogaWNhY2hlLCBkY2FjaGUJCSovCisjZGVmaW5lIENPTkZJR19DTURfQ0RQCQkvKiBDaXNjbyBEaXNjb3ZlcnkgUHJvdG9jb2wgCSovCisjZGVmaW5lIENPTkZJR19DTURfQ09OU09MRQkvKiBjb25pbmZvCQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCQkvKiBzdXBwb3J0IGZvciBSVEMsIGRhdGUvdGltZS4uLiovCisjZGVmaW5lIENPTkZJR19DTURfREhDUAkJLyogREhDUCBTdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCQkvKiBEaWFnbm9zdGljcwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfRElTUExBWQkvKiBEaXNwbGF5IHN1cHBvcnQJCSovCisjZGVmaW5lIENPTkZJR19DTURfRE9DCQkvKiBEaXNrLU9uLUNoaXAgU3VwcG9ydAkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9EVFQJCS8qIERpZ2l0YWwgVGhlcm0gYW5kIFRoZXJtb3N0YXQgKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCQkvKiBlY2hvIGFyZ3VtZW50cwkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00JLyogRUVQUk9NIHJlYWQvd3JpdGUgc3VwcG9ydAkqLworI2RlZmluZSBDT05GSUdfQ01EX0VMRgkJLyogRUxGIChWeFdvcmtzKSBsb2FkL2Jvb3QgY21kCSovCisjZGVmaW5lIENPTkZJR19DTURfRU5WCQkvKiBzYXZlZW52CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCQkvKiBFWFQyIFN1cHBvcnQJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0ZBVAkJLyogRkFUIHN1cHBvcnQJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0ZEQwkJLyogRmxvcHB5IERpc2sgU3VwcG9ydAkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9GRE9TCQkvKiBGbG9wcHkgRE9TIHN1cHBvcnQJCSovCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gJLyogZmxpbmZvLCBlcmFzZSwgcHJvdGVjdAkqLworI2RlZmluZSBDT05GSUdfQ01EX0ZQR0EJCS8qIEZQR0EgY29uZmlndXJhdGlvbiBTdXBwb3J0CSovCisjZGVmaW5lIENPTkZJR19DTURfSFdGTE9XCS8qIFJUUy9DVFMgaHcgZmxvdyBjb250cm9sCSovCisjZGVmaW5lIENPTkZJR19DTURfSTJDCQkvKiBJMkMgc2VyaWFsIGJ1cyBzdXBwb3J0CSovCisjZGVmaW5lIENPTkZJR19DTURfSURFCQkvKiBJREUgaGFyZGRpc2sgc3VwcG9ydAkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkJCS8qIGltaW5mbwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfSU1MUwkJLyogTGlzdCBhbGwgZm91bmQgaW1hZ2VzCSovCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAJLyogSU1NUiBkdW1wIHN1cHBvcnQJCSovCisjZGVmaW5lIENPTkZJR19DTURfSVJRCQkvKiBpcnFpbmZvCQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9JVEVTVAkvKiBJbnRlZ2VyIChhbmQgc3RyaW5nKSB0ZXN0CSovCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIJLyogSkZGUzIgU3VwcG9ydAkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9LR0RCCQkvKiBrZ2RiCQkJCSovCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIJLyogbG9hZGIJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0xPQURTCS8qIGxvYWRzCQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkJLyogbWQgbW0gbm0gbXcgY3AgY21wIGNyYyBiYXNlIGxvb3AgbXRlc3QgKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9NRlNMCQkvKiBGU0wgc3VwcG9ydCBmb3IgTWljcm9ibGF6ZQkqLworI2RlZmluZSBDT05GSUdfQ01EX01JSQkJLyogTUlJIHN1cHBvcnQJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX01JU0MJCS8qIE1pc2MgZnVuY3Rpb25zIGxpa2Ugc2xlZXAgZXRjKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9NTUMJCS8qIE1NQyBzdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECQkvKiBOQU5EIHN1cHBvcnQJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX05FVAkJLyogYm9vdHAsIHRmdHBib290LCByYXJwYm9vdAkqLworI2RlZmluZSBDT05GSUdfQ01EX05GUwkJLyogTkZTIHN1cHBvcnQJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1BDSQkJLyogcGNpaW5mbwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfUENNQ0lBCS8qIFBDTUNJQSBzdXBwb3J0CQkqLworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcJCS8qIHBpbmcgc3VwcG9ydAkJCSovCisjZGVmaW5lIENPTkZJR19DTURfUE9SVElPCS8qIFBvcnQgSS9PCQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCS8qIFJlZ2lzdGVyIGR1bXAJCSovCisjZGVmaW5lIENPTkZJR19DTURfUkVJU0VSCS8qIFJlaXNlcmZzIHN1cHBvcnQJCSovCisjZGVmaW5lIENPTkZJR19DTURfUlVOCQkvKiBydW4gY29tbWFuZCBpbiBlbnYgdmFyaWFibGUJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9TQVZFUwkvKiBzYXZlIFMgcmVjb3JkIGR1bXAJCSovCisjZGVmaW5lIENPTkZJR19DTURfU0NTSQkJLyogU0NTSSBTdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQkvKiBTRFJBTSBESU1NIFNQRCBpbmZvIHByaW50b3V0ICovCisjZGVmaW5lIENPTkZJR19DTURfU0VUR0VURENSCS8qIERDUiBzdXBwb3J0IG9uIDR4eAkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCQkvKiBTTlRQIHN1cHBvcnQJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1NQSQkJLyogU1BJIHV0aWxpdHkJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1VOSVZFUlNFCS8qIFR1bmRyYSBVbml2ZXJzZSBTdXBwb3J0CSovCisjZGVmaW5lIENPTkZJR19DTURfVVNCCQkvKiBVU0IgU3VwcG9ydAkJCSovCisjZGVmaW5lIENPTkZJR19DTURfVkZECQkvKiBWRkQgc3VwcG9ydCAoVFJBQikJCSovCisjZGVmaW5lIENPTkZJR19DTURfWElNRwkJLyogTG9hZCBwYXJ0IG9mIE11bHRpIEltYWdlCSovCisKKyNlbmRpZgkvKiBfQ09ORklHX0NNRF9BTExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdfY21kX2RlZmF1bHQuaCBiL2luY2x1ZGUvY29uZmlnX2NtZF9kZWZhdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxY2ZjOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlnX2NtZF9kZWZhdWx0LmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIFZlcnNpb24gMi4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaWZuZGVmIF9DT05GSUdfQ01EX0RFRkFVTFRfSAorI2RlZmluZSBfQ09ORklHX0NNRF9ERUZBVUxUX0gKKworLyoKKyAqIEFscGhhYmV0aWNhbCBsaXN0IG9mIGFsbCBjb21tYW5kcyB0aGF0IGFyZSBjb25maWd1cmVkIGJ5IGRlZmF1bHQuCisgKiBUaGlzIGlzIGVzc2VudGlhbGx5IGFsbCBjb21tYW5kcyBtaW51cyB0aG9zZSB0aGF0IGFyZSBjb25zaWRlcmVkCisgKiAibm9uLXN0YW5kYXJkIiBmb3Igc29tZSByZWFzb24gKG1lbW9yeSBob2dzLCByZXF1aXJlcyBzcGVjaWFsCisgKiBoYXJkd2FyZSwgbm90IGZ1bGx5IHRlc3RlZCwgZXRjLikuCisgKi8KKworI2RlZmluZSBDT05GSUdfQ01EX0FVVE9TQ1JJUFQJLyogQXV0b3NjcmlwdCBTdXBwb3J0CQkqLworI2RlZmluZSBDT05GSUdfQ01EX0JESQkgICAgICAgCS8qIGJkaW5mbwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfQk9PVEQJLyogYm9vdGQJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0NPTlNPTEUJLyogY29uaW5mbwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfRUNITwkJLyogZWNobyBhcmd1bWVudHMJCSovCisjZGVmaW5lIENPTkZJR19DTURfRU5WCQkvKiBzYXZlZW52CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAkvKiBmbGluZm8sIGVyYXNlLCBwcm90ZWN0CSovCisjZGVmaW5lIENPTkZJR19DTURfRlBHQQkJLyogRlBHQSBjb25maWd1cmF0aW9uIFN1cHBvcnQJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkJCS8qIGltaW5mbwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfSU1MUwkJLyogTGlzdCBhbGwgZm91bmQgaW1hZ2VzCSovCisjZGVmaW5lIENPTkZJR19DTURfSVRFU1QJLyogSW50ZWdlciAoYW5kIHN0cmluZykgdGVzdAkqLworI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCS8qIGxvYWRiCQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEUwkvKiBsb2FkcwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCS8qIG1kIG1tIG5tIG13IGNwIGNtcCBjcmMgYmFzZSBsb29wIG10ZXN0ICovCisjZGVmaW5lIENPTkZJR19DTURfTUlTQwkJLyogTWlzYyBmdW5jdGlvbnMgbGlrZSBzbGVlcCBldGMqLworI2RlZmluZSBDT05GSUdfQ01EX05FVAkJLyogYm9vdHAsIHRmdHBib290LCByYXJwYm9vdAkqLworI2RlZmluZSBDT05GSUdfQ01EX05GUwkJLyogTkZTIHN1cHBvcnQJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1JVTgkJLyogcnVuIGNvbW1hbmQgaW4gZW52IHZhcmlhYmxlCSovCisjZGVmaW5lIENPTkZJR19DTURfU0VUR0VURENSCS8qIERDUiBzdXBwb3J0IG9uIDR4eAkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9YSU1HCQkvKiBMb2FkIHBhcnQgb2YgTXVsdGkgSW1hZ2UJKi8KKworI2VuZGlmCS8qIF9DT05GSUdfQ01EX0RFRkFVTFRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0EzMDAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvQTMwMDAuaAppbmRleCBjYTk1OTJjLi4wYTlhMWZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQTMwMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQTMwMDAuaApAQCAtNTIsMjMgKzUyLDIwIEBACiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKLSNpZiAwCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQkgIENGR19DTURfQkVEQlVHIHwgXAotCQkJCSAgQ0ZHX0NNRF9CU1AgICAgfCBcCi0JCQkJICBDRkdfQ01EX0VMRiAgICB8IFwKLQkJCQkgIENGR19DTURfSTJDIAkgfCBcCi0JCQkJICBDRkdfQ01EX0ZMQVNIIHwgXAotCQkJCSAgQ0ZHX0NNRF9CRURCVUcgfCBcCi0JCQkJICBDRkdfQ01EX05FVCAgICB8IFwKLQkJCQkgIENGR19DTURfUENJICkKLSNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDT05GSUdfQ01EX0RGTCApCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpIAkqLwogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAogCiAvKgpAQCAtMzA5LDcgKzMwNiw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQURDSU9QLmggYi9pbmNsdWRlL2NvbmZpZ3MvQURDSU9QLmgKaW5kZXggODIxZWZlNS4uNDYzMjk5MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0FEQ0lPUC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9BRENJT1AuaApAQCAtNTksMjEgKzU5LDMyIEBACiAjZGVmaW5lIENPTkZJR19JUEFERFIJCTEwLjAuMTguMjIyCiAjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTAuMC4xOC4xOTAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xODUsNyArMTk2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTIwNDgJLyogRm9yIFBMWCBJT1A0ODAJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIEFNQ0MgNDAxLzQwMyBDUFVzCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9BRE5QRVNDMS5oIGIvaW5jbHVkZS9jb25maWdzL0FETlBFU0MxLmgKaW5kZXggMmVmY2ExMC4uNzc5MzhiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0FETlBFU0MxLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0FETlBFU0MxLmgKQEAgLTQwMSwxNSArNDAxLDggQEAKICNkZWZpbmUJQ09ORklHX1JUQ19EUzEzMDYJMQkvKiBEYWxsYXMgMTMwNiByZWFsIHRpbWUgY2xvY2sJKi8KICNkZWZpbmUgQ0ZHX1NQSV9SVENfREVWSUQJMAkvKiAgICAgICAgYXMgMXN0IFNQSSBkZXZpY2UJKi8KIAotI2RlZmluZQlfX1NQSV9DTURfT0ZGCQkwCS8qIGFsbG93IGRlZmF1bHQgY29tbWFuZHM6CSovCi0JCQkJCS8qCUNGR19DTURfU1BJCQkqLwotCQkJCQkvKglDRkdfQ01EX0RBVEUJCSovCi0KICNlbHNlCiAjdW5kZWYJQ09ORklHX05JT1NfU1BJCQkJCS8qIE5PIFNQSSBzdXBwb3J0CSovCi0jZGVmaW5lCV9fU1BJX0NNRF9PRkYJKAlDRkdfQ01EX1NQSQlcCi0JCQl8CUNGR19DTURfREFURQlcCi0JCQkpCiAjZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTU3MCw0NSArNTYzLDU1IEBACiAjZGVmaW5lCUNPTkZJR19QT1NUCQkJQ0ZHX1BPU1RfUlRDCiAjZGVmaW5lCUNGR19OSU9TX1BPU1RfV09SRF9BRERSCQkoQ0ZHX01PTklUT1JfQkFTRSArIENGR19NT05JVE9SX0xFTikKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENPTU1BTkRTCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0FMTCAmIH4oIFwKLQkJCQkgQ0ZHX0NNRF9BU0tFTlYgfCBcCi0JCQkJIENGR19DTURfQkVEQlVHIHwgXAotCQkJCSBDRkdfQ01EX0JNUAl8IFwKLQkJCQkgQ0ZHX0NNRF9DQUNIRQl8IFwKLQkJCQkgQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJIENGR19DTURfRFRUCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTSB8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYgICAgfCBcCi0JCQkJIENGR19DTURfRkFUCXwgXAotCQkJCSBDRkdfQ01EX0ZEQwl8IFwKLQkJCQkgQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCSBDRkdfQ01EX0hXRkxPVwl8IFwKLQkJCQkgQ0ZHX0NNRF9JREUJfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX0pGRlMyCXwgXAotCQkJCSBDRkdfQ01EX0tHREIJfCBcCi0JCQkJIENGR19DTURfTkFORAl8IFwKLQkJCQkgQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJIENGR19DTURfTU1DCXwgXAotCQkJCSBDRkdfQ01EX01JSQl8IFwKLQkJCQkgQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJIENGR19DTURfUENNQ0lBIHwgXAotCQkJCSBDRkdfQ01EX1NDU0kJfCBcCi0JCQkJIENGR19DTURfVkZECXwgXAotCQkJCSBDRkdfQ01EX1VTQgl8IFwKLQkJCQkgQ0ZHX0NNRF9YSU1HCXwgXAotCQkJCSBfX1NQSV9DTURfT0ZGCSkgKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9hbGwuaD4KIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI3VuZGVmIENPTkZJR19DTURfQVNLRU5WCisjdW5kZWYgQ09ORklHX0NNRF9CRURCVUcKKyN1bmRlZiBDT05GSUdfQ01EX0JNUAorI3VuZGVmIENPTkZJR19DTURfQ0FDSEUKKyN1bmRlZiBDT05GSUdfQ01EX0RPQworI3VuZGVmIENPTkZJR19DTURfRFRUCisjdW5kZWYgQ09ORklHX0NNRF9FRVBST00KKyN1bmRlZiBDT05GSUdfQ01EX0VMRgorI3VuZGVmIENPTkZJR19DTURfRkFUCisjdW5kZWYgQ09ORklHX0NNRF9GREMKKyN1bmRlZiBDT05GSUdfQ01EX0ZET1MKKyN1bmRlZiBDT05GSUdfQ01EX0hXRkxPVworI3VuZGVmIENPTkZJR19DTURfSURFCisjdW5kZWYgQ09ORklHX0NNRF9JMkMKKyN1bmRlZiBDT05GSUdfQ01EX0pGRlMyCisjdW5kZWYgQ09ORklHX0NNRF9LR0RCCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9ORlMKKyN1bmRlZiBDT05GSUdfQ01EX01NQworI3VuZGVmIENPTkZJR19DTURfTUlJCisjdW5kZWYgQ09ORklHX0NNRF9QQ0kKKyN1bmRlZiBDT05GSUdfQ01EX1BDTUNJQQorI3VuZGVmIENPTkZJR19DTURfU0NTSQorI3VuZGVmIENPTkZJR19DTURfVkZECisjdW5kZWYgQ09ORklHX0NNRF9VU0IKKyN1bmRlZiBDT05GSUdfQ01EX1hJTUcKKworI2lmIChDRkdfTklPU19DUFVfU1BJX05VTVMgIT0gMSkKKyN1bmRlZiBDT05GSUdfQ01EX1NQSQorI3VuZGVmIENPTkZJR19DTURfREFURQorI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBLR0RCCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTk2MDAKICNlbmRpZgogCkBAIC02NTEsNyArNjU0LDYgQEAKICN1bmRlZglDRkdfTE9BRF9BRERSCQkvKiBmb3JjZSBlcnJvciBicmVhayAqLwogI2VuZGlmCiAKLQogLyogTUVNIHRlc3QgYXJlYSAqLwogI2lmCShDRkdfU0RSQU1fU0laRSAhPSAwKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQURTODYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvQURTODYwLmgKaW5kZXggZGYyMDk2NS4uMmVlOGM2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0FEUzg2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9BRFM4NjAuaApAQCAtMzcsMTMgKzM3LDE5IEBACiAKICNkZWZpbmUgQ09ORklHX0RSQU1fNTBNSFoJCTEKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENPTkZJR19DTURfREZMICAgXAotCQkJIHwgQ0ZHX0NNRF9ESENQICAgXAotCQkJIHwgQ0ZHX0NNRF9JTU1BUCAgXAotCQkJIHwgQ0ZHX0NNRF9QQ01DSUEgXAotCQkJIHwgQ0ZHX0NNRF9QSU5HICAgXAotCQkJKQogCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX1BDTUNJQQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKworLyogVGhpcyBpcyBwaWNrZWQgdXAgYWdhaW4gaW4gZmFkcy5oICovCisjZGVmaW5lIEZBRFNfQ09NTUFORFNfQUxSRUFEWV9ERUZJTkVECiAKICNpbmNsdWRlICJmYWRzLmgiCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9BTVg4NjAuaCBiL2luY2x1ZGUvY29uZmlncy9BTVg4NjAuaAppbmRleCAxNGQ1NmJmLi42ZjY0MDM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQU1YODYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0FNWDg2MC5oCkBAIC02MSw3ICs2MSwyNSBAQAogCiAjdW5kZWYgQ09ORklHX0JPT1RBUkdTCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLworCisjZGVmaW5lCUNPTkZJR19TQ0MxX0VORVQJMQkvKiB1c2UgU0NDMSBldGhlcm5ldCAqLworCisjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLworCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjZGVmaW5lCUNPTkZJR19LR0RCX09OX1NDQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU0NDICovCiAjdW5kZWYJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTcwLDI5ICs4OCwyMiBAQAogI2VuZGlmCiAKIAotI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKIAotI2RlZmluZQlDT05GSUdfU0NDMV9FTkVUCTEJLyogdXNlIFNDQzEgZXRoZXJuZXQgKi8KLQotI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KLQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCi0KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKLQotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xOTYsNyArMjA3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FQMTAwMC5oIGIvaW5jbHVkZS9jb25maWdzL0FQMTAwMC5oCmluZGV4IGJhNGIxYTIuLmQyNWFhNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BUDEwMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQVAxMDAwLmgKQEAgLTY2LDE4ICs2NiwyOCBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NVkVOVgl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJXAotCQkJICAgICAgICkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTVZFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCSAgICAqLwogCkBAIC04OSw3ICs5OSw3IEBACiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTg4LDcgKzE5OCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgICAgKi8KICNlbmRpZgogCkBAIC0yMjgsNyArMjM4LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FQQzQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0FQQzQwNS5oCmluZGV4IDNkZjk5YTAuLmY2NDk1ZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BUEM0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQVBDNDA1LmgKQEAgLTY3LDI3ICs2NywzOCBAQAogCiAjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJRU1BQ19TVEFDUl9DTEtfNjZNSFogLyogNjYgTUh6IE9QQiBjbG9jayovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00gICkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUgQ09ORklHX1NVUFBPUlRfVkZBVAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICN1bmRlZiAgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NQzE0NjgxOCAgICAgICAgICAgICAvKiBEUzE2ODUgaXMgTUMxNDY4MTggY29tcGF0aWJsZSovCkBAIC0xMDYsNyArMTE3LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjY2LDcgKzI3Nyw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncyAgICovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlICAgICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQVI0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9BUjQwNS5oCmluZGV4IDFjZDAyODAuLjBmMzAxZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BUjQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9BUjQwNS5oCkBAIC03MSwxNyArNzEsMjkgQEAKICNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkwCS8qIFBIWSBhZGRyZXNzCQkJKi8KICNkZWZpbmUgQ09ORklHX0xYVDk3MV9OT19TTEVFUCAgMSAgICAgICAvKiBkaXNhYmxlIHNsZWVwIG1vZGUgaW4gTFhUOTcxICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0JTUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0JTUAorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtOTIsNyArMTA0LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjA3LDcgKzIxOSw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQVNINDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvQVNINDA1LmgKaW5kZXggZDAzYzA1Yi4uOWUwZWUzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0FTSDQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9BU0g0MDUuaApAQCAtNTksMTkgKzU5LDMxIEBACiAKICNkZWZpbmUgQ09ORklHX1BIWV9DTEtfRlJFUQlFTUFDX1NUQUNSX0NMS182Nk1IWiAvKiA2NiBNSHogT1BCIGNsb2NrKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtOTEsNyArMTAzLDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjcwLDcgKzI4Miw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQWRkZXIuaCBiL2luY2x1ZGUvY29uZmlncy9BZGRlci5oCmluZGV4IDBlNmI1MGYuLjQzMDRlY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BZGRlci5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9BZGRlci5oCkBAIC01MiwxNSArNTIsMjYgQEAKICNkZWZpbmUgQ0ZHXzh4eF9DUFVDTEtfTUFYCQkxMzMwMDAwMDAKICNlbmRpZiAvKiBDT05GSUdfTVBDODUyVCAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMICBcCi0JCQkJfCBDRkdfQ01EX0RIQ1AgICBcCi0JCQkJfCBDRkdfQ01EX0lNTUFQICBcCi0JCQkJfCBDRkdfQ01EX01JSSAgICBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgICBcCi0JCQkJKQogCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CQkvKiBBdXRvYm9vdCBhZnRlciA1IHNlY29uZHMJKi8KICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSBmZTA0MDAwMCIJLyogQXV0b2Jvb3QgY29tbWFuZAkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FkZGVyVVNCLmggYi9pbmNsdWRlL2NvbmZpZ3MvQWRkZXJVU0IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGY3ZjlhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL0FkZGVyVVNCLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBDb2RlSGVybWl0LgorICogQnJ5YW4gTydEb25vZ2h1ZSA8Ym9kb25vZ2h1ZUBjb2RlaGVybWl0LmllPgorICoKKyAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIFVTQiBjb25zb2xlIG9uIHRoZSBBbmFsb2d1ZSAmIE1pY3JvIEFkZGVyODd4CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0FEREVSVVNCX18KKyNkZWZpbmUgX19BRERFUlVTQl9fCisKKy8qIEluY2x1ZGUgdGhlIGJvYXJkIHBvcnQgKi8KKyNpbmNsdWRlICJBZGRlci5oIgorCisjZGVmaW5lIENPTkZJR19VU0JfREVWSUNFCQkvKiBJbmNsdWRlIFVEQyBkcml2ZXIgKi8KKyNkZWZpbmUgQ09ORklHX1VTQl9UVFkJCQkvKiBCaW5kIHRoZSBUVFkgZHJpdmVyIHRvIFVEQyAqLworI2RlZmluZSBDRkdfVVNCX0VYVENfQ0xLIDB4MDIJCS8qIE9zY2lsbGF0b3Igb24gRVhUQ19DTEsgMiAqLworI2RlZmluZSBDRkdfVVNCX0JSR19DTEsJMHgwNAkJLyogb3IgdXNlIEJhdWQgcmF0ZSBnZW5lcmF0b3IgMHgwNCAqLworI2RlZmluZSBDRkdfQ09OU09MRV9JU19JTl9FTlYJCS8qIENvbnNvbGUgaXMgaW4gZW52ICovCisKKy8qIElmIHlvdSBoYXZlIGEgVVNCLUlGIGFzc2lnbmVkIFZlbmRvcklEIHRoZW4geW91IG1heSB3aXNoIHRvIGRlZmluZQorICogeW91ciBvd24gdmVuZG9yIHNwZWNpZmljIHZhbHVlcyBlaXRoZXIgaW4gQm9hcmROYW1lLmggb3IgZGlyZWN0bHkgaW4KKyAqIHVzYmRfdmVuZG9yX2luZm8uaAorICovCisKKy8qCisjZGVmaW5lIENPTkZJR19VU0JEX01BTlVGQUNUVVJFUgkiQ29kZUhlcm1pdC5pZSIKKyNkZWZpbmUgQ09ORklHX1VTQkRfUFJPRFVDVF9OQU1FCSJEYXMgVS1Cb290IgorI2RlZmluZSBDT05GSUdfVVNCRF9WRU5ET1JJRAkJMHhGRkZGCisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RJRF9HU0VSSUFMCTB4RkZGRgorI2RlZmluZSBDT05GSUdfVVNCRF9QUk9EVUNUSURfQ0RDQUNNCTB4RkZGRQorKi8KKworI2VuZGlmIC8qIF9fQURERVJVU0JfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQWxhc2thODIyMC5oIGIvaW5jbHVkZS9jb25maWdzL0FsYXNrYTgyMjAuaAppbmRleCBjMDhiMmMzLi4zZjJmNjE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQWxhc2thODIyMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9BbGFza2E4MjIwLmgKQEAgLTM5LDEyICszOSw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyMjAgQ1BVcyAqLwotCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUgICAvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTcwLDMxICs2NCw0MCBAQAogCiAjZGVmaW5lIENPTkZJR19USU1FU1RBTVAJCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKKwogLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcworICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQk9PVEQJfCBcCi0JCQkJQ0ZHX0NNRF9DQUNIRQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8gfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JPT1RECisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCiAjZGVmaW5lIENPTkZJR19NSUkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogQXV0b2Jvb3RpbmcKICAqLwpAQCAtMjgyLDcgKzI4NSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJICAgIC8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCSAgICAvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI5OCw2ICszMDEsMTEgQEAKIAogI2RlZmluZSBDRkdfSFoJCQkxMDAwCSAgICAvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjIwIENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUgICAvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKIC8qCiAgKiBWYXJpb3VzIGxvdy1sZXZlbCBzZXR0aW5ncwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQW1pZ2FPbmVHM1NFLmggYi9pbmNsdWRlL2NvbmZpZ3MvQW1pZ2FPbmVHM1NFLmgKaW5kZXggZWE1MGY0MS4uZDkxNGRjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0FtaWdhT25lRzNTRS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9BbWlnYU9uZUczU0UuaApAQCAtNTYsMzggKzU2LDQ2IEBACiAKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkicm9vdD0vZGV2L3JhbSBydyByYW1kaXNrPTQwOTYiCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19BTUlHQV9QQVJUSVRJT04KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQkgQ0ZHX0NNRF9BU0tFTlYgfCBcCi0JCQkJIENGR19DTURfQlNQCXwgXAotCQkJCSBDRkdfQ01EX0RBVEUJfCBcCi0JCQkJIENGR19DTURfREhDUAl8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJIENGR19DTURfTkVUCXwgXAotCQkJCSBDRkdfQ01EX0lERQl8IFwKLQkJCQkgQ0ZHX0NNRF9GREMJfCBcCi0JCQkJIENGR19DTURfQ0FDSEUJfCBcCi0JCQkJIENGR19DTURfQ09OU09MRXwgXAotCQkJCSBDRkdfQ01EX1VTQgl8IFwKLQkJCQkgQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJIENGR19DTURfUENJCSkKIAotLyoJCQkJICAgIENGR19DTURfTUlJCSAgIHwgXCAqLworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0ZEQworI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfQ09OU09MRXwKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKwogCiAjZGVmaW5lIENPTkZJR19QQ0kJCTEKIC8qICNkZWZpbmUgQ09ORklHX1BDSV9TQ0FOX1NIT1cgMSAqLwogI2RlZmluZSBDT05GSUdfUENJX1BOUAkJMQkvKiBQQ0kgcGx1Zy1hbmQtcGxheSAqLwogCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCi0gKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQorI2RlZmluZSBhdG9pKHgpCQlzaW1wbGVfc3RydG91bCh4LE5VTEwsMTApCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0yNDcsNyArMjU1LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKQEAgLTM0OCw4ICszNTYsNiBAQAogCiAjZGVmaW5lIENPTkZJR18zQ09NCiAvKiAjZGVmaW5lIENPTkZJR19CT09UUF9SQU5ET01fREVMQVkgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQogCiAvKgogICogVVNCIGNvbmZpZ3VyYXRpb24KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9CMi5oIGIvaW5jbHVkZS9jb25maWdzL0IyLmgKaW5kZXggZTU1ODU4ZC4uZjE0MTFkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0IyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0IyLmgKQEAgLTcyLDE2ICs3MiwyNiBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgICAgICAgKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9EQVRFIHwgXAotCQkJCQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJCQkJCUNGR19DTURfSTJDCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKICNkZWZpbmUgQ09ORklHX0VUSEFERFIJMDA6NTA6YzI6MWU6YWY6ZmIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9CQUI3eHguaCBiL2luY2x1ZGUvY29uZmlncy9CQUI3eHguaAppbmRleCA0NmJkZmEyLi5jMTFlOWM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQkFCN3h4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0JBQjd4eC5oCkBAIC02NiwxNCArNjYsMzAgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8gICAgICAgMCAgICAgICAvKiBlY2hvIG9mZiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRSAgICAgICAgICAgLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlcyAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgICAgIChDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgICAoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IENGR19DTURfSkZGUzIgfFwKLQkJCQkgQ0ZHX0NNRF9TQ1NJICAgfCBDRkdfQ01EX0lERSB8IENGR19DTURfREFURSAgfFwKLQkJCQkgQ0ZHX0NNRF9GREMgICAgfCBDRkdfQ01EX0VMRikKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9TQ1NJCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0ZEQworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC04Niw3ICsxMDIsNyBAQAogICovCiAjZGVmaW5lIENPTkZJR19DT05TX0lOREVYICAgICAgIDEKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUgICAgICAgICAgICAgIDEwMjQgICAgICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFICAgICAgICAgICAgICAyNTYgICAgICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNDM2LDcgKzQ1Miw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFICAgICAgICAzMiAgICAvKiBGb3IgYWxsIE1QQzc0eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQgICAgICAgIDUgICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQkMzNDUwLmggYi9pbmNsdWRlL2NvbmZpZ3MvQkMzNDUwLmgKaW5kZXggYmMzMDk3Ny4uNWMyYmZjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0JDMzQ1MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9CQzM0NTAuaApAQCAtNjEsMTEgKzYxLDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkJICAgICovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMJCSAgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICAgICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtMTA2LDEyICsxMDEsNiBAQAogI2RlZmluZSBDRkdfUlhfRVRIX0JVRkZFUgk4CS8qIHVzZSA4IHJ4IGJ1ZmZlciBvbiBlZXBybzEwMAkqLwogI2RlZmluZSBDT05GSUdfTlM4MzgyWAkJMQogCi0jaWZkZWYgQ09ORklHX1BDSQotIyBkZWZpbmUgQUREX1BDSV9DTUQJCUNGR19DTURfUENJCi0jZWxzZQotIyBkZWZpbmUgQUREX1BDSV9DTUQJCTAKLSNlbmRpZgotCiAvKgogICogVmlkZW8gY29uc29sZQogICovCkBAIC0xMjYsMTIgKzExNSw2IEBACiAjIGRlZmluZSBDT05GSUdfU1BMQVNIX1NDUkVFTgogIyBkZWZpbmUgQ0ZHX0NPTlNPTEVfSVNfSU5fRU5WCiAKLSNpZmRlZiBDT05GSUdfVklERU8KLSMgZGVmaW5lIEFERF9CTVBfQ01ECQlDRkdfQ01EX0JNUAotI2Vsc2UKLSMgZGVmaW5lIEFERF9CTVBfQ01ECQkwCi0jZW5kaWYKLQogLyoKICAqIFBhcnRpdGlvbnMKICAqLwpAQCAtMTQ0LDEwICsxMjcsNyBAQAogICovCiAjaWZkZWYgQ09ORklHX0JDMzQ1MF9VU0IKICMgZGVmaW5lIENPTkZJR19VU0JfT0hDSQotIyBkZWZpbmUgQUREX1VTQl9DTUQJCUNGR19DTURfVVNCCiAjIGRlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UKLSNlbHNlIC8qICFDT05GSUdfQkMzNDUwX1VTQiAqLwotIyBkZWZpbmUgQUREX1VTQl9DTUQJCTAKICNlbmRpZiAvKiBDT05GSUdfQkMzNDUwX1VTQiAqLwogCiAvKgpAQCAtMTU4LDY2ICsxMzgsNjkgQEAKIAkJCQkgQ0ZHX1BPU1RfSTJDKQogCiAjaWZkZWYgQ09ORklHX1BPU1QKLSMgZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIENGR19DTURfRElBRwogLyogcHJlc2VydmUgc3BhY2UgZm9yIHRoZSBwb3N0X3dvcmQgYXQgZW5kIG9mIG9uLWNoaXAgU1JBTSAqLwogIyBkZWZpbmUgTVBDNVhYWF9TUkFNX1BPU1RfU0laRSBNUEM1WFhYX1NSQU1fU0laRS00Ci0jZWxzZQotIyBkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcgMAogI2VuZGlmIC8qIENPTkZJR19QT1NUICovCiAKKwogLyoKLSAqIElERQorICogQk9PVFAgb3B0aW9ucwogICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKworI2lmZGVmIENPTkZJR19WSURFTworICAgICNkZWZpbmUgQ09ORklHX0NNRF9CTVAKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0JDMzQ1MF9JREUKLSMgZGVmaW5lIEFERF9JREVfQ01ECQlDRkdfQ01EX0lERQotI2Vsc2UKLSMgZGVmaW5lIEFERF9JREVfQ01ECQkwCi0jZW5kaWYgLyogQ09ORklHX0JDMzQ1MF9JREUgKi8KKyAgICAjZGVmaW5lIENPTkZJR19DTURfSURFCisjZW5kaWYKIAotLyoKLSAqIEZpbGVzeXN0ZW0gc3VwcG9ydAotICovCi0jaWYgZGVmaW5lZCAoQ09ORklHX0JDMzQ1MF9JREUpIHx8IGRlZmluZWQgKENPTkZJR19CQzM0NTBfVVNCKQotI2lmZGVmIENPTkZJR19GQVQKLSMgZGVmaW5lIEFERF9GQVRfQ01ECQlDRkdfQ01EX0ZBVAotI2Vsc2UKLSMgZGVmaW5lIEFERF9GQVRfQ01ECQkwCi0jZW5kaWYgLyogQ09ORklHX0ZBVCAqLworI2lmIGRlZmluZWQoQ09ORklHX0JDMzQ1MF9JREUpIHx8IGRlZmluZWQoQ09ORklHX0JDMzQ1MF9VU0IpCisgICAgI2lmZGVmIENPTkZJR19GQVQKKwkjZGVmaW5lIENPTkZJR19DTURfRkFUCisgICAgI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfRVhUMgotIyBkZWZpbmUgQUREX0VYVDJfQ01ECQlDRkdfQ01EX0VYVDIKLSNlbHNlCi0jIGRlZmluZSBBRERfRVhUMl9DTUQJCTAKLSNlbmRpZiAvKiBDT05GSUdfRVhUMiAqLwotI2VuZGlmIC8qIENPTkZJR19CQzM0NTBfSURFIC8gX1VTQiAqLworICAgICNpZmRlZiBDT05GSUdfRVhUMgorCSNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisgICAgI2VuZGlmCisjZW5kaWYKIAotLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcwotICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUFERF9CTVBfQ01ECXwgXAotCQkJCUFERF9JREVfQ01ECXwgXAotCQkJCUFERF9GQVRfQ01ECXwgXAotCQkJCUFERF9FWFQyX0NNRAl8IFwKLQkJCQlBRERfUENJX0NNRAl8IFwKLQkJCQlBRERfVVNCX0NNRAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUNITwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1BPU1RfRElBRyB8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8gfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCXwgXAotCQkJCUNGR19DTURfQlNQKQorI2lmZGVmIENPTkZJR19CQzM0NTBfVVNCCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1VTQgorI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpZmRlZiBDT05GSUdfUENJCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUE9TVAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZW5kaWYKKwogCiAjZGVmaW5lIENPTkZJR19USU1FU1RBTVAJCS8qIGRpc3BsYXkgaW1hZ2UgdGltZXN0YW1wcyAqLwogCkBAIC00NTAsNyArNDMzLDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC00NjksOSArNDUyLDEzIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkJLyogZGVjIGZyZXE6IDFtcyB0aWNrcwkgICAgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcwkJICAgICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICAgICovCisjZW5kaWYKKwogLyoKLSAqIEVuYWJsZSBsb29wdyBjb21tYW5kby4gVGhpcyBoYXMgb25seSBhZmZlY3QsIGlmIENGR19DTURfTUVNIGlzIGRlZmluZWQsCi0gKiB3aGljaCBpcyBub3JtYWxseSBwYXJ0IG9mIHRoZSBkZWZhdWx0IGNvbW1hbmRzIChDRlZfQ01EX0RGTCkKKyAqIEVuYWJsZSBsb29wdyBjb21tYW5kLgogICovCiAjZGVmaW5lIENPTkZJR19MT09QVwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQk1XLmggYi9pbmNsdWRlL2NvbmZpZ3MvQk1XLmgKaW5kZXggM2JkNDNkOC4uYmI3ODU2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0JNVy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9CTVcuaApAQCAtNjQsMjggKzY0LDM1IEBACiAjZGVmaW5lIENGR19ET0NfU1VQUE9SVF8yMDAwICAgIDEKICNkZWZpbmUgQ0ZHX0RPQ19TVVBQT1JUX01JTExFTk5JVU0gMQogI2RlZmluZSBDRkdfRE9DX1NIT1JUX1RJTUVPVVQgICAgMQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJMCApCiAKLS8qIENGR19DTURfRE9DIHJlcXVpcmVkIGxlZ2FjeSBOQU5EIHN1cHBvcnQgKi8KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ET0MKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKworCisvKiBDT05GSUdfQ01EX0RPQyByZXF1aXJlZCBsZWdhY3kgTkFORCBzdXBwb3J0ICovCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogCiAjaWYgMAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBDRkdfQ01EX0RIQ1AgfCBcCi0JCQkJIENGR19DTURfUENJIHwgQ0ZHX0NNRF9ET0MgfCBDRkdfQ01EX0RBVEUpCi0KICNkZWZpbmUgQ09ORklHX1BDSQkJMQogI2RlZmluZSBDT05GSUdfUENJX1BOUAkJMQkvKiBQQ0kgcGx1Zy1hbmQtcGxheSAqLwogI2VuZGlmCiAKLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkKLSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCi0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KQEAgLTI5Myw3ICszMDAsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICAgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ0FOQlQuaCBiL2luY2x1ZGUvY29uZmlncy9DQU5CVC5oCmluZGV4IGUwMjYyYTguLmFlMzJmNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9DQU5CVC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DQU5CVC5oCkBAIC01NiwxMyArNTYsMjYgQEAKIAogI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTAJLyogUEhZIGFkZHJlc3MJCQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICgoIENPTkZJR19DTURfREZMCXwJXAotCQkJCUNGR19DTURfSVJRCXwJXAotCQkJCUNGR19DTURfRUVQUk9NCSAgICApICYgXAotCQkJICAgICAgIH5DRkdfQ01EX05FVCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCisjdW5kZWYgQ09ORklHX0NNRF9ORVQKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTczLDcgKzg2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTczLDcgKzE4Niw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCS8qIEZvciBBTUNDIDQwNSBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NBVGNlbnRlci5oIGIvaW5jbHVkZS9jb25maWdzL0NBVGNlbnRlci5oCmluZGV4IDdlYzQ1OTkuLjYyYTJlYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9DQVRjZW50ZXIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ0FUY2VudGVyLmgKQEAgLTExOSwyNCArMTE5LDM2IEBACiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCiAjZGVmaW5lIENPTkZJR19SVENfTUMxNDY4MTgJCS8qIERTMTY4NSBpcyBNQzE0NjgxOCBjb21wYXRpYmxlKi8KQEAgLTE1NSw3ICsxNjcsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC00MTMsNyArNDI1LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DQ00uaCBiL2luY2x1ZGUvY29uZmlncy9DQ00uaAppbmRleCBlODk5NGZmLi45ZjA2OTU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ0NNLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NDTS5oCkBAIC05NCwyNyArOTQsMzUgQEAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04JCS8qIG5vZCB1c2VkIHlldAkJCSovCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ01TNzAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvQ01TNzAwLmgKaW5kZXggMWNjYTI4NS4uMDhlZjliNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NNUzcwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DTVM3MDAuaApAQCAtNjAsMjYgKzYwLDM1IEBACiAjZGVmaW5lIENPTkZJR19MWFQ5NzFfTk9fU0xFRVAgIDEgICAgICAgLyogZGlzYWJsZSBzbGVlcCBtb2RlIGluIExYVDk3MSAqLwogI2RlZmluZSBDT05GSUdfUkVTRVRfUEhZX1IgICAgICAxICAgICAgIC8qIHVzZSByZXNldF9waHkoKSB0byBkaXNhYmxlIHBoeSBzbGVlcCBtb2RlICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TMiB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUgKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUzIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogCkBAIC0xMDAsNyArMTA5LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjg5LDcgKzI5OCw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDNDUuaCBiL2luY2x1ZGUvY29uZmlncy9DUEM0NS5oCmluZGV4IGI4ODJmN2EuLmFlYTg1MjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9DUEM0NS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUEM0NS5oCkBAIC01NCwyNyArNTQsMzYgQEAKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQotCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9FWFQyCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfRkxBU0gJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfU0RSQU0JfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKLQotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCiAKIAogLyoKQEAgLTMyNSw3ICszMzQsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NQQ0kyRFAuaCBiL2luY2x1ZGUvY29uZmlncy9DUENJMkRQLmgKaW5kZXggNTZmZDlhNi4uYTM3MTdiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQQ0kyRFAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTJEUC5oCkBAIC01NCwxNiArNTQsMjkgQEAKICNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQJCSovCiAjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMAkvKiBQSFkgYWRkcmVzcwkJCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggKENPTkZJR19DTURfREZMCSYgfkNGR19DTURfTkVUKSB8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKKyN1bmRlZiBDT05GSUdfQ01EX05FVAorCiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtODAsNyArOTMsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMTYsNyArMjI5LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUENJNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNS5oCmluZGV4IDlhY2RlMWUuLjBhNGUxZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9DUENJNDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUuaApAQCAtNjAsMjkgKzYwLDM4IEBACiAjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJMQogI3VuZGVmICBDT05GSUdfSEFTX0VUSDEKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMyIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSApCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUworI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgorI2RlZmluZSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZSBDT05GSUdfU1VQUE9SVF9WRkFUCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwpAQCAtMTAwLDcgKzEwOSw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI2NCw3ICsyNzMsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUENJNDA1Mi5oIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUyLmgKaW5kZXggM2ZjOTljNS4uY2VlYmE2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUyLmgKQEAgLTY0LDI1ICs2NCwzNyBAQAogCiAjZGVmaW5lIENPTkZJR19SVENfTTQ4VDM1QQkxCQkvKiBTVCBFbGVjdHJvbmljcyBNNDggdGltZWtlZXBlciAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUyB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUzIgfCBcCi0JCQkJIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjaWYgMCAvKiB0ZXN0LW9ubHkgKi8KICNkZWZpbmUgQ09ORklHX05FVENPTlNPTEUKQEAgLTEwMiw5ICsxMTQsNiBAQAogI2RlZmluZSBDT05GSUdfQVVUT19VUERBVEUgICAgICAxICAgICAgIC8qIGF1dG91cGRhdGUgdmlhIGNvbXBhY3RmbGFzaCAgKi8KICNlbmRpZgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KQEAgLTEyMiw3ICsxMzEsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMTYsNyArMzI1LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUENJNDA1QUIuaCBiL2luY2x1ZGUvY29uZmlncy9DUENJNDA1QUIuaAppbmRleCA0ZTJlMWE4Li4xYWVmYmJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNUFCLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDVBQi5oCkBAIC02NCwzMyArNjQsNDIgQEAKIAogI2RlZmluZSBDT05GSUdfUlRDX000OFQzNUEJMQkJLyogU1QgRWxlY3Ryb25pY3MgTTQ4IHRpbWVrZWVwZXIgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMyIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSApCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUworI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgorI2RlZmluZSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogCiAKQEAgLTEwOSw3ICsxMTgsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yODgsNyArMjk3LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUENJNDA1RFQuaCBiL2luY2x1ZGUvY29uZmlncy9DUENJNDA1RFQuaAppbmRleCBhYjMwMmRmLi5lMjY1MmU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNURULmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDVEVC5oCkBAIC02MywyNSArNjMsMzcgQEAKIAogI2RlZmluZSBDT05GSUdfUlRDX000OFQzNUEJMQkJLyogU1QgRWxlY3Ryb25pY3MgTTQ4IHRpbWVrZWVwZXIgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMyIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSApCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUworI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgorI2RlZmluZSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI2lmIDAgLyogdGVzdC1vbmx5ICovCiAjZGVmaW5lIENPTkZJR19ORVRDT05TT0xFCkBAIC05OSw5ICsxMTEsNiBAQAogCiAjdW5kZWYgIENPTkZJR19BVVRPX1VQREFURSAgICAgICAgICAgICAgLyogYXV0b3VwZGF0ZSB2aWEgY29tcGFjdGZsYXNoICAqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KQEAgLTExOSw3ICsxMjgsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMTgsNyArMzI3LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUENJNDQwLmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQ0MC5oCmluZGV4IDdiNWY3MjguLjMxOGFkYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9DUENJNDQwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0NDAuaApAQCAtMTcyLDI5ICsxNzIsMjcgQEAKICNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkxCS8qIFBIWSBhZGRyZXNzCQkJKi8KICNkZWZpbmUgQ09ORklHX0xYVDk3MV9OT19TTEVFUCAgMSAgICAgICAvKiBkaXNhYmxlIHNsZWVwIG1vZGUgaW4gTFhUOTcxICovCiAKLSNpZiAwIC8qIHRlc3Qtb25seSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0tHREIJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0VMRgkpCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQotLyogdGVzdC1vbmx5OiBzdXBwb3J0IGZlaGx0IGJpc2hlci4uLiAqLwotLyoJCQkJQ0ZHX0NNRF9JREUJfCBcKi8KLS8qCQkJCUNGR19DTURfUENJCXwgXCovCi0jZW5kaWYKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTIwNSw3ICsyMDMsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNjksNyArMjY3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CS8qIEZvciBBTUNDIDQ0MCBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMjkxLDcgKzI4OSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTc1MC5oIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k3NTAuaAppbmRleCBiYzIzZmMwLi40OGUyOWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTc1MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUENJNzUwLmgKQEAgLTEzMywzMCArMTMzLDM3IEBACiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAjdW5kZWYJQ09ORklHX0FMVElWRUMJCQkvKiB1bmRlZiB0byBkaXNhYmxlCQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENPTkZJR19DTURfREZMCSAgIFwKLQkJCSB8IENGR19DTURfQVNLRU5WICBcCi0JCQkgfCBDRkdfQ01EX0kyQwkgICBcCi0JCQkgfCBDRkdfQ01EX0NBQ0hFICAgXAotCQkJIHwgQ0ZHX0NNRF9FRVBST00gIFwKLQkJCSB8IENGR19DTURfUENJCSAgIFwKLQkJCSB8IENGR19DTURfRUxGCSAgIFwKLQkJCSB8IENGR19DTURfREFURQkgICBcCi0JCQkgfCBDRkdfQ01EX05FVAkgICBcCi0JCQkgfCBDRkdfQ01EX1BJTkcJICAgXAotCQkJIHwgQ0ZHX0NNRF9JREUJICAgXAotCQkJIHwgQ0ZHX0NNRF9GQVQJICAgXAotCQkJIHwgQ0ZHX0NNRF9FWFQyCSAgIFwKLQkJCQkJKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorCiAKICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENPTkZJR19VU0VfQ1BDSURWSQogCiAjaWZkZWYJQ09ORklHX1VTRV9DUENJRFZJCkBAIC0xNzksNyArMTg2LDcgQEAKICNkZWZpbmUgQ0ZHX0dUX0RVQUxfQ1BVCQkJLyogYWxzbyBmb3IgSlRBRyBldmVuIHdpdGggb25lIGNwdSAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtNTg1LDcgKzU5Miw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBhbGwgTVBDNzR4eCBDUFVzCQkgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSUlTRVI0LmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSUlTRVI0LmgKaW5kZXggOTNkNDlmMy4uYzdiNjIzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQQ0lJU0VSNC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUENJSVNFUjQuaApAQCAtNTQsMTUgKzU0LDM2IEBACiAjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMAkvKiBQSFkgYWRkcmVzcwkJCSovCiAjZGVmaW5lIENPTkZJR19MWFQ5NzFfTk9fU0xFRVAgIDEgICAgICAgLyogZGlzYWJsZSBzbGVlcCBtb2RlIGluIExYVDk3MSAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC03Myw3ICs5NCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE4OSw3ICsyMTAsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUFU4Ni5oIGIvaW5jbHVkZS9jb25maWdzL0NQVTg2LmgKaW5kZXggMTZhOWVhNS4uYzU4OWYyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQVTg2LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQVTg2LmgKQEAgLTY4LDkgKzY4LDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgotICoKKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIFNDQyAgICAgICAqLwogI2RlZmluZQlDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBkZWZpbmUgaWYgZXRoZXIgb24gRkNDICAgICAgICovCkBAIC0xNjMsMjcgKzE2MSwzNyBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI3VuZGVmCUNGR19MT0FEU19CQVVEX0NIQU5HRQkJLyogZG9uJ3QgYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RPQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zNDgsNyArMzU2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUgICAgICAzMiAgICAgIC8qIEZvciBNUEM4MjYwIENQVSAgICAgICAgICAgICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NQVTg3LmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BVODcuaAppbmRleCBjZTk2OWVjLi5iMDg3ZWJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BVODcuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ1BVODcuaApAQCAtNjksOSArNjksNyBAQAogICogZm9yIEZDQykKICAqCiAgKiBpZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMgbXVzdCBiZQotICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QgYmUgcmVtb3ZlZAotICogZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCi0gKgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCQkvKiBkZWZpbmUgaWYgZXRoZXIgb24gU0NDCSovCiAjZGVmaW5lIENPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MJKi8KQEAgLTE2NywyNyArMTY1LDMxIEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCiAjdW5kZWYJQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCQkvKiBkb24ndCBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFR8Q09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRE9DCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCiAKICNpZmRlZiBDT05GSUdfUENJCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgXAotCQkJCSBDRkdfQ01EX0JFREJVRyB8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCSBDRkdfQ01EX0RPQwl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX1BDSSkKLSNlbHNlCS8qICEgUENJICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgXAotCQkJCSBDRkdfQ01EX0JFREJVRyB8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCSBDRkdfQ01EX0RPQwl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJIENGR19DTURfSTJDCSkKLSNlbmRpZgkvKiBDT05GSUdfUENJICovCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIApAQCAtMTk2LDcgKzE5OCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM2OSw3ICszNzEsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI2MCBDUFUJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUkFZTDEuaCBiL2luY2x1ZGUvY29uZmlncy9DUkFZTDEuaAppbmRleCA2M2Q3YTkyLi5hOTY1YzEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1JBWUwxLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NSQVlMMS5oCkBAIC03NSwzOCArNzUsNDIgQEAKICNkZWZpbmUgQ09ORklHX0FVVE9TQ1JJUFQJCTEKIAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgKFwKLQlDRkdfQ01EX0JESXxcCi0JQ0ZHX0NNRF9JTUl8XAotCUNGR19DTURfRkxBU0h8XAotCUNGR19DTURfTUVNT1JZfFwKLQlDRkdfQ01EX05FVHxcCi0JQ0ZHX0NNRF9FTlZ8XAotCUNGR19DTURfQ09OU09MRXxcCi0JQ0ZHX0NNRF9BU0tFTlZ8XAotCUNGR19DTURfRUNIT3xcCi0JQ0ZHX0NNRF9JTU1BUHxcCi0JQ0ZHX0NNRF9SRUdJTkZPfFwKLQlDRkdfQ01EX0RIQ1B8XAotCUNGR19DTURfREFURXxcCi0JQ0ZHX0NNRF9SVU58XAotCUNGR19DTURfSTJDfFwKLQlDRkdfQ01EX0VFUFJPTXxcCi0JQ0ZHX0NNRF9ESUFHfFwKLQlDRkdfQ01EX0FVVE9TQ1JJUFR8XAotCUNGR19DTURfU0VUR0VURENSKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisKKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0NPTlNPTEUKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfQVVUT1NDUklQVAorI2RlZmluZSBDT05GSUdfQ01EX1NFVEdFVERDUgorCiAKIC8qCi0gKiBvcHRpb25hbCBCT09UUCAvIERIQ1AgZmllbGRzCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgKFwKLQlDT05GSUdfQk9PVFBfVkVORE9SRVh8XAotCUNPTkZJR19CT09UUF9TVUJORVRNQVNLfFwKLQlDT05GSUdfQk9PVFBfR0FURVdBWXxcCi0JQ09ORklHX0JPT1RQX0ROU3xcCi0JQ09ORklHX0JPT1RQX0hPU1ROQU1FfFwKLQlDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFfFwKLQlDT05GSUdfQk9PVFBfQk9PVFBBVEgpCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1ZFTkRPUkVYCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKIC8qCiAgKiBob3cgbWFueSB0aW1lIHRvIGZhaWwgJiByZXN0YXJ0IGEgbmV0LVRGVFAgYmVmb3JlIGdpdmluZyB1cCAmIHJlc2V0dGluZwpAQCAtMTIzLDkgKzEyNyw2IEBACiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRSAgXAogICAgIHszMDAsIDYwMCwgMTIwMCwgMjQwMCwgNDgwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAyMzA0MDB9CiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NVODI0LmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1U4MjQuaAppbmRleCBhY2M4NDg0Li42OGU4MTZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1U4MjQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ1U4MjQuaApAQCAtNTUsMjEgKzU1LDI5IEBACiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gRkUwMjAwMDAiCS8qIGF1dG9ib290IGNvbW1hbmQJKi8KICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcgIHwgXAotCQkJCTAgLyogQ0ZHX0NNRF9EQVRFICovCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCiAKIAogLyoKQEAgLTI3OCw3ICsyODYsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0RBU0FfU0lNLmggYi9pbmNsdWRlL2NvbmZpZ3MvREFTQV9TSU0uaAppbmRleCA5OTdlMWJhLi42MjdlYTE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvREFTQV9TSU0uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvREFTQV9TSU0uaApAQCAtNTcsMzIgKzU3LDM1IEBACiAjZGVmaW5lIENPTkZJR19JUEFERFIJCTEwLjAuMTguMjIyCiAjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTAuMC4xOC4xOTAKIAotI2lmIDAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfRUxGCSkKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQlNQCSkKLSNlbmRpZgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisKIAogI2lmIDAgLyogRG9lcyBub3QgYXBwZWFyIHRvIGJlIHVzZWQ/ISAgSWYgaXQgaXMgdXNlZCwgbmVlZHMgdG8gYmUgZml4ZWQgKi8KICNkZWZpbmUgQ09ORklHX1NPRlRfSTJDCQkJLyogU29mdHdhcmUgSTJDIHN1cHBvcnQgZW5hYmxlZCAqLwogI2VuZGlmCiAjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOIDEJLyogQnl0ZXMgb2YgYWRkcmVzcwkJKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xODQsNyArMTg3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTIwNDgJLyogRm9yIFBMWCBJT1A0ODAJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIEFNQ0MgNDAxLzQwMyBDUFVzCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9EQjY0MzYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvREI2NDM2MC5oCmluZGV4IGJkN2FmZjEuLmRiMmU5NmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9EQjY0MzYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0RCNjQzNjAuaApAQCAtMjE1LDggKzIxNSwxNiBAQAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogI3VuZGVmCUNPTkZJR19BTFRJVkVDCQkJLyogdW5kZWYgdG8gZGlzYWJsZQkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKIC8qCiAgKiBKRkZTMiBwYXJ0aXRpb25zCiAgKgpAQCAtMjM5LDE3ICsyNDcsMjAgQEAKICNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9ZGI2NDM2MC0xOi0oamZmczIpIgogKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENPTkZJR19DTURfREZMIFwKLQkJCSB8IENGR19DTURfQVNLRU5WIFwKLQkJCSB8IENGR19DTURfSTJDIFwKLQkJCSB8IENGR19DTURfRUVQUk9NIFwKLQkJCSB8IENGR19DTURfQ0FDSEUgXAotCQkJIHwgQ0ZHX0NNRF9KRkZTMiBcCi0JCQkgfCBDRkdfQ01EX1BDSSBcCi0JCQkgfCBDRkdfQ01EX05FVCApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0yNjEsNyArMjcyLDcgQEAKIC8qICNkZWZpbmUgQ0ZHX0dUX0RVQUxfQ1BVCSBhbHNvIGZvciBKVEFHIGV2ZW4gd2l0aCBvbmUgY3B1ICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC01NTgsNyArNTY5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIGFsbCBNUEM3NHh4IENQVXMJCSAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9EQjY0NDYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvREI2NDQ2MC5oCmluZGV4IDRiNzJlOWIuLmI1ZDNmNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9EQjY0NDYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0RCNjQ0NjAuaApAQCAtMTUzLDggKzE1MywxNiBAQAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogI3VuZGVmCUNPTkZJR19BTFRJVkVDCQkJLyogdW5kZWYgdG8gZGlzYWJsZQkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKIC8qCiAgKiBKRkZTMiBwYXJ0aXRpb25zCiAgKgpAQCAtMTc3LDE3ICsxODUsMjAgQEAKICNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9ZGI2NDQ2MC0xOi0oamZmczIpIgogKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENPTkZJR19DTURfREZMIFwKLQkJCSB8IENGR19DTURfQVNLRU5WIFwKLQkJCSB8IENGR19DTURfSTJDIFwKLQkJCSB8IENGR19DTURfRUVQUk9NIFwKLQkJCSB8IENGR19DTURfQ0FDSEUgXAotCQkJIHwgQ0ZHX0NNRF9KRkZTMiBcCi0JCQkgfCBDRkdfQ01EX1BDSSBcCi0JCQkgfCBDRkdfQ01EX05FVCApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xOTksNyArMjEwLDcgQEAKIC8qICNkZWZpbmUgQ0ZHX0dUX0RVQUxfQ1BVCSBhbHNvIGZvciBKVEFHIGV2ZW4gd2l0aCBvbmUgY3B1ICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC00OTYsNyArNTA3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIGFsbCBNUEM3NHh4IENQVXMJCSAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ESzFDMjAuaCBiL2luY2x1ZGUvY29uZmlncy9ESzFDMjAuaAppbmRleCBiNTg4NDZkLi4wZGRmMGUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvREsxQzIwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0RLMUMyMC5oCkBAIC00NDYsNDYgKzQ0Niw1NSBAQAogI2RlZmluZSBDT05GSUdfTklPU19BU01JCQkJICAgLyogRW5hYmxlIEFTTUkJKi8KICNkZWZpbmUgQ0ZHX05JT1NfQVNNSUJBU0UJQ0ZHX05JT1NfQ1BVX0FTTUkwIC8qIEFTTUkgYmFzZSBhZGRyZXNzCSovCiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDT01NQU5EUwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9BTEwgJiB+KCBcCi0JCQkJIENGR19DTURfQVNLRU5WIHwgXAotCQkJCSBDRkdfQ01EX0JFREJVRyB8IFwKLQkJCQkgQ0ZHX0NNRF9CTVAJfCBcCi0JCQkJIENGR19DTURfQlNQCXwgXAotCQkJCSBDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCSBDRkdfQ01EX0RBVEUJfCBcCi0JCQkJIENGR19DTURfRE9DCXwgXAotCQkJCSBDRkdfQ01EX0RUVAl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJIENGR19DTURfRUxGICAgIHwgXAotCQkJCSBDRkdfQ01EX0ZEQwl8IFwKLQkJCQkgQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCSBDRkdfQ01EX0hXRkxPVwl8IFwKLQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJIENGR19DTURfSkZGUzIJfCBcCi0JCQkJIENGR19DTURfS0dEQgl8IFwKLQkJCQkgQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCSBDRkdfQ01EX05GUwl8IFwKLQkJCQkgQ0ZHX0NNRF9NTUMJfCBcCi0JCQkJIENGR19DTURfTUlJCXwgXAotCQkJCSBDRkdfQ01EX1BDSQl8IFwKLQkJCQkgQ0ZHX0NNRF9QQ01DSUEgfCBcCi0JCQkJIENGR19DTURfUkVJU0VSCXwgXAotCQkJCSBDRkdfQ01EX1NDU0kJfCBcCi0JCQkJIENGR19DTURfU1BJCXwgXAotCQkJCSBDRkdfQ01EX1ZGRAl8IFwKLQkJCQkgQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJIENGR19DTURfWElNRwkpICkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2FsbC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9BU0tFTlYKKyN1bmRlZiBDT05GSUdfQ01EX0JFREJVRworI3VuZGVmIENPTkZJR19DTURfQk1QCisjdW5kZWYgQ09ORklHX0NNRF9CU1AKKyN1bmRlZiBDT05GSUdfQ01EX0NBQ0hFCisjdW5kZWYgQ09ORklHX0NNRF9EQVRFCisjdW5kZWYgQ09ORklHX0NNRF9ET0MKKyN1bmRlZiBDT05GSUdfQ01EX0RUVAorI3VuZGVmIENPTkZJR19DTURfRUVQUk9NCisjdW5kZWYgQ09ORklHX0NNRF9FTEYKKyN1bmRlZiBDT05GSUdfQ01EX0ZEQworI3VuZGVmIENPTkZJR19DTURfRkRPUworI3VuZGVmIENPTkZJR19DTURfSFdGTE9XCisjdW5kZWYgQ09ORklHX0NNRF9JMkMKKyN1bmRlZiBDT05GSUdfQ01EX0pGRlMyCisjdW5kZWYgQ09ORklHX0NNRF9LR0RCCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9ORlMKKyN1bmRlZiBDT05GSUdfQ01EX01NQworI3VuZGVmIENPTkZJR19DTURfTUlJCisjdW5kZWYgQ09ORklHX0NNRF9QQ0kKKyN1bmRlZiBDT05GSUdfQ01EX1BDTUNJQQorI3VuZGVmIENPTkZJR19DTURfUkVJU0VSCisjdW5kZWYgQ09ORklHX0NNRF9TQ1NJCisjdW5kZWYgQ09ORklHX0NNRF9TUEkKKyN1bmRlZiBDT05GSUdfQ01EX1ZGRAorI3VuZGVmIENPTkZJR19DTURfVVNCCisjdW5kZWYgQ09ORklHX0NNRF9YSU1HCisKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIENPTVBBQ1QgRkxBU0gKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpCiAjZGVmaW5lIENPTkZJR19JREVfUFJFSU5JVAkJCS8qIEltcGxlbWVudCBpZF9wcmVpbml0CSovCiAjZGVmaW5lIENGR19JREVfTUFYQlVTCQkxCQkvKiAxIElERSBidXMJCSovCiAjZGVmaW5lIENGR19JREVfTUFYREVWSUNFCTEJCS8qIDEgZHJpdmUgcGVyIElERSBidXMJKi8KQEAgLTUwMywxMiArNTEyLDEyIEBACiAjZGVmaW5lIENGR19DRl9QT1dFUgkJMHgwMDkyMDljMAkvKiBDRiBQb3dlciBGRVQgUElPIGJhc2UqLwogI2RlZmluZSBDRkdfQ0ZfQVRBU0VMCQkweDAwOTIwOWQwCS8qIENGIEFUQVNFTCBQSU8gYmFzZQkqLwogCi0jZW5kaWYgLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUgKi8KKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogS0dEQgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQk5NjAwCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0RLMVMxMC5oIGIvaW5jbHVkZS9jb25maWdzL0RLMVMxMC5oCmluZGV4IDNlMzgwM2MuLjAwMzJmZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ESzFTMTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvREsxUzEwLmgKQEAgLTQ1NCw0NyArNDU0LDU1IEBACiAKICNlbmRpZgkvKiBDRkdfTklPU19DUFVfUElPX05VTVMgKi8KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENPTU1BTkRTCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0FMTCAmIH4oIFwKLQkJCQkgQ0ZHX0NNRF9BU0tFTlYgfCBcCi0JCQkJIENGR19DTURfQkVEQlVHIHwgXAotCQkJCSBDRkdfQ01EX0JNUAl8IFwKLQkJCQkgQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJIENGR19DTURfQ0FDSEUJfCBcCi0JCQkJIENGR19DTURfREFURQl8IFwKLQkJCQkgQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJIENGR19DTURfRFRUCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTSB8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYgICAgfCBcCi0JCQkJIENGR19DTURfRkFUCXwgXAotCQkJCSBDRkdfQ01EX0ZEQwl8IFwKLQkJCQkgQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCSBDRkdfQ01EX0hXRkxPVwl8IFwKLQkJCQkgQ0ZHX0NNRF9JREUJfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX0pGRlMyCXwgXAotCQkJCSBDRkdfQ01EX0tHREIJfCBcCi0JCQkJIENGR19DTURfTkFORAl8IFwKLQkJCQkgQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJIENGR19DTURfTU1DCXwgXAotCQkJCSBDRkdfQ01EX01JSQl8IFwKLQkJCQkgQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJIENGR19DTURfUENNQ0lBIHwgXAotCQkJCSBDRkdfQ01EX1NDU0kJfCBcCi0JCQkJIENGR19DTURfU1BJCXwgXAotCQkJCSBDRkdfQ01EX1ZGRAl8IFwKLQkJCQkgQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJIENGR19DTURfWElNRwkpICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9hbGwuaD4KKworI3VuZGVmIENPTkZJR19DTURfQVNLRU5WCisjdW5kZWYgQ09ORF9DTURfQkVEQlVHCisjdW5kZWYgQ09ORF9DTURfQk1QCisjdW5kZWYgQ09ORF9DTURfQlNQCisjdW5kZWYgQ09ORF9DTURfQ0FDSEUKKyN1bmRlZiBDT05EX0NNRF9EQVRFCisjdW5kZWYgQ09ORF9DTURfRE9DCisjdW5kZWYgQ09ORF9DTURfRFRUCisjdW5kZWYgQ09ORF9DTURfRUVQUk9NCisjdW5kZWYgQ09ORF9DTURfRUxGCisjdW5kZWYgQ09ORF9DTURfRkFUCisjdW5kZWYgQ09ORF9DTURfRkRDCisjdW5kZWYgQ09ORF9DTURfRkRPUworI3VuZGVmIENPTkRfQ01EX0hXRkxPVworI3VuZGVmIENPTkRfQ01EX0lERQorI3VuZGVmIENPTkRfQ01EX0kyQworI3VuZGVmIENPTkRfQ01EX0pGRlMyCisjdW5kZWYgQ09ORF9DTURfS0dEQgorI3VuZGVmIENPTkRfQ01EX05BTkQKKyN1bmRlZiBDT05EX0NNRF9ORlMKKyN1bmRlZiBDT05EX0NNRF9NTUMKKyN1bmRlZiBDT05EX0NNRF9NSUkKKyN1bmRlZiBDT05EX0NNRF9QQ0kKKyN1bmRlZiBDT05EX0NNRF9QQ01DSUEKKyN1bmRlZiBDT05EX0NNRF9TQ1NJCisjdW5kZWYgQ09ORF9DTURfU1BJCisjdW5kZWYgQ09ORF9DTURfVkZECisjdW5kZWYgQ09ORF9DTURfVVNCCisjdW5kZWYgQ09ORF9DTURfWElNRworCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBLR0RCCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTk2MDAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRFA0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9EUDQwNS5oCmluZGV4IDJhZTc5NGQuLjJlYWRiZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9EUDQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9EUDQwNS5oCkBAIC01NSwxNyArNTUsMjkgQEAKICNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQJCSovCiAjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMAkvKiBQSFkgYWRkcmVzcwkJCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtODcsNyArOTksNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMzUsNyArMjQ3LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9EVTQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0RVNDA1LmgKaW5kZXggNTQ4OWE1My4uNWM1OTVmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0RVNDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0RVNDA1LmgKQEAgLTU4LDIxICs1OCwzMyBAQAogI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTAJLyogUEhZIGFkZHJlc3MJCQkqLwogI2RlZmluZSBDT05GSUdfTFhUOTcxX05PX1NMRUVQICAxICAgICAgIC8qIGRpc2FibGUgc2xlZXAgbW9kZSBpbiBMWFQ5NzEgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NQzE0NjgxOAkJLyogQlEzMjg1IGlzIE1DMTQ2ODE4IGNvbXBhdGlibGUqLwpAQCAtODUsNyArOTcsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMjUsNyArMjM3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJLyogRm9yIEFNQ0MgNDA1IENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRUIrTUNGLUVWMTIzLmggYi9pbmNsdWRlL2NvbmZpZ3MvRUIrTUNGLUVWMTIzLmgKaW5kZXggNzIwYjMzNS4uYTg2OTdlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0VCK01DRi1FVjEyMy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9FQitNQ0YtRVYxMjMuaApAQCAtNjgsMTcgKzY4LDI5IEBACiAjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQogI2VuZGlmCiAKLS8qI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICggQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfTE9BRFMgfCBDRkdfQ01EX0xPQURCKSApICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgKCBDT05GSUdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9MT0FEQikpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURCCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKICNkZWZpbmUgQ0ZHX1BST01QVAkJIlxuRVYxMjMgVS1Cb290PiAiCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRUxQUEMuaCBiL2luY2x1ZGUvY29uZmlncy9FTFBQQy5oCmluZGV4IDJjOTliNGIuLmJiNzcxODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9FTFBQQy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9FTFBQQy5oCkBAIC02NiwxMiArNjYsMjUgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8gICAgICAgMCAgICAgICAvKiBlY2hvIG9mZiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRSAgICAgICAgICAgLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlcyAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgICAgIChDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgICAoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IENGR19DTURfSkZGUzIpCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTg0LDcgKzk3LDcgQEAKICAqLwogI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAxCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFICAgICAgICAgICAgICAxMDI0ICAgICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRSAgICAgICAgICAgICAgMjU2ICAgICAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTMxNyw3ICszMzAsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgICAgICAgMzIgICAgLyogRm9yIGFsbCBNUEM3NHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUICAgICAgICA1ICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0VMUFQ4NjAuaCBiL2luY2x1ZGUvY29uZmlncy9FTFBUODYwLmgKaW5kZXggZTczYmNlYy4uZjkyN2EyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0VMUFQ4NjAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRUxQVDg2MC5oCkBAIC04MSw3ICs4MSwxNSBAQAogICAgICIiCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkicnVuIHJhbWJvb3QiCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI3VuZGVmCSAgQ09ORklHX1dBVENIRE9HCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KICN1bmRlZgkgIENPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KQEAgLTkxLDEyICs5OSwxNSBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI3VuZGVmCSAgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCQkvKiBkb24ndCBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJICBDRkdfQ01EX0FTS0VOViB8IFwKLQkJCQkgIENGR19DTURfREFURQkgKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTA0LDcgKzExNSw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUICAgICAiTEVPWF9lbHB0ODYwOiAiIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICMgIGRlZmluZSBDRkdfQ0JTSVpFCSAyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMjQsNyArMjM1LDcgQEAKICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJICAgICAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCSA0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICAgICAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9FUDFDMjAuaCBiL2luY2x1ZGUvY29uZmlncy9FUDFDMjAuaAppbmRleCA1NTA3ZjM1Li5jZmE2MzM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVAxQzIwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0VQMUMyMC5oCkBAIC0xNjAsMjUgKzE2MCwzNiBAQAogI2RlZmluZSBDT05GSUdfSVBBRERSCQkxOTIuMTY4LjIuMjEKICNkZWZpbmUgQ09ORklHX1NFUlZFUklQCQkxOTIuMTY4LjIuMTYKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENPTU1BTkRTCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0JESQl8IFwKLQkJCQkgQ0ZHX0NNRF9ESENQCXwgXAotCQkJCSBDRkdfQ01EX0VDSE8JfCBcCi0JCQkJIENGR19DTURfRU5WCXwgXAotCQkJCSBDRkdfQ01EX0ZMQVNICXwgXAotCQkJCSBDRkdfQ01EX0lNSQl8IFwKLQkJCQkgQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJIENGR19DTURfTE9BRFMJfCBcCi0JCQkJIENGR19DTURfTE9BREIJfCBcCi0JCQkJIENGR19DTURfTUVNT1JZIHwgXAotCQkJCSBDRkdfQ01EX01JU0MJfCBcCi0JCQkJIENGR19DTURfTkVUCXwgXAotCQkJCSBDRkdfQ01EX1BJTkcJfCBcCi0JCQkJIENGR19DTURfUlVOCXwgXAotCQkJCSBDRkdfQ01EX1NBVkVTCSkKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKworI3VuZGVmIENPTkZJR19DTURfQVVUT1NDUklQVAorI3VuZGVmIENPTkZJR19DTURfQk9PVEQKKyN1bmRlZiBDT05GSUdfQ01EX0NPTlNPTEUKKyN1bmRlZiBDT05GSUdfQ01EX0ZQR0EKKyN1bmRlZiBDT05GSUdfQ01EX0lNTFMKKyN1bmRlZiBDT05GSUdfQ01EX0lURVNUCisjdW5kZWYgQ09ORklHX0NNRF9ORlMKKyN1bmRlZiBDT05GSUdfQ01EX1NFVEdFVERDUgorI3VuZGVmIENPTkZJR19DTURfWElNRworCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBNSVNDCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRVAxUzEwLmggYi9pbmNsdWRlL2NvbmZpZ3MvRVAxUzEwLmgKaW5kZXggNmVjYTlmMi4uN2M1MjZmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0VQMVMxMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9FUDFTMTAuaApAQCAtMTU0LDI1ICsxNTQsMzUgQEAKICNkZWZpbmUgQ09ORklHX0lQQUREUgkJMTkyLjE2OC4yLjIxCiAjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTkyLjE2OC4yLjE2CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDT01NQU5EUwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9CREkJfCBcCi0JCQkJIENGR19DTURfREhDUAl8IFwKLQkJCQkgQ0ZHX0NNRF9FQ0hPCXwgXAotCQkJCSBDRkdfQ01EX0VOVgl8IFwKLQkJCQkgQ0ZHX0NNRF9GTEFTSAl8IFwKLQkJCQkgQ0ZHX0NNRF9JTUkJfCBcCi0JCQkJIENGR19DTURfSVJRCXwgXAotCQkJCSBDRkdfQ01EX0xPQURTCXwgXAotCQkJCSBDRkdfQ01EX0xPQURCCXwgXAotCQkJCSBDRkdfQ01EX01FTU9SWSB8IFwKLQkJCQkgQ0ZHX0NNRF9NSVNDCXwgXAotCQkJCSBDRkdfQ01EX05FVAl8IFwKLQkJCQkgQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCSBDRkdfQ01EX1JVTgl8IFwKLQkJCQkgQ0ZHX0NNRF9TQVZFUwkpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VDSE8KKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURTCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9NSVNDCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JVTgorI2RlZmluZSBDT05GSUdfQ01EX1NBVkVTCisKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE1JU0MKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9FUDFTNDAuaCBiL2luY2x1ZGUvY29uZmlncy9FUDFTNDAuaAppbmRleCA5NzZlNzlhLi4xZmU4ZjY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVAxUzQwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0VQMVM0MC5oCkBAIC0xNTQsMjUgKzE1NCwzNSBAQAogI2RlZmluZSBDT05GSUdfSVBBRERSCQkxOTIuMTY4LjIuMjEKICNkZWZpbmUgQ09ORklHX1NFUlZFUklQCQkxOTIuMTY4LjIuMTYKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENPTU1BTkRTCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0JESQl8IFwKLQkJCQkgQ0ZHX0NNRF9ESENQCXwgXAotCQkJCSBDRkdfQ01EX0VDSE8JfCBcCi0JCQkJIENGR19DTURfRU5WCXwgXAotCQkJCSBDRkdfQ01EX0ZMQVNICXwgXAotCQkJCSBDRkdfQ01EX0lNSQl8IFwKLQkJCQkgQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJIENGR19DTURfTE9BRFMJfCBcCi0JCQkJIENGR19DTURfTE9BREIJfCBcCi0JCQkJIENGR19DTURfTUVNT1JZIHwgXAotCQkJCSBDRkdfQ01EX01JU0MJfCBcCi0JCQkJIENGR19DTURfTkVUCXwgXAotCQkJCSBDRkdfQ01EX1BJTkcJfCBcCi0JCQkJIENGR19DTURfUlVOCXwgXAotCQkJCSBDRkdfQ01EX1NBVkVTCSkKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX01JU0MKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogTUlTQwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0VQODh4LmggYi9pbmNsdWRlL2NvbmZpZ3MvRVA4OHguaAppbmRleCA3Mzg3NjNiLi44OWUwZWViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVA4OHguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRVA4OHguaApAQCAtNTAsMTUgKzUwLDI1IEBACiAjZGVmaW5lIENGR184eHhfQ1BVQ0xLX01JTgkJNDAwMDAwMDAKICNkZWZpbmUgQ0ZHXzh4eF9DUFVDTEtfTUFYCQkxMzMwMDAwMDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAgXAotCQkJCXwgQ0ZHX0NNRF9ESENQICAgXAotCQkJCXwgQ0ZHX0NNRF9JTU1BUCAgXAotCQkJCXwgQ0ZHX0NNRF9NSUkgICAgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HICAgXAotCQkJCSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJCS8qIEF1dG9ib290IGFmdGVyIDUgc2Vjb25kcwkqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIGZlMDYwMDAwIgkvKiBBdXRvYm9vdCBjb21tYW5kCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRVJJQy5oIGIvaW5jbHVkZS9jb25maWdzL0VSSUMuaAppbmRleCBjMjAzYWVhLi41ZDQ4ZDJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVJJQy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9FUklDLmgKQEAgLTk2LDIzICs5NiwyNiBAQAogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KICNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkxCS8qIFBIWSBhZGRyZXNzCQkJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0VOVgl8IFwKLQkJCQlDRkdfQ01EX0ZMQVNIKQogCiAvKgotICogI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kgfCBDRkdfQ01EX0lSUSB8IFwKLSAqCQkJCSBDRkdfQ01EX0tHREIgfCBDRkdfQ01EX0kyQyB8IENGR19DTURfRUVQUk9NIHwgXAotICoJCQkJIENGR19DTURfRU5WIHwgQ0ZHX0NNRF9GTEFTSCkKKyAqIEJPT1RQIG9wdGlvbnMKICAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogQ0ZHX0NNRF9FTlYgZXN0IGRlZmluaWUgKi8KLS8qCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IENGR19DTURfSVJRIHwgQ0ZHX0NNRF9LR0RCKSAmIH4oQ0ZHX0NNRF9FTlYpKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0xMjEsNyArMTI0LDcgQEAKICAqLwogI3VuZGVmCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMjUsNyArMzI4LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJLyogRm9yIEFNQ0MgNDA1IENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC0zNjUsNyArMzY4LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9FU1RFRU0xOTJFLmggYi9pbmNsdWRlL2NvbmZpZ3MvRVNURUVNMTkyRS5oCmluZGV4IGIxNzZjNmYuLjY2ZTEyMDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9FU1RFRU0xOTJFLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0VTVEVFTTE5MkUuaApAQCAtNzAsMTAgKzcwLDIxIEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSJCT09UOiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9FVFgwOTQuaCBiL2luY2x1ZGUvY29uZmlncy9FVFgwOTQuaAppbmRleCBkNTVlYjdkLi5lZDQzOWIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVRYMDk0LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0VUWDA5NC5oCkBAIC04MiwxNyArODIsMjkgQEAKIAogI2RlZmluZQlDT05GSUdfU1RBVFVTX0xFRAkxCS8qIFN0YXR1cyBMRUQgZW5hYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE3OSw3ICsxOTEsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRVZCNjQyNjAuaCBiL2luY2x1ZGUvY29uZmlncy9FVkI2NDI2MC5oCmluZGV4IDc4ZTU3MTYuLjFjNDRhMGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9FVkI2NDI2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9FVkI2NDI2MC5oCkBAIC0xMDMsMjEgKzEwMywzMCBAQAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogI3VuZGVmCUNPTkZJR19BTFRJVkVDICAgICAgICAgICAgICAgICAgLyogdW5kZWYgdG8gZGlzYWJsZSAgICAgICAgICAgICAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9BU0tFTlYpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM5MSw3ICs0MDAsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgYWxsIE1QQzc0eHggQ1BVcwkJICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0VYQklUR0VOLmggYi9pbmNsdWRlL2NvbmZpZ3MvRVhCSVRHRU4uaAppbmRleCBkODViZTQyLi5hM2YzOGJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVhCSVRHRU4uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRVhCSVRHRU4uaApAQCAtODIsMTAgKzgyLDIxIEBACiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50CQkqLwogI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTAJLyogUEhZIGFkZHJlc3MJCQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtOTQsNyArMTA1LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjA2LDcgKzIxNyw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRkFEUzgyMy5oIGIvaW5jbHVkZS9jb25maWdzL0ZBRFM4MjMuaAppbmRleCAxYjU2MmQ2Li5hNTYyYjJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRkFEUzgyMy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9GQURTODIzLmgKQEAgLTQ2LDcgKzQ2LDYgQEAKICNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCiAKLS8qTm93IGluY2x1ZGVkIGJ5IENGR19DTURfUENNQ0lBICovCiAvKiNkZWZpbmUgQ09ORklHX1BDTUNJQQkJMQkvICogVG8gZW5hYmxlIFBDTUNJQSBzdXBwb3J0ICovCiAKIC8qIFZpZGVvIHJlbGF0ZWQgKi8KQEAgLTEwNSwxNyArMTA0LDM5IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfQUxMCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfTklTRE9NQUlOCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9OVFBTRVJWRVIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1RJTUVPRkZTRVQKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkJIjo+IgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xOTAsNyArMjExLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0ZBRFM4NTBTQVIuaCBiL2luY2x1ZGUvY29uZmlncy9GQURTODUwU0FSLmgKaW5kZXggMmE5ODZmMC4uYzhjZTI1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0ZBRFM4NTBTQVIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRkFEUzg1MFNBUi5oCkBAIC02MSwxNSArNjEsMjggQEAKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI3VuZGVmCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCQkiOj4iCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNDgsNyArMTYxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0ZMQUdBRE0uaCBiL2luY2x1ZGUvY29uZmlncy9GTEFHQURNLmgKaW5kZXggOGJhYmVlMS4uNDMxODQ0YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0ZMQUdBRE0uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRkxBR0FETS5oCkBAIC02MiwyMSArNjIsMzkgQEAKIC8qI2RlZmluZQlDT05GSUdfV0FUQ0hET0cqLwkvKiB3YXRjaGRvZyBlbmFibGVkCQkqLwogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAoQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX0lNSSB8IENGR19DTURfQ0FDSEUgfCBcCi0JCUNGR19DTURfTUVNT1JZIHwgQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfTE9BREIgfCBDRkdfQ01EX0xPQURTIHwgXAotCQlDRkdfQ01EX0VOViB8IENGR19DTURfUkVHSU5GTyB8IENGR19DTURfSU1NQVAgfCBDRkdfQ01EX05FVCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisKKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEUworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX05FVAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIkVFRz4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTUyLDcgKzE3MCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9GUFM4NTBMLmggYi9pbmNsdWRlL2NvbmZpZ3MvRlBTODUwTC5oCmluZGV4IDBkZDIxYmMuLjMyMjE1OGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9GUFM4NTBMLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0ZQUzg1MEwuaApAQCAtNjAsMjQgKzYwLDQ1IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfQUxMCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAoIENPTkZJR19DTURfREZMICYJCX4oIFwKLQkJCQkJQ0ZHX0NNRF9DT05TT0xFCXwgXAotCQkJCQlDRkdfQ01EX0JESQl8IFwKLQkJCQkJQ0ZHX0NNRF9MT0FEUwl8IFwKLQkJCQkJQ0ZHX0NNRF9MT0FEQgl8IFwKLQkJCQkJQ0ZHX0NNRF9DQUNIRQkpICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfTklTRE9NQUlOCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9OVFBTRVJWRVIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1RJTUVPRkZTRVQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI3VuZGVmIENPTkZJR19DTURfQ09OU09MRQorI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI3VuZGVmIENPTkZJR19DTURfTE9BREIKKyN1bmRlZiBDT05GSUdfQ01EX0NBQ0hFCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTYwLDcgKzE4MSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9GUFM4NjBMLmggYi9pbmNsdWRlL2NvbmZpZ3MvRlBTODYwTC5oCmluZGV4IDQyM2Q3NGUuLmY4Njk4YjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9GUFM4NjBMLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0ZQUzg2MEwuaApAQCAtNTgsMjYgKzU4LDQ1IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfQUxMCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX05JU0RPTUFJTgorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUworI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgorI2RlZmluZSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfTlRQU0VSVkVSCisjZGVmaW5lIENPTkZJR19CT09UUF9USU1FT0ZGU0VUCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNjAsNyArMTc5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0cyMDAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvRzIwMDAuaAppbmRleCBkYjQyZmQwLi45YzcxM2M2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRzIwMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRzIwMDAuaApAQCAtODgsMjAgKzg4LDMyIEBACiAjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJRU1BQ19TVEFDUl9DTEtfNjZNSFogLyogNjYgTUh6IE9QQiBjbG9jayovCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTEyMCw3ICsxMzIsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMjQsNyArMzM2LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9HRU44NjBULmggYi9pbmNsdWRlL2NvbmZpZ3MvR0VOODYwVC5oCmluZGV4IDY2MTNmOTAuLmJmYmYzYTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9HRU44NjBULmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0dFTjg2MFQuaApAQCAtMTMyLDkgKzEzMiwxMiBAQAogLyoKICAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkJCQkoIENPTkZJR19CT09UUF9ERUZBVUxUCQl8IFwKLQkJCQkJCQkJCSAgCSAgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSAgIFwKLQkJCQkJCQkJCQkpCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKIC8qCiAgKiBUaGUgR0VOODYwVCBuZXR3b3JrIGludGVyZmFjZSB1c2VzIHRoZSBvbi1jaGlwIDEwLzEwMCBGRUMgd2l0aApAQCAtMjIyLDM1ICsyMjUsMzAgQEAKIAkJCQkJCQkJQ0ZHX1BPU1RfVUFSVAkJfCBcCiAJCQkJCQkJCUNGR19QT1NUX1NQUiApCiAKLSNpZmRlZiBDT05GSUdfUE9TVAotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyBDRkdfQ01EX0RJQUcKLSNlbHNlCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHCQkwCi0jZW5kaWYKIAogLyoKLSAqIExpc3Qgb2YgYXZhaWxhYmxlIG1vbml0b3IgY29tbWFuZHMuICBVc2UgdGhlIHN5c3RlbSBkZWZhdWx0IGxpc3QKLSAqIHBsdXMgYWRkIHNvbWUgb2YgdGhlICJub24tc3RhbmRhcmQiIGNvbW1hbmRzIGJhY2sgaW4uCi0gKiBTZWUgLi9jbWRfY29uZmRlZnMuaAorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KLSNkZWZpbmUgQkFTRV9DT05GSUdfQ09NTUFORFMJKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9JMkMJCXwgXAotCQkJCQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9SRUdJTkZPCXwgXAotCQkJCQkJCQlDRkdfQ01EX0lNTUFQCXwgXAotCQkJCQkJCQlDRkdfQ01EX0VMRgkJfCBcCi0JCQkJCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9GUEdBCXwgXAotCQkJCQkJCQlDRkdfQ01EX01JSSAJfCBcCi0JCQkJCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCQkJCQlDRkdfQ01EX1BPU1RfRElBRyApCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0ZQR0EKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKIAogI2lmICFkZWZpbmVkKENPTkZJR19TQykKLSNkZWZpbmUJQ09ORklHX0NPTU1BTkRTICggQkFTRV9DT05GSUdfQ09NTUFORFMgfCBDRkdfQ01EX0RPQyApCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJQkFTRV9DT05GSUdfQ09NTUFORFMKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRE9DCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QT1NUCisjZGVmaW5lIENPTkZJR19DTURfRElBRwogI2VuZGlmCiAKIC8qCkBAIC0yNzksMTEgKzI3Nyw2IEBACiAjZGVmaW5lIENGR19GUEdBX1BST0dfRkVFREJBQ0sKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgYW55IENPTkZJR19DT01NQU5EUwotICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAKIC8qCkBAIC0zMDYsNyArMjk5LDcgQEAKIC8qCiAgKiBTZXQgYnVmZmVyIHNpemUgZm9yIGNvbnNvbGUgSS9PCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkJMTAyNAogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJCTI1NgpAQCAtNDcxLDcgKzQ2NCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAkJNAkvKiBsb2cgYmFzZSAyIG9mIGFib3ZlIHZhbHVlCQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9HRU5JRVRWLmggYi9pbmNsdWRlL2NvbmZpZ3MvR0VOSUVUVi5oCmluZGV4IDhjMDFkOTcuLjc4NTM1NWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9HRU5JRVRWLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0dFTklFVFYuaApAQCAtMTA1LDE1ICsxMDUsMjggQEAKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJCSI6PiIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTkzLDcgKzIwNiw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9HVEguaCBiL2luY2x1ZGUvY29uZmlncy9HVEguaAppbmRleCAwM2I5NjU5Li43OWY1NzE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvR1RILmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0dUSC5oCkBAIC05NywxOCArOTcsMzIgQEAKICNlcnJvciBCb3RoIENPTkZJR19TQ0MxX0VORVQgYW5kIENPTkZJR19GRUNfRU5FVCBjb25maWd1cmVkCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgICAgICAgICAoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0lERSkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0lERQorCisKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19QUk9NUFQJCSI9PiIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTkwLDcgKzIwNCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ISDQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0hINDA1LmgKaW5kZXggZGM0MGViYy4uMDBmNDgxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0hINDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0hINDA1LmgKQEAgLTk4LDI2ICs5OCw0MCBAQAogI2RlZmluZSBDT05GSUdfVklERU9fQk1QX0daSVAJCS8qIGd6aXAgY29tcHJlc3NlZCBibXAgaW1hZ2VzCSovCiAjZGVmaW5lIENGR19WSURFT19MT0dPX01BWF9TSVpFCSgyIDw8IDIwKQkvKiBmb3IgZGVjb21wcmVzc2VkIGltZyAqLwogCi0jZGVmaW5lIEFERF9CTVBfQ01ECQlDRkdfQ01EX0JNUAotI2Vsc2UKLSNkZWZpbmUgQUREX0JNUF9DTUQJCTAKICNlbmRpZiAvKiBDT05GSUdfVklERU8gKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9FWFQyCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUFERF9CTVBfQ01ECXwgXAotCQkJCUNGR19DTURfRUVQUk9NICApCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCisjaWZkZWYgQ09ORklHX1ZJREVPCisjZGVmaW5lIENPTkZJR19DTURfQk1QCisjZW5kaWYKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMTI3LDkgKzE0MSw2IEBACiAjZGVmaW5lIENPTkZJR19BVVRPX1VQREFURSAgICAgIDEgICAgICAgLyogYXV0b3VwZGF0ZSB2aWEgY29tcGFjdGZsYXNoICAqLwogI3VuZGVmIENPTkZJR19BVVRPX1VQREFURV9TSE9XICAgICAgICAgIC8qIHVzZSBib2FyZCBzaG93IHJvdXRpbmUgICAgICAgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogCiAjdW5kZWYgIENPTkZJR19CWklQMgkgLyogaW5jbHVkZSBzdXBwb3J0IGZvciBiemlwMiBjb21wcmVzc2VkIGltYWdlcyAqLwpAQCAtMTQ4LDcgKzE1OSw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM3Nyw3ICszODgsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MgICAgKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUgICAgICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ISURERU5fRFJBR09OLmggYi9pbmNsdWRlL2NvbmZpZ3MvSElEREVOX0RSQUdPTi5oCmluZGV4IDY4NjQ3NDAuLjI2ZGQ5NTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ISURERU5fRFJBR09OLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0hJRERFTl9EUkFHT04uaApAQCAtNTIsMTYgKzUyLDI3IEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAogI2RlZmluZSBDT05GSUdfRFJBTV9TUEVFRAkxMDAJCS8qIE1IegkJCQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQkgIENGR19DTURfRUVQUk9NIHwgXAotCQkJCSAgQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJICBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgIENGR19DTURfTkVUCXwgXAotCQkJCSAgQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJICBDRkdfQ01EX1BJTkcJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCSovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMzYzLDcgKzM3NCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjQwIENQVQkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvSE1JMTAuaCBiL2luY2x1ZGUvY29uZmlncy9ITUkxMC5oCmluZGV4IDdjY2U4NzYuLjAyYWU1ZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ITUkxMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ITUkxMC5oCkBAIC0xMTcsNyArMTE3LDE1IEBACiAKICNkZWZpbmUgQ09ORklHX0NBTl9EUklWRVIJMQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZW5hYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTEyNSwzMSArMTMzLDI1IEBACiAjZGVmaW5lIENPTkZJR19SVENfRFMxMzM3CQkvKiBVc2UgZHMxMzM3IHJ0YyB2aWEgaTJjCSovCiAjZGVmaW5lIENGR19JMkNfUlRDX0FERFIgMHg2OAkJLyogYXQgYWRkcmVzcyAweDY4CQkqLwogCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKICNpZmRlZglDT05GSUdfU1BMQVNIX1NDUkVFTgotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0JNUAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCi0jZWxzZQotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0JNUAogI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTE2NCw3ICsxNjYsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNDcsNyArMjQ5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0hVQjQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0hVQjQwNS5oCmluZGV4IGY4NGUzNTYuLjY2MWI4OTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9IVUI0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvSFVCNDA1LmgKQEAgLTYwLDE4ICs2MCwzMCBAQAogCiAjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJRU1BQ19TVEFDUl9DTEtfNjZNSFogLyogNjYgTUh6IE9QQiBjbG9jayovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC04OCw3ICsxMDAsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNzEsNyArMjgzLDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9JQUQyMTAuaCBiL2luY2x1ZGUvY29uZmlncy9JQUQyMTAuaAppbmRleCAzNWQ4NGFlLi5iZDA4OTRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvSUFEMjEwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0lBRDIxMC5oCkBAIC04NCw3ICs4NCwxNSBAQAogCiAvKiAjZGVmaW5lCUNPTkZJR19TVEFUVVNfTEVECTEqLwkvKiBTdGF0dXMgTEVEIGVuYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogIyB1bmRlZiAgQ09ORklHX1NDQzFfRU5FVAkJLyogZGlzYWJsZSBTQ0MxIGV0aGVybmV0ICovCiAjIGRlZmluZSBDT05GSUdfRkVDX0VORVQgICAgMQkvKiB1c2UgRkVDIGV0aGVybmV0ICAqLwpAQCAtMTIzLDIwICsxMzEsMjMgQEAKIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIxNyw3ICsyMjgsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvSUNVODYyLmggYi9pbmNsdWRlL2NvbmZpZ3MvSUNVODYyLmgKaW5kZXggY2QxNzkzNS4uMjdhNWJjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0lDVTg2Mi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9JQ1U4NjIuaApAQCAtODEsNyArODEsMTUgQEAKIAogI2RlZmluZQlDT05GSUdfU1RBVFVTX0xFRAkxCS8qIFN0YXR1cyBMRUQgZW5hYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjdW5kZWYJQ09ORklHX1NDQzFfRU5FVAkJLyogZGlzYWJsZSBTQ0MxIGV0aGVybmV0ICovCiAjZGVmaW5lCUNPTkZJR19GRUNfRU5FVAkJMQkvKiB1c2UgRkVDIGV0aGVybmV0ICAqLwpAQCAtMTIzLDI1ICsxMzEsMjggQEAKIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjI4LDcgKzIzOSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9JRFM4MjQ3LmggYi9pbmNsdWRlL2NvbmZpZ3MvSURTODI0Ny5oCmluZGV4IDI5ZWI4NzQuLjg1ZDJiYjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9JRFM4MjQ3LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0lEUzgyNDcuaApAQCAtMTI4LDkgKzEyOCw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KLSAqCisgKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQgbXVzdCBiZSB1bnNldC4KICAqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBTQ0MgICAgICAgKi8KICNkZWZpbmUJQ09ORklHX0VUSEVSX09OX0ZDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIEZDQyAgICAgICAqLwpAQCAtMTU5LDI0ICsxNTcsMzQgQEAKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMzQsNyArMjQyLDcgQEAKICAqIE5BTkQtRkxBU0ggc3R1ZmYKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAKICNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAjZGVmaW5lIENGR19OQU5EMF9CQVNFIDB4RTEwMDAwMDAKQEAgLTI5NSw3ICszMDMsNyBAQAogI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgZG97ICoodm9sYXRpbGUgX191OCAqKSgodW5zaWduZWQgbG9uZykoYWRyICsgMHgwKSkgPSAoX191OClkOyB9IHdoaWxlKDApCiAjZGVmaW5lIFJFQURfTkFORChhZHIpICgodm9sYXRpbGUgdW5zaWduZWQgY2hhcikoKih2b2xhdGlsZSBfX3U4ICopKHVuc2lnbmVkIGxvbmcpKGFkciArIDB4MCkpKQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9OQU5EICovCisjZW5kaWYgLyogQ09ORklHX0NNRF9OQU5EICovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEhhcmQgUmVzZXQgQ29uZmlndXJhdGlvbiBXb3JkcwpAQCAtMzU1LDcgKzM2Myw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFICAgICAgMzIgICAgICAvKiBGb3IgTVBDODI2MCBDUFUgICAgICAgICAgICAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKQEAgLTQ3NCw3ICs0ODIsNyBAQAogI2RlZmluZSBDRkdfT1IwX1BSRUxJTSAgKE1FR19UT19BTShDRkdfRkxBU0hfU0laRSkgICAgICB8XAogCQkJIE9SeEdfU0NZXzZfQ0xLICAgICAgICAgICAgICAgICApCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogLyogQmFuayAxIC0gTkFORCBGbGFzaAogKi8KICNkZWZpbmUJQ0ZHX05BTkRfQkFTRQkJQ0ZHX05BTkQwX0JBU0UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9JUDg2MC5oIGIvaW5jbHVkZS9jb25maWdzL0lQODYwLmgKaW5kZXggMGUyMGU1Ni4uYmQ5NjFkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0lQODYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0lQODYwLmgKQEAgLTg4LDI4ICs4OCwzMiBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCUNPTkZJR19CT09UUF9ERUZBVUxUCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMDIsNyArMjA2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0lQSEFTRTQ1MzkuaCBiL2luY2x1ZGUvY29uZmlncy9JUEhBU0U0NTM5LmgKaW5kZXggYzE1NjVmYy4uNmZlZTQ1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0lQSEFTRTQ1MzkuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvSVBIQVNFNDUzOS5oCkBAIC02Nyw4ICs2Nyw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIFNDQyAgICovCiAjZGVmaW5lIENPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MgICAqLwpAQCAtOTUsNyArOTQsMTQgQEAKICNkZWZpbmUgQ09ORklHXzgyNjBfQ0xLSU4JNjY2NjY2NjYJLyogaW4gSHogKi8KICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxOTIwMAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAogLyoKICAqIHNlbGVjdCBpMmMgc3VwcG9ydCBjb25maWd1cmF0aW9uCkBAIC0xMjQsMTcgKzEzMCwxOCBAQAogI2RlZmluZSBJMkNfREVMQVkJdWRlbGF5KDUpCS8qIDEvNCBJMkMgY2xvY2sgZHVyYXRpb24gKi8KICNlbmRpZiAvKiBDT05GSUdfU09GVF9JMkMgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCUNPTkZJR19DTURfREZMCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcyAqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDEwMDAwMCIJLyogYXV0b2Jvb3QgY29tbWFuZCAqLwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJyb290PS9kZXYvcmFtIHJ3IgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICN1bmRlZglDT05GSUdfS0dEQl9PTl9TTUMJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNNQyAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNDQyAqLwogI3VuZGVmCUNPTkZJR19LR0RCX05PTkUJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0xNDksNyArMTU2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjU3LDcgKzI2NCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyICAgICAvKiBGb3IgTVBDODI2MCBDUFUJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNSAgICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0lTUEFOLmggYi9pbmNsdWRlL2NvbmZpZ3MvSVNQQU4uaAppbmRleCA3MDZiZGI5Li45NjViNTE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvSVNQQU4uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvSVNQQU4uaApAQCAtNTgsOCArNTgsNyBAQAogICogZm9yIEZDQykuCiAgKgogICogSWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIEV0aGVybmV0IHJvdXRpbmVzIG11c3QKLSAqIGJlIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogYmUgZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCQkvKiBEZWZpbmUgaWYgRXRoZXJuZXQgb24gU0NDCQkqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBEZWZpbmUgaWYgRXRoZXJuZXQgb24gRkNDCQkqLwpAQCAtMTA2LDE3ICsxMDUsMjggQEAKICNkZWZpbmUgQ09ORklHXzgyNjBfQ0xLSU4JNjU1MzYwMDAJLyogaW4gSHogKi8KICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkzODQwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDT05GSUdfQ01EX0RGTCAgXAotCQkJCXwgQ0ZHX0NNRF9BU0tFTlYgIFwKLQkJCQl8IENGR19DTURfREhDUCAgICBcCi0JCQkJfCBDRkdfQ01EX0lNTUFQICAgXAotCQkJCXwgQ0ZHX0NNRF9NSUkgICAgIFwKLQkJCQl8IENGR19DTURfUElORyAgICBcCi0JCQkJfCBDRkdfQ01EX1JFR0lORk8gXAotCQkJCSkKIAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJCS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcwkqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIGZlMDEwMDAwIgkvKiBhdXRvYm9vdCBjb21tYW5kCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvSVZNTDI0LmggYi9pbmNsdWRlL2NvbmZpZ3MvSVZNTDI0LmgKaW5kZXggYTBjYjFkZC4uMTE0MmYyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0lWTUwyNC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9JVk1MMjQuaApAQCAtNzIsMjQgKzcyLDMzIEBACiAKICNkZWZpbmUJQ09ORklHX1NUQVRVU19MRUQJMQkvKiBTdGF0dXMgTEVEIGVuYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0lERSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKworCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgXAotICAgICgoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKSAmIH5DT05GSUdfQk9PVFBfR0FURVdBWSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTgyLDcgKzE5MSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9JVk1TOC5oIGIvaW5jbHVkZS9jb25maWdzL0lWTVM4LmgKaW5kZXggNDZiNGQ1My4uYmQxOWRhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0lWTVM4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0lWTVM4LmgKQEAgLTcyLDI0ICs3MiwzMiBAQAogCiAjZGVmaW5lCUNPTkZJR19TVEFUVVNfTEVECTEJLyogU3RhdHVzIExFRCBlbmFibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9JREUpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0lERQorCisKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSyBcCi0gICAgKChDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpICYgfkNPTkZJR19CT09UUF9HQVRFV0FZKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNzksNyArMTg3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0ljZUN1YmUuaCBiL2luY2x1ZGUvY29uZmlncy9JY2VDdWJlLmgKaW5kZXggNzNiZTA2OS4uNTMyNjE1NDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9JY2VDdWJlLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0ljZUN1YmUuaApAQCAtMzcsMTEgKzM3LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJICAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC02OSw3ICs2NCw2IEBACiAjZGVmaW5lIENPTkZJR19QQ0lfSU9fQlVTCTB4NTAwMDAwMDAKICNkZWZpbmUgQ09ORklHX1BDSV9JT19QSFlTCUNPTkZJR19QQ0lfSU9fQlVTCiAjZGVmaW5lIENPTkZJR19QQ0lfSU9fU0laRQkweDAxMDAwMDAwCi0jZGVmaW5lIEFERF9QQ0lfQ01EIAkJQ0ZHX0NNRF9QQ0kKICNlbmRpZgogCiAjZGVmaW5lIENGR19YTEJfUElQRUxJTklORwkxCkBAIC04MCwxMSArNzQsOCBAQAogI2RlZmluZSBDRkdfUlhfRVRIX0JVRkZFUgk4ICAvKiB1c2UgOCByeCBidWZmZXIgb24gZWVwcm8xMDAgICovCiAjZGVmaW5lIENPTkZJR19OUzgzODJYCQkxCiAKLSNlbHNlCS8qIE1QQzUxMDAgKi8KLQorI2Vsc2UKICNkZWZpbmUgQ09ORklHX01JSQkJMQotI2RlZmluZSBBRERfUENJX0NNRAkJMCAgLyogbm8gQ0ZHX0NNRF9QQ0kgKi8KLQogI2VuZGlmCiAKIC8qIFBhcnRpdGlvbnMgKi8KQEAgLTkzLDMxICs4NCw0NCBAQAogI2RlZmluZSBDT05GSUdfSVNPX1BBUlRJVElPTgogCiAvKiBVU0IgKi8KLSNpZiAxCi0jZGVmaW5lIENPTkZJR19VU0JfT0hDSQotI2RlZmluZSBBRERfVVNCX0NNRCAgICAgICAgICAgICBDRkdfQ01EX1VTQiB8IENGR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19VU0JfT0hDSV9ORVcKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCi0jZWxzZQotI2RlZmluZSBBRERfVVNCX0NNRCAgICAgICAgICAgICAwCi0jZW5kaWYKKyNkZWZpbmUgQ0ZHX09IQ0lfQkVfQ09OVFJPTExFUgorI3VuZGVmIENGR19VU0JfT0hDSV9CT0FSRF9JTklUCisjZGVmaW5lIENGR19VU0JfT0hDSV9DUFVfSU5JVAkxCisjZGVmaW5lIENGR19VU0JfT0hDSV9SRUdTX0JBU0UJTVBDNVhYWF9VU0IKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1NMT1RfTkFNRQkibXBjNTIwMCIKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX01BWF9ST09UX1BPUlRTCTE1CiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCXwgXAotCQkJCUFERF9QQ0lfQ01ECXwgXAotCQkJCUFERF9VU0JfQ01ECSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNlbmRpZgorCiAKICNpZiAoVEVYVF9CQVNFID09IDB4RkYwMDAwMDApCQkvKiBCb290IGxvdyB3aXRoIDE2IE1CIEZsYXNoICovCiAjICAgZGVmaW5lIENGR19MT1dCT09UCSAgICAgICAgMQpAQCAtMzEyLDcgKzMxNiw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0zMjgsNiArMzMyLDExIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0pTRS5oIGIvaW5jbHVkZS9jb25maWdzL0pTRS5oCmluZGV4IDdmYTllZDIuLmVhM2IwYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9KU0UuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvSlNFLmgKQEAgLTEzNSwyMCArMTM1LDMyIEBACiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50CQkqLwogI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTEJLyogUEhZIGFkZHJlc3MJCQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0ZMQVNICXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogICAvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogI3VuZGVmIENPTkZJR19XQVRDSERPRwpAQCAtMTY3LDcgKzE3OSw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI3Miw3ICsyODQsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1R1ByIENQVXMJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApAQCAtMjk4LDcgKzMxMCw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvS0FSRUYuaCBiL2luY2x1ZGUvY29uZmlncy9LQVJFRi5oCmluZGV4IDQ4Yjk0ZWUuLjM2NDRlNDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9LQVJFRi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9LQVJFRi5oCkBAIC0xNzgsMjMgKzE3OCwzNCBAQAogI2RlZmluZSBDRkdfUlhfRVRIX0JVRkZFUiAgICAgMzIJICAgICAvKiAjZXRoIHJ4IGJ1ZmYgJiBkZXNjcnMJKi8KIAogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb25zb2xlL0NvbW1hbmRzL1BhcnNlcgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfRkFUKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKwogCiAvKiBJbmNsdWRlIE5ldENvbnNvbGUgc3VwcG9ydCAqLwogI2RlZmluZSBDT05GSUdfTkVUQ09OU09MRQpAQCAtMjAzLDEwICsyMTQsNiBAQAogI2RlZmluZSBDT05GSUdfQVVUT19DT01QTEVURSAxCiAjZGVmaW5lIENGR19BTFRfTUVNVEVTVAkgICAgIDEJICAgICAvKiB1c2UgcmVhbCBtZW1vcnkgdGVzdAkgKi8KIAotCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJICAgICAvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSAgICAgICJLYVJlZkRlcz0+ICIgIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KIApAQCAtMjE3LDcgKzIyNCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBDb25zb2xlIEJ1ZmZlcgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgIDEwMjQJICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAyNTYJICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtMjc5LDcgKzI4Niw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCSAgICAgIDgxOTIJICAgICAvKiBGb3IgQU1DQyA0MDUgQ1BVcwkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUgICAgMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUICAgNQkJICAgICAvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSAqLwogI2VuZGlmCiAKQEAgLTI5MSw3ICsyOTgsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECSAgICAgIDB4MDEJICAgICAvKiBOb3JtYWwgUG93ZXJPbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JICAgICAgMHgwMgkgICAgIC8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUgIDIzMDQwMAkgICAgIC8qIGtnZGIgc2VyaWFsIHBvcnQgYmF1ZAkqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVggMgkJICAgICAvKiBrZ2RiIHNlcmlhbCBwb3J0CSovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9LVVA0Sy5oIGIvaW5jbHVkZS9jb25maWdzL0tVUDRLLmgKaW5kZXggOWI5NTBmYy4uZjZjMzFlYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0tVUDRLLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0tVUDRLLmgKQEAgLTg5LDcgKzg5LDE1IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMTU2LDMyICsxNjQsMzEgQEAKICNkZWZpbmUgQ09ORklHX1BPU1QJCShDRkdfUE9TVF9DUFUJICAgfCBcCiAJCQkJIENGR19QT1NUX1JUQwkgICB8IFwKIAkJCQkgQ0ZHX1BPU1RfSTJDKQorI2VuZGlmCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKIAogI2lmZGVmIENPTkZJR19QT1NUCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIENGR19DTURfRElBRwotI2Vsc2UKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcgMAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCiAjZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QT1NUX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKLQotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNjksNyArMjc2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0tVUDRYLmggYi9pbmNsdWRlL2NvbmZpZ3MvS1VQNFguaAppbmRleCBjZDM4YjBmLi5lNTU4YWE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvS1VQNFguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvS1VQNFguaApAQCAtOTksNyArOTksMTUgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC0xNjcsMzQgKzE3NSwzMyBAQAogI2RlZmluZSBDT05GSUdfUE9TVAkJKENGR19QT1NUX0NQVQkgICB8IFwKIAkJCQkgQ0ZHX1BPU1RfUlRDCSAgIHwgXAogCQkJCSBDRkdfUE9TVF9JMkMpCisjZW5kaWYKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorI2RlZmluZSBDT05GSUdfQ01EX1VTQgogCiAjaWZkZWYgQ09ORklHX1BPU1QKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcgQ0ZHX0NNRF9ESUFHCi0jZWxzZQotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyAwCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKICNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BPU1RfRElBRwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJfCBcCi0JCQkJQ0ZHX0NNRF9VU0IJKQotCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI4MSw3ICsyODgsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTEFOVEVDLmggYi9pbmNsdWRlL2NvbmZpZ3MvTEFOVEVDLmgKaW5kZXggZTQ0ZjFjYy4uNDZlZGQwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0xBTlRFQy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9MQU5URUMuaApAQCAtNzQsNjQgKzc0LDY4IEBACiAKICNkZWZpbmUJQ09ORklHX1NUQVRVU19MRUQJMQkvKiBTdGF0dXMgTEVEIGVuYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLSNkZWZpbmUgQ09ORklHX0NNRF9NSU5JTUFMCTAKLSNkZWZpbmUgQ09ORklHX0NNRF9USU5ZCQkoQ0ZHX0NNRF9GTEFTSCAgfCBcCi0JCQkJIENGR19DTURfTUVNT1JZIHwgXAotCQkJCSBDRkdfQ01EX0xPQURTICB8IFwKLQkJCQkgQ0ZHX0NNRF9MT0FEQikKLSNkZWZpbmUgQ09ORklHX0NNRF9OT1JNQUwJKENPTkZJR19DTURfREZMICYgfkNGR19DTURfQk9PVEQgJiB+Q0ZHX0NNRF9SRUlTRVIpCi0jZGVmaW5lIENPTkZJR19DTURfR0RCCQkoQ09ORklHX0NNRF9OT1JNQUwgfCBDRkdfQ01EX0tHREIpCi0jZGVmaW5lIENPTkZJR19DTURfRlVMTAkJKENGR19DTURfQUxMICYgfkNGR19DTURfQkVEQlVHCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX0JNUAlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9CU1AJXAotCQkJCQkgICAgICYgfkNGR19DTURfRElTUExBWQlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9ET0MJXAotCQkJCQkgICAgICYgfkNGR19DTURfRFRUCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX0VFUFJPTQlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9FTEYJXAotCQkJCQkgICAgICYgfkNGR19DTURfRVhUMglcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9GREMJXAotCQkJCQkgICAgICYgfkNGR19DTURfRkRPUwlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9IV0ZMT1cJXAotCQkJCQkgICAgICYgfkNGR19DTURfSTJDCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX0lERQlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9JUlEJXAotCQkJCQkgICAgICYgfkNGR19DTURfSkZGUzIJXAotCQkJCQkgICAgICYgfkNGR19DTURfS0dEQglcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9NSUkJXAotCQkJCQkgICAgICYgfkNGR19DTURfTU1DCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX05BTkQJXAotCQkJCQkgICAgICYgfkNGR19DTURfUENJCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX1BDTUNJQQlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9SRUlTRVIJXAotCQkJCQkgICAgICYgfkNGR19DTURfU0NTSQlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9TUEkJXAotCQkJCQkgICAgICYgfkNGR19DTURfVU5JVkVSU0VcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9VU0IJXAotCQkJCQkgICAgICYgfkNGR19DTURfVkZECVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX1hJTUcJKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2FsbC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9CRURCVUcKKyN1bmRlZiBDT05GSUdfQ01EX0JNUAorI3VuZGVmIENPTkZJR19DTURfQlNQCisjdW5kZWYgQ09ORklHX0NNRF9ESVNQTEFZCisjdW5kZWYgQ09ORklHX0NNRF9ET0MKKyN1bmRlZiBDT05GSUdfQ01EX0RUVAorI3VuZGVmIENPTkZJR19DTURfRUVQUk9NCisjdW5kZWYgQ09ORklHX0NNRF9FTEYKKyN1bmRlZiBDT05GSUdfQ01EX0VYVDIKKyN1bmRlZiBDT05GSUdfQ01EX0ZEQworI3VuZGVmIENPTkZJR19DTURfRkRPUworI3VuZGVmIENPTkZJR19DTURfSFdGTE9XCisjdW5kZWYgQ09ORklHX0NNRF9JMkMKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorI3VuZGVmIENPTkZJR19DTURfSVJRCisjdW5kZWYgQ09ORklHX0NNRF9KRkZTMgorI3VuZGVmIENPTkZJR19DTURfS0dEQgorI3VuZGVmIENPTkZJR19DTURfTUZTTAorI3VuZGVmIENPTkZJR19DTURfTUlJCisjdW5kZWYgQ09ORklHX0NNRF9NTUMKKyN1bmRlZiBDT05GSUdfQ01EX05BTkQKKyN1bmRlZiBDT05GSUdfQ01EX1BDSQorI3VuZGVmIENPTkZJR19DTURfUENNQ0lBCisjdW5kZWYgQ09ORklHX0NNRF9SRUlTRVIKKyN1bmRlZiBDT05GSUdfQ01EX1NDU0kKKyN1bmRlZiBDT05GSUdfQ01EX1NQSQorI3VuZGVmIENPTkZJR19DTURfVU5JVkVSU0UKKyN1bmRlZiBDT05GSUdfQ01EX1VTQgorI3VuZGVmIENPTkZJR19DTURfVkZECisjdW5kZWYgQ09ORklHX0NNRF9YSU1HCisKKyNpZiAhKENPTkZJR19MQU5URUMgPj0gMikKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9EQVRFCisgICAgI3VuZGVmIENPTkZJR19DTURfTkVUCisjZW5kaWYKKwogCiAjaWYgQ09ORklHX0xBTlRFQyA+PSAyCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogI2VuZGlmCiAKLSNpZiBDT05GSUdfTEFOVEVDID49IDIKLSMgZGVmaW5lIENPTkZJR19DT01NQU5EUwlDT05GSUdfQ01EX0ZVTEwKLSNlbHNlCi0jIGRlZmluZSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfRlVMTCAmIH5DRkdfQ01EX0RBVEUgJiB+Q0ZHX0NNRF9ORVQpCi0jZW5kaWYKLQotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMDMsNyArMjA3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL001MjcxRVZCLmggYi9pbmNsdWRlL2NvbmZpZ3MvTTUyNzFFVkIuaAppbmRleCBmMGZjMDEzLi44ODVhODgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTTUyNzFFVkIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTTUyNzFFVkIuaApAQCAtNjUsMTUgKzY1LDMxIEBACiAjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9ORVQgKSAmIH4oQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfTE9BREIpKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKworI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURCCisKIAogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL001MjcyQzMuaCBiL2luY2x1ZGUvY29uZmlncy9NNTI3MkMzLmgKaW5kZXggNWZkNmE5NS4uY2M0NTZkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL001MjcyQzMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTTUyNzJDMy5oCkBAIC02MCwxNyArNjAsMzMgQEAKICNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9GTEFTSAkxCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICggQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfTE9BRFMgfCBDRkdfQ01EX0xPQURCKSB8IFwKLQkJCSAgIENGR19DTURfTUlJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEQgorCisKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKICNkZWZpbmUgQ0ZHX1BST01QVAkJIi0+ICIKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NNTI4MkVWQi5oIGIvaW5jbHVkZS9jb25maWdzL001MjgyRVZCLmgKaW5kZXggY2JiM2UzYi4uZjJhNzY0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL001MjgyRVZCLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL001MjgyRVZCLmgKQEAgLTUxLDE2ICs1MSwzMCBAQAogI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEKIAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgKCBDT05GSUdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfTE9BREIpICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEQgorCisKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKICNkZWZpbmUgQ0ZHX1BST01QVAkJIi0+ICIKICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NQlguaCBiL2luY2x1ZGUvY29uZmlncy9NQlguaAppbmRleCBkNmUzZmI4Li5kOWYyYWRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTUJYLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01CWC5oCkBAIC03MSwxNCArNzEsMjggQEAKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDRkdfQ01EX05FVCB8IENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9TRFJBTSB8IFwKLQkJCSAgICAgIENGR19DTURfUENNQ0lBIHwgQ0ZHX0NNRF9JREUgKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX0RGTAorI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfUENNQ0lBCisjZGVmaW5lIENPTkZJR19DTURfSURFCisKIAogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KQEAgLTg4LDcgKzEwMiw3IEBACiAjaWZkZWYJQ0ZHX0hVU0hfUEFSU0VSCiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xODcsNyArMjAxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01CWDg2MFQuaCBiL2luY2x1ZGUvY29uZmlncy9NQlg4NjBULmgKaW5kZXggMGNhMDk3MC4uNjlkMTk1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01CWDg2MFQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTUJYODYwVC5oCkBAIC0xNTEsNyArMTUxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01FVFJPQk9YLmggYi9pbmNsdWRlL2NvbmZpZ3MvTUVUUk9CT1guaAppbmRleCA3YWFlMmJkLi44ZDdlYzU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTUVUUk9CT1guaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTUVUUk9CT1guaApAQCAtMjQyLDI2ICsyNDIsMzMgQEAKICNkZWZpbmUgQ0ZHX1JYX0VUSF9CVUZGRVIgICAgIDMyCSAgICAgLyogI2V0aCByeCBidWZmICYgZGVzY3JzCSovCiAKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29uc29sZS9Db21tYW5kcy9QYXJzZXIKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRElBRwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0ZBVCkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRicyAwOS1NYXJjaC0yMDA1IFJlbW92ZWQgdG8gYmUgYWJsZSB0byB1c2UgMm5kIHNlcmlhbCAqLwotLyoJCQkJICBDRkdfQ01EX0tHREIJICB8IFwgKi8KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCiAKIAogLyogSW5jbHVkZSBOZXRDb25zb2xlIHN1cHBvcnQgKi8KQEAgLTI3MiwxMCArMjc5LDYgQEAKICNkZWZpbmUgQ09ORklHX0FVVE9fQ09NUExFVEUgMQogI2RlZmluZSBDRkdfQUxUX01FTVRFU1QJICAgICAxCSAgICAgLyogdXNlIHJlYWwgbWVtb3J5IHRlc3QJICovCiAKLQotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCSAgICAgLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkgICAgICAiTWV0cm9Cb3g9PiAiICAvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCiAKQEAgLTI4Niw3ICsyODksNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQ29uc29sZSBCdWZmZXIKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAxMDI0CSAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgMjU2CSAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTM0OCw3ICszNTEsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkgICAgICA4MTkyCSAgICAgLyogRm9yIEFNQ0MgNDA1IENQVXMJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFICAgIDMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVCAgIDUJCSAgICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgKi8KICNlbmRpZgogCkBAIC0zNjAsNyArMzYzLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkgICAgICAweDAxCSAgICAgLyogTm9ybWFsIFBvd2VyT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCSAgICAgIDB4MDIJICAgICAvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFICAyMzA0MDAJICAgICAvKiBrZ2RiIHNlcmlhbCBwb3J0IGJhdWQJKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYIDIJCSAgICAgLyoga2dkYiBzZXJpYWwgcG9ydAkqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTUhQQy5oIGIvaW5jbHVkZS9jb25maWdzL01IUEMuaAppbmRleCA1MzY4NGNhLi5kZGU3NzQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTUhQQy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NSFBDLmgKQEAgLTExNSwyNSArMTE1LDM2IEBACiAKICNkZWZpbmUgQ09ORklHX0JSMF9XT1JLQVJPVU5ECTEKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAoIENPTkZJR19DTURfREZMICB8IFwKLQkJCSAgICAgICBDRkdfQ01EX0RBVEUgICAgfCBcCi0JCQkgICAgICAgQ0ZHX0NNRF9FRVBST00gIHwgXAotCQkJICAgICAgIENGR19DTURfRUxGICAgICB8IFwKLQkJCSAgICAgICBDRkdfQ01EX0kyQyAgICAgfCBcCi0JCQkgICAgICAgQ0ZHX0NNRF9KRkZTMiAgIHwgXAotCQkJICAgICAgIENGR19DTURfUkVHSU5GTyApCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjI1LDcgKzIzNiw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NSVA0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9NSVA0MDUuaAppbmRleCA3ZTU3YTBmLi41YjUyNmEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTUlQNDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01JUDQwNS5oCkBAIC01MCw0MSArNTAsNDMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUQkzMzAwMDAwMCAvKiBleHRlcm5hbCBmcmVxdWVuY3kgdG8gcGxsICAgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb21tYW5kIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIE1JUDQwNV9DT01NT05fQ01EUyBcCi0JCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQlDRkdfQ01EX0NBQ0hFCXwgXAotCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQlDRkdfQ01EX0VMRgl8IFwKLQkJCUNGR19DTURfRkFUCXwgXAotCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQlDRkdfQ01EX0lERQl8IFwKLQkJCUNGR19DTURfSVJRCXwgXAotCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCUNGR19DTURfTUlJCXwgXAotCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQlDRkdfQ01EX1JFR0lORk8gfCBcCi0JCQlDRkdfQ01EX1NBVkVTCXwgXAotCQkJQ0ZHX0NNRF9CU1AJKQogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlQNDA1VCkKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlcCi0JCQlNSVA0MDVfQ09NTU9OX0NNRFMKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJXAotCQkJKE1JUDQwNV9DT01NT05fQ01EUyB8IFwKLQkJCUNGR19DTURfVVNCCXwgXAotCQkJQ0ZHX0NNRF9ET0MJKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKworI2lmICFkZWZpbmVkKENPTkZJR19NSVA0MDVUKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRE9DCiAjZW5kaWYKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIApAQCAtMTY1LDcgKzE2Nyw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI2MCw3ICsyNjIsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMHg0MDAwCS8qIEZvciBBTUNDIDQwNUdQciBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtNDI2LDcgKzQyOCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBEZWJ1ZyBzdXBwb3J0CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01MMi5oIGIvaW5jbHVkZS9jb25maWdzL01MMi5oCmluZGV4IGQ4ODA1ZWEuLmY0ODgyNzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NTDIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTUwyLmgKQEAgLTc2LDIwICs3NiwzMSBAQAogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKChDT05GSUdfQ01EX0RGTCAmIFwKLQkJCQkgICAgIH4oIENGR19DTURfTkVUIHwgXAotCQkJCQlDRkdfQ01EX1JUQyB8IFwKLQkJCQkJQ0ZHX0NNRF9QQ0kgfCBcCi0JCQkJCUNGR19DTURfSTJDICAgXAotCQkJCSAgICAgICkgKSB8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0tHREIJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgkgICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9LR0RCCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKworI3VuZGVmIENPTkZJR19DTURfTkVUCisjdW5kZWYgQ09ORklHX0NNRF9SVEMKKyN1bmRlZiBDT05GSUdfQ01EX1BDSQorI3VuZGVmIENPTkZJR19DTURfSTJDCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0xMDIsNyArMTEzLDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTk1LDcgKzIwNiw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCS8qIEZvciBBTUNDIDQwNSBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMjM2LDcgKzI0Nyw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTU9VU1NFLmggYi9pbmNsdWRlL2NvbmZpZ3MvTU9VU1NFLmgKaW5kZXggNmFkMmZlYi4uOTM3MGMyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01PVVNTRS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NT1VTU0UuaApAQCAtNTgsMTQgKzU4LDMxIEBACiAjZW5kaWYKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgICAgImNvbnNvbGU9dHR5UzAgcm9vdD0vZGV2L25mcyBydyBuZnNyb290PTIwOS4xMjguOTMuMTMzOi9ib290IG5mc2FkZHJzPTIwOS4xMjguOTMuMTMzOjIwOS4xMjguOTMuMTM4IgogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZICAgICAzCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgIChDT05GSUdfQ01EX0RGTHxDRkdfQ01EX0FTS0VOVnxDRkdfQ01EX0RBVEUpCisKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKworCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFIDEKICNkZWZpbmUgQ09ORklHX0VUSF9BRERSICAgICAgIjAwOjEwOjE4OjEwOjAwOjA2IgogCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OICAxIC8qIE1TRE9TIGJvb3RhYmxlIHBhcnRpdGlpb24gc3VwcG9ydCAqLwotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQotICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKICNpbmNsdWRlICIuLi9ib2FyZC9tb3Vzc2UvbW91c3NlLmgiCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODI2MEFEUy5oIGIvaW5jbHVkZS9jb25maWdzL01QQzgyNjBBRFMuaAppbmRleCA2MTk1YmNhLi43MTM1MThkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODI2MEFEUy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NUEM4MjYwQURTLmgKQEAgLTEwMSw4ICsxMDEsNyBAQAogICogZm9yIEZDQykKICAqCiAgKiBpZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMgbXVzdCBiZQotICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QgYmUgcmVtb3ZlZAotICogZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCisgKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQgbXVzdCBiZSB1bnNldC4KICAqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBTQ0MgICAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBkZWZpbmUgaWYgZXRoZXIgb24gRkNDICAgKi8KQEAgLTE5OCw1OSArMTk3LDY5IEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAotI2RlZmluZSBDRkdfRVhDTFVERQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9CTVAJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfRElTUExBWSB8IFwKLQkJCQlDRkdfQ01EX0RPQwl8IFwKLQkJCQlDRkdfQ01EX0RUVAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9GREMJfCBcCi0JCQkJQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCUNGR19DTURfSFdGTE9XCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfS0dEQgl8IFwKLQkJCQlDRkdfQ01EX01NQwl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9QQ01DSUEJfCBcCi0JCQkJQ0ZHX0NNRF9SRUlTRVIJfCBcCi0JCQkJQ0ZHX0NNRF9TQ1NJCXwgXAotCQkJCUNGR19DTURfU1BJCXwgXAotCQkJCUNGR19DTURfU05UUAl8IFwKLQkJCQlDRkdfQ01EX1VOSVZFUlNFIHwgXAotCQkJCUNGR19DTURfVVNCCXwgXAotCQkJCUNGR19DTURfVkZECXwgXAotCQkJCUNGR19DTURfWElNRworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2FsbC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9CRURCVUcKKyN1bmRlZiBDT05GSUdfQ01EX0JNUAorI3VuZGVmIENPTkZJR19DTURfQlNQCisjdW5kZWYgQ09ORklHX0NNRF9EQVRFCisjdW5kZWYgQ09ORklHX0NNRF9ESVNQTEFZCisjdW5kZWYgQ09ORklHX0NNRF9ET0MKKyN1bmRlZiBDT05GSUdfQ01EX0RUVAorI3VuZGVmIENPTkZJR19DTURfRUVQUk9NCisjdW5kZWYgQ09ORklHX0NNRF9FTEYKKyN1bmRlZiBDT05GSUdfQ01EX0VYVDIKKyN1bmRlZiBDT05GSUdfQ01EX0ZBVAorI3VuZGVmIENPTkZJR19DTURfRkRDCisjdW5kZWYgQ09ORklHX0NNRF9GRE9TCisjdW5kZWYgQ09ORklHX0NNRF9IV0ZMT1cKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorI3VuZGVmIENPTkZJR19DTURfS0dEQgorI3VuZGVmIENPTkZJR19DTURfTUZTTAorI3VuZGVmIENPTkZJR19DTURfTU1DCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9QQ01DSUEKKyN1bmRlZiBDT05GSUdfQ01EX1JFSVNFUgorI3VuZGVmIENPTkZJR19DTURfU0NTSQorI3VuZGVmIENPTkZJR19DTURfU1BJCisjdW5kZWYgQ09ORklHX0NNRF9TTlRQCisjdW5kZWYgQ09ORklHX0NNRF9VTklWRVJTRQorI3VuZGVmIENPTkZJR19DTURfVVNCCisjdW5kZWYgQ09ORklHX0NNRF9WRkQKKyN1bmRlZiBDT05GSUdfQ01EX1hJTUcKIAogI2lmIENPTkZJR19BRFNUWVBFID09IENGR184MjcyQURTCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQUxMICYgfiggXAotCQkJICAgICAgICAgQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJIENGR19FWENMVURFCSkgKQorICAgICN1bmRlZiBDT05GSUdfQ01EX1NEUkFNCisgICAgI3VuZGVmIENPTkZJR19DTURfSTJDCisKICNlbGlmIENPTkZJR19BRFNUWVBFID49IENGR19QUTJGQURTCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQUxMICYgfiggXAotCQkJCSBDRkdfQ01EX1NEUkFNCXwgXAotCQkJCSBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJIENGR19FWENMVURFCSkgKQorICAgICN1bmRlZiBDT05GSUdfQ01EX1NEUkFNCisgICAgI3VuZGVmIENPTkZJR19DTURfSTJDCisgICAgI3VuZGVmIENPTkZJR19DTURfUENJCisKICNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQUxMICYgfiggXAotCQkJCSBDTURfQ0ZHX1BDSSAJfCBcCi0JCQkJIENGR19FWENMVURFIAkpICkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9QQ0kKKwogI2VuZGlmIC8qIENPTkZJR19BRFNUWVBFID49IENGR19QUTJGQURTICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJCS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcyAqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIGZmZjgwMDAwIgkvKiBhdXRvYm9vdCBjb21tYW5kICovCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9tdGRibG9jazIiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjZGVmaW5lIENPTkZJR19LR0RCX09OX1NDQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU0NDICovCiAjdW5kZWYJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTI2OCw3ICsyNzcsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyICI+ICIKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMzg0LDcgKzM5Myw3IEBACiAjZW5kaWYgLyogQ0ZHX1JBTUJPT1QgKi8KIAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC0zOTcsOSArNDA2LDkgQEAKICNkZWZpbmUgQ0ZHX0JDUgkJCTB4MTAwQzAwMDAKICNkZWZpbmUgQ0ZHX1NJVU1DUgkJMHgwQTIwMDAwMAogI2RlZmluZSBDRkdfU0NDUgkJU0NDUl9ERkJSRzAxCi0jZGVmaW5lIENGR19CUjBfUFJFTElNCQlDRkdfRkxBU0hfQkFTRSB8IDB4MDAwMDE4MDEKKyNkZWZpbmUgQ0ZHX0JSMF9QUkVMSU0JCShDRkdfRkxBU0hfQkFTRSB8IDB4MDAwMDE4MDEpCiAjZGVmaW5lIENGR19PUjBfUFJFTElNCQkweEZGODAwODc2Ci0jZGVmaW5lIENGR19CUjFfUFJFTElNCQlDRkdfQkNTUiB8IDB4MDAwMDE4MDEKKyNkZWZpbmUgQ0ZHX0JSMV9QUkVMSU0JCShDRkdfQkNTUiB8IDB4MDAwMDE4MDEpCiAjZGVmaW5lIENGR19PUjFfUFJFTElNCQkweEZGRkY4MDEwCiAKIC8qV2UgbmVlZCB0byBjb25maWd1cmUgY2hpcCBzZWxlY3QgdG8gdXNlIENQTEQgUENJIElDIG9uIE1QQzgyNzJBRFMqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01QQzgyNjZBRFMuaCBiL2luY2x1ZGUvY29uZmlncy9NUEM4MjY2QURTLmgKaW5kZXggNDk1M2I3MC4uMTRiMDQxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzgyNjZBRFMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODI2NkFEUy5oCkBAIC04Myw4ICs4Myw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIFNDQyAgICovCiAjZGVmaW5lIENPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MgICAqLwpAQCAtMTQxLDQwICsxNDAsNDMgQEAKICAqLwogI2RlZmluZSBTUERfRUVQUk9NX0FERFJFU1MJMHg1MAogCi0KICNkZWZpbmUgQ09ORklHXzgyNjBfQ0xLSU4JNjYwMDAwMDAJLyogaW4gSHogKi8KICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9hbGwuaD4KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDRkdfQ01EX0FMTCAmIH4oIFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0JNUAl8IFwKLQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElTUExBWSB8IFwKLQkJCQlDRkdfQ01EX0RPQwl8IFwKLQkJCQlDRkdfQ01EX0RUVAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQkJQ0ZHX0NNRF9GREMJfCBcCi0JCQkJQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCUNGR19DTURfSFdGTE9XCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9LR0RCCXwgXAotCQkJCUNGR19DTURfTU1DCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX1BDTUNJQQl8IFwKLQkJCQlDRkdfQ01EX1JFSVNFUgl8IFwKLQkJCQlDRkdfQ01EX1NDU0kJfCBcCi0JCQkJQ0ZHX0NNRF9TUEkJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCXwgXAotCQkJCUNGR19DTURfVkZECXwgXAotCQkJCUNGR19DTURfVU5JVkVSU0UgfCBcCi0JCQkJQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJQ0ZHX0NNRF9YSU1HCSkgKQorI3VuZGVmIENPTkZJR19DTURfQkVEQlVHCisjdW5kZWYgQ09ORklHX0NNRF9CTVAKKyN1bmRlZiBDT05GSUdfQ01EX0JTUAorI3VuZGVmIENPTkZJR19DTURfREFURQorI3VuZGVmIENPTkZJR19DTURfREhDUAorI3VuZGVmIENPTkZJR19DTURfRElTUExBWQorI3VuZGVmIENPTkZJR19DTURfRE9DCisjdW5kZWYgQ09ORklHX0NNRF9EVFQKKyN1bmRlZiBDT05GSUdfQ01EX0VFUFJPTQorI3VuZGVmIENPTkZJR19DTURfRUxGCisjdW5kZWYgQ09ORklHX0NNRF9FWFQyCisjdW5kZWYgQ09ORklHX0NNRF9GREMKKyN1bmRlZiBDT05GSUdfQ01EX0ZET1MKKyN1bmRlZiBDT05GSUdfQ01EX0hXRkxPVworI3VuZGVmIENPTkZJR19DTURfSURFCisjdW5kZWYgQ09ORklHX0NNRF9KRkZTMgorI3VuZGVmIENPTkZJR19DTURfS0dEQgorI3VuZGVmIENPTkZJR19DTURfTUZTTAorI3VuZGVmIENPTkZJR19DTURfTU1DCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9QQ01DSUEKKyN1bmRlZiBDT05GSUdfQ01EX1JFSVNFUgorI3VuZGVmIENPTkZJR19DTURfU0NTSQorI3VuZGVmIENPTkZJR19DTURfU1BJCisjdW5kZWYgQ09ORklHX0NNRF9TTlRQCisjdW5kZWYgQ09ORklHX0NNRF9WRkQKKyN1bmRlZiBDT05GSUdfQ01EX1VOSVZFUlNFCisjdW5kZWYgQ09ORklHX0NNRF9VU0IKKyN1bmRlZiBDT05GSUdfQ01EX1hJTUcKIAogLyogRGVmaW5lIGEgY29tbWFuZCBzdHJpbmcgdGhhdCBpcyBhdXRvbWF0aWNhbGx5IGV4ZWN1dGVkIHdoZW4gbm8gY2hhcmFjdGVyCiAgKiBpcyByZWFkIG9uIHRoZSBjb25zb2xlIGludGVyZmFjZSB3aXRoaW5nICJCb290IERlbGF5IiBhZnRlciByZXNldC4KQEAgLTIwMiwyMSArMjA0LDE5IEBACiAJImJvb3RtIgogI2VuZGlmIC8qIENPTkZJR19CT09UX1JPT1RfTkZTICovCiAKLS8qIEFkZCBzdXBwb3J0IGZvciBhIGZldyBleHRyYSBib290cCBvcHRpb25zIGxpa2U6Ci0gKgktIEZpbGUgc2l6ZQotICoJLSBETlMKKy8qCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TKQotCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjZGVmaW5lIENPTkZJR19LR0RCX09OX1NDQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU0NDICovCiAjdW5kZWYJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTIzMSw3ICsyMzEsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTI4Myw3ICsyODMsNiBAQAogCiAjZGVmaW5lIFNEUkFNX1NQRF9BRERSIDB4NTAKIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBCUjIsQlIzIC0gQmFzZSBSZWdpc3RlcgogICogICAgIFJlZjogU2VjdGlvbiAxMC4zLjEgb24gcGFnZSAxMC0xNApAQCAtMzgxLDcgKzM4MCw2IEBACiAjZXJyb3IgIklOVkFMSUQgU0RSQU0gQ09ORklHVVJBVElPTiIKICNlbmRpZgogCi0KICNkZWZpbmUgUlMyMzJFTl8xCQkweDAyMDAwMDAyCiAjZGVmaW5lIFJTMjMyRU5fMgkJMHgwMTAwMDAwMQogI2RlZmluZSBGRVRISUVOCQkJMHgwODAwMDAwOApAQCAtMzkzLDcgKzM5MSw2IEBACiAjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKICNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKIAotCiAvKiBVc2UgdGhpcyBIUkNXIGZvciBib290aW5nIGZyb20gYWRkcmVzcyAweGZlMDAwMDAgKEpQMyBpbiBzZXR0aW5nIDEtMikgICovCiAvKiAweDBFQjJCNjQ1ICovCiAjZGVmaW5lIENGR19IUkNXX01BU1RFUiAoKCBIUkNXX0JQUzExIHwgSFJDV19DSVAgKQkJCQl8XApAQCAtNDUwLDEzICs0NDcsMTEgQEAKICMgIGRlZmluZSBDRkdfRU5WX1NJWkUJCTB4MjAwCiAjZW5kaWYgLyogQ0ZHX1JBTUJPT1QgKi8KIAotCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI2MCBDUFUgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogSElEeCAtIEhhcmR3YXJlIEltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBSZWdpc3RlcnMJCQkgMi0xMQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01QQzgzMTNFUkRCLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODMxM0VSREIuaAppbmRleCA3ZTEwMDVjLi44MWRiOTZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODMxM0VSREIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODMxM0VSREIuaApAQCAtMjY1LDcgKzI2NSw3IEBACiAjZGVmaW5lIENPTkZJR19JMkNfQ01EX1RSRUUKICNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCi0jZGVmaW5lIENGR19JMkNfTk9QUk9CRVMJezB4Njl9CS8qIERvbid0IHByb2JlIHRoZXNlIGFkZHJzICovCisjZGVmaW5lIENGR19JMkNfTk9QUk9CRVMJe3swLDB4Njl9fSAvKiBEb24ndCBwcm9iZSB0aGVzZSBhZGRycyAqLwogI2RlZmluZSBDRkdfSTJDX09GRlNFVAkJMHgzMDAwCiAjZGVmaW5lIENGR19JMkMyX09GRlNFVAkJMHgzMTAwCiAKQEAgLTM0MSwyNiArMzQxLDM0IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCi0jZGVmaW5lIENGR19CQVNFX0NPTU1BTkRTCSggQ09ORklHX0NNRF9ERkwJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0RIQ1AJCVwKLQkJCQl8IENGR19DTURfSTJDCQlcCi0JCQkJfCBDRkdfQ01EX01JSQkJXAotCQkJCXwgQ0ZHX0NNRF9EQVRFCQlcCi0JCQkJfCBDRkdfQ01EX1BDSSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKworI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgogCiAjZGVmaW5lIENPTkZJR19DTURMSU5FX0VESVRJTkcgMQogCi0jZGVmaW5lIENGR19SQU1CT09UX0NPTU1BTkRTCShDRkdfQkFTRV9DT01NQU5EUyAmIFwKLQkJCQkgfihDRkdfQ01EX0VOViB8IENGR19DTURfTE9BRFMpKQotCi0jaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIENGR19SQU1CT09UX0NPTU1BTkRTCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgQ0ZHX0JBU0VfQ09NTUFORFMKLSNlbmRpZgotCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODMyM0VSREIuaCBiL2luY2x1ZGUvY29uZmlncy9NUEM4MzIzRVJEQi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3Njk3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODMyM0VSREIuaApAQCAtMCwwICsxLDU4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworI3VuZGVmIERFQlVHCisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19FMzAwCQkxCS8qIEUzMDAgZmFtaWx5ICovCisjZGVmaW5lIENPTkZJR19RRQkJMQkvKiBIYXMgUUUgKi8KKyNkZWZpbmUgQ09ORklHX01QQzgzWFgJCTEJLyogTVBDODN4eCBmYW1pbHkgKi8KKyNkZWZpbmUgQ09ORklHX01QQzgzMlgJCTEJLyogTVBDODMyeCBDUFUgc3BlY2lmaWMgKi8KKworI2RlZmluZSBDT05GSUdfUENJCQkxCisjZGVmaW5lIENPTkZJR184M1hYX0dFTkVSSUNfUENJCTEKKworLyoKKyAqIFN5c3RlbSBDbG9jayBTZXR1cAorICovCisjZGVmaW5lIENPTkZJR184M1hYX0NMS0lOCTY2NjY2NjY3CS8qIGluIEh6ICovCisKKyNpZm5kZWYgQ09ORklHX1NZU19DTEtfRlJFUQorI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRCUNPTkZJR184M1hYX0NMS0lOCisjZW5kaWYKKworLyoKKyAqIEhhcmR3YXJlIFJlc2V0IENvbmZpZ3VyYXRpb24gV29yZAorICovCisjZGVmaW5lIENGR19IUkNXX0xPVyAoXAorCUhSQ1dMX0xDTF9CVVNfVE9fU0NCX0NMS18xWDEgfFwKKwlIUkNXTF9ERFJfVE9fU0NCX0NMS18yWDEgfFwKKwlIUkNXTF9WQ09fMVgyIHxcCisJSFJDV0xfQ1NCX1RPX0NMS0lOXzJYMSB8XAorCUhSQ1dMX0NPUkVfVE9fQ1NCXzJfNVgxIHxcCisJSFJDV0xfQ0VfUExMX1ZDT19ESVZfMiB8XAorCUhSQ1dMX0NFX1BMTF9ESVZfMVgxIHxcCisJSFJDV0xfQ0VfVE9fUExMXzFYMykKKworI2RlZmluZSBDRkdfSFJDV19ISUdIIChcCisJSFJDV0hfUENJX0hPU1QgfFwKKwlIUkNXSF9QQ0kxX0FSQklURVJfRU5BQkxFIHxcCisJSFJDV0hfQ09SRV9FTkFCTEUgfFwKKwlIUkNXSF9GUk9NXzBYMDAwMDAxMDAgfFwKKwlIUkNXSF9CT09UU0VRX0RJU0FCTEUgfFwKKwlIUkNXSF9TV19XQVRDSERPR19ESVNBQkxFIHxcCisJSFJDV0hfUk9NX0xPQ19MT0NBTF8xNkJJVCB8XAorCUhSQ1dIX0JJR19FTkRJQU4gfFwKKwlIUkNXSF9MQUxFX05PUk1BTCkKKworLyoKKyAqIFN5c3RlbSBJTyBDb25maWcKKyAqLworI2RlZmluZSBDRkdfU0lDUkwJCTB4MDAwMDAwMDAKKworI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9GCS8qIGNhbGwgYm9hcmRfcHJlX2luaXQgKi8KKworLyoKKyAqIElNTVIgbmV3IGFkZHJlc3MKKyAqLworI2RlZmluZSBDRkdfSU1NUgkJMHhFMDAwMDAwMAorCisvKgorICogRERSIFNldHVwCisgKi8KKyNkZWZpbmUgQ0ZHX0REUl9CQVNFCQkweDAwMDAwMDAwCS8qIEREUiBpcyBzeXN0ZW0gbWVtb3J5ICovCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCQlDRkdfRERSX0JBU0UKKyNkZWZpbmUgQ0ZHX0REUl9TRFJBTV9CQVNFCUNGR19ERFJfQkFTRQorI2RlZmluZSBDRkdfRERSQ0RSCQkweDczMDAwMDAyCS8qIEREUiBJSSB2b2x0YWdlIGlzIDEuOFYgKi8KKworI3VuZGVmIENPTkZJR19TUERfRUVQUk9NCisjaWYgZGVmaW5lZChDT05GSUdfU1BEX0VFUFJPTSkKKy8qIERldGVybWluZSBERFIgY29uZmlndXJhdGlvbiBmcm9tIEkyQyBpbnRlcmZhY2UKKyAqLworI2RlZmluZSBTUERfRUVQUk9NX0FERFJFU1MJMHg1MQkvKiBERFIgU09ESU1NICovCisjZWxzZQorLyogTWFudWFsbHkgc2V0IHVwIEREUiBwYXJhbWV0ZXJzCisgKi8KKyNkZWZpbmUgQ0ZHX0REUl9TSVpFCQk2NAkvKiBNQiAqLworI2RlZmluZSBDRkdfRERSX0NTMF9DT05GSUcJMHg4MDg0MDEwMQorI2RlZmluZSBDRkdfRERSX1RJTUlOR18wCTB4MDAyMjA4MDIKKyNkZWZpbmUgQ0ZHX0REUl9USU1JTkdfMQkweDM5MzVkMzIyCisjZGVmaW5lIENGR19ERFJfVElNSU5HXzIJMHgwZjkwNDhjYQorI2RlZmluZSBDRkdfRERSX1RJTUlOR18zCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0REUl9DTEtfQ05UTAkweDAyMDAwMDAwCisjZGVmaW5lIENGR19ERFJfTU9ERQkJMHg0NDQwMDIzMgorI2RlZmluZSBDRkdfRERSX01PREUyCQkweDgwMDBjMDAwCisjZGVmaW5lIENGR19ERFJfSU5URVJWQUwJMHgwMzIwMDA2NAorI2RlZmluZSBDRkdfRERSX0NTMF9CTkRTCTB4MDAwMDAwMDMKKyNkZWZpbmUgQ0ZHX0REUl9TRFJBTV9DRkcJMHg0MzA4MDAwMAorI2RlZmluZSBDRkdfRERSX1NEUkFNX0NGRzIJMHgwMDQwMTAwMAorI2VuZGlmCisKKy8qCisgKiBNZW1vcnkgdGVzdAorICovCisjdW5kZWYgQ0ZHX0RSQU1fVEVTVAkJLyogbWVtb3J5IHRlc3QsIHRha2VzIHRpbWUgKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwMDAzMDAwMAkvKiBtZW10ZXN0IHJlZ2lvbiAqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MDNmMDAwMDAKKworLyoKKyAqIFRoZSByZXNlcnZlZCBtZW1vcnkKKyAqLworI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVRFWFRfQkFTRQkvKiBzdGFydCBvZiBtb25pdG9yICovCisKKyNpZiAoQ0ZHX01PTklUT1JfQkFTRSA8IENGR19GTEFTSF9CQVNFKQorI2RlZmluZSBDRkdfUkFNQk9PVAorI2Vsc2UKKyN1bmRlZiAgQ0ZHX1JBTUJPT1QKKyNlbmRpZgorCisjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDI1NiAqIDEwMjQpCS8qIFJlc2VydmUgMjU2IGtCIGZvciBNb24gKi8KKyNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCSgxMjggKiAxMDI0KQkvKiBSZXNlcnZlZCBmb3IgbWFsbG9jICovCisKKy8qCisgKiBJbml0aWFsIFJBTSBCYXNlIEFkZHJlc3MgU2V0dXAKKyAqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fTE9DSwkxCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCTB4RTYwMDAwMDAJLyogSW5pdGlhbCBSQU0gYWRkcmVzcyAqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECTB4MTAwMAkJLyogRW5kIG9mIHVzZWQgYXJlYSBpbiBSQU0gKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMHgxMDAJCS8qIG51bSBieXRlcyBpbml0aWFsIGRhdGEgKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQorCisvKgorICogTG9jYWwgQnVzIENvbmZpZ3VyYXRpb24gJiBDbG9jayBTZXR1cAorICovCisjZGVmaW5lIENGR19MQ1JSCQkoTENSUl9EQllQIHwgTENSUl9DTEtESVZfMikKKyNkZWZpbmUgQ0ZHX0xCQ19MQkNSCQkweDAwMDAwMDAwCisKKy8qCisgKiBGTEFTSCBvbiB0aGUgTG9jYWwgQnVzCisgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSQkJLyogdXNlIHRoZSBDb21tb24gRmxhc2ggSW50ZXJmYWNlICovCisjZGVmaW5lIENGR19GTEFTSF9DRklfRFJJVkVSCS8qIHVzZSB0aGUgQ0ZJIGRyaXZlciAqLworI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhGRTAwMDAwMAkvKiBGTEFTSCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1NJWkUJCTE2CS8qIEZMQVNIIHNpemUgaXMgMTZNICovCisKKyNkZWZpbmUgQ0ZHX0xCTEFXQkFSMF9QUkVMSU0JQ0ZHX0ZMQVNIX0JBU0UJLyogV2luZG93IGJhc2UgYXQgZmxhc2ggYmFzZSAqLworI2RlZmluZSBDRkdfTEJMQVdBUjBfUFJFTElNCTB4ODAwMDAwMTgJLyogMzJNQiB3aW5kb3cgc2l6ZSAqLworCisjZGVmaW5lIENGR19CUjBfUFJFTElNCShDRkdfRkxBU0hfQkFTRSB8CS8qIEZsYXNoIEJhc2UgYWRkcmVzcyAqLyBcCisJCQkoMiA8PCBCUl9QU19TSElGVCkgfAkvKiAxNiBiaXQgcG9ydCBzaXplICovIFwKKwkJCUJSX1YpCQkJLyogdmFsaWQgKi8KKyNkZWZpbmUgQ0ZHX09SMF9QUkVMSU0JCTB4ZmUwMDZmZjcJLyogMTZNQiBGbGFzaCBzaXplICovCisKKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCQkvKiBudW1iZXIgb2YgYmFua3MgKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTEyOAkJLyogc2VjdG9ycyBwZXIgZGV2aWNlICovCisKKyN1bmRlZiBDRkdfRkxBU0hfQ0hFQ0tTVU0KKworLyoKKyAqIFNEUkFNIG9uIHRoZSBMb2NhbCBCdXMKKyAqLworI3VuZGVmIENGR19MQl9TRFJBTQkJLyogVGhlIGJvYXJkIGhhcyBub3QgU1JEQU0gb24gbG9jYWwgYnVzICovCisKKyNpZmRlZiBDRkdfTEJfU0RSQU0KKyNkZWZpbmUgQ0ZHX0xCQ19TRFJBTV9CQVNFCTB4RjAwMDAwMDAJLyogU0RSQU0gYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIENGR19MQkNfU0RSQU1fU0laRQk2NAkJLyogTEJDIFNEUkFNIGlzIDY0TUIgKi8KKworI2RlZmluZSBDRkdfTEJMQVdCQVIyX1BSRUxJTQlDRkdfTEJDX1NEUkFNX0JBU0UKKyNkZWZpbmUgQ0ZHX0xCTEFXQVIyX1BSRUxJTQkweDgwMDAwMDE5CS8qIDY0TUIgKi8KKworLypsb2NhbCBidXMgQlIyLCBPUjIgZGVmaW5pdGlvbiBmb3IgU0RSQU0gaWYgc29sZGVyZWQgb24gdGhlIEVQQiBib2FyZCAqLworLyoKKyAqIEJhc2UgUmVnaXN0ZXIgMiBhbmQgT3B0aW9uIFJlZ2lzdGVyIDIgY29uZmlndXJlIFNEUkFNLgorICogVGhlIFNEUkFNIGJhc2UgYWRkcmVzcywgQ0ZHX0xCQ19TRFJBTV9CQVNFLCBpcyAweGYwMDAwMDAwLgorICoKKyAqIEZvciBCUjIsIG5lZWQ6CisgKiAgICBCYXNlIGFkZHJlc3Mgb2YgMHhmMDAwMDAwMCA9IEJSWzA6MTZdID0gMTExMSAwMDAwIDAwMDAgMDAwMCAwCisgKiAgICBwb3J0IHNpemUgPSAzMi1iaXRzID0gQlIyWzE5OjIwXSA9IDExCisgKiAgICBubyBwYXJpdHkgY2hlY2tpbmcgPSBCUjJbMjE6MjJdID0gMDAKKyAqICAgIFNEUkFNIGZvciBNU0VMID0gQlIyWzI0OjI2XSA9IDAxMQorICogICAgVmFsaWQgPSBCUlszMV0gPSAxCisgKgorICogMCAgICA0ICAgIDggICAgMTIgICAxNiAgIDIwICAgMjQgICAyOAorICogMTExMSAwMDAwIDAwMDAgMDAwMCAwMDAxIDEwMDAgMDExMCAwMDAxID0gZjAwMDE4NjEKKyAqCisgKiBDRkdfTEJDX1NEUkFNX0JBU0Ugc2hvdWxkIGJlIG1hc2tlZCBhbmQgT1InZWQgaW50bworICogdGhlIHRvcCAxNyBiaXRzIG9mIEJSMi4KKyAqLworCisjZGVmaW5lIENGR19CUjJfUFJFTElNCTB4ZjAwMDE4NjEJLypQb3J0IHNpemU9MzJiaXQsIE1TRUw9U0RSQU0gKi8KKworLyoKKyAqIFRoZSBTRFJBTSBzaXplIGluIE1CLCBDRkdfTEJDX1NEUkFNX1NJWkUsIGlzIDY0LgorICoKKyAqIEZvciBPUjIsIG5lZWQ6CisgKiAgICA2NE1CIG1hc2sgZm9yIEFNLCBPUjJbMDo3XSA9IDExMTEgMTEwMAorICogICAgICAgICAgICAgICAgIFhBTSwgT1IyWzE3OjE4XSA9IDExCisgKiAgICA5IGNvbHVtbnMgT1IyWzE5LTIxXSA9IDAxMAorICogICAgMTMgcm93cyAgIE9SMlsyMy0yNV0gPSAxMDAKKyAqICAgIEVBRCBzZXQgZm9yIGV4dHJhIHRpbWUgT1JbMzFdID0gMQorICoKKyAqIDAgICAgNCAgICA4ICAgIDEyICAgMTYgICAyMCAgIDI0ICAgMjgKKyAqIDExMTEgMTEwMCAwMDAwIDAwMDAgMDExMCAxMDAxIDAwMDAgMDAwMSA9IGZjMDA2OTAxCisgKi8KKworI2RlZmluZSBDRkdfT1IyX1BSRUxJTQkweGZjMDA2OTAxCisKKyNkZWZpbmUgQ0ZHX0xCQ19MU1JUCTB4MzIwMDAwMDAJLyogTEIgc2RyYW0gcmVmcmVzaCB0aW1lciwgYWJvdXQgNnVzICovCisjZGVmaW5lIENGR19MQkNfTVJUUFIJMHgyMDAwMDAwMAkvKiBMQiByZWZyZXNoIHRpbWVyIHByZXNjYWwsIDI2Nk1Iei8zMiAqLworCisvKgorICogTFNETVIgbWFza3MKKyAqLworI2RlZmluZSBDRkdfTEJDX0xTRE1SX09QX05PUk1BTAkoMCA8PCAoMzEgLSA0KSkKKyNkZWZpbmUgQ0ZHX0xCQ19MU0RNUl9PUF9BUkZSU0gJKDEgPDwgKDMxIC0gNCkpCisjZGVmaW5lIENGR19MQkNfTFNETVJfT1BfU1JGUlNICSgyIDw8ICgzMSAtIDQpKQorI2RlZmluZSBDRkdfTEJDX0xTRE1SX09QX01SVwkoMyA8PCAoMzEgLSA0KSkKKyNkZWZpbmUgQ0ZHX0xCQ19MU0RNUl9PUF9QUkVDSAkoNCA8PCAoMzEgLSA0KSkKKyNkZWZpbmUgQ0ZHX0xCQ19MU0RNUl9PUF9QQ0hBTEwJKDUgPDwgKDMxIC0gNCkpCisjZGVmaW5lIENGR19MQkNfTFNETVJfT1BfQUNUQk5LCSg2IDw8ICgzMSAtIDQpKQorI2RlZmluZSBDRkdfTEJDX0xTRE1SX09QX1JXSU5WCSg3IDw8ICgzMSAtIDQpKQorCisjZGVmaW5lIENGR19MQkNfTFNETVJfQ09NTU9OCTB4MDA2M2I3MjMKKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgY29uZmlndXJhdGlvbiBzZXF1ZW5jZS4KKyAqLworI2RlZmluZSBDRkdfTEJDX0xTRE1SXzEJCSggQ0ZHX0xCQ19MU0RNUl9DT01NT04gXAorCQkJCXwgQ0ZHX0xCQ19MU0RNUl9PUF9QQ0hBTEwpCisjZGVmaW5lIENGR19MQkNfTFNETVJfMgkJKCBDRkdfTEJDX0xTRE1SX0NPTU1PTiBcCisJCQkJfCBDRkdfTEJDX0xTRE1SX09QX0FSRlJTSCkKKyNkZWZpbmUgQ0ZHX0xCQ19MU0RNUl8zCQkoIENGR19MQkNfTFNETVJfQ09NTU9OIFwKKwkJCQl8IENGR19MQkNfTFNETVJfT1BfQVJGUlNIKQorI2RlZmluZSBDRkdfTEJDX0xTRE1SXzQJCSggQ0ZHX0xCQ19MU0RNUl9DT01NT04gXAorCQkJCXwgQ0ZHX0xCQ19MU0RNUl9PUF9NUlcpCisjZGVmaW5lIENGR19MQkNfTFNETVJfNQkJKCBDRkdfTEJDX0xTRE1SX0NPTU1PTiBcCisJCQkJfCBDRkdfTEJDX0xTRE1SX09QX05PUk1BTCkKKworI2VuZGlmCisKKy8qCisgKiBXaW5kb3dzIHRvIGFjY2VzcyBQSUIgdmlhIGxvY2FsIGJ1cworICovCisjZGVmaW5lIENGR19MQkxBV0JBUjNfUFJFTElNCTB4ZjgwMDgwMDAJLyogd2luZG93cyBiYXNlIDB4ZjgwMDgwMDAgKi8KKyNkZWZpbmUgQ0ZHX0xCTEFXQVIzX1BSRUxJTQkweDgwMDAwMDBmCS8qIHdpbmRvd3Mgc2l6ZSA2NEtCICovCisKKy8qCisgKiBTZXJpYWwgUG9ydAorICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYCTEKKyN1bmRlZiBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8KKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFCTEKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQlnZXRfYnVzX2ZyZXEoMCkKKworI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUgIFwKKwl7MzAwLCA2MDAsIDEyMDAsIDI0MDAsIDQ4MDAsIDk2MDAsIDE5MjAwLCAzODQwMCwxMTUyMDB9CisKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMQkoQ0ZHX0lNTVIrMHg0NTAwKQorI2RlZmluZSBDRkdfTlMxNjU1MF9DT00yCShDRkdfSU1NUisweDQ2MDApCisKKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfRURJVElORwkxCS8qIGFkZCBjb21tYW5kIGxpbmUgaGlzdG9yeSAqLworLyogVXNlIHRoZSBIVVNIIHBhcnNlciAqLworI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIKKyNpZmRlZiBDRkdfSFVTSF9QQVJTRVIKKyNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMiAiPiAiCisjZW5kaWYKKworLyogcGFzcyBvcGVuIGZpcm13YXJlIGZsYXQgdHJlZSAqLworI2RlZmluZSBDT05GSUdfT0ZfTElCRkRUCTEKKyNkZWZpbmUgQ09ORklHX09GX0JPQVJEX1NFVFVQCTEKKworI2RlZmluZSBPRl9DUFUJCQkiUG93ZXJQQyw4MzIzQDAiCisjZGVmaW5lIE9GX1NPQwkJCSJzb2M4MzIzQGUwMDAwMDAwIgorI2RlZmluZSBPRl9RRQkJCSJxZUBlMDEwMDAwMCIKKyNkZWZpbmUgT0ZfVEJDTEsJCShiZC0+YmlfYnVzZnJlcSAvIDQpCisjZGVmaW5lIE9GX1NURE9VVF9QQVRICQkiL3NvYzgzMjNAZTAwMDAwMDAvc2VyaWFsQDQ1MDAiCisKKy8qIEkyQyAqLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMJCS8qIEkyQyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQgKi8KKyN1bmRlZiBDT05GSUdfU09GVF9JMkMJCS8qIEkyQyBiaXQtYmFuZ2VkICovCisjZGVmaW5lIENPTkZJR19GU0xfSTJDCisjZGVmaW5lIENGR19JMkNfU1BFRUQJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCTB4N0YKKyNkZWZpbmUgQ0ZHX0kyQ19OT1BST0JFUwl7MHg1MX0JLyogRG9uJ3QgcHJvYmUgdGhlc2UgYWRkcnMgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19PRkZTRVQJMHgzMDAwCisKKy8qCisgKiBDb25maWcgb24tYm9hcmQgUlRDCisgKi8KKyNkZWZpbmUgQ09ORklHX1JUQ19EUzEzNzQJCS8qIHVzZSBkczEzNzQgcnRjIHZpYSBpMmMgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19SVENfQUREUgkweDY4CS8qIGF0IGFkZHJlc3MgMHg2OCAqLworCisvKgorICogR2VuZXJhbCBQQ0kKKyAqIEFkZHJlc3NlcyBhcmUgbWFwcGVkIDEtMS4KKyAqLworI2RlZmluZSBDRkdfUENJMV9NRU1fQkFTRQkweDgwMDAwMDAwCisjZGVmaW5lIENGR19QQ0kxX01FTV9QSFlTCUNGR19QQ0kxX01FTV9CQVNFCisjZGVmaW5lIENGR19QQ0kxX01FTV9TSVpFCTB4MTAwMDAwMDAJLyogMjU2TSAqLworI2RlZmluZSBDRkdfUENJMV9NTUlPX0JBU0UJMHg5MDAwMDAwMAorI2RlZmluZSBDRkdfUENJMV9NTUlPX1BIWVMJQ0ZHX1BDSTFfTU1JT19CQVNFCisjZGVmaW5lIENGR19QQ0kxX01NSU9fU0laRQkweDEwMDAwMDAwCS8qIDI1Nk0gKi8KKyNkZWZpbmUgQ0ZHX1BDSTFfSU9fQkFTRQkJMHhkMDAwMDAwMAorI2RlZmluZSBDRkdfUENJMV9JT19QSFlTCQlDRkdfUENJMV9JT19CQVNFCisjZGVmaW5lIENGR19QQ0kxX0lPX1NJWkUJCTB4MDQwMDAwMDAJLyogNjRNICovCisKKyNpZmRlZiBDT05GSUdfUENJCisKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQorI2RlZmluZSBDT05GSUdfUENJX1BOUAkJLyogZG8gcGNpIHBsdWctYW5kLXBsYXkgKi8KKworI3VuZGVmIENPTkZJR19FRVBSTzEwMAorI3VuZGVmIENPTkZJR19QQ0lfU0NBTl9TSE9XCS8qIHNob3cgcGNpIGRldmljZXMgb24gc3RhcnR1cCAqLworI2RlZmluZSBDRkdfUENJX1NVQlNZU19WRU5ET1JJRAkweDE5NTcJLyogRnJlZXNjYWxlICovCisKKyNlbmRpZgkvKiBDT05GSUdfUENJICovCisKKworI2lmbmRlZiBDT05GSUdfTkVUX01VTFRJCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJMQorI2VuZGlmCisKKy8qCisgKiBRRSBVRUMgZXRoZXJuZXQgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19VRUNfRVRICisjZGVmaW5lIENPTkZJR19FVEhQUklNRQkJIkZyZWVzY2FsZSBHRVRIIgorCisjZGVmaW5lIENPTkZJR19VRUNfRVRIMQkJLyogRVRIMyAqLworCisjaWZkZWYgQ09ORklHX1VFQ19FVEgxCisjZGVmaW5lIENGR19VRUMxX1VDQ19OVU0JMgkvKiBVQ0MzICovCisjZGVmaW5lIENGR19VRUMxX1JYX0NMSwkJUUVfQ0xLOQorI2RlZmluZSBDRkdfVUVDMV9UWF9DTEsJCVFFX0NMSzEwCisjZGVmaW5lIENGR19VRUMxX0VUSF9UWVBFCUZBU1RfRVRICisjZGVmaW5lIENGR19VRUMxX1BIWV9BRERSCTQKKyNkZWZpbmUgQ0ZHX1VFQzFfSU5URVJGQUNFX01PREUJRU5FVF8xMDBfTUlJCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfVUVDX0VUSDIJCS8qIEVUSDQgKi8KKworI2lmZGVmIENPTkZJR19VRUNfRVRIMgorI2RlZmluZSBDRkdfVUVDMl9VQ0NfTlVNCTEJLyogVUNDMiAqLworI2RlZmluZSBDRkdfVUVDMl9SWF9DTEsJCVFFX0NMSzE2CisjZGVmaW5lIENGR19VRUMyX1RYX0NMSwkJUUVfQ0xLMworI2RlZmluZSBDRkdfVUVDMl9FVEhfVFlQRQlGQVNUX0VUSAorI2RlZmluZSBDRkdfVUVDMl9QSFlfQUREUgkwCisjZGVmaW5lIENGR19VRUMyX0lOVEVSRkFDRV9NT0RFCUVORVRfMTAwX01JSQorI2VuZGlmCisKKy8qCisgKiBFbnZpcm9ubWVudAorICovCisjaWZuZGVmIENGR19SQU1CT09UCisJI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEKKwkjZGVmaW5lIENGR19FTlZfQUREUgkJKENGR19NT05JVE9SX0JBU0UgKyAweDQwMDAwKQorCSNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHg0MDAwMAkvKiAyNTZLKG9uZSBzZWN0b3IpIGZvciBlbnYgKi8KKwkjZGVmaW5lIENGR19FTlZfU0laRQkJMHgyMDAwCisjZWxzZQorCSNkZWZpbmUgQ0ZHX05PX0ZMQVNICQkxCS8qIEZsYXNoIGlzIG5vdCB1c2FibGUgbm93ICovCisJI2RlZmluZSBDRkdfRU5WX0lTX05PV0hFUkUJMQkvKiBTdG9yZSBFTlYgaW4gbWVtb3J5IG9ubHkgKi8KKwkjZGVmaW5lIENGR19FTlZfQUREUgkJKENGR19NT05JVE9SX0JBU0UgLSAweDEwMDApCisJI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4MjAwMAorI2VuZGlmCisKKyNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KKyNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorCSNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisJI3VuZGVmIENPTkZJR19DTURfRU5WCisJI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCisjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT05HSEVMUAkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkgKi8KKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KKworI2lmIChDT05GSUdfQ01EX0tHREIpCisJI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KKyNlbHNlCisJI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLworI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX1BCU0laRSAoQ0ZHX0NCU0laRStzaXplb2YoQ0ZHX1BST01QVCkrMTYpCS8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19NQVhBUkdTCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncyAqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19IWgkJMTAwMAkJLyogZGVjcmVtZW50ZXIgZnJlcTogMW1zIHRpY2tzICovCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lIENGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCisKKy8qCisgKiBDb3JlIEhJRCBTZXR1cAorICovCisjZGVmaW5lIENGR19ISUQwX0lOSVQJCTB4MDAwMDAwMDAwCisjZGVmaW5lIENGR19ISUQwX0ZJTkFMCQlISUQwX0VOQUJMRV9NQUNISU5FX0NIRUNLCisjZGVmaW5lIENGR19ISUQyCQlISUQyX0hCRQorCisvKgorICogQ2FjaGUgQ29uZmlnCisgKi8KKyNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCisvKgorICogTU1VIFNldHVwCisgKi8KKworLyogRERSOiBjYWNoZSBjYWNoZWFibGUgKi8KKyNkZWZpbmUgQ0ZHX0lCQVQwTAkoQ0ZHX1NEUkFNX0JBU0UgfCBCQVRMX1BQXzEwIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19JQkFUMFUJKENGR19TRFJBTV9CQVNFIHwgQkFUVV9CTF8yNTZNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19EQkFUMEwJQ0ZHX0lCQVQwTAorI2RlZmluZSBDRkdfREJBVDBVCUNGR19JQkFUMFUKKworLyogSU1NUkJBUiAmIFBDSSBJTzogY2FjaGUtaW5oaWJpdCBhbmQgZ3VhcmRlZCAqLworI2RlZmluZSBDRkdfSUJBVDFMCShDRkdfSU1NUiB8IEJBVExfUFBfMTAgfCBcCisJCQlCQVRMX0NBQ0hFSU5ISUJJVCB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCisjZGVmaW5lIENGR19JQkFUMVUJKENGR19JTU1SIHwgQkFUVV9CTF80TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorI2RlZmluZSBDRkdfREJBVDFMCUNGR19JQkFUMUwKKyNkZWZpbmUgQ0ZHX0RCQVQxVQlDRkdfSUJBVDFVCisKKy8qIEZMQVNIOiBpY2FjaGUgY2FjaGVhYmxlLCBidXQgZGNhY2hlLWluaGliaXQgYW5kIGd1YXJkZWQgKi8KKyNkZWZpbmUgQ0ZHX0lCQVQyTAkoQ0ZHX0ZMQVNIX0JBU0UgfCBCQVRMX1BQXzEwIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19JQkFUMlUJKENGR19GTEFTSF9CQVNFIHwgQkFUVV9CTF8zMk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0RCQVQyTAkoQ0ZHX0ZMQVNIX0JBU0UgfCBCQVRMX1BQXzEwIHwgXAorCQkJQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX0dVQVJERURTVE9SQUdFKQorI2RlZmluZSBDRkdfREJBVDJVCUNGR19JQkFUMlUKKworI2RlZmluZSBDRkdfSUJBVDNMCSgwKQorI2RlZmluZSBDRkdfSUJBVDNVCSgwKQorI2RlZmluZSBDRkdfREJBVDNMCUNGR19JQkFUM0wKKyNkZWZpbmUgQ0ZHX0RCQVQzVQlDRkdfSUJBVDNVCisKKy8qIFN0YWNrIGluIGRjYWNoZTogY2FjaGVhYmxlLCBubyBtZW1vcnkgY29oZXJlbmNlICovCisjZGVmaW5lIENGR19JQkFUNEwJKENGR19JTklUX1JBTV9BRERSIHwgQkFUTF9QUF8xMCkKKyNkZWZpbmUgQ0ZHX0lCQVQ0VQkoQ0ZHX0lOSVRfUkFNX0FERFIgfCBCQVRVX0JMXzEyOEsgfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0RCQVQ0TAlDRkdfSUJBVDRMCisjZGVmaW5lIENGR19EQkFUNFUJQ0ZHX0lCQVQ0VQorCisjaWZkZWYgQ09ORklHX1BDSQorLyogUENJIE1FTSBzcGFjZTogY2FjaGVhYmxlICovCisjZGVmaW5lIENGR19JQkFUNUwJKENGR19QQ0kxX01FTV9QSFlTIHwgQkFUTF9QUF8xMCB8IEJBVExfTUVNQ09IRVJFTkNFKQorI2RlZmluZSBDRkdfSUJBVDVVCShDRkdfUENJMV9NRU1fUEhZUyB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorI2RlZmluZSBDRkdfREJBVDVMCUNGR19JQkFUNUwKKyNkZWZpbmUgQ0ZHX0RCQVQ1VQlDRkdfSUJBVDVVCisvKiBQQ0kgTU1JTyBzcGFjZTogY2FjaGUtaW5oaWJpdCBhbmQgZ3VhcmRlZCAqLworI2RlZmluZSBDRkdfSUJBVDZMCShDRkdfUENJMV9NTUlPX1BIWVMgfCBCQVRMX1BQXzEwIHwgXAorCQkJQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX0dVQVJERURTVE9SQUdFKQorI2RlZmluZSBDRkdfSUJBVDZVCShDRkdfUENJMV9NTUlPX1BIWVMgfCBCQVRVX0JMXzI1Nk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0RCQVQ2TAlDRkdfSUJBVDZMCisjZGVmaW5lIENGR19EQkFUNlUJQ0ZHX0lCQVQ2VQorI2Vsc2UKKyNkZWZpbmUgQ0ZHX0lCQVQ1TAkoMCkKKyNkZWZpbmUgQ0ZHX0lCQVQ1VQkoMCkKKyNkZWZpbmUgQ0ZHX0lCQVQ2TAkoMCkKKyNkZWZpbmUgQ0ZHX0lCQVQ2VQkoMCkKKyNkZWZpbmUgQ0ZHX0RCQVQ1TAlDRkdfSUJBVDVMCisjZGVmaW5lIENGR19EQkFUNVUJQ0ZHX0lCQVQ1VQorI2RlZmluZSBDRkdfREJBVDZMCUNGR19JQkFUNkwKKyNkZWZpbmUgQ0ZHX0RCQVQ2VQlDRkdfSUJBVDZVCisjZW5kaWYKKworLyogTm90aGluZyBpbiBCQVQ3ICovCisjZGVmaW5lIENGR19JQkFUN0wJKDApCisjZGVmaW5lIENGR19JQkFUN1UJKDApCisjZGVmaW5lIENGR19EQkFUN0wJQ0ZHX0lCQVQ3TAorI2RlZmluZSBDRkdfREJBVDdVCUNGR19JQkFUN1UKKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLworI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJLyogU29mdHdhcmUgcmVib290ICovCisKKyNpZiAoQ09ORklHX0NNRF9LR0RCKQorI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgb2Yga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorCisvKgorICogRW52aXJvbm1lbnQgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCisKKyNkZWZpbmUgQ09ORklHX0VUSEFERFIJMDA6MDQ6OWY6ZWY6MDM6MDEKKyNkZWZpbmUgQ09ORklHX0hBU19FVEgxCQkJCS8qIGFkZCBzdXBwb3J0IGZvciAiZXRoMWFkZHIiICovCisjZGVmaW5lIENPTkZJR19FVEgxQUREUgkwMDowNDo5ZjplZjowMzowMgorCisjZGVmaW5lIENPTkZJR19JUEFERFIJCTEwLjAuMC4yCisjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTAuMC4wLjEKKyNkZWZpbmUgQ09ORklHX0dBVEVXQVlJUAkxMC4wLjAuMQorI2RlZmluZSBDT05GSUdfTkVUTUFTSwkJMjU1LjAuMC4wCisjZGVmaW5lIENPTkZJR19ORVRERVYJCWV0aDEKKworI2RlZmluZSBDT05GSUdfSE9TVE5BTUUJCW1wYzgzMjNlcmRiCisjZGVmaW5lIENPTkZJR19ST09UUEFUSAkJL25mc3Jvb3QKKyNkZWZpbmUgQ09ORklHX1JBTURJU0tGSUxFCXJvb3Rmcy5leHQyLmd6LnVib290CisjZGVmaW5lIENPTkZJR19CT09URklMRQkJdUltYWdlCisjZGVmaW5lIENPTkZJR19VQk9PVFBBVEgJdS1ib290LmJpbgkvKiBVLUJvb3QgaW1hZ2Ugb24gVEZUUCBzZXJ2ZXIgKi8KKyNkZWZpbmUgQ09ORklHX0ZEVEZJTEUJCW1wYzgzMnhfcmRiLmR0YgorCisjZGVmaW5lIENPTkZJR19MT0FEQUREUgkJMjAwMDAwCS8qIGRlZmF1bHQgbG9jYXRpb24gZm9yIHRmdHAgYW5kIGJvb3RtICovCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJLTEJLyogLTEgZGlzYWJsZXMgYXV0by1ib290ICovCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCisKKyNkZWZpbmUgWE1LX1NUUih4KQkjeAorI2RlZmluZSBNS19TVFIoeCkJWE1LX1NUUih4KQorCisjZGVmaW5lIENPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MgXAorCSJuZXRkZXY9IiBNS19TVFIoQ09ORklHX05FVERFVikgIlwwIgkJCQlcCisJInVib290PSIgTUtfU1RSKENPTkZJR19VQk9PVFBBVEgpICJcMCIJCQkJXAorCSJ0ZnRwZmxhc2g9dGZ0cCAkbG9hZGFkZHIgJHVib290OyIJCQkJXAorCQkicHJvdGVjdCBvZmYgIiBNS19TVFIoVEVYVF9CQVNFKSAiICskZmlsZXNpemU7ICIJXAorCQkiZXJhc2UgIiBNS19TVFIoVEVYVF9CQVNFKSAiICskZmlsZXNpemU7ICIJCVwKKwkJImNwLmIgJGxvYWRhZGRyICIgTUtfU1RSKFRFWFRfQkFTRSkgIiAkZmlsZXNpemU7ICIJXAorCQkicHJvdGVjdCBvbiAiIE1LX1NUUihURVhUX0JBU0UpICIgKyRmaWxlc2l6ZTsgIgkJXAorCQkiY21wLmIgJGxvYWRhZGRyICIgTUtfU1RSKFRFWFRfQkFTRSkgIiAkZmlsZXNpemVcMCIJXAorCSJmZHRhZGRyPTQwMDAwMFwwIgkJCQkJCVwKKwkiZmR0ZmlsZT0iIE1LX1NUUihDT05GSUdfRkRURklMRSkgIlwwIgkJCQlcCisJInJhbWRpc2thZGRyPTEwMDAwMDBcMCIJCQkJCQlcCisJInJhbWRpc2tmaWxlPSIgTUtfU1RSKENPTkZJR19SQU1ESVNLRklMRSkgIlwwIgkJCVwKKwkiY29uc29sZT10dHlTMFwwIgkJCQkJCVwKKwkic2V0Ym9vdGFyZ3M9c2V0ZW52IGJvb3RhcmdzICIJCQkJCVwKKwkJInJvb3Q9JHJvb3RkZXYgcncgY29uc29sZT0kY29uc29sZSwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzXDAiIFwKKwkic2V0aXBhcmdzPXNldGVudiBib290YXJncyBuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIglcCisJCSJpcD0kaXBhZGRyOiRzZXJ2ZXJpcDokZ2F0ZXdheWlwOiRuZXRtYXNrOiRob3N0bmFtZTokbmV0ZGV2Om9mZiAiIFwKKwkJInJvb3Q9JHJvb3RkZXYgcncgY29uc29sZT0kY29uc29sZSwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzXDAiCisKKyNkZWZpbmUgQ09ORklHX05GU0JPT1RDT01NQU5ECQkJCQkJXAorCSJzZXRlbnYgcm9vdGRldiAvZGV2L25mczsiCQkJCQlcCisJInJ1biBzZXRib290YXJnczsiCQkJCQkJXAorCSJydW4gc2V0aXBhcmdzOyIJCQkJCQlcCisJInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiCQkJCQlcCisJInRmdHAgJGZkdGFkZHIgJGZkdGZpbGU7IgkJCQkJXAorCSJib290bSAkbG9hZGFkZHIgLSAkZmR0YWRkciIKKworI2RlZmluZSBDT05GSUdfUkFNQk9PVENPTU1BTkQJCQkJCQlcCisJInNldGVudiByb290ZGV2IC9kZXYvcmFtOyIJCQkJCVwKKwkicnVuIHNldGJvb3RhcmdzOyIJCQkJCQlcCisJInRmdHAgJHJhbWRpc2thZGRyICRyYW1kaXNrZmlsZTsiCQkJCVwKKwkidGZ0cCAkbG9hZGFkZHIgJGJvb3RmaWxlOyIJCQkJCVwKKwkidGZ0cCAkZmR0YWRkciAkZmR0ZmlsZTsiCQkJCQlcCisJImJvb3RtICRsb2FkYWRkciAkcmFtZGlza2FkZHIgJGZkdGFkZHIiCisKKyN1bmRlZiBNS19TVFIKKyN1bmRlZiBYTUtfU1RSCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODMyWEVNRFMuaCBiL2luY2x1ZGUvY29uZmlncy9NUEM4MzJYRU1EUy5oCmluZGV4IGNlY2IyMjUuLmY2MmNhMmM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODMyWEVNRFMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODMyWEVNRFMuaApAQCAtNDIzLDQxICs0MjMsMzMgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKLSNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKwogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0FTS0VOViBcCi0JCQkJfCBDRkdfQ01EX1BDSSBcCi0JCQkJfCBDRkdfQ01EX0kyQykgXAotCQkJCSYgXAotCQkJCX4oQ0ZHX0NNRF9FTlYgXAotCQkJCXwgQ0ZHX0NNRF9MT0FEUykpCi0jZWxzZQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfQVNLRU5WIFwKLQkJCQl8IENGR19DTURfSTJDKSBcCi0JCQkJJiBcCi0JCQkJfihDRkdfQ01EX0VOViBcCi0JCQkJfCBDRkdfQ01EX0xPQURTKSkKLSNlbmRpZgotI2Vsc2UKLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUENJIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0FTS0VOViBcCi0JCQkJfCBDRkdfQ01EX0kyQykKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0FTS0VOViBcCi0JCQkJfCBDRkdfQ01EX0kyQyAgKQotI2VuZGlmCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgorICAgICN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjZW5kaWYKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC00NjgsNyArNDYwLDcgQEAKICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAJI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNDk4LDcgKzQ5MCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKQEAgLTU3NSw3ICs1NjcsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIG9mIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4MzQ5RU1EUy5oIGIvaW5jbHVkZS9jb25maWdzL01QQzgzNDlFTURTLmgKaW5kZXggMjBjNmQ1YS4uMTU2N2ZjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzgzNDlFTURTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzgzNDlFTURTLmgKQEAgLTQ3NSw0NCArNDc1LDM1IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCi0jaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJIHwgQ0ZHX0NNRF9QQ0kJCVwKLQkJCQkgfCBDRkdfQ01EX0kyQyAgICAgICAgICBcCi0JCQkJIHwgQ0ZHX0NNRF9EQVRFKQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVgkJXAotCQkJCSAgfCBDRkdfQ01EX0xPQURTKSkKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJIHwgQ0ZHX0NNRF9JMkMJCVwKLQkJCQkgfCBDRkdfQ01EX0RBVEUpCVwKLQkJCQkmCQkJXAotCQkJCSB+KENGR19DTURfRU5WCQlcCi0JCQkJICB8IENGR19DTURfTE9BRFMpKQotI2VuZGlmCi0jZWxzZQotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwJCVwKLQkJCQl8IENGR19DTURfUENJCQlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfSTJDCQlcCi0JCQkJfCBDRkdfQ01EX0RBVEUJCVwKLQkJCQkpCi0jZWxzZQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0kyQyAgICAgICAJXAotCQkJCXwgQ0ZHX0NNRF9NSUkgICAgICAgCVwKLQkJCQl8IENGR19DTURfREFURQkJXAotCQkJCSkKLSNlbmRpZgorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9FTlYKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI2VuZGlmCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTUyMyw3ICs1MTQsNyBAQAogI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCSNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKIAkjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNTQ0LDcgKzUzNSw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKQEAgLTY5NSw3ICs2ODYsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIG9mIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4MzQ5SVRYLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODM0OUlUWC5oCmluZGV4IDgzNDkzNGQuLjQ0NjQ5ZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NUEM4MzQ5SVRYLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzgzNDlJVFguaApAQCAtMjg5LDYgKzI4OSw3IEBACiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRSAgXAogCXszMDAsIDYwMCwgMTIwMCwgMjQwMCwgNDgwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLCAxMTUyMDB9CiAKKyNkZWZpbmUgQ09ORklHX0NPTlNPTEUJCXR0eVMwCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKICNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMQkoQ0ZHX0lNTVIgKyAweDQ1MDApCkBAIC0zNzIsNyArMzczLDcgQEAKIAogI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCiAjZGVmaW5lIENPTkZJR19NSUkKLSNkZWZpbmUgQ09ORklHX1BIWV9HSUdFCQkvKiBJbiBjYXNlIENGR19DTURfTUlJIGlzIHNwZWNpZmllZCAqLworI2RlZmluZSBDT05GSUdfUEhZX0dJR0UJCS8qIEluIGNhc2UgQ09ORklHX0NNRF9NSUkgaXMgc3BlY2lmaWVkICovCiAKICNkZWZpbmUgQ09ORklHX1RTRUMxCiAKQEAgLTQwOCw2ICs0MDksNyBAQAogICAjZGVmaW5lIENGR19FTlZfU0laRQkJMHgyMDAwCiAjZWxzZQogICAjZGVmaW5lIENGR19OT19GTEFTSAkJLyogRmxhc2ggaXMgbm90IHVzYWJsZSBub3cgKi8KKyAgI3VuZGVmICBDRkdfRkxBU0hfQ0ZJX0RSSVZFUgogICAjZGVmaW5lIENGR19FTlZfSVNfTk9XSEVSRQkvKiBTdG9yZSBFTlYgaW4gbWVtb3J5IG9ubHkgKi8KICAgI2RlZmluZSBDRkdfRU5WX0FERFIJCShDRkdfTU9OSVRPUl9CQVNFIC0gMHgxMDAwKQogICAjZGVmaW5lIENGR19FTlZfU0laRQkJMHgyMDAwCkBAIC00MTYsNDAgKzQxOCw0MSBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCi0vKiBDT05GSUdfQ09NTUFORFMgKi8KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KIAogI2lmZGVmIENPTkZJR19DT01QQUNUX0ZMQVNICi0jZGVmaW5lIENPTkZJR19DT01NQU5EU19DRgkoQ0ZHX0NNRF9JREUgfCBDRkdfQ01EX0ZBVCkKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EU19DRgkwCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0lERQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9GQVQKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBDT05GSUdfQ09NTUFORFNfUENJCUNGR19DTURfUENJCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFNfUENJCTAKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19IQVJEX0kyQwotI2RlZmluZSBDT05GSUdfQ09NTUFORFNfSTJDCUNGR19DTURfSTJDCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFNfSTJDCTAKKyAgICAjZGVmaW5lIENPTkZJR19DTURfSTJDCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQlDT05GSUdfQ09NTUFORFNfQ0YJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNPTkZJR19DT01NQU5EU19JMkMJfCBcCi0JCQkJQ09ORklHX0NPTU1BTkRTX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCUNGR19DTURfSVJRKQotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKiBXYXRjaGRvZyAqLwotCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCiAvKgpAQCAtNDY5LDcgKzQ3Miw3IEBACiAjZGVmaW5lIENGR19QUk9NUFQJIk1QQzgzNDlFLW1JVFgtR1A+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICAgICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNDkyLDcgKzQ5NSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC02MTcsNyArNjIwLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCBvZiBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCkBAIC02NzAsOSArNjczLDEwIEBACiAJIiBpcD0iIE1LX1NUUihDT05GSUdfSVBBRERSKSAiOiIgTUtfU1RSKENPTkZJR19TRVJWRVJJUCkgIjoiIAlcCiAJCU1LX1NUUihDT05GSUdfR0FURVdBWUlQKSAiOiIgTUtfU1RSKENPTkZJR19ORVRNQVNLKSAiOiIgXAogCQlNS19TVFIoQ09ORklHX0hPU1ROQU1FKSAiOiIgTUtfU1RSKENPTkZJR19ORVRERVYpICI6b2ZmIiBcCi0JIiBjb25zb2xlPXR0eVMwLCIgTUtfU1RSKENPTkZJR19CQVVEUkFURSkKKwkiIGNvbnNvbGU9IiBNS19TVFIoQ09ORklHX0NPTlNPTEUpICIsIiBNS19TVFIoQ09ORklHX0JBVURSQVRFKQogCiAjZGVmaW5lIENPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MgXAorCSJjb25zb2xlPSIgTUtfU1RSKENPTkZJR19DT05TT0xFKSAiXDAiIAkJCQlcCiAJIm5ldGRldj0iIE1LX1NUUihDT05GSUdfTkVUREVWKSAiXDAiIAkJCQlcCiAJInVib290PSIgTUtfU1RSKENPTkZJR19VQk9PVFBBVEgpICJcMCIgCQkJCVwKIAkidGZ0cGZsYXNoPXRmdHBib290ICRsb2FkYWRkciAkdWJvb3Q7ICIgCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01QQzgzNjBFTURTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODM2MEVNRFMuaAppbmRleCA3OTkzN2RjLi40YjMyYTE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODM2MEVNRFMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODM2MEVNRFMuaApAQCAtNDU3LDQxICs0NTcsMzMgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKLSNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKwogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUJIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0FTS0VOViBcCi0JCQkJfCBDRkdfQ01EX1BDSSBcCi0JCQkJfCBDRkdfQ01EX0kyQykgXAotCQkJCSYgXAotCQkJCX4oQ0ZHX0NNRF9FTlYgXAotCQkJCXwgQ0ZHX0NNRF9MT0FEUykpCi0jZWxzZQotI2RlZmluZQkgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfQVNLRU5WIFwKLQkJCQl8IENGR19DTURfSTJDKSBcCi0JCQkJJiBcCi0JCQkJfihDRkdfQ01EX0VOViBcCi0JCQkJfCBDRkdfQ01EX0xPQURTKSkKLSNlbmRpZgotI2Vsc2UKLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lCSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUENJIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0FTS0VOViBcCi0JCQkJfCBDRkdfQ01EX0kyQykKLSNlbHNlCi0jZGVmaW5lCSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0FTS0VOViBcCi0JCQkJfCBDRkdfQ01EX0kyQyAgKQotI2VuZGlmCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgorICAgICN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjZW5kaWYKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC01MDIsNyArNDk0LDcgQEAKICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkJMHgyMDAwMDAwIC8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAJI2RlZmluZSBDRkdfQ0JTSVpFCTI1NiAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNTMyLDcgKzUyNCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUgLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKQEAgLTYxMCw3ICs2MDIsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEgLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyIC8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIG9mIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTQwQURTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0MEFEUy5oCmluZGV4IDkxNzZiZTMuLjVhN2M4NzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTQwQURTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NDBBRFMuaApAQCAtNDA3LDM3ICs0MDcsMzMgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKLSNpZiBkZWZpbmVkKENGR19SQU1CT09UKQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMCVwKLQkJCQkgfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQkgfCBDRkdfQ01EX1BDSQkJXAotCQkJCSB8IENGR19DTURfSTJDKQkJXAotCQkJCSYJCQlcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYJCVwKLQkJCQkgIHwgQ0ZHX0NNRF9MT0FEUykpCi0gICNlbHNlCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwJXAotCQkJCSB8IENGR19DTURfUElORwkJXAotCQkJCSB8IENGR19DTURfSTJDKQkJXAotCQkJCSYJCQlcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYJCVwKLQkJCQkgIHwgQ0ZHX0NNRF9MT0FEUykpCi0gICNlbmRpZgotI2Vsc2UKLSAgI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX1BDSQkJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0kyQykKLSAgI2Vsc2UKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfSTJDKQotICAjZW5kaWYKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC00NDgsNyArNDQ0LDcgQEAKICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDIwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTQ2OSw3ICs0NjUsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCkBAIC00ODEsNyArNDc3LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCkBAIC01MjAsNyArNTE2LDcgQEAKICNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkgICAgICAgIFwKICAgICJuZXRkZXY9ZXRoMFwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICJjb25zb2xlZGV2PXR0eVMwXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJyYW1kaXNrYWRkcj02MDAwMDBcMCIJCQkJCQlcCisgICAicmFtZGlza2FkZHI9MTAwMDAwMFwwIgkJCQkJCVwKICAgICJyYW1kaXNrZmlsZT15b3VyLnJhbWRpc2sudS1ib290XDAiCQkJCQlcCiAgICAiZmR0YWRkcj00MDAwMDBcMCIJCQkJCQkJXAogICAgImZkdGZpbGU9eW91ci5mZHQuZHRiXDAiCkBAIC01NDAsNyArNTM2LDcgQEAKICAgICJ0ZnRwICRyYW1kaXNrYWRkciAkcmFtZGlza2ZpbGU7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICJ0ZnRwICRsb2FkYWRkciAkYm9vdGZpbGU7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICJ0ZnRwICRmZHRhZGRyICRmZHRmaWxlOyIJCQkJCQlcCi0gICAiYm9vdG0gJGxvYWRhZGRyICRyYW1kaXNrYWRkciIKKyAgICJib290bSAkbG9hZGFkZHIgJHJhbWRpc2thZGRyICRmZHRhZGRyIgogCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORCAgQ09ORklHX05GU0JPT1RDT01NQU5ECiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTQwRVZBTC5oIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NDBFVkFMLmgKaW5kZXggYjU2OGNiNC4uMGNlMjVjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzg1NDBFVkFMLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NDBFVkFMLmgKQEAgLTI1OSwyNiArMjU5LDMzIEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZQkqLwogCi0jaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkgfHwgZGVmaW5lZChDT05GSUdfUkFNX0FTX0ZMQVNIKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9QQ0kgfCBDRkdfQ01EX0kyQyApICYgXAotCQkJCSB+KENGR19DTURfRU5WIHwgQ0ZHX0NNRF9MT0FEUyApKQotI2Vsc2UKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfSTJDICkgJiBcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYgfCBDRkdfQ01EX0xPQURTICkpCi0jZW5kaWYKLSNlbHNlCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJIFwKLQkJCQl8IENGR19DTURfUElORyB8IENGR19DTURfSTJDICkKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9JMkMgKQotI2VuZGlmCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpZiBkZWZpbmVkKENGR19SQU1CT09UKSB8fCBkZWZpbmVkKENPTkZJR19SQU1fQVNfRkxBU0gpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMjg4LDcgKzI5NSw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfTE9BRF9BRERSICAgMHgyMDAwMDAwICAgICAgIC8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCiAjZGVmaW5lIENGR19QUk9NUFQJIk1QQzg1NDBFVkFMPT4gIi8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTMwOCw3ICszMTUsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApAQCAtMzIwLDcgKzMyNyw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTQxQ0RTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0MUNEUy5oCmluZGV4IGUwNDdlMjUuLjIzMmYxNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTQxQ0RTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NDFDRFMuaApAQCAtMzUwLDYgKzM1MCwxMyBAQAogI2RlZmluZSBDRkdfUENJMl9JT19QSFlTCTB4ZTIxMDAwMDAKICNkZWZpbmUgQ0ZHX1BDSTJfSU9fU0laRQkweDEwMDAwMAkvKiAxTSAqLwogCisjaWZkZWYgQ09ORklHX0xFR0FDWQorI2RlZmluZSBCUklER0VfSUQgMTcKKyNkZWZpbmUgVklBX0lEIDIKKyNlbHNlCisjZGVmaW5lIEJSSURHRV9JRCAyOAorI2RlZmluZSBWSUFfSUQgNAorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCiAKQEAgLTQwMSwxOSArNDA4LDI4IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BDSSBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgXAotCQkJCXwgQ0ZHX0NNRF9NSUkpCi0jZWxzZQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgXAotCQkJCXwgQ0ZHX0NNRF9NSUkpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTQyMyw3ICs0MzksNyBAQAogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCkBAIC00NDMsNyArNDU5LDcgQEAKIC8qIENhY2hlIENvbmZpZ3VyYXRpb24gKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCkBAIC00NTUsNyArNDcxLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0NERTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0NERTLmgKaW5kZXggN2NkNjJlOS4uMzI5MzRlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzg1NDREUy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NUEM4NTQ0RFMuaApAQCAtMzQsMTQgKzM0LDE0IEBACiAjZGVmaW5lIENPTkZJR19NUEM4NTQ0CQkxCiAjZGVmaW5lIENPTkZJR19NUEM4NTQ0RFMJMQogCi0jdW5kZWYgQ09ORklHX1BDSQkJCS8qIEVuYWJsZSBQQ0kvUENJRSAqLwotI3VuZGVmIENPTkZJR19QQ0kxCQkJLyogUENJIGNvbnRyb2xsZXIgMSAqLwotI3VuZGVmIENPTkZJR19QQ0lFMQkJCS8qIFBDSUUgY29udHJvbGVyIDEgKHNsb3QgMSkgKi8KLSN1bmRlZiBDT05GSUdfUENJRTIJCQkvKiBQQ0lFIGNvbnRyb2xlciAyIChzbG90IDIpICovCi0jdW5kZWYgQ09ORklHX1BDSUUzCQkJLyogUENJRSBjb250cm9sZXIgMyAoVUxJIGJyaWRnZSkgKi8KLSN1bmRlZiBDT05GSUdfRlNMX1BDSV9JTklUCQkvKiBVc2UgY29tbW9uIEZTTCBpbml0IGNvZGUgKi8KKyNkZWZpbmUgQ09ORklHX1BDSQkJMQkvKiBFbmFibGUgUENJL1BDSUUgKi8KKyNkZWZpbmUgQ09ORklHX1BDSTEJCTEJLyogUENJIGNvbnRyb2xsZXIgMSAqLworI2RlZmluZSBDT05GSUdfUENJRTEJCTEJLyogUENJRSBjb250cm9sZXIgMSAoc2xvdCAxKSAqLworI2RlZmluZSBDT05GSUdfUENJRTIJCTEJLyogUENJRSBjb250cm9sZXIgMiAoc2xvdCAyKSAqLworI2RlZmluZSBDT05GSUdfUENJRTMJCTEJLyogUENJRSBjb250cm9sZXIgMyAoVUxJIGJyaWRnZSkgKi8KKyNkZWZpbmUgQ09ORklHX0ZTTF9QQ0lfSU5JVAkxCS8qIFVzZSBjb21tb24gRlNMIGluaXQgY29kZSAqLwogCi0jZGVmaW5lIENPTkZJR19UU0VDX0VORVQgCQkvKiB0c2VjIGV0aGVybmV0IHN1cHBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX1RTRUNfRU5FVAkJLyogdHNlYyBldGhlcm5ldCBzdXBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCiAjZGVmaW5lIENPTkZJR19TUERfRUVQUk9NCQkvKiBVc2UgU1BEIEVFUFJPTSBmb3IgRERSIHNldHVwICovCiAjdW5kZWYgQ09ORklHX0REUl9ETEwKQEAgLTUyLDYgKzUyLDcgQEAKICNkZWZpbmUgQ09ORklHX01FTV9JTklUX1ZBTFVFCQkweERlYWRCZWVmCiAKICNkZWZpbmUgQ09ORklHX0REUl9FQ0NfQ01ECisjZGVmaW5lIENPTkZJR19JTlRFUlJVUFRTCQkvKiBlbmFibGUgcGNpLCBzcmlvLCBkZHIgaW50ZXJydXB0cyAqLwogCiAvKgogICogV2hlbiBpbml0aWFsaXppbmcgZmxhc2gsIGlmIHdlIGNhbm5vdCBmaW5kIHRoZSBtYW51ZmFjdHVyZXIgSUQsCkBAIC03MCw3ICs3MSw3IEBACiAvKgogICogVGhlc2UgY2FuIGJlIHRvZ2dsZWQgZm9yIHBlcmZvcm1hbmNlIGFuYWx5c2lzLCBvdGhlcndpc2UgdXNlIGRlZmF1bHQuCiAgKi8KLSNkZWZpbmUgQ09ORklHX0wyX0NBQ0hFCQkJLyogdG9nZ2xlIEwyIGNhY2hlIAkqLworI2RlZmluZSBDT05GSUdfTDJfQ0FDSEUJCQkvKiB0b2dnbGUgTDIgY2FjaGUgKi8KICNkZWZpbmUgQ09ORklHX0JUQgkJCS8qIHRvZ2dsZSBicmFuY2ggcHJlZGl0aW9uICovCiAjZGVmaW5lIENPTkZJR19BRERSX1NUUkVBTUlORwkJLyogdG9nZ2xlIGFkZHIgc3RyZWFtaW5nICovCiAjZGVmaW5lIENPTkZJR19DTEVBUl9MQVcwCQkvKiBDbGVhciBMQVcwIGluIGNwdV9pbml0X3IgKi8KQEAgLTg2LDEzICs4NywxMyBAQAogI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDAwMjAwMDAwCS8qIG1lbXRlc3Qgd29ya3Mgb24gKi8KICNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECQkweDAwNDAwMDAwCiAjZGVmaW5lIENGR19BTFRfTUVNVEVTVAotI2RlZmluZSBDT05GSUdfUEFOSUNfSEFORyAJLyogZG8gbm90IHJlc2V0IGJvYXJkIG9uIHBhbmljICovCisjZGVmaW5lIENPTkZJR19QQU5JQ19IQU5HCS8qIGRvIG5vdCByZXNldCBib2FyZCBvbiBwYW5pYyAqLwogCiAvKgogICogQmFzZSBhZGRyZXNzZXMgLS0gTm90ZSB0aGVzZSBhcmUgZWZmZWN0aXZlIGFkZHJlc3NlcyB3aGVyZSB0aGUKICAqIGFjdHVhbCByZXNvdXJjZXMgZ2V0IG1hcHBlZCAobm90IHBoeXNpY2FsIGFkZHJlc3NlcykKICAqLwotI2RlZmluZSBDRkdfQ0NTUkJBUl9ERUZBVUxUIAkweGZmNzAwMDAwCS8qIENDU1JCQVIgRGVmYXVsdCAqLworI2RlZmluZSBDRkdfQ0NTUkJBUl9ERUZBVUxUCTB4ZmY3MDAwMDAJLyogQ0NTUkJBUiBEZWZhdWx0ICovCiAjZGVmaW5lIENGR19DQ1NSQkFSCQkweGUwMDAwMDAwCS8qIHJlbG9jYXRlZCBDQ1NSQkFSICovCiAjZGVmaW5lIENGR19JTU1SCQlDRkdfQ0NTUkJBUgkvKiBQUUlJIHVzZXMgQ0ZHX0lNTVIgKi8KIApAQCAtMzQ0LDcgKzM0NSw3IEBACiAjZGVmaW5lIENPTkZJR19TQVRBX1VMSTUyODgKICNkZWZpbmUgQ0ZHX1NDU0lfTUFYX1NDU0lfSUQJNAogI2RlZmluZSBDRkdfU0NTSV9NQVhfTFVOCTEKLSNkZWZpbmUgQ0ZHX1NDU0lfTUFYX0RFVklDRSAJKENGR19TQ1NJX01BWF9TQ1NJX0lEICogQ0ZHX1NDU0lfTUFYX0xVTikKKyNkZWZpbmUgQ0ZHX1NDU0lfTUFYX0RFVklDRQkoQ0ZHX1NDU0lfTUFYX1NDU0lfSUQgKiBDRkdfU0NTSV9NQVhfTFVOKQogI2RlZmluZSBDRkdfU0NTSV9NQVhERVZJQ0UJQ0ZHX1NDU0lfTUFYX0RFVklDRQogI2VuZGlmIC8qIFNDU0NJICovCiAKQEAgLTM1NCw3ICszNTUsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKIAogI2lmbmRlZiBDT05GSUdfTkVUX01VTFRJCi0jZGVmaW5lIENPTkZJR19ORVRfTVVMVEkgCTEKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQkxCiAjZW5kaWYKIAogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudCAqLwpAQCAtMzY1LDYgKzM2NiwxMCBAQAogI2RlZmluZSBDT05GSUdfVFNFQzNfTkFNRQkiZVRTRUMzIgogI3VuZGVmIENPTkZJR19NUEM4NVhYX0ZFQwogCisjZGVmaW5lIENPTkZJR19UU0VDX1RCSQkJMQkvKiBlbmFibGUgaW50ZXJuYWwgVEJJIHBoeSAqLworI2RlZmluZSBDT05GSUdfU0dNSUlfUklTRVIKKyNkZWZpbmUgVFNFQzFfU0dNSUlfUEhZX0FERFJfT0ZGU0VUCTB4MWMJLyogc2dtaWkgcGh5IGJhc2UgKi8KKwogI2RlZmluZSBUU0VDMV9QSFlfQUREUgkJMAogI2RlZmluZSBUU0VDM19QSFlfQUREUgkJMQogCkBAIC0zNzQsNyArMzc5LDYgQEAKICNkZWZpbmUgQ09ORklHX0VUSFBSSU1FCQkiZVRTRUMxIgogCiAjZGVmaW5lIENPTkZJR19QSFlfR0lHRQkJMQkvKiBJbmNsdWRlIEdiRSBzcGVlZC9kdXBsZXggZGV0ZWN0aW9uICovCi0KICNlbmRpZgkvKiBDT05GSUdfVFNFQ19FTkVUICovCiAKIC8qCkBAIC0zOTIsMjEgKzM5NiwzMiBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UgKi8KIAorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKwogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUJQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BDSSBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgXAotCQkJCXwgQ0ZHX0NNRF9NSUkgXAotCQkJCXwgQ0ZHX0NNRF9CRURCVUcgXAotCQkJCXwgQ0ZHX0NNRF9ORVQpCi0jZWxzZQotI2RlZmluZQlDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0kyQyBcCi0JCQkJfCBDRkdfQ01EX01JSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworICAgICNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyAgICAjZGVmaW5lIENPTkZJR19DTURfU0NTSQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCiAjZW5kaWYKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQgKi8KIApAQCAtNDE2LDcgKzQzMSw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSovCiAjZGVmaW5lIENGR19MT0FEX0FERFIJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTQzMSwxMiArNDQ2LDEyIEBACiAgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcwogICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgogICovCi0jZGVmaW5lIENGR19CT09UTUFQU1oJKDggPDwgMjApIAkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4Ki8KKyNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCovCiAKIC8qIENhY2hlIENvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCTMyNzY4CisjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKQEAgLTQ0OCw3ICs0NjMsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKQEAgLTQ3Miw3ICs0ODcsOCBAQAogCiAjZGVmaW5lIENPTkZJR19IT1NUTkFNRQk4NTQ0ZHNfdW5rbm93bgogI2RlZmluZSBDT05GSUdfUk9PVFBBVEgJL25mcy9tcGM4NXh4Ci0jZGVmaW5lIENPTkZJR19CT09URklMRQk4NTQ0ZHNfdG10L3VJbWFnZS51Ym9vdAorI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJODU0NGRzL3VJbWFnZS51Ym9vdAorI2RlZmluZSBDT05GSUdfVUJPT1RQQVRICTg1NDRkcy91LWJvb3QuYmluCS8qIFRGVFAgc2VydmVyICovCiAKICNkZWZpbmUgQ09ORklHX1NFUlZFUklQCTE5Mi4xNjguMC4xCiAjZGVmaW5lIENPTkZJR19HQVRFV0FZSVAgMTkyLjE2OC4wLjEKQEAgLTQ4MSw3ICs0OTcsNyBAQAogI2RlZmluZSBDT05GSUdfTE9BREFERFIJMTAwMDAwMAkvKmRlZmF1bHQgbG9jYXRpb24gZm9yIHRmdHAgYW5kIGJvb3RtKi8KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZIDEwCS8qIC0xIGRpc2FibGVzIGF1dG8tYm9vdCAqLwotI3VuZGVmCUNPTkZJR19CT09UQVJHUwkvKiB0aGUgYm9vdCBjb21tYW5kIHdpbGwgc2V0IGJvb3RhcmdzKi8KKyN1bmRlZglDT05GSUdfQk9PVEFSR1MJCS8qIHRoZSBib290IGNvbW1hbmQgd2lsbCBzZXQgYm9vdGFyZ3MqLwogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkxMTUyMDAKIApAQCAtNDg5LDEwICs1MDUsNyBAQAogI2RlZmluZSBQQ0lFX0VOViBcCiAgInBjaWVyZWc9bWQgJHthfTAwMCA2OyBtZCAke2F9MDIwIDQ7IG1kICR7YX1iZjggMjsgZWNobyBvO21kICR7YX1jMDAgMjU7IiBcCiAJImVjaG8gaTsgbWQgJHthfWRhMCAxNTsgZWNobyBlO21kICR7YX1lMDAgZTsgZWNobyBkOyBtZCAke2F9ZjAwIGNcMCIgXAotICJwY2llMXJlZ3M9c2V0ZW52IGEgZTAwMGE7IHJ1biBwY2llcmVnXDAiCVwKLSAicGNpZTJyZWdzPXNldGVudiBhIGUwMDA5OyBydW4gcGNpZXJlZ1wwIglcCi0gInBjaWUzcmVncz1zZXRlbnYgYSBlMDAwYjsgcnVuIHBjaWVyZWdcMCIJXAotICJwY2llZXJyPW1kICR7YX0wMjAgMTsgbWQgJHthfWUwMDsiCQlcCisgInBjaWVlcnI9bWQgJHthfTAyMCAxOyBtZCAke2F9ZTAwIGU7IgkJXAogCSJwY2kgZC5iICRiLjAgNyAxOyBwY2kgZC53ICRiLjAgMWUgMTsiCVwKIAkicGNpIGQudyAkYi4wIDU2IDE7IgkJCVwKIAkicGNpIGQgJGIuMCAxMDQgMTtwY2kgZCAkYi4wIDExMCAxO3BjaSBkICRiLjAgMTMwIDFcMCIgXApAQCAtNTAxLDEyICs1MTQsMTggQEAKIAkicGNpIHcgJGIuMCAxMDQgZmZmZmZmZmY7IHBjaSB3ICRiLjAgMTEwIGZmZmZmZmZmOyIgXAogCSJwY2kgdyAkYi4wIDEzMCBmZmZmZmZmZlwwIiBcCiAgInBjaWVjZmc9cGNpIGQgJGIuMCAwIDIwOyBwY2kgZCAkYi4wIDEwMCBlOyBwY2kgZCAkYi4wIDQwMCA2OVwwIglcCi0gInBjaWUxZXJyPXNldGVudiBhIGUwMDBhOyBydW4gcGNpZWVyclwwIglcCi0gInBjaWUyZXJyPXNldGVudiBhIGUwMDA5OyBydW4gcGNpZWVyclwwIglcCi0gInBjaWUzZXJyPXNldGVudiBhIGUwMDBiOyBydW4gcGNpZWVyclwwIglcCi0gInBjaWUxZXJyYz1zZXRlbnYgYSBlMDAwYTsgcnVuIHBjaWVlcnJjXDAiCVwKLSAicGNpZTJlcnJjPXNldGVudiBhIGUwMDA5OyBydW4gcGNpZWVycmNcMCIJXAotICJwY2llM2VycmM9c2V0ZW52IGEgZTAwMGI7IHJ1biBwY2llZXJyY1wwIgorICJwY2llMXJlZ3M9c2V0ZW52IGEgZTAwMGE7IHJ1biBwY2llcmVnXDAiCVwKKyAicGNpZTJyZWdzPXNldGVudiBhIGUwMDA5OyBydW4gcGNpZXJlZ1wwIglcCisgInBjaWUzcmVncz1zZXRlbnYgYSBlMDAwYjsgcnVuIHBjaWVyZWdcMCIJXAorICJwY2llMWNmZz1zZXRlbnYgYiAzOyBydW4gcGNpZWNmZ1wwIiBcCisgInBjaWUyY2ZnPXNldGVudiBiIDU7IHJ1biBwY2llY2ZnXDAiIFwKKyAicGNpZTNjZmc9c2V0ZW52IGIgMDsgcnVuIHBjaWVjZmdcMCIgXAorICJwY2llMWVycj1zZXRlbnYgYSBlMDAwYTsgc2V0ZW52IGIgMzsgcnVuIHBjaWVlcnJcMCIJXAorICJwY2llMmVycj1zZXRlbnYgYSBlMDAwOTsgc2V0ZW52IGIgNTsgcnVuIHBjaWVlcnJcMCIJXAorICJwY2llM2Vycj1zZXRlbnYgYSBlMDAwYjsgc2V0ZW52IGIgMDsgcnVuIHBjaWVlcnJcMCIJXAorICJwY2llMWVycmM9c2V0ZW52IGEgZTAwMGE7IHNldGVudiBiIDM7IHJ1biBwY2llZXJyY1wwIglcCisgInBjaWUyZXJyYz1zZXRlbnYgYSBlMDAwOTsgc2V0ZW52IGIgNTsgcnVuIHBjaWVlcnJjXDAiCVwKKyAicGNpZTNlcnJjPXNldGVudiBhIGUwMDBiOyBzZXRlbnYgYiAwOyBydW4gcGNpZWVycmNcMCIKICNlbHNlCiAjZGVmaW5lCVBDSUVfRU5WICIiCiAjZW5kaWYKQEAgLTUxNCwxNCArNTMzLDE0IEBACiAjaWYgZGVmaW5lZChDT05GSUdfUENJMSkKICNkZWZpbmUgUENJX0VOViBcCiAgInBjaXJlZz1tZCAke2F9MDAwIDM7IGVjaG8gbzttZCAke2F9YzAwIDI1OyBlY2hvIGk7IG1kICR7YX1kYTAgMTU7IiBcCi0JImVjaG8gZTttZCAke2F9ZTAwIDlcMCIgCQlcCisJImVjaG8gZTttZCAke2F9ZTAwIDlcMCIJCQlcCiAgInBjaTFyZWdzPXNldGVudiBhIGUwMDA4OyBydW4gcGNpcmVnXDAiCVwKICAicGNpZXJyPW1kICR7YX1lMDAgODsgcGNpIGQuYiAkYi4wIDcgMTsgcGNpIGQudyAkYi4wIDFlIDE7IiBcCiAJInBjaSBkLncgJGIuMCA1NiAxXDAiCQkJXAotICJwY2llcnJjPW13ICR7YX1lMDAgZmZmZmZmZmY7IHBjaSB3LmIgJGIuMCA3IGZmOyBwY2kgdy53ICRiLjAgMWUgZmZmZjsiIFwKLQkicGNpIHcudyAkYi4wIDU2IGZmZmZcMCIJCVwKLSAicGNpMWVycj1zZXRlbnYgYSBlMDAwODsgcnVuIHBjaWVyclwwIgkJXAotICJwY2kxZXJyYz1zZXRlbnYgYSBlMDAwODsgcnVuIHBjaWVycmNcMCIKKyAicGNpZXJyYz1tdyAke2F9ZTAwIGZmZmZmZmZmOyBtdyAke2F9ZTBjIDA7IHBjaSB3LmIgJGIuMCA3IGZmOyIgXAorCSJwY2kgdy53ICRiLjAgMWUgZmZmZjsgcGNpIHcudyAkYi4wIDU2IGZmZmZcMCIJCVwKKyAicGNpMWVycj1zZXRlbnYgYSBlMDAwODsgc2V0ZW52IGIgNzsgcnVuIHBjaWVyclwwIgkJXAorICJwY2kxZXJyYz1zZXRlbnYgYSBlMDAwODsgc2V0ZW52IGIgNzsgcnVuIHBjaWVycmNcMCIKICNlbHNlCiAjZGVmaW5lCVBDSV9FTlYgIiIKICNlbmRpZgpAQCAtNTQxLDI1ICs1NjAsMzkgQEAKICNkZWZpbmUgRU5FVF9FTlYgIiIKICNlbmRpZgogCi0jZGVmaW5lCUNPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MJCVwKLSAibmV0ZGV2PWV0aDBcMCIJCQkJXAorI2RlZmluZQlDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTCQkJCVwKKyAibmV0ZGV2PWV0aDBcMCIJCQkJCQlcCisgInVib290PSIgTUtfU1RSKENPTkZJR19VQk9PVFBBVEgpICJcMCIJCQkJXAorICJ0ZnRwZmxhc2g9dGZ0cGJvb3QgJGxvYWRhZGRyICR1Ym9vdDsgIgkJCVwKKwkicHJvdGVjdCBvZmYgIiBNS19TVFIoVEVYVF9CQVNFKSAiICskZmlsZXNpemU7ICIJXAorCSJlcmFzZSAiIE1LX1NUUihURVhUX0JBU0UpICIgKyRmaWxlc2l6ZTsgIgkJXAorCSJjcC5iICRsb2FkYWRkciAiIE1LX1NUUihURVhUX0JBU0UpICIgJGZpbGVzaXplOyAiCVwKKwkicHJvdGVjdCBvbiAiIE1LX1NUUihURVhUX0JBU0UpICIgKyRmaWxlc2l6ZTsgIgkJXAorCSJjbXAuYiAkbG9hZGFkZHIgIiBNS19TVFIoVEVYVF9CQVNFKSAiICRmaWxlc2l6ZVwwIglcCiAgImNvbnNvbGVkZXY9dHR5UzBcMCIJCQkJXAogICJyYW1kaXNrYWRkcj0yMDAwMDAwXDAiCQkJXAotICJyYW1kaXNrZmlsZT04NTQ0ZHNfdG10L3JhbWRpc2sudWJvb3RcMCIJXAotICJmZHRhZGRyPTQwMDAwMFwwIgkJCQlcCi0gImZkdGZpbGU9ODU0NGRzX3RtdC9tcGM4NTQ0ZHMuZHRiXDAiCQlcCi0gImVvaT1tdyBlMDA0MDBiMCAwXDAiIAkJCQlcCi0gImlhY2s9bWQgZTAwNDAwYTAgMVwwIiAJCQlcCisgInJhbWRpc2tmaWxlPTg1NDRkcy9yYW1kaXNrLnVib290XDAiCQlcCisgImR0YmFkZHI9YzAwMDAwXDAiCQkJCVwKKyAiZHRiZmlsZT04NTQ0ZHMvbXBjODU0NGRzLmR0YlwwIgkJXAorICJiZGV2PXNkYTNcMCIJCQkJCVwKKyAiZW9pPW13IGUwMDQwMGIwIDBcMCIJCQkJXAorICJpYWNrPW1kIGUwMDQwMGEwIDFcMCIJCQkJXAogICJkZHJyZWc9bWQgJHthfTAwMCA4OyBtZCAke2F9MDgwIDg7bWQgJHthfTEwMCBkOyBtZCAke2F9MTQwIDQ7IG1kICR7YX1iZjAgNDsiIFwKIAkibWQgJHthfWUwMCAzOyBtZCAke2F9ZTIwIDM7IG1kICR7YX1lNDAgNzsgbWQgJHthfWYwMCA1XDAiIFwKLSAiZGRycmVncz1zZXRlbnYgYSBlMDAwMjsgcnVuIGRkcnJlZ1wwIiAJXAorICJkZHJyZWdzPXNldGVudiBhIGUwMDAyOyBydW4gZGRycmVnXDAiCQlcCiAgImd1cmVnPW1kICR7YX0wMDAgMmM7IG1kICR7YX0wYjAgMTsgbWQgJHthfTBjMCAxOyBtZCAke2F9YjIwIDM7IiBcCi0JIm1kICR7YX1lMDAgMTsgbWQgJHthfWU2MCAxOyBtZCAke2F9ZWYwIDE1XDAiIAlcCi0gImd1cmVncz1zZXRlbnYgYSBlMDBlMDsgcnVuIGd1cmVnXDAiIAkJXAorCSJtZCAke2F9ZTAwIDE7IG1kICR7YX1lNjAgMTsgbWQgJHthfWVmMCAxNVwwIglcCisgImd1cmVncz1zZXRlbnYgYSBlMDBlMDsgcnVuIGd1cmVnXDAiCQlcCiAgImVjbXJlZz1tZCAke2F9MDAwIDE7IG1kICR7YX0wMTAgMTsgbWQgJHthfWJmOCAyOyBtZCAke2F9ZTAwIDZcMCIgXAotICJlY21yZWdzPXNldGVudiBhIGUwMDAxOyBydW4gZWNtcmVnXDAiIAlcCi0gUENJRV9FTlYgCVwKLSBQQ0lfRU5WIAlcCisgImVjbXJlZ3M9c2V0ZW52IGEgZTAwMDE7IHJ1biBlY21yZWdcMCIJCVwKKyAibGF3cmVncz1tZCBlMDAwMGMwOCA0YlwwIiBcCisgImxiY3JlZ3M9bWQgZTAwMDUwMDAgMzZcMCIgXAorICJkbWEwcmVncz1tZCBlMDAyMTEwMCAxMlwwIiBcCisgImRtYTFyZWdzPW1kIGUwMDIxMTgwIDEyXDAiIFwKKyAiZG1hMnJlZ3M9bWQgZTAwMjEyMDAgMTJcMCIgXAorICJkbWEzcmVncz1tZCBlMDAyMTI4MCAxMlwwIiBcCisgUENJRV9FTlYJXAorIFBDSV9FTlYJXAogIEVORVRfRU5WCiAKIApAQCAtNTY5LDIzICs2MDIsMjMgQEAKICAiaXA9JGlwYWRkcjokc2VydmVyaXA6JGdhdGV3YXlpcDokbmV0bWFzazokaG9zdG5hbWU6JG5ldGRldjpvZmYgIiBcCiAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiCVwKICAidGZ0cCAkbG9hZGFkZHIgJGJvb3RmaWxlOyIJCVwKLSAidGZ0cCAkZmR0YWRkciAkZmR0ZmlsZTsiCQlcCi0gImJvb3RtICRsb2FkYWRkciAtICRmZHRhZGRyIgorICJ0ZnRwICRkdGJhZGRyICRkdGJmaWxlOyIJCVwKKyAiYm9vdG0gJGxvYWRhZGRyIC0gJGR0YmFkZHIiCiAKIAotI2RlZmluZSBDT05GSUdfUkFNQk9PVENPTU1BTkQgCQlcCisjZGVmaW5lIENPTkZJR19SQU1CT09UQ09NTUFORAkJXAogICJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSBydyAiCVwKICAiY29uc29sZT0kY29uc29sZWRldiwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzOyIJXAogICJ0ZnRwICRyYW1kaXNrYWRkciAkcmFtZGlza2ZpbGU7IglcCiAgInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiCQlcCi0gInRmdHAgJGZkdGFkZHIgJGZkdGZpbGU7IgkJXAotICJib290bSAkbG9hZGFkZHIgJHJhbWRpc2thZGRyICRmZHRhZGRyIgorICJ0ZnRwICRkdGJhZGRyICRkdGJmaWxlOyIJCVwKKyAiYm9vdG0gJGxvYWRhZGRyICRyYW1kaXNrYWRkciAkZHRiYWRkciIKIAotI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQgCQlcCi0gInNldGVudiBib290YXJncyByb290PS9kZXYvc2RhMyBydyAiCVwKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECQlcCisgInNldGVudiBib290YXJncyByb290PS9kZXYvJGJkZXYgcncgIglcCiAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiCVwKICAidGZ0cCAkbG9hZGFkZHIgJGJvb3RmaWxlOyIJCVwKLSAidGZ0cCAkZmR0YWRkciAkZmR0ZmlsZTsiCQlcCi0gImJvb3RtICRsb2FkYWRkciAtICRmZHRhZGRyIgorICJ0ZnRwICRkdGJhZGRyICRkdGJmaWxlOyIJCVwKKyAiYm9vdG0gJGxvYWRhZGRyIC0gJGR0YmFkZHIiCiAKICNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0OENEUy5oIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NDhDRFMuaAppbmRleCBhMGQyOTFlLi5jZGE5ZmQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0OENEUy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NUEM4NTQ4Q0RTLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisgKiBDb3B5cmlnaHQgMjAwNCwgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KICAqCiAgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogICogcHJvamVjdC4KQEAgLTExLDcgKzExLDcgQEAKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0zNiw4ICszNiwxNCBAQAogI2RlZmluZSBDT05GSUdfTVBDODU0OAkJMQkvKiBNUEM4NTQ4IHNwZWNpZmljICovCiAjZGVmaW5lIENPTkZJR19NUEM4NTQ4Q0RTCTEJLyogTVBDODU0OENEUyBib2FyZCBzcGVjaWZpYyAqLwogCi0jZGVmaW5lIENPTkZJR19QQ0kKLSNkZWZpbmUgQ09ORklHX1RTRUNfRU5FVCAJCS8qIHRzZWMgZXRoZXJuZXQgc3VwcG9ydCAqLworI2RlZmluZSBDT05GSUdfUENJCQkvKiBlbmFibGUgYW55IHBjaSB0eXBlIGRldmljZXMgKi8KKyNkZWZpbmUgQ09ORklHX1BDSTEJCS8qIFBDSSBjb250cm9sbGVyIDEgKi8KKyNkZWZpbmUgQ09ORklHX1BDSUUxCQkvKiBQQ0lFIGNvbnRyb2xlciAxIChzbG90IDEpICovCisjdW5kZWYgQ09ORklHX1JJTworI3VuZGVmIENPTkZJR19QQ0kyCisjZGVmaW5lIENPTkZJR19GU0xfUENJX0lOSVQJMQkvKiBVc2UgY29tbW9uIEZTTCBpbml0IGNvZGUgKi8KKworI2RlZmluZSBDT05GSUdfVFNFQ19FTkVUCQkvKiB0c2VjIGV0aGVybmV0IHN1cHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKICNkZWZpbmUgQ09ORklHX1NQRF9FRVBST00JCS8qIFVzZSBTUEQgRUVQUk9NIGZvciBERFIgc2V0dXAqLwogI2RlZmluZSBDT05GSUdfRERSX0RMTAkJCS8qIHBvc3NpYmxlIERMTCBmaXggbmVlZGVkICovCkBAIC00Niw2ICs1Miw3IEBACiAjZGVmaW5lIENPTkZJR19ERFJfRUNDCQkJLyogb25seSBmb3IgRUNDIEREUiBtb2R1bGUgKi8KICNkZWZpbmUgQ09ORklHX0VDQ19JTklUX1ZJQV9ERFJDT05UUk9MTEVSCS8qIEREUiBjb250cm9sbGVyIG9yIERNQT8gKi8KICNkZWZpbmUgQ09ORklHX01FTV9JTklUX1ZBTFVFCQkweERlYWRCZWVmCisjZGVmaW5lIENPTkZJR19JTlRFUlJVUFRTCQkvKiBlbmFibGUgcGNpLCBzcmlvLCBkZHIgaW50ZXJydXB0cyAqLwogCiAKIC8qCkBAIC02NSwxNiArNzIsMTYgQEAKIC8qCiAgKiBUaGVzZSBjYW4gYmUgdG9nZ2xlZCBmb3IgcGVyZm9ybWFuY2UgYW5hbHlzaXMsIG90aGVyd2lzZSB1c2UgZGVmYXVsdC4KICAqLwotI2RlZmluZSBDT05GSUdfTDJfQ0FDSEUJCSAgICAJICAgIC8qIHRvZ2dsZSBMMiBjYWNoZSAJKi8KLSNkZWZpbmUgQ09ORklHX0JUQgkJCSAgICAvKiB0b2dnbGUgYnJhbmNoIHByZWRpdGlvbiAqLwotI2RlZmluZSBDT05GSUdfQUREUl9TVFJFQU1JTkcJCSAgICAvKiB0b2dnbGUgYWRkciBzdHJlYW1pbmcgICAqLworI2RlZmluZSBDT05GSUdfTDJfQ0FDSEUJCQkvKiB0b2dnbGUgTDIgY2FjaGUgKi8KKyNkZWZpbmUgQ09ORklHX0JUQgkJCS8qIHRvZ2dsZSBicmFuY2ggcHJlZGl0aW9uICovCisjZGVmaW5lIENPTkZJR19BRERSX1NUUkVBTUlORwkJLyogdG9nZ2xlIGFkZHIgc3RyZWFtaW5nICovCisjZGVmaW5lIENPTkZJR19DTEVBUl9MQVcwCQkvKiBDbGVhciBMQVcwIGluIGNwdV9pbml0X3IgKi8KIAogLyoKICAqIE9ubHkgcG9zc2libGUgb24gRTUwMCBWZXJzaW9uIDIgb3IgbmV3ZXIgY29yZXMuCiAgKi8KICNkZWZpbmUgQ09ORklHX0VOQUJMRV8zNkJJVF9QSFlTCTEKIAotCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YJMQkvKiBDYWxsIGJvYXJkX3ByZV9pbml0ICovCiAKICN1bmRlZglDRkdfRFJBTV9URVNUCQkJLyogbWVtb3J5IHRlc3QsIHRha2VzIHRpbWUgKi8KQEAgLTg1LDEwICs5MiwxNCBAQAogICogQmFzZSBhZGRyZXNzZXMgLS0gTm90ZSB0aGVzZSBhcmUgZWZmZWN0aXZlIGFkZHJlc3NlcyB3aGVyZSB0aGUKICAqIGFjdHVhbCByZXNvdXJjZXMgZ2V0IG1hcHBlZCAobm90IHBoeXNpY2FsIGFkZHJlc3NlcykKICAqLwotI2RlZmluZSBDRkdfQ0NTUkJBUl9ERUZBVUxUIAkweGZmNzAwMDAwCS8qIENDU1JCQVIgRGVmYXVsdCAqLworI2RlZmluZSBDRkdfQ0NTUkJBUl9ERUZBVUxUCTB4ZmY3MDAwMDAJLyogQ0NTUkJBUiBEZWZhdWx0ICovCiAjZGVmaW5lIENGR19DQ1NSQkFSCQkweGUwMDAwMDAwCS8qIHJlbG9jYXRlZCBDQ1NSQkFSICovCiAjZGVmaW5lIENGR19JTU1SCQlDRkdfQ0NTUkJBUgkvKiBQUUlJIHVzZXMgQ0ZHX0lNTVIgKi8KIAorI2RlZmluZSBDRkdfUENJMV9BRERSCShDRkdfQ0NTUkJBUisweDgwMDApCisjZGVmaW5lIENGR19QQ0kyX0FERFIJKENGR19DQ1NSQkFSKzB4OTAwMCkKKyNkZWZpbmUgQ0ZHX1BDSUUxX0FERFIJKENGR19DQ1NSQkFSKzB4YTAwMCkKKwogLyoKICAqIEREUiBTZXR1cAogICovCkBAIC0xMDYsNyArMTE3LDYgQEAKIAogI3VuZGVmIENPTkZJR19DTE9DS1NfSU5fTUhaCiAKLQogLyoKICAqIExvY2FsIEJ1cyBEZWZpbml0aW9ucwogICovCkBAIC0xMjQsOSArMTM0LDkgQEAKICAqICAgIFVzZSBHUENNID0gQlJ4WzI0OjI2XSA9IDAwMAogICogICAgVmFsaWQgPSBCUnhbMzFdID0gMQogICoKLSAqIDAgICAgNCAgICA4ICAgIDEyICAgMTYgICAyMCAgIDI0ICAgMjgKLSAqIDExMTEgMTExMSAxMDAwIDAwMDAgMDAwMSAwMDAwIDAwMDAgMDAwMSA9IGZmODAxMDAxICAgIEJSMAotICogMTExMSAxMTExIDAwMDAgMDAwMCAwMDAxIDAwMDAgMDAwMCAwMDAxID0gZmYwMDEwMDEgICAgQlIxCisgKiAwCTQgICAgOAkgIDEyICAgMTYgICAyMAkgMjQgICAyOAorICogMTExMSAxMTExIDEwMDAgMDAwMCAwMDAxIDAwMDAgMDAwMCAwMDAxID0gZmY4MDEwMDEJIEJSMAorICogMTExMSAxMTExIDAwMDAgMDAwMCAwMDAxIDAwMDAgMDAwMCAwMDAxID0gZmYwMDEwMDEJIEJSMQogICoKICAqIE9SMCwgT1IxOgogICogICAgQWRkciBNYXNrID0gOE0gPSBPUnhbMDoxNl0gPSAxMTExIDExMTEgMTAwMCAwMDAwIDAKQEAgLTEzNywxMSArMTQ3LDEyIEBACiAgKiAgICBUUkxYID0gdXNlIHJlbGF4ZWQgdGltaW5nID0gT1J4WzI5XSA9IDEKICAqICAgIEVBRCA9IHVzZSBleHRlcm5hbCBhZGRyZXNzIGxhdGNoIGRlbGF5ID0gT1JbMzFdID0gMQogICoKLSAqIDAgICAgNCAgICA4ICAgIDEyICAgMTYgICAyMCAgIDI0ICAgMjgKLSAqIDExMTEgMTExMSAxMDAwIDAwMDAgMDExMCAxMTEwIDAxMTAgMDEwMSA9IGZmODA2ZTY1ICAgIE9SeAorICogMAk0ICAgIDgJICAxMiAgIDE2ICAgMjAJIDI0ICAgMjgKKyAqIDExMTEgMTExMSAxMDAwIDAwMDAgMDExMCAxMTEwIDAxMTAgMDEwMSA9IGZmODA2ZTY1CSBPUngKICAqLwogCi0jZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweGZmMDAwMDAwCS8qIHN0YXJ0IG9mIEZMQVNIIDhNICovCisjZGVmaW5lIENGR19CT09UX0JMT0NLCQkweGZmMDAwMDAwCS8qIGJvb3QgVExCIGJsb2NrICovCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQlDRkdfQk9PVF9CTE9DSwkvKiBzdGFydCBvZiBGTEFTSCAxNk0gKi8KIAogI2RlZmluZSBDRkdfQlIwX1BSRUxJTQkJMHhmZjgwMTAwMQogI2RlZmluZSBDRkdfQlIxX1BSRUxJTQkJMHhmZjAwMTAwMQpAQCAtMTU2LDcgKzE2Nyw3IEBACiAjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTYwMDAwCS8qIEZsYXNoIEVyYXNlIFRpbWVvdXQgKG1zKSAqLwogI2RlZmluZSBDRkdfRkxBU0hfV1JJVEVfVE9VVAk1MDAJLyogRmxhc2ggV3JpdGUgVGltZW91dCAobXMpICovCiAKLSNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRSAgICAJVEVYVF9CQVNFCS8qIHN0YXJ0IG9mIG1vbml0b3IgKi8KKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlURVhUX0JBU0UJLyogc3RhcnQgb2YgbW9uaXRvciAqLwogCiAjZGVmaW5lIENGR19GTEFTSF9DRklfRFJJVkVSCiAjZGVmaW5lIENGR19GTEFTSF9DRkkKQEAgLTE2Niw3ICsxNzcsMTIgQEAKIC8qCiAgKiBTRFJBTSBvbiB0aGUgTG9jYWwgQnVzCiAgKi8KLSNkZWZpbmUgQ0ZHX0xCQ19TRFJBTV9CQVNFCTB4ZjAwMDAwMDAJLyogTG9jYWxidXMgU0RSQU0gKi8KKyNkZWZpbmUgQ0ZHX0xCQ19DQUNIRV9CQVNFCTB4ZjAwMDAwMDAJLyogTG9jYWxidXMgY2FjaGVhYmxlICovCisjZGVmaW5lIENGR19MQkNfQ0FDSEVfU0laRQk2NAorI2RlZmluZSBDRkdfTEJDX05PTkNBQ0hFX0JBU0UJMHhmODAwMDAwMAkvKiBMb2NhbGJ1cyBub24tY2FjaGVhYmxlICovCisjZGVmaW5lIENGR19MQkNfTk9OQ0FDSEVfU0laRQk2NAorCisjZGVmaW5lIENGR19MQkNfU0RSQU1fQkFTRQlDRkdfTEJDX0NBQ0hFX0JBU0UJLyogTG9jYWxidXMgU0RSQU0gKi8KICNkZWZpbmUgQ0ZHX0xCQ19TRFJBTV9TSVpFCTY0CQkvKiBMQkMgU0RSQU0gaXMgNjRNQiAqLwogCiAvKgpAQCAtMTgwLDE0ICsxOTYsMTQgQEAKICAqICAgIFNEUkFNIGZvciBNU0VMID0gQlIyWzI0OjI2XSA9IDAxMQogICogICAgVmFsaWQgPSBCUlszMV0gPSAxCiAgKgotICogMCAgICA0ICAgIDggICAgMTIgICAxNiAgIDIwICAgMjQgICAyOAorICogMAk0ICAgIDgJICAxMiAgIDE2ICAgMjAJIDI0ICAgMjgKICAqIDExMTEgMDAwMCAwMDAwIDAwMDAgMDAwMSAxMDAwIDAxMTAgMDAwMSA9IGYwMDAxODYxCiAgKgogICogRklYTUU6IENGR19MQkNfU0RSQU1fQkFTRSBzaG91bGQgYmUgbWFza2VkIGFuZCBPUidlZCBpbnRvCiAgKiBGSVhNRTogdGhlIHRvcCAxNyBiaXRzIG9mIEJSMi4KICAqLwogCi0jZGVmaW5lIENGR19CUjJfUFJFTElNICAgICAgICAgIDB4ZjAwMDE4NjEKKyNkZWZpbmUgQ0ZHX0JSMl9QUkVMSU0JCTB4ZjAwMDE4NjEKIAogLyoKICAqIFRoZSBTRFJBTSBzaXplIGluIE1CLCBDRkdfTEJDX1NEUkFNX1NJWkUsIGlzIDY0LgpAQCAtMTk2LDE5ICsyMTIsMTkgQEAKICAqICAgIDY0TUIgbWFzayBmb3IgQU0sIE9SMlswOjddID0gMTExMSAxMTAwCiAgKgkJICAgWEFNLCBPUjJbMTc6MThdID0gMTEKICAqICAgIDkgY29sdW1ucyBPUjJbMTktMjFdID0gMDEwCi0gKiAgICAxMyByb3dzICAgT1IyWzIzLTI1XSA9IDEwMAorICogICAgMTMgcm93cwlPUjJbMjMtMjVdID0gMTAwCiAgKiAgICBFQUQgc2V0IGZvciBleHRyYSB0aW1lIE9SWzMxXSA9IDEKICAqCi0gKiAwICAgIDQgICAgOCAgICAxMiAgIDE2ICAgMjAgICAyNCAgIDI4CisgKiAwCTQgICAgOAkgIDEyICAgMTYgICAyMAkgMjQgICAyOAogICogMTExMSAxMTAwIDAwMDAgMDAwMCAwMTEwIDEwMDEgMDAwMCAwMDAxID0gZmMwMDY5MDEKICAqLwogCiAjZGVmaW5lIENGR19PUjJfUFJFTElNCQkweGZjMDA2OTAxCiAKLSNkZWZpbmUgQ0ZHX0xCQ19MQ1JSCQkweDAwMDMwMDA0ICAgIC8qIExCIGNsb2NrIHJhdGlvIHJlZyAqLwotI2RlZmluZSBDRkdfTEJDX0xCQ1IJCTB4MDAwMDAwMDAgICAgLyogTEIgY29uZmlnIHJlZyAqLwotI2RlZmluZSBDRkdfTEJDX0xTUlQJCTB4MjAwMDAwMDAgIC8qIExCIHNkcmFtIHJlZnJlc2ggdGltZXIgKi8KLSNkZWZpbmUgQ0ZHX0xCQ19NUlRQUgkJMHgwMDAwMDAwMCAgLyogTEIgcmVmcmVzaCB0aW1lciBwcmVzY2FsKi8KKyNkZWZpbmUgQ0ZHX0xCQ19MQ1JSCQkweDAwMDMwMDA0CS8qIExCIGNsb2NrIHJhdGlvIHJlZyAqLworI2RlZmluZSBDRkdfTEJDX0xCQ1IJCTB4MDAwMDAwMDAJLyogTEIgY29uZmlnIHJlZyAqLworI2RlZmluZSBDRkdfTEJDX0xTUlQJCTB4MjAwMDAwMDAJLyogTEIgc2RyYW0gcmVmcmVzaCB0aW1lciAqLworI2RlZmluZSBDRkdfTEJDX01SVFBSCQkweDAwMDAwMDAwCS8qIExCIHJlZnJlc2ggdGltZXIgcHJlc2NhbCovCiAKIC8qCiAgKiBMU0RNUiBtYXNrcwpAQCAtMjM2LDcgKzI1Miw3IEBACiAvKgogICogQ29tbW9uIHNldHRpbmdzIGZvciBhbGwgTG9jYWwgQnVzIFNEUkFNIGNvbW1hbmRzLgogICogQXQgcnVuIHRpbWUsIGVpdGhlciBCU01BMTUxNiAoZm9yIENQVSAxLjEpCi0gKiAgICAgICAgICAgICAgICAgIG9yIEJTTUExNjE3IChmb3IgQ1BVIDEuMCkgKG9sZCkKKyAqCQkgICAgb3IgQlNNQTE2MTcgKGZvciBDUFUgMS4wKSAob2xkKQogICogaXMgT1InZWQgaW4gdG9vLgogICovCiAjZGVmaW5lIENGR19MQkNfTFNETVJfQ09NTU9OCSggQ0ZHX0xCQ19MU0RNUl9SRkNSMTYJCVwKQEAgLTI1Niw2MSArMjcyLDYzIEBACiAgKiAgICBCYXNlIGFkZHJlc3Mgb2YgMHhmODAwMDAwMCA9IEJSWzA6MTZdID0gMTExMSAxMDAwIDAwMDAgMDAwMCAwCiAgKiAgICBwb3J0LXNpemUgPSA4LWJpdHMgID0gQlJbMTk6MjBdID0gMDEKICAqICAgIG5vIHBhcml0eSBjaGVja2luZyAgPSBCUlsyMToyMl0gPSAwMAotICogICAgR1BNQyBmb3IgTVNFTCAgICAgICA9IEJSWzI0OjI2XSA9IDAwMAotICogICAgVmFsaWQgICAgICAgICAgICAgICA9IEJSWzMxXSAgICA9IDEKKyAqICAgIEdQTUMgZm9yIE1TRUwJICA9IEJSWzI0OjI2XSA9IDAwMAorICogICAgVmFsaWQJCSAgPSBCUlszMV0gICAgPSAxCiAgKgotICogMCAgICA0ICAgIDggICAgMTIgICAxNiAgIDIwICAgMjQgICAyOAorICogMAk0ICAgIDgJICAxMiAgIDE2ICAgMjAJIDI0ICAgMjgKICAqIDExMTEgMTAwMCAwMDAwIDAwMDAgMDAwMCAxMDAwIDAwMDAgMDAwMSA9IGY4MDAwODAxCiAgKgogICogRm9yIE9SMywgbmVlZDoKLSAqICAgIDEgTUIgbWFzayBmb3IgQU0sICAgT1JbMDoxNl0gID0gMTExMSAxMTExIDExMTEgMDAwMCAwCisgKiAgICAxIE1CIG1hc2sgZm9yIEFNLAkgIE9SWzA6MTZdICA9IDExMTEgMTExMSAxMTExIDAwMDAgMAogICogICAgZGlzYWJsZSBidWZmZXIgY3RybCBPUlsxOV0gICAgPSAwCi0gKiAgICBDU05UICAgICAgICAgICAgICAgIE9SWzIwXSAgICA9IDEKLSAqICAgIEFDUyAgICAgICAgICAgICAgICAgT1JbMjE6MjJdID0gMTEKLSAqICAgIFhBQ1MgICAgICAgICAgICAgICAgT1JbMjNdICAgID0gMQorICogICAgQ1NOVAkJICBPUlsyMF0gICAgPSAxCisgKiAgICBBQ1MJCSAgT1JbMjE6MjJdID0gMTEKKyAqICAgIFhBQ1MJCSAgT1JbMjNdICAgID0gMQogICogICAgU0NZIDE1IHdhaXQgc3RhdGVzICBPUlsyNDoyN10gPSAxMTExCW1heCBpcyBzdWJvcHRpbWFsIGJ1dCBzYWZlCi0gKiAgICBTRVRBICAgICAgICAgICAgICAgIE9SWzI4XSAgICA9IDAKLSAqICAgIFRSTFggICAgICAgICAgICAgICAgT1JbMjldICAgID0gMQotICogICAgRUhUUiAgICAgICAgICAgICAgICBPUlszMF0gICAgPSAxCi0gKiAgICBFQUQgZXh0cmEgdGltZSAgICAgIE9SWzMxXSAgICA9IDEKKyAqICAgIFNFVEEJCSAgT1JbMjhdICAgID0gMAorICogICAgVFJMWAkJICBPUlsyOV0gICAgPSAxCisgKiAgICBFSFRSCQkgIE9SWzMwXSAgICA9IDEKKyAqICAgIEVBRCBleHRyYSB0aW1lCSAgT1JbMzFdICAgID0gMQogICoKLSAqIDAgICAgNCAgICA4ICAgIDEyICAgMTYgICAyMCAgIDI0ICAgMjgKKyAqIDAJNCAgICA4CSAgMTIgICAxNiAgIDIwCSAyNCAgIDI4CiAgKiAxMTExIDExMTEgMTExMSAwMDAwIDAwMDAgMTExMSAxMTExIDAxMTEgPSBmZmYwMGZmNwogICovCiAKICNkZWZpbmUgQ0FETVVTX0JBU0VfQUREUiAweGY4MDAwMDAwCi0jZGVmaW5lIENGR19CUjNfUFJFTElNICAgMHhmODAwMDgwMQotI2RlZmluZSBDRkdfT1IzX1BSRUxJTSAgIDB4ZmZmMDBmZjcKKyNkZWZpbmUgQ0ZHX0JSM19QUkVMSU0JIDB4ZjgwMDA4MDEKKyNkZWZpbmUgQ0ZHX09SM19QUkVMSU0JIDB4ZmZmMDBmZjcKIAogI2RlZmluZSBDT05GSUdfTDFfSU5JVF9SQU0KLSNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0xPQ0sgCTEKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0xPQ0sJMQogI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUgkweGU0MDEwMDAwCS8qIEluaXRpYWwgUkFNIGFkZHJlc3MgKi8KLSNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORCAgICAJMHg0MDAwCSAgICAvKiBFbmQgb2YgdXNlZCBhcmVhIGluIFJBTSAqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECTB4NDAwMAkJLyogRW5kIG9mIHVzZWQgYXJlYSBpbiBSQU0gKi8KIAotI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRSAgCTEyOAkgICAgLyogbnVtIGJ5dGVzIGluaXRpYWwgZGF0YSAqLworI2RlZmluZSBDRkdfSU5JVF9MMl9BRERSCTB4ZjhmODAwMDAJLyogcmVsb2NhdGUgYm9vdCBMMlNSQU0gKi8KKworI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRQkxMjgJCS8qIG51bSBieXRlcyBpbml0aWFsIGRhdGEgKi8KICNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQogI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQJQ0ZHX0dCTF9EQVRBX09GRlNFVAogCi0jZGVmaW5lIENGR19NT05JVE9SX0xFTgkgICAgCSgyNTYgKiAxMDI0KSAvKiBSZXNlcnZlIDI1NiBrQiBmb3IgTW9uICovCi0jZGVmaW5lIENGR19NQUxMT0NfTEVOCSAgICAJKDEyOCAqIDEwMjQpCS8qIFJlc2VydmVkIGZvciBtYWxsb2MgKi8KKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoMjU2ICogMTAyNCkgLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbiAqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDEyOCAqIDEwMjQpCS8qIFJlc2VydmVkIGZvciBtYWxsb2MgKi8KIAogLyogU2VyaWFsIFBvcnQgKi8KLSNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgIDIKKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVgJMgogI3VuZGVmCUNPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTwogI2RlZmluZSBDRkdfTlMxNjU1MAogI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKLSNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUgICAgMQorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQkxCiAjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJZ2V0X2J1c19mcmVxKDApCiAKLSNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFICBcCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRSBcCiAJezMwMCwgNjAwLCAxMjAwLCAyNDAwLCA0ODAwLCA5NjAwLCAxOTIwMCwgMzg0MDAsMTE1MjAwfQogCi0jZGVmaW5lIENGR19OUzE2NTUwX0NPTTEgICAgICAgIChDRkdfQ0NTUkJBUisweDQ1MDApCi0jZGVmaW5lIENGR19OUzE2NTUwX0NPTTIgICAgICAgIChDRkdfQ0NTUkJBUisweDQ2MDApCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEJKENGR19DQ1NSQkFSKzB4NDUwMCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMgkoQ0ZHX0NDU1JCQVIrMHg0NjAwKQogCiAvKiBVc2UgdGhlIEhVU0ggcGFyc2VyICovCiAjZGVmaW5lIENGR19IVVNIX1BBUlNFUgotI2lmZGVmICBDRkdfSFVTSF9QQVJTRVIKKyNpZmRlZglDRkdfSFVTSF9QQVJTRVIKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMiAiPiAiCiAjZW5kaWYKIApAQCAtMzMxLDU1ICszNDksNzQgQEAKICAqLwogI2RlZmluZSBDT05GSUdfRlNMX0kyQwkJLyogVXNlIEZTTCBjb21tb24gSTJDIGRyaXZlciAqLwogI2RlZmluZSBDT05GSUdfSEFSRF9JMkMJCS8qIEkyQyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQqLwotI3VuZGVmCUNPTkZJR19TT0ZUX0kyQwkJCS8qIEkyQyBiaXQtYmFuZ2VkICovCisjdW5kZWYJQ09ORklHX1NPRlRfSTJDCQkvKiBJMkMgYml0LWJhbmdlZCAqLwogI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMDAJLyogSTJDIHNwZWVkIGFuZCBzbGF2ZSBhZGRyZXNzICovCiAjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFIJMHg1NwogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCi0jZGVmaW5lIENGR19JMkNfTk9QUk9CRVMgICAgICAgIHsweDY5fQkvKiBEb24ndCBwcm9iZSB0aGVzZSBhZGRycyAqLworI2RlZmluZSBDRkdfSTJDX05PUFJPQkVTCXsweDY5fQkvKiBEb24ndCBwcm9iZSB0aGVzZSBhZGRycyAqLwogI2RlZmluZSBDRkdfSTJDX09GRlNFVAkJMHgzMDAwCiAKIC8qCiAgKiBHZW5lcmFsIFBDSQogICogTWVtb3J5IHNwYWNlIGlzIG1hcHBlZCAxLTEsIGJ1dCBJL08gc3BhY2UgbXVzdCBzdGFydCBmcm9tIDAuCiAgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9QSFlTCQkweDgwMDAwMDAwCS8qIDFHIFBDSSBUTEIgKi8KKwogI2RlZmluZSBDRkdfUENJMV9NRU1fQkFTRQkweDgwMDAwMDAwCiAjZGVmaW5lIENGR19QQ0kxX01FTV9QSFlTCUNGR19QQ0kxX01FTV9CQVNFCi0jZGVmaW5lIENGR19QQ0kxX01FTV9TSVpFCTB4MTAwMDAwMDAJLyogMjU2TSAqLworI2RlZmluZSBDRkdfUENJMV9NRU1fU0laRQkweDIwMDAwMDAwCS8qIDUxMk0gKi8KICNkZWZpbmUgQ0ZHX1BDSTFfSU9fQkFTRQkweDAwMDAwMDAwCiAjZGVmaW5lIENGR19QQ0kxX0lPX1BIWVMJMHhlMjAwMDAwMAotI2RlZmluZSBDRkdfUENJMV9JT19TSVpFCTB4MDA4MDAwMDAJLyogOE0gKi8KKyNkZWZpbmUgQ0ZHX1BDSTFfSU9fU0laRQkweDAwMTAwMDAwCS8qIDFNICovCiAKLSNkZWZpbmUgQ0ZHX1BDSTJfTUVNX0JBU0UJMHg5MDAwMDAwMAorI2lmZGVmIENPTkZJR19QQ0kyCisjZGVmaW5lIENGR19QQ0kyX01FTV9CQVNFCTB4YTAwMDAwMDAKICNkZWZpbmUgQ0ZHX1BDSTJfTUVNX1BIWVMJQ0ZHX1BDSTJfTUVNX0JBU0UKLSNkZWZpbmUgQ0ZHX1BDSTJfTUVNX1NJWkUJMHgxMDAwMDAwMAkvKiAyNTZNICovCisjZGVmaW5lIENGR19QQ0kyX01FTV9TSVpFCTB4MjAwMDAwMDAJLyogNTEyTSAqLwogI2RlZmluZSBDRkdfUENJMl9JT19CQVNFCTB4MDAwMDAwMDAKICNkZWZpbmUgQ0ZHX1BDSTJfSU9fUEhZUwkweGUyODAwMDAwCi0jZGVmaW5lIENGR19QQ0kyX0lPX1NJWkUJMHgwMDgwMDAwMAkvKiA4TSAqLworI2RlZmluZSBDRkdfUENJMl9JT19TSVpFCTB4MDAxMDAwMDAJLyogMU0gKi8KKyNlbmRpZgogCi0jZGVmaW5lIENGR19QRVhfTUVNX0JBU0UJMHhhMDAwMDAwMAotI2RlZmluZSBDRkdfUEVYX01FTV9QSFlTCUNGR19QRVhfTUVNX0JBU0UKLSNkZWZpbmUgQ0ZHX1BFWF9NRU1fU0laRQkweDIwMDAwMDAwCS8qIDUxMk0gKi8KLSNkZWZpbmUgQ0ZHX1BFWF9JT19CQVNFCQkweDAwMDAwMDAwCi0jZGVmaW5lIENGR19QRVhfSU9fUEhZUwkJMHhlMzAwMDAwMAotI2RlZmluZSBDRkdfUEVYX0lPX1NJWkUJCTB4MDEwMDAwMDAJLyogMTZNICovCisjaWZkZWYgQ09ORklHX1BDSUUxCisjZGVmaW5lIENGR19QQ0lFMV9NRU1fQkFTRQkweGEwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lFMV9NRU1fUEhZUwlDRkdfUENJRTFfTUVNX0JBU0UKKyNkZWZpbmUgQ0ZHX1BDSUUxX01FTV9TSVpFCTB4MjAwMDAwMDAJLyogNTEyTSAqLworI2RlZmluZSBDRkdfUENJRTFfSU9fQkFTRQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lFMV9JT19QSFlTCTB4ZTMwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSUUxX0lPX1NJWkUJMHgwMDEwMDAwMAkvKiAgIDFNICovCisjZW5kaWYKIAorI2lmZGVmIENPTkZJR19SSU8KIC8qCiAgKiBSYXBpZElPIE1NVQogICovCiAjZGVmaW5lIENGR19SSU9fTUVNX0JBU0UJMHhDMDAwMDAwMAogI2RlZmluZSBDRkdfUklPX01FTV9TSVpFCTB4MjAwMDAwMDAJLyogNTEyTSAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTEVHQUNZCisjZGVmaW5lIEJSSURHRV9JRCAxNworI2RlZmluZSBWSUFfSUQgMgorI2Vsc2UKKyNkZWZpbmUgQlJJREdFX0lEIDI4CisjZGVmaW5lIFZJQV9JRCA0CisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIAogI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCi0jZGVmaW5lIENPTkZJR19QQ0lfUE5QCSAgICAgICAgICAgICAgIAkvKiBkbyBwY2kgcGx1Zy1hbmQtcGxheSAqLwotI2RlZmluZSBDT05GSUdfODVYWF9QQ0kyCisjZGVmaW5lIENPTkZJR19QQ0lfUE5QCQkJLyogZG8gcGNpIHBsdWctYW5kLXBsYXkgKi8KIAogI3VuZGVmIENPTkZJR19FRVBSTzEwMAogI3VuZGVmIENPTkZJR19UVUxJUAogCiAjdW5kZWYgQ09ORklHX1BDSV9TQ0FOX1NIT1cJCS8qIHNob3cgcGNpIGRldmljZXMgb24gc3RhcnR1cCAqLwotI2RlZmluZSBDRkdfUENJX1NVQlNZU19WRU5ET1JJRCAweDEwNTcgIC8qIE1vdG9yb2xhICovCisKKy8qIFBDSSB2aWV3IG9mIFN5c3RlbSBNZW1vcnkgKi8KKyNkZWZpbmUgQ0ZHX1BDSV9NRU1PUllfQlVTCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSV9NRU1PUllfUEhZUwkweDAwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lfTUVNT1JZX1NJWkUJMHg4MDAwMDAwMAogCiAjZW5kaWYJLyogQ09ORklHX1BDSSAqLwogCkBAIC0zODcsNyArNDI0LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpCiAKICNpZm5kZWYgQ09ORklHX05FVF9NVUxUSQotI2RlZmluZSBDT05GSUdfTkVUX01VTFRJIAkxCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJMQogI2VuZGlmCiAKICNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQgKi8KQEAgLTM5Nyw3ICs0MzQsNyBAQAogI2RlZmluZSBDT05GSUdfVFNFQzJfTkFNRQkiZVRTRUMxIgogI2RlZmluZSBDT05GSUdfVFNFQzMJMQogI2RlZmluZSBDT05GSUdfVFNFQzNfTkFNRQkiZVRTRUMyIgotI3VuZGVmIENPTkZJR19UU0VDNAorI2RlZmluZSBDT05GSUdfVFNFQzQKICNkZWZpbmUgQ09ORklHX1RTRUM0X05BTUUJImVUU0VDMyIKICN1bmRlZiBDT05GSUdfTVBDODVYWF9GRUMKIApAQCAtNDEzLDcgKzQ1MCw3IEBACiAKIC8qIE9wdGlvbnMgYXJlOiBlVFNFQ1swLTNdICovCiAjZGVmaW5lIENPTkZJR19FVEhQUklNRQkJImVUU0VDMCIKLQorI2RlZmluZSBDT05GSUdfUEhZX0dJR0UJCTEJLyogSW5jbHVkZSBHYkUgc3BlZWQvZHVwbGV4IGRldGVjdGlvbiAqLwogI2VuZGlmCS8qIENPTkZJR19UU0VDX0VORVQgKi8KIAogLyoKQEAgLTQyNywxOSArNDY0LDI4IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BDSSBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgXAotCQkJCXwgQ0ZHX0NNRF9NSUkpCi0jZWxzZQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgXAotCQkJCXwgQ0ZHX0NNRF9NSUkpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTQ0OSw3ICs0OTUsNyBAQAogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCkBAIC00NjQsMTIgKzUxMCwxMiBAQAogICogaGF2ZSB0byBiZSBpbiB0aGUgZmlyc3QgOCBNQiBvZiBtZW1vcnksIHNpbmNlIHRoaXMgaXMKICAqIHRoZSBtYXhpbXVtIG1hcHBlZCBieSB0aGUgTGludXgga2VybmVsIGR1cmluZyBpbml0aWFsaXphdGlvbi4KICAqLwotI2RlZmluZSBDRkdfQk9PVE1BUFNaCSg4IDw8IDIwKSAJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCovCisjZGVmaW5lIENGR19CT09UTUFQU1oJKDggPDwgMjApCS8qIEluaXRpYWwgTWVtb3J5IG1hcCBmb3IgTGludXgqLwogCiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSovCiAjZW5kaWYKIApAQCAtNDgxLDcgKzUyNyw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpAQCAtNDkyLDU4ICs1MzgsMTU2IEBACiAKIC8qIFRoZSBtYWMgYWRkcmVzc2VzIGZvciBhbGwgZXRoZXJuZXQgaW50ZXJmYWNlICovCiAjaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQotI2RlZmluZSBDT05GSUdfRVRIQUREUiAgIDAwOkUwOjBDOjAwOjAwOkZECisjZGVmaW5lIENPTkZJR19FVEhBRERSCSAwMDpFMDowQzowMDowMDpGRAogI2RlZmluZSBDT05GSUdfSEFTX0VUSDEKLSNkZWZpbmUgQ09ORklHX0VUSDFBRERSICAwMDpFMDowQzowMDowMTpGRAorI2RlZmluZSBDT05GSUdfRVRIMUFERFIJIDAwOkUwOjBDOjAwOjAxOkZECiAjZGVmaW5lIENPTkZJR19IQVNfRVRIMgotI2RlZmluZSBDT05GSUdfRVRIMkFERFIgIDAwOkUwOjBDOjAwOjAyOkZECisjZGVmaW5lIENPTkZJR19FVEgyQUREUgkgMDA6RTA6MEM6MDA6MDI6RkQKICNkZWZpbmUgQ09ORklHX0hBU19FVEgzCi0jZGVmaW5lIENPTkZJR19FVEgzQUREUiAgMDA6RTA6MEM6MDA6MDM6RkQKKyNkZWZpbmUgQ09ORklHX0VUSDNBRERSCSAwMDpFMDowQzowMDowMzpGRAogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0lQQUREUiAgICAxOTIuMTY4LjEuMjUzCisjZGVmaW5lIENPTkZJR19JUEFERFIJIDE5Mi4xNjguMS4yNTMKIAotI2RlZmluZSBDT05GSUdfSE9TVE5BTUUgIHVua25vd24KLSNkZWZpbmUgQ09ORklHX1JPT1RQQVRIICAvbmZzcm9vdAotI2RlZmluZSBDT05GSUdfQk9PVEZJTEUgIHlvdXIudUltYWdlCisjZGVmaW5lIENPTkZJR19IT1NUTkFNRQkgdW5rbm93bgorI2RlZmluZSBDT05GSUdfUk9PVFBBVEgJIC9uZnNyb290CisjZGVmaW5lIENPTkZJR19CT09URklMRQk4NTQ4Y2RzL3VJbWFnZS51Ym9vdAorI2RlZmluZSBDT05GSUdfVUJPT1RQQVRICTg1NDhjZHMvdS1ib290LmJpbgkvKiBURlRQIHNlcnZlciAqLwogCi0jZGVmaW5lIENPTkZJR19TRVJWRVJJUCAgMTkyLjE2OC4xLjEKKyNkZWZpbmUgQ09ORklHX1NFUlZFUklQCSAxOTIuMTY4LjEuMQogI2RlZmluZSBDT05GSUdfR0FURVdBWUlQIDE5Mi4xNjguMS4xCi0jZGVmaW5lIENPTkZJR19ORVRNQVNLICAgMjU1LjI1NS4yNTUuMAorI2RlZmluZSBDT05GSUdfTkVUTUFTSwkgMjU1LjI1NS4yNTUuMAogCi0jZGVmaW5lIENPTkZJR19MT0FEQUREUiAgMjAwMDAwICAgLypkZWZhdWx0IGxvY2F0aW9uIGZvciB0ZnRwIGFuZCBib290bSovCisjZGVmaW5lIENPTkZJR19MT0FEQUREUgkxMDAwMDAwCS8qZGVmYXVsdCBsb2NhdGlvbiBmb3IgdGZ0cCBhbmQgYm9vdG0qLwogCi0jZGVmaW5lIENPTkZJR19CT09UREVMQVkgMTAgICAgICAgLyogLTEgZGlzYWJsZXMgYXV0by1ib290ICovCi0jdW5kZWYgIENPTkZJR19CT09UQVJHUyAgICAgICAgICAgLyogdGhlIGJvb3QgY29tbWFuZCB3aWxsIHNldCBib290YXJncyovCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkgMTAJLyogLTEgZGlzYWJsZXMgYXV0by1ib290ICovCisjdW5kZWYJQ09ORklHX0JPT1RBUkdTCQkvKiB0aGUgYm9vdCBjb21tYW5kIHdpbGwgc2V0IGJvb3RhcmdzKi8KIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJMTE1MjAwCiAKLSNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkgICAgICAgIFwKLSAgICJuZXRkZXY9ZXRoMFwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJjb25zb2xlZGV2PXR0eVMxXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJyYW1kaXNrYWRkcj02MDAwMDBcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJyYW1kaXNrZmlsZT15b3VyLnJhbWRpc2sudS1ib290XDAiCQkJCQlcCi0gICAiZmR0YWRkcj00MDAwMDBcMCIJCQkJCQkJXAotICAgImZkdGZpbGU9eW91ci5mZHQuZHRiXDAiCisjaWYgZGVmaW5lZChDT05GSUdfUENJRTEpCisjZGVmaW5lIFBDSUVfRU5WIFwKKyAicGNpZXJlZz1tZCAke2F9MDAwIDY7IG1kICR7YX0wMjAgNDsgbWQgJHthfWJmOCAyOyBlY2hvIG87bWQgJHthfWMwMCAyNTsiIFwKKwkiZWNobyBpOyBtZCAke2F9ZGEwIDE1OyBlY2hvIGU7bWQgJHthfWUwMCBlOyBlY2hvIGQ7IG1kICR7YX1mMDAgY1wwIiBcCisgInBjaWVlcnI9bWQgJHthfTAyMCAxOyBtZCAke2F9ZTAwIGU7IHBjaSBkLmIgJGIuMCA3IDE7IHBjaSBkLncgJGIuMCAxZSAxOyIgXAorCSJwY2kgZC53ICRiLjAgNTYgMTsgcGNpIGQgJGIuMCAxMDQgMTsgcGNpIGQgJGIuMCAxMTAgMTsiIFwKKwkicGNpIGQgJGIuMCAxMzAgMVwwIiBcCisgInBjaWVlcnJjPW13ICR7YX0wMjAgZmZmZmZmZmY7IG13ICR7YX1lMDAgZmZmZmZmZmY7IHBjaSB3LmIgJGIuMCA3IGZmOyIgXAorCSJwY2kgdy53ICRiLjAgMWUgZmZmZjsgcGNpIHcudyAkYi4wIDU2IGZmZmY7IHBjaSB3ICRiLjAgMTA0IGZmZmZmZmZmOyJcCisJInBjaSB3ICRiLjAgMTEwIGZmZmZmZmZmOyBwY2kgdyAkYi4wIDEzMCBmZmZmZmZmZlwwIiBcCisgInBjaWVjZmc9cGNpIGQgJGIuMCAwIDIwOyBwY2kgZCAkYi4wIDEwMCBlOyBwY2kgZCAkYi4wIDQwMCA2OVwwIiBcCisgInBjaWUxcmVncz1zZXRlbnYgYSBlMDAwYTsgcnVuIHBjaWVyZWdcMCIgXAorICJwY2llMWNmZz1zZXRlbnYgYiAzOyBydW4gcGNpZWNmZ1wwIiBcCisgInBjaWUxZXJyPXNldGVudiBhIGUwMDBhOyBzZXRlbnYgYiAzOyBydW4gcGNpZWVyclwwIiBcCisgInBjaWUxZXJyYz1zZXRlbnYgYSBlMDAwYTsgc2V0ZW52IGIgMzsgcnVuIHBjaWVlcnJjXDAiCisjZWxzZQorI2RlZmluZQlQQ0lFX0VOViAiIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kxKSB8fCBkZWZpbmVkKENPTkZJR19QQ0kyKQorI2RlZmluZSBQQ0lfRU5WIFwKKyAicGNpcmVnPW1kICR7YX0wMDAgMzsgZWNobyBvO21kICR7YX1jMDAgMjU7IGVjaG8gaTsgbWQgJHthfWRhMCAxNTsiIFwKKwkiZWNobyBlO21kICR7YX1lMDAgOVwwIiBcCisgInBjaWVycj1tZCAke2F9ZTAwIDg7IHBjaSBkLmIgJGIuMCA3IDE7cGNpIGQudyAkYi4wIDFlIDE7IiBcCisJInBjaSBkLncgJGIuMCA1NiAxXDAiIFwKKyAicGNpZXJyYz1tdyAke2F9ZTAwIGZmZmZmZmZmOyBtdyAke2F9ZTBjIDA7IHBjaSB3LmIgJGIuMCA3IGZmOyIgXAorCSJwY2kgdy53ICRiLjAgMWUgZmZmZjsgcGNpIHcudyAkYi4wIDU2IGZmZmZcMCIKKyNlbHNlCisjZGVmaW5lCVBDSV9FTlYgIiIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfUENJMSkKKyNkZWZpbmUgUENJX0VOVjEgXAorICJwY2kxcmVncz1zZXRlbnYgYSBlMDAwODsgcnVuIHBjaXJlZ1wwIiBcCisgInBjaTFlcnI9c2V0ZW52IGEgZTAwMDg7IHNldGVudiBiIDA7IHJ1biBwY2llcnJcMCIgXAorICJwY2kxZXJyYz1zZXRlbnYgYSBlMDAwODsgc2V0ZW52IGIgMDsgcnVuIHBjaWVycmNcMCIKKyNlbHNlCisjZGVmaW5lCVBDSV9FTlYxICIiCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSTIpCisjZGVmaW5lIFBDSV9FTlYyIFwKKyAicGNpMnJlZ3M9c2V0ZW52IGEgZTAwMDk7IHJ1biBwY2lyZWdcMCIgXAorICJwY2kyZXJyPXNldGVudiBhIGUwMDA5OyBzZXRlbnYgYiAxMjM7IHJ1biBwY2llcnJcMCIJXAorICJwY2kyZXJyYz1zZXRlbnYgYSBlMDAwOTsgc2V0ZW52IGIgMTIzOyBydW4gcGNpZXJyY1wwIgorI2Vsc2UKKyNkZWZpbmUJUENJX0VOVjIgIiIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQorI2RlZmluZSBFTkVUX0VOViBcCisgImVuZXRyZWcxPW1kICR7YX0wMDAgMjsgbWQgJHthfTAxMCA5OyBtZCAke2F9MDUwIDQ7IG1kICR7YX0wOGMgMTsiIFwKKwkibWQgJHthfTA5OCAyXDAiIFwKKyAiZW5ldHJlZ3Q9ZWNobyB0O21kICR7YX0xMDAgNjsgbWQgJHthfTE0MCAyOyBtZCAke2F9MTgwIDEwOyBtZCAke2F9MjAwIDEwXDAiIFwKKyAiZW5ldHJlZ3I9ZWNobyByO21kICR7YX0zMDAgNjsgbWQgJHthfTMzMCA1OyBtZCAke2F9MzgwIDEwOyBtZCAke2F9NDAwIDEwXDAiIFwKKyAiZW5ldHJlZ209ZWNobyBtYWM7bWQgJHthfTUwMCA1OyBtZCAke2F9NTIwIDI4O2VjaG8gZmlmbzttZCAke2F9YTAwIDE7IiBcCisJImVjaG8gbWliO21kICR7YX02ODAgMzFcMCIgXAorICJlbmV0cmVnPXJ1biBlbmV0cmVnMTsgcnVuIGVuZXRyZWdtOyBydW4gZW5ldHJlZ3Q7IHJ1biBlbmV0cmVnclwwIiBcCisgImVuZXQxcmVncz1zZXRlbnYgYSBlMDAyNDsgcnVuIGVuZXRyZWdcMCIgXAorICJlbmV0MnJlZ3M9c2V0ZW52IGEgZTAwMjU7IHJ1biBlbmV0cmVnXDAiIFwKKyAiZW5ldDNyZWdzPXNldGVudiBhIGUwMDI2OyBydW4gZW5ldHJlZ1wwIiBcCisgImVuZXQ0cmVncz1zZXRlbnYgYSBlMDAyNzsgcnVuIGVuZXRyZWdcMCIKKyNlbHNlCisjZGVmaW5lIEVORVRfRU5WICIiCisjZW5kaWYKKworI2lmIDAKKyNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQlcCisgIm5ldGRldj1ldGgwXDAiCQkJCQkJXAorICJ1Ym9vdD0iIE1LX1NUUihDT05GSUdfVUJPT1RQQVRIKSAiXDAiCQkJCVwKKyAidGZ0cGZsYXNoPXRmdHBib290ICRsb2FkYWRkciAkdWJvb3Q7ICIJCQlcCisJInByb3RlY3Qgb2ZmICIgTUtfU1RSKFRFWFRfQkFTRSkgIiArJGZpbGVzaXplOyAiCVwKKwkiZXJhc2UgIiBNS19TVFIoVEVYVF9CQVNFKSAiICskZmlsZXNpemU7ICIJCVwKKwkiY3AuYiAkbG9hZGFkZHIgIiBNS19TVFIoVEVYVF9CQVNFKSAiICRmaWxlc2l6ZTsgIglcCisJInByb3RlY3Qgb24gIiBNS19TVFIoVEVYVF9CQVNFKSAiICskZmlsZXNpemU7ICIJCVwKKwkiY21wLmIgJGxvYWRhZGRyICIgTUtfU1RSKFRFWFRfQkFTRSkgIiAkZmlsZXNpemVcMCIJXAorICJjb25zb2xlZGV2PXR0eVMxXDAiCQkJCVwKKyAicmFtZGlza2FkZHI9MjAwMDAwMFwwIgkJCVwKKyAicmFtZGlza2ZpbGU9cmFtZGlzay51Ym9vdFwwIgkJCVwKKyAiZHRiYWRkcj1jMDAwMDBcMCIJCQkJXAorICJkdGJmaWxlPW1wYzg1NDhjZHMuZHRiXDAiCQkJXAorICJlb2k9bXcgZTAwNDAwYjAgMFwwIgkJCQlcCisgImlhY2s9bWQgZTAwNDAwYTAgMVwwIgkJCQlcCisgImRkcnJlZz1tZCAke2F9MDAwIDg7IG1kICR7YX0wODAgODttZCAke2F9MTAwIGQ7IG1kICR7YX0xNDAgNDsgbWQgJHthfWJmMCA0OyIgXAorCSJtZCAke2F9ZTAwIDM7IG1kICR7YX1lMjAgMzsgbWQgJHthfWU0MCA3OyBtZCAke2F9ZjAwIDVcMCIgXAorICJkZHJyZWdzPXNldGVudiBhIGUwMDAyOyBydW4gZGRycmVnXDAiCQlcCisgImd1cmVnPW1kICR7YX0wMDAgMmM7IG1kICR7YX0wYjAgMTsgbWQgJHthfTBjMCAxOyBtZCAke2F9YjIwIDM7IiBcCisJIm1kICR7YX1lMDAgMTsgbWQgJHthfWU2MCAxOyBtZCAke2F9ZWYwIDE1XDAiCVwKKyAiZ3VyZWdzPXNldGVudiBhIGUwMGUwOyBydW4gZ3VyZWdcMCIJCVwKKyAiZWNtcmVnPW1kICR7YX0wMDAgMTsgbWQgJHthfTAxMCAxOyBtZCAke2F9YmY4IDI7IG1kICR7YX1lMDAgNlwwIiBcCisgImVjbXJlZ3M9c2V0ZW52IGEgZTAwMDE7IHJ1biBlY21yZWdcMCIgXAorICJsYXdyZWdzPW1kIGUwMDAwYzA4IDRiXDAiIFwKKyAibGJjcmVncz1tZCBlMDAwNTAwMCAzNlwwIiBcCisgImRtYTByZWdzPW1kIGUwMDIxMTAwIDEyXDAiIFwKKyAiZG1hMXJlZ3M9bWQgZTAwMjExODAgMTJcMCIgXAorICJkbWEycmVncz1tZCBlMDAyMTIwMCAxMlwwIiBcCisgImRtYTNyZWdzPW1kIGUwMDIxMjgwIDEyXDAiIFwKKyBQQ0lFX0VOViBcCisgUENJX0VOViBcCisgUENJX0VOVjEgXAorIFBDSV9FTlYyIFwKKyBFTkVUX0VOVgorI2VuZGlmCiAKIAotI2RlZmluZSBDT05GSUdfTkZTQk9PVENPTU1BTkQJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L25mcyBydyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICJuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgQ09ORklHX05GU0JPT1RDT01NQU5ECQkJCQkJXAorICAgInNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIHJ3ICIJCQkJCVwKKyAgICAgICJuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIgkJCQkJXAogICAgICAgImlwPSRpcGFkZHI6JHNlcnZlcmlwOiRnYXRld2F5aXA6JG5ldG1hc2s6JGhvc3RuYW1lOiRuZXRkZXY6b2ZmICIgXAotICAgICAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiICAgICAgICAgICAgICAgICAgICAgXAotICAgInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgInRmdHAgJGZkdGFkZHIgJGZkdGZpbGU7IgkJCQkJCVwKLSAgICJib290bSAkbG9hZGFkZHIgLSAkZmR0YWRkciIKKyAgICAgICJjb25zb2xlPSRjb25zb2xlZGV2LCRiYXVkcmF0ZSAkb3RoYm9vdGFyZ3M7IgkJCVwKKyAgICJ0ZnRwICRsb2FkYWRkciAkYm9vdGZpbGU7IgkJCQkJCVwKKyAgICJ0ZnRwICRkdGJhZGRyICRkdGJmaWxlOyIJCQkJCQlcCisgICAiYm9vdG0gJGxvYWRhZGRyIC0gJGR0YmFkZHIiCiAKIAogI2RlZmluZSBDT05GSUdfUkFNQk9PVENPTU1BTkQgXAotICAgInNldGVudiBib290YXJncyByb290PS9kZXYvcmFtIHJ3ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiICAgICAgICAgICAgICAgICAgICAgXAotICAgInRmdHAgJHJhbWRpc2thZGRyICRyYW1kaXNrZmlsZTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgImJvb3RtICRsb2FkYWRkciAkcmFtZGlza2FkZHIiCisgICAic2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9yYW0gcncgIgkJCQkJXAorICAgICAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiCQkJXAorICAgInRmdHAgJHJhbWRpc2thZGRyICRyYW1kaXNrZmlsZTsiCQkJCQlcCisgICAidGZ0cCAkbG9hZGFkZHIgJGJvb3RmaWxlOyIJCQkJCQlcCisgICAidGZ0cCAkZHRiYWRkciAkZHRiZmlsZTsiCQkJCQkJXAorICAgImJvb3RtICRsb2FkYWRkciAkcmFtZGlza2FkZHIgJGR0YmFkZHIiCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5EICBDT05GSUdfTkZTQk9PVENPTU1BTkQKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECUNPTkZJR19ORlNCT09UQ09NTUFORAogCiAjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01QQzg1NTVDRFMuaCBiL2luY2x1ZGUvY29uZmlncy9NUEM4NTU1Q0RTLmgKaW5kZXggYjdlNzAzYy4uZThmZTk5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzg1NTVDRFMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU1NUNEUy5oCkBAIC0zNTAsNiArMzUwLDEzIEBACiAjZGVmaW5lIENGR19QQ0kyX0lPX1BIWVMJMHhlMjEwMDAwMAogI2RlZmluZSBDRkdfUENJMl9JT19TSVpFCTB4MDAxMDAwMDAJLyogMU0gKi8KIAorI2lmZGVmIENPTkZJR19MRUdBQ1kKKyNkZWZpbmUgQlJJREdFX0lEIDE3CisjZGVmaW5lIFZJQV9JRCAyCisjZWxzZQorI2RlZmluZSBCUklER0VfSUQgMjgKKyNkZWZpbmUgVklBX0lEIDQKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQogCkBAIC00MDEsMTkgKzQwOCwyOCBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UgKi8KIAorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKwogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgXAotCQkJCXwgQ0ZHX0NNRF9QQ0kgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfSTJDIFwKLQkJCQl8IENGR19DTURfTUlJKQotI2Vsc2UKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfSTJDIFwKLQkJCQl8IENGR19DTURfTUlJKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC00MjMsNyArNDM5LDcgQEAKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJKi8KICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDIwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNDQzLDcgKzQ1OSw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSovCiAjZW5kaWYKIApAQCAtNDU1LDcgKzQ3MSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01QQzg1NjBBRFMuaCBiL2luY2x1ZGUvY29uZmlncy9NUEM4NTYwQURTLmgKaW5kZXggMDQzMzk3Zi4uYzEwZTU1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzg1NjBBRFMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU2MEFEUy5oCkBAIC00Myw5ICs0Myw3IEBACiAKICNkZWZpbmUgQ09ORklHX1BDSQogI2RlZmluZSBDT05GSUdfVFNFQ19FTkVUIAkJLyogdHNlYyBldGhlcm5ldCBzdXBwb3J0ICovCi0jdW5kZWYgQ09ORklHX1RTRUNfRU5FVCAJCS8qIHRzZWMgZXRoZXJuZXQgc3VwcG9ydCAqLwotI3VuZGVmICBDT05GSUdfRVRIRVJfT05fRkNDICAgICAgICAgICAgIC8qIGNwbSBGQ0MgZXRoZXJuZXQgc3VwcG9ydCAqLwotI2RlZmluZSAgQ09ORklHX0VUSEVSX09OX0ZDQyAgICAgICAgICAgICAvKiBjcG0gRkNDIGV0aGVybmV0IHN1cHBvcnQgKi8KKyN1bmRlZiBDT05GSUdfRVRIRVJfT05fRkNDICAgICAgICAgICAgIC8qIGNwbSBGQ0MgZXRoZXJuZXQgc3VwcG9ydCAqLwogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQogI2RlZmluZSBDT05GSUdfU1BEX0VFUFJPTQkJLyogVXNlIFNQRCBFRVBST00gZm9yIEREUiBzZXR1cCovCiAjZGVmaW5lIENPTkZJR19ERFJfRExMCQkJLyogcG9zc2libGUgRExMIGZpeCBuZWVkZWQgKi8KQEAgLTM0OSwxMyArMzQ3LDE1IEBACiAjZW5kaWYJLyogQ09ORklHX1BDSSAqLwogCiAKLSNpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpCisjaWZkZWYgQ09ORklHX1RTRUNfRU5FVAogCiAjaWZuZGVmIENPTkZJR19ORVRfTVVMVEkKICNkZWZpbmUgQ09ORklHX05FVF9NVUxUSSAJMQogI2VuZGlmCiAKKyNpZm5kZWYgQ09ORklHX01JSQogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudCAqLworI2VuZGlmCiAjZGVmaW5lIENPTkZJR19UU0VDMQkxCiAjZGVmaW5lIENPTkZJR19UU0VDMV9OQU1FCSJUU0VDMCIKICNkZWZpbmUgQ09ORklHX1RTRUMyCTEKQEAgLTM2OSw5ICszNjksMTAgQEAKIC8qIE9wdGlvbnMgYXJlOiBUU0VDWzAtMV0gKi8KICNkZWZpbmUgQ09ORklHX0VUSFBSSU1FCQkiVFNFQzAiCiAKLSNlbGlmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykJLyogQ1BNIEZDQyBFdGhlcm5ldCAqLworI2VuZGlmIC8qIENPTkZJR19UU0VDX0VORVQgKi8KIAotI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MgICAqLworI2lmZGVmIENPTkZJR19FVEhFUl9PTl9GQ0MJLyogQ1BNIEZDQyBFdGhlcm5ldCAqLworCiAjdW5kZWYgIENPTkZJR19FVEhFUl9OT05FCS8qIGRlZmluZSBpZiBldGhlciBvbiBzb21ldGhpbmcgZWxzZSAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfSU5ERVggICAgICAyICAgICAgIC8qIHdoaWNoIGNoYW5uZWwgZm9yIGV0aGVyICovCiAKQEAgLTM5Miw3ICszOTMsMTAgQEAKICAgI2RlZmluZSBGRVRIM19SU1QJCTB4ODAKICNlbmRpZiAgCQkJCS8qIENPTkZJR19FVEhFUl9JTkRFWCAqLwogCi0jZGVmaW5lIENPTkZJR19NSUkJCQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQgKi8KKyNpZm5kZWYgQ09ORklHX01JSQorI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudCAqLworI2VuZGlmCisKICNkZWZpbmUgQ09ORklHX0JJVEJBTkdNSUkJCS8qIGJpdC1iYW5nIE1JSSBQSFkgbWFuYWdlbWVudCAqLwogCiAvKgpAQCAtNDMyLDQ2ICs0MzYsMzYgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKLSNpZiBkZWZpbmVkKENGR19SQU1CT09UKQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMCVwKLQkJCQkgfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQkgfCBDRkdfQ01EX1BDSQkJXAotCQkJCSB8IENGR19DTURfSTJDKQkJXAotCQkJCSYJCQlcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYJCVwKLQkJCQkgIHwgQ0ZHX0NNRF9MT0FEUykpCi0gICNlbGlmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfSTJDKQkJXAotCQkJCSYgfihDRkdfQ01EX0VOVikpCi0gICNlbGlmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9NSUkJCVwKLQkJCQkgfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQkgfCBDRkdfQ01EX0kyQykJCVwKLQkJCQkmIH4oQ0ZHX0NNRF9FTlYpKQotICAjZW5kaWYKLSNlbHNlCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9QQ0kJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0gICNlbGlmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfSTJDKQotICAjZWxpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9NSUkJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0gICNlbmRpZgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2lmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKKyAgICAjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC00ODIsNyArNDc2LDcgQEAKICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDEwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTUwMyw3ICs0OTcsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCkBAIC01MTUsNyArNTA5LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCkBAIC01NTMsOSArNTQ3LDExIEBACiAKICNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkgICAgICAgIFwKICAgICJuZXRkZXY9ZXRoMFwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJjb25zb2xlZGV2PXR0eVMwXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJyYW1kaXNrYWRkcj00MDAwMDBcMCIJCQkJCQlcCi0gICAicmFtZGlza2ZpbGU9eW91ci5yYW1kaXNrLnUtYm9vdFwwIgorICAgImNvbnNvbGVkZXY9dHR5Q1BNXDAiCQkJCQkJXAorICAgInJhbWRpc2thZGRyPTEwMDAwMDBcMCIJCQkJCQlcCisgICAicmFtZGlza2ZpbGU9eW91ci5yYW1kaXNrLnUtYm9vdFwwIgkJCQkJXAorICAgImZkdGFkZHI9NDAwMDAwXDAiCQkJCQkJCVwKKyAgICJmZHRmaWxlPW1wYzg1NjBhZHMuZHRiXDAiCiAKICNkZWZpbmUgQ09ORklHX05GU0JPT1RDT01NQU5ECSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAic2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcncgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC01NjMsMTQgKzU1OSwxNiBAQAogICAgICAgImlwPSRpcGFkZHI6JHNlcnZlcmlwOiRnYXRld2F5aXA6JG5ldG1hc2s6JGhvc3RuYW1lOiRuZXRkZXY6b2ZmICIgXAogICAgICAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiICAgICAgICAgICAgICAgICAgICAgXAogICAgInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgImJvb3RtICRsb2FkYWRkciIKKyAgICJ0ZnRwICRmZHRhZGRyICRmZHRmaWxlOyIJCQkJCQlcCisgICAiYm9vdG0gJGxvYWRhZGRyIC0gJGZkdGFkZHIiCiAKICNkZWZpbmUgQ09ORklHX1JBTUJPT1RDT01NQU5EIFwKICAgICJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSBydyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICJjb25zb2xlPSRjb25zb2xlZGV2LCRiYXVkcmF0ZSAkb3RoYm9vdGFyZ3M7IiAgICAgICAgICAgICAgICAgICAgIFwKICAgICJ0ZnRwICRyYW1kaXNrYWRkciAkcmFtZGlza2ZpbGU7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICJ0ZnRwICRsb2FkYWRkciAkYm9vdGZpbGU7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJib290bSAkbG9hZGFkZHIgJHJhbWRpc2thZGRyIgorICAgInRmdHAgJGZkdGFkZHIgJGZkdGZpbGU7IgkJCQkJCVwKKyAgICJib290bSAkbG9hZGFkZHIgJHJhbWRpc2thZGRyICRmZHRhZGRyIgogCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORCAgQ09ORklHX05GU0JPT1RDT01NQU5ECiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTY4TURTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU2OE1EUy5oCmluZGV4IDBmZjA0MTYuLmRjOWNiMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTY4TURTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NjhNRFMuaApAQCAtMjgsMjAgKzI4LDIxIEBACiAKIC8qIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zICovCiAjZGVmaW5lIENPTkZJR19CT09LRQkJMQkvKiBCT09LRSAqLwotI2RlZmluZSBDT05GSUdfRTUwMAkJCTEJLyogQk9PS0UgZTUwMCBmYW1pbHkgKi8KKyNkZWZpbmUgQ09ORklHX0U1MDAJCTEJLyogQk9PS0UgZTUwMCBmYW1pbHkgKi8KICNkZWZpbmUgQ09ORklHX01QQzg1eHgJCTEJLyogTVBDODU0MC82MC81NS80MS80OC82OCAqLwogI2RlZmluZSBDT05GSUdfTVBDODU2OAkJMQkvKiBNUEM4NTY4IHNwZWNpZmljICovCiAjZGVmaW5lIENPTkZJR19NUEM4NTY4TURTCTEJLyogTVBDODU2OE1EUyBib2FyZCBzcGVjaWZpYyAqLwogCi0jdW5kZWYgQ09ORklHX1BDSQorI2RlZmluZSBDT05GSUdfUENJCiAjZGVmaW5lIENPTkZJR19UU0VDX0VORVQgCQkvKiB0c2VjIGV0aGVybmV0IHN1cHBvcnQgKi8KKyN1bmRlZiBDT05GSUdfUUUJCQkvKiBFbmFibGUgUUUgKi8KICNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKICNkZWZpbmUgQ09ORklHX1NQRF9FRVBST00JCS8qIFVzZSBTUEQgRUVQUk9NIGZvciBERFIgc2V0dXAqLwogI2RlZmluZSBDT05GSUdfRERSX0RMTAkJCS8qIHBvc3NpYmxlIERMTCBmaXggbmVlZGVkICovCiAvKiNkZWZpbmUgQ09ORklHX0REUl8yVF9USU1JTkcJCSBTZXRzIHRoZSAyVCB0aW1pbmcgYml0ICovCiAKIC8qI2RlZmluZSBDT05GSUdfRERSX0VDQyovCQkJLyogb25seSBmb3IgRUNDIEREUiBtb2R1bGUgKi8KLS8qI2RlZmluZSBDT05GSUdfRUNDX0lOSVRfVklBX0REUkNPTlRST0xMRVIqLwkvKiAJIEREUiBjb250cm9sbGVyIG9yIERNQT8gKi8KKy8qI2RlZmluZSBDT05GSUdfRUNDX0lOSVRfVklBX0REUkNPTlRST0xMRVIqLwkvKiBERFIgY29udHJvbGxlciBvciBETUE/ICovCiAjZGVmaW5lIENPTkZJR19NRU1fSU5JVF9WQUxVRQkJMHhEZWFkQmVlZgogCiAKQEAgLTI5Nyw2ICsyOTgsNyBAQAogCiAjZGVmaW5lIE9GX0NQVQkJCSJQb3dlclBDLDg1NjhAMCIKICNkZWZpbmUgT0ZfU09DCQkJInNvYzg1NjhAZTAwMDAwMDAiCisjZGVmaW5lIE9GX1FFCQkJInFlQGUwMDgwMDAwIgogI2RlZmluZSBPRl9UQkNMSwkJKGJkLT5iaV9idXNmcmVxIC8gOCkKICNkZWZpbmUgT0ZfU1RET1VUX1BBVEgJCSIvc29jODU2OEBlMDAwMDAwMC9zZXJpYWxANDYwMCIKIApAQCAtMzA2LDExICszMDgsMTQgQEAKICNkZWZpbmUgQ09ORklHX0ZTTF9JMkMJCS8qIFVzZSBGU0wgY29tbW9uIEkyQyBkcml2ZXIgKi8KICNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCQkvKiBJMkMgd2l0aCBoYXJkd2FyZSBzdXBwb3J0Ki8KICN1bmRlZglDT05GSUdfU09GVF9JMkMJCQkvKiBJMkMgYml0LWJhbmdlZCAqLworI2RlZmluZSBDT05GSUdfSTJDX01VTFRJX0JVUworI2RlZmluZSBDT05GSUdfSTJDX0NNRF9UUkVFCiAjZGVmaW5lIENGR19JMkNfU1BFRUQJCTQwMDAwMAkvKiBJMkMgc3BlZWQgYW5kIHNsYXZlIGFkZHJlc3MgKi8KLSNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkweDU3CisjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFIJMHg1MgogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCi0jZGVmaW5lIENGR19JMkNfTk9QUk9CRVMgICAgICAgIHsweDY5fQkvKiBEb24ndCBwcm9iZSB0aGVzZSBhZGRycyAqLworI2RlZmluZSBDRkdfSTJDX05PUFJPQkVTICAgICAgICB7ezAsMHg2OX19CS8qIERvbid0IHByb2JlIHRoZXNlIGFkZHJzICovCiAjZGVmaW5lIENGR19JMkNfT0ZGU0VUCQkweDMwMDAKKyNkZWZpbmUgQ0ZHX0kyQzJfT0ZGU0VUCQkweDMxMDAKIAogLyoKICAqIEdlbmVyYWwgUENJCkBAIC0zMTgsNyArMzIzLDcgQEAKICAqLwogI2RlZmluZSBDRkdfUENJMV9NRU1fQkFTRQkweDgwMDAwMDAwCiAjZGVmaW5lIENGR19QQ0kxX01FTV9QSFlTCUNGR19QQ0kxX01FTV9CQVNFCi0jZGVmaW5lIENGR19QQ0kxX01FTV9TSVpFCTB4MTAwMDAwMDAJLyogMjU2TSAqLworI2RlZmluZSBDRkdfUENJMV9NRU1fU0laRQkweDIwMDAwMDAwCS8qIDUxMk0gKi8KICNkZWZpbmUgQ0ZHX1BDSTFfSU9fQkFTRQkweDAwMDAwMDAwCiAjZGVmaW5lIENGR19QQ0kxX0lPX1BIWVMJMHhlMjAwMDAwMAogI2RlZmluZSBDRkdfUENJMV9JT19TSVpFCTB4MDA4MDAwMDAJLyogOE0gKi8KQEAgLTMzNyw2ICszNDIsNDQgQEAKICNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQogI2RlZmluZSBDT05GSUdfUENJX1BOUAkgICAgICAgICAgICAgICAJLyogZG8gcGNpIHBsdWctYW5kLXBsYXkgKi8KIAorI2lmZGVmIENPTkZJR19RRQorLyoKKyAqIFFFIFVFQyBldGhlcm5ldCBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1VFQ19FVEgKKyNpZm5kZWYgQ09ORklHX1RTRUNfRU5FVAorI2RlZmluZSBDT05GSUdfRVRIUFJJTUUgICAgICAgICAiRnJlZXNjYWxlIEdFVEgiCisjZW5kaWYKKyNkZWZpbmUgQ09ORklHX1BIWV9NT0RFX05FRURfQ0hBTkdFCisjZGVmaW5lIENPTkZJR19lVFNFQ19NRElPX0JVUworCisjaWZkZWYgQ09ORklHX2VUU0VDX01ESU9fQlVTCisjZGVmaW5lIENPTkZJR19NSUlNX0FERFJFU1MgCTB4RTAwMjQ1MjAKKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19VRUNfRVRIMSAgICAgICAgIC8qIEdFVEgxICovCisKKyNpZmRlZiBDT05GSUdfVUVDX0VUSDEKKyNkZWZpbmUgQ0ZHX1VFQzFfVUNDX05VTSAgICAgICAgMCAgICAgICAvKiBVQ0MxICovCisjZGVmaW5lIENGR19VRUMxX1JYX0NMSyAgICAgICAgIFFFX0NMS19OT05FCisjZGVmaW5lIENGR19VRUMxX1RYX0NMSyAgICAgICAgIFFFX0NMSzE2CisjZGVmaW5lIENGR19VRUMxX0VUSF9UWVBFICAgICAgIEdJR0FfRVRICisjZGVmaW5lIENGR19VRUMxX1BIWV9BRERSICAgICAgIDcKKyNkZWZpbmUgQ0ZHX1VFQzFfSU5URVJGQUNFX01PREUgRU5FVF8xMDAwX0dNSUkKKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19VRUNfRVRIMiAgICAgICAgIC8qIEdFVEgyICovCisKKyNpZmRlZiBDT05GSUdfVUVDX0VUSDIKKyNkZWZpbmUgQ0ZHX1VFQzJfVUNDX05VTSAgICAgICAgMSAgICAgICAvKiBVQ0MyICovCisjZGVmaW5lIENGR19VRUMyX1JYX0NMSyAgICAgICAgIFFFX0NMS19OT05FCisjZGVmaW5lIENGR19VRUMyX1RYX0NMSyAgICAgICAgIFFFX0NMSzE2CisjZGVmaW5lIENGR19VRUMyX0VUSF9UWVBFICAgICAgIEdJR0FfRVRICisjZGVmaW5lIENGR19VRUMyX1BIWV9BRERSICAgICAgIDEKKyNkZWZpbmUgQ0ZHX1VFQzJfSU5URVJGQUNFX01PREUgRU5FVF8xMDAwX0dNSUkKKyNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19RRSAqLworCiAjdW5kZWYgQ09ORklHX0VFUFJPMTAwCiAjdW5kZWYgQ09ORklHX1RVTElQCiAKQEAgLTM0NSwxMyArMzg4LDEyIEBACiAKICNlbmRpZgkvKiBDT05GSUdfUENJICovCiAKLQotI2lmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKLQogI2lmbmRlZiBDT05GSUdfTkVUX01VTFRJCiAjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkgCTEKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQorCiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50ICovCiAjZGVmaW5lIENPTkZJR19UU0VDMQkxCiAjZGVmaW5lIENPTkZJR19UU0VDMV9OQU1FCSJlVFNFQzAiCkBAIC0zODMsMTkgKzQyNSwyOSBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UgKi8KIAorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BDSSBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgXAotCQkJCXwgQ0ZHX0NNRF9NSUkpCi0jZWxzZQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgXAotCQkJCXwgQ0ZHX0NNRF9NSUkpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTQwNSw3ICs0NTcsNyBAQAogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNDI1LDcgKzQ3Nyw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSovCiAjZW5kaWYKIApAQCAtNDM3LDcgKzQ4OSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpAQCAtNDQ3LDEyICs0OTksMTUgQEAKICAqLwogCiAvKiBUaGUgbWFjIGFkZHJlc3NlcyBmb3IgYWxsIGV0aGVybmV0IGludGVyZmFjZSAqLwotI2lmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpIHx8IGRlZmluZWQoQ09ORklHX1VFQ19FVEgpCisjZGVmaW5lIENPTkZJR19IQVNfRVRIMAogI2RlZmluZSBDT05GSUdfRVRIQUREUiAgIDAwOkUwOjBDOjAwOjAwOkZECiAjZGVmaW5lIENPTkZJR19IQVNfRVRIMQogI2RlZmluZSBDT05GSUdfRVRIMUFERFIgIDAwOkUwOjBDOjAwOjAxOkZECiAjZGVmaW5lIENPTkZJR19IQVNfRVRIMgogI2RlZmluZSBDT05GSUdfRVRIMkFERFIgIDAwOkUwOjBDOjAwOjAyOkZECisjZGVmaW5lIENPTkZJR19IQVNfRVRIMworI2RlZmluZSBDT05GSUdfRVRIM0FERFIgIDAwOkUwOjBDOjAwOjAzOkZECiAjZW5kaWYKIAogI2RlZmluZSBDT05GSUdfSVBBRERSICAgIDE5Mi4xNjguMS4yNTMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NjQxSFBDTi5oIGIvaW5jbHVkZS9jb25maWdzL01QQzg2NDFIUENOLmgKaW5kZXggMTJhZjI0Zi4uNjRkY2JkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzg2NDFIUENOLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg2NDFIUENOLmgKQEAgLTQ2LDggKzQ2LDEwIEBACiAKICNkZWZpbmUgQ0ZHX1JFU0VUX0FERFJFU1MgICAgMHhmZmYwMDEwMAogCi0vKiN1bmRlZiBDT05GSUdfUENJKi8KLSNkZWZpbmUgQ09ORklHX1BDSQorI2RlZmluZSBDT05GSUdfUENJCQkxCS8qIEVuYWJsZSBQQ0kvUENJRSAqLworI2RlZmluZSBDT05GSUdfUENJMQkJMQkvKiBQQ0lFIGNvbnRyb2xlciAxIChVTEkgYnJpZGdlKSAqLworI2RlZmluZSBDT05GSUdfUENJMgkJMQkvKiBQQ0lFIGNvbnRyb2xlciAyIChzbG90KSAqLworI2RlZmluZSBDT05GSUdfRlNMX1BDSV9JTklUCTEJLyogVXNlIGNvbW1vbiBGU0wgaW5pdCBjb2RlICovCiAKICNkZWZpbmUgQ09ORklHX1RTRUNfRU5FVCAJCS8qIHRzZWMgZXRoZXJuZXQgc3VwcG9ydCAqLwogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQpAQCAtNzYsNiArNzgsOSBAQAogI2RlZmluZSBMMl9FTkFCTEUJKEwyQ1JfTDJFKQogCiAjaWZuZGVmIENPTkZJR19TWVNfQ0xLX0ZSRVEKKyNpZm5kZWYgX19BU1NFTUJMWV9fCitleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfYm9hcmRfc3lzX2Nsayh1bnNpZ25lZCBsb25nIGR1bW15KTsKKyNlbmRpZgogI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRICAgICBnZXRfYm9hcmRfc3lzX2NsaygwKQogI2VuZGlmCiAKQEAgLTkzLDYgKzk4LDkgQEAKICNkZWZpbmUgQ0ZHX0NDU1JCQVIJCTB4ZjgwMDAwMDAJLyogcmVsb2NhdGVkIENDU1JCQVIgKi8KICNkZWZpbmUgQ0ZHX0lNTVIJCUNGR19DQ1NSQkFSCS8qIFBRSUkgdXNlcyBDRkdfSU1NUiAqLwogCisjZGVmaW5lIENGR19QQ0kxX0FERFIJCShDRkdfQ0NTUkJBUisweDgwMDApCisjZGVmaW5lIENGR19QQ0kyX0FERFIJCShDRkdfQ0NTUkJBUisweDkwMDApCisKIC8qCiAgKiBERFIgU2V0dXAKICAqLwpAQCAtMjMyLDcgKzI0MCw3IEBACiAjZGVmaW5lIENGR19JTklUX1NQX09GRlNFVAlDRkdfR0JMX0RBVEFfT0ZGU0VUCiAKICNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCSAgICAJKDI1NiAqIDEwMjQpICAgIC8qIFJlc2VydmUgMjU2IGtCIGZvciBNb24gKi8KLSNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JICAgIAkoMTI4ICogMTAyNCkgICAgLyogUmVzZXJ2ZWQgZm9yIG1hbGxvYyAqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkgICAgCSgxMDI0ICogMTAyNCkgICAgLyogUmVzZXJ2ZWQgZm9yIG1hbGxvYyAqLwogCiAvKiBTZXJpYWwgUG9ydCAqLwogI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgMQpAQCAtMjk2LDkgKzMwNCw5IEBACiAjZGVmaW5lIENGR19QQ0kxX01FTV9CQVNFCTB4ODAwMDAwMDAKICNkZWZpbmUgQ0ZHX1BDSTFfTUVNX1BIWVMJQ0ZHX1BDSTFfTUVNX0JBU0UKICNkZWZpbmUgQ0ZHX1BDSTFfTUVNX1NJWkUJMHgyMDAwMDAwMAkvKiA1MTJNICovCi0jZGVmaW5lIENGR19QQ0kxX0lPX0JBU0UJMHhlMjAwMDAwMAotI2RlZmluZSBDRkdfUENJMV9JT19QSFlTCUNGR19QQ0kxX0lPX0JBU0UKLSNkZWZpbmUgQ0ZHX1BDSTFfSU9fU0laRQkweDEwMDAwMDAJLyogMTZNICovCisjZGVmaW5lIENGR19QQ0kxX0lPX0JBU0UJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfUENJMV9JT19QSFlTCTB4ZTIwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSTFfSU9fU0laRQkweDAwMTAwMDAwCS8qIDFNICovCiAKIC8qIFBDSSB2aWV3IG9mIFN5c3RlbSBNZW1vcnkgKi8KICNkZWZpbmUgQ0ZHX1BDSV9NRU1PUllfQlVTICAgICAgMHgwMDAwMDAwMApAQCAtMzExLDEwICszMTksMTAgQEAKIAogI2RlZmluZSBDRkdfUENJMl9NRU1fQkFTRQkweGEwMDAwMDAwCiAjZGVmaW5lIENGR19QQ0kyX01FTV9QSFlTCUNGR19QQ0kyX01FTV9CQVNFCi0jZGVmaW5lIENGR19QQ0kyX01FTV9TSVpFCTB4MTAwMDAwMDAJLyogMjU2TSAqLwotI2RlZmluZSBDRkdfUENJMl9JT19CQVNFCTB4ZTMwMDAwMDAKLSNkZWZpbmUgQ0ZHX1BDSTJfSU9fUEhZUwlDRkdfUENJMl9JT19CQVNFCi0jZGVmaW5lIENGR19QQ0kyX0lPX1NJWkUJMHgxMDAwMDAwCS8qIDE2TSAqLworI2RlZmluZSBDRkdfUENJMl9NRU1fU0laRQkweDIwMDAwMDAwCS8qIDUxMk0gKi8KKyNkZWZpbmUgQ0ZHX1BDSTJfSU9fQkFTRQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19QQ0kyX0lPX1BIWVMJMHhlMzAwMDAwMAorI2RlZmluZSBDRkdfUENJMl9JT19TSVpFCTB4MDAxMDAwMDAJLyogMU0gKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIApAQCAtMzMwLDEyICszMzgsNDMgQEAKICN1bmRlZiBDT05GSUdfRUVQUk8xMDAKICN1bmRlZiBDT05GSUdfVFVMSVAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVVNCIHN1cHBvcnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENPTkZJR19QQ0lfT0hDSQkJMQorI2RlZmluZSBDT05GSUdfVVNCX09IQ0lfTkVXCQkxCisjZGVmaW5lIENPTkZJR19VU0JfS0VZQk9BUkQJMQorI2RlZmluZSBDRkdfREVWSUNFX0RFUkVHSVNURVIKKyNkZWZpbmUgQ0ZHX1VTQl9FVkVOVF9QT0xMCTEKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1NMT1RfTkFNRSAJIm9oY2lfcGNpIgorI2RlZmluZSBDRkdfVVNCX09IQ0lfTUFYX1JPT1RfUE9SVFMgMTUKKwogI2lmICFkZWZpbmVkKENPTkZJR19QQ0lfUE5QKQogICAgICNkZWZpbmUgUENJX0VORVQwX0lPQUREUgkweGUwMDAwMDAwCiAgICAgI2RlZmluZSBQQ0lfRU5FVDBfTUVNQUREUgkweGUwMDAwMDAwCiAgICAgI2RlZmluZSBQQ0lfSURTRUxfTlVNQkVSCTB4MGMgCS8qIHNsb3QwLT4zKElEU0VMKT0xMi0+MTUgKi8KICNlbmRpZgogCisvKlBDSUUgdmlkZW8gY2FyZCB1c2VkKi8KKyNkZWZpbmUgVklERU9fSU9fT0ZGU0VUCQlDRkdfUENJMl9JT19QSFlTCisKKy8qUENJIHZpZGVvIGNhcmQgdXNlZCovCisvKiNkZWZpbmUgVklERU9fSU9fT0ZGU0VUCUNGR19QQ0kxX0lPX1BIWVMqLworCisvKiB2aWRlbyAqLworI2RlZmluZSBDT05GSUdfVklERU8KKworI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPKQorI2RlZmluZSBDT05GSUdfQklPU0VNVQorI2RlZmluZSBDT05GSUdfQ0ZCX0NPTlNPTEUKKyNkZWZpbmUgQ09ORklHX1ZJREVPX1NXX0NVUlNPUgorI2RlZmluZSBDT05GSUdfVkdBX0FTX1NJTkdMRV9ERVZJQ0UKKyNkZWZpbmUgQ09ORklHX0FUSV9SQURFT05fRkIKKyNkZWZpbmUgQ09ORklHX1ZJREVPX0xPR08KKy8qI2RlZmluZSBDT05GSUdfQ09OU09MRV9DVVJTT1IqLworI2RlZmluZSBDRkdfSVNBX0lPX0JBU0VfQUREUkVTUyBDRkdfUENJMl9JT19QSFlTCisjZW5kaWYKKwogI3VuZGVmIENPTkZJR19QQ0lfU0NBTl9TSE9XCQkvKiBzaG93IHBjaSBkZXZpY2VzIG9uIHN0YXJ0dXAgKi8KIAogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMzQ5LDYgKzM4OCw4IEBACiAjZGVmaW5lIENGR19TQ1NJX01BWERFVklDRQlDRkdfU0NTSV9NQVhfREVWSUNFCiAjZW5kaWYKIAorI2RlZmluZSBDT05GSUdfTVBDODZYWF9QQ0kyCisKICNlbmRpZgkvKiBDT05GSUdfUENJICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpCkBAIC0zOTYsMjAgKzQzNywyMCBAQAogICogMHhhMDAwXzAwMDAgIDUxMk0gICBQQ0ktRXhwcmVzcyAyIE1lbW9yeQogICoJQ2hhbmdlZCBpdCBmb3Igb3BlcmF0aW5nIGZyb20gMHhkMDAwMDAwMAogICovCi0jZGVmaW5lIENGR19EQkFUMUwgICAgICAoIENGR19QQ0kxX01FTV9CQVNFIHwgQkFUTF9QUF9SVyBcCisjZGVmaW5lIENGR19EQkFUMUwgICAgICAoIENGR19QQ0kxX01FTV9QSFlTIHwgQkFUTF9QUF9SVyBcCiAJCQl8IEJBVExfQ0FDSEVJTkhJQklUIHwgQkFUTF9HVUFSREVEU1RPUkFHRSkKLSNkZWZpbmUgQ0ZHX0RCQVQxVSAgICAgIChDRkdfUENJMV9NRU1fQkFTRSB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQotI2RlZmluZSBDRkdfSUJBVDFMICAgICAgKENGR19QQ0kxX01FTV9CQVNFIHwgQkFUTF9QUF9SVyB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfREJBVDFVCShDRkdfUENJMV9NRU1fUEhZUyB8IEJBVFVfQkxfMUcgfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0lCQVQxTAkoQ0ZHX1BDSTFfTUVNX1BIWVMgfCBCQVRMX1BQX1JXIHwgQkFUTF9DQUNIRUlOSElCSVQpCiAjZGVmaW5lIENGR19JQkFUMVUgICAgICBDRkdfREJBVDFVCiAKIC8qCiAgKiBCQVQyICAgICAgICAgNTEyTSAgIENhY2hlLWluaGliaXRlZCwgZ3VhcmRlZAogICogMHhjMDAwXzAwMDAgIDUxMk0gICBSYXBpZElPIE1lbW9yeQogICovCi0jZGVmaW5lIENGR19EQkFUMkwgICAgICAoQ0ZHX1JJT19NRU1fQkFTRSB8IEJBVExfUFBfUlcgXAorI2RlZmluZSBDRkdfREJBVDJMICAgICAgKENGR19SSU9fTUVNX1BIWVMgfCBCQVRMX1BQX1JXIFwKIAkJCXwgQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX0dVQVJERURTVE9SQUdFKQotI2RlZmluZSBDRkdfREJBVDJVICAgICAgKENGR19SSU9fTUVNX0JBU0UgfCBCQVRVX0JMXzUxMk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKLSNkZWZpbmUgQ0ZHX0lCQVQyTCAgICAgIChDRkdfUklPX01FTV9CQVNFIHwgQkFUTF9QUF9SVyB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfREJBVDJVCShDRkdfUklPX01FTV9QSFlTIHwgQkFUVV9CTF81MTJNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19JQkFUMkwJKENGR19SSU9fTUVNX1BIWVMgfCBCQVRMX1BQX1JXIHwgQkFUTF9DQUNIRUlOSElCSVQpCiAjZGVmaW5lIENGR19JQkFUMlUgICAgICBDRkdfREJBVDJVCiAKIC8qCkBAIC00MjgsMTAgKzQ2OSwxMCBAQAogICogMHhlMzAwXzAwMDAgIDE2TSAgICBQQ0ktRXhwcmVzcyAyIEkvMAogICogICAgTm90ZSB0aGF0IHRoaXMgaXMgYXQgMHhlMDAwMDAwMAogICovCi0jZGVmaW5lIENGR19EQkFUNEwgICAgICAoIENGR19QQ0kxX0lPX0JBU0UgfCBCQVRMX1BQX1JXIFwKKyNkZWZpbmUgQ0ZHX0RCQVQ0TCAgICAgICggQ0ZHX1BDSTFfSU9fUEhZUyB8IEJBVExfUFBfUlcgXAogCQkJfCBCQVRMX0NBQ0hFSU5ISUJJVCB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCi0jZGVmaW5lIENGR19EQkFUNFUgICAgICAoQ0ZHX1BDSTFfSU9fQkFTRSB8IEJBVFVfQkxfMzJNIHwgQkFUVV9WUyB8IEJBVFVfVlApCi0jZGVmaW5lIENGR19JQkFUNEwgICAgICAoQ0ZHX1BDSTFfSU9fQkFTRSB8IEJBVExfUFBfUlcgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKKyNkZWZpbmUgQ0ZHX0RCQVQ0VQkoQ0ZHX1BDSTFfSU9fUEhZUyB8IEJBVFVfQkxfMzJNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19JQkFUNEwJKENGR19QQ0kxX0lPX1BIWVMgfCBCQVRMX1BQX1JXIHwgQkFUTF9DQUNIRUlOSElCSVQpCiAjZGVmaW5lIENGR19JQkFUNFUgICAgICBDRkdfREJBVDRVCiAKIC8qCkBAIC00NjMsOCArNTA0LDggQEAKICAqLwogI2lmbmRlZiBDRkdfUkFNQk9PVAogICAgICNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9GTEFTSAkxCi0gICAgI2RlZmluZSBDRkdfRU5WX0FERFIJCShDRkdfTU9OSVRPUl9CQVNFICsgMHg0MDAwMCkKLSAgICAjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCQkweDQwMDAwCS8qIDI1Nksob25lIHNlY3RvcikgZm9yIGVudiAqLworICAgICNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkoQ0ZHX01PTklUT1JfQkFTRSArIDB4NjAwMDApCisgICAgI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkJMHgxMDAwMAkvKiA2NEsob25lIHNlY3RvcikgZm9yIGVudiAqLwogICAgICNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDIwMDAKICNlbHNlCiAgICAgI2RlZmluZSBDRkdfRU5WX0lTX05PV0hFUkUJMQkvKiBTdG9yZSBFTlYgaW4gbWVtb3J5IG9ubHkgKi8KQEAgLTQ3NSwzOSArNTE2LDM0IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisKICNpZiBkZWZpbmVkKENGR19SQU1CT09UKQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMCVwKLQkJCQkgfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQkgfCBDRkdfQ01EX1BDSQkJXAotCQkJCSB8IENGR19DTURfSTJDCQlcCi0JCQkJIHwgQ0ZHX0NNRF9TQ1NJCQlcCi0JCQkJIHwgQ0ZHX0NNRF9FWFQyKQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVikpCi0gICNlbHNlCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwJXAotCQkJCSB8IENGR19DTURfUElORwkJXAotCQkJCSB8IENGR19DTURfSTJDKQkJXAotCQkJCSYJCQlcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYpKQotICAjZW5kaWYKLSNlbHNlCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9QQ0kJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMJCVwKLQkJCQl8IENGR19DTURfU0NTSQkJXAotCQkJCXwgQ0ZHX0NNRF9FWFQyKQotICAjZWxzZQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0gICNlbmRpZgorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgogI2VuZGlmCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9TQ1NJCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0VYVDIKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC01MTgsNyArNTU0LDcgQEAKICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDIwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTUzOSw4ICs1NzUsOCBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyAgICAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCiAvKgpAQCAtNTUxLDkgKzU4Nyw5IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwotI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyAgICAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLworICAgICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NVVNFTktJLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVVTRU5LSS5oCmluZGV4IGRhNTJlMGUuLmY4Y2YwMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NVVNFTktJLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01VU0VOS0kuaApAQCAtNTIsMTEgKzUyLDIwIEBACiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgCSovCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCiAKIC8qCkBAIC0yODAsNyArMjg5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NVkJMVUUuaCBiL2luY2x1ZGUvY29uZmlncy9NVkJMVUUuaAppbmRleCA4OGVlZmExLi4wZGVmYWZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVZCTFVFLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01WQkxVRS5oCkBAIC03NiwxNSArNzYsNDQgQEAKICNkZWZpbmUgQ09ORklHX1pFUk9fQk9PVERFTEFZX0NIRUNLCiAjZGVmaW5lIENPTkZJR19SRVNFVF9UT19SRVRSWQkJNjAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ0ZHX0NNRF9BU0tFTlYgfCBDRkdfQ01EX0JPT1REIHwgQ0ZHX0NNRF9DQUNIRSB8IENGR19DTURfREhDUAl8IFwKLQkJCQkgIENGR19DTURfRUNITwkgfCBDRkdfQ01EX0VOViAgIHwgQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfSU1JCXwgXAotCQkJCSAgQ0ZHX0NNRF9JUlEJIHwgQ0ZHX0NNRF9ORVQJIHwgQ0ZHX0NNRF9QQ0kJIHwgQ0ZHX0NNRF9SVU4gICApCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQk9PVEQKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KIAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgKCAweGZmZmZmZmZmICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfTklTRE9NQUlOCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9OVFBTRVJWRVIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1RJTUVPRkZTRVQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAJKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTMxMCw3ICszMzksNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NVlMxLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVZTMS5oCmluZGV4IDU5OTU5MTguLjc1ZWZkMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NVlMxLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01WUzEuaApAQCAtNjMsMjcgKzYzLDM2IEBACiAKICN1bmRlZiAgQ09ORklHX0NBTl9EUklWRVIgICAgICAgLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkICAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9WRU5ET1JFWCApCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfVkVORE9SRVgKIAogI3VuZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCiAjdW5kZWYgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotLyogTVZzZW5zb3IgdXNlcyBhIHJlYWxseSBtaW5pbWFsIFUtQm9vdCAhICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENGR19DTURfTE9BRFMJfCBcCi0JCQkJQ0ZHX0NNRF9MT0FEQgl8IFwKLQkJCQlDRkdfQ01EX0lNSQl8IFwKLQkJCQlDRkdfQ01EX0ZMQVNICXwgXAotCQkJCUNGR19DTURfTUVNT1JZCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VOVgl8IFwKLQkJCQlDRkdfQ01EX0JPT1RECXwgXAotCQkJCUNGR19DTURfUlVOCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0JPT1RECisjZGVmaW5lIENPTkZJR19DTURfUlVOCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTk2LDcgKzEwNSw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIgICAgICI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNzIsNyArMTgxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL05DNjUwLmggYi9pbmNsdWRlL2NvbmZpZ3MvTkM2NTAuaAppbmRleCBhMTJjOGRhLi5jMDUxYTM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTkM2NTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTkM2NTAuaApAQCAtODUsNyArODUsMTUgQEAKIAogI3VuZGVmCUNPTkZJR19TVEFUVVNfTEVECQkvKiBTdGF0dXMgTEVEIGRpc2FibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUJQ09ORklHX0ZFQ19FTkVUCQkxCS8qIHVzZSBGRUMgZXRoZXJuZXQgICovCiAjZGVmaW5lIEZFQ19FTkVUCkBAIC0xMzQsMjUgKzE0MiwyOCBAQAogI2RlZmluZSBDT05GSUdfUlRDX1BDRjg1NjMKICNkZWZpbmUgQ0ZHX0kyQ19SVENfQUREUgkJMHg1MQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMzAsNyArMjQxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL05FVFBIT05FLmggYi9pbmNsdWRlL2NvbmZpZ3MvTkVUUEhPTkUuaAppbmRleCA0NDRmNzIxLi5iYjNkMTlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTkVUUEhPTkUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTkVUUEhPTkUuaApAQCAtODIsNyArODIsMTUgQEAKICNkZWZpbmUJQ09ORklHX1NUQVRVU19MRUQJMQkvKiBTdGF0dXMgTEVEIGVuYWJsZWQJCSovCiAjZGVmaW5lIENPTkZJR19CT0FSRF9TUEVDSUZJQ19MRUQJLyogdmVyc2lvbiBoYXMgYm9hcmQgc3BlY2lmaWMgbGVkcyAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCQkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFIHwgQ09ORklHX0JPT1RQX05JU0RPTUFJTikKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9OSVNET01BSU4KIAogI3VuZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCiAjdW5kZWYgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTEwNSwyMCArMTEzLDIyIEBACiAKICNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUJMQkvKiBhbGxvdyBtb2RpZmljYXRpb24gb2YgdmVuZG9yIHBhcmFtcyAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HICAJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkgCXwgXAotCQkJCUNGR19DTURfQ0RQCSAgXAotCQkJCSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9DRFAKKwogCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YJMQogI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCkBAIC0xMjgsNyArMTM4LDcgQEAKICNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCTEKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIyMCw3ICsyMzAsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTkVUVEEuaCBiL2luY2x1ZGUvY29uZmlncy9ORVRUQS5oCmluZGV4IDI1YjYzNDUuLjE5NzQzYzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ORVRUQS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ORVRUQS5oCkBAIC03Nyw3ICs3NywxNiBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCQkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFIHwgQ09ORklHX0JPT1RQX05JU0RPTUFJTikKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9OSVNET01BSU4KKwogCiAjdW5kZWYgQ09ORklHX01BQ19QQVJUSVRJT04KICN1bmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMTExLDI2ICsxMjAsMjggQEAKIAkJCQkgQ0ZHX1BPU1RfQ09ERUMJICAgfCBcCiAJCQkJIENGR19QT1NUX0RTUAkgICApCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9DRFAJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElBRyAgICB8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfTUlJIAl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ01DSUEJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HICAJfCBcCi0JCQkJMCkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9DRFAKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDTUNJQQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YJMQogI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCkBAIC0xNDAsNyArMTUxLDcgQEAKICNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCTEKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIyMyw3ICsyMzQsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTkVUVEEyLmggYi9pbmNsdWRlL2NvbmZpZ3MvTkVUVEEyLmgKaW5kZXggZTIwZTcyNC4uZmI4MDg1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL05FVFRBMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ORVRUQTIuaApAQCAtODIsNyArODIsMTYgQEAKICNkZWZpbmUJQ09ORklHX1NUQVRVU19MRUQJMQkvKiBTdGF0dXMgTEVEIGVuYWJsZWQJCSovCiAjZGVmaW5lIENPTkZJR19CT0FSRF9TUEVDSUZJQ19MRUQJLyogdmVyc2lvbiBoYXMgYm9hcmQgc3BlY2lmaWMgbGVkcyAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCQkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFIHwgQ09ORklHX0JPT1RQX05JU0RPTUFJTikKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9OSVNET01BSU4KKwogCiAjdW5kZWYgQ09ORklHX01BQ19QQVJUSVRJT04KICN1bmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMTA1LDIwICsxMTQsMjIgQEAKIAogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQkxCS8qIGFsbG93IG1vZGlmaWNhdGlvbiBvZiB2ZW5kb3IgcGFyYW1zICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BJTkcgIAl8IFwKLQkJCQlDRkdfQ01EX01JSSAJfCBcCi0JCQkJQ0ZHX0NNRF9DRFAJICBcCi0JCQkJKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0NEUAorCiAKICNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfRgkxCiAjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KQEAgLTEyOCw3ICsxMzksNyBAQAogI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIJMQogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjIwLDcgKzIzMSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ORVRWSUEuaCBiL2luY2x1ZGUvY29uZmlncy9ORVRWSUEuaAppbmRleCBlMzBiZTA5Li5kNGNiOWU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTkVUVklBLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL05FVFZJQS5oCkBAIC04MSwzNSArODEsNDUgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSB8IENPTkZJR19CT09UUF9OSVNET01BSU4pCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfTklTRE9NQUlOCisKIAogI3VuZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCiAjdW5kZWYgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFNfQkFTRSAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HICkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUElORwogCiAjaWYgZGVmaW5lZChDT05GSUdfTkVUVklBX1ZFUlNJT04pICYmIENPTkZJR19ORVRWSUFfVkVSU0lPTiA+PSAyCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DT01NQU5EU19CQVNFIHwgQ0ZHX0NNRF9OQU5EKQotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlDT05GSUdfQ09NTUFORFNfQkFTRQorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKICNlbmRpZgogCisKICNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfRiAxCiAjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE5Miw3ICsyMDIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTlNDVS5oIGIvaW5jbHVkZS9jb25maWdzL05TQ1UuaAppbmRleCBkOTk0NDIwLi40Y2Q0NDcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTlNDVS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9OU0NVLmgKQEAgLTg0LDcgKzg0LDE1IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtOTMsMTYgKzEwMSwxOSBAQAogCiAjZGVmaW5lCUNPTkZJR19JU1AxMzYyX1VTQgkJLyogSVNQMTM2MiBVU0IgT1RHIGNvbnRyb2xsZXIJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTExNyw3ICsxMjgsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMDEsNyArMjEyLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL05YODIzLmggYi9pbmNsdWRlL2NvbmZpZ3MvTlg4MjMuaAppbmRleCAxY2I4YjhmLi41MjRhYTA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTlg4MjMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTlg4MjMuaApAQCAtNTUsMjIgKzU1LDM1IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCiAjdW5kZWYJQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCQkvKiBkb24ndCBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCwgZm9yIG5vdwkgICAgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9BVVRPU0NSSVBUKQogI2RlZmluZSBDT05GSUdfQVVUT1NDUklQVAogCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVVUT1NDUklQVAorCisKIC8qIGNhbGwgdmFyaW91cyBnZW5lcmljIGZ1bmN0aW9ucyAqLwogI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMTUyLDcgKzE2NSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICAgICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL09DUlRDLmggYi9pbmNsdWRlL2NvbmZpZ3MvT0NSVEMuaAppbmRleCBhYTlkMWJhLi41ODQwZWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvT0NSVEMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvT0NSVEMuaApAQCAtNTQsMjAgKzU0LDMyIEBACiAjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMAkvKiBQSFkgYWRkcmVzcwkJCSovCiAjZGVmaW5lIENPTkZJR19MWFQ5NzFfTk9fU0xFRVAgIDEgICAgICAgLyogZGlzYWJsZSBzbGVlcCBtb2RlIGluIExYVDk3MSAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1NEUkFNX0JBTkswCTEJLyogaW5pdCBvbmJvYXJkIFNEUkFNIGJhbmsgMAkqLwpAQCAtNzcsNyArODksNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMTUsNyArMjI3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJLyogRm9yIEFNQ0MgNDA1IENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvT1JTRy5oIGIvaW5jbHVkZS9jb25maWdzL09SU0cuaAppbmRleCAyZTdjNTA1Li45MzdkZjIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvT1JTRy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9PUlNHLmgKQEAgLTU0LDIwICs1NCwzMiBAQAogI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTAJLyogUEhZIGFkZHJlc3MJCQkqLwogI2RlZmluZSBDT05GSUdfTFhUOTcxX05PX1NMRUVQICAxICAgICAgIC8qIGRpc2FibGUgc2xlZXAgbW9kZSBpbiBMWFQ5NzEgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCiAjZGVmaW5lIENPTkZJR19TRFJBTV9CQU5LMAkxCS8qIGluaXQgb25ib2FyZCBTRFJBTSBiYW5rIDAJKi8KQEAgLTc3LDcgKzg5LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjEzLDcgKzIyNSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCS8qIEZvciBBTUNDIDQwNSBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL09YQy5oIGIvaW5jbHVkZS9jb25maWdzL09YQy5oCmluZGV4IDc4NzQwN2MuLjhkNjFiY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9PWEMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvT1hDLmgKQEAgLTUxLDEwICs1MSwyMyBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKICNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfRUxGKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCSovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTI5OSw3ICszMTIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI0MCBDUFUJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1AzRzQuaCBiL2luY2x1ZGUvY29uZmlncy9QM0c0LmgKaW5kZXggYTkzM2UxYi4uZWY5NzBmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1AzRzQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUDNHNC5oCkBAIC0xMjAsMzAgKzEyMCw0MCBAQAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogI3VuZGVmCUNPTkZJR19BTFRJVkVDICAgICAgICAgICAgICAgICAgLyogdW5kZWYgdG8gZGlzYWJsZSAgICAgICAgICAgICAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1VOSVZFUlNFfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfVU5JVkVSU0UKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zOTYsNyArNDA2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIGFsbCBNUEM3NHh4IENQVXMJCSAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QQVRJLmggYi9pbmNsdWRlL2NvbmZpZ3MvUEFUSS5oCmluZGV4IGQ4OGZmZjMuLjBkZTc1OTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QQVRJLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BBVEkuaApAQCAtMzksMTQgKzM5LDM1IEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk5NjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9NRU1PUlkgfCBDRkdfQ01EX0xPQURCIHwgQ0ZHX0NNRF9SRUdJTkZPIHwgCQlcCi0JCQkJIENGR19DTURfRkxBU0ggfCBDRkdfQ01EX0xPQURTIHwgQ0ZHX0NNRF9FTlYgfCAgQ0ZHX0NNRF9SRUdJTkZPCXwgCQlcCi0JCQkJIENGR19DTURfQkRJIHwgQ0ZHX0NNRF9DT05TT0xFIHwgQ0ZHX0NNRF9SVU4gfCBDRkdfQ01EX0JTUCB8CVwKLQkJCQkgQ0ZHX0NNRF9JTUkgfCBDRkdfQ01EX0VFUFJPTSAgfCBDRkdfQ01EX0lSUSB8IENGR19DTURfTUlTQyBcCi0pCiAKLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEUworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9DT05TT0xFCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlTQworCiAKICNpZiAwCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJLTEJCS8qIGF1dG9ib290IGRpc2FibGVkCQkJKi8KQEAgLTcxLDcgKzkyLDcgQEAKIAogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJCSJwYXRpPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUENJNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvUENJNDA1LmgKaW5kZXggMDI3ZGQyMi4uZDZlNzA4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BDSTQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QQ0k0MDUuaApAQCAtNjgsMTcgKzY4LDI5IEBACiAKICNkZWZpbmUgQ09ORklHX1JUQ19NNDhUMzVBCTEJCS8qIFNUIEVsZWN0cm9uaWNzIE00OCB0aW1la2VlcGVyICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTk3LDcgKzEwOSw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI0NCw3ICsyNTYsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QQ0k1NDQxLmggYi9pbmNsdWRlL2NvbmZpZ3MvUENJNTQ0MS5oCmluZGV4IDNhN2Y3ZjAuLjI0YjI1ZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QQ0k1NDQxLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BDSTU0NDEuaApAQCAtMTIyLDIyICsxMjIsMzIgQEAKICNkZWZpbmUgQ0ZHX05JT1NfVE1SQ05UCShDRkdfTklPU19UTVJNUyAqIChDT05GSUdfU1lTX0NMS19GUkVRLzEwMDApKQogI2RlZmluZQlDRkdfSFoJCShDT05GSUdfU1lTX0NMS19GUkVRLyhDRkdfTklPU19UTVJDTlQgKyAxKSkKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENPTU1BTkRTCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0JESQl8IFwKLQkJCQkgQ0ZHX0NNRF9FQ0hPCXwgXAotCQkJCSBDRkdfQ01EX0VOVgl8IFwKLQkJCQkgQ0ZHX0NNRF9GTEFTSAl8IFwKLQkJCQkgQ0ZHX0NNRF9JTUkJfCBcCi0JCQkJIENGR19DTURfSVJRCXwgXAotCQkJCSBDRkdfQ01EX0xPQURTCXwgXAotCQkJCSBDRkdfQ01EX0xPQURCCXwgXAotCQkJCSBDRkdfQ01EX01FTU9SWQl8IFwKLQkJCQkgQ0ZHX0NNRF9NSVNDCXwgXAotCQkJCSBDRkdfQ01EX1JVTgl8IFwKLQkJCQkgQ0ZHX0NNRF9TQVZFUwkpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX01JU0MKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKyNkZWZpbmUgQ09ORklHX0NNRF9TQVZFUworCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBNSVNDCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUENJUFBDMi5oIGIvaW5jbHVkZS9jb25maWdzL1BDSVBQQzIuaAppbmRleCAzYTk3ZmJjLi4yNjhiMDM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUENJUFBDMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QQ0lQUEMyLmgKQEAgLTUzLDMwICs1MywzNyBAQAogI2RlZmluZSBDT05GSUdfUFJFQk9PVAkJIiIKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RPQworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKIAogI2RlZmluZSBDT05GSUdfUENJCQkxCiAjZGVmaW5lIENPTkZJR19QQ0lfUE5QCQkxCS8qIFBDSSBwbHVnLWFuZC1wbGF5ICovCiAKLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkKLSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogCiAvKgpAQCAtMjIzLDcgKzIzMCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUENJUFBDNi5oIGIvaW5jbHVkZS9jb25maWdzL1BDSVBQQzYuaAppbmRleCAxMzBiZWI3Li4yNTBiNTg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUENJUFBDNi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QQ0lQUEM2LmgKQEAgLTUzLDMyICs1MywzOSBAQAogI2RlZmluZSBDT05GSUdfUFJFQk9PVAkJIiIKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9TQ1NJCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ET0MKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9TQ1NJCisjZGVmaW5lIENPTkZJR19DTURfU05UUAogCiAKICNkZWZpbmUgQ09ORklHX1BDSQkJMQogI2RlZmluZSBDT05GSUdfUENJX1BOUAkJMQkvKiBQQ0kgcGx1Zy1hbmQtcGxheSAqLwogCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCi0gKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIAogLyoKQEAgLTIyNSw3ICsyMzIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1BJUDQwNS5oIGIvaW5jbHVkZS9jb25maWdzL1BJUDQwNS5oCmluZGV4IDgwNmU5NWYuLmVmYTAxNTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QSVA0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUElQNDA1LmgKQEAgLTQwLDMzICs0MCw0MiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRCTMzMDAwMDAwIC8qIGV4dGVybmFsIGZyZXF1ZW5jeSB0byBwbGwJKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb21tYW5kIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJXAotCQkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQlDRkdfQ01EX1BDSQl8IFwKLQkJCUNGR19DTURfQ0FDSEUJfCBcCi0JCQlDRkdfQ01EX0lSUQl8IFwKLQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQlDRkdfQ01EX1JFR0lORk8gfCBcCi0JCQlDRkdfQ01EX0ZEQwl8IFwKLQkJCUNGR19DTURfU0NTSQl8IFwKLQkJCUNGR19DTURfRkFUIAl8IFwKLQkJCUNGR19DTURfREFURQl8IFwKLQkJCUNGR19DTURfRUxGCXwgXAotCQkJQ0ZHX0NNRF9VU0IJfCBcCi0JCQlDRkdfQ01EX01JSQl8IFwKLQkJCUNGR19DTURfU0RSQU0JfCBcCi0JCQlDRkdfQ01EX0RPQwl8IFwKLQkJCUNGR19DTURfUElORwl8IFwKLQkJCUNGR19DTURfU0FWRVMgICB8IFwKLQkJCUNGR19DTURfQlNQCSkKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfRkRDCisjZGVmaW5lIENPTkZJR19DTURfU0NTSQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX0RPQworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9TQVZFUworI2RlZmluZSBDT05GSUdfQ01EX0JTUAorCiAKICNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAKQEAgLTE1MCw3ICsxNTksNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMjcsNyArMjM2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJLyogRm9yIEFNQ0MgNDA1IENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC0zNjYsNyArMzc1LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIERlYnVnIHN1cHBvcnQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUEsxQzIwLmggYi9pbmNsdWRlL2NvbmZpZ3MvUEsxQzIwLmgKaW5kZXggODNhN2VjMi4uZDkwMzUxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BLMUMyMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QSzFDMjAuaApAQCAtMTYwLDMwICsxNjAsNDEgQEAKICNkZWZpbmUgQ09ORklHX0lQQUREUgkJMTkyLjE2OC4yLjIxCiAjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTkyLjE2OC4yLjE2CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDT01NQU5EUwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9CREkJfCBcCi0JCQkJIENGR19DTURfREhDUAl8IFwKLQkJCQkgQ0ZHX0NNRF9FQ0hPCXwgXAotCQkJCSBDRkdfQ01EX0VOVgl8IFwKLQkJCQkgQ0ZHX0NNRF9GTEFTSAl8IFwKLQkJCQkgQ0ZHX0NNRF9JTUkJfCBcCi0JCQkJIENGR19DTURfSVJRCXwgXAotCQkJCSBDRkdfQ01EX0xPQURTCXwgXAotCQkJCSBDRkdfQ01EX0xPQURCCXwgXAotCQkJCSBDRkdfQ01EX01FTU9SWSB8IFwKLQkJCQkgQ0ZHX0NNRF9NSVNDCXwgXAotCQkJCSBDRkdfQ01EX05FVAl8IFwKLQkJCQkgQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCSBDRkdfQ01EX1JVTgl8IFwKLQkJCQkgQ0ZHX0NNRF9TQVZFUwkpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisKKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX01JU0MKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQ09NUEFDVCBGTEFTSAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKICNkZWZpbmUgQ09ORklHX0lERV9QUkVJTklUCQkJLyogSW1wbGVtZW50IGlkX3ByZWluaXQJKi8KICNkZWZpbmUgQ0ZHX0lERV9NQVhCVVMJCTEJCS8qIDEgSURFIGJ1cwkJKi8KICNkZWZpbmUgQ0ZHX0lERV9NQVhERVZJQ0UJMQkJLyogMSBkcml2ZSBwZXIgSURFIGJ1cwkqLwpAQCAtMjAxLDEyICsyMTIsMTIgQEAKICNkZWZpbmUgQ0ZHX0NGX1BPV0VSCQkweDAwOTAwODkwCS8qIENGIFBvd2VyIEZFVCBQSU8gYmFzZSovCiAjZGVmaW5lIENGR19DRl9BVEFTRUwJCTB4MDA5MDA4YTAJLyogQ0YgQVRBU0VMIFBJTyBiYXNlCSovCiAKLSNlbmRpZiAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSAqLworI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBKRkZTMgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAjZGVmaW5lIENGR19KRkZTX0NVU1RPTV9QQVJUCQkJLyogYm9hcmQgZGVmaW5lZCBwYXJ0CSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1BMVTQwNS5oIGIvaW5jbHVkZS9jb25maWdzL1BMVTQwNS5oCmluZGV4IGQwMmMzOWIuLjU0NzAzNzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QTFU0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUExVNDA1LmgKQEAgLTYxLDE5ICs2MSwzNCBAQAogCiAjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJRU1BQ19TVEFDUl9DTEtfNjZNSFogLyogNjYgTUh6IE9QQiBjbG9jayovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC04Myw5ICs5OCw2IEBACiAjZGVmaW5lIENPTkZJR19BVVRPX1VQREFURSAgICAgIDEgICAgICAgLyogYXV0b3VwZGF0ZSB2aWEgY29tcGFjdGZsYXNoICAqLwogI2RlZmluZSBDT05GSUdfQVVUT19VUERBVEVfU0hPVyAxICAgICAgIC8qIHVzZSBib2FyZCBzaG93IHJvdXRpbmUgICAgICAgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NQzE0NjgxOAkJLyogRFMxNjg1IGlzIE1DMTQ2ODE4IGNvbXBhdGlibGUqLwpAQCAtMTA0LDcgKzExNiw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTMzMSw3ICszNDMsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1BNNTIwLmggYi9pbmNsdWRlL2NvbmZpZ3MvUE01MjAuaAppbmRleCA3ZDkxYTAxLi41YmE4ZjRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUE01MjAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUE01MjAuaApAQCAtNDAsMTEgKzQwLDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJICAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC03NywxMiArNzIsNiBAQAogI2RlZmluZSBDRkdfUlhfRVRIX0JVRkZFUgk4ICAvKiB1c2UgOCByeCBidWZmZXIgb24gZWVwcm8xMDAgICovCiAjdW5kZWYgIENPTkZJR19OUzgzODJYCiAKLSNkZWZpbmUgQUREX1BDSV9DTUQgCQlDRkdfQ01EX1BDSQotCi0jZWxzZQkvKiBNUEM1MTAwICovCi0KLSNkZWZpbmUgQUREX1BDSV9DTUQJCTAgIC8qIG5vIENGR19DTURfUENJICovCi0KICNlbmRpZgogCiAvKiBQYXJ0aXRpb25zICovCkBAIC05MSwzOSArODAsNDggQEAKIC8qIFVTQiAqLwogI2lmIDEKICNkZWZpbmUgQ09ORklHX1VTQl9PSENJCi0jZGVmaW5lIEFERF9VU0JfQ01EICAgICAgICAgICAgIENGR19DTURfVVNCIHwgQ0ZHX0NNRF9GQVQKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCi0jZWxzZQotI2RlZmluZSBBRERfVVNCX0NNRCAgICAgICAgICAgICAwCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0JPT1RfUk9NKQotI2RlZmluZSBBRERfRE9DX0NNRCAgICAgICAgICAgICAwCi0jZWxzZQotI2RlZmluZSBBRERfRE9DX0NNRCAgICAgICAgICAgICBDRkdfQ01EX0RPQworI2lmICFkZWZpbmVkKENPTkZJR19CT09UX1JPTSkKIC8qIERvQyByZXF1aXJlcyBsZWdhY3kgTkFORCBmb3Igbm93ICovCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogI2VuZGlmCiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlBRERfRE9DX0NNRAl8IFwKLQkJCQlBRERfUENJX0NNRAl8IFwKLQkJCQlBRERfVVNCX0NNRAl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKworI2lmICFkZWZpbmVkKENPTkZJR19CT09UX1JPTSkKKyNkZWZpbmUgQ09ORklHX0NNRF9ET0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVBDNTIwMCkKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNlbmRpZgorCiAKIC8qCiAgKiBBdXRvYm9vdGluZwpAQCAtMjk0LDcgKzI5Miw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0zMTAsNiArMzA4LDExIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1BNODI2LmggYi9pbmNsdWRlL2NvbmZpZ3MvUE04MjYuaAppbmRleCA4OGZkYjUxLi5jODBiMTUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUE04MjYuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUE04MjYuaApAQCAtMTAzLDggKzEwMyw3IEBACiAgKiAgIC0gQ09ORklHX05FVF9NVUxUSSBtdXN0IGJlIGRlZmluZWQKICAqCiAgKiBpZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMgbXVzdCBiZQotICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QgYmUgcmVtb3ZlZAotICogZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCisgKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQgbXVzdCBiZSB1bnNldC4KICAqLwogI2RlZmluZQlDT05GSUdfTkVUX01VTFRJCiAjdW5kZWYJQ09ORklHX0VUSEVSX05PTkUJCS8qIGRlZmluZSBpZiBldGhlciBvbiBzb21ldGhpbmcgZWxzZSAqLwpAQCAtMTUyLDMzICsxNTEsMzQgQEAKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRE9DCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAogCiAjaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRE9DCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfU05UUAkpCi0jZWxzZQkvKiAhIFBDSSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRE9DCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCi0jZW5kaWYJLyogQ09ORklHX1BDSSAqLworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIApAQCAtMTk3LDcgKzE5Nyw3IEBACiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM0NSw3ICszNDUsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgICAgIDMyICAgICAgLyogRm9yIE1QQzgyNjAgQ1BVICAgICAgICAgICAgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1BNODI4LmggYi9pbmNsdWRlL2NvbmZpZ3MvUE04MjguaAppbmRleCAzN2VlOTc3Li44ZjViZTVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUE04MjguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUE04MjguaApAQCAtMTAzLDggKzEwMyw3IEBACiAgKiAgIC0gQ09ORklHX05FVF9NVUxUSSBtdXN0IGJlIGRlZmluZWQKICAqCiAgKiBpZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMgbXVzdCBiZQotICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QgYmUgcmVtb3ZlZAotICogZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCisgKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQgbXVzdCBiZSB1bnNldC4KICAqLwogI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCiAjdW5kZWYJQ09ORklHX0VUSEVSX05PTkUJCS8qIGRlZmluZSBpZiBldGhlciBvbiBzb21ldGhpbmcgZWxzZSAqLwpAQCAtMTUyLDMzICsxNTEsMzQgQEAKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRE9DCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAogCiAjaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRE9DCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfU05UUAkpCi0jZWxzZQkvKiAhIFBDSSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRE9DCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCi0jZW5kaWYJLyogQ09ORklHX1BDSSAqLworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogLyoKICAqIERpc2stT24tQ2hpcCBjb25maWd1cmF0aW9uCkBAIC0xOTYsNyArMTk2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzM4LDcgKzMzOCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjYwIENQVQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QTTg1NC5oIGIvaW5jbHVkZS9jb25maWdzL1BNODU0LmgKaW5kZXggOGYxMzBmNS4uZGJmOTQyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BNODU0LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BNODU0LmgKQEAgLTMwMyw0MyArMzAzLDM2IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCi0jaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKLSAgI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJIHwgQ0ZHX0NNRF9QQ0kJCVwKLQkJCQkgfCBDRkdfQ01EX0kyQykJCVwKLQkJCQkmCQkJXAotCQkJCSB+KENGR19DTURfRU5WCQlcCi0JCQkJICB8IENGR19DTURfTE9BRFMpKQotICAjZWxzZQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMCVwKLQkJCQkgfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQkgfCBDRkdfQ01EX0kyQykJCVwKLQkJCQkmCQkJXAotCQkJCSB+KENGR19DTURfRU5WCQlcCi0JCQkJICB8IENGR19DTURfTE9BRFMpKQotICAjZW5kaWYKLSNlbHNlCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9FRVBST00JXAotCQkJCXwgQ0ZHX0NNRF9EQVRFCQlcCi0JCQkJfCBDRkdfQ01EX01JSQkJXAotCQkJCXwgQ0ZHX0NNRF9QQ0kJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0gICNlbHNlCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9FRVBST00JXAotCQkJCXwgQ0ZHX0NNRF9EQVRFCQlcCi0JCQkJfCBDRkdfQ01EX01JSQkJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0kyQykKLSAgI2VuZGlmCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9FTlYKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI2VuZGlmCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTM1MCw3ICszNDMsNyBAQAogI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICAgICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtMzcyLDcgKzM2NSw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKQEAgLTM4NCw3ICszNzcsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QTTg1Ni5oIGIvaW5jbHVkZS9jb25maWdzL1BNODU2LmgKaW5kZXggMDI4NmI1My4uNmJkZmE1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BNODU2LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BNODU2LmgKQEAgLTMwNiw0MSArMzA2LDM1IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCi0jaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKLSAgI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJIHwgQ0ZHX0NNRF9QQ0kJCVwKLQkJCQkgfCBDRkdfQ01EX0kyQykJCVwKLQkJCQkmCQkJXAotCQkJCSB+KENGR19DTURfRU5WCQlcCi0JCQkJICB8IENGR19DTURfTE9BRFMpKQotICAjZWxzZQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMCVwKLQkJCQkgfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQkgfCBDRkdfQ01EX0kyQykJCVwKLQkJCQkmCQkJXAotCQkJCSB+KENGR19DTURfRU5WCQlcCi0JCQkJICB8IENGR19DTURfTE9BRFMpKQotICAjZW5kaWYKLSNlbHNlCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9FRVBST00JXAotCQkJCXwgQ0ZHX0NNRF9EQVRFCQlcCi0JCQkJfCBDRkdfQ01EX1BDSQkJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0kyQykKLSAgI2Vsc2UKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX0VFUFJPTQlcCi0JCQkJfCBDRkdfQ01EX0RBVEUJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0gICNlbmRpZgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC0zNTEsNyArMzQ1LDcgQEAKICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDEwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTM3Myw3ICszNjcsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCkBAIC0zODUsNyArMzc5LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUE1DNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvUE1DNDA1LmgKaW5kZXggNmUwYmQ3Zi4uYjI5ZjM2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BNQzQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QTUM0MDUuaApAQCAtNjMsMjUgKzYzLDM3IEBACiAKICNkZWZpbmUgQ09ORklHX05FVENPTlNPTEUJCS8qIGluY2x1ZGUgTmV0Q29uc29sZSBzdXBwb3J0CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfVU5JVkVSU0UgfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00gICkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9VTklWRVJTRQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NQzE0NjgxOCAgICAgICAgICAgICAvKiBEUzE2ODUgaXMgTUMxNDY4MTggY29tcGF0aWJsZSovCkBAIC0xMDAsNyArMTEyLDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjYzLDcgKzI3NSw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUE42Mi5oIGIvaW5jbHVkZS9jb25maWdzL1BONjIuaAppbmRleCBhNzE3NjU5Li43MmFjZjVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUE42Mi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QTjYyLmgKQEAgLTQyLDE1ICs0MiwyOSBAQAogI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkxCiAKIAotI2RlZmluZSBSRU1PVkVfQ09NTUFORFMgICAgICAgICAoIENGR19DTURfQVVUT1NDUklQVAl8IFwKLSAJCQkJICBDRkdfQ01EX0xPQURTCQl8IFwKLSAJCQkJICBDRkdfQ01EX0VOVgkJfCBcCi0gCQkJCSAgQ0ZHX0NNRF9GTEFTSAkJfCBcCi0JCQkJICBDRkdfQ01EX0lNTFMJCSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoIChDT05GSUdfQ01EX0RGTCAmIH5SRU1PVkVfQ09NTUFORFMpIHxcCi0JCQkJICBDRkdfQ01EX1BDSSB8XAotCQkJCSAgQ0ZHX0NNRF9CU1ApCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisKKyN1bmRlZiBDT05GSUdfQ01EX0FVVE9TQ1JJUFQKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9FTlYKKyN1bmRlZiBDT05GSUdfQ01EX0ZMQVNICisjdW5kZWYgQ09ORklHX0NNRF9JTUxTCisKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTE5MjAwCS8qIGNvbnNvbGUgYmF1ZHJhdGUJCSovCiAKQEAgLTgyLDEwICs5Niw2IEBACiAJCQkibG9hZHAgMjAwMDAwOyBib290bSIKICNlbmRpZgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCSovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwpAQCAtMjg3LDcgKzI5Nyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjQwIENQVQkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUFBDaGFtZWxlb25FVkIuaCBiL2luY2x1ZGUvY29uZmlncy9QUENoYW1lbGVvbkVWQi5oCmluZGV4IDE2ZTJjYzYuLmRkMWRlY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QUENoYW1lbGVvbkVWQi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QUENoYW1lbGVvbkVWQi5oCkBAIC0xMTMsMjYgKzExMywzOCBAQAogI2VuZGlmCiAjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJRU1BQ19TVEFDUl9DTEtfNjZNSFoKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCiAjZGVmaW5lIENPTkZJR19SVENfTTQxVDExCTEJLyogdXNlcyBhIE00MVQwMCBSVEMJCSovCkBAIC0xNjIsNyArMTc0LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtNDQ2LDcgKzQ1OCw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUVM4MjMuaCBiL2luY2x1ZGUvY29uZmlncy9RUzgyMy5oCmluZGV4IDIzNWJjNDguLjM2NTdmZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9RUzgyMy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9RUzgyMy5oCkBAIC0xODksMjcgKzE4OSwzNyBAQAogI3VuZGVmIENPTkZJR19TVEFUVVNfTEVECQkvKiBTdGF0dXMgTEVEIGRpc2FibGVkICovCiAjdW5kZWYgQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZCAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICN1bmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgogI3VuZGVmIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NUEM4eHgJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHggKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0JESQl8IFwKLQlDRkdfQ01EX0JPT1RECXwgXAotCUNGR19DTURfQ09OU09MRQl8IFwKLQlDRkdfQ01EX0RBVEUJfCBcCi0JQ0ZHX0NNRF9FTlYJfCBcCi0JQ0ZHX0NNRF9GTEFTSAl8IFwKLQlDRkdfQ01EX0lNSQl8IFwKLQlDRkdfQ01EX0lNTUFQCXwgXAotCUNGR19DTURfTUVNT1JZCXwgXAotCUNGR19DTURfTkVUCXwgXAotCUNGR19DTURfUlVOKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9CT09URAorI2RlZmluZSBDT05GSUdfQ01EX0NPTlNPTEUKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1JVTgorCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEVudmlyb25tZW50IHZhcmlhYmxlIHN0b3JhZ2UgaXMgaW4gRkxBU0gsIG9uZSBzZWN0b3IgYmVmb3JlIFUtYm9vdApAQCAtMjI4LDcgKzIzOCw3IEBACiAjZGVmaW5lIENGR19IVVNIX1BBUlNFUgkJMQkJLyogdXNlICJodXNoIiBjb21tYW5kIHBhcnNlciAqLwogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCkBAIC0zMDMsNyArMzEzLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJCS8qIEZvciBhbGwgTVBDOHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJCS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1FTODUwLmggYi9pbmNsdWRlL2NvbmZpZ3MvUVM4NTAuaAppbmRleCA5Njc1ODJiLi4zZGI1MzlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUVM4NTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUVM4NTAuaApAQCAtMTg5LDI3ICsxODksMzcgQEAKICN1bmRlZiBDT05GSUdfU1RBVFVTX0xFRAkJLyogU3RhdHVzIExFRCBkaXNhYmxlZCAqLwogI3VuZGVmIENPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAogI3VuZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCiAjdW5kZWYgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZSBDT05GSUdfUlRDX01QQzh4eAkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eCAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQkRJCXwgXAotCUNGR19DTURfQk9PVEQJfCBcCi0JQ0ZHX0NNRF9DT05TT0xFCXwgXAotCUNGR19DTURfREFURQl8IFwKLQlDRkdfQ01EX0VOVgl8IFwKLQlDRkdfQ01EX0ZMQVNICXwgXAotCUNGR19DTURfSU1JCXwgXAotCUNGR19DTURfSU1NQVAJfCBcCi0JQ0ZHX0NNRF9NRU1PUlkJfCBcCi0JQ0ZHX0NNRF9ORVQJfCBcCi0JQ0ZHX0NNRF9SVU4pCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfQk9PVEQKKyNkZWZpbmUgQ09ORklHX0NNRF9DT05TT0xFCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZSBzdG9yYWdlIGlzIGluIEZMQVNILCBvbmUgc2VjdG9yIGJlZm9yZSBVLWJvb3QKQEAgLTIyOCw3ICsyMzgsNyBAQAogI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIJCTEJCS8qIHVzZSAiaHVzaCIgY29tbWFuZCBwYXJzZXIgKi8KICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtMzAzLDcgKzMxMyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CQkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9RUzg2MFQuaCBiL2luY2x1ZGUvY29uZmlncy9RUzg2MFQuaAppbmRleCAzMmZhYTYxLi5iMzQ0MmRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUVM4NjBULmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1FTODYwVC5oCkBAIC05MiwyMyArOTIsMzMgQEAKIAogI3VuZGVmIENPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NUEM4eHgJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHggKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwgfCBcCi0JQ0ZHX0NNRF9SRUdJTkZPCXwgXAotCUNGR19DTURfSU1NQVAJfCBcCi0JQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JQ0ZHX0NNRF9ORVQJfCBcCi0JQ0ZHX0NNRF9ESENQCXwgXAotCUNGR19DTURfREFURQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKIAogCiAvKiBUT0RPICovCkBAIC0xMzYsNyArMTQ2LDcgQEAKICNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCQkxCQkvKiB1c2UgImh1c2giIGNvbW1hbmQgcGFyc2VyICovCiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTIxMCw3ICsyMjAsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkJLyogRm9yIGFsbCBNUEM4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUjM2ME1QSS5oIGIvaW5jbHVkZS9jb25maWdzL1IzNjBNUEkuaAppbmRleCA4MjIyOGMwLi41MTZlYzY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUjM2ME1QSS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9SMzYwTVBJLmgKQEAgLTc5LDcgKzc5LDE0IEBACiAKICNkZWZpbmUJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBlbmFibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTExMSwyMCArMTE4LDIzIEBACiAjZGVmaW5lIENGR19JMkNfS0VZX0FERFIJMHg5CS8qIEtleWJvYXJkIGNvcHJvY2Vzc29yICovCiAjZGVmaW5lIENGR19JMkNfVEVNX0FERFIJMHg0OQkvKiBUZW1wZXJhdHVyZSBTZW5zb3JzICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CTVAJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENNQ0lBCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQk1QCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDTUNJQQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTM0LDcgKzE0NCw3IEBACiAKICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIyOCw3ICsyMzgsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUkJDODIzLmggYi9pbmNsdWRlL2NvbmZpZ3MvUkJDODIzLmgKaW5kZXggMjQyYzgzNy4uMmY2ZGU4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1JCQzgyMy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9SQkM4MjMuaApAQCAtNzksNyArNzksMTUgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjdW5kZWYgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTk0LDQyICsxMDIsNDUgQEAKICNkZWZpbmUgQ0ZHX0VFUFJPTV9XUklURV9CSVRTCQk0CiAjZGVmaW5lIENGR19FRVBST01fV1JJVEVfREVMQVlfTVMJMTAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDRkdfQ01EX0FMTAkmIFwKLQkJCQl+Q0ZHX0NNRF9CU1AJJiBcCi0JCQkJfkNGR19DTURfREFURQkmIFwKLQkJCQl+Q0ZHX0NNRF9ESVNQTEFZJiBcCi0JCQkJfkNGR19DTURfRFRUCSYgXAotCQkJCX5DRkdfQ01EX0VYVDIJJiBcCi0JCQkJfkNGR19DTURfRkRDCSYgXAotCQkJCX5DRkdfQ01EX0ZET1MJJiBcCi0JCQkJfkNGR19DTURfSFdGTE9XCSYgXAotCQkJCX5DRkdfQ01EX0lERQkmIFwKLQkJCQl+Q0ZHX0NNRF9JUlEJJiBcCi0JCQkJfkNGR19DTURfSkZGUzIJJiBcCi0JCQkJfkNGR19DTURfTUlJCSYgXAotCQkJCX5DRkdfQ01EX01NQwkmIFwKLQkJCQl+Q0ZHX0NNRF9OQU5ECSYgXAotCQkJCX5DRkdfQ01EX1BDSQkmIFwKLQkJCQl+Q0ZHX0NNRF9QQ01DSUEJJiBcCi0JCQkJfkNGR19DTURfUkVJU0VSCSYgXAotCQkJCX5DRkdfQ01EX1NDU0kJJiBcCi0JCQkJfkNGR19DTURfU0VUR0VURENSICYgXAotCQkJCX5DRkdfQ01EX1NOVFAJJiBcCi0JCQkJfkNGR19DTURfU1BJCSYgXAotCQkJCX5DRkdfQ01EX1VOSVZFUlNFICYgXAotCQkJCX5DRkdfQ01EX1VTQgkmIFwKLQkJCQl+Q0ZHX0NNRF9WRkQJJiBcCi0JCQkJfkNGR19DTURfWElNRwkpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2FsbC5oPgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjdW5kZWYgQ09ORklHX0NNRF9CU1AKKyN1bmRlZiBDT05GSUdfQ01EX0RBVEUKKyN1bmRlZiBDT05GSUdfQ01EX0RJU1BMQVkKKyN1bmRlZiBDT05GSUdfQ01EX0RUVAorI3VuZGVmIENPTkZJR19DTURfRVhUMgorI3VuZGVmIENPTkZJR19DTURfRkRDCisjdW5kZWYgQ09ORklHX0NNRF9GRE9TCisjdW5kZWYgQ09ORklHX0NNRF9IV0ZMT1cKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorI3VuZGVmIENPTkZJR19DTURfSVJRCisjdW5kZWYgQ09ORklHX0NNRF9KRkZTMgorI3VuZGVmIENPTkZJR19DTURfTUlJCisjdW5kZWYgQ09ORklHX0NNRF9NRlNMCisjdW5kZWYgQ09ORklHX0NNRF9NTUMKKyN1bmRlZiBDT05GSUdfQ01EX05BTkQKKyN1bmRlZiBDT05GSUdfQ01EX1BDSQorI3VuZGVmIENPTkZJR19DTURfUENNQ0lBCisjdW5kZWYgQ09ORklHX0NNRF9SRUlTRVIKKyN1bmRlZiBDT05GSUdfQ01EX1NDU0kKKyN1bmRlZiBDT05GSUdfQ01EX1NFVEdFVERDUgorI3VuZGVmIENPTkZJR19DTURfU05UUAorI3VuZGVmIENPTkZJR19DTURfU1BJCisjdW5kZWYgQ09ORklHX0NNRF9VTklWRVJTRQorI3VuZGVmIENPTkZJR19DTURfVVNCCisjdW5kZWYgQ09ORklHX0NNRF9WRkQKKyN1bmRlZiBDT05GSUdfQ01EX1hJTUcKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMDUsNyArMjE2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1JQWENsYXNzaWMuaCBiL2luY2x1ZGUvY29uZmlncy9SUFhDbGFzc2ljLmgKaW5kZXggNTkxMzgyYy4uNzkzYjFkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1JQWENsYXNzaWMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUlBYQ2xhc3NpYy5oCkBAIC04OCwxNSArODgsMjYgQEAKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUJQ09ORklHX0NMT0NLU19JTl9NSFoJMQkvKiBjbG9ja3MgcGFzc3NlZCB0byBMaW51eCBpbiBNSHogKi8KIAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkoKENGR19DTURfQUxMICYgfkNGR19DTURfTk9OU1REKSB8IENGR19DTURfRUxGKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTA0LDcgKzExNSw3IEBACiAjZGVmaW5lIENGR19SRVNFVF9BRERSRVNTCTB4ODAwMDAwMDAKICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE4Miw3ICsxOTMsNyBAQAogI2RlZmluZQlDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAogI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkweEZGMDAwMDAwCiAKLSNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkIChDT05GSUdfVklERU9fU0VEMTM4MDYpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkIChDT05GSUdfVklERU9fU0VEMTM4MDYpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9JREUpCiAjZGVmaW5lCUNGR19NT05JVE9SX0xFTgkJKDI1NiA8PCAxMCkJLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbml0b3IJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19NT05JVE9SX0xFTgkJKDEyOCA8PCAxMCkJLyogUmVzZXJ2ZSAxMjgga0IgZm9yIE1vbml0b3IJKi8KQEAgLTIyMiw3ICsyMzMsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUlBYbGl0ZS5oIGIvaW5jbHVkZS9jb25maWdzL1JQWGxpdGUuaAppbmRleCA0OGFkYTBlLi4zYzVlNmI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUlBYbGl0ZS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9SUFhsaXRlLmgKQEAgLTYyLDE3ICs2MiwyOCBAQAogI2RlZmluZSBDT05GSUdfQlpJUDIJCS8qIEluY2x1ZGUgc3VwcG9ydCBmb3IgYnppcDIgY29tcHJlc3NlZCBpbWFnZXMgICovCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTU0LDcgKzE2NSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9SUFhsaXRlX0RXLmggYi9pbmNsdWRlL2NvbmZpZ3MvUlBYbGl0ZV9EVy5oCmluZGV4IDMxMDI1NDcuLjg3Mjc2NWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9SUFhsaXRlX0RXLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1JQWGxpdGVfRFcuaApAQCAtMTE1LDI5ICsxMTUsMzYgQEAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KICN1bmRlZglDT05GSUdfU1RBVFVTX0xFRAkJLyogZGlzdHVyYnMgZGlzcGxheS4gU3RhdHVzIExFRCBkaXNhYmxlZC4gKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjaWYgMQkgICAgICAgLyogRW5hYmxlIHRoaXMgc3R1ZmYgY291bGQgbWFrZSBpbWFnZSBlbmxhcmdlIGFib3V0IDI1S0IuIE1hc2sgaXQgaWYgeW91CiAJCSAgZG9uJ3Qgd2FudCB0aGUgYWR2YW5jZWQgZnVuY3Rpb24gKi8KIAorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKICNpZmRlZglDT05GSUdfU1BMQVNIX1NDUkVFTgotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0JNUAl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8gfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCSkKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJKQotI2VuZGlmCS8qIENPTkZJR19TUExBU0hfU0NSRUVOICovCisjZGVmaW5lIENPTkZJR19DTURfQk1QCisjZW5kaWYKKwogCiAvKiB0ZXN0LW9ubHkgKi8KICNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksJMAkgICAgLyogdXNlIGZvciBKRkZTMiAqLwpAQCAtMTQ3LDE2ICsxNTQsMTMgQEAKIAogI2VuZGlmCS8qIDEgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSJ1LWJvb3Q+IgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjAwLDcgKzIwNCw3IEBACiAjZGVmaW5lIENGR19TRFJBTV9CQVNFCQkweDAwMDAwMDAwCiAjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweEZGMDAwMDAwCiAKLSNpZiBkZWZpbmVkKERFQlVHKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKICNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoMjU2IDw8IDEwKQkvKiBSZXNlcnZlIDI1NiBrQiBmb3IgTW9uaXRvcgkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoMTI4IDw8IDEwKQkvKiBSZXNlcnZlIDEyOCBrQiBmb3IgTW9uaXRvciAqLwpAQCAtMjM5LDcgKzI0Myw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9SUFhzdXBlci5oIGIvaW5jbHVkZS9jb25maWdzL1JQWHN1cGVyLmgKaW5kZXggNDU5MDdhYS4uZGZhZGQyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1JQWHN1cGVyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1JQWHN1cGVyLmgKQEAgLTkxLDggKzkxLDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZiAgQ09ORklHX0VUSEVSX09OX1NDQyAgICAgICAgICAgLyogZGVmaW5lIGlmIGV0aGVybmV0IG9uIFNDQyAgICAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDICAgICAgICAgICAvKiBkZWZpbmUgaWYgZXRoZXJuZXQgb24gRkNDICAgICovCkBAIC0xNTAsMTMgKzE0OSwyOCBAQAogLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUICAgICAgICAgICAgICAiPT4gIgogCi0vKiBXaGF0IFUtQm9vdCBzdWJzeXRlbXMgZG8geW91IHdhbnQgZW5hYmxlZD8gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICAgKCBDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQkgIENGR19DTURfSU1NQVAgIHwgXAotCQkJCSAgQ0ZHX0NNRF9BU0tFTlYgfCBcCi0JCQkJICBDRkdfQ01EX0kyQyAgICB8IFwKLQkJCQkgIENGR19DTURfUkVHSU5GTyAmIFwKLQkJCQkgfkNGR19DTURfS0dEQiApCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKworI3VuZGVmIENPTkZJR19DTURfS0dEQgorCiAKIC8qIFdoZXJlIGRvIHRoZSBpbnRlcm5hbCByZWdpc3RlcnMgbGl2ZT8gKi8KICNkZWZpbmUgQ0ZHX0lNTVIgICAgICAgICAgICAgICAweEYwMDAwMDAwCkBAIC0xNzYsMTMgKzE5MCwxMCBAQAogCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YgMQkvKiBDYWxsIGJvYXJkX2Vhcmx5X2luaXRfZgkqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQlNJWkUgICAgICAgICAgICAgIDEwMjQgICAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICAgICAqLwogI2Vsc2UKICMgIGRlZmluZSBDRkdfQ0JTSVpFICAgICAgICAgICAgICAyNTYgICAgICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAgICAgKi8KQEAgLTMxMCw3ICszMjEsNyBAQAogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgICAgIDMyICAgICAgLyogRm9yIE1QQzgyNjAgQ1BVICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQgICAgIDUgICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1JSdmlzaW9uLmggYi9pbmNsdWRlL2NvbmZpZ3MvUlJ2aXNpb24uaAppbmRleCAzODg1YmNkLi4xZTZlOGMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUlJ2aXNpb24uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUlJ2aXNpb24uaApAQCAtOTIsNyArOTIsMTUgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC0xMzUsMjMgKzE0MywyNiBAQAogI2VuZGlmCS8qIENPTkZJR19TT0ZUX0kyQyAqLwogCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAoICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfREFURQkpICYgXAotCQkJICAgICB+KCBDRkdfQ01EX1BDTUNJQSAgfCBcCi0JCQkgICAgICAgIENGR19DTURfSURFCSkgKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfREFURQorCisjdW5kZWYgQ09ORklHX0NNRF9QQ01DSUEKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIyOCw3ICsyMzksNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUmF0dGxlci5oIGIvaW5jbHVkZS9jb25maWdzL1JhdHRsZXIuaAppbmRleCBkYmM1N2U4Li5kNzY1MmZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUmF0dGxlci5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9SYXR0bGVyLmgKQEAgLTYyLDggKzYyLDggQEAKICAqIFNDQywgMS0zIGZvciBGQ0MpCiAgKgogICogSWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzCi0gKiBtdXN0IGJlIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0Ci0gKiBiZSByZW1vdmVkIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogbXVzdCBiZSBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQKKyAqIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCQkvKiBFdGhlcm5ldCBpcyBub3Qgb24gU0NDICovCiAjZGVmaW5lIENPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIEV0aGVybmV0IGlzIG9uIEZDQyAgICAgKi8KQEAgLTEyNSwyMiArMTI1LDMzIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkzODQwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMICAgXAotCQkJCXwgQ0ZHX0NNRF9ESENQICAgIFwKLQkJCQl8IENGR19DTURfSU1NQVAgICBcCi0JCQkJfCBDRkdfQ01EX0pGRlMyICAgXAotCQkJCXwgQ0ZHX0NNRF9NSUkgICAgIFwKLQkJCQl8IENGR19DTURfUElORyAgICBcCi0JCQkJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzICovCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gRkUwNDAwMDAiCS8qIGF1dG9ib290IGNvbW1hbmQgKi8KICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkicm9vdD0vZGV2L210ZGJsb2NrMiBydyBtdGRwYXJ0cz1waHlzOjFNKFJPTSlybywtKHJvb3QpIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICN1bmRlZglDT05GSUdfS0dEQl9PTl9TTUMJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNNQyAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNDQyAqLwogI3VuZGVmCUNPTkZJR19LR0RCX05PTkUJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0xNTgsNyArMTY5LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMTg0LDcgKzE5NSw3IEBACiAKICNkZWZpbmUJQ0ZHX0RJUkVDVF9GTEFTSF9URlRQCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAjZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MJQ0ZHX01BWF9GTEFTSF9CQU5LUwogI2RlZmluZSBDRkdfSkZGUzJfU09SVF9GUkFHTUVOVFMKIApAQCAtMjA1LDcgKzIxNiw3IEBACiAjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibm9yMD1yYXR0bGVyLTAiCiAjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIm10ZHBhcnRzPXJhdHRsZXItMDotQDFtKGpmZnMyKSIKICovCi0jZW5kaWYgLyogQ0ZHX0NNRF9KRkZTMiAqLworI2VuZGlmIC8qIENPTkZJR19DTURfSkZGUzIgKi8KIAogI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVRFWFRfQkFTRQogI2lmIChDRkdfTU9OSVRPUl9CQVNFIDwgQ0ZHX0ZMQVNIX0JBU0UpCkBAIC0yNTYsNyArMjY3LDcgQEAKICNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkJKDggPDwgMjApCS8qIEluaXRpYWwgTWVtb3J5IG1hcCBmb3IgTGludXggKi8KIAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1NCQzg1NDAuaCBiL2luY2x1ZGUvY29uZmlncy9TQkM4NTQwLmgKaW5kZXggZjhlMzM5Ny4uZjJjMzY5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1NCQzg1NDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvU0JDODU0MC5oCkBAIC0zMzgsMjggKzMzOCwzNyBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAotI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpIHx8IGRlZmluZWQoQ09ORklHX1JBTV9BU19GTEFTSCkKLSAgI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJIHwgXAotCQkJCUNGR19DTURfUElORyB8IENGR19DTURfSTJDKSAmIFwKLQkJCQkgfihDRkdfQ01EX0VOViB8IFwKLQkJCQkgIENGR19DTURfTE9BRFMgKSkKLSAgI2VsaWYgKGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTUlJIHwgXAotCQkJCUNGR19DTURfUElORyB8IENGR19DTURfSTJDKSAmIFwKLQkJCQl+KENGR19DTURfRU5WKSkKLSAgI2VuZGlmCi0jZWxzZQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IFwKLQkJCQlDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykKLSAgI2VsaWYgKGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9NSUkgfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9JMkMpCi0gICNlbmRpZgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKSB8fCBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgorICAgICN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjZW5kaWYKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTM2OCw3ICszNzcsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSJTQkM4NTQwPT4gIiAvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogICAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzg5LDcgKzM5OCw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC00MDEsNyArNDEwLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAgICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAgICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TQ00uaCBiL2luY2x1ZGUvY29uZmlncy9TQ00uaAppbmRleCBlMjYzZGI2Li5mOTAwOTY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvU0NNLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1NDTS5oCkBAIC0xMzMsOCArMTMzLDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKgogICogKE9uIFRRTTgyNjAgZWl0aGVyIFNDQzEgb3IgRkNDMiBtYXkgYmUgY2hvc2VuOiBTQ0MxIGlzIGhhcmR3aXJlZCB0byB0aGUKICAqIFguMjkgY29ubmVjdG9yLCBhbmQgRkNDMiBpcyBoYXJkd2lyZWQgdG8gdGhlIFguMSBjb25uZWN0b3IpCkBAIC0xOTEsMjMgKzE5MCwzMyBAQAogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgXAotCQkJCSBDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkgQ0ZHX0NNRF9CU1ApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM1Myw3ICszNjIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgICAgIDMyICAgICAgLyogRm9yIE1QQzgyNjAgQ1BVICAgICAgICAgICAgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvU0w4MjQ1LmggYi9pbmNsdWRlL2NvbmZpZ3MvU0w4MjQ1LmgKaW5kZXggNjE4OTZkMC4uNGQ5ZDQxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1NMODI0NS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9TTDgyNDUuaApAQCAtNTMsMTEgKzUzLDIyIEBACiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgCSovCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCiAKIAogLyoKQEAgLTI1NSw3ICsyNjYsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1NNODUwLmggYi9pbmNsdWRlL2NvbmZpZ3MvU004NTAuaAppbmRleCA0OTc3NjI5Li40MWE1NGYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvU004NTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvU004NTAuaApAQCAtNjgsMjMgKzY4LDM0IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJICBDRkdfQ01EX0RIQ1AJCXwgXAotCQkJCSAgQ0ZHX0NNRF9EQVRFCQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikgJiYgZGVmaW5lZChLR0RCX0RFQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKSAmJiBkZWZpbmVkKEtHREJfREVCVUcpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTY3LDcgKzE3OCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TTU40Mi5oIGIvaW5jbHVkZS9jb25maWdzL1NNTjQyLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBkNTg4ODE4Li5hNWQzZDY5Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9TTU40Mi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9TTU40Mi5oCkBAIC02Niw3ICs2NiwxNSBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKIC8qIGVuYWJsZSBJMkMgYW5kIHNlbGVjdCB0aGUgaGFyZHdhcmUvc29mdHdhcmUgZHJpdmVyICovCiAjdW5kZWYJQ09ORklHX0hBUkRfSTJDCQkJLyogSTJDIHdpdGggaGFyZHdhcmUgc3VwcG9ydAkqLwpAQCAtMTAxLDIyICsxMDksMjEgQEAKIAkJCQkJCSAgUFVUMzIoSU8wRElSLCBpMmN0bXApOyB9CiAjZW5kaWYgLyogQ09ORklHX1NPRlRfSTJDICovCiAKKwogLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcworICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRkFUCQl8IFwKLQkJCQlDRkdfQ01EX01NQwkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfUElORykKKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfTU1DCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAKICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1NQRDgyM1RTLmggYi9pbmNsdWRlL2NvbmZpZ3MvU1BEODIzVFMuaAppbmRleCBhZTRkY2MyLi4zOTVjN2ExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvU1BEODIzVFMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvU1BEODIzVFMuaApAQCAtNTksMTUgKzU5LDI5IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgXAotKChDT05GSUdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9GTEFTSCkpIHwgQ0ZHX0NNRF9JREUpIC8qIG5vIEZsYXNoLCBidXQgSURFICovCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfSURFCisKKyN1bmRlZiBDT05GSUdfQ01EX0ZMQVNICisKKwogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENPTkZJR19FVEhBRERSCQkwMDpEMDo5MzowMDowMTpDQgpAQCAtODIsNyArOTYsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNjAsNyArMTc0LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1NYMS5oIGIvaW5jbHVkZS9jb25maWdzL1NYMS5oCmluZGV4IDZlZDk4YjguLjA1Y2VmODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9TWDEuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvU1gxLmgKQEAgLTkzLDEyICs5MywyNiBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCggQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJICAgQ0ZHX0NNRF9JMkMgKSAmIFwKLQkJCQkgIH5DRkdfQ01EX05FVCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0kyQworCisjdW5kZWYgQ09ORklHX0NNRF9ORVQKKworCiAjaW5jbHVkZSA8Y29uZmlncy9vbWFwMTUxMC5oPgogCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJIm1lbT0xNk0gY29uc29sZT10dHlTMCwxMTUyMDBuOCByb290PS9kZXYvbXRkYmxvY2szIHJ3IgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1NYTkk4NTVULmggYi9pbmNsdWRlL2NvbmZpZ3MvU1hOSTg1NVQuaAppbmRleCBhODQ1NGQ5Li44ZjJhNWVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvU1hOSTg1NVQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvU1hOSTg1NVQuaApAQCAtMTQ2LDE0ICsxNDYsMjYgQEAKIAogI2RlZmluZSBDRkdfRElTQ09WRVJfUEhZCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTQkJfCBcCi0JCQkJIENGR19DTURfSkZGUzIJCXwgXAotCQkJCSBDRkdfQ01EX05BTkQJCXwgXAotCQkJCSBDRkdfQ01EX0RBVEUpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisKIAogI2RlZmluZSBDRkdfSkZGUzJfU09SVF9GUkFHTUVOVFMKIApAQCAtMjI2LDcgKzIzOCw3IEBACiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBhIGxpdHRsZSBtZW1vcnkgKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkJIj0+IgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMDksNyArMzIxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1NhbmRwb2ludDgyNDAuaCBiL2luY2x1ZGUvY29uZmlncy9TYW5kcG9pbnQ4MjQwLmgKaW5kZXggZjQzMzllYy4uNWJiZTNjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1NhbmRwb2ludDgyNDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvU2FuZHBvaW50ODI0MC5oCkBAIC04MCwxOCArODAsMzAgQEAKIAkiIgogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInJ1biBmbGFzaF9zZWxmIgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkJKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogI2RlZmluZSBDT05GSUdfRFJBTV9TUEVFRAkxMDAJCS8qIE1IegkJCQkqLwogCkBAIC0zODQsNyArMzk2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNDAgQ1BVCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TYW5kcG9pbnQ4MjQ1LmggYi9pbmNsdWRlL2NvbmZpZ3MvU2FuZHBvaW50ODI0NS5oCmluZGV4IGQ0MmJkNjkuLmEwODQ1MWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9TYW5kcG9pbnQ4MjQ1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1NhbmRwb2ludDgyNDUuaApAQCAtNTEsMTcgKzUxLDI4IEBACiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCSovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKIAogCiAvKgpAQCAtMzYzLDcgKzM3NCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjQwIENQVQkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVEFTUkVHLmggYi9pbmNsdWRlL2NvbmZpZ3MvVEFTUkVHLmgKaW5kZXggMTE5YmMyNC4uMmIyYWUwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RBU1JFRy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UQVNSRUcuaApAQCAtNTAsMjAgKzUwLDM0IEBACiAKICN1bmRlZiBDT05GSUdfTU9OSVRPUl9JU19JTl9SQU0JICAgICAgICAgICAgICAvKiBubyBwcmUtbG9hZGVyIHJlcXVpcmVkISEhIDstKSAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoKENPTkZJR19DTURfREZMICAgICAgICB8ICAgIFwKLQkJCQlDRkdfQ01EX0JTUCAgICAgICAgICAgfCAgICBcCi0JCQkJQ0ZHX0NNRF9FRVBST00gICAgICAgIHwgICAgXAotCQkJCUNGR19DTURfSTJDICAgICAgICAgICAgKSAmIFwKLQkJCSAgICAgICB+KENGR19DTURfTkVUKSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworCisjdW5kZWYgQ09ORklHX0NNRF9ORVQKKworCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVEI1MjAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvVEI1MjAwLmgKaW5kZXggNzEyNjY4YS4uMWM2YTlhZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RCNTIwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UQjUyMDAuaApAQCAtNDIsMTEgKzQyLDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJICAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC03MiwxMiArNjcsNiBAQAogI2RlZmluZSBDRkdfQ09OU09MRV9JU19JTl9FTlYKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1ZJREVPCi0jZGVmaW5lIEFERF9CTVBfQ01ECQlDRkdfQ01EX0JNUAotI2Vsc2UKLSNkZWZpbmUgQUREX0JNUF9DTUQJCTAKLSNlbmRpZgotCiAvKiBQYXJ0aXRpb25zICovCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC04NSw3ICs3NCw2IEBACiAKIC8qIFVTQiAqLwogI2RlZmluZSBDT05GSUdfVVNCX09IQ0kKLSNkZWZpbmUgQUREX1VTQl9DTUQJCUNGR19DTURfVVNCIHwgQ0ZHX0NNRF9GQVQKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCiAKIC8qIFBPU1Qgc3VwcG9ydCAqLwpAQCAtOTQsNDEgKzgyLDUxIEBACiAJCQkJIENGR19QT1NUX0kyQykKIAogI2lmZGVmIENPTkZJR19QT1NUCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIENGR19DTURfRElBRwogLyogcHJlc2VydmUgc3BhY2UgZm9yIHRoZSBwb3N0X3dvcmQgYXQgZW5kIG9mIG9uLWNoaXAgU1JBTSAqLwogI2RlZmluZSBNUEM1WFhYX1NSQU1fUE9TVF9TSVpFIE1QQzVYWFhfU1JBTV9TSVpFLTQKLSNlbHNlCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIDAKICNlbmRpZgogCi0vKiBJREUgKi8KLSNkZWZpbmUgQUREX0lERV9DTUQJCShDRkdfQ01EX0lERSB8IENGR19DTURfRkFUIHwgQ0ZHX0NNRF9FWFQyKQogCiAvKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQUREX0JNUF9DTUQJfCBcCi0JCQkJQUREX0lERV9DTUQJfCBcCi0JCQkJQUREX1BDSV9DTUQJfCBcCi0JCQkJQUREX1VTQl9DTUQJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VDSE8JfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9QT1NUX0RJQUcgfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfU05UUAl8IFwKLQkJCQlDRkdfQ01EX0JTUCkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VDSE8KKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKworI2lmZGVmIENPTkZJR19WSURFTworI2RlZmluZSBDT05GSUdfQ01EX0JNUAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUE9TVAorI2RlZmluZSBDT05GSUdfX0NNRF9ESUFHCisjZW5kaWYKKwogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIGRpc3BsYXkgaW1hZ2UgdGltZXN0YW1wcyAqLwogCkBAIC0zOTQsNyArMzkyLDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTQwMyw2ICs0MDEsMTEgQEAKICNkZWZpbmUgQ0ZHX01BWEFSR1MJCTE2CS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCiAjZGVmaW5lIENGR19CQVJHU0laRQkJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKiBFbmFibGUgYW4gYWx0ZXJuYXRlLCBtb3JlIGV4dGVuc2l2ZSBtZW1vcnkgdGVzdCAqLwogI2RlZmluZSBDRkdfQUxUX01FTVRFU1QKIApAQCAtNDE0LDggKzQxNyw3IEBACiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCiAvKgotICogRW5hYmxlIGxvb3B3IGNvbW1hbmRvLiBUaGlzIGhhcyBvbmx5IGFmZmVjdCwgaWYgQ0ZHX0NNRF9NRU0gaXMgZGVmaW5lZCwKLSAqIHdoaWNoIGlzIG5vcm1hbGx5IHBhcnQgb2YgdGhlIGRlZmF1bHQgY29tbWFuZHMgKENGVl9DTURfREZMKQorICogRW5hYmxlIGxvb3B3IGNvbW1hbmQuCiAgKi8KICNkZWZpbmUgQ09ORklHX0xPT1BXCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UT1A1MjAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvVE9QNTIwMC5oCmluZGV4IDFjYzljZTkuLjcyNDBjZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UT1A1MjAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RPUDUyMDAuaApAQCAtNTAsMTEgKzUwLDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJICAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC04MSwxMiArNzYsNiBAQAogIyAgZGVmaW5lIENPTkZJR19QQ0lfSU9fUEhZUwlDT05GSUdfUENJX0lPX0JVUwogIyAgZGVmaW5lIENPTkZJR19QQ0lfSU9fU0laRQkweDAxMDAwMDAwCiAKLSMgIGRlZmluZSBBRERfUENJX0NNRCAJCUNGR19DTURfUENJCi0KLSNlbHNlCS8qIG5vIEV2YWx1YXRpb24gYm9hcmQgKi8KLQotIyAgZGVmaW5lIEFERF9QQ0lfQ01ECQkwICAvKiBubyBDRkdfQ01EX1BDSSAqLwotCiAjZW5kaWYKIAogLyogVVNCICovCkBAIC05OSw0OSArODgsNDkgQEAKICMgIGVsc2UKICMgICAgZGVmaW5lIENPTkZJR19VU0JfQ09ORklHCTB4MDAwMDEwMDAKICMgIGVuZGlmCi0jICBkZWZpbmUgQUREX1VTQl9DTUQgICAgICAgICAgICAgQ0ZHX0NNRF9VU0IgfCBDRkdfQ01EX0ZBVAogIyAgZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAjICBkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCiAKLSNlbHNlCi0KLSMgIGRlZmluZSBBRERfVVNCX0NNRAkJMAotCiAjZW5kaWYKIAogLyogSURFICovCiAjaWYgZGVmaW5lZCAoQ09ORklHX0VWQUw1MjAwKSB8fCBkZWZpbmVkIChDT05GSUdfTElURTUyMDApCi0KLSMgIGRlZmluZSBBRERfSURFX0NNRCAgICAgICAgICAgICBDRkdfQ01EX0lERSB8IENGR19DTURfRkFUCiAjICBkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KLQotI2Vsc2UKLQotIyAgZGVmaW5lIEFERF9JREVfQ01ECQkwCi0KICNlbmRpZgogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQUREX1BDSV9DTUQJfCBcCi0JCQkJQUREX1VTQl9DTUQJfCBcCi0JCQkJQUREX0lERV9DTUQJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9JTU1BUAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX01JSSAJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJXAotCQkJICAgICAgKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKworI2lmIGRlZmluZWQgKENPTkZJR19FVkFMNTIwMCkgfHwgZGVmaW5lZCAoQ09ORklHX0xJVEU1MjAwKQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX1VTQgorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCisKIAogLyoKICAqIE1VU1QgYmUgbG93IGJvb3QgLSBISUdIQk9PVCBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUKQEAgLTMzNiw3ICszMjUsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogIyAgZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTM1Miw2ICszNDEsMTIgQEAKIAogI2RlZmluZSBDRkdfSFoJCQkxMDAwCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKKwogI2lmZGVmIENPTkZJR19FVkFMNTIwMAkJLyogTTQ4VDA4IGlzIGF2YWlsYWJsZSB3aXRoIHRoZSBFdmFsdWF0aW9uIGJvYXJkIG9ubHkgKi8KICAgI2RlZmluZSBDT05GSUdfUlRDX01LNDhUNTkJMQkvKiB1c2UgTTQ4VDA4IG9uIEVWQUw1MjAwICovCiAgICNkZWZpbmUgUlRDKHJlZykJCSgweGYwMDEwMDAwK3JlZykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UT1A4NjAuaCBiL2luY2x1ZGUvY29uZmlncy9UT1A4NjAuaAppbmRleCAyMzQ0Yjk2Li42NmY3YTExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVE9QODYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RPUDg2MC5oCkBAIC0xMDcsMzAgKzEwNywyOCBAQAogICovCiAjZGVmaW5lIENGR19NQVRDSF9QQVJUSUFMX0NNRAogCisKIC8qCi0gKiBMaXN0IG9mIGF2YWlsYWJsZSBtb25pdG9yIGNvbW1hbmRzLiAgVXNlIHRoZSBzeXN0ZW0gZGVmYXVsdCBsaXN0Ci0gKiBwbHVzIGFkZCBzb21lIG9mIHRoZSAibm9uLXN0YW5kYXJkIiBjb21tYW5kcyBiYWNrIGluLgotICogU2VlIC4vY21kX2NvbmZkZWZzLmgKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCQkJCQlDRkdfQ01EX0kyQwkJfCBcCi0JCQkJCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJCQkJCUNGR19DTURfSU1NQVAJfCBcCi0JCQkJCQkJCUNGR19DTURfRUxGCQl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCQkJCQlDRkdfQ01EX01JSSAJfCBcCi0JCQkJCQkJCUNGR19DTURfQkVEQlVHCVwKLQkJCQkJCSAgICAgICkKKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisKIAogI2RlZmluZQlDT05GSUdfQVVUT1NDUklQVAkJMQogI2RlZmluZQlDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQogI3VuZGVmCUNPTkZJR19MT0FEU19FQ0hPCQkJLyogTk8gZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwpAQCAtMTQxLDcgKzEzOSw3IEBACiAgI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIzOSw3ICsyMzcsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC00MTEsMTAgKzQwOSwxMSBAQAogLyoKICAqIEJPT1RQIG9wdGlvbnMKICAqLwotI3VuZGVmCUNPTkZJR19CT09UUF9NQVNLCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCQkJCSggQ09ORklHX0JPT1RQX0RFRkFVTFQJCXwgXAotCQkJCQkJCQkJICAJICBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFICAgXAotCQkJCQkJCQkJCSkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU01MjAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNNTIwMC5oCmluZGV4IGFhMzYyN2IuLjNkOTg1MDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU01MjAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTUyMDAuaApAQCAtNDcsMTEgKzQ3LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtMTA1LDEyICsxMDAsNiBAQAogI2RlZmluZSBDT05GSUdfTlM4MzgyWAkJMQogI2VuZGlmCS8qIENPTkZJR19TVEs1MlhYICovCiAKLSNpZmRlZiBDT05GSUdfUENJCi0jZGVmaW5lIEFERF9QQ0lfQ01ECQlDRkdfQ01EX1BDSQotI2Vsc2UKLSNkZWZpbmUgQUREX1BDSV9DTUQJCTAKLSNlbmRpZgotCiAvKgogICogVmlkZW8gY29uc29sZQogICovCkBAIC0xMzMsMTEgKzEyMiw2IEBACiAjZGVmaW5lIENGR19DT05TT0xFX0lTX0lOX0VOVgogI2VuZGlmIC8qICNpZm5kZWYgQ09ORklHX1RRTTUyMDBTICovCiAKLSNpZmRlZiBDT05GSUdfVklERU8KLSNkZWZpbmUgQUREX0JNUF9DTUQJCUNGR19DTURfQk1QCi0jZWxzZQotI2RlZmluZSBBRERfQk1QX0NNRAkJMAotI2VuZGlmCiAKIC8qIFBhcnRpdGlvbnMgKi8KICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KQEAgLTE0NiwxMSArMTMwLDE3IEBACiAKIC8qIFVTQiAqLwogI2lmIGRlZmluZWQoQ09ORklHX1NUSzUyWFgpIHx8IGRlZmluZWQoQ09ORklHX0ZPMzAwKQotI2RlZmluZSBDT05GSUdfVVNCX09IQ0kKLSNkZWZpbmUgQUREX1VTQl9DTUQJCUNGR19DTURfVVNCIHwgQ0ZHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX1VTQl9PSENJX05FVwogI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UKLSNlbHNlCi0jZGVmaW5lIEFERF9VU0JfQ01ECQkwCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisKKyN1bmRlZiBDRkdfVVNCX09IQ0lfQk9BUkRfSU5JVAorI2RlZmluZSBDRkdfVVNCX09IQ0lfQ1BVX0lOSVQKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1JFR1NfQkFTRQlNUEM1WFhYX1VTQgorI2RlZmluZSBDRkdfVVNCX09IQ0lfU0xPVF9OQU1FCSJtcGM1MjAwIgorI2RlZmluZSBDRkdfVVNCX09IQ0lfTUFYX1JPT1RfUE9SVFMJMTUKKwogI2VuZGlmCiAKICNpZm5kZWYgQ09ORklHX0NBTTUyMDAKQEAgLTE2MSw0NCArMTUxLDYxIEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QT1NUCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIENGR19DTURfRElBRwogLyogcHJlc2VydmUgc3BhY2UgZm9yIHRoZSBwb3N0X3dvcmQgYXQgZW5kIG9mIG9uLWNoaXAgU1JBTSAqLwogI2RlZmluZSBNUEM1WFhYX1NSQU1fUE9TVF9TSVpFIE1QQzVYWFhfU1JBTV9TSVpFLTQKLSNlbHNlCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIDAKICNlbmRpZgogCi0vKiBJREUgKi8KLSNpZiBkZWZpbmVkIChDT05GSUdfTUlOSUZBUCkgfHwgZGVmaW5lZCAoQ09ORklHX1NUSzUyWFgpIHx8IGRlZmluZWQoQ09ORklHX0ZPMzAwKQotI2RlZmluZSBBRERfSURFX0NNRAkJKENGR19DTURfSURFIHwgQ0ZHX0NNRF9GQVQgfCBDRkdfQ01EX0VYVDIpCi0jZWxzZQotI2RlZmluZSBBRERfSURFX0NNRAkJMAotI2VuZGlmCiAKIC8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlBRERfQk1QX0NNRAl8IFwKLQkJCQlBRERfSURFX0NNRAl8IFwKLQkJCQlBRERfUENJX0NNRAl8IFwKLQkJCQlBRERfVVNCX0NNRAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUE9TVF9ESUFHIHwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NOVFAJfCBcCi0JCQkJQ0ZHX0NNRF9CU1ApCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorCisjaWZkZWYgQ09ORklHX1ZJREVPCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0JNUAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJCisjZGVmaW5lIENPTkZJR19DTURfQ01EX1BDSQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NSU5JRkFQKSB8fCBkZWZpbmVkKENPTkZJR19TVEs1MlhYKSB8fCBkZWZpbmVkKENPTkZJR19GTzMwMCkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfSURFCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NUSzUyWFgpIHx8IGRlZmluZWQoQ09ORklHX0ZPMzAwKQorICAgICNkZWZpbmUgQ09ORklHX0NGR19VU0IKKyAgICAjZGVmaW5lIENPTkZJR19DRkdfRkFUCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QT1NUCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNlbmRpZgorCiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogZGlzcGxheSBpbWFnZSB0aW1lc3RhbXBzICovCiAKQEAgLTU2Niw3ICs1NzMsMTIgQEAKICNkZWZpbmUJQ0ZHX0hVU0hfUEFSU0VSCQkxCS8qIHVzZSAiaHVzaCIgY29tbWFuZCBwYXJzZXIJKi8KICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC01ODYsOCArNTk4LDcgQEAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKIC8qCi0gKiBFbmFibGUgbG9vcHcgY29tbWFuZG8uIFRoaXMgaGFzIG9ubHkgYWZmZWN0LCBpZiBDRkdfQ01EX01FTSBpcyBkZWZpbmVkLAotICogd2hpY2ggaXMgbm9ybWFsbHkgcGFydCBvZiB0aGUgZGVmYXVsdCBjb21tYW5kcyAoQ0ZWX0NNRF9ERkwpCisgKiBFbmFibGUgbG9vcHcgY29tbWFuZC4KICAqLwogI2RlZmluZSBDT05GSUdfTE9PUFcKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RRTTgyM0wuaCBiL2luY2x1ZGUvY29uZmlncy9UUU04MjNMLmgKaW5kZXggMjQ3ZjcwNS4uMmJkY2YyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RRTTgyM0wuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODIzTC5oCkBAIC04OCwzNCArODgsMzggQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogI2lmZGVmCUNPTkZJR19TUExBU0hfU0NSRUVOCi0jIGRlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfQk1QCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKLSNlbHNlCi0jIGRlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfQk1QCiAjZW5kaWYKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTI5LDcgKzEzMyw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIxMiw3ICsyMTYsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODIzTS5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTgyM00uaAppbmRleCAxNDYxYjVmLi41OGJjNWQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODIzTS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04MjNNLmgKQEAgLTg4LDIzICs4OCwzNCBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTExOCw3ICsxMjksNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMDIsNyArMjEzLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RRTTgyNjAuaCBiL2luY2x1ZGUvY29uZmlncy9UUU04MjYwLmgKaW5kZXggZmZkNWMwYi4uM2I3ODMyMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RRTTgyNjAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODI2MC5oCkBAIC0xNjcsOCArMTY3LDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKgogICogKE9uIFRRTTgyNjAgZWl0aGVyIFNDQzEgb3IgRkNDMiBtYXkgYmUgY2hvc2VuOiBTQ0MxIGlzIGhhcmR3aXJlZCB0byB0aGUKICAqIFguMjkgY29ubmVjdG9yLCBhbmQgRkNDMiBpcyBoYXJkd2lyZWQgdG8gdGhlIFguMSBjb25uZWN0b3IpCkBAIC0yMjAsMTcgKzIxOSwyOCBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFR8Q09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0yNDQsNyArMjU0LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzg1LDcgKzM5NSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFICAgICAgMzIgICAgICAvKiBGb3IgTVBDODI2MCBDUFUgICAgICAgICAgICAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04MjcyLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODI3Mi5oCmluZGV4IDkyNWJmMzQuLjUwZjY3NTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04MjcyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTgyNzIuaApAQCAtOTcsMTAgKzk3LDYgQEAKIC8qIGVuYWJsZSBJMkMgYW5kIHNlbGVjdCB0aGUgaGFyZHdhcmUvc29mdHdhcmUgZHJpdmVyICovCiAjdW5kZWYgIENPTkZJR19IQVJEX0kyQwkJCS8qIEkyQyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQJKi8KICNkZWZpbmUgQ09ORklHX1NPRlRfSTJDCQkxCS8qIEkyQyBiaXQtYmFuZ2VkCQkqLwotI2RlZmluZSBBRERfQ01EX0kyQwkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXxcCi0JCQkJQ0ZHX0NNRF9EVFQJfFwKLQkJCQlDRkdfQ01EX0VFUFJPTQogI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMDAJLyogSTJDIHNwZWVkIGFuZCBzbGF2ZSBhZGRyZXNzCSovCiAjZGVmaW5lIENGR19JMkNfU0xBVkUJCTB4N0YKIApAQCAtMTQwLDcgKzEzNiw2IEBACiAjZWxzZQogI3VuZGVmIENPTkZJR19IQVJEX0kyQwogI3VuZGVmIENPTkZJR19TT0ZUX0kyQwotI2RlZmluZSBBRERfQ01EX0kyQwkJMAogI2VuZGlmCiAKIC8qCkBAIC0xNzcsOCArMTcyLDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKgogICogKE9uIFRRTTgyNzIgZWl0aGVyIFNDQzEgb3IgRkNDMiBtYXkgYmUgY2hvc2VuOiBTQ0MxIGlzIGhhcmR3aXJlZCB0byB0aGUKICAqIFguMjkgY29ubmVjdG9yLCBhbmQgRkNDMiBpcyBoYXJkd2lyZWQgdG8gdGhlIFguMSBjb25uZWN0b3IpCkBAIC0yNzIsMjAgKzI2NiwzNyBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFR8Q09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQUREX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKKyNpZiBDT05GSUdfSTJDCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0kyQworICAgICNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0RUVAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNlbmRpZgorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0zMDEsNyArMzEyLDcgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM5Miw3ICs0MDMsNyBAQAogICogTkFORC1GTEFTSCBzdHVmZgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2RlZmluZSBDRkdfTkFORF9DU19ESVNUCQkweDgwCiAjZGVmaW5lIENGR19OQU5EX1VQTV9XUklURV9DTURfT0ZTCTB4MjAKQEAgLTQzMCw3ICs0NDEsNyBAQAogCVdSSVRFX05BTkQoZCwgYWRkcik7IFwKIH0gd2hpbGUoMCkKIAotI2VuZGlmIC8qIENGR19DTURfTkFORCAqLworI2VuZGlmIC8qIENPTkZJR19DTURfTkFORCAqLwogCiAjZGVmaW5lCUNPTkZJR19QQ0kKICNpZmRlZiBDT05GSUdfUENJCkBAIC01MDIsNyArNTEzLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUgICAgICAzMiAgICAgIC8qIEZvciBNUEM4MjYwIENQVSAgICAgICAgICAgICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RRTTgzNHguaCBiL2luY2x1ZGUvY29uZmlncy9UUU04MzR4LmgKaW5kZXggNGE1ZjhiNi4uNjYxNzEyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RRTTgzNHguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODM0eC5oCkBAIC0yOCw5ICsyOCw2IEBACiAjaWZuZGVmIF9fQ09ORklHX0gKICNkZWZpbmUgX19DT05GSUdfSAogCi0jZGVmaW5lIERFQlVHCi0jdW5kZWYgREVCVUcKLQogLyoKICAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCiAgKi8KQEAgLTI4MSw3ICsyNzgsNiBAQAogI2RlZmluZSBDRkdfUENJMV9JT19QSFlTICAgICAgICBDRkdfUENJMV9JT19CQVNFCiAjZGVmaW5lIENGR19QQ0kxX0lPX1NJWkUgICAgICAgIDB4MTAwMDAwMCAgICAgICAvKiAxNk0gKi8KIAotCiAjdW5kZWYgQ09ORklHX0VFUFJPMTAwCiAjZGVmaW5lIENPTkZJR19FRVBSTzEwMAogI3VuZGVmIENPTkZJR19UVUxJUApAQCAtMzE2LDM5ICszMTIsMzcgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UgKi8KIAotLyogQ29tbW9uIGNvbW1hbmRzICovCi0jZGVmaW5lIENGR19DTURfVFFNODM0OV9DT01NT04JQ0ZHX0NNRF9EQVRFIHwgQ0ZHX0NNRF9JMkMgfCBDRkdfQ01EX0RUVFwKLQkJCQl8IENGR19DTURfUElORyB8IENGR19DTURfRUVQUk9NCQlcCi0JCQkJfCBDRkdfQ01EX01JSSB8IENGR19DTURfSkZGUzIKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRFRUCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENGR19SQU1CT09UKQotCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSQlcCi0JCQkJfCBDRkdfQ01EX1RRTTgzNDlfQ09NTU9OKQlcCi0JCQkJJgkJCQlcCi0JCQkJfihDRkdfQ01EX0VOViB8IENGR19DTURfTE9BRFMpKQotI2Vsc2UKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX1RRTTgzNDlfQ09NTU9OKQlcCi0JCQkJJgkJCQlcCi0JCQkJfihDRkdfQ01EX0VOViB8IENGR19DTURfTE9BRFMpKQorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgorICAgICN1bmRlZiBDT05GSUdfQ01EX0xPQURTCiAjZW5kaWYKIAotI2Vsc2UgLyogQ0ZHX1JBTUJPT1QgKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSQlcCi0JCQkJfCBDRkdfQ01EX1RRTTgzNDlfQ09NTU9OKQotI2Vsc2UKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwJCQlcCi0JCQkJfCBDRkdfQ01EX1RRTTgzNDlfQ09NTU9OKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBDRkdfUkFNQk9PVCAqLwotCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KQEAgLTM2Miw3ICszNTYsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAkjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAJI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTM4Nyw3ICszODEsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKQEAgLTQ5NSw3ICs0ODksNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgb2Yga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RRTTg1MEwuaCBiL2luY2x1ZGUvY29uZmlncy9UUU04NTBMLmgKaW5kZXggOTBlY2JhZC4uNzRiMTZjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RRTTg1MEwuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODUwTC5oCkBAIC04MCwyMyArODAsMzMgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTEwLDcgKzEyMCw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE5Myw3ICsyMDMsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODUwTS5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTg1ME0uaAppbmRleCBiM2Y4ZjhkLi5lMzkzNmMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODUwTS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04NTBNLmgKQEAgLTc4LDIzICs3OCwzMyBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xMDgsNyArMTE4LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTkyLDcgKzIwMiw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04NTVMLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODU1TC5oCmluZGV4IDQ5YWFlZWEuLmFlMjJiNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04NTVMLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTg1NUwuaApAQCAtODMsMjMgKzgzLDM0IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTEzLDcgKzEyNCw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE5Niw3ICsyMDcsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODU1TS5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTg1NU0uaAppbmRleCA1MGRmNDllLi41ZDU0Zjg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODU1TS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04NTVNLmgKQEAgLTExNiwyNCArMTE2LDM1IEBACiAjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9CSVRTCTUKICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTE0Nyw3ICsxNTgsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMzEsNyArMjQyLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RRTTg1eHguaCBiL2luY2x1ZGUvY29uZmlncy9UUU04NXh4LmgKaW5kZXggYjBiOWRkMy4uZDVjZTNiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RRTTg1eHguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODV4eC5oCkBAIC0zNTcsMjQgKzM1NywzNSBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0cwkqLwogCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRFRUCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jIGRlZmluZSBBRERfUENJX0NNRAkJKENGR19DTURfUENJKQotI2Vsc2UKLSMgZGVmaW5lIEFERF9QQ0lfQ01ECQkwCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJIENGR19DTURfREhDUAl8IFwKLQkJCQkgQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJIENGR19DTURfU05UUAl8IFwKLQkJCQkgQUREX1BDSV9DTUQJfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX0RBVEUJfCBcCi0JCQkJIENGR19DTURfRUVQUk9NCXwgXAotCQkJCSBDRkdfQ01EX0RUVAl8IFwKLQkJCQkgQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJIENGR19DTURfUElORwkpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMzg1LDcgKzM5Niw3IEBACiAjZGVmaW5lIENGR19MT0FEX0FERFIJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzCQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICAgICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtNDA2LDcgKzQxNyw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC00MTgsNyArNDI5LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0Ki8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlCSovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04NjBMLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODYwTC5oCmluZGV4IDliZTVkYjEuLjQwYzA5NDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04NjBMLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTg2MEwuaApAQCAtODMsMjcgKzgzLDM4IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAjZGVmaW5lIENPTkZJR19ORVRDT05TT0xFCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwpAQCAtMTE2LDcgKzEyNyw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE5OSw3ICsyMTAsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODYwTS5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTg2ME0uaAppbmRleCAzN2Y2Yzk4Li40ODFlM2QwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODYwTS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04NjBNLmgKQEAgLTgzLDI0ICs4MywzNSBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTExNCw3ICsxMjUsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xOTgsNyArMjA5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RRTTg2MkwuaCBiL2luY2x1ZGUvY29uZmlncy9UUU04NjJMLmgKaW5kZXggZjAzNjkwYS4uYmIzYjFjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RRTTg2MkwuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODYyTC5oCkBAIC04NiwyMyArODYsMzQgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xMTYsNyArMTI3LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjAwLDcgKzIxMSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04NjJNLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODYyTS5oCmluZGV4IDQ5NTkzNDAuLmQ2ODdkMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04NjJNLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTg2Mk0uaApAQCAtODYsMjMgKzg2LDM0IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTE2LDcgKzEyNyw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIwMSw3ICsyMTIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODY2TS5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTg2Nk0uaAppbmRleCAxNDg0OTBiLi5mZjAwYzEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODY2TS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04NjZNLmgKQEAgLTEyNSw3ICsxMjUsMTUgQEAKICNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0JJVFMJNAogI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfREVMQVlfTVMJMTAJLyogYW5kIHRha2VzIHVwIHRvIDEwIG1zZWMgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC0xMzQsMTYgKzE0MiwxOSBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIGJ1dCBwcmludCBpbWFnZSB0aW1lc3RtcHMJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTU3LDcgKzE2OCw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI0MSw3ICsyNTIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODg1RC5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTg4NUQuaAppbmRleCBkNDcwYWRlLi5mMzZiNzI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODg1RC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04ODVELmgKQEAgLTEzMSw3ICsxMzEsMTUgQEAKICMgZGVmaW5lIENPTkZJR19SVENfRFMxMzM3IDEKICMgZGVmaW5lIENGR19JMkNfUlRDX0FERFIgMHg2OAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTE0MCwxOSArMTQ4LDIyIEBACiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogYnV0IHByaW50IGltYWdlIHRpbWVzdG1wcwkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HICkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTY2LDcgKzE3Nyw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE4Nyw4ICsxOTgsNyBAQAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCiAvKgotICogRW5hYmxlIGxvb3B3IGNvbW1hbmRvLiBUaGlzIGhhcyBvbmx5IGVmZmVjdCwgaWYgQ0ZHX0NNRF9NRU0gaXMgZGVmaW5lZCwKLSAqIHdoaWNoIGlzIG5vcm1hbGx5IHBhcnQgb2YgdGhlIGRlZmF1bHQgY29tbWFuZHMgKENGVl9DTURfREZMKQorICogRW5hYmxlIGxvb3B3IGNvbW1hbmQuCiAgKi8KICNkZWZpbmUgQ09ORklHX0xPT1BXCiAKQEAgLTI1OCw3ICsyNjgsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC00NzgsNyArNDg4LDcgQEAKICNkZWZpbmUgQ09ORklHX0VUSEVSX09OX0ZFQzEJCS8qIC4uLiBmb3IgRkVDMSAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkVDMgkJLyogLi4uIGZvciBGRUMyICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKICNkZWZpbmUgQ0ZHX0RJU0NPVkVSX1BIWQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9Ub3RhbDUyMDAuaCBiL2luY2x1ZGUvY29uZmlncy9Ub3RhbDUyMDAuaAppbmRleCBkODY4NmRkLi45ZWRmNzkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVG90YWw1MjAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RvdGFsNTIwMC5oCkBAIC00OCwxMSArNDgsNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkgICAgICovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTYzLDcgKzU4LDYgQEAKIC8qCiAgKiBWaWRlbyBjb25zb2xlCiAgKi8KLSNpZiAxCiAjZGVmaW5lIENPTkZJR19WSURFTwogI2RlZmluZSBDT05GSUdfVklERU9fU0VEMTM4MDYKICNkZWZpbmUgQ09ORklHX1ZJREVPX1NFRDEzODA2XzE2QlBQCkBAIC03NiwxMCArNzAsNiBAQAogI2RlZmluZSBDT05GSUdfVklERU9fU1dfQ1VSU09SCiAjZGVmaW5lIENPTkZJR19TUExBU0hfU0NSRUVOCiAKLSNkZWZpbmUgQUREX1ZJREVPX0NNRAlDRkdfQ01EX0JNUAotI2Vsc2UKLSNkZWZpbmUgQUREX1ZJREVPX0NNRAkwCi0jZW5kaWYKIAogI2lmZGVmIENPTkZJR19NUEM1MjAwCS8qIE1HVDUxMDAgUENJIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiAqLwogLyoKQEAgLTEwNSwxMiArOTUsOSBAQAogI2RlZmluZSBDRkdfUlhfRVRIX0JVRkZFUgk4ICAvKiB1c2UgOCByeCBidWZmZXIgb24gZWVwcm8xMDAgICovCiAjZGVmaW5lIENPTkZJR19OUzgzODJYCQkxCiAKLSNkZWZpbmUgQUREX1BDSV9DTUQgCQlDRkdfQ01EX1BDSQotCiAjZWxzZQkvKiBNR1Q1MTAwICovCiAKICNkZWZpbmUgQ09ORklHX01JSQkJMQotI2RlZmluZSBBRERfUENJX0NNRAkJMCAgLyogbm8gQ0ZHX0NNRF9QQ0kgKi8KIAogI2VuZGlmCiAKQEAgLTExOSwyOSArMTA2LDM2IEBACiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKIC8qIFVTQiAqLwotI2lmIDEKICNkZWZpbmUgQ09ORklHX1VTQl9PSENJCi0jZGVmaW5lIEFERF9VU0JfQ01EICAgICAgICAgICAgIENGR19DTURfVVNCIHwgQ0ZHX0NNRF9GQVQKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCi0jZWxzZQotI2RlZmluZSBBRERfVVNCX0NNRCAgICAgICAgICAgICAwCi0jZW5kaWYKKwogCiAvKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJIENGR19DTURfUElORwl8IFwKLQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJIENGR19DTURfRUVQUk9NCXwgXAotCQkJCSBDRkdfQ01EX0ZBVAl8IFwKLQkJCQkgQ0ZHX0NNRF9JREUJfCBcCi0JCQkJIEFERF9WSURFT19DTUQgIHwgXAotCQkJCSBBRERfUENJX0NNRAl8IFwKLQkJCQkgQUREX1VTQl9DTUQpCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfTVBDNTIwMCkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfQ01EX0JNUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKwogCiAjaWYgKFRFWFRfQkFTRSA9PSAweEZFMDAwMDAwKQkJLyogQm9vdCBsb3cgKi8KICMgICBkZWZpbmUgQ0ZHX0xPV0JPT1QJCTEKQEAgLTMwMyw3ICsyOTcsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMzE5LDYgKzMxMywxMiBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKworCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1ZDTUE5LmggYi9pbmNsdWRlL2NvbmZpZ3MvVkNNQTkuaAppbmRleCA1ZjQ4YTcwLi5kZjY4OTRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVkNNQTkuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVkNNQTkuaApAQCAtNDgsMjcgKzQ4LDMzIEBACiAjZGVmaW5lIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUyAxCiAjZGVmaW5lIENPTkZJR19JTklUUkRfVEFHCSAxCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29tbWFuZCBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyBcCi0JCQkoQ09ORklHX0NNRF9ERkwJIHwgXAotCQkJQ0ZHX0NNRF9DQUNIRQkgfCBcCi0JCQkvKkNGR19DTURfSkZGUzIJIHwqLyBcCi0JCQkvKkNGR19DTURfTkFORAkgfCovIFwKLQkJCUNGR19DTURfRUVQUk9NCSB8IFwKLQkJCUNGR19DTURfSTJDCSB8IFwKLQkJCUNGR19DTURfVVNCCSB8IFwKLQkJCUNGR19DTURfUkVHSU5GTyAgfCBcCi0JCQlDRkdfQ01EX0ZBVAkgfCBcCi0JCQlDRkdfQ01EX0RBVEUJIHwgXAotCQkJQ0ZHX0NNRF9FTEYJIHwgXAotCQkJQ0ZHX0NNRF9ESENQCSB8IFwKLQkJCUNGR19DTURfUElORwkgfCBcCi0JCQlDRkdfQ01EX0JTUCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIGFmdGVyIHRoZSBkZWZpbml0b24gb2YgQ09ORklHX0NPTU1BTkRTICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisKIAogI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMiAiPiAiCkBAIC0xNDUsNyArMTUxLDcgQEAKICNkZWZpbmUgQ09ORklHX0lQQUREUgkJMTAuMC4wLjExMAogI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCTEwLjAuMC4xCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpAQCAtMjQ2LDcgKzI1Miw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBOQU5EIGZsYXNoIHNldHRpbmdzCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogI2RlZmluZSBDRkdfTUFYX05BTkRfREVWSUNFCTEJLyogTWF4IG51bWJlciBvZiBOQU5EIGRldmljZXMJCSovCkBAIC0yODAsNiArMjg2LDYgQEAKICNkZWZpbmUgQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURQkxCiAjZGVmaW5lIENPTkZJR19NVERfTkFORF9FQ0NfSkZGUzIJMQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EICovCisjZW5kaWYKIAogI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9WT0g0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9WT0g0MDUuaAppbmRleCA5NmYzZDI2Li4zNGYwZWJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVk9INDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1ZPSDQwNS5oCkBAIC01OCwyOCArNTgsNDAgQEAKIAogI2RlZmluZSBDT05GSUdfUEhZX0NMS19GUkVRCUVNQUNfU1RBQ1JfQ0xLXzY2TUhaIC8qIDY2IE1IeiBPUEIgY2xvY2sqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NQzE0NjgxOAkJLyogRFMxNjg1IGlzIE1DMTQ2ODE4IGNvbXBhdGlibGUqLwpAQCAtOTgsNyArMTEwLDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzE5LDcgKzMzMSw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVk9NNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvVk9NNDA1LmgKaW5kZXggZjJmM2VhNy4uNTUxMmY0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1ZPTTQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9WT000MDUuaApAQCAtNjAsMjQgKzYwLDMzIEBACiAjZGVmaW5lIENPTkZJR19MWFQ5NzFfTk9fU0xFRVAgIDEgICAgICAgLyogZGlzYWJsZSBzbGVlcCBtb2RlIGluIExYVDk3MSAqLwogI2RlZmluZSBDT05GSUdfUkVTRVRfUEhZX1IgICAgICAxICAgICAgIC8qIHVzZSByZXNldF9waHkoKSB0byBkaXNhYmxlIHBoeSBzbGVlcCBtb2RlICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TMiB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUgKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUzIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtOTYsNyArMTA1LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjQ0LDcgKzI1Myw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVm9WUE4tR1cuaCBiL2luY2x1ZGUvY29uZmlncy9Wb1ZQTi1HVy5oCmluZGV4IDkyYmFkZTUuLjE0MDU3ODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9Wb1ZQTi1HVy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9Wb1ZQTi1HVy5oCkBAIC05NSw4ICs5NSw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwogI2RlZmluZQlDT05GSUdfRVRIRVJfT05fRkNDCkBAIC0xMzgsMjQgKzEzNywzNCBAQAogCiAjZW5kaWYKIAotLyogY29uZmlndXJlIGNvbW1hbmRzICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKAlDRkdfQ01EX0FVVE9TQ1JJUFQJfCBcCi0JCQkJCUNGR19DTURfQkRJCQl8IFwKLQkJCQkJQ0ZHX0NNRF9DT05TT0xFCQl8IFwKLQkJCQkJQ0ZHX0NNRF9FQ0hPCQl8IFwKLQkJCQkJQ0ZHX0NNRF9FTlYJCXwgXAotCQkJCQlDRkdfQ01EX0ZMQVNICQl8IFwKLQkJCQkJQ0ZHX0NNRF9JTUkJCXwgXAotCQkJCQlDRkdfQ01EX0lNTFMJCXwgXAotCQkJCQlDRkdfQ01EX0xPQURCCQl8IFwKLQkJCQkJQ0ZHX0NNRF9NRU1PUlkJCXwgXAotCQkJCQlDRkdfQ01EX01JU0MJCXwgXAotCQkJCQlDRkdfQ01EX05FVAkJfCBcCi0JCQkJCUNGR19DTURfUElORwkJfCBcCi0JCQkJCUNGR19DTURfUlVOCSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisKKyNkZWZpbmUgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfQ09OU09MRQorI2RlZmluZSBDT05GSUdfQ01EX0VDSE8KKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0lNTFMKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX01JU0MKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisKIAogLyoKICAqIGJvb3Qgb3B0aW9ucyAmIGVudmlyb25tZW50CkBAIC0yMDYsNyArMjE1LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVAkJCSI9PiAiCiAKIC8qIGNvbnNvbGUgaS9vIGJ1ZmZlciBzaXplICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJCTEwMjQKICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCQkyNTYKQEAgLTMwNSw3ICszMTQsNyBAQAogCiAvKiBjYWNoZSBjb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkJMzIgICAgICAvKiBmb3IgTVBDODI2MCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJCTUJLyogbG9nIGJhc2UgMiBvZiBhYm92ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9XN09MTUMuaCBiL2luY2x1ZGUvY29uZmlncy9XN09MTUMuaAppbmRleCA4ZGM2MjNlLi5mYzE3N2ZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVzdPTE1DLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1c3T0xNQy5oCkBAIC03MCwxMyArNzAsMzEgQEAKIAogI2RlZmluZSBDT05GSUdfUlRDX000OFQzNUEJMQkJLyogU1QgRWxlY3Ryb25pY3MgTTQ4IHRpbWVrZWVwZXIgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCVwKLQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IENGR19DTURfSVJRIHwgQ0ZHX0NNRF9BU0tFTlYgfCBcCi0JIENGR19DTURfREhDUCB8IENGR19DTURfQkVEQlVHIHwgQ0ZHX0NNRF9EQVRFIHwgQ0ZHX0NNRF9JMkMgfCBcCi0JIENGR19DTURfRUVQUk9NIHwgQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX0JTUCB8IENGR19DTURfUkVHSU5GTykKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KICNkZWZpbmUgQ09ORklHX0hXX1dBVENIRE9HCQkJLyogSFcgV2F0Y2hkb2csIGJvYXJkIHNwZWNpZmljCSovCkBAIC05Miw3ICsxMTAsNyBAQAogI2lmZGVmICBDRkdfSFVTSF9QQVJTRVIKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMiAgICAgIj4gIgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI3Nyw3ICsyOTUsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkJLyogRm9yIEFNQ0MgNDA1IENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJCS8qIC4uLgkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJCS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbC4gKi8KICNlbmRpZgogCkBAIC0zMDksNyArMzI3LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlCSovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9XN09MTUcuaCBiL2luY2x1ZGUvY29uZmlncy9XN09MTUcuaAppbmRleCAyYmQ5OGIzLi4yMGQ2OTNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVzdPTE1HLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1c3T0xNRy5oCkBAIC03NSwxNCArNzUsMzQgQEAKICNkZWZpbmUgQ0ZHX0RUVF9MT1dfVEVNUAktMzAKICNkZWZpbmUgQ0ZHX0RUVF9IWVNURVJFU0lTCTMKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCVwKLQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IENGR19DTURfSVJRIHwgQ0ZHX0NNRF9BU0tFTlYgfCBcCi0JIENGR19DTURfREhDUCB8IENGR19DTURfQkVEQlVHIHwgQ0ZHX0NNRF9EQVRFIHwgQ0ZHX0NNRF9JMkMgfCBcCi0JIENGR19DTURfRUVQUk9NIHwgQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX0JTUCB8IENGR19DTURfUkVHSU5GTyB8IFwKLQkgQ0ZHX0NNRF9EVFQpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9EVFQKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogI2RlZmluZSBDT05GSUdfSFdfV0FUQ0hET0cJCQkvKiBIVyBXYXRjaGRvZywgYm9hcmQgc3BlY2lmaWMJKi8KQEAgLTk4LDcgKzExOCw3IEBACiAjaWZkZWYgIENGR19IVVNIX1BBUlNFUgogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyICAgICAiPiAiCiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjc4LDcgKzI5OCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCQkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkJLyogLi4uCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsLiAqLwogI2VuZGlmCiAKQEAgLTMxMCw3ICszMzAsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UJKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1dVSDQwNS5oIGIvaW5jbHVkZS9jb25maWdzL1dVSDQwNS5oCmluZGV4IGZhZjg1NWQuLmMxYjNkYTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9XVUg0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvV1VINDA1LmgKQEAgLTYwLDE5ICs2MCwzMSBAQAogCiAjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJRU1BQ19TVEFDUl9DTEtfNjZNSFogLyogNjYgTUh6IE9QQiBjbG9jayovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTkyLDcgKzEwNCw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI3MCw3ICsyODIsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1hQRURJVEUxSy5oIGIvaW5jbHVkZS9jb25maWdzL1hQRURJVEUxSy5oCmluZGV4IGYyYWQwOTcuLjYxMWY1YTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9YUEVESVRFMUsuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvWFBFRElURTFLLmgKQEAgLTE4MiwyNSArMTgyLDMzIEBACiAjZGVmaW5lIENPTkZJR19IQVNfRVRIMgkJMQkvKiBhZGQgc3VwcG9ydCBmb3IgImV0aDJhZGRyIgkqLwogI2RlZmluZSBDT05GSUdfSEFTX0VUSDMJCTEJLyogYWRkIHN1cHBvcnQgZm9yICJldGgzYWRkciIJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HIHwgXAotCQkJCUNGR19DTURfRUxGIHwgXAotCQkJCUNGR19DTURfTUlJIHwgXAotCQkJCUNGR19DTURfRElBRyB8IFwKLQkJCQlDRkdfQ01EX0ZBVCApCiAKLS8qCQkJCUNGR19DTURfREhDUAl8IFwgKi8KLS8qCQkJCUNGR19DTURfS0dEQgl8IFwgKi8KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTIwOSw3ICsyMTcsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNTQsNyArMjYyLDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIgLyogRm9yIEFNQ0MgNDQwR1ggQ1BVcyAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC0yNjYsNyArMjc0LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ZdWtvbjgyMjAuaCBiL2luY2x1ZGUvY29uZmlncy9ZdWtvbjgyMjAuaAppbmRleCAzN2VmMTA1Li4wMGM0ZmYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvWXVrb244MjIwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1l1a29uODIyMC5oCkBAIC0zOSwxMiArMzksNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjIwIENQVXMgKi8KLQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1ICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC03MCwzMSArNjQsNDAgQEAKIAogI2RlZmluZSBDT05GSUdfVElNRVNUQU1QCQkJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCisKIC8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0JPT1RECXwgXAotCQkJCUNGR19DTURfQ0FDSEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElBRwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfU0RSQU0JfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CT09URAorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQogI2RlZmluZSBDT05GSUdfTUlJCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIEF1dG9ib290aW5nCiAgKi8KQEAgLTI5Myw3ICsyOTYsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCSAgICAvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkgICAgLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMDksNiArMzEyLDExIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkgICAgLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODIyMCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1ICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1pQQzE5MDAuaCBiL2luY2x1ZGUvY29uZmlncy9aUEMxOTAwLmgKaW5kZXggYTUwODVjZi4uN2MxYTViOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1pQQzE5MDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvWlBDMTkwMC5oCkBAIC01NSw4ICs1NSw4IEBACiAgKiBTQ0MsIDEtMyBmb3IgRkNDKQogICoKICAqIElmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcwotICogbXVzdCBiZSBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdAotICogYmUgcmVtb3ZlZCBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIG11c3QgYmUgZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUCisgKiBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogRXRoZXJuZXQgaXMgbm90IG9uIFNDQyAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBFdGhlcm5ldCBpcyBvbiBGQ0MgICAgICovCkBAIC0xMDYsMjIgKzEwNiwzMyBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMzg0MDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAgIFwKLQkJCQl8IENGR19DTURfQVNLRU5WICBcCi0JCQkJfCBDRkdfQ01EX0RIQ1AgICAgXAotCQkJCXwgQ0ZHX0NNRF9JTU1BUCAgIFwKLQkJCQl8IENGR19DTURfTUlJICAgICBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgICAgXAotCQkJCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQkvKiBhdXRvYm9vdCBhZnRlciA1IHNlY29uZHMgKi8KICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJkaGNwO2Jvb3RtIgkvKiBhdXRvYm9vdCBjb21tYW5kICovCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9uZnMgcncgaXA9Ojo6OjpldGgwOmRoY3AiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjZGVmaW5lIENPTkZJR19LR0RCX09OX1NDQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU0NDICovCiAjdW5kZWYJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTEzOSw3ICsxNTAsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0yMjMsNyArMjM0LDcgQEAKICNlbmRpZgogCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI2MCBDUFUgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKQEAgLTI0OCwxOCArMjU5LDE4IEBACiAjZGVmaW5lIENGR19MU1JUCQkweDBGCiAjZGVmaW5lIENGR19NUFRQUgkJMHg0MDAwCiAKLSNkZWZpbmUgQ0ZHX1BTRFJBTV9CUgkJQ0ZHX1NEUkFNX0JBU0UgfCAweDAwMDAwMDQxCisjZGVmaW5lIENGR19QU0RSQU1fQlIJCShDRkdfU0RSQU1fQkFTRSB8IDB4MDAwMDAwNDEpCiAjZGVmaW5lIENGR19QU0RSQU1fT1IJCTB4RkMwMDI4QzAKLSNkZWZpbmUgQ0ZHX0xTRFJBTV9CUgkJQ0ZHX0xTRFJBTV9CQVNFIHwgMHgwMDAwMTg2MQorI2RlZmluZSBDRkdfTFNEUkFNX0JSCQkoQ0ZHX0xTRFJBTV9CQVNFIHwgMHgwMDAwMTg2MSkKICNkZWZpbmUgQ0ZHX0xTRFJBTV9PUgkJMHhGRjgwMzQ4MAogCi0jZGVmaW5lIENGR19CUjBfUFJFTElNCQlDRkdfRkxBU0hfQkFTRSB8IDB4MDAwMDA4MDEKKyNkZWZpbmUgQ0ZHX0JSMF9QUkVMSU0JCShDRkdfRkxBU0hfQkFTRSB8IDB4MDAwMDA4MDEpCiAjZGVmaW5lIENGR19PUjBfUFJFTElNCQkweEZGRTAwODU2Ci0jZGVmaW5lIENGR19CUjVfUFJFTElNCQlDRkdfRUVQUk9NIHwgMHgwMDAwMDgwMQorI2RlZmluZSBDRkdfQlI1X1BSRUxJTQkJKENGR19FRVBST00gfCAweDAwMDAwODAxKQogI2RlZmluZSBDRkdfT1I1X1BSRUxJTQkJMHhGRkZGMDNGNgotI2RlZmluZSBDRkdfQlI2X1BSRUxJTQkJQ0ZHX0ZMU0lNTV9CQVNFIHwgMHgwMDAwMTgwMQorI2RlZmluZSBDRkdfQlI2X1BSRUxJTQkJKENGR19GTFNJTU1fQkFTRSB8IDB4MDAwMDE4MDEpCiAjZGVmaW5lIENGR19PUjZfUFJFTElNCQkweEZGMDAwODU2Ci0jZGVmaW5lIENGR19CUjdfUFJFTElNCQlDRkdfQkNTUiB8IDB4MDAwMDA4MDEKKyNkZWZpbmUgQ0ZHX0JSN19QUkVMSU0JCShDRkdfQkNTUiB8IDB4MDAwMDA4MDEpCiAjZGVmaW5lIENGR19PUjdfUFJFTElNCQkweEZGRkY4M0Y2CiAKICNkZWZpbmUgQ0ZHX1JFU0VUX0FERFJFU1MJMHhDMDAwMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1pVTUEuaCBiL2luY2x1ZGUvY29uZmlncy9aVU1BLmgKaW5kZXggZjE2M2QwMC4uNWJhOGQxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1pVTUEuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvWlVNQS5oCkBAIC0xMDEsMTcgKzEwMSwyOSBAQAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogI3VuZGVmCUNPTkZJR19BTFRJVkVDCQkJLyogdW5kZWYgdG8gZGlzYWJsZQkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCiAjZGVmaW5lIENPTkZJR19NSUkJCS8qIGVuYWJsZSBNSUkgY29tbWFuZHMgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQkgQ0ZHX0NNRF9BU0tFTlYgfCBcCi0JCQkJIENGR19DTURfQlNQCXwgXAotCQkJCSBDRkdfQ01EX0pGRlMyCXwgXAotCQkJCSBDRkdfQ01EX01JSQl8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfREFURQorCiAKIC8qCiAgKiBKRkZTMiBwYXJ0aXRpb25zCkBAIC0xMzEsMTUgKzE0MywxMiBAQAogI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz16dW1hLTE6LShqZmZzMiksenVtYS0yOi0odXNlcikiCiAqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM0OSw3ICszNTgsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgYWxsIE1QQzc0eHggQ1BVcwkJICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2FjYWRpYS5oIGIvaW5jbHVkZS9jb25maWdzL2FjYWRpYS5oCmluZGV4IDUxN2QxMzAuLmUzZjZlMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9hY2FkaWEuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYWNhZGlhLmgKQEAgLTEyMywxMCArMTIzLDggQEAKICNkZWZpbmUgQ0ZHX0ZMQVNIX1VTRV9CVUZGRVJfV1JJVEUgMQkvKiB1c2UgYnVmZmVyZWQgd3JpdGVzICgyMHggZmFzdGVyKQkqLwogI2RlZmluZSBDRkdfRkxBU0hfRU1QVFlfSU5GTwkJLyogcHJpbnQgJ0UnIGZvciBlbXB0eSBzZWN0b3Igb24gZmxpbmZvICovCiAKLSNkZWZpbmUJX0NGR19DTURfSU5DTFVERQkoQ0ZHX0NNRF9BTEwpCiAjZWxzZQogI2RlZmluZQlDRkdfTk9fRkxBU0gJCTEJLyogTm8gTk9SIG9uIEFjYWRpYSB3aGVuIE5BTkQtYm9vdGluZwkqLwotI2RlZmluZQlfQ0ZHX0NNRF9JTkNMVURFCSgoQ0ZHX0NNRF9BTEwpICYgfihDRkdfQ01EX0ZMQVNIIHwgQ0ZHX0NNRF9JTUxTKSkKICNlbmRpZgogCiAjaWZkZWYgQ0ZHX0VOVl9JU19JTl9GTEFTSApAQCAtMzAxLDI3ICsyOTksNDUgQEAKIAogI2RlZmluZSBDT05GSUdfU1VQUE9SVF9WRkFUCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgJiBfQ0ZHX0NNRF9JTkNMVURFKQl8CVwKLQkJCSBDRkdfQ01EX0FTS0VOVgl8CQkJCVwKLQkJCSBDRkdfQ01EX0RIQ1AJfAkJCQlcCi0JCQkgQ0ZHX0NNRF9EVFQJfAkJCQlcCi0JCQkgQ0ZHX0NNRF9ESUFHCXwJCQkJXAotCQkJIENGR19DTURfRUVQUk9NCXwJCQkJXAotCQkJIENGR19DTURfRUxGCXwJCQkJXAotCQkJIENGR19DTURfRkFUCXwJCQkJXAotCQkJIENGR19DTURfSTJDCXwJCQkJXAotCQkJIENGR19DTURfSVJRCXwJCQkJXAotCQkJIENGR19DTURfTUlJCXwJCQkJXAotCQkJIENGR19DTURfTkFORAl8CQkJCVwKLQkJCSBDRkdfQ01EX05FVAl8CQkJCVwKLQkJCSBDRkdfQ01EX05GUwl8CQkJCVwKLQkJCSBDRkdfQ01EX1BDSQl8CQkJCVwKLQkJCSBDRkdfQ01EX1BJTkcJfAkJCQlcCi0JCQkgQ0ZHX0NNRF9SRUdJTkZPIHwJCQkJXAotCQkJIENGR19DTURfVVNCKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EVFQKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisKKy8qCisgKiBObyBOT1Igb24gQWNhZGlhIHdoZW4gTkFORC1ib290aW5nCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19OQU5EX1VfQk9PVCkgfHwgZGVmaW5lZChDT05GSUdfTkFORF9TUEwpCisjdW5kZWYgQ09ORklHX0NNRF9GTEFTSAorI3VuZGVmIENPTkZJR19DTURfSU1MUworI2VuZGlmCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0zMzAsNyArMzQ2LDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSAgICAgICAgIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zNzMsNyArMzg5LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CQkvKiBGb3IgQU1DQyA0MDVFWiBDUFUJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkJLyogLi4uCQkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSovCiAjZW5kaWYKIApAQCAtNDg5LDcgKzUwNSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICAgI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2FkczUxMjEuaCBiL2luY2x1ZGUvY29uZmlncy9hZHM1MTIxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlYWMxYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9hZHM1MTIxLmgKQEAgLTAsMCArMSw0MDEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZworICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBBRFM1MTIxIGJvYXJkIGNvbmZpZ3VyYXRpb24gZmlsZQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKyNkZWZpbmUgREVCVUcKKyN1bmRlZiBERUJVRworCisvKgorICogTWVtb3J5IG1hcCBmb3IgdGhlIEFEUzUxMjEgYm9hcmQ6CisgKgorICogMHgwMDAwXzAwMDAgLSAweDBGRkZfRkZGRglERFIgUkFNICgyNTYgTUIpCisgKiAweDMwMDBfMDAwMCAtIDB4MzAwMV9GRkZGCVNSQU0gKDEyOCBLQikKKyAqIDB4ODAwMF8wMDAwIC0gMHg4MDNGX0ZGRkYJSU1NUiAoNCBNQikKKyAqIDB4ODIwMF8wMDAwIC0gMHg4MjAwXzAwMUYJQ1BMRCAoMzIgQikKKyAqIDB4RkMwMF8wMDAwIC0gMHhGRkZGX0ZGRkYJTk9SIEJvb3QgRkxBU0ggKDY0IE1CKQorICovCisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19FMzAwCQkxCS8qIEUzMDAgRmFtaWx5ICovCisjZGVmaW5lIENPTkZJR19NUEM1MTJYCQkxCS8qIE1QQzUxMlggZmFtaWx5ICovCisKKyN1bmRlZiBDT05GSUdfUENJCisKKyNkZWZpbmUgQ0ZHX01QQzUxMlhfQ0xLSU4JNjYwMDAwMDAJLyogaW4gSHogKi8KKworI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9GCQkvKiBjYWxsIGJvYXJkX2Vhcmx5X2luaXRfZigpICovCisKKyNkZWZpbmUgQ0ZHX0lNTVIJCTB4ODAwMDAwMDAKKworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDAwMjAwMDAwICAgICAgLyogbWVtdGVzdCByZWdpb24gKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECQkweDAwNDAwMDAwCisKKy8qCisgKiBERFIgU2V0dXAgLSBtYW51YWxseSBzZXQgYWxsIHBhcmFtZXRlcnMgYXMgdGhlcmUncyBubyBTUEQgZXRjLgorICovCisjZGVmaW5lIENGR19ERFJfU0laRQkJMjU2CQkvKiBNQiAqLworI2RlZmluZSBDRkdfRERSX0JBU0UJCTB4MDAwMDAwMDAJLyogRERSIGlzIHN5c3RlbSBtZW1vcnkqLworI2RlZmluZSBDRkdfU0RSQU1fQkFTRQkJQ0ZHX0REUl9CQVNFCisKKy8qIEREUiBDb250cm9sbGVyIENvbmZpZ3VyYXRpb24KKyAqCisgKiBTWVNfQ0ZHOgorICoJWzMxOjMxXQlNRERSQyBTb2Z0IFJlc2V0OglEaWFibGVkCisgKglbMzA6MzBdCURSQU0gQ0tFIHBpbjoJCUVuYWJsZWQKKyAqCVsyOToyOV0JRFJBTSBDTEs6CQlFbmFibGVkCisgKglbMjg6MjhdCUNvbW1hbmQgTW9kZToJCUVuYWJsZWQgKEZvciBpbml0aWFsaXphdGlvbiBvbmx5KQorICoJWzI3OjI1XQlEUkFNIFJvdyBTZWxlY3Q6CWRyYW1fcm93WzE1OjBdID0gbWFnZW50YV9hZGRyZXNzWzI1OjEwXQorICoJWzI0OjIxXQlEUkFNIEJhbmsgU2VsZWN0OglkcmFtX2JhbmtbMTowXSA9IG1hZ2VudGFfYWRkcmVzc1sxMToxMF0KKyAqCVsyMDoxOV0JUmVhZCBUZXN0OgkJRE9OJ1QgVVNFCisgKglbMTg6MThdCVNlbGYgUmVmcmVzaDoJCUVuYWJsZWQKKyAqCVsxNzoxN10JMTZiaXQgTW9kZToJCURpc2FibGVkCisgKglbMTY6MTNdIFJlYWR5IERlbGF5OgkJMgorICoJWzEyOjEyXQlIYWxmIERRUyBEZWxheToJCURpc2FibGVkCisgKglbMTE6MTFdCVF1YXJ0ZXIgRFFTIERlbGF5OglEaXNhYmxlZAorICoJWzEwOjA4XQlXcml0ZSBEZWxheToJCTIKKyAqCVswNzowN10JRWFybHkgT0RUOgkJRGlzYWJsZWQKKyAqCVswNjowNl0JT24gRElFIFRlcm1pbmF0aW9uOglEaXNhYmxlZAorICoJWzA1OjA1XQlGSUZPIE92ZXJmbG93IENsZWFyOglET04nVCBVU0UgaGVyZQorICoJWzA0OjA0XQlGSUZPIFVuZGVyZmxvdyBDbGVhcjoJRE9OJ1QgVVNFIGhlcmUKKyAqCVswMzowM10JRklGTyBPdmVyZmxvdyBQZW5kaW5nOglET04nVCBVU0UgaGVyZQorICoJWzAyOjAyXQlGSUZPIFVuZGVybGZvdyBQZW5kaW5nOglET04nVCBVU0UgaGVyZQorICoJWzAxOjAxXQlGSUZPIE92ZXJsZm93IEVuYWJsZWQ6CUVuYWJsZWQKKyAqCVswMDowMF0JRklGTyBVbmRlcmZsb3cgRW5hYmxlZDoJRW5hYmxlZAorICogVElNRV9DRkcwCisgKglbMzE6MTZdCURSQU0gUmVmcmVzaCBUaW1lOgkwIENTQiBjbG9ja3MKKyAqCVsxNTo4XQlEUkFNIENvbW1hbmQgVGltZToJMCBDU0IgY2xvY2tzCisgKglbMDc6MDBdCURSQU0gUHJlY2hhcmdlIFRpbWU6CTAgQ1NCIGNsb2NrcworICogVElNRV9DRkcxCisgKglbMzE6MjZdCURSQU0gdFJGQzoKKyAqCVsyNToyMV0JRFJBTSB0V1IxOgorICoJWzIwOjE3XQlEUkFNIHRXUlQxOgorICoJWzE2OjExXQlEUkFNIHREUlI6CisgKglbMTA6MDVdCURSQU0gdFJDOgorICoJWzA0OjAwXQlEUkFNIHRSQVM6CisgKiBUSU1FX0NGRzIKKyAqCVszMToyOF0JRFJBTSB0UkNEOgorICoJWzI3OjIzXQlEUkFNIHRGQVc6CisgKglbMjI6MTldCURSQU0gdFJUVzE6CisgKglbMTg6MTVdCURSQU0gdENDRDoKKyAqCVsxNDoxMF0gRFJBTSB0UlRQOgorICoJWzA5OjA1XQlEUkFNIHRSUDoKKyAqCVswNDowMF0gRFJBTSB0UlBBCisgKi8KKworI2RlZmluZSBDRkdfTUREUkNfU1lTX0NGRwkweEY4NjA0MjAwCisjZGVmaW5lIENGR19NRERSQ19TWVNfQ0ZHX1JVTgkweEU4NjA0MjAwCisjZGVmaW5lIENGR19NRERSQ19TWVNfQ0ZHX0VOCTB4MzAwMDAwMDAKKyNkZWZpbmUgQ0ZHX01ERFJDX1RJTUVfQ0ZHMAkweDAwMDAyODFFCisjZGVmaW5lIENGR19NRERSQ19USU1FX0NGRzBfUlVOCTB4MDFGNDI4MUUKKyNkZWZpbmUgQ0ZHX01ERFJDX1RJTUVfQ0ZHMQkweDU0RUMxMTY4CisjZGVmaW5lIENGR19NRERSQ19USU1FX0NGRzIJMHgzNTIxMDg2NAorCisjZGVmaW5lIENGR19NSUNST05fTk9QCQkweDAxMzgwMDAwCisjZGVmaW5lIENGR19NSUNST05fUENIR19BTEwJMHgwMTEwMDQwMAorI2RlZmluZSBDRkdfTUlDUk9OX01SCQkweDAxMDAwMDIyCisjZGVmaW5lIENGR19NSUNST05fRU0yCQkweDAxMDIwMDAwCisjZGVmaW5lIENGR19NSUNST05fRU0zCQkweDAxMDMwMDAwCisjZGVmaW5lIENGR19NSUNST05fRU5fRExMCTB4MDEwMTAwMDAKKyNkZWZpbmUgQ0ZHX01JQ1JPTl9SU1RfRExMCTB4MDEwMDA5MzIKKyNkZWZpbmUgQ0ZHX01JQ1JPTl9SRlNICQkweDAxMDgwMDAwCisjZGVmaW5lIENGR19NSUNST05fSU5JVF9ERVZfT1AJMHgwMTAwMDgzMgorI2RlZmluZSBDRkdfTUlDUk9OX09DRF9ERUZBVUxUCTB4MDEwMTA3ODAKKyNkZWZpbmUgQ0ZHX01JQ1JPTl9PQ0RfRVhJVAkweDAxMDEwNDAwCisKKy8qIEREUiBQcmlvcml0eSBNYW5hZ2VyIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX1BNX0NGRzEJMHgwMDA3NzdBQQorI2RlZmluZSBDRkdfTUREUkNHUlBfUE1fQ0ZHMgkweDAwMDAwMDU1CisjZGVmaW5lIENGR19NRERSQ0dSUF9ISVBSSU9fQ0ZHCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDBfTVUgICAgMHgxMTExMTExNworI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUMF9NTAkweDc3Nzc3NzdBCisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQxX01VICAgIDB4NDQ0NEVFRUUKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDFfTUwJMHhFRUVFRUVFRQorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUMl9NVSAgICAweDQ0NDQ0NDQ0CisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQyX01MCTB4NDQ0NDQ0NDQKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDNfTVUgICAgMHg1NTU1NTU1NQorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUM19NTAkweDU1NTU1NTU4CisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQ0X01VICAgIDB4MTExMTExMTEKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDRfTUwJMHgxMTExMTE3QworI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUMF9BVSAgICAweDMzMzMzMzc3CisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQwX0FMCTB4Nzc3N0VFRUUKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDFfQVUgICAgMHgxMTExMTExMQorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUMV9BTAkweDExMTExMTExCisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQyX0FVICAgIDB4MTExMTExMTEKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDJfQUwJMHgxMTExMTExMQorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUM19BVSAgICAweDExMTExMTExCisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQzX0FMCTB4MTExMTExMTEKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDRfQVUgICAgMHgxMTExMTExMQorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUNF9BTAkweDExMTExMTExCisKKy8qCisgKiBOT1IgRkxBU0ggb24gdGhlIExvY2FsIEJ1cworICovCisjZGVmaW5lIENGR19GTEFTSF9DRkkJCQkJLyogdXNlIHRoZSBDb21tb24gRmxhc2ggSW50ZXJmYWNlICovCisjZGVmaW5lIENGR19GTEFTSF9DRklfRFJJVkVSCQkJLyogdXNlIHRoZSBDRkkgZHJpdmVyICovCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweEZDMDAwMDAwCS8qIHN0YXJ0IG9mIEZMQVNIICAgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1NJWkUJCTB4MDQwMDAwMDAJLyogbWF4IGZsYXNoIHNpemUgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1VTRV9CVUZGRVJfV1JJVEUKKworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTEJCS8qIG51bWJlciBvZiBiYW5rcyAqLworI2RlZmluZSBDRkdfRkxBU0hfQkFOS1NfTElTVCAJe0NGR19GTEFTSF9CQVNFfQorI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMjU2CQkvKiBtYXggc2VjdG9ycyBwZXIgZGV2aWNlICovCisKKyN1bmRlZiBDRkdfRkxBU0hfQ0hFQ0tTVU0KKworLyoKKyAqIENQTEQgcmVnaXN0ZXJzIGFyZWEgaXMgcmVhbGx5IG9ubHkgMzIgYnl0ZXMgaW4gc2l6ZSwgYnV0IHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBMUAorICogd2luZG93IGlzIDY0S0IKKyAqLworI2RlZmluZSBDRkdfQ1BMRF9CQVNFCQkweDgyMDAwMDAwCisjZGVmaW5lIENGR19DUExEX1NJWkUJCTB4MDAwMTAwMDAJLyogNjQgS0IgKi8KKworI2RlZmluZSBDRkdfU1JBTV9CQVNFCQkweDMwMDAwMDAwCisjZGVmaW5lIENGR19TUkFNX1NJWkUJCTB4MDAwMjAwMDAJLyogMTI4IEtCICovCisKKyNkZWZpbmUgQ0ZHX0NTMF9DRkcJCTB4MDUwNTkzMTAJLyogQUxFIGFjdGl2ZSBsb3csIGRhdGEgc2l6ZSA0Ynl0ZXMgKi8KKyNkZWZpbmUgQ0ZHX0NTMl9DRkcJCTB4MDUwNTkwMTAJLyogQUxFIGFjdGl2ZSBsb3csIGRhdGEgc2l6ZSAxYnl0ZSAqLworCisvKiBVc2UgU1JBTSBmb3IgaW5pdGlhbCBzdGFjayAqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUglDRkdfU1JBTV9CQVNFCQkvKiBJbml0aWFsIFJBTSBhZGRyZXNzICovCisjZGVmaW5lIENGR19JTklUX1JBTV9FTkQJQ0ZHX1NSQU1fU0laRQkJLyogRW5kIG9mIHVzZWQgYXJlYSBpbiBSQU0gKi8KKworI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRQkweDEwMAkJCS8qIG51bSBieXRlcyBpbml0aWFsIGRhdGEgKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQorI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQJQ0ZHX0dCTF9EQVRBX09GRlNFVAorCisjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJVEVYVF9CQVNFCQkvKiBTdGFydCBvZiBtb25pdG9yICovCisjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDI1NiAqIDEwMjQpCQkvKiBSZXNlcnZlIDI1NiBrQiBmb3IgTW9uICovCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCQkoNTEyICogMTAyNCkJCS8qIFJlc2VydmVkIGZvciBtYWxsb2MgKi8KKworLyoKKyAqIFNlcmlhbCBQb3J0CisgKi8KKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgIDEKKyN1bmRlZiBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8KKworLyoKKyAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfUFNDX0NPTlNPTEUJMwkvKiBjb25zb2xlIGlzIG9uIFBTQzMgKi8KKyNpZiBDT05GSUdfUFNDX0NPTlNPTEUgIT0gMworI2Vycm9yIENPTkZJR19QU0NfQ09OU09MRSBtdXN0IGJlIDMKKyNlbmRpZgorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAkvKiAuLi4gYXQgMTE1MjAwIGJwcyAqLworI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUgIFwKKwl7MzAwLCA2MDAsIDEyMDAsIDI0MDAsIDQ4MDAsIDk2MDAsIDE5MjAwLCAzODQwMCwxMTUyMDB9CisKKyNkZWZpbmUgQ09OU09MRV9GSUZPX1RYX1NJWkUJRklGT0NfUFNDM19UWF9TSVpFCisjZGVmaW5lIENPTlNPTEVfRklGT19UWF9BRERSCUZJRk9DX1BTQzNfVFhfQUREUgorI2RlZmluZSBDT05TT0xFX0ZJRk9fUlhfU0laRQlGSUZPQ19QU0MzX1JYX1NJWkUKKyNkZWZpbmUgQ09OU09MRV9GSUZPX1JYX0FERFIJRklGT0NfUFNDM19SWF9BRERSCisKKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfRURJVElORwkxCS8qIGFkZCBjb21tYW5kIGxpbmUgaGlzdG9yeQkqLworLyogVXNlIHRoZSBIVVNIIHBhcnNlciAqLworI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIKKyNpZmRlZiAgQ0ZHX0hVU0hfUEFSU0VSCisjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIgIj4gIgorI2VuZGlmCisKKy8qIEkyQyAqLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMJCQkvKiBJMkMgd2l0aCBoYXJkd2FyZSBzdXBwb3J0ICovCisjdW5kZWYgQ09ORklHX1NPRlRfSTJDCQkJLyogc28gZGlzYWJsZSBiaXQtYmFuZ2VkIEkyQyAqLworI2RlZmluZSBDT05GSUdfSTJDX01VTFRJX0JVUworI2RlZmluZSBDT05GSUdfSTJDX0NNRF9UUkVFCisjZGVmaW5lIENGR19JMkNfU1BFRUQJCTEwMDAwMAkvKiBJMkMgc3BlZWQgYW5kIHNsYXZlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMHg3RgorI2lmIDAKKyNkZWZpbmUgQ0ZHX0kyQ19OT1BST0JFUwl7ezAsMHg2OX19CSogRG9uJ3QgcHJvYmUgdGhlc2UgYWRkcnMgKi8KKyNlbmRpZgorCisvKgorICogRXRoZXJuZXQgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19NUEM1MTJ4X0ZFQwkxCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkKKyNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkweDEKKyNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQJCSovCisKKyNpZiAwCisvKgorICogQ29uZmlndXJlIG9uLWJvYXJkIFJUQworICovCisjZGVmaW5lIENPTkZJR19SVENfRFMxMzc0CQkJLyogdXNlIGRzMTM3NCBydGMgdmlhIGkyYwkqLworI2RlZmluZSBDRkdfSTJDX1JUQ19BRERSCQkweDY4CS8qIGF0IGFkZHJlc3MgMHg2OAkJKi8KKyNlbmRpZgorCisvKgorICogRW52aXJvbm1lbnQKKyAqLworI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEKKy8qIFRoaXMgaGFzIHRvIGJlIGEgbXVsdGlwbGUgb2YgdGhlIEZsYXNoIHNlY3RvciBzaXplICovCisjZGVmaW5lIENGR19FTlZfQUREUgkJKENGR19NT05JVE9SX0JBU0UgKyBDRkdfTU9OSVRPUl9MRU4pCisjZGVmaW5lIENGR19FTlZfU0laRQkJMHgyMDAwCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTB4NDAwMDAJLyogb25lIHNlY3RvciAoMjU2SykgZm9yIGVudiAqLworCisvKiBBZGRyZXNzIGFuZCBzaXplIG9mIFJlZHVuZGFudCBFbnZpcm9ubWVudCBTZWN0b3IJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9BRERSX1JFRFVORAkoQ0ZHX0VOVl9BRERSICsgQ0ZHX0VOVl9TRUNUX1NJWkUpCisjZGVmaW5lIENGR19FTlZfU0laRV9SRURVTkQJKENGR19FTlZfU0laRSkKKworI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZCAqLworI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UgKi8KKworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZW5kaWYKKworLyoKKyAqIFdhdGNoZG9nIHRpbWVvdXQgPSBDRkdfV0FUQ0hET0dfVkFMVUUgKiA2NTUzNiAvIElQUyBjbG9jay4KKyAqIEZvciBleGFtcGxlLCB3aGVuIElQUyBpcyBzZXQgdG8gNjZNSHogYW5kIENGR19XQVRDSERPR19WQUxVRSBpcyBzZXQKKyAqIHRvIDB4RkZGRiwgd2F0Y2hkb2cgdGltZW91dHMgYWZ0ZXIgYWJvdXQgNjRzLiBGb3IgZGV0YWlscyByZWZlcgorICogdG8gY2hhcHRlciAzNiBvZiB0aGUgTVBDNTEyMWUgUmVmZXJlbmNlIE1hbnVhbC4KKyAqLworI2RlZmluZSBDT05GSUdfV0FUQ0hET0cJCQkvKiBlbmFibGUgd2F0Y2hkb2cgKi8KKyNkZWZpbmUgQ0ZHX1dBVENIRE9HX1ZBTFVFIDB4RkZGRgorCisgLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeSAqLworI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCisKKyNpZmRlZiBDT05GSUdfQ01EX0tHREIKKwkjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KKyNlbHNlCisJI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KKyNlbmRpZgorCisKKyNkZWZpbmUgQ0ZHX1BCU0laRSAoQ0ZHX0NCU0laRSArIHNpemVvZihDRkdfUFJPTVBUKSArIDE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MgKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfSFoJCTEwMDAJCS8qIGRlY3JlbWVudGVyIGZyZXE6IDFtcyB0aWNrcyAqLworCisvKgorICogRm9yIGJvb3RpbmcgTGludXgsIHRoZSBib2FyZCBpbmZvIGFuZCBjb21tYW5kIGxpbmUgZGF0YQorICogaGF2ZSB0byBiZSBpbiB0aGUgZmlyc3QgOCBNQiBvZiBtZW1vcnksIHNpbmNlIHRoaXMgaXMKKyAqIHRoZSBtYXhpbXVtIG1hcHBlZCBieSB0aGUgTGludXgga2VybmVsIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqLworI2RlZmluZSBDRkdfQk9PVE1BUFNaCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4Ki8KKworLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgorI2lmZGVmIENPTkZJR19DTURfS0dEQgorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSovCisjZW5kaWYKKworI2RlZmluZSBDRkdfSElEMF9JTklUCTB4MDAwMDAwMDAwCisjZGVmaW5lIENGR19ISUQwX0ZJTkFMCUhJRDBfRU5BQkxFX01BQ0hJTkVfQ0hFQ0sKKyNkZWZpbmUgQ0ZHX0hJRDIJSElEMl9IQkUKKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLworI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJLyogU29mdHdhcmUgcmVib290ICovCisKKyNpZmRlZiBDT05GSUdfQ01EX0tHREIKKyNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIG9mIGtnZGIgc2VyaWFsIHBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCisjZW5kaWYKKworLyoKKyAqIEVudmlyb25tZW50IENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQorCisjZGVmaW5lIENPTkZJR19IT1NUTkFNRQkJYWRzNTEyMQorI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCXVJbWFnZQorCisjZGVmaW5lIENPTkZJR19MT0FEQUREUgkJMjAwMDAwCS8qIGRlZmF1bHQgbG9jYXRpb24gZm9yIHRmdHAgYW5kIGJvb3RtICovCisKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIC0xIGRpc2FibGVzIGF1dG8tYm9vdCAqLworI3VuZGVmICBDT05GSUdfQk9PVEFSR1MJCQkvKiB0aGUgYm9vdCBjb21tYW5kIHdpbGwgc2V0IGJvb3RhcmdzICovCisKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKKworI2RlZmluZSBDT05GSUdfUFJFQk9PVAkiZWNobzsiCVwKKwkiZWNobyBUeXBlIFwicnVuIGZsYXNoX25mc1wiIHRvIG1vdW50IHJvb3QgZmlsZXN5c3RlbSBvdmVyIE5GUzsiIFwKKwkiZWNobyIKKworI2RlZmluZQlDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTCQkJCQlcCisJIm5ldGRldj1ldGgwXDAiCQkJCQkJCVwKKwkibmZzYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L25mcyBydyAiCQkJXAorCQkibmZzcm9vdD0ke3NlcnZlcmlwfToke3Jvb3RwYXRofVwwIgkJCVwKKwkicmFtYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSByd1wwIgkJCVwKKwkiYWRkaXA9c2V0ZW52IGJvb3RhcmdzICR7Ym9vdGFyZ3N9ICIJCQkJXAorCQkiaXA9JHtpcGFkZHJ9OiR7c2VydmVyaXB9OiR7Z2F0ZXdheWlwfToke25ldG1hc2t9IglcCisJCSI6JHtob3N0bmFtZX06JHtuZXRkZXZ9Om9mZiBwYW5pYz0xXDAiCQkJXAorCSJhZGR0dHk9c2V0ZW52IGJvb3RhcmdzICR7Ym9vdGFyZ3N9IGNvbnNvbGU9dHR5UzAsJHtiYXVkcmF0ZX1cMCJcCisJImZsYXNoX25mcz1ydW4gbmZzYXJncyBhZGRpcCBhZGR0dHk7IgkJCQlcCisJCSJib290bSAke2tlcm5lbF9hZGRyfVwwIgkJCQlcCisJImZsYXNoX3NlbGY9cnVuIHJhbWFyZ3MgYWRkaXAgYWRkdHR5OyIJCQkJXAorCQkiYm9vdG0gJHtrZXJuZWxfYWRkcn0gJHtyYW1kaXNrX2FkZHJ9XDAiCQlcCisJIm5ldF9uZnM9dGZ0cCAyMDAwMDAgJHtib290ZmlsZX07cnVuIG5mc2FyZ3MgYWRkaXAgYWRkdHR5OyIJXAorCQkiYm9vdG1cMCIJCQkJCQlcCisJImxvYWQ9dGZ0cCAyMDAwMDAgL3RmdHBib290L2FkczUxMjEvdS1ib290LmJpblwwIgkJXAorCSJ1cGRhdGU9cHJvdGVjdCBvZmYgRkZGMDAwMDAgKyR7ZmlsZXNpemV9OyIJCQlcCisJCSJlcmEgRkZGMDAwMDAgKyR7ZmlsZXNpemV9O2NwLmIgMjAwMDAwIEZGRjAwMDAwICR7ZmlsZXNpemV9XDAiIFwKKwkidXBkPXJ1biBsb2FkO3J1biB1cGRhdGVcMCIJCQkJCVwKKwkiIgorCisjZGVmaW5lIENPTkZJR19ORlNCT09UQ09NTUFORAkJCQkJCVwKKwkic2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcncgIgkJCQlcCisJCSJuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIgkJCQlcCisJCSJpcD0kaXBhZGRyOiRzZXJ2ZXJpcDokZ2F0ZXdheWlwOiRuZXRtYXNrOiRob3N0bmFtZTokbmV0ZGV2Om9mZiAiIFwKKwkJImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiCQlcCisJInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiCQkJCQlcCisJInRmdHAgJGZkdGFkZHIgJGZkdGZpbGU7IgkJCQkJXAorCSJib290bSAkbG9hZGFkZHIgLSAkZmR0YWRkciIKKworI2RlZmluZSBDT05GSUdfUkFNQk9PVENPTU1BTkQJCQkJCQlcCisJInNldGVudiBib290YXJncyByb290PS9kZXYvcmFtIHJ3ICIJCQkJXAorCQkiY29uc29sZT0kY29uc29sZWRldiwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzOyIJCVwKKwkidGZ0cCAkcmFtZGlza2FkZHIgJHJhbWRpc2tmaWxlOyIJCQkJXAorCSJ0ZnRwICRsb2FkYWRkciAkYm9vdGZpbGU7IgkJCQkJXAorCSJ0ZnRwICRmZHRhZGRyICRmZHRmaWxlOyIJCQkJCVwKKwkiYm9vdG0gJGxvYWRhZGRyICRyYW1kaXNrYWRkciAkZmR0YWRkciIKKworI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInJ1biBmbGFzaF9zZWxmIgorCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2Fkc3ZpeC5oIGIvaW5jbHVkZS9jb25maWdzL2Fkc3ZpeC5oCmluZGV4IGM0MTA4OTEuLjcwM2QzMTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9hZHN2aXguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYWRzdml4LmgKQEAgLTY4LDEwICs2OCwyOCBAQAogCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OICAgMQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKChDT05GSUdfQ01EX0RGTCAmIH5DRkdfQ01EX05FVCkgfCBDRkdfQ01EX01NQyB8IENGR19DTURfRkFUIHwgQ0ZHX0NNRF9JREUgfCBDRkdfQ01EX1BDTUNJQSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX01NQworI2RlZmluZSBDT05GSUdfQ01EX1BDTUNJQQorCisjdW5kZWYgQ09ORklHX0NNRF9ORVQKKwogCiAjdW5kZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUwogCkBAIC0xNjIsNyArMTgwLDcgQEAKICNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCSAxCS8qIGVuYWJsZSBwYXNzaW5nIG9mIEFUQUdzCSovCiAvKiAjZGVmaW5lIENPTkZJR19JTklUUkRfVEFHCSAxICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2Fldi5oIGIvaW5jbHVkZS9jb25maWdzL2Fldi5oCmluZGV4IGY2ZjUzMGMuLjViYWI3OTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9hZXYuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYWV2LmgKQEAgLTQ0LDExICs0NCw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtOTEsMzQgKzg2LDQyIEBACiAJCQkJIENGR19QT1NUX0kyQykKIAogI2lmZGVmIENPTkZJR19QT1NUCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIENGR19DTURfRElBRwogLyogcHJlc2VydmUgc3BhY2UgZm9yIHRoZSBwb3N0X3dvcmQgYXQgZW5kIG9mIG9uLWNoaXAgU1JBTSAqLwogI2RlZmluZSBNUEM1WFhYX1NSQU1fUE9TVF9TSVpFIE1QQzVYWFhfU1JBTV9TSVpFLTQKLSNlbHNlCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIDAKICNlbmRpZgogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQUREX0JNUF9DTUQJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VDSE8JfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUE9TVF9ESUFHIHwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKKyNpZmRlZiBDT05GSUdfUE9TVAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNlbmRpZgorCiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogZGlzcGxheSBpbWFnZSB0aW1lc3RhbXBzICovCiAKQEAgLTMyNCw3ICszMjcsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMzQzLDkgKzM0NiwxMyBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKLSAqIEVuYWJsZSBsb29wdyBjb21tYW5kby4gVGhpcyBoYXMgb25seSBhZmZlY3QsIGlmIENGR19DTURfTUVNIGlzIGRlZmluZWQsCi0gKiB3aGljaCBpcyBub3JtYWxseSBwYXJ0IG9mIHRoZSBkZWZhdWx0IGNvbW1hbmRzIChDRlZfQ01EX0RGTCkKKyAqIEVuYWJsZSBsb29wdyBjb21tYW5kLgogICovCiAjZGVmaW5lIENPTkZJR19MT09QVwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYWxwci5oIGIvaW5jbHVkZS9jb25maWdzL2FscHIuaAppbmRleCBkZjA1N2Q5Li5kODhjM2FkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYWxwci5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9hbHByLmgKQEAgLTIxMCwyNSArMjEwLDM3IEBACiAKICNkZWZpbmUgQ09ORklHX05FVENPTlNPTEUJCS8qIGluY2x1ZGUgTmV0Q29uc29sZSBzdXBwb3J0CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElBRwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9GUEdBCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8pCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0ZQR0EKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTIzNyw3ICsyNDksNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zNTgsNyArMzcwLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hcm1hZGlsbG8uaCBiL2luY2x1ZGUvY29uZmlncy9hcm1hZGlsbG8uaAppbmRleCA5YTFjNTU5Li43M2E4ODg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYXJtYWRpbGxvLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2FybWFkaWxsby5oCkBAIC03MSwxMiArNzEsMjEgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgICAgIChDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCkgLyogfCBDRkdfQ01EX0pGRlMyKSovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAJInJvb3Q9L2Rldi9yYW0wIHJvb3Rmc3R5cGU9ZXh0MiBjb25zb2xlPXR0eUFNMCwxMTUyMDAiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYXNzYWJldC5oIGIvaW5jbHVkZS9jb25maWdzL2Fzc2FiZXQuaAppbmRleCAxYTY5ZWJlLi4yMjZhZDU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYXNzYWJldC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9hc3NhYmV0LmgKQEAgLTY2LDE4ICs2NiwzMCBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0RIQ1ApCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCUNPTkZJR19CT09UUF9ERUZBVUxUCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJImNvbnNvbGU9dHR5U0EwLDExNTIwMG44IHJvb3Q9L2Rldi9uZnMgaXA9Ym9vdHAiCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdHA7dGZ0cDtib290bSIKICNkZWZpbmUgQ0ZHX0FVVE9MT0FEICAgICAgICAgICAgIm4iCS8qIE5vIGF1dG9sb2FkICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hdDkxcm05MjAwZGsuaCBiL2luY2x1ZGUvY29uZmlncy9hdDkxcm05MjAwZGsuaAppbmRleCA4ZmFkNTVkLi5lY2ZhMjFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYXQ5MXJtOTIwMGRrLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2F0OTFybTkyMDBkay5oCkBAIC05NywxOCArOTcsMzEgQEAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWSAgICAgIDMKIC8qICNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUJMSAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJXAotCQkgICAgICAgKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTUlJIHxcCi0JCQlDRkdfQ01EX0RIQ1AgKSAmIFwKLQkJICAgICAgfihDRkdfQ01EX0JESSB8IFwKLQkJCUNGR19DTURfSU1JIHwgXAotCQkJQ0ZHX0NNRF9BVVRPU0NSSVBUIHwgXAotCQkJQ0ZHX0NNRF9GUEdBIHwgXAotCQkJQ0ZHX0NNRF9NSVNDIHwgXAotCQkJQ0ZHX0NNRF9MT0FEUyApKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorCisjdW5kZWYgQ09ORklHX0NNRF9CREkKKyN1bmRlZiBDT05GSUdfQ01EX0lNSQorI3VuZGVmIENPTkZJR19DTURfQVVUT1NDUklQVAorI3VuZGVmIENPTkZJR19DTURfRlBHQQorI3VuZGVmIENPTkZJR19DTURfTUlTQworI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKwogCiAjZGVmaW5lIENGR19NQVhfTkFORF9ERVZJQ0UJMQkvKiBNYXggbnVtYmVyIG9mIE5BTkQgZGV2aWNlcwkJKi8KICNkZWZpbmUgU0VDVE9SU0laRSA1MTIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hdGMuaCBiL2luY2x1ZGUvY29uZmlncy9hdGMuaAppbmRleCBiZjZjMTcwLi4zZmY0YjY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYXRjLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2F0Yy5oCkBAIC02NCw5ICs2NCw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KLSAqCisgKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQgbXVzdCBiZSB1bnNldC4KICAqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBTQ0MgICAgICAgKi8KICN1bmRlZglDT05GSUdfRVRIRVJfTk9ORQkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0xMjQsMjcgKzEyMiwzNyBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI3VuZGVmCUNGR19MT0FEU19CQVVEX0NIQU5HRQkJLyogZG9uJ3QgYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJIENGR19DTURfRUVQUk9NIHwgXAotCQkJCSBDRkdfQ01EX1BDSSB8IFwKLQkJCQkgQ0ZHX0NNRF9QQ01DSUEgfCBcCi0JCQkJIENGR19DTURfREFURSB8IFwKLQkJCQkgQ0ZHX0NNRF9JREUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUENNQ0lBCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0lERQogCiAKICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yODUsNyArMjkzLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUgICAgICAzMiAgICAgIC8qIEZvciBNUEM4MjYwIENQVSAgICAgICAgICAgICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2F0c3RrMTAwMi5oIGIvaW5jbHVkZS9jb25maWdzL2F0c3RrMTAwMi5oCmluZGV4IGJlYWYzODUuLmUxZDhmNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9hdHN0azEwMDIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYXRzdGsxMDAyLmgKQEAgLTEwOCw0NyArMTA4LDI5IEBACiAjZGVmaW5lIENPTkZJR19PVkVSV1JJVEVfRVRIQUREUl9PTkNFCTEKICNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQkJMQogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCQkoQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sJXAotCQkJCQkgfCBDT05GSUdfQk9PVFBfR0FURVdBWSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCQkoQ0ZHX0NNRF9CREkJCQlcCi0JCQkJCSB8IENGR19DTURfTE9BRFMJCVwKLQkJCQkJIHwgQ0ZHX0NNRF9MT0FEQgkJXAotCQkJCQkgfCBDRkdfQ01EX0lNSQkJCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9DQUNIRSAqLwkJXAotCQkJCQkgfCBDRkdfQ01EX0ZMQVNICQlcCi0JCQkJCSB8IENGR19DTURfTUVNT1JZCQlcCi0JCQkJCSB8IENGR19DTURfTkVUCQkJXAotCQkJCQkgfCBDRkdfQ01EX0VOVgkJCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9JUlEgKi8JCVwKLQkJCQkJIHwgQ0ZHX0NNRF9CT09URAkJXAotCQkJCQkgfCBDRkdfQ01EX0NPTlNPTEUJCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9FRVBST00gKi8JCVwKLQkJCQkJIHwgQ0ZHX0NNRF9BU0tFTlYJCVwKLQkJCQkJIHwgQ0ZHX0NNRF9SVU4JCQlcCi0JCQkJCSB8IENGR19DTURfRUNITwkJCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9JMkMgKi8JCVwKLQkJCQkJIHwgQ0ZHX0NNRF9SRUdJTkZPCQlcCi0JCQkJCSAvKiB8IENGR19DTURfREFURSAqLwkJXAotCQkJCQkgfCBDRkdfQ01EX0RIQ1AJCQlcCi0JCQkJCSAvKiB8IENGR19DTURfQVVUT1NDUklQVCAqLwlcCi0JCQkJCSAvKiB8IENGR19DTURfTUlJICovCQlcCi0JCQkJCSB8IENGR19DTURfTUlTQwkJCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9TRFJBTSAqLwkJXAotCQkJCQkgLyogfCBDRkdfQ01EX0RJQUcgKi8JCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9IV0ZMT1cgKi8JCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9TQVZFUyAqLwkJXAotCQkJCQkgLyogfCBDRkdfQ01EX1NQSSAqLwkJXAotCQkJCQkgLyogfCBDRkdfQ01EX1BJTkcgKi8JCVwKLQkJCQkJIHwgQ0ZHX0NNRF9NTUMJCQlcCi0JCQkJCSB8IENGR19DTURfRkFUCQkJXAotCQkJCQkgfCBDRkdfQ01EX0lNTFMJCQlcCi0JCQkJCSAvKiB8IENGR19DTURfSVRFU1QgKi8JCVwKLQkJCQkJIHwgQ0ZHX0NNRF9FWFQyCQkJXAotCQkJCQkgfCBDRkdfQ01EX0pGRlMyCQlcCi0JCSkKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTU1DCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworCisjdW5kZWYgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisjdW5kZWYgQ09ORklHX0NNRF9TRVRHRVREQ1IKKyN1bmRlZiBDT05GSUdfQ01EX1hJTUcKIAogI2RlZmluZSBDT05GSUdfQVRNRUxfVVNBUlQJCTEKICNkZWZpbmUgQ09ORklHX01BQ0IJCQkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYmFtYm9vLmggYi9pbmNsdWRlL2NvbmZpZ3MvYmFtYm9vLmgKaW5kZXggNGUwMGI5Zi4uMTRjNTYzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2JhbWJvby5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9iYW1ib28uaApAQCAtMzE4LDQ1ICszMTgsNTUgQEAKICNkZWZpbmUgVVNCXzJfMF9ERVZJQ0UKICNlbmRpZiAvKkNPTkZJR180NDBFUCovCiAKLSNpZmRlZiBDT05GSUdfQkFNQk9PX05BTkQKLSNkZWZpbmUgX0NGR19DTURfTkFORCBDRkdfQ01EX05BTkQKLSNlbHNlCi0jZGVmaW5lIF9DRkdfQ01EX05BTkQgMAotI2VuZGlmIC8qIENPTkZJR19CQU1CT09fTkFORCAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQlDRkdfQ01EX1VTQgl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQkJX0NGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX1VTQgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0VYVDIKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKKyNpZmRlZiBDT05GSUdfQkFNQk9PX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZW5kaWYKKwogCiAjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSAgICAgICAgIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC00MDksNyArNDE5LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCSgzMjw8MTApIC8qIEZvciBBTUNDIDQ0MCBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtNDIxLDcgKzQzMSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYmFyY28uaCBiL2luY2x1ZGUvY29uZmlncy9iYXJjby5oCmluZGV4IDYyNGZhMWQuLjBiYjQ0NmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9iYXJjby5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9iYXJjby5oCkBAIC03MCwyMiArNzAsMzAgQEAKIAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgIm1lbT0zMk0iCiAKLS8qIEFkZCBzdXBwb3J0IGZvciBhIGZldyBleHRyYSBib290cCBvcHRpb25zIGxpa2U6Ci0gKgktIEZpbGUgc2l6ZQotICoJLSBETlMKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMpCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoIENPTkZJR19DTURfREZMIHwgXAotCQkJCSAgQ0ZHX0NNRF9FTEYgICAgfCBcCi0JCQkJICBDRkdfQ01EX0kyQyAJIHwgXAotCQkJCSAgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJICBDRkdfQ01EX1BDSSAgICApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkJKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfUENJCisKKyN1bmRlZiBDT05GSUdfQ01EX05FVAorCiAKICNkZWZpbmUgQ09ORklHX0hVU0hfUEFSU0VSCTEgLyogdXNlICJodXNoIiBjb21tYW5kIHBhcnNlciAqLwogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZIAkxCkBAIC0xMTAsNyArMTE4LDYgQEAKICAqLwogI2RlZmluZSBDT05GSUdfUENJCQkJCS8qIGluY2x1ZGUgcGNpIHN1cHBvcnQJCSovCiAjdW5kZWYgQ09ORklHX1BDSV9QTlAKLSN1bmRlZiBDRkdfQ01EX05FVAogCiAjZGVmaW5lIFBDSV9FTkVUMF9JT0FERFIJMHg4MDAwMDAwMAogI2RlZmluZSBQQ0lfRU5FVDBfTUVNQUREUgkweDgwMDAwMDAwCkBAIC0zNDAsNyArMzQ3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNDAgQ1BVCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9iZjUzMy1lemtpdC5oIGIvaW5jbHVkZS9jb25maWdzL2JmNTMzLWV6a2l0LmgKaW5kZXggNjVkZmM4MS4uNmNiNmJjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2JmNTMzLWV6a2l0LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2JmNTMzLWV6a2l0LmgKQEAgLTk3LDE5ICs5NywzMSBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCiAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJCSBDRkdfQ01EX1BJTkcJfCBcCi0JCQkJCSBDRkdfQ01EX0VMRgl8IFwKLQkJCQkJIENGR19DTURfSTJDCXwgXAotCQkJCQkgQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQkJIENGR19DTURfREFURSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisKKwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgInJvb3Q9L2Rldi9tdGRibG9jazAgaXA9MTkyLjE2OC4wLjE1OjE5Mi4xNjguMC4yOjE5Mi4xNjguMC4xOjI1NS4yNTUuMjU1LjA6ZXpraXQ6ZXRoMDpvZmYgY29uc29sZT10dHlCRjAsNTc2MDAiCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI2RlZmluZQlDRkdfUFJPTVBUCQkiZXpraXQ+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2JmNTMzLXN0YW1wLmggYi9pbmNsdWRlL2NvbmZpZ3MvYmY1MzMtc3RhbXAuaAppbmRleCA3OWExNDA0Li5jY2U2ZWY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYmY1MzMtc3RhbXAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYmY1MzMtc3RhbXAuaApAQCAtMjQwLDIzICsyNDAsNiBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9tdGRibG9jazAgcncgY29uc29sZT10dHlCRjAsNTc2MDAiCiAKLSNpZiAoQ09ORklHX0RSSVZFUl9TTUM5MTExMSkKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTMQkoQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJIENGR19DTURfUElORyAgIHwgXAotCQkJCSBDRkdfQ01EX0VMRiAgICB8IFwKLQkJCQkgQ0ZHX0NNRF9DQUNIRSAgfCBcCi0JCQkJIENGR19DTURfSkZGUzIgIHwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTSB8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFKQotCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMxCShDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYgICAgfCBcCi0JCQkJIENGR19DTURfQ0FDSEUgIHwgXAotCQkJCSBDRkdfQ01EX0pGRlMyICB8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJIENGR19DTURfREFURSkKLSNlbmRpZgogCiAjaWYgKEJGSU5fQk9PVF9NT0RFID09IEJGNTMzX0JZUEFTU19CT09UKQogI2lmIChDT05GSUdfRFJJVkVSX1NNQzkxMTExKQpAQCAtMzA1LDIwICsyODgsMzkgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX1NPRlRfSTJDKQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMyICAgQ0ZHX0NNRF9JMkMKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUzIgMAotI2VuZGlmIC8qIENPTkZJR19TT0ZUX0kyQyAqLwogCi0jaWYgKEJGSU5fQk9PVF9NT0RFID09IEJGNTMzX0JZUEFTU19CT09UKQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICggQ09ORklHX0NPTU1BTkRTMSB8IENPTkZJR19DT01NQU5EUzIgfCBDRkdfQ01EX0RIQ1ApCi0jZWxpZiAoQkZJTl9CT09UX01PREUgPT0gQkY1MzNfU1BJX0JPT1QpCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgKCBDT05GSUdfQ09NTUFORFMxIHwgQ09ORklHX0NPTU1BTkRTMikKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfREFURQorCisjaWYgKENPTkZJR19EUklWRVJfU01DOTExMTEpCisjZGVmaW5lIENPTkZJR19DTURfUElORwogI2VuZGlmCiAKLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpZiAoQ09ORklHX1NPRlRfSTJDKQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2VuZGlmCisKKyNpZiAoQkZJTl9CT09UX01PREUgPT0gQkY1MzNfQllQQVNTX0JPT1QpCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2VuZGlmCisKIAogLyoKICAqIENvbnNvbGUgc2V0dGluZ3MKQEAgLTM0NSw3ICszNDcsNyBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtMzk1LDcgKzM5Nyw3IEBACiAvKiBFbmFibGVkIGJlbG93IG9wdGlvbiBmb3IgQ0Ygc3VwcG9ydCAqLwogLyogI2RlZmluZSBDT05GSUdfU1RBTVBfQ0YJMSAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfU1RBTVBfQ0YpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKENPTkZJR19TVEFNUF9DRikgJiYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKIAogI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IJMQogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYmY1Mzctc3RhbXAuaCBiL2luY2x1ZGUvY29uZmlncy9iZjUzNy1zdGFtcC5oCmluZGV4IGY2NzU1YWMuLmI5YTllM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9iZjUzNy1zdGFtcC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9iZjUzNy1zdGFtcC5oCkBAIC0xNDQsMTEgKzE0NCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QT1NUCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHCUNGR19DTURfRElBRwogI2RlZmluZSBGTEFTSF9TVEFSVF9QT1NUX0JMT0NLCTExCS8qIFNob3VsZCA+ID0gMTEgKi8KICNkZWZpbmUgRkxBU0hfRU5EX1BPU1RfQkxPQ0sJNzEJLyogU2hvdWxkIDwgPSA3MSAqLwotI2Vsc2UKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcJMAogI2VuZGlmCiAKIC8qIENGLUNBUkQgSURFLUhERCBTdXBwb3J0ICovCkBAIC0xNTksNTEgKzE1Niw2NSBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9DRl9JREUpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fSEREX0lERSkgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9UUlVFX0lERSkKICMgZGVmaW5lIENPTkZJR19CRklOX0lERQkxCi0jIGRlZmluZSBBRERfSURFX0NNRAkJQ0ZHX0NNRF9JREUKLSNlbHNlCi0jIGRlZmluZSBBRERfSURFX0NNRAkJMAogI2VuZGlmCiAKIC8qI2RlZmluZSBDT05GSUdfQkY1MzdfTkFORCAqLwkJLyogQWRkIG5hbmQgZmxhc2ggc3VwcG9ydCAqLwogCi0jaWZkZWYgQ09ORklHX0JGNTM3X05BTkQKLSMgZGVmaW5lIEFERF9OQU5EX0NNRAkJQ0ZHX0NNRF9OQU5ECi0jZWxzZQotIyBkZWZpbmUgQUREX05BTkRfQ01ECQkwCi0jZW5kaWYKLQogI2RlZmluZSBDT05GSUdfTkVUQ09OU09MRQkxCiAjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJMQogCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjaWYgKEJGSU5fQk9PVF9NT0RFID09IEJGNTM3X0JZUEFTU19CT09UKSB8fCAoQkZJTl9CT09UX01PREUgPT0gQkY1MzdfU1BJX01BU1RFUl9CT09UKQorCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKwogI2lmIChCRklOX0NQVSA9PSBBRFNQX0JGNTM0KQotI2RlZmluZSBDT05GSUdfQkZJTl9DTUQJCShDT05GSUdfQ01EX0RGTCAmIH5DRkdfQ01EX05FVCkKKyN1bmRlZiBDT05GSUdfQ01EX05FVAogI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0JGSU5fQ01ECQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BJTkcpCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX0NGX0lERSkgXAorCXx8IGRlZmluZWQoQ09ORklHX0JGSU5fSEREX0lERSkgXAorCXx8IGRlZmluZWQoQ09ORklHX0JGSU5fVFJVRV9JREUpCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZW5kaWYKKwogI2VuZGlmCiAKICNpZiAoQkZJTl9CT09UX01PREUgPT0gQkY1MzdfQllQQVNTX0JPT1QpCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19CRklOX0NNRHwgXAotCQkJCSBDRkdfQ01EX0VMRgl8IFwKLQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJIENGR19DTURfQ0FDSEUgIHwgXAotCQkJCSBDRkdfQ01EX0pGRlMyCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTSB8IFwKLQkJCQkgQ0ZHX0NNRF9ESENQICAgfCBcCi0JCQkJIEFERF9JREVfQ01ECXwgXAotCQkJCSBBRERfTkFORF9DTUQJfCBcCi0JCQkJIENGR19DTURfUE9TVF9ESUFHIHwgXAotCQkJCSBDRkdfQ01EX0RBVEUpCi0jZWxpZiAoQkZJTl9CT09UX01PREUgPT0gQkY1MzdfU1BJX01BU1RFUl9CT09UKQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQkZJTl9DTUR8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX0NBQ0hFICB8IFwKLQkJCQkgQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJIEFERF9JREVfQ01ECXwgXAotCQkJCSBDRkdfQ01EX0RBVEUpCisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKyNpZiBkZWZpbmVkKENPTkZJR19QT1NUKQorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0JGNTM3X05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZW5kaWYKKworI2VuZGlmCisKKwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgInJvb3Q9L2Rldi9tdGRibG9jazAgcncgY29uc29sZT10dHlCRjAsNTc2MDAiCiAjZGVmaW5lIENPTkZJR19MT0FEQUREUgkweDEwMDAwMDAKIApAQCAtMjU2LDkgKzI2Nyw2IEBACiAjZW5kaWYKICNlbmRpZgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNpZiAoQkZJTl9CT09UX01PREUgPT0gQkY1MzdfU1BJX01BU1RFUl9CT09UKQogI2lmIChCRklOX0NQVSA9PSBBRFNQX0JGNTM0KQogI2RlZmluZQlDRkdfUFJPTVBUCQkic2VyaWFsX2JmNTM0PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KQEAgLTI3Nyw3ICsyODUsNyBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2JmNTYxLWV6a2l0LmggYi9pbmNsdWRlL2NvbmZpZ3MvYmY1NjEtZXpraXQuaAppbmRleCA4ZDgyNmZhLi4yOTY2MjYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYmY1NjEtZXpraXQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYmY1NjEtZXpraXQuaApAQCAtMTY0LDEyICsxNjQsNiBAQAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJyb290PS9kZXYvbXRkYmxvY2swIHJ3IGNvbnNvbGU9dHR5QkYwLDU3NjAwIgogCiAjaWYgKENPTkZJR19EUklWRVJfU01DOTExMTEpCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUzEJKENPTkZJR19DTURfREZMCXwgXAotCQkJCSBDRkdfQ01EX1BJTkcJfCBcCi0JCQkJIENGR19DTURfRUxGCXwgXAotCQkJCSBDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCSBDRkdfQ01EX0pGRlMyCXwgXAotCQkJCSBDRkdfQ01EX0RIQ1ApCiAjZGVmaW5lIENPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MgXAogCSJyYW1hcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvbXRkYmxvY2swIHJ3IGNvbnNvbGU9dHR5QkYwLDU3NjAwXDAiIAkJXAogCSJuZnNhcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIHJ3IG5mc3Jvb3Q9JChzZXJ2ZXJpcCk6IglcCkBAIC0xODYsMjAgKzE4MCwzNiBAQAogCQkiY3AuYiAkKGxvYWRhZGRyKSAweDIwMDAwMDAwICQoZmlsZXNpemUpXDAiIFwKIAkiIgogI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTMQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJIENGR19DTURfRUxGCXwgXAotCQkJCSBDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCSBDRkdfQ01EX0pGRlMyKQogI2RlZmluZSBDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTIFwKIAkicmFtYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L210ZGJsb2NrMCBydyBjb25zb2xlPXR0eUJGMCw1NzYwMFwwIgkJXAogCSJmbGFzaGJvb3Q9Ym9vdG0gMHgyMDEwMDAwMFwwIgkJCQkJXAogCSIiCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKCBDT05GSUdfQ09NTUFORFMxIHwgQ09ORklHX0NPTU1BTkRTMiApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisKKyNpZiBkZWZpbmVkKENPTkZJR19EUklWRVJfU01DOTExMTEpCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNlbmRpZgorCiAKIC8qCiAgKiBDb25zb2xlIHNldHRpbmdzCkBAIC0yMDgsNyArMjE4LDcgQEAKIAogI2RlZmluZQlDRkdfUFJPTVBUCQkiZXpraXQ+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9idWJpbmdhLmggYi9pbmNsdWRlL2NvbmZpZ3MvYnViaW5nYS5oCmluZGV4IDEwYzQ4MTQzLi43NzM2YTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYnViaW5nYS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9idWJpbmdhLmgKQEAgLTEzNywyNSArMTM3LDM3IEBACiAKICNkZWZpbmUgQ09ORklHX1JUQ19EUzE3NHgJMQkvKiB1c2UgRFMxNzQzIFJUQyBpbiBCdWJpbmdhCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9DQUNIRQl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0xNjYsNyArMTc4LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjE5LDcgKzIzMSw3IEBACiAjZGVmaW5lIENGR19JMkNfTk9QUk9CRVMJeyAweDY5IH0JLyogYXZvaWQgaXByb2JlIGhhbmd1cCAod2h5PykgKi8KICNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TCTYJLyogMjRDMDIgcmVxdWlyZXMgNW1zIGRlbGF5ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FRVBST00pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0VFUFJPTSkKICNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkweDUwCS8qIEkyQyBib290IEVFUFJPTSAoMjRDMDJXKQkqLwogI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTgkxCS8qIEJ5dGVzIG9mIGFkZHJlc3MJCSovCiAjZW5kaWYKQEAgLTMxNCw3ICszMjYsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1RVAgQ1BVCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtNDI2LDcgKzQzOCw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYzJtb24uaCBiL2luY2x1ZGUvY29uZmlncy9jMm1vbi5oCmluZGV4IGFlNzU1MzkuLmE5YTUyNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jMm1vbi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jMm1vbi5oCkBAIC02OCw3ICs2OCwxNSBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTc3LDE1ICs4NSwxOCBAQAogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtOTgsNyArMTA5LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTc0LDcgKzE4NSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9jYW5tYi5oIGIvaW5jbHVkZS9jb25maWdzL2Nhbm1iLmgKaW5kZXggZWM2ZDU3ZS4uZDU3N2I5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2Nhbm1iLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2Nhbm1iLmgKQEAgLTM4LDExICszOCw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9SCiAKIC8qCkBAIC01MiwyMSArNDcsMzAgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAJLyogLi4uIGF0IDExNTIwMCBicHMgKi8KICNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAyMzA0MDAgfQogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0lNTUFQCXwgXAotCQkJCUNGR19DTURfTUlJIAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKIC8qCiAgKiBNVVNUIGJlIGxvdyBib290IC0gSElHSEJPT1QgaXMgbm90IHN1cHBvcnRlZCBhbnltb3JlCkBAIC0xODEsNyArMTg1LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICMgIGRlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0xOTksNiArMjAzLDExIEBACiAKICNkZWZpbmUgQ09ORklHX1JUQ19NUEM1MjAwCTEJLyogdXNlIGludGVybmFsIE1QQzUyMDAgUlRDICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2NlcmYyNTAuaCBiL2luY2x1ZGUvY29uZmlncy9jZXJmMjUwLmgKaW5kZXggNjk5N2M3YS4uZTA2NzM1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2NlcmYyNTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvY2VyZjI1MC5oCkBAIC02MSwxMCArNjEsMjEgQEAKIAogLyogYWxsb3cgdG8gb3ZlcndyaXRlIHNlcmlhbCBhbmQgZXRoYWRkciAqLwogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfRVRIQUREUgkJMDA6RDA6Q0E6RjE6M0M6RDIKQEAgLTc1LDcgKzg2LDcgQEAKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkicm9vdD0vZGV2L210ZGJsb2NrMyByb290ZnN0eXBlPWpmZnMyIGNvbnNvbGU9dHR5UzAsMzg0MDAiCiAjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2NtMV9xcDEuaCBiL2luY2x1ZGUvY29uZmlncy9jbTFfcXAxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZmE0MWMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb25maWdzL2NtMV9xcDEuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDcKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotI2lmbmRlZiBfX0NPTkZJR19ICi0jZGVmaW5lIF9fQ09ORklHX0gKLQotLyoKLSAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCi0gKi8KLSNkZWZpbmUgQ09ORklHX01QQzV4eHgJCTEJLyogVGhpcyBpcyBhbiBNUEM1eHh4IENQVSAqLwotI2RlZmluZSBDT05GSUdfTVBDNTIwMAkJMQkvKiAobW9yZSBwcmVjaXNlbHkgYW4gTVBDNTIwMCBDUFUpICovCi0jZGVmaW5lIENPTkZJR19DTTFfUVAxCQkxCS8qIC4uLiBvbiBDTTEuUVAxIG1vZHVsZSAqLwotCi0KLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUNITwl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0ZMQVNICXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfU05UUAl8IFwKLQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQlDRkdfQ01EX1VTQgl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyKQotCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KLQotLyoKLSAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KLSAqLwotI2RlZmluZSBDT05GSUdfUFNDX0NPTlNPTEUJMQkvKiBjb25zb2xlIGlzIG9uIFBTQzEgKi8KLSNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk1NzYwMAkvKiAuLi4gYXQgNTc2MDAgYnBzICovCi0jZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwgMjMwNDAwIH0KLQotCi0vKgotICogRXRoZXJuZXQgY29uZmlndXJhdGlvbgotICovCi0jZGVmaW5lIENPTkZJR19NUEM1eHh4X0ZFQwkxCi0jZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMHgwMAotI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQkxCS8qIGFsbG93IG92ZXJ3cml0aW5nIG9mIGV0aGFkZHIgKi8KLS8qIHVzZSBtaXNjX2luaXRfcigpIHRvIHJlYWQgZXRoYWRkciBmcm9tIEkyQyBFRVBST00gKHNlZSBDRkdfSTJDX0VFUFJPTSkgKi8KLSNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCTEKLSNkZWZpbmUgQ09ORklHX01BQ19PRkZTRVQJMHgzNQkvKiBNQUMgYWRkcmVzcyBvZmZzZXQgaW4gSTJDIEVFUFJPTSAqLwotCi0KLS8qCi0gKiBQT1NUIHN1cHBvcnQKLSAqLwotI2RlZmluZSBDT05GSUdfUE9TVAkJKENGR19QT1NUX01FTU9SWSB8IENGR19QT1NUX0NQVSB8IENGR19QT1NUX0kyQykKLSNkZWZpbmUgTVBDNVhYWF9TUkFNX1BPU1RfU0laRQkoTVBDNVhYWF9TUkFNX1NJWkUgLSA0KQotLyogTGlzdCBvZiBJMkMgYWRkcmVzc2VzIHRvIGJlIHZlcmlmaWVkIGJ5IFBPU1QgKi8KLSNkZWZpbmUgSTJDX0FERFJfTElTVAkJeyBDRkdfSTJDX1NMQVZFLCBDRkdfSTJDX0lPLCBDRkdfSTJDX0VFUFJPTSB9Ci0KLQotLyogZGlzcGxheSBpbWFnZSB0aW1lc3RhbXBzICovCi0jZGVmaW5lIENPTkZJR19USU1FU1RBTVAJMQotCi0KLS8qCi0gKiBBdXRvYm9vdGluZwotICovCi0jZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQkvKiBhdXRvYm9vdCBhZnRlciA1IHNlY29uZHMgKi8KLSNkZWZpbmUgQ09ORklHX1BSRUJPT1QJImVjaG87IiBcCi0JImVjaG8gVHlwZSBcInJ1biBuZXRfbmZzX2ZkdFwiIHRvIG1vdW50IHJvb3QgZmlsZXN5c3RlbSBvdmVyIE5GUzsiIFwKLQkiZWNobyIKLSN1bmRlZiBDT05GSUdfQk9PVEFSR1MKLQotLyoKLSAqIERlZmF1bHQgZW52aXJvbm1lbnQgc2V0dGluZ3MKLSAqLwotI2RlZmluZSBDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTCQkJCQlcCi0JIm5ldGRldj1ldGgwXDAiCQkJCQkJCVwKLQkiaG9zdG5hbWU9Y20xX3FwMVwwIgkJCQkJCVwKLQkibmV0bWFzaz0yNTUuMjU1LjAuMFwwIgkJCQkJCVwKLQkiaXBhZGRyPTE5Mi4xNjguMTYwLjMzXDAiCQkJCQlcCi0JInNlcnZlcmlwPTE5Mi4xNjguMS4xXDAiCQkJCQlcCi0JImdhdGV3YXlpcD0xOTIuMTY4LjEuMVwwIgkJCQkJXAotCSJjb25zb2xlPXR0eVBTQzBcMCIJCQkJCQlcCi0JInUtYm9vdF9hZGRyPTEwMDAwMFwwIgkJCQkJCVwKLQkia2VybmVsX2FkZHI9MjAwMDAwXDAiCQkJCQkJXAotCSJrZXJuZWxfYWRkcl9mbGFzaD1mYzBjMDAwMFwwIgkJCQkJXAotCSJmZHRfYWRkcj00MDAwMDBcMCIJCQkJCQlcCi0JImZkdF9hZGRyX2ZsYXNoPWZjMGEwMDAwXDAiCQkJCQlcCi0JInJhbWRpc2tfYWRkcj01MDAwMDBcMCIJCQkJCQlcCi0JInJvb3RwYXRoPS9vcHQvZWxkay00LjEvcHBjXzZ4eFwwIgkJCQlcCi0JInUtYm9vdD0vdGZ0cGJvb3QvY20xX3FwMS91LWJvb3QuYmluXDAiCQkJCVwKLQkiYm9vdGZpbGU9L3RmdHBib290L2NtMV9xcDEvdUltYWdlXDAiCQkJCVwKLQkiZmR0X2ZpbGU9L3RmdHBib290L2NtMV9xcDEvY20xX3FwMS5kdGJcMCIJCQlcCi0JImxvYWQ9dGZ0cCAke3UtYm9vdF9hZGRyfSAke3UtYm9vdH1cMCIJCQkJXAotCSJ1cGRhdGU9cHJvdCBvZmYgZmMwMDAwMDAgZmMwNWZmZmY7IGVyYSBmYzAwMDAwMCBmYzA1ZmZmZjsgIglcCi0JCSJjcC5iICR7dS1ib290X2FkZHJ9IGZjMDAwMDAwICR7ZmlsZXNpemV9OyAiCQlcCi0JCSJwcm90IG9uIGZjMDAwMDAwIGZjMDVmZmZmXDAiCQkJCVwKLQkibmZzYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L25mcyBydyAiCQkJXAotCQkibmZzcm9vdD0ke3NlcnZlcmlwfToke3Jvb3RwYXRofVwwIgkJCVwKLQkiZmxhc2hhcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvbXRkYmxvY2s1IHJ3XDAiCQlcCi0JImFkZG10ZD1zZXRlbnYgYm9vdGFyZ3MgJHtib290YXJnc30gJHttdGRwYXJ0c31cMCIJCVwKLQkiYWRkaW5pdD1zZXRlbnYgYm9vdGFyZ3MgJHtib290YXJnc30gaW5pdD0vbGludXhyY1wwIgkJXAotCSJhZGRjb25zPXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSAiCQkJCVwKLQkJImNvbnNvbGU9JHtjb25zb2xlfSwke2JhdWRyYXRlfVwwIgkJCVwKLQkiYWRkaXA9c2V0ZW52IGJvb3RhcmdzICR7Ym9vdGFyZ3N9ICIJCQkJXAotCQkiaXA9JHtpcGFkZHJ9OiR7c2VydmVyaXB9OiR7Z2F0ZXdheWlwfToiCQlcCi0JCSIke25ldG1hc2t9OiR7aG9zdG5hbWV9OiR7bmV0ZGV2fTpvZmYgcGFuaWM9MVwwIglcCi0JImZsYXNoX2ZsYXNoPXJ1biBmbGFzaGFyZ3MgYWRkaW5pdCBhZGRpcCBhZGRjb25zOyIJCVwKLQkJImJvb3RtICR7a2VybmVsX2FkZHJfZmxhc2h9IC0gJHtmZHRfYWRkcl9mbGFzaH1cMCIJXAotCSJuZXRfbmZzX2ZkdD10ZnRwICR7a2VybmVsX2FkZHJ9ICR7Ym9vdGZpbGVfZmR0fTsgIgkJXAotCQkidGZ0cCAke2ZkdF9hZGRyfSAke2ZkdF9maWxlfTsgcnVuIG5mc2FyZ3MgYWRkaXAgIglcCi0JCSJhZGRjb25zOyBib290bSAke2tlcm5lbF9hZGRyfSAtICR7ZmR0X2FkZHJ9XDAiCQlcCi0JIiIKLSNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJydW4gZmxhc2hfZmxhc2giCi0KLQotLyoKLSAqIExvdyBsZXZlbCBjb25maWd1cmF0aW9uCi0gKi8KLQotCi0vKgotICogQ2xvY2sgY29uZmlndXJhdGlvbgotICovCi0jZGVmaW5lIENGR19NUEM1WFhYX0NMS0lOCTMzMDAwMDAwCS8qIFNZU19YVEFMX0lOID0gMzNNSHogKi8KLSNkZWZpbmUgQ0ZHX0lQQkNMS19FUVVBTFNfWExCQ0xLCTEJLyogSVBCID0gMTMzTUh6ICovCi0KLQotLyoKLSAqIE1lbW9yeSBtYXAKLSAqLwotI2RlZmluZSBDRkdfTUJBUgkJMHhGMDAwMDAwMAotI2RlZmluZSBDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAotI2RlZmluZSBDRkdfREVGQVVMVF9NQkFSCTB4ODAwMDAwMDAKLQotI2RlZmluZSBDRkdfTE9XQk9PVAkJMQotCi0vKiBVc2UgT04tQ2hpcCBTUkFNIHVudGlsIFJBTSB3aWxsIGJlIGF2YWlsYWJsZSAqLwotI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUglNUEM1WFhYX1NSQU0KLSNpZmRlZiBDT05GSUdfUE9TVAotLyogcHJlc2VydmUgc3BhY2UgZm9yIHRoZSBwb3N0X3dvcmQgYXQgZW5kIG9mIG9uLWNoaXAgU1JBTSAqLwotI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECU1QQzVYWFhfU1JBTV9QT1NUX1NJWkUKLSNlbHNlCi0jZGVmaW5lIENGR19JTklUX1JBTV9FTkQJTVBDNVhYWF9TUkFNX1NJWkUKLSNlbmRpZgotCi0jZGVmaW5lIENGR19HQkxfREFUQV9TSVpFCTEyOAkvKiBzaXplIGluIGJ5dGVzIGZvciBpbml0aWFsIGRhdGEgKi8KLSNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQotI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQJQ0ZHX0dCTF9EQVRBX09GRlNFVAotCi0jZGVmaW5lIENGR19NT05JVE9SX0JBU0UJVEVYVF9CQVNFCi0jZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDM4NCA8PCAxMCkJLyogMzg0IGtCIGZvciBNb25pdG9yICovCi0jZGVmaW5lIENGR19NQUxMT0NfTEVOCQkoMjU2IDw8IDEwKQkvKiAyNTYga0IgZm9yIG1hbGxvYygpICovCi0jZGVmaW5lIENGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBpbml0aWFsIG1lbSBtYXAgZm9yIExpbnV4ICovCi0KLSNpZiAoQ0ZHX01PTklUT1JfQkFTRSA8IENGR19GTEFTSF9CQVNFKQotI2RlZmluZSBDRkdfUkFNQk9PVAkJMQotI2VuZGlmCi0KLQotLyoKLSAqIENoaXAgc2VsZWN0cyBjb25maWd1cmF0aW9uCi0gKi8KLS8qIEJvb3QgQ2hpcHNlbGVjdCAqLwotI2RlZmluZSBDRkdfQk9PVENTX1NUQVJUCUNGR19GTEFTSF9CQVNFCi0jZGVmaW5lIENGR19CT09UQ1NfU0laRQkJQ0ZHX0ZMQVNIX1NJWkUKLSNkZWZpbmUgQ0ZHX0JPT1RDU19DRkcJCTB4MDAwODdEMzEJLyogZm9yIHBjaV9jbGsgPSAzMyBNSHogKi8KLS8qIHVzZSBib2FyZF9lYXJseV9pbml0X3IgdG8gZW5hYmxlIGZsYXNoIHdyaXRlIGluIENTX0JPT1QgKi8KLSNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfUgotCi0vKiBGbGFzaCBtZW1vcnkgYWRkcmVzc2luZyAqLwotI2RlZmluZSBDRkdfQ1MwX1NUQVJUCQlDRkdfRkxBU0hfQkFTRQotI2RlZmluZSBDRkdfQ1MwX1NJWkUJCUNGR19GTEFTSF9TSVpFCi0KLS8qIE5vIGJ1cnN0LCBkZWFkIGN5Y2xlID0gMSBmb3IgQ1MwIChGbGFzaCkgKi8KLSNkZWZpbmUgQ0ZHX0NTX0JVUlNUCQkweDAwMDAwMDAwCi0jZGVmaW5lIENGR19DU19ERUFEQ1lDTEUJMHgwMDAwMDAwMQotCi0KLS8qCi0gKiBTRFJBTSBjb25maWd1cmF0aW9uCi0gKiBzZXR0aW5ncyBmb3IgazRzNTYxNjMyRS14eDc1LCBhc3N1bWluZyBYTEIgPSAxMzIgTUh6Ci0gKi8KLSNkZWZpbmUgU0RSQU1fTU9ERQkweDAwQ0QwMDAwCS8qIENBU0wgMywgYnVyc3QgbGVuZ3RoIDggKi8KLSNkZWZpbmUgU0RSQU1fQ09OVFJPTAkweDUxNEYwMDAwCi0jZGVmaW5lIFNEUkFNX0NPTkZJRzEJMHhFMjMzMzkwMAotI2RlZmluZSBTRFJBTV9DT05GSUcyCTB4OEVFNzAwMDAKLQotCi0vKgotICogRmxhc2ggY29uZmlndXJhdGlvbgotICovCi0jZGVmaW5lIENGR19GTEFTSF9DRkkJCTEKLSNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSV9EUklWRVIJMQotI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJVEVYVF9CQVNFCi0vKiB3ZSBuZWVkIHRoZXNlIGRlc3BpdGUgdXNpbmcgQ0ZJICovCi0jZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMQkvKiBtYXggbnVtIG9mIGZsYXNoIGJhbmtzICovCi0jZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAkyNTYJLyogbWF4IG51bSBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICovCi0jZGVmaW5lIENGR19GTEFTSF9TSVpFCQkweDAyMDAwMDAwIC8qIDMyIE1pQiAqLwotCi0KLS8qCi0gKiBNVEQgY29uZmlndXJhdGlvbgotICovCi0jZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCTEKLSNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPWNtMXFwMS0wIgotI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1jbTFxcDEtMDoiCQkJXAotCQkJCQkiMzg0ayh1Ym9vdCksMTI4ayhlbnYpLCIJXAotCQkJCQkiMTI4ayhyZWR1bmRfZW52KSwxMjhrKGR0YiksIglcCi0JCQkJCSIybShrZXJuZWwpLDI3OTA0ayhyb290ZnMpLCIJXAotCQkJCQkiLShjb25maWcpIgotCi0KLS8qCi0gKiBJMkMgY29uZmlndXJhdGlvbgotICovCi0jZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJMQkvKiBJMkMgd2l0aCBoYXJkd2FyZSBzdXBwb3J0ICovCi0jZGVmaW5lIENGR19JMkNfTU9EVUxFCQkyCS8qIFNlbGVjdCBJMkMgbW9kdWxlICMyICovCi0jZGVmaW5lIENGR19JMkNfU1BFRUQJCTQwMDAwCS8qIDQwIGtIeiAqLwotI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDAKLSNkZWZpbmUgQ0ZHX0kyQ19JTwkJMHgzOAkvKiBQQ0E5NTU0QUQgSTJDIEkvTyBwb3J0IGFkZHJlc3MgKi8KLSNkZWZpbmUgQ0ZHX0kyQ19FRVBST00JCTB4NTMJLyogSTJDIEVFUFJPTSBkZXZpY2UgYWRkcmVzcyAqLwotCi0KLS8qCi0gKiBSVEMgY29uZmlndXJhdGlvbgotICovCi0jZGVmaW5lIENPTkZJR19SVENfTVBDNTIwMAkxCS8qIHVzZSBpbnRlcm5hbCBNUEM1MjAwIFJUQyAqLwotCi0KLS8qCi0gKiBVU0IgY29uZmlndXJhdGlvbgotICovCi0jZGVmaW5lIENPTkZJR19VU0JfT0hDSQkJMQotI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UJMQotI2RlZmluZSBDT05GSUdfVVNCX0NMT0NLCTB4MDAwMUJCQkIKLSNkZWZpbmUgQ09ORklHX1VTQl9DT05GSUcJMHgwMDAwMTAwMAotLyogUGFydGl0aW9ucyAoZm9yIFVTQikgKi8KLSNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04JMQotI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgkxCi0jZGVmaW5lIENPTkZJR19JU09fUEFSVElUSU9OCTEKLQotLyoKLSAqIEludm9rZSBvdXIgbGFzdF9zdGFnZV9pbml0IGZ1bmN0aW9uIC0gbmVlZGVkIGJ5IGZ3dXBkYXRlCi0gKi8KLSNkZWZpbmUgQ09ORklHX0xBU1RfU1RBR0VfSU5JVAkxCi0KLS8qCi0gKiBFbnZpcm9ubWVudCBzZXR0aW5ncwotICovCi0jZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQotI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4MTAwMDAKLSNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHgyMDAwMAotI2RlZmluZSBDRkdfRU5WX0FERFIJCShDRkdfRkxBU0hfQkFTRSArIENGR19NT05JVE9SX0xFTikKLS8qIENvbmZpZ3VyYXRpb24gb2YgcmVkdW5kYW50IGVudmlyb25tZW50ICovCi0jZGVmaW5lIENGR19FTlZfQUREUl9SRURVTkQJKENGR19FTlZfQUREUiArIENGR19FTlZfU0VDVF9TSVpFKQotI2RlZmluZSBDRkdfRU5WX1NJWkVfUkVEVU5ECShDRkdfRU5WX1NJWkUpCi0KLQotLyoKLSAqIFBpbiBtdWx0aXBsZXhpbmcgY29uZmlndXJhdGlvbgotICovCi0KLS8qCi0gKiBDUzEvR1BJT19XS1VQXzY6IEdQSU8gKGRlZmF1bHQpCi0gKiBBTFRzOiBDQU4xIG9uIEkyQzEsIENBTjIgb24gVElNRVIwLzEKLSAqIElSREEvUFNDNjogVUFSVAotICogRXRoZXI6IEV0aGVybmV0IDEwME1iaXQgd2l0aCBNRAotICogUENJX0RJUzogUENJIGNvbnRyb2xsZXIgZGlzYWJsZWQKLSAqIFVTQjogVVNCCi0gKiBQU0MzOiBTUEkgd2l0aCBVQVJUMwotICogUFNDMjogVUFSVAotICogUFNDMTogVUFSVAotICovCi0jZGVmaW5lIENGR19HUFNfUE9SVF9DT05GSUcJMHgxMDU1OUM0NAotCi0KLS8qCi0gKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCi0gKi8KLSNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkxCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5ICovCi0jZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KLSNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwotI2RlZmluZSBDRkdfUEJTSVpFIChDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KLSNkZWZpbmUgQ0ZHX01BWEFSR1MJCTE2CS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzICovCi0jZGVmaW5lIENGR19CQVJHU0laRQkJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplICovCi0KLSNkZWZpbmUgQ0ZHX0FMVF9NRU1URVNUCQkxCi0jZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4MDAxMDAwMDAJLyogbWVtdGVzdCB3b3JrcyBvbiAqLwotI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MDNmMDAwMDAJLyogMSAuLiA2MyBNaUIgaW4gU0RSQU0gKi8KLQotI2RlZmluZSBDT05GSUdfTE9PUFcJCTEKLQotI2RlZmluZSBDRkdfTE9BRF9BRERSCQkweDEwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwotI2RlZmluZSBDRkdfSFoJCQkxMDAwCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KLQotCi0vKgotICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKLSAqLwotI2RlZmluZSBDRkdfSElEMF9JTklUCQlISUQwX0lDRSB8IEhJRDBfSUNGSQotI2RlZmluZSBDRkdfSElEMF9GSU5BTAkJSElEMF9JQ0UKLQotI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCi0jZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290ICovCi0KLSNkZWZpbmUgQ0ZHX1hMQl9QSVBFTElOSU5HCTEJLyogZW5hYmxlIHRyYW5zYWN0aW9uIHBpcGVsaW5nICovCi0KLQotLyoKLSAqIENhY2hlIENvbmZpZ3VyYXRpb24KLSAqLwotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KLQotLyoKLSAqIEZsYXQgRGV2aWNlIFRyZWUgc3VwcG9ydAotICovCi0jZGVmaW5lIENPTkZJR19PRl9GTEFUX1RSRUUJMQotI2RlZmluZSBDT05GSUdfT0ZfQk9BUkRfU0VUVVAJMQotI2RlZmluZSBPRl9GTEFUX1RSRUVfTUFYX1NJWkUJODE5MgkvKiBtYXggc2l6ZSBvZiB0aGUgZmxhdCB0cmVlICg4SykgKi8KLSNkZWZpbmUgT0ZfQ1BVCQkJIlBvd2VyUEMsNTIwMEAwIgotI2RlZmluZSBPRl9TT0MJCQkic29jNTIwMEBmMDAwMDAwMCIKLSNkZWZpbmUgT0ZfVEJDTEsJCShiZC0+YmlfYnVzZnJlcSAvIDQpCi0jZGVmaW5lIE9GX1NURE9VVF9QQVRICQkiL3NvYzUyMDBAZjAwMDAwMDAvc2VyaWFsQDIwMDAiCi0KLSNlbmRpZiAvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY200MDA4LmggYi9pbmNsdWRlL2NvbmZpZ3MvY200MDA4LmgKaW5kZXggNTk0N2MyYS4uYWU0MGIzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2NtNDAwOC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jbTQwMDguaApAQCAtNTgsMTAgKzU4LDIzIEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLSN1bmRlZiBDT05GSUdfQ09NTUFORFMKLSNkZWZpbmUJQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfTk9OU1REIHwgQ0ZHX0NNRF9FTlYpKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9FTlYKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJtZW09MTZNIGNvbnNvbGU9dHR5QU0wLDExNTIwMCIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9jbTQxeHguaCBiL2luY2x1ZGUvY29uZmlncy9jbTQxeHguaAppbmRleCBlNjJmYzA2Li5jMWRkMzNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvY200MXh4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2NtNDF4eC5oCkBAIC01OCwxMCArNTgsMjMgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKICNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotI3VuZGVmIENPTkZJR19DT01NQU5EUwotI2RlZmluZQlDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9OT05TVEQgfCBDRkdfQ01EX0VOVikpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX0VOVgorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkwCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJIm1lbT0zMk0gY29uc29sZT10dHlBTTAsMTE1MjAwIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2NtNTIwMC5oIGIvaW5jbHVkZS9jb25maWdzL2NtNTIwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NTQzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvY201MjAwLmgKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfTVBDNXh4eAkJMQkvKiBUaGlzIGlzIGFuIE1QQzV4eHggQ1BVICovCisjZGVmaW5lIENPTkZJR19NUEM1MjAwCQkxCS8qIChtb3JlIHByZWNpc2VseSBhbiBNUEM1MjAwIENQVSkgKi8KKyNkZWZpbmUgQ09ORklHX0NNNTIwMAkJMQkvKiAuLi4gb24gQ001MjAwIHBsYXRmb3JtICovCisKKy8qCisgKiBTdXBwb3J0ZWQgY29tbWFuZHMKKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKworLyoKKyAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfUFNDX0NPTlNPTEUJMQkvKiBjb25zb2xlIGlzIG9uIFBTQzEgKi8KKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk1NzYwMAkvKiAuLi4gYXQgNTc2MDAgYnBzICovCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwgMjMwNDAwIH0KKyNkZWZpbmUgQ09ORklHX1NJTEVOVF9DT05TT0xFCTEJLyogbmVlZGVkIHRvIHNpbGVuY2UgaTJjX2luaXQoKSAqLworCisvKgorICogRXRoZXJuZXQgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19NUEM1eHh4X0ZFQwkxCisjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMHgwMAorI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQkxCS8qIGFsbG93IG92ZXJ3cml0aW5nIG9mIGV0aGFkZHIgKi8KKy8qIHVzZSBtaXNjX2luaXRfcigpIHRvIHJlYWQgZXRoYWRkciBmcm9tIEkyQyBFRVBST00gKHNlZSBDRkdfSTJDX0VFUFJPTSkgKi8KKyNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCTEKKyNkZWZpbmUgQ09ORklHX01BQ19PRkZTRVQJMHgzNQkvKiBNQUMgYWRkcmVzcyBvZmZzZXQgaW4gSTJDIEVFUFJPTSAqLworCisvKgorICogUE9TVCBzdXBwb3J0CisgKi8KKyNkZWZpbmUgQ09ORklHX1BPU1QJCShDRkdfUE9TVF9NRU1PUlkgfCBDRkdfUE9TVF9DUFUgfCBDRkdfUE9TVF9JMkMpCisjZGVmaW5lIE1QQzVYWFhfU1JBTV9QT1NUX1NJWkUJKE1QQzVYWFhfU1JBTV9TSVpFIC0gNCkKKy8qIExpc3Qgb2YgSTJDIGFkZHJlc3NlcyB0byBiZSB2ZXJpZmllZCBieSBQT1NUICovCisjZGVmaW5lIEkyQ19BRERSX0xJU1QJCXsgQ0ZHX0kyQ19TTEFWRSwgQ0ZHX0kyQ19JTywgQ0ZHX0kyQ19FRVBST00gfQorCisvKiBkaXNwbGF5IGltYWdlIHRpbWVzdGFtcHMgKi8KKyNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAkxCisKKy8qCisgKiBBdXRvYm9vdGluZworICovCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQkvKiBhdXRvYm9vdCBhZnRlciA1IHNlY29uZHMgKi8KKyNkZWZpbmUgQ09ORklHX1BSRUJPT1QJImVjaG87IiBcCisJImVjaG8gVHlwZSBcInJ1biBuZXRfbmZzX2ZkdFwiIHRvIG1vdW50IHJvb3QgZmlsZXN5c3RlbSBvdmVyIE5GUzsiIFwKKwkiZWNobyIKKyN1bmRlZiBDT05GSUdfQk9PVEFSR1MKKworLyoKKyAqIERlZmF1bHQgZW52aXJvbm1lbnQgc2V0dGluZ3MKKyAqLworI2RlZmluZSBDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTCQkJCQlcCisJIm5ldGRldj1ldGgwXDAiCQkJCQkJCVwKKwkibmV0bWFzaz0yNTUuMjU1LjAuMFwwIgkJCQkJCVwKKwkiaXBhZGRyPTE5Mi4xNjguMTYwLjMzXDAiCQkJCQlcCisJInNlcnZlcmlwPTE5Mi4xNjguMS4xXDAiCQkJCQlcCisJImdhdGV3YXlpcD0xOTIuMTY4LjEuMVwwIgkJCQkJXAorCSJjb25zb2xlPXR0eVBTQzBcMCIJCQkJCQlcCisJInUtYm9vdF9hZGRyPTEwMDAwMFwwIgkJCQkJCVwKKwkia2VybmVsX2FkZHI9MjAwMDAwXDAiCQkJCQkJXAorCSJrZXJuZWxfYWRkcl9mbGFzaD1mYzBjMDAwMFwwIgkJCQkJXAorCSJmZHRfYWRkcj00MDAwMDBcMCIJCQkJCQlcCisJImZkdF9hZGRyX2ZsYXNoPWZjMGEwMDAwXDAiCQkJCQlcCisJInJhbWRpc2tfYWRkcj01MDAwMDBcMCIJCQkJCQlcCisJInJvb3RwYXRoPS9vcHQvZWxkay00LjEvcHBjXzZ4eFwwIgkJCQlcCisJInUtYm9vdD0vdGZ0cGJvb3QvY201MjAwL3UtYm9vdC5iaW5cMCIJCQkJXAorCSJib290ZmlsZV9mZHQ9L3RmdHBib290L2NtNTIwMC91SW1hZ2VcMCIJCQlcCisJImZkdF9maWxlPS90ZnRwYm9vdC9jbTUyMDAvY201MjAwLmR0YlwwIgkJCVwKKwkibG9hZD10ZnRwICR7dS1ib290X2FkZHJ9ICR7dS1ib290fVwwIgkJCQlcCisJInVwZGF0ZT1wcm90IG9mZiBmYzAwMDAwMCArJHtmaWxlc2l6ZX07ICIJCQlcCisJCSJlcmEgZmMwMDAwMDAgKyR7ZmlsZXNpemV9OyAiCQkJCVwKKwkJImNwLmIgJHt1LWJvb3RfYWRkcn0gZmMwMDAwMDAgJHtmaWxlc2l6ZX07ICIJCVwKKwkJInByb3Qgb24gZmMwMDAwMDAgKyR7ZmlsZXNpemV9XDAiCQkJXAorCSJuZnNhcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIHJ3ICIJCQlcCisJCSJuZnNyb290PSR7c2VydmVyaXB9OiR7cm9vdHBhdGh9XDAiCQkJXAorCSJmbGFzaGFyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9tdGRibG9jazUgcndcMCIJCVwKKwkiYWRkbXRkPXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSAke210ZHBhcnRzfVwwIgkJXAorCSJhZGRpbml0PXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSBpbml0PS9saW51eHJjXDAiCQlcCisJImFkZGNvbnM9c2V0ZW52IGJvb3RhcmdzICR7Ym9vdGFyZ3N9ICIJCQkJXAorCQkiY29uc29sZT0ke2NvbnNvbGV9LCR7YmF1ZHJhdGV9XDAiCQkJXAorCSJhZGRpcD1zZXRlbnYgYm9vdGFyZ3MgJHtib290YXJnc30gIgkJCQlcCisJCSJpcD0ke2lwYWRkcn06JHtzZXJ2ZXJpcH06JHtnYXRld2F5aXB9OiIJCVwKKwkJIiR7bmV0bWFza306JHtob3N0bmFtZX06JHtuZXRkZXZ9Om9mZiBwYW5pYz0xXDAiCVwKKwkiZmxhc2hfZmxhc2g9cnVuIGZsYXNoYXJncyBhZGRpbml0IGFkZGlwIGFkZGNvbnM7IgkJXAorCQkiYm9vdG0gJHtrZXJuZWxfYWRkcl9mbGFzaH0gLSAke2ZkdF9hZGRyX2ZsYXNofVwwIglcCisJIm5ldF9uZnNfZmR0PXRmdHAgJHtrZXJuZWxfYWRkcn0gJHtib290ZmlsZV9mZHR9OyAiCQlcCisJCSJ0ZnRwICR7ZmR0X2FkZHJ9ICR7ZmR0X2ZpbGV9OyBydW4gbmZzYXJncyBhZGRpcCAiCVwKKwkJImFkZGNvbnM7IGJvb3RtICR7a2VybmVsX2FkZHJ9IC0gJHtmZHRfYWRkcn1cMCIJCVwKKwkiIgorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInJ1biBmbGFzaF9mbGFzaCIKKworLyoKKyAqIExvdyBsZXZlbCBjb25maWd1cmF0aW9uCisgKi8KKworLyoKKyAqIENsb2NrIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfTVBDNVhYWF9DTEtJTgkzMzAwMDAwMAkvKiBTWVNfWFRBTF9JTiA9IDMzTUh6ICovCisjZGVmaW5lIENGR19JUEJDTEtfRVFVQUxTX1hMQkNMSwkxCS8qIElQQiA9IDEzM01IeiAqLworCisvKgorICogTWVtb3J5IG1hcAorICovCisjZGVmaW5lIENGR19NQkFSCQkweEYwMDAwMDAwCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19ERUZBVUxUX01CQVIJMHg4MDAwMDAwMAorCisjZGVmaW5lIENGR19MT1dCT09UCQkxCisKKy8qIFVzZSBPTi1DaGlwIFNSQU0gdW50aWwgUkFNIHdpbGwgYmUgYXZhaWxhYmxlICovCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCU1QQzVYWFhfU1JBTQorI2lmZGVmIENPTkZJR19QT1NUCisvKiBwcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHBvc3Rfd29yZCBhdCBlbmQgb2Ygb24tY2hpcCBTUkFNICovCisjZGVmaW5lIENGR19JTklUX1JBTV9FTkQJTVBDNVhYWF9TUkFNX1BPU1RfU0laRQorI2Vsc2UKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORAlNUEM1WFhYX1NSQU1fU0laRQorI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMTI4CS8qIHNpemUgaW4gYnl0ZXMgZm9yIGluaXRpYWwgZGF0YSAqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfT0ZGU0VUCShDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisjZGVmaW5lIENPTkZJR19CT0FSRF9UWVBFUwkxCS8qIHdlIHVzZSBib2FyZF90eXBlICovCisKKyNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKKworI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVRFWFRfQkFTRQorI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgzODQgPDwgMTApCS8qIDM4NCBrQiBmb3IgTW9uaXRvciAqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDI1NiA8PCAxMCkJLyogMjU2IGtCIGZvciBtYWxsb2MoKSAqLworI2RlZmluZSBDRkdfQk9PVE1BUFNaCQkoOCA8PCAyMCkJLyogaW5pdGlhbCBtZW0gbWFwIGZvciBMaW51eCAqLworCisvKgorICogRmxhc2ggY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENGR19GTEFTSF9DRkkJCTEKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSV9EUklWRVIJMQorI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhmYzAwMDAwMAorLyogd2UgbmVlZCB0aGVzZSBkZXNwaXRlIHVzaW5nIENGSSAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTEJLyogbWF4IG51bSBvZiBmbGFzaCBiYW5rcyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMjU2CS8qIG1heCBudW0gb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworI2RlZmluZSBDRkdfRkxBU0hfU0laRQkJMHgwMjAwMDAwMCAvKiAzMiBNaUIgKi8KKworCisjaWYgKENGR19NT05JVE9SX0JBU0UgPCBDRkdfRkxBU0hfQkFTRSkKKyNkZWZpbmUgQ0ZHX1JBTUJPT1QJCTEKKyN1bmRlZiBDRkdfTE9XQk9PVAorI2VuZGlmCisKKworLyoKKyAqIENoaXAgc2VsZWN0cyBjb25maWd1cmF0aW9uCisgKi8KKy8qIEJvb3QgQ2hpcHNlbGVjdCAqLworI2RlZmluZSBDRkdfQk9PVENTX1NUQVJUCUNGR19GTEFTSF9CQVNFCisjZGVmaW5lIENGR19CT09UQ1NfU0laRQkJQ0ZHX0ZMQVNIX1NJWkUKKyNkZWZpbmUgQ0ZHX0JPT1RDU19DRkcJCTB4MDAwODdEMzEJLyogZm9yIHBjaV9jbGsgPSAzMyBNSHogKi8KKy8qIHVzZSBib2FyZF9lYXJseV9pbml0X3IgdG8gZW5hYmxlIGZsYXNoIHdyaXRlIGluIENTX0JPT1QgKi8KKyNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfUgorCisvKiBGbGFzaCBtZW1vcnkgYWRkcmVzc2luZyAqLworI2RlZmluZSBDRkdfQ1MwX1NUQVJUCQlDRkdfRkxBU0hfQkFTRQorI2RlZmluZSBDRkdfQ1MwX1NJWkUJCUNGR19GTEFTSF9TSVpFCisKKy8qIE5vIGJ1cnN0LCBkZWFkIGN5Y2xlID0gMSBmb3IgQ1MwIChGbGFzaCkgKi8KKyNkZWZpbmUgQ0ZHX0NTX0JVUlNUCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19DU19ERUFEQ1lDTEUJMHgwMDAwMDAwMQorCisvKgorICogU0RSQU0gY29uZmlndXJhdGlvbgorICogc2V0dGluZ3MgZm9yIGs0czU2MTYzMkUteHg3NSwgYXNzdW1pbmcgWExCID0gMTMyIE1IegorICovCisjZGVmaW5lIFNEUkFNX01PREUJMHgwMENEMDAwMAkvKiBDQVNMIDMsIGJ1cnN0IGxlbmd0aCA4ICovCisjZGVmaW5lIFNEUkFNX0NPTlRST0wJMHg1MTRGMDAwMAorI2RlZmluZSBTRFJBTV9DT05GSUcxCTB4RTIzMzM5MDAKKyNkZWZpbmUgU0RSQU1fQ09ORklHMgkweDhFRTcwMDAwCisKKy8qCisgKiBNVEQgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCTEKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPWNtNTIwMC0wIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1jbTUyMDAtMDoiCQkJXAorCQkJCQkiMzg0ayh1Ym9vdCksMTI4ayhlbnYpLCIJXAorCQkJCQkiMTI4ayhyZWR1bmRfZW52KSwxMjhrKGR0YiksIglcCisJCQkJCSIybShrZXJuZWwpLDI3OTA0ayhyb290ZnMpLCIJXAorCQkJCQkiLShjb25maWcpIgorCisvKgorICogSTJDIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMJCTEJLyogSTJDIHdpdGggaGFyZHdhcmUgc3VwcG9ydCAqLworI2RlZmluZSBDRkdfSTJDX01PRFVMRQkJMgkvKiBTZWxlY3QgSTJDIG1vZHVsZSAjMiAqLworI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMAkvKiA0MCBrSHogKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMHgwCisjZGVmaW5lIENGR19JMkNfSU8JCTB4MzgJLyogUENBOTU1NEFEIEkyQyBJL08gcG9ydCBhZGRyZXNzICovCisjZGVmaW5lIENGR19JMkNfRUVQUk9NCQkweDUzCS8qIEkyQyBFRVBST00gZGV2aWNlIGFkZHJlc3MgKi8KKworLyoKKyAqIFJUQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1JUQ19NUEM1MjAwCTEJLyogdXNlIGludGVybmFsIE1QQzUyMDAgUlRDICovCisKKy8qCisgKiBVU0IgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19VU0JfT0hDSQkJMQorI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UJMQorI2RlZmluZSBDT05GSUdfVVNCX0NMT0NLCTB4MDAwMUJCQkIKKyNkZWZpbmUgQ09ORklHX1VTQl9DT05GSUcJMHgwMDAwMTAwMAorLyogUGFydGl0aW9ucyAoZm9yIFVTQikgKi8KKyNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04JMQorI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgkxCisjZGVmaW5lIENPTkZJR19JU09fUEFSVElUSU9OCTEKKworLyoKKyAqIEludm9rZSBvdXIgbGFzdF9zdGFnZV9pbml0IGZ1bmN0aW9uIC0gbmVlZGVkIGJ5IGZ3dXBkYXRlCisgKi8KKyNkZWZpbmUgQ09ORklHX0xBU1RfU1RBR0VfSU5JVAkxCisKKy8qCisgKiBFbnZpcm9ubWVudCBzZXR0aW5ncworICovCisjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQorI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4MTAwMDAKKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHgyMDAwMAorI2RlZmluZSBDRkdfRU5WX0FERFIJCShDRkdfRkxBU0hfQkFTRSArIENGR19NT05JVE9SX0xFTikKKy8qIENvbmZpZ3VyYXRpb24gb2YgcmVkdW5kYW50IGVudmlyb25tZW50ICovCisjZGVmaW5lIENGR19FTlZfQUREUl9SRURVTkQJKENGR19FTlZfQUREUiArIENGR19FTlZfU0VDVF9TSVpFKQorI2RlZmluZSBDRkdfRU5WX1NJWkVfUkVEVU5ECShDRkdfRU5WX1NJWkUpCisKKy8qCisgKiBQaW4gbXVsdGlwbGV4aW5nIGNvbmZpZ3VyYXRpb24KKyAqLworCisvKgorICogQ1MxL0dQSU9fV0tVUF82OiBHUElPIChkZWZhdWx0KQorICogQUxUczogQ0FOMSBvbiBJMkMxLCBDQU4yIG9uIFRJTUVSMC8xCisgKiBJUkRBL1BTQzY6IFVBUlQKKyAqIEV0aGVyOiBFdGhlcm5ldCAxMDBNYml0IHdpdGggTUQKKyAqIFBDSV9ESVM6IFBDSSBjb250cm9sbGVyIGRpc2FibGVkCisgKiBVU0I6IFVTQgorICogUFNDMzogU1BJIHdpdGggVUFSVDMKKyAqIFBTQzI6IFVBUlQKKyAqIFBTQzE6IFVBUlQKKyAqLworI2RlZmluZSBDRkdfR1BTX1BPUlRfQ09ORklHCTB4MTA1NTlDNDQKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCTEJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkgKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLworI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkJMTYJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MgKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUgKi8KKworI2RlZmluZSBDRkdfQUxUX01FTVRFU1QJCTEKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwMDEwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uICovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwM2YwMDAwMAkvKiAxIC4uIDYzIE1pQiBpbiBTRFJBTSAqLworCisjZGVmaW5lIENPTkZJR19MT09QVwkJMQorCisjZGVmaW5lIENGR19MT0FEX0FERFIJCTB4MTAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLworCisvKgorICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKKyAqLworI2RlZmluZSBDRkdfSElEMF9JTklUCQlISUQwX0lDRSB8IEhJRDBfSUNGSQorI2RlZmluZSBDRkdfSElEMF9GSU5BTAkJSElEMF9JQ0UKKworI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCisjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290ICovCisKKyNkZWZpbmUgQ0ZHX1hMQl9QSVBFTElOSU5HCTEJLyogZW5hYmxlIHRyYW5zYWN0aW9uIHBpcGVsaW5nICovCisKKy8qCisgKiBDYWNoZSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZmRlZiBDT05GSUdfQ01EX0tHREIKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKworLyoKKyAqIEZsYXQgRGV2aWNlIFRyZWUgc3VwcG9ydAorICovCisjZGVmaW5lIENPTkZJR19PRl9MSUJGRFQJMQorI2RlZmluZSBDT05GSUdfT0ZfQk9BUkRfU0VUVVAJMQorI2RlZmluZSBPRl9DUFUJCQkiUG93ZXJQQyw1MjAwQDAiCisjZGVmaW5lIE9GX1NPQwkJCSJzb2M1MjAwQGYwMDAwMDAwIgorI2RlZmluZSBPRl9UQkNMSwkJKGJkLT5iaV9idXNmcmVxIC8gNCkKKyNkZWZpbmUgT0ZfU1RET1VUX1BBVEgJCSIvc29jNTIwMEBmMDAwMDAwMC9zZXJpYWxAMjAwMCIKKworI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9jbWNfcHUyLmggYi9pbmNsdWRlL2NvbmZpZ3MvY21jX3B1Mi5oCmluZGV4IDU3MmE3MGYuLmYzMmM4YzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jbWNfcHUyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2NtY19wdTIuaApAQCAtMTA0LDM1ICsxMDQsNDQgQEAKICNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkweDUwCiAjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOIDEKICNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVworI2Vsc2UKKyNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAogI2VuZGlmCiAvKiBzdGlsbCBhYm91dCAyMCBrQiBmcmVlIHdpdGggdGhpcyBkZWZpbmVkICovCiAjZGVmaW5lIENGR19MT05HSEVMUAogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkgICAgICAxCiAKLSNpZmRlZiBDT05GSUdfSEFSRF9JMkMKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlcCi0JCSAgICAgICAoKENPTkZJR19DTURfREZMCXwgXAotCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJQ0ZHX0NNRF9ESENQIAl8IFwKLQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQlDRkdfQ01EX05GUwl8IFwKLQkJCUNGR19DTURfU05UUCAgKSAmIFwKLQkJICAgICAgfihDRkdfQ01EX0ZQR0EgfCBDRkdfQ01EX01JU0MpICkKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJXAotCQkgICAgICAgKChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCUNGR19DTURfREhDUCAJfCBcCi0JCQlDRkdfQ01EX05GUwl8IFwKLQkJCUNGR19DTURfU05UUCAgKSAmIFwKLQkJICAgICAgfihDRkdfQ01EX0ZQR0EgfCBDRkdfQ01EX01JU0MpICkKLSNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAotI2VuZGlmCi0jZGVmaW5lIENGR19MT05HSEVMUAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKworI3VuZGVmIENPTkZJR19DTURfRlBHQQorI3VuZGVmIENPTkZJR19DTURfTUlTQworCisjaWYgZGVmaW5lZChDT05GSUdfSEFSRF9JMkMpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2VuZGlmCisKKworI2RlZmluZSBDRkdfTE9OR0hFTFAKIAogI2RlZmluZSBBVDkxX1NNQVJUX01FRElBX0FMRQkoMSA8PCAyMikJLyogb3VyIEFMRSBpcyBBRDIyICovCiAjZGVmaW5lIEFUOTFfU01BUlRfTUVESUFfQ0xFCSgxIDw8IDIxKQkvKiBvdXIgQ0xFIGlzIEFEMjEgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9jbWlfbXBjNXh4LmggYi9pbmNsdWRlL2NvbmZpZ3MvY21pX21wYzV4eC5oCmluZGV4IGU0NTk5MTkuLmNkOTJhZjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jbWlfbXBjNXh4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2NtaV9tcGM1eHguaApAQCAtNDQsMTMgKzQ0LDMzIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk1NzYwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfTUVNT1JZIHwgQ0ZHX0NNRF9MT0FEQiB8IENGR19DTURfUkVHSU5GTyB8IAkJXAotCQkJCSBDRkdfQ01EX0ZMQVNIIHwgQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfQVNLRU5WIHwgICAJCVwKLQkJCQkgQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX0NPTlNPTEUgfCBDRkdfQ01EX0VOViB8IENGR19DTURfUlVOIHwJXAotCQkJCSBDRkdfQ01EX0lNSSkKIAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9DT05TT0xFCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisKIAogI2lmIDAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQktMQkJLyogYXV0b2Jvb3QgZGlzYWJsZWQJCQkqLwpAQCAtNzMsNyArOTMsNyBAQAogCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2NvYnJhNTI3Mi5oIGIvaW5jbHVkZS9jb25maWdzL2NvYnJhNTI3Mi5oCmluZGV4IDkwMzNmYTguLjUxMDUyNGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jb2JyYTUyNzIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvY29icmE1MjcyLmgKQEAgLTEzMCwxNiArMTMwLDI3IEBACiAjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQogI2VuZGlmCiAKLS8qIC0tLQotICogRGVmaW5lIHdoaWNoIGNvbW1tYW5kcyBzaG91bGQgYmUgYXZhaWxhYmxlIGF0IHUtYm9vdCBjb21tYW5kIHByb21wdAotICogLS0tCisKKy8qCisgKiBCT09UUCBvcHRpb25zCiAgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAoIENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HICYgfihDRkdfQ01EX0xPQURTIHwgXAotQ0ZHX0NNRF9MT0FEQikgfCBDRkdfQ01EX01JSSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEQgorI3VuZGVmIENPTkZJR19DTURfTUlJCisKIAogLyoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE4NCw3ICsxOTUsNyBAQAogCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY29nZW50X21wYzgyNjAuaCBiL2luY2x1ZGUvY29uZmlncy9jb2dlbnRfbXBjODI2MC5oCmluZGV4IGFlYTJlNjQuLjg0ZDUwYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jb2dlbnRfbXBjODI2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jb2dlbnRfbXBjODI2MC5oCkBAIC03MSw4ICs3MSw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIFNDQwkqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MJKi8KQEAgLTg4LDEwICs4NywyNSBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKChDT05GSUdfQ01EX0RGTHxDRkdfQ01EX0tHREIpJn5DRkdfQ01EX05FVCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0tHREIKKworI3VuZGVmIENPTkZJR19DTURfTkVUCisKIAogI2lmZGVmIERFQlVHCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJLTEJLyogYXV0b2Jvb3QgZGlzYWJsZWQJCSovCkBAIC0xMDIsNyArMTE2LDcgQEAKIAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJyb290PS9kZXYvcmFtIHJ3IgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ09ORklHX0tHREJfT05fU01DCQkvKiBkZWZpbmUgaWYga2dkYiBvbiBTTUMgKi8KICN1bmRlZglDT05GSUdfS0dEQl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNDQyAqLwogI3VuZGVmCUNPTkZJR19LR0RCX05PTkUJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0xMjQsNyArMTM4LDcgQEAKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjU2LDcgKzI3MCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjYwIENQVQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY29nZW50X21wYzh4eC5oIGIvaW5jbHVkZS9jb25maWdzL2NvZ2VudF9tcGM4eHguaAppbmRleCA4MDk2MmQzLi5jZTM4YWYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvY29nZW50X21wYzh4eC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jb2dlbnRfbXBjOHh4LmgKQEAgLTU5LDEwICs1OSwyNSBAQAogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCiAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0tHREIgfCBDRkdfQ01EX0kyQykgJiB+Q0ZHX0NNRF9ORVQpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfS0dEQgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworCisjdW5kZWYgQ09ORklHX0NNRF9ORVQKKwogCiAjaWYgMAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCS0xCS8qIGF1dG9ib290IGRpc2FibGVkCQkqLwpAQCAtNzMsNyArODgsNyBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9yYW0gcnciCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjdW5kZWYJQ09ORklHX0tHREJfT05fU0NDCQkvKiBkZWZpbmUgaWYga2dkYiBvbiBTQ0MgKi8KICNkZWZpbmUJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTg4LDcgKzEwMyw3IEBACiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIwMCw3ICsyMTUsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY3BjaTUyMDAuaCBiL2luY2x1ZGUvY29uZmlncy9jcGNpNTIwMC5oCmluZGV4IGY1ZWZjZDkuLmNlNGVhMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jcGNpNTIwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jcGNpNTIwMC5oCkBAIC01MCwxMSArNTAsNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkgICAgICovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTkyLDEyICs4Nyw2IEBACiAjZGVmaW5lIENPTkZJR19OUzgzODJYCQkxCiAjZW5kaWYKIAotI2RlZmluZSBBRERfUENJX0NNRAkJQ0ZHX0NNRF9QQ0kKLQotI2Vsc2UJCQkJLyogTVBDNTEwMCAqLwotCi0jZGVmaW5lIEFERF9QQ0lfQ01ECQkwCS8qIG5vIENGR19DTURfUENJICovCi0KICNlbmRpZgogCiAvKiBQYXJ0aXRpb25zICovCkBAIC0xMDcsMjggKzk2LDM1IEBACiAvKiBVU0IgKi8KICNpZiAwCiAjZGVmaW5lIENPTkZJR19VU0JfT0hDSQotI2RlZmluZSBBRERfVVNCX0NNRAkJQ0ZHX0NNRF9VU0IgfCBDRkdfQ01EX0ZBVAogI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UKLSNlbHNlCi0jZGVmaW5lIEFERF9VU0JfQ01ECQkwCiAjZW5kaWYKIAogLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcworICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkgQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJIENGR19DTURfSURFCXwgXAotCQkJCSBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJIENGR19DTURfRUxGCXwgXAotCQkJCSBDRkdfQ01EX0VYVDIJfCBcCi0JCQkJIENGR19DTURfREFURQl8IFwKLQkJCQkgQUREX1BDSV9DTUQJICApCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCisKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisjZGVmaW5lIENPTkZJR19DTURfREFURQogCiAjaWYgKFRFWFRfQkFTRSA9PSAweEZGMDAwMDAwKQkvKiBCb290IGxvdyB3aXRoIDE2IE1CIEZsYXNoICovCiAjICAgZGVmaW5lIENGR19MT1dCT09UCQkxCkBAIC0yNzcsNyArMjczLDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMjk1LDYgKzI5MSwxMSBAQAogCiAjZGVmaW5lIENGR19WWFdPUktTX01BQ19QVFIJMHgwMDAwMDAwMAkvKiBQYXNzIEV0aGVybmV0IE1BQyB0byBWeFdvcmtzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2NyYWRsZS5oIGIvaW5jbHVkZS9jb25maWdzL2NyYWRsZS5oCmluZGV4IDc3NmUxZDIuLmViOTNhOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jcmFkbGUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvY3JhZGxlLmgKQEAgLTYxLDEwICs2MSwyMSBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgIDExNTIwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAgIChDT05GSUdfQ01EX0RGTCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkgICAgICAgIDMKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgICAgICAgInJvb3Q9L2Rldi9tdGRibG9jazIgY29uc29sZT10dHlTMCwxMTUyMDAiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY3NiMjI2LmggYi9pbmNsdWRlL2NvbmZpZ3MvY3NiMjI2LmgKaW5kZXggZjA0MTAyZS4uMGJlMGYyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2NzYjIyNi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jc2IyMjYuaApAQCAtNTcsMTAgKzU3LDM0IEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTkyMDAKICN1bmRlZiAgQ09ORklHX01JU0NfSU5JVF9SCQkvKiBub3QgdXNlZCB5ZXQgICAgICAgICAgICAgICAgICAgICAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAoQ0ZHX0NNRF9CREl8Q0ZHX0NNRF9MT0FEQnxDRkdfQ01EX0lNSXxDRkdfQ01EX0ZMQVNIfENGR19DTURfTUVNT1JZfENGR19DTURfTkVUfENGR19DTURfRU5WfENGR19DTURfUlVOfENGR19DTURfQVNLRU5WfENGR19DTURfRUNIT3xDRkdfQ01EX0RIQ1B8Q0ZHX0NNRF9DQUNIRSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkiY29uc29sZT10dHlTMCwxOTIwMCBpcD0xOTIuMTY4LjEuMTAsMTkyLjE2OC4xLjUsLDI1NSwyNTUsMjU1LDAsY3NiIHJvb3Q9L2Rldi9uZnMsIGV0aGVyPTAsMHgwODAwMDAwMCxldGgwIgpAQCAtNzMsNyArOTcsNyBAQAogCiAjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRwkxCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxOTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY3NiMjcyLmggYi9pbmNsdWRlL2NvbmZpZ3MvY3NiMjcyLmgKaW5kZXggMjdkNjRjMS4uYzQzYjQ5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2NzYjI3Mi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jc2IyNzIuaApAQCAtNzMsMzAgKzczLDMyIEBACiAjZW5kaWYKIAogLyoKLSAqIEJPT1RQL0RIQ1AgcHJvdG9jb2wgY29uZmlndXJhdGlvbgotICoKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoIENPTkZJR19CT09UUF9ERUZBVUxUCQl8IFwKLQkJCQkgIENPTkZJR19CT09UUF9ETlMyCQl8IFwKLQkJCQkgIENPTkZJR19CT09UUF9CT09URklMRVNJWkUJKQotLyoKLSAqIFUtQm9vdCBNb25pdG9yIENvbW1hbmQgTGluZSBGdW5jdGlvbnMgQ29uZmlndXJhdGlvbgotICoKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJICBDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQkgIENGR19DTURfQkVEQlVHCXwgXAotCQkJCSAgQ0ZHX0NNRF9FTEYJCXwgXAotCQkJCSAgQ0ZHX0NNRF9JUlEJCXwgXAotCQkJCSAgQ0ZHX0NNRF9JMkMJCXwgXAotCQkJCSAgQ0ZHX0NNRF9QQ0kJCXwgXAotCQkJCSAgQ0ZHX0NNRF9EQVRFCQl8IFwKLQkJCQkgIENGR19DTURfTUlJCQl8IFwKLQkJCQkgIENGR19DTURfUElORwkJfCBcCi0JCQkJICBDRkdfQ01EX0RIQ1AJCSApCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKIAogLyoKICAqIFNlcmlhbCBkb3dubG9hZCBjb25maWd1cmF0aW9uCkBAIC0xMDksNyArMTExLDcgQEAKICAqIEtHREIgQ29uZmlndXJhdGlvbgogICoKICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpAQCAtMTI1LDcgKzEyNyw3IEBACiAKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2NzYjQ3Mi5oIGIvaW5jbHVkZS9jb25maWdzL2NzYjQ3Mi5oCmluZGV4IDA5ZDUyZGUuLmE3MTIwYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jc2I0NzIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvY3NiNDcyLmgKQEAgLTczLDMwICs3MywzMSBAQAogI2VuZGlmCiAKIC8qCi0gKiBCT09UUC9ESENQIHByb3RvY29sIGNvbmZpZ3VyYXRpb24KLSAqCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKCBDT05GSUdfQk9PVFBfREVGQVVMVAkJfCBcCi0JCQkJICBDT05GSUdfQk9PVFBfRE5TMgkJfCBcCi0JCQkJICBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCSkKLS8qCi0gKiBVLUJvb3QgTW9uaXRvciBDb21tYW5kIExpbmUgRnVuY3Rpb25zIENvbmZpZ3VyYXRpb24KLSAqCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoIENPTkZJR19DTURfREZMCXwgXAotCQkJCSAgQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJICBDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQkgIENGR19DTURfRUxGCQl8IFwKLQkJCQkgIENGR19DTURfSVJRCQl8IFwKLQkJCQkgIENGR19DTURfSTJDCQl8IFwKLQkJCQkgIENGR19DTURfUENJCQl8IFwKLQkJCQkgIENGR19DTURfREFURQkJfCBcCi0JCQkJICBDRkdfQ01EX01JSQkJfCBcCi0JCQkJICBDRkdfQ01EX1BJTkcJCXwgXAotCQkJCSAgQ0ZHX0NNRF9ESENQCQkgKQorI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUzIKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfREhDUAogCiAvKgogICogU2VyaWFsIGRvd25sb2FkIGNvbmZpZ3VyYXRpb24KQEAgLTEwOSw3ICsxMTAsNyBAQAogICogS0dEQiBDb25maWd1cmF0aW9uCiAgKgogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCkBAIC0xMjUsNyArMTI2LDcgQEAKIAogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY3NiNjM3LmggYi9pbmNsdWRlL2NvbmZpZ3MvY3NiNjM3LmgKaW5kZXggMDcxZDViNy4uOTc2ZGFlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2NzYjYzNy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jc2I2MzcuaApAQCAtOTksMjAgKzk5LDMyIEBACiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkgICAgICAzCiAvKiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCTEgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCVwKLQkJICAgICAgICgoQ09ORklHX0NNRF9ERkwgfCBcCi0JCQlDRkdfQ01EX0pGRlMyIHwgXAotCQkJQ0ZHX0NNRF9ESENQIHwgXAotCQkJQ0ZHX0NNRF9QSU5HICkgJiBcCi0JCSAgICAgIH4oQ0ZHX0NNRF9CREkgfCBcCi0JCQlDRkdfQ01EX0lNSSB8IFwKLQkJCUNGR19DTURfQVVUT1NDUklQVCB8IFwKLQkJCUNGR19DTURfRlBHQSB8IFwKLQkJCUNGR19DTURfTUlTQyB8IFwKLQkJCUNGR19DTURfTE9BRFMgKSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKworI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9JTUkKKyN1bmRlZiBDT05GSUdfQ01EX0FVVE9TQ1JJUFQKKyN1bmRlZiBDT05GSUdfQ01EX0ZQR0EKKyN1bmRlZiBDT05GSUdfQ01EX01JU0MKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisKIAogI2RlZmluZSBDRkdfTUFYX05BTkRfREVWSUNFCTEJLyogTWF4IG51bWJlciBvZiBOQU5EIGRldmljZXMJCSovCiAjZGVmaW5lIFNFQ1RPUlNJWkUgNTEyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZGF2aW5jaV9kdmV2bS5oIGIvaW5jbHVkZS9jb25maWdzL2RhdmluY2lfZHZldm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNkMDU5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL2RhdmluY2lfZHZldm0uaApAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorCisvKgorICogRGVmaW5lIHRoaXMgdG8gbWFrZSBVLUJvb3Qgc2tpcCBsb3cgbGV2ZWwgaW5pdGlhbGl6YXRpb24gd2hlbiBsb2FkZWQKKyAqIGJ5IGluaXRpYWwgYm9vdGxvYWRlci4gTm90IHJlcXVpcmVkIGJ5IE5BTkQgVS1Cb290IHZlcnNpb24gYnV0IElTCisgKiByZXF1aXJlZCBmb3IgYSBOT1IgdmVyc2lvbiB1c2VkIHRvIGJ1cm4gdGhlIHJlYWwgTk9SIFUtQm9vdCBpbnRvCisgKiBOT1IgRmxhc2guIE5BTkQgYW5kIE5PUiBzdXBwb3J0IGZvciBEYVZpbmNpIGNoaXBzIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZQorICogc28gaXQgaXMgTk9UIHBvc3NpYmxlIHRvIGJ1aWxkIGEgVS1Cb290IHdpdGggYm90aCBOQU5EIGFuZCBOT1Igcm91dGluZXMuCisgKiBOT1IgVS1Cb290IGlzIGxvYWRlZCBkaXJlY3RseSBmcm9tIEZsYXNoIHNvIGl0IG11c3QgcGVyZm9ybSBhbGwgdGhlCisgKiBsb3cgbGV2ZWwgaW5pdGlhbGl6YXRpb24gaXRzZWxmLiBOQU5EIHZlcnNpb24gaXMgbG9hZGVkIGJ5IGFuIGluaXRpYWwKKyAqIGJvb3Rsb2FkZXIgKFVCTCBpbiBUSS1lc2UpIHRoYXQgcGVyZm9ybXMgc3VjaCBhbiBpbml0aWFsaXphdGlvbiBzbyBpdCdzCisgKiBza2lwcGVkIGluIE5BTkQgdmVyc2lvbi4gVGhlIHRoaXJkIERhVmluY2kgYm9vdCBtb2RlIGxvYWRzIGEgYm9vdGxvYWRlcgorICogdmlhIFVBUlQwIGFuZCB0aGF0IGJvb3Rsb2FkZXIgaW4gdHVybiBsb2FkcyBhbmQgcnVucyBVLUJvb3QgKG9yIHdoYXRldmVyKQorICogcGVyZm9ybWluZyBsb3cgbGV2ZWwgaW5pdCBwcmlvciB0byBsb2FkaW5nLiBBbGwgdGhhdCBtZWFucyB3ZSBjYW4gTk9UIHVzZQorICogTkFORCB2ZXJzaW9uIHRvIHB1dCBVLUJvb3QgaW50byBOT1IgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgTk9SIHN1cHBvcnQgYW5kCisgKiB3ZSBjYW4gTk9UIHVzZSBOT1IgdmVyc2lvbiBiZWNhdXNlIGl0IHBlcmZvcm1zIGxvdyBsZXZlbCBpbml0aWFsaXphdGlvbgorICogZWZmZWN0aXZlbHkgZGVzdHJveWluZyBpdHNlbGYgaW4gRERSIG1lbW9yeS4gVGhhdCdzIHdoeSBhIHNlcGFyYXRlIE5PUgorICogdmVyc2lvbiB3aXRoIHRoaXMgZGVmaW5lIGlzIG5lZWRlZC4gSXQgaXMgbG9hZGVkIHZpYSBVQVJULCB0aGVuIG9uZSB1c2VzCisgKiBpdCB0byBzb21laG93IGRvd25sb2FkIGEgcHJvcGVyIE5PUiB2ZXJzaW9uIGJ1aWx0IFdJVEhPVVQgdGhpcyBkZWZpbmUgdG8KKyAqIFJBTSAodGZ0cD8pIGFuZCBidXJuIGl0IHRvIE5PUiBGbGFzaC4gSSB3b3VsZCBiZSBwcm9iYWJseSBhYmxlIHRvIHNxdWVlemUKKyAqIE5PUiBzdXBwb3J0IGludG8gdGhlIGluaXRpYWwgYm9vdGxvYWRlciBzbyBpdCB3b24ndCBiZSBuZWVkZWQgYnV0IERhVmluY2kKKyAqIHN0YXRpYyBSQU0gbWlnaHQgYmUgdG9vIHNtYWxsIGZvciB0aGlzIChJIGhhdmUgc29tZXRoaW5nIGxpa2UgMktieXRlcyBsZWZ0CisgKiBhcyBvZiBub3csIHdpdGhvdXQgTk9SIHN1cHBvcnQpIHNvIHRoaXMgbWlnaHQndmUgbm90IGhhcHBlbmVkLi4uCisgKgorI2RlZmluZSBDT05GSUdfTk9SX1VBUlRfQk9PVAorICovCisKKy8qPT09PT09PSovCisvKiBCb2FyZCAqLworLyo9PT09PT09Ki8KKyNkZWZpbmUgRFZfRVZNCisjZGVmaW5lIENGR19OQU5EX1NNQUxMUEFHRQorI2RlZmluZSBDRkdfVVNFX05PUgorLyo9PT09PT09PT09PT09PT09PT09Ki8KKy8qIFNvQyBDb25maWd1cmF0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDT05GSUdfQVJNOTI2RUpTCQkJLyogYXJtOTI2ZWpzIENQVSBjb3JlICovCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEJMjk3MDAwMDAwCS8qIEFybSBDbG9jayBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgQ0ZHX1RJTUVSQkFTRQkJMHgwMWMyMTQwMAkvKiB1c2UgdGltZXIgMCAqLworI2RlZmluZSBDRkdfSFpfQ0xPQ0sJCTI3MDAwMDAwCS8qIFRpbWVyIElucHV0IGNsb2NrIGZyZXEgKi8KKyNkZWZpbmUgQ0ZHX0haCQkJMTAwMAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEVFUFJPTSBkZWZpbml0aW9ucyBmb3IgQXRtZWwgMjRDMjU2Qk4gU0VFUFJPTSBjaGlwICovCisvKiBvbiBTb25hdGEvRFZfRVZNIGJvYXJkLiBObyBFRVBST00gb24gc2NobW9vZ2llLiAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9MRU4JCTIKKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkJMHg1MAorI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfQklUUwk2CisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9ERUxBWV9NUwkyMAorLyo9PT09PT09PT09PT09Ki8KKy8qIE1lbW9yeSBJbmZvICovCisvKj09PT09PT09PT09PT0qLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDB4MTAwMDAgKyAxMjgqMTAyNCkJLyogbWFsbG9jKCkgbGVuICovCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFCTEyOAkJLyogcmVzZXJ2ZWQgZm9yIGluaXRpYWwgZGF0YSAqLworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDgwMDAwMDAwCS8qIG1lbXRlc3Qgc3RhcnQgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4ODEwMDAwMDAJLyogMTZNQiBSQU0gdGVzdCAqLworI2RlZmluZSBDT05GSUdfTlJfRFJBTV9CQU5LUwkxCQkvKiB3ZSBoYXZlIDEgYmFuayBvZiBEUkFNICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUJKDI1NioxMDI0KQkvKiByZWd1bGFyIHN0YWNrICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMQkJMHg4MDAwMDAwMAkvKiBERFIgU3RhcnQgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xX1NJWkUJMHgxMDAwMDAwMAkvKiBERFIgc2l6ZSAyNTZNQiAqLworI2RlZmluZSBERFJfOEJBTktTCQkJCS8qIDgtYmFuayBERFIyICgyNTZNQikgKi8KKy8qPT09PT09PT09PT09PT09PT09PT0qLworLyogU2VyaWFsIERyaXZlciBpbmZvICovCisvKj09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFCTQJCS8qIE5TMTY1NTAgcmVnaXN0ZXIgc2l6ZSAqLworI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xCTB4MDFjMjAwMDAJLyogQmFzZSBhZGRyZXNzIG9mIFVBUlQwICovCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJMjcwMDAwMDAJLyogSW5wdXQgY2xvY2sgdG8gTlMxNjU1MCAqLworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkxCQkvKiB1c2UgVUFSVDAgZm9yIGNvbnNvbGUgKi8KKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAJCS8qIERlZmF1bHQgYmF1ZCByYXRlICovCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisvKj09PT09PT09PT09PT09PT09PT0qLworLyogSTJDIENvbmZpZ3VyYXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQworI2RlZmluZSBDT05GSUdfRFJJVkVSX0RBVklOQ0lfSTJDCisjZGVmaW5lIENGR19JMkNfU1BFRUQJCTgwMDAwCS8qIDEwMEticHMgd29uJ3Qgd29yaywgc2lsaWNvbiBidWcgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMTAJLyogQm9ndXMsIG1hc3Rlci1vbmx5IGluIFUtQm9vdCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIE5ldHdvcmsgJiBFdGhlcm5ldCBDb25maWd1cmF0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDT05GSUdfRFJJVkVSX1RJX0VNQUMKKyNkZWZpbmUgQ09ORklHX01JSQorI2RlZmluZSBDT05GSUdfQk9PVFBfREVGQVVMVAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19ORVRfUkVUUllfQ09VTlQJMTAKKy8qPT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEZsYXNoICYgRW52aXJvbm1lbnQgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09Ki8KKyNpZmRlZiBDRkdfVVNFX05BTkQKKyN1bmRlZiBDRkdfRU5WX0lTX0lOX0ZMQVNICisjZGVmaW5lIENGR19OT19GTEFTSAorI2RlZmluZSBDRkdfRU5WX0lTX0lOX05BTkQJCS8qIFUtQm9vdCBlbnYgaW4gTkFORCBGbGFzaCAgKi8KKyNpZmRlZiBDRkdfTkFORF9TTUFMTFBBR0UKKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJNTEyCS8qIEVudiBzZWN0b3IgU2l6ZSAqLworI2RlZmluZSBDRkdfRU5WX1NJWkUJCVNaXzE2SworI2Vsc2UKKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMjA0OAkvKiBFbnYgc2VjdG9yIFNpemUgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQlTWl8xMjhLCisjZW5kaWYKKyNkZWZpbmUgQ09ORklHX1NLSVBfTE9XTEVWRUxfSU5JVAkvKiBVLUJvb3QgaXMgbG9hZGVkIGJ5IGEgYm9vdGxvYWRlciAqLworI2RlZmluZSBDT05GSUdfU0tJUF9SRUxPQ0FURV9VQk9PVAkvKiB0byBhIHByb3BlciBhZGRyZXNzLCBpbml0IGRvbmUgKi8KKyNkZWZpbmUgQ0ZHX05BTkRfQkFTRQkJMHgwMjAwMDAwMAorI2RlZmluZSBDRkdfTkFORF9IV19FQ0MKKyNkZWZpbmUgQ0ZHX01BWF9OQU5EX0RFVklDRQkxCS8qIE1heCBudW1iZXIgb2YgTkFORCBkZXZpY2VzICovCisjZGVmaW5lIE5BTkRfTUFYX0NISVBTCQkxCisjZGVmaW5lIENGR19FTlZfT0ZGU0VUCQkweDAJLyogQmxvY2sgMC0tbm90IHVzZWQgYnkgYm9vdGNvZGUgKi8KKyNkZWZpbmUgREVGX0JPT1RNCQkiIgorI2VsaWYgZGVmaW5lZChDRkdfVVNFX05PUikKKyNpZmRlZiBDT05GSUdfTk9SX1VBUlRfQk9PVAorI2RlZmluZSBDT05GSUdfU0tJUF9MT1dMRVZFTF9JTklUCS8qIFUtQm9vdCBpcyBsb2FkZWQgYnkgYSBib290bG9hZGVyICovCisjZGVmaW5lIENPTkZJR19TS0lQX1JFTE9DQVRFX1VCT09UCS8qIHRvIGEgcHJvcGVyIGFkZHJlc3MsIGluaXQgZG9uZSAqLworI2Vsc2UKKyN1bmRlZiBDT05GSUdfU0tJUF9MT1dMRVZFTF9JTklUCisjdW5kZWYgQ09ORklHX1NLSVBfUkVMT0NBVEVfVUJPT1QKKyNlbmRpZgorI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICisjdW5kZWYgQ0ZHX05PX0ZMQVNICisjZGVmaW5lIENGR19GTEFTSF9DRklfRFJJVkVSCisjZGVmaW5lIENGR19GTEFTSF9DRkkKKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCQkvKiBtYXggbnVtYmVyIG9mIGZsYXNoIGJhbmtzICovCisjZGVmaW5lIENGR19GTEFTSF9TRUNUX1NaCTB4MTAwMDAJCS8qIDY0S0Igc2VjdCBzaXplIEFNRCBGbGFzaCAqLworI2RlZmluZSBDRkdfRU5WX09GRlNFVAkJKENGR19GTEFTSF9TRUNUX1NaKjMpCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJMHgwMjAwMDAwMAkvKiBDUzIgQmFzZSBhZGRyZXNzIAkgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMQkvKiBGbGFzaCBCYXNlIGZvciBVLUJvb3QgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF9TSVpFCQkweDIwMDAwMDAJLyogRmxhc2ggc2l6ZSAzMk1CIAkgKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCShQSFlTX0ZMQVNIX1NJWkUvQ0ZHX0ZMQVNIX1NFQ1RfU1opCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCUNGR19GTEFTSF9TRUNUX1NaCS8qIEVudiBzZWN0b3IgU2l6ZSAqLworI2VuZGlmCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBVLUJvb3QgZ2VuZXJhbCBjb25maWd1cmF0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjdW5kZWYgCUNPTkZJR19VU0VfSVJRCQkJLyogTm8gSVJRL0ZJUSBpbiBVLUJvb3QgKi8KKyNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCisjdW5kZWYgQ09ORklHX0JPT1RERUxBWQorI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCSJ1SW1hZ2UiCS8qIEJvb3QgZmlsZSBuYW1lICovCisjZGVmaW5lIENGR19QUk9NUFQJCSJVLUJvb3QgPiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KKyNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCisjZGVmaW5lIENGR19QQlNJWkUJCShDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikJLyogUHJpbnQgYnVmZmVyIHN6ICovCisjZGVmaW5lIENGR19NQVhBUkdTCQkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MgKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkJMHg4MDcwMDAwMAkvKiBkZWZhdWx0IExpbnV4IGtlcm5lbCBsb2FkIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ09ORklHX1ZFUlNJT05fVkFSSUFCTEUKKyNkZWZpbmUgQ09ORklHX0FVVE9fQ09NUExFVEUJCS8qIFdvbid0IHdvcmsgd2l0aCBodXNoIHNvIGZhciwgbWF5IGJlIGxhdGVyICovCisjZGVmaW5lIENGR19IVVNIX1BBUlNFUgorI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfRURJVElORworI2RlZmluZSBDRkdfTE9OR0hFTFAKKyNkZWZpbmUgQ09ORklHX0NSQzMyX1ZFUklGWQorI2RlZmluZSBDT05GSUdfTVhfQ1lDTElDCisvKj09PT09PT09PT09PT09PT09PT0qLworLyogTGludXggSW5mb3JtYXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIExJTlVYX0JPT1RfUEFSQU1fQUREUgkweDgwMDAwMTAwCisjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRworI2RlZmluZSBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MKKyNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkibWVtPTEyME0gY29uc29sZT10dHlTMCwxMTUyMDBuOCByb290PS9kZXYvaGRhMSBydyBub2luaXRyZCBpcD1kaGNwIgorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInNldGVudiBzZXRib290IHNldGVudiBib290YXJncyBcXCQoYm9vdGFyZ3MpIHZpZGVvPWRtNjR4eGZiOm91dHB1dD1cXCQodmlkZW9zdGQpO3J1biBzZXRib290OyBib290bSAweDIwNTAwMDAiCisvKj09PT09PT09PT09PT09PT09Ki8KKy8qIFUtQm9vdCBjb21tYW5kcyAqLworLyo9PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyN1bmRlZiBDT05GSUdfQ01EX0JESQorI3VuZGVmIENPTkZJR19DTURfRlBHQQorI3VuZGVmIENPTkZJR19DTURfU0VUR0VURENSCisjaWZkZWYgQ0ZHX1VTRV9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9GTEFTSAorI3VuZGVmIENPTkZJR19DTURfSU1MUworI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNlbGlmIGRlZmluZWQoQ0ZHX1VTRV9OT1IpCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNlbHNlCisjZXJyb3IgIkVpdGhlciBDRkdfVVNFX05BTkQgb3IgQ0ZHX1VTRV9OT1IgX01VU1RfIGJlIGRlZmluZWQgISEhIgorI2VuZGlmCisvKj09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEtHREIgc3VwcG9ydCAoaWYgYW55KSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PSovCisjaWZkZWYgQ09ORklHX0NNRF9LR0RCCisjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9kYXZpbmNpX3NjaG1vb2dpZS5oIGIvaW5jbHVkZS9jb25maWdzL2RhdmluY2lfc2NobW9vZ2llLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjOWEzMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9kYXZpbmNpX3NjaG1vb2dpZS5oCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisKKy8qPT09PT09PSovCisvKiBCb2FyZCAqLworLyo9PT09PT09Ki8KKyNkZWZpbmUgU0NITU9PR0lFCisjZGVmaW5lIENGR19OQU5EX0xBUkdFUEFHRQorI2RlZmluZSBDRkdfVVNFX05BTkQKKy8qPT09PT09PT09PT09PT09PT09PSovCisvKiBTb0MgQ29uZmlndXJhdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ09ORklHX0FSTTkyNkVKUwkJCS8qIGFybTkyNmVqcyBDUFUgY29yZSAqLworI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRCTI5NzAwMDAwMAkvKiBBcm0gQ2xvY2sgZnJlcXVlbmN5ICovCisjZGVmaW5lIENGR19USU1FUkJBU0UJCTB4MDFjMjE0MDAJLyogdXNlIHRpbWVyIDAgKi8KKyNkZWZpbmUgQ0ZHX0haX0NMT0NLCQkyNzAwMDAwMAkvKiBUaW1lciBJbnB1dCBjbG9jayBmcmVxICovCisjZGVmaW5lIENGR19IWgkJCTEwMDAKKy8qPT09PT09PT09PT09PSovCisvKiBNZW1vcnkgSW5mbyAqLworLyo9PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCSgweDEwMDAwICsgMjU2KjEwMjQpCS8qIG1hbGxvYygpIGxlbiAqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRQkxMjgJCS8qIHJlc2VydmVkIGZvciBpbml0aWFsIGRhdGEgKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHg4MDAwMDAwMAkvKiBtZW10ZXN0IHN0YXJ0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECQkweDgxMDAwMDAwCS8qIDE2TUIgUkFNIHRlc3QgKi8KKyNkZWZpbmUgQ09ORklHX05SX0RSQU1fQkFOS1MJMQkJLyogd2UgaGF2ZSAxIGJhbmsgb2YgRFJBTSAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCSgyNTYqMTAyNCkJLyogcmVndWxhciBzdGFjayAqLworI2RlZmluZSBQSFlTX1NEUkFNXzEJCTB4ODAwMDAwMDAJLyogRERSIFN0YXJ0ICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMV9TSVpFCTB4MDgwMDAwMDAJLyogRERSIHNpemUgMTI4TUIgKi8KKyNkZWZpbmUgRERSXzRCQU5LUwkJCQkvKiA0LWJhbmsgRERSMiAoMTI4TUIpICovCisvKj09PT09PT09PT09PT09PT09PT09Ki8KKy8qIFNlcmlhbCBEcml2ZXIgaW5mbyAqLworLyo9PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQk0CQkvKiBOUzE2NTUwIHJlZ2lzdGVyIHNpemUgKi8KKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMQkweDAxYzIwMDAwCS8qIEJhc2UgYWRkcmVzcyBvZiBVQVJUMCAqLworI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsJCTI3MDAwMDAwCS8qIElucHV0IGNsb2NrIHRvIE5TMTY1NTAgKi8KKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVgJMQkJLyogdXNlIFVBUlQwIGZvciBjb25zb2xlICovCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCQkvKiBEZWZhdWx0IGJhdWQgcmF0ZSAqLworI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQorLyo9PT09PT09PT09PT09PT09PT09Ki8KKy8qIEkyQyBDb25maWd1cmF0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMKKyNkZWZpbmUgQ09ORklHX0RSSVZFUl9EQVZJTkNJX0kyQworI2RlZmluZSBDRkdfSTJDX1NQRUVECQk4MDAwMAkvKiAxMDBLYnBzIHdvbid0IHdvcmssIHNpbGljb24gYnVnICovCisjZGVmaW5lIENGR19JMkNfU0xBVkUJCTEwCS8qIEJvZ3VzLCBtYXN0ZXItb25seSBpbiBVLUJvb3QgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBOZXR3b3JrICYgRXRoZXJuZXQgQ29uZmlndXJhdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ09ORklHX0RSSVZFUl9USV9FTUFDCisjZGVmaW5lIENPTkZJR19NSUkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0RFRkFVTFQKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUworI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgorI2RlZmluZSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfTkVUX1JFVFJZX0NPVU5UCTEwCisjZGVmaW5lIENPTkZJR19PVkVSV1JJVEVfRVRIQUREUl9PTkNFCisvKj09PT09PT09PT09PT09PT09PT09PSovCisvKiBGbGFzaCAmIEVudmlyb25tZW50ICovCisvKj09PT09PT09PT09PT09PT09PT09PSovCisjdW5kZWYgQ0ZHX0VOVl9JU19JTl9GTEFTSAorI2RlZmluZSBDRkdfTk9fRkxBU0gKKyNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9OQU5ECQkvKiBVLUJvb3QgZW52IGluIE5BTkQgRmxhc2ggICovCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTIwNDgJLyogRW52IHNlY3RvciBTaXplICovCisjZGVmaW5lIENGR19FTlZfU0laRQkJU1pfMTI4SworI2RlZmluZSBDT05GSUdfU0tJUF9MT1dMRVZFTF9JTklUCS8qIFUtQm9vdCBpcyBsb2FkZWQgYnkgYSBib290bG9hZGVyICovCisjZGVmaW5lIENPTkZJR19TS0lQX1JFTE9DQVRFX1VCT09UCS8qIHRvIGEgcHJvcGVyIGFkZHJlc3MsIGluaXQgZG9uZSAqLworI2RlZmluZSBDRkdfTkFORF9CQVNFCQkweDAyMDAwMDAwCisjZGVmaW5lIENGR19OQU5EX0hXX0VDQworI2RlZmluZSBDRkdfTUFYX05BTkRfREVWSUNFCTEJLyogTWF4IG51bWJlciBvZiBOQU5EIGRldmljZXMgKi8KKyNkZWZpbmUgTkFORF9NQVhfQ0hJUFMJCTEKKyNkZWZpbmUgQ0ZHX0VOVl9PRkZTRVQJCTB4MAkvKiBCbG9jayAwLS1ub3QgdXNlZCBieSBib290Y29kZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT0qLworLyogQm9hcmQgcmVsYXRlZCBzdHVmZiAqLworLyo9PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDT05GSUdfUlRDX0RTMTMwNwkJLyogUlRDIGNoaXAgb24gU0NITU9PR0lFICovCisjZGVmaW5lIENGR19JMkNfUlRDX0FERFIJMHg2ZgkvKiBSVEMgY2hpcCBJMkMgYWRkcmVzcyAqLworI2RlZmluZSBDT05GSUdfSEFTX1VJRAorI2RlZmluZSBDT05GSUdfVUlEX0RTMjhDTTAwCQkvKiBVbmlxdWUgSUQgb24gU0NITU9PR0lFICovCisjZGVmaW5lIENGR19VSURfQUREUgkJMHg1MAkvKiBVSUQgY2hpcCBJMkMgYWRkcmVzcyAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogVS1Cb290IGdlbmVyYWwgY29uZmlndXJhdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI3VuZGVmIAlDT05GSUdfVVNFX0lSUQkJCS8qIE5vIElSUS9GSVEgaW4gVS1Cb290ICovCisjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgorI3VuZGVmIENPTkZJR19CT09UREVMQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQkidUltYWdlIgkvKiBCb290IGZpbGUgbmFtZSAqLworI2RlZmluZSBDRkdfUFJPTVBUCQkiVS1Cb290ID4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCisjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLworI2RlZmluZSBDRkdfUEJTSVpFCQkoQ0ZHX0NCU0laRStzaXplb2YoQ0ZHX1BST01QVCkrMTYpCS8qIFByaW50IGJ1ZmZlciBzeiAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzICovCisjZGVmaW5lIENGR19CQVJHU0laRQkJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19MT0FEX0FERFIJCTB4ODA3MDAwMDAJLyogZGVmYXVsdCBMaW51eCBrZXJuZWwgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENPTkZJR19WRVJTSU9OX1ZBUklBQkxFCisjZGVmaW5lIENPTkZJR19BVVRPX0NPTVBMRVRFCQkvKiBXb24ndCB3b3JrIHdpdGggaHVzaCBzbyBmYXIsIG1heSBiZSBsYXRlciAqLworI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIKKyNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCisjZGVmaW5lIENPTkZJR19DTURMSU5FX0VESVRJTkcKKyNkZWZpbmUgQ0ZHX0xPTkdIRUxQCisjZGVmaW5lIENPTkZJR19DUkMzMl9WRVJJRlkKKyNkZWZpbmUgQ09ORklHX01YX0NZQ0xJQworLyo9PT09PT09PT09PT09PT09PT09Ki8KKy8qIExpbnV4IEluZm9ybWF0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBMSU5VWF9CT09UX1BBUkFNX0FERFIJMHg4MDAwMDEwMAorI2RlZmluZSBDT05GSUdfQ01ETElORV9UQUcKKyNkZWZpbmUgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTCisjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJIm1lbT01Nk0gY29uc29sZT10dHlTMCwxMTUyMDBuOCByb290PS9kZXYvaGRhMSBydyBub2luaXRyZCBpcD1kaGNwIgorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInNldGVudiBzZXRib290IHNldGVudiBib290YXJncyBcXCQoYm9vdGFyZ3MpIHZpZGVvPWRtNjR4eGZiOm91dHB1dD1cXCQodmlkZW9zdGQpO3J1biBzZXRib290IgorLyo9PT09PT09PT09PT09PT09PSovCisvKiBVLUJvb3QgY29tbWFuZHMgKi8KKy8qPT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1NBVkVTCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyN1bmRlZiBDT05GSUdfQ01EX0VFUFJPTQorI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9GUEdBCisjdW5kZWYgQ09ORklHX0NNRF9TRVRHRVREQ1IKKyN1bmRlZiBDT05GSUdfQ01EX0ZMQVNICisjdW5kZWYgQ09ORklHX0NNRF9JTUxTCisvKj09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEtHREIgc3VwcG9ydCAoaWYgYW55KSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PSovCisjaWZkZWYgQ09ORklHX0NNRF9LR0RCCisjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9kYXZpbmNpX3NvbmF0YS5oIGIvaW5jbHVkZS9jb25maWdzL2RhdmluY2lfc29uYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU4YzRmYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9kYXZpbmNpX3NvbmF0YS5oCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisKKy8qCisgKiBEZWZpbmUgdGhpcyB0byBtYWtlIFUtQm9vdCBza2lwIGxvdyBsZXZlbCBpbml0aWFsaXphdGlvbiB3aGVuIGxvYWRlZAorICogYnkgaW5pdGlhbCBib290bG9hZGVyLiBOb3QgcmVxdWlyZWQgYnkgTkFORCBVLUJvb3QgdmVyc2lvbiBidXQgSVMKKyAqIHJlcXVpcmVkIGZvciBhIE5PUiB2ZXJzaW9uIHVzZWQgdG8gYnVybiB0aGUgcmVhbCBOT1IgVS1Cb290IGludG8KKyAqIE5PUiBGbGFzaC4gTkFORCBhbmQgTk9SIHN1cHBvcnQgZm9yIERhVmluY2kgY2hpcHMgaXMgbXV0dWFsbHkgZXhjbHVzaXZlCisgKiBzbyBpdCBpcyBOT1QgcG9zc2libGUgdG8gYnVpbGQgYSBVLUJvb3Qgd2l0aCBib3RoIE5BTkQgYW5kIE5PUiByb3V0aW5lcy4KKyAqIE5PUiBVLUJvb3QgaXMgbG9hZGVkIGRpcmVjdGx5IGZyb20gRmxhc2ggc28gaXQgbXVzdCBwZXJmb3JtIGFsbCB0aGUKKyAqIGxvdyBsZXZlbCBpbml0aWFsaXphdGlvbiBpdHNlbGYuIE5BTkQgdmVyc2lvbiBpcyBsb2FkZWQgYnkgYW4gaW5pdGlhbAorICogYm9vdGxvYWRlciAoVUJMIGluIFRJLWVzZSkgdGhhdCBwZXJmb3JtcyBzdWNoIGFuIGluaXRpYWxpemF0aW9uIHNvIGl0J3MKKyAqIHNraXBwZWQgaW4gTkFORCB2ZXJzaW9uLiBUaGUgdGhpcmQgRGFWaW5jaSBib290IG1vZGUgbG9hZHMgYSBib290bG9hZGVyCisgKiB2aWEgVUFSVDAgYW5kIHRoYXQgYm9vdGxvYWRlciBpbiB0dXJuIGxvYWRzIGFuZCBydW5zIFUtQm9vdCAob3Igd2hhdGV2ZXIpCisgKiBwZXJmb3JtaW5nIGxvdyBsZXZlbCBpbml0IHByaW9yIHRvIGxvYWRpbmcuIEFsbCB0aGF0IG1lYW5zIHdlIGNhbiBOT1QgdXNlCisgKiBOQU5EIHZlcnNpb24gdG8gcHV0IFUtQm9vdCBpbnRvIE5PUiBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBOT1Igc3VwcG9ydCBhbmQKKyAqIHdlIGNhbiBOT1QgdXNlIE5PUiB2ZXJzaW9uIGJlY2F1c2UgaXQgcGVyZm9ybXMgbG93IGxldmVsIGluaXRpYWxpemF0aW9uCisgKiBlZmZlY3RpdmVseSBkZXN0cm95aW5nIGl0c2VsZiBpbiBERFIgbWVtb3J5LiBUaGF0J3Mgd2h5IGEgc2VwYXJhdGUgTk9SCisgKiB2ZXJzaW9uIHdpdGggdGhpcyBkZWZpbmUgaXMgbmVlZGVkLiBJdCBpcyBsb2FkZWQgdmlhIFVBUlQsIHRoZW4gb25lIHVzZXMKKyAqIGl0IHRvIHNvbWVob3cgZG93bmxvYWQgYSBwcm9wZXIgTk9SIHZlcnNpb24gYnVpbHQgV0lUSE9VVCB0aGlzIGRlZmluZSB0bworICogUkFNICh0ZnRwPykgYW5kIGJ1cm4gaXQgdG8gTk9SIEZsYXNoLiBJIHdvdWxkIGJlIHByb2JhYmx5IGFibGUgdG8gc3F1ZWV6ZQorICogTk9SIHN1cHBvcnQgaW50byB0aGUgaW5pdGlhbCBib290bG9hZGVyIHNvIGl0IHdvbid0IGJlIG5lZWRlZCBidXQgRGFWaW5jaQorICogc3RhdGljIFJBTSBtaWdodCBiZSB0b28gc21hbGwgZm9yIHRoaXMgKEkgaGF2ZSBzb21ldGhpbmcgbGlrZSAyS2J5dGVzIGxlZnQKKyAqIGFzIG9mIG5vdywgd2l0aG91dCBOT1Igc3VwcG9ydCkgc28gdGhpcyBtaWdodCd2ZSBub3QgaGFwcGVuZWQuLi4KKyAqCisjZGVmaW5lIENPTkZJR19OT1JfVUFSVF9CT09UCisgKi8KKworLyo9PT09PT09Ki8KKy8qIEJvYXJkICovCisvKj09PT09PT0qLworI2RlZmluZSBTT05BVEFfQk9BUkQKKyNkZWZpbmUgQ0ZHX05BTkRfU01BTExQQUdFCisjZGVmaW5lIENGR19VU0VfTk9SCisvKj09PT09PT09PT09PT09PT09PT0qLworLyogU29DIENvbmZpZ3VyYXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENPTkZJR19BUk05MjZFSlMJCQkvKiBhcm05MjZlanMgQ1BVIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUQkyOTcwMDAwMDAJLyogQXJtIENsb2NrIGZyZXF1ZW5jeSAqLworI2RlZmluZSBDRkdfVElNRVJCQVNFCQkweDAxYzIxNDAwCS8qIHVzZSB0aW1lciAwICovCisjZGVmaW5lIENGR19IWl9DTE9DSwkJMjcwMDAwMDAJLyogVGltZXIgSW5wdXQgY2xvY2sgZnJlcSAqLworI2RlZmluZSBDRkdfSFoJCQkxMDAwCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogRUVQUk9NIGRlZmluaXRpb25zIGZvciBBdG1lbCAyNEMyNTZCTiBTRUVQUk9NIGNoaXAgKi8KKy8qIG9uIFNvbmF0YS9EVl9FVk0gYm9hcmQuIE5vIEVFUFJPTSBvbiBzY2htb29naWUuICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTgkJMgorI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSCQkweDUwCisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9CSVRTCTYKKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TCTIwCisvKj09PT09PT09PT09PT0qLworLyogTWVtb3J5IEluZm8gKi8KKy8qPT09PT09PT09PT09PSovCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCQkoMHgxMDAwMCArIDEyOCoxMDI0KQkvKiBtYWxsb2MoKSBsZW4gKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMTI4CQkvKiByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4ODAwMDAwMDAJLyogbWVtdGVzdCBzdGFydCBhZGRyZXNzICovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHg4MTAwMDAwMAkvKiAxNk1CIFJBTSB0ZXN0ICovCisjZGVmaW5lIENPTkZJR19OUl9EUkFNX0JBTktTCTEJCS8qIHdlIGhhdmUgMSBiYW5rIG9mIERSQU0gKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQkoMjU2KjEwMjQpCS8qIHJlZ3VsYXIgc3RhY2sgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xCQkweDgwMDAwMDAwCS8qIEREUiBTdGFydCAqLworI2RlZmluZSBQSFlTX1NEUkFNXzFfU0laRQkweDA4MDAwMDAwCS8qIEREUiBzaXplIDEyOE1CICovCisjZGVmaW5lIEREUl80QkFOS1MJCQkJLyogNC1iYW5rIEREUjIgKDEyOE1CKSAqLworLyo9PT09PT09PT09PT09PT09PT09PSovCisvKiBTZXJpYWwgRHJpdmVyIGluZm8gKi8KKy8qPT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUJNAkJLyogTlMxNjU1MCByZWdpc3RlciBzaXplICovCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEJMHgwMWMyMDAwMAkvKiBCYXNlIGFkZHJlc3Mgb2YgVUFSVDAgKi8KKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQkyNzAwMDAwMAkvKiBJbnB1dCBjbG9jayB0byBOUzE2NTUwICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYCTEJCS8qIHVzZSBVQVJUMCBmb3IgY29uc29sZSAqLworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAkJLyogRGVmYXVsdCBiYXVkIHJhdGUgKi8KKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KKy8qPT09PT09PT09PT09PT09PT09PSovCisvKiBJMkMgQ29uZmlndXJhdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCisjZGVmaW5lIENPTkZJR19EUklWRVJfREFWSU5DSV9JMkMKKyNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJODAwMDAJLyogMTAwS2JwcyB3b24ndCB3b3JrLCBzaWxpY29uIGJ1ZyAqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkxMAkvKiBCb2d1cywgbWFzdGVyLW9ubHkgaW4gVS1Cb290ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogTmV0d29yayAmIEV0aGVybmV0IENvbmZpZ3VyYXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENPTkZJR19EUklWRVJfVElfRU1BQworI2RlZmluZSBDT05GSUdfTUlJCisjZGVmaW5lIENPTkZJR19CT09UUF9ERUZBVUxUCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUzIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX05FVF9SRVRSWV9DT1VOVAkxMAorLyo9PT09PT09PT09PT09PT09PT09PT0qLworLyogRmxhc2ggJiBFbnZpcm9ubWVudCAqLworLyo9PT09PT09PT09PT09PT09PT09PT0qLworI2lmZGVmIENGR19VU0VfTkFORAorI3VuZGVmIENGR19FTlZfSVNfSU5fRkxBU0gKKyNkZWZpbmUgQ0ZHX05PX0ZMQVNICisjZGVmaW5lIENGR19FTlZfSVNfSU5fTkFORAkJLyogVS1Cb290IGVudiBpbiBOQU5EIEZsYXNoICAqLworI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQk1MTIJLyogRW52IHNlY3RvciBTaXplICovCisjZGVmaW5lIENGR19FTlZfU0laRQkJU1pfMTZLCisjZGVmaW5lIENPTkZJR19TS0lQX0xPV0xFVkVMX0lOSVQJLyogVS1Cb290IGlzIGxvYWRlZCBieSBhIGJvb3Rsb2FkZXIgKi8KKyNkZWZpbmUgQ09ORklHX1NLSVBfUkVMT0NBVEVfVUJPT1QJLyogdG8gYSBwcm9wZXIgYWRkcmVzcywgaW5pdCBkb25lICovCisjZGVmaW5lIENGR19OQU5EX0JBU0UJCTB4MDIwMDAwMDAKKyNkZWZpbmUgQ0ZHX05BTkRfSFdfRUNDCisjZGVmaW5lIENGR19NQVhfTkFORF9ERVZJQ0UJMQkvKiBNYXggbnVtYmVyIG9mIE5BTkQgZGV2aWNlcyAqLworI2RlZmluZSBOQU5EX01BWF9DSElQUwkJMQorI2RlZmluZSBDRkdfRU5WX09GRlNFVAkJMHgwCS8qIEJsb2NrIDAtLW5vdCB1c2VkIGJ5IGJvb3Rjb2RlICovCisjZGVmaW5lIERFRl9CT09UTQkJIiIKKyNlbGlmIGRlZmluZWQoQ0ZHX1VTRV9OT1IpCisjaWZkZWYgQ09ORklHX05PUl9VQVJUX0JPT1QKKyNkZWZpbmUgQ09ORklHX1NLSVBfTE9XTEVWRUxfSU5JVAkvKiBVLUJvb3QgaXMgbG9hZGVkIGJ5IGEgYm9vdGxvYWRlciAqLworI2RlZmluZSBDT05GSUdfU0tJUF9SRUxPQ0FURV9VQk9PVAkvKiB0byBhIHByb3BlciBhZGRyZXNzLCBpbml0IGRvbmUgKi8KKyNlbHNlCisjdW5kZWYgQ09ORklHX1NLSVBfTE9XTEVWRUxfSU5JVAorI3VuZGVmIENPTkZJR19TS0lQX1JFTE9DQVRFX1VCT09UCisjZW5kaWYKKyNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9GTEFTSAorI3VuZGVmIENGR19OT19GTEFTSAorI2RlZmluZSBDRkdfRkxBU0hfQ0ZJX0RSSVZFUgorI2RlZmluZSBDRkdfRkxBU0hfQ0ZJCisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMQkJLyogbWF4IG51bWJlciBvZiBmbGFzaCBiYW5rcyAqLworI2RlZmluZSBDRkdfRkxBU0hfU0VDVF9TWgkweDIwMDAwCQkvKiAxMjhLQiBzZWN0IHNpemUgQU1EIEZsYXNoICovCisjZGVmaW5lIENGR19FTlZfT0ZGU0VUCQkoQ0ZHX0ZMQVNIX1NFQ1RfU1oqMikKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDAyMDAwMDAwCS8qIENTMiBCYXNlIGFkZHJlc3MgCSAqLworI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJUEhZU19GTEFTSF8xCS8qIEZsYXNoIEJhc2UgZm9yIFUtQm9vdCAqLworI2RlZmluZSBQSFlTX0ZMQVNIX1NJWkUJCTB4MjAwMDAwMAkvKiBGbGFzaCBzaXplIDMyTUIgCSAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJKFBIWVNfRkxBU0hfU0laRS9DRkdfRkxBU0hfU0VDVF9TWikKKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJQ0ZHX0ZMQVNIX1NFQ1RfU1oJLyogRW52IHNlY3RvciBTaXplICovCisjZW5kaWYKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIFUtQm9vdCBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyN1bmRlZiAJQ09ORklHX1VTRV9JUlEJCQkvKiBObyBJUlEvRklRIGluIFUtQm9vdCAqLworI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IKKyN1bmRlZiBDT05GSUdfQk9PVERFTEFZCisjZGVmaW5lIENPTkZJR19CT09URklMRQkJInVJbWFnZSIJLyogQm9vdCBmaWxlIG5hbWUgKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkJIlUtQm9vdCA+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLworI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KKyNkZWZpbmUgQ0ZHX1BCU0laRQkJKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KQkvKiBQcmludCBidWZmZXIgc3ogKi8KKyNkZWZpbmUgQ0ZHX01BWEFSR1MJCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncyAqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTE9BRF9BRERSCQkweDgwNzAwMDAwCS8qIGRlZmF1bHQgTGludXgga2VybmVsIGxvYWQgYWRkcmVzcyAqLworI2RlZmluZSBDT05GSUdfVkVSU0lPTl9WQVJJQUJMRQorI2RlZmluZSBDT05GSUdfQVVUT19DT01QTEVURQkJLyogV29uJ3Qgd29yayB3aXRoIGh1c2ggc28gZmFyLCBtYXkgYmUgbGF0ZXIgKi8KKyNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCisjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgorI2RlZmluZSBDT05GSUdfQ01ETElORV9FRElUSU5HCisjZGVmaW5lIENGR19MT05HSEVMUAorI2RlZmluZSBDT05GSUdfQ1JDMzJfVkVSSUZZCisjZGVmaW5lIENPTkZJR19NWF9DWUNMSUMKKy8qPT09PT09PT09PT09PT09PT09PSovCisvKiBMaW51eCBJbmZvcm1hdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgTElOVVhfQk9PVF9QQVJBTV9BRERSCTB4ODAwMDAxMDAKKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCisjZGVmaW5lIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUworI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJtZW09NTZNIGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggcm9vdD0vZGV2L2hkYTEgcncgbm9pbml0cmQgaXA9ZGhjcCIKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJzZXRlbnYgc2V0Ym9vdCBzZXRlbnYgYm9vdGFyZ3MgXFwkKGJvb3RhcmdzKSB2aWRlbz1kbTY0eHhmYjpvdXRwdXQ9XFwkKHZpZGVvc3RkKTtydW4gc2V0Ym9vdDsgYm9vdG0gMHgyMDYwMDAwIgorLyo9PT09PT09PT09PT09PT09PSovCisvKiBVLUJvb3QgY29tbWFuZHMgKi8KKy8qPT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1NBVkVTCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjdW5kZWYgQ09ORklHX0NNRF9CREkKKyN1bmRlZiBDT05GSUdfQ01EX0ZQR0EKKyN1bmRlZiBDT05GSUdfQ01EX1NFVEdFVERDUgorI2lmZGVmIENGR19VU0VfTkFORAorI3VuZGVmIENPTkZJR19DTURfRkxBU0gKKyN1bmRlZiBDT05GSUdfQ01EX0lNTFMKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZWxpZiBkZWZpbmVkKENGR19VU0VfTk9SKQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZWxzZQorI2Vycm9yICJFaXRoZXIgQ0ZHX1VTRV9OQU5EIG9yIENGR19VU0VfTk9SIF9NVVNUXyBiZSBkZWZpbmVkICEhISIKKyNlbmRpZgorLyo9PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBLR0RCIHN1cHBvcnQgKGlmIGFueSkgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmZGVmIENPTkZJR19DTURfS0dEQgorI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCisjZW5kaWYKKyNlbmRpZiAvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZGJhdTF4MDAuaCBiL2luY2x1ZGUvY29uZmlncy9kYmF1MXgwMC5oCmluZGV4IDRjYzUwODUuLmIyZjYwNmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9kYmF1MXgwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9kYmF1MXgwMC5oCkBAIC03NSwyMSArNzUsNTcgQEAKICNpZmRlZiBDT05GSUdfREJBVTE1NTAKIC8qIEJvb3QgZnJvbSBmbGFzaCBieSBkZWZhdWx0LCByZXZlcnQgdG8gYm9vdHAgKi8KICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAweGJmYzIwMDAwOyBib290cDsgYm9vdG0iCi0KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfTE9BREIgfCBDRkdfQ01EX05FVCkgJiBcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYgfCBDRkdfQ01EX0ZBVCB8IENGR19DTURfRlBHQSB8IENGR19DTURfSURFIHwgXAotCQkJCSAgIENGR19DTURfTUlJIHwgQ0ZHX0NNRF9SVU4gfCBDRkdfQ01EX0JESSB8IENGR19DTURfQkVEQlVHIHwgXAotCQkJCSAgIENGR19DTURfTkZTIHwgQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX1BDTUNJQSB8IENGR19DTURfSTJDKSkKICNlbHNlIC8qIENPTkZJR19EQkFVMTU1MCAqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RwO2Jvb3RtIgotCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfSURFIHwgQ0ZHX0NNRF9ESENQIHwgQ0ZHX0NNRF9FTEYpICYgXAotCQkJCSB+KENGR19DTURfRU5WIHwgQ0ZHX0NNRF9GQVQgfCBDRkdfQ01EX0ZMQVNIIHwgQ0ZHX0NNRF9GUEdBIHwgXAotCQkJCSAgIENGR19DTURfTUlJIHwgQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfUlVOIHwgQ0ZHX0NNRF9MT0FEQiB8IFwKLQkJCQkgICBDRkdfQ01EX0VMRiB8IENGR19DTURfQkRJIHwgQ0ZHX0NNRF9CRURCVUcpKQogI2VuZGlmIC8qIENPTkZJR19EQkFVMTU1MCAqLwogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX0JESQorI3VuZGVmIENPTkZJR19DTURfQkVEQlVHCisjdW5kZWYgQ09ORklHX0NNRF9FTEYKKyN1bmRlZiBDT05GSUdfQ01EX0VOVgorI3VuZGVmIENPTkZJR19DTURfRkFUCisjdW5kZWYgQ09ORklHX0NNRF9GUEdBCisjdW5kZWYgQ09ORklHX0NNRF9NSUkKKyN1bmRlZiBDT05GSUdfQ01EX1JVTgorCisKKyNpZmRlZiBDT05GSUdfREJBVTE1NTAKKworI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKworI3VuZGVmIENPTkZJR19DTURfSTJDCisjdW5kZWYgQ09ORklHX0NNRF9JREUKKyN1bmRlZiBDT05GSUdfQ01EX05GUworI3VuZGVmIENPTkZJR19DTURfUENNQ0lBCisKKyNlbHNlCisKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKyN1bmRlZiBDT05GSUdfQ01EX0ZMQVNICisjdW5kZWYgQ09ORklHX0NNRF9MT0FEQgorI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKworI2VuZGlmCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9kZWJyaXMuaCBiL2luY2x1ZGUvY29uZmlncy9kZWJyaXMuaAppbmRleCA4ZmY5NjNmLi43NjY3ZTVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvZGVicmlzLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2RlYnJpcy5oCkBAIC0xMjIsMjMgKzEyMiwzNSBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKICNkZWZpbmUgQ09ORklHX0RSQU1fU1BFRUQJMTAwCQkvKiBNSHogKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJICBDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQkgIENGR19DTURfQ0FDSEUJCXwgXAotCQkJCSAgQ0ZHX0NNRF9EQVRFCQl8IFwKLQkJCQkgIENGR19DTURfREhDUAkJfCBcCi0JCQkJICBDRkdfQ01EX0RJQUcJCXwgXAotCQkJCSAgQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJICBDRkdfQ01EX0VMRgkJfCBcCi0JCQkJICBDRkdfQ01EX0kyQwkJfCBcCi0JCQkJICBDRkdfQ01EX0pGRlMyCQl8IFwKLQkJCQkgIENGR19DTURfS0dCRAkJfCBcCi0JCQkJICBDRkdfQ01EX1BDSQkJfCBcCi0JCQkJICBDRkdfQ01EX1BJTkcJCXwgXAotCQkJCSAgQ0ZHX0NNRF9TQVZFUwkJfCBcCi0JCQkJICBDRkdfQ01EX1NEUkFNKQotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQkqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX0tHQkQKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQogCiAKIC8qCkBAIC00MzUsNyArNDQ3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNDAgQ1BVCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9kZWx0YS5oIGIvaW5jbHVkZS9jb25maWdzL2RlbHRhLmgKaW5kZXggMTU2ODEyMC4uMDk2NjdlZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2RlbHRhLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2RlbHRhLmgKQEAgLTg3LDIyICs4Nyw0OSBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLS8qICNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgIChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTU1DIHwgQ0ZHX0NNRF9GQVQpICovCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKICNpZmRlZiBUVVJOX09OX0VUSEVSTkVUCi0jIGRlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgIChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUElORykKKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogI2Vsc2UKLSMgZGVmaW5lIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIFwKLQkJCQkgIHwgQ0ZHX0NNRF9FTlYgXAotCQkJCSAgfCBDRkdfQ01EX05BTkQgXAotCQkJCSAgfCBDRkdfQ01EX0kyQykgXAotCQkJCSAmIH4oQ0ZHX0NNRF9ORVQgXAotCQkJCSAgICAgfCBDRkdfQ01EX0ZMQVNIIFwKLQkJCQkgICAgIHwgQ0ZHX0NNRF9JTUxTKSkKKworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI3VuZGVmIENPTkZJR19DTURfTkVUCisjdW5kZWYgQ09ORklHX0NNRF9GTEFTSAorI3VuZGVmIENPTkZJR19DTURfSU1MUworCiAjZW5kaWYKIAorLyogVVNCICovCisjZGVmaW5lIENPTkZJR19VU0JfT0hDSV9ORVcJMQorI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UgICAgICAxCisjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OICAgIDEKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI3VuZGVmIENGR19VU0JfT0hDSV9CT0FSRF9JTklUCisjZGVmaW5lIENGR19VU0JfT0hDSV9DUFVfSU5JVAkxCisjZGVmaW5lIENGR19VU0JfT0hDSV9SRUdTX0JBU0UJT0hDSV9SRUdTX0JBU0UKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1NMT1RfTkFNRQkiZGVsdGEiCisjZGVmaW5lIENGR19VU0JfT0hDSV9NQVhfUk9PVF9QT1JUUwkzCisKKyNkZWZpbmUgTElUVExFRU5ESUFOICAgICAgICAgICAgMSAgICAgICAvKiB1c2VkIGJ5IHVzYl9vaGNpLmMgICovCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQktMQogI2RlZmluZSBDT05GSUdfRVRIQUREUgkJMDg6MDA6M2U6MjY6MGE6NWIKQEAgLTExNCw3ICsxNDEsNyBAQAogI2RlZmluZSBDT05GSUdfQ01ETElORV9UQUcKICNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9kbnAxMTEwLmggYi9pbmNsdWRlL2NvbmZpZ3MvZG5wMTExMC5oCmluZGV4IDlhYzI4NTYuLmQzMmUwNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9kbnAxMTEwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2RucDExMTAuaApAQCAtNjYsMTAgKzY2LDIxIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJyb290PXJhbWZzIGRldmZzPW1vdW50IGNvbnNvbGU9dHR5U0EwLDExNTIwMCIKQEAgLTgwLDcgKzkxLDcgQEAKICNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQkiZG5wMTExMCIKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJ0ZnRwOyBib290bSIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZVhhbGlvbi5oIGIvaW5jbHVkZS9jb25maWdzL2VYYWxpb24uaAppbmRleCBhMDE0YzdjLi5mOGUyYzg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvZVhhbGlvbi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9lWGFsaW9uLmgKQEAgLTU4LDE3ICs1OCwyNyBAQAogCiAJCQkJCQkgICAgLyojZGVmaW5lIENPTkZJR19EUkFNX1NQRUVECSAgICAgIDY2ICAgKi8gLyogTUh6CQkJICAgICAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCAgIENPTkZJR19DTURfREZMICB8IFwKLQkJCQkgICAgQ0ZHX0NNRF9GTEFTSCAgIHwgXAotCQkJCSAgICBDRkdfQ01EX1NEUkFNICAgfCBcCi0JCQkJICAgIENGR19DTURfSTJDCSAgICB8IFwKLQkJCQkgICAgQ0ZHX0NNRF9JREUJICAgIHwgXAotCQkJCSAgICBDRkdfQ01EX0ZBVAkgICAgfCBcCi0JCQkJICAgIENGR19DTURfRU5WCSAgICB8IFwKLQkJCQkgICAgQ0ZHX0NNRF9QQ0kgKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQkqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zOTgsNyArNDA4LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9lYm9ueS5oIGIvaW5jbHVkZS9jb25maWdzL2Vib255LmgKaW5kZXggNGExMzg1Yy4uMmM2MjZhMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2Vib255LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2Vib255LmgKQEAgLTIwOCwyNiArMjA4LDM4IEBACiAKICNkZWZpbmUgQ09ORklHX05FVENPTlNPTEUJCS8qIGluY2x1ZGUgTmV0Q29uc29sZSBzdXBwb3J0CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMjM2LDcgKzI0OCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI4Niw3ICsyOTgsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKQEAgLTI5OCw3ICszMTAsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2VwNzMxMi5oIGIvaW5jbHVkZS9jb25maWdzL2VwNzMxMi5oCmluZGV4IGJkZGE2MjkuLmY1Y2Y0NzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9lcDczMTIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvZXA3MzEyLmgKQEAgLTYyLDEyICs2MiwyMyBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgICAgIChDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfSkZGUzIpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJkZXZmcz1tb3VudCByb290PXJhbWZzIGNvbnNvbGU9dHR5UzAsOTYwMCIKQEAgLTc4LDcgKzg5LDcgQEAKIC8qI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJImltcGE3IgkqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RwO2Jvb3RtIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9lcDgyNDguaCBiL2luY2x1ZGUvY29uZmlncy9lcDgyNDguaAppbmRleCAwNDE0N2E1Li44NWFkNzBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvZXA4MjQ4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2VwODI0OC5oCkBAIC02MCw4ICs2MCw4IEBACiAgKiBTQ0MsIDEtMyBmb3IgRkNDKQogICoKICAqIElmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcwotICogbXVzdCBiZSBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdAotICogYmUgcmVtb3ZlZCBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIG11c3QgYmUgZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUCisgKiBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogRXRoZXJuZXQgaXMgbm90IG9uIFNDQyAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBFdGhlcm5ldCBpcyBvbiBGQ0MgICAgICovCkBAIC0xMjMsMjMgKzEyMywzNCBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMzg0MDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAgIFwKLQkJCQl8IENGR19DTURfREhDUCAgICBcCi0JCQkJfCBDRkdfQ01EX0VDSE8gICAgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgICAgIFwKLQkJCQl8IENGR19DTURfSU1NQVAgICBcCi0JCQkJfCBDRkdfQ01EX01JSSAgICAgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HICAgIFwKLQkJCQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcyAqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIEZGODYwMDAwIgkvKiBhdXRvYm9vdCBjb21tYW5kICovCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9tdGRibG9jazEgcncgbXRkcGFydHM9cGh5czo3TShyb290KSwtKHJvb3Qpcm8iCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjZGVmaW5lIENPTkZJR19LR0RCX09OX1NDQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU0NDICovCiAjdW5kZWYJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTE1Nyw3ICsxNjgsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0xODMsMjAgKzE5NCwyMCBAQAogCiAjZGVmaW5lCUNGR19ESVJFQ1RfRkxBU0hfVEZUUAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKQogI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSwkwCiAjZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MJQ0ZHX01BWF9GTEFTSF9CQU5LUwogI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfU0VDVE9SICAwCiAjZGVmaW5lIENGR19KRkZTMl9MQVNUX1NFQ1RPUiAgIDYyCiAjZGVmaW5lIENGR19KRkZTMl9TT1JUX0ZSQUdNRU5UUwogI2RlZmluZSBDRkdfSkZGU19DVVNUT01fUEFSVAotI2VuZGlmIC8qIENGR19DTURfSkZGUzIgKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JMkMpCiAjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJMQkvKiBUbyBlbmFibGUgSTJDIHN1cHBvcnQJKi8KICNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJMTAwMDAwCS8qIEkyQyBzcGVlZAkJCSovCiAjZGVmaW5lIENGR19JMkNfU0xBVkUJCTB4N0YJLyogSTJDIHNsYXZlIGFkZHJlc3MJCSovCi0jZW5kaWYgLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgogCiAjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJVEVYVF9CQVNFCiAjaWYgKENGR19NT05JVE9SX0JBU0UgPCBDRkdfRkxBU0hfQkFTRSkKQEAgLTI0MCw3ICsyNTEsNyBAQAogI2RlZmluZSBDRkdfQk9PVE1BUFNaCQkoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCAqLwogCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI2MCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZXA4MjYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvZXA4MjYwLmgKaW5kZXggNjg2MjUxOS4uMDI1YzI0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2VwODI2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9lcDgyNjAuaApAQCAtMTgzLDggKzE4Myw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYgIENPTkZJR19FVEhFUl9PTl9TQ0MgICAgICAgICAgIC8qIGRlZmluZSBpZiBldGhlcm5ldCBvbiBTQ0MgICAgKi8KICNkZWZpbmUgQ09ORklHX0VUSEVSX09OX0ZDQyAgICAgICAgICAgLyogZGVmaW5lIGlmIGV0aGVybmV0IG9uIEZDQyAgICAqLwpAQCAtMjkxLDM3ICsyOTAsNDkgQEAKICNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogCi0vKiBXaGF0IFUtQm9vdCBzdWJzeXRlbXMgZG8geW91IHdhbnQgZW5hYmxlZD8gKi8KKwogLyoKLSovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDRkdfQ01EX0FMTCAgICAgJiBcCi0JCQkJICB+KAlDRkdfQ01EX0JNUAl8IFwKLQkJCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJCUNGR19DTURfRENSCXwgXAotCQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJCUNGR19DTURfRElTUExBWQl8IFwKLQkJCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJCUNGR19DTURfRFRUCXwgXAotCQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkJQ0ZHX0NNRF9FWFQyCXwgXAotCQkJCQlDRkdfQ01EX0ZEQwl8IFwKLQkJCQkJQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCQlDRkdfQ01EX0hXRkxPVwl8IFwKLQkJCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJCUNGR19DTURfS0dEQgl8IFwKLQkJCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJCUNGR19DTURfTU1DCXwgXAotCQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJCUNGR19DTURfUENJCXwgXAotCQkJCQlDRkdfQ01EX1BDTUNJQQl8IFwKLQkJCQkJQ0ZHX0NNRF9SRUlTRVIJfCBcCi0JCQkJCUNGR19DTURfU0NTSQl8IFwKLQkJCQkJQ0ZHX0NNRF9TUEkJfCBcCi0JCQkJCUNGR19DTURfVU5JVkVSU0V8IFwKLQkJCQkJQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJCUNGR19DTURfVkZECXwgXAotCQkJCQlDRkdfQ01EX1hJTUcJKSApCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9hbGwuaD4KKworI3VuZGVmIENPTkZJR19DTURfQk1QCisjdW5kZWYgQ09ORklHX0NNRF9CU1AKKyN1bmRlZiBDT05GSUdfQ01EX0RDUgorI3VuZGVmIENPTkZJR19DTURfREhDUAorI3VuZGVmIENPTkZJR19DTURfRElTUExBWQorI3VuZGVmIENPTkZJR19DTURfRE9DCisjdW5kZWYgQ09ORklHX0NNRF9EVFQKKyN1bmRlZiBDT05GSUdfQ01EX0VFUFJPTQorI3VuZGVmIENPTkZJR19DTURfRVhUMgorI3VuZGVmIENPTkZJR19DTURfRkRDCisjdW5kZWYgQ09ORklHX0NNRF9GRE9TCisjdW5kZWYgQ09ORklHX0NNRF9IV0ZMT1cKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorI3VuZGVmIENPTkZJR19DTURfSkZGUzIKKyN1bmRlZiBDT05GSUdfQ01EX0tHREIKKyN1bmRlZiBDT05GSUdfQ01EX01JSQorI3VuZGVmIENPTkZJR19DTURfTUZTTAorI3VuZGVmIENPTkZJR19DTURfTU1DCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9QQ0kKKyN1bmRlZiBDT05GSUdfQ01EX1BDTUNJQQorI3VuZGVmIENPTkZJR19DTURfUkVJU0VSCisjdW5kZWYgQ09ORklHX0NNRF9TQ1NJCisjdW5kZWYgQ09ORklHX0NNRF9TUEkKKyN1bmRlZiBDT05GSUdfQ01EX1VOSVZFUlNFCisjdW5kZWYgQ09ORklHX0NNRF9VU0IKKyN1bmRlZiBDT05GSUdfQ01EX1ZGRAorI3VuZGVmIENPTkZJR19DTURfWElNRwogCiAKIC8qIFdoZXJlIGRvIHRoZSBpbnRlcm5hbCByZWdpc3RlcnMgbGl2ZT8gKi8KQEAgLTM0MiwxMyArMzUzLDEwIEBACiAKICNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfRiAxCSAgICAvKiBDYWxsIGJvYXJkX2Vhcmx5X2luaXRfZgkqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQlNJWkUgICAgICAgICAgICAgIDEwMjQgICAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICAgICAqLwogI2Vsc2UKICMgIGRlZmluZSBDRkdfQ0JTSVpFICAgICAgICAgICAgICAyNTYgICAgICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAgICAgKi8KQEAgLTQ5Niw3ICs1MDQsNyBAQAogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgICAgIDMyICAgICAgLyogRm9yIE1QQzgyNjAgQ1BVICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQgICAgIDUgICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2VwODJ4eG0uaCBiL2luY2x1ZGUvY29uZmlncy9lcDgyeHhtLmgKaW5kZXggYTc3Y2NlZi4uNGZlYmQzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2VwODJ4eG0uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvZXA4Mnh4bS5oCkBAIC02MCw4ICs2MCw4IEBACiAgKiBTQ0MsIDEtMyBmb3IgRkNDKQogICoKICAqIElmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcwotICogbXVzdCBiZSBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdAotICogYmUgcmVtb3ZlZCBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIG11c3QgYmUgZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUCisgKiBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogRXRoZXJuZXQgaXMgbm90IG9uIFNDQyAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBFdGhlcm5ldCBpcyBvbiBGQ0MgICAgICovCkBAIC0xMDgsMjIgKzEwOCwzNCBAQAogCiAjZGVmaW5lIENGR19WWFdPUktTX01BQ19QVFIgMHg0MzAwIC8qIFBhc3MgRXRoZXJuZXQgTUFDIHRvIFZ4V29ya3MgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAgIFwKLQkJCQl8IENGR19DTURfREhDUCAgICBcCi0JCQkJfCBDRkdfQ01EX0VDSE8gICAgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgICAgIFwKLQkJCQl8IENGR19DTURfSU1NQVAgICBcCi0JCQkJfCBDRkdfQ01EX01JSSAgICAgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HICAgIFwKLQkJCQl8IENGR19DTURfREFURSAgICBcCi0JCQkJfCBDRkdfQ01EX0RUVAkgIFwKLQkJCQl8IENGR19DTURfRUVQUk9NICBcCi0JCQkJfCBDRkdfQ01EX1BDSQkgIFwKLQkJCQl8IENGR19DTURfRElBRwkgIFwKLQkJCQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RUVAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKwogCiAjZGVmaW5lIENPTkZJR19FVEhBRERSCQkwMDoxMDpFQzowMDo4ODo2NQogI2RlZmluZSBDT05GSUdfSEFTX0VUSDEKQEAgLTEzOCw3ICsxNTAsNyBAQAogI2RlZmluZSBDT05GSUdfQVVUT19DT01QTEVURQkxCiAjZGVmaW5lCUNPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MJImV0aHByaW1lPUZDQzMgRVRIRVJORVQiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjZGVmaW5lIENPTkZJR19LR0RCX09OX1NDQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU0NDICovCiAjdW5kZWYJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTE1Niw3ICsxNjgsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSJlcDgyeHhtPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMzA4LDIwICszMjAsMjAgQEAKIAogI2RlZmluZQlDRkdfRElSRUNUX0ZMQVNIX1RGVFAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikKICNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksJMAogI2RlZmluZSBDRkdfSkZGUzJfTlVNX0JBTktTCUNGR19NQVhfRkxBU0hfQkFOS1MKICNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX1NFQ1RPUiAgMAogI2RlZmluZSBDRkdfSkZGUzJfTEFTVF9TRUNUT1IgICA2MgogI2RlZmluZSBDRkdfSkZGUzJfU09SVF9GUkFHTUVOVFMKICNkZWZpbmUgQ0ZHX0pGRlNfQ1VTVE9NX1BBUlQKLSNlbmRpZiAvKiBDRkdfQ01EX0pGRlMyICovCisjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogI2RlZmluZSBDT05GSUdfSEFSRF9JMkMJCTEJLyogVG8gZW5hYmxlIEkyQyBzdXBwb3J0CSovCiAjZGVmaW5lIENGR19JMkNfU1BFRUQJCTEwMDAwMAkvKiBJMkMgc3BlZWQJCQkqLwogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCS8qIEkyQyBzbGF2ZSBhZGRyZXNzCQkqLwotI2VuZGlmIC8qIENGR19DTURfSTJDICovCisjZW5kaWYKIAogI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVRFWFRfQkFTRQogI2lmIChDRkdfTU9OSVRPUl9CQVNFIDwgQ0ZHX0ZMQVNIX0JBU0UpCkBAIC0zNTgsNyArMzcwLDcgQEAKICNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkJKDggPDwgMjApCS8qIEluaXRpYWwgTWVtb3J5IG1hcCBmb3IgTGludXggKi8KIAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ldmI0NTEwLmggYi9pbmNsdWRlL2NvbmZpZ3MvZXZiNDUxMC5oCmluZGV4IDg4YzJjNzQuLjY2NTAwYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ldmI0NTEwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2V2YjQ1MTAuaApAQCAtNzIsMTIgKzcyLDIzIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxOTIwMAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUElORykKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI2RlZmluZSBDT05GSUdfRVRIQUREUgkJMDA6NDA6OTU6MzY6MzU6MzMKICNkZWZpbmUgQ09ORklHX05FVE1BU0sJCTI1NS4yNTUuMjU1LjAKQEAgLTg5LDcgKzEwMCw3IEBACiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkidGZ0cCAxMDAwMDAgdUltYWdlIgogLyogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJjb25zb2xlPXR0eVMwLDE5MjAwIGluaXRyZD0weDEwMGEwMDQwLDUzMEsgcm9vdD0vZGV2L3JhbSBrZWVwaW5pdHJkIiAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTkyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2djcGx1cy5oIGIvaW5jbHVkZS9jb25maWdzL2djcGx1cy5oCmluZGV4IGI2OGEyZGMuLmUxMWNlNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9nY3BsdXMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvZ2NwbHVzLmgKQEAgLTc5LDE4ICs3OSwzMCBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMzg0MDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfREhDUCkKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJQ09ORklHX0JPT1RQX0RFRkFVTFQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkiY29uc29sZT10dHlTQTAsMzg0MDBuOCBtdGRwYXJ0cz1zYTExMDAtZmxhc2g6MW1AMCh6SW1hZ2UpLDNtQDFtKHJhbWRpc2suZ3opLDEybUA0bSh1c2VyZnMpIHJvb3Q9L2Rldi9uZnMgaXA9Ym9vdHAiCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdHA7dGZ0cDtib290bSIKICNkZWZpbmUgQ0ZHX0FVVE9MT0FEICAgICAgICAgICAgIm4iICAgICAgICAgICAgIC8qIE5vIGF1dG9sb2FkICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkzODQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZ3RoMi5oIGIvaW5jbHVkZS9jb25maWdzL2d0aDIuaAppbmRleCBhNDllZDNiLi5jMmE1MGMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvZ3RoMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ndGgyLmgKQEAgLTcxLDEyICs3MSwzNyBAQAogLyogQm9vdCBmcm9tIENvbXBhY3QgZmxhc2ggcGFydGl0aW9uIDIgYXMgZGVmYXVsdCAqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImlkZSByZXNldDtkaXNrIDB4ODEwMDAwMDAgMDoyO3J1biBhZGRtaXNjO2Jvb3RtIgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9JREUgfCBDRkdfQ01EX0RIQ1AgKSAmIFwKLSB+KENGR19DTURfRU5WIHwgQ0ZHX0NNRF9GQVQgfCBDRkdfQ01EX0ZMQVNIIHwgQ0ZHX0NNRF9GUEdBIHwgXAotICAgQ0ZHX0NNRF9NSUkgfCBDRkdfQ01EX0xPQURTCXwgQ0ZHX0NNRF9MT0FEQiB8IENGR19DTURfRUxGIHwgXAotICAgQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX0JFREJVRyB8IENGR19DTURfTkZTIHwgQ0ZHX0NNRF9BVVRPU0NSSVBUICkpCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKyN1bmRlZiBDT05GSUdfQ01EX0VOVgorI3VuZGVmIENPTkZJR19DTURfRkFUCisjdW5kZWYgQ09ORklHX0NNRF9GTEFTSAorI3VuZGVmIENPTkZJR19DTURfRlBHQQorI3VuZGVmIENPTkZJR19DTURfTUlJCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI3VuZGVmIENPTkZJR19DTURfTE9BREIKKyN1bmRlZiBDT05GSUdfQ01EX0VMRgorI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9CRURCVUcKKyN1bmRlZiBDT05GSUdfQ01EX05GUworI3VuZGVmIENPTkZJR19DTURfQVVUT1NDUklQVAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZ3c4MjYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvZ3c4MjYwLmgKaW5kZXggNGY4M2IxOS4uZmY1NzI0MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2d3ODI2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ndzgyNjAuaApAQCAtMTk0LDggKzE5NCw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAKICN1bmRlZiAgQ09ORklHX0VUSEVSX09OX1NDQwpAQCAtMjg2LDEzICsyODUsMTYgQEAKICN1bmRlZiAgQ09ORklHX0FVVE9CT09UX0RFTEFZX1NUUgogI2RlZmluZSBERUJVR19CT09US0VZUyAgICAgIDAKIAotLyogQWRkIHN1cHBvcnQgZm9yIGEgZmV3IGV4dHJhIGJvb3RwIG9wdGlvbnMgbGlrZToKLSAqICAtIEZpbGUgc2l6ZQotICogIC0gRE5TCisvKgorICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJICAgICBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFIHwgXAotCQkJICAgICBDT05GSUdfQk9PVFBfRE5TKQorI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCiAKIC8qIHVuZGVmIHRoaXMgdG8gc2F2ZSBtZW1vcnkgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCkBAIC0zMDAsMTQgKzMwMiwyMSBAQAogLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogI2RlZmluZSBDRkdfUFJPTVBUICAgICAgIj0+ICIKIAotLyogV2hhdCBVLUJvb3Qgc3Vic3l0ZW1zIGRvIHlvdSB3YW50IGVuYWJsZWQ/ICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgKCgoQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfS0dEQikpKSB8IFwKLQkJCSAgICAgICBDRkdfQ01EX0JFREJVRyAgfCBcCi0JCQkgICAgICAgQ0ZHX0NNRF9FTEYgfCBcCi0JCQkgICAgICAgQ0ZHX0NNRF9BU0tFTlYgIHwgXAotCQkJICAgICAgIENGR19DTURfUkVHSU5GTyB8IFwKLQkJCSAgICAgICBDRkdfQ01EX0lNTUFQICAgfCBcCi0JCQkgICAgICAgQ0ZHX0NNRF9NSUkpCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisKKyN1bmRlZiBDT05GSUdfQ01EX0tHREIKKwogCiAvKiBXaGVyZSBkbyB0aGUgaW50ZXJuYWwgcmVnaXN0ZXJzIGxpdmU/ICovCiAjZGVmaW5lIENGR19JTU1SICAgICAgICAweGYwMDAwMDAwCkBAIC0zMzEsMTMgKzM0MCwxMCBAQAogI2RlZmluZSBDT05GSUdfR1c4MjYwICAgICAgIDEgICAvKiBvbiBhbiBHVzgyNjAgQm9hcmQgICovCiAjZGVmaW5lIENPTkZJR19DUE0yCQkxCS8qIEhhcyBhIENQTTIgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0JTSVpFICAgICAgICAxMDI0ICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAgICAgICovCiAjZWxzZQogIyAgZGVmaW5lIENGR19DQlNJWkUgICAgICAgIDI1NiAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICAgICAgKi8KQEAgLTQ3Myw3ICs0NzksNyBAQAogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgMzIgICAgICAvKiBGb3IgTVBDODI2MCBDUFUgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUICAgIDUgICAvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9oY3U0LmggYi9pbmNsdWRlL2NvbmZpZ3MvaGN1NC5oCmluZGV4IDllNDVlOTAuLjU3N2Y0NTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9oY3U0LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2hjdTQuaApAQCAtMjA2LDI3ICsyMDYsMzYgQEAKIAogI2RlZmluZSBDT05GSUdfSEFTX0VUSDAKICNkZWZpbmUgQ0ZHX1JYX0VUSF9CVUZGRVIJMTYJLyogTnVtYmVyIG9mIGV0aGVybmV0IHJ4IGJ1ZmZlcnMgJiBkZXNjcmlwdG9ycyAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTCAgfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfAlcCi0JCQkJQ0ZHX0NNRF9CU1AgICAgIHwgXAotCQkJCUNGR19DTURfQ0FDSEUgICB8IFwKLQkJCQlDRkdfQ01EX0RIQ1AgICAgfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHICAgIHwgXAotCQkJCUNGR19DTURfRUVQUk9NICB8IFwKLQkJCQlDRkdfQ01EX0VMRiAgICAgfCBcCi0JCQkJQ0ZHX0NNRF9GTEFTSCAgIHwgXAotCQkJCUNGR19DTURfSTJDICAgICB8IFwKLQkJCQlDRkdfQ01EX0lNTUFQICAgfCBcCi0JCQkJQ0ZHX0NNRF9JUlEgICAgIHwgXAotCQkJCUNGR19DTURfTUlJICAgICB8IFwKLQkJCQlDRkdfQ01EX05FVCAgICAgfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HICAgIHwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NEUkFNICAgIFwKLQkJCQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCiAKIC8qIFNQRCBFRVBST00gKHNkcmFtIHNwZWVkIGNvbmZpZykgZGlzYWJsZWQgKi8KICNkZWZpbmUgQ09ORklHX1NQRF9FRVBST00gICAgICAgICAgMQpAQCAtMjM3LDcgKzI0Niw3IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogCSNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMTcsOSArMzI2LDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIElCTSA0MDVHUHIgQ1BVcwkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJICAgICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KLSNlbmRpZgogCiAvKgogICogSW50ZXJuYWwgRGVmaW5pdGlvbnMKQEAgLTMzNCw3ICszNDEsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCSAgICAvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2hjdTUuaCBiL2luY2x1ZGUvY29uZmlncy9oY3U1LmgKaW5kZXggZmE2Y2EzNy4uZDBiZjI1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2hjdTUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvaGN1NS5oCkBAIC0yMjksNDQgKzIyOSw1MSBAQAogLyogQ29tbWVudCB0aGlzIG91dCB0byBlbmFibGUgVVNCIDEuMSBkZXZpY2UgKi8KICNkZWZpbmUgVVNCXzJfMF9ERVZJQ0UKIAotI2RlZmluZSBDTURfVVNCCQkJQ0ZHX0NNRF9VU0IKLQogLyogUGFydGl0aW9ucyAqLwogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfSVNPX1BBUlRJVElPTgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAoQ09ORklHX0NNRF9ERkwJfAlcCi0JCQlDRkdfQ01EX0FTS0VOVgl8CVwKLQkJCUNGR19DTURfQlNQICAgICB8CVwKLQkJCUNGR19DTURfREhDUAl8CVwKLQkJCUNGR19DTURfRElBRwl8CVwKLQkJCUNGR19DTURfRUVQUk9NCXwJXAotCQkJQ0ZHX0NNRF9FTEYJfAlcCi0JCQlDRkdfQ01EX0ZBVAl8CVwKLQkJCUNGR19DTURfSTJDCXwJXAotCQkJQ0ZHX0NNRF9JTU1BUCAgIHwJXAotCQkJQ0ZHX0NNRF9JUlEJfAlcCi0JCQlDRkdfQ01EX01JSQl8CVwKLQkJCUNGR19DTURfTkVUCXwJXAotCQkJQ0ZHX0NNRF9ORlMJfAlcCi0JCQlDRkdfQ01EX1BDSQl8CVwKLQkJCUNGR19DTURfUElORwl8CVwKLQkJCUNGR19DTURfUkVHSU5GTwl8CVwKLQkJCUNGR19DTURfU0RSQU0JfAlcCi0JCQlDTURfVVNCKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfVVNCCiAKICNkZWZpbmUgQ09ORklHX1NVUFBPUlRfVkZBVAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSAgICAgICAgIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zNjQsOSArMzcxLDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJKDMyPDwxMCkgIC8qIEZvciBBTUNDIDQ0MCBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCSAgICAgIC8qIC4uLgkJCSAgICAgICAgICAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CSAgICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCi0jZW5kaWYKIAogLyoKICAqIEludGVybmFsIERlZmluaXRpb25zCkBAIC0zODEsNyArMzg2LDcgQEAKIAkjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIgICAgICI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCSAgICAvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2hlcm1lcy5oIGIvaW5jbHVkZS9jb25maWdzL2hlcm1lcy5oCmluZGV4IDkxMTE3YmEuLmUzYTJlZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9oZXJtZXMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvaGVybWVzLmgKQEAgLTY0LDIzICs2NCwyOCBAQAogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlDT05GSUdfQ01EX0RGTAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCUNPTkZJR19CT09UUF9ERUZBVUxUCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE1Nyw3ICsxNjIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvaG1pMTAwMS5oIGIvaW5jbHVkZS9jb25maWdzL2htaTEwMDEuaAppbmRleCA0ZDgxM2Q4Li42YzE1YjRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvaG1pMTAwMS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9obWkxMDAxLmgKQEAgLTM4LDExICszOCw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwotI2VuZGlmCi0KICNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfUgogCiAvKgpAQCAtNTUsMjIgKzUwLDMxIEBACiAvKiBQYXJ0aXRpb25zICovCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESVNQTEFZCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RJU1BMQVkKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkxCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIApAQCAtMjIyLDcgKzIyNiw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0yMzEsNiArMjM1LDExIEBACiAjZGVmaW5lIENGR19NQVhBUkdTCQkxNgkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncwkqLwogI2RlZmluZSBDRkdfQkFSR1NJWkUJCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzCQkJKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KKyNlbmRpZgorCiAvKiBFbmFibGUgYW4gYWx0ZXJuYXRlLCBtb3JlIGV4dGVuc2l2ZSBtZW1vcnkgdGVzdCAqLwogI2RlZmluZSBDRkdfQUxUX01FTVRFU1QKIApAQCAtMjQyLDggKzI1MSw3IEBACiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCiAvKgotICogRW5hYmxlIGxvb3B3IGNvbW1hbmRvLiBUaGlzIGhhcyBvbmx5IGFmZmVjdCwgaWYgQ0ZHX0NNRF9NRU0gaXMgZGVmaW5lZCwKLSAqIHdoaWNoIGlzIG5vcm1hbGx5IHBhcnQgb2YgdGhlIGRlZmF1bHQgY29tbWFuZHMgKENGVl9DTURfREZMKQorICogRW5hYmxlIGxvb3B3IGNvbW1hbmQuCiAgKi8KICNkZWZpbmUgQ09ORklHX0xPT1BXCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9oeW1vZC5oIGIvaW5jbHVkZS9jb25maWdzL2h5bW9kLmgKaW5kZXggOGNhZDk4ZC4uMmY2NGVjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2h5bW9kLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2h5bW9kLmgKQEAgLTY5LDggKzY5LDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCQkvKiBkZWZpbmUgaWYgZXRoZXIgb24gU0NDCSovCiAjZGVmaW5lCUNPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MJKi8KQEAgLTE3NCwzMiArMTczLDQ0IEBACiAKICNkZWZpbmUgQ09ORklHX0xBU1RfU1RBR0VfSU5JVAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQUxMICYgfiggXAotCQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQkJQ0ZHX0NNRF9CTVAJfCBcCi0JCQkJCUNGR19DTURfRElTUExBWQl8IFwKLQkJCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJCUNGR19DTURfRVhUMgl8IFwKLQkJCQkJQ0ZHX0NNRF9GREMJfCBcCi0JCQkJCUNGR19DTURfRkRPUwl8IFwKLQkJCQkJQ0ZHX0NNRF9GUEdBICAgIHwgXAotCQkJCQlDRkdfQ01EX0hXRkxPVwl8IFwKLQkJCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQkJQ0ZHX0NNRF9NTUMJfCBcCi0JCQkJCUNGR19DTURfUENNQ0lBCXwgXAotCQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQkJQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJCUNGR19DTURfUkVJU0VSCXwgXAotCQkJCQlDRkdfQ01EX1NDU0kJfCBcCi0JCQkJCUNGR19DTURfU1BJCXwgXAotCQkJCQlDRkdfQ01EX1VOSVZFUlNFfCBcCi0JCQkJCUNGR19DTURfVkZECXwgXAotCQkJCQlDRkdfQ01EX1hJTUcJKSApCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfYWxsLmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX0JFREJVRworI3VuZGVmIENPTkZJR19DTURfQk1QCisjdW5kZWYgQ09ORklHX0NNRF9ESVNQTEFZCisjdW5kZWYgQ09ORklHX0NNRF9ET0MKKyN1bmRlZiBDT05GSUdfQ01EX0VYVDIKKyN1bmRlZiBDT05GSUdfQ01EX0ZEQworI3VuZGVmIENPTkZJR19DTURfRkRPUworI3VuZGVmIENPTkZJR19DTURfRlBHQQorI3VuZGVmIENPTkZJR19DTURfSFdGTE9XCisjdW5kZWYgQ09ORklHX0NNRF9JREUKKyN1bmRlZiBDT05GSUdfQ01EX0pGRlMyCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9NRlNMCisjdW5kZWYgQ09ORklHX0NNRF9NTUMKKyN1bmRlZiBDT05GSUdfQ01EX1BDTUNJQQorI3VuZGVmIENPTkZJR19DTURfUENJCisjdW5kZWYgQ09ORklHX0NNRF9VU0IKKyN1bmRlZiBDT05GSUdfQ01EX1JFSVNFUgorI3VuZGVmIENPTkZJR19DTURfU0NTSQorI3VuZGVmIENPTkZJR19DTURfU1BJCisjdW5kZWYgQ09ORklHX0NNRF9VTklWRVJTRQorI3VuZGVmIENPTkZJR19DTURfVkZECisjdW5kZWYgQ09ORklHX0NNRF9YSU1HCisKIAogI2lmZGVmIERFQlVHCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJLTEJLyogYXV0b2Jvb3QgZGlzYWJsZWQJCSovCkBAIC0yMTgsNyArMjI5LDcgQEAKICNkZWZpbmUgREVCVUdfQk9PVEtFWVMJCTAKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICN1bmRlZglDT05GSUdfS0dEQl9PTl9TTUMJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNNQyAqLwogI2RlZmluZQlDT05GSUdfS0dEQl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNDQyAqLwogI3VuZGVmCUNPTkZJR19LR0RCX05PTkUJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0yNDcsNyArMjU4LDcgQEAKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtNDAwLDcgKzQxMSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjYwIENQVQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9pZG1yLmggYi9pbmNsdWRlL2NvbmZpZ3MvaWRtci5oCmluZGV4IGIxZGJlMmMuLjFhYjdiMjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9pZG1yLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2lkbXIuaApAQCAtNzgsMTggKzc4LDI3IEBACiAJInUtYm9vdD0vdGZ0cGJvb3QvaWRtci91LWJvb3QuYmluXDAiCQkJCVwKIAkiIgogCi0vKgotICogQ29tbWFuZHMnIGRlZmluaXRpb24KLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSgoQ09ORklHX0NNRF9ERkwJCXwgXAotCQkJCQlDRkdfQ01EX1BJTkcJCXwgXAotCQkJCQlDRkdfQ01EX0pGRlMyCQl8IFwKLQkJCQkJQ0ZHX0NNRF9ORVQpCQkmIFwKLQkJCQkJfihDRkdfQ01EX0xPQURTCQl8IFwKLQkJCQkJCUNGR19DTURfTE9BREIpKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEQgogCiAKIC8qCkBAIC0xMTUsMTEgKzEyNCwxMSBAQAogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCi0jZWxzZSAvKiAhKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikgKi8KKyNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKSAqLworI2VuZGlmCiAKICNkZWZpbmUgQ0ZHX1BCU0laRSAoQ0ZHX0NCU0laRStzaXplb2YoQ0ZHX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCiAjZGVmaW5lIENGR19NQVhBUkdTCQkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MgKi8KQEAgLTIwNiw4ICsyMTUsOCBAQAogCQkJCQkJIjJtKHJvb3RmcyksIglcCiAJCQkJCQkiLSh1c2VyKSI7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKICNlcnJvciBNSUkgY29tbWFuZHMgZG9uJ3Qgd29yayBvbiBpRE1SIGJvYXJkIGFuZCBzaG9sdWQgbm90IGJlIGVuYWJsZWQuCi0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSAqLworI2VuZGlmCiAKICNlbmRpZiAvKiBfSURNUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvaW1wYTcuaCBiL2luY2x1ZGUvY29uZmlncy9pbXBhNy5oCmluZGV4IDhiODQxZmYuLjBlNTJmZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9pbXBhNy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9pbXBhNy5oCkBAIC02MSwxMiArNjEsMjMgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSyAgICAgICAoQ09ORklHX0JPT1RQX0RFRkFVTFR8Q09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0pGRlMyKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgIAkiZGV2ZnM9bW91bnQgcm9vdD1yYW1mcyBjb25zb2xlPXR0eVMwLDk2MDAiCkBAIC03Nyw3ICs4OCw3IEBACiAvKiNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCSJpbXBhNyIJKi8KICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290cDtib290bSIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvaW5jYWlwLmggYi9pbmNsdWRlL2NvbmZpZ3MvaW5jYWlwLmgKaW5kZXggMWM2MjE2Yi4uNGNhZjU0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2luY2FpcC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9pbmNhaXAuaApAQCAtODEsMTUgKzgxLDI5IEBACiAJIiIKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJydW4gZmxhc2hfc2VsZiIKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9pbmthNHgwLmggYi9pbmNsdWRlL2NvbmZpZ3MvaW5rYTR4MC5oCmluZGV4IGFkM2NmMDYuLjBmYWMyOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9pbmthNHgwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2lua2E0eDAuaApAQCAtNDAsMTEgKzQwLDYgQEAKIAogI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX0YJMQkvKiBVc2UgbWlzY19pbml0X2YoKQkJCSovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtNzYsMjEgKzcxLDMwIEBACiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19JU09fUEFSVElUSU9OCiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FWFQyCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfU05UUAl8IFwKLQkJCQlDRkdfQ01EX1VTQgkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKwogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJMQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKQEAgLTIzOSw3ICsyNDMsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMjQ4LDYgKzI1MiwxMSBAQAogI2RlZmluZSBDRkdfTUFYQVJHUwkJMTYJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MJKi8KICNkZWZpbmUgQ0ZHX0JBUkdTSVpFCQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcwkJCSovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCisjZW5kaWYKKwogLyogRW5hYmxlIGFuIGFsdGVybmF0ZSwgbW9yZSBleHRlbnNpdmUgbWVtb3J5IHRlc3QgKi8KICNkZWZpbmUgQ0ZHX0FMVF9NRU1URVNUCiAKQEAgLTI1OSw4ICsyNjgsNyBAQAogI2RlZmluZSBDRkdfSFoJCQkxMDAwCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAogLyoKLSAqIEVuYWJsZSBsb29wdyBjb21tYW5kby4gVGhpcyBoYXMgb25seSBhZmZlY3QsIGlmIENGR19DTURfTUVNIGlzIGRlZmluZWQsCi0gKiB3aGljaCBpcyBub3JtYWxseSBwYXJ0IG9mIHRoZSBkZWZhdWx0IGNvbW1hbmRzIChDRlZfQ01EX0RGTCkKKyAqIEVuYWJsZSBsb29wdyBjb21tYW5kLgogICovCiAjZGVmaW5lIENPTkZJR19MT09QVwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvaW5ub2tvbS5oIGIvaW5jbHVkZS9jb25maWdzL2lubm9rb20uaAppbmRleCAzY2I5ZWJjLi41MzEwZTBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvaW5ub2tvbS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9pbm5va29tLmgKQEAgLTU0LDEwICs1NCwzNCBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTE5MjAwCiAjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgkxCS8qIHdlIGhhdmUgYSBtaXNjX2luaXRfcigpIGZ1bmN0aW9uICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIChDRkdfQ01EX0JESXxDRkdfQ01EX0xPQURCfENGR19DTURfSU1JfENGR19DTURfRkxBU0h8Q0ZHX0NNRF9NRU1PUll8Q0ZHX0NNRF9ORVR8Q0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9SVU58Q0ZHX0NNRF9BU0tFTlZ8Q0ZHX0NNRF9FQ0hPfENGR19DTURfSTJDfENGR19DTURfREhDUHxDRkdfQ01EX0NBQ0hFKQotLyogQ09ORklHX0NNRF9ERkx8Q0ZHX0NNRF9JMkN8Q0ZHX0NNRF9FRVBST018Q0ZHX0NNRF9ORVR8Q0ZHX0NNRF9KRkZTMnxDRkdfQ01EX0RIQ1ApICovCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICAgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VDSE8KKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKIC8qICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCSJyb290PS9kZXYvbmZzIGlwPWJvb3RwIGNvbnNvbGU9dHR5UzAsMTkyMDAiICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvaW50ZWdyYXRvcmFwLmggYi9pbmNsdWRlL2NvbmZpZ3MvaW50ZWdyYXRvcmFwLmgKaW5kZXggMmY2ZTM5OS4uMTQ1MmJmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2ludGVncmF0b3JhcC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9pbnRlZ3JhdG9yYXAuaApAQCAtNjYsMTUgKzY2LDI2IEBACiAjZGVmaW5lIENGR19TRVJJQUwwCQkweDE2MDAwMDAwCiAjZGVmaW5lIENGR19TRVJJQUwxCQkweDE3MDAwMDAwCiAKLS8qI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKENGR19DTURfREhDUCB8IENGR19DTURfSU1JIHwgQ0ZHX0NNRF9ORVQgfCBDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0JESSB8IENGR19DTURfUENJKSAqLwogLyojZGVmaW5lIENPTkZJR19ORVRfTVVMVEkgKi8KLS8qI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkgIENPTkZJR19CT09UUF9ERUZBVUxUICovCi0KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIChDRkdfQ01EX0lNSSB8IENGR19DTURfQkRJIHwgQ0ZHX0NNRF9NRU1PUlkpCiAKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKworI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkyCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9tdGRibG9jazAgbWVtPTMyTSBjb25zb2xlPXR0eUFNMCBjb25zb2xlPXR0eSIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9pbnRlZ3JhdG9yY3AuaCBiL2luY2x1ZGUvY29uZmlncy9pbnRlZ3JhdG9yY3AuaAppbmRleCA0MTg5ZjljLi42OTMxMGQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvaW50ZWdyYXRvcmNwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2ludGVncmF0b3JjcC5oCkBAIC03MCwxNyArNzAsMjggQEAKICNkZWZpbmUgQ0ZHX1NFUklBTDAJCTB4MTYwMDAwMDAKICNkZWZpbmUgQ0ZHX1NFUklBTDEJCTB4MTcwMDAwMDAKIAorCiAvKgotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0RGTCB8IENGR19DTURfUENJKQotKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9ESENQIHwgQ0ZHX0NNRF9JTUkgfCBDRkdfQ01EX05FVCB8IENGR19DTURfUElORyB8IFwKLQkJCQkgQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX01FTU9SWSB8IENGR19DTURfRkxBU0ggfCBDRkdfQ01EX0VOViBcCi0JCQkJKQorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiAjZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCUNPTkZJR19CT09UUF9ERUZBVUxUICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAjaWYgMAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9peGRwNDI1LmggYi9pbmNsdWRlL2NvbmZpZ3MvaXhkcDQyNS5oCmluZGV4IDlmOWZkYjIuLmJjNWY5ZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9peGRwNDI1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2l4ZHA0MjUuaApAQCAtNTMsMTQgKzUzLDI4IEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICAgKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX1BDSSkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorCiAKICNkZWZpbmUgQ09ORklHX1BDSQogI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCiAjZGVmaW5lIENPTkZJR19FRVBSTzEwMAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotLyogVGhlc2UgYXJlIHUtYm9vdCBnZW5lcmljIHBhcmFtZXRlcnMgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZICAgICAgICAzCiAvKiNkZWZpbmUgQ09ORklHX0VUSEFERFIgICAgICAgICAgMDg6MDA6M2U6MjY6MGE6NWIqLwpAQCAtNzEsNyArODUsNyBAQAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgICAgICAicm9vdD0vZGV2L210ZGJsb2NrMiByb290ZnN0eXBlPWNyYW1mcyBjb25zb2xlPXR0eVMwLDExNTIwMCIKICNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURSAgICAyMzA0MDAgICAgICAgICAgLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYICAgMiAgICAgICAgICAgICAgIC8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvaXhkcGc0MjUuaCBiL2luY2x1ZGUvY29uZmlncy9peGRwZzQyNS5oCmluZGV4IGFmNGVjZjYuLmRhNTkyMzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9peGRwZzQyNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9peGRwZzQyNS5oCkBAIC03NSwxNiArNzUsMjcgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgMTE1MjAwCiAjZGVmaW5lIENGR19JWFA0MjVfQ09OU09MRQlJWFA0MjVfVUFSVDEgICAvKiB3ZSB1c2UgVUFSVDEgZm9yIGNvbnNvbGUgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HKQogCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0vKiBUaGVzZSBhcmUgdS1ib290IGdlbmVyaWMgcGFyYW1ldGVycyAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI2RlZmluZSBDT05GSUdfWkVST19CT09UREVMQVlfQ0hFQ0sJLyogY2hlY2sgZm9yIGtleXByZXNzIG9uIGJvb3RkZWxheT09MCAqLwogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvanVwaXRlci5oIGIvaW5jbHVkZS9jb25maWdzL2p1cGl0ZXIuaAppbmRleCA1Yjk3NTI2Li5iNjhjNWFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvanVwaXRlci5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9qdXBpdGVyLmgKQEAgLTQxLDExICs0MSw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtNzEsNyArNjYsNiBAQAogI2RlZmluZSBDT05GSUdfUENJX0lPX0JVUwkweDUwMDAwMDAwCiAjZGVmaW5lIENPTkZJR19QQ0lfSU9fUEhZUwlDT05GSUdfUENJX0lPX0JVUwogI2RlZmluZSBDT05GSUdfUENJX0lPX1NJWkUJMHgwMTAwMDAwMAotI2RlZmluZSBBRERfUENJX0NNRCAJCUNGR19DTURfUENJCiAjZW5kaWYKIAogI2RlZmluZSBDRkdfWExCX1BJUEVMSU5JTkcJMQpAQCAtODcsMTUgKzgxLDI4IEBACiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorI2RlZmluZSBDT0RGSUdfQ01EX1BDSQorI2VuZGlmCisKIAogLyoKICAqIEF1dG9ib290aW5nCkBAIC0yNTQsNyArMjYxLDcgQEAKICNpZmRlZglDRkdfSFVTSF9QQVJTRVIKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMjcxLDYgKzI3OCwxMSBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKICAqIFZhcmlvdXMgbG93LWxldmVsIHNldHRpbmdzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9rYXRtYWkuaCBiL2luY2x1ZGUvY29uZmlncy9rYXRtYWkuaAppbmRleCBhN2VkYTA3Li4xMTBhZDQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mva2F0bWFpLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2thdG1haS5oCkBAIC0yMTAsMjggKzIxMCw0MCBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElBRwl8IFwKLQkJCQlDRkdfQ01EX0RUVAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRFRUCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKwogCiAjZGVmaW5lCUNPTkZJR19JQk1fRU1BQzRfVjQJMQkvKiA0NDBTUGUgaGFzIHRoaXMgRU1BQyB2ZXJzaW9uCSovCiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50CQkqLwpAQCAtMjU0LDcgKzI2Niw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC00MjAsNyArNDMyLDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJLyogRm9yIEFNQ0MgNDA1IENQVXMJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC00MzIsNyArNDQ0LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mva2I5MjAyLmggYi9pbmNsdWRlL2NvbmZpZ3Mva2I5MjAyLmgKaW5kZXggNjU5MGY2Zi4uNzVkOWMzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2tiOTIwMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9rYjkyMDIuaApAQCAtNzgsMTcgKzc4LDI5IEBACiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQkxCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlcCi0JCSAgICAgICAoKENPTkZJR19DTURfREZMIHwgXAotCQkgICAgICAgIENGR19DTURfSTJDIHwgXAotCQkJQ0ZHX0NNRF9QSU5HIHwgXAotCQkJQ0ZHX0NNRF9ESENQICkgJiBcCi0JCSAgICAgIH4oQ0ZHX0NNRF9CREkgfCBcCi0JCQlDRkdfQ01EX0ZQR0EgfCBcCi0JCQlDRkdfQ01EX01JU0MpKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKworI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9GUEdBCisjdW5kZWYgQ09ORklHX0NNRF9NSVNDCisKIAogI2RlZmluZSBDT05GSUdfTlJfRFJBTV9CQU5LUyAxCiAjZGVmaW5lIFBIWVNfU0RSQU0gMHgyMDAwMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2t2bWUwODAuaCBiL2luY2x1ZGUvY29uZmlncy9rdm1lMDgwLmgKaW5kZXggNjFjZjcwNS4uNTY5ODAwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2t2bWUwODAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mva3ZtZTA4MC5oCkBAIC02MCwzMyArNjAsNDUgQEAKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZSBDT05GSUdfUlRDX0RTMTY0eAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkgIENGR19DTURfQVNLRU5WCXwgXAotCQkJCSAgQ0ZHX0NNRF9DQUNIRQkJfCBcCi0JCQkJICBDRkdfQ01EX0RBVEUJCXwgXAotCQkJCSAgQ0ZHX0NNRF9ESENQCQl8IFwKLQkJCQkgIENGR19DTURfRElBRwkJfCBcCi0JCQkJICBDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkgIENGR19DTURfRUxGCQl8IFwKLQkJCQkgIENGR19DTURfSTJDCQl8IFwKLQkJCQkgIENGR19DTURfSkZGUzIJCXwgXAotCQkJCSAgQ0ZHX0NNRF9ORlMJCXwgXAotCQkJCSAgQ0ZHX0NNRF9QQ0kJCXwgXAotCQkJCSAgQ0ZHX0NNRF9QSU5HCQl8IFwKLQkJCQkgIENGR19DTURfU0RSQU0JCXwgXAotCQkJCSAgQ0ZHX0NNRF9TTlRQKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogI2RlZmluZSBDT05GSUdfTkVUQ09OU09MRQogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgpAQCAtMTc4LDcgKzE5MCw3IEBACiAjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEJMzMzMzMzMzMKIAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbGFydC5oIGIvaW5jbHVkZS9jb25maWdzL2xhcnQuaAppbmRleCBhMDA2NDBiLi44ZjE4YzlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbGFydC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9sYXJ0LmgKQEAgLTU5LDEwICs1OSwyMSBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAJInJvb3Q9cmFtZnMgZGV2ZnM9bW91bnQgY29uc29sZT10dHlTQTAsOTYwMCIKQEAgLTczLDcgKzg0LDcgQEAKICNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQkiZWxpbm9zLWxhcnQiCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkidGZ0cDsgYm9vdG0iCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2xvZ29kbC5oIGIvaW5jbHVkZS9jb25maWdzL2xvZ29kbC5oCmluZGV4IDcxNWVkNzQuLjJiMmQzNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9sb2dvZGwuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbG9nb2RsLmgKQEAgLTU0LDEwICs1NCwyNiBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTE5MjAwCiAjdW5kZWYgQ09ORklHX01JU0NfSU5JVF9SCQkvKiBGSVhNRTogbWlzY19pbml0X3IoKSBtaXNzaW5nICAgICAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAoQ0ZHX0NNRF9GTEFTSHxDRkdfQ01EX01FTU9SWXxDRkdfQ01EX0VOVnxDRkdfQ01EX1JVTnxDRkdfQ01EX0FTS0VOVnxDRkdfQ01EX0VDSE8pCi0vKiBDT05GSUdfQ01EX0RGTHxDRkdfQ01EX0kyQ3xDRkdfQ01EX0VFUFJPTXxDRkdfQ01EX05FVHxDRkdfQ01EX0pGRlMyfENGR19DTURfREhDUCkgKi8KLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgICAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0VDSE8KKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX1JVTgorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAvKiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkicm9vdD0vZGV2L25mcyBpcD1ib290cCBjb25zb2xlPXR0eVMwLDE5MjAwIiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2xwYzIyOTJzb2RpbW0uaCBiL2luY2x1ZGUvY29uZmlncy9scGMyMjkyc29kaW1tLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3YjZjNjk1Li5lM2ZlZjVlCi0tLSBhL2luY2x1ZGUvY29uZmlncy9scGMyMjkyc29kaW1tLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2xwYzIyOTJzb2RpbW0uaApAQCAtNjYsMjQgKzY2LDMxIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFR8Q09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcworICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfTU1DCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfUElORykKKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9NTUMKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbHBkN2E0MDAuaCBiL2luY2x1ZGUvY29uZmlncy9scGQ3YTQwMC5oCmluZGV4IGQ3ZDA0NjAuLjA0MTQ4ODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9scGQ3YTQwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9scGQ3YTQwMC5oCkBAIC01NSwxOSArNTUsMzIgQEAKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCTEJLyogUHJpbnQgdGltZXN0YW1wIGluZm8gZm9yIGltYWdlcyAqLwogCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKICNpZm5kZWYgVVNFXzkyMFRfTU1VCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HKSAmIH4oQ0ZHX0NNRF9DQUNIRSkpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9DQUNIRQogI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfREFURSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfREFURQogI2VuZGlmCiAKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogLyogd2hhdCdzIHRoaXMgPyBpdCdzIG5vdCB1c2VkIGFueXdoZXJlICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkxCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9scGQ3YTQwNC5oIGIvaW5jbHVkZS9jb25maWdzL2xwZDdhNDA0LmgKaW5kZXggNDAwMmU2OC4uMTFlZGU5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2xwZDdhNDA0LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2xwZDdhNDA0LmgKQEAgLTU1LDE5ICs1NSwzMiBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJMQkvKiBQcmludCB0aW1lc3RhbXAgaW5mbyBmb3IgaW1hZ2VzICovCiAKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogI2lmbmRlZiBVU0VfOTIwVF9NTVUKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BJTkcpICYgfihDRkdfQ01EX0NBQ0hFKSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUElORykKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9DQUNIRQogI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfREFURSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfREFURQogI2VuZGlmCiAKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogLyogd2hhdCdzIHRoaXMgPyBpdCdzIG5vdCB1c2VkIGFueXdoZXJlICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkxCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9sdWFuLmggYi9pbmNsdWRlL2NvbmZpZ3MvbHVhbi5oCmluZGV4IGUxOTJkMDYuLjI2ZGJlYzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9sdWFuLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2x1YW4uaApAQCAtMjEyLDMxICsyMTIsMzggQEAKICNkZWZpbmUgQ09ORklHX0hXX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgKi8KICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCQl8CVwKLQkJCQlDRkdfQ01EX0FTS0VOVgkJfAlcCi0JCQkJQ0ZHX0NNRF9ESENQCQl8CVwKLQkJCQlDRkdfQ01EX0VMRgkJfAlcCi0JCQkJQ0ZHX0NNRF9FRVBST00JCXwJXAotCQkJCUNGR19DTURfSTJDCQl8CVwKLQkJCQlDRkdfQ01EX0lSUQkJfAlcCi0JCQkJQ0ZHX0NNRF9NSUkJCXwJXAotCQkJCUNGR19DTURfTkVUCQl8CVwKLQkJCQlDRkdfQ01EX05GUwkJfAlcCi0JCQkJQ0ZHX0NNRF9QQ0kJCXwJXAotCQkJCUNGR19DTURfUElORwkJfAlcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPCQl8CVwKLQkJCQlDRkdfQ01EX1NEUkFNCQl8CVwKLQkJCQkwKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSAgICAgICAgIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNjQsNyArMjcxLDcgQEAKICAqIFBDSSBzdHVmZgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ0kpCiAKIC8qIEdlbmVyYWwgUENJICovCiAjZGVmaW5lIENPTkZJR19QQ0kJCQkvKiBpbmNsdWRlIHBjaSBzdXBwb3J0CSAgICAgICAgKi8KQEAgLTI3OCw3ICsyODUsNyBAQAogI2RlZmluZSBDRkdfUENJX1NVQlNZU19WRU5ET1JJRCAweDEwZTgJLyogQU1DQyAqLwogI2RlZmluZSBDRkdfUENJX1NVQlNZU19ERVZJQ0VJRCAweDQ0MDMJLyogd2hhdGV2ZXIgKi8KIAotI2VuZGlmIC8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENJICovCisjZW5kaWYKIAogLyoKICAqIEZvciBib290aW5nIExpbnV4LCB0aGUgYm9hcmQgaW5mbyBhbmQgY29tbWFuZCBsaW5lIGRhdGEKQEAgLTI5Miw3ICsyOTksNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJKDMyPDwxMCkgLyogRm9yIEFNQ0MgNDQwIENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC0zMDQsNyArMzExLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9sdWJib2NrLmggYi9pbmNsdWRlL2NvbmZpZ3MvbHViYm9jay5oCmluZGV4IGFkMTAzNWIuLjRhZGYyNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9sdWJib2NrLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2x1YmJvY2suaApAQCAtNjcsMTAgKzY3LDI0IEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTU1DIHwgQ0ZHX0NNRF9GQVQpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9NTUMKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfRVRIQUREUgkJMDg6MDA6M2U6MjY6MGE6NWIKQEAgLTgyLDcgKzk2LDcgQEAKICNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCiAjZGVmaW5lIENPTkZJR19USU1FU1RBTVAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbHdtb24uaCBiL2luY2x1ZGUvY29uZmlncy9sd21vbi5oCmluZGV4IDliNGMwMDQuLjhhODI3MDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9sd21vbi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9sd21vbi5oCkBAIC0xNzAsMzQgKzE3MCw0MSBAQAogCiAjZGVmaW5lIENPTkZJR19SVENfUENGODU2MwkJLyogdXNlIFBoaWxpcHMgUENGODU2MyBSVEMJKi8KIAorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0JNUAorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAjaWZkZWYgQ09ORklHX1BPU1QKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcgQ0ZHX0NNRF9ESUFHCi0jZWxzZQotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyAwCisjZGVmaW5lIENPTkZJR19DTURfRElBRwogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9CTVAJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BPU1RfRElBRyB8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQorCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTIxMCw3ICsyMTcsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNzYsNyArMjgzLDcgQEAKICAqLwogI2RlZmluZSBDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAogI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHg0MDAwMDAwMAotI2lmIGRlZmluZWQoREVCVUcpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKENPTkZJR19DTURfSURFKQogI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgyNTYgPDwgMTApCS8qIFJlc2VydmUgMjU2IGtCIGZvciBNb25pdG9yCSovCiAjZWxzZQogI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgxMjggPDwgMTApCS8qIFJlc2VydmUgMTI4IGtCIGZvciBNb25pdG9yCSovCkBAIC0zNzAsNyArMzc3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2x3bW9uNS5oIGIvaW5jbHVkZS9jb25maWdzL2x3bW9uNS5oCmluZGV4IDUyZGI3MWUuLjYwNGI3ZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9sd21vbjUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbHdtb241LmgKQEAgLTI0Miw5ICsyNDIsNiBAQAogLyogQ29tbWVudCB0aGlzIG91dCB0byBlbmFibGUgVVNCIDEuMSBkZXZpY2UgKi8KICNkZWZpbmUgVVNCXzJfMF9ERVZJQ0UKIAotI2RlZmluZSBDTURfVVNCCQkJQ0ZHX0NNRF9VU0IKLSNlbHNlCi0jZGVmaW5lIENNRF9VU0IJCQkwCS8qIG5vIFVTQiBvbiA0NDBHUngJCSovCiAjZW5kaWYgLyogQ09ORklHXzQ0MEVQWCAqLwogCiAvKiBQYXJ0aXRpb25zICovCkBAIC0yNTIsMzcgKzI0OSw0OSBAQAogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfSVNPX1BBUlRJVElPTgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAoQ09ORklHX0NNRF9ERkwJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9BU0tFTlYJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9EQVRFCXwJXAotCQkJICAgICAgIENGR19DTURfREhDUAl8CVwKLQkJCSAgICAgICBDRkdfQ01EX0RJQUcJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9FRVBST00JfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9FTEYJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9GQVQJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9MT0cJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9JMkMJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9JUlEJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9NSUkJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9ORVQJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9ORlMJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9QQ0kJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9QSU5HCXwJXAotCQkJICAgICAgIENGR19DTURfUkVHSU5GTwl8CVwKLQkJCSAgICAgICBDRkdfQ01EX1NEUkFNCXwJXAotCQkJICAgICAgIENNRF9VU0IpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0jZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTE9HCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorCisjaWZkZWYgQ09ORklHXzQ0MEVQWAorI2RlZmluZSBDT05GSUdfQ01EX1VTQgorI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKKwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkgICAgICAgICI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtNDY3LDcgKzQ3Niw3IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCSgzMjw8MTApICAvKiBGb3IgQU1DQyA0NDAgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkgICAgICAvKiAuLi4JCQkgICAgICAgICAgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkgICAgICAvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKQEAgLTQ3OSw3ICs0ODgsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkgICAgLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9tY2MyMDAuaCBiL2luY2x1ZGUvY29uZmlncy9tY2MyMDAuaAppbmRleCBjMjMyNGEwLi5jYzJkYmNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbWNjMjAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL21jYzIwMC5oCkBAIC00MCwxMSArNDAsNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CQkJKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICoKQEAgLTkyLDI3ICs4NywzNyBAQAogCiAvKiBVU0IgKi8KICNkZWZpbmUgQ09ORklHX1VTQl9PSENJCi0jZGVmaW5lIEFERF9VU0JfQ01ECQlDRkdfQ01EX1VTQiB8IENGR19DTURfRkFUCiAjZGVmaW5lIENPTkZJR19VU0JfU1RPUkFHRQogLyogYXV0b21hdGljIHNvZnR3YXJlIHVwZGF0ZXMgKHNlZSBib2FyZC9tY2MyMDAvYXV0b191cGRhdGUuYykgKi8KICNkZWZpbmUgQ09ORklHX0FVVE9fVVBEQVRFIDEKIAotLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcwotICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUFERF9VU0JfQ01ECXwgXAotCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfSTJDKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisKKyN1bmRlZglDT05GSUdfQ01EX05FVAorCiAKIC8qCiAgKiBBdXRvYm9vdGluZwogICovCi0jZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQkvKiBhdXRvYm9vdCBhZnRlciA1IHNlY29uZHMgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkxCS8qIGF1dG9ib290IGFmdGVyIDEgc2Vjb25kICovCiAKICNkZWZpbmUgQ09ORklHX1BSRUJPT1QJImVjaG87IglcCiAJImVjaG8gVHlwZSBcInJ1biBmbGFzaF9uZnNcIiB0byBtb3VudCByb290IGZpbGVzeXN0ZW0gb3ZlciBORlM7IiBcCkBAIC0xMjgsMjAgKzEzMywzMCBAQAogIyBkZWZpbmUgQ0ZHX19MSU5VWF9DT05TT0xFCSJ0dHlTMCIKICNlbHNlCiAjIGRlZmluZSBDRkdfX0JPQVJETkFNRQkJIm1jYzIwMCIKLSMgZGVmaW5lIENGR19fTElOVVhfQ09OU09MRQkidHR5RVU3IgorIyBkZWZpbmUgQ0ZHX19MSU5VWF9DT05TT0xFCSJ0dHlFVTUiCiAjZW5kaWYKIAorLyogTmV0d29yayAqLworI2RlZmluZSBDT05GSUdfRVRIQUREUgkwMDoxNzoxNzpmZjowMDowMAorI2RlZmluZSBDT05GSUdfSVBBRERSCTEwLjc2LjkuMjkKKyNkZWZpbmUgQ09ORklHX1NFUlZFUklQCTEwLjc2LjkuMQorCisjaW5jbHVkZSA8dmVyc2lvbi5oPiAvKiBGb3IgVS1Cb290IHZlcnNpb24gKi8KKwogI2RlZmluZSBDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTCQkJCQlcCisJInVib290dmVyPSIgVV9CT09UX1ZFUlNJT04gIlwwIgkJCQkJXAogCSJuZXRkZXY9ZXRoMFwwIgkJCQkJCQlcCiAJImhvc3RuYW1lPSIgQ0ZHX19CT0FSRE5BTUUgIlwwIgkJCQkJXAogCSJuZnNhcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIHJ3ICIJCQlcCiAJCSJuZnNyb290PSR7c2VydmVyaXB9OiR7cm9vdHBhdGh9XDAiCQkJXAotCSJyYW1hcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvcmFtIHJ3XDAiCQkJXAorCSJyYW1hcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvbXRkYmxvY2syICIJCQlcCisJCSJyb290ZnN0eXBlPWNyYW1mc1wwIgkJCQkJXAogCSJhZGRpcD1zZXRlbnYgYm9vdGFyZ3MgJHtib290YXJnc30gIgkJCQlcCiAJCSJpcD0ke2lwYWRkcn06JHtzZXJ2ZXJpcH06JHtnYXRld2F5aXB9OiR7bmV0bWFza30iCVwKIAkJIjoke2hvc3RuYW1lfToke25ldGRldn06b2ZmIHBhbmljPTFcMCIJCQlcCiAJImFkZGNvbnM9c2V0ZW52IGJvb3RhcmdzICR7Ym9vdGFyZ3N9ICIJCQkJXAotCQkiY29uc29sZT0ke2NvbnNvbGV9LCR7YmF1ZHJhdGV9XDAiCQkJXAorCQkiY29uc29sZT0ke2NvbnNvbGV9LCR7YmF1ZHJhdGV9ICIJCVwKKwkJInVib290dmVyPSR7dWJvb3R2ZXJ9IGJvYXJkPSR7Ym9hcmR9XDAiCVwKIAkiZmxhc2hfbmZzPXJ1biBuZnNhcmdzIGFkZGlwIGFkZGNvbnM7IgkJCQlcCiAJCSJib290bSAke2tlcm5lbF9hZGRyfVwwIgkJCQlcCiAJImZsYXNoX3NlbGY9cnVuIHJhbWFyZ3MgYWRkaXAgYWRkY29uczsiCQkJCVwKQEAgLTE1Myw2ICsxNjgsNyBAQAogCSJib290ZmlsZT0vdGZ0cGJvb3QvIiBDRkdfX0JPQVJETkFNRSAiL3VJbWFnZVwwIgkJXAogCSJsb2FkPXRmdHAgMjAwMDAwIC90ZnRwYm9vdC8iIENGR19fQk9BUkROQU1FICIvdS1ib290LmJpblwwIglcCiAJInRleHRfYmFzZT0iIE1LX1NUUihURVhUX0JBU0UpICJcMCIJCQkJXAorCSJrZXJuZWxfYWRkcj0weEZDMEMwMDAwXDAiCQkJCQlcCiAJInVwZGF0ZT1wcm90ZWN0IG9mZiAke3RleHRfYmFzZX0gKyR7ZmlsZXNpemV9OyIJCQlcCiAJCSJlcmEgJHt0ZXh0X2Jhc2V9ICske2ZpbGVzaXplfTsiCQkJXAogCQkiY3AuYiAyMDAwMDAgJHt0ZXh0X2Jhc2V9ICR7ZmlsZXNpemV9XDAiCQlcCkBAIC0yNTMsNyArMjY5LDcgQEAKIC8qCiAgKiBFdGhlcm5ldCBjb25maWd1cmF0aW9uCiAgKi8KLSNkZWZpbmUgQ09ORklHX01QQzV4eHhfRkVDCTEKKy8qI2RlZmluZSBDT05GSUdfTVBDNXh4eF9GRUMJMSovCiAvKgogICogRGVmaW5lIENPTkZJR19GRUNfMTBNQklUIHRvIGZvcmNlIEZFQyBhdCAxME1iCiAgKi8KQEAgLTI5MSw3ICszMDcsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMDcsNiArMzIzLDExIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMJCQkqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLworI2VuZGlmCisKIC8qCiAgKiBWYXJpb3VzIGxvdy1sZXZlbCBzZXR0aW5ncwogICovCkBAIC0zMjksNiArMzUwLDEzIEBACiAjZGVmaW5lIENGR19DUzFfU0laRQkJMHgwMDAwMTAwMAogI2RlZmluZSBDRkdfQ1MxX0NGRwkJMHgxZDMwMAogCisvKiBMZWljYSAtIGJ1aWxkIHJldmlzaW9uIHJlc2lzdG9ycyAqLworLyoKKyNkZWZpbmUgQ0ZHX0NTM19TVEFSVAkJMHg4MDAyMDAwMAorI2RlZmluZSBDRkdfQ1MzX1NJWkUJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ0ZHX0NTM19DRkcJCTB4MWQzMDAKKyovCisKIC8qCiAgKiAgU2VsZWN0IG9uZSBvZiBxdWFydHMgYXMgYSBkZWZhdWx0CiAgKiBjb25zb2xlLiBJZiB1bmRlZmluZWQgLSBQU0MgY29uc29sZQpAQCAtMzg0LDQgKzQxMiw4IEBACiAjZGVmaW5lIENPTkZJR19VU0JfQ0xPQ0sJMHgwMDAxQkJCQgogI2RlZmluZSBDT05GSUdfVVNCX0NPTkZJRwkweDAwMDA1MDAwCiAKKyNkZWZpbmUgQ09ORklHX0FVVE9CT09UX0tFWUVECQkvKiB1c2Uga2V5IHN0cmluZ3MgdG8gc3RvcCBhdXRvYm9vdAkqLworI2RlZmluZSBDT05GSUdfQVVUT0JPT1RfU1RPUF9TVFIJIjQzMiIKKyNkZWZpbmUgQ09ORklHX1NJTEVOVF9DT05TT0xFCTEKKwogI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9tZWNwNTIwMC5oIGIvaW5jbHVkZS9jb25maWdzL21lY3A1MjAwLmgKaW5kZXggMGMxMDI5NC4uNDk5MTlmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL21lY3A1MjAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL21lY3A1MjAwLmgKQEAgLTUwLDExICs1MCw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtODgsMjYgKzgzLDMyIEBACiAvKiBVU0IgKi8KICNpZiAwCiAjZGVmaW5lIENPTkZJR19VU0JfT0hDSQotI2RlZmluZSBBRERfVVNCX0NNRAkJQ0ZHX0NNRF9VU0IgfCBDRkdfQ01EX0ZBVAogI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UKLSNlbHNlCi0jZGVmaW5lIEFERF9VU0JfQ01ECQkwCiAjZW5kaWYKIAotLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcwotICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkgQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJIENGR19DTURfRVhUMgl8IFwKLQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJIENGR19DTURfSURFCXwgXAotCQkJCSBDRkdfQ01EX0JTUAl8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisKIAogI2lmIChURVhUX0JBU0UgPT0gMHhGRjAwMDAwMCkJCS8qIEJvb3QgbG93IHdpdGggMTYgTUIgRmxhc2ggKi8KICMgICBkZWZpbmUgQ0ZHX0xPV0JPT1QJCTEKQEAgLTI1OCw3ICsyNTksNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMjc2LDYgKzI3NywxMSBAQAogCiAjZGVmaW5lIENGR19WWFdPUktTX01BQ19QVFIJMHgwMDAwMDAwMAkvKiBQYXNzIEV0aGVybmV0IE1BQyB0byBWeFdvcmtzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL21sMzAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvbWwzMDAuaAppbmRleCA2NzYyY2Q2Li4wMTgzMDQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbWwzMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbWwzMDAuaApAQCAtODcsMTMgKzg3LDI4IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZQkqLwogCi0jZGVmaW5lIFJFTU9WRV9DT01NQU5EUwkgICAgICAgKENGR19DTURfRkxBU0ggfCBDRkdfQ01EX0xPQURTIHwgQ0ZHX0NNRF9GQVQgfCBcCi0JCQkJQ0ZHX0NNRF9JTUxTICkKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9ORVQpIFwKLQkJCQkmIH5SRU1PVkVfQ09NTUFORFMpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKworI3VuZGVmIENPTkZJR19DTURfRkxBU0gKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9GQVQKKyN1bmRlZiBDT05GSUdfQ01EX0lNTFMKKwogCiAvKiAjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEgWFBBUl9DT1JFX0NMT0NLX0ZSRVFfSFogKi8KIC8qIDMwMDAwMDAwMCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL21sNDAxLmggYi9pbmNsdWRlL2NvbmZpZ3MvbWw0MDEuaAppbmRleCAzZGIyODc3Li43ZWVhZTcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbWw0MDEuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbWw0MDEuaApAQCAtMTQ1LDgyICsxNDUsNTAgQEAKIAkjZGVmaW5lCUNGR19GTEFTSF9QUk9URUNUSU9OCQkvKiBoYXJkd2FyZSBmbGFzaCBwcm90ZWN0aW9uICovCiAjZW5kaWYgLyogIUZMQVNIICovCiAKLSNpZmRlZglGTEFTSAotCSNpZmRlZglSQU1FTlYKLQkjZGVmaW5lCUNPTkZJR19DT01NQU5EUwkoQ09ORklHX19DTURfREZMIHxcCi0JCQkJQ0ZHX0NNRF9NRU1PUlkgfFwKLQkJCQlDRkdfQ01EX01JU0MgfFwKLQkJCQlDRkdfQ01EX0FVVE9TQ1JJUFQgfFwKLQkJCQlDRkdfQ01EX0lSUSB8XAotCQkJCUNGR19DTURfQVNLRU5WIHxcCi0JCQkJQ0ZHX0NNRF9CREkgfFwKLQkJCQlDRkdfQ01EX1JVTiB8XAotCQkJCUNGR19DTURfTE9BRFMgfFwKLQkJCQlDRkdfQ01EX0xPQURCIHxcCi0JCQkJQ0ZHX0NNRF9JTUkgfFwKLQkJCQlDRkdfQ01EX05FVCB8XAotCQkJCUNGR19DTURfQ0FDSEUgfFwKLQkJCQlDRkdfQ01EX0ZBVCB8XAotCQkJCUNGR19DTURfRVhUMiB8XAotCQkJCUNGR19DTURfSkZGUzIgfFwKLQkJCQlDRkdfQ01EX0VDSE8gfFwKLQkJCQlDRkdfQ01EX0lNTFMgfFwKLQkJCQlDRkdfQ01EX0ZMQVNIIHxcCi0JCQkJQ0ZHX0NNRF9NRlNMIHxcCi0JCQkJQ0ZHX0NNRF9QSU5HIFwKLQkJCQkpCi0JI2Vsc2UJLyogIVJBTUVOViAqLwotCSNkZWZpbmUJQ09ORklHX0NPTU1BTkRTCShDT05GSUdfX0NNRF9ERkwgfFwKLQkJCQlDRkdfQ01EX01FTU9SWSB8XAotCQkJCUNGR19DTURfTUlTQyB8XAotCQkJCUNGR19DTURfQVVUT1NDUklQVCB8XAotCQkJCUNGR19DTURfSVJRIHxcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYgfFwKLQkJCQlDRkdfQ01EX0JESSB8XAotCQkJCUNGR19DTURfUlVOIHxcCi0JCQkJQ0ZHX0NNRF9MT0FEUyB8XAotCQkJCUNGR19DTURfTE9BREIgfFwKLQkJCQlDRkdfQ01EX0lNSSB8XAotCQkJCUNGR19DTURfTkVUIHxcCi0JCQkJQ0ZHX0NNRF9DQUNIRSB8XAotCQkJCUNGR19DTURfSU1MUyB8XAotCQkJCUNGR19DTURfRkxBU0ggfFwKLQkJCQlDRkdfQ01EX1BJTkcgfFwKLQkJCQlDRkdfQ01EX0VOViB8XAotCQkJCUNGR19DTURfRkFUIHxcCi0JCQkJQ0ZHX0NNRF9FWFQyIHxcCi0JCQkJQ0ZHX0NNRF9KRkZTMiB8XAotCQkJCUNGR19DTURfRUNITyB8XAotCQkJCUNGR19DTURfTUZTTCB8XAotCQkJCUNGR19DTURfU0FWRVMgXAotCQkJCSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEUworI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX01JU0MKKyNkZWZpbmUgQ09ORklHX0NNRF9NRlNMCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JVTgorCisjaWYgZGVmaW5lZChGTEFTSCkKKwkjZGVmaW5lIENPTkZJR19DTURfRUNITworCSNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorCSNkZWZpbmUgQ09ORklHX0NNRF9JTUxTCisJI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisKKwkjaWYgIWRlZmluZWQoUkFNRU5WKQorCQkjZGVmaW5lIENPTkZJR19DTURfRU5WCisJCSNkZWZpbmUgQ09ORklHX0NNRF9TQVZFUwogCSNlbmRpZgorI2VuZGlmCiAKLSNlbHNlCS8qICFGTEFTSCAqLwotCSNkZWZpbmUJQ09ORklHX0NPTU1BTkRTCShDT05GSUdfX0NNRF9ERkwgfFwKLQkJCQlDRkdfQ01EX01FTU9SWSB8XAotCQkJCUNGR19DTURfTUlTQyB8XAotCQkJCUNGR19DTURfQVVUT1NDUklQVCB8XAotCQkJCUNGR19DTURfSVJRIHxcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYgfFwKLQkJCQlDRkdfQ01EX0JESSB8XAotCQkJCUNGR19DTURfUlVOIHxcCi0JCQkJQ0ZHX0NNRF9MT0FEUyB8XAotCQkJCUNGR19DTURfRkFUIHxcCi0JCQkJQ0ZHX0NNRF9FWFQyIHxcCi0JCQkJQ0ZHX0NNRF9MT0FEQiB8XAotCQkJCUNGR19DTURfSU1JIHxcCi0JCQkJQ0ZHX0NNRF9ORVQgfFwKLQkJCQlDRkdfQ01EX0NBQ0hFIHxcCi0JCQkJQ0ZHX0NNRF9NRlNMIHxcCi0JCQkJQ0ZHX0NNRF9QSU5HIFwKLQkJCQkpCi0jZW5kaWYJLyogIUZMQVNIICovCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAvKiBKRkZTMiBwYXJ0aXRpb25zICovCiAjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCS8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCiAjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibm9yMD1tbDQwMS0wIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL21vZG5ldDUwLmggYi9pbmNsdWRlL2NvbmZpZ3MvbW9kbmV0NTAuaAppbmRleCAyMDI4NzY3Li40NDYxYmRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbW9kbmV0NTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbW9kbmV0NTAuaApAQCAtNjMsMTIgKzYzLDIzIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkzODQwMAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgICAgIChDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0pGRlMyKSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorCiAKICNkZWZpbmUgQ09ORklHX05FVE1BU0sgICAgICAgICAgMjU1LjI1NS4yNTUuMAogI2RlZmluZSBDT05GSUdfSVBBRERSCQkxOTIuMTY4LjMwLjIKQEAgLTgxLDcgKzkyLDcgQEAKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAweDEwMDIwMDAwIDB4MTAwYTAwMDAiCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAJImNvbnNvbGU9dHR5UzAsMzg0MDAgaW5pdHJkPTB4MTAwYTAwNDAsNTMwSyByb290PS9kZXYvcmFtIGtlZXBpbml0cmQiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL21vdGlvbnByby5oIGIvaW5jbHVkZS9jb25maWdzL21vdGlvbnByby5oCmluZGV4IGUzODk5YTUuLmUwYTgyN2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9tb3Rpb25wcm8uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbW90aW9ucHJvLmgKQEAgLTM3LDI4ICszNywzNSBAQAogCiAKIC8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPCXwgXAotCQkJCUNGR19DTURfSU1NQVAJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfRFRUKQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRFRUCiAKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9tcDJ1c2IuaCBiL2luY2x1ZGUvY29uZmlncy9tcDJ1c2IuaAppbmRleCAwNGYxZjI0Li5lYTVhNDRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbXAydXNiLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL21wMnVzYi5oCkBAIC0xMDEsMTIgKzEwMSwxOCBAQAogCiAjdW5kZWYJQ09ORklHX01PREVNX1NVUFBPUlQJCS8qIGRpc2FibGUgbW9kZW0gaW5pdGlhbGl6YXRpb24gc3R1ZmYgKi8KIAotI2RlZmluZSBDT05GSUdfVVNCX09IQ0kJCTEKKyNkZWZpbmUgQ09ORklHX1VTQl9PSENJX05FVwkxCiAjZGVmaW5lIENPTkZJR19VU0JfS0VZQk9BUkQJMQogI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UJMQogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgkxCiAjZGVmaW5lIENPTkZJR19BVDkxQ19QUUZQX1VIUEJVRyAxCiAKKyN1bmRlZiBDRkdfVVNCX09IQ0lfQk9BUkRfSU5JVAorI2RlZmluZSBDRkdfVVNCX09IQ0lfQ1BVX0lOSVQJCTEKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1JFR1NfQkFTRQkJQVQ5MV9VU0JfSE9TVF9CQVNFCisjZGVmaW5lIENGR19VU0JfT0hDSV9TTE9UX05BTUUJCSJhdDkxcm05MjAwIgorI2RlZmluZSBDRkdfVVNCX09IQ0lfTUFYX1JPT1RfUE9SVFMJMTUKKwogI3VuZGVmIENPTkZJR19IQVJEX0kyQwogCiAjaWZkZWYgQ09ORklHX0hBUkRfSTJDCkBAIC0xMjMsNDAgKzEyOSw1NiBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkgICAgICAzCiAKLSNpZmRlZiBDT05GSUdfSEFSRF9JMkMKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlcCi0JCSAgICAgICAoKENPTkZJR19DTURfREZMCXwgXAotCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJQ0ZHX0NNRF9ESENQIAl8IFwKLQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQlDRkdfQ01EX05GUwl8IFwKLQkJCUNGR19DTURfU05UUAl8IFwKLQkJCUNGR19DTURfTUlTQykpCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCVwKLQkJICAgICAgICgoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQlDRkdfQ01EX0RIQ1AgCXwgXAotCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQlDRkdfQ01EX1NOVFAJfCBcCi0JCQlDRkdfQ01EX1VTQiAgICAgIHwgXAotCQkJQ0ZHX0NNRF9DQUNIRSkJJiBcCi0JCSAgICAgIH4oQ0ZHX0NNRF9CREkgfCBcCi0JCQlDRkdfQ01EX0lNSSB8IFwKLQkJCUNGR19DTURfQVVUT1NDUklQVCB8IFwKLQkJCUNGR19DTURfRlBHQSB8IFwKLQkJCUNGR19DTURfTUlTQyB8IFwKLQkJCUNGR19DTURfTE9BRFMgKSkKKyNpZiAhZGVmaW5lZChDT05GSUdfSEFSRF9JMkMpCiAjZGVmaW5lIENPTkZJR19USU1FU1RBTVAKICNlbmRpZgotI2RlZmluZSBDRkdfTE9OR0hFTFAKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKworI2lmIGRlZmluZWQoQ09ORklHX0hBUkRfSTJDKQorCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0kyQworICAgICNkZWZpbmUgQ09ORklHX0NNRF9NSVNDCisKKyNlbHNlCisKKyAgICAjZGVmaW5lIENPTkZJR19DTURfVVNCCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisgICAgI3VuZGVmIENPTkZJR19DTURfQkRJCisgICAgI3VuZGVmIENPTkZJR19DTURfRlBHQQorICAgICN1bmRlZiBDT05GSUdfQ01EX0lNSQorICAgICN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisgICAgI3VuZGVmIENPTkZJR19DTURfTUlTQworCisjZW5kaWYKKworCisjZGVmaW5lIENGR19MT05HSEVMUAogCiAjZGVmaW5lIENPTkZJR19OUl9EUkFNX0JBTktTCTEKICNkZWZpbmUgUEhZU19TRFJBTQkJMHgyMDAwMDAwMAotI2RlZmluZSBQSFlTX1NEUkFNX1NJWkUJCTB4MDgwMDAwMDAgCS8qIDEyOCBtZWdzICovCisjZGVmaW5lIFBIWVNfU0RSQU1fU0laRQkJMHgwODAwMDAwMAkvKiAxMjggbWVncyAqLwogCiAjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCVBIWVNfU0RSQU0KICNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECQlDRkdfTUVNVEVTVF9TVEFSVCArIFBIWVNfU0RSQU1fU0laRSAtIDI2MjE0NApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL21wYzc0NDhocGMyLmggYi9pbmNsdWRlL2NvbmZpZ3MvbXBjNzQ0OGhwYzIuaAppbmRleCAyNDNhM2Y2Li5mNGYzM2YzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbXBjNzQ0OGhwYzIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbXBjNzQ0OGhwYzIuaApAQCAtMTQ2LDI1ICsxNDYsMzQgQEAKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJLyogd2F0Y2hkb2cgZGlzYWJsZWQgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIChDT05GSUdfQ01EX0RGTCBcCi0JCXwgQ0ZHX0NNRF9BU0tFTlYgXAotCQl8IENGR19DTURfQ0FDSEUgXAotCQl8IENGR19DTURfUENJIFwKLQkJfCBDRkdfQ01EX0kyQyBcCi0JCXwgQ0ZHX0NNRF9TRFJBTSBcCi0JCXwgQ0ZHX0NNRF9FRVBST00gXAotCQl8IENGR19DTURfRkxBU0ggXAotCQl8IENGR19DTURfRU5WIFwKLQkJfCBDRkdfQ01EX0JTUCBcCi0JCXwgQ0ZHX0NNRF9ESENQIFwKLQkJfCBDRkdfQ01EX1BJTkcgXAotCQl8IENGR19DTURfREFURSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKwogCiAvKnNldCBkYXRlIGluIHUtYm9vdCovCiAjZGVmaW5lIENPTkZJR19SVENfTTQ4VDM1QQpAQCAtMTgyLDcgKzE5MSw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCBhdCAqLwogI2Vsc2UKQEAgLTM2Niw5ICszNzUsOSBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRkxBU0ggb3JnYW5pemF0aW9uCiAgKi8KLSNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxLyogRmxhc2ggY2FuIGJlIGF0IG9uZSBvZiB0d28gYWRkcmVzc2VzICovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMQkJLyogRmxhc2ggY2FuIGJlIGF0IG9uZSBvZiB0d28gYWRkcmVzc2VzICovCiAjZGVmaW5lIEZMQVNIX0JBTktfU0laRQkJMHgwMTAwMDAwMAkvKiAxNiBNQiBUb3RhbCAqLwotI2RlZmluZSBDRkdfRkxBU0hfQkFOS1NfTElTVCB7Q0ZHX0ZMQVNIX0JBU0UsIENGR19GTEFTSF9CQVNFMn0KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBTktTX0xJU1QJeyBDRkdfRkxBU0hfQkFTRSwgLyogQ0ZHX0ZMQVNIX0JBU0UyICovIH0KIAogI2RlZmluZSBDRkdfRkxBU0hfQ0ZJX0RSSVZFUgogI2RlZmluZSBDRkdfRkxBU0hfQ0ZJCkBAIC0zODcsNyArMzk2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIGFsbCBNUEM3NHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbXgxYWRzLmggYi9pbmNsdWRlL2NvbmZpZ3MvbXgxYWRzLmgKaW5kZXggN2YzZGZkNS4uNTEyNWIyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL214MWFkcy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9teDFhZHMuaApAQCAtNzgsMjUgKzc4LDMyIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb21tYW5kIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgXAotCQkJKENPTkZJR19DTURfREZMCSB8IFwKLQkJCUNGR19DTURfQ0FDSEUJIHwgXAotCQkJQ0ZHX0NNRF9SRUdJTkZPCSB8IFwKLQkJCUNGR19DTURfRUxGKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9tc2RrIG1lbT00OE0iCiAjZGVmaW5lIENPTkZJR19CT09URklMRQkJIm14MWFkcyIKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJ0ZnRwOyBib290bSIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KIAkJCQkJCS8qIHdoYXQncyB0aGlzID8gaXQncyBub3QgdXNlZCBhbnl3aGVyZSAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbXgxZnMyLmggYi9pbmNsdWRlL2NvbmZpZ3MvbXgxZnMyLmgKaW5kZXggOTgxNmJlOC4uZDUyN2QwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL214MWZzMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9teDFmczIuaApAQCAtMzQsMjIgKzM0LDMwIEBACiAjdW5kZWYJX0NPTkZJR19VQVJUNCAvKiBpbnRlcm5hbCB1YXJ0IDQgKi8KICN1bmRlZglDT05GSUdfU0lMRU5UX0NPTlNPTEUgIC8qIHVzZSB0aGlzIHRvIGRpc2FibGUgb3V0cHV0ICovCiAKLS8qCi0gKiBEZWZpbml0aW9uIG9mIHUtYm9vdCBidWlsZCBpbiBjb21tYW5kcy4gQ2hlY2sgb3V0IENPTkZJR19DTURfREZMIGlmCi0gKiBuZWNjZXNzYXJ5IGluIGluY2x1ZGUvY21kX2NvbmZkZWZzLmggZmlsZS4gKFVuKWNvbW1lbnQgZm9yIGdldHRpbmcKLSAqIGZ1bmN0aW9uYWxpdHkgb3Igc2l6ZSBvZiB1LWJvb3QgY29kZS4KLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTAkJIFwKLQkJCQkmIH5DRkdfQ01EX0xPQURTCSBcCi0JCQkJJiB+Q0ZHX0NNRF9DT05TT0xFCSBcCi0JCQkJJiB+Q0ZHX0NNRF9BVVRPU0NSSVBUCSBcCi0JCQkJJiB+Q0ZHX0NNRF9ORVQJCSBcCi0JCQkJJiB+Q0ZHX0NNRF9QSU5HCQkgXAotCQkJCSYgfkNGR19DTURfREhDUAkJIFwKLQkJCQl8IENGR19DTURfSkZGUzIJCSBcCi0JCQkJKQogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKworI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyN1bmRlZiBDT05GSUdfQ01EX0NPTlNPTEUKKyN1bmRlZiBDT05GSUdfQ01EX0FVVE9TQ1JJUFQKKyN1bmRlZiBDT05GSUdfQ01EX05FVAorI3VuZGVmIENPTkZJR19DTURfUElORworI3VuZGVmIENPTkZJR19DTURfREhDUAorCiAKIC8qCiAgKiBCb290IG9wdGlvbnMuIFNldHRpbmcgZGVsYXkgdG8gLTEgc3RvcHMgYXV0b3N0YXJ0IGNvdW50IGRvd24uCkBAIC0xNjAsNyArMTY4LDcgQEAKICAqIFJpZ2h0IG5vdyB0aGVyZSBpcyBubyBnYWluIGZvciB1c2VyLCBidXQgbGF0ZXIgb24gYm9vdGluZyBrZXJuZWwgbWlnaHQgYmUKICAqIHBvc3NpYmxlLiBDb25zaWRlciB1c2luZyBYSVAga2VybmVsIHJ1bm5pbmcgZnJvbSBmbGFzaCB0byBzYXZlIFJBTQogICogZm9vdHByaW50LgotICogTk9URTogRW5hYmxlIENGR19DTURfSkZGUzIgZm9yIEpGRlMyIHN1cHBvcnQuCisgKiBOT1RFOiBFbmFibGUgQ09ORklHX0NNRF9KRkZTMiBmb3IgSkZGUzIgc3VwcG9ydC4KICAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL25ldHN0YXIuaCBiL2luY2x1ZGUvY29uZmlncy9uZXRzdGFyLmgKaW5kZXggNjk3Nzk2YS4uMzMxNTlkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL25ldHN0YXIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbmV0c3Rhci5oCkBAIC0xNDAsNDMgKzE0MCwzOCBAQAogI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIm5vcjA9b21hcGZsYXNoLjAsbmFuZDA9b21hcG5hbmQuMCIKICNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9b21hcGZsYXNoLjA6OGtAMTZrKGVudiksOGsocl9lbnYpLDQ0OGtANTc2ayh1LWJvb3QpO29tYXBuYW5kLjA6NDhNKHJvb3RmczApLDQ4TShyb290ZnMxKSwtKGRhdGEpIgogCi0jaWYgMAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0JESSAgICB8IFwKLQkJCQkgQ0ZHX0NNRF9CT09URCAgfCBcCi0JCQkJIENGR19DTURfREhDUCAgIHwgXAotCQkJCSBDRkdfQ01EX0VOVgl8IFwKLQkJCQkgQ0ZHX0NNRF9GTEFTSCAgfCBcCi0JCQkJIENGR19DTURfSU1JICAgIHwgXAotCQkJCSBDRkdfQ01EX0xPQURCICB8IFwKLQkJCQkgQ0ZHX0NNRF9ORVQgICAgfCBcCi0JCQkJIENGR19DTURfTUVNT1JZIHwgXAotCQkJCSBDRkdfQ01EX1BJTkcgICB8IFwKLQkJCQkgQ0ZHX0NNRF9SVU4pCiAKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQkRJICAgIHwgXAotCQkJCSBDRkdfQ01EX0JPT1REICB8IFwKLQkJCQkgQ0ZHX0NNRF9ESENQICAgfCBcCi0JCQkJIENGR19DTURfRU5WCXwgXAotCQkJCSBDRkdfQ01EX0ZMQVNIICB8IFwKLQkJCQkgQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCSBDRkdfQ01EX0lNSSAgICB8IFwKLQkJCQkgQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQkgQ0ZHX0NNRF9MT0FEQiAgfCBcCi0JCQkJIENGR19DTURfTkVUICAgIHwgXAotCQkJCSBDRkdfQ01EX01FTU9SWSB8IFwKLQkJCQkgQ0ZHX0NNRF9QSU5HICAgfCBcCi0JCQkJIENGR19DTURfUlVOKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisKKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9CT09URAorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JVTgorCiAKICNkZWZpbmUgQ09ORklHX0pGRlMyX05BTkQJMQkvKiBqZmZzMiBvbiBuYW5kIHN1cHBvcnQgKi8KLSNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCUNPTkZJR19CT09UUF9ERUZBVUxUCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKwogI2RlZmluZSBDT05GSUdfTE9PUFcKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfWkVST19CT09UREVMQVlfQ0hFQ0sJLyogYWxsb3cgdG8gYnJlYWsgaW4gYWx3YXlzICovCiAjdW5kZWYgIENPTkZJR19CT09UQVJHUwkJLyogdGhlIGJvb3QgY29tbWFuZCB3aWxsIHNldCBib290YXJncyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbnM5NzUwZGV2LmggYi9pbmNsdWRlL2NvbmZpZ3MvbnM5NzUwZGV2LmgKaW5kZXggMGIxNTQxZC4uMWQ2OTFmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL25zOTc1MGRldi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9uczk3NTBkZXYuaApAQCAtNjksMzMgKzY5LDI4IEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkzODQwMAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbW1hbmQgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIDAgLyogQFRPRE8gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIFwKLQkJCShDT05GSUdfQ01EX0RGTAkgfCBcCi0JCQlDRkdfQ01EX0NBQ0hFCSB8IFwKLQkJCS8qQ0ZHX0NNRF9OQU5ECSB8Ki8gXAotCQkJLypDRkdfQ01EX0VFUFJPTSB8Ki8gXAotCQkJLypDRkdfQ01EX0kyQwkgfCovIFwKLQkJCS8qQ0ZHX0NNRF9VU0IJIHwqLyBcCi0JCQlDRkdfQ01EX1JFR0lORk8gIHwgXAotCQkJQ0ZHX0NNRF9EQVRFCSB8IFwKLQkJCUNGR19DTURfRUxGKQotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIFwKLQkJCShDT05GSUdfQ01EX0JESSB8IFwKLQkJCUNGR19DTURfTkVUIHwgXAotCQkJQ0ZHX0NNRF9QSU5HCSB8IFwKLQkJCUNGR19DTURfQ09OU09MRQkgfCBcCi0JCQlDRkdfQ01EX0xPQURCCSB8IFwKLQkJCUNGR19DTURfTE9BRFMJIHwgXAotCQkJQ0ZHX0NNRF9NRU1PUlkpCi0jZW5kaWYKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0NPTlNPTEUKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX0xPQURTCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAvKiNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgIAkicm9vdD1yYW1mcyBkZXZmcz1tb3VudCBjb25zb2xlPXR0eVNBMCw5NjAwIiAqLwpAQCAtMTA4LDcgKzEwMyw3IEBACiAvKiNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCSJlbGlub3MtbGFydCIgKi8KIC8qI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInRmdHA7IGJvb3RtIiAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogLyogd2hhdCdzIHRoaXMgPyBpdCdzIG5vdCB1c2VkIGFueXdoZXJlICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkxCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9vMmRudC5oIGIvaW5jbHVkZS9jb25maWdzL28yZG50LmgKaW5kZXggNjNkMGRhNy4uZjFkNzNlNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL28yZG50LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL28yZG50LmgKQEAgLTM3LDExICszNyw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtNzMsOCArNjgsNiBAQAogI2RlZmluZSBDRkdfUlhfRVRIX0JVRkZFUgk4ICAvKiB1c2UgOCByeCBidWZmZXIgb24gZWVwcm8xMDAgICovCiAjZGVmaW5lIENPTkZJR19OUzgzODJYCQkxCiAKLSNkZWZpbmUgQUREX1BDSV9DTUQgCQlDRkdfQ01EX1BDSQotCiAvKiBQYXJ0aXRpb25zICovCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC04MiwyMCArNzUsMjkgQEAKIAogI2RlZmluZSBDT05GSUdfVElNRVNUQU1QCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIAotLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcwotICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlBRERfUENJX0NNRAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUENJCisKIAogI2lmIChURVhUX0JBU0UgPT0gMHhGRjAwMDAwMCkJCS8qIEJvb3QgbG93IHdpdGggMTYgTUIgRmxhc2ggKi8KICMgICBkZWZpbmUgQ0ZHX0xPV0JPT1QJCTEKQEAgLTI0Niw3ICsyNDgsNyBAQAogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMjYyLDYgKzI2NCwxMSBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKICAqIFZhcmlvdXMgbG93LWxldmVsIHNldHRpbmdzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9vY290ZWEuaCBiL2luY2x1ZGUvY29uZmlncy9vY290ZWEuaAppbmRleCA2OGU4Y2VjLi5iYzJmZDMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvb2NvdGVhLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL29jb3RlYS5oCkBAIC0yMzIsMjYgKzIzMiwzOCBAQAogCiAjZGVmaW5lIENPTkZJR19ORVRDT05TT0xFCQkvKiBpbmNsdWRlIE5ldENvbnNvbGUgc3VwcG9ydAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTI2MCw3ICsyNzIsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMTAsNyArMzIyLDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CS8qIEZvciBBTUNDIDQ0MCBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMzIyLDcgKzMzNCw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE1MTBpbm4uaCBiL2luY2x1ZGUvY29uZmlncy9vbWFwMTUxMGlubi5oCmluZGV4IDAxNmQzZDguLjg2MjNlZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9vbWFwMTUxMGlubi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9vbWFwMTUxMGlubi5oCkBAIC04NiwxMSArODYsMjQgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKICNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfREhDUCkKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJQ09ORklHX0JPT1RQX0RFRkFVTFQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKKwogI2luY2x1ZGUgPGNvbmZpZ3Mvb21hcDE1MTAuaD4KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKQEAgLTk4LDcgKzExMSw3IEBACiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdHA7dGZ0cDtib290bSIKICNkZWZpbmUgQ0ZHX0FVVE9MT0FECQkibiIJCS8qIE5vIGF1dG9sb2FkICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL29tYXAxNjEwaDIuaCBiL2luY2x1ZGUvY29uZmlncy9vbWFwMTYxMGgyLmgKaW5kZXggYzZjYTY4OS4uNzRiYmEwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL29tYXAxNjEwaDIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE2MTBoMi5oCkBAIC04MSwxMSArODEsMjQgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCTExNTIwMAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0RIQ1ApCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCUNPTkZJR19CT09UUF9ERUZBVUxUCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorCisKICNpbmNsdWRlIDxjb25maWdzL29tYXAxNTEwLmg+CiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCkBAIC05Myw3ICsxMDYsNyBAQAogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQgICAgICAiYm9vdHA7dGZ0cDtib290bSIKICNkZWZpbmUgQ0ZHX0FVVE9MT0FEICAgICAgICAgICAgIm4iICAgICAgICAgICAgIC8qIE5vIGF1dG9sb2FkICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9vbWFwMTYxMGlubi5oIGIvaW5jbHVkZS9jb25maWdzL29tYXAxNjEwaW5uLmgKaW5kZXggZjI4ZWRlMC4uNzM0ZjM1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL29tYXAxNjEwaW5uLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL29tYXAxNjEwaW5uLmgKQEAgLTgyLDExICs4MiwyNCBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJMTE1MjAwCiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfREhDUCkKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJQ09ORklHX0JPT1RQX0RFRkFVTFQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKKwogI2luY2x1ZGUgPGNvbmZpZ3Mvb21hcDE1MTAuaD4KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKQEAgLTk4LDcgKzExMSw3IEBACiAjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkxNTYuMTE3Ljk3LjEzOQkvKiBjdXJyZW50IElQIG9mIG15IGRldiBwYyAqLwogI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJInVJbWFnZSIJLyogZmlsZSB0byBsb2FkICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9vbWFwMjQyMGg0LmggYi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MjBoNC5oCmluZGV4IDU4Mzc0NjEuLjhhZThlZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9vbWFwMjQyMGg0LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL29tYXAyNDIwaDQuaApAQCAtMTE5LDE1ICsxMTksMzQgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgIDExNTIwMAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUgICAgICAgezk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMH0KIAotI2lmZGVmIENGR19OQU5EX0JPT1QKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICAgIChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfREhDUCB8IENGR19DTURfSTJDIHwgQ0ZHX0NNRF9OQU5EIHwgQ0ZHX0NNRF9KRkZTMikKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAgICAoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9ESENQIHwgQ0ZHX0NNRF9JMkMgfCBDRkdfQ01EX0pGRlMyKSAmIH5DRkdfQ01EX0FVVE9TQ1JJUFQpCi0jZW5kaWYKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgICAgICAgIENPTkZJR19CT09UUF9ERUZBVUxUCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjaWZkZWYgQ0ZHX05BTkRfQk9PVAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0kyQworICAgICNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisgICAgI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZWxzZQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0kyQworICAgICNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorCisgICAgI3VuZGVmIENPTkZJR19DTURfQVVUT1NDUklQVAorI2VuZGlmCisKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKIAogLyoKICAqICBCb2FyZCBOQU5EIEluZm8uCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvb21hcDU5MTJvc2suaCBiL2luY2x1ZGUvY29uZmlncy9vbWFwNTkxMm9zay5oCmluZGV4IDVkYjRmNTIuLjE2Y2UyZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9vbWFwNTkxMm9zay5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9vbWFwNTkxMm9zay5oCkBAIC04NiwxMSArODYsMjQgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCTExNTIwMAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0RIQ1ApCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCUNPTkZJR19CT09UUF9ERUZBVUxUCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorCisKICNpbmNsdWRlIDxjb25maWdzL29tYXAxNTEwLmg+CiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCkBAIC0xMDIsNyArMTE1LDcgQEAKICNkZWZpbmUgQ09ORklHX1NFUlZFUklQCTE1Ni4xMTcuOTcuMTM5CS8qIGN1cnJlbnQgSVAgb2YgbXkgZGV2IHBjICovCiAjZGVmaW5lIENPTkZJR19CT09URklMRQkidUltYWdlIgkvKiBmaWxlIHRvIGxvYWQgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL29tYXA3MzBwMi5oIGIvaW5jbHVkZS9jb25maWdzL29tYXA3MzBwMi5oCmluZGV4IGZkYTU1Y2YuLmM0ZDI1M2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9vbWFwNzMwcDIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDczMHAyLmgKQEAgLTkwLDE0ICs5MCwyNCBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCSAgIDExNTIwMAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJICAgeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJICAgKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9ESENQKQotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkgICBDT05GSUdfQk9PVFBfREVGQVVMVAogCiAvKgotICogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKworCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKworCiAjaW5jbHVkZSA8Y29uZmlncy9vbWFwNzMwLmg+CiAjaW5jbHVkZSA8Y29uZmlncy9oMl9wMl9kYmdfYm9hcmQuaD4KIApAQCAtMTEyLDcgKzEyMiw3IEBACiAjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJICAgMTkyLjE1MC4wLjEwMAogI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCSAgICJ1SW1hZ2UiICAvKiBGaWxlIHRvIGxvYWQgKi8KIAotI2lmIGRlZmluZWQgKENPTkZJR19DT01NQU5EUykgJiYgZGVmaW5lZCAoQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkgICAxMTUyMDAgICAgLyogU3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCSAgIDEJICAgICAvKiBXaGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3AzbXguaCBiL2luY2x1ZGUvY29uZmlncy9wM214LmgKaW5kZXggNTQ0NjJmMC4uOGFlMzhjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3AzbXguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcDNteC5oCkBAIC0yNTEsMjYgKzI1MSwzNiBAQAogI2VuZGlmCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcyAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0NBQ0hFICAgfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTI4MCw3ICsyOTAsNyBAQAogCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSAgICAgICAgIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC00MjEsNyArNDMxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIGFsbCBNUEM3NHh4IENQVXMJCSAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9wM3A0NDAuaCBiL2luY2x1ZGUvY29uZmlncy9wM3A0NDAuaAppbmRleCAyMmY5Zjg0Li41MWYxOWExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvcDNwNDQwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3AzcDQ0MC5oCkBAIC0xNjgsMjUgKzE2OCwzNyBAQAogCiAjZGVmaW5lIENPTkZJR19ORVRDT05TT0xFCQkvKiBpbmNsdWRlIE5ldENvbnNvbGUgc3VwcG9ydAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMTk1LDcgKzIwNyw3IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzA0LDcgKzMxNiw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkoMzI8PDEwKQkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC0zMTYsNyArMzI4LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9wYjF4MDAuaCBiL2luY2x1ZGUvY29uZmlncy9wYjF4MDAuaAppbmRleCBlZDE4OTNmLi44MTBlMGYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvcGIxeDAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3BiMXgwMC5oCkBAIC0xMzIsMTEgKzEzMiw4IEBACiAvKi0tLVVTQiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNpZiAwCiAjZGVmaW5lIENPTkZJR19VU0JfT0hDSQotI2RlZmluZSBBRERfVVNCX0NNRCAgICAgICAgICAgICBDRkdfQ01EX1VTQiB8IENGR19DTURfRkFUCiAjZGVmaW5lIENPTkZJR19VU0JfU1RPUkFHRQogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgotI2Vsc2UKLSNkZWZpbmUgQUREX1VTQl9DTUQgICAgICAgICAgICAgMAogI2VuZGlmCiAKIC8qLS0tQVRBIFBDTUNJQSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTc5LDExICsxNzYsMzYgQEAKICNkZWZpbmUgQ0ZHX0lDQUNIRV9TSVpFCQkxNjM4NAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJXAotICAoKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfREhDUCB8IENGR19DTURfRUxGIHwgQ0ZHX0NNRF9NSUkgfCBDRkdfQ01EX1BJTkcpICYgXAotIH4oQ0ZHX0NNRF9FTlYgfCBDRkdfQ01EX0ZBVCB8IENGR19DTURfRkxBU0ggfCBDRkdfQ01EX0ZQR0EgfCBDRkdfQ01EX0lERSB8IFwKLSAgIENGR19DTURfTE9BRFMgfCBDRkdfQ01EX1JVTiB8IENGR19DTURfTE9BREIgfCBDRkdfQ01EX0VMRiB8IFwKLSAgIENGR19DTURfQkRJIHwgQ0ZHX0NNRF9CRURCVUcpKSB8IEFERF9VU0JfQ01EKQotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKworI3VuZGVmIENPTkZJR19DTURfRU5WCisjdW5kZWYgQ09ORklHX0NNRF9GQVQKKyN1bmRlZiBDT05GSUdfQ01EX0ZMQVNICisjdW5kZWYgQ09ORklHX0NNRF9GUEdBCisjdW5kZWYgQ09ORklHX0NNRF9JREUKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9SVU4KKyN1bmRlZiBDT05GSUdfQ01EX0xPQURCCisjdW5kZWYgQ09ORklHX0NNRF9FTEYKKyN1bmRlZiBDT05GSUdfQ01EX0JESQorI3VuZGVmIENPTkZJR19DTURfQkVEQlVHCiAKICNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvcGNzNDQwZXAuaCBiL2luY2x1ZGUvY29uZmlncy9wY3M0NDBlcC5oCmluZGV4IDVlZTk3YzEuLjhlNTFkMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9wY3M0NDBlcC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9wY3M0NDBlcC5oCkBAIC0yNDcsMzkgKzI0Nyw0NyBAQAogI2RlZmluZSBDT05GSUdfSFdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyAqLwogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElBRwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1JFSVNFUgl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfVVNCCSkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfVVNCCiAKIAogI2RlZmluZSBDT05GSUdfU1VQUE9SVF9WRkFUCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkgICAgICAgICI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtNDM0LDcgKzQ0Miw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkoMzI8PDEwKSAvKiBGb3IgQU1DQyA0NDAgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKQEAgLTQ0Niw3ICs0NTQsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3BjdV9lLmggYi9pbmNsdWRlL2NvbmZpZ3MvcGN1X2UuaAppbmRleCA3M2FhM2E4Li5lM2M4ODQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvcGN1X2UuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcGN1X2UuaApAQCAtODksMjggKzg5LDM0IEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAjZGVmaW5lIENGR19TUElfSU5JVF9PRkZTRVQJCTB4QjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoCUNPTkZJR19DTURfREZMCXwgXAotCQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQkJQ0ZHX0NNRF9TTlRQCSkKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSyBcCi0gICAgKChDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpICYgfkNPTkZJR19CT09UUF9HQVRFV0FZKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3BkbmIzLmggYi9pbmNsdWRlL2NvbmZpZ3MvcGRuYjMuaAppbmRleCAwNmM2NjUyLi41YjViMGVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvcGRuYjMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcGRuYjMuaApAQCAtNzEsMjUgKzcxLDMzIEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgIDExNTIwMAogI2RlZmluZSBDRkdfSVhQNDI1X0NPTlNPTEUJSVhQNDI1X1VBUlQxICAgLyogd2UgdXNlIFVBUlQxIGZvciBjb25zb2xlICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TQ1BVKQotI2RlZmluZSBDTURfTkFORF9BREQJCTAKLSNlbHNlCi0jZGVmaW5lIENNRF9OQU5EX0FERAkJQ0ZHX0NNRF9OQU5ECisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKworI2lmICFkZWZpbmVkKENPTkZJR19TQ1BVKQorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ01EX05BTkRfQURECXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfUElORykKLQotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotLyogVGhlc2UgYXJlIHUtYm9vdCBnZW5lcmljIHBhcmFtZXRlcnMgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDT05GSUdfWkVST19CT09UREVMQVlfQ0hFQ0sJLyogY2hlY2sgZm9yIGtleXByZXNzIG9uIGJvb3RkZWxheT09MCAqLwogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvcGY1MjAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvcGY1MjAwLmgKaW5kZXggNzE1MWE5ZS4uMThkMGM4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3BmNTIwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9wZjUyMDAuaApAQCAtNDksMTEgKzQ5LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJICAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC05MCwxMyArODUsNiBAQAogI2RlZmluZSBDRkdfUlhfRVRIX0JVRkZFUgk4CS8qIHVzZSA4IHJ4IGJ1ZmZlciBvbiBlZXBybzEwMAkqLwogI2RlZmluZSBDT05GSUdfTlM4MzgyWAkJMQogI2VuZGlmCi0KLSNkZWZpbmUgQUREX1BDSV9DTUQJCUNGR19DTURfUENJCi0KLSNlbHNlCQkJCS8qIE1QQzUxMDAgKi8KLQotI2RlZmluZSBBRERfUENJX0NNRAkJMAkvKiBubyBDRkdfQ01EX1BDSSAqLwotCiAjZW5kaWYKIAogLyogUGFydGl0aW9ucyAqLwpAQCAtMTA2LDI2ICs5NCwzNSBAQAogLyogVVNCICovCiAjaWYgMAogI2RlZmluZSBDT05GSUdfVVNCX09IQ0kKLSNkZWZpbmUgQUREX1VTQl9DTUQJCUNGR19DTURfVVNCIHwgQ0ZHX0NNRF9GQVQKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCi0jZWxzZQotI2RlZmluZSBBRERfVVNCX0NNRAkJMAogI2VuZGlmCiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJIENGR19DTURfRkFUCXwgXAotCQkJCSBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgQ0ZHX0NNRF9JREUJfCBcCi0JCQkJIENGR19DTURfQlNQCXwgXAotCQkJCSBDRkdfQ01EX0VMRgl8IFwKLQkJCQkgQUREX1BDSV9DTUQJICApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKworI2lmZGVmIENPTkZJR19NUEM1MjAwCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZW5kaWYKKwogCiAjaWYgKFRFWFRfQkFTRSA9PSAweEZGMDAwMDAwKQkvKiBCb290IGxvdyB3aXRoIDE2IE1CIEZsYXNoICovCiAjICAgZGVmaW5lIENGR19MT1dCT09UCQkxCkBAIC0yNjMsNyArMjYwLDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMjgxLDYgKzI3OCwxMSBAQAogCiAjZGVmaW5lIENGR19WWFdPUktTX01BQ19QVFIJMHgwMDAwMDAwMAkvKiBQYXNzIEV0aGVybmV0IE1BQyB0byBWeFdvcmtzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3BsZWIyLmggYi9pbmNsdWRlL2NvbmZpZ3MvcGxlYjIuaAppbmRleCBhNmMyMzcxLi44NjMwMjlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvcGxlYjIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcGxlYjIuaApAQCAtNjYsMTAgKzY2LDIzIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAmIH5DRkdfQ01EX05FVCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI3VuZGVmIENPTkZJR19DTURfTkVUCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0VUSEFERFIJCTA4OjAwOjNlOjI2OjBhOjViCkBAIC04Myw3ICs5Niw3IEBACiAjZGVmaW5lIENPTkZJR19JTklUUkRfVEFHCiAjZGVmaW5lIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9wcG1jN3h4LmggYi9pbmNsdWRlL2NvbmZpZ3MvcHBtYzd4eC5oCmluZGV4IDA3MmI5ZGQuLmZlN2RlN2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9wcG1jN3h4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3BwbWM3eHguaApAQCAtMjUsNzUgKzI1LDkxIEBACiAvKgogICogRGVidWcKICAqCi0gKiBERUJVRwkJCS0gRGVmaW5lIHRoaXMgaXMgeW91IHdhbnQgZXh0cmEgZGVidWcgaW5mbwotICogR1RSRUdSRUFECQkJLSBSZXF1aXJlZCB0byBidWlsZCB3aXRoIGRlYnVnCi0gKiBkb19iZGluZm8JCQktIFJlcXVpcmVkIHRvIGJ1aWxkIHdpdGggZGVidWcKKyAqIERFQlVHCQktIERlZmluZSB0aGlzIGlzIHlvdSB3YW50IGV4dHJhIGRlYnVnIGluZm8KKyAqIEdUUkVHUkVBRAkJLSBSZXF1aXJlZCB0byBidWlsZCB3aXRoIGRlYnVnCisgKiBkb19iZGluZm8JCS0gUmVxdWlyZWQgdG8gYnVpbGQgd2l0aCBkZWJ1ZwogICovCiAKICN1bmRlZglERUJVRwotI2RlZmluZQlHVFJFR1JFQUQoeCkJCQkweEZGRkZGRkZGCisjaWZkZWYJREVCVUcKKyNkZWZpbmUJR1RSRUdSRUFEKHgpCTB4RkZGRkZGRkYKICNkZWZpbmUJZG9fYmRpbmZvKGEsYixjLGQpCi0KKyNlbmRpZgogCiAvKgogICogQ1BVIHR5cGUKICAqCi0gKiBDT05GSUdfN3h4CQkJLSBXZSBoYXZlIGEgNzUwIG9yIDc1NSBDUFUKLSAqIENPTkZJR183NHh4CQkJLSBXZSBoYXZlIGEgNzQwMCBDUFUKLSAqIENPTkZJR19BTFRJVkVDCQktIFdlIGhhdmUgYWx0aXZlYyBlbmFibGVkIENQVSAob25seSA3NDAwKQotICogQ09ORklHX0JVU19DTEsJCS0gU3lzdGVtIGJ1cyBjbG9jayBpbiBIegorICogQ09ORklHXzd4eAkJLSBXZSBoYXZlIGEgNzUwIG9yIDc1NSBDUFUKKyAqIENPTkZJR183NHh4CQktIFdlIGhhdmUgYSA3NDAwIENQVQorICogQ09ORklHX0FMVElWRUMJLSBXZSBoYXZlIGFsdGl2ZWMgZW5hYmxlZCBDUFUgKG9ubHkgNzQwMCkKKyAqIENPTkZJR19CVVNfQ0xLCS0gU3lzdGVtIGJ1cyBjbG9jayBpbiBIegogICovCiAKICNkZWZpbmUJQ09ORklHXzd4eAogI3VuZGVmCUNPTkZJR183NHh4CiAjdW5kZWYJQ09ORklHX0FMVElWRUMKLSNkZWZpbmUgQ09ORklHX0JVU19DTEsJCQk2NjAwMDAwMAorI2RlZmluZSBDT05GSUdfQlVTX0NMSwk2NjAwMDAwMAogCiAKIC8qCiAgKiBNb25pdG9yIGNvbmZpZ3VyYXRpb24KICAqCi0gKiBDT05GSUdfQ09NTUFORFMJCS0gTGlzdCBvZiBjb21tYW5kIHNldHMgdG8gaW5jbHVkZSBpbiBzaGVsbAorICogTGlzdCBvZiBjb21tYW5kIHNldHMgdG8gaW5jbHVkZSBpbiBzaGVsbAogICoKICAqIFRoZSBmb2xsb3dpbmcgY29tbWFuZCBzZXRzIGhhdmUgYmVlbiB0ZXN0ZWQgYW5kIGtub3duIHRvIHdvcms6CiAgKgotICogQ0ZHX0NNRF9DQUNIRQkJLSBDYWNoZSBjb250cm9sIGNvbW1hbmRzCi0gKiBDRkdfQ01EX01FTU9SWQkJLSBNZW1vcnkgZGlzcGxheSwgY2hhbmdlIGFuZCB0ZXN0IGNvbW1hbmRzCi0gKiBDRkdfQ01EX0ZMQVNICQktIEVyYXNlIGFuZCBwcm9ncmFtIGZsYXNoCi0gKiBDRkdfQ01EX0VOVgkJCS0gRW52aXJvbm1lbnQgY29tbWFuZHMKLSAqIENGR19DTURfUlVOCQkJLSBSdW4gY29tbWFuZHMgc3RvcmVkIGluIGVudiB2YXJzCi0gKiBDRkdfQ01EX0VMRgkJCS0gTG9hZCBFTEYgZmlsZXMKLSAqIENGR19DTURfTkVUCQkJLSBOZXR3b3JraW5nL2ZpbGUgZG93bmxvYWQgY29tbWFuZHMKLSAqIENGR19DTURfUElORwkJCS0gSUNNUCBFY2hvIFJlcXVlc3QgY29tbWFuZAotICogQ0ZHX0NNRF9QQ0kJCQktIFBDSSBCdXMgc2Nhbm5pbmcgY29tbWFuZAorICogQ01EX0NBQ0hFCQktIENhY2hlIGNvbnRyb2wgY29tbWFuZHMKKyAqIENNRF9NRU1PUlkJCS0gTWVtb3J5IGRpc3BsYXksIGNoYW5nZSBhbmQgdGVzdCBjb21tYW5kcworICogQ01EX0ZMQVNICQktIEVyYXNlIGFuZCBwcm9ncmFtIGZsYXNoCisgKiBDTURfRU5WCQktIEVudmlyb25tZW50IGNvbW1hbmRzCisgKiBDTURfUlVOCQktIFJ1biBjb21tYW5kcyBzdG9yZWQgaW4gZW52IHZhcnMKKyAqIENNRF9FTEYJCS0gTG9hZCBFTEYgZmlsZXMKKyAqIENNRF9ORVQJCS0gTmV0d29ya2luZy9maWxlIGRvd25sb2FkIGNvbW1hbmRzCisgKiBDTURfUElOCQktIElDTVAgRWNobyBSZXF1ZXN0IGNvbW1hbmQKKyAqIENNRF9QQ0kJCS0gUENJIEJ1cyBzY2FubmluZyBjb21tYW5kCiAgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggKENGR19DTURfREZMICYgfihDRkdfQ01EX0tHREIpKSB8CVwKLQkJCQkJCSAgIENGR19DTURfRkxBU0ggfAlcCi0JCQkJCQkgICBDRkdfQ01EX0VOViB8CVwKLQkJCQkJCSAgIENGR19DTURfUlVOIHwJXAotCQkJCQkJICAgQ0ZHX0NNRF9FTEYgfAlcCi0JCQkJCQkgICBDRkdfQ01EX05FVCB8CVwKLQkJCQkJCSAgIENGR19DTURfUElORyB8CVwKLQkJCQkJCSAgIENGR19DTURfUENJKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorCisjdW5kZWYgQ09ORklHX0NNRF9LR0RCCiAKIAogLyoKICAqIFNlcmlhbCBjb25maWd1cmF0aW9uCiAgKgogICogQ09ORklHX0NPTlNfSU5ERVgJCS0gU2VyaWFsIGNvbnNvbGUgcG9ydCBudW1iZXIgKENPTTEpCi0gKiBDT05GSUdfQkFVRFJBVEUJCQktIFNlcmlhbCBzcGVlZAorICogQ09ORklHX0JBVURSQVRFCQktIFNlcmlhbCBzcGVlZAogICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVgJCTEKLSNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkJOTYwMAorI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkxCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAogCiAKIC8qCiAgKiBQQ0kgY29uZmlnCiAgKgotICogQ09ORklHX1BDSQkJCQktIEVuYWJsZSBQQ0kgYnVzCi0gKiBDT05GSUdfUENJX1BOUAkJCS0gRW5hYmxlIFBsdWcgJiBQbGF5IHN1cHBvcnQKKyAqIENPTkZJR19QQ0kJCQktIEVuYWJsZSBQQ0kgYnVzCisgKiBDT05GSUdfUENJX1BOUAkJLSBFbmFibGUgUGx1ZyAmIFBsYXkgc3VwcG9ydAogICogQ09ORklHX1BDSV9TQ0FOX1NIT1cJCS0gRW5hYmxlIGRpc3BsYXkgb2YgZGV2aWNlcyBhdCBzdGFydHVwCiAgKi8KIApAQCAtMTA1LDkgKzEyMSw5IEBACiAvKgogICogTmV0d29yayBjb25maWcKICAqCi0gKiBDT05GSUdfTkVUX01VTFRJCQkJLSBTdXBwb3J0IGZvciBtdWx0aXBsZSBuZXR3b3JrIGludGVyZmFjZXMKLSAqIENPTkZJR19FRVBSTzEwMAkJCS0gSW50ZWwgODI1NXggRXRoZXJuZXQgQ29udHJvbGxlcgotICogQ09ORklHX0VFUFJPMTAwX1NST01fV1JJVEUgLSBFbmFibGUgd3JpdGluZyB0byBuZXR3b3JrIGNhcmQgUk9NCisgKiBDT05GSUdfTkVUX01VTFRJCQktIFN1cHBvcnQgZm9yIG11bHRpcGxlIG5ldHdvcmsgaW50ZXJmYWNlcworICogQ09ORklHX0VFUFJPMTAwCQktIEludGVsIDgyNTV4IEV0aGVybmV0IENvbnRyb2xsZXIKKyAqIENPTkZJR19FRVBSTzEwMF9TUk9NX1dSSVRFCS0gRW5hYmxlIHdyaXRpbmcgdG8gbmV0d29yayBjYXJkIFJPTQogICovCiAKICNkZWZpbmUJQ09ORklHX05FVF9NVUxUSQpAQCAtMTMwLDcgKzE0Niw3IEBACiAgKiBCb290IGNvbmZpZwogICoKICAqIENPTkZJR19CT09UQ09NTUFORAkJLSBDb21tYW5kKHMpIHRvIGV4ZWN1dGUgdG8gYXV0by1ib290Ci0gKiBDT05GSUdfQk9PVERFTEFZCQkJLSBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBhdXRvLWJvb3QgKGluIHNlYykKKyAqIENPTkZJR19CT09UREVMQVkJCS0gSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgYXV0by1ib290IChpbiBzZWMpCiAgKi8KIAogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJCVwKQEAgLTE0OSw4NyArMTY1LDg0IEBACiAgKi8KIAogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KLQogLyoKICAqIE1lbW9yeSBtYXAKICAqCiAgKiBUaGlzIGJvYXJkIHJ1bnMgaW4gYSBzdGFuZGFyZCBDSFJQIChNYXAtQikgY29uZmlndXJhdGlvbi4KICAqCi0gKglUeXBlCQlTdGFydAkJRW5kCQkJU2l6ZQlXaWR0aAlDaGlwIFNlbAorICoJVHlwZQkgICAgU3RhcnQJRW5kCSAgICBTaXplICAgIFdpZHRoICAgQ2hpcCBTZWwKICAqCS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tIC0tLS0tLS0gLS0tLS0tLSAtLS0tLS0tLQotICoJU0RSQU0JCTB4MDAwMDAwMDAJMHgwNDAwMDAwMAk2NE1CCTY0YgkJU0RSQU1DUzAKLSAqCVVzZXIgTEVEJ3MJMHg3ODAwMDAwMAkJCQkJCVJDUzMKLSAqCVVBUlQJCTB4N0MwMDAwMDAJCQkJCQlSQ1MyCi0gKglNYWlsYm94CQkweEZGMDAwMDAwCQkJCQkJUkNTMQotICoJRmxhc2gJCTB4RkZDMDAwMDAJMHhGRkZGRkZGRgk0TUIJNjRiCQlSQ1MwCisgKglTRFJBTQkgICAgMHgwMDAwMDAwMAkweDA0MDAwMDAwICA2NE1CICAgIDY0YgkgICAgU0RSQU1DUzAKKyAqCVVzZXIgTEVEJ3MgIDB4NzgwMDAwMDAJCQkJICAgIFJDUzMKKyAqCVVBUlQJICAgIDB4N0MwMDAwMDAJCQkJICAgIFJDUzIKKyAqCU1haWxib3gJICAgIDB4RkYwMDAwMDAJCQkJICAgIFJDUzEKKyAqCUZsYXNoCSAgICAweEZGQzAwMDAwCTB4RkZGRkZGRkYgICA0TUIgICAgNjRiCSAgICBSQ1MwCiAgKgogICogRmxhc2ggc2VjdG9ycyBhcmUgbGFpZCBvdXQgYXMgZm9sbG93cy4KICAqCi0gKglTZWN0b3IJU3RhcnQJCUVuZAkJCVNpemUJQ29tbWVudHMKKyAqCVNlY3RvcglTdGFydAkJRW5kCVNpemUJQ29tbWVudHMKICAqCS0tLS0tLS0gLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0gLS0tLS0tLSAtLS0tLS0tLS0tLQotICoJIDAJCTB4RkZDMDAwMDAJMHhGRkMzRkZGRgkyNTZLQgotICogICAxCQkweEZGQzQwMDAwCTB4RkZDN0ZGRkYJMjU2S0IKLSAqCSAyCQkweEZGQzgwMDAwCTB4RkZDQkZGRkYJMjU2S0IKLSAqCSAzCQkweEZGQ0MwMDAwCTB4RkZDRkZGRkYJMjU2S0IKLSAqCSA0CQkweEZGRDAwMDAwCTB4RkZEM0ZGRkYJMjU2S0IKLSAqCSA1CQkweEZGRDQwMDAwCTB4RkZEN0ZGRkYJMjU2S0IKLSAqCSA2CQkweEZGRDgwMDAwCTB4RkZEQkZGRkYJMjU2S0IKLSAqCSA3CQkweEZGREMwMDAwCTB4RkZERkZGRkYJMjU2S0IKLSAqICAgOAkJMHhGRkUwMDAwMAkweEZGRTNGRkZGCTI1NktCCi0gKgkgOQkJMHhGRkU0MDAwMAkweEZGRTdGRkZGCTI1NktCCi0gKiAgMTAJCTB4RkZFODAwMDAJMHhGRkVCRkZGRgkyNTZLQgotICogIDExCQkweEZGRUMwMDAwCTB4RkZFRkZGRkYJMjU2S0IKLSAqICAxMgkJMHhGRkYwMDAwMAkweEZGRjNGRkZGCTI1NktCCVUtQm9vdCBjb2RlIGhlcmUKLSAqICAxMwkJMHhGRkY0MDAwMAkweEZGRjdGRkZGCTI1NktCCi0gKiAgMTQJCTB4RkZGODAwMDAJMHhGRkZCRkZGRgkyNTZLQgotICogIDE1CQkweEZGRkMwMDAwCTB4RkZGREZGRkYJMTI4S0IKLSAqICAxNgkJMHhGRkZFMDAwMAkweEZGRkU3RkZGCSAzMktCCVUtQm9vdCBlbnYgdmFycyBoZXJlCi0gKiAgMTcJCTB4RkZGRTgwMDAJMHhGRkZFRkZGRgkgMzJLQglVLUJvb3QgYmFja3VwIGNvcHkgb2YgZW52IHZhcnMgaGVyZQotICogIDE4CQkweEZGRkYwMDAwCTB4RkZGRkZGRkYJIDY0S0IKKyAqCSAwCTB4RkZDMDAwMDAgIDB4RkZDM0ZGRkYJMjU2S0IKKyAqCSAxCTB4RkZDNDAwMDAgIDB4RkZDN0ZGRkYJMjU2S0IKKyAqCSAyCTB4RkZDODAwMDAgIDB4RkZDQkZGRkYJMjU2S0IKKyAqCSAzCTB4RkZDQzAwMDAgIDB4RkZDRkZGRkYJMjU2S0IKKyAqCSA0CTB4RkZEMDAwMDAgIDB4RkZEM0ZGRkYJMjU2S0IKKyAqCSA1CTB4RkZENDAwMDAgIDB4RkZEN0ZGRkYJMjU2S0IKKyAqCSA2CTB4RkZEODAwMDAgIDB4RkZEQkZGRkYJMjU2S0IKKyAqCSA3CTB4RkZEQzAwMDAgIDB4RkZERkZGRkYJMjU2S0IKKyAqCSA4CTB4RkZFMDAwMDAgIDB4RkZFM0ZGRkYJMjU2S0IKKyAqCSA5CTB4RkZFNDAwMDAgIDB4RkZFN0ZGRkYJMjU2S0IKKyAqCTEwCTB4RkZFODAwMDAgIDB4RkZFQkZGRkYJMjU2S0IKKyAqCTExCTB4RkZFQzAwMDAgIDB4RkZFRkZGRkYJMjU2S0IKKyAqCTEyCTB4RkZGMDAwMDAgIDB4RkZGM0ZGRkYJMjU2S0IJVS1Cb290IGNvZGUgaGVyZQorICoJMTMJMHhGRkY0MDAwMCAgMHhGRkY3RkZGRgkyNTZLQgorICoJMTQJMHhGRkY4MDAwMCAgMHhGRkZCRkZGRgkyNTZLQgorICoJMTUJMHhGRkZDMDAwMCAgMHhGRkZERkZGRgkxMjhLQgorICoJMTYJMHhGRkZFMDAwMCAgMHhGRkZFN0ZGRgkgMzJLQglVLUJvb3QgZW52IHZhcnMgaGVyZQorICoJMTcJMHhGRkZFODAwMCAgMHhGRkZFRkZGRgkgMzJLQglVLUJvb3QgYmFja3VwIGNvcHkgb2YgZW52IHZhcnMgaGVyZQorICoJMTgJMHhGRkZGMDAwMCAgMHhGRkZGRkZGRgkgNjRLQgogICovCiAKIAogLyoKICAqIFNEUkFNIGNvbmZpZyAtIHNlZSBtZW1vcnkgbWFwIGRldGFpbHMgYWJvdmUuCiAgKgotICogQ0ZHX1NEUkFNX0JBU0UJCQktIFN0YXJ0IGFkZHJlc3Mgb2YgU0RSQU0sIHRoaXMgX211c3RfIGJlIHplcm8hCi0gKiBDRkdfU0RSQU1fU0laRQkJCS0gVG90YWwgc2l6ZSBvZiBjb250aWd1b3VzIFNEUkFNIGJhbmsocykKKyAqIENGR19TRFJBTV9CQVNFCQktIFN0YXJ0IGFkZHJlc3Mgb2YgU0RSQU0sIHRoaXMgX211c3RfIGJlIHplcm8hCisgKiBDRkdfU0RSQU1fU0laRQkJLSBUb3RhbCBzaXplIG9mIGNvbnRpZ3VvdXMgU0RSQU0gYmFuayhzKQogICovCiAKLSNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UJCQkweDAwMDAwMDAwCi0jZGVmaW5lIENGR19TRFJBTV9TSVpFCQkJMHgwNDAwMDAwMAorI2RlZmluZSBDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfU0RSQU1fU0laRQkJMHgwNDAwMDAwMAogCiAKIC8qCiAgKiBGbGFzaCBjb25maWcgLSBzZWUgbWVtb3J5IG1hcCBkZXRhaWxzIGFib3ZlLgogICoKLSAqIENGR19GTEFTSF9CQVNFCQkJLSBTdGFydCBhZGRyZXNzIG9mIGZsYXNoIG1lbW9yeQotICogQ0ZHX0ZMQVNIX1NJWkUJCQktIFRvdGFsIHNpemUgb2YgY29udGlndW91cyBmbGFzaCBtZW0KKyAqIENGR19GTEFTSF9CQVNFCQktIFN0YXJ0IGFkZHJlc3Mgb2YgZmxhc2ggbWVtb3J5CisgKiBDRkdfRkxBU0hfU0laRQkJLSBUb3RhbCBzaXplIG9mIGNvbnRpZ3VvdXMgZmxhc2ggbWVtCiAgKiBDRkdfRkxBU0hfRVJBU0VfVE9VVAkJLSBFcmFzZSB0aW1lb3V0IGluIG1zCiAgKiBDRkdfRkxBU0hfV1JJVEVfVE9VVAkJLSBXcml0ZSB0aW1lb3V0IGluIG1zCiAgKiBDRkdfTUFYX0ZMQVNIX0JBTktTCQktIE51bWJlciBvZiBiYW5rcyBvZiBmbGFzaCBvbiBib2FyZAogICogQ0ZHX01BWF9GTEFTSF9TRUNUCQktIE51bWJlciBvZiBzZWN0b3JzIGluIGEgYmFuawogICovCiAKLSNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCQkweEZGQzAwMDAwCi0jZGVmaW5lIENGR19GTEFTSF9TSVpFCQkJMHgwMDQwMDAwMAorI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhGRkMwMDAwMAorI2RlZmluZSBDRkdfRkxBU0hfU0laRQkJMHgwMDQwMDAwMAogI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVAkyNTAwMDAKICNkZWZpbmUgQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQJNTAwMAotI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCQkxCi0jZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAkJMTkKKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCisjZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAkxOQogCiAKIC8qCiAgKiBNb25pdG9yIGNvbmZpZyAtIHNlZSBtZW1vcnkgbWFwIGRldGFpbHMgYWJvdmUKICAqCi0gKiBDRkdfTU9OSVRPUl9CQVNFCQkJLSBCYXNlIGFkZHJlc3Mgb2YgbW9uaXRvciBjb2RlCi0gKiBDRkdfTUFMTE9DX0xFTgkJCS0gU2l6ZSBvZiBtYWxsb2MgcG9vbCAoMTI4S0IpCisgKiBDRkdfTU9OSVRPUl9CQVNFCQktIEJhc2UgYWRkcmVzcyBvZiBtb25pdG9yIGNvZGUKKyAqIENGR19NQUxMT0NfTEVOCQktIFNpemUgb2YgbWFsbG9jIHBvb2wgKDEyOEtCKQogICovCiAKLSNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQkJVEVYVF9CQVNFCi0jZGVmaW5lIENGR19NQUxMT0NfTEVOCQkJMHgyMDAwMAorI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVRFWFRfQkFTRQorI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJMHgyMDAwMAogCiAKIC8qCkBAIC0yNDcsMTYgKzI2MCwxNiBAQAogICogQ0ZHX1BST01QVAkJCS0gUHJvbXB0IHN0cmluZwogICovCiAKLSNkZWZpbmUgQ0ZHX0JBUkdTSVpFCQkJMTAyNAotI2RlZmluZSBDRkdfQk9PVE1BUFNaCQkJMHg4MDAwMDAKLSNkZWZpbmUgQ0ZHX0NCU0laRQkJCTEwMjQKLSNkZWZpbmUgQ0ZHX0xPQURfQUREUgkJCTB4MTAwMDAwCisjZGVmaW5lIENGR19CQVJHU0laRQkJMTAyNAorI2RlZmluZSBDRkdfQk9PVE1BUFNaCQkweDgwMDAwMAorI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CisjZGVmaW5lIENGR19MT0FEX0FERFIJCTB4MTAwMDAwCiAjZGVmaW5lIENGR19MT05HSEVMUAotI2RlZmluZSBDRkdfTUFYQVJHUwkJCTE2Ci0jZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCQkweDAwMDQwMDAwCi0jZGVmaW5lIENGR19NRU1URVNUX0VORAkJCTB4MDAwNDAxMDAKLSNkZWZpbmUgQ0ZHX1BCU0laRQkJCTEwMjQKLSNkZWZpbmUgQ0ZHX1BST01QVAkJCSI9PiAiCisjZGVmaW5lIENGR19NQVhBUkdTCQkxNgorI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDAwMDQwMDAwCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwMDA0MDEwMAorI2RlZmluZSBDRkdfUEJTSVpFCQkxMDI0CisjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCiAKIAogLyoKQEAgLTI2OCwxMiArMjgxLDEyIEBACiAgKiBDRkdfRU5WX1NFQ1RfU0laRQkJLSBTaXplIG9mIHNlY3RvciBjb250YWluaW5nIGVudiB2YXJzICgzMktCKQogICovCiAKLSNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9GTEFTSAkJMQotI2RlZmluZSBDRkdfRU5WX0FERFIJCQkweEZGRkUwMDAwCi0jZGVmaW5lIENGR19FTlZfU0laRQkJCTB4MTAwMAotI2RlZmluZSBDRkdfRU5WX0FERFJfUkVEVU5ECQkweEZGRkU4MDAwCi0jZGVmaW5lIENGR19FTlZfU0laRV9SRURVTkQJCTB4MTAwMAotI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkJMHg4MDAwCisjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQorI2RlZmluZSBDRkdfRU5WX0FERFIJCTB4RkZGRTAwMDAKKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDEwMDAKKyNkZWZpbmUgQ0ZHX0VOVl9BRERSX1JFRFVORAkweEZGRkU4MDAwCisjZGVmaW5lIENGR19FTlZfU0laRV9SRURVTkQJMHgxMDAwCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTB4ODAwMAogCiAKIC8qCkBAIC0yODQsMTUgKzI5NywxNSBAQAogICogY29waWVkIHRvIHRvcCBvZiBSQU0gYnkgdGhlIGluaXQgY29kZS4KICAqCiAgKiBDRkdfSU5JVF9SQU1fQUREUgkJLSBBZGRyZXNzIG9mIEluaXQgUkFNLCBhYm92ZSBleGNlcHRpb24gdmVjdAotICogQ0ZHX0lOSVRfUkFNX0VORAkJCS0gU2l6ZSBvZiBJbml0IFJBTQorICogQ0ZHX0lOSVRfUkFNX0VORAkJLSBTaXplIG9mIEluaXQgUkFNCiAgKiBDRkdfR0JMX0RBVEFfU0laRQkJLSBBbW1vdW50IG9mIFJBTSB0byByZXNlcnZlIGZvciBnbG9iYWwgZGF0YQogICogQ0ZHX0dCTF9EQVRBX09GRlNFVAkJLSBTdGFydCBvZiBnbG9iYWwgZGF0YSwgdG9wIG9mIHN0YWNrCiAgKi8KIAotI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUgkJKENGR19TRFJBTV9CQVNFICsgMHg0MDAwKQotI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECQkweDQwMDAKLSNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJCTEyOAotI2RlZmluZSBDRkdfR0JMX0RBVEFfT0ZGU0VUCQkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQorI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUgkoQ0ZHX1NEUkFNX0JBU0UgKyAweDQwMDApCisjZGVmaW5lIENGR19JTklUX1JBTV9FTkQJMHg0MDAwCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFCTEyOAorI2RlZmluZSBDRkdfR0JMX0RBVEFfT0ZGU0VUCShDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCiAKIAogLyoKQEAgLTMyOSw3MSArMzQyLDcxIEBACiAgKiBDYWNoZSBjb25maWcKICAqCiAgKiBDRkdfQ0FDSEVMSU5FX1NJWkUJCS0gU2l6ZSBvZiBhIGNhY2hlIGxpbmUgKENQVSBzcGVjaWZpYykKLSAqIENGR19MMgkJCQkJLSBMMiBjYWNoZSBlbmFibGVkIGlmIGRlZmluZWQKLSAqIEwyX0lOSVQJCQkJCS0gTDIgY2FjaGUgaW5pdCBmbGFncwotICogTDJfRU5BQkxFCQkJCS0gTDIgY2FjaGUgZW5hYmxlIGZsYWdzCisgKiBDRkdfTDIJCQktIEwyIGNhY2hlIGVuYWJsZWQgaWYgZGVmaW5lZAorICogTDJfSU5JVAkJCS0gTDIgY2FjaGUgaW5pdCBmbGFncworICogTDJfRU5BQkxFCQkJLSBMMiBjYWNoZSBlbmFibGUgZmxhZ3MKICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkJMzIKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCiAjdW5kZWYJQ0ZHX0wyCi0jZGVmaW5lIEwyX0lOSVQJCQkJCTAKLSNkZWZpbmUgTDJfRU5BQkxFCQkJCTAKKyNkZWZpbmUgTDJfSU5JVAkJCTAKKyNkZWZpbmUgTDJfRU5BQkxFCQkwCiAKIAogLyoKICAqIENsb2NrcyBjb25maWcKICAqCi0gKiBDRkdfQlVTX0haCQkJCS0gQnVzIGNsb2NrIGZyZXF1ZW5jeSBpbiBIegotICogQ0ZHX0JVU19DTEsJCQkJLSBBcyBhYm92ZSAoPykKLSAqIENGR19IWgkJCQkJLSBEZWNyZW1lbnRlciBmcmVxIGluIEh6CisgKiBDRkdfQlVTX0haCQkJLSBCdXMgY2xvY2sgZnJlcXVlbmN5IGluIEh6CisgKiBDRkdfQlVTX0NMSwkJCS0gQXMgYWJvdmUgKD8pCisgKiBDRkdfSFoJCQktIERlY3JlbWVudGVyIGZyZXEgaW4gSHoKICAqLwogCi0jZGVmaW5lIENGR19CVVNfSFoJCQkJQ09ORklHX0JVU19DTEsKLSNkZWZpbmUgQ0ZHX0JVU19DTEsJCQkJQ09ORklHX0JVU19DTEsKLSNkZWZpbmUgQ0ZHX0haCQkJCQkxMDAwCisjZGVmaW5lIENGR19CVVNfSFoJCUNPTkZJR19CVVNfQ0xLCisjZGVmaW5lIENGR19CVVNfQ0xLCQlDT05GSUdfQlVTX0NMSworI2RlZmluZSBDRkdfSFoJCQkxMDAwCiAKIAogLyoKICAqIFNlcmlhbCBwb3J0IGNvbmZpZwogICoKICAqIENGR19CQVVEUkFURV9UQUJMRQkJLSBMaXN0IG9mIHZhbGlkIGJhdWQgcmF0ZXMKLSAqIENGR19OUzE2NTUwCQkJCS0gSW5jbHVkZSB0aGUgTlMxNjU1MCBkcml2ZXIKKyAqIENGR19OUzE2NTUwCQkJLSBJbmNsdWRlIHRoZSBOUzE2NTUwIGRyaXZlcgogICogQ0ZHX05TMTY1NTBfU0VSSUFMCQktIEluY2x1ZGUgdGhlIHNlcmlhbCAod3JhcHBlcikgZHJpdmVyCi0gKiBDRkdfTlMxNjU1MF9DTEsJCQktIEZyZXF1ZW5jeSBvZiByZWZlcmVuY2UgY2xvY2sKKyAqIENGR19OUzE2NTUwX0NMSwkJLSBGcmVxdWVuY3kgb2YgcmVmZXJlbmNlIGNsb2NrCiAgKiBDRkdfTlMxNjU1MF9SRUdfU0laRQkJLSA2NC1iaXQgYWNjZXNzZXMgdG8gOC1iaXQgcG9ydAotICogQ0ZHX05TMTY1NTBfQ09NMQkJCS0gQmFzZSBhZGRyZXNzIG9mIDFzdCBzZXJpYWwgcG9ydAorICogQ0ZHX05TMTY1NTBfQ09NMQkJLSBCYXNlIGFkZHJlc3Mgb2YgMXN0IHNlcmlhbCBwb3J0CiAgKi8KIAotI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KICNkZWZpbmUgQ0ZHX05TMTY1NTAKICNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCi0jZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJCTM2ODY0MDAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQkzNjg2NDAwCiAjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFCS04Ci0jZGVmaW5lIENGR19OUzE2NTUwX0NPTTEJCTB4N0MwMDAwMDAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMQkweDdDMDAwMDAwCiAKIAogLyoKICAqIFBDSSBDb25maWcgLSBBZGRyZXNzIE1hcCBCIChDSFJQKQogICovCiAKLSNkZWZpbmUgQ0ZHX1BDSV9NRU1PUllfQlVTICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBDRkdfUENJX01FTU9SWV9QSFlTICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIENGR19QQ0lfTUVNT1JZX1NJWkUgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgQ0ZHX1BDSV9NRU1fQlVTICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBDRkdfUENJX01FTV9QSFlTICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIENGR19QQ0lfTUVNX1NJWkUgICAgICAgIDB4N0QwMDAwMDAKLSNkZWZpbmUgQ0ZHX0lTQV9NRU1fQlVTICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBDRkdfSVNBX01FTV9QSFlTICAgICAgICAweEZEMDAwMDAwCi0jZGVmaW5lIENGR19JU0FfTUVNX1NJWkUgICAgICAgIDB4MDEwMDAwMDAKLSNkZWZpbmUgQ0ZHX1BDSV9JT19CVVMgICAgICAgICAgMHgwMDgwMDAwMAotI2RlZmluZSBDRkdfUENJX0lPX1BIWVMgICAgICAgICAweEZFODAwMDAwCi0jZGVmaW5lIENGR19QQ0lfSU9fU0laRSAgICAgICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgQ0ZHX0lTQV9JT19CVVMgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBDRkdfSVNBX0lPX1BIWVMgICAgICAgICAweEZFMDAwMDAwCi0jZGVmaW5lIENGR19JU0FfSU9fU0laRSAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSV9NRU1PUllfQlVTCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSV9NRU1PUllfUEhZUwkweDAwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lfTUVNT1JZX1NJWkUJMHg0MDAwMDAwMAorI2RlZmluZSBDRkdfUENJX01FTV9CVVMJCTB4ODAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSV9NRU1fUEhZUwkweDgwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lfTUVNX1NJWkUJMHg3RDAwMDAwMAorI2RlZmluZSBDRkdfSVNBX01FTV9CVVMJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0lTQV9NRU1fUEhZUwkweEZEMDAwMDAwCisjZGVmaW5lIENGR19JU0FfTUVNX1NJWkUJMHgwMTAwMDAwMAorI2RlZmluZSBDRkdfUENJX0lPX0JVUwkJMHgwMDgwMDAwMAorI2RlZmluZSBDRkdfUENJX0lPX1BIWVMJCTB4RkU4MDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSV9JT19TSVpFCQkweDAwNDAwMDAwCisjZGVmaW5lIENGR19JU0FfSU9fQlVTCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19JU0FfSU9fUEhZUwkJMHhGRTAwMDAwMAorI2RlZmluZSBDRkdfSVNBX0lPX1NJWkUJCTB4MDA4MDAwMDAKICNkZWZpbmUgQ0ZHX0lTQV9JT19CQVNFX0FERFJFU1MgQ0ZHX0lTQV9JT19QSFlTCi0jZGVmaW5lIENGR19JU0FfSU8gICAgICAgICAgICAgIENGR19JU0FfSU9fUEhZUwotI2RlZmluZSBDRkdfNjBYX1BDSV9JT19PRkZTRVQgICBDRkdfSVNBX0lPX1BIWVMKKyNkZWZpbmUgQ0ZHX0lTQV9JTwkJQ0ZHX0lTQV9JT19QSFlTCisjZGVmaW5lIENGR182MFhfUENJX0lPX09GRlNFVAlDRkdfSVNBX0lPX1BIWVMKIAogCiAvKgpAQCAtNDA4LDEyICs0MjEsMTIgQEAKIC8qCiAgKiBCb290IGZsYWdzCiAgKgotICogQk9PVEZMQUdfQ09MRAkJCS0gSW5kaWNhdGVzIGEgcG93ZXItb24gYm9vdAotICogQk9PVEZMQUdfV0FSTQkJCS0gSW5kaWNhdGVzIGEgc29mdHdhcmUgcmVzZXQKKyAqIEJPT1RGTEFHX0NPTEQJCS0gSW5kaWNhdGVzIGEgcG93ZXItb24gYm9vdAorICogQk9PVEZMQUdfV0FSTQkJLSBJbmRpY2F0ZXMgYSBzb2Z0d2FyZSByZXNldAogICovCiAKLSNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJCTB4MDEKLSNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJCTB4MDIKKyNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQorI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCiAKIAogI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9wcG1jODI2MC5oIGIvaW5jbHVkZS9jb25maWdzL3BwbWM4MjYwLmgKaW5kZXggZDY3MWRjYy4uZmI1YWU5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3BwbWM4MjYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3BwbWM4MjYwLmgKQEAgLTE2OSw4ICsxNjksNyBAQAogICogZm9yIEZDQykKICAqCiAgKiBpZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMgbXVzdCBiZQotICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QgYmUgcmVtb3ZlZAotICogZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCisgKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQgbXVzdCBiZSB1bnNldC4KICAqLwogCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogZGVmaW5lIGlmIGV0aGVybmV0IG9uIFNDQwkqLwpAQCAtMjYxLDEzICsyNjAsMTcgQEAKIAkiYm9vdG0iCiAjZW5kaWYgLyogQ09ORklHX0JPT1RfUk9PVF9ORlMgKi8KIAotLyogQWRkIHN1cHBvcnQgZm9yIGEgZmV3IGV4dHJhIGJvb3RwIG9wdGlvbnMgbGlrZToKLSAqCS0gRmlsZSBzaXplCi0gKgktIEROUworCisvKgorICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUykKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKKwogCiAvKiB1bmRlZiB0aGlzIHRvIHNhdmUgbWVtb3J5ICovCiAjZGVmaW5lIENGR19MT05HSEVMUApAQCAtMjc1LDE0ICsyNzgsMjAgQEAKIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIKIAotLyogV2hhdCBVLUJvb3Qgc3Vic3l0ZW1zIGRvIHlvdSB3YW50IGVuYWJsZWQ/ICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCgoQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfS0dEQikpKSB8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8gfCBcCi0JCQkJQ0ZHX0NNRF9NRU1URVNUIHwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfSU1NQVApCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX01FTVRFU1QKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorCisjdW5kZWYgQ09ORklHX0NNRF9LR0RCCiAKIAogLyogV2hlcmUgZG8gdGhlIGludGVybmFsIHJlZ2lzdGVycyBsaXZlPyAqLwpAQCAtMjk4LDEzICszMDcsMTAgQEAKICNkZWZpbmUgQ09ORklHX1BQTUM4MjYwCQkxCS8qIG9uIGFuIFdpbmQgUml2ZXIgUFBNQzgyNjAgQm9hcmQgICovCiAjZGVmaW5lIENPTkZJR19DUE0yCQkxCS8qIEhhcyBhIENQTTIgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSAgICAgKi8KICNlbHNlCiAjICBkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSAgICAgKi8KQEAgLTQ3Nyw3ICs0ODMsNyBAQAogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI2MCBDUFUgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvcHVycGxlLmggYi9pbmNsdWRlL2NvbmZpZ3MvcHVycGxlLmgKaW5kZXggMmVjYjdmYi4uNmViNjE4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3B1cnBsZS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9wdXJwbGUuaApAQCAtODEsOCArODEsMjMgQEAKIAkiIgogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInJ1biBmbGFzaF9zZWxmIgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0VMRikKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorCiAKICNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UJCTB4ODAwMDAwMDAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3B4YTI1NV9pZHAuaCBiL2luY2x1ZGUvY29uZmlncy9weGEyNTVfaWRwLmgKaW5kZXggZTVlMjc3Mi4uMGU4ODRmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3B4YTI1NV9pZHAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcHhhMjU1X2lkcC5oCkBAIC0xMDIsMTAgKzEwMiwyNSBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX01NQyB8IENGR19DTURfRkFUIHwgQ0ZHX0NNRF9ESENQICkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX01NQworI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDQwMDAwIgpAQCAtMTkyLDcgKzIwNyw3IEBACiAvKgkJCSJwcm90ZWN0IG9mZiIJKi8KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9xdWFudHVtLmggYi9pbmNsdWRlL2NvbmZpZ3MvcXVhbnR1bS5oCmluZGV4IDIxZWM1YWMuLmY0OWUyYjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9xdWFudHVtLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3F1YW50dW0uaApAQCAtOTIsMTggKzkyLDI4IEBACiAjZGVmaW5lIENGR19OVlJBTV9TSVpFIDIwNDgKIAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU05UUAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfQVVUT0JPT1RfS0VZRUQJLyogRW5hYmxlIHBhc3N3b3JkIHByb3RlY3Rpb24gKi8KICNkZWZpbmUgQ09ORklHX0FVVE9CT09UX1BST01QVAkJIlxuRW50ZXIgcGFzc3dvcmQgLSBhdXRvYm9vdCBpbiAlZCBzZWMuLi5cbiIKQEAgLTExMyw3ICsxMjMsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNzIsNyArMTgyLDcgQEAKICNlbmRpZgogCiAvKiUlJSAjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweEZGRjAwMDAwICovCi0jaWYgZGVmaW5lZChERUJVRykgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9JREUpCiAjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDI1NiA8PCAxMCkJLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbml0b3IJKi8KICNlbHNlCiAjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDEyOCA8PCAxMCkJLyogUmVzZXJ2ZSAxMjgga0IgZm9yIE1vbml0b3IJKi8KQEAgLTIyMiw3ICsyMzIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvcjUyMDAuaCBiL2luY2x1ZGUvY29uZmlncy9yNTIwMC5oCmluZGV4IGUxZTQwNmIuLjBlNzQzYmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9yNTIwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9yNTIwMC5oCkBAIC02NiwxMCArNjYsMjcgQEAKICNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9GTEFTSAkxCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX05FVCApICYgfihDRkdfQ01EX0xPQURTIHwgQ0ZHX0NNRF9MT0FEQikpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEQgorCiAKIC8qIE5vdGU6IFdlIG9ubHkgY29weSBvbmUgc2VjdG9ycyB3b3J0aCBvZiBhcHBsaWNhdGlvbiBjb2RlIGZyb20gbG9jYXRpb24KICAqIDEwMjAwMDAwIGZvciBzcGVlZCBwdXJwb3Nlcy4gIEluY3JlYXNlIHRoZSBzaXplIGlmIG5lY2Vzc2FyeSAqLwpAQCAtNzksNyArOTYsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUCQkidS1ib290PiAiCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvcm11LmggYi9pbmNsdWRlL2NvbmZpZ3Mvcm11LmgKaW5kZXggYjMxOWNmNC4uMmNhNjBiNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3JtdS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ybXUuaApAQCAtODcsMTcgKzg3LDI4IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lCUNPTkZJR19BVVRPQk9PVF9LRVlFRAkJLyogRW5hYmxlIHBhc3N3b3JkIHByb3RlY3Rpb24gKi8KICNkZWZpbmUJQ09ORklHX0FVVE9CT09UX1BST01QVAkJIlxuRW50ZXIgcGFzc3dvcmQgLSBhdXRvYm9vdCBpbiAlZCBzZWMuLi5cbiIKQEAgLTEwOCw3ICsxMTksNyBAQAogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNTIsNyArMTYzLDcgQEAKICAqLwogI2RlZmluZQlDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAogI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJKDAtZmxhc2hfaW5mb1swXS5zaXplKQkvKiBQdXQgZmxhc2ggYXQgZW5kCSovCi0jaWYgZGVmaW5lZChERUJVRykgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9JREUpCiAjZGVmaW5lCUNGR19NT05JVE9SX0xFTgkJKDI1NiA8PCAxMCkJLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbml0b3IJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19NT05JVE9SX0xFTgkJKDEyOCA8PCAxMCkJLyogUmVzZXJ2ZSAxMjgga0IgZm9yIE1vbml0b3IJKi8KQEAgLTE5Myw3ICsyMDQsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvcnNkcHJvdG8uaCBiL2luY2x1ZGUvY29uZmlncy9yc2Rwcm90by5oCmluZGV4IDZjOWUzOTIuLjgxNDA4MmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9yc2Rwcm90by5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9yc2Rwcm90by5oCkBAIC02NCw4ICs2NCw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogZGVmaW5lIGlmIGV0aGVybmV0IG9uIFNDQwkqLwogI2RlZmluZQlDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBkZWZpbmUgaWYgZXRoZXJuZXQgb24gRkNDCSovCkBAIC0xMDIsNyArMTAxLDIzIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAmIH5DRkdfQ01EX0tHREIpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX0tHREIKKwogCiAvKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBib290IGZyb20gMHgwMDAwMDEwMC4gSWYgeW91IGRvbid0IGRlZmluZQogICogdGhpcywgeW91IHdpbGwgbmVlZCB0byBwcm9ncmFtIHRoZSBib290bG9hZGVyIHRvIDB4ZmZmMDAwMDAsIGFuZApAQCAtMTEyLDE1ICsxMjcsMTIgQEAKICAqLwogI2RlZmluZSBDRkdfUlNEX0JPT1RfTE9XIDEKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJkZXZmcz1tb3VudCByb290PXJhbWZzIgogI2RlZmluZSBDT05GSUdfRVRIQUREUgkJMDg6MDA6M2U6MjY6MGE6NWEKICNkZWZpbmUgQ09ORklHX05FVE1BU0sgICAgICAgICAgMjU1LjI1NS4wLjAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCkBAIC0xMzAsNyArMTQyLDcgQEAKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI4Nyw3ICsyOTksNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI2MCBDUFUJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zYWNzbmcuaCBiL2luY2x1ZGUvY29uZmlncy9zYWNzbmcuaAppbmRleCA5N2I1MmZhLi5jNDc0YWNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc2Fjc25nLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NhY3NuZy5oCkBAIC0xNTksOCArMTU5LDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KIAogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MKQEAgLTQ3MCwxNiArNDY5LDE4IEBACiAKICNkZWZpbmUgQ09ORklHX0JPT1RQX1JBTkRPTV9ERUxBWSAgICAgICAvKiBSYW5kb21pemUgdGhlIEJPT1RQIHJldHJ5IGRlbGF5ICovCiAKLS8qIEFkZCBzdXBwb3J0IGZvciBhIGZldyBleHRyYSBib290cCBvcHRpb25zIGxpa2U6Ci0gKgktIEZpbGUgc2l6ZQotICoJLSBETlMgKHVwIHRvIDIgc2VydmVycykKLSAqICAgICAgLSBTZW5kIGhvc3RuYW1lIHRvIERIQ1Agc2VydmVyCisvKgorICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUyB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUzIgfCBcCi0JCQkJIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FKQorI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgIENPTkZJR19CT09UUF9ETlMKKyNkZWZpbmUgIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lICBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQorCiAKIC8qIHVuZGVmIHRoaXMgdG8gc2F2ZSBtZW1vcnkgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCkBAIC01MDIsMzEgKzUwMywyOCBAQAogICovCiAjZGVmaW5lIENPTkZJR19WRVJTSU9OX1ZBUklBQkxFCiAKLS8qIFdoYXQgVS1Cb290IHN1YnN5dGVtcyBkbyB5b3Ugd2FudCBlbmFibGVkPyAqLworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1NQSQorI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfUElORworCisjdW5kZWYgQ09ORklHX0NNRF9LR0RCCisKICNpZmRlZiBDT05GSUdfRVRIRVJfT05fRkNDCi0jIGRlZmluZSBDT05GSUdfQ09NTUFORFMJKCgoQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfS0dEQikpKSB8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX1NQSQl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNICAgfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfSU1NQVAJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfTUlJCSkKLSNlbHNlCi0jIGRlZmluZSBDT05GSUdfQ09NTUFORFMJKCgoQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfS0dEQikpKSB8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX1NQSQl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNICAgfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfSU1NQVAJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCSkKLSNlbmRpZiAvKiBDT05GSUdfRVRIRVJfT05fRkNDICovCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZW5kaWYKKwogCiAvKiBXaGVyZSBkbyB0aGUgaW50ZXJuYWwgcmVnaXN0ZXJzIGxpdmU/ICovCiAjZGVmaW5lIENGR19JTU1SCQkweEYwMDAwMDAwCkBAIC01NDQsMTAgKzU0Miw2IEBACiAjZGVmaW5lIENPTkZJR19TQUNTbmcJCTEJLyogbXVuZ2VkIGZvciB0aGUgU0FDU25nICovCiAjZGVmaW5lIENPTkZJR19DUE0yCQkxCS8qIEhhcyBhIENQTTIgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCi0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KQEAgLTU4OSw3ICs1ODMsNyBAQAogI2RlZmluZSBDRkdfVEZUUF9USU1FT1VUX0NPVU5UIDUgICAgICAgIC8qIEhvdyBtYW55IHRpbWVvdXRzIFRGVFAgd2lsbCBhbGxvdyAqLwogCQkJCQkvKiBiZWZvcmUgaXQgZ2l2ZXMgdXAuICAgICAgICAgICAgICAgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkgICAgICovCiAjZWxzZQogIyAgZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkgICAgICovCkBAIC03MzIsNyArNzI2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NiYzI0MTB4LmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjMjQxMHguaAppbmRleCA4NjZmN2IwLi5iNGEwNjNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc2JjMjQxMHguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjMjQxMHguaApAQCAtODIsMjQgKzgyLDI5IEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb21tYW5kIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIFwKLQkJCShDT05GSUdfQ01EX0RGTAkgfCBcCi0JCQlDRkdfQ01EX0NBQ0hFCSB8IFwKLQkJCS8qQ0ZHX0NNRF9OQU5ECSB8Ki8gXAotCQkJLypDRkdfQ01EX0VFUFJPTSB8Ki8gXAotCQkJLypDRkdfQ01EX0kyQwkgfCovIFwKLQkJCS8qQ0ZHX0NNRF9VU0IJIHwqLyBcCi0JCQlDRkdfQ01EX1JFR0lORk8gIHwgXAotCQkJQ0ZHX0NNRF9EQVRFCSB8IFwKLQkJCUNGR19DTURfUElORyAgICAgfCBcCi0JCQlDRkdfQ01EX0RIQ1AgICAgIHwgXAotCQkJQ0ZHX0NNRF9FTEYpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJjb25zb2xlPXR0eVNBQzAgcm9vdD0vZGV2L25mcyBuZnNyb290PTE5Mi4xNjguMC4xOi9mcmllbmRseS1hcm0vcm9vdGZzX25ldHNlcnYgaXA9MTkyLjE2OC4wLjY5OjE5Mi4xNjguMC4xOjE5Mi4xNjguMC4xOjI1NS4yNTUuMjU1LjA6ZGViaWFuOmV0aDA6b2ZmIgpAQCAtMTEwLDcgKzExNSw3IEBACiAvKiNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCSJlbGlub3MtbGFydCIgKi8KICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJkaGNwOyBib290bSIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KIC8qIHdoYXQncyB0aGlzID8gaXQncyBub3QgdXNlZCBhbnl3aGVyZSAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCkBAIC0xOTMsNyArMTk4LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE5BTkQgZmxhc2ggc2V0dGluZ3MKICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjZGVmaW5lIENGR19NQVhfTkFORF9ERVZJQ0UJMQkvKiBNYXggbnVtYmVyIG9mIE5BTkQgZGV2aWNlcwkJKi8KICNkZWZpbmUgU0VDVE9SU0laRSA1MTIKIApAQCAtMjE5LDcgKzIyNCw3IEBACiAjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShuYW5kcHRyKQogI2RlZmluZSBOQU5EX0NUTF9TRVRDTEUobmFuZHB0cikKIC8qICN1bmRlZiBDT05GSUdfTVREX05BTkRfVkVSSUZZX1dSSVRFICovCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EICovCisjZW5kaWYJLyogQ09ORklHX0NNRF9OQU5EICovCiAKICNkZWZpbmUgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTCiAjZGVmaW5lIENPTkZJR19JTklUUkRfVEFHCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc2JjNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjNDA1LmgKaW5kZXggYmVmZjI4YS4uZGM5MDZiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NiYzQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zYmM0MDUuaApAQCAtODQsMjMgKzg0LDMzIEBACiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcwkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQkwICkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKwogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTEyMyw3ICsxMzMsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMjksNyArMjM5LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NiYzgyNDAuaCBiL2luY2x1ZGUvY29uZmlncy9zYmM4MjQwLmgKaW5kZXggZDg5MWUwNy4uMGU4NzhmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NiYzgyNDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjODI0MC5oCkBAIC03NSwyNCArNzUsMzMgQEAKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSggQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJICBDRkdfQ01EX0JTUCAgICB8IFwKLQkJCQkgIENGR19DTURfRElBRyAgIHwgXAotCQkJCSAgQ0ZHX0NNRF9FTEYgICAgfCBcCi0JCQkJICBDRkdfQ01EX0VOViAgICB8IFwKLQkJCQkgIENGR19DTURfRkxBU0ggIHwgXAotCQkJCSAgQ0ZHX0NNRF9QQ0kgICAgfCBcCi0JCQkJICBDRkdfQ01EX1BJTkcgICB8IFwKLQkJCQkgIENGR19DTURfU0RSQU0gIHwgXAotCQkJCSAgMCApCiAKLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KICAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTM0MCw3ICszNDksNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NiYzgyNjAuaCBiL2luY2x1ZGUvY29uZmlncy9zYmM4MjYwLmgKaW5kZXggOWNmMDY1NC4uYjFkNDFhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NiYzgyNjAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjODI2MC5oCkBAIC0xODIsOCArMTgyLDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KIAogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MKQEAgLTQxMiwxNiArNDExLDE4IEBACiAJImJvb3RtIgogI2VuZGlmIC8qIENPTkZJR19CT09UX1JPT1RfTkZTICovCiAKLS8qIEFkZCBzdXBwb3J0IGZvciBhIGZldyBleHRyYSBib290cCBvcHRpb25zIGxpa2U6Ci0gKgktIEZpbGUgc2l6ZQotICoJLSBETlMgKHVwIHRvIDIgc2VydmVycykKLSAqCS0gU2VuZCBob3N0bmFtZSB0byBESENQIHNlcnZlcgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMgIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TMiB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUpCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCisKIAogLyogdW5kZWYgdGhpcyB0byBzYXZlIG1lbW9yeSAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAKQEAgLTQ0NCwyNyArNDQ1LDI2IEBACiAgKi8KICNkZWZpbmUgQ09ORklHX1ZFUlNJT05fVkFSSUFCTEUKIAotLyogV2hhdCBVLUJvb3Qgc3Vic3l0ZW1zIGRvIHlvdSB3YW50IGVuYWJsZWQ/ICovCi0jaWZkZWYgQ09ORklHX0VUSEVSX09OX0ZDQwotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSgoKENPTkZJR19DTURfREZMICYgfihDRkdfQ01EX0tHREIpKSkgfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JTU1BUAl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfU0RSQU0gICApCi0jZWxzZQotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSgoKENPTkZJR19DTURfREZMICYgfihDRkdfQ01EX0tHREIpKSkgfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JTU1BUAl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfU0RSQU0gICApCi0jZW5kaWYgLyogQ09ORklHX0VUSEVSX09OX0ZDQyAqLworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorCisjdW5kZWYgQ09ORklHX0NNRF9LR0RCCisKKyNpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0NNRF9NSUkKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkJLyogZGlzYWJsZSB0aGUgd2F0Y2hkb2cgKi8KIApAQCAtNDgxLDEzICs0ODEsMTEgQEAKICNkZWZpbmUgQ09ORklHX1NCQzgyNjAJCTEJLyogb24gYW4gRVNUIFNCQzgyNjAgQm9hcmQgICovCiAjZGVmaW5lIENPTkZJR19DUE0yCQkxCS8qIEhhcyBhIENQTTIgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSAgICAgKi8KICNlbHNlCiAjICBkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSAgICAgKi8KQEAgLTYyNyw3ICs2MjUsNyBAQAogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI2MCBDUFUgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc2JjODM0OS5oIGIvaW5jbHVkZS9jb25maWdzL3NiYzgzNDkuaAppbmRleCBlNmUzODY2Li4xODMxYmVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc2JjODM0OS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zYmM4MzQ5LmgKQEAgLTMyOCw3ICszMjgsNyBAQAogI2RlZmluZSBDT05GSUdfSTJDX0NNRF9UUkVFCiAjZGVmaW5lIENGR19JMkNfU1BFRUQJCTQwMDAwMAkvKiBJMkMgc3BlZWQgYW5kIHNsYXZlIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMHg3RgotI2RlZmluZSBDRkdfSTJDX05PUFJPQkVTCXt7MCwweDY5fX0JLyogRG9uJ3QgcHJvYmUgdGhlc2UgYWRkcnMgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19OT1BST0JFUwl7MHg2OX0JLyogRG9uJ3QgcHJvYmUgdGhlc2UgYWRkcnMgKi8KICNkZWZpbmUgQ0ZHX0kyQzFfT0ZGU0VUCQkweDMwMDAKICNkZWZpbmUgQ0ZHX0kyQzJfT0ZGU0VUCQkweDMxMDAKICNkZWZpbmUgQ0ZHX0kyQ19PRkZTRVQJCUNGR19JMkMyX09GRlNFVApAQCAtNDM5LDQwICs0MzksMzQgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKLSNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwJXAotCQkJCSB8IENGR19DTURfUElORwkJXAotCQkJCSB8IENGR19DTURfUENJCQlcCi0JCQkJIHwgQ0ZHX0NNRF9JMkMpCQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVgkJXAotCQkJCSAgfCBDRkdfQ01EX0xPQURTKSkKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJIHwgQ0ZHX0NNRF9JMkMpCQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVgkJXAotCQkJCSAgfCBDRkdfQ01EX0xPQURTKSkKLSNlbmRpZgotI2Vsc2UKLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX1BDSQkJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0kyQwkJXAotCQkJCSkKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfSTJDCQlcCi0JCQkJfCBDRkdfQ01EX01JSQkJXAotCQkJCSkKLSNlbmRpZgorICAgICNkZWZpbmUgQ09ORkdfQ01EX1BDSQogI2VuZGlmCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgorICAgICN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjZW5kaWYKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQgKi8KIApAQCAtNDgzLDcgKzQ3Nyw3IEBACiAjZGVmaW5lIENGR19MT0FEX0FERFIJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogCSNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCkBAIC01MDQsNyArNDk4LDcgQEAKIC8qIENhY2hlIENvbmZpZ3VyYXRpb24gKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSovCiAjZW5kaWYKIApAQCAtNjU1LDcgKzY0OSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgb2Yga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NiYzg1NjAuaCBiL2luY2x1ZGUvY29uZmlncy9zYmM4NTYwLmgKaW5kZXggNmU0ZmRiMi4uZGVmYzQyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NiYzg1NjAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjODU2MC5oCkBAIC0zMjAsMjggKzMyMCwzNyBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAotI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpIHx8IGRlZmluZWQoQ09ORklHX1JBTV9BU19GTEFTSCkKLSAgI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJIHwgXAotCQkJCUNGR19DTURfUElORyB8IENGR19DTURfSTJDKSAmIFwKLQkJCQkgfihDRkdfQ01EX0VOViB8IFwKLQkJCQkgIENGR19DTURfTE9BRFMgKSkKLSAgI2VsaWYgKGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTUlJIHwgXAotCQkJCUNGR19DTURfUElORyB8IENGR19DTURfSTJDKSAmIFwKLQkJCQl+KENGR19DTURfRU5WKSkKLSAgI2VuZGlmCi0jZWxzZQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IFwKLQkJCQlDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykKLSAgI2VsaWYgKGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9NSUkgfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9JMkMpCi0gICNlbmRpZgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKSB8fCBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19SQU1CT09UKSB8fCBkZWZpbmVkKENPTkZJR19SQU1fQVNfRkxBU0gpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMzUwLDcgKzM1OSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIlNCQzg1NjA9PiAiIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAgICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zNzEsNyArMzgwLDcgQEAKIC8qIENhY2hlIENvbmZpZ3VyYXRpb24gKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKQEAgLTM4Myw3ICszOTIsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICAgI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NiYzg2NDFkLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjODY0MWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQzMWNhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL3NiYzg2NDFkLmgKQEAgLTAsMCArMSw2MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBXaW5kIFJpdmVyIFN5c3RlbXMgPHd3dy53aW5kcml2ZXIuY29tPgorICogQ29weXJpZ2h0IDIwMDcgRW1iZWRkZWQgU3BlY2lhbHRpZXMsIEluYy4KKyAqIEpvZSBIYW1tYW4gPGpvZS5oYW1tYW5AZW1iZWRkZWRzcGVjaWFsdGllcy5jb20+CisgKgorICogQ29weXJpZ2h0IDIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisgKgorICogU3Jpa2FudGggU3Jpbml2YXNhbiAoc3Jpa2FudGguc3Jpbml2YXNhbkBmcmVlc2NhbGUuY29tKQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBTQkM4NjQxRCBib2FyZCBjb25maWd1cmF0aW9uIGZpbGUKKyAqCisgKiBNYWtlIHN1cmUgeW91IGNoYW5nZSB0aGUgTUFDIGFkZHJlc3MgYW5kIG90aGVyIG5ldHdvcmsgcGFyYW1zIGZpcnN0LAorICogc2VhcmNoIGZvciBDT05GSUdfRVRIQUREUiwgQ09ORklHX1NFUlZFUklQLCBldGMgaW4gdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zICovCisjZGVmaW5lIENPTkZJR19NUEM4Nnh4CQkxCS8qIE1QQzg2eHggKi8KKyNkZWZpbmUgQ09ORklHX01QQzg2NDEJCTEJLyogTVBDODY0MSBzcGVjaWZpYyAqLworI2RlZmluZSBDT05GSUdfU0JDODY0MUQJCTEJLyogU0JDODY0MUQgYm9hcmQgc3BlY2lmaWMgKi8KKyNkZWZpbmUgQ09ORklHX05VTV9DUFVTICAgICAgICAgMiAgICAgICAvKiBOdW1iZXIgb2YgQ1BVcyBpbiB0aGUgc3lzdGVtICovCisjZGVmaW5lIENPTkZJR19MSU5VWF9SRVNFVF9WRUMgIDB4MTAwICAgLyogUmVzZXQgdmVjdG9yIHVzZWQgYnkgTGludXggKi8KKworI2lmZGVmIFJVTl9ESUFHCisjZGVmaW5lIENGR19ESUFHX0FERFIgICAgICAgIDB4ZmY4MDAwMDAKKyNlbmRpZgorCisjZGVmaW5lIENGR19SRVNFVF9BRERSRVNTICAgIDB4ZmZmMDAxMDAKKworI2RlZmluZSBDT05GSUdfUENJCQkxCS8qIEVuYWJsZSBQQ0lFICovCisjZGVmaW5lIENPTkZJR19QQ0kxCQkxCS8qIFBDSUUgY29udHJvbGVyIDEgKHNsb3QgMSkgKi8KKyNkZWZpbmUgQ09ORklHX1BDSTIJCTEJLyogUENJRSBjb250cm9sZXIgMiAoc2xvdCAyKSAqLworI2RlZmluZSBDT05GSUdfRlNMX1BDSV9JTklUCTEJLyogVXNlIGNvbW1vbiBGU0wgaW5pdCBjb2RlICovCisKKyNkZWZpbmUgQ09ORklHX1RTRUNfRU5FVCAJCS8qIHRzZWMgZXRoZXJuZXQgc3VwcG9ydCAqLworI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQorCisjdW5kZWYgQ09ORklHX1NQRF9FRVBST00JCS8qIERvIG5vdCB1c2UgU1BEIEVFUFJPTSBmb3IgRERSIHNldHVwKi8KKyN1bmRlZiBDT05GSUdfRERSX0RMTAkJCS8qIHBvc3NpYmxlIERMTCBmaXggbmVlZGVkICovCisjZGVmaW5lIENPTkZJR19ERFJfMlRfVElNSU5HCQkvKiBTZXRzIHRoZSAyVCB0aW1pbmcgYml0ICovCisjdW5kZWYgQ09ORklHX0REUl9FQ0MgIAkJCS8qIG9ubHkgZm9yIEVDQyBERFIgbW9kdWxlICovCisjZGVmaW5lIENPTkZJR19FQ0NfSU5JVF9WSUFfRERSQ09OVFJPTExFUgkvKiBERFIgY29udHJvbGxlciBvciBETUE/ICovCisjZGVmaW5lIENPTkZJR19NRU1fSU5JVF9WQUxVRQkJMHhEZWFkQmVlZgorI2RlZmluZSBDT05GSUdfTlVNX0REUl9DT05UUk9MTEVSUyAgICAgMgorI2RlZmluZSBDQUNIRV9MSU5FX0lOVEVSTEVBVklORwkJMHgyMDAwMDAwMAorI2RlZmluZSBQQUdFX0lOVEVSTEVBVklORwkJMHgyMTAwMDAwMAorI2RlZmluZSBCQU5LX0lOVEVSTEVBVklORwkJMHgyMjAwMDAwMAorI2RlZmluZSBTVVBFUl9CQU5LX0lOVEVSTEVBVklORwkJMHgyMzAwMDAwMAorCisKKyNkZWZpbmUgQ09ORklHX0FMVElWRUMgICAgICAgICAgMQorCisvKgorICogTDJDUiBzZXR1cCAtLSBtYWtlIHN1cmUgdGhpcyBpcyByaWdodCBmb3IgeW91ciBib2FyZCEKKyAqLworI2RlZmluZSBDRkdfTDIKKyNkZWZpbmUgTDJfSU5JVAkJMAorI2RlZmluZSBMMl9FTkFCTEUJKEwyQ1JfTDJFKQorCisjaWZuZGVmIENPTkZJR19TWVNfQ0xLX0ZSRVEKKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUSAgICAgZ2V0X2JvYXJkX3N5c19jbGsoMCkKKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YJMQkvKiBDYWxsIGJvYXJkX3ByZV9pbml0ICovCisKKyN1bmRlZglDRkdfRFJBTV9URVNUCQkJCS8qIG1lbW9yeSB0ZXN0LCB0YWtlcyB0aW1lICovCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4MDAyMDAwMDAJLyogbWVtdGVzdCByZWdpb24gKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECQkweDAwNDAwMDAwCisKKy8qCisgKiBCYXNlIGFkZHJlc3NlcyAtLSBOb3RlIHRoZXNlIGFyZSBlZmZlY3RpdmUgYWRkcmVzc2VzIHdoZXJlIHRoZQorICogYWN0dWFsIHJlc291cmNlcyBnZXQgbWFwcGVkIChub3QgcGh5c2ljYWwgYWRkcmVzc2VzKQorICovCisjZGVmaW5lIENGR19DQ1NSQkFSX0RFRkFVTFQgCTB4ZmY3MDAwMDAJLyogQ0NTUkJBUiBEZWZhdWx0ICovCisjZGVmaW5lIENGR19DQ1NSQkFSCQkweGY4MDAwMDAwCS8qIHJlbG9jYXRlZCBDQ1NSQkFSICovCisjZGVmaW5lIENGR19JTU1SCQlDRkdfQ0NTUkJBUgkvKiBQUUlJIHVzZXMgQ0ZHX0lNTVIgKi8KKworI2RlZmluZSBDRkdfUENJMV9BRERSCQkoQ0ZHX0NDU1JCQVIrMHg4MDAwKQorI2RlZmluZSBDRkdfUENJMl9BRERSCQkoQ0ZHX0NDU1JCQVIrMHg5MDAwKQorCisvKgorICogRERSIFNldHVwCisgKi8KKyNkZWZpbmUgQ0ZHX0REUl9TRFJBTV9CQVNFCTB4MDAwMDAwMDAJLyogRERSIGlzIHN5c3RlbSBtZW1vcnkgKi8KKyNkZWZpbmUgQ0ZHX0REUl9TRFJBTV9CQVNFMgkweDEwMDAwMDAwCS8qIEREUiBiYW5rIDIgKi8KKyNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UJCUNGR19ERFJfU0RSQU1fQkFTRQorI2RlZmluZSBDRkdfU0RSQU1fQkFTRTIJCUNGR19ERFJfU0RSQU1fQkFTRTIKKyNkZWZpbmUgQ09ORklHX1ZFUllfQklHX1JBTQorCisjZGVmaW5lIE1QQzg2eHhfRERSX1NEUkFNX0NMS19DTlRMCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKQorICAgIC8qCisgICAgICogRGV0ZXJtaW5lIEREUiBjb25maWd1cmF0aW9uIGZyb20gSTJDIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICAjZGVmaW5lIFNQRF9FRVBST01fQUREUkVTUzEJCTB4NTEJCS8qIEREUiBESU1NICovCisgICAgI2RlZmluZSBTUERfRUVQUk9NX0FERFJFU1MyCQkweDUyCQkvKiBERFIgRElNTSAqLworICAgICNkZWZpbmUgU1BEX0VFUFJPTV9BRERSRVNTMwkJMHg1MwkJLyogRERSIERJTU0gKi8KKyAgICAjZGVmaW5lIFNQRF9FRVBST01fQUREUkVTUzQJCTB4NTQJCS8qIEREUiBESU1NICovCisKKyNlbHNlCisgICAgLyoKKyAgICAgKiBNYW51YWxseSBzZXQgdXAgRERSMSAmIEREUjIgcGFyYW1ldGVycworICAgICAqLworCisgICAgI2RlZmluZSBDRkdfU0RSQU1fU0laRQk1MTIJCS8qIEREUiBpcyA1MTJNQiAqLworCisgICAgI2RlZmluZSBDRkdfRERSX0NTMF9CTkRTCTB4MDAwMDAwMEYKKyAgICAjZGVmaW5lIENGR19ERFJfQ1MxX0JORFMJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUl9DUzJfQk5EUwkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSX0NTM19CTkRTCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFJfQ1MwX0NPTkZJRwkweDgwMDEwMTAyCisgICAgI2RlZmluZSBDRkdfRERSX0NTMV9DT05GSUcJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUl9DUzJfQ09ORklHCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFJfQ1MzX0NPTkZJRwkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSX0VYVF9SRUZSRVNIIDB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFJfVElNSU5HXzAJMHgwMDIyMDgwMgorICAgICNkZWZpbmUgQ0ZHX0REUl9USU1JTkdfMQkweDM4Mzc3MzIyCisgICAgI2RlZmluZSBDRkdfRERSX1RJTUlOR18yCTB4MDAyMDQwYzcKKyAgICAjZGVmaW5lIENGR19ERFJfQ0ZHXzFBCTB4NDMwMDgwMDgKKyAgICAjZGVmaW5lIENGR19ERFJfQ0ZHXzIJMHgyNDQwMTAwMAorICAgICNkZWZpbmUgQ0ZHX0REUl9NT0RFXzEJMHgyM2MwMDU0MgorICAgICNkZWZpbmUgQ0ZHX0REUl9NT0RFXzIJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUl9NT0RFX0NUTAkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSX0lOVEVSVkFMCTB4MDUwODAxMDAKKyAgICAjZGVmaW5lIENGR19ERFJfREFUQV9JTklUCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFJfQ0xLX0NUUkwJMHgwMzgwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUl9DRkdfMUIJMHhDMzAwODAwOAorCisgICAgI2RlZmluZSBDRkdfRERSMl9DUzBfQk5EUwkweDAwMTAwMDFGCisgICAgI2RlZmluZSBDRkdfRERSMl9DUzFfQk5EUwkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9DUzJfQk5EUwkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9DUzNfQk5EUwkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9DUzBfQ09ORklHCTB4ODAwMTAxMDIKKyAgICAjZGVmaW5lIENGR19ERFIyX0NTMV9DT05GSUcJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUjJfQ1MyX0NPTkZJRwkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9DUzNfQ09ORklHCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFIyX0VYVF9SRUZSRVNIIDB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFIyX1RJTUlOR18wCTB4MDAyMjA4MDIKKyAgICAjZGVmaW5lIENGR19ERFIyX1RJTUlOR18xCTB4MzgzNzczMjIKKyAgICAjZGVmaW5lIENGR19ERFIyX1RJTUlOR18yCTB4MDAyMDQwYzcKKyAgICAjZGVmaW5lIENGR19ERFIyX0NGR18xQQkweDQzMDA4MDA4CisgICAgI2RlZmluZSBDRkdfRERSMl9DRkdfMgkweDI0NDAxMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9NT0RFXzEJMHgyM2MwMDU0MgorICAgICNkZWZpbmUgQ0ZHX0REUjJfTU9ERV8yCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFIyX01PREVfQ1RMCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFIyX0lOVEVSVkFMCTB4MDUwODAxMDAKKyAgICAjZGVmaW5lIENGR19ERFIyX0RBVEFfSU5JVAkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9DTEtfQ1RSTAkweDAzODAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9DRkdfMUIJMHhDMzAwODAwOAorCisKKyNlbmRpZgorCisvKiAjZGVmaW5lIENGR19JRF9FRVBST00JMQorI2RlZmluZSBJRF9FRVBST01fQUREUiAweDU3ICovCisKKy8qCisgKiBUaGUgU0JDODY0MUQgY29udGFpbnMgMTZNQiBmbGFzaCBzcGFjZSBhdCBmZjAwMDAwMC4KKyAqLworI2RlZmluZSBDRkdfRkxBU0hfQkFTRSAgICAgIDB4ZmYwMDAwMDAgIC8qIHN0YXJ0IG9mIEZMQVNIIDE2TSAqLworCisvKiBGbGFzaCAqLworI2RlZmluZSBDRkdfQlIwX1BSRUxJTQkJMHhmZjAwMTAwMQkvKiBwb3J0IHNpemUgMTZiaXQgKi8KKyNkZWZpbmUgQ0ZHX09SMF9QUkVMSU0JCTB4ZmYwMDZlNjUJLyogMTZNQiBCb290IEZsYXNoIGFyZWEgKi8KKworLyogNjRLQiBFRVBST00gKi8KKyNkZWZpbmUgQ0ZHX0JSMV9QUkVMSU0JCTB4ZjAwMDA4MDEJLyogcG9ydCBzaXplIDE2Yml0ICovCisjZGVmaW5lIENGR19PUjFfUFJFTElNCQkweGZmZmY2ZTY1CS8qIDY0SyBFRVBST00gYXJlYSAqLworCisvKiBFUExEIC0gVXNlciBzd2l0Y2hlcywgYm9hcmQgaWQsIExFRHMgKi8KKyNkZWZpbmUgQ0ZHX0JSMl9QUkVMSU0JCTB4ZjEwMDA4MDEJLyogcG9ydCBzaXplIDE2Yml0ICovCisjZGVmaW5lIENGR19PUjJfUFJFTElNCQkweGZmZjA2ZTY1CS8qIEVQTEQgKHN3aXRjaGVzLCBib2FyZCBJRCwgTEVEcykgYXJlYSAqLworCisvKiBMb2NhbCBidXMgU0RSQU0gMTI4TUIgKi8KKyNkZWZpbmUgQ0ZHX0JSM19QUkVMSU0JCTB4ZTAwMDE4NjEJLyogcG9ydCBzaXplID9iaXQgKi8KKyNkZWZpbmUgQ0ZHX09SM19QUkVMSU0JCTB4ZmMwMDZjYzAJLyogMTI4TUIgbG9jYWwgYnVzIFNEUkFNIGFyZWEgKDFzdCBoYWxmKSAqLworI2RlZmluZSBDRkdfQlI0X1BSRUxJTQkJMHhlNDAwMTg2MQkvKiBwb3J0IHNpemUgP2JpdCAqLworI2RlZmluZSBDRkdfT1I0X1BSRUxJTQkJMHhmYzAwNmNjMAkvKiAxMjhNQiBsb2NhbCBidXMgU0RSQU0gYXJlYSAoMm5kIGhhbGYpICovCisKKy8qIERpc2sgb24gQ2hpcCAoRE9DKSAxMjhNQiAqLworI2RlZmluZSBDRkdfQlI1X1BSRUxJTQkJMHhlODAwMTAwMQkvKiBwb3J0IHNpemUgP2JpdCAqLworI2RlZmluZSBDRkdfT1I1X1BSRUxJTQkJMHhmODAwNmU2NQkvKiAxMjhNQiBsb2NhbCBidXMgU0RSQU0gYXJlYSAoMm5kIGhhbGYpICovCisKKy8qIExDRCAqLworI2RlZmluZSBDRkdfQlI2X1BSRUxJTQkJMHhmNDAwMDgwMQkvKiBwb3J0IHNpemUgP2JpdCAqLworI2RlZmluZSBDRkdfT1I2X1BSRUxJTQkJMHhmZmYwNmU2NQkvKiAxMjhNQiBsb2NhbCBidXMgU0RSQU0gYXJlYSAoMm5kIGhhbGYpICovCisKKy8qIENvbnRyb2wgbG9naWMgJiBtaXNjIHBlcmlwaGVyYWxzICovCisjZGVmaW5lIENGR19CUjdfUFJFTElNCQkweGYyMDAwODAxCS8qIHBvcnQgc2l6ZSA/Yml0ICovCisjZGVmaW5lIENGR19PUjdfUFJFTElNCQkweGZmZjA2ZTY1CS8qIDEyOE1CIGxvY2FsIGJ1cyBTRFJBTSBhcmVhICgybmQgaGFsZikgKi8KKworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTEJCS8qIG51bWJlciBvZiBiYW5rcyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMTMxCQkvKiBzZWN0b3JzIHBlciBkZXZpY2UgKi8KKworI3VuZGVmCUNGR19GTEFTSF9DSEVDS1NVTQorI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVAk2MDAwMAkvKiBGbGFzaCBFcmFzZSBUaW1lb3V0IChtcykgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQJNTAwCS8qIEZsYXNoIFdyaXRlIFRpbWVvdXQgKG1zKSAqLworI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFICAgIAlURVhUX0JBU0UJLyogc3RhcnQgb2YgbW9uaXRvciAqLworCisjZGVmaW5lIENGR19GTEFTSF9DRklfRFJJVkVSCisjZGVmaW5lIENGR19GTEFTSF9DRkkKKyNkZWZpbmUgQ0ZHX1dSSVRFX1NXQVBQRURfREFUQQorI2RlZmluZSBDRkdfRkxBU0hfRU1QVFlfSU5GTworI2RlZmluZSBDRkdfRkxBU0hfUFJPVEVDVElPTgorCisjdW5kZWYgQ09ORklHX0NMT0NLU19JTl9NSFoKKworI2RlZmluZSBDT05GSUdfTDFfSU5JVF9SQU0KKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0xPQ0sJMQorI2lmbmRlZiBDRkdfSU5JVF9SQU1fTE9DSworI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUgkweDBmZDAwMDAwCS8qIEluaXRpYWwgUkFNIGFkZHJlc3MgKi8KKyNlbHNlCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCTB4Zjg0MDAwMDAJLyogSW5pdGlhbCBSQU0gYWRkcmVzcyAqLworI2VuZGlmCisjZGVmaW5lIENGR19JTklUX1JBTV9FTkQgICAgCTB4NDAwMAkgICAgCS8qIEVuZCBvZiB1c2VkIGFyZWEgaW4gUkFNICovCisKKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUgIAkxMjgJCS8qIG51bSBieXRlcyBpbml0aWFsIGRhdGEgKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQorI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQJQ0ZHX0dCTF9EQVRBX09GRlNFVAorCisjZGVmaW5lIENGR19NT05JVE9SX0xFTgkgICAgCSgyNTYgKiAxMDI0KSAgICAvKiBSZXNlcnZlIDI1NiBrQiBmb3IgTW9uICovCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCSAgICAJKDEyOCAqIDEwMjQpICAgIC8qIFJlc2VydmVkIGZvciBtYWxsb2MgKi8KKworLyogU2VyaWFsIFBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgIDEKKyN1bmRlZglDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8KKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFICAgIDEKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQlnZXRfYnVzX2ZyZXEoMCkKKworI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUgIFwKKwl7MzAwLCA2MDAsIDEyMDAsIDI0MDAsIDQ4MDAsIDk2MDAsIDE5MjAwLCAzODQwMCwxMTUyMDB9CisKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMSAgICAgICAgKENGR19DQ1NSQkFSKzB4NDUwMCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMiAgICAgICAgKENGR19DQ1NSQkFSKzB4NDYwMCkKKworLyogVXNlIHRoZSBIVVNIIHBhcnNlciAqLworI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIKKyNpZmRlZiAgQ0ZHX0hVU0hfUEFSU0VSCisjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIgIj4gIgorI2VuZGlmCisKKy8qCisgKiBQYXNzIG9wZW4gZmlybXdhcmUgZmxhdCB0cmVlIHRvIGtlcm5lbAorICovCisjZGVmaW5lIENPTkZJR19PRl9GTEFUX1RSRUUJMQorI2RlZmluZSBDT05GSUdfT0ZfQk9BUkRfU0VUVVAJMQorCisvKiBtYXhpbXVtIHNpemUgb2YgdGhlIGZsYXQgdHJlZSAoOEspICovCisjZGVmaW5lIE9GX0ZMQVRfVFJFRV9NQVhfU0laRQk4MTkyCisKKyNkZWZpbmUgT0ZfQ1BVCQkiUG93ZXJQQyw4NjQxQDAiCisjZGVmaW5lIE9GX1NPQwkJInNvY0BmODAwMDAwMCIKKyNkZWZpbmUgT0ZfVEJDTEsJKGJkLT5iaV9idXNmcmVxIC8gNCkKKyNkZWZpbmUgT0ZfU1RET1VUX1BBVEgJIi9zb2NAZjgwMDAwMDAvc2VyaWFsQDQ1MDAiCisKKyNkZWZpbmUgQ0ZHXzY0QklUX1ZTUFJJTlRGCTEKKyNkZWZpbmUgQ0ZHXzY0QklUX1NUUlRPVUwJMQorCisvKgorICogSTJDCisgKi8KKyNkZWZpbmUJQ09ORklHX0ZTTF9JMkMJCS8qIFVzZSBGU0wgY29tbW9uIEkyQyBkcml2ZXIgKi8KKyNkZWZpbmUJQ09ORklHX0hBUkRfSTJDCQkvKiBJMkMgd2l0aCBoYXJkd2FyZSBzdXBwb3J0Ki8KKyN1bmRlZglDT05GSUdfU09GVF9JMkMJCQkvKiBJMkMgYml0LWJhbmdlZCAqLworI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMDAJLyogSTJDIHNwZWVkIGFuZCBzbGF2ZSBhZGRyZXNzICovCisjZGVmaW5lIENGR19JMkNfU0xBVkUJCTB4N0YKKyNkZWZpbmUgQ0ZHX0kyQ19OT1BST0JFUyAgICAgICAgezB4Njl9CS8qIERvbid0IHByb2JlIHRoZXNlIGFkZHJzICovCisjZGVmaW5lIENGR19JMkNfT0ZGU0VUCQkweDMxMDAKKworLyoKKyAqIFJhcGlkSU8gTU1VCisgKi8KKyNkZWZpbmUgQ0ZHX1JJT19NRU1fQkFTRQkweGMwMDAwMDAwCS8qIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfUklPX01FTV9QSFlTCUNGR19SSU9fTUVNX0JBU0UKKyNkZWZpbmUgQ0ZHX1JJT19NRU1fU0laRQkweDIwMDAwMDAwCS8qIDEyOE0gKi8KKworLyoKKyAqIEdlbmVyYWwgUENJCisgKiBBZGRyZXNzZXMgYXJlIG1hcHBlZCAxLTEuCisgKi8KKyNkZWZpbmUgQ0ZHX1BDSTFfTUVNX0JBU0UJMHg4MDAwMDAwMAorI2RlZmluZSBDRkdfUENJMV9NRU1fUEhZUwlDRkdfUENJMV9NRU1fQkFTRQorI2RlZmluZSBDRkdfUENJMV9NRU1fU0laRQkweDIwMDAwMDAwCS8qIDUxMk0gKi8KKyNkZWZpbmUgQ0ZHX1BDSTFfSU9fQkFTRQkweGUyMDAwMDAwCisjZGVmaW5lIENGR19QQ0kxX0lPX1BIWVMJQ0ZHX1BDSTFfSU9fQkFTRQorI2RlZmluZSBDRkdfUENJMV9JT19TSVpFCTB4MTAwMDAwMAkvKiAxNk0gKi8KKworLyogUENJIHZpZXcgb2YgU3lzdGVtIE1lbW9yeSAqLworI2RlZmluZSBDRkdfUENJX01FTU9SWV9CVVMgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lfTUVNT1JZX1BIWVMgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSV9NRU1PUllfU0laRSAgICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIENGR19QQ0kyX01FTV9CQVNFCTB4YTAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSTJfTUVNX1BIWVMJQ0ZHX1BDSTJfTUVNX0JBU0UKKyNkZWZpbmUgQ0ZHX1BDSTJfTUVNX1NJWkUJMHgxMDAwMDAwMAkvKiAyNTZNICovCisjZGVmaW5lIENGR19QQ0kyX0lPX0JBU0UJMHhlMzAwMDAwMAorI2RlZmluZSBDRkdfUENJMl9JT19QSFlTCUNGR19QQ0kyX0lPX0JBU0UKKyNkZWZpbmUgQ0ZHX1BDSTJfSU9fU0laRQkweDEwMDAwMDAJLyogMTZNICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisKKyNkZWZpbmUgQ09ORklHX1BDSV9TQ0FOX1NIT1cgICAgICAgICAgICAvKiBzaG93IHBjaSBkZXZpY2VzIG9uIHN0YXJ0dXAgKi8KKworI3VuZGVmIENGR19TQ1NJX1NDQU5fQlVTX1JFVkVSU0UKKworI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCisjZGVmaW5lIENPTkZJR19QQ0lfUE5QCSAgICAgICAgICAgICAgIAkvKiBkbyBwY2kgcGx1Zy1hbmQtcGxheSAqLworCisjdW5kZWYgQ09ORklHX0VFUFJPMTAwCisjdW5kZWYgQ09ORklHX1RVTElQCisKKyNpZiAhZGVmaW5lZChDT05GSUdfUENJX1BOUCkKKyAgICAjZGVmaW5lIFBDSV9FTkVUMF9JT0FERFIJMHhlMDAwMDAwMAorICAgICNkZWZpbmUgUENJX0VORVQwX01FTUFERFIJMHhlMDAwMDAwMAorICAgICNkZWZpbmUgUENJX0lEU0VMX05VTUJFUgkweDBjIAkvKiBzbG90MC0+MyhJRFNFTCk9MTItPjE1ICovCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfUENJX1NDQU5fU0hPVwkJLyogc2hvdyBwY2kgZGV2aWNlcyBvbiBzdGFydHVwICovCisKKyNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KKyN1bmRlZiBDT05GSUdfU0NTSV9BSENJCisKKyNpZmRlZiBDT05GSUdfU0NTSV9BSENJCisjZGVmaW5lIENPTkZJR19TQVRBX1VMSTUyODgKKyNkZWZpbmUgQ0ZHX1NDU0lfTUFYX1NDU0lfSUQJNAorI2RlZmluZSBDRkdfU0NTSV9NQVhfTFVOCTEKKyNkZWZpbmUgQ0ZHX1NDU0lfTUFYX0RFVklDRSAJKENGR19TQ1NJX01BWF9TQ1NJX0lEICogQ0ZHX1NDU0lfTUFYX0xVTikKKyNkZWZpbmUgQ0ZHX1NDU0lfTUFYREVWSUNFCUNGR19TQ1NJX01BWF9ERVZJQ0UKKyNlbmRpZgorCisjZW5kaWYJLyogQ09ORklHX1BDSSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQorCisjaWZuZGVmIENPTkZJR19ORVRfTVVMVEkKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSSAJMQorI2VuZGlmCisKKy8qICNkZWZpbmUgQ09ORklHX01JSQkJMSAqLwkvKiBNSUkgUEhZIG1hbmFnZW1lbnQgKi8KKworI2RlZmluZSBDT05GSUdfVFNFQzEgICAgMQorI2RlZmluZSBDT05GSUdfVFNFQzFfTkFNRSAgICAgICAiZVRTRUMxIgorI2RlZmluZSBDT05GSUdfVFNFQzIgICAgMQorI2RlZmluZSBDT05GSUdfVFNFQzJfTkFNRSAgICAgICAiZVRTRUMyIgorI2RlZmluZSBDT05GSUdfVFNFQzMgICAgMQorI2RlZmluZSBDT05GSUdfVFNFQzNfTkFNRSAgICAgICAiZVRTRUMzIgorI2RlZmluZSBDT05GSUdfVFNFQzQgICAgMQorI2RlZmluZSBDT05GSUdfVFNFQzRfTkFNRSAgICAgICAiZVRTRUM0IgorCisjZGVmaW5lIFRTRUMxX1BIWV9BRERSCQkweDFGCisjZGVmaW5lIFRTRUMyX1BIWV9BRERSCQkweDAwCisjZGVmaW5lIFRTRUMzX1BIWV9BRERSCQkweDAxCisjZGVmaW5lIFRTRUM0X1BIWV9BRERSCQkweDAyCisjZGVmaW5lIFRTRUMxX1BIWUlEWAkJMAorI2RlZmluZSBUU0VDMl9QSFlJRFgJCTAKKyNkZWZpbmUgVFNFQzNfUEhZSURYCQkwCisjZGVmaW5lIFRTRUM0X1BIWUlEWAkJMAorCisjZGVmaW5lIENGR19UQklQQV9WQUxVRQkweDFlCS8qIFNldCBUQkkgYWRkcmVzcyBub3QgdG8gY29uZmxpY3Qgd2l0aCBUU0VDMV9QSFlfQUREUiAqLworCisjZGVmaW5lIENPTkZJR19FVEhQUklNRQkJImVUU0VDMSIKKworI2VuZGlmCS8qIENPTkZJR19UU0VDX0VORVQgKi8KKworLyoKKyAqIEJBVDAgICAgICAgICAyRyAgICAgQ2FjaGVhYmxlLCBub24tZ3VhcmRlZAorICogMHgwMDAwXzAwMDAgIDJHICAgICBERFIKKyAqLworI2RlZmluZSBDRkdfREJBVDBMCShCQVRMX1BQX1JXIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19EQkFUMFUJKEJBVFVfQkxfMkcgfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0lCQVQwTAkoQkFUTF9QUF9SVyB8IEJBVExfTUVNQ09IRVJFTkNFICkKKyNkZWZpbmUgQ0ZHX0lCQVQwVQlDRkdfREJBVDBVCisKKy8qCisgKiBCQVQxICAgICAgICAgMUcgICAgIENhY2hlLWluaGliaXRlZCwgZ3VhcmRlZAorICogMHg4MDAwXzAwMDAgIDUxMk0gICBQQ0ktRXhwcmVzcyAxIE1lbW9yeQorICogMHhhMDAwXzAwMDAgIDUxMk0gICBQQ0ktRXhwcmVzcyAyIE1lbW9yeQorICoJQ2hhbmdlZCBpdCBmb3Igb3BlcmF0aW5nIGZyb20gMHhkMDAwMDAwMAorICovCisjZGVmaW5lIENGR19EQkFUMUwJKCBDRkdfUENJMV9NRU1fQkFTRSB8IEJBVExfUFBfUlcgXAorCQkJfCBCQVRMX0NBQ0hFSU5ISUJJVCB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCisjZGVmaW5lIENGR19EQkFUMVUJKENGR19QQ0kxX01FTV9CQVNFIHwgQkFUVV9CTF8yNTZNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19JQkFUMUwJKENGR19QQ0kxX01FTV9CQVNFIHwgQkFUTF9QUF9SVyB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfSUJBVDFVCUNGR19EQkFUMVUKKworLyoKKyAqIEJBVDIgICAgICAgICA1MTJNICAgQ2FjaGUtaW5oaWJpdGVkLCBndWFyZGVkCisgKiAweGMwMDBfMDAwMCAgNTEyTSAgIFJhcGlkSU8gTWVtb3J5CisgKi8KKyNkZWZpbmUgQ0ZHX0RCQVQyTAkoQ0ZHX1JJT19NRU1fQkFTRSB8IEJBVExfUFBfUlcgXAorCQkJfCBCQVRMX0NBQ0hFSU5ISUJJVCB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCisjZGVmaW5lIENGR19EQkFUMlUJKENGR19SSU9fTUVNX0JBU0UgfCBCQVRVX0JMXzUxMk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0lCQVQyTAkoQ0ZHX1JJT19NRU1fQkFTRSB8IEJBVExfUFBfUlcgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKKyNkZWZpbmUgQ0ZHX0lCQVQyVQlDRkdfREJBVDJVCisKKy8qCisgKiBCQVQzICAgICAgICAgNE0gICAgIENhY2hlLWluaGliaXRlZCwgZ3VhcmRlZAorICogMHhmODAwXzAwMDAgIDRNICAgICBDQ1NSCisgKi8KKyNkZWZpbmUgQ0ZHX0RCQVQzTAkoIENGR19DQ1NSQkFSIHwgQkFUTF9QUF9SVyBcCisJCQl8IEJBVExfQ0FDSEVJTkhJQklUIHwgQkFUTF9HVUFSREVEU1RPUkFHRSkKKyNkZWZpbmUgQ0ZHX0RCQVQzVQkoQ0ZHX0NDU1JCQVIgfCBCQVRVX0JMXzRNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19JQkFUM0wJKENGR19DQ1NSQkFSIHwgQkFUTF9QUF9SVyB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfSUJBVDNVCUNGR19EQkFUM1UKKworLyoKKyAqIEJBVDQgICAgICAgICAzMk0gICAgQ2FjaGUtaW5oaWJpdGVkLCBndWFyZGVkCisgKiAweGUyMDBfMDAwMCAgMTZNICAgIFBDSS1FeHByZXNzIDEgSS9PCisgKiAweGUzMDBfMDAwMCAgMTZNICAgIFBDSS1FeHByZXNzIDIgSS8wCisgKiAgICBOb3RlIHRoYXQgdGhpcyBpcyBhdCAweGUwMDAwMDAwCisgKi8KKyNkZWZpbmUgQ0ZHX0RCQVQ0TAkoIENGR19QQ0kxX0lPX0JBU0UgfCBCQVRMX1BQX1JXIFwKKwkJCXwgQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX0dVQVJERURTVE9SQUdFKQorI2RlZmluZSBDRkdfREJBVDRVCShDRkdfUENJMV9JT19CQVNFIHwgQkFUVV9CTF8zMk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0lCQVQ0TAkoQ0ZHX1BDSTFfSU9fQkFTRSB8IEJBVExfUFBfUlcgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKKyNkZWZpbmUgQ0ZHX0lCQVQ0VQlDRkdfREJBVDRVCisKKy8qCisgKiBCQVQ1ICAgICAgICAgMTI4SyAgIENhY2hlYWJsZSwgbm9uLWd1YXJkZWQKKyAqIDB4ZTQwMV8wMDAwICAxMjhLICAgSW5pdCBSQU0gZm9yIHN0YWNrIGluIHRoZSBDUFUgRENhY2hlIChubyBiYWNraW5nIG1lbW9yeSkKKyAqLworI2RlZmluZSBDRkdfREJBVDVMCShDRkdfSU5JVF9SQU1fQUREUiB8IEJBVExfUFBfUlcgfCBCQVRMX01FTUNPSEVSRU5DRSkKKyNkZWZpbmUgQ0ZHX0RCQVQ1VQkoQ0ZHX0lOSVRfUkFNX0FERFIgfCBCQVRVX0JMXzEyOEsgfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0lCQVQ1TAlDRkdfREJBVDVMCisjZGVmaW5lIENGR19JQkFUNVUJQ0ZHX0RCQVQ1VQorCisvKgorICogQkFUNiAgICAgICAgIDMyTSAgICBDYWNoZS1pbmhpYml0ZWQsIGd1YXJkZWQKKyAqIDB4ZmUwMF8wMDAwICAzMk0gICAgRkxBU0gKKyAqLworI2RlZmluZSBDRkdfREJBVDZMCSgoQ0ZHX0ZMQVNIX0JBU0UgJiAweGZlMDAwMDAwKSB8IEJBVExfUFBfUlcgXAorCQkJfCBCQVRMX0NBQ0hFSU5ISUJJVCB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCisjZGVmaW5lIENGR19EQkFUNlUJKChDRkdfRkxBU0hfQkFTRSAmIDB4ZmUwMDAwMDApIHwgQkFUVV9CTF8zMk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0lCQVQ2TAkoKENGR19GTEFTSF9CQVNFICYgMHhmZTAwMDAwMCkgfCBCQVRMX1BQX1JXIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19JQkFUNlUJQ0ZHX0RCQVQ2VQorCisjZGVmaW5lIENGR19EQkFUN0wJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfREJBVDdVCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0lCQVQ3TAkweDAwMDAwMDAwCisjZGVmaW5lIENGR19JQkFUN1UJMHgwMDAwMDAwMAorCisvKgorICogRW52aXJvbm1lbnQKKyAqLworI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEKKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkoQ0ZHX01PTklUT1JfQkFTRSArIDB4NDAwMDApCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTB4NDAwMDAJLyogMjU2SyhvbmUgc2VjdG9yKSBmb3IgZW52ICovCisjZGVmaW5lIENGR19FTlZfU0laRQkJMHgyMDAwCisKKyNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KKyNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCisKKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKyAgICAjZGVmaW5lIENPTkZJR19DTURfUElORworICAgICNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCisjZW5kaWYKKworI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJKi8KKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDIwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLworCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyAgICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KKyNlbHNlCisgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KKyNlbmRpZgorCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MgKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfSFoJCTEwMDAJCS8qIGRlY3JlbWVudGVyIGZyZXE6IDFtcyB0aWNrcyAqLworCisvKgorICogRm9yIGJvb3RpbmcgTGludXgsIHRoZSBib2FyZCBpbmZvIGFuZCBjb21tYW5kIGxpbmUgZGF0YQorICogaGF2ZSB0byBiZSBpbiB0aGUgZmlyc3QgOCBNQiBvZiBtZW1vcnksIHNpbmNlIHRoaXMgaXMKKyAqIHRoZSBtYXhpbXVtIG1hcHBlZCBieSB0aGUgTGludXgga2VybmVsIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqLworI2RlZmluZSBDRkdfQk9PVE1BUFNaCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4Ki8KKworLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgorI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KKyNlbmRpZgorCisvKgorICogSW50ZXJuYWwgRGVmaW5pdGlvbnMKKyAqCisgKiBCb290IEZsYWdzCisgKi8KKyNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLworI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLworCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCisjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLworI2VuZGlmCisKKy8qCisgKiBFbnZpcm9ubWVudCBDb25maWd1cmF0aW9uCisgKi8KKworLyogVGhlIG1hYyBhZGRyZXNzZXMgZm9yIGFsbCBldGhlcm5ldCBpbnRlcmZhY2UgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpCisjZGVmaW5lIENPTkZJR19FVEhBRERSICAgMDI6RTA6MEM6MDA6MDA6MDEKKyNkZWZpbmUgQ09ORklHX0VUSDFBRERSICAwMjpFMDowQzowMDowMTpGRAorI2RlZmluZSBDT05GSUdfRVRIMkFERFIgIDAyOkUwOjBDOjAwOjAyOkZECisjZGVmaW5lIENPTkZJR19FVEgzQUREUiAgMDI6RTA6MEM6MDA6MDM6RkQKKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19IQVNfRVRIMQkJMQorI2RlZmluZSBDT05GSUdfSEFTX0VUSDIJCTEKKyNkZWZpbmUgQ09ORklHX0hBU19FVEgzCQkxCisKKyNkZWZpbmUgQ09ORklHX0lQQUREUgkJMTkyLjE2OC4wLjUwCisKKyNkZWZpbmUgQ09ORklHX0hPU1ROQU1FCQlzYmM4NjQxZAorI2RlZmluZSBDT05GSUdfUk9PVFBBVEgJCS9vcHQvZWxkay9wcGNfNzR4eAorI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCXVJbWFnZQorCisjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTkyLjE2OC4wLjIKKyNkZWZpbmUgQ09ORklHX0dBVEVXQVlJUAkxOTIuMTY4LjAuMQorI2RlZmluZSBDT05GSUdfTkVUTUFTSwkJMjU1LjI1NS4yNTUuMAorCisvKiBkZWZhdWx0IGxvY2F0aW9uIGZvciB0ZnRwIGFuZCBib290bSAqLworI2RlZmluZSBDT05GSUdfTE9BREFERFIJCTEwMDAwMDAKKworI2RlZmluZSBDT05GSUdfQk9PVERFTEFZIDEwCS8qIC0xIGRpc2FibGVzIGF1dG8tYm9vdCAqLworI3VuZGVmICBDT05GSUdfQk9PVEFSR1MJCS8qIHRoZSBib290IGNvbW1hbmQgd2lsbCBzZXQgYm9vdGFyZ3MgKi8KKworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJMTE1MjAwCisKKyNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkJXAorICAgIm5ldGRldj1ldGgwXDAiCQkJCQkJCVwKKyAgICJjb25zb2xlZGV2PXR0eVMwXDAiCQkJCQkJCVwKKyAgICJyYW1kaXNrYWRkcj0yMDAwMDAwXDAiCQkJCQkJXAorICAgInJhbWRpc2tmaWxlPXVSYW1kaXNrXDAiCQkJCQkJXAorICAgImR0YmFkZHI9NDAwMDAwXDAiCQkJCQkJCVwKKyAgICJkdGJmaWxlPXNiYzg2NDFkLmR0YlwwIgkJCQkJCVwKKyAgICJlbi13ZD1tdy5iIGY4MTAwMDEwIDB4MDg7IGVjaG8gLWV4cGVjdDotIDA4OyBtZC5iIGY4MTAwMDEwIDFcMCIJXAorICAgImRpcy13ZD1tdy5iIGY4MTAwMDEwIDB4MDA7IGVjaG8gLWV4cGVjdDotIDAwOyBtZC5iIGY4MTAwMDEwIDFcMCIJXAorICAgIm1heGNwdXM9MSIKKworI2RlZmluZSBDT05GSUdfTkZTQk9PVENPTU1BTkQJCQkJCQlcCisgICAic2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcncgIgkJCQkJXAorICAgICAgIm5mc3Jvb3Q9JHNlcnZlcmlwOiRyb290cGF0aCAiCQkJCQlcCisgICAgICAiaXA9JGlwYWRkcjokc2VydmVyaXA6JGdhdGV3YXlpcDokbmV0bWFzazokaG9zdG5hbWU6JG5ldGRldjpvZmYgIglcCisgICAgICAiY29uc29sZT0kY29uc29sZWRldiwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzOyIJCQlcCisgICAidGZ0cCAkbG9hZGFkZHIgJGJvb3RmaWxlOyIJCQkJCQlcCisgICAidGZ0cCAkZHRiYWRkciAkZHRiZmlsZTsiCQkJCQkJXAorICAgImJvb3RtICRsb2FkYWRkciAtICRkdGJhZGRyIgorCisjZGVmaW5lIENPTkZJR19SQU1CT09UQ09NTUFORAkJCQkJCVwKKyAgICJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSBydyAiCQkJCQlcCisgICAgICAiaXA9JGlwYWRkcjokc2VydmVyaXA6JGdhdGV3YXlpcDokbmV0bWFzazokaG9zdG5hbWU6JG5ldGRldjpvZmYgIglcCisgICAgICAiY29uc29sZT0kY29uc29sZWRldiwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzOyIJCQlcCisgICAidGZ0cCAkcmFtZGlza2FkZHIgJHJhbWRpc2tmaWxlOyIJCQkJCVwKKyAgICJ0ZnRwICRsb2FkYWRkciAkYm9vdGZpbGU7IgkJCQkJCVwKKyAgICJ0ZnRwICRkdGJhZGRyICRkdGJmaWxlOyIJCQkJCQlcCisgICAiYm9vdG0gJGxvYWRhZGRyICRyYW1kaXNrYWRkciAkZHRiYWRkciIKKworI2RlZmluZSBDT05GSUdfRkxBU0hCT09UQ09NTUFORAkJCQkJCVwKKyAgICJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSBydyAiCQkJCQlcCisgICAgICAiaXA9JGlwYWRkcjokc2VydmVyaXA6JGdhdGV3YXlpcDokbmV0bWFzazokaG9zdG5hbWU6JG5ldGRldjpvZmYgIglcCisgICAgICAiY29uc29sZT0kY29uc29sZWRldiwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzOyIJCQlcCisgICAiYm9vdG0gZmZkMDAwMDAgZmZiMDAwMDAgZmZhMDAwMDAiCisKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5EICBDT05GSUdfRkxBU0hCT09UQ09NTUFORAorCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NjMy5oIGIvaW5jbHVkZS9jb25maWdzL3NjMy5oCmluZGV4IGU0MzU3YjAuLmNiMjI1MzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zYzMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2MzLmgKQEAgLTY4LDggKzY4LDcgQEAKICAqIERlZmluZSBJREVfVVNFU19JU0FfRU1VTEFUSU9OIGZvciBzbG93ZXIgSURFIGFjY2VzcyBpbiB0aGUgSVNBLUlPIGFkZHJlc3MgcmFuZ2UKICAqIElmIHVuZGVmaW5lZCwgSURFIGFjY2VzcyB1c2VzIGEgc2VwZXJhdCBlbXVsYXRpb24gd2l0aCBoaWdoZXIgYWNjZXNzIHNwZWVkLgogICogQ29uc2lkZXIgdG8gaW5mb3JtIHlvdXIgTGludXggSURFIGRyaXZlciBhYm91dCB0aGUgZGlmZmVyZW50IGFkZHJlc3NlcyEKLSAqIElERV9VU0VTX0lTQV9FTVVMQVRJT04gaXMgb25seSB1c2VkIGlmIHlvdXIgQ09ORklHX0NPTU1BTkRTIG1hY3JvIGluY2x1ZGVzCi0gKiB0aGUgQ0ZHX0NNRF9JREUgbWFjcm8hCisgKiBJREVfVVNFU19JU0FfRU1VTEFUSU9OIGlzIG9ubHkgdXNlZCBpZiB5b3UgZGVmaW5lIENPTkZJR19DTURfSURFIQogICovCiAjZGVmaW5lIElERV9VU0VTX0lTQV9FTVVMQVRJT04KIApAQCAtMTY5LDI1ICsxNjgsMzYgQEAKICNkZWZpbmUgQ09ORklHX01JSSAxCQkJLyogYWRkIDQwNUdQIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KICNkZWZpbmUgQ09ORklHX1BIWV9BRERSIDEJLyogdGhlIGNvbm5lY3RlZCBQaHkgZGVmYXVsdHMgdG8gYWRkcmVzcyAxICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgXAotCSAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCUNGR19DTURfQVVUT1NDUklQVAl8IFwKLQkJCUNGR19DTURfUENJCQl8IFwKLQkJCUNGR19DTURfSVJRCQl8IFwKLQkJCUNGR19DTURfTkVUCQl8IFwKLQkJCUNGR19DTURfTUlJCQl8IFwKLQkJCUNGR19DTURfUElORwkJfCBcCi0JCQlDRkdfQ01EX05BTkQJCXwgXAotCQkJQ0ZHX0NNRF9KRkZTMgkJfCBcCi0JCQlDRkdfQ01EX0kyQwkJfCBcCi0JCQlDRkdfQ01EX0lERQkJfCBcCi0JCQlDRkdfQ01EX0RBVEUJCXwgXAotCQkJQ0ZHX0NNRF9ESENQCQl8IFwKLQkJCUNGR19DTURfQ0FDSEUJCXwgXAotCQkJQ0ZHX0NNRF9FTEYJKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworCisjZGVmaW5lIENPTkZJR19DTURfQVVUT1NDUklQVAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0yNzcsNyArMjg3LDcgQEAKICAqIEV4dGVybmFsIHBlcmlwaGVyYWwgYmFzZSBhZGRyZXNzCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLSNpZiAhKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorI2lmICFkZWZpbmVkKENPTkZJR19DTURfSURFKQogCiAjdW5kZWYJQ09ORklHX0lERV9MRUQJCQkvKiBubyBsZWQgZm9yIGlkZSBzdXBwb3J0ZWQJKi8KICN1bmRlZglDT05GSUdfSURFX1JFU0VUCQkvKiBubyByZXNldCBmb3IgaWRlIHN1cHBvcnRlZAkqLwpAQCAtMjg2LDcgKzI5Niw3IEBACiAgKiBJREUvQVRBIHN0dWZmCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLSNlbHNlIC8qICEoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICovCisjZWxzZQogI2RlZmluZSBDT05GSUdfU1RBUlRfSURFCTEJLyogY2hlY2ssIGlmIHVzZSBJREUgKi8KIAogI3VuZGVmCUNPTkZJR19JREVfOHh4X0RJUkVDVAkJLyogbm8gcGNtY2lhIGludGVyZmFjZSByZXF1aXJlZCAqLwpAQCAtMzQ2LDcgKzM1Niw3IEBACiAKICNlbmRpZiAvKiBJREVfVVNFU19JU0FfRU1VTEFUSU9OICovCiAKLSNlbmRpZiAvKiAhKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAqLworI2VuZGlmCiAKIC8qCiAjZGVmaW5lCUNGR19LRVlfUkVHX0JBU0VfQUREUgkweEYwMTAwMDAwCkBAIC00MzcsNyArNDQ3LDcgQEAKIAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUgMzIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAgI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc2M1MjBfY2RwLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2M1MjBfY2RwLmgKaW5kZXggOGIyZWMwNy4uODQ5MWQ5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NjNTIwX2NkcC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zYzUyMF9jZHAuaApAQCAtNjQsMjQgKzY0LDM3IEBACiAgKi8KICNkZWZpbmUgQ09ORklHX01BTExPQ19TSVpFCShDRkdfRU5WX1NJWkUgKyAxMjgqMTAyNCkKIAotCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAgIChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJIHwgQ0ZHX0NNRF9KRkZTMiB8IENGR19DTURfSURFIHwgQ0ZHX0NNRF9ORVQgfCBDRkdfQ01EX0VFUFJPTSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMTUKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgIAkicm9vdD0vZGV2L210ZGJsb2NrMCBjb25zb2xlPXR0eVMwLDk2MDAiCiAvKiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gMzgwMDAwMDAiICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgogCi0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KQEAgLTEwNCw3ICsxMTcsNiBAQAogCQkJCQkJLyogdmFsaWQgYmF1ZHJhdGVzICovCiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogUGh5c2ljYWwgTWVtb3J5IE1hcAogICovCkBAIC0xMTMsOCArMTI1LDYgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEZMQVNIIGFuZCBlbnZpcm9ubWVudCBvcmdhbml6YXRpb24KICAqLwotCi0KICNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkzCS8qIG1heCBudW1iZXIgb2YgbWVtb3J5IGJhbmtzCQkqLwogI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJNjQJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwCSovCiAKQEAgLTEyNSwxMSArMTM1LDkgQEAKICNkZWZpbmUgQ09ORklHX1NQSV9FRVBST00gICAgICAvKiBTdXBwb3J0IGZvciBTUEkgRUVQUk9NcyAoQVQyNTEyOCkgKi8KICNkZWZpbmUgQ09ORklHX01XX0VFUFJPTSAgICAgICAvKiBTdXBwb3J0IGZvciBNaWNyb1dpcmUgRUVQUk9NcyAoQVQ5M0xDNDYpICovCiAKLQogLyogYWxsb3cgdG8gb3ZlcndyaXRlIHNlcmlhbCBhbmQgZXRoYWRkciAqLwogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQogCi0KIC8qIEVudmlyb25tZW50IGluIEVFUFJPTSAqLwogI2RlZmluZSBDRkdfRU5WX0lTX0lOX0VFUFJPTSAgIDEKICNkZWZpbmUgQ09ORklHX1NQSQpAQCAtMjA5LDcgKzIxNyw2IEBACiAjZGVmaW5lIENPTkZJR19JODA0Ml9LQkQKICNkZWZpbmUgQ0ZHX0lTQV9JTyAwCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUlRDCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc2M1MjBfc3B1bmsuaCBiL2luY2x1ZGUvY29uZmlncy9zYzUyMF9zcHVuay5oCmluZGV4IGE4ZTM1NTUuLmM2ZjdmMTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zYzUyMF9zcHVuay5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zYzUyMF9zcHVuay5oCkBAIC02NCwxNiArNjQsMzQgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgICAoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IENGR19DTURfSkZGUzIgfCBDRkdfQ01EX0lERSB8IENGR19DTURfTkVUIHwgQ0ZHX0NNRF9QQ01DSUEgfCBDRkdfQ01EX0VFUFJPTSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUENNQ0lBCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTE1CiAjZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAJInJvb3Q9L2Rldi9tdGRibG9jazEgY29uc29sZT10dHlTMCw5NjAwIG10ZHBhcnRzPXBoeXM6NzkzNmsocm9vdCksMjU2ayh1Ym9vdCkgIgogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIGlwPWF1dG9jb25mIGNvbnNvbGU9dHR5UzAsOTYwMCBtdGRwYXJ0cz1waHlzOjc4MDhrKHJvb3QpLDEyOGsoZW52KSwyNTZrKHVib290KTsgYm9vdHA7IGJvb3RtIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zY2I5MzI4LmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2NiOTMyOC5oCmluZGV4IGE0MjQ5YzQuLmQxNDAyNDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zY2I5MzI4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NjYjkzMjguaApAQCAtMzYsMjAgKzM2LDI3IEBACiAKIAogLyoKLSAqIERlZmluaXRpb24gb2YgdS1ib290IGJ1aWxkIGluIGNvbW1hbmRzLiBDaGVjayBvdXQgQ09ORklHX0NNRF9ERkwgaWYKLSAqIG5lY2Nlc3NhcnkgaW4gaW5jbHVkZS9jbWRfY29uZmRlZnMuaCBmaWxlLiAoVW4pY29tbWVudCBmb3IgZ2V0dGluZwotICogZnVuY3Rpb25hbGl0eSBvciBzaXplIG9mIHUtYm9vdCBjb2RlLgorICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMCQlcCi0JCQkJJiB+Q0ZHX0NNRF9MT0FEUwlcCi0JCQkJJiB+Q0ZHX0NNRF9DT05TT0xFCVwKLQkJCQkmIH5DRkdfQ01EX0FVVE9TQ1JJUFQJXAotCQkJCXwgQ0ZHX0NNRF9ORVQJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9ESENQCQlcCi0JCQkJKQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9DT05TT0xFCisjdW5kZWYgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisKIAogLyoKICAqIEJvb3Qgb3B0aW9ucy4gU2V0dGluZyBkZWxheSB0byAtMSBzdG9wcyBhdXRvc3RhcnQgY291bnQgZG93bi4KQEAgLTE4Miw3ICsxODksNyBAQAogICogUmlnaHQgbm93IHRoZXJlIGlzIG5vIGdhaW4gZm9yIHVzZXIsIGJ1dCBsYXRlciBvbiBib290aW5nIGtlcm5lbCBtaWdodCBiZQogICogcG9zc2libGUuIENvbnNpZGVyIHVzaW5nIFhJUCBrZXJuZWwgcnVubmluZyBmcm9tIGZsYXNoIHRvIHNhdmUgUkFNCiAgKiBmb290cHJpbnQuCi0gKiBOT1RFOiBFbmFibGUgQ0ZHX0NNRF9KRkZTMiBmb3IgSkZGUzIgc3VwcG9ydC4KKyAqIE5PVEU6IEVuYWJsZSBDT05GSUdfQ01EX0pGRlMyIGZvciBKRkZTMiBzdXBwb3J0LgogICovCiAjZGVmaW5lIENGR19KRkZTMl9GSVJTVF9CQU5LCQkwCiAjZGVmaW5lIENGR19KRkZTMl9GSVJTVF9TRUNUT1IJCTUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zZXF1b2lhLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2VxdW9pYS5oCmluZGV4IDMyMTk5OTIuLjNmNzVhNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zZXF1b2lhLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NlcXVvaWEuaApAQCAtMjk5LDkgKzI5OSw2IEBACiAvKiBDb21tZW50IHRoaXMgb3V0IHRvIGVuYWJsZSBVU0IgMS4xIGRldmljZSAqLwogI2RlZmluZSBVU0JfMl8wX0RFVklDRQogCi0jZGVmaW5lIENNRF9VU0IJCQlDRkdfQ01EX1VTQgotI2Vsc2UKLSNkZWZpbmUgQ01EX1VTQgkJCTAJLyogbm8gVVNCIG9uIDQ0MEdSeAkJKi8KICNlbmRpZiAvKiBDT05GSUdfNDQwRVBYICovCiAKIC8qIFBhcnRpdGlvbnMgKi8KQEAgLTMwOSwyNSArMzA2LDQzIEBACiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19JU09fUEFSVElUSU9OCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgIChDT05GSUdfQ01EX0RGTAl8CVwKLQkJCSAgICAgICBDRkdfQ01EX0FTS0VOVgl8CVwKLQkJCSAgICAgICBDRkdfQ01EX0RIQ1AJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9EVFQJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9ESUFHCXwJXAotCQkJICAgICAgIENGR19DTURfRUVQUk9NCXwJXAotCQkJICAgICAgIENGR19DTURfRUxGCXwJXAotCQkJICAgICAgIENGR19DTURfRkFUCXwJXAotCQkJICAgICAgIENGR19DTURfSTJDCXwJXAotCQkJICAgICAgIENGR19DTURfSVJRCXwJXAotCQkJICAgICAgIENGR19DTURfTUlJCXwJXAotCQkJICAgICAgIENGR19DTURfTkFORAl8CVwKLQkJCSAgICAgICBDRkdfQ01EX05FVAl8CVwKLQkJCSAgICAgICBDRkdfQ01EX05GUwl8CVwKLQkJCSAgICAgICBDRkdfQ01EX1BDSQl8CVwKLQkJCSAgICAgICBDRkdfQ01EX1BJTkcJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9SRUdJTkZPCXwJXAotCQkJICAgICAgIENGR19DTURfU0RSQU0JfAlcCi0JCQkgICAgICAgQ01EX1VTQikKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EVFQKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKworI2lmZGVmIENPTkZJR180NDBFUFgKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyNlbmRpZgorCiAKIC8qIFBPU1Qgc3VwcG9ydCAqLwogI2RlZmluZSBDT05GSUdfUE9TVAkJKENGR19QT1NUX01FTU9SWSAgIHwgXApAQCAtMzQ3LDE1ICszNjIsMTIgQEAKIAogI2RlZmluZSBDT05GSUdfU1VQUE9SVF9WRkFUCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJICAgICAgICAiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTQ0NSw3ICs0NTcsNyBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkoMzI8PDEwKSAgLyogRm9yIEFNQ0MgNDQwIENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJICAgICAgLyogLi4uCQkJICAgICAgICAgICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJICAgICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC00NTcsNyArNDY5LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJICAgIC8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc2hhbm5vbi5oIGIvaW5jbHVkZS9jb25maWdzL3NoYW5ub24uaAppbmRleCA1NzI5ODViLi5jMWZhNTNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc2hhbm5vbi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zaGFubm9uLmgKQEAgLTY2LDIxICs2NiwyOCBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNpZiAwIC8qIFhYWCAtIGNhbm5vdCB0ZXN0IElERSBhbnl3YXksIHNvIGRpc2FibGVkIGZvciBub3cgLSB3ZCAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkgQ0ZHX0NNRF9QQ01DSUEJfCBcCi0JCQkJIENGR19DTURfSURFKQotI2VuZGlmIC8qIDAgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJyb290PXJhbWZzIGRldmZzPW1vdW50IGNvbnNvbGU9dHR5U0EwLDExNTIwMCIKICNkZWZpbmUgQ09ORklHX05FVE1BU0sgICAgICAgICAgMjU1LjI1NS4wLjAKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJoZWxwIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zbWRrMjQwMC5oIGIvaW5jbHVkZS9jb25maWdzL3NtZGsyNDAwLmgKaW5kZXggYTEzN2Y5ZC4uMDVmNjA1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NtZGsyNDAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NtZGsyNDAwLmgKQEAgLTg2LDI0ICs4NiwzMiBAQAogLyogVXNlIHMzYzI0MDAncyBSVEMgKi8KICNkZWZpbmUgQ09ORklHX1JUQ19TM0MyNFgwCTEKIAotI2lmbmRlZiBVU0VfOTIwVF9NTVUKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX3RtcCAgICAoKENPTkZJR19DTURfREZMICYgfkNGR19DTURfQ0FDSEUpIHwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX3RtcCAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCisjaWYgZGVmaW5lZChDT05GSUdfSFdGTE9XKQorICAgICNkZWZpbmUgQ09ORklHX0NPTkZJR19IV0ZMT1cKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0hXRkxPVwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ09NTUFORFNfdG1wIHwgQ0ZHX0NNRF9IV0ZMT1cpCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCUNPTkZJR19DT01NQU5EU190bXAKKyNpZiAhZGVmaW5lZChVU0VfOTIwVF9NTVUpCisgICAgI3VuZGVmIENPTkZJR19DTURfQ0FDSEUKICNlbmRpZgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjaWYgMApAQCAtMTE4LDcgKzEyNiw3IEBACiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkidGZ0cDsgYm9vdG0iCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KIC8qIHdoYXQncyB0aGlzID8gaXQncyBub3QgdXNlZCBhbnl3aGVyZSAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc21kazI0MTAuaCBiL2luY2x1ZGUvY29uZmlncy9zbWRrMjQxMC5oCmluZGV4IDdlZGVjMGQuLmNhNDA0ZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zbWRrMjQxMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zbWRrMjQxMC5oCkBAIC03MiwyMiArNzIsMjYgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbW1hbmQgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgXAotCQkJKENPTkZJR19DTURfREZMCSB8IFwKLQkJCUNGR19DTURfQ0FDSEUJIHwgXAotCQkJLypDRkdfQ01EX05BTkQJIHwqLyBcCi0JCQkvKkNGR19DTURfRUVQUk9NIHwqLyBcCi0JCQkvKkNGR19DTURfSTJDCSB8Ki8gXAotCQkJLypDRkdfQ01EX1VTQgkgfCovIFwKLQkJCUNGR19DTURfUkVHSU5GTyAgfCBcCi0JCQlDRkdfQ01EX0RBVEUJIHwgXAotCQkJQ0ZHX0NNRF9FTEYpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKIC8qI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJyb290PXJhbWZzIGRldmZzPW1vdW50IGNvbnNvbGU9dHR5U0EwLDk2MDAiICovCkBAIC05OCw3ICsxMDIsNyBAQAogLyojZGVmaW5lIENPTkZJR19CT09URklMRQkiZWxpbm9zLWxhcnQiICovCiAvKiNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJ0ZnRwOyBib290bSIgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KIC8qIHdoYXQncyB0aGlzID8gaXQncyBub3QgdXNlZCBhbnl3aGVyZSAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc21tYWNvNC5oIGIvaW5jbHVkZS9jb25maWdzL3NtbWFjbzQuaAppbmRleCAxODVjMmQ0Li5hZDY4Yzc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc21tYWNvNC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zbW1hY280LmgKQEAgLTQyLDExICs0Miw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtNjUsMzMgKzYwLDQxIEBACiAJCQkJIENGR19QT1NUX0kyQykKIAogI2lmZGVmIENPTkZJR19QT1NUCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIENGR19DTURfRElBRwogLyogcHJlc2VydmUgc3BhY2UgZm9yIHRoZSBwb3N0X3dvcmQgYXQgZW5kIG9mIG9uLWNoaXAgU1JBTSAqLwogI2RlZmluZSBNUEM1WFhYX1NSQU1fUE9TVF9TSVpFIE1QQzVYWFhfU1JBTV9TSVpFLTQKLSNlbHNlCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIDAKICNlbmRpZgogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VDSE8JfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9QT1NUX0RJQUcgfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKworI2lmZGVmIENPTkZJR19QT1NUCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2VuZGlmCisKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBkaXNwbGF5IGltYWdlIHRpbWVzdGFtcHMgKi8KIApAQCAtMzE5LDcgKzMyMiw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0zMzgsOSArMzQxLDEzIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgotICogRW5hYmxlIGxvb3B3IGNvbW1hbmRvLiBUaGlzIGhhcyBvbmx5IGFmZmVjdCwgaWYgQ0ZHX0NNRF9NRU0gaXMgZGVmaW5lZCwKLSAqIHdoaWNoIGlzIG5vcm1hbGx5IHBhcnQgb2YgdGhlIGRlZmF1bHQgY29tbWFuZHMgKENGVl9DTURfREZMKQorICogRW5hYmxlIGxvb3B3IGNvbW1hbmQuCiAgKi8KICNkZWZpbmUgQ09ORklHX0xPT1BXCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zb3JjZXJ5LmggYi9pbmNsdWRlL2NvbmZpZ3Mvc29yY2VyeS5oCmluZGV4IDQ5Mzc2MzguLmZlMDE0ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zb3JjZXJ5LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NvcmNlcnkuaApAQCAtMzksMTIgKzM5LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODIyMCBDUFVzICovCi0KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNSAgIAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTY5LDMwICs2MywzNSBAQAogI2RlZmluZSBDT05GSUdfUENJX0NGR19QSFlTCUNPTkZJR19QQ0lfQ0ZHX0JVUwogI2RlZmluZSBDT05GSUdfUENJX0NGR19TSVpFCTB4MDEwMDAwMDAKIAorCiAvKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CT09URAl8IFwKLQkJCQlDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfU05UUAl8IFwKLQkJCQkwKQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyoJCQlDRkdfQ01EX01JSQl8IFwgKi8KLS8qCQkJICAgICAgIENGR19DTURfVVNCCXwgXCAqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JPT1RECisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIERlZmF1bHQgRW52aXJvbm1lbnQKQEAgLTI2OCw3ICsyNjcsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCSAgICAvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkgICAgLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yODQsNiArMjgzLDExIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkgICAgLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODIyMCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1ICAgCS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKICAqIFZhcmlvdXMgbG93LWxldmVsIHNldHRpbmdzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zcGMxOTIwLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc3BjMTkyMC5oCmluZGV4IDA5YmJlYmQuLmI0YWI5YWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zcGMxOTIwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NwYzE5MjAuaApAQCAtODAsMjQgKzgwLDMzIEBACiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAjZGVmaW5lIENPTkZJR19CWklQMgkgLyogaW5jbHVkZSBzdXBwb3J0IGZvciBiemlwMiBjb21wcmVzc2VkIGltYWdlcyAqLwogCi0jaWZuZGVmIENPTkZJR19DT01NQU5EUwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMICAgXAotCQkJIHwgQ0ZHX0NNRF9BU0tFTlYgXAotCQkJIHwgQ0ZHX0NNRF9EQVRFIFwKLQkJCSB8IENGR19DTURfRUNITyAgIFwKLQkJCSB8IENGR19DTURfSU1NQVAgIFwKLQkJCSB8IENGR19DTURfSkZGUzIgXAotCQkJIHwgQ0ZHX0NNRF9QSU5HIFwKLQkJCSB8IENGR19DTURfREhDUCBcCi0JCQkgfCBDRkdfQ01EX0kyQyBcCi0JCQkgfCBDRkdfQ01EX01JSSkKLQkJCS8qICYgfiggQ0ZHX0NNRF9ORVQpKSAqLworCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCiAKLSNlbmRpZiAvKiAhQ09ORklHX0NPTU1BTkRTICovCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisKKyN1bmRlZiBDT05GSUdfQ01EX05FVAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xMDcsNyArMTE2LDcgQEAKICNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE5NCw3ICsyMDMsNyBAQAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogCi0jaWZkZWYgQ0ZHX0NNRF9EQVRFCisjaWZkZWYgQ09ORklHX0NNRF9EQVRFCiAjIGRlZmluZSBDT05GSUdfUlRDX0RTMzIzMQogIyBkZWZpbmUgQ0ZHX0kyQ19SVENfQUREUiAgICAgIDB4NjgKICNlbmRpZgpAQCAtMjAyLDcgKzIxMSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBJMkMgY29uZmlndXJhdGlvbgogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JMkMpCiAvKiBlbmFibGUgSTJDIGFuZCBzZWxlY3QgdGhlIGhhcmR3YXJlL3NvZnR3YXJlIGRyaXZlciAqLwogI3VuZGVmIENPTkZJR19IQVJEX0kyQyAgICAgICAgICAgICAgICAgLyogSTJDIHdpdGggaGFyZHdhcmUgc3VwcG9ydCAgICAqLwogI2RlZmluZSBDT05GSUdfU09GVF9JMkMgICAgICAgICAgICAgICAgMSAgICAgICAvKiBJMkMgYml0LWJhbmdlZCAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc3BpZXZhbC5oIGIvaW5jbHVkZS9jb25maWdzL3NwaWV2YWwuaAppbmRleCA5ODg4ZDExLi40YjYxOGYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc3BpZXZhbC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zcGlldmFsLmgKQEAgLTQ0LDExICs0NCw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtODgsMTIgKzgzLDYgQEAKICNkZWZpbmUgQ09ORklHX05TODM4MlgJCTEKICNlbmRpZgkvKiBDT05GSUdfU1RLNTJYWCAqLwogCi0jaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBBRERfUENJX0NNRAkJQ0ZHX0NNRF9QQ0kKLSNlbHNlCi0jZGVmaW5lIEFERF9QQ0lfQ01ECQkwCi0jZW5kaWYKLQogLyoKICAqIFZpZGVvIGNvbnNvbGUKICAqLwpAQCAtMTEwLDEyICs5OSw2IEBACiAjZGVmaW5lIENGR19DT05TT0xFX0lTX0lOX0VOVgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfVklERU8KLSNkZWZpbmUgQUREX0JNUF9DTUQJCUNGR19DTURfQk1QCi0jZWxzZQotI2RlZmluZSBBRERfQk1QX0NNRAkJMAotI2VuZGlmCi0KIC8qIFBhcnRpdGlvbnMgKi8KICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTEyNCwxMCArMTA3LDcgQEAKIC8qIFVTQiAqLwogI2lmZGVmIENPTkZJR19TVEs1MlhYCiAjZGVmaW5lIENPTkZJR19VU0JfT0hDSQotI2RlZmluZSBBRERfVVNCX0NNRAkJQ0ZHX0NNRF9VU0IgfCBDRkdfQ01EX0ZBVAogI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UKLSNlbHNlCi0jZGVmaW5lIEFERF9VU0JfQ01ECQkwCiAjZW5kaWYKIAogLyogUE9TVCBzdXBwb3J0ICovCkBAIC0xMzYsNDMgKzExNiw2MCBAQAogCQkJCSBDRkdfUE9TVF9JMkMpCiAKICNpZmRlZiBDT05GSUdfUE9TVAotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyBDRkdfQ01EX0RJQUcKIC8qIHByZXNlcnZlIHNwYWNlIGZvciB0aGUgcG9zdF93b3JkIGF0IGVuZCBvZiBvbi1jaGlwIFNSQU0gKi8KICNkZWZpbmUgTVBDNVhYWF9TUkFNX1BPU1RfU0laRSBNUEM1WFhYX1NSQU1fU0laRS00Ci0jZWxzZQotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyAwCiAjZW5kaWYKIAotLyogSURFICovCi0jaWYgZGVmaW5lZCAoQ09ORklHX01JTklGQVApIHx8IGRlZmluZWQgKENPTkZJR19TVEs1MlhYKQotI2RlZmluZSBBRERfSURFX0NNRAkJKENGR19DTURfSURFIHwgQ0ZHX0NNRF9GQVQgfCBDRkdfQ01EX0VYVDIpCi0jZWxzZQotI2RlZmluZSBBRERfSURFX0NNRAkJMAotI2VuZGlmCiAKIC8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlBRERfQk1QX0NNRAl8IFwKLQkJCQlBRERfSURFX0NNRAl8IFwKLQkJCQlBRERfUENJX0NNRAl8IFwKLQkJCQlBRERfVVNCX0NNRAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUNITwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9QT1NUX0RJQUcgfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfU05UUAkpCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKKyNpZiBkZWZpbmVkKENPTkZJR19NSU5JRkFQKSB8fCBkZWZpbmVkKENPTkZJR19TVEs1MlhYKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRkFUCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0VYVDIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NUSzUyWFgKKyAgICAjZGVmaW5lIENPTkZJR19DTURfVVNCCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVklERU8KKyAgICAjZGVmaW5lIENPTkZJR19DTURfQk1QCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0kKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QT1NUCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2VuZGlmCisKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBkaXNwbGF5IGltYWdlIHRpbWVzdGFtcHMgKi8KIApAQCAtNDA2LDcgKzQwMyw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC00MjUsOSArNDIyLDEzIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgotICogRW5hYmxlIGxvb3B3IGNvbW1hbmRvLiBUaGlzIGhhcyBvbmx5IGFmZmVjdCwgaWYgQ0ZHX0NNRF9NRU0gaXMgZGVmaW5lZCwKLSAqIHdoaWNoIGlzIG5vcm1hbGx5IHBhcnQgb2YgdGhlIGRlZmF1bHQgY29tbWFuZHMgKENGVl9DTURfREZMKQorICogRW5hYmxlIGxvb3B3IGNvbW1hbmQuCiAgKi8KICNkZWZpbmUgQ09ORklHX0xPT1BXCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zdHhncDMuaCBiL2luY2x1ZGUvY29uZmlncy9zdHhncDMuaAppbmRleCAyMTA2NWI5Li4xZjQxY2Y3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc3R4Z3AzLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3N0eGdwMy5oCkBAIC0yOTgsMzQgKzI5OCwzOCBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKwogI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kgfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9JMkMpICYgXAotCQkJCSB+KENGR19DTURfRU5WIHwgXAotCQkJCSAgQ0ZHX0NNRF9MT0FEUyApKQotICAjZWxpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpCi0gICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HIHwgXAotCQkJCUNGR19DTURfTUlJIHwgQ0ZHX0NNRF9JMkMgKSAmIFwKLQkJCQl+KENGR19DTURfRU5WKSkKLSAgI2VsaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTUlJIHwgXAotCQkJCUNGR19DTURfUElORyB8IENGR19DTURfSTJDKSAmIFwKLQkJCQl+KENGR19DTURfRU5WKSkKLSAgI2VuZGlmCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKICNlbHNlCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IFwKLQkJCQlDRkdfQ01EX0VMRiB8IENGR19DTURfUElORyB8IENGR19DTURfSTJDKQotICAjZWxpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpCi0gICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BJTkcgfCBcCi0JCQkJQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX01JSSB8IENGR19DTURfSTJDKQotICAjZWxpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpCi0gICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX01JSSB8IFwKLQkJCQlDRkdfQ01EX0VMRiB8IENGR19DTURfUElORyB8IENGR19DTURfSTJDKQotICAjZW5kaWYKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRUxGCiAjZW5kaWYKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMzM0LDcgKzMzOCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIkdQUFA9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM1NSw3ICszNTksNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKQEAgLTM2Nyw3ICszNzEsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc3R4c3NhLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc3R4c3NhLmgKaW5kZXggMmU1MjdiMi4uNTVlMmM4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3N0eHNzYS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zdHhzc2EuaApAQCAtMzI1LDM0ICszMjUsMzkgQEAKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdHMJKi8KIAotI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kgfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9JMkMpICYgXAotCQkJCSB+KENGR19DTURfRU5WIHwgXAotCQkJCSAgQ0ZHX0NNRF9MT0FEUyApKQotICAjZWxpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpCi0gICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HIHwgXAotCQkJCUNGR19DTURfTUlJIHwgQ0ZHX0NNRF9JMkMgKSAmIFwKLQkJCQl+KENGR19DTURfRU5WKSkKLSAgI2VsaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTUlJIHwgXAotCQkJCUNGR19DTURfUElORyB8IENGR19DTURfSTJDKSAmIFwKLQkJCQl+KENGR19DTURfRU5WKSkKLSAgI2VuZGlmCi0jZWxzZQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kgfCBcCi0JCQkJQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykKLSAgI2VsaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HIHwgXAotCQkJCUNGR19DTURfRUxGIHwgQ0ZHX0NNRF9NSUkgfCBDRkdfQ01EX0kyQykKLSAgI2VsaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9NSUkgfCBcCi0JCQkJQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykKLSAgI2VuZGlmCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpIHx8IGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKKyAgICAjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbHNlCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2VuZGlmCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0zNjEsNyArMzY2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiU1NBPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zODIsNyArMzg3LDcgQEAKIC8qIENhY2hlIENvbmZpZ3VyYXRpb24gKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC0zOTQsNyArMzk5LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3N0eHh0Yy5oIGIvaW5jbHVkZS9jb25maWdzL3N0eHh0Yy5oCmluZGV4IDYxNGEwNDYuLjBkYmY0YjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zdHh4dGMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc3R4eHRjLmgKQEAgLTc3LDcgKzc3LDE2IEBACiAjZGVmaW5lCUNPTkZJR19TVEFUVVNfTEVECTEJLyogU3RhdHVzIExFRCBlbmFibGVkCQkqLwogI2RlZmluZSBDT05GSUdfQk9BUkRfU1BFQ0lGSUNfTEVECS8qIHZlcnNpb24gaGFzIGJvYXJkIHNwZWNpZmljIGxlZHMgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSB8IENPTkZJR19CT09UUF9OSVNET01BSU4pCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfTklTRE9NQUlOCisKIAogI3VuZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCiAjdW5kZWYgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTEwMCwxOSArMTA5LDIyIEBACiAKICNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUJMQkvKiBhbGxvdyBtb2RpZmljYXRpb24gb2YgdmVuZG9yIHBhcmFtcyAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HICAJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMpCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9GCTEKICNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwpAQCAtMTIyLDcgKzEzNCw3IEBACiAjZGVmaW5lIENGR19IVVNIX1BBUlNFUgkxCiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMTMsNyArMjI1LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zdXpha3UuaCBiL2luY2x1ZGUvY29uZmlncy9zdXpha3UuaAppbmRleCA4MjI0NTU1Li4wOGFjOWNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc3V6YWt1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3N1emFrdS5oCkBAIC01NSwxMCArNTUsMjEgQEAKICNkZWZpbmUgTUlDUk9CTEFaRV9TWVNSRUdfQkFTRV9BRERSIDB4RkZGRkEwMDAKICNkZWZpbmUgTUlDUk9CTEFaRV9TWVNSRUdfUkVDT05GSUdVUkUgKDEgPDwgMCkKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfX0NNRF9ERkwpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKIAogI2RlZmluZSBDRkdfVUFSVDFfQkFTRQkJKDB4RkZGRjIwMDApCiAjZGVmaW5lIENPTkZJR19TRVJJQUxfQkFTRQlDRkdfVUFSVDFfQkFTRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3N2bV9zYzh4eC5oIGIvaW5jbHVkZS9jb25maWdzL3N2bV9zYzh4eC5oCmluZGV4IDkyZWU4Y2IuLjNiOTBmM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zdm1fc2M4eHguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc3ZtX3NjOHh4LmgKQEAgLTEyNSwyMiArMTI1LDMyIEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOViAgfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRE9DCXwgXAotLyoJCQkJQ0ZHX0NNRF9JREUgICAgIHwqLyBcCi0JCQkJQ0ZHX0NNRF9EQVRFCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRE9DCisjZGVmaW5lIENPTkZJR19DTURfREFURQorCisKICNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAKIC8qCkBAIC0xNTMsNyArMTYzLDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMiAgICAgIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI0Niw3ICsyNTYsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvdGFpaHUuaCBiL2luY2x1ZGUvY29uZmlncy90YWlodS5oCmluZGV4IDYxODE0YTguLmQ2MjNlNTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy90YWlodS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy90YWlodS5oCkBAIC0xMTksMjQgKzExOSwzMyBAQAogI2RlZmluZSBDRkdfUlhfRVRIX0JVRkZFUgkxNgkvKiBOdW1iZXIgb2YgZXRoZXJuZXQgcnggYnVmZmVycyAmIGRlc2NyaXB0b3JzICovCiAjZGVmaW5lIENPTkZJR19QSFlfUkVTRVQJMQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfQ0FDSEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfU1BJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTQkpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9TUEkKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTE2Miw3ICsxNzEsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xOTIsNyArMjAxLDYgQEAKIAogI2RlZmluZSBDT05GSUdfVUFSVDFfQ09OU09MRQkxCiAKLQogLyogVGhlIGZvbGxvd2luZyB0YWJsZSBpbmNsdWRlcyB0aGUgc3VwcG9ydGVkIGJhdWRyYXRlcyAqLwogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUgIFwKICAgICB7MzAwLCA2MDAsIDEyMDAsIDI0MDAsIDQ4MDAsIDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwgMjMwNDAwfQpAQCAtMjE5LDExICsyMjcsOCBAQAogI2RlZmluZSBDRkdfSTJDX05PUFJPQkVTCXsgMHg2OSB9IC8qIGF2b2lkIGlwcm9iZSBoYW5ndXAgKHdoeT8pICovCiAjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9ERUxBWV9NUwk2IC8qIDI0QzAyIHJlcXVpcmVzIDVtcyBkZWxheSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRUVQUk9NKQogI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSCTB4NTAJLyogSTJDIGJvb3QgRUVQUk9NICgyNEMwMlcpCSovCiAjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOCTEJLyogQnl0ZXMgb2YgYWRkcmVzcwkJKi8KLSNlbmRpZgotCiAKICNkZWZpbmUgQ09ORklHX1NPRlRfU1BJCiAjZGVmaW5lIFNQSV9TQ0wgIHNwaV9zY2wKQEAgLTM2NSw5ICszNzAsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIElCTSA0MDVFUCBDUFUgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKIAogLyoKICAqIEluaXQgTWVtb3J5IENvbnRyb2xsZXI6CkBAIC00NjUsNyArNDY4LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvdGFpc2hhbi5oIGIvaW5jbHVkZS9jb25maWdzL3RhaXNoYW4uaAppbmRleCBkNzU2YmU3Li5iYWE0ZmJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvdGFpc2hhbi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy90YWlzaGFuLmgKQEAgLTIzNCwyNyArMjM0LDM2IEBACiAKICNkZWZpbmUgQ09ORklHX05FVENPTlNPTEUJCS8qIGluY2x1ZGUgTmV0Q29uc29sZSBzdXBwb3J0CSovCiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvbnNvbGUvQ29tbWFuZHMvUGFyc2VyCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfRFRUCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8pCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0RUVAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0yNjMsNyArMjcyLDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSAgICAgICAgIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMTUsNyArMzI0LDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgJLyogRm9yIEFNQ0MgNDQwIENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC0zMjcsNyArMzM2LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy90YjAyMjkuaCBiL2luY2x1ZGUvY29uZmlncy90YjAyMjkuaAppbmRleCBkYWMxZWI3Li5hMjFhZjIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvdGIwMjI5LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3RiMDIyOS5oCkBAIC04NywxMyArODcsMjcgQEAKIC8qI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInJ1biBmbGFzaF9sb2NhbCIgKi8KICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJydW4gbmV0Ym9vdCIKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQkgQ0ZHX0NNRF9BU0tFTlYgfCBcCi0JCQkJIENGR19DTURfREhDUAl8IFwKLQkJCQkgQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCSBDRkdfQ01EX1BDSQl8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYJKQotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3RyYWIuaCBiL2luY2x1ZGUvY29uZmlncy90cmFiLmgKaW5kZXggYTJkYzhlNy4uZGJjY2VhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3RyYWIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvdHJhYi5oCkBAIC04MCwxMCArODAsMTcgQEAKICNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TIDEwCiAKIC8qIFVTQiBzdHVmZiAqLwotI2RlZmluZSBDT05GSUdfVVNCX09IQ0kJCTEKKyNkZWZpbmUgQ09ORklHX1VTQl9PSENJX05FVwkxCiAjZGVmaW5lIENPTkZJR19VU0JfU1RPUkFHRQkxCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCTEKIAorI3VuZGVmIENGR19VU0JfT0hDSV9CT0FSRF9JTklUCisjZGVmaW5lIENGR19VU0JfT0hDSV9DUFVfSU5JVAkxCisKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1JFR1NfQkFTRQkweDE0MjAwMDAwCisjZGVmaW5lIENGR19VU0JfT0hDSV9TTE9UX05BTUUJInMzYzI0MDAiCisjZGVmaW5lIENGR19VU0JfT0hDSV9NQVhfUk9PVF9QT1JUUwkxNQorCiAvKgogICogU2l6ZSBvZiBtYWxsb2MoKSBwb29sCiAgKi8KQEAgLTEzMCw2MCArMTM3LDUwIEBACiAvKiBVc2UgczNjMjQwMCdzIFJUQyAqLwogI2RlZmluZSBDT05GSUdfUlRDX1MzQzI0WDAJMQogCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKwogI2lmZGVmIENPTkZJR19IV0ZMT1cKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX0FERF9IV0ZMT1cJQ0ZHX0NNRF9IV0ZMT1cKLSNlbHNlCi0jZGVmaW5lCUNPTkZJR19DT01NQU5EU19BRERfSFdGTE9XCTAKKyAgICAjZGVmaW5lIENPTkZJR19DTURfSFdGTE9XCiAjZW5kaWYKIAogI2lmZGVmCUNPTkZJR19WRkQKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX0FERF9WRkQJCUNGR19DTURfVkZECi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFNfQUREX1ZGRAkJMAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9WRkQKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9TM0MyNFgwX0kyQwotI2RlZmluZSBDT05GSUdfQ09NTUFORFNfQUREX0VFUFJPTQlDRkdfQ01EX0VFUFJPTQotI2RlZmluZSBDT05GSUdfQ09NTUFORFNfSTJDCQlDRkdfQ01EX0kyQwotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX0FERF9FRVBST00JMAotI2RlZmluZSBDT05GSUdfQ09NTUFORFNfSTJDCQkwCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9JMkMKICNlbmRpZgogCiAjaWZuZGVmIFVTRV85MjBUX01NVQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgICgoQ09ORklHX0NNRF9ERkwgJiB+Q0ZHX0NNRF9DQUNIRSkgfCBcCi0JCQkJQ09ORklHX0NPTU1BTkRTX0FERF9IV0ZMT1cJfCBcCi0JCQkJQ09ORklHX0NPTU1BTkRTX0FERF9WRkQJCXwgXAotCQkJCUNPTkZJR19DT01NQU5EU19BRERfRUVQUk9NCXwgXAotCQkJCUNPTkZJR19DT01NQU5EU19JMkMJCXwgXAotCQkJCUNGR19DTURfQlNQCQkJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCQkJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCQkJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJCQl8IFwKLQkJCQlDRkdfQ01EX05GUwkJCXwgXAotCQkJCUNGR19DTURfU05UUAkJCXwgXAotCQkJCUNGR19DTURfVVNCCSkKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCQkJfCBcCi0JCQkJQ09ORklHX0NPTU1BTkRTX0FERF9IV0ZMT1cJfCBcCi0JCQkJQ09ORklHX0NPTU1BTkRTX0FERF9WRkQJCXwgXAotCQkJCUNPTkZJR19DT01NQU5EU19BRERfRUVQUk9NCXwgXAotCQkJCUNPTkZJR19DT01NQU5EU19JMkMJCXwgXAotCQkJCUNGR19DTURfQlNQCQkJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCQkJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCQkJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJCQl8IFwKLQkJCQlDRkdfQ01EX05GUwkJCXwgXAotCQkJCUNGR19DTURfU05UUAkJCXwgXAotCQkJCUNGR19DTURfVVNCCSkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9DQUNIRQogI2VuZGlmCiAKKwogLyogbW92ZWQgdXAgKi8KICNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCQkxCS8qIHVzZSAiaHVzaCIgY29tbWFuZCBwYXJzZXIJKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQogI2RlZmluZSBDT05GSUdfWkVST19CT09UREVMQVlfQ0hFQ0sJLyogYWxsb3cgdG8gYnJlYWsgaW4gYWx3YXlzICovCiAjZGVmaW5lIENPTkZJR19QUkVCT09UCQkiZWNobztlY2hvICoqKiBib290aW5nICoqKjtlY2hvIgpAQCAtMjk2LDcgKzI5Myw3IEBACiAjZGVmaW5lIENPTkZJR19BVVRPQk9PVF9ERUxBWV9TVFIJIlIiCS8qIDFzdCAicGFzc3dvcmQiCSovCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KIC8qIHdoYXQncyB0aGlzID8gaXQncyBub3QgdXNlZCBhbnl3aGVyZSAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvdWMxMDAuaCBiL2luY2x1ZGUvY29uZmlncy91YzEwMC5oCmluZGV4IGM0ZTYyOWEuLjkyMTQ4ZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy91YzEwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy91YzEwMC5oCkBAIC05OCw3ICs5OCwxNSBAQAogCiAjdW5kZWYgQ09ORklHX1NUQVRVU19MRUQgICAgICAgICAgICAgICAgLyogbm8gc3RhdHVzLWxlZCAgICAgICAgICAgICAgICAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTExNywzMiArMTI1LDMyIEBACiAJCQkJQ0ZHX1BPU1RfU1BSICkKICN1bmRlZiAgQ09ORklHX1BPU1QKIAorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogI2lmZGVmIENPTkZJR19QT1NUCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHICAgICAgIENGR19DTURfRElBRwotI2Vsc2UKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcJMAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURSAgICB8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUE9TVF9ESUFHIHwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKICNkZWZpbmUgQ09ORklHX05FVENPTlNPTEUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCkBAIC0xNTYsNyArMTY0LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjQ2LDcgKzI1NCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy91YzEwMS5oIGIvaW5jbHVkZS9jb25maWdzL3VjMTAxLmgKaW5kZXggZmYwNjFlZS4uM2I0NzFkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3VjMTAxLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3VjMTAxLmgKQEAgLTM4LDExICszOCw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwotI2VuZGlmCi0KICNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfUgogCiAvKgpAQCAtNTUsMjUgKzUwLDM0IEBACiAvKiBQYXJ0aXRpb25zICovCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESVNQTEFZCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9EVFQJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESVNQTEFZCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9EVFQKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCTEJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCkBAIC0yNDUsNyArMjQ5LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTI2NCw5ICsyNjgsMTMgQEAKIAogI2RlZmluZSBDRkdfSFoJCQkxMDAwCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcwkJCSovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCisjZW5kaWYKKwogLyoKLSAqIEVuYWJsZSBsb29wdyBjb21tYW5kby4gVGhpcyBoYXMgb25seSBhZmZlY3QsIGlmIENGR19DTURfTUVNIGlzIGRlZmluZWQsCi0gKiB3aGljaCBpcyBub3JtYWxseSBwYXJ0IG9mIHRoZSBkZWZhdWx0IGNvbW1hbmRzIChDRlZfQ01EX0RGTCkKKyAqIEVuYWJsZSBsb29wdyBjb21tYW5kLgogICovCiAjZGVmaW5lIENPTkZJR19MT09QVwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvdXR4ODI0NS5oIGIvaW5jbHVkZS9jb25maWdzL3V0eDgyNDUuaAppbmRleCBlNWQ0Mzk3Li5jZDAwYzQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvdXR4ODI0NS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy91dHg4MjQ1LmgKQEAgLTg2LDE4ICs4NiwzNiBAQAogCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9ERkwgfCBDRkdfQ01EX0JESSB8IENGR19DTURfUENJIFwKLQkJCQkJCQkJfCBDRkdfQ01EX0ZMQVNIIHwgQ0ZHX0NNRF9NRU1PUlkgXAotCQkJCQkJCQl8IENGR19DTURfRU5WIHwgQ0ZHX0NNRF9DT05TT0xFIFwKLQkJCQkJCQkJfCBDRkdfQ01EX0xPQURTIHwgQ0ZHX0NNRF9MT0FEQiBcCi0JCQkJCQkJCXwgQ0ZHX0NNRF9JTUkgfCBDRkdfQ01EX0NBQ0hFIFwKLQkJCQkJCQkJfCBDRkdfQ01EX1JFR0lORk8gfCBDRkdfQ01EX05FVFwKLQkJCQkJCQkJfCBDRkdfQ01EX0RIQ1AgfCBDRkdfQ01EX0kyQyBcCi0JCQkJCQkJCXwgQ0ZHX0NNRF9EQVRFKQogCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCisvKgorICogQk9PVFAgb3B0aW9ucwogICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9DT05TT0xFCisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCiAKIAogLyoKQEAgLTQwMyw3ICs0MjEsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3YzNy5oIGIvaW5jbHVkZS9jb25maWdzL3YzNy5oCmluZGV4IGEyZTk5YjUuLjA0MDcyNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy92MzcuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvdjM3LmgKQEAgLTc2LDE2ICs3NiwzMCBAQAogCiAjZGVmaW5lCUNPTkZJR19DQU5fRFJJVkVSCTEJLyogQ0FOIERyaXZlciBzdXBwb3J0IGVuYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfREFURQorCiAKIC8qCiAgKiBKRkZTMiBwYXJ0aXRpb25zCkBAIC0xMDUsMTUgKzExOSwxMiBAQAogI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz12MzctMTotKGpmZnMyKSIKICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTk0LDcgKzIwNSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy92MzhiLmggYi9pbmNsdWRlL2NvbmZpZ3MvdjM4Yi5oCmluZGV4IDBiN2IxOWUuLmMwYjFhMTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy92MzhiLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3YzOGIuaApAQCAtNDYsMTEgKzQ2LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtODksMjkgKzg0LDM4IEBACiAjZGVmaW5lIENPTkZJR19VU0JfQ0xPQ0sJMHgwMDAxQkJCQgogI2RlZmluZSBDT05GSUdfVVNCX0NPTkZJRwkweDAwMDAxMDAwCiAKKwogLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcworICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMCXwgXAotCQkJCSBDRkdfQ01EX0ZBVAl8IFwKLQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJIENGR19DTURfSURFCXwgXAotCQkJCSBDRkdfQ01EX1BJTkcJfCBcCi0JCQkJIENGR19DTURfREhDUAl8IFwKLQkJCQkgQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCSBDRkdfQ01EX0lSUQl8IFwKLQkJCQkgQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQkgQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJIENGR19DTURfU0RSQU0JfCBcCi0JCQkJIENGR19DTURfREFURQl8IFwKLQkJCQkgQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJIENGR19DTURfRkFUKQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisKIAogI2RlZmluZSBDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIEJvb3QgbG93IHdpdGggMTYgTUIgRmxhc2gKICAqLwpAQCAtMjU0LDcgKzI1OCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtMjcwLDYgKzI3NCwxMSBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKICAqIFZhcmlvdXMgbG93LWxldmVsIHNldHRpbmdzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy92ZXJzYXRpbGUuaCBiL2luY2x1ZGUvY29uZmlncy92ZXJzYXRpbGUuaAppbmRleCAxNmRiNDNiLi5kMjUwMTUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvdmVyc2F0aWxlLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3ZlcnNhdGlsZS5oCkBAIC05NiwxNCArOTYsMjkgQEAKICNkZWZpbmUgQ0ZHX1NFUklBTDAJCTB4MTAxRjEwMDAKICNkZWZpbmUgQ0ZHX1NFUklBTDEJCTB4MTAxRjIwMDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKENGR19DTURfREhDUCB8IENGR19DTURfSU1JIHwgQ0ZHX0NNRF9ORVQgfCBDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0JESSB8IENGR19DTURfTUVNT1JZIHwgQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfRU5WKQogCi0vKiNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCShDRkdfQ01EX0lNSSB8IENGR19DTURfQkRJIHwgQ0ZHX0NNRF9NRU1PUlkpICovCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfREVGQVVMVAorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMgogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgInJvb3Q9L2Rldi9uZnMgbWVtPTEyOE0gaXA9ZGhjcCBuZXRkZXY9MjUsMCwweGYxMDEwMDAwLDB4ZjEwMTAwMTAsZXRoMCIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy92aXJ0bGFiMi5oIGIvaW5jbHVkZS9jb25maWdzL3ZpcnRsYWIyLmgKaW5kZXggMDZkODUzNi4uNTYxYThiYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3ZpcnRsYWIyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3ZpcnRsYWIyLmgKQEAgLTg5LDM0ICs4OSwzOCBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2lmZGVmCUNPTkZJR19TUExBU0hfU0NSRUVOCi0jIGRlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfQk1QCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKLSNlbHNlCi0jIGRlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKworI2lmIGRlZmluZWQoQ09ORklHX1NQTEFTSF9TQ1JFRU4pCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0JNUAogI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTEzMSw3ICsxMzUsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMTQsNyArMjE4LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3ZvaWNlYmx1ZS5oIGIvaW5jbHVkZS9jb25maWdzL3ZvaWNlYmx1ZS5oCmluZGV4IDRlOTdiMDEuLjdjYWIzMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy92b2ljZWJsdWUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvdm9pY2VibHVlLmgKQEAgLTEzMSwzMyArMTMxLDM4IEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CiAKLSNpZmRlZiBWT0lDRUJMVUVfU01BTExfRkxBU0gKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9CREkgICAgfAlcCi0JCQkJIENGR19DTURfTE9BREIgIHwJXAotCQkJCSBDRkdfQ01EX0lNSSAgICB8CVwKLQkJCQkgQ0ZHX0NNRF9GTEFTSCAgfAlcCi0JCQkJIENGR19DTURfTUVNT1JZIHwJXAotCQkJCSBDRkdfQ01EX05FVCAgICB8CVwKLQkJCQkgQ0ZHX0NNRF9CT09URCAgfAlcCi0JCQkJIENGR19DTURfREhDUCAgIHwJXAotCQkJCSBDRkdfQ01EX1BJTkcgICB8CVwKLQkJCQkgQ0ZHX0NNRF9SVU4pCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0JESSAgICB8CVwKLQkJCQkgQ0ZHX0NNRF9MT0FEQiAgfAlcCi0JCQkJIENGR19DTURfSU1JICAgIHwJXAotCQkJCSBDRkdfQ01EX0ZMQVNIICB8CVwKLQkJCQkgQ0ZHX0NNRF9NRU1PUlkgfAlcCi0JCQkJIENGR19DTURfTkVUICAgIHwJXAotCQkJCSBDRkdfQ01EX0VOViAgICB8CVwKLQkJCQkgQ0ZHX0NNRF9CT09URCAgfAlcCi0JCQkJIENGR19DTURfREhDUCAgIHwJXAotCQkJCSBDRkdfQ01EX1BJTkcgICB8CVwKLQkJCQkgQ0ZHX0NNRF9SVU4gICAgfAlcCi0JCQkJIENGR19DTURfSkZGUzIpCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX0JPT1RECisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKworI2lmICFkZWZpbmVkKFZPSUNFQkxVRV9TTUFMTF9GTEFTSCkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRU5WCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfREVGQVVMVAorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKworCiAjZGVmaW5lIENPTkZJR19MT09QVwogCiAjaWZkZWYgVk9JQ0VCTFVFX1NNQUxMX0ZMQVNICkBAIC0yMjAsOCArMjI1LDYgQEAKIAogI2VuZGlmCS8qIFZPSUNFQkxVRV9TTUFMTF9GTEFTSCAqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvd2FsbnV0LmggYi9pbmNsdWRlL2NvbmZpZ3Mvd2FsbnV0LmgKaW5kZXggYjM0ZGM3MS4uMTgwNTQ5ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3dhbG51dC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy93YWxudXQuaApAQCAtOTgsMjYgKzk4LDM4IEBACiAKICNkZWZpbmUgQ09ORklHX1JUQ19EUzE3NHgJMQkvKiB1c2UgRFMxNzQzIFJUQyBpbiBXYWxudXQJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElBRwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfU0RSQU0JfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0xMjgsNyArMTQwLDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjgzLDcgKzI5NSw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC0zNDAsNyArMzUyLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy93ZXBlcDI1MC5oIGIvaW5jbHVkZS9jb25maWdzL3dlcGVwMjUwLmgKaW5kZXggNDcyNTFiYi4uYzY3YjMwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3dlcGVwMjUwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3dlcGVwMjUwLmgKQEAgLTM2LDE4ICszNiwyNCBAQAogCiAKIC8qCi0gKiBEZWZpbml0aW9uIG9mIHUtYm9vdCBidWlsZCBpbiBjb21tYW5kcy4gQ2hlY2sgb3V0IENPTkZJR19DTURfREZMIGlmCi0gKiBuZWNjZXNzYXJ5IGluIGluY2x1ZGUvY21kX2NvbmZkZWZzLmggZmlsZS4gKFVuKWNvbW1lbnQgZm9yIGdldHRpbmcKLSAqIGZ1bmN0aW9uYWxpdHkgb3Igc2l6ZSBvZiB1LWJvb3QgY29kZS4KKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgICAoQ09ORklHX0NNRF9ERkwJCVwKLQkJCQkmIH5DRkdfQ01EX05FVCAJCVwKLQkJCQkmIH5DRkdfQ01EX0xPQURTCVwKLQkJCQkmIH5DRkdfQ01EX0NPTlNPTEUJXAotCQkJCSYgfkNGR19DTURfQVVUT1NDUklQVAlcCi0vKgkJCQl8IENGR19DTURfSkZGUzIgKi8JXAotCQkJCSkKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX05FVAorI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyN1bmRlZiBDT05GSUdfQ01EX0NPTlNPTEUKKyN1bmRlZiBDT05GSUdfQ01EX0FVVE9TQ1JJUFQKKwogCiAvKgogICogQm9vdCBvcHRpb25zLiBTZXR0aW5nIGRlbGF5IHRvIC0xIHN0b3BzIGF1dG9zdGFydCBjb3VudCBkb3duLgpAQCAtMTUyLDcgKzE1OCw3IEBACiAgKiBSaWdodCBub3cgdGhlcmUgaXMgbm8gZ2FpbiBmb3IgdXNlciwgYnV0IGxhdGVyIG9uIGJvb3Rpbmcga2VybmVsIG1pZ2h0IGJlCiAgKiBwb3NzaWJsZS4gQ29uc2lkZXIgdXNpbmcgWElQIGtlcm5lbCBydW5uaW5nIGZyb20gZmxhc2ggdG8gc2F2ZSBSQU0KICAqIGZvb3RwcmludC4KLSAqIE5PVEU6IEVuYWJsZSBDRkdfQ01EX0pGRlMyIGZvciBKRkZTMiBzdXBwb3J0LgorICogTk9URTogRW5hYmxlIENPTkZJR19DTURfSkZGUzIgZm9yIEpGRlMyIHN1cHBvcnQuCiAgKi8KICNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksJCTAKICNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX1NFQ1RPUgkJNQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3hhZW5pYXguaCBiL2luY2x1ZGUvY29uZmlncy94YWVuaWF4LmgKaW5kZXggMTAzOTc2Mi4uNzQxODk4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3hhZW5pYXguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MveGFlbmlheC5oCkBAIC02NCwxNSArNjQsMjkgQEAKIAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfSAvKiB2YWxpZCBiYXVkcmF0ZXMgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgICgoQ09ORklHX0NNRF9ERkwgJiB+Q0ZHX0NNRF9EVFQpIHwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKworI3VuZGVmIENPTkZJR19DTURfRFRUCisKIAogI2RlZmluZSBDT05GSUdfRVRIQUREUgkJMDg6MDA6M2U6MjY6MGE6NWIKICNkZWZpbmUgQ09ORklHX05FVE1BU0sJCTI1NS4yNTUuMjU1LjAKQEAgLTg2LDcgKzEwMCw3IEBACiAjZGVmaW5lIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUyAJMQogI2RlZmluZSBDT05GSUdfSU5JVFJEX1RBRwkJMQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCQkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3htMjUwLmggYi9pbmNsdWRlL2NvbmZpZ3MveG0yNTAuaAppbmRleCA4MjViZmQxLi5iY2QxNmVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MveG0yNTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MveG0yNTAuaApAQCAtODEsMTQgKzgxLDI2IEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJIENGR19DTURfRUVQUk9NIHwgXAotCQkJCSBDRkdfQ01EX0RBVEUJfCBcCi0JCQkJIENGR19DTURfSTJDCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MveHNlbmdpbmUuaCBiL2luY2x1ZGUvY29uZmlncy94c2VuZ2luZS5oCmluZGV4IGRjNzAyY2YuLjU3MzM5MzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy94c2VuZ2luZS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy94c2VuZ2luZS5oCkBAIC0xMDIsMTAgKzEwMiwyNiBAQAogCiAvKiBhbGxvdyB0byBvdmVyd3JpdGUgc2VyaWFsIGFuZCBldGhhZGRyICovCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJCTExNTIwMAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX01NQyB8IENGR19DTURfRkFUIHwgQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9KRkZTMikKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX01NQworI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkJMwogI2RlZmluZSBDT05GSUdfRVRIQUREUgkJCUZGOkZGOkZGOkZGOkZGOkZGCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MveHVwdjJwLmggYi9pbmNsdWRlL2NvbmZpZ3MveHVwdjJwLmgKaW5kZXggYjRjNzIwZC4uMzUwMDFkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3h1cHYycC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy94dXB2MnAuaApAQCAtMTE4LDI3ICsxMTgsMzkgQEAKICNkZWZpbmUJQ0ZHX0VOVl9JU19OT1dIRVJFCTEKICNkZWZpbmUJQ0ZHX0VOVl9TSVpFCQkweDEwMDAKICNkZWZpbmUJQ0ZHX0VOVl9BRERSCQkoQ0ZHX01PTklUT1JfQkFTRSAtIENGR19FTlZfU0laRSkKLSNkZWZpbmUJQ09ORklHX0NPTU1BTkRTCShDT05GSUdfX0NNRF9ERkwgfFwKLQkJCUNGR19DTURfTUVNT1JZIHxcCi0JCQlDRkdfQ01EX0lSUSB8XAotCQkJQ0ZHX0NNRF9CREkgfFwKLQkJCUNGR19DTURfTkVUIHxcCi0JCQlDRkdfQ01EX0lNSSB8XAotCQkJQ0ZHX0NNRF9FQ0hPIHxcCi0JCQlDRkdfQ01EX0NBQ0hFIHxcCi0JCQlDRkdfQ01EX1JVTiB8XAotCQkJQ0ZHX0NNRF9BVVRPU0NSSVBUIHxcCi0JCQlDRkdfQ01EX0FTS0VOViB8XAotCQkJQ0ZHX0NNRF9MT0FEUyB8XAotCQkJQ0ZHX0NNRF9MT0FEQiB8XAotCQkJQ0ZHX0NNRF9NSVNDIHxcCi0JCQlDRkdfQ01EX0ZBVCB8XAotCQkJQ0ZHX0NNRF9FWFQyIHxcCi0JCQlDRkdfQ01EX1BJTkcgXAotCQkJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKyNkZWZpbmUgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX01JU0MKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAKIC8qIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMgKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiVS1Cb290LW1PTlN0Uj4gIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3lvc2VtaXRlLmggYi9pbmNsdWRlL2NvbmZpZ3MveW9zZW1pdGUuaAppbmRleCAzYjEwNmVmLi42YTViN2YxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MveW9zZW1pdGUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MveW9zZW1pdGUuaApAQCAtMjMzLDE3ICsyMzMsMjAgQEAKIAogI2lmZGVmIENPTkZJR180NDBFUAogLyogVVNCICovCi0jZGVmaW5lIENPTkZJR19VU0JfT0hDSQorI2RlZmluZSBDT05GSUdfVVNCX09IQ0lfTkVXCiAjZGVmaW5lIENPTkZJR19VU0JfU1RPUkFHRQorI2RlZmluZSBDRkdfT0hDSV9CRV9DT05UUk9MTEVSCisKKyN1bmRlZiBDRkdfVVNCX09IQ0lfQk9BUkRfSU5JVAorI2RlZmluZSBDRkdfVVNCX09IQ0lfQ1BVX0lOSVQJMQorI2RlZmluZSBDRkdfVVNCX09IQ0lfUkVHU19CQVNFCShDRkdfUEVSSVBIRVJBTF9CQVNFIHwgMHgxMDAwKQorI2RlZmluZSBDRkdfVVNCX09IQ0lfU0xPVF9OQU1FCSJwcGM0NDAiCisjZGVmaW5lIENGR19VU0JfT0hDSV9NQVhfUk9PVF9QT1JUUwkxNQogCiAvKiBDb21tZW50IHRoaXMgb3V0IHRvIGVuYWJsZSBVU0IgMS4xIGRldmljZSAqLwogI2RlZmluZSBVU0JfMl8wX0RFVklDRQogCi0jZGVmaW5lIENNRF9VU0IJCQkoQ0ZHX0NNRF9VU0IgfCBDRkdfQ01EX0ZBVCB8IENGR19DTURfRVhUMikKLQogI2RlZmluZSBDT05GSUdfU1VQUE9SVF9WRkFUCi0jZWxzZQotI2RlZmluZSBDTURfVVNCCQkJMAkvKiBubyBVU0Igb24gNDQwR1IJCSovCiAjZW5kaWYgLyogQ09ORklHXzQ0MEVQICovCiAKICNpZmRlZiBERUJVRwpAQCAtMjUyLDMyICsyNTUsNDkgQEAKICNkZWZpbmUgQ09ORklHX0hXX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgKi8KICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNNRF9VU0IpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKworI2lmZGVmIENPTkZJR180NDBFUAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRkFUCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0VYVDIKKyNlbmRpZgorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJICAgICAgICAiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM0NCw3ICszNjQsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJKDMyPDwxMCkgLyogRm9yIEFNQ0MgNDQwIENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC0zNTYsNyArMzc2LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy95dWNjYS5oIGIvaW5jbHVkZS9jb25maWdzL3l1Y2NhLmgKaW5kZXggMWZkY2M0Yi4uOWM1MzZmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3l1Y2NhLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3l1Y2NhLmgKQEAgLTEzNiw3ICsxMzYsNyBAQAogLyogRG9uJ3QgcHJvYmUgdGhlc2UgYWRkcnMgKi8KICNkZWZpbmUgQ0ZHX0kyQ19OT1BST0JFUwl7MHg1MCwgMHg1MiwgMHg1MywgMHg1NH0KIAotLyogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0VFUFJPTSkgKi8KKy8qICNpZiBkZWZpbmVkKENPTkZJR19DTURfRUVQUk9NKSAqLwogLyogI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSCTB4NTAgKi8JLyogSTJDIGJvb3QgRUVQUk9NCQkqLwogI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTgkyCS8qIEJ5dGVzIG9mIGFkZHJlc3MJCSovCiAvKiAjZW5kaWYgKi8KQEAgLTE5MSwyNCArMTkxLDM2IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorCiAKICNkZWZpbmUJQ09ORklHX0lCTV9FTUFDNF9WNAkxCiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50CQkqLwpAQCAtMjMyLDcgKzI0NCw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMTMsNyArMzI1LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJLyogRm9yIEFNQ0MgNDA1IENQVXMJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC0zMjUsNyArMzM3LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvemV1cy5oIGIvaW5jbHVkZS9jb25maWdzL3pldXMuaAppbmRleCA4NmExNmU3Li42MDU3NTVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvemV1cy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy96ZXVzLmgKQEAgLTU1LDIxICs1NSwzMyBAQAogI2RlZmluZSBDT05GSUdfUEhZX1JFU0VUCTEKICNkZWZpbmUgQ09ORklHX1BIWV9SRVNFVF9ERUxBWQkzMDAJLyogUEhZIFJFU0VUIHJlY292ZXJ5IGRlbGF5CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJfAlcCi0JCQkJIENGR19DTURfQVNLRU5WCXwJXAotCQkJCSBDRkdfQ01EX0NBQ0hFCXwJXAotCQkJCSBDRkdfQ01EX0RIQ1AJfAlcCi0JCQkJIENGR19DTURfRElBRwl8CVwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfAlcCi0JCQkJIENGR19DTURfRUxGICAgIHwJXAotCQkJCSBDRkdfQ01EX0kyQyAgICB8CVwKLQkJCQkgQ0ZHX0NNRF9JUlEJfAlcCi0JCQkJIENGR19DTURfTE9HCXwJXAotCQkJCSBDRkdfQ01EX01JSQl8CVwKLQkJCQkgQ0ZHX0NNRF9ORVQJfAlcCi0JCQkJIENGR19DTURfTkZTCXwJXAotCQkJCSBDRkdfQ01EX1BJTkcJfAlcCi0JCQkJIENGR19DTURfUkVHSU5GTykKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0xPRworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCiAKIC8qIFBPU1Qgc3VwcG9ydCAqLwogI2RlZmluZSBDT05GSUdfUE9TVAkJKENGR19QT1NUX01FTU9SWSAgIHwgXApAQCAtODgsOSArMTAwLDYgQEAKIAogI2RlZmluZSBDRkdfQ09OU09MRV9JU19JTl9FTlYgLyogT3RoZXJ3aXNlIGl0IGNhdGNoZXMgbG9nYnVmZmVyIGFzIG91dHB1dCAqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTI2LDcgKzEzNSw3IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkgICAgICAgICI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjMyLDkgKzI0MSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgSUJNIDQwNUVQIENQVQkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwotI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERlZmluaXRpb25zIGZvciBpbml0aWFsIHN0YWNrIHBvaW50ZXIgYW5kIGRhdGEgYXJlYSAoaW4gZGF0YSBjYWNoZSkKQEAgLTMwNCw3ICszMTEsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy96eWxvbml0ZS5oIGIvaW5jbHVkZS9jb25maWdzL3p5bG9uaXRlLmgKaW5kZXggMWU4ZWQ3YS4uNTE3ZWNiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3p5bG9uaXRlLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3p5bG9uaXRlLmgKQEAgLTc2LDE5ICs3NiwzMiBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogI2lmZGVmIFRVUk5fT05fRVRIRVJORVQKLSMgZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAgKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCiAjZWxzZQotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgXAotCQkJCSAgfCBDRkdfQ01EX0VOViBcCi0JCQkJICB8IENGR19DTURfTkFORCkgXAotCQkJCSAmIH4oQ0ZHX0NNRF9ORVQgXAotCQkJCSAgICAgfCBDRkdfQ01EX0ZMQVNIIFwKLQkJCQkgICAgIHwgQ0ZHX0NNRF9JTUxTKSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRU5WCisgICAgI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKworICAgICN1bmRlZiBDT05GSUdfQ01EX05FVAorICAgICN1bmRlZiBDT05GSUdfQ01EX0ZMQVNICisgICAgI3VuZGVmIENPTkZJR19DTURfSU1MUwogI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCS0xCiAjZGVmaW5lIENPTkZJR19FVEhBRERSCQkwODowMDozZToyNjowYTo1YgpAQCAtMTAwLDcgKzExMyw3IEBACiAjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRwogI2RlZmluZSBDT05GSUdfVElNRVNUQU1QCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kYTkwMzAuaCBiL2luY2x1ZGUvZGE5MDMwLmgKaW5kZXggNDExMDhiOS4uM2UzYjIwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kYTkwMzAuaAorKysgYi9pbmNsdWRlL2RhOTAzMC5oCkBAIC0xMDQsMyArMTA0LDE1IEBACiAjZGVmaW5lIFNZU19DT05UUk9MX0FfSFdSRVNfRU5BQkxFCQkoMTw8MikKICNkZWZpbmUgU1lTX0NPTlRST0xfQV9XRE9HX0FDVElPTgkJKDE8PDMpCiAjZGVmaW5lIFNZU19DT05UUk9MX0FfV0FUQ0hET0cJCQkoMTw8NykKKworI2RlZmluZSBNSVNDX0NPTlRST0xCX1VTQl9JTlRfUklTSU5HCQkoMTw8MikKKyNkZWZpbmUgTUlTQ19DT05UUk9MQl9TRVNTSU9OX1ZBTElEX0VOCQkoMTw8MykKKworI2RlZmluZSBVU0JfUFVNUF9VU0JWRQkJCQkoMTw8MCkKKyNkZWZpbmUgVVNCX1BVTVBfVVNCVkVQCQkJCSgxPDwxKQorI2RlZmluZSBVU0JfUFVNUF9TUlBfREVURUNUCQkJKDE8PDIpCisjZGVmaW5lIFVTQl9QVU1QX1NFU1NJT05fVkFMSUQJCQkoMTw8MykKKyNkZWZpbmUgVVNCX1BVTVBfVkJVU19WQUxJRF80XzAJCQkoMTw8NCkKKyNkZWZpbmUgVVNCX1BVTVBfVkJVU19WQUxJRF80XzQJCQkoMTw8NSkKKyNkZWZpbmUgVVNCX1BVTVBfRU5fVVNCVkUJCQkoMTw8NikKKyNkZWZpbmUgVVNCX1BVTVBfRU5fVVNCVkVQCQkJKDE8PDcpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9kaXY2NC5oIGIvaW5jbHVkZS9kaXY2NC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hdnIzMi9kaXY2NC5oCnJlbmFtZSB0byBpbmNsdWRlL2RpdjY0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHA4Mzg0OC5oIGIvaW5jbHVkZS9kcDgzODQ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0YmM0YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHA4Mzg0OC5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBEUDgzODQ4IGV0aGVybmV0IFBoeXNpY2FsIGxheWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKworLyogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQSFlTSUNBTCBMQVlFUiBUUkFOU0NFSVZFUiBEUDgzODQ4ICovCisKKyNkZWZpbmUgRFA4Mzg0OF9DVExfUkVHCQkweDAJLyogQmFzaWMgTW9kZSBDb250cm9sIFJlZyAqLworI2RlZmluZSBEUDgzODQ4X1NUQVRfUkVHCQkweDEJLyogQmFzaWMgTW9kZSBTdGF0dXMgUmVnICovCisjZGVmaW5lIERQODM4NDhfUEhZSUQxX1JFRwkJMHgyCS8qIFBIWSBJZGVuZGlmaWVyIFJlZyAxICovCisjZGVmaW5lIERQODM4NDhfUEhZSUQyX1JFRwkJMHgzCS8qIFBIWSBJZGVuZGlmaWVyIFJlZyAyICovCisjZGVmaW5lIERQODM4NDhfQU5BX1JFRwkJCTB4NAkvKiBBdXRvX05lZyBBZHZ0IFJlZyAgKi8KKyNkZWZpbmUgRFA4Mzg0OF9BTkxQQV9SRUcJCTB4NQkvKiBBdXRvX25lZyBMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWcgKi8KKyNkZWZpbmUgRFA4Mzg0OF9BTkVfUkVHCQkJMHg2CS8qIEF1dG8tbmVnIEV4cGFuc2lvbiBSZWcgICovCisjZGVmaW5lIERQODM4NDhfUEhZX1NUQVRfUkVHCQkweDEwCS8qIFBIWSBTdGF0dXMgUmVnaXN0ZXIgICovCisjZGVmaW5lIERQODM4NDhfUEhZX0lOVFJfQ1RSTF9SRUcJMHgxMQkvKiBQSFkgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRFA4Mzg0OF9QSFlfQ1RSTF9SRUcJCTB4MTkJLyogUEhZIFN0YXR1cyBSZWdpc3RlciAgKi8KKworLyotLUJpdCBkZWZpbml0aW9uczogRFA4Mzg0OF9DVExfUkVHICovCisjZGVmaW5lIERQODM4NDhfUkVTRVQJCSgxIDw8IDE1KSAgLyogMT0gUy9XIFJlc2V0ICovCisjZGVmaW5lIERQODM4NDhfTE9PUEJBQ0sJKDEgPDwgMTQpICAvKiAxPWxvb3BiYWNrIEVuYWJsZWQgKi8KKyNkZWZpbmUgRFA4Mzg0OF9TUEVFRF9TRUxFQ1QJKDEgPDwgMTMpCisjZGVmaW5lIERQODM4NDhfQVVUT05FRwkJKDEgPDwgMTIpCisjZGVmaW5lIERQODM4NDhfUE9XRVJfRE9XTgkoMSA8PCAxMSkKKyNkZWZpbmUgRFA4Mzg0OF9JU09MQVRFCQkoMSA8PCAxMCkKKyNkZWZpbmUgRFA4Mzg0OF9SRVNUQVJUX0FVVE9ORUcJKDEgPDwgOSkKKyNkZWZpbmUgRFA4Mzg0OF9EVVBMRVhfTU9ERQkoMSA8PCA4KQorI2RlZmluZSBEUDgzODQ4X0NPTExJU0lPTl9URVNUCSgxIDw8IDcpCisKKy8qLS1CaXQgZGVmaW5pdGlvbnM6IERQODM4NDhfU1RBVF9SRUcgKi8KKyNkZWZpbmUgRFA4Mzg0OF8xMDBCQVNFX1Q0CSgxIDw8IDE1KQorI2RlZmluZSBEUDgzODQ4XzEwMEJBU0VfVFhfRkQJKDEgPDwgMTQpCisjZGVmaW5lIERQODM4NDhfMTAwQkFTRV9UWF9IRAkoMSA8PCAxMykKKyNkZWZpbmUgRFA4Mzg0OF8xMEJBU0VfVF9GRAkoMSA8PCAxMikKKyNkZWZpbmUgRFA4Mzg0OF8xMEJBU0VfVF9IRAkoMSA8PCAxMSkKKyNkZWZpbmUgRFA4Mzg0OF9NRl9QUkVBTUJfU1VQUFIJKDEgPDwgNikKKyNkZWZpbmUgRFA4Mzg0OF9BVVRPTkVHX0NPTVAJKDEgPDwgNSkKKyNkZWZpbmUgRFA4Mzg0OF9STVRfRkFVTFQJKDEgPDwgNCkKKyNkZWZpbmUgRFA4Mzg0OF9BVVRPTkVHX0FCSUxJVFkJKDEgPDwgMykKKyNkZWZpbmUgRFA4Mzg0OF9MSU5LX1NUQVRVUwkoMSA8PCAyKQorI2RlZmluZSBEUDgzODQ4X0pBQkJFUl9ERVRFQ1QJKDEgPDwgMSkKKyNkZWZpbmUgRFA4Mzg0OF9FWFRFTkRfQ0FQQUIJKDEgPDwgMCkKKworLyotLWRlZmluaXRpb25zOiBEUDgzODQ4X1BIWUlEMSAqLworI2RlZmluZSBEUDgzODQ4X1BIWUlEMV9PVUkJMHgyMDAwCisjZGVmaW5lIERQODM4NDhfUEhZSUQyX09VSQkweDVjOTAKKworLyotLUJpdCBkZWZpbml0aW9uczogRFA4Mzg0OF9BTkFSLCBEUDgzODQ4X0FOTFBBUiAqLworI2RlZmluZSBEUDgzODQ4X05QCQkoMSA8PCAxNSkKKyNkZWZpbmUgRFA4Mzg0OF9BQ0sJCSgxIDw8IDE0KQorI2RlZmluZSBEUDgzODQ4X1JGCQkoMSA8PCAxMykKKyNkZWZpbmUgRFA4Mzg0OF9QQVVTRQkJKDEgPDwgMTApCisjZGVmaW5lIERQODM4NDhfVDQJCSgxIDw8IDkpCisjZGVmaW5lIERQODM4NDhfVFhfRkRYCQkoMSA8PCA4KQorI2RlZmluZSBEUDgzODQ4X1RYX0hEWAkJKDEgPDwgNykKKyNkZWZpbmUgRFA4Mzg0OF8xMF9GRFgJCSgxIDw8IDYpCisjZGVmaW5lIERQODM4NDhfMTBfSERYCQkoMSA8PCA1KQorI2RlZmluZSBEUDgzODQ4X0FOX0lFRUVfODAyXzMJMHgwMDAxCisKKy8qLS1CaXQgZGVmaW5pdGlvbnM6IERQODM4NDhfQU5FUiAqLworI2RlZmluZSBEUDgzODQ4X1BERgkJKDEgPDwgNCkKKyNkZWZpbmUgRFA4Mzg0OF9MUF9OUF9BQkxFCSgxIDw8IDMpCisjZGVmaW5lIERQODM4NDhfTlBfQUJMRQkJKDEgPDwgMikKKyNkZWZpbmUgRFA4Mzg0OF9QQUdFX1JYCQkoMSA8PCAxKQorI2RlZmluZSBEUDgzODQ4X0xQX0FOX0FCTEUJKDEgPDwgMCkKKworLyotLUJpdCBkZWZpbml0aW9uczogRFA4Mzg0OF9QSFlfU1RBVCAqLworI2RlZmluZSBEUDgzODQ4X1JYX0VSUl9MQVRDSAkJKDEgPDwgMTMpCisjZGVmaW5lIERQODM4NDhfUE9MQVJJVFlfU1RBVAkJKDEgPDwgMTIpCisjZGVmaW5lIERQODM4NDhfRkFMU0VfQ0FSX1NFTlNFCQkoMSA8PCAxMSkKKyNkZWZpbmUgRFA4Mzg0OF9TSUdfREVURUNUCQkoMSA8PCAxMCkKKyNkZWZpbmUgRFA4Mzg0OF9ERVNDUkFNX0xPQ0sJCSgxIDw8IDkpCisjZGVmaW5lIERQODM4NDhfUEFHRV9SQ1YJCSgxIDw8IDgpCisjZGVmaW5lIERQODM4NDhfUEhZX1JNVF9GQVVMVAkJKDEgPDwgNikKKyNkZWZpbmUgRFA4Mzg0OF9KQUJCRVIJCQkoMSA8PCA1KQorI2RlZmluZSBEUDgzODQ4X0FVVE9ORUdfQ09NUExFVEUJKDEgPDwgNCkKKyNkZWZpbmUgRFA4Mzg0OF9MT09QQkFDS19TVEFUCQkoMSA8PCAzKQorI2RlZmluZSBEUDgzODQ4X0RVUExFWAkJCSgxIDw8IDIpCisjZGVmaW5lIERQODM4NDhfU1BFRUQJCQkoMSA8PCAxKQorI2RlZmluZSBEUDgzODQ4X0xJTksJCQkoMSA8PCAwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9leHBvcnRzLmggYi9pbmNsdWRlL2V4cG9ydHMuaAppbmRleCA4ZjdmNjE3Li5kNjUxMmNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2V4cG9ydHMuaAorKysgYi9pbmNsdWRlL2V4cG9ydHMuaApAQCAtMjMsMTAgKzIzLDE1IEBACiB1bnNpZ25lZCBsb25nIHNpbXBsZV9zdHJ0b3VsKGNvbnN0IGNoYXIgKmNwLGNoYXIgKiplbmRwLHVuc2lnbmVkIGludCBiYXNlKTsKIGNoYXIgKmdldGVudiAoY2hhciAqbmFtZSk7CiB2b2lkIHNldGVudiAoY2hhciAqdmFybmFtZSwgY2hhciAqdmFydmFsdWUpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKK2xvbmcgc2ltcGxlX3N0cnRvbChjb25zdCBjaGFyICpjcCxjaGFyICoqZW5kcCx1bnNpZ25lZCBpbnQgYmFzZSk7CitpbnQgc3RyY21wKGNvbnN0IGNoYXIgKiBjcyxjb25zdCBjaGFyICogY3QpOworI2lmZGVmIENPTkZJR19IQVNfVUlECit2b2lkIGZvcmNlZW52IChjaGFyICp2YXJuYW1lLCBjaGFyICp2YXJ2YWx1ZSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogaW50IGkyY193cml0ZSAodWNoYXIsIHVpbnQsIGludCAsIHVjaGFyKiAsIGludCk7CiBpbnQgaTJjX3JlYWQgKHVjaGFyLCB1aW50LCBpbnQgLCB1Y2hhciogLCBpbnQpOwotI2VuZGlmCS8qIENGR19DTURfSTJDICovCisjZW5kaWYKIAogdm9pZCBhcHBfc3RhcnR1cChjaGFyICoqKTsKIApAQCAtNDAsNyArNDUsNyBAQAogCVhGX01BWAogfTsKIAotI2RlZmluZSBYRl9WRVJTSU9OCTMKKyNkZWZpbmUgWEZfVkVSU0lPTgk0CiAKICNpZiBkZWZpbmVkKENPTkZJR19JMzg2KQogZXh0ZXJuIGdkX3QgKmdsb2JhbF9kYXRhOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mZHRfc3VwcG9ydC5oIGIvaW5jbHVkZS9mZHRfc3VwcG9ydC5oCmluZGV4IGEyNzY4MzQuLjYwZmE0MjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZmR0X3N1cHBvcnQuaAorKysgYi9pbmNsdWRlL2ZkdF9zdXBwb3J0LmgKQEAgLTM4LDUgKzM4LDExIEBACiBpbnQgZmR0X2JkX3Qodm9pZCAqZmR0KTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX09GX0JPQVJEX1NFVFVQCit2b2lkIGZ0X2JvYXJkX3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKTsKK3ZvaWQgZnRfY3B1X3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKTsKK3ZvaWQgZnRfcGNpX3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKTsKKyNlbmRpZgorCiAjZW5kaWYgLyogaWZkZWYgQ09ORklHX09GX0xJQkZEVCAqLwogI2VuZGlmIC8qIGlmbmRlZiBfX0ZEVF9TVVBQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGNkLmggYi9pbmNsdWRlL2xjZC5oCmluZGV4IGI2ODg1ODMuLjhhNDI3M2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGNkLmgKKysrIGIvaW5jbHVkZS9sY2QuaApAQCAtMTczLDEwICsxNzMsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAqKiBCSVRNQVAgRElTUExBWSBTVVBQT1JUCQkJCQkJKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk1QKSB8fCBkZWZpbmVkKENPTkZJR19TUExBU0hfU0NSRUVOKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CTVApIHx8IGRlZmluZWQoQ09ORklHX1NQTEFTSF9TQ1JFRU4pCiAjIGluY2x1ZGUgPGJtcF9sYXlvdXQuaD4KICMgaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JNUCkgfHwgQ09ORklHX1NQTEFTSF9TQ1JFRU4gKi8KKyNlbmRpZgogCiAvKgogICogIEluZm9ybWF0aW9uIGFib3V0IGRpc3BsYXlzIHdlIGFyZSB1c2luZy4gVGhpcyBpcyBmb3IgY29uZmlndXJpbmcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGliZmR0LmggYi9pbmNsdWRlL2xpYmZkdC5oCmluZGV4IGY4YmFjNzMuLjM0MGU4OWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGliZmR0LmgKKysrIGIvaW5jbHVkZS9saWJmZHQuaApAQCAtNzcsNyArNzcsMTMgQEAKIAkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CiBpbnQgZmR0X3N1Ym5vZGVfb2Zmc2V0KGNvbnN0IHZvaWQgKmZkdCwgaW50IHBhcmVudG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSk7CiAKLWludCBmZHRfcGF0aF9vZmZzZXQoY29uc3Qgdm9pZCAqZmR0LCBjb25zdCBjaGFyICpwYXRoKTsKK2ludCBmZHRfZmluZF9ub2RlX2J5X3BhdGgoY29uc3Qgdm9pZCAqZmR0LCBjb25zdCBjaGFyICpwYXRoKTsKK2ludCBmZHRfZmluZF9ub2RlX2J5X3R5cGUoY29uc3Qgdm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqdHlwZSk7CisKK2ludCBmZHRfbm9kZV9pc19jb21wYXRpYmxlKGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsCisJCQkgICBjb25zdCBjaGFyICpjb21wYXQpOworaW50IGZkdF9maW5kX2NvbXBhdGlibGVfbm9kZShjb25zdCB2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LAorCQkJICAgICBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpjb21wYXQpOwogCiBzdHJ1Y3QgZmR0X3Byb3BlcnR5ICpmZHRfZ2V0X3Byb3BlcnR5KGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsCiAJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50ICpsZW5wKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGliZmR0X2Vudi5oIGIvaW5jbHVkZS9saWJmZHRfZW52LmgKaW5kZXggZTc0NjMxNC4uNzhmNzI1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJmZHRfZW52LmgKKysrIGIvaW5jbHVkZS9saWJmZHRfZW52LmgKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKLXN0cnVjdCBmZHRfaGVhZGVyICpmZHQ7ICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgd29ya2luZyBmZHQgKi8KK2V4dGVybiBzdHJ1Y3QgZmR0X2hlYWRlciAqZmR0OyAgLyogUG9pbnRlciB0byB0aGUgd29ya2luZyBmZHQgKi8KIAogI2RlZmluZSBmZHQzMl90b19jcHUoeCkJCV9fYmUzMl90b19jcHUoeCkKICNkZWZpbmUgY3B1X3RvX2ZkdDMyKHgpCQlfX2NwdV90b19iZTMyKHgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL21rNDh0NTkuaCBiL2luY2x1ZGUvbWs0OHQ1OS5oCmluZGV4IDAzYzk5MmUuLmE0NDU5YzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWs0OHQ1OS5oCisrKyBiL2luY2x1ZGUvbWs0OHQ1OS5oCkBAIC0yNiw3ICsyNiw3IEBACiAgKi8KIAogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX01LNDhUNTkpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX01LNDhUNTkpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAjZGVmaW5lIFJUQ19QT1JUX0FERFIwCQlDRkdfSVNBX0lPICsgIDB4NzAKICNkZWZpbmUgUlRDX1BPUlRfQUREUjEJCVJUQ19QT1JUX0FERFIwICsgIDB4MQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcGM1MTJ4LmggYi9pbmNsdWRlL21wYzUxMnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTAwYjIyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcGM1MTJ4LmgKQEAgLTAsMCArMSwzOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogKEMpIENvcHlyaWdodCAyMDA3IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIERlcml2ZWQgZnJvbSB0aGUgTVBDODN4eCBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfX01QQzUxMlhfSF9fCisjZGVmaW5lIF9fTVBDNTEyWF9IX18KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2lmIGRlZmluZWQoQ09ORklHX0UzMDApCisjaW5jbHVkZSA8YXNtL2UzMDAuaD4KKyNlbmRpZgorCisvKiBTeXN0ZW0gcmVzZXQgb2Zmc2V0IChQb3dlclBDIHN0YW5kYXJkKQorICovCisjZGVmaW5lIEVYQ19PRkZfU1lTX1JFU0VUCQkweDAxMDAKKyNkZWZpbmUJX1NUQVJUX09GRlNFVAkJCUVYQ19PRkZfU1lTX1JFU0VUCisKKworLyogSU1NUkJBUiAtIEludGVybmFsIE1lbW9yeSBSZWdpc3RlciBCYXNlIEFkZHJlc3MKKyAqLworI2RlZmluZSBDT05GSUdfREVGQVVMVF9JTU1SCQkweEZGNDAwMDAwCS8qIERlZmF1bHQgSU1NUiBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgSU1NUkJBUgkJCQkweDAwMDAJCS8qIFJlZ2lzdGVyIG9mZnNldCB0byBpbW1yICovCisjZGVmaW5lIElNTVJCQVJfQkFTRV9BRERSCQkweEZGRjAwMDAwCS8qIEJhc2UgYWRkcmVzcyBtYXNrICovCisjZGVmaW5lIElNTVJCQVJfUkVTCQkJfihJTU1SQkFSX0JBU0VfQUREUikKKworLyogTEFXQkFSIC0gTG9jYWwgQWNjZXNzIFdpbmRvdyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBMUEJBVwkJCTB4MDAyMAkJLyogUmVnaXN0ZXIgb2Zmc2V0IHRvIGltbXIgKi8KKyNkZWZpbmUgTFBDUzBBVwkJCTB4MDAyNAorI2RlZmluZSBMUENTMUFXCQkJMHgwMDI4CisjZGVmaW5lIExQQ1MyQVcJCQkweDAwMkMKKyNkZWZpbmUgTFBDUzNBVwkJCTB4MDAzMAorI2RlZmluZSBMUENTNEFXCQkJMHgwMDM0CisjZGVmaW5lIExQQ1M1QVcJCQkweDAwMzgKKyNkZWZpbmUgTFBDUzZBVwkJCTB4MDAzQworI2RlZmluZSBMUENBN0FXCQkJMHgwMDQwCisjZGVmaW5lIFNSQU1CQVIJCQkweDAwQzQKKworI2RlZmluZSBMUENfT0ZGU0VUCQkweDEwMDAwCisKKyNkZWZpbmUgQ1MwX0NPTkZJRwkJMHgwMDAwMAorI2RlZmluZSBDUzFfQ09ORklHCQkweDAwMDA0CisjZGVmaW5lIENTMl9DT05GSUcJCTB4MDAwMDgKKyNkZWZpbmUgQ1MzX0NPTkZJRwkJMHgwMDAwQworI2RlZmluZSBDUzRfQ09ORklHCQkweDAwMDEwCisjZGVmaW5lIENTNV9DT05GSUcJCTB4MDAwMTQKKyNkZWZpbmUgQ1M2X0NPTkZJRwkJMHgwMDAxOAorI2RlZmluZSBDUzdfQ09ORklHCQkweDAwMDFDCisKKyNkZWZpbmUgQ1NfQ1RSTAkJCTB4MDAwMjAKKyNkZWZpbmUgQ1NfQ1RSTF9NRQkJMHgwMTAwMDAwMAkvKiBDUyBNYXN0ZXIgRW5hYmxlIGJpdCAqLworI2RlZmluZSBDU19DVFJMX0lFCQkweDA4MDAwMDAwCS8qIENTIEludGVycnVwdCBFbmFibGUgYml0ICovCisKKy8qIFNQUklEUiAtIFN5c3RlbSBQYXJ0IGFuZCBSZXZpc2lvbiBJRCBSZWdpc3RlcgorICovCisjZGVmaW5lIFNQUklEUl9QQVJUSUQJCTB4RkZGRjAwMDAJLyogUGFydCBJZGVudGlmaWNhdGlvbiAqLworI2RlZmluZSBTUFJJRFJfUkVWSUQJCTB4MDAwMEZGRkYJLyogUmV2aXNpb24gSWRlbnRpZmljYXRpb24gKi8KKworI2RlZmluZSBTUFJfNTEyMUUJCTB4ODAxODAwMDAKKworLyogU1BDUiAtIFN5c3RlbSBQcmlvcml0eSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgU1BDUl9QQ0lIUEUJCQkweDEwMDAwMDAwCS8qIFBDSSBIaWdoZXN0IFByaW9yaXR5IEVuYWJsZSAqLworI2RlZmluZSBTUENSX1BDSUhQRV9TSElGVAkJKDMxLTMpCisjZGVmaW5lIFNQQ1JfUENJUFIJCQkweDAzMDAwMDAwCS8qIFBDSSBicmlkZ2Ugc3lzdGVtIGJ1cyByZXF1ZXN0IHByaW9yaXR5ICovCisjZGVmaW5lIFNQQ1JfUENJUFJfU0hJRlQJCSgzMS03KQorI2RlZmluZSBTUENSX1RCRU4JCQkweDAwNDAwMDAwCS8qIEUzMDAgUG93ZXJQQyBjb3JlIHRpbWUgYmFzZSB1bml0IGVuYWJsZSAqLworI2RlZmluZSBTUENSX1RCRU5fU0hJRlQJCQkoMzEtOSkKKyNkZWZpbmUgU1BDUl9DT1JFUFIJCQkweDAwMzAwMDAwCS8qIEUzMDAgUG93ZXJQQyBDb3JlIHN5c3RlbSBidXMgcmVxdWVzdCBwcmlvcml0eSAqLworI2RlZmluZSBTUENSX0NPUkVQUl9TSElGVAkJKDMxLTExKQorCisvKiBTV0NSUiAtIFN5c3RlbSBXYXRjaGRvZyBDb250cm9sIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgU1dDUlIJCQkJMHgwOTA0CQkvKiBSZWdpc3RlciBvZmZzZXQgdG8gaW1tciAqLworI2RlZmluZSBTV0NSUl9TV1RDCQkJMHhGRkZGMDAwMAkvKiBTb2Z0d2FyZSBXYXRjaGRvZyBUaW1lIENvdW50ICovCisjZGVmaW5lIFNXQ1JSX1NXRU4JCQkweDAwMDAwMDA0CS8qIFdhdGNoZG9nIEVuYWJsZSBiaXQgKi8KKyNkZWZpbmUgU1dDUlJfU1dSSQkJCTB4MDAwMDAwMDIJLyogU29mdHdhcmUgV2F0Y2hkb2cgUmVzZXQvSW50ZXJydXB0IFNlbGVjdCBiaXQgKi8KKyNkZWZpbmUgU1dDUlJfU1dQUgkJCTB4MDAwMDAwMDEJLyogU29mdHdhcmUgV2F0Y2hkb2cgQ291bnRlciBQcmVzY2FsZSBiaXQgKi8KKyNkZWZpbmUgU1dDUlJfUkVTCQkJfihTV0NSUl9TV1RDIHwgU1dDUlJfU1dFTiB8IFNXQ1JSX1NXUkkgfCBTV0NSUl9TV1BSKQorCisvKiBTV0NOUiAtIFN5c3RlbSBXYXRjaGRvZyBDb3VudGVyIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgU1dDTlIJCQkJMHgwOTA4CQkvKiBSZWdpc3RlciBvZmZzZXQgdG8gaW1tciAqLworI2RlZmluZSBTV0NOUl9TV0NOCQkJMHgwMDAwRkZGRgkvKiBTb2Z0d2FyZSBXYXRjaGRvZyBDb3VudCBtYXNrICovCisjZGVmaW5lIFNXQ05SX1JFUwkJCX4oU1dDTlJfU1dDTikKKworLyogU1dTUlIgLSBTeXN0ZW0gV2F0Y2hkb2cgU2VydmljZSBSZWdpc3RlcgorICovCisjZGVmaW5lIFNXU1JSCQkJCTB4MDkwRQkJLyogUmVnaXN0ZXIgb2Zmc2V0IHRvIGltbXIgKi8KKworLyogQUNSIC0gQXJiaXRlciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQUNSX0NPUkVESVMJCQkweDEwMDAwMDAwCS8qIENvcmUgZGlzYWJsZSAqLworI2RlZmluZSBBQ1JfQ09SRURJU19TSElGVAkJKDMxLTcpCisjZGVmaW5lIEFDUl9QSVBFX0RFUAkJCTB4MDAwNzAwMDAJLyogUGlwZWxpbmUgZGVwdGggKi8KKyNkZWZpbmUgQUNSX1BJUEVfREVQX1NISUZUCQkoMzEtMTUpCisjZGVmaW5lIEFDUl9QQ0lfUlBUQ05UCQkJMHgwMDAwNzAwMAkvKiBQQ0kgcmVwZWF0IGNvdW50ICovCisjZGVmaW5lIEFDUl9QQ0lfUlBUQ05UX1NISUZUCQkoMzEtMTkpCisjZGVmaW5lIEFDUl9SUFRDTlQJCQkweDAwMDAwNzAwCS8qIFJlcGVhdCBjb3VudCAqLworI2RlZmluZSBBQ1JfUlBUQ05UX1NISUZUCQkoMzEtMjMpCisjZGVmaW5lIEFDUl9BUEFSSwkJCTB4MDAwMDAwMzAJLyogQWRkcmVzcyBwYXJraW5nICovCisjZGVmaW5lIEFDUl9BUEFSS19TSElGVAkJCSgzMS0yNykKKyNkZWZpbmUgQUNSX1BBUktNCQkJMHgwMDAwMDAwRgkvKiBQYXJraW5nIG1hc3RlciAqLworI2RlZmluZSBBQ1JfUEFSS01fU0hJRlQJCQkoMzEtMzEpCisKKy8qIEFUUiAtIEFyYml0ZXIgVGltZXJzIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQVRSX0RUTwkJCQkweDAwRkYwMDAwCS8qIERhdGEgdGltZSBvdXQgKi8KKyNkZWZpbmUgQVRSX0FUTwkJCQkweDAwMDAwMEZGCS8qIEFkZHJlc3MgdGltZSBvdXQgKi8KKworLyogQUVSIC0gQXJiaXRlciBFdmVudCBSZWdpc3RlcgorICovCisjZGVmaW5lIEFFUl9FVEVBCQkJMHgwMDAwMDAyMAkvKiBUcmFuc2ZlciBlcnJvciAqLworI2RlZmluZSBBRVJfUkVTCQkJCTB4MDAwMDAwMTAJLyogUmVzZXJ2ZWQgdHJhbnNmZXIgdHlwZSAqLworI2RlZmluZSBBRVJfRUNXCQkJCTB4MDAwMDAwMDgJLyogRXh0ZXJuYWwgY29udHJvbCB3b3JkIHRyYW5zZmVyIHR5cGUgKi8KKyNkZWZpbmUgQUVSX0FPCQkJCTB4MDAwMDAwMDQJLyogQWRkcmVzcyBPbmx5IHRyYW5zZmVyIHR5cGUgKi8KKyNkZWZpbmUgQUVSX0RUTwkJCQkweDAwMDAwMDAyCS8qIERhdGEgdGltZSBvdXQgKi8KKyNkZWZpbmUgQUVSX0FUTwkJCQkweDAwMDAwMDAxCS8qIEFkZHJlc3MgdGltZSBvdXQgKi8KKworLyogQUVBVFIgLSBBcmJpdGVyIEV2ZW50IEFkZHJlc3MgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBBRUFUUl9FVkVOVAkJCTB4MDcwMDAwMDAJLyogRXZlbnQgdHlwZSAqLworI2RlZmluZSBBRUFUUl9NU1RSX0lECQkJMHgwMDFGMDAwMAkvKiBNYXN0ZXIgSWQgKi8KKyNkZWZpbmUgQUVBVFJfVEJTVAkJCTB4MDAwMDA4MDAJLyogVHJhbnNmZXIgYnVyc3QgKi8KKyNkZWZpbmUgQUVBVFJfVFNJWkUJCQkweDAwMDAwNzAwCS8qIFRyYW5zZmVyIFNpemUgKi8KKyNkZWZpbmUgQUVBVFJfVFRZUEUJCQkweDAwMDAwMDFGCS8qIFRyYW5zZmVyIFR5cGUgKi8KKworLyogUlNSIC0gUmVzZXQgU3RhdHVzIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgUlNSX1NXU1IJCQkweDAwMDAyMDAwCS8qIHNvZnR3YXJlIHNvZnQgcmVzZXQgKi8KKyNkZWZpbmUgUlNSX1NXU1JfU0hJRlQJCQkxMworI2RlZmluZSBSU1JfU1dIUgkJCTB4MDAwMDEwMDAJLyogc29mdHdhcmUgaGFyZCByZXNldCAqLworI2RlZmluZSBSU1JfU1dIUl9TSElGVAkJCTEyCisjZGVmaW5lIFJTUl9KSFJTCQkJMHgwMDAwMDIwMAkvKiBqdGFnIGhyZXNldCAqLworI2RlZmluZSBSU1JfSkhSU19TSElGVAkJCTkKKyNkZWZpbmUgUlNSX0pTUlMJCQkweDAwMDAwMTAwCS8qIGp0YWcgc3Jlc2V0IHN0YXR1cyAqLworI2RlZmluZSBSU1JfSlNSU19TSElGVAkJCTgKKyNkZWZpbmUgUlNSX0NTSFIJCQkweDAwMDAwMDEwCS8qIGNoZWNrc3RvcCByZXNldCBzdGF0dXMgKi8KKyNkZWZpbmUgUlNSX0NTSFJfU0hJRlQJCQk0CisjZGVmaW5lIFJTUl9TV1JTCQkJMHgwMDAwMDAwOAkvKiBzb2Z0d2FyZSB3YXRjaGRvZyByZXNldCBzdGF0dXMgKi8KKyNkZWZpbmUgUlNSX1NXUlNfU0hJRlQJCQkzCisjZGVmaW5lIFJTUl9CTVJTCQkJMHgwMDAwMDAwNAkvKiBidXMgbW9uaXRvcCByZXNldCBzdGF0dXMgKi8KKyNkZWZpbmUgUlNSX0JNUlNfU0hJRlQJCQkyCisjZGVmaW5lIFJTUl9TUlMJCQkJMHgwMDAwMDAwMgkvKiBzb2Z0IHJlc2V0IHN0YXR1cyAqLworI2RlZmluZSBSU1JfU1JTX1NISUZUCQkJMQorI2RlZmluZSBSU1JfSFJTCQkJCTB4MDAwMDAwMDEJLyogaGFyZCByZXNldCBzdGF0dXMgKi8KKyNkZWZpbmUgUlNSX0hSU19TSElGVAkJCTAKKyNkZWZpbmUgUlNSX1JFUwkJCQl+KFJTUl9TV1NSIHwgUlNSX1NXSFIgfFwKKwkJCQkJIFJTUl9KSFJTIHwgUlNSX0pTUlMgfCBSU1JfQ1NIUiB8IFJTUl9TV1JTIHxcCisJCQkJCSBSU1JfQk1SUyB8IFJTUl9TUlMgfCBSU1JfSFJTKQorLyogUk1SIC0gUmVzZXQgTW9kZSBSZWdpc3RlcgorICovCisjZGVmaW5lIFJNUl9DU1JFCQkJMHgwMDAwMDAwMQkvKiBjaGVja3N0b3AgcmVzZXQgZW5hYmxlICovCisjZGVmaW5lIFJNUl9DU1JFX1NISUZUCQkJMAorI2RlZmluZSBSTVJfUkVTCQkJCX4oUk1SX0NTUkUpCisKKy8qIFJDUiAtIFJlc2V0IENvbnRyb2wgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBSQ1JfU1dIUgkJCTB4MDAwMDAwMDIJLyogc29mdHdhcmUgaGFyZCByZXNldCAqLworI2RlZmluZSBSQ1JfU1dTUgkJCTB4MDAwMDAwMDEJLyogc29mdHdhcmUgc29mdCByZXNldCAqLworI2RlZmluZSBSQ1JfUkVTCQkJCX4oUkNSX1NXSFIgfCBSQ1JfU1dTUikKKworLyogUkNFUiAtIFJlc2V0IENvbnRyb2wgRW5hYmxlIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgUkNFUl9DUkUJCQkweDAwMDAwMDAxCS8qIHNvZnR3YXJlIGhhcmQgcmVzZXQgKi8KKyNkZWZpbmUgUkNFUl9SRVMJCQl+KFJDRVJfQ1JFKQorCisvKiBTUE1SIC0gU3lzdGVtIFBMTCBNb2RlIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgU1BNUl9TUE1GCQkJMHgwRjAwMDAwMAorI2RlZmluZSBTUE1SX1NQTUZfU0hJRlQJCQkyNAorI2RlZmluZSBTUE1SX0NQTUYJCQkweDAwMEYwMDAwCisjZGVmaW5lIFNQTVJfQ1BNRl9TSElGVAkJCTE2CisKKy8qIFNDRlIxIFN5c3RlbSBDbG9jayBGcmVxdWVuY3kgUmVnaXN0ZXIgMQorICovCisjZGVmaW5lIFNDRlIxX0lQU19ESVYJCQkweDIKKyNkZWZpbmUgU0NGUjFfSVBTX0RJVl9NQVNLCQkweDAzODAwMDAwCisjZGVmaW5lIFNDRlIxX0lQU19ESVZfU0hJRlQJCTIzCisKKy8qIFNDRlIyIFN5c3RlbSBDbG9jayBGcmVxdWVuY3kgUmVnaXN0ZXIgMgorICovCisjZGVmaW5lIFNDRlIyX1NZU19ESVYJCQkweEZDMDAwMDAwCisjZGVmaW5lIFNDRlIyX1NZU19ESVZfU0hJRlQJCTI2CisKKy8qIFNDQ1IgLSBTeXN0ZW0gQ2xvY2sgQ29udHJvbCBSZWdpc3RlcnMKKyAqLworCisvKiBTeXN0ZW0gQ2xvY2sgQ29udHJvbCBSZWdpc3RlciAxIGNvbW1hbmRzICovCisjZGVmaW5lIENMT0NLX1NDQ1IxX0NGR19FTgkJMHg4MDAwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMV9MUENfRU4JCTB4NDAwMDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjFfTkZDX0VOCQkweDIwMDAwMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IxX1BBVEFfRU4JCTB4MTAwMDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjFfUFNDX0VOKGNuKQkJKDB4MDgwMDAwMDAgPj4gKGNuKSkKKyNkZWZpbmUgQ0xPQ0tfU0NDUjFfUFNDRklGT19FTgkJMHgwMDAwODAwMAorI2RlZmluZSBDTE9DS19TQ0NSMV9TQVRBX0VOCQkweDAwMDA0MDAwCisjZGVmaW5lIENMT0NLX1NDQ1IxX0ZFQ19FTgkJMHgwMDAwMjAwMAorI2RlZmluZSBDTE9DS19TQ0NSMV9UUFJfRU4JCTB4MDAwMDEwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjFfUENJX0VOCQkweDAwMDAwODAwCisjZGVmaW5lIENMT0NLX1NDQ1IxX0REUl9FTgkJMHgwMDAwMDQwMAorCisvKiBTeXN0ZW0gQ2xvY2sgQ29udHJvbCBSZWdpc3RlciAyIGNvbW1hbmRzICovCisjZGVmaW5lIENMT0NLX1NDQ1IyX0RJVV9FTgkJMHg4MDAwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMl9BWEVfRU4JCTB4NDAwMDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjJfTUVNX0VOCQkweDIwMDAwMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IyX1VTQjJfRU4JCTB4MTAwMDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjJfVVNCMV9FTgkJMHgwODAwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMl9JMkNfRU4JCTB4MDQwMDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjJfQkRMQ19FTgkJMHgwMjAwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMl9TREhDX0VOCQkweDAxMDAwMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IyX1NQRElGX0VOCQkweDAwODAwMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IyX01CWF9CVVNfRU4JCTB4MDA0MDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjJfTUJYX0VOCQkweDAwMjAwMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IyX01CWF8zRF9FTgkJMHgwMDEwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMl9JSU1fRU4JCTB4MDAwODAwMDAKKworLyogUFNDIEZJRk8gQ29tbWFuZCB2YWx1ZXMgKi8KKyNkZWZpbmUgUFNDX0ZJRk9fUkVTRVRfU0xJQ0UJCTB4ODAKKyNkZWZpbmUgUFNDX0ZJRk9fRU5BQkxFX1NMSUNFCQkweDAxCisKKy8qIFBTQyBGSUZPIENvbnRyb2xsZXIgQ29tbWFuZCB2YWx1ZXMgKi8KKyNkZWZpbmUgRklGT0NfRU5BQkxFX0NMT0NLX0dBVEUJCTB4MDEKKyNkZWZpbmUgRklGT0NfRElTQUJMRV9DTE9DS19HQVRFCTB4MDAKKworLyogUFNDIEZJRk8gc3RhdHVzICovCisjZGVmaW5lIFBTQ19GSUZPX0VNUFRZCQkJMHgwMQorCisvKiBQU0MgQ29tbWFuZCB2YWx1ZXMgKi8KKyNkZWZpbmUgUFNDX1JYX0VOQUJMRQkJMHgwMQorI2RlZmluZSBQU0NfUlhfRElTQUJMRQkJMHgwMgorI2RlZmluZSBQU0NfVFhfRU5BQkxFCQkweDA0CisjZGVmaW5lIFBTQ19UWF9ESVNBQkxFCQkweDA4CisjZGVmaW5lIFBTQ19TRUxfTU9ERV9SRUdfMQkweDEwCisjZGVmaW5lIFBTQ19SU1RfUlgJCTB4MjAKKyNkZWZpbmUgUFNDX1JTVF9UWAkJMHgzMAorI2RlZmluZSBQU0NfUlNUX0VSUl9TVEFUCTB4NDAKKyNkZWZpbmUgUFNDX1JTVF9CUktfQ0hHX0lOVAkweDUwCisjZGVmaW5lIFBTQ19TVEFSVF9CUksJCTB4NjAKKyNkZWZpbmUgUFNDX1NUT1BfQlJLCQkweDcwCisKKy8qIFBTQyBzdGF0dXMgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBQU0NfU1JfQ0RFCQkweDAwODAKKyNkZWZpbmUgUFNDX1NSX1RYRU1QCQkweDA4MDAKKyNkZWZpbmUgUFNDX1NSX09FCQkweDEwMDAKKyNkZWZpbmUgUFNDX1NSX1BFCQkweDIwMDAKKyNkZWZpbmUgUFNDX1NSX0ZFCQkweDQwMDAKKyNkZWZpbmUgUFNDX1NSX1JCCQkweDgwMDAKKworLyogUFNDIG1vZGUgZmllbGRzICovCisjZGVmaW5lIFBTQ19NT0RFXzVfQklUUwkJMHgwMAorI2RlZmluZSBQU0NfTU9ERV82X0JJVFMJCTB4MDEKKyNkZWZpbmUgUFNDX01PREVfN19CSVRTCQkweDAyCisjZGVmaW5lIFBTQ19NT0RFXzhfQklUUwkJMHgwMworI2RlZmluZSBQU0NfTU9ERV9QQVJFVkVOCTB4MDAKKyNkZWZpbmUgUFNDX01PREVfUEFST0RECQkweDA0CisjZGVmaW5lIFBTQ19NT0RFX1BBUkZPUkNFCTB4MDgKKyNkZWZpbmUgUFNDX01PREVfUEFSTk9ORQkweDEwCisjZGVmaW5lIFBTQ19NT0RFX0VOVElNRU9VVAkweDIwCisjZGVmaW5lIFBTQ19NT0RFX1JYUlRTCQkweDgwCisjZGVmaW5lIFBTQ19NT0RFXzFfU1RPUEJJVAkweDA3CisKKy8qCisgKiBDZW50cmFsaXplZCBGSUZPIENvbnRyb2xsZXIgaGFzIGludGVybmFsIG1lbW9yeSBmb3IgYWxsIDEyIFBTQ3MgRklGT3MKKyAqCisgKiBOT1RFOiBpbmRpdmlkdWFsIFBTQyB1bml0cyBhcmUgZnJlZSB0byB1c2Ugd2hhdGV2ZXIgYXJlYSAoYW5kIHNpemUpIG9mIHRoZQorICogRklGT0MgaW50ZXJuYWwgbWVtb3J5LCBzbyBtYWtlIHN1cmUgbWVtb3J5IGFyZWFzIGZvciBGSUZPIHNsaWNlcyB1c2VkIGJ5CisgKiBkaWZmZXJlbnQgUFNDcyBkbyBub3Qgb3ZlcmxhcCEKKyAqCisgKiBPdmVyYWxsIHNpemUgb2YgRklGT0MgbWVtb3J5IGlzIG5vdCBkb2N1bWVudGVkIGluIHRoZSBNUEM1MTIxZSBSTSwgYnV0CisgKiB0ZXN0cyBpbmRpY2F0ZSB0aGF0IGl0IGlzIDEwMjQgd29yZHMgdG90YWwuCisgKi8KKyNkZWZpbmUgRklGT0NfUFNDMF9UWF9TSVpFCTB4MAkvKiBudW1iZXIgb2YgNC1ieXRlIHdvcmRzIGZvciBGSUZPIHNsaWNlICovCisjZGVmaW5lIEZJRk9DX1BTQzBfVFhfQUREUgkweDAKKyNkZWZpbmUgRklGT0NfUFNDMF9SWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0MwX1JYX0FERFIJMHgwCisKKyNkZWZpbmUgRklGT0NfUFNDMV9UWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0MxX1RYX0FERFIJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzFfUlhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDMV9SWF9BRERSCTB4MAorCisjZGVmaW5lIEZJRk9DX1BTQzJfVFhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDMl9UWF9BRERSCTB4MAorI2RlZmluZSBGSUZPQ19QU0MyX1JYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzJfUlhfQUREUgkweDAKKworI2RlZmluZSBGSUZPQ19QU0MzX1RYX1NJWkUJMHgwNAorI2RlZmluZSBGSUZPQ19QU0MzX1RYX0FERFIJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzNfUlhfU0laRQkweDA0CisjZGVmaW5lIEZJRk9DX1BTQzNfUlhfQUREUgkweDEwCisKKyNkZWZpbmUgRklGT0NfUFNDNF9UWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0M0X1RYX0FERFIJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzRfUlhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDNF9SWF9BRERSCTB4MAorCisjZGVmaW5lIEZJRk9DX1BTQzVfVFhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDNV9UWF9BRERSCTB4MAorI2RlZmluZSBGSUZPQ19QU0M1X1JYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzVfUlhfQUREUgkweDAKKworI2RlZmluZSBGSUZPQ19QU0M2X1RYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzZfVFhfQUREUgkweDAKKyNkZWZpbmUgRklGT0NfUFNDNl9SWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0M2X1JYX0FERFIJMHgwCisKKyNkZWZpbmUgRklGT0NfUFNDN19UWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0M3X1RYX0FERFIJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzdfUlhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDN19SWF9BRERSCTB4MAorCisjZGVmaW5lIEZJRk9DX1BTQzhfVFhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDOF9UWF9BRERSCTB4MAorI2RlZmluZSBGSUZPQ19QU0M4X1JYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzhfUlhfQUREUgkweDAKKworI2RlZmluZSBGSUZPQ19QU0M5X1RYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzlfVFhfQUREUgkweDAKKyNkZWZpbmUgRklGT0NfUFNDOV9SWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0M5X1JYX0FERFIJMHgwCisKKyNkZWZpbmUgRklGT0NfUFNDMTBfVFhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDMTBfVFhfQUREUgkweDAKKyNkZWZpbmUgRklGT0NfUFNDMTBfUlhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDMTBfUlhfQUREUgkweDAKKworI2RlZmluZSBGSUZPQ19QU0MxMV9UWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0MxMV9UWF9BRERSCTB4MAorI2RlZmluZSBGSUZPQ19QU0MxMV9SWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0MxMV9SWF9BRERSCTB4MAorCisvKiBJTyBDb250cm9sIFJlZ2lzdGVyCisgKi8KKworLyogSW5kZXhlcyBpbiByZWdzIGFycmF5ICovCisjZGVmaW5lIE1FTV9JRFgJCQkweDAwCisjZGVmaW5lIFNQRElGX1RYQ0xPQ0tfSURYCTB4NzMKKyNkZWZpbmUgU1BESUZfVFhfSURYCQkweDc0CisjZGVmaW5lIFNQRElGX1JYX0lEWAkJMHg3NQorI2RlZmluZSBQU0MwXzBfSURYCQkweDgzCisjZGVmaW5lIFBTQzBfMV9JRFgJCTB4ODQKKyNkZWZpbmUgUFNDMF8yX0lEWAkJMHg4NQorI2RlZmluZSBQU0MwXzNfSURYCQkweDg2CisjZGVmaW5lIFBTQzBfNF9JRFgJCTB4ODcKKyNkZWZpbmUgUFNDMV8wX0lEWAkJMHg4OAorI2RlZmluZSBQU0MxXzFfSURYCQkweDg5CisjZGVmaW5lIFBTQzFfMl9JRFgJCTB4OGEKKyNkZWZpbmUgUFNDMV8zX0lEWAkJMHg4YgorI2RlZmluZSBQU0MxXzRfSURYCQkweDhjCisjZGVmaW5lIFBTQzJfMF9JRFgJCTB4OGQKKyNkZWZpbmUgUFNDMl8xX0lEWAkJMHg4ZQorI2RlZmluZSBQU0MyXzJfSURYCQkweDhmCisjZGVmaW5lIFBTQzJfM19JRFgJCTB4OTAKKyNkZWZpbmUgUFNDMl80X0lEWAkJMHg5MQorCisjZGVmaW5lIElPQ1RSTF9GVU5DTVVYX1NISUZUCTcKKyNkZWZpbmUgSU9DVFJMX0ZVTkNNVVhfRkVDCTEKKyNkZWZpbmUgSU9DVFJMX01VWF9GRUMJCShJT0NUUkxfRlVOQ01VWF9GRUMgPDwgSU9DVFJMX0ZVTkNNVVhfU0hJRlQpCisKKy8qIFNldCBmb3IgRERSICovCisjZGVmaW5lIElPQ1RSTF9NVVhfRERSCQkweDAwMDAwMDM2CisKKyAvKiBSZWdpc3RlciBPZmZzZXQgQmFzZSAqLworI2RlZmluZSBNUEM1MTJYX0ZFQwkJKENGR19JTU1SICsgMHgwMjgwMCkKKworLyogTnVtYmVyIG9mIEkyQyBidXNlcyAqLworI2RlZmluZSBJMkNfQlVTX0NOVAkzCisKKy8qIEkyQ24gY29udHJvbCByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIEkyQ19FTgkJMHg4MAorI2RlZmluZSBJMkNfSUVOCQkweDQwCisjZGVmaW5lIEkyQ19TVEEJCTB4MjAKKyNkZWZpbmUgSTJDX1RYCQkweDEwCisjZGVmaW5lIEkyQ19UWEFLCTB4MDgKKyNkZWZpbmUgSTJDX1JTVEEJMHgwNAorI2RlZmluZSBJMkNfSU5JVF9NQVNLCShJMkNfRU4gfCBJMkNfU1RBIHwgSTJDX1RYIHwgSTJDX1JTVEEpCisKKy8qIEkyQ24gc3RhdHVzIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgSTJDX0NGCQkweDgwCisjZGVmaW5lIEkyQ19BQVMJCTB4NDAKKyNkZWZpbmUgSTJDX0JCCQkweDIwCisjZGVmaW5lIEkyQ19BTAkJMHgxMAorI2RlZmluZSBJMkNfU1JXCQkweDA0CisjZGVmaW5lIEkyQ19JRgkJMHgwMgorI2RlZmluZSBJMkNfUlhBSwkweDAxCisKKyNlbmRpZgkvKiBfX01QQzUxMlhfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wYzgzeHguaCBiL2luY2x1ZGUvbXBjODN4eC5oCmluZGV4IDMzNmMwYWMuLjgyOWRiZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbXBjODN4eC5oCisrKyBiL2luY2x1ZGUvbXBjODN4eC5oCkBAIC04Niw2ICs4Niw4IEBACiAjZGVmaW5lIFNQUl84MzYwX1JFVjEyCQkJMHg4MDQ5MDAxMgogI2RlZmluZSBTUFJfODM2MEVfUkVWMjAJCQkweDgwNDgwMDIwCiAjZGVmaW5lIFNQUl84MzYwX1JFVjIwCQkJMHg4MDQ5MDAyMAorI2RlZmluZSBTUFJfODM2MEVfUkVWMjEJCQkweDgwNDgwMDIxCisjZGVmaW5lIFNQUl84MzYwX1JFVjIxCQkJMHg4MDQ5MDAyMQogCiAjZGVmaW5lIFNQUl84MzIzRV9SRVYxMAkJCTB4ODA2MjAwMTAKICNkZWZpbmUgU1BSXzgzMjNfUkVWMTAJCQkweDgwNjMwMDEwCkBAIC02MDAsNyArNjAyLDkgQEAKICNkZWZpbmUgU0NDUl9UU0VDMUNNXzMJCQkweEMwMDAwMDAwCiAKICNkZWZpbmUgU0NDUl9UU0VDMU9OCQkJMHgyMDAwMDAwMAorI2RlZmluZSBTQ0NSX1RTRUMxT05fU0hJRlQJCTI5CiAjZGVmaW5lIFNDQ1JfVFNFQzJPTgkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgU0NDUl9UU0VDMk9OX1NISUZUCQkyOAogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcGM4NXh4LmggYi9pbmNsdWRlL21wYzg1eHguaAppbmRleCA2ZmJkNTA0Li4zMjFiMjRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21wYzg1eHguaAorKysgYi9pbmNsdWRlL21wYzg1eHguaApAQCAtMSwxNCArMSwxNCBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgorICogQ29weXJpZ2h0IDIwMDQsIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCiAgKiBDb3B5cmlnaHQoYykgMjAwMyBNb3Rvcm9sYSBJbmMuCi0gKiBYaWFuZ2h1YSBYaWFvICh4LnhpYW9AbW90b3JvbGEuY29tKQogICovCiAKICNpZm5kZWYJX19NUEM4NXh4X0hfXwogI2RlZmluZSBfX01QQzg1eHhfSF9fCiAKLSNkZWZpbmUgRVhDX09GRl9TWVNfUkVTRVQJMHgwMTAwCS8qIFN5c3RlbSByZXNldAkqLwotI2RlZmluZQlfU1RBUlRfT0ZGU0VUCQlFWENfT0ZGX1NZU19SRVNFVAorLyogZGVmaW5lIGZvciBjb21tb24gcHBjX2FzbS50bXBsICovCisjZGVmaW5lIEVYQ19PRkZfU1lTX1JFU0VUCTB4MTAwCS8qIFN5c3RlbSByZXNldCAqLworI2RlZmluZSBfU1RBUlRfT0ZGU0VUCQkwCiAKICNpZiBkZWZpbmVkKENPTkZJR19FNTAwKQogI2luY2x1ZGUgPGU1MDAuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0LmggYi9pbmNsdWRlL25ldC5oCmluZGV4IDQ2MWUwMzguLjYwMzQ1MmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0LmgKKysrIGIvaW5jbHVkZS9uZXQuaApAQCAtOTksMTAgKzk5LDEyIEBACiAJaW50IHN0YXRlOwogCiAJaW50ICAoKmluaXQpIChzdHJ1Y3QgZXRoX2RldmljZSosIGJkX3QqKTsKLQlpbnQgICgqc2VuZCkgKHN0cnVjdCBldGhfZGV2aWNlKiwgdm9sYXRpbGUgdm9pZCogcGFjaGV0LCBpbnQgbGVuZ3RoKTsKKwlpbnQgICgqc2VuZCkgKHN0cnVjdCBldGhfZGV2aWNlKiwgdm9sYXRpbGUgdm9pZCogcGFja2V0LCBpbnQgbGVuZ3RoKTsKIAlpbnQgICgqcmVjdikgKHN0cnVjdCBldGhfZGV2aWNlKik7CiAJdm9pZCAoKmhhbHQpIChzdHJ1Y3QgZXRoX2RldmljZSopOwotCisjaWZkZWYgQ09ORklHX01DQVNUX1RGVFAKKwlpbnQgKCptY2FzdCkgKHN0cnVjdCBldGhfZGV2aWNlKiwgdTMyIGlwLCB1OCBzZXQpOworI2VuZGlmCiAJc3RydWN0IGV0aF9kZXZpY2UgKm5leHQ7CiAJdm9pZCAqcHJpdjsKIH07CkBAIC0xMjQsNiArMTI2LDExIEBACiBleHRlcm4gdm9pZCBldGhfaGFsdCh2b2lkKTsJCQkvKiBzdG9wIFNDQwkJCSovCiBleHRlcm4gY2hhciAqZXRoX2dldF9uYW1lKHZvaWQpOwkJLyogZ2V0IG5hbWUgb2YgY3VycmVudCBkZXZpY2UJKi8KIAorI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCitpbnQgZXRoX21jYXN0X2pvaW4oIElQYWRkcl90IG1jYXN0X2FkZHIsIHU4IGpvaW4pOwordTMyIGV0aGVyX2NyYyAoc2l6ZV90IGxlbiwgdW5zaWduZWQgY2hhciBjb25zdCAqcCk7CisjZW5kaWYKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCkBAIC0yOTYsNyArMzAzLDcgQEAKIGV4dGVybiBJUGFkZHJfdAkJTmV0T3VyR2F0ZXdheUlQOwkvKiBPdXIgZ2F0ZXdheSBJUCBhZGRyZXNzZQkqLwogZXh0ZXJuIElQYWRkcl90CQlOZXRPdXJTdWJuZXRNYXNrOwkvKiBPdXIgc3VibmV0IG1hc2sgKDAgPSB1bmtub3duKSovCiBleHRlcm4gSVBhZGRyX3QJCU5ldE91ckROU0lQOwkgLyogT3VyIERvbWFpbiBOYW1lIFNlcnZlciAoMCA9IHVua25vd24pKi8KLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfRE5TMikKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9ETlMyKQogZXh0ZXJuIElQYWRkcl90CQlOZXRPdXJETlMySVA7CSAvKiBPdXIgMm5kIERvbWFpbiBOYW1lIFNlcnZlciAoMCA9IHVua25vd24pKi8KICNlbmRpZgogZXh0ZXJuIGNoYXIJCU5ldE91ck5JU0RvbWFpblszMl07CS8qIE91ciBOSVMgZG9tYWluCQkqLwpAQCAtMzQxLDE3ICszNDgsMTcgQEAKIC8qIGZyb20gbmV0L25ldC5jICovCiBleHRlcm4gY2hhcglCb290RmlsZVsxMjhdOwkJCS8qIEJvb3QgRmlsZSBuYW1lCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUElORykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUElORykKIGV4dGVybiBJUGFkZHJfdAlOZXRQaW5nSVA7CQkJLyogdGhlIGlwIGFkZHJlc3MgdG8gcGluZyAJCSovCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogLyogd2hlbiBDRFAgY29tcGxldGVzIHRoZXNlIGhvbGQgdGhlIHJldHVybiB2YWx1ZXMgKi8KIGV4dGVybiB1c2hvcnQgQ0RQTmF0aXZlVkxBTjsKIGV4dGVybiB1c2hvcnQgQ0RQQXBwbGlhbmNlVkxBTjsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkKIGV4dGVybiBJUGFkZHJfdAlOZXROdHBTZXJ2ZXJJUDsJCQkvKiB0aGUgaXAgYWRkcmVzcyB0byBOVFAgCSovCiBleHRlcm4gaW50IE5ldFRpbWVPZmZzZXQ7CQkJLyogb2Zmc2V0IHRpbWUgZnJvbSBVVEMJCSovCiAjZW5kaWYKQEAgLTQzNSw2ICs0NDIsMjkgQEAKIAltZW1jcHkoKHZvaWQqKXRvLCAodm9pZCopZnJvbSwgc2l6ZW9mKHVsb25nKSk7CiB9CiAKKy8qKgorICogaXNfemVyb19ldGhlcl9hZGRyIC0gRGV0ZXJtaW5lIGlmIGdpdmUgRXRoZXJuZXQgYWRkcmVzcyBpcyBhbGwgemVyb3MuCisgKiBAYWRkcjogUG9pbnRlciB0byBhIHNpeC1ieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIEV0aGVybmV0IGFkZHJlc3MKKyAqCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhbGwgemVyb2VzLgorICovCitzdGF0aWMgaW5saW5lIGludCBpc196ZXJvX2V0aGVyX2FkZHIoY29uc3QgdTggKmFkZHIpCit7CisJcmV0dXJuICEoYWRkclswXSB8IGFkZHJbMV0gfCBhZGRyWzJdIHwgYWRkclszXSB8IGFkZHJbNF0gfCBhZGRyWzVdKTsKK30KKworLyoqCisgKiBpc19tdWx0aWNhc3RfZXRoZXJfYWRkciAtIERldGVybWluZSBpZiB0aGUgRXRoZXJuZXQgYWRkcmVzcyBpcyBhIG11bHRpY2FzdC4KKyAqIEBhZGRyOiBQb2ludGVyIHRvIGEgc2l4LWJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgRXRoZXJuZXQgYWRkcmVzcworICoKKyAqIFJldHVybiB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbXVsdGljYXN0IGFkZHJlc3MuCisgKiBCeSBkZWZpbml0aW9uIHRoZSBicm9hZGNhc3QgYWRkcmVzcyBpcyBhbHNvIGEgbXVsdGljYXN0IGFkZHJlc3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGNvbnN0IHU4ICphZGRyKQoreworCXJldHVybiAoMHgwMSAmIGFkZHJbMF0pOworfQorCiAvKiBDb252ZXJ0IGFuIElQIGFkZHJlc3MgdG8gYSBzdHJpbmcgKi8KIGV4dGVybiB2b2lkCWlwX3RvX3N0cmluZyAoSVBhZGRyX3QgeCwgY2hhciAqcyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGNpLmggYi9pbmNsdWRlL3BjaS5oCmluZGV4IDdjOWEwZTMuLjhlNWRhY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGNpLmgKKysrIGIvaW5jbHVkZS9wY2kuaApAQCAtMzAyLDYgKzMwMiwxMiBAQAogI2RlZmluZSBQQ0lfTUFYX1BDSV9ERVZJQ0VTCTMyCiAjZGVmaW5lIFBDSV9NQVhfUENJX0ZVTkNUSU9OUwk4CiAKKyNkZWZpbmUgUENJX0RDUgkJMHg1NCAgICAvKiBQQ0llIERldmljZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9EU1IJCTB4NTYgICAgLyogUENJZSBEZXZpY2UgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9MU1IJCTB4NWUgICAgLyogUENJZSBMaW5rIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfTFRTU00JMHg0MDQgICAvKiBQQ0llIExpbmsgVHJhaW5pbmcsIFN0YXR1cyBTdGF0ZSBNYWNoaW5lICovCisjZGVmaW5lICBQQ0lfTFRTU01fTDAJMHgxNiAgICAvKiBMMCBzdGF0ZSAqLworCiAvKiBJbmNsdWRlIHRoZSBJRCBsaXN0ICovCiAKICNpbmNsdWRlIDxwY2lfaWRzLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS5oIGIvaW5jbHVkZS9wY21jaWEuaAppbmRleCA4ZjU2NGRhLi43MzA1ODA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS5oCisrKyBiL2luY2x1ZGUvcGNtY2lhLmgKQEAgLTMxLDggKzMxLDggQEAKICAqIEFsbG93IGNvbmZpZ3VyYXRpb24gdG8gc2VsZWN0IFBDTUNJQSBzbG90LAogICogb3IgdHJ5IHRvIGdlbmVyYXRlIGEgdXNlZnVsIGRlZmF1bHQKICAqLwotI2lmICggQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpIHx8IFwKLSAgICAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBcCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkgfHwgXAorICAgIChkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBcCiAJKGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKSB8fCBkZWZpbmVkKENPTkZJR19JREVfOHh4X0RJUkVDVCkgKSApCiAKICNpZiAhZGVmaW5lZChDT05GSUdfUENNQ0lBX1NMT1RfQSkgJiYgIWRlZmluZWQoQ09ORklHX1BDTUNJQV9TTE9UX0IpCkBAIC0zMDYsMTQgKzMwNiwxNCBAQAogI2RlZmluZSBDSVNUUExfSURFX0hBU19JTkRFWAkweDIwCiAjZGVmaW5lIENJU1RQTF9JREVfSU9JUzE2CTB4NDAKIAotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBIHx8IENGR19DTURfSURFICYmIChDT05GSUdfSURFXzh4eF9QQ0NBUkQgfHwgQ09ORklHX0lERV84eHhfRElSRUNUKSAqLworI2VuZGlmCiAKICNpZmRlZglDT05GSUdfOHh4CiBleHRlcm4gdV9pbnQgKnBjbWNpYV9wZ2NyeFtdOwogI2RlZmluZQlQQ01DSUFfUEdDUlgoc2xvdCkJKCpwY21jaWFfcGdjcnhbc2xvdF0pCiAjZW5kaWYKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpIFwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkgXAogCXx8IGRlZmluZWQoQ09ORklHX1BYQV9QQ01DSUEpCiBleHRlcm4gaW50IGNoZWNrX2lkZV9kZXZpY2UoaW50IHNsb3QpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BwY19hc20udG1wbCBiL2luY2x1ZGUvcHBjX2FzbS50bXBsCmluZGV4IGFjOGYzMTcuLjAwMTlkNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHBjX2FzbS50bXBsCisrKyBiL2luY2x1ZGUvcHBjX2FzbS50bXBsCkBAIC0yODUsNyArMjg1LDYgQEAKIAkubG9uZwloZGxyIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVDsJCQlcCiAJLmxvbmcJY3JpdF9yZXR1cm4gLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCiAKLSNpZmRlZiBDT05GSUdfNDQwCiAjZGVmaW5lIE1DS19FWENFUFRJT04obiwgbGFiZWwsIGhkbHIpCQkJCVwKIAkuID0gbjsJCQkJCQkJXAogbGFiZWw6CQkJCQkJCQlcCkBAIC0yOTksNiArMjk4LDUgQEAKIC5MXyAjIyBsYWJlbCA6CQkJCQkJCVwKIAkubG9uZwloZGxyIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVDsJCQlcCiAJLmxvbmcJbWNrX3JldHVybiAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKLSNlbmRpZiAvKiBDT05GSUdfNDQwICAqLwogCiAjZW5kaWYJLyogX19QUENfQVNNX1RNUExfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRlb24uaCBiL2luY2x1ZGUvcmFkZW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QxMWIwNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcmFkZW9uLmgKQEAgLTAsMCArMSwxOTg0IEBACisjaWZuZGVmIF9SQURFT05fSAorI2RlZmluZSBfUkFERU9OX0gKKworCisjZGVmaW5lIFJBREVPTl9SRUdTSVpFCQkJMHg0MDAwCisKKworI2RlZmluZSBNTV9JTkRFWAkJCTB4MDAwMAorI2RlZmluZSBNTV9EQVRBCQkJCTB4MDAwNAorI2RlZmluZSBCVVNfQ05UTAkJCTB4MDAzMAorI2RlZmluZSBISV9TVEFUCQkJCTB4MDA0QworI2RlZmluZSBCVVNfQ05UTDEJCQkweDAwMzQKKyNkZWZpbmUgSTJDX0NOVExfMQkJCTB4MDA5NAorI2RlZmluZSBDT05GSUdfQ05UTAkJCTB4MDBFMAorI2RlZmluZSBDT05GSUdfTUVNU0laRQkJCTB4MDBGOAorI2RlZmluZSBDT05GSUdfQVBFUl8wX0JBU0UJCTB4MDEwMAorI2RlZmluZSBDT05GSUdfQVBFUl8xX0JBU0UJCTB4MDEwNAorI2RlZmluZSBDT05GSUdfQVBFUl9TSVpFCQkweDAxMDgKKyNkZWZpbmUgQ09ORklHX1JFR18xX0JBU0UJCTB4MDEwQworI2RlZmluZSBDT05GSUdfUkVHX0FQRVJfU0laRQkJMHgwMTEwCisjZGVmaW5lIFBBRF9BR1BJTlBVVF9ERUxBWQkJMHgwMTY0CisjZGVmaW5lIFBBRF9DVExSX1NUUkVOR1RICQkweDAxNjgKKyNkZWZpbmUgUEFEX0NUTFJfVVBEQVRFCQkJMHgwMTZDCisjZGVmaW5lIFBBRF9DVExSX01JU0MJCQkweDBhYTAKKyNkZWZpbmUgQUdQX0NOVEwJCQkweDAxNzQKKyNkZWZpbmUgQk1fU1RBVFVTCQkJMHgwMTYwCisjZGVmaW5lIENBUDBfVFJJR19DTlRMCQkJMHgwOTUwCisjZGVmaW5lIENBUDFfVFJJR19DTlRMCQkJMHgwOWMwCisjZGVmaW5lIFZJUEhfQ09OVFJPTAkJCTB4MEM0MAorI2RlZmluZSBWRU5ET1JfSUQJCQkweDBGMDAKKyNkZWZpbmUgREVWSUNFX0lECQkJMHgwRjAyCisjZGVmaW5lIENPTU1BTkQJCQkJMHgwRjA0CisjZGVmaW5lIFNUQVRVUwkJCQkweDBGMDYKKyNkZWZpbmUgUkVWSVNJT05fSUQJCQkweDBGMDgKKyNkZWZpbmUgUkVHUFJPR19JTkYJCQkweDBGMDkKKyNkZWZpbmUgU1VCX0NMQVNTCQkJMHgwRjBBCisjZGVmaW5lIEJBU0VfQ09ERQkJCTB4MEYwQgorI2RlZmluZSBDQUNIRV9MSU5FCQkJMHgwRjBDCisjZGVmaW5lIExBVEVOQ1kJCQkJMHgwRjBECisjZGVmaW5lIEhFQURFUgkJCQkweDBGMEUKKyNkZWZpbmUgQklTVAkJCQkweDBGMEYKKyNkZWZpbmUgUkVHX01FTV9CQVNFCQkJMHgwRjEwCisjZGVmaW5lIFJFR19JT19CQVNFCQkJMHgwRjE0CisjZGVmaW5lIFJFR19SRUdfQkFTRQkJCTB4MEYxOAorI2RlZmluZSBBREFQVEVSX0lECQkJMHgwRjJDCisjZGVmaW5lIEJJT1NfUk9NCQkJMHgwRjMwCisjZGVmaW5lIENBUEFCSUxJVElFU19QVFIJCTB4MEYzNAorI2RlZmluZSBJTlRFUlJVUFRfTElORQkJCTB4MEYzQworI2RlZmluZSBJTlRFUlJVUFRfUElOCQkJMHgwRjNECisjZGVmaW5lIE1JTl9HUkFOVAkJCTB4MEYzRQorI2RlZmluZSBNQVhfTEFURU5DWQkJCTB4MEYzRgorI2RlZmluZSBBREFQVEVSX0lEX1cJCQkweDBGNEMKKyNkZWZpbmUgUE1JX0NBUF9JRAkJCTB4MEY1MAorI2RlZmluZSBQTUlfTlhUX0NBUF9QVFIJCQkweDBGNTEKKyNkZWZpbmUgUE1JX1BNQ19SRUcJCQkweDBGNTIKKyNkZWZpbmUgUE1fU1RBVFVTCQkJMHgwRjU0CisjZGVmaW5lIFBNSV9EQVRBCQkJMHgwRjU3CisjZGVmaW5lIEFHUF9DQVBfSUQJCQkweDBGNTgKKyNkZWZpbmUgQUdQX1NUQVRVUwkJCTB4MEY1QworI2RlZmluZSBBR1BfQ09NTUFORAkJCTB4MEY2MAorI2RlZmluZSBBSUNfQ1RSTAkJCTB4MDFEMAorI2RlZmluZSBBSUNfU1RBVAkJCTB4MDFENAorI2RlZmluZSBBSUNfUFRfQkFTRQkJCTB4MDFEOAorI2RlZmluZSBBSUNfTE9fQUREUgkJCTB4MDFEQworI2RlZmluZSBBSUNfSElfQUREUgkJCTB4MDFFMAorI2RlZmluZSBBSUNfVExCX0FERFIJCQkweDAxRTQKKyNkZWZpbmUgQUlDX1RMQl9EQVRBCQkJMHgwMUU4CisjZGVmaW5lIERBQ19DTlRMCQkJMHgwMDU4CisjZGVmaW5lIERBQ19DTlRMMgkJCTB4MDA3YworI2RlZmluZSBDUlRDX0dFTl9DTlRMCQkJMHgwMDUwCisjZGVmaW5lIE1FTV9DTlRMCQkJMHgwMTQwCisjZGVmaW5lIE1DX0NOVEwJCQkJMHgwMTQwCisjZGVmaW5lIEVYVF9NRU1fQ05UTAkJCTB4MDE0NAorI2RlZmluZSBNQ19USU1JTkdfQ05UTAkJCTB4MDE0NAorI2RlZmluZSBNQ19BR1BfTE9DQVRJT04JCQkweDAxNEMKKyNkZWZpbmUgTUVNX0lPX0NOVExfQTAJCQkweDAxNzgKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTAkJMHgwMTc4CisjZGVmaW5lIE1FTV9JTklUX0xBVEVOQ1lfVElNRVIJCTB4MDE1NAorI2RlZmluZSBNQ19JTklUX0dGWF9MQVRfVElNRVIJCTB4MDE1NAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUcJCTB4MDE1OAorI2RlZmluZSBBR1BfQkFTRQkJCTB4MDE3MAorI2RlZmluZSBNRU1fSU9fQ05UTF9BMQkJCTB4MDE3QworI2RlZmluZSBNQ19SRUFEX0NOVExfQUIJCQkweDAxN0MKKyNkZWZpbmUgTUVNX0lPX0NOVExfQjAJCQkweDAxODAKKyNkZWZpbmUgTUNfSU5JVF9NSVNDX0xBVF9USU1FUgkJMHgwMTgwCisjZGVmaW5lIE1FTV9JT19DTlRMX0IxCQkJMHgwMTg0CisjZGVmaW5lIE1DX0lPUEFEX0NOVEwJCQkweDAxODQKKyNkZWZpbmUgTUNfREVCVUcJCQkweDAxODgKKyNkZWZpbmUgTUNfU1RBVFVTCQkJMHgwMTUwCisjZGVmaW5lIE1FTV9JT19PRV9DTlRMCQkJMHgwMThDCisjZGVmaW5lIE1DX0NISVBfSU9fT0VfQ05UTF9BQgkJMHgwMThDCisjZGVmaW5lIE1DX0ZCX0xPQ0FUSU9OCQkJMHgwMTQ4CisvKiAjZGVmaW5lIE1DX0ZCX0xPQ0FUSU9OCQkweDAxODggKi8KKyNkZWZpbmUgSE9TVF9QQVRIX0NOVEwJCQkweDAxMzAKKyNkZWZpbmUgTUVNX1ZHQV9XUF9TRUwJCQkweDAwMzgKKyNkZWZpbmUgTUVNX1ZHQV9SUF9TRUwJCQkweDAwM0MKKyNkZWZpbmUgSERQX0RFQlVHCQkJMHgwMTM4CisjZGVmaW5lIFNXX1NFTUFQSE9SRQkJCTB4MDEzQworI2RlZmluZSBDUlRDMl9HRU5fQ05UTAkJCTB4MDNmOAorI2RlZmluZSBDUlRDMl9ESVNQTEFZX0JBU0VfQUREUgkJMHgwMzNjCisjZGVmaW5lIFNVUkZBQ0VfQ05UTAkJCTB4MEIwMAorI2RlZmluZSBTVVJGQUNFMF9MT1dFUl9CT1VORAkJMHgwQjA0CisjZGVmaW5lIFNVUkZBQ0UxX0xPV0VSX0JPVU5ECQkweDBCMTQKKyNkZWZpbmUgU1VSRkFDRTJfTE9XRVJfQk9VTkQJCTB4MEIyNAorI2RlZmluZSBTVVJGQUNFM19MT1dFUl9CT1VORAkJMHgwQjM0CisjZGVmaW5lIFNVUkZBQ0U0X0xPV0VSX0JPVU5ECQkweDBCNDQKKyNkZWZpbmUgU1VSRkFDRTVfTE9XRVJfQk9VTkQJCTB4MEI1NAorI2RlZmluZSBTVVJGQUNFNl9MT1dFUl9CT1VORAkJMHgwQjY0CisjZGVmaW5lIFNVUkZBQ0U3X0xPV0VSX0JPVU5ECQkweDBCNzQKKyNkZWZpbmUgU1VSRkFDRTBfVVBQRVJfQk9VTkQJCTB4MEIwOAorI2RlZmluZSBTVVJGQUNFMV9VUFBFUl9CT1VORAkJMHgwQjE4CisjZGVmaW5lIFNVUkZBQ0UyX1VQUEVSX0JPVU5ECQkweDBCMjgKKyNkZWZpbmUgU1VSRkFDRTNfVVBQRVJfQk9VTkQJCTB4MEIzOAorI2RlZmluZSBTVVJGQUNFNF9VUFBFUl9CT1VORAkJMHgwQjQ4CisjZGVmaW5lIFNVUkZBQ0U1X1VQUEVSX0JPVU5ECQkweDBCNTgKKyNkZWZpbmUgU1VSRkFDRTZfVVBQRVJfQk9VTkQJCTB4MEI2OAorI2RlZmluZSBTVVJGQUNFN19VUFBFUl9CT1VORAkJMHgwQjc4CisjZGVmaW5lIFNVUkZBQ0UwX0lORk8JCQkweDBCMEMKKyNkZWZpbmUgU1VSRkFDRTFfSU5GTwkJCTB4MEIxQworI2RlZmluZSBTVVJGQUNFMl9JTkZPCQkJMHgwQjJDCisjZGVmaW5lIFNVUkZBQ0UzX0lORk8JCQkweDBCM0MKKyNkZWZpbmUgU1VSRkFDRTRfSU5GTwkJCTB4MEI0QworI2RlZmluZSBTVVJGQUNFNV9JTkZPCQkJMHgwQjVDCisjZGVmaW5lIFNVUkZBQ0U2X0lORk8JCQkweDBCNkMKKyNkZWZpbmUgU1VSRkFDRTdfSU5GTwkJCTB4MEI3QworI2RlZmluZSBTVVJGQUNFX0FDQ0VTU19GTEFHUwkJMHgwQkY4CisjZGVmaW5lIFNVUkZBQ0VfQUNDRVNTX0NMUgkJMHgwQkZDCisjZGVmaW5lIEdFTl9JTlRfQ05UTAkJCTB4MDA0MAorI2RlZmluZSBHRU5fSU5UX1NUQVRVUwkJCTB4MDA0NAorI2RlZmluZSBDUlRDX0VYVF9DTlRMCQkJMHgwMDU0CisjZGVmaW5lIFJCM0RfQ05UTAkJCTB4MUMzQworI2RlZmluZSBXQUlUX1VOVElMCQkJMHgxNzIwCisjZGVmaW5lIElTWU5DX0NOVEwJCQkweDE3MjQKKyNkZWZpbmUgUkJCTV9HVUlDTlRMCQkJMHgxNzJDCisjZGVmaW5lIFJCQk1fU1RBVFVTCQkJMHgwRTQwCisjZGVmaW5lIFJCQk1fU1RBVFVTX2FsdF8xCQkweDE3NDAKKyNkZWZpbmUgUkJCTV9DTlRMCQkJMHgwMEVDCisjZGVmaW5lIFJCQk1fQ05UTF9hbHRfMQkJCTB4MEU0NAorI2RlZmluZSBSQkJNX1NPRlRfUkVTRVQJCQkweDAwRjAKKyNkZWZpbmUgUkJCTV9TT0ZUX1JFU0VUX2FsdF8xCQkweDBFNDgKKyNkZWZpbmUgTlFXQUlUX1VOVElMCQkJMHgwRTUwCisjZGVmaW5lIFJCQk1fREVCVUcJCQkweDBFNkMKKyNkZWZpbmUgUkJCTV9DTURGSUZPX0FERFIJCTB4MEU3MAorI2RlZmluZSBSQkJNX0NNREZJRk9fREFUQUwJCTB4MEU3NAorI2RlZmluZSBSQkJNX0NNREZJRk9fREFUQUgJCTB4MEU3OAorI2RlZmluZSBSQkJNX0NNREZJRk9fU1RBVAkJMHgwRTdDCisjZGVmaW5lIENSVENfU1RBVFVTCQkJMHgwMDVDCisjZGVmaW5lIEdQSU9fVkdBX0REQwkJCTB4MDA2MAorI2RlZmluZSBHUElPX0RWSV9EREMJCQkweDAwNjQKKyNkZWZpbmUgR1BJT19NT05JRAkJCTB4MDA2OAorI2RlZmluZSBHUElPX0NSVDJfRERDCQkJMHgwMDZjCisjZGVmaW5lIFBBTEVUVEVfSU5ERVgJCQkweDAwQjAKKyNkZWZpbmUgUEFMRVRURV9EQVRBCQkJMHgwMEI0CisjZGVmaW5lIFBBTEVUVEVfMzBfREFUQQkJCTB4MDBCOAorI2RlZmluZSBDUlRDX0hfVE9UQUxfRElTUAkJMHgwMjAwCisjZGVmaW5lIENSVENfSF9TWU5DX1NUUlRfV0lECQkweDAyMDQKKyNkZWZpbmUgQ1JUQ19WX1RPVEFMX0RJU1AJCTB4MDIwOAorI2RlZmluZSBDUlRDX1ZfU1lOQ19TVFJUX1dJRAkJMHgwMjBDCisjZGVmaW5lIENSVENfVkxJTkVfQ1JOVF9WTElORQkJMHgwMjEwCisjZGVmaW5lIENSVENfQ1JOVF9GUkFNRQkJCTB4MDIxNAorI2RlZmluZSBDUlRDX0dVSV9UUklHX1ZMSU5FCQkweDAyMTgKKyNkZWZpbmUgQ1JUQ19ERUJVRwkJCTB4MDIxQworI2RlZmluZSBDUlRDX09GRlNFVF9SSUdIVAkJMHgwMjIwCisjZGVmaW5lIENSVENfT0ZGU0VUCQkJMHgwMjI0CisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVEwJCTB4MDIyOAorI2RlZmluZSBDUlRDX1BJVENICQkJMHgwMjJDCisjZGVmaW5lIE9WUl9DTFIJCQkJMHgwMjMwCisjZGVmaW5lIE9WUl9XSURfTEVGVF9SSUdIVAkJMHgwMjM0CisjZGVmaW5lIE9WUl9XSURfVE9QX0JPVFRPTQkJMHgwMjM4CisjZGVmaW5lIERJU1BMQVlfQkFTRV9BRERSCQkweDAyM0MKKyNkZWZpbmUgU05BUFNIT1RfVkhfQ09VTlRTCQkweDAyNDAKKyNkZWZpbmUgU05BUFNIT1RfRl9DT1VOVAkJMHgwMjQ0CisjZGVmaW5lIE5fVklGX0NPVU5UCQkJMHgwMjQ4CisjZGVmaW5lIFNOQVBTSE9UX1ZJRl9DT1VOVAkJMHgwMjRDCisjZGVmaW5lIEZQX0NSVENfSF9UT1RBTF9ESVNQCQkweDAyNTAKKyNkZWZpbmUgRlBfQ1JUQ19WX1RPVEFMX0RJU1AJCTB4MDI1NAorI2RlZmluZSBDUlRfQ1JUQ19IX1NZTkNfU1RSVF9XSUQJMHgwMjU4CisjZGVmaW5lIENSVF9DUlRDX1ZfU1lOQ19TVFJUX1dJRAkweDAyNUMKKyNkZWZpbmUgQ1VSX09GRlNFVAkJCTB4MDI2MAorI2RlZmluZSBDVVJfSE9SWl9WRVJUX1BPU04JCTB4MDI2NAorI2RlZmluZSBDVVJfSE9SWl9WRVJUX09GRgkJMHgwMjY4CisjZGVmaW5lIENVUl9DTFIwCQkJMHgwMjZDCisjZGVmaW5lIENVUl9DTFIxCQkJMHgwMjcwCisjZGVmaW5lIEZQX0hPUlpfVkVSVF9BQ1RJVkUJCTB4MDI3OAorI2RlZmluZSBDUlRDX01PUkVfQ05UTAkJCTB4MDI3QworI2RlZmluZSBDUlRDX0hfQ1VUT0ZGX0FDVElWRV9FTgkJKDE8PDQpCisjZGVmaW5lIENSVENfVl9DVVRPRkZfQUNUSVZFX0VOCQkoMTw8NSkKKyNkZWZpbmUgREFDX0VYVF9DTlRMCQkJMHgwMjgwCisjZGVmaW5lIEZQX0dFTl9DTlRMCQkJMHgwMjg0CisjZGVmaW5lIEZQX0hPUlpfU1RSRVRDSAkJCTB4MDI4QworI2RlZmluZSBGUF9WRVJUX1NUUkVUQ0gJCQkweDAyOTAKKyNkZWZpbmUgRlBfSF9TWU5DX1NUUlRfV0lECQkweDAyQzQKKyNkZWZpbmUgRlBfVl9TWU5DX1NUUlRfV0lECQkweDAyQzgKKyNkZWZpbmUgQVVYX1dJTkRPV19IT1JaX0NOVEwJCTB4MDJEOAorI2RlZmluZSBBVVhfV0lORE9XX1ZFUlRfQ05UTAkJMHgwMkRDCisvKiAjZGVmaW5lIEREQV9DT05GSUcJCQkweDAyZTAgKi8KKy8qICNkZWZpbmUgRERBX09OX09GRgkJCTB4MDJlNCAqLworI2RlZmluZSBEVklfSTJDX0NOVExfMQkJCTB4MDJlNAorI2RlZmluZSBHUlBIX0JVRkZFUl9DTlRMCQkweDAyRjAKKyNkZWZpbmUgR1JQSDJfQlVGRkVSX0NOVEwJCTB4MDNGMAorI2RlZmluZSBWR0FfQlVGRkVSX0NOVEwJCQkweDAyRjQKKyNkZWZpbmUgT1YwX1lfWF9TVEFSVAkJCTB4MDQwMAorI2RlZmluZSBPVjBfWV9YX0VORAkJCTB4MDQwNAorI2RlZmluZSBPVjBfUElQRUxJTkVfQ05UTAkJMHgwNDA4CisjZGVmaW5lIE9WMF9SRUdfTE9BRF9DTlRMCQkweDA0MTAKKyNkZWZpbmUgT1YwX1NDQUxFX0NOVEwJCQkweDA0MjAKKyNkZWZpbmUgT1YwX1ZfSU5DCQkJMHgwNDI0CisjZGVmaW5lIE9WMF9QMV9WX0FDQ1VNX0lOSVQJCTB4MDQyOAorI2RlZmluZSBPVjBfUDIzX1ZfQUNDVU1fSU5JVAkJMHgwNDJDCisjZGVmaW5lIE9WMF9QMV9CTEFOS19MSU5FU19BVF9UT1AJMHgwNDMwCisjZGVmaW5lIE9WMF9QMjNfQkxBTktfTElORVNfQVRfVE9QCTB4MDQzNAorI2RlZmluZSBPVjBfQkFTRV9BRERSCQkJMHgwNDNDCisjZGVmaW5lIE9WMF9WSURfQlVGMF9CQVNFX0FEUlMJCTB4MDQ0MAorI2RlZmluZSBPVjBfVklEX0JVRjFfQkFTRV9BRFJTCQkweDA0NDQKKyNkZWZpbmUgT1YwX1ZJRF9CVUYyX0JBU0VfQURSUwkJMHgwNDQ4CisjZGVmaW5lIE9WMF9WSURfQlVGM19CQVNFX0FEUlMJCTB4MDQ0QworI2RlZmluZSBPVjBfVklEX0JVRjRfQkFTRV9BRFJTCQkweDA0NTAKKyNkZWZpbmUgT1YwX1ZJRF9CVUY1X0JBU0VfQURSUwkJMHgwNDU0CisjZGVmaW5lIE9WMF9WSURfQlVGX1BJVENIMF9WQUxVRQkweDA0NjAKKyNkZWZpbmUgT1YwX1ZJRF9CVUZfUElUQ0gxX1ZBTFVFCTB4MDQ2NAorI2RlZmluZSBPVjBfQVVUT19GTElQX0NOVFJMCQkweDA0NzAKKyNkZWZpbmUgT1YwX0RFSU5URVJMQUNFX1BBVFRFUk4JCTB4MDQ3NAorI2RlZmluZSBPVjBfU1VCTUlUX0hJU1RPUlkJCTB4MDQ3OAorI2RlZmluZSBPVjBfSF9JTkMJCQkweDA0ODAKKyNkZWZpbmUgT1YwX1NURVBfQlkJCQkweDA0ODQKKyNkZWZpbmUgT1YwX1AxX0hfQUNDVU1fSU5JVAkJMHgwNDg4CisjZGVmaW5lIE9WMF9QMjNfSF9BQ0NVTV9JTklUCQkweDA0OEMKKyNkZWZpbmUgT1YwX1AxX1hfU1RBUlRfRU5ECQkweDA0OTQKKyNkZWZpbmUgT1YwX1AyX1hfU1RBUlRfRU5ECQkweDA0OTgKKyNkZWZpbmUgT1YwX1AzX1hfU1RBUlRfRU5ECQkweDA0OUMKKyNkZWZpbmUgT1YwX0ZJTFRFUl9DTlRMCQkJMHgwNEEwCisjZGVmaW5lIE9WMF9GT1VSX1RBUF9DT0VGXzAJCTB4MDRCMAorI2RlZmluZSBPVjBfRk9VUl9UQVBfQ09FRl8xCQkweDA0QjQKKyNkZWZpbmUgT1YwX0ZPVVJfVEFQX0NPRUZfMgkJMHgwNEI4CisjZGVmaW5lIE9WMF9GT1VSX1RBUF9DT0VGXzMJCTB4MDRCQworI2RlZmluZSBPVjBfRk9VUl9UQVBfQ09FRl80CQkweDA0QzAKKyNkZWZpbmUgT1YwX0ZMQUdfQ05UUkwJCQkweDA0REMKKyNkZWZpbmUgT1YwX1NMSUNFX0NOVEwJCQkweDA0RTAKKyNkZWZpbmUgT1YwX1ZJRF9LRVlfQ0xSX0xPVwkJMHgwNEU0CisjZGVmaW5lIE9WMF9WSURfS0VZX0NMUl9ISUdICQkweDA0RTgKKyNkZWZpbmUgT1YwX0dSUEhfS0VZX0NMUl9MT1cJCTB4MDRFQworI2RlZmluZSBPVjBfR1JQSF9LRVlfQ0xSX0hJR0gJCTB4MDRGMAorI2RlZmluZSBPVjBfS0VZX0NOVEwJCQkweDA0RjQKKyNkZWZpbmUgT1YwX1RFU1QJCQkweDA0RjgKKyNkZWZpbmUgU1VCUElDX0NOVEwJCQkweDA1NDAKKyNkZWZpbmUgU1VCUElDX0RFRkNPTENPTgkJMHgwNTQ0CisjZGVmaW5lIFNVQlBJQ19ZX1hfU1RBUlQJCTB4MDU0QworI2RlZmluZSBTVUJQSUNfWV9YX0VORAkJCTB4MDU1MAorI2RlZmluZSBTVUJQSUNfVl9JTkMJCQkweDA1NTQKKyNkZWZpbmUgU1VCUElDX0hfSU5DCQkJMHgwNTU4CisjZGVmaW5lIFNVQlBJQ19CVUYwX09GRlNFVAkJMHgwNTVDCisjZGVmaW5lIFNVQlBJQ19CVUYxX09GRlNFVAkJMHgwNTYwCisjZGVmaW5lIFNVQlBJQ19MQzBfT0ZGU0VUCQkweDA1NjQKKyNkZWZpbmUgU1VCUElDX0xDMV9PRkZTRVQJCTB4MDU2OAorI2RlZmluZSBTVUJQSUNfUElUQ0gJCQkweDA1NkMKKyNkZWZpbmUgU1VCUElDX0JUTl9ITElfQ09MQ09OCQkweDA1NzAKKyNkZWZpbmUgU1VCUElDX0JUTl9ITElfWV9YX1NUQVJUCTB4MDU3NAorI2RlZmluZSBTVUJQSUNfQlROX0hMSV9ZX1hfRU5ECQkweDA1NzgKKyNkZWZpbmUgU1VCUElDX1BBTEVUVEVfSU5ERVgJCTB4MDU3QworI2RlZmluZSBTVUJQSUNfUEFMRVRURV9EQVRBCQkweDA1ODAKKyNkZWZpbmUgU1VCUElDX0hfQUNDVU1fSU5JVAkJMHgwNTg0CisjZGVmaW5lIFNVQlBJQ19WX0FDQ1VNX0lOSVQJCTB4MDU4OAorI2RlZmluZSBESVNQX01JU0NfQ05UTAkJCTB4MEQwMAorI2RlZmluZSBEQUNfTUFDUk9fQ05UTAkJCTB4MEQwNAorI2RlZmluZSBESVNQX1BXUl9NQU4JCQkweDBEMDgKKyNkZWZpbmUgRElTUF9URVNUX0RFQlVHX0NOVEwJCTB4MEQxMAorI2RlZmluZSBESVNQX0hXX0RFQlVHCQkJMHgwRDE0CisjZGVmaW5lIERBQ19DUkNfU0lHMQkJCTB4MEQxOAorI2RlZmluZSBEQUNfQ1JDX1NJRzIJCQkweDBEMUMKKyNkZWZpbmUgT1YwX0xJTl9UUkFOU19BCQkJMHgwRDIwCisjZGVmaW5lIE9WMF9MSU5fVFJBTlNfQgkJCTB4MEQyNAorI2RlZmluZSBPVjBfTElOX1RSQU5TX0MJCQkweDBEMjgKKyNkZWZpbmUgT1YwX0xJTl9UUkFOU19ECQkJMHgwRDJDCisjZGVmaW5lIE9WMF9MSU5fVFJBTlNfRQkJCTB4MEQzMAorI2RlZmluZSBPVjBfTElOX1RSQU5TX0YJCQkweDBEMzQKKyNkZWZpbmUgT1YwX0dBTU1BXzBfRgkJCTB4MEQ0MAorI2RlZmluZSBPVjBfR0FNTUFfMTBfMUYJCQkweDBENDQKKyNkZWZpbmUgT1YwX0dBTU1BXzIwXzNGCQkJMHgwRDQ4CisjZGVmaW5lIE9WMF9HQU1NQV80MF83RgkJCTB4MEQ0QworI2RlZmluZSBPVjBfR0FNTUFfMzgwXzNCRgkJMHgwRDUwCisjZGVmaW5lIE9WMF9HQU1NQV8zQzBfM0ZGCQkweDBENTQKKyNkZWZpbmUgRElTUF9NRVJHRV9DTlRMCQkJMHgwRDYwCisjZGVmaW5lIERJU1BfT1VUUFVUX0NOVEwJCTB4MEQ2NAorI2RlZmluZSBESVNQX0xJTl9UUkFOU19HUlBIX0EJCTB4MEQ4MAorI2RlZmluZSBESVNQX0xJTl9UUkFOU19HUlBIX0IJCTB4MEQ4NAorI2RlZmluZSBESVNQX0xJTl9UUkFOU19HUlBIX0MJCTB4MEQ4OAorI2RlZmluZSBESVNQX0xJTl9UUkFOU19HUlBIX0QJCTB4MEQ4QworI2RlZmluZSBESVNQX0xJTl9UUkFOU19HUlBIX0UJCTB4MEQ5MAorI2RlZmluZSBESVNQX0xJTl9UUkFOU19HUlBIX0YJCTB4MEQ5NAorI2RlZmluZSBESVNQX0xJTl9UUkFOU19WSURfQQkJMHgwRDk4CisjZGVmaW5lIERJU1BfTElOX1RSQU5TX1ZJRF9CCQkweDBEOUMKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfVklEX0MJCTB4MERBMAorI2RlZmluZSBESVNQX0xJTl9UUkFOU19WSURfRAkJMHgwREE0CisjZGVmaW5lIERJU1BfTElOX1RSQU5TX1ZJRF9FCQkweDBEQTgKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfVklEX0YJCTB4MERBQworI2RlZmluZSBSTVhfSE9SWl9GSUxURVJfMFRBUF9DT0VGCTB4MERCMAorI2RlZmluZSBSTVhfSE9SWl9GSUxURVJfMVRBUF9DT0VGCTB4MERCNAorI2RlZmluZSBSTVhfSE9SWl9GSUxURVJfMlRBUF9DT0VGCTB4MERCOAorI2RlZmluZSBSTVhfSE9SWl9QSEFTRQkJCTB4MERCQworI2RlZmluZSBEQUNfRU1CRURERURfU1lOQ19DTlRMCQkweDBEQzAKKyNkZWZpbmUgREFDX0JST0FEX1BVTFNFCQkJMHgwREM0CisjZGVmaW5lIERBQ19TS0VXX0NMS1MJCQkweDBEQzgKKyNkZWZpbmUgREFDX0lOQ1IJCQkweDBEQ0MKKyNkZWZpbmUgREFDX05FR19TWU5DX0xFVkVMCQkweDBERDAKKyNkZWZpbmUgREFDX1BPU19TWU5DX0xFVkVMCQkweDBERDQKKyNkZWZpbmUgREFDX0JMQU5LX0xFVkVMCQkJMHgwREQ4CisjZGVmaW5lIENMT0NLX0NOVExfSU5ERVgJCTB4MDAwOAorI2RlZmluZSBDTE9DS19DTlRMX0RBVEEJCQkweDAwMEMKKyNkZWZpbmUgQ1BfUkJfQ05UTAkJCTB4MDcwNAorI2RlZmluZSBDUF9SQl9CQVNFCQkJMHgwNzAwCisjZGVmaW5lIENQX1JCX1JQVFJfQUREUgkJCTB4MDcwQworI2RlZmluZSBDUF9SQl9SUFRSCQkJMHgwNzEwCisjZGVmaW5lIENQX1JCX1dQVFIJCQkweDA3MTQKKyNkZWZpbmUgQ1BfUkJfV1BUUl9ERUxBWQkJMHgwNzE4CisjZGVmaW5lIENQX0lCX0JBU0UJCQkweDA3MzgKKyNkZWZpbmUgQ1BfSUJfQlVGU1oJCQkweDA3M0MKKyNkZWZpbmUgU0NSQVRDSF9SRUcwCQkJMHgxNUUwCisjZGVmaW5lIEdVSV9TQ1JBVENIX1JFRzAJCTB4MTVFMAorI2RlZmluZSBTQ1JBVENIX1JFRzEJCQkweDE1RTQKKyNkZWZpbmUgR1VJX1NDUkFUQ0hfUkVHMQkJMHgxNUU0CisjZGVmaW5lIFNDUkFUQ0hfUkVHMgkJCTB4MTVFOAorI2RlZmluZSBHVUlfU0NSQVRDSF9SRUcyCQkweDE1RTgKKyNkZWZpbmUgU0NSQVRDSF9SRUczCQkJMHgxNUVDCisjZGVmaW5lIEdVSV9TQ1JBVENIX1JFRzMJCTB4MTVFQworI2RlZmluZSBTQ1JBVENIX1JFRzQJCQkweDE1RjAKKyNkZWZpbmUgR1VJX1NDUkFUQ0hfUkVHNAkJMHgxNUYwCisjZGVmaW5lIFNDUkFUQ0hfUkVHNQkJCTB4MTVGNAorI2RlZmluZSBHVUlfU0NSQVRDSF9SRUc1CQkweDE1RjQKKyNkZWZpbmUgU0NSQVRDSF9VTVNLCQkJMHgwNzcwCisjZGVmaW5lIFNDUkFUQ0hfQUREUgkJCTB4MDc3NAorI2RlZmluZSBEUF9CUlVTSF9GUkdEX0NMUgkJMHgxNDdDCisjZGVmaW5lIERQX0JSVVNIX0JLR0RfQ0xSCQkweDE0NzgKKyNkZWZpbmUgRFNUX0xJTkVfU1RBUlQJCQkweDE2MDAKKyNkZWZpbmUgRFNUX0xJTkVfRU5ECQkJMHgxNjA0CisjZGVmaW5lIFNSQ19PRkZTRVQJCQkweDE1QUMKKyNkZWZpbmUgU1JDX1BJVENICQkJMHgxNUIwCisjZGVmaW5lIFNSQ19USUxFCQkJMHgxNzA0CisjZGVmaW5lIFNSQ19QSVRDSF9PRkZTRVQJCTB4MTQyOAorI2RlZmluZSBTUkNfWAkJCQkweDE0MTQKKyNkZWZpbmUgU1JDX1kJCQkJMHgxNDE4CisjZGVmaW5lIFNSQ19YX1kJCQkJMHgxNTkwCisjZGVmaW5lIFNSQ19ZX1gJCQkJMHgxNDM0CisjZGVmaW5lIERTVF9ZX1gJCQkJMHgxNDM4CisjZGVmaW5lIERTVF9XSURUSF9IRUlHSFQJCTB4MTU5OAorI2RlZmluZSBEU1RfSEVJR0hUX1dJRFRICQkweDE0M2MKKyNkZWZpbmUgRFNUX09GRlNFVAkJCTB4MTQwNAorI2RlZmluZSBTUkNfQ0xVVF9BRERSRVNTCQkweDE3ODAKKyNkZWZpbmUgU1JDX0NMVVRfREFUQQkJCTB4MTc4NAorI2RlZmluZSBTUkNfQ0xVVF9EQVRBX1JECQkweDE3ODgKKyNkZWZpbmUgSE9TVF9EQVRBMAkJCTB4MTdDMAorI2RlZmluZSBIT1NUX0RBVEExCQkJMHgxN0M0CisjZGVmaW5lIEhPU1RfREFUQTIJCQkweDE3QzgKKyNkZWZpbmUgSE9TVF9EQVRBMwkJCTB4MTdDQworI2RlZmluZSBIT1NUX0RBVEE0CQkJMHgxN0QwCisjZGVmaW5lIEhPU1RfREFUQTUJCQkweDE3RDQKKyNkZWZpbmUgSE9TVF9EQVRBNgkJCTB4MTdEOAorI2RlZmluZSBIT1NUX0RBVEE3CQkJMHgxN0RDCisjZGVmaW5lIEhPU1RfREFUQV9MQVNUCQkJMHgxN0UwCisjZGVmaW5lIERQX1NSQ19FTkRJQU4JCQkweDE1RDQKKyNkZWZpbmUgRFBfU1JDX0ZSR0RfQ0xSCQkJMHgxNUQ4CisjZGVmaW5lIERQX1NSQ19CS0dEX0NMUgkJCTB4MTVEQworI2RlZmluZSBTQ19MRUZUCQkJCTB4MTY0MAorI2RlZmluZSBTQ19SSUdIVAkJCTB4MTY0NAorI2RlZmluZSBTQ19UT1AJCQkJMHgxNjQ4CisjZGVmaW5lIFNDX0JPVFRPTQkJCTB4MTY0QworI2RlZmluZSBTUkNfU0NfUklHSFQJCQkweDE2NTQKKyNkZWZpbmUgU1JDX1NDX0JPVFRPTQkJCTB4MTY1QworI2RlZmluZSBEUF9DTlRMCQkJCTB4MTZDMAorI2RlZmluZSBEUF9DTlRMX1hESVJfWURJUl9ZTUFKT1IJMHgxNkQwCisjZGVmaW5lIERQX0RBVEFUWVBFCQkJMHgxNkM0CisjZGVmaW5lIERQX01JWAkJCQkweDE2QzgKKyNkZWZpbmUgRFBfV1JJVEVfTVNLCQkJMHgxNkNDCisjZGVmaW5lIERQX1hPUAkJCQkweDE3RjgKKyNkZWZpbmUgQ0xSX0NNUF9DTFJfU1JDCQkJMHgxNUM0CisjZGVmaW5lIENMUl9DTVBfQ0xSX0RTVAkJCTB4MTVDOAorI2RlZmluZSBDTFJfQ01QX0NOVEwJCQkweDE1QzAKKyNkZWZpbmUgQ0xSX0NNUF9NU0sJCQkweDE1Q0MKKyNkZWZpbmUgRFNUQ0FDSEVfTU9ERQkJCTB4MTcxMAorI2RlZmluZSBEU1RDQUNIRV9DVExTVEFUCQkweDE3MTQKKyNkZWZpbmUgREVGQVVMVF9QSVRDSF9PRkZTRVQJCTB4MTZFMAorI2RlZmluZSBERUZBVUxUX1NDX0JPVFRPTV9SSUdIVAkJMHgxNkU4CisjZGVmaW5lIERFRkFVTFRfU0NfVE9QX0xFRlQJCTB4MTZFQworI2RlZmluZSBTUkNfUElUQ0hfT0ZGU0VUCQkweDE0MjgKKyNkZWZpbmUgRFNUX1BJVENIX09GRlNFVAkJMHgxNDJDCisjZGVmaW5lIERQX0dVSV9NQVNURVJfQ05UTAkJMHgxNDZDCisjZGVmaW5lIFNDX1RPUF9MRUZUCQkJMHgxNkVDCisjZGVmaW5lIFNDX0JPVFRPTV9SSUdIVAkJCTB4MTZGMAorI2RlZmluZSBTUkNfU0NfQk9UVE9NX1JJR0hUCQkweDE2RjQKKyNkZWZpbmUgUkIyRF9EU1RDQUNIRV9NT0RFCQkweDM0MjgKKyNkZWZpbmUgUkIyRF9EU1RDQUNIRV9DVExTVEFUCQkweDM0MkMKKyNkZWZpbmUgTFZEU19HRU5fQ05UTAkJCTB4MDJkMAorI2RlZmluZSBMVkRTX1BMTF9DTlRMCQkJMHgwMmQ0CisjZGVmaW5lIEZQMl9HRU5fQ05UTAkJCTB4MDI4OAorI2RlZmluZSBUTURTX0NOVEwJCQkweDAyOTQKKyNkZWZpbmUgVE1EU19DUkMJCQkweDAyYTAKKyNkZWZpbmUgVE1EU19UUkFOU01JVFRFUl9DTlRMCQkweDAyYTQKKyNkZWZpbmUgTVBQX1RCX0NPTkZJRwkJCTB4MDFjMAorI2RlZmluZSBQQU1BQzBfRExZX0NOVEwJCQkweDBhOTQKKyNkZWZpbmUgUEFNQUMxX0RMWV9DTlRMCQkJMHgwYTk4CisjZGVmaW5lIFBBTUFDMl9ETFlfQ05UTAkJCTB4MGE5YworI2RlZmluZSBGV19DTlRMCQkJCTB4MDExOAorI2RlZmluZSBGQ1BfQ05UTAkJCTB4MDkxMAorI2RlZmluZSBWR0FfRERBX09OX09GRgkJCTB4MDJlYworI2RlZmluZSBUVl9NQVNURVJfQ05UTAkJCTB4MDgwMAorCisvKiAjZGVmaW5lIEJBU0VfQ09ERQkJCTB4MGYwYiAqLworI2RlZmluZSBCSU9TXzBfU0NSQVRDSAkJCTB4MDAxMAorI2RlZmluZSBCSU9TXzFfU0NSQVRDSAkJCTB4MDAxNAorI2RlZmluZSBCSU9TXzJfU0NSQVRDSAkJCTB4MDAxOAorI2RlZmluZSBCSU9TXzNfU0NSQVRDSAkJCTB4MDAxYworI2RlZmluZSBCSU9TXzRfU0NSQVRDSAkJCTB4MDAyMAorI2RlZmluZSBCSU9TXzVfU0NSQVRDSAkJCTB4MDAyNAorI2RlZmluZSBCSU9TXzZfU0NSQVRDSAkJCTB4MDAyOAorI2RlZmluZSBCSU9TXzdfU0NSQVRDSAkJCTB4MDAyYworCisjZGVmaW5lIEhEUF9TT0ZUX1JFU0VUCQkJKDEgPDwgMjYpCisKKyNkZWZpbmUgVFZfREFDX0NOVEwJCQkweDA4OGMKKyNkZWZpbmUgR1BJT1BBRF9NQVNLCQkJMHgwMTk4CisjZGVmaW5lIEdQSU9QQURfQQkJCTB4MDE5YworI2RlZmluZSBHUElPUEFEX0VOCQkJMHgwMWEwCisjZGVmaW5lIEdQSU9QQURfWQkJCTB4MDFhNAorI2RlZmluZSBaVl9MQ0RQQURfTUFTSwkJCTB4MDFhOAorI2RlZmluZSBaVl9MQ0RQQURfQQkJCTB4MDFhYworI2RlZmluZSBaVl9MQ0RQQURfRU4JCQkweDAxYjAKKyNkZWZpbmUgWlZfTENEUEFEX1kJCQkweDAxYjQKKworLyogUExMIFJlZ2lzdGVycyAqLworI2RlZmluZSBDTEtfUElOX0NOVEwJCQkweDAwMDEKKyNkZWZpbmUgUFBMTF9DTlRMCQkJMHgwMDAyCisjZGVmaW5lIFBQTExfUkVGX0RJVgkJCTB4MDAwMworI2RlZmluZSBQUExMX0RJVl8wCQkJMHgwMDA0CisjZGVmaW5lIFBQTExfRElWXzEJCQkweDAwMDUKKyNkZWZpbmUgUFBMTF9ESVZfMgkJCTB4MDAwNgorI2RlZmluZSBQUExMX0RJVl8zCQkJMHgwMDA3CisjZGVmaW5lIFZDTEtfRUNQX0NOVEwJCQkweDAwMDgKKyNkZWZpbmUgSFRPVEFMX0NOVEwJCQkweDAwMDkKKyNkZWZpbmUgTV9TUExMX1JFRl9GQl9ESVYJCTB4MDAwYQorI2RlZmluZSBBR1BfUExMX0NOVEwJCQkweDAwMGIKKyNkZWZpbmUgU1BMTF9DTlRMCQkJMHgwMDBjCisjZGVmaW5lIFNDTEtfQ05UTAkJCTB4MDAwZAorI2RlZmluZSBNUExMX0NOVEwJCQkweDAwMGUKKyNkZWZpbmUgTURMTF9DS08JCQkweDAwMGYKKyNkZWZpbmUgTURMTF9SRENLQQkJCTB4MDAxMAorI2RlZmluZSBNQ0xLX0NOVEwJCQkweDAwMTIKKyNkZWZpbmUgQUdQX1BMTF9DTlRMCQkJMHgwMDBiCisjZGVmaW5lIFBMTF9URVNUX0NOVEwJCQkweDAwMTMKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMCQkJMHgwMDE0CisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTAkJCTB4MDAxNQorI2RlZmluZSBNQ0xLX01JU0MJCQkweDAwMWYKKyNkZWZpbmUgUDJQTExfQ05UTAkJCTB4MDAyYQorI2RlZmluZSBQMlBMTF9SRUZfRElWCQkJMHgwMDJiCisjZGVmaW5lIFBJWENMS1NfQ05UTAkJCTB4MDAyZAorI2RlZmluZSBTQ0xLX01PUkVfQ05UTAkJCTB4MDAzNQorCisvKiBNQ0xLX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBGT1JDRU9OX01DTEtBCQkJKDEgPDwgMTYpCisjZGVmaW5lIEZPUkNFT05fTUNMS0IJCQkoMSA8PCAxNykKKyNkZWZpbmUgRk9SQ0VPTl9ZQ0xLQQkJCSgxIDw8IDE4KQorI2RlZmluZSBGT1JDRU9OX1lDTEtCCQkJKDEgPDwgMTkpCisjZGVmaW5lIEZPUkNFT05fTUMJCQkoMSA8PCAyMCkKKyNkZWZpbmUgRk9SQ0VPTl9BSUMJCQkoMSA8PCAyMSkKKworLyogU0NMS19DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRFlOX1NUT1BfTEFUX01BU0sJCTB4MDAwMDdmZjgKKyNkZWZpbmUgQ1BfTUFYX0RZTl9TVE9QX0xBVAkJMHgwMDA4CisjZGVmaW5lIFNDTEtfRk9SQ0VPTl9NQVNLCQkweGZmZmY4MDAwCisKKy8qIFNDTEtfTU9SRV9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgU0NMS19NT1JFX0ZPUkNFT04JCTB4MDcwMAorCisvKiBCVVNfQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIEJVU19EQkxfUkVTWU5DCQkJMHgwMDAwMDAwMQorI2RlZmluZSBCVVNfTVNUUl9SRVNFVAkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQlVTX0ZMVVNIX0JVRgkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQlVTX1NUT1BfUkVRX0RJUwkJMHgwMDAwMDAwOAorI2RlZmluZSBCVVNfUk9UQVRJT05fRElTCQkweDAwMDAwMDEwCisjZGVmaW5lIEJVU19NQVNURVJfRElTCQkJMHgwMDAwMDA0MAorI2RlZmluZSBCVVNfUk9NX1dSVF9FTgkJCTB4MDAwMDAwODAKKyNkZWZpbmUgQlVTX0RJU19ST00JCQkweDAwMDAxMDAwCisjZGVmaW5lIEJVU19QQ0lfUkVBRF9SRVRSWV9FTgkJMHgwMDAwMjAwMAorI2RlZmluZSBCVVNfQUdQX0FEX1NURVBQSU5HX0VOCQkweDAwMDA0MDAwCisjZGVmaW5lIEJVU19QQ0lfV1JUX1JFVFJZX0VOCQkweDAwMDA4MDAwCisjZGVmaW5lIEJVU19NU1RSX1JEX01VTFQJCTB4MDAxMDAwMDAKKyNkZWZpbmUgQlVTX01TVFJfUkRfTElORQkJMHgwMDIwMDAwMAorI2RlZmluZSBCVVNfU1VTUEVORAkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgTEFUXzE2WAkJCQkweDAwODAwMDAwCisjZGVmaW5lIEJVU19SRF9ESVNDQVJEX0VOCQkweDAxMDAwMDAwCisjZGVmaW5lIEJVU19SRF9BQk9SVF9FTgkJCTB4MDIwMDAwMDAKKyNkZWZpbmUgQlVTX01TVFJfV1MJCQkweDA0MDAwMDAwCisjZGVmaW5lIEJVU19QQVJLSU5HX0RJUwkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgQlVTX01TVFJfRElTQ09OTkVDVF9FTgkJMHgxMDAwMDAwMAorI2RlZmluZSBCVVNfV1JUX0JVUlNUCQkJMHgyMDAwMDAwMAorI2RlZmluZSBCVVNfUkVBRF9CVVJTVAkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgQlVTX1JEWV9SRUFEX0RMWQkJMHg4MDAwMDAwMAorCisvKiBQSVhDTEtTX0NOVEwgKi8KKyNkZWZpbmUgUElYMkNMS19TUkNfU0VMX01BU0sJCTB4MDMKKyNkZWZpbmUgUElYMkNMS19TUkNfU0VMX0NQVUNMSwkJMHgwMAorI2RlZmluZSBQSVgyQ0xLX1NSQ19TRUxfUFNDQU5DTEsJMHgwMQorI2RlZmluZSBQSVgyQ0xLX1NSQ19TRUxfQllURUNMSwkJMHgwMgorI2RlZmluZSBQSVgyQ0xLX1NSQ19TRUxfUDJQTExDTEsJMHgwMworI2RlZmluZSBQSVgyQ0xLX0FMV0FZU19PTmIJCSgxPDw2KQorI2RlZmluZSBQSVgyQ0xLX0RBQ19BTFdBWVNfT05iCQkoMTw8NykKKyNkZWZpbmUgUElYQ0xLX1RWX1NSQ19TRUwJCSgxIDw8IDgpCisjZGVmaW5lIFBJWENMS19MVkRTX0FMV0FZU19PTmIJCSgxIDw8IDE0KQorI2RlZmluZSBQSVhDTEtfVE1EU19BTFdBWVNfT05iCQkoMSA8PCAxNSkKKworCisvKiBDTE9DS19DTlRMX0lOREVYIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgUExMX1dSX0VOCQkJMHgwMDAwMDA4MAorCisvKiBDT05GSUdfQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIENGR19WR0FfUkFNX0VOCQkJMHgwMDAwMDEwMAorI2RlZmluZSBDRkdfQVRJX1JFVl9JRF9NQVNLCQkoMHhmIDw8IDE2KQorI2RlZmluZSBDRkdfQVRJX1JFVl9BMTEJCQkoMCA8PCAxNikKKyNkZWZpbmUgQ0ZHX0FUSV9SRVZfQTEyCQkJKDEgPDwgMTYpCisjZGVmaW5lIENGR19BVElfUkVWX0ExMwkJCSgyIDw8IDE2KQorCisvKiBDUlRDX0VYVF9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgVkdBX0FUSV9MSU5FQVIJCQkweDAwMDAwMDA4CisjZGVmaW5lIFZHQV8xMjhLQVBfUEFHSU5HCQkweDAwMDAwMDEwCisjZGVmaW5lIFhDUlRfQ05UX0VOCQkJKDEgPDwgNikKKyNkZWZpbmUgQ1JUQ19IU1lOQ19ESVMJCQkoMSA8PCA4KQorI2RlZmluZSBDUlRDX1ZTWU5DX0RJUwkJCSgxIDw8IDkpCisjZGVmaW5lIENSVENfRElTUExBWV9ESVMJCSgxIDw8IDEwKQorI2RlZmluZSBDUlRDX0NSVF9PTgkJCSgxIDw8IDE1KQorCisKKy8qIERTVENBQ0hFX0NUTFNUQVQgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBSQjJEX0RDX0ZMVVNICQkJKDMgPDwgMCkKKyNkZWZpbmUgUkIyRF9EQ19GTFVTSF9BTEwJCTB4ZgorI2RlZmluZSBSQjJEX0RDX0JVU1kJCQkoMSA8PCAzMSkKKworCisvKiBDUlRDX0dFTl9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgQ1JUQ19EQkxfU0NBTl9FTgkJMHgwMDAwMDAwMQorI2RlZmluZSBDUlRDX0NVUl9FTgkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgQ1JUQ19JTlRFUkxBQ0VfRU4JCSgxIDw8IDEpCisjZGVmaW5lIENSVENfQllQQVNTX0xVVF9FTgkJKDEgPDwgMTQpCisjZGVmaW5lIENSVENfRVhUX0RJU1BfRU4JCSgxIDw8IDI0KQorI2RlZmluZSBDUlRDX0VOCQkJCSgxIDw8IDI1KQorI2RlZmluZSBDUlRDX0RJU1BfUkVRX0VOX0IJCSgxIDw8IDI2KQorCisvKiBDUlRDX1NUQVRVUyBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIENSVENfVkJMQU5LCQkJMHgwMDAwMDAwMQorCisvKiBDUlRDMl9HRU5fQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIENSVDJfT04JCQkJKDEgPDwgNykKKyNkZWZpbmUgQ1JUQzJfRElTUExBWV9ESVMJCSgxIDw8IDIzKQorI2RlZmluZSBDUlRDMl9FTgkJCSgxIDw8IDI1KQorI2RlZmluZSBDUlRDMl9ESVNQX1JFUV9FTl9CCQkoMSA8PCAyNikKKworLyogQ1VSX09GRlNFVCwgQ1VSX0hPUlpfVkVSVF9QT1NOLCBDVVJfSE9SWl9WRVJUX09GRiBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIENVUl9MT0NLCQkJMHg4MDAwMDAwMAorCisvKiBHUElPIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgR1BJT19BXzAJCQkoMSA8PCAgMCkKKyNkZWZpbmUgR1BJT19BXzEJCQkoMSA8PCAgMSkKKyNkZWZpbmUgR1BJT19ZXzAJCQkoMSA8PCAgOCkKKyNkZWZpbmUgR1BJT19ZXzEJCQkoMSA8PCAgOSkKKyNkZWZpbmUgR1BJT19FTl8wCQkJKDEgPDwgMTYpCisjZGVmaW5lIEdQSU9fRU5fMQkJCSgxIDw8IDE3KQorI2RlZmluZSBHUElPX01BU0tfMAkJCSgxIDw8IDI0KQorI2RlZmluZSBHUElPX01BU0tfMQkJCSgxIDw8IDI1KQorI2RlZmluZSBWR0FfRERDX0RBVEFfT1VUUFVUCQlHUElPX0FfMAorI2RlZmluZSBWR0FfRERDX0NMS19PVVRQVVQJCUdQSU9fQV8xCisjZGVmaW5lIFZHQV9ERENfREFUQV9JTlBVVAkJR1BJT19ZXzAKKyNkZWZpbmUgVkdBX0REQ19DTEtfSU5QVVQJCUdQSU9fWV8xCisjZGVmaW5lIFZHQV9ERENfREFUQV9PVVRfRU4JCUdQSU9fRU5fMAorI2RlZmluZSBWR0FfRERDX0NMS19PVVRfRU4JCUdQSU9fRU5fMQorCisKKy8qIEZQIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRlBfQ1JUQ19IX1RPVEFMX01BU0sJCTAwMDAwM2ZmCisjZGVmaW5lIEZQX0NSVENfSF9ESVNQX01BU0sJCTB4MDFmZjAwMDAKKyNkZWZpbmUgRlBfQ1JUQ19WX1RPVEFMX01BU0sJCTB4MDAwMDBmZmYKKyNkZWZpbmUgRlBfQ1JUQ19WX0RJU1BfTUFTSwkJMHgwZmZmMDAwMAorI2RlZmluZSBGUF9IX1NZTkNfU1RSVF9DSEFSX01BU0sJMHgwMDAwMWZmOAorI2RlZmluZSBGUF9IX1NZTkNfV0lEX01BU0sJCTB4MDAzZjAwMDAKKyNkZWZpbmUgRlBfVl9TWU5DX1NUUlRfTUFTSwkJMHgwMDAwMGZmZgorI2RlZmluZSBGUF9WX1NZTkNfV0lEX01BU0sJCTB4MDAxZjAwMDAKKyNkZWZpbmUgRlBfQ1JUQ19IX1RPVEFMX1NISUZUCQkweDAwMDAwMDAwCisjZGVmaW5lIEZQX0NSVENfSF9ESVNQX1NISUZUCQkweDAwMDAwMDEwCisjZGVmaW5lIEZQX0NSVENfVl9UT1RBTF9TSElGVAkJMHgwMDAwMDAwMAorI2RlZmluZSBGUF9DUlRDX1ZfRElTUF9TSElGVAkJMHgwMDAwMDAxMAorI2RlZmluZSBGUF9IX1NZTkNfU1RSVF9DSEFSX1NISUZUCTB4MDAwMDAwMDMKKyNkZWZpbmUgRlBfSF9TWU5DX1dJRF9TSElGVAkJMHgwMDAwMDAxMAorI2RlZmluZSBGUF9WX1NZTkNfU1RSVF9TSElGVAkJMHgwMDAwMDAwMAorI2RlZmluZSBGUF9WX1NZTkNfV0lEX1NISUZUCQkweDAwMDAwMDEwCisKKy8qIEZQX0dFTl9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRlBfRlBPTgkJCQkoMSA8PCAwKQorI2RlZmluZSBGUF9UTURTX0VOCQkJKDEgPDwgMikKKyNkZWZpbmUgRlBfUEFORUxfRk9STUFUCQkJKDEgPDwgMykKKyNkZWZpbmUgRlBfRU5fVE1EUwkJCSgxIDw8IDcpCisjZGVmaW5lIEZQX0RFVEVDVF9TRU5TRQkJCSgxIDw8IDgpCisjZGVmaW5lIFIyMDBfRlBfU09VUkNFX1NFTF9NQVNLCQkoMyA8PCAxMCkKKyNkZWZpbmUgUjIwMF9GUF9TT1VSQ0VfU0VMX0NSVEMxCSgwIDw8IDEwKQorI2RlZmluZSBSMjAwX0ZQX1NPVVJDRV9TRUxfQ1JUQzIJKDEgPDwgMTApCisjZGVmaW5lIFIyMDBfRlBfU09VUkNFX1NFTF9STVgJCSgyIDw8IDEwKQorI2RlZmluZSBSMjAwX0ZQX1NPVVJDRV9TRUxfVFJBTlMJKDMgPDwgMTApCisjZGVmaW5lIEZQX1NFTF9DUlRDMQkJCSgwIDw8IDEzKQorI2RlZmluZSBGUF9TRUxfQ1JUQzIJCQkoMSA8PCAxMykKKyNkZWZpbmUgRlBfVVNFX1ZHQV9IU1lOQwkJKDEgPDwgMTQpCisjZGVmaW5lIEZQX0NSVENfRE9OVF9TSEFET1dfSFBBUgkoMSA8PCAxNSkKKyNkZWZpbmUgRlBfQ1JUQ19ET05UX1NIQURPV19WUEFSCSgxIDw8IDE2KQorI2RlZmluZSBGUF9DUlRDX0RPTlRfU0hBRE9XX0hFTkQJKDEgPDwgMTcpCisjZGVmaW5lIEZQX0NSVENfVVNFX1NIQURPV19WRU5ECQkoMSA8PCAxOCkKKyNkZWZpbmUgRlBfUk1YX0hWU1lOQ19DT05UUk9MX0VOCSgxIDw8IDIwKQorI2RlZmluZSBGUF9ERlBfU1lOQ19TRUwJCQkoMSA8PCAyMSkKKyNkZWZpbmUgRlBfQ1JUQ19MT0NLXzhET1QJCSgxIDw8IDIyKQorI2RlZmluZSBGUF9DUlRfU1lOQ19TRUwJCQkoMSA8PCAyMykKKyNkZWZpbmUgRlBfVVNFX1NIQURPV19FTgkJKDEgPDwgMjQpCisjZGVmaW5lIEZQX0NSVF9TWU5DX0FMVAkJCSgxIDw8IDI2KQorCisvKiBGUDJfR0VOX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBGUDJfQkxBTktfRU4JCQkoMSA8PAkxKQorI2RlZmluZSBGUDJfT04JCQkJKDEgPDwJMikKKyNkZWZpbmUgRlAyX1BBTkVMX0ZPUk1BVAkJKDEgPDwJMykKKyNkZWZpbmUgRlAyX1NPVVJDRV9TRUxfTUFTSwkJKDMgPDwgMTApCisjZGVmaW5lIEZQMl9TT1VSQ0VfU0VMX0NSVEMyCQkoMSA8PCAxMCkKKyNkZWZpbmUgRlAyX1NSQ19TRUxfTUFTSwkJKDMgPDwgMTMpCisjZGVmaW5lIEZQMl9TUkNfU0VMX0NSVEMyCQkoMSA8PCAxMykKKyNkZWZpbmUgRlAyX0ZQX1BPTAkJCSgxIDw8IDE2KQorI2RlZmluZSBGUDJfTFBfUE9MCQkJKDEgPDwgMTcpCisjZGVmaW5lIEZQMl9TQ0tfUE9MCQkJKDEgPDwgMTgpCisjZGVmaW5lIEZQMl9MQ0RfQ05UTF9NQVNLCQkoNyA8PCAxOSkKKyNkZWZpbmUgRlAyX1BBRF9GTE9QX0VOCQkJKDEgPDwgMjIpCisjZGVmaW5lIEZQMl9DUkNfRU4JCQkoMSA8PCAyMykKKyNkZWZpbmUgRlAyX0NSQ19SRUFEX0VOCQkJKDEgPDwgMjQpCisjZGVmaW5lIEZQMl9EVjBfRU4JCQkoMSA8PCAyNSkKKyNkZWZpbmUgRlAyX0RWMF9SQVRFX1NFTF9TRFIJCSgxIDw8IDI2KQorCisKKy8qIExWRFNfR0VOX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBMVkRTX09OCQkJCSgxIDw8IDApCisjZGVmaW5lIExWRFNfRElTUExBWV9ESVMJCSgxIDw8IDEpCisjZGVmaW5lIExWRFNfUEFORUxfVFlQRQkJCSgxIDw8IDIpCisjZGVmaW5lIExWRFNfUEFORUxfRk9STUFUCQkoMSA8PCAzKQorI2RlZmluZSBMVkRTX0VOCQkJCSgxIDw8IDcpCisjZGVmaW5lIExWRFNfQkxfTU9EX0xFVkVMX01BU0sJCTB4MDAwMGZmMDAKKyNkZWZpbmUgTFZEU19CTF9NT0RfTEVWRUxfU0hJRlQJCTgKKyNkZWZpbmUgTFZEU19CTF9NT0RfRU4JCQkoMSA8PCAxNikKKyNkZWZpbmUgTFZEU19ESUdPTgkJCSgxIDw8IDE4KQorI2RlZmluZSBMVkRTX0JMT04JCQkoMSA8PCAxOSkKKyNkZWZpbmUgTFZEU19TRUxfQ1JUQzIJCQkoMSA8PCAyMykKKyNkZWZpbmUgTFZEU19TVEFURV9NQVNLIFwKKwkoTFZEU19PTiB8IExWRFNfRElTUExBWV9ESVMgfCBMVkRTX0JMX01PRF9MRVZFTF9NQVNLIHwgTFZEU19CTE9OKQorCisvKiBMVkRTX1BMTF9DTlRMIGJpdCBjb25zdGF0bnMgKi8KKyNkZWZpbmUgSFNZTkNfREVMQVlfU0hJRlQJCTB4MWMKKyNkZWZpbmUgSFNZTkNfREVMQVlfTUFTSwkJKDB4ZiA8PCAweDFjKQorCisvKiBUTURTX1RSQU5TTUlUVEVSX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBUTURTX1BMTF9FTgkJCSgxIDw8IDApCisjZGVmaW5lIFRNRFNfUExMUlNUCQkJKDEgPDwgMSkKKyNkZWZpbmUgVE1EU19SQU5fUEFUX1JTVAkJKDEgPDwgNykKKyNkZWZpbmUgVE1EU19JQ0hDU0VMCQkJKDEgPDwgMjgpCisKKy8qIEZQX0hPUlpfU1RSRVRDSCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIEhPUlpfU1RSRVRDSF9SQVRJT19NQVNLCQkweGZmZmYKKyNkZWZpbmUgSE9SWl9TVFJFVENIX1JBVElPX01BWAkJNDA5NgorI2RlZmluZSBIT1JaX1BBTkVMX1NJWkUJCQkoMHgxZmYgPDwgMTYpCisjZGVmaW5lIEhPUlpfUEFORUxfU0hJRlQJCTE2CisjZGVmaW5lIEhPUlpfU1RSRVRDSF9QSVhSRVAJCSgwIDw8IDI1KQorI2RlZmluZSBIT1JaX1NUUkVUQ0hfQkxFTkQJCSgxIDw8IDI2KQorI2RlZmluZSBIT1JaX1NUUkVUQ0hfRU5BQkxFCQkoMSA8PCAyNSkKKyNkZWZpbmUgSE9SWl9BVVRPX1JBVElPCQkJKDEgPDwgMjcpCisjZGVmaW5lIEhPUlpfRlBfTE9PUF9TVFJFVENICQkoMHg3IDw8IDI4KQorI2RlZmluZSBIT1JaX0FVVE9fUkFUSU9fSU5DCQkoMSA8PCAzMSkKKworCisvKiBGUF9WRVJUX1NUUkVUQ0ggYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBWRVJUX1NUUkVUQ0hfUkFUSU9fTUFTSwkJMHhmZmYKKyNkZWZpbmUgVkVSVF9TVFJFVENIX1JBVElPX01BWAkJNDA5NgorI2RlZmluZSBWRVJUX1BBTkVMX1NJWkUJCQkoMHhmZmYgPDwgMTIpCisjZGVmaW5lIFZFUlRfUEFORUxfU0hJRlQJCTEyCisjZGVmaW5lIFZFUlRfU1RSRVRDSF9MSU5SRVAJCSgwIDw8IDI2KQorI2RlZmluZSBWRVJUX1NUUkVUQ0hfQkxFTkQJCSgxIDw8IDI2KQorI2RlZmluZSBWRVJUX1NUUkVUQ0hfRU5BQkxFCQkoMSA8PCAyNSkKKyNkZWZpbmUgVkVSVF9BVVRPX1JBVElPX0VOCQkoMSA8PCAyNykKKyNkZWZpbmUgVkVSVF9GUF9MT09QX1NUUkVUQ0gJCSgweDcgPDwgMjgpCisjZGVmaW5lIFZFUlRfU1RSRVRDSF9SRVNFUlZFRAkJMHhmMTAwMDAwMAorCisvKiBEQUNfQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIERBQ184QklUX0VOCQkJMHgwMDAwMDEwMAorI2RlZmluZSBEQUNfNEJQUF9QSVhfT1JERVIJCTB4MDAwMDAyMDAKKyNkZWZpbmUgREFDX0NSQ19FTgkJCTB4MDAwODAwMDAKKyNkZWZpbmUgREFDX01BU0tfQUxMCQkJKDB4ZmYgPDwgMjQpCisjZGVmaW5lIERBQ19QRFdOCQkJKDEgPDwgMTUpCisjZGVmaW5lIERBQ19FWFBBTkRfTU9ERQkJCSgxIDw8IDE0KQorI2RlZmluZSBEQUNfVkdBX0FEUl9FTgkJCSgxIDw8IDEzKQorI2RlZmluZSBEQUNfUkFOR0VfQ05UTAkJCSgzIDw8ICAwKQorI2RlZmluZSBEQUNfUkFOR0VfQ05UTF9NQVNLCQkweDAzCisjZGVmaW5lIERBQ19CTEFOS0lORwkJCSgxIDw8ICAyKQorI2RlZmluZSBEQUNfQ01QX0VOCQkJKDEgPDwgIDMpCisjZGVmaW5lIERBQ19DTVBfT1VUUFVUCQkJKDEgPDwgIDcpCisKKy8qIERBQ19DTlRMMiBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIERBQzJfRVhQQU5EX01PREUJCSgxIDw8IDE0KQorI2RlZmluZSBEQUMyX0NNUF9FTgkJCSgxIDw8IDcpCisjZGVmaW5lIERBQzJfUEFMRVRURV9BQ0NFU1NfQ05UTAkoMSA8PCA1KQorCisvKiBEQUNfRVhUX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBEQUNfRk9SQ0VfQkxBTktfT0ZGX0VOCQkoMSA8PCA0KQorI2RlZmluZSBEQUNfRk9SQ0VfREFUQV9FTgkJKDEgPDwgNSkKKyNkZWZpbmUgREFDX0ZPUkNFX0RBVEFfU0VMX01BU0sJCSgzIDw8IDYpCisjZGVmaW5lIERBQ19GT1JDRV9EQVRBX01BU0sJCTB4MDAwM2ZmMDAKKyNkZWZpbmUgREFDX0ZPUkNFX0RBVEFfU0hJRlQJCTgKKworLyogR0VOX1JFU0VUX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBTT0ZUX1JFU0VUX0dVSQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgU09GVF9SRVNFVF9WQ0xLCQkJMHgwMDAwMDEwMAorI2RlZmluZSBTT0ZUX1JFU0VUX1BDTEsJCQkweDAwMDAwMjAwCisjZGVmaW5lIFNPRlRfUkVTRVRfRUNQCQkJMHgwMDAwMDQwMAorI2RlZmluZSBTT0ZUX1JFU0VUX0RJU1BFTkdfWENMSwkJMHgwMDAwMDgwMAorCisvKiBNRU1fQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIE1FTV9DVExSX1NUQVRVU19JRExFCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FTV9DVExSX1NUQVRVU19CVVNZCQkweDAwMTAwMDAwCisjZGVmaW5lIE1FTV9TRVFOQ1JfU1RBVFVTX0lETEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVNX1NFUU5DUl9TVEFUVVNfQlVTWQkJMHgwMDIwMDAwMAorI2RlZmluZSBNRU1fQVJCSVRFUl9TVEFUVVNfSURMRQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRU1fQVJCSVRFUl9TVEFUVVNfQlVTWQkJMHgwMDQwMDAwMAorI2RlZmluZSBNRU1fUkVRX1VOTE9DSwkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVNX1JFUV9MT0NLCQkJMHgwMDgwMDAwMAorI2RlZmluZSBNRU1fTlVNX0NIQU5ORUxTX01BU0sJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUVNX1VTRV9CX0NIX09OTFkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUlYxMDBfTUVNX0hBTEZfTU9ERQkJMHgwMDAwMDAwOAorI2RlZmluZSBSMzAwX01FTV9OVU1fQ0hBTk5FTFNfTUFTSwkweDAwMDAwMDAzCisjZGVmaW5lIFIzMDBfTUVNX1VTRV9DRF9DSF9PTkxZCQkweDAwMDAwMDA0CisKKworLyogUkJCTV9TT0ZUX1JFU0VUIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgU09GVF9SRVNFVF9DUAkJCSgxIDw8ICAwKQorI2RlZmluZSBTT0ZUX1JFU0VUX0hJCQkJKDEgPDwgIDEpCisjZGVmaW5lIFNPRlRfUkVTRVRfU0UJCQkoMSA8PCAgMikKKyNkZWZpbmUgU09GVF9SRVNFVF9SRQkJCSgxIDw8ICAzKQorI2RlZmluZSBTT0ZUX1JFU0VUX1BQCQkJKDEgPDwgIDQpCisjZGVmaW5lIFNPRlRfUkVTRVRfRTIJCQkoMSA8PCAgNSkKKyNkZWZpbmUgU09GVF9SRVNFVF9SQgkJCSgxIDw8ICA2KQorI2RlZmluZSBTT0ZUX1JFU0VUX0hEUAkJCSgxIDw8ICA3KQorCisvKiBTVVJGQUNFX0NOVEwgYml0IGNvbnNhbnRzICovCisjZGVmaW5lIFNVUkZfVFJBTlNMQVRJT05fRElTCQkoMSA8PCA4KQorI2RlZmluZSBOT05TVVJGX0FQMF9TV1BfMTZCUFAJCSgxIDw8IDIwKQorI2RlZmluZSBOT05TVVJGX0FQMF9TV1BfMzJCUFAJCSgxIDw8IDIxKQorI2RlZmluZSBOT05TVVJGX0FQMV9TV1BfMTZCUFAJCSgxIDw8IDIyKQorI2RlZmluZSBOT05TVVJGX0FQMV9TV1BfMzJCUFAJCSgxIDw8IDIzKQorCisvKiBERUZBVUxUX1NDX0JPVFRPTV9SSUdIVCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIERFRkFVTFRfU0NfUklHSFRfTUFYCQkoMHgxZmZmIDw8IDApCisjZGVmaW5lIERFRkFVTFRfU0NfQk9UVE9NX01BWAkJKDB4MWZmZiA8PCAxNikKKworLyogTU1fSU5ERVggYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBNTV9BUEVSCQkJCTB4ODAwMDAwMDAKKworLyogQ0xSX0NNUF9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgQ09NUEFSRV9TUkNfRkFMU0UJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ09NUEFSRV9TUkNfVFJVRQkJMHgwMDAwMDAwMQorI2RlZmluZSBDT01QQVJFX1NSQ19OT1RfRVFVQUwJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ09NUEFSRV9TUkNfRVFVQUwJCTB4MDAwMDAwMDUKKyNkZWZpbmUgQ09NUEFSRV9TUkNfRVFVQUxfRkxJUAkJMHgwMDAwMDAwNworI2RlZmluZSBDT01QQVJFX0RTVF9GQUxTRQkJMHgwMDAwMDAwMAorI2RlZmluZSBDT01QQVJFX0RTVF9UUlVFCQkweDAwMDAwMTAwCisjZGVmaW5lIENPTVBBUkVfRFNUX05PVF9FUVVBTAkJMHgwMDAwMDQwMAorI2RlZmluZSBDT01QQVJFX0RTVF9FUVVBTAkJMHgwMDAwMDUwMAorI2RlZmluZSBDT01QQVJFX0RFU1RJTkFUSU9OCQkweDAwMDAwMDAwCisjZGVmaW5lIENPTVBBUkVfU09VUkNFCQkJMHgwMTAwMDAwMAorI2RlZmluZSBDT01QQVJFX1NSQ19BTkRfRFNUCQkweDAyMDAwMDAwCisKKworLyogRFBfQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIERTVF9YX1JJR0hUX1RPX0xFRlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRFNUX1hfTEVGVF9UT19SSUdIVAkJMHgwMDAwMDAwMQorI2RlZmluZSBEU1RfWV9CT1RUT01fVE9fVE9QCQkweDAwMDAwMDAwCisjZGVmaW5lIERTVF9ZX1RPUF9UT19CT1RUT00JCTB4MDAwMDAwMDIKKyNkZWZpbmUgRFNUX1hfTUFKT1IJCQkweDAwMDAwMDAwCisjZGVmaW5lIERTVF9ZX01BSk9SCQkJMHgwMDAwMDAwNAorI2RlZmluZSBEU1RfWF9USUxFCQkJMHgwMDAwMDAwOAorI2RlZmluZSBEU1RfWV9USUxFCQkJMHgwMDAwMDAxMAorI2RlZmluZSBEU1RfTEFTVF9QRUwJCQkweDAwMDAwMDIwCisjZGVmaW5lIERTVF9UUkFJTF9YX1JJR0hUX1RPX0xFRlQJMHgwMDAwMDAwMAorI2RlZmluZSBEU1RfVFJBSUxfWF9MRUZUX1RPX1JJR0hUCTB4MDAwMDAwNDAKKyNkZWZpbmUgRFNUX1RSQVBfRklMTF9SSUdIVF9UT19MRUZUCTB4MDAwMDAwMDAKKyNkZWZpbmUgRFNUX1RSQVBfRklMTF9MRUZUX1RPX1JJR0hUCTB4MDAwMDAwODAKKyNkZWZpbmUgRFNUX0JSRVNfU0lHTgkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgRFNUX0hPU1RfQklHX0VORElBTl9FTgkJMHgwMDAwMDIwMAorI2RlZmluZSBEU1RfUE9MWUxJTkVfTk9OTEFTVAkJMHgwMDAwODAwMAorI2RlZmluZSBEU1RfUkFTVEVSX1NUQUxMCQkweDAwMDEwMDAwCisjZGVmaW5lIERTVF9QT0xZX0VER0UJCQkweDAwMDQwMDAwCisKKworLyogRFBfQ05UTF9ZRElSX1hESVJfWU1BSk9SIGJpdCBjb25zdGFudHMgKHNob3J0IHZlcnNpb24gb2YgRFBfQ05UTCkgKi8KKyNkZWZpbmUgRFNUX1hfTUFKT1JfUwkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRFNUX1lfTUFKT1JfUwkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRFNUX1lfQk9UVE9NX1RPX1RPUF9TCQkweDAwMDAwMDAwCisjZGVmaW5lIERTVF9ZX1RPUF9UT19CT1RUT01fUwkJMHgwMDAwODAwMAorI2RlZmluZSBEU1RfWF9SSUdIVF9UT19MRUZUX1MJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRFNUX1hfTEVGVF9UT19SSUdIVF9TCQkweDgwMDAwMDAwCisKKworLyogRFBfREFUQVRZUEUgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBEU1RfOEJQUAkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRFNUXzE1QlBQCQkJMHgwMDAwMDAwMworI2RlZmluZSBEU1RfMTZCUFAJCQkweDAwMDAwMDA0CisjZGVmaW5lIERTVF8yNEJQUAkJCTB4MDAwMDAwMDUKKyNkZWZpbmUgRFNUXzMyQlBQCQkJMHgwMDAwMDAwNgorI2RlZmluZSBEU1RfOEJQUF9SR0IzMzIJCQkweDAwMDAwMDA3CisjZGVmaW5lIERTVF84QlBQX1k4CQkJMHgwMDAwMDAwOAorI2RlZmluZSBEU1RfOEJQUF9SR0I4CQkJMHgwMDAwMDAwOQorI2RlZmluZSBEU1RfMTZCUFBfVllVWTQyMgkJMHgwMDAwMDAwYgorI2RlZmluZSBEU1RfMTZCUFBfWVZZVTQyMgkJMHgwMDAwMDAwYworI2RlZmluZSBEU1RfMzJCUFBfQVlVVjQ0NAkJMHgwMDAwMDAwZQorI2RlZmluZSBEU1RfMTZCUFBfQVJHQjQ0NDQJCTB4MDAwMDAwMGYKKyNkZWZpbmUgQlJVU0hfU09MSURDT0xPUgkJMHgwMDAwMGQwMAorI2RlZmluZSBTUkNfTU9OTwkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1JDX01PTk9fTEJLR0QJCQkweDAwMDEwMDAwCisjZGVmaW5lIFNSQ19EU1RDT0xPUgkJCTB4MDAwMzAwMDAKKyNkZWZpbmUgQllURV9PUkRFUl9NU0JfVE9fTFNCCQkweDAwMDAwMDAwCisjZGVmaW5lIEJZVEVfT1JERVJfTFNCX1RPX01TQgkJMHg0MDAwMDAwMAorI2RlZmluZSBEUF9DT05WRVJTSU9OX1RFTVAJCTB4ODAwMDAwMDAKKyNkZWZpbmUgSE9TVF9CSUdfRU5ESUFOX0VOCQkoMSA8PCAyOSkKKworCisvKiBEUF9HVUlfTUFTVEVSX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBHTUNfU1JDX1BJVENIX09GRlNFVF9ERUZBVUxUCTB4MDAwMDAwMDAKKyNkZWZpbmUgR01DX1NSQ19QSVRDSF9PRkZTRVRfTEVBVkUJMHgwMDAwMDAwMQorI2RlZmluZSBHTUNfRFNUX1BJVENIX09GRlNFVF9ERUZBVUxUCTB4MDAwMDAwMDAKKyNkZWZpbmUgR01DX0RTVF9QSVRDSF9PRkZTRVRfTEVBVkUJMHgwMDAwMDAwMgorI2RlZmluZSBHTUNfU1JDX0NMSVBfREVGQVVMVAkJMHgwMDAwMDAwMAorI2RlZmluZSBHTUNfU1JDX0NMSVBfTEVBVkUJCTB4MDAwMDAwMDQKKyNkZWZpbmUgR01DX0RTVF9DTElQX0RFRkFVTFQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgR01DX0RTVF9DTElQX0xFQVZFCQkweDAwMDAwMDA4CisjZGVmaW5lIEdNQ19CUlVTSF84eDhNT05PCQkweDAwMDAwMDAwCisjZGVmaW5lIEdNQ19CUlVTSF84eDhNT05PX0xCS0dECQkweDAwMDAwMDEwCisjZGVmaW5lIEdNQ19CUlVTSF84eDFNT05PCQkweDAwMDAwMDIwCisjZGVmaW5lIEdNQ19CUlVTSF84eDFNT05PX0xCS0dECQkweDAwMDAwMDMwCisjZGVmaW5lIEdNQ19CUlVTSF8xeDhNT05PCQkweDAwMDAwMDQwCisjZGVmaW5lIEdNQ19CUlVTSF8xeDhNT05PX0xCS0dECQkweDAwMDAwMDUwCisjZGVmaW5lIEdNQ19CUlVTSF8zMngxTU9OTwkJMHgwMDAwMDA2MAorI2RlZmluZSBHTUNfQlJVU0hfMzJ4MU1PTk9fTEJLR0QJMHgwMDAwMDA3MAorI2RlZmluZSBHTUNfQlJVU0hfMzJ4MzJNT05PCQkweDAwMDAwMDgwCisjZGVmaW5lIEdNQ19CUlVTSF8zMngzMk1PTk9fTEJLR0QJMHgwMDAwMDA5MAorI2RlZmluZSBHTUNfQlJVU0hfOHg4Q09MT1IJCTB4MDAwMDAwYTAKKyNkZWZpbmUgR01DX0JSVVNIXzh4MUNPTE9SCQkweDAwMDAwMGIwCisjZGVmaW5lIEdNQ19CUlVTSF8xeDhDT0xPUgkJMHgwMDAwMDBjMAorI2RlZmluZSBHTUNfQlJVU0hfU09MSURfQ09MT1IJCTB4MDAwMDAwZDAKKyNkZWZpbmUgR01DX0RTVF84QlBQCQkJMHgwMDAwMDIwMAorI2RlZmluZSBHTUNfRFNUXzE1QlBQCQkJMHgwMDAwMDMwMAorI2RlZmluZSBHTUNfRFNUXzE2QlBQCQkJMHgwMDAwMDQwMAorI2RlZmluZSBHTUNfRFNUXzI0QlBQCQkJMHgwMDAwMDUwMAorI2RlZmluZSBHTUNfRFNUXzMyQlBQCQkJMHgwMDAwMDYwMAorI2RlZmluZSBHTUNfRFNUXzhCUFBfUkdCMzMyCQkweDAwMDAwNzAwCisjZGVmaW5lIEdNQ19EU1RfOEJQUF9ZOAkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgR01DX0RTVF84QlBQX1JHQjgJCTB4MDAwMDA5MDAKKyNkZWZpbmUgR01DX0RTVF8xNkJQUF9WWVVZNDIyCQkweDAwMDAwYjAwCisjZGVmaW5lIEdNQ19EU1RfMTZCUFBfWVZZVTQyMgkJMHgwMDAwMGMwMAorI2RlZmluZSBHTUNfRFNUXzMyQlBQX0FZVVY0NDQJCTB4MDAwMDBlMDAKKyNkZWZpbmUgR01DX0RTVF8xNkJQUF9BUkdCNDQ0NAkJMHgwMDAwMGYwMAorI2RlZmluZSBHTUNfU1JDX01PTk8JCQkweDAwMDAwMDAwCisjZGVmaW5lIEdNQ19TUkNfTU9OT19MQktHRAkJMHgwMDAwMTAwMAorI2RlZmluZSBHTUNfU1JDX0RTVENPTE9SCQkweDAwMDAzMDAwCisjZGVmaW5lIEdNQ19CWVRFX09SREVSX01TQl9UT19MU0IJMHgwMDAwMDAwMAorI2RlZmluZSBHTUNfQllURV9PUkRFUl9MU0JfVE9fTVNCCTB4MDAwMDQwMDAKKyNkZWZpbmUgR01DX0RQX0NPTlZFUlNJT05fVEVNUF85MzAwCTB4MDAwMDgwMDAKKyNkZWZpbmUgR01DX0RQX0NPTlZFUlNJT05fVEVNUF82NTAwCTB4MDAwMDAwMDAKKyNkZWZpbmUgR01DX0RQX1NSQ19SRUNUCQkJMHgwMjAwMDAwMAorI2RlZmluZSBHTUNfRFBfU1JDX0hPU1QJCQkweDAzMDAwMDAwCisjZGVmaW5lIEdNQ19EUF9TUkNfSE9TVF9CWVRFQUxJR04JMHgwNDAwMDAwMAorI2RlZmluZSBHTUNfM0RfRkNOX0VOX0NMUgkJMHgwMDAwMDAwMAorI2RlZmluZSBHTUNfM0RfRkNOX0VOX1NFVAkJMHgwODAwMDAwMAorI2RlZmluZSBHTUNfRFNUX0NMUl9DTVBfRkNOX0xFQVZFCTB4MDAwMDAwMDAKKyNkZWZpbmUgR01DX0RTVF9DTFJfQ01QX0ZDTl9DTEVBUgkweDEwMDAwMDAwCisjZGVmaW5lIEdNQ19BVVhfQ0xJUF9MRUFWRQkJMHgwMDAwMDAwMAorI2RlZmluZSBHTUNfQVVYX0NMSVBfQ0xFQVIJCTB4MjAwMDAwMDAKKyNkZWZpbmUgR01DX1dSSVRFX01BU0tfTEVBVkUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgR01DX1dSSVRFX01BU0tfU0VUCQkweDQwMDAwMDAwCisjZGVmaW5lIEdNQ19DTFJfQ01QX0NOVExfRElTCQkoMSA8PCAyOCkKKyNkZWZpbmUgR01DX1NSQ19EQVRBVFlQRV9DT0xPUgkJKDMgPDwgMTIpCisjZGVmaW5lIFJPUDNfUwkJCQkweDAwY2MwMDAwCisjZGVmaW5lIFJPUDNfU1JDQ09QWQkJCTB4MDBjYzAwMDAKKyNkZWZpbmUgUk9QM19QCQkJCTB4MDBmMDAwMDAKKyNkZWZpbmUgUk9QM19QQVRDT1BZCQkJMHgwMGYwMDAwMAorI2RlZmluZSBEUF9TUkNfU09VUkNFX01BU0sJCSg3ICA8PCAyNCkKKyNkZWZpbmUgR01DX0JSVVNIX05PTkUJCQkoMTUgPDwgIDQpCisjZGVmaW5lIERQX1NSQ19TT1VSQ0VfTUVNT1JZCQkoMiAgPDwgMjQpCisjZGVmaW5lIEdNQ19CUlVTSF9TT0xJRENPTE9SCQkweDAwMDAwMGQwCisKKy8qIERQX01JWCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIERQX1NSQ19SRUNUCQkJMHgwMDAwMDIwMAorI2RlZmluZSBEUF9TUkNfSE9TVAkJCTB4MDAwMDAzMDAKKyNkZWZpbmUgRFBfU1JDX0hPU1RfQllURUFMSUdOCQkweDAwMDAwNDAwCisKKy8qIE1QTExfQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIE1QTExfUkVTRVQJCQkweDAwMDAwMDAxCisKKy8qIE1ETExfQ0tPIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgTUNLT0FfU0xFRVAJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1DS09BX1JFU0VUCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNQ0tPQV9SRUZfU0tFV19NQVNLCQkweDAwMDAwNzAwCisjZGVmaW5lIE1DS09BX0ZCX1NLRVdfTUFTSwkJMHgwMDAwNzAwMAorCisvKiBNRExMX1JEQ0tBIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgTVJEQ0tBMF9TTEVFUAkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTVJEQ0tBMF9SRVNFVAkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTVJEQ0tBMV9TTEVFUAkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgTVJEQ0tBMV9SRVNFVAkJCTB4MDAwMjAwMDAKKworLyogVkNMS19FQ1BfQ05UTCBjb25zdGFudHMgKi8KKyNkZWZpbmUgVkNMS19TUkNfU0VMX01BU0sJCTB4MDMKKyNkZWZpbmUgVkNMS19TUkNfU0VMX0NQVUNMSwkJMHgwMAorI2RlZmluZSBWQ0xLX1NSQ19TRUxfUFNDQU5DTEsJCTB4MDEKKyNkZWZpbmUgVkNMS19TUkNfU0VMX0JZVEVDTEsJCTB4MDIKKyNkZWZpbmUgVkNMS19TUkNfU0VMX1BQTExDTEsJCTB4MDMKKyNkZWZpbmUgUElYQ0xLX0FMV0FZU19PTmIJCTB4MDAwMDAwNDAKKyNkZWZpbmUgUElYQ0xLX0RBQ19BTFdBWVNfT05iCQkweDAwMDAwMDgwCisKKy8qIEJVU19DTlRMMSBjb25zdGFudHMgKi8KKyNkZWZpbmUgQlVTX0NOVEwxX01PQklMRV9QTEFURk9STV9TRUxfTUFTSwkweDBjMDAwMDAwCisjZGVmaW5lIEJVU19DTlRMMV9NT0JJTEVfUExBVEZPUk1fU0VMX1NISUZUCTI2CisjZGVmaW5lIEJVU19DTlRMMV9BR1BDTEtfVkFMSUQJCQkweDgwMDAwMDAwCisKKy8qIFBMTF9QV1JNR1RfQ05UTCBjb25zdGFudHMgKi8KKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX1NQTExfVFVSTk9GRgkJMHgwMDAwMDAwMgorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfUFBMTF9UVVJOT0ZGCQkweDAwMDAwMDA0CisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9QMlBMTF9UVVJOT0ZGCQkweDAwMDAwMDA4CisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9UVlBMTF9UVVJOT0ZGCQkweDAwMDAwMDEwCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9NT0JJTEVfU1UJCTB4MDAwMTAwMDAKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX1NVX1NDTEtfVVNFX0JDTEsJMHgwMDAyMDAwMAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfU1VfTUNMS19VU0VfQkNMSwkweDAwMDQwMDAwCisKKy8qIFRWX0RBQ19DTlRMIGNvbnN0YW50cyAqLworI2RlZmluZSBUVl9EQUNfQ05UTF9CR1NMRUVQCQkJMHgwMDAwMDA0MAorI2RlZmluZSBUVl9EQUNfQ05UTF9ERVRFQ1QJCQkweDAwMDAwMDEwCisjZGVmaW5lIFRWX0RBQ19DTlRMX0JHQURKX01BU0sJCQkweDAwMGYwMDAwCisjZGVmaW5lIFRWX0RBQ19DTlRMX0RBQ0FESl9NQVNLCQkJMHgwMGYwMDAwMAorI2RlZmluZSBUVl9EQUNfQ05UTF9CR0FESl9fU0hJRlQJCTE2CisjZGVmaW5lIFRWX0RBQ19DTlRMX0RBQ0FESl9fU0hJRlQJCTIwCisjZGVmaW5lIFRWX0RBQ19DTlRMX1JEQUNQRAkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgVFZfREFDX0NOVExfR0RBQ1BECQkJMHgwMjAwMDAwMAorI2RlZmluZSBUVl9EQUNfQ05UTF9CREFDUEQJCQkweDA0MDAwMDAwCisKKy8qIERJU1BfTUlTQ19DTlRMIGNvbnN0YW50cyAqLworI2RlZmluZSBESVNQX01JU0NfQ05UTF9TT0ZUX1JFU0VUX0dSUEhfUFAJKDEgPDwgMCkKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfU09GVF9SRVNFVF9TVUJQSUNfUFAJKDEgPDwgMSkKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfU09GVF9SRVNFVF9PVjBfUFAJKDEgPDwgMikKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfU09GVF9SRVNFVF9HUlBIX1NDTEsJKDEgPDwgNCkKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfU09GVF9SRVNFVF9TVUJQSUNfU0NMSwkoMSA8PCA1KQorI2RlZmluZSBESVNQX01JU0NfQ05UTF9TT0ZUX1JFU0VUX09WMF9TQ0xLCSgxIDw8IDYpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfR1JQSDJfUFAJKDEgPDwgMTIpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfR1JQSDJfU0NMSwkoMSA8PCAxNSkKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfU09GVF9SRVNFVF9MVkRTCQkoMSA8PCAxNikKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfU09GVF9SRVNFVF9UTURTCQkoMSA8PCAxNykKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfU09GVF9SRVNFVF9ESUdfVE1EUwkoMSA8PCAxOCkKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfU09GVF9SRVNFVF9UVgkJKDEgPDwgMTkpCisKKy8qIERJU1BfUFdSX01BTiBjb25zdGFudHMgKi8KKyNkZWZpbmUgRElTUF9QV1JfTUFOX0RJU1BfUFdSX01BTl9EM19DUlRDX0VOCSgxIDw8IDApCisjZGVmaW5lIERJU1BfUFdSX01BTl9ESVNQMl9QV1JfTUFOX0QzX0NSVEMyX0VOCSgxIDw8IDQpCisjZGVmaW5lIERJU1BfUFdSX01BTl9ESVNQX0QzX1JTVAkJKDEgPDwgMTYpCisjZGVmaW5lIERJU1BfUFdSX01BTl9ESVNQX0QzX1JFR19SU1QJCSgxIDw8IDE3KQorI2RlZmluZSBESVNQX1BXUl9NQU5fRElTUF9EM19HUlBIX1JTVAkJKDEgPDwgMTgpCisjZGVmaW5lIERJU1BfUFdSX01BTl9ESVNQX0QzX1NVQlBJQ19SU1QJCSgxIDw8IDE5KQorI2RlZmluZSBESVNQX1BXUl9NQU5fRElTUF9EM19PVjBfUlNUCQkoMSA8PCAyMCkKKyNkZWZpbmUgRElTUF9QV1JfTUFOX0RJU1BfRDFEMl9HUlBIX1JTVAkJKDEgPDwgMjEpCisjZGVmaW5lIERJU1BfUFdSX01BTl9ESVNQX0QxRDJfU1VCUElDX1JTVAkoMSA8PCAyMikKKyNkZWZpbmUgRElTUF9QV1JfTUFOX0RJU1BfRDFEMl9PVjBfUlNUCQkoMSA8PCAyMykKKyNkZWZpbmUgRElTUF9QV1JfTUFOX0RJR19UTURTX0VOQUJMRV9SU1QJKDEgPDwgMjQpCisjZGVmaW5lIERJU1BfUFdSX01BTl9UVl9FTkFCTEVfUlNUCQkoMSA8PCAyNSkKKyNkZWZpbmUgRElTUF9QV1JfTUFOX0FVVE9fUFdSVVBfRU4JCSgxIDw8IDI2KQorCisvKiBtYXNrcyAqLworCisjZGVmaW5lIENPTkZJR19NRU1TSVpFX01BU0sJCTB4MWYwMDAwMDAKKyNkZWZpbmUgTUVNX0NGR19UWVBFCQkJMHg0MDAwMDAwMAorI2RlZmluZSBEU1RfT0ZGU0VUX01BU0sJCQkweDAwM2ZmZmZmCisjZGVmaW5lIERTVF9QSVRDSF9NQVNLCQkJMHgzZmMwMDAwMAorI2RlZmluZSBERUZBVUxUX1RJTEVfTUFTSwkJMHhjMDAwMDAwMAorI2RlZmluZSBQUExMX0RJVl9TRUxfTUFTSwkJMHgwMDAwMDMwMAorI2RlZmluZSBQUExMX1JFU0VUCQkJMHgwMDAwMDAwMQorI2RlZmluZSBQUExMX1NMRUVQCQkJMHgwMDAwMDAwMgorI2RlZmluZSBQUExMX0FUT01JQ19VUERBVEVfRU4JCTB4MDAwMTAwMDAKKyNkZWZpbmUgUFBMTF9SRUZfRElWX01BU0sJCTB4MDAwMDAzZmYKKyNkZWZpbmUgUFBMTF9GQjNfRElWX01BU0sJCTB4MDAwMDA3ZmYKKyNkZWZpbmUgUFBMTF9QT1NUM19ESVZfTUFTSwkJMHgwMDA3MDAwMAorI2RlZmluZSBQUExMX0FUT01JQ19VUERBVEVfUgkJMHgwMDAwODAwMAorI2RlZmluZSBQUExMX0FUT01JQ19VUERBVEVfVwkJMHgwMDAwODAwMAorI2RlZmluZSBQUExMX1ZHQV9BVE9NSUNfVVBEQVRFX0VOCTB4MDAwMjAwMDAKKyNkZWZpbmUgUjMwMF9QUExMX1JFRl9ESVZfQUNDX01BU0sJKDB4M2ZmIDw8IDE4KQorI2RlZmluZSBSMzAwX1BQTExfUkVGX0RJVl9BQ0NfU0hJRlQJMTgKKworI2RlZmluZSBHVUlfQUNUSVZFCQkJMHg4MDAwMDAwMAorCisKKyNkZWZpbmUgTUNfSU5EX0lOREVYCQkJMHgwMUY4CisjZGVmaW5lIE1DX0lORF9EQVRBCQkJMHgwMUZDCisKKy8qIFBBRF9DVExSX1NUUkVOR1RIICovCisjZGVmaW5lIFBBRF9NQU5VQUxfT1ZFUlJJREUJCTB4ODAwMDAwMDAKKworLyogcGxsQ0xLX1BJTl9DTlRMICovCisjZGVmaW5lIENMS19QSU5fQ05UTF9fT1NDX0VOX01BU0sJCQkweDAwMDAwMDAxTAorI2RlZmluZSBDTEtfUElOX0NOVExfX09TQ19FTgkJCQkweDAwMDAwMDAxTAorI2RlZmluZSBDTEtfUElOX0NOVExfX1hUTF9MT1dfR0FJTl9NQVNLCQkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19YVExfTE9XX0dBSU4JCQkweDAwMDAwMDA0TAorI2RlZmluZSBDTEtfUElOX0NOVExfX0RPTlRfVVNFX1hUQUxJTl9NQVNLCQkweDAwMDAwMDEwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX0RPTlRfVVNFX1hUQUxJTgkJCTB4MDAwMDAwMTBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fU0xPV19DTE9DS19TT1VSQ0VfTUFTSwkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19TTE9XX0NMT0NLX1NPVVJDRQkJCTB4MDAwMDAwMjBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fQ0dfQ0xLX1RPX09VVFBJTl9NQVNLCQkweDAwMDAwODAwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX0NHX0NMS19UT19PVVRQSU4JCQkweDAwMDAwODAwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX0NHX0NPVU5UX1VQX1RPX09VVFBJTl9NQVNLCTB4MDAwMDEwMDBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fQ0dfQ09VTlRfVVBfVE9fT1VUUElOCQkweDAwMDAxMDAwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX0FDQ0VTU19SRUdTX0lOX1NVU1BFTkRfTUFTSwkweDAwMDAyMDAwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX0FDQ0VTU19SRUdTX0lOX1NVU1BFTkQJCTB4MDAwMDIwMDBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fQ0dfU1BBUkVfTUFTSwkJCTB4MDAwMDQwMDBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fQ0dfU1BBUkUJCQkJMHgwMDAwNDAwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19TQ0xLX0RZTl9TVEFSVF9DTlRMX01BU0sJCTB4MDAwMDgwMDBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fU0NMS19EWU5fU1RBUlRfQ05UTAkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19DUF9DTEtfUlVOTklOR19NQVNLCQkweDAwMDEwMDAwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX0NQX0NMS19SVU5OSU5HCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19DR19TUEFSRV9SRF9NQVNLCQkJMHgwMDA2MDAwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19YVEFMSU5fQUxXQVlTX09OYl9NQVNLCQkweDAwMDgwMDAwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX1hUQUxJTl9BTFdBWVNfT05iCQkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19QV1JTRVFfREVMQVlfTUFTSwkJCTB4ZmYwMDAwMDBMCisKKy8qIHBsbENMS19QV1JNR1RfQ05UTCAqLworI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01QTExfUFdSTUdUX09GRl9fU0hJRlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19TUExMX1BXUk1HVF9PRkZfX1NISUZUCQkweDAwMDAwMDAxCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fUFBMTF9QV1JNR1RfT0ZGX19TSElGVAkJMHgwMDAwMDAwMgorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1AyUExMX1BXUk1HVF9PRkZfX1NISUZUCTB4MDAwMDAwMDMKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ0xLX1RVUk5PRkZfX1NISUZUCQkweDAwMDAwMDA0CisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fU0NMS19UVVJOT0ZGX19TSElGVAkJMHgwMDAwMDAwNQorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1BDTEtfVFVSTk9GRl9fU0hJRlQJCTB4MDAwMDAwMDYKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19QMkNMS19UVVJOT0ZGX19TSElGVAkJMHgwMDAwMDAwNworI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DX0NIX01PREVfX1NISUZUCQkweDAwMDAwMDA4CisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fVEVTVF9NT0RFX19TSElGVAkJMHgwMDAwMDAwOQorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0dMT0JBTF9QTUFOX0VOX19TSElGVAkJMHgwMDAwMDAwYQorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0VOR0lORV9EWU5DTEtfTU9ERV9fU0hJRlQJMHgwMDAwMDAwYworI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0FDVElWRV9ISUxPX0xBVF9fU0hJRlQJCTB4MDAwMDAwMGQKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19ESVNQX0RZTl9TVE9QX0xBVF9fU0hJRlQJMHgwMDAwMDAwZgorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DX0JVU1lfX1NISUZUCQkJMHgwMDAwMDAxMAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DX0lOVF9DTlRMX19TSElGVAkJMHgwMDAwMDAxMQorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DX1NXSVRDSF9fU0hJRlQJCTB4MDAwMDAwMTIKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19ETExfUkVBRFlfX1NISUZUCQkweDAwMDAwMDEzCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRElTUF9QTV9fU0hJRlQJCQkweDAwMDAwMDE0CisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRFlOX1NUT1BfTU9ERV9fU0hJRlQJCTB4MDAwMDAwMTUKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19DR19OTzFfREVCVUdfX1NISUZUCQkweDAwMDAwMDE4CisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fVFZQTExfUFdSTUdUX09GRl9fU0hJRlQJMHgwMDAwMDAxZQorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1RWQ0xLX1RVUk5PRkZfX1NISUZUCQkweDAwMDAwMDFmCisKKy8qIHBsbFAyUExMX0NOVEwgKi8KKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfUkVTRVRfTUFTSwkJCTB4MDAwMDAwMDFMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX1JFU0VUCQkJCTB4MDAwMDAwMDFMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX1NMRUVQX01BU0sJCQkweDAwMDAwMDAyTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9TTEVFUAkJCQkweDAwMDAwMDAyTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9UU1RfRU5fTUFTSwkJCTB4MDAwMDAwMDRMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX1RTVF9FTgkJCTB4MDAwMDAwMDRMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX1JFRkNMS19TRUxfTUFTSwkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfUkVGQ0xLX1NFTAkJCTB4MDAwMDAwMTBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX0ZCQ0xLX1NFTF9NQVNLCQkweDAwMDAwMDIwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9GQkNMS19TRUwJCQkweDAwMDAwMDIwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9UQ1BPRkZfTUFTSwkJCTB4MDAwMDAwNDBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX1RDUE9GRgkJCTB4MDAwMDAwNDBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX1RWQ09NQVhfTUFTSwkJCTB4MDAwMDAwODBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX1RWQ09NQVgJCQkweDAwMDAwMDgwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9QQ1BfTUFTSwkJCTB4MDAwMDA3MDBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX1BWR19NQVNLCQkJMHgwMDAwMzgwMEwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfUERDX01BU0sJCQkweDAwMDBjMDAwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9BVE9NSUNfVVBEQVRFX0VOX01BU0sJCTB4MDAwMTAwMDBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX0FUT01JQ19VUERBVEVfRU4JCTB4MDAwMTAwMDBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX0FUT01JQ19VUERBVEVfU1lOQ19NQVNLCTB4MDAwNDAwMDBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX0FUT01JQ19VUERBVEVfU1lOQwkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfRElTQUJMRV9BVVRPX1JFU0VUX01BU0sJMHgwMDA4MDAwMEwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfRElTQUJMRV9BVVRPX1JFU0VUCQkweDAwMDgwMDAwTAorCisvKiBwbGxQSVhDTEtTX0NOVEwgKi8KKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVgyQ0xLX1NSQ19TRUxfX1NISUZUCQkweDAwMDAwMDAwCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYMkNMS19JTlZFUlRfX1NISUZUCQkweDAwMDAwMDA0CisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYMkNMS19TUkNfSU5WRVJUX19TSElGVAkJMHgwMDAwMDAwNQorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWDJDTEtfQUxXQVlTX09OYl9fU0hJRlQJCTB4MDAwMDAwMDYKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVgyQ0xLX0RBQ19BTFdBWVNfT05iX19TSElGVAkweDAwMDAwMDA3CisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYQ0xLX1RWX1NSQ19TRUxfX1NISUZUCQkweDAwMDAwMDA4CisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYQ0xLX0JMRU5EX0FMV0FZU19PTmJfX1NISUZUCTB4MDAwMDAwMGIKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVhDTEtfR1ZfQUxXQVlTX09OYl9fU0hJRlQJMHgwMDAwMDAwYworI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWENMS19ESUdfVE1EU19BTFdBWVNfT05iX19TSElGVAkweDAwMDAwMDBkCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYQ0xLX0xWRFNfQUxXQVlTX09OYl9fU0hJRlQJMHgwMDAwMDAwZQorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWENMS19UTURTX0FMV0FZU19PTmJfX1NISUZUCTB4MDAwMDAwMGYKKworCisvKiBwbGxQSVhDTEtTX0NOVEwgKi8KKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVgyQ0xLX1NSQ19TRUxfTUFTSwkJMHgwMDAwMDAwM0wKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVgyQ0xLX0lOVkVSVAkJCTB4MDAwMDAwMTBMCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYMkNMS19TUkNfSU5WRVJUCQkweDAwMDAwMDIwTAorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWDJDTEtfQUxXQVlTX09OYgkJMHgwMDAwMDA0MEwKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVgyQ0xLX0RBQ19BTFdBWVNfT05iCQkweDAwMDAwMDgwTAorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWENMS19UVl9TUkNfU0VMCQkJMHgwMDAwMDEwMEwKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVhDTEtfQkxFTkRfQUxXQVlTX09OYgkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVhDTEtfR1ZfQUxXQVlTX09OYgkJMHgwMDAwMTAwMEwKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVhDTEtfRElHX1RNRFNfQUxXQVlTX09OYgkweDAwMDAyMDAwTAorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWENMS19MVkRTX0FMV0FZU19PTmIJCTB4MDAwMDQwMDBMCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYQ0xLX1RNRFNfQUxXQVlTX09OYgkJMHgwMDAwODAwMEwKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19ESVNQX1RWT1VUX1BJWENMS19UVl9BTFdBWVNfT05iCSgxIDw8IDkpCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUjMwMF9EVk9DTEtfQUxXQVlTX09OYgkJKDEgPDwgMTApCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUjMwMF9QSVhDTEtfRFZPX0FMV0FZU19PTmIJKDEgPDwgMTMpCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUjMwMF9QSVhDTEtfVFJBTlNfQUxXQVlTX09OYgkoMSA8PCAxNikKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19SMzAwX1BJWENMS19UVk9fQUxXQVlTX09OYgkoMSA8PCAxNykKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19SMzAwX1AyRzJDTEtfQUxXQVlTX09OYgkJKDEgPDwgMTgpCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUjMwMF9QMkcyQ0xLX0RBQ19BTFdBWVNfT05iCSgxIDw8IDE5KQorI2RlZmluZSBQSVhDTEtTX0NOVExfX1IzMDBfRElTUF9EQUNfUElYQ0xLX0RBQzJfQkxBTktfT0ZGICgxIDw8IDIzKQorCisKKy8qIHBsbFAyUExMX0RJVl8wICovCisjZGVmaW5lIFAyUExMX0RJVl8wX19QMlBMTF9GQl9ESVZfTUFTSwkJCTB4MDAwMDA3ZmZMCisjZGVmaW5lIFAyUExMX0RJVl8wX19QMlBMTF9BVE9NSUNfVVBEQVRFX1dfTUFTSwkJMHgwMDAwODAwMEwKKyNkZWZpbmUgUDJQTExfRElWXzBfX1AyUExMX0FUT01JQ19VUERBVEVfVwkJMHgwMDAwODAwMEwKKyNkZWZpbmUgUDJQTExfRElWXzBfX1AyUExMX0FUT01JQ19VUERBVEVfUl9NQVNLCQkweDAwMDA4MDAwTAorI2RlZmluZSBQMlBMTF9ESVZfMF9fUDJQTExfQVRPTUlDX1VQREFURV9SCQkweDAwMDA4MDAwTAorI2RlZmluZSBQMlBMTF9ESVZfMF9fUDJQTExfUE9TVF9ESVZfTUFTSwkJMHgwMDA3MDAwMEwKKworLyogcGxsU0NMS19DTlRMICovCisjZGVmaW5lIFNDTEtfQ05UTF9fU0NMS19TUkNfU0VMX01BU0sJCQkweDAwMDAwMDA3TAorI2RlZmluZSBTQ0xLX0NOVExfX0NQX01BWF9EWU5fU1RPUF9MQVQJCQkweDAwMDAwMDA4TAorI2RlZmluZSBTQ0xLX0NOVExfX0hEUF9NQVhfRFlOX1NUT1BfTEFUCQkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgU0NMS19DTlRMX19UVl9NQVhfRFlOX1NUT1BfTEFUCQkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgU0NMS19DTlRMX19FMl9NQVhfRFlOX1NUT1BfTEFUCQkJMHgwMDAwMDA0MEwKKyNkZWZpbmUgU0NMS19DTlRMX19TRV9NQVhfRFlOX1NUT1BfTEFUCQkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgU0NMS19DTlRMX19JRENUX01BWF9EWU5fU1RPUF9MQVQJCTB4MDAwMDAxMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fVklQX01BWF9EWU5fU1RPUF9MQVQJCQkweDAwMDAwMjAwTAorI2RlZmluZSBTQ0xLX0NOVExfX1JFX01BWF9EWU5fU1RPUF9MQVQJCQkweDAwMDAwNDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX1BCX01BWF9EWU5fU1RPUF9MQVQJCQkweDAwMDAwODAwTAorI2RlZmluZSBTQ0xLX0NOVExfX1RBTV9NQVhfRFlOX1NUT1BfTEFUCQkJMHgwMDAwMTAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19URE1fTUFYX0RZTl9TVE9QX0xBVAkJCTB4MDAwMDIwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fUkJfTUFYX0RZTl9TVE9QX0xBVAkJCTB4MDAwMDQwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRFlOX1NUT1BfTEFUX01BU0sJCQkweDAwMDA3ZmY4CisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfRElTUDIJCQkJMHgwMDAwODAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19GT1JDRV9DUAkJCQkweDAwMDEwMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX0hEUAkJCQkweDAwMDIwMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX0RJU1AxCQkJCTB4MDAwNDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfVE9QCQkJCTB4MDAwODAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfRTIJCQkJMHgwMDEwMDAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19GT1JDRV9TRQkJCQkweDAwMjAwMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX0lEQ1QJCQkJMHgwMDQwMDAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19GT1JDRV9WSVAJCQkJMHgwMDgwMDAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19GT1JDRV9SRQkJCQkweDAxMDAwMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX1BCCQkJCTB4MDIwMDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfVEFNCQkJCTB4MDQwMDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfVERNCQkJCTB4MDgwMDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfUkIJCQkJMHgxMDAwMDAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19GT1JDRV9UVl9TQ0xLCQkJMHgyMDAwMDAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19GT1JDRV9TVUJQSUMJCQkJMHg0MDAwMDAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19GT1JDRV9PVjAJCQkJMHg4MDAwMDAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19SMzAwX0ZPUkNFX1ZBUAkJCSgxPDwyMSkKKyNkZWZpbmUgU0NMS19DTlRMX19SMzAwX0ZPUkNFX1NSCQkJKDE8PDI1KQorI2RlZmluZSBTQ0xLX0NOVExfX1IzMDBfRk9SQ0VfUFgJCQkoMTw8MjYpCisjZGVmaW5lIFNDTEtfQ05UTF9fUjMwMF9GT1JDRV9UWAkJCSgxPDwyNykKKyNkZWZpbmUgU0NMS19DTlRMX19SMzAwX0ZPUkNFX1VTCQkJKDE8PDI4KQorI2RlZmluZSBTQ0xLX0NOVExfX1IzMDBfRk9SQ0VfU1UJCQkoMTw8MzApCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VPTl9NQVNLCQkJCTB4ZmZmZjgwMDBMCisKKy8qIHBsbFNDTEtfQ05UTDIgKi8KKyNkZWZpbmUgU0NMS19DTlRMMl9fUjMwMF9UQ0xfTUFYX0RZTl9TVE9QX0xBVAkJKDE8PDEwKQorI2RlZmluZSBTQ0xLX0NOVEwyX19SMzAwX0dBX01BWF9EWU5fU1RPUF9MQVQJCSgxPDwxMSkKKyNkZWZpbmUgU0NMS19DTlRMMl9fUjMwMF9DQkFfTUFYX0RZTl9TVE9QX0xBVAkJKDE8PDEyKQorI2RlZmluZSBTQ0xLX0NOVEwyX19SMzAwX0ZPUkNFX1RDTAkJCSgxPDwxMykKKyNkZWZpbmUgU0NMS19DTlRMMl9fUjMwMF9GT1JDRV9DQkEJCQkoMTw8MTQpCisjZGVmaW5lIFNDTEtfQ05UTDJfX1IzMDBfRk9SQ0VfR0EJCQkoMTw8MTUpCisKKy8qIFNDTEtfTU9SRV9DTlRMICovCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19ESVNQUkVHU19NQVhfRFlOX1NUT1BfTEFUCTB4MDAwMDAwMDFMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19NQ19HVUlfTUFYX0RZTl9TVE9QX0xBVAkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX01DX0hPU1RfTUFYX0RZTl9TVE9QX0xBVAkweDAwMDAwMDA0TAorI2RlZmluZSBTQ0xLX01PUkVfQ05UTF9fRk9SQ0VfRElTUFJFR1MJCQkweDAwMDAwMTAwTAorI2RlZmluZSBTQ0xLX01PUkVfQ05UTF9fRk9SQ0VfTUNfR1VJCQkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX0ZPUkNFX01DX0hPU1QJCQkweDAwMDAwNDAwTAorI2RlZmluZSBTQ0xLX01PUkVfQ05UTF9fU1RPUF9TQ0xLX0VOCQkJMHgwMDAwMTAwMEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX1NUT1BfU0NMS19BCQkJMHgwMDAwMjAwMEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX1NUT1BfU0NMS19CCQkJMHgwMDAwNDAwMEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX1NUT1BfU0NMS19DCQkJMHgwMDAwODAwMEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX0hBTEZfU1BFRURfU0NMSwkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19JT19DR19WT0xUQUdFX0RST1AJCTB4MDAwMjAwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19UVkZCX1NPRlRfUkVTRVQJCQkweDAwMDQwMDAwTAorI2RlZmluZSBTQ0xLX01PUkVfQ05UTF9fVk9MVEFHRV9EUk9QX1NZTkMJCTB4MDAwODAwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19JRExFX0RFTEFZX0hBTEZfU0NMSwkJMHgwMDQwMDAwMEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX0FHUF9CVVNZX0hBTEZfU0NMSwkJMHgwMDgwMDAwMEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX0NHX1NQQVJFX1JEX0NfTUFTSwkJMHhmZjAwMDAwMEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX0ZPUkNFT04JCQkJMHgwMDAwMDcwMEwKKworLyogTUNMS19DTlRMICovCisjZGVmaW5lIE1DTEtfQ05UTF9fTUNMS0FfU1JDX1NFTF9NQVNLCQkJMHgwMDAwMDAwN0wKKyNkZWZpbmUgTUNMS19DTlRMX19ZQ0xLQV9TUkNfU0VMX01BU0sJCQkweDAwMDAwMDcwTAorI2RlZmluZSBNQ0xLX0NOVExfX01DTEtCX1NSQ19TRUxfTUFTSwkJCTB4MDAwMDA3MDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fWUNMS0JfU1JDX1NFTF9NQVNLCQkJMHgwMDAwNzAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19GT1JDRV9NQ0xLQV9NQVNLCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19GT1JDRV9NQ0xLQQkJCQkweDAwMDEwMDAwTAorI2RlZmluZSBNQ0xLX0NOVExfX0ZPUkNFX01DTEtCX01BU0sJCQkweDAwMDIwMDAwTAorI2RlZmluZSBNQ0xLX0NOVExfX0ZPUkNFX01DTEtCCQkJCTB4MDAwMjAwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fRk9SQ0VfWUNMS0FfTUFTSwkJCTB4MDAwNDAwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fRk9SQ0VfWUNMS0EJCQkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19GT1JDRV9ZQ0xLQl9NQVNLCQkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19GT1JDRV9ZQ0xLQgkJCQkweDAwMDgwMDAwTAorI2RlZmluZSBNQ0xLX0NOVExfX0ZPUkNFX01DX01BU0sJCQkweDAwMTAwMDAwTAorI2RlZmluZSBNQ0xLX0NOVExfX0ZPUkNFX01DCQkJCTB4MDAxMDAwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fRk9SQ0VfQUlDX01BU0sJCQkweDAwMjAwMDAwTAorI2RlZmluZSBNQ0xLX0NOVExfX0ZPUkNFX0FJQwkJCQkweDAwMjAwMDAwTAorI2RlZmluZSBNQ0xLX0NOVExfX01SRENLQTBfU09VVFNFTF9NQVNLCQkJMHgwMzAwMDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19NUkRDS0ExX1NPVVRTRUxfTUFTSwkJCTB4MGMwMDAwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fTVJEQ0tCMF9TT1VUU0VMX01BU0sJCQkweDMwMDAwMDAwTAorI2RlZmluZSBNQ0xLX0NOVExfX01SRENLQjFfU09VVFNFTF9NQVNLCQkJMHhjMDAwMDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19SMzAwX0RJU0FCTEVfTUNfTUNMS0EJCSgxIDw8IDIxKQorI2RlZmluZSBNQ0xLX0NOVExfX1IzMDBfRElTQUJMRV9NQ19NQ0xLQgkJKDEgPDwgMjEpCisKKy8qIE1DTEtfTUlTQyAqLworI2RlZmluZSBNQ0xLX01JU0NfX1NDTEtfU09VUkNFRF9GUk9NX01QTExfU0VMX01BU0sJMHgwMDAwMDAwM0wKKyNkZWZpbmUgTUNMS19NSVNDX19NQ0xLX0ZST01fU1BMTF9ESVZfU0VMX01BU0sJCTB4MDAwMDAwMDRMCisjZGVmaW5lIE1DTEtfTUlTQ19fTUNMS19GUk9NX1NQTExfRElWX1NFTAkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgTUNMS19NSVNDX19FTkFCTEVfU0NMS19GUk9NX01QTExfTUFTSwkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgTUNMS19NSVNDX19FTkFCTEVfU0NMS19GUk9NX01QTEwJCTB4MDAwMDAwMDhMCisjZGVmaW5lIE1DTEtfTUlTQ19fTVBMTF9NT0RFQV9NT0RFQ19IV19TRUxfRU5fTUFTSwkweDAwMDAwMDEwTAorI2RlZmluZSBNQ0xLX01JU0NfX01QTExfTU9ERUFfTU9ERUNfSFdfU0VMX0VOCQkweDAwMDAwMDEwTAorI2RlZmluZSBNQ0xLX01JU0NfX0RMTF9SRUFEWV9MQVRfTUFTSwkJCTB4MDAwMDAxMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fRExMX1JFQURZX0xBVAkJCTB4MDAwMDAxMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fTUNfTUNMS19NQVhfRFlOX1NUT1BfTEFUX01BU0sJMHgwMDAwMTAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19NQ19NQ0xLX01BWF9EWU5fU1RPUF9MQVQJCTB4MDAwMDEwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fSU9fTUNMS19NQVhfRFlOX1NUT1BfTEFUX01BU0sJMHgwMDAwMjAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19JT19NQ0xLX01BWF9EWU5fU1RPUF9MQVQJCTB4MDAwMDIwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fTUNfTUNMS19EWU5fRU5BQkxFX01BU0sJCTB4MDAwMDQwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fTUNfTUNMS19EWU5fRU5BQkxFCQkJMHgwMDAwNDAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19JT19NQ0xLX0RZTl9FTkFCTEVfTUFTSwkJMHgwMDAwODAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19JT19NQ0xLX0RZTl9FTkFCTEUJCQkweDAwMDA4MDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX0NHTV9DTEtfVE9fT1VUUElOX01BU0sJCTB4MDAwMTAwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fQ0dNX0NMS19UT19PVVRQSU4JCQkweDAwMDEwMDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX0NMS19PUl9DT1VOVF9TRUxfTUFTSwkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19DTEtfT1JfQ09VTlRfU0VMCQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19FTl9NQ0xLX1RSSVNUQVRFX0lOX1NVU1BFTkRfTUFTSwkweDAwMDQwMDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX0VOX01DTEtfVFJJU1RBVEVfSU5fU1VTUEVORAkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19DR01fU1BBUkVfUkRfTUFTSwkJCTB4MDAzMDAwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fQ0dNX1NQQVJFX0FfUkRfTUFTSwkJCTB4MDBjMDAwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fVENMS19UT19ZQ0xLQl9FTl9NQVNLCQkweDAxMDAwMDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX1RDTEtfVE9fWUNMS0JfRU4JCQkweDAxMDAwMDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX0NHTV9TUEFSRV9BX01BU0sJCQkweDBlMDAwMDAwTAorCisvKiBWQ0xLX0VDUF9DTlRMICovCisjZGVmaW5lIFZDTEtfRUNQX0NOVExfX1ZDTEtfU1JDX1NFTF9NQVNLCQkweDAwMDAwMDAzTAorI2RlZmluZSBWQ0xLX0VDUF9DTlRMX19WQ0xLX0lOVkVSVAkJCTB4MDAwMDAwMTBMCisjZGVmaW5lIFZDTEtfRUNQX0NOVExfX1BJWENMS19TUkNfSU5WRVJUCQkweDAwMDAwMDIwTAorI2RlZmluZSBWQ0xLX0VDUF9DTlRMX19QSVhDTEtfQUxXQVlTX09OYgkJMHgwMDAwMDA0MEwKKyNkZWZpbmUgVkNMS19FQ1BfQ05UTF9fUElYQ0xLX0RBQ19BTFdBWVNfT05iCQkweDAwMDAwMDgwTAorI2RlZmluZSBWQ0xLX0VDUF9DTlRMX19FQ1BfRElWX01BU0sJCQkweDAwMDAwMzAwTAorI2RlZmluZSBWQ0xLX0VDUF9DTlRMX19FQ1BfRk9SQ0VfT04JCQkweDAwMDQwMDAwTAorI2RlZmluZSBWQ0xLX0VDUF9DTlRMX19TVUJDTEtfRk9SQ0VfT04JCQkweDAwMDgwMDAwTAorI2RlZmluZSBWQ0xLX0VDUF9DTlRMX19SMzAwX0RJU1BfREFDX1BJWENMS19EQUNfQkxBTktfT0ZGICAoMTw8MjMpCisKKy8qIFBMTF9QV1JNR1RfQ05UTCAqLworI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX01QTExfVFVSTk9GRl9NQVNLCQkweDAwMDAwMDAxTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX01QTExfVFVSTk9GRgkJCTB4MDAwMDAwMDFMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fU1BMTF9UVVJOT0ZGX01BU0sJCTB4MDAwMDAwMDJMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fU1BMTF9UVVJOT0ZGCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19QUExMX1RVUk5PRkZfTUFTSwkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19QUExMX1RVUk5PRkYJCQkweDAwMDAwMDA0TAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1AyUExMX1RVUk5PRkZfTUFTSwkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19QMlBMTF9UVVJOT0ZGCQkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19UVlBMTF9UVVJOT0ZGX01BU0sJCTB4MDAwMDAwMTBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fVFZQTExfVFVSTk9GRgkJCTB4MDAwMDAwMTBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fQUdQQ0xLX0RZTl9TVE9QX0xBVF9NQVNLCTB4MDAwMDAxZTBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fQVBNX1BPV0VSX1NUQVRFX01BU0sJCTB4MDAwMDA2MDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fQVBNX1BXUlNUQVRFX1JEX01BU0sJCTB4MDAwMDE4MDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fUE1fTU9ERV9TRUxfTUFTSwkJMHgwMDAwMjAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19QTV9NT0RFX1NFTAkJCTB4MDAwMDIwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fRU5fUFdSU0VRX0RPTkVfQ09ORF9NQVNLCTB4MDAwMDQwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fRU5fUFdSU0VRX0RPTkVfQ09ORAkJMHgwMDAwNDAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19FTl9ESVNQX1BBUktFRF9DT05EX01BU0sJMHgwMDAwODAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19FTl9ESVNQX1BBUktFRF9DT05ECQkweDAwMDA4MDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX01PQklMRV9TVV9NQVNLCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19NT0JJTEVfU1UJCQkweDAwMDEwMDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1NVX1NDTEtfVVNFX0JDTEtfTUFTSwkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19TVV9TQ0xLX1VTRV9CQ0xLCQkweDAwMDIwMDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1NVX01DTEtfVVNFX0JDTEtfTUFTSwkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19TVV9NQ0xLX1VTRV9CQ0xLCQkweDAwMDQwMDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1NVX1NVU1RBSU5fRElTQUJMRV9NQVNLCTB4MDAwODAwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fU1VfU1VTVEFJTl9ESVNBQkxFCQkweDAwMDgwMDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1RDTF9CWVBBU1NfRElTQUJMRV9NQVNLCTB4MDAxMDAwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fVENMX0JZUEFTU19ESVNBQkxFCQkweDAwMTAwMDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1RDTF9DTE9DS19DVElWRV9SRF9NQVNLCTB4MDAyMDAwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fVENMX0NMT0NLX0FDVElWRV9SRAkJMHgwMDIwMDAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19DR19OTzJfREVCVUdfTUFTSwkJMHhmZjAwMDAwMEwKKworLyogQ0xLX1BXUk1HVF9DTlRMICovCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fTVBMTF9QV1JNR1RfT0ZGX01BU0sJCTB4MDAwMDAwMDFMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fTVBMTF9QV1JNR1RfT0ZGCQkweDAwMDAwMDAxTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1NQTExfUFdSTUdUX09GRl9NQVNLCQkweDAwMDAwMDAyTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1NQTExfUFdSTUdUX09GRgkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19QUExMX1BXUk1HVF9PRkZfTUFTSwkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19QUExMX1BXUk1HVF9PRkYJCTB4MDAwMDAwMDRMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fUDJQTExfUFdSTUdUX09GRl9NQVNLCQkweDAwMDAwMDA4TAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1AyUExMX1BXUk1HVF9PRkYJCTB4MDAwMDAwMDhMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fTUNMS19UVVJOT0ZGX01BU0sJCTB4MDAwMDAwMTBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fTUNMS19UVVJOT0ZGCQkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19TQ0xLX1RVUk5PRkZfTUFTSwkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19TQ0xLX1RVUk5PRkYJCQkweDAwMDAwMDIwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1BDTEtfVFVSTk9GRl9NQVNLCQkweDAwMDAwMDQwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1BDTEtfVFVSTk9GRgkJCTB4MDAwMDAwNDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fUDJDTEtfVFVSTk9GRl9NQVNLCQkweDAwMDAwMDgwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1AyQ0xLX1RVUk5PRkYJCQkweDAwMDAwMDgwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DX0NIX01PREVfTUFTSwkJMHgwMDAwMDEwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19DSF9NT0RFCQkJMHgwMDAwMDEwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19URVNUX01PREVfTUFTSwkJCTB4MDAwMDAyMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fVEVTVF9NT0RFCQkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19HTE9CQUxfUE1BTl9FTl9NQVNLCQkweDAwMDAwNDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0dMT0JBTF9QTUFOX0VOCQkJMHgwMDAwMDQwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19FTkdJTkVfRFlOQ0xLX01PREVfTUFTSwkweDAwMDAxMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0VOR0lORV9EWU5DTEtfTU9ERQkJMHgwMDAwMTAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19BQ1RJVkVfSElMT19MQVRfTUFTSwkJMHgwMDAwNjAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19ESVNQX0RZTl9TVE9QX0xBVF9NQVNLCQkweDAwMDA4MDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0RJU1BfRFlOX1NUT1BfTEFUCQkweDAwMDA4MDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DX0JVU1lfTUFTSwkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fTUNfQlVTWQkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fTUNfSU5UX0NOVExfTUFTSwkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19JTlRfQ05UTAkJCTB4MDAwMjAwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fTUNfU1dJVENIX01BU0sJCQkweDAwMDQwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DX1NXSVRDSAkJCTB4MDAwNDAwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRExMX1JFQURZX01BU0sJCQkweDAwMDgwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0RMTF9SRUFEWQkJCTB4MDAwODAwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRElTUF9QTV9NQVNLCQkJMHgwMDEwMDAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19ESVNQX1BNCQkJMHgwMDEwMDAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19EWU5fU1RPUF9NT0RFX01BU0sJCTB4MDBlMDAwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fQ0dfTk8xX0RFQlVHX01BU0sJCTB4M2YwMDAwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fVFZQTExfUFdSTUdUX09GRl9NQVNLCQkweDQwMDAwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1RWUExMX1BXUk1HVF9PRkYJCTB4NDAwMDAwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fVFZDTEtfVFVSTk9GRl9NQVNLCQkweDgwMDAwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1RWQ0xLX1RVUk5PRkYJCQkweDgwMDAwMDAwTAorCisvKiBCVVNfQ05UTDEgKi8KKyNkZWZpbmUgQlVTX0NOVEwxX19QTUlfSU9fRElTQUJMRV9NQVNLCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgQlVTX0NOVEwxX19QTUlfSU9fRElTQUJMRQkJCTB4MDAwMDAwMDFMCisjZGVmaW5lIEJVU19DTlRMMV9fUE1JX01FTV9ESVNBQkxFX01BU0sJCQkweDAwMDAwMDAyTAorI2RlZmluZSBCVVNfQ05UTDFfX1BNSV9NRU1fRElTQUJMRQkJCTB4MDAwMDAwMDJMCisjZGVmaW5lIEJVU19DTlRMMV9fUE1JX0JNX0RJU0FCTEVfTUFTSwkJCTB4MDAwMDAwMDRMCisjZGVmaW5lIEJVU19DTlRMMV9fUE1JX0JNX0RJU0FCTEUJCQkweDAwMDAwMDA0TAorI2RlZmluZSBCVVNfQ05UTDFfX1BNSV9JTlRfRElTQUJMRV9NQVNLCQkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgQlVTX0NOVEwxX19QTUlfSU5UX0RJU0FCTEUJCQkweDAwMDAwMDA4TAorI2RlZmluZSBCVVNfQ05UTDFfX0JVUzJfSU1NRURJQVRFX1BNSV9ESVNBQkxFX01BU0sJMHgwMDAwMDAyMEwKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX0lNTUVESUFURV9QTUlfRElTQUJMRQkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX1ZHQV9SRUdfQ09IRVJFTkNZX0RJU19NQVNLCTB4MDAwMDAxMDBMCisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9WR0FfUkVHX0NPSEVSRU5DWV9ESVMJCTB4MDAwMDAxMDBMCisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9WR0FfTUVNX0NPSEVSRU5DWV9ESVNfTUFTSwkweDAwMDAwMjAwTAorI2RlZmluZSBCVVNfQ05UTDFfX0JVUzJfVkdBX01FTV9DT0hFUkVOQ1lfRElTCQkweDAwMDAwMjAwTAorI2RlZmluZSBCVVNfQ05UTDFfX0JVUzJfSERQX1JFR19DT0hFUkVOQ1lfRElTX01BU0sJMHgwMDAwMDQwMEwKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX0hEUF9SRUdfQ09IRVJFTkNZX0RJUwkJMHgwMDAwMDQwMEwKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX0dVSV9JTklUSUFUT1JfQ09IRVJFTkNZX0RJU19NQVNLIDB4MDAwMDA4MDBMCisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9HVUlfSU5JVElBVE9SX0NPSEVSRU5DWV9ESVMJMHgwMDAwMDgwMEwKKyNkZWZpbmUgQlVTX0NOVEwxX19NT0JJTEVfUExBVEZPUk1fU0VMX01BU0sJCTB4MGMwMDAwMDBMCisjZGVmaW5lIEJVU19DTlRMMV9fU0VORF9TQkFfTEFURU5DWV9NQVNLCQkweDcwMDAwMDAwTAorI2RlZmluZSBCVVNfQ05UTDFfX0FHUENMS19WQUxJRF9NQVNLCQkJMHg4MDAwMDAwMEwKKyNkZWZpbmUgQlVTX0NOVEwxX19BR1BDTEtfVkFMSUQJCQkJMHg4MDAwMDAwMEwKKworLyogQlVTX0NOVEwxICovCisjZGVmaW5lIEJVU19DTlRMMV9fUE1JX0lPX0RJU0FCTEVfX1NISUZUCQkweDAwMDAwMDAwCisjZGVmaW5lIEJVU19DTlRMMV9fUE1JX01FTV9ESVNBQkxFX19TSElGVAkJMHgwMDAwMDAwMQorI2RlZmluZSBCVVNfQ05UTDFfX1BNSV9CTV9ESVNBQkxFX19TSElGVAkJMHgwMDAwMDAwMgorI2RlZmluZSBCVVNfQ05UTDFfX1BNSV9JTlRfRElTQUJMRV9fU0hJRlQJCTB4MDAwMDAwMDMKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX0lNTUVESUFURV9QTUlfRElTQUJMRV9fU0hJRlQJMHgwMDAwMDAwNQorI2RlZmluZSBCVVNfQ05UTDFfX0JVUzJfVkdBX1JFR19DT0hFUkVOQ1lfRElTX19TSElGVAkweDAwMDAwMDA4CisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9WR0FfTUVNX0NPSEVSRU5DWV9ESVNfX1NISUZUCTB4MDAwMDAwMDkKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX0hEUF9SRUdfQ09IRVJFTkNZX0RJU19fU0hJRlQJMHgwMDAwMDAwYQorI2RlZmluZSBCVVNfQ05UTDFfX0JVUzJfR1VJX0lOSVRJQVRPUl9DT0hFUkVOQ1lfRElTX19TSElGVCAweDAwMDAwMDBiCisjZGVmaW5lIEJVU19DTlRMMV9fTU9CSUxFX1BMQVRGT1JNX1NFTF9fU0hJRlQJCTB4MDAwMDAwMWEKKyNkZWZpbmUgQlVTX0NOVEwxX19TRU5EX1NCQV9MQVRFTkNZX19TSElGVAkJMHgwMDAwMDAxYworI2RlZmluZSBCVVNfQ05UTDFfX0FHUENMS19WQUxJRF9fU0hJRlQJCQkweDAwMDAwMDFmCisKKy8qIENSVENfT0ZGU0VUX0NOVEwgKi8KKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19USUxFX0xJTkVfTUFTSwkJMHgwMDAwMDAwZkwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19USUxFX0xJTkVfUklHSFRfTUFTSwkweDAwMDAwMGYwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX1RJTEVfRU5fUklHSFRfTUFTSwkweDAwMDA0MDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX1RJTEVfRU5fUklHSFQJCTB4MDAwMDQwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfVElMRV9FTl9NQVNLCQkweDAwMDA4MDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX1RJTEVfRU4JCQkweDAwMDA4MDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX09GRlNFVF9GTElQX0NOVExfTUFTSwkweDAwMDEwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX09GRlNFVF9GTElQX0NOVEwJCTB4MDAwMTAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfU1RFUkVPX09GRlNFVF9FTl9NQVNLCTB4MDAwMjAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfU1RFUkVPX09GRlNFVF9FTgkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19TVEVSRU9fU1lOQ19FTl9NQVNLCTB4MDAwYzAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfU1RFUkVPX1NZTkNfT1VUX0VOX01BU0sJMHgwMDEwMDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19TVEVSRU9fU1lOQ19PVVRfRU4JMHgwMDEwMDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19TVEVSRU9fU1lOQ19NQVNLCQkweDAwMjAwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX1NURVJFT19TWU5DCQkweDAwMjAwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX0dVSV9UUklHX09GRlNFVF9MRUZUX0VOX01BU0sgMHgxMDAwMDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19HVUlfVFJJR19PRkZTRVRfTEVGVF9FTgkweDEwMDAwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX0dVSV9UUklHX09GRlNFVF9SSUdIVF9FTl9NQVNLIDB4MjAwMDAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfR1VJX1RSSUdfT0ZGU0VUX1JJR0hUX0VOCTB4MjAwMDAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfR1VJX1RSSUdfT0ZGU0VUX01BU0sJMHg0MDAwMDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19HVUlfVFJJR19PRkZTRVQJCTB4NDAwMDAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfT0ZGU0VUX0xPQ0tfTUFTSwkJMHg4MDAwMDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19PRkZTRVRfTE9DSwkJMHg4MDAwMDAwMEwKKworLyogQ1JUQ19HRU5fQ05UTCAqLworI2RlZmluZSBDUlRDX0dFTl9DTlRMX19DUlRDX0RCTF9TQ0FOX0VOX01BU0sJCTB4MDAwMDAwMDFMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfREJMX1NDQU5fRU4JCQkweDAwMDAwMDAxTAorI2RlZmluZSBDUlRDX0dFTl9DTlRMX19DUlRDX0lOVEVSTEFDRV9FTl9NQVNLCQkweDAwMDAwMDAyTAorI2RlZmluZSBDUlRDX0dFTl9DTlRMX19DUlRDX0lOVEVSTEFDRV9FTgkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19DX1NZTkNfRU5fTUFTSwkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19DX1NZTkNfRU4JCQkweDAwMDAwMDEwTAorI2RlZmluZSBDUlRDX0dFTl9DTlRMX19DUlRDX1BJWF9XSURUSF9NQVNLCQkweDAwMDAwZjAwTAorI2RlZmluZSBDUlRDX0dFTl9DTlRMX19DUlRDX0lDT05fRU5fTUFTSwkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19JQ09OX0VOCQkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19DVVJfRU5fTUFTSwkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfQ1VSX0VOCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19WU1RBVF9NT0RFX01BU0sJCTB4MDAwNjAwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfQ1VSX01PREVfTUFTSwkJMHgwMDcwMDAwMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19FWFRfRElTUF9FTl9NQVNLCQkweDAxMDAwMDAwTAorI2RlZmluZSBDUlRDX0dFTl9DTlRMX19DUlRDX0VYVF9ESVNQX0VOCQkJMHgwMTAwMDAwMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19FTl9NQVNLCQkJMHgwMjAwMDAwMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19FTgkJCQkweDAyMDAwMDAwTAorI2RlZmluZSBDUlRDX0dFTl9DTlRMX19DUlRDX0RJU1BfUkVRX0VOX0JfTUFTSwkJMHgwNDAwMDAwMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19ESVNQX1JFUV9FTl9CCQkweDA0MDAwMDAwTAorCisvKiBDUlRDMl9HRU5fQ05UTCAqLworI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfREJMX1NDQU5fRU5fTUFTSwkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0RCTF9TQ0FOX0VOCQkweDAwMDAwMDAxTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfSU5URVJMQUNFX0VOX01BU0sJCTB4MDAwMDAwMDJMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9JTlRFUkxBQ0VfRU4JCTB4MDAwMDAwMDJMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9TWU5DX1RSSVNUQVRFX01BU0sJMHgwMDAwMDAxMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX1NZTkNfVFJJU1RBVEUJCTB4MDAwMDAwMTBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9IU1lOQ19UUklTVEFURV9NQVNLCTB4MDAwMDAwMjBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9IU1lOQ19UUklTVEFURQkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX1ZTWU5DX1RSSVNUQVRFX01BU0sJMHgwMDAwMDA0MEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX1ZTWU5DX1RSSVNUQVRFCQkweDAwMDAwMDQwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUMl9PTl9NQVNLCQkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVDJfT04JCQkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX1BJWF9XSURUSF9NQVNLCQkweDAwMDAwZjAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfSUNPTl9FTl9NQVNLCQkweDAwMDA4MDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfSUNPTl9FTgkJCTB4MDAwMDgwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9DVVJfRU5fTUFTSwkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0NVUl9FTgkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9DVVJfTU9ERV9NQVNLCQkweDAwNzAwMDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfRElTUExBWV9ESVNfTUFTSwkJMHgwMDgwMDAwMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0RJU1BMQVlfRElTCQkweDAwODAwMDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfRU5fTUFTSwkJCTB4MDIwMDAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9FTgkJCTB4MDIwMDAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9ESVNQX1JFUV9FTl9CX01BU0sJMHgwNDAwMDAwMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0RJU1BfUkVRX0VOX0IJCTB4MDQwMDAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9DX1NZTkNfRU5fTUFTSwkJMHgwODAwMDAwMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0NfU1lOQ19FTgkJCTB4MDgwMDAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9IU1lOQ19ESVNfTUFTSwkJMHgxMDAwMDAwMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0hTWU5DX0RJUwkJCTB4MTAwMDAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9WU1lOQ19ESVNfTUFTSwkJMHgyMDAwMDAwMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX1ZTWU5DX0RJUwkJCTB4MjAwMDAwMDBMCisKKy8qIEFHUF9DTlRMICovCisjZGVmaW5lIEFHUF9DTlRMX19NQVhfSURMRV9DTEtfTUFTSwkJCTB4MDAwMDAwZmZMCisjZGVmaW5lIEFHUF9DTlRMX19IT0xEX1JEX0ZJRk9fTUFTSwkJCTB4MDAwMDAxMDBMCisjZGVmaW5lIEFHUF9DTlRMX19IT0xEX1JEX0ZJRk8JCQkJMHgwMDAwMDEwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0hPTERfUlFfRklGT19NQVNLCQkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0hPTERfUlFfRklGTwkJCQkweDAwMDAwMjAwTAorI2RlZmluZSBBR1BfQ05UTF9fRU5fMlhfU1RCQl9NQVNLCQkJMHgwMDAwMDQwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0VOXzJYX1NUQkIJCQkJMHgwMDAwMDQwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0ZPUkNFX0ZVTExfU0JBX01BU0sJCQkweDAwMDAwODAwTAorI2RlZmluZSBBR1BfQ05UTF9fRk9SQ0VfRlVMTF9TQkEJCQkweDAwMDAwODAwTAorI2RlZmluZSBBR1BfQ05UTF9fU0JBX0RJU19NQVNLCQkJCTB4MDAwMDEwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19TQkFfRElTCQkJCTB4MDAwMDEwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19BR1BfUkVWX0lEX01BU0sJCQkweDAwMDAyMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fQUdQX1JFVl9JRAkJCQkweDAwMDAyMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fUkVHX0NSSVBQTEVfQUdQNFhfTUFTSwkJMHgwMDAwNDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX1JFR19DUklQUExFX0FHUDRYCQkJMHgwMDAwNDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX1JFR19DUklQUExFX0FHUDJYNFhfTUFTSwkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX1JFR19DUklQUExFX0FHUDJYNFgJCQkweDAwMDA4MDAwTAorI2RlZmluZSBBR1BfQ05UTF9fRk9SQ0VfSU5UX1ZSRUZfTUFTSwkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19GT1JDRV9JTlRfVlJFRgkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19QRU5ESU5HX1NMT1RTX1ZBTF9NQVNLCQkweDAwMDYwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fUEVORElOR19TTE9UU19TRUxfTUFTSwkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX1BFTkRJTkdfU0xPVFNfU0VMCQkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0VOX0VYVEVOREVEX0FEX1NUQl8yWF9NQVNLCQkweDAwMTAwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fRU5fRVhURU5ERURfQURfU1RCXzJYCQkJMHgwMDEwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0RJU19RVUVVRURfR05UX0ZJWF9NQVNLCQkweDAwMjAwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fRElTX1FVRVVFRF9HTlRfRklYCQkJMHgwMDIwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0VOX1JEQVRBMlg0WF9NVUxUSVJFU0VUX01BU0sJCTB4MDA0MDAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19FTl9SREFUQTJYNFhfTVVMVElSRVNFVAkJMHgwMDQwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0VOX1JCRkNBTE1fTUFTSwkJCTB4MDA4MDAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19FTl9SQkZDQUxNCQkJCTB4MDA4MDAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19GT1JDRV9FWFRfVlJFRl9NQVNLCQkJMHgwMTAwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0ZPUkNFX0VYVF9WUkVGCQkJMHgwMTAwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0RJU19SQkZfTUFTSwkJCQkweDAyMDAwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fRElTX1JCRgkJCQkweDAyMDAwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fREVMQVlfRklSU1RfU0JBX0VOX01BU0sJCTB4MDQwMDAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19ERUxBWV9GSVJTVF9TQkFfRU4JCQkweDA0MDAwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fREVMQVlfRklSU1RfU0JBX1ZBTF9NQVNLCQkweDM4MDAwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fQUdQX01JU0NfTUFTSwkJCQkweGMwMDAwMDAwTAorCisvKiBBR1BfQ05UTCAqLworI2RlZmluZSBBR1BfQ05UTF9fTUFYX0lETEVfQ0xLX19TSElGVAkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQUdQX0NOVExfX0hPTERfUkRfRklGT19fU0hJRlQJCQkweDAwMDAwMDA4CisjZGVmaW5lIEFHUF9DTlRMX19IT0xEX1JRX0ZJRk9fX1NISUZUCQkJMHgwMDAwMDAwOQorI2RlZmluZSBBR1BfQ05UTF9fRU5fMlhfU1RCQl9fU0hJRlQJCQkweDAwMDAwMDBhCisjZGVmaW5lIEFHUF9DTlRMX19GT1JDRV9GVUxMX1NCQV9fU0hJRlQJCQkweDAwMDAwMDBiCisjZGVmaW5lIEFHUF9DTlRMX19TQkFfRElTX19TSElGVAkJCTB4MDAwMDAwMGMKKyNkZWZpbmUgQUdQX0NOVExfX0FHUF9SRVZfSURfX1NISUZUCQkJMHgwMDAwMDAwZAorI2RlZmluZSBBR1BfQ05UTF9fUkVHX0NSSVBQTEVfQUdQNFhfX1NISUZUCQkweDAwMDAwMDBlCisjZGVmaW5lIEFHUF9DTlRMX19SRUdfQ1JJUFBMRV9BR1AyWDRYX19TSElGVAkJMHgwMDAwMDAwZgorI2RlZmluZSBBR1BfQ05UTF9fRk9SQ0VfSU5UX1ZSRUZfX1NISUZUCQkJMHgwMDAwMDAxMAorI2RlZmluZSBBR1BfQ05UTF9fUEVORElOR19TTE9UU19WQUxfX1NISUZUCQkweDAwMDAwMDExCisjZGVmaW5lIEFHUF9DTlRMX19QRU5ESU5HX1NMT1RTX1NFTF9fU0hJRlQJCTB4MDAwMDAwMTMKKyNkZWZpbmUgQUdQX0NOVExfX0VOX0VYVEVOREVEX0FEX1NUQl8yWF9fU0hJRlQJCTB4MDAwMDAwMTQKKyNkZWZpbmUgQUdQX0NOVExfX0RJU19RVUVVRURfR05UX0ZJWF9fU0hJRlQJCTB4MDAwMDAwMTUKKyNkZWZpbmUgQUdQX0NOVExfX0VOX1JEQVRBMlg0WF9NVUxUSVJFU0VUX19TSElGVAkweDAwMDAwMDE2CisjZGVmaW5lIEFHUF9DTlRMX19FTl9SQkZDQUxNX19TSElGVAkJCTB4MDAwMDAwMTcKKyNkZWZpbmUgQUdQX0NOVExfX0ZPUkNFX0VYVF9WUkVGX19TSElGVAkJCTB4MDAwMDAwMTgKKyNkZWZpbmUgQUdQX0NOVExfX0RJU19SQkZfX1NISUZUCQkJMHgwMDAwMDAxOQorI2RlZmluZSBBR1BfQ05UTF9fREVMQVlfRklSU1RfU0JBX0VOX19TSElGVAkJMHgwMDAwMDAxYQorI2RlZmluZSBBR1BfQ05UTF9fREVMQVlfRklSU1RfU0JBX1ZBTF9fU0hJRlQJCTB4MDAwMDAwMWIKKyNkZWZpbmUgQUdQX0NOVExfX0FHUF9NSVNDX19TSElGVAkJCTB4MDAwMDAwMWUKKworLyogRElTUF9NSVNDX0NOVEwgKi8KKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfR1JQSF9QUF9NQVNLCQkweDAwMDAwMDAxTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9HUlBIX1BQCQkweDAwMDAwMDAxTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9TVUJQSUNfUFBfTUFTSwkweDAwMDAwMDAyTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9TVUJQSUNfUFAJCTB4MDAwMDAwMDJMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX09WMF9QUF9NQVNLCQkweDAwMDAwMDA0TAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9PVjBfUFAJCTB4MDAwMDAwMDRMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX0dSUEhfU0NMS19NQVNLCTB4MDAwMDAwMTBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX0dSUEhfU0NMSwkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfU1VCUElDX1NDTEtfTUFTSwkweDAwMDAwMDIwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9TVUJQSUNfU0NMSwkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfT1YwX1NDTEtfTUFTSwkweDAwMDAwMDQwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9PVjBfU0NMSwkJMHgwMDAwMDA0MEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NZTkNfU1RSRU5HVEhfTUFTSwkJMHgwMDAwMDMwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NZTkNfUEFEX0ZMT1BfRU5fTUFTSwkJMHgwMDAwMDQwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NZTkNfUEFEX0ZMT1BfRU4JCTB4MDAwMDA0MDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX0dSUEgyX1BQX01BU0sJMHgwMDAwMTAwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfR1JQSDJfUFAJCTB4MDAwMDEwMDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX0dSUEgyX1NDTEtfTUFTSwkweDAwMDA4MDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9HUlBIMl9TQ0xLCQkweDAwMDA4MDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9MVkRTX01BU0sJCTB4MDAwMTAwMDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX0xWRFMJCQkweDAwMDEwMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9UTURTX01BU0sJCTB4MDAwMjAwMDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX1RNRFMJCQkweDAwMDIwMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9ESUdfVE1EU19NQVNLCTB4MDAwNDAwMDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX0RJR19UTURTCQkweDAwMDQwMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9UVl9NQVNLCQkweDAwMDgwMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9UVgkJCTB4MDAwODAwMDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19QQUxFVFRFMl9NRU1fUkRfTUFSR0lOX01BU0sJMHgwMGYwMDAwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1BBTEVUVEVfTUVNX1JEX01BUkdJTl9NQVNLCTB4MGYwMDAwMDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19STVhfQlVGX01FTV9SRF9NQVJHSU5fTUFTSwkweGYwMDAwMDAwTAorCisvKiBESVNQX1BXUl9NQU4gKi8KKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX1BXUl9NQU5fRDNfQ1JUQ19FTl9NQVNLCTB4MDAwMDAwMDFMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9QV1JfTUFOX0QzX0NSVENfRU4JCTB4MDAwMDAwMDFMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUDJfUFdSX01BTl9EM19DUlRDMl9FTl9NQVNLCTB4MDAwMDAwMTBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUDJfUFdSX01BTl9EM19DUlRDMl9FTgkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX1BXUl9NQU5fRFBNU19NQVNLCQkweDAwMDAwMzAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1BfRDNfUlNUX01BU0sJCQkweDAwMDEwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1BfRDNfUlNUCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QzX1JFR19SU1RfTUFTSwkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QzX1JFR19SU1QJCQkweDAwMDIwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1BfRDNfR1JQSF9SU1RfTUFTSwkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QzX0dSUEhfUlNUCQkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QzX1NVQlBJQ19SU1RfTUFTSwkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QzX1NVQlBJQ19SU1QJCTB4MDAwODAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EM19PVjBfUlNUX01BU0sJCTB4MDAxMDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EM19PVjBfUlNUCQkJMHgwMDEwMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QxRDJfR1JQSF9SU1RfTUFTSwkJMHgwMDIwMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QxRDJfR1JQSF9SU1QJCTB4MDAyMDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EMUQyX1NVQlBJQ19SU1RfTUFTSwkJMHgwMDQwMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QxRDJfU1VCUElDX1JTVAkJMHgwMDQwMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QxRDJfT1YwX1JTVF9NQVNLCQkweDAwODAwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1BfRDFEMl9PVjBfUlNUCQkJMHgwMDgwMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESUdfVE1EU19FTkFCTEVfUlNUX01BU0sJCTB4MDEwMDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElHX1RNRFNfRU5BQkxFX1JTVAkJMHgwMTAwMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19UVl9FTkFCTEVfUlNUX01BU0sJCTB4MDIwMDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fVFZfRU5BQkxFX1JTVAkJCTB4MDIwMDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fQVVUT19QV1JVUF9FTl9NQVNLCQkweDA0MDAwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0FVVE9fUFdSVVBfRU4JCQkweDA0MDAwMDAwTAorCisvKiBNQ19JTkRfSU5ERVggKi8KKyNkZWZpbmUgTUNfSU5EX0lOREVYX19NQ19JTkRfQUREUl9NQVNLCQkJMHgwMDAwMDAxZkwKKyNkZWZpbmUgTUNfSU5EX0lOREVYX19NQ19JTkRfV1JfRU5fTUFTSwkJCTB4MDAwMDAxMDBMCisjZGVmaW5lIE1DX0lORF9JTkRFWF9fTUNfSU5EX1dSX0VOCQkJMHgwMDAwMDEwMEwKKworLyogTUNfSU5EX0RBVEEgKi8KKyNkZWZpbmUgTUNfSU5EX0RBVEFfX01DX0lORF9EQVRBX01BU0sJCQkweGZmZmZmZmZmTAorCisvKiBNQ19DSFBfSU9fQ05UTF9BMSAqLworI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdOX0NLQV9fU0hJRlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXTl9BQV9fU0hJRlQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXTl9EUU1BX19TSElGVAkweDAwMDAwMDAyCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV05fRFFTQV9fU0hJRlQJMHgwMDAwMDAwMworI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdQX0NLQV9fU0hJRlQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXUF9BQV9fU0hJRlQJCTB4MDAwMDAwMDUKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXUF9EUU1BX19TSElGVAkweDAwMDAwMDA2CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV1BfRFFTQV9fU0hJRlQJMHgwMDAwMDAwNworI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1BSRUFNUF9BQV9fU0hJRlQJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9QUkVBTVBfRFFNQV9fU0hJRlQJMHgwMDAwMDAwOQorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1BSRUFNUF9EUVNBX19TSElGVAkweDAwMDAwMDBhCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fSU9fTU9ERUFfX1NISUZUCQkweDAwMDAwMDBjCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUkVDX0NLQV9fU0hJRlQJCTB4MDAwMDAwMGUKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9SRUNfQUFfX1NISUZUCQkweDAwMDAwMDEwCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUkVDX0RRTUFfX1NISUZUCQkweDAwMDAwMDEyCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUkVDX0RRU0FfX1NISUZUCQkweDAwMDAwMDE0CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU1lOQ19QSEFTRUFfX1NISUZUCTB4MDAwMDAwMTYKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TWU5DX0NFTlRFUkFfX1NISUZUCTB4MDAwMDAwMTcKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TWU5DX0VOQV9fU0hJRlQJCTB4MDAwMDAwMTgKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9DTEtfU0VMQV9fU0hJRlQJCTB4MDAwMDAwMWEKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9DTEtfSU5WQV9fU0hJRlQJCTB4MDAwMDAwMWMKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9EQVRBX0VOSU1QX0FfX1NISUZUCTB4MDAwMDAwMWUKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9DTlRMX0VOSU1QX0FfX1NISUZUCTB4MDAwMDAwMWYKKworLyogTUNfQ0hQX0lPX0NOVExfQjEgKi8KKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXTl9DS0JfX1NISUZUCQkweDAwMDAwMDAwCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV05fQUJfX1NISUZUCQkweDAwMDAwMDAxCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV05fRFFNQl9fU0hJRlQJMHgwMDAwMDAwMgorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdOX0RRU0JfX1NISUZUCTB4MDAwMDAwMDMKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXUF9DS0JfX1NISUZUCQkweDAwMDAwMDA0CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV1BfQUJfX1NISUZUCQkweDAwMDAwMDA1CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV1BfRFFNQl9fU0hJRlQJMHgwMDAwMDAwNgorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdQX0RRU0JfX1NISUZUCTB4MDAwMDAwMDcKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9QUkVBTVBfQUJfX1NISUZUCQkweDAwMDAwMDA4CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fUFJFQU1QX0RRTUJfX1NISUZUCTB4MDAwMDAwMDkKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9QUkVBTVBfRFFTQl9fU0hJRlQJMHgwMDAwMDAwYQorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0lPX01PREVCX19TSElGVAkJMHgwMDAwMDAwYworI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1JFQ19DS0JfX1NISUZUCQkweDAwMDAwMDBlCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fUkVDX0FCX19TSElGVAkJMHgwMDAwMDAxMAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1JFQ19EUU1CX19TSElGVAkJMHgwMDAwMDAxMgorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1JFQ19EUVNCX19TSElGVAkJMHgwMDAwMDAxNAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NZTkNfUEhBU0VCX19TSElGVAkweDAwMDAwMDE2CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU1lOQ19DRU5URVJCX19TSElGVAkweDAwMDAwMDE3CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU1lOQ19FTkJfX1NISUZUCQkweDAwMDAwMDE4CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fQ0xLX1NFTEJfX1NISUZUCQkweDAwMDAwMDFhCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fQ0xLX0lOVkJfX1NISUZUCQkweDAwMDAwMDFjCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fREFUQV9FTklNUF9CX19TSElGVAkweDAwMDAwMDFlCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fQ05UTF9FTklNUF9CX19TSElGVAkweDAwMDAwMDFmCisKKy8qIE1DX0NIUF9JT19DTlRMX0ExICovCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV05fQ0tBX01BU0sJCTB4MDAwMDAwMDFMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV05fQ0tBCQkweDAwMDAwMDAxTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdOX0FBX01BU0sJCTB4MDAwMDAwMDJMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV05fQUEJCQkweDAwMDAwMDAyTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdOX0RRTUFfTUFTSwkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXTl9EUU1BCQkweDAwMDAwMDA0TAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdOX0RRU0FfTUFTSwkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXTl9EUVNBCQkweDAwMDAwMDA4TAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdQX0NLQV9NQVNLCQkweDAwMDAwMDEwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdQX0NLQQkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXUF9BQV9NQVNLCQkweDAwMDAwMDIwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdQX0FBCQkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXUF9EUU1BX01BU0sJCTB4MDAwMDAwNDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV1BfRFFNQQkJMHgwMDAwMDA0MEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXUF9EUVNBX01BU0sJCTB4MDAwMDAwODBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV1BfRFFTQQkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9QUkVBTVBfQUFfTUFTSwkJMHgwMDAwMDEwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9QUkVBTVBfQUEJCTB4MDAwMDAxMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUFJFQU1QX0RRTUFfTUFTSwkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9QUkVBTVBfRFFNQQkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9QUkVBTVBfRFFTQV9NQVNLCQkweDAwMDAwNDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1BSRUFNUF9EUVNBCQkweDAwMDAwNDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX0lPX01PREVBX01BU0sJCTB4MDAwMDMwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUkVDX0NLQV9NQVNLCQkweDAwMDBjMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1JFQ19BQV9NQVNLCQkweDAwMDMwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1JFQ19EUU1BX01BU0sJCTB4MDAwYzAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUkVDX0RRU0FfTUFTSwkJMHgwMDMwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TWU5DX1BIQVNFQV9NQVNLCQkweDAwNDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NZTkNfUEhBU0VBCQkweDAwNDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NZTkNfQ0VOVEVSQV9NQVNLCTB4MDA4MDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU1lOQ19DRU5URVJBCQkweDAwODAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NZTkNfRU5BX01BU0sJCTB4MDMwMDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fQ0xLX1NFTEFfTUFTSwkJMHgwYzAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9DTEtfSU5WQV9NQVNLCQkweDEwMDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX0NMS19JTlZBCQkJMHgxMDAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9EQVRBX0VOSU1QX0FfTUFTSwkweDQwMDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX0RBVEFfRU5JTVBfQQkJMHg0MDAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9DTlRMX0VOSU1QX0FfTUFTSwkweDgwMDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX0NOVExfRU5JTVBfQQkJMHg4MDAwMDAwMEwKKworLyogTUNfQ0hQX0lPX0NOVExfQjEgKi8KKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXTl9DS0JfTUFTSwkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXTl9DS0IJCTB4MDAwMDAwMDFMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV05fQUJfTUFTSwkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXTl9BQgkJCTB4MDAwMDAwMDJMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV05fRFFNQl9NQVNLCQkweDAwMDAwMDA0TAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdOX0RRTUIJCTB4MDAwMDAwMDRMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV05fRFFTQl9NQVNLCQkweDAwMDAwMDA4TAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdOX0RRU0IJCTB4MDAwMDAwMDhMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV1BfQ0tCX01BU0sJCTB4MDAwMDAwMTBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV1BfQ0tCCQkweDAwMDAwMDEwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdQX0FCX01BU0sJCTB4MDAwMDAwMjBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV1BfQUIJCQkweDAwMDAwMDIwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdQX0RRTUJfTUFTSwkJMHgwMDAwMDA0MEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXUF9EUU1CCQkweDAwMDAwMDQwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdQX0RRU0JfTUFTSwkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXUF9EUVNCCQkweDAwMDAwMDgwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1BSRUFNUF9BQl9NQVNLCQkweDAwMDAwMTAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1BSRUFNUF9BQgkJMHgwMDAwMDEwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9QUkVBTVBfRFFNQl9NQVNLCQkweDAwMDAwMjAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1BSRUFNUF9EUU1CCQkweDAwMDAwMjAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1BSRUFNUF9EUVNCX01BU0sJCTB4MDAwMDA0MDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fUFJFQU1QX0RRU0IJCTB4MDAwMDA0MDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fSU9fTU9ERUJfTUFTSwkJMHgwMDAwMzAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9SRUNfQ0tCX01BU0sJCTB4MDAwMGMwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fUkVDX0FCX01BU0sJCTB4MDAwMzAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fUkVDX0RRTUJfTUFTSwkJMHgwMDBjMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9SRUNfRFFTQl9NQVNLCQkweDAwMzAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NZTkNfUEhBU0VCX01BU0sJCTB4MDA0MDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU1lOQ19QSEFTRUIJCTB4MDA0MDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU1lOQ19DRU5URVJCX01BU0sJMHgwMDgwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TWU5DX0NFTlRFUkIJCTB4MDA4MDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU1lOQ19FTkJfTUFTSwkJMHgwMzAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9DTEtfU0VMQl9NQVNLCQkweDBjMDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0NMS19JTlZCX01BU0sJCTB4MTAwMDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fQ0xLX0lOVkIJCQkweDEwMDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0RBVEFfRU5JTVBfQl9NQVNLCTB4NDAwMDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fREFUQV9FTklNUF9CCQkweDQwMDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0NOVExfRU5JTVBfQl9NQVNLCTB4ODAwMDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fQ05UTF9FTklNUF9CCQkweDgwMDAwMDAwTAorCisvKiBNRU1fU0RSQU1fTU9ERV9SRUcgKi8KKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fTU9ERV9SRUdfTUFTSwkJMHgwMDAwN2ZmZkwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fV1JfTEFURU5DWV9NQVNLCQkweDAwMGYwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9DQVNfTEFURU5DWV9NQVNLCTB4MDA3MDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0NNRF9MQVRFTkNZX01BU0sJMHgwMDgwMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fQ01EX0xBVEVOQ1kJCTB4MDA4MDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX1NUUl9MQVRFTkNZX01BU0sJMHgwMTAwMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fU1RSX0xBVEVOQ1kJCTB4MDEwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0ZBTExfT1VUX0NNRF9NQVNLCTB4MDIwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0ZBTExfT1VUX0NNRAkJMHgwMjAwMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fRkFMTF9PVVRfREFUQV9NQVNLCTB4MDQwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0ZBTExfT1VUX0RBVEEJCTB4MDQwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0ZBTExfT1VUX1NUUl9NQVNLCTB4MDgwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0ZBTExfT1VUX1NUUgkJMHgwODAwMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NQ19JTklUX0NPTVBMRVRFX01BU0sJMHgxMDAwMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NQ19JTklUX0NPTVBMRVRFCQkweDEwMDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9ERFJfRExMX01BU0sJCTB4MjAwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0REUl9ETEwJCQkweDIwMDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9DRkdfVFlQRV9NQVNLCQkweDQwMDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9DRkdfVFlQRQkJMHg0MDAwMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fU0RSQU1fUkVTRVRfTUFTSwkweDgwMDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9TRFJBTV9SRVNFVAkJMHg4MDAwMDAwMEwKKworLyogTUVNX1NEUkFNX01PREVfUkVHICovCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX01PREVfUkVHX19TSElGVAkJMHgwMDAwMDAwMAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9XUl9MQVRFTkNZX19TSElGVAkweDAwMDAwMDEwCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0NBU19MQVRFTkNZX19TSElGVAkweDAwMDAwMDE0CisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0NNRF9MQVRFTkNZX19TSElGVAkweDAwMDAwMDE3CisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX1NUUl9MQVRFTkNZX19TSElGVAkweDAwMDAwMDE4CisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0ZBTExfT1VUX0NNRF9fU0hJRlQJMHgwMDAwMDAxOQorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9GQUxMX09VVF9EQVRBX19TSElGVAkweDAwMDAwMDFhCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0ZBTExfT1VUX1NUUl9fU0hJRlQJMHgwMDAwMDAxYgorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01DX0lOSVRfQ09NUExFVEVfX1NISUZUCTB4MDAwMDAwMWMKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fRERSX0RMTF9fU0hJRlQJCTB4MDAwMDAwMWQKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fQ0ZHX1RZUEVfX1NISUZUCQkweDAwMDAwMDFlCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX1NEUkFNX1JFU0VUX19TSElGVAkweDAwMDAwMDFmCisKKy8qIE1FTV9SRUZSRVNIX0NOVEwgKi8KKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX1JFRlJFU0hfUkFURV9NQVNLCQkweDAwMDAwMGZmTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fUkVGUkVTSF9ESVNfTUFTSwkJMHgwMDAwMDEwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX1JFRlJFU0hfRElTCQkweDAwMDAwMTAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fRFlOQU1JQ19DS0VfTUFTSwkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0RZTkFNSUNfQ0tFCQkweDAwMDAwMjAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fVFJGQ19NQVNLCQkJMHgwMDAwZjAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0EwX0VOQUJMRV9NQVNLCQkweDAwMDEwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQTBfRU5BQkxFCQkweDAwMDEwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQTBiX0VOQUJMRV9NQVNLCTB4MDAwMjAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtBMGJfRU5BQkxFCQkweDAwMDIwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQTFfRU5BQkxFX01BU0sJCTB4MDAwNDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtBMV9FTkFCTEUJCTB4MDAwNDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtBMWJfRU5BQkxFX01BU0sJMHgwMDA4MDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0ExYl9FTkFCTEUJCTB4MDAwODAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtBRkJfRU5BQkxFX01BU0sJMHgwMDEwMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0FGQl9FTkFCTEUJCTB4MDAxMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX0RMTF9GQl9TTENUX0NLQV9NQVNLCQkweDAwYzAwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQjBfRU5BQkxFX01BU0sJCTB4MDEwMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtCMF9FTkFCTEUJCTB4MDEwMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtCMGJfRU5BQkxFX01BU0sJMHgwMjAwMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0IwYl9FTkFCTEUJCTB4MDIwMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtCMV9FTkFCTEVfTUFTSwkJMHgwNDAwMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0IxX0VOQUJMRQkJMHgwNDAwMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0IxYl9FTkFCTEVfTUFTSwkweDA4MDAwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQjFiX0VOQUJMRQkJMHgwODAwMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0JGQl9FTkFCTEVfTUFTSwkweDEwMDAwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQkZCX0VOQUJMRQkJMHgxMDAwMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fRExMX0ZCX1NMQ1RfQ0tCX01BU0sJCTB4YzAwMDAwMDBMCisKKy8qIE1DX1NUQVRVUyAqLworI2RlZmluZSBNQ19TVEFUVVNfX01FTV9QV1JVUF9DT01QTF9BX01BU0sJCTB4MDAwMDAwMDFMCisjZGVmaW5lIE1DX1NUQVRVU19fTUVNX1BXUlVQX0NPTVBMX0EJCQkweDAwMDAwMDAxTAorI2RlZmluZSBNQ19TVEFUVVNfX01FTV9QV1JVUF9DT01QTF9CX01BU0sJCTB4MDAwMDAwMDJMCisjZGVmaW5lIE1DX1NUQVRVU19fTUVNX1BXUlVQX0NPTVBMX0IJCQkweDAwMDAwMDAyTAorI2RlZmluZSBNQ19TVEFUVVNfX01DX0lETEVfTUFTSwkJCQkweDAwMDAwMDA0TAorI2RlZmluZSBNQ19TVEFUVVNfX01DX0lETEUJCQkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgTUNfU1RBVFVTX19JTVBfTl9WQUxVRV9SX0JBQ0tfTUFTSwkJMHgwMDAwMDA3OEwKKyNkZWZpbmUgTUNfU1RBVFVTX19JTVBfUF9WQUxVRV9SX0JBQ0tfTUFTSwkJMHgwMDAwMDc4MEwKKyNkZWZpbmUgTUNfU1RBVFVTX19URVNUX09VVF9SX0JBQ0tfTUFTSwkJCTB4MDAwMDA4MDBMCisjZGVmaW5lIE1DX1NUQVRVU19fVEVTVF9PVVRfUl9CQUNLCQkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgTUNfU1RBVFVTX19EVU1NWV9PVVRfUl9CQUNLX01BU0sJCTB4MDAwMDEwMDBMCisjZGVmaW5lIE1DX1NUQVRVU19fRFVNTVlfT1VUX1JfQkFDSwkJCTB4MDAwMDEwMDBMCisjZGVmaW5lIE1DX1NUQVRVU19fSU1QX05fVkFMVUVfQV9SX0JBQ0tfTUFTSwkJMHgwMDAxZTAwMEwKKyNkZWZpbmUgTUNfU1RBVFVTX19JTVBfUF9WQUxVRV9BX1JfQkFDS19NQVNLCQkweDAwMWUwMDAwTAorI2RlZmluZSBNQ19TVEFUVVNfX0lNUF9OX1ZBTFVFX0NLX1JfQkFDS19NQVNLCQkweDAxZTAwMDAwTAorI2RlZmluZSBNQ19TVEFUVVNfX0lNUF9QX1ZBTFVFX0NLX1JfQkFDS19NQVNLCQkweDFlMDAwMDAwTAorCisvKiBNRExMX0NLTyAqLworI2RlZmluZSBNRExMX0NLT19fTUNLT0FfU0xFRVBfTUFTSwkJCTB4MDAwMDAwMDFMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQV9TTEVFUAkJCQkweDAwMDAwMDAxTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0FfUkVTRVRfTUFTSwkJCTB4MDAwMDAwMDJMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQV9SRVNFVAkJCQkweDAwMDAwMDAyTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0FfUkFOR0VfTUFTSwkJCTB4MDAwMDAwMGNMCisjZGVmaW5lIE1ETExfQ0tPX19FUlNUQV9TT1VUU0VMX01BU0sJCQkweDAwMDAwMDMwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0FfRkJfU0VMX01BU0sJCQkweDAwMDAwMGMwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0FfUkVGX1NLRVdfTUFTSwkJCTB4MDAwMDA3MDBMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQV9GQl9TS0VXX01BU0sJCQkweDAwMDA3MDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0FfQlBfU0VMX01BU0sJCQkweDAwMDA4MDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0FfQlBfU0VMCQkJCTB4MDAwMDgwMDBMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQl9TTEVFUF9NQVNLCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgTURMTF9DS09fX01DS09CX1NMRUVQCQkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQl9SRVNFVF9NQVNLCQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgTURMTF9DS09fX01DS09CX1JFU0VUCQkJCTB4MDAwMjAwMDBMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQl9SQU5HRV9NQVNLCQkJMHgwMDBjMDAwMEwKKyNkZWZpbmUgTURMTF9DS09fX0VSU1RCX1NPVVRTRUxfTUFTSwkJCTB4MDAzMDAwMDBMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQl9GQl9TRUxfTUFTSwkJCTB4MDBjMDAwMDBMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQl9SRUZfU0tFV19NQVNLCQkJMHgwNzAwMDAwMEwKKyNkZWZpbmUgTURMTF9DS09fX01DS09CX0ZCX1NLRVdfTUFTSwkJCTB4NzAwMDAwMDBMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQl9CUF9TRUxfTUFTSwkJCTB4ODAwMDAwMDBMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQl9CUF9TRUwJCQkJMHg4MDAwMDAwMEwKKworLyogTURMTF9SRENLQSAqLworI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0EwX1NMRUVQX01BU0sJCQkweDAwMDAwMDAxTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0EwX1NMRUVQCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMF9SRVNFVF9NQVNLCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMF9SRVNFVAkJCTB4MDAwMDAwMDJMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTBfUkFOR0VfTUFTSwkJCTB4MDAwMDAwMGNMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTBfUkVGX1NFTF9NQVNLCQkweDAwMDAwMDMwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0EwX0ZCX1NFTF9NQVNLCQkJMHgwMDAwMDBjMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMF9SRUZfU0tFV19NQVNLCQkweDAwMDAwNzAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0EwX1NJTlNFTF9NQVNLCQkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMF9TSU5TRUwJCQkweDAwMDAwODAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0EwX0ZCX1NLRVdfTUFTSwkJMHgwMDAwNzAwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMF9CUF9TRUxfTUFTSwkJCTB4MDAwMDgwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTBfQlBfU0VMCQkJMHgwMDAwODAwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMV9TTEVFUF9NQVNLCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMV9TTEVFUAkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTFfUkVTRVRfTUFTSwkJCTB4MDAwMjAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTFfUkVTRVQJCQkweDAwMDIwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0ExX1JBTkdFX01BU0sJCQkweDAwMGMwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0ExX1JFRl9TRUxfTUFTSwkJMHgwMDMwMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMV9GQl9TRUxfTUFTSwkJCTB4MDBjMDAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTFfUkVGX1NLRVdfTUFTSwkJMHgwNzAwMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMV9TSU5TRUxfTUFTSwkJCTB4MDgwMDAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTFfU0lOU0VMCQkJMHgwODAwMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMV9GQl9TS0VXX01BU0sJCTB4NzAwMDAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTFfQlBfU0VMX01BU0sJCQkweDgwMDAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0ExX0JQX1NFTAkJCTB4ODAwMDAwMDBMCisKKy8qIE1ETExfUkRDS0IgKi8KKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMF9TTEVFUF9NQVNLCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMF9TTEVFUAkJCTB4MDAwMDAwMDFMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjBfUkVTRVRfTUFTSwkJCTB4MDAwMDAwMDJMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjBfUkVTRVQJCQkweDAwMDAwMDAyTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IwX1JBTkdFX01BU0sJCQkweDAwMDAwMDBjTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IwX1JFRl9TRUxfTUFTSwkJMHgwMDAwMDAzMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMF9GQl9TRUxfTUFTSwkJCTB4MDAwMDAwYzBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjBfUkVGX1NLRVdfTUFTSwkJMHgwMDAwMDcwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMF9TSU5TRUxfTUFTSwkJCTB4MDAwMDA4MDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjBfU0lOU0VMCQkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMF9GQl9TS0VXX01BU0sJCTB4MDAwMDcwMDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjBfQlBfU0VMX01BU0sJCQkweDAwMDA4MDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IwX0JQX1NFTAkJCTB4MDAwMDgwMDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjFfU0xFRVBfTUFTSwkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjFfU0xFRVAJCQkweDAwMDEwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IxX1JFU0VUX01BU0sJCQkweDAwMDIwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IxX1JFU0VUCQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMV9SQU5HRV9NQVNLCQkJMHgwMDBjMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMV9SRUZfU0VMX01BU0sJCTB4MDAzMDAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjFfRkJfU0VMX01BU0sJCQkweDAwYzAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IxX1JFRl9TS0VXX01BU0sJCTB4MDcwMDAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjFfU0lOU0VMX01BU0sJCQkweDA4MDAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IxX1NJTlNFTAkJCTB4MDgwMDAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjFfRkJfU0tFV19NQVNLCQkweDcwMDAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IxX0JQX1NFTF9NQVNLCQkJMHg4MDAwMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMV9CUF9TRUwJCQkweDgwMDAwMDAwTAorCisjZGVmaW5lIE1ETExfUjMwMF9SRENLX19NUkRDS0FfU0xFRVAJCQkweDAwMDAwMDAxTAorI2RlZmluZSBNRExMX1IzMDBfUkRDS19fTVJEQ0tBX1JFU0VUCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgTURMTF9SMzAwX1JEQ0tfX01SRENLQl9TTEVFUAkJCTB4MDAwMDAwMDRMCisjZGVmaW5lIE1ETExfUjMwMF9SRENLX19NUkRDS0JfUkVTRVQJCQkweDAwMDAwMDA4TAorI2RlZmluZSBNRExMX1IzMDBfUkRDS19fTVJEQ0tDX1NMRUVQCQkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgTURMTF9SMzAwX1JEQ0tfX01SRENLQ19SRVNFVAkJCTB4MDAwMDAwMjBMCisjZGVmaW5lIE1ETExfUjMwMF9SRENLX19NUkRDS0RfU0xFRVAJCQkweDAwMDAwMDQwTAorI2RlZmluZSBNRExMX1IzMDBfUkRDS19fTVJEQ0tEX1JFU0VUCQkJMHgwMDAwMDA4MEwKKworI2RlZmluZSBwbGxDTEtfUElOX0NOVEwJCQkJMHgwMDAxCisjZGVmaW5lIHBsbFBQTExfQ05UTAkJCQkweDAwMDIKKyNkZWZpbmUgcGxsUFBMTF9SRUZfRElWCQkJCTB4MDAwMworI2RlZmluZSBwbGxQUExMX0RJVl8wCQkJCTB4MDAwNAorI2RlZmluZSBwbGxQUExMX0RJVl8xCQkJCTB4MDAwNQorI2RlZmluZSBwbGxQUExMX0RJVl8yCQkJCTB4MDAwNgorI2RlZmluZSBwbGxQUExMX0RJVl8zCQkJCTB4MDAwNworI2RlZmluZSBwbGxWQ0xLX0VDUF9DTlRMCQkJMHgwMDA4CisjZGVmaW5lIHBsbEhUT1RBTF9DTlRMCQkJCTB4MDAwOQorI2RlZmluZSBwbGxNX1NQTExfUkVGX0ZCX0RJVgkJCTB4MDAwQQorI2RlZmluZSBwbGxBR1BfUExMX0NOVEwJCQkJMHgwMDBCCisjZGVmaW5lIHBsbFNQTExfQ05UTAkJCQkweDAwMEMKKyNkZWZpbmUgcGxsU0NMS19DTlRMCQkJCTB4MDAwRAorI2RlZmluZSBwbGxNUExMX0NOVEwJCQkJMHgwMDBFCisjZGVmaW5lIHBsbE1ETExfQ0tPCQkJCTB4MDAwRgorI2RlZmluZSBwbGxNRExMX1JEQ0tBCQkJCTB4MDAxMAorI2RlZmluZSBwbGxNRExMX1JEQ0tCCQkJCTB4MDAxMQorI2RlZmluZSBwbGxNQ0xLX0NOVEwJCQkJMHgwMDEyCisjZGVmaW5lIHBsbFBMTF9URVNUX0NOVEwJCQkweDAwMTMKKyNkZWZpbmUgcGxsQ0xLX1BXUk1HVF9DTlRMCQkJMHgwMDE0CisjZGVmaW5lIHBsbFBMTF9QV1JNR1RfQ05UTAkJCTB4MDAxNQorI2RlZmluZSBwbGxDR19URVNUX01BQ1JPX1JXX1dSSVRFCQkweDAwMTYKKyNkZWZpbmUgcGxsQ0dfVEVTVF9NQUNST19SV19SRUFECQkweDAwMTcKKyNkZWZpbmUgcGxsQ0dfVEVTVF9NQUNST19SV19EQVRBCQkweDAwMTgKKyNkZWZpbmUgcGxsQ0dfVEVTVF9NQUNST19SV19DTlRMCQkweDAwMTkKKyNkZWZpbmUgcGxsRElTUF9URVNUX01BQ1JPX1JXX1dSSVRFCQkweDAwMUEKKyNkZWZpbmUgcGxsRElTUF9URVNUX01BQ1JPX1JXX1JFQUQJCTB4MDAxQgorI2RlZmluZSBwbGxESVNQX1RFU1RfTUFDUk9fUldfREFUQQkJMHgwMDFDCisjZGVmaW5lIHBsbERJU1BfVEVTVF9NQUNST19SV19DTlRMCQkweDAwMUQKKyNkZWZpbmUgcGxsU0NMS19DTlRMMgkJCQkweDAwMUUKKyNkZWZpbmUgcGxsTUNMS19NSVNDCQkJCTB4MDAxRgorI2RlZmluZSBwbGxUVl9QTExfRklORV9DTlRMCQkJMHgwMDIwCisjZGVmaW5lIHBsbFRWX1BMTF9DTlRMCQkJCTB4MDAyMQorI2RlZmluZSBwbGxUVl9QTExfQ05UTDEJCQkJMHgwMDIyCisjZGVmaW5lIHBsbFRWX0RUT19JTkNSRU1FTlRTCQkJMHgwMDIzCisjZGVmaW5lIHBsbFNQTExfQVVYX0NOVEwJCQkweDAwMjQKKyNkZWZpbmUgcGxsTVBMTF9BVVhfQ05UTAkJCTB4MDAyNQorI2RlZmluZSBwbGxQMlBMTF9DTlRMCQkJCTB4MDAyQQorI2RlZmluZSBwbGxQMlBMTF9SRUZfRElWCQkJMHgwMDJCCisjZGVmaW5lIHBsbFAyUExMX0RJVl8wCQkJCTB4MDAyQworI2RlZmluZSBwbGxQSVhDTEtTX0NOVEwJCQkJMHgwMDJECisjZGVmaW5lIHBsbEhUT1RBTDJfQ05UTAkJCQkweDAwMkUKKyNkZWZpbmUgcGxsU1NQTExfQ05UTAkJCQkweDAwMzAKKyNkZWZpbmUgcGxsU1NQTExfUkVGX0RJVgkJCTB4MDAzMQorI2RlZmluZSBwbGxTU1BMTF9ESVZfMAkJCQkweDAwMzIKKyNkZWZpbmUgcGxsU1NfSU5UX0NOVEwJCQkJMHgwMDMzCisjZGVmaW5lIHBsbFNTX1RTVF9DTlRMCQkJCTB4MDAzNAorI2RlZmluZSBwbGxTQ0xLX01PUkVfQ05UTAkJCTB4MDAzNQorCisjZGVmaW5lIGl4TUNfUEVSRl9DTlRMCQkJCTB4MDAwMAorI2RlZmluZSBpeE1DX1BFUkZfU0VMCQkJCTB4MDAwMQorI2RlZmluZSBpeE1DX1BFUkZfUkVHSU9OXzAJCQkweDAwMDIKKyNkZWZpbmUgaXhNQ19QRVJGX1JFR0lPTl8xCQkJMHgwMDAzCisjZGVmaW5lIGl4TUNfUEVSRl9DT1VOVF8wCQkJMHgwMDA0CisjZGVmaW5lIGl4TUNfUEVSRl9DT1VOVF8xCQkJMHgwMDA1CisjZGVmaW5lIGl4TUNfUEVSRl9DT1VOVF8yCQkJMHgwMDA2CisjZGVmaW5lIGl4TUNfUEVSRl9DT1VOVF8zCQkJMHgwMDA3CisjZGVmaW5lIGl4TUNfUEVSRl9DT1VOVF9NRU1DSF9BCQkJMHgwMDA4CisjZGVmaW5lIGl4TUNfUEVSRl9DT1VOVF9NRU1DSF9CCQkJMHgwMDA5CisjZGVmaW5lIGl4TUNfSU1QX0NOVEwJCQkJMHgwMDBBCisjZGVmaW5lIGl4TUNfQ0hQX0lPX0NOVExfQTAJCQkweDAwMEIKKyNkZWZpbmUgaXhNQ19DSFBfSU9fQ05UTF9BMQkJCTB4MDAwQworI2RlZmluZSBpeE1DX0NIUF9JT19DTlRMX0IwCQkJMHgwMDBECisjZGVmaW5lIGl4TUNfQ0hQX0lPX0NOVExfQjEJCQkweDAwMEUKKyNkZWZpbmUgaXhNQ19JTVBfQ05UTF8wCQkJCTB4MDAwRgorI2RlZmluZSBpeFRDX01JU01BVENIXzEJCQkJMHgwMDEwCisjZGVmaW5lIGl4VENfTUlTTUFUQ0hfMgkJCQkweDAwMTEKKyNkZWZpbmUgaXhNQ19CSVNUX0NUUkwJCQkJMHgwMDEyCisjZGVmaW5lIGl4UkVHX0NPTExBUl9XUklURQkJCTB4MDAxMworI2RlZmluZSBpeFJFR19DT0xMQVJfUkVBRAkJCTB4MDAxNAorI2RlZmluZSBpeFIzMDBfTUNfSU1QX0NOVEwJCQkweDAwMTgKKyNkZWZpbmUgaXhSMzAwX01DX0NIUF9JT19DTlRMX0EwCQkweDAwMTkKKyNkZWZpbmUgaXhSMzAwX01DX0NIUF9JT19DTlRMX0ExCQkweDAwMWEKKyNkZWZpbmUgaXhSMzAwX01DX0NIUF9JT19DTlRMX0IwCQkweDAwMWIKKyNkZWZpbmUgaXhSMzAwX01DX0NIUF9JT19DTlRMX0IxCQkweDAwMWMKKyNkZWZpbmUgaXhSMzAwX01DX0NIUF9JT19DTlRMX0MwCQkweDAwMWQKKyNkZWZpbmUgaXhSMzAwX01DX0NIUF9JT19DTlRMX0MxCQkweDAwMWUKKyNkZWZpbmUgaXhSMzAwX01DX0NIUF9JT19DTlRMX0QwCQkweDAwMWYKKyNkZWZpbmUgaXhSMzAwX01DX0NIUF9JT19DTlRMX0QxCQkweDAwMjAKKyNkZWZpbmUgaXhSMzAwX01DX0lNUF9DTlRMXzAJCQkweDAwMjEKKyNkZWZpbmUgaXhSMzAwX01DX0VMUElEQV9DTlRMCQkJMHgwMDIyCisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fT0VfQ05UTF9DRAkJMHgwMDIzCisjZGVmaW5lIGl4UjMwMF9NQ19SRUFEX0NOVExfQ0QJCQkweDAwMjQKKyNkZWZpbmUgaXhSMzAwX01DX01DX0lOSVRfV1JfTEFUX1RJTUVSCQkweDAwMjUKKyNkZWZpbmUgaXhSMzAwX01DX0RFQlVHX0NOVEwJCQkweDAwMjYKKyNkZWZpbmUgaXhSMzAwX01DX0JJU1RfQ05UTF8wCQkJMHgwMDI4CisjZGVmaW5lIGl4UjMwMF9NQ19CSVNUX0NOVExfMQkJCTB4MDAyOQorI2RlZmluZSBpeFIzMDBfTUNfQklTVF9DTlRMXzIJCQkweDAwMmEKKyNkZWZpbmUgaXhSMzAwX01DX0JJU1RfQ05UTF8zCQkJMHgwMDJiCisjZGVmaW5lIGl4UjMwMF9NQ19CSVNUX0NOVExfNAkJCTB4MDAyYworI2RlZmluZSBpeFIzMDBfTUNfQklTVF9DTlRMXzUJCQkweDAwMmQKKyNkZWZpbmUgaXhSMzAwX01DX0lNUF9TVEFUVVMJCQkweDAwMmUKKyNkZWZpbmUgaXhSMzAwX01DX0RMTF9DTlRMCQkJMHgwMDJmCisjZGVmaW5lIE5CX1RPTQkJCQkJMHgxNUMKKworI2VuZGlmCS8qIF9SQURFT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zcGFydGFuMy5oIGIvaW5jbHVkZS9zcGFydGFuMy5oCmluZGV4IGIxNGRiMDMuLjY1YTNmNWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3BhcnRhbjMuaAorKysgYi9pbmNsdWRlL3NwYXJ0YW4zLmgKQEAgLTczLDYgKzczLDEzIEBACiAjZGVmaW5lIFhJTElOWF9YQzNTNDAwMF9TSVpFIAkxMTMxNjg2NC84CiAjZGVmaW5lIFhJTElOWF9YQzNTNTAwMF9TSVpFIAkxMzI3MTkzNi84CiAKKy8qIFNwYXJ0YW4tM0UgKHYzLjQpICovCisjZGVmaW5lCVhJTElOWF9YQzNTMTAwRV9TSVpFCTU4MTM0NC84CisjZGVmaW5lCVhJTElOWF9YQzNTMjUwRV9TSVpFCTEzNTM3MjgvOAorI2RlZmluZQlYSUxJTlhfWEMzUzUwMEVfU0laRQkyMjcwMjA4LzgKKyNkZWZpbmUJWElMSU5YX1hDM1MxMjAwRV9TSVpFCTM4NDExODQvOAorI2RlZmluZQlYSUxJTlhfWEMzUzE2MDBFX1NJWkUJNTk2OTY5Ni84CisKIC8qIERlc2NyaXB0b3IgTWFjcm9zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogU3BhcnRhbi1JSSBkZXZpY2VzICovCkBAIC0xMDAsNCArMTA3LDIxIEBACiAjZGVmaW5lIFhJTElOWF9YQzNTNTAwMF9ERVNDKGlmYWNlLCBmbl90YWJsZSwgY29va2llKSBcCiB7IFhpbGlueF9TcGFydGFuMywgaWZhY2UsIFhJTElOWF9YQzNTNTAwMEVfU0laRSwgZm5fdGFibGUsIGNvb2tpZSB9CiAKKworLyogU3BhcnRhbi0zRSBkZXZpY2VzICovCisjZGVmaW5lIFhJTElOWF9YQzNTMTAwRV9ERVNDKGlmYWNlLCBmbl90YWJsZSwgY29va2llKSBcCit7IFhpbGlueF9TcGFydGFuMywgaWZhY2UsIFhJTElOWF9YQzNTMTAwRV9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMzUzI1MEVfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAoreyBYaWxpbnhfU3BhcnRhbjMsIGlmYWNlLCBYSUxJTlhfWEMzUzI1MEVfU0laRSwgZm5fdGFibGUsIGNvb2tpZSB9CisKKyNkZWZpbmUgWElMSU5YX1hDM1M1MDBFX0RFU0MoaWZhY2UsIGZuX3RhYmxlLCBjb29raWUpIFwKK3sgWGlsaW54X1NwYXJ0YW4zLCBpZmFjZSwgWElMSU5YX1hDM1M1MDBFX1NJWkUsIGZuX3RhYmxlLCBjb29raWUgfQorCisjZGVmaW5lIFhJTElOWF9YQzNTMTIwMEVfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAoreyBYaWxpbnhfU3BhcnRhbjMsIGlmYWNlLCBYSUxJTlhfWEMzUzEyMDBFX1NJWkUsIGZuX3RhYmxlLCBjb29raWUgfQorCisjZGVmaW5lIFhJTElOWF9YQzNTMTYwMEVfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAoreyBYaWxpbnhfU3BhcnRhbjMsIGlmYWNlLCBYSUxJTlhfWEMzUzE2MDBFX1NJWkUsIGZuX3RhYmxlLCBjb29raWUgfQorCiAjZW5kaWYgLyogX1NQQVJUQU4zX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VzYi5oIGIvaW5jbHVkZS91c2IuaAppbmRleCBiZjcxNTU0Li40ZTE1MzlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VzYi5oCisrKyBiL2luY2x1ZGUvdXNiLmgKQEAgLTE2OSw3ICsxNjksMTAgQEAKICAqIHRoaXMgaXMgaG93IHRoZSBsb3dsZXZlbCBwYXJ0IGNvbW11bmljYXRlIHdpdGggdGhlIG91dGVyIHdvcmxkCiAgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9VSENJKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSSkgfHwgZGVmaW5lZCAoQ09ORklHX1VTQl9TTDgxMUhTKQorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9VSENJKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSSkgfHwgXAorCWRlZmluZWQoQ09ORklHX1VTQl9PSENJX05FVykgfHwgZGVmaW5lZCAoQ09ORklHX1VTQl9TTDgxMUhTKSB8fCBcCisJZGVmaW5lZChDT05GSUdfVVNCX0lTUDExNlhfSENEKQorCiBpbnQgdXNiX2xvd2xldmVsX2luaXQodm9pZCk7CiBpbnQgdXNiX2xvd2xldmVsX3N0b3Aodm9pZCk7CiBpbnQgc3VibWl0X2J1bGtfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLGludCB0cmFuc2Zlcl9sZW4pOwpAQCAtMTc3LDYgKzE4MCw3IEBACiAJCQlpbnQgdHJhbnNmZXJfbGVuLHN0cnVjdCBkZXZyZXF1ZXN0ICpzZXR1cCk7CiBpbnQgc3VibWl0X2ludF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCiAJCQlpbnQgdHJhbnNmZXJfbGVuLCBpbnQgaW50ZXJ2YWwpOwordm9pZCB1c2JfZXZlbnRfcG9sbCh2b2lkKTsKIAogLyogRGVmaW5lcyAqLwogI2RlZmluZSBVU0JfVUhDSV9WRU5EX0lEIDB4ODA4NgpAQCAtMjMwLDE2ICsyMzQsMTIgQEAKIAogLyogYmlnIGVuZGlhbiAtPiBsaXR0bGUgZW5kaWFuIGNvbnZlcnNpb24gKi8KIC8qIHNvbWUgQ1BVcyBhcmUgYWxyZWFkeSBsaXR0bGUgZW5kaWFuIGUuZy4gdGhlIEFSTTkyMFQgKi8KLSNpZmRlZiBMSVRUTEVFTkRJQU4KLSNkZWZpbmUgc3dhcF8xNih4KSAoKHVuc2lnbmVkIHNob3J0KSh4KSkKLSNkZWZpbmUgc3dhcF8zMih4KSAoKHVuc2lnbmVkIGxvbmcpKHgpKQotI2Vsc2UKLSNkZWZpbmUgc3dhcF8xNih4KSBcCisjZGVmaW5lIF9fc3dhcF8xNih4KSBcCiAJKHsgdW5zaWduZWQgc2hvcnQgeF8gPSAodW5zaWduZWQgc2hvcnQpeDsgXAogCSAodW5zaWduZWQgc2hvcnQpKCBcCiAJCSgoeF8gJiAweDAwRkZVKSA8PCA4KSB8ICgoeF8gJiAweEZGMDBVKSA+PiA4KSApOyBcCiAJfSkKLSNkZWZpbmUgc3dhcF8zMih4KSBcCisjZGVmaW5lIF9fc3dhcF8zMih4KSBcCiAJKHsgdW5zaWduZWQgbG9uZyB4XyA9ICh1bnNpZ25lZCBsb25nKXg7IFwKIAkgKHVuc2lnbmVkIGxvbmcpKCBcCiAJCSgoeF8gJiAweDAwMDAwMEZGVUwpIDw8IDI0KSB8IFwKQEAgLTI0Nyw2ICsyNDcsMTMgQEAKIAkJKCh4XyAmIDB4MDBGRjAwMDBVTCkgPj4JIDgpIHwgXAogCQkoKHhfICYgMHhGRjAwMDAwMFVMKSA+PiAyNCkgKTsgXAogCX0pCisKKyNpZmRlZiBMSVRUTEVFTkRJQU4KKyMgZGVmaW5lIHN3YXBfMTYoeCkgKHgpCisjIGRlZmluZSBzd2FwXzMyKHgpICh4KQorI2Vsc2UKKyMgZGVmaW5lIHN3YXBfMTYoeCkgX19zd2FwXzE2KHgpCisjIGRlZmluZSBzd2FwXzMyKHgpIF9fc3dhcF8zMih4KQogI2VuZGlmIC8qIExJVFRMRUVORElBTiAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91c2JfY2RjX2FjbS5oIGIvaW5jbHVkZS91c2JfY2RjX2FjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YmY1MGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VzYl9jZGNfYWNtLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogQnJ5YW4gTydEb25vZ2h1ZSwgZGVja2FyZEBjb2RlaGVybWl0LmllLCBDb2RlSGVybWl0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKy8qIEFDTSBDb250cm9sIFJlcXVlc3RzICovCisjZGVmaW5lIEFDTV9TRU5EX0VOQ0FQU1VMQVRFRF9DT01NQU5ECTB4MDAKKyNkZWZpbmUgQUNNX0dFVF9FTkNBUFNVTEFURURfUkVTUE9OU0UJMHgwMQorI2RlZmluZSBBQ01fU0VUX0NPTU1fRkVBVFVSRQkJMHgwMgorI2RlZmluZSBBQ01fR0VUX0NPTU1fRkVBVFJVRQkJMHgwMworI2RlZmluZSBBQ01fQ0xFQVJfQ09NTV9GRUFUVVJFCQkweDA0CisjZGVmaW5lIEFDTV9TRVRfTElORV9FTkNPRElORwkJMHgyMAorI2RlZmluZSBBQ01fR0VUX0xJTkVfRU5DT0RJTkcJCTB4MjEKKyNkZWZpbmUgQUNNX1NFVF9DT05UUk9MX0xJTkVfU1RBVEUJMHgyMgorI2RlZmluZSBBQ01fU0VORF9CUkVBSwkJCTB4MjMKKworLyogQUNNIE5vdGlmaWNhdGlvbiBDb2RlcyAqLworI2RlZmluZSBBQ01fTkVUV09SS19DT05ORUNUSU9OCQkweDAwCisjZGVmaW5lIEFDTV9SRVNQT05TRV9BVkFJTEFCTEUJCTB4MDEKKyNkZWZpbmUgQUNNX1NFUklBTF9TVEFURQkJMHgyMAorCisvKiBGb3JtYXQgb2YgcmVzcG9uc2UgZXhwZWN0ZWQgYnkgYSBBQ01fR0VUX0xJTkVfRU5DT0RJTkcgcmVxdWVzdCAqLworc3RydWN0IHJzMjMyX2VtdXsKKwkJdW5zaWduZWQgbG9uZyBkdGVyOworCQl1bnNpZ25lZCBjaGFyIHN0b3BfYml0czsKKwkJdW5zaWduZWQgY2hhciBwYXJpdHk7CisJCXVuc2lnbmVkIGNoYXIgZGF0YV9iaXRzOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91c2JkY29yZS5oIGIvaW5jbHVkZS91c2JkY29yZS5oCmluZGV4IDZlOTJkZjEuLmNiMmJlNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdXNiZGNvcmUuaAorKysgYi9pbmNsdWRlL3VzYmRjb3JlLmgKQEAgLTU3Niw2ICs1NzYsOSBAQAogCiAJdm9pZCAoKmV2ZW50KSAoc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKmRldmljZSwgdXNiX2RldmljZV9ldmVudF90IGV2ZW50LCBpbnQgZGF0YSk7CiAKKwkvKiBEbyBjZGMgZGV2aWNlIHNwZWNpZmljIGNvbnRyb2wgcmVxdWVzdHMgKi8KKwlpbnQgKCpjZGNfcmVjdl9zZXR1cCkoc3RydWN0IHVzYl9kZXZpY2VfcmVxdWVzdCAqcmVxdWVzdCwgc3RydWN0IHVyYiAqdXJiKTsKKwogCS8qIGJ1cyBpbnRlcmZhY2UgKi8KIAlzdHJ1Y3QgdXNiX2J1c19pbnN0YW5jZSAqYnVzOwkvKiB3aGljaCBidXMgaW50ZXJmYWNlIGRyaXZlciAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VzYmRjb3JlX21wYzh4eC5oIGIvaW5jbHVkZS91c2JkY29yZV9tcGM4eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGY2MmY0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91c2JkY29yZV9tcGM4eHguaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBCcnlhbiBPJ0Rvbm9naHVlLCBDb2RlSGVybWl0CisgKiBib2Rvbm9naHVlQGNvZGVoZXJtaXQuaWUKKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKworLyogTW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBVU01PRF9FTgkweDAxCisjZGVmaW5lIFVTTU9EX0hPU1QJMHgwMgorI2RlZmluZSBVU01PRF9URVNUCTB4MDQKKyNkZWZpbmUgVVNNT0RfU0ZURQkweDA4CisjZGVmaW5lIFVTTU9EX1JFU1VNRQkweDQwCisjZGVmaW5lIFVTTU9EX0xTUwkweDgwCisKKy8qIEVuZHBvaW50IFJlZ2lzdGVycyAqLworI2RlZmluZSBVU0VQX1JIU19OT1JNCTB4MDAKKyNkZWZpbmUgVVNFUF9SSFNfSUdOT1JFCTB4MDEKKyNkZWZpbmUgVVNFUF9SSFNfTkFLCTB4MDIKKyNkZWZpbmUgVVNFUF9SSFNfU1RBTEwJMHgwMworCisjZGVmaW5lIFVTRVBfVEhTX05PUk0JMHgwMAorI2RlZmluZSBVU0VQX1RIU19JR05PUkUJMHgwNAorI2RlZmluZSBVU0VQX1RIU19OQUsJMHgwOAorI2RlZmluZSBVU0VQX1RIU19TVEFMTAkweDBDCisKKyNkZWZpbmUgVVNFUF9SVEUJMHgxMAorI2RlZmluZSBVU0VQX01GCQkweDIwCisKKyNkZWZpbmUgVVNFUF9UTV9DT05UUk9MCTB4MDAKKyNkZWZpbmUgVVNFUF9UTV9JTlQJMHgxMDAKKyNkZWZpbmUgVVNFUF9UTV9CVUxLCTB4MjAwCisjZGVmaW5lIFVTRVBfVE1fSVNPCTB4MzAwCisKKy8qIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVVNDT01fRVAwCTB4MDAKKyNkZWZpbmUgVVNDT01fRVAxCTB4MDEKKyNkZWZpbmUgVVNDT01fRVAyCTB4MDIKKyNkZWZpbmUgVVNDT01fRVAzCTB4MDMKKworI2RlZmluZSBVU0NPTV9GTFVTSAkweDQwCisjZGVmaW5lIFVTQ09NX1NUUgkweDgwCisKKy8qIEV2ZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFVTQl9FX1JYQgkweDAwMDEKKyNkZWZpbmUgVVNCX0VfVFhCCTB4MDAwMgorI2RlZmluZSBVU0JfRV9CU1kJMHgwMDA0CisjZGVmaW5lIFVTQl9FX1NPRgkweDAwMDgKKyNkZWZpbmUgVVNCX0VfVFhFMQkweDAwMTAKKyNkZWZpbmUgVVNCX0VfVFhFMgkweDAwMjAKKyNkZWZpbmUgVVNCX0VfVFhFMwkweDAwNDAKKyNkZWZpbmUgVVNCX0VfVFhFNAkweDAwODAKKyNkZWZpbmUgVVNCX1RYX0VSUk1BU0sgKFVTQl9FX1RYRTF8VVNCX0VfVFhFMnxVU0JfRV9UWEUzfFVTQl9FX1RYRTQpCisjZGVmaW5lIFVTQl9FX0lETEUJMHgwMTAwCisjZGVmaW5lIFVTQl9FX1JFU0VUCTB4MDIwMAorCisvKiBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFVTQlNfSURMRQkweDAxCisKKy8qIFJYIEJ1ZmZlciBEZXNjcmlwdG9yICovCisjZGVmaW5lIFJYX0JEX09WCTB4MDIKKyNkZWZpbmUgUlhfQkRfQ1IJMHgwNAorI2RlZmluZSBSWF9CRF9BQgkweDA4CisjZGVmaW5lIFJYX0JEX05PCTB4MTAKKyNkZWZpbmUgUlhfQkRfUElEX0RBVEEwCTB4MDAKKyNkZWZpbmUgUlhfQkRfUElEX0RBVEExCTB4NDAKKyNkZWZpbmUgUlhfQkRfUElEX1NFVFVQCTB4ODAKKyNkZWZpbmUgUlhfQkRfRgkJMHg0MDAKKyNkZWZpbmUgUlhfQkRfTAkJMHg4MDAKKyNkZWZpbmUgUlhfQkRfSQkJMHgxMDAwCisjZGVmaW5lIFJYX0JEX1cJCTB4MjAwMAorI2RlZmluZSBSWF9CRF9FCQkweDgwMDAKKworLyogVXNlZnVsIG1hc2tzICovCisjZGVmaW5lIFJYX0JEX1BJRF9CSVRNQVNLIChSWF9CRF9QSURfREFUQTEgfCBSWF9CRF9QSURfU0VUVVApCisjZGVmaW5lIFNUQUxMX0JJVE1BU0sgKFVTRVBfVEhTX1NUQUxMIHwgVVNFUF9SSFNfU1RBTEwpCisjZGVmaW5lIE5BS19CSVRNQVNLIChVU0VQX1RIU19OQUsgfCBVU0VQX1JIU19OQUspCisjZGVmaW5lIENCRF9UWF9CSVRNQVNLIChUWF9CRF9SIHwgVFhfQkRfTCB8IFRYX0JEX1RDIHwgVFhfQkRfSSB8IFRYX0JEX0NORikKKworLyogVFggQnVmZmVyIERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgVFhfQkRfVU4JMHgwMgorI2RlZmluZSBUWF9CRF9UTwkweDA0CisjZGVmaW5lIFRYX0JEX05PX1BJRAkweDAwCisjZGVmaW5lIFRYX0JEX1BJRF9EQVRBMAkweDgwCisjZGVmaW5lIFRYX0JEX1BJRF9EQVRBMQkweEMwCisjZGVmaW5lIFRYX0JEX0NORgkweDIwMAorI2RlZmluZSBUWF9CRF9UQwkweDQwMAorI2RlZmluZSBUWF9CRF9MCQkweDgwMAorI2RlZmluZSBUWF9CRF9JCQkweDEwMDAKKyNkZWZpbmUgVFhfQkRfVwkJMHgyMDAwCisjZGVmaW5lIFRYX0JEX1IJCTB4ODAwMAorCisvKiBJbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBkZWZpbmVzICovCisKKyNkZWZpbmUgRVBfTUlOX1BBQ0tFVF9TSVpFIDB4MDgKKyNkZWZpbmUgTUFYX0VORFBPSU5UUwkweDA0CisjZGVmaW5lIEZJRk9fU0laRQkweDEwCisjZGVmaW5lIEVQX01BWF9QS1QJRklGT19TSVpFCisjZGVmaW5lIFRYX1JJTkdfU0laRQkweDA0CisjZGVmaW5lIFJYX1JJTkdfU0laRQkweDA2CisjZGVmaW5lIFVTQl9NQVhfUEtUCTB4NDAKKyNkZWZpbmUgVE9HR0xFX1RYX1BJRCh4KSB4PSAoKH54KSYweDQwKXwweDgwCisjZGVmaW5lIFRPR0dMRV9SWF9QSUQoeCkgeF49IDB4NDAKKyNkZWZpbmUgRVBfQVRUQUNIRUQJMHgwMQkvKiBFbmRwb2ludCBoYXMgYSB1cmIgYXR0YWNoZWQgb3Igbm90ICovCisjZGVmaW5lIEVQX1NFTkRfWkxQCTB4MDIJLyogU2VuZCBaTFAgeS9uID8gKi8KKworI2RlZmluZSBQUk9GRl9VU0IJMHgwMDAwMDAwMAorI2RlZmluZSBDUE1fVVNCX0JBU0UJMHgwMDAwMEEwMAorCisvKiBVREMgZGV2aWNlIGRlZmluZXMgKi8KKyNkZWZpbmUgRVAwX01BWF9QQUNLRVRfU0laRQlFUF9NQVhfUEtUCisjZGVmaW5lIFVEQ19PVVRfRU5EUE9JTlQJMHgwMgorI2RlZmluZSBVRENfT1VUX1BBQ0tFVF9TSVpFCUVQX01JTl9QQUNLRVRfU0laRQorI2RlZmluZSBVRENfSU5fRU5EUE9JTlQJCTB4MDMKKyNkZWZpbmUgVURDX0lOX1BBQ0tFVF9TSVpFCUVQX01JTl9QQUNLRVRfU0laRQorI2RlZmluZSBVRENfSU5UX0VORFBPSU5UCTB4MDEKKyNkZWZpbmUgVURDX0lOVF9QQUNLRVRfU0laRQlVRENfSU5fUEFDS0VUX1NJWkUKKyNkZWZpbmUgVURDX0JVTEtfUEFDS0VUX1NJWkUJRVBfTUlOX1BBQ0tFVF9TSVpFCisKK3N0cnVjdCBtcGM4eHhfZXAgeworCXN0cnVjdCB1cmIgKiB1cmI7CisJdW5zaWduZWQgY2hhciBwaWQ7CisJdW5zaWduZWQgY2hhciBzYzsKKwl2b2xhdGlsZSBjYmRfdCAqIHByeDsKK307CisKK3R5cGVkZWYgc3RydWN0IG1wYzh4eF91c2J7CisJY2hhciB1c21vZDsJLyogTW9kZSBSZWdpc3RlciAqLworCWNoYXIgdXNhZGRyOwkvKiBTbGF2ZSBBZGRyZXNzIFJlZ2lzdGVyICovCisJY2hhciB1c2NvbTsJLyogQ29tbWFuZCBSZWdpc3RlciAqLworCWNoYXIgcmVzMTsJLyogUmVzZXJ2ZWQgKi8KKwl1c2hvcnQgdXNlcFs0XTsKKwl1bG9uZyByZXMyOwkvKiBSZXNlcnZlZCAqLworCXVzaG9ydCB1c2JlcjsJLyogRXZlbnQgUmVnaXN0ZXIgKi8KKwl1c2hvcnQgcmVzMzsJLyogUmVzZXJ2ZWQgKi8KKwl1c2hvcnQgdXNibXI7CS8qIE1hc2sgUmVnaXN0ZXIgKi8KKwljaGFyIHJlczQ7CS8qIFJlc2VydmVkICovCisJY2hhciB1c2JzOwkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKwljaGFyIHJlczVbOF07CS8qIFJlc2VydmVkICovCit9dXNiX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1wYzh4eF9wYXJhbWV0ZXJfcmFteworCXVzaG9ydCBlcDBwdHI7CS8qIEVuZHBvaW50IFBvaW50ZXIgUmVnaXN0ZXIgMCAqLworCXVzaG9ydCBlcDFwdHI7CS8qIEVuZHBvaW50IFBvaW50ZXIgUmVnaXN0ZXIgMSAqLworCXVzaG9ydCBlcDJwdHI7CS8qIEVuZHBvaW50IFBvaW50ZXIgUmVnaXN0ZXIgMiAqLworCXVzaG9ydCBlcDNwdHI7CS8qIEVuZHBvaW50IFBvaW50ZXIgUmVnaXN0ZXIgMyAqLworCXVpbnQgcnN0YXRlOwkvKiBSZWNlaXZlIHN0YXRlICovCisJdWludCBycHRyOwkvKiBSZWNlaXZlIGludGVybmFsIGRhdGEgcG9pbnRlciAqLworCXVzaG9ydCBmcmFtZV9uOwkvKiBGcmFtZSBudW1iZXIgKi8KKwl1c2hvcnQgcmJjbnQ7CS8qIFJlY2VpdmUgYnl0ZSBjb3VudCAqLworCXVpbnQgcnRlbXA7CS8qIFJlY2VpdmUgdGVtcCBjcCB1c2Ugb25seSAqLworCXVpbnQgcnh1c2I7CS8qIFJ4IERhdGEgVGVtcCAqLworCXVzaG9ydCByeHVwdHI7CS8qIFJ4IG1pY3JvY29kZSByZXR1cm4gYWRkcmVzcyB0ZW1wICovCit9dXNiX3ByYW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgZW5kcG9pbnRfcGFyYW1ldGVyX2Jsb2NrX3BvaW50ZXJ7CisJdXNob3J0IHJiYXNlOwkvKiBSeEJEIGJhc2UgYWRkcmVzcyAqLworCXVzaG9ydCB0YmFzZTsJLyogVHhCRCBiYXNlIGFkZHJlc3MgKi8KKwljaGFyIHJmY3I7CS8qIFJ4IEZ1bmN0aW9uIGNvZGUgKi8KKwljaGFyIHRmY3I7CS8qIFR4IEZ1bmN0aW9uIGNvZGUgKi8KKwl1c2hvcnQgbXJibHI7CS8qIE1heGltdW0gUmVjZWl2ZSBCdWZmZXIgTGVuZ3RoICovCisJdXNob3J0IHJicHRyOyAJLyogUnhCRCBwb2ludGVyIE5leHQgQnVmZmVyIERlc2NyaXB0b3IgKi8KKwl1c2hvcnQgdGJwdHI7CS8qIFR4QkQgcG9pbnRlciBOZXh0IEJ1ZmZlciBEZXNjcmlwdG9yICAqLworCXVsb25nIHRzdGF0ZTsJLyogVHJhbnNtaXQgaW50ZXJuYWwgc3RhdGUgKi8KKwl1bG9uZyB0cHRyOwkvKiBUcmFuc21pdCBpbnRlcm5hbCBkYXRhIHBvaW50ZXIgKi8KKwl1c2hvcnQgdGNyYzsJLyogVHJhbnNtaXQgdGVtcCBDUkMgKi8KKwl1c2hvcnQgdGJjbnQ7CS8qIFRyYW5zbWl0IGludGVybmFsIGJ5ZSBjb3VudCAqLworCXVsb25nIHR0ZW1wOwkvKiBUeCB0ZW1wICovCisJdXNob3J0IHR4dXB0cjsJLyogVHggbWljcm9jb2RlIHJldHVybiBhZGRyZXNzICovCisJdXNob3J0IHJlczE7CS8qIFJlc2VydmVkICovCit9dXNiX2VwYl90OworCit0eXBlZGVmIGVudW0gbXBjOHh4X3VkY19zdGF0ZXsKKwlTVEFURV9OT1RfUkVBRFksCisJU1RBVEVfRVJST1IsCisJU1RBVEVfUkVBRFksCit9bXBjOHh4X3VkY19zdGF0ZV90OworCisvKiBEZWNsYXJhdGlvbnMgKi8KK2ludCB1ZGNfaW5pdCh2b2lkKTsKK3ZvaWQgdWRjX2lycSh2b2lkKTsKK2ludCB1ZGNfZW5kcG9pbnRfd3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZW5kcG9pbnQpOwordm9pZCB1ZGNfc2V0dXBfZXAoc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKmRldmljZSwgdW5zaWduZWQgaW50IGVwLAorCQkgIHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50KTsKK3ZvaWQgdWRjX2Nvbm5lY3Qodm9pZCk7Cit2b2lkIHVkY19kaXNjb25uZWN0KHZvaWQpOwordm9pZCB1ZGNfZW5hYmxlKHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UpOwordm9pZCB1ZGNfZGlzYWJsZSh2b2lkKTsKK3ZvaWQgdWRjX3N0YXJ0dXBfZXZlbnRzKHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UpOworCisvKiBGbG93IGNvbnRyb2wgKi8KK3ZvaWQgdWRjX3NldF9uYWsoaW50IGVwaWQpOwordm9pZCB1ZGNfdW5zZXRfbmFrIChpbnQgZXBpZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VzYmRjb3JlX29tYXAxNTEwLmggYi9pbmNsdWRlL3VzYmRjb3JlX29tYXAxNTEwLmgKaW5kZXggNmVhMzMzMS4uNTI2ZmNkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91c2JkY29yZV9vbWFwMTUxMC5oCisrKyBiL2luY2x1ZGUvdXNiZGNvcmVfb21hcDE1MTAuaApAQCAtMTYxLDEwICsxNjEsMjAgQEAKICNkZWZpbmUgVURDX1ZCVVNfQ1RSTAkgICAgKDEgPDwgMTkpCiAjZGVmaW5lIFVEQ19WQlVTX01PREUJICAgICgxIDw8IDE4KQogCisvKiBPTUFQIEVuZHBvaW50IHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgRVAwX01BWF9QQUNLRVRfU0laRSA2NAorI2RlZmluZSBVRENfT1VUX0VORFBPSU5UIDIKKyNkZWZpbmUgVURDX09VVF9QQUNLRVRfU0laRSA2NAorI2RlZmluZSBVRENfSU5fRU5EUE9JTlQJMQorI2RlZmluZSBVRENfSU5fUEFDS0VUX1NJWkUgNjQKKyNkZWZpbmUgVURDX0lOVF9FTkRQT0lOVCA1CisjZGVmaW5lIFVEQ19JTlRfUEtUU0laRQkxNgorI2RlZmluZSBVRENfQlVMS19QS1RTSVpFIDE2CiAKLXZvaWQgb21hcDE1MTBfdWRjX2lycSh2b2lkKTsKLXZvaWQgb21hcDE1MTBfdWRjX25vbmlzb19pcnEodm9pZCk7Ci0KK3ZvaWQgdWRjX2lycSAodm9pZCk7CisvKiBGbG93IGNvbnRyb2wgKi8KK3ZvaWQgdWRjX3NldF9uYWsoaW50IGVwaWQpOwordm9pZCB1ZGNfdW5zZXRfbmFrIChpbnQgZXBpZCk7CiAKIC8qIEhpZ2hlciBsZXZlbCBmdW5jdGlvbnMgZm9yIGFic3RyYWN0aW5nIGF3YXkgZnJvbSBzcGVjaWZpYyBkZXZpY2UgKi8KIHZvaWQgdWRjX2VuZHBvaW50X3dyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXNiZGVzY3JpcHRvcnMuaCBiL2luY2x1ZGUvdXNiZGVzY3JpcHRvcnMuaAppbmRleCAyZDlmNzM5Li5hNzUyMDk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VzYmRlc2NyaXB0b3JzLmgKKysrIGIvaW5jbHVkZS91c2JkZXNjcmlwdG9ycy5oCkBAIC05MiwzMyArOTIsNDIgQEAKICNkZWZpbmUgQ09NTVVOSUNBVElPTlNfREVWSUNFX0NMQVNTCTB4MDIKIAogLyogYy5mLiBDREMgNC4yIFRhYmxlIDE1ICovCi0jZGVmaW5lIENPTU1VTklDQVRJT05TX0lOVEVSRkFDRV9DTEFTUwkweDAyCisjZGVmaW5lIENPTU1VTklDQVRJT05TX0lOVEVSRkFDRV9DTEFTU19DT05UUk9MCTB4MDIKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfSU5URVJGQUNFX0NMQVNTX0RBVEEJCTB4MEEKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfSU5URVJGQUNFX0NMQVNTX1ZFTkRPUgkweDBGRgogCiAvKiBjLmYuIENEQyA0LjMgVGFibGUgMTYgKi8KLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfTk9fU1VCQ0xBU1MJMHgwMAorI2RlZmluZSBDT01NVU5JQ0FUSU9OU19OT19TVUJDTEFTUwkJMHgwMAogI2RlZmluZSBDT01NVU5JQ0FUSU9OU19ETENNX1NVQkNMQVNTCTB4MDEKLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfQUNNX1NVQkNMQVNTCTB4MDIKLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfVENNX1NVQkNMQVNTCTB4MDMKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfQUNNX1NVQkNMQVNTCQkweDAyCisjZGVmaW5lIENPTU1VTklDQVRJT05TX1RDTV9TVUJDTEFTUwkJMHgwMwogI2RlZmluZSBDT01NVU5JQ0FUSU9OU19NQ0NNX1NVQkNMQVNTCTB4MDQKLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfQ0NNX1NVQkNMQVNTCTB4MDUKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfQ0NNX1NVQkNMQVNTCQkweDA1CiAjZGVmaW5lIENPTU1VTklDQVRJT05TX0VOQ01fU1VCQ0xBU1MJMHgwNgogI2RlZmluZSBDT01NVU5JQ0FUSU9OU19BTkNNX1NVQkNMQVNTCTB4MDcKIAogLyogYy5mLiBXTUNEIDUuMSAqLwogI2RlZmluZSBDT01NVU5JQ0FUSU9OU19XSENNX1NVQkNMQVNTCTB4MDgKLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfRE1NX1NVQkNMQVNTCTB4MDkKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfRE1NX1NVQkNMQVNTCQkweDA5CiAjZGVmaW5lIENPTU1VTklDQVRJT05TX01ETE1fU1VCQ0xBU1MJMHgwYQogI2RlZmluZSBDT01NVU5JQ0FUSU9OU19PQkVYX1NVQkNMQVNTCTB4MGIKIAotLyogYy5mLiBDREMgNC42IFRhYmxlIDE4ICovCisvKiBjLmYuIENEQyA0LjQgVGFibGUgMTcgKi8KKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfTk9fUFJPVE9DT0wJCTB4MDAKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfVjI1VEVSX1BST1RPQ09MCTB4MDEJLypDb21tb24gQVQgSGF5ZXMgY29tcGF0aWJsZSovCisKKy8qIGMuZi4gQ0RDIDQuNSBUYWJsZSAxOCAqLwogI2RlZmluZSBEQVRBX0lOVEVSRkFDRV9DTEFTUwkJMHgwYQogCisvKiBjLmYuIENEQyA0LjYgTm8gVGFibGUgKi8KKyNkZWZpbmUgREFUQV9JTlRFUkZBQ0VfU1VCQ0xBU1NfTk9ORQkweDAwCS8qIE5vIHN1YmNsYXNzIHBlcnRpbmVudCAqLworCiAvKiBjLmYuIENEQyA0LjcgVGFibGUgMTkgKi8KLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfTk9fUFJPVE9DT0wJMHgwMAorI2RlZmluZSBEQVRBX0lOVEVSRkFDRV9QUk9UT0NPTF9OT05FCTB4MDAJLyogTm8gY2xhc3MgcHJvdGNvbCByZXF1aXJlZCAqLwogCiAKIC8qIGMuZi4gQ0RDIDUuMi4zIFRhYmxlIDI0ICovCi0jZGVmaW5lIENTX0lOVEVSRkFDRQkJCTB4MjQKKyNkZWZpbmUgQ1NfSU5URVJGQUNFCQkweDI0CiAjZGVmaW5lIENTX0VORFBPSU5UCQkJMHgyNQogCiAvKgpAQCAtMTI4LDcgKzEzNyw3IEBACiAgKiBjLmYuIFdNQ0QgNS4zIFRhYmxlIDUuMwogICovCiAKLSNkZWZpbmUgVVNCX1NUX0hFQURFUgkJCTB4MDAKKyNkZWZpbmUgVVNCX1NUX0hFQURFUgkJMHgwMAogI2RlZmluZSBVU0JfU1RfQ01GCQkJMHgwMQogI2RlZmluZSBVU0JfU1RfQUNNRgkJCTB4MDIKICNkZWZpbmUgVVNCX1NUX0RMTUYJCQkweDAzCkBAIC0xMzcsMTggKzE0NiwxOCBAQAogI2RlZmluZSBVU0JfU1RfVUYJCQkweDA2CiAjZGVmaW5lIFVTQl9TVF9DU0YJCQkweDA3CiAjZGVmaW5lIFVTQl9TVF9UT01GCQkJMHgwOAotI2RlZmluZSBVU0JfU1RfVVNCVEYJCQkweDA5CisjZGVmaW5lIFVTQl9TVF9VU0JURgkJMHgwOQogI2RlZmluZSBVU0JfU1RfTkNUCQkJMHgwYQogI2RlZmluZSBVU0JfU1RfUFVGCQkJMHgwYgogI2RlZmluZSBVU0JfU1RfRVVGCQkJMHgwYwogI2RlZmluZSBVU0JfU1RfTUNNRgkJCTB4MGQKICNkZWZpbmUgVVNCX1NUX0NDTUYJCQkweDBlCiAjZGVmaW5lIFVTQl9TVF9FTkYJCQkweDBmCi0jZGVmaW5lIFVTQl9TVF9BVE1ORgkJCTB4MTAKKyNkZWZpbmUgVVNCX1NUX0FUTU5GCQkweDEwCiAKICNkZWZpbmUgVVNCX1NUX1dIQ00JCQkweDExCiAjZGVmaW5lIFVTQl9TVF9NRExNCQkJMHgxMgotI2RlZmluZSBVU0JfU1RfTURMTUQJCQkweDEzCisjZGVmaW5lIFVTQl9TVF9NRExNRAkJMHgxMwogI2RlZmluZSBVU0JfU1RfRE1NCQkJMHgxNAogI2RlZmluZSBVU0JfU1RfT0JFWAkJCTB4MTUKICNkZWZpbmUgVVNCX1NUX0NTCQkJMHgxNgpAQCAtMzEyLDcgKzMyMSw4IEBACiAJdTggYkRlc2NyaXB0b3JUeXBlOwogCXU4IGJEZXNjcmlwdG9yU3VidHlwZTsJLyogMHgwNiAqLwogCXU4IGJNYXN0ZXJJbnRlcmZhY2U7Ci0JdTggYlNsYXZlSW50ZXJmYWNlMFswXTsKKwkvKiB1OCBiU2xhdmVJbnRlcmZhY2UwWzBdOyAqLworCXU4IGJTbGF2ZUludGVyZmFjZTA7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogc3RydWN0IHVzYl9jbGFzc19jb3VudHJ5X3NlbGVjdGlvbl9kZXNjcmlwdG9yIHsKZGlmZiAtLWdpdCBhL2xpYl9hcm0vYm9hcmQuYyBiL2xpYl9hcm0vYm9hcmQuYwppbmRleCBiYWJjMjU0Li5kMzdlNWRhIDEwMDY0NAotLS0gYS9saWJfYXJtL2JvYXJkLmMKKysrIGIvbGliX2FybS9ib2FyZC5jCkBAIC01NCw3ICs1NCw3IEBACiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIHZvaWQgbmFuZF9pbml0ICh2b2lkKTsKICNlbmRpZgogCkBAIC0yOTYsNyArMjk2LDcgQEAKIAkvKiBhcm1ib290X3N0YXJ0IGlzIGRlZmluZWQgaW4gdGhlIGJvYXJkLXNwZWNpZmljIGxpbmtlciBzY3JpcHQgKi8KIAltZW1fbWFsbG9jX2luaXQgKF9hcm1ib290X3N0YXJ0IC0gQ0ZHX01BTExPQ19MRU4pOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAlwdXRzICgiTkFORDogICIpOwogCW5hbmRfaW5pdCgpOwkJLyogZ28gaW5pdCB0aGUgTkFORCAqLwogI2VuZGlmCkBAIC0zNjQsNiArMzY0LDEzIEBACiAJZW5hYmxlX2ludGVycnVwdHMgKCk7CiAKIAkvKiBQZXJmb3JtIG5ldHdvcmsgY2FyZCBpbml0aWFsaXNhdGlvbiBpZiBuZWNlc3NhcnkgKi8KKyNpZmRlZiBDT05GSUdfRFJJVkVSX1RJX0VNQUMKK2V4dGVybiB2b2lkIGRtNjQ0eF9ldGhfc2V0X21hY19hZGRyIChjb25zdCB1X2ludDhfdCAqYWRkcik7CisJaWYgKGdldGVudiAoImV0aGFkZHIiKSkgeworCQlkbTY0NHhfZXRoX3NldF9tYWNfYWRkcihnZC0+YmQtPmJpX2VuZXRhZGRyKTsKKwl9CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19EUklWRVJfQ1M4OTAwCiAJY3M4OTAwX2dldF9lbmV0YWRkciAoZ2QtPmJkLT5iaV9lbmV0YWRkcik7CiAjZW5kaWYKQEAgLTM3OCwxNiArMzg1LDE2IEBACiAJaWYgKChzID0gZ2V0ZW52ICgibG9hZGFkZHIiKSkgIT0gTlVMTCkgewogCQlsb2FkX2FkZHIgPSBzaW1wbGVfc3RydG91bCAocywgTlVMTCwgMTYpOwogCX0KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAlpZiAoKHMgPSBnZXRlbnYgKCJib290ZmlsZSIpKSAhPSBOVUxMKSB7CiAJCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCBzLCBzaXplb2YgKEJvb3RGaWxlKSk7CiAJfQotI2VuZGlmCS8qIENGR19DTURfTkVUICovCisjZW5kaWYKIAogI2lmZGVmIEJPQVJEX0xBVEVfSU5JVAogCWJvYXJkX2xhdGVfaW5pdCAoKTsKICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogI2lmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKIAlwdXRzICgiTmV0OiAgICIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJfYXZyMzIvTWFrZWZpbGUgYi9saWJfYXZyMzIvTWFrZWZpbGUKaW5kZXggY2YyMDgzNi4uYmIyOTM4ZiAxMDA2NDQKLS0tIGEvbGliX2F2cjMyL01ha2VmaWxlCisrKyBiL2xpYl9hdnIzMi9NYWtlZmlsZQpAQCAtMjksNyArMjksNyBAQAogCiBTT0JKUwk9IG1lbXNldC5vCiAKLUNPQkpTCT0gYm9hcmQubyBpbnRlcnJ1cHRzLm8gYXZyMzJfbGludXgubyBkaXY2NC5vCitDT0JKUwk9IGJvYXJkLm8gaW50ZXJydXB0cy5vIGF2cjMyX2xpbnV4Lm8KIAogU1JDUwk6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQogT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykgJChDT0JKUykpCmRpZmYgLS1naXQgYS9saWJfYXZyMzIvYm9hcmQuYyBiL2xpYl9hdnIzMi9ib2FyZC5jCmluZGV4IDI2NTMyOGEuLjhiOWNhMzggMTAwNjQ0Ci0tLSBhL2xpYl9hdnIzMi9ib2FyZC5jCisrKyBiL2xpYl9hdnIzMi9ib2FyZC5jCkBAIC0zMjgsNyArMzI4LDcgQEAKIAlqdW1wdGFibGVfaW5pdCgpOwogCWNvbnNvbGVfaW5pdF9yKCk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKICNpZiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCiAJcHV0cygiTmV0OiAgICIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJfYXZyMzIvZGl2NjQuYyBiL2xpYl9hdnIzMi9kaXY2NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTcyNmUzLi4wMDAwMDAwCi0tLSBhL2xpYl9hdnIzMi9kaXY2NC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMyBCZXJuYXJkbyBJbm5vY2VudGkgPGJlcm5pZUBkZXZlbGVyLmNvbT4KLSAqCi0gKiBCYXNlZCBvbiBmb3JtZXIgZG9fZGl2KCkgaW1wbGVtZW50YXRpb24gZnJvbSBhc20tcGFyaXNjL2RpdjY0Lmg6Ci0gKglDb3B5cmlnaHQgKEMpIDE5OTkgSGV3bGV0dC1QYWNrYXJkIENvCi0gKglDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgotICoKLSAqCi0gKiBHZW5lcmljIEMgdmVyc2lvbiBvZiA2NGJpdC8zMmJpdCBkaXZpc2lvbiBhbmQgbW9kdWxvLCB3aXRoCi0gKiA2NGJpdCByZXN1bHQgYW5kIDMyYml0IHJlbWFpbmRlci4KLSAqCi0gKiBUaGUgZmFzdCBjYXNlIGZvciAobj4+MzIgPT0gMCkgaXMgaGFuZGxlZCBpbmxpbmUgYnkgZG9fZGl2KCkuCi0gKgotICogQ29kZSBnZW5lcmF0ZWQgZm9yIHRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgdmVyeSBpbmVmZmljaWVudAotICogZm9yIHNvbWUgQ1BVcy4gX19kaXY2NF8zMigpIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGxpbmtpbmcgYXJjaC1zcGVjaWZpYwotICogYXNzZW1ibHkgdmVyc2lvbnMgc3VjaCBhcyBhcmNoL3BwYy9saWIvZGl2NjQuUyBhbmQgYXJjaC9zaC9saWIvZGl2NjQuUy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotCi11aW50MzJfdCBfX2RpdjY0XzMyKHVpbnQ2NF90ICpuLCB1aW50MzJfdCBiYXNlKQotewotCXVpbnQ2NF90IHJlbSA9ICpuOwotCXVpbnQ2NF90IGIgPSBiYXNlOwotCXVpbnQ2NF90IHJlcywgZCA9IDE7Ci0JdWludDMyX3QgaGlnaCA9IHJlbSA+PiAzMjsKLQotCS8qIFJlZHVjZSB0aGUgdGhpbmcgYSBiaXQgZmlyc3QgKi8KLQlyZXMgPSAwOwotCWlmIChoaWdoID49IGJhc2UpIHsKLQkJaGlnaCAvPSBiYXNlOwotCQlyZXMgPSAodWludDY0X3QpIGhpZ2ggPDwgMzI7Ci0JCXJlbSAtPSAodWludDY0X3QpIChoaWdoKmJhc2UpIDw8IDMyOwotCX0KLQotCXdoaWxlICgoaW50NjRfdCliID4gMCAmJiBiIDwgcmVtKSB7Ci0JCWIgPSBiK2I7Ci0JCWQgPSBkK2Q7Ci0JfQotCi0JZG8gewotCQlpZiAocmVtID49IGIpIHsKLQkJCXJlbSAtPSBiOwotCQkJcmVzICs9IGQ7Ci0JCX0KLQkJYiA+Pj0gMTsKLQkJZCA+Pj0gMTsKLQl9IHdoaWxlIChkKTsKLQotCSpuID0gcmVzOwotCXJldHVybiByZW07Ci19CmRpZmYgLS1naXQgYS9saWJfYmxhY2tmaW4vYm9hcmQuYyBiL2xpYl9ibGFja2Zpbi9ib2FyZC5jCmluZGV4IDE1MzhkYTMuLjM2YTk2OWUgMTAwNjQ0Ci0tLSBhL2xpYl9ibGFja2Zpbi9ib2FyZC5jCisrKyBiL2xpYl9ibGFja2Zpbi9ib2FyZC5jCkBAIC0yOTcsNyArMjk3LDcgQEAKIAl9CiAKIAljaGVja2JvYXJkKCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfUlRDX0JGNTMzKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19CRjUzMykgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAJcnRjX2luaXQoKTsKICNlbmRpZgogCXRpbWVyX2luaXQoKTsKQEAgLTM5MSwxMyArMzkxLDEzIEBACiAJaWYgKChzID0gZ2V0ZW52KCJsb2FkYWRkciIpKSAhPSBOVUxMKSB7CiAJCWxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKHMsIE5VTEwsIDE2KTsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJaWYgKChzID0gZ2V0ZW52KCJib290ZmlsZSIpKSAhPSBOVUxMKSB7CiAJCWNvcHlfZmlsZW5hbWUoQm9vdEZpbGUsIHMsIHNpemVvZihCb290RmlsZSkpOwogCX0KICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAlwdXRzKCJOQU5EOiAgIik7CiAJbmFuZF9pbml0KCk7CQkvKiBnbyBpbml0IHRoZSBOQU5EICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYl9nZW5lcmljL01ha2VmaWxlIGIvbGliX2dlbmVyaWMvTWFrZWZpbGUKaW5kZXggYjIwOTFjNS4uYmYzNzc1MiAxMDA2NDQKLS0tIGEvbGliX2dlbmVyaWMvTWFrZWZpbGUKKysrIGIvbGliX2dlbmVyaWMvTWFrZWZpbGUKQEAgLTI3LDcgKzI3LDcgQEAKIAogQ09CSlMJPSBiemxpYi5vIGJ6bGliX2NyY3RhYmxlLm8gYnpsaWJfZGVjb21wcmVzcy5vIFwKIAkgIGJ6bGliX3JhbmR0YWJsZS5vIGJ6bGliX2h1ZmZtYW4ubyBcCi0JICBjcmMzMi5vIGN0eXBlLm8gZGlzcGxheV9vcHRpb25zLm8gbGRpdi5vIHNoYTEubyBcCisJICBjcmMzMi5vIGN0eXBlLm8gZGlzcGxheV9vcHRpb25zLm8gZGl2NjQubyBsZGl2Lm8gc2hhMS5vIFwKIAkgIHN0cmluZy5vIHZzcHJpbnRmLm8gemxpYi5vCiAKIFNSQ1MgCTo9ICQoQ09CSlM6Lm89LmMpCmRpZmYgLS1naXQgYS9saWJfZ2VuZXJpYy9jcmMzMi5jIGIvbGliX2dlbmVyaWMvY3JjMzIuYwppbmRleCAzZDk5YjY5Li5kZjBkYmNhIDEwMDY0NAotLS0gYS9saWJfZ2VuZXJpYy9jcmMzMi5jCisrKyBiL2xpYl9nZW5lcmljL2NyYzMyLmMKQEAgLTksNyArOSw3IEBACiAgKi8KIAogI2lmbmRlZiBVU0VfSE9TVENDCS8qIFNodXQgZG93biAiQU5TSSBkb2VzIG5vdCBwZXJtaXQuLi4iIHdhcm5pbmdzICovCi0jaW5jbHVkZSA8Y29tbW9uLmg+CS8qIHRvIGdldCBjb21tYW5kIGRlZmluaXRpb25zIGxpa2UgQ0ZHX0NNRF9KRkZTMiAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgogI2VuZGlmCiAKICNpbmNsdWRlICJ6bGliLmgiCkBAIC0xNzEsOCArMTcxLDkgQEAKICAgICByZXR1cm4gY3JjIF4gMHhmZmZmZmZmZkw7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgfHwgXAotCSgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgfHwgXAorCShkZWZpbmVkKENPTkZJR19DTURfTkFORCkgXAorCSYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkpCiAKIC8qIE5vIG9uZXMgY29tcGxlbWVudCB2ZXJzaW9uLiBKRkZTMiAoYW5kIG90aGVyIHRoaW5ncyA/KQogICogZG9uJ3QgdXNlIG9uZXMgY29tcGxpbWVudCBpbiB0aGVpciBDUkMgY2FsY3VsYXRpb25zLgpAQCAtMTk1LDQgKzE5Niw0IEBACiAgICAgcmV0dXJuIGNyYzsKIH0KIAotI2VuZGlmCS8qIENGR19DTURfSkZGUzIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliX2dlbmVyaWMvZGl2NjQuYyBiL2xpYl9nZW5lcmljL2RpdjY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5NTFiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9nZW5lcmljL2RpdjY0LmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBCZXJuYXJkbyBJbm5vY2VudGkgPGJlcm5pZUBkZXZlbGVyLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBmb3JtZXIgZG9fZGl2KCkgaW1wbGVtZW50YXRpb24gZnJvbSBhc20tcGFyaXNjL2RpdjY0Lmg6CisgKglDb3B5cmlnaHQgKEMpIDE5OTkgSGV3bGV0dC1QYWNrYXJkIENvCisgKglDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgorICoKKyAqCisgKiBHZW5lcmljIEMgdmVyc2lvbiBvZiA2NGJpdC8zMmJpdCBkaXZpc2lvbiBhbmQgbW9kdWxvLCB3aXRoCisgKiA2NGJpdCByZXN1bHQgYW5kIDMyYml0IHJlbWFpbmRlci4KKyAqCisgKiBUaGUgZmFzdCBjYXNlIGZvciAobj4+MzIgPT0gMCkgaXMgaGFuZGxlZCBpbmxpbmUgYnkgZG9fZGl2KCkuCisgKgorICogQ29kZSBnZW5lcmF0ZWQgZm9yIHRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgdmVyeSBpbmVmZmljaWVudAorICogZm9yIHNvbWUgQ1BVcy4gX19kaXY2NF8zMigpIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGxpbmtpbmcgYXJjaC1zcGVjaWZpYworICogYXNzZW1ibHkgdmVyc2lvbnMgc3VjaCBhcyBhcmNoL3BwYy9saWIvZGl2NjQuUyBhbmQgYXJjaC9zaC9saWIvZGl2NjQuUy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwordWludDMyX3QgX19kaXY2NF8zMih1aW50NjRfdCAqbiwgdWludDMyX3QgYmFzZSkKK3sKKwl1aW50NjRfdCByZW0gPSAqbjsKKwl1aW50NjRfdCBiID0gYmFzZTsKKwl1aW50NjRfdCByZXMsIGQgPSAxOworCXVpbnQzMl90IGhpZ2ggPSByZW0gPj4gMzI7CisKKwkvKiBSZWR1Y2UgdGhlIHRoaW5nIGEgYml0IGZpcnN0ICovCisJcmVzID0gMDsKKwlpZiAoaGlnaCA+PSBiYXNlKSB7CisJCWhpZ2ggLz0gYmFzZTsKKwkJcmVzID0gKHVpbnQ2NF90KSBoaWdoIDw8IDMyOworCQlyZW0gLT0gKHVpbnQ2NF90KSAoaGlnaCpiYXNlKSA8PCAzMjsKKwl9CisKKwl3aGlsZSAoKGludDY0X3QpYiA+IDAgJiYgYiA8IHJlbSkgeworCQliID0gYitiOworCQlkID0gZCtkOworCX0KKworCWRvIHsKKwkJaWYgKHJlbSA+PSBiKSB7CisJCQlyZW0gLT0gYjsKKwkJCXJlcyArPSBkOworCQl9CisJCWIgPj49IDE7CisJCWQgPj49IDE7CisJfSB3aGlsZSAoZCk7CisKKwkqbiA9IHJlczsKKwlyZXR1cm4gcmVtOworfQpkaWZmIC0tZ2l0IGEvbGliX2kzODYvYm9hcmQuYyBiL2xpYl9pMzg2L2JvYXJkLmMKaW5kZXggNDE3NWZkYjFjLi40N2ZiYWI0IDEwMDY0NAotLS0gYS9saWJfaTM4Ni9ib2FyZC5jCisrKyBiL2xpYl9pMzg2L2JvYXJkLmMKQEAgLTMxMywxMyArMzEzLDEzIEBACiAJbWlzY19pbml0X3IoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKSAmJiAhKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpICYmICFkZWZpbmVkKENPTkZJR19DTURfSURFKQogCVdBVENIRE9HX1JFU0VUKCk7CiAJcHV0cyAoIlBDTUNJQToiKTsKIAlwY21jaWFfaW5pdCgpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCVdBVENIRE9HX1JFU0VUKCk7CiAJcHV0cygiS0dEQjogICIpOwogCWtnZGJfaW5pdCgpOwpAQCAtMzQ4LDMzICszNDgsMzMgQEAKIAlpZiAoKHMgPSBnZXRlbnYgKCJsb2FkYWRkciIpKSAhPSBOVUxMKSB7CiAJCWxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChzLCBOVUxMLCAxNik7CiAJfQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCWlmICgocyA9IGdldGVudiAoImJvb3RmaWxlIikpICE9IE5VTEwpIHsKIAkJY29weV9maWxlbmFtZSAoQm9vdEZpbGUsIHMsIHNpemVvZiAoQm9vdEZpbGUpKTsKIAl9Ci0jZW5kaWYgLyogQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogCiAJV0FUQ0hET0dfUkVTRVQoKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogCVdBVENIRE9HX1JFU0VUKCk7CiAJcHV0cygiSURFOiAgICIpOwogCWlkZV9pbml0KCk7Ci0jZW5kaWYgLyogQ0ZHX0NNRF9JREUgKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkKIAlXQVRDSERPR19SRVNFVCgpOwogCXB1dHMoIlNDU0k6ICAiKTsKIAlzY3NpX2luaXQoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiAJV0FUQ0hET0dfUkVTRVQoKTsKIAlwdXRzKCJET0M6ICAgIik7CiAJZG9jX2luaXQoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAjaWYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQogCVdBVENIRE9HX1JFU0VUKCk7CiAJcHV0cygiTmV0OiAgICIpOwpAQCAtMzgyLDcgKzM4Miw3IEBACiAJZXRoX2luaXRpYWxpemUoZ2QtPmJkKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiAoMCkKKyNpZiAoIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpKSAmJiAoMCkKIAlXQVRDSERPR19SRVNFVCgpOwogIyBpZmRlZiBERUJVRwogCXB1dHMgKCJSZXNldCBFdGhlcm5ldCBQSFlcbiIpOwpkaWZmIC0tZ2l0IGEvbGliX202OGsvYm9hcmQuYyBiL2xpYl9tNjhrL2JvYXJkLmMKaW5kZXggNmFhZjYwOS4uMjkzZmQwNCAxMDA2NDQKLS0tIGEvbGliX202OGsvYm9hcmQuYworKysgYi9saWJfbTY4ay9ib2FyZC5jCkBAIC0zNCwyMCArMzQsMjAgQEAKICNpbmNsdWRlIDxhc20vaW1tYXBfNTI3Mi5oPgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKICNpbmNsdWRlIDxpZGUuaD4KICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpCiAjaW5jbHVkZSA8c2NzaS5oPgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNpbmNsdWRlIDxrZ2RiLmg+CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfU1RBVFVTX0xFRAogI2luY2x1ZGUgPHN0YXR1c19sZWQuaD4KICNlbmRpZgogI2luY2x1ZGUgPG5ldC5oPgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogI2luY2x1ZGUgPGNtZF9iZWRidWcuaD4KICNlbmRpZgogI2lmZGVmIENGR19BTExPQ19EUFJBTQpAQCAtNTg0LDcgKzU4NCw3IEBACiAJbWlzY19pbml0X3IgKCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJV0FUQ0hET0dfUkVTRVQgKCk7CiAJcHV0cyAoIktHREI6ICAiKTsKIAlrZ2RiX2luaXQgKCk7CkBAIC02MjAsMjcgKzYyMCwyNyBAQAogCWlmICgocyA9IGdldGVudiAoImxvYWRhZGRyIikpICE9IE5VTEwpIHsKIAkJbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwgKHMsIE5VTEwsIDE2KTsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJaWYgKChzID0gZ2V0ZW52ICgiYm9vdGZpbGUiKSkgIT0gTlVMTCkgewogCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgcywgc2l6ZW9mIChCb290RmlsZSkpOwogCX0KLSNlbmRpZiAvKiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAKIAlXQVRDSERPR19SRVNFVCAoKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogCVdBVENIRE9HX1JFU0VUICgpOwogCXB1dHMgKCJET0M6ICAgIik7CiAJZG9jX2luaXQgKCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAJV0FUQ0hET0dfUkVTRVQgKCk7CiAJcHV0cyAoIk5BTkQ6ICAiKTsKIAluYW5kX2luaXQoKTsJCS8qIGdvIGluaXQgdGhlIE5BTkQgKi8KICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKEZFQ19FTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoRkVDX0VORVQpCiAJV0FUQ0hET0dfUkVTRVQoKTsKIAlldGhfaW5pdChiZCk7CiAjZW5kaWYKQEAgLTY1OSw3ICs2NTksNyBAQAogCWxhc3Rfc3RhZ2VfaW5pdCAoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiAJV0FUQ0hET0dfUkVTRVQgKCk7CiAJYmVkYnVnX2luaXQgKCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYl9taWNyb2JsYXplL2JvYXJkLmMgYi9saWJfbWljcm9ibGF6ZS9ib2FyZC5jCmluZGV4IGM5NTEyNWEuLjA5ZDRkOTQgMTAwNjQ0Ci0tLSBhL2xpYl9taWNyb2JsYXplL2JvYXJkLmMKKysrIGIvbGliX21pY3JvYmxhemUvYm9hcmQuYwpAQCAtNDAsNyArNDAsNyBAQAogI2lmZGVmIENGR19JTlRDXzAKIGV4dGVybiBpbnQgaW50ZXJydXB0c19pbml0ICh2b2lkKTsKICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogZXh0ZXJuIGludCBldGhfaW5pdCAoYmRfdCAqIGJpcyk7CiBleHRlcm4gaW50IGdldGVudl9JUGFkZHIgKGNoYXIgKik7CiAjZW5kaWYKQEAgLTEwOCw3ICsxMDgsNyBAQAogCWJkX3QgKmJkOwogCWluaXRfZm5jX3QgKippbml0X2ZuY19wdHI7CiAJZ2QgPSAoZ2RfdCAqKSBDRkdfR0JMX0RBVEFfT0ZGU0VUOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZMQVNIKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GTEFTSCkKIAl1bG9uZyBmbGFzaF9zaXplID0gMDsKICNlbmRpZgogCWFzbSAoIm5vcCIpOwkvKiBGSVhNRSBnZCBpcyBub3QgaW5pdGlhbGl6ZSAtIHdhaXQgKi8KQEAgLTEzMCw3ICsxMzAsNyBAQAogCQl9CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkxBU0gpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZMQVNIKQogCWJkLT5iaV9mbGFzaHN0YXJ0ID0gQ0ZHX0ZMQVNIX0JBU0U7CiAJaWYgKDAgPCAoZmxhc2hfc2l6ZSA9IGZsYXNoX2luaXQgKCkpKSB7CiAJCWJkLT5iaV9mbGFzaHNpemUgPSBmbGFzaF9zaXplOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJfQogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAljaGFyICpzLCAqZTsKIAlpbnQgaTsKIAkvKiBib2FyZCBNQUMgYWRkcmVzcyAqLwpkaWZmIC0tZ2l0IGEvbGliX21pcHMvYm9hcmQuYyBiL2xpYl9taXBzL2JvYXJkLmMKaW5kZXggYjdkMzM1Ni4uOTFjY2VjMCAxMDA2NDQKLS0tIGEvbGliX21pcHMvYm9hcmQuYworKysgYi9saWJfbWlwcy9ib2FyZC5jCkBAIC0zOTksMTggKzM5OSwxOCBAQAogCWlmICgocyA9IGdldGVudiAoImxvYWRhZGRyIikpICE9IE5VTEwpIHsKIAkJbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwgKHMsIE5VTEwsIDE2KTsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJaWYgKChzID0gZ2V0ZW52ICgiYm9vdGZpbGUiKSkgIT0gTlVMTCkgewogCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgcywgc2l6ZW9mIChCb290RmlsZSkpOwogCX0KLSNlbmRpZgkvKiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19NSVNDX0lOSVRfUikKIAkvKiBtaXNjZWxsYW5lb3VzIHBsYXRmb3JtIGRlcGVuZGVudCBpbml0aWFsaXNhdGlvbnMgKi8KIAltaXNjX2luaXRfciAoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAjaWYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQogCXB1dHMgKCJOZXQ6ICAgIik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYl9wcGMvYm9hcmQuYyBiL2xpYl9wcGMvYm9hcmQuYwppbmRleCAzYjFiZmVhLi5jODdkNDZjIDEwMDY0NAotLS0gYS9saWJfcHBjL2JvYXJkLmMKKysrIGIvbGliX3BwYy9ib2FyZC5jCkBAIC0zNSwxMyArMzUsMTMgQEAKICNpZmRlZiBDT05GSUdfTVBDNXh4eAogI2luY2x1ZGUgPG1wYzV4eHguaD4KICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogI2luY2x1ZGUgPGlkZS5oPgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkKICNpbmNsdWRlIDxzY3NpLmg+CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2luY2x1ZGUgPGtnZGIuaD4KICNlbmRpZgogI2lmZGVmIENPTkZJR19TVEFUVVNfTEVECkBAIC04MCwxNCArODAsMTQgQEAKIGV4dGVybiB2b2lkIHNjM19yZWFkX2VlcHJvbSh2b2lkKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiB2b2lkIGRvY19pbml0ICh2b2lkKTsKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0hBUkRfSTJDKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfU09GVF9JMkMpCiAjaW5jbHVkZSA8aTJjLmg+CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogdm9pZCBuYW5kX2luaXQgKHZvaWQpOwogI2VuZGlmCiAKQEAgLTExOCw3ICsxMTgsNyBAQAogZXh0ZXJuIHVsb25nIF9lbmQ7CiB1bG9uZyBtb25pdG9yX2ZsYXNoX2xlbjsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogI2luY2x1ZGUgPGJlZGJ1Zy90eXBlLmg+CiAjZW5kaWYKIApAQCAtMTM5LDEwICsxMzksMTAgQEAKICAqLwogc3RhdGljIHZvaWQgbWVtX21hbGxvY19pbml0ICh2b2lkKQogewotCXVsb25nIGRlc3RfYWRkciA9IENGR19NT05JVE9SX0JBU0UgKyBnZC0+cmVsb2Nfb2ZmOwotCi0JbWVtX21hbGxvY19lbmQgPSBkZXN0X2FkZHI7Ci0JbWVtX21hbGxvY19zdGFydCA9IGRlc3RfYWRkciAtIFRPVEFMX01BTExPQ19MRU47CisjaWYgIWRlZmluZWQoQ09ORklHX1JFTE9DX0ZJWFVQX1dPUktTKQorCW1lbV9tYWxsb2NfZW5kID0gQ0ZHX01PTklUT1JfQkFTRSArIGdkLT5yZWxvY19vZmY7CisjZW5kaWYKKwltZW1fbWFsbG9jX3N0YXJ0ID0gbWVtX21hbGxvY19lbmQgLSBUT1RBTF9NQUxMT0NfTEVOOwogCW1lbV9tYWxsb2NfYnJrID0gbWVtX21hbGxvY19zdGFydDsKIAogCW1lbXNldCAoKHZvaWQgKikgbWVtX21hbGxvY19zdGFydCwKQEAgLTMwOSw3ICszMDksOSBAQAogCXBydF84MjYwX3JzciwKIAlwcnRfODI2MF9jbGtzLAogI2VuZGlmIC8qIENPTkZJR184MjYwICovCi0KKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4M1hYKQorCXBydF84M3h4X3JzciwKKyNlbmRpZgogCWNoZWNrY3B1LAogI2lmIGRlZmluZWQoQ09ORklHX01QQzV4eHgpCiAJcHJ0X21wYzV4eHhfY2xrcywKQEAgLTM3Niw3ICszNzgsNyBAQAogCS8qIGNvbXBpbGVyIG9wdGltaXphdGlvbiBiYXJyaWVyIG5lZWRlZCBmb3IgR0NDID49IDMuNCAqLwogCV9fYXNtX18gX192b2xhdGlsZV9fKCIiOiA6IDoibWVtb3J5Iik7CiAKLSNpZiAhZGVmaW5lZChDT05GSUdfQ1BNMikKKyNpZiAhZGVmaW5lZChDT05GSUdfQ1BNMikgJiYgIWRlZmluZWQoQ09ORklHX01QQzgzWFgpCiAJLyogQ2xlYXIgaW5pdGlhbCBnbG9iYWwgZGF0YSAqLwogCW1lbXNldCAoKHZvaWQgKikgZ2QsIDAsIHNpemVvZiAoZ2RfdCkpOwogI2VuZGlmCkBAIC02MjAsNyArNjIyLDEzIEBACiAJYmQgPSBnZC0+YmQ7CiAKIAlnZC0+ZmxhZ3MgfD0gR0RfRkxHX1JFTE9DOwkvKiB0ZWxsIG90aGVyczogcmVsb2NhdGlvbiBkb25lICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19SRUxPQ19GSVhVUF9XT1JLUykKKwlnZC0+cmVsb2Nfb2ZmID0gMDsKKwltZW1fbWFsbG9jX2VuZCA9IGRlc3RfYWRkcjsKKyNlbHNlCiAJZ2QtPnJlbG9jX29mZiA9IGRlc3RfYWRkciAtIENGR19NT05JVE9SX0JBU0U7CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TRVJJQUxfTVVMVEkKIAlzZXJpYWxfaW5pdGlhbGl6ZSgpOwpAQCAtNzc5LDcgKzc4Nyw3IEBACiAJc3BpX2luaXRfciAoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAlXQVRDSERPR19SRVNFVCAoKTsKIAlwdXRzICgiTkFORDogICIpOwogCW5hbmRfaW5pdCgpOwkJLyogZ28gaW5pdCB0aGUgTkFORCAqLwpAQCAtOTQyLDcgKzk1MCw3IEBACiAJCWhlcm1lc19zdGFydF9seHQ5ODAgKChpbnQpIGJkLT5iaV9ldGhzcGVlZCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJV0FUQ0hET0dfUkVTRVQgKCk7CiAJcHV0cyAoIktHREI6ICAiKTsKIAlrZ2RiX2luaXQgKCk7CkBAIC05NzQsMjcgKzk4MiwyNyBAQAogCWlmICgocyA9IGdldGVudiAoImxvYWRhZGRyIikpICE9IE5VTEwpIHsKIAkJbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwgKHMsIE5VTEwsIDE2KTsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJaWYgKChzID0gZ2V0ZW52ICgiYm9vdGZpbGUiKSkgIT0gTlVMTCkgewogCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgcywgc2l6ZW9mIChCb290RmlsZSkpOwogCX0KLSNlbmRpZiAvKiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAKIAlXQVRDSERPR19SRVNFVCAoKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpCiAJV0FUQ0hET0dfUkVTRVQgKCk7CiAJcHV0cyAoIlNDU0k6ICAiKTsKIAlzY3NpX2luaXQgKCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogCVdBVENIRE9HX1JFU0VUICgpOwogCXB1dHMgKCJET0M6ICAgIik7CiAJZG9jX2luaXQgKCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogI2lmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKIAlXQVRDSERPR19SRVNFVCAoKTsKIAlwdXRzICgiTmV0OiAgICIpOwpAQCAtMTAwMiw3ICsxMDEwLDcgQEAKIAlldGhfaW5pdGlhbGl6ZSAoYmQpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmICggXAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmICggXAogICAgIGRlZmluZWQoQ09ORklHX0NDTSkJCXx8IFwKICAgICBkZWZpbmVkKENPTkZJR19FTFBUODYwKQl8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfRVA4MjYwKQl8fCBcCkBAIC0xMDI3LDEzICsxMDM1LDE0IEBACiAJcG9zdF9ydW4gKE5VTEwsIFBPU1RfUkFNIHwgcG9zdF9ib290bW9kZV9nZXQoMCkpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpICYmICEoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkgXAorICAgICYmICFkZWZpbmVkKENPTkZJR19DTURfSURFKQogCVdBVENIRE9HX1JFU0VUICgpOwogCXB1dHMgKCJQQ01DSUE6Iik7CiAJcGNtY2lhX2luaXQgKCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogCVdBVENIRE9HX1JFU0VUICgpOwogIyBpZmRlZglDT05GSUdfSURFXzh4eF9QQ0NBUkQKIAlwdXRzICgiUENNQ0lBOiIpOwpAQCAtMTA0Niw3ICsxMDU1LDcgQEAKICNlbHNlCiAJaWRlX2luaXQgKCk7CiAjZW5kaWYKLSNlbmRpZiAvKiBDRkdfQ01EX0lERSAqLworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTEFTVF9TVEFHRV9JTklUCiAJV0FUQ0hET0dfUkVTRVQgKCk7CkBAIC0xMDU4LDcgKzEwNjcsNyBAQAogCWxhc3Rfc3RhZ2VfaW5pdCAoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiAJV0FUQ0hET0dfUkVTRVQgKCk7CiAJYmVkYnVnX2luaXQgKCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYl9wcGMva2dkYi5jIGIvbGliX3BwYy9rZ2RiLmMKaW5kZXggNGM1ZDc5YS4uNzhjMmYwYyAxMDA2NDQKLS0tIGEvbGliX3BwYy9rZ2RiLmMKKysrIGIvbGliX3BwYy9rZ2RiLmMKQEAgLTEsNyArMSw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAogI2luY2x1ZGUgPGtnZGIuaD4KICNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CkBAIC0zMjMsNCArMzIzLDQgQEAKIAkgICAgIik7CiB9CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0tHREIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliZmR0L2ZkdC5jIGIvbGliZmR0L2ZkdC5jCmluZGV4IDIxMmI4MzguLjFlZTY3YWQgMTAwNjQ0Ci0tLSBhL2xpYmZkdC9mZHQuYworKysgYi9saWJmZHQvZmR0LmMKQEAgLTE2LDYgKzE2LDkgQEAKICAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgQ09ORklHX09GX0xJQkZEVAorCiAjaW5jbHVkZSAibGliZmR0X2Vudi5oIgogCiAjaW5jbHVkZSA8ZmR0Lmg+CkBAIC04MywzICs4Niw1IEBACiAJbWVtbW92ZShidWYsIGZkdCwgZmR0X3RvdGFsc2l6ZShmZHQpKTsKIAlyZXR1cm4gMDsKIH0KKworI2VuZGlmIC8qIENPTkZJR19PRl9MSUJGRFQgKi8KZGlmZiAtLWdpdCBhL2xpYmZkdC9mZHRfcm8uYyBiL2xpYmZkdC9mZHRfcm8uYwppbmRleCA0ZTJjMzI1Li40NmQ1MjVkIDEwMDY0NAotLS0gYS9saWJmZHQvZmR0X3JvLmMKKysrIGIvbGliZmR0L2ZkdF9yby5jCkBAIC0xNiw2ICsxNiw5IEBACiAgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmIENPTkZJR19PRl9MSUJGRFQKKwogI2luY2x1ZGUgImxpYmZkdF9lbnYuaCIKIAogI2luY2x1ZGUgPGZkdC5oPgpAQCAtNDgsNiArNTEsMzMgQEAKIH0KIAogLyoKKyAqIENoZWNrcyBpZiB0aGUgcHJvcGVydHkgbmFtZSBtYXRjaGVzLgorICovCitzdGF0aWMgaW50IHByb3BfbmFtZV9lcShjb25zdCB2b2lkICpmZHQsIGludCBvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQlzdHJ1Y3QgZmR0X3Byb3BlcnR5ICoqcHJvcCwgaW50ICpsZW5wKQoreworCWludCBuYW1lc3Ryb2ZmLCBsZW47CisKKwkqcHJvcCA9IGZkdF9vZmZzZXRfcHRyX3R5cGVkKGZkdCwgb2Zmc2V0LCAqcHJvcCk7CisJaWYgKCEgKnByb3ApCisJCXJldHVybiAtRkRUX0VSUl9CQURTVFJVQ1RVUkU7CisKKwluYW1lc3Ryb2ZmID0gZmR0MzJfdG9fY3B1KCgqcHJvcCktPm5hbWVvZmYpOworCWlmIChzdHJlcShmZHRfc3RyaW5nKGZkdCwgbmFtZXN0cm9mZiksIG5hbWUpKSB7CisJCWxlbiA9IGZkdDMyX3RvX2NwdSgoKnByb3ApLT5sZW4pOworCQkqcHJvcCA9IGZkdF9vZmZzZXRfcHRyKGZkdCwgb2Zmc2V0LAorCQkJCSAgICAgICBzaXplb2YoKipwcm9wKSArIGxlbik7CisJCWlmICgqcHJvcCkgeworCQkJaWYgKGxlbnApCisJCQkJKmxlbnAgPSBsZW47CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUZEVF9FUlJfQkFEU1RSVUNUVVJFOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKICAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIG9mZnNldC4KICAqLwogY2hhciAqZmR0X3N0cmluZyhjb25zdCB2b2lkICpmZHQsIGludCBzdHJvZmZzZXQpCkBAIC01Niw2ICs4NiwxMTggQEAKIH0KIAogLyoKKyAqIENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBjb21wYXRpYmxlIGJ5IGNvbXBhcmluZyB0aGUgdG9rZW5zCisgKiBpbiBpdHMgImNvbXBhdGlibGUiIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBzdHJpbmc6CisgKgorICogICBub2Rlb2Zmc2V0IC0gc3RhcnRpbmcgcGxhY2Ugb2YgdGhlIG5vZGUKKyAqICAgY29tcGF0ICAgICAtIHRoZSBzdHJpbmcgdG8gbWF0Y2ggdG8gb25lIG9mIHRoZSB0b2tlbnMgaW4gdGhlCisgKiAgICAgICAgICAgICAgICAiY29tcGF0aWJsZSIgbGlzdC4KKyAqLworaW50IGZkdF9ub2RlX2lzX2NvbXBhdGlibGUoY29uc3Qgdm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwKKwkJCSAgIGNvbnN0IGNoYXIgKmNvbXBhdCkKK3sKKwljb25zdCBjaGFyKiBjcDsKKwlpbnQgY3BsZW4sIGxlbjsKKworCWNwID0gZmR0X2dldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCAiY29tcGF0aWJsZSIsICZjcGxlbik7CisJaWYgKGNwID09IE5VTEwpCisJCXJldHVybiAwOworCXdoaWxlIChjcGxlbiA+IDApIHsKKwkJaWYgKHN0cm5jbXAoY3AsIGNvbXBhdCwgc3RybGVuKGNvbXBhdCkpID09IDApCisJCQlyZXR1cm4gMTsKKwkJbGVuID0gc3RybGVuKGNwKSArIDE7CisJCWNwICs9IGxlbjsKKwkJY3BsZW4gLT0gbGVuOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogRmluZCBhIG5vZGUgYnkgaXRzIGRldmljZSB0eXBlIHByb3BlcnR5LiBPbiBzdWNjZXNzLCB0aGUgb2Zmc2V0IG9mIHRoYXQKKyAqIG5vZGUgaXMgcmV0dXJuZWQgb3IgYW4gZXJyb3IgY29kZSBvdGhlcndpc2U6CisgKgorICogICBub2Rlb2Zmc2V0IC0gdGhlIG5vZGUgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gb3IgMCwgdGhlIG5vZGUgeW91IHBhc3MKKyAqICAgICAgICAgICAgICAgIHdpbGwgbm90IGJlIHNlYXJjaGVkLCBvbmx5IHRoZSBuZXh0IG9uZSB3aWxsOyB0eXBpY2FsbHksCisgKiAgICAgICAgICAgICAgICB5b3UgcGFzcyAwIHRvIHN0YXJ0IHRoZSBzZWFyY2ggYW5kIHRoZW4gd2hhdCB0aGUgcHJldmlvdXMKKyAqICAgICAgICAgICAgICAgIGNhbGwgcmV0dXJuZWQuCisgKiAgIHR5cGUgICAgICAgLSB0aGUgZGV2aWNlIHR5cGUgc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QuCisgKi8KK2ludCBmZHRfZmluZF9ub2RlX2J5X3R5cGUoY29uc3Qgdm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpbnQgb2Zmc2V0LCBuZXh0b2Zmc2V0OworCXN0cnVjdCBmZHRfcHJvcGVydHkgKnByb3A7CisJdWludDMyX3QgdGFnOworCWludCBsZW4sIHJldDsKKworCUNIRUNLX0hFQURFUihmZHQpOworCisJdGFnID0gZmR0X25leHRfdGFnKGZkdCwgbm9kZW9mZnNldCwgJm5leHRvZmZzZXQsIE5VTEwpOworCWlmICh0YWcgIT0gRkRUX0JFR0lOX05PREUpCisJCXJldHVybiAtRkRUX0VSUl9CQURPRkZTRVQ7CisJaWYgKG5vZGVvZmZzZXQpCisJCW5vZGVvZmZzZXQgPSAwOwkvKiBzdGFydCBzZWFyY2hpbmcgd2l0aCBuZXh0IG5vZGUgKi8KKworCXdoaWxlICgxKSB7CisJCW9mZnNldCA9IG5leHRvZmZzZXQ7CisJCXRhZyA9IGZkdF9uZXh0X3RhZyhmZHQsIG9mZnNldCwgJm5leHRvZmZzZXQsIE5VTEwpOworCisJCXN3aXRjaCAodGFnKSB7CisJCWNhc2UgRkRUX0JFR0lOX05PREU6CisJCQlub2Rlb2Zmc2V0ID0gb2Zmc2V0OworCQkJYnJlYWs7CisKKwkJY2FzZSBGRFRfUFJPUDoKKwkJCWlmIChub2Rlb2Zmc2V0ID09IDApCisJCQkJYnJlYWs7CisJCQlyZXQgPSBwcm9wX25hbWVfZXEoZmR0LCBvZmZzZXQsICJkZXZpY2VfdHlwZSIsCisJCQkJCSAgICZwcm9wLCAmbGVuKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQllbHNlIGlmIChyZXQgPiAwICYmCisJCQkJIHN0cm5jbXAocHJvcC0+ZGF0YSwgdHlwZSwgbGVuIC0gMSkgPT0gMCkKKwkJCSAgICByZXR1cm4gbm9kZW9mZnNldDsKKwkJCWJyZWFrOworCisJCWNhc2UgRkRUX0VORF9OT0RFOgorCQljYXNlIEZEVF9OT1A6CisJCQlicmVhazsKKworCQljYXNlIEZEVF9FTkQ6CisJCQlyZXR1cm4gLUZEVF9FUlJfTk9URk9VTkQ7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRkRUX0VSUl9CQURTVFJVQ1RVUkU7CisJCX0KKwl9Cit9CisKKy8qCisgKiBGaW5kIGEgbm9kZSBiYXNlZCBvbiBpdHMgZGV2aWNlIHR5cGUgYW5kIG9uZSBvZiB0aGUgdG9rZW5zIGluIGl0cyBpdHMKKyAqICJjb21wYXRpYmxlIiBwcm9wZXJ0eS4gT24gc3VjY2VzcywgdGhlIG9mZnNldCBvZiB0aGF0IG5vZGUgaXMgcmV0dXJuZWQKKyAqIG9yIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlOgorICoKKyAqICAgbm9kZW9mZnNldCAtIHRoZSBub2RlIHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIG9yIDAsIHRoZSBub2RlIHlvdSBwYXNzCisgKiAgICAgICAgICAgICAgICB3aWxsIG5vdCBiZSBzZWFyY2hlZCwgb25seSB0aGUgbmV4dCBvbmUgd2lsbDsgdHlwaWNhbGx5LAorICogICAgICAgICAgICAgICAgeW91IHBhc3MgMCB0byBzdGFydCB0aGUgc2VhcmNoIGFuZCB0aGVuIHdoYXQgdGhlIHByZXZpb3VzCisgKiAgICAgICAgICAgICAgICBjYWxsIHJldHVybmVkLgorICogICB0eXBlICAgICAgIC0gdGhlIGRldmljZSB0eXBlIHN0cmluZyB0byBtYXRjaCBhZ2FpbnN0LgorICogICBjb21wYXQgICAgIC0gdGhlIHN0cmluZyB0byBtYXRjaCB0byBvbmUgb2YgdGhlIHRva2VucyBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICJjb21wYXRpYmxlIiBsaXN0LgorICovCitpbnQgZmR0X2ZpbmRfY29tcGF0aWJsZV9ub2RlKGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsCisJCQkgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmNvbXBhdCkKK3sKKwlpbnQgb2Zmc2V0OworCisJb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV90eXBlKGZkdCwgbm9kZW9mZnNldCwgdHlwZSk7CisJaWYgKG9mZnNldCA8IDAgfHwgZmR0X25vZGVfaXNfY29tcGF0aWJsZShmZHQsIG9mZnNldCwgY29tcGF0KSkKKwkJcmV0dXJuIG9mZnNldDsKKworCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKK30KKworLyoKICAqIFJldHVybiB0aGUgbm9kZSBvZmZzZXQgb2YgdGhlIG5vZGUgc3BlY2lmaWVkIGJ5OgogICogICBwYXJlbnRvZmZzZXQgLSBzdGFydGluZyBwbGFjZSAoMCB0byBzdGFydCBhdCB0aGUgcm9vdCkKICAqICAgbmFtZSAgICAgICAgIC0gbmFtZSBiZWluZyBzZWFyY2hlZCBmb3IKQEAgLTEyOSw3ICsyNzEsNyBAQAogICogU2VhcmNoZXMgZm9yIHRoZSBub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHBhdGggYW5kIHJldHVybnMgdGhlCiAgKiBvZmZzZXQgb2YgdGhhdCBub2RlLgogICovCi1pbnQgZmR0X3BhdGhfb2Zmc2V0KGNvbnN0IHZvaWQgKmZkdCwgY29uc3QgY2hhciAqcGF0aCkKK2ludCBmZHRfZmluZF9ub2RlX2J5X3BhdGgoY29uc3Qgdm9pZCAqZmR0LCBjb25zdCBjaGFyICpwYXRoKQogewogCWNvbnN0IGNoYXIgKmVuZCA9IHBhdGggKyBzdHJsZW4ocGF0aCk7CiAJY29uc3QgY2hhciAqcCA9IHBhdGg7CkBAIC0xNDEsNiArMjgzLDEwIEBACiAJaWYgKCpwYXRoICE9ICcvJykKIAkJcmV0dXJuIC1GRFRfRVJSX0JBRFBBVEg7CiAKKwkvKiBIYW5kbGUgdGhlIHJvb3QgcGF0aDogcm9vdCBvZmZzZXQgaXMgMCAqLworCWlmIChzdHJjbXAocGF0aCwgIi8iKSA9PSAwKQorCQlyZXR1cm4gMDsKKwogCXdoaWxlICgqcCkgewogCQljb25zdCBjaGFyICpxOwogCkBAIC0xODQsNyArMzMwLDYgQEAKIAlpbnQgbGV2ZWwgPSAwOwogCXVpbnQzMl90IHRhZzsKIAlzdHJ1Y3QgZmR0X3Byb3BlcnR5ICpwcm9wOwotCWludCBuYW1lc3Ryb2ZmOwogCWludCBvZmZzZXQsIG5leHRvZmZzZXQ7CiAJaW50IGVycjsKIApAQCAtMjI0LDI0ICszNjksMTEgQEAKIAkJCWlmIChsZXZlbCAhPSAwKQogCQkJCWNvbnRpbnVlOwogCi0JCQllcnIgPSAtRkRUX0VSUl9CQURTVFJVQ1RVUkU7Ci0JCQlwcm9wID0gZmR0X29mZnNldF9wdHJfdHlwZWQoZmR0LCBvZmZzZXQsIHByb3ApOwotCQkJaWYgKCEgcHJvcCkKLQkJCQlnb3RvIGZhaWw7Ci0JCQluYW1lc3Ryb2ZmID0gZmR0MzJfdG9fY3B1KHByb3AtPm5hbWVvZmYpOwotCQkJaWYgKHN0cmVxKGZkdF9zdHJpbmcoZmR0LCBuYW1lc3Ryb2ZmKSwgbmFtZSkpIHsKLQkJCQkvKiBGb3VuZCBpdCEgKi8KLQkJCQlpbnQgbGVuID0gZmR0MzJfdG9fY3B1KHByb3AtPmxlbik7Ci0JCQkJcHJvcCA9IGZkdF9vZmZzZXRfcHRyKGZkdCwgb2Zmc2V0LAotCQkJCQkJICAgICAgc2l6ZW9mKCpwcm9wKStsZW4pOwotCQkJCWlmICghIHByb3ApCi0JCQkJCWdvdG8gZmFpbDsKLQotCQkJCWlmIChsZW5wKQotCQkJCQkqbGVucCA9IGxlbjsKLQorCQkJZXJyID0gcHJvcF9uYW1lX2VxKGZkdCwgb2Zmc2V0LCBuYW1lLCAmcHJvcCwgbGVucCk7CisJCQlpZiAoZXJyID4gMCkKIAkJCQlyZXR1cm4gcHJvcDsKLQkJCX0KKwkJCWVsc2UgaWYgKGVyciA8IDApCisJCQkJZ290byBmYWlsOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBGRFRfTk9QOgpAQCAtNDAwLDMgKzUzMiw1IEBACiAJfQogCXJldHVybiAwOwogfQorCisjZW5kaWYgLyogQ09ORklHX09GX0xJQkZEVCAqLwpkaWZmIC0tZ2l0IGEvbGliZmR0L2ZkdF9ydy5jIGIvbGliZmR0L2ZkdF9ydy5jCmluZGV4IGFhYWZjNTMuLjY5M2JmZTQgMTAwNjQ0Ci0tLSBhL2xpYmZkdC9mZHRfcncuYworKysgYi9saWJmZHQvZmR0X3J3LmMKQEAgLTE2LDYgKzE2LDkgQEAKICAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgQ09ORklHX09GX0xJQkZEVAorCiAjaW5jbHVkZSAibGliZmR0X2Vudi5oIgogCiAjaW5jbHVkZSA8ZmR0Lmg+CkBAIC0yOTEsMyArMjk0LDUgQEAKIAlmZHRfc2V0X2hlYWRlcihmZHQsIHRvdGFsc2l6ZSwgX2Jsb2JfZGF0YV9zaXplKGZkdCkpOwogCXJldHVybiAwOwogfQorCisjZW5kaWYgLyogQ09ORklHX09GX0xJQkZEVCAqLwpkaWZmIC0tZ2l0IGEvbGliZmR0L2ZkdF9zdHJlcnJvci5jIGIvbGliZmR0L2ZkdF9zdHJlcnJvci5jCmluZGV4IDdmMjMxY2UuLmI0OWM5NTIgMTAwNjQ0Ci0tLSBhL2xpYmZkdC9mZHRfc3RyZXJyb3IuYworKysgYi9saWJmZHQvZmR0X3N0cmVycm9yLmMKQEAgLTE2LDYgKzE2LDkgQEAKICAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgQ09ORklHX09GX0xJQkZEVAorCiAjaW5jbHVkZSAibGliZmR0X2Vudi5oIgogCiAjaW5jbHVkZSA8ZmR0Lmg+CkBAIC02MiwzICs2NSw1IEBACiAKIAlyZXR1cm4gIjx1bmtub3duIGVycm9yPiI7CiB9CisKKyNlbmRpZiAvKiBDT05GSUdfT0ZfTElCRkRUICovCmRpZmYgLS1naXQgYS9saWJmZHQvZmR0X3N3LmMgYi9saWJmZHQvZmR0X3N3LmMKaW5kZXggNjcyZjRkZC4uYzdlZWE4ZiAxMDA2NDQKLS0tIGEvbGliZmR0L2ZkdF9zdy5jCisrKyBiL2xpYmZkdC9mZHRfc3cuYwpAQCAtMTYsNiArMTYsOSBAQAogICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBDT05GSUdfT0ZfTElCRkRUCisKICNpbmNsdWRlICJsaWJmZHRfZW52LmgiCiAKICNpbmNsdWRlIDxmZHQuaD4KQEAgLTIyNCwzICsyMjcsNSBAQAogCWZkdF9zZXRfaGVhZGVyKGZkdCwgbWFnaWMsIEZEVF9NQUdJQyk7CiAJcmV0dXJuIDA7CiB9CisKKyNlbmRpZiAvKiBDT05GSUdfT0ZfTElCRkRUICovCmRpZmYgLS1naXQgYS9saWJmZHQvZmR0X3dpcC5jIGIvbGliZmR0L2ZkdF93aXAuYwppbmRleCAyZDJlZDM3Li4yZDM5YWFiIDEwMDY0NAotLS0gYS9saWJmZHQvZmR0X3dpcC5jCisrKyBiL2xpYmZkdC9mZHRfd2lwLmMKQEAgLTE2LDYgKzE2LDkgQEAKICAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgQ09ORklHX09GX0xJQkZEVAorCiAjaW5jbHVkZSAibGliZmR0X2Vudi5oIgogCiAjaW5jbHVkZSA8ZmR0Lmg+CkBAIC0xMzUsMyArMTM4LDUgQEAKIAogCXJldHVybiAwOwogfQorCisjZW5kaWYgLyogQ09ORklHX09GX0xJQkZEVCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2Jvb3RwLmMgYi9uZXQvYm9vdHAuYwppbmRleCAxZGU5YThmLi5iZTFlZTMzIDEwMDY0NAotLS0gYS9uZXQvYm9vdHAuYworKysgYi9uZXQvYm9vdHAuYwpAQCAtMzEsNyArMzEsNyBAQAogCiAjZGVmaW5lIEJPT1RQX1ZFTkRPUl9NQUdJQwkweDYzODI1MzYzCS8qIFJGQzEwNDggTWFnaWMgQ29va2llCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKICNkZWZpbmUgVElNRU9VVAkJNQkJLyogU2Vjb25kcyBiZWZvcmUgdHJ5aW5nIEJPT1RQIGFnYWluCSovCiAjaWZuZGVmIENPTkZJR19ORVRfUkVUUllfQ09VTlQKQEAgLTUzLDcgKzUzLDcgQEAKIHVsb25nCQlzZWVkMSwgc2VlZDI7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RIQ1ApCiBkaGNwX3N0YXRlX3QgZGhjcF9zdGF0ZSA9IElOSVQ7CiB1bnNpZ25lZCBsb25nIGRoY3BfbGVhc2V0aW1lID0gMDsKIElQYWRkcl90IE5ldERIQ1BTZXJ2ZXJJUCA9IDA7CkBAIC03NiwxMiArNzYsMTIgQEAKIH0KICNlbmRpZgogCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQogZXh0ZXJuIHU4ICpkaGNwX3ZlbmRvcmV4X3ByZXAgKHU4ICplKTsgLypydG4gbmV3IGUgYWZ0ZXIgYWRkIG93biBvcHRzLiAqLwogZXh0ZXJuIHU4ICpkaGNwX3ZlbmRvcmV4X3Byb2MgKHU4ICplKTsgLypydG4gbmV4dCBlIGlmIG1pbmUsZWxzZSBOVUxMICAqLwogI2VuZGlmCiAKLSNlbmRpZgkvKiBDRkdfQ01EX0RIQ1AgKi8KKyNlbmRpZgogCiBzdGF0aWMgaW50IEJvb3RwQ2hlY2tQa3QodWNoYXIgKnBrdCwgdW5zaWduZWQgZGVzdCwgdW5zaWduZWQgc3JjLCB1bnNpZ25lZCBsZW4pCiB7CkBAIC0xMjAsMTAgKzEyMCwxMiBAQAogCUlQYWRkcl90IHRtcF9pcDsKIAogCU5ldENvcHlJUCgmTmV0T3VySVAsICZicC0+YnBfeWlhZGRyKTsKKyNpZiAhZGVmaW5lZChDT05GSUdfQk9PVFBfU0VSVkVSSVApCiAJTmV0Q29weUlQKCZ0bXBfaXAsICZicC0+YnBfc2lhZGRyKTsKIAlpZiAodG1wX2lwICE9IDApCiAJCU5ldENvcHlJUCgmTmV0U2VydmVySVAsICZicC0+YnBfc2lhZGRyKTsKIAltZW1jcHkgKE5ldFNlcnZlckV0aGVyLCAoKEV0aGVybmV0X3QgKilOZXRSeFBrdCktPmV0X3NyYywgNik7CisjZW5kaWYKIAlpZiAoc3RybGVuKGJwLT5icF9maWxlKSA+IDApCiAJCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCBicC0+YnBfZmlsZSwgc2l6ZW9mKEJvb3RGaWxlKSk7CiAKQEAgLTE0OCw3ICsxNTAsNyBAQAogCXJldHVybiAoY3VybGVuKTsKIH0KIAotI2lmICEoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESENQKQorI2lmICFkZWZpbmVkKENPTkZJR19DTURfREhDUCkKIAogc3RhdGljIHZvaWQgQm9vdHBWZW5kb3JGaWVsZFByb2Nlc3MgKHU4ICogZXh0KQogewpAQCAtMTgxLDcgKzE4Myw3IEBACiAJCWlmIChOZXRPdXJETlNJUCA9PSAwKSB7CiAJCQlOZXRDb3B5SVAgKCZOZXRPdXJETlNJUCwgKElQYWRkcl90ICopIChleHQgKyAyKSk7CiAJCX0KLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfRE5TMikKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9ETlMyKQogCQlpZiAoKE5ldE91ckROUzJJUCA9PSAwKSAmJiAoc2l6ZSA+IDQpKSB7CiAJCQlOZXRDb3B5SVAgKCZOZXRPdXJETlMySVAsIChJUGFkZHJfdCAqKSAoZXh0ICsgMiArIDQpKTsKIAkJfQpAQCAtMzQ0LDcgKzM0Niw3IEBACiAJCQkgKi8KIAkJCU5ldFN0YXRlID0gTkVUTE9PUF9TVUNDRVNTOwogCQkJcmV0dXJuOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05GUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkZTKQogCQl9IGVsc2UgaWYgKHN0cmNtcChzLCAiTkZTIikgPT0gMCkgewogCQkJLyoKIAkJCSAqIFVzZSBORlMgdG8gbG9hZCB0aGUgYm9vdGZpbGUuCkBAIC0zNTcsNyArMzU5LDcgQEAKIAogCVRmdHBTdGFydCgpOwogfQotI2VuZGlmCS8qICFDRkdfQ01EX0RIQ1AgKi8KKyNlbmRpZgogCiAvKgogICoJVGltZW91dCBvbiBCT09UUC9ESENQIHJlcXVlc3QuCkBAIC0zNzcsMTYgKzM3OSwxNiBAQAogLyoKICAqCUluaXRpYWxpemUgQk9PVFAgZXh0ZW5zaW9uIGZpZWxkcyBpbiB0aGUgcmVxdWVzdC4KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RIQ1ApCiBzdGF0aWMgaW50IERoY3BFeHRlbmRlZCAodTggKiBlLCBpbnQgbWVzc2FnZV90eXBlLCBJUGFkZHJfdCBTZXJ2ZXJJRCwgSVBhZGRyX3QgUmVxdWVzdGVkSVApCiB7CiAJdTggKnN0YXJ0ID0gZTsKIAl1OCAqY250OwogCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQogCXU4ICp4OwogI2VuZGlmCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSkKIAljaGFyICpob3N0bmFtZTsKICNlbmRpZgogCkBAIC00MjUsNyArNDI3LDcgQEAKIAkJKmUrKyA9IHRtcCA+PiA4OwogCQkqZSsrID0gdG1wICYgMHhmZjsKIAl9Ci0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSkKIAlpZiAoKGhvc3RuYW1lID0gZ2V0ZW52ICgiaG9zdG5hbWUiKSkpIHsKIAkJaW50IGhvc3RuYW1lbGVuID0gc3RybGVuIChob3N0bmFtZSk7CiAKQEAgLTQzNiw3ICs0MzgsNyBAQAogCX0KICNlbmRpZgogCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQogCWlmICgoeCA9IGRoY3BfdmVuZG9yZXhfcHJlcCAoZSkpKQogCQlyZXR1cm4geCAtIHN0YXJ0OwogI2VuZGlmCkBAIC00NDQsMzkgKzQ0NiwzOSBAQAogCSplKysgPSA1NTsJCS8qIFBhcmFtZXRlciBSZXF1ZXN0IExpc3QgKi8KIAkgY250ID0gZSsrOwkJLyogUG9pbnRlciB0byBjb3VudCBvZiByZXF1ZXN0ZWQgaXRlbXMgKi8KIAkqY250ID0gMDsKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSykKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9TVUJORVRNQVNLKQogCSplKysgID0gMTsJCS8qIFN1Ym5ldCBNYXNrICovCiAJKmNudCArPSAxOwogI2VuZGlmCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1RJTUVPRkZTRVQpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfVElNRU9GRlNFVCkKIAkqZSsrICA9IDI7CiAJKmNudCArPSAxOwogI2VuZGlmCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX0dBVEVXQVkpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfR0FURVdBWSkKIAkqZSsrICA9IDM7CQkvKiBSb3V0ZXIgT3B0aW9uICovCiAJKmNudCArPSAxOwogI2VuZGlmCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX0ROUykKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9ETlMpCiAJKmUrKyAgPSA2OwkJLyogRE5TIFNlcnZlcihzKSAqLwogCSpjbnQgKz0gMTsKICNlbmRpZgotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9IT1NUTkFNRSkKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9IT1NUTkFNRSkKIAkqZSsrICA9IDEyOwkJLyogSG9zdG5hbWUgKi8KIAkqY250ICs9IDE7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKIAkqZSsrICA9IDEzOwkJLyogQm9vdCBGaWxlIFNpemUgKi8KIAkqY250ICs9IDE7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfQk9PVFBBVEgpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfQk9PVFBBVEgpCiAJKmUrKyAgPSAxNzsJCS8qIEJvb3QgcGF0aCAqLwogCSpjbnQgKz0gMTsKICNlbmRpZgotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9OSVNET01BSU4pCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfTklTRE9NQUlOKQogCSplKysgID0gNDA7CQkvKiBOSVMgRG9tYWluIG5hbWUgcmVxdWVzdCAqLwogCSpjbnQgKz0gMTsKICNlbmRpZgotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9OVFBTRVJWRVIpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfTlRQU0VSVkVSKQogCSplKysgID0gNDI7CiAJKmNudCArPSAxOwogI2VuZGlmCkBAIC00OTEsOSArNDkzLDkgQEAKIAlyZXR1cm4gZSAtIHN0YXJ0OwogfQogCi0jZWxzZQkvKiBDRkdfQ01EX0RIQ1AgKi8KKyNlbHNlCiAvKgotICoJV2FybmluZzogbm8gZmllbGQgc2l6ZSBjaGVjayAtIGNoYW5nZSBDT05GSUdfQk9PVFBfTUFTSyBhdCB5b3VyIG93biByaXNrIQorICoJV2FybmluZzogbm8gZmllbGQgc2l6ZSBjaGVjayAtIGNoYW5nZSBDT05GSUdfQk9PVFBfKiBhdCB5b3VyIG93biByaXNrIQogICovCiBzdGF0aWMgaW50IEJvb3RwRXh0ZW5kZWQgKHU4ICogZSkKIHsKQEAgLTUwNCw3ICs1MDYsNyBAQAogCSplKysgPSA4MzsKIAkqZSsrID0gOTk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESENQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ESENQKQogCSplKysgPSA1MzsJCS8qIERIQ1AgTWVzc2FnZSBUeXBlICovCiAJKmUrKyA9IDE7CiAJKmUrKyA9IERIQ1BfRElTQ09WRVI7CkBAIC01MTMsNDUgKzUxNSw0NSBAQAogCSplKysgPSAyOwogCSplKysgPSAoNTc2IC0gMzEyICsgT1BUX1NJWkUpID4+IDE2OwogCSplKysgPSAoNTc2IC0gMzEyICsgT1BUX1NJWkUpICYgMHhmZjsKLSNlbmRpZiAvKiBDRkdfQ01EX0RIQ1AgKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0spCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfU1VCTkVUTUFTSykKIAkqZSsrID0gMTsJCS8qIFN1Ym5ldCBtYXNrIHJlcXVlc3QgKi8KIAkqZSsrID0gNDsKIAllICAgKz0gNDsKICNlbmRpZgogCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX0dBVEVXQVkpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfR0FURVdBWSkKIAkqZSsrID0gMzsJCS8qIERlZmF1bHQgZ2F0ZXdheSByZXF1ZXN0ICovCiAJKmUrKyA9IDQ7CiAJZSAgICs9IDQ7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9ETlMpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfRE5TKQogCSplKysgPSA2OwkJLyogRG9tYWluIE5hbWUgU2VydmVyICovCiAJKmUrKyA9IDQ7CiAJZSAgICs9IDQ7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9IT1NUTkFNRSkKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9IT1NUTkFNRSkKIAkqZSsrID0gMTI7CQkvKiBIb3N0IG5hbWUgcmVxdWVzdCAqLwogCSplKysgPSAzMjsKIAllICAgKz0gMzI7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQogCSplKysgPSAxMzsJCS8qIEJvb3QgZmlsZSBzaXplICovCiAJKmUrKyA9IDI7CiAJZSAgICs9IDI7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9CT09UUEFUSCkKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9CT09UUEFUSCkKIAkqZSsrID0gMTc7CQkvKiBCb290IHBhdGggKi8KIAkqZSsrID0gMzI7CiAJZSAgICs9IDMyOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfTklTRE9NQUlOKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX05JU0RPTUFJTikKIAkqZSsrID0gNDA7CQkvKiBOSVMgRG9tYWluIG5hbWUgcmVxdWVzdCAqLwogCSplKysgPSAzMjsKIAllICAgKz0gMzI7CkBAIC01NjEsNyArNTYzLDcgQEAKIAogCXJldHVybiBlIC0gc3RhcnQ7CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9ESENQICovCisjZW5kaWYKIAogdm9pZAogQm9vdHBSZXF1ZXN0ICh2b2lkKQpAQCAtNTcwLDcgKzU3Miw3IEBACiAJQm9vdHBfdCAqYnA7CiAJaW50IGV4dF9sZW4sIHBrdGxlbiwgaXBsZW47CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESENQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ESENQKQogCWRoY3Bfc3RhdGUgPSBJTklUOwogI2VuZGlmCiAKQEAgLTY3OCwxMSArNjgwLDExIEBACiAJY29weV9maWxlbmFtZSAoYnAtPmJwX2ZpbGUsIEJvb3RGaWxlLCBzaXplb2YoYnAtPmJwX2ZpbGUpKTsKIAogCS8qIFJlcXVlc3QgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCT09UUC9ESENQIHNlcnZlciAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RIQ1ApCiAJZXh0X2xlbiA9IERoY3BFeHRlbmRlZCgodTggKilicC0+YnBfdmVuZCwgREhDUF9ESVNDT1ZFUiwgMCwgMCk7CiAjZWxzZQogCWV4dF9sZW4gPSBCb290cEV4dGVuZGVkKCh1OCAqKWJwLT5icF92ZW5kKTsKLSNlbmRpZgkvKiBDRkdfQ01EX0RIQ1AgKi8KKyNlbmRpZgogCiAJLyoKIAkgKglCb290cCBJRCBpcyB0aGUgbG93ZXIgNCBieXRlcyBvZiBvdXIgZXRoZXJuZXQgYWRkcmVzcwpAQCAtNzA1LDE2ICs3MDcsMTYgQEAKIAlOZXRTZXRJUChpcGhkciwgMHhGRkZGRkZGRkwsIFBPUlRfQk9PVFBTLCBQT1JUX0JPT1RQQywgaXBsZW4pOwogCU5ldFNldFRpbWVvdXQoU0VMRUNUX1RJTUVPVVQgKiBDRkdfSFosIEJvb3RwVGltZW91dCk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESENQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ESENQKQogCWRoY3Bfc3RhdGUgPSBTRUxFQ1RJTkc7CiAJTmV0U2V0SGFuZGxlcihEaGNwSGFuZGxlcik7CiAjZWxzZQogCU5ldFNldEhhbmRsZXIoQm9vdHBIYW5kbGVyKTsKLSNlbmRpZgkvKiBDRkdfQ01EX0RIQ1AgKi8KKyNlbmRpZgogCU5ldFNlbmRQYWNrZXQoTmV0VHhQYWNrZXQsIHBrdGxlbik7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESENQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ESENQKQogc3RhdGljIHZvaWQgRGhjcE9wdGlvbnNQcm9jZXNzICh1Y2hhciAqIHBvcHQsIEJvb3RwX3QgKmJwKQogewogCXVjaGFyICplbmQgPSBwb3B0ICsgQk9PVFBfSERSX1NJWkU7CkBAIC03MjYsNyArNzI4LDcgQEAKIAkJY2FzZSAxOgogCQkJTmV0Q29weUlQICgmTmV0T3VyU3VibmV0TWFzaywgKHBvcHQgKyAyKSk7CiAJCQlicmVhazsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TTlRQKSAmJiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfVElNRU9GRlNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkgJiYgZGVmaW5lZChDT05GSUdfQk9PVFBfVElNRU9GRlNFVCkKIAkJY2FzZSAyOgkJLyogVGltZSBvZmZzZXQJKi8KIAkJCU5ldENvcHlMb25nICgmTmV0VGltZU9mZnNldCwgKHVsb25nICopIChwb3B0ICsgMikpOwogCQkJTmV0VGltZU9mZnNldCA9IG50b2hsIChOZXRUaW1lT2Zmc2V0KTsKQEAgLTczNyw3ICs3MzksNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgNjoKIAkJCU5ldENvcHlJUCAoJk5ldE91ckROU0lQLCAocG9wdCArIDIpKTsKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfRE5TMikKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9ETlMyKQogCQkJaWYgKCoocG9wdCArIDEpID4gNCkgewogCQkJCU5ldENvcHlJUCAoJk5ldE91ckROUzJJUCwgKHBvcHQgKyAyICsgNCkpOwogCQkJfQpAQCAtNzU1LDcgKzc1Nyw3IEBACiAJCQltZW1jcHkgKCZOZXRPdXJSb290UGF0aCwgcG9wdCArIDIsIHNpemUpOwogCQkJTmV0T3VyUm9vdFBhdGhbc2l6ZV0gPSAwOwogCQkJYnJlYWs7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkgJiYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX05UUFNFUlZFUikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkgJiYgZGVmaW5lZChDT05GSUdfQk9PVFBfTlRQU0VSVkVSKQogCQljYXNlIDQyOgkvKiBOVFAgc2VydmVyIElQICovCiAJCQlOZXRDb3B5SVAgKCZOZXROdHBTZXJ2ZXJJUCwgKHBvcHQgKyAyKSk7CiAJCQlicmVhazsKQEAgLTgwMSw3ICs4MDMsNyBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX1ZFTkRPUkVYKQogCQkJaWYgKGRoY3BfdmVuZG9yZXhfcHJvYyAocG9wdCkpCiAJCQkJYnJlYWs7CiAjZW5kaWYKQEAgLTk1MCw3ICs5NTIsNyBAQAogCQkJCQkgKi8KIAkJCQkJTmV0U3RhdGUgPSBORVRMT09QX1NVQ0NFU1M7CiAJCQkJCXJldHVybjsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORlMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05GUykKIAkJCQl9IGVsc2UgaWYgKHN0cmNtcChzLCAiTkZTIikgPT0gMCkgewogCQkJCQkvKgogCQkJCQkgKiBVc2UgTkZTIHRvIGxvYWQgdGhlIGJvb3RmaWxlLgpAQCAtOTc1LDYgKzk3Nyw2IEBACiB7CiAJQm9vdHBSZXF1ZXN0KCk7CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9ESENQICovCisjZW5kaWYKIAotI2VuZGlmIC8qIENGR19DTURfTkVUICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9ib290cC5oIGIvbmV0L2Jvb3RwLmgKaW5kZXggMGIzMTYzOS4uYmE5ODI2ZSAxMDA2NDQKLS0tIGEvbmV0L2Jvb3RwLmgKKysrIGIvbmV0L2Jvb3RwLmgKQEAgLTE4LDcgKzE4LDcgQEAKIC8qCiAgKglCT09UUCBoZWFkZXIuCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESENQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ESENQKQogI2RlZmluZSBPUFRfU0laRSAzMTIJLyogTWluaW11bSBESENQIE9wdGlvbnMgc2l6ZSBwZXIgUkZDMjEzMSAtIHJlc3VsdHMgaW4gNTc2IGJ5dGUgcGt0ICovCiAjZWxzZQogI2RlZmluZSBPUFRfU0laRSA2NApkaWZmIC0tZ2l0IGEvbmV0L2V0aC5jIGIvbmV0L2V0aC5jCmluZGV4IDlmYjNhMTAuLmMyYzIzZjYgMTAwNjQ0Ci0tLSBhL25ldC9ldGguYworKysgYi9uZXQvZXRoLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxuZXQuaD4KICNpbmNsdWRlIDxtaWlwaHkuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKIAogI2lmZGVmIENGR19HVF82NDI2eAogZXh0ZXJuIGludCBndDY0MjZ4X2V0aF9pbml0aWFsaXplKGJkX3QgKmJpcyk7CkBAIC00MCw2ICs0MCw3IEBACiBleHRlcm4gaW50IGZlY19pbml0aWFsaXplKGJkX3QqKTsKIGV4dGVybiBpbnQgaW5jYV9zd2l0Y2hfaW5pdGlhbGl6ZShiZF90Kik7CiBleHRlcm4gaW50IG1wYzV4eHhfZmVjX2luaXRpYWxpemUoYmRfdCopOworZXh0ZXJuIGludCBtcGM1MTJ4X2ZlY19pbml0aWFsaXplKGJkX3QqKTsKIGV4dGVybiBpbnQgbXBjODIyMF9mZWNfaW5pdGlhbGl6ZShiZF90Kik7CiBleHRlcm4gaW50IG12NjQzNnhfZXRoX2luaXRpYWxpemUoYmRfdCAqKTsKIGV4dGVybiBpbnQgbXY2NDQ2eF9ldGhfaW5pdGlhbGl6ZShiZF90ICopOwpAQCAtMTQzLDcgKzE0NCw3IEBACiAJZXRoX2N1cnJlbnQgPSBOVUxMOwogCiAJc2hvd19ib290X3Byb2dyZXNzICg2NCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCW1paXBoeV9pbml0KCk7CiAjZW5kaWYKIApAQCAtMTY4LDYgKzE2OSw5IEBACiAjaWYgZGVmaW5lZChDT05GSUdfTVBDNXh4eF9GRUMpCiAJbXBjNXh4eF9mZWNfaW5pdGlhbGl6ZShiaXMpOwogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfTVBDNTEyeF9GRUMpCisJbXBjNTEyeF9mZWNfaW5pdGlhbGl6ZSAoYmlzKTsKKyNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX01QQzgyMjBfRkVDKQogCW1wYzgyMjBfZmVjX2luaXRpYWxpemUoYmlzKTsKICNlbmRpZgpAQCAtMzQ5LDYgKzM1Myw1MSBAQAogCiAJbWVtY3B5KGRldi0+ZW5ldGFkZHIsIGVuZXRhZGRyLCA2KTsKIH0KKyNpZmRlZiBDT05GSUdfTUNBU1RfVEZUUAorLyogTXVsdGljYXN0LgorICogbWNhc3RfYWRkcjogbXVsdGljYXN0IGlwYWRkciBmcm9tIHdoaWNoIG11bHRpY2FzdCBNYWMgaXMgbWFkZQorICogam9pbjogMT1qb2luLCAwPWxlYXZlLgorICovCitpbnQgZXRoX21jYXN0X2pvaW4oIElQYWRkcl90IG1jYXN0X2lwLCB1OCBqb2luKQoreworIHU4IG1jYXN0X21hY1s2XTsKKwlpZiAoIWV0aF9jdXJyZW50IHx8ICFldGhfY3VycmVudC0+bWNhc3QpCisJCXJldHVybiAtMTsKKwltY2FzdF9tYWNbNV0gPSBodG9ubChtY2FzdF9pcCkgJiAweGZmOworCW1jYXN0X21hY1s0XSA9IChodG9ubChtY2FzdF9pcCk+PjgpICYgMHhmZjsKKwltY2FzdF9tYWNbM10gPSAoaHRvbmwobWNhc3RfaXApPj4xNikgJiAweDdmOworCW1jYXN0X21hY1syXSA9IDB4NWU7CisJbWNhc3RfbWFjWzFdID0gMHgwOworCW1jYXN0X21hY1swXSA9IDB4MTsKKwlyZXR1cm4gZXRoX2N1cnJlbnQtPm1jYXN0KGV0aF9jdXJyZW50LCBtY2FzdF9tYWMsIGpvaW4pOworfQorCisvKiB0aGUgJ3dheScgZm9yIGV0aGVybmV0LUNSQy0zMi4gU3BsaWNlZCBpbiBmcm9tIExpbnV4IGxpYi9jcmMzMi5jCisgKiBhbmQgdGhpcyBpcyB0aGUgZXRoZXJuZXQtY3JjIG1ldGhvZCBuZWVkZWQgZm9yIFRTRUMgLS0gYW5kIHBlcmhhcHMKKyAqIHNvbWUgb3RoZXIgYWRhcHRlciAtLSBoYXNoIHRhYmxlcworICovCisjZGVmaW5lIENSQ1BPTFlfTEUgMHhlZGI4ODMyMAordTMyIGV0aGVyX2NyYyAoc2l6ZV90IGxlbiwgdW5zaWduZWQgY2hhciBjb25zdCAqcCkKK3sKKwlpbnQgaTsKKwl1MzIgY3JjOworCWNyYyA9IH4wOworCXdoaWxlIChsZW4tLSkgeworCQljcmMgXj0gKnArKzsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCWNyYyA9IChjcmMgPj4gMSkgXiAoKGNyYyAmIDEpID8gQ1JDUE9MWV9MRSA6IDApOworCX0KKwkvKiBhbiByZXZlcnNlIHRoZSBiaXRzLCBjdXogb2Ygd2F5IHRoZXkgYXJyaXZlIC0tIGxhc3QtZmlyc3QgKi8KKwljcmMgPSAoY3JjID4+IDE2KSB8IChjcmMgPDwgMTYpOworCWNyYyA9IChjcmMgPj4gOCAmIDB4MDBmZjAwZmYpIHwgKGNyYyA8PCA4ICYgMHhmZjAwZmYwMCk7CisJY3JjID0gKGNyYyA+PiA0ICYgMHgwZjBmMGYwZikgfCAoY3JjIDw8IDQgJiAweGYwZjBmMGYwKTsKKwljcmMgPSAoY3JjID4+IDIgJiAweDMzMzMzMzMzKSB8IChjcmMgPDwgMiAmIDB4Y2NjY2NjY2MpOworCWNyYyA9IChjcmMgPj4gMSAmIDB4NTU1NTU1NTUpIHwgKGNyYyA8PCAxICYgMHhhYWFhYWFhYSk7CisJcmV0dXJuIGNyYzsKK30KKworI2VuZGlmCisKIAogaW50IGV0aF9pbml0KGJkX3QgKmJpcykKIHsKQEAgLTQ1NCwxNiArNTAzLDE4IEBACiB7CiAJcmV0dXJuIChldGhfY3VycmVudCA/IGV0aF9jdXJyZW50LT5uYW1lIDogInVua25vd24iKTsKIH0KLSNlbGlmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgIWRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmICFkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCiAKIGV4dGVybiBpbnQgYXQ5MXJtOTIwMF9taWlwaHlfaW5pdGlhbGl6ZShiZF90ICpiaXMpOwogZXh0ZXJuIGludCBlbWFjNHh4X21paXBoeV9pbml0aWFsaXplKGJkX3QgKmJpcyk7CiBleHRlcm4gaW50IG1jZjUyeDJfbWlpcGh5X2luaXRpYWxpemUoYmRfdCAqYmlzKTsKIGV4dGVybiBpbnQgbnM3NTIwX21paXBoeV9pbml0aWFsaXplKGJkX3QgKmJpcyk7CitleHRlcm4gaW50IGRtNjQ0eF9ldGhfbWlpcGh5X2luaXRpYWxpemUoYmRfdCAqYmlzKTsKKwogCiBpbnQgZXRoX2luaXRpYWxpemUoYmRfdCAqYmlzKQogewotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKIAltaWlwaHlfaW5pdCgpOwogI2VuZGlmCiAKQEAgLTQ4MCw2ICs1MzEsOSBAQAogI2lmIGRlZmluZWQoQ09ORklHX05FVEFSTSkKIAluczc1MjBfbWlpcGh5X2luaXRpYWxpemUoYmlzKTsKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0RSSVZFUl9USV9FTUFDKQorCWRtNjQ0eF9ldGhfbWlpcGh5X2luaXRpYWxpemUoYmlzKTsKKyNlbmRpZgogCXJldHVybiAwOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvbmV0LmMgYi9uZXQvbmV0LmMKaW5kZXggMmZmN2JmYy4uYzQ3NjEwZSAxMDA2NDQKLS0tIGEvbmV0L25ldC5jCisrKyBiL25ldC9uZXQuYwpAQCAtODYsMTEgKzg2LDExIEBACiAjaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgogI2luY2x1ZGUgPG1paXBoeS5oPgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkKICNpbmNsdWRlICJzbnRwLmgiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIApAQCAtMTEwLDcgKzExMCw3IEBACiBJUGFkZHJfdAlOZXRPdXJTdWJuZXRNYXNrPTA7CQkvKiBPdXIgc3VibmV0IG1hc2sgKDA9dW5rbm93bikJKi8KIElQYWRkcl90CU5ldE91ckdhdGV3YXlJUD0wOwkJLyogT3VyIGdhdGV3YXlzIElQIGFkZHJlc3MJKi8KIElQYWRkcl90CU5ldE91ckROU0lQPTA7CQkJLyogT3VyIEROUyBJUCBhZGRyZXNzCQkqLwotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9ETlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX0ROUzIpCiBJUGFkZHJfdAlOZXRPdXJETlMySVA9MDsJCQkvKiBPdXIgMm5kIEROUyBJUCBhZGRyZXNzCSovCiAjZW5kaWYKIGNoYXIJCU5ldE91ck5JU0RvbWFpblszMl09ezAsfTsJLyogT3VyIE5JUyBkb21haW4JCSovCkBAIC0xMTgsNiArMTE4LDEwIEBACiBjaGFyCQlOZXRPdXJSb290UGF0aFs2NF09ezAsfTsJLyogT3VyIGJvb3RwYXRoCQkJKi8KIHVzaG9ydAkJTmV0Qm9vdEZpbGVTaXplPTA7CQkvKiBPdXIgYm9vdGZpbGUgc2l6ZSBpbiBibG9ja3MJKi8KIAorI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCS8qIE11bHRpY2FzdCBURlRQICovCitJUGFkZHJfdCBNY2FzdF9hZGRyOworI2VuZGlmCisKIC8qKiBFTkQgT0YgQk9PVFAgRVhURU5USU9OUyAqKi8KIAogdWxvbmcJCU5ldEJvb3RGaWxlWGZlclNpemU7CS8qIFRoZSBhY3R1YWwgdHJhbnNmZXJyZWQgc2l6ZSBvZiB0aGUgYm9vdGZpbGUgKGluIGJ5dGVzKSAqLwpAQCAtMTMzLDcgKzEzNyw3IEBACiAJCQl7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKIHVjaGFyCQlOZXRFdGhlck51bGxBZGRyWzZdID0KIAkJCXsgMCwgMCwgMCwgMCwgMCwgMCB9OwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogdWNoYXIJCU5ldENEUEFkZHJbNl0gPQkJLyogRXRoZXJuZXQgYmNhc3QgYWRkcmVzcwkJKi8KIAkJCXsgMHgwMSwgMHgwMCwgMHgwYywgMHhjYywgMHhjYywgMHhjYyB9OwogI2VuZGlmCkBAIC0xNTAsMTcgKzE1NCwxNyBAQAogCiBjaGFyCQlCb290RmlsZVsxMjhdOwkJLyogQm9vdCBGaWxlIG5hbWUJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUElORykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUElORykKIElQYWRkcl90CU5ldFBpbmdJUDsJCS8qIHRoZSBpcCBhZGRyZXNzIHRvIHBpbmcgCQkqLwogCiBzdGF0aWMgdm9pZCBQaW5nU3RhcnQodm9pZCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogc3RhdGljIHZvaWQgQ0RQU3RhcnQodm9pZCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NOVFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NOVFApCiBJUGFkZHJfdAlOZXROdHBTZXJ2ZXJJUDsJCS8qIE5UUCBzZXJ2ZXIgSVAgYWRkcmVzcwkJKi8KIGludAkJTmV0VGltZU9mZnNldD0wOwkvKiBvZmZzZXQgdGltZSBmcm9tIFVUQwkJCSovCiAjZW5kaWYKQEAgLTMyNiwxMyArMzMwLDEzIEBACiAJICovCiAKIAlzd2l0Y2ggKHByb3RvY29sKSB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkZTKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORlMpCiAJY2FzZSBORlM6CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QSU5HKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QSU5HKQogCWNhc2UgUElORzoKICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NOVFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NOVFApCiAJY2FzZSBTTlRQOgogI2VuZGlmCiAJY2FzZSBORVRDT05TOgpAQCAtMzQ0LDE5ICszNDgsMTkgQEAKIAkJTmV0T3VyTmF0aXZlVkxBTiA9IGdldGVudl9WTEFOKCJudmxhbiIpOwogCiAJCXN3aXRjaCAocHJvdG9jb2wpIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORlMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05GUykKIAkJY2FzZSBORlM6CiAjZW5kaWYKIAkJY2FzZSBORVRDT05TOgogCQljYXNlIFRGVFA6CiAJCQlOZXRTZXJ2ZXJJUCA9IGdldGVudl9JUGFkZHIgKCJzZXJ2ZXJpcCIpOwogCQkJYnJlYWs7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUElORykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUElORykKIAkJY2FzZSBQSU5HOgogCQkJLyogbm90aGluZyAqLwogCQkJYnJlYWs7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TTlRQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TTlRQKQogCQljYXNlIFNOVFA6CiAJCQkvKiBub3RoaW5nICovCiAJCQlicmVhazsKQEAgLTQwNiw3ICs0MTAsNyBAQAogCQkJVGZ0cFN0YXJ0KCk7CiAJCQlicmVhazsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RIQ1ApCiAJCWNhc2UgREhDUDoKIAkJCS8qIFN0YXJ0IHdpdGggYSBjbGVhbiBzbGF0ZS4uLiAqLwogCQkJQm9vdHBUcnkgPSAwOwpAQCAtNDE0LDcgKzQxOCw3IEBACiAJCQlOZXRTZXJ2ZXJJUCA9IGdldGVudl9JUGFkZHIgKCJzZXJ2ZXJpcCIpOwogCQkJRGhjcFJlcXVlc3QoKTsJCS8qIEJhc2ljYWxseSBzYW1lIGFzIEJPT1RQICovCiAJCQlicmVhazsKLSNlbmRpZiAvKiBDRkdfQ01EX0RIQ1AgKi8KKyNlbmRpZgogCiAJCWNhc2UgQk9PVFA6CiAJCQlCb290cFRyeSA9IDA7CkBAIC00MjUsMTcgKzQyOSwxNyBAQAogCQkJUmFycFRyeSA9IDA7CiAJCQlSYXJwUmVxdWVzdCAoKTsKIAkJCWJyZWFrOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BJTkcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BJTkcpCiAJCWNhc2UgUElORzoKIAkJCVBpbmdTdGFydCgpOwogCQkJYnJlYWs7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORlMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05GUykKIAkJY2FzZSBORlM6CiAJCQlOZnNTdGFydCgpOwogCQkJYnJlYWs7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9DRFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NEUCkKIAkJY2FzZSBDRFA6CiAJCQlDRFBTdGFydCgpOwogCQkJYnJlYWs7CkBAIC00NDUsNyArNDQ5LDcgQEAKIAkJCU5jU3RhcnQoKTsKIAkJCWJyZWFrOwogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkKIAkJY2FzZSBTTlRQOgogCQkJU250cFN0YXJ0KCk7CiAJCQlicmVhazsKQEAgLTQ1OCw3ICs0NjIsNyBAQAogCQlicmVhazsKIAl9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAjaWYgZGVmaW5lZChDRkdfRkFVTFRfRUNIT19MSU5LX0RPV04pICYmIGRlZmluZWQoQ09ORklHX1NUQVRVU19MRUQpICYmIGRlZmluZWQoU1RBVFVTX0xFRF9SRUQpCiAJLyoKIAkgKiBFY2hvIHRoZSBpbnZlcnRlZCBsaW5rIHN0YXRlIHRvIHRoZSBmYXVsdCBMRUQuCkBAIC01MDcsNyArNTExLDcgQEAKIAkJaWYgKHRpbWVIYW5kbGVyICYmICgoZ2V0X3RpbWVyKDApIC0gdGltZVN0YXJ0KSA+IHRpbWVEZWx0YSkpIHsKIAkJCXRoYW5kX2YgKng7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAjICBpZiBkZWZpbmVkKENGR19GQVVMVF9FQ0hPX0xJTktfRE9XTikgJiYgXAogICAgICAgZGVmaW5lZChDT05GSUdfU1RBVFVTX0xFRCkgJiYJICAgXAogICAgICAgZGVmaW5lZChTVEFUVVNfTEVEX1JFRCkKQEAgLTY4Nyw3ICs2OTEsNyBAQAogCXJldHVybiAwOwkvKiB0cmFuc21pdHRlZCAqLwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUElORykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUElORykKIHN0YXRpYyB1c2hvcnQgUGluZ1NlcU5vOwogCiBpbnQgUGluZ1NlbmQodm9pZCkKQEAgLTc3NSw5ICs3NzksOSBAQAogCiAJUGluZ1NlbmQoKTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1BJTkcgKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQ0RQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9DRFApCiAKICNkZWZpbmUgQ0RQX0RFVklDRV9JRF9UTFYJCTB4MDAwMQogI2RlZmluZSBDRFBfQUREUkVTU19UTFYJCQkweDAwMDIKQEAgLTExMjgsNyArMTEzMiw3IEBACiAKIAlDRFBTZW5kVHJpZ2dlcigpOwogfQotI2VuZGlmCS8qIENGR19DTURfQ0RQICovCisjZW5kaWYKIAogCiB2b2lkCkBAIC0xMTQwLDcgKzExNDQsNyBAQAogCUlQYWRkcl90IHRtcDsKIAlpbnQJeDsKIAl1Y2hhciAqcGt0OwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogCWludCBpc2NkcDsKICNlbmRpZgogCXVzaG9ydCBjdGkgPSAwLCB2bGFuaWQgPSBWTEFOX05PTkUsIG15dmxhbmlkLCBteW52bGFuaWQ7CkBAIC0xMTU3LDcgKzExNjEsNyBAQAogCWlmIChsZW4gPCBFVEhFUl9IRFJfU0laRSkKIAkJcmV0dXJuOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQ0RQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9DRFApCiAJLyoga2VlcCB0cmFjayBpZiBwYWNrZXQgaXMgQ0RQICovCiAJaXNjZHAgPSBtZW1jbXAoZXQtPmV0X2Rlc3QsIE5ldENEUEFkZHIsIDYpID09IDA7CiAjZW5kaWYKQEAgLTEyMDAsNyArMTIwNCw3IEBACiAKIAkJLyogaWYgbm8gVkxBTiBhY3RpdmUgKi8KIAkJaWYgKChudG9ocyhOZXRPdXJWTEFOKSAmIFZMQU5fSURNQVNLKSA9PSBWTEFOX05PTkUKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9DRFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NEUCkKIAkJCQkmJiBpc2NkcCA9PSAwCiAjZW5kaWYKIAkJCQkpCkBAIC0xMjE4LDcgKzEyMjIsNyBAQAogCXByaW50ZigiUmVjZWl2ZSBmcm9tIHByb3RvY29sIDB4JXhcbiIsIHgpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9DRFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NEUCkKIAlpZiAoaXNjZHApIHsKIAkJQ0RQSGFuZGxlcigodWNoYXIgKilpcCwgbGVuKTsKIAkJcmV0dXJuOwpAQCAtMTM4Niw2ICsxMzkwLDkgQEAKIAkJfQogCQl0bXAgPSBOZXRSZWFkSVAoJmlwLT5pcF9kc3QpOwogCQlpZiAoTmV0T3VySVAgJiYgdG1wICE9IE5ldE91cklQICYmIHRtcCAhPSAweEZGRkZGRkZGKSB7CisjaWZkZWYgQ09ORklHX01DQVNUX1RGVFAKKwkJCWlmIChNY2FzdF9hZGRyICE9IHRtcCkKKyNlbmRpZgogCQkJcmV0dXJuOwogCQl9CiAJCS8qCkBAIC0xNDE2LDcgKzE0MjMsNyBAQAogCQkJCXByaW50X0lQYWRkcihpY21waC0+dW4uZ2F0ZXdheSk7CiAJCQkJcHV0YygnICcpOwogCQkJCXJldHVybjsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QSU5HKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QSU5HKQogCQkJY2FzZSBJQ01QX0VDSE9fUkVQTFk6CiAJCQkJLyoKIAkJCQkgKglJUCBoZWFkZXIgT0suICBQYXNzIHRoZSBwYWNrZXQgdG8gdGhlIGN1cnJlbnQgaGFuZGxlci4KQEAgLTE0OTIsNiArMTQ5OSw3IEBACiAJCX0KICNlbmRpZgogCisKICNpZmRlZiBDT05GSUdfTkVUQ09OU09MRQogCQluY19pbnB1dF9wYWNrZXQoKHVjaGFyICopaXAgK0lQX0hEUl9TSVpFLAogCQkJCQkJbnRvaHMoaXAtPnVkcF9kc3QpLApAQCAtMTUxNiw3ICsxNTI0LDcgQEAKIHsKIAlzd2l0Y2ggKHByb3RvY29sKSB7CiAJCS8qIEZhbGwgdGhyb3VnaCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BJTkcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BJTkcpCiAJY2FzZSBQSU5HOgogCQlpZiAoTmV0UGluZ0lQID09IDApIHsKIAkJCXB1dHMgKCIqKiogRVJST1I6IHBpbmcgYWRkcmVzcyBub3QgZ2l2ZW5cbiIpOwpAQCAtMTUyNCw3ICsxNTMyLDcgQEAKIAkJfQogCQlnb3RvIGNvbW1vbjsKICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NOVFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NOVFApCiAJY2FzZSBTTlRQOgogCQlpZiAoTmV0TnRwU2VydmVySVAgPT0gMCkgewogCQkJcHV0cyAoIioqKiBFUlJPUjogTlRQIHNlcnZlciBhZGRyZXNzIG5vdCBnaXZlblxuIik7CkBAIC0xNTMyLDcgKzE1NDAsNyBAQAogCQl9CiAJCWdvdG8gY29tbW9uOwogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkZTKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORlMpCiAJY2FzZSBORlM6CiAjZW5kaWYKIAljYXNlIE5FVENPTlM6CkBAIC0xNTQxLDcgKzE1NDksNyBAQAogCQkJcHV0cyAoIioqKiBFUlJPUjogYHNlcnZlcmlwJyBub3Qgc2V0XG4iKTsKIAkJCXJldHVybiAoMSk7CiAJCX0KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgKENGR19DTURfUElORyB8IENGR19DTURfU05UUCkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BJTkcpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9TTlRQKQogICAgIGNvbW1vbjoKICNlbmRpZgogCkBAIC0xNjkzLDcgKzE3MDEsNyBAQAogCSpkc3QgPSAnXDAnOwogfQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogCiB2b2lkIGlwX3RvX3N0cmluZyAoSVBhZGRyX3QgeCwgY2hhciAqcykKIHsKZGlmZiAtLWdpdCBhL25ldC9uZnMuYyBiL25ldC9uZnMuYwppbmRleCBkZTc4OWUxLi5kZjJjYWFjIDEwMDY0NAotLS0gYS9uZXQvbmZzLmMKKysrIGIvbmV0L25mcy5jCkBAIC0zMSw3ICszMSw3IEBACiAKIC8qI2RlZmluZSBORlNfREVCVUcqLwogCi0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkZTKSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19DTURfTkZTKQogCiAjZGVmaW5lIEhBU0hFU19QRVJfTElORSA2NQkvKiBOdW1iZXIgb2YgImxvYWRpbmciIGhhc2hlcyBwZXIgbGluZQkqLwogI2RlZmluZSBORlNfVElNRU9VVCA2MApAQCAtNzc1LDQgKzc3NSw0IEBACiAJTmZzU2VuZCAoKTsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkZTICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9yYXJwLmMgYi9uZXQvcmFycC5jCmluZGV4IDFiYTYwZTguLjIxZGZhNTIgMTAwNjQ0Ci0tLSBhL25ldC9yYXJwLmMKKysrIGIvbmV0L3JhcnAuYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgInJhcnAuaCIKICNpbmNsdWRlICJ0ZnRwLmgiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogI2RlZmluZSBUSU1FT1VUCQk1CQkvKiBTZWNvbmRzIGJlZm9yZSB0cnlpbmcgQk9PVFAgYWdhaW4gKi8KICNpZm5kZWYJQ09ORklHX05FVF9SRVRSWV9DT1VOVApAQCAtNTksNyArNTksNyBAQAogCQkJICovCiAJCQlOZXRTdGF0ZSA9IE5FVExPT1BfU1VDQ0VTUzsKIAkJCXJldHVybjsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORlMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05GUykKIAkJfSBlbHNlIGlmICgocyAhPSBOVUxMKSAmJiAhc3RyY21wKHMsICJORlMiKSkgewogCQkJTmZzU3RhcnQoKTsKIAkJCXJldHVybjsKQEAgLTExOSw0ICsxMTksNCBAQAogCU5ldFNldEhhbmRsZXIoUmFycEhhbmRsZXIpOwogfQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3NudHAuYyBiL25ldC9zbnRwLmMKaW5kZXggZGI4YzJjMi4uOTVlNzU0MiAxMDA2NDQKLS0tIGEvbmV0L3NudHAuYworKysgYi9uZXQvc250cC5jCkBAIC0xMiw3ICsxMiw3IEBACiAKICNpbmNsdWRlICJzbnRwLmgiCiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TTlRQKSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkKIAogI2RlZmluZSBTTlRQX1RJTUVPVVQgMTAKIApAQCAtNjcsNyArNjcsNyBAQAogCW1lbWNweSAoJnNlY29uZHMsICZycGt0cC0+dHJhbnNtaXRfdGltZXN0YW1wLCBzaXplb2YodWxvbmcpKTsKIAogCXRvX3RtKG50b2hsKHNlY29uZHMpIC0gMjIwODk4ODgwMFVMICsgTmV0VGltZU9mZnNldCwgJnRtKTsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCXJ0Y19zZXQgKCZ0bSk7CiAjZW5kaWYKIAlwcmludGYgKCJEYXRlOiAlNGQtJTAyZC0lMDJkIFRpbWU6ICUyZDolMDJkOiUwMmRcbiIsCkBAIC04OSw0ICs4OSw0IEBACiAJU250cFNlbmQgKCk7CiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NOVFAgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RmdHAuYyBiL25ldC90ZnRwLmMKaW5kZXggZjNhNTQ3MS4uODg4ZWM5OCAxMDA2NDQKLS0tIGEvbmV0L3RmdHAuYworKysgYi9uZXQvdGZ0cC5jCkBAIC0xMiw3ICsxMiw3IEBACiAKICN1bmRlZglFVF9ERUJVRwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKICNkZWZpbmUgV0VMTF9LTk9XTl9QT1JUCTY5CQkvKiBXZWxsIGtub3duIFRGVFAgcG9ydCAjCQkqLwogI2RlZmluZSBUSU1FT1VUCQk1CQkvKiBTZWNvbmRzIHRvIHRpbWVvdXQgZm9yIGEgbG9zdCBwa3QJKi8KQEAgLTYxLDEwICs2MSw0MyBAQAogZXh0ZXJuIGZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW107CiAjZW5kaWYKIAorLyogNTEyIGlzIHBvb3IgY2hvaWNlIGZvciBldGhlcm5ldCwgTVRVIGlzIHR5cGljYWxseSAxNTAwLgorICogTWludXMgZXRoLmhkcnMgdGhhdHMgMTQ2OC4gIENhbiBnZXQgMnggYmV0dGVyIHRocm91Z2hwdXQgd2l0aAorICogYWxtb3N0LU1UVSBibG9jayBzaXplcy4gIEF0IGxlYXN0IHRyeS4uLiBmYWxsIGJhY2sgdG8gNTEyIGlmIG5lZWQgYmUuCisgKi8KKyNkZWZpbmUgVEZUUF9NVFVfQkxPQ0tTSVpFIDE0NjgKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBUZnRwQmxrU2l6ZT1URlRQX0JMT0NLX1NJWkU7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgVGZ0cEJsa1NpemVPcHRpb249VEZUUF9NVFVfQkxPQ0tTSVpFOworCisjaWZkZWYgQ09ORklHX01DQVNUX1RGVFAKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNkZWZpbmUgTVRGVFBfQklUTUFQU0laRQkweDEwMDAKK3N0YXRpYyB1bnNpZ25lZCAqQml0bWFwOworc3RhdGljIGludCBQcmV2Qml0bWFwSG9sZSxNYXBzaXplPU1URlRQX0JJVE1BUFNJWkU7CitzdGF0aWMgdWNoYXIgUHJvaGliaXRNY2FzdD0wLCBNYXN0ZXJDbGllbnQ9MDsKK3N0YXRpYyB1Y2hhciBNdWx0aWNhc3Q9MDsKK2V4dGVybiBJUGFkZHJfdCBNY2FzdF9hZGRyOworc3RhdGljIGludCBNY2FzdF9wb3J0Oworc3RhdGljIHVsb25nIFRmdHBFbmRpbmdCbG9jazsgLyogY2FuIGdldCAnbGFzdCcgYmxvY2sgYmVmb3JlIGRvbmUuLiovCisKK3N0YXRpYyB2b2lkIHBhcnNlX211bHRpY2FzdF9vYWNrKGNoYXIgKnBrdCxpbnQgbGVuKTsKKworc3RhdGljIHZvaWQKK21jYXN0X2NsZWFudXAodm9pZCkKK3sKKwlpZiAoTWNhc3RfYWRkcikgZXRoX21jYXN0X2pvaW4oTWNhc3RfYWRkciwgMCk7CisJaWYgKEJpdG1hcCkgZnJlZShCaXRtYXApOworCUJpdG1hcD1OVUxMOworCU1jYXN0X2FkZHIgPSBNdWx0aWNhc3QgPSBNY2FzdF9wb3J0ID0gMDsKKwlUZnRwRW5kaW5nQmxvY2sgPSAtMTsKK30KKworI2VuZGlmCS8qIENPTkZJR19NQ0FTVF9URlRQICovCisKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQKIHN0b3JlX2Jsb2NrICh1bnNpZ25lZCBibG9jaywgdWNoYXIgKiBzcmMsIHVuc2lnbmVkIGxlbikKIHsKLQl1bG9uZyBvZmZzZXQgPSBibG9jayAqIFRGVFBfQkxPQ0tfU0laRSArIFRmdHBCbG9ja1dyYXBPZmZzZXQ7CisJdWxvbmcgb2Zmc2V0ID0gYmxvY2sgKiBUZnRwQmxrU2l6ZSArIFRmdHBCbG9ja1dyYXBPZmZzZXQ7CiAJdWxvbmcgbmV3c2l6ZSA9IG9mZnNldCArIGxlbjsKICNpZmRlZiBDRkdfRElSRUNUX0ZMQVNIX1RGVFAKIAlpbnQgaSwgcmMgPSAwOwpAQCAtOTAsNiArMTIzLDEwIEBACiAJewogCQkodm9pZCltZW1jcHkoKHZvaWQgKikobG9hZF9hZGRyICsgb2Zmc2V0KSwgc3JjLCBsZW4pOwogCX0KKyNpZmRlZiBDT05GSUdfTUNBU1RfVEZUUAorCWlmIChNdWx0aWNhc3QpCisJCWV4dDJfc2V0X2JpdChibG9jaywgQml0bWFwKTsKKyNlbmRpZgogCiAJaWYgKE5ldEJvb3RGaWxlWGZlclNpemUgPCBuZXdzaXplKQogCQlOZXRCb290RmlsZVhmZXJTaXplID0gbmV3c2l6ZTsKQEAgLTEwOCw2ICsxNDUsMTMgQEAKIAlpbnQJCQlsZW4gPSAwOwogCXZvbGF0aWxlIHVzaG9ydCAqczsKIAorI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCisJLyogTXVsdGljYXN0IFRGVFAuLiBub24tTWFzdGVyQ2xpZW50cyBkbyBub3QgQUNLIGRhdGEuICovCisJaWYgKE11bHRpY2FzdAorCSAmJiAoVGZ0cFN0YXRlID09IFNUQVRFX0RBVEEpCisJICYmIChNYXN0ZXJDbGllbnQgPT0gMCkpCisJCXJldHVybjsKKyNlbmRpZgogCS8qCiAJICoJV2Ugd2lsbCBhbHdheXMgYmUgc2VuZGluZyBzb21lIHNvcnQgb2YgcGFja2V0LCBzbwogCSAqCWNvYmJsZSB0b2dldGhlciB0aGUgcGFja2V0IGhlYWRlcnMgbm93LgpAQCAtMTMyLDExICsxNzYsMzAgQEAKIAkJcHJpbnRmKCJzZW5kIG9wdGlvbiBcInRpbWVvdXQgJXNcIlxuIiwgKGNoYXIgKilwa3QpOwogI2VuZGlmCiAJCXBrdCArPSBzdHJsZW4oKGNoYXIgKilwa3QpICsgMTsKKwkJLyogdHJ5IGZvciBtb3JlIGVmZmljLiBibGsgc2l6ZSAqLworCQlwa3QgKz0gc3ByaW50ZigoY2hhciAqKXBrdCwiYmxrc2l6ZSVjJWQlYyIsCisJCQkJMCxodG9ucyhUZnRwQmxrU2l6ZU9wdGlvbiksMCk7CisjaWZkZWYgQ09ORklHX01DQVNUX1RGVFAKKwkJLyogQ2hlY2sgYWxsIHByZWNvbmRpdGlvbnMgYmVmb3JlIGV2ZW4gdHJ5aW5nIHRoZSBvcHRpb24gKi8KKwkJaWYgKCFQcm9oaWJpdE1jYXN0CisJCSAmJiAoQml0bWFwPW1hbGxvYyhNYXBzaXplKSkKKwkJICYmIGV0aF9nZXRfZGV2KCktPm1jYXN0KSB7CisJCQlmcmVlKEJpdG1hcCk7CisJCQlCaXRtYXA9TlVMTDsKKwkJCXBrdCArPSBzcHJpbnRmKChjaGFyICopcGt0LCJtdWx0aWNhc3QlYyVjIiwwLDApOworCQl9CisjZW5kaWYgLyogQ09ORklHX01DQVNUX1RGVFAgKi8KIAkJbGVuID0gcGt0IC0geHA7CiAJCWJyZWFrOwogCi0JY2FzZSBTVEFURV9EQVRBOgogCWNhc2UgU1RBVEVfT0FDSzoKKyNpZmRlZiBDT05GSUdfTUNBU1RfVEZUUAorCQkvKiBNeSB0dXJuISAgU3RhcnQgYXQgd2hlcmUgSSBuZWVkIGJsb2NrcyBJIG1pc3NlZC4qLworCQlpZiAoTXVsdGljYXN0KQorCQkJVGZ0cEJsb2NrPWV4dDJfZmluZF9uZXh0X3plcm9fYml0KEJpdG1hcCwoTWFwc2l6ZSo4KSwwKTsKKwkJLyouLmZhbGxpbmcuLiovCisjZW5kaWYKKwljYXNlIFNUQVRFX0RBVEE6CiAJCXhwID0gcGt0OwogCQlzID0gKHVzaG9ydCAqKXBrdDsKIAkJKnMrKyA9IGh0b25zKFRGVFBfQUNLKTsKQEAgLTE3Nyw4ICsyNDAsMTMgQEAKIHsKIAl1c2hvcnQgcHJvdG87CiAJdXNob3J0ICpzOworCWludCBpOwogCiAJaWYgKGRlc3QgIT0gVGZ0cE91clBvcnQpIHsKKyNpZmRlZiBDT05GSUdfTUNBU1RfVEZUUAorCQlpZiAoTXVsdGljYXN0CisJCSAmJiAoIU1jYXN0X3BvcnQgfHwgKGRlc3QgIT0gTWNhc3RfcG9ydCkpKQorI2VuZGlmCiAJCXJldHVybjsKIAl9CiAJaWYgKFRmdHBTdGF0ZSAhPSBTVEFURV9SUlEgJiYgc3JjICE9IFRmdHBTZXJ2ZXJQb3J0KSB7CkBAIC0yMDgsNiArMjc2LDI0IEBACiAjZW5kaWYKIAkJVGZ0cFN0YXRlID0gU1RBVEVfT0FDSzsKIAkJVGZ0cFNlcnZlclBvcnQgPSBzcmM7CisJCS8qIENoZWNrIGZvciAnYmxrc2l6ZScgb3B0aW9uICovCisJCWZvciAoaT0wO2k8bGVuLTg7aSsrKSB7CisJCQlpZiAoc3RyY21wICgoY2hhciopcGt0K2ksImJsa3NpemUiKSA9PSAwKSB7CisJCQkJVGZ0cEJsa1NpemUgPSAodW5zaWduZWQgc2hvcnQpCisJCQkJCXNpbXBsZV9zdHJ0b3VsKChjaGFyKilwa3QraSs4LE5VTEwsMTApOworI2lmZGVmIEVUX0RFQlVHCisJCQkJcHJpbnRmICgiQmxvY2tzaXplIGFjazogJXMsICVkXG4iLAorCQkJCQkoY2hhciopcGt0K2krOCxUZnRwQmxrU2l6ZSk7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCisJCXBhcnNlX211bHRpY2FzdF9vYWNrKChjaGFyICopcGt0LGxlbi0xKTsKKwkJaWYgKChNdWx0aWNhc3QpICYmICghTWFzdGVyQ2xpZW50KSkKKwkJCVRmdHBTdGF0ZSA9IFNUQVRFX0RBVEE7CS8qIHBhc3NpdmUuLiAqLworCQllbHNlCisjZW5kaWYKIAkJVGZ0cFNlbmQgKCk7IC8qIFNlbmQgQUNLICovCiAJCWJyZWFrOwogCWNhc2UgVEZUUF9EQVRBOgpAQCAtMjI0LDcgKzMxMCw3IEBACiAJCSAqLwogCQlpZiAoVGZ0cEJsb2NrID09IDApIHsKIAkJCVRmdHBCbG9ja1dyYXArKzsKLQkJCVRmdHBCbG9ja1dyYXBPZmZzZXQgKz0gVEZUUF9CTE9DS19TSVpFICogVEZUUF9TRVFVRU5DRV9TSVpFOworCQkJVGZ0cEJsb2NrV3JhcE9mZnNldCArPSBUZnRwQmxrU2l6ZSAqIFRGVFBfU0VRVUVOQ0VfU0laRTsKIAkJCXByaW50ZiAoIlxuXHQgJWx1IE1CIHJlY2VpdmVkXG5cdCAiLCBUZnRwQmxvY2tXcmFwT2Zmc2V0Pj4yMCk7CiAJCX0gZWxzZSB7CiAJCQlpZiAoKChUZnRwQmxvY2sgLSAxKSAlIDEwKSA9PSAwKSB7CkBAIC0yNDgsNiArMzM0LDExIEBACiAJCQlUZnRwQmxvY2tXcmFwID0gMDsKIAkJCVRmdHBCbG9ja1dyYXBPZmZzZXQgPSAwOwogCisjaWZkZWYgQ09ORklHX01DQVNUX1RGVFAKKwkJCWlmIChNdWx0aWNhc3QpIHsgLyogc3RhcnQhPTEgY29tbW9uIGlmIG1jYXN0ICovCisJCQkJVGZ0cExhc3RCbG9jayA9IFRmdHBCbG9jayAtIDE7CisJCQl9IGVsc2UKKyNlbmRpZgogCQkJaWYgKFRmdHBCbG9jayAhPSAxKSB7CS8qIEFzc2VydGlvbiAqLwogCQkJCXByaW50ZiAoIlxuVEZUUCBlcnJvcjogIgogCQkJCQkiRmlyc3QgYmxvY2sgaXMgbm90IGJsb2NrIDEgKCVsZClcbiIKQEAgLTI3NCw5ICszNjUsNDQgQEAKIAkJICoJQWNrbm9sZWRnZSB0aGUgYmxvY2sganVzdCByZWNlaXZlZCwgd2hpY2ggd2lsbCBwcm9tcHQKIAkJICoJdGhlIHNlcnZlciBmb3IgdGhlIG5leHQgb25lLgogCQkgKi8KKyNpZmRlZiBDT05GSUdfTUNBU1RfVEZUUAorCQkvKiBpZiBJIGFtIHRoZSBNYXN0ZXJDbGllbnQsIGFjdGl2ZWx5IGNhbGN1bGF0ZSB3aGF0IG15IG5leHQKKwkJICogbmVlZGVkIGJsb2NrIGlzOyBlbHNlIEknbSBwYXNzaXZlOyBub3QgQUNLSU5HCisgCQkgKi8KKwkJaWYgKE11bHRpY2FzdCkgeworCQkJaWYgKGxlbiA8IFRmdHBCbGtTaXplKSAgeworCQkJCVRmdHBFbmRpbmdCbG9jayA9IFRmdHBCbG9jazsKKwkJCX0gZWxzZSBpZiAoTWFzdGVyQ2xpZW50KSB7CisJCQkJVGZ0cEJsb2NrID0gUHJldkJpdG1hcEhvbGUgPQorCQkJCQlleHQyX2ZpbmRfbmV4dF96ZXJvX2JpdCgKKwkJCQkJCUJpdG1hcCwKKwkJCQkJCShNYXBzaXplKjgpLAorCQkJCQkJUHJldkJpdG1hcEhvbGUpOworCQkJCWlmIChUZnRwQmxvY2sgPiAoKE1hcHNpemUqOCkgLSAxKSkgeworCQkJCQlwcmludGYgKCJ0ZnRwZmlsZSB0b28gYmlnXG4iKTsKKwkJCQkJLyogdHJ5IHRvIGRvdWJsZSBpdCBhbmQgcmV0cnkgKi8KKwkJCQkJTWFwc2l6ZTw8PTE7CisJCQkJCW1jYXN0X2NsZWFudXAoKTsKKwkJCQkJTmV0U3RhcnRBZ2FpbiAoKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlUZnRwTGFzdEJsb2NrID0gVGZ0cEJsb2NrOworCQkJfQorCQl9CisjZW5kaWYKIAkJVGZ0cFNlbmQgKCk7CiAKLQkJaWYgKGxlbiA8IFRGVFBfQkxPQ0tfU0laRSkgeworI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCisJCWlmIChNdWx0aWNhc3QpIHsKKwkJCWlmIChNYXN0ZXJDbGllbnQgJiYgKFRmdHBCbG9jayA+PSBUZnRwRW5kaW5nQmxvY2spKSB7CisJCQkJcHV0cyAoIlxuTXVsdGljYXN0IHRmdHAgZG9uZVxuIik7CisJCQkJbWNhc3RfY2xlYW51cCgpOworCQkJCU5ldFN0YXRlID0gTkVUTE9PUF9TVUNDRVNTOworCQkJfQorCQl9CisJCWVsc2UKKyNlbmRpZgorCQlpZiAobGVuIDwgVGZ0cEJsa1NpemUpIHsKIAkJCS8qCiAJCQkgKglXZSByZWNlaXZlZCB0aGUgd2hvbGUgdGhpbmcuICBUcnkgdG8KIAkJCSAqCXJ1biBpdC4KQEAgLTI5MCw2ICs0MTYsOSBAQAogCQlwcmludGYgKCJcblRGVFAgZXJyb3I6ICclcycgKCVkKVxuIiwKIAkJCQkJcGt0ICsgMiwgbnRvaHMoKih1c2hvcnQgKilwa3QpKTsKIAkJcHV0cyAoIlN0YXJ0aW5nIGFnYWluXG5cbiIpOworI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCisJCW1jYXN0X2NsZWFudXAoKTsKKyNlbmRpZgogCQlOZXRTdGFydEFnYWluICgpOwogCQlicmVhazsKIAl9CkBAIC0zMDEsNiArNDMwLDkgQEAKIHsKIAlpZiAoKytUZnRwVGltZW91dENvdW50ID4gVElNRU9VVF9DT1VOVCkgewogCQlwdXRzICgiXG5SZXRyeSBjb3VudCBleGNlZWRlZDsgc3RhcnRpbmcgYWdhaW5cbiIpOworI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCisJCW1jYXN0X2NsZWFudXAoKTsKKyNlbmRpZgogCQlOZXRTdGFydEFnYWluICgpOwogCX0gZWxzZSB7CiAJCXB1dHMgKCJUICIpOwpAQCAtMzcwLDYgKzUwMiw3IEBACiAJVGZ0cFN0YXRlID0gU1RBVEVfUlJROwogCS8qIFVzZSBhIHBzZXVkby1yYW5kb20gcG9ydCB1bmxlc3MgYSBzcGVjaWZpYyBwb3J0IGlzIHNldCAqLwogCVRmdHBPdXJQb3J0ID0gMTAyNCArIChnZXRfdGltZXIoMCkgJSAzMDcyKTsKKwogI2lmZGVmIENPTkZJR19URlRQX1BPUlQKIAlpZiAoKGVwID0gZ2V0ZW52KCJ0ZnRwZHN0cCIpKSAhPSBOVUxMKSB7CiAJCVRmdHBTZXJ2ZXJQb3J0ID0gc2ltcGxlX3N0cnRvbChlcCwgTlVMTCwgMTApOwpAQCAtMzgyLDggKzUxNSwxMDMgQEAKIAogCS8qIHplcm8gb3V0IHNlcnZlciBldGhlciBpbiBjYXNlIHRoZSBzZXJ2ZXIgaXAgaGFzIGNoYW5nZWQgKi8KIAltZW1zZXQoTmV0U2VydmVyRXRoZXIsIDAsIDYpOworCS8qIFJldmVydCBUZnRwQmxrU2l6ZSB0byBkZmx0ICovCisJVGZ0cEJsa1NpemUgPSBURlRQX0JMT0NLX1NJWkU7CisjaWZkZWYgQ09ORklHX01DQVNUX1RGVFAKKyAgICAJbWNhc3RfY2xlYW51cCgpOworI2VuZGlmCiAKIAlUZnRwU2VuZCAoKTsKIH0KIAorI2lmZGVmIENPTkZJR19NQ0FTVF9URlRQCisvKiBDcmVkaXRzOiBhdGZ0cCBwcm9qZWN0LgorICovCisKKy8qIHBpY2sgdXAgQmNhc3RBZGRyLCBQb3J0LCBhbmQgd2hldGhlciBJIGFtIFtub3ddIHRoZSBtYXN0ZXItY2xpZW50LiAqCisgKiBGcmFtZToKKyAqICAgICstLS0tLS0tKy0tLS0tLS0tLS0tKy0tLSstLS0tLS0tfn4tLS0tLS0tKy0tLSsKKyAqICAgIHwgIG9wYyAgfCBtdWx0aWNhc3QgfCAwIHwgYWRkciwgcG9ydCwgbWMgfCAwIHwKKyAqICAgICstLS0tLS0tKy0tLS0tLS0tLS0tKy0tLSstLS0tLS0tfn4tLS0tLS0tKy0tLSsKKyAqIFRoZSBtdWx0aWNhc3QgYWRkci9wb3J0IGJlY29tZXMgd2hhdCBJIGxpc3RlbiB0bywgYW5kIGlmICdtYycgaXMgJzEnIHRoZW4KKyAqIEkgYW0gdGhlIG5ldyBtYXN0ZXItY2xpZW50IHNvIG11c3Qgc2VuZCBBQ0tzIHRvIERhdGFCbG9ja3MuICBJZiBJIGFtIG5vdAorICogbWFzdGVyLWNsaWVudCwgSSdtIGEgcGFzc2l2ZSBjbGllbnQsIGdhdGhlcmluZyB3aGF0IERhdGFCbG9ja3MgSSBtYXkgYW5kCisgKiBtYWtpbmcgbm90ZSBvZiB3aGljaCBvbmVzIEkgZ290IGluIG15IGJpdG1hc2suCisgKiBJbiB0aGVvcnksIEkgbmV2ZXIgZ28gZnJvbSBtYXN0ZXItPnBhc3NpdmUuLgorICogLi4gdGhpcyBjb21lcyBpbiB3aXRoIHBrdCBhbHJlYWR5IHBvaW50aW5nIGp1c3QgcGFzdCBvcGMKKyAqLworc3RhdGljIHZvaWQgcGFyc2VfbXVsdGljYXN0X29hY2soY2hhciAqcGt0LCBpbnQgbGVuKQoreworIGludCBpOworIElQYWRkcl90IGFkZHI7CisgY2hhciAqbWNfYWRyLCAqcG9ydCwgICptYzsKKworCW1jX2Fkcj1wb3J0PW1jPU5VTEw7CisJLyogbWFyY2ggYWxvbmcgbG9va2luZyBmb3IgJ211bHRpY2FzdFwwJywgd2hpY2ggaGFzIHRvIHN0YXJ0IGF0IGxlYXN0CisJICogMTQgYnl0ZXMgYmFjayBmcm9tIHRoZSBlbmQuCisJICovCisJZm9yIChpPTA7aTxsZW4tMTQ7aSsrKQorCQlpZiAoc3RyY21wIChwa3QraSwibXVsdGljYXN0IikgPT0gMCkKKwkJCWJyZWFrOworCWlmIChpID49IChsZW4tMTQpKSAvKiBub24tTXVsdGljYXN0IE9BQ0ssIGlnbi4gKi8KKwkJcmV0dXJuOworCisJaSs9MTA7IC8qIHN0cmxlbiBtdWx0aWNhc3QgKi8KKwltY19hZHIgPSBwa3QraTsKKwlmb3IgKDtpPGxlbjtpKyspIHsKKwkJaWYgKCoocGt0K2kpID09ICcsJykgeworCQkJKihwa3QraSkgPSAnXDAnOworCQkJaWYgKHBvcnQpIHsKKwkJCQltYyA9IHBrdCtpKzE7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXBvcnQgPSBwa3QraSsxOworCQkJfQorCQl9CisJfQorCWlmICghcG9ydCB8fCAhbWNfYWRyIHx8ICFtYyApIHJldHVybjsKKwlpZiAoTXVsdGljYXN0ICYmIE1hc3RlckNsaWVudCkgeworCQlwcmludGYgKCJJIGdvdCBhIE9BQ0sgYXMgbWFzdGVyIENsaWVudCwgV1JPTkchXG4iKTsKKwkJcmV0dXJuOworCX0KKwkvKiAuLkkgbm93IGFjY2VwdCBwYWNrZXRzIGRlc3RpbmVkIGZvciB0aGlzIE1DQVNUIGFkZHIsIHBvcnQgKi8KKwlpZiAoIU11bHRpY2FzdCkgeworCQlpZiAoQml0bWFwKSB7CisJCQlwcmludGYgKCJJbnRlcm5hbCBmYWlsdXJlISBubyBtY2FzdC5cbiIpOworCQkJZnJlZShCaXRtYXApOworCQkJQml0bWFwPU5VTEw7CisJCQlQcm9oaWJpdE1jYXN0PTE7CisJCQlyZXR1cm4gOworCQl9CisJCS8qIEkgbWFsbG9jIGluc3RlYWQgb2YgcHJlLWRlY2xhcmU7IHNvIHRoYXQgaWYgdGhlIGZpbGUgZW5kcworCQkgKiB1cCBiZWluZyB0b28gYmlnIGZvciB0aGlzIGJpdG1hcCBJIGNhbiByZXRyeQorCQkgKi8KKwkJaWYgKCEoQml0bWFwID0gbWFsbG9jIChNYXBzaXplKSkpIHsKKwkJCXByaW50ZiAoIk5vIEJpdG1hcCwgbm8gbXVsdGljYXN0LiBTb3JyeS5cbiIpOworCQkJUHJvaGliaXRNY2FzdD0xOworCQkJcmV0dXJuOworCQl9CisJCW1lbXNldCAoQml0bWFwLDAsTWFwc2l6ZSk7CisJCVByZXZCaXRtYXBIb2xlID0gMDsKKwkJTXVsdGljYXN0ID0gMTsKKwl9CisJYWRkciA9IHN0cmluZ190b19pcChtY19hZHIpOworCWlmIChNY2FzdF9hZGRyICE9IGFkZHIpIHsKKwkJaWYgKE1jYXN0X2FkZHIpCisJCQlldGhfbWNhc3Rfam9pbihNY2FzdF9hZGRyLCAwKTsKKwkJaWYgKGV0aF9tY2FzdF9qb2luKE1jYXN0X2FkZHI9YWRkciwgMSkpIHsKKwkJCXByaW50ZiAoIkZhaWwgdG8gc2V0IG1jYXN0LCByZXZlcnQgdG8gVEZUUFxuIik7CisJCQlQcm9oaWJpdE1jYXN0PTE7CisJCQltY2FzdF9jbGVhbnVwKCk7CisJCQlOZXRTdGFydEFnYWluKCk7CisJCX0KKwl9CisJTWFzdGVyQ2xpZW50ID0gKHVuc2lnbmVkIGNoYXIpc2ltcGxlX3N0cnRvdWwoKGNoYXIgKiltYyxOVUxMLDEwKTsKKwlNY2FzdF9wb3J0ID0gKHVuc2lnbmVkIHNob3J0KXNpbXBsZV9zdHJ0b3VsKHBvcnQsTlVMTCwxMCk7CisJcHJpbnRmICgiTXVsdGljYXN0OiAlczolZCBbJWRdXG4iLCBtY19hZHIsIE1jYXN0X3BvcnQsIE1hc3RlckNsaWVudCk7CisJcmV0dXJuOworfQorCisjZW5kaWYgLyogTXVsdGljYXN0IFRGVFAgKi8KKwogI2VuZGlmIC8qIENGR19DTURfTkVUICovCmRpZmYgLS1naXQgYS9ydGMvYmY1eHhfcnRjLmMgYi9ydGMvYmY1eHhfcnRjLmMKaW5kZXggODViYmI1Ni4uODg1NmJiOSAxMDA2NDQKLS0tIGEvcnRjL2JmNXh4X3J0Yy5jCisrKyBiL3J0Yy9iZjV4eF9ydGMuYwpAQCAtNDksNyArNDksNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxydGMuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19CRklOKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19CRklOKSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2JmNXh4X3J0Yy5oPgpAQCAtMTQwLDQgKzE0MCw0IEBACiAJICAgIE1JTl9UT19TRUNTKHRtX21pbikgKyBIUlNfVE9fU0VDUyh0bV9ob3VyKSArIERBWVNfVE9fU0VDUyh0bV9kYXkpOwogCXRvX3RtKHRpbWVfaW5fc2VjLCB0bXApOwogfQotI2VuZGlmCQkJCS8qIENPTkZJR19SVENfQkZJTiAmJiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL2RhdGUuYyBiL3J0Yy9kYXRlLmMKaW5kZXggYjVmOGM0OC4uYTgzYTcyMyAxMDA2NDQKLS0tIGEvcnRjL2RhdGUuYworKysgYi9ydGMvZGF0ZS5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPHJ0Yy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkgfHwgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSB8fCBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApCiAKICNkZWZpbmUgRkVCUlVBUlkJCTIKICNkZWZpbmUJU1RBUlRPRlRJTUUJCTE5NzAKQEAgLTE1Myw0ICsxNTMsNCBAQAogCSkqNjAgKyBzZWM7IC8qIGZpbmFsbHkgc2Vjb25kcyAqLwogfQogCi0jZW5kaWYJLyogQ0ZHX0NNRF9EQVRFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9kczEyODg3LmMgYi9ydGMvZHMxMjg4Ny5jCmluZGV4IDhiMTI4OTMuLjg0ZmVjZjAgMTAwNjQ0Ci0tLSBhL3J0Yy9kczEyODg3LmMKKysrIGIvcnRjL2RzMTI4ODcuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPHJ0Yy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX0RTMTI4ODcpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RTMTI4ODcpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAjZGVmaW5lIFJUQ19TRUNPTkRTCQkJMHgwMAogI2RlZmluZSBSVENfU0VDT05EU19BTEFSTQkJMHgwMQpAQCAtMjM1LDQgKzIzNSw0IEBACiAJcnRjX3dyaXRlKFJUQ19DT05UUk9MX0IsY3RybF9yZyk7CiB9CiAKLSNlbmRpZiAgLyogKENPTkZJR19SVENfRFMxMjg4NykgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL2RzMTMwMi5jIGIvcnRjL2RzMTMwMi5jCmluZGV4IDk4ZGNlODkuLjU1YWYxMzAgMTAwNjQ0Ci0tLSBhL3J0Yy9kczEzMDIuYworKysgYi9ydGMvZHMxMzAyLmMKQEAgLTksNyArOSw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPHJ0Yy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX0RTMTMwMikgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxMzAyKSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogLyogR1BQIFBpbnMgKi8KICNkZWZpbmUgREFUQQkJMHgyMDAKZGlmZiAtLWdpdCBhL3J0Yy9kczEzMDYuYyBiL3J0Yy9kczEzMDYuYwppbmRleCBlMDFlMWNlLi44OWU0MzNkIDEwMDY0NAotLS0gYS9ydGMvZHMxMzA2LmMKKysrIGIvcnRjL2RzMTMwNi5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8cnRjLmg+CiAjaW5jbHVkZSA8c3BpLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxMzA2KSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzEzMDYpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAjZGVmaW5lCVJUQ19TRUNPTkRTCQkweDAwCiAjZGVmaW5lCVJUQ19NSU5VVEVTCQkweDAxCmRpZmYgLS1naXQgYS9ydGMvZHMxMzA3LmMgYi9ydGMvZHMxMzA3LmMKaW5kZXggM2IyNmEwYS4uYzg4MmQ3OSAxMDA2NDQKLS0tIGEvcnRjL2RzMTMwNy5jCisrKyBiL3J0Yy9kczEzMDcuYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgPGkyYy5oPgogCiAjaWYgKGRlZmluZWQoQ09ORklHX1JUQ19EUzEzMDcpIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUzEzMzgpICkgJiYgXAotICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisgICAgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICN1bmRlZiBERUJVR19SVEMKQEAgLTIwMSw0ICsyMDEsNCBAQAogCXJldHVybiAoKChuIC8gMTApIDw8IDQpIHwgKG4gJSAxMCkpOwogfQogCi0jZW5kaWYgLyogKENPTkZJR19SVENfRFMxMzA3IHx8IENPTkZJR19SVENfRFMxMzM4KSAmJiAoQ0ZHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvZHMxMzM3LmMgYi9ydGMvZHMxMzM3LmMKaW5kZXggOWYwYzhjMC4uYzYzNmFjNSAxMDA2NDQKLS0tIGEvcnRjL2RzMTMzNy5jCisrKyBiL3J0Yy9kczEzMzcuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPHJ0Yy5oPgogI2luY2x1ZGUgPGkyYy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX0RTMTMzNykgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxMzM3KSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI3VuZGVmIERFQlVHX1JUQwpAQCAtMTg4LDQgKzE4OCw0IEBACiAJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7CiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfUlRDX0RTMTMzNyAmJiAoQ0ZHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvZHMxMzc0LmMgYi9ydGMvZHMxMzc0LmMKaW5kZXggNTBhOTk2Yy4uZTc3M2RkOSAxMDA2NDQKLS0tIGEvcnRjL2RzMTM3NC5jCisrKyBiL3J0Yy9kczEzNzQuYwpAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgPHJ0Yy5oPgogI2luY2x1ZGUgPGkyYy5oPgogCi0jaWYgKGRlZmluZWQoQ09ORklHX1JUQ19EUzEzNzQpKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIChkZWZpbmVkKENPTkZJR19SVENfRFMxMzc0KSkgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICN1bmRlZiBERUJVR19SVEMKQEAgLTI1MCw0ICsyNTAsNCBAQAogewogCQlpMmNfcmVnX3dyaXRlIChDRkdfSTJDX1JUQ19BRERSLCByZWcsIHZhbCk7CiB9Ci0jZW5kaWYgLyogKENPTkZJR19SVENfRFMxMzc0KSAmJiAoQ0ZHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvZHMxNTU2LmMgYi9ydGMvZHMxNTU2LmMKaW5kZXggZGQ5ZWE1ZS4uNDM2NWNmYiAxMDA2NDQKLS0tIGEvcnRjL2RzMTU1Ni5jCisrKyBiL3J0Yy9kczE1NTYuYwpAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPHJ0Yy5oPgogCiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxNTU2KSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzE1NTYpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiBzdGF0aWMgdWNoYXIgcnRjX3JlYWQoIHVuc2lnbmVkIGludCBhZGRyICk7CiBzdGF0aWMgdm9pZCAgcnRjX3dyaXRlKCB1bnNpZ25lZCBpbnQgYWRkciwgdWNoYXIgdmFsKTsKQEAgLTIwMyw0ICsyMDMsNCBAQAogCXJldHVybiAoKChuIC8gMTApIDw8IDQpIHwgKG4gJSAxMCkpOwogfQogCi0jZW5kaWYJLyogQ09ORklHX1JUQ19EUzE1NTYgJiYgQ0ZHX0NNRF9EQVRFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9kczE2NHguYyBiL3J0Yy9kczE2NHguYwppbmRleCAzY2M3NmFiLi5iZmYyMmI5YSAxMDA2NDQKLS0tIGEvcnRjL2RzMTY0eC5jCisrKyBiL3J0Yy9kczE2NHguYwpAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPHJ0Yy5oPgogCiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxNjR4KSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzE2NHgpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiBzdGF0aWMgdWNoYXIgICAgcnRjX3JlYWQodW5zaWduZWQgaW50IGFkZHIgKTsKIHN0YXRpYyB2b2lkICAgICBydGNfd3JpdGUodW5zaWduZWQgaW50IGFkZHIsIHVjaGFyIHZhbCk7CkBAIC0xOTcsNCArMTk3LDQgQEAKIAlyZXR1cm4gKCgobiAvIDEwKSA8PCA0KSB8IChuICUgMTApKTsKIH0KIAotI2VuZGlmCS8qIENPTkZJR19SVENfRFMxNjR4ICYmIENGR19DTURfREFURSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvZHMxNzR4LmMgYi9ydGMvZHMxNzR4LmMKaW5kZXggNThiMTNlOS4uNWY4NWE2OCAxMDA2NDQKLS0tIGEvcnRjL2RzMTc0eC5jCisrKyBiL3J0Yy9kczE3NHguYwpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxydGMuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzE3NHgpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RTMTc0eCkgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKIHN0YXRpYyB1Y2hhciBydGNfcmVhZCggdW5zaWduZWQgaW50IGFkZHIgKTsKIHN0YXRpYyB2b2lkICBydGNfd3JpdGUoIHVuc2lnbmVkIGludCBhZGRyLCB1Y2hhciB2YWwpOwpAQCAtMTk5LDQgKzE5OSw0IEBACiAJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfUlRDX01DMTQ2ODE4ICYmIENGR19DTURfREFURSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvZHMzMjMxLmMgYi9ydGMvZHMzMjMxLmMKaW5kZXggNTBhZWViNS4uZmUxMWI4NiAxMDA2NDQKLS0tIGEvcnRjL2RzMzIzMS5jCisrKyBiL3J0Yy9kczMyMzEuYwpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgPHJ0Yy5oPgogI2luY2x1ZGUgPGkyYy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX0RTMzIzMSkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMzMjMxKSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI3VuZGVmIERFQlVHX1JUQwpAQCAtMTkwLDQgKzE5MCw0IEBACiAJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7CiB9CiAKLSNlbmRpZiAvKiAoQ09ORklHX1JUQ19EUzMyMzEpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9tNDF0MTEuYyBiL3J0Yy9tNDF0MTEuYwppbmRleCBjNzI1Y2M5Li44MWRhMzNhIDEwMDY0NAotLS0gYS9ydGMvbTQxdDExLmMKKysrIGIvcnRjL200MXQxMS5jCkBAIC00Myw3ICs0Myw3IEBACiAjZW5kaWYKICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfTTQxVDExKSAmJiBkZWZpbmVkKENGR19JMkNfUlRDX0FERFIpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX000MVQxMSkgJiYgZGVmaW5lZChDRkdfSTJDX1JUQ19BRERSKSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogc3RhdGljIHVuc2lnbmVkIGJjZDJiaW4gKHVjaGFyIG4pCiB7CkBAIC0xOTksNCArMTk5LDQgQEAKIAlyZXR1cm4gaTJjX3JlYWQoIENGR19JMkNfUlRDX0FERFIsIFJFR19DTlQrYWRkciwgMSwgZGF0YSwgc2l6ZSApOwogfQogCi0jZW5kaWYgLyogQ09ORklHX1JUQ19NNDFUMTEgJiYgQ0ZHX0kyQ19SVENfQUREUiAmJiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL200OHQzNWF4LmMgYi9ydGMvbTQ4dDM1YXguYwppbmRleCA2YzM4YTUzLi4wYTBmZmE4IDEwMDY0NAotLS0gYS9ydGMvbTQ4dDM1YXguYworKysgYi9ydGMvbTQ4dDM1YXguYwpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgPHJ0Yy5oPgogI2luY2x1ZGUgPGNvbmZpZy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX000OFQzNUEpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX000OFQzNUEpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiBzdGF0aWMgdWNoYXIgcnRjX3JlYWQgICh1Y2hhciByZWcpOwogc3RhdGljIHZvaWQgIHJ0Y193cml0ZSAodWNoYXIgcmVnLCB1Y2hhciB2YWwpOwpAQCAtMTYzLDQgKzE2Myw0IEBACiAJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfUlRDX000OFQzNUEgJiYgQ0ZHX0NNRF9EQVRFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9tYXg2OTAwLmMgYi9ydGMvbWF4NjkwMC5jCmluZGV4IDczOTE5Y2QuLmM3NWE4ZTAgMTAwNjQ0Ci0tLSBhL3J0Yy9tYXg2OTAwLmMKKysrIGIvcnRjL21heDY5MDAuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPHJ0Yy5oPgogI2luY2x1ZGUgPGkyYy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX01BWDY5MDApICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX01BWDY5MDApICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAjaWZuZGVmCUNGR19JMkNfUlRDX0FERFIKICNkZWZpbmUJQ0ZHX0kyQ19SVENfQUREUgkweDUwCkBAIC0xMjgsNCArMTI4LDQgQEAKIHsKIH0KIAotI2VuZGlmCS8qIENPTkZJR19SVENfTUFYNjkwMCAmJiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL21jMTQ2ODE4LmMgYi9ydGMvbWMxNDY4MTguYwppbmRleCAyMGIxYjNlLi5hYjM3N2VkIDEwMDY0NAotLS0gYS9ydGMvbWMxNDY4MTguYworKysgYi9ydGMvbWMxNDY4MTguYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxydGMuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NQzE0NjgxOCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfTUMxNDY4MTgpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiBzdGF0aWMgdWNoYXIgcnRjX3JlYWQgICh1Y2hhciByZWcpOwogc3RhdGljIHZvaWQgIHJ0Y193cml0ZSAodWNoYXIgcmVnLCB1Y2hhciB2YWwpOwpAQCAtMTc1LDQgKzE3NSw0IEBACiAJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfUlRDX01DMTQ2ODE4ICYmIENGR19DTURfREFURSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvbWs0OHQ1OS5jIGIvcnRjL21rNDh0NTkuYwppbmRleCA2NGY3NTFmLi5iYWNkYjViIDEwMDY0NAotLS0gYS9ydGMvbWs0OHQ1OS5jCisrKyBiL3J0Yy9tazQ4dDU5LmMKQEAgLTEzMSw3ICsxMzEsNyBAQAogCQlydGNfd3JpdGUoZCsrLCAqcysrKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMjMzLDUgKzIzMyw1IEBACiAJcnRjX3dyaXRlKFJUQ19XQVRDSERPRywgd2RfdmFsdWUpOwogfQogCi0jZW5kaWYJLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkgKi8KKyNlbmRpZgogI2VuZGlmCS8qIENPTkZJR19SVENfTUs0OFQ1OSAqLwpkaWZmIC0tZ2l0IGEvcnRjL21wYzV4eHguYyBiL3J0Yy9tcGM1eHh4LmMKaW5kZXggMjA1M2RmMS4uMjE2Mzg2YSAxMDA2NDQKLS0tIGEvcnRjL21wYzV4eHguYworKysgYi9ydGMvbXBjNXh4eC5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPHJ0Yy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX01QQzUyMDApICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX01QQzUyMDApICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIHRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBkZWZpbmVkIGluIG1wYzUyMDAuaCAuLi4KQEAgLTEzNyw0ICsxMzcsNCBAQAogCXJldHVybjsJLyogbm90aGluZyB0byBkbyAqLwogfQogCi0jZW5kaWYJLyogQ09ORklHX1JUQ19NUEM1MjAwICYmIENGR19DTURfREFURSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvbXBjOHh4LmMgYi9ydGMvbXBjOHh4LmMKaW5kZXggODMwZTU2ZS4uOGQxMGMwZSAxMDA2NDQKLS0tIGEvcnRjL21wYzh4eC5jCisrKyBiL3J0Yy9tcGM4eHguYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxydGMuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NUEM4eHgpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX01QQzh4eCkgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNzAsNiArNzAsNCBAQAogCXJldHVybjsJLyogbm90aGluZyB0byBkbyAqLwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNlbmRpZgkvKiBDT05GSUdfUlRDX01QQzh4eCAmJiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL3BjZjg1NjMuYyBiL3J0Yy9wY2Y4NTYzLmMKaW5kZXggMDVhZTk3ZS4uMmQ3M2Q1ZCAxMDA2NDQKLS0tIGEvcnRjL3BjZjg1NjMuYworKysgYi9ydGMvcGNmODU2My5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8cnRjLmg+CiAjaW5jbHVkZSA8aTJjLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfUENGODU2MykgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfUENGODU2MykgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKIHN0YXRpYyB1Y2hhciBydGNfcmVhZCAgKHVjaGFyIHJlZyk7CiBzdGF0aWMgdm9pZCAgcnRjX3dyaXRlICh1Y2hhciByZWcsIHVjaGFyIHZhbCk7CkBAIC0xNDEsNCArMTQxLDQgQEAKIAlyZXR1cm4gKCgobiAvIDEwKSA8PCA0KSB8IChuICUgMTApKTsKIH0KIAotI2VuZGlmCS8qIENPTkZJR19SVENfUENGODU2MyAmJiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL3JzNWMzNzIuYyBiL3J0Yy9yczVjMzcyLmMKaW5kZXggYjU2ODA4Yi4uM2QxMzQ2ZSAxMDA2NDQKLS0tIGEvcnRjL3JzNWMzNzIuYworKysgYi9ydGMvcnM1YzM3Mi5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8cnRjLmg+CiAjaW5jbHVkZSA8aTJjLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfUlM1QzM3MkEpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX1JTNUMzNzJBKSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIC8qCiAgKiBSZWFkcyBhcmUgYWx3YXlzIGRvbmUgc3RhcnRpbmcgd2l0aCByZWdpc3RlciAxNSwgd2hpY2ggcmVxdWlyZXMgc29tZQogICoganVtcGluZy10aHJvdWdoLWhvb3BzIHRvIGFjY2VzcyB0aGUgZGF0YSBjb3JyZWN0bHkuCkBAIC0yOTksNCArMjk5LDQgQEAKIHsKIAlyZXR1cm4gKCgobiAvIDEwKSA8PCA0KSB8IChuICUgMTApKTsKIH0KLSNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19SVENfUlM1QzM3MkEpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9zM2MyNHgwX3J0Yy5jIGIvcnRjL3MzYzI0eDBfcnRjLmMKaW5kZXggOWUyMTkxZS4uN2Y4YjRmYSAxMDA2NDQKLS0tIGEvcnRjL3MzYzI0eDBfcnRjLmMKKysrIGIvcnRjL3MzYzI0eDBfcnRjLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfUzNDMjRYMCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfUzNDMjRYMCkgJiYgKGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSkKIAogI2lmIGRlZmluZWQoQ09ORklHX1MzQzI0MDApCiAjaW5jbHVkZSA8czNjMjQwMC5oPgpAQCAtMTc1LDYgKzE3NSw0IEBACiAJcnRjLT5SVENDT04gJj0gfigweDA4fDB4MDEpOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNlbmRpZgkvKiBDT05GSUdfUlRDX1MzQzI0WDAgJiYgQ0ZHX0NNRF9EQVRFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3VwZGF0ZXIvY21kX2ZsYXNoLmMgYi90b29scy91cGRhdGVyL2NtZF9mbGFzaC5jCmluZGV4IGMwZTU3NzIuLmE5NzZlMGQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3VwZGF0ZXIvY21kX2ZsYXNoLmMKKysrIGIvdG9vbHMvdXBkYXRlci9jbWRfZmxhc2guYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxmbGFzaC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkxBU0gpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZMQVNIKQogCiBleHRlcm4gZmxhc2hfaW5mb190IGZsYXNoX2luZm9bXTsJLyogaW5mbyBmb3IgRkxBU0ggY2hpcHMgKi8KIApAQCAtNDI3LDQgKzQyNyw0IEBACiAJcmV0dXJuIHJjb2RlOwogfQogCi0jZW5kaWYJLyogQ0ZHX0NNRF9GTEFTSCAqLworI2VuZGlmCg==